From f8878f4c597b94c91e06592105f6e60febd4125c Mon Sep 17 00:00:00 2001 From: Kamal Agrawal Date: Mon, 5 Jul 2021 12:24:03 +0530 Subject: [PATCH 01/39] ANDROID: ABI: Update allowed list for QCOM Leaf changes summary: 3 artifacts changed Changed leaf types summary: 0 leaf type changed Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 3 Added functions Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable 3 Added functions: [A] 'function int ftrace_set_clr_event(trace_array*, char*, int)' [A] 'function trace_array* trace_array_create(const char*)' [A] 'function int trace_array_destroy(trace_array*)' Bug: 192805993 Change-Id: Id6d34efa83f4d212e3cfdf049028117e45cd5411 Signed-off-by: Kamal Agrawal --- android/abi_gki_aarch64.xml | 243 +++++++++++++++++++---------------- android/abi_gki_aarch64_qcom | 3 + 2 files changed, 133 insertions(+), 113 deletions(-) diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index ff1a17ee7753..20e6044bc6dd 100644 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -1705,6 +1705,7 @@ + @@ -3967,13 +3968,13 @@ - + @@ -4118,6 +4119,8 @@ + + @@ -17791,7 +17794,7 @@ - + @@ -20409,7 +20412,7 @@ - + @@ -23594,7 +23597,7 @@ - + @@ -23610,7 +23613,7 @@ - + @@ -23618,7 +23621,7 @@ - + @@ -23626,7 +23629,7 @@ - + @@ -30034,7 +30037,7 @@ - + @@ -31970,7 +31973,7 @@ - + @@ -32433,7 +32436,7 @@ - + @@ -128458,6 +128461,10 @@ + + + + @@ -128465,10 +128472,6 @@ - - - - @@ -148466,7 +148469,7 @@ - + @@ -163003,78 +163006,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -163206,25 +163137,47 @@ - - - - - - + + + + + - - - - - - + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -163278,6 +163231,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -167658,7 +167675,7 @@ - + @@ -167666,7 +167683,7 @@ - + @@ -167674,7 +167691,7 @@ - + @@ -174030,7 +174047,7 @@ - + @@ -178796,7 +178813,7 @@ - + @@ -178825,7 +178842,7 @@ - + @@ -179417,7 +179434,7 @@ - + @@ -180377,7 +180394,7 @@ - + @@ -191058,6 +191075,6 @@ diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom index 13187bc671f8..2ed20f996171 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 @@ -2438,6 +2439,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 From f59ee36156fa7b6be506897bedf1f636b88a7999 Mon Sep 17 00:00:00 2001 From: Yoshitaka Seto Date: Fri, 9 Jul 2021 16:22:10 +0900 Subject: [PATCH 02/39] ANDROID: GKI: Add KMI symbol list for Sony Android Walkman products Added initial file named abi_gki_aarch64_sonywalkman. abi.report.short: Leaf changes summary: 14 artifacts changed Changed leaf types summary: 0 leaf type changed Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 13 Added functions Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 1 Added variable 13 Added functions: [A] 'function int cpumask_any_but(const cpumask*, unsigned int)' [A] 'function int extcon_set_property_sync(extcon_dev*, unsigned int, unsigned int, extcon_property_value)' [A] 'function int extcon_set_state(extcon_dev*, unsigned int, bool)' [A] 'function int mmc_gpio_set_cd_wake(mmc_host*, bool)' [A] 'function int mod_timer_pending(timer_list*, unsigned long int)' [A] 'function void perf_pmu_migrate_context(pmu*, int, int)' [A] 'function int perf_pmu_register(pmu*, const char*, int)' [A] 'function void perf_pmu_unregister(pmu*)' [A] 'function scatterlist* sg_last(scatterlist*, unsigned int)' [A] 'function int typec_find_port_data_role(const char*)' [A] 'function int typec_find_port_power_role(const char*)' [A] 'function int typec_find_power_role(const char*)' [A] 'function typec_altmode* typec_match_altmode(typec_altmode**, size_t, u16, u8)' 1 Added variable: [A] 'workqueue_struct* system_freezable_power_efficient_wq' Bug: 193202308 Change-Id: Id6db1e7357f3c42dca310d0aa7d92e71388e25d6 Signed-off-by: Yoshitaka Seto --- android/abi_gki_aarch64.xml | 118 +- android/abi_gki_aarch64_sonywalkman | 1846 +++++++++++++++++++++++++++ build.config.gki.aarch64 | 1 + 3 files changed, 1949 insertions(+), 16 deletions(-) create mode 100644 android/abi_gki_aarch64_sonywalkman diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index 20e6044bc6dd..a8654903fc21 100644 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -760,6 +760,7 @@ + @@ -1649,6 +1650,8 @@ + + @@ -2616,6 +2619,7 @@ + @@ -2648,6 +2652,7 @@ + @@ -3016,6 +3021,9 @@ + + + @@ -3650,6 +3658,7 @@ + @@ -4213,7 +4222,11 @@ + + + + @@ -4933,6 +4946,7 @@ + @@ -23597,7 +23611,7 @@ - + @@ -23613,7 +23627,7 @@ - + @@ -23621,7 +23635,7 @@ - + @@ -23629,7 +23643,7 @@ - + @@ -30956,7 +30970,7 @@ - + @@ -67922,6 +67936,12 @@ + + + + + + @@ -67942,6 +67962,13 @@ + + + + + + + @@ -105579,6 +105606,11 @@ + + + + + @@ -125140,16 +125172,6 @@ - - - - - - - - - - @@ -140290,6 +140312,7 @@ + @@ -140312,6 +140335,13 @@ + + + + + + + @@ -140718,6 +140748,18 @@ + + + + + + + + + + + + @@ -148313,7 +148355,7 @@ - + @@ -148334,6 +148376,12 @@ + + + + + + @@ -148348,6 +148396,16 @@ + + + + + + + + + + @@ -148790,6 +148848,13 @@ + + + + + + + @@ -162240,6 +162305,16 @@ + + + + + + + + + + @@ -163598,6 +163673,7 @@ + @@ -164392,6 +164468,11 @@ + + + + + @@ -175930,6 +176011,11 @@ + + + + + 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/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 From 170a31dd74eda30f49d7ef9b90c19f4e5e1fcc0d Mon Sep 17 00:00:00 2001 From: Ashish Chavan Date: Wed, 14 Jul 2021 15:06:53 +0530 Subject: [PATCH 03/39] ANDROID: ABI: Update allowed list for QCOM Add the following symbols to QCOM allowed-list: -- i2c_smbus_write_byte_data -- i2c_smbus_read_byte_data Bug: 193604299 Change-Id: I5294f69eec7a65e860d60ac6f437812b4029caab Signed-off-by: Ashish Chavan --- android/abi_gki_aarch64_qcom | 2 ++ 1 file changed, 2 insertions(+) diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom index 2ed20f996171..a497f4b8433f 100644 --- a/android/abi_gki_aarch64_qcom +++ b/android/abi_gki_aarch64_qcom @@ -1083,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 From 8eb8412259530321f2fcd8af7bcef585937c5420 Mon Sep 17 00:00:00 2001 From: "jy.ser" Date: Mon, 19 Jul 2021 17:12:55 +0900 Subject: [PATCH 04/39] ANDROID: ABI: update allowed list for galaxy Leaf changes summary: 4 artifacts changed Changed leaf types summary: 0 leaf type changed Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 4 Added functions 4 Added functions: [A] 'function spi_device* of_find_spi_device_by_node(device_node*)' [A] 'function snd_card* snd_card_ref(int)' [A] 'function int snd_soc_component_enable_pin(snd_soc_component*, const char*)' [A] 'function int snd_soc_component_get_pin_status(snd_soc_component*, const char*)' Bug: 194031787 Signed-off-by: Jiyeon Ser Change-Id: I3390357777edb9ffb07cc5eb1cedcc0d1ac90b46 --- android/abi_gki_aarch64.xml | 52 +++++++++++++++++++++++++--------- android/abi_gki_aarch64_galaxy | 4 +++ 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index a8654903fc21..9b0d0c9f7193 100644 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -2803,6 +2803,7 @@ + @@ -3763,6 +3764,7 @@ + @@ -3848,8 +3850,10 @@ + + @@ -28578,7 +28582,7 @@ - + @@ -30261,7 +30265,7 @@ - + @@ -32534,7 +32538,7 @@ - + @@ -125172,6 +125176,16 @@ + + + + + + + + + + @@ -128507,6 +128521,10 @@ + + + + @@ -162305,16 +162323,6 @@ - - - - - - - - - - @@ -186102,12 +186110,28 @@ + + + + + + + + + + + + + + + + @@ -191161,6 +191185,6 @@ 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 From 93cbb8df23d90bf3678d437ae439f8d0d3938a62 Mon Sep 17 00:00:00 2001 From: Mohammed Siddiq Date: Mon, 11 Jan 2021 19:35:25 +0530 Subject: [PATCH 05/39] cnss2: WAR to trigger self-recovery for link recover callback Add WAR to trigger self-recovery on receiving event callback MSM_PCIE_EVENT_LINK_RECOVER. Skip call to force assert when mhi resume -ETIMEDOUT. Change-Id: I05d3b2889e1983bab2509c1db2a3e45fdfe484d3 Signed-off-by: Mohammed Siddiq --- drivers/net/wireless/cnss2/pci.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index 08635be66660..6f260da8537b 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -3023,6 +3023,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 +3039,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 +3099,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 | From 3ebe41df9a4a117f81e2f86f21930a362e4d4888 Mon Sep 17 00:00:00 2001 From: Mohammed Siddiq Date: Fri, 16 Jul 2021 16:56:11 +0530 Subject: [PATCH 06/39] cnss2: Add code to do PCIe L2 suspend during shutdown During mhi resume if mhi detects link down then it posts link recover event where cnss platform driver goes for self recovery, as part of recovery the shutdown & powerup sequence is done. During shutdown the PCIe link is suspended, the link suspend should be L2 suspend. But in current scenario, it goes for DRV suspend as the drv_connected_last flag is still set because resume is initiated by host driver to get qmi stats via cnss_pci_resume_bus. So on power up the link does not come up as it tries for DRV resume instead of L2 resume. To fix this, during shutdown the link suspend should be L2 suspend, so add code to always do PCIe L2 suspend during shutdown. Change-Id: I748d2e243bf4491ec31bc42027514a73c3d945b4 Signed-off-by: Mohammed Siddiq --- drivers/net/wireless/cnss2/pci.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index 08635be66660..bfd199c16b87 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); From d87467913d7b7a7937d2c105ec15ddb1f0063e01 Mon Sep 17 00:00:00 2001 From: Mohammed Siddiq Date: Tue, 3 Aug 2021 18:12:20 +0530 Subject: [PATCH 07/39] cnss2: retry mhi fast suspend if mhi returns EBUSY Add code to retry mhi fast suspend if mhi layer has pending packets and returns EBUSY. Change-Id: Ifb9ee8371c092db3fd7bece2de1e7166ac6f303f Signed-off-by: Mohammed Siddiq --- drivers/net/wireless/cnss2/pci.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index 08635be66660..26903f646dec 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -1737,20 +1737,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; From 5eafefa5f1c8a476d4c54cd4ebccf1146d18cd3e Mon Sep 17 00:00:00 2001 From: Lynus Vaz Date: Thu, 10 Jun 2021 13:11:35 -0700 Subject: [PATCH 08/39] msm: kgsl: Keep the context alive until its fences signal The context is currently kept alive until all its fences are released. This means that we do not destroy a context until all the fence fds associated with it are closed by userspace, which may be a long time. Instead, remove the timeline's refcount on its context when it is detached. This permits the context to be freed once all its fences signal. Change-Id: Ifc5dd55980358ddbb4d3f6220d8b5d9f725aed1b Signed-off-by: Lynus Vaz Signed-off-by: Hareesh Gundu --- drivers/gpu/msm/kgsl.c | 6 ++-- drivers/gpu/msm/kgsl_sync.c | 64 +++++++++++++++++++++++++------------ drivers/gpu/msm/kgsl_sync.h | 9 +++--- 3 files changed, 51 insertions(+), 28 deletions(-) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index f68815f3cf1a..d203eb97dbd5 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -758,8 +758,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); } @@ -778,6 +777,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) { @@ -801,7 +802,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); 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) { } From e2936a7222160e6f6dd062b59eb06ceb99efaa25 Mon Sep 17 00:00:00 2001 From: Armaan Siddiqui Date: Tue, 25 May 2021 17:39:25 +0530 Subject: [PATCH 09/39] msm: ipa: Add vlan id field for ip collision Add vlan id field for ip collison struct to handle mdpn. Change-Id: Idf593a55781fdc727fb33924c29d1387b6489625 Signed-off-by: Armaan Siddiqui --- include/uapi/linux/msm_ipa.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/uapi/linux/msm_ipa.h b/include/uapi/linux/msm_ipa.h index d4dd11734ef0..9407de5a6fba 100644 --- a/include/uapi/linux/msm_ipa.h +++ b/include/uapi/linux/msm_ipa.h @@ -3206,6 +3206,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 +3222,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 { From 086639c2a4c25b9a02114e6f103a4b0cb8003ed8 Mon Sep 17 00:00:00 2001 From: Naina Mehta Date: Mon, 9 Aug 2021 18:23:44 +0530 Subject: [PATCH 10/39] soc: qcom: Dump stack in case of SSR failure for wpss Dump stack in case of SSR failure when ignore_ssr_failure flag is enabled for wpss on Yupik platform. Change-Id: I98fd294b12fe7bd9b52deb15edb8d83a5113acd8 Signed-off-by: Naina Mehta --- drivers/soc/qcom/msm_subsystem_restart.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/soc/qcom/msm_subsystem_restart.c b/drivers/soc/qcom/msm_subsystem_restart.c index 922f0e3c74fc..69ab25363295 100644 --- a/drivers/soc/qcom/msm_subsystem_restart.c +++ b/drivers/soc/qcom/msm_subsystem_restart.c @@ -686,14 +686,16 @@ static int subsystem_powerup(struct subsys_device *dev, void *data) notify_each_subsys_device(&dev, 1, SUBSYS_POWERUP_FAILURE, NULL); if (system_state == SYSTEM_RESTART - || system_state == SYSTEM_POWER_OFF) + || system_state == SYSTEM_POWER_OFF) { WARN(1, "SSR aborted: %s, system reboot/shutdown is under way\n", name); - else if (!dev->desc->ignore_ssr_failure) + } else if (!dev->desc->ignore_ssr_failure) { panic("[%s:%d]: Powerup error: %s!", current->comm, current->pid, name); - else - pr_err("Powerup failure on %s\n", name); + } else { + pr_err("Powerup failure on %s(rc:%d)\n", name, ret); + dump_stack(); + } return ret; } From eda3f6aaa7253c67d46d54639cf35a0c96cb5c5e Mon Sep 17 00:00:00 2001 From: Prateek Raj Singh Date: Wed, 26 May 2021 12:01:07 +0530 Subject: [PATCH 11/39] FM: Fix for no sound issue in FM Audio Updated mutex_lock during tune/seek operation Change-Id: I699f0a208ea7f9009226ebff962a5ef38f197d73 Signed-off-by: Prateek Raj Singh --- .../radio/rtc6226/radio-rtc6226-common.c | 92 +++++++++++++------ .../media/radio/rtc6226/radio-rtc6226-i2c.c | 16 +++- 2 files changed, 74 insertions(+), 34 deletions(-) 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; } From 26f3eb1a492da8eda34c0363352578c0b41abb8a Mon Sep 17 00:00:00 2001 From: Naman Padhiar Date: Fri, 6 Aug 2021 22:29:02 +0530 Subject: [PATCH 12/39] icnss2: Add proper debug logs Add proper debug logs to print return value of subsytem_get. Change-Id: I5e210e7b32fe35ecf9688a84776385ba6e382df8 Signed-off-by: Naman Padhiar --- drivers/soc/qcom/icnss2/main.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/soc/qcom/icnss2/main.c b/drivers/soc/qcom/icnss2/main.c index 9e75f1244d08..e753ac12e0f4 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) From f5266ee4d4f7afac4caf44ef6397895060c45de0 Mon Sep 17 00:00:00 2001 From: Kamal Agrawal Date: Sat, 24 Jul 2021 15:49:10 +0530 Subject: [PATCH 13/39] msm: kgsl: Fail import if secure buffer is not accessible to CP_PIXEL It is possible that userspace can request import for secure dma buffer that is not accessible to CP_PIXEL. There is no need to import such buffers in KGSL. Go through the list of VMIDs for secure dma buffer and fail import if it is not accessible to CP_PIXEL. Change-Id: I7584ad00a964c9c40ac4c0c9b1c83a21c03c48fd Signed-off-by: Kamal Agrawal --- drivers/gpu/msm/kgsl.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index d718dc53d162..565ddfca6d6e 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 @@ -3008,6 +3009,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; From f056b8a329528d4ddcbf881bb788dcdedbda7a0a Mon Sep 17 00:00:00 2001 From: Naina Mehta Date: Mon, 26 Jul 2021 16:34:55 +0530 Subject: [PATCH 14/39] arm64: Add TLB conflict fault handler Add TLB conflict fault handler and try to handle gracefully. Check whether TLB fault can be handled by EL2 and cause panic if EL2 is not able to handle. Change-Id: I276ec5413411932bd8a67ed4c85ebbf66f4affcf Signed-off-by: Runmin Wang Signed-off-by: Prasad Sodagudi Signed-off-by: Naina Mehta --- arch/arm64/Kconfig | 8 ++++++++ arch/arm64/mm/fault.c | 17 +++++++++++++++++ drivers/firmware/qcom_scm-smc.c | 21 +++++++++++++++++++++ drivers/firmware/qcom_scm.c | 8 ++++++++ drivers/firmware/qcom_scm.h | 3 +++ include/linux/qcom_scm.h | 6 ++++++ 6 files changed, 63 insertions(+) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index af24982911d8..ef5685c9ba51 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -1793,6 +1793,14 @@ config BUILD_ARM64_DT_OVERLAY required flags to add DT overlay in the compilation. +config TLB_CONF_HANDLER + bool "enable handler for TLB conflict" + help + This option enables graceful handling of TLB + conflict in EL2. Say yes here to enable TLB + conflict handler. + If unsure, Say n. + config SYSVIPC_COMPAT def_bool y depends on COMPAT && SYSVIPC diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 52905e09899c..d76f4c24e16a 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -24,6 +24,10 @@ #include #include +#ifdef CONFIG_TLB_CONF_HANDLER +#include +#endif + #include #include #include @@ -691,6 +695,15 @@ static int do_sea(unsigned long addr, unsigned int esr, struct pt_regs *regs) return 0; } +#ifdef CONFIG_TLB_CONF_HANDLER +static int do_tlb_conf_fault(unsigned long addr, unsigned int esr, struct pt_regs *regs) +{ + if (qcom_scm_tlb_conf_handler(addr)) + return 1; + return 0; +} +#endif + static const struct fault_info fault_info[] = { { do_bad, SIGKILL, SI_KERNEL, "ttbr address size fault" }, { do_bad, SIGKILL, SI_KERNEL, "level 1 address size fault" }, @@ -740,7 +753,11 @@ static const struct fault_info fault_info[] = { { do_bad, SIGKILL, SI_KERNEL, "unknown 45" }, { do_bad, SIGKILL, SI_KERNEL, "unknown 46" }, { do_bad, SIGKILL, SI_KERNEL, "unknown 47" }, +#ifdef CONFIG_TLB_CONF_HANDLER + { do_tlb_conf_fault, SIGKILL, SI_KERNEL, "TLB conflict abort" }, +#else { do_bad, SIGKILL, SI_KERNEL, "TLB conflict abort" }, +#endif { do_bad, SIGKILL, SI_KERNEL, "Unsupported atomic hardware update fault" }, { do_bad, SIGKILL, SI_KERNEL, "unknown 50" }, { do_bad, SIGKILL, SI_KERNEL, "unknown 51" }, diff --git a/drivers/firmware/qcom_scm-smc.c b/drivers/firmware/qcom_scm-smc.c index a731a5f504f0..66af8140ef2d 100644 --- a/drivers/firmware/qcom_scm-smc.c +++ b/drivers/firmware/qcom_scm-smc.c @@ -1020,6 +1020,27 @@ int __qcom_scm_sec_wdog_trigger(struct device *dev) return ret ? : desc.res[0]; } +#ifdef CONFIG_TLB_CONF_HANDLER +int __qcom_scm_tlb_conf_handler(struct device *dev, unsigned long addr) +{ + int ret; + +#define SCM_TLB_CONFLICT_CMD 0x1F + struct qcom_scm_desc desc = { + .svc = QCOM_SCM_SVC_MP, + .cmd = SCM_TLB_CONFLICT_CMD, + .owner = ARM_SMCCC_OWNER_SIP, + }; + + desc.args[0] = addr; + desc.arginfo = QCOM_SCM_ARGS(1); + + ret = qcom_scm_call_atomic(dev, &desc); + + return ret ? : desc.res[0]; +} +#endif + void __qcom_scm_disable_sdi(struct device *dev) { int ret; diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index 276b5861061e..04120e4a2caa 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -160,6 +160,14 @@ int qcom_scm_sec_wdog_trigger(void) } EXPORT_SYMBOL(qcom_scm_sec_wdog_trigger); +#ifdef CONFIG_TLB_CONF_HANDLER +int qcom_scm_tlb_conf_handler(unsigned long addr) +{ + return __qcom_scm_tlb_conf_handler(__scm->dev, addr); +} +EXPORT_SYMBOL(qcom_scm_tlb_conf_handler); +#endif + /** * qcom_scm_disable_sdi() - Disable SDI */ diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h index df6449d05c47..445790592780 100644 --- a/drivers/firmware/qcom_scm.h +++ b/drivers/firmware/qcom_scm.h @@ -28,6 +28,9 @@ extern void __qcom_scm_cpu_power_down(struct device *dev, u32 flags); extern void __qcom_scm_cpu_hp(struct device *dev, u32 flags); extern int __qcom_scm_sec_wdog_deactivate(struct device *dev); extern int __qcom_scm_sec_wdog_trigger(struct device *dev); +#ifdef CONFIG_TLB_CONF_HANDLER +extern int __qcom_scm_tlb_conf_handler(struct device *dev, unsigned long addr); +#endif extern void __qcom_scm_disable_sdi(struct device *dev); extern int __qcom_scm_set_remote_state(struct device *dev, u32 state, u32 id); extern int __qcom_scm_spin_cpu(struct device *dev); diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h index d924c8f818df..f4d883f158fd 100644 --- a/include/linux/qcom_scm.h +++ b/include/linux/qcom_scm.h @@ -86,6 +86,9 @@ extern void qcom_scm_cpu_power_down(u32 flags); extern void qcom_scm_cpu_hp(u32 flags); extern int qcom_scm_sec_wdog_deactivate(void); extern int qcom_scm_sec_wdog_trigger(void); +#ifdef CONFIG_TLB_CONF_HANDLER +extern int qcom_scm_tlb_conf_handler(unsigned long addr); +#endif extern void qcom_scm_disable_sdi(void); extern int qcom_scm_set_remote_state(u32 state, u32 id); extern int qcom_scm_spin_cpu(void); @@ -231,6 +234,9 @@ static inline void qcom_scm_cpu_power_down(u32 flags) {} static inline void qcom_scm_cpu_hp(u32 flags) {} static inline int qcom_scm_sec_wdog_deactivate(void) { return -ENODEV; } static inline int qcom_scm_sec_wdog_trigger(void) { return -ENODEV; } +#ifdef CONFIG_TLB_CONF_HANDLER +static inline int qcom_scm_tlb_conf_handler(unsigned long addr) { return -ENODEV; } +#endif static inline void qcom_scm_disable_sdi(void) {} static inline u32 qcom_scm_set_remote_state(u32 state, u32 id) { return -ENODEV; } From c57a71bf5aa990df0136f6a4af3992c1ed53a8c5 Mon Sep 17 00:00:00 2001 From: Naina Mehta Date: Wed, 28 Jul 2021 15:00:03 +0530 Subject: [PATCH 15/39] defconfig: msm: enable tlb_conflict_handler for lahaina Enable TLB conflict handling for QGKI image of lahaina. Change-Id: I55f2ef3f98676b64d3a3b05f6a1ef694dbf384fc Signed-off-by: Naina Mehta --- arch/arm64/configs/vendor/lahaina_QGKI.config | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/configs/vendor/lahaina_QGKI.config b/arch/arm64/configs/vendor/lahaina_QGKI.config index 2e3527d98074..41b8f149a000 100644 --- a/arch/arm64/configs/vendor/lahaina_QGKI.config +++ b/arch/arm64/configs/vendor/lahaina_QGKI.config @@ -267,3 +267,4 @@ CONFIG_HID_AKSYS_QRD=m CONFIG_AKSYS_QRD_FF=y CONFIG_PCIEAER=y CONFIG_PCIEASPM_POWER_SUPERSAVE=y +CONFIG_TLB_CONF_HANDLER=y From 5fcf71be7e2ef8b080b848616c01dc350793b7b8 Mon Sep 17 00:00:00 2001 From: Naina Mehta Date: Wed, 4 Aug 2021 16:12:53 +0530 Subject: [PATCH 16/39] defconfig: msm: enable tlb_conflict_handler for holi Enable TLB conflict handling for QGKI image of holi. Change-Id: Idbb5476c2495add61c3c659494c60f368a2e3e42 Signed-off-by: Naina Mehta --- arch/arm64/configs/vendor/holi_QGKI.config | 1 + 1 file changed, 1 insertion(+) 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 From 0a3f1ec4e9466a5dcc1d2557b8e5d31898f9ea93 Mon Sep 17 00:00:00 2001 From: Pankaj Gupta Date: Wed, 11 Aug 2021 20:30:20 +0530 Subject: [PATCH 17/39] msm: kgsl: Add CX_MISC registers in a6xx gpu snapshot Add CX_MISC registers in a6xx gpu snapshot dump. Change-Id: I03e12db450327d26f976c8d45296eecb08b7e040 Signed-off-by: Pankaj Gupta --- drivers/gpu/msm/adreno_a6xx_snapshot.c | 58 ++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 4 deletions(-) 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); From 7c5394f2c8e35277bf55e1055d17a36a9ccf5b0e Mon Sep 17 00:00:00 2001 From: Naman Padhiar Date: Thu, 5 Aug 2021 17:36:39 +0530 Subject: [PATCH 18/39] icnss2: Send WLAN_EN delay value in Host Cap For low temperature (< -25 degrees) WLAN FW need to keep delay between WLAN EN low and HIGH. Read WLAN_EN delay set by "wlan_en_delay" sysfs file and send it through Host Cap request. Increase MODE_ON and TARGET_CAP QMI request timeout to WLAN_EN delay value to accommodate delay kept in FW for WCN6750. Change-Id: Ic52cc94183984200f4cc3d893756bf7abeddad6d Signed-off-by: Naman Padhiar --- .../cnss_utils/wlan_firmware_service_v01.c | 80 +++++++ .../cnss_utils/wlan_firmware_service_v01.h | 213 +++++++++--------- drivers/soc/qcom/icnss2/main.c | 23 ++ drivers/soc/qcom/icnss2/main.h | 1 + drivers/soc/qcom/icnss2/qmi.c | 15 +- 5 files changed, 228 insertions(+), 104 deletions(-) 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/soc/qcom/icnss2/main.c b/drivers/soc/qcom/icnss2/main.c index 9e75f1244d08..fe065d2333b2 100644 --- a/drivers/soc/qcom/icnss2/main.c +++ b/drivers/soc/qcom/icnss2/main.c @@ -3390,11 +3390,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 +3424,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) { From 1faebd285975dc75757185dd2d0e19ef4d6de629 Mon Sep 17 00:00:00 2001 From: Sarthak Garg Date: Wed, 11 Aug 2021 10:29:43 +0530 Subject: [PATCH 19/39] mmc: sdhci-msm: Restore CMDQ_VENDOR_SPECIFIC_CFG register correctly Restoring CMDQ_SEND_STATUS_TRIGGER field after XO or hardware reset can lead to CMD13 being send as soon as CQE is turned on which can lead to below unnecessary warnings followed by register dumps. [ 82.554113] mmc: sdhci_cmd_irq: Got command interrupt 0x00000001 even though no command operation was in progress. Unset that bit before restoring CMDQ_VENDOR_SPECIFIC_CFG register. Change-Id: Id5961ecdd68b0d7cbc1c48c116f9e862a1dfc573 Signed-off-by: Sarthak Garg --- drivers/mmc/host/sdhci-msm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index 6debdfb83630..45599cd587c2 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -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) || From b62866e6226902f60eceee3bfe4465615e50bfeb Mon Sep 17 00:00:00 2001 From: Siddartha Mohanadoss Date: Tue, 11 May 2021 10:13:33 -0700 Subject: [PATCH 20/39] pci: msm: Fix out of bound error with find_next_bit() Existing api msm_pcie_write_reg_field() calls find_next_bit() and results in a KASAN out of bounds error for taking in the first parameter by typecasting as unsigned long type. To avoid the KASAN error use __ffs() instead. Change-Id: I9e155248e1233bbcb04ac5e2d1d6d512b3fa5387 Signed-off-by: Siddartha Mohanadoss --- drivers/pci/controller/pci-msm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 */ From 2ae69d5f1afe5b9c67e86b61f13d1623b5304efe Mon Sep 17 00:00:00 2001 From: Swetha Chikkaboraiah Date: Tue, 27 Jul 2021 11:33:00 +0530 Subject: [PATCH 21/39] drivers: qcom: pil: Call pil_clear_segment when S2 mapping is done The function pil_clear_segment should be called only when S2 mapping is success. So update clear_fw_region accordingly. Change-Id: Ie5bcf5b322ce347b08a575d18b7de3226027af91 Signed-off-by: Swetha Chikkaboraiah --- drivers/soc/qcom/peripheral-loader.c | 5 +++++ 1 file changed, 5 insertions(+) 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; } From f8f5577cc92a7127fb1f95a0060c2b1c9e9bb672 Mon Sep 17 00:00:00 2001 From: Kamal Agrawal Date: Thu, 5 Aug 2021 10:44:30 +0530 Subject: [PATCH 22/39] msm: kgsl: Remove unused 'mapped' variable "mapped" variable inside kgsl_mem_entry structure is not used anymore. Remove this variable from kgsl_mem_entry structure. Change-Id: I3ced1ae140e8ce91fdc4eac3276d3f5283823fd6 Signed-off-by: Kamal Agrawal --- drivers/gpu/msm/kgsl.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/drivers/gpu/msm/kgsl.h b/drivers/gpu/msm/kgsl.h index bb5ee365117d..9967667d9c48 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 From 5e9c28825a59d45316dfb06c74edf58b4374f164 Mon Sep 17 00:00:00 2001 From: Hui Liu Date: Mon, 21 Jun 2021 11:03:27 +0800 Subject: [PATCH 23/39] arm64: defconfig: Enable AW2016 LED driver for Holi Enalbe AW2016 LED driver for Holi platform. Change-Id: I07fd45f8d80bed09ead2b5c83c0fdb9c65d1d9c2 Signed-off-by: Hui Liu --- arch/arm64/configs/vendor/holi_GKI.config | 1 + 1 file changed, 1 insertion(+) 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 From 9cdc56a4ee55e1cbd8bac8c743f80ce60fb569a0 Mon Sep 17 00:00:00 2001 From: Priyansh Jain Date: Fri, 13 Aug 2021 10:33:56 +0530 Subject: [PATCH 24/39] drivers: thermal: tsens: updating tsens WD bark threshold to 100 Updating tsens WatchDog Bark count threshold to 100. Change-Id: Ic3a7945e56057ba0a8e1d809dcd1f703035fce90 Signed-off-by: Priyansh Jain --- drivers/thermal/tsens2xxx.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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); From 8bc528d65462ff616814719edd89135bd49f3711 Mon Sep 17 00:00:00 2001 From: Swetha Chikkaboraiah Date: Thu, 12 Aug 2021 14:31:02 +0530 Subject: [PATCH 25/39] pinctrl: qcom: Update lahaina_groups for gpio6 As per the latest ipcat gpio6 func2 should be mapped to qup6. Changes are done to support the same. Change-Id: I57bf30916a8b51eececdeefe21ac3729bc20d903 Signed-off-by: Swetha Chikkaboraiah --- drivers/pinctrl/qcom/pinctrl-lahaina.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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), From 72f3ff60b328bf1fa1ffa3625c4f2abeac1f1faa Mon Sep 17 00:00:00 2001 From: Pooja Kumari Date: Thu, 15 Jul 2021 12:35:05 +0530 Subject: [PATCH 26/39] msm: ipa3: add eth ep_pair info Add ep details corresponding to RMNET_CV2X tethering over eth. Change-Id: I0285887470c950a73e61dd51bf673bbc650d40bb Signed-off-by: Pooja Kumari --- include/uapi/linux/msm_ipa.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/msm_ipa.h b/include/uapi/linux/msm_ipa.h index 9407de5a6fba..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 { From 41004b86e313c7e10b98ecf82cd6d2fac4402863 Mon Sep 17 00:00:00 2001 From: Kiran Gunda Date: Wed, 28 Jul 2021 19:37:57 +0530 Subject: [PATCH 27/39] input: qcom-hv-haptics: update FIFO real time fill status mask FIFO_REAL_TIME_FILL_STATUS_MASK is different for haptics HW version V3. Update it. Change-Id: Ida8326d89678af34ae2c3a35164ae1a7ad5f6b7b Signed-off-by: Kiran Gunda --- drivers/input/misc/qcom-hv-haptics.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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); } From 3c8f39d488af50c80cc21b88d5f874e38c29e460 Mon Sep 17 00:00:00 2001 From: Jagadeesh Kona Date: Thu, 18 Mar 2021 14:41:43 +0530 Subject: [PATCH 28/39] clk: qcom: gcc-shima: Use floor ops for SDCC clocks To avoid overclocking issues observed on few parts, use floor ops for SDCC clocks. Change-Id: I0bdb6dd540a4885f0c39f25ed97b17035e31f510 Signed-off-by: Jagadeesh Kona --- drivers/clk/qcom/gcc-shima.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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, From da935c6b6361aaf0d6160381d2fce6f13338e6b6 Mon Sep 17 00:00:00 2001 From: Lingutla Chandrasekhar Date: Tue, 12 Jan 2021 16:54:11 +0530 Subject: [PATCH 29/39] sched: Improve the scheduler This change is for general scheduler improvements. Change-Id: Ib0ed25f0b83a6a7bbc0f600ef2a9351d578bffb5 Signed-off-by: Lingutla Chandrasekhar --- include/linux/sched/sysctl.h | 1 + kernel/sched/walt/walt.c | 68 ++++++++++++++++++++++++++++-------- kernel/sysctl.c | 9 +++++ 3 files changed, 63 insertions(+), 15 deletions(-) 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/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, From 0b8376adfad89c083c666b85a2e125ac7d6473cc Mon Sep 17 00:00:00 2001 From: Priyansh Jain Date: Fri, 13 Aug 2021 10:48:16 +0530 Subject: [PATCH 30/39] drivers: thermal: tsens: Optimize logs in tsens crash path Logs loop count is reduced from 5 to 1 as 5 time looping of same register set is not required. Change-Id: Iba5b4b39c2cebb19298250925ea01992ddcd5e77 Signed-off-by: Priyansh Jain --- drivers/thermal/tsens-dbg.c | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) 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; From ae0559f702e6888be493ce0a403f052f53079435 Mon Sep 17 00:00:00 2001 From: Will Huang Date: Thu, 29 Jul 2021 18:19:29 +0800 Subject: [PATCH 31/39] cnss2: Move cnss_dms_init after cnss power on To handle install cnss2 as module, need set dms server state after bus init. Change-Id: Ie6ac374193057190a69cb8e98da1771657b00f2d Signed-off-by: Will Huang --- drivers/net/wireless/cnss2/main.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) 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); From f30aac1b7cbb9032b687eaa0a18a76a514906803 Mon Sep 17 00:00:00 2001 From: Chandana Kishori Chiluveru Date: Mon, 2 Aug 2021 08:59:29 +0530 Subject: [PATCH 32/39] serial: msm_geni_serial: Reduce stale delay added in stop_rx_sequencer Currently driver calculating stale delay based on baud rate during stop_rx sequencer. When BT started with lower baud rate like 2400 this logic will add around 130msecs of extra delay during BT INIT. This change will remove logic for stale delay calculation based on baud rate and add constant delay of 10msec to wait for stale interrupt during stop_rx_sequencer. Change-Id: I566d79145ba887de71482642655b63c5bd640fc8 Signed-off-by: Chandana Kishori Chiluveru --- drivers/tty/serial/msm_geni_serial.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) 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); From be06049ea6a0ac86defe498f308399e7381823ef Mon Sep 17 00:00:00 2001 From: Saurabh Ambulkar Date: Wed, 28 Jul 2021 19:57:55 +0530 Subject: [PATCH 33/39] coresight: Add Null check before accessing pointer buf Add NULL check to avoid potential NULL pointer dereference for "buf" pointer. Change-Id: I80b29fdacfd8a95a895a32f30b99eb00b3fc2f55 Signed-off-by: Saurabh Ambulkar --- drivers/hwtracing/coresight/coresight-tmc-etf.c | 3 +++ 1 file changed, 3 insertions(+) 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; From 88ea0a4426d54ce7a261ea9175f628e54049b17c Mon Sep 17 00:00:00 2001 From: Mike Tipton Date: Fri, 25 Jun 2021 05:55:36 -0700 Subject: [PATCH 34/39] clk: qcom: Round parent rate in clk_rcg2_determine_rate We currently set best_parent_rate to the ideal frequency wanted by the RCG. This doesn't always align to the exact frequency the parent can provide. If they differ, then clk_calc_new_rates() will return the parent as top, even if the rounded parent frequency isn't changing. This causes clk_propagate_rate_change() to return before being called for its children, which means children aren't notified of the PRE_RATE_CHANGE events. Set best_parent_rate to the rounded rate so that we don't unnecessarily try to change the parent. Change-Id: Ic976db7a13dfbc63cb66b032a45060565ca90b43 Signed-off-by: Mike Tipton --- drivers/clk/qcom/clk-rcg2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) { From 5766228b5b82c7f65d4b4f468882fa948e695da6 Mon Sep 17 00:00:00 2001 From: vgattupa Date: Thu, 5 Aug 2021 13:05:28 +0530 Subject: [PATCH 35/39] msm: ADSPRPC: Fix to avoid Use after free in create_dynamic_process Allow single thread to execute fastrpc_init_create_dynamic_process to avoid UAF scenario. Change-Id: Id4ba1a406ace04d46482cd8b14c9d9ef5c96c4a1 Acked-by: Nishant Chaubey Signed-off-by: vgattupa --- drivers/char/adsprpc.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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; From 0b1bc8a213194d9e6d8b253acc5d6b0c56765fa6 Mon Sep 17 00:00:00 2001 From: Pankaj Gupta Date: Tue, 10 Aug 2021 19:25:27 +0530 Subject: [PATCH 36/39] msm: kgsl: Use worker to put refcount on mem entry If refcount on mem entry is the last refcount, we will call kgsl_mem_entry_destroy and detach it from process list. If there is no refcount on the process private as well then we will call kgsl_destroy_process_private to 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 deadlock. To fix this problem, use a worker to put the refcount on mem entry. Change-Id: I69a77c4059489c95de2ca205701571daac4bdc8a Signed-off-by: Pankaj Gupta --- drivers/gpu/msm/kgsl.c | 10 ++++++++-- drivers/gpu/msm/kgsl.h | 7 +++++++ drivers/gpu/msm/kgsl_sharedmem.c | 21 +++++++++++++-------- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 565ddfca6d6e..ba8ef281962d 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -248,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); @@ -2336,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; } diff --git a/drivers/gpu/msm/kgsl.h b/drivers/gpu/msm/kgsl.h index bb5ee365117d..6b19e7d52032 100644 --- a/drivers/gpu/msm/kgsl.h +++ b/drivers/gpu/msm/kgsl.h @@ -566,6 +566,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); From 8c994bbe150023a5fdf7620850ff51330c5f6026 Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Thu, 19 Aug 2021 11:50:14 -0700 Subject: [PATCH 37/39] soc: qcom: secure_buffer: Fix types and accessors when working with __le64 When the kernel is compiled with the sparse static analysis tool enabled, the following warnings are emitted: drivers/soc/qcom//trace_secure_buffer.h:53:1: warning: incorrect type in assignment (different base types) drivers/soc/qcom//trace_secure_buffer.h:53:1: warning: incorrect type in assignment (different base types) drivers/soc/qcom//trace_secure_buffer.h:53:1: warning: invalid assignment: += Fix this by converting the type of the addrs variable from phys_addr_t to u64, since the value we read into it is of type__le64 will always be 64 bits, while phys_addr_t may not be. Also, use the correct accessors when accessing variables of type __le64. Change-Id: Ia7e2394f2dc501dbf80f9035e0177555449dcfd8 Signed-off-by: Isaac J. Manjarres --- drivers/soc/qcom/trace_secure_buffer.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) 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)) ) From 4af8529d8d32fc0c2d5571e947d3907b422db423 Mon Sep 17 00:00:00 2001 From: Sarthak Garg Date: Wed, 18 Aug 2021 12:55:55 +0530 Subject: [PATCH 38/39] mmc: sdhci-msm: Update pr_err condition in DLL init path eMMC device operating at 1.8 V can be run up to 100 MHz without SDCDC (DLL) and with DLL above 100 MHz. Change the existing pr_err condition to less than 100MHz. Change-Id: Ia6575ddfd0e4dc57723226e3dff24ad485a1a2ea Signed-off-by: Sarthak Garg --- drivers/mmc/host/sdhci-msm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index 45599cd587c2..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); From 5e6bbb64ec55076bc1ca3d682e522cc2fec5caaf Mon Sep 17 00:00:00 2001 From: Mao Jinlong Date: Thu, 12 Aug 2021 17:30:22 +0800 Subject: [PATCH 39/39] coresight-tmc-etr: Use vmalloc once kcalloc fail Sometimes system doesn't have enough continuous pages for kcalloc. If kcalloc fail, use vmalloc instead. Change-Id: Ie0864224f4eeedbd01b301f59b4eb307cc1f8df2 Signed-off-by: Mao Jinlong --- .../hwtracing/coresight/coresight-tmc-etr.c | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) 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++) {