diff --git a/android/GKI_VERSION b/android/GKI_VERSION index 0add1e35cf7d..244ce6627aa0 100644 --- a/android/GKI_VERSION +++ b/android/GKI_VERSION @@ -1 +1 @@ -LTS_5.4.86_fe9e8630bfaf +LTS_5.4.86_8eb841225953 diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index ff1a17ee7753..9b0d0c9f7193 100644 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -760,6 +760,7 @@ + @@ -1649,6 +1650,8 @@ + + @@ -1705,6 +1708,7 @@ + @@ -2615,6 +2619,7 @@ + @@ -2647,6 +2652,7 @@ + @@ -2797,6 +2803,7 @@ + @@ -3015,6 +3022,9 @@ + + + @@ -3649,6 +3659,7 @@ + @@ -3753,6 +3764,7 @@ + @@ -3838,8 +3850,10 @@ + + @@ -3967,13 +3981,13 @@ - + @@ -4118,6 +4132,8 @@ + + @@ -4210,7 +4226,11 @@ + + + + @@ -4930,6 +4950,7 @@ + @@ -17791,7 +17812,7 @@ - + @@ -20409,7 +20430,7 @@ - + @@ -28561,7 +28582,7 @@ - + @@ -30034,7 +30055,7 @@ - + @@ -30244,7 +30265,7 @@ - + @@ -30953,7 +30974,7 @@ - + @@ -31970,7 +31991,7 @@ - + @@ -32433,7 +32454,7 @@ - + @@ -32517,7 +32538,7 @@ - + @@ -67919,6 +67940,12 @@ + + + + + + @@ -67939,6 +67966,13 @@ + + + + + + + @@ -105576,6 +105610,11 @@ + + + + + @@ -128458,6 +128497,10 @@ + + + + @@ -128465,10 +128508,6 @@ - - - - @@ -128482,6 +128521,10 @@ + + + + @@ -140287,6 +140330,7 @@ + @@ -140309,6 +140353,13 @@ + + + + + + + @@ -140715,6 +140766,18 @@ + + + + + + + + + + + + @@ -148310,7 +148373,7 @@ - + @@ -148331,6 +148394,12 @@ + + + + + + @@ -148345,6 +148414,16 @@ + + + + + + + + + + @@ -148466,7 +148545,7 @@ - + @@ -148787,6 +148866,13 @@ + + + + + + + @@ -163003,78 +163089,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -163206,25 +163220,47 @@ - - - - - - + + + + + - - - - - - + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -163278,6 +163314,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -163581,6 +163681,7 @@ + @@ -164375,6 +164476,11 @@ + + + + + @@ -167658,7 +167764,7 @@ - + @@ -167666,7 +167772,7 @@ - + @@ -167674,7 +167780,7 @@ - + @@ -174030,7 +174136,7 @@ - + @@ -175913,6 +176019,11 @@ + + + + + @@ -178796,7 +178907,7 @@ - + @@ -178825,7 +178936,7 @@ - + @@ -179417,7 +179528,7 @@ - + @@ -180377,7 +180488,7 @@ - + @@ -185999,12 +186110,28 @@ + + + + + + + + + + + + + + + + @@ -191058,6 +191185,6 @@ diff --git a/android/abi_gki_aarch64_e399f16519fa.xml b/android/abi_gki_aarch64_8eb841225953.xml similarity index 99% rename from android/abi_gki_aarch64_e399f16519fa.xml rename to android/abi_gki_aarch64_8eb841225953.xml index f6a0b4d8467f..49c4658c88e2 100644 --- a/android/abi_gki_aarch64_e399f16519fa.xml +++ b/android/abi_gki_aarch64_8eb841225953.xml @@ -1052,6 +1052,7 @@ + @@ -1186,7 +1187,9 @@ + + @@ -2381,6 +2384,8 @@ + + @@ -7390,69 +7395,69 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9103,56 +9108,56 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -10440,140 +10445,140 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -11760,9 +11765,9 @@ - + - + @@ -11785,116 +11790,116 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -13336,56 +13341,56 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -14600,66 +14605,66 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -15527,7 +15532,7 @@ - + @@ -16255,9 +16260,9 @@ - + - + @@ -16275,7 +16280,7 @@ - + @@ -16531,6 +16536,7 @@ + @@ -17064,7 +17070,7 @@ - + @@ -17411,6 +17417,7 @@ + @@ -25490,6 +25497,17 @@ + + + + + + + + + + + @@ -32759,7 +32777,7 @@ - + @@ -33880,7 +33898,7 @@ - + @@ -34681,7 +34699,7 @@ - + @@ -35048,10 +35066,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -35330,7 +35402,7 @@ - + @@ -35507,60 +35579,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -37244,7 +37262,7 @@ - + @@ -38344,7 +38362,7 @@ - + @@ -38734,7 +38752,7 @@ - + @@ -42881,33 +42899,33 @@ - + - + - + - + - + - + - + @@ -47010,7 +47028,7 @@ - + @@ -47704,7 +47722,7 @@ - + @@ -47712,7 +47730,7 @@ - + @@ -47728,7 +47746,7 @@ - + @@ -47960,7 +47978,7 @@ - + @@ -47971,7 +47989,7 @@ - + @@ -47979,7 +47997,7 @@ - + @@ -49117,7 +49135,7 @@ - + @@ -49125,7 +49143,7 @@ - + @@ -49133,7 +49151,7 @@ - + @@ -49757,7 +49775,7 @@ - + @@ -51191,7 +51209,7 @@ - + @@ -51704,7 +51722,7 @@ - + @@ -51828,7 +51846,7 @@ - + @@ -51842,7 +51860,7 @@ - + @@ -51850,7 +51868,7 @@ - + @@ -52337,7 +52355,7 @@ - + @@ -52401,7 +52419,7 @@ - + @@ -52458,7 +52476,7 @@ - + @@ -52606,7 +52624,7 @@ - + @@ -52637,7 +52655,7 @@ - + @@ -52648,7 +52666,7 @@ - + @@ -52710,7 +52728,7 @@ - + @@ -52907,7 +52925,7 @@ - + @@ -52926,7 +52944,7 @@ - + @@ -52963,7 +52981,7 @@ - + @@ -53087,12 +53105,12 @@ - + - + @@ -53108,7 +53126,7 @@ - + @@ -53119,12 +53137,12 @@ - + - + @@ -53132,7 +53150,7 @@ - + @@ -53145,7 +53163,7 @@ - + @@ -53239,7 +53257,7 @@ - + @@ -53298,7 +53316,7 @@ - + @@ -55311,7 +55329,7 @@ - + @@ -55319,7 +55337,7 @@ - + @@ -55631,7 +55649,7 @@ - + @@ -55746,7 +55764,7 @@ - + @@ -55797,7 +55815,7 @@ - + @@ -56245,190 +56263,190 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -58977,7 +58995,7 @@ - + @@ -60112,7 +60130,7 @@ - + @@ -60120,7 +60138,7 @@ - + @@ -61790,7 +61808,7 @@ - + @@ -63276,9 +63294,9 @@ - + - + @@ -63518,7 +63536,7 @@ - + @@ -63526,7 +63544,7 @@ - + @@ -64252,7 +64270,7 @@ - + @@ -64260,7 +64278,7 @@ - + @@ -64268,7 +64286,7 @@ - + @@ -64276,7 +64294,7 @@ - + @@ -64284,7 +64302,7 @@ - + @@ -64295,15 +64313,15 @@ - + - + - + - + @@ -64314,7 +64332,7 @@ - + @@ -64322,7 +64340,7 @@ - + @@ -64654,24 +64672,24 @@ - + - + - + - + - + - + - + @@ -64694,7 +64712,7 @@ - + @@ -67679,12 +67697,12 @@ - + - + @@ -67771,7 +67789,7 @@ - + @@ -86748,8 +86766,8 @@ - - + + @@ -88503,8 +88521,8 @@ - - + + @@ -93217,84 +93235,23 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -94193,7 +94150,7 @@ - + @@ -95770,9 +95727,114 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -96162,7 +96224,7 @@ - + @@ -96394,7 +96456,7 @@ - + @@ -100073,164 +100135,164 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -102628,86 +102690,86 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -104832,15 +104894,15 @@ - + - + - + - + @@ -107000,62 +107062,62 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -107211,178 +107273,178 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -110202,7 +110264,7 @@ - + @@ -110555,6 +110617,8 @@ + + @@ -112168,9 +112232,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -113724,7 +114010,7 @@ - + @@ -113741,7 +114027,7 @@ - + @@ -113749,7 +114035,7 @@ - + @@ -113766,7 +114052,7 @@ - + @@ -113968,7 +114254,7 @@ - + @@ -113982,7 +114268,7 @@ - + @@ -114004,7 +114290,7 @@ - + @@ -114746,12 +115032,12 @@ - + - + @@ -114823,7 +115109,7 @@ - + @@ -115504,7 +115790,7 @@ - + @@ -115538,7 +115824,7 @@ - + @@ -115877,7 +116163,7 @@ - + @@ -116018,7 +116304,7 @@ - + @@ -116364,7 +116650,7 @@ - + @@ -116394,7 +116680,7 @@ - + @@ -117110,7 +117396,7 @@ - + @@ -117517,7 +117803,7 @@ - + @@ -118207,7 +118493,7 @@ - + @@ -118337,7 +118623,7 @@ - + @@ -118368,7 +118654,7 @@ - + @@ -118377,7 +118663,7 @@ - + @@ -118399,7 +118685,7 @@ - + @@ -118410,7 +118696,7 @@ - + @@ -118418,7 +118704,7 @@ - + @@ -118429,7 +118715,7 @@ - + @@ -118477,7 +118763,7 @@ - + @@ -118558,7 +118844,7 @@ - + @@ -118714,7 +119000,7 @@ - + @@ -118723,37 +119009,37 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -118923,7 +119209,7 @@ - + @@ -128696,15 +128982,15 @@ - - - - + + + + - - - + + + @@ -129996,14 +130282,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -130027,10 +130545,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - @@ -130041,6 +130607,12 @@ + + + + + + @@ -130088,13 +130660,13 @@ - + - + @@ -130103,12 +130675,12 @@ - + - + @@ -130524,7 +131096,7 @@ - + @@ -131649,7 +132221,7 @@ - + @@ -131657,7 +132229,7 @@ - + @@ -131679,9 +132251,9 @@ - + - + @@ -131699,7 +132271,7 @@ - + @@ -132142,62 +132714,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -132384,6 +132900,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -139094,7 +139666,7 @@ - + diff --git a/android/abi_gki_aarch64_galaxy b/android/abi_gki_aarch64_galaxy index b65bf734e98c..485f7c3a66d6 100644 --- a/android/abi_gki_aarch64_galaxy +++ b/android/abi_gki_aarch64_galaxy @@ -1634,6 +1634,7 @@ of_find_node_opts_by_path of_find_node_with_property of_find_property + of_find_spi_device_by_node of_fwnode_ops of_genpd_add_provider_onecell of_genpd_add_provider_simple @@ -2170,6 +2171,7 @@ smpboot_unregister_percpu_thread snd_card_free snd_card_new + snd_card_ref snd_card_register snd_compr_stop_error snd_ctl_add @@ -2214,7 +2216,9 @@ snd_soc_card_get_kcontrol snd_soc_component_async_complete snd_soc_component_disable_pin + snd_soc_component_enable_pin snd_soc_component_force_enable_pin + snd_soc_component_get_pin_status snd_soc_component_init_regmap snd_soc_component_read snd_soc_component_read32 diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom index 670cca06141c..c3a20145154e 100644 --- a/android/abi_gki_aarch64_qcom +++ b/android/abi_gki_aarch64_qcom @@ -939,6 +939,7 @@ fsl8250_handle_irq fs_kobj fsstack_copy_attr_all + ftrace_set_clr_event full_name_hash fwnode_connection_find_match fwnode_get_parent @@ -1082,6 +1083,8 @@ i2c_register_driver i2c_smbus_read_byte i2c_smbus_write_byte + i2c_smbus_read_byte_data + i2c_smbus_write_byte_data __i2c_smbus_xfer i2c_smbus_xfer __i2c_transfer @@ -2440,6 +2443,8 @@ timer_unstable_counter_workaround timespec64_to_jiffies _totalram_pages + trace_array_create + trace_array_destroy __trace_bprintk trace_define_field trace_event_buffer_commit diff --git a/android/abi_gki_aarch64_sonywalkman b/android/abi_gki_aarch64_sonywalkman new file mode 100644 index 000000000000..fc0e382d5486 --- /dev/null +++ b/android/abi_gki_aarch64_sonywalkman @@ -0,0 +1,1846 @@ +[abi_symbol_list] +# commonly used symbols + add_timer + alloc_chrdev_region + alloc_pages_exact + __alloc_pages_nodemask + __alloc_percpu + alloc_workqueue + __arch_copy_from_user + __arch_copy_to_user + arm64_const_caps_ready + __arm_smccc_smc + atomic_notifier_call_chain + atomic_notifier_chain_register + atomic_notifier_chain_unregister + bcmp + blocking_notifier_call_chain + bpf_trace_run1 + bpf_trace_run2 + bpf_trace_run3 + cancel_delayed_work + cancel_delayed_work_sync + cancel_work_sync + cdev_add + cdev_del + cdev_init + __cfi_slowpath + __check_object_size + __class_create + class_destroy + clk_bulk_enable + clk_bulk_prepare + clk_bulk_unprepare + clk_disable + clk_enable + clk_gate_ops + clk_get + __clk_get_name + clk_get_parent + clk_get_rate + clk_is_match + clk_prepare + clk_put + clk_register + clk_register_fixed_rate + clk_register_gate + clk_register_mux + clk_round_rate + clk_set_parent + clk_set_rate + clk_unprepare + complete + complete_all + completion_done + component_add + component_del + __const_udelay + cpu_bit_bitmap + __cpuhp_remove_state + __cpuhp_setup_state + __cpuhp_state_add_instance + __cpuhp_state_remove_instance + cpu_hwcap_keys + cpu_hwcaps + cpumask_next + cpu_number + __cpu_online_mask + __cpu_possible_mask + crypto_alloc_shash + crypto_destroy_tfm + delayed_work_timer_fn + del_timer + del_timer_sync + destroy_workqueue + dev_driver_string + _dev_err + dev_fwnode + device_create + device_create_file + device_destroy + device_for_each_child + device_get_match_data + device_init_wakeup + device_link_add + device_link_del + device_property_present + device_property_read_u32_array + device_remove_file + __device_reset + device_set_wakeup_capable + device_set_wakeup_enable + device_unregister + device_wakeup_enable + _dev_info + devm_add_action + devm_clk_bulk_get + devm_clk_get + devm_clk_get_optional + devm_extcon_dev_allocate + devm_extcon_dev_register + devm_free_irq + devm_gpiod_get + devm_gpiod_get_optional + devm_gpio_request_one + devm_ioremap + devm_ioremap_resource + devm_kasprintf + devm_kfree + devm_kmalloc + __devm_of_phy_provider_register + devm_phy_create + devm_phy_get + devm_pinctrl_get + devm_platform_ioremap_resource + __devm_regmap_init_i2c + __devm_regmap_init_mmio_clk + devm_regulator_get + devm_regulator_get_optional + devm_request_threaded_irq + __devm_reset_control_get + devm_reset_controller_register + devm_snd_dmaengine_pcm_register + devm_snd_soc_register_card + devm_snd_soc_register_component + devm_usb_get_phy + devm_usb_get_phy_by_phandle + _dev_notice + dev_pm_domain_attach_by_name + dev_pm_domain_detach + dev_pm_set_wake_irq + _dev_warn + disable_irq + disable_irq_nosync + dma_alloc_attrs + dma_buf_attach + dma_buf_detach + dma_buf_get + dma_buf_map_attachment + dma_buf_put + dma_buf_unmap_attachment + dma_direct_map_page + dma_direct_map_sg + dma_direct_sync_sg_for_cpu + dma_direct_sync_sg_for_device + dma_direct_unmap_page + dma_direct_unmap_sg + dma_free_attrs + dma_get_slave_caps + dma_mmap_attrs + dma_release_channel + dma_request_chan + __dma_request_channel + dma_request_slave_channel + dma_set_coherent_mask + dma_set_mask + down + down_interruptible + down_write + drm_add_edid_modes + drm_atomic_helper_check + drm_atomic_helper_check_plane_state + drm_atomic_helper_cleanup_planes + drm_atomic_helper_commit + drm_atomic_helper_commit_hw_done + drm_atomic_helper_commit_modeset_disables + drm_atomic_helper_commit_modeset_enables + drm_atomic_helper_commit_planes + drm_atomic_helper_connector_destroy_state + drm_atomic_helper_connector_duplicate_state + drm_atomic_helper_connector_reset + __drm_atomic_helper_crtc_destroy_state + __drm_atomic_helper_crtc_duplicate_state + drm_atomic_helper_disable_plane + drm_atomic_helper_page_flip + drm_atomic_helper_plane_destroy_state + drm_atomic_helper_plane_duplicate_state + drm_atomic_helper_plane_reset + drm_atomic_helper_set_config + drm_atomic_helper_update_plane + drm_atomic_helper_wait_for_vblanks + drm_bridge_add + drm_bridge_attach + drm_bridge_remove + drm_compat_ioctl + drm_connector_attach_encoder + drm_connector_cleanup + drm_connector_init + drm_connector_update_edid_property + drm_crtc_arm_vblank_event + drm_crtc_cleanup + drm_crtc_handle_vblank + drm_crtc_init_with_planes + drm_crtc_send_vblank_event + drm_crtc_vblank_get + drm_crtc_vblank_off + drm_crtc_vblank_on + drm_detect_hdmi_monitor + drm_dev_alloc + drm_dev_printk + drm_dev_put + drm_dev_register + drm_dev_unregister + drm_display_info_set_bus_formats + drm_display_mode_from_videomode + drm_display_mode_to_videomode + drm_encoder_cleanup + drm_encoder_init + drm_err + drm_fb_cma_get_gem_obj + drm_gem_fb_create + drm_gem_prime_fd_to_handle + drm_gem_prime_handle_to_fd + drm_get_edid + drm_get_format_name + drm_hdmi_avi_infoframe_from_display_mode + drm_hdmi_vendor_infoframe_from_display_mode + drm_helper_hpd_irq_event + drm_helper_probe_single_connector_modes + drm_ioctl + drm_match_cea_mode + drm_mode_config_helper_resume + drm_mode_config_helper_suspend + drm_mode_create + drm_mode_probed_add + drm_mode_vrefresh + drm_of_find_possible_crtcs + drm_open + drm_panel_add + drm_panel_detach + drm_panel_init + drm_panel_remove + drm_plane_cleanup + drm_plane_create_zpos_immutable_property + drm_poll + drm_read + drm_release + drm_universal_plane_init + dump_stack + __dynamic_dev_dbg + __dynamic_pr_debug + enable_irq + event_triggers_call + extcon_get_edev_by_phandle + extcon_get_state + extcon_register_notifier + extcon_set_property_capability + extcon_set_property_sync + extcon_set_state + extcon_set_state_sync + extcon_unregister_notifier + fd_install + filp_close + filp_open + find_next_bit + finish_wait + flush_delayed_work + flush_work + flush_workqueue + fput + free_irq + __free_pages + free_pages + free_pages_exact + free_percpu + fwnode_property_present + fwnode_property_read_string + fwnode_property_read_u32_array + generic_handle_irq + get_cpu_device + __get_free_pages + get_unused_fd_flags + get_zeroed_page + gpiod_direction_input + gpiod_direction_output_raw + gpiod_get_raw_value + gpiod_get_raw_value_cansleep + gpiod_get_value + gpiod_set_raw_value + gpiod_set_raw_value_cansleep + gpiod_set_value + gpiod_set_value_cansleep + gpiod_to_irq + gpio_free + gpio_request + gpio_to_desc + handle_level_irq + hdmi_audio_infoframe_init + hdmi_vendor_infoframe_pack + i2c_add_adapter + i2c_del_adapter + i2c_del_driver + i2c_register_driver + i2c_transfer + i2c_transfer_buffer_flags + idr_alloc + idr_destroy + idr_find + idr_remove + init_timer_key + init_wait_entry + __init_waitqueue_head + input_allocate_device + input_event + input_free_device + input_mt_init_slots + input_mt_report_slot_state + input_register_device + input_set_abs_params + input_set_capability + input_unregister_device + iomem_resource + __ioremap + iounmap + irq_domain_remove + irq_find_mapping + irq_modify_status + irq_set_chained_handler_and_data + irq_set_irq_wake + jiffies + jiffies_to_msecs + kasprintf + kernel_read + kernel_write + kfree + kimage_vaddr + kimage_voffset + __kmalloc + kmalloc_caches + kmalloc_order_trace + kmem_cache_alloc_trace + kobject_create_and_add + kobject_put + kobject_uevent_env + kstrtoint + kstrtoll + kstrtouint + kstrtoull + kthread_create_on_node + kthread_should_stop + kthread_stop + ktime_get + ktime_get_mono_fast_ns + ktime_get_real_ts64 + ktime_get_ts64 + ktime_get_with_offset + __list_add_valid + __list_del_entry_valid + media_create_pad_link + media_entity_pads_init + media_entity_remote_pad + memcpy + memset + __memset_io + mipi_dsi_attach + mipi_dsi_detach + mipi_dsi_driver_register_full + mipi_dsi_driver_unregister + misc_deregister + misc_register + mod_delayed_work_on + mod_timer + module_layout + module_put + __msecs_to_jiffies + msleep + __mutex_init + mutex_is_locked + mutex_lock + mutex_lock_interruptible + mutex_trylock + mutex_unlock + noop_llseek + nr_cpu_ids + of_address_to_resource + of_alias_get_id + of_clk_add_provider + of_clk_get_by_name + of_clk_src_onecell_get + of_device_get_match_data + of_device_is_available + of_device_is_compatible + of_find_backlight_by_node + of_find_compatible_node + of_find_device_by_node + of_find_i2c_device_by_node + of_find_matching_node_and_match + of_find_node_by_name + of_find_property + of_fwnode_ops + of_get_child_by_name + of_get_named_gpio_flags + of_get_next_available_child + of_get_next_child + of_get_parent + of_get_property + of_graph_get_next_endpoint + of_graph_get_port_by_id + of_graph_get_remote_port_parent + of_iomap + of_irq_get + of_machine_is_compatible + of_match_device + of_match_node + of_node_name_eq + of_parse_phandle + of_parse_phandle_with_args + of_phy_simple_xlate + of_platform_depopulate + of_platform_populate + of_property_count_elems_of_size + of_property_read_string + of_property_read_string_helper + of_property_read_u32_index + of_property_read_variable_u32_array + of_reserved_mem_device_init_by_idx + of_reset_control_array_get + param_ops_bool + param_ops_charp + param_ops_int + param_ops_uint + param_ops_ullong + __per_cpu_offset + perf_trace_buf_alloc + perf_trace_run_bpf_submit + pfn_valid + phy_exit + phy_init + phy_power_off + phy_power_on + physvirt_offset + pinctrl_lookup_state + pinctrl_pm_select_default_state + pinctrl_pm_select_sleep_state + pinctrl_select_state + platform_device_add + platform_device_add_data + platform_device_add_properties + platform_device_add_resources + platform_device_alloc + platform_device_put + platform_device_register_full + platform_device_unregister + __platform_driver_register + platform_driver_unregister + platform_get_irq + platform_get_irq_byname + platform_get_resource + platform_get_resource_byname + pm_qos_add_request + pm_qos_remove_request + __pm_relax + pm_relax + pm_runtime_allow + __pm_runtime_disable + pm_runtime_enable + pm_runtime_forbid + pm_runtime_force_resume + pm_runtime_force_suspend + __pm_runtime_idle + __pm_runtime_resume + pm_runtime_set_autosuspend_delay + __pm_runtime_set_status + __pm_runtime_suspend + __pm_runtime_use_autosuspend + __pm_stay_awake + pm_stay_awake + pm_wakeup_dev_event + power_supply_changed + power_supply_get_drvdata + power_supply_register + power_supply_unregister + preempt_schedule + preempt_schedule_notrace + prepare_to_wait_event + print_hex_dump + printk + proc_create_data + proc_mkdir + put_device + __put_page + __put_task_struct + queue_delayed_work_on + queue_work_on + radix_tree_insert + ___ratelimit + _raw_spin_lock + _raw_spin_lock_irq + _raw_spin_lock_irqsave + _raw_spin_trylock + _raw_spin_unlock + _raw_spin_unlock_irq + _raw_spin_unlock_irqrestore + refcount_dec_and_test_checked + refcount_inc_checked + regcache_cache_only + regcache_mark_dirty + regcache_sync + __register_chrdev + register_pm_notifier + __register_rpmsg_driver + register_virtio_device + register_virtio_driver + regmap_attach_dev + regmap_raw_read + regmap_raw_write + regmap_read + regmap_update_bits_base + regmap_write + regulator_disable + regulator_enable + release_firmware + __release_region + remap_pfn_range + remove_proc_entry + request_firmware + request_firmware_nowait + __request_region + request_threaded_irq + reset_control_assert + reset_control_deassert + rpmsg_send + rtc_time64_to_tm + schedule + schedule_timeout + scnprintf + seq_printf + seq_puts + set_user_nice + sg_alloc_table + sg_free_table + sg_init_one + sg_init_table + sg_next + snd_ctl_boolean_mono_info + snd_dma_alloc_pages + snd_dmaengine_pcm_prepare_slave_config + snd_dma_free_pages + snd_pcm_format_physical_width + snd_pcm_format_width + snd_pcm_hw_constraint_integer + snd_pcm_hw_constraint_list + snd_pcm_lib_ioctl + snd_pcm_period_elapsed + snd_soc_add_component_controls + snd_soc_card_jack_new + snd_soc_component_read32 + snd_soc_component_update_bits + snd_soc_component_write + snd_soc_dai_set_fmt + snd_soc_dai_set_sysclk + snd_soc_dai_set_tdm_slot + snd_soc_dapm_add_routes + snd_soc_dapm_get_volsw + snd_soc_dapm_ignore_suspend + snd_soc_dapm_new_controls + snd_soc_dapm_put_volsw + snd_soc_get_enum_double + snd_soc_get_volsw + snd_soc_info_enum_double + snd_soc_info_volsw + snd_soc_jack_add_gpios + snd_soc_jack_report + snd_soc_of_parse_audio_routing + snd_soc_of_parse_card_name + snd_soc_params_to_bclk + snd_soc_pm_ops + snd_soc_put_enum_double + snd_soc_put_volsw + snd_soc_rtdcom_lookup + snd_soc_set_runtime_hwparams + snprintf + sprintf + sscanf + __stack_chk_fail + __stack_chk_guard + strcasecmp + strcmp + strcpy + strlcpy + strlen + strncat + strncmp + strncpy + strsep + strstr + synchronize_irq + syscon_node_to_regmap + syscon_regmap_lookup_by_compatible + syscon_regmap_lookup_by_phandle + sysfs_create_file_ns + sysfs_create_group + sysfs_remove_file_ns + sysfs_remove_group + system_freezable_power_efficient_wq + system_wq + tasklet_init + tasklet_kill + __tasklet_schedule + trace_define_field + trace_event_buffer_commit + trace_event_buffer_reserve + trace_event_ignore_this_pid + trace_event_raw_init + trace_event_reg + trace_handle_return + trace_raw_output_prep + trace_seq_printf + try_module_get + __udelay + __unregister_chrdev + unregister_chrdev_region + unregister_virtio_driver + up + up_write + usb_add_hcd + usb_disabled + usb_hcd_is_primary_hcd + usb_put_hcd + usb_remove_hcd + usleep_range + v4l2_async_notifier_add_subdev + v4l2_async_notifier_init + v4l2_async_notifier_unregister + v4l2_ctrl_handler_free + v4l2_ctrl_handler_init_class + v4l2_ctrl_new_std + v4l2_device_register + v4l2_device_unregister + v4l2_device_unregister_subdev + v4l2_subdev_call_wrappers + v4l2_subdev_init + vabits_actual + vb2_buffer_done + vb2_dma_contig_memops + vb2_ops_wait_finish + vb2_ops_wait_prepare + vb2_plane_cookie + vb2_queue_init + vfree + video_devdata + video_device_release_empty + video_ioctl2 + videomode_from_timing + __video_register_device + video_unregister_device + virtqueue_add_inbuf + virtqueue_add_outbuf + virtqueue_get_buf + virtqueue_get_vring_size + virtqueue_kick + virtqueue_kick_prepare + virtqueue_notify + vmalloc + vmalloc_to_page + vmemmap + vring_del_virtqueue + vring_interrupt + vring_new_virtqueue + vsnprintf + wait_for_completion + wait_for_completion_interruptible + wait_for_completion_interruptible_timeout + wait_for_completion_timeout + __wake_up + wake_up_process + wakeup_source_register + wakeup_source_unregister + __warn_printk + +# required by bma4xy.ko + ns_to_timespec + +# required by bq25898_icx_charger.ko + devm_regmap_field_alloc + devm_regulator_register + extcon_get_property + freezing_slow_path + __refrigerator + regmap_field_read + regmap_field_update_bits_base + system_freezing_cnt + +# required by busfreq-imx8mq.ko + jiffies_to_usecs + register_reboot_notifier + +# required by cbtu02043-icx-switch.ko + typec_switch_get_drvdata + typec_switch_register + typec_switch_unregister + +# required by cdns_mhdp_drmcore.ko + drm_atomic_get_crtc_state + drm_dbg + drm_default_rgb_quant_range + drm_dev_dbg + drm_do_get_edid + drm_dp_aux_register + drm_dp_aux_unregister + drm_dp_bw_code_to_link_rate + drm_dp_dpcd_read + drm_dp_link_rate_to_bw_code + drm_hdmi_avi_infoframe_colorspace + drm_hdmi_avi_infoframe_quant_range + drm_hdmi_infoframe_set_hdr_metadata + drm_mode_create_hdmi_colorspace_property + drm_mode_is_420_also + drm_mode_is_420_only + drm_object_attach_property + hdmi_audio_infoframe_pack + hdmi_avi_infoframe_check + hdmi_avi_infoframe_pack + hdmi_drm_infoframe_pack + +# required by clk-imx8mp.ko + clk_hw_register_divider + clk_hw_register_fixed_factor + clk_hw_register_gate + clk_hw_register_mux + +# required by cpufreq-dt.ko + arch_set_freq_scale + cpufreq_enable_boost_support + cpufreq_freq_attr_scaling_available_freqs + cpufreq_freq_attr_scaling_boost_freqs + cpufreq_generic_frequency_table_verify + cpufreq_generic_get + cpufreq_generic_suspend + cpufreq_register_driver + cpufreq_unregister_driver + dev_pm_opp_free_cpufreq_table + dev_pm_opp_get_max_transition_latency + dev_pm_opp_get_opp_count + dev_pm_opp_get_sharing_cpus + dev_pm_opp_get_suspend_opp_freq + dev_pm_opp_init_cpufreq_table + dev_pm_opp_of_cpumask_add_table + dev_pm_opp_of_cpumask_remove_table + dev_pm_opp_of_get_sharing_cpus + dev_pm_opp_of_register_em + dev_pm_opp_put_regulators + dev_pm_opp_set_rate + dev_pm_opp_set_regulators + dev_pm_opp_set_sharing_cpus + policy_has_boost_freq + regulator_get_optional + regulator_put + +# required by cqhci.ko + dmam_alloc_attrs + dmam_free_coherent + mmc_cqe_request_done + +# required by cyttsp5.ko + kobject_del + mod_timer_pending + +# required by cyttsp5_device_access.ko + device_remove_bin_file + krealloc + simple_read_from_buffer + +# required by device_cooling.ko + blocking_notifier_chain_register + blocking_notifier_chain_unregister + thermal_cooling_device_unregister + thermal_of_cooling_device_register + +# required by dw-hdmi-cec.ko + cec_allocate_adapter + cec_delete_adapter + cec_notifier_cec_adap_register + cec_notifier_cec_adap_unregister + cec_received_msg_ts + cec_register_adapter + cec_transmit_attempt_done_ts + cec_unregister_adapter + devm_remove_action + +# required by dw-hdmi.ko + cec_fill_conn_info_from_drm + cec_notifier_conn_register + cec_notifier_conn_unregister + cec_notifier_set_phys_addr + cec_notifier_set_phys_addr_from_edid + drm_connector_init_with_ddc + drm_detect_monitor_audio + drm_scdc_read + drm_scdc_set_high_tmds_clock_ratio + drm_scdc_set_scrambling + drm_scdc_write + i2c_put_adapter + of_get_i2c_adapter_by_node + +# required by dw_hdmi-imx.ko + devm_kmemdup + devm_phy_optional_get + drm_of_encoder_active_endpoint + +# required by dwc3.ko + bpf_trace_run4 + clk_bulk_disable + device_property_read_string + device_property_read_u8_array + devm_clk_bulk_get_all + devm_reset_control_array_get + extcon_find_edev_by_node + extcon_get_extcon_dev + of_graph_get_remote_node + of_usb_get_phy_mode + of_usb_update_otg_caps + phy_pm_runtime_get_sync + phy_pm_runtime_put_sync + phy_set_mode_ext + platform_get_irq_byname_optional + system_freezable_wq + usb_add_gadget_udc + usb_decode_ctrl + usb_del_gadget_udc + usb_ep_set_maxpacket_limit + usb_gadget_giveback_request + usb_gadget_map_request_by_dev + usb_gadget_set_state + usb_gadget_udc_reset + usb_gadget_unmap_request_by_dev + usb_get_dr_mode + usb_get_maximum_speed + usb_phy_set_charger_current + usb_role_switch_register + usb_role_switch_unregister + +# required by fsl-imx-ldb.ko + devm_drm_panel_bridge_add + drm_of_find_panel_or_bridge + +# required by fsl_imx8_ddr_perf.ko + bitmap_print_to_pagebuf + cpumask_any_but + ida_alloc_range + ida_free + irq_set_affinity_hint + kernel_kobj + perf_pmu_migrate_context + perf_pmu_register + perf_pmu_unregister + +# required by fusb251.ko + kstrtobool + +# required by fusb307_icx.ko + device_get_named_child_node + +# required by galcore.ko + anon_inode_getfd + cache_line_size + dev_pm_opp_add + dev_pm_opp_remove + dma_buf_export + dma_buf_fd + dma_direct_sync_single_for_cpu + dma_direct_sync_single_for_device + dma_fence_array_ops + dma_fence_context_alloc + dma_fence_default_wait + dma_fence_init + dma_fence_release + dma_fence_signal + dma_fence_signal_locked + dma_fence_wait_timeout + down_read + down_trylock + driver_create_file + driver_remove_file + drm_gem_handle_create + drm_gem_object_lookup + drm_gem_object_put_unlocked + drm_gem_object_release + drm_gem_private_object_init + find_vma + find_vpid + get_user_pages + hrtimer_resolution + idr_preload + iommu_attach_device + iommu_domain_alloc + iommu_domain_free + iommu_map + iommu_set_fault_handler + iommu_unmap + kstrtoint_from_user + no_llseek + param_array_ops + param_ops_ulong + pid_task + platform_bus_type + __rcu_read_lock + __rcu_read_unlock + reset_control_reset + schedule_hrtimeout + sg_alloc_table_from_pages + si_meminfo + sync_file_create + sync_file_get_fence + __task_pid_nr_ns + _totalram_pages + up_read + vmap + vm_mmap + vm_munmap + vunmap + +# required by gpio-mxc.ko + devm_gpiochip_add_data + __devm_irq_alloc_descs + devm_irq_alloc_generic_chip + devm_irq_setup_generic_chip + gpiochip_generic_free + gpiochip_generic_request + gpiochip_get_data + gpiochip_lock_as_irq + gpiochip_unlock_as_irq + irq_domain_add_legacy + irq_domain_simple_ops + irq_gc_ack_set_bit + irq_gc_mask_clr_bit + irq_gc_mask_set_bit + __irq_set_handler + platform_irq_count + register_syscore_ops + +# required by hold_switch.ko + devm_request_any_context_irq + gpiod_get_value_cansleep + gpiod_set_debounce + +# required by i2c-imx.ko + clk_notifier_register + clk_notifier_unregister + i2c_add_numbered_adapter + i2c_generic_scl_recovery + i2c_recover_bus + +# required by icx_nvp_emmc.ko + blkdev_get_by_path + blkdev_put + vfs_fsync + +# required by imx-audiomix.ko + devm_of_platform_populate + +# required by imx-cpufreq-dt.ko + dev_pm_opp_put_supported_hw + dev_pm_opp_set_supported_hw + nvmem_cell_read_u32 + +# required by imx-i2s-rpmsg.ko + unregister_rpmsg_driver + +# required by imx-lcdif-crtc.ko + drm_property_destroy + +# required by imx-lcdifv3-crtc.ko + drm_mode_equal + drm_mode_find_dmt + +# required by imx-mailbox.ko + devm_mbox_controller_register + mbox_chan_received_data + mbox_chan_txdone + +# required by imx-pcm-dma-common.ko + snd_dmaengine_pcm_close_release_chan + snd_dmaengine_pcm_get_chan + snd_dmaengine_pcm_open + snd_dmaengine_pcm_open_request_chan + snd_dmaengine_pcm_pointer + snd_dmaengine_pcm_set_config_from_dai_data + snd_dmaengine_pcm_trigger + snd_hwparams_to_dma_slave_config + +# required by imx-pcm-rpmsg.ko + snd_soc_lookup_component + +# required by imx-sdma.ko + dma_async_device_register + dma_async_device_unregister + dma_async_tx_descriptor_init + gen_pool_dma_alloc + gen_pool_free_owner + of_dma_controller_register + of_gen_pool_get + vchan_dma_desc_free_list + vchan_find_desc + vchan_init + vchan_tx_desc_free + vchan_tx_submit + +# required by imx.ko + device_find_child + do_SAK + handle_sysrq + mctrl_gpio_disable_ms + mctrl_gpio_enable_ms + mctrl_gpio_get + mctrl_gpio_init + mctrl_gpio_set + oops_in_progress + platform_get_irq_optional + rational_best_approximation + tty_flip_buffer_push + __tty_insert_flip_char + tty_insert_flip_string_fixed_flag + tty_termios_encode_baud_rate + uart_add_one_port + uart_console_device + uart_console_write + uart_get_baud_rate + uart_get_divisor + uart_get_rs485_mode + uart_handle_cts_change + uart_handle_dcd_change + uart_parse_options + uart_register_driver + uart_remove_one_port + uart_resume_port + uart_set_options + uart_suspend_port + uart_unregister_driver + uart_update_timeout + uart_write_wakeup + +# required by imx2_wdt.ko + _dev_crit + __platform_driver_probe + watchdog_init_timeout + watchdog_register_device + watchdog_set_restart_priority + watchdog_unregister_device + +# required by imx8-capture.ko + soc_device_match + +# required by imx8-isi-cap.ko + media_graph_walk_cleanup + media_graph_walk_init + media_graph_walk_next + media_graph_walk_start + v4l2_fh_open + v4l2_g_parm_cap + v4l2_s_parm_cap + vb2_fop_mmap + vb2_fop_poll + _vb2_fop_release + vb2_ioctl_create_bufs + vb2_ioctl_dqbuf + vb2_ioctl_expbuf + vb2_ioctl_prepare_buf + vb2_ioctl_qbuf + vb2_ioctl_querybuf + vb2_ioctl_reqbufs + vb2_ioctl_streamoff + vb2_ioctl_streamon + +# required by imx8-isi-m2m.ko + v4l2_fh_add + v4l2_fh_del + v4l2_fh_exit + v4l2_fh_init + +# required by imx8-media-dev.ko + media_device_cleanup + media_device_init + __media_device_register + media_device_unregister + v4l2_async_notifier_register + v4l2_device_register_subdev + v4l2_device_register_subdev_nodes + +# required by imx8-mipi-csi2-sam.ko + regulator_set_voltage + +# required by imx8m_pm_domains.ko + of_clk_get + of_genpd_add_provider_simple + of_genpd_add_subdomain + of_genpd_del_provider + pm_genpd_init + pm_genpd_remove + +# required by imx8mm_thermal.ko + devm_thermal_zone_of_sensor_register + of_thermal_get_trip_points + thermal_zone_bind_cooling_device + +# required by imx8mp-ldb.ko + devm_of_phy_get + +# required by imx_rpmsg.ko + mbox_free_channel + mbox_request_channel_byname + mbox_send_message + of_reserved_mem_device_release + vring_transport_features + +# required by imxdrm.ko + component_bind_all + component_master_add_with_match + component_master_del + component_match_add_release + component_unbind_all + drm_connector_unregister + drm_gem_cma_dumb_create + drm_gem_cma_free_object + drm_gem_cma_mmap + drm_gem_cma_prime_get_sg_table + drm_gem_cma_prime_import_sg_table + drm_gem_cma_prime_mmap + drm_gem_cma_prime_vmap + drm_gem_cma_prime_vunmap + drm_gem_cma_vm_ops + drm_kms_helper_poll_fini + drm_kms_helper_poll_init + drm_mode_config_cleanup + drm_mode_config_init + drm_mode_config_reset + drm_of_component_match_add + drm_vblank_init + +# required by incrementalfs.ko + bin2hex + __break_lease + clear_inode + __close_fd + crc32_le + crypto_shash_digest + d_add + d_drop + deactivate_locked_super + dentry_open + dget_parent + d_instantiate + d_make_root + dput + fget + flush_dcache_page + fs_kobj + fsstack_copy_attr_all + generic_file_llseek + generic_file_mmap + generic_file_read_iter + generic_file_splice_read + generic_read_dir + generic_shutdown_super + iget5_locked + ihold + inode_init_once + inode_init_owner + iput + iterate_dir + kern_path + lockref_get + lock_rename + lookup_one_len + LZ4_decompress_safe + match_int + match_token + notify_change + pagecache_get_page + path_get + path_put + __put_cred + register_filesystem + set_anon_super + sget + simple_getattr + simple_setattr + simple_statfs + strndup_user + sync_filesystem + truncate_inode_pages + unlock_new_inode + unlock_page + unlock_rename + unregister_filesystem + user_path_at_empty + vfs_create + vfs_fallocate + vfs_getattr + vfs_getxattr + vfs_link + vfs_listxattr + vfs_mkdir + vfs_rename + vfs_rmdir + vfs_setxattr + vfs_unlink + +# required by ion_cma_heap.ko + cma_alloc + cma_for_each_area + cma_get_name + cma_release + ion_buffer_prep_noncached + __ion_device_add_heap + ion_device_remove_heap + +# required by ion_imx.ko + device_initialize + +# required by irq-imx-irqsteer.ko + __irq_domain_add + irq_domain_xlate_onecell + irq_of_parse_and_map + irq_set_chip_and_handler_name + irq_set_chip_data + +# required by lc709204_icx.ko + crc8 + crc8_populate_msb + memchr + of_prop_next_u32 + +# required by lm3630a_bl_icx.ko + device_get_next_child_node + devm_backlight_device_register + devm_pwm_get + pwm_apply_state + +# required by lpa_ctrl.ko + sysfs_create_groups + +# required by mxc-clk.ko + __clk_determine_rate + clk_divider_ops + clk_fractional_divider_ops + __clk_get_hw + clk_hw_get_name + clk_hw_get_parent_by_index + clk_hw_is_enabled + clk_hw_register + clk_hw_register_composite + clk_mux_ops + clk_unregister + divider_get_val + divider_recalc_rate + of_clk_get_from_provider + of_find_node_opts_by_path + +# required by nvmem-imx-ocotp.ko + devm_nvmem_register + +# required by panel-simple.ko + drm_mode_duplicate + drm_mode_set_name + of_find_i2c_adapter_by_node + of_get_display_timing + +# required by panel-sitronix-st7703.ko + mipi_dsi_dcs_enter_sleep_mode + mipi_dsi_dcs_exit_sleep_mode + mipi_dsi_dcs_read + mipi_dsi_dcs_set_display_off + mipi_dsi_dcs_set_display_on + mipi_dsi_dcs_set_tear_on + mipi_dsi_generic_write + mipi_dsi_set_maximum_return_packet_size + +# required by pca9450-regulator.ko + of_regulator_match + rdev_get_drvdata + regulator_disable_regmap + regulator_enable_regmap + regulator_get_voltage_sel_regmap + regulator_is_enabled_regmap + regulator_list_voltage_linear + regulator_list_voltage_linear_range + regulator_map_voltage_iterate + regulator_register + regulator_set_voltage_sel_regmap + regulator_set_voltage_time_sel + regulator_unregister + +# required by pca9450.ko + mfd_add_devices + mfd_remove_devices + regmap_add_irq_chip + regmap_del_irq_chip + regmap_irq_get_domain + +# required by pci-imx6.ko + dw_pcie_ep_init + dw_pcie_ep_raise_legacy_irq + dw_pcie_ep_raise_msi_irq + dw_pcie_ep_raise_msix_irq + dw_pcie_ep_reset_bar + dw_pcie_host_init + dw_pcie_link_up + dw_pcie_msi_init + dw_pcie_read_dbi + dw_pcie_setup_rc + dw_pcie_wait_for_link + dw_pcie_write_dbi + pci_msi_enabled + phy_calibrate + regulator_is_enabled + +# required by phy-fsl-imx8mq-usb.ko + power_supply_get_by_phandle + power_supply_get_property + power_supply_put + power_supply_reg_notifier + power_supply_unreg_notifier + +# required by phy-generic-icx.ko + gpiod_direction_output + regulator_set_current_limit + usb_add_phy_dev + usb_remove_phy + +# required by pinctrl-imx.ko + devm_pinctrl_register_and_init + pinconf_generic_parse_dt_config + pinctrl_dev_get_drvdata + pinctrl_enable + pinctrl_force_default + pinctrl_force_sleep + pinctrl_generic_get_group + pinctrl_generic_get_group_count + pinctrl_generic_get_group_name + pinctrl_generic_get_group_pins + pin_get_name + pinmux_generic_get_function + pinmux_generic_get_function_count + pinmux_generic_get_function_groups + pinmux_generic_get_function_name + +# required by pwm-imx27.ko + of_pwm_xlate_with_flags + pwmchip_add + pwmchip_remove + +# required by qca9377_bt_rfkill.ko + rfkill_alloc + rfkill_destroy + rfkill_init_sw_state + rfkill_register + rfkill_unregister + +# required by rtc-snvs.ko + devm_rtc_allocate_device + __rtc_register_device + rtc_tm_to_time64 + rtc_update_irq + +# required by sdhci-esdhc-imx.ko + __mmc_claim_host + mmc_gpiod_request_cd + mmc_gpiod_request_ro + mmc_gpio_get_cd + mmc_gpio_get_ro + mmc_gpio_set_cd_wake + mmc_of_parse + mmc_of_parse_voltage + mmc_release_host + mmc_retune_timer_stop + mmc_send_tuning + sdhci_add_host + sdhci_cqe_disable + sdhci_cqe_enable + sdhci_cqe_irq + sdhci_dumpregs + sdhci_execute_tuning + sdhci_pltfm_free + sdhci_pltfm_init + sdhci_remove_host + sdhci_reset + sdhci_resume_host + sdhci_runtime_resume_host + sdhci_runtime_suspend_host + sdhci_suspend_host + +# required by sec-dsim.ko + bsearch + drm_panel_attach + drm_panel_disable + drm_panel_enable + drm_panel_get_modes + drm_panel_prepare + drm_panel_unprepare + mipi_dsi_create_packet + mipi_dsi_host_register + mipi_dsi_host_unregister + of_drm_find_bridge + of_drm_find_panel + +# required by sec_mipi_dsim-imx.ko + reset_control_put + +# required by snd-soc-cxd3778gf.ko + irq_set_irq_type + param_get_int + snd_soc_register_component + snd_soc_unregister_component + +# required by snd-soc-fsl-dsp.ko + dev_pm_domain_attach_by_id + of_count_phandle_with_args + pm_system_wakeup + sysfs_streq + vfs_llseek + +# required by snd-soc-fsl-easrc.ko + gcd + snd_pcm_format_big_endian + snd_pcm_format_linear + snd_pcm_format_unsigned + snd_soc_component_read + snd_soc_dpcm_get_substream + snd_soc_info_xr_sx + +# required by snd-soc-fsl-micfil.ko + snd_soc_get_volsw_sx + snd_soc_info_volsw_sx + snd_soc_put_volsw_sx + +# required by snd-soc-fsl-sai.ko + snd_pcm_hw_constraint_step + __sw_hweight8 + +# required by snd-soc-hdmi-codec.ko + snd_ctl_add + snd_ctl_new1 + snd_pcm_add_chmap_ctls + snd_pcm_create_iec958_consumer_hw_params + snd_pcm_hw_constraint_eld + +# required by snd-soc-imx-wm8960.ko + of_parse_phandle_with_fixed_args + snd_soc_dai_set_pll + snd_soc_dapm_disable_pin + snd_soc_dapm_enable_pin + +# required by snd-soc-lif-md6000-rme.ko + driver_unregister + __spi_register_driver + spi_sync + +# required by snd-soc-rpmsg-wm8960.ko + __devm_regmap_init + +# required by snd-soc-simple-card-utils.ko + devm_get_clk_from_child + devm_kvasprintf + snd_soc_dapm_get_pin_switch + snd_soc_dapm_info_pin_switch + snd_soc_dapm_put_pin_switch + snd_soc_of_parse_audio_simple_widgets + snd_soc_of_parse_daifmt + +# required by snd-soc-simple-card.ko + snd_soc_of_get_dai_name + snd_soc_of_parse_node_prefix + snd_soc_of_parse_tdm_slot + +# required by snvs_pwrkey.ko + devm_input_allocate_device + +# required by soc-imx8m.ko + of_root + soc_device_register + +# required by spi-bitbang.ko + get_device + spi_finalize_current_transfer + spi_register_controller + spi_unregister_controller + +# required by spi-imx.ko + devm_gpio_request + sg_last + __spi_alloc_controller + +# required by tcpm_icx.ko + devm_power_supply_register + typec_altmode_attention + typec_altmode_notify + typec_altmode_update_active + typec_altmode_vdm + typec_find_port_data_role + typec_find_port_power_role + typec_find_power_role + typec_get_drvdata + typec_match_altmode + typec_partner_register_altmode + typec_partner_set_identity + typec_port_register_altmode + typec_register_partner + typec_register_port + typec_set_data_role + typec_set_mode + typec_set_orientation + typec_set_pwr_opmode + typec_set_pwr_role + typec_set_vconn_role + typec_unregister_altmode + typec_unregister_partner + typec_unregister_port + usb_role_switch_get + usb_role_switch_put + usb_role_switch_set_role + +# required by timer-imx-sysctr.ko + clockevents_config_and_register + timer_of_init + +# required by touchscreen.ko + class_find_device + device_register + devres_add + devres_alloc_node + devres_free + devres_release + dev_set_name + __init_rwsem + +# required by trusty-arm64-fiq.ko + smp_call_function + smp_call_function_single + +# required by trusty-ipc.ko + add_wait_queue + _copy_from_iter + _copy_to_iter + idr_for_each + remove_wait_queue + strncpy_from_user + virtqueue_detach_unused_buf + wait_woken + woken_wake_function + +# required by trusty-irq.ko + disable_percpu_irq + enable_percpu_irq + free_percpu_irq + irq_create_of_mapping + __request_percpu_irq + +# required by trusty-log.ko + panic_notifier_list + +# required by trusty-virtio.ko + unregister_virtio_device + +# required by ttynull.ko + put_tty_driver + register_console + __tty_alloc_driver + tty_port_close + tty_port_destroy + tty_port_hangup + tty_port_init + tty_port_link_device + tty_port_open + tty_register_driver + tty_set_operations + tty_std_termios + tty_unregister_driver + unregister_console + +# required by v4l2-fwnode.ko + fwnode_device_is_available + fwnode_get_next_parent + fwnode_get_parent + fwnode_graph_get_next_endpoint + fwnode_graph_get_port_parent + fwnode_graph_get_remote_endpoint + fwnode_graph_get_remote_port_parent + fwnode_graph_parse_endpoint + fwnode_handle_put + fwnode_property_get_reference_args + fwnode_property_read_u64_array + v4l2_async_notifier_add_fwnode_subdev + v4l2_async_notifier_cleanup + v4l2_async_register_subdev + v4l2_async_subdev_notifier_register + +# required by v4l2-mem2mem.ko + media_create_intf_link + media_device_register_entity + media_device_unregister_entity + media_devnode_create + media_devnode_remove + media_entity_remove_links + media_remove_intf_links + v4l2_event_pending + vb2_create_bufs + vb2_dqbuf + vb2_expbuf + vb2_mmap + vb2_prepare_buf + vb2_qbuf + vb2_querybuf + vb2_queue_release + vb2_reqbufs + vb2_request_object_is_buffer + vb2_streamoff + vb2_streamon + +# required by virtio_rpmsg_bus.ko + rpmsg_find_device + rpmsg_register_device + rpmsg_sendto + rpmsg_unregister_device + virtio_check_driver_offered_feature + virtqueue_disable_cb + virtqueue_enable_cb + +# required by wlan.ko + alloc_netdev_mqs + __alloc_skb + capable + __cfg80211_alloc_event_skb + __cfg80211_alloc_reply_skb + cfg80211_assoc_timeout + cfg80211_calculate_bitrate + cfg80211_chandef_create + cfg80211_ch_switch_notify + cfg80211_connect_done + cfg80211_del_sta_sinfo + cfg80211_disconnected + cfg80211_external_auth_request + cfg80211_ft_event + cfg80211_get_bss + cfg80211_gtk_rekey_notify + cfg80211_ibss_joined + cfg80211_inform_bss_frame_data + cfg80211_mgmt_tx_status + cfg80211_michael_mic_failure + cfg80211_new_sta + cfg80211_pmksa_candidate_notify + cfg80211_put_bss + cfg80211_ready_on_channel + cfg80211_remain_on_channel_expired + cfg80211_roamed + cfg80211_rx_mgmt + cfg80211_rx_unprot_mlme_mgmt + cfg80211_scan_done + cfg80211_sched_scan_results + __cfg80211_send_event_skb + cfg80211_tdls_oper_request + cfg80211_unlink_bss + cfg80211_vendor_cmd_reply + complete_and_exit + consume_skb + cpu_topology + crypto_ahash_digest + crypto_ahash_setkey + crypto_alloc_ahash + crypto_alloc_base + crypto_alloc_skcipher + crypto_shash_final + crypto_shash_setkey + crypto_shash_update + crypto_skcipher_decrypt + crypto_skcipher_encrypt + _ctype + dev_alloc_name + __dev_kfree_skb_any + ether_setup + eth_type_trans + free_netdev + freq_reg_info + get_random_bytes + hex2bin + hex_dump_to_buffer + hrtimer_cancel + hrtimer_init + hrtimer_start_range_ns + ieee80211_channel_to_freq_khz + ieee80211_freq_khz_to_channel + ieee80211_get_channel_khz + ieee80211_hdrlen + init_net + __ipv6_addr_type + iwe_stream_add_event + iwe_stream_add_point + iwe_stream_add_value + kfree_skb + kmemdup + kobject_uevent + kstrdup + kstrtos8 + kstrtou16 + kstrtou8 + kzfree + __local_bh_enable_ip + mac_pton + memcmp + memmove + mmc_detect_change + mmc_set_data_timeout + mmc_wait_for_cmd + mmc_wait_for_req + msleep_interruptible + __netdev_alloc_skb + netif_carrier_off + netif_carrier_on + netif_rx + netif_rx_ni + netif_tx_stop_all_queues + netif_tx_wake_queue + netlink_broadcast + __netlink_kernel_create + netlink_kernel_release + netlink_unicast + nla_memcpy + __nla_parse + nla_put_64bit + nla_put + nla_strlcpy + __nlmsg_put + panic + param_get_string + param_set_copystring + PDE_DATA + pm_wakeup_ws_event + proc_dointvec + pskb_expand_head + _raw_read_lock_bh + _raw_read_unlock_bh + _raw_spin_lock_bh + _raw_spin_unlock_bh + register_inet6addr_notifier + register_inetaddr_notifier + register_netdev + register_netdevice + register_netdevice_notifier + register_sysctl_table + regulatory_hint + rtnl_lock + rtnl_unlock + sched_setscheduler + schedule_timeout_interruptible + sdio_claim_host + sdio_claim_irq + sdio_disable_func + sdio_enable_func + sdio_get_host_pm_caps + sdio_memcpy_fromio + sdio_memcpy_toio + sdio_readsb + sdio_register_driver + sdio_release_host + sdio_release_irq + sdio_set_block_size + sdio_set_host_pm_flags + sdio_unregister_driver + sdio_writesb + set_cpus_allowed_ptr + skb_clone + skb_copy + skb_copy_bits + skb_pull + skb_push + skb_put + skb_queue_purge + skb_trim + strchr + strchrnul + strncasecmp + strnchr + strnstr + __sw_hweight64 + sys_tz + unregister_inet6addr_notifier + unregister_inetaddr_notifier + unregister_netdev + unregister_netdevice_notifier + unregister_netdevice_queue + unregister_sysctl_table + __usecs_to_jiffies + wiphy_apply_custom_regulatory + wiphy_free + wiphy_new_nm + wiphy_register + wiphy_unregister + wireless_send_event + +# required by xhci-hcd.ko + dma_pool_alloc + dma_pool_create + dma_pool_destroy + dma_pool_free + __num_online_cpus + pci_alloc_irq_vectors_affinity + pci_free_irq_vectors + pci_irq_vector + radix_tree_delete + radix_tree_lookup + radix_tree_maybe_preload + schedule_timeout_uninterruptible + sg_pcopy_from_buffer + sg_pcopy_to_buffer + __sw_hweight32 + trace_print_symbols_seq + usb_amd_dev_put + usb_amd_pt_check_port + usb_amd_quirk_pll_disable + usb_amd_quirk_pll_enable + usb_asmedia_modifyflowcontrol + usb_disable_xhci_ports + usb_hcd_check_unlink_urb + usb_hcd_end_port_resume + usb_hcd_giveback_urb + usb_hc_died + usb_hcd_irq + usb_hcd_link_urb_to_ep + usb_hcd_map_urb_for_dma + usb_hcd_poll_rh_status + usb_hcd_resume_root_hub + usb_hcd_start_port_resume + usb_hcd_unlink_urb_from_ep + usb_hub_clear_tt_buffer + usb_root_hub_lost_power + usb_wakeup_notification + +# required by xhci-pci.ko + pci_d3cold_disable + pci_read_config_byte + __pci_register_driver + pci_set_mwi + pci_set_power_state + pci_unregister_driver + usb_amd_quirk_pll_check + usb_create_shared_hcd + usb_enable_intel_xhci_ports + usb_hcd_pci_pm_ops + usb_hcd_pci_probe + usb_hcd_pci_remove + usb_hcd_pci_shutdown + +# required by xhci-plat-hcd.ko + of_usb_host_tpl_support + pci_bus_type + __usb_create_hcd + usb_hcd_platform_shutdown diff --git a/arch/arm64/configs/vendor/holi_GKI.config b/arch/arm64/configs/vendor/holi_GKI.config index 4c2a7b55c0c3..8583022f8f88 100644 --- a/arch/arm64/configs/vendor/holi_GKI.config +++ b/arch/arm64/configs/vendor/holi_GKI.config @@ -240,3 +240,4 @@ CONFIG_SM_GPUCC_BLAIR=m CONFIG_SM_DISPCC_BLAIR=m CONFIG_SM_DEBUGCC_BLAIR=m CONFIG_QCOM_CX_IPEAK=m +CONFIG_LEDS_AW2016=m diff --git a/arch/arm64/configs/vendor/holi_QGKI.config b/arch/arm64/configs/vendor/holi_QGKI.config index 0215d654e38c..2c659afc8649 100644 --- a/arch/arm64/configs/vendor/holi_QGKI.config +++ b/arch/arm64/configs/vendor/holi_QGKI.config @@ -197,3 +197,4 @@ CONFIG_SYN_COOKIES=y CONFIG_PANIC_TIMEOUT=5 CONFIG_CRYPTO_SHA1_ARM64_CE=y CONFIG_QTI_CX_IPEAK_COOLING_DEVICE=y +CONFIG_TLB_CONF_HANDLER=y diff --git a/build.config.gki.aarch64 b/build.config.gki.aarch64 index 210264370e9b..32fbb3b18ae1 100644 --- a/build.config.gki.aarch64 +++ b/build.config.gki.aarch64 @@ -17,6 +17,7 @@ android/abi_gki_aarch64_oneplus android/abi_gki_aarch64_oplus android/abi_gki_aarch64_qcom android/abi_gki_aarch64_sony +android/abi_gki_aarch64_sonywalkman android/abi_gki_aarch64_sunxi android/abi_gki_aarch64_unisoc android/abi_gki_aarch64_vivo diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c index 45a525d402d0..8c3103eb30a2 100644 --- a/drivers/char/adsprpc.c +++ b/drivers/char/adsprpc.c @@ -645,6 +645,8 @@ struct fastrpc_file { struct completion work; /* Flag to indicate ram dump collection status*/ bool is_ramdump_pend; + /* Flag to indicate dynamic process creation status*/ + bool in_process_create; }; static struct fastrpc_apps gfa; @@ -3658,6 +3660,15 @@ static int fastrpc_init_create_dynamic_process(struct fastrpc_file *fl, int siglen; } inbuf; + spin_lock(&fl->hlock); + if (fl->in_process_create) { + err = -EALREADY; + ADSPRPC_ERR("Already in create dynamic process\n"); + spin_unlock(&fl->hlock); + return err; + } + fl->in_process_create = true; + spin_unlock(&fl->hlock); inbuf.pgid = fl->tgid; inbuf.namelen = strlen(current->comm) + 1; inbuf.filelen = init->filelen; @@ -3824,6 +3835,9 @@ bail: locked = 0; } } + spin_lock(&fl->hlock); + fl->in_process_create = false; + spin_unlock(&fl->hlock); return err; } @@ -5187,6 +5201,7 @@ skip_dump_wait: spin_lock(&fl->apps->hlock); hlist_del_init(&fl->hn); fl->is_ramdump_pend = false; + fl->in_process_create = false; spin_unlock(&fl->apps->hlock); kfree(fl->debug_buf); kfree(fl->gidlist.gids); @@ -5594,6 +5609,7 @@ static int fastrpc_device_open(struct inode *inode, struct file *filp) fl->qos_request = 0; fl->dsp_proc_init = 0; fl->is_ramdump_pend = false; + fl->in_process_create = false; init_completion(&fl->work); fl->file_close = FASTRPC_PROCESS_DEFAULT_STATE; filp->private_data = fl; diff --git a/drivers/clk/qcom/clk-rcg2.c b/drivers/clk/qcom/clk-rcg2.c index d1148af5eeb2..88a19aa5115f 100644 --- a/drivers/clk/qcom/clk-rcg2.c +++ b/drivers/clk/qcom/clk-rcg2.c @@ -359,7 +359,7 @@ static int _freq_tbl_determine_rate(struct clk_hw *hw, const struct freq_tbl *f, rate = clk_hw_get_rate(p); } req->best_parent_hw = p; - req->best_parent_rate = rate; + req->best_parent_rate = clk_hw_round_rate(p, rate); req->rate = f->freq; if (f->src_freq != FIXED_FREQ_SRC) { diff --git a/drivers/clk/qcom/gcc-shima.c b/drivers/clk/qcom/gcc-shima.c index a7ec684209ba..b2b71d5e2e02 100644 --- a/drivers/clk/qcom/gcc-shima.c +++ b/drivers/clk/qcom/gcc-shima.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. */ #include @@ -1099,7 +1099,7 @@ static struct clk_rcg2 gcc_sdcc1_apps_clk_src = { .name = "gcc_sdcc1_apps_clk_src", .parent_data = gcc_parent_data_7, .num_parents = 6, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_floor_ops, }, .clkr.vdd_data = { .vdd_class = &vdd_cx, @@ -1128,7 +1128,7 @@ static struct clk_rcg2 gcc_sdcc1_ice_core_clk_src = { .name = "gcc_sdcc1_ice_core_clk_src", .parent_data = gcc_parent_data_1, .num_parents = 5, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_floor_ops, }, .clkr.vdd_data = { .vdd_class = &vdd_cx, @@ -1161,7 +1161,7 @@ static struct clk_rcg2 gcc_sdcc2_apps_clk_src = { .name = "gcc_sdcc2_apps_clk_src", .parent_data = gcc_parent_data_8, .num_parents = 7, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_floor_ops, }, .clkr.vdd_data = { .vdd_class = &vdd_cx, @@ -1192,7 +1192,7 @@ static struct clk_rcg2 gcc_sdcc4_apps_clk_src = { .name = "gcc_sdcc4_apps_clk_src", .parent_data = gcc_parent_data_1, .num_parents = 5, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_floor_ops, }, .clkr.vdd_data = { .vdd_class = &vdd_cx, diff --git a/drivers/gpu/msm/adreno_a6xx_snapshot.c b/drivers/gpu/msm/adreno_a6xx_snapshot.c index d2e82c0c114f..2fc9142aad10 100644 --- a/drivers/gpu/msm/adreno_a6xx_snapshot.c +++ b/drivers/gpu/msm/adreno_a6xx_snapshot.c @@ -254,6 +254,11 @@ a6xx_vbif_snapshot_registers[] = { ARRAY_SIZE(a6xx_vbif_ver_20xxxxxx_registers)/2}, }; +static const unsigned int a6xx_cx_misc_registers[] = { + /* CX_MISC */ + 0, 0, 10, 14, 20, 24, 0x30, 0x49, +}; + /* * Set of registers to dump for A6XX on snapshot. * Registers in pairs - first value is the start offset, second @@ -1701,6 +1706,48 @@ static size_t a6xx_snapshot_gmu_wrapper_registers(struct kgsl_device *device, return (count * 8) + sizeof(*header); } +/* Snapshot cx misc registers */ +static size_t a6xx_snapshot_cx_misc_registers( + struct kgsl_device *device, u8 *buf, size_t remain, void *priv) +{ + struct kgsl_snapshot_regs *header = (struct kgsl_snapshot_regs *)buf; + struct kgsl_snapshot_registers *regs = priv; + unsigned int *data = (unsigned int *)(buf + sizeof(*header)); + int count = 0, j, k; + struct adreno_device *adreno_dev = ADRENO_DEVICE(device); + + /* Figure out how many registers we are going to dump */ + for (j = 0; j < regs->count; j++) { + int start = regs->regs[j * 2]; + int end = regs->regs[j * 2 + 1]; + + count += (end - start + 1); + } + + if (remain < (count * 8) + sizeof(*header)) { + SNAPSHOT_ERR_NOMEM(device, "CX MISC REGS"); + return 0; + } + + for (j = 0; j < regs->count; j++) { + unsigned int start = regs->regs[j * 2]; + unsigned int end = regs->regs[j * 2 + 1]; + + for (k = start; k <= end; k++) { + unsigned int val; + + adreno_cx_misc_regread(adreno_dev, k, &val); + *data++ = k; + *data++ = val; + } + } + + header->count = count; + + /* Return the size of the section */ + return (count * 8) + sizeof(*header); +} + /* Snapshot the preemption related buffers */ static size_t snapshot_preemption_record(struct kgsl_device *device, @@ -1745,6 +1792,7 @@ void a6xx_snapshot(struct adreno_device *adreno_dev, bool sptprac_on = true; unsigned int i, roq_size; u32 hi, lo; + struct kgsl_snapshot_registers r; /* * Dump debugbus data here to capture it for both @@ -1757,8 +1805,6 @@ void a6xx_snapshot(struct adreno_device *adreno_dev, /* RSCC registers are on cx */ if (adreno_is_a650_family(adreno_dev)) { - struct kgsl_snapshot_registers r; - r.regs = a650_isense_registers; r.count = ARRAY_SIZE(a650_isense_registers) / 2; @@ -1767,8 +1813,6 @@ void a6xx_snapshot(struct adreno_device *adreno_dev, } if (adreno_is_a619_holi(adreno_dev)) { - struct kgsl_snapshot_registers r; - r.regs = a6xx_gmu_wrapper_registers; r.count = ARRAY_SIZE(a6xx_gmu_wrapper_registers) / 2; @@ -1780,6 +1824,12 @@ void a6xx_snapshot(struct adreno_device *adreno_dev, ARRAY_SIZE(a6xx_gmu_wrapper_registers) / 2); } + r.regs = a6xx_cx_misc_registers; + r.count = ARRAY_SIZE(a6xx_cx_misc_registers) / 2; + + kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_REGS, + snapshot, a6xx_snapshot_cx_misc_registers, &r); + if (gpudev->sptprac_is_on) sptprac_on = gpudev->sptprac_is_on(adreno_dev); diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index d718dc53d162..3f6e06306c5b 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -3,6 +3,7 @@ * Copyright (c) 2008-2021, The Linux Foundation. All rights reserved. */ +#include #include #include #include @@ -247,6 +248,13 @@ static void _deferred_put(struct work_struct *work) kgsl_mem_entry_put(entry); } +/* Use a worker to put the refcount on mem entry */ +void kgsl_mem_entry_put_deferred(struct kgsl_mem_entry *entry) +{ + INIT_WORK(&entry->work, _deferred_put); + queue_work(kgsl_driver.mem_workqueue, &entry->work); +} + static struct kgsl_mem_entry *kgsl_mem_entry_create(void) { struct kgsl_mem_entry *entry = kzalloc(sizeof(*entry), GFP_KERNEL); @@ -760,8 +768,7 @@ void kgsl_context_detach(struct kgsl_context *context) /* Remove the event group from the list */ kgsl_del_event_group(device, &context->events); - kgsl_sync_timeline_put(context->ktimeline); - + kgsl_sync_timeline_detach(context->ktimeline); kgsl_context_put(context); } @@ -780,6 +787,8 @@ kgsl_context_destroy(struct kref *kref) */ BUG_ON(!kgsl_context_detached(context)); + kgsl_sync_timeline_put(context->ktimeline); + write_lock(&device->context_lock); if (context->id != KGSL_CONTEXT_INVALID) { @@ -803,7 +812,6 @@ kgsl_context_destroy(struct kref *kref) context->id = KGSL_CONTEXT_INVALID; } write_unlock(&device->context_lock); - kgsl_sync_timeline_destroy(context); kgsl_process_private_put(context->proc_priv); device->ftbl->drawctxt_destroy(context); @@ -2335,8 +2343,7 @@ static bool gpuobj_free_fence_func(void *priv) entry->memdesc.gpuaddr, entry->memdesc.size, entry->memdesc.flags); - INIT_WORK(&entry->work, _deferred_put); - queue_work(kgsl_driver.mem_workqueue, &entry->work); + kgsl_mem_entry_put_deferred(entry); return true; } @@ -3008,6 +3015,29 @@ static int kgsl_setup_dma_buf(struct kgsl_device *device, entry->priv_data = meta; entry->memdesc.sgt = sg_table; + if (entry->memdesc.priv & KGSL_MEMDESC_SECURE) { + unsigned long dma_buf_flags; + + ret = dma_buf_get_flags(dmabuf, &dma_buf_flags); + if (ret) { + dev_info(device->dev, + "Unable to get dma buf flags, err = %d. Skipped access check\n", + ret); + ret = 0; + goto skip_access_check; + } + + /* + * Secure buffer is not accessible to CP_PIXEL, there is no point + * in importing this buffer. + */ + if (!(dma_buf_flags & ION_FLAG_CP_PIXEL)) { + ret = -EPERM; + goto out; + } + } + +skip_access_check: /* Calculate the size of the memdesc from the sglist */ for (s = entry->memdesc.sgt->sgl; s != NULL; s = sg_next(s)) { int priv = (entry->memdesc.priv & KGSL_MEMDESC_SECURE) ? 1 : 0; diff --git a/drivers/gpu/msm/kgsl.h b/drivers/gpu/msm/kgsl.h index bb5ee365117d..85d67d0dc2bb 100644 --- a/drivers/gpu/msm/kgsl.h +++ b/drivers/gpu/msm/kgsl.h @@ -267,11 +267,6 @@ struct kgsl_mem_entry { int pending_free; char metadata[KGSL_GPUOBJ_ALLOC_METADATA_MAX + 1]; struct work_struct work; - /** - * @mapped: The number of bytes in this entry that are mapped to - * userspace - */ - u64 mapped; /** * @map_count: Count how many vmas this object is mapped in - used for * debugfs accounting @@ -566,6 +561,13 @@ kgsl_mem_entry_put(struct kgsl_mem_entry *entry) kref_put(&entry->refcount, kgsl_mem_entry_destroy); } +/** + * kgsl_mem_entry_put_deferred() - use a worker to put the refcount + * on mem entry from a sysfs handler or debugfs handler. + * @entry - The memory entry + */ +void kgsl_mem_entry_put_deferred(struct kgsl_mem_entry *entry); + /* * kgsl_addr_range_overlap() - Checks if 2 ranges overlap * @gpuaddr1: Start of first address range diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c index 599c5b61e9f8..481bbf8f2a68 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.c +++ b/drivers/gpu/msm/kgsl_sharedmem.c @@ -136,7 +136,18 @@ imported_mem_show(struct kgsl_process_private *priv, } } - kgsl_mem_entry_put(entry); + /* + * If refcount on mem entry is the last refcount, we will + * call kgsl_mem_entry_destroy and detach it from process + * list. When there is no refcount on the process private, + * we will call kgsl_destroy_process_private to do cleanup. + * During cleanup, we will try to remove the same sysfs + * node which is in use by the current thread and this + * situation will end up in a deadloack. + * To avoid this situation, use a worker to put the refcount + * on mem entry. + */ + kgsl_mem_entry_put_deferred(entry); spin_lock(&priv->mem_lock); } spin_unlock(&priv->mem_lock); @@ -227,12 +238,6 @@ static ssize_t memtype_sysfs_show(struct kobject *kobj, u64 size = 0; int id = 0; - /* - * sysfs_remove_file waits for reads to complete before the node is - * deleted and process private is freed only once kobj is released. - * This implies that priv will not be freed until this function - * completes, and no further locking is needed. - */ priv = container_of(kobj, struct kgsl_process_private, kobj_memtype); memtype = container_of(attr, struct kgsl_memtype, attr); @@ -253,7 +258,7 @@ static ssize_t memtype_sysfs_show(struct kobject *kobj, if (type == memtype->type) size += memdesc->size; - kgsl_mem_entry_put(entry); + kgsl_mem_entry_put_deferred(entry); spin_lock(&priv->mem_lock); } spin_unlock(&priv->mem_lock); diff --git a/drivers/gpu/msm/kgsl_sync.c b/drivers/gpu/msm/kgsl_sync.c index 00f0d5a62816..1103b512487d 100644 --- a/drivers/gpu/msm/kgsl_sync.c +++ b/drivers/gpu/msm/kgsl_sync.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2019, 2021, The Linux Foundation. All rights reserved. */ #include @@ -249,27 +249,41 @@ static void kgsl_sync_timeline_value_str(struct dma_fence *fence, { struct kgsl_sync_fence *kfence = (struct kgsl_sync_fence *)fence; struct kgsl_sync_timeline *ktimeline = kfence->parent; + struct kgsl_context *context = NULL; + unsigned long flags; + int ret = 0; - unsigned int timestamp_retired = 0; - unsigned int timestamp_queued = 0; + unsigned int timestamp_retired; + unsigned int timestamp_queued; if (!kref_get_unless_zero(&ktimeline->kref)) return; + if (!ktimeline->device) + goto put_timeline; - /* - * ktimeline->device might be NULL here but kgsl_readtimestamp() - * will handle that correctly - */ - kgsl_readtimestamp(ktimeline->device, ktimeline->context, - KGSL_TIMESTAMP_RETIRED, ×tamp_retired); + spin_lock_irqsave(&ktimeline->lock, flags); + ret = _kgsl_context_get(ktimeline->context); + context = ret ? ktimeline->context : NULL; + spin_unlock_irqrestore(&ktimeline->lock, flags); - kgsl_readtimestamp(ktimeline->device, ktimeline->context, - KGSL_TIMESTAMP_QUEUED, ×tamp_queued); + /* Get the last signaled timestamp if the context is not valid */ + timestamp_queued = ktimeline->last_timestamp; + timestamp_retired = timestamp_queued; + if (context) { + kgsl_readtimestamp(ktimeline->device, context, + KGSL_TIMESTAMP_RETIRED, ×tamp_retired); + + kgsl_readtimestamp(ktimeline->device, context, + KGSL_TIMESTAMP_QUEUED, ×tamp_queued); + + kgsl_context_put(context); + } snprintf(str, size, "%u queued:%u retired:%u", ktimeline->last_timestamp, timestamp_queued, timestamp_retired); +put_timeline: kgsl_sync_timeline_put(ktimeline); } @@ -298,7 +312,7 @@ int kgsl_sync_timeline_create(struct kgsl_context *context) { struct kgsl_sync_timeline *ktimeline; - /* Put context when timeline is released */ + /* Put context at detach time */ if (!_kgsl_context_get(context)) return -ENOENT; @@ -320,6 +334,11 @@ int kgsl_sync_timeline_create(struct kgsl_context *context) INIT_LIST_HEAD(&ktimeline->child_list_head); spin_lock_init(&ktimeline->lock); ktimeline->device = context->device; + + /* + * The context pointer is valid till detach time, where we put the + * refcount on the context + */ ktimeline->context = context; context->ktimeline = ktimeline; @@ -352,27 +371,30 @@ static void kgsl_sync_timeline_signal(struct kgsl_sync_timeline *ktimeline, kgsl_sync_timeline_put(ktimeline); } -void kgsl_sync_timeline_destroy(struct kgsl_context *context) +void kgsl_sync_timeline_detach(struct kgsl_sync_timeline *ktimeline) { - kfree(context->ktimeline); + unsigned long flags; + struct kgsl_context *context = ktimeline->context; + + /* Set context pointer to NULL and drop our refcount on the context */ + spin_lock_irqsave(&ktimeline->lock, flags); + ktimeline->context = NULL; + spin_unlock_irqrestore(&ktimeline->lock, flags); + kgsl_context_put(context); } -static void kgsl_sync_timeline_release(struct kref *kref) +static void kgsl_sync_timeline_destroy(struct kref *kref) { struct kgsl_sync_timeline *ktimeline = container_of(kref, struct kgsl_sync_timeline, kref); - /* - * Only put the context refcount here. The context destroy function - * will call kgsl_sync_timeline_destroy() to kfree it - */ - kgsl_context_put(ktimeline->context); + kfree(ktimeline); } void kgsl_sync_timeline_put(struct kgsl_sync_timeline *ktimeline) { if (ktimeline) - kref_put(&ktimeline->kref, kgsl_sync_timeline_release); + kref_put(&ktimeline->kref, kgsl_sync_timeline_destroy); } static const struct dma_fence_ops kgsl_sync_fence_ops = { diff --git a/drivers/gpu/msm/kgsl_sync.h b/drivers/gpu/msm/kgsl_sync.h index 989658d58eca..b8655ddc9ca2 100644 --- a/drivers/gpu/msm/kgsl_sync.h +++ b/drivers/gpu/msm/kgsl_sync.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2012-2014,2018-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2014,2018-2019, 2021, The Linux Foundation. All rights reserved. */ #ifndef __KGSL_SYNC_H #define __KGSL_SYNC_H @@ -9,7 +9,8 @@ /** * struct kgsl_sync_timeline - A sync timeline associated with a kgsl context - * @kref: Refcount to keep the struct alive until all its fences are released + * @kref: Refcount to keep the struct alive until all its fences are signaled, + and as long as the context exists * @name: String to describe this timeline * @fence_context: Used by the fence driver to identify fences belonging to * this context @@ -80,7 +81,7 @@ int kgsl_add_fence_event(struct kgsl_device *device, int kgsl_sync_timeline_create(struct kgsl_context *context); -void kgsl_sync_timeline_destroy(struct kgsl_context *context); +void kgsl_sync_timeline_detach(struct kgsl_sync_timeline *ktimeline); void kgsl_sync_timeline_put(struct kgsl_sync_timeline *ktimeline); @@ -118,7 +119,7 @@ static inline int kgsl_sync_timeline_create(struct kgsl_context *context) return 0; } -static inline void kgsl_sync_timeline_destroy(struct kgsl_context *context) +static inline void kgsl_sync_timeline_detach(struct kgsl_sync_timeline *ktimeline) { } diff --git a/drivers/hwtracing/coresight/coresight-tmc-etf.c b/drivers/hwtracing/coresight/coresight-tmc-etf.c index f54dcd6cd8a2..0aec7d36ae6f 100644 --- a/drivers/hwtracing/coresight/coresight-tmc-etf.c +++ b/drivers/hwtracing/coresight/coresight-tmc-etf.c @@ -237,6 +237,9 @@ static int tmc_enable_etf_sink_perf(struct coresight_device *csdev, void *data) struct perf_output_handle *handle = data; struct cs_buffers *buf = etm_perf_sink_config(handle); + if (!buf) + return -EINVAL; + spin_lock_irqsave(&drvdata->spinlock, flags); do { ret = -EINVAL; diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c index 458ad8980273..df6e21f27777 100644 --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c @@ -168,8 +168,15 @@ static void tmc_pages_free(struct tmc_pages *tmc_pages, __free_page(tmc_pages->pages[i]); } - kfree(tmc_pages->pages); - kfree(tmc_pages->daddrs); + if (is_vmalloc_addr(tmc_pages->pages)) + vfree(tmc_pages->pages); + else + kfree(tmc_pages->pages); + + if (is_vmalloc_addr(tmc_pages->daddrs)) + vfree(tmc_pages->daddrs); + else + kfree(tmc_pages->daddrs); tmc_pages->pages = NULL; tmc_pages->daddrs = NULL; tmc_pages->nr_pages = 0; @@ -195,14 +202,24 @@ static int tmc_pages_alloc(struct tmc_pages *tmc_pages, nr_pages = tmc_pages->nr_pages; tmc_pages->daddrs = kcalloc(nr_pages, sizeof(*tmc_pages->daddrs), GFP_KERNEL); - if (!tmc_pages->daddrs) - return -ENOMEM; + if (!tmc_pages->daddrs) { + tmc_pages->daddrs = vmalloc(sizeof(*tmc_pages->daddrs) * nr_pages); + if (!tmc_pages->daddrs) + return -ENOMEM; + } + tmc_pages->pages = kcalloc(nr_pages, sizeof(*tmc_pages->pages), GFP_KERNEL); if (!tmc_pages->pages) { - kfree(tmc_pages->daddrs); - tmc_pages->daddrs = NULL; - return -ENOMEM; + tmc_pages->pages = vmalloc(sizeof(*tmc_pages->pages) * nr_pages); + if (!tmc_pages->pages) { + if (is_vmalloc_addr(tmc_pages->daddrs)) + vfree(tmc_pages->daddrs); + else + kfree(tmc_pages->daddrs); + tmc_pages->daddrs = NULL; + return -ENOMEM; + } } for (i = 0; i < nr_pages; i++) { diff --git a/drivers/input/misc/qcom-hv-haptics.c b/drivers/input/misc/qcom-hv-haptics.c index 40ae40c13d91..6c328798f23d 100644 --- a/drivers/input/misc/qcom-hv-haptics.c +++ b/drivers/input/misc/qcom-hv-haptics.c @@ -43,6 +43,7 @@ #define FIFO_REAL_TIME_FILL_STATUS_MASK_V1 GENMASK(6, 0) /* STATUS_DATA_MSB in V2 when MOD_STATUS_SEL is 5 and MOD_STATUS_XT.SEL is 1 */ #define FIFO_REAL_TIME_FILL_STATUS_MSB_MASK_V2 GENMASK(1, 0) +#define FIFO_REAL_TIME_FILL_STATUS_MSB_MASK_V3 GENMASK(2, 0) #define FIFO_EMPTY_FLAG_BIT_V2 BIT(6) #define FIFO_FULL_FLAG_BIT_V2 BIT(5) @@ -1684,7 +1685,7 @@ static int haptics_update_fifo_sample_v2(struct haptics_chip *chip, static int haptics_get_fifo_fill_status(struct haptics_chip *chip, u32 *fill) { int rc; - u8 val[2]; + u8 val[2], fill_status_mask; bool empty = false, full = false; if (chip->ptn_revision == HAP_PTN_V1) { @@ -1718,8 +1719,10 @@ static int haptics_get_fifo_fill_status(struct haptics_chip *chip, u32 *fill) if (rc < 0) return rc; - *fill = ((val[0] & FIFO_REAL_TIME_FILL_STATUS_MSB_MASK_V2) - << 8) | val[1]; + fill_status_mask = (chip->cfg_revision == HAP_CFG_V2) ? + FIFO_REAL_TIME_FILL_STATUS_MSB_MASK_V2 : + FIFO_REAL_TIME_FILL_STATUS_MSB_MASK_V3; + *fill = ((val[0] & fill_status_mask) << 8) | val[1]; empty = !!(val[0] & FIFO_EMPTY_FLAG_BIT_V2); full = !!(val[0] & FIFO_FULL_FLAG_BIT_V2); } diff --git a/drivers/media/radio/rtc6226/radio-rtc6226-common.c b/drivers/media/radio/rtc6226/radio-rtc6226-common.c index ea08d264ac7f..897909545793 100644 --- a/drivers/media/radio/rtc6226/radio-rtc6226-common.c +++ b/drivers/media/radio/rtc6226/radio-rtc6226-common.c @@ -315,11 +315,13 @@ void rtc6226_scan(struct work_struct *work) u8 factor; int retval = 0; int i, rssi; + unsigned long time; FMDBG("%s enter\n", __func__); radio = container_of(work, struct rtc6226_device, work_scan.work); + mutex_lock(&radio->lock); retval = rtc6226_get_freq(radio, ¤t_freq_khz); if (retval < 0) { FMDERR("%s fail to get freq\n", __func__); @@ -333,10 +335,14 @@ void rtc6226_scan(struct work_struct *work) if (retval < 0) goto seek_tune_fail; /* wait for tune to complete. */ - if (!wait_for_completion_timeout(&radio->completion, - msecs_to_jiffies(TUNE_TIMEOUT_MSEC))) { + mutex_unlock(&radio->lock); + time = wait_for_completion_timeout(&radio->completion, + msecs_to_jiffies(TUNE_TIMEOUT_MSEC)); + mutex_lock(&radio->lock); + if (!time) { FMDERR("In %s, didn't receive STC for tune\n", __func__); rtc6226_q_event(radio, RTC6226_EVT_ERROR); + mutex_unlock(&radio->lock); return; } @@ -351,6 +357,7 @@ void rtc6226_scan(struct work_struct *work) } else if (radio->mode != FM_RECV) { FMDERR("%s: FM is not in proper state\n", __func__); rtc6226_q_event(radio, RTC6226_EVT_ERROR); + mutex_unlock(&radio->lock); return; } @@ -360,8 +367,11 @@ void rtc6226_scan(struct work_struct *work) goto seek_tune_fail; } /* wait for seek to complete */ - if (!wait_for_completion_timeout(&radio->completion, - msecs_to_jiffies(SEEK_TIMEOUT_MSEC))) { + mutex_unlock(&radio->lock); + time = wait_for_completion_timeout(&radio->completion, + msecs_to_jiffies(SEEK_TIMEOUT_MSEC)); + mutex_lock(&radio->lock); + if (!time) { FMDERR("%s:timeout didn't receive STC for seek\n", __func__); rtc6226_get_all_registers(radio); @@ -370,6 +380,7 @@ void rtc6226_scan(struct work_struct *work) radio->registers[i]); /* FM is not correct state or scan is cancelled */ rtc6226_q_event(radio, RTC6226_EVT_ERROR); + mutex_unlock(&radio->lock); return; } else FMDERR("%s: received STC for seek\n", __func__); @@ -406,6 +417,7 @@ void rtc6226_scan(struct work_struct *work) } else if (radio->mode != FM_RECV) { FMDERR("%s: FM is not in proper state\n", __func__); rtc6226_q_event(radio, RTC6226_EVT_ERROR); + mutex_unlock(&radio->lock); return; } FMDBG("%s update search list %d\n", __func__, next_freq_khz); @@ -420,7 +432,6 @@ void rtc6226_scan(struct work_struct *work) && rssi >= radio->rssi_th) { rtc6226_update_search_list(radio, next_freq_khz); } - FMDBG("%s : STATUS=0x%4.4hx\n", __func__, radio->registers[STATUS]); if (radio->registers[STATUS] & STATUS_SF || @@ -452,10 +463,14 @@ void rtc6226_scan(struct work_struct *work) FMDERR("%s seek fail %d\n", __func__, retval); goto seek_tune_fail; } - if (!wait_for_completion_timeout(&radio->completion, - msecs_to_jiffies(SEEK_TIMEOUT_MSEC))) { + mutex_unlock(&radio->lock); + time = wait_for_completion_timeout(&radio->completion, + msecs_to_jiffies(SEEK_TIMEOUT_MSEC)); + mutex_lock(&radio->lock); + if (!time) { FMDERR("timeout didn't receive STC for seek\n"); rtc6226_q_event(radio, RTC6226_EVT_ERROR); + mutex_unlock(&radio->lock); return; } else { FMDERR("%s: received STC for seek\n", __func__); @@ -510,8 +525,11 @@ seek_cancelled: FMDERR("%s: Tune to orig freq failed with error %d\n", __func__, retval); else { - if (!wait_for_completion_timeout(&radio->completion, - msecs_to_jiffies(TUNE_TIMEOUT_MSEC))) + mutex_unlock(&radio->lock); + time = wait_for_completion_timeout(&radio->completion, + msecs_to_jiffies(TUNE_TIMEOUT_MSEC)); + mutex_lock(&radio->lock); + if (!time) FMDERR("%s: didn't receive STD for tune\n", __func__); else FMDERR("%s: received STD for tune\n", __func__); @@ -522,6 +540,7 @@ seek_cancelled: rtc6226_q_event(radio, RTC6226_EVT_TUNE_SUCC); radio->seek_tune_status = NO_SEEK_TUNE_PENDING; FMDERR("%s seek cancelled %d\n", __func__, retval); + mutex_unlock(&radio->lock); return; } @@ -531,14 +550,12 @@ int rtc6226_cancel_seek(struct rtc6226_device *radio) int retval = 0; FMDBG("%s enter\n", __func__); - mutex_lock(&radio->lock); /* stop seeking */ radio->registers[SEEKCFG1] &= ~SEEKCFG1_CSR0_SEEK; retval = rtc6226_set_register(radio, SEEKCFG1); complete(&radio->completion); - mutex_unlock(&radio->lock); radio->is_search_cancelled = true; if (radio->g_search_mode == SEEK) rtc6226_q_event(radio, RTC6226_EVT_SEEK_COMPLETE); @@ -553,10 +570,28 @@ void rtc6226_search(struct rtc6226_device *radio, bool on) current_freq_khz = radio->tuned_freq_khz; + FMDBG("%s rtc6226_power_up1: DeviceID=0x%4.4hx ChipID=0x%4.4hx\n", + __func__, + radio->registers[DEVICEID], radio->registers[CHIPID]); + FMDBG("%s rtc6226_power_up2: Reg2=0x%4.4hx Reg3=0x%4.4hx\n", __func__, + radio->registers[MPXCFG], radio->registers[CHANNEL]); + FMDBG("%s rtc6226_power_up3: Reg4=0x%4.4hx Reg5=0x%4.4hx\n", __func__, + radio->registers[SYSCFG], radio->registers[SEEKCFG1]); + FMDBG("%s rtc6226_power_up4: Reg6=0x%4.4hx Reg7=0x%4.4hx\n", __func__, + radio->registers[POWERCFG], radio->registers[PADCFG]); + FMDBG("%s rtc6226_power_up5: Reg8=0x%4.4hx Reg9=0x%4.4hx\n", __func__, + radio->registers[8], radio->registers[9]); + FMDBG("%s rtc6226_power_up6: regA=0x%4.4hx RegB=0x%4.4hx\n", __func__, + radio->registers[10], radio->registers[11]); + FMDBG("%s rtc6226_power_up7: regC=0x%4.4hx RegD=0x%4.4hx\n", __func__, + radio->registers[12], radio->registers[13]); + FMDBG("%s rtc6226_power_up8: regE=0x%4.4hx RegF=0x%4.4hx\n", __func__, + radio->registers[14], radio->registers[15]); + if (on) { FMDBG("%s: Queuing the work onto scan work q\n", __func__); queue_delayed_work(radio->wqueue_scan, &radio->work_scan, - msecs_to_jiffies(10)); + msecs_to_jiffies(10)); } else { rtc6226_cancel_seek(radio); } @@ -691,12 +726,10 @@ static void rtc6226_get_rds(struct rtc6226_device *radio) { int retval = 0; - mutex_lock(&radio->lock); retval = rtc6226_get_all_registers(radio); if (retval < 0) { FMDERR("%s read fail%d\n", __func__, retval); - mutex_unlock(&radio->lock); return; } radio->block[0] = radio->registers[BA_DATA]; @@ -708,7 +741,6 @@ static void rtc6226_get_rds(struct rtc6226_device *radio) radio->bler[1] = (radio->registers[RSSI] & RSSI_RDS_BB_ERRS) >> 12; radio->bler[2] = (radio->registers[RSSI] & RSSI_RDS_BC_ERRS) >> 10; radio->bler[3] = (radio->registers[RSSI] & RSSI_RDS_BD_ERRS) >> 8; - mutex_unlock(&radio->lock); } static void rtc6226_pi_check(struct rtc6226_device *radio, u16 current_pi) @@ -1308,7 +1340,7 @@ void rtc6226_rds_handler(struct work_struct *worker) } FMDBG("%s enter\n", __func__); - + mutex_lock(&radio->lock); rtc6226_get_rds(radio); if (radio->bler[0] < CORRECTED_THREE_TO_FIVE) @@ -1319,6 +1351,7 @@ void rtc6226_rds_handler(struct work_struct *worker) FMDBG("%s grp_type = %d\n", __func__, grp_type); } else { /* invalid data case */ + mutex_unlock(&radio->lock); return; } if (grp_type & 0x01) @@ -1378,6 +1411,8 @@ void rtc6226_rds_handler(struct work_struct *worker) rtc6226_rt_plus(radio); else if (radio->ert_carrier && (grp_type == radio->ert_carrier)) rtc6226_buff_ert(radio); + + mutex_unlock(&radio->lock); } /* @@ -1400,7 +1435,6 @@ int rtc6226_rds_on(struct rtc6226_device *radio) int rtc6226_reset_rds_data(struct rtc6226_device *radio) { - mutex_lock(&radio->lock); radio->pi = 0; /* reset PS bufferes */ memset(radio->ps_display, 0, sizeof(radio->ps_display)); @@ -1415,7 +1449,6 @@ int rtc6226_reset_rds_data(struct rtc6226_device *radio) radio->wr_index = 0; radio->rd_index = 0; memset(radio->buffer, 0, radio->buf_size); - mutex_unlock(&radio->lock); return 0; } @@ -1441,12 +1474,10 @@ int rtc6226_power_down(struct rtc6226_device *radio) FMDBG("%s enter\n", __func__); - mutex_lock(&radio->lock); /* stop radio */ retval = rtc6226_stop(radio); //rtc6226_disable_irq(radio); - mutex_unlock(&radio->lock); FMDBG("%s exit %d\n", __func__, retval); return retval; @@ -1456,8 +1487,6 @@ int rtc6226_power_up(struct rtc6226_device *radio) { int retval = 0; - mutex_lock(&radio->lock); - FMDBG("%s enter\n", __func__); /* start radio */ @@ -1531,7 +1560,6 @@ int rtc6226_power_up(struct rtc6226_device *radio) done: FMDBG("%s exit %d\n", __func__, retval); - mutex_unlock(&radio->lock); return retval; } @@ -1822,6 +1850,7 @@ int rtc6226_vidioc_s_ctrl(struct file *file, void *priv, FMDBG("%s enter, ctrl->id: %x, value:%d\n", __func__, ctrl->id, ctrl->value); + mutex_lock(&radio->lock); switch (ctrl->id) { case V4L2_CID_PRIVATE_RTC6226_STATE: if (ctrl->value == FM_RECV) { @@ -2082,6 +2111,7 @@ int rtc6226_vidioc_s_ctrl(struct file *file, void *priv, end: FMDBG("%s exit id: %x , ret: %d\n", __func__, ctrl->id, retval); + mutex_unlock(&radio->lock); return retval; } @@ -2112,7 +2142,7 @@ static int rtc6226_vidioc_g_tuner(struct file *file, void *priv, int retval = 0; FMDBG("%s enter\n", __func__); - + mutex_lock(&radio->lock); if (tuner->index != 0) { retval = -EINVAL; goto done; @@ -2160,7 +2190,7 @@ static int rtc6226_vidioc_g_tuner(struct file *file, void *priv, done: FMDBG("%s exit %d\n", __func__, retval); - + mutex_unlock(&radio->lock); return retval; } @@ -2177,7 +2207,7 @@ static int rtc6226_vidioc_s_tuner(struct file *file, void *priv, u16 top_freq; FMDBG("%s entry\n", __func__); - + mutex_lock(&radio->lock); if (tuner->index != 0) { FMDBG("%s index :%d\n", __func__, tuner->index); goto done; @@ -2222,6 +2252,7 @@ static int rtc6226_vidioc_s_tuner(struct file *file, void *priv, radio->recv_conf.band_low_limit = bottom_freq; done: FMDBG("%s exit %d\n", __func__, retval); + mutex_unlock(&radio->lock); return retval; } @@ -2237,7 +2268,7 @@ static int rtc6226_vidioc_g_frequency(struct file *file, void *priv, unsigned int frq; FMDBG("%s enter freq %d\n", __func__, freq->frequency); - + mutex_lock(&radio->lock); freq->type = V4L2_TUNER_RADIO; retval = rtc6226_get_freq(radio, &frq); freq->frequency = frq * TUNE_PARAM; @@ -2246,7 +2277,7 @@ static int rtc6226_vidioc_g_frequency(struct file *file, void *priv, if (retval < 0) FMDERR(" %s get frequency failed with %d\n", __func__, retval); - + mutex_unlock(&radio->lock); return retval; } @@ -2270,13 +2301,14 @@ static int rtc6226_vidioc_s_frequency(struct file *file, void *priv, return -EINVAL; f = (freq->frequency)/TUNE_PARAM; + mutex_lock(&radio->lock); radio->seek_tune_status = TUNE_PENDING; retval = rtc6226_set_freq(radio, f); if (retval < 0) FMDERR("%s set frequency failed with %d\n", __func__, retval); else radio->tuned_freq_khz = f; - + mutex_unlock(&radio->lock); return retval; } @@ -2295,6 +2327,7 @@ static int rtc6226_vidioc_s_hw_freq_seek(struct file *file, void *priv, if (file->f_flags & O_NONBLOCK) return -EWOULDBLOCK; + mutex_lock(&radio->lock); radio->is_search_cancelled = false; /* Disable the rds before seek */ @@ -2328,6 +2361,7 @@ static int rtc6226_vidioc_s_hw_freq_seek(struct file *file, void *priv, __func__, radio->g_search_mode); } FMDBG("%s exit %d\n", __func__, retval); + mutex_unlock(&radio->lock); return retval; } diff --git a/drivers/media/radio/rtc6226/radio-rtc6226-i2c.c b/drivers/media/radio/rtc6226/radio-rtc6226-i2c.c index b086296c28ce..c399753f7dcf 100644 --- a/drivers/media/radio/rtc6226/radio-rtc6226-i2c.c +++ b/drivers/media/radio/rtc6226/radio-rtc6226-i2c.c @@ -229,7 +229,7 @@ static void rtc6226_i2c_interrupt_handler(struct rtc6226_device *radio) unsigned short current_chan; FMDBG("%s enter\n", __func__); - + mutex_lock(&radio->lock); /* check Seek/Tune Complete */ retval = rtc6226_get_register(radio, STATUS); if (retval < 0) { @@ -267,11 +267,13 @@ static void rtc6226_i2c_interrupt_handler(struct rtc6226_device *radio) FMDBG("posting RICHWAVE_EVT_TUNE_SUCC event\n"); rtc6226_q_event(radio, RTC6226_EVT_TUNE_SUCC); radio->seek_tune_status = NO_SEEK_TUNE_PENDING; - } else if (radio->seek_tune_status == TUNE_PENDING) { + } else if ((radio->seek_tune_status == TUNE_PENDING) || + (radio->g_search_mode != SCAN)) { FMDBG("posting RICHWAVE_EVT_TUNE_SUCC event\n"); rtc6226_q_event(radio, RTC6226_EVT_TUNE_SUCC); radio->seek_tune_status = NO_SEEK_TUNE_PENDING; - } else if (radio->seek_tune_status == SCAN_PENDING) { + } else if ((radio->seek_tune_status == SCAN_PENDING) || + (radio->g_search_mode == SCAN)) { /* when scan is pending and STC int is set, signal * so that scan can proceed */ @@ -279,7 +281,8 @@ static void rtc6226_i2c_interrupt_handler(struct rtc6226_device *radio) complete(&radio->completion); } FMDBG("%s Seek/Tune done\n", __func__); - } else { + } else if ((radio->seek_tune_status != TUNE_PENDING) && + (radio->seek_tune_status != SCAN_PENDING)) { /* Check RDS data after tune/seek interrupt finished * Update RDS registers */ @@ -302,6 +305,7 @@ static void rtc6226_i2c_interrupt_handler(struct rtc6226_device *radio) } } end: + mutex_unlock(&radio->lock); FMDBG("%s exit :%d\n", __func__, retval); } @@ -543,7 +547,7 @@ int rtc6226_fops_open(struct file *file) struct rtc6226_device *radio = video_drvdata(file); int retval; - FMDBG("%s enter user num = %d\n", __func__, radio->users); + FMDBG("%s enter user num = %d\n", __func__, atomic_read(&radio->users)); if (atomic_inc_return(&radio->users) != 1) { FMDERR("Device already in use. Try again later\n"); atomic_dec(&radio->users); @@ -586,6 +590,7 @@ int rtc6226_fops_release(struct file *file) int retval = 0; FMDBG("%s : Exit\n", __func__); + mutex_lock(&radio->lock); if (radio->mode != FM_OFF) { rtc6226_power_down(radio); radio->mode = FM_OFF; @@ -595,6 +600,7 @@ int rtc6226_fops_release(struct file *file) retval = rtc6226_fm_power_cfg(radio, TURNING_OFF); if (retval < 0) FMDERR("%s: failed to apply voltage\n", __func__); + mutex_unlock(&radio->lock); return retval; } diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index 6debdfb83630..8facf5e1ba57 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -939,7 +939,7 @@ static int msm_init_cm_dll(struct sdhci_host *host, mclk_freq = ROUND(dll_clock * cycle_cnt, TCXO_FREQ); - if (dll_clock < 192000000) + if (dll_clock < 100000000) pr_err("%s: %s: Non standard clk freq =%u\n", mmc_hostname(mmc), __func__, dll_clock); @@ -2721,8 +2721,8 @@ static void sdhci_msm_registers_restore(struct sdhci_host *host) host->ioaddr + msm_offset->core_pwrctl_mask); if (cq_host) - cqhci_writel(cq_host, msm_host->cqe_regs.cqe_vendor_cfg1, - CQHCI_VENDOR_CFG1); + cqhci_writel(cq_host, msm_host->cqe_regs.cqe_vendor_cfg1 & + ~CMDQ_SEND_STATUS_TRIGGER, CQHCI_VENDOR_CFG1); if (((ios.timing == MMC_TIMING_MMC_HS400) || (ios.timing == MMC_TIMING_MMC_HS200) || diff --git a/drivers/net/wireless/cnss2/main.c b/drivers/net/wireless/cnss2/main.c index 9707beef230f..fd99b1dc2700 100644 --- a/drivers/net/wireless/cnss2/main.c +++ b/drivers/net/wireless/cnss2/main.c @@ -3207,13 +3207,9 @@ static int cnss_probe(struct platform_device *plat_dev) if (ret) goto deinit_event_work; - ret = cnss_dms_init(plat_priv); - if (ret) - goto deinit_qmi; - ret = cnss_debugfs_create(plat_priv); if (ret) - goto deinit_dms; + goto deinit_qmi; ret = cnss_misc_init(plat_priv); if (ret) @@ -3241,6 +3237,10 @@ retry: } } + ret = cnss_dms_init(plat_priv); + if (ret) + goto deinit_bus; + cnss_register_coex_service(plat_priv); cnss_register_ims_service(plat_priv); @@ -3252,6 +3252,9 @@ retry: return 0; +deinit_bus: + if (!test_bit(SKIP_DEVICE_BOOT, &plat_priv->ctrl_params.quirks)) + cnss_bus_deinit(plat_priv); power_off: if (!test_bit(SKIP_DEVICE_BOOT, &plat_priv->ctrl_params.quirks)) cnss_power_off_device(plat_priv); @@ -3259,8 +3262,6 @@ deinit_misc: cnss_misc_deinit(plat_priv); destroy_debugfs: cnss_debugfs_destroy(plat_priv); -deinit_dms: - cnss_dms_deinit(plat_priv); deinit_qmi: cnss_qmi_deinit(plat_priv); deinit_event_work: @@ -3287,10 +3288,10 @@ static int cnss_remove(struct platform_device *plat_dev) cnss_genl_exit(); cnss_unregister_ims_service(plat_priv); cnss_unregister_coex_service(plat_priv); + cnss_dms_deinit(plat_priv); cnss_bus_deinit(plat_priv); cnss_misc_deinit(plat_priv); cnss_debugfs_destroy(plat_priv); - cnss_dms_deinit(plat_priv); cnss_qmi_deinit(plat_priv); cnss_event_work_deinit(plat_priv); cnss_remove_sysfs(plat_priv); diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index 08635be66660..43c2c420d255 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -1107,6 +1107,9 @@ int cnss_suspend_pci_link(struct cnss_pci_data *pci_priv) cnss_pr_err("Failed to set D3Hot, err = %d\n", ret); } + /* Always do PCIe L2 suspend during power off/PCIe link recovery */ + pci_priv->drv_connected_last = 0; + ret = cnss_set_pci_link(pci_priv, PCI_LINK_DOWN); if (ret) goto out; @@ -1184,8 +1187,6 @@ int cnss_pci_recover_link_down(struct cnss_pci_data *pci_priv) */ msleep(WAKE_EVENT_TIMEOUT); - /* Always do PCIe L2 suspend/resume during link down recovery */ - pci_priv->drv_connected_last = 0; ret = cnss_suspend_pci_link(pci_priv); if (ret) cnss_pr_err("Failed to suspend PCI link, err = %d\n", ret); @@ -1737,20 +1738,20 @@ static int cnss_pci_set_mhi_state(struct cnss_pci_data *pci_priv, break; case CNSS_MHI_SUSPEND: mutex_lock(&pci_priv->mhi_ctrl->pm_mutex); +retry: if (pci_priv->drv_connected_last) { ret = mhi_pm_fast_suspend(pci_priv->mhi_ctrl, true); } else { ret = mhi_pm_suspend(pci_priv->mhi_ctrl); - /* in some corner case, when cnss try to suspend, - * there is still packets pending in mhi layer, - * so retry suspend to save roll back effort. - */ - while (ret == -EBUSY && retry < MHI_SUSPEND_RETRY_CNT) { - usleep_range(5000, 6000); - retry++; - cnss_pr_err("mhi is busy, retry #%u", retry); - ret = mhi_pm_suspend(pci_priv->mhi_ctrl); - } + } + /* in some corner case, when cnss try to suspend, + * there is still packets pending in mhi layer, + * so retry suspend to save roll back effort. + */ + if (ret == -EBUSY && retry++ < MHI_SUSPEND_RETRY_CNT) { + usleep_range(5000, 6000); + cnss_pr_err("mhi is busy, retry #%u", retry); + goto retry; } mutex_unlock(&pci_priv->mhi_ctrl->pm_mutex); break; @@ -3023,6 +3024,8 @@ static void cnss_pci_event_cb(struct msm_pcie_notify *notify) struct pci_dev *pci_dev; struct cnss_pci_data *pci_priv; struct device *dev; + struct cnss_plat_data *plat_priv = NULL; + int ret = 0; if (!notify) return; @@ -3037,6 +3040,23 @@ static void cnss_pci_event_cb(struct msm_pcie_notify *notify) dev = &pci_priv->pci_dev->dev; switch (notify->event) { + case MSM_PCIE_EVENT_LINK_RECOVER: + cnss_pr_dbg("PCI link recover callback\n"); + + plat_priv = pci_priv->plat_priv; + if (!plat_priv) { + cnss_pr_err("plat_priv is NULL\n"); + return; + } + + plat_priv->ctrl_params.quirks |= BIT(LINK_DOWN_SELF_RECOVERY); + + ret = msm_pcie_pm_control(MSM_PCIE_HANDLE_LINKDOWN, + pci_dev->bus->number, pci_dev, NULL, + PM_OPTIONS_DEFAULT); + if (ret) + cnss_pci_handle_linkdown(pci_priv); + break; case MSM_PCIE_EVENT_LINKDOWN: cnss_pr_dbg("PCI link down event callback\n"); cnss_pci_handle_linkdown(pci_priv); @@ -3080,8 +3100,9 @@ static int cnss_reg_pci_event(struct cnss_pci_data *pci_priv) struct msm_pcie_register_event *pci_event; pci_event = &pci_priv->msm_pci_event; - pci_event->events = MSM_PCIE_EVENT_LINKDOWN | - MSM_PCIE_EVENT_WAKEUP; + pci_event->events = MSM_PCIE_EVENT_LINK_RECOVER | + MSM_PCIE_EVENT_LINKDOWN | + MSM_PCIE_EVENT_WAKEUP; if (cnss_pci_is_drv_supported(pci_priv)) pci_event->events = pci_event->events | diff --git a/drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.c b/drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.c index a5360a0c0098..39ec3f397df7 100644 --- a/drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.c +++ b/drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.c @@ -3414,6 +3414,86 @@ struct qmi_elem_info wlfw_host_cap_req_msg_v01_ei[] = { wlfw_host_cap_req_msg_v01, feature_list), }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x28, + .offset = offsetof(struct + wlfw_host_cap_req_msg_v01, + num_wlan_clients_valid), + }, + { + .data_type = QMI_UNSIGNED_2_BYTE, + .elem_len = 1, + .elem_size = sizeof(u16), + .array_type = NO_ARRAY, + .tlv_type = 0x28, + .offset = offsetof(struct + wlfw_host_cap_req_msg_v01, + num_wlan_clients), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x29, + .offset = offsetof(struct + wlfw_host_cap_req_msg_v01, + num_wlan_vaps_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x29, + .offset = offsetof(struct + wlfw_host_cap_req_msg_v01, + num_wlan_vaps), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x2A, + .offset = offsetof(struct + wlfw_host_cap_req_msg_v01, + wake_msi_addr_valid), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(u32), + .array_type = NO_ARRAY, + .tlv_type = 0x2A, + .offset = offsetof(struct + wlfw_host_cap_req_msg_v01, + wake_msi_addr), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x2B, + .offset = offsetof(struct + wlfw_host_cap_req_msg_v01, + wlan_enable_delay_valid), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(u32), + .array_type = NO_ARRAY, + .tlv_type = 0x2B, + .offset = offsetof(struct + wlfw_host_cap_req_msg_v01, + wlan_enable_delay), + }, { .data_type = QMI_EOTI, .array_type = NO_ARRAY, diff --git a/drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.h b/drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.h index e54cbce85252..0cb3e604d7dd 100644 --- a/drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.h +++ b/drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.h @@ -9,117 +9,117 @@ #define WLFW_SERVICE_ID_V01 0x45 #define WLFW_SERVICE_VERS_V01 0x01 -#define QMI_WLFW_IND_REGISTER_REQ_V01 0x0020 -#define QMI_WLFW_IND_REGISTER_RESP_V01 0x0020 -#define QMI_WLFW_FW_READY_IND_V01 0x0021 -#define QMI_WLFW_WLAN_MODE_REQ_V01 0x0022 -#define QMI_WLFW_WLAN_MODE_RESP_V01 0x0022 -#define QMI_WLFW_WLAN_CFG_REQ_V01 0x0023 -#define QMI_WLFW_WLAN_CFG_RESP_V01 0x0023 -#define QMI_WLFW_CAP_REQ_V01 0x0024 -#define QMI_WLFW_CAP_RESP_V01 0x0024 -#define QMI_WLFW_BDF_DOWNLOAD_REQ_V01 0x0025 -#define QMI_WLFW_BDF_DOWNLOAD_RESP_V01 0x0025 -#define QMI_WLFW_CAL_REPORT_REQ_V01 0x0026 -#define QMI_WLFW_CAL_REPORT_RESP_V01 0x0026 -#define QMI_WLFW_CAL_DOWNLOAD_REQ_V01 0x0027 -#define QMI_WLFW_CAL_DOWNLOAD_RESP_V01 0x0027 -#define QMI_WLFW_INITIATE_CAL_DOWNLOAD_IND_V01 0x0028 -#define QMI_WLFW_CAL_UPDATE_REQ_V01 0x0029 -#define QMI_WLFW_CAL_UPDATE_RESP_V01 0x0029 -#define QMI_WLFW_INITIATE_CAL_UPDATE_IND_V01 0x002A -#define QMI_WLFW_MSA_READY_IND_V01 0x002B -#define QMI_WLFW_PIN_CONNECT_RESULT_IND_V01 0x002C -#define QMI_WLFW_MSA_INFO_REQ_V01 0x002D -#define QMI_WLFW_MSA_INFO_RESP_V01 0x002D -#define QMI_WLFW_MSA_READY_REQ_V01 0x002E -#define QMI_WLFW_MSA_READY_RESP_V01 0x002E -#define QMI_WLFW_INI_REQ_V01 0x002F -#define QMI_WLFW_INI_RESP_V01 0x002F -#define QMI_WLFW_ATHDIAG_READ_REQ_V01 0x0030 -#define QMI_WLFW_ATHDIAG_READ_RESP_V01 0x0030 -#define QMI_WLFW_ATHDIAG_WRITE_REQ_V01 0x0031 -#define QMI_WLFW_ATHDIAG_WRITE_RESP_V01 0x0031 -#define QMI_WLFW_VBATT_REQ_V01 0x0032 -#define QMI_WLFW_VBATT_RESP_V01 0x0032 -#define QMI_WLFW_MAC_ADDR_REQ_V01 0x0033 -#define QMI_WLFW_MAC_ADDR_RESP_V01 0x0033 -#define QMI_WLFW_HOST_CAP_REQ_V01 0x0034 -#define QMI_WLFW_HOST_CAP_RESP_V01 0x0034 -#define QMI_WLFW_REQUEST_MEM_IND_V01 0x0035 -#define QMI_WLFW_RESPOND_MEM_REQ_V01 0x0036 -#define QMI_WLFW_RESPOND_MEM_RESP_V01 0x0036 -#define QMI_WLFW_FW_MEM_READY_IND_V01 0x0037 -#define QMI_WLFW_FW_INIT_DONE_IND_V01 0x0038 -#define QMI_WLFW_REJUVENATE_IND_V01 0x0039 -#define QMI_WLFW_REJUVENATE_ACK_REQ_V01 0x003A -#define QMI_WLFW_REJUVENATE_ACK_RESP_V01 0x003A -#define QMI_WLFW_DYNAMIC_FEATURE_MASK_REQ_V01 0x003B -#define QMI_WLFW_DYNAMIC_FEATURE_MASK_RESP_V01 0x003B -#define QMI_WLFW_M3_INFO_REQ_V01 0x003C -#define QMI_WLFW_M3_INFO_RESP_V01 0x003C -#define QMI_WLFW_XO_CAL_IND_V01 0x003D -#define QMI_WLFW_CAL_DONE_IND_V01 0x003E -#define QMI_WLFW_QDSS_TRACE_REQ_MEM_IND_V01 0x003F -#define QMI_WLFW_QDSS_TRACE_MEM_INFO_REQ_V01 0x0040 -#define QMI_WLFW_QDSS_TRACE_MEM_INFO_RESP_V01 0x0040 -#define QMI_WLFW_QDSS_TRACE_SAVE_IND_V01 0x0041 -#define QMI_WLFW_QDSS_TRACE_DATA_REQ_V01 0x0042 -#define QMI_WLFW_QDSS_TRACE_DATA_RESP_V01 0x0042 -#define QMI_WLFW_SHUTDOWN_REQ_V01 0x0043 -#define QMI_WLFW_SHUTDOWN_RESP_V01 0x0043 -#define QMI_WLFW_QDSS_TRACE_CONFIG_DOWNLOAD_REQ_V01 0x0044 -#define QMI_WLFW_QDSS_TRACE_CONFIG_DOWNLOAD_RESP_V01 0x0044 -#define QMI_WLFW_QDSS_TRACE_MODE_REQ_V01 0x0045 -#define QMI_WLFW_QDSS_TRACE_MODE_RESP_V01 0x0045 -#define QMI_WLFW_QDSS_TRACE_FREE_IND_V01 0x0046 -#define QMI_WLFW_ANTENNA_SWITCH_REQ_V01 0x0047 -#define QMI_WLFW_ANTENNA_SWITCH_RESP_V01 0x0047 -#define QMI_WLFW_ANTENNA_GRANT_REQ_V01 0x0048 -#define QMI_WLFW_ANTENNA_GRANT_RESP_V01 0x0048 -#define QMI_WLFW_WFC_CALL_STATUS_REQ_V01 0x0049 -#define QMI_WLFW_WFC_CALL_STATUS_RESP_V01 0x0049 -#define QMI_WLFW_GET_INFO_REQ_V01 0x004A -#define QMI_WLFW_GET_INFO_RESP_V01 0x004A -#define QMI_WLFW_RESPOND_GET_INFO_IND_V01 0x004B -#define QMI_WLFW_DEVICE_INFO_REQ_V01 0x004C -#define QMI_WLFW_DEVICE_INFO_RESP_V01 0x004C -#define QMI_WLFW_M3_DUMP_UPLOAD_REQ_IND_V01 0x004D -#define QMI_WLFW_M3_DUMP_UPLOAD_DONE_REQ_V01 0x004E -#define QMI_WLFW_M3_DUMP_UPLOAD_DONE_RESP_V01 0x004E -#define QMI_WLFW_SOC_WAKE_REQ_V01 0x004F -#define QMI_WLFW_SOC_WAKE_RESP_V01 0x004F -#define QMI_WLFW_POWER_SAVE_REQ_V01 0x0050 #define QMI_WLFW_POWER_SAVE_RESP_V01 0x0050 -#define QMI_WLFW_WFC_CALL_TWT_CONFIG_IND_V01 0x0051 -#define QMI_WLFW_QDSS_MEM_READY_IND_V01 0x0052 +#define QMI_WLFW_CAP_REQ_V01 0x0024 +#define QMI_WLFW_CAL_REPORT_REQ_V01 0x0026 +#define QMI_WLFW_M3_INFO_RESP_V01 0x003C +#define QMI_WLFW_CAL_REPORT_RESP_V01 0x0026 +#define QMI_WLFW_MAC_ADDR_RESP_V01 0x0033 +#define QMI_WLFW_DYNAMIC_FEATURE_MASK_RESP_V01 0x003B +#define QMI_WLFW_IND_REGISTER_REQ_V01 0x0020 +#define QMI_WLFW_DYNAMIC_FEATURE_MASK_REQ_V01 0x003B +#define QMI_WLFW_QDSS_TRACE_MODE_RESP_V01 0x0045 +#define QMI_WLFW_FW_READY_IND_V01 0x0021 +#define QMI_WLFW_QDSS_TRACE_MEM_INFO_RESP_V01 0x0040 +#define QMI_WLFW_CAL_UPDATE_REQ_V01 0x0029 +#define QMI_WLFW_REQUEST_MEM_IND_V01 0x0035 +#define QMI_WLFW_QDSS_TRACE_DATA_RESP_V01 0x0042 +#define QMI_WLFW_RESPOND_MEM_RESP_V01 0x0036 +#define QMI_WLFW_VBATT_RESP_V01 0x0032 +#define QMI_WLFW_QDSS_TRACE_MODE_REQ_V01 0x0045 +#define QMI_WLFW_CAL_DOWNLOAD_REQ_V01 0x0027 +#define QMI_WLFW_IND_REGISTER_RESP_V01 0x0020 +#define QMI_WLFW_CAL_UPDATE_RESP_V01 0x0029 +#define QMI_WLFW_M3_INFO_REQ_V01 0x003C #define QMI_WLFW_PCIE_GEN_SWITCH_REQ_V01 0x0053 +#define QMI_WLFW_ANTENNA_GRANT_RESP_V01 0x0048 +#define QMI_WLFW_INITIATE_CAL_UPDATE_IND_V01 0x002A +#define QMI_WLFW_RESPOND_MEM_REQ_V01 0x0036 +#define QMI_WLFW_HOST_CAP_RESP_V01 0x0034 +#define QMI_WLFW_MSA_READY_IND_V01 0x002B +#define QMI_WLFW_WLAN_MODE_REQ_V01 0x0022 +#define QMI_WLFW_WLAN_CFG_RESP_V01 0x0023 +#define QMI_WLFW_REJUVENATE_IND_V01 0x0039 +#define QMI_WLFW_ATHDIAG_WRITE_REQ_V01 0x0031 +#define QMI_WLFW_SOC_WAKE_REQ_V01 0x004F +#define QMI_WLFW_PIN_CONNECT_RESULT_IND_V01 0x002C +#define QMI_WLFW_M3_DUMP_UPLOAD_DONE_RESP_V01 0x004E +#define QMI_WLFW_QDSS_TRACE_SAVE_IND_V01 0x0041 +#define QMI_WLFW_BDF_DOWNLOAD_RESP_V01 0x0025 +#define QMI_WLFW_REJUVENATE_ACK_RESP_V01 0x003A +#define QMI_WLFW_MSA_INFO_RESP_V01 0x002D +#define QMI_WLFW_SHUTDOWN_REQ_V01 0x0043 +#define QMI_WLFW_VBATT_REQ_V01 0x0032 +#define QMI_WLFW_MAC_ADDR_REQ_V01 0x0033 +#define QMI_WLFW_WLAN_CFG_REQ_V01 0x0023 +#define QMI_WLFW_ANTENNA_GRANT_REQ_V01 0x0048 +#define QMI_WLFW_BDF_DOWNLOAD_REQ_V01 0x0025 +#define QMI_WLFW_FW_MEM_READY_IND_V01 0x0037 +#define QMI_WLFW_RESPOND_GET_INFO_IND_V01 0x004B +#define QMI_WLFW_QDSS_TRACE_DATA_REQ_V01 0x0042 +#define QMI_WLFW_CAL_DOWNLOAD_RESP_V01 0x0027 +#define QMI_WLFW_INI_RESP_V01 0x002F +#define QMI_WLFW_QDSS_TRACE_MEM_INFO_REQ_V01 0x0040 +#define QMI_WLFW_ANTENNA_SWITCH_REQ_V01 0x0047 +#define QMI_WLFW_QDSS_TRACE_REQ_MEM_IND_V01 0x003F +#define QMI_WLFW_INITIATE_CAL_DOWNLOAD_IND_V01 0x0028 +#define QMI_WLFW_ATHDIAG_WRITE_RESP_V01 0x0031 +#define QMI_WLFW_QDSS_TRACE_CONFIG_DOWNLOAD_RESP_V01 0x0044 +#define QMI_WLFW_SOC_WAKE_RESP_V01 0x004F +#define QMI_WLFW_GET_INFO_RESP_V01 0x004A #define QMI_WLFW_PCIE_GEN_SWITCH_RESP_V01 0x0053 +#define QMI_WLFW_INI_REQ_V01 0x002F #define QMI_WLFW_M3_DUMP_UPLOAD_SEGMENTS_REQ_IND_V01 0x0054 +#define QMI_WLFW_MSA_READY_REQ_V01 0x002E +#define QMI_WLFW_M3_DUMP_UPLOAD_DONE_REQ_V01 0x004E +#define QMI_WLFW_CAP_RESP_V01 0x0024 +#define QMI_WLFW_REJUVENATE_ACK_REQ_V01 0x003A +#define QMI_WLFW_ATHDIAG_READ_RESP_V01 0x0030 +#define QMI_WLFW_ANTENNA_SWITCH_RESP_V01 0x0047 +#define QMI_WLFW_DEVICE_INFO_REQ_V01 0x004C +#define QMI_WLFW_MSA_INFO_REQ_V01 0x002D +#define QMI_WLFW_HOST_CAP_REQ_V01 0x0034 +#define QMI_WLFW_QDSS_TRACE_CONFIG_DOWNLOAD_REQ_V01 0x0044 +#define QMI_WLFW_GET_INFO_REQ_V01 0x004A +#define QMI_WLFW_CAL_DONE_IND_V01 0x003E +#define QMI_WLFW_M3_DUMP_UPLOAD_REQ_IND_V01 0x004D +#define QMI_WLFW_WFC_CALL_STATUS_RESP_V01 0x0049 +#define QMI_WLFW_FW_INIT_DONE_IND_V01 0x0038 +#define QMI_WLFW_POWER_SAVE_REQ_V01 0x0050 +#define QMI_WLFW_XO_CAL_IND_V01 0x003D +#define QMI_WLFW_SHUTDOWN_RESP_V01 0x0043 +#define QMI_WLFW_ATHDIAG_READ_REQ_V01 0x0030 +#define QMI_WLFW_WFC_CALL_TWT_CONFIG_IND_V01 0x0051 +#define QMI_WLFW_WLAN_MODE_RESP_V01 0x0022 +#define QMI_WLFW_WFC_CALL_STATUS_REQ_V01 0x0049 +#define QMI_WLFW_DEVICE_INFO_RESP_V01 0x004C +#define QMI_WLFW_MSA_READY_RESP_V01 0x002E +#define QMI_WLFW_QDSS_TRACE_FREE_IND_V01 0x0046 +#define QMI_WLFW_QDSS_MEM_READY_IND_V01 0x0052 -#define QMI_WLFW_MAX_NUM_CE_V01 12 -#define QMI_WLFW_MAX_NUM_SVC_V01 24 -#define QMI_WLFW_MAX_DATA_SIZE_V01 6144 #define QMI_WLFW_MAX_NUM_CAL_V01 5 -#define QMI_WLFW_MAX_STR_LEN_V01 16 -#define QMI_WLFW_MAX_NUM_SHADOW_REG_V01 24 -#define QMI_WLFW_MAX_NUM_SHADOW_REG_V2_V01 36 -#define QMI_WLFW_MAX_NUM_MEMORY_REGIONS_V01 2 -#define QMI_WLFW_MAX_NUM_MEM_CFG_V01 2 -#define QMI_WLFW_MAX_NUM_MEM_SEG_V01 52 -#define QMI_WLFW_MAX_TIMESTAMP_LEN_V01 32 -#define QMI_WLFW_MAC_ADDR_SIZE_V01 6 -#define QMI_WLFW_MAX_BUILD_ID_LEN_V01 128 -#define QMI_WLFW_FUNCTION_NAME_LEN_V01 128 -#define QMI_WLFW_MAX_ATHDIAG_DATA_SIZE_V01 6144 -#define QMI_WLFW_MAX_NUM_GPIO_V01 32 -#define QMI_WLFW_MAX_WFC_CALL_STATUS_DATA_SIZE_V01 256 #define QMI_WLFW_MAX_PLATFORM_NAME_LEN_V01 64 #define QMI_WLFW_MAX_HOST_DDR_RANGE_SIZE_V01 3 -#define QMI_WLFW_MAX_M3_SEGMENTS_SIZE_V01 10 +#define QMI_WLFW_MAX_NUM_SHADOW_REG_V01 24 +#define QMI_WLFW_MAX_BUILD_ID_LEN_V01 128 #define QMI_WLFW_MAX_DEV_MEM_NUM_V01 4 -#define QMI_WLFW_MAX_NUM_MLO_CHIPS_V01 3 #define QMI_WLFW_MAX_NUM_MLO_LINKS_PER_CHIP_V01 2 +#define QMI_WLFW_MAX_NUM_SVC_V01 24 +#define QMI_WLFW_MAX_NUM_MEMORY_REGIONS_V01 2 +#define QMI_WLFW_MAC_ADDR_SIZE_V01 6 +#define QMI_WLFW_MAX_NUM_MEM_CFG_V01 2 +#define QMI_WLFW_MAX_NUM_MEM_SEG_V01 52 +#define QMI_WLFW_MAX_WFC_CALL_STATUS_DATA_SIZE_V01 256 +#define QMI_WLFW_MAX_DATA_SIZE_V01 6144 +#define QMI_WLFW_FUNCTION_NAME_LEN_V01 128 +#define QMI_WLFW_MAX_NUM_CE_V01 12 +#define QMI_WLFW_MAX_TIMESTAMP_LEN_V01 32 +#define QMI_WLFW_MAX_M3_SEGMENTS_SIZE_V01 10 +#define QMI_WLFW_MAX_STR_LEN_V01 16 +#define QMI_WLFW_MAX_NUM_SHADOW_REG_V2_V01 36 +#define QMI_WLFW_MAX_ATHDIAG_DATA_SIZE_V01 6144 +#define QMI_WLFW_MAX_NUM_GPIO_V01 32 +#define QMI_WLFW_MAX_NUM_MLO_CHIPS_V01 3 enum wlfw_driver_mode_enum_v01 { WLFW_DRIVER_MODE_ENUM_MIN_VAL_V01 = INT_MIN, @@ -165,6 +165,7 @@ enum wlfw_mem_type_enum_v01 { QMI_WLFW_MEM_QDSS_V01 = 6, QMI_WLFW_MEM_HANG_DATA_V01 = 7, QMI_WLFW_MLO_GLOBAL_MEM_V01 = 8, + QMI_WLFW_PAGEABLE_MEM_V01 = 9, WLFW_MEM_TYPE_ENUM_MAX_VAL_V01 = INT_MAX, }; @@ -795,9 +796,17 @@ struct wlfw_host_cap_req_msg_v01 { struct wlfw_host_mlo_chip_info_s_v01 mlo_chip_info[QMI_WLFW_MAX_NUM_MLO_CHIPS_V01]; u8 feature_list_valid; u64 feature_list; + u8 num_wlan_clients_valid; + u16 num_wlan_clients; + u8 num_wlan_vaps_valid; + u8 num_wlan_vaps; + u8 wake_msi_addr_valid; + u32 wake_msi_addr; + u8 wlan_enable_delay_valid; + u32 wlan_enable_delay; }; -#define WLFW_HOST_CAP_REQ_MSG_V01_MAX_MSG_LEN 373 +#define WLFW_HOST_CAP_REQ_MSG_V01_MAX_MSG_LEN 396 extern struct qmi_elem_info wlfw_host_cap_req_msg_v01_ei[]; struct wlfw_host_cap_resp_msg_v01 { diff --git a/drivers/pci/controller/pci-msm.c b/drivers/pci/controller/pci-msm.c index a9c3dd7c5ecb..3a6e2a7ec708 100644 --- a/drivers/pci/controller/pci-msm.c +++ b/drivers/pci/controller/pci-msm.c @@ -1395,7 +1395,7 @@ static void msm_pcie_write_reg(void __iomem *base, u32 offset, u32 value) static void msm_pcie_write_reg_field(void __iomem *base, u32 offset, const u32 mask, u32 val) { - u32 shift = find_first_bit((void *)&mask, 32); + u32 shift = __ffs(mask); u32 tmp = readl_relaxed(base + offset); tmp &= ~mask; /* clear written bits */ diff --git a/drivers/pinctrl/qcom/pinctrl-lahaina.c b/drivers/pinctrl/qcom/pinctrl-lahaina.c index b2bf0d27ec6f..1d5b13a7e3cb 100644 --- a/drivers/pinctrl/qcom/pinctrl-lahaina.c +++ b/drivers/pinctrl/qcom/pinctrl-lahaina.c @@ -1286,7 +1286,7 @@ static const char * const qup5_groups[] = { "gpio24", "gpio25", "gpio26", "gpio27", }; static const char * const qup6_groups[] = { - "gpio28", "gpio29", "gpio30", "gpio31", + "gpio28", "gpio29", "gpio30", "gpio31", "gpio6", }; static const char * const qup7_groups[] = { "gpio32", "gpio33", "gpio34", "gpio35", @@ -1609,7 +1609,7 @@ static const struct msm_pingroup lahaina_groups[] = { [3] = PINGROUP(3, qup13, qup_l5, NA, NA, NA, NA, NA, NA, NA, 0, -1), [4] = PINGROUP(4, qup0, NA, NA, NA, NA, NA, NA, NA, NA, 0, -1), [5] = PINGROUP(5, qup0, NA, NA, NA, NA, NA, NA, NA, NA, 0, -1), - [6] = PINGROUP(6, qup0, qup_l4, NA, NA, NA, NA, NA, NA, NA, 0, -1), + [6] = PINGROUP(6, qup0, qup6, NA, NA, NA, NA, NA, NA, NA, 0, -1), [7] = PINGROUP(7, qup0, qup_l5, NA, NA, NA, NA, NA, NA, NA, 0xCB000, 0), [8] = PINGROUP(8, qup1, NA, NA, NA, NA, NA, NA, NA, NA, 0, -1), [9] = PINGROUP(9, qup1, NA, NA, NA, NA, NA, NA, NA, NA, 0, -1), diff --git a/drivers/soc/qcom/icnss2/main.c b/drivers/soc/qcom/icnss2/main.c index 9e75f1244d08..36f35f59c11d 100644 --- a/drivers/soc/qcom/icnss2/main.c +++ b/drivers/soc/qcom/icnss2/main.c @@ -3352,9 +3352,12 @@ static void icnss_wpss_load(struct work_struct *wpss_load_work) { struct icnss_priv *priv = icnss_get_plat_priv(); + icnss_pr_dbg("Start WPSS Boot\n"); + priv->subsys = subsystem_get("wpss"); if (IS_ERR_OR_NULL(priv->subsys)) - icnss_pr_err("Failed to load wpss subsys"); + icnss_pr_err("Failed to load wpss subsys, ret: %d", + PTR_ERR(priv->subsys)); } static inline void icnss_wpss_unload(struct icnss_priv *priv) @@ -3390,11 +3393,33 @@ static ssize_t wpss_boot_store(struct device *dev, return count; } +static ssize_t wlan_en_delay_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct icnss_priv *priv = dev_get_drvdata(dev); + uint32_t wlan_en_delay = 0; + + if (priv->device_id != WCN6750_DEVICE_ID) + return count; + + if (sscanf(buf, "%du", &wlan_en_delay) != 1) { + icnss_pr_err("Failed to read wlan_en_delay"); + return -EINVAL; + } + + icnss_pr_dbg("WLAN_EN delay: %dms", wlan_en_delay); + priv->wlan_en_delay_ms = wlan_en_delay; + + return count; +} + static DEVICE_ATTR_WO(qdss_tr_start); static DEVICE_ATTR_WO(qdss_tr_stop); static DEVICE_ATTR_WO(qdss_conf_download); static DEVICE_ATTR_WO(hw_trc_override); static DEVICE_ATTR_WO(wpss_boot); +static DEVICE_ATTR_WO(wlan_en_delay); static struct attribute *icnss_attrs[] = { &dev_attr_qdss_tr_start.attr, @@ -3402,6 +3427,7 @@ static struct attribute *icnss_attrs[] = { &dev_attr_qdss_conf_download.attr, &dev_attr_hw_trc_override.attr, &dev_attr_wpss_boot.attr, + &dev_attr_wlan_en_delay.attr, NULL, }; diff --git a/drivers/soc/qcom/icnss2/main.h b/drivers/soc/qcom/icnss2/main.h index f23d45d09d12..0615d9a53896 100644 --- a/drivers/soc/qcom/icnss2/main.h +++ b/drivers/soc/qcom/icnss2/main.h @@ -454,6 +454,7 @@ struct icnss_priv { u32 hw_trc_override; struct icnss_dms_data dms; u8 use_nv_mac; + u32 wlan_en_delay_ms; }; struct icnss_reg_info { diff --git a/drivers/soc/qcom/icnss2/qmi.c b/drivers/soc/qcom/icnss2/qmi.c index d9b99c2c485a..b1b0de53ce51 100644 --- a/drivers/soc/qcom/icnss2/qmi.c +++ b/drivers/soc/qcom/icnss2/qmi.c @@ -656,7 +656,9 @@ int wlfw_cap_send_sync_msg(struct icnss_priv *priv) goto out; } - ret = qmi_txn_wait(&txn, priv->ctrl_params.qmi_timeout); + ret = qmi_txn_wait(&txn, + priv->ctrl_params.qmi_timeout + + msecs_to_jiffies(priv->wlan_en_delay_ms)); if (ret < 0) { icnss_qmi_fatal_err("Capability resp wait failed with ret %d\n", ret); @@ -1409,7 +1411,9 @@ int wlfw_wlan_mode_send_sync_msg(struct icnss_priv *priv, goto out; } - ret = qmi_txn_wait(&txn, priv->ctrl_params.qmi_timeout); + ret = qmi_txn_wait(&txn, + priv->ctrl_params.qmi_timeout + + msecs_to_jiffies(priv->wlan_en_delay_ms)); if (ret < 0) { icnss_qmi_fatal_err("Mode resp wait failed with ret %d\n", ret); goto out; @@ -3132,6 +3136,13 @@ int wlfw_host_cap_send_sync(struct icnss_priv *priv) req->host_build_type_valid = 1; req->host_build_type = icnss_get_host_build_type(); + if (priv->wlan_en_delay_ms >= 100) { + icnss_pr_dbg("Setting WLAN_EN delay: %d ms\n", + priv->wlan_en_delay_ms); + req->wlan_enable_delay_valid = 1; + req->wlan_enable_delay = priv->wlan_en_delay_ms; + } + ret = qmi_txn_init(&priv->qmi, &txn, wlfw_host_cap_resp_msg_v01_ei, resp); if (ret < 0) { diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c index ef51b3973eec..55b2e0bad42e 100644 --- a/drivers/soc/qcom/peripheral-loader.c +++ b/drivers/soc/qcom/peripheral-loader.c @@ -1197,6 +1197,7 @@ int pil_boot(struct pil_desc *desc) if (desc->shutdown_fail) pil_err(desc, "Subsystem shutdown failed previously!\n"); + desc->clear_fw_region = true; /* Reinitialize for new image */ pil_release_mmap(desc); @@ -1250,6 +1251,8 @@ int pil_boot(struct pil_desc *desc) if (desc->ops->init_image) ret = desc->ops->init_image(desc, fw->data, fw->size); if (ret) { + /* S2 mapping not yet done */ + desc->clear_fw_region = false; pil_err(desc, "Initializing image failed(rc:%d)\n", ret); goto err_boot; } @@ -1259,6 +1262,8 @@ int pil_boot(struct pil_desc *desc) ret = desc->ops->mem_setup(desc, priv->region_start, priv->region_end - priv->region_start); if (ret) { + /* S2 mapping is failed */ + desc->clear_fw_region = false; pil_err(desc, "Memory setup error(rc:%d)\n", ret); goto err_deinit_image; } diff --git a/drivers/soc/qcom/trace_secure_buffer.h b/drivers/soc/qcom/trace_secure_buffer.h index 2fef8079fd56..655ffde55862 100644 --- a/drivers/soc/qcom/trace_secure_buffer.h +++ b/drivers/soc/qcom/trace_secure_buffer.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2019, 2021 The Linux Foundation. All rights reserved. */ #undef TRACE_SYSTEM @@ -59,29 +59,29 @@ TRACE_EVENT(hyp_assign_batch_start, TP_STRUCT__entry( __field(int, info_nelems) __field(u64, batch_size) - __dynamic_array(phys_addr_t, addrs, info_nelems) + __dynamic_array(u64, addrs, info_nelems) __dynamic_array(u64, sizes, info_nelems) ), TP_fast_assign( unsigned int i; - phys_addr_t *addr_arr_ptr = __get_dynamic_array(addrs); + u64 *addr_arr_ptr = __get_dynamic_array(addrs); u64 *sizes_arr_ptr = __get_dynamic_array(sizes); __entry->info_nelems = info_nelems; __entry->batch_size = 0; for (i = 0; i < info_nelems; i++) { - addr_arr_ptr[i] = info[i].mem_addr; - sizes_arr_ptr[i] = info[i].mem_size; - __entry->batch_size += info[i].mem_size; + addr_arr_ptr[i] = le64_to_cpu(info[i].mem_addr); + sizes_arr_ptr[i] = le64_to_cpu(info[i].mem_size); + __entry->batch_size += le64_to_cpu(info[i].mem_size); } ), TP_printk("num entries: %d batch size: %llu phys addrs: %s sizes: %s", __entry->info_nelems, __entry->batch_size, __print_array(__get_dynamic_array(addrs), - __entry->info_nelems, sizeof(phys_addr_t)), + __entry->info_nelems, sizeof(u64)), __print_array(__get_dynamic_array(sizes), __entry->info_nelems, sizeof(u64)) ) diff --git a/drivers/thermal/tsens-dbg.c b/drivers/thermal/tsens-dbg.c index 26922b43f16b..e4ed076566b9 100644 --- a/drivers/thermal/tsens-dbg.c +++ b/drivers/thermal/tsens-dbg.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved. */ #include @@ -371,28 +371,23 @@ static int tsens_dbg_log_bus_id_data(struct tsens_device *data, offset += TSENS_DEBUG_OFFSET_ROW; } - loop = 0; - while (loop < TSENS_DEBUG_LOOP_COUNT) { - offset = TSENS_DEBUG_OFFSET_ROW * - TSENS_DEBUG_STATUS_REG_START; - TSENS_DUMP(tmdev, "Start of TSENS TM dump %d\n", - loop); - /* Limited dump of the registers for the temperature */ - for (i = 0; i < TSENS_DEBUG_LOOP_COUNT; i++) { - r1 = readl_relaxed(controller_id_addr + offset); - r2 = readl_relaxed(controller_id_addr + - (offset + TSENS_DEBUG_OFFSET_WORD1)); - r3 = readl_relaxed(controller_id_addr + - (offset + TSENS_DEBUG_OFFSET_WORD2)); - r4 = readl_relaxed(controller_id_addr + - (offset + TSENS_DEBUG_OFFSET_WORD3)); + offset = TSENS_DEBUG_OFFSET_ROW * + TSENS_DEBUG_STATUS_REG_START; + TSENS_DUMP(tmdev, "%s", "Start of TSENS TM dump\n"); + /* Limited dump of the registers for the temperature */ + for (i = 0; i < TSENS_DEBUG_LOOP_COUNT; i++) { + r1 = readl_relaxed(controller_id_addr + offset); + r2 = readl_relaxed(controller_id_addr + + (offset + TSENS_DEBUG_OFFSET_WORD1)); + r3 = readl_relaxed(controller_id_addr + + (offset + TSENS_DEBUG_OFFSET_WORD2)); + r4 = readl_relaxed(controller_id_addr + + (offset + TSENS_DEBUG_OFFSET_WORD3)); TSENS_DUMP(tmdev, "ctrl:%d:0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n", cntrl_id, offset, r1, r2, r3, r4); - offset += TSENS_DEBUG_OFFSET_ROW; - } - loop++; + offset += TSENS_DEBUG_OFFSET_ROW; } return 0; diff --git a/drivers/thermal/tsens2xxx.c b/drivers/thermal/tsens2xxx.c index 10dbabfc5c64..fdca661048cf 100644 --- a/drivers/thermal/tsens2xxx.c +++ b/drivers/thermal/tsens2xxx.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved. */ #include @@ -51,7 +51,7 @@ #define TSENS_TM_0C_THR_OFFSET 12 #define TSENS_TM_CODE_SIGN_BIT 0x800 #define TSENS_TM_SCALE_DECI_MILLIDEG 100 -#define TSENS_DEBUG_WDOG_TRIGGER_COUNT 5 +#define TSENS_DEBUG_WDOG_TRIGGER_COUNT 100 #define TSENS_TM_WATCHDOG_LOG(n) ((n) + 0x13c) #define TSENS_TM_WATCHDOG_LOG_v23(n) ((n) + 0x170) #define TSENS_EN BIT(0) @@ -515,7 +515,7 @@ fail: static irqreturn_t tsens_tm_critical_irq_thread(int irq, void *data) { struct tsens_device *tm = data; - unsigned int i, status, wd_log, wd_mask; + unsigned int i, status, wd_log, wd_mask, wd_status; unsigned long flags; void __iomem *sensor_status_addr, *sensor_int_mask_addr; void __iomem *sensor_critical_addr; @@ -532,6 +532,8 @@ static irqreturn_t tsens_tm_critical_irq_thread(int irq, void *data) wd_log_addr = TSENS_TM_WATCHDOG_LOG_v23(tm->tsens_tm_addr); else wd_log_addr = TSENS_TM_WATCHDOG_LOG(tm->tsens_tm_addr); + wd_status = readl_relaxed(wd_critical_addr); + TSENS_DBG(tm, "Critical irq status:%d\n", wd_status); if (tm->ctrl_data->wd_bark) { wd_mask = readl_relaxed(wd_critical_addr); diff --git a/drivers/tty/serial/msm_geni_serial.c b/drivers/tty/serial/msm_geni_serial.c index 0656d65c7b74..f81be32b396b 100644 --- a/drivers/tty/serial/msm_geni_serial.c +++ b/drivers/tty/serial/msm_geni_serial.c @@ -106,7 +106,7 @@ #define STALE_TIMEOUT (16) #define STALE_COUNT (DEFAULT_BITS_PER_CHAR * STALE_TIMEOUT) #define SEC_TO_USEC (1000000) -#define SYSTEM_DELAY (500) +#define STALE_DELAY (10000) //10msec #define DEFAULT_BITS_PER_CHAR (10) #define GENI_UART_NR_PORTS (6) #define GENI_UART_CONS_PORTS (1) @@ -1559,7 +1559,6 @@ static int stop_rx_sequencer(struct uart_port *uport) struct msm_geni_serial_port *port = GET_DEV_PORT(uport); unsigned long flags = 0; bool is_rx_active; - unsigned int stale_delay; u32 dma_rx_status, s_irq_status; int usage_count; @@ -1576,15 +1575,12 @@ static int stop_rx_sequencer(struct uart_port *uport) if (!uart_console(uport)) { /* - * Wait for the stale timeout to happen if there - * is any data pending in the rx fifo. - * Have a safety factor of 2 to include the interrupt - * and system latencies, add 500usec delay for interrupt - * latency or system delay. + * Wait for the stale timeout around 10msec to happen + * if there is any data pending in the rx fifo. + * This will help to handle incoming rx data in stop_rx_sequencer + * for interrupt latency or system delay cases. */ - stale_delay = (STALE_COUNT * SEC_TO_USEC) / port->cur_baud; - stale_delay = (2 * stale_delay) + SYSTEM_DELAY; - udelay(stale_delay); + udelay(STALE_DELAY); dma_rx_status = geni_read_reg_nolog(uport->membase, SE_DMA_RX_IRQ_STAT); diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h index 82ed4137f37a..b6fdfd97a8f3 100644 --- a/include/linux/sched/sysctl.h +++ b/include/linux/sched/sysctl.h @@ -63,6 +63,7 @@ extern unsigned int sysctl_walt_rtg_cfs_boost_prio; extern unsigned int sysctl_walt_low_latency_task_threshold; extern unsigned int sysctl_sched_sync_hint_enable; extern unsigned int sysctl_walt_cpu_high_irqload; +extern unsigned int sysctl_sched_asym_cap_sibling_freq_match_en; extern int walt_proc_group_thresholds_handler(struct ctl_table *table, int write, diff --git a/include/uapi/linux/msm_ipa.h b/include/uapi/linux/msm_ipa.h index d4dd11734ef0..7d2a309a4f80 100644 --- a/include/uapi/linux/msm_ipa.h +++ b/include/uapi/linux/msm_ipa.h @@ -2618,13 +2618,17 @@ struct ipa_ioc_gsb_info { #define IPA_PCIE0_EP_ID 21 #define IPA_PCIE1_EP_ID 22 +#define IPA_ETH0_EP_ID 31 +#define IPA_ETH1_EP_ID 32 + enum ipa_peripheral_ep_type { IPA_DATA_EP_TYP_RESERVED = 0, IPA_DATA_EP_TYP_HSIC = 1, IPA_DATA_EP_TYP_HSUSB = 2, IPA_DATA_EP_TYP_PCIE = 3, IPA_DATA_EP_TYP_EMBEDDED = 4, - IPA_DATA_EP_TYP_BAM_DMUX, + IPA_DATA_EP_TYP_BAM_DMUX = 5, + IPA_DATA_EP_TYP_ETH, }; struct ipa_ep_pair_info { @@ -3206,6 +3210,7 @@ enum ipacm_hw_index_counter_virtual_type { * @pdn_cfg_type: type of the pdn config applied. * @enable: enable/disable pdn config type. * @u.collison_cfg.pdn_ip_addr: pdn_ip_address used in collision config. + * @u.collison_cfg.vlan_id; VLAN ID of the client. * @u.passthrough_cfg.pdn_ip_addr: pdn_ip_address used in passthrough config. * @u.passthrough_cfg.device_type: Device type of the client. * @u.passthrough_cfg.vlan_id: VLAN ID of the client. @@ -3221,6 +3226,7 @@ struct ipa_ioc_pdn_config { union { struct ipa_pdn_ip_collision_cfg { __u32 pdn_ip_addr; + __u16 vlan_id; } collison_cfg; struct ipa_pdn_ip_passthrough_cfg { diff --git a/kernel/sched/walt/walt.c b/kernel/sched/walt/walt.c index ddf1c0d98356..79d62b40a134 100644 --- a/kernel/sched/walt/walt.c +++ b/kernel/sched/walt/walt.c @@ -119,6 +119,9 @@ unsigned int sysctl_sched_walt_rotate_big_tasks; unsigned int walt_rotation_enabled; __read_mostly unsigned int sysctl_sched_asym_cap_sibling_freq_match_pct = 100; +__read_mostly unsigned int sysctl_sched_asym_cap_sibling_freq_match_en; +static cpumask_t asym_freq_match_cpus = CPU_MASK_NONE; + __read_mostly unsigned int sched_ravg_hist_size = 5; static __read_mostly unsigned int sched_io_is_busy = 1; @@ -645,23 +648,31 @@ __cpu_util_freq_walt(int cpu, struct walt_cpu_load *walt_load) unsigned long cpu_util_freq_walt(int cpu, struct walt_cpu_load *walt_load) { - struct walt_cpu_load wl_other = {0}; - unsigned long util = 0, util_other = 0; + static unsigned long util_other; + static struct walt_cpu_load wl_other; + unsigned long util = 0; unsigned long capacity = capacity_orig_of(cpu); - int i, mpct = sysctl_sched_asym_cap_sibling_freq_match_pct; + int mpct = sysctl_sched_asym_cap_sibling_freq_match_pct; + int max_cap_cpu; - if (!cpumask_test_cpu(cpu, &asym_cap_sibling_cpus)) + if (!cpumask_test_cpu(cpu, &asym_cap_sibling_cpus) && + !(sysctl_sched_asym_cap_sibling_freq_match_en && + cpumask_test_cpu(cpu, &asym_freq_match_cpus))) return __cpu_util_freq_walt(cpu, walt_load); - for_each_cpu(i, &asym_cap_sibling_cpus) { - if (i == cpu) - util = __cpu_util_freq_walt(cpu, walt_load); - else - util_other = __cpu_util_freq_walt(i, &wl_other); - } + /* FIXME: Prime always last cpu */ + max_cap_cpu = cpumask_last(&asym_freq_match_cpus); + util = __cpu_util_freq_walt(cpu, walt_load); - if (cpu == cpumask_last(&asym_cap_sibling_cpus)) + if (cpu != max_cap_cpu) { + if (cpumask_first(&asym_freq_match_cpus) == cpu) + util_other = + __cpu_util_freq_walt(max_cap_cpu, &wl_other); + else + goto out; + } else { mpct = 100; + } util = ADJUSTED_ASYM_CAP_CPU_UTIL(util, util_other, mpct); @@ -669,6 +680,18 @@ cpu_util_freq_walt(int cpu, struct walt_cpu_load *walt_load) mpct); walt_load->pl = ADJUSTED_ASYM_CAP_CPU_UTIL(walt_load->pl, wl_other.pl, mpct); +out: + if (cpu != max_cap_cpu) { + if (util > util_other) { + util_other = util; + wl_other.nl = walt_load->nl; + } + if (wl_other.pl < walt_load->pl) + wl_other.pl = walt_load->pl; + } else { + util_other = 0; + memset(&wl_other, 0, sizeof(wl_other)); + } return (util >= capacity) ? capacity : util; } @@ -2616,6 +2639,14 @@ void walt_update_cluster_topology(void) &asym_cap_sibling_cpus, &cluster->cpus); } + if (num_sched_clusters > 2) { + for_each_sched_cluster(cluster) { + if (!is_min_capacity_cluster(cluster)) + cpumask_or(&asym_freq_match_cpus, + &asym_freq_match_cpus, &cluster->cpus); + } + } + if (cpumask_weight(&asym_cap_sibling_cpus) == 1) cpumask_clear(&asym_cap_sibling_cpus); @@ -3426,6 +3457,13 @@ void walt_irq_work(struct irq_work *irq_work) int level = 0; u64 cur_jiffies_ts; unsigned long flags; + struct cpumask freq_match_cpus; + + if (sysctl_sched_asym_cap_sibling_freq_match_en && + !cpumask_empty(&asym_freq_match_cpus)) + cpumask_copy(&freq_match_cpus, &asym_freq_match_cpus); + else + cpumask_copy(&freq_match_cpus, &asym_cap_sibling_cpus); /* Am I the window rollover work or the migration work? */ if (irq_work == &walt_migration_irq_work) @@ -3457,7 +3495,7 @@ void walt_irq_work(struct irq_work *irq_work) rq->wrq.grp_time.prev_runnable_sum; } if (is_migration && rq->wrq.notif_pending && - cpumask_test_cpu(cpu, &asym_cap_sibling_cpus)) { + cpumask_test_cpu(cpu, &freq_match_cpus)) { is_asym_migration = true; rq->wrq.notif_pending = false; } @@ -3472,11 +3510,11 @@ void walt_irq_work(struct irq_work *irq_work) } if (total_grp_load) { - if (cpumask_weight(&asym_cap_sibling_cpus)) { + if (cpumask_weight(&freq_match_cpus)) { u64 big_grp_load = total_grp_load - min_cluster_grp_load; - for_each_cpu(cpu, &asym_cap_sibling_cpus) + for_each_cpu(cpu, &freq_match_cpus) cpu_cluster(cpu)->aggr_grp_load = big_grp_load; } rtgb_active = is_rtgb_active(); @@ -3508,7 +3546,7 @@ void walt_irq_work(struct irq_work *irq_work) } if (is_asym_migration && cpumask_test_cpu(cpu, - &asym_cap_sibling_cpus)) + &freq_match_cpus)) flag |= SCHED_CPUFREQ_INTERCLUSTER_MIG; if (i == num_cpus) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index d85172a76f3f..5c6882767f43 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -461,6 +461,15 @@ static struct ctl_table kern_table[] = { .extra1 = SYSCTL_ONE, .extra2 = &one_hundred, }, + { + .procname = "sched_asym_cap_sibling_freq_match_enable", + .data = &sysctl_sched_asym_cap_sibling_freq_match_en, + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_ONE, + }, { .procname = "sched_coloc_downmigrate_ns", .data = &sysctl_sched_coloc_downmigrate_ns,