From 81d55bc3b9463829331b280a42aca13fe076c7b6 Mon Sep 17 00:00:00 2001 From: Taylor Nelms Date: Tue, 20 Feb 2024 20:00:39 +0000 Subject: [PATCH 001/111] ANDROID: Update the ABI symbol list Adding the following symbols: - drm_mode_sort - of_get_drm_panel_display_mode 1 function symbol(s) added 'int of_get_drm_panel_display_mode(struct device_node*, struct drm_display_mode*, u32*)' Bug: 197774385 Change-Id: I146bca3e0474e44aaecd5711027c5387ccb00f1e Signed-off-by: Taylor Nelms --- android/abi_gki_aarch64.stg | 17 +++++++++++++++++ android/abi_gki_aarch64_pixel | 2 ++ 2 files changed, 19 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 9d57cc044674..ef0081842939 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -306645,6 +306645,13 @@ function { parameter_id: 0x35480f68 parameter_id: 0x3ac2a209 } +function { + id: 0x9039ecdf + return_type_id: 0x6720d32f + parameter_id: 0x347303b4 + parameter_id: 0x2afee447 + parameter_id: 0x38d23361 +} function { id: 0x903a6e2b return_type_id: 0x6720d32f @@ -376192,6 +376199,15 @@ elf_symbol { type_id: 0x9038705c full_name: "of_get_drm_display_mode" } +elf_symbol { + id: 0xcb1195f1 + name: "of_get_drm_panel_display_mode" + is_defined: true + symbol_type: FUNCTION + crc: 0x2dd32eb1 + type_id: 0x9039ecdf + full_name: "of_get_drm_panel_display_mode" +} elf_symbol { id: 0xe3de7018 name: "of_get_i2c_adapter_by_node" @@ -406556,6 +406572,7 @@ interface { symbol_id: 0xe36e392a symbol_id: 0x824695bc symbol_id: 0x05a46d27 + symbol_id: 0xcb1195f1 symbol_id: 0xe3de7018 symbol_id: 0x26fb2401 symbol_id: 0xec79392b diff --git a/android/abi_gki_aarch64_pixel b/android/abi_gki_aarch64_pixel index 289eec270fc5..855ffc8c3d2c 100644 --- a/android/abi_gki_aarch64_pixel +++ b/android/abi_gki_aarch64_pixel @@ -785,6 +785,7 @@ drm_modeset_lock_all_ctx drm_modeset_lock_single_interruptible drm_modeset_unlock + drm_mode_sort drm_mode_vrefresh drm_object_attach_property drm_object_property_set_value @@ -1493,6 +1494,7 @@ of_genpd_add_provider_simple of_get_child_by_name of_get_cpu_node + of_get_drm_panel_display_mode of_get_named_gpio_flags of_get_next_available_child of_get_next_child From eef88095dcfbadcfa0fbfeeed505c3b3cfe2a40f Mon Sep 17 00:00:00 2001 From: Konstantin Vyshetsky Date: Mon, 3 Oct 2022 15:07:14 -0700 Subject: [PATCH 002/111] ANDROID: scsi: ufs: add complete init vendor hook Currently the core UFS driver does not have a vops to notify when the device is operational. This commit introduces a hook, which serves to notify device completing initialization and is ready to accept I/O. This is required by the FIPS140-2 [1] self integrity test of inline encryption engine, which must run whenever the host controller is reset. The code requires sleeping while waiting for I/O to complete and allocating some memory dynamically, which requires the vendor hook to be restricted. [1] https://csrc.nist.gov/publications/detail/fips/140/2/final Bug: 185809932 Signed-off-by: Konstantin Vyshetsky (cherry picked from commit e774e4eca69ce8ab60df04b27f524b586ab74f17) (cherry picked from https://android-review.googlesource.com/q/commit:c0f24579002c3fb0e404f223f8574c7f4fdac200) Merged-In: I6f476f9c2e2b50574d2898c3f1ef6b648d92df24 Change-Id: I6f476f9c2e2b50574d2898c3f1ef6b648d92df24 --- drivers/android/vendor_hooks.c | 1 + drivers/ufs/core/ufshcd.c | 2 ++ include/trace/hooks/ufshcd.h | 4 ++++ 3 files changed, 7 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index a3ee24e3ce6a..20b3b02b7db4 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -136,6 +136,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ftrace_format_check); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ftrace_dump_buffer); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_fill_prdt); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_ufs_reprogram_all_keys); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_ufs_complete_init); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_prepare_command); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_update_sysfs); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_send_command); diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index 0d0fdbdbbdc4..dfac1da43c03 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -8882,6 +8882,8 @@ static int ufshcd_probe_hba(struct ufs_hba *hba, bool init_dev_params) ufshcd_auto_hibern8_enable(hba); ufshpb_toggle_state(hba, HPB_RESET, HPB_PRESENT); + + trace_android_rvh_ufs_complete_init(hba); out: spin_lock_irqsave(hba->host->host_lock, flags); if (ret) diff --git a/include/trace/hooks/ufshcd.h b/include/trace/hooks/ufshcd.h index 97d59f6cb028..b7c691858346 100644 --- a/include/trace/hooks/ufshcd.h +++ b/include/trace/hooks/ufshcd.h @@ -23,6 +23,10 @@ DECLARE_RESTRICTED_HOOK(android_rvh_ufs_reprogram_all_keys, TP_PROTO(struct ufs_hba *hba, int *err), TP_ARGS(hba, err), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_ufs_complete_init, + TP_PROTO(struct ufs_hba *hba), + TP_ARGS(hba), 1); + DECLARE_HOOK(android_vh_ufs_prepare_command, TP_PROTO(struct ufs_hba *hba, struct request *rq, struct ufshcd_lrb *lrbp, int *err), From a7f647f49dafc277a3fcdfb9519874670254fdf9 Mon Sep 17 00:00:00 2001 From: Will McVicker Date: Tue, 20 Feb 2024 16:46:55 -0800 Subject: [PATCH 003/111] ANDROID: Update the Pixel symbol list and GKI ABI 1 function symbol(s) added 'int __traceiter_android_rvh_ufs_complete_init(void*, struct ufs_hba*)' 1 variable symbol(s) added 'struct tracepoint __tracepoint_android_rvh_ufs_complete_init' Bug: 269652215 Change-Id: I2ed5dbcded52eab567e89aa4dec8750662074c76 Signed-off-by: Will McVicker --- android/abi_gki_aarch64.stg | 20 ++++++++++++++++++++ android/abi_gki_aarch64_pixel | 5 +++++ 2 files changed, 25 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index ef0081842939..7db81450a6c3 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -338066,6 +338066,15 @@ elf_symbol { type_id: 0x9bca85c1 full_name: "__traceiter_android_rvh_uclamp_eff_get" } +elf_symbol { + id: 0xee223c7f + name: "__traceiter_android_rvh_ufs_complete_init" + is_defined: true + symbol_type: FUNCTION + crc: 0x347db806 + type_id: 0x9bb1b638 + full_name: "__traceiter_android_rvh_ufs_complete_init" +} elf_symbol { id: 0x00e6d4cc name: "__traceiter_android_rvh_ufs_reprogram_all_keys" @@ -342152,6 +342161,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_rvh_uclamp_eff_get" } +elf_symbol { + id: 0x2a287d11 + name: "__tracepoint_android_rvh_ufs_complete_init" + is_defined: true + symbol_type: OBJECT + crc: 0x149dd525 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_rvh_ufs_complete_init" +} elf_symbol { id: 0xcfcbaf3e name: "__tracepoint_android_rvh_ufs_reprogram_all_keys" @@ -402336,6 +402354,7 @@ interface { symbol_id: 0x23097c08 symbol_id: 0xe3ee70ae symbol_id: 0xcce6f612 + symbol_id: 0xee223c7f symbol_id: 0x00e6d4cc symbol_id: 0xa63eb82a symbol_id: 0xcd824552 @@ -402790,6 +402809,7 @@ interface { symbol_id: 0xafe46ece symbol_id: 0xe445d254 symbol_id: 0x64e2c288 + symbol_id: 0x2a287d11 symbol_id: 0xcfcbaf3e symbol_id: 0xc3add2dc symbol_id: 0xdc2af26c diff --git a/android/abi_gki_aarch64_pixel b/android/abi_gki_aarch64_pixel index 855ffc8c3d2c..48e1ab631a32 100644 --- a/android/abi_gki_aarch64_pixel +++ b/android/abi_gki_aarch64_pixel @@ -693,6 +693,7 @@ drm_bridge_remove drm_compat_ioctl drm_connector_attach_encoder + drm_connector_attach_max_bpc_property drm_connector_cleanup drm_connector_init drm_connector_list_iter_begin @@ -2327,6 +2328,7 @@ __traceiter_android_rvh_set_user_nice_locked __traceiter_android_rvh_typec_tcpci_get_vbus __traceiter_android_rvh_uclamp_eff_get + __traceiter_android_rvh_ufs_complete_init __traceiter_android_rvh_ufs_reprogram_all_keys __traceiter_android_rvh_update_blocked_fair __traceiter_android_rvh_update_load_avg @@ -2377,6 +2379,7 @@ __traceiter_android_vh_use_amu_fie __traceiter_clock_set_rate __traceiter_cpu_frequency + __traceiter_cpu_idle __traceiter_device_pm_callback_end __traceiter_device_pm_callback_start __traceiter_dwc3_readl @@ -2442,6 +2445,7 @@ __tracepoint_android_rvh_set_user_nice_locked __tracepoint_android_rvh_typec_tcpci_get_vbus __tracepoint_android_rvh_uclamp_eff_get + __tracepoint_android_rvh_ufs_complete_init __tracepoint_android_rvh_ufs_reprogram_all_keys __tracepoint_android_rvh_update_blocked_fair __tracepoint_android_rvh_update_load_avg @@ -2492,6 +2496,7 @@ __tracepoint_android_vh_use_amu_fie __tracepoint_clock_set_rate __tracepoint_cpu_frequency + __tracepoint_cpu_idle __tracepoint_device_pm_callback_end __tracepoint_device_pm_callback_start __tracepoint_dwc3_readl From d6b58cc171f4d03b10ddc3c5acb32e6f15cc239c Mon Sep 17 00:00:00 2001 From: Sajid Dalvi Date: Tue, 20 Feb 2024 13:20:17 -0600 Subject: [PATCH 004/111] ANDROID: PCI: dwc: Wait for the link only if it has been started In dw_pcie_host_init() regardless of whether the link has been started or not, the code waits for the link to come up. Even in cases where start_link() is not defined the code ends up spinning in a loop for 1 second. Since in some systems dw_pcie_host_init() gets called during probe, this one second loop for each pcie interface instance ends up extending the boot time. Wait for the link up in only if the start_link() is defined. The patch submitted to the upstream kernel (see link below) was not accepted due to no upstream user. The change here is a simplified version of that patch, which will wait for a link only if start_link ops has been defined. Bug: 315052790 Link: https://lore.kernel.org/all/20240112093006.2832105-1-ajayagarwal@google.com/ Change-Id: I4e8d00f6195062728417e41ddd51072880676920 Signed-off-by: Sajid Dalvi --- drivers/pci/controller/dwc/pcie-designware-host.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c index 6241d3f4e9d5..759a14389dd9 100644 --- a/drivers/pci/controller/dwc/pcie-designware-host.c +++ b/drivers/pci/controller/dwc/pcie-designware-host.c @@ -483,10 +483,12 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp) ret = dw_pcie_start_link(pci); if (ret) goto err_free_msi; - } - /* Ignore errors, the link may come up later */ - dw_pcie_wait_for_link(pci); + if (pci->ops && pci->ops->start_link) { + /* Ignore errors, the link may come up later */ + dw_pcie_wait_for_link(pci); + } + } bridge->sysdata = pp; From 9be763fb64891faae235f69861934032b5b55a05 Mon Sep 17 00:00:00 2001 From: Chris Goldsworthy Date: Mon, 5 Feb 2024 20:55:12 -0800 Subject: [PATCH 005/111] ANDROID: arm64: Call fixup_exception() within do_sea() path_lookupat() is capable of safely reading unampped VAs. If an unmapped VA is read whilst the function is being called, the resulting page fault will get re-directed to __do_page_fault(), which will call fixup_exception() to handle the aforementioned unmapped VA read. Now, for an OS running in a VM, let's say that memory was still mapped at S1 but lent to another VM (i.e. unmapped at S2 for the given VM). The reading of an unmapped VA in path_lookupat() still needs to be handled. For hypervisors that inject an abort leading to a do_sea() call, call fixup_exception() from do_sea() if trace_android_vh_try_fixup_sea() indicates that we can do so. Bug: 320358381 Change-Id: I0aedcd954f08e3011b27524f9a7b038debbb246d Signed-off-by: Chris Goldsworthy --- arch/arm64/mm/fault.c | 5 +++++ drivers/android/vendor_hooks.c | 1 + include/trace/hooks/fault.h | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 7d522b037d9a..2f63b2a86c63 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -746,6 +746,11 @@ static int do_sea(unsigned long far, unsigned long esr, struct pt_regs *regs) { const struct fault_info *inf; unsigned long siaddr; + bool can_fixup = false; + + trace_android_vh_try_fixup_sea(far, esr, regs, &can_fixup); + if (can_fixup && fixup_exception(regs)) + return 0; inf = esr_to_fault_info(esr); diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 20b3b02b7db4..19f96411720a 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -244,6 +244,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_try_to_freeze_todo_unfrozen); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_die_kernel_fault); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_sea); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_sp_pc_abort); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_try_fixup_sea); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_undefinstr); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_el1_bti); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_el1_fpac); diff --git a/include/trace/hooks/fault.h b/include/trace/hooks/fault.h index d3e26ea66160..121a3404806e 100644 --- a/include/trace/hooks/fault.h +++ b/include/trace/hooks/fault.h @@ -21,6 +21,11 @@ DECLARE_RESTRICTED_HOOK(android_rvh_do_sp_pc_abort, TP_ARGS(addr, esr, regs), TP_CONDITION(!user_mode(regs))); +DECLARE_HOOK(android_vh_try_fixup_sea, + TP_PROTO(unsigned long addr, unsigned long esr, struct pt_regs *regs, + bool *can_fixup), + TP_ARGS(addr, esr, regs, can_fixup)); + #endif /* _TRACE_HOOK_FAULT_H */ /* This part must be outside protection */ #include From 8c0f9174731da74dc3dbcf5bb7e3b048183a0ecf Mon Sep 17 00:00:00 2001 From: Chris Goldsworthy Date: Mon, 12 Feb 2024 09:32:55 -0800 Subject: [PATCH 006/111] ANDROID: abi_gki_aarch64_qcom: Export trace_android_vh_try_fixup_sea Add the underlying symbols for trace_android_vh_try_fixup_sea. Bug: 320358381 Change-Id: I0fa34513d1cd503159abfef0eb6fe50284f21316 Signed-off-by: Chris Goldsworthy --- android/abi_gki_aarch64.stg | 29 +++++++++++++++++++++++++++++ android/abi_gki_aarch64_qcom | 2 ++ 2 files changed, 31 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 7db81450a6c3..779a8c5f4d43 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -319941,6 +319941,15 @@ function { parameter_id: 0x019e2530 parameter_id: 0x11cfee5a } +function { + id: 0x9b6eb253 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x33756485 + parameter_id: 0x33756485 + parameter_id: 0x01222f7d + parameter_id: 0x11cfee5a +} function { id: 0x9b6eb2a8 return_type_id: 0x6720d32f @@ -340217,6 +340226,15 @@ elf_symbol { type_id: 0x9ba47dcc full_name: "__traceiter_android_vh_timerfd_create" } +elf_symbol { + id: 0xeac5f4dd + name: "__traceiter_android_vh_try_fixup_sea" + is_defined: true + symbol_type: FUNCTION + crc: 0x595525b6 + type_id: 0x9b6eb253 + full_name: "__traceiter_android_vh_try_fixup_sea" +} elf_symbol { id: 0x2bc25325 name: "__traceiter_android_vh_try_to_freeze_todo" @@ -344312,6 +344330,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_timerfd_create" } +elf_symbol { + id: 0x0896a337 + name: "__tracepoint_android_vh_try_fixup_sea" + is_defined: true + symbol_type: OBJECT + crc: 0x834ac862 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_try_fixup_sea" +} elf_symbol { id: 0xd9d2bcff name: "__tracepoint_android_vh_try_to_freeze_todo" @@ -402593,6 +402620,7 @@ interface { symbol_id: 0xeecc1529 symbol_id: 0xfeff2e7f symbol_id: 0x641d703d + symbol_id: 0xeac5f4dd symbol_id: 0x2bc25325 symbol_id: 0x0119fc41 symbol_id: 0xd9f43028 @@ -403048,6 +403076,7 @@ interface { symbol_id: 0xfa3284c7 symbol_id: 0x69721329 symbol_id: 0x2df766e3 + symbol_id: 0x0896a337 symbol_id: 0xd9d2bcff symbol_id: 0x09ba106b symbol_id: 0xf9580976 diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom index 0b1de549cbd6..3bbde23655fc 100644 --- a/android/abi_gki_aarch64_qcom +++ b/android/abi_gki_aarch64_qcom @@ -3439,6 +3439,7 @@ __traceiter_android_vh_show_suspend_epoch_val __traceiter_android_vh_skip_swap_map_write __traceiter_android_vh_timer_calc_index + __traceiter_android_vh_try_fixup_sea __traceiter_android_vh_ufs_check_int_errors __traceiter_android_vh_ufs_compl_command __traceiter_android_vh_ufs_send_command @@ -3587,6 +3588,7 @@ __tracepoint_android_vh_show_suspend_epoch_val __tracepoint_android_vh_skip_swap_map_write __tracepoint_android_vh_timer_calc_index + __tracepoint_android_vh_try_fixup_sea __tracepoint_android_vh_ufs_check_int_errors __tracepoint_android_vh_ufs_compl_command __tracepoint_android_vh_ufs_send_command From c622e98ddc8e91dd56f2d12018e3280e48afc77e Mon Sep 17 00:00:00 2001 From: Dylan Chang Date: Wed, 21 Feb 2024 16:31:36 +0800 Subject: [PATCH 007/111] ANDROID: ABI: Update symbol list for Nothing Update symbol list for Nothing 39 function symbol(s) added 'int __bh_read(struct buffer_head*, blk_opf_t, bool)' 'int __fs_parse(struct p_log*, const struct fs_parameter_spec*, struct fs_parameter*, struct fs_parse_result*)' 'ssize_t __generic_file_write_iter(struct kiocb*, struct iov_iter*)' 'int bh_uptodate_or_lock(struct buffer_head*)' 'int block_truncate_page(struct address_space*, loff_t, get_block_t*)' 'int block_write_begin(struct address_space*, loff_t, unsigned int, struct page**, get_block_t*)' 'int block_write_end(struct file*, struct address_space*, loff_t, unsigned int, unsigned int, struct page*, void*)' 'int block_write_full_page(struct page*, get_block_t*, struct writeback_control*)' 'void clear_nlink(struct inode*)' 'struct dentry* d_find_alias(struct inode*)' 'void discard_new_inode(struct inode*)' 'int fs_param_is_string(struct p_log*, const struct fs_parameter_spec*, struct fs_parameter*, struct fs_parse_result*)' 'int fs_param_is_u32(struct p_log*, const struct fs_parameter_spec*, struct fs_parameter*, struct fs_parse_result*)' 'sector_t generic_block_bmap(struct address_space*, sector_t, get_block_t*)' 'struct dentry* generic_fh_to_dentry(struct super_block*, struct fid*, int, int, struct inode*(*)(struct super_block*, u64, u32))' 'struct dentry* generic_fh_to_parent(struct super_block*, struct fid*, int, int, struct inode*(*)(struct super_block*, u64, u32))' 'int generic_file_fsync(struct file*, loff_t, loff_t, int)' 'int generic_permission(struct user_namespace*, struct inode*, int)' 'int generic_write_end(struct file*, struct address_space*, loff_t, unsigned int, unsigned int, struct page*, void*)' 'int generic_writepages(struct address_space*, struct writeback_control*)' 'int get_tree_bdev(struct fs_context*, int(*)(struct super_block*, struct fs_context*))' 'void iget_failed(struct inode*)' 'struct inode* ilookup(struct super_block*, unsigned long)' 'loff_t inode_get_bytes(struct inode*)' 'int inode_needs_sync(struct inode*)' 'void inode_nohighmem(struct inode*)' 'void inode_set_bytes(struct inode*, loff_t)' 'struct backing_dev_info* inode_to_bdi(struct inode*)' 'int insert_inode_locked(struct inode*)' 'void invalidate_inode_buffers(struct inode*)' 'size_t iov_iter_zero(size_t, struct iov_iter*)' 'void kfree_link(void*)' 'int mpage_writepages(struct address_space*, struct writeback_control*, get_block_t*)' 'int posix_acl_chmod(struct user_namespace*, struct inode*, umode_t)' 'void set_bh_page(struct buffer_head*, struct page*, unsigned long)' 'void setattr_copy(struct user_namespace*, struct inode*, const struct iattr*)' 'int sync_blockdev_nowait(struct block_device*)' 'int sync_mapping_buffers(struct address_space*)' 'int utf8_to_utf32(const u8*, int, unicode_t*)' 1 variable symbol(s) added 'int overflowgid' Bug: 326180449 Change-Id: Ibb533a3f1691080251d9fd61cf27d569b28b0e7c Signed-off-by: Dylan Chang --- android/abi_gki_aarch64.stg | 535 ++++++++++++++++++++++++++++++++ android/abi_gki_aarch64_nothing | 217 ++++++++++++- 2 files changed, 751 insertions(+), 1 deletion(-) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 779a8c5f4d43..f5e96dec26b0 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -2583,6 +2583,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0x0faae5b1 } +pointer_reference { + id: 0x097ccb85 + kind: POINTER + pointee_type_id: 0x0fb3c889 +} pointer_reference { id: 0x0980a662 kind: POINTER @@ -6453,6 +6458,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0x10aa5f7a } +pointer_reference { + id: 0x0ebb27d9 + kind: POINTER + pointee_type_id: 0x10ac79f9 +} pointer_reference { id: 0x0ebb9ddd kind: POINTER @@ -28708,6 +28718,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0xddef3f0e } +pointer_reference { + id: 0x3ded1653 + kind: POINTER + pointee_type_id: 0xddf4bfd3 +} pointer_reference { id: 0x3deeb8f4 kind: POINTER @@ -31713,6 +31728,11 @@ typedef { name: "umode_t" referred_type_id: 0xc93e017b } +typedef { + id: 0x0fb3c889 + name: "unicode_t" + referred_type_id: 0xc9082b19 +} typedef { id: 0x04e70a8b name: "upf_t" @@ -33503,6 +33523,11 @@ qualified { qualifier: CONST qualified_type_id: 0x0710d451 } +qualified { + id: 0xddf4bfd3 + qualifier: CONST + qualified_type_id: 0x079549c7 +} qualified { id: 0xddfa054d qualifier: CONST @@ -289755,6 +289780,13 @@ function { parameter_id: 0x1d19a9d5 parameter_id: 0x3e10b518 } +function { + id: 0x10ac79f9 + return_type_id: 0x1b8590a8 + parameter_id: 0x26ee682a + parameter_id: 0x92233392 + parameter_id: 0xc9082b19 +} function { id: 0x10ae91e8 return_type_id: 0x48b5725f @@ -290956,6 +290988,12 @@ function { parameter_id: 0x0917901f parameter_id: 0x3176a085 } +function { + id: 0x121b62af + return_type_id: 0x1b8590a8 + parameter_id: 0x26ee682a + parameter_id: 0x33756485 +} function { id: 0x121bfaa4 return_type_id: 0xd5cc9c9a @@ -291642,6 +291680,13 @@ function { parameter_id: 0x39d1288c parameter_id: 0x1253769c } +function { + id: 0x1313d75a + return_type_id: 0x48b5725f + parameter_id: 0x0fabaf3b + parameter_id: 0x1b8590a8 + parameter_id: 0x3ded1653 +} function { id: 0x13184981 return_type_id: 0x48b5725f @@ -294242,6 +294287,13 @@ function { parameter_id: 0x6720d32f parameter_id: 0x33756485 } +function { + id: 0x16d378ee + return_type_id: 0x48b5725f + parameter_id: 0x1977e57b + parameter_id: 0x06835e9c + parameter_id: 0x33756485 +} function { id: 0x16d5560c return_type_id: 0x48b5725f @@ -300944,6 +300996,11 @@ function { return_type_id: 0x04537b8c parameter_id: 0x1fa7df7c } +function { + id: 0x2d380780 + return_type_id: 0x27a7c613 + parameter_id: 0x1b8590a8 +} function { id: 0x2d456d1f return_type_id: 0x37cc86e2 @@ -302592,6 +302649,11 @@ function { return_type_id: 0x290604c6 parameter_id: 0x0258f96e } +function { + id: 0x4e098341 + return_type_id: 0x28f4ee78 + parameter_id: 0x1b8590a8 +} function { id: 0x4e221f3c return_type_id: 0x2560a232 @@ -305843,6 +305905,15 @@ function { parameter_id: 0x6720d32f parameter_id: 0x6720d32f } +function { + id: 0x85d5478d + return_type_id: 0x120540d1 + parameter_id: 0x26ee682a + parameter_id: 0x01de69b6 + parameter_id: 0x6720d32f + parameter_id: 0x6720d32f + parameter_id: 0x0ebb27d9 +} function { id: 0x85da991d return_type_id: 0x6720d32f @@ -311539,6 +311610,13 @@ function { return_type_id: 0x6720d32f parameter_id: 0x396fe4f8 } +function { + id: 0x93de5e2a + return_type_id: 0x6720d32f + parameter_id: 0x3f0185ef + parameter_id: 0x6720d32f + parameter_id: 0x097ccb85 +} function { id: 0x93de93a5 return_type_id: 0x6720d32f @@ -315120,6 +315198,13 @@ function { parameter_id: 0x33756485 parameter_id: 0xf1a6dfed } +function { + id: 0x986b6304 + return_type_id: 0x6720d32f + parameter_id: 0x1582ab06 + parameter_id: 0x20007040 + parameter_id: 0x2cacacc0 +} function { id: 0x986ccce1 return_type_id: 0x6720d32f @@ -315135,6 +315220,15 @@ function { parameter_id: 0x6720d32f parameter_id: 0x2ec35650 } +function { + id: 0x986f9047 + return_type_id: 0x6720d32f + parameter_id: 0x1582ab06 + parameter_id: 0x27a7c613 + parameter_id: 0x4585663f + parameter_id: 0x0b30ee00 + parameter_id: 0x2cacacc0 +} function { id: 0x987085c9 return_type_id: 0x6720d32f @@ -315193,6 +315287,13 @@ function { parameter_id: 0x33756485 parameter_id: 0x0d7d7298 } +function { + id: 0x9875fddd + return_type_id: 0x6720d32f + parameter_id: 0x1582ab06 + parameter_id: 0x27a7c613 + parameter_id: 0x2cacacc0 +} function { id: 0x98773f07 return_type_id: 0x6720d32f @@ -317302,6 +317403,13 @@ function { parameter_id: 0x6720d32f parameter_id: 0x6720d32f } +function { + id: 0x9a2bd436 + return_type_id: 0x6720d32f + parameter_id: 0x1977e57b + parameter_id: 0x7b64642a + parameter_id: 0x6d7f5ff6 +} function { id: 0x9a2d8ab0 return_type_id: 0x6720d32f @@ -323413,6 +323521,13 @@ function { parameter_id: 0x0b27dc43 parameter_id: 0x34c92288 } +function { + id: 0x9c9a8627 + return_type_id: 0x6720d32f + parameter_id: 0x06835e9c + parameter_id: 0x2cacacc0 + parameter_id: 0x20007040 +} function { id: 0x9c9b15ff return_type_id: 0x6720d32f @@ -326065,6 +326180,13 @@ function { parameter_id: 0x120540d1 parameter_id: 0x3e10b518 } +function { + id: 0x9e008a7e + return_type_id: 0x6720d32f + parameter_id: 0x0fabaf3b + parameter_id: 0x1b8590a8 + parameter_id: 0x1253769c +} function { id: 0x9e00cde1 return_type_id: 0x6720d32f @@ -329254,6 +329376,12 @@ function { parameter_id: 0x4585663f parameter_id: 0xf1a6dfed } +function { + id: 0xaa8f5c2d + return_type_id: 0xf435685e + parameter_id: 0xf435685e + parameter_id: 0x2f73da3b +} function { id: 0xaa967f61 return_type_id: 0x2584a3b9 @@ -329526,6 +329654,13 @@ function { return_type_id: 0x0258f96e parameter_id: 0x0f78474f } +function { + id: 0xaf2275d4 + return_type_id: 0xd0b3a203 + parameter_id: 0x1582ab06 + parameter_id: 0xd0b3a203 + parameter_id: 0x2cacacc0 +} function { id: 0xaf295eff return_type_id: 0xd0b3a203 @@ -333889,6 +334024,15 @@ elf_symbol { type_id: 0x16c5a8cd full_name: "__bforget" } +elf_symbol { + id: 0xc0096e0c + name: "__bh_read" + is_defined: true + symbol_type: FUNCTION + crc: 0xb440c759 + type_id: 0x9a2bd436 + full_name: "__bh_read" +} elf_symbol { id: 0x2c42b675 name: "__bh_read_batch" @@ -335104,6 +335248,15 @@ elf_symbol { type_id: 0x102e93ac full_name: "__free_pages" } +elf_symbol { + id: 0x07f88ce8 + name: "__fs_parse" + is_defined: true + symbol_type: FUNCTION + crc: 0xb4cc2128 + type_id: 0x96b04c18 + full_name: "__fs_parse" +} elf_symbol { id: 0xe458ae39 name: "__fsnotify_parent" @@ -335113,6 +335266,15 @@ elf_symbol { type_id: 0x9a96d2a1 full_name: "__fsnotify_parent" } +elf_symbol { + id: 0x6a52666b + name: "__generic_file_write_iter" + is_defined: true + symbol_type: FUNCTION + crc: 0xe813121d + type_id: 0x16637235 + full_name: "__generic_file_write_iter" +} elf_symbol { id: 0x129eb7ed name: "__genphy_config_aneg" @@ -347001,6 +347163,15 @@ elf_symbol { type_id: 0x9bbcaaf0 full_name: "bgpio_init" } +elf_symbol { + id: 0x7f80f1f5 + name: "bh_uptodate_or_lock" + is_defined: true + symbol_type: FUNCTION + crc: 0xc38a02a6 + type_id: 0x9bdd1a71 + full_name: "bh_uptodate_or_lock" +} elf_symbol { id: 0x977cc973 name: "bin2hex" @@ -348162,6 +348333,42 @@ elf_symbol { type_id: 0xf515b7e4 full_name: "block_is_partially_uptodate" } +elf_symbol { + id: 0xbb1860f8 + name: "block_truncate_page" + is_defined: true + symbol_type: FUNCTION + crc: 0xab5adbc8 + type_id: 0x9875fddd + full_name: "block_truncate_page" +} +elf_symbol { + id: 0x3fc3c51a + name: "block_write_begin" + is_defined: true + symbol_type: FUNCTION + crc: 0x8ba8c125 + type_id: 0x986f9047 + full_name: "block_write_begin" +} +elf_symbol { + id: 0xd4320681 + name: "block_write_end" + is_defined: true + symbol_type: FUNCTION + crc: 0xa2ce7f70 + type_id: 0x9be49da2 + full_name: "block_write_end" +} +elf_symbol { + id: 0xb5f82c17 + name: "block_write_full_page" + is_defined: true + symbol_type: FUNCTION + crc: 0x176115ed + type_id: 0x9c9a8627 + full_name: "block_write_full_page" +} elf_symbol { id: 0x427cedc9 name: "blockdev_superblock" @@ -349708,6 +349915,15 @@ elf_symbol { type_id: 0x167935b9 full_name: "clear_inode" } +elf_symbol { + id: 0x5d1ea9c6 + name: "clear_nlink" + is_defined: true + symbol_type: FUNCTION + crc: 0x0f677b7f + type_id: 0x167935b9 + full_name: "clear_nlink" +} elf_symbol { id: 0xb63845e5 name: "clear_page" @@ -352293,6 +352509,15 @@ elf_symbol { type_id: 0x8808e1d8 full_name: "d_alloc_name" } +elf_symbol { + id: 0x9534fec7 + name: "d_find_alias" + is_defined: true + symbol_type: FUNCTION + crc: 0x7b236d82 + type_id: 0x8a909712 + full_name: "d_find_alias" +} elf_symbol { id: 0x04f5a6e5 name: "d_instantiate" @@ -356037,6 +356262,15 @@ elf_symbol { type_id: 0x01f9081c full_name: "disable_percpu_irq" } +elf_symbol { + id: 0x1db2229b + name: "discard_new_inode" + is_defined: true + symbol_type: FUNCTION + crc: 0xe3b01eea + type_id: 0x167935b9 + full_name: "discard_new_inode" +} elf_symbol { id: 0xdd957eaf name: "disk_set_zoned" @@ -363203,6 +363437,24 @@ elf_symbol { type_id: 0x23f09c34 full_name: "fs_kobj" } +elf_symbol { + id: 0x6c9f28bc + name: "fs_param_is_string" + is_defined: true + symbol_type: FUNCTION + crc: 0x9f52fbcf + type_id: 0x96b04c18 + full_name: "fs_param_is_string" +} +elf_symbol { + id: 0x35a180e7 + name: "fs_param_is_u32" + is_defined: true + symbol_type: FUNCTION + crc: 0x7d762d5c + type_id: 0x96b04c18 + full_name: "fs_param_is_u32" +} elf_symbol { id: 0x196ad62a name: "fsg_common_create_luns" @@ -363671,6 +363923,15 @@ elf_symbol { type_id: 0x044f79a4 full_name: "gen_pool_virt_to_phys" } +elf_symbol { + id: 0x0c22ac35 + name: "generic_block_bmap" + is_defined: true + symbol_type: FUNCTION + crc: 0x50ae26e5 + type_id: 0xaf2275d4 + full_name: "generic_block_bmap" +} elf_symbol { id: 0x30828743 name: "generic_device_group" @@ -363689,6 +363950,24 @@ elf_symbol { type_id: 0x98fa4494 full_name: "generic_error_remove_page" } +elf_symbol { + id: 0xc99c6e1c + name: "generic_fh_to_dentry" + is_defined: true + symbol_type: FUNCTION + crc: 0x013538d9 + type_id: 0x85d5478d + full_name: "generic_fh_to_dentry" +} +elf_symbol { + id: 0xa4f95f30 + name: "generic_fh_to_parent" + is_defined: true + symbol_type: FUNCTION + crc: 0xa15340e0 + type_id: 0x85d5478d + full_name: "generic_fh_to_parent" +} elf_symbol { id: 0x338cfb0f name: "generic_file_direct_write" @@ -363698,6 +363977,15 @@ elf_symbol { type_id: 0x16637235 full_name: "generic_file_direct_write" } +elf_symbol { + id: 0x94ddcd90 + name: "generic_file_fsync" + is_defined: true + symbol_type: FUNCTION + crc: 0x23f85a3e + type_id: 0x9b2c93fd + full_name: "generic_file_fsync" +} elf_symbol { id: 0x94b60724 name: "generic_file_llseek" @@ -363797,6 +364085,15 @@ elf_symbol { type_id: 0x16637235 full_name: "generic_perform_write" } +elf_symbol { + id: 0x6bd69c06 + name: "generic_permission" + is_defined: true + symbol_type: FUNCTION + crc: 0xb8014ac0 + type_id: 0x9e1dd697 + full_name: "generic_permission" +} elf_symbol { id: 0x4c4073c3 name: "generic_read_dir" @@ -363824,6 +364121,24 @@ elf_symbol { type_id: 0x16637235 full_name: "generic_write_checks" } +elf_symbol { + id: 0xb45dfa4f + name: "generic_write_end" + is_defined: true + symbol_type: FUNCTION + crc: 0xe78f150c + type_id: 0x9be49da2 + full_name: "generic_write_end" +} +elf_symbol { + id: 0xb04b2d1f + name: "generic_writepages" + is_defined: true + symbol_type: FUNCTION + crc: 0xca8c06f8 + type_id: 0x9860482f + full_name: "generic_writepages" +} elf_symbol { id: 0x86da67c0 name: "geni_icc_disable" @@ -364466,6 +364781,15 @@ elf_symbol { type_id: 0xb913af05 full_name: "get_thermal_instance" } +elf_symbol { + id: 0x53f9f7b3 + name: "get_tree_bdev" + is_defined: true + symbol_type: FUNCTION + crc: 0x558a7f31 + type_id: 0x96e9d652 + full_name: "get_tree_bdev" +} elf_symbol { id: 0x90eb0a27 name: "get_tree_single" @@ -367337,6 +367661,15 @@ elf_symbol { type_id: 0x1210c1fa full_name: "iget5_locked" } +elf_symbol { + id: 0x3477c5c1 + name: "iget_failed" + is_defined: true + symbol_type: FUNCTION + crc: 0x6945eeac + type_id: 0x167935b9 + full_name: "iget_failed" +} elf_symbol { id: 0x4a5f3d41 name: "ignore_console_lock_warning" @@ -367724,6 +368057,15 @@ elf_symbol { type_id: 0x92755a6c full_name: "iio_write_channel_raw" } +elf_symbol { + id: 0x0583cb0a + name: "ilookup" + is_defined: true + symbol_type: FUNCTION + crc: 0xca57d9e6 + type_id: 0x121b62af + full_name: "ilookup" +} elf_symbol { id: 0xf87ecda4 name: "ilookup5" @@ -368093,6 +368435,15 @@ elf_symbol { type_id: 0x167935b9 full_name: "inode_dio_wait" } +elf_symbol { + id: 0xf7ff5427 + name: "inode_get_bytes" + is_defined: true + symbol_type: FUNCTION + crc: 0x9e615bf4 + type_id: 0x2d380780 + full_name: "inode_get_bytes" +} elf_symbol { id: 0x318d9226 name: "inode_init_once" @@ -368120,6 +368471,15 @@ elf_symbol { type_id: 0xf9f0c251 full_name: "inode_maybe_inc_iversion" } +elf_symbol { + id: 0x68666cb6 + name: "inode_needs_sync" + is_defined: true + symbol_type: FUNCTION + crc: 0x9971f6d7 + type_id: 0x9b618705 + full_name: "inode_needs_sync" +} elf_symbol { id: 0xf4ae7c22 name: "inode_newsize_ok" @@ -368129,6 +368489,24 @@ elf_symbol { type_id: 0x936a3614 full_name: "inode_newsize_ok" } +elf_symbol { + id: 0x4ff0f410 + name: "inode_nohighmem" + is_defined: true + symbol_type: FUNCTION + crc: 0x5143bcfa + type_id: 0x167935b9 + full_name: "inode_nohighmem" +} +elf_symbol { + id: 0x1bb1212e + name: "inode_set_bytes" + is_defined: true + symbol_type: FUNCTION + crc: 0x79823e04 + type_id: 0x16e7aaa1 + full_name: "inode_set_bytes" +} elf_symbol { id: 0x2b7e86c2 name: "inode_set_flags" @@ -368138,6 +368516,15 @@ elf_symbol { type_id: 0x177e4178 full_name: "inode_set_flags" } +elf_symbol { + id: 0x471295fc + name: "inode_to_bdi" + is_defined: true + symbol_type: FUNCTION + crc: 0xcb7af47c + type_id: 0x4e098341 + full_name: "inode_to_bdi" +} elf_symbol { id: 0x18eeb52f name: "input_alloc_absinfo" @@ -368417,6 +368804,15 @@ elf_symbol { type_id: 0x16727d19 full_name: "input_unregister_handler" } +elf_symbol { + id: 0x6945c0ff + name: "insert_inode_locked" + is_defined: true + symbol_type: FUNCTION + crc: 0xa5de3d2c + type_id: 0x9b618705 + full_name: "insert_inode_locked" +} elf_symbol { id: 0x3c5daf32 name: "insert_resource" @@ -368507,6 +368903,15 @@ elf_symbol { type_id: 0x1393d7c4 full_name: "invalidate_bdev" } +elf_symbol { + id: 0xae43d3d4 + name: "invalidate_inode_buffers" + is_defined: true + symbol_type: FUNCTION + crc: 0x49da1da0 + type_id: 0x167935b9 + full_name: "invalidate_inode_buffers" +} elf_symbol { id: 0x38472bf4 name: "invalidate_inode_pages2_range" @@ -369038,6 +369443,15 @@ elf_symbol { type_id: 0x9a04e7d8 full_name: "iov_iter_single_seg_count" } +elf_symbol { + id: 0x38ac7923 + name: "iov_iter_zero" + is_defined: true + symbol_type: FUNCTION + crc: 0xf090fa8a + type_id: 0xaa8f5c2d + full_name: "iov_iter_zero" +} elf_symbol { id: 0x6c6beb07 name: "iova_domain_init_rcaches" @@ -370371,6 +370785,15 @@ elf_symbol { type_id: 0x1edf94e9 full_name: "kfree_const" } +elf_symbol { + id: 0x1e86386b + name: "kfree_link" + is_defined: true + symbol_type: FUNCTION + crc: 0xb8b043f2 + type_id: 0x16b708df + full_name: "kfree_link" +} elf_symbol { id: 0xdc88dfbc name: "kfree_sensitive" @@ -374102,6 +374525,15 @@ elf_symbol { type_id: 0x19fc4f29 full_name: "mpage_readahead" } +elf_symbol { + id: 0xeb5e01d3 + name: "mpage_writepages" + is_defined: true + symbol_type: FUNCTION + crc: 0x682c7c39 + type_id: 0x986b6304 + full_name: "mpage_writepages" +} elf_symbol { id: 0xbedab58b name: "msi_first_desc" @@ -377135,6 +377567,15 @@ elf_symbol { type_id: 0x9a3effce full_name: "out_of_line_wait_on_bit_timeout" } +elf_symbol { + id: 0x3d8c84e9 + name: "overflowgid" + is_defined: true + symbol_type: OBJECT + crc: 0x7171121c + type_id: 0x6720d32f + full_name: "overflowgid" +} elf_symbol { id: 0x28b33064 name: "overflowuid" @@ -380891,6 +381332,15 @@ elf_symbol { type_id: 0xf68b6f5e full_name: "poll_state_synchronize_srcu" } +elf_symbol { + id: 0x3e0dea4e + name: "posix_acl_chmod" + is_defined: true + symbol_type: FUNCTION + crc: 0x30ba6785 + type_id: 0x9e008a7e + full_name: "posix_acl_chmod" +} elf_symbol { id: 0x7bf7b7b1 name: "post_page_relinquish_tlb_inv" @@ -386768,6 +387218,15 @@ elf_symbol { type_id: 0x10256efa full_name: "serio_unregister_port" } +elf_symbol { + id: 0x334adb18 + name: "set_bh_page" + is_defined: true + symbol_type: FUNCTION + crc: 0x28c35bb4 + type_id: 0x16d378ee + full_name: "set_bh_page" +} elf_symbol { id: 0xdfe1cb53 name: "set_blocksize" @@ -386903,6 +387362,15 @@ elf_symbol { type_id: 0x142e0390 full_name: "set_user_nice" } +elf_symbol { + id: 0x8f1deac6 + name: "setattr_copy" + is_defined: true + symbol_type: FUNCTION + crc: 0x13ee29df + type_id: 0x1313d75a + full_name: "setattr_copy" +} elf_symbol { id: 0x7d05df74 name: "setattr_prepare" @@ -391326,6 +391794,15 @@ elf_symbol { type_id: 0x9e8b6578 full_name: "sync_blockdev" } +elf_symbol { + id: 0x8c7e628f + name: "sync_blockdev_nowait" + is_defined: true + symbol_type: FUNCTION + crc: 0x596f0115 + type_id: 0x9e8b6578 + full_name: "sync_blockdev_nowait" +} elf_symbol { id: 0x75fe69c4 name: "sync_dirty_buffer" @@ -391371,6 +391848,15 @@ elf_symbol { type_id: 0x9afd0449 full_name: "sync_inode_metadata" } +elf_symbol { + id: 0x3a16ef08 + name: "sync_mapping_buffers" + is_defined: true + symbol_type: FUNCTION + crc: 0xeb13305c + type_id: 0x98e049ee + full_name: "sync_mapping_buffers" +} elf_symbol { id: 0x3da4fd63 name: "synchronize_irq" @@ -397707,6 +398193,15 @@ elf_symbol { type_id: 0x45396185 full_name: "utf8_data_table" } +elf_symbol { + id: 0x4b0dcba7 + name: "utf8_to_utf32" + is_defined: true + symbol_type: FUNCTION + crc: 0x94bf03ca + type_id: 0x93de5e2a + full_name: "utf8_to_utf32" +} elf_symbol { id: 0xb0c1eaf9 name: "uuid_gen" @@ -401916,6 +402411,7 @@ interface { symbol_id: 0x1bc9d7cd symbol_id: 0xd97b055a symbol_id: 0xac51df48 + symbol_id: 0xc0096e0c symbol_id: 0x2c42b675 symbol_id: 0x8920b575 symbol_id: 0x149a28b5 @@ -402051,7 +402547,9 @@ interface { symbol_id: 0x47a334c4 symbol_id: 0xebf4b11f symbol_id: 0x5b1ea047 + symbol_id: 0x07f88ce8 symbol_id: 0xe458ae39 + symbol_id: 0x6a52666b symbol_id: 0x129eb7ed symbol_id: 0x63083569 symbol_id: 0x46f82598 @@ -403373,6 +403871,7 @@ interface { symbol_id: 0x6bb4e80d symbol_id: 0x979cde5c symbol_id: 0xcdba3a55 + symbol_id: 0x7f80f1f5 symbol_id: 0x977cc973 symbol_id: 0x49201db3 symbol_id: 0xacc709b0 @@ -403502,6 +404001,10 @@ interface { symbol_id: 0xd289c43d symbol_id: 0x6efa206d symbol_id: 0x5cf37146 + symbol_id: 0xbb1860f8 + symbol_id: 0x3fc3c51a + symbol_id: 0xd4320681 + symbol_id: 0xb5f82c17 symbol_id: 0x427cedc9 symbol_id: 0x11fbb9ce symbol_id: 0xd4a0f991 @@ -403674,6 +404177,7 @@ interface { symbol_id: 0xd156aa2c symbol_id: 0x00d9abe7 symbol_id: 0xfa95bdc1 + symbol_id: 0x5d1ea9c6 symbol_id: 0xb63845e5 symbol_id: 0x52eaa51b symbol_id: 0x5332f89b @@ -403962,6 +404466,7 @@ interface { symbol_id: 0x171eca8a symbol_id: 0x82537a82 symbol_id: 0x79187969 + symbol_id: 0x9534fec7 symbol_id: 0x04f5a6e5 symbol_id: 0x52864a7e symbol_id: 0x8d5ab7b4 @@ -404378,6 +404883,7 @@ interface { symbol_id: 0x573e2956 symbol_id: 0xe5bfa8c8 symbol_id: 0xd48a6769 + symbol_id: 0x1db2229b symbol_id: 0xdd957eaf symbol_id: 0x80814925 symbol_id: 0x9c5fb17e @@ -405172,6 +405678,8 @@ interface { symbol_id: 0x4c985dbf symbol_id: 0xec31d371 symbol_id: 0x9a2423a0 + symbol_id: 0x6c9f28bc + symbol_id: 0x35a180e7 symbol_id: 0x196ad62a symbol_id: 0x804c5038 symbol_id: 0x07715f1a @@ -405224,9 +405732,13 @@ interface { symbol_id: 0x62469fff symbol_id: 0xc5fee33e symbol_id: 0x7419d447 + symbol_id: 0x0c22ac35 symbol_id: 0x30828743 symbol_id: 0xe21d8d05 + symbol_id: 0xc99c6e1c + symbol_id: 0xa4f95f30 symbol_id: 0x338cfb0f + symbol_id: 0x94ddcd90 symbol_id: 0x94b60724 symbol_id: 0x6ac5d61b symbol_id: 0x54756210 @@ -405238,9 +405750,12 @@ interface { symbol_id: 0xd5bc36ee symbol_id: 0x95a840b8 symbol_id: 0x7f639ef1 + symbol_id: 0x6bd69c06 symbol_id: 0x4c4073c3 symbol_id: 0x798f83da symbol_id: 0x542785af + symbol_id: 0xb45dfa4f + symbol_id: 0xb04b2d1f symbol_id: 0x86da67c0 symbol_id: 0x27168bf7 symbol_id: 0x4e0faf2a @@ -405312,6 +405827,7 @@ interface { symbol_id: 0x02327717 symbol_id: 0x6d155c9e symbol_id: 0xc5f5aefd + symbol_id: 0x53f9f7b3 symbol_id: 0x90eb0a27 symbol_id: 0x511aa4c3 symbol_id: 0x18a5fee3 @@ -405631,6 +406147,7 @@ interface { symbol_id: 0xec107a09 symbol_id: 0x841218b7 symbol_id: 0xb9f64e9d + symbol_id: 0x3477c5c1 symbol_id: 0x4a5f3d41 symbol_id: 0x4292b79d symbol_id: 0xb779176d @@ -405674,6 +406191,7 @@ interface { symbol_id: 0xfb09b362 symbol_id: 0xdf3e8655 symbol_id: 0x6f2f4bd1 + symbol_id: 0x0583cb0a symbol_id: 0xf87ecda4 symbol_id: 0x00b4d2da symbol_id: 0xdf968210 @@ -405715,11 +406233,16 @@ interface { symbol_id: 0x215b5641 symbol_id: 0xbf6470f2 symbol_id: 0x7a805e08 + symbol_id: 0xf7ff5427 symbol_id: 0x318d9226 symbol_id: 0x4e9dfa3b symbol_id: 0x7c74ccbc + symbol_id: 0x68666cb6 symbol_id: 0xf4ae7c22 + symbol_id: 0x4ff0f410 + symbol_id: 0x1bb1212e symbol_id: 0x2b7e86c2 + symbol_id: 0x471295fc symbol_id: 0x18eeb52f symbol_id: 0xbc652525 symbol_id: 0x2336c16f @@ -405751,6 +406274,7 @@ interface { symbol_id: 0x6a48a444 symbol_id: 0xc73383c1 symbol_id: 0x0ee6aecf + symbol_id: 0x6945c0ff symbol_id: 0x3c5daf32 symbol_id: 0xcec28ada symbol_id: 0xbd83f7de @@ -405761,6 +406285,7 @@ interface { symbol_id: 0xfe94820e symbol_id: 0xe7fc8dce symbol_id: 0x22167fe7 + symbol_id: 0xae43d3d4 symbol_id: 0x38472bf4 symbol_id: 0xc3e2d4ae symbol_id: 0x6b8c216a @@ -405820,6 +406345,7 @@ interface { symbol_id: 0xffb394c4 symbol_id: 0x48a6183b symbol_id: 0x1c2c7614 + symbol_id: 0x38ac7923 symbol_id: 0x6c6beb07 symbol_id: 0x1be0f35f symbol_id: 0xd9fe9b1d @@ -405968,6 +406494,7 @@ interface { symbol_id: 0x6dbdf8e6 symbol_id: 0x6bb359de symbol_id: 0xe097a7bd + symbol_id: 0x1e86386b symbol_id: 0xdc88dfbc symbol_id: 0xe867c7e6 symbol_id: 0x6dc922be @@ -406383,6 +406910,7 @@ interface { symbol_id: 0x18e8ea11 symbol_id: 0x1405e8c0 symbol_id: 0x84babda3 + symbol_id: 0xeb5e01d3 symbol_id: 0xbedab58b symbol_id: 0x603dd7ca symbol_id: 0xc30a6d76 @@ -406720,6 +407248,7 @@ interface { symbol_id: 0x67bce5b1 symbol_id: 0x57ecab02 symbol_id: 0x27d0c7b6 + symbol_id: 0x3d8c84e9 symbol_id: 0x28b33064 symbol_id: 0x23a386a4 symbol_id: 0xdea2b008 @@ -407137,6 +407666,7 @@ interface { symbol_id: 0x3020cd17 symbol_id: 0x25c6452e symbol_id: 0x324d8228 + symbol_id: 0x3e0dea4e symbol_id: 0x7bf7b7b1 symbol_id: 0xd612789c symbol_id: 0x561323f1 @@ -407790,6 +408320,7 @@ interface { symbol_id: 0x9a2a9bda symbol_id: 0x54732419 symbol_id: 0x7df87144 + symbol_id: 0x334adb18 symbol_id: 0xdfe1cb53 symbol_id: 0x2c6a64fa symbol_id: 0x689737cf @@ -407805,6 +408336,7 @@ interface { symbol_id: 0x500f328c symbol_id: 0xe19d98a9 symbol_id: 0xdebcf3e9 + symbol_id: 0x8f1deac6 symbol_id: 0x7d05df74 symbol_id: 0x5d6d169f symbol_id: 0x023858a0 @@ -408297,11 +408829,13 @@ interface { symbol_id: 0x44e002a2 symbol_id: 0xd5e0987f symbol_id: 0x1fe11014 + symbol_id: 0x8c7e628f symbol_id: 0x75fe69c4 symbol_id: 0x2a267913 symbol_id: 0xf3c91dcd symbol_id: 0xfb2634da symbol_id: 0xe7caa0b7 + symbol_id: 0x3a16ef08 symbol_id: 0x3da4fd63 symbol_id: 0xc49e9f39 symbol_id: 0x89663420 @@ -409006,6 +409540,7 @@ interface { symbol_id: 0xb5437ef4 symbol_id: 0x1473720a symbol_id: 0xa459c02b + symbol_id: 0x4b0dcba7 symbol_id: 0xb0c1eaf9 symbol_id: 0xe7b3f166 symbol_id: 0xb21b47da diff --git a/android/abi_gki_aarch64_nothing b/android/abi_gki_aarch64_nothing index 5960f2b3c287..9058fe53da49 100644 --- a/android/abi_gki_aarch64_nothing +++ b/android/abi_gki_aarch64_nothing @@ -1,4 +1,219 @@ [abi_symbol_list] +# commonly used symbols + module_layout + __put_task_struct + +# required by ntfs3.ko + __alloc_pages + alt_cb_patch_nops + __arch_copy_from_user + __arch_copy_to_user + arm64_use_ng_mappings + balance_dirty_pages_ratelimited + bcmp + __bh_read + bh_uptodate_or_lock + bio_add_page + bio_alloc_bioset + bio_chain + bio_put + __bitmap_clear + __bitmap_set + __bitmap_weight + blkdev_issue_discard + blk_finish_plug + blk_start_plug + __blockdev_direct_IO + block_dirty_folio + block_invalidate_folio + block_truncate_page + block_write_begin + block_write_end + block_write_full_page + __bread_gfp + __brelse + call_rcu + capable + clean_bdev_aliases + clear_inode + clear_nlink + copy_page_from_iter_atomic + cpu_hwcaps + create_empty_buffers + current_time + current_umask + d_find_alias + d_instantiate + discard_new_inode + d_make_root + d_obtain_alias + down_read + down_write + down_write_trylock + dput + drop_nlink + d_splice_alias + end_buffer_read_sync + fault_in_iov_iter_readable + fiemap_fill_next_extent + fiemap_prep + filemap_fdatawait_range + filemap_fdatawrite + filemap_fdatawrite_range + filemap_write_and_wait_range + file_remove_privs + file_update_time + _find_next_bit + _find_next_zero_bit + flush_dcache_page + __folio_lock + __folio_put + fs_bio_set + fs_param_is_string + fs_param_is_u32 + __fs_parse + generic_block_bmap + generic_fh_to_dentry + generic_fh_to_parent + generic_file_fsync + generic_file_llseek + generic_file_mmap + generic_file_open + generic_file_read_iter + generic_file_splice_read + __generic_file_write_iter + generic_fillattr + generic_permission + generic_read_dir + generic_write_checks + generic_write_end + generic_writepages + __getblk_gfp + get_random_u32 + get_tree_bdev + gic_nonsecure_priorities + grab_cache_page_write_begin + hex_asc + iget5_locked + iget_failed + ihold + ilookup + inc_nlink + __init_rwsem + init_special_inode + inode_dio_wait + inode_get_bytes + inode_init_once + inode_init_owner + inode_needs_sync + inode_newsize_ok + inode_nohighmem + inode_set_bytes + inode_to_bdi + insert_inode_locked + invalidate_bdev + invalidate_inode_buffers + iov_iter_revert + iov_iter_zero + iput + is_bad_inode + iter_file_splice_write + kasan_flag_enabled + kfree + kfree_link + kill_block_super + __kmalloc + kmalloc_caches + kmalloc_trace + kmem_cache_alloc + kmem_cache_alloc_lru + kmem_cache_create + kmem_cache_destroy + kmem_cache_free + kmemdup + kvfree + kvmalloc_node + load_nls + load_nls_default + __lock_buffer + lockref_get + logfc + make_bad_inode + mark_buffer_dirty + __mark_inode_dirty + memcpy + memmove + memset + mpage_readahead + mpage_read_folio + mpage_writepages + __mutex_init + mutex_lock + mutex_trylock + mutex_unlock + names_cachep + new_inode + overflowgid + overflowuid + pagecache_get_page + page_pinner_inited + __page_pinner_put_page + posix_acl_chmod + preempt_schedule + _printk + ___ratelimit + _raw_spin_lock + _raw_spin_unlock + rb_erase + rb_first + rb_insert_color + rb_last + rb_next + rb_prev + rcu_barrier + read_cache_page + register_filesystem + sb_set_blocksize + seq_printf + seq_puts + setattr_copy + setattr_prepare + set_bh_page + set_nlink + set_page_dirty + snprintf + __stack_chk_fail + strcmp + strlen + submit_bh + submit_bio + submit_bio_wait + sync_blockdev + sync_blockdev_nowait + sync_dirty_buffer + sync_filesystem + sync_inode_metadata + sync_mapping_buffers + truncate_inode_pages_final + truncate_pagecache + truncate_setsize + unload_nls + unlock_buffer + unlock_new_inode + unlock_page + unregister_filesystem + up_read + up_write + utf16s_to_utf8s + utf8_to_utf32 + vfs_fsync_range + vmap + vm_zone_stat + vunmap + __wait_on_buffer + __warn_printk + write_inode_now + # required by mount_state.ko + get_fs_type iterate_supers_type - get_fs_type \ No newline at end of file From db23405211ed245c2c3fb077459e8d71f6b024c0 Mon Sep 17 00:00:00 2001 From: Peter Wang Date: Wed, 4 Oct 2023 14:24:54 +0800 Subject: [PATCH 008/111] UPSTREAM: scsi: ufs: core: Remove dev cmd clock scaling busy If a dev command times out, clk_scaling.active_reqs is not decreased which causes abnormal clock scaling. It is complicated to handle different dev command timeout cases in both legacy mode and MCQ mode. Besides, dev cmds are rarely used and the busy time is short. Remove clock scaling busy window for dev cmds like we do for UIC or TM cmds which don't update busy window either. Change-Id: I2f25dc5032126778ac99b6a79bd78f9578dd730c (cherry picked from commit e66413faa5b55800ad42a570aad674aed634c5e6) Signed-off-by: Peter Wang Link: https://lore.kernel.org/r/20231004062454.29165-1-peter.wang@mediatek.com Reviewed-by: Stanley Chu Signed-off-by: Martin K. Petersen --- drivers/ufs/core/ufshcd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index dfac1da43c03..f2eea7945f5b 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -2248,7 +2248,8 @@ void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag, lrbp->compl_time_stamp_local_clock = 0; trace_android_vh_ufs_send_command(hba, lrbp); ufshcd_add_command_trace(hba, task_tag, UFS_CMD_SEND); - ufshcd_clk_scaling_start_busy(hba); + if (lrbp->cmd) + ufshcd_clk_scaling_start_busy(hba); if (unlikely(ufshcd_should_inform_monitor(hba, lrbp))) ufshcd_start_monitor(hba, lrbp); @@ -5544,7 +5545,6 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag, } ufshcd_add_command_trace(hba, task_tag, UFS_DEV_COMP); complete(hba->dev_cmd.complete); - ufshcd_clk_scaling_update_busy(hba); } } } From 7114c782ec16452588952e26aa1a754040b3b51f Mon Sep 17 00:00:00 2001 From: Peter Wang Date: Mon, 6 Nov 2023 15:51:17 +0800 Subject: [PATCH 009/111] UPSTREAM: scsi: ufs: core: Fix racing issue between ufshcd_mcq_abort() and ISR If command timeout happens and cq complete IRQ is raised at the same time, ufshcd_mcq_abort clears lprb->cmd and a NULL pointer deref happens in the ISR. Error log: ufshcd_abort: Device abort task at tag 18 Unable to handle kernel NULL pointer dereference at virtual address 0000000000000108 pc : [0xffffffe27ef867ac] scsi_dma_unmap+0xc/0x44 lr : [0xffffffe27f1b898c] ufshcd_release_scsi_cmd+0x24/0x114 Fixes: f1304d442077 ("scsi: ufs: mcq: Added ufshcd_mcq_abort()") Cc: stable@vger.kernel.org Change-Id: I20d67f4bda2a83a7dc5c63e63b32232ff6401597 (cherry picked from commit 27900d7119c464b43cd9eac69c85884d17bae240) Signed-off-by: Peter Wang Link: https://lore.kernel.org/r/20231106075117.8995-1-peter.wang@mediatek.com Reviewed-by: Bart Van Assche Signed-off-by: Martin K. Petersen --- drivers/ufs/core/ufs-mcq.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c index a20cba43d217..7ed17949febe 100644 --- a/drivers/ufs/core/ufs-mcq.c +++ b/drivers/ufs/core/ufs-mcq.c @@ -645,6 +645,7 @@ int ufshcd_mcq_abort(struct scsi_cmnd *cmd) int tag = scsi_cmd_to_rq(cmd)->tag; struct ufshcd_lrb *lrbp = &hba->lrb[tag]; struct ufs_hw_queue *hwq; + unsigned long flags; int err = FAILED; if (!ufshcd_cmd_inflight(lrbp->cmd)) { @@ -685,8 +686,10 @@ int ufshcd_mcq_abort(struct scsi_cmnd *cmd) } err = SUCCESS; + spin_lock_irqsave(&hwq->cq_lock, flags); if (ufshcd_cmd_inflight(lrbp->cmd)) ufshcd_release_scsi_cmd(hba, lrbp); + spin_unlock_irqrestore(&hwq->cq_lock, flags); out: return err; From d68f68a9d732e0501ef84130606eb3ac6767249f Mon Sep 17 00:00:00 2001 From: Xiaojun Ji Date: Fri, 28 Jul 2023 11:21:50 +0800 Subject: [PATCH 010/111] ANDROID: GKI: add symbol list file for moto Leaf changes summary: 0 artifact changed Changed leaf types summary: 0 leaf type changed Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 0 Added function Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable Bug: 289423315 Bug: 326600530 Change-Id: I2f12145513148dced06d9d0ac3bf01dd92863662 Signed-off-by: Xiaojun Ji --- BUILD.bazel | 1 + android/abi_gki_aarch64_moto | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 android/abi_gki_aarch64_moto diff --git a/BUILD.bazel b/BUILD.bazel index c420fcb3b3e8..822e7fa689cd 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -109,6 +109,7 @@ filegroup( "android/abi_gki_aarch64_honor", "android/abi_gki_aarch64_imx", "android/abi_gki_aarch64_meizu", + "android/abi_gki_aarch64_moto", "android/abi_gki_aarch64_mtk", "android/abi_gki_aarch64_nothing", "android/abi_gki_aarch64_oplus", diff --git a/android/abi_gki_aarch64_moto b/android/abi_gki_aarch64_moto new file mode 100644 index 000000000000..009165749001 --- /dev/null +++ b/android/abi_gki_aarch64_moto @@ -0,0 +1,3 @@ +[abi_symbol_list] + __traceiter_android_vh_tune_mmap_readaround + __tracepoint_android_vh_tune_mmap_readaround From 1bb51799bf82a61093dfcb3c3e98e0666837883c Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Wed, 7 Feb 2024 18:49:51 +0100 Subject: [PATCH 011/111] UPSTREAM: netfilter: nft_set_rbtree: skip end interval element from gc commit 60c0c230c6f046da536d3df8b39a20b9a9fd6af0 upstream. rbtree lazy gc on insert might collect an end interval element that has been just added in this transactions, skip end interval elements that are not yet active. Bug: 325477234 Fixes: f718863aca46 ("netfilter: nft_set_rbtree: fix overlap expiration walk") Cc: stable@vger.kernel.org Reported-by: lonial con Signed-off-by: Pablo Neira Ayuso Signed-off-by: Greg Kroah-Hartman (cherry picked from commit 1296c110c5a0b45a8fcf58e7d18bc5da61a565cb) Signed-off-by: Lee Jones Change-Id: I42f7bca418d47948292b15ace9f371b81ccd7fe8 --- net/netfilter/nft_set_rbtree.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/net/netfilter/nft_set_rbtree.c b/net/netfilter/nft_set_rbtree.c index e34662f4a71e..5bf5572e945c 100644 --- a/net/netfilter/nft_set_rbtree.c +++ b/net/netfilter/nft_set_rbtree.c @@ -235,7 +235,7 @@ static void nft_rbtree_gc_remove(struct net *net, struct nft_set *set, static const struct nft_rbtree_elem * nft_rbtree_gc_elem(const struct nft_set *__set, struct nft_rbtree *priv, - struct nft_rbtree_elem *rbe, u8 genmask) + struct nft_rbtree_elem *rbe) { struct nft_set *set = (struct nft_set *)__set; struct rb_node *prev = rb_prev(&rbe->node); @@ -254,7 +254,7 @@ nft_rbtree_gc_elem(const struct nft_set *__set, struct nft_rbtree *priv, while (prev) { rbe_prev = rb_entry(prev, struct nft_rbtree_elem, node); if (nft_rbtree_interval_end(rbe_prev) && - nft_set_elem_active(&rbe_prev->ext, genmask)) + nft_set_elem_active(&rbe_prev->ext, NFT_GENMASK_ANY)) break; prev = rb_prev(prev); @@ -365,7 +365,7 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set, nft_set_elem_active(&rbe->ext, cur_genmask)) { const struct nft_rbtree_elem *removed_end; - removed_end = nft_rbtree_gc_elem(set, priv, rbe, genmask); + removed_end = nft_rbtree_gc_elem(set, priv, rbe); if (IS_ERR(removed_end)) return PTR_ERR(removed_end); From e7d236d9c4c17c4f4d1e3e61518abd1665c7615d Mon Sep 17 00:00:00 2001 From: liyouzhi Date: Mon, 13 Nov 2023 17:33:35 +0800 Subject: [PATCH 012/111] ANDROID: GKI: add allowed list file for xiaomi 1 function symbol(s) added 'int nla_append(struct sk_buff*, int, const void*)' Bug: 322928575 Signed-off-by: liyouzhi Change-Id: I848e6d88448388b07392c6c2251033a0eb7c93fe --- android/abi_gki_aarch64.stg | 10 ++++++++++ android/abi_gki_aarch64_xiaomi | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index f5e96dec26b0..8f771c401b68 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -375722,6 +375722,15 @@ elf_symbol { type_id: 0x9cd33969 full_name: "nfc_vendor_cmd_reply" } +elf_symbol { + id: 0x6aeef72a + name: "nla_append" + is_defined: true + symbol_type: FUNCTION + crc: 0x9bfa08c1 + type_id: 0x9d41fde0 + full_name: "nla_append" +} elf_symbol { id: 0x915620e9 name: "nla_find" @@ -407043,6 +407052,7 @@ interface { symbol_id: 0x22e68369 symbol_id: 0xefd6be85 symbol_id: 0x53dde8dc + symbol_id: 0x6aeef72a symbol_id: 0x915620e9 symbol_id: 0x1570bf50 symbol_id: 0xfb9ee5c5 diff --git a/android/abi_gki_aarch64_xiaomi b/android/abi_gki_aarch64_xiaomi index dd305e697200..2651dbeaa061 100644 --- a/android/abi_gki_aarch64_xiaomi +++ b/android/abi_gki_aarch64_xiaomi @@ -350,3 +350,9 @@ pagecache_get_page filemap_get_folios find_get_pages_range_tag + +#required by bcmdhd.ko + nla_append + sdio_writew + sdio_readw + From ad49939193518f33e436f2bc5ec14a6f82a7e48c Mon Sep 17 00:00:00 2001 From: Vilas Bhat Date: Mon, 26 Feb 2024 10:57:18 -0800 Subject: [PATCH 013/111] FROMGIT: PM: runtime: add tracepoint for runtime_status changes Existing runtime PM ftrace events (`rpm_suspend`, `rpm_resume`, `rpm_return_int`) offer limited visibility into the exact timing of device runtime power state transitions, particularly when asynchronous operations are involved. When the `rpm_suspend` or `rpm_resume` functions are invoked with the `RPM_ASYNC` flag, a return value of 0 i.e., success merely indicates that the device power state request has been queued, not that the device has yet transitioned. A new ftrace event, `rpm_status`, is introduced. This event directly logs the `power.runtime_status` value of a device whenever it changes providing granular tracking of runtime power state transitions regardless of synchronous or asynchronous `rpm_suspend` / `rpm_resume` usage. Signed-off-by: Vilas Bhat Signed-off-by: Rafael J. Wysocki Bug: 325508361 (cherry picked from commit 015abee404760249a5c968b9ce29216b94b8ced1 https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next) Change-Id: Iad7cae74c41b23b430331379c180b5e59bc32c40 Signed-off-by: Vilas Bhat --- drivers/base/power/runtime.c | 1 + include/trace/events/rpm.h | 42 ++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 14088b5adb55..3c5587efb176 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c @@ -93,6 +93,7 @@ static void update_pm_runtime_accounting(struct device *dev) static void __update_runtime_status(struct device *dev, enum rpm_status status) { update_pm_runtime_accounting(dev); + trace_rpm_status(dev, status); dev->power.runtime_status = status; } diff --git a/include/trace/events/rpm.h b/include/trace/events/rpm.h index 3c716214dab1..bd120e23ce12 100644 --- a/include/trace/events/rpm.h +++ b/include/trace/events/rpm.h @@ -101,6 +101,48 @@ TRACE_EVENT(rpm_return_int, __entry->ret) ); +#define RPM_STATUS_STRINGS \ + EM(RPM_INVALID, "RPM_INVALID") \ + EM(RPM_ACTIVE, "RPM_ACTIVE") \ + EM(RPM_RESUMING, "RPM_RESUMING") \ + EM(RPM_SUSPENDED, "RPM_SUSPENDED") \ + EMe(RPM_SUSPENDING, "RPM_SUSPENDING") + +/* Enums require being exported to userspace, for user tool parsing. */ +#undef EM +#undef EMe +#define EM(a, b) TRACE_DEFINE_ENUM(a); +#define EMe(a, b) TRACE_DEFINE_ENUM(a); + +RPM_STATUS_STRINGS + +/* + * Now redefine the EM() and EMe() macros to map the enums to the strings that + * will be printed in the output. + */ +#undef EM +#undef EMe +#define EM(a, b) { a, b }, +#define EMe(a, b) { a, b } + +TRACE_EVENT(rpm_status, + TP_PROTO(struct device *dev, enum rpm_status status), + TP_ARGS(dev, status), + + TP_STRUCT__entry( + __string(name, dev_name(dev)) + __field(int, status) + ), + + TP_fast_assign( + __assign_str(name, dev_name(dev)); + __entry->status = status; + ), + + TP_printk("%s status=%s", __get_str(name), + __print_symbolic(__entry->status, RPM_STATUS_STRINGS)) +); + #endif /* _TRACE_RUNTIME_POWER_H */ /* This part must be outside protection */ From 26d7216e1dd5383ca4401024937954c3fbaadac2 Mon Sep 17 00:00:00 2001 From: Seiya Wang Date: Tue, 27 Feb 2024 17:27:40 +0800 Subject: [PATCH 014/111] ANDROID: GKI: Update symbol list for mtk ABI impact 1 function symbol(s) added 'void ktime_get_coarse_ts64(struct timespec64*)' Add following symbols clk_hw_register clk_unregister _dev_emerg devm_devfreq_register_opp_notifier dma_resv_wait_timeout drm_kms_helper_poll_init dummy_irq_chip fasync_helper __genphy_config_aneg genphy_read_status genphy_soft_reset genphy_suspend gpiod_get_optional __irq_domain_alloc_fwnode irq_domain_free_fwnode kill_fasync ktime_get_coarse_ts64 __mdiobus_read mdiobus_read __mdiobus_write mdiobus_write __of_mdiobus_register phy_drivers_register phy_drivers_unregister phy_error phy_get_pause phy_init_hw phy_read_mmd phy_restore_page phy_trigger_machine phy_write_mmd platform_get_ethdev_address regmap_multi_reg_write regmap_register_patch report_iommu_fault snd_soc_dapm_kcontrol_widget snd_soc_dpcm_get_substream snd_soc_get_enum_double snd_soc_of_parse_audio_routing snd_soc_pm_ops snd_soc_put_enum_double time64_to_tm usb_role_switch_put usb_scuttle_anchored_urbs v4l2_async_nf_cleanup v4l2_async_nf_init v4l2_async_nf_parse_fwnode_endpoints v4l2_async_nf_register v4l2_async_nf_unregister v4l2_async_register_subdev v4l2_async_unregister_subdev v4l2_fwnode_endpoint_parse v4l2_m2m_ioctl_decoder_cmd v4l2_m2m_ioctl_encoder_cmd v4l2_m2m_ioctl_try_decoder_cmd v4l2_m2m_ioctl_try_encoder_cmd v4l2_m2m_last_buffer_done Bug: 327123703 Signed-off-by: Seiya Wang Change-Id: I28528cf9ce295b979042e90382fcf49414cd899d --- android/abi_gki_aarch64.stg | 10 +++++++ android/abi_gki_aarch64_mtk | 57 +++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 8f771c401b68..0201bcf4e3ab 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -371739,6 +371739,15 @@ elf_symbol { type_id: 0x11a59ba3 full_name: "ktime_get_coarse_real_ts64" } +elf_symbol { + id: 0xdd9c72d1 + name: "ktime_get_coarse_ts64" + is_defined: true + symbol_type: FUNCTION + crc: 0xf5e7ea40 + type_id: 0x11a59ba3 + full_name: "ktime_get_coarse_ts64" +} elf_symbol { id: 0xba76946d name: "ktime_get_coarse_with_offset" @@ -406609,6 +406618,7 @@ interface { symbol_id: 0x25143c30 symbol_id: 0x7b453e0a symbol_id: 0xb80124fb + symbol_id: 0xdd9c72d1 symbol_id: 0xba76946d symbol_id: 0x012f568e symbol_id: 0x6a40dcf7 diff --git a/android/abi_gki_aarch64_mtk b/android/abi_gki_aarch64_mtk index 2e2265dc1a57..3226263e7210 100644 --- a/android/abi_gki_aarch64_mtk +++ b/android/abi_gki_aarch64_mtk @@ -171,6 +171,7 @@ clk_hw_get_rate clk_hw_is_enabled clk_hw_is_prepared + clk_hw_register clk_hw_round_rate clk_hw_set_parent __clk_is_enabled @@ -188,6 +189,7 @@ clk_set_parent clk_set_rate clk_unprepare + clk_unregister clockevents_config_and_register clocks_calc_mult_shift clocksource_mmio_init @@ -361,6 +363,7 @@ dev_close_many dev_coredumpv dev_driver_string + _dev_emerg _dev_err dev_err_probe dev_fetch_sw_netstats @@ -473,6 +476,7 @@ dev_mc_unsync devm_devfreq_add_device devm_devfreq_register_notifier + devm_devfreq_register_opp_notifier devm_devfreq_remove_device devm_devfreq_unregister_notifier devm_devfreq_unregister_opp_notifier @@ -679,6 +683,7 @@ dma_resv_iter_first_unlocked dma_resv_iter_next_unlocked dma_resv_reserve_fences + dma_resv_wait_timeout dma_run_dependencies dma_set_coherent_mask dma_set_mask @@ -828,6 +833,7 @@ drm_kms_helper_poll_disable drm_kms_helper_poll_enable drm_kms_helper_poll_fini + drm_kms_helper_poll_init drmm_mode_config_init drm_mode_config_cleanup drm_mode_config_reset @@ -881,6 +887,7 @@ dst_cache_set_ip4 dst_cache_set_ip6 dst_release + dummy_irq_chip dump_stack efi em_cpu_get @@ -911,6 +918,7 @@ extcon_get_edev_by_phandle extcon_get_state extcon_set_state_sync + fasync_helper __fdget fd_install fget @@ -999,7 +1007,11 @@ genlmsg_put genl_register_family genl_unregister_family + __genphy_config_aneg + genphy_read_status genphy_resume + genphy_soft_reset + genphy_suspend gen_pool_add_owner gen_pool_alloc_algo_owner gen_pool_avail @@ -1060,6 +1072,7 @@ gpiod_direction_input gpiod_direction_output gpiod_direction_output_raw + gpiod_get_optional gpiod_get_raw_value gpiod_get_value gpiod_get_value_cansleep @@ -1263,7 +1276,9 @@ irq_create_of_mapping irq_dispose_mapping __irq_domain_add + __irq_domain_alloc_fwnode irq_domain_create_simple + irq_domain_free_fwnode irq_domain_free_irqs_common irq_domain_get_irq_data irq_domain_remove @@ -1335,6 +1350,7 @@ kfree_skb_list_reason kfree_skb_partial kfree_skb_reason + kill_fasync kimage_vaddr kimage_voffset __kmalloc @@ -1402,6 +1418,7 @@ kthread_unpark kthread_worker_fn ktime_get + ktime_get_coarse_ts64 ktime_get_coarse_with_offset ktime_get_mono_fast_ns ktime_get_raw @@ -1458,8 +1475,12 @@ mdiobus_alloc_size mdiobus_free mdiobus_get_phy + __mdiobus_read + mdiobus_read __mdiobus_register mdiobus_unregister + __mdiobus_write + mdiobus_write media_create_ancillary_link media_create_intf_link media_create_pad_link @@ -1723,6 +1744,7 @@ of_machine_is_compatible of_match_device of_match_node + __of_mdiobus_register of_n_addr_cells of_n_size_cells __of_parse_phandle_with_args @@ -1865,6 +1887,9 @@ phy_connect_direct phy_disconnect phy_do_ioctl_running + phy_drivers_register + phy_drivers_unregister + phy_error phy_ethtool_get_eee phy_ethtool_get_link_ksettings phy_ethtool_get_wol @@ -1877,8 +1902,10 @@ phy_exit phy_find_first phy_get + phy_get_pause phy_init phy_init_eee + phy_init_hw phylink_connect_phy phylink_create phylink_destroy @@ -1895,8 +1922,10 @@ phy_power_on phy_print_status phy_put + phy_read_mmd phy_register_fixup_for_uid phy_remove_link_mode + phy_restore_page phy_save_page phy_set_mode_ext phy_start @@ -1904,7 +1933,9 @@ phy_stop phy_support_asym_pause phy_suspend + phy_trigger_machine phy_unregister_fixup_for_uid + phy_write_mmd pick_migrate_task pid_task pinconf_generic_parse_dt_config @@ -1938,6 +1969,7 @@ __platform_driver_register platform_driver_unregister platform_find_device_by_driver + platform_get_ethdev_address platform_get_irq platform_get_irq_byname platform_get_irq_byname_optional @@ -2134,9 +2166,11 @@ regmap_field_read regmap_field_update_bits_base regmap_irq_get_domain + regmap_multi_reg_write regmap_raw_read regmap_raw_write regmap_read + regmap_register_patch regmap_update_bits_base regmap_write regulator_bulk_disable @@ -2182,6 +2216,7 @@ remove_proc_entry remove_proc_subtree remove_wait_queue + report_iommu_fault request_firmware request_firmware_direct request_firmware_nowait @@ -2457,19 +2492,25 @@ snd_soc_dapm_get_pin_switch snd_soc_dapm_get_volsw snd_soc_dapm_info_pin_switch + snd_soc_dapm_kcontrol_widget snd_soc_dapm_new_controls snd_soc_dapm_new_widgets snd_soc_dapm_put_enum_double snd_soc_dapm_put_pin_switch snd_soc_dapm_put_volsw snd_soc_dapm_sync + snd_soc_dpcm_get_substream + snd_soc_get_enum_double snd_soc_get_volsw snd_soc_info_enum_double snd_soc_info_volsw snd_soc_jack_report snd_soc_new_compress snd_soc_of_get_dai_link_codecs + snd_soc_of_parse_audio_routing + snd_soc_pm_ops snd_soc_poweroff + snd_soc_put_enum_double snd_soc_put_volsw snd_soc_register_component snd_soc_resume @@ -2642,6 +2683,7 @@ thermal_zone_get_zone_by_name thread_group_cputime_adjusted tick_nohz_get_sleep_length + time64_to_tm timecounter_init timecounter_read timer_of_init @@ -3135,10 +3177,12 @@ usb_role_string usb_role_switch_get usb_role_switch_get_drvdata + usb_role_switch_put usb_role_switch_register usb_role_switch_set_role usb_role_switch_unregister usb_root_hub_lost_power + usb_scuttle_anchored_urbs usb_set_interface usb_show_dynids usb_speed_string @@ -3154,6 +3198,13 @@ uuid_gen uuid_null uuid_parse + v4l2_async_nf_cleanup + v4l2_async_nf_init + v4l2_async_nf_parse_fwnode_endpoints + v4l2_async_nf_register + v4l2_async_nf_unregister + v4l2_async_register_subdev + v4l2_async_unregister_subdev v4l2_compat_ioctl32 v4l2_ctrl_find v4l2_ctrl_g_ctrl @@ -3190,6 +3241,7 @@ v4l2_fh_open __v4l2_find_nearest_size v4l2_format_info + v4l2_fwnode_endpoint_parse v4l2_i2c_subdev_init v4l2_m2m_buf_copy_metadata v4l2_m2m_buf_queue @@ -3203,7 +3255,9 @@ v4l2_m2m_get_vq v4l2_m2m_init v4l2_m2m_ioctl_create_bufs + v4l2_m2m_ioctl_decoder_cmd v4l2_m2m_ioctl_dqbuf + v4l2_m2m_ioctl_encoder_cmd v4l2_m2m_ioctl_expbuf v4l2_m2m_ioctl_prepare_buf v4l2_m2m_ioctl_qbuf @@ -3211,7 +3265,10 @@ v4l2_m2m_ioctl_reqbufs v4l2_m2m_ioctl_streamoff v4l2_m2m_ioctl_streamon + v4l2_m2m_ioctl_try_decoder_cmd + v4l2_m2m_ioctl_try_encoder_cmd v4l2_m2m_job_finish + v4l2_m2m_last_buffer_done v4l2_m2m_next_buf v4l2_m2m_qbuf v4l2_m2m_register_media_controller From 763647877c3b870daca4b8ed693efce04d4f2499 Mon Sep 17 00:00:00 2001 From: chenweitao Date: Sun, 18 Feb 2024 11:32:35 +0800 Subject: [PATCH 015/111] ANDROID: vendor_hooks: Add hook for trace_android_vh_copy_process Add hook for trace_android_vh_copy_process, which gives the vendor a chance to monitor the total thread count of the system and the thread count under a particular process Bug: 325765508 Change-Id: Ibeb8aa571d44997ac10623321cd00d1686bde033 Signed-off-by: chenweitao --- include/trace/hooks/sched.h | 5 +++++ kernel/fork.c | 1 + kernel/sched/vendor_hooks.c | 1 + 3 files changed, 7 insertions(+) diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index 4037082dbebd..facee37cfacd 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -276,6 +276,11 @@ DECLARE_HOOK(android_vh_free_task, TP_PROTO(struct task_struct *p), TP_ARGS(p)); +DECLARE_HOOK(android_vh_copy_process, + TP_PROTO(struct task_struct *p, int nr_threads, int current_signal_nr_threads), + TP_ARGS(p, nr_threads, current_signal_nr_threads)); + + DECLARE_HOOK(android_vh_irqtime_account_process_tick, TP_PROTO(struct task_struct *p, struct rq *rq, int user_tick, int ticks), TP_ARGS(p, rq, user_tick, ticks)); diff --git a/kernel/fork.c b/kernel/fork.c index 1109a10c5ccd..415be3b90707 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -2590,6 +2590,7 @@ static __latent_entropy struct task_struct *copy_process( attach_pid(p, PIDTYPE_PID); nr_threads++; } + trace_android_vh_copy_process(current, nr_threads, current->signal->nr_threads); total_forks++; hlist_del_init(&delayed.node); spin_unlock(¤t->sighand->siglock); diff --git a/kernel/sched/vendor_hooks.c b/kernel/sched/vendor_hooks.c index b65262774f73..5d695121cc05 100644 --- a/kernel/sched/vendor_hooks.c +++ b/kernel/sched/vendor_hooks.c @@ -46,6 +46,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_pick_next_entity); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_check_preempt_wakeup); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_cpus_allowed_by_task); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_task); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_copy_process); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_uclamp_eff_get); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_after_enqueue_task); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_after_dequeue_task); From 34cf02fef9dac23a59f87d70744be09b1d11cdde Mon Sep 17 00:00:00 2001 From: chenweitao Date: Sun, 18 Feb 2024 14:18:48 +0800 Subject: [PATCH 016/111] ANDROID: ABI: Update oplus symbol list 1 function symbol(s) added 'int __traceiter_android_vh_copy_process(void*, struct task_struct*, int, int)' 1 variable symbol(s) added 'struct tracepoint __tracepoint_android_vh_copy_process' Bug: 325765508 Change-Id: I0642034f53faacd597a8233390f9a90dfe428791 Signed-off-by: chenweitao --- android/abi_gki_aarch64.stg | 28 ++++++++++++++++++++++++++++ android/abi_gki_aarch64_oplus | 2 ++ 2 files changed, 30 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 0201bcf4e3ab..1e6613362d31 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -321504,6 +321504,14 @@ function { parameter_id: 0x1aee9939 parameter_id: 0x3e0d8696 } +function { + id: 0x9bc38873 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x1d19a9d5 + parameter_id: 0x6720d32f + parameter_id: 0x6720d32f +} function { id: 0x9bc38ca5 return_type_id: 0x6720d32f @@ -338876,6 +338884,15 @@ elf_symbol { type_id: 0x9b35e16b full_name: "__traceiter_android_vh_compaction_try_to_compact_pages_exit" } +elf_symbol { + id: 0x63b166c2 + name: "__traceiter_android_vh_copy_process" + is_defined: true + symbol_type: FUNCTION + crc: 0x97306441 + type_id: 0x9bc38873 + full_name: "__traceiter_android_vh_copy_process" +} elf_symbol { id: 0x9247dcb1 name: "__traceiter_android_vh_cpu_idle_enter" @@ -342980,6 +342997,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_compaction_try_to_compact_pages_exit" } +elf_symbol { + id: 0xe054bfe0 + name: "__tracepoint_android_vh_copy_process" + is_defined: true + symbol_type: OBJECT + crc: 0x82e85c15 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_copy_process" +} elf_symbol { id: 0x26324a1f name: "__tracepoint_android_vh_cpu_idle_enter" @@ -402968,6 +402994,7 @@ interface { symbol_id: 0xef7737f8 symbol_id: 0xa4527895 symbol_id: 0x3644fdcd + symbol_id: 0x63b166c2 symbol_id: 0x9247dcb1 symbol_id: 0xfd04e27a symbol_id: 0xa124d3e0 @@ -403424,6 +403451,7 @@ interface { symbol_id: 0xca10f06e symbol_id: 0x9d49459f symbol_id: 0x759240ef + symbol_id: 0xe054bfe0 symbol_id: 0x26324a1f symbol_id: 0x4ade2774 symbol_id: 0x704b9aae diff --git a/android/abi_gki_aarch64_oplus b/android/abi_gki_aarch64_oplus index 4249e546c66c..08572f7ee6c7 100644 --- a/android/abi_gki_aarch64_oplus +++ b/android/abi_gki_aarch64_oplus @@ -209,6 +209,7 @@ __traceiter_android_vh_free_oem_binder_struct __traceiter_android_vh_binder_special_task __traceiter_android_vh_binder_free_buf + __traceiter_android_vh_copy_process __tracepoint_android_rvh_post_init_entity_util_avg __tracepoint_android_rvh_rtmutex_force_update __tracepoint_android_vh_account_process_tick_gran @@ -316,6 +317,7 @@ __tracepoint_android_vh_free_oem_binder_struct __tracepoint_android_vh_binder_special_task __tracepoint_android_vh_binder_free_buf + __tracepoint_android_vh_copy_process __trace_puts try_to_free_mem_cgroup_pages typec_mux_get_drvdata From c38ea4a1319d052527deef514f615b1f18278be8 Mon Sep 17 00:00:00 2001 From: Yan Zhai Date: Thu, 13 Jul 2023 10:28:00 -0700 Subject: [PATCH 017/111] BACKPORT: gso: fix dodgy bit handling for GSO_UDP_L4 Commit 1fd54773c267 ("udp: allow header check for dodgy GSO_UDP_L4 packets.") checks DODGY bit for UDP, but for packets that can be fed directly to the device after gso_segs reset, it actually falls through to fragmentation: https://lore.kernel.org/all/CAJPywTKDdjtwkLVUW6LRA2FU912qcDmQOQGt2WaDo28KzYDg+A@mail.gmail.com/ This change restores the expected behavior of GSO_UDP_L4 packets. Fixes: 1fd54773c267 ("udp: allow header check for dodgy GSO_UDP_L4 packets.") Suggested-by: Willem de Bruijn Change-Id: Id7ff0fac79fb0b4fabb62b09a905f27a5e8cfea7 (cherry picked from commit 9840036786d90cea11a90d1f30b6dc003b34ee67) [lena: Resolved conflict in net/ipv6/udp_offload.c ] Signed-off-by: Yan Zhai Reviewed-by: Willem de Bruijn Acked-by: Jason Wang Signed-off-by: David S. Miller --- net/ipv4/udp_offload.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c index 6d1a4bec2614..d0e8239d4d62 100644 --- a/net/ipv4/udp_offload.c +++ b/net/ipv4/udp_offload.c @@ -273,13 +273,20 @@ struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb, __sum16 check; __be16 newlen; - if (skb_shinfo(gso_skb)->gso_type & SKB_GSO_FRAGLIST) - return __udp_gso_segment_list(gso_skb, features, is_ipv6); - mss = skb_shinfo(gso_skb)->gso_size; if (gso_skb->len <= sizeof(*uh) + mss) return ERR_PTR(-EINVAL); + if (skb_gso_ok(gso_skb, features | NETIF_F_GSO_ROBUST)) { + /* Packet is from an untrusted source, reset gso_segs. */ + skb_shinfo(gso_skb)->gso_segs = DIV_ROUND_UP(gso_skb->len - sizeof(*uh), + mss); + return NULL; + } + + if (skb_shinfo(gso_skb)->gso_type & SKB_GSO_FRAGLIST) + return __udp_gso_segment_list(gso_skb, features, is_ipv6); + skb_pull(gso_skb, sizeof(*uh)); /* clear destructor to avoid skb_segment assigning it to tail */ From c73814520de139b6a0a8ff3048f03bfd345b0ef2 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 27 Feb 2024 17:57:16 +0000 Subject: [PATCH 018/111] Revert "interconnect: Teach lockdep about icc_bw_lock order" This reverts commit 0db211ec0f1d32b93486e8f6565249ad4d1bece5 which is commit 13619170303878e1dae86d9a58b039475c957fcf upstream. It is reported to cause crashes, so revert it for now. Bug: 326555421 Signed-off-by: Greg Kroah-Hartman Change-Id: I3dd7744a9b706a959cbed3a793be668147dfcb9a --- drivers/interconnect/core.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/drivers/interconnect/core.c b/drivers/interconnect/core.c index 0c6fc954e729..7d429ddbd45c 100644 --- a/drivers/interconnect/core.c +++ b/drivers/interconnect/core.c @@ -1147,21 +1147,13 @@ void icc_sync_state(struct device *dev) } } } - mutex_unlock(&icc_bw_lock); mutex_unlock(&icc_lock); } EXPORT_SYMBOL_GPL(icc_sync_state); static int __init icc_init(void) { - struct device_node *root; - - /* Teach lockdep about lock ordering wrt. shrinker: */ - fs_reclaim_acquire(GFP_KERNEL); - might_lock(&icc_bw_lock); - fs_reclaim_release(GFP_KERNEL); - - root = of_find_node_by_path("/"); + struct device_node *root = of_find_node_by_path("/"); providers_count = of_count_icc_providers(root); of_node_put(root); From 56e0cf4e396b2bafd2758360495a5daf3372d014 Mon Sep 17 00:00:00 2001 From: Fuchun Liao Date: Wed, 21 Feb 2024 10:21:26 +0800 Subject: [PATCH 019/111] ANDROID: binder: Add vendor hook to fix priority restore When cpu loading is high, the task maybe preempted after restoring the sched priority in trace_android_vh_binder_free_buf(). This means that node->has_async_transaction can't be cleared immediately and the work isn't added to the proc->todo queue as soon as possible. To fix this we add a new hook trace_android_vh_binder_buffer_release() to restore the priority after node->has_async_transaction has been updated and the node->work has been added to the proc->todo queue. Note: the old trace_android_vh_binder_free_buf() hook is kept to avoid breaking KMI but is not extrictly needed. Bug: 327307900 Fixes: 0eb66ec39ca8 ("ANDROID: vendor_hooks: Add hooks for binder") Change-Id: I8126c79c9c68faa3ce0cd87ce83e2591bd61d5dd Signed-off-by: Fuchun Liao [cmllamas: fix-up commit log and variable naming] Signed-off-by: Carlos Llamas --- drivers/android/binder.c | 4 ++++ drivers/android/vendor_hooks.c | 1 + include/trace/hooks/binder.h | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index d36caa9fd6e7..cc6c9ceca866 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -3989,12 +3989,14 @@ binder_free_buf(struct binder_proc *proc, struct binder_buffer *buffer, bool is_failure) { bool enqueue_task = true; + bool has_transaction = false; trace_android_vh_binder_free_buf(proc, thread, buffer); binder_inner_proc_lock(proc); if (buffer->transaction) { buffer->transaction->buffer = NULL; buffer->transaction = NULL; + has_transaction = true; } binder_inner_proc_unlock(proc); if (buffer->async_transaction && buffer->target_node) { @@ -4018,6 +4020,8 @@ binder_free_buf(struct binder_proc *proc, } binder_node_inner_unlock(buf_node); } + trace_android_vh_binder_buffer_release(proc, thread, buffer, + has_transaction); trace_binder_transaction_buffer_release(buffer); binder_release_entire_buffer(proc, thread, buffer, is_failure); binder_alloc_free_buf(&proc->alloc, buffer); diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 19f96411720a..a11e37bcfb88 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -353,6 +353,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_transaction_received); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_oem_binder_struct); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_special_task); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_free_buf); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_buffer_release); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_compaction_exit); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_compaction_try_to_compact_pages_exit); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_alloc_pages_direct_reclaim_enter); diff --git a/include/trace/hooks/binder.h b/include/trace/hooks/binder.h index b895f23f8cf7..e67cfc5fee1b 100644 --- a/include/trace/hooks/binder.h +++ b/include/trace/hooks/binder.h @@ -126,6 +126,10 @@ DECLARE_HOOK(android_vh_binder_free_buf, TP_PROTO(struct binder_proc *proc, struct binder_thread *thread, struct binder_buffer *buffer), TP_ARGS(proc, thread, buffer)); +DECLARE_HOOK(android_vh_binder_buffer_release, + TP_PROTO(struct binder_proc *proc, struct binder_thread *thread, + struct binder_buffer *buffer, bool has_transaction), + TP_ARGS(proc, thread, buffer, has_transaction)); DECLARE_HOOK(android_vh_binder_ioctl_end, TP_PROTO(struct task_struct *caller_task, From 18c75fa4028db948b1523b4ed68f1292a81daab0 Mon Sep 17 00:00:00 2001 From: lfc Date: Wed, 28 Feb 2024 15:01:29 +0800 Subject: [PATCH 020/111] ANDROID: ABI: Update oplus symbol list INFO: 1 function symbol(s) added 'int __traceiter_android_vh_binder_buffer_release(void*, struct binder_proc*, struct binder_thread*, struct binder_buffer*, bool)' 1 variable symbol(s) added 'struct tracepoint __tracepoint_android_vh_binder_buffer_release' Bug: 327307900 Change-Id: I6bca73bc3edb2d1deadc38daec96baa486f15929 Signed-off-by: Fuchun Liao --- android/abi_gki_aarch64.stg | 29 +++++++++++++++++++++++++++++ android/abi_gki_aarch64_oplus | 2 ++ 2 files changed, 31 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 1e6613362d31..e89f94f77464 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -322029,6 +322029,15 @@ function { parameter_id: 0x24373219 parameter_id: 0x38b368bf } +function { + id: 0x9bd878c3 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x1f8dbf97 + parameter_id: 0x24373219 + parameter_id: 0x38b368bf + parameter_id: 0x6d7f5ff6 +} function { id: 0x9bd88151 return_type_id: 0x6720d32f @@ -338488,6 +338497,15 @@ elf_symbol { type_id: 0x98731419 full_name: "__traceiter_android_vh_binder_alloc_new_buf_locked" } +elf_symbol { + id: 0x5bd6c5e2 + name: "__traceiter_android_vh_binder_buffer_release" + is_defined: true + symbol_type: FUNCTION + crc: 0x3de41161 + type_id: 0x9bd878c3 + full_name: "__traceiter_android_vh_binder_buffer_release" +} elf_symbol { id: 0x6e0b473c name: "__traceiter_android_vh_binder_del_ref" @@ -342601,6 +342619,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_binder_alloc_new_buf_locked" } +elf_symbol { + id: 0xec7540bc + name: "__tracepoint_android_vh_binder_buffer_release" + is_defined: true + symbol_type: OBJECT + crc: 0xeabc28db + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_binder_buffer_release" +} elf_symbol { id: 0x61b56472 name: "__tracepoint_android_vh_binder_del_ref" @@ -402950,6 +402977,7 @@ interface { symbol_id: 0xf89a975f symbol_id: 0x528da532 symbol_id: 0x530ad17d + symbol_id: 0x5bd6c5e2 symbol_id: 0x6e0b473c symbol_id: 0x6da7faa3 symbol_id: 0xcb807696 @@ -403407,6 +403435,7 @@ interface { symbol_id: 0xe423541d symbol_id: 0xfb7cdd24 symbol_id: 0xc8703937 + symbol_id: 0xec7540bc symbol_id: 0x61b56472 symbol_id: 0xd995cae5 symbol_id: 0x19dded7c diff --git a/android/abi_gki_aarch64_oplus b/android/abi_gki_aarch64_oplus index 08572f7ee6c7..0b83cab9f007 100644 --- a/android/abi_gki_aarch64_oplus +++ b/android/abi_gki_aarch64_oplus @@ -209,6 +209,7 @@ __traceiter_android_vh_free_oem_binder_struct __traceiter_android_vh_binder_special_task __traceiter_android_vh_binder_free_buf + __traceiter_android_vh_binder_buffer_release __traceiter_android_vh_copy_process __tracepoint_android_rvh_post_init_entity_util_avg __tracepoint_android_rvh_rtmutex_force_update @@ -317,6 +318,7 @@ __tracepoint_android_vh_free_oem_binder_struct __tracepoint_android_vh_binder_special_task __tracepoint_android_vh_binder_free_buf + __tracepoint_android_vh_binder_buffer_release __tracepoint_android_vh_copy_process __trace_puts try_to_free_mem_cgroup_pages From 77277e4ba4a66f2b345dd727f4850c7c606bf442 Mon Sep 17 00:00:00 2001 From: Sai Harshini Nimmala Date: Thu, 27 Oct 2022 12:52:45 -0700 Subject: [PATCH 021/111] ANDROID: sched/cpuset: Add vendor hook to change tasks affinity Vendors might want to change tasks affinity settings when they are moving from one cpuset into the other. Add vendor hook to give control to vendor to implement what they need. This reverts commit a42f6e7d0aa0("Revert "ANDROID: sched/cpuset: Add vendor hook to change tasks affinity"") to effectively bring back the original change. Bug: 323765868 Change-Id: I47c1ee0dabda491732932c653bd80e95ee550791 Signed-off-by: Satya Durga Srinivasu Prabhala Signed-off-by: Sai Harshini Nimmala --- include/trace/hooks/sched.h | 5 +++++ kernel/cgroup/cpuset.c | 17 +++++++++++++++-- kernel/sched/vendor_hooks.c | 1 + 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index facee37cfacd..61af20b66740 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -207,6 +207,11 @@ DECLARE_RESTRICTED_HOOK(android_rvh_util_fits_cpu, int cpu, bool *fits, bool *done), TP_ARGS(util, uclamp_min, uclamp_max, cpu, fits, done), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_update_cpus_allowed, + TP_PROTO(struct task_struct *p, cpumask_var_t cpus_requested, + const struct cpumask *new_mask, int *ret), + TP_ARGS(p, cpus_requested, new_mask, ret), 1); + DECLARE_RESTRICTED_HOOK(android_rvh_sched_fork_init, TP_PROTO(struct task_struct *p), TP_ARGS(p), 1); diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index d30a3f8eb812..ea5de9304eef 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -68,6 +68,7 @@ #include #include +#include DEFINE_STATIC_KEY_FALSE(cpusets_pre_enable_key); DEFINE_STATIC_KEY_FALSE(cpusets_enabled_key); @@ -1241,6 +1242,18 @@ void rebuild_sched_domains(void) } EXPORT_SYMBOL_GPL(rebuild_sched_domains); +static int update_cpus_allowed(struct cpuset *cs, struct task_struct *p, + const struct cpumask *new_mask) +{ + int ret = -EINVAL; + + trace_android_rvh_update_cpus_allowed(p, cs->cpus_requested, new_mask, &ret); + if (!ret) + return ret; + + return set_cpus_allowed_ptr(p, new_mask); +} + /** * update_tasks_cpumask - Update the cpumasks of tasks in the cpuset. * @cs: the cpuset in which each task's cpus_allowed mask needs to be changed @@ -1267,7 +1280,7 @@ static void update_tasks_cpumask(struct cpuset *cs, struct cpumask *new_cpus) cpumask_and(new_cpus, cs->effective_cpus, task_cpu_possible_mask(task)); - set_cpus_allowed_ptr(task, new_cpus); + update_cpus_allowed(cs, task, new_cpus); } css_task_iter_end(&it); } @@ -2640,7 +2653,7 @@ static void cpuset_attach_task(struct cpuset *cs, struct task_struct *task) * can_attach beforehand should guarantee that this doesn't * fail. TODO: have a better way to handle failure here */ - WARN_ON_ONCE(set_cpus_allowed_ptr(task, cpus_attach)); + WARN_ON_ONCE(update_cpus_allowed(cs, task, cpus_attach)); cpuset_change_task_nodemask(task, &cpuset_attach_nodemask_to); cpuset_update_task_spread_flags(cs, task); diff --git a/kernel/sched/vendor_hooks.c b/kernel/sched/vendor_hooks.c index 5d695121cc05..8a3ce9f567f1 100644 --- a/kernel/sched/vendor_hooks.c +++ b/kernel/sched/vendor_hooks.c @@ -37,6 +37,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_find_busiest_queue); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_migrate_queued_task); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cpu_overutilized); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sched_setaffinity); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_update_cpus_allowed); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_build_sched_domains); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_check_preempt_tick); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_check_preempt_wakeup_ignore); From 4289e1348ea3ba552b8bd401182b55dcb87d5be7 Mon Sep 17 00:00:00 2001 From: xiaofeng Date: Fri, 23 Feb 2024 11:38:07 +0800 Subject: [PATCH 022/111] ANDROID: GKI: Update symbol list for xiaomi 1 variable symbol(s) added 'struct tracepoint __tracepoint_android_rvh_update_cpus_allowed' Bug: 323765868 Change-Id: I5c97bea49cee20e2c2b22aa4d1627bdff226ce4a Signed-off-by: xiaofeng --- android/abi_gki_aarch64.stg | 29 +++++++++++++++++++++++++++++ android/abi_gki_aarch64_xiaomi | 3 +++ 2 files changed, 32 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index e89f94f77464..bd57143ada8c 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -321855,6 +321855,15 @@ function { parameter_id: 0x18bd6530 parameter_id: 0x31e5e879 } +function { + id: 0x9bd522a5 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x1d19a9d5 + parameter_id: 0x38fa32ef + parameter_id: 0x310ec01d + parameter_id: 0x13580d6c +} function { id: 0x9bd555e1 return_type_id: 0x6720d32f @@ -338290,6 +338299,15 @@ elf_symbol { type_id: 0x9a32aa77 full_name: "__traceiter_android_rvh_update_cpu_capacity" } +elf_symbol { + id: 0xcd87358a + name: "__traceiter_android_rvh_update_cpus_allowed" + is_defined: true + symbol_type: FUNCTION + crc: 0x560cad68 + type_id: 0x9bd522a5 + full_name: "__traceiter_android_rvh_update_cpus_allowed" +} elf_symbol { id: 0xb6d1fa25 name: "__traceiter_android_rvh_update_load_avg" @@ -342412,6 +342430,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_rvh_update_cpu_capacity" } +elf_symbol { + id: 0xbef5a77c + name: "__tracepoint_android_rvh_update_cpus_allowed" + is_defined: true + symbol_type: OBJECT + crc: 0xf9395534 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_rvh_update_cpus_allowed" +} elf_symbol { id: 0xcc5017b7 name: "__tracepoint_android_rvh_update_load_avg" @@ -402954,6 +402981,7 @@ interface { symbol_id: 0x00e6d4cc symbol_id: 0xa63eb82a symbol_id: 0xcd824552 + symbol_id: 0xcd87358a symbol_id: 0xb6d1fa25 symbol_id: 0x6fdb7fd2 symbol_id: 0x16809a5a @@ -403412,6 +403440,7 @@ interface { symbol_id: 0xcfcbaf3e symbol_id: 0xc3add2dc symbol_id: 0xdc2af26c + symbol_id: 0xbef5a77c symbol_id: 0xcc5017b7 symbol_id: 0x51c819cc symbol_id: 0x1362c5b0 diff --git a/android/abi_gki_aarch64_xiaomi b/android/abi_gki_aarch64_xiaomi index 2651dbeaa061..60c623ce7db0 100644 --- a/android/abi_gki_aarch64_xiaomi +++ b/android/abi_gki_aarch64_xiaomi @@ -356,3 +356,6 @@ sdio_writew sdio_readw +#required by speed_ui.ko + __tracepoint_android_rvh_update_cpus_allowed + __traceiter_android_rvh_update_cpus_allowed From 30edcedb44a8d409869d3d22a8e291007da7e534 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 27 Feb 2024 17:58:16 +0000 Subject: [PATCH 023/111] Revert "interconnect: Fix locking for runpm vs reclaim" This reverts commit ee42bfc791aa3cd78e29046f26a09d189beb3efb which is commit af42269c3523492d71ebbe11fefae2653e9cdc78 upstream. It is reported to cause crashes, so revert it for now. Bug: 326555421 Change-Id: I2fb3626c306e0444f4e0eb42a95488e688942ba9 Signed-off-by: Greg Kroah-Hartman --- drivers/interconnect/core.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/drivers/interconnect/core.c b/drivers/interconnect/core.c index 7d429ddbd45c..137c9ea60a6b 100644 --- a/drivers/interconnect/core.c +++ b/drivers/interconnect/core.c @@ -29,7 +29,6 @@ static LIST_HEAD(icc_providers); static int providers_count; static bool synced_state; static DEFINE_MUTEX(icc_lock); -static DEFINE_MUTEX(icc_bw_lock); static struct dentry *icc_debugfs_dir; static void icc_summary_show_one(struct seq_file *s, struct icc_node *n) @@ -633,7 +632,7 @@ int icc_set_bw(struct icc_path *path, u32 avg_bw, u32 peak_bw) if (WARN_ON(IS_ERR(path) || !path->num_nodes)) return -EINVAL; - mutex_lock(&icc_bw_lock); + mutex_lock(&icc_lock); old_avg = path->reqs[0].avg_bw; old_peak = path->reqs[0].peak_bw; @@ -665,7 +664,7 @@ int icc_set_bw(struct icc_path *path, u32 avg_bw, u32 peak_bw) apply_constraints(path); } - mutex_unlock(&icc_bw_lock); + mutex_unlock(&icc_lock); trace_icc_set_bw_end(path, ret); @@ -968,7 +967,6 @@ void icc_node_add(struct icc_node *node, struct icc_provider *provider) return; mutex_lock(&icc_lock); - mutex_lock(&icc_bw_lock); node->provider = provider; list_add_tail(&node->node_list, &provider->nodes); @@ -994,7 +992,6 @@ void icc_node_add(struct icc_node *node, struct icc_provider *provider) node->avg_bw = 0; node->peak_bw = 0; - mutex_unlock(&icc_bw_lock); mutex_unlock(&icc_lock); } EXPORT_SYMBOL_GPL(icc_node_add); @@ -1134,7 +1131,6 @@ void icc_sync_state(struct device *dev) return; mutex_lock(&icc_lock); - mutex_lock(&icc_bw_lock); synced_state = true; list_for_each_entry(p, &icc_providers, provider_list) { dev_dbg(p->dev, "interconnect provider is in synced state\n"); From 70fdaa07de739baa01b3d5597d8e542c86f558e1 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Thu, 29 Feb 2024 10:13:14 -0800 Subject: [PATCH 024/111] Revert "ANDROID: Build null_blk and scsi_debug as kernel modules" Revert commit 9b476ebe99ad in preparation of making this a Pixel-specific change. A disadvantage of building null_blk and scsi_debug as kernel modules for all vendors is that this causes these kernel modules to be loaded by the init process during boot and there is no vendor-independent mechanism for preventing kernel modules to be loaded. Bug: 323406846 Change-Id: I6e7bcdd9fd06194bbc134ee52251b6ae9a3c1477 Signed-off-by: Bart Van Assche --- arch/arm64/configs/gki_defconfig | 2 -- arch/x86/configs/gki_defconfig | 2 -- modules.bzl | 5 ----- 3 files changed, 9 deletions(-) diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig index bc18ada0bd54..dbf1e1ca23fd 100644 --- a/arch/arm64/configs/gki_defconfig +++ b/arch/arm64/configs/gki_defconfig @@ -309,7 +309,6 @@ CONFIG_ARM_SCPI_PROTOCOL=y # CONFIG_ARM_SCPI_POWER_DOMAIN is not set # CONFIG_EFI_ARMSTUB_DTB_LOADER is not set CONFIG_GNSS=y -CONFIG_BLK_DEV_NULL_BLK=m CONFIG_ZRAM=m CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=16 @@ -323,7 +322,6 @@ CONFIG_UID_SYS_STATS=y CONFIG_SCSI=y # CONFIG_SCSI_PROC_FS is not set CONFIG_BLK_DEV_SD=y -CONFIG_SCSI_DEBUG=m CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y diff --git a/arch/x86/configs/gki_defconfig b/arch/x86/configs/gki_defconfig index 8090b1ca2a28..8330afe50d28 100644 --- a/arch/x86/configs/gki_defconfig +++ b/arch/x86/configs/gki_defconfig @@ -295,7 +295,6 @@ CONFIG_FW_LOADER_USER_HELPER=y # CONFIG_FW_CACHE is not set CONFIG_GNSS=y CONFIG_OF=y -CONFIG_BLK_DEV_NULL_BLK=m CONFIG_ZRAM=m CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=16 @@ -309,7 +308,6 @@ CONFIG_UID_SYS_STATS=y CONFIG_SCSI=y # CONFIG_SCSI_PROC_FS is not set CONFIG_BLK_DEV_SD=y -CONFIG_SCSI_DEBUG=m CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y diff --git a/modules.bzl b/modules.bzl index ad71a36c4ff5..52d92225aab4 100644 --- a/modules.bzl +++ b/modules.bzl @@ -8,9 +8,6 @@ This module contains a full list of kernel modules _COMMON_GKI_MODULES_LIST = [ # keep sorted - "crypto/crct10dif_common.ko", - "crypto/crct10dif_generic.ko", - "drivers/block/null_blk/null_blk.ko", "drivers/block/zram/zram.ko", "drivers/bluetooth/btbcm.ko", "drivers/bluetooth/btqca.ko", @@ -38,12 +35,10 @@ _COMMON_GKI_MODULES_LIST = [ "drivers/net/usb/rtl8150.ko", "drivers/net/usb/usbnet.ko", "drivers/net/wwan/wwan.ko", - "drivers/scsi/scsi_debug.ko", "drivers/usb/class/cdc-acm.ko", "drivers/usb/serial/ftdi_sio.ko", "drivers/usb/serial/usbserial.ko", "kernel/kheaders.ko", - "lib/crc-t10dif.ko", "lib/crypto/libarc4.ko", "mm/zsmalloc.ko", "net/6lowpan/6lowpan.ko", From 35bb2c8c5fd3f623e062757cd943617efa29a172 Mon Sep 17 00:00:00 2001 From: Dongyun Liu Date: Wed, 6 Dec 2023 14:12:07 +0800 Subject: [PATCH 025/111] ANDROID: Add vendor_hooks to workaround CONFIG_TASK_DELAY_ACCT CONFIG_TASK_DELAY_ACCT cannot be enabled since `struct task_struct` is KMI frozen. Instead, use vendor hooks to allow delay accounting to be implemented in a vendor module. Bug: 327566572 Bug: 310129610 Bug: 314931189 Change-Id: If814d7834889fe162aba3dd97e935289127ca3ae Signed-off-by: Dongyun Liu (cherry picked from commit bb57557246d39dba8a66df7f43983fe1ec71bff6) (cherry picked from commit 896cff873452d9a3853c489bb2a173a1e290ca95) --- drivers/android/vendor_hooks.c | 20 +++++ include/linux/delayacct.h | 132 ++++++++++++++++++++++++++++---- include/trace/hooks/delayacct.h | 76 ++++++++++++++++++ kernel/Makefile | 3 +- kernel/delayacct.c | 104 +++++++++++++++++++++++++ 5 files changed, 316 insertions(+), 19 deletions(-) create mode 100644 include/trace/hooks/delayacct.h diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index a11e37bcfb88..3d5f85393bd3 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -70,6 +70,8 @@ #include #include #include +#include + /* * Export tracepoints that act as a bare tracehook (ie: have no trace event * associated with them) to allow external modules to probe them. @@ -380,3 +382,21 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_looper_exited); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_spawn_new_thread); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_has_special_work_ilocked); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_detect_low_async_space_locked); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_delayacct_init); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_delayacct_tsk_init); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_delayacct_tsk_free); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_blkio_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_blkio_end); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_add_tsk); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_blkio_ticks); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_freepages_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_freepages_end); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_thrashing_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_thrashing_end); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_swapin_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_swapin_end); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_compact_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_compact_end); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_wpcopy_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_wpcopy_end); + diff --git a/include/linux/delayacct.h b/include/linux/delayacct.h index 0da97dba9ef8..36a162940211 100644 --- a/include/linux/delayacct.h +++ b/include/linux/delayacct.h @@ -216,43 +216,141 @@ static inline void delayacct_wpcopy_end(void) } #else +extern void _trace_android_rvh_delayacct_init(void); +extern void _trace_android_rvh_delayacct_tsk_init(struct task_struct *tsk); +extern void _trace_android_rvh_delayacct_tsk_free(struct task_struct *tsk); +extern void _trace_android_vh_delayacct_blkio_start(void); +extern void _trace_android_vh_delayacct_blkio_end(struct task_struct *p); +extern void _trace_android_vh_delayacct_add_tsk(struct taskstats *d, + struct task_struct *tsk, + int *ret); +extern void _trace_android_vh_delayacct_blkio_ticks(struct task_struct *tsk, __u64 *ret); +extern void _trace_android_vh_delayacct_freepages_start(void); +extern void _trace_android_vh_delayacct_freepages_end(void); +extern void _trace_android_vh_delayacct_thrashing_start(bool *in_thrashing); +extern void _trace_android_vh_delayacct_thrashing_end(bool *in_thrashing); +extern void _trace_android_vh_delayacct_swapin_start(void); +extern void _trace_android_vh_delayacct_swapin_end(void); +extern void _trace_android_vh_delayacct_compact_start(void); +extern void _trace_android_vh_delayacct_compact_end(void); +extern void _trace_android_vh_delayacct_wpcopy_start(void); +extern void _trace_android_vh_delayacct_wpcopy_end(void); +extern void set_delayacct_enabled(bool enabled); +extern bool get_delayacct_enabled(void); + static inline void delayacct_init(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_rvh_delayacct_init(); +} + static inline void delayacct_tsk_init(struct task_struct *tsk) -{} +{ + if (get_delayacct_enabled()) + _trace_android_rvh_delayacct_tsk_init(tsk); +} + static inline void delayacct_tsk_free(struct task_struct *tsk) -{} +{ + if (get_delayacct_enabled()) + _trace_android_rvh_delayacct_tsk_free(tsk); +} + static inline void delayacct_blkio_start(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_blkio_start(); +} + static inline void delayacct_blkio_end(struct task_struct *p) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_blkio_end(p); +} + static inline int delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk) -{ return 0; } +{ + int ret = 0; + + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_add_tsk(d, tsk, &ret); + + return ret; +} + static inline __u64 delayacct_blkio_ticks(struct task_struct *tsk) -{ return 0; } +{ + __u64 ret = 0; + + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_blkio_ticks(tsk, &ret); + + return ret; +} + static inline int delayacct_is_task_waiting_on_io(struct task_struct *p) { return 0; } + static inline void delayacct_freepages_start(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_freepages_start(); +} + static inline void delayacct_freepages_end(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_freepages_end(); +} + static inline void delayacct_thrashing_start(bool *in_thrashing) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_thrashing_start(in_thrashing); +} + static inline void delayacct_thrashing_end(bool *in_thrashing) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_thrashing_end(in_thrashing); +} + static inline void delayacct_swapin_start(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_swapin_start(); +} + static inline void delayacct_swapin_end(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_swapin_end(); +} + static inline void delayacct_compact_start(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_compact_start(); +} + static inline void delayacct_compact_end(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_compact_end(); +} + static inline void delayacct_wpcopy_start(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_wpcopy_start(); +} + static inline void delayacct_wpcopy_end(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_wpcopy_end(); +} #endif /* CONFIG_TASK_DELAY_ACCT */ diff --git a/include/trace/hooks/delayacct.h b/include/trace/hooks/delayacct.h new file mode 100644 index 000000000000..794bbc7e0e74 --- /dev/null +++ b/include/trace/hooks/delayacct.h @@ -0,0 +1,76 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifdef PROTECT_TRACE_INCLUDE_PATH +#undef PROTECT_TRACE_INCLUDE_PATH + + +#else /* PROTECT_TRACE_INCLUDE_PATH */ + +#undef TRACE_SYSTEM +#define TRACE_SYSTEM delayacct + +#define TRACE_INCLUDE_PATH trace/hooks + +#if !defined(_TRACE_HOOK_DELAYACCT_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_DELAYACCT_H + +#include + +struct task_struct; +struct taskstats; +DECLARE_RESTRICTED_HOOK(android_rvh_delayacct_init, + TP_PROTO(void *unused), + TP_ARGS(unused), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_delayacct_tsk_init, + TP_PROTO(struct task_struct *tsk), + TP_ARGS(tsk), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_delayacct_tsk_free, + TP_PROTO(struct task_struct *tsk), + TP_ARGS(tsk), 1); +DECLARE_HOOK(android_vh_delayacct_blkio_start, + TP_PROTO(void *unused), + TP_ARGS(unused)); +DECLARE_HOOK(android_vh_delayacct_blkio_end, + TP_PROTO(struct task_struct *p), + TP_ARGS(p)); +DECLARE_HOOK(android_vh_delayacct_add_tsk, + TP_PROTO(struct taskstats *d, struct task_struct *tsk, int *ret), + TP_ARGS(d, tsk, ret)); +DECLARE_HOOK(android_vh_delayacct_blkio_ticks, + TP_PROTO(struct task_struct *tsk, __u64 *ret), + TP_ARGS(tsk, ret)); +DECLARE_HOOK(android_vh_delayacct_freepages_start, + TP_PROTO(void *unused), + TP_ARGS(unused)); +DECLARE_HOOK(android_vh_delayacct_freepages_end, + TP_PROTO(void *unused), + TP_ARGS(unused)); +DECLARE_HOOK(android_vh_delayacct_thrashing_start, + TP_PROTO(bool *in_thrashing), + TP_ARGS(in_thrashing)); +DECLARE_HOOK(android_vh_delayacct_thrashing_end, + TP_PROTO(bool *in_thrashing), + TP_ARGS(in_thrashing)); +DECLARE_HOOK(android_vh_delayacct_swapin_start, + TP_PROTO(void *unused), + TP_ARGS(unused)); +DECLARE_HOOK(android_vh_delayacct_swapin_end, + TP_PROTO(void *unused), + TP_ARGS(unused)); +DECLARE_HOOK(android_vh_delayacct_compact_start, + TP_PROTO(void *unused), + TP_ARGS(unused)); +DECLARE_HOOK(android_vh_delayacct_compact_end, + TP_PROTO(void *unused), + TP_ARGS(unused)); +DECLARE_HOOK(android_vh_delayacct_wpcopy_start, + TP_PROTO(void *unused), + TP_ARGS(unused)); +DECLARE_HOOK(android_vh_delayacct_wpcopy_end, + TP_PROTO(void *unused), + TP_ARGS(unused)); + +#endif /* _TRACE_HOOK_DELAYACCT_H */ +/* This part must be outside protection */ +#include + +#endif /* PROTECT_TRACE_INCLUDE_PATH */ diff --git a/kernel/Makefile b/kernel/Makefile index ebc692242b68..df8d43045263 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -10,7 +10,7 @@ obj-y = fork.o exec_domain.o panic.o \ extable.o params.o \ kthread.o sys_ni.o nsproxy.o \ notifier.o ksysfs.o cred.o reboot.o \ - async.o range.o smpboot.o ucount.o regset.o + async.o range.o smpboot.o ucount.o regset.o delayacct.o obj-$(CONFIG_USERMODE_DRIVER) += usermode_driver.o obj-$(CONFIG_MODULES) += kmod.o @@ -94,7 +94,6 @@ obj-$(CONFIG_HARDLOCKUP_DETECTOR_PERF) += watchdog_hld.o obj-$(CONFIG_SECCOMP) += seccomp.o obj-$(CONFIG_RELAY) += relay.o obj-$(CONFIG_SYSCTL) += utsname_sysctl.o -obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o obj-$(CONFIG_TRACEPOINTS) += tracepoint.o obj-$(CONFIG_LATENCYTOP) += latencytop.o diff --git a/kernel/delayacct.c b/kernel/delayacct.c index e39cb696cfbd..9136f70c45ea 100644 --- a/kernel/delayacct.c +++ b/kernel/delayacct.c @@ -14,6 +14,8 @@ #include #include +#ifdef CONFIG_TASK_DELAY_ACCT + DEFINE_STATIC_KEY_FALSE(delayacct_key); int delayacct_on __read_mostly; /* Delay accounting turned on/off */ struct kmem_cache *delayacct_cache; @@ -274,3 +276,105 @@ void __delayacct_wpcopy_end(void) ¤t->delays->wpcopy_delay, ¤t->delays->wpcopy_count); } +#else +#include + +int delayacct_enabled __read_mostly; /* Delay accounting turned on/off */ +bool get_delayacct_enabled(void) +{ + return delayacct_enabled; +} + +void set_delayacct_enabled(bool enabled) +{ + delayacct_enabled = enabled; +} +EXPORT_SYMBOL_GPL(set_delayacct_enabled); + +void _trace_android_rvh_delayacct_init(void) +{ + trace_android_rvh_delayacct_init(NULL); +} + +void _trace_android_rvh_delayacct_tsk_init(struct task_struct *tsk) +{ + trace_android_rvh_delayacct_tsk_init(tsk); +} + +void _trace_android_rvh_delayacct_tsk_free(struct task_struct *tsk) +{ + trace_android_rvh_delayacct_tsk_free(tsk); +} + +void _trace_android_vh_delayacct_blkio_start(void) +{ + trace_android_vh_delayacct_blkio_start(NULL); +} + +void _trace_android_vh_delayacct_blkio_end(struct task_struct *p) +{ + trace_android_vh_delayacct_blkio_end(p); +} + +void _trace_android_vh_delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk, int *ret) +{ + trace_android_vh_delayacct_add_tsk(d, tsk, ret); +} + +void _trace_android_vh_delayacct_blkio_ticks(struct task_struct *tsk, __u64 *ret) +{ + trace_android_vh_delayacct_blkio_ticks(tsk, ret); +} + +void _trace_android_vh_delayacct_freepages_start(void) +{ + trace_android_vh_delayacct_freepages_start(NULL); +} + +void _trace_android_vh_delayacct_freepages_end(void) +{ + trace_android_vh_delayacct_freepages_end(NULL); +} + +void _trace_android_vh_delayacct_thrashing_start(bool *in_thrashing) +{ + trace_android_vh_delayacct_thrashing_start(in_thrashing); +} + +void _trace_android_vh_delayacct_thrashing_end(bool *in_thrashing) +{ + trace_android_vh_delayacct_thrashing_end(in_thrashing); +} + +void _trace_android_vh_delayacct_swapin_start(void) +{ + trace_android_vh_delayacct_swapin_start(NULL); +} + +void _trace_android_vh_delayacct_swapin_end(void) +{ + trace_android_vh_delayacct_swapin_end(NULL); +} + +void _trace_android_vh_delayacct_compact_start(void) +{ + trace_android_vh_delayacct_compact_start(NULL); +} + +void _trace_android_vh_delayacct_compact_end(void) +{ + trace_android_vh_delayacct_compact_end(NULL); +} + +void _trace_android_vh_delayacct_wpcopy_start(void) +{ + trace_android_vh_delayacct_wpcopy_start(NULL); +} + +void _trace_android_vh_delayacct_wpcopy_end(void) +{ + trace_android_vh_delayacct_wpcopy_end(NULL); +} + +#endif + From 0832777c62bbb57640229b579a7331f4aac2d437 Mon Sep 17 00:00:00 2001 From: Dongyun Liu Date: Fri, 8 Dec 2023 12:39:40 +0800 Subject: [PATCH 026/111] ANDROID: GKI: Update symbol list for transsion 18 function symbol(s) added 'int __traceiter_android_rvh_delayacct_init(void *, void *)' 'int __traceiter_android_rvh_delayacct_tsk_free(void *, struct task_struct *)' 'int __traceiter_android_rvh_delayacct_tsk_init(void *, struct task_struct *)' 'int __traceiter_android_vh_delayacct_add_tsk(void *, struct taskstats *, struct task_struct *, int *)' 'int __traceiter_android_vh_delayacct_blkio_end(void *, struct task_struct *)' 'int __traceiter_android_vh_delayacct_blkio_start(void *, void *)' 'int __traceiter_android_vh_delayacct_blkio_ticks(void *, struct task_struct *, __u64 *)' 'int __traceiter_android_vh_delayacct_freepages_end(void *, void *)' 'int __traceiter_android_vh_delayacct_freepages_start(void *, void *)' 'int __traceiter_android_vh_delayacct_thrashing_end(void *, bool *)' 'int __traceiter_android_vh_delayacct_thrashing_start(void *, bool *)' 'int __traceiter_android_vh_delayacct_swapin_start(void *, void *)' 'int __traceiter_android_vh_delayacct_swapin_end(void *, void *)' 'int __traceiter_android_vh_delayacct_compact_start(void *, void *)' 'int __traceiter_android_vh_delayacct_compact_end(void *, void *)' 'int __traceiter_android_vh_delayacct_wpcopy_start(void *, void *)' 'int __traceiter_android_vh_delayacct_wpcopy_end(void *, void *) 'void set_delayacct_enabled(bool)' 17 variable symbol(s) added 'struct tracepoint __tracepoint_android_rvh_delayacct_init' 'struct tracepoint __tracepoint_android_rvh_delayacct_tsk_free' 'struct tracepoint __tracepoint_android_rvh_delayacct_tsk_init' 'struct tracepoint __tracepoint_android_vh_delayacct_add_tsk' 'struct tracepoint __tracepoint_android_vh_delayacct_blkio_end' 'struct tracepoint __tracepoint_android_vh_delayacct_blkio_start' 'struct tracepoint __tracepoint_android_vh_delayacct_blkio_ticks' 'struct tracepoint __tracepoint_android_vh_delayacct_freepages_end' 'struct tracepoint __tracepoint_android_vh_delayacct_freepages_start' 'struct tracepoint __tracepoint_android_vh_delayacct_thrashing_end' 'struct tracepoint __tracepoint_android_vh_delayacct_thrashing_start' 'struct tracepoint __tracepoint_android_vh_delayacct_swapin_start' 'struct tracepoint __tracepoint_android_vh_delayacct_swapin_end' 'struct tracepoint __tracepoint_android_vh_delayacct_compact_start' 'struct tracepoint __tracepoint_android_vh_delayacct_compact_end' 'struct tracepoint __tracepoint_android_vh_delayacct_wpcopy_start' 'struct tracepoint __tracepoint_android_vh_delayacct_wpcopy_end' Bug: 327566572 Bug: 310129610 Bug: 314931189 Change-Id: I82b8eb372d6a9193f70d8e2ddb1a2ef2b9b6e4e4 Signed-off-by: Dongyun Liu (cherry picked from commit 34d95b5fde142fadf010bf1156228c09ec951cce) (cherry picked from commit ab6f88aebe2fc11299ab6da38ff960cdf785b050) --- android/abi_gki_aarch64_transsion | 37 +++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 android/abi_gki_aarch64_transsion diff --git a/android/abi_gki_aarch64_transsion b/android/abi_gki_aarch64_transsion new file mode 100644 index 000000000000..8c12042322ce --- /dev/null +++ b/android/abi_gki_aarch64_transsion @@ -0,0 +1,37 @@ +[abi_symbol_list] +# required by delayacct + set_delayacct_enabled + __traceiter_android_rvh_delayacct_init + __traceiter_android_rvh_delayacct_tsk_init + __traceiter_android_rvh_delayacct_tsk_free + __traceiter_android_vh_delayacct_blkio_start + __traceiter_android_vh_delayacct_blkio_end + __traceiter_android_vh_delayacct_add_tsk + __traceiter_android_vh_delayacct_blkio_ticks + __traceiter_android_vh_delayacct_freepages_start + __traceiter_android_vh_delayacct_freepages_end + __traceiter_android_vh_delayacct_thrashing_start + __traceiter_android_vh_delayacct_thrashing_end + __traceiter_android_vh_delayacct_swapin_start + __traceiter_android_vh_delayacct_swapin_end + __traceiter_android_vh_delayacct_compact_start + __traceiter_android_vh_delayacct_compact_end + __traceiter_android_vh_delayacct_wpcopy_start + __traceiter_android_vh_delayacct_wpcopy_end + __tracepoint_android_rvh_delayacct_init + __tracepoint_android_rvh_delayacct_tsk_init + __tracepoint_android_rvh_delayacct_tsk_free + __tracepoint_android_vh_delayacct_blkio_start + __tracepoint_android_vh_delayacct_blkio_end + __tracepoint_android_vh_delayacct_add_tsk + __tracepoint_android_vh_delayacct_blkio_ticks + __tracepoint_android_vh_delayacct_freepages_start + __tracepoint_android_vh_delayacct_freepages_end + __tracepoint_android_vh_delayacct_thrashing_start + __tracepoint_android_vh_delayacct_thrashing_end + __tracepoint_android_vh_delayacct_swapin_start + __tracepoint_android_vh_delayacct_swapin_end + __tracepoint_android_vh_delayacct_compact_start + __tracepoint_android_vh_delayacct_compact_end + __tracepoint_android_vh_delayacct_wpcopy_start + __tracepoint_android_vh_delayacct_wpcopy_end From 09ca5740fbbe445af407b1db7ceb5c53c191fe74 Mon Sep 17 00:00:00 2001 From: Andre Ding Date: Tue, 20 Feb 2024 17:35:30 +0800 Subject: [PATCH 027/111] ANDROID: abi_gki_aarch64_qcom: Update symbol list Symbols updated to QCOM abi symbol list for Toshiba EMAC: clk_unregister_fixed_rate get_phy_device __hw_addr_sync_dev netdev_features_change pcie_capability_read_dword phy_device_free phy_device_register phy_loopback phy_lookup_setting phy_restart_aneg Bug: 325987248 Change-Id: I0f4a1070283f2e9c98df4de9da0660e572a7826e Signed-off-by: Andre Ding --- android/abi_gki_aarch64.stg | 173 +++++++++++++++++++++++++++++++++++ android/abi_gki_aarch64_qcom | 10 ++ 2 files changed, 183 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index bd57143ada8c..6cb2bcdc5016 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -20608,6 +20608,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0x91c734c3 } +pointer_reference { + id: 0x2ee22f06 + kind: POINTER + pointee_type_id: 0x91c85a84 +} pointer_reference { id: 0x2ee2a594 kind: POINTER @@ -25428,6 +25433,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0xf013a996 } +pointer_reference { + id: 0x3695f49b + kind: POINTER + pointee_type_id: 0xf01734f2 +} pointer_reference { id: 0x369662d6 kind: POINTER @@ -34563,6 +34573,11 @@ qualified { qualifier: CONST qualified_type_id: 0xb00910d2 } +qualified { + id: 0xf01734f2 + qualifier: CONST + qualified_type_id: 0xb01b6540 +} qualified { id: 0xf02f20a3 qualifier: CONST @@ -53901,6 +53916,12 @@ member { type_id: 0xc9082b19 offset: 64 } +member { + id: 0x13b29d75 + name: "bit" + type_id: 0x295c7202 + offset: 40 +} member { id: 0xdd1aee2e name: "bit_count" @@ -80813,6 +80834,12 @@ member { type_id: 0xb3e7bac9 offset: 64 } +member { + id: 0x70a3bdf2 + name: "duplex" + type_id: 0x295c7202 + offset: 32 +} member { id: 0x70edc607 name: "duplex" @@ -180975,6 +181002,11 @@ member { type_id: 0xe62ebf07 offset: 32 } +member { + id: 0xa02385f2 + name: "speed" + type_id: 0xc9082b19 +} member { id: 0xa08da031 name: "speed" @@ -247628,6 +247660,17 @@ struct_union { member_id: 0x4a5fda2e } } +struct_union { + id: 0xb01b6540 + kind: STRUCT + name: "phy_setting" + definition { + bytesize: 8 + member_id: 0xa02385f2 + member_id: 0x70a3bdf2 + member_id: 0x13b29d75 + } +} struct_union { id: 0x5af8c6c3 kind: STRUCT @@ -315205,6 +315248,13 @@ function { parameter_id: 0x20007040 parameter_id: 0x2cacacc0 } +function { + id: 0x986bf57c + return_type_id: 0x6720d32f + parameter_id: 0x11e6864c + parameter_id: 0x6720d32f + parameter_id: 0x38d23361 +} function { id: 0x986ccce1 return_type_id: 0x6720d32f @@ -318690,6 +318740,14 @@ function { parameter_id: 0x1d19a9d5 parameter_id: 0x13580d6c } +function { + id: 0x9b10e1e5 + return_type_id: 0x6720d32f + parameter_id: 0x19466519 + parameter_id: 0x32a623d7 + parameter_id: 0x2ee22f06 + parameter_id: 0x2ee22f06 +} function { id: 0x9b110126 return_type_id: 0x6720d32f @@ -330226,6 +330284,13 @@ function { parameter_id: 0x0206e690 parameter_id: 0x92233392 } +function { + id: 0xbf2cc0f8 + return_type_id: 0x3176a085 + parameter_id: 0x35d510c3 + parameter_id: 0x6720d32f + parameter_id: 0x6d7f5ff6 +} function { id: 0xbf379f2f return_type_id: 0x3176a085 @@ -331739,6 +331804,14 @@ function { parameter_id: 0x4585663f parameter_id: 0x4585663f } +function { + id: 0xe50a8d7f + return_type_id: 0x3695f49b + parameter_id: 0x6720d32f + parameter_id: 0x6720d32f + parameter_id: 0x3ea31487 + parameter_id: 0x6d7f5ff6 +} function { id: 0xe543d9ca return_type_id: 0x2e8ad82b @@ -335454,6 +335527,15 @@ elf_symbol { type_id: 0x9badabc9 full_name: "__hw_addr_sync" } +elf_symbol { + id: 0x58de7795 + name: "__hw_addr_sync_dev" + is_defined: true + symbol_type: FUNCTION + crc: 0x6d8ce1ae + type_id: 0x9b10e1e5 + full_name: "__hw_addr_sync_dev" +} elf_symbol { id: 0x7874d435 name: "__hw_addr_unsync" @@ -350623,6 +350705,15 @@ elf_symbol { type_id: 0x1febeb84 full_name: "clk_unregister" } +elf_symbol { + id: 0x40da6f1f + name: "clk_unregister_fixed_rate" + is_defined: true + symbol_type: FUNCTION + crc: 0x52252316 + type_id: 0x1febeb84 + full_name: "clk_unregister_fixed_rate" +} elf_symbol { id: 0xdf9b5d08 name: "clkdev_add" @@ -364734,6 +364825,15 @@ elf_symbol { type_id: 0x3ec9e358 full_name: "get_pfnblock_flags_mask" } +elf_symbol { + id: 0xde4e3c15 + name: "get_phy_device" + is_defined: true + symbol_type: FUNCTION + crc: 0x8b134616 + type_id: 0xbf2cc0f8 + full_name: "get_phy_device" +} elf_symbol { id: 0x475d45f1 name: "get_pid_task" @@ -374974,6 +375074,15 @@ elf_symbol { type_id: 0x1caf28d1 full_name: "netdev_err" } +elf_symbol { + id: 0xeb2d9bd2 + name: "netdev_features_change" + is_defined: true + symbol_type: FUNCTION + crc: 0xa3305277 + type_id: 0x1c31d966 + full_name: "netdev_features_change" +} elf_symbol { id: 0x1a34a34f name: "netdev_increment_features" @@ -379108,6 +379217,15 @@ elf_symbol { type_id: 0x9843d7a9 full_name: "pcie_capability_clear_and_set_word" } +elf_symbol { + id: 0x34e52832 + name: "pcie_capability_read_dword" + is_defined: true + symbol_type: FUNCTION + crc: 0xa71b4afb + type_id: 0x986bf57c + full_name: "pcie_capability_read_dword" +} elf_symbol { id: 0xf1513a2c name: "pcie_capability_read_word" @@ -379495,6 +379613,24 @@ elf_symbol { type_id: 0x91ec6dfe full_name: "phy_connect_direct" } +elf_symbol { + id: 0x5b3ff607 + name: "phy_device_free" + is_defined: true + symbol_type: FUNCTION + crc: 0x13f10609 + type_id: 0x1cc5f9b2 + full_name: "phy_device_free" +} +elf_symbol { + id: 0x3d4eb5a9 + name: "phy_device_register" + is_defined: true + symbol_type: FUNCTION + crc: 0x3fdd0031 + type_id: 0x91dd4b0e + full_name: "phy_device_register" +} elf_symbol { id: 0x5ebc16d0 name: "phy_disconnect" @@ -379684,6 +379820,24 @@ elf_symbol { type_id: 0x91dd4b0e full_name: "phy_init_hw" } +elf_symbol { + id: 0xf708e277 + name: "phy_lookup_setting" + is_defined: true + symbol_type: FUNCTION + crc: 0x06209f49 + type_id: 0xe50a8d7f + full_name: "phy_lookup_setting" +} +elf_symbol { + id: 0xe099752c + name: "phy_loopback" + is_defined: true + symbol_type: FUNCTION + crc: 0x6aae8158 + type_id: 0x9068b671 + full_name: "phy_loopback" +} elf_symbol { id: 0xac520589 name: "phy_mac_interrupt" @@ -379900,6 +380054,15 @@ elf_symbol { type_id: 0x1cc5f9b2 full_name: "phy_resolve_aneg_pause" } +elf_symbol { + id: 0x509ad286 + name: "phy_restart_aneg" + is_defined: true + symbol_type: FUNCTION + crc: 0xb6412952 + type_id: 0x91dd4b0e + full_name: "phy_restart_aneg" +} elf_symbol { id: 0x409cd326 name: "phy_restore_page" @@ -402665,6 +402828,7 @@ interface { symbol_id: 0x74b9825e symbol_id: 0xd672e937 symbol_id: 0xa5f1f300 + symbol_id: 0x58de7795 symbol_id: 0x7874d435 symbol_id: 0xc1db2428 symbol_id: 0x09a111a4 @@ -404351,6 +404515,7 @@ interface { symbol_id: 0x7fbd0d58 symbol_id: 0x06f2ea68 symbol_id: 0xc8e117f2 + symbol_id: 0x40da6f1f symbol_id: 0xdf9b5d08 symbol_id: 0x56748a0b symbol_id: 0x430bfeda @@ -405917,6 +406082,7 @@ interface { symbol_id: 0xb3083c09 symbol_id: 0x3746f7a2 symbol_id: 0x7fafe916 + symbol_id: 0xde4e3c15 symbol_id: 0x475d45f1 symbol_id: 0x8f644487 symbol_id: 0xbc123b47 @@ -407055,6 +407221,7 @@ interface { symbol_id: 0x2a20c876 symbol_id: 0x6c72efe1 symbol_id: 0xfac0e8e6 + symbol_id: 0xeb2d9bd2 symbol_id: 0x1a34a34f symbol_id: 0x06bf2dbd symbol_id: 0x5a4e487e @@ -407514,6 +407681,7 @@ interface { symbol_id: 0x52200b18 symbol_id: 0x0ce26450 symbol_id: 0x141fdc1f + symbol_id: 0x34e52832 symbol_id: 0xf1513a2c symbol_id: 0x1070f731 symbol_id: 0xb7c9d0b8 @@ -407557,6 +407725,8 @@ interface { symbol_id: 0xc278f4fa symbol_id: 0x9c15bd7a symbol_id: 0x866cf90c + symbol_id: 0x5b3ff607 + symbol_id: 0x3d4eb5a9 symbol_id: 0x5ebc16d0 symbol_id: 0xb39736f6 symbol_id: 0x9d35d830 @@ -407578,6 +407748,8 @@ interface { symbol_id: 0x30e87de6 symbol_id: 0x6fc1e83f symbol_id: 0x0e1df21c + symbol_id: 0xf708e277 + symbol_id: 0xe099752c symbol_id: 0xac520589 symbol_id: 0x2eeef935 symbol_id: 0xce039362 @@ -407602,6 +407774,7 @@ interface { symbol_id: 0xd306839f symbol_id: 0x8fff831c symbol_id: 0x61290d1f + symbol_id: 0x509ad286 symbol_id: 0x409cd326 symbol_id: 0x16bb21a4 symbol_id: 0x0ccd2ae9 diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom index 3bbde23655fc..da4958245f91 100644 --- a/android/abi_gki_aarch64_qcom +++ b/android/abi_gki_aarch64_qcom @@ -308,6 +308,7 @@ clk_set_rate clk_sync_state clk_unprepare + clk_unregister_fixed_rate close_candev close_fd cma_alloc @@ -1247,6 +1248,7 @@ get_page_owner_handle get_pfnblock_flags_mask get_pid_task + get_phy_device get_random_bytes get_random_u16 get_random_u32 @@ -1392,6 +1394,7 @@ __hvc_resize __hw_addr_init __hw_addr_sync + __hw_addr_sync_dev __hw_addr_unsync hwrng_register hwrng_unregister @@ -2017,6 +2020,7 @@ netdev_change_features netdev_core_stats_alloc netdev_err + netdev_features_change netdev_increment_features netdev_info netdev_lower_state_changed @@ -2277,6 +2281,7 @@ pci_disable_device pci_disable_msi pcie_capability_clear_and_set_word + pcie_capability_read_dword pcie_capability_read_word pci_enable_device pci_enable_pcie_error_reporting @@ -2332,6 +2337,8 @@ perf_trace_run_bpf_submit phy_attached_info phy_calibrate + phy_device_free + phy_device_register phy_do_ioctl_running phy_drivers_register phy_drivers_unregister @@ -2342,6 +2349,8 @@ phy_init phy_init_eee phy_init_hw + phy_loopback + phy_lookup_setting phylink_connect_phy phylink_create phylink_destroy @@ -2379,6 +2388,7 @@ phy_power_on phy_read_mmd phy_resolve_aneg_linkmode + phy_restart_aneg phy_set_max_speed phy_set_mode_ext phy_suspend From e61a6ec29a752fe172fd846210a249821eb97791 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Thu, 29 Feb 2024 01:26:25 +0000 Subject: [PATCH 028/111] ANDROID: add symbol list for fips140 module Add the missing fips140_abi build target. Then, create the fips140 symbol list by running the following command: tools/bazel run //common:fips140_abi_update_symbol_list Then, update the stg file by running: tools/bazel run //common:kernel_aarch64_abi_dist tools/bazel run //common:kernel_aarch64_abi_update_symbol_list tools/bazel run //common:kernel_aarch64_abi_update INFO: 36 function symbol(s) added 'int __traceiter_android_vh_aes_decrypt(void*, const struct crypto_aes_ctx*, u8*, const u8*, int*)' 'int __traceiter_android_vh_aes_encrypt(void*, const struct crypto_aes_ctx*, u8*, const u8*, int*)' 'int __traceiter_android_vh_aes_expandkey(void*, struct crypto_aes_ctx*, const u8*, unsigned int, int*)' 'int __traceiter_android_vh_sha256(void*, const u8*, unsigned int, u8*, int*)' 'int aead_register_instance(struct crypto_template*, struct aead_instance*)' 'int ahash_register_instance(struct crypto_template*, struct ahash_instance*)' 'struct crypto_rng* crypto_alloc_rng(const char*, u32, u32)' 'const char* crypto_attr_alg_name(struct rtattr*)' 'int crypto_check_attr_type(struct rtattr**, u32, u32*)' 'int crypto_cipher_setkey(struct crypto_cipher*, const u8*, unsigned int)' 'void crypto_drop_spawn(struct crypto_spawn*)' 'struct crypto_sync_skcipher* crypto_get_default_null_skcipher()' 'int crypto_grab_aead(struct crypto_aead_spawn*, struct crypto_instance*, const char*, u32, u32)' 'int crypto_grab_ahash(struct crypto_ahash_spawn*, struct crypto_instance*, const char*, u32, u32)' 'int crypto_grab_shash(struct crypto_shash_spawn*, struct crypto_instance*, const char*, u32, u32)' 'int crypto_grab_skcipher(struct crypto_skcipher_spawn*, struct crypto_instance*, const char*, u32, u32)' 'int crypto_grab_spawn(struct crypto_spawn*, struct crypto_instance*, const char*, u32, u32)' 'int crypto_inst_setname(struct crypto_instance*, const char*, struct crypto_alg*)' 'void crypto_put_default_null_skcipher()' 'int crypto_register_aeads(struct aead_alg*, int)' 'int crypto_register_ahashes(struct ahash_alg*, int)' 'int crypto_register_algs(struct crypto_alg*, int)' 'int crypto_register_shashes(struct shash_alg*, int)' 'int crypto_register_skciphers(struct skcipher_alg*, int)' 'int crypto_register_templates(struct crypto_template*, int)' 'void crypto_remove_spawns(struct crypto_alg*, struct list_head*, struct crypto_alg*)' 'int crypto_rng_reset(struct crypto_rng*, const u8*, unsigned int)' 'bool crypto_shash_alg_has_setkey(struct shash_alg*)' 'struct crypto_tfm* crypto_spawn_tfm(struct crypto_spawn*, u32, u32)' 'void* crypto_spawn_tfm2(struct crypto_spawn*)' 'void crypto_unregister_shashes(struct shash_alg*, int)' 'void crypto_unregister_skciphers(struct skcipher_alg*, int)' 'void crypto_unregister_templates(struct crypto_template*, int)' 'bool rng_is_initialized()' 'void shash_free_singlespawn_instance(struct shash_instance*)' 'int shash_register_instance(struct crypto_template*, struct shash_instance*)' 6 variable symbol(s) added 'struct tracepoint __tracepoint_android_vh_aes_decrypt' 'struct tracepoint __tracepoint_android_vh_aes_encrypt' 'struct tracepoint __tracepoint_android_vh_aes_expandkey' 'struct tracepoint __tracepoint_android_vh_sha256' 'struct list_head crypto_alg_list' 'struct rw_semaphore crypto_alg_sem' Bug: 188620248 Change-Id: I95931f8f3710a4f0a5b642e1c9f7299b72616972 Signed-off-by: Eric Biggers --- BUILD.bazel | 8 + android/abi_gki_aarch64.stg | 869 ++++++++++++++++++++++++++++++++ android/abi_gki_aarch64_fips140 | 145 ++++++ 3 files changed, 1022 insertions(+) create mode 100644 android/abi_gki_aarch64_fips140 diff --git a/BUILD.bazel b/BUILD.bazel index 822e7fa689cd..ed2077ed59b8 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -104,6 +104,7 @@ filegroup( "android/abi_gki_aarch64_db845c", "android/abi_gki_aarch64_exynos", "android/abi_gki_aarch64_exynosauto", + "android/abi_gki_aarch64_fips140", "android/abi_gki_aarch64_galaxy", "android/abi_gki_aarch64_honda", "android/abi_gki_aarch64_honor", @@ -715,9 +716,16 @@ kernel_build( outs = [], base_kernel = ":kernel_aarch64", build_config = "build.config.gki.aarch64.fips140", + kmi_symbol_list = "android/abi_gki_aarch64_fips140", module_outs = ["crypto/fips140.ko"], ) +kernel_abi( + name = "fips140_abi", + kernel_build = ":fips140", + kmi_symbol_list_add_only = True, +) + copy_to_dist_dir( name = "fips140_dist", data = [ diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 6cb2bcdc5016..168e288b8108 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -3393,6 +3393,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0x1ae9d1bd } +pointer_reference { + id: 0x0c2bd8e3 + kind: POINTER + pointee_type_id: 0x1aef8512 +} pointer_reference { id: 0x0c2e195c kind: POINTER @@ -4748,6 +4753,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0x1f0fd39d } +pointer_reference { + id: 0x0d53f428 + kind: POINTER + pointee_type_id: 0x1f0f363d +} pointer_reference { id: 0x0d5547d5 kind: POINTER @@ -5538,6 +5548,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0x1dad5a2a } +pointer_reference { + id: 0x0dfbab12 + kind: POINTER + pointee_type_id: 0x1dae4ad4 +} pointer_reference { id: 0x0dfd7a00 kind: POINTER @@ -7748,6 +7763,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0x157aa231 } +pointer_reference { + id: 0x0fcecb94 + kind: POINTER + pointee_type_id: 0x157bc8cc +} pointer_reference { id: 0x0fd14d12 kind: POINTER @@ -13423,6 +13443,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0x8d38c78e } +pointer_reference { + id: 0x29df5204 + kind: POINTER + pointee_type_id: 0x8d3dae8e +} pointer_reference { id: 0x29e9cbd8 kind: POINTER @@ -24653,6 +24678,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0xf91eb689 } +pointer_reference { + id: 0x34d86d1c + kind: POINTER + pointee_type_id: 0xf92152ec +} pointer_reference { id: 0x34dbb6d7 kind: POINTER @@ -24813,6 +24843,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0xfeeea03f } +pointer_reference { + id: 0x352e53fa + kind: POINTER + pointee_type_id: 0xfef9a975 +} pointer_reference { id: 0x35304fb1 kind: POINTER @@ -27348,6 +27383,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0xc0843ed1 } +pointer_reference { + id: 0x3ab2afcb + kind: POINTER + pointee_type_id: 0xc08a59b2 +} pointer_reference { id: 0x3ab47ff9 kind: POINTER @@ -28333,6 +28373,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0xde0d753a } +pointer_reference { + id: 0x3d14c96b + kind: POINTER + pointee_type_id: 0xde13c333 +} pointer_reference { id: 0x3d1ec847 kind: POINTER @@ -28903,6 +28948,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0xd327a107 } +pointer_reference { + id: 0x3e5d9ebb + kind: POINTER + pointee_type_id: 0xd3369c71 +} pointer_reference { id: 0x3e600958 kind: POINTER @@ -36252,6 +36302,11 @@ array { number_of_elements: 2 element_type_id: 0x92233392 } +array { + id: 0x489cdd32 + number_of_elements: 192 + element_type_id: 0x384f7d7c +} array { id: 0x48aeeb39 number_of_elements: 2 @@ -39460,6 +39515,21 @@ member { type_id: 0x4f2326f3 offset: 1280 } +member { + id: 0x300b2096 + type_id: 0x4f02de2a + offset: 512 +} +member { + id: 0x300b20e1 + type_id: 0x4f02dff7 + offset: 512 +} +member { + id: 0x300b2aaf + type_id: 0x4f02f6cc + offset: 512 +} member { id: 0x300b2d2f type_id: 0x4f02e8cc @@ -45164,6 +45234,11 @@ member { type_id: 0x6720d32f offset: 576 } +member { + id: 0x270f3232 + name: "alg" + type_id: 0xa2be2e87 +} member { id: 0x2777335c name: "alg" @@ -45180,6 +45255,16 @@ member { type_id: 0x00defc2c offset: 128 } +member { + id: 0x27b1e24e + name: "alg" + type_id: 0x1c6e5215 +} +member { + id: 0x27b6977d + name: "alg" + type_id: 0x1b1b6127 +} member { id: 0xc3ae1168 name: "alg_icv_len" @@ -52407,6 +52492,12 @@ member { name: "base" type_id: 0xed62338c } +member { + id: 0x8544c80b + name: "base" + type_id: 0x9e2c67f2 + offset: 1536 +} member { id: 0x8544c9f4 name: "base" @@ -52595,6 +52686,11 @@ member { name: "base" type_id: 0x27253e64 } +member { + id: 0x85fdf55a + name: "base" + type_id: 0x271bd1e1 +} member { id: 0xf93eb8d5 name: "base_addr" @@ -93160,6 +93256,11 @@ member { type_id: 0x0f7ddf45 offset: 384 } +member { + id: 0xfeae230b + name: "free" + type_id: 0x0c2bd8e3 +} member { id: 0xfeae4b02 name: "free" @@ -93200,6 +93301,11 @@ member { type_id: 0x0d364e53 offset: 320 } +member { + id: 0xfeaf5b27 + name: "free" + type_id: 0x0d53f428 +} member { id: 0xfeafbaf6 name: "free" @@ -93211,6 +93317,11 @@ member { type_id: 0x0dcbeae6 offset: 1664 } +member { + id: 0xfeaff378 + name: "free" + type_id: 0x0dfbab12 +} member { id: 0xfbc061e4 name: "free_area" @@ -99934,6 +100045,11 @@ member { name: "head" type_id: 0x5fb59157 } +member { + id: 0xb51225dc + name: "head" + type_id: 0x489cdd32 +} member { id: 0xb51f3196 name: "head" @@ -170215,6 +170331,11 @@ member { name: "s" type_id: 0x3514d59f } +member { + id: 0x67c7be4e + name: "s" + type_id: 0x35099c9e +} member { id: 0x67c839a9 name: "s" @@ -212442,6 +212563,15 @@ struct_union { member_id: 0x8f0ea6b7 } } +struct_union { + id: 0x35099c9e + kind: STRUCT + definition { + bytesize: 640 + member_id: 0xb51225dc + member_id: 0x8544c80b + } +} struct_union { id: 0x3514d59f kind: STRUCT @@ -213780,6 +213910,24 @@ struct_union { member_id: 0x8fed16f2 } } +struct_union { + id: 0x4f02de2a + kind: UNION + definition { + bytesize: 640 + member_id: 0x67c7be4e + member_id: 0x27b1e24e + } +} +struct_union { + id: 0x4f02dff7 + kind: UNION + definition { + bytesize: 640 + member_id: 0x67c7be4e + member_id: 0x27b6977d + } +} struct_union { id: 0x4f02e8cc kind: UNION @@ -213789,6 +213937,15 @@ struct_union { member_id: 0x2777335c } } +struct_union { + id: 0x4f02f6cc + kind: UNION + definition { + bytesize: 512 + member_id: 0x67c7a307 + member_id: 0x270f3232 + } +} struct_union { id: 0x4f03a6ae kind: UNION @@ -216964,6 +217121,16 @@ struct_union { member_id: 0x85f3de85 } } +struct_union { + id: 0x8d3dae8e + kind: STRUCT + name: "aead_instance" + definition { + bytesize: 576 + member_id: 0xfeae230b + member_id: 0x300b2aaf + } +} struct_union { id: 0xe2a4c51e kind: STRUCT @@ -217028,6 +217195,16 @@ struct_union { member_id: 0xae60b70a } } +struct_union { + id: 0xd3369c71 + kind: STRUCT + name: "ahash_instance" + definition { + bytesize: 704 + member_id: 0xfeaf5b27 + member_id: 0x300b2096 + } +} struct_union { id: 0xe316ef9b kind: STRUCT @@ -222980,6 +223157,15 @@ struct_union { member_id: 0x8597b564 } } +struct_union { + id: 0xc08a59b2 + kind: STRUCT + name: "crypto_aead_spawn" + definition { + bytesize: 48 + member_id: 0x85fdf55a + } +} struct_union { id: 0x7ebccaf7 kind: STRUCT @@ -223009,6 +223195,15 @@ struct_union { member_id: 0x8597b963 } } +struct_union { + id: 0xde13c333 + kind: STRUCT + name: "crypto_ahash_spawn" + definition { + bytesize: 48 + member_id: 0x85fdf55a + } +} struct_union { id: 0x0f57eec7 kind: STRUCT @@ -223125,6 +223320,15 @@ struct_union { member_id: 0x8597b564 } } +struct_union { + id: 0xfef9a975 + kind: STRUCT + name: "crypto_shash_spawn" + definition { + bytesize: 48 + member_id: 0x85fdf55a + } +} struct_union { id: 0x1b619644 kind: STRUCT @@ -223135,6 +223339,15 @@ struct_union { member_id: 0x8597b564 } } +struct_union { + id: 0x157bc8cc + kind: STRUCT + name: "crypto_skcipher_spawn" + definition { + bytesize: 48 + member_id: 0x85fdf55a + } +} struct_union { id: 0x271bd1e1 kind: STRUCT @@ -254727,6 +254940,16 @@ struct_union { member_id: 0x759069c8 } } +struct_union { + id: 0xf92152ec + kind: STRUCT + name: "shash_instance" + definition { + bytesize: 704 + member_id: 0xfeaff378 + member_id: 0x300b20e1 + } +} struct_union { id: 0x993d1b03 kind: STRUCT @@ -289485,6 +289708,11 @@ function { return_type_id: 0x48b5725f parameter_id: 0x0357d2dd } +function { + id: 0x104de2e4 + return_type_id: 0x48b5725f + parameter_id: 0x0356cddf +} function { id: 0x104de9a9 return_type_id: 0x48b5725f @@ -289570,6 +289798,13 @@ function { parameter_id: 0x00c83ba6 parameter_id: 0x3f1a5886 } +function { + id: 0x105651c0 + return_type_id: 0x48b5725f + parameter_id: 0x00defc2c + parameter_id: 0x3e6239e1 + parameter_id: 0x00defc2c +} function { id: 0x10570899 return_type_id: 0x48b5725f @@ -291020,6 +291255,12 @@ function { return_type_id: 0x48b5725f parameter_id: 0x0a22a423 } +function { + id: 0x12116aa4 + return_type_id: 0x48b5725f + parameter_id: 0x0c56e1ee + parameter_id: 0x6720d32f +} function { id: 0x1213f72a return_type_id: 0x48b5725f @@ -294436,6 +294677,12 @@ function { return_type_id: 0x48b5725f parameter_id: 0x19c40476 } +function { + id: 0x16ea4d90 + return_type_id: 0x48b5725f + parameter_id: 0x1fba7d3d + parameter_id: 0x6720d32f +} function { id: 0x16ebcbfa return_type_id: 0x48b5725f @@ -296543,6 +296790,11 @@ function { return_type_id: 0x48b5725f parameter_id: 0x29d29128 } +function { + id: 0x1aef8512 + return_type_id: 0x48b5725f + parameter_id: 0x29df5204 +} function { id: 0x1af18e52 return_type_id: 0x48b5725f @@ -298482,6 +298734,11 @@ function { parameter_id: 0x32a623d7 parameter_id: 0x6720d32f } +function { + id: 0x1dae4ad4 + return_type_id: 0x48b5725f + parameter_id: 0x34d86d1c +} function { id: 0x1db066c6 return_type_id: 0x3411dbb1 @@ -298704,6 +298961,12 @@ function { parameter_id: 0x12e6ffae parameter_id: 0x6d7f5ff6 } +function { + id: 0x1e0b28b6 + return_type_id: 0x48b5725f + parameter_id: 0x3c3fe9a7 + parameter_id: 0x6720d32f +} function { id: 0x1e0b6efe return_type_id: 0x48b5725f @@ -299701,6 +299964,11 @@ function { parameter_id: 0xe276adef parameter_id: 0x6d7f5ff6 } +function { + id: 0x1f0f363d + return_type_id: 0x48b5725f + parameter_id: 0x3e5d9ebb +} function { id: 0x1f0fd39d return_type_id: 0x48b5725f @@ -301983,6 +302251,10 @@ function { return_type_id: 0x33756485 parameter_id: 0x31675062 } +function { + id: 0x3e015618 + return_type_id: 0x2fb495bb +} function { id: 0x3e17424c return_type_id: 0x33756485 @@ -303275,6 +303547,11 @@ function { parameter_id: 0x052fac00 parameter_id: 0x6720d32f } +function { + id: 0x56430286 + return_type_id: 0x18bd6530 + parameter_id: 0x0356cddf +} function { id: 0x5659e8fb return_type_id: 0x18bd6530 @@ -305422,6 +305699,13 @@ function { parameter_id: 0x3cb1656a parameter_id: 0x0b27dc43 } +function { + id: 0x7f0da6b7 + return_type_id: 0x3c9ce28f + parameter_id: 0x3e10b518 + parameter_id: 0xc9082b19 + parameter_id: 0xc9082b19 +} function { id: 0x7f0f4bf3 return_type_id: 0x1d19a9d5 @@ -306163,6 +306447,13 @@ function { parameter_id: 0x6720d32f parameter_id: 0x0b553223 } +function { + id: 0x8a129bb5 + return_type_id: 0x19c40476 + parameter_id: 0x0356cddf + parameter_id: 0xc9082b19 + parameter_id: 0xc9082b19 +} function { id: 0x8a23f6d7 return_type_id: 0x1e2533ab @@ -307033,6 +307324,15 @@ function { parameter_id: 0x914dbfdc parameter_id: 0x914dbfdc } +function { + id: 0x9073891f + return_type_id: 0x6720d32f + parameter_id: 0x352e53fa + parameter_id: 0x2d1b205b + parameter_id: 0x3e10b518 + parameter_id: 0xc9082b19 + parameter_id: 0xc9082b19 +} function { id: 0x90738a48 return_type_id: 0x6720d32f @@ -310023,6 +310323,15 @@ function { parameter_id: 0x3c41c19b parameter_id: 0x3a9fa744 } +function { + id: 0x927d2fbb + return_type_id: 0x6720d32f + parameter_id: 0x3d14c96b + parameter_id: 0x2d1b205b + parameter_id: 0x3e10b518 + parameter_id: 0xc9082b19 + parameter_id: 0xc9082b19 +} function { id: 0x927d452a return_type_id: 0x6720d32f @@ -310824,6 +311133,12 @@ function { parameter_id: 0x173696bc parameter_id: 0x07dcdbe1 } +function { + id: 0x93139a0a + return_type_id: 0x6720d32f + parameter_id: 0x3c3fe9a7 + parameter_id: 0x6720d32f +} function { id: 0x9313a933 return_type_id: 0x6720d32f @@ -311413,6 +311728,15 @@ function { parameter_id: 0x054f691a parameter_id: 0x1f73dead } +function { + id: 0x9394b613 + return_type_id: 0x6720d32f + parameter_id: 0x3ab2afcb + parameter_id: 0x2d1b205b + parameter_id: 0x3e10b518 + parameter_id: 0xc9082b19 + parameter_id: 0xc9082b19 +} function { id: 0x9394f11e return_type_id: 0x6720d32f @@ -312058,6 +312382,11 @@ function { parameter_id: 0x26ee682a parameter_id: 0x1eb29fb8 } +function { + id: 0x9442d510 + return_type_id: 0x3e10b518 + parameter_id: 0x181b0acd +} function { id: 0x94435373 return_type_id: 0x6720d32f @@ -312337,6 +312666,12 @@ function { parameter_id: 0x29082583 parameter_id: 0xd41e888f } +function { + id: 0x94938ce2 + return_type_id: 0x6720d32f + parameter_id: 0x223fb206 + parameter_id: 0x6720d32f +} function { id: 0x94964152 return_type_id: 0x6720d32f @@ -313568,6 +313903,13 @@ function { return_type_id: 0x6720d32f parameter_id: 0x2ef43f67 } +function { + id: 0x963e5e52 + return_type_id: 0x6720d32f + parameter_id: 0x2d1b205b + parameter_id: 0x3e10b518 + parameter_id: 0x00defc2c +} function { id: 0x963ea445 return_type_id: 0x6720d32f @@ -318048,6 +318390,12 @@ function { parameter_id: 0x391f15ea parameter_id: 0x6720d32f } +function { + id: 0x9a970a1a + return_type_id: 0x6720d32f + parameter_id: 0x1fba7d3d + parameter_id: 0x3e5d9ebb +} function { id: 0x9a9d1e6d return_type_id: 0xf435685e @@ -318325,6 +318673,12 @@ function { parameter_id: 0x6720d32f parameter_id: 0x3e6239e1 } +function { + id: 0x9abd1dd4 + return_type_id: 0x6720d32f + parameter_id: 0x1fba7d3d + parameter_id: 0x34d86d1c +} function { id: 0x9abe486f return_type_id: 0x6720d32f @@ -318402,6 +318756,12 @@ function { parameter_id: 0x3f0185ef parameter_id: 0x4585663f } +function { + id: 0x9ac90128 + return_type_id: 0x6720d32f + parameter_id: 0x1fba7d3d + parameter_id: 0x29df5204 +} function { id: 0x9ac9a7eb return_type_id: 0x2668e644 @@ -319331,6 +319691,15 @@ function { parameter_id: 0x387626d3 parameter_id: 0x30650ba6 } +function { + id: 0x9b42dae7 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x3f0185ef + parameter_id: 0x4585663f + parameter_id: 0x00c72527 + parameter_id: 0x13580d6c +} function { id: 0x9b432d7a return_type_id: 0x6720d32f @@ -319378,6 +319747,15 @@ function { parameter_id: 0x188b9e81 parameter_id: 0x391f15ea } +function { + id: 0x9b468d43 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x3a7f8e60 + parameter_id: 0x00c72527 + parameter_id: 0x3f0185ef + parameter_id: 0x13580d6c +} function { id: 0x9b46c616 return_type_id: 0x6720d32f @@ -322609,6 +322987,12 @@ function { parameter_id: 0x11b57133 parameter_id: 0x6d7f5ff6 } +function { + id: 0x9bf2ff2c + return_type_id: 0x6720d32f + parameter_id: 0x1fba7d3d + parameter_id: 0x6720d32f +} function { id: 0x9bf37946 return_type_id: 0x6720d32f @@ -322634,6 +323018,15 @@ function { parameter_id: 0xf1a6dfed parameter_id: 0x2170d06d } +function { + id: 0x9bf594ed + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x153f0b1a + parameter_id: 0x3f0185ef + parameter_id: 0x4585663f + parameter_id: 0x13580d6c +} function { id: 0x9bf6c118 return_type_id: 0x6720d32f @@ -322973,6 +323366,12 @@ function { parameter_id: 0x06835e9c parameter_id: 0x469ea43a } +function { + id: 0x9c2bdf68 + return_type_id: 0x6720d32f + parameter_id: 0x00defc2c + parameter_id: 0x6720d32f +} function { id: 0x9c2c04fd return_type_id: 0x6720d32f @@ -323736,6 +324135,13 @@ function { parameter_id: 0x09626b7f parameter_id: 0xda0bfa94 } +function { + id: 0x9cb54d89 + return_type_id: 0x6720d32f + parameter_id: 0x076327a3 + parameter_id: 0x3f0185ef + parameter_id: 0x4585663f +} function { id: 0x9cb5c182 return_type_id: 0x6720d32f @@ -325250,6 +325656,13 @@ function { parameter_id: 0x1bb6a471 parameter_id: 0x4585663f } +function { + id: 0x9d8f49ca + return_type_id: 0x6720d32f + parameter_id: 0x0c96fb14 + parameter_id: 0xc9082b19 + parameter_id: 0x38d23361 +} function { id: 0x9d8f9d80 return_type_id: 0x6720d32f @@ -326109,6 +326522,15 @@ function { parameter_id: 0x00c72527 parameter_id: 0xf435685e } +function { + id: 0x9dedae96 + return_type_id: 0x6720d32f + parameter_id: 0x0356cddf + parameter_id: 0x2d1b205b + parameter_id: 0x3e10b518 + parameter_id: 0xc9082b19 + parameter_id: 0xc9082b19 +} function { id: 0x9dee9fa0 return_type_id: 0x6720d32f @@ -327242,6 +327664,15 @@ function { parameter_id: 0x0ca27481 parameter_id: 0x18bd6530 } +function { + id: 0x9ecbaf04 + return_type_id: 0x6720d32f + parameter_id: 0x0fcecb94 + parameter_id: 0x2d1b205b + parameter_id: 0x3e10b518 + parameter_id: 0xc9082b19 + parameter_id: 0xc9082b19 +} function { id: 0x9ecc55aa return_type_id: 0x6720d32f @@ -327597,6 +328028,12 @@ function { return_type_id: 0x6720d32f parameter_id: 0x0a1edf98 } +function { + id: 0x9f09d818 + return_type_id: 0x6720d32f + parameter_id: 0x0c56e1ee + parameter_id: 0x6720d32f +} function { id: 0x9f0d3989 return_type_id: 0x6720d32f @@ -328115,6 +328552,12 @@ function { parameter_id: 0x3e10b518 parameter_id: 0xa52a0930 } +function { + id: 0x9f7e8b2b + return_type_id: 0x6720d32f + parameter_id: 0x0d8bad22 + parameter_id: 0x6720d32f +} function { id: 0x9f7fc723 return_type_id: 0x6720d32f @@ -333664,6 +334107,11 @@ function { parameter_id: 0x39d1288c parameter_id: 0x6720d32f } +function { + id: 0xfdb1e37f + return_type_id: 0x6d7f5ff6 + parameter_id: 0x0c56e1ee +} function { id: 0xfdb2dd0c return_type_id: 0x6d7f5ff6 @@ -338498,6 +338946,33 @@ elf_symbol { type_id: 0x9ab41198 full_name: "__traceiter_android_vh_adjust_kvmalloc_flags" } +elf_symbol { + id: 0x0556c9b1 + name: "__traceiter_android_vh_aes_decrypt" + is_defined: true + symbol_type: FUNCTION + crc: 0xb0d1574b + type_id: 0x9b468d43 + full_name: "__traceiter_android_vh_aes_decrypt" +} +elf_symbol { + id: 0xa3ddabd2 + name: "__traceiter_android_vh_aes_encrypt" + is_defined: true + symbol_type: FUNCTION + crc: 0x6160ff0c + type_id: 0x9b468d43 + full_name: "__traceiter_android_vh_aes_encrypt" +} +elf_symbol { + id: 0xf78be1c5 + name: "__traceiter_android_vh_aes_expandkey" + is_defined: true + symbol_type: FUNCTION + crc: 0xdc004b58 + type_id: 0x9bf594ed + full_name: "__traceiter_android_vh_aes_expandkey" +} elf_symbol { id: 0xd0b4a794 name: "__traceiter_android_vh_alloc_oem_binder_struct" @@ -340316,6 +340791,15 @@ elf_symbol { type_id: 0x9bc302e5 full_name: "__traceiter_android_vh_setscheduler_uclamp" } +elf_symbol { + id: 0x98a943de + name: "__traceiter_android_vh_sha256" + is_defined: true + symbol_type: FUNCTION + crc: 0x88fe3e25 + type_id: 0x9b42dae7 + full_name: "__traceiter_android_vh_sha256" +} elf_symbol { id: 0x53263f73 name: "__traceiter_android_vh_should_alloc_pages_retry" @@ -342629,6 +343113,33 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_adjust_kvmalloc_flags" } +elf_symbol { + id: 0x58e7634f + name: "__tracepoint_android_vh_aes_decrypt" + is_defined: true + symbol_type: OBJECT + crc: 0x64eaf879 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_aes_decrypt" +} +elf_symbol { + id: 0x3a519484 + name: "__tracepoint_android_vh_aes_encrypt" + is_defined: true + symbol_type: OBJECT + crc: 0x85db9ebb + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_aes_encrypt" +} +elf_symbol { + id: 0x7ea1f05b + name: "__tracepoint_android_vh_aes_expandkey" + is_defined: true + symbol_type: OBJECT + crc: 0x71396455 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_aes_expandkey" +} elf_symbol { id: 0xd7f9868e name: "__tracepoint_android_vh_alloc_oem_binder_struct" @@ -344447,6 +344958,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_setscheduler_uclamp" } +elf_symbol { + id: 0x5cfdecb8 + name: "__tracepoint_android_vh_sha256" + is_defined: true + symbol_type: OBJECT + crc: 0x8848ed50 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_sha256" +} elf_symbol { id: 0xd860c719 name: "__tracepoint_android_vh_should_alloc_pages_retry" @@ -346517,6 +347037,15 @@ elf_symbol { type_id: 0x12c8be42 full_name: "adjust_managed_page_count" } +elf_symbol { + id: 0xd8a7188c + name: "aead_register_instance" + is_defined: true + symbol_type: FUNCTION + crc: 0x84356a92 + type_id: 0x9ac90128 + full_name: "aead_register_instance" +} elf_symbol { id: 0x294249c0 name: "aes_encrypt" @@ -346535,6 +347064,15 @@ elf_symbol { type_id: 0x982246a7 full_name: "aes_expandkey" } +elf_symbol { + id: 0x178de6db + name: "ahash_register_instance" + is_defined: true + symbol_type: FUNCTION + crc: 0x1787bb48 + type_id: 0x9a970a1a + full_name: "ahash_register_instance" +} elf_symbol { id: 0x510c7445 name: "alarm_cancel" @@ -352067,6 +352605,24 @@ elf_symbol { type_id: 0x9ac8451b full_name: "crypto_ahash_setkey" } +elf_symbol { + id: 0x5bcc3288 + name: "crypto_alg_list" + is_defined: true + symbol_type: OBJECT + crc: 0x457594fa + type_id: 0xd3c80119 + full_name: "crypto_alg_list" +} +elf_symbol { + id: 0x6be7b839 + name: "crypto_alg_sem" + is_defined: true + symbol_type: OBJECT + crc: 0xedac5f42 + type_id: 0x28b9ec9a + full_name: "crypto_alg_sem" +} elf_symbol { id: 0xc81e9eb3 name: "crypto_alloc_aead" @@ -352112,6 +352668,15 @@ elf_symbol { type_id: 0xf66dfeca full_name: "crypto_alloc_kpp" } +elf_symbol { + id: 0xccb689ba + name: "crypto_alloc_rng" + is_defined: true + symbol_type: FUNCTION + crc: 0x440e70bc + type_id: 0x7f0da6b7 + full_name: "crypto_alloc_rng" +} elf_symbol { id: 0xef67fe16 name: "crypto_alloc_shash" @@ -352139,6 +352704,24 @@ elf_symbol { type_id: 0x329319f8 full_name: "crypto_alloc_sync_skcipher" } +elf_symbol { + id: 0x54908709 + name: "crypto_attr_alg_name" + is_defined: true + symbol_type: FUNCTION + crc: 0x9a11a0fc + type_id: 0x9442d510 + full_name: "crypto_attr_alg_name" +} +elf_symbol { + id: 0x274ca92d + name: "crypto_check_attr_type" + is_defined: true + symbol_type: FUNCTION + crc: 0x4934bdd0 + type_id: 0x9d8f49ca + full_name: "crypto_check_attr_type" +} elf_symbol { id: 0xa3db58f1 name: "crypto_cipher_encrypt_one" @@ -352149,6 +352732,16 @@ elf_symbol { type_id: 0x114c448e full_name: "crypto_cipher_encrypt_one" } +elf_symbol { + id: 0xcbd0db1f + name: "crypto_cipher_setkey" + is_defined: true + symbol_type: FUNCTION + crc: 0x5e752574 + namespace: "CRYPTO_INTERNAL" + type_id: 0x9cb54d89 + full_name: "crypto_cipher_setkey" +} elf_symbol { id: 0x1257590d name: "crypto_comp_compress" @@ -352194,6 +352787,15 @@ elf_symbol { type_id: 0x16d018ce full_name: "crypto_destroy_tfm" } +elf_symbol { + id: 0xf7cc32dd + name: "crypto_drop_spawn" + is_defined: true + symbol_type: FUNCTION + crc: 0x64cf94b4 + type_id: 0x104de2e4 + full_name: "crypto_drop_spawn" +} elf_symbol { id: 0xd04a0a9e name: "crypto_ecdh_encode_key" @@ -352221,6 +352823,15 @@ elf_symbol { type_id: 0x9a78591e full_name: "crypto_enqueue_request" } +elf_symbol { + id: 0x807f2b6e + name: "crypto_get_default_null_skcipher" + is_defined: true + symbol_type: FUNCTION + crc: 0x9b19163b + type_id: 0x3e015618 + full_name: "crypto_get_default_null_skcipher" +} elf_symbol { id: 0xbf39e9a5 name: "crypto_get_default_rng" @@ -352230,6 +352841,51 @@ elf_symbol { type_id: 0x9d80e32f full_name: "crypto_get_default_rng" } +elf_symbol { + id: 0xa07184ca + name: "crypto_grab_aead" + is_defined: true + symbol_type: FUNCTION + crc: 0xc704e06c + type_id: 0x9394b613 + full_name: "crypto_grab_aead" +} +elf_symbol { + id: 0x08a3daa7 + name: "crypto_grab_ahash" + is_defined: true + symbol_type: FUNCTION + crc: 0x815c2a4d + type_id: 0x927d2fbb + full_name: "crypto_grab_ahash" +} +elf_symbol { + id: 0xf83dbc28 + name: "crypto_grab_shash" + is_defined: true + symbol_type: FUNCTION + crc: 0x8abafd8b + type_id: 0x9073891f + full_name: "crypto_grab_shash" +} +elf_symbol { + id: 0x224d9b3e + name: "crypto_grab_skcipher" + is_defined: true + symbol_type: FUNCTION + crc: 0xfa3b917d + type_id: 0x9ecbaf04 + full_name: "crypto_grab_skcipher" +} +elf_symbol { + id: 0xcb442450 + name: "crypto_grab_spawn" + is_defined: true + symbol_type: FUNCTION + crc: 0x8fdd4639 + type_id: 0x9dedae96 + full_name: "crypto_grab_spawn" +} elf_symbol { id: 0x4d4a15b0 name: "crypto_has_ahash" @@ -352266,6 +352922,24 @@ elf_symbol { type_id: 0x1667b3d4 full_name: "crypto_init_queue" } +elf_symbol { + id: 0x33ee5483 + name: "crypto_inst_setname" + is_defined: true + symbol_type: FUNCTION + crc: 0xfa76cf97 + type_id: 0x963e5e52 + full_name: "crypto_inst_setname" +} +elf_symbol { + id: 0xaca5602a + name: "crypto_put_default_null_skcipher" + is_defined: true + symbol_type: FUNCTION + crc: 0x21cd536a + type_id: 0x10985193 + full_name: "crypto_put_default_null_skcipher" +} elf_symbol { id: 0x053cd2eb name: "crypto_put_default_rng" @@ -352284,6 +352958,15 @@ elf_symbol { type_id: 0x950f0fae full_name: "crypto_register_aead" } +elf_symbol { + id: 0x7283d4fc + name: "crypto_register_aeads" + is_defined: true + symbol_type: FUNCTION + crc: 0xe7bb04d1 + type_id: 0x94938ce2 + full_name: "crypto_register_aeads" +} elf_symbol { id: 0x3359f049 name: "crypto_register_ahash" @@ -352293,6 +352976,15 @@ elf_symbol { type_id: 0x9ee20867 full_name: "crypto_register_ahash" } +elf_symbol { + id: 0xc8a04eec + name: "crypto_register_ahashes" + is_defined: true + symbol_type: FUNCTION + crc: 0x1ad832bb + type_id: 0x9f7e8b2b + full_name: "crypto_register_ahashes" +} elf_symbol { id: 0xc60881ee name: "crypto_register_akcipher" @@ -352311,6 +353003,15 @@ elf_symbol { type_id: 0x9db75c24 full_name: "crypto_register_alg" } +elf_symbol { + id: 0xf18d5670 + name: "crypto_register_algs" + is_defined: true + symbol_type: FUNCTION + crc: 0xb028a93c + type_id: 0x9c2bdf68 + full_name: "crypto_register_algs" +} elf_symbol { id: 0xcb0ffe5b name: "crypto_register_notifier" @@ -352347,6 +353048,15 @@ elf_symbol { type_id: 0x9e955b54 full_name: "crypto_register_shash" } +elf_symbol { + id: 0x414b50db + name: "crypto_register_shashes" + is_defined: true + symbol_type: FUNCTION + crc: 0x4579a957 + type_id: 0x9f09d818 + full_name: "crypto_register_shashes" +} elf_symbol { id: 0xfca661a6 name: "crypto_register_skcipher" @@ -352356,6 +353066,15 @@ elf_symbol { type_id: 0x928f1946 full_name: "crypto_register_skcipher" } +elf_symbol { + id: 0x8a2f0da1 + name: "crypto_register_skciphers" + is_defined: true + symbol_type: FUNCTION + crc: 0x1e086325 + type_id: 0x93139a0a + full_name: "crypto_register_skciphers" +} elf_symbol { id: 0x8e0112d7 name: "crypto_register_template" @@ -352365,6 +353084,24 @@ elf_symbol { type_id: 0x9a6e7c60 full_name: "crypto_register_template" } +elf_symbol { + id: 0x41c9668c + name: "crypto_register_templates" + is_defined: true + symbol_type: FUNCTION + crc: 0x887cfd9b + type_id: 0x9bf2ff2c + full_name: "crypto_register_templates" +} +elf_symbol { + id: 0x205447ca + name: "crypto_remove_spawns" + is_defined: true + symbol_type: FUNCTION + crc: 0x02da53a2 + type_id: 0x105651c0 + full_name: "crypto_remove_spawns" +} elf_symbol { id: 0x0e52d725 name: "crypto_req_done" @@ -352374,6 +353111,15 @@ elf_symbol { type_id: 0x10100c3c full_name: "crypto_req_done" } +elf_symbol { + id: 0xc6344bab + name: "crypto_rng_reset" + is_defined: true + symbol_type: FUNCTION + crc: 0x9bf39d8d + type_id: 0x924abcc2 + full_name: "crypto_rng_reset" +} elf_symbol { id: 0x162a73f7 name: "crypto_sha1_finup" @@ -352392,6 +353138,15 @@ elf_symbol { type_id: 0x9fb1df6d full_name: "crypto_sha1_update" } +elf_symbol { + id: 0x4ec5fd55 + name: "crypto_shash_alg_has_setkey" + is_defined: true + symbol_type: FUNCTION + crc: 0x9bfa0162 + type_id: 0xfdb1e37f + full_name: "crypto_shash_alg_has_setkey" +} elf_symbol { id: 0x91309df9 name: "crypto_shash_digest" @@ -352473,6 +353228,24 @@ elf_symbol { type_id: 0x9e7f936c full_name: "crypto_skcipher_setkey" } +elf_symbol { + id: 0x8f449b37 + name: "crypto_spawn_tfm" + is_defined: true + symbol_type: FUNCTION + crc: 0xa7ebc330 + type_id: 0x8a129bb5 + full_name: "crypto_spawn_tfm" +} +elf_symbol { + id: 0x77cf6687 + name: "crypto_spawn_tfm2" + is_defined: true + symbol_type: FUNCTION + crc: 0x9d1482f0 + type_id: 0x56430286 + full_name: "crypto_spawn_tfm2" +} elf_symbol { id: 0x81600265 name: "crypto_unregister_aead" @@ -352545,6 +353318,15 @@ elf_symbol { type_id: 0x138de9e8 full_name: "crypto_unregister_shash" } +elf_symbol { + id: 0xc4f46672 + name: "crypto_unregister_shashes" + is_defined: true + symbol_type: FUNCTION + crc: 0x60168197 + type_id: 0x12116aa4 + full_name: "crypto_unregister_shashes" +} elf_symbol { id: 0x9f75c77b name: "crypto_unregister_skcipher" @@ -352554,6 +353336,15 @@ elf_symbol { type_id: 0x1f97abfa full_name: "crypto_unregister_skcipher" } +elf_symbol { + id: 0xef41eff1 + name: "crypto_unregister_skciphers" + is_defined: true + symbol_type: FUNCTION + crc: 0x625ccc14 + type_id: 0x1e0b28b6 + full_name: "crypto_unregister_skciphers" +} elf_symbol { id: 0x801e3d5d name: "crypto_unregister_template" @@ -352563,6 +353354,15 @@ elf_symbol { type_id: 0x1776cedc full_name: "crypto_unregister_template" } +elf_symbol { + id: 0x9b2d60fa + name: "crypto_unregister_templates" + is_defined: true + symbol_type: FUNCTION + crc: 0xd45dcc00 + type_id: 0x16ea4d90 + full_name: "crypto_unregister_templates" +} elf_symbol { id: 0xd36400de name: "css_next_child" @@ -385013,6 +385813,15 @@ elf_symbol { type_id: 0x9fce093a full_name: "rht_bucket_nested_insert" } +elf_symbol { + id: 0x42dfffbc + name: "rng_is_initialized" + is_defined: true + symbol_type: FUNCTION + crc: 0x3a4f9d28 + type_id: 0xfea45b04 + full_name: "rng_is_initialized" +} elf_symbol { id: 0x93ee7a0f name: "root_device_unregister" @@ -387857,6 +388666,24 @@ elf_symbol { type_id: 0x1caa303b full_name: "sha1_transform" } +elf_symbol { + id: 0x84e1c494 + name: "shash_free_singlespawn_instance" + is_defined: true + symbol_type: FUNCTION + crc: 0x4a31048c + type_id: 0x1dae4ad4 + full_name: "shash_free_singlespawn_instance" +} +elf_symbol { + id: 0xc2e7cb56 + name: "shash_register_instance" + is_defined: true + symbol_type: FUNCTION + crc: 0xbb0c990d + type_id: 0x9abd1dd4 + full_name: "shash_register_instance" +} elf_symbol { id: 0x7f3b48aa name: "shmem_file_setup" @@ -403158,6 +403985,9 @@ interface { symbol_id: 0x86527a4e symbol_id: 0xf71b3e6c symbol_id: 0xc9756e19 + symbol_id: 0x0556c9b1 + symbol_id: 0xa3ddabd2 + symbol_id: 0xf78be1c5 symbol_id: 0xd0b4a794 symbol_id: 0x33f9278c symbol_id: 0x2e343246 @@ -403360,6 +404190,7 @@ interface { symbol_id: 0xe4ec133d symbol_id: 0xaa3f6a65 symbol_id: 0xa2fe718f + symbol_id: 0x98a943de symbol_id: 0x53263f73 symbol_id: 0xe828d15b symbol_id: 0x4d31a413 @@ -403617,6 +404448,9 @@ interface { symbol_id: 0xe1489e0c symbol_id: 0x8f23a62a symbol_id: 0xf3cd7eeb + symbol_id: 0x58e7634f + symbol_id: 0x3a519484 + symbol_id: 0x7ea1f05b symbol_id: 0xd7f9868e symbol_id: 0x37776872 symbol_id: 0xfc735654 @@ -403819,6 +404653,7 @@ interface { symbol_id: 0xcfab6e83 symbol_id: 0xd7ceb15f symbol_id: 0x923147c1 + symbol_id: 0x5cfdecb8 symbol_id: 0xd860c719 symbol_id: 0x5b6bc3a9 symbol_id: 0x823654f5 @@ -404049,8 +404884,10 @@ interface { symbol_id: 0x60b70858 symbol_id: 0x7f488498 symbol_id: 0x09cd7a68 + symbol_id: 0xd8a7188c symbol_id: 0x294249c0 symbol_id: 0x6a3cf7b4 + symbol_id: 0x178de6db symbol_id: 0x510c7445 symbol_id: 0xe4af6f7e symbol_id: 0x49029965 @@ -404667,42 +405504,66 @@ interface { symbol_id: 0xf8751b15 symbol_id: 0xdd9947d5 symbol_id: 0xff08526f + symbol_id: 0x5bcc3288 + symbol_id: 0x6be7b839 symbol_id: 0xc81e9eb3 symbol_id: 0x237a3562 symbol_id: 0x5d9de9a7 symbol_id: 0x1d1f6717 symbol_id: 0x20c19184 + symbol_id: 0xccb689ba symbol_id: 0xef67fe16 symbol_id: 0x9eca665b symbol_id: 0x3ea8bbd7 + symbol_id: 0x54908709 + symbol_id: 0x274ca92d symbol_id: 0xa3db58f1 + symbol_id: 0xcbd0db1f symbol_id: 0x1257590d symbol_id: 0x833374c8 symbol_id: 0x717034d4 symbol_id: 0xc27e8b2f symbol_id: 0x3464cb44 + symbol_id: 0xf7cc32dd symbol_id: 0xd04a0a9e symbol_id: 0x7c49856a symbol_id: 0xcf0e0e01 + symbol_id: 0x807f2b6e symbol_id: 0xbf39e9a5 + symbol_id: 0xa07184ca + symbol_id: 0x08a3daa7 + symbol_id: 0xf83dbc28 + symbol_id: 0x224d9b3e + symbol_id: 0xcb442450 symbol_id: 0x4d4a15b0 symbol_id: 0xfc625698 symbol_id: 0x80e1f666 symbol_id: 0x62173925 + symbol_id: 0x33ee5483 + symbol_id: 0xaca5602a symbol_id: 0x053cd2eb symbol_id: 0xd1471c13 + symbol_id: 0x7283d4fc symbol_id: 0x3359f049 + symbol_id: 0xc8a04eec symbol_id: 0xc60881ee symbol_id: 0xd9005076 + symbol_id: 0xf18d5670 symbol_id: 0xcb0ffe5b symbol_id: 0xa79ba8cc symbol_id: 0x23b67585 symbol_id: 0x1e81ded9 + symbol_id: 0x414b50db symbol_id: 0xfca661a6 + symbol_id: 0x8a2f0da1 symbol_id: 0x8e0112d7 + symbol_id: 0x41c9668c + symbol_id: 0x205447ca symbol_id: 0x0e52d725 + symbol_id: 0xc6344bab symbol_id: 0x162a73f7 symbol_id: 0x7dcc32e4 + symbol_id: 0x4ec5fd55 symbol_id: 0x91309df9 symbol_id: 0xfdca589d symbol_id: 0xb50ff8bd @@ -404712,6 +405573,8 @@ interface { symbol_id: 0x15691536 symbol_id: 0x403155fc symbol_id: 0xbb92068e + symbol_id: 0x8f449b37 + symbol_id: 0x77cf6687 symbol_id: 0x81600265 symbol_id: 0x57a4fa38 symbol_id: 0xdb6ddedf @@ -404720,8 +405583,11 @@ interface { symbol_id: 0xeb9b8f1f symbol_id: 0x4d669c6d symbol_id: 0x6715c595 + symbol_id: 0xc4f46672 symbol_id: 0x9f75c77b + symbol_id: 0xef41eff1 symbol_id: 0x801e3d5d + symbol_id: 0x9b2d60fa symbol_id: 0xd36400de symbol_id: 0x2c08983d symbol_id: 0x81bdacc5 @@ -408325,6 +409191,7 @@ interface { symbol_id: 0x7b08b3df symbol_id: 0x6af2dc93 symbol_id: 0x56f4af9c + symbol_id: 0x42dfffbc symbol_id: 0x93ee7a0f symbol_id: 0xbd83c333 symbol_id: 0x7d858174 @@ -408641,6 +409508,8 @@ interface { symbol_id: 0x12402fa7 symbol_id: 0x0b4df89e symbol_id: 0x7996527c + symbol_id: 0x84e1c494 + symbol_id: 0xc2e7cb56 symbol_id: 0x7f3b48aa symbol_id: 0xf47010e0 symbol_id: 0x436ee92c diff --git a/android/abi_gki_aarch64_fips140 b/android/abi_gki_aarch64_fips140 new file mode 100644 index 000000000000..4b9e2f0ed38e --- /dev/null +++ b/android/abi_gki_aarch64_fips140 @@ -0,0 +1,145 @@ +[abi_symbol_list] +# commonly used symbols + module_layout + __put_task_struct + +# required by fips140.ko + aead_register_instance + ahash_register_instance + arch_timer_read_counter + bcmp + complete_all + completion_done + cpu_have_feature + crypto_aead_decrypt + crypto_aead_encrypt + crypto_aead_setauthsize + crypto_aead_setkey + crypto_ahash_finup + crypto_ahash_setkey + crypto_alg_list + crypto_alg_sem + crypto_alloc_aead + crypto_alloc_base + crypto_alloc_rng + crypto_alloc_shash + crypto_alloc_skcipher + crypto_attr_alg_name + crypto_check_attr_type + crypto_cipher_encrypt_one + crypto_cipher_setkey + crypto_destroy_tfm + crypto_drop_spawn + crypto_get_default_null_skcipher + crypto_grab_aead + crypto_grab_ahash + crypto_grab_shash + crypto_grab_skcipher + crypto_grab_spawn + crypto_inst_setname + crypto_put_default_null_skcipher + crypto_register_aead + crypto_register_aeads + crypto_register_ahash + crypto_register_ahashes + crypto_register_alg + crypto_register_algs + crypto_register_rng + crypto_register_rngs + crypto_register_shash + crypto_register_shashes + crypto_register_skcipher + crypto_register_skciphers + crypto_register_template + crypto_register_templates + crypto_remove_spawns + crypto_req_done + crypto_rng_reset + crypto_shash_alg_has_setkey + crypto_shash_digest + crypto_shash_final + crypto_shash_finup + crypto_shash_setkey + crypto_shash_tfm_digest + crypto_shash_update + crypto_skcipher_decrypt + crypto_skcipher_encrypt + crypto_skcipher_setkey + crypto_spawn_tfm + crypto_spawn_tfm2 + crypto_unregister_aead + crypto_unregister_alg + crypto_unregister_rng + crypto_unregister_rngs + crypto_unregister_shash + crypto_unregister_shashes + crypto_unregister_skciphers + crypto_unregister_template + crypto_unregister_templates + down_write + fortify_panic + fpsimd_context_busy + get_random_bytes + __init_swait_queue_head + irq_stat + jiffies + kasan_flag_enabled + kernel_neon_begin + kernel_neon_end + kfree + kfree_sensitive + __kmalloc + kmalloc_caches + kmalloc_trace + kmemdup + ktime_get + __list_add_valid + __list_del_entry_valid + memcpy + memset + __mutex_init + mutex_lock + mutex_unlock + panic + preempt_schedule + preempt_schedule_notrace + _printk + ___ratelimit + _raw_spin_lock + _raw_spin_unlock + refcount_warn_saturate + rng_is_initialized + scatterwalk_ffwd + scatterwalk_map_and_copy + sg_init_one + sg_init_table + sg_next + shash_free_singlespawn_instance + shash_register_instance + skcipher_alloc_instance_simple + skcipher_register_instance + skcipher_walk_aead_decrypt + skcipher_walk_aead_encrypt + skcipher_walk_done + skcipher_walk_virt + snprintf + __stack_chk_fail + strcmp + strlcat + strlen + strncmp + strnlen + strscpy + __traceiter_android_vh_aes_decrypt + __traceiter_android_vh_aes_encrypt + __traceiter_android_vh_aes_expandkey + __traceiter_android_vh_sha256 + __tracepoint_android_vh_aes_decrypt + __tracepoint_android_vh_aes_encrypt + __tracepoint_android_vh_aes_expandkey + __tracepoint_android_vh_sha256 + tracepoint_probe_register + up_write + wait_for_completion + xa_load + xa_store From 139e9a0f9d26d781017ebfd5799fd0707ae25597 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Thu, 29 Feb 2024 22:35:14 +0000 Subject: [PATCH 029/111] ANDROID: remove LTO check from build.config.gki.aarch64.fips140 Don't check the "LTO" variable in build.config.gki.aarch64.fips140, since fips140.ko no longer depends on LTO. Also, Kleaf doesn't set the "LTO" variable anyway; it was specific to build.sh. Bug: 188620248 Change-Id: I213faa4c8c1a23898c08da121b0a5dc602b7218a Signed-off-by: Eric Biggers --- build.config.gki.aarch64.fips140 | 5 ----- 1 file changed, 5 deletions(-) diff --git a/build.config.gki.aarch64.fips140 b/build.config.gki.aarch64.fips140 index ec493efc20cf..031695579fc8 100644 --- a/build.config.gki.aarch64.fips140 +++ b/build.config.gki.aarch64.fips140 @@ -10,11 +10,6 @@ MAKE_GOALS=" modules " -if [ "${LTO}" = "none" ]; then - echo "The FIPS140 module needs LTO to be enabled." - exit 1 -fi - MODULES_ORDER=android/gki_aarch64_fips140_modules KERNEL_DIR=common From 02a1ce0cf2260bd0ff01c463c77de8bb01922580 Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Sat, 13 Jan 2024 03:41:27 +0800 Subject: [PATCH 030/111] FROMGIT: f2fs: compress: fix to guarantee persisting compressed blocks by CP If data block in compressed cluster is not persisted with metadata during checkpoint, after SPOR, the data may be corrupted, let's guarantee to write compressed page by checkpoint. Fixes: 4c8ff7095bef ("f2fs: support data compression") Reviewed-by: Daeho Jeong Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Bug: 313549450 (cherry picked from commit 8a430dd49e9cb021372b0ad91e60aeef9c6ced00 https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git dev) Change-Id: Ie52d0bc7d89ec3111f1f6e8140555358620e875c Signed-off-by: Daeho Jeong --- fs/f2fs/compress.c | 4 +++- fs/f2fs/data.c | 17 +++++++++-------- fs/f2fs/f2fs.h | 4 +++- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c index 84f489ae8080..4dbe1a10a1b9 100644 --- a/fs/f2fs/compress.c +++ b/fs/f2fs/compress.c @@ -1390,6 +1390,8 @@ void f2fs_compress_write_end_io(struct bio *bio, struct page *page) struct f2fs_sb_info *sbi = bio->bi_private; struct compress_io_ctx *cic = (struct compress_io_ctx *)page_private(page); + enum count_type type = WB_DATA_TYPE(page, + f2fs_is_compressed_page(page)); int i; if (unlikely(bio->bi_status)) @@ -1397,7 +1399,7 @@ void f2fs_compress_write_end_io(struct bio *bio, struct page *page) f2fs_compress_free_page(page); - dec_page_count(sbi, F2FS_WB_DATA); + dec_page_count(sbi, type); if (atomic_dec_return(&cic->pending_pages)) return; diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index db5076c223d9..3c6af4de72cf 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -49,7 +49,7 @@ void f2fs_destroy_bioset(void) bioset_exit(&f2fs_bioset); } -static bool __is_cp_guaranteed(struct page *page) +bool f2fs_is_cp_guaranteed(struct page *page) { struct address_space *mapping = page->mapping; struct inode *inode; @@ -66,8 +66,6 @@ static bool __is_cp_guaranteed(struct page *page) S_ISDIR(inode->i_mode)) return true; - if (f2fs_is_compressed_page(page)) - return false; if ((S_ISREG(inode->i_mode) && IS_NOQUOTA(inode)) || page_private_gcing(page)) return true; @@ -339,7 +337,7 @@ static void f2fs_write_end_io(struct bio *bio) bio_for_each_segment_all(bvec, bio, iter_all) { struct page *page = bvec->bv_page; - enum count_type type = WB_DATA_TYPE(page); + enum count_type type = WB_DATA_TYPE(page, false); if (page_private_dummy(page)) { clear_page_private_dummy(page); @@ -767,7 +765,7 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio) wbc_account_cgroup_owner(fio->io_wbc, fio->page, PAGE_SIZE); inc_page_count(fio->sbi, is_read_io(fio->op) ? - __read_io_type(page) : WB_DATA_TYPE(fio->page)); + __read_io_type(page) : WB_DATA_TYPE(fio->page, false)); if (is_read_io(bio_op(bio))) f2fs_submit_read_bio(fio->sbi, bio, fio->type); @@ -978,7 +976,7 @@ alloc_new: if (fio->io_wbc) wbc_account_cgroup_owner(fio->io_wbc, fio->page, PAGE_SIZE); - inc_page_count(fio->sbi, WB_DATA_TYPE(page)); + inc_page_count(fio->sbi, WB_DATA_TYPE(page, false)); *fio->last_block = fio->new_blkaddr; *fio->bio = bio; @@ -1012,6 +1010,7 @@ void f2fs_submit_page_write(struct f2fs_io_info *fio) enum page_type btype = PAGE_TYPE_OF_BIO(fio->type); struct f2fs_bio_info *io = sbi->write_io[btype] + fio->temp; struct page *bio_page; + enum count_type type; f2fs_bug_on(sbi, is_read_io(fio->op)); @@ -1051,7 +1050,8 @@ next: /* set submitted = true as a return value */ fio->submitted = 1; - inc_page_count(sbi, WB_DATA_TYPE(bio_page)); + type = WB_DATA_TYPE(bio_page, fio->compressed_page); + inc_page_count(sbi, type); if (io->bio && (!io_is_mergeable(sbi, io->bio, io, fio, io->last_block_in_bio, @@ -1064,7 +1064,8 @@ alloc_new: if (F2FS_IO_ALIGNED(sbi) && (fio->type == DATA || fio->type == NODE) && fio->new_blkaddr & F2FS_IO_SIZE_MASK(sbi)) { - dec_page_count(sbi, WB_DATA_TYPE(bio_page)); + dec_page_count(sbi, WB_DATA_TYPE(bio_page, + fio->compressed_page)); fio->retry = 1; goto skip; } diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 42b6f36f7db2..acf7cbd463e8 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1074,7 +1074,8 @@ struct f2fs_sm_info { * f2fs monitors the number of several block types such as on-writeback, * dirty dentry blocks, dirty node blocks, and dirty meta blocks. */ -#define WB_DATA_TYPE(p) (__is_cp_guaranteed(p) ? F2FS_WB_CP_DATA : F2FS_WB_DATA) +#define WB_DATA_TYPE(p, f) \ + (f || f2fs_is_cp_guaranteed(p) ? F2FS_WB_CP_DATA : F2FS_WB_DATA) enum count_type { F2FS_DIRTY_DENTS, F2FS_DIRTY_DATA, @@ -3763,6 +3764,7 @@ void f2fs_init_ckpt_req_control(struct f2fs_sb_info *sbi); */ int __init f2fs_init_bioset(void); void f2fs_destroy_bioset(void); +bool f2fs_is_cp_guaranteed(struct page *page); int f2fs_init_bio_entry_cache(void); void f2fs_destroy_bio_entry_cache(void); void f2fs_submit_read_bio(struct f2fs_sb_info *sbi, struct bio *bio, From 0c3d1c94c43728875837b522657b6f983808648a Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Sat, 13 Jan 2024 03:41:28 +0800 Subject: [PATCH 031/111] FROMGIT: f2fs: compress: fix to cover normal cluster write with cp_rwsem When we overwrite compressed cluster w/ normal cluster, we should not unlock cp_rwsem during f2fs_write_raw_pages(), otherwise data will be corrupted if partial blocks were persisted before CP & SPOR, due to cluster metadata wasn't updated atomically. Fixes: 4c8ff7095bef ("f2fs: support data compression") Reviewed-by: Daeho Jeong Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Bug: 313549450 (cherry picked from commit fd244524c2cf07b5f4c3fe8abd6a99225c76544b https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git dev) Change-Id: I231eef3eb7ee5a105ad929718a6d1d67f4950dd2 Signed-off-by: Daeho Jeong --- fs/f2fs/compress.c | 27 ++++++++++++++++++--------- fs/f2fs/data.c | 3 ++- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c index 4dbe1a10a1b9..9fabd5173bbc 100644 --- a/fs/f2fs/compress.c +++ b/fs/f2fs/compress.c @@ -1415,12 +1415,14 @@ void f2fs_compress_write_end_io(struct bio *bio, struct page *page) } static int f2fs_write_raw_pages(struct compress_ctx *cc, - int *submitted, + int *submitted_p, struct writeback_control *wbc, enum iostat_type io_type) { struct address_space *mapping = cc->inode->i_mapping; - int _submitted, compr_blocks, ret, i; + struct f2fs_sb_info *sbi = F2FS_M_SB(mapping); + int submitted, compr_blocks, i; + int ret = 0; compr_blocks = f2fs_compressed_blocks(cc); @@ -1435,6 +1437,10 @@ static int f2fs_write_raw_pages(struct compress_ctx *cc, if (compr_blocks < 0) return compr_blocks; + /* overwrite compressed cluster w/ normal cluster */ + if (compr_blocks > 0) + f2fs_lock_op(sbi); + for (i = 0; i < cc->cluster_size; i++) { if (!cc->rpages[i]) continue; @@ -1459,7 +1465,7 @@ continue_unlock: if (!clear_page_dirty_for_io(cc->rpages[i])) goto continue_unlock; - ret = f2fs_write_single_data_page(cc->rpages[i], &_submitted, + ret = f2fs_write_single_data_page(cc->rpages[i], &submitted, NULL, NULL, wbc, io_type, compr_blocks, false); if (ret) { @@ -1467,26 +1473,29 @@ continue_unlock: unlock_page(cc->rpages[i]); ret = 0; } else if (ret == -EAGAIN) { + ret = 0; /* * for quota file, just redirty left pages to * avoid deadlock caused by cluster update race * from foreground operation. */ if (IS_NOQUOTA(cc->inode)) - return 0; - ret = 0; + goto out; f2fs_io_schedule_timeout(DEFAULT_IO_TIMEOUT); goto retry_write; } - return ret; + goto out; } - *submitted += _submitted; + *submitted_p += submitted; } - f2fs_balance_fs(F2FS_M_SB(mapping), true); +out: + if (compr_blocks > 0) + f2fs_unlock_op(sbi); - return 0; + f2fs_balance_fs(sbi, true); + return ret; } int f2fs_write_multi_pages(struct compress_ctx *cc, diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 3c6af4de72cf..9edef4b3c296 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -2860,7 +2860,7 @@ int f2fs_write_single_data_page(struct page *page, int *submitted, .encrypted_page = NULL, .submitted = 0, .compr_blocks = compr_blocks, - .need_lock = LOCK_RETRY, + .need_lock = compr_blocks ? LOCK_DONE : LOCK_RETRY, .post_read = f2fs_post_read_required(inode) ? 1 : 0, .io_type = io_type, .io_wbc = wbc, @@ -2940,6 +2940,7 @@ write: if (err == -EAGAIN) { err = f2fs_do_write_data_page(&fio); if (err == -EAGAIN) { + f2fs_bug_on(sbi, compr_blocks); fio.need_lock = LOCK_REQ; err = f2fs_do_write_data_page(&fio); } From ba28d24ceaed2134d6216d7fdc72993864574a9a Mon Sep 17 00:00:00 2001 From: Sheng Yong Date: Sat, 13 Jan 2024 03:41:29 +0800 Subject: [PATCH 032/111] FROMGIT: f2fs: compress: fix to check unreleased compressed cluster Compressed cluster may not be released due to we can fail in release_compress_blocks(), fix to handle reserved compressed cluster correctly in reserve_compress_blocks(). Fixes: 4c8ff7095bef ("f2fs: support data compression") Signed-off-by: Sheng Yong Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Bug: 313549450 (cherry picked from commit eb8fbaa53374e0a2d4381190abfe708481517bbb https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git dev) Change-Id: I2a4223efb548a921a8f28f45798709743e38e899 Signed-off-by: Daeho Jeong --- fs/f2fs/file.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 7ab4d8427caf..346957a1334e 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -3608,7 +3608,13 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count) goto next; } - if (__is_valid_data_blkaddr(blkaddr)) { + /* + * compressed cluster was not released due to it + * fails in release_compress_blocks(), so NEW_ADDR + * is a possible case. + */ + if (blkaddr == NEW_ADDR || + __is_valid_data_blkaddr(blkaddr)) { compr_blocks++; continue; } @@ -3618,6 +3624,11 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count) } reserved = cluster_size - compr_blocks; + + /* for the case all blocks in cluster were reserved */ + if (reserved == 1) + goto next; + ret = inc_valid_block_count(sbi, dn->inode, &reserved); if (ret) return ret; From 33d3b7311b8285eb8c986ce15f03c97cec59ddcc Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Sat, 13 Jan 2024 03:41:30 +0800 Subject: [PATCH 033/111] FROMGIT: f2fs: compress: fix to avoid inconsistence bewteen i_blocks and dnode In reserve_compress_blocks(), we update blkaddrs of dnode in prior to inc_valid_block_count(), it may cause inconsistent status bewteen i_blocks and blkaddrs once inc_valid_block_count() fails. To fix this issue, it needs to reverse their invoking order. Fixes: c75488fb4d82 ("f2fs: introduce F2FS_IOC_RESERVE_COMPRESS_BLOCKS") Reviewed-by: Daeho Jeong Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Bug: 313549450 (cherry picked from commit 54607494875edd636aff3c21ace3ad9a7da758a9 https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git dev) Change-Id: I74a5d1d47246d39b1ed0131c714c6a2a2bfab6cf Signed-off-by: Daeho Jeong --- fs/f2fs/data.c | 5 +++-- fs/f2fs/f2fs.h | 7 ++++++- fs/f2fs/file.c | 29 ++++++++++++++++------------- fs/f2fs/segment.c | 2 +- 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 9edef4b3c296..7acb2edd1331 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -1228,7 +1228,8 @@ int f2fs_reserve_new_blocks(struct dnode_of_data *dn, blkcnt_t count) if (unlikely(is_inode_flag_set(dn->inode, FI_NO_ALLOC))) return -EPERM; - if (unlikely((err = inc_valid_block_count(sbi, dn->inode, &count)))) + err = inc_valid_block_count(sbi, dn->inode, &count, true); + if (unlikely(err)) return err; trace_f2fs_reserve_new_blocks(dn->inode, dn->nid, @@ -1486,7 +1487,7 @@ static int __allocate_data_block(struct dnode_of_data *dn, int seg_type) dn->data_blkaddr = f2fs_data_blkaddr(dn); if (dn->data_blkaddr == NULL_ADDR) { - err = inc_valid_block_count(sbi, dn->inode, &count); + err = inc_valid_block_count(sbi, dn->inode, &count, true); if (unlikely(err)) return err; } diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index acf7cbd463e8..1e506d5b82d0 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -2222,7 +2222,7 @@ static inline bool __allow_reserved_blocks(struct f2fs_sb_info *sbi, static inline void f2fs_i_blocks_write(struct inode *, block_t, bool, bool); static inline int inc_valid_block_count(struct f2fs_sb_info *sbi, - struct inode *inode, blkcnt_t *count) + struct inode *inode, blkcnt_t *count, bool partial) { blkcnt_t diff = 0, release = 0; block_t avail_user_block_count; @@ -2262,6 +2262,11 @@ static inline int inc_valid_block_count(struct f2fs_sb_info *sbi, avail_user_block_count = 0; } if (unlikely(sbi->total_valid_block_count > avail_user_block_count)) { + if (!partial) { + spin_unlock(&sbi->stat_lock); + goto enospc; + } + diff = sbi->total_valid_block_count - avail_user_block_count; if (diff > *count) diff = *count; diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 346957a1334e..59c52cfaa290 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -3598,14 +3598,16 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count) blkcnt_t reserved; int ret; - for (i = 0; i < cluster_size; i++, dn->ofs_in_node++) { - blkaddr = f2fs_data_blkaddr(dn); + for (i = 0; i < cluster_size; i++) { + blkaddr = data_blkaddr(dn->inode, dn->node_page, + dn->ofs_in_node + i); if (i == 0) { - if (blkaddr == COMPRESS_ADDR) - continue; - dn->ofs_in_node += cluster_size; - goto next; + if (blkaddr != COMPRESS_ADDR) { + dn->ofs_in_node += cluster_size; + goto next; + } + continue; } /* @@ -3618,9 +3620,6 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count) compr_blocks++; continue; } - - dn->data_blkaddr = NEW_ADDR; - f2fs_set_data_blkaddr(dn); } reserved = cluster_size - compr_blocks; @@ -3629,12 +3628,16 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count) if (reserved == 1) goto next; - ret = inc_valid_block_count(sbi, dn->inode, &reserved); - if (ret) + ret = inc_valid_block_count(sbi, dn->inode, &reserved, false); + if (unlikely(ret)) return ret; - if (reserved != cluster_size - compr_blocks) - return -ENOSPC; + for (i = 0; i < cluster_size; i++, dn->ofs_in_node++) { + if (f2fs_data_blkaddr(dn) == NULL_ADDR) { + dn->data_blkaddr = NEW_ADDR; + f2fs_set_data_blkaddr(dn); + } + } f2fs_i_compr_blocks_update(dn->inode, compr_blocks, true); diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index dd1ad74733fb..fe0329050490 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -248,7 +248,7 @@ retry: } else { blkcnt_t count = 1; - err = inc_valid_block_count(sbi, inode, &count); + err = inc_valid_block_count(sbi, inode, &count, true); if (err) { f2fs_put_dnode(&dn); return err; From cc322f7deeff1fad384bfd33ed1a26780f3ea33e Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Sat, 13 Jan 2024 03:41:31 +0800 Subject: [PATCH 034/111] FROMGIT: f2fs: fix to remove unnecessary f2fs_bug_on() to avoid panic verify_blkaddr() will trigger panic once we inject fault into f2fs_is_valid_blkaddr(), fix to remove this unnecessary f2fs_bug_on(). Fixes: 18792e64c86d ("f2fs: support fault injection for f2fs_is_valid_blkaddr()") Reviewed-by: Daeho Jeong Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Bug: 313549450 (cherry picked from commit b896e302f79678451a94769ddd9e52e954c64fbb https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git dev) Change-Id: Ibffad271c17efd219099f07aab54ac080cae4fba Signed-off-by: Daeho Jeong --- fs/f2fs/f2fs.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 1e506d5b82d0..6f0ff7a97f42 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -3430,11 +3430,9 @@ bool f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi, static inline void verify_blkaddr(struct f2fs_sb_info *sbi, block_t blkaddr, int type) { - if (!f2fs_is_valid_blkaddr(sbi, blkaddr, type)) { + if (!f2fs_is_valid_blkaddr(sbi, blkaddr, type)) f2fs_err(sbi, "invalid blkaddr: %u, type: %d, run fsck to fix.", blkaddr, type); - f2fs_bug_on(sbi, 1); - } } static inline bool __is_valid_data_blkaddr(block_t blkaddr) From 9698f7e8e7703a618599c5553c702ce06484b9e5 Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Sat, 13 Jan 2024 03:41:32 +0800 Subject: [PATCH 035/111] FROMGIT: f2fs: introduce FAULT_BLKADDR_CONSISTENCE We will encounter below inconsistent status when FAULT_BLKADDR type fault injection is on. Info: checkpoint state = d6 : nat_bits crc fsck compacted_summary orphan_inodes sudden-power-off [ASSERT] (fsck_chk_inode_blk:1254) --> ino: 0x1c100 has i_blocks: 000000c0, but has 191 blocks [FIX] (fsck_chk_inode_blk:1260) --> [0x1c100] i_blocks=0x000000c0 -> 0xbf [FIX] (fsck_chk_inode_blk:1269) --> [0x1c100] i_compr_blocks=0x00000026 -> 0x27 [ASSERT] (fsck_chk_inode_blk:1254) --> ino: 0x1cadb has i_blocks: 0000002f, but has 46 blocks [FIX] (fsck_chk_inode_blk:1260) --> [0x1cadb] i_blocks=0x0000002f -> 0x2e [FIX] (fsck_chk_inode_blk:1269) --> [0x1cadb] i_compr_blocks=0x00000011 -> 0x12 [ASSERT] (fsck_chk_inode_blk:1254) --> ino: 0x1c62c has i_blocks: 00000002, but has 1 blocks [FIX] (fsck_chk_inode_blk:1260) --> [0x1c62c] i_blocks=0x00000002 -> 0x1 After we inject fault into f2fs_is_valid_blkaddr() during truncation, a) it missed to increase @nr_free or @valid_blocks b) it can cause in blkaddr leak in truncated dnode Which may cause inconsistent status. This patch separates FAULT_BLKADDR_CONSISTENCE from FAULT_BLKADDR, and rename FAULT_BLKADDR to FAULT_BLKADDR_VALIDITY so that we can: a) use FAULT_BLKADDR_CONSISTENCE in f2fs_truncate_data_blocks_range() to simulate inconsistent issue independently, then it can verify fsck repair flow. b) FAULT_BLKADDR_VALIDITY fault will not cause any inconsistent status, we can just use it to check error path handling in kernel side. Reviewed-by: Daeho Jeong Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Bug: 313549450 (cherry picked from commit c7115e094ca820bb72e0c89f158d16bc48c6fa04 https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git dev) Change-Id: Ifd6527aa2e48d883ae4063bfce1a404ccfbdaa48 Signed-off-by: Daeho Jeong --- Documentation/ABI/testing/sysfs-fs-f2fs | 47 +++++++++++++------------ Documentation/filesystems/f2fs.rst | 47 +++++++++++++------------ fs/f2fs/checkpoint.c | 19 +++++++--- fs/f2fs/f2fs.h | 5 ++- fs/f2fs/file.c | 8 +++-- fs/f2fs/super.c | 37 +++++++++---------- 6 files changed, 92 insertions(+), 71 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs b/Documentation/ABI/testing/sysfs-fs-f2fs index 8140fc98f5ae..82081132d39d 100644 --- a/Documentation/ABI/testing/sysfs-fs-f2fs +++ b/Documentation/ABI/testing/sysfs-fs-f2fs @@ -686,29 +686,30 @@ Description: Support configuring fault injection type, should be enabled with fault_injection option, fault type value is shown below, it supports single or combined type. - =================== =========== - Type_Name Type_Value - =================== =========== - FAULT_KMALLOC 0x000000001 - FAULT_KVMALLOC 0x000000002 - FAULT_PAGE_ALLOC 0x000000004 - FAULT_PAGE_GET 0x000000008 - FAULT_ALLOC_BIO 0x000000010 (obsolete) - FAULT_ALLOC_NID 0x000000020 - FAULT_ORPHAN 0x000000040 - FAULT_BLOCK 0x000000080 - FAULT_DIR_DEPTH 0x000000100 - FAULT_EVICT_INODE 0x000000200 - FAULT_TRUNCATE 0x000000400 - FAULT_READ_IO 0x000000800 - FAULT_CHECKPOINT 0x000001000 - FAULT_DISCARD 0x000002000 - FAULT_WRITE_IO 0x000004000 - FAULT_SLAB_ALLOC 0x000008000 - FAULT_DQUOT_INIT 0x000010000 - FAULT_LOCK_OP 0x000020000 - FAULT_BLKADDR 0x000040000 - =================== =========== + =========================== =========== + Type_Name Type_Value + =========================== =========== + FAULT_KMALLOC 0x000000001 + FAULT_KVMALLOC 0x000000002 + FAULT_PAGE_ALLOC 0x000000004 + FAULT_PAGE_GET 0x000000008 + FAULT_ALLOC_BIO 0x000000010 (obsolete) + FAULT_ALLOC_NID 0x000000020 + FAULT_ORPHAN 0x000000040 + FAULT_BLOCK 0x000000080 + FAULT_DIR_DEPTH 0x000000100 + FAULT_EVICT_INODE 0x000000200 + FAULT_TRUNCATE 0x000000400 + FAULT_READ_IO 0x000000800 + FAULT_CHECKPOINT 0x000001000 + FAULT_DISCARD 0x000002000 + FAULT_WRITE_IO 0x000004000 + FAULT_SLAB_ALLOC 0x000008000 + FAULT_DQUOT_INIT 0x000010000 + FAULT_LOCK_OP 0x000020000 + FAULT_BLKADDR_VALIDITY 0x000040000 + FAULT_BLKADDR_CONSISTENCE 0x000080000 + =========================== =========== What: /sys/fs/f2fs//discard_io_aware_gran Date: January 2023 diff --git a/Documentation/filesystems/f2fs.rst b/Documentation/filesystems/f2fs.rst index c57745375edb..5566f2b3378d 100644 --- a/Documentation/filesystems/f2fs.rst +++ b/Documentation/filesystems/f2fs.rst @@ -184,29 +184,30 @@ fault_type=%d Support configuring fault injection type, should be enabled with fault_injection option, fault type value is shown below, it supports single or combined type. - =================== =========== - Type_Name Type_Value - =================== =========== - FAULT_KMALLOC 0x000000001 - FAULT_KVMALLOC 0x000000002 - FAULT_PAGE_ALLOC 0x000000004 - FAULT_PAGE_GET 0x000000008 - FAULT_ALLOC_BIO 0x000000010 (obsolete) - FAULT_ALLOC_NID 0x000000020 - FAULT_ORPHAN 0x000000040 - FAULT_BLOCK 0x000000080 - FAULT_DIR_DEPTH 0x000000100 - FAULT_EVICT_INODE 0x000000200 - FAULT_TRUNCATE 0x000000400 - FAULT_READ_IO 0x000000800 - FAULT_CHECKPOINT 0x000001000 - FAULT_DISCARD 0x000002000 - FAULT_WRITE_IO 0x000004000 - FAULT_SLAB_ALLOC 0x000008000 - FAULT_DQUOT_INIT 0x000010000 - FAULT_LOCK_OP 0x000020000 - FAULT_BLKADDR 0x000040000 - =================== =========== + =========================== =========== + Type_Name Type_Value + =========================== =========== + FAULT_KMALLOC 0x000000001 + FAULT_KVMALLOC 0x000000002 + FAULT_PAGE_ALLOC 0x000000004 + FAULT_PAGE_GET 0x000000008 + FAULT_ALLOC_BIO 0x000000010 (obsolete) + FAULT_ALLOC_NID 0x000000020 + FAULT_ORPHAN 0x000000040 + FAULT_BLOCK 0x000000080 + FAULT_DIR_DEPTH 0x000000100 + FAULT_EVICT_INODE 0x000000200 + FAULT_TRUNCATE 0x000000400 + FAULT_READ_IO 0x000000800 + FAULT_CHECKPOINT 0x000001000 + FAULT_DISCARD 0x000002000 + FAULT_WRITE_IO 0x000004000 + FAULT_SLAB_ALLOC 0x000008000 + FAULT_DQUOT_INIT 0x000010000 + FAULT_LOCK_OP 0x000020000 + FAULT_BLKADDR_VALIDITY 0x000040000 + FAULT_BLKADDR_CONSISTENCE 0x000080000 + =========================== =========== mode=%s Control block allocation mode which supports "adaptive" and "lfs". In "lfs" mode, there should be no random writes towards main area. diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c index 7e0870eeb07b..14f4674a5499 100644 --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c @@ -173,12 +173,9 @@ static bool __is_bitmap_valid(struct f2fs_sb_info *sbi, block_t blkaddr, return exist; } -bool f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi, +static bool __f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi, block_t blkaddr, int type) { - if (time_to_inject(sbi, FAULT_BLKADDR)) - return false; - switch (type) { case META_NAT: break; @@ -233,6 +230,20 @@ bool f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi, return true; } +bool f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi, + block_t blkaddr, int type) +{ + if (time_to_inject(sbi, FAULT_BLKADDR_VALIDITY)) + return false; + return __f2fs_is_valid_blkaddr(sbi, blkaddr, type); +} + +bool f2fs_is_valid_blkaddr_raw(struct f2fs_sb_info *sbi, + block_t blkaddr, int type) +{ + return __f2fs_is_valid_blkaddr(sbi, blkaddr, type); +} + /* * Readahead CP/NAT/SIT/SSA/POR pages */ diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 6f0ff7a97f42..57d24d725fb3 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -60,7 +60,8 @@ enum { FAULT_SLAB_ALLOC, FAULT_DQUOT_INIT, FAULT_LOCK_OP, - FAULT_BLKADDR, + FAULT_BLKADDR_VALIDITY, + FAULT_BLKADDR_CONSISTENCE, FAULT_MAX, }; @@ -3727,6 +3728,8 @@ struct page *f2fs_get_meta_page_retry(struct f2fs_sb_info *sbi, pgoff_t index); struct page *f2fs_get_tmp_page(struct f2fs_sb_info *sbi, pgoff_t index); bool f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi, block_t blkaddr, int type); +bool f2fs_is_valid_blkaddr_raw(struct f2fs_sb_info *sbi, + block_t blkaddr, int type); int f2fs_ra_meta_pages(struct f2fs_sb_info *sbi, block_t start, int nrpages, int type, bool sync); void f2fs_ra_meta_pages_cond(struct f2fs_sb_info *sbi, pgoff_t index, diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 59c52cfaa290..8dad911fb9cf 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -593,9 +593,13 @@ void f2fs_truncate_data_blocks_range(struct dnode_of_data *dn, int count) f2fs_set_data_blkaddr(dn); if (__is_valid_data_blkaddr(blkaddr)) { - if (!f2fs_is_valid_blkaddr(sbi, blkaddr, - DATA_GENERIC_ENHANCE)) + if (time_to_inject(sbi, FAULT_BLKADDR_CONSISTENCE)) continue; + if (!f2fs_is_valid_blkaddr_raw(sbi, blkaddr, + DATA_GENERIC_ENHANCE)) { + f2fs_handle_error(sbi, ERROR_INVALID_BLKADDR); + continue; + } if (compressed_cluster) valid_blocks++; } diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 48dfcac6463a..6c74c9582d5d 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -45,24 +45,25 @@ static struct kmem_cache *f2fs_inode_cachep; #ifdef CONFIG_F2FS_FAULT_INJECTION const char *f2fs_fault_name[FAULT_MAX] = { - [FAULT_KMALLOC] = "kmalloc", - [FAULT_KVMALLOC] = "kvmalloc", - [FAULT_PAGE_ALLOC] = "page alloc", - [FAULT_PAGE_GET] = "page get", - [FAULT_ALLOC_NID] = "alloc nid", - [FAULT_ORPHAN] = "orphan", - [FAULT_BLOCK] = "no more block", - [FAULT_DIR_DEPTH] = "too big dir depth", - [FAULT_EVICT_INODE] = "evict_inode fail", - [FAULT_TRUNCATE] = "truncate fail", - [FAULT_READ_IO] = "read IO error", - [FAULT_CHECKPOINT] = "checkpoint error", - [FAULT_DISCARD] = "discard error", - [FAULT_WRITE_IO] = "write IO error", - [FAULT_SLAB_ALLOC] = "slab alloc", - [FAULT_DQUOT_INIT] = "dquot initialize", - [FAULT_LOCK_OP] = "lock_op", - [FAULT_BLKADDR] = "invalid blkaddr", + [FAULT_KMALLOC] = "kmalloc", + [FAULT_KVMALLOC] = "kvmalloc", + [FAULT_PAGE_ALLOC] = "page alloc", + [FAULT_PAGE_GET] = "page get", + [FAULT_ALLOC_NID] = "alloc nid", + [FAULT_ORPHAN] = "orphan", + [FAULT_BLOCK] = "no more block", + [FAULT_DIR_DEPTH] = "too big dir depth", + [FAULT_EVICT_INODE] = "evict_inode fail", + [FAULT_TRUNCATE] = "truncate fail", + [FAULT_READ_IO] = "read IO error", + [FAULT_CHECKPOINT] = "checkpoint error", + [FAULT_DISCARD] = "discard error", + [FAULT_WRITE_IO] = "write IO error", + [FAULT_SLAB_ALLOC] = "slab alloc", + [FAULT_DQUOT_INIT] = "dquot initialize", + [FAULT_LOCK_OP] = "lock_op", + [FAULT_BLKADDR_VALIDITY] = "invalid blkaddr", + [FAULT_BLKADDR_CONSISTENCE] = "inconsistent blkaddr", }; void f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned int rate, From 945b0c8ac4eb259bd2817e60397a93d11b7f1a7d Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Wed, 21 Feb 2024 15:03:48 +0800 Subject: [PATCH 036/111] ANDROID: GKI: Update oplus symbol list 2 function symbol(s) added 'int xt_register_match(struct xt_match*)' 'void xt_unregister_match(struct xt_match*)' Bug: 323695727 Change-Id: I8f51ceccbe5f2cfd14b44f9e402db26ca424d0fe Signed-off-by: Wei Liu --- android/abi_gki_aarch64.stg | 30 ++++++++++++++++++++++++++++++ android/abi_gki_aarch64_oplus | 2 ++ 2 files changed, 32 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 168e288b8108..0062986b3350 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -291720,6 +291720,11 @@ function { parameter_id: 0xf435685e parameter_id: 0x18bd6530 } +function { + id: 0x12c61c4f + return_type_id: 0x48b5725f + parameter_id: 0x09793771 +} function { id: 0x12c79320 return_type_id: 0xd5cc9c9a @@ -329134,6 +329139,11 @@ function { parameter_id: 0x6720d32f parameter_id: 0x1bf16028 } +function { + id: 0x9fdeaef3 + return_type_id: 0x6720d32f + parameter_id: 0x09793771 +} function { id: 0x9fe1d618 return_type_id: 0x6720d32f @@ -403259,6 +403269,15 @@ elf_symbol { type_id: 0x7a9367a8 full_name: "xt_find_match" } +elf_symbol { + id: 0x7a3f2cd6 + name: "xt_register_match" + is_defined: true + symbol_type: FUNCTION + crc: 0xbcad6010 + type_id: 0x9fdeaef3 + full_name: "xt_register_match" +} elf_symbol { id: 0xffcb0fa2 name: "xt_request_find_match" @@ -403277,6 +403296,15 @@ elf_symbol { type_id: 0x0118ea6e full_name: "xt_request_find_target" } +elf_symbol { + id: 0x807b9318 + name: "xt_unregister_match" + is_defined: true + symbol_type: FUNCTION + crc: 0x46432d8a + type_id: 0x12c61c4f + full_name: "xt_unregister_match" +} elf_symbol { id: 0x0fc8c78d name: "zap_vma_ptes" @@ -411130,8 +411158,10 @@ interface { symbol_id: 0x5a8a6a49 symbol_id: 0x8eb67e0f symbol_id: 0xf6d0be30 + symbol_id: 0x7a3f2cd6 symbol_id: 0xffcb0fa2 symbol_id: 0xa2ee5f12 + symbol_id: 0x807b9318 symbol_id: 0x0fc8c78d symbol_id: 0xe8e0ea6a symbol_id: 0xa5d58813 diff --git a/android/abi_gki_aarch64_oplus b/android/abi_gki_aarch64_oplus index 0b83cab9f007..37330946c844 100644 --- a/android/abi_gki_aarch64_oplus +++ b/android/abi_gki_aarch64_oplus @@ -331,4 +331,6 @@ wakeup_source_remove wake_up_state wq_worker_comm + xt_register_match + xt_unregister_match zero_pfn From 8b964b55a6985654d7e9668ec0292a97a115d3aa Mon Sep 17 00:00:00 2001 From: Seiya Wang Date: Tue, 5 Mar 2024 14:41:25 +0800 Subject: [PATCH 037/111] ANDROID: GKI: Update symbol list for mtk 1 function symbol(s) added 'int regmap_test_bits(struct regmap*, unsigned int, unsigned int)' Bug: 328166456 Signed-off-by: Seiya Wang Change-Id: Iadaaceb73982056fadf80e5c596fa843b3eaa8b1 --- android/abi_gki_aarch64.stg | 10 ++++++++++ android/abi_gki_aarch64_mtk | 1 + 2 files changed, 11 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 0062986b3350..17303498595f 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -384788,6 +384788,15 @@ elf_symbol { type_id: 0x9f1d3364 full_name: "regmap_reinit_cache" } +elf_symbol { + id: 0x51562a5b + name: "regmap_test_bits" + is_defined: true + symbol_type: FUNCTION + crc: 0xa1615065 + type_id: 0x9eed9829 + full_name: "regmap_test_bits" +} elf_symbol { id: 0xf68e2a91 name: "regmap_update_bits_base" @@ -409104,6 +409113,7 @@ interface { symbol_id: 0x7aadc374 symbol_id: 0x799e8ae8 symbol_id: 0x541cef30 + symbol_id: 0x51562a5b symbol_id: 0xf68e2a91 symbol_id: 0x33807c0a symbol_id: 0x396ad9d1 diff --git a/android/abi_gki_aarch64_mtk b/android/abi_gki_aarch64_mtk index 3226263e7210..a6f94dd75484 100644 --- a/android/abi_gki_aarch64_mtk +++ b/android/abi_gki_aarch64_mtk @@ -2171,6 +2171,7 @@ regmap_raw_write regmap_read regmap_register_patch + regmap_test_bits regmap_update_bits_base regmap_write regulator_bulk_disable From 3b7cd7d0e09ad911ac97fb98441405e9a75a47c2 Mon Sep 17 00:00:00 2001 From: RD Babiera Date: Tue, 27 Feb 2024 21:50:35 +0000 Subject: [PATCH 038/111] UPSTREAM: Revert "usb: typec: class: fix typec_altmode_put_partner to put plugs" This reverts commit b17b7fe6dd5c6ff74b38b0758ca799cdbb79e26e. That commit messed up the reference counting, so it needs to be rethought. Fixes: b17b7fe6dd5c ("usb: typec: class: fix typec_altmode_put_partner to put plugs") Cc: stable@vger.kernel.org Cc: RD Babiera Reported-by: Chris Bainbridge Closes: https://lore.kernel.org/lkml/CAP-bSRb3SXpgo_BEdqZB-p1K5625fMegRZ17ZkPE1J8ZYgEHDg@mail.gmail.com/ Signed-off-by: Heikki Krogerus Bug: 324496488 (cherry picked from commit 9c6b789e954fae73c548f39332bcc56bdf0d4373) Change-Id: I2755a5e44dd1970d60e5d996dd7fc6d88f79684a Signed-off-by: RD Babiera --- drivers/usb/typec/class.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c index 49d6b2388b87..3c3bab33e03a 100644 --- a/drivers/usb/typec/class.c +++ b/drivers/usb/typec/class.c @@ -267,7 +267,7 @@ static void typec_altmode_put_partner(struct altmode *altmode) if (!partner) return; - adev = &altmode->adev; + adev = &partner->adev; if (is_typec_plug(adev->dev.parent)) { struct typec_plug *plug = to_typec_plug(adev->dev.parent); @@ -497,8 +497,7 @@ static void typec_altmode_release(struct device *dev) { struct altmode *alt = to_altmode(to_typec_altmode(dev)); - if (!is_typec_port(dev->parent)) - typec_altmode_put_partner(alt); + typec_altmode_put_partner(alt); altmode_id_remove(alt->adev.dev.parent, alt->id); kfree(alt); From 23c8963806ecbc57a86845dd5882796cfc585aed Mon Sep 17 00:00:00 2001 From: RD Babiera Date: Tue, 27 Feb 2024 21:59:34 +0000 Subject: [PATCH 039/111] UPSTREAM: usb: typec: class: fix typec_altmode_put_partner to put plugs usb: typec: class: fix typec_altmode_put_partner to put plugs When typec_altmode_put_partner is called by a plug altmode upon release, the port altmode the plug belongs to will not remove its reference to the plug. The check to see if the altmode being released is a plug evaluates against the released altmode's partner instead of the calling altmode, so change adev in typec_altmode_put_partner to properly refer to the altmode being released. Because typec_altmode_set_partner calls get_device() on the port altmode, add partner_adev that points to the port altmode in typec_put_partner to call put_device() on. typec_altmode_set_partner is not called for port altmodes, so add a check in typec_altmode_release to prevent typec_altmode_put_partner() calls on port altmode release. Fixes: 8a37d87d72f0 ("usb: typec: Bus type for alternate modes") Cc: Co-developed-by: Christian A. Ehrhardt Signed-off-by: Christian A. Ehrhardt Signed-off-by: RD Babiera Tested-by: Christian A. Ehrhardt Acked-by: Heikki Krogerus Link: https://lore.kernel.org/r/20240103181754.2492492-2-rdbabiera@google.com Signed-off-by: Greg Kroah-Hartman Bug: 324496488 (cherry picked from commit 5962ded777d689cd8bf04454273e32228d7fb71f) Change-Id: I688a333753b2e8069c0437a6d9dea30bf029c92c Signed-off-by: RD Babiera --- drivers/usb/typec/class.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c index 3c3bab33e03a..3da404d5178d 100644 --- a/drivers/usb/typec/class.c +++ b/drivers/usb/typec/class.c @@ -263,11 +263,13 @@ static void typec_altmode_put_partner(struct altmode *altmode) { struct altmode *partner = altmode->partner; struct typec_altmode *adev; + struct typec_altmode *partner_adev; if (!partner) return; - adev = &partner->adev; + adev = &altmode->adev; + partner_adev = &partner->adev; if (is_typec_plug(adev->dev.parent)) { struct typec_plug *plug = to_typec_plug(adev->dev.parent); @@ -276,7 +278,7 @@ static void typec_altmode_put_partner(struct altmode *altmode) } else { partner->partner = NULL; } - put_device(&adev->dev); + put_device(&partner_adev->dev); } /** @@ -497,7 +499,8 @@ static void typec_altmode_release(struct device *dev) { struct altmode *alt = to_altmode(to_typec_altmode(dev)); - typec_altmode_put_partner(alt); + if (!is_typec_port(dev->parent)) + typec_altmode_put_partner(alt); altmode_id_remove(alt->adev.dev.parent, alt->id); kfree(alt); From 95805f9e46c7fea597709005eb36d952be24a1a3 Mon Sep 17 00:00:00 2001 From: Kisung Lee Date: Wed, 21 Feb 2024 02:19:29 +0000 Subject: [PATCH 040/111] ANDROID: GKI: add GKI symbol list for Exynosauto SoC This patch add GKI symbol list for Exynosauto SoC. We need to add 2 functions symbol to support our vdriver. 2 function symbol(s) added 'unsigned long devm_get_free_pages(struct device*, gfp_t, unsigned int)' 'int kill_pid(struct pid*, int, int)' Bug: 326148350 Signed-off-by: Kisung Lee Change-Id: Ia8dca21f474b41bf206ad0333e5b0b2649f96ae6 --- android/abi_gki_aarch64.stg | 34 ++++++++ android/abi_gki_aarch64_exynosauto | 122 +++++++++++++++++++---------- 2 files changed, 114 insertions(+), 42 deletions(-) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 17303498595f..c636e40accdd 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -301635,6 +301635,13 @@ function { return_type_id: 0x336e8c54 parameter_id: 0x0258f96e } +function { + id: 0x32ed092e + return_type_id: 0x33756485 + parameter_id: 0x0258f96e + parameter_id: 0xf1a6dfed + parameter_id: 0x4585663f +} function { id: 0x33281d02 return_type_id: 0x33756485 @@ -317615,6 +317622,13 @@ function { parameter_id: 0x1ddf3f71 parameter_id: 0x391f15ea } +function { + id: 0x9a14f19b + return_type_id: 0x6720d32f + parameter_id: 0x18456730 + parameter_id: 0x6720d32f + parameter_id: 0x6720d32f +} function { id: 0x9a16828c return_type_id: 0x6720d32f @@ -356100,6 +356114,15 @@ elf_symbol { type_id: 0xa6579ee9 full_name: "devm_get_clk_from_child" } +elf_symbol { + id: 0x4f3cedfb + name: "devm_get_free_pages" + is_defined: true + symbol_type: FUNCTION + crc: 0x4c601a67 + type_id: 0x32ed092e + full_name: "devm_get_free_pages" +} elf_symbol { id: 0x15a83ee8 name: "devm_gh_rm_register_platform_ops" @@ -371874,6 +371897,15 @@ elf_symbol { type_id: 0x1923cb99 full_name: "kill_litter_super" } +elf_symbol { + id: 0x95c81f5f + name: "kill_pid" + is_defined: true + symbol_type: FUNCTION + crc: 0xb5a8e08b + type_id: 0x9a14f19b + full_name: "kill_pid" +} elf_symbol { id: 0x053e25cb name: "kimage_vaddr" @@ -405928,6 +405960,7 @@ interface { symbol_id: 0x3a75a119 symbol_id: 0x5b50e567 symbol_id: 0xd4aa5b9b + symbol_id: 0x4f3cedfb symbol_id: 0x15a83ee8 symbol_id: 0x010f4f76 symbol_id: 0x33c681cd @@ -407678,6 +407711,7 @@ interface { symbol_id: 0xe657d525 symbol_id: 0x661955d6 symbol_id: 0xd6a8ff16 + symbol_id: 0x95c81f5f symbol_id: 0x053e25cb symbol_id: 0x567c8a8a symbol_id: 0xbc2dc163 diff --git a/android/abi_gki_aarch64_exynosauto b/android/abi_gki_aarch64_exynosauto index 3e1138f25bc1..e8f11ba430b5 100644 --- a/android/abi_gki_aarch64_exynosauto +++ b/android/abi_gki_aarch64_exynosauto @@ -1,9 +1,11 @@ [abi_symbol_list] # commonly used symbols + alloc_chrdev_region __alloc_pages __alloc_percpu alloc_workqueue alt_cb_patch_nops + anon_inode_getfile __arch_copy_from_user __arch_copy_to_user arm64_use_ng_mappings @@ -13,6 +15,7 @@ atomic_notifier_chain_unregister __bitmap_and bitmap_find_free_region + bitmap_parselist bitmap_release_region __bitmap_weight blocking_notifier_call_chain @@ -22,19 +25,25 @@ bpf_trace_run2 bpf_trace_run3 bpf_trace_run4 + bpf_trace_run5 bpf_trace_run6 call_rcu cancel_delayed_work cancel_delayed_work_sync cancel_work_sync + cdev_add + cdev_del cdev_init __check_object_size __class_create class_destroy + __class_register + class_unregister clk_disable clk_enable clk_get clk_get_rate + __clk_is_enabled clk_prepare clk_set_rate clk_unprepare @@ -52,6 +61,7 @@ cpu_pm_register_notifier __cpu_possible_mask crc32_le + _ctype debugfs_create_dir debugfs_create_file debugfs_create_u32 @@ -116,6 +126,8 @@ devm_snd_soc_register_component devm_thermal_of_zone_register _dev_notice + dev_pm_opp_put + _dev_printk devres_add __devres_alloc_node dev_set_name @@ -141,6 +153,7 @@ dma_fence_release dma_fence_remove_callback dma_fence_signal + dma_fence_signal_locked dma_fence_wait_timeout dma_free_attrs dma_heap_buffer_alloc @@ -172,6 +185,8 @@ drm_atomic_helper_connector_destroy_state drm_atomic_helper_connector_duplicate_state drm_atomic_helper_connector_reset + __drm_atomic_helper_private_obj_duplicate_state + drm_atomic_private_obj_init drm_bridge_add drm_bridge_remove drm_compat_ioctl @@ -226,7 +241,6 @@ drm_kms_helper_poll_init drmm_mode_config_init drm_mode_config_cleanup - drm_mode_copy drm_mode_create drm_mode_duplicate drm_mode_object_put @@ -235,6 +249,7 @@ drm_modeset_unlock drm_mode_vrefresh drm_object_attach_property + drm_object_property_set_value drm_open drm_poll drm_prime_gem_destroy @@ -285,7 +300,6 @@ gpiod_set_raw_value gpiod_set_value_cansleep gpio_free - gpio_request gpio_request_one gpio_to_desc handle_edge_irq @@ -312,6 +326,7 @@ iomem_resource iommu_get_domain_for_dev iommu_map + iommu_map_sg iommu_register_device_fault_handler iommu_unmap iommu_unregister_device_fault_handler @@ -390,7 +405,9 @@ loops_per_jiffy mdiobus_read mdiobus_write + memchr_inv memcpy + __memcpy_fromio memdup_user mem_section memset @@ -507,6 +524,7 @@ platform_get_irq_optional platform_get_resource platform_get_resource_byname + __pm_relax __pm_runtime_disable pm_runtime_enable pm_runtime_forbid @@ -518,7 +536,9 @@ __pm_runtime_set_status __pm_runtime_suspend __pm_runtime_use_autosuspend + __pm_stay_awake pm_wakeup_dev_event + pm_wakeup_ws_event preempt_schedule preempt_schedule_notrace prepare_to_wait_event @@ -541,6 +561,7 @@ _raw_spin_unlock_irqrestore _raw_write_lock_irqsave _raw_write_unlock_irqrestore + rb_next rcu_barrier rdev_get_drvdata rdev_get_id @@ -548,6 +569,7 @@ regcache_mark_dirty regcache_sync __register_chrdev + register_chrdev_region register_console register_pm_notifier register_reboot_notifier @@ -579,6 +601,7 @@ seq_puts seq_read set_cpus_allowed_ptr + set_normalized_timespec64 sg_alloc_table sg_free_table sg_init_table @@ -589,6 +612,7 @@ simple_attr_write simple_open simple_read_from_buffer + simple_strtoul simple_write_to_buffer single_open single_release @@ -631,6 +655,7 @@ strstr __sw_hweight32 sync_file_create + synchronize_irq syscon_regmap_lookup_by_phandle sysfs_create_file_ns sysfs_create_group @@ -651,6 +676,7 @@ ttm_bo_mmap_obj __udelay __unregister_chrdev + unregister_chrdev_region unregister_pm_notifier up up_write @@ -689,6 +715,7 @@ video_unregister_device vmalloc vmap + vscnprintf vsnprintf vunmap vzalloc @@ -697,6 +724,8 @@ wait_for_completion_timeout __wake_up wake_up_process + wakeup_source_register + wakeup_source_unregister __warn_printk ww_mutex_lock ww_mutex_unlock @@ -712,6 +741,7 @@ cec_transmit_done_ts cec_unregister_adapter drm_bridge_hpd_notify + drm_mode_copy hdmi_avi_infoframe_init hdmi_avi_infoframe_pack i2c_new_ancillary_device @@ -749,15 +779,12 @@ # required by drm_display_helper.ko devm_backlight_device_register - _dev_printk drm_atomic_get_connector_state drm_atomic_get_crtc_state drm_atomic_get_new_private_obj_state drm_atomic_get_old_private_obj_state drm_atomic_get_private_obj_state - __drm_atomic_helper_private_obj_duplicate_state drm_atomic_private_obj_fini - drm_atomic_private_obj_init drm_crtc_commit_wait drm_crtc_wait_one_vblank __drm_debug @@ -766,9 +793,7 @@ drm_edid_duplicate drm_edid_get_monitor_name drm_modeset_lock_single_interruptible - drm_object_property_set_value __drm_printfn_debug - memchr_inv __sw_hweight8 system_long_wq @@ -794,6 +819,7 @@ nr_irqs proc_create register_die_notifier + register_module_notifier register_restart_handler return_address rtc_time64_to_tm @@ -855,9 +881,7 @@ platform_device_alloc platform_device_del platform_device_put - __pm_relax pm_runtime_allow - __pm_stay_awake typec_register_partner typec_register_port typec_set_data_role @@ -867,11 +891,8 @@ typec_unregister_port usb_gadget_set_state usb_otg_state_string - wakeup_source_register - wakeup_source_unregister # required by exynos-acme.ko - bitmap_parselist __cpu_active_mask cpufreq_cpu_get cpufreq_cpu_get_raw @@ -890,9 +911,6 @@ get_cpu_device system_state -# required by exynos-adv-tracer-s2d.ko - simple_strtoul - # required by exynos-chipid_v2.ko of_find_node_opts_by_path soc_device_register @@ -904,7 +922,6 @@ __cpu_present_mask # required by exynos-debug-test.ko - _ctype remove_cpu smp_call_function smp_call_function_single @@ -961,6 +978,7 @@ drm_atomic_helper_update_plane drm_atomic_helper_wait_for_vblanks drm_bridge_attach + drm_connector_set_path_property drm_crtc_arm_vblank_event drm_crtc_handle_vblank drm_crtc_init_with_planes @@ -978,9 +996,11 @@ drm_gem_vm_open drm_get_connector_status_name drm_get_format_info + drm_helper_probe_detect drm_mode_config_helper_resume drm_mode_config_helper_suspend drm_mode_config_reset + drm_mode_object_find drm_mode_object_get drm_of_component_match_add drm_of_crtc_port_mask @@ -996,6 +1016,7 @@ drm_plane_create_zpos_immutable_property drm_plane_create_zpos_property __drm_printfn_info + drm_property_blob_put drm_property_create drm_property_create_blob drm_rotation_simplify @@ -1004,7 +1025,6 @@ drm_writeback_connector_init drm_writeback_queue_job drm_writeback_signal_completion - flush_signals gpiod_to_irq mipi_dsi_host_register mipi_dsi_host_unregister @@ -1012,6 +1032,7 @@ of_drm_find_panel of_find_i2c_device_by_node of_graph_get_endpoint_by_regs + of_graph_get_endpoint_count of_graph_get_next_endpoint of_graph_get_port_by_id of_graph_get_remote_port @@ -1023,8 +1044,6 @@ platform_find_device_by_driver seq_hex_dump seq_release - strnstr - synchronize_irq vmalloc_to_page # required by exynos_mfc.ko @@ -1032,7 +1051,6 @@ dma_buf_begin_cpu_access_partial dma_buf_end_cpu_access_partial hex_dump_to_buffer - iommu_map_sg __sw_hweight64 _totalram_pages @@ -1091,8 +1109,6 @@ hrtimer_try_to_cancel # required by hwmon.ko - __class_register - class_unregister device_property_read_string devres_free devres_release @@ -1112,8 +1128,6 @@ i2c_smbus_xfer i2c_transfer_buffer_flags i2c_verify_client - register_chrdev_region - unregister_chrdev_region # required by lontium-lt9611.ko drm_hdmi_avi_infoframe_from_display_mode @@ -1121,6 +1135,28 @@ regmap_multi_reg_write regulator_set_load +# required by npu.ko + __bitmap_clear + __bitmap_set + cdev_alloc + console_printk + cpuidle_pause_and_lock + cpuidle_resume_and_unlock + devm_clk_put + dev_pm_opp_find_freq_ceil + dev_pm_opp_find_freq_floor + dma_fence_free + fget + _find_next_zero_bit + firmware_request_nowarn + __kfifo_in + __kfifo_out + of_irq_parse_one + rb_erase + rb_insert_color + strrchr + sysfs_remove_file_ns + # required by panel-samsung-dummy.ko drm_panel_add drm_panel_init @@ -1138,7 +1174,7 @@ phylink_mii_c22_pcs_encode_advertisement # required by phy-exynosauto-usbdrd-super.ko - __clk_is_enabled + gpio_request # required by pinctrl-samsung-core.ko device_get_next_child_node @@ -1209,7 +1245,6 @@ # required by rtc-s2vps02.ko devm_rtc_device_register - pm_wakeup_ws_event rtc_update_irq rtc_valid_tm @@ -1241,7 +1276,6 @@ regulator_set_voltage unregister_reboot_notifier vb2_mmap - vscnprintf # required by samsung-bridge-dummy.ko drm_atomic_helper_bridge_propagate_bus_fmt @@ -1257,7 +1291,6 @@ # required by samsung_dma_heap.ko adjust_managed_page_count - anon_inode_getfile deferred_free dma_buf_get_flags dmabuf_page_pool_alloc @@ -1298,8 +1331,11 @@ # required by scaler.ko clk_set_parent + devm_get_free_pages dma_fence_default_wait dma_heap_buffer_free + flush_signals + kill_pid sync_file_get_fence v4l2_ctrl_handler_free v4l2_ctrl_handler_init_class @@ -1334,14 +1370,14 @@ backlight_device_unregister __bitmap_andnot __bitmap_xor - bpf_trace_run5 bpf_trace_run9 capable devfreq_recommended_opp + devfreq_resume_device + devfreq_suspend_device __devm_drm_dev_alloc devm_iounmap dev_pm_opp_get_voltage - dev_pm_opp_put dev_pm_qos_update_request dma_buf_dynamic_attach dma_buf_move_notify @@ -1352,7 +1388,6 @@ dma_fence_chain_walk dma_fence_get_status dma_fence_get_stub - dma_fence_signal_locked dma_fence_wait_any_timeout dma_get_required_mask dma_resv_add_fence @@ -1433,7 +1468,6 @@ jiffies64_to_msecs jiffies_to_usecs kobject_put - __memcpy_fromio __memcpy_toio memremap memunmap @@ -1475,12 +1509,10 @@ __rb_erase_color rb_first_postorder __rb_insert_augmented - rb_next rb_next_postorder __rcu_read_lock __rcu_read_unlock seq_write - set_normalized_timespec64 sg_alloc_table_from_pages_segment si_meminfo sysfs_create_files @@ -1547,12 +1579,13 @@ snd_soc_jack_report # required by snd-soc-samsung-abox-core.ko - __devm_regmap_init + devm_ioremap_wc __devm_regmap_init_mmio_clk __devm_request_region dma_mmap_attrs irq_set_affinity kthread_bind + of_property_match_string __platform_register_drivers platform_unregister_drivers pm_runtime_no_callbacks @@ -1569,10 +1602,10 @@ snd_soc_dapm_mux_update_power snd_soc_dapm_new_control snd_soc_dapm_new_controls + snd_soc_new_compress snd_soc_set_runtime_hwparams snd_soc_unregister_component stpcpy - __tasklet_hi_schedule # required by snd-soc-tas6424.ko regcache_cache_only @@ -1748,14 +1781,20 @@ xsk_uses_need_wakeup # required by sxgmac.ko - alloc_chrdev_region - cdev_add gpiod_direction_output gpiod_set_value # required by ufs-exynosauto-core.ko + __crypto_memneq + devm_blk_crypto_profile_init + dmam_free_coherent scsi_dma_unmap scsi_done + __traceiter_android_vh_ufs_fill_prdt + __traceiter_android_vh_ufs_prepare_command + __tracepoint_android_vh_ufs_fill_prdt + __tracepoint_android_vh_ufs_prepare_command + trace_print_symbols_seq ufshcd_auto_hibern8_update ufshcd_config_pwr_mode ufshcd_dme_get_attr @@ -1774,10 +1813,8 @@ console_suspend_enabled current_work default_wake_function + __devm_regmap_init dma_buf_fd - drm_connector_set_path_property - drm_helper_probe_detect - drm_property_blob_put irq_create_of_mapping irq_dispose_mapping irq_find_matching_fwspec @@ -1791,7 +1828,6 @@ nonseekable_open of_clk_del_provider of_find_node_by_type - of_graph_get_endpoint_count of_irq_find_parent pci_disable_device pci_disable_msi @@ -1809,8 +1845,10 @@ remove_proc_entry remove_wait_queue sigprocmask + strnstr sysfs_create_bin_file sysfs_remove_bin_file + __tasklet_hi_schedule __task_pid_nr_ns thermal_of_zone_register thermal_of_zone_unregister From ecb45e2a73b6ffa23f99a7fca4acb1e8eba623e3 Mon Sep 17 00:00:00 2001 From: Sabrina Dubroca Date: Tue, 6 Feb 2024 17:18:22 -0800 Subject: [PATCH 041/111] UPSTREAM: net: tls: fix use-after-free with partial reads and async decrypt [ Upstream commit 32b55c5ff9103b8508c1e04bfa5a08c64e7a925f ] tls_decrypt_sg doesn't take a reference on the pages from clear_skb, so the put_page() in tls_decrypt_done releases them, and we trigger a use-after-free in process_rx_list when we try to read from the partially-read skb. Bug: 326214405 Fixes: fd31f3996af2 ("tls: rx: decrypt into a fresh skb") Signed-off-by: Sabrina Dubroca Signed-off-by: Jakub Kicinski Reviewed-by: Simon Horman Signed-off-by: David S. Miller Signed-off-by: Sasha Levin (cherry picked from commit d684763534b969cca1022e2a28645c7cc91f7fa5) Signed-off-by: Lee Jones Change-Id: Ifdd765d0af082523d1432436b6f6d2c094c48dca --- net/tls/tls_sw.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index 080d7ea350aa..fb6337adef53 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -62,6 +62,7 @@ struct tls_decrypt_ctx { u8 iv[MAX_IV_SIZE]; u8 aad[TLS_MAX_AAD_SIZE]; u8 tail; + bool free_sgout; struct scatterlist sg[]; }; @@ -186,7 +187,6 @@ static void tls_decrypt_done(crypto_completion_data_t *data, int err) struct aead_request *aead_req = crypto_get_completion_data(data); struct crypto_aead *aead = crypto_aead_reqtfm(aead_req); struct scatterlist *sgout = aead_req->dst; - struct scatterlist *sgin = aead_req->src; struct tls_sw_context_rx *ctx; struct tls_decrypt_ctx *dctx; struct tls_context *tls_ctx; @@ -212,7 +212,7 @@ static void tls_decrypt_done(crypto_completion_data_t *data, int err) } /* Free the destination pages if skb was not decrypted inplace */ - if (sgout != sgin) { + if (dctx->free_sgout) { /* Skip the first S/G entry as it points to AAD */ for_each_sg(sg_next(sgout), sg, UINT_MAX, pages) { if (!sg) @@ -1591,6 +1591,7 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov, } else if (out_sg) { memcpy(sgout, out_sg, n_sgout * sizeof(*sgout)); } + dctx->free_sgout = !!pages; /* Prepare and submit AEAD request */ err = tls_do_decryption(sk, sgin, sgout, dctx->iv, From 6bad1052c28eb81fa5efa499c4700c525544daea Mon Sep 17 00:00:00 2001 From: Todd Kjos Date: Thu, 7 Mar 2024 19:19:14 +0000 Subject: [PATCH 042/111] Revert "Merge tag 'android14-6.1.75_r00' into android14-6.1" This reverts commit 1dbafe61e3585e5bbc80c1bff055ffcd6fbc77a7. Reason for revert: Too early. Needs to wait until 2024-03-27 Change-Id: I769b944bd089aa2278659ec87f7ba4ac4e74ee4a Signed-off-by: Todd Kjos --- .../bindings/gpio/xlnx,gpio-xilinx.yaml | 2 +- .../bindings/media/mediatek,mdp3-rdma.yaml | 29 +- .../bindings/media/mediatek,mdp3-wrot.yaml | 23 +- .../bindings/media/rockchip-isp1.yaml | 11 +- .../devicetree/bindings/nvmem/mxs-ocotp.yaml | 10 +- Documentation/driver-api/pci/p2pdma.rst | 16 +- MAINTAINERS | 2 - Makefile | 2 +- android/abi_gki_aarch64.stg | 43 +- arch/Kconfig | 3 - arch/arc/kernel/signal.c | 6 +- arch/arm/boot/dts/am33xx.dtsi | 1 - arch/arm/boot/dts/dra7.dtsi | 2 +- arch/arm/boot/dts/qcom-apq8064.dtsi | 2 +- arch/arm/boot/dts/qcom-sdx65.dtsi | 2 +- arch/arm/boot/dts/stm32mp157a-dk1-scmi.dts | 2 +- arch/arm/boot/dts/stm32mp157c-dk2-scmi.dts | 2 +- arch/arm/boot/dts/stm32mp157c-ed1-scmi.dts | 2 +- arch/arm/boot/dts/stm32mp157c-ev1-scmi.dts | 3 +- arch/arm/mach-davinci/Kconfig | 2 - arch/arm/mach-omap2/id.c | 5 - arch/arm/mach-sunxi/mc_smp.c | 10 +- arch/arm64/Makefile | 2 +- arch/arm64/boot/dts/freescale/imx8mm.dtsi | 4 +- .../boot/dts/hisilicon/hikey970-pmic.dtsi | 3 + .../dts/marvell/armada-3720-turris-mox.dts | 2 +- arch/arm64/boot/dts/mediatek/mt8183.dtsi | 6 +- arch/arm64/boot/dts/qcom/ipq6018.dtsi | 73 +- arch/arm64/boot/dts/qcom/qrb5165-rb5.dts | 2 +- arch/arm64/boot/dts/qcom/sc7180.dtsi | 2 +- .../boot/dts/qcom/sc7280-chrome-common.dtsi | 24 - arch/arm64/boot/dts/qcom/sc7280.dtsi | 20 +- arch/arm64/boot/dts/qcom/sc8280xp.dtsi | 2 +- arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi | 24 +- arch/arm64/boot/dts/qcom/sdm845-db845c.dts | 6 +- .../arm64/boot/dts/qcom/sdm845-lg-common.dtsi | 6 +- arch/arm64/boot/dts/qcom/sdm845-mtp.dts | 6 +- .../boot/dts/qcom/sdm845-oneplus-common.dtsi | 6 +- .../boot/dts/qcom/sdm845-shift-axolotl.dts | 6 +- .../dts/qcom/sdm845-sony-xperia-tama.dtsi | 6 +- .../boot/dts/qcom/sdm845-xiaomi-beryllium.dts | 2 +- .../boot/dts/qcom/sdm845-xiaomi-polaris.dts | 6 +- arch/arm64/boot/dts/qcom/sdm845.dtsi | 2 +- .../boot/dts/qcom/sdm850-lenovo-yoga-c630.dts | 2 +- .../boot/dts/qcom/sdm850-samsung-w737.dts | 2 +- arch/arm64/boot/dts/qcom/sm6350.dtsi | 2 +- arch/arm64/boot/dts/qcom/sm8150-hdk.dts | 12 +- arch/arm64/boot/dts/qcom/sm8150.dtsi | 2 +- arch/arm64/boot/dts/qcom/sm8250.dtsi | 2 +- arch/arm64/boot/dts/qcom/sm8350.dtsi | 4 +- .../dts/renesas/r8a779g0-white-hawk-cpu.dtsi | 3 - .../dts/rockchip/rk3399-gru-chromebook.dtsi | 3 +- .../dts/rockchip/rk3399-gru-scarlet-dumo.dts | 4 +- arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi | 1 - arch/arm64/boot/dts/rockchip/rk356x.dtsi | 2 +- arch/arm64/boot/dts/ti/k3-am62a-main.dtsi | 4 +- arch/arm64/boot/dts/ti/k3-am65-main.dtsi | 2 +- arch/arm64/include/asm/pgtable.h | 6 - arch/arm64/kvm/arm.c | 2 +- arch/arm64/kvm/vgic/vgic-init.c | 47 +- arch/arm64/kvm/vgic/vgic-its.c | 5 - arch/arm64/kvm/vgic/vgic-mmio-v3.c | 29 +- arch/arm64/kvm/vgic/vgic.h | 1 - arch/csky/include/asm/jump_label.h | 5 - arch/loongarch/Makefile | 2 - arch/loongarch/include/asm/elf.h | 7 +- arch/loongarch/kernel/elf.c | 5 + arch/loongarch/kernel/process.c | 1 - arch/loongarch/kernel/time.c | 27 +- arch/loongarch/net/bpf_jit.c | 5 +- arch/mips/alchemy/devboards/db1200.c | 2 +- arch/mips/alchemy/devboards/db1550.c | 2 +- .../boot/dts/loongson/loongson64-2k1000.dtsi | 3 +- arch/mips/boot/dts/loongson/ls7a-pch.dtsi | 3 +- arch/mips/include/asm/dmi.h | 2 +- arch/mips/kernel/setup.c | 4 +- arch/mips/kernel/smp.c | 4 +- arch/powerpc/Kconfig | 1 - arch/powerpc/Makefile | 17 +- arch/powerpc/kernel/trace/ftrace_mprofile.S | 4 +- arch/powerpc/lib/Makefile | 4 +- arch/powerpc/perf/imc-pmu.c | 6 - arch/powerpc/platforms/44x/Kconfig | 1 - arch/powerpc/platforms/powernv/opal-irqchip.c | 2 - .../powerpc/platforms/powernv/opal-powercap.c | 6 - arch/powerpc/platforms/powernv/opal-xscom.c | 5 - .../platforms/pseries/hotplug-memory.c | 9 +- arch/riscv/include/asm/sections.h | 1 - arch/riscv/include/asm/signal.h | 2 +- arch/riscv/include/asm/xip_fixup.h | 2 +- arch/riscv/kernel/module.c | 3 +- arch/riscv/kernel/patch.c | 11 +- arch/riscv/kernel/vmlinux-xip.lds.S | 2 - arch/riscv/kernel/vmlinux.lds.S | 2 - arch/riscv/mm/pageattr.c | 275 +---- arch/s390/include/asm/fpu/api.h | 2 +- arch/s390/include/asm/pci_io.h | 32 +- arch/s390/kernel/perf_cpum_cf.c | 35 +- arch/s390/mm/vmem.c | 8 +- arch/s390/pci/pci_mmio.c | 12 +- arch/x86/events/intel/core.c | 7 +- arch/x86/events/intel/uncore_discovery.c | 18 +- arch/x86/hyperv/hv_init.c | 25 +- arch/x86/kernel/alternative.c | 2 +- arch/x86/kernel/cpu/mce/inject.c | 1 - arch/x86/kernel/kprobes/core.c | 3 +- arch/x86/kernel/kvmclock.c | 12 +- arch/x86/lib/misc.c | 2 +- arch/x86/net/bpf_jit_comp.c | 122 +- arch/x86/xen/Kconfig | 1 - block/bdev.c | 2 - block/bio.c | 38 +- block/blk-cgroup.c | 13 - block/blk-mq.c | 105 +- block/blk-settings.c | 2 +- block/blk-throttle.c | 2 - block/fops.c | 21 +- block/genhd.c | 5 +- block/ioctl.c | 11 +- build.config.db845c | 2 - crypto/af_alg.c | 14 +- crypto/scompress.c | 6 - drivers/acpi/acpi_extlog.c | 7 +- drivers/acpi/acpi_lpit.c | 2 +- drivers/acpi/acpi_lpss.c | 3 +- drivers/acpi/acpi_video.c | 12 +- drivers/acpi/property.c | 4 - drivers/acpi/resource.c | 7 - drivers/android/binder.c | 2 +- drivers/android/binder_alloc.c | 47 +- drivers/atm/solos-pci.c | 8 +- drivers/base/memory.c | 18 +- drivers/base/node.c | 9 +- drivers/base/swnode.c | 3 - drivers/block/loop.c | 92 +- drivers/block/nbd.c | 76 +- drivers/block/null_blk/main.c | 13 +- drivers/block/ublk_drv.c | 40 +- drivers/block/virtio_blk.c | 8 +- drivers/bluetooth/btmtkuart.c | 11 +- drivers/bluetooth/hci_vhci.c | 10 +- drivers/bus/ti-sysc.c | 18 +- drivers/clk/clk-si5341.c | 4 +- drivers/clk/qcom/gpucc-sm8150.c | 4 +- drivers/clk/qcom/videocc-sm8150.c | 5 - drivers/clk/renesas/rzg2l-cpg.c | 91 +- drivers/clk/rockchip/clk-rk3128.c | 2 +- drivers/clk/rockchip/clk-rk3568.c | 1 - drivers/clk/zynqmp/clk-mux-zynqmp.c | 2 +- drivers/clk/zynqmp/divider.c | 66 +- drivers/clocksource/timer-ti-dm.c | 4 +- drivers/cpufreq/cpufreq-dt-platdev.c | 2 +- drivers/cpufreq/imx-cpufreq-dt.c | 2 +- drivers/cpufreq/imx6q-cpufreq.c | 4 +- drivers/cpufreq/scmi-cpufreq.c | 7 +- drivers/cpufreq/tegra20-cpufreq.c | 2 +- drivers/crypto/ccp/ccp-ops.c | 5 +- drivers/crypto/hisilicon/hpre/hpre_main.c | 122 +- drivers/crypto/hisilicon/qm.c | 98 +- drivers/crypto/hisilicon/sec2/sec.h | 7 - drivers/crypto/hisilicon/sec2/sec_crypto.c | 13 +- drivers/crypto/hisilicon/sec2/sec_main.c | 70 +- drivers/crypto/hisilicon/zip/zip_main.c | 173 +-- .../crypto/inside-secure/safexcel_cipher.c | 19 +- drivers/crypto/sa2ul.c | 3 +- drivers/crypto/sahara.c | 250 ++-- drivers/crypto/virtio/virtio_crypto_common.h | 2 - drivers/crypto/virtio/virtio_crypto_core.c | 40 +- drivers/cxl/core/port.c | 2 +- drivers/cxl/core/region.c | 2 +- drivers/dma/stm32-dma.c | 8 +- drivers/edac/thunderx_edac.c | 10 +- drivers/firewire/ohci.c | 51 - drivers/firmware/arm_scmi/perf.c | 6 +- drivers/firmware/meson/meson_sm.c | 5 +- drivers/firmware/ti_sci.c | 10 +- drivers/gpio/gpio-dwapb.c | 12 +- drivers/gpio/gpiolib-cdev.c | 16 +- drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 10 +- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 11 +- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 - drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c | 3 +- drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c | 28 - drivers/gpu/drm/amd/amdgpu/soc15.c | 12 +- drivers/gpu/drm/amd/amdkfd/kfd_migrate.c | 7 +- drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 21 +- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 - .../drm/amd/display/dc/bios/bios_parser2.c | 19 +- .../dc/clk_mgr/dcn315/dcn315_clk_mgr.c | 8 +- drivers/gpu/drm/amd/display/dc/dc_hw_types.h | 1 - .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 3 +- .../gpu/drm/amd/display/dc/dcn20/dcn20_hubp.c | 12 +- .../drm/amd/display/dc/dcn30/dcn30_hwseq.c | 3 - .../drm/amd/display/dc/dml/dcn20/dcn20_fpu.c | 110 +- .../display/include/grph_object_ctrl_defs.h | 2 - .../amd/display/modules/power/power_helpers.c | 2 - drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c | 4 +- .../gpu/drm/amd/pm/legacy-dpm/legacy_dpm.c | 52 +- drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c | 5 +- .../drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c | 6 +- .../drm/bridge/cadence/cdns-mhdp8546-hdcp.c | 3 +- drivers/gpu/drm/bridge/tc358767.c | 2 +- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 4 +- drivers/gpu/drm/bridge/ti-tpd12s015.c | 4 +- drivers/gpu/drm/drm_crtc.c | 8 +- drivers/gpu/drm/drm_drv.c | 10 +- drivers/gpu/drm/exynos/exynos_drm_dma.c | 8 +- drivers/gpu/drm/exynos/exynos_hdmi.c | 2 - drivers/gpu/drm/i915/display/intel_atomic.c | 193 ++- drivers/gpu/drm/i915/display/intel_atomic.h | 4 + drivers/gpu/drm/i915/display/intel_display.c | 11 - drivers/gpu/drm/i915/display/intel_dp.c | 2 +- drivers/gpu/drm/i915/display/intel_fb.c | 26 +- drivers/gpu/drm/i915/display/skl_scaler.c | 257 ---- drivers/gpu/drm/i915/display/skl_scaler.h | 10 +- drivers/gpu/drm/mediatek/mtk_disp_merge.c | 2 +- drivers/gpu/drm/mediatek/mtk_dp.c | 1 - drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 5 - drivers/gpu/drm/mediatek/mtk_mdp_rdma.c | 3 +- drivers/gpu/drm/mgag200/mgag200_drv.h | 5 - drivers/gpu/drm/mgag200/mgag200_g200er.c | 5 - drivers/gpu/drm/mgag200/mgag200_g200ev.c | 5 - drivers/gpu/drm/mgag200/mgag200_g200se.c | 5 - drivers/gpu/drm/mgag200/mgag200_mode.c | 10 +- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 4 +- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 4 +- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c | 6 +- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h | 4 +- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c | 6 +- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h | 3 +- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c | 20 +- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h | 8 +- drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c | 9 - drivers/gpu/drm/nouveau/nv04_fence.c | 2 +- .../drm/nouveau/nvkm/subdev/mmu/vmmtu102.c | 2 +- drivers/gpu/drm/omapdrm/omap_drv.c | 9 +- drivers/gpu/drm/panel/panel-elida-kd35t133.c | 2 - drivers/gpu/drm/panel/panel-sitronix-st7701.c | 2 +- drivers/gpu/drm/panfrost/panfrost_gpu.c | 70 +- drivers/gpu/drm/radeon/r100.c | 4 +- drivers/gpu/drm/radeon/r600_cs.c | 4 +- drivers/gpu/drm/radeon/radeon_display.c | 7 +- drivers/gpu/drm/radeon/radeon_vm.c | 8 +- drivers/gpu/drm/radeon/si.c | 4 - drivers/gpu/drm/radeon/sumo_dpm.c | 4 +- drivers/gpu/drm/radeon/trinity_dpm.c | 4 +- drivers/gpu/drm/tidss/tidss_dispc.c | 63 +- drivers/gpu/drm/tidss/tidss_kms.c | 4 + drivers/gpu/drm/tilcdc/tilcdc_drv.c | 2 +- drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 7 +- drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c | 8 +- drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 20 - drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 12 +- drivers/gpu/drm/vmwgfx/vmwgfx_gem.c | 24 +- drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 10 +- drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c | 3 +- drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | 18 +- drivers/gpu/drm/vmwgfx/vmwgfx_shader.c | 5 +- drivers/gpu/drm/vmwgfx/vmwgfx_surface.c | 27 +- drivers/hid/hid-asus.c | 27 +- drivers/hid/hid-glorious.c | 16 +- drivers/hid/hid-ids.h | 11 +- drivers/hid/hid-lenovo.c | 3 +- drivers/hid/hid-multitouch.c | 5 - drivers/hid/hid-nintendo.c | 71 +- drivers/hid/hid-quirks.c | 1 - drivers/hid/i2c-hid/i2c-hid-acpi.c | 15 +- drivers/hid/wacom_wac.c | 32 +- drivers/hwmon/corsair-psu.c | 18 +- drivers/hwtracing/coresight/coresight-etm4x.h | 2 +- drivers/hwtracing/ptt/hisi_ptt.c | 9 +- drivers/i2c/busses/i2c-aspeed.c | 48 +- drivers/i2c/busses/i2c-rk3x.c | 13 +- drivers/i2c/busses/i2c-s3c2410.c | 40 +- drivers/i2c/i2c-core.h | 4 +- drivers/iio/adc/ad7091r-base.c | 6 +- drivers/iio/adc/ad9467.c | 105 +- drivers/iio/adc/adi-axi-adc.c | 74 +- drivers/iio/adc/ti_am335x_adc.c | 4 +- .../buffer/industrialio-triggered-buffer.c | 10 - .../iio/common/ms_sensors/ms_sensors_i2c.c | 4 +- drivers/iio/imu/adis16475.c | 129 +- drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 4 +- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 6 +- drivers/infiniband/hw/hns/hns_roce_pd.c | 2 +- drivers/infiniband/hw/mthca/mthca_cmd.c | 4 +- drivers/infiniband/hw/mthca/mthca_main.c | 2 +- drivers/infiniband/ulp/iser/iscsi_iser.h | 2 + drivers/infiniband/ulp/iser/iser_initiator.c | 5 +- drivers/infiniband/ulp/iser/iser_memory.c | 8 +- drivers/infiniband/ulp/iser/iser_verbs.c | 1 + drivers/input/joystick/xpad.c | 1 - drivers/input/keyboard/atkbd.c | 50 +- drivers/input/keyboard/ipaq-micro-keys.c | 3 - drivers/input/misc/soc_button_array.c | 5 - drivers/input/mouse/synaptics.c | 1 - drivers/input/serio/i8042-acpipnpio.h | 8 - drivers/interconnect/core.c | 3 - drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 1 - drivers/iommu/dma-iommu.c | 5 - drivers/leds/Kconfig | 1 - drivers/leds/trigger/ledtrig-tty.c | 4 - drivers/md/Kconfig | 1 - drivers/md/bcache/bcache.h | 1 - drivers/md/bcache/btree.c | 7 - drivers/md/bcache/super.c | 4 +- drivers/md/bcache/writeback.c | 2 +- drivers/md/dm-bufio.c | 7 - drivers/md/dm-integrity.c | 11 +- drivers/md/dm-thin-metadata.c | 58 +- drivers/md/md.c | 22 +- drivers/md/persistent-data/dm-block-manager.c | 6 - drivers/md/persistent-data/dm-block-manager.h | 1 - drivers/md/persistent-data/dm-space-map.h | 3 +- .../persistent-data/dm-transaction-manager.c | 3 - drivers/md/raid1.c | 12 +- drivers/media/dvb-core/dvbdev.c | 2 - drivers/media/dvb-frontends/m88ds3103.c | 7 +- .../platform/mediatek/jpeg/mtk_jpeg_core.c | 1 + .../platform/mediatek/jpeg/mtk_jpeg_dec_hw.c | 6 - drivers/media/platform/nxp/imx-mipi-csis.c | 4 +- .../platform/qcom/camss/camss-csid-gen2.c | 68 +- .../media/platform/qcom/camss/camss-csid.c | 44 +- .../media/platform/qcom/camss/camss-csid.h | 11 +- .../platform/rockchip/rkisp1/rkisp1-dev.c | 6 +- .../media/platform/verisilicon/hantro_drv.c | 2 - .../media/platform/verisilicon/hantro_v4l2.c | 3 - drivers/media/usb/cx231xx/cx231xx-core.c | 2 - drivers/media/usb/pvrusb2/pvrusb2-context.c | 3 +- drivers/mfd/intel-lpss.c | 2 +- drivers/mfd/syscon.c | 4 - .../misc/habanalabs/common/habanalabs_ioctl.c | 2 +- drivers/mmc/core/block.c | 7 +- drivers/mmc/core/host.c | 1 - drivers/mmc/host/Kconfig | 10 +- drivers/mmc/host/meson-mx-sdhc-mmc.c | 26 +- drivers/mmc/host/sdhci-sprd.c | 10 +- drivers/mtd/mtd_blkdevs.c | 4 +- drivers/mtd/nand/raw/fsl_ifc_nand.c | 2 +- drivers/net/amt.c | 6 +- drivers/net/dsa/vitesse-vsc73xx-core.c | 2 - drivers/net/ethernet/amazon/ena/ena_eth_com.c | 3 + drivers/net/ethernet/amazon/ena/ena_netdev.c | 30 +- .../net/ethernet/aquantia/atlantic/aq_ring.c | 5 +- .../net/ethernet/atheros/atl1e/atl1e_main.c | 5 +- .../net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 3 +- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 71 +- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 25 +- .../net/ethernet/broadcom/bnxt/bnxt_devlink.c | 11 +- .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 19 +- drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c | 5 +- .../net/ethernet/broadcom/genet/bcmgenet.c | 4 +- drivers/net/ethernet/broadcom/tg3.c | 11 +- drivers/net/ethernet/emulex/benet/be_main.c | 2 +- .../net/ethernet/freescale/dpaa2/dpaa2-eth.c | 7 +- .../ethernet/freescale/dpaa2/dpaa2-ethtool.c | 18 +- .../freescale/dpaa2/dpaa2-switch-flower.c | 7 +- .../ethernet/freescale/dpaa2/dpaa2-switch.c | 11 +- drivers/net/ethernet/freescale/fec_main.c | 27 +- .../net/ethernet/hisilicon/hns3/hns3_enet.c | 2 +- drivers/net/ethernet/intel/i40e/i40e_main.c | 11 +- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 2 +- .../ethernet/intel/i40e/i40e_virtchnl_pf.c | 34 +- .../ethernet/intel/i40e/i40e_virtchnl_pf.h | 3 - drivers/net/ethernet/intel/iavf/iavf.h | 1 - .../net/ethernet/intel/iavf/iavf_ethtool.c | 27 +- drivers/net/ethernet/intel/iavf/iavf_fdir.h | 15 +- drivers/net/ethernet/intel/iavf/iavf_main.c | 107 +- .../net/ethernet/intel/iavf/iavf_virtchnl.c | 71 +- drivers/net/ethernet/intel/ice/ice_main.c | 12 +- drivers/net/ethernet/intel/igc/igc.h | 1 - drivers/net/ethernet/intel/igc/igc_ethtool.c | 42 +- drivers/net/ethernet/intel/igc/igc_tsn.c | 2 +- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 2 +- .../net/ethernet/marvell/octeontx2/af/cgx.c | 35 +- .../net/ethernet/marvell/octeontx2/af/cgx.h | 6 +- .../marvell/octeontx2/af/lmac_common.h | 5 +- .../net/ethernet/marvell/octeontx2/af/npc.h | 4 +- .../net/ethernet/marvell/octeontx2/af/rpm.c | 11 +- .../net/ethernet/marvell/octeontx2/af/rvu.h | 3 +- .../ethernet/marvell/octeontx2/af/rvu_cgx.c | 43 +- .../marvell/octeontx2/af/rvu_debugfs.c | 2 +- .../marvell/octeontx2/af/rvu_devlink.c | 5 +- .../ethernet/marvell/octeontx2/af/rvu_nix.c | 120 +- .../ethernet/marvell/octeontx2/af/rvu_npc.c | 55 +- .../marvell/octeontx2/af/rvu_npc_hash.c | 4 +- .../marvell/octeontx2/nic/otx2_dcbnl.c | 17 +- .../ethernet/marvell/octeontx2/nic/otx2_pf.c | 25 +- drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 216 ++-- .../net/ethernet/mellanox/mlx5/core/debugfs.c | 4 +- .../mellanox/mlx5/core/diag/fw_tracer.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/en.h | 1 - .../mellanox/mlx5/core/en/fs_tt_redirect.c | 1 - .../ethernet/mellanox/mlx5/core/en/tc_tun.c | 30 +- .../ethernet/mellanox/mlx5/core/en_ethtool.c | 2 +- .../net/ethernet/mellanox/mlx5/core/en_main.c | 27 +- .../net/ethernet/mellanox/mlx5/core/en_rep.c | 2 +- .../net/ethernet/mellanox/mlx5/core/pci_irq.c | 6 +- .../net/ethernet/mellanox/mlx5/core/pci_irq.h | 3 - .../net/ethernet/mellanox/mlx5/core/vport.c | 2 +- .../mellanox/mlxbf_gige/mlxbf_gige_main.c | 28 +- .../mellanox/mlxbf_gige/mlxbf_gige_rx.c | 15 +- .../mellanox/mlxsw/spectrum_acl_erp.c | 8 +- drivers/net/ethernet/micrel/ks8851.h | 3 - drivers/net/ethernet/micrel/ks8851_common.c | 22 +- drivers/net/ethernet/micrel/ks8851_spi.c | 42 +- drivers/net/ethernet/microsoft/Kconfig | 1 - drivers/net/ethernet/mscc/ocelot_stats.c | 8 +- .../ethernet/qlogic/netxen/netxen_nic_main.c | 2 +- drivers/net/ethernet/qlogic/qed/qed_cxt.c | 1 - drivers/net/ethernet/qlogic/qla3xxx.c | 2 - .../net/ethernet/qlogic/qlcnic/qlcnic_io.c | 4 +- drivers/net/ethernet/qualcomm/qca_debug.c | 17 +- drivers/net/ethernet/qualcomm/qca_spi.c | 20 +- .../ethernet/qualcomm/rmnet/rmnet_config.c | 2 +- drivers/net/ethernet/realtek/r8169_main.c | 2 +- drivers/net/ethernet/renesas/ravb_main.c | 67 +- drivers/net/ethernet/sfc/rx_common.c | 4 +- drivers/net/ethernet/sfc/tx_tso.c | 2 +- drivers/net/ethernet/stmicro/stmmac/Kconfig | 2 +- .../ethernet/stmicro/stmmac/dwmac-loongson.c | 19 +- drivers/net/ethernet/stmicro/stmmac/stmmac.h | 1 - .../ethernet/stmicro/stmmac/stmmac_ethtool.c | 10 +- .../net/ethernet/stmicro/stmmac/stmmac_main.c | 8 +- .../net/ethernet/stmicro/stmmac/stmmac_mdio.c | 6 +- drivers/net/ethernet/ti/am65-cpsw-nuss.c | 5 +- drivers/net/phy/micrel.c | 1 - drivers/net/team/team.c | 4 +- drivers/net/usb/aqc111.c | 8 +- drivers/net/usb/ax88172a.c | 4 +- drivers/net/usb/ax88179_178a.c | 23 +- drivers/net/usb/qmi_wwan.c | 1 - drivers/net/usb/r8152.c | 177 ++- drivers/net/wireless/ath/ath11k/ahb.c | 4 +- drivers/net/wireless/intel/iwlwifi/iwl-prph.h | 4 +- .../net/wireless/intel/iwlwifi/mvm/phy-ctxt.c | 11 + drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 2 +- .../wireless/intel/iwlwifi/pcie/internal.h | 4 +- drivers/net/wireless/intel/iwlwifi/pcie/rx.c | 10 +- .../net/wireless/intel/iwlwifi/pcie/trans.c | 21 +- drivers/net/wireless/marvell/libertas/Kconfig | 2 + .../net/wireless/marvell/mwifiex/cfg80211.c | 2 - drivers/net/wireless/marvell/mwifiex/fw.h | 1 - drivers/net/wireless/marvell/mwifiex/ioctl.h | 1 - .../net/wireless/marvell/mwifiex/uap_cmd.c | 8 - drivers/net/wireless/mediatek/mt76/eeprom.c | 2 +- drivers/net/wireless/mediatek/mt76/mt76.h | 3 +- .../net/wireless/mediatek/mt76/mt7615/sdio.c | 2 +- .../net/wireless/mediatek/mt76/mt7921/mcu.c | 11 +- .../net/wireless/mediatek/mt76/mt7921/sdio.c | 4 +- .../wireless/mediatek/mt76/mt7921/sdio_mac.c | 3 +- drivers/net/wireless/mediatek/mt76/sdio.c | 18 +- drivers/net/wireless/purelifi/plfxlc/usb.c | 5 +- drivers/net/wireless/realtek/rtlwifi/pci.c | 79 +- drivers/net/wireless/realtek/rtlwifi/pci.h | 5 + .../wireless/realtek/rtlwifi/rtl8188ee/phy.c | 14 +- .../realtek/rtlwifi/rtl8192c/phy_common.c | 12 +- .../realtek/rtlwifi/rtl8192c/phy_common.h | 1 + .../wireless/realtek/rtlwifi/rtl8192ce/phy.c | 6 +- .../wireless/realtek/rtlwifi/rtl8192ce/phy.h | 1 + .../wireless/realtek/rtlwifi/rtl8192cu/phy.c | 6 +- .../wireless/realtek/rtlwifi/rtl8192de/phy.c | 15 +- .../wireless/realtek/rtlwifi/rtl8192ee/phy.c | 16 +- .../wireless/realtek/rtlwifi/rtl8192se/phy.c | 15 +- .../wireless/realtek/rtlwifi/rtl8821ae/phy.c | 5 +- drivers/net/wireless/realtek/rtlwifi/wifi.h | 7 - drivers/net/wireless/realtek/rtw88/mac80211.c | 4 +- drivers/net/xen-netback/netback.c | 44 +- drivers/nvme/host/auth.c | 2 - drivers/nvme/host/core.c | 34 +- drivers/nvme/host/nvme.h | 5 - drivers/nvme/target/configfs.c | 3 - drivers/nvme/target/tcp.c | 20 +- drivers/nvme/target/trace.h | 5 +- drivers/of/base.c | 1 - drivers/of/unittest-data/tests-phandle.dtsi | 10 +- drivers/of/unittest.c | 74 +- drivers/parport/parport_serial.c | 64 - drivers/pci/controller/dwc/pci-keystone.c | 9 - .../pci/controller/dwc/pcie-designware-ep.c | 1 - drivers/pci/controller/pci-loongson.c | 46 +- drivers/pci/controller/pcie-mediatek-gen3.c | 89 +- drivers/pci/controller/pcie-mediatek.c | 10 +- drivers/pci/hotplug/acpiphp_glue.c | 9 +- drivers/pci/pci.c | 6 - drivers/pci/pci.h | 2 - drivers/pci/pcie/aspm.c | 19 - drivers/pci/quirks.c | 8 +- drivers/pinctrl/cirrus/Kconfig | 3 +- drivers/pinctrl/pinctrl-at91-pio4.c | 8 - drivers/pinctrl/pinctrl-cy8c95x0.c | 4 +- .../starfive/pinctrl-starfive-jh7100.c | 4 +- drivers/platform/x86/intel/telemetry/core.c | 4 +- drivers/platform/x86/intel/vbtn.c | 19 +- drivers/platform/x86/intel/vsec.c | 46 +- drivers/platform/x86/intel/vsec.h | 7 - drivers/platform/x86/thinkpad_acpi.c | 98 +- drivers/power/supply/bq256xx_charger.c | 5 +- drivers/power/supply/cw2015_battery.c | 2 +- drivers/pwm/core.c | 2 +- drivers/pwm/pwm-jz4740.c | 7 +- drivers/pwm/pwm-stm32.c | 63 +- drivers/reset/core.c | 8 +- drivers/reset/hisilicon/hi6220_reset.c | 2 +- drivers/s390/block/scm_blk.c | 7 +- drivers/scsi/aacraid/aacraid.h | 1 + drivers/scsi/aacraid/commsup.c | 6 +- drivers/scsi/aacraid/linit.c | 14 + drivers/scsi/aacraid/src.c | 25 +- drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 9 +- drivers/scsi/fnic/fnic_debugfs.c | 3 +- drivers/scsi/hisi_sas/hisi_sas_main.c | 4 +- drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 9 +- drivers/scsi/mpi3mr/mpi3mr_app.c | 16 - drivers/scsi/mpi3mr/mpi3mr_os.c | 10 +- drivers/scsi/scsi_error.c | 2 - drivers/soc/qcom/llcc-qcom.c | 8 +- drivers/soundwire/stream.c | 7 +- drivers/spi/Kconfig | 3 +- drivers/spi/spi-atmel.c | 82 +- drivers/spi/spi-sh-msiof.c | 17 - drivers/spi/spi.c | 92 +- drivers/spmi/spmi-mtk-pmif.c | 20 +- drivers/staging/gdm724x/gdm_lte.c | 4 +- drivers/staging/media/rkvdec/rkvdec.c | 3 - drivers/target/target_core_file.c | 10 +- drivers/thunderbolt/debugfs.c | 2 +- drivers/tty/serial/8250/8250_bcm2835aux.c | 2 - drivers/tty/serial/8250/8250_exar.c | 5 +- drivers/tty/serial/8250/8250_omap.c | 2 +- drivers/tty/serial/imx.c | 36 +- drivers/tty/serial/omap-serial.c | 27 +- drivers/tty/serial/sc16is7xx.c | 8 +- drivers/tty/serial/serial_core.c | 33 +- drivers/tty/tty.h | 2 +- drivers/tty/tty_io.c | 35 +- drivers/tty/tty_ioctl.c | 2 +- drivers/uio/uio.c | 7 +- drivers/usb/cdns3/cdns3-gadget.c | 142 +-- drivers/usb/cdns3/cdns3-gadget.h | 3 - drivers/usb/chipidea/core.c | 7 - drivers/usb/class/cdc-acm.c | 3 - drivers/usb/dwc3/core.c | 39 +- drivers/usb/host/fotg210-hcd.c | 3 + drivers/usb/host/xhci-mtk.c | 40 +- drivers/usb/host/xhci-mtk.h | 2 - drivers/usb/mon/mon_bin.c | 7 +- drivers/usb/phy/phy-mxs-usb.c | 3 +- drivers/usb/serial/ftdi_sio.c | 6 +- drivers/usb/serial/ftdi_sio_ids.h | 6 +- drivers/usb/serial/option.c | 5 - drivers/usb/storage/unusual_devs.h | 11 - drivers/vdpa/alibaba/eni_vdpa.c | 6 +- drivers/video/fbdev/core/fb_defio.c | 8 +- drivers/video/fbdev/imsttfb.c | 6 +- drivers/video/fbdev/imxfb.c | 27 +- drivers/watchdog/bcm2835_wdt.c | 3 +- drivers/watchdog/hpwdt.c | 2 +- drivers/watchdog/rti_wdt.c | 13 +- drivers/watchdog/watchdog_dev.c | 3 +- fs/9p/cache.c | 2 - fs/afs/cell.c | 6 +- fs/afs/dynroot.c | 31 +- fs/afs/internal.h | 4 - fs/afs/rxrpc.c | 2 +- fs/afs/volume.c | 26 +- fs/btrfs/delalloc-space.c | 2 +- fs/btrfs/extent_io.c | 3 +- fs/btrfs/file-item.c | 2 +- fs/btrfs/file.c | 2 +- fs/btrfs/free-space-cache.c | 8 +- fs/btrfs/inode.c | 16 +- fs/btrfs/ioctl.c | 9 - fs/btrfs/ordered-data.c | 11 +- fs/btrfs/ordered-data.h | 2 +- fs/btrfs/qgroup.c | 25 +- fs/btrfs/qgroup.h | 4 +- fs/btrfs/zoned.c | 26 +- fs/cachefiles/namei.c | 2 - fs/ceph/cache.c | 2 - fs/debugfs/file.c | 8 - fs/debugfs/inode.c | 27 +- fs/debugfs/internal.h | 10 +- fs/efivarfs/super.c | 15 - fs/ext4/file.c | 14 +- fs/ext4/mballoc.c | 4 - fs/ext4/move_extent.c | 48 +- fs/f2fs/compress.c | 3 +- fs/f2fs/data.c | 7 +- fs/f2fs/f2fs.h | 2 - fs/f2fs/file.c | 16 +- fs/f2fs/namei.c | 2 +- fs/f2fs/node.c | 6 +- fs/f2fs/super.c | 10 +- fs/f2fs/xattr.c | 17 +- fs/fuse/dax.c | 1 - fs/fuse/fuse_i.h | 15 - fs/fuse/inode.c | 75 +- fs/gfs2/rgrp.c | 2 +- fs/inode.c | 2 - fs/jbd2/commit.c | 10 +- fs/jbd2/journal.c | 24 +- fs/namei.c | 125 +- fs/namespace.c | 11 - fs/nfs/blocklayout/blocklayout.c | 7 +- fs/nfs/direct.c | 5 +- fs/nfs/fscache.c | 3 - fs/nfs/internal.h | 2 +- fs/nfs/nfs4proc.c | 3 - fs/nfs/pnfs.c | 3 +- fs/nfsd/nfssvc.c | 5 +- fs/pstore/ram_core.c | 2 +- fs/smb/client/cifs_debug.c | 12 +- fs/smb/client/cifsfs.c | 2 +- fs/smb/client/cifsglob.h | 4 +- fs/smb/client/cifspdu.h | 24 +- fs/smb/client/cifssmb.c | 6 +- fs/smb/client/connect.c | 14 +- fs/smb/client/fscache.c | 2 - fs/smb/client/inode.c | 2 +- fs/smb/client/misc.c | 4 - fs/smb/client/smb2file.c | 2 +- fs/smb/client/smb2misc.c | 58 +- fs/smb/client/smb2ops.c | 113 +- fs/smb/client/smb2pdu.c | 53 +- fs/smb/client/smb2pdu.h | 18 +- fs/smb/common/smb2pdu.h | 62 +- fs/smb/server/Kconfig | 10 +- fs/smb/server/asn1.c | 38 +- fs/smb/server/auth.c | 11 +- fs/smb/server/connection.c | 80 +- fs/smb/server/connection.h | 4 +- fs/smb/server/ksmbd_netlink.h | 4 +- fs/smb/server/ksmbd_work.c | 100 +- fs/smb/server/ksmbd_work.h | 36 +- fs/smb/server/mgmt/share_config.h | 29 +- fs/smb/server/mgmt/tree_connect.c | 53 +- fs/smb/server/mgmt/tree_connect.h | 14 +- fs/smb/server/mgmt/user_config.h | 1 + fs/smb/server/mgmt/user_session.c | 38 +- fs/smb/server/mgmt/user_session.h | 3 +- fs/smb/server/oplock.c | 151 +-- fs/smb/server/oplock.h | 8 +- fs/smb/server/server.c | 36 +- fs/smb/server/smb2misc.c | 19 +- fs/smb/server/smb2ops.c | 27 +- fs/smb/server/smb2pdu.c | 1077 +++++++++-------- fs/smb/server/smb2pdu.h | 3 +- fs/smb/server/smb_common.c | 25 +- fs/smb/server/smb_common.h | 14 +- fs/smb/server/smbacl.c | 31 +- fs/smb/server/smbacl.h | 2 +- fs/smb/server/transport_ipc.c | 4 +- fs/smb/server/transport_rdma.c | 55 +- fs/smb/server/transport_tcp.c | 13 +- fs/smb/server/unicode.c | 191 +-- fs/smb/server/vfs.c | 630 +++++----- fs/smb/server/vfs.h | 52 +- fs/smb/server/vfs_cache.c | 63 +- fs/smb/server/vfs_cache.h | 18 +- fs/splice.c | 3 +- fs/ubifs/tnc.c | 1 - include/asm-generic/qspinlock.h | 2 +- include/crypto/if_alg.h | 3 - include/drm/drm_bridge.h | 2 +- .../dt-bindings/clock/qcom,videocc-sm8150.h | 4 - include/linux/bio.h | 9 +- include/linux/blkdev.h | 5 +- include/linux/bpf.h | 5 - include/linux/clk-provider.h | 4 +- include/linux/damon.h | 3 - include/linux/dm-bufio.h | 2 - include/linux/export-internal.h | 1 - include/linux/group_cpus.h | 14 - include/linux/hisi_acc_qm.h | 20 +- include/linux/ieee80211.h | 4 +- include/linux/if_vlan.h | 12 +- include/linux/iio/adc/adi-axi-adc.h | 4 - include/linux/jbd2.h | 3 - include/linux/kasan.h | 6 +- include/linux/key-type.h | 1 - include/linux/mlx5/driver.h | 20 +- include/linux/mm_inline.h | 23 +- include/linux/module.h | 9 - include/linux/namei.h | 7 - include/linux/netfilter_bridge.h | 6 +- include/linux/of.h | 17 +- include/linux/pagemap.h | 33 - include/linux/rcupdate.h | 12 - include/linux/skbuff.h | 2 +- include/linux/socket.h | 3 - include/linux/spi/spi.h | 23 - include/linux/usb/r8152.h | 2 - include/net/addrconf.h | 20 +- include/net/bluetooth/hci_core.h | 6 +- include/net/if_inet6.h | 4 + include/net/ip.h | 2 +- include/net/netfilter/nf_conntrack_act_ct.h | 34 +- include/net/netfilter/nf_flow_table.h | 21 +- include/net/netfilter/nf_tables_ipv4.h | 6 +- include/net/sock.h | 22 +- include/trace/events/9p.h | 11 +- include/uapi/linux/bpf.h | 3 - init/Kconfig | 2 +- init/do_mounts.c | 9 +- io_uring/net.c | 2 - io_uring/rw.c | 10 +- kernel/bpf/lpm_trie.c | 3 - kernel/bpf/stackmap.c | 11 +- kernel/bpf/syscall.c | 9 - kernel/bpf/trampoline.c | 4 +- kernel/bpf/verifier.c | 51 +- kernel/cpu.c | 42 +- kernel/debug/kdb/kdb_main.c | 2 + kernel/dma/coherent.c | 4 +- kernel/events/core.c | 10 - kernel/irq/affinity.c | 405 ++++++- kernel/module/kallsyms.c | 2 + kernel/rcu/srcutree.c | 31 +- kernel/rcu/tasks.h | 2 - kernel/time/tick-sched.c | 5 - kernel/trace/ring_buffer.c | 196 +-- kernel/trace/synth_event_gen_test.c | 11 - kernel/trace/trace.c | 36 +- kernel/trace/trace.h | 1 - kernel/trace/trace_events_hist.c | 12 +- kernel/trace/trace_kprobe.c | 25 +- kernel/trace/trace_output.c | 6 +- lib/Kconfig.debug | 9 - lib/Makefile | 2 - lib/group_cpus.c | 438 ------- lib/kunit/debugfs.c | 4 +- lib/vsprintf.c | 11 +- mm/damon/core.c | 7 - mm/filemap.c | 11 - mm/huge_memory.c | 3 +- mm/internal.h | 11 - mm/kasan/report.c | 2 +- mm/khugepaged.c | 22 +- mm/memory-failure.c | 17 +- mm/memory.c | 4 +- mm/memory_hotplug.c | 15 +- mm/migrate.c | 3 +- mm/page-writeback.c | 2 +- mm/shmem.c | 19 +- mm/truncate.c | 6 +- mm/vmscan.c | 10 +- mm/workingset.c | 6 +- net/8021q/vlan_core.c | 9 +- net/9p/protocol.c | 17 +- net/appletalk/ddp.c | 9 +- net/atm/ioctl.c | 7 +- net/batman-adv/soft-interface.c | 2 +- net/bluetooth/af_bluetooth.c | 7 +- net/bluetooth/hci_conn.c | 8 +- net/bluetooth/hci_debugfs.c | 12 +- net/bluetooth/hci_event.c | 33 +- net/bluetooth/l2cap_core.c | 21 +- net/bluetooth/mgmt.c | 25 +- net/bluetooth/smp.c | 7 - net/bridge/br_netfilter_hooks.c | 42 +- net/bridge/br_netfilter_ipv6.c | 14 +- net/can/j1939/socket.c | 10 +- net/can/raw.c | 1 - net/core/dev.c | 3 - net/core/neighbour.c | 9 +- net/core/rtnetlink.c | 14 +- net/core/skbuff.c | 10 +- net/core/sock.c | 16 +- net/core/sock_map.c | 2 - net/core/stream.c | 2 +- net/dns_resolver/dns_key.c | 25 +- net/ethtool/features.c | 9 +- net/ethtool/netlink.c | 2 +- net/ife/ife.c | 1 - net/ipv4/af_inet.c | 1 - net/ipv4/ip_output.c | 4 +- net/ipv4/ip_sockglue.c | 2 +- net/ipv4/ipmr.c | 13 +- net/ipv4/netfilter/nf_reject_ipv4.c | 9 +- net/ipv4/tcp.c | 4 +- net/ipv4/tcp_output.c | 6 - net/ipv4/udp.c | 61 +- net/ipv6/addrconf.c | 6 +- net/ipv6/ip6_output.c | 4 +- net/ipv6/ip6_tunnel.c | 26 +- net/ipv6/mcast.c | 4 - net/ipv6/netfilter/nf_reject_ipv6.c | 11 +- net/ipv6/ping.c | 2 +- net/ipv6/raw.c | 2 +- net/ipv6/udp.c | 16 +- net/mac80211/cfg.c | 4 +- net/mac80211/ht.c | 1 - net/mac80211/mesh_plink.c | 16 +- net/mptcp/options.c | 7 +- net/mptcp/subflow.c | 30 +- net/ncsi/internal.h | 7 +- net/ncsi/ncsi-netlink.c | 4 +- net/ncsi/ncsi-pkt.h | 7 +- net/ncsi/ncsi-rsp.c | 26 +- net/netfilter/ipset/ip_set_hash_netiface.c | 8 +- net/netfilter/ipvs/ip_vs_xmit.c | 6 +- net/netfilter/nf_flow_table_core.c | 13 +- net/netfilter/nf_flow_table_inet.c | 2 +- net/netfilter/nf_flow_table_ip.c | 4 +- net/netfilter/nf_flow_table_offload.c | 18 +- net/netfilter/nf_log_syslog.c | 15 +- net/netfilter/nf_queue.c | 6 +- net/netfilter/nf_tables_api.c | 25 +- net/netfilter/nf_tables_core.c | 2 +- net/netfilter/nfnetlink_log.c | 8 +- net/netfilter/nft_immediate.c | 2 +- net/netfilter/nft_limit.c | 19 +- net/netfilter/xt_length.c | 2 +- net/netfilter/xt_physdev.c | 2 +- net/netlabel/netlabel_calipso.c | 49 +- net/nfc/llcp_core.c | 39 +- net/openvswitch/conntrack.c | 2 +- net/qrtr/ns.c | 4 +- net/rfkill/rfkill-gpio.c | 8 - net/rose/af_rose.c | 39 +- net/sched/act_ct.c | 177 +-- net/sched/em_text.c | 4 +- net/sctp/socket.c | 13 +- net/smc/smc_diag.c | 3 +- net/socket.c | 19 +- net/sunrpc/xprtmultipath.c | 2 +- net/vmw_vsock/virtio_transport_common.c | 15 +- net/wireless/certs/wens.hex | 87 -- net/wireless/core.c | 2 - scripts/Makefile.compiler | 4 + scripts/decode_stacktrace.sh | 19 +- scripts/pahole-flags.sh | 7 - scripts/sign-file.c | 12 +- security/apparmor/policy_unpack.c | 4 - security/keys/gc.c | 31 +- security/keys/internal.h | 11 +- security/keys/key.c | 15 +- security/keys/proc.c | 2 +- security/selinux/hooks.c | 7 - sound/hda/intel-nhlt.c | 33 +- sound/pci/hda/patch_hdmi.c | 3 - sound/pci/hda/patch_realtek.c | 25 +- sound/pci/oxygen/oxygen_mixer.c | 2 +- sound/soc/amd/yc/acp6x-mach.c | 7 - sound/soc/codecs/cs35l33.c | 4 +- sound/soc/codecs/cs35l34.c | 4 +- sound/soc/codecs/cs43130.c | 6 +- sound/soc/codecs/da7219-aad.c | 2 +- sound/soc/codecs/hdac_hda.c | 23 +- sound/soc/codecs/hdmi-codec.c | 12 +- sound/soc/codecs/nau8822.c | 9 +- sound/soc/codecs/rt5645.c | 18 +- sound/soc/codecs/wm8974.c | 6 +- sound/soc/fsl/fsl_rpmsg.c | 10 +- sound/soc/fsl/fsl_sai.c | 3 - sound/soc/intel/boards/bytcr_rt5640.c | 31 +- sound/soc/intel/boards/skl_hda_dsp_generic.c | 2 - .../intel/common/soc-acpi-intel-glk-match.c | 14 +- sound/soc/intel/skylake/skl-pcm.c | 9 +- sound/soc/intel/skylake/skl-sst-ipc.c | 4 +- .../soc/mediatek/common/mtk-dsp-sof-common.c | 2 +- sound/soc/mediatek/mt8186/mt8186-dai-adda.c | 2 +- sound/soc/meson/g12a-toacodec.c | 5 +- sound/soc/meson/g12a-tohdmitx.c | 8 +- sound/soc/soc-ops.c | 2 +- sound/soc/sof/intel/hda-codec.c | 18 +- sound/usb/mixer_scarlett_gen2.c | 231 ++-- sound/usb/quirks.c | 4 +- tools/include/uapi/linux/bpf.h | 3 - tools/lib/api/io.h | 1 - tools/perf/util/bpf-event.c | 8 +- tools/perf/util/bpf-event.h | 12 +- tools/perf/util/env.c | 50 +- tools/perf/util/env.h | 4 - tools/perf/util/genelf.c | 6 +- tools/perf/util/header.c | 13 +- tools/perf/util/hisi-ptt.c | 1 - tools/testing/selftests/alsa/mixer-test.c | 6 +- .../selftests/bpf/prog_tests/bpf_iter.c | 2 - .../selftests/bpf/prog_tests/time_tai.c | 2 +- .../selftests/bpf/progs/bpf_iter_task_stack.c | 5 - .../selftests/bpf/progs/bpf_loop_bench.c | 13 +- .../selftests/bpf/progs/xdp_synproxy_kern.c | 4 +- .../bonding/bond-arp-interval-causes-panic.sh | 6 +- .../selftests/drivers/net/mlxsw/qos_pfc.sh | 18 +- .../drivers/net/mlxsw/spectrum-2/tc_flower.sh | 52 +- .../net/arp_ndisc_untracked_subnets.sh | 2 +- .../selftests/net/fib_nexthop_multiprefix.sh | 4 +- .../testing/selftests/net/mptcp/mptcp_join.sh | 22 +- .../selftests/powerpc/math/fpu_preempt.c | 9 +- .../selftests/powerpc/math/vmx_preempt.c | 10 +- tools/testing/selftests/sgx/Makefile | 2 +- tools/testing/selftests/sgx/load.c | 9 +- tools/testing/selftests/sgx/sigstruct.c | 5 +- tools/testing/selftests/sgx/test_encl.c | 8 +- tools/testing/selftests/vm/memfd_secret.c | 3 - 897 files changed, 6247 insertions(+), 10649 deletions(-) delete mode 100644 include/linux/group_cpus.h delete mode 100644 lib/group_cpus.c delete mode 100644 net/wireless/certs/wens.hex diff --git a/Documentation/devicetree/bindings/gpio/xlnx,gpio-xilinx.yaml b/Documentation/devicetree/bindings/gpio/xlnx,gpio-xilinx.yaml index 11ae8ec3c739..f333ee2288e7 100644 --- a/Documentation/devicetree/bindings/gpio/xlnx,gpio-xilinx.yaml +++ b/Documentation/devicetree/bindings/gpio/xlnx,gpio-xilinx.yaml @@ -126,7 +126,7 @@ examples: - | #include - gpio@a0020000 { + gpio@e000a000 { compatible = "xlnx,xps-gpio-1.00.a"; reg = <0xa0020000 0x10000>; #gpio-cells = <2>; diff --git a/Documentation/devicetree/bindings/media/mediatek,mdp3-rdma.yaml b/Documentation/devicetree/bindings/media/mediatek,mdp3-rdma.yaml index 46730687c662..9cfc0c7d23e0 100644 --- a/Documentation/devicetree/bindings/media/mediatek,mdp3-rdma.yaml +++ b/Documentation/devicetree/bindings/media/mediatek,mdp3-rdma.yaml @@ -61,9 +61,6 @@ properties: - description: used for 1st data pipe from RDMA - description: used for 2nd data pipe from RDMA - '#dma-cells': - const: 1 - required: - compatible - reg @@ -73,7 +70,6 @@ required: - clocks - iommus - mboxes - - '#dma-cells' additionalProperties: false @@ -84,17 +80,16 @@ examples: #include #include - dma-controller@14001000 { - compatible = "mediatek,mt8183-mdp3-rdma"; - reg = <0x14001000 0x1000>; - mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0x1000 0x1000>; - mediatek,gce-events = , - ; - power-domains = <&spm MT8183_POWER_DOMAIN_DISP>; - clocks = <&mmsys CLK_MM_MDP_RDMA0>, - <&mmsys CLK_MM_MDP_RSZ1>; - iommus = <&iommu>; - mboxes = <&gce 20 CMDQ_THR_PRIO_LOWEST>, - <&gce 21 CMDQ_THR_PRIO_LOWEST>; - #dma-cells = <1>; + mdp3_rdma0: mdp3-rdma0@14001000 { + compatible = "mediatek,mt8183-mdp3-rdma"; + reg = <0x14001000 0x1000>; + mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0x1000 0x1000>; + mediatek,gce-events = , + ; + power-domains = <&spm MT8183_POWER_DOMAIN_DISP>; + clocks = <&mmsys CLK_MM_MDP_RDMA0>, + <&mmsys CLK_MM_MDP_RSZ1>; + iommus = <&iommu>; + mboxes = <&gce 20 CMDQ_THR_PRIO_LOWEST>, + <&gce 21 CMDQ_THR_PRIO_LOWEST>; }; diff --git a/Documentation/devicetree/bindings/media/mediatek,mdp3-wrot.yaml b/Documentation/devicetree/bindings/media/mediatek,mdp3-wrot.yaml index 64ea98aa0592..0baa77198fa2 100644 --- a/Documentation/devicetree/bindings/media/mediatek,mdp3-wrot.yaml +++ b/Documentation/devicetree/bindings/media/mediatek,mdp3-wrot.yaml @@ -50,9 +50,6 @@ properties: iommus: maxItems: 1 - '#dma-cells': - const: 1 - required: - compatible - reg @@ -61,7 +58,6 @@ required: - power-domains - clocks - iommus - - '#dma-cells' additionalProperties: false @@ -72,14 +68,13 @@ examples: #include #include - dma-controller@14005000 { - compatible = "mediatek,mt8183-mdp3-wrot"; - reg = <0x14005000 0x1000>; - mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0x5000 0x1000>; - mediatek,gce-events = , - ; - power-domains = <&spm MT8183_POWER_DOMAIN_DISP>; - clocks = <&mmsys CLK_MM_MDP_WROT0>; - iommus = <&iommu>; - #dma-cells = <1>; + mdp3_wrot0: mdp3-wrot0@14005000 { + compatible = "mediatek,mt8183-mdp3-wrot"; + reg = <0x14005000 0x1000>; + mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0x5000 0x1000>; + mediatek,gce-events = , + ; + power-domains = <&spm MT8183_POWER_DOMAIN_DISP>; + clocks = <&mmsys CLK_MM_MDP_WROT0>; + iommus = <&iommu>; }; diff --git a/Documentation/devicetree/bindings/media/rockchip-isp1.yaml b/Documentation/devicetree/bindings/media/rockchip-isp1.yaml index 2a0ad332f5ce..b3661d7d4357 100644 --- a/Documentation/devicetree/bindings/media/rockchip-isp1.yaml +++ b/Documentation/devicetree/bindings/media/rockchip-isp1.yaml @@ -90,16 +90,15 @@ properties: description: connection point for input on the parallel interface properties: + bus-type: + enum: [5, 6] + endpoint: $ref: video-interfaces.yaml# unevaluatedProperties: false - properties: - bus-type: - enum: [5, 6] - - required: - - bus-type + required: + - bus-type anyOf: - required: diff --git a/Documentation/devicetree/bindings/nvmem/mxs-ocotp.yaml b/Documentation/devicetree/bindings/nvmem/mxs-ocotp.yaml index 2e1fcff3c280..ff317fd7c15b 100644 --- a/Documentation/devicetree/bindings/nvmem/mxs-ocotp.yaml +++ b/Documentation/devicetree/bindings/nvmem/mxs-ocotp.yaml @@ -14,11 +14,9 @@ allOf: properties: compatible: - items: - - enum: - - fsl,imx23-ocotp - - fsl,imx28-ocotp - - const: fsl,ocotp + enum: + - fsl,imx23-ocotp + - fsl,imx28-ocotp "#address-cells": const: 1 @@ -42,7 +40,7 @@ additionalProperties: false examples: - | ocotp: efuse@8002c000 { - compatible = "fsl,imx28-ocotp", "fsl,ocotp"; + compatible = "fsl,imx28-ocotp"; #address-cells = <1>; #size-cells = <1>; reg = <0x8002c000 0x2000>; diff --git a/Documentation/driver-api/pci/p2pdma.rst b/Documentation/driver-api/pci/p2pdma.rst index d0b241628cf1..44deb52beeb4 100644 --- a/Documentation/driver-api/pci/p2pdma.rst +++ b/Documentation/driver-api/pci/p2pdma.rst @@ -83,9 +83,19 @@ this to include other types of resources like doorbells. Client Drivers -------------- -A client driver only has to use the mapping API :c:func:`dma_map_sg()` -and :c:func:`dma_unmap_sg()` functions as usual, and the implementation -will do the right thing for the P2P capable memory. +A client driver typically only has to conditionally change its DMA map +routine to use the mapping function :c:func:`pci_p2pdma_map_sg()` instead +of the usual :c:func:`dma_map_sg()` function. Memory mapped in this +way does not need to be unmapped. + +The client may also, optionally, make use of +:c:func:`is_pci_p2pdma_page()` to determine when to use the P2P mapping +functions and when to use the regular mapping functions. In some +situations, it may be more appropriate to use a flag to indicate a +given request is P2P memory and map appropriately. It is important to +ensure that struct pages that back P2P memory stay out of code that +does not have support for them as other code may treat the pages as +regular memory which may not be appropriate. Orchestrator Drivers diff --git a/MAINTAINERS b/MAINTAINERS index b1149b2acebc..cfbf50390ac5 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -10845,8 +10845,6 @@ L: linux-kernel@vger.kernel.org S: Maintained T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core F: kernel/irq/ -F: include/linux/group_cpus.h -F: lib/group_cpus.c IRQCHIP DRIVERS M: Thomas Gleixner diff --git a/Makefile b/Makefile index 7ab870eb945a..4492c78f9178 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 1 -SUBLEVEL = 75 +SUBLEVEL = 68 EXTRAVERSION = NAME = Curry Ramen diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index b58438be3784..c636e40accdd 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -39134,10 +39134,6 @@ member { id: 0x230f36dc type_id: 0x0312ab60 } -member { - id: 0x23531e28 - type_id: 0x026208b2 -} member { id: 0x2380a48f type_id: 0x012ce22f @@ -40052,11 +40048,6 @@ member { type_id: 0x5d86aa37 offset: 96 } -member { - id: 0x34aaae1a - type_id: 0x5d84d1ff - offset: 24 -} member { id: 0x34be27ed type_id: 0x5dd6efa4 @@ -51120,10 +51111,10 @@ member { offset: 160 } member { - id: 0xb2dd5b41 + id: 0xb2dd57f2 name: "autoconf" type_id: 0xb3e7bac9 - offset: 6 + offset: 30 bitsize: 1 } member { @@ -141071,10 +141062,10 @@ member { offset: 9920 } member { - id: 0x7adb5caf + id: 0x7adb50ba name: "onlink" type_id: 0xb3e7bac9 - offset: 7 + offset: 31 bitsize: 1 } member { @@ -164816,9 +164807,10 @@ member { offset: 1024 } member { - id: 0x688b9626 + id: 0x688b9047 name: "reserved" type_id: 0xb3e7bac9 + offset: 24 bitsize: 6 } member { @@ -209484,16 +209476,6 @@ struct_union { member_id: 0x2d8a4e32 } } -struct_union { - id: 0x026208b2 - kind: STRUCT - definition { - bytesize: 1 - member_id: 0x688b9626 - member_id: 0xb2dd5b41 - member_id: 0x7adb5caf - } -} struct_union { id: 0x02c70092 kind: STRUCT @@ -214650,15 +214632,6 @@ struct_union { member_id: 0x36752b74 } } -struct_union { - id: 0x5d84d1ff - kind: UNION - definition { - bytesize: 1 - member_id: 0x2ddb63e4 - member_id: 0x23531e28 - } -} struct_union { id: 0x5d86aa37 kind: UNION @@ -249227,7 +249200,9 @@ struct_union { member_id: 0x5ce532c4 member_id: 0xb5de8e04 member_id: 0x2165da89 - member_id: 0x34aaae1a + member_id: 0x688b9047 + member_id: 0xb2dd57f2 + member_id: 0x7adb50ba member_id: 0xe91a1d71 member_id: 0xbada6e7d member_id: 0x08cabd3c diff --git a/arch/Kconfig b/arch/Kconfig index dff499ac1fd0..322105079929 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -34,9 +34,6 @@ config ARCH_HAS_SUBPAGE_FAULTS config HOTPLUG_SMT bool -config SMT_NUM_THREADS_DYNAMIC - bool - config GENERIC_ENTRY bool diff --git a/arch/arc/kernel/signal.c b/arch/arc/kernel/signal.c index 723abcb10c80..3c1590c27fae 100644 --- a/arch/arc/kernel/signal.c +++ b/arch/arc/kernel/signal.c @@ -61,7 +61,7 @@ struct rt_sigframe { unsigned int sigret_magic; }; -static int save_arcv2_regs(struct sigcontext __user *mctx, struct pt_regs *regs) +static int save_arcv2_regs(struct sigcontext *mctx, struct pt_regs *regs) { int err = 0; #ifndef CONFIG_ISA_ARCOMPACT @@ -74,12 +74,12 @@ static int save_arcv2_regs(struct sigcontext __user *mctx, struct pt_regs *regs) #else v2abi.r58 = v2abi.r59 = 0; #endif - err = __copy_to_user(&mctx->v2abi, (void const *)&v2abi, sizeof(v2abi)); + err = __copy_to_user(&mctx->v2abi, &v2abi, sizeof(v2abi)); #endif return err; } -static int restore_arcv2_regs(struct sigcontext __user *mctx, struct pt_regs *regs) +static int restore_arcv2_regs(struct sigcontext *mctx, struct pt_regs *regs) { int err = 0; #ifndef CONFIG_ISA_ARCOMPACT diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi index b2e7f6a71074..32d397b3950b 100644 --- a/arch/arm/boot/dts/am33xx.dtsi +++ b/arch/arm/boot/dts/am33xx.dtsi @@ -349,7 +349,6 @@ , , ; - ti,sysc-delay-us = <2>; clocks = <&l3s_clkctrl AM3_L3S_USB_OTG_HS_CLKCTRL 0>; clock-names = "fck"; #address-cells = <1>; diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi index a79920ec461f..97ce0c4f1df7 100644 --- a/arch/arm/boot/dts/dra7.dtsi +++ b/arch/arm/boot/dts/dra7.dtsi @@ -144,7 +144,7 @@ l3-noc@44000000 { compatible = "ti,dra7-l3-noc"; - reg = <0x44000000 0x1000000>, + reg = <0x44000000 0x1000>, <0x45000000 0x1000>; interrupts-extended = <&crossbar_mpu GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>, <&wakeupgen GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>; diff --git a/arch/arm/boot/dts/qcom-apq8064.dtsi b/arch/arm/boot/dts/qcom-apq8064.dtsi index 2b3927a829b7..4b57e9f5bc64 100644 --- a/arch/arm/boot/dts/qcom-apq8064.dtsi +++ b/arch/arm/boot/dts/qcom-apq8064.dtsi @@ -750,7 +750,7 @@ xoadc: xoadc@197 { compatible = "qcom,pm8921-adc"; - reg = <0x197>; + reg = <197>; interrupts-extended = <&pmicintc 78 IRQ_TYPE_EDGE_RISING>; #address-cells = <2>; #size-cells = <0>; diff --git a/arch/arm/boot/dts/qcom-sdx65.dtsi b/arch/arm/boot/dts/qcom-sdx65.dtsi index ebb78b489e63..ecb9171e4da5 100644 --- a/arch/arm/boot/dts/qcom-sdx65.dtsi +++ b/arch/arm/boot/dts/qcom-sdx65.dtsi @@ -401,7 +401,7 @@ reg = <0x0c264000 0x1000>; }; - spmi_bus: spmi@c440000 { + spmi_bus: qcom,spmi@c440000 { compatible = "qcom,spmi-pmic-arb"; reg = <0xc440000 0xd00>, <0xc600000 0x2000000>, diff --git a/arch/arm/boot/dts/stm32mp157a-dk1-scmi.dts b/arch/arm/boot/dts/stm32mp157a-dk1-scmi.dts index 942a6ca38d97..e539cc80bef8 100644 --- a/arch/arm/boot/dts/stm32mp157a-dk1-scmi.dts +++ b/arch/arm/boot/dts/stm32mp157a-dk1-scmi.dts @@ -11,7 +11,7 @@ / { model = "STMicroelectronics STM32MP157A-DK1 SCMI Discovery Board"; - compatible = "st,stm32mp157a-dk1-scmi", "st,stm32mp157"; + compatible = "st,stm32mp157a-dk1-scmi", "st,stm32mp157a-dk1", "st,stm32mp157"; reserved-memory { optee@de000000 { diff --git a/arch/arm/boot/dts/stm32mp157c-dk2-scmi.dts b/arch/arm/boot/dts/stm32mp157c-dk2-scmi.dts index 99c4ff1f5c21..97e4f94b0a24 100644 --- a/arch/arm/boot/dts/stm32mp157c-dk2-scmi.dts +++ b/arch/arm/boot/dts/stm32mp157c-dk2-scmi.dts @@ -11,7 +11,7 @@ / { model = "STMicroelectronics STM32MP157C-DK2 SCMI Discovery Board"; - compatible = "st,stm32mp157c-dk2-scmi", "st,stm32mp157"; + compatible = "st,stm32mp157c-dk2-scmi", "st,stm32mp157c-dk2", "st,stm32mp157"; reserved-memory { optee@de000000 { diff --git a/arch/arm/boot/dts/stm32mp157c-ed1-scmi.dts b/arch/arm/boot/dts/stm32mp157c-ed1-scmi.dts index 21010458b36f..9cf0a44d2f47 100644 --- a/arch/arm/boot/dts/stm32mp157c-ed1-scmi.dts +++ b/arch/arm/boot/dts/stm32mp157c-ed1-scmi.dts @@ -11,7 +11,7 @@ / { model = "STMicroelectronics STM32MP157C-ED1 SCMI eval daughter"; - compatible = "st,stm32mp157c-ed1-scmi", "st,stm32mp157"; + compatible = "st,stm32mp157c-ed1-scmi", "st,stm32mp157c-ed1", "st,stm32mp157"; reserved-memory { optee@fe000000 { diff --git a/arch/arm/boot/dts/stm32mp157c-ev1-scmi.dts b/arch/arm/boot/dts/stm32mp157c-ev1-scmi.dts index d37637149919..3b9dd6f4ccc9 100644 --- a/arch/arm/boot/dts/stm32mp157c-ev1-scmi.dts +++ b/arch/arm/boot/dts/stm32mp157c-ev1-scmi.dts @@ -11,7 +11,8 @@ / { model = "STMicroelectronics STM32MP157C-EV1 SCMI eval daughter on eval mother"; - compatible = "st,stm32mp157c-ev1-scmi", "st,stm32mp157c-ed1", "st,stm32mp157"; + compatible = "st,stm32mp157c-ev1-scmi", "st,stm32mp157c-ev1", "st,stm32mp157c-ed1", + "st,stm32mp157"; reserved-memory { optee@fe000000 { diff --git a/arch/arm/mach-davinci/Kconfig b/arch/arm/mach-davinci/Kconfig index 672ffb0b5f3a..c8cbd9a30791 100644 --- a/arch/arm/mach-davinci/Kconfig +++ b/arch/arm/mach-davinci/Kconfig @@ -4,14 +4,12 @@ menuconfig ARCH_DAVINCI bool "TI DaVinci" depends on ARCH_MULTI_V5 depends on CPU_LITTLE_ENDIAN - select CPU_ARM926T select DAVINCI_TIMER select ZONE_DMA select PM_GENERIC_DOMAINS if PM select PM_GENERIC_DOMAINS_OF if PM && OF select REGMAP_MMIO select RESET_CONTROLLER - select PINCTRL select PINCTRL_SINGLE if ARCH_DAVINCI diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index 75091aa7269a..59755b5a1ad7 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -793,16 +793,11 @@ void __init omap_soc_device_init(void) soc_dev_attr->machine = soc_name; soc_dev_attr->family = omap_get_family(); - if (!soc_dev_attr->family) { - kfree(soc_dev_attr); - return; - } soc_dev_attr->revision = soc_rev; soc_dev_attr->custom_attr_group = omap_soc_groups[0]; soc_dev = soc_device_register(soc_dev_attr); if (IS_ERR(soc_dev)) { - kfree(soc_dev_attr->family); kfree(soc_dev_attr); return; } diff --git a/arch/arm/mach-sunxi/mc_smp.c b/arch/arm/mach-sunxi/mc_smp.c index f779e386b6e7..26cbce135338 100644 --- a/arch/arm/mach-sunxi/mc_smp.c +++ b/arch/arm/mach-sunxi/mc_smp.c @@ -804,16 +804,16 @@ static int __init sunxi_mc_smp_init(void) for (i = 0; i < ARRAY_SIZE(sunxi_mc_smp_data); i++) { ret = of_property_match_string(node, "enable-method", sunxi_mc_smp_data[i].enable_method); - if (ret >= 0) + if (!ret) break; } - of_node_put(node); - if (ret < 0) - return -ENODEV; - is_a83t = sunxi_mc_smp_data[i].is_a83t; + of_node_put(node); + if (ret) + return -ENODEV; + if (!sunxi_mc_smp_cpu_table_init()) return -EINVAL; diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index 740d3bcf7f20..908eaf9f3028 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -171,7 +171,7 @@ ifndef KBUILD_MIXED_TREE all: $(notdir $(KBUILD_IMAGE)) endif -vmlinuz.efi: Image + Image vmlinuz.efi: vmlinux $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ diff --git a/arch/arm64/boot/dts/freescale/imx8mm.dtsi b/arch/arm64/boot/dts/freescale/imx8mm.dtsi index 7a410d73600b..d583db18f74c 100644 --- a/arch/arm64/boot/dts/freescale/imx8mm.dtsi +++ b/arch/arm64/boot/dts/freescale/imx8mm.dtsi @@ -1303,7 +1303,7 @@ assigned-clocks = <&clk IMX8MM_CLK_GPU3D_CORE>, <&clk IMX8MM_GPU_PLL_OUT>; assigned-clock-parents = <&clk IMX8MM_GPU_PLL_OUT>; - assigned-clock-rates = <0>, <800000000>; + assigned-clock-rates = <0>, <1000000000>; power-domains = <&pgc_gpu>; }; @@ -1318,7 +1318,7 @@ assigned-clocks = <&clk IMX8MM_CLK_GPU2D_CORE>, <&clk IMX8MM_GPU_PLL_OUT>; assigned-clock-parents = <&clk IMX8MM_GPU_PLL_OUT>; - assigned-clock-rates = <0>, <800000000>; + assigned-clock-rates = <0>, <1000000000>; power-domains = <&pgc_gpu>; }; diff --git a/arch/arm64/boot/dts/hisilicon/hikey970-pmic.dtsi b/arch/arm64/boot/dts/hisilicon/hikey970-pmic.dtsi index c06e011a6c3f..970047f2dabd 100644 --- a/arch/arm64/boot/dts/hisilicon/hikey970-pmic.dtsi +++ b/arch/arm64/boot/dts/hisilicon/hikey970-pmic.dtsi @@ -25,6 +25,9 @@ gpios = <&gpio28 0 0>; regulators { + #address-cells = <1>; + #size-cells = <0>; + ldo3: ldo3 { /* HDMI */ regulator-name = "ldo3"; regulator-min-microvolt = <1500000>; diff --git a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts index 37350e5fa253..200f97e1c4c9 100644 --- a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts +++ b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts @@ -130,7 +130,7 @@ compatible = "microchip,mcp7940x"; reg = <0x6f>; interrupt-parent = <&gpiosb>; - interrupts = <5 IRQ_TYPE_EDGE_FALLING>; /* GPIO2_5 */ + interrupts = <5 0>; /* GPIO2_5 */ }; }; diff --git a/arch/arm64/boot/dts/mediatek/mt8183.dtsi b/arch/arm64/boot/dts/mediatek/mt8183.dtsi index d5d9b954c449..10779a9947fe 100644 --- a/arch/arm64/boot/dts/mediatek/mt8183.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt8183.dtsi @@ -1586,7 +1586,7 @@ mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0 0x1000>; }; - dma-controller0@14001000 { + mdp3-rdma0@14001000 { compatible = "mediatek,mt8183-mdp3-rdma"; reg = <0 0x14001000 0 0x1000>; mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0x1000 0x1000>; @@ -1598,7 +1598,6 @@ iommus = <&iommu M4U_PORT_MDP_RDMA0>; mboxes = <&gce 20 CMDQ_THR_PRIO_LOWEST 0>, <&gce 21 CMDQ_THR_PRIO_LOWEST 0>; - #dma-cells = <1>; }; mdp3-rsz0@14003000 { @@ -1619,7 +1618,7 @@ clocks = <&mmsys CLK_MM_MDP_RSZ1>; }; - dma-controller@14005000 { + mdp3-wrot0@14005000 { compatible = "mediatek,mt8183-mdp3-wrot"; reg = <0 0x14005000 0 0x1000>; mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0x5000 0x1000>; @@ -1628,7 +1627,6 @@ power-domains = <&spm MT8183_POWER_DOMAIN_DISP>; clocks = <&mmsys CLK_MM_MDP_WROT0>; iommus = <&iommu M4U_PORT_MDP_WROT0>; - #dma-cells = <1>; }; mdp3-wdma@14006000 { diff --git a/arch/arm64/boot/dts/qcom/ipq6018.dtsi b/arch/arm64/boot/dts/qcom/ipq6018.dtsi index 1533c61cb106..43ff8f1f1475 100644 --- a/arch/arm64/boot/dts/qcom/ipq6018.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq6018.dtsi @@ -146,7 +146,7 @@ ranges; rpm_msg_ram: memory@60000 { - reg = <0x0 0x00060000 0x0 0x6000>; + reg = <0x0 0x60000 0x0 0x6000>; no-map; }; @@ -181,7 +181,7 @@ prng: qrng@e1000 { compatible = "qcom,prng-ee"; - reg = <0x0 0x000e3000 0x0 0x1000>; + reg = <0x0 0xe3000 0x0 0x1000>; clocks = <&gcc GCC_PRNG_AHB_CLK>; clock-names = "core"; }; @@ -201,8 +201,8 @@ compatible = "qcom,crypto-v5.1"; reg = <0x0 0x0073a000 0x0 0x6000>; clocks = <&gcc GCC_CRYPTO_AHB_CLK>, - <&gcc GCC_CRYPTO_AXI_CLK>, - <&gcc GCC_CRYPTO_CLK>; + <&gcc GCC_CRYPTO_AXI_CLK>, + <&gcc GCC_CRYPTO_CLK>; clock-names = "iface", "bus", "core"; dmas = <&cryptobam 2>, <&cryptobam 3>; dma-names = "rx", "tx"; @@ -272,7 +272,7 @@ reg = <0x0 0x078b1000 0x0 0x200>; interrupts = ; clocks = <&gcc GCC_BLSP1_UART3_APPS_CLK>, - <&gcc GCC_BLSP1_AHB_CLK>; + <&gcc GCC_BLSP1_AHB_CLK>; clock-names = "core", "iface"; status = "disabled"; }; @@ -285,7 +285,7 @@ interrupts = ; spi-max-frequency = <50000000>; clocks = <&gcc GCC_BLSP1_QUP1_SPI_APPS_CLK>, - <&gcc GCC_BLSP1_AHB_CLK>; + <&gcc GCC_BLSP1_AHB_CLK>; clock-names = "core", "iface"; dmas = <&blsp_dma 12>, <&blsp_dma 13>; dma-names = "tx", "rx"; @@ -300,7 +300,7 @@ interrupts = ; spi-max-frequency = <50000000>; clocks = <&gcc GCC_BLSP1_QUP2_SPI_APPS_CLK>, - <&gcc GCC_BLSP1_AHB_CLK>; + <&gcc GCC_BLSP1_AHB_CLK>; clock-names = "core", "iface"; dmas = <&blsp_dma 14>, <&blsp_dma 15>; dma-names = "tx", "rx"; @@ -358,8 +358,8 @@ clock-names = "core", "aon"; dmas = <&qpic_bam 0>, - <&qpic_bam 1>, - <&qpic_bam 2>; + <&qpic_bam 1>, + <&qpic_bam 2>; dma-names = "tx", "rx", "cmd"; pinctrl-0 = <&qpic_pins>; pinctrl-names = "default"; @@ -372,10 +372,10 @@ #size-cells = <2>; interrupt-controller; #interrupt-cells = <0x3>; - reg = <0x0 0x0b000000 0x0 0x1000>, /*GICD*/ - <0x0 0x0b002000 0x0 0x1000>, /*GICC*/ - <0x0 0x0b001000 0x0 0x1000>, /*GICH*/ - <0x0 0x0b004000 0x0 0x1000>; /*GICV*/ + reg = <0x0 0x0b000000 0x0 0x1000>, /*GICD*/ + <0x0 0x0b002000 0x0 0x1000>, /*GICC*/ + <0x0 0x0b001000 0x0 0x1000>, /*GICH*/ + <0x0 0x0b004000 0x0 0x1000>; /*GICV*/ interrupts = ; ranges = <0 0 0 0xb00a000 0 0xffd>; @@ -388,7 +388,7 @@ pcie_phy: phy@84000 { compatible = "qcom,ipq6018-qmp-pcie-phy"; - reg = <0x0 0x00084000 0x0 0x1bc>; /* Serdes PLL */ + reg = <0x0 0x84000 0x0 0x1bc>; /* Serdes PLL */ status = "disabled"; #address-cells = <2>; #size-cells = <2>; @@ -404,10 +404,9 @@ "common"; pcie_phy0: phy@84200 { - reg = <0x0 0x00084200 0x0 0x16c>, /* Serdes Tx */ - <0x0 0x00084400 0x0 0x200>, /* Serdes Rx */ - <0x0 0x00084800 0x0 0x1f0>, /* PCS: Lane0, COM, PCIE */ - <0x0 0x00084c00 0x0 0xf4>; /* pcs_misc */ + reg = <0x0 0x84200 0x0 0x16c>, /* Serdes Tx */ + <0x0 0x84400 0x0 0x200>, /* Serdes Rx */ + <0x0 0x84800 0x0 0x4f4>; /* PCS: Lane0, COM, PCIE */ #phy-cells = <0>; clocks = <&gcc GCC_PCIE0_PIPE_CLK>; @@ -629,7 +628,7 @@ #address-cells = <1>; #size-cells = <0>; compatible = "qcom,ipq6018-mdio", "qcom,ipq4019-mdio"; - reg = <0x0 0x00090000 0x0 0x64>; + reg = <0x0 0x90000 0x0 0x64>; clocks = <&gcc GCC_MDIO_AHB_CLK>; clock-names = "gcc_mdio_ahb_clk"; status = "disabled"; @@ -637,7 +636,7 @@ qusb_phy_1: qusb@59000 { compatible = "qcom,ipq6018-qusb2-phy"; - reg = <0x0 0x00059000 0x0 0x180>; + reg = <0x0 0x059000 0x0 0x180>; #phy-cells = <0>; clocks = <&gcc GCC_USB1_PHY_CFG_AHB_CLK>, @@ -669,23 +668,23 @@ status = "disabled"; dwc_1: usb@7000000 { - compatible = "snps,dwc3"; - reg = <0x0 0x07000000 0x0 0xcd00>; - interrupts = ; - phys = <&qusb_phy_1>; - phy-names = "usb2-phy"; - tx-fifo-resize; - snps,is-utmi-l1-suspend; - snps,hird-threshold = /bits/ 8 <0x0>; - snps,dis_u2_susphy_quirk; - snps,dis_u3_susphy_quirk; - dr_mode = "host"; + compatible = "snps,dwc3"; + reg = <0x0 0x7000000 0x0 0xcd00>; + interrupts = ; + phys = <&qusb_phy_1>; + phy-names = "usb2-phy"; + tx-fifo-resize; + snps,is-utmi-l1-suspend; + snps,hird-threshold = /bits/ 8 <0x0>; + snps,dis_u2_susphy_quirk; + snps,dis_u3_susphy_quirk; + dr_mode = "host"; }; }; ssphy_0: ssphy@78000 { compatible = "qcom,ipq6018-qmp-usb3-phy"; - reg = <0x0 0x00078000 0x0 0x1c4>; + reg = <0x0 0x78000 0x0 0x1C4>; #address-cells = <2>; #size-cells = <2>; ranges; @@ -702,7 +701,7 @@ usb0_ssphy: phy@78200 { reg = <0x0 0x00078200 0x0 0x130>, /* Tx */ <0x0 0x00078400 0x0 0x200>, /* Rx */ - <0x0 0x00078800 0x0 0x1f8>, /* PCS */ + <0x0 0x00078800 0x0 0x1F8>, /* PCS */ <0x0 0x00078600 0x0 0x044>; /* PCS misc */ #phy-cells = <0>; #clock-cells = <0>; @@ -714,7 +713,7 @@ qusb_phy_0: qusb@79000 { compatible = "qcom,ipq6018-qusb2-phy"; - reg = <0x0 0x00079000 0x0 0x180>; + reg = <0x0 0x079000 0x0 0x180>; #phy-cells = <0>; clocks = <&gcc GCC_USB0_PHY_CFG_AHB_CLK>, @@ -727,7 +726,7 @@ usb3: usb@8af8800 { compatible = "qcom,ipq6018-dwc3", "qcom,dwc3"; - reg = <0x0 0x8af8800 0x0 0x400>; + reg = <0x0 0x8AF8800 0x0 0x400>; #address-cells = <2>; #size-cells = <2>; ranges; @@ -746,14 +745,14 @@ <&gcc GCC_USB0_MOCK_UTMI_CLK>; assigned-clock-rates = <133330000>, <133330000>, - <24000000>; + <20000000>; resets = <&gcc GCC_USB0_BCR>; status = "disabled"; dwc_0: usb@8a00000 { compatible = "snps,dwc3"; - reg = <0x0 0x8a00000 0x0 0xcd00>; + reg = <0x0 0x8A00000 0x0 0xcd00>; interrupts = ; phys = <&qusb_phy_0>, <&usb0_ssphy>; phy-names = "usb2-phy", "usb3-phy"; diff --git a/arch/arm64/boot/dts/qcom/qrb5165-rb5.dts b/arch/arm64/boot/dts/qcom/qrb5165-rb5.dts index 1defbe0404e2..9731a7c63d53 100644 --- a/arch/arm64/boot/dts/qcom/qrb5165-rb5.dts +++ b/arch/arm64/boot/dts/qcom/qrb5165-rb5.dts @@ -63,8 +63,8 @@ function = LED_FUNCTION_INDICATOR; color = ; gpios = <&pm8150_gpios 10 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "panic-indicator"; default-state = "off"; - panic-indicator; }; led-wlan { diff --git a/arch/arm64/boot/dts/qcom/sc7180.dtsi b/arch/arm64/boot/dts/qcom/sc7180.dtsi index 78e537f1d796..6f0ee4e13ef1 100644 --- a/arch/arm64/boot/dts/qcom/sc7180.dtsi +++ b/arch/arm64/boot/dts/qcom/sc7180.dtsi @@ -3378,7 +3378,7 @@ compatible = "qcom,apss-wdt-sc7180", "qcom,kpss-wdt"; reg = <0 0x17c10000 0 0x1000>; clocks = <&sleep_clk>; - interrupts = ; + interrupts = ; }; timer@17c20000{ diff --git a/arch/arm64/boot/dts/qcom/sc7280-chrome-common.dtsi b/arch/arm64/boot/dts/qcom/sc7280-chrome-common.dtsi index efe6ea538ad2..25f31c81b2b7 100644 --- a/arch/arm64/boot/dts/qcom/sc7280-chrome-common.dtsi +++ b/arch/arm64/boot/dts/qcom/sc7280-chrome-common.dtsi @@ -56,26 +56,6 @@ }; }; -&lpass_aon { - status = "okay"; -}; - -&lpass_core { - status = "okay"; -}; - -&lpass_hm { - status = "okay"; -}; - -&lpasscc { - status = "okay"; -}; - -&pdc_reset { - status = "okay"; -}; - /* The PMIC PON code isn't compatible w/ how Chrome EC/BIOS handle things. */ &pmk8350_pon { status = "disabled"; @@ -113,10 +93,6 @@ reg = <0x0 0x9c900000 0x0 0x800000>; }; -&watchdog { - status = "okay"; -}; - &wifi { status = "okay"; diff --git a/arch/arm64/boot/dts/qcom/sc7280.dtsi b/arch/arm64/boot/dts/qcom/sc7280.dtsi index 7fc8c2045022..aea356c63b9a 100644 --- a/arch/arm64/boot/dts/qcom/sc7280.dtsi +++ b/arch/arm64/boot/dts/qcom/sc7280.dtsi @@ -888,7 +888,6 @@ bus-width = <8>; supports-cqe; - dma-coherent; qcom,dll-config = <0x0007642c>; qcom,ddr-config = <0x80040868>; @@ -2188,7 +2187,6 @@ clocks = <&gcc GCC_CFG_NOC_LPASS_CLK>; clock-names = "iface"; #clock-cells = <1>; - status = "reserved"; /* Owned by ADSP firmware */ }; lpass_rx_macro: codec@3200000 { @@ -2341,7 +2339,6 @@ clock-names = "bi_tcxo", "bi_tcxo_ao", "iface"; #clock-cells = <1>; #power-domain-cells = <1>; - status = "reserved"; /* Owned by ADSP firmware */ }; lpass_core: clock-controller@3900000 { @@ -2352,7 +2349,6 @@ power-domains = <&lpass_hm LPASS_CORE_CC_LPASS_CORE_HM_GDSC>; #clock-cells = <1>; #power-domain-cells = <1>; - status = "reserved"; /* Owned by ADSP firmware */ }; lpass_cpu: audio@3987000 { @@ -2423,7 +2419,6 @@ clock-names = "bi_tcxo"; #clock-cells = <1>; #power-domain-cells = <1>; - status = "reserved"; /* Owned by ADSP firmware */ }; lpass_ag_noc: interconnect@3c40000 { @@ -2534,8 +2529,7 @@ "cx_mem", "cx_dbgc"; interrupts = ; - iommus = <&adreno_smmu 0 0x400>, - <&adreno_smmu 1 0x400>; + iommus = <&adreno_smmu 0 0x401>; operating-points-v2 = <&gpu_opp_table>; qcom,gmu = <&gmu>; interconnects = <&gem_noc MASTER_GFX3D 0 &mc_virt SLAVE_EBI1 0>; @@ -2702,7 +2696,6 @@ "gpu_cc_hub_aon_clk"; power-domains = <&gpucc GPU_CC_CX_GDSC>; - dma-coherent; }; remoteproc_mpss: remoteproc@4080000 { @@ -3272,7 +3265,6 @@ operating-points-v2 = <&sdhc2_opp_table>; bus-width = <4>; - dma-coherent; qcom,dll-config = <0x0007642c>; @@ -3394,8 +3386,8 @@ assigned-clock-rates = <19200000>, <200000000>; interrupts-extended = <&intc GIC_SPI 240 IRQ_TYPE_LEVEL_HIGH>, - <&pdc 12 IRQ_TYPE_EDGE_BOTH>, - <&pdc 13 IRQ_TYPE_EDGE_BOTH>; + <&pdc 12 IRQ_TYPE_EDGE_RISING>, + <&pdc 13 IRQ_TYPE_EDGE_RISING>; interrupt-names = "hs_phy_irq", "dp_hs_phy_irq", "dm_hs_phy_irq"; @@ -4203,7 +4195,6 @@ compatible = "qcom,sc7280-pdc-global"; reg = <0 0x0b5e0000 0 0x20000>; #reset-cells = <1>; - status = "reserved"; /* Owned by firmware */ }; tsens0: thermal-sensor@c263000 { @@ -5195,12 +5186,11 @@ }; }; - watchdog: watchdog@17c10000 { + watchdog@17c10000 { compatible = "qcom,apss-wdt-sc7280", "qcom,kpss-wdt"; reg = <0 0x17c10000 0 0x1000>; clocks = <&sleep_clk>; - interrupts = ; - status = "reserved"; /* Owned by Gunyah hyp */ + interrupts = ; }; timer@17c20000 { diff --git a/arch/arm64/boot/dts/qcom/sc8280xp.dtsi b/arch/arm64/boot/dts/qcom/sc8280xp.dtsi index 7e3aaf5de3f5..405835ad28bc 100644 --- a/arch/arm64/boot/dts/qcom/sc8280xp.dtsi +++ b/arch/arm64/boot/dts/qcom/sc8280xp.dtsi @@ -1653,7 +1653,7 @@ compatible = "qcom,apss-wdt-sc8280xp", "qcom,kpss-wdt"; reg = <0 0x17c10000 0 0x1000>; clocks = <&sleep_clk>; - interrupts = ; + interrupts = ; }; timer@17c20000 { diff --git a/arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi b/arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi index 43ee28db61aa..a5c0c788969f 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi @@ -150,15 +150,15 @@ }; &psci { - /delete-node/ power-domain-cpu0; - /delete-node/ power-domain-cpu1; - /delete-node/ power-domain-cpu2; - /delete-node/ power-domain-cpu3; - /delete-node/ power-domain-cpu4; - /delete-node/ power-domain-cpu5; - /delete-node/ power-domain-cpu6; - /delete-node/ power-domain-cpu7; - /delete-node/ power-domain-cluster; + /delete-node/ cpu0; + /delete-node/ cpu1; + /delete-node/ cpu2; + /delete-node/ cpu3; + /delete-node/ cpu4; + /delete-node/ cpu5; + /delete-node/ cpu6; + /delete-node/ cpu7; + /delete-node/ cpu-cluster0; }; &cpus { @@ -351,9 +351,7 @@ &apps_rsc { - /delete-property/ power-domains; - - regulators-0 { + pm8998-rpmh-regulators { compatible = "qcom,pm8998-rpmh-regulators"; qcom,pmic-id = "a"; @@ -635,7 +633,7 @@ }; }; - regulators-1 { + pm8005-rpmh-regulators { compatible = "qcom,pm8005-rpmh-regulators"; qcom,pmic-id = "c"; diff --git a/arch/arm64/boot/dts/qcom/sdm845-db845c.dts b/arch/arm64/boot/dts/qcom/sdm845-db845c.dts index 135ff4368c4a..c9efcb894a52 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-db845c.dts +++ b/arch/arm64/boot/dts/qcom/sdm845-db845c.dts @@ -66,8 +66,8 @@ function = LED_FUNCTION_INDICATOR; color = ; gpios = <&pm8998_gpio 13 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "panic-indicator"; default-state = "off"; - panic-indicator; }; led-1 { @@ -271,7 +271,7 @@ }; &apps_rsc { - regulators-0 { + pm8998-rpmh-regulators { compatible = "qcom,pm8998-rpmh-regulators"; qcom,pmic-id = "a"; vdd-s1-supply = <&vph_pwr>; @@ -396,7 +396,7 @@ }; }; - regulators-1 { + pmi8998-rpmh-regulators { compatible = "qcom,pmi8998-rpmh-regulators"; qcom,pmic-id = "b"; diff --git a/arch/arm64/boot/dts/qcom/sdm845-lg-common.dtsi b/arch/arm64/boot/dts/qcom/sdm845-lg-common.dtsi index e2921640880a..20f275f8694d 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-lg-common.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm845-lg-common.dtsi @@ -166,7 +166,7 @@ }; &apps_rsc { - regulators-0 { + pm8998-rpmh-regulators { compatible = "qcom,pm8998-rpmh-regulators"; qcom,pmic-id = "a"; @@ -419,7 +419,7 @@ }; }; - regulators-1 { + pmi8998-rpmh-regulators { compatible = "qcom,pmi8998-rpmh-regulators"; qcom,pmic-id = "b"; @@ -433,7 +433,7 @@ }; }; - regulators-2 { + pm8005-rpmh-regulators { compatible = "qcom,pm8005-rpmh-regulators"; qcom,pmic-id = "c"; diff --git a/arch/arm64/boot/dts/qcom/sdm845-mtp.dts b/arch/arm64/boot/dts/qcom/sdm845-mtp.dts index b47e333aa351..64958dee17d8 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-mtp.dts +++ b/arch/arm64/boot/dts/qcom/sdm845-mtp.dts @@ -117,7 +117,7 @@ }; &apps_rsc { - regulators-0 { + pm8998-rpmh-regulators { compatible = "qcom,pm8998-rpmh-regulators"; qcom,pmic-id = "a"; @@ -382,7 +382,7 @@ }; }; - regulators-1 { + pmi8998-rpmh-regulators { compatible = "qcom,pmi8998-rpmh-regulators"; qcom,pmic-id = "b"; @@ -396,7 +396,7 @@ }; }; - regulators-2 { + pm8005-rpmh-regulators { compatible = "qcom,pm8005-rpmh-regulators"; qcom,pmic-id = "c"; diff --git a/arch/arm64/boot/dts/qcom/sdm845-oneplus-common.dtsi b/arch/arm64/boot/dts/qcom/sdm845-oneplus-common.dtsi index 0713b774a97b..392461c29e76 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-oneplus-common.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm845-oneplus-common.dtsi @@ -144,7 +144,7 @@ }; &apps_rsc { - regulators-0 { + pm8998-rpmh-regulators { compatible = "qcom,pm8998-rpmh-regulators"; qcom,pmic-id = "a"; @@ -280,7 +280,7 @@ }; }; - regulators-1 { + pmi8998-rpmh-regulators { compatible = "qcom,pmi8998-rpmh-regulators"; qcom,pmic-id = "b"; @@ -294,7 +294,7 @@ }; }; - regulators-2 { + pm8005-rpmh-regulators { compatible = "qcom,pm8005-rpmh-regulators"; qcom,pmic-id = "c"; diff --git a/arch/arm64/boot/dts/qcom/sdm845-shift-axolotl.dts b/arch/arm64/boot/dts/qcom/sdm845-shift-axolotl.dts index b65c35865dab..83261c9bb4f2 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-shift-axolotl.dts +++ b/arch/arm64/boot/dts/qcom/sdm845-shift-axolotl.dts @@ -110,7 +110,7 @@ }; &apps_rsc { - regulators-0 { + pm8998-rpmh-regulators { compatible = "qcom,pm8998-rpmh-regulators"; qcom,pmic-id = "a"; @@ -375,7 +375,7 @@ }; }; - regulators-1 { + pmi8998-rpmh-regulators { compatible = "qcom,pmi8998-rpmh-regulators"; qcom,pmic-id = "b"; @@ -389,7 +389,7 @@ }; }; - regulators-2 { + pm8005-rpmh-regulators { compatible = "qcom,pm8005-rpmh-regulators"; qcom,pmic-id = "c"; diff --git a/arch/arm64/boot/dts/qcom/sdm845-sony-xperia-tama.dtsi b/arch/arm64/boot/dts/qcom/sdm845-sony-xperia-tama.dtsi index 249a715d5aae..d6918e6d1979 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-sony-xperia-tama.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm845-sony-xperia-tama.dtsi @@ -78,7 +78,7 @@ }; &apps_rsc { - regulators-0 { + pm8998-rpmh-regulators { compatible = "qcom,pm8998-rpmh-regulators"; qcom,pmic-id = "a"; @@ -308,7 +308,7 @@ }; }; - regulators-1 { + pmi8998-rpmh-regulators { compatible = "qcom,pmi8998-rpmh-regulators"; qcom,pmic-id = "b"; @@ -319,7 +319,7 @@ }; }; - regulators-2 { + pm8005-rpmh-regulators { compatible = "qcom,pm8005-rpmh-regulators"; qcom,pmic-id = "c"; diff --git a/arch/arm64/boot/dts/qcom/sdm845-xiaomi-beryllium.dts b/arch/arm64/boot/dts/qcom/sdm845-xiaomi-beryllium.dts index 6d6b3dd69947..0f470cf1ed1c 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-xiaomi-beryllium.dts +++ b/arch/arm64/boot/dts/qcom/sdm845-xiaomi-beryllium.dts @@ -125,7 +125,7 @@ }; &apps_rsc { - regulators-0 { + pm8998-rpmh-regulators { compatible = "qcom,pm8998-rpmh-regulators"; qcom,pmic-id = "a"; diff --git a/arch/arm64/boot/dts/qcom/sdm845-xiaomi-polaris.dts b/arch/arm64/boot/dts/qcom/sdm845-xiaomi-polaris.dts index ffbe45a99b74..093b04359ec3 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-xiaomi-polaris.dts +++ b/arch/arm64/boot/dts/qcom/sdm845-xiaomi-polaris.dts @@ -143,7 +143,7 @@ }; &apps_rsc { - regulators-0 { + pm8998-rpmh-regulators { compatible = "qcom,pm8998-rpmh-regulators"; qcom,pmic-id = "a"; @@ -343,7 +343,7 @@ }; }; - regulators-1 { + pmi8998-rpmh-regulators { compatible = "qcom,pmi8998-rpmh-regulators"; qcom,pmic-id = "b"; @@ -355,7 +355,7 @@ }; }; - regulators-2 { + pm8005-rpmh-regulators { compatible = "qcom,pm8005-rpmh-regulators"; qcom,pmic-id = "c"; diff --git a/arch/arm64/boot/dts/qcom/sdm845.dtsi b/arch/arm64/boot/dts/qcom/sdm845.dtsi index 1e6841902900..52c9f5639f8a 100644 --- a/arch/arm64/boot/dts/qcom/sdm845.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm845.dtsi @@ -5019,7 +5019,7 @@ compatible = "qcom,apss-wdt-sdm845", "qcom,kpss-wdt"; reg = <0 0x17980000 0 0x1000>; clocks = <&sleep_clk>; - interrupts = ; + interrupts = ; }; apss_shared: mailbox@17990000 { diff --git a/arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts b/arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts index 48a41ace8fc5..74f43da51fa5 100644 --- a/arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts +++ b/arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts @@ -99,7 +99,7 @@ }; &apps_rsc { - regulators-0 { + pm8998-rpmh-regulators { compatible = "qcom,pm8998-rpmh-regulators"; qcom,pmic-id = "a"; diff --git a/arch/arm64/boot/dts/qcom/sdm850-samsung-w737.dts b/arch/arm64/boot/dts/qcom/sdm850-samsung-w737.dts index c169d2870bdf..d028a7eb364a 100644 --- a/arch/arm64/boot/dts/qcom/sdm850-samsung-w737.dts +++ b/arch/arm64/boot/dts/qcom/sdm850-samsung-w737.dts @@ -129,7 +129,7 @@ }; &apps_rsc { - regulators-0 { + pm8998-rpmh-regulators { compatible = "qcom,pm8998-rpmh-regulators"; qcom,pmic-id = "a"; diff --git a/arch/arm64/boot/dts/qcom/sm6350.dtsi b/arch/arm64/boot/dts/qcom/sm6350.dtsi index 9da373090593..cea7ca3f326f 100644 --- a/arch/arm64/boot/dts/qcom/sm6350.dtsi +++ b/arch/arm64/boot/dts/qcom/sm6350.dtsi @@ -1462,7 +1462,7 @@ compatible = "qcom,apss-wdt-sm6350", "qcom,kpss-wdt"; reg = <0 0x17c10000 0 0x1000>; clocks = <&sleep_clk>; - interrupts = ; + interrupts = ; }; timer@17c20000 { diff --git a/arch/arm64/boot/dts/qcom/sm8150-hdk.dts b/arch/arm64/boot/dts/qcom/sm8150-hdk.dts index 368da4c7f41b..3331ee957d64 100644 --- a/arch/arm64/boot/dts/qcom/sm8150-hdk.dts +++ b/arch/arm64/boot/dts/qcom/sm8150-hdk.dts @@ -126,6 +126,8 @@ vdda_sp_sensor: vdda_ufs_2ln_core_1: vdda_ufs_2ln_core_2: + vdda_usb_ss_dp_core_1: + vdda_usb_ss_dp_core_2: vdda_qlink_lv: vdda_qlink_lv_ck: vreg_l5a_0p875: ldo5 { @@ -207,12 +209,6 @@ regulator-max-microvolt = <3008000>; regulator-initial-mode = ; }; - - vreg_l18a_0p8: ldo18 { - regulator-min-microvolt = <880000>; - regulator-max-microvolt = <880000>; - regulator-initial-mode = ; - }; }; pm8150l-rpmh-regulators { @@ -443,13 +439,13 @@ &usb_1_qmpphy { status = "okay"; vdda-phy-supply = <&vreg_l3c_1p2>; - vdda-pll-supply = <&vreg_l18a_0p8>; + vdda-pll-supply = <&vdda_usb_ss_dp_core_1>; }; &usb_2_qmpphy { status = "okay"; vdda-phy-supply = <&vreg_l3c_1p2>; - vdda-pll-supply = <&vreg_l5a_0p875>; + vdda-pll-supply = <&vdda_usb_ss_dp_core_1>; }; &usb_1 { diff --git a/arch/arm64/boot/dts/qcom/sm8150.dtsi b/arch/arm64/boot/dts/qcom/sm8150.dtsi index c3c12b0cd416..c586378fc6bc 100644 --- a/arch/arm64/boot/dts/qcom/sm8150.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8150.dtsi @@ -3940,7 +3940,7 @@ compatible = "qcom,apss-wdt-sm8150", "qcom,kpss-wdt"; reg = <0 0x17c10000 0 0x1000>; clocks = <&sleep_clk>; - interrupts = ; + interrupts = ; }; timer@17c20000 { diff --git a/arch/arm64/boot/dts/qcom/sm8250.dtsi b/arch/arm64/boot/dts/qcom/sm8250.dtsi index 3d02adbc0b62..4d9b30f0b284 100644 --- a/arch/arm64/boot/dts/qcom/sm8250.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8250.dtsi @@ -4879,7 +4879,7 @@ compatible = "qcom,apss-wdt-sm8250", "qcom,kpss-wdt"; reg = <0 0x17c10000 0 0x1000>; clocks = <&sleep_clk>; - interrupts = ; + interrupts = ; }; timer@17c20000 { diff --git a/arch/arm64/boot/dts/qcom/sm8350.dtsi b/arch/arm64/boot/dts/qcom/sm8350.dtsi index 888bf4cd73c3..793768a2c9e1 100644 --- a/arch/arm64/boot/dts/qcom/sm8350.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8350.dtsi @@ -903,9 +903,9 @@ }; }; - gpi_dma0: dma-controller@900000 { + gpi_dma0: dma-controller@9800000 { compatible = "qcom,sm8350-gpi-dma", "qcom,sm6350-gpi-dma"; - reg = <0 0x00900000 0 0x60000>; + reg = <0 0x09800000 0 0x60000>; interrupts = , , , diff --git a/arch/arm64/boot/dts/renesas/r8a779g0-white-hawk-cpu.dtsi b/arch/arm64/boot/dts/renesas/r8a779g0-white-hawk-cpu.dtsi index 541b1e73b65e..895f0bd9f754 100644 --- a/arch/arm64/boot/dts/renesas/r8a779g0-white-hawk-cpu.dtsi +++ b/arch/arm64/boot/dts/renesas/r8a779g0-white-hawk-cpu.dtsi @@ -125,9 +125,6 @@ }; &hscif0 { - pinctrl-0 = <&hscif0_pins>; - pinctrl-names = "default"; - status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3399-gru-chromebook.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-gru-chromebook.dtsi index 7d9b8064ad2e..ee6095baba4d 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-gru-chromebook.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399-gru-chromebook.dtsi @@ -510,7 +510,8 @@ ap_i2c_tp: &i2c5 { &pci_rootport { mvl_wifi: wifi@0,0 { compatible = "pci1b4b,2b42"; - reg = <0x0000 0x0 0x0 0x0 0x0>; + reg = <0x83010000 0x0 0x00000000 0x0 0x00100000 + 0x83010000 0x0 0x00100000 0x0 0x00100000>; interrupt-parent = <&gpio0>; interrupts = <8 IRQ_TYPE_LEVEL_LOW>; pinctrl-names = "default"; diff --git a/arch/arm64/boot/dts/rockchip/rk3399-gru-scarlet-dumo.dts b/arch/arm64/boot/dts/rockchip/rk3399-gru-scarlet-dumo.dts index 9e4b12ed62cb..853e88455e75 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-gru-scarlet-dumo.dts +++ b/arch/arm64/boot/dts/rockchip/rk3399-gru-scarlet-dumo.dts @@ -34,8 +34,8 @@ &pci_rootport { wifi@0,0 { compatible = "qcom,ath10k"; - reg = <0x00000000 0x0 0x00000000 0x0 0x00000000>, - <0x03000010 0x0 0x00000000 0x0 0x00200000>; + reg = <0x00010000 0x0 0x00000000 0x0 0x00000000>, + <0x03010010 0x0 0x00000000 0x0 0x00200000>; qcom,ath10k-calibration-variant = "GO_DUMO"; }; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi index 7ba25315dd9a..23bfba86daab 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi @@ -489,7 +489,6 @@ ap_i2c_audio: &i2c8 { #address-cells = <3>; #size-cells = <2>; ranges; - device_type = "pci"; }; }; diff --git a/arch/arm64/boot/dts/rockchip/rk356x.dtsi b/arch/arm64/boot/dts/rockchip/rk356x.dtsi index f4d6dbbbddcd..234b5bbda120 100644 --- a/arch/arm64/boot/dts/rockchip/rk356x.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk356x.dtsi @@ -958,7 +958,7 @@ , , ; - interrupt-names = "sys", "pmc", "msg", "legacy", "err"; + interrupt-names = "sys", "pmc", "msi", "legacy", "err"; bus-range = <0x0 0xf>; clocks = <&cru ACLK_PCIE20_MST>, <&cru ACLK_PCIE20_SLV>, <&cru ACLK_PCIE20_DBI>, <&cru PCLK_PCIE20>, diff --git a/arch/arm64/boot/dts/ti/k3-am62a-main.dtsi b/arch/arm64/boot/dts/ti/k3-am62a-main.dtsi index 9301ea388802..bc4b50bcd177 100644 --- a/arch/arm64/boot/dts/ti/k3-am62a-main.dtsi +++ b/arch/arm64/boot/dts/ti/k3-am62a-main.dtsi @@ -245,7 +245,7 @@ <193>, <194>, <195>; interrupt-controller; #interrupt-cells = <2>; - ti,ngpio = <92>; + ti,ngpio = <87>; ti,davinci-gpio-unbanked = <0>; power-domains = <&k3_pds 77 TI_SCI_PD_EXCLUSIVE>; clocks = <&k3_clks 77 0>; @@ -263,7 +263,7 @@ <183>, <184>, <185>; interrupt-controller; #interrupt-cells = <2>; - ti,ngpio = <52>; + ti,ngpio = <88>; ti,davinci-gpio-unbanked = <0>; power-domains = <&k3_pds 78 TI_SCI_PD_EXCLUSIVE>; clocks = <&k3_clks 78 0>; diff --git a/arch/arm64/boot/dts/ti/k3-am65-main.dtsi b/arch/arm64/boot/dts/ti/k3-am65-main.dtsi index 83dd8993027a..ebb1c5ce7aec 100644 --- a/arch/arm64/boot/dts/ti/k3-am65-main.dtsi +++ b/arch/arm64/boot/dts/ti/k3-am65-main.dtsi @@ -856,7 +856,7 @@ assigned-clocks = <&k3_clks 67 2>; assigned-clock-parents = <&k3_clks 67 5>; - interrupts = ; + interrupts = ; dma-coherent; diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index 97df104913fb..60df8459a337 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h @@ -826,12 +826,6 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) if (pte_hw_dirty(pte)) pte = pte_mkdirty(pte); pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask); - /* - * If we end up clearing hw dirtiness for a sw-dirty PTE, set hardware - * dirtiness again. - */ - if (pte_sw_dirty(pte)) - pte = pte_mkdirty(pte); return pte; } diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index dbf748a10265..dd187094ab40 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -489,7 +489,7 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) kvm_timer_vcpu_terminate(vcpu); kvm_pmu_vcpu_destroy(vcpu); - kvm_vgic_vcpu_destroy(vcpu); + kvm_arm_vcpu_destroy(vcpu); } diff --git a/arch/arm64/kvm/vgic/vgic-init.c b/arch/arm64/kvm/vgic/vgic-init.c index 0919e3b8f46e..f2f3bf4a04b0 100644 --- a/arch/arm64/kvm/vgic/vgic-init.c +++ b/arch/arm64/kvm/vgic/vgic-init.c @@ -368,7 +368,7 @@ static void kvm_vgic_dist_destroy(struct kvm *kvm) vgic_v4_teardown(kvm); } -static void __kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu) +void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu) { struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu; @@ -379,39 +379,29 @@ static void __kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu) vgic_flush_pending_lpis(vcpu); INIT_LIST_HEAD(&vgic_cpu->ap_list_head); - if (vcpu->kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) { - vgic_unregister_redist_iodev(vcpu); - vgic_cpu->rd_iodev.base_addr = VGIC_ADDR_UNDEF; - } + vgic_cpu->rd_iodev.base_addr = VGIC_ADDR_UNDEF; } -void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu) -{ - struct kvm *kvm = vcpu->kvm; - - mutex_lock(&kvm->slots_lock); - __kvm_vgic_vcpu_destroy(vcpu); - mutex_unlock(&kvm->slots_lock); -} - -void kvm_vgic_destroy(struct kvm *kvm) +static void __kvm_vgic_destroy(struct kvm *kvm) { struct kvm_vcpu *vcpu; unsigned long i; - mutex_lock(&kvm->slots_lock); + lockdep_assert_held(&kvm->arch.config_lock); vgic_debug_destroy(kvm); kvm_for_each_vcpu(i, vcpu, kvm) - __kvm_vgic_vcpu_destroy(vcpu); - - mutex_lock(&kvm->arch.config_lock); + kvm_vgic_vcpu_destroy(vcpu); kvm_vgic_dist_destroy(kvm); +} +void kvm_vgic_destroy(struct kvm *kvm) +{ + mutex_lock(&kvm->arch.config_lock); + __kvm_vgic_destroy(kvm); mutex_unlock(&kvm->arch.config_lock); - mutex_unlock(&kvm->slots_lock); } /** @@ -479,26 +469,25 @@ int kvm_vgic_map_resources(struct kvm *kvm) type = VGIC_V3; } - if (ret) + if (ret) { + __kvm_vgic_destroy(kvm); goto out; - + } dist->ready = true; dist_base = dist->vgic_dist_base; mutex_unlock(&kvm->arch.config_lock); ret = vgic_register_dist_iodev(kvm, dist_base, type); - if (ret) + if (ret) { kvm_err("Unable to register VGIC dist MMIO regions\n"); + kvm_vgic_destroy(kvm); + } + mutex_unlock(&kvm->slots_lock); + return ret; - goto out_slots; out: mutex_unlock(&kvm->arch.config_lock); -out_slots: mutex_unlock(&kvm->slots_lock); - - if (ret) - kvm_vgic_destroy(kvm); - return ret; } diff --git a/arch/arm64/kvm/vgic/vgic-its.c b/arch/arm64/kvm/vgic/vgic-its.c index ee7bc0b233b0..46ac071f71e1 100644 --- a/arch/arm64/kvm/vgic/vgic-its.c +++ b/arch/arm64/kvm/vgic/vgic-its.c @@ -584,11 +584,7 @@ static struct vgic_irq *vgic_its_check_cache(struct kvm *kvm, phys_addr_t db, unsigned long flags; raw_spin_lock_irqsave(&dist->lpi_list_lock, flags); - irq = __vgic_its_check_cache(dist, db, devid, eventid); - if (irq) - vgic_get_irq_kref(irq); - raw_spin_unlock_irqrestore(&dist->lpi_list_lock, flags); return irq; @@ -767,7 +763,6 @@ int vgic_its_inject_cached_translation(struct kvm *kvm, struct kvm_msi *msi) raw_spin_lock_irqsave(&irq->irq_lock, flags); irq->pending_latch = true; vgic_queue_irq_unlock(kvm, irq, flags); - vgic_put_irq(kvm, irq); return 0; } diff --git a/arch/arm64/kvm/vgic/vgic-mmio-v3.c b/arch/arm64/kvm/vgic/vgic-mmio-v3.c index ae5a3a717655..188d2187eede 100644 --- a/arch/arm64/kvm/vgic/vgic-mmio-v3.c +++ b/arch/arm64/kvm/vgic/vgic-mmio-v3.c @@ -365,25 +365,18 @@ static int vgic_v3_uaccess_write_pending(struct kvm_vcpu *vcpu, struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); raw_spin_lock_irqsave(&irq->irq_lock, flags); - - /* - * pending_latch is set irrespective of irq type - * (level or edge) to avoid dependency that VM should - * restore irq config before pending info. - */ - irq->pending_latch = test_bit(i, &val); - - if (irq->hw && vgic_irq_is_sgi(irq->intid)) { - irq_set_irqchip_state(irq->host_irq, - IRQCHIP_STATE_PENDING, - irq->pending_latch); - irq->pending_latch = false; - } - - if (irq->pending_latch) + if (test_bit(i, &val)) { + /* + * pending_latch is set irrespective of irq type + * (level or edge) to avoid dependency that VM should + * restore irq config before pending info. + */ + irq->pending_latch = true; vgic_queue_irq_unlock(vcpu->kvm, irq, flags); - else + } else { + irq->pending_latch = false; raw_spin_unlock_irqrestore(&irq->irq_lock, flags); + } vgic_put_irq(vcpu->kvm, irq); } @@ -827,7 +820,7 @@ out_unlock: return ret; } -void vgic_unregister_redist_iodev(struct kvm_vcpu *vcpu) +static void vgic_unregister_redist_iodev(struct kvm_vcpu *vcpu) { struct vgic_io_device *rd_dev = &vcpu->arch.vgic_cpu.rd_iodev; diff --git a/arch/arm64/kvm/vgic/vgic.h b/arch/arm64/kvm/vgic/vgic.h index 2a0da1a42854..4973c8803cab 100644 --- a/arch/arm64/kvm/vgic/vgic.h +++ b/arch/arm64/kvm/vgic/vgic.h @@ -239,7 +239,6 @@ int vgic_v3_lpi_sync_pending_status(struct kvm *kvm, struct vgic_irq *irq); int vgic_v3_save_pending_tables(struct kvm *kvm); int vgic_v3_set_redist_base(struct kvm *kvm, u32 index, u64 addr, u32 count); int vgic_register_redist_iodev(struct kvm_vcpu *vcpu); -void vgic_unregister_redist_iodev(struct kvm_vcpu *vcpu); bool vgic_v3_check_base(struct kvm *kvm); void vgic_v3_load(struct kvm_vcpu *vcpu); diff --git a/arch/csky/include/asm/jump_label.h b/arch/csky/include/asm/jump_label.h index 98a3f4b168bd..d488ba6084bc 100644 --- a/arch/csky/include/asm/jump_label.h +++ b/arch/csky/include/asm/jump_label.h @@ -43,10 +43,5 @@ label: return true; } -enum jump_label_type; -void arch_jump_label_transform_static(struct jump_entry *entry, - enum jump_label_type type); -#define arch_jump_label_transform_static arch_jump_label_transform_static - #endif /* __ASSEMBLY__ */ #endif /* __ASM_CSKY_JUMP_LABEL_H */ diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile index ed47a3a87768..01b57b726322 100644 --- a/arch/loongarch/Makefile +++ b/arch/loongarch/Makefile @@ -116,8 +116,6 @@ vdso_install: all: $(notdir $(KBUILD_IMAGE)) -vmlinuz.efi: vmlinux.efi - vmlinux.elf vmlinux.efi vmlinuz.efi: vmlinux $(Q)$(MAKE) $(build)=$(boot) $(bootvars-y) $(boot)/$@ diff --git a/arch/loongarch/include/asm/elf.h b/arch/loongarch/include/asm/elf.h index f16bd42456e4..b9a4ab54285c 100644 --- a/arch/loongarch/include/asm/elf.h +++ b/arch/loongarch/include/asm/elf.h @@ -241,6 +241,8 @@ void loongarch_dump_regs64(u64 *uregs, const struct pt_regs *regs); do { \ current->thread.vdso = &vdso_info; \ \ + loongarch_set_personality_fcsr(state); \ + \ if (personality(current->personality) != PER_LINUX) \ set_personality(PER_LINUX); \ } while (0) @@ -257,6 +259,7 @@ do { \ clear_thread_flag(TIF_32BIT_ADDR); \ \ current->thread.vdso = &vdso_info; \ + loongarch_set_personality_fcsr(state); \ \ p = personality(current->personality); \ if (p != PER_LINUX32 && p != PER_LINUX) \ @@ -290,7 +293,7 @@ extern const char *__elf_platform; #define ELF_PLAT_INIT(_r, load_addr) do { \ _r->regs[1] = _r->regs[2] = _r->regs[3] = _r->regs[4] = 0; \ _r->regs[5] = _r->regs[6] = _r->regs[7] = _r->regs[8] = 0; \ - _r->regs[9] = _r->regs[10] /* syscall n */ = _r->regs[12] = 0; \ + _r->regs[9] = _r->regs[10] = _r->regs[11] = _r->regs[12] = 0; \ _r->regs[13] = _r->regs[14] = _r->regs[15] = _r->regs[16] = 0; \ _r->regs[17] = _r->regs[18] = _r->regs[19] = _r->regs[20] = 0; \ _r->regs[21] = _r->regs[22] = _r->regs[23] = _r->regs[24] = 0; \ @@ -337,4 +340,6 @@ extern int arch_elf_pt_proc(void *ehdr, void *phdr, struct file *elf, extern int arch_check_elf(void *ehdr, bool has_interpreter, void *interp_ehdr, struct arch_elf_state *state); +extern void loongarch_set_personality_fcsr(struct arch_elf_state *state); + #endif /* _ASM_ELF_H */ diff --git a/arch/loongarch/kernel/elf.c b/arch/loongarch/kernel/elf.c index 0fa81ced28dc..183e94fc9c69 100644 --- a/arch/loongarch/kernel/elf.c +++ b/arch/loongarch/kernel/elf.c @@ -23,3 +23,8 @@ int arch_check_elf(void *_ehdr, bool has_interpreter, void *_interp_ehdr, { return 0; } + +void loongarch_set_personality_fcsr(struct arch_elf_state *state) +{ + current->thread.fpu.fcsr = boot_cpu_data.fpu_csr0; +} diff --git a/arch/loongarch/kernel/process.c b/arch/loongarch/kernel/process.c index 1259bc312979..90a5de746332 100644 --- a/arch/loongarch/kernel/process.c +++ b/arch/loongarch/kernel/process.c @@ -82,7 +82,6 @@ void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp) euen = regs->csr_euen & ~(CSR_EUEN_FPEN); regs->csr_euen = euen; lose_fpu(0); - current->thread.fpu.fcsr = boot_cpu_data.fpu_csr0; clear_thread_flag(TIF_LSX_CTX_LIVE); clear_thread_flag(TIF_LASX_CTX_LIVE); diff --git a/arch/loongarch/kernel/time.c b/arch/loongarch/kernel/time.c index 150df6e17bb6..d2b7d5df132a 100644 --- a/arch/loongarch/kernel/time.c +++ b/arch/loongarch/kernel/time.c @@ -58,6 +58,21 @@ static int constant_set_state_oneshot(struct clock_event_device *evt) return 0; } +static int constant_set_state_oneshot_stopped(struct clock_event_device *evt) +{ + unsigned long timer_config; + + raw_spin_lock(&state_lock); + + timer_config = csr_read64(LOONGARCH_CSR_TCFG); + timer_config &= ~CSR_TCFG_EN; + csr_write64(timer_config, LOONGARCH_CSR_TCFG); + + raw_spin_unlock(&state_lock); + + return 0; +} + static int constant_set_state_periodic(struct clock_event_device *evt) { unsigned long period; @@ -77,16 +92,6 @@ static int constant_set_state_periodic(struct clock_event_device *evt) static int constant_set_state_shutdown(struct clock_event_device *evt) { - unsigned long timer_config; - - raw_spin_lock(&state_lock); - - timer_config = csr_read64(LOONGARCH_CSR_TCFG); - timer_config &= ~CSR_TCFG_EN; - csr_write64(timer_config, LOONGARCH_CSR_TCFG); - - raw_spin_unlock(&state_lock); - return 0; } @@ -151,7 +156,7 @@ int constant_clockevent_init(void) cd->rating = 320; cd->cpumask = cpumask_of(cpu); cd->set_state_oneshot = constant_set_state_oneshot; - cd->set_state_oneshot_stopped = constant_set_state_shutdown; + cd->set_state_oneshot_stopped = constant_set_state_oneshot_stopped; cd->set_state_periodic = constant_set_state_periodic; cd->set_state_shutdown = constant_set_state_shutdown; cd->set_next_event = constant_timer_next_event; diff --git a/arch/loongarch/net/bpf_jit.c b/arch/loongarch/net/bpf_jit.c index 4e86441e6319..40ed49d9adff 100644 --- a/arch/loongarch/net/bpf_jit.c +++ b/arch/loongarch/net/bpf_jit.c @@ -402,6 +402,7 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext const u8 dst = regmap[insn->dst_reg]; const s16 off = insn->off; const s32 imm = insn->imm; + const u64 imm64 = (u64)(insn + 1)->imm << 32 | (u32)insn->imm; const bool is32 = BPF_CLASS(insn->code) == BPF_ALU || BPF_CLASS(insn->code) == BPF_JMP32; switch (code) { @@ -805,12 +806,8 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext /* dst = imm64 */ case BPF_LD | BPF_IMM | BPF_DW: - { - const u64 imm64 = (u64)(insn + 1)->imm << 32 | (u32)insn->imm; - move_imm(ctx, dst, imm64, is32); return 1; - } /* dst = *(size *)(src + off) */ case BPF_LDX | BPF_MEM | BPF_B: diff --git a/arch/mips/alchemy/devboards/db1200.c b/arch/mips/alchemy/devboards/db1200.c index 67f067706af2..f521874ebb07 100644 --- a/arch/mips/alchemy/devboards/db1200.c +++ b/arch/mips/alchemy/devboards/db1200.c @@ -847,7 +847,7 @@ int __init db1200_dev_setup(void) i2c_register_board_info(0, db1200_i2c_devs, ARRAY_SIZE(db1200_i2c_devs)); spi_register_board_info(db1200_spi_devs, - ARRAY_SIZE(db1200_spi_devs)); + ARRAY_SIZE(db1200_i2c_devs)); /* SWITCHES: S6.8 I2C/SPI selector (OFF=I2C ON=SPI) * S6.7 AC97/I2S selector (OFF=AC97 ON=I2S) diff --git a/arch/mips/alchemy/devboards/db1550.c b/arch/mips/alchemy/devboards/db1550.c index 6c6837181f55..fd91d9c9a252 100644 --- a/arch/mips/alchemy/devboards/db1550.c +++ b/arch/mips/alchemy/devboards/db1550.c @@ -589,7 +589,7 @@ int __init db1550_dev_setup(void) i2c_register_board_info(0, db1550_i2c_devs, ARRAY_SIZE(db1550_i2c_devs)); spi_register_board_info(db1550_spi_devs, - ARRAY_SIZE(db1550_spi_devs)); + ARRAY_SIZE(db1550_i2c_devs)); c = clk_get(NULL, "psc0_intclk"); if (!IS_ERR(c)) { diff --git a/arch/mips/boot/dts/loongson/loongson64-2k1000.dtsi b/arch/mips/boot/dts/loongson/loongson64-2k1000.dtsi index c16b521308cb..8143a61111e3 100644 --- a/arch/mips/boot/dts/loongson/loongson64-2k1000.dtsi +++ b/arch/mips/boot/dts/loongson/loongson64-2k1000.dtsi @@ -123,7 +123,8 @@ compatible = "pci0014,7a03.0", "pci0014,7a03", "pciclass0c0320", - "pciclass0c03"; + "pciclass0c03", + "loongson, pci-gmac"; reg = <0x1800 0x0 0x0 0x0 0x0>; interrupts = <12 IRQ_TYPE_LEVEL_LOW>, diff --git a/arch/mips/boot/dts/loongson/ls7a-pch.dtsi b/arch/mips/boot/dts/loongson/ls7a-pch.dtsi index ed99ee316feb..2f45fce2cdc4 100644 --- a/arch/mips/boot/dts/loongson/ls7a-pch.dtsi +++ b/arch/mips/boot/dts/loongson/ls7a-pch.dtsi @@ -186,7 +186,8 @@ compatible = "pci0014,7a03.0", "pci0014,7a03", "pciclass020000", - "pciclass0200"; + "pciclass0200", + "loongson, pci-gmac"; reg = <0x1800 0x0 0x0 0x0 0x0>; interrupts = <12 IRQ_TYPE_LEVEL_HIGH>, diff --git a/arch/mips/include/asm/dmi.h b/arch/mips/include/asm/dmi.h index dc397f630c66..27415a288adf 100644 --- a/arch/mips/include/asm/dmi.h +++ b/arch/mips/include/asm/dmi.h @@ -5,7 +5,7 @@ #include #include -#define dmi_early_remap(x, l) ioremap(x, l) +#define dmi_early_remap(x, l) ioremap_cache(x, l) #define dmi_early_unmap(x, l) iounmap(x) #define dmi_remap(x, l) ioremap_cache(x, l) #define dmi_unmap(x) iounmap(x) diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index e46e7ec76b4f..7c540572f1f7 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c @@ -326,11 +326,11 @@ static void __init bootmem_init(void) panic("Incorrect memory mapping !!!"); if (max_pfn > PFN_DOWN(HIGHMEM_START)) { - max_low_pfn = PFN_DOWN(HIGHMEM_START); #ifdef CONFIG_HIGHMEM - highstart_pfn = max_low_pfn; + highstart_pfn = PFN_DOWN(HIGHMEM_START); highend_pfn = max_pfn; #else + max_low_pfn = PFN_DOWN(HIGHMEM_START); max_pfn = max_low_pfn; #endif } diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index 002c91fcb842..1d93b85271ba 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c @@ -333,11 +333,10 @@ early_initcall(mips_smp_ipi_init); */ asmlinkage void start_secondary(void) { - unsigned int cpu = raw_smp_processor_id(); + unsigned int cpu; cpu_probe(); per_cpu_trap_init(false); - rcu_cpu_starting(cpu); mips_clockevent_init(); mp_ops->init_secondary(); cpu_report(); @@ -349,6 +348,7 @@ asmlinkage void start_secondary(void) */ calibrate_delay(); + cpu = smp_processor_id(); cpu_data[cpu].udelay_val = loops_per_jiffy; set_cpu_sibling_map(cpu); diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 2c94f9cf1ce0..6050e6e10d32 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -806,7 +806,6 @@ config THREAD_SHIFT int "Thread shift" if EXPERT range 13 15 default "15" if PPC_256K_PAGES - default "15" if PPC_PSERIES || PPC_POWERNV default "14" if PPC64 default "13" help diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index 487e4967b60d..054844153b1f 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile @@ -42,13 +42,18 @@ machine-$(CONFIG_PPC64) += 64 machine-$(CONFIG_CPU_LITTLE_ENDIAN) += le UTS_MACHINE := $(subst $(space),,$(machine-y)) -ifeq ($(CONFIG_PPC64)$(CONFIG_LD_IS_BFD),yy) +# XXX This needs to be before we override LD below +ifdef CONFIG_PPC32 +KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o +else +ifeq ($(call ld-ifversion, -ge, 22500, y),y) # Have the linker provide sfpr if possible. # There is a corresponding test in arch/powerpc/lib/Makefile KBUILD_LDFLAGS_MODULE += --save-restore-funcs else KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o endif +endif ifdef CONFIG_CPU_LITTLE_ENDIAN KBUILD_CFLAGS += -mlittle-endian @@ -386,7 +391,17 @@ endif endif PHONY += checkbin +# Check toolchain versions: +# - gcc-4.6 is the minimum kernel-wide version so nothing required. checkbin: + @if test "x${CONFIG_LD_IS_LLD}" != "xy" -a \ + "x$(call ld-ifversion, -le, 22400, y)" = "xy" ; then \ + echo -n '*** binutils 2.24 miscompiles weak symbols ' ; \ + echo 'in some circumstances.' ; \ + echo '*** binutils 2.23 do not define the TOC symbol ' ; \ + echo -n '*** Please use a different binutils version.' ; \ + false ; \ + fi @if test "x${CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT}" = "xy" -a \ "x${CONFIG_LD_IS_BFD}" = "xy" -a \ "${CONFIG_LD_VERSION}" = "23700" ; then \ diff --git a/arch/powerpc/kernel/trace/ftrace_mprofile.S b/arch/powerpc/kernel/trace/ftrace_mprofile.S index f4a72b38488f..6f9c2dea905b 100644 --- a/arch/powerpc/kernel/trace/ftrace_mprofile.S +++ b/arch/powerpc/kernel/trace/ftrace_mprofile.S @@ -62,7 +62,7 @@ .endif /* Save previous stack pointer (r1) */ - addi r8, r1, SWITCH_FRAME_SIZE+STACK_FRAME_MIN_SIZE + addi r8, r1, SWITCH_FRAME_SIZE PPC_STL r8, GPR1(r1) .if \allregs == 1 @@ -182,7 +182,7 @@ ftrace_no_trace: mflr r3 mtctr r3 REST_GPR(3, r1) - addi r1, r1, SWITCH_FRAME_SIZE+STACK_FRAME_MIN_SIZE + addi r1, r1, SWITCH_FRAME_SIZE mtlr r0 bctr #endif diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile index 9b394bab17eb..8560c912186d 100644 --- a/arch/powerpc/lib/Makefile +++ b/arch/powerpc/lib/Makefile @@ -42,8 +42,8 @@ obj-$(CONFIG_FUNCTION_ERROR_INJECTION) += error-inject.o # 64-bit linker creates .sfpr on demand for final link (vmlinux), # so it is only needed for modules, and only for older linkers which # do not support --save-restore-funcs -ifndef CONFIG_LD_IS_BFD -always-$(CONFIG_PPC64) += crtsavres.o +ifeq ($(call ld-ifversion, -lt, 22500, y),y) +extra-$(CONFIG_PPC64) += crtsavres.o endif obj-$(CONFIG_PPC_BOOK3S_64) += copyuser_power7.o copypage_power7.o \ diff --git a/arch/powerpc/perf/imc-pmu.c b/arch/powerpc/perf/imc-pmu.c index 56d82f7f9734..ada817c49b72 100644 --- a/arch/powerpc/perf/imc-pmu.c +++ b/arch/powerpc/perf/imc-pmu.c @@ -299,8 +299,6 @@ static int update_events_in_group(struct device_node *node, struct imc_pmu *pmu) attr_group->attrs = attrs; do { ev_val_str = kasprintf(GFP_KERNEL, "event=0x%x", pmu->events[i].value); - if (!ev_val_str) - continue; dev_str = device_str_attr_create(pmu->events[i].name, ev_val_str); if (!dev_str) continue; @@ -308,8 +306,6 @@ static int update_events_in_group(struct device_node *node, struct imc_pmu *pmu) attrs[j++] = dev_str; if (pmu->events[i].scale) { ev_scale_str = kasprintf(GFP_KERNEL, "%s.scale", pmu->events[i].name); - if (!ev_scale_str) - continue; dev_str = device_str_attr_create(ev_scale_str, pmu->events[i].scale); if (!dev_str) continue; @@ -319,8 +315,6 @@ static int update_events_in_group(struct device_node *node, struct imc_pmu *pmu) if (pmu->events[i].unit) { ev_unit_str = kasprintf(GFP_KERNEL, "%s.unit", pmu->events[i].name); - if (!ev_unit_str) - continue; dev_str = device_str_attr_create(ev_unit_str, pmu->events[i].unit); if (!dev_str) continue; diff --git a/arch/powerpc/platforms/44x/Kconfig b/arch/powerpc/platforms/44x/Kconfig index fc79f8466933..25b80cd558f8 100644 --- a/arch/powerpc/platforms/44x/Kconfig +++ b/arch/powerpc/platforms/44x/Kconfig @@ -173,7 +173,6 @@ config ISS4xx config CURRITUCK bool "IBM Currituck (476fpe) Support" depends on PPC_47x - select I2C select SWIOTLB select 476FPE select FORCE_PCI diff --git a/arch/powerpc/platforms/powernv/opal-irqchip.c b/arch/powerpc/platforms/powernv/opal-irqchip.c index 391f50535200..d55652b5f6fa 100644 --- a/arch/powerpc/platforms/powernv/opal-irqchip.c +++ b/arch/powerpc/platforms/powernv/opal-irqchip.c @@ -275,8 +275,6 @@ int __init opal_event_init(void) else name = kasprintf(GFP_KERNEL, "opal"); - if (!name) - continue; /* Install interrupt handler */ rc = request_irq(r->start, opal_interrupt, r->flags & IRQD_TRIGGER_MASK, name, NULL); diff --git a/arch/powerpc/platforms/powernv/opal-powercap.c b/arch/powerpc/platforms/powernv/opal-powercap.c index ea917266aa17..7bfe4cbeb35a 100644 --- a/arch/powerpc/platforms/powernv/opal-powercap.c +++ b/arch/powerpc/platforms/powernv/opal-powercap.c @@ -196,12 +196,6 @@ void __init opal_powercap_init(void) j = 0; pcaps[i].pg.name = kasprintf(GFP_KERNEL, "%pOFn", node); - if (!pcaps[i].pg.name) { - kfree(pcaps[i].pattrs); - kfree(pcaps[i].pg.attrs); - goto out_pcaps_pattrs; - } - if (has_min) { powercap_add_attr(min, "powercap-min", &pcaps[i].pattrs[j]); diff --git a/arch/powerpc/platforms/powernv/opal-xscom.c b/arch/powerpc/platforms/powernv/opal-xscom.c index f67235d1ba2c..6b4eed2ef4fa 100644 --- a/arch/powerpc/platforms/powernv/opal-xscom.c +++ b/arch/powerpc/platforms/powernv/opal-xscom.c @@ -165,11 +165,6 @@ static int scom_debug_init_one(struct dentry *root, struct device_node *dn, ent->chip = chip; snprintf(ent->name, 16, "%08x", chip); ent->path.data = (void *)kasprintf(GFP_KERNEL, "%pOF", dn); - if (!ent->path.data) { - kfree(ent); - return -ENOMEM; - } - ent->path.size = strlen((char *)ent->path.data); dir = debugfs_create_dir(ent->name, root); diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c index 051a777ba1b2..2e3a317722a8 100644 --- a/arch/powerpc/platforms/pseries/hotplug-memory.c +++ b/arch/powerpc/platforms/pseries/hotplug-memory.c @@ -500,15 +500,14 @@ static int dlpar_memory_remove_by_index(u32 drc_index) } } - if (!lmb_found) { - pr_debug("Failed to look up LMB for drc index %x\n", drc_index); + if (!lmb_found) rc = -EINVAL; - } else if (rc) { + + if (rc) pr_debug("Failed to hot-remove memory at %llx\n", lmb->base_addr); - } else { + else pr_debug("Memory at %llx was hot-removed\n", lmb->base_addr); - } return rc; } diff --git a/arch/riscv/include/asm/sections.h b/arch/riscv/include/asm/sections.h index a393d5035c54..32336e8a17cb 100644 --- a/arch/riscv/include/asm/sections.h +++ b/arch/riscv/include/asm/sections.h @@ -13,7 +13,6 @@ extern char _start_kernel[]; extern char __init_data_begin[], __init_data_end[]; extern char __init_text_begin[], __init_text_end[]; extern char __alt_start[], __alt_end[]; -extern char __exittext_begin[], __exittext_end[]; static inline bool is_va_kernel_text(uintptr_t va) { diff --git a/arch/riscv/include/asm/signal.h b/arch/riscv/include/asm/signal.h index 956ae0a01bad..532c29ef0376 100644 --- a/arch/riscv/include/asm/signal.h +++ b/arch/riscv/include/asm/signal.h @@ -7,6 +7,6 @@ #include asmlinkage __visible -void do_work_pending(struct pt_regs *regs, unsigned long thread_info_flags); +void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags); #endif diff --git a/arch/riscv/include/asm/xip_fixup.h b/arch/riscv/include/asm/xip_fixup.h index b65bf6306f69..d4ffc3c37649 100644 --- a/arch/riscv/include/asm/xip_fixup.h +++ b/arch/riscv/include/asm/xip_fixup.h @@ -13,7 +13,7 @@ add \reg, \reg, t0 .endm .macro XIP_FIXUP_FLASH_OFFSET reg - la t0, __data_loc + la t1, __data_loc REG_L t1, _xip_phys_offset sub \reg, \reg, t1 add \reg, \reg, t0 diff --git a/arch/riscv/kernel/module.c b/arch/riscv/kernel/module.c index a331001e33e6..91fe16bfaa07 100644 --- a/arch/riscv/kernel/module.c +++ b/arch/riscv/kernel/module.c @@ -424,8 +424,7 @@ void *module_alloc(unsigned long size) { return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END, GFP_KERNEL, - PAGE_KERNEL, VM_FLUSH_RESET_PERMS, - NUMA_NO_NODE, + PAGE_KERNEL, 0, NUMA_NO_NODE, __builtin_return_address(0)); } #endif diff --git a/arch/riscv/kernel/patch.c b/arch/riscv/kernel/patch.c index 160e5c1caa9c..e099961453cc 100644 --- a/arch/riscv/kernel/patch.c +++ b/arch/riscv/kernel/patch.c @@ -13,7 +13,6 @@ #include #include #include -#include struct patch_insn { void *addr; @@ -24,14 +23,6 @@ struct patch_insn { int riscv_patch_in_stop_machine = false; #ifdef CONFIG_MMU - -static inline bool is_kernel_exittext(uintptr_t addr) -{ - return system_state < SYSTEM_RUNNING && - addr >= (uintptr_t)__exittext_begin && - addr < (uintptr_t)__exittext_end; -} - /* * The fix_to_virt(, idx) needs a const value (not a dynamic variable of * reg-a0) or BUILD_BUG_ON failed with "idx >= __end_of_fixed_addresses". @@ -42,7 +33,7 @@ static __always_inline void *patch_map(void *addr, const unsigned int fixmap) uintptr_t uintaddr = (uintptr_t) addr; struct page *page; - if (core_kernel_text(uintaddr) || is_kernel_exittext(uintaddr)) + if (core_kernel_text(uintaddr)) page = phys_to_page(__pa_symbol(addr)); else if (IS_ENABLED(CONFIG_STRICT_MODULE_RWX)) page = vmalloc_to_page(addr); diff --git a/arch/riscv/kernel/vmlinux-xip.lds.S b/arch/riscv/kernel/vmlinux-xip.lds.S index 24a2fdd3be6a..75e0fa8a700a 100644 --- a/arch/riscv/kernel/vmlinux-xip.lds.S +++ b/arch/riscv/kernel/vmlinux-xip.lds.S @@ -29,12 +29,10 @@ SECTIONS HEAD_TEXT_SECTION INIT_TEXT_SECTION(PAGE_SIZE) /* we have to discard exit text and such at runtime, not link time */ - __exittext_begin = .; .exit.text : { EXIT_TEXT } - __exittext_end = .; .text : { _text = .; diff --git a/arch/riscv/kernel/vmlinux.lds.S b/arch/riscv/kernel/vmlinux.lds.S index d478e063b878..4e6c88aa4d87 100644 --- a/arch/riscv/kernel/vmlinux.lds.S +++ b/arch/riscv/kernel/vmlinux.lds.S @@ -72,12 +72,10 @@ SECTIONS __soc_builtin_dtb_table_end = .; } /* we have to discard exit text and such at runtime, not link time */ - __exittext_begin = .; .exit.text : { EXIT_TEXT } - __exittext_end = .; __init_text_end = .; . = ALIGN(SECTION_ALIGN); diff --git a/arch/riscv/mm/pageattr.c b/arch/riscv/mm/pageattr.c index 01398fee5cf8..161d0b34c2cb 100644 --- a/arch/riscv/mm/pageattr.c +++ b/arch/riscv/mm/pageattr.c @@ -5,7 +5,6 @@ #include #include -#include #include #include #include @@ -26,6 +25,19 @@ static unsigned long set_pageattr_masks(unsigned long val, struct mm_walk *walk) return new_val; } +static int pageattr_pgd_entry(pgd_t *pgd, unsigned long addr, + unsigned long next, struct mm_walk *walk) +{ + pgd_t val = READ_ONCE(*pgd); + + if (pgd_leaf(val)) { + val = __pgd(set_pageattr_masks(pgd_val(val), walk)); + set_pgd(pgd, val); + } + + return 0; +} + static int pageattr_p4d_entry(p4d_t *p4d, unsigned long addr, unsigned long next, struct mm_walk *walk) { @@ -84,6 +96,7 @@ static int pageattr_pte_hole(unsigned long addr, unsigned long next, } static const struct mm_walk_ops pageattr_ops = { + .pgd_entry = pageattr_pgd_entry, .p4d_entry = pageattr_p4d_entry, .pud_entry = pageattr_pud_entry, .pmd_entry = pageattr_pmd_entry, @@ -92,181 +105,12 @@ static const struct mm_walk_ops pageattr_ops = { .walk_lock = PGWALK_RDLOCK, }; -#ifdef CONFIG_64BIT -static int __split_linear_mapping_pmd(pud_t *pudp, - unsigned long vaddr, unsigned long end) -{ - pmd_t *pmdp; - unsigned long next; - - pmdp = pmd_offset(pudp, vaddr); - - do { - next = pmd_addr_end(vaddr, end); - - if (next - vaddr >= PMD_SIZE && - vaddr <= (vaddr & PMD_MASK) && end >= next) - continue; - - if (pmd_leaf(*pmdp)) { - struct page *pte_page; - unsigned long pfn = _pmd_pfn(*pmdp); - pgprot_t prot = __pgprot(pmd_val(*pmdp) & ~_PAGE_PFN_MASK); - pte_t *ptep_new; - int i; - - pte_page = alloc_page(GFP_KERNEL); - if (!pte_page) - return -ENOMEM; - - ptep_new = (pte_t *)page_address(pte_page); - for (i = 0; i < PTRS_PER_PTE; ++i, ++ptep_new) - set_pte(ptep_new, pfn_pte(pfn + i, prot)); - - smp_wmb(); - - set_pmd(pmdp, pfn_pmd(page_to_pfn(pte_page), PAGE_TABLE)); - } - } while (pmdp++, vaddr = next, vaddr != end); - - return 0; -} - -static int __split_linear_mapping_pud(p4d_t *p4dp, - unsigned long vaddr, unsigned long end) -{ - pud_t *pudp; - unsigned long next; - int ret; - - pudp = pud_offset(p4dp, vaddr); - - do { - next = pud_addr_end(vaddr, end); - - if (next - vaddr >= PUD_SIZE && - vaddr <= (vaddr & PUD_MASK) && end >= next) - continue; - - if (pud_leaf(*pudp)) { - struct page *pmd_page; - unsigned long pfn = _pud_pfn(*pudp); - pgprot_t prot = __pgprot(pud_val(*pudp) & ~_PAGE_PFN_MASK); - pmd_t *pmdp_new; - int i; - - pmd_page = alloc_page(GFP_KERNEL); - if (!pmd_page) - return -ENOMEM; - - pmdp_new = (pmd_t *)page_address(pmd_page); - for (i = 0; i < PTRS_PER_PMD; ++i, ++pmdp_new) - set_pmd(pmdp_new, - pfn_pmd(pfn + ((i * PMD_SIZE) >> PAGE_SHIFT), prot)); - - smp_wmb(); - - set_pud(pudp, pfn_pud(page_to_pfn(pmd_page), PAGE_TABLE)); - } - - ret = __split_linear_mapping_pmd(pudp, vaddr, next); - if (ret) - return ret; - } while (pudp++, vaddr = next, vaddr != end); - - return 0; -} - -static int __split_linear_mapping_p4d(pgd_t *pgdp, - unsigned long vaddr, unsigned long end) -{ - p4d_t *p4dp; - unsigned long next; - int ret; - - p4dp = p4d_offset(pgdp, vaddr); - - do { - next = p4d_addr_end(vaddr, end); - - /* - * If [vaddr; end] contains [vaddr & P4D_MASK; next], we don't - * need to split, we'll change the protections on the whole P4D. - */ - if (next - vaddr >= P4D_SIZE && - vaddr <= (vaddr & P4D_MASK) && end >= next) - continue; - - if (p4d_leaf(*p4dp)) { - struct page *pud_page; - unsigned long pfn = _p4d_pfn(*p4dp); - pgprot_t prot = __pgprot(p4d_val(*p4dp) & ~_PAGE_PFN_MASK); - pud_t *pudp_new; - int i; - - pud_page = alloc_page(GFP_KERNEL); - if (!pud_page) - return -ENOMEM; - - /* - * Fill the pud level with leaf puds that have the same - * protections as the leaf p4d. - */ - pudp_new = (pud_t *)page_address(pud_page); - for (i = 0; i < PTRS_PER_PUD; ++i, ++pudp_new) - set_pud(pudp_new, - pfn_pud(pfn + ((i * PUD_SIZE) >> PAGE_SHIFT), prot)); - - /* - * Make sure the pud filling is not reordered with the - * p4d store which could result in seeing a partially - * filled pud level. - */ - smp_wmb(); - - set_p4d(p4dp, pfn_p4d(page_to_pfn(pud_page), PAGE_TABLE)); - } - - ret = __split_linear_mapping_pud(p4dp, vaddr, next); - if (ret) - return ret; - } while (p4dp++, vaddr = next, vaddr != end); - - return 0; -} - -static int __split_linear_mapping_pgd(pgd_t *pgdp, - unsigned long vaddr, - unsigned long end) -{ - unsigned long next; - int ret; - - do { - next = pgd_addr_end(vaddr, end); - /* We never use PGD mappings for the linear mapping */ - ret = __split_linear_mapping_p4d(pgdp, vaddr, next); - if (ret) - return ret; - } while (pgdp++, vaddr = next, vaddr != end); - - return 0; -} - -static int split_linear_mapping(unsigned long start, unsigned long end) -{ - return __split_linear_mapping_pgd(pgd_offset_k(start), start, end); -} -#endif /* CONFIG_64BIT */ - static int __set_memory(unsigned long addr, int numpages, pgprot_t set_mask, pgprot_t clear_mask) { int ret; unsigned long start = addr; unsigned long end = start + PAGE_SIZE * numpages; - unsigned long __maybe_unused lm_start; - unsigned long __maybe_unused lm_end; struct pageattr_masks masks = { .set_mask = set_mask, .clear_mask = clear_mask @@ -276,72 +120,11 @@ static int __set_memory(unsigned long addr, int numpages, pgprot_t set_mask, return 0; mmap_write_lock(&init_mm); - -#ifdef CONFIG_64BIT - /* - * We are about to change the permissions of a kernel mapping, we must - * apply the same changes to its linear mapping alias, which may imply - * splitting a huge mapping. - */ - - if (is_vmalloc_or_module_addr((void *)start)) { - struct vm_struct *area = NULL; - int i, page_start; - - area = find_vm_area((void *)start); - page_start = (start - (unsigned long)area->addr) >> PAGE_SHIFT; - - for (i = page_start; i < page_start + numpages; ++i) { - lm_start = (unsigned long)page_address(area->pages[i]); - lm_end = lm_start + PAGE_SIZE; - - ret = split_linear_mapping(lm_start, lm_end); - if (ret) - goto unlock; - - ret = walk_page_range_novma(&init_mm, lm_start, lm_end, - &pageattr_ops, NULL, &masks); - if (ret) - goto unlock; - } - } else if (is_kernel_mapping(start) || is_linear_mapping(start)) { - if (is_kernel_mapping(start)) { - lm_start = (unsigned long)lm_alias(start); - lm_end = (unsigned long)lm_alias(end); - } else { - lm_start = start; - lm_end = end; - } - - ret = split_linear_mapping(lm_start, lm_end); - if (ret) - goto unlock; - - ret = walk_page_range_novma(&init_mm, lm_start, lm_end, - &pageattr_ops, NULL, &masks); - if (ret) - goto unlock; - } - ret = walk_page_range_novma(&init_mm, start, end, &pageattr_ops, NULL, &masks); - -unlock: - mmap_write_unlock(&init_mm); - - /* - * We can't use flush_tlb_kernel_range() here as we may have split a - * hugepage that is larger than that, so let's flush everything. - */ - flush_tlb_all(); -#else - ret = walk_page_range_novma(&init_mm, start, end, &pageattr_ops, NULL, - &masks); - mmap_write_unlock(&init_mm); flush_tlb_kernel_range(start, end); -#endif return ret; } @@ -376,14 +159,36 @@ int set_memory_nx(unsigned long addr, int numpages) int set_direct_map_invalid_noflush(struct page *page) { - return __set_memory((unsigned long)page_address(page), 1, - __pgprot(0), __pgprot(_PAGE_PRESENT)); + int ret; + unsigned long start = (unsigned long)page_address(page); + unsigned long end = start + PAGE_SIZE; + struct pageattr_masks masks = { + .set_mask = __pgprot(0), + .clear_mask = __pgprot(_PAGE_PRESENT) + }; + + mmap_read_lock(&init_mm); + ret = walk_page_range(&init_mm, start, end, &pageattr_ops, &masks); + mmap_read_unlock(&init_mm); + + return ret; } int set_direct_map_default_noflush(struct page *page) { - return __set_memory((unsigned long)page_address(page), 1, - PAGE_KERNEL, __pgprot(_PAGE_EXEC)); + int ret; + unsigned long start = (unsigned long)page_address(page); + unsigned long end = start + PAGE_SIZE; + struct pageattr_masks masks = { + .set_mask = PAGE_KERNEL, + .clear_mask = __pgprot(0) + }; + + mmap_read_lock(&init_mm); + ret = walk_page_range(&init_mm, start, end, &pageattr_ops, &masks); + mmap_read_unlock(&init_mm); + + return ret; } #ifdef CONFIG_DEBUG_PAGEALLOC diff --git a/arch/s390/include/asm/fpu/api.h b/arch/s390/include/asm/fpu/api.h index 9acf48e53a87..b714ed0ef688 100644 --- a/arch/s390/include/asm/fpu/api.h +++ b/arch/s390/include/asm/fpu/api.h @@ -79,7 +79,7 @@ static inline int test_fp_ctl(u32 fpc) #define KERNEL_VXR_HIGH (KERNEL_VXR_V16V23|KERNEL_VXR_V24V31) #define KERNEL_VXR (KERNEL_VXR_LOW|KERNEL_VXR_HIGH) -#define KERNEL_FPR (KERNEL_FPC|KERNEL_VXR_LOW) +#define KERNEL_FPR (KERNEL_FPC|KERNEL_VXR_V0V7) struct kernel_fpu; diff --git a/arch/s390/include/asm/pci_io.h b/arch/s390/include/asm/pci_io.h index 2686bee800e3..287bb88f7698 100644 --- a/arch/s390/include/asm/pci_io.h +++ b/arch/s390/include/asm/pci_io.h @@ -11,8 +11,6 @@ /* I/O size constraints */ #define ZPCI_MAX_READ_SIZE 8 #define ZPCI_MAX_WRITE_SIZE 128 -#define ZPCI_BOUNDARY_SIZE (1 << 12) -#define ZPCI_BOUNDARY_MASK (ZPCI_BOUNDARY_SIZE - 1) /* I/O Map */ #define ZPCI_IOMAP_SHIFT 48 @@ -127,18 +125,16 @@ out: int zpci_write_block(volatile void __iomem *dst, const void *src, unsigned long len); -static inline int zpci_get_max_io_size(u64 src, u64 dst, int len, int max) +static inline u8 zpci_get_max_write_size(u64 src, u64 dst, int len, int max) { - int offset = dst & ZPCI_BOUNDARY_MASK; - int size; + int count = len > max ? max : len, size = 1; - size = min3(len, ZPCI_BOUNDARY_SIZE - offset, max); - if (IS_ALIGNED(src, 8) && IS_ALIGNED(dst, 8) && IS_ALIGNED(size, 8)) - return size; - - if (size >= 8) - return 8; - return rounddown_pow_of_two(size); + while (!(src & 0x1) && !(dst & 0x1) && ((size << 1) <= count)) { + dst = dst >> 1; + src = src >> 1; + size = size << 1; + } + return size; } static inline int zpci_memcpy_fromio(void *dst, @@ -148,9 +144,9 @@ static inline int zpci_memcpy_fromio(void *dst, int size, rc = 0; while (n > 0) { - size = zpci_get_max_io_size((u64 __force) src, - (u64) dst, n, - ZPCI_MAX_READ_SIZE); + size = zpci_get_max_write_size((u64 __force) src, + (u64) dst, n, + ZPCI_MAX_READ_SIZE); rc = zpci_read_single(dst, src, size); if (rc) break; @@ -170,9 +166,9 @@ static inline int zpci_memcpy_toio(volatile void __iomem *dst, return -EINVAL; while (n > 0) { - size = zpci_get_max_io_size((u64 __force) dst, - (u64) src, n, - ZPCI_MAX_WRITE_SIZE); + size = zpci_get_max_write_size((u64 __force) dst, + (u64) src, n, + ZPCI_MAX_WRITE_SIZE); if (size > 8) /* main path */ rc = zpci_write_block(dst, src, size); else diff --git a/arch/s390/kernel/perf_cpum_cf.c b/arch/s390/kernel/perf_cpum_cf.c index 28fa80fd69fa..f043a7ff220b 100644 --- a/arch/s390/kernel/perf_cpum_cf.c +++ b/arch/s390/kernel/perf_cpum_cf.c @@ -2,7 +2,7 @@ /* * Performance event support for s390x - CPU-measurement Counter Facility * - * Copyright IBM Corp. 2012, 2022 + * Copyright IBM Corp. 2012, 2021 * Author(s): Hendrik Brueckner * Thomas Richter */ @@ -434,12 +434,6 @@ static void cpumf_hw_inuse(void) mutex_unlock(&pmc_reserve_mutex); } -static int is_userspace_event(u64 ev) -{ - return cpumf_generic_events_user[PERF_COUNT_HW_CPU_CYCLES] == ev || - cpumf_generic_events_user[PERF_COUNT_HW_INSTRUCTIONS] == ev; -} - static int __hw_perf_event_init(struct perf_event *event, unsigned int type) { struct perf_event_attr *attr = &event->attr; @@ -462,26 +456,19 @@ static int __hw_perf_event_init(struct perf_event *event, unsigned int type) if (is_sampling_event(event)) /* No sampling support */ return -ENOENT; ev = attr->config; + /* Count user space (problem-state) only */ if (!attr->exclude_user && attr->exclude_kernel) { - /* - * Count user space (problem-state) only - * Handle events 32 and 33 as 0:u and 1:u - */ - if (!is_userspace_event(ev)) { - if (ev >= ARRAY_SIZE(cpumf_generic_events_user)) - return -EOPNOTSUPP; - ev = cpumf_generic_events_user[ev]; - } + if (ev >= ARRAY_SIZE(cpumf_generic_events_user)) + return -EOPNOTSUPP; + ev = cpumf_generic_events_user[ev]; + + /* No support for kernel space counters only */ } else if (!attr->exclude_kernel && attr->exclude_user) { - /* No support for kernel space counters only */ return -EOPNOTSUPP; - } else { - /* Count user and kernel space, incl. events 32 + 33 */ - if (!is_userspace_event(ev)) { - if (ev >= ARRAY_SIZE(cpumf_generic_events_basic)) - return -EOPNOTSUPP; - ev = cpumf_generic_events_basic[ev]; - } + } else { /* Count user and kernel space */ + if (ev >= ARRAY_SIZE(cpumf_generic_events_basic)) + return -EOPNOTSUPP; + ev = cpumf_generic_events_basic[ev]; } break; diff --git a/arch/s390/mm/vmem.c b/arch/s390/mm/vmem.c index 3cbb46182066..9a0ce5315f36 100644 --- a/arch/s390/mm/vmem.c +++ b/arch/s390/mm/vmem.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include @@ -45,11 +44,8 @@ void *vmem_crst_alloc(unsigned long val) unsigned long *table; table = vmem_alloc_pages(CRST_ALLOC_ORDER); - if (!table) - return NULL; - crst_table_init(table, val); - if (slab_is_available()) - arch_set_page_dat(virt_to_page(table), CRST_ALLOC_ORDER); + if (table) + crst_table_init(table, val); return table; } diff --git a/arch/s390/pci/pci_mmio.c b/arch/s390/pci/pci_mmio.c index a90499c087f0..588089332931 100644 --- a/arch/s390/pci/pci_mmio.c +++ b/arch/s390/pci/pci_mmio.c @@ -97,9 +97,9 @@ static inline int __memcpy_toio_inuser(void __iomem *dst, return -EINVAL; while (n > 0) { - size = zpci_get_max_io_size((u64 __force) dst, - (u64 __force) src, n, - ZPCI_MAX_WRITE_SIZE); + size = zpci_get_max_write_size((u64 __force) dst, + (u64 __force) src, n, + ZPCI_MAX_WRITE_SIZE); if (size > 8) /* main path */ rc = __pcistb_mio_inuser(dst, src, size, &status); else @@ -242,9 +242,9 @@ static inline int __memcpy_fromio_inuser(void __user *dst, u8 status; while (n > 0) { - size = zpci_get_max_io_size((u64 __force) src, - (u64 __force) dst, n, - ZPCI_MAX_READ_SIZE); + size = zpci_get_max_write_size((u64 __force) src, + (u64 __force) dst, n, + ZPCI_MAX_READ_SIZE); rc = __pcilg_mio_inuser(dst, src, size, &status); if (rc) break; diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c index 949129443b1c..2fb5e1541efc 100644 --- a/arch/x86/events/intel/core.c +++ b/arch/x86/events/intel/core.c @@ -4033,17 +4033,12 @@ static struct perf_guest_switch_msr *intel_guest_get_msrs(int *nr, void *data) u64 pebs_mask = cpuc->pebs_enabled & x86_pmu.pebs_capable; int global_ctrl, pebs_enable; - /* - * In addition to obeying exclude_guest/exclude_host, remove bits being - * used for PEBS when running a guest, because PEBS writes to virtual - * addresses (not physical addresses). - */ *nr = 0; global_ctrl = (*nr)++; arr[global_ctrl] = (struct perf_guest_switch_msr){ .msr = MSR_CORE_PERF_GLOBAL_CTRL, .host = intel_ctrl & ~cpuc->intel_ctrl_guest_mask, - .guest = intel_ctrl & ~cpuc->intel_ctrl_host_mask & ~pebs_mask, + .guest = intel_ctrl & (~cpuc->intel_ctrl_host_mask | ~pebs_mask), }; if (!x86_pmu.pebs) diff --git a/arch/x86/events/intel/uncore_discovery.c b/arch/x86/events/intel/uncore_discovery.c index 7d454141433c..5fd72d4b8bbb 100644 --- a/arch/x86/events/intel/uncore_discovery.c +++ b/arch/x86/events/intel/uncore_discovery.c @@ -140,21 +140,13 @@ uncore_insert_box_info(struct uncore_unit_discovery *unit, unsigned int *box_offset, *ids; int i; - if (!unit->ctl || !unit->ctl_offset || !unit->ctr_offset) { - pr_info("Invalid address is detected for uncore type %d box %d, " - "Disable the uncore unit.\n", - unit->box_type, unit->box_id); + if (WARN_ON_ONCE(!unit->ctl || !unit->ctl_offset || !unit->ctr_offset)) return; - } if (parsed) { type = search_uncore_discovery_type(unit->box_type); - if (!type) { - pr_info("A spurious uncore type %d is detected, " - "Disable the uncore type.\n", - unit->box_type); + if (WARN_ON_ONCE(!type)) return; - } /* Store the first box of each die */ if (!type->box_ctrl_die[die]) type->box_ctrl_die[die] = unit->ctl; @@ -189,12 +181,8 @@ uncore_insert_box_info(struct uncore_unit_discovery *unit, ids[i] = type->ids[i]; box_offset[i] = type->box_offset[i]; - if (unit->box_id == ids[i]) { - pr_info("Duplicate uncore type %d box ID %d is detected, " - "Drop the duplicate uncore unit.\n", - unit->box_type, unit->box_id); + if (WARN_ON_ONCE(unit->box_id == ids[i])) goto free_ids; - } } ids[i] = unit->box_id; box_offset[i] = unit->ctl - type->box_ctrl; diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c index c18e5c764643..189ae92de4d0 100644 --- a/arch/x86/hyperv/hv_init.c +++ b/arch/x86/hyperv/hv_init.c @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -268,31 +267,15 @@ static int hv_cpu_die(unsigned int cpu) static int __init hv_pci_init(void) { - bool gen2vm = efi_enabled(EFI_BOOT); + int gen2vm = efi_enabled(EFI_BOOT); /* - * A Generation-2 VM doesn't support legacy PCI/PCIe, so both - * raw_pci_ops and raw_pci_ext_ops are NULL, and pci_subsys_init() -> - * pcibios_init() doesn't call pcibios_resource_survey() -> - * e820__reserve_resources_late(); as a result, any emulated persistent - * memory of E820_TYPE_PRAM (12) via the kernel parameter - * memmap=nn[KMG]!ss is not added into iomem_resource and hence can't be - * detected by register_e820_pmem(). Fix this by directly calling - * e820__reserve_resources_late() here: e820__reserve_resources_late() - * depends on e820__reserve_resources(), which has been called earlier - * from setup_arch(). Note: e820__reserve_resources_late() also adds - * any memory of E820_TYPE_PMEM (7) into iomem_resource, and - * acpi_nfit_register_region() -> acpi_nfit_insert_resource() -> - * region_intersects() returns REGION_INTERSECTS, so the memory of - * E820_TYPE_PMEM won't get added twice. - * - * We return 0 here so that pci_arch_init() won't print the warning: + * For Generation-2 VM, we exit from pci_arch_init() by returning 0. + * The purpose is to suppress the harmless warning: * "PCI: Fatal: No config space access function found" */ - if (gen2vm) { - e820__reserve_resources_late(); + if (gen2vm) return 0; - } /* For Generation-1 VM, we'll proceed in pci_arch_init(). */ return 1; diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c index 6b8c93989aa3..46b7ee0ab01a 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c @@ -1015,8 +1015,8 @@ void __init_or_module text_poke_early(void *addr, const void *opcode, } else { local_irq_save(flags); memcpy(addr, opcode, len); - sync_core(); local_irq_restore(flags); + sync_core(); /* * Could also do a CLFLUSH here to speed up CPU recovery; but diff --git a/arch/x86/kernel/cpu/mce/inject.c b/arch/x86/kernel/cpu/mce/inject.c index 87c15ab89651..12cf2e7ca33c 100644 --- a/arch/x86/kernel/cpu/mce/inject.c +++ b/arch/x86/kernel/cpu/mce/inject.c @@ -747,7 +747,6 @@ static void check_hw_inj_possible(void) wrmsrl_safe(mca_msr_reg(bank, MCA_STATUS), status); rdmsrl_safe(mca_msr_reg(bank, MCA_STATUS), &status); - wrmsrl_safe(mca_msr_reg(bank, MCA_STATUS), 0); if (!status) { hw_injection_possible = false; diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c index 6120f25b0d5c..ea155f0cf545 100644 --- a/arch/x86/kernel/kprobes/core.c +++ b/arch/x86/kernel/kprobes/core.c @@ -549,8 +549,7 @@ static void kprobe_emulate_call_indirect(struct kprobe *p, struct pt_regs *regs) { unsigned long offs = addrmode_regoffs[p->ainsn.indirect.reg]; - int3_emulate_push(regs, regs->ip - INT3_INSN_SIZE + p->ainsn.size); - int3_emulate_jmp(regs, regs_get_register(regs, offs)); + int3_emulate_call(regs, regs_get_register(regs, offs)); } NOKPROBE_SYMBOL(kprobe_emulate_call_indirect); diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index c067887d42df..16333ba1904b 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -24,8 +24,8 @@ static int kvmclock __initdata = 1; static int kvmclock_vsyscall __initdata = 1; -static int msr_kvm_system_time __ro_after_init; -static int msr_kvm_wall_clock __ro_after_init; +static int msr_kvm_system_time __ro_after_init = MSR_KVM_SYSTEM_TIME; +static int msr_kvm_wall_clock __ro_after_init = MSR_KVM_WALL_CLOCK; static u64 kvm_sched_clock_offset __ro_after_init; static int __init parse_no_kvmclock(char *arg) @@ -195,8 +195,7 @@ static void kvm_setup_secondary_clock(void) void kvmclock_disable(void) { - if (msr_kvm_system_time) - native_write_msr(msr_kvm_system_time, 0, 0); + native_write_msr(msr_kvm_system_time, 0, 0); } static void __init kvmclock_init_mem(void) @@ -295,10 +294,7 @@ void __init kvmclock_init(void) if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE2)) { msr_kvm_system_time = MSR_KVM_SYSTEM_TIME_NEW; msr_kvm_wall_clock = MSR_KVM_WALL_CLOCK_NEW; - } else if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE)) { - msr_kvm_system_time = MSR_KVM_SYSTEM_TIME; - msr_kvm_wall_clock = MSR_KVM_WALL_CLOCK; - } else { + } else if (!kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE)) { return; } diff --git a/arch/x86/lib/misc.c b/arch/x86/lib/misc.c index c97be9a1430a..a018ec4fba53 100644 --- a/arch/x86/lib/misc.c +++ b/arch/x86/lib/misc.c @@ -6,7 +6,7 @@ */ int num_digits(int val) { - long long m = 10; + int m = 10; int d = 1; if (val < 0) { diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index 84c695ae1940..4686c1d9d0cf 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c @@ -893,10 +893,6 @@ static void emit_nops(u8 **pprog, int len) #define INSN_SZ_DIFF (((addrs[i] - addrs[i - 1]) - (prog - temp))) -/* mov rax, qword ptr [rbp - rounded_stack_depth - 8] */ -#define RESTORE_TAIL_CALL_CNT(stack) \ - EMIT3_off32(0x48, 0x8B, 0x85, -round_up(stack, 8) - 8) - static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, u8 *rw_image, int oldproglen, struct jit_context *ctx, bool jmp_padding) { @@ -1440,7 +1436,9 @@ st: if (is_imm8(insn->off)) case BPF_JMP | BPF_CALL: func = (u8 *) __bpf_call_base + imm32; if (tail_call_reachable) { - RESTORE_TAIL_CALL_CNT(bpf_prog->aux->stack_depth); + /* mov rax, qword ptr [rbp - rounded_stack_depth - 8] */ + EMIT3_off32(0x48, 0x8B, 0x85, + -round_up(bpf_prog->aux->stack_depth, 8) - 8); if (!imm32 || emit_call(&prog, func, image + addrs[i - 1] + 7)) return -EINVAL; } else { @@ -1752,37 +1750,63 @@ emit_jmp: return proglen; } -static void save_regs(const struct btf_func_model *m, u8 **prog, int nr_regs, +static void save_regs(const struct btf_func_model *m, u8 **prog, int nr_args, int stack_size) { - int i; - + int i, j, arg_size, nr_regs; /* Store function arguments to stack. * For a function that accepts two pointers the sequence will be: * mov QWORD PTR [rbp-0x10],rdi * mov QWORD PTR [rbp-0x8],rsi */ - for (i = 0; i < min(nr_regs, 6); i++) - emit_stx(prog, BPF_DW, BPF_REG_FP, - i == 5 ? X86_REG_R9 : BPF_REG_1 + i, - -(stack_size - i * 8)); + for (i = 0, j = 0; i < min(nr_args, 6); i++) { + if (m->arg_flags[i] & BTF_FMODEL_STRUCT_ARG) { + nr_regs = (m->arg_size[i] + 7) / 8; + arg_size = 8; + } else { + nr_regs = 1; + arg_size = m->arg_size[i]; + } + + while (nr_regs) { + emit_stx(prog, bytes_to_bpf_size(arg_size), + BPF_REG_FP, + j == 5 ? X86_REG_R9 : BPF_REG_1 + j, + -(stack_size - j * 8)); + nr_regs--; + j++; + } + } } -static void restore_regs(const struct btf_func_model *m, u8 **prog, int nr_regs, +static void restore_regs(const struct btf_func_model *m, u8 **prog, int nr_args, int stack_size) { - int i; + int i, j, arg_size, nr_regs; /* Restore function arguments from stack. * For a function that accepts two pointers the sequence will be: * EMIT4(0x48, 0x8B, 0x7D, 0xF0); mov rdi,QWORD PTR [rbp-0x10] * EMIT4(0x48, 0x8B, 0x75, 0xF8); mov rsi,QWORD PTR [rbp-0x8] */ - for (i = 0; i < min(nr_regs, 6); i++) - emit_ldx(prog, BPF_DW, - i == 5 ? X86_REG_R9 : BPF_REG_1 + i, - BPF_REG_FP, - -(stack_size - i * 8)); + for (i = 0, j = 0; i < min(nr_args, 6); i++) { + if (m->arg_flags[i] & BTF_FMODEL_STRUCT_ARG) { + nr_regs = (m->arg_size[i] + 7) / 8; + arg_size = 8; + } else { + nr_regs = 1; + arg_size = m->arg_size[i]; + } + + while (nr_regs) { + emit_ldx(prog, bytes_to_bpf_size(arg_size), + j == 5 ? X86_REG_R9 : BPF_REG_1 + j, + BPF_REG_FP, + -(stack_size - j * 8)); + nr_regs--; + j++; + } + } } static int invoke_bpf_prog(const struct btf_func_model *m, u8 **pprog, @@ -2007,8 +2031,8 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *i struct bpf_tramp_links *tlinks, void *func_addr) { - int i, ret, nr_regs = m->nr_args, stack_size = 0; - int regs_off, nregs_off, ip_off, run_ctx_off; + int ret, i, nr_args = m->nr_args, extra_nregs = 0; + int regs_off, ip_off, args_off, stack_size = nr_args * 8, run_ctx_off; struct bpf_tramp_links *fentry = &tlinks[BPF_TRAMP_FENTRY]; struct bpf_tramp_links *fexit = &tlinks[BPF_TRAMP_FEXIT]; struct bpf_tramp_links *fmod_ret = &tlinks[BPF_TRAMP_MODIFY_RETURN]; @@ -2017,15 +2041,18 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *i u8 *prog; bool save_ret; - /* extra registers for struct arguments */ - for (i = 0; i < m->nr_args; i++) - if (m->arg_flags[i] & BTF_FMODEL_STRUCT_ARG) - nr_regs += (m->arg_size[i] + 7) / 8 - 1; - /* x86-64 supports up to 6 arguments. 7+ can be added in the future */ - if (nr_regs > 6) + if (nr_args > 6) return -ENOTSUPP; + for (i = 0; i < MAX_BPF_FUNC_ARGS; i++) { + if (m->arg_flags[i] & BTF_FMODEL_STRUCT_ARG) + extra_nregs += (m->arg_size[i] + 7) / 8 - 1; + } + if (nr_args + extra_nregs > 6) + return -ENOTSUPP; + stack_size += extra_nregs * 8; + /* Generated trampoline stack layout: * * RBP + 8 [ return address ] @@ -2038,12 +2065,11 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *i * [ ... ] * RBP - regs_off [ reg_arg1 ] program's ctx pointer * - * RBP - nregs_off [ regs count ] always + * RBP - args_off [ arg regs count ] always * * RBP - ip_off [ traced function ] BPF_TRAMP_F_IP_ARG flag * * RBP - run_ctx_off [ bpf_tramp_run_ctx ] - * RSP [ tail_call_cnt ] BPF_TRAMP_F_TAIL_CALL_CTX */ /* room for return value of orig_call or fentry prog */ @@ -2051,12 +2077,11 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *i if (save_ret) stack_size += 8; - stack_size += nr_regs * 8; regs_off = stack_size; - /* regs count */ + /* args count */ stack_size += 8; - nregs_off = stack_size; + args_off = stack_size; if (flags & BPF_TRAMP_F_IP_ARG) stack_size += 8; /* room for IP address argument */ @@ -2081,16 +2106,14 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *i EMIT1(0x55); /* push rbp */ EMIT3(0x48, 0x89, 0xE5); /* mov rbp, rsp */ EMIT4(0x48, 0x83, 0xEC, stack_size); /* sub rsp, stack_size */ - if (flags & BPF_TRAMP_F_TAIL_CALL_CTX) - EMIT1(0x50); /* push rax */ EMIT1(0x53); /* push rbx */ /* Store number of argument registers of the traced function: - * mov rax, nr_regs - * mov QWORD PTR [rbp - nregs_off], rax + * mov rax, nr_args + extra_nregs + * mov QWORD PTR [rbp - args_off], rax */ - emit_mov_imm64(&prog, BPF_REG_0, 0, (u32) nr_regs); - emit_stx(&prog, BPF_DW, BPF_REG_FP, BPF_REG_0, -nregs_off); + emit_mov_imm64(&prog, BPF_REG_0, 0, (u32) nr_args + extra_nregs); + emit_stx(&prog, BPF_DW, BPF_REG_FP, BPF_REG_0, -args_off); if (flags & BPF_TRAMP_F_IP_ARG) { /* Store IP address of the traced function: @@ -2101,7 +2124,7 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *i emit_stx(&prog, BPF_DW, BPF_REG_FP, BPF_REG_0, -ip_off); } - save_regs(m, &prog, nr_regs, regs_off); + save_regs(m, &prog, nr_args, regs_off); if (flags & BPF_TRAMP_F_CALL_ORIG) { /* arg1: mov rdi, im */ @@ -2131,17 +2154,11 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *i } if (flags & BPF_TRAMP_F_CALL_ORIG) { - restore_regs(m, &prog, nr_regs, regs_off); - - if (flags & BPF_TRAMP_F_TAIL_CALL_CTX) - /* Before calling the original function, restore the - * tail_call_cnt from stack to rax. - */ - RESTORE_TAIL_CALL_CNT(stack_size); + restore_regs(m, &prog, nr_args, regs_off); if (flags & BPF_TRAMP_F_ORIG_STACK) { - emit_ldx(&prog, BPF_DW, BPF_REG_6, BPF_REG_FP, 8); - EMIT2(0xff, 0xd3); /* call *rbx */ + emit_ldx(&prog, BPF_DW, BPF_REG_0, BPF_REG_FP, 8); + EMIT2(0xff, 0xd0); /* call *rax */ } else { /* call original function */ if (emit_call(&prog, orig_call, prog)) { @@ -2178,7 +2195,7 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *i } if (flags & BPF_TRAMP_F_RESTORE_REGS) - restore_regs(m, &prog, nr_regs, regs_off); + restore_regs(m, &prog, nr_args, regs_off); /* This needs to be done regardless. If there were fmod_ret programs, * the return value is only updated on the stack and still needs to be @@ -2192,12 +2209,7 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *i ret = -EINVAL; goto cleanup; } - } else if (flags & BPF_TRAMP_F_TAIL_CALL_CTX) - /* Before running the original function, restore the - * tail_call_cnt from stack to rax. - */ - RESTORE_TAIL_CALL_CNT(stack_size); - + } /* restore return value of orig_call or fentry prog back into RAX */ if (save_ret) emit_ldx(&prog, BPF_DW, BPF_REG_0, BPF_REG_FP, -8); diff --git a/arch/x86/xen/Kconfig b/arch/x86/xen/Kconfig index a65fc2ae15b4..9b1ec5d8c99c 100644 --- a/arch/x86/xen/Kconfig +++ b/arch/x86/xen/Kconfig @@ -9,7 +9,6 @@ config XEN select PARAVIRT_CLOCK select X86_HV_CALLBACK_VECTOR depends on X86_64 || (X86_32 && X86_PAE) - depends on X86_64 || (X86_GENERIC || MPENTIUM4 || MCORE2 || MATOM || MK8) depends on X86_LOCAL_APIC && X86_TSC help This is the Linux Xen port. Enabling this will allow the diff --git a/block/bdev.c b/block/bdev.c index ef60d9912717..87d66d16b666 100644 --- a/block/bdev.c +++ b/block/bdev.c @@ -512,8 +512,6 @@ struct block_device *bdev_alloc(struct gendisk *disk, u8 partno) void bdev_add(struct block_device *bdev, dev_t dev) { - if (bdev_stable_writes(bdev)) - mapping_set_stable_writes(bdev->bd_inode->i_mapping); bdev->bd_dev = dev; bdev->bd_inode->i_rdev = dev; bdev->bd_inode->i_ino = dev; diff --git a/block/bio.c b/block/bio.c index ec7cf6b332a3..311f3b3456a1 100644 --- a/block/bio.c +++ b/block/bio.c @@ -1112,22 +1112,13 @@ bool bio_add_folio(struct bio *bio, struct folio *folio, size_t len, void __bio_release_pages(struct bio *bio, bool mark_dirty) { - struct folio_iter fi; + struct bvec_iter_all iter_all; + struct bio_vec *bvec; - bio_for_each_folio_all(fi, bio) { - struct page *page; - size_t done = 0; - - if (mark_dirty) { - folio_lock(fi.folio); - folio_mark_dirty(fi.folio); - folio_unlock(fi.folio); - } - page = folio_page(fi.folio, fi.offset / PAGE_SIZE); - do { - folio_put(fi.folio); - done += PAGE_SIZE; - } while (done < fi.length); + bio_for_each_segment_all(bvec, bio, iter_all) { + if (mark_dirty && !PageCompound(bvec->bv_page)) + set_page_dirty_lock(bvec->bv_page); + put_page(bvec->bv_page); } } EXPORT_SYMBOL_GPL(__bio_release_pages); @@ -1426,12 +1417,12 @@ EXPORT_SYMBOL(bio_free_pages); */ void bio_set_pages_dirty(struct bio *bio) { - struct folio_iter fi; + struct bio_vec *bvec; + struct bvec_iter_all iter_all; - bio_for_each_folio_all(fi, bio) { - folio_lock(fi.folio); - folio_mark_dirty(fi.folio); - folio_unlock(fi.folio); + bio_for_each_segment_all(bvec, bio, iter_all) { + if (!PageCompound(bvec->bv_page)) + set_page_dirty_lock(bvec->bv_page); } } @@ -1474,11 +1465,12 @@ static void bio_dirty_fn(struct work_struct *work) void bio_check_pages_dirty(struct bio *bio) { - struct folio_iter fi; + struct bio_vec *bvec; unsigned long flags; + struct bvec_iter_all iter_all; - bio_for_each_folio_all(fi, bio) { - if (!folio_test_dirty(fi.folio)) + bio_for_each_segment_all(bvec, bio, iter_all) { + if (!PageDirty(bvec->bv_page) && !PageCompound(bvec->bv_page)) goto defer; } diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index 1b7fd1fc2f33..60f366f98fa2 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c @@ -462,7 +462,6 @@ static void blkg_destroy_all(struct gendisk *disk) struct request_queue *q = disk->queue; struct blkcg_gq *blkg, *n; int count = BLKG_DESTROY_BATCH_SIZE; - int i; restart: spin_lock_irq(&q->queue_lock); @@ -488,18 +487,6 @@ restart: } } - /* - * Mark policy deactivated since policy offline has been done, and - * the free is scheduled, so future blkcg_deactivate_policy() can - * be bypassed - */ - for (i = 0; i < BLKCG_MAX_POLS; i++) { - struct blkcg_policy *pol = blkcg_policy[i]; - - if (pol) - __clear_bit(pol->plid, q->blkcg_pols); - } - q->root_blkg = NULL; spin_unlock_irq(&q->queue_lock); } diff --git a/block/blk-mq.c b/block/blk-mq.c index 0e56e3e73019..c425c31e5a19 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -1501,26 +1501,14 @@ void blk_mq_delay_kick_requeue_list(struct request_queue *q, } EXPORT_SYMBOL(blk_mq_delay_kick_requeue_list); -static bool blk_is_flush_data_rq(struct request *rq) -{ - return (rq->rq_flags & RQF_FLUSH_SEQ) && !is_flush_rq(rq); -} - static bool blk_mq_rq_inflight(struct request *rq, void *priv) { /* * If we find a request that isn't idle we know the queue is busy * as it's checked in the iter. * Return false to stop the iteration. - * - * In case of queue quiesce, if one flush data request is completed, - * don't count it as inflight given the flush sequence is suspended, - * and the original flush data request is invisible to driver, just - * like other pending requests because of quiesce */ - if (blk_mq_request_started(rq) && !(blk_queue_quiesced(rq->q) && - blk_is_flush_data_rq(rq) && - blk_mq_request_completed(rq))) { + if (blk_mq_request_started(rq)) { bool *busy = priv; *busy = true; @@ -2865,9 +2853,12 @@ static struct request *blk_mq_get_new_requests(struct request_queue *q, }; struct request *rq; - if (blk_mq_attempt_bio_merge(q, bio, nsegs)) + if (unlikely(bio_queue_enter(bio))) return NULL; + if (blk_mq_attempt_bio_merge(q, bio, nsegs)) + goto queue_exit; + rq_qos_throttle(q, bio); if (plug) { @@ -2882,23 +2873,35 @@ static struct request *blk_mq_get_new_requests(struct request_queue *q, rq_qos_cleanup(q, bio); if (bio->bi_opf & REQ_NOWAIT) bio_wouldblock_error(bio); +queue_exit: + blk_queue_exit(q); return NULL; } -/* return true if this @rq can be used for @bio */ -static bool blk_mq_can_use_cached_rq(struct request *rq, struct blk_plug *plug, - struct bio *bio) +static inline struct request *blk_mq_get_cached_request(struct request_queue *q, + struct blk_plug *plug, struct bio **bio, unsigned int nsegs) { - enum hctx_type type = blk_mq_get_hctx_type(bio->bi_opf); - enum hctx_type hctx_type = rq->mq_hctx->type; + struct request *rq; + enum hctx_type type, hctx_type; - WARN_ON_ONCE(rq_list_peek(&plug->cached_rq) != rq); + if (!plug) + return NULL; + rq = rq_list_peek(&plug->cached_rq); + if (!rq || rq->q != q) + return NULL; + if (blk_mq_attempt_bio_merge(q, *bio, nsegs)) { + *bio = NULL; + return NULL; + } + + type = blk_mq_get_hctx_type((*bio)->bi_opf); + hctx_type = rq->mq_hctx->type; if (type != hctx_type && !(type == HCTX_TYPE_READ && hctx_type == HCTX_TYPE_DEFAULT)) - return false; - if (op_is_flush(rq->cmd_flags) != op_is_flush(bio->bi_opf)) - return false; + return NULL; + if (op_is_flush(rq->cmd_flags) != op_is_flush((*bio)->bi_opf)) + return NULL; /* * If any qos ->throttle() end up blocking, we will have flushed the @@ -2906,11 +2909,11 @@ static bool blk_mq_can_use_cached_rq(struct request *rq, struct blk_plug *plug, * before we throttle. */ plug->cached_rq = rq_list_next(rq); - rq_qos_throttle(rq->q, bio); + rq_qos_throttle(q, *bio); - rq->cmd_flags = bio->bi_opf; + rq->cmd_flags = (*bio)->bi_opf; INIT_LIST_HEAD(&rq->queuelist); - return true; + return rq; } static void bio_set_ioprio(struct bio *bio) @@ -2939,51 +2942,31 @@ void blk_mq_submit_bio(struct bio *bio) struct request_queue *q = bdev_get_queue(bio->bi_bdev); struct blk_plug *plug = blk_mq_plug(bio); const int is_sync = op_is_sync(bio->bi_opf); - struct request *rq = NULL; + struct request *rq; unsigned int nr_segs = 1; blk_status_t ret; bio = blk_queue_bounce(bio, q); + if (bio_may_exceed_limits(bio, &q->limits)) { + bio = __bio_split_to_limits(bio, &q->limits, &nr_segs); + if (!bio) + return; + } + + if (!bio_integrity_prep(bio)) + return; + bio_set_ioprio(bio); - if (plug) { - rq = rq_list_peek(&plug->cached_rq); - if (rq && rq->q != q) - rq = NULL; - } - if (rq) { - if (unlikely(bio_may_exceed_limits(bio, &q->limits))) { - bio = __bio_split_to_limits(bio, &q->limits, &nr_segs); - if (!bio) - return; - } - if (!bio_integrity_prep(bio)) + rq = blk_mq_get_cached_request(q, plug, &bio, nr_segs); + if (!rq) { + if (!bio) return; - if (blk_mq_attempt_bio_merge(q, bio, nr_segs)) + rq = blk_mq_get_new_requests(q, plug, bio, nr_segs); + if (unlikely(!rq)) return; - if (blk_mq_can_use_cached_rq(rq, plug, bio)) - goto done; - percpu_ref_get(&q->q_usage_counter); - } else { - if (unlikely(bio_queue_enter(bio))) - return; - if (unlikely(bio_may_exceed_limits(bio, &q->limits))) { - bio = __bio_split_to_limits(bio, &q->limits, &nr_segs); - if (!bio) - goto fail; - } - if (!bio_integrity_prep(bio)) - goto fail; } - rq = blk_mq_get_new_requests(q, plug, bio, nr_segs); - if (unlikely(!rq)) { -fail: - blk_queue_exit(q); - return; - } - -done: trace_block_getrq(bio); rq_qos_track(q, rq, bio); diff --git a/block/blk-settings.c b/block/blk-settings.c index bbca4ce77a2d..86ff375c00ce 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c @@ -135,7 +135,7 @@ void blk_queue_max_hw_sectors(struct request_queue *q, unsigned int max_hw_secto limits->max_hw_sectors = max_hw_sectors; max_sectors = min_not_zero(max_hw_sectors, limits->max_dev_sectors); - max_sectors = min(max_sectors, BLK_DEF_MAX_SECTORS); + max_sectors = min_t(unsigned int, max_sectors, BLK_DEF_MAX_SECTORS); max_sectors = round_down(max_sectors, limits->logical_block_size >> SECTOR_SHIFT); limits->max_sectors = max_sectors; diff --git a/block/blk-throttle.c b/block/blk-throttle.c index 62a3f62316df..009b0d76bf03 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c @@ -1333,7 +1333,6 @@ static void tg_conf_updated(struct throtl_grp *tg, bool global) tg_bps_limit(tg, READ), tg_bps_limit(tg, WRITE), tg_iops_limit(tg, READ), tg_iops_limit(tg, WRITE)); - rcu_read_lock(); /* * Update has_rules[] flags for the updated tg's subtree. A tg is * considered to have rules if either the tg itself or any of its @@ -1361,7 +1360,6 @@ static void tg_conf_updated(struct throtl_grp *tg, bool global) this_tg->latency_target = max(this_tg->latency_target, parent_tg->latency_target); } - rcu_read_unlock(); /* * We're already holding queue_lock and know @tg is valid. Let's diff --git a/block/fops.c b/block/fops.c index 01cb6260fa24..6197d1c41652 100644 --- a/block/fops.c +++ b/block/fops.c @@ -655,35 +655,24 @@ static long blkdev_fallocate(struct file *file, int mode, loff_t start, filemap_invalidate_lock(inode->i_mapping); - /* - * Invalidate the page cache, including dirty pages, for valid - * de-allocate mode calls to fallocate(). - */ + /* Invalidate the page cache, including dirty pages. */ + error = truncate_bdev_range(bdev, file->f_mode, start, end); + if (error) + goto fail; + switch (mode) { case FALLOC_FL_ZERO_RANGE: case FALLOC_FL_ZERO_RANGE | FALLOC_FL_KEEP_SIZE: - error = truncate_bdev_range(bdev, file->f_mode, start, end); - if (error) - goto fail; - error = blkdev_issue_zeroout(bdev, start >> SECTOR_SHIFT, len >> SECTOR_SHIFT, GFP_KERNEL, BLKDEV_ZERO_NOUNMAP); break; case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE: - error = truncate_bdev_range(bdev, file->f_mode, start, end); - if (error) - goto fail; - error = blkdev_issue_zeroout(bdev, start >> SECTOR_SHIFT, len >> SECTOR_SHIFT, GFP_KERNEL, BLKDEV_ZERO_NOFALLBACK); break; case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE | FALLOC_FL_NO_HIDE_STALE: - error = truncate_bdev_range(bdev, file->f_mode, start, end); - if (error) - goto fail; - error = blkdev_issue_discard(bdev, start >> SECTOR_SHIFT, len >> SECTOR_SHIFT, GFP_KERNEL); break; diff --git a/block/genhd.c b/block/genhd.c index e04ff2f08f39..0c00489b9731 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -446,9 +446,7 @@ int __must_check device_add_disk(struct device *parent, struct gendisk *disk, DISK_MAX_PARTS); disk->minors = DISK_MAX_PARTS; } - if (disk->first_minor > MINORMASK || - disk->minors > MINORMASK + 1 || - disk->first_minor + disk->minors > MINORMASK + 1) + if (disk->first_minor + disk->minors > MINORMASK + 1) goto out_exit_elevator; } else { if (WARN_ON(disk->minors)) @@ -571,7 +569,6 @@ out_del_integrity: out_del_block_link: if (!sysfs_deprecated) sysfs_remove_link(block_depr, dev_name(ddev)); - pm_runtime_set_memalloc_noio(ddev, false); out_device_del: device_del(ddev); out_free_ext_minor: diff --git a/block/ioctl.c b/block/ioctl.c index ebe4a2653622..3c475e4166e9 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -18,7 +18,7 @@ static int blkpg_do_ioctl(struct block_device *bdev, { struct gendisk *disk = bdev->bd_disk; struct blkpg_partition p; - sector_t start, length; + long long start, length; if (disk->flags & GENHD_FL_NO_PART) return -EINVAL; @@ -35,17 +35,14 @@ static int blkpg_do_ioctl(struct block_device *bdev, if (op == BLKPG_DEL_PARTITION) return bdev_del_partition(disk, p.pno); - if (p.start < 0 || p.length <= 0 || p.start + p.length < 0) - return -EINVAL; - /* Check that the partition is aligned to the block size */ - if (!IS_ALIGNED(p.start | p.length, bdev_logical_block_size(bdev))) - return -EINVAL; - start = p.start >> SECTOR_SHIFT; length = p.length >> SECTOR_SHIFT; switch (op) { case BLKPG_ADD_PARTITION: + /* check if partition is aligned to blocksize */ + if (p.start & (bdev_logical_block_size(bdev) - 1)) + return -EINVAL; return bdev_add_partition(disk, p.pno, start, length); case BLKPG_RESIZE_PARTITION: return bdev_resize_partition(disk, p.pno, start, length); diff --git a/build.config.db845c b/build.config.db845c index f3b2a23a52a6..8ad7ae362abc 100644 --- a/build.config.db845c +++ b/build.config.db845c @@ -7,8 +7,6 @@ FRAGMENT_CONFIG=${KERNEL_DIR}/arch/arm64/configs/db845c_gki.fragment PRE_DEFCONFIG_CMDS="KCONFIG_CONFIG=${ROOT_DIR}/${KERNEL_DIR}/arch/arm64/configs/${DEFCONFIG} ${ROOT_DIR}/${KERNEL_DIR}/scripts/kconfig/merge_config.sh -m -r ${ROOT_DIR}/${KERNEL_DIR}/arch/arm64/configs/gki_defconfig ${ROOT_DIR}/${FRAGMENT_CONFIG}" POST_DEFCONFIG_CMDS="rm ${ROOT_DIR}/${KERNEL_DIR}/arch/arm64/configs/${DEFCONFIG}" -DTC_FLAGS="${DTC_FLAGS} -@" - FILES=" arch/arm64/boot/dts/qcom/sdm845-db845c.dtb arch/arm64/boot/dts/qcom/qrb5165-rb5.dtb diff --git a/crypto/af_alg.c b/crypto/af_alg.c index fef69d2a6b18..e893c0f6c879 100644 --- a/crypto/af_alg.c +++ b/crypto/af_alg.c @@ -1045,13 +1045,9 @@ EXPORT_SYMBOL_GPL(af_alg_sendpage); void af_alg_free_resources(struct af_alg_async_req *areq) { struct sock *sk = areq->sk; - struct af_alg_ctx *ctx; af_alg_free_areq_sgls(areq); sock_kfree_s(sk, areq, areq->areqlen); - - ctx = alg_sk(sk)->private; - ctx->inflight = false; } EXPORT_SYMBOL_GPL(af_alg_free_resources); @@ -1121,19 +1117,11 @@ EXPORT_SYMBOL_GPL(af_alg_poll); struct af_alg_async_req *af_alg_alloc_areq(struct sock *sk, unsigned int areqlen) { - struct af_alg_ctx *ctx = alg_sk(sk)->private; - struct af_alg_async_req *areq; + struct af_alg_async_req *areq = sock_kmalloc(sk, areqlen, GFP_KERNEL); - /* Only one AIO request can be in flight. */ - if (ctx->inflight) - return ERR_PTR(-EBUSY); - - areq = sock_kmalloc(sk, areqlen, GFP_KERNEL); if (unlikely(!areq)) return ERR_PTR(-ENOMEM); - ctx->inflight = true; - areq->areqlen = areqlen; areq->sk = sk; areq->last_rsgl = NULL; diff --git a/crypto/scompress.c b/crypto/scompress.c index 4d6366a44400..738f4f8f0f41 100644 --- a/crypto/scompress.c +++ b/crypto/scompress.c @@ -124,7 +124,6 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir) struct crypto_scomp *scomp = *tfm_ctx; void **ctx = acomp_request_ctx(req); struct scomp_scratch *scratch; - unsigned int dlen; int ret; if (!req->src || !req->slen || req->slen > SCOMP_SCRATCH_SIZE) @@ -136,8 +135,6 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir) if (!req->dlen || req->dlen > SCOMP_SCRATCH_SIZE) req->dlen = SCOMP_SCRATCH_SIZE; - dlen = req->dlen; - scratch = raw_cpu_ptr(&scomp_scratch); spin_lock(&scratch->lock); @@ -155,9 +152,6 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir) ret = -ENOMEM; goto out; } - } else if (req->dlen > dlen) { - ret = -ENOSPC; - goto out; } scatterwalk_map_and_copy(scratch->dst, req->dst, 0, req->dlen, 1); diff --git a/drivers/acpi/acpi_extlog.c b/drivers/acpi/acpi_extlog.c index 088db2356998..e648158368a7 100644 --- a/drivers/acpi/acpi_extlog.c +++ b/drivers/acpi/acpi_extlog.c @@ -145,14 +145,9 @@ static int extlog_print(struct notifier_block *nb, unsigned long val, static u32 err_seq; estatus = extlog_elog_entry_check(cpu, bank); - if (!estatus) + if (estatus == NULL || (mce->kflags & MCE_HANDLED_CEC)) return NOTIFY_DONE; - if (mce->kflags & MCE_HANDLED_CEC) { - estatus->block_status = 0; - return NOTIFY_DONE; - } - memcpy(elog_buf, (void *)estatus, ELOG_ENTRY_LEN); /* clear record status to enable BIOS to update it again */ estatus->block_status = 0; diff --git a/drivers/acpi/acpi_lpit.c b/drivers/acpi/acpi_lpit.c index 2c015ecf7185..50540d4d4948 100644 --- a/drivers/acpi/acpi_lpit.c +++ b/drivers/acpi/acpi_lpit.c @@ -98,7 +98,7 @@ static void lpit_update_residency(struct lpit_residency_info *info, struct acpi_lpit_native *lpit_native) { info->frequency = lpit_native->counter_frequency ? - lpit_native->counter_frequency : mul_u32_u32(tsc_khz, 1000U); + lpit_native->counter_frequency : tsc_khz * 1000; if (!info->frequency) info->frequency = 1; diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c index 8b44743945c8..f08ffa75f4a7 100644 --- a/drivers/acpi/acpi_lpss.c +++ b/drivers/acpi/acpi_lpss.c @@ -450,9 +450,8 @@ static int register_device_clock(struct acpi_device *adev, if (!clk_name) return -ENOMEM; clk = clk_register_fractional_divider(NULL, clk_name, parent, - 0, prv_base, 1, 15, 16, 15, CLK_FRAC_DIVIDER_POWER_OF_TWO_PS, - NULL); + prv_base, 1, 15, 16, 15, 0, NULL); parent = clk_name; clk_name = kasprintf(GFP_KERNEL, "%s-update", devname); diff --git a/drivers/acpi/acpi_video.c b/drivers/acpi/acpi_video.c index f7852fb75ab3..ed318485eb19 100644 --- a/drivers/acpi/acpi_video.c +++ b/drivers/acpi/acpi_video.c @@ -1726,12 +1726,12 @@ static void acpi_video_dev_register_backlight(struct acpi_video_device *device) return; count++; - if (ACPI_SUCCESS(acpi_get_parent(device->dev->handle, &acpi_parent))) { - pdev = acpi_get_pci_dev(acpi_parent); - if (pdev) { - parent = &pdev->dev; - pci_dev_put(pdev); - } + acpi_get_parent(device->dev->handle, &acpi_parent); + + pdev = acpi_get_pci_dev(acpi_parent); + if (pdev) { + parent = &pdev->dev; + pci_dev_put(pdev); } memset(&props, 0, sizeof(struct backlight_properties)); diff --git a/drivers/acpi/property.c b/drivers/acpi/property.c index 62aee900af3d..0565c18c2ee3 100644 --- a/drivers/acpi/property.c +++ b/drivers/acpi/property.c @@ -851,7 +851,6 @@ static int acpi_get_ref_args(struct fwnode_reference_args *args, * @index: Index of the reference to return * @num_args: Maximum number of arguments after each reference * @args: Location to store the returned reference with optional arguments - * (may be NULL) * * Find property with @name, verifify that it is a package containing at least * one object reference and if so, store the ACPI device object pointer to the @@ -908,9 +907,6 @@ int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode, if (!device) return -EINVAL; - if (!args) - return 0; - args->fwnode = acpi_fwnode_handle(device); args->nargs = 0; return 0; diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c index 5ebeb0d7b6be..c297e40c5bdc 100644 --- a/drivers/acpi/resource.c +++ b/drivers/acpi/resource.c @@ -512,13 +512,6 @@ static const struct dmi_system_id maingear_laptop[] = { DMI_MATCH(DMI_BOARD_NAME, "GMxXGxx"), }, }, - { - /* TongFang GMxXGxx sold as Eluktronics Inc. RP-15 */ - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Eluktronics Inc."), - DMI_MATCH(DMI_BOARD_NAME, "RP-15"), - }, - }, { /* TongFang GM6XGxX/TUXEDO Stellaris 16 Gen5 AMD */ .matches = { diff --git a/drivers/android/binder.c b/drivers/android/binder.c index e968191c07be..cc6c9ceca866 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -5278,7 +5278,7 @@ static __poll_t binder_poll(struct file *filp, thread = binder_get_thread(proc); if (!thread) - return EPOLLERR; + return POLLERR; binder_inner_proc_lock(thread->proc); thread->looper |= BINDER_LOOPER_STATE_POLL; diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c index 353aa683869c..ac6b68aaea09 100644 --- a/drivers/android/binder_alloc.c +++ b/drivers/android/binder_alloc.c @@ -272,7 +272,7 @@ static int binder_update_page_range(struct binder_alloc *alloc, int allocate, } if (mm) { mmap_write_unlock(mm); - mmput_async(mm); + mmput(mm); } return 0; @@ -305,7 +305,7 @@ err_page_ptr_cleared: err_no_vma: if (mm) { mmap_write_unlock(mm); - mmput_async(mm); + mmput(mm); } return vma ? -ENOMEM : -ESRCH; } @@ -345,7 +345,8 @@ static bool debug_low_async_space_locked(struct binder_alloc *alloc, int pid) continue; if (!buffer->async_transaction) continue; - total_alloc_size += binder_alloc_buffer_size(alloc, buffer); + total_alloc_size += binder_alloc_buffer_size(alloc, buffer) + + sizeof(struct binder_buffer); num_buffers++; } @@ -408,26 +409,25 @@ static struct binder_buffer *binder_alloc_new_buf_locked( alloc->pid, extra_buffers_size); return ERR_PTR(-EINVAL); } - trace_android_vh_binder_alloc_new_buf_locked(size, &alloc->free_async_space, is_async); - trace_android_vh_binder_detect_low_async_space_locked(is_async, &alloc->free_async_space, pid, &should_fail); - if (should_fail) { - binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: binder_alloc_buf size %zd failed, not allowed to alloc more async space\n", - alloc->pid, size); - return ERR_PTR(-EPERM); - } - - /* Pad 0-size buffers so they get assigned unique addresses */ - size = max(size, sizeof(void *)); - - if (is_async && alloc->free_async_space < size) { + trace_android_vh_binder_detect_low_async_space_locked(is_async, &alloc->free_async_space, pid, &should_fail); + if (should_fail) { + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: binder_alloc_buf size %zd failed, not allowed to alloc more async space\n", + alloc->pid, size); + return ERR_PTR(-EPERM); + } + if (is_async && + alloc->free_async_space < size + sizeof(struct binder_buffer)) { binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, "%d: binder_alloc_buf size %zd failed, no async space left\n", alloc->pid, size); return ERR_PTR(-ENOSPC); } + /* Pad 0-size buffers so they get assigned unique addresses */ + size = max(size, sizeof(void *)); + while (n) { buffer = rb_entry(n, struct binder_buffer, rb_node); BUG_ON(!buffer->free); @@ -529,7 +529,7 @@ static struct binder_buffer *binder_alloc_new_buf_locked( buffer->pid = pid; buffer->oneway_spam_suspect = false; if (is_async) { - alloc->free_async_space -= size; + alloc->free_async_space -= size + sizeof(struct binder_buffer); binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC, "%d: binder_alloc_buf size %zd async free %zd\n", alloc->pid, size, alloc->free_async_space); @@ -567,7 +567,7 @@ err_alloc_buf_struct_failed: * is the sum of the three given sizes (each rounded up to * pointer-sized boundary) * - * Return: The allocated buffer or %ERR_PTR(-errno) if error + * Return: The allocated buffer or %NULL if error */ struct binder_buffer *binder_alloc_new_buf(struct binder_alloc *alloc, size_t data_size, @@ -667,7 +667,8 @@ static void binder_free_buf_locked(struct binder_alloc *alloc, BUG_ON(buffer->user_data > alloc->buffer + alloc->buffer_size); if (buffer->async_transaction) { - alloc->free_async_space += buffer_size; + alloc->free_async_space += buffer_size + sizeof(struct binder_buffer); + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC, "%d: binder_free_buf size %zd async free %zd\n", alloc->pid, size, alloc->free_async_space); @@ -715,7 +716,7 @@ void binder_alloc_free_buf(struct binder_alloc *alloc, /* * We could eliminate the call to binder_alloc_clear_buf() * from binder_alloc_deferred_release() by moving this to - * binder_free_buf_locked(). However, that could + * binder_alloc_free_buf_locked(). However, that could * increase contention for the alloc mutex if clear_on_free * is used frequently for large buffers. The mutex is not * needed for correctness here. @@ -1014,9 +1015,7 @@ enum lru_status binder_alloc_free_page(struct list_head *item, goto err_mmget; if (!mmap_read_trylock(mm)) goto err_mmap_read_lock_failed; - vma = vma_lookup(mm, page_addr); - if (vma && vma != binder_alloc_get_vma(alloc)) - goto err_invalid_vma; + vma = binder_alloc_get_vma(alloc); list_lru_isolate(lru, item); spin_unlock(lock); @@ -1042,8 +1041,6 @@ enum lru_status binder_alloc_free_page(struct list_head *item, mutex_unlock(&alloc->mutex); return LRU_REMOVED_RETRY; -err_invalid_vma: - mmap_read_unlock(mm); err_mmap_read_lock_failed: mmput_async(mm); err_mmget: diff --git a/drivers/atm/solos-pci.c b/drivers/atm/solos-pci.c index d3c30a28c410..94fbc3abe60e 100644 --- a/drivers/atm/solos-pci.c +++ b/drivers/atm/solos-pci.c @@ -449,9 +449,9 @@ static ssize_t console_show(struct device *dev, struct device_attribute *attr, struct sk_buff *skb; unsigned int len; - spin_lock_bh(&card->cli_queue_lock); + spin_lock(&card->cli_queue_lock); skb = skb_dequeue(&card->cli_queue[SOLOS_CHAN(atmdev)]); - spin_unlock_bh(&card->cli_queue_lock); + spin_unlock(&card->cli_queue_lock); if(skb == NULL) return sprintf(buf, "No data.\n"); @@ -956,14 +956,14 @@ static void pclose(struct atm_vcc *vcc) struct pkt_hdr *header; /* Remove any yet-to-be-transmitted packets from the pending queue */ - spin_lock_bh(&card->tx_queue_lock); + spin_lock(&card->tx_queue_lock); skb_queue_walk_safe(&card->tx_queue[port], skb, tmpskb) { if (SKB_CB(skb)->vcc == vcc) { skb_unlink(skb, &card->tx_queue[port]); solos_pop(vcc, skb); } } - spin_unlock_bh(&card->tx_queue_lock); + spin_unlock(&card->tx_queue_lock); skb = alloc_skb(sizeof(*header), GFP_KERNEL); if (!skb) { diff --git a/drivers/base/memory.c b/drivers/base/memory.c index 5d39f3e374da..9aa0da991cfb 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c @@ -175,9 +175,6 @@ int memory_notify(unsigned long val, void *v) return blocking_notifier_call_chain(&memory_chain, val, v); } -/* - * Must acquire mem_hotplug_lock in write mode. - */ static int memory_block_online(struct memory_block *mem) { unsigned long start_pfn = section_nr_to_pfn(mem->start_section_nr); @@ -196,11 +193,10 @@ static int memory_block_online(struct memory_block *mem) * stage helps to keep accounting easier to follow - e.g vmemmaps * belong to the same zone as the memory they backed. */ - mem_hotplug_begin(); if (nr_vmemmap_pages) { ret = mhp_init_memmap_on_memory(start_pfn, nr_vmemmap_pages, zone); if (ret) - goto out; + return ret; } ret = online_pages(start_pfn + nr_vmemmap_pages, @@ -208,7 +204,7 @@ static int memory_block_online(struct memory_block *mem) if (ret) { if (nr_vmemmap_pages) mhp_deinit_memmap_on_memory(start_pfn, nr_vmemmap_pages); - goto out; + return ret; } /* @@ -220,14 +216,9 @@ static int memory_block_online(struct memory_block *mem) nr_vmemmap_pages); mem->zone = zone; -out: - mem_hotplug_done(); return ret; } -/* - * Must acquire mem_hotplug_lock in write mode. - */ static int memory_block_offline(struct memory_block *mem) { unsigned long start_pfn = section_nr_to_pfn(mem->start_section_nr); @@ -242,7 +233,6 @@ static int memory_block_offline(struct memory_block *mem) * Unaccount before offlining, such that unpopulated zone and kthreads * can properly be torn down in offline_pages(). */ - mem_hotplug_begin(); if (nr_vmemmap_pages) adjust_present_page_count(pfn_to_page(start_pfn), mem->group, -nr_vmemmap_pages); @@ -254,15 +244,13 @@ static int memory_block_offline(struct memory_block *mem) if (nr_vmemmap_pages) adjust_present_page_count(pfn_to_page(start_pfn), mem->group, nr_vmemmap_pages); - goto out; + return ret; } if (nr_vmemmap_pages) mhp_deinit_memmap_on_memory(start_pfn, nr_vmemmap_pages); mem->zone = NULL; -out: - mem_hotplug_done(); return ret; } diff --git a/drivers/base/node.c b/drivers/base/node.c index a4141b57b147..faf3597a96da 100644 --- a/drivers/base/node.c +++ b/drivers/base/node.c @@ -859,15 +859,11 @@ int __register_one_node(int nid) { int error; int cpu; - struct node *node; - node = kzalloc(sizeof(struct node), GFP_KERNEL); - if (!node) + node_devices[nid] = kzalloc(sizeof(struct node), GFP_KERNEL); + if (!node_devices[nid]) return -ENOMEM; - INIT_LIST_HEAD(&node->access_list); - node_devices[nid] = node; - error = register_node(node_devices[nid], nid); /* link cpu under this node */ @@ -876,6 +872,7 @@ int __register_one_node(int nid) register_cpu_under_node(cpu, nid); } + INIT_LIST_HEAD(&node_devices[nid]->access_list); node_init_caches(nid); return error; diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c index 44153caa893a..0a482212c7e8 100644 --- a/drivers/base/swnode.c +++ b/drivers/base/swnode.c @@ -541,9 +541,6 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode, if (nargs > NR_FWNODE_REFERENCE_ARGS) return -EINVAL; - if (!args) - return 0; - args->fwnode = software_node_get(refnode); args->nargs = nargs; diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 12ff6f58b8a9..426d0b42685a 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -165,37 +165,39 @@ static loff_t get_loop_size(struct loop_device *lo, struct file *file) return get_size(lo->lo_offset, lo->lo_sizelimit, file); } -/* - * We support direct I/O only if lo_offset is aligned with the logical I/O size - * of backing device, and the logical block size of loop is bigger than that of - * the backing device. - */ -static bool lo_bdev_can_use_dio(struct loop_device *lo, - struct block_device *backing_bdev) -{ - unsigned short sb_bsize = bdev_logical_block_size(backing_bdev); - - if (queue_logical_block_size(lo->lo_queue) < sb_bsize) - return false; - if (lo->lo_offset & (sb_bsize - 1)) - return false; - return true; -} - static void __loop_update_dio(struct loop_device *lo, bool dio) { struct file *file = lo->lo_backing_file; - struct inode *inode = file->f_mapping->host; - struct block_device *backing_bdev = NULL; + struct address_space *mapping = file->f_mapping; + struct inode *inode = mapping->host; + unsigned short sb_bsize = 0; + unsigned dio_align = 0; bool use_dio; - if (S_ISBLK(inode->i_mode)) - backing_bdev = I_BDEV(inode); - else if (inode->i_sb->s_bdev) - backing_bdev = inode->i_sb->s_bdev; + if (inode->i_sb->s_bdev) { + sb_bsize = bdev_logical_block_size(inode->i_sb->s_bdev); + dio_align = sb_bsize - 1; + } - use_dio = dio && (file->f_mode & FMODE_CAN_ODIRECT) && - (!backing_bdev || lo_bdev_can_use_dio(lo, backing_bdev)); + /* + * We support direct I/O only if lo_offset is aligned with the + * logical I/O size of backing device, and the logical block + * size of loop is bigger than the backing device's. + * + * TODO: the above condition may be loosed in the future, and + * direct I/O may be switched runtime at that time because most + * of requests in sane applications should be PAGE_SIZE aligned + */ + if (dio) { + if (queue_logical_block_size(lo->lo_queue) >= sb_bsize && + !(lo->lo_offset & dio_align) && + (file->f_mode & FMODE_CAN_ODIRECT)) + use_dio = true; + else + use_dio = false; + } else { + use_dio = false; + } if (lo->use_dio == use_dio) return; @@ -1775,43 +1777,14 @@ static const struct block_device_operations lo_fops = { /* * If max_loop is specified, create that many devices upfront. * This also becomes a hard limit. If max_loop is not specified, - * the default isn't a hard limit (as before commit 85c50197716c - * changed the default value from 0 for max_loop=0 reasons), just * create CONFIG_BLK_DEV_LOOP_MIN_COUNT loop devices at module * init time. Loop devices can be requested on-demand with the * /dev/loop-control interface, or be instantiated by accessing * a 'dead' device node. */ static int max_loop = CONFIG_BLK_DEV_LOOP_MIN_COUNT; - -#ifdef CONFIG_BLOCK_LEGACY_AUTOLOAD -static bool max_loop_specified; - -static int max_loop_param_set_int(const char *val, - const struct kernel_param *kp) -{ - int ret; - - ret = param_set_int(val, kp); - if (ret < 0) - return ret; - - max_loop_specified = true; - return 0; -} - -static const struct kernel_param_ops max_loop_param_ops = { - .set = max_loop_param_set_int, - .get = param_get_int, -}; - -module_param_cb(max_loop, &max_loop_param_ops, &max_loop, 0444); -MODULE_PARM_DESC(max_loop, "Maximum number of loop devices"); -#else module_param(max_loop, int, 0444); -MODULE_PARM_DESC(max_loop, "Initial number of loop devices"); -#endif - +MODULE_PARM_DESC(max_loop, "Maximum number of loop devices"); module_param(max_part, int, 0444); MODULE_PARM_DESC(max_part, "Maximum number of partitions per loop device"); @@ -2116,18 +2089,14 @@ static void loop_remove(struct loop_device *lo) put_disk(lo->lo_disk); } -#ifdef CONFIG_BLOCK_LEGACY_AUTOLOAD static void loop_probe(dev_t dev) { int idx = MINOR(dev) >> part_shift; - if (max_loop_specified && max_loop && idx >= max_loop) + if (max_loop && idx >= max_loop) return; loop_add(idx); } -#else -#define loop_probe NULL -#endif /* !CONFIG_BLOCK_LEGACY_AUTOLOAD */ static int loop_control_remove(int idx) { @@ -2308,9 +2277,6 @@ module_exit(loop_exit); static int __init max_loop_setup(char *str) { max_loop = simple_strtol(str, NULL, 0); -#ifdef CONFIG_BLOCK_LEGACY_AUTOLOAD - max_loop_specified = true; -#endif return 1; } diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 8037aaefeb2e..e94d2ff6b122 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -67,7 +67,6 @@ struct nbd_sock { struct recv_thread_args { struct work_struct work; struct nbd_device *nbd; - struct nbd_sock *nsock; int index; }; @@ -490,9 +489,15 @@ done: return BLK_EH_DONE; } -static int __sock_xmit(struct nbd_device *nbd, struct socket *sock, int send, - struct iov_iter *iter, int msg_flags, int *sent) +/* + * Send or receive packet. Return a positive value on success and + * negtive value on failue, and never return 0. + */ +static int sock_xmit(struct nbd_device *nbd, int index, int send, + struct iov_iter *iter, int msg_flags, int *sent) { + struct nbd_config *config = nbd->config; + struct socket *sock = config->socks[index]->sock; int result; struct msghdr msg; unsigned int noreclaim_flag; @@ -534,19 +539,6 @@ static int __sock_xmit(struct nbd_device *nbd, struct socket *sock, int send, return result; } -/* - * Send or receive packet. Return a positive value on success and - * negtive value on failure, and never return 0. - */ -static int sock_xmit(struct nbd_device *nbd, int index, int send, - struct iov_iter *iter, int msg_flags, int *sent) -{ - struct nbd_config *config = nbd->config; - struct socket *sock = config->socks[index]->sock; - - return __sock_xmit(nbd, sock, send, iter, msg_flags, sent); -} - /* * Different settings for sk->sk_sndtimeo can result in different return values * if there is a signal pending when we enter sendmsg, because reasons? @@ -703,7 +695,7 @@ out: return 0; } -static int nbd_read_reply(struct nbd_device *nbd, struct socket *sock, +static int nbd_read_reply(struct nbd_device *nbd, int index, struct nbd_reply *reply) { struct kvec iov = {.iov_base = reply, .iov_len = sizeof(*reply)}; @@ -712,7 +704,7 @@ static int nbd_read_reply(struct nbd_device *nbd, struct socket *sock, reply->magic = 0; iov_iter_kvec(&to, ITER_DEST, &iov, 1, sizeof(*reply)); - result = __sock_xmit(nbd, sock, 0, &to, MSG_WAITALL, NULL); + result = sock_xmit(nbd, index, 0, &to, MSG_WAITALL, NULL); if (result < 0) { if (!nbd_disconnected(nbd->config)) dev_err(disk_to_dev(nbd->disk), @@ -836,14 +828,14 @@ static void recv_work(struct work_struct *work) struct nbd_device *nbd = args->nbd; struct nbd_config *config = nbd->config; struct request_queue *q = nbd->disk->queue; - struct nbd_sock *nsock = args->nsock; + struct nbd_sock *nsock; struct nbd_cmd *cmd; struct request *rq; while (1) { struct nbd_reply reply; - if (nbd_read_reply(nbd, nsock->sock, &reply)) + if (nbd_read_reply(nbd, args->index, &reply)) break; /* @@ -878,6 +870,7 @@ static void recv_work(struct work_struct *work) percpu_ref_put(&q->q_usage_counter); } + nsock = config->socks[args->index]; mutex_lock(&nsock->tx_lock); nbd_mark_nsock_dead(nbd, nsock, 1); mutex_unlock(&nsock->tx_lock); @@ -1221,7 +1214,6 @@ static int nbd_reconnect_socket(struct nbd_device *nbd, unsigned long arg) INIT_WORK(&args->work, recv_work); args->index = i; args->nbd = nbd; - args->nsock = nsock; nsock->cookie++; mutex_unlock(&nsock->tx_lock); sockfd_put(old); @@ -1404,7 +1396,6 @@ static int nbd_start_device(struct nbd_device *nbd) refcount_inc(&nbd->config_refs); INIT_WORK(&args->work, recv_work); args->nbd = nbd; - args->nsock = config->socks[i]; args->index = i; queue_work(nbd->recv_workq, &args->work); } @@ -1539,20 +1530,17 @@ static int nbd_ioctl(struct block_device *bdev, fmode_t mode, return error; } -static int nbd_alloc_and_init_config(struct nbd_device *nbd) +static struct nbd_config *nbd_alloc_config(void) { struct nbd_config *config; - if (WARN_ON(nbd->config)) - return -EINVAL; - if (!try_module_get(THIS_MODULE)) - return -ENODEV; + return ERR_PTR(-ENODEV); config = kzalloc(sizeof(struct nbd_config), GFP_NOFS); if (!config) { module_put(THIS_MODULE); - return -ENOMEM; + return ERR_PTR(-ENOMEM); } atomic_set(&config->recv_threads, 0); @@ -1560,10 +1548,7 @@ static int nbd_alloc_and_init_config(struct nbd_device *nbd) init_waitqueue_head(&config->conn_wait); config->blksize_bits = NBD_DEF_BLKSIZE_BITS; atomic_set(&config->live_connections, 0); - nbd->config = config; - refcount_set(&nbd->config_refs, 1); - - return 0; + return config; } static int nbd_open(struct block_device *bdev, fmode_t mode) @@ -1582,17 +1567,21 @@ static int nbd_open(struct block_device *bdev, fmode_t mode) goto out; } if (!refcount_inc_not_zero(&nbd->config_refs)) { + struct nbd_config *config; + mutex_lock(&nbd->config_lock); if (refcount_inc_not_zero(&nbd->config_refs)) { mutex_unlock(&nbd->config_lock); goto out; } - ret = nbd_alloc_and_init_config(nbd); - if (ret) { + config = nbd_alloc_config(); + if (IS_ERR(config)) { + ret = PTR_ERR(config); mutex_unlock(&nbd->config_lock); goto out; } - + nbd->config = config; + refcount_set(&nbd->config_refs, 1); refcount_inc(&nbd->refs); mutex_unlock(&nbd->config_lock); if (max_part) @@ -2001,17 +1990,22 @@ again: pr_err("nbd%d already in use\n", index); return -EBUSY; } - - ret = nbd_alloc_and_init_config(nbd); - if (ret) { + if (WARN_ON(nbd->config)) { + mutex_unlock(&nbd->config_lock); + nbd_put(nbd); + return -EINVAL; + } + config = nbd_alloc_config(); + if (IS_ERR(config)) { mutex_unlock(&nbd->config_lock); nbd_put(nbd); pr_err("couldn't allocate config\n"); - return ret; + return PTR_ERR(config); } - - config = nbd->config; + nbd->config = config; + refcount_set(&nbd->config_refs, 1); set_bit(NBD_RT_BOUND, &config->runtime_flags); + ret = nbd_genl_size_set(info, nbd); if (ret) goto out; diff --git a/drivers/block/null_blk/main.c b/drivers/block/null_blk/main.c index 959952e8ede3..e9f38eba2f13 100644 --- a/drivers/block/null_blk/main.c +++ b/drivers/block/null_blk/main.c @@ -2114,8 +2114,11 @@ static int null_add_dev(struct nullb_device *dev) blk_queue_logical_block_size(nullb->q, dev->blocksize); blk_queue_physical_block_size(nullb->q, dev->blocksize); - if (dev->max_sectors) - blk_queue_max_hw_sectors(nullb->q, dev->max_sectors); + if (!dev->max_sectors) + dev->max_sectors = queue_max_hw_sectors(nullb->q); + dev->max_sectors = min_t(unsigned int, dev->max_sectors, + BLK_DEF_MAX_SECTORS); + blk_queue_max_hw_sectors(nullb->q, dev->max_sectors); if (dev->virt_boundary) blk_queue_virt_boundary(nullb->q, PAGE_SIZE - 1); @@ -2215,6 +2218,12 @@ static int __init null_init(void) g_bs = PAGE_SIZE; } + if (g_max_sectors > BLK_DEF_MAX_SECTORS) { + pr_warn("invalid max sectors\n"); + pr_warn("defaults max sectors to %u\n", BLK_DEF_MAX_SECTORS); + g_max_sectors = BLK_DEF_MAX_SECTORS; + } + if (g_home_node != NUMA_NO_NODE && g_home_node >= nr_online_nodes) { pr_err("invalid home_node value\n"); g_home_node = NUMA_NO_NODE; diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 3fa74051f31b..c2f0f74193f0 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -103,9 +103,6 @@ struct ublk_uring_cmd_pdu { */ #define UBLK_IO_FLAG_NEED_GET_DATA 0x08 -/* atomic RW with ubq->cancel_lock */ -#define UBLK_IO_FLAG_CANCELED 0x80000000 - struct ublk_io { /* userspace buffer address from io cmd */ __u64 addr; @@ -129,7 +126,6 @@ struct ublk_queue { unsigned int max_io_sz; bool force_abort; unsigned short nr_io_ready; /* how many ios setup */ - spinlock_t cancel_lock; struct ublk_device *dev; struct ublk_io ios[]; }; @@ -1049,28 +1045,28 @@ static inline bool ublk_queue_ready(struct ublk_queue *ubq) return ubq->nr_io_ready == ubq->q_depth; } +static void ublk_cmd_cancel_cb(struct io_uring_cmd *cmd, unsigned issue_flags) +{ + io_uring_cmd_done(cmd, UBLK_IO_RES_ABORT, 0, issue_flags); +} + static void ublk_cancel_queue(struct ublk_queue *ubq) { int i; + if (!ublk_queue_ready(ubq)) + return; + for (i = 0; i < ubq->q_depth; i++) { struct ublk_io *io = &ubq->ios[i]; - if (io->flags & UBLK_IO_FLAG_ACTIVE) { - bool done; - - spin_lock(&ubq->cancel_lock); - done = !!(io->flags & UBLK_IO_FLAG_CANCELED); - if (!done) - io->flags |= UBLK_IO_FLAG_CANCELED; - spin_unlock(&ubq->cancel_lock); - - if (!done) - io_uring_cmd_done(io->cmd, - UBLK_IO_RES_ABORT, 0, - IO_URING_F_UNLOCKED); - } + if (io->flags & UBLK_IO_FLAG_ACTIVE) + io_uring_cmd_complete_in_task(io->cmd, + ublk_cmd_cancel_cb); } + + /* all io commands are canceled */ + ubq->nr_io_ready = 0; } /* Cancel all pending commands, must be called after del_gendisk() returns */ @@ -1117,6 +1113,7 @@ static void __ublk_quiesce_dev(struct ublk_device *ub) blk_mq_quiesce_queue(ub->ub_disk->queue); ublk_wait_tagset_rqs_idle(ub); ub->dev_info.state = UBLK_S_DEV_QUIESCED; + ublk_cancel_dev(ub); /* we are going to release task_struct of ubq_daemon and resets * ->ubq_daemon to NULL. So in monitor_work, check on ubq_daemon causes UAF. * Besides, monitor_work is not necessary in QUIESCED state since we have @@ -1139,7 +1136,6 @@ static void ublk_quiesce_work_fn(struct work_struct *work) __ublk_quiesce_dev(ub); unlock: mutex_unlock(&ub->mutex); - ublk_cancel_dev(ub); } static void ublk_unquiesce_dev(struct ublk_device *ub) @@ -1179,8 +1175,8 @@ static void ublk_stop_dev(struct ublk_device *ub) put_disk(ub->ub_disk); ub->ub_disk = NULL; unlock: - mutex_unlock(&ub->mutex); ublk_cancel_dev(ub); + mutex_unlock(&ub->mutex); cancel_delayed_work_sync(&ub->monitor_work); } @@ -1357,7 +1353,6 @@ static int ublk_init_queue(struct ublk_device *ub, int q_id) void *ptr; int size; - spin_lock_init(&ubq->cancel_lock); ubq->flags = ub->dev_info.flags; ubq->q_id = q_id; ubq->q_depth = ub->dev_info.queue_depth; @@ -1887,9 +1882,8 @@ static void ublk_queue_reinit(struct ublk_device *ub, struct ublk_queue *ubq) int i; WARN_ON_ONCE(!(ubq->ubq_daemon && ubq_daemon_is_dying(ubq))); - /* All old ioucmds have to be completed */ - ubq->nr_io_ready = 0; + WARN_ON_ONCE(ubq->nr_io_ready); /* old daemon is PF_EXITING, put it now */ put_task_struct(ubq->ubq_daemon); /* We have to reset it to NULL, otherwise ub won't accept new FETCH_REQ */ diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 3124837aa406..efa5535a8e1d 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c @@ -609,12 +609,12 @@ static void virtblk_config_changed(struct virtio_device *vdev) static int init_vq(struct virtio_blk *vblk) { int err; - unsigned short i; + int i; vq_callback_t **callbacks; const char **names; struct virtqueue **vqs; unsigned short num_vqs; - unsigned short num_poll_vqs; + unsigned int num_poll_vqs; struct virtio_device *vdev = vblk->vdev; struct irq_affinity desc = { 0, }; @@ -658,13 +658,13 @@ static int init_vq(struct virtio_blk *vblk) for (i = 0; i < num_vqs - num_poll_vqs; i++) { callbacks[i] = virtblk_done; - snprintf(vblk->vqs[i].name, VQ_NAME_LEN, "req.%u", i); + snprintf(vblk->vqs[i].name, VQ_NAME_LEN, "req.%d", i); names[i] = vblk->vqs[i].name; } for (; i < num_vqs; i++) { callbacks[i] = NULL; - snprintf(vblk->vqs[i].name, VQ_NAME_LEN, "req_poll.%u", i); + snprintf(vblk->vqs[i].name, VQ_NAME_LEN, "req_poll.%d", i); names[i] = vblk->vqs[i].name; } diff --git a/drivers/bluetooth/btmtkuart.c b/drivers/bluetooth/btmtkuart.c index 04b72394dda5..c98691cdbbd5 100644 --- a/drivers/bluetooth/btmtkuart.c +++ b/drivers/bluetooth/btmtkuart.c @@ -337,7 +337,7 @@ mtk_stp_split(struct btmtkuart_dev *bdev, const unsigned char *data, int count, return data; } -static void btmtkuart_recv(struct hci_dev *hdev, const u8 *data, size_t count) +static int btmtkuart_recv(struct hci_dev *hdev, const u8 *data, size_t count) { struct btmtkuart_dev *bdev = hci_get_drvdata(hdev); const unsigned char *p_left = data, *p_h4; @@ -376,20 +376,25 @@ static void btmtkuart_recv(struct hci_dev *hdev, const u8 *data, size_t count) bt_dev_err(bdev->hdev, "Frame reassembly failed (%d)", err); bdev->rx_skb = NULL; - return; + return err; } sz_left -= sz_h4; p_left += sz_h4; } + + return 0; } static int btmtkuart_receive_buf(struct serdev_device *serdev, const u8 *data, size_t count) { struct btmtkuart_dev *bdev = serdev_device_get_drvdata(serdev); + int err; - btmtkuart_recv(bdev->hdev, data, count); + err = btmtkuart_recv(bdev->hdev, data, count); + if (err < 0) + return err; bdev->hdev->stat.byte_rx += count; diff --git a/drivers/bluetooth/hci_vhci.c b/drivers/bluetooth/hci_vhci.c index 44dc91555aa0..4415d850d698 100644 --- a/drivers/bluetooth/hci_vhci.c +++ b/drivers/bluetooth/hci_vhci.c @@ -11,7 +11,6 @@ #include #include -#include #include #include #include @@ -45,7 +44,6 @@ struct vhci_data { bool wakeup; __u16 msft_opcode; bool aosp_capable; - atomic_t initialized; }; static int vhci_open_dev(struct hci_dev *hdev) @@ -77,10 +75,11 @@ static int vhci_send_frame(struct hci_dev *hdev, struct sk_buff *skb) memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1); + mutex_lock(&data->open_mutex); skb_queue_tail(&data->readq, skb); + mutex_unlock(&data->open_mutex); - if (atomic_read(&data->initialized)) - wake_up_interruptible(&data->read_wait); + wake_up_interruptible(&data->read_wait); return 0; } @@ -364,8 +363,7 @@ static int __vhci_create_device(struct vhci_data *data, __u8 opcode) skb_put_u8(skb, 0xff); skb_put_u8(skb, opcode); put_unaligned_le16(hdev->id, skb_put(skb, 2)); - skb_queue_head(&data->readq, skb); - atomic_inc(&data->initialized); + skb_queue_tail(&data->readq, skb); wake_up_interruptible(&data->read_wait); return 0; diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c index 15c6b85b125d..59a2fe2448f1 100644 --- a/drivers/bus/ti-sysc.c +++ b/drivers/bus/ti-sysc.c @@ -2174,23 +2174,13 @@ static int sysc_reset(struct sysc *ddata) sysc_val = sysc_read_sysconfig(ddata); sysc_val |= sysc_mask; sysc_write(ddata, sysc_offset, sysc_val); - - /* - * Some devices need a delay before reading registers - * after reset. Presumably a srst_udelay is not needed - * for devices that use a rstctrl register reset. - */ - if (ddata->cfg.srst_udelay) - fsleep(ddata->cfg.srst_udelay); - - /* - * Flush posted write. For devices needing srst_udelay - * this should trigger an interconnect error if the - * srst_udelay value is needed but not configured. - */ + /* Flush posted write */ sysc_val = sysc_read_sysconfig(ddata); } + if (ddata->cfg.srst_udelay) + fsleep(ddata->cfg.srst_udelay); + if (ddata->post_reset_quirk) ddata->post_reset_quirk(ddata); diff --git a/drivers/clk/clk-si5341.c b/drivers/clk/clk-si5341.c index 5acb35236c58..c7d8cbd22bac 100644 --- a/drivers/clk/clk-si5341.c +++ b/drivers/clk/clk-si5341.c @@ -892,8 +892,10 @@ static int si5341_output_clk_set_rate(struct clk_hw *hw, unsigned long rate, r[0] = r_div ? (r_div & 0xff) : 1; r[1] = (r_div >> 8) & 0xff; r[2] = (r_div >> 16) & 0xff; - return regmap_bulk_write(output->data->regmap, + err = regmap_bulk_write(output->data->regmap, SI5341_OUT_R_REG(output), r, 3); + + return 0; } static int si5341_output_reparent(struct clk_si5341_output *output, u8 index) diff --git a/drivers/clk/qcom/gpucc-sm8150.c b/drivers/clk/qcom/gpucc-sm8150.c index c89a5b59ddb7..8422fd047493 100644 --- a/drivers/clk/qcom/gpucc-sm8150.c +++ b/drivers/clk/qcom/gpucc-sm8150.c @@ -37,8 +37,8 @@ static struct alpha_pll_config gpu_cc_pll1_config = { .config_ctl_hi_val = 0x00002267, .config_ctl_hi1_val = 0x00000024, .test_ctl_val = 0x00000000, - .test_ctl_hi_val = 0x00000000, - .test_ctl_hi1_val = 0x00000020, + .test_ctl_hi_val = 0x00000002, + .test_ctl_hi1_val = 0x00000000, .user_ctl_val = 0x00000000, .user_ctl_hi_val = 0x00000805, .user_ctl_hi1_val = 0x000000d0, diff --git a/drivers/clk/qcom/videocc-sm8150.c b/drivers/clk/qcom/videocc-sm8150.c index 52a9a453a143..1afdbe4a249d 100644 --- a/drivers/clk/qcom/videocc-sm8150.c +++ b/drivers/clk/qcom/videocc-sm8150.c @@ -33,7 +33,6 @@ static struct alpha_pll_config video_pll0_config = { .config_ctl_val = 0x20485699, .config_ctl_hi_val = 0x00002267, .config_ctl_hi1_val = 0x00000024, - .test_ctl_hi1_val = 0x00000020, .user_ctl_val = 0x00000000, .user_ctl_hi_val = 0x00000805, .user_ctl_hi1_val = 0x000000D0, @@ -215,10 +214,6 @@ static const struct regmap_config video_cc_sm8150_regmap_config = { static const struct qcom_reset_map video_cc_sm8150_resets[] = { [VIDEO_CC_MVSC_CORE_CLK_BCR] = { 0x850, 2 }, - [VIDEO_CC_INTERFACE_BCR] = { 0x8f0 }, - [VIDEO_CC_MVS0_BCR] = { 0x870 }, - [VIDEO_CC_MVS1_BCR] = { 0x8b0 }, - [VIDEO_CC_MVSC_BCR] = { 0x810 }, }; static const struct qcom_cc_desc video_cc_sm8150_desc = { diff --git a/drivers/clk/renesas/rzg2l-cpg.c b/drivers/clk/renesas/rzg2l-cpg.c index 473feb36a38f..84767cfc1e73 100644 --- a/drivers/clk/renesas/rzg2l-cpg.c +++ b/drivers/clk/renesas/rzg2l-cpg.c @@ -1115,33 +1115,41 @@ fail: #define rcdev_to_priv(x) container_of(x, struct rzg2l_cpg_priv, rcdev) +static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev, + unsigned long id) +{ + struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev); + const struct rzg2l_cpg_info *info = priv->info; + unsigned int reg = info->resets[id].off; + u32 dis = BIT(info->resets[id].bit); + u32 we = dis << 16; + + dev_dbg(rcdev->dev, "reset id:%ld offset:0x%x\n", id, CLK_RST_R(reg)); + + /* Reset module */ + writel(we, priv->base + CLK_RST_R(reg)); + + /* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */ + udelay(35); + + /* Release module from reset state */ + writel(we | dis, priv->base + CLK_RST_R(reg)); + + return 0; +} + static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev, unsigned long id) { struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev); const struct rzg2l_cpg_info *info = priv->info; unsigned int reg = info->resets[id].off; - u32 mask = BIT(info->resets[id].bit); - s8 monbit = info->resets[id].monbit; - u32 value = mask << 16; + u32 value = BIT(info->resets[id].bit) << 16; dev_dbg(rcdev->dev, "assert id:%ld offset:0x%x\n", id, CLK_RST_R(reg)); writel(value, priv->base + CLK_RST_R(reg)); - - if (info->has_clk_mon_regs) { - reg = CLK_MRST_R(reg); - } else if (monbit >= 0) { - reg = CPG_RST_MON; - mask = BIT(monbit); - } else { - /* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */ - udelay(35); - return 0; - } - - return readl_poll_timeout_atomic(priv->base + reg, value, - value & mask, 10, 200); + return 0; } static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev, @@ -1150,40 +1158,14 @@ static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev, struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev); const struct rzg2l_cpg_info *info = priv->info; unsigned int reg = info->resets[id].off; - u32 mask = BIT(info->resets[id].bit); - s8 monbit = info->resets[id].monbit; - u32 value = (mask << 16) | mask; + u32 dis = BIT(info->resets[id].bit); + u32 value = (dis << 16) | dis; dev_dbg(rcdev->dev, "deassert id:%ld offset:0x%x\n", id, CLK_RST_R(reg)); writel(value, priv->base + CLK_RST_R(reg)); - - if (info->has_clk_mon_regs) { - reg = CLK_MRST_R(reg); - } else if (monbit >= 0) { - reg = CPG_RST_MON; - mask = BIT(monbit); - } else { - /* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */ - udelay(35); - return 0; - } - - return readl_poll_timeout_atomic(priv->base + reg, value, - !(value & mask), 10, 200); -} - -static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev, - unsigned long id) -{ - int ret; - - ret = rzg2l_cpg_assert(rcdev, id); - if (ret) - return ret; - - return rzg2l_cpg_deassert(rcdev, id); + return 0; } static int rzg2l_cpg_status(struct reset_controller_dev *rcdev, @@ -1191,21 +1173,18 @@ static int rzg2l_cpg_status(struct reset_controller_dev *rcdev, { struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev); const struct rzg2l_cpg_info *info = priv->info; + unsigned int reg = info->resets[id].off; + u32 bitmask = BIT(info->resets[id].bit); s8 monbit = info->resets[id].monbit; - unsigned int reg; - u32 bitmask; if (info->has_clk_mon_regs) { - reg = CLK_MRST_R(info->resets[id].off); - bitmask = BIT(info->resets[id].bit); + return !!(readl(priv->base + CLK_MRST_R(reg)) & bitmask); } else if (monbit >= 0) { - reg = CPG_RST_MON; - bitmask = BIT(monbit); - } else { - return -ENOTSUPP; - } + u32 monbitmask = BIT(monbit); - return !!(readl(priv->base + reg) & bitmask); + return !!(readl(priv->base + CPG_RST_MON) & monbitmask); + } + return -ENOTSUPP; } static const struct reset_control_ops rzg2l_cpg_reset_ops = { diff --git a/drivers/clk/rockchip/clk-rk3128.c b/drivers/clk/rockchip/clk-rk3128.c index 7782785a86e6..aa53797dbfc1 100644 --- a/drivers/clk/rockchip/clk-rk3128.c +++ b/drivers/clk/rockchip/clk-rk3128.c @@ -490,7 +490,7 @@ static struct rockchip_clk_branch common_clk_branches[] __initdata = { GATE(HCLK_I2S_2CH, "hclk_i2s_2ch", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 2, GFLAGS), GATE(0, "hclk_usb_peri", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(9), 13, GFLAGS), GATE(HCLK_HOST2, "hclk_host2", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 3, GFLAGS), - GATE(HCLK_OTG, "hclk_otg", "hclk_peri", 0, RK2928_CLKGATE_CON(5), 13, GFLAGS), + GATE(HCLK_OTG, "hclk_otg", "hclk_peri", 0, RK2928_CLKGATE_CON(3), 13, GFLAGS), GATE(0, "hclk_peri_ahb", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(9), 14, GFLAGS), GATE(HCLK_SPDIF, "hclk_spdif", "hclk_peri", 0, RK2928_CLKGATE_CON(10), 9, GFLAGS), GATE(HCLK_TSP, "hclk_tsp", "hclk_peri", 0, RK2928_CLKGATE_CON(10), 12, GFLAGS), diff --git a/drivers/clk/rockchip/clk-rk3568.c b/drivers/clk/rockchip/clk-rk3568.c index 1ffb755feea4..2f54f630c8b6 100644 --- a/drivers/clk/rockchip/clk-rk3568.c +++ b/drivers/clk/rockchip/clk-rk3568.c @@ -72,7 +72,6 @@ static struct rockchip_pll_rate_table rk3568_pll_rates[] = { RK3036_PLL_RATE(408000000, 1, 68, 2, 2, 1, 0), RK3036_PLL_RATE(312000000, 1, 78, 6, 1, 1, 0), RK3036_PLL_RATE(297000000, 2, 99, 4, 1, 1, 0), - RK3036_PLL_RATE(292500000, 1, 195, 4, 4, 1, 0), RK3036_PLL_RATE(241500000, 2, 161, 4, 2, 1, 0), RK3036_PLL_RATE(216000000, 1, 72, 4, 2, 1, 0), RK3036_PLL_RATE(200000000, 1, 100, 3, 4, 1, 0), diff --git a/drivers/clk/zynqmp/clk-mux-zynqmp.c b/drivers/clk/zynqmp/clk-mux-zynqmp.c index 9b5d3050b742..60359333f26d 100644 --- a/drivers/clk/zynqmp/clk-mux-zynqmp.c +++ b/drivers/clk/zynqmp/clk-mux-zynqmp.c @@ -89,7 +89,7 @@ static int zynqmp_clk_mux_set_parent(struct clk_hw *hw, u8 index) static const struct clk_ops zynqmp_clk_mux_ops = { .get_parent = zynqmp_clk_mux_get_parent, .set_parent = zynqmp_clk_mux_set_parent, - .determine_rate = __clk_mux_determine_rate_closest, + .determine_rate = __clk_mux_determine_rate, }; static const struct clk_ops zynqmp_clk_mux_ro_ops = { diff --git a/drivers/clk/zynqmp/divider.c b/drivers/clk/zynqmp/divider.c index 5a00487ae408..33a3b2a22659 100644 --- a/drivers/clk/zynqmp/divider.c +++ b/drivers/clk/zynqmp/divider.c @@ -110,6 +110,52 @@ static unsigned long zynqmp_clk_divider_recalc_rate(struct clk_hw *hw, return DIV_ROUND_UP_ULL(parent_rate, value); } +static void zynqmp_get_divider2_val(struct clk_hw *hw, + unsigned long rate, + struct zynqmp_clk_divider *divider, + u32 *bestdiv) +{ + int div1; + int div2; + long error = LONG_MAX; + unsigned long div1_prate; + struct clk_hw *div1_parent_hw; + struct zynqmp_clk_divider *pdivider; + struct clk_hw *div2_parent_hw = clk_hw_get_parent(hw); + + if (!div2_parent_hw) + return; + + pdivider = to_zynqmp_clk_divider(div2_parent_hw); + if (!pdivider) + return; + + div1_parent_hw = clk_hw_get_parent(div2_parent_hw); + if (!div1_parent_hw) + return; + + div1_prate = clk_hw_get_rate(div1_parent_hw); + *bestdiv = 1; + for (div1 = 1; div1 <= pdivider->max_div;) { + for (div2 = 1; div2 <= divider->max_div;) { + long new_error = ((div1_prate / div1) / div2) - rate; + + if (abs(new_error) < abs(error)) { + *bestdiv = div2; + error = new_error; + } + if (divider->flags & CLK_DIVIDER_POWER_OF_TWO) + div2 = div2 << 1; + else + div2++; + } + if (pdivider->flags & CLK_DIVIDER_POWER_OF_TWO) + div1 = div1 << 1; + else + div1++; + } +} + /** * zynqmp_clk_divider_round_rate() - Round rate of divider clock * @hw: handle between common and hardware-specific interfaces @@ -128,7 +174,6 @@ static long zynqmp_clk_divider_round_rate(struct clk_hw *hw, u32 div_type = divider->div_type; u32 bestdiv; int ret; - u8 width; /* if read only, just return current value */ if (divider->flags & CLK_DIVIDER_READ_ONLY) { @@ -148,12 +193,23 @@ static long zynqmp_clk_divider_round_rate(struct clk_hw *hw, return DIV_ROUND_UP_ULL((u64)*prate, bestdiv); } - width = fls(divider->max_div); + bestdiv = zynqmp_divider_get_val(*prate, rate, divider->flags); - rate = divider_round_rate(hw, rate, prate, NULL, width, divider->flags); + /* + * In case of two divisors, compute best divider values and return + * divider2 value based on compute value. div1 will be automatically + * set to optimum based on required total divider value. + */ + if (div_type == TYPE_DIV2 && + (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)) { + zynqmp_get_divider2_val(hw, rate, divider, &bestdiv); + } - if (divider->is_frac && (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) && (rate % *prate)) - *prate = rate; + if ((clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) && divider->is_frac) + bestdiv = rate % *prate ? 1 : bestdiv; + + bestdiv = min_t(u32, bestdiv, divider->max_div); + *prate = rate * bestdiv; return rate; } diff --git a/drivers/clocksource/timer-ti-dm.c b/drivers/clocksource/timer-ti-dm.c index 7f9c1f58a947..ec86aecb748f 100644 --- a/drivers/clocksource/timer-ti-dm.c +++ b/drivers/clocksource/timer-ti-dm.c @@ -184,7 +184,7 @@ static inline u32 dmtimer_read(struct dmtimer *timer, u32 reg) * dmtimer_write - write timer registers in posted and non-posted mode * @timer: timer pointer over which write operation is to perform * @reg: lowest byte holds the register offset - * @val: data to write into the register + * @value: data to write into the register * * The posted mode bit is encoded in reg. Note that in posted mode, the write * pending bit must be checked. Otherwise a write on a register which has a @@ -937,7 +937,7 @@ static int omap_dm_timer_set_int_enable(struct omap_dm_timer *cookie, /** * omap_dm_timer_set_int_disable - disable timer interrupts - * @cookie: pointer to timer cookie + * @timer: pointer to timer handle * @mask: bit mask of interrupts to be disabled * * Disables the specified timer interrupts for a timer. diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c index 8514bb62dd10..69a8742c0a7a 100644 --- a/drivers/cpufreq/cpufreq-dt-platdev.c +++ b/drivers/cpufreq/cpufreq-dt-platdev.c @@ -176,7 +176,7 @@ static bool __init cpu0_node_has_opp_v2_prop(void) struct device_node *np = of_cpu_device_node_get(0); bool ret = false; - if (of_property_present(np, "operating-points-v2")) + if (of_get_property(np, "operating-points-v2", NULL)) ret = true; of_node_put(np); diff --git a/drivers/cpufreq/imx-cpufreq-dt.c b/drivers/cpufreq/imx-cpufreq-dt.c index 535867a7dfdd..76e553af2071 100644 --- a/drivers/cpufreq/imx-cpufreq-dt.c +++ b/drivers/cpufreq/imx-cpufreq-dt.c @@ -89,7 +89,7 @@ static int imx_cpufreq_dt_probe(struct platform_device *pdev) cpu_dev = get_cpu_device(0); - if (!of_property_present(cpu_dev->of_node, "cpu-supply")) + if (!of_find_property(cpu_dev->of_node, "cpu-supply", NULL)) return -ENODEV; if (of_machine_is_compatible("fsl,imx7ulp")) { diff --git a/drivers/cpufreq/imx6q-cpufreq.c b/drivers/cpufreq/imx6q-cpufreq.c index 39b0362a3b9a..925fc17eaacb 100644 --- a/drivers/cpufreq/imx6q-cpufreq.c +++ b/drivers/cpufreq/imx6q-cpufreq.c @@ -230,7 +230,7 @@ static int imx6q_opp_check_speed_grading(struct device *dev) u32 val; int ret; - if (of_property_present(dev->of_node, "nvmem-cells")) { + if (of_find_property(dev->of_node, "nvmem-cells", NULL)) { ret = nvmem_cell_read_u32(dev, "speed_grade", &val); if (ret) return ret; @@ -285,7 +285,7 @@ static int imx6ul_opp_check_speed_grading(struct device *dev) u32 val; int ret = 0; - if (of_property_present(dev->of_node, "nvmem-cells")) { + if (of_find_property(dev->of_node, "nvmem-cells", NULL)) { ret = nvmem_cell_read_u32(dev, "speed_grade", &val); if (ret) return ret; diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c index 028df8a5f537..513a071845c2 100644 --- a/drivers/cpufreq/scmi-cpufreq.c +++ b/drivers/cpufreq/scmi-cpufreq.c @@ -310,11 +310,8 @@ static int scmi_cpufreq_probe(struct scmi_device *sdev) #ifdef CONFIG_COMMON_CLK /* dummy clock provider as needed by OPP if clocks property is used */ - if (of_property_present(dev->of_node, "#clock-cells")) { - ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, NULL); - if (ret) - return dev_err_probe(dev, ret, "%s: registering clock provider failed\n", __func__); - } + if (of_find_property(dev->of_node, "#clock-cells", NULL)) + devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, NULL); #endif ret = cpufreq_register_driver(&scmi_cpufreq_driver); diff --git a/drivers/cpufreq/tegra20-cpufreq.c b/drivers/cpufreq/tegra20-cpufreq.c index dfd2de4f8e07..ab7ac7df9e62 100644 --- a/drivers/cpufreq/tegra20-cpufreq.c +++ b/drivers/cpufreq/tegra20-cpufreq.c @@ -25,7 +25,7 @@ static bool cpu0_node_has_opp_v2_prop(void) struct device_node *np = of_cpu_device_node_get(0); bool ret = false; - if (of_property_present(np, "operating-points-v2")) + if (of_get_property(np, "operating-points-v2", NULL)) ret = true; of_node_put(np); diff --git a/drivers/crypto/ccp/ccp-ops.c b/drivers/crypto/ccp/ccp-ops.c index cb8e99936abb..aa4e1a500691 100644 --- a/drivers/crypto/ccp/ccp-ops.c +++ b/drivers/crypto/ccp/ccp-ops.c @@ -179,11 +179,8 @@ static int ccp_init_dm_workarea(struct ccp_dm_workarea *wa, wa->dma.address = dma_map_single(wa->dev, wa->address, len, dir); - if (dma_mapping_error(wa->dev, wa->dma.address)) { - kfree(wa->address); - wa->address = NULL; + if (dma_mapping_error(wa->dev, wa->dma.address)) return -ENOMEM; - } wa->dma.length = len; } diff --git a/drivers/crypto/hisilicon/hpre/hpre_main.c b/drivers/crypto/hisilicon/hpre/hpre_main.c index 269df4ec148b..ff8a5f20a5df 100644 --- a/drivers/crypto/hisilicon/hpre/hpre_main.c +++ b/drivers/crypto/hisilicon/hpre/hpre_main.c @@ -118,6 +118,8 @@ #define HPRE_DFX_COMMON2_LEN 0xE #define HPRE_DFX_CORE_LEN 0x43 +#define HPRE_DEV_ALG_MAX_LEN 256 + static const char hpre_name[] = "hisi_hpre"; static struct dentry *hpre_debugfs_root; static const struct pci_device_id hpre_dev_ids[] = { @@ -133,7 +135,12 @@ struct hpre_hw_error { const char *msg; }; -static const struct qm_dev_alg hpre_dev_algs[] = { +struct hpre_dev_alg { + u32 alg_msk; + const char *alg; +}; + +static const struct hpre_dev_alg hpre_dev_algs[] = { { .alg_msk = BIT(0), .alg = "rsa\n" @@ -226,20 +233,6 @@ static const struct hisi_qm_cap_info hpre_basic_info[] = { {HPRE_CORE10_ALG_BITMAP_CAP, 0x3170, 0, GENMASK(31, 0), 0x0, 0x10, 0x10} }; -enum hpre_pre_store_cap_idx { - HPRE_CLUSTER_NUM_CAP_IDX = 0x0, - HPRE_CORE_ENABLE_BITMAP_CAP_IDX, - HPRE_DRV_ALG_BITMAP_CAP_IDX, - HPRE_DEV_ALG_BITMAP_CAP_IDX, -}; - -static const u32 hpre_pre_store_caps[] = { - HPRE_CLUSTER_NUM_CAP, - HPRE_CORE_ENABLE_BITMAP_CAP, - HPRE_DRV_ALG_BITMAP_CAP, - HPRE_DEV_ALG_BITMAP_CAP, -}; - static const struct hpre_hw_error hpre_hw_errors[] = { { .int_msk = BIT(0), @@ -359,13 +352,42 @@ bool hpre_check_alg_support(struct hisi_qm *qm, u32 alg) { u32 cap_val; - cap_val = qm->cap_tables.dev_cap_table[HPRE_DRV_ALG_BITMAP_CAP_IDX].cap_val; + cap_val = hisi_qm_get_hw_info(qm, hpre_basic_info, HPRE_DRV_ALG_BITMAP_CAP, qm->cap_ver); if (alg & cap_val) return true; return false; } +static int hpre_set_qm_algs(struct hisi_qm *qm) +{ + struct device *dev = &qm->pdev->dev; + char *algs, *ptr; + u32 alg_msk; + int i; + + if (!qm->use_sva) + return 0; + + algs = devm_kzalloc(dev, HPRE_DEV_ALG_MAX_LEN * sizeof(char), GFP_KERNEL); + if (!algs) + return -ENOMEM; + + alg_msk = hisi_qm_get_hw_info(qm, hpre_basic_info, HPRE_DEV_ALG_BITMAP_CAP, qm->cap_ver); + + for (i = 0; i < ARRAY_SIZE(hpre_dev_algs); i++) + if (alg_msk & hpre_dev_algs[i].alg_msk) + strcat(algs, hpre_dev_algs[i].alg); + + ptr = strrchr(algs, '\n'); + if (ptr) + *ptr = '\0'; + + qm->uacce->algs = algs; + + return 0; +} + static int hpre_diff_regs_show(struct seq_file *s, void *unused) { struct hisi_qm *qm = s->private; @@ -435,6 +457,16 @@ static u32 vfs_num; module_param_cb(vfs_num, &vfs_num_ops, &vfs_num, 0444); MODULE_PARM_DESC(vfs_num, "Number of VFs to enable(1-63), 0(default)"); +static inline int hpre_cluster_num(struct hisi_qm *qm) +{ + return hisi_qm_get_hw_info(qm, hpre_basic_info, HPRE_CLUSTER_NUM_CAP, qm->cap_ver); +} + +static inline int hpre_cluster_core_mask(struct hisi_qm *qm) +{ + return hisi_qm_get_hw_info(qm, hpre_basic_info, HPRE_CORE_ENABLE_BITMAP_CAP, qm->cap_ver); +} + struct hisi_qp *hpre_create_qp(u8 type) { int node = cpu_to_node(smp_processor_id()); @@ -501,15 +533,13 @@ static int hpre_cfg_by_dsm(struct hisi_qm *qm) static int hpre_set_cluster(struct hisi_qm *qm) { + u32 cluster_core_mask = hpre_cluster_core_mask(qm); + u8 clusters_num = hpre_cluster_num(qm); struct device *dev = &qm->pdev->dev; unsigned long offset; - u32 cluster_core_mask; - u8 clusters_num; u32 val = 0; int ret, i; - cluster_core_mask = qm->cap_tables.dev_cap_table[HPRE_CORE_ENABLE_BITMAP_CAP_IDX].cap_val; - clusters_num = qm->cap_tables.dev_cap_table[HPRE_CLUSTER_NUM_CAP_IDX].cap_val; for (i = 0; i < clusters_num; i++) { offset = i * HPRE_CLSTR_ADDR_INTRVL; @@ -704,12 +734,11 @@ static int hpre_set_user_domain_and_cache(struct hisi_qm *qm) static void hpre_cnt_regs_clear(struct hisi_qm *qm) { + u8 clusters_num = hpre_cluster_num(qm); unsigned long offset; - u8 clusters_num; int i; /* clear clusterX/cluster_ctrl */ - clusters_num = qm->cap_tables.dev_cap_table[HPRE_CLUSTER_NUM_CAP_IDX].cap_val; for (i = 0; i < clusters_num; i++) { offset = HPRE_CLSTR_BASE + i * HPRE_CLSTR_ADDR_INTRVL; writel(0x0, qm->io_base + offset + HPRE_CLUSTER_INQURY); @@ -996,14 +1025,13 @@ static int hpre_pf_comm_regs_debugfs_init(struct hisi_qm *qm) static int hpre_cluster_debugfs_init(struct hisi_qm *qm) { + u8 clusters_num = hpre_cluster_num(qm); struct device *dev = &qm->pdev->dev; char buf[HPRE_DBGFS_VAL_MAX_LEN]; struct debugfs_regset32 *regset; struct dentry *tmp_d; - u8 clusters_num; int i, ret; - clusters_num = qm->cap_tables.dev_cap_table[HPRE_CLUSTER_NUM_CAP_IDX].cap_val; for (i = 0; i < clusters_num; i++) { ret = snprintf(buf, HPRE_DBGFS_VAL_MAX_LEN, "cluster%d", i); if (ret >= HPRE_DBGFS_VAL_MAX_LEN) @@ -1108,37 +1136,8 @@ static void hpre_debugfs_exit(struct hisi_qm *qm) debugfs_remove_recursive(qm->debug.debug_root); } -static int hpre_pre_store_cap_reg(struct hisi_qm *qm) -{ - struct hisi_qm_cap_record *hpre_cap; - struct device *dev = &qm->pdev->dev; - size_t i, size; - - size = ARRAY_SIZE(hpre_pre_store_caps); - hpre_cap = devm_kzalloc(dev, sizeof(*hpre_cap) * size, GFP_KERNEL); - if (!hpre_cap) - return -ENOMEM; - - for (i = 0; i < size; i++) { - hpre_cap[i].type = hpre_pre_store_caps[i]; - hpre_cap[i].cap_val = hisi_qm_get_hw_info(qm, hpre_basic_info, - hpre_pre_store_caps[i], qm->cap_ver); - } - - if (hpre_cap[HPRE_CLUSTER_NUM_CAP_IDX].cap_val > HPRE_CLUSTERS_NUM_MAX) { - dev_err(dev, "Device cluster num %u is out of range for driver supports %d!\n", - hpre_cap[HPRE_CLUSTER_NUM_CAP_IDX].cap_val, HPRE_CLUSTERS_NUM_MAX); - return -EINVAL; - } - - qm->cap_tables.dev_cap_table = hpre_cap; - - return 0; -} - static int hpre_qm_init(struct hisi_qm *qm, struct pci_dev *pdev) { - u64 alg_msk; int ret; if (pdev->revision == QM_HW_V1) { @@ -1169,16 +1168,7 @@ static int hpre_qm_init(struct hisi_qm *qm, struct pci_dev *pdev) return ret; } - /* Fetch and save the value of capability registers */ - ret = hpre_pre_store_cap_reg(qm); - if (ret) { - pci_err(pdev, "Failed to pre-store capability registers!\n"); - hisi_qm_uninit(qm); - return ret; - } - - alg_msk = qm->cap_tables.dev_cap_table[HPRE_DEV_ALG_BITMAP_CAP_IDX].cap_val; - ret = hisi_qm_set_algs(qm, alg_msk, hpre_dev_algs, ARRAY_SIZE(hpre_dev_algs)); + ret = hpre_set_qm_algs(qm); if (ret) { pci_err(pdev, "Failed to set hpre algs!\n"); hisi_qm_uninit(qm); @@ -1191,12 +1181,11 @@ static int hpre_show_last_regs_init(struct hisi_qm *qm) { int cluster_dfx_regs_num = ARRAY_SIZE(hpre_cluster_dfx_regs); int com_dfx_regs_num = ARRAY_SIZE(hpre_com_dfx_regs); + u8 clusters_num = hpre_cluster_num(qm); struct qm_debug *debug = &qm->debug; void __iomem *io_base; - u8 clusters_num; int i, j, idx; - clusters_num = qm->cap_tables.dev_cap_table[HPRE_CLUSTER_NUM_CAP_IDX].cap_val; debug->last_words = kcalloc(cluster_dfx_regs_num * clusters_num + com_dfx_regs_num, sizeof(unsigned int), GFP_KERNEL); if (!debug->last_words) @@ -1233,10 +1222,10 @@ static void hpre_show_last_dfx_regs(struct hisi_qm *qm) { int cluster_dfx_regs_num = ARRAY_SIZE(hpre_cluster_dfx_regs); int com_dfx_regs_num = ARRAY_SIZE(hpre_com_dfx_regs); + u8 clusters_num = hpre_cluster_num(qm); struct qm_debug *debug = &qm->debug; struct pci_dev *pdev = qm->pdev; void __iomem *io_base; - u8 clusters_num; int i, j, idx; u32 val; @@ -1251,7 +1240,6 @@ static void hpre_show_last_dfx_regs(struct hisi_qm *qm) hpre_com_dfx_regs[i].name, debug->last_words[i], val); } - clusters_num = qm->cap_tables.dev_cap_table[HPRE_CLUSTER_NUM_CAP_IDX].cap_val; for (i = 0; i < clusters_num; i++) { io_base = qm->io_base + hpre_cluster_offsets[i]; for (j = 0; j < cluster_dfx_regs_num; j++) { diff --git a/drivers/crypto/hisilicon/qm.c b/drivers/crypto/hisilicon/qm.c index 1e947146ca3d..3284ca59a3b3 100644 --- a/drivers/crypto/hisilicon/qm.c +++ b/drivers/crypto/hisilicon/qm.c @@ -237,8 +237,6 @@ #define QM_QOS_MAX_CIR_S 11 #define QM_AUTOSUSPEND_DELAY 3000 -#define QM_DEV_ALG_MAX_LEN 256 - #define QM_MK_CQC_DW3_V1(hop_num, pg_sz, buf_sz, cqe_sz) \ (((hop_num) << QM_CQ_HOP_NUM_SHIFT) | \ ((pg_sz) << QM_CQ_PAGE_SIZE_SHIFT) | \ @@ -317,13 +315,6 @@ enum qm_basic_type { QM_VF_IRQ_NUM_CAP, }; -enum qm_pre_store_cap_idx { - QM_EQ_IRQ_TYPE_CAP_IDX = 0x0, - QM_AEQ_IRQ_TYPE_CAP_IDX, - QM_ABN_IRQ_TYPE_CAP_IDX, - QM_PF2VF_IRQ_TYPE_CAP_IDX, -}; - static const struct hisi_qm_cap_info qm_cap_info_comm[] = { {QM_SUPPORT_DB_ISOLATION, 0x30, 0, BIT(0), 0x0, 0x0, 0x0}, {QM_SUPPORT_FUNC_QOS, 0x3100, 0, BIT(8), 0x0, 0x0, 0x1}, @@ -353,13 +344,6 @@ static const struct hisi_qm_cap_info qm_basic_info[] = { {QM_VF_IRQ_NUM_CAP, 0x311c, 0, GENMASK(15, 0), 0x1, 0x2, 0x3}, }; -static const u32 qm_pre_store_caps[] = { - QM_EQ_IRQ_TYPE_CAP, - QM_AEQ_IRQ_TYPE_CAP, - QM_ABN_IRQ_TYPE_CAP, - QM_PF2VF_IRQ_TYPE_CAP, -}; - struct qm_mailbox { __le16 w0; __le16 queue_num; @@ -797,40 +781,6 @@ static void qm_get_xqc_depth(struct hisi_qm *qm, u16 *low_bits, *high_bits = (depth >> QM_XQ_DEPTH_SHIFT) & QM_XQ_DEPTH_MASK; } -int hisi_qm_set_algs(struct hisi_qm *qm, u64 alg_msk, const struct qm_dev_alg *dev_algs, - u32 dev_algs_size) -{ - struct device *dev = &qm->pdev->dev; - char *algs, *ptr; - int i; - - if (!qm->uacce) - return 0; - - if (dev_algs_size >= QM_DEV_ALG_MAX_LEN) { - dev_err(dev, "algs size %u is equal or larger than %d.\n", - dev_algs_size, QM_DEV_ALG_MAX_LEN); - return -EINVAL; - } - - algs = devm_kzalloc(dev, QM_DEV_ALG_MAX_LEN * sizeof(char), GFP_KERNEL); - if (!algs) - return -ENOMEM; - - for (i = 0; i < dev_algs_size; i++) - if (alg_msk & dev_algs[i].alg_msk) - strcat(algs, dev_algs[i].alg); - - ptr = strrchr(algs, '\n'); - if (ptr) { - *ptr = '\0'; - qm->uacce->algs = algs; - } - - return 0; -} -EXPORT_SYMBOL_GPL(hisi_qm_set_algs); - static u32 qm_get_irq_num(struct hisi_qm *qm) { if (qm->fun_type == QM_HW_PF) @@ -4854,7 +4804,7 @@ static void qm_unregister_abnormal_irq(struct hisi_qm *qm) if (qm->fun_type == QM_HW_VF) return; - val = qm->cap_tables.qm_cap_table[QM_ABN_IRQ_TYPE_CAP_IDX].cap_val; + val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_ABN_IRQ_TYPE_CAP, qm->cap_ver); if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_ABN_IRQ_TYPE_MASK)) return; @@ -4871,7 +4821,7 @@ static int qm_register_abnormal_irq(struct hisi_qm *qm) if (qm->fun_type == QM_HW_VF) return 0; - val = qm->cap_tables.qm_cap_table[QM_ABN_IRQ_TYPE_CAP_IDX].cap_val; + val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_ABN_IRQ_TYPE_CAP, qm->cap_ver); if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_ABN_IRQ_TYPE_MASK)) return 0; @@ -4888,7 +4838,7 @@ static void qm_unregister_mb_cmd_irq(struct hisi_qm *qm) struct pci_dev *pdev = qm->pdev; u32 irq_vector, val; - val = qm->cap_tables.qm_cap_table[QM_PF2VF_IRQ_TYPE_CAP_IDX].cap_val; + val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_PF2VF_IRQ_TYPE_CAP, qm->cap_ver); if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) return; @@ -4902,7 +4852,7 @@ static int qm_register_mb_cmd_irq(struct hisi_qm *qm) u32 irq_vector, val; int ret; - val = qm->cap_tables.qm_cap_table[QM_PF2VF_IRQ_TYPE_CAP_IDX].cap_val; + val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_PF2VF_IRQ_TYPE_CAP, qm->cap_ver); if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) return 0; @@ -4919,7 +4869,7 @@ static void qm_unregister_aeq_irq(struct hisi_qm *qm) struct pci_dev *pdev = qm->pdev; u32 irq_vector, val; - val = qm->cap_tables.qm_cap_table[QM_AEQ_IRQ_TYPE_CAP_IDX].cap_val; + val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_AEQ_IRQ_TYPE_CAP, qm->cap_ver); if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) return; @@ -4933,7 +4883,7 @@ static int qm_register_aeq_irq(struct hisi_qm *qm) u32 irq_vector, val; int ret; - val = qm->cap_tables.qm_cap_table[QM_AEQ_IRQ_TYPE_CAP_IDX].cap_val; + val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_AEQ_IRQ_TYPE_CAP, qm->cap_ver); if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) return 0; @@ -4951,7 +4901,7 @@ static void qm_unregister_eq_irq(struct hisi_qm *qm) struct pci_dev *pdev = qm->pdev; u32 irq_vector, val; - val = qm->cap_tables.qm_cap_table[QM_EQ_IRQ_TYPE_CAP_IDX].cap_val; + val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_EQ_IRQ_TYPE_CAP, qm->cap_ver); if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) return; @@ -4965,7 +4915,7 @@ static int qm_register_eq_irq(struct hisi_qm *qm) u32 irq_vector, val; int ret; - val = qm->cap_tables.qm_cap_table[QM_EQ_IRQ_TYPE_CAP_IDX].cap_val; + val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_EQ_IRQ_TYPE_CAP, qm->cap_ver); if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) return 0; @@ -5053,29 +5003,7 @@ static int qm_get_qp_num(struct hisi_qm *qm) return 0; } -static int qm_pre_store_irq_type_caps(struct hisi_qm *qm) -{ - struct hisi_qm_cap_record *qm_cap; - struct pci_dev *pdev = qm->pdev; - size_t i, size; - - size = ARRAY_SIZE(qm_pre_store_caps); - qm_cap = devm_kzalloc(&pdev->dev, sizeof(*qm_cap) * size, GFP_KERNEL); - if (!qm_cap) - return -ENOMEM; - - for (i = 0; i < size; i++) { - qm_cap[i].type = qm_pre_store_caps[i]; - qm_cap[i].cap_val = hisi_qm_get_hw_info(qm, qm_basic_info, - qm_pre_store_caps[i], qm->cap_ver); - } - - qm->cap_tables.qm_cap_table = qm_cap; - - return 0; -} - -static int qm_get_hw_caps(struct hisi_qm *qm) +static void qm_get_hw_caps(struct hisi_qm *qm) { const struct hisi_qm_cap_info *cap_info = qm->fun_type == QM_HW_PF ? qm_cap_info_pf : qm_cap_info_vf; @@ -5106,9 +5034,6 @@ static int qm_get_hw_caps(struct hisi_qm *qm) if (val) set_bit(cap_info[i].type, &qm->caps); } - - /* Fetch and save the value of irq type related capability registers */ - return qm_pre_store_irq_type_caps(qm); } static int qm_get_pci_res(struct hisi_qm *qm) @@ -5130,10 +5055,7 @@ static int qm_get_pci_res(struct hisi_qm *qm) goto err_request_mem_regions; } - ret = qm_get_hw_caps(qm); - if (ret) - goto err_ioremap; - + qm_get_hw_caps(qm); if (test_bit(QM_SUPPORT_DB_ISOLATION, &qm->caps)) { qm->db_interval = QM_QP_DB_INTERVAL; qm->db_phys_base = pci_resource_start(pdev, PCI_BAR_4); diff --git a/drivers/crypto/hisilicon/sec2/sec.h b/drivers/crypto/hisilicon/sec2/sec.h index 410c83712e28..3e57fc04b377 100644 --- a/drivers/crypto/hisilicon/sec2/sec.h +++ b/drivers/crypto/hisilicon/sec2/sec.h @@ -220,13 +220,6 @@ enum sec_cap_type { SEC_CORE4_ALG_BITMAP_HIGH, }; -enum sec_cap_reg_record_idx { - SEC_DRV_ALG_BITMAP_LOW_IDX = 0x0, - SEC_DRV_ALG_BITMAP_HIGH_IDX, - SEC_DEV_ALG_BITMAP_LOW_IDX, - SEC_DEV_ALG_BITMAP_HIGH_IDX, -}; - void sec_destroy_qps(struct hisi_qp **qps, int qp_num); struct hisi_qp **sec_create_qps(void); int sec_register_to_crypto(struct hisi_qm *qm); diff --git a/drivers/crypto/hisilicon/sec2/sec_crypto.c b/drivers/crypto/hisilicon/sec2/sec_crypto.c index cae7c414bdaf..84ae8ddd1a13 100644 --- a/drivers/crypto/hisilicon/sec2/sec_crypto.c +++ b/drivers/crypto/hisilicon/sec2/sec_crypto.c @@ -2546,12 +2546,8 @@ err: int sec_register_to_crypto(struct hisi_qm *qm) { - u64 alg_mask; - int ret = 0; - - alg_mask = sec_get_alg_bitmap(qm, SEC_DRV_ALG_BITMAP_HIGH_IDX, - SEC_DRV_ALG_BITMAP_LOW_IDX); - + u64 alg_mask = sec_get_alg_bitmap(qm, SEC_DRV_ALG_BITMAP_HIGH, SEC_DRV_ALG_BITMAP_LOW); + int ret; ret = sec_register_skcipher(alg_mask); if (ret) @@ -2566,10 +2562,7 @@ int sec_register_to_crypto(struct hisi_qm *qm) void sec_unregister_from_crypto(struct hisi_qm *qm) { - u64 alg_mask; - - alg_mask = sec_get_alg_bitmap(qm, SEC_DRV_ALG_BITMAP_HIGH_IDX, - SEC_DRV_ALG_BITMAP_LOW_IDX); + u64 alg_mask = sec_get_alg_bitmap(qm, SEC_DRV_ALG_BITMAP_HIGH, SEC_DRV_ALG_BITMAP_LOW); sec_unregister_aead(alg_mask, ARRAY_SIZE(sec_aeads)); sec_unregister_skcipher(alg_mask, ARRAY_SIZE(sec_skciphers)); diff --git a/drivers/crypto/hisilicon/sec2/sec_main.c b/drivers/crypto/hisilicon/sec2/sec_main.c index 4bab5000a13e..e384988bda91 100644 --- a/drivers/crypto/hisilicon/sec2/sec_main.c +++ b/drivers/crypto/hisilicon/sec2/sec_main.c @@ -121,6 +121,7 @@ GENMASK_ULL(42, 25)) #define SEC_AEAD_BITMAP (GENMASK_ULL(7, 6) | GENMASK_ULL(18, 17) | \ GENMASK_ULL(45, 43)) +#define SEC_DEV_ALG_MAX_LEN 256 struct sec_hw_error { u32 int_msk; @@ -132,6 +133,11 @@ struct sec_dfx_item { u32 offset; }; +struct sec_dev_alg { + u64 alg_msk; + const char *algs; +}; + static const char sec_name[] = "hisi_sec2"; static struct dentry *sec_debugfs_root; @@ -168,22 +174,15 @@ static const struct hisi_qm_cap_info sec_basic_info[] = { {SEC_CORE4_ALG_BITMAP_HIGH, 0x3170, 0, GENMASK(31, 0), 0x3FFF, 0x3FFF, 0x3FFF}, }; -static const u32 sec_pre_store_caps[] = { - SEC_DRV_ALG_BITMAP_LOW, - SEC_DRV_ALG_BITMAP_HIGH, - SEC_DEV_ALG_BITMAP_LOW, - SEC_DEV_ALG_BITMAP_HIGH, -}; - -static const struct qm_dev_alg sec_dev_algs[] = { { +static const struct sec_dev_alg sec_dev_algs[] = { { .alg_msk = SEC_CIPHER_BITMAP, - .alg = "cipher\n", + .algs = "cipher\n", }, { .alg_msk = SEC_DIGEST_BITMAP, - .alg = "digest\n", + .algs = "digest\n", }, { .alg_msk = SEC_AEAD_BITMAP, - .alg = "aead\n", + .algs = "aead\n", }, }; @@ -396,8 +395,8 @@ u64 sec_get_alg_bitmap(struct hisi_qm *qm, u32 high, u32 low) { u32 cap_val_h, cap_val_l; - cap_val_h = qm->cap_tables.dev_cap_table[high].cap_val; - cap_val_l = qm->cap_tables.dev_cap_table[low].cap_val; + cap_val_h = hisi_qm_get_hw_info(qm, sec_basic_info, high, qm->cap_ver); + cap_val_l = hisi_qm_get_hw_info(qm, sec_basic_info, low, qm->cap_ver); return ((u64)cap_val_h << SEC_ALG_BITMAP_SHIFT) | (u64)cap_val_l; } @@ -1080,31 +1079,37 @@ static int sec_pf_probe_init(struct sec_dev *sec) return ret; } -static int sec_pre_store_cap_reg(struct hisi_qm *qm) +static int sec_set_qm_algs(struct hisi_qm *qm) { - struct hisi_qm_cap_record *sec_cap; - struct pci_dev *pdev = qm->pdev; - size_t i, size; + struct device *dev = &qm->pdev->dev; + char *algs, *ptr; + u64 alg_mask; + int i; - size = ARRAY_SIZE(sec_pre_store_caps); - sec_cap = devm_kzalloc(&pdev->dev, sizeof(*sec_cap) * size, GFP_KERNEL); - if (!sec_cap) + if (!qm->use_sva) + return 0; + + algs = devm_kzalloc(dev, SEC_DEV_ALG_MAX_LEN * sizeof(char), GFP_KERNEL); + if (!algs) return -ENOMEM; - for (i = 0; i < size; i++) { - sec_cap[i].type = sec_pre_store_caps[i]; - sec_cap[i].cap_val = hisi_qm_get_hw_info(qm, sec_basic_info, - sec_pre_store_caps[i], qm->cap_ver); - } + alg_mask = sec_get_alg_bitmap(qm, SEC_DEV_ALG_BITMAP_HIGH, SEC_DEV_ALG_BITMAP_LOW); - qm->cap_tables.dev_cap_table = sec_cap; + for (i = 0; i < ARRAY_SIZE(sec_dev_algs); i++) + if (alg_mask & sec_dev_algs[i].alg_msk) + strcat(algs, sec_dev_algs[i].algs); + + ptr = strrchr(algs, '\n'); + if (ptr) + *ptr = '\0'; + + qm->uacce->algs = algs; return 0; } static int sec_qm_init(struct hisi_qm *qm, struct pci_dev *pdev) { - u64 alg_msk; int ret; qm->pdev = pdev; @@ -1139,16 +1144,7 @@ static int sec_qm_init(struct hisi_qm *qm, struct pci_dev *pdev) return ret; } - /* Fetch and save the value of capability registers */ - ret = sec_pre_store_cap_reg(qm); - if (ret) { - pci_err(qm->pdev, "Failed to pre-store capability registers!\n"); - hisi_qm_uninit(qm); - return ret; - } - - alg_msk = sec_get_alg_bitmap(qm, SEC_DEV_ALG_BITMAP_HIGH_IDX, SEC_DEV_ALG_BITMAP_LOW_IDX); - ret = hisi_qm_set_algs(qm, alg_msk, sec_dev_algs, ARRAY_SIZE(sec_dev_algs)); + ret = sec_set_qm_algs(qm); if (ret) { pci_err(qm->pdev, "Failed to set sec algs!\n"); hisi_qm_uninit(qm); diff --git a/drivers/crypto/hisilicon/zip/zip_main.c b/drivers/crypto/hisilicon/zip/zip_main.c index 9e3f5bca27de..190b4fecfc74 100644 --- a/drivers/crypto/hisilicon/zip/zip_main.c +++ b/drivers/crypto/hisilicon/zip/zip_main.c @@ -74,6 +74,7 @@ #define HZIP_AXI_SHUTDOWN_ENABLE BIT(14) #define HZIP_WR_PORT BIT(11) +#define HZIP_DEV_ALG_MAX_LEN 256 #define HZIP_ALG_ZLIB_BIT GENMASK(1, 0) #define HZIP_ALG_GZIP_BIT GENMASK(3, 2) #define HZIP_ALG_DEFLATE_BIT GENMASK(5, 4) @@ -106,14 +107,6 @@ #define HZIP_CLOCK_GATED_EN (HZIP_CORE_GATED_EN | \ HZIP_CORE_GATED_OOO_EN) -/* zip comp high performance */ -#define HZIP_HIGH_PERF_OFFSET 0x301208 - -enum { - HZIP_HIGH_COMP_RATE, - HZIP_HIGH_COMP_PERF, -}; - static const char hisi_zip_name[] = "hisi_zip"; static struct dentry *hzip_debugfs_root; @@ -127,18 +120,23 @@ struct zip_dfx_item { u32 offset; }; -static const struct qm_dev_alg zip_dev_algs[] = { { +struct zip_dev_alg { + u32 alg_msk; + const char *algs; +}; + +static const struct zip_dev_alg zip_dev_algs[] = { { .alg_msk = HZIP_ALG_ZLIB_BIT, - .alg = "zlib\n", + .algs = "zlib\n", }, { .alg_msk = HZIP_ALG_GZIP_BIT, - .alg = "gzip\n", + .algs = "gzip\n", }, { .alg_msk = HZIP_ALG_DEFLATE_BIT, - .alg = "deflate\n", + .algs = "deflate\n", }, { .alg_msk = HZIP_ALG_LZ77_BIT, - .alg = "lz77_zstd\n", + .algs = "lz77_zstd\n", }, }; @@ -249,26 +247,6 @@ static struct hisi_qm_cap_info zip_basic_cap_info[] = { {ZIP_CAP_MAX, 0x317c, 0, GENMASK(0, 0), 0x0, 0x0, 0x0} }; -enum zip_pre_store_cap_idx { - ZIP_CORE_NUM_CAP_IDX = 0x0, - ZIP_CLUSTER_COMP_NUM_CAP_IDX, - ZIP_CLUSTER_DECOMP_NUM_CAP_IDX, - ZIP_DECOMP_ENABLE_BITMAP_IDX, - ZIP_COMP_ENABLE_BITMAP_IDX, - ZIP_DRV_ALG_BITMAP_IDX, - ZIP_DEV_ALG_BITMAP_IDX, -}; - -static const u32 zip_pre_store_caps[] = { - ZIP_CORE_NUM_CAP, - ZIP_CLUSTER_COMP_NUM_CAP, - ZIP_CLUSTER_DECOMP_NUM_CAP, - ZIP_DECOMP_ENABLE_BITMAP, - ZIP_COMP_ENABLE_BITMAP, - ZIP_DRV_ALG_BITMAP, - ZIP_DEV_ALG_BITMAP, -}; - enum { HZIP_COMP_CORE0, HZIP_COMP_CORE1, @@ -374,37 +352,6 @@ static int hzip_diff_regs_show(struct seq_file *s, void *unused) return 0; } DEFINE_SHOW_ATTRIBUTE(hzip_diff_regs); - -static int perf_mode_set(const char *val, const struct kernel_param *kp) -{ - int ret; - u32 n; - - if (!val) - return -EINVAL; - - ret = kstrtou32(val, 10, &n); - if (ret != 0 || (n != HZIP_HIGH_COMP_PERF && - n != HZIP_HIGH_COMP_RATE)) - return -EINVAL; - - return param_set_int(val, kp); -} - -static const struct kernel_param_ops zip_com_perf_ops = { - .set = perf_mode_set, - .get = param_get_int, -}; - -/* - * perf_mode = 0 means enable high compression rate mode, - * perf_mode = 1 means enable high compression performance mode. - * These two modes only apply to the compression direction. - */ -static u32 perf_mode = HZIP_HIGH_COMP_RATE; -module_param_cb(perf_mode, &zip_com_perf_ops, &perf_mode, 0444); -MODULE_PARM_DESC(perf_mode, "ZIP high perf mode 0(default), 1(enable)"); - static const struct kernel_param_ops zip_uacce_mode_ops = { .set = uacce_mode_set, .get = param_get_int, @@ -463,33 +410,40 @@ bool hisi_zip_alg_support(struct hisi_qm *qm, u32 alg) { u32 cap_val; - cap_val = qm->cap_tables.dev_cap_table[ZIP_DRV_ALG_BITMAP_IDX].cap_val; + cap_val = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_DRV_ALG_BITMAP, qm->cap_ver); if ((alg & cap_val) == alg) return true; return false; } -static int hisi_zip_set_high_perf(struct hisi_qm *qm) +static int hisi_zip_set_qm_algs(struct hisi_qm *qm) { - u32 val; - int ret; + struct device *dev = &qm->pdev->dev; + char *algs, *ptr; + u32 alg_mask; + int i; - val = readl_relaxed(qm->io_base + HZIP_HIGH_PERF_OFFSET); - if (perf_mode == HZIP_HIGH_COMP_PERF) - val |= HZIP_HIGH_COMP_PERF; - else - val &= ~HZIP_HIGH_COMP_PERF; + if (!qm->use_sva) + return 0; - /* Set perf mode */ - writel(val, qm->io_base + HZIP_HIGH_PERF_OFFSET); - ret = readl_relaxed_poll_timeout(qm->io_base + HZIP_HIGH_PERF_OFFSET, - val, val == perf_mode, HZIP_DELAY_1_US, - HZIP_POLL_TIMEOUT_US); - if (ret) - pci_err(qm->pdev, "failed to set perf mode\n"); + algs = devm_kzalloc(dev, HZIP_DEV_ALG_MAX_LEN * sizeof(char), GFP_KERNEL); + if (!algs) + return -ENOMEM; - return ret; + alg_mask = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_DEV_ALG_BITMAP, qm->cap_ver); + + for (i = 0; i < ARRAY_SIZE(zip_dev_algs); i++) + if (alg_mask & zip_dev_algs[i].alg_msk) + strcat(algs, zip_dev_algs[i].algs); + + ptr = strrchr(algs, '\n'); + if (ptr) + *ptr = '\0'; + + qm->uacce->algs = algs; + + return 0; } static void hisi_zip_open_sva_prefetch(struct hisi_qm *qm) @@ -588,8 +542,10 @@ static int hisi_zip_set_user_domain_and_cache(struct hisi_qm *qm) } /* let's open all compression/decompression cores */ - dcomp_bm = qm->cap_tables.dev_cap_table[ZIP_DECOMP_ENABLE_BITMAP_IDX].cap_val; - comp_bm = qm->cap_tables.dev_cap_table[ZIP_COMP_ENABLE_BITMAP_IDX].cap_val; + dcomp_bm = hisi_qm_get_hw_info(qm, zip_basic_cap_info, + ZIP_DECOMP_ENABLE_BITMAP, qm->cap_ver); + comp_bm = hisi_qm_get_hw_info(qm, zip_basic_cap_info, + ZIP_COMP_ENABLE_BITMAP, qm->cap_ver); writel(HZIP_DECOMP_CHECK_ENABLE | dcomp_bm | comp_bm, base + HZIP_CLOCK_GATE_CTRL); /* enable sqc,cqc writeback */ @@ -816,8 +772,9 @@ static int hisi_zip_core_debug_init(struct hisi_qm *qm) char buf[HZIP_BUF_SIZE]; int i; - zip_core_num = qm->cap_tables.dev_cap_table[ZIP_CORE_NUM_CAP_IDX].cap_val; - zip_comp_core_num = qm->cap_tables.dev_cap_table[ZIP_CLUSTER_COMP_NUM_CAP_IDX].cap_val; + zip_core_num = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CORE_NUM_CAP, qm->cap_ver); + zip_comp_core_num = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CLUSTER_COMP_NUM_CAP, + qm->cap_ver); for (i = 0; i < zip_core_num; i++) { if (i < zip_comp_core_num) @@ -959,7 +916,7 @@ static int hisi_zip_show_last_regs_init(struct hisi_qm *qm) u32 zip_core_num; int i, j, idx; - zip_core_num = qm->cap_tables.dev_cap_table[ZIP_CORE_NUM_CAP_IDX].cap_val; + zip_core_num = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CORE_NUM_CAP, qm->cap_ver); debug->last_words = kcalloc(core_dfx_regs_num * zip_core_num + com_dfx_regs_num, sizeof(unsigned int), GFP_KERNEL); @@ -1015,9 +972,9 @@ static void hisi_zip_show_last_dfx_regs(struct hisi_qm *qm) hzip_com_dfx_regs[i].name, debug->last_words[i], val); } - zip_core_num = qm->cap_tables.dev_cap_table[ZIP_CORE_NUM_CAP_IDX].cap_val; - zip_comp_core_num = qm->cap_tables.dev_cap_table[ZIP_CLUSTER_COMP_NUM_CAP_IDX].cap_val; - + zip_core_num = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CORE_NUM_CAP, qm->cap_ver); + zip_comp_core_num = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CLUSTER_COMP_NUM_CAP, + qm->cap_ver); for (i = 0; i < zip_core_num; i++) { if (i < zip_comp_core_num) scnprintf(buf, sizeof(buf), "Comp_core-%d", i); @@ -1158,10 +1115,6 @@ static int hisi_zip_pf_probe_init(struct hisi_zip *hisi_zip) if (ret) return ret; - ret = hisi_zip_set_high_perf(qm); - if (ret) - return ret; - hisi_zip_open_sva_prefetch(qm); hisi_qm_dev_err_init(qm); hisi_zip_debug_regs_clear(qm); @@ -1173,31 +1126,8 @@ static int hisi_zip_pf_probe_init(struct hisi_zip *hisi_zip) return ret; } -static int zip_pre_store_cap_reg(struct hisi_qm *qm) -{ - struct hisi_qm_cap_record *zip_cap; - struct pci_dev *pdev = qm->pdev; - size_t i, size; - - size = ARRAY_SIZE(zip_pre_store_caps); - zip_cap = devm_kzalloc(&pdev->dev, sizeof(*zip_cap) * size, GFP_KERNEL); - if (!zip_cap) - return -ENOMEM; - - for (i = 0; i < size; i++) { - zip_cap[i].type = zip_pre_store_caps[i]; - zip_cap[i].cap_val = hisi_qm_get_hw_info(qm, zip_basic_cap_info, - zip_pre_store_caps[i], qm->cap_ver); - } - - qm->cap_tables.dev_cap_table = zip_cap; - - return 0; -} - static int hisi_zip_qm_init(struct hisi_qm *qm, struct pci_dev *pdev) { - u64 alg_msk; int ret; qm->pdev = pdev; @@ -1233,16 +1163,7 @@ static int hisi_zip_qm_init(struct hisi_qm *qm, struct pci_dev *pdev) return ret; } - /* Fetch and save the value of capability registers */ - ret = zip_pre_store_cap_reg(qm); - if (ret) { - pci_err(qm->pdev, "Failed to pre-store capability registers!\n"); - hisi_qm_uninit(qm); - return ret; - } - - alg_msk = qm->cap_tables.dev_cap_table[ZIP_DEV_ALG_BITMAP_IDX].cap_val; - ret = hisi_qm_set_algs(qm, alg_msk, zip_dev_algs, ARRAY_SIZE(zip_dev_algs)); + ret = hisi_zip_set_qm_algs(qm); if (ret) { pci_err(qm->pdev, "Failed to set zip algs!\n"); hisi_qm_uninit(qm); diff --git a/drivers/crypto/inside-secure/safexcel_cipher.c b/drivers/crypto/inside-secure/safexcel_cipher.c index f59e32115268..32a37e3850c5 100644 --- a/drivers/crypto/inside-secure/safexcel_cipher.c +++ b/drivers/crypto/inside-secure/safexcel_cipher.c @@ -742,9 +742,9 @@ static int safexcel_send_req(struct crypto_async_request *base, int ring, max(totlen_src, totlen_dst)); return -EINVAL; } - if (sreq->nr_src > 0 && - !dma_map_sg(priv->dev, src, sreq->nr_src, DMA_BIDIRECTIONAL)) - return -EIO; + if (sreq->nr_src > 0) + dma_map_sg(priv->dev, src, sreq->nr_src, + DMA_BIDIRECTIONAL); } else { if (unlikely(totlen_src && (sreq->nr_src <= 0))) { dev_err(priv->dev, "Source buffer not large enough (need %d bytes)!", @@ -752,9 +752,8 @@ static int safexcel_send_req(struct crypto_async_request *base, int ring, return -EINVAL; } - if (sreq->nr_src > 0 && - !dma_map_sg(priv->dev, src, sreq->nr_src, DMA_TO_DEVICE)) - return -EIO; + if (sreq->nr_src > 0) + dma_map_sg(priv->dev, src, sreq->nr_src, DMA_TO_DEVICE); if (unlikely(totlen_dst && (sreq->nr_dst <= 0))) { dev_err(priv->dev, "Dest buffer not large enough (need %d bytes)!", @@ -763,11 +762,9 @@ static int safexcel_send_req(struct crypto_async_request *base, int ring, goto unmap; } - if (sreq->nr_dst > 0 && - !dma_map_sg(priv->dev, dst, sreq->nr_dst, DMA_FROM_DEVICE)) { - ret = -EIO; - goto unmap; - } + if (sreq->nr_dst > 0) + dma_map_sg(priv->dev, dst, sreq->nr_dst, + DMA_FROM_DEVICE); } memcpy(ctx->base.ctxr->data, ctx->key, ctx->key_len); diff --git a/drivers/crypto/sa2ul.c b/drivers/crypto/sa2ul.c index e7efebf8127f..f4bc06c24ad8 100644 --- a/drivers/crypto/sa2ul.c +++ b/drivers/crypto/sa2ul.c @@ -1868,8 +1868,9 @@ static int sa_aead_setkey(struct crypto_aead *authenc, crypto_aead_set_flags(ctx->fallback.aead, crypto_aead_get_flags(authenc) & CRYPTO_TFM_REQ_MASK); + crypto_aead_setkey(ctx->fallback.aead, key, keylen); - return crypto_aead_setkey(ctx->fallback.aead, key, keylen); + return 0; } static int sa_aead_setauthsize(struct crypto_aead *tfm, unsigned int authsize) diff --git a/drivers/crypto/sahara.c b/drivers/crypto/sahara.c index 3b946f1313ed..7ab20fb95166 100644 --- a/drivers/crypto/sahara.c +++ b/drivers/crypto/sahara.c @@ -44,6 +44,7 @@ #define FLAGS_MODE_MASK 0x000f #define FLAGS_ENCRYPT BIT(0) #define FLAGS_CBC BIT(1) +#define FLAGS_NEW_KEY BIT(3) #define SAHARA_HDR_BASE 0x00800000 #define SAHARA_HDR_SKHA_ALG_AES 0 @@ -141,6 +142,8 @@ struct sahara_hw_link { }; struct sahara_ctx { + unsigned long flags; + /* AES-specific context */ int keylen; u8 key[AES_KEYSIZE_128]; @@ -149,7 +152,6 @@ struct sahara_ctx { struct sahara_aes_reqctx { unsigned long mode; - u8 iv_out[AES_BLOCK_SIZE]; struct skcipher_request fallback_req; // keep at the end }; @@ -445,24 +447,27 @@ static int sahara_hw_descriptor_create(struct sahara_dev *dev) int ret; int i, j; int idx = 0; - u32 len; - memcpy(dev->key_base, ctx->key, ctx->keylen); + /* Copy new key if necessary */ + if (ctx->flags & FLAGS_NEW_KEY) { + memcpy(dev->key_base, ctx->key, ctx->keylen); + ctx->flags &= ~FLAGS_NEW_KEY; - if (dev->flags & FLAGS_CBC) { - dev->hw_desc[idx]->len1 = AES_BLOCK_SIZE; - dev->hw_desc[idx]->p1 = dev->iv_phys_base; - } else { - dev->hw_desc[idx]->len1 = 0; - dev->hw_desc[idx]->p1 = 0; + if (dev->flags & FLAGS_CBC) { + dev->hw_desc[idx]->len1 = AES_BLOCK_SIZE; + dev->hw_desc[idx]->p1 = dev->iv_phys_base; + } else { + dev->hw_desc[idx]->len1 = 0; + dev->hw_desc[idx]->p1 = 0; + } + dev->hw_desc[idx]->len2 = ctx->keylen; + dev->hw_desc[idx]->p2 = dev->key_phys_base; + dev->hw_desc[idx]->next = dev->hw_phys_desc[1]; + + dev->hw_desc[idx]->hdr = sahara_aes_key_hdr(dev); + + idx++; } - dev->hw_desc[idx]->len2 = ctx->keylen; - dev->hw_desc[idx]->p2 = dev->key_phys_base; - dev->hw_desc[idx]->next = dev->hw_phys_desc[1]; - dev->hw_desc[idx]->hdr = sahara_aes_key_hdr(dev); - - idx++; - dev->nb_in_sg = sg_nents_for_len(dev->in_sg, dev->total); if (dev->nb_in_sg < 0) { @@ -484,27 +489,24 @@ static int sahara_hw_descriptor_create(struct sahara_dev *dev) DMA_TO_DEVICE); if (!ret) { dev_err(dev->device, "couldn't map in sg\n"); - return -EINVAL; + goto unmap_in; } - ret = dma_map_sg(dev->device, dev->out_sg, dev->nb_out_sg, DMA_FROM_DEVICE); if (!ret) { dev_err(dev->device, "couldn't map out sg\n"); - goto unmap_in; + goto unmap_out; } /* Create input links */ dev->hw_desc[idx]->p1 = dev->hw_phys_link[0]; sg = dev->in_sg; - len = dev->total; for (i = 0; i < dev->nb_in_sg; i++) { - dev->hw_link[i]->len = min(len, sg->length); + dev->hw_link[i]->len = sg->length; dev->hw_link[i]->p = sg->dma_address; if (i == (dev->nb_in_sg - 1)) { dev->hw_link[i]->next = 0; } else { - len -= min(len, sg->length); dev->hw_link[i]->next = dev->hw_phys_link[i + 1]; sg = sg_next(sg); } @@ -513,14 +515,12 @@ static int sahara_hw_descriptor_create(struct sahara_dev *dev) /* Create output links */ dev->hw_desc[idx]->p2 = dev->hw_phys_link[i]; sg = dev->out_sg; - len = dev->total; for (j = i; j < dev->nb_out_sg + i; j++) { - dev->hw_link[j]->len = min(len, sg->length); + dev->hw_link[j]->len = sg->length; dev->hw_link[j]->p = sg->dma_address; if (j == (dev->nb_out_sg + i - 1)) { dev->hw_link[j]->next = 0; } else { - len -= min(len, sg->length); dev->hw_link[j]->next = dev->hw_phys_link[j + 1]; sg = sg_next(sg); } @@ -539,6 +539,9 @@ static int sahara_hw_descriptor_create(struct sahara_dev *dev) return 0; +unmap_out: + dma_unmap_sg(dev->device, dev->out_sg, dev->nb_out_sg, + DMA_FROM_DEVICE); unmap_in: dma_unmap_sg(dev->device, dev->in_sg, dev->nb_in_sg, DMA_TO_DEVICE); @@ -546,24 +549,8 @@ unmap_in: return -EINVAL; } -static void sahara_aes_cbc_update_iv(struct skcipher_request *req) -{ - struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); - struct sahara_aes_reqctx *rctx = skcipher_request_ctx(req); - unsigned int ivsize = crypto_skcipher_ivsize(skcipher); - - /* Update IV buffer to contain the last ciphertext block */ - if (rctx->mode & FLAGS_ENCRYPT) { - sg_pcopy_to_buffer(req->dst, sg_nents(req->dst), req->iv, - ivsize, req->cryptlen - ivsize); - } else { - memcpy(req->iv, rctx->iv_out, ivsize); - } -} - static int sahara_aes_process(struct skcipher_request *req) { - struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); struct sahara_dev *dev = dev_ptr; struct sahara_ctx *ctx; struct sahara_aes_reqctx *rctx; @@ -585,17 +572,8 @@ static int sahara_aes_process(struct skcipher_request *req) rctx->mode &= FLAGS_MODE_MASK; dev->flags = (dev->flags & ~FLAGS_MODE_MASK) | rctx->mode; - if ((dev->flags & FLAGS_CBC) && req->iv) { - unsigned int ivsize = crypto_skcipher_ivsize(skcipher); - - memcpy(dev->iv_base, req->iv, ivsize); - - if (!(dev->flags & FLAGS_ENCRYPT)) { - sg_pcopy_to_buffer(req->src, sg_nents(req->src), - rctx->iv_out, ivsize, - req->cryptlen - ivsize); - } - } + if ((dev->flags & FLAGS_CBC) && req->iv) + memcpy(dev->iv_base, req->iv, AES_KEYSIZE_128); /* assign new context to device */ dev->ctx = ctx; @@ -608,19 +586,15 @@ static int sahara_aes_process(struct skcipher_request *req) timeout = wait_for_completion_timeout(&dev->dma_completion, msecs_to_jiffies(SAHARA_TIMEOUT_MS)); - - dma_unmap_sg(dev->device, dev->out_sg, dev->nb_out_sg, - DMA_FROM_DEVICE); - dma_unmap_sg(dev->device, dev->in_sg, dev->nb_in_sg, - DMA_TO_DEVICE); - if (!timeout) { dev_err(dev->device, "AES timeout\n"); return -ETIMEDOUT; } - if ((dev->flags & FLAGS_CBC) && req->iv) - sahara_aes_cbc_update_iv(req); + dma_unmap_sg(dev->device, dev->out_sg, dev->nb_out_sg, + DMA_FROM_DEVICE); + dma_unmap_sg(dev->device, dev->in_sg, dev->nb_in_sg, + DMA_TO_DEVICE); return 0; } @@ -635,6 +609,7 @@ static int sahara_aes_setkey(struct crypto_skcipher *tfm, const u8 *key, /* SAHARA only supports 128bit keys */ if (keylen == AES_KEYSIZE_128) { memcpy(ctx->key, key, keylen); + ctx->flags |= FLAGS_NEW_KEY; return 0; } @@ -650,40 +625,12 @@ static int sahara_aes_setkey(struct crypto_skcipher *tfm, const u8 *key, return crypto_skcipher_setkey(ctx->fallback, key, keylen); } -static int sahara_aes_fallback(struct skcipher_request *req, unsigned long mode) -{ - struct sahara_aes_reqctx *rctx = skcipher_request_ctx(req); - struct sahara_ctx *ctx = crypto_skcipher_ctx( - crypto_skcipher_reqtfm(req)); - - skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback); - skcipher_request_set_callback(&rctx->fallback_req, - req->base.flags, - req->base.complete, - req->base.data); - skcipher_request_set_crypt(&rctx->fallback_req, req->src, - req->dst, req->cryptlen, req->iv); - - if (mode & FLAGS_ENCRYPT) - return crypto_skcipher_encrypt(&rctx->fallback_req); - - return crypto_skcipher_decrypt(&rctx->fallback_req); -} - static int sahara_aes_crypt(struct skcipher_request *req, unsigned long mode) { struct sahara_aes_reqctx *rctx = skcipher_request_ctx(req); - struct sahara_ctx *ctx = crypto_skcipher_ctx( - crypto_skcipher_reqtfm(req)); struct sahara_dev *dev = dev_ptr; int err = 0; - if (!req->cryptlen) - return 0; - - if (unlikely(ctx->keylen != AES_KEYSIZE_128)) - return sahara_aes_fallback(req, mode); - dev_dbg(dev->device, "nbytes: %d, enc: %d, cbc: %d\n", req->cryptlen, !!(mode & FLAGS_ENCRYPT), !!(mode & FLAGS_CBC)); @@ -706,21 +653,81 @@ static int sahara_aes_crypt(struct skcipher_request *req, unsigned long mode) static int sahara_aes_ecb_encrypt(struct skcipher_request *req) { + struct sahara_aes_reqctx *rctx = skcipher_request_ctx(req); + struct sahara_ctx *ctx = crypto_skcipher_ctx( + crypto_skcipher_reqtfm(req)); + + if (unlikely(ctx->keylen != AES_KEYSIZE_128)) { + skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback); + skcipher_request_set_callback(&rctx->fallback_req, + req->base.flags, + req->base.complete, + req->base.data); + skcipher_request_set_crypt(&rctx->fallback_req, req->src, + req->dst, req->cryptlen, req->iv); + return crypto_skcipher_encrypt(&rctx->fallback_req); + } + return sahara_aes_crypt(req, FLAGS_ENCRYPT); } static int sahara_aes_ecb_decrypt(struct skcipher_request *req) { + struct sahara_aes_reqctx *rctx = skcipher_request_ctx(req); + struct sahara_ctx *ctx = crypto_skcipher_ctx( + crypto_skcipher_reqtfm(req)); + + if (unlikely(ctx->keylen != AES_KEYSIZE_128)) { + skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback); + skcipher_request_set_callback(&rctx->fallback_req, + req->base.flags, + req->base.complete, + req->base.data); + skcipher_request_set_crypt(&rctx->fallback_req, req->src, + req->dst, req->cryptlen, req->iv); + return crypto_skcipher_decrypt(&rctx->fallback_req); + } + return sahara_aes_crypt(req, 0); } static int sahara_aes_cbc_encrypt(struct skcipher_request *req) { + struct sahara_aes_reqctx *rctx = skcipher_request_ctx(req); + struct sahara_ctx *ctx = crypto_skcipher_ctx( + crypto_skcipher_reqtfm(req)); + + if (unlikely(ctx->keylen != AES_KEYSIZE_128)) { + skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback); + skcipher_request_set_callback(&rctx->fallback_req, + req->base.flags, + req->base.complete, + req->base.data); + skcipher_request_set_crypt(&rctx->fallback_req, req->src, + req->dst, req->cryptlen, req->iv); + return crypto_skcipher_encrypt(&rctx->fallback_req); + } + return sahara_aes_crypt(req, FLAGS_ENCRYPT | FLAGS_CBC); } static int sahara_aes_cbc_decrypt(struct skcipher_request *req) { + struct sahara_aes_reqctx *rctx = skcipher_request_ctx(req); + struct sahara_ctx *ctx = crypto_skcipher_ctx( + crypto_skcipher_reqtfm(req)); + + if (unlikely(ctx->keylen != AES_KEYSIZE_128)) { + skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback); + skcipher_request_set_callback(&rctx->fallback_req, + req->base.flags, + req->base.complete, + req->base.data); + skcipher_request_set_crypt(&rctx->fallback_req, req->src, + req->dst, req->cryptlen, req->iv); + return crypto_skcipher_decrypt(&rctx->fallback_req); + } + return sahara_aes_crypt(req, FLAGS_CBC); } @@ -777,7 +784,6 @@ static int sahara_sha_hw_links_create(struct sahara_dev *dev, int start) { struct scatterlist *sg; - unsigned int len; unsigned int i; int ret; @@ -799,14 +805,12 @@ static int sahara_sha_hw_links_create(struct sahara_dev *dev, if (!ret) return -EFAULT; - len = rctx->total; for (i = start; i < dev->nb_in_sg + start; i++) { - dev->hw_link[i]->len = min(len, sg->length); + dev->hw_link[i]->len = sg->length; dev->hw_link[i]->p = sg->dma_address; if (i == (dev->nb_in_sg + start - 1)) { dev->hw_link[i]->next = 0; } else { - len -= min(len, sg->length); dev->hw_link[i]->next = dev->hw_phys_link[i + 1]; sg = sg_next(sg); } @@ -887,6 +891,24 @@ static int sahara_sha_hw_context_descriptor_create(struct sahara_dev *dev, return 0; } +static int sahara_walk_and_recalc(struct scatterlist *sg, unsigned int nbytes) +{ + if (!sg || !sg->length) + return nbytes; + + while (nbytes && sg) { + if (nbytes <= sg->length) { + sg->length = nbytes; + sg_mark_end(sg); + break; + } + nbytes -= sg->length; + sg = sg_next(sg); + } + + return nbytes; +} + static int sahara_sha_prepare_request(struct ahash_request *req) { struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); @@ -923,20 +945,36 @@ static int sahara_sha_prepare_request(struct ahash_request *req) hash_later, 0); } - rctx->total = len - hash_later; + /* nbytes should now be multiple of blocksize */ + req->nbytes = req->nbytes - hash_later; + + sahara_walk_and_recalc(req->src, req->nbytes); + /* have data from previous operation and current */ if (rctx->buf_cnt && req->nbytes) { sg_init_table(rctx->in_sg_chain, 2); sg_set_buf(rctx->in_sg_chain, rctx->rembuf, rctx->buf_cnt); + sg_chain(rctx->in_sg_chain, 2, req->src); + + rctx->total = req->nbytes + rctx->buf_cnt; rctx->in_sg = rctx->in_sg_chain; + + req->src = rctx->in_sg_chain; /* only data from previous operation */ } else if (rctx->buf_cnt) { - rctx->in_sg = rctx->in_sg_chain; + if (req->src) + rctx->in_sg = req->src; + else + rctx->in_sg = rctx->in_sg_chain; + /* buf was copied into rembuf above */ sg_init_one(rctx->in_sg, rctx->rembuf, rctx->buf_cnt); + rctx->total = rctx->buf_cnt; /* no data from previous operation */ } else { rctx->in_sg = req->src; + rctx->total = req->nbytes; + req->src = rctx->in_sg; } /* on next call, we only have the remaining data in the buffer */ @@ -957,10 +995,7 @@ static int sahara_sha_process(struct ahash_request *req) return ret; if (rctx->first) { - ret = sahara_sha_hw_data_descriptor_create(dev, rctx, req, 0); - if (ret) - return ret; - + sahara_sha_hw_data_descriptor_create(dev, rctx, req, 0); dev->hw_desc[0]->next = 0; rctx->first = 0; } else { @@ -968,10 +1003,7 @@ static int sahara_sha_process(struct ahash_request *req) sahara_sha_hw_context_descriptor_create(dev, rctx, req, 0); dev->hw_desc[0]->next = dev->hw_phys_desc[1]; - ret = sahara_sha_hw_data_descriptor_create(dev, rctx, req, 1); - if (ret) - return ret; - + sahara_sha_hw_data_descriptor_create(dev, rctx, req, 1); dev->hw_desc[1]->next = 0; } @@ -984,19 +1016,18 @@ static int sahara_sha_process(struct ahash_request *req) timeout = wait_for_completion_timeout(&dev->dma_completion, msecs_to_jiffies(SAHARA_TIMEOUT_MS)); - - if (rctx->sg_in_idx) - dma_unmap_sg(dev->device, dev->in_sg, dev->nb_in_sg, - DMA_TO_DEVICE); - if (!timeout) { dev_err(dev->device, "SHA timeout\n"); return -ETIMEDOUT; } + if (rctx->sg_in_idx) + dma_unmap_sg(dev->device, dev->in_sg, dev->nb_in_sg, + DMA_TO_DEVICE); + memcpy(rctx->context, dev->context_base, rctx->context_size); - if (req->result && rctx->last) + if (req->result) memcpy(req->result, rctx->context, rctx->digest_size); return 0; @@ -1140,7 +1171,8 @@ static int sahara_sha_import(struct ahash_request *req, const void *in) static int sahara_sha_cra_init(struct crypto_tfm *tfm) { crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm), - sizeof(struct sahara_sha_reqctx)); + sizeof(struct sahara_sha_reqctx) + + SHA_BUFFER_LEN + SHA256_BLOCK_SIZE); return 0; } diff --git a/drivers/crypto/virtio/virtio_crypto_common.h b/drivers/crypto/virtio/virtio_crypto_common.h index 7059bbe5a2eb..154590e1f764 100644 --- a/drivers/crypto/virtio/virtio_crypto_common.h +++ b/drivers/crypto/virtio/virtio_crypto_common.h @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -29,7 +28,6 @@ struct data_queue { char name[32]; struct crypto_engine *engine; - struct tasklet_struct done_task; }; struct virtio_crypto { diff --git a/drivers/crypto/virtio/virtio_crypto_core.c b/drivers/crypto/virtio/virtio_crypto_core.c index 56dc0935c774..3842915ea743 100644 --- a/drivers/crypto/virtio/virtio_crypto_core.c +++ b/drivers/crypto/virtio/virtio_crypto_core.c @@ -72,28 +72,27 @@ int virtio_crypto_ctrl_vq_request(struct virtio_crypto *vcrypto, struct scatterl return 0; } -static void virtcrypto_done_task(unsigned long data) -{ - struct data_queue *data_vq = (struct data_queue *)data; - struct virtqueue *vq = data_vq->vq; - struct virtio_crypto_request *vc_req; - unsigned int len; - - do { - virtqueue_disable_cb(vq); - while ((vc_req = virtqueue_get_buf(vq, &len)) != NULL) { - if (vc_req->alg_cb) - vc_req->alg_cb(vc_req, len); - } - } while (!virtqueue_enable_cb(vq)); -} - static void virtcrypto_dataq_callback(struct virtqueue *vq) { struct virtio_crypto *vcrypto = vq->vdev->priv; - struct data_queue *dq = &vcrypto->data_vq[vq->index]; + struct virtio_crypto_request *vc_req; + unsigned long flags; + unsigned int len; + unsigned int qid = vq->index; - tasklet_schedule(&dq->done_task); + spin_lock_irqsave(&vcrypto->data_vq[qid].lock, flags); + do { + virtqueue_disable_cb(vq); + while ((vc_req = virtqueue_get_buf(vq, &len)) != NULL) { + spin_unlock_irqrestore( + &vcrypto->data_vq[qid].lock, flags); + if (vc_req->alg_cb) + vc_req->alg_cb(vc_req, len); + spin_lock_irqsave( + &vcrypto->data_vq[qid].lock, flags); + } + } while (!virtqueue_enable_cb(vq)); + spin_unlock_irqrestore(&vcrypto->data_vq[qid].lock, flags); } static int virtcrypto_find_vqs(struct virtio_crypto *vi) @@ -151,8 +150,6 @@ static int virtcrypto_find_vqs(struct virtio_crypto *vi) ret = -ENOMEM; goto err_engine; } - tasklet_init(&vi->data_vq[i].done_task, virtcrypto_done_task, - (unsigned long)&vi->data_vq[i]); } kfree(names); @@ -499,15 +496,12 @@ static void virtcrypto_free_unused_reqs(struct virtio_crypto *vcrypto) static void virtcrypto_remove(struct virtio_device *vdev) { struct virtio_crypto *vcrypto = vdev->priv; - int i; dev_info(&vdev->dev, "Start virtcrypto_remove.\n"); flush_work(&vcrypto->config_work); if (virtcrypto_dev_started(vcrypto)) virtcrypto_dev_stop(vcrypto); - for (i = 0; i < vcrypto->max_data_queues; i++) - tasklet_kill(&vcrypto->data_vq[i].done_task); virtio_reset_device(vdev); virtcrypto_free_unused_reqs(vcrypto); virtcrypto_clear_crypto_engines(vcrypto); diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c index 1f1483a9e525..bd4142431980 100644 --- a/drivers/cxl/core/port.c +++ b/drivers/cxl/core/port.c @@ -1403,7 +1403,7 @@ static int decoder_populate_targets(struct cxl_switch_decoder *cxlsd, return -EINVAL; write_seqlock(&cxlsd->target_lock); - for (i = 0; i < cxlsd->cxld.interleave_ways; i++) { + for (i = 0; i < cxlsd->nr_targets; i++) { struct cxl_dport *dport = find_dport(port, target_map[i]); if (!dport) { diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 2f7187dbfa2d..ebc1b028555c 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -331,7 +331,7 @@ static ssize_t interleave_ways_store(struct device *dev, return rc; /* - * Even for x3, x6, and x12 interleaves the region interleave must be a + * Even for x3, x9, and x12 interleaves the region interleave must be a * power of 2 multiple of the host bridge interleave. */ if (!is_power_of_2(val / cxld->interleave_ways) || diff --git a/drivers/dma/stm32-dma.c b/drivers/dma/stm32-dma.c index 7abcd7f2848e..592d48ecf241 100644 --- a/drivers/dma/stm32-dma.c +++ b/drivers/dma/stm32-dma.c @@ -1249,8 +1249,8 @@ static struct dma_async_tx_descriptor *stm32_dma_prep_dma_memcpy( enum dma_slave_buswidth max_width; struct stm32_dma_desc *desc; size_t xfer_count, offset; - u32 num_sgs, best_burst, threshold; - int dma_burst, i; + u32 num_sgs, best_burst, dma_burst, threshold; + int i; num_sgs = DIV_ROUND_UP(len, STM32_DMA_ALIGNED_MAX_DATA_ITEMS); desc = kzalloc(struct_size(desc, sg_req, num_sgs), GFP_NOWAIT); @@ -1268,10 +1268,6 @@ static struct dma_async_tx_descriptor *stm32_dma_prep_dma_memcpy( best_burst = stm32_dma_get_best_burst(len, STM32_DMA_MAX_BURST, threshold, max_width); dma_burst = stm32_dma_get_burst(chan, best_burst); - if (dma_burst < 0) { - kfree(desc); - return NULL; - } stm32_dma_clear_reg(&desc->sg_req[i].chan_reg); desc->sg_req[i].chan_reg.dma_scr = diff --git a/drivers/edac/thunderx_edac.c b/drivers/edac/thunderx_edac.c index 4dca21b39bf7..f13674081cb6 100644 --- a/drivers/edac/thunderx_edac.c +++ b/drivers/edac/thunderx_edac.c @@ -1133,7 +1133,7 @@ static irqreturn_t thunderx_ocx_com_threaded_isr(int irq, void *irq_id) decode_register(other, OCX_OTHER_SIZE, ocx_com_errors, ctx->reg_com_int); - strlcat(msg, other, OCX_MESSAGE_SIZE); + strncat(msg, other, OCX_MESSAGE_SIZE); for (lane = 0; lane < OCX_RX_LANES; lane++) if (ctx->reg_com_int & BIT(lane)) { @@ -1142,12 +1142,12 @@ static irqreturn_t thunderx_ocx_com_threaded_isr(int irq, void *irq_id) lane, ctx->reg_lane_int[lane], lane, ctx->reg_lane_stat11[lane]); - strlcat(msg, other, OCX_MESSAGE_SIZE); + strncat(msg, other, OCX_MESSAGE_SIZE); decode_register(other, OCX_OTHER_SIZE, ocx_lane_errors, ctx->reg_lane_int[lane]); - strlcat(msg, other, OCX_MESSAGE_SIZE); + strncat(msg, other, OCX_MESSAGE_SIZE); } if (ctx->reg_com_int & OCX_COM_INT_CE) @@ -1217,7 +1217,7 @@ static irqreturn_t thunderx_ocx_lnk_threaded_isr(int irq, void *irq_id) decode_register(other, OCX_OTHER_SIZE, ocx_com_link_errors, ctx->reg_com_link_int); - strlcat(msg, other, OCX_MESSAGE_SIZE); + strncat(msg, other, OCX_MESSAGE_SIZE); if (ctx->reg_com_link_int & OCX_COM_LINK_INT_UE) edac_device_handle_ue(ocx->edac_dev, 0, 0, msg); @@ -1896,7 +1896,7 @@ static irqreturn_t thunderx_l2c_threaded_isr(int irq, void *irq_id) decode_register(other, L2C_OTHER_SIZE, l2_errors, ctx->reg_int); - strlcat(msg, other, L2C_MESSAGE_SIZE); + strncat(msg, other, L2C_MESSAGE_SIZE); if (ctx->reg_int & mask_ue) edac_device_handle_ue(l2c->edac_dev, 0, 0, msg); diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c index 667ff40f3935..17c9d825188b 100644 --- a/drivers/firewire/ohci.c +++ b/drivers/firewire/ohci.c @@ -279,51 +279,6 @@ static char ohci_driver_name[] = KBUILD_MODNAME; #define QUIRK_TI_SLLZ059 0x20 #define QUIRK_IR_WAKE 0x40 -// On PCI Express Root Complex in any type of AMD Ryzen machine, VIA VT6306/6307/6308 with Asmedia -// ASM1083/1085 brings an inconvenience that the read accesses to 'Isochronous Cycle Timer' register -// (at offset 0xf0 in PCI I/O space) often causes unexpected system reboot. The mechanism is not -// clear, since the read access to the other registers is enough safe; e.g. 'Node ID' register, -// while it is probable due to detection of any type of PCIe error. -#define QUIRK_REBOOT_BY_CYCLE_TIMER_READ 0x80000000 - -#if IS_ENABLED(CONFIG_X86) - -static bool has_reboot_by_cycle_timer_read_quirk(const struct fw_ohci *ohci) -{ - return !!(ohci->quirks & QUIRK_REBOOT_BY_CYCLE_TIMER_READ); -} - -#define PCI_DEVICE_ID_ASMEDIA_ASM108X 0x1080 - -static bool detect_vt630x_with_asm1083_on_amd_ryzen_machine(const struct pci_dev *pdev) -{ - const struct pci_dev *pcie_to_pci_bridge; - - // Detect any type of AMD Ryzen machine. - if (!static_cpu_has(X86_FEATURE_ZEN)) - return false; - - // Detect VIA VT6306/6307/6308. - if (pdev->vendor != PCI_VENDOR_ID_VIA) - return false; - if (pdev->device != PCI_DEVICE_ID_VIA_VT630X) - return false; - - // Detect Asmedia ASM1083/1085. - pcie_to_pci_bridge = pdev->bus->self; - if (pcie_to_pci_bridge->vendor != PCI_VENDOR_ID_ASMEDIA) - return false; - if (pcie_to_pci_bridge->device != PCI_DEVICE_ID_ASMEDIA_ASM108X) - return false; - - return true; -} - -#else -#define has_reboot_by_cycle_timer_read_quirk(ohci) false -#define detect_vt630x_with_asm1083_on_amd_ryzen_machine(pdev) false -#endif - /* In case of multiple matches in ohci_quirks[], only the first one is used. */ static const struct { unsigned short vendor, device, revision, flags; @@ -1758,9 +1713,6 @@ static u32 get_cycle_time(struct fw_ohci *ohci) s32 diff01, diff12; int i; - if (has_reboot_by_cycle_timer_read_quirk(ohci)) - return 0; - c2 = reg_read(ohci, OHCI1394_IsochronousCycleTimer); if (ohci->quirks & QUIRK_CYCLE_TIMER) { @@ -3663,9 +3615,6 @@ static int pci_probe(struct pci_dev *dev, if (param_quirks) ohci->quirks = param_quirks; - if (detect_vt630x_with_asm1083_on_amd_ryzen_machine(dev)) - ohci->quirks |= QUIRK_REBOOT_BY_CYCLE_TIMER_READ; - /* * Because dma_alloc_coherent() allocates at least one page, * we save space by using a common buffer for the AR request/ diff --git a/drivers/firmware/arm_scmi/perf.c b/drivers/firmware/arm_scmi/perf.c index 2775bcafe40f..431bda9165c3 100644 --- a/drivers/firmware/arm_scmi/perf.c +++ b/drivers/firmware/arm_scmi/perf.c @@ -131,7 +131,7 @@ struct perf_dom_info { u32 opp_count; u32 sustained_freq_khz; u32 sustained_perf_level; - unsigned long mult_factor; + u32 mult_factor; char name[SCMI_MAX_STR_SIZE]; struct scmi_opp opp[MAX_OPPS]; struct scmi_fc_info *fc_info; @@ -223,8 +223,8 @@ scmi_perf_domain_attributes_get(const struct scmi_protocol_handle *ph, dom_info->mult_factor = 1000; else dom_info->mult_factor = - (dom_info->sustained_freq_khz * 1000UL) - / dom_info->sustained_perf_level; + (dom_info->sustained_freq_khz * 1000) / + dom_info->sustained_perf_level; strscpy(dom_info->name, attr->name, SCMI_SHORT_NAME_MAX_SIZE); } diff --git a/drivers/firmware/meson/meson_sm.c b/drivers/firmware/meson/meson_sm.c index bf19dd66c213..d081a6312627 100644 --- a/drivers/firmware/meson/meson_sm.c +++ b/drivers/firmware/meson/meson_sm.c @@ -313,14 +313,11 @@ static int __init meson_sm_probe(struct platform_device *pdev) platform_set_drvdata(pdev, fw); - if (devm_of_platform_populate(dev)) - goto out_in_base; + pr_info("secure-monitor enabled\n"); if (sysfs_create_group(&pdev->dev.kobj, &meson_sm_sysfs_attr_group)) goto out_in_base; - pr_info("secure-monitor enabled\n"); - return 0; out_in_base: diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c index 6231c98ba291..597d1a367d96 100644 --- a/drivers/firmware/ti_sci.c +++ b/drivers/firmware/ti_sci.c @@ -161,7 +161,7 @@ static int ti_sci_debugfs_create(struct platform_device *pdev, { struct device *dev = &pdev->dev; struct resource *res; - char debug_name[50]; + char debug_name[50] = "ti_sci_debug@"; /* Debug region is optional */ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, @@ -178,10 +178,10 @@ static int ti_sci_debugfs_create(struct platform_device *pdev, /* Setup NULL termination */ info->debug_buffer[info->debug_region_size] = 0; - snprintf(debug_name, sizeof(debug_name), "ti_sci_debug@%s", - dev_name(dev)); - info->d = debugfs_create_file(debug_name, 0444, NULL, info, - &ti_sci_debug_fops); + info->d = debugfs_create_file(strncat(debug_name, dev_name(dev), + sizeof(debug_name) - + sizeof("ti_sci_debug@")), + 0444, NULL, info, &ti_sci_debug_fops); if (IS_ERR(info->d)) return PTR_ERR(info->d); diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c index 6b7d47a52b10..c22fcaa44a61 100644 --- a/drivers/gpio/gpio-dwapb.c +++ b/drivers/gpio/gpio-dwapb.c @@ -283,15 +283,13 @@ static void dwapb_irq_enable(struct irq_data *d) { struct gpio_chip *gc = irq_data_get_irq_chip_data(d); struct dwapb_gpio *gpio = to_dwapb_gpio(gc); - irq_hw_number_t hwirq = irqd_to_hwirq(d); unsigned long flags; u32 val; raw_spin_lock_irqsave(&gc->bgpio_lock, flags); - val = dwapb_read(gpio, GPIO_INTEN) | BIT(hwirq); + val = dwapb_read(gpio, GPIO_INTEN); + val |= BIT(irqd_to_hwirq(d)); dwapb_write(gpio, GPIO_INTEN, val); - val = dwapb_read(gpio, GPIO_INTMASK) & ~BIT(hwirq); - dwapb_write(gpio, GPIO_INTMASK, val); raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags); } @@ -299,14 +297,12 @@ static void dwapb_irq_disable(struct irq_data *d) { struct gpio_chip *gc = irq_data_get_irq_chip_data(d); struct dwapb_gpio *gpio = to_dwapb_gpio(gc); - irq_hw_number_t hwirq = irqd_to_hwirq(d); unsigned long flags; u32 val; raw_spin_lock_irqsave(&gc->bgpio_lock, flags); - val = dwapb_read(gpio, GPIO_INTMASK) | BIT(hwirq); - dwapb_write(gpio, GPIO_INTMASK, val); - val = dwapb_read(gpio, GPIO_INTEN) & ~BIT(hwirq); + val = dwapb_read(gpio, GPIO_INTEN); + val &= ~BIT(irqd_to_hwirq(d)); dwapb_write(gpio, GPIO_INTEN, val); raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags); } diff --git a/drivers/gpio/gpiolib-cdev.c b/drivers/gpio/gpiolib-cdev.c index e40c93f0960b..6ab1cf489d03 100644 --- a/drivers/gpio/gpiolib-cdev.c +++ b/drivers/gpio/gpiolib-cdev.c @@ -2444,7 +2444,10 @@ static int lineinfo_unwatch(struct gpio_chardev_data *cdev, void __user *ip) return 0; } -static long gpio_ioctl_unlocked(struct file *file, unsigned int cmd, unsigned long arg) +/* + * gpio_ioctl() - ioctl handler for the GPIO chardev + */ +static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct gpio_chardev_data *cdev = file->private_data; struct gpio_device *gdev = cdev->gdev; @@ -2481,17 +2484,6 @@ static long gpio_ioctl_unlocked(struct file *file, unsigned int cmd, unsigned lo } } -/* - * gpio_ioctl() - ioctl handler for the GPIO chardev - */ -static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct gpio_chardev_data *cdev = file->private_data; - - return call_ioctl_locked(file, cmd, arg, cdev->gdev, - gpio_ioctl_unlocked); -} - #ifdef CONFIG_COMPAT static long gpio_ioctl_compat(struct file *file, unsigned int cmd, unsigned long arg) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c index 06ab6066da61..fd796574f87a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c @@ -479,9 +479,6 @@ static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf, if (size & 0x3 || *pos & 0x3) return -EINVAL; - if (!adev->didt_rreg) - return -EOPNOTSUPP; - r = pm_runtime_get_sync(adev_to_drm(adev)->dev); if (r < 0) { pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); @@ -538,9 +535,6 @@ static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user if (size & 0x3 || *pos & 0x3) return -EINVAL; - if (!adev->didt_wreg) - return -EOPNOTSUPP; - r = pm_runtime_get_sync(adev_to_drm(adev)->dev); if (r < 0) { pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); @@ -596,7 +590,7 @@ static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf, int r; if (!adev->smc_rreg) - return -EOPNOTSUPP; + return -EPERM; if (size & 0x3 || *pos & 0x3) return -EINVAL; @@ -655,7 +649,7 @@ static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user * int r; if (!adev->smc_wreg) - return -EOPNOTSUPP; + return -EPERM; if (size & 0x3 || *pos & 0x3) return -EINVAL; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index a5352e5e2bd4..8a1b84aaaf71 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -1976,8 +1976,15 @@ static int amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev) adev->firmware.gpu_info_fw = NULL; - if (adev->mman.discovery_bin) - return 0; + if (adev->mman.discovery_bin) { + /* + * FIXME: The bounding box is still needed by Navi12, so + * temporarily read it from gpu_info firmware. Should be dropped + * when DAL no longer needs it. + */ + if (adev->asic_type != CHIP_NAVI12) + return 0; + } switch (adev->asic_type) { default: diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index a8e1f2cfe12d..b9983ca99eb7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -2202,8 +2202,6 @@ retry_init: pci_wake_from_d3(pdev, TRUE); - pci_wake_from_d3(pdev, TRUE); - /* * For runpm implemented via BACO, PMFW will handle the * timing for BACO in and out: diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c index 69b3829bbe53..4642cff0e1a4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c @@ -631,14 +631,13 @@ static void amdgpu_vm_pt_free(struct amdgpu_vm_bo_base *entry) if (!entry->bo) return; - - entry->bo->vm_bo = NULL; shadow = amdgpu_bo_shadowed(entry->bo); if (shadow) { ttm_bo_set_bulk_move(&shadow->tbo, NULL); amdgpu_bo_unref(&shadow); } ttm_bo_set_bulk_move(&entry->bo->tbo, NULL); + entry->bo->vm_bo = NULL; spin_lock(&entry->vm->status_lock); list_del(&entry->vm_status); diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c index 856db876af14..809eca54fc61 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c @@ -1690,32 +1690,6 @@ static void sdma_v5_2_get_clockgating_state(void *handle, u64 *flags) *flags |= AMD_CG_SUPPORT_SDMA_LS; } -static void sdma_v5_2_ring_begin_use(struct amdgpu_ring *ring) -{ - struct amdgpu_device *adev = ring->adev; - - /* SDMA 5.2.3 (RMB) FW doesn't seem to properly - * disallow GFXOFF in some cases leading to - * hangs in SDMA. Disallow GFXOFF while SDMA is active. - * We can probably just limit this to 5.2.3, - * but it shouldn't hurt for other parts since - * this GFXOFF will be disallowed anyway when SDMA is - * active, this just makes it explicit. - */ - amdgpu_gfx_off_ctrl(adev, false); -} - -static void sdma_v5_2_ring_end_use(struct amdgpu_ring *ring) -{ - struct amdgpu_device *adev = ring->adev; - - /* SDMA 5.2.3 (RMB) FW doesn't seem to properly - * disallow GFXOFF in some cases leading to - * hangs in SDMA. Allow GFXOFF when SDMA is complete. - */ - amdgpu_gfx_off_ctrl(adev, true); -} - const struct amd_ip_funcs sdma_v5_2_ip_funcs = { .name = "sdma_v5_2", .early_init = sdma_v5_2_early_init, @@ -1764,8 +1738,6 @@ static const struct amdgpu_ring_funcs sdma_v5_2_ring_funcs = { .test_ib = sdma_v5_2_ring_test_ib, .insert_nop = sdma_v5_2_ring_insert_nop, .pad_ib = sdma_v5_2_ring_pad_ib, - .begin_use = sdma_v5_2_ring_begin_use, - .end_use = sdma_v5_2_ring_end_use, .emit_wreg = sdma_v5_2_ring_emit_wreg, .emit_reg_wait = sdma_v5_2_ring_emit_reg_wait, .emit_reg_write_reg_wait = sdma_v5_2_ring_emit_reg_write_reg_wait, diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index 811dd3ea6362..2eddd7f6cd41 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c @@ -1411,11 +1411,9 @@ static void soc15_common_get_clockgating_state(void *handle, u64 *flags) if (amdgpu_sriov_vf(adev)) *flags = 0; - if (adev->nbio.funcs && adev->nbio.funcs->get_clockgating_state) - adev->nbio.funcs->get_clockgating_state(adev, flags); + adev->nbio.funcs->get_clockgating_state(adev, flags); - if (adev->hdp.funcs && adev->hdp.funcs->get_clock_gating_state) - adev->hdp.funcs->get_clock_gating_state(adev, flags); + adev->hdp.funcs->get_clock_gating_state(adev, flags); if (adev->ip_versions[MP0_HWIP][0] != IP_VERSION(13, 0, 2)) { @@ -1431,11 +1429,9 @@ static void soc15_common_get_clockgating_state(void *handle, u64 *flags) } /* AMD_CG_SUPPORT_ROM_MGCG */ - if (adev->smuio.funcs && adev->smuio.funcs->get_clock_gating_state) - adev->smuio.funcs->get_clock_gating_state(adev, flags); + adev->smuio.funcs->get_clock_gating_state(adev, flags); - if (adev->df.funcs && adev->df.funcs->get_clockgating_state) - adev->df.funcs->get_clockgating_state(adev, flags); + adev->df.funcs->get_clockgating_state(adev, flags); } static int soc15_common_set_powergating_state(void *handle, diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c index 8a7705db0b9a..88bf6221d4be 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c @@ -1019,7 +1019,7 @@ int svm_migrate_init(struct amdgpu_device *adev) } else { res = devm_request_free_mem_region(adev->dev, &iomem_resource, size); if (IS_ERR(res)) - return PTR_ERR(res); + return -ENOMEM; pgmap->range.start = res->start; pgmap->range.end = res->end; pgmap->type = MEMORY_DEVICE_PRIVATE; @@ -1035,10 +1035,11 @@ int svm_migrate_init(struct amdgpu_device *adev) r = devm_memremap_pages(adev->dev, pgmap); if (IS_ERR(r)) { pr_err("failed to register HMM device memory\n"); - if (pgmap->type == MEMORY_DEVICE_PRIVATE) - devm_release_mem_region(adev->dev, res->start, resource_size(res)); /* Disable SVM support capability */ pgmap->type = 0; + if (pgmap->type == MEMORY_DEVICE_PRIVATE) + devm_release_mem_region(adev->dev, res->start, + res->end - res->start + 1); return PTR_ERR(r); } diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c index 705d9e91b5aa..713f893d2530 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c @@ -1403,11 +1403,10 @@ static int kfd_create_indirect_link_prop(struct kfd_topology_device *kdev, int g num_cpu++; } - if (list_empty(&kdev->io_link_props)) - return -ENODATA; - gpu_link = list_first_entry(&kdev->io_link_props, - struct kfd_iolink_properties, list); + struct kfd_iolink_properties, list); + if (!gpu_link) + return -ENOMEM; for (i = 0; i < num_cpu; i++) { /* CPU <--> GPU */ @@ -1485,17 +1484,15 @@ static int kfd_add_peer_prop(struct kfd_topology_device *kdev, peer->gpu->adev)) return ret; - if (list_empty(&kdev->io_link_props)) - return -ENODATA; - iolink1 = list_first_entry(&kdev->io_link_props, - struct kfd_iolink_properties, list); - - if (list_empty(&peer->io_link_props)) - return -ENODATA; + struct kfd_iolink_properties, list); + if (!iolink1) + return -ENOMEM; iolink2 = list_first_entry(&peer->io_link_props, - struct kfd_iolink_properties, list); + struct kfd_iolink_properties, list); + if (!iolink2) + return -ENOMEM; props = kfd_alloc_struct(props); if (!props) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 13e0b521e3db..6d5f3c5fb4a6 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -5104,9 +5104,6 @@ static void fill_dc_dirty_rects(struct drm_plane *plane, if (plane->type == DRM_PLANE_TYPE_CURSOR) return; - if (new_plane_state->rotation != DRM_MODE_ROTATE_0) - goto ffu; - num_clips = drm_plane_get_damage_clips_count(new_plane_state); clips = drm_plane_get_damage_clips(new_plane_state); diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c index 93e40e0a1508..e507d2e1410b 100644 --- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c +++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c @@ -1018,20 +1018,13 @@ static enum bp_result get_ss_info_v4_5( DC_LOG_BIOS("AS_SIGNAL_TYPE_HDMI ss_percentage: %d\n", ss_info->spread_spectrum_percentage); break; case AS_SIGNAL_TYPE_DISPLAY_PORT: - if (bp->base.integrated_info) { - DC_LOG_BIOS("gpuclk_ss_percentage (unit of 0.001 percent): %d\n", bp->base.integrated_info->gpuclk_ss_percentage); - ss_info->spread_spectrum_percentage = - bp->base.integrated_info->gpuclk_ss_percentage; - ss_info->type.CENTER_MODE = - bp->base.integrated_info->gpuclk_ss_type; - } else { - ss_info->spread_spectrum_percentage = + ss_info->spread_spectrum_percentage = disp_cntl_tbl->dp_ss_percentage; - ss_info->spread_spectrum_range = + ss_info->spread_spectrum_range = disp_cntl_tbl->dp_ss_rate_10hz * 10; - if (disp_cntl_tbl->dp_ss_mode & ATOM_SS_CENTRE_SPREAD_MODE) - ss_info->type.CENTER_MODE = true; - } + if (disp_cntl_tbl->dp_ss_mode & ATOM_SS_CENTRE_SPREAD_MODE) + ss_info->type.CENTER_MODE = true; + DC_LOG_BIOS("AS_SIGNAL_TYPE_DISPLAY_PORT ss_percentage: %d\n", ss_info->spread_spectrum_percentage); break; case AS_SIGNAL_TYPE_GPU_PLL: @@ -2837,8 +2830,6 @@ static enum bp_result get_integrated_info_v2_2( info->ma_channel_number = info_v2_2->umachannelnumber; info->dp_ss_control = le16_to_cpu(info_v2_2->reserved1); - info->gpuclk_ss_percentage = info_v2_2->gpuclk_ss_percentage; - info->gpuclk_ss_type = info_v2_2->gpuclk_ss_type; for (i = 0; i < NUMBER_OF_UCHAR_FOR_GUID; ++i) { info->ext_disp_conn_info.gu_id[i] = diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c index 28b83133db91..893991a0eb97 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c @@ -324,7 +324,7 @@ static struct wm_table lpddr5_wm_table = { { .wm_inst = WM_A, .wm_type = WM_TYPE_PSTATE_CHG, - .pstate_latency_us = 129.0, + .pstate_latency_us = 11.65333, .sr_exit_time_us = 11.5, .sr_enter_plus_exit_time_us = 14.5, .valid = true, @@ -332,7 +332,7 @@ static struct wm_table lpddr5_wm_table = { { .wm_inst = WM_B, .wm_type = WM_TYPE_PSTATE_CHG, - .pstate_latency_us = 129.0, + .pstate_latency_us = 11.65333, .sr_exit_time_us = 11.5, .sr_enter_plus_exit_time_us = 14.5, .valid = true, @@ -340,7 +340,7 @@ static struct wm_table lpddr5_wm_table = { { .wm_inst = WM_C, .wm_type = WM_TYPE_PSTATE_CHG, - .pstate_latency_us = 129.0, + .pstate_latency_us = 11.65333, .sr_exit_time_us = 11.5, .sr_enter_plus_exit_time_us = 14.5, .valid = true, @@ -348,7 +348,7 @@ static struct wm_table lpddr5_wm_table = { { .wm_inst = WM_D, .wm_type = WM_TYPE_PSTATE_CHG, - .pstate_latency_us = 129.0, + .pstate_latency_us = 11.65333, .sr_exit_time_us = 11.5, .sr_enter_plus_exit_time_us = 14.5, .valid = true, diff --git a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h index 46c2b991aa10..848db8676adf 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h +++ b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h @@ -465,7 +465,6 @@ struct dc_cursor_mi_param { struct fixed31_32 v_scale_ratio; enum dc_rotation_angle rotation; bool mirror; - struct dc_stream_state *stream; }; /* IPP related types */ diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c index 009b5861a3fe..d84579da6400 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c @@ -3427,8 +3427,7 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx) .h_scale_ratio = pipe_ctx->plane_res.scl_data.ratios.horz, .v_scale_ratio = pipe_ctx->plane_res.scl_data.ratios.vert, .rotation = pipe_ctx->plane_state->rotation, - .mirror = pipe_ctx->plane_state->horizontal_mirror, - .stream = pipe_ctx->stream, + .mirror = pipe_ctx->plane_state->horizontal_mirror }; bool pipe_split_on = false; bool odm_combine_on = (pipe_ctx->next_odm_pipe != NULL) || diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubp.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubp.c index aa252dc26326..4566bc7abf17 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubp.c +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubp.c @@ -1075,16 +1075,8 @@ void hubp2_cursor_set_position( if (src_y_offset < 0) src_y_offset = 0; /* Save necessary cursor info x, y position. w, h is saved in attribute func. */ - if (param->stream->link->psr_settings.psr_version >= DC_PSR_VERSION_SU_1 && - param->rotation != ROTATION_ANGLE_0) { - hubp->cur_rect.x = 0; - hubp->cur_rect.y = 0; - hubp->cur_rect.w = param->stream->timing.h_addressable; - hubp->cur_rect.h = param->stream->timing.v_addressable; - } else { - hubp->cur_rect.x = src_x_offset + param->viewport.x; - hubp->cur_rect.y = src_y_offset + param->viewport.y; - } + hubp->cur_rect.x = src_x_offset + param->viewport.x; + hubp->cur_rect.y = src_y_offset + param->viewport.y; } void hubp2_clk_cntl(struct hubp *hubp, bool enable) diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c index 72bec33e371f..53262f6bc40b 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c @@ -994,8 +994,5 @@ void dcn30_prepare_bandwidth(struct dc *dc, dc->clk_mgr->funcs->set_max_memclk(dc->clk_mgr, dc->clk_mgr->bw_params->clk_table.entries[dc->clk_mgr->bw_params->clk_table.num_entries - 1].memclk_mhz); dcn20_prepare_bandwidth(dc, context); - - dc_dmub_srv_p_state_delegate(dc, - context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching, context); } diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c index ce893fe1c69f..9d224bb2b3df 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c @@ -438,115 +438,7 @@ struct _vcs_dpi_soc_bounding_box_st dcn2_0_nv14_soc = { .use_urgent_burst_bw = 0 }; -struct _vcs_dpi_soc_bounding_box_st dcn2_0_nv12_soc = { - .clock_limits = { - { - .state = 0, - .dcfclk_mhz = 560.0, - .fabricclk_mhz = 560.0, - .dispclk_mhz = 513.0, - .dppclk_mhz = 513.0, - .phyclk_mhz = 540.0, - .socclk_mhz = 560.0, - .dscclk_mhz = 171.0, - .dram_speed_mts = 1069.0, - }, - { - .state = 1, - .dcfclk_mhz = 694.0, - .fabricclk_mhz = 694.0, - .dispclk_mhz = 642.0, - .dppclk_mhz = 642.0, - .phyclk_mhz = 600.0, - .socclk_mhz = 694.0, - .dscclk_mhz = 214.0, - .dram_speed_mts = 1324.0, - }, - { - .state = 2, - .dcfclk_mhz = 875.0, - .fabricclk_mhz = 875.0, - .dispclk_mhz = 734.0, - .dppclk_mhz = 734.0, - .phyclk_mhz = 810.0, - .socclk_mhz = 875.0, - .dscclk_mhz = 245.0, - .dram_speed_mts = 1670.0, - }, - { - .state = 3, - .dcfclk_mhz = 1000.0, - .fabricclk_mhz = 1000.0, - .dispclk_mhz = 1100.0, - .dppclk_mhz = 1100.0, - .phyclk_mhz = 810.0, - .socclk_mhz = 1000.0, - .dscclk_mhz = 367.0, - .dram_speed_mts = 2000.0, - }, - { - .state = 4, - .dcfclk_mhz = 1200.0, - .fabricclk_mhz = 1200.0, - .dispclk_mhz = 1284.0, - .dppclk_mhz = 1284.0, - .phyclk_mhz = 810.0, - .socclk_mhz = 1200.0, - .dscclk_mhz = 428.0, - .dram_speed_mts = 2000.0, - }, - { - .state = 5, - .dcfclk_mhz = 1200.0, - .fabricclk_mhz = 1200.0, - .dispclk_mhz = 1284.0, - .dppclk_mhz = 1284.0, - .phyclk_mhz = 810.0, - .socclk_mhz = 1200.0, - .dscclk_mhz = 428.0, - .dram_speed_mts = 2000.0, - }, - }, - - .num_states = 5, - .sr_exit_time_us = 1.9, - .sr_enter_plus_exit_time_us = 4.4, - .urgent_latency_us = 3.0, - .urgent_latency_pixel_data_only_us = 4.0, - .urgent_latency_pixel_mixed_with_vm_data_us = 4.0, - .urgent_latency_vm_data_only_us = 4.0, - .urgent_out_of_order_return_per_channel_pixel_only_bytes = 4096, - .urgent_out_of_order_return_per_channel_pixel_and_vm_bytes = 4096, - .urgent_out_of_order_return_per_channel_vm_only_bytes = 4096, - .pct_ideal_dram_sdp_bw_after_urgent_pixel_only = 40.0, - .pct_ideal_dram_sdp_bw_after_urgent_pixel_and_vm = 40.0, - .pct_ideal_dram_sdp_bw_after_urgent_vm_only = 40.0, - .max_avg_sdp_bw_use_normal_percent = 40.0, - .max_avg_dram_bw_use_normal_percent = 40.0, - .writeback_latency_us = 12.0, - .ideal_dram_bw_after_urgent_percent = 40.0, - .max_request_size_bytes = 256, - .dram_channel_width_bytes = 16, - .fabric_datapath_to_dcn_data_return_bytes = 64, - .dcn_downspread_percent = 0.5, - .downspread_percent = 0.5, - .dram_page_open_time_ns = 50.0, - .dram_rw_turnaround_time_ns = 17.5, - .dram_return_buffer_per_channel_bytes = 8192, - .round_trip_ping_latency_dcfclk_cycles = 131, - .urgent_out_of_order_return_per_channel_bytes = 4096, - .channel_interleave_bytes = 256, - .num_banks = 8, - .num_chans = 16, - .vmm_page_size_bytes = 4096, - .dram_clock_change_latency_us = 45.0, - .writeback_dram_clock_change_latency_us = 23.0, - .return_bus_width_bytes = 64, - .dispclk_dppclk_vco_speed_mhz = 3850, - .xfc_bus_transport_time_us = 20, - .xfc_xbuf_latency_tolerance_us = 50, - .use_urgent_burst_bw = 0, -}; +struct _vcs_dpi_soc_bounding_box_st dcn2_0_nv12_soc = { 0 }; struct _vcs_dpi_ip_params_st dcn2_1_ip = { .odm_capable = 1, diff --git a/drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h b/drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h index 813463ffe15c..bc96d0211360 100644 --- a/drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h +++ b/drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h @@ -417,8 +417,6 @@ struct integrated_info { /* V2.1 */ struct edp_info edp1_info; struct edp_info edp2_info; - uint32_t gpuclk_ss_percentage; - uint32_t gpuclk_ss_type; }; /* diff --git a/drivers/gpu/drm/amd/display/modules/power/power_helpers.c b/drivers/gpu/drm/amd/display/modules/power/power_helpers.c index 67287ad07226..9edd39322c82 100644 --- a/drivers/gpu/drm/amd/display/modules/power/power_helpers.c +++ b/drivers/gpu/drm/amd/display/modules/power/power_helpers.c @@ -816,8 +816,6 @@ bool is_psr_su_specific_panel(struct dc_link *link) ((dpcd_caps->sink_dev_id_str[1] == 0x08 && dpcd_caps->sink_dev_id_str[0] == 0x08) || (dpcd_caps->sink_dev_id_str[1] == 0x08 && dpcd_caps->sink_dev_id_str[0] == 0x07))) isPSRSUSupported = false; - else if (dpcd_caps->sink_dev_id_str[1] == 0x08 && dpcd_caps->sink_dev_id_str[0] == 0x03) - isPSRSUSupported = false; else if (dpcd_caps->psr_info.force_psrsu_cap == 0x1) isPSRSUSupported = true; } diff --git a/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c b/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c index d17bfa111aa7..f5e08b60f66e 100644 --- a/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c +++ b/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c @@ -2748,8 +2748,10 @@ static int kv_parse_power_table(struct amdgpu_device *adev) non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *) &non_clock_info_array->nonClockInfo[non_clock_array_index]; ps = kzalloc(sizeof(struct kv_ps), GFP_KERNEL); - if (ps == NULL) + if (ps == NULL) { + kfree(adev->pm.dpm.ps); return -ENOMEM; + } adev->pm.dpm.ps[i].ps_priv = ps; k = 0; idx = (u8 *)&power_state->v2.clockInfoIndex[0]; diff --git a/drivers/gpu/drm/amd/pm/legacy-dpm/legacy_dpm.c b/drivers/gpu/drm/amd/pm/legacy-dpm/legacy_dpm.c index 291223ea7ba7..d3fe149d8476 100644 --- a/drivers/gpu/drm/amd/pm/legacy-dpm/legacy_dpm.c +++ b/drivers/gpu/drm/amd/pm/legacy-dpm/legacy_dpm.c @@ -272,8 +272,10 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) le16_to_cpu(power_info->pplib4.usVddcDependencyOnSCLKOffset)); ret = amdgpu_parse_clk_voltage_dep_table(&adev->pm.dpm.dyn_state.vddc_dependency_on_sclk, dep_table); - if (ret) + if (ret) { + amdgpu_free_extended_power_table(adev); return ret; + } } if (power_info->pplib4.usVddciDependencyOnMCLKOffset) { dep_table = (ATOM_PPLIB_Clock_Voltage_Dependency_Table *) @@ -281,8 +283,10 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) le16_to_cpu(power_info->pplib4.usVddciDependencyOnMCLKOffset)); ret = amdgpu_parse_clk_voltage_dep_table(&adev->pm.dpm.dyn_state.vddci_dependency_on_mclk, dep_table); - if (ret) + if (ret) { + amdgpu_free_extended_power_table(adev); return ret; + } } if (power_info->pplib4.usVddcDependencyOnMCLKOffset) { dep_table = (ATOM_PPLIB_Clock_Voltage_Dependency_Table *) @@ -290,8 +294,10 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) le16_to_cpu(power_info->pplib4.usVddcDependencyOnMCLKOffset)); ret = amdgpu_parse_clk_voltage_dep_table(&adev->pm.dpm.dyn_state.vddc_dependency_on_mclk, dep_table); - if (ret) + if (ret) { + amdgpu_free_extended_power_table(adev); return ret; + } } if (power_info->pplib4.usMvddDependencyOnMCLKOffset) { dep_table = (ATOM_PPLIB_Clock_Voltage_Dependency_Table *) @@ -299,8 +305,10 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) le16_to_cpu(power_info->pplib4.usMvddDependencyOnMCLKOffset)); ret = amdgpu_parse_clk_voltage_dep_table(&adev->pm.dpm.dyn_state.mvdd_dependency_on_mclk, dep_table); - if (ret) + if (ret) { + amdgpu_free_extended_power_table(adev); return ret; + } } if (power_info->pplib4.usMaxClockVoltageOnDCOffset) { ATOM_PPLIB_Clock_Voltage_Limit_Table *clk_v = @@ -331,8 +339,10 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) kcalloc(psl->ucNumEntries, sizeof(struct amdgpu_phase_shedding_limits_entry), GFP_KERNEL); - if (!adev->pm.dpm.dyn_state.phase_shedding_limits_table.entries) + if (!adev->pm.dpm.dyn_state.phase_shedding_limits_table.entries) { + amdgpu_free_extended_power_table(adev); return -ENOMEM; + } entry = &psl->entries[0]; for (i = 0; i < psl->ucNumEntries; i++) { @@ -373,8 +383,10 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) ATOM_PPLIB_CAC_Leakage_Record *entry; u32 size = cac_table->ucNumEntries * sizeof(struct amdgpu_cac_leakage_table); adev->pm.dpm.dyn_state.cac_leakage_table.entries = kzalloc(size, GFP_KERNEL); - if (!adev->pm.dpm.dyn_state.cac_leakage_table.entries) + if (!adev->pm.dpm.dyn_state.cac_leakage_table.entries) { + amdgpu_free_extended_power_table(adev); return -ENOMEM; + } entry = &cac_table->entries[0]; for (i = 0; i < cac_table->ucNumEntries; i++) { if (adev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_EVV) { @@ -426,8 +438,10 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) sizeof(struct amdgpu_vce_clock_voltage_dependency_entry); adev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries = kzalloc(size, GFP_KERNEL); - if (!adev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries) + if (!adev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries) { + amdgpu_free_extended_power_table(adev); return -ENOMEM; + } adev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.count = limits->numEntries; entry = &limits->entries[0]; @@ -479,8 +493,10 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) sizeof(struct amdgpu_uvd_clock_voltage_dependency_entry); adev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries = kzalloc(size, GFP_KERNEL); - if (!adev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries) + if (!adev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries) { + amdgpu_free_extended_power_table(adev); return -ENOMEM; + } adev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.count = limits->numEntries; entry = &limits->entries[0]; @@ -509,8 +525,10 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) sizeof(struct amdgpu_clock_voltage_dependency_entry); adev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries = kzalloc(size, GFP_KERNEL); - if (!adev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries) + if (!adev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries) { + amdgpu_free_extended_power_table(adev); return -ENOMEM; + } adev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.count = limits->numEntries; entry = &limits->entries[0]; @@ -530,8 +548,10 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) le16_to_cpu(ext_hdr->usPPMTableOffset)); adev->pm.dpm.dyn_state.ppm_table = kzalloc(sizeof(struct amdgpu_ppm_table), GFP_KERNEL); - if (!adev->pm.dpm.dyn_state.ppm_table) + if (!adev->pm.dpm.dyn_state.ppm_table) { + amdgpu_free_extended_power_table(adev); return -ENOMEM; + } adev->pm.dpm.dyn_state.ppm_table->ppm_design = ppm->ucPpmDesign; adev->pm.dpm.dyn_state.ppm_table->cpu_core_number = le16_to_cpu(ppm->usCpuCoreNumber); @@ -563,8 +583,10 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) sizeof(struct amdgpu_clock_voltage_dependency_entry); adev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries = kzalloc(size, GFP_KERNEL); - if (!adev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries) + if (!adev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries) { + amdgpu_free_extended_power_table(adev); return -ENOMEM; + } adev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.count = limits->numEntries; entry = &limits->entries[0]; @@ -584,8 +606,10 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) ATOM_PowerTune_Table *pt; adev->pm.dpm.dyn_state.cac_tdp_table = kzalloc(sizeof(struct amdgpu_cac_tdp_table), GFP_KERNEL); - if (!adev->pm.dpm.dyn_state.cac_tdp_table) + if (!adev->pm.dpm.dyn_state.cac_tdp_table) { + amdgpu_free_extended_power_table(adev); return -ENOMEM; + } if (rev > 0) { ATOM_PPLIB_POWERTUNE_Table_V1 *ppt = (ATOM_PPLIB_POWERTUNE_Table_V1 *) (mode_info->atom_context->bios + data_offset + @@ -621,8 +645,10 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) ret = amdgpu_parse_clk_voltage_dep_table( &adev->pm.dpm.dyn_state.vddgfx_dependency_on_sclk, dep_table); - if (ret) + if (ret) { + kfree(adev->pm.dpm.dyn_state.vddgfx_dependency_on_sclk.entries); return ret; + } } } diff --git a/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c b/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c index dc0a6fba7050..c89cfef7cafa 100644 --- a/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c +++ b/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c @@ -7379,9 +7379,10 @@ static int si_dpm_init(struct amdgpu_device *adev) kcalloc(4, sizeof(struct amdgpu_clock_voltage_dependency_entry), GFP_KERNEL); - if (!adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries) + if (!adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries) { + amdgpu_free_extended_power_table(adev); return -ENOMEM; - + } adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.count = 4; adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].clk = 0; adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].v = 0; diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c index 5e9410117712..a31a62a1ce0b 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c @@ -2987,8 +2987,6 @@ static int smu7_hwmgr_backend_init(struct pp_hwmgr *hwmgr) result = smu7_get_evv_voltages(hwmgr); if (result) { pr_info("Get EVV Voltage Failed. Abort Driver loading!\n"); - kfree(hwmgr->backend); - hwmgr->backend = NULL; return -EINVAL; } } else { @@ -3034,10 +3032,8 @@ static int smu7_hwmgr_backend_init(struct pp_hwmgr *hwmgr) } result = smu7_update_edc_leakage_table(hwmgr); - if (result) { - smu7_hwmgr_backend_fini(hwmgr); + if (result) return result; - } return 0; } diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-hdcp.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-hdcp.c index 5e3b8edcf794..946212a95598 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-hdcp.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-hdcp.c @@ -403,8 +403,7 @@ static int _cdns_mhdp_hdcp_disable(struct cdns_mhdp_device *mhdp) static int _cdns_mhdp_hdcp_enable(struct cdns_mhdp_device *mhdp, u8 content_type) { - int ret = -EINVAL; - int tries = 3; + int ret, tries = 3; u32 i; for (i = 0; i < tries; i++) { diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c index 926ab5c3c31a..7ef78283e3d3 100644 --- a/drivers/gpu/drm/bridge/tc358767.c +++ b/drivers/gpu/drm/bridge/tc358767.c @@ -2097,7 +2097,7 @@ static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id) } else { if (tc->hpd_pin < 0 || tc->hpd_pin > 1) { dev_err(dev, "failed to parse HPD number\n"); - return -EINVAL; + return ret; } } diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c index ff4d0564122a..1b5c27ed2737 100644 --- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c @@ -527,7 +527,6 @@ static ssize_t ti_sn_aux_transfer(struct drm_dp_aux *aux, u32 request_val = AUX_CMD_REQ(msg->request); u8 *buf = msg->buffer; unsigned int len = msg->size; - unsigned int short_len; unsigned int val; int ret; u8 addr_len[SN_AUX_LENGTH_REG + 1 - SN_AUX_ADDR_19_16_REG]; @@ -601,8 +600,7 @@ static ssize_t ti_sn_aux_transfer(struct drm_dp_aux *aux, } if (val & AUX_IRQ_STATUS_AUX_SHORT) { - ret = regmap_read(pdata->regmap, SN_AUX_LENGTH_REG, &short_len); - len = min(len, short_len); + ret = regmap_read(pdata->regmap, SN_AUX_LENGTH_REG, &len); if (ret) goto exit; } else if (val & AUX_IRQ_STATUS_NAT_I2C_FAIL) { diff --git a/drivers/gpu/drm/bridge/ti-tpd12s015.c b/drivers/gpu/drm/bridge/ti-tpd12s015.c index b588fea12502..e0e015243a60 100644 --- a/drivers/gpu/drm/bridge/ti-tpd12s015.c +++ b/drivers/gpu/drm/bridge/ti-tpd12s015.c @@ -179,7 +179,7 @@ static int tpd12s015_probe(struct platform_device *pdev) return 0; } -static int tpd12s015_remove(struct platform_device *pdev) +static int __exit tpd12s015_remove(struct platform_device *pdev) { struct tpd12s015_device *tpd = platform_get_drvdata(pdev); @@ -197,7 +197,7 @@ MODULE_DEVICE_TABLE(of, tpd12s015_of_match); static struct platform_driver tpd12s015_driver = { .probe = tpd12s015_probe, - .remove = tpd12s015_remove, + .remove = __exit_p(tpd12s015_remove), .driver = { .name = "tpd12s015", .of_match_table = tpd12s015_of_match, diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index cb90e70d85e8..df9bf3c9206e 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -715,7 +715,8 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, struct drm_mode_set set; uint32_t __user *set_connectors_ptr; struct drm_modeset_acquire_ctx ctx; - int ret, i, num_connectors = 0; + int ret; + int i; if (!drm_core_check_feature(dev, DRIVER_MODESET)) return -EOPNOTSUPP; @@ -870,7 +871,6 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, connector->name); connector_set[i] = connector; - num_connectors++; } } @@ -879,7 +879,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, set.y = crtc_req->y; set.mode = mode; set.connectors = connector_set; - set.num_connectors = num_connectors; + set.num_connectors = crtc_req->count_connectors; set.fb = fb; if (drm_drv_uses_atomic_modeset(dev)) @@ -892,7 +892,7 @@ out: drm_framebuffer_put(fb); if (connector_set) { - for (i = 0; i < num_connectors; i++) { + for (i = 0; i < crtc_req->count_connectors; i++) { if (connector_set[i]) drm_connector_put(connector_set[i]); } diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index d41a5eaa3e89..203bf8d6c34c 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c @@ -895,11 +895,8 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags) goto err_minors; } - if (drm_core_check_feature(dev, DRIVER_MODESET)) { - ret = drm_modeset_register_all(dev); - if (ret) - goto err_unload; - } + if (drm_core_check_feature(dev, DRIVER_MODESET)) + drm_modeset_register_all(dev); DRM_INFO("Initialized %s %d.%d.%d %s for %s on minor %d\n", driver->name, driver->major, driver->minor, @@ -909,9 +906,6 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags) goto out_unlock; -err_unload: - if (dev->driver->unload) - dev->driver->unload(dev); err_minors: remove_compat_control_link(dev); drm_minor_unregister(dev, DRM_MINOR_PRIMARY); diff --git a/drivers/gpu/drm/exynos/exynos_drm_dma.c b/drivers/gpu/drm/exynos/exynos_drm_dma.c index e2c7373f20c6..a971590b8132 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dma.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dma.c @@ -107,16 +107,18 @@ int exynos_drm_register_dma(struct drm_device *drm, struct device *dev, return 0; if (!priv->mapping) { - void *mapping = NULL; + void *mapping; if (IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)) mapping = arm_iommu_create_mapping(&platform_bus_type, EXYNOS_DEV_ADDR_START, EXYNOS_DEV_ADDR_SIZE); else if (IS_ENABLED(CONFIG_IOMMU_DMA)) mapping = iommu_get_domain_for_dev(priv->dma_dev); + else + mapping = ERR_PTR(-ENODEV); - if (!mapping) - return -ENODEV; + if (IS_ERR(mapping)) + return PTR_ERR(mapping); priv->mapping = mapping; } diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c index 1a7194a653ae..b7c11bdce2c8 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c @@ -1861,8 +1861,6 @@ static int hdmi_bind(struct device *dev, struct device *master, void *data) return ret; crtc = exynos_drm_crtc_get_by_type(drm_dev, EXYNOS_DISPLAY_TYPE_HDMI); - if (IS_ERR(crtc)) - return PTR_ERR(crtc); crtc->pipe_clk = &hdata->phy_clk; ret = hdmi_create_connector(encoder); diff --git a/drivers/gpu/drm/i915/display/intel_atomic.c b/drivers/gpu/drm/i915/display/intel_atomic.c index a502af0b6dd4..18f0a5ae3bac 100644 --- a/drivers/gpu/drm/i915/display/intel_atomic.c +++ b/drivers/gpu/drm/i915/display/intel_atomic.c @@ -41,7 +41,6 @@ #include "intel_global_state.h" #include "intel_hdcp.h" #include "intel_psr.h" -#include "intel_fb.h" #include "skl_universal_plane.h" /** @@ -303,6 +302,198 @@ intel_crtc_destroy_state(struct drm_crtc *crtc, kfree(crtc_state); } +static void intel_atomic_setup_scaler(struct intel_crtc_scaler_state *scaler_state, + int num_scalers_need, struct intel_crtc *intel_crtc, + const char *name, int idx, + struct intel_plane_state *plane_state, + int *scaler_id) +{ + struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev); + int j; + u32 mode; + + if (*scaler_id < 0) { + /* find a free scaler */ + for (j = 0; j < intel_crtc->num_scalers; j++) { + if (scaler_state->scalers[j].in_use) + continue; + + *scaler_id = j; + scaler_state->scalers[*scaler_id].in_use = 1; + break; + } + } + + if (drm_WARN(&dev_priv->drm, *scaler_id < 0, + "Cannot find scaler for %s:%d\n", name, idx)) + return; + + /* set scaler mode */ + if (plane_state && plane_state->hw.fb && + plane_state->hw.fb->format->is_yuv && + plane_state->hw.fb->format->num_planes > 1) { + struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); + if (DISPLAY_VER(dev_priv) == 9) { + mode = SKL_PS_SCALER_MODE_NV12; + } else if (icl_is_hdr_plane(dev_priv, plane->id)) { + /* + * On gen11+'s HDR planes we only use the scaler for + * scaling. They have a dedicated chroma upsampler, so + * we don't need the scaler to upsample the UV plane. + */ + mode = PS_SCALER_MODE_NORMAL; + } else { + struct intel_plane *linked = + plane_state->planar_linked_plane; + + mode = PS_SCALER_MODE_PLANAR; + + if (linked) + mode |= PS_PLANE_Y_SEL(linked->id); + } + } else if (DISPLAY_VER(dev_priv) >= 10) { + mode = PS_SCALER_MODE_NORMAL; + } else if (num_scalers_need == 1 && intel_crtc->num_scalers > 1) { + /* + * when only 1 scaler is in use on a pipe with 2 scalers + * scaler 0 operates in high quality (HQ) mode. + * In this case use scaler 0 to take advantage of HQ mode + */ + scaler_state->scalers[*scaler_id].in_use = 0; + *scaler_id = 0; + scaler_state->scalers[0].in_use = 1; + mode = SKL_PS_SCALER_MODE_HQ; + } else { + mode = SKL_PS_SCALER_MODE_DYN; + } + + drm_dbg_kms(&dev_priv->drm, "Attached scaler id %u.%u to %s:%d\n", + intel_crtc->pipe, *scaler_id, name, idx); + scaler_state->scalers[*scaler_id].mode = mode; +} + +/** + * intel_atomic_setup_scalers() - setup scalers for crtc per staged requests + * @dev_priv: i915 device + * @intel_crtc: intel crtc + * @crtc_state: incoming crtc_state to validate and setup scalers + * + * This function sets up scalers based on staged scaling requests for + * a @crtc and its planes. It is called from crtc level check path. If request + * is a supportable request, it attaches scalers to requested planes and crtc. + * + * This function takes into account the current scaler(s) in use by any planes + * not being part of this atomic state + * + * Returns: + * 0 - scalers were setup succesfully + * error code - otherwise + */ +int intel_atomic_setup_scalers(struct drm_i915_private *dev_priv, + struct intel_crtc *intel_crtc, + struct intel_crtc_state *crtc_state) +{ + struct drm_plane *plane = NULL; + struct intel_plane *intel_plane; + struct intel_plane_state *plane_state = NULL; + struct intel_crtc_scaler_state *scaler_state = + &crtc_state->scaler_state; + struct drm_atomic_state *drm_state = crtc_state->uapi.state; + struct intel_atomic_state *intel_state = to_intel_atomic_state(drm_state); + int num_scalers_need; + int i; + + num_scalers_need = hweight32(scaler_state->scaler_users); + + /* + * High level flow: + * - staged scaler requests are already in scaler_state->scaler_users + * - check whether staged scaling requests can be supported + * - add planes using scalers that aren't in current transaction + * - assign scalers to requested users + * - as part of plane commit, scalers will be committed + * (i.e., either attached or detached) to respective planes in hw + * - as part of crtc_commit, scaler will be either attached or detached + * to crtc in hw + */ + + /* fail if required scalers > available scalers */ + if (num_scalers_need > intel_crtc->num_scalers){ + drm_dbg_kms(&dev_priv->drm, + "Too many scaling requests %d > %d\n", + num_scalers_need, intel_crtc->num_scalers); + return -EINVAL; + } + + /* walkthrough scaler_users bits and start assigning scalers */ + for (i = 0; i < sizeof(scaler_state->scaler_users) * 8; i++) { + int *scaler_id; + const char *name; + int idx; + + /* skip if scaler not required */ + if (!(scaler_state->scaler_users & (1 << i))) + continue; + + if (i == SKL_CRTC_INDEX) { + name = "CRTC"; + idx = intel_crtc->base.base.id; + + /* panel fitter case: assign as a crtc scaler */ + scaler_id = &scaler_state->scaler_id; + } else { + name = "PLANE"; + + /* plane scaler case: assign as a plane scaler */ + /* find the plane that set the bit as scaler_user */ + plane = drm_state->planes[i].ptr; + + /* + * to enable/disable hq mode, add planes that are using scaler + * into this transaction + */ + if (!plane) { + struct drm_plane_state *state; + + /* + * GLK+ scalers don't have a HQ mode so it + * isn't necessary to change between HQ and dyn mode + * on those platforms. + */ + if (DISPLAY_VER(dev_priv) >= 10) + continue; + + plane = drm_plane_from_index(&dev_priv->drm, i); + state = drm_atomic_get_plane_state(drm_state, plane); + if (IS_ERR(state)) { + drm_dbg_kms(&dev_priv->drm, + "Failed to add [PLANE:%d] to drm_state\n", + plane->base.id); + return PTR_ERR(state); + } + } + + intel_plane = to_intel_plane(plane); + idx = plane->base.id; + + /* plane on different crtc cannot be a scaler user of this crtc */ + if (drm_WARN_ON(&dev_priv->drm, + intel_plane->pipe != intel_crtc->pipe)) + continue; + + plane_state = intel_atomic_get_new_plane_state(intel_state, + intel_plane); + scaler_id = &plane_state->scaler_id; + } + + intel_atomic_setup_scaler(scaler_state, num_scalers_need, + intel_crtc, name, idx, + plane_state, scaler_id); + } + + return 0; +} + struct drm_atomic_state * intel_atomic_state_alloc(struct drm_device *dev) { diff --git a/drivers/gpu/drm/i915/display/intel_atomic.h b/drivers/gpu/drm/i915/display/intel_atomic.h index e506f6a87344..1dc439983dd9 100644 --- a/drivers/gpu/drm/i915/display/intel_atomic.h +++ b/drivers/gpu/drm/i915/display/intel_atomic.h @@ -52,4 +52,8 @@ struct intel_crtc_state * intel_atomic_get_crtc_state(struct drm_atomic_state *state, struct intel_crtc *crtc); +int intel_atomic_setup_scalers(struct drm_i915_private *dev_priv, + struct intel_crtc *intel_crtc, + struct intel_crtc_state *crtc_state); + #endif /* __INTEL_ATOMIC_H__ */ diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index fb8d1d63407a..1777a12f2f42 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -6481,17 +6481,6 @@ static int intel_async_flip_check_uapi(struct intel_atomic_state *state, return -EINVAL; } - /* - * FIXME: Bigjoiner+async flip is busted currently. - * Remove this check once the issues are fixed. - */ - if (new_crtc_state->bigjoiner_pipes) { - drm_dbg_kms(&i915->drm, - "[CRTC:%d:%s] async flip disallowed with bigjoiner\n", - crtc->base.base.id, crtc->base.name); - return -EINVAL; - } - for_each_oldnew_intel_plane_in_state(state, plane, old_plane_state, new_plane_state, i) { if (plane->pipe != crtc->pipe) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 4699c2110226..5970f4149090 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -3707,7 +3707,7 @@ static void intel_dp_process_phy_request(struct intel_dp *intel_dp, intel_dp->train_set, crtc_state->lane_count); drm_dp_set_phy_test_pattern(&intel_dp->aux, data, - intel_dp->dpcd[DP_DPCD_REV]); + link_status[DP_DPCD_REV]); } static u8 intel_dp_autotest_phy_pattern(struct intel_dp *intel_dp) diff --git a/drivers/gpu/drm/i915/display/intel_fb.c b/drivers/gpu/drm/i915/display/intel_fb.c index c69a638796c6..eefa33c555ac 100644 --- a/drivers/gpu/drm/i915/display/intel_fb.c +++ b/drivers/gpu/drm/i915/display/intel_fb.c @@ -1176,8 +1176,7 @@ bool intel_fb_needs_pot_stride_remap(const struct intel_framebuffer *fb) { struct drm_i915_private *i915 = to_i915(fb->base.dev); - return (IS_ALDERLAKE_P(i915) || DISPLAY_VER(i915) >= 14) && - intel_fb_uses_dpt(&fb->base); + return IS_ALDERLAKE_P(i915) && fb->base.modifier != DRM_FORMAT_MOD_LINEAR; } static int intel_fb_pitch(const struct intel_framebuffer *fb, int color_plane, unsigned int rotation) @@ -1313,11 +1312,9 @@ plane_view_scanout_stride(const struct intel_framebuffer *fb, int color_plane, unsigned int tile_width, unsigned int src_stride_tiles, unsigned int dst_stride_tiles) { - struct drm_i915_private *i915 = to_i915(fb->base.dev); unsigned int stride_tiles; - if ((IS_ALDERLAKE_P(i915) || DISPLAY_VER(i915) >= 14) && - src_stride_tiles < dst_stride_tiles) + if (IS_ALDERLAKE_P(to_i915(fb->base.dev))) stride_tiles = src_stride_tiles; else stride_tiles = dst_stride_tiles; @@ -1444,20 +1441,8 @@ static u32 calc_plane_remap_info(const struct intel_framebuffer *fb, int color_p size += remap_info->size; } else { - unsigned int dst_stride; - - /* - * The hardware automagically calculates the CCS AUX surface - * stride from the main surface stride so can't really remap a - * smaller subset (unless we'd remap in whole AUX page units). - */ - if (intel_fb_needs_pot_stride_remap(fb) && - intel_fb_is_ccs_modifier(fb->base.modifier)) - dst_stride = remap_info->src_stride; - else - dst_stride = remap_info->width; - - dst_stride = plane_view_dst_stride_tiles(fb, color_plane, dst_stride); + unsigned int dst_stride = plane_view_dst_stride_tiles(fb, color_plane, + remap_info->width); assign_chk_ovf(i915, remap_info->dst_stride, dst_stride); color_plane_info->mapping_stride = dst_stride * @@ -1523,8 +1508,7 @@ static void intel_fb_view_init(struct drm_i915_private *i915, struct intel_fb_vi memset(view, 0, sizeof(*view)); view->gtt.type = view_type; - if (view_type == I915_GTT_VIEW_REMAPPED && - (IS_ALDERLAKE_P(i915) || DISPLAY_VER(i915) >= 14)) + if (view_type == I915_GTT_VIEW_REMAPPED && IS_ALDERLAKE_P(i915)) view->gtt.remapped.plane_alignment = SZ_2M / PAGE_SIZE; } diff --git a/drivers/gpu/drm/i915/display/skl_scaler.c b/drivers/gpu/drm/i915/display/skl_scaler.c index 0b74f91e865d..90f42f63128e 100644 --- a/drivers/gpu/drm/i915/display/skl_scaler.c +++ b/drivers/gpu/drm/i915/display/skl_scaler.c @@ -337,263 +337,6 @@ int skl_update_scaler_plane(struct intel_crtc_state *crtc_state, return 0; } -static int intel_atomic_setup_scaler(struct intel_crtc_scaler_state *scaler_state, - int num_scalers_need, struct intel_crtc *intel_crtc, - const char *name, int idx, - struct intel_plane_state *plane_state, - int *scaler_id) -{ - struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev); - int j; - u32 mode; - - if (*scaler_id < 0) { - /* find a free scaler */ - for (j = 0; j < intel_crtc->num_scalers; j++) { - if (scaler_state->scalers[j].in_use) - continue; - - *scaler_id = j; - scaler_state->scalers[*scaler_id].in_use = 1; - break; - } - } - - if (drm_WARN(&dev_priv->drm, *scaler_id < 0, - "Cannot find scaler for %s:%d\n", name, idx)) - return -EINVAL; - - /* set scaler mode */ - if (plane_state && plane_state->hw.fb && - plane_state->hw.fb->format->is_yuv && - plane_state->hw.fb->format->num_planes > 1) { - struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); - - if (DISPLAY_VER(dev_priv) == 9) { - mode = SKL_PS_SCALER_MODE_NV12; - } else if (icl_is_hdr_plane(dev_priv, plane->id)) { - /* - * On gen11+'s HDR planes we only use the scaler for - * scaling. They have a dedicated chroma upsampler, so - * we don't need the scaler to upsample the UV plane. - */ - mode = PS_SCALER_MODE_NORMAL; - } else { - struct intel_plane *linked = - plane_state->planar_linked_plane; - - mode = PS_SCALER_MODE_PLANAR; - - if (linked) - mode |= PS_PLANE_Y_SEL(linked->id); - } - } else if (DISPLAY_VER(dev_priv) >= 10) { - mode = PS_SCALER_MODE_NORMAL; - } else if (num_scalers_need == 1 && intel_crtc->num_scalers > 1) { - /* - * when only 1 scaler is in use on a pipe with 2 scalers - * scaler 0 operates in high quality (HQ) mode. - * In this case use scaler 0 to take advantage of HQ mode - */ - scaler_state->scalers[*scaler_id].in_use = 0; - *scaler_id = 0; - scaler_state->scalers[0].in_use = 1; - mode = SKL_PS_SCALER_MODE_HQ; - } else { - mode = SKL_PS_SCALER_MODE_DYN; - } - - /* - * FIXME: we should also check the scaler factors for pfit, so - * this shouldn't be tied directly to planes. - */ - if (plane_state && plane_state->hw.fb) { - const struct drm_framebuffer *fb = plane_state->hw.fb; - const struct drm_rect *src = &plane_state->uapi.src; - const struct drm_rect *dst = &plane_state->uapi.dst; - int hscale, vscale, max_vscale, max_hscale; - - /* - * FIXME: When two scalers are needed, but only one of - * them needs to downscale, we should make sure that - * the one that needs downscaling support is assigned - * as the first scaler, so we don't reject downscaling - * unnecessarily. - */ - - if (DISPLAY_VER(dev_priv) >= 14) { - /* - * On versions 14 and up, only the first - * scaler supports a vertical scaling factor - * of more than 1.0, while a horizontal - * scaling factor of 3.0 is supported. - */ - max_hscale = 0x30000 - 1; - if (*scaler_id == 0) - max_vscale = 0x30000 - 1; - else - max_vscale = 0x10000; - - } else if (DISPLAY_VER(dev_priv) >= 10 || - !intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier)) { - max_hscale = 0x30000 - 1; - max_vscale = 0x30000 - 1; - } else { - max_hscale = 0x20000 - 1; - max_vscale = 0x20000 - 1; - } - - /* - * FIXME: We should change the if-else block above to - * support HQ vs dynamic scaler properly. - */ - - /* Check if required scaling is within limits */ - hscale = drm_rect_calc_hscale(src, dst, 1, max_hscale); - vscale = drm_rect_calc_vscale(src, dst, 1, max_vscale); - - if (hscale < 0 || vscale < 0) { - drm_dbg_kms(&dev_priv->drm, - "Scaler %d doesn't support required plane scaling\n", - *scaler_id); - drm_rect_debug_print("src: ", src, true); - drm_rect_debug_print("dst: ", dst, false); - - return -EINVAL; - } - } - - drm_dbg_kms(&dev_priv->drm, "Attached scaler id %u.%u to %s:%d\n", - intel_crtc->pipe, *scaler_id, name, idx); - scaler_state->scalers[*scaler_id].mode = mode; - - return 0; -} - -/** - * intel_atomic_setup_scalers() - setup scalers for crtc per staged requests - * @dev_priv: i915 device - * @intel_crtc: intel crtc - * @crtc_state: incoming crtc_state to validate and setup scalers - * - * This function sets up scalers based on staged scaling requests for - * a @crtc and its planes. It is called from crtc level check path. If request - * is a supportable request, it attaches scalers to requested planes and crtc. - * - * This function takes into account the current scaler(s) in use by any planes - * not being part of this atomic state - * - * Returns: - * 0 - scalers were setup successfully - * error code - otherwise - */ -int intel_atomic_setup_scalers(struct drm_i915_private *dev_priv, - struct intel_crtc *intel_crtc, - struct intel_crtc_state *crtc_state) -{ - struct drm_plane *plane = NULL; - struct intel_plane *intel_plane; - struct intel_crtc_scaler_state *scaler_state = - &crtc_state->scaler_state; - struct drm_atomic_state *drm_state = crtc_state->uapi.state; - struct intel_atomic_state *intel_state = to_intel_atomic_state(drm_state); - int num_scalers_need; - int i; - - num_scalers_need = hweight32(scaler_state->scaler_users); - - /* - * High level flow: - * - staged scaler requests are already in scaler_state->scaler_users - * - check whether staged scaling requests can be supported - * - add planes using scalers that aren't in current transaction - * - assign scalers to requested users - * - as part of plane commit, scalers will be committed - * (i.e., either attached or detached) to respective planes in hw - * - as part of crtc_commit, scaler will be either attached or detached - * to crtc in hw - */ - - /* fail if required scalers > available scalers */ - if (num_scalers_need > intel_crtc->num_scalers) { - drm_dbg_kms(&dev_priv->drm, - "Too many scaling requests %d > %d\n", - num_scalers_need, intel_crtc->num_scalers); - return -EINVAL; - } - - /* walkthrough scaler_users bits and start assigning scalers */ - for (i = 0; i < sizeof(scaler_state->scaler_users) * 8; i++) { - struct intel_plane_state *plane_state = NULL; - int *scaler_id; - const char *name; - int idx, ret; - - /* skip if scaler not required */ - if (!(scaler_state->scaler_users & (1 << i))) - continue; - - if (i == SKL_CRTC_INDEX) { - name = "CRTC"; - idx = intel_crtc->base.base.id; - - /* panel fitter case: assign as a crtc scaler */ - scaler_id = &scaler_state->scaler_id; - } else { - name = "PLANE"; - - /* plane scaler case: assign as a plane scaler */ - /* find the plane that set the bit as scaler_user */ - plane = drm_state->planes[i].ptr; - - /* - * to enable/disable hq mode, add planes that are using scaler - * into this transaction - */ - if (!plane) { - struct drm_plane_state *state; - - /* - * GLK+ scalers don't have a HQ mode so it - * isn't necessary to change between HQ and dyn mode - * on those platforms. - */ - if (DISPLAY_VER(dev_priv) >= 10) - continue; - - plane = drm_plane_from_index(&dev_priv->drm, i); - state = drm_atomic_get_plane_state(drm_state, plane); - if (IS_ERR(state)) { - drm_dbg_kms(&dev_priv->drm, - "Failed to add [PLANE:%d] to drm_state\n", - plane->base.id); - return PTR_ERR(state); - } - } - - intel_plane = to_intel_plane(plane); - idx = plane->base.id; - - /* plane on different crtc cannot be a scaler user of this crtc */ - if (drm_WARN_ON(&dev_priv->drm, - intel_plane->pipe != intel_crtc->pipe)) - continue; - - plane_state = intel_atomic_get_new_plane_state(intel_state, - intel_plane); - scaler_id = &plane_state->scaler_id; - } - - ret = intel_atomic_setup_scaler(scaler_state, num_scalers_need, - intel_crtc, name, idx, - plane_state, scaler_id); - if (ret < 0) - return ret; - } - - return 0; -} - static int glk_coef_tap(int i) { return i % 7; diff --git a/drivers/gpu/drm/i915/display/skl_scaler.h b/drivers/gpu/drm/i915/display/skl_scaler.h index f040f6ac061f..0097d5d08e10 100644 --- a/drivers/gpu/drm/i915/display/skl_scaler.h +++ b/drivers/gpu/drm/i915/display/skl_scaler.h @@ -8,22 +8,17 @@ #include enum drm_scaling_filter; -enum pipe; struct drm_i915_private; -struct intel_crtc; struct intel_crtc_state; -struct intel_plane; struct intel_plane_state; +struct intel_plane; +enum pipe; int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state); int skl_update_scaler_plane(struct intel_crtc_state *crtc_state, struct intel_plane_state *plane_state); -int intel_atomic_setup_scalers(struct drm_i915_private *dev_priv, - struct intel_crtc *intel_crtc, - struct intel_crtc_state *crtc_state); - void skl_pfit_enable(const struct intel_crtc_state *crtc_state); void skl_program_plane_scaler(struct intel_plane *plane, @@ -31,5 +26,4 @@ void skl_program_plane_scaler(struct intel_plane *plane, const struct intel_plane_state *plane_state); void skl_detach_scalers(const struct intel_crtc_state *crtc_state); void skl_scaler_disable(const struct intel_crtc_state *old_crtc_state); - #endif diff --git a/drivers/gpu/drm/mediatek/mtk_disp_merge.c b/drivers/gpu/drm/mediatek/mtk_disp_merge.c index 211140e87568..6428b6203ffe 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_merge.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_merge.c @@ -104,7 +104,7 @@ void mtk_merge_stop_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt) mtk_ddp_write(cmdq_pkt, 0, &priv->cmdq_reg, priv->regs, DISP_REG_MERGE_CTRL); - if (!cmdq_pkt && priv->async_clk) + if (priv->async_clk) reset_control_reset(priv->reset_ctl); } diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c index 519e23a2a017..2c850b6d945b 100644 --- a/drivers/gpu/drm/mediatek/mtk_dp.c +++ b/drivers/gpu/drm/mediatek/mtk_dp.c @@ -2669,4 +2669,3 @@ MODULE_AUTHOR("Markus Schneider-Pargmann "); MODULE_AUTHOR("Bo-Chen Chen "); MODULE_DESCRIPTION("MediaTek DisplayPort Driver"); MODULE_LICENSE("GPL"); -MODULE_SOFTDEP("pre: phy_mtk_dp"); diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c index 558000db4a10..7fb52a573436 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c @@ -736,7 +736,6 @@ static void mtk_drm_crtc_atomic_begin(struct drm_crtc *crtc, crtc); struct mtk_crtc_state *mtk_crtc_state = to_mtk_crtc_state(crtc_state); struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); - unsigned long flags; if (mtk_crtc->event && mtk_crtc_state->base.event) DRM_ERROR("new event while there is still a pending event\n"); @@ -744,11 +743,7 @@ static void mtk_drm_crtc_atomic_begin(struct drm_crtc *crtc, if (mtk_crtc_state->base.event) { mtk_crtc_state->base.event->pipe = drm_crtc_index(crtc); WARN_ON(drm_crtc_vblank_get(crtc) != 0); - - spin_lock_irqsave(&crtc->dev->event_lock, flags); mtk_crtc->event = mtk_crtc_state->base.event; - spin_unlock_irqrestore(&crtc->dev->event_lock, flags); - mtk_crtc_state->base.event = NULL; } } diff --git a/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c b/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c index b288bb6eeecc..eecfa98ff52e 100644 --- a/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c +++ b/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c @@ -223,7 +223,8 @@ int mtk_mdp_rdma_clk_enable(struct device *dev) { struct mtk_mdp_rdma *rdma = dev_get_drvdata(dev); - return clk_prepare_enable(rdma->clk); + clk_prepare_enable(rdma->clk); + return 0; } void mtk_mdp_rdma_clk_disable(struct device *dev) diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h index aebd09e2d408..f0c2349404b4 100644 --- a/drivers/gpu/drm/mgag200/mgag200_drv.h +++ b/drivers/gpu/drm/mgag200/mgag200_drv.h @@ -390,11 +390,6 @@ void mgag200_primary_plane_helper_atomic_disable(struct drm_plane *plane, .destroy = drm_plane_cleanup, \ DRM_GEM_SHADOW_PLANE_FUNCS -void mgag200_crtc_set_gamma_linear(struct mga_device *mdev, const struct drm_format_info *format); -void mgag200_crtc_set_gamma(struct mga_device *mdev, - const struct drm_format_info *format, - struct drm_color_lut *lut); - enum drm_mode_status mgag200_crtc_helper_mode_valid(struct drm_crtc *crtc, const struct drm_display_mode *mode); int mgag200_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *new_state); diff --git a/drivers/gpu/drm/mgag200/mgag200_g200er.c b/drivers/gpu/drm/mgag200/mgag200_g200er.c index 8d4538b71047..bce267e0f7de 100644 --- a/drivers/gpu/drm/mgag200/mgag200_g200er.c +++ b/drivers/gpu/drm/mgag200/mgag200_g200er.c @@ -202,11 +202,6 @@ static void mgag200_g200er_crtc_helper_atomic_enable(struct drm_crtc *crtc, mgag200_g200er_reset_tagfifo(mdev); - if (crtc_state->gamma_lut) - mgag200_crtc_set_gamma(mdev, format, crtc_state->gamma_lut->data); - else - mgag200_crtc_set_gamma_linear(mdev, format); - mgag200_enable_display(mdev); if (funcs->enable_vidrst) diff --git a/drivers/gpu/drm/mgag200/mgag200_g200ev.c b/drivers/gpu/drm/mgag200/mgag200_g200ev.c index 56e6f986bff3..ac957f42abe1 100644 --- a/drivers/gpu/drm/mgag200/mgag200_g200ev.c +++ b/drivers/gpu/drm/mgag200/mgag200_g200ev.c @@ -203,11 +203,6 @@ static void mgag200_g200ev_crtc_helper_atomic_enable(struct drm_crtc *crtc, mgag200_g200ev_set_hiprilvl(mdev); - if (crtc_state->gamma_lut) - mgag200_crtc_set_gamma(mdev, format, crtc_state->gamma_lut->data); - else - mgag200_crtc_set_gamma_linear(mdev, format); - mgag200_enable_display(mdev); if (funcs->enable_vidrst) diff --git a/drivers/gpu/drm/mgag200/mgag200_g200se.c b/drivers/gpu/drm/mgag200/mgag200_g200se.c index ff2b3c6622e7..bd6e573c9a1a 100644 --- a/drivers/gpu/drm/mgag200/mgag200_g200se.c +++ b/drivers/gpu/drm/mgag200/mgag200_g200se.c @@ -334,11 +334,6 @@ static void mgag200_g200se_crtc_helper_atomic_enable(struct drm_crtc *crtc, mgag200_g200se_set_hiprilvl(mdev, adjusted_mode, format); - if (crtc_state->gamma_lut) - mgag200_crtc_set_gamma(mdev, format, crtc_state->gamma_lut->data); - else - mgag200_crtc_set_gamma_linear(mdev, format); - mgag200_enable_display(mdev); if (funcs->enable_vidrst) diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c index 554adf05e073..ae90b260312a 100644 --- a/drivers/gpu/drm/mgag200/mgag200_mode.c +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c @@ -28,8 +28,8 @@ * This file contains setup code for the CRTC. */ -void mgag200_crtc_set_gamma_linear(struct mga_device *mdev, - const struct drm_format_info *format) +static void mgag200_crtc_set_gamma_linear(struct mga_device *mdev, + const struct drm_format_info *format) { int i; @@ -65,9 +65,9 @@ void mgag200_crtc_set_gamma_linear(struct mga_device *mdev, } } -void mgag200_crtc_set_gamma(struct mga_device *mdev, - const struct drm_format_info *format, - struct drm_color_lut *lut) +static void mgag200_crtc_set_gamma(struct mga_device *mdev, + const struct drm_format_info *format, + struct drm_color_lut *lut) { int i; diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c index 5a5821e59dc1..6c0ffe8e4adb 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark @@ -124,7 +124,7 @@ static void dpu_crtc_setup_lm_misr(struct dpu_crtc_state *crtc_state) continue; /* Calculate MISR over 1 frame */ - m->hw_lm->ops.setup_misr(m->hw_lm); + m->hw_lm->ops.setup_misr(m->hw_lm, true, 1); } } diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c index b0eb881f8af1..547f9f2b9fcb 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c @@ -2,7 +2,7 @@ /* * Copyright (C) 2013 Red Hat * Copyright (c) 2014-2018, 2020-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Author: Rob Clark */ @@ -257,7 +257,7 @@ void dpu_encoder_setup_misr(const struct drm_encoder *drm_enc) if (!phys->hw_intf || !phys->hw_intf->ops.setup_misr) continue; - phys->hw_intf->ops.setup_misr(phys->hw_intf); + phys->hw_intf->ops.setup_misr(phys->hw_intf, true, 1); } } diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c index 384558d2f960..b9dddf576c02 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. */ @@ -322,9 +322,9 @@ static u32 dpu_hw_intf_get_line_count(struct dpu_hw_intf *intf) return DPU_REG_READ(c, INTF_LINE_COUNT); } -static void dpu_hw_intf_setup_misr(struct dpu_hw_intf *intf) +static void dpu_hw_intf_setup_misr(struct dpu_hw_intf *intf, bool enable, u32 frame_count) { - dpu_hw_setup_misr(&intf->hw, INTF_MISR_CTRL, 0x1); + dpu_hw_setup_misr(&intf->hw, INTF_MISR_CTRL, enable, frame_count); } static int dpu_hw_intf_collect_misr(struct dpu_hw_intf *intf, u32 *misr_value) diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h index e75339b96a1d..643dd10bc030 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. */ @@ -80,7 +80,7 @@ struct dpu_hw_intf_ops { void (*bind_pingpong_blk)(struct dpu_hw_intf *intf, bool enable, const enum dpu_pingpong pp); - void (*setup_misr)(struct dpu_hw_intf *intf); + void (*setup_misr)(struct dpu_hw_intf *intf, bool enable, u32 frame_count); int (*collect_misr)(struct dpu_hw_intf *intf, u32 *misr_value); }; diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c index cc04fb979fb5..f5120ea91ede 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved. */ @@ -99,9 +99,9 @@ static void dpu_hw_lm_setup_border_color(struct dpu_hw_mixer *ctx, } } -static void dpu_hw_lm_setup_misr(struct dpu_hw_mixer *ctx) +static void dpu_hw_lm_setup_misr(struct dpu_hw_mixer *ctx, bool enable, u32 frame_count) { - dpu_hw_setup_misr(&ctx->hw, LM_MISR_CTRL, 0x0); + dpu_hw_setup_misr(&ctx->hw, LM_MISR_CTRL, enable, frame_count); } static int dpu_hw_lm_collect_misr(struct dpu_hw_mixer *ctx, u32 *misr_value) diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h index 0a050eb247b9..652ddfdedec3 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h @@ -1,6 +1,5 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved. */ @@ -58,7 +57,7 @@ struct dpu_hw_lm_ops { /** * setup_misr: Enable/disable MISR */ - void (*setup_misr)(struct dpu_hw_mixer *ctx); + void (*setup_misr)(struct dpu_hw_mixer *ctx, bool enable, u32 frame_count); /** * collect_misr: Read MISR signature diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c index 1b7439ae686a..8062228eada6 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. */ #define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__ @@ -450,11 +450,9 @@ u64 _dpu_hw_get_qos_lut(const struct dpu_qos_lut_tbl *tbl, return 0; } -/* - * note: Aside from encoders, input_sel should be set to 0x0 by default - */ void dpu_hw_setup_misr(struct dpu_hw_blk_reg_map *c, - u32 misr_ctrl_offset, u8 input_sel) + u32 misr_ctrl_offset, + bool enable, u32 frame_count) { u32 config = 0; @@ -463,9 +461,15 @@ void dpu_hw_setup_misr(struct dpu_hw_blk_reg_map *c, /* Clear old MISR value (in case it's read before a new value is calculated)*/ wmb(); - config = MISR_FRAME_COUNT | MISR_CTRL_ENABLE | MISR_CTRL_FREE_RUN_MASK | - ((input_sel & 0xF) << 24); - DPU_REG_WRITE(c, misr_ctrl_offset, config); + if (enable) { + config = (frame_count & MISR_FRAME_COUNT_MASK) | + MISR_CTRL_ENABLE | MISR_CTRL_FREE_RUN_MASK; + + DPU_REG_WRITE(c, misr_ctrl_offset, config); + } else { + DPU_REG_WRITE(c, misr_ctrl_offset, 0); + } + } int dpu_hw_collect_misr(struct dpu_hw_blk_reg_map *c, diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h index 4ae2a434372c..27f4c39e35ab 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved. */ @@ -13,7 +13,7 @@ #include "dpu_hw_catalog.h" #define REG_MASK(n) ((BIT(n)) - 1) -#define MISR_FRAME_COUNT 0x1 +#define MISR_FRAME_COUNT_MASK 0xFF #define MISR_CTRL_ENABLE BIT(8) #define MISR_CTRL_STATUS BIT(9) #define MISR_CTRL_STATUS_CLEAR BIT(10) @@ -350,7 +350,9 @@ u64 _dpu_hw_get_qos_lut(const struct dpu_qos_lut_tbl *tbl, u32 total_fl); void dpu_hw_setup_misr(struct dpu_hw_blk_reg_map *c, - u32 misr_ctrl_offset, u8 input_sel); + u32 misr_ctrl_offset, + bool enable, + u32 frame_count); int dpu_hw_collect_misr(struct dpu_hw_blk_reg_map *c, u32 misr_ctrl_offset, diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c index 3100957225a7..169f9de4a12a 100644 --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c @@ -269,7 +269,6 @@ static void mdp4_crtc_atomic_disable(struct drm_crtc *crtc, { struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); struct mdp4_kms *mdp4_kms = get_kms(crtc); - unsigned long flags; DBG("%s", mdp4_crtc->name); @@ -282,14 +281,6 @@ static void mdp4_crtc_atomic_disable(struct drm_crtc *crtc, mdp_irq_unregister(&mdp4_kms->base, &mdp4_crtc->err); mdp4_disable(mdp4_kms); - if (crtc->state->event && !crtc->state->active) { - WARN_ON(mdp4_crtc->event); - spin_lock_irqsave(&mdp4_kms->dev->event_lock, flags); - drm_crtc_send_vblank_event(crtc, crtc->state->event); - crtc->state->event = NULL; - spin_unlock_irqrestore(&mdp4_kms->dev->event_lock, flags); - } - mdp4_crtc->enabled = false; } diff --git a/drivers/gpu/drm/nouveau/nv04_fence.c b/drivers/gpu/drm/nouveau/nv04_fence.c index cdbc75e3d1f6..5b71a5a5cd85 100644 --- a/drivers/gpu/drm/nouveau/nv04_fence.c +++ b/drivers/gpu/drm/nouveau/nv04_fence.c @@ -39,7 +39,7 @@ struct nv04_fence_priv { static int nv04_fence_emit(struct nouveau_fence *fence) { - struct nvif_push *push = unrcu_pointer(fence->channel)->chan.push; + struct nvif_push *push = fence->channel->chan.push; int ret = PUSH_WAIT(push, 2); if (ret == 0) { PUSH_NVSQ(push, NV_SW, 0x0150, fence->base.seqno); diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmtu102.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmtu102.c index 5a08458fe1b7..6cb5eefa45e9 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmtu102.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmtu102.c @@ -31,7 +31,7 @@ tu102_vmm_flush(struct nvkm_vmm *vmm, int depth) type |= 0x00000001; /* PAGE_ALL */ if (atomic_read(&vmm->engref[NVKM_SUBDEV_BAR])) - type |= 0x00000006; /* HUB_ONLY | ALL PDB (hack) */ + type |= 0x00000004; /* HUB_ONLY */ mutex_lock(&vmm->mmu->mutex); diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index 5b6d1668f405..eaf67b9e5f12 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c @@ -68,6 +68,7 @@ static void omap_atomic_commit_tail(struct drm_atomic_state *old_state) { struct drm_device *dev = old_state->dev; struct omap_drm_private *priv = dev->dev_private; + bool fence_cookie = dma_fence_begin_signalling(); dispc_runtime_get(priv->dispc); @@ -90,8 +91,6 @@ static void omap_atomic_commit_tail(struct drm_atomic_state *old_state) omap_atomic_wait_for_completion(dev, old_state); drm_atomic_helper_commit_planes(dev, old_state, 0); - - drm_atomic_helper_commit_hw_done(old_state); } else { /* * OMAP3 DSS seems to have issues with the work-around above, @@ -101,10 +100,12 @@ static void omap_atomic_commit_tail(struct drm_atomic_state *old_state) drm_atomic_helper_commit_planes(dev, old_state, 0); drm_atomic_helper_commit_modeset_enables(dev, old_state); - - drm_atomic_helper_commit_hw_done(old_state); } + drm_atomic_helper_commit_hw_done(old_state); + + dma_fence_end_signalling(fence_cookie); + /* * Wait for completion of the page flips to ensure that old buffers * can't be touched by the hardware anymore before cleaning up planes. diff --git a/drivers/gpu/drm/panel/panel-elida-kd35t133.c b/drivers/gpu/drm/panel/panel-elida-kd35t133.c index 3a7fc3ca6a6f..eee714cf3f49 100644 --- a/drivers/gpu/drm/panel/panel-elida-kd35t133.c +++ b/drivers/gpu/drm/panel/panel-elida-kd35t133.c @@ -112,8 +112,6 @@ static int kd35t133_unprepare(struct drm_panel *panel) return ret; } - gpiod_set_value_cansleep(ctx->reset_gpio, 1); - regulator_disable(ctx->iovcc); regulator_disable(ctx->vdd); diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7701.c b/drivers/gpu/drm/panel/panel-sitronix-st7701.c index 54b28992db5d..225b9884f61a 100644 --- a/drivers/gpu/drm/panel/panel-sitronix-st7701.c +++ b/drivers/gpu/drm/panel/panel-sitronix-st7701.c @@ -288,7 +288,7 @@ static void st7701_init_sequence(struct st7701 *st7701) FIELD_PREP(DSI_CMD2_BK1_PWRCTRL2_AVDD_MASK, DIV_ROUND_CLOSEST(desc->avdd_mv - 6200, 200)) | FIELD_PREP(DSI_CMD2_BK1_PWRCTRL2_AVCL_MASK, - DIV_ROUND_CLOSEST(-4400 - desc->avcl_mv, 200))); + DIV_ROUND_CLOSEST(-4400 + desc->avcl_mv, 200))); /* T2D = 0.2us * T2D[3:0] */ ST7701_DSI(st7701, DSI_CMD2_BK1_SPD1, diff --git a/drivers/gpu/drm/panfrost/panfrost_gpu.c b/drivers/gpu/drm/panfrost/panfrost_gpu.c index 55d243048516..6452e4e900dd 100644 --- a/drivers/gpu/drm/panfrost/panfrost_gpu.c +++ b/drivers/gpu/drm/panfrost/panfrost_gpu.c @@ -71,12 +71,7 @@ int panfrost_gpu_soft_reset(struct panfrost_device *pfdev) } gpu_write(pfdev, GPU_INT_CLEAR, GPU_IRQ_MASK_ALL); - - /* Only enable the interrupts we care about */ - gpu_write(pfdev, GPU_INT_MASK, - GPU_IRQ_MASK_ERROR | - GPU_IRQ_PERFCNT_SAMPLE_COMPLETED | - GPU_IRQ_CLEAN_CACHES_COMPLETED); + gpu_write(pfdev, GPU_INT_MASK, GPU_IRQ_MASK_ALL); return 0; } @@ -318,38 +313,28 @@ static void panfrost_gpu_init_features(struct panfrost_device *pfdev) pfdev->features.shader_present, pfdev->features.l2_present); } -static u64 panfrost_get_core_mask(struct panfrost_device *pfdev) -{ - u64 core_mask; - - if (pfdev->features.l2_present == 1) - return U64_MAX; - - /* - * Only support one core group now. - * ~(l2_present - 1) unsets all bits in l2_present except - * the bottom bit. (l2_present - 2) has all the bits in - * the first core group set. AND them together to generate - * a mask of cores in the first core group. - */ - core_mask = ~(pfdev->features.l2_present - 1) & - (pfdev->features.l2_present - 2); - dev_info_once(pfdev->dev, "using only 1st core group (%lu cores from %lu)\n", - hweight64(core_mask), - hweight64(pfdev->features.shader_present)); - - return core_mask; -} - void panfrost_gpu_power_on(struct panfrost_device *pfdev) { int ret; u32 val; - u64 core_mask; + u64 core_mask = U64_MAX; panfrost_gpu_init_quirks(pfdev); - core_mask = panfrost_get_core_mask(pfdev); + if (pfdev->features.l2_present != 1) { + /* + * Only support one core group now. + * ~(l2_present - 1) unsets all bits in l2_present except + * the bottom bit. (l2_present - 2) has all the bits in + * the first core group set. AND them together to generate + * a mask of cores in the first core group. + */ + core_mask = ~(pfdev->features.l2_present - 1) & + (pfdev->features.l2_present - 2); + dev_info_once(pfdev->dev, "using only 1st core group (%lu cores from %lu)\n", + hweight64(core_mask), + hweight64(pfdev->features.shader_present)); + } gpu_write(pfdev, L2_PWRON_LO, pfdev->features.l2_present & core_mask); ret = readl_relaxed_poll_timeout(pfdev->iomem + L2_READY_LO, val, val == (pfdev->features.l2_present & core_mask), @@ -374,26 +359,9 @@ void panfrost_gpu_power_on(struct panfrost_device *pfdev) void panfrost_gpu_power_off(struct panfrost_device *pfdev) { - int ret; - u32 val; - - gpu_write(pfdev, SHADER_PWROFF_LO, pfdev->features.shader_present); - ret = readl_relaxed_poll_timeout(pfdev->iomem + SHADER_PWRTRANS_LO, - val, !val, 1, 1000); - if (ret) - dev_err(pfdev->dev, "shader power transition timeout"); - - gpu_write(pfdev, TILER_PWROFF_LO, pfdev->features.tiler_present); - ret = readl_relaxed_poll_timeout(pfdev->iomem + TILER_PWRTRANS_LO, - val, !val, 1, 1000); - if (ret) - dev_err(pfdev->dev, "tiler power transition timeout"); - - gpu_write(pfdev, L2_PWROFF_LO, pfdev->features.l2_present); - ret = readl_poll_timeout(pfdev->iomem + L2_PWRTRANS_LO, - val, !val, 0, 1000); - if (ret) - dev_err(pfdev->dev, "l2 power transition timeout"); + gpu_write(pfdev, TILER_PWROFF_LO, 0); + gpu_write(pfdev, SHADER_PWROFF_LO, 0); + gpu_write(pfdev, L2_PWROFF_LO, 0); } int panfrost_gpu_init(struct panfrost_device *pfdev) diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index f336b5b3b11f..d4f09ecc3d22 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c @@ -2321,7 +2321,7 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track) switch (prim_walk) { case 1: for (i = 0; i < track->num_arrays; i++) { - size = track->arrays[i].esize * track->max_indx * 4UL; + size = track->arrays[i].esize * track->max_indx * 4; if (track->arrays[i].robj == NULL) { DRM_ERROR("(PW %u) Vertex array %u no buffer " "bound\n", prim_walk, i); @@ -2340,7 +2340,7 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track) break; case 2: for (i = 0; i < track->num_arrays; i++) { - size = track->arrays[i].esize * (nverts - 1) * 4UL; + size = track->arrays[i].esize * (nverts - 1) * 4; if (track->arrays[i].robj == NULL) { DRM_ERROR("(PW %u) Vertex array %u no buffer " "bound\n", prim_walk, i); diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c index 6cf54a747749..638f861af80f 100644 --- a/drivers/gpu/drm/radeon/r600_cs.c +++ b/drivers/gpu/drm/radeon/r600_cs.c @@ -1275,7 +1275,7 @@ static int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx) return -EINVAL; } tmp = (reg - CB_COLOR0_BASE) / 4; - track->cb_color_bo_offset[tmp] = (u64)radeon_get_ib_value(p, idx) << 8; + track->cb_color_bo_offset[tmp] = radeon_get_ib_value(p, idx) << 8; ib[idx] += (u32)((reloc->gpu_offset >> 8) & 0xffffffff); track->cb_color_base_last[tmp] = ib[idx]; track->cb_color_bo[tmp] = reloc->robj; @@ -1302,7 +1302,7 @@ static int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx) "0x%04X\n", reg); return -EINVAL; } - track->htile_offset = (u64)radeon_get_ib_value(p, idx) << 8; + track->htile_offset = radeon_get_ib_value(p, idx) << 8; ib[idx] += (u32)((reloc->gpu_offset >> 8) & 0xffffffff); track->htile_bo = reloc->robj; track->db_dirty = true; diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 1814bb8e14f1..ca5598ae8bfc 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c @@ -687,16 +687,11 @@ static void radeon_crtc_init(struct drm_device *dev, int index) if (radeon_crtc == NULL) return; - radeon_crtc->flip_queue = alloc_workqueue("radeon-crtc", WQ_HIGHPRI, 0); - if (!radeon_crtc->flip_queue) { - kfree(radeon_crtc); - return; - } - drm_crtc_init(dev, &radeon_crtc->base, &radeon_crtc_funcs); drm_mode_crtc_set_gamma_size(&radeon_crtc->base, 256); radeon_crtc->crtc_id = index; + radeon_crtc->flip_queue = alloc_workqueue("radeon-crtc", WQ_HIGHPRI, 0); rdev->mode_info.crtcs[index] = radeon_crtc; if (rdev->family >= CHIP_BONAIRE) { diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c index c38b4d5d6a14..987cabbf1318 100644 --- a/drivers/gpu/drm/radeon/radeon_vm.c +++ b/drivers/gpu/drm/radeon/radeon_vm.c @@ -1204,17 +1204,13 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm) r = radeon_bo_create(rdev, pd_size, align, true, RADEON_GEM_DOMAIN_VRAM, 0, NULL, NULL, &vm->page_directory); - if (r) { - kfree(vm->page_tables); - vm->page_tables = NULL; + if (r) return r; - } + r = radeon_vm_clear_bo(rdev, vm->page_directory); if (r) { radeon_bo_unref(&vm->page_directory); vm->page_directory = NULL; - kfree(vm->page_tables); - vm->page_tables = NULL; return r; } diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index 85e9cba49cec..a91012447b56 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c @@ -3611,10 +3611,6 @@ static int si_cp_start(struct radeon_device *rdev) for (i = RADEON_RING_TYPE_GFX_INDEX; i <= CAYMAN_RING_TYPE_CP2_INDEX; ++i) { ring = &rdev->ring[i]; r = radeon_ring_lock(rdev, ring, 2); - if (r) { - DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); - return r; - } /* clear the compute context state */ radeon_ring_write(ring, PACKET3_COMPUTE(PACKET3_CLEAR_STATE, 0)); diff --git a/drivers/gpu/drm/radeon/sumo_dpm.c b/drivers/gpu/drm/radeon/sumo_dpm.c index d49c145db437..f74f381af05f 100644 --- a/drivers/gpu/drm/radeon/sumo_dpm.c +++ b/drivers/gpu/drm/radeon/sumo_dpm.c @@ -1493,10 +1493,8 @@ static int sumo_parse_power_table(struct radeon_device *rdev) non_clock_array_index = power_state->v2.nonClockInfoIndex; non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *) &non_clock_info_array->nonClockInfo[non_clock_array_index]; - if (!rdev->pm.power_state[i].clock_info) { - kfree(rdev->pm.dpm.ps); + if (!rdev->pm.power_state[i].clock_info) return -EINVAL; - } ps = kzalloc(sizeof(struct sumo_ps), GFP_KERNEL); if (ps == NULL) { kfree(rdev->pm.dpm.ps); diff --git a/drivers/gpu/drm/radeon/trinity_dpm.c b/drivers/gpu/drm/radeon/trinity_dpm.c index ef1cc7bad20a..08ea1c864cb2 100644 --- a/drivers/gpu/drm/radeon/trinity_dpm.c +++ b/drivers/gpu/drm/radeon/trinity_dpm.c @@ -1726,10 +1726,8 @@ static int trinity_parse_power_table(struct radeon_device *rdev) non_clock_array_index = power_state->v2.nonClockInfoIndex; non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *) &non_clock_info_array->nonClockInfo[non_clock_array_index]; - if (!rdev->pm.power_state[i].clock_info) { - kfree(rdev->pm.dpm.ps); + if (!rdev->pm.power_state[i].clock_info) return -EINVAL; - } ps = kzalloc(sizeof(struct sumo_ps), GFP_KERNEL); if (ps == NULL) { kfree(rdev->pm.dpm.ps); diff --git a/drivers/gpu/drm/tidss/tidss_dispc.c b/drivers/gpu/drm/tidss/tidss_dispc.c index 95b75236fe5e..16301bdfead1 100644 --- a/drivers/gpu/drm/tidss/tidss_dispc.c +++ b/drivers/gpu/drm/tidss/tidss_dispc.c @@ -2653,69 +2653,18 @@ static void dispc_init_errata(struct dispc_device *dispc) } } -static int dispc_softreset(struct dispc_device *dispc) +static void dispc_softreset(struct dispc_device *dispc) { u32 val; int ret = 0; - /* K2G display controller does not support soft reset */ - if (dispc->feat->subrev == DISPC_K2G) - return 0; - /* Soft reset */ REG_FLD_MOD(dispc, DSS_SYSCONFIG, 1, 1, 1); /* Wait for reset to complete */ ret = readl_poll_timeout(dispc->base_common + DSS_SYSSTATUS, val, val & 1, 100, 5000); - if (ret) { - dev_err(dispc->dev, "failed to reset dispc\n"); - return ret; - } - - return 0; -} - -static int dispc_init_hw(struct dispc_device *dispc) -{ - struct device *dev = dispc->dev; - int ret; - - ret = pm_runtime_set_active(dev); - if (ret) { - dev_err(dev, "Failed to set DSS PM to active\n"); - return ret; - } - - ret = clk_prepare_enable(dispc->fclk); - if (ret) { - dev_err(dev, "Failed to enable DSS fclk\n"); - goto err_runtime_suspend; - } - - ret = dispc_softreset(dispc); if (ret) - goto err_clk_disable; - - clk_disable_unprepare(dispc->fclk); - ret = pm_runtime_set_suspended(dev); - if (ret) { - dev_err(dev, "Failed to set DSS PM to suspended\n"); - return ret; - } - - return 0; - -err_clk_disable: - clk_disable_unprepare(dispc->fclk); - -err_runtime_suspend: - ret = pm_runtime_set_suspended(dev); - if (ret) { - dev_err(dev, "Failed to set DSS PM to suspended\n"); - return ret; - } - - return ret; + dev_warn(dispc->dev, "failed to reset dispc\n"); } int dispc_init(struct tidss_device *tidss) @@ -2777,6 +2726,10 @@ int dispc_init(struct tidss_device *tidss) return r; } + /* K2G display controller does not support soft reset */ + if (feat->subrev != DISPC_K2G) + dispc_softreset(dispc); + for (i = 0; i < dispc->feat->num_vps; i++) { u32 gamma_size = dispc->feat->vp_feat.color.gamma_size; u32 *gamma_table; @@ -2825,10 +2778,6 @@ int dispc_init(struct tidss_device *tidss) of_property_read_u32(dispc->dev->of_node, "max-memory-bandwidth", &dispc->memory_bandwidth_limit); - r = dispc_init_hw(dispc); - if (r) - return r; - tidss->dispc = dispc; return 0; diff --git a/drivers/gpu/drm/tidss/tidss_kms.c b/drivers/gpu/drm/tidss/tidss_kms.c index 995bac488392..afb2879980c6 100644 --- a/drivers/gpu/drm/tidss/tidss_kms.c +++ b/drivers/gpu/drm/tidss/tidss_kms.c @@ -4,6 +4,8 @@ * Author: Tomi Valkeinen */ +#include + #include #include #include @@ -25,6 +27,7 @@ static void tidss_atomic_commit_tail(struct drm_atomic_state *old_state) { struct drm_device *ddev = old_state->dev; struct tidss_device *tidss = to_tidss(ddev); + bool fence_cookie = dma_fence_begin_signalling(); dev_dbg(ddev->dev, "%s\n", __func__); @@ -35,6 +38,7 @@ static void tidss_atomic_commit_tail(struct drm_atomic_state *old_state) drm_atomic_helper_commit_modeset_enables(ddev, old_state); drm_atomic_helper_commit_hw_done(old_state); + dma_fence_end_signalling(fence_cookie); drm_atomic_helper_wait_for_flip_done(ddev, old_state); drm_atomic_helper_cleanup_planes(ddev, old_state); diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c index 86d34b77b37d..f72755b8ea14 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c @@ -138,7 +138,7 @@ static int tilcdc_irq_install(struct drm_device *dev, unsigned int irq) if (ret) return ret; - priv->irq_enabled = true; + priv->irq_enabled = false; return 0; } diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c index c46f380d9149..ae01d22b8f84 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c @@ -595,9 +595,10 @@ static int vmw_user_bo_synccpu_release(struct drm_file *filp, if (!(flags & drm_vmw_synccpu_allow_cs)) { atomic_dec(&vmw_bo->cpu_writers); } - vmw_user_bo_unref(&vmw_bo); + ttm_bo_put(&vmw_bo->base); } + drm_gem_object_put(&vmw_bo->base.base); return ret; } @@ -637,7 +638,8 @@ int vmw_user_bo_synccpu_ioctl(struct drm_device *dev, void *data, return ret; ret = vmw_user_bo_synccpu_grab(vbo, arg->flags); - vmw_user_bo_unref(&vbo); + vmw_bo_unreference(&vbo); + drm_gem_object_put(&vbo->base.base); if (unlikely(ret != 0)) { if (ret == -ERESTARTSYS || ret == -EBUSY) return -EBUSY; @@ -711,6 +713,7 @@ int vmw_user_bo_lookup(struct drm_file *filp, } *out = gem_to_vmw_bo(gobj); + ttm_bo_get(&(*out)->base); return 0; } diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c index 97e56a94eaf8..79b30dc9d825 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c @@ -407,8 +407,8 @@ static int vmw_cotable_resize(struct vmw_resource *res, size_t new_size) * for the new COTable. Initially pin the buffer object to make sure * we can use tryreserve without failure. */ - ret = vmw_gem_object_create(dev_priv, new_size, &vmw_mob_placement, - true, true, vmw_bo_bo_free, &buf); + ret = vmw_bo_create(dev_priv, new_size, &vmw_mob_placement, + true, true, vmw_bo_bo_free, &buf); if (ret) { DRM_ERROR("Failed initializing new cotable MOB.\n"); return ret; @@ -475,7 +475,7 @@ static int vmw_cotable_resize(struct vmw_resource *res, size_t new_size) vmw_resource_mob_attach(res); /* Let go of the old mob. */ - vmw_user_bo_unref(&old_buf); + vmw_bo_unreference(&old_buf); res->id = vcotbl->type; ret = dma_resv_reserve_fences(bo->base.resv, 1); @@ -492,7 +492,7 @@ out_map_new: out_wait: ttm_bo_unpin(bo); ttm_bo_unreserve(bo); - vmw_user_bo_unref(&buf); + vmw_bo_unreference(&buf); return ret; } diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h index 136f1cdcf8cd..8459fab9d979 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h @@ -969,11 +969,6 @@ static inline void vmw_bo_prio_del(struct vmw_buffer_object *vbo, int prio) /** * GEM related functionality - vmwgfx_gem.c */ -extern int vmw_gem_object_create(struct vmw_private *dev_priv, - size_t size, struct ttm_placement *placement, - bool interruptible, bool pin, - void (*bo_free)(struct ttm_buffer_object *bo), - struct vmw_buffer_object **p_bo); extern int vmw_gem_object_create_with_handle(struct vmw_private *dev_priv, struct drm_file *filp, uint32_t size, @@ -1605,21 +1600,6 @@ vmw_bo_reference(struct vmw_buffer_object *buf) return buf; } -static inline struct vmw_buffer_object *vmw_user_bo_ref(struct vmw_buffer_object *vbo) -{ - drm_gem_object_get(&vbo->base.base); - return vbo; -} - -static inline void vmw_user_bo_unref(struct vmw_buffer_object **buf) -{ - struct vmw_buffer_object *tmp_buf = *buf; - - *buf = NULL; - if (tmp_buf) - drm_gem_object_put(&tmp_buf->base.base); -} - static inline void vmw_fifo_resource_inc(struct vmw_private *dev_priv) { atomic_inc(&dev_priv->num_fifo_resources); diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c index bc7f02e4eceb..7e59469e1cb9 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c @@ -1147,7 +1147,7 @@ static int vmw_translate_mob_ptr(struct vmw_private *dev_priv, SVGAMobId *id, struct vmw_buffer_object **vmw_bo_p) { - struct vmw_buffer_object *vmw_bo, *tmp_bo; + struct vmw_buffer_object *vmw_bo; uint32_t handle = *id; struct vmw_relocation *reloc; int ret; @@ -1159,8 +1159,8 @@ static int vmw_translate_mob_ptr(struct vmw_private *dev_priv, return PTR_ERR(vmw_bo); } ret = vmw_validation_add_bo(sw_context->ctx, vmw_bo, true, false); - tmp_bo = vmw_bo; - vmw_user_bo_unref(&tmp_bo); + ttm_bo_put(&vmw_bo->base); + drm_gem_object_put(&vmw_bo->base.base); if (unlikely(ret != 0)) return ret; @@ -1202,7 +1202,7 @@ static int vmw_translate_guest_ptr(struct vmw_private *dev_priv, SVGAGuestPtr *ptr, struct vmw_buffer_object **vmw_bo_p) { - struct vmw_buffer_object *vmw_bo, *tmp_bo; + struct vmw_buffer_object *vmw_bo; uint32_t handle = ptr->gmrId; struct vmw_relocation *reloc; int ret; @@ -1214,8 +1214,8 @@ static int vmw_translate_guest_ptr(struct vmw_private *dev_priv, return PTR_ERR(vmw_bo); } ret = vmw_validation_add_bo(sw_context->ctx, vmw_bo, false, false); - tmp_bo = vmw_bo; - vmw_user_bo_unref(&tmp_bo); + ttm_bo_put(&vmw_bo->base); + drm_gem_object_put(&vmw_bo->base.base); if (unlikely(ret != 0)) return ret; diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c index e7a533e39155..4d2c28e39f4e 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c @@ -133,22 +133,6 @@ void vmw_gem_destroy(struct ttm_buffer_object *bo) kfree(vbo); } -int vmw_gem_object_create(struct vmw_private *vmw, - size_t size, struct ttm_placement *placement, - bool interruptible, bool pin, - void (*bo_free)(struct ttm_buffer_object *bo), - struct vmw_buffer_object **p_bo) -{ - int ret = vmw_bo_create(vmw, size, placement, interruptible, pin, bo_free, p_bo); - - if (ret != 0) - goto out_no_bo; - - (*p_bo)->base.base.funcs = &vmw_gem_object_funcs; -out_no_bo: - return ret; -} - int vmw_gem_object_create_with_handle(struct vmw_private *dev_priv, struct drm_file *filp, uint32_t size, @@ -157,14 +141,16 @@ int vmw_gem_object_create_with_handle(struct vmw_private *dev_priv, { int ret; - ret = vmw_gem_object_create(dev_priv, size, - (dev_priv->has_mob) ? + ret = vmw_bo_create(dev_priv, size, + (dev_priv->has_mob) ? &vmw_sys_placement : &vmw_vram_sys_placement, - true, false, &vmw_gem_destroy, p_vbo); + true, false, &vmw_gem_destroy, p_vbo); if (ret != 0) goto out_no_bo; + (*p_vbo)->base.base.funcs = &vmw_gem_object_funcs; + ret = drm_gem_handle_create(filp, &(*p_vbo)->base.base, handle); out_no_bo: return ret; diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c index aa571b75cd07..aab6389cb4aa 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c @@ -1402,8 +1402,8 @@ static int vmw_create_bo_proxy(struct drm_device *dev, /* Reserve and switch the backing mob. */ mutex_lock(&res->dev_priv->cmdbuf_mutex); (void) vmw_resource_reserve(res, false, true); - vmw_user_bo_unref(&res->backup); - res->backup = vmw_user_bo_ref(bo_mob); + vmw_bo_unreference(&res->backup); + res->backup = vmw_bo_reference(bo_mob); res->backup_offset = 0; vmw_resource_unreserve(res, false, false, false, NULL, 0); mutex_unlock(&res->dev_priv->cmdbuf_mutex); @@ -1599,8 +1599,10 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev, err_out: /* vmw_user_lookup_handle takes one ref so does new_fb */ - if (bo) - vmw_user_bo_unref(&bo); + if (bo) { + vmw_bo_unreference(&bo); + drm_gem_object_put(&bo->base.base); + } if (surface) vmw_surface_unreference(&surface); diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c b/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c index abc354ead4e8..b5b311f2a91a 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c @@ -457,7 +457,8 @@ int vmw_overlay_ioctl(struct drm_device *dev, void *data, ret = vmw_overlay_update_stream(dev_priv, buf, arg, true); - vmw_user_bo_unref(&buf); + vmw_bo_unreference(&buf); + drm_gem_object_put(&buf->base.base); out_unlock: mutex_unlock(&overlay->mutex); diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c index 30d1c1918bb4..c7d645e5ec7b 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c @@ -140,7 +140,7 @@ static void vmw_resource_release(struct kref *kref) if (res->coherent) vmw_bo_dirty_release(res->backup); ttm_bo_unreserve(bo); - vmw_user_bo_unref(&res->backup); + vmw_bo_unreference(&res->backup); } if (likely(res->hw_destroy != NULL)) { @@ -330,10 +330,10 @@ static int vmw_resource_buf_alloc(struct vmw_resource *res, return 0; } - ret = vmw_gem_object_create(res->dev_priv, res->backup_size, - res->func->backup_placement, - interruptible, false, - &vmw_bo_bo_free, &backup); + ret = vmw_bo_create(res->dev_priv, res->backup_size, + res->func->backup_placement, + interruptible, false, + &vmw_bo_bo_free, &backup); if (unlikely(ret != 0)) goto out_no_bo; @@ -452,11 +452,11 @@ void vmw_resource_unreserve(struct vmw_resource *res, vmw_resource_mob_detach(res); if (res->coherent) vmw_bo_dirty_release(res->backup); - vmw_user_bo_unref(&res->backup); + vmw_bo_unreference(&res->backup); } if (new_backup) { - res->backup = vmw_user_bo_ref(new_backup); + res->backup = vmw_bo_reference(new_backup); /* * The validation code should already have added a @@ -544,7 +544,7 @@ out_no_reserve: ttm_bo_put(val_buf->bo); val_buf->bo = NULL; if (backup_dirty) - vmw_user_bo_unref(&res->backup); + vmw_bo_unreference(&res->backup); return ret; } @@ -719,7 +719,7 @@ int vmw_resource_validate(struct vmw_resource *res, bool intr, goto out_no_validate; else if (!res->func->needs_backup && res->backup) { WARN_ON_ONCE(vmw_resource_mob_attached(res)); - vmw_user_bo_unref(&res->backup); + vmw_bo_unreference(&res->backup); } return 0; diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c index 303f7a82f350..51e83dfa1cac 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c @@ -177,7 +177,7 @@ static int vmw_gb_shader_init(struct vmw_private *dev_priv, res->backup_size = size; if (byte_code) { - res->backup = vmw_user_bo_ref(byte_code); + res->backup = vmw_bo_reference(byte_code); res->backup_offset = offset; } shader->size = size; @@ -806,7 +806,8 @@ static int vmw_shader_define(struct drm_device *dev, struct drm_file *file_priv, shader_type, num_input_sig, num_output_sig, tfile, shader_handle); out_bad_arg: - vmw_user_bo_unref(&buffer); + vmw_bo_unreference(&buffer); + drm_gem_object_put(&buffer->base.base); return ret; } diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c index 50769528c3f3..1a1a286bc749 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c @@ -683,6 +683,9 @@ static void vmw_user_surface_base_release(struct ttm_base_object **p_base) container_of(base, struct vmw_user_surface, prime.base); struct vmw_resource *res = &user_srf->srf.res; + if (res && res->backup) + drm_gem_object_put(&res->backup->base.base); + *p_base = NULL; vmw_resource_unreference(&res); } @@ -845,17 +848,23 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void *data, * expect a backup buffer to be present. */ if (dev_priv->has_mob && req->shareable) { - ret = vmw_gem_object_create(dev_priv, - res->backup_size, - &vmw_sys_placement, - true, - false, - &vmw_gem_destroy, - &res->backup); + uint32_t backup_handle; + + ret = vmw_gem_object_create_with_handle(dev_priv, + file_priv, + res->backup_size, + &backup_handle, + &res->backup); if (unlikely(ret != 0)) { vmw_resource_unreference(&res); goto out_unlock; } + vmw_bo_reference(res->backup); + /* + * We don't expose the handle to the userspace and surface + * already holds a gem reference + */ + drm_gem_handle_delete(file_priv, backup_handle); } tmp = vmw_resource_reference(&srf->res); @@ -1496,7 +1505,7 @@ vmw_gb_surface_define_internal(struct drm_device *dev, if (ret == 0) { if (res->backup->base.base.size < res->backup_size) { VMW_DEBUG_USER("Surface backup buffer too small.\n"); - vmw_user_bo_unref(&res->backup); + vmw_bo_unreference(&res->backup); ret = -EINVAL; goto out_unlock; } else { @@ -1510,6 +1519,8 @@ vmw_gb_surface_define_internal(struct drm_device *dev, res->backup_size, &backup_handle, &res->backup); + if (ret == 0) + vmw_bo_reference(res->backup); } if (unlikely(ret != 0)) { diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 220d6b2af4d3..d1094bb1aa42 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -380,7 +380,7 @@ static int asus_raw_event(struct hid_device *hdev, return 0; } -static int asus_kbd_set_report(struct hid_device *hdev, const u8 *buf, size_t buf_size) +static int asus_kbd_set_report(struct hid_device *hdev, u8 *buf, size_t buf_size) { unsigned char *dmabuf; int ret; @@ -403,7 +403,7 @@ static int asus_kbd_set_report(struct hid_device *hdev, const u8 *buf, size_t bu static int asus_kbd_init(struct hid_device *hdev) { - const u8 buf[] = { FEATURE_KBD_REPORT_ID, 0x41, 0x53, 0x55, 0x53, 0x20, 0x54, + u8 buf[] = { FEATURE_KBD_REPORT_ID, 0x41, 0x53, 0x55, 0x53, 0x20, 0x54, 0x65, 0x63, 0x68, 0x2e, 0x49, 0x6e, 0x63, 0x2e, 0x00 }; int ret; @@ -417,7 +417,7 @@ static int asus_kbd_init(struct hid_device *hdev) static int asus_kbd_get_functions(struct hid_device *hdev, unsigned char *kbd_func) { - const u8 buf[] = { FEATURE_KBD_REPORT_ID, 0x05, 0x20, 0x31, 0x00, 0x08 }; + u8 buf[] = { FEATURE_KBD_REPORT_ID, 0x05, 0x20, 0x31, 0x00, 0x08 }; u8 *readbuf; int ret; @@ -448,7 +448,7 @@ static int asus_kbd_get_functions(struct hid_device *hdev, static int rog_nkey_led_init(struct hid_device *hdev) { - const u8 buf_init_start[] = { FEATURE_KBD_LED_REPORT_ID1, 0xB9 }; + u8 buf_init_start[] = { FEATURE_KBD_LED_REPORT_ID1, 0xB9 }; u8 buf_init2[] = { FEATURE_KBD_LED_REPORT_ID1, 0x41, 0x53, 0x55, 0x53, 0x20, 0x54, 0x65, 0x63, 0x68, 0x2e, 0x49, 0x6e, 0x63, 0x2e, 0x00 }; u8 buf_init3[] = { FEATURE_KBD_LED_REPORT_ID1, @@ -1012,24 +1012,6 @@ static int asus_start_multitouch(struct hid_device *hdev) return 0; } -static int __maybe_unused asus_resume(struct hid_device *hdev) { - struct asus_drvdata *drvdata = hid_get_drvdata(hdev); - int ret = 0; - - if (drvdata->kbd_backlight) { - const u8 buf[] = { FEATURE_KBD_REPORT_ID, 0xba, 0xc5, 0xc4, - drvdata->kbd_backlight->cdev.brightness }; - ret = asus_kbd_set_report(hdev, buf, sizeof(buf)); - if (ret < 0) { - hid_err(hdev, "Asus failed to set keyboard backlight: %d\n", ret); - goto asus_resume_err; - } - } - -asus_resume_err: - return ret; -} - static int __maybe_unused asus_reset_resume(struct hid_device *hdev) { struct asus_drvdata *drvdata = hid_get_drvdata(hdev); @@ -1321,7 +1303,6 @@ static struct hid_driver asus_driver = { .input_configured = asus_input_configured, #ifdef CONFIG_PM .reset_resume = asus_reset_resume, - .resume = asus_resume, #endif .event = asus_event, .raw_event = asus_raw_event diff --git a/drivers/hid/hid-glorious.c b/drivers/hid/hid-glorious.c index 281b3a7187ce..558eb08c19ef 100644 --- a/drivers/hid/hid-glorious.c +++ b/drivers/hid/hid-glorious.c @@ -21,10 +21,6 @@ MODULE_DESCRIPTION("HID driver for Glorious PC Gaming Race mice"); * Glorious Model O and O- specify the const flag in the consumer input * report descriptor, which leads to inputs being ignored. Fix this * by patching the descriptor. - * - * Glorious Model I incorrectly specifes the Usage Minimum for its - * keyboard HID report, causing keycodes to be misinterpreted. - * Fix this by setting Usage Minimum to 0 in that report. */ static __u8 *glorious_report_fixup(struct hid_device *hdev, __u8 *rdesc, unsigned int *rsize) @@ -36,10 +32,6 @@ static __u8 *glorious_report_fixup(struct hid_device *hdev, __u8 *rdesc, rdesc[85] = rdesc[113] = rdesc[141] = \ HID_MAIN_ITEM_VARIABLE | HID_MAIN_ITEM_RELATIVE; } - if (*rsize == 156 && rdesc[41] == 1) { - hid_info(hdev, "patching Glorious Model I keyboard report descriptor\n"); - rdesc[41] = 0; - } return rdesc; } @@ -52,8 +44,6 @@ static void glorious_update_name(struct hid_device *hdev) model = "Model O"; break; case USB_DEVICE_ID_GLORIOUS_MODEL_D: model = "Model D"; break; - case USB_DEVICE_ID_GLORIOUS_MODEL_I: - model = "Model I"; break; } snprintf(hdev->name, sizeof(hdev->name), "%s %s", "Glorious", model); @@ -76,12 +66,10 @@ static int glorious_probe(struct hid_device *hdev, } static const struct hid_device_id glorious_devices[] = { - { HID_USB_DEVICE(USB_VENDOR_ID_SINOWEALTH, + { HID_USB_DEVICE(USB_VENDOR_ID_GLORIOUS, USB_DEVICE_ID_GLORIOUS_MODEL_O) }, - { HID_USB_DEVICE(USB_VENDOR_ID_SINOWEALTH, + { HID_USB_DEVICE(USB_VENDOR_ID_GLORIOUS, USB_DEVICE_ID_GLORIOUS_MODEL_D) }, - { HID_USB_DEVICE(USB_VENDOR_ID_LAVIEW, - USB_DEVICE_ID_GLORIOUS_MODEL_I) }, { } }; MODULE_DEVICE_TABLE(hid, glorious_devices); diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 1be454bafcb9..130fc5f34142 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -503,6 +503,10 @@ #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_010A 0x010a #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100 +#define USB_VENDOR_ID_GLORIOUS 0x258a +#define USB_DEVICE_ID_GLORIOUS_MODEL_D 0x0033 +#define USB_DEVICE_ID_GLORIOUS_MODEL_O 0x0036 + #define I2C_VENDOR_ID_GOODIX 0x27c6 #define I2C_DEVICE_ID_GOODIX_01F0 0x01f0 @@ -725,9 +729,6 @@ #define USB_VENDOR_ID_LABTEC 0x1020 #define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD 0x0006 -#define USB_VENDOR_ID_LAVIEW 0x22D4 -#define USB_DEVICE_ID_GLORIOUS_MODEL_I 0x1503 - #define USB_VENDOR_ID_LCPOWER 0x1241 #define USB_DEVICE_ID_LCPOWER_LC1000 0xf767 @@ -1130,10 +1131,6 @@ #define USB_VENDOR_ID_SIGMATEL 0x066F #define USB_DEVICE_ID_SIGMATEL_STMP3780 0x3780 -#define USB_VENDOR_ID_SINOWEALTH 0x258a -#define USB_DEVICE_ID_GLORIOUS_MODEL_D 0x0033 -#define USB_DEVICE_ID_GLORIOUS_MODEL_O 0x0036 - #define USB_VENDOR_ID_SIS_TOUCH 0x0457 #define USB_DEVICE_ID_SIS9200_TOUCH 0x9200 #define USB_DEVICE_ID_SIS817_TOUCH 0x0817 diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c index 149a3c74346b..7c1b33be9d13 100644 --- a/drivers/hid/hid-lenovo.c +++ b/drivers/hid/hid-lenovo.c @@ -692,8 +692,7 @@ static int lenovo_event_cptkbd(struct hid_device *hdev, * so set middlebutton_state to 3 * to never apply workaround anymore */ - if (hdev->product == USB_DEVICE_ID_LENOVO_CUSBKBD && - cptkbd_data->middlebutton_state == 1 && + if (cptkbd_data->middlebutton_state == 1 && usage->type == EV_REL && (usage->code == REL_X || usage->code == REL_Y)) { cptkbd_data->middlebutton_state = 3; diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index 5ec1f174127a..8db4ae05febc 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c @@ -2048,11 +2048,6 @@ static const struct hid_device_id mt_devices[] = { MT_USB_DEVICE(USB_VENDOR_ID_HANVON_ALT, USB_DEVICE_ID_HANVON_ALT_MULTITOUCH) }, - /* HONOR GLO-GXXX panel */ - { .driver_data = MT_CLS_VTL, - HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, - 0x347d, 0x7853) }, - /* Ilitek dual touch panel */ { .driver_data = MT_CLS_NSMU, MT_USB_DEVICE(USB_VENDOR_ID_ILITEK, diff --git a/drivers/hid/hid-nintendo.c b/drivers/hid/hid-nintendo.c index df07e3ae0ffb..8a8a3dd8af0c 100644 --- a/drivers/hid/hid-nintendo.c +++ b/drivers/hid/hid-nintendo.c @@ -325,28 +325,28 @@ struct joycon_imu_cal { * All the controller's button values are stored in a u32. * They can be accessed with bitwise ANDs. */ -#define JC_BTN_Y BIT(0) -#define JC_BTN_X BIT(1) -#define JC_BTN_B BIT(2) -#define JC_BTN_A BIT(3) -#define JC_BTN_SR_R BIT(4) -#define JC_BTN_SL_R BIT(5) -#define JC_BTN_R BIT(6) -#define JC_BTN_ZR BIT(7) -#define JC_BTN_MINUS BIT(8) -#define JC_BTN_PLUS BIT(9) -#define JC_BTN_RSTICK BIT(10) -#define JC_BTN_LSTICK BIT(11) -#define JC_BTN_HOME BIT(12) -#define JC_BTN_CAP BIT(13) /* capture button */ -#define JC_BTN_DOWN BIT(16) -#define JC_BTN_UP BIT(17) -#define JC_BTN_RIGHT BIT(18) -#define JC_BTN_LEFT BIT(19) -#define JC_BTN_SR_L BIT(20) -#define JC_BTN_SL_L BIT(21) -#define JC_BTN_L BIT(22) -#define JC_BTN_ZL BIT(23) +static const u32 JC_BTN_Y = BIT(0); +static const u32 JC_BTN_X = BIT(1); +static const u32 JC_BTN_B = BIT(2); +static const u32 JC_BTN_A = BIT(3); +static const u32 JC_BTN_SR_R = BIT(4); +static const u32 JC_BTN_SL_R = BIT(5); +static const u32 JC_BTN_R = BIT(6); +static const u32 JC_BTN_ZR = BIT(7); +static const u32 JC_BTN_MINUS = BIT(8); +static const u32 JC_BTN_PLUS = BIT(9); +static const u32 JC_BTN_RSTICK = BIT(10); +static const u32 JC_BTN_LSTICK = BIT(11); +static const u32 JC_BTN_HOME = BIT(12); +static const u32 JC_BTN_CAP = BIT(13); /* capture button */ +static const u32 JC_BTN_DOWN = BIT(16); +static const u32 JC_BTN_UP = BIT(17); +static const u32 JC_BTN_RIGHT = BIT(18); +static const u32 JC_BTN_LEFT = BIT(19); +static const u32 JC_BTN_SR_L = BIT(20); +static const u32 JC_BTN_SL_L = BIT(21); +static const u32 JC_BTN_L = BIT(22); +static const u32 JC_BTN_ZL = BIT(23); enum joycon_msg_type { JOYCON_MSG_TYPE_NONE, @@ -859,27 +859,14 @@ static int joycon_request_calibration(struct joycon_ctlr *ctlr) */ static void joycon_calc_imu_cal_divisors(struct joycon_ctlr *ctlr) { - int i, divz = 0; + int i; for (i = 0; i < 3; i++) { ctlr->imu_cal_accel_divisor[i] = ctlr->accel_cal.scale[i] - ctlr->accel_cal.offset[i]; ctlr->imu_cal_gyro_divisor[i] = ctlr->gyro_cal.scale[i] - ctlr->gyro_cal.offset[i]; - - if (ctlr->imu_cal_accel_divisor[i] == 0) { - ctlr->imu_cal_accel_divisor[i] = 1; - divz++; - } - - if (ctlr->imu_cal_gyro_divisor[i] == 0) { - ctlr->imu_cal_gyro_divisor[i] = 1; - divz++; - } } - - if (divz) - hid_warn(ctlr->hdev, "inaccurate IMU divisors (%d)\n", divz); } static const s16 DFLT_ACCEL_OFFSET /*= 0*/; @@ -1108,16 +1095,16 @@ static void joycon_parse_imu_report(struct joycon_ctlr *ctlr, JC_IMU_SAMPLES_PER_DELTA_AVG) { ctlr->imu_avg_delta_ms = ctlr->imu_delta_samples_sum / ctlr->imu_delta_samples_count; + /* don't ever want divide by zero shenanigans */ + if (ctlr->imu_avg_delta_ms == 0) { + ctlr->imu_avg_delta_ms = 1; + hid_warn(ctlr->hdev, + "calculated avg imu delta of 0\n"); + } ctlr->imu_delta_samples_count = 0; ctlr->imu_delta_samples_sum = 0; } - /* don't ever want divide by zero shenanigans */ - if (ctlr->imu_avg_delta_ms == 0) { - ctlr->imu_avg_delta_ms = 1; - hid_warn(ctlr->hdev, "calculated avg imu delta of 0\n"); - } - /* useful for debugging IMU sample rate */ hid_dbg(ctlr->hdev, "imu_report: ms=%u last_ms=%u delta=%u avg_delta=%u\n", diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c index 60884066362a..056bb3209128 100644 --- a/drivers/hid/hid-quirks.c +++ b/drivers/hid/hid-quirks.c @@ -33,7 +33,6 @@ static const struct hid_device_id hid_quirks[] = { { HID_USB_DEVICE(USB_VENDOR_ID_AKAI, USB_DEVICE_ID_AKAI_MPKMINI2), HID_QUIRK_NO_INIT_REPORTS }, { HID_USB_DEVICE(USB_VENDOR_ID_ALPS, USB_DEVICE_ID_IBM_GAMEPAD), HID_QUIRK_BADPAD }, { HID_USB_DEVICE(USB_VENDOR_ID_AMI, USB_DEVICE_ID_AMI_VIRT_KEYBOARD_AND_MOUSE), HID_QUIRK_ALWAYS_POLL }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ANSI), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM), HID_QUIRK_NOGET }, { HID_USB_DEVICE(USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC), HID_QUIRK_NOGET }, { HID_USB_DEVICE(USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM), HID_QUIRK_NOGET }, diff --git a/drivers/hid/i2c-hid/i2c-hid-acpi.c b/drivers/hid/i2c-hid/i2c-hid-acpi.c index 6d35bb397481..b96ae15e0ad9 100644 --- a/drivers/hid/i2c-hid/i2c-hid-acpi.c +++ b/drivers/hid/i2c-hid/i2c-hid-acpi.c @@ -39,13 +39,8 @@ static const struct acpi_device_id i2c_hid_acpi_blacklist[] = { * The CHPN0001 ACPI device, which is used to describe the Chipone * ICN8505 controller, has a _CID of PNP0C50 but is not HID compatible. */ - { "CHPN0001" }, - /* - * The IDEA5002 ACPI device causes high interrupt usage and spurious - * wakeups from suspend. - */ - { "IDEA5002" }, - { } + {"CHPN0001", 0 }, + { }, }; /* HID I²C Device: 3cdff6f7-4267-4555-ad05-b30a3d8938de */ @@ -120,9 +115,9 @@ static int i2c_hid_acpi_probe(struct i2c_client *client) } static const struct acpi_device_id i2c_hid_acpi_match[] = { - { "ACPI0C50" }, - { "PNP0C50" }, - { } + {"ACPI0C50", 0 }, + {"PNP0C50", 0 }, + { }, }; MODULE_DEVICE_TABLE(acpi, i2c_hid_acpi_match); diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c index 165ed872fa4e..c1270db12178 100644 --- a/drivers/hid/wacom_wac.c +++ b/drivers/hid/wacom_wac.c @@ -2646,8 +2646,8 @@ static void wacom_wac_finger_slot(struct wacom_wac *wacom_wac, { struct hid_data *hid_data = &wacom_wac->hid_data; bool mt = wacom_wac->features.touch_max > 1; - bool touch_down = hid_data->tipswitch && hid_data->confidence; - bool prox = touch_down && report_touch_events(wacom_wac); + bool prox = hid_data->tipswitch && + report_touch_events(wacom_wac); if (touch_is_muted(wacom_wac)) { if (!wacom_wac->shared->touch_down) @@ -2697,6 +2697,24 @@ static void wacom_wac_finger_slot(struct wacom_wac *wacom_wac, } } +static bool wacom_wac_slot_is_active(struct input_dev *dev, int key) +{ + struct input_mt *mt = dev->mt; + struct input_mt_slot *s; + + if (!mt) + return false; + + for (s = mt->slots; s != mt->slots + mt->num_slots; s++) { + if (s->key == key && + input_mt_get_value(s, ABS_MT_TRACKING_ID) >= 0) { + return true; + } + } + + return false; +} + static void wacom_wac_finger_event(struct hid_device *hdev, struct hid_field *field, struct hid_usage *usage, __s32 value) { @@ -2747,8 +2765,14 @@ static void wacom_wac_finger_event(struct hid_device *hdev, } if (usage->usage_index + 1 == field->report_count) { - if (equivalent_usage == wacom_wac->hid_data.last_slot_field) - wacom_wac_finger_slot(wacom_wac, wacom_wac->touch_input); + if (equivalent_usage == wacom_wac->hid_data.last_slot_field) { + bool touch_removed = wacom_wac_slot_is_active(wacom_wac->touch_input, + wacom_wac->hid_data.id) && !wacom_wac->hid_data.tipswitch; + + if (wacom_wac->hid_data.confidence || touch_removed) { + wacom_wac_finger_slot(wacom_wac, wacom_wac->touch_input); + } + } } } diff --git a/drivers/hwmon/corsair-psu.c b/drivers/hwmon/corsair-psu.c index ec7f27a6ce01..2210aa62e3d0 100644 --- a/drivers/hwmon/corsair-psu.c +++ b/drivers/hwmon/corsair-psu.c @@ -837,23 +837,7 @@ static struct hid_driver corsairpsu_driver = { .reset_resume = corsairpsu_resume, #endif }; - -static int __init corsair_init(void) -{ - return hid_register_driver(&corsairpsu_driver); -} - -static void __exit corsair_exit(void) -{ - hid_unregister_driver(&corsairpsu_driver); -} - -/* - * With module_init() the driver would load before the HID bus when - * built-in, so use late_initcall() instead. - */ -late_initcall(corsair_init); -module_exit(corsair_exit); +module_hid_driver(corsairpsu_driver); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Wilken Gottwalt "); diff --git a/drivers/hwtracing/coresight/coresight-etm4x.h b/drivers/hwtracing/coresight/coresight-etm4x.h index d8e4d902b01a..0174fbf1a963 100644 --- a/drivers/hwtracing/coresight/coresight-etm4x.h +++ b/drivers/hwtracing/coresight/coresight-etm4x.h @@ -1032,7 +1032,7 @@ struct etmv4_drvdata { u8 ctxid_size; u8 vmid_size; u8 ccsize; - u16 ccitmin; + u8 ccitmin; u8 s_ex_level; u8 ns_ex_level; u8 q_support; diff --git a/drivers/hwtracing/ptt/hisi_ptt.c b/drivers/hwtracing/ptt/hisi_ptt.c index 8d8fa8e8afe0..016220ba0add 100644 --- a/drivers/hwtracing/ptt/hisi_ptt.c +++ b/drivers/hwtracing/ptt/hisi_ptt.c @@ -342,9 +342,9 @@ static int hisi_ptt_register_irq(struct hisi_ptt *hisi_ptt) return ret; hisi_ptt->trace_irq = pci_irq_vector(pdev, HISI_PTT_TRACE_DMA_IRQ); - ret = devm_request_irq(&pdev->dev, hisi_ptt->trace_irq, hisi_ptt_isr, - IRQF_NOBALANCING | IRQF_NO_THREAD, DRV_NAME, - hisi_ptt); + ret = devm_request_threaded_irq(&pdev->dev, hisi_ptt->trace_irq, + NULL, hisi_ptt_isr, 0, + DRV_NAME, hisi_ptt); if (ret) { pci_err(pdev, "failed to request irq %d, ret = %d\n", hisi_ptt->trace_irq, ret); @@ -659,9 +659,6 @@ static int hisi_ptt_pmu_event_init(struct perf_event *event) return -EOPNOTSUPP; } - if (event->attach_state & PERF_ATTACH_TASK) - return -EOPNOTSUPP; - if (event->attr.type != hisi_ptt->hisi_ptt_pmu.type) return -ENOENT; diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c index 86daf791aa27..6adf3b141316 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c @@ -249,46 +249,18 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) if (!slave) return 0; - /* - * Handle stop conditions early, prior to SLAVE_MATCH. Some masters may drive - * transfers with low enough latency between the nak/stop phase of the current - * command and the start/address phase of the following command that the - * interrupts are coalesced by the time we process them. - */ - if (irq_status & ASPEED_I2CD_INTR_NORMAL_STOP) { - irq_handled |= ASPEED_I2CD_INTR_NORMAL_STOP; - bus->slave_state = ASPEED_I2C_SLAVE_STOP; - } + command = readl(bus->base + ASPEED_I2C_CMD_REG); - if (irq_status & ASPEED_I2CD_INTR_TX_NAK && - bus->slave_state == ASPEED_I2C_SLAVE_READ_PROCESSED) { - irq_handled |= ASPEED_I2CD_INTR_TX_NAK; - bus->slave_state = ASPEED_I2C_SLAVE_STOP; - } - - /* Propagate any stop conditions to the slave implementation. */ - if (bus->slave_state == ASPEED_I2C_SLAVE_STOP) { - i2c_slave_event(slave, I2C_SLAVE_STOP, &value); - bus->slave_state = ASPEED_I2C_SLAVE_INACTIVE; - } - - /* - * Now that we've dealt with any potentially coalesced stop conditions, - * address any start conditions. - */ + /* Slave was requested, restart state machine. */ if (irq_status & ASPEED_I2CD_INTR_SLAVE_MATCH) { irq_handled |= ASPEED_I2CD_INTR_SLAVE_MATCH; bus->slave_state = ASPEED_I2C_SLAVE_START; } - /* - * If the slave has been stopped and not started then slave interrupt - * handling is complete. - */ + /* Slave is not currently active, irq was for someone else. */ if (bus->slave_state == ASPEED_I2C_SLAVE_INACTIVE) return irq_handled; - command = readl(bus->base + ASPEED_I2C_CMD_REG); dev_dbg(bus->dev, "slave irq status 0x%08x, cmd 0x%08x\n", irq_status, command); @@ -307,6 +279,17 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) irq_handled |= ASPEED_I2CD_INTR_RX_DONE; } + /* Slave was asked to stop. */ + if (irq_status & ASPEED_I2CD_INTR_NORMAL_STOP) { + irq_handled |= ASPEED_I2CD_INTR_NORMAL_STOP; + bus->slave_state = ASPEED_I2C_SLAVE_STOP; + } + if (irq_status & ASPEED_I2CD_INTR_TX_NAK && + bus->slave_state == ASPEED_I2C_SLAVE_READ_PROCESSED) { + irq_handled |= ASPEED_I2CD_INTR_TX_NAK; + bus->slave_state = ASPEED_I2C_SLAVE_STOP; + } + switch (bus->slave_state) { case ASPEED_I2C_SLAVE_READ_REQUESTED: if (unlikely(irq_status & ASPEED_I2CD_INTR_TX_ACK)) @@ -341,7 +324,8 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) i2c_slave_event(slave, I2C_SLAVE_WRITE_RECEIVED, &value); break; case ASPEED_I2C_SLAVE_STOP: - /* Stop event handling is done early. Unreachable. */ + i2c_slave_event(slave, I2C_SLAVE_STOP, &value); + bus->slave_state = ASPEED_I2C_SLAVE_INACTIVE; break; case ASPEED_I2C_SLAVE_START: /* Slave was just started. Waiting for the next event. */; diff --git a/drivers/i2c/busses/i2c-rk3x.c b/drivers/i2c/busses/i2c-rk3x.c index 6aa4f1f06240..b31cf4f18f85 100644 --- a/drivers/i2c/busses/i2c-rk3x.c +++ b/drivers/i2c/busses/i2c-rk3x.c @@ -178,7 +178,6 @@ struct rk3x_i2c_soc_data { * @clk: function clk for rk3399 or function & Bus clks for others * @pclk: Bus clk for rk3399 * @clk_rate_nb: i2c clk rate change notify - * @irq: irq number * @t: I2C known timing information * @lock: spinlock for the i2c bus * @wait: the waitqueue to wait for i2c transfer @@ -201,7 +200,6 @@ struct rk3x_i2c { struct clk *clk; struct clk *pclk; struct notifier_block clk_rate_nb; - int irq; /* Settings */ struct i2c_timings t; @@ -1089,18 +1087,13 @@ static int rk3x_i2c_xfer_common(struct i2c_adapter *adap, spin_unlock_irqrestore(&i2c->lock, flags); - if (!polling) { - rk3x_i2c_start(i2c); + rk3x_i2c_start(i2c); + if (!polling) { timeout = wait_event_timeout(i2c->wait, !i2c->busy, msecs_to_jiffies(WAIT_TIMEOUT)); } else { - disable_irq(i2c->irq); - rk3x_i2c_start(i2c); - timeout = rk3x_i2c_wait_xfer_poll(i2c); - - enable_irq(i2c->irq); } spin_lock_irqsave(&i2c->lock, flags); @@ -1317,8 +1310,6 @@ static int rk3x_i2c_probe(struct platform_device *pdev) return ret; } - i2c->irq = irq; - platform_set_drvdata(pdev, i2c); if (i2c->soc_data->calc_timings == rk3x_i2c_v0_calc_timings) { diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index 8e3838c42a8c..36dab9cd208c 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c @@ -220,17 +220,8 @@ static bool is_ack(struct s3c24xx_i2c *i2c) int tries; for (tries = 50; tries; --tries) { - unsigned long tmp = readl(i2c->regs + S3C2410_IICCON); - - if (!(tmp & S3C2410_IICCON_ACKEN)) { - /* - * Wait a bit for the bus to stabilize, - * delay estimated experimentally. - */ - usleep_range(100, 200); - return true; - } - if (tmp & S3C2410_IICCON_IRQPEND) { + if (readl(i2c->regs + S3C2410_IICCON) + & S3C2410_IICCON_IRQPEND) { if (!(readl(i2c->regs + S3C2410_IICSTAT) & S3C2410_IICSTAT_LASTBIT)) return true; @@ -283,6 +274,16 @@ static void s3c24xx_i2c_message_start(struct s3c24xx_i2c *i2c, stat |= S3C2410_IICSTAT_START; writel(stat, i2c->regs + S3C2410_IICSTAT); + + if (i2c->quirks & QUIRK_POLL) { + while ((i2c->msg_num != 0) && is_ack(i2c)) { + i2c_s3c_irq_nextbyte(i2c, stat); + stat = readl(i2c->regs + S3C2410_IICSTAT); + + if (stat & S3C2410_IICSTAT_ARBITR) + dev_err(i2c->dev, "deal with arbitration loss\n"); + } + } } static inline void s3c24xx_i2c_stop(struct s3c24xx_i2c *i2c, int ret) @@ -689,7 +690,7 @@ static void s3c24xx_i2c_wait_idle(struct s3c24xx_i2c *i2c) static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c *i2c, struct i2c_msg *msgs, int num) { - unsigned long timeout = 0; + unsigned long timeout; int ret; ret = s3c24xx_i2c_set_master(i2c); @@ -709,19 +710,16 @@ static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c *i2c, s3c24xx_i2c_message_start(i2c, msgs); if (i2c->quirks & QUIRK_POLL) { - while ((i2c->msg_num != 0) && is_ack(i2c)) { - unsigned long stat = readl(i2c->regs + S3C2410_IICSTAT); + ret = i2c->msg_idx; - i2c_s3c_irq_nextbyte(i2c, stat); + if (ret != num) + dev_dbg(i2c->dev, "incomplete xfer (%d)\n", ret); - stat = readl(i2c->regs + S3C2410_IICSTAT); - if (stat & S3C2410_IICSTAT_ARBITR) - dev_err(i2c->dev, "deal with arbitration loss\n"); - } - } else { - timeout = wait_event_timeout(i2c->wait, i2c->msg_num == 0, HZ * 5); + goto out; } + timeout = wait_event_timeout(i2c->wait, i2c->msg_num == 0, HZ * 5); + ret = i2c->msg_idx; /* diff --git a/drivers/i2c/i2c-core.h b/drivers/i2c/i2c-core.h index 36587f38dff3..05b8b8dfa9bd 100644 --- a/drivers/i2c/i2c-core.h +++ b/drivers/i2c/i2c-core.h @@ -3,7 +3,6 @@ * i2c-core.h - interfaces internal to the I2C framework */ -#include #include struct i2c_devinfo { @@ -30,8 +29,7 @@ int i2c_dev_irq_from_resources(const struct resource *resources, */ static inline bool i2c_in_atomic_xfer_mode(void) { - return system_state > SYSTEM_RUNNING && - (IS_ENABLED(CONFIG_PREEMPT_COUNT) ? !preemptible() : irqs_disabled()); + return system_state > SYSTEM_RUNNING && !preemptible(); } static inline int __i2c_lock_bus_helper(struct i2c_adapter *adap) diff --git a/drivers/iio/adc/ad7091r-base.c b/drivers/iio/adc/ad7091r-base.c index 0e5d3d2e9c98..8e252cde735b 100644 --- a/drivers/iio/adc/ad7091r-base.c +++ b/drivers/iio/adc/ad7091r-base.c @@ -174,8 +174,8 @@ static const struct iio_info ad7091r_info = { static irqreturn_t ad7091r_event_handler(int irq, void *private) { - struct iio_dev *iio_dev = private; - struct ad7091r_state *st = iio_priv(iio_dev); + struct ad7091r_state *st = (struct ad7091r_state *) private; + struct iio_dev *iio_dev = dev_get_drvdata(st->dev); unsigned int i, read_val; int ret; s64 timestamp = iio_get_time_ns(iio_dev); @@ -234,7 +234,7 @@ int ad7091r_probe(struct device *dev, const char *name, if (irq) { ret = devm_request_threaded_irq(dev, irq, NULL, ad7091r_event_handler, - IRQF_TRIGGER_FALLING | IRQF_ONESHOT, name, iio_dev); + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, name, st); if (ret) return ret; } diff --git a/drivers/iio/adc/ad9467.c b/drivers/iio/adc/ad9467.c index 811525857d29..7534572f7475 100644 --- a/drivers/iio/adc/ad9467.c +++ b/drivers/iio/adc/ad9467.c @@ -119,9 +119,9 @@ struct ad9467_state { struct spi_device *spi; struct clk *clk; unsigned int output_mode; - unsigned int (*scales)[2]; struct gpio_desc *pwrdown_gpio; + struct gpio_desc *reset_gpio; }; static int ad9467_spi_read(struct spi_device *spi, unsigned int reg) @@ -163,10 +163,9 @@ static int ad9467_reg_access(struct adi_axi_adc_conv *conv, unsigned int reg, if (readval == NULL) { ret = ad9467_spi_write(spi, reg, writeval); - if (ret) - return ret; - return ad9467_spi_write(spi, AN877_ADC_REG_TRANSFER, - AN877_ADC_TRANSFER_SYNC); + ad9467_spi_write(spi, AN877_ADC_REG_TRANSFER, + AN877_ADC_TRANSFER_SYNC); + return ret; } ret = ad9467_spi_read(spi, reg); @@ -213,7 +212,6 @@ static void __ad9467_get_scale(struct adi_axi_adc_conv *conv, int index, .channel = _chan, \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ BIT(IIO_CHAN_INFO_SAMP_FREQ), \ - .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SCALE), \ .scan_index = _si, \ .scan_type = { \ .sign = _sign, \ @@ -275,13 +273,10 @@ static int ad9467_get_scale(struct adi_axi_adc_conv *conv, int *val, int *val2) const struct ad9467_chip_info *info1 = to_ad9467_chip_info(info); struct ad9467_state *st = adi_axi_adc_conv_priv(conv); unsigned int i, vref_val; - int ret; - ret = ad9467_spi_read(st->spi, AN877_ADC_REG_VREF); - if (ret < 0) - return ret; + vref_val = ad9467_spi_read(st->spi, AN877_ADC_REG_VREF); - vref_val = ret & info1->vref_mask; + vref_val &= info1->vref_mask; for (i = 0; i < info->num_scales; i++) { if (vref_val == info->scale_table[i][1]) @@ -302,7 +297,6 @@ static int ad9467_set_scale(struct adi_axi_adc_conv *conv, int val, int val2) struct ad9467_state *st = adi_axi_adc_conv_priv(conv); unsigned int scale_val[2]; unsigned int i; - int ret; if (val != 0) return -EINVAL; @@ -312,13 +306,11 @@ static int ad9467_set_scale(struct adi_axi_adc_conv *conv, int val, int val2) if (scale_val[0] != val || scale_val[1] != val2) continue; - ret = ad9467_spi_write(st->spi, AN877_ADC_REG_VREF, - info->scale_table[i][1]); - if (ret < 0) - return ret; - - return ad9467_spi_write(st->spi, AN877_ADC_REG_TRANSFER, - AN877_ADC_TRANSFER_SYNC); + ad9467_spi_write(st->spi, AN877_ADC_REG_VREF, + info->scale_table[i][1]); + ad9467_spi_write(st->spi, AN877_ADC_REG_TRANSFER, + AN877_ADC_TRANSFER_SYNC); + return 0; } return -EINVAL; @@ -367,26 +359,6 @@ static int ad9467_write_raw(struct adi_axi_adc_conv *conv, } } -static int ad9467_read_avail(struct adi_axi_adc_conv *conv, - struct iio_chan_spec const *chan, - const int **vals, int *type, int *length, - long mask) -{ - const struct adi_axi_adc_chip_info *info = conv->chip_info; - struct ad9467_state *st = adi_axi_adc_conv_priv(conv); - - switch (mask) { - case IIO_CHAN_INFO_SCALE: - *vals = (const int *)st->scales; - *type = IIO_VAL_INT_PLUS_MICRO; - /* Values are stored in a 2D matrix */ - *length = info->num_scales * 2; - return IIO_AVAIL_LIST; - default: - return -EINVAL; - } -} - static int ad9467_outputmode_set(struct spi_device *spi, unsigned int mode) { int ret; @@ -399,26 +371,6 @@ static int ad9467_outputmode_set(struct spi_device *spi, unsigned int mode) AN877_ADC_TRANSFER_SYNC); } -static int ad9467_scale_fill(struct adi_axi_adc_conv *conv) -{ - const struct adi_axi_adc_chip_info *info = conv->chip_info; - struct ad9467_state *st = adi_axi_adc_conv_priv(conv); - unsigned int i, val1, val2; - - st->scales = devm_kmalloc_array(&st->spi->dev, info->num_scales, - sizeof(*st->scales), GFP_KERNEL); - if (!st->scales) - return -ENOMEM; - - for (i = 0; i < info->num_scales; i++) { - __ad9467_get_scale(conv, i, &val1, &val2); - st->scales[i][0] = val1; - st->scales[i][1] = val2; - } - - return 0; -} - static int ad9467_preenable_setup(struct adi_axi_adc_conv *conv) { struct ad9467_state *st = adi_axi_adc_conv_priv(conv); @@ -426,21 +378,6 @@ static int ad9467_preenable_setup(struct adi_axi_adc_conv *conv) return ad9467_outputmode_set(st->spi, st->output_mode); } -static int ad9467_reset(struct device *dev) -{ - struct gpio_desc *gpio; - - gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); - if (IS_ERR_OR_NULL(gpio)) - return PTR_ERR_OR_ZERO(gpio); - - fsleep(1); - gpiod_set_value_cansleep(gpio, 0); - fsleep(10 * USEC_PER_MSEC); - - return 0; -} - static int ad9467_probe(struct spi_device *spi) { const struct ad9467_chip_info *info; @@ -469,16 +406,21 @@ static int ad9467_probe(struct spi_device *spi) if (IS_ERR(st->pwrdown_gpio)) return PTR_ERR(st->pwrdown_gpio); - ret = ad9467_reset(&spi->dev); - if (ret) - return ret; + st->reset_gpio = devm_gpiod_get_optional(&spi->dev, "reset", + GPIOD_OUT_LOW); + if (IS_ERR(st->reset_gpio)) + return PTR_ERR(st->reset_gpio); + + if (st->reset_gpio) { + udelay(1); + ret = gpiod_direction_output(st->reset_gpio, 1); + if (ret) + return ret; + mdelay(10); + } conv->chip_info = &info->axi_adc_info; - ret = ad9467_scale_fill(conv); - if (ret) - return ret; - id = ad9467_spi_read(spi, AN877_ADC_REG_CHIP_ID); if (id != conv->chip_info->id) { dev_err(&spi->dev, "Mismatch CHIP_ID, got 0x%X, expected 0x%X\n", @@ -489,7 +431,6 @@ static int ad9467_probe(struct spi_device *spi) conv->reg_access = ad9467_reg_access; conv->write_raw = ad9467_write_raw; conv->read_raw = ad9467_read_raw; - conv->read_avail = ad9467_read_avail; conv->preenable_setup = ad9467_preenable_setup; st->output_mode = info->default_output_mode | diff --git a/drivers/iio/adc/adi-axi-adc.c b/drivers/iio/adc/adi-axi-adc.c index ad386ac7f03c..e8a8ea4140f1 100644 --- a/drivers/iio/adc/adi-axi-adc.c +++ b/drivers/iio/adc/adi-axi-adc.c @@ -143,20 +143,6 @@ static int adi_axi_adc_write_raw(struct iio_dev *indio_dev, return conv->write_raw(conv, chan, val, val2, mask); } -static int adi_axi_adc_read_avail(struct iio_dev *indio_dev, - struct iio_chan_spec const *chan, - const int **vals, int *type, int *length, - long mask) -{ - struct adi_axi_adc_state *st = iio_priv(indio_dev); - struct adi_axi_adc_conv *conv = &st->client->conv; - - if (!conv->read_avail) - return -EOPNOTSUPP; - - return conv->read_avail(conv, chan, vals, type, length, mask); -} - static int adi_axi_adc_update_scan_mode(struct iio_dev *indio_dev, const unsigned long *scan_mask) { @@ -241,11 +227,69 @@ struct adi_axi_adc_conv *devm_adi_axi_adc_conv_register(struct device *dev, } EXPORT_SYMBOL_NS_GPL(devm_adi_axi_adc_conv_register, IIO_ADI_AXI); +static ssize_t in_voltage_scale_available_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct iio_dev *indio_dev = dev_to_iio_dev(dev); + struct adi_axi_adc_state *st = iio_priv(indio_dev); + struct adi_axi_adc_conv *conv = &st->client->conv; + size_t len = 0; + int i; + + for (i = 0; i < conv->chip_info->num_scales; i++) { + const unsigned int *s = conv->chip_info->scale_table[i]; + + len += scnprintf(buf + len, PAGE_SIZE - len, + "%u.%06u ", s[0], s[1]); + } + buf[len - 1] = '\n'; + + return len; +} + +static IIO_DEVICE_ATTR_RO(in_voltage_scale_available, 0); + +enum { + ADI_AXI_ATTR_SCALE_AVAIL, +}; + +#define ADI_AXI_ATTR(_en_, _file_) \ + [ADI_AXI_ATTR_##_en_] = &iio_dev_attr_##_file_.dev_attr.attr + +static struct attribute *adi_axi_adc_attributes[] = { + ADI_AXI_ATTR(SCALE_AVAIL, in_voltage_scale_available), + NULL +}; + +static umode_t axi_adc_attr_is_visible(struct kobject *kobj, + struct attribute *attr, int n) +{ + struct device *dev = kobj_to_dev(kobj); + struct iio_dev *indio_dev = dev_to_iio_dev(dev); + struct adi_axi_adc_state *st = iio_priv(indio_dev); + struct adi_axi_adc_conv *conv = &st->client->conv; + + switch (n) { + case ADI_AXI_ATTR_SCALE_AVAIL: + if (!conv->chip_info->num_scales) + return 0; + return attr->mode; + default: + return attr->mode; + } +} + +static const struct attribute_group adi_axi_adc_attribute_group = { + .attrs = adi_axi_adc_attributes, + .is_visible = axi_adc_attr_is_visible, +}; + static const struct iio_info adi_axi_adc_info = { .read_raw = &adi_axi_adc_read_raw, .write_raw = &adi_axi_adc_write_raw, + .attrs = &adi_axi_adc_attribute_group, .update_scan_mode = &adi_axi_adc_update_scan_mode, - .read_avail = &adi_axi_adc_read_avail, }; static const struct adi_axi_adc_core_info adi_axi_adc_10_0_a_info = { diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c index 3ac253a27dd9..642c5c4895e3 100644 --- a/drivers/iio/adc/ti_am335x_adc.c +++ b/drivers/iio/adc/ti_am335x_adc.c @@ -671,10 +671,8 @@ static int tiadc_probe(struct platform_device *pdev) platform_set_drvdata(pdev, indio_dev); err = tiadc_request_dma(pdev, adc_dev); - if (err && err != -ENODEV) { - dev_err_probe(&pdev->dev, err, "DMA request failed\n"); + if (err && err == -EPROBE_DEFER) goto err_dma; - } return 0; diff --git a/drivers/iio/buffer/industrialio-triggered-buffer.c b/drivers/iio/buffer/industrialio-triggered-buffer.c index 2b7873e8a959..8d4fc97d1005 100644 --- a/drivers/iio/buffer/industrialio-triggered-buffer.c +++ b/drivers/iio/buffer/industrialio-triggered-buffer.c @@ -46,16 +46,6 @@ int iio_triggered_buffer_setup_ext(struct iio_dev *indio_dev, struct iio_buffer *buffer; int ret; - /* - * iio_triggered_buffer_cleanup() assumes that the buffer allocated here - * is assigned to indio_dev->buffer but this is only the case if this - * function is the first caller to iio_device_attach_buffer(). If - * indio_dev->buffer is already set then we can't proceed otherwise the - * cleanup function will try to free a buffer that was not allocated here. - */ - if (indio_dev->buffer) - return -EADDRINUSE; - buffer = iio_kfifo_allocate(); if (!buffer) { ret = -ENOMEM; diff --git a/drivers/iio/common/ms_sensors/ms_sensors_i2c.c b/drivers/iio/common/ms_sensors/ms_sensors_i2c.c index 9c9bc77003c7..6633b35a94e6 100644 --- a/drivers/iio/common/ms_sensors/ms_sensors_i2c.c +++ b/drivers/iio/common/ms_sensors/ms_sensors_i2c.c @@ -15,8 +15,8 @@ /* Conversion times in us */ static const u16 ms_sensors_ht_t_conversion_time[] = { 50000, 25000, 13000, 7000 }; -static const u16 ms_sensors_ht_h_conversion_time[] = { 16000, 5000, - 3000, 8000 }; +static const u16 ms_sensors_ht_h_conversion_time[] = { 16000, 3000, + 5000, 8000 }; static const u16 ms_sensors_tp_conversion_time[] = { 500, 1100, 2100, 4100, 8220, 16440 }; diff --git a/drivers/iio/imu/adis16475.c b/drivers/iio/imu/adis16475.c index 2d939773445d..aec55f7e1f26 100644 --- a/drivers/iio/imu/adis16475.c +++ b/drivers/iio/imu/adis16475.c @@ -1243,59 +1243,6 @@ static int adis16475_config_irq_pin(struct adis16475 *st) return 0; } - -static int adis16475_probe(struct spi_device *spi) -{ - struct iio_dev *indio_dev; - struct adis16475 *st; - int ret; - - indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); - if (!indio_dev) - return -ENOMEM; - - st = iio_priv(indio_dev); - - st->info = spi_get_device_match_data(spi); - if (!st->info) - return -EINVAL; - - ret = adis_init(&st->adis, indio_dev, spi, &st->info->adis_data); - if (ret) - return ret; - - indio_dev->name = st->info->name; - indio_dev->channels = st->info->channels; - indio_dev->num_channels = st->info->num_channels; - indio_dev->info = &adis16475_info; - indio_dev->modes = INDIO_DIRECT_MODE; - - ret = __adis_initial_startup(&st->adis); - if (ret) - return ret; - - ret = adis16475_config_irq_pin(st); - if (ret) - return ret; - - ret = adis16475_config_sync_mode(st); - if (ret) - return ret; - - ret = devm_adis_setup_buffer_and_trigger(&st->adis, indio_dev, - adis16475_trigger_handler); - if (ret) - return ret; - - ret = devm_iio_device_register(&spi->dev, indio_dev); - if (ret) - return ret; - - adis16475_debugfs_init(indio_dev); - - return 0; -} - static const struct of_device_id adis16475_of_match[] = { { .compatible = "adi,adis16470", .data = &adis16475_chip_info[ADIS16470] }, @@ -1341,30 +1288,57 @@ static const struct of_device_id adis16475_of_match[] = { }; MODULE_DEVICE_TABLE(of, adis16475_of_match); -static const struct spi_device_id adis16475_ids[] = { - { "adis16470", (kernel_ulong_t)&adis16475_chip_info[ADIS16470] }, - { "adis16475-1", (kernel_ulong_t)&adis16475_chip_info[ADIS16475_1] }, - { "adis16475-2", (kernel_ulong_t)&adis16475_chip_info[ADIS16475_2] }, - { "adis16475-3", (kernel_ulong_t)&adis16475_chip_info[ADIS16475_3] }, - { "adis16477-1", (kernel_ulong_t)&adis16475_chip_info[ADIS16477_1] }, - { "adis16477-2", (kernel_ulong_t)&adis16475_chip_info[ADIS16477_2] }, - { "adis16477-3", (kernel_ulong_t)&adis16475_chip_info[ADIS16477_3] }, - { "adis16465-1", (kernel_ulong_t)&adis16475_chip_info[ADIS16465_1] }, - { "adis16465-2", (kernel_ulong_t)&adis16475_chip_info[ADIS16465_2] }, - { "adis16465-3", (kernel_ulong_t)&adis16475_chip_info[ADIS16465_3] }, - { "adis16467-1", (kernel_ulong_t)&adis16475_chip_info[ADIS16467_1] }, - { "adis16467-2", (kernel_ulong_t)&adis16475_chip_info[ADIS16467_2] }, - { "adis16467-3", (kernel_ulong_t)&adis16475_chip_info[ADIS16467_3] }, - { "adis16500", (kernel_ulong_t)&adis16475_chip_info[ADIS16500] }, - { "adis16505-1", (kernel_ulong_t)&adis16475_chip_info[ADIS16505_1] }, - { "adis16505-2", (kernel_ulong_t)&adis16475_chip_info[ADIS16505_2] }, - { "adis16505-3", (kernel_ulong_t)&adis16475_chip_info[ADIS16505_3] }, - { "adis16507-1", (kernel_ulong_t)&adis16475_chip_info[ADIS16507_1] }, - { "adis16507-2", (kernel_ulong_t)&adis16475_chip_info[ADIS16507_2] }, - { "adis16507-3", (kernel_ulong_t)&adis16475_chip_info[ADIS16507_3] }, - { } -}; -MODULE_DEVICE_TABLE(spi, adis16475_ids); +static int adis16475_probe(struct spi_device *spi) +{ + struct iio_dev *indio_dev; + struct adis16475 *st; + int ret; + + indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); + if (!indio_dev) + return -ENOMEM; + + st = iio_priv(indio_dev); + + st->info = device_get_match_data(&spi->dev); + if (!st->info) + return -EINVAL; + + ret = adis_init(&st->adis, indio_dev, spi, &st->info->adis_data); + if (ret) + return ret; + + indio_dev->name = st->info->name; + indio_dev->channels = st->info->channels; + indio_dev->num_channels = st->info->num_channels; + indio_dev->info = &adis16475_info; + indio_dev->modes = INDIO_DIRECT_MODE; + + ret = __adis_initial_startup(&st->adis); + if (ret) + return ret; + + ret = adis16475_config_irq_pin(st); + if (ret) + return ret; + + ret = adis16475_config_sync_mode(st); + if (ret) + return ret; + + ret = devm_adis_setup_buffer_and_trigger(&st->adis, indio_dev, + adis16475_trigger_handler); + if (ret) + return ret; + + ret = devm_iio_device_register(&spi->dev, indio_dev); + if (ret) + return ret; + + adis16475_debugfs_init(indio_dev); + + return 0; +} static struct spi_driver adis16475_driver = { .driver = { @@ -1372,7 +1346,6 @@ static struct spi_driver adis16475_driver = { .of_match_table = adis16475_of_match, }, .probe = adis16475_probe, - .id_table = adis16475_ids, }; module_spi_driver(adis16475_driver); diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c index 19a1ef5351d2..86fbbe904050 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c @@ -736,13 +736,13 @@ inv_mpu6050_read_raw(struct iio_dev *indio_dev, ret = inv_mpu6050_sensor_show(st, st->reg->gyro_offset, chan->channel2, val); mutex_unlock(&st->lock); - return ret; + return IIO_VAL_INT; case IIO_ACCEL: mutex_lock(&st->lock); ret = inv_mpu6050_sensor_show(st, st->reg->accl_offset, chan->channel2, val); mutex_unlock(&st->lock); - return ret; + return IIO_VAL_INT; default: return -EINVAL; diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c index 58fbb1d3b7f4..c2ee80546d12 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c @@ -2819,10 +2819,6 @@ static int free_mr_alloc_res(struct hns_roce_dev *hr_dev) return 0; create_failed_qp: - for (i--; i >= 0; i--) { - hns_roce_v2_destroy_qp(&free_mr->rsv_qp[i]->ibqp, NULL); - kfree(free_mr->rsv_qp[i]); - } hns_roce_destroy_cq(cq, NULL); kfree(cq); @@ -5795,7 +5791,7 @@ static int hns_roce_v2_modify_srq(struct ib_srq *ibsrq, /* Resizing SRQs is not supported yet */ if (srq_attr_mask & IB_SRQ_MAX_WR) - return -EOPNOTSUPP; + return -EINVAL; if (srq_attr_mask & IB_SRQ_LIMIT) { if (srq_attr->srq_limit > srq->wqe_cnt) diff --git a/drivers/infiniband/hw/hns/hns_roce_pd.c b/drivers/infiniband/hw/hns/hns_roce_pd.c index bd1fe89ca205..783e71852c50 100644 --- a/drivers/infiniband/hw/hns/hns_roce_pd.c +++ b/drivers/infiniband/hw/hns/hns_roce_pd.c @@ -150,7 +150,7 @@ int hns_roce_alloc_xrcd(struct ib_xrcd *ib_xrcd, struct ib_udata *udata) int ret; if (!(hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_XRC)) - return -EOPNOTSUPP; + return -EINVAL; ret = hns_roce_xrcd_alloc(hr_dev, &xrcd->xrcdn); if (ret) diff --git a/drivers/infiniband/hw/mthca/mthca_cmd.c b/drivers/infiniband/hw/mthca/mthca_cmd.c index 8fe0cef7e2be..f330ce895d88 100644 --- a/drivers/infiniband/hw/mthca/mthca_cmd.c +++ b/drivers/infiniband/hw/mthca/mthca_cmd.c @@ -635,7 +635,7 @@ void mthca_free_mailbox(struct mthca_dev *dev, struct mthca_mailbox *mailbox) int mthca_SYS_EN(struct mthca_dev *dev) { - u64 out = 0; + u64 out; int ret; ret = mthca_cmd_imm(dev, 0, &out, 0, 0, CMD_SYS_EN, CMD_TIME_CLASS_D); @@ -1955,7 +1955,7 @@ int mthca_WRITE_MGM(struct mthca_dev *dev, int index, int mthca_MGID_HASH(struct mthca_dev *dev, struct mthca_mailbox *mailbox, u16 *hash) { - u64 imm = 0; + u64 imm; int err; err = mthca_cmd_imm(dev, mailbox->dma, &imm, 0, 0, CMD_MGID_HASH, diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c index 1ab268b77096..b54bc8865dae 100644 --- a/drivers/infiniband/hw/mthca/mthca_main.c +++ b/drivers/infiniband/hw/mthca/mthca_main.c @@ -382,7 +382,7 @@ static int mthca_init_icm(struct mthca_dev *mdev, struct mthca_init_hca_param *init_hca, u64 icm_size) { - u64 aux_pages = 0; + u64 aux_pages; int err; err = mthca_SET_ICM_SIZE(mdev, icm_size, &aux_pages); diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h index d967d5532459..dee8c97ff056 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.h +++ b/drivers/infiniband/ulp/iser/iscsi_iser.h @@ -317,10 +317,12 @@ struct iser_device { * * @mr: memory region * @sig_mr: signature memory region + * @mr_valid: is mr valid indicator */ struct iser_reg_resources { struct ib_mr *mr; struct ib_mr *sig_mr; + u8 mr_valid:1; }; /** diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c index 8ec470c519e8..7b83f48f60c5 100644 --- a/drivers/infiniband/ulp/iser/iser_initiator.c +++ b/drivers/infiniband/ulp/iser/iser_initiator.c @@ -580,10 +580,7 @@ static inline int iser_inv_desc(struct iser_fr_desc *desc, u32 rkey) return -EINVAL; } - if (desc->sig_protected) - desc->rsc.sig_mr->need_inval = false; - else - desc->rsc.mr->need_inval = false; + desc->rsc.mr_valid = 0; return 0; } diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c index 6efcb79c8efe..29ae2c6a250a 100644 --- a/drivers/infiniband/ulp/iser/iser_memory.c +++ b/drivers/infiniband/ulp/iser/iser_memory.c @@ -264,7 +264,7 @@ static int iser_reg_sig_mr(struct iscsi_iser_task *iser_task, iser_set_prot_checks(iser_task->sc, &sig_attrs->check_mask); - if (rsc->sig_mr->need_inval) + if (rsc->mr_valid) iser_inv_rkey(&tx_desc->inv_wr, mr, cqe, &wr->wr); ib_update_fast_reg_key(mr, ib_inc_rkey(mr->rkey)); @@ -288,7 +288,7 @@ static int iser_reg_sig_mr(struct iscsi_iser_task *iser_task, wr->access = IB_ACCESS_LOCAL_WRITE | IB_ACCESS_REMOTE_READ | IB_ACCESS_REMOTE_WRITE; - rsc->sig_mr->need_inval = true; + rsc->mr_valid = 1; sig_reg->sge.lkey = mr->lkey; sig_reg->rkey = mr->rkey; @@ -313,7 +313,7 @@ static int iser_fast_reg_mr(struct iscsi_iser_task *iser_task, struct ib_reg_wr *wr = &tx_desc->reg_wr; int n; - if (rsc->mr->need_inval) + if (rsc->mr_valid) iser_inv_rkey(&tx_desc->inv_wr, mr, cqe, &wr->wr); ib_update_fast_reg_key(mr, ib_inc_rkey(mr->rkey)); @@ -336,7 +336,7 @@ static int iser_fast_reg_mr(struct iscsi_iser_task *iser_task, IB_ACCESS_REMOTE_WRITE | IB_ACCESS_REMOTE_READ; - rsc->mr->need_inval = true; + rsc->mr_valid = 1; reg->sge.lkey = mr->lkey; reg->rkey = mr->rkey; diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c index 057e69164e6d..a00ca117303a 100644 --- a/drivers/infiniband/ulp/iser/iser_verbs.c +++ b/drivers/infiniband/ulp/iser/iser_verbs.c @@ -135,6 +135,7 @@ iser_create_fastreg_desc(struct iser_device *device, goto err_alloc_mr_integrity; } } + desc->rsc.mr_valid = 0; return desc; diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index e8011d70d079..8404286302b0 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c @@ -286,7 +286,6 @@ static const struct xpad_device { { 0x146b, 0x0604, "Bigben Interactive DAIJA Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, { 0x1532, 0x0a00, "Razer Atrox Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE }, { 0x1532, 0x0a03, "Razer Wildcat", 0, XTYPE_XBOXONE }, - { 0x1532, 0x0a29, "Razer Wolverine V2", 0, XTYPE_XBOXONE }, { 0x15e4, 0x3f00, "Power A Mini Pro Elite", 0, XTYPE_XBOX360 }, { 0x15e4, 0x3f0a, "Xbox Airflo wired controller", 0, XTYPE_XBOX360 }, { 0x15e4, 0x3f10, "Batarang Xbox 360 controller", 0, XTYPE_XBOX360 }, diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index c4d8caadec59..246958795f60 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c @@ -746,44 +746,6 @@ static void atkbd_deactivate(struct atkbd *atkbd) ps2dev->serio->phys); } -#ifdef CONFIG_X86 -static bool atkbd_is_portable_device(void) -{ - static const char * const chassis_types[] = { - "8", /* Portable */ - "9", /* Laptop */ - "10", /* Notebook */ - "14", /* Sub-Notebook */ - "31", /* Convertible */ - "32", /* Detachable */ - }; - int i; - - for (i = 0; i < ARRAY_SIZE(chassis_types); i++) - if (dmi_match(DMI_CHASSIS_TYPE, chassis_types[i])) - return true; - - return false; -} - -/* - * On many modern laptops ATKBD_CMD_GETID may cause problems, on these laptops - * the controller is always in translated mode. In this mode mice/touchpads will - * not work. So in this case simply assume a keyboard is connected to avoid - * confusing some laptop keyboards. - * - * Skipping ATKBD_CMD_GETID ends up using a fake keyboard id. Using the standard - * 0xab83 id is ok in translated mode, only atkbd_select_set() checks atkbd->id - * and in translated mode that is a no-op. - */ -static bool atkbd_skip_getid(struct atkbd *atkbd) -{ - return atkbd->translated && atkbd_is_portable_device(); -} -#else -static inline bool atkbd_skip_getid(struct atkbd *atkbd) { return false; } -#endif - /* * atkbd_probe() probes for an AT keyboard on a serio port. */ @@ -792,7 +754,6 @@ static int atkbd_probe(struct atkbd *atkbd) { struct ps2dev *ps2dev = &atkbd->ps2dev; unsigned char param[2]; - bool skip_getid; /* * Some systems, where the bit-twiddling when testing the io-lines of the @@ -814,18 +775,17 @@ static int atkbd_probe(struct atkbd *atkbd) */ param[0] = param[1] = 0xa5; /* initialize with invalid values */ - skip_getid = atkbd_skip_getid(atkbd); - if (skip_getid || ps2_command(ps2dev, param, ATKBD_CMD_GETID)) { + if (ps2_command(ps2dev, param, ATKBD_CMD_GETID)) { /* - * If the get ID command was skipped or failed, we check if we can at least set - * the LEDs on the keyboard. This should work on every keyboard out there. - * It also turns the LEDs off, which we want anyway. + * If the get ID command failed, we check if we can at least set the LEDs on + * the keyboard. This should work on every keyboard out there. It also turns + * the LEDs off, which we want anyway. */ param[0] = 0; if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS)) return -1; - atkbd->id = skip_getid ? 0xab83 : 0xabba; + atkbd->id = 0xabba; return 0; } diff --git a/drivers/input/keyboard/ipaq-micro-keys.c b/drivers/input/keyboard/ipaq-micro-keys.c index e0c51189e329..13a66a8e3411 100644 --- a/drivers/input/keyboard/ipaq-micro-keys.c +++ b/drivers/input/keyboard/ipaq-micro-keys.c @@ -105,9 +105,6 @@ static int micro_key_probe(struct platform_device *pdev) keys->codes = devm_kmemdup(&pdev->dev, micro_keycodes, keys->input->keycodesize * keys->input->keycodemax, GFP_KERNEL); - if (!keys->codes) - return -ENOMEM; - keys->input->keycode = keys->codes; __set_bit(EV_KEY, keys->input->evbit); diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c index 9116f4248fd0..e79f5497948b 100644 --- a/drivers/input/misc/soc_button_array.c +++ b/drivers/input/misc/soc_button_array.c @@ -299,11 +299,6 @@ static int soc_button_parse_btn_desc(struct device *dev, info->name = "power"; info->event_code = KEY_POWER; info->wakeup = true; - } else if (upage == 0x01 && usage == 0xc6) { - info->name = "airplane mode switch"; - info->event_type = EV_SW; - info->event_code = SW_RFKILL_ALL; - info->active_low = false; } else if (upage == 0x01 && usage == 0xca) { info->name = "rotation lock switch"; info->event_type = EV_SW; diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index b6749af46262..e43e93ac2798 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c @@ -183,7 +183,6 @@ static const char * const smbus_pnp_ids[] = { "LEN009b", /* T580 */ "LEN0402", /* X1 Extreme Gen 2 / P1 Gen 2 */ "LEN040f", /* P1 Gen 3 */ - "LEN0411", /* L14 Gen 1 */ "LEN200f", /* T450s */ "LEN2044", /* L470 */ "LEN2054", /* E480 */ diff --git a/drivers/input/serio/i8042-acpipnpio.h b/drivers/input/serio/i8042-acpipnpio.h index b585b1dab870..9c39553d30fa 100644 --- a/drivers/input/serio/i8042-acpipnpio.h +++ b/drivers/input/serio/i8042-acpipnpio.h @@ -360,14 +360,6 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = { }, .driver_data = (void *)(SERIO_QUIRK_DRITEK) }, - { - /* Acer TravelMate P459-G2-M */ - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Acer"), - DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate P459-G2-M"), - }, - .driver_data = (void *)(SERIO_QUIRK_NOMUX) - }, { /* Amoi M636/A737 */ .matches = { diff --git a/drivers/interconnect/core.c b/drivers/interconnect/core.c index 4526ff2e1bd5..137c9ea60a6b 100644 --- a/drivers/interconnect/core.c +++ b/drivers/interconnect/core.c @@ -380,9 +380,6 @@ struct icc_node_data *of_icc_get_from_provider(struct of_phandle_args *spec) } mutex_unlock(&icc_lock); - if (!node) - return ERR_PTR(-EINVAL); - if (IS_ERR(node)) return ERR_CAST(node); diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c index d80065c8105a..b2708de25ea3 100644 --- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c +++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c @@ -243,7 +243,6 @@ static int qcom_adreno_smmu_init_context(struct arm_smmu_domain *smmu_domain, static const struct of_device_id qcom_smmu_client_of_match[] __maybe_unused = { { .compatible = "qcom,adreno" }, - { .compatible = "qcom,adreno-gmu" }, { .compatible = "qcom,mdp4" }, { .compatible = "qcom,mdss" }, { .compatible = "qcom,sc7180-mdss" }, diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index 3fd1886004c2..cb0dc831834c 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -29,9 +29,6 @@ #include #include #include -#ifndef __GENKSYMS__ -#include -#endif #include #include "dma-iommu.h" @@ -1018,8 +1015,6 @@ static dma_addr_t iommu_dma_map_page(struct device *dev, struct page *page, return DMA_MAPPING_ERROR; } - trace_swiotlb_bounced(dev, phys, size); - aligned_size = iova_align(iovad, size); phys = swiotlb_tbl_map_single(dev, phys, size, aligned_size, iova_mask(iovad), dir, attrs); diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 509d03eb3e8d..2378cfb7443e 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -97,7 +97,6 @@ config LEDS_ARIEL config LEDS_AW2013 tristate "LED support for Awinic AW2013" depends on LEDS_CLASS && I2C && OF - select REGMAP_I2C help This option enables support for the AW2013 3-channel LED driver. diff --git a/drivers/leds/trigger/ledtrig-tty.c b/drivers/leds/trigger/ledtrig-tty.c index 3e69a7bde928..8ae0d2d284af 100644 --- a/drivers/leds/trigger/ledtrig-tty.c +++ b/drivers/leds/trigger/ledtrig-tty.c @@ -168,10 +168,6 @@ static void ledtrig_tty_deactivate(struct led_classdev *led_cdev) cancel_delayed_work_sync(&trigger_data->dwork); - kfree(trigger_data->ttyname); - tty_kref_put(trigger_data->tty); - trigger_data->tty = NULL; - kfree(trigger_data); } diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig index 653fd80f8317..ef70f60a73ed 100644 --- a/drivers/md/Kconfig +++ b/drivers/md/Kconfig @@ -671,7 +671,6 @@ config DM_ZONED config DM_AUDIT bool "DM audit events" - depends on BLK_DEV_DM depends on AUDIT help Generate audit events for device-mapper. diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h index e86fa736dc4e..aebb7ef10e63 100644 --- a/drivers/md/bcache/bcache.h +++ b/drivers/md/bcache/bcache.h @@ -265,7 +265,6 @@ struct bcache_device { #define BCACHE_DEV_WB_RUNNING 3 #define BCACHE_DEV_RATE_DW_RUNNING 4 int nr_stripes; -#define BCH_MIN_STRIPE_SZ ((4 << 20) >> SECTOR_SHIFT) unsigned int stripe_size; atomic_t *stripe_sectors_dirty; unsigned long *full_dirty_stripes; diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c index 6a2f57ae0f3c..05e3157fc7b4 100644 --- a/drivers/md/bcache/btree.c +++ b/drivers/md/bcache/btree.c @@ -974,9 +974,6 @@ err: * * The btree node will have either a read or a write lock held, depending on * level and op->lock. - * - * Note: Only error code or btree pointer will be returned, it is unncessary - * for callers to check NULL pointer. */ struct btree *bch_btree_node_get(struct cache_set *c, struct btree_op *op, struct bkey *k, int level, bool write, @@ -1088,10 +1085,6 @@ retry: mutex_unlock(&b->c->bucket_lock); } -/* - * Only error code or btree pointer will be returned, it is unncessary for - * callers to check NULL pointer. - */ struct btree *__bch_btree_node_alloc(struct cache_set *c, struct btree_op *op, int level, bool wait, struct btree *parent) diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 70e5bd8961d2..7660962e7b8b 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -905,8 +905,6 @@ static int bcache_device_init(struct bcache_device *d, unsigned int block_size, if (!d->stripe_size) d->stripe_size = 1 << 31; - else if (d->stripe_size < BCH_MIN_STRIPE_SZ) - d->stripe_size = roundup(BCH_MIN_STRIPE_SZ, d->stripe_size); n = DIV_ROUND_UP_ULL(sectors, d->stripe_size); if (!n || n > max_stripes) { @@ -2019,7 +2017,7 @@ static int run_cache_set(struct cache_set *c) c->root = bch_btree_node_get(c, NULL, k, j->btree_level, true, NULL); - if (IS_ERR(c->root)) + if (IS_ERR_OR_NULL(c->root)) goto err; list_del_init(&c->root->list); diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c index 18c6e0d2877b..01c7c6ca4789 100644 --- a/drivers/md/bcache/writeback.c +++ b/drivers/md/bcache/writeback.c @@ -913,7 +913,7 @@ static int bch_dirty_init_thread(void *arg) int cur_idx, prev_idx, skip_nr; k = p = NULL; - prev_idx = 0; + cur_idx = prev_idx = 0; bch_btree_iter_init(&c->root->keys, &iter, NULL); k = bch_btree_iter_next_filter(&iter, &c->root->keys, bch_ptr_bad); diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c index 8f077fc34f9a..45b09be3d86b 100644 --- a/drivers/md/dm-bufio.c +++ b/drivers/md/dm-bufio.c @@ -1923,13 +1923,6 @@ void dm_bufio_client_destroy(struct dm_bufio_client *c) } EXPORT_SYMBOL_GPL(dm_bufio_client_destroy); -void dm_bufio_client_reset(struct dm_bufio_client *c) -{ - drop_buffers(c); - flush_work(&c->shrink_work); -} -EXPORT_SYMBOL_GPL(dm_bufio_client_reset); - void dm_bufio_set_sector_offset(struct dm_bufio_client *c, sector_t start) { c->start = start; diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c index 77fcff82c82a..fe7dad3ffa75 100644 --- a/drivers/md/dm-integrity.c +++ b/drivers/md/dm-integrity.c @@ -1763,12 +1763,11 @@ static void integrity_metadata(struct work_struct *w) sectors_to_process = dio->range.n_sectors; __bio_for_each_segment(bv, bio, iter, dio->bio_details.bi_iter) { - struct bio_vec bv_copy = bv; unsigned int pos; char *mem, *checksums_ptr; again: - mem = bvec_kmap_local(&bv_copy); + mem = bvec_kmap_local(&bv); pos = 0; checksums_ptr = checksums; do { @@ -1777,7 +1776,7 @@ again: sectors_to_process -= ic->sectors_per_block; pos += ic->sectors_per_block << SECTOR_SHIFT; sector += ic->sectors_per_block; - } while (pos < bv_copy.bv_len && sectors_to_process && checksums != checksums_onstack); + } while (pos < bv.bv_len && sectors_to_process && checksums != checksums_onstack); kunmap_local(mem); r = dm_integrity_rw_tag(ic, checksums, &dio->metadata_block, &dio->metadata_offset, @@ -1802,9 +1801,9 @@ again: if (!sectors_to_process) break; - if (unlikely(pos < bv_copy.bv_len)) { - bv_copy.bv_offset += pos; - bv_copy.bv_len -= pos; + if (unlikely(pos < bv.bv_len)) { + bv.bv_offset += pos; + bv.bv_len -= pos; goto again; } } diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c index bb0e0a270f62..4a0e15109997 100644 --- a/drivers/md/dm-thin-metadata.c +++ b/drivers/md/dm-thin-metadata.c @@ -597,8 +597,6 @@ static int __format_metadata(struct dm_pool_metadata *pmd) r = dm_tm_create_with_sm(pmd->bm, THIN_SUPERBLOCK_LOCATION, &pmd->tm, &pmd->metadata_sm); if (r < 0) { - pmd->tm = NULL; - pmd->metadata_sm = NULL; DMERR("tm_create_with_sm failed"); return r; } @@ -607,7 +605,6 @@ static int __format_metadata(struct dm_pool_metadata *pmd) if (IS_ERR(pmd->data_sm)) { DMERR("sm_disk_create failed"); r = PTR_ERR(pmd->data_sm); - pmd->data_sm = NULL; goto bad_cleanup_tm; } @@ -638,15 +635,11 @@ static int __format_metadata(struct dm_pool_metadata *pmd) bad_cleanup_nb_tm: dm_tm_destroy(pmd->nb_tm); - pmd->nb_tm = NULL; bad_cleanup_data_sm: dm_sm_destroy(pmd->data_sm); - pmd->data_sm = NULL; bad_cleanup_tm: dm_tm_destroy(pmd->tm); - pmd->tm = NULL; dm_sm_destroy(pmd->metadata_sm); - pmd->metadata_sm = NULL; return r; } @@ -712,8 +705,6 @@ static int __open_metadata(struct dm_pool_metadata *pmd) sizeof(disk_super->metadata_space_map_root), &pmd->tm, &pmd->metadata_sm); if (r < 0) { - pmd->tm = NULL; - pmd->metadata_sm = NULL; DMERR("tm_open_with_sm failed"); goto bad_unlock_sblock; } @@ -723,7 +714,6 @@ static int __open_metadata(struct dm_pool_metadata *pmd) if (IS_ERR(pmd->data_sm)) { DMERR("sm_disk_open failed"); r = PTR_ERR(pmd->data_sm); - pmd->data_sm = NULL; goto bad_cleanup_tm; } @@ -750,12 +740,9 @@ static int __open_metadata(struct dm_pool_metadata *pmd) bad_cleanup_data_sm: dm_sm_destroy(pmd->data_sm); - pmd->data_sm = NULL; bad_cleanup_tm: dm_tm_destroy(pmd->tm); - pmd->tm = NULL; dm_sm_destroy(pmd->metadata_sm); - pmd->metadata_sm = NULL; bad_unlock_sblock: dm_bm_unlock(sblock); @@ -802,13 +789,9 @@ static void __destroy_persistent_data_objects(struct dm_pool_metadata *pmd, bool destroy_bm) { dm_sm_destroy(pmd->data_sm); - pmd->data_sm = NULL; dm_sm_destroy(pmd->metadata_sm); - pmd->metadata_sm = NULL; dm_tm_destroy(pmd->nb_tm); - pmd->nb_tm = NULL; dm_tm_destroy(pmd->tm); - pmd->tm = NULL; if (destroy_bm) dm_block_manager_destroy(pmd->bm); } @@ -1016,7 +999,8 @@ int dm_pool_metadata_close(struct dm_pool_metadata *pmd) __func__, r); } pmd_write_unlock(pmd); - __destroy_persistent_data_objects(pmd, true); + if (!pmd->fail_io) + __destroy_persistent_data_objects(pmd, true); kfree(pmd); return 0; @@ -1891,29 +1875,53 @@ static void __set_abort_with_changes_flags(struct dm_pool_metadata *pmd) int dm_pool_abort_metadata(struct dm_pool_metadata *pmd) { int r = -EINVAL; + struct dm_block_manager *old_bm = NULL, *new_bm = NULL; /* fail_io is double-checked with pmd->root_lock held below */ if (unlikely(pmd->fail_io)) return r; + /* + * Replacement block manager (new_bm) is created and old_bm destroyed outside of + * pmd root_lock to avoid ABBA deadlock that would result (due to life-cycle of + * shrinker associated with the block manager's bufio client vs pmd root_lock). + * - must take shrinker_rwsem without holding pmd->root_lock + */ + new_bm = dm_block_manager_create(pmd->bdev, THIN_METADATA_BLOCK_SIZE << SECTOR_SHIFT, + THIN_MAX_CONCURRENT_LOCKS); + pmd_write_lock(pmd); if (pmd->fail_io) { pmd_write_unlock(pmd); - return r; + goto out; } + __set_abort_with_changes_flags(pmd); - - /* destroy data_sm/metadata_sm/nb_tm/tm */ __destroy_persistent_data_objects(pmd, false); + old_bm = pmd->bm; + if (IS_ERR(new_bm)) { + DMERR("could not create block manager during abort"); + pmd->bm = NULL; + r = PTR_ERR(new_bm); + goto out_unlock; + } - /* reset bm */ - dm_block_manager_reset(pmd->bm); - - /* rebuild data_sm/metadata_sm/nb_tm/tm */ + pmd->bm = new_bm; r = __open_or_format_metadata(pmd, false); + if (r) { + pmd->bm = NULL; + goto out_unlock; + } + new_bm = NULL; +out_unlock: if (r) pmd->fail_io = true; pmd_write_unlock(pmd); + dm_block_manager_destroy(old_bm); +out: + if (new_bm && !IS_ERR(new_bm)) + dm_block_manager_destroy(new_bm); + return r; } diff --git a/drivers/md/md.c b/drivers/md/md.c index 6120f26a7969..0c2801d77090 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -528,9 +528,6 @@ static void md_end_flush(struct bio *bio) rdev_dec_pending(rdev, mddev); if (atomic_dec_and_test(&mddev->flush_pending)) { - /* The pair is percpu_ref_get() from md_flush_request() */ - percpu_ref_put(&mddev->active_io); - /* The pre-request flush has finished */ queue_work(md_wq, &mddev->flush_work); } @@ -550,8 +547,12 @@ static void submit_flushes(struct work_struct *ws) rdev_for_each_rcu(rdev, mddev) if (rdev->raid_disk >= 0 && !test_bit(Faulty, &rdev->flags)) { + /* Take two references, one is dropped + * when request finishes, one after + * we reclaim rcu_read_lock + */ struct bio *bi; - + atomic_inc(&rdev->nr_pending); atomic_inc(&rdev->nr_pending); rcu_read_unlock(); bi = bio_alloc_bioset(rdev->bdev, 0, @@ -562,6 +563,7 @@ static void submit_flushes(struct work_struct *ws) atomic_inc(&mddev->flush_pending); submit_bio(bi); rcu_read_lock(); + rdev_dec_pending(rdev, mddev); } rcu_read_unlock(); if (atomic_dec_and_test(&mddev->flush_pending)) @@ -614,18 +616,6 @@ bool md_flush_request(struct mddev *mddev, struct bio *bio) /* new request after previous flush is completed */ if (ktime_after(req_start, mddev->prev_flush_start)) { WARN_ON(mddev->flush_bio); - /* - * Grab a reference to make sure mddev_suspend() will wait for - * this flush to be done. - * - * md_flush_reqeust() is called under md_handle_request() and - * 'active_io' is already grabbed, hence percpu_ref_is_zero() - * won't pass, percpu_ref_tryget_live() can't be used because - * percpu_ref_kill() can be called by mddev_suspend() - * concurrently. - */ - WARN_ON(percpu_ref_is_zero(&mddev->active_io)); - percpu_ref_get(&mddev->active_io); mddev->flush_bio = bio; bio = NULL; } diff --git a/drivers/md/persistent-data/dm-block-manager.c b/drivers/md/persistent-data/dm-block-manager.c index 2bbfbb704c75..1f40100908d7 100644 --- a/drivers/md/persistent-data/dm-block-manager.c +++ b/drivers/md/persistent-data/dm-block-manager.c @@ -415,12 +415,6 @@ void dm_block_manager_destroy(struct dm_block_manager *bm) } EXPORT_SYMBOL_GPL(dm_block_manager_destroy); -void dm_block_manager_reset(struct dm_block_manager *bm) -{ - dm_bufio_client_reset(bm->bufio); -} -EXPORT_SYMBOL_GPL(dm_block_manager_reset); - unsigned int dm_bm_block_size(struct dm_block_manager *bm) { return dm_bufio_get_block_size(bm->bufio); diff --git a/drivers/md/persistent-data/dm-block-manager.h b/drivers/md/persistent-data/dm-block-manager.h index 4371d85d3c25..58a23b8ec190 100644 --- a/drivers/md/persistent-data/dm-block-manager.h +++ b/drivers/md/persistent-data/dm-block-manager.h @@ -35,7 +35,6 @@ struct dm_block_manager *dm_block_manager_create( struct block_device *bdev, unsigned int block_size, unsigned int max_held_per_thread); void dm_block_manager_destroy(struct dm_block_manager *bm); -void dm_block_manager_reset(struct dm_block_manager *bm); unsigned int dm_bm_block_size(struct dm_block_manager *bm); dm_block_t dm_bm_nr_blocks(struct dm_block_manager *bm); diff --git a/drivers/md/persistent-data/dm-space-map.h b/drivers/md/persistent-data/dm-space-map.h index 85aa0a3974fe..a015cd11f6e9 100644 --- a/drivers/md/persistent-data/dm-space-map.h +++ b/drivers/md/persistent-data/dm-space-map.h @@ -76,8 +76,7 @@ struct dm_space_map { static inline void dm_sm_destroy(struct dm_space_map *sm) { - if (sm) - sm->destroy(sm); + sm->destroy(sm); } static inline int dm_sm_extend(struct dm_space_map *sm, dm_block_t extra_blocks) diff --git a/drivers/md/persistent-data/dm-transaction-manager.c b/drivers/md/persistent-data/dm-transaction-manager.c index 557a3ecfe75a..39885f835584 100644 --- a/drivers/md/persistent-data/dm-transaction-manager.c +++ b/drivers/md/persistent-data/dm-transaction-manager.c @@ -197,9 +197,6 @@ EXPORT_SYMBOL_GPL(dm_tm_create_non_blocking_clone); void dm_tm_destroy(struct dm_transaction_manager *tm) { - if (!tm) - return; - if (!tm->is_clone) wipe_shadow_table(tm); diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 76f7ca53d812..30f906a67def 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1972,12 +1972,12 @@ static void end_sync_write(struct bio *bio) } static int r1_sync_page_io(struct md_rdev *rdev, sector_t sector, - int sectors, struct page *page, blk_opf_t rw) + int sectors, struct page *page, int rw) { if (sync_page_io(rdev, sector, sectors << 9, page, rw, false)) /* success */ return 1; - if (rw == REQ_OP_WRITE) { + if (rw == WRITE) { set_bit(WriteErrorSeen, &rdev->flags); if (!test_and_set_bit(WantReplacement, &rdev->flags)) @@ -2094,7 +2094,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) rdev = conf->mirrors[d].rdev; if (r1_sync_page_io(rdev, sect, s, pages[idx], - REQ_OP_WRITE) == 0) { + WRITE) == 0) { r1_bio->bios[d]->bi_end_io = NULL; rdev_dec_pending(rdev, mddev); } @@ -2109,7 +2109,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) rdev = conf->mirrors[d].rdev; if (r1_sync_page_io(rdev, sect, s, pages[idx], - REQ_OP_READ) != 0) + READ) != 0) atomic_add(s, &rdev->corrected_errors); } sectors -= s; @@ -2321,7 +2321,7 @@ static void fix_read_error(struct r1conf *conf, int read_disk, atomic_inc(&rdev->nr_pending); rcu_read_unlock(); r1_sync_page_io(rdev, sect, s, - conf->tmppage, REQ_OP_WRITE); + conf->tmppage, WRITE); rdev_dec_pending(rdev, mddev); } else rcu_read_unlock(); @@ -2338,7 +2338,7 @@ static void fix_read_error(struct r1conf *conf, int read_disk, atomic_inc(&rdev->nr_pending); rcu_read_unlock(); if (r1_sync_page_io(rdev, sect, s, - conf->tmppage, REQ_OP_READ)) { + conf->tmppage, READ)) { atomic_add(s, &rdev->corrected_errors); pr_info("md/raid1:%s: read error corrected (%d sectors at %llu on %pg)\n", mdname(mddev), s, diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c index d352e028491a..9f9a97652708 100644 --- a/drivers/media/dvb-core/dvbdev.c +++ b/drivers/media/dvb-core/dvbdev.c @@ -104,8 +104,6 @@ static int dvb_device_open(struct inode *inode, struct file *file) err = file->f_op->open(inode, file); up_read(&minor_rwsem); mutex_unlock(&dvbdev_mutex); - if (err) - dvb_device_put(dvbdev); return err; } fail: diff --git a/drivers/media/dvb-frontends/m88ds3103.c b/drivers/media/dvb-frontends/m88ds3103.c index ce99f7dfb5a5..9a0d43c7ba9e 100644 --- a/drivers/media/dvb-frontends/m88ds3103.c +++ b/drivers/media/dvb-frontends/m88ds3103.c @@ -1894,7 +1894,7 @@ static int m88ds3103_probe(struct i2c_client *client, /* get frontend address */ ret = regmap_read(dev->regmap, 0x29, &utmp); if (ret) - goto err_del_adapters; + goto err_kfree; dev->dt_addr = ((utmp & 0x80) == 0) ? 0x42 >> 1 : 0x40 >> 1; dev_dbg(&client->dev, "dt addr is 0x%02x\n", dev->dt_addr); @@ -1902,14 +1902,11 @@ static int m88ds3103_probe(struct i2c_client *client, dev->dt_addr); if (IS_ERR(dev->dt_client)) { ret = PTR_ERR(dev->dt_client); - goto err_del_adapters; + goto err_kfree; } } return 0; - -err_del_adapters: - i2c_mux_del_adapters(dev->muxc); err_kfree: kfree(dev); err: diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c index 3071b61946c3..e9a4f8abd21c 100644 --- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c +++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c @@ -1412,6 +1412,7 @@ static int mtk_jpeg_remove(struct platform_device *pdev) { struct mtk_jpeg_dev *jpeg = platform_get_drvdata(pdev); + cancel_delayed_work_sync(&jpeg->job_timeout_work); pm_runtime_disable(&pdev->dev); video_unregister_device(jpeg->vdev); v4l2_m2m_release(jpeg->m2m_dev); diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c index 6d200e23754e..afbbfd5d02bc 100644 --- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c +++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c @@ -188,7 +188,6 @@ int mtk_jpeg_dec_fill_param(struct mtk_jpeg_dec_param *param) return 0; } -EXPORT_SYMBOL_GPL(mtk_jpeg_dec_fill_param); u32 mtk_jpeg_dec_get_int_status(void __iomem *base) { @@ -200,7 +199,6 @@ u32 mtk_jpeg_dec_get_int_status(void __iomem *base) return ret; } -EXPORT_SYMBOL_GPL(mtk_jpeg_dec_get_int_status); u32 mtk_jpeg_dec_enum_result(u32 irq_result) { @@ -217,13 +215,11 @@ u32 mtk_jpeg_dec_enum_result(u32 irq_result) return MTK_JPEG_DEC_RESULT_ERROR_UNKNOWN; } -EXPORT_SYMBOL_GPL(mtk_jpeg_dec_enum_result); void mtk_jpeg_dec_start(void __iomem *base) { writel(0, base + JPGDEC_REG_TRIG); } -EXPORT_SYMBOL_GPL(mtk_jpeg_dec_start); static void mtk_jpeg_dec_soft_reset(void __iomem *base) { @@ -243,7 +239,6 @@ void mtk_jpeg_dec_reset(void __iomem *base) mtk_jpeg_dec_soft_reset(base); mtk_jpeg_dec_hard_reset(base); } -EXPORT_SYMBOL_GPL(mtk_jpeg_dec_reset); static void mtk_jpeg_dec_set_brz_factor(void __iomem *base, u8 yscale_w, u8 yscale_h, u8 uvscale_w, u8 uvscale_h) @@ -412,4 +407,3 @@ void mtk_jpeg_dec_set_config(void __iomem *base, config->dma_last_mcu); mtk_jpeg_dec_set_pause_mcu_idx(base, config->total_mcu); } -EXPORT_SYMBOL_GPL(mtk_jpeg_dec_set_config); diff --git a/drivers/media/platform/nxp/imx-mipi-csis.c b/drivers/media/platform/nxp/imx-mipi-csis.c index 196f2bba419f..905072871ed2 100644 --- a/drivers/media/platform/nxp/imx-mipi-csis.c +++ b/drivers/media/platform/nxp/imx-mipi-csis.c @@ -1553,10 +1553,8 @@ static int mipi_csis_remove(struct platform_device *pdev) v4l2_async_nf_cleanup(&csis->notifier); v4l2_async_unregister_subdev(&csis->sd); - if (!pm_runtime_enabled(&pdev->dev)) - mipi_csis_runtime_suspend(&pdev->dev); - pm_runtime_disable(&pdev->dev); + mipi_csis_runtime_suspend(&pdev->dev); mipi_csis_clk_disable(csis); media_entity_cleanup(&csis->sd.entity); fwnode_handle_put(csis->sd.fwnode); diff --git a/drivers/media/platform/qcom/camss/camss-csid-gen2.c b/drivers/media/platform/qcom/camss/camss-csid-gen2.c index 0147cc062e1a..904208f6f954 100644 --- a/drivers/media/platform/qcom/camss/camss-csid-gen2.c +++ b/drivers/media/platform/qcom/camss/camss-csid-gen2.c @@ -334,14 +334,13 @@ static const struct csid_format csid_formats[] = { }, }; -static void __csid_configure_stream(struct csid_device *csid, u8 enable, u8 vc) +static void csid_configure_stream(struct csid_device *csid, u8 enable) { struct csid_testgen_config *tg = &csid->testgen; u32 val; u32 phy_sel = 0; u8 lane_cnt = csid->phy.lane_cnt; - /* Source pads matching RDI channels on hardware. Pad 1 -> RDI0, Pad 2 -> RDI1, etc. */ - struct v4l2_mbus_framefmt *input_format = &csid->fmt[MSM_CSID_PAD_FIRST_SRC + vc]; + struct v4l2_mbus_framefmt *input_format = &csid->fmt[MSM_CSID_PAD_SRC]; const struct csid_format *format = csid_get_fmt_entry(csid->formats, csid->nformats, input_format->code); @@ -352,19 +351,8 @@ static void __csid_configure_stream(struct csid_device *csid, u8 enable, u8 vc) phy_sel = csid->phy.csiphy_id; if (enable) { - /* - * DT_ID is a two bit bitfield that is concatenated with - * the four least significant bits of the five bit VC - * bitfield to generate an internal CID value. - * - * CSID_RDI_CFG0(vc) - * DT_ID : 28:27 - * VC : 26:22 - * DT : 21:16 - * - * CID : VC 3:0 << 2 | DT_ID 1:0 - */ - u8 dt_id = vc & 0x03; + u8 vc = 0; /* Virtual Channel 0 */ + u8 dt_id = vc * 4; if (tg->enabled) { /* configure one DT, infinite frames */ @@ -404,42 +392,42 @@ static void __csid_configure_stream(struct csid_device *csid, u8 enable, u8 vc) val |= format->data_type << RDI_CFG0_DATA_TYPE; val |= vc << RDI_CFG0_VIRTUAL_CHANNEL; val |= dt_id << RDI_CFG0_DT_ID; - writel_relaxed(val, csid->base + CSID_RDI_CFG0(vc)); + writel_relaxed(val, csid->base + CSID_RDI_CFG0(0)); /* CSID_TIMESTAMP_STB_POST_IRQ */ val = 2 << RDI_CFG1_TIMESTAMP_STB_SEL; - writel_relaxed(val, csid->base + CSID_RDI_CFG1(vc)); + writel_relaxed(val, csid->base + CSID_RDI_CFG1(0)); val = 1; - writel_relaxed(val, csid->base + CSID_RDI_FRM_DROP_PERIOD(vc)); + writel_relaxed(val, csid->base + CSID_RDI_FRM_DROP_PERIOD(0)); val = 0; - writel_relaxed(val, csid->base + CSID_RDI_FRM_DROP_PATTERN(vc)); + writel_relaxed(val, csid->base + CSID_RDI_FRM_DROP_PATTERN(0)); val = 1; - writel_relaxed(val, csid->base + CSID_RDI_IRQ_SUBSAMPLE_PERIOD(vc)); + writel_relaxed(val, csid->base + CSID_RDI_IRQ_SUBSAMPLE_PERIOD(0)); val = 0; - writel_relaxed(val, csid->base + CSID_RDI_IRQ_SUBSAMPLE_PATTERN(vc)); + writel_relaxed(val, csid->base + CSID_RDI_IRQ_SUBSAMPLE_PATTERN(0)); val = 1; - writel_relaxed(val, csid->base + CSID_RDI_RPP_PIX_DROP_PERIOD(vc)); + writel_relaxed(val, csid->base + CSID_RDI_RPP_PIX_DROP_PERIOD(0)); val = 0; - writel_relaxed(val, csid->base + CSID_RDI_RPP_PIX_DROP_PATTERN(vc)); + writel_relaxed(val, csid->base + CSID_RDI_RPP_PIX_DROP_PATTERN(0)); val = 1; - writel_relaxed(val, csid->base + CSID_RDI_RPP_LINE_DROP_PERIOD(vc)); + writel_relaxed(val, csid->base + CSID_RDI_RPP_LINE_DROP_PERIOD(0)); val = 0; - writel_relaxed(val, csid->base + CSID_RDI_RPP_LINE_DROP_PATTERN(vc)); + writel_relaxed(val, csid->base + CSID_RDI_RPP_LINE_DROP_PATTERN(0)); val = 0; - writel_relaxed(val, csid->base + CSID_RDI_CTRL(vc)); + writel_relaxed(val, csid->base + CSID_RDI_CTRL(0)); - val = readl_relaxed(csid->base + CSID_RDI_CFG0(vc)); + val = readl_relaxed(csid->base + CSID_RDI_CFG0(0)); val |= 1 << RDI_CFG0_ENABLE; - writel_relaxed(val, csid->base + CSID_RDI_CFG0(vc)); + writel_relaxed(val, csid->base + CSID_RDI_CFG0(0)); } if (tg->enabled) { @@ -458,8 +446,6 @@ static void __csid_configure_stream(struct csid_device *csid, u8 enable, u8 vc) writel_relaxed(val, csid->base + CSID_CSI2_RX_CFG0); val = 1 << CSI2_RX_CFG1_PACKET_ECC_CORRECTION_EN; - if (vc > 3) - val |= 1 << CSI2_RX_CFG1_VC_MODE; val |= 1 << CSI2_RX_CFG1_MISR_EN; writel_relaxed(val, csid->base + CSID_CSI2_RX_CFG1); @@ -467,16 +453,7 @@ static void __csid_configure_stream(struct csid_device *csid, u8 enable, u8 vc) val = HALT_CMD_RESUME_AT_FRAME_BOUNDARY << RDI_CTRL_HALT_CMD; else val = HALT_CMD_HALT_AT_FRAME_BOUNDARY << RDI_CTRL_HALT_CMD; - writel_relaxed(val, csid->base + CSID_RDI_CTRL(vc)); -} - -static void csid_configure_stream(struct csid_device *csid, u8 enable) -{ - u8 i; - /* Loop through all enabled VCs and configure stream for each */ - for (i = 0; i < MSM_CSID_MAX_SRC_STREAMS; i++) - if (csid->phy.en_vc & BIT(i)) - __csid_configure_stream(csid, enable, i); + writel_relaxed(val, csid->base + CSID_RDI_CTRL(0)); } static int csid_configure_testgen_pattern(struct csid_device *csid, s32 val) @@ -522,7 +499,6 @@ static irqreturn_t csid_isr(int irq, void *dev) struct csid_device *csid = dev; u32 val; u8 reset_done; - int i; val = readl_relaxed(csid->base + CSID_TOP_IRQ_STATUS); writel_relaxed(val, csid->base + CSID_TOP_IRQ_CLEAR); @@ -531,12 +507,8 @@ static irqreturn_t csid_isr(int irq, void *dev) val = readl_relaxed(csid->base + CSID_CSI2_RX_IRQ_STATUS); writel_relaxed(val, csid->base + CSID_CSI2_RX_IRQ_CLEAR); - /* Read and clear IRQ status for each enabled RDI channel */ - for (i = 0; i < MSM_CSID_MAX_SRC_STREAMS; i++) - if (csid->phy.en_vc & BIT(i)) { - val = readl_relaxed(csid->base + CSID_CSI2_RDIN_IRQ_STATUS(i)); - writel_relaxed(val, csid->base + CSID_CSI2_RDIN_IRQ_CLEAR(i)); - } + val = readl_relaxed(csid->base + CSID_CSI2_RDIN_IRQ_STATUS(0)); + writel_relaxed(val, csid->base + CSID_CSI2_RDIN_IRQ_CLEAR(0)); val = 1 << IRQ_CMD_CLEAR; writel_relaxed(val, csid->base + CSID_IRQ_CMD); diff --git a/drivers/media/platform/qcom/camss/camss-csid.c b/drivers/media/platform/qcom/camss/camss-csid.c index 6360314f04a6..88f188e0f750 100644 --- a/drivers/media/platform/qcom/camss/camss-csid.c +++ b/drivers/media/platform/qcom/camss/camss-csid.c @@ -196,8 +196,6 @@ static int csid_set_power(struct v4l2_subdev *sd, int on) return ret; } - csid->phy.need_vc_update = true; - enable_irq(csid->irq); ret = csid->ops->reset(csid); @@ -251,10 +249,7 @@ static int csid_set_stream(struct v4l2_subdev *sd, int enable) return -ENOLINK; } - if (csid->phy.need_vc_update) { - csid->ops->configure_stream(csid, enable); - csid->phy.need_vc_update = false; - } + csid->ops->configure_stream(csid, enable); return 0; } @@ -465,7 +460,6 @@ static int csid_set_format(struct v4l2_subdev *sd, { struct csid_device *csid = v4l2_get_subdevdata(sd); struct v4l2_mbus_framefmt *format; - int i; format = __csid_get_format(csid, sd_state, fmt->pad, fmt->which); if (format == NULL) @@ -474,14 +468,14 @@ static int csid_set_format(struct v4l2_subdev *sd, csid_try_format(csid, sd_state, fmt->pad, &fmt->format, fmt->which); *format = fmt->format; - /* Propagate the format from sink to source pads */ + /* Propagate the format from sink to source */ if (fmt->pad == MSM_CSID_PAD_SINK) { - for (i = MSM_CSID_PAD_FIRST_SRC; i < MSM_CSID_PADS_NUM; ++i) { - format = __csid_get_format(csid, sd_state, i, fmt->which); + format = __csid_get_format(csid, sd_state, MSM_CSID_PAD_SRC, + fmt->which); - *format = fmt->format; - csid_try_format(csid, sd_state, i, format, fmt->which); - } + *format = fmt->format; + csid_try_format(csid, sd_state, MSM_CSID_PAD_SRC, format, + fmt->which); } return 0; @@ -744,6 +738,7 @@ static int csid_link_setup(struct media_entity *entity, struct csid_device *csid; struct csiphy_device *csiphy; struct csiphy_lanes_cfg *lane_cfg; + struct v4l2_subdev_format format = { 0 }; sd = media_entity_to_v4l2_subdev(entity); csid = v4l2_get_subdevdata(sd); @@ -766,22 +761,11 @@ static int csid_link_setup(struct media_entity *entity, lane_cfg = &csiphy->cfg.csi2->lane_cfg; csid->phy.lane_cnt = lane_cfg->num_data; csid->phy.lane_assign = csid_get_lane_assign(lane_cfg); - } - /* Decide which virtual channels to enable based on which source pads are enabled */ - if (local->flags & MEDIA_PAD_FL_SOURCE) { - struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(entity); - struct csid_device *csid = v4l2_get_subdevdata(sd); - struct device *dev = csid->camss->dev; - if (flags & MEDIA_LNK_FL_ENABLED) - csid->phy.en_vc |= BIT(local->index - 1); - else - csid->phy.en_vc &= ~BIT(local->index - 1); - - csid->phy.need_vc_update = true; - - dev_dbg(dev, "%s: Enabled CSID virtual channels mask 0x%x\n", - __func__, csid->phy.en_vc); + /* Reset format on source pad to sink pad format */ + format.pad = MSM_CSID_PAD_SRC; + format.which = V4L2_SUBDEV_FORMAT_ACTIVE; + csid_set_format(&csid->subdev, NULL, &format); } return 0; @@ -832,7 +816,6 @@ int msm_csid_register_entity(struct csid_device *csid, struct v4l2_subdev *sd = &csid->subdev; struct media_pad *pads = csid->pads; struct device *dev = csid->camss->dev; - int i; int ret; v4l2_subdev_init(sd, &csid_v4l2_ops); @@ -869,8 +852,7 @@ int msm_csid_register_entity(struct csid_device *csid, } pads[MSM_CSID_PAD_SINK].flags = MEDIA_PAD_FL_SINK; - for (i = MSM_CSID_PAD_FIRST_SRC; i < MSM_CSID_PADS_NUM; ++i) - pads[i].flags = MEDIA_PAD_FL_SOURCE; + pads[MSM_CSID_PAD_SRC].flags = MEDIA_PAD_FL_SOURCE; sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER; sd->entity.ops = &csid_media_ops; diff --git a/drivers/media/platform/qcom/camss/camss-csid.h b/drivers/media/platform/qcom/camss/camss-csid.h index d4b48432a097..f06040e44c51 100644 --- a/drivers/media/platform/qcom/camss/camss-csid.h +++ b/drivers/media/platform/qcom/camss/camss-csid.h @@ -19,13 +19,8 @@ #include #define MSM_CSID_PAD_SINK 0 -#define MSM_CSID_PAD_FIRST_SRC 1 -#define MSM_CSID_PADS_NUM 5 - -#define MSM_CSID_PAD_SRC (MSM_CSID_PAD_FIRST_SRC) - -/* CSID hardware can demultiplex up to 4 outputs */ -#define MSM_CSID_MAX_SRC_STREAMS 4 +#define MSM_CSID_PAD_SRC 1 +#define MSM_CSID_PADS_NUM 2 #define DATA_TYPE_EMBEDDED_DATA_8BIT 0x12 #define DATA_TYPE_YUV420_8BIT 0x18 @@ -86,8 +81,6 @@ struct csid_phy_config { u8 csiphy_id; u8 lane_cnt; u32 lane_assign; - u32 en_vc; - u8 need_vc_update; }; struct csid_device; diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c index 2b76339f9381..f2475c6235ea 100644 --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c @@ -582,7 +582,7 @@ static int rkisp1_probe(struct platform_device *pdev) ret = v4l2_device_register(rkisp1->dev, &rkisp1->v4l2_dev); if (ret) - goto err_media_dev_cleanup; + goto err_pm_runtime_disable; ret = media_device_register(&rkisp1->media_dev); if (ret) { @@ -617,8 +617,6 @@ err_unreg_media_dev: media_device_unregister(&rkisp1->media_dev); err_unreg_v4l2_dev: v4l2_device_unregister(&rkisp1->v4l2_dev); -err_media_dev_cleanup: - media_device_cleanup(&rkisp1->media_dev); err_pm_runtime_disable: pm_runtime_disable(&pdev->dev); return ret; @@ -639,8 +637,6 @@ static int rkisp1_remove(struct platform_device *pdev) media_device_unregister(&rkisp1->media_dev); v4l2_device_unregister(&rkisp1->v4l2_dev); - media_device_cleanup(&rkisp1->media_dev); - pm_runtime_disable(&pdev->dev); return 0; diff --git a/drivers/media/platform/verisilicon/hantro_drv.c b/drivers/media/platform/verisilicon/hantro_drv.c index 69a2442f3122..08840ba313e7 100644 --- a/drivers/media/platform/verisilicon/hantro_drv.c +++ b/drivers/media/platform/verisilicon/hantro_drv.c @@ -813,8 +813,6 @@ static int hantro_add_func(struct hantro_dev *vpu, unsigned int funcid) if (funcid == MEDIA_ENT_F_PROC_VIDEO_ENCODER) { vpu->encoder = func; - v4l2_disable_ioctl(vfd, VIDIOC_TRY_DECODER_CMD); - v4l2_disable_ioctl(vfd, VIDIOC_DECODER_CMD); } else { vpu->decoder = func; v4l2_disable_ioctl(vfd, VIDIOC_TRY_ENCODER_CMD); diff --git a/drivers/media/platform/verisilicon/hantro_v4l2.c b/drivers/media/platform/verisilicon/hantro_v4l2.c index b2da48936e3f..30e650edaea8 100644 --- a/drivers/media/platform/verisilicon/hantro_v4l2.c +++ b/drivers/media/platform/verisilicon/hantro_v4l2.c @@ -759,9 +759,6 @@ const struct v4l2_ioctl_ops hantro_ioctl_ops = { .vidioc_g_selection = vidioc_g_selection, .vidioc_s_selection = vidioc_s_selection, - .vidioc_decoder_cmd = v4l2_m2m_ioctl_stateless_decoder_cmd, - .vidioc_try_decoder_cmd = v4l2_m2m_ioctl_stateless_try_decoder_cmd, - .vidioc_try_encoder_cmd = v4l2_m2m_ioctl_try_encoder_cmd, .vidioc_encoder_cmd = vidioc_encoder_cmd, }; diff --git a/drivers/media/usb/cx231xx/cx231xx-core.c b/drivers/media/usb/cx231xx/cx231xx-core.c index f1feccc28bf0..727e6268567f 100644 --- a/drivers/media/usb/cx231xx/cx231xx-core.c +++ b/drivers/media/usb/cx231xx/cx231xx-core.c @@ -1024,7 +1024,6 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets, if (!dev->video_mode.isoc_ctl.urb) { dev_err(dev->dev, "cannot alloc memory for usb buffers\n"); - kfree(dma_q->p_left_data); return -ENOMEM; } @@ -1034,7 +1033,6 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets, dev_err(dev->dev, "cannot allocate memory for usbtransfer\n"); kfree(dev->video_mode.isoc_ctl.urb); - kfree(dma_q->p_left_data); return -ENOMEM; } diff --git a/drivers/media/usb/pvrusb2/pvrusb2-context.c b/drivers/media/usb/pvrusb2/pvrusb2-context.c index 1764674de98b..14170a5d72b3 100644 --- a/drivers/media/usb/pvrusb2/pvrusb2-context.c +++ b/drivers/media/usb/pvrusb2/pvrusb2-context.c @@ -268,8 +268,7 @@ void pvr2_context_disconnect(struct pvr2_context *mp) { pvr2_hdw_disconnect(mp->hdw); mp->disconnect_flag = !0; - if (!pvr2_context_shutok()) - pvr2_context_notify(mp); + pvr2_context_notify(mp); } diff --git a/drivers/mfd/intel-lpss.c b/drivers/mfd/intel-lpss.c index c50387600b81..cfbee2cfba6b 100644 --- a/drivers/mfd/intel-lpss.c +++ b/drivers/mfd/intel-lpss.c @@ -301,8 +301,8 @@ static int intel_lpss_register_clock_divider(struct intel_lpss *lpss, snprintf(name, sizeof(name), "%s-div", devname); tmp = clk_register_fractional_divider(NULL, name, __clk_get_name(tmp), - 0, lpss->priv, 1, 15, 16, 15, CLK_FRAC_DIVIDER_POWER_OF_TWO_PS, + lpss->priv, 1, 15, 16, 15, 0, NULL); if (IS_ERR(tmp)) return PTR_ERR(tmp); diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c index e599ad55ba1e..0871c97ae51a 100644 --- a/drivers/mfd/syscon.c +++ b/drivers/mfd/syscon.c @@ -103,10 +103,6 @@ static struct syscon *of_syscon_register(struct device_node *np, bool check_clk) } syscon_config.name = kasprintf(GFP_KERNEL, "%pOFn@%pa", np, &res.start); - if (!syscon_config.name) { - ret = -ENOMEM; - goto err_regmap; - } syscon_config.reg_stride = reg_io_width; syscon_config.val_bits = reg_io_width * 8; syscon_config.max_register = resource_size(&res) - reg_io_width; diff --git a/drivers/misc/habanalabs/common/habanalabs_ioctl.c b/drivers/misc/habanalabs/common/habanalabs_ioctl.c index 1ea1ae34b7a7..43afe40966e5 100644 --- a/drivers/misc/habanalabs/common/habanalabs_ioctl.c +++ b/drivers/misc/habanalabs/common/habanalabs_ioctl.c @@ -677,7 +677,7 @@ static int sec_attest_info(struct hl_fpriv *hpriv, struct hl_info_args *args) if (!sec_attest_info) return -ENOMEM; - info = kzalloc(sizeof(*info), GFP_KERNEL); + info = kmalloc(sizeof(*info), GFP_KERNEL); if (!info) { rc = -ENOMEM; goto free_sec_attest_info; diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c index 317e20d72f77..4e88bd49ebb9 100644 --- a/drivers/mmc/core/block.c +++ b/drivers/mmc/core/block.c @@ -869,10 +869,9 @@ static const struct block_device_operations mmc_bdops = { static int mmc_blk_part_switch_pre(struct mmc_card *card, unsigned int part_type) { - const unsigned int mask = EXT_CSD_PART_CONFIG_ACC_RPMB; int ret = 0; - if ((part_type & mask) == mask) { + if (part_type == EXT_CSD_PART_CONFIG_ACC_RPMB) { if (card->ext_csd.cmdq_en) { ret = mmc_cmdq_disable(card); if (ret) @@ -887,10 +886,9 @@ static int mmc_blk_part_switch_pre(struct mmc_card *card, static int mmc_blk_part_switch_post(struct mmc_card *card, unsigned int part_type) { - const unsigned int mask = EXT_CSD_PART_CONFIG_ACC_RPMB; int ret = 0; - if ((part_type & mask) == mask) { + if (part_type == EXT_CSD_PART_CONFIG_ACC_RPMB) { mmc_retune_unpause(card->host); if (card->reenable_cmdq && !card->ext_csd.cmdq_en) ret = mmc_cmdq_enable(card); @@ -3185,3 +3183,4 @@ module_exit(mmc_blk_exit); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Multimedia Card (MMC) block device driver"); + diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index 2a47f08f41aa..095724aa0e6c 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c @@ -671,7 +671,6 @@ EXPORT_SYMBOL(mmc_remove_host); */ void mmc_free_host(struct mmc_host *host) { - cancel_delayed_work_sync(&host->detect); mmc_pwrseq_free(host); put_device(&host->class_dev); } diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig index d84bdb69f56b..9b5a2cb110b3 100644 --- a/drivers/mmc/host/Kconfig +++ b/drivers/mmc/host/Kconfig @@ -1061,15 +1061,14 @@ config MMC_SDHCI_XENON config MMC_SDHCI_OMAP tristate "TI SDHCI Controller Support" - depends on ARCH_OMAP2PLUS || ARCH_KEYSTONE || COMPILE_TEST depends on MMC_SDHCI_PLTFM && OF select THERMAL imply TI_SOC_THERMAL select MMC_SDHCI_EXTERNAL_DMA if DMA_ENGINE help This selects the Secure Digital Host Controller Interface (SDHCI) - support present in TI's Keystone/OMAP2+/DRA7 SOCs. The controller - supports SD/MMC/SDIO devices. + support present in TI's DRA7 SOCs. The controller supports + SD/MMC/SDIO devices. If you have a controller with this interface, say Y or M here. @@ -1077,15 +1076,14 @@ config MMC_SDHCI_OMAP config MMC_SDHCI_AM654 tristate "Support for the SDHCI Controller in TI's AM654 SOCs" - depends on ARCH_K3 || COMPILE_TEST depends on MMC_SDHCI_PLTFM && OF select MMC_SDHCI_IO_ACCESSORS select MMC_CQHCI select REGMAP_MMIO help This selects the Secure Digital Host Controller Interface (SDHCI) - support present in TI's AM65x/AM64x/AM62x/J721E SOCs. The controller - supports SD/MMC/SDIO devices. + support present in TI's AM654 SOCs. The controller supports + SD/MMC/SDIO devices. If you have a controller with this interface, say Y or M here. diff --git a/drivers/mmc/host/meson-mx-sdhc-mmc.c b/drivers/mmc/host/meson-mx-sdhc-mmc.c index c0e3b1634a88..da85c2f2acb8 100644 --- a/drivers/mmc/host/meson-mx-sdhc-mmc.c +++ b/drivers/mmc/host/meson-mx-sdhc-mmc.c @@ -269,7 +269,7 @@ static int meson_mx_sdhc_enable_clks(struct mmc_host *mmc) static int meson_mx_sdhc_set_clk(struct mmc_host *mmc, struct mmc_ios *ios) { struct meson_mx_sdhc_host *host = mmc_priv(mmc); - u32 val, rx_clk_phase; + u32 rx_clk_phase; int ret; meson_mx_sdhc_disable_clks(mmc); @@ -290,11 +290,27 @@ static int meson_mx_sdhc_set_clk(struct mmc_host *mmc, struct mmc_ios *ios) mmc->actual_clock = clk_get_rate(host->sd_clk); /* - * Phase 90 should work in most cases. For data transmission, - * meson_mx_sdhc_execute_tuning() will find a accurate value + * according to Amlogic the following latching points are + * selected with empirical values, there is no (known) formula + * to calculate these. */ - regmap_read(host->regmap, MESON_SDHC_CLKC, &val); - rx_clk_phase = FIELD_GET(MESON_SDHC_CLKC_CLK_DIV, val) / 4; + if (mmc->actual_clock > 100000000) { + rx_clk_phase = 1; + } else if (mmc->actual_clock > 45000000) { + if (ios->signal_voltage == MMC_SIGNAL_VOLTAGE_330) + rx_clk_phase = 15; + else + rx_clk_phase = 11; + } else if (mmc->actual_clock >= 25000000) { + rx_clk_phase = 15; + } else if (mmc->actual_clock > 5000000) { + rx_clk_phase = 23; + } else if (mmc->actual_clock > 1000000) { + rx_clk_phase = 55; + } else { + rx_clk_phase = 1061; + } + regmap_update_bits(host->regmap, MESON_SDHC_CLK2, MESON_SDHC_CLK2_RX_CLK_PHASE, FIELD_PREP(MESON_SDHC_CLK2_RX_CLK_PHASE, diff --git a/drivers/mmc/host/sdhci-sprd.c b/drivers/mmc/host/sdhci-sprd.c index d5e1d735beb2..525f979e2a97 100644 --- a/drivers/mmc/host/sdhci-sprd.c +++ b/drivers/mmc/host/sdhci-sprd.c @@ -228,19 +228,15 @@ static inline void _sdhci_sprd_set_clock(struct sdhci_host *host, div = ((div & 0x300) >> 2) | ((div & 0xFF) << 8); sdhci_enable_clk(host, div); - val = sdhci_readl(host, SDHCI_SPRD_REG_32_BUSY_POSI); - mask = SDHCI_SPRD_BIT_OUTR_CLK_AUTO_EN | SDHCI_SPRD_BIT_INNR_CLK_AUTO_EN; /* Enable CLK_AUTO when the clock is greater than 400K. */ if (clk > 400000) { + val = sdhci_readl(host, SDHCI_SPRD_REG_32_BUSY_POSI); + mask = SDHCI_SPRD_BIT_OUTR_CLK_AUTO_EN | + SDHCI_SPRD_BIT_INNR_CLK_AUTO_EN; if (mask != (val & mask)) { val |= mask; sdhci_writel(host, val, SDHCI_SPRD_REG_32_BUSY_POSI); } - } else { - if (val & mask) { - val &= ~mask; - sdhci_writel(host, val, SDHCI_SPRD_REG_32_BUSY_POSI); - } } } diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c index 8ee60605a6dc..60b222799871 100644 --- a/drivers/mtd/mtd_blkdevs.c +++ b/drivers/mtd/mtd_blkdevs.c @@ -463,7 +463,7 @@ static void blktrans_notify_add(struct mtd_info *mtd) { struct mtd_blktrans_ops *tr; - if (mtd->type == MTD_ABSENT || mtd->type == MTD_UBIVOLUME) + if (mtd->type == MTD_ABSENT) return; list_for_each_entry(tr, &blktrans_majors, list) @@ -503,7 +503,7 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr) mutex_lock(&mtd_table_mutex); list_add(&tr->list, &blktrans_majors); mtd_for_each_device(mtd) - if (mtd->type != MTD_ABSENT && mtd->type != MTD_UBIVOLUME) + if (mtd->type != MTD_ABSENT) tr->add_mtd(tr, mtd); mutex_unlock(&mtd_table_mutex); return 0; diff --git a/drivers/mtd/nand/raw/fsl_ifc_nand.c b/drivers/mtd/nand/raw/fsl_ifc_nand.c index bea1a7d3edd7..02d500176838 100644 --- a/drivers/mtd/nand/raw/fsl_ifc_nand.c +++ b/drivers/mtd/nand/raw/fsl_ifc_nand.c @@ -20,7 +20,7 @@ #define ERR_BYTE 0xFF /* Value returned for read bytes when read failed */ -#define IFC_TIMEOUT_MSECS 1000 /* Maximum timeout to wait +#define IFC_TIMEOUT_MSECS 500 /* Maximum number of mSecs to wait for IFC NAND Machine */ struct fsl_ifc_ctrl; diff --git a/drivers/net/amt.c b/drivers/net/amt.c index ddd087c2c3ed..2d20be6ffb7e 100644 --- a/drivers/net/amt.c +++ b/drivers/net/amt.c @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include #include @@ -80,11 +80,11 @@ static struct mld2_grec mldv2_zero_grec; static struct amt_skb_cb *amt_skb_cb(struct sk_buff *skb) { - BUILD_BUG_ON(sizeof(struct amt_skb_cb) + sizeof(struct tc_skb_cb) > + BUILD_BUG_ON(sizeof(struct amt_skb_cb) + sizeof(struct qdisc_skb_cb) > sizeof_field(struct sk_buff, cb)); return (struct amt_skb_cb *)((void *)skb->cb + - sizeof(struct tc_skb_cb)); + sizeof(struct qdisc_skb_cb)); } static void __amt_source_gc_work(void) diff --git a/drivers/net/dsa/vitesse-vsc73xx-core.c b/drivers/net/dsa/vitesse-vsc73xx-core.c index 3efd55669056..ef1a4a7c47b2 100644 --- a/drivers/net/dsa/vitesse-vsc73xx-core.c +++ b/drivers/net/dsa/vitesse-vsc73xx-core.c @@ -1119,8 +1119,6 @@ static int vsc73xx_gpio_probe(struct vsc73xx *vsc) vsc->gc.label = devm_kasprintf(vsc->dev, GFP_KERNEL, "VSC%04x", vsc->chipid); - if (!vsc->gc.label) - return -ENOMEM; vsc->gc.ngpio = 4; vsc->gc.owner = THIS_MODULE; vsc->gc.parent = vsc->dev; diff --git a/drivers/net/ethernet/amazon/ena/ena_eth_com.c b/drivers/net/ethernet/amazon/ena/ena_eth_com.c index f9f886289b97..3d6f0a466a9e 100644 --- a/drivers/net/ethernet/amazon/ena/ena_eth_com.c +++ b/drivers/net/ethernet/amazon/ena/ena_eth_com.c @@ -328,6 +328,9 @@ static int ena_com_create_and_store_tx_meta_desc(struct ena_com_io_sq *io_sq, * compare it to the stored version, just create the meta */ if (io_sq->disable_meta_caching) { + if (unlikely(!ena_tx_ctx->meta_valid)) + return -EINVAL; + *have_meta = true; return ena_com_create_meta(io_sq, ena_meta); } diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c index 044b8afde69a..42a66b74c1e5 100644 --- a/drivers/net/ethernet/amazon/ena/ena_netdev.c +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c @@ -74,8 +74,6 @@ static void ena_unmap_tx_buff(struct ena_ring *tx_ring, struct ena_tx_buffer *tx_info); static int ena_create_io_tx_queues_in_range(struct ena_adapter *adapter, int first_index, int count); -static void ena_free_all_io_tx_resources_in_range(struct ena_adapter *adapter, - int first_index, int count); /* Increase a stat by cnt while holding syncp seqlock on 32bit machines */ static void ena_increase_stat(u64 *statp, u64 cnt, @@ -459,22 +457,23 @@ static void ena_init_all_xdp_queues(struct ena_adapter *adapter) static int ena_setup_and_create_all_xdp_queues(struct ena_adapter *adapter) { - u32 xdp_first_ring = adapter->xdp_first_ring; - u32 xdp_num_queues = adapter->xdp_num_queues; int rc = 0; - rc = ena_setup_tx_resources_in_range(adapter, xdp_first_ring, xdp_num_queues); + rc = ena_setup_tx_resources_in_range(adapter, adapter->xdp_first_ring, + adapter->xdp_num_queues); if (rc) goto setup_err; - rc = ena_create_io_tx_queues_in_range(adapter, xdp_first_ring, xdp_num_queues); + rc = ena_create_io_tx_queues_in_range(adapter, + adapter->xdp_first_ring, + adapter->xdp_num_queues); if (rc) goto create_err; return 0; create_err: - ena_free_all_io_tx_resources_in_range(adapter, xdp_first_ring, xdp_num_queues); + ena_free_all_io_tx_resources(adapter); setup_err: return rc; } @@ -1618,23 +1617,20 @@ static void ena_set_rx_hash(struct ena_ring *rx_ring, } } -static int ena_xdp_handle_buff(struct ena_ring *rx_ring, struct xdp_buff *xdp, u16 num_descs) +static int ena_xdp_handle_buff(struct ena_ring *rx_ring, struct xdp_buff *xdp) { struct ena_rx_buffer *rx_info; int ret; - /* XDP multi-buffer packets not supported */ - if (unlikely(num_descs > 1)) { - netdev_err_once(rx_ring->adapter->netdev, - "xdp: dropped unsupported multi-buffer packets\n"); - ena_increase_stat(&rx_ring->rx_stats.xdp_drop, 1, &rx_ring->syncp); - return ENA_XDP_DROP; - } - rx_info = &rx_ring->rx_buffer_info[rx_ring->ena_bufs[0].req_id]; xdp_prepare_buff(xdp, page_address(rx_info->page), rx_info->page_offset, rx_ring->ena_bufs[0].len, false); + /* If for some reason we received a bigger packet than + * we expect, then we simply drop it + */ + if (unlikely(rx_ring->ena_bufs[0].len > ENA_XDP_MAX_MTU)) + return ENA_XDP_DROP; ret = ena_xdp_execute(rx_ring, xdp); @@ -1703,7 +1699,7 @@ static int ena_clean_rx_irq(struct ena_ring *rx_ring, struct napi_struct *napi, ena_rx_ctx.l4_proto, ena_rx_ctx.hash); if (ena_xdp_present_ring(rx_ring)) - xdp_verdict = ena_xdp_handle_buff(rx_ring, &xdp, ena_rx_ctx.descs); + xdp_verdict = ena_xdp_handle_buff(rx_ring, &xdp); /* allocate skb and fill it */ if (xdp_verdict == ENA_XDP_PASS) diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c index 4d9d7d1edb9b..b5a49166fa97 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c @@ -938,14 +938,11 @@ void aq_ring_free(struct aq_ring_s *self) return; kfree(self->buff_ring); - self->buff_ring = NULL; - if (self->dx_ring) { + if (self->dx_ring) dma_free_coherent(aq_nic_get_dev(self->aq_nic), self->size * self->dx_size, self->dx_ring, self->dx_ring_pa); - self->dx_ring = NULL; - } } unsigned int aq_ring_fill_stats_data(struct aq_ring_s *self, u64 *data) diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c index 5f2a6fcba967..5935be190b9e 100644 --- a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c +++ b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c @@ -866,13 +866,10 @@ static int atl1e_setup_ring_resources(struct atl1e_adapter *adapter) netdev_err(adapter->netdev, "offset(%d) > ring size(%d) !!\n", offset, adapter->ring_size); err = -1; - goto free_buffer; + goto failed; } return 0; -free_buffer: - kfree(tx_ring->tx_buffer); - tx_ring->tx_buffer = NULL; failed: if (adapter->ring_vir_addr != NULL) { dma_free_coherent(&pdev->dev, adapter->ring_size, diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 4950fde82d17..16c490692f42 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c @@ -1923,7 +1923,8 @@ u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb, /* Skip VLAN tag if present */ if (ether_type == ETH_P_8021Q) { - struct vlan_ethhdr *vhdr = skb_vlan_eth_hdr(skb); + struct vlan_ethhdr *vhdr = + (struct vlan_ethhdr *)skb->data; ether_type = ntohs(vhdr->h_vlan_encapsulated_proto); } diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index df4d88d35701..e81cb825dff4 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -1796,21 +1796,6 @@ static void bnxt_deliver_skb(struct bnxt *bp, struct bnxt_napi *bnapi, napi_gro_receive(&bnapi->napi, skb); } -static bool bnxt_rx_ts_valid(struct bnxt *bp, u32 flags, - struct rx_cmp_ext *rxcmp1, u32 *cmpl_ts) -{ - u32 ts = le32_to_cpu(rxcmp1->rx_cmp_timestamp); - - if (BNXT_PTP_RX_TS_VALID(flags)) - goto ts_valid; - if (!bp->ptp_all_rx_tstamp || !ts || !BNXT_ALL_RX_TS_VALID(flags)) - return false; - -ts_valid: - *cmpl_ts = ts; - return true; -} - /* returns the following: * 1 - 1 packet successfully received * 0 - successful TPA_START, packet not completed yet @@ -1836,7 +1821,6 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, struct sk_buff *skb; struct xdp_buff xdp; u32 flags, misc; - u32 cmpl_ts; void *data; int rc = 0; @@ -2059,8 +2043,10 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, } } - if (bnxt_rx_ts_valid(bp, flags, rxcmp1, &cmpl_ts)) { + if (unlikely((flags & RX_CMP_FLAGS_ITYPES_MASK) == + RX_CMP_FLAGS_ITYPE_PTP_W_TS) || bp->ptp_all_rx_tstamp) { if (bp->flags & BNXT_FLAG_CHIP_P5) { + u32 cmpl_ts = le32_to_cpu(rxcmp1->rx_cmp_timestamp); u64 ns, ts; if (!bnxt_get_rx_ts_p5(bp, &ts, cmpl_ts)) { @@ -10722,10 +10708,8 @@ static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init, bnxt_free_skbs(bp); /* Save ring stats before shutdown */ - if (bp->bnapi && irq_re_init) { + if (bp->bnapi && irq_re_init) bnxt_get_ring_stats(bp, &bp->net_stats_prev); - bnxt_get_ring_err_stats(bp, &bp->ring_err_stats_prev); - } if (irq_re_init) { bnxt_free_irq(bp); bnxt_del_napi(bp); @@ -10733,8 +10717,10 @@ static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init, bnxt_free_mem(bp, irq_re_init); } -void bnxt_close_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init) +int bnxt_close_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init) { + int rc = 0; + if (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) { /* If we get here, it means firmware reset is in progress * while we are trying to close. We can safely proceed with @@ -10749,18 +10735,15 @@ void bnxt_close_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init) #ifdef CONFIG_BNXT_SRIOV if (bp->sriov_cfg) { - int rc; - rc = wait_event_interruptible_timeout(bp->sriov_cfg_wait, !bp->sriov_cfg, BNXT_SRIOV_CFG_WAIT_TMO); - if (!rc) - netdev_warn(bp->dev, "timeout waiting for SRIOV config operation to complete, proceeding to close!\n"); - else if (rc < 0) - netdev_warn(bp->dev, "SRIOV config operation interrupted, proceeding to close!\n"); + if (rc) + netdev_warn(bp->dev, "timeout waiting for SRIOV config operation to complete!\n"); } #endif __bnxt_close_nic(bp, irq_re_init, link_re_init); + return rc; } static int bnxt_close(struct net_device *dev) @@ -10975,34 +10958,6 @@ bnxt_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) clear_bit(BNXT_STATE_READ_STATS, &bp->state); } -static void bnxt_get_one_ring_err_stats(struct bnxt *bp, - struct bnxt_total_ring_err_stats *stats, - struct bnxt_cp_ring_info *cpr) -{ - struct bnxt_sw_stats *sw_stats = &cpr->sw_stats; - u64 *hw_stats = cpr->stats.sw_stats; - - stats->rx_total_l4_csum_errors += sw_stats->rx.rx_l4_csum_errors; - stats->rx_total_resets += sw_stats->rx.rx_resets; - stats->rx_total_buf_errors += sw_stats->rx.rx_buf_errors; - stats->rx_total_oom_discards += sw_stats->rx.rx_oom_discards; - stats->rx_total_netpoll_discards += sw_stats->rx.rx_netpoll_discards; - stats->rx_total_ring_discards += - BNXT_GET_RING_STATS64(hw_stats, rx_discard_pkts); - stats->tx_total_ring_discards += - BNXT_GET_RING_STATS64(hw_stats, tx_discard_pkts); - stats->total_missed_irqs += sw_stats->cmn.missed_irqs; -} - -void bnxt_get_ring_err_stats(struct bnxt *bp, - struct bnxt_total_ring_err_stats *stats) -{ - int i; - - for (i = 0; i < bp->cp_nr_rings; i++) - bnxt_get_one_ring_err_stats(bp, stats, &bp->bnapi[i]->cp_ring); -} - static bool bnxt_mc_list_updated(struct bnxt *bp, u32 *rx_mask) { struct net_device *dev = bp->dev; @@ -12081,8 +12036,6 @@ static void bnxt_sp_task(struct work_struct *work) bnxt_cfg_ntp_filters(bp); if (test_and_clear_bit(BNXT_HWRM_EXEC_FWD_REQ_SP_EVENT, &bp->sp_event)) bnxt_hwrm_exec_fwd_req(bp); - if (test_and_clear_bit(BNXT_HWRM_PF_UNLOAD_SP_EVENT, &bp->sp_event)) - netdev_info(bp->dev, "Receive PF driver unload event!\n"); if (test_and_clear_bit(BNXT_PERIODIC_STATS_SP_EVENT, &bp->sp_event)) { bnxt_hwrm_port_qstats(bp, 0); bnxt_hwrm_port_qstats_ext(bp, 0); @@ -13061,6 +13014,8 @@ static void bnxt_cfg_ntp_filters(struct bnxt *bp) } } } + if (test_and_clear_bit(BNXT_HWRM_PF_UNLOAD_SP_EVENT, &bp->sp_event)) + netdev_info(bp->dev, "Receive PF driver unload event!\n"); } #else @@ -13927,8 +13882,6 @@ static int bnxt_resume(struct device *device) if (rc) goto resume_exit; - bnxt_clear_reservations(bp, true); - if (bnxt_hwrm_func_drv_rgtr(bp, NULL, 0, false)) { rc = -ENODEV; goto resume_exit; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index 111098b4b606..1d2588c92977 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -160,7 +160,7 @@ struct rx_cmp { #define RX_CMP_FLAGS_ERROR (1 << 6) #define RX_CMP_FLAGS_PLACEMENT (7 << 7) #define RX_CMP_FLAGS_RSS_VALID (1 << 10) - #define RX_CMP_FLAGS_PKT_METADATA_PRESENT (1 << 11) + #define RX_CMP_FLAGS_UNUSED (1 << 11) #define RX_CMP_FLAGS_ITYPES_SHIFT 12 #define RX_CMP_FLAGS_ITYPES_MASK 0xf000 #define RX_CMP_FLAGS_ITYPE_UNKNOWN (0 << 12) @@ -187,12 +187,6 @@ struct rx_cmp { __le32 rx_cmp_rss_hash; }; -#define BNXT_PTP_RX_TS_VALID(flags) \ - (((flags) & RX_CMP_FLAGS_ITYPES_MASK) == RX_CMP_FLAGS_ITYPE_PTP_W_TS) - -#define BNXT_ALL_RX_TS_VALID(flags) \ - !((flags) & RX_CMP_FLAGS_PKT_METADATA_PRESENT) - #define RX_CMP_HASH_VALID(rxcmp) \ ((rxcmp)->rx_cmp_len_flags_type & cpu_to_le32(RX_CMP_FLAGS_RSS_VALID)) @@ -956,17 +950,6 @@ struct bnxt_sw_stats { struct bnxt_cmn_sw_stats cmn; }; -struct bnxt_total_ring_err_stats { - u64 rx_total_l4_csum_errors; - u64 rx_total_resets; - u64 rx_total_buf_errors; - u64 rx_total_oom_discards; - u64 rx_total_netpoll_discards; - u64 rx_total_ring_discards; - u64 tx_total_ring_discards; - u64 total_missed_irqs; -}; - struct bnxt_stats_mem { u64 *sw_stats; u64 *hw_masks; @@ -2024,8 +2007,6 @@ struct bnxt { u8 pri2cos_idx[8]; u8 pri2cos_valid; - struct bnxt_total_ring_err_stats ring_err_stats_prev; - u16 hwrm_max_req_len; u16 hwrm_max_ext_req_len; unsigned int hwrm_cmd_timeout; @@ -2349,9 +2330,7 @@ int bnxt_open_nic(struct bnxt *, bool, bool); int bnxt_half_open_nic(struct bnxt *bp); void bnxt_half_close_nic(struct bnxt *bp); void bnxt_reenable_sriov(struct bnxt *bp); -void bnxt_close_nic(struct bnxt *, bool, bool); -void bnxt_get_ring_err_stats(struct bnxt *bp, - struct bnxt_total_ring_err_stats *stats); +int bnxt_close_nic(struct bnxt *, bool, bool); int bnxt_dbg_hwrm_rd_reg(struct bnxt *bp, u32 reg_off, u16 num_words, u32 *reg_buf); void bnxt_fw_exception(struct bnxt *bp); diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c index 2bdebd9c069d..8a6f788f6294 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c @@ -478,8 +478,15 @@ static int bnxt_dl_reload_down(struct devlink *dl, bool netns_change, return -ENODEV; } bnxt_ulp_stop(bp); - if (netif_running(bp->dev)) - bnxt_close_nic(bp, true, true); + if (netif_running(bp->dev)) { + rc = bnxt_close_nic(bp, true, true); + if (rc) { + NL_SET_ERR_MSG_MOD(extack, "Failed to close"); + dev_close(bp->dev); + rtnl_unlock(); + break; + } + } bnxt_vf_reps_free(bp); rc = bnxt_hwrm_func_drv_unrgtr(bp); if (rc) { diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c index 7260b4671ecc..89f046ce1373 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c @@ -164,8 +164,9 @@ static int bnxt_set_coalesce(struct net_device *dev, reset_coalesce: if (test_bit(BNXT_STATE_OPEN, &bp->state)) { if (update_stats) { - bnxt_close_nic(bp, true, false); - rc = bnxt_open_nic(bp, true, false); + rc = bnxt_close_nic(bp, true, false); + if (!rc) + rc = bnxt_open_nic(bp, true, false); } else { rc = bnxt_hwrm_set_coal(bp); } @@ -955,7 +956,12 @@ static int bnxt_set_channels(struct net_device *dev, * before PF unload */ } - bnxt_close_nic(bp, true, false); + rc = bnxt_close_nic(bp, true, false); + if (rc) { + netdev_err(bp->dev, "Set channel failure rc :%x\n", + rc); + return rc; + } } if (sh) { @@ -3628,7 +3634,12 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest, bnxt_run_fw_tests(bp, test_mask, &test_results); } else { bnxt_ulp_stop(bp); - bnxt_close_nic(bp, true, false); + rc = bnxt_close_nic(bp, true, false); + if (rc) { + etest->flags |= ETH_TEST_FL_FAILED; + bnxt_ulp_start(bp, rc); + return; + } bnxt_run_fw_tests(bp, test_mask, &test_results); buf[BNXT_MACLPBK_TEST_IDX] = 1; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c index ae734314f8de..4faaa9a50f4b 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c @@ -506,8 +506,9 @@ static int bnxt_hwrm_ptp_cfg(struct bnxt *bp) if (netif_running(bp->dev)) { if (ptp->rx_filter == HWTSTAMP_FILTER_ALL) { - bnxt_close_nic(bp, false, false); - rc = bnxt_open_nic(bp, false, false); + rc = bnxt_close_nic(bp, false, false); + if (!rc) + rc = bnxt_open_nic(bp, false, false); } else { bnxt_ptp_cfg_tstamp_filters(bp); } diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index c2a991308215..1ae082eb9e90 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -2131,10 +2131,8 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev) /* Note: if we ever change from DMA_TX_APPEND_CRC below we * will need to restore software padding of "runt" packets */ - len_stat |= DMA_TX_APPEND_CRC; - if (!i) { - len_stat |= DMA_SOP; + len_stat |= DMA_TX_APPEND_CRC | DMA_SOP; if (skb->ip_summed == CHECKSUM_PARTIAL) len_stat |= DMA_TX_DO_CSUM; } diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index 0c694ab3c110..f60a16de565e 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c @@ -6447,14 +6447,6 @@ static void tg3_dump_state(struct tg3 *tp) int i; u32 *regs; - /* If it is a PCI error, all registers will be 0xffff, - * we don't dump them out, just report the error and return - */ - if (tp->pdev->error_state != pci_channel_io_normal) { - netdev_err(tp->dev, "PCI channel ERROR!\n"); - return; - } - regs = kzalloc(TG3_REG_BLK_SIZE, GFP_ATOMIC); if (!regs) return; @@ -11192,8 +11184,7 @@ static void tg3_reset_task(struct work_struct *work) rtnl_lock(); tg3_full_lock(tp, 0); - if (tp->pcierr_recovery || !netif_running(tp->dev) || - tp->pdev->error_state != pci_channel_io_normal) { + if (tp->pcierr_recovery || !netif_running(tp->dev)) { tg3_flag_clear(tp, RESET_TASK_PENDING); tg3_full_unlock(tp); rtnl_unlock(); diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index a9e4e6464a04..b12152e2fca0 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c @@ -1125,7 +1125,7 @@ static struct sk_buff *be_lancer_xmit_workarounds(struct be_adapter *adapter, struct be_wrb_params *wrb_params) { - struct vlan_ethhdr *veh = skb_vlan_eth_hdr(skb); + struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; unsigned int eth_hdr_len; struct iphdr *ip; diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c index de62eee58a00..b58162ce81d8 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c @@ -509,6 +509,8 @@ static struct sk_buff *dpaa2_eth_copybreak(struct dpaa2_eth_channel *ch, memcpy(skb->data, fd_vaddr + fd_offset, fd_length); + dpaa2_eth_recycle_buf(priv, ch, dpaa2_fd_get_addr(fd)); + return skb; } @@ -526,7 +528,6 @@ static void dpaa2_eth_rx(struct dpaa2_eth_priv *priv, struct dpaa2_eth_drv_stats *percpu_extras; struct device *dev = priv->net_dev->dev.parent; struct dpaa2_fas *fas; - bool recycle_rx_buf = false; void *buf_data; u32 status = 0; u32 xdp_act; @@ -559,8 +560,6 @@ static void dpaa2_eth_rx(struct dpaa2_eth_priv *priv, dma_unmap_page(dev, addr, priv->rx_buf_size, DMA_BIDIRECTIONAL); skb = dpaa2_eth_build_linear_skb(ch, fd, vaddr); - } else { - recycle_rx_buf = true; } } else if (fd_format == dpaa2_fd_sg) { WARN_ON(priv->xdp_prog); @@ -608,8 +607,6 @@ static void dpaa2_eth_rx(struct dpaa2_eth_priv *priv, list_add_tail(&skb->list, ch->rx_list); - if (recycle_rx_buf) - dpaa2_eth_recycle_buf(priv, ch, dpaa2_fd_get_addr(fd)); return; err_build_skb: diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c index 59888826469b..eea7d7a07c00 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c @@ -227,8 +227,17 @@ static void dpaa2_eth_get_ethtool_stats(struct net_device *net_dev, struct ethtool_stats *stats, u64 *data) { - struct dpaa2_eth_priv *priv = netdev_priv(net_dev); + int i = 0; + int j, k, err; + int num_cnt; union dpni_statistics dpni_stats; + u32 fcnt, bcnt; + u32 fcnt_rx_total = 0, fcnt_tx_total = 0; + u32 bcnt_rx_total = 0, bcnt_tx_total = 0; + u32 buf_cnt; + struct dpaa2_eth_priv *priv = netdev_priv(net_dev); + struct dpaa2_eth_drv_stats *extras; + struct dpaa2_eth_ch_stats *ch_stats; int dpni_stats_page_size[DPNI_STATISTICS_CNT] = { sizeof(dpni_stats.page_0), sizeof(dpni_stats.page_1), @@ -238,13 +247,6 @@ static void dpaa2_eth_get_ethtool_stats(struct net_device *net_dev, sizeof(dpni_stats.page_5), sizeof(dpni_stats.page_6), }; - u32 fcnt_rx_total = 0, fcnt_tx_total = 0; - u32 bcnt_rx_total = 0, bcnt_tx_total = 0; - struct dpaa2_eth_ch_stats *ch_stats; - struct dpaa2_eth_drv_stats *extras; - int j, k, err, num_cnt, i = 0; - u32 fcnt, bcnt; - u32 buf_cnt; memset(data, 0, sizeof(u64) * (DPAA2_ETH_NUM_STATS + DPAA2_ETH_NUM_EXTRA_STATS)); diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c index 16d3c3610720..c39b866e2582 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c @@ -139,8 +139,7 @@ int dpaa2_switch_acl_entry_add(struct dpaa2_switch_filter_block *filter_block, err = dpsw_acl_add_entry(ethsw->mc_io, 0, ethsw->dpsw_handle, filter_block->acl_id, acl_entry_cfg); - dma_unmap_single(dev, acl_entry_cfg->key_iova, - DPAA2_ETHSW_PORT_ACL_CMD_BUF_SIZE, + dma_unmap_single(dev, acl_entry_cfg->key_iova, sizeof(cmd_buff), DMA_TO_DEVICE); if (err) { dev_err(dev, "dpsw_acl_add_entry() failed %d\n", err); @@ -182,8 +181,8 @@ dpaa2_switch_acl_entry_remove(struct dpaa2_switch_filter_block *block, err = dpsw_acl_remove_entry(ethsw->mc_io, 0, ethsw->dpsw_handle, block->acl_id, acl_entry_cfg); - dma_unmap_single(dev, acl_entry_cfg->key_iova, - DPAA2_ETHSW_PORT_ACL_CMD_BUF_SIZE, DMA_TO_DEVICE); + dma_unmap_single(dev, acl_entry_cfg->key_iova, sizeof(cmd_buff), + DMA_TO_DEVICE); if (err) { dev_err(dev, "dpsw_acl_remove_entry() failed %d\n", err); kfree(cmd_buff); diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c index b98ef4ba172f..2b5909fa93cf 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c @@ -1978,6 +1978,9 @@ static int dpaa2_switch_port_attr_set_event(struct net_device *netdev, return notifier_from_errno(err); } +static struct notifier_block dpaa2_switch_port_switchdev_nb; +static struct notifier_block dpaa2_switch_port_switchdev_blocking_nb; + static int dpaa2_switch_port_bridge_join(struct net_device *netdev, struct net_device *upper_dev, struct netlink_ext_ack *extack) @@ -2020,7 +2023,9 @@ static int dpaa2_switch_port_bridge_join(struct net_device *netdev, goto err_egress_flood; err = switchdev_bridge_port_offload(netdev, netdev, NULL, - NULL, NULL, false, extack); + &dpaa2_switch_port_switchdev_nb, + &dpaa2_switch_port_switchdev_blocking_nb, + false, extack); if (err) goto err_switchdev_offload; @@ -2054,7 +2059,9 @@ static int dpaa2_switch_port_restore_rxvlan(struct net_device *vdev, int vid, vo static void dpaa2_switch_port_pre_bridge_leave(struct net_device *netdev) { - switchdev_bridge_port_unoffload(netdev, NULL, NULL, NULL); + switchdev_bridge_port_unoffload(netdev, NULL, + &dpaa2_switch_port_switchdev_nb, + &dpaa2_switch_port_switchdev_blocking_nb); } static int dpaa2_switch_port_bridge_leave(struct net_device *netdev) diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 6d1b76002282..33226a22d8a4 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -3541,26 +3541,31 @@ static int fec_set_features(struct net_device *netdev, return 0; } +static u16 fec_enet_get_raw_vlan_tci(struct sk_buff *skb) +{ + struct vlan_ethhdr *vhdr; + unsigned short vlan_TCI = 0; + + if (skb->protocol == htons(ETH_P_ALL)) { + vhdr = (struct vlan_ethhdr *)(skb->data); + vlan_TCI = ntohs(vhdr->h_vlan_TCI); + } + + return vlan_TCI; +} + static u16 fec_enet_select_queue(struct net_device *ndev, struct sk_buff *skb, struct net_device *sb_dev) { struct fec_enet_private *fep = netdev_priv(ndev); - u16 vlan_tag = 0; + u16 vlan_tag; if (!(fep->quirks & FEC_QUIRK_HAS_AVB)) return netdev_pick_tx(ndev, skb, NULL); - /* VLAN is present in the payload.*/ - if (eth_type_vlan(skb->protocol)) { - struct vlan_ethhdr *vhdr = skb_vlan_eth_hdr(skb); - - vlan_tag = ntohs(vhdr->h_vlan_TCI); - /* VLAN is present in the skb but not yet pushed in the payload.*/ - } else if (skb_vlan_tag_present(skb)) { - vlan_tag = skb->vlan_tci; - } else { + vlan_tag = fec_enet_get_raw_vlan_tci(skb); + if (!vlan_tag) return vlan_tag; - } return fec_enet_vlan_pri_to_queue[vlan_tag >> 13]; } diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c index 78d6752fe051..5ad22b815b2f 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c @@ -1532,7 +1532,7 @@ static int hns3_handle_vtags(struct hns3_enet_ring *tx_ring, if (unlikely(rc < 0)) return rc; - vhdr = skb_vlan_eth_hdr(skb); + vhdr = (struct vlan_ethhdr *)skb->data; vhdr->h_vlan_TCI |= cpu_to_be16((skb->priority << VLAN_PRIO_SHIFT) & VLAN_PRIO_MASK); diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 63d43ef86f9b..b4157ff370a3 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -104,18 +104,12 @@ static struct workqueue_struct *i40e_wq; static void netdev_hw_addr_refcnt(struct i40e_mac_filter *f, struct net_device *netdev, int delta) { - struct netdev_hw_addr_list *ha_list; struct netdev_hw_addr *ha; if (!f || !netdev) return; - if (is_unicast_ether_addr(f->macaddr) || is_link_local_ether_addr(f->macaddr)) - ha_list = &netdev->uc; - else - ha_list = &netdev->mc; - - netdev_hw_addr_list_for_each(ha, ha_list) { + netdev_for_each_mc_addr(ha, netdev) { if (ether_addr_equal(ha->addr, f->macaddr)) { ha->refcount += delta; if (ha->refcount <= 0) @@ -16450,9 +16444,6 @@ static void i40e_pci_error_reset_done(struct pci_dev *pdev) return; i40e_reset_and_rebuild(pf, false, false); -#ifdef CONFIG_PCI_IOV - i40e_restore_all_vfs_msi_state(pdev); -#endif /* CONFIG_PCI_IOV */ } /** diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c index 94cf82668efa..6d26ee8eefae 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c @@ -2986,7 +2986,7 @@ static inline int i40e_tx_prepare_vlan_flags(struct sk_buff *skb, rc = skb_cow_head(skb, 0); if (rc < 0) return rc; - vhdr = skb_vlan_eth_hdr(skb); + vhdr = (struct vlan_ethhdr *)skb->data; vhdr->h_vlan_TCI = htons(tx_flags >> I40E_TX_FLAGS_VLAN_SHIFT); } else { diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c index c7d761426d6c..cb925baf72ce 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c @@ -152,32 +152,6 @@ void i40e_vc_notify_reset(struct i40e_pf *pf) (u8 *)&pfe, sizeof(struct virtchnl_pf_event)); } -#ifdef CONFIG_PCI_IOV -void i40e_restore_all_vfs_msi_state(struct pci_dev *pdev) -{ - u16 vf_id; - u16 pos; - - /* Continue only if this is a PF */ - if (!pdev->is_physfn) - return; - - if (!pci_num_vf(pdev)) - return; - - pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV); - if (pos) { - struct pci_dev *vf_dev = NULL; - - pci_read_config_word(pdev, pos + PCI_SRIOV_VF_DID, &vf_id); - while ((vf_dev = pci_get_device(pdev->vendor, vf_id, vf_dev))) { - if (vf_dev->is_virtfn && vf_dev->physfn == pdev) - pci_restore_msi_state(vf_dev); - } - } -} -#endif /* CONFIG_PCI_IOV */ - /** * i40e_vc_notify_vf_reset * @vf: pointer to the VF structure @@ -3477,16 +3451,16 @@ static int i40e_validate_cloud_filter(struct i40e_vf *vf, bool found = false; int bkt; - if (tc_filter->action != VIRTCHNL_ACTION_TC_REDIRECT) { + if (!tc_filter->action) { dev_info(&pf->pdev->dev, - "VF %d: ADQ doesn't support this action (%d)\n", - vf->vf_id, tc_filter->action); + "VF %d: Currently ADq doesn't support Drop Action\n", + vf->vf_id); goto err; } /* action_meta is TC number here to which the filter is applied */ if (!tc_filter->action_meta || - tc_filter->action_meta > vf->num_tc) { + tc_filter->action_meta > I40E_MAX_VF_VSI) { dev_info(&pf->pdev->dev, "VF %d: Invalid TC number %u\n", vf->vf_id, tc_filter->action_meta); goto err; diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h index bd497cc5303a..358bbdb58795 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h @@ -135,9 +135,6 @@ int i40e_ndo_set_vf_spoofchk(struct net_device *netdev, int vf_id, bool enable); void i40e_vc_notify_link_state(struct i40e_pf *pf); void i40e_vc_notify_reset(struct i40e_pf *pf); -#ifdef CONFIG_PCI_IOV -void i40e_restore_all_vfs_msi_state(struct pci_dev *pdev); -#endif /* CONFIG_PCI_IOV */ int i40e_get_vf_stats(struct net_device *netdev, int vf_id, struct ifla_vf_stats *vf_stats); diff --git a/drivers/net/ethernet/intel/iavf/iavf.h b/drivers/net/ethernet/intel/iavf/iavf.h index ee0871d92930..7389855fa307 100644 --- a/drivers/net/ethernet/intel/iavf/iavf.h +++ b/drivers/net/ethernet/intel/iavf/iavf.h @@ -303,7 +303,6 @@ struct iavf_adapter { #define IAVF_FLAG_QUEUES_DISABLED BIT(17) #define IAVF_FLAG_SETUP_NETDEV_FEATURES BIT(18) #define IAVF_FLAG_REINIT_MSIX_NEEDED BIT(20) -#define IAVF_FLAG_FDIR_ENABLED BIT(21) /* duplicates for common code */ #define IAVF_FLAG_DCB_ENABLED 0 /* flags for admin queue service task */ diff --git a/drivers/net/ethernet/intel/iavf/iavf_ethtool.c b/drivers/net/ethernet/intel/iavf/iavf_ethtool.c index f4ac2b164b3e..31e02624aca4 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_ethtool.c +++ b/drivers/net/ethernet/intel/iavf/iavf_ethtool.c @@ -1063,7 +1063,7 @@ iavf_get_ethtool_fdir_entry(struct iavf_adapter *adapter, struct iavf_fdir_fltr *rule = NULL; int ret = 0; - if (!(adapter->flags & IAVF_FLAG_FDIR_ENABLED)) + if (!FDIR_FLTR_SUPPORT(adapter)) return -EOPNOTSUPP; spin_lock_bh(&adapter->fdir_fltr_lock); @@ -1205,7 +1205,7 @@ iavf_get_fdir_fltr_ids(struct iavf_adapter *adapter, struct ethtool_rxnfc *cmd, unsigned int cnt = 0; int val = 0; - if (!(adapter->flags & IAVF_FLAG_FDIR_ENABLED)) + if (!FDIR_FLTR_SUPPORT(adapter)) return -EOPNOTSUPP; cmd->data = IAVF_MAX_FDIR_FILTERS; @@ -1397,7 +1397,7 @@ static int iavf_add_fdir_ethtool(struct iavf_adapter *adapter, struct ethtool_rx int count = 50; int err; - if (!(adapter->flags & IAVF_FLAG_FDIR_ENABLED)) + if (!FDIR_FLTR_SUPPORT(adapter)) return -EOPNOTSUPP; if (fsp->flow_type & FLOW_MAC_EXT) @@ -1438,16 +1438,12 @@ static int iavf_add_fdir_ethtool(struct iavf_adapter *adapter, struct ethtool_rx spin_lock_bh(&adapter->fdir_fltr_lock); iavf_fdir_list_add_fltr(adapter, fltr); adapter->fdir_active_fltr++; - if (adapter->link_up) { - fltr->state = IAVF_FDIR_FLTR_ADD_REQUEST; - adapter->aq_required |= IAVF_FLAG_AQ_ADD_FDIR_FILTER; - } else { - fltr->state = IAVF_FDIR_FLTR_INACTIVE; - } + fltr->state = IAVF_FDIR_FLTR_ADD_REQUEST; + adapter->aq_required |= IAVF_FLAG_AQ_ADD_FDIR_FILTER; spin_unlock_bh(&adapter->fdir_fltr_lock); - if (adapter->link_up) - mod_delayed_work(adapter->wq, &adapter->watchdog_task, 0); + mod_delayed_work(adapter->wq, &adapter->watchdog_task, 0); + ret: if (err && fltr) kfree(fltr); @@ -1469,7 +1465,7 @@ static int iavf_del_fdir_ethtool(struct iavf_adapter *adapter, struct ethtool_rx struct iavf_fdir_fltr *fltr = NULL; int err = 0; - if (!(adapter->flags & IAVF_FLAG_FDIR_ENABLED)) + if (!FDIR_FLTR_SUPPORT(adapter)) return -EOPNOTSUPP; spin_lock_bh(&adapter->fdir_fltr_lock); @@ -1478,11 +1474,6 @@ static int iavf_del_fdir_ethtool(struct iavf_adapter *adapter, struct ethtool_rx if (fltr->state == IAVF_FDIR_FLTR_ACTIVE) { fltr->state = IAVF_FDIR_FLTR_DEL_REQUEST; adapter->aq_required |= IAVF_FLAG_AQ_DEL_FDIR_FILTER; - } else if (fltr->state == IAVF_FDIR_FLTR_INACTIVE) { - list_del(&fltr->list); - kfree(fltr); - adapter->fdir_active_fltr--; - fltr = NULL; } else { err = -EBUSY; } @@ -1791,7 +1782,7 @@ static int iavf_get_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd, ret = 0; break; case ETHTOOL_GRXCLSRLCNT: - if (!(adapter->flags & IAVF_FLAG_FDIR_ENABLED)) + if (!FDIR_FLTR_SUPPORT(adapter)) break; spin_lock_bh(&adapter->fdir_fltr_lock); cmd->rule_cnt = adapter->fdir_active_fltr; diff --git a/drivers/net/ethernet/intel/iavf/iavf_fdir.h b/drivers/net/ethernet/intel/iavf/iavf_fdir.h index d31bd923ba8c..9eb9f73f6adf 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_fdir.h +++ b/drivers/net/ethernet/intel/iavf/iavf_fdir.h @@ -6,25 +6,12 @@ struct iavf_adapter; -/* State of Flow Director filter - * - * *_REQUEST states are used to mark filter to be sent to PF driver to perform - * an action (either add or delete filter). *_PENDING states are an indication - * that request was sent to PF and the driver is waiting for response. - * - * Both DELETE and DISABLE states are being used to delete a filter in PF. - * The difference is that after a successful response filter in DEL_PENDING - * state is being deleted from VF driver as well and filter in DIS_PENDING state - * is being changed to INACTIVE state. - */ +/* State of Flow Director filter */ enum iavf_fdir_fltr_state_t { IAVF_FDIR_FLTR_ADD_REQUEST, /* User requests to add filter */ IAVF_FDIR_FLTR_ADD_PENDING, /* Filter pending add by the PF */ IAVF_FDIR_FLTR_DEL_REQUEST, /* User requests to delete filter */ IAVF_FDIR_FLTR_DEL_PENDING, /* Filter pending delete by the PF */ - IAVF_FDIR_FLTR_DIS_REQUEST, /* Filter scheduled to be disabled */ - IAVF_FDIR_FLTR_DIS_PENDING, /* Filter pending disable by the PF */ - IAVF_FDIR_FLTR_INACTIVE, /* Filter inactive on link down */ IAVF_FDIR_FLTR_ACTIVE, /* Filter is active */ }; diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c index b9c4b311cd62..4836bac2bd09 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_main.c +++ b/drivers/net/ethernet/intel/iavf/iavf_main.c @@ -1368,20 +1368,18 @@ static void iavf_clear_cloud_filters(struct iavf_adapter *adapter) **/ static void iavf_clear_fdir_filters(struct iavf_adapter *adapter) { - struct iavf_fdir_fltr *fdir; + struct iavf_fdir_fltr *fdir, *fdirtmp; /* remove all Flow Director filters */ spin_lock_bh(&adapter->fdir_fltr_lock); - list_for_each_entry(fdir, &adapter->fdir_list_head, list) { + list_for_each_entry_safe(fdir, fdirtmp, &adapter->fdir_list_head, + list) { if (fdir->state == IAVF_FDIR_FLTR_ADD_REQUEST) { - /* Cancel a request, keep filter as inactive */ - fdir->state = IAVF_FDIR_FLTR_INACTIVE; - } else if (fdir->state == IAVF_FDIR_FLTR_ADD_PENDING || - fdir->state == IAVF_FDIR_FLTR_ACTIVE) { - /* Disable filters which are active or have a pending - * request to PF to be added - */ - fdir->state = IAVF_FDIR_FLTR_DIS_REQUEST; + list_del(&fdir->list); + kfree(fdir); + adapter->fdir_active_fltr--; + } else { + fdir->state = IAVF_FDIR_FLTR_DEL_REQUEST; } } spin_unlock_bh(&adapter->fdir_fltr_lock); @@ -4212,33 +4210,6 @@ static int iavf_setup_tc(struct net_device *netdev, enum tc_setup_type type, } } -/** - * iavf_restore_fdir_filters - * @adapter: board private structure - * - * Restore existing FDIR filters when VF netdev comes back up. - **/ -static void iavf_restore_fdir_filters(struct iavf_adapter *adapter) -{ - struct iavf_fdir_fltr *f; - - spin_lock_bh(&adapter->fdir_fltr_lock); - list_for_each_entry(f, &adapter->fdir_list_head, list) { - if (f->state == IAVF_FDIR_FLTR_DIS_REQUEST) { - /* Cancel a request, keep filter as active */ - f->state = IAVF_FDIR_FLTR_ACTIVE; - } else if (f->state == IAVF_FDIR_FLTR_DIS_PENDING || - f->state == IAVF_FDIR_FLTR_INACTIVE) { - /* Add filters which are inactive or have a pending - * request to PF to be deleted - */ - f->state = IAVF_FDIR_FLTR_ADD_REQUEST; - adapter->aq_required |= IAVF_FLAG_AQ_ADD_FDIR_FILTER; - } - } - spin_unlock_bh(&adapter->fdir_fltr_lock); -} - /** * iavf_open - Called when a network interface is made active * @netdev: network interface device structure @@ -4306,9 +4277,8 @@ static int iavf_open(struct net_device *netdev) spin_unlock_bh(&adapter->mac_vlan_list_lock); - /* Restore filters that were removed with IFF_DOWN */ + /* Restore VLAN filters that were removed with IFF_DOWN */ iavf_restore_filters(adapter); - iavf_restore_fdir_filters(adapter); iavf_configure(adapter); @@ -4445,49 +4415,6 @@ static int iavf_change_mtu(struct net_device *netdev, int new_mtu) return ret; } -/** - * iavf_disable_fdir - disable Flow Director and clear existing filters - * @adapter: board private structure - **/ -static void iavf_disable_fdir(struct iavf_adapter *adapter) -{ - struct iavf_fdir_fltr *fdir, *fdirtmp; - bool del_filters = false; - - adapter->flags &= ~IAVF_FLAG_FDIR_ENABLED; - - /* remove all Flow Director filters */ - spin_lock_bh(&adapter->fdir_fltr_lock); - list_for_each_entry_safe(fdir, fdirtmp, &adapter->fdir_list_head, - list) { - if (fdir->state == IAVF_FDIR_FLTR_ADD_REQUEST || - fdir->state == IAVF_FDIR_FLTR_INACTIVE) { - /* Delete filters not registered in PF */ - list_del(&fdir->list); - kfree(fdir); - adapter->fdir_active_fltr--; - } else if (fdir->state == IAVF_FDIR_FLTR_ADD_PENDING || - fdir->state == IAVF_FDIR_FLTR_DIS_REQUEST || - fdir->state == IAVF_FDIR_FLTR_ACTIVE) { - /* Filters registered in PF, schedule their deletion */ - fdir->state = IAVF_FDIR_FLTR_DEL_REQUEST; - del_filters = true; - } else if (fdir->state == IAVF_FDIR_FLTR_DIS_PENDING) { - /* Request to delete filter already sent to PF, change - * state to DEL_PENDING to delete filter after PF's - * response, not set as INACTIVE - */ - fdir->state = IAVF_FDIR_FLTR_DEL_PENDING; - } - } - spin_unlock_bh(&adapter->fdir_fltr_lock); - - if (del_filters) { - adapter->aq_required |= IAVF_FLAG_AQ_DEL_FDIR_FILTER; - mod_delayed_work(adapter->wq, &adapter->watchdog_task, 0); - } -} - #define NETIF_VLAN_OFFLOAD_FEATURES (NETIF_F_HW_VLAN_CTAG_RX | \ NETIF_F_HW_VLAN_CTAG_TX | \ NETIF_F_HW_VLAN_STAG_RX | \ @@ -4510,13 +4437,6 @@ static int iavf_set_features(struct net_device *netdev, iavf_set_vlan_offload_features(adapter, netdev->features, features); - if ((netdev->features & NETIF_F_NTUPLE) ^ (features & NETIF_F_NTUPLE)) { - if (features & NETIF_F_NTUPLE) - adapter->flags |= IAVF_FLAG_FDIR_ENABLED; - else - iavf_disable_fdir(adapter); - } - return 0; } @@ -4812,9 +4732,6 @@ static netdev_features_t iavf_fix_features(struct net_device *netdev, { struct iavf_adapter *adapter = netdev_priv(netdev); - if (!FDIR_FLTR_SUPPORT(adapter)) - features &= ~NETIF_F_NTUPLE; - return iavf_fix_netdev_vlan_features(adapter, features); } @@ -4932,12 +4849,6 @@ int iavf_process_config(struct iavf_adapter *adapter) if (vfres->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN) netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER; - if (FDIR_FLTR_SUPPORT(adapter)) { - netdev->hw_features |= NETIF_F_NTUPLE; - netdev->features |= NETIF_F_NTUPLE; - adapter->flags |= IAVF_FLAG_FDIR_ENABLED; - } - netdev->priv_flags |= IFF_UNICAST_FLT; /* Do not turn on offloads when they are requested to be turned off. diff --git a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c index 951ef350323a..5a66b05c0322 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c +++ b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c @@ -1752,8 +1752,8 @@ void iavf_add_fdir_filter(struct iavf_adapter *adapter) **/ void iavf_del_fdir_filter(struct iavf_adapter *adapter) { - struct virtchnl_fdir_del f = {}; struct iavf_fdir_fltr *fdir; + struct virtchnl_fdir_del f; bool process_fltr = false; int len; @@ -1770,16 +1770,11 @@ void iavf_del_fdir_filter(struct iavf_adapter *adapter) list_for_each_entry(fdir, &adapter->fdir_list_head, list) { if (fdir->state == IAVF_FDIR_FLTR_DEL_REQUEST) { process_fltr = true; + memset(&f, 0, len); f.vsi_id = fdir->vc_add_msg.vsi_id; f.flow_id = fdir->flow_id; fdir->state = IAVF_FDIR_FLTR_DEL_PENDING; break; - } else if (fdir->state == IAVF_FDIR_FLTR_DIS_REQUEST) { - process_fltr = true; - f.vsi_id = fdir->vc_add_msg.vsi_id; - f.flow_id = fdir->flow_id; - fdir->state = IAVF_FDIR_FLTR_DIS_PENDING; - break; } } spin_unlock_bh(&adapter->fdir_fltr_lock); @@ -1923,48 +1918,6 @@ static void iavf_netdev_features_vlan_strip_set(struct net_device *netdev, netdev->features &= ~NETIF_F_HW_VLAN_CTAG_RX; } -/** - * iavf_activate_fdir_filters - Reactivate all FDIR filters after a reset - * @adapter: private adapter structure - * - * Called after a reset to re-add all FDIR filters and delete some of them - * if they were pending to be deleted. - */ -static void iavf_activate_fdir_filters(struct iavf_adapter *adapter) -{ - struct iavf_fdir_fltr *f, *ftmp; - bool add_filters = false; - - spin_lock_bh(&adapter->fdir_fltr_lock); - list_for_each_entry_safe(f, ftmp, &adapter->fdir_list_head, list) { - if (f->state == IAVF_FDIR_FLTR_ADD_REQUEST || - f->state == IAVF_FDIR_FLTR_ADD_PENDING || - f->state == IAVF_FDIR_FLTR_ACTIVE) { - /* All filters and requests have been removed in PF, - * restore them - */ - f->state = IAVF_FDIR_FLTR_ADD_REQUEST; - add_filters = true; - } else if (f->state == IAVF_FDIR_FLTR_DIS_REQUEST || - f->state == IAVF_FDIR_FLTR_DIS_PENDING) { - /* Link down state, leave filters as inactive */ - f->state = IAVF_FDIR_FLTR_INACTIVE; - } else if (f->state == IAVF_FDIR_FLTR_DEL_REQUEST || - f->state == IAVF_FDIR_FLTR_DEL_PENDING) { - /* Delete filters that were pending to be deleted, the - * list on PF is already cleared after a reset - */ - list_del(&f->list); - kfree(f); - adapter->fdir_active_fltr--; - } - } - spin_unlock_bh(&adapter->fdir_fltr_lock); - - if (add_filters) - adapter->aq_required |= IAVF_FLAG_AQ_ADD_FDIR_FILTER; -} - /** * iavf_virtchnl_completion * @adapter: adapter structure @@ -2142,8 +2095,7 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter, spin_lock_bh(&adapter->fdir_fltr_lock); list_for_each_entry(fdir, &adapter->fdir_list_head, list) { - if (fdir->state == IAVF_FDIR_FLTR_DEL_PENDING || - fdir->state == IAVF_FDIR_FLTR_DIS_PENDING) { + if (fdir->state == IAVF_FDIR_FLTR_DEL_PENDING) { fdir->state = IAVF_FDIR_FLTR_ACTIVE; dev_info(&adapter->pdev->dev, "Failed to del Flow Director filter, error %s\n", iavf_stat_str(&adapter->hw, @@ -2280,8 +2232,6 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter, spin_unlock_bh(&adapter->mac_vlan_list_lock); - iavf_activate_fdir_filters(adapter); - iavf_parse_vf_resource_msg(adapter); /* negotiated VIRTCHNL_VF_OFFLOAD_VLAN_V2, so wait for the @@ -2471,9 +2421,7 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter, list_for_each_entry_safe(fdir, fdir_tmp, &adapter->fdir_list_head, list) { if (fdir->state == IAVF_FDIR_FLTR_DEL_PENDING) { - if (del_fltr->status == VIRTCHNL_FDIR_SUCCESS || - del_fltr->status == - VIRTCHNL_FDIR_FAILURE_RULE_NONEXIST) { + if (del_fltr->status == VIRTCHNL_FDIR_SUCCESS) { dev_info(&adapter->pdev->dev, "Flow Director filter with location %u is deleted\n", fdir->loc); list_del(&fdir->list); @@ -2485,17 +2433,6 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter, del_fltr->status); iavf_print_fdir_fltr(adapter, fdir); } - } else if (fdir->state == IAVF_FDIR_FLTR_DIS_PENDING) { - if (del_fltr->status == VIRTCHNL_FDIR_SUCCESS || - del_fltr->status == - VIRTCHNL_FDIR_FAILURE_RULE_NONEXIST) { - fdir->state = IAVF_FDIR_FLTR_INACTIVE; - } else { - fdir->state = IAVF_FDIR_FLTR_ACTIVE; - dev_info(&adapter->pdev->dev, "Failed to disable Flow Director filter with status: %d\n", - del_fltr->status); - iavf_print_fdir_fltr(adapter, fdir); - } } } spin_unlock_bh(&adapter->fdir_fltr_lock); diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index ab46cfca4028..f0f39364819a 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -2138,7 +2138,7 @@ static int ice_configure_phy(struct ice_vsi *vsi) /* Ensure we have media as we cannot configure a medialess port */ if (!(phy->link_info.link_info & ICE_AQ_MEDIA_AVAILABLE)) - return -ENOMEDIUM; + return -EPERM; ice_print_topo_conflict(vsi); @@ -9065,14 +9065,8 @@ int ice_stop(struct net_device *netdev) int link_err = ice_force_phys_link_state(vsi, false); if (link_err) { - if (link_err == -ENOMEDIUM) - netdev_info(vsi->netdev, "Skipping link reconfig - no media attached, VSI %d\n", - vsi->vsi_num); - else - netdev_err(vsi->netdev, "Failed to set physical link down, VSI %d error %d\n", - vsi->vsi_num, link_err); - - ice_vsi_close(vsi); + netdev_err(vsi->netdev, "Failed to set physical link down, VSI %d error %d\n", + vsi->vsi_num, link_err); return -EIO; } } diff --git a/drivers/net/ethernet/intel/igc/igc.h b/drivers/net/ethernet/intel/igc/igc.h index 2a894ca49d93..43c05b41627f 100644 --- a/drivers/net/ethernet/intel/igc/igc.h +++ b/drivers/net/ethernet/intel/igc/igc.h @@ -538,7 +538,6 @@ struct igc_nfc_filter { u16 etype; __be16 vlan_etype; u16 vlan_tci; - u16 vlan_tci_mask; u8 src_addr[ETH_ALEN]; u8 dst_addr[ETH_ALEN]; u8 user_data[8]; diff --git a/drivers/net/ethernet/intel/igc/igc_ethtool.c b/drivers/net/ethernet/intel/igc/igc_ethtool.c index 2bee9cace598..81897f7a90a9 100644 --- a/drivers/net/ethernet/intel/igc/igc_ethtool.c +++ b/drivers/net/ethernet/intel/igc/igc_ethtool.c @@ -957,7 +957,6 @@ static int igc_ethtool_set_coalesce(struct net_device *netdev, } #define ETHER_TYPE_FULL_MASK ((__force __be16)~0) -#define VLAN_TCI_FULL_MASK ((__force __be16)~0) static int igc_ethtool_get_nfc_rule(struct igc_adapter *adapter, struct ethtool_rxnfc *cmd) { @@ -980,16 +979,10 @@ static int igc_ethtool_get_nfc_rule(struct igc_adapter *adapter, fsp->m_u.ether_spec.h_proto = ETHER_TYPE_FULL_MASK; } - if (rule->filter.match_flags & IGC_FILTER_FLAG_VLAN_ETYPE) { - fsp->flow_type |= FLOW_EXT; - fsp->h_ext.vlan_etype = rule->filter.vlan_etype; - fsp->m_ext.vlan_etype = ETHER_TYPE_FULL_MASK; - } - if (rule->filter.match_flags & IGC_FILTER_FLAG_VLAN_TCI) { fsp->flow_type |= FLOW_EXT; fsp->h_ext.vlan_tci = htons(rule->filter.vlan_tci); - fsp->m_ext.vlan_tci = htons(rule->filter.vlan_tci_mask); + fsp->m_ext.vlan_tci = htons(VLAN_PRIO_MASK); } if (rule->filter.match_flags & IGC_FILTER_FLAG_DST_MAC_ADDR) { @@ -1224,7 +1217,6 @@ static void igc_ethtool_init_nfc_rule(struct igc_nfc_rule *rule, if ((fsp->flow_type & FLOW_EXT) && fsp->m_ext.vlan_tci) { rule->filter.vlan_tci = ntohs(fsp->h_ext.vlan_tci); - rule->filter.vlan_tci_mask = ntohs(fsp->m_ext.vlan_tci); rule->filter.match_flags |= IGC_FILTER_FLAG_VLAN_TCI; } @@ -1262,19 +1254,11 @@ static void igc_ethtool_init_nfc_rule(struct igc_nfc_rule *rule, memcpy(rule->filter.user_mask, fsp->m_ext.data, sizeof(fsp->m_ext.data)); } - /* The i225/i226 has various different filters. Flex filters provide a - * way to match up to the first 128 bytes of a packet. Use them for: - * a) For specific user data - * b) For VLAN EtherType - * c) For full TCI match - * d) Or in case multiple filter criteria are set - * - * Otherwise, use the simple MAC, VLAN PRIO or EtherType filters. + /* When multiple filter options or user data or vlan etype is set, use a + * flex filter. */ if ((rule->filter.match_flags & IGC_FILTER_FLAG_USER_DATA) || (rule->filter.match_flags & IGC_FILTER_FLAG_VLAN_ETYPE) || - ((rule->filter.match_flags & IGC_FILTER_FLAG_VLAN_TCI) && - rule->filter.vlan_tci_mask == ntohs(VLAN_TCI_FULL_MASK)) || (rule->filter.match_flags & (rule->filter.match_flags - 1))) rule->flex = true; else @@ -1344,26 +1328,6 @@ static int igc_ethtool_add_nfc_rule(struct igc_adapter *adapter, return -EINVAL; } - /* There are two ways to match the VLAN TCI: - * 1. Match on PCP field and use vlan prio filter for it - * 2. Match on complete TCI field and use flex filter for it - */ - if ((fsp->flow_type & FLOW_EXT) && - fsp->m_ext.vlan_tci && - fsp->m_ext.vlan_tci != htons(VLAN_PRIO_MASK) && - fsp->m_ext.vlan_tci != VLAN_TCI_FULL_MASK) { - netdev_dbg(netdev, "VLAN mask not supported\n"); - return -EOPNOTSUPP; - } - - /* VLAN EtherType can only be matched by full mask. */ - if ((fsp->flow_type & FLOW_EXT) && - fsp->m_ext.vlan_etype && - fsp->m_ext.vlan_etype != ETHER_TYPE_FULL_MASK) { - netdev_dbg(netdev, "VLAN EtherType mask not supported\n"); - return -EOPNOTSUPP; - } - if (fsp->location >= IGC_MAX_RXNFC_RULES) { netdev_dbg(netdev, "Invalid location\n"); return -EINVAL; diff --git a/drivers/net/ethernet/intel/igc/igc_tsn.c b/drivers/net/ethernet/intel/igc/igc_tsn.c index 31ea0781b65e..725db36e399d 100644 --- a/drivers/net/ethernet/intel/igc/igc_tsn.c +++ b/drivers/net/ethernet/intel/igc/igc_tsn.c @@ -178,7 +178,7 @@ static int igc_tsn_enable_offload(struct igc_adapter *adapter) wr32(IGC_TQAVCC(i), tqavcc); wr32(IGC_TQAVHC(i), - 0x80000000 + ring->hicredit * 0x7736); + 0x80000000 + ring->hicredit * 0x7735); } else { /* Disable any CBS for the queue */ txqctl &= ~(IGC_TXQCTL_QAV_SEL_MASK); diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 9e0e13638c46..6105419ae2d5 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -8822,7 +8822,7 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, if (skb_cow_head(skb, 0)) goto out_drop; - vhdr = skb_vlan_eth_hdr(skb); + vhdr = (struct vlan_ethhdr *)skb->data; vhdr->h_vlan_TCI = htons(tx_flags >> IXGBE_TX_FLAGS_VLAN_SHIFT); } else { diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c index 90be87dc105d..65c0373d34d1 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c @@ -78,7 +78,7 @@ static bool is_dev_rpm(void *cgxd) bool is_lmac_valid(struct cgx *cgx, int lmac_id) { - if (!cgx || lmac_id < 0 || lmac_id >= cgx->max_lmac_per_mac) + if (!cgx || lmac_id < 0 || lmac_id >= MAX_LMAC_PER_CGX) return false; return test_bit(lmac_id, &cgx->lmac_bmap); } @@ -90,7 +90,7 @@ static int get_sequence_id_of_lmac(struct cgx *cgx, int lmac_id) { int tmp, id = 0; - for_each_set_bit(tmp, &cgx->lmac_bmap, cgx->max_lmac_per_mac) { + for_each_set_bit(tmp, &cgx->lmac_bmap, MAX_LMAC_PER_CGX) { if (tmp == lmac_id) break; id++; @@ -121,7 +121,7 @@ u64 cgx_read(struct cgx *cgx, u64 lmac, u64 offset) struct lmac *lmac_pdata(u8 lmac_id, struct cgx *cgx) { - if (!cgx || lmac_id >= cgx->max_lmac_per_mac) + if (!cgx || lmac_id >= MAX_LMAC_PER_CGX) return NULL; return cgx->lmac_idmap[lmac_id]; @@ -1410,7 +1410,7 @@ int cgx_get_fwdata_base(u64 *base) if (!cgx) return -ENXIO; - first_lmac = find_first_bit(&cgx->lmac_bmap, cgx->max_lmac_per_mac); + first_lmac = find_first_bit(&cgx->lmac_bmap, MAX_LMAC_PER_CGX); req = FIELD_SET(CMDREG_ID, CGX_CMD_GET_FWD_BASE, req); err = cgx_fwi_cmd_generic(req, &resp, cgx, first_lmac); if (!err) @@ -1499,7 +1499,7 @@ static int cgx_fwi_link_change(struct cgx *cgx, int lmac_id, bool enable) static inline int cgx_fwi_read_version(u64 *resp, struct cgx *cgx) { - int first_lmac = find_first_bit(&cgx->lmac_bmap, cgx->max_lmac_per_mac); + int first_lmac = find_first_bit(&cgx->lmac_bmap, MAX_LMAC_PER_CGX); u64 req = 0; req = FIELD_SET(CMDREG_ID, CGX_CMD_GET_FW_VER, req); @@ -1537,7 +1537,7 @@ static void cgx_lmac_linkup_work(struct work_struct *work) int i, err; /* Do Link up for all the enabled lmacs */ - for_each_set_bit(i, &cgx->lmac_bmap, cgx->max_lmac_per_mac) { + for_each_set_bit(i, &cgx->lmac_bmap, MAX_LMAC_PER_CGX) { err = cgx_fwi_link_change(cgx, i, true); if (err) dev_info(dev, "cgx port %d:%d Link up command failed\n", @@ -1557,6 +1557,14 @@ int cgx_lmac_linkup_start(void *cgxd) return 0; } +static void cgx_lmac_get_fifolen(struct cgx *cgx) +{ + u64 cfg; + + cfg = cgx_read(cgx, 0, CGX_CONST); + cgx->mac_ops->fifo_len = FIELD_GET(CGX_CONST_RXFIFO_SIZE, cfg); +} + static int cgx_configure_interrupt(struct cgx *cgx, struct lmac *lmac, int cnt, bool req_free) { @@ -1611,14 +1619,17 @@ static int cgx_lmac_init(struct cgx *cgx) u64 lmac_list; int i, err; + cgx_lmac_get_fifolen(cgx); + + cgx->lmac_count = cgx->mac_ops->get_nr_lmacs(cgx); /* lmac_list specifies which lmacs are enabled * when bit n is set to 1, LMAC[n] is enabled */ if (cgx->mac_ops->non_contiguous_serdes_lane) lmac_list = cgx_read(cgx, 0, CGXX_CMRX_RX_LMACS) & 0xFULL; - if (cgx->lmac_count > cgx->max_lmac_per_mac) - cgx->lmac_count = cgx->max_lmac_per_mac; + if (cgx->lmac_count > MAX_LMAC_PER_CGX) + cgx->lmac_count = MAX_LMAC_PER_CGX; for (i = 0; i < cgx->lmac_count; i++) { lmac = kzalloc(sizeof(struct lmac), GFP_KERNEL); @@ -1696,7 +1707,7 @@ static int cgx_lmac_exit(struct cgx *cgx) } /* Free all lmac related resources */ - for_each_set_bit(i, &cgx->lmac_bmap, cgx->max_lmac_per_mac) { + for_each_set_bit(i, &cgx->lmac_bmap, MAX_LMAC_PER_CGX) { lmac = cgx->lmac_idmap[i]; if (!lmac) continue; @@ -1712,12 +1723,6 @@ static int cgx_lmac_exit(struct cgx *cgx) static void cgx_populate_features(struct cgx *cgx) { - u64 cfg; - - cfg = cgx_read(cgx, 0, CGX_CONST); - cgx->mac_ops->fifo_len = FIELD_GET(CGX_CONST_RXFIFO_SIZE, cfg); - cgx->max_lmac_per_mac = FIELD_GET(CGX_CONST_MAX_LMACS, cfg); - if (is_dev_rpm(cgx)) cgx->hw_features = (RVU_LMAC_FEAT_DMACF | RVU_MAC_RPM | RVU_LMAC_FEAT_FC | RVU_LMAC_FEAT_PTP); diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.h b/drivers/net/ethernet/marvell/octeontx2/af/cgx.h index 09ddb00f63cc..04338db38671 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.h +++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.h @@ -18,8 +18,11 @@ /* PCI BAR nos */ #define PCI_CFG_REG_BAR_NUM 0 -#define CGX_ID_MASK 0xF +#define CGX_ID_MASK 0x7 +#define MAX_LMAC_PER_CGX 4 #define MAX_DMAC_ENTRIES_PER_CGX 32 +#define CGX_FIFO_LEN 65536 /* 64K for both Rx & Tx */ +#define CGX_OFFSET(x) ((x) * MAX_LMAC_PER_CGX) /* Registers */ #define CGXX_CMRX_CFG 0x00 @@ -53,7 +56,6 @@ #define CGXX_SCRATCH1_REG 0x1058 #define CGX_CONST 0x2000 #define CGX_CONST_RXFIFO_SIZE GENMASK_ULL(23, 0) -#define CGX_CONST_MAX_LMACS GENMASK_ULL(31, 24) #define CGXX_SPUX_CONTROL1 0x10000 #define CGXX_SPUX_LNX_FEC_CORR_BLOCKS 0x10700 #define CGXX_SPUX_LNX_FEC_UNCORR_BLOCKS 0x10800 diff --git a/drivers/net/ethernet/marvell/octeontx2/af/lmac_common.h b/drivers/net/ethernet/marvell/octeontx2/af/lmac_common.h index 697cfec74aa1..52b6016789fa 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/lmac_common.h +++ b/drivers/net/ethernet/marvell/octeontx2/af/lmac_common.h @@ -128,10 +128,7 @@ struct cgx { struct pci_dev *pdev; u8 cgx_id; u8 lmac_count; - /* number of LMACs per MAC could be 4 or 8 */ - u8 max_lmac_per_mac; -#define MAX_LMAC_COUNT 8 - struct lmac *lmac_idmap[MAX_LMAC_COUNT]; + struct lmac *lmac_idmap[MAX_LMAC_PER_CGX]; struct work_struct cgx_cmd_work; struct workqueue_struct *cgx_cmd_workq; struct list_head cgx_list; diff --git a/drivers/net/ethernet/marvell/octeontx2/af/npc.h b/drivers/net/ethernet/marvell/octeontx2/af/npc.h index aaff91bc7415..d027c23b8ef8 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/npc.h +++ b/drivers/net/ethernet/marvell/octeontx2/af/npc.h @@ -514,7 +514,7 @@ struct npc_lt_def { u8 ltype_mask; u8 ltype_match; u8 lid; -} __packed; +}; struct npc_lt_def_ipsec { u8 ltype_mask; @@ -522,7 +522,7 @@ struct npc_lt_def_ipsec { u8 lid; u8 spi_offset; u8 spi_nz; -} __packed; +}; struct npc_lt_def_apad { u8 ltype_mask; diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rpm.c b/drivers/net/ethernet/marvell/octeontx2/af/rpm.c index 6b4792a942d8..a70e1153fa04 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rpm.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rpm.c @@ -283,11 +283,6 @@ void rpm_lmac_pause_frm_config(void *rpmd, int lmac_id, bool enable) cfg = FIELD_SET(RPM_PFC_CLASS_MASK, 0, cfg); rpm_write(rpm, lmac_id, RPMX_CMRX_PRT_CBFC_CTL, cfg); - /* Disable forward pause to driver */ - cfg = rpm_read(rpm, lmac_id, RPMX_MTI_MAC100X_COMMAND_CONFIG); - cfg &= ~RPMX_MTI_MAC100X_COMMAND_CONFIG_PAUSE_FWD; - rpm_write(rpm, lmac_id, RPMX_MTI_MAC100X_COMMAND_CONFIG, cfg); - /* Enable channel mask for all LMACS */ rpm_write(rpm, 0, RPMX_CMR_CHAN_MSK_OR, ~0ULL); } @@ -456,10 +451,12 @@ int rpm_lmac_pfc_config(void *rpmd, int lmac_id, u8 tx_pause, u8 rx_pause, u16 p if (rx_pause) { cfg &= ~(RPMX_MTI_MAC100X_COMMAND_CONFIG_RX_P_DISABLE | - RPMX_MTI_MAC100X_COMMAND_CONFIG_PAUSE_IGNORE); + RPMX_MTI_MAC100X_COMMAND_CONFIG_PAUSE_IGNORE | + RPMX_MTI_MAC100X_COMMAND_CONFIG_PAUSE_FWD); } else { cfg |= (RPMX_MTI_MAC100X_COMMAND_CONFIG_RX_P_DISABLE | - RPMX_MTI_MAC100X_COMMAND_CONFIG_PAUSE_IGNORE); + RPMX_MTI_MAC100X_COMMAND_CONFIG_PAUSE_IGNORE | + RPMX_MTI_MAC100X_COMMAND_CONFIG_PAUSE_FWD); } if (tx_pause) { diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu.h b/drivers/net/ethernet/marvell/octeontx2/af/rvu.h index 0b76dfa979d4..95a7bc396e8e 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu.h +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu.h @@ -480,7 +480,7 @@ struct rvu { u8 cgx_mapped_pfs; u8 cgx_cnt_max; /* CGX port count max */ u8 *pf2cgxlmac_map; /* pf to cgx_lmac map */ - u64 *cgxlmac2pf_map; /* bitmap of mapped pfs for + u16 *cgxlmac2pf_map; /* bitmap of mapped pfs for * every cgx lmac port */ unsigned long pf_notify_bmap; /* Flags for PF notification */ @@ -850,7 +850,6 @@ u32 rvu_cgx_get_fifolen(struct rvu *rvu); void *rvu_first_cgx_pdata(struct rvu *rvu); int cgxlmac_to_pf(struct rvu *rvu, int cgx_id, int lmac_id); int rvu_cgx_config_tx(void *cgxd, int lmac_id, bool enable); -int rvu_cgx_tx_enable(struct rvu *rvu, u16 pcifunc, bool enable); int rvu_cgx_prio_flow_ctrl_cfg(struct rvu *rvu, u16 pcifunc, u8 tx_pause, u8 rx_pause, u16 pfc_en); int rvu_cgx_cfg_pause_frm(struct rvu *rvu, u16 pcifunc, u8 tx_pause, u8 rx_pause); diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c index bcb4385d0621..c60b9580ca96 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c @@ -55,9 +55,8 @@ bool is_mac_feature_supported(struct rvu *rvu, int pf, int feature) return (cgx_features_get(cgxd) & feature); } -#define CGX_OFFSET(x) ((x) * rvu->hw->lmac_per_cgx) /* Returns bitmap of mapped PFs */ -static u64 cgxlmac_to_pfmap(struct rvu *rvu, u8 cgx_id, u8 lmac_id) +static u16 cgxlmac_to_pfmap(struct rvu *rvu, u8 cgx_id, u8 lmac_id) { return rvu->cgxlmac2pf_map[CGX_OFFSET(cgx_id) + lmac_id]; } @@ -72,8 +71,7 @@ int cgxlmac_to_pf(struct rvu *rvu, int cgx_id, int lmac_id) if (!pfmap) return -ENODEV; else - return find_first_bit(&pfmap, - rvu->cgx_cnt_max * rvu->hw->lmac_per_cgx); + return find_first_bit(&pfmap, 16); } static u8 cgxlmac_id_to_bmap(u8 cgx_id, u8 lmac_id) @@ -131,14 +129,14 @@ static int rvu_map_cgx_lmac_pf(struct rvu *rvu) if (!cgx_cnt_max) return 0; - if (cgx_cnt_max > 0xF || rvu->hw->lmac_per_cgx > 0xF) + if (cgx_cnt_max > 0xF || MAX_LMAC_PER_CGX > 0xF) return -EINVAL; /* Alloc map table * An additional entry is required since PF id starts from 1 and * hence entry at offset 0 is invalid. */ - size = (cgx_cnt_max * rvu->hw->lmac_per_cgx + 1) * sizeof(u8); + size = (cgx_cnt_max * MAX_LMAC_PER_CGX + 1) * sizeof(u8); rvu->pf2cgxlmac_map = devm_kmalloc(rvu->dev, size, GFP_KERNEL); if (!rvu->pf2cgxlmac_map) return -ENOMEM; @@ -147,10 +145,9 @@ static int rvu_map_cgx_lmac_pf(struct rvu *rvu) memset(rvu->pf2cgxlmac_map, 0xFF, size); /* Reverse map table */ - rvu->cgxlmac2pf_map = - devm_kzalloc(rvu->dev, - cgx_cnt_max * rvu->hw->lmac_per_cgx * sizeof(u64), - GFP_KERNEL); + rvu->cgxlmac2pf_map = devm_kzalloc(rvu->dev, + cgx_cnt_max * MAX_LMAC_PER_CGX * sizeof(u16), + GFP_KERNEL); if (!rvu->cgxlmac2pf_map) return -ENOMEM; @@ -159,7 +156,7 @@ static int rvu_map_cgx_lmac_pf(struct rvu *rvu) if (!rvu_cgx_pdata(cgx, rvu)) continue; lmac_bmap = cgx_get_lmac_bmap(rvu_cgx_pdata(cgx, rvu)); - for_each_set_bit(iter, &lmac_bmap, rvu->hw->lmac_per_cgx) { + for_each_set_bit(iter, &lmac_bmap, MAX_LMAC_PER_CGX) { lmac = cgx_get_lmacid(rvu_cgx_pdata(cgx, rvu), iter); rvu->pf2cgxlmac_map[pf] = cgxlmac_id_to_bmap(cgx, lmac); @@ -238,8 +235,7 @@ static void cgx_notify_pfs(struct cgx_link_event *event, struct rvu *rvu) pfmap = cgxlmac_to_pfmap(rvu, event->cgx_id, event->lmac_id); do { - pfid = find_first_bit(&pfmap, - rvu->cgx_cnt_max * rvu->hw->lmac_per_cgx); + pfid = find_first_bit(&pfmap, 16); clear_bit(pfid, &pfmap); /* check if notification is enabled */ @@ -314,7 +310,7 @@ static int cgx_lmac_event_handler_init(struct rvu *rvu) if (!cgxd) continue; lmac_bmap = cgx_get_lmac_bmap(cgxd); - for_each_set_bit(lmac, &lmac_bmap, rvu->hw->lmac_per_cgx) { + for_each_set_bit(lmac, &lmac_bmap, MAX_LMAC_PER_CGX) { err = cgx_lmac_evh_register(&cb, cgxd, lmac); if (err) dev_err(rvu->dev, @@ -400,7 +396,7 @@ int rvu_cgx_exit(struct rvu *rvu) if (!cgxd) continue; lmac_bmap = cgx_get_lmac_bmap(cgxd); - for_each_set_bit(lmac, &lmac_bmap, rvu->hw->lmac_per_cgx) + for_each_set_bit(lmac, &lmac_bmap, MAX_LMAC_PER_CGX) cgx_lmac_evh_unregister(cgxd, lmac); } @@ -460,23 +456,6 @@ int rvu_cgx_config_rxtx(struct rvu *rvu, u16 pcifunc, bool start) return mac_ops->mac_rx_tx_enable(cgxd, lmac_id, start); } -int rvu_cgx_tx_enable(struct rvu *rvu, u16 pcifunc, bool enable) -{ - int pf = rvu_get_pf(pcifunc); - struct mac_ops *mac_ops; - u8 cgx_id, lmac_id; - void *cgxd; - - if (!is_cgx_config_permitted(rvu, pcifunc)) - return LMAC_AF_ERR_PERM_DENIED; - - rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_id, &lmac_id); - cgxd = rvu_cgx_pdata(cgx_id, rvu); - mac_ops = get_mac_ops(cgxd); - - return mac_ops->mac_tx_enable(cgxd, lmac_id, enable); -} - int rvu_cgx_config_tx(void *cgxd, int lmac_id, bool enable) { struct mac_ops *mac_ops; diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c index cc5d342e026c..5c9dc3f9262f 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c @@ -2618,7 +2618,7 @@ static void rvu_dbg_cgx_init(struct rvu *rvu) rvu->rvu_dbg.cgx = debugfs_create_dir(dname, rvu->rvu_dbg.cgx_root); - for_each_set_bit(lmac_id, &lmac_bmap, rvu->hw->lmac_per_cgx) { + for_each_set_bit(lmac_id, &lmac_bmap, MAX_LMAC_PER_CGX) { /* lmac debugfs dir */ sprintf(dname, "lmac%d", lmac_id); rvu->rvu_dbg.lmac = diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c index b9a4efb95533..d60951299899 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c @@ -642,7 +642,7 @@ static int rvu_nix_register_reporters(struct rvu_devlink *rvu_dl) rvu_dl->devlink_wq = create_workqueue("rvu_devlink_wq"); if (!rvu_dl->devlink_wq) - return -ENOMEM; + goto err; INIT_WORK(&rvu_reporters->intr_work, rvu_nix_intr_work); INIT_WORK(&rvu_reporters->gen_work, rvu_nix_gen_work); @@ -650,6 +650,9 @@ static int rvu_nix_register_reporters(struct rvu_devlink *rvu_dl) INIT_WORK(&rvu_reporters->ras_work, rvu_nix_ras_work); return 0; +err: + rvu_nix_health_reporters_destroy(rvu_dl); + return -ENOMEM; } static int rvu_nix_health_reporters_create(struct rvu_devlink *rvu_dl) diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c index bb99302eab67..959f36efdc4a 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c @@ -3923,18 +3923,90 @@ static void nix_find_link_frs(struct rvu *rvu, req->minlen = minlen; } +static int +nix_config_link_credits(struct rvu *rvu, int blkaddr, int link, + u16 pcifunc, u64 tx_credits) +{ + struct rvu_hwinfo *hw = rvu->hw; + int pf = rvu_get_pf(pcifunc); + u8 cgx_id = 0, lmac_id = 0; + unsigned long poll_tmo; + bool restore_tx_en = 0; + struct nix_hw *nix_hw; + u64 cfg, sw_xoff = 0; + u32 schq = 0; + u32 credits; + int rc; + + nix_hw = get_nix_hw(rvu->hw, blkaddr); + if (!nix_hw) + return NIX_AF_ERR_INVALID_NIXBLK; + + if (tx_credits == nix_hw->tx_credits[link]) + return 0; + + /* Enable cgx tx if disabled for credits to be back */ + if (is_pf_cgxmapped(rvu, pf)) { + rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_id, &lmac_id); + restore_tx_en = !rvu_cgx_config_tx(rvu_cgx_pdata(cgx_id, rvu), + lmac_id, true); + } + + mutex_lock(&rvu->rsrc_lock); + /* Disable new traffic to link */ + if (hw->cap.nix_shaping) { + schq = nix_get_tx_link(rvu, pcifunc); + sw_xoff = rvu_read64(rvu, blkaddr, NIX_AF_TL1X_SW_XOFF(schq)); + rvu_write64(rvu, blkaddr, + NIX_AF_TL1X_SW_XOFF(schq), BIT_ULL(0)); + } + + rc = NIX_AF_ERR_LINK_CREDITS; + poll_tmo = jiffies + usecs_to_jiffies(200000); + /* Wait for credits to return */ + do { + if (time_after(jiffies, poll_tmo)) + goto exit; + usleep_range(100, 200); + + cfg = rvu_read64(rvu, blkaddr, + NIX_AF_TX_LINKX_NORM_CREDIT(link)); + credits = (cfg >> 12) & 0xFFFFFULL; + } while (credits != nix_hw->tx_credits[link]); + + cfg &= ~(0xFFFFFULL << 12); + cfg |= (tx_credits << 12); + rvu_write64(rvu, blkaddr, NIX_AF_TX_LINKX_NORM_CREDIT(link), cfg); + rc = 0; + + nix_hw->tx_credits[link] = tx_credits; + +exit: + /* Enable traffic back */ + if (hw->cap.nix_shaping && !sw_xoff) + rvu_write64(rvu, blkaddr, NIX_AF_TL1X_SW_XOFF(schq), 0); + + /* Restore state of cgx tx */ + if (restore_tx_en) + rvu_cgx_config_tx(rvu_cgx_pdata(cgx_id, rvu), lmac_id, false); + + mutex_unlock(&rvu->rsrc_lock); + return rc; +} + int rvu_mbox_handler_nix_set_hw_frs(struct rvu *rvu, struct nix_frs_cfg *req, struct msg_rsp *rsp) { struct rvu_hwinfo *hw = rvu->hw; u16 pcifunc = req->hdr.pcifunc; int pf = rvu_get_pf(pcifunc); - int blkaddr, link = -1; + int blkaddr, schq, link = -1; + struct nix_txsch *txsch; + u64 cfg, lmac_fifo_len; struct nix_hw *nix_hw; struct rvu_pfvf *pfvf; u8 cgx = 0, lmac = 0; u16 max_mtu; - u64 cfg; blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc); if (blkaddr < 0) @@ -3955,6 +4027,25 @@ int rvu_mbox_handler_nix_set_hw_frs(struct rvu *rvu, struct nix_frs_cfg *req, if (req->update_minlen && req->minlen < NIC_HW_MIN_FRS) return NIX_AF_ERR_FRS_INVALID; + /* Check if requester wants to update SMQ's */ + if (!req->update_smq) + goto rx_frscfg; + + /* Update min/maxlen in each of the SMQ attached to this PF/VF */ + txsch = &nix_hw->txsch[NIX_TXSCH_LVL_SMQ]; + mutex_lock(&rvu->rsrc_lock); + for (schq = 0; schq < txsch->schq.max; schq++) { + if (TXSCH_MAP_FUNC(txsch->pfvf_map[schq]) != pcifunc) + continue; + cfg = rvu_read64(rvu, blkaddr, NIX_AF_SMQX_CFG(schq)); + cfg = (cfg & ~(0xFFFFULL << 8)) | ((u64)req->maxlen << 8); + if (req->update_minlen) + cfg = (cfg & ~0x7FULL) | ((u64)req->minlen & 0x7F); + rvu_write64(rvu, blkaddr, NIX_AF_SMQX_CFG(schq), cfg); + } + mutex_unlock(&rvu->rsrc_lock); + +rx_frscfg: /* Check if config is for SDP link */ if (req->sdp_link) { if (!hw->sdp_links) @@ -3977,6 +4068,7 @@ int rvu_mbox_handler_nix_set_hw_frs(struct rvu *rvu, struct nix_frs_cfg *req, if (link < 0) return NIX_AF_ERR_RX_LINK_INVALID; + linkcfg: nix_find_link_frs(rvu, req, pcifunc); @@ -3986,7 +4078,19 @@ linkcfg: cfg = (cfg & ~0xFFFFULL) | req->minlen; rvu_write64(rvu, blkaddr, NIX_AF_RX_LINKX_CFG(link), cfg); - return 0; + if (req->sdp_link || pf == 0) + return 0; + + /* Update transmit credits for CGX links */ + lmac_fifo_len = rvu_cgx_get_lmac_fifolen(rvu, cgx, lmac); + if (!lmac_fifo_len) { + dev_err(rvu->dev, + "%s: Failed to get CGX/RPM%d:LMAC%d FIFO size\n", + __func__, cgx, lmac); + return 0; + } + return nix_config_link_credits(rvu, blkaddr, link, pcifunc, + (lmac_fifo_len - req->maxlen) / 16); } int rvu_mbox_handler_nix_set_rx_cfg(struct rvu *rvu, struct nix_rx_cfg *req, @@ -4079,7 +4183,7 @@ static void nix_link_config(struct rvu *rvu, int blkaddr, /* Get LMAC id's from bitmap */ lmac_bmap = cgx_get_lmac_bmap(rvu_cgx_pdata(cgx, rvu)); - for_each_set_bit(iter, &lmac_bmap, rvu->hw->lmac_per_cgx) { + for_each_set_bit(iter, &lmac_bmap, MAX_LMAC_PER_CGX) { lmac_fifo_len = rvu_cgx_get_lmac_fifolen(rvu, cgx, iter); if (!lmac_fifo_len) { dev_err(rvu->dev, @@ -4506,13 +4610,7 @@ int rvu_mbox_handler_nix_lf_stop_rx(struct rvu *rvu, struct msg_req *req, pfvf = rvu_get_pfvf(rvu, pcifunc); clear_bit(NIXLF_INITIALIZED, &pfvf->flags); - err = rvu_cgx_start_stop_io(rvu, pcifunc, false); - if (err) - return err; - - rvu_cgx_tx_enable(rvu, pcifunc, true); - - return 0; + return rvu_cgx_start_stop_io(rvu, pcifunc, false); } #define RX_SA_BASE GENMASK_ULL(52, 7) diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c index 0bcf3e559280..f65805860c8d 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c @@ -671,7 +671,6 @@ void rvu_npc_install_promisc_entry(struct rvu *rvu, u16 pcifunc, int blkaddr, ucast_idx, index; struct nix_rx_action action = { 0 }; u64 relaxed_mask; - u8 flow_key_alg; if (!hw->cap.nix_rx_multicast && is_cgx_vf(rvu, pcifunc)) return; @@ -702,8 +701,6 @@ void rvu_npc_install_promisc_entry(struct rvu *rvu, u16 pcifunc, action.op = NIX_RX_ACTIONOP_UCAST; } - flow_key_alg = action.flow_key_alg; - /* RX_ACTION set to MCAST for CGX PF's */ if (hw->cap.nix_rx_multicast && pfvf->use_mce_list && is_pf_cgxmapped(rvu, rvu_get_pf(pcifunc))) { @@ -743,7 +740,7 @@ void rvu_npc_install_promisc_entry(struct rvu *rvu, u16 pcifunc, req.vf = pcifunc; req.index = action.index; req.match_id = action.match_id; - req.flow_key_alg = flow_key_alg; + req.flow_key_alg = action.flow_key_alg; rvu_mbox_handler_npc_install_flow(rvu, &req, &rsp); } @@ -857,7 +854,6 @@ void rvu_npc_install_allmulti_entry(struct rvu *rvu, u16 pcifunc, int nixlf, u8 mac_addr[ETH_ALEN] = { 0 }; struct nix_rx_action action = { 0 }; struct rvu_pfvf *pfvf; - u8 flow_key_alg; u16 vf_func; /* Only CGX PF/VF can add allmulticast entry */ @@ -892,7 +888,6 @@ void rvu_npc_install_allmulti_entry(struct rvu *rvu, u16 pcifunc, int nixlf, *(u64 *)&action = npc_get_mcam_action(rvu, mcam, blkaddr, ucast_idx); - flow_key_alg = action.flow_key_alg; if (action.op != NIX_RX_ACTIONOP_RSS) { *(u64 *)&action = 0; action.op = NIX_RX_ACTIONOP_UCAST; @@ -929,7 +924,7 @@ void rvu_npc_install_allmulti_entry(struct rvu *rvu, u16 pcifunc, int nixlf, req.vf = pcifunc | vf_func; req.index = action.index; req.match_id = action.match_id; - req.flow_key_alg = flow_key_alg; + req.flow_key_alg = action.flow_key_alg; rvu_mbox_handler_npc_install_flow(rvu, &req, &rsp); } @@ -995,38 +990,11 @@ static void npc_update_vf_flow_entry(struct rvu *rvu, struct npc_mcam *mcam, mutex_unlock(&mcam->lock); } -static void npc_update_rx_action_with_alg_idx(struct rvu *rvu, struct nix_rx_action action, - struct rvu_pfvf *pfvf, int mcam_index, int blkaddr, - int alg_idx) - -{ - struct npc_mcam *mcam = &rvu->hw->mcam; - struct rvu_hwinfo *hw = rvu->hw; - int bank, op_rss; - - if (!is_mcam_entry_enabled(rvu, mcam, blkaddr, mcam_index)) - return; - - op_rss = (!hw->cap.nix_rx_multicast || !pfvf->use_mce_list); - - bank = npc_get_bank(mcam, mcam_index); - mcam_index &= (mcam->banksize - 1); - - /* If Rx action is MCAST update only RSS algorithm index */ - if (!op_rss) { - *(u64 *)&action = rvu_read64(rvu, blkaddr, - NPC_AF_MCAMEX_BANKX_ACTION(mcam_index, bank)); - - action.flow_key_alg = alg_idx; - } - rvu_write64(rvu, blkaddr, - NPC_AF_MCAMEX_BANKX_ACTION(mcam_index, bank), *(u64 *)&action); -} - void rvu_npc_update_flowkey_alg_idx(struct rvu *rvu, u16 pcifunc, int nixlf, int group, int alg_idx, int mcam_index) { struct npc_mcam *mcam = &rvu->hw->mcam; + struct rvu_hwinfo *hw = rvu->hw; struct nix_rx_action action; int blkaddr, index, bank; struct rvu_pfvf *pfvf; @@ -1082,16 +1050,15 @@ void rvu_npc_update_flowkey_alg_idx(struct rvu *rvu, u16 pcifunc, int nixlf, /* If PF's promiscuous entry is enabled, * Set RSS action for that entry as well */ - npc_update_rx_action_with_alg_idx(rvu, action, pfvf, index, blkaddr, - alg_idx); + if ((!hw->cap.nix_rx_multicast || !pfvf->use_mce_list) && + is_mcam_entry_enabled(rvu, mcam, blkaddr, index)) { + bank = npc_get_bank(mcam, index); + index &= (mcam->banksize - 1); - index = npc_get_nixlf_mcam_index(mcam, pcifunc, - nixlf, NIXLF_ALLMULTI_ENTRY); - /* If PF's allmulti entry is enabled, - * Set RSS action for that entry as well - */ - npc_update_rx_action_with_alg_idx(rvu, action, pfvf, index, blkaddr, - alg_idx); + rvu_write64(rvu, blkaddr, + NPC_AF_MCAMEX_BANKX_ACTION(index, bank), + *(u64 *)&action); + } } void npc_enadis_default_mce_entry(struct rvu *rvu, u16 pcifunc, diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_hash.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_hash.c index 54e0dfdc9d98..34fa59575fa9 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_hash.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_hash.c @@ -1999,9 +1999,7 @@ int rvu_npc_exact_init(struct rvu *rvu) /* Install SDP drop rule */ drop_mcam_idx = &table->num_drop_rules; - max_lmac_cnt = rvu->cgx_cnt_max * rvu->hw->lmac_per_cgx + - PF_CGXMAP_BASE; - + max_lmac_cnt = rvu->cgx_cnt_max * MAX_LMAC_PER_CGX + PF_CGXMAP_BASE; for (i = PF_CGXMAP_BASE; i < max_lmac_cnt; i++) { if (rvu->pf2cgxlmac_map[i] == 0xFF) continue; diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_dcbnl.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_dcbnl.c index 28fb643d2917..bfddbff7bcdf 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_dcbnl.c +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_dcbnl.c @@ -399,10 +399,9 @@ static int otx2_dcbnl_ieee_getpfc(struct net_device *dev, struct ieee_pfc *pfc) static int otx2_dcbnl_ieee_setpfc(struct net_device *dev, struct ieee_pfc *pfc) { struct otx2_nic *pfvf = netdev_priv(dev); - u8 old_pfc_en; int err; - old_pfc_en = pfvf->pfc_en; + /* Save PFC configuration to interface */ pfvf->pfc_en = pfc->pfc_en; if (pfvf->hw.tx_queues >= NIX_PF_PFC_PRIO_MAX) @@ -412,17 +411,13 @@ static int otx2_dcbnl_ieee_setpfc(struct net_device *dev, struct ieee_pfc *pfc) * supported by the tx queue configuration */ err = otx2_check_pfc_config(pfvf); - if (err) { - pfvf->pfc_en = old_pfc_en; + if (err) return err; - } process_pfc: err = otx2_config_priority_flow_ctrl(pfvf); - if (err) { - pfvf->pfc_en = old_pfc_en; + if (err) return err; - } /* Request Per channel Bpids */ if (pfc->pfc_en) @@ -430,12 +425,6 @@ process_pfc: err = otx2_pfc_txschq_update(pfvf); if (err) { - if (pfc->pfc_en) - otx2_nix_config_bp(pfvf, false); - - otx2_pfc_txschq_stop(pfvf); - pfvf->pfc_en = old_pfc_en; - otx2_config_priority_flow_ctrl(pfvf); dev_err(pfvf->dev, "%s failed to update TX schedulers\n", __func__); return err; } diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c index a2d8ac620405..55807e2043ed 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c @@ -1638,21 +1638,6 @@ static void otx2_free_hw_resources(struct otx2_nic *pf) mutex_unlock(&mbox->lock); } -static bool otx2_promisc_use_mce_list(struct otx2_nic *pfvf) -{ - int vf; - - /* The AF driver will determine whether to allow the VF netdev or not */ - if (is_otx2_vf(pfvf->pcifunc)) - return true; - - /* check if there are any trusted VFs associated with the PF netdev */ - for (vf = 0; vf < pci_num_vf(pfvf->pdev); vf++) - if (pfvf->vf_configs[vf].trusted) - return true; - return false; -} - static void otx2_do_set_rx_mode(struct otx2_nic *pf) { struct net_device *netdev = pf->netdev; @@ -1685,8 +1670,7 @@ static void otx2_do_set_rx_mode(struct otx2_nic *pf) if (netdev->flags & (IFF_ALLMULTI | IFF_MULTICAST)) req->mode |= NIX_RX_MODE_ALLMULTI; - if (otx2_promisc_use_mce_list(pf)) - req->mode |= NIX_RX_MODE_USE_MCE; + req->mode |= NIX_RX_MODE_USE_MCE; otx2_sync_mbox_msg(&pf->mbox); mutex_unlock(&pf->mbox.lock); @@ -2650,14 +2634,11 @@ static int otx2_ndo_set_vf_trust(struct net_device *netdev, int vf, pf->vf_configs[vf].trusted = enable; rc = otx2_set_vf_permissions(pf, vf, OTX2_TRUSTED_VF); - if (rc) { + if (rc) pf->vf_configs[vf].trusted = !enable; - } else { + else netdev_info(pf->netdev, "VF %d is %strusted\n", vf, enable ? "" : "not "); - otx2_set_rx_mode(netdev); - } - return rc; } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c index ac6a0785b10d..b3253e263ebc 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c @@ -48,25 +48,6 @@ #define CREATE_TRACE_POINTS #include "diag/cmd_tracepoint.h" -struct mlx5_ifc_mbox_out_bits { - u8 status[0x8]; - u8 reserved_at_8[0x18]; - - u8 syndrome[0x20]; - - u8 reserved_at_40[0x40]; -}; - -struct mlx5_ifc_mbox_in_bits { - u8 opcode[0x10]; - u8 uid[0x10]; - - u8 reserved_at_20[0x10]; - u8 op_mod[0x10]; - - u8 reserved_at_40[0x40]; -}; - enum { CMD_IF_REV = 5, }; @@ -90,26 +71,6 @@ enum { MLX5_CMD_DELIVERY_STAT_CMD_DESCR_ERR = 0x10, }; -static u16 in_to_opcode(void *in) -{ - return MLX5_GET(mbox_in, in, opcode); -} - -/* Returns true for opcodes that might be triggered very frequently and throttle - * the command interface. Limit their command slots usage. - */ -static bool mlx5_cmd_is_throttle_opcode(u16 op) -{ - switch (op) { - case MLX5_CMD_OP_CREATE_GENERAL_OBJECT: - case MLX5_CMD_OP_DESTROY_GENERAL_OBJECT: - case MLX5_CMD_OP_MODIFY_GENERAL_OBJECT: - case MLX5_CMD_OP_QUERY_GENERAL_OBJECT: - return true; - } - return false; -} - static struct mlx5_cmd_work_ent * cmd_alloc_ent(struct mlx5_cmd *cmd, struct mlx5_cmd_msg *in, struct mlx5_cmd_msg *out, void *uout, int uout_size, @@ -131,7 +92,6 @@ cmd_alloc_ent(struct mlx5_cmd *cmd, struct mlx5_cmd_msg *in, ent->context = context; ent->cmd = cmd; ent->page_queue = page_queue; - ent->op = in_to_opcode(in->first.data); refcount_set(&ent->refcnt, 1); return ent; @@ -156,27 +116,24 @@ static u8 alloc_token(struct mlx5_cmd *cmd) return token; } -static int cmd_alloc_index(struct mlx5_cmd *cmd, struct mlx5_cmd_work_ent *ent) +static int cmd_alloc_index(struct mlx5_cmd *cmd) { unsigned long flags; int ret; spin_lock_irqsave(&cmd->alloc_lock, flags); - ret = find_first_bit(&cmd->vars.bitmask, cmd->vars.max_reg_cmds); - if (ret < cmd->vars.max_reg_cmds) { - clear_bit(ret, &cmd->vars.bitmask); - ent->idx = ret; - cmd->ent_arr[ent->idx] = ent; - } + ret = find_first_bit(&cmd->bitmask, cmd->max_reg_cmds); + if (ret < cmd->max_reg_cmds) + clear_bit(ret, &cmd->bitmask); spin_unlock_irqrestore(&cmd->alloc_lock, flags); - return ret < cmd->vars.max_reg_cmds ? ret : -ENOMEM; + return ret < cmd->max_reg_cmds ? ret : -ENOMEM; } static void cmd_free_index(struct mlx5_cmd *cmd, int idx) { lockdep_assert_held(&cmd->alloc_lock); - set_bit(idx, &cmd->vars.bitmask); + set_bit(idx, &cmd->bitmask); } static void cmd_ent_get(struct mlx5_cmd_work_ent *ent) @@ -195,7 +152,7 @@ static void cmd_ent_put(struct mlx5_cmd_work_ent *ent) if (ent->idx >= 0) { cmd_free_index(cmd, ent->idx); - up(ent->page_queue ? &cmd->vars.pages_sem : &cmd->vars.sem); + up(ent->page_queue ? &cmd->pages_sem : &cmd->sem); } cmd_free_ent(ent); @@ -205,7 +162,7 @@ out: static struct mlx5_cmd_layout *get_inst(struct mlx5_cmd *cmd, int idx) { - return cmd->cmd_buf + (idx << cmd->vars.log_stride); + return cmd->cmd_buf + (idx << cmd->log_stride); } static int mlx5_calc_cmd_blocks(struct mlx5_cmd_msg *msg) @@ -796,6 +753,25 @@ static int cmd_status_to_err(u8 status) } } +struct mlx5_ifc_mbox_out_bits { + u8 status[0x8]; + u8 reserved_at_8[0x18]; + + u8 syndrome[0x20]; + + u8 reserved_at_40[0x40]; +}; + +struct mlx5_ifc_mbox_in_bits { + u8 opcode[0x10]; + u8 uid[0x10]; + + u8 reserved_at_20[0x10]; + u8 op_mod[0x10]; + + u8 reserved_at_40[0x40]; +}; + void mlx5_cmd_out_err(struct mlx5_core_dev *dev, u16 opcode, u16 op_mod, void *out) { u32 syndrome = MLX5_GET(mbox_out, out, syndrome); @@ -813,7 +789,7 @@ static void cmd_status_print(struct mlx5_core_dev *dev, void *in, void *out) u16 opcode, op_mod; u16 uid; - opcode = in_to_opcode(in); + opcode = MLX5_GET(mbox_in, in, opcode); op_mod = MLX5_GET(mbox_in, in, op_mod); uid = MLX5_GET(mbox_in, in, uid); @@ -825,7 +801,7 @@ int mlx5_cmd_check(struct mlx5_core_dev *dev, int err, void *in, void *out) { /* aborted due to PCI error or via reset flow mlx5_cmd_trigger_completions() */ if (err == -ENXIO) { - u16 opcode = in_to_opcode(in); + u16 opcode = MLX5_GET(mbox_in, in, opcode); u32 syndrome; u8 status; @@ -854,9 +830,9 @@ static void dump_command(struct mlx5_core_dev *dev, struct mlx5_cmd_work_ent *ent, int input) { struct mlx5_cmd_msg *msg = input ? ent->in : ent->out; + u16 op = MLX5_GET(mbox_in, ent->lay->in, opcode); struct mlx5_cmd_mailbox *next = msg->next; int n = mlx5_calc_cmd_blocks(msg); - u16 op = ent->op; int data_only; u32 offset = 0; int dump_len; @@ -908,6 +884,11 @@ static void dump_command(struct mlx5_core_dev *dev, mlx5_core_dbg(dev, "cmd[%d]: end dump\n", ent->idx); } +static u16 msg_to_opcode(struct mlx5_cmd_msg *in) +{ + return MLX5_GET(mbox_in, in->first.data, opcode); +} + static void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, u64 vec, bool forced); static void cb_timeout_handler(struct work_struct *work) @@ -925,13 +906,13 @@ static void cb_timeout_handler(struct work_struct *work) /* Maybe got handled by eq recover ? */ if (!test_bit(MLX5_CMD_ENT_STATE_PENDING_COMP, &ent->state)) { mlx5_core_warn(dev, "cmd[%d]: %s(0x%x) Async, recovered after timeout\n", ent->idx, - mlx5_command_str(ent->op), ent->op); + mlx5_command_str(msg_to_opcode(ent->in)), msg_to_opcode(ent->in)); goto out; /* phew, already handled */ } ent->ret = -ETIMEDOUT; mlx5_core_warn(dev, "cmd[%d]: %s(0x%x) Async, timeout. Will cause a leak of a command resource\n", - ent->idx, mlx5_command_str(ent->op), ent->op); + ent->idx, mlx5_command_str(msg_to_opcode(ent->in)), msg_to_opcode(ent->in)); mlx5_cmd_comp_handler(dev, 1ULL << ent->idx, true); out: @@ -974,10 +955,10 @@ static void cmd_work_handler(struct work_struct *work) cb_timeout = msecs_to_jiffies(mlx5_tout_ms(dev, CMD)); complete(&ent->handling); - sem = ent->page_queue ? &cmd->vars.pages_sem : &cmd->vars.sem; + sem = ent->page_queue ? &cmd->pages_sem : &cmd->sem; down(sem); if (!ent->page_queue) { - alloc_ret = cmd_alloc_index(cmd, ent); + alloc_ret = cmd_alloc_index(cmd); if (alloc_ret < 0) { mlx5_core_err_rl(dev, "failed to allocate command entry\n"); if (ent->callback) { @@ -992,18 +973,20 @@ static void cmd_work_handler(struct work_struct *work) up(sem); return; } + ent->idx = alloc_ret; } else { - ent->idx = cmd->vars.max_reg_cmds; + ent->idx = cmd->max_reg_cmds; spin_lock_irqsave(&cmd->alloc_lock, flags); - clear_bit(ent->idx, &cmd->vars.bitmask); - cmd->ent_arr[ent->idx] = ent; + clear_bit(ent->idx, &cmd->bitmask); spin_unlock_irqrestore(&cmd->alloc_lock, flags); } + cmd->ent_arr[ent->idx] = ent; lay = get_inst(cmd, ent->idx); ent->lay = lay; memset(lay, 0, sizeof(*lay)); memcpy(lay->in, ent->in->first.data, sizeof(lay->in)); + ent->op = be32_to_cpu(lay->in[0]) >> 16; if (ent->in->next) lay->in_ptr = cpu_to_be64(ent->in->next->dma); lay->inlen = cpu_to_be32(ent->in->len); @@ -1116,12 +1099,12 @@ static void wait_func_handle_exec_timeout(struct mlx5_core_dev *dev, */ if (wait_for_completion_timeout(&ent->done, timeout)) { mlx5_core_warn(dev, "cmd[%d]: %s(0x%x) recovered after timeout\n", ent->idx, - mlx5_command_str(ent->op), ent->op); + mlx5_command_str(msg_to_opcode(ent->in)), msg_to_opcode(ent->in)); return; } mlx5_core_warn(dev, "cmd[%d]: %s(0x%x) No done completion\n", ent->idx, - mlx5_command_str(ent->op), ent->op); + mlx5_command_str(msg_to_opcode(ent->in)), msg_to_opcode(ent->in)); ent->ret = -ETIMEDOUT; mlx5_cmd_comp_handler(dev, 1ULL << ent->idx, true); @@ -1148,10 +1131,12 @@ out_err: if (err == -ETIMEDOUT) { mlx5_core_warn(dev, "%s(0x%x) timeout. Will cause a leak of a command resource\n", - mlx5_command_str(ent->op), ent->op); + mlx5_command_str(msg_to_opcode(ent->in)), + msg_to_opcode(ent->in)); } else if (err == -ECANCELED) { mlx5_core_warn(dev, "%s(0x%x) canceled on out of queue timeout.\n", - mlx5_command_str(ent->op), ent->op); + mlx5_command_str(msg_to_opcode(ent->in)), + msg_to_opcode(ent->in)); } mlx5_core_dbg(dev, "err %d, delivery status %s(%d)\n", err, deliv_status_to_str(ent->status), ent->status); @@ -1185,6 +1170,7 @@ static int mlx5_cmd_invoke(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *in, u8 status = 0; int err = 0; s64 ds; + u16 op; if (callback && page_queue) return -EINVAL; @@ -1224,8 +1210,9 @@ static int mlx5_cmd_invoke(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *in, goto out_free; ds = ent->ts2 - ent->ts1; - if (ent->op < MLX5_CMD_OP_MAX) { - stats = &cmd->stats[ent->op]; + op = MLX5_GET(mbox_in, in->first.data, opcode); + if (op < MLX5_CMD_OP_MAX) { + stats = &cmd->stats[op]; spin_lock_irq(&stats->lock); stats->sum += ds; ++stats->n; @@ -1233,7 +1220,7 @@ static int mlx5_cmd_invoke(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *in, } mlx5_core_dbg_mask(dev, 1 << MLX5_CMD_TIME, "fw exec time for %s is %lld nsec\n", - mlx5_command_str(ent->op), ds); + mlx5_command_str(op), ds); out_free: status = ent->status; @@ -1571,15 +1558,15 @@ void mlx5_cmd_allowed_opcode(struct mlx5_core_dev *dev, u16 opcode) struct mlx5_cmd *cmd = &dev->cmd; int i; - for (i = 0; i < cmd->vars.max_reg_cmds; i++) - down(&cmd->vars.sem); - down(&cmd->vars.pages_sem); + for (i = 0; i < cmd->max_reg_cmds; i++) + down(&cmd->sem); + down(&cmd->pages_sem); cmd->allowed_opcode = opcode; - up(&cmd->vars.pages_sem); - for (i = 0; i < cmd->vars.max_reg_cmds; i++) - up(&cmd->vars.sem); + up(&cmd->pages_sem); + for (i = 0; i < cmd->max_reg_cmds; i++) + up(&cmd->sem); } static void mlx5_cmd_change_mod(struct mlx5_core_dev *dev, int mode) @@ -1587,15 +1574,15 @@ static void mlx5_cmd_change_mod(struct mlx5_core_dev *dev, int mode) struct mlx5_cmd *cmd = &dev->cmd; int i; - for (i = 0; i < cmd->vars.max_reg_cmds; i++) - down(&cmd->vars.sem); - down(&cmd->vars.pages_sem); + for (i = 0; i < cmd->max_reg_cmds; i++) + down(&cmd->sem); + down(&cmd->pages_sem); cmd->mode = mode; - up(&cmd->vars.pages_sem); - for (i = 0; i < cmd->vars.max_reg_cmds; i++) - up(&cmd->vars.sem); + up(&cmd->pages_sem); + for (i = 0; i < cmd->max_reg_cmds; i++) + up(&cmd->sem); } static int cmd_comp_notifier(struct notifier_block *nb, @@ -1654,7 +1641,7 @@ static void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, u64 vec, bool force /* there can be at most 32 command queues */ vector = vec & 0xffffffff; - for (i = 0; i < (1 << cmd->vars.log_sz); i++) { + for (i = 0; i < (1 << cmd->log_sz); i++) { if (test_bit(i, &vector)) { ent = cmd->ent_arr[i]; @@ -1743,7 +1730,7 @@ static void mlx5_cmd_trigger_completions(struct mlx5_core_dev *dev) /* wait for pending handlers to complete */ mlx5_eq_synchronize_cmd_irq(dev); spin_lock_irqsave(&dev->cmd.alloc_lock, flags); - vector = ~dev->cmd.vars.bitmask & ((1ul << (1 << dev->cmd.vars.log_sz)) - 1); + vector = ~dev->cmd.bitmask & ((1ul << (1 << dev->cmd.log_sz)) - 1); if (!vector) goto no_trig; @@ -1752,14 +1739,14 @@ static void mlx5_cmd_trigger_completions(struct mlx5_core_dev *dev) * to guarantee pending commands will not get freed in the meanwhile. * For that reason, it also has to be done inside the alloc_lock. */ - for_each_set_bit(i, &bitmask, (1 << cmd->vars.log_sz)) + for_each_set_bit(i, &bitmask, (1 << cmd->log_sz)) cmd_ent_get(cmd->ent_arr[i]); vector |= MLX5_TRIGGERED_CMD_COMP; spin_unlock_irqrestore(&dev->cmd.alloc_lock, flags); mlx5_core_dbg(dev, "vector 0x%llx\n", vector); mlx5_cmd_comp_handler(dev, vector, true); - for_each_set_bit(i, &bitmask, (1 << cmd->vars.log_sz)) + for_each_set_bit(i, &bitmask, (1 << cmd->log_sz)) cmd_ent_put(cmd->ent_arr[i]); return; @@ -1772,22 +1759,22 @@ void mlx5_cmd_flush(struct mlx5_core_dev *dev) struct mlx5_cmd *cmd = &dev->cmd; int i; - for (i = 0; i < cmd->vars.max_reg_cmds; i++) { - while (down_trylock(&cmd->vars.sem)) { + for (i = 0; i < cmd->max_reg_cmds; i++) { + while (down_trylock(&cmd->sem)) { mlx5_cmd_trigger_completions(dev); cond_resched(); } } - while (down_trylock(&cmd->vars.pages_sem)) { + while (down_trylock(&cmd->pages_sem)) { mlx5_cmd_trigger_completions(dev); cond_resched(); } /* Unlock cmdif */ - up(&cmd->vars.pages_sem); - for (i = 0; i < cmd->vars.max_reg_cmds; i++) - up(&cmd->vars.sem); + up(&cmd->pages_sem); + for (i = 0; i < cmd->max_reg_cmds; i++) + up(&cmd->sem); } static struct mlx5_cmd_msg *alloc_msg(struct mlx5_core_dev *dev, int in_size, @@ -1830,7 +1817,7 @@ cache_miss: static int is_manage_pages(void *in) { - return in_to_opcode(in) == MLX5_CMD_OP_MANAGE_PAGES; + return MLX5_GET(mbox_in, in, opcode) == MLX5_CMD_OP_MANAGE_PAGES; } /* Notes: @@ -1841,9 +1828,8 @@ static int cmd_exec(struct mlx5_core_dev *dev, void *in, int in_size, void *out, int out_size, mlx5_cmd_cbk_t callback, void *context, bool force_polling) { + u16 opcode = MLX5_GET(mbox_in, in, opcode); struct mlx5_cmd_msg *inb, *outb; - u16 opcode = in_to_opcode(in); - bool throttle_op; int pages_queue; gfp_t gfp; u8 token; @@ -1852,21 +1838,13 @@ static int cmd_exec(struct mlx5_core_dev *dev, void *in, int in_size, void *out, if (mlx5_cmd_is_down(dev) || !opcode_allowed(&dev->cmd, opcode)) return -ENXIO; - throttle_op = mlx5_cmd_is_throttle_opcode(opcode); - if (throttle_op) { - /* atomic context may not sleep */ - if (callback) - return -EINVAL; - down(&dev->cmd.vars.throttle_sem); - } - pages_queue = is_manage_pages(in); gfp = callback ? GFP_ATOMIC : GFP_KERNEL; inb = alloc_msg(dev, in_size, gfp); if (IS_ERR(inb)) { err = PTR_ERR(inb); - goto out_up; + return err; } token = alloc_token(&dev->cmd); @@ -1900,9 +1878,6 @@ out_out: mlx5_free_cmd_msg(dev, outb); out_in: free_msg(dev, inb); -out_up: - if (throttle_op) - up(&dev->cmd.vars.throttle_sem); return err; } @@ -1977,8 +1952,8 @@ static int cmd_status_err(struct mlx5_core_dev *dev, int err, u16 opcode, u16 op int mlx5_cmd_do(struct mlx5_core_dev *dev, void *in, int in_size, void *out, int out_size) { int err = cmd_exec(dev, in, in_size, out, out_size, NULL, NULL, false); + u16 opcode = MLX5_GET(mbox_in, in, opcode); u16 op_mod = MLX5_GET(mbox_in, in, op_mod); - u16 opcode = in_to_opcode(in); return cmd_status_err(dev, err, opcode, op_mod, out); } @@ -2023,8 +1998,8 @@ int mlx5_cmd_exec_polling(struct mlx5_core_dev *dev, void *in, int in_size, void *out, int out_size) { int err = cmd_exec(dev, in, in_size, out, out_size, NULL, NULL, true); + u16 opcode = MLX5_GET(mbox_in, in, opcode); u16 op_mod = MLX5_GET(mbox_in, in, op_mod); - u16 opcode = in_to_opcode(in); err = cmd_status_err(dev, err, opcode, op_mod, out); return mlx5_cmd_check(dev, err, in, out); @@ -2076,7 +2051,7 @@ int mlx5_cmd_exec_cb(struct mlx5_async_ctx *ctx, void *in, int in_size, work->ctx = ctx; work->user_callback = callback; - work->opcode = in_to_opcode(in); + work->opcode = MLX5_GET(mbox_in, in, opcode); work->op_mod = MLX5_GET(mbox_in, in, op_mod); work->out = out; if (WARN_ON(!atomic_inc_not_zero(&ctx->num_inflight))) @@ -2212,16 +2187,16 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev) goto err_free_pool; cmd_l = ioread32be(&dev->iseg->cmdq_addr_l_sz) & 0xff; - cmd->vars.log_sz = cmd_l >> 4 & 0xf; - cmd->vars.log_stride = cmd_l & 0xf; - if (1 << cmd->vars.log_sz > MLX5_MAX_COMMANDS) { + cmd->log_sz = cmd_l >> 4 & 0xf; + cmd->log_stride = cmd_l & 0xf; + if (1 << cmd->log_sz > MLX5_MAX_COMMANDS) { mlx5_core_err(dev, "firmware reports too many outstanding commands %d\n", - 1 << cmd->vars.log_sz); + 1 << cmd->log_sz); err = -EINVAL; goto err_free_page; } - if (cmd->vars.log_sz + cmd->vars.log_stride > MLX5_ADAPTER_PAGE_SHIFT) { + if (cmd->log_sz + cmd->log_stride > MLX5_ADAPTER_PAGE_SHIFT) { mlx5_core_err(dev, "command queue size overflow\n"); err = -EINVAL; goto err_free_page; @@ -2229,13 +2204,13 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev) cmd->state = MLX5_CMDIF_STATE_DOWN; cmd->checksum_disabled = 1; - cmd->vars.max_reg_cmds = (1 << cmd->vars.log_sz) - 1; - cmd->vars.bitmask = (1UL << cmd->vars.max_reg_cmds) - 1; + cmd->max_reg_cmds = (1 << cmd->log_sz) - 1; + cmd->bitmask = (1UL << cmd->max_reg_cmds) - 1; - cmd->vars.cmdif_rev = ioread32be(&dev->iseg->cmdif_rev_fw_sub) >> 16; - if (cmd->vars.cmdif_rev > CMD_IF_REV) { + cmd->cmdif_rev = ioread32be(&dev->iseg->cmdif_rev_fw_sub) >> 16; + if (cmd->cmdif_rev > CMD_IF_REV) { mlx5_core_err(dev, "driver does not support command interface version. driver %d, firmware %d\n", - CMD_IF_REV, cmd->vars.cmdif_rev); + CMD_IF_REV, cmd->cmdif_rev); err = -EOPNOTSUPP; goto err_free_page; } @@ -2245,9 +2220,8 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev) for (i = 0; i < MLX5_CMD_OP_MAX; i++) spin_lock_init(&cmd->stats[i].lock); - sema_init(&cmd->vars.sem, cmd->vars.max_reg_cmds); - sema_init(&cmd->vars.pages_sem, 1); - sema_init(&cmd->vars.throttle_sem, DIV_ROUND_UP(cmd->vars.max_reg_cmds, 2)); + sema_init(&cmd->sem, cmd->max_reg_cmds); + sema_init(&cmd->pages_sem, 1); cmd_h = (u32)((u64)(cmd->dma) >> 32); cmd_l = (u32)(cmd->dma); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c b/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c index e0b0729e238c..bb95b40d25eb 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c @@ -176,8 +176,8 @@ static ssize_t slots_read(struct file *filp, char __user *buf, size_t count, int ret; cmd = filp->private_data; - weight = bitmap_weight(&cmd->vars.bitmask, cmd->vars.max_reg_cmds); - field = cmd->vars.max_reg_cmds - weight; + weight = bitmap_weight(&cmd->bitmask, cmd->max_reg_cmds); + field = cmd->max_reg_cmds - weight; ret = snprintf(tbuf, sizeof(tbuf), "%d\n", field); return simple_read_from_buffer(buf, count, pos, tbuf, ret); } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c b/drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c index 3ba54ffa54bf..374c0011a127 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c @@ -691,7 +691,7 @@ static void mlx5_fw_tracer_handle_traces(struct work_struct *work) while (block_timestamp > tracer->last_timestamp) { /* Check block override if it's not the first block */ - if (tracer->last_timestamp) { + if (!tracer->last_timestamp) { u64 *ts_event; /* To avoid block override be the HW in case of buffer * wraparound, the time stamp of the previous block diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h index 0ee456480a48..bc76fe6b0623 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h @@ -847,7 +847,6 @@ enum { MLX5E_STATE_DESTROYING, MLX5E_STATE_XDP_TX_ENABLED, MLX5E_STATE_XDP_ACTIVE, - MLX5E_STATE_CHANNELS_ACTIVE, }; struct mlx5e_modify_sq_param { diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/fs_tt_redirect.c b/drivers/net/ethernet/mellanox/mlx5/core/en/fs_tt_redirect.c index e1283531e0b8..be83ad9db82a 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/fs_tt_redirect.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/fs_tt_redirect.c @@ -154,7 +154,6 @@ static int fs_udp_create_groups(struct mlx5e_flow_table *ft, enum fs_udp_type ty in = kvzalloc(inlen, GFP_KERNEL); if (!in || !ft->g) { kfree(ft->g); - ft->g = NULL; kvfree(in); return -ENOMEM; } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c index 83bb0811e774..4db0483c066a 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c @@ -300,9 +300,6 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv, if (err) goto destroy_neigh_entry; - e->encap_size = ipv4_encap_size; - e->encap_header = encap_header; - if (!(nud_state & NUD_VALID)) { neigh_event_send(attr.n, NULL); /* the encap entry will be made valid on neigh update event @@ -322,6 +319,8 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv, goto destroy_neigh_entry; } + e->encap_size = ipv4_encap_size; + e->encap_header = encap_header; e->flags |= MLX5_ENCAP_ENTRY_VALID; mlx5e_rep_queue_neigh_stats_work(netdev_priv(attr.out_dev)); mlx5e_route_lookup_ipv4_put(&attr); @@ -404,16 +403,12 @@ int mlx5e_tc_tun_update_header_ipv4(struct mlx5e_priv *priv, if (err) goto free_encap; - e->encap_size = ipv4_encap_size; - kfree(e->encap_header); - e->encap_header = encap_header; - if (!(nud_state & NUD_VALID)) { neigh_event_send(attr.n, NULL); /* the encap entry will be made valid on neigh update event * and not used before that. */ - goto release_neigh; + goto free_encap; } memset(&reformat_params, 0, sizeof(reformat_params)); @@ -427,6 +422,10 @@ int mlx5e_tc_tun_update_header_ipv4(struct mlx5e_priv *priv, goto free_encap; } + e->encap_size = ipv4_encap_size; + kfree(e->encap_header); + e->encap_header = encap_header; + e->flags |= MLX5_ENCAP_ENTRY_VALID; mlx5e_rep_queue_neigh_stats_work(netdev_priv(attr.out_dev)); mlx5e_route_lookup_ipv4_put(&attr); @@ -568,9 +567,6 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv, if (err) goto destroy_neigh_entry; - e->encap_size = ipv6_encap_size; - e->encap_header = encap_header; - if (!(nud_state & NUD_VALID)) { neigh_event_send(attr.n, NULL); /* the encap entry will be made valid on neigh update event @@ -590,6 +586,8 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv, goto destroy_neigh_entry; } + e->encap_size = ipv6_encap_size; + e->encap_header = encap_header; e->flags |= MLX5_ENCAP_ENTRY_VALID; mlx5e_rep_queue_neigh_stats_work(netdev_priv(attr.out_dev)); mlx5e_route_lookup_ipv6_put(&attr); @@ -671,16 +669,12 @@ int mlx5e_tc_tun_update_header_ipv6(struct mlx5e_priv *priv, if (err) goto free_encap; - e->encap_size = ipv6_encap_size; - kfree(e->encap_header); - e->encap_header = encap_header; - if (!(nud_state & NUD_VALID)) { neigh_event_send(attr.n, NULL); /* the encap entry will be made valid on neigh update event * and not used before that. */ - goto release_neigh; + goto free_encap; } memset(&reformat_params, 0, sizeof(reformat_params)); @@ -694,6 +688,10 @@ int mlx5e_tc_tun_update_header_ipv6(struct mlx5e_priv *priv, goto free_encap; } + e->encap_size = ipv6_encap_size; + kfree(e->encap_header); + e->encap_header = encap_header; + e->flags |= MLX5_ENCAP_ENTRY_VALID; mlx5e_rep_queue_neigh_stats_work(netdev_priv(attr.out_dev)); mlx5e_route_lookup_ipv6_put(&attr); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c index ceeb23f478e1..eeba91d9c521 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c @@ -49,7 +49,7 @@ void mlx5e_ethtool_get_drvinfo(struct mlx5e_priv *priv, count = snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), "%d.%d.%04d (%.16s)", fw_rev_maj(mdev), fw_rev_min(mdev), fw_rev_sub(mdev), mdev->board_id); - if (count >= sizeof(drvinfo->fw_version)) + if (count == sizeof(drvinfo->fw_version)) snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), "%d.%d.%04d", fw_rev_maj(mdev), fw_rev_min(mdev), fw_rev_sub(mdev)); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index 9910a0480f58..42e6f2fcf5f5 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -2586,7 +2586,6 @@ void mlx5e_close_channels(struct mlx5e_channels *chs) { int i; - ASSERT_RTNL(); if (chs->ptp) { mlx5e_ptp_close(chs->ptp); chs->ptp = NULL; @@ -2866,29 +2865,17 @@ void mlx5e_activate_priv_channels(struct mlx5e_priv *priv) if (mlx5e_is_vport_rep(priv)) mlx5e_rep_activate_channels(priv); - set_bit(MLX5E_STATE_CHANNELS_ACTIVE, &priv->state); - mlx5e_wait_channels_min_rx_wqes(&priv->channels); if (priv->rx_res) mlx5e_rx_res_channels_activate(priv->rx_res, &priv->channels); } -static void mlx5e_cancel_tx_timeout_work(struct mlx5e_priv *priv) -{ - WARN_ON_ONCE(test_bit(MLX5E_STATE_CHANNELS_ACTIVE, &priv->state)); - if (current_work() != &priv->tx_timeout_work) - cancel_work_sync(&priv->tx_timeout_work); -} - void mlx5e_deactivate_priv_channels(struct mlx5e_priv *priv) { if (priv->rx_res) mlx5e_rx_res_channels_deactivate(priv->rx_res); - clear_bit(MLX5E_STATE_CHANNELS_ACTIVE, &priv->state); - mlx5e_cancel_tx_timeout_work(priv); - if (mlx5e_is_vport_rep(priv)) mlx5e_rep_deactivate_channels(priv); @@ -4630,17 +4617,8 @@ static void mlx5e_tx_timeout_work(struct work_struct *work) struct net_device *netdev = priv->netdev; int i; - /* Take rtnl_lock to ensure no change in netdev->real_num_tx_queues - * through this flow. However, channel closing flows have to wait for - * this work to finish while holding rtnl lock too. So either get the - * lock or find that channels are being closed for other reason and - * this work is not relevant anymore. - */ - while (!rtnl_trylock()) { - if (!test_bit(MLX5E_STATE_CHANNELS_ACTIVE, &priv->state)) - return; - msleep(20); - } + rtnl_lock(); + mutex_lock(&priv->state_lock); if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) goto unlock; @@ -4659,6 +4637,7 @@ static void mlx5e_tx_timeout_work(struct work_struct *work) } unlock: + mutex_unlock(&priv->state_lock); rtnl_unlock(); } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c index 5aeca9534f15..2653cb96c310 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c @@ -76,7 +76,7 @@ static void mlx5e_rep_get_drvinfo(struct net_device *dev, count = snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), "%d.%d.%04d (%.16s)", fw_rev_maj(mdev), fw_rev_min(mdev), fw_rev_sub(mdev), mdev->board_id); - if (count >= sizeof(drvinfo->fw_version)) + if (count == sizeof(drvinfo->fw_version)) snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), "%d.%d.%04d", fw_rev_maj(mdev), fw_rev_min(mdev), fw_rev_sub(mdev)); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/pci_irq.c b/drivers/net/ethernet/mellanox/mlx5/core/pci_irq.c index a6d3fc96e168..d136360ac6a9 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/pci_irq.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/pci_irq.c @@ -25,7 +25,7 @@ struct mlx5_irq { struct atomic_notifier_head nh; cpumask_var_t mask; - char name[MLX5_MAX_IRQ_FORMATTED_NAME]; + char name[MLX5_MAX_IRQ_NAME]; struct mlx5_irq_pool *pool; int refcount; u32 index; @@ -236,8 +236,8 @@ struct mlx5_irq *mlx5_irq_alloc(struct mlx5_irq_pool *pool, int i, else irq_sf_set_name(pool, name, i); ATOMIC_INIT_NOTIFIER_HEAD(&irq->nh); - snprintf(irq->name, MLX5_MAX_IRQ_FORMATTED_NAME, - MLX5_IRQ_NAME_FORMAT_STR, name, pci_name(dev->pdev)); + snprintf(irq->name, MLX5_MAX_IRQ_NAME, + "%s@pci:%s", name, pci_name(dev->pdev)); err = request_irq(irq->irqn, irq_int_handler, 0, irq->name, &irq->nh); if (err) { diff --git a/drivers/net/ethernet/mellanox/mlx5/core/pci_irq.h b/drivers/net/ethernet/mellanox/mlx5/core/pci_irq.h index 4047179307c4..5c7e68bee43a 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/pci_irq.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/pci_irq.h @@ -7,9 +7,6 @@ #include #define MLX5_MAX_IRQ_NAME (32) -#define MLX5_IRQ_NAME_FORMAT_STR ("%s@pci:%s") -#define MLX5_MAX_IRQ_FORMATTED_NAME \ - (MLX5_MAX_IRQ_NAME + sizeof(MLX5_IRQ_NAME_FORMAT_STR)) /* max irq_index is 2047, so four chars */ #define MLX5_MAX_IRQ_IDX_CHARS (4) #define MLX5_EQ_REFS_PER_IRQ (2) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/vport.c b/drivers/net/ethernet/mellanox/mlx5/core/vport.c index 3f68e3198aa6..d5c317325030 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/vport.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/vport.c @@ -277,7 +277,7 @@ int mlx5_query_nic_vport_mac_list(struct mlx5_core_dev *dev, req_list_size = max_list_size; } - out_sz = MLX5_ST_SZ_BYTES(query_nic_vport_context_out) + + out_sz = MLX5_ST_SZ_BYTES(query_nic_vport_context_in) + req_list_size * MLX5_ST_SZ_BYTES(mac_address_layout); out = kvzalloc(out_sz, GFP_KERNEL); diff --git a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c index 83c4659390fd..2292d63a279c 100644 --- a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c +++ b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c @@ -130,15 +130,9 @@ static int mlxbf_gige_open(struct net_device *netdev) { struct mlxbf_gige *priv = netdev_priv(netdev); struct phy_device *phydev = netdev->phydev; - u64 control; u64 int_en; int err; - /* Perform general init of GigE block */ - control = readq(priv->base + MLXBF_GIGE_CONTROL); - control |= MLXBF_GIGE_CONTROL_PORT_EN; - writeq(control, priv->base + MLXBF_GIGE_CONTROL); - err = mlxbf_gige_request_irqs(priv); if (err) return err; @@ -153,14 +147,14 @@ static int mlxbf_gige_open(struct net_device *netdev) */ priv->valid_polarity = 0; - phy_start(phydev); - - err = mlxbf_gige_tx_init(priv); - if (err) - goto free_irqs; err = mlxbf_gige_rx_init(priv); if (err) - goto tx_deinit; + goto free_irqs; + err = mlxbf_gige_tx_init(priv); + if (err) + goto rx_deinit; + + phy_start(phydev); netif_napi_add(netdev, &priv->napi, mlxbf_gige_poll); napi_enable(&priv->napi); @@ -182,8 +176,8 @@ static int mlxbf_gige_open(struct net_device *netdev) return 0; -tx_deinit: - mlxbf_gige_tx_deinit(priv); +rx_deinit: + mlxbf_gige_rx_deinit(priv); free_irqs: mlxbf_gige_free_irqs(priv); @@ -285,6 +279,7 @@ static int mlxbf_gige_probe(struct platform_device *pdev) void __iomem *plu_base; void __iomem *base; int addr, phy_irq; + u64 control; int err; base = devm_platform_ioremap_resource(pdev, MLXBF_GIGE_RES_MAC); @@ -299,6 +294,11 @@ static int mlxbf_gige_probe(struct platform_device *pdev) if (IS_ERR(plu_base)) return PTR_ERR(plu_base); + /* Perform general init of GigE block */ + control = readq(base + MLXBF_GIGE_CONTROL); + control |= MLXBF_GIGE_CONTROL_PORT_EN; + writeq(control, base + MLXBF_GIGE_CONTROL); + netdev = devm_alloc_etherdev(&pdev->dev, sizeof(*priv)); if (!netdev) return -ENOMEM; diff --git a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c index 699984358493..0d5a41a2ae01 100644 --- a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c +++ b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c @@ -142,9 +142,6 @@ int mlxbf_gige_rx_init(struct mlxbf_gige *priv) writeq(MLXBF_GIGE_RX_MAC_FILTER_COUNT_PASS_EN, priv->base + MLXBF_GIGE_RX_MAC_FILTER_COUNT_PASS); - writeq(ilog2(priv->rx_q_entries), - priv->base + MLXBF_GIGE_RX_WQE_SIZE_LOG2); - /* Clear MLXBF_GIGE_INT_MASK 'receive pkt' bit to * indicate readiness to receive interrupts */ @@ -157,6 +154,9 @@ int mlxbf_gige_rx_init(struct mlxbf_gige *priv) data |= MLXBF_GIGE_RX_DMA_EN; writeq(data, priv->base + MLXBF_GIGE_RX_DMA); + writeq(ilog2(priv->rx_q_entries), + priv->base + MLXBF_GIGE_RX_WQE_SIZE_LOG2); + return 0; free_wqe_and_skb: @@ -267,13 +267,6 @@ static bool mlxbf_gige_rx_packet(struct mlxbf_gige *priv, int *rx_pkts) priv->stats.rx_truncate_errors++; } - /* Read receive consumer index before replenish so that this routine - * returns accurate return value even if packet is received into - * just-replenished buffer prior to exiting this routine. - */ - rx_ci = readq(priv->base + MLXBF_GIGE_RX_CQE_PACKET_CI); - rx_ci_rem = rx_ci % priv->rx_q_entries; - /* Let hardware know we've replenished one buffer */ rx_pi++; @@ -286,6 +279,8 @@ static bool mlxbf_gige_rx_packet(struct mlxbf_gige *priv, int *rx_pkts) rx_pi_rem = rx_pi % priv->rx_q_entries; if (rx_pi_rem == 0) priv->valid_polarity ^= 1; + rx_ci = readq(priv->base + MLXBF_GIGE_RX_CQE_PACKET_CI); + rx_ci_rem = rx_ci % priv->rx_q_entries; if (skb) netif_receive_skb(skb); diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c index d231f4d2888b..4c98950380d5 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c @@ -301,7 +301,6 @@ mlxsw_sp_acl_erp_table_alloc(struct mlxsw_sp_acl_erp_core *erp_core, unsigned long *p_index) { unsigned int num_rows, entry_size; - unsigned long index; /* We only allow allocations of entire rows */ if (num_erps % erp_core->num_erp_banks != 0) @@ -310,11 +309,10 @@ mlxsw_sp_acl_erp_table_alloc(struct mlxsw_sp_acl_erp_core *erp_core, entry_size = erp_core->erpt_entries_size[region_type]; num_rows = num_erps / erp_core->num_erp_banks; - index = gen_pool_alloc(erp_core->erp_tables, num_rows * entry_size); - if (!index) + *p_index = gen_pool_alloc(erp_core->erp_tables, num_rows * entry_size); + if (*p_index == 0) return -ENOBUFS; - - *p_index = index - MLXSW_SP_ACL_ERP_GENALLOC_OFFSET; + *p_index -= MLXSW_SP_ACL_ERP_GENALLOC_OFFSET; return 0; } diff --git a/drivers/net/ethernet/micrel/ks8851.h b/drivers/net/ethernet/micrel/ks8851.h index e5ec0a363aff..fecd43754cea 100644 --- a/drivers/net/ethernet/micrel/ks8851.h +++ b/drivers/net/ethernet/micrel/ks8851.h @@ -350,8 +350,6 @@ union ks8851_tx_hdr { * @rxd: Space for receiving SPI data, in DMA-able space. * @txd: Space for transmitting SPI data, in DMA-able space. * @msg_enable: The message flags controlling driver output (see ethtool). - * @tx_space: Free space in the hardware TX buffer (cached copy of KS_TXMIR). - * @queued_len: Space required in hardware TX buffer for queued packets in txq. * @fid: Incrementing frame id tag. * @rc_ier: Cached copy of KS_IER. * @rc_ccr: Cached copy of KS_CCR. @@ -401,7 +399,6 @@ struct ks8851_net { struct work_struct rxctrl_work; struct sk_buff_head txq; - unsigned int queued_len; struct eeprom_93cx6 eeprom; struct regulator *vdd_reg; diff --git a/drivers/net/ethernet/micrel/ks8851_common.c b/drivers/net/ethernet/micrel/ks8851_common.c index 0bf13b38b8f5..cfbc900d4aeb 100644 --- a/drivers/net/ethernet/micrel/ks8851_common.c +++ b/drivers/net/ethernet/micrel/ks8851_common.c @@ -362,18 +362,16 @@ static irqreturn_t ks8851_irq(int irq, void *_ks) handled |= IRQ_RXPSI; if (status & IRQ_TXI) { - unsigned short tx_space = ks8851_rdreg16(ks, KS_TXMIR); + handled |= IRQ_TXI; + + /* no lock here, tx queue should have been stopped */ + + /* update our idea of how much tx space is available to the + * system */ + ks->tx_space = ks8851_rdreg16(ks, KS_TXMIR); netif_dbg(ks, intr, ks->netdev, - "%s: txspace %d\n", __func__, tx_space); - - spin_lock(&ks->statelock); - ks->tx_space = tx_space; - if (netif_queue_stopped(ks->netdev)) - netif_wake_queue(ks->netdev); - spin_unlock(&ks->statelock); - - handled |= IRQ_TXI; + "%s: txspace %d\n", __func__, ks->tx_space); } if (status & IRQ_RXI) @@ -416,6 +414,9 @@ static irqreturn_t ks8851_irq(int irq, void *_ks) if (status & IRQ_LCI) mii_check_link(&ks->mii); + if (status & IRQ_TXI) + netif_wake_queue(ks->netdev); + return IRQ_HANDLED; } @@ -499,7 +500,6 @@ static int ks8851_net_open(struct net_device *dev) ks8851_wrreg16(ks, KS_ISR, ks->rc_ier); ks8851_wrreg16(ks, KS_IER, ks->rc_ier); - ks->queued_len = 0; netif_start_queue(ks->netdev); netif_dbg(ks, ifup, ks->netdev, "network device up\n"); diff --git a/drivers/net/ethernet/micrel/ks8851_spi.c b/drivers/net/ethernet/micrel/ks8851_spi.c index 88e26c120b48..70bc7253454f 100644 --- a/drivers/net/ethernet/micrel/ks8851_spi.c +++ b/drivers/net/ethernet/micrel/ks8851_spi.c @@ -286,18 +286,6 @@ static void ks8851_wrfifo_spi(struct ks8851_net *ks, struct sk_buff *txp, netdev_err(ks->netdev, "%s: spi_sync() failed\n", __func__); } -/** - * calc_txlen - calculate size of message to send packet - * @len: Length of data - * - * Returns the size of the TXFIFO message needed to send - * this packet. - */ -static unsigned int calc_txlen(unsigned int len) -{ - return ALIGN(len + 4, 4); -} - /** * ks8851_rx_skb_spi - receive skbuff * @ks: The device state @@ -317,9 +305,7 @@ static void ks8851_rx_skb_spi(struct ks8851_net *ks, struct sk_buff *skb) */ static void ks8851_tx_work(struct work_struct *work) { - unsigned int dequeued_len = 0; struct ks8851_net_spi *kss; - unsigned short tx_space; struct ks8851_net *ks; unsigned long flags; struct sk_buff *txb; @@ -336,8 +322,6 @@ static void ks8851_tx_work(struct work_struct *work) last = skb_queue_empty(&ks->txq); if (txb) { - dequeued_len += calc_txlen(txb->len); - ks8851_wrreg16_spi(ks, KS_RXQCR, ks->rc_rxqcr | RXQCR_SDA); ks8851_wrfifo_spi(ks, txb, last); @@ -348,13 +332,6 @@ static void ks8851_tx_work(struct work_struct *work) } } - tx_space = ks8851_rdreg16_spi(ks, KS_TXMIR); - - spin_lock(&ks->statelock); - ks->queued_len -= dequeued_len; - ks->tx_space = tx_space; - spin_unlock(&ks->statelock); - ks8851_unlock_spi(ks, &flags); } @@ -369,6 +346,18 @@ static void ks8851_flush_tx_work_spi(struct ks8851_net *ks) flush_work(&kss->tx_work); } +/** + * calc_txlen - calculate size of message to send packet + * @len: Length of data + * + * Returns the size of the TXFIFO message needed to send + * this packet. + */ +static unsigned int calc_txlen(unsigned int len) +{ + return ALIGN(len + 4, 4); +} + /** * ks8851_start_xmit_spi - transmit packet using SPI * @skb: The buffer to transmit @@ -397,17 +386,16 @@ static netdev_tx_t ks8851_start_xmit_spi(struct sk_buff *skb, spin_lock(&ks->statelock); - if (ks->queued_len + needed > ks->tx_space) { + if (needed > ks->tx_space) { netif_stop_queue(dev); ret = NETDEV_TX_BUSY; } else { - ks->queued_len += needed; + ks->tx_space -= needed; skb_queue_tail(&ks->txq, skb); } spin_unlock(&ks->statelock); - if (ret == NETDEV_TX_OK) - schedule_work(&kss->tx_work); + schedule_work(&kss->tx_work); return ret; } diff --git a/drivers/net/ethernet/microsoft/Kconfig b/drivers/net/ethernet/microsoft/Kconfig index 8b6c4cc37c53..fe4e7a7d9c0b 100644 --- a/drivers/net/ethernet/microsoft/Kconfig +++ b/drivers/net/ethernet/microsoft/Kconfig @@ -19,7 +19,6 @@ config MICROSOFT_MANA tristate "Microsoft Azure Network Adapter (MANA) support" depends on PCI_MSI && X86_64 depends on PCI_HYPERV - select PAGE_POOL help This driver supports Microsoft Azure Network Adapter (MANA). So far, the driver is only supported on X86_64. diff --git a/drivers/net/ethernet/mscc/ocelot_stats.c b/drivers/net/ethernet/mscc/ocelot_stats.c index 6b95262dad90..0066219bb0e8 100644 --- a/drivers/net/ethernet/mscc/ocelot_stats.c +++ b/drivers/net/ethernet/mscc/ocelot_stats.c @@ -216,10 +216,10 @@ static void ocelot_port_rmon_stats_cb(struct ocelot *ocelot, int port, void *pri rmon_stats->hist_tx[0] = s[OCELOT_STAT_TX_64]; rmon_stats->hist_tx[1] = s[OCELOT_STAT_TX_65_127]; rmon_stats->hist_tx[2] = s[OCELOT_STAT_TX_128_255]; - rmon_stats->hist_tx[3] = s[OCELOT_STAT_TX_256_511]; - rmon_stats->hist_tx[4] = s[OCELOT_STAT_TX_512_1023]; - rmon_stats->hist_tx[5] = s[OCELOT_STAT_TX_1024_1526]; - rmon_stats->hist_tx[6] = s[OCELOT_STAT_TX_1527_MAX]; + rmon_stats->hist_tx[3] = s[OCELOT_STAT_TX_128_255]; + rmon_stats->hist_tx[4] = s[OCELOT_STAT_TX_256_511]; + rmon_stats->hist_tx[5] = s[OCELOT_STAT_TX_512_1023]; + rmon_stats->hist_tx[6] = s[OCELOT_STAT_TX_1024_1526]; } void ocelot_port_get_rmon_stats(struct ocelot *ocelot, int port, diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c index c005a9df59d1..de8d54b23f73 100644 --- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c +++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c @@ -1862,7 +1862,7 @@ netxen_tso_check(struct net_device *netdev, if (protocol == cpu_to_be16(ETH_P_8021Q)) { - vh = skb_vlan_eth_hdr(skb); + vh = (struct vlan_ethhdr *)skb->data; protocol = vh->h_vlan_encapsulated_proto; flags = FLAGS_VLAN_TAGGED; diff --git a/drivers/net/ethernet/qlogic/qed/qed_cxt.c b/drivers/net/ethernet/qlogic/qed/qed_cxt.c index 33f4f58ee51c..65e20693c549 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_cxt.c +++ b/drivers/net/ethernet/qlogic/qed/qed_cxt.c @@ -933,7 +933,6 @@ static void qed_ilt_shadow_free(struct qed_hwfn *p_hwfn) p_dma->virt_addr = NULL; } kfree(p_mngr->ilt_shadow); - p_mngr->ilt_shadow = NULL; } static int qed_ilt_blk_alloc(struct qed_hwfn *p_hwfn, diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c index fc78bc959ded..0d57ffcedf0c 100644 --- a/drivers/net/ethernet/qlogic/qla3xxx.c +++ b/drivers/net/ethernet/qlogic/qla3xxx.c @@ -2591,7 +2591,6 @@ static int ql_alloc_buffer_queues(struct ql3_adapter *qdev) if (qdev->lrg_buf_q_alloc_virt_addr == NULL) { netdev_err(qdev->ndev, "lBufQ failed\n"); - kfree(qdev->lrg_buf); return -ENOMEM; } qdev->lrg_buf_q_virt_addr = qdev->lrg_buf_q_alloc_virt_addr; @@ -2616,7 +2615,6 @@ static int ql_alloc_buffer_queues(struct ql3_adapter *qdev) qdev->lrg_buf_q_alloc_size, qdev->lrg_buf_q_alloc_virt_addr, qdev->lrg_buf_q_alloc_phy_addr); - kfree(qdev->lrg_buf); return -ENOMEM; } diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c index 41894d154013..92930a055cbc 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c @@ -318,7 +318,7 @@ static void qlcnic_send_filter(struct qlcnic_adapter *adapter, if (adapter->flags & QLCNIC_VLAN_FILTERING) { if (protocol == ETH_P_8021Q) { - vh = skb_vlan_eth_hdr(skb); + vh = (struct vlan_ethhdr *)skb->data; vlan_id = ntohs(vh->h_vlan_TCI); } else if (skb_vlan_tag_present(skb)) { vlan_id = skb_vlan_tag_get(skb); @@ -468,7 +468,7 @@ static int qlcnic_tx_pkt(struct qlcnic_adapter *adapter, u32 producer = tx_ring->producer; if (protocol == ETH_P_8021Q) { - vh = skb_vlan_eth_hdr(skb); + vh = (struct vlan_ethhdr *)skb->data; flags = QLCNIC_FLAGS_VLAN_TAGGED; vlan_tci = ntohs(vh->h_vlan_TCI); protocol = ntohs(vh->h_vlan_encapsulated_proto); diff --git a/drivers/net/ethernet/qualcomm/qca_debug.c b/drivers/net/ethernet/qualcomm/qca_debug.c index a739c06ede4e..f62c39544e08 100644 --- a/drivers/net/ethernet/qualcomm/qca_debug.c +++ b/drivers/net/ethernet/qualcomm/qca_debug.c @@ -30,8 +30,6 @@ #define QCASPI_MAX_REGS 0x20 -#define QCASPI_RX_MAX_FRAMES 4 - static const u16 qcaspi_spi_regs[] = { SPI_REG_BFR_SIZE, SPI_REG_WRBUF_SPC_AVA, @@ -254,9 +252,9 @@ qcaspi_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ring, { struct qcaspi *qca = netdev_priv(dev); - ring->rx_max_pending = QCASPI_RX_MAX_FRAMES; + ring->rx_max_pending = 4; ring->tx_max_pending = TX_RING_MAX_LEN; - ring->rx_pending = QCASPI_RX_MAX_FRAMES; + ring->rx_pending = 4; ring->tx_pending = qca->txr.count; } @@ -265,21 +263,22 @@ qcaspi_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ring, struct kernel_ethtool_ringparam *kernel_ring, struct netlink_ext_ack *extack) { + const struct net_device_ops *ops = dev->netdev_ops; struct qcaspi *qca = netdev_priv(dev); - if (ring->rx_pending != QCASPI_RX_MAX_FRAMES || + if ((ring->rx_pending) || (ring->rx_mini_pending) || (ring->rx_jumbo_pending)) return -EINVAL; - if (qca->spi_thread) - kthread_park(qca->spi_thread); + if (netif_running(dev)) + ops->ndo_stop(dev); qca->txr.count = max_t(u32, ring->tx_pending, TX_RING_MIN_LEN); qca->txr.count = min_t(u16, qca->txr.count, TX_RING_MAX_LEN); - if (qca->spi_thread) - kthread_unpark(qca->spi_thread); + if (netif_running(dev)) + ops->ndo_open(dev); return 0; } diff --git a/drivers/net/ethernet/qualcomm/qca_spi.c b/drivers/net/ethernet/qualcomm/qca_spi.c index 82f5173a2cfd..4a1b94e5a8ea 100644 --- a/drivers/net/ethernet/qualcomm/qca_spi.c +++ b/drivers/net/ethernet/qualcomm/qca_spi.c @@ -581,18 +581,6 @@ qcaspi_spi_thread(void *data) netdev_info(qca->net_dev, "SPI thread created\n"); while (!kthread_should_stop()) { set_current_state(TASK_INTERRUPTIBLE); - if (kthread_should_park()) { - netif_tx_disable(qca->net_dev); - netif_carrier_off(qca->net_dev); - qcaspi_flush_tx_ring(qca); - kthread_parkme(); - if (qca->sync == QCASPI_SYNC_READY) { - netif_carrier_on(qca->net_dev); - netif_wake_queue(qca->net_dev); - } - continue; - } - if ((qca->intr_req == qca->intr_svc) && !qca->txr.skb[qca->txr.head]) schedule(); @@ -621,17 +609,11 @@ qcaspi_spi_thread(void *data) if (intr_cause & SPI_INT_CPU_ON) { qcaspi_qca7k_sync(qca, QCASPI_EVENT_CPUON); - /* Frame decoding in progress */ - if (qca->frm_handle.state != qca->frm_handle.init) - qca->net_dev->stats.rx_dropped++; - - qcafrm_fsm_init_spi(&qca->frm_handle); - qca->stats.device_reset++; - /* not synced. */ if (qca->sync != QCASPI_SYNC_READY) continue; + qca->stats.device_reset++; netif_wake_queue(qca->net_dev); netif_carrier_on(qca->net_dev); } diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c index 64b209a0ad21..27b1663c476e 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c @@ -391,7 +391,7 @@ nla_put_failure: struct rtnl_link_ops rmnet_link_ops __read_mostly = { .kind = "rmnet", - .maxtype = IFLA_RMNET_MAX, + .maxtype = __IFLA_RMNET_MAX, .priv_size = sizeof(struct rmnet_priv), .setup = rmnet_vnd_setup, .validate = rmnet_rtnl_validate, diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c index 06663c11ca96..d22457f2cf9c 100644 --- a/drivers/net/ethernet/realtek/r8169_main.c +++ b/drivers/net/ethernet/realtek/r8169_main.c @@ -1145,7 +1145,7 @@ static void rtl8168ep_driver_start(struct rtl8169_private *tp) { r8168ep_ocp_write(tp, 0x01, 0x180, OOB_CMD_DRIVER_START); r8168ep_ocp_write(tp, 0x01, 0x30, r8168ep_ocp_read(tp, 0x30) | 0x01); - rtl_loop_wait_high(tp, &rtl_ep_ocp_read_cond, 10000, 30); + rtl_loop_wait_high(tp, &rtl_ep_ocp_read_cond, 10000, 10); } static void rtl8168_driver_start(struct rtl8169_private *tp) diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c index e7b70006261f..68cb5616ef99 100644 --- a/drivers/net/ethernet/renesas/ravb_main.c +++ b/drivers/net/ethernet/renesas/ravb_main.c @@ -68,27 +68,16 @@ int ravb_wait(struct net_device *ndev, enum ravb_reg reg, u32 mask, u32 value) return -ETIMEDOUT; } -static int ravb_set_opmode(struct net_device *ndev, u32 opmode) +static int ravb_config(struct net_device *ndev) { - u32 csr_ops = 1U << (opmode & CCC_OPC); - u32 ccc_mask = CCC_OPC; int error; - /* If gPTP active in config mode is supported it needs to be configured - * along with CSEL and operating mode in the same access. This is a - * hardware limitation. - */ - if (opmode & CCC_GAC) - ccc_mask |= CCC_GAC | CCC_CSEL; - - /* Set operating mode */ - ravb_modify(ndev, CCC, ccc_mask, opmode); - /* Check if the operating mode is changed to the requested one */ - error = ravb_wait(ndev, CSR, CSR_OPS, csr_ops); - if (error) { - netdev_err(ndev, "failed to switch device to requested mode (%u)\n", - opmode & CCC_OPC); - } + /* Set config mode */ + ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_CONFIG); + /* Check if the operating mode is changed to the config mode */ + error = ravb_wait(ndev, CSR, CSR_OPS, CSR_OPS_CONFIG); + if (error) + netdev_err(ndev, "failed to switch device to config mode\n"); return error; } @@ -686,7 +675,7 @@ static int ravb_dmac_init(struct net_device *ndev) int error; /* Set CONFIG mode */ - error = ravb_set_opmode(ndev, CCC_OPC_CONFIG); + error = ravb_config(ndev); if (error) return error; @@ -695,7 +684,9 @@ static int ravb_dmac_init(struct net_device *ndev) return error; /* Setting the control will start the AVB-DMAC process. */ - return ravb_set_opmode(ndev, CCC_OPC_OPERATION); + ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_OPERATION); + + return 0; } static void ravb_get_tx_tstamp(struct net_device *ndev) @@ -1057,7 +1048,7 @@ static int ravb_stop_dma(struct net_device *ndev) return error; /* Stop AVB-DMAC process */ - return ravb_set_opmode(ndev, CCC_OPC_CONFIG); + return ravb_config(ndev); } /* E-MAC interrupt handler */ @@ -1965,7 +1956,7 @@ static netdev_tx_t ravb_start_xmit(struct sk_buff *skb, struct net_device *ndev) struct ravb_tstamp_skb *ts_skb; struct ravb_tx_desc *desc; unsigned long flags; - dma_addr_t dma_addr; + u32 dma_addr; void *buffer; u32 entry; u32 len; @@ -2585,25 +2576,21 @@ static int ravb_set_gti(struct net_device *ndev) return 0; } -static int ravb_set_config_mode(struct net_device *ndev) +static void ravb_set_config_mode(struct net_device *ndev) { struct ravb_private *priv = netdev_priv(ndev); const struct ravb_hw_info *info = priv->info; - int error; if (info->gptp) { - error = ravb_set_opmode(ndev, CCC_OPC_CONFIG); - if (error) - return error; + ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_CONFIG); /* Set CSEL value */ ravb_modify(ndev, CCC, CCC_CSEL, CCC_CSEL_HPB); } else if (info->ccc_gac) { - error = ravb_set_opmode(ndev, CCC_OPC_CONFIG | CCC_GAC | CCC_CSEL_HPB); + ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_CONFIG | + CCC_GAC | CCC_CSEL_HPB); } else { - error = ravb_set_opmode(ndev, CCC_OPC_CONFIG); + ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_CONFIG); } - - return error; } /* Set tx and rx clock internal delay modes */ @@ -2823,9 +2810,7 @@ static int ravb_probe(struct platform_device *pdev) ndev->ethtool_ops = &ravb_ethtool_ops; /* Set AVB config mode */ - error = ravb_set_config_mode(ndev); - if (error) - goto out_disable_gptp_clk; + ravb_set_config_mode(ndev); if (info->gptp || info->ccc_gac) { /* Set GTI value */ @@ -2948,7 +2933,8 @@ static int ravb_remove(struct platform_device *pdev) dma_free_coherent(ndev->dev.parent, priv->desc_bat_size, priv->desc_bat, priv->desc_bat_dma); - ravb_set_opmode(ndev, CCC_OPC_RESET); + /* Set reset mode */ + ravb_write(ndev, CCC_OPC_RESET, CCC); clk_disable_unprepare(priv->gptp_clk); clk_disable_unprepare(priv->refclk); @@ -3032,11 +3018,8 @@ static int __maybe_unused ravb_resume(struct device *dev) int ret = 0; /* If WoL is enabled set reset mode to rearm the WoL logic */ - if (priv->wol_enabled) { - ret = ravb_set_opmode(ndev, CCC_OPC_RESET); - if (ret) - return ret; - } + if (priv->wol_enabled) + ravb_write(ndev, CCC_OPC_RESET, CCC); /* All register have been reset to default values. * Restore all registers which where setup at probe time and @@ -3044,9 +3027,7 @@ static int __maybe_unused ravb_resume(struct device *dev) */ /* Set AVB config mode */ - ret = ravb_set_config_mode(ndev); - if (ret) - return ret; + ravb_set_config_mode(ndev); if (info->gptp || info->ccc_gac) { /* Set GTI value */ diff --git a/drivers/net/ethernet/sfc/rx_common.c b/drivers/net/ethernet/sfc/rx_common.c index 3f290791df1c..9220afeddee8 100644 --- a/drivers/net/ethernet/sfc/rx_common.c +++ b/drivers/net/ethernet/sfc/rx_common.c @@ -820,10 +820,8 @@ int efx_probe_filters(struct efx_nic *efx) } if (!success) { - efx_for_each_channel(channel, efx) { + efx_for_each_channel(channel, efx) kfree(channel->rps_flow_id); - channel->rps_flow_id = NULL; - } efx->type->filter_table_remove(efx); rc = -ENOMEM; goto out_unlock; diff --git a/drivers/net/ethernet/sfc/tx_tso.c b/drivers/net/ethernet/sfc/tx_tso.c index d381d8164f07..898e5c61d908 100644 --- a/drivers/net/ethernet/sfc/tx_tso.c +++ b/drivers/net/ethernet/sfc/tx_tso.c @@ -147,7 +147,7 @@ static __be16 efx_tso_check_protocol(struct sk_buff *skb) EFX_WARN_ON_ONCE_PARANOID(((struct ethhdr *)skb->data)->h_proto != protocol); if (protocol == htons(ETH_P_8021Q)) { - struct vlan_ethhdr *veh = skb_vlan_eth_hdr(skb); + struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; protocol = veh->h_vlan_encapsulated_proto; } diff --git a/drivers/net/ethernet/stmicro/stmmac/Kconfig b/drivers/net/ethernet/stmicro/stmmac/Kconfig index 58091ee2bfe6..31ff35174034 100644 --- a/drivers/net/ethernet/stmicro/stmmac/Kconfig +++ b/drivers/net/ethernet/stmicro/stmmac/Kconfig @@ -256,7 +256,7 @@ config DWMAC_INTEL config DWMAC_LOONGSON tristate "Loongson PCI DWMAC support" default MACH_LOONGSON64 - depends on (MACH_LOONGSON64 || COMPILE_TEST) && STMMAC_ETH && PCI + depends on STMMAC_ETH && PCI depends on COMMON_CLK help This selects the LOONGSON PCI bus support for the stmmac driver, diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c index e129ee1020f0..a25c187d3185 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c @@ -59,19 +59,26 @@ static int loongson_dwmac_probe(struct pci_dev *pdev, const struct pci_device_id return -ENODEV; } + if (!of_device_is_compatible(np, "loongson, pci-gmac")) { + pr_info("dwmac_loongson_pci: Incompatible OF node\n"); + return -ENODEV; + } + plat = devm_kzalloc(&pdev->dev, sizeof(*plat), GFP_KERNEL); if (!plat) return -ENOMEM; - plat->mdio_bus_data = devm_kzalloc(&pdev->dev, - sizeof(*plat->mdio_bus_data), - GFP_KERNEL); - if (!plat->mdio_bus_data) - return -ENOMEM; - plat->mdio_node = of_get_child_by_name(np, "mdio"); if (plat->mdio_node) { dev_info(&pdev->dev, "Found MDIO subnode\n"); + + plat->mdio_bus_data = devm_kzalloc(&pdev->dev, + sizeof(*plat->mdio_bus_data), + GFP_KERNEL); + if (!plat->mdio_bus_data) { + ret = -ENOMEM; + goto err_put_node; + } plat->mdio_bus_data->needs_reset = true; } diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h index 46944c02b45e..bdbf86cb102a 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h @@ -247,7 +247,6 @@ struct stmmac_priv { u32 msg_enable; int wolopts; int wol_irq; - bool wol_irq_disabled; int clk_csr; struct timer_list eee_ctrl_timer; int lpi_irq; diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c index f03aa8a0b895..35c8dd92d369 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c @@ -761,16 +761,10 @@ static int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) if (wol->wolopts) { pr_info("stmmac: wakeup enable\n"); device_set_wakeup_enable(priv->device, 1); - /* Avoid unbalanced enable_irq_wake calls */ - if (priv->wol_irq_disabled) - enable_irq_wake(priv->wol_irq); - priv->wol_irq_disabled = false; + enable_irq_wake(priv->wol_irq); } else { device_set_wakeup_enable(priv->device, 0); - /* Avoid unbalanced disable_irq_wake calls */ - if (!priv->wol_irq_disabled) - disable_irq_wake(priv->wol_irq); - priv->wol_irq_disabled = true; + disable_irq_wake(priv->wol_irq); } mutex_lock(&priv->lock); diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 8f8de14347a9..69aac8ed84f6 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -3519,7 +3519,6 @@ static int stmmac_request_irq_multi_msi(struct net_device *dev) /* Request the Wake IRQ in case of another line * is used for WoL */ - priv->wol_irq_disabled = true; if (priv->wol_irq > 0 && priv->wol_irq != dev->irq) { int_name = priv->int_name_wol; sprintf(int_name, "%s:%s", dev->name, "wol"); @@ -4567,10 +4566,13 @@ dma_map_err: static void stmmac_rx_vlan(struct net_device *dev, struct sk_buff *skb) { - struct vlan_ethhdr *veth = skb_vlan_eth_hdr(skb); - __be16 vlan_proto = veth->h_vlan_proto; + struct vlan_ethhdr *veth; + __be16 vlan_proto; u16 vlanid; + veth = (struct vlan_ethhdr *)skb->data; + vlan_proto = veth->h_vlan_proto; + if ((vlan_proto == htons(ETH_P_8021Q) && dev->features & NETIF_F_HW_VLAN_CTAG_RX) || (vlan_proto == htons(ETH_P_8021AD) && diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c index 379fc887ddf4..5f177ea80725 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c @@ -483,11 +483,7 @@ int stmmac_mdio_register(struct net_device *ndev) new_bus->parent = priv->device; err = of_mdiobus_register(new_bus, mdio_node); - if (err == -ENODEV) { - err = 0; - dev_info(dev, "MDIO bus is disabled\n"); - goto bus_register_fail; - } else if (err) { + if (err != 0) { dev_err_probe(dev, err, "Cannot register the MDIO bus\n"); goto bus_register_fail; } diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c index 76fabeae512d..9f2553799895 100644 --- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c +++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c @@ -54,7 +54,7 @@ #define AM65_CPSW_MAX_PORTS 8 #define AM65_CPSW_MIN_PACKET_SIZE VLAN_ETH_ZLEN -#define AM65_CPSW_MAX_PACKET_SIZE 2024 +#define AM65_CPSW_MAX_PACKET_SIZE (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN) #define AM65_CPSW_REG_CTL 0x004 #define AM65_CPSW_REG_STAT_PORT_EN 0x014 @@ -1990,8 +1990,7 @@ am65_cpsw_nuss_init_port_ndev(struct am65_cpsw_common *common, u32 port_idx) eth_hw_addr_set(port->ndev, port->slave.mac_addr); port->ndev->min_mtu = AM65_CPSW_MIN_PACKET_SIZE; - port->ndev->max_mtu = AM65_CPSW_MAX_PACKET_SIZE - - (VLAN_ETH_HLEN + ETH_FCS_LEN); + port->ndev->max_mtu = AM65_CPSW_MAX_PACKET_SIZE; port->ndev->hw_features = NETIF_F_SG | NETIF_F_RXCSUM | NETIF_F_HW_CSUM | diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 7cbcf51bae92..54a17b576eac 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c @@ -3302,7 +3302,6 @@ static struct phy_driver ksphy_driver[] = { .flags = PHY_POLL_CABLE_TEST, .driver_data = &ksz9021_type, .probe = kszphy_probe, - .soft_reset = genphy_soft_reset, .config_init = ksz9131_config_init, .config_intr = kszphy_config_intr, .handle_interrupt = kszphy_handle_interrupt, diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 293eaf6b3ec9..556b2d1cd2ac 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c @@ -285,10 +285,8 @@ static int __team_options_register(struct team *team, return 0; inst_rollback: - for (i--; i >= 0; i--) { + for (i--; i >= 0; i--) __team_option_inst_del_option(team, dst_opts[i]); - list_del(&dst_opts[i]->list); - } i = option_count; alloc_rollback: diff --git a/drivers/net/usb/aqc111.c b/drivers/net/usb/aqc111.c index 7b8afa589a53..a017e9de2119 100644 --- a/drivers/net/usb/aqc111.c +++ b/drivers/net/usb/aqc111.c @@ -1079,17 +1079,17 @@ static int aqc111_rx_fixup(struct usbnet *dev, struct sk_buff *skb) u16 pkt_count = 0; u64 desc_hdr = 0; u16 vlan_tag = 0; - u32 skb_len; + u32 skb_len = 0; if (!skb) goto err; - skb_len = skb->len; - if (skb_len < sizeof(desc_hdr)) + if (skb->len == 0) goto err; + skb_len = skb->len; /* RX Descriptor Header */ - skb_trim(skb, skb_len - sizeof(desc_hdr)); + skb_trim(skb, skb->len - sizeof(desc_hdr)); desc_hdr = le64_to_cpup((u64 *)skb_tail_pointer(skb)); /* Check these packets */ diff --git a/drivers/net/usb/ax88172a.c b/drivers/net/usb/ax88172a.c index e47bb125048d..3777c7e2e6fc 100644 --- a/drivers/net/usb/ax88172a.c +++ b/drivers/net/usb/ax88172a.c @@ -161,9 +161,7 @@ static int ax88172a_bind(struct usbnet *dev, struct usb_interface *intf) u8 buf[ETH_ALEN]; struct ax88172a_private *priv; - ret = usbnet_get_endpoints(dev, intf); - if (ret) - return ret; + usbnet_get_endpoints(dev, intf); priv = kzalloc(sizeof(*priv), GFP_KERNEL); if (!priv) diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c index 5a1bf42ce156..4ea0e155bb0d 100644 --- a/drivers/net/usb/ax88179_178a.c +++ b/drivers/net/usb/ax88179_178a.c @@ -173,7 +173,6 @@ struct ax88179_data { u8 in_pm; u32 wol_supported; u32 wolopts; - u8 disconnecting; }; struct ax88179_int_data { @@ -209,7 +208,6 @@ static int __ax88179_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, { int ret; int (*fn)(struct usbnet *, u8, u8, u16, u16, void *, u16); - struct ax88179_data *ax179_data = dev->driver_priv; BUG_ON(!dev); @@ -221,7 +219,7 @@ static int __ax88179_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, ret = fn(dev, cmd, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, value, index, data, size); - if (unlikely((ret < 0) && !(ret == -ENODEV && ax179_data->disconnecting))) + if (unlikely(ret < 0)) netdev_warn(dev->net, "Failed to read reg index 0x%04x: %d\n", index, ret); @@ -233,7 +231,6 @@ static int __ax88179_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, { int ret; int (*fn)(struct usbnet *, u8, u8, u16, u16, const void *, u16); - struct ax88179_data *ax179_data = dev->driver_priv; BUG_ON(!dev); @@ -245,7 +242,7 @@ static int __ax88179_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, ret = fn(dev, cmd, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, value, index, data, size); - if (unlikely((ret < 0) && !(ret == -ENODEV && ax179_data->disconnecting))) + if (unlikely(ret < 0)) netdev_warn(dev->net, "Failed to write reg index 0x%04x: %d\n", index, ret); @@ -495,20 +492,6 @@ static int ax88179_resume(struct usb_interface *intf) return usbnet_resume(intf); } -static void ax88179_disconnect(struct usb_interface *intf) -{ - struct usbnet *dev = usb_get_intfdata(intf); - struct ax88179_data *ax179_data; - - if (!dev) - return; - - ax179_data = dev->driver_priv; - ax179_data->disconnecting = 1; - - usbnet_disconnect(intf); -} - static void ax88179_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) { @@ -1923,7 +1906,7 @@ static struct usb_driver ax88179_178a_driver = { .suspend = ax88179_suspend, .resume = ax88179_resume, .reset_resume = ax88179_resume, - .disconnect = ax88179_disconnect, + .disconnect = usbnet_disconnect, .supports_autosuspend = 1, .disable_hub_initiated_lpm = 1, }; diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 2d82481d34e6..4fb981b8732e 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c @@ -1288,7 +1288,6 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x19d2, 0x0168, 4)}, {QMI_FIXED_INTF(0x19d2, 0x0176, 3)}, {QMI_FIXED_INTF(0x19d2, 0x0178, 3)}, - {QMI_FIXED_INTF(0x19d2, 0x0189, 4)}, /* ZTE MF290 */ {QMI_FIXED_INTF(0x19d2, 0x0191, 4)}, /* ZTE EuFi890 */ {QMI_FIXED_INTF(0x19d2, 0x0199, 1)}, /* ZTE MF820S */ {QMI_FIXED_INTF(0x19d2, 0x0200, 1)}, diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 958a02b19554..4d833781294a 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -8288,6 +8288,43 @@ static bool rtl_check_vendor_ok(struct usb_interface *intf) return true; } +static bool rtl_vendor_mode(struct usb_interface *intf) +{ + struct usb_host_interface *alt = intf->cur_altsetting; + struct usb_device *udev; + struct usb_host_config *c; + int i, num_configs; + + if (alt->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) + return rtl_check_vendor_ok(intf); + + /* The vendor mode is not always config #1, so to find it out. */ + udev = interface_to_usbdev(intf); + c = udev->config; + num_configs = udev->descriptor.bNumConfigurations; + if (num_configs < 2) + return false; + + for (i = 0; i < num_configs; (i++, c++)) { + struct usb_interface_descriptor *desc = NULL; + + if (c->desc.bNumInterfaces > 0) + desc = &c->intf_cache[0]->altsetting->desc; + else + continue; + + if (desc->bInterfaceClass == USB_CLASS_VENDOR_SPEC) { + usb_driver_set_configuration(udev, c->desc.bConfigurationValue); + break; + } + } + + if (i == num_configs) + dev_err(&intf->dev, "Unexpected Device\n"); + + return false; +} + static int rtl8152_pre_reset(struct usb_interface *intf) { struct r8152 *tp = usb_get_intfdata(intf); @@ -9519,8 +9556,9 @@ static int rtl_fw_init(struct r8152 *tp) return 0; } -static u8 __rtl_get_hw_ver(struct usb_device *udev) +u8 rtl8152_get_version(struct usb_interface *intf) { + struct usb_device *udev = interface_to_usbdev(intf); u32 ocp_data = 0; __le32 *tmp; u8 version; @@ -9590,19 +9628,10 @@ static u8 __rtl_get_hw_ver(struct usb_device *udev) break; default: version = RTL_VER_UNKNOWN; - dev_info(&udev->dev, "Unknown version 0x%04x\n", ocp_data); + dev_info(&intf->dev, "Unknown version 0x%04x\n", ocp_data); break; } - return version; -} - -u8 rtl8152_get_version(struct usb_interface *intf) -{ - u8 version; - - version = __rtl_get_hw_ver(interface_to_usbdev(intf)); - dev_dbg(&intf->dev, "Detected version 0x%04x\n", version); return version; @@ -9646,10 +9675,7 @@ static int rtl8152_probe(struct usb_interface *intf, if (version == RTL_VER_UNKNOWN) return -ENODEV; - if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC) - return -ENODEV; - - if (!rtl_check_vendor_ok(intf)) + if (!rtl_vendor_mode(intf)) return -ENODEV; usb_reset_device(udev); @@ -9849,37 +9875,43 @@ static void rtl8152_disconnect(struct usb_interface *intf) } } +#define REALTEK_USB_DEVICE(vend, prod) { \ + USB_DEVICE_INTERFACE_CLASS(vend, prod, USB_CLASS_VENDOR_SPEC), \ +}, \ +{ \ + USB_DEVICE_AND_INTERFACE_INFO(vend, prod, USB_CLASS_COMM, \ + USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), \ +} + /* table of devices that work with this driver */ static const struct usb_device_id rtl8152_table[] = { /* Realtek */ - { USB_DEVICE(VENDOR_ID_REALTEK, 0x8050) }, - { USB_DEVICE(VENDOR_ID_REALTEK, 0x8053) }, - { USB_DEVICE(VENDOR_ID_REALTEK, 0x8152) }, - { USB_DEVICE(VENDOR_ID_REALTEK, 0x8153) }, - { USB_DEVICE(VENDOR_ID_REALTEK, 0x8155) }, - { USB_DEVICE(VENDOR_ID_REALTEK, 0x8156) }, + REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8050), + REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8053), + REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8152), + REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8153), + REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8155), + REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8156), /* Microsoft */ - { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab) }, - { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6) }, - { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927) }, - { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0c5e) }, - { USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101) }, - { USB_DEVICE(VENDOR_ID_LENOVO, 0x304f) }, - { USB_DEVICE(VENDOR_ID_LENOVO, 0x3054) }, - { USB_DEVICE(VENDOR_ID_LENOVO, 0x3062) }, - { USB_DEVICE(VENDOR_ID_LENOVO, 0x3069) }, - { USB_DEVICE(VENDOR_ID_LENOVO, 0x3082) }, - { USB_DEVICE(VENDOR_ID_LENOVO, 0x7205) }, - { USB_DEVICE(VENDOR_ID_LENOVO, 0x720c) }, - { USB_DEVICE(VENDOR_ID_LENOVO, 0x7214) }, - { USB_DEVICE(VENDOR_ID_LENOVO, 0x721e) }, - { USB_DEVICE(VENDOR_ID_LENOVO, 0xa387) }, - { USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041) }, - { USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff) }, - { USB_DEVICE(VENDOR_ID_TPLINK, 0x0601) }, - { USB_DEVICE(VENDOR_ID_DLINK, 0xb301) }, - { USB_DEVICE(VENDOR_ID_ASUS, 0x1976) }, + REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab), + REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6), + REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927), + REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0c5e), + REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101), + REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f), + REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3054), + REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3062), + REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3069), + REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3082), + REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7205), + REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x720c), + REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7214), + REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x721e), + REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0xa387), + REALTEK_USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041), + REALTEK_USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff), + REALTEK_USB_DEVICE(VENDOR_ID_TPLINK, 0x0601), {} }; @@ -9899,68 +9931,7 @@ static struct usb_driver rtl8152_driver = { .disable_hub_initiated_lpm = 1, }; -static int rtl8152_cfgselector_probe(struct usb_device *udev) -{ - struct usb_host_config *c; - int i, num_configs; - - /* Switch the device to vendor mode, if and only if the vendor mode - * driver supports it. - */ - if (__rtl_get_hw_ver(udev) == RTL_VER_UNKNOWN) - return 0; - - /* The vendor mode is not always config #1, so to find it out. */ - c = udev->config; - num_configs = udev->descriptor.bNumConfigurations; - for (i = 0; i < num_configs; (i++, c++)) { - struct usb_interface_descriptor *desc = NULL; - - if (!c->desc.bNumInterfaces) - continue; - desc = &c->intf_cache[0]->altsetting->desc; - if (desc->bInterfaceClass == USB_CLASS_VENDOR_SPEC) - break; - } - - if (i == num_configs) - return -ENODEV; - - if (usb_set_configuration(udev, c->desc.bConfigurationValue)) { - dev_err(&udev->dev, "Failed to set configuration %d\n", - c->desc.bConfigurationValue); - return -ENODEV; - } - - return 0; -} - -static struct usb_device_driver rtl8152_cfgselector_driver = { - .name = MODULENAME "-cfgselector", - .probe = rtl8152_cfgselector_probe, - .id_table = rtl8152_table, - .generic_subclass = 1, - .supports_autosuspend = 1, -}; - -static int __init rtl8152_driver_init(void) -{ - int ret; - - ret = usb_register_device_driver(&rtl8152_cfgselector_driver, THIS_MODULE); - if (ret) - return ret; - return usb_register(&rtl8152_driver); -} - -static void __exit rtl8152_driver_exit(void) -{ - usb_deregister(&rtl8152_driver); - usb_deregister_device_driver(&rtl8152_cfgselector_driver); -} - -module_init(rtl8152_driver_init); -module_exit(rtl8152_driver_exit); +module_usb_driver(rtl8152_driver); MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/net/wireless/ath/ath11k/ahb.c b/drivers/net/wireless/ath/ath11k/ahb.c index 70d468f01338..76f275ca53e9 100644 --- a/drivers/net/wireless/ath/ath11k/ahb.c +++ b/drivers/net/wireless/ath/ath11k/ahb.c @@ -813,8 +813,8 @@ static int ath11k_core_get_rproc(struct ath11k_base *ab) prproc = rproc_get_by_phandle(rproc_phandle); if (!prproc) { - ath11k_dbg(ab, ATH11K_DBG_AHB, "failed to get rproc, deferring\n"); - return -EPROBE_DEFER; + ath11k_err(ab, "failed to get rproc\n"); + return -EINVAL; } ab_ahb->tgt_rproc = prproc; diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-prph.h b/drivers/net/wireless/intel/iwlwifi/iwl-prph.h index c5a306b01fe2..157d1f31c487 100644 --- a/drivers/net/wireless/intel/iwlwifi/iwl-prph.h +++ b/drivers/net/wireless/intel/iwlwifi/iwl-prph.h @@ -348,8 +348,8 @@ #define RFIC_REG_RD 0xAD0470 #define WFPM_CTRL_REG 0xA03030 #define WFPM_OTP_CFG1_ADDR 0x00a03098 -#define WFPM_OTP_CFG1_IS_JACKET_BIT BIT(5) -#define WFPM_OTP_CFG1_IS_CDB_BIT BIT(4) +#define WFPM_OTP_CFG1_IS_JACKET_BIT BIT(4) +#define WFPM_OTP_CFG1_IS_CDB_BIT BIT(5) #define WFPM_GP2 0xA030B4 diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/phy-ctxt.c b/drivers/net/wireless/intel/iwlwifi/mvm/phy-ctxt.c index 2c14188f34bb..a3cefbc43e80 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/phy-ctxt.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/phy-ctxt.c @@ -99,6 +99,17 @@ static void iwl_mvm_phy_ctxt_set_rxchain(struct iwl_mvm *mvm, active_cnt = 2; } + /* + * If the firmware requested it, then we know that it supports + * getting zero for the values to indicate "use one, but pick + * which one yourself", which means it can dynamically pick one + * that e.g. has better RSSI. + */ + if (mvm->fw_static_smps_request && active_cnt == 1 && idle_cnt == 1) { + idle_cnt = 0; + active_cnt = 0; + } + *rxchain_info = cpu_to_le32(iwl_mvm_get_valid_rx_ant(mvm) << PHY_RX_CHAIN_VALID_POS); *rxchain_info |= cpu_to_le32(idle_cnt << PHY_RX_CHAIN_CNT_POS); diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c index 76219486b9c2..caaf4d52e2c6 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c @@ -2200,7 +2200,7 @@ int iwl_mvm_flush_sta_tids(struct iwl_mvm *mvm, u32 sta_id, u16 tids) WARN_ON(!iwl_mvm_has_new_tx_api(mvm)); if (iwl_fw_lookup_notif_ver(mvm->fw, LONG_GROUP, TXPATH_FLUSH, 0) > 0) - cmd.flags |= CMD_WANT_SKB | CMD_SEND_IN_RFKILL; + cmd.flags |= CMD_WANT_SKB; IWL_DEBUG_TX_QUEUES(mvm, "flush for sta id %d tid mask 0x%x\n", sta_id, tids); diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h index 2ec4ee8ab317..69b95ad5993b 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h +++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h @@ -745,7 +745,7 @@ static inline void iwl_enable_rfkill_int(struct iwl_trans *trans) } } -void iwl_pcie_handle_rfkill_irq(struct iwl_trans *trans, bool from_irq); +void iwl_pcie_handle_rfkill_irq(struct iwl_trans *trans); static inline bool iwl_is_rfkill_set(struct iwl_trans *trans) { @@ -792,7 +792,7 @@ static inline bool iwl_pcie_dbg_on(struct iwl_trans *trans) return (trans->dbg.dest_tlv || iwl_trans_dbg_ini_valid(trans)); } -void iwl_trans_pcie_rf_kill(struct iwl_trans *trans, bool state, bool from_irq); +void iwl_trans_pcie_rf_kill(struct iwl_trans *trans, bool state); void iwl_trans_pcie_dump_regs(struct iwl_trans *trans); #ifdef CONFIG_IWLWIFI_DEBUGFS diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c index 91b73e7a4113..90a46faaaffd 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c @@ -1381,7 +1381,7 @@ static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans, * if it is true then one of the handlers took the page. */ - if (reclaim && txq) { + if (reclaim) { u16 sequence = le16_to_cpu(pkt->hdr.sequence); int index = SEQ_TO_INDEX(sequence); int cmd_index = iwl_txq_get_cmd_index(txq, index); @@ -1781,7 +1781,7 @@ static u32 iwl_pcie_int_cause_ict(struct iwl_trans *trans) return inta; } -void iwl_pcie_handle_rfkill_irq(struct iwl_trans *trans, bool from_irq) +void iwl_pcie_handle_rfkill_irq(struct iwl_trans *trans) { struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); struct isr_statistics *isr_stats = &trans_pcie->isr_stats; @@ -1805,7 +1805,7 @@ void iwl_pcie_handle_rfkill_irq(struct iwl_trans *trans, bool from_irq) isr_stats->rfkill++; if (prev != report) - iwl_trans_pcie_rf_kill(trans, report, from_irq); + iwl_trans_pcie_rf_kill(trans, report); mutex_unlock(&trans_pcie->mutex); if (hw_rfkill) { @@ -1945,7 +1945,7 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id) /* HW RF KILL switch toggled */ if (inta & CSR_INT_BIT_RF_KILL) { - iwl_pcie_handle_rfkill_irq(trans, true); + iwl_pcie_handle_rfkill_irq(trans); handled |= CSR_INT_BIT_RF_KILL; } @@ -2362,7 +2362,7 @@ irqreturn_t iwl_pcie_irq_msix_handler(int irq, void *dev_id) /* HW RF KILL switch toggled */ if (inta_hw & MSIX_HW_INT_CAUSES_REG_RF_KILL) - iwl_pcie_handle_rfkill_irq(trans, true); + iwl_pcie_handle_rfkill_irq(trans); if (inta_hw & MSIX_HW_INT_CAUSES_REG_HW_ERR) { IWL_ERR(trans, diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c index c7ed35b3dd8d..39ab6526e6b8 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c @@ -1080,7 +1080,7 @@ bool iwl_pcie_check_hw_rf_kill(struct iwl_trans *trans) report = test_bit(STATUS_RFKILL_OPMODE, &trans->status); if (prev != report) - iwl_trans_pcie_rf_kill(trans, report, false); + iwl_trans_pcie_rf_kill(trans, report); return hw_rfkill; } @@ -1234,7 +1234,7 @@ static void iwl_pcie_init_msix(struct iwl_trans_pcie *trans_pcie) trans_pcie->hw_mask = trans_pcie->hw_init_mask; } -static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans, bool from_irq) +static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans) { struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); @@ -1261,8 +1261,7 @@ static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans, bool from_irq) if (test_and_clear_bit(STATUS_DEVICE_ENABLED, &trans->status)) { IWL_DEBUG_INFO(trans, "DEVICE_ENABLED bit was set and is now cleared\n"); - if (!from_irq) - iwl_pcie_synchronize_irqs(trans); + iwl_pcie_synchronize_irqs(trans); iwl_pcie_rx_napi_sync(trans); iwl_pcie_tx_stop(trans); iwl_pcie_rx_stop(trans); @@ -1452,7 +1451,7 @@ void iwl_trans_pcie_handle_stop_rfkill(struct iwl_trans *trans, clear_bit(STATUS_RFKILL_OPMODE, &trans->status); } if (hw_rfkill != was_in_rfkill) - iwl_trans_pcie_rf_kill(trans, hw_rfkill, false); + iwl_trans_pcie_rf_kill(trans, hw_rfkill); } static void iwl_trans_pcie_stop_device(struct iwl_trans *trans) @@ -1467,12 +1466,12 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans) mutex_lock(&trans_pcie->mutex); trans_pcie->opmode_down = true; was_in_rfkill = test_bit(STATUS_RFKILL_OPMODE, &trans->status); - _iwl_trans_pcie_stop_device(trans, false); + _iwl_trans_pcie_stop_device(trans); iwl_trans_pcie_handle_stop_rfkill(trans, was_in_rfkill); mutex_unlock(&trans_pcie->mutex); } -void iwl_trans_pcie_rf_kill(struct iwl_trans *trans, bool state, bool from_irq) +void iwl_trans_pcie_rf_kill(struct iwl_trans *trans, bool state) { struct iwl_trans_pcie __maybe_unused *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); @@ -1485,7 +1484,7 @@ void iwl_trans_pcie_rf_kill(struct iwl_trans *trans, bool state, bool from_irq) if (trans->trans_cfg->gen2) _iwl_trans_pcie_gen2_stop_device(trans); else - _iwl_trans_pcie_stop_device(trans, from_irq); + _iwl_trans_pcie_stop_device(trans); } } @@ -2816,7 +2815,7 @@ static ssize_t iwl_dbgfs_rfkill_write(struct file *file, IWL_WARN(trans, "changing debug rfkill %d->%d\n", trans_pcie->debug_rfkill, new_value); trans_pcie->debug_rfkill = new_value; - iwl_pcie_handle_rfkill_irq(trans, false); + iwl_pcie_handle_rfkill_irq(trans); return count; } @@ -3035,7 +3034,7 @@ static u32 iwl_trans_pcie_dump_rbs(struct iwl_trans *trans, struct iwl_rxq *rxq = &trans_pcie->rxq[0]; u32 i, r, j, rb_len = 0; - spin_lock_bh(&rxq->lock); + spin_lock(&rxq->lock); r = le16_to_cpu(iwl_get_closed_rb_stts(trans, rxq)) & 0x0FFF; @@ -3059,7 +3058,7 @@ static u32 iwl_trans_pcie_dump_rbs(struct iwl_trans *trans, *data = iwl_fw_error_next_data(*data); } - spin_unlock_bh(&rxq->lock); + spin_unlock(&rxq->lock); return rb_len; } diff --git a/drivers/net/wireless/marvell/libertas/Kconfig b/drivers/net/wireless/marvell/libertas/Kconfig index c7d02adb3eea..6d62ab49aa8d 100644 --- a/drivers/net/wireless/marvell/libertas/Kconfig +++ b/drivers/net/wireless/marvell/libertas/Kconfig @@ -2,6 +2,8 @@ config LIBERTAS tristate "Marvell 8xxx Libertas WLAN driver support" depends on CFG80211 + select WIRELESS_EXT + select WEXT_SPY select LIB80211 select FW_LOADER help diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c index c907da2a4789..bcd564dc3554 100644 --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c @@ -2046,8 +2046,6 @@ static int mwifiex_cfg80211_start_ap(struct wiphy *wiphy, mwifiex_set_sys_config_invalid_data(bss_cfg); - memcpy(bss_cfg->mac_addr, priv->curr_addr, ETH_ALEN); - if (params->beacon_interval) bss_cfg->beacon_period = params->beacon_interval; if (params->dtim_period) diff --git a/drivers/net/wireless/marvell/mwifiex/fw.h b/drivers/net/wireless/marvell/mwifiex/fw.h index 863f5f2247a0..b4f945a549f7 100644 --- a/drivers/net/wireless/marvell/mwifiex/fw.h +++ b/drivers/net/wireless/marvell/mwifiex/fw.h @@ -165,7 +165,6 @@ enum MWIFIEX_802_11_PRIVACY_FILTER { #define TLV_TYPE_STA_MAC_ADDR (PROPRIETARY_TLV_BASE_ID + 32) #define TLV_TYPE_BSSID (PROPRIETARY_TLV_BASE_ID + 35) #define TLV_TYPE_CHANNELBANDLIST (PROPRIETARY_TLV_BASE_ID + 42) -#define TLV_TYPE_UAP_MAC_ADDRESS (PROPRIETARY_TLV_BASE_ID + 43) #define TLV_TYPE_UAP_BEACON_PERIOD (PROPRIETARY_TLV_BASE_ID + 44) #define TLV_TYPE_UAP_DTIM_PERIOD (PROPRIETARY_TLV_BASE_ID + 45) #define TLV_TYPE_UAP_BCAST_SSID (PROPRIETARY_TLV_BASE_ID + 48) diff --git a/drivers/net/wireless/marvell/mwifiex/ioctl.h b/drivers/net/wireless/marvell/mwifiex/ioctl.h index e8825f302de8..091e7ca79376 100644 --- a/drivers/net/wireless/marvell/mwifiex/ioctl.h +++ b/drivers/net/wireless/marvell/mwifiex/ioctl.h @@ -107,7 +107,6 @@ struct mwifiex_uap_bss_param { u8 qos_info; u8 power_constraint; struct mwifiex_types_wmm_info wmm_info; - u8 mac_addr[ETH_ALEN]; }; enum { diff --git a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c index 491e36611909..e78a201cd150 100644 --- a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c +++ b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c @@ -468,7 +468,6 @@ void mwifiex_config_uap_11d(struct mwifiex_private *priv, static int mwifiex_uap_bss_param_prepare(u8 *tlv, void *cmd_buf, u16 *param_size) { - struct host_cmd_tlv_mac_addr *mac_tlv; struct host_cmd_tlv_dtim_period *dtim_period; struct host_cmd_tlv_beacon_period *beacon_period; struct host_cmd_tlv_ssid *ssid; @@ -488,13 +487,6 @@ mwifiex_uap_bss_param_prepare(u8 *tlv, void *cmd_buf, u16 *param_size) int i; u16 cmd_size = *param_size; - mac_tlv = (struct host_cmd_tlv_mac_addr *)tlv; - mac_tlv->header.type = cpu_to_le16(TLV_TYPE_UAP_MAC_ADDRESS); - mac_tlv->header.len = cpu_to_le16(ETH_ALEN); - memcpy(mac_tlv->mac_addr, bss_cfg->mac_addr, ETH_ALEN); - cmd_size += sizeof(struct host_cmd_tlv_mac_addr); - tlv += sizeof(struct host_cmd_tlv_mac_addr); - if (bss_cfg->ssid.ssid_len) { ssid = (struct host_cmd_tlv_ssid *)tlv; ssid->header.type = cpu_to_le16(TLV_TYPE_UAP_SSID); diff --git a/drivers/net/wireless/mediatek/mt76/eeprom.c b/drivers/net/wireless/mediatek/mt76/eeprom.c index 0a88048b8976..9bc8758573fc 100644 --- a/drivers/net/wireless/mediatek/mt76/eeprom.c +++ b/drivers/net/wireless/mediatek/mt76/eeprom.c @@ -62,7 +62,7 @@ int mt76_get_of_eeprom(struct mt76_dev *dev, void *eep, int offset, int len) goto out_put_node; } - offset += be32_to_cpup(list); + offset = be32_to_cpup(list); ret = mtd_read(mtd, offset, len, &retlen, eep); put_mtd_device(mtd); if (mtd_is_bitflip(ret)) diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h index 60c9f9c56a4f..9c753c6aabef 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76.h +++ b/drivers/net/wireless/mediatek/mt76/mt76.h @@ -564,7 +564,8 @@ struct mt76_sdio { struct mt76_worker txrx_worker; struct mt76_worker status_worker; struct mt76_worker net_worker; - struct mt76_worker stat_worker; + + struct work_struct stat_work; u8 *xmit_buf; u32 xmit_buf_sz; diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/sdio.c b/drivers/net/wireless/mediatek/mt76/mt7615/sdio.c index d742b22428f0..304212f5f8da 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/sdio.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/sdio.c @@ -205,8 +205,8 @@ static int mt7663s_suspend(struct device *dev) mt76_worker_disable(&mdev->mt76.sdio.txrx_worker); mt76_worker_disable(&mdev->mt76.sdio.status_worker); mt76_worker_disable(&mdev->mt76.sdio.net_worker); - mt76_worker_disable(&mdev->mt76.sdio.stat_worker); + cancel_work_sync(&mdev->mt76.sdio.stat_work); clear_bit(MT76_READING_STATS, &mdev->mphy.state); mt76_tx_status_check(&mdev->mt76, true); diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c index 19640ff76bdc..10dda1693d7d 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c @@ -1036,26 +1036,21 @@ int __mt7921_mcu_set_clc(struct mt7921_dev *dev, u8 *alpha2, u8 type[2]; u8 rsvd[64]; } __packed req = { - .ver = 1, .idx = idx, .env = env_cap, }; int ret, valid_cnt = 0; - u16 buf_len = 0; - u8 *pos; + u8 i, *pos; if (!clc) return 0; - buf_len = le16_to_cpu(clc->len) - sizeof(*clc); pos = clc->data; - while (buf_len > 16) { + for (i = 0; i < clc->nr_country; i++) { struct mt7921_clc_rule *rule = (struct mt7921_clc_rule *)pos; u16 len = le16_to_cpu(rule->len); - u16 offset = len + sizeof(*rule); - pos += offset; - buf_len -= offset; + pos += len + sizeof(*rule); if (rule->alpha2[0] != alpha2[0] || rule->alpha2[1] != alpha2[1]) continue; diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/sdio.c b/drivers/net/wireless/mediatek/mt76/mt7921/sdio.c index 8898ba69b8e9..3b25a06fd946 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/sdio.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/sdio.c @@ -222,7 +222,7 @@ static int mt7921s_suspend(struct device *__dev) mt76_txq_schedule_all(&dev->mphy); mt76_worker_disable(&mdev->tx_worker); mt76_worker_disable(&mdev->sdio.status_worker); - mt76_worker_disable(&mdev->sdio.stat_worker); + cancel_work_sync(&mdev->sdio.stat_work); clear_bit(MT76_READING_STATS, &dev->mphy.state); mt76_tx_status_check(mdev, true); @@ -254,7 +254,6 @@ restore_txrx_worker: restore_worker: mt76_worker_enable(&mdev->tx_worker); mt76_worker_enable(&mdev->sdio.status_worker); - mt76_worker_enable(&mdev->sdio.stat_worker); if (!pm->ds_enable) mt76_connac_mcu_set_deep_sleep(mdev, false); @@ -287,7 +286,6 @@ static int mt7921s_resume(struct device *__dev) mt76_worker_enable(&mdev->sdio.txrx_worker); mt76_worker_enable(&mdev->sdio.status_worker); mt76_worker_enable(&mdev->sdio.net_worker); - mt76_worker_enable(&mdev->sdio.stat_worker); /* restore previous ds setting */ if (!pm->ds_enable) diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/sdio_mac.c b/drivers/net/wireless/mediatek/mt76/mt7921/sdio_mac.c index fd07b6623392..1b3adb3d91e8 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/sdio_mac.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/sdio_mac.c @@ -107,7 +107,7 @@ int mt7921s_mac_reset(struct mt7921_dev *dev) mt76_worker_disable(&dev->mt76.sdio.txrx_worker); mt76_worker_disable(&dev->mt76.sdio.status_worker); mt76_worker_disable(&dev->mt76.sdio.net_worker); - mt76_worker_disable(&dev->mt76.sdio.stat_worker); + cancel_work_sync(&dev->mt76.sdio.stat_work); mt7921s_disable_irq(&dev->mt76); mt7921s_wfsys_reset(dev); @@ -115,7 +115,6 @@ int mt7921s_mac_reset(struct mt7921_dev *dev) mt76_worker_enable(&dev->mt76.sdio.txrx_worker); mt76_worker_enable(&dev->mt76.sdio.status_worker); mt76_worker_enable(&dev->mt76.sdio.net_worker); - mt76_worker_enable(&dev->mt76.sdio.stat_worker); dev->fw_assert = false; clear_bit(MT76_MCU_RESET, &dev->mphy.state); diff --git a/drivers/net/wireless/mediatek/mt76/sdio.c b/drivers/net/wireless/mediatek/mt76/sdio.c index fc4fb9463564..176207f3177c 100644 --- a/drivers/net/wireless/mediatek/mt76/sdio.c +++ b/drivers/net/wireless/mediatek/mt76/sdio.c @@ -481,21 +481,21 @@ static void mt76s_status_worker(struct mt76_worker *w) if (dev->drv->tx_status_data && ndata_frames > 0 && !test_and_set_bit(MT76_READING_STATS, &dev->phy.state) && !test_bit(MT76_STATE_SUSPEND, &dev->phy.state)) - mt76_worker_schedule(&sdio->stat_worker); + ieee80211_queue_work(dev->hw, &dev->sdio.stat_work); } while (nframes > 0); if (resched) mt76_worker_schedule(&dev->tx_worker); } -static void mt76s_tx_status_data(struct mt76_worker *worker) +static void mt76s_tx_status_data(struct work_struct *work) { struct mt76_sdio *sdio; struct mt76_dev *dev; u8 update = 1; u16 count = 0; - sdio = container_of(worker, struct mt76_sdio, stat_worker); + sdio = container_of(work, struct mt76_sdio, stat_work); dev = container_of(sdio, struct mt76_dev, sdio); while (true) { @@ -508,7 +508,7 @@ static void mt76s_tx_status_data(struct mt76_worker *worker) } if (count && test_bit(MT76_STATE_RUNNING, &dev->phy.state)) - mt76_worker_schedule(&sdio->status_worker); + ieee80211_queue_work(dev->hw, &sdio->stat_work); else clear_bit(MT76_READING_STATS, &dev->phy.state); } @@ -600,8 +600,8 @@ void mt76s_deinit(struct mt76_dev *dev) mt76_worker_teardown(&sdio->txrx_worker); mt76_worker_teardown(&sdio->status_worker); mt76_worker_teardown(&sdio->net_worker); - mt76_worker_teardown(&sdio->stat_worker); + cancel_work_sync(&sdio->stat_work); clear_bit(MT76_READING_STATS, &dev->phy.state); mt76_tx_status_check(dev, true); @@ -644,14 +644,10 @@ int mt76s_init(struct mt76_dev *dev, struct sdio_func *func, if (err) return err; - err = mt76_worker_setup(dev->hw, &sdio->stat_worker, mt76s_tx_status_data, - "sdio-sta"); - if (err) - return err; - sched_set_fifo_low(sdio->status_worker.task); sched_set_fifo_low(sdio->net_worker.task); - sched_set_fifo_low(sdio->stat_worker.task); + + INIT_WORK(&sdio->stat_work, mt76s_tx_status_data); dev->queue_ops = &sdio_queue_ops; dev->bus = bus_ops; diff --git a/drivers/net/wireless/purelifi/plfxlc/usb.c b/drivers/net/wireless/purelifi/plfxlc/usb.c index 311676c1ece0..76d0a778636a 100644 --- a/drivers/net/wireless/purelifi/plfxlc/usb.c +++ b/drivers/net/wireless/purelifi/plfxlc/usb.c @@ -493,12 +493,9 @@ int plfxlc_usb_wreq_async(struct plfxlc_usb *usb, const u8 *buffer, void *context) { struct usb_device *udev = interface_to_usbdev(usb->ez_usb); - struct urb *urb; + struct urb *urb = usb_alloc_urb(0, GFP_ATOMIC); int r; - urb = usb_alloc_urb(0, GFP_ATOMIC); - if (!urb) - return -ENOMEM; usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, EP_DATA_OUT), (void *)buffer, buffer_len, complete_fn, context); diff --git a/drivers/net/wireless/realtek/rtlwifi/pci.c b/drivers/net/wireless/realtek/rtlwifi/pci.c index 6116c1bec155..ca79f652fef3 100644 --- a/drivers/net/wireless/realtek/rtlwifi/pci.c +++ b/drivers/net/wireless/realtek/rtlwifi/pci.c @@ -164,29 +164,21 @@ static bool _rtl_pci_platform_switch_device_pci_aspm( struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); - value &= PCI_EXP_LNKCTL_ASPMC; - if (rtlhal->hw_type != HARDWARE_TYPE_RTL8192SE) - value |= PCI_EXP_LNKCTL_CCC; + value |= 0x40; - pcie_capability_clear_and_set_word(rtlpci->pdev, PCI_EXP_LNKCTL, - PCI_EXP_LNKCTL_ASPMC | value, - value); + pci_write_config_byte(rtlpci->pdev, 0x80, value); return false; } -/* @value is PCI_EXP_LNKCTL_CLKREQ_EN or 0 to enable/disable clk request. */ -static void _rtl_pci_switch_clk_req(struct ieee80211_hw *hw, u16 value) +/*When we set 0x01 to enable clk request. Set 0x0 to disable clk req.*/ +static void _rtl_pci_switch_clk_req(struct ieee80211_hw *hw, u8 value) { struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); - value &= PCI_EXP_LNKCTL_CLKREQ_EN; - - pcie_capability_clear_and_set_word(rtlpci->pdev, PCI_EXP_LNKCTL, - PCI_EXP_LNKCTL_CLKREQ_EN, - value); + pci_write_config_byte(rtlpci->pdev, 0x81, value); if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192SE) udelay(100); @@ -200,8 +192,11 @@ static void rtl_pci_disable_aspm(struct ieee80211_hw *hw) struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); u8 pcibridge_vendor = pcipriv->ndis_adapter.pcibridge_vendor; + u8 num4bytes = pcipriv->ndis_adapter.num4bytes; /*Retrieve original configuration settings. */ u8 linkctrl_reg = pcipriv->ndis_adapter.linkctrl_reg; + u16 pcibridge_linkctrlreg = pcipriv->ndis_adapter. + pcibridge_linkctrlreg; u16 aspmlevel = 0; u8 tmp_u1b = 0; @@ -226,8 +221,16 @@ static void rtl_pci_disable_aspm(struct ieee80211_hw *hw) /*Set corresponding value. */ aspmlevel |= BIT(0) | BIT(1); linkctrl_reg &= ~aspmlevel; + pcibridge_linkctrlreg &= ~(BIT(0) | BIT(1)); _rtl_pci_platform_switch_device_pci_aspm(hw, linkctrl_reg); + udelay(50); + + /*4 Disable Pci Bridge ASPM */ + pci_write_config_byte(rtlpci->pdev, (num4bytes << 2), + pcibridge_linkctrlreg); + + udelay(50); } /*Enable RTL8192SE ASPM & Enable Pci Bridge ASPM for @@ -242,7 +245,9 @@ static void rtl_pci_enable_aspm(struct ieee80211_hw *hw) struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); u8 pcibridge_vendor = pcipriv->ndis_adapter.pcibridge_vendor; + u8 num4bytes = pcipriv->ndis_adapter.num4bytes; u16 aspmlevel; + u8 u_pcibridge_aspmsetting; u8 u_device_aspmsetting; if (!ppsc->support_aspm) @@ -254,6 +259,25 @@ static void rtl_pci_enable_aspm(struct ieee80211_hw *hw) return; } + /*4 Enable Pci Bridge ASPM */ + + u_pcibridge_aspmsetting = + pcipriv->ndis_adapter.pcibridge_linkctrlreg | + rtlpci->const_hostpci_aspm_setting; + + if (pcibridge_vendor == PCI_BRIDGE_VENDOR_INTEL) + u_pcibridge_aspmsetting &= ~BIT(0); + + pci_write_config_byte(rtlpci->pdev, (num4bytes << 2), + u_pcibridge_aspmsetting); + + rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, + "PlatformEnableASPM(): Write reg[%x] = %x\n", + (pcipriv->ndis_adapter.pcibridge_pciehdr_offset + 0x10), + u_pcibridge_aspmsetting); + + udelay(50); + /*Get ASPM level (with/without Clock Req) */ aspmlevel = rtlpci->const_devicepci_aspm_setting; u_device_aspmsetting = pcipriv->ndis_adapter.linkctrl_reg; @@ -267,8 +291,7 @@ static void rtl_pci_enable_aspm(struct ieee80211_hw *hw) if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_CLK_REQ) { _rtl_pci_switch_clk_req(hw, (ppsc->reg_rfps_level & - RT_RF_OFF_LEVL_CLK_REQ) ? - PCI_EXP_LNKCTL_CLKREQ_EN : 0); + RT_RF_OFF_LEVL_CLK_REQ) ? 1 : 0); RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_CLK_REQ); } udelay(100); @@ -335,6 +358,22 @@ static bool rtl_pci_check_buddy_priv(struct ieee80211_hw *hw, return tpriv != NULL; } +static void rtl_pci_get_linkcontrol_field(struct ieee80211_hw *hw) +{ + struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); + struct rtl_pci *rtlpci = rtl_pcidev(pcipriv); + u8 capabilityoffset = pcipriv->ndis_adapter.pcibridge_pciehdr_offset; + u8 linkctrl_reg; + u8 num4bbytes; + + num4bbytes = (capabilityoffset + 0x10) / 4; + + /*Read Link Control Register */ + pci_read_config_byte(rtlpci->pdev, (num4bbytes << 2), &linkctrl_reg); + + pcipriv->ndis_adapter.pcibridge_linkctrlreg = linkctrl_reg; +} + static void rtl_pci_parse_configuration(struct pci_dev *pdev, struct ieee80211_hw *hw) { @@ -1994,6 +2033,12 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev, PCI_SLOT(bridge_pdev->devfn); pcipriv->ndis_adapter.pcibridge_funcnum = PCI_FUNC(bridge_pdev->devfn); + pcipriv->ndis_adapter.pcibridge_pciehdr_offset = + pci_pcie_cap(bridge_pdev); + pcipriv->ndis_adapter.num4bytes = + (pcipriv->ndis_adapter.pcibridge_pciehdr_offset + 0x10) / 4; + + rtl_pci_get_linkcontrol_field(hw); if (pcipriv->ndis_adapter.pcibridge_vendor == PCI_BRIDGE_VENDOR_AMD) { @@ -2010,11 +2055,13 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev, pdev->vendor, pcipriv->ndis_adapter.linkctrl_reg); rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, - "pci_bridge busnumber:devnumber:funcnumber:vendor:amd %d:%d:%d:%x:%x\n", + "pci_bridge busnumber:devnumber:funcnumber:vendor:pcie_cap:link_ctl_reg:amd %d:%d:%d:%x:%x:%x:%x\n", pcipriv->ndis_adapter.pcibridge_busnum, pcipriv->ndis_adapter.pcibridge_devnum, pcipriv->ndis_adapter.pcibridge_funcnum, pcibridge_vendors[pcipriv->ndis_adapter.pcibridge_vendor], + pcipriv->ndis_adapter.pcibridge_pciehdr_offset, + pcipriv->ndis_adapter.pcibridge_linkctrlreg, pcipriv->ndis_adapter.amd_l1_patch); rtl_pci_parse_configuration(pdev, hw); diff --git a/drivers/net/wireless/realtek/rtlwifi/pci.h b/drivers/net/wireless/realtek/rtlwifi/pci.h index d6307197dfea..866861626a0a 100644 --- a/drivers/net/wireless/realtek/rtlwifi/pci.h +++ b/drivers/net/wireless/realtek/rtlwifi/pci.h @@ -236,6 +236,11 @@ struct mp_adapter { u16 pcibridge_vendorid; u16 pcibridge_deviceid; + u8 num4bytes; + + u8 pcibridge_pciehdr_offset; + u8 pcibridge_linkctrlreg; + bool amd_l1_patch; }; diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/phy.c b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/phy.c index 0fab3a0c7d49..12d0b3a87af7 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/phy.c +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/phy.c @@ -16,6 +16,12 @@ static u32 _rtl88e_phy_rf_serial_read(struct ieee80211_hw *hw, static void _rtl88e_phy_rf_serial_write(struct ieee80211_hw *hw, enum radio_path rfpath, u32 offset, u32 data); +static u32 _rtl88e_phy_calculate_bit_shift(u32 bitmask) +{ + u32 i = ffs(bitmask); + + return i ? i - 1 : 32; +} static bool _rtl88e_phy_bb8188e_config_parafile(struct ieee80211_hw *hw); static bool _rtl88e_phy_config_mac_with_headerfile(struct ieee80211_hw *hw); static bool phy_config_bb_with_headerfile(struct ieee80211_hw *hw, @@ -45,7 +51,7 @@ u32 rtl88e_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask) rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "regaddr(%#x), bitmask(%#x)\n", regaddr, bitmask); originalvalue = rtl_read_dword(rtlpriv, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl88e_phy_calculate_bit_shift(bitmask); returnvalue = (originalvalue & bitmask) >> bitshift; rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, @@ -68,7 +74,7 @@ void rtl88e_phy_set_bb_reg(struct ieee80211_hw *hw, if (bitmask != MASKDWORD) { originalvalue = rtl_read_dword(rtlpriv, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl88e_phy_calculate_bit_shift(bitmask); data = ((originalvalue & (~bitmask)) | (data << bitshift)); } @@ -93,7 +99,7 @@ u32 rtl88e_phy_query_rf_reg(struct ieee80211_hw *hw, original_value = _rtl88e_phy_rf_serial_read(hw, rfpath, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl88e_phy_calculate_bit_shift(bitmask); readback_value = (original_value & bitmask) >> bitshift; spin_unlock(&rtlpriv->locks.rf_lock); @@ -121,7 +127,7 @@ void rtl88e_phy_set_rf_reg(struct ieee80211_hw *hw, original_value = _rtl88e_phy_rf_serial_read(hw, rfpath, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl88e_phy_calculate_bit_shift(bitmask); data = ((original_value & (~bitmask)) | (data << bitshift)); diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192c/phy_common.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192c/phy_common.c index 144ee780e1b6..3d29c8dbb255 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192c/phy_common.c +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192c/phy_common.c @@ -17,7 +17,7 @@ u32 rtl92c_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask) rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "regaddr(%#x), bitmask(%#x)\n", regaddr, bitmask); originalvalue = rtl_read_dword(rtlpriv, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); returnvalue = (originalvalue & bitmask) >> bitshift; rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, @@ -40,7 +40,7 @@ void rtl92c_phy_set_bb_reg(struct ieee80211_hw *hw, if (bitmask != MASKDWORD) { originalvalue = rtl_read_dword(rtlpriv, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); data = ((originalvalue & (~bitmask)) | (data << bitshift)); } @@ -143,6 +143,14 @@ void _rtl92c_phy_rf_serial_write(struct ieee80211_hw *hw, } EXPORT_SYMBOL(_rtl92c_phy_rf_serial_write); +u32 _rtl92c_phy_calculate_bit_shift(u32 bitmask) +{ + u32 i = ffs(bitmask); + + return i ? i - 1 : 32; +} +EXPORT_SYMBOL(_rtl92c_phy_calculate_bit_shift); + static void _rtl92c_phy_bb_config_1t(struct ieee80211_hw *hw) { rtl_set_bbreg(hw, RFPGA0_TXINFO, 0x3, 0x2); diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192c/phy_common.h b/drivers/net/wireless/realtek/rtlwifi/rtl8192c/phy_common.h index e64d377dfe9e..75afa6253ad0 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192c/phy_common.h +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192c/phy_common.h @@ -196,6 +196,7 @@ bool rtl92c_phy_set_rf_power_state(struct ieee80211_hw *hw, void rtl92ce_phy_set_rf_on(struct ieee80211_hw *hw); void rtl92c_phy_set_io(struct ieee80211_hw *hw); void rtl92c_bb_block_on(struct ieee80211_hw *hw); +u32 _rtl92c_phy_calculate_bit_shift(u32 bitmask); long _rtl92c_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw, enum wireless_mode wirelessmode, u8 txpwridx); diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/phy.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/phy.c index fa70a7d5539f..da54e51badd3 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/phy.c +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/phy.c @@ -39,7 +39,7 @@ u32 rtl92c_phy_query_rf_reg(struct ieee80211_hw *hw, rfpath, regaddr); } - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); readback_value = (original_value & bitmask) >> bitshift; spin_unlock(&rtlpriv->locks.rf_lock); @@ -110,7 +110,7 @@ void rtl92ce_phy_set_rf_reg(struct ieee80211_hw *hw, original_value = _rtl92c_phy_rf_serial_read(hw, rfpath, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); data = ((original_value & (~bitmask)) | (data << bitshift)); @@ -122,7 +122,7 @@ void rtl92ce_phy_set_rf_reg(struct ieee80211_hw *hw, original_value = _rtl92c_phy_fw_rf_serial_read(hw, rfpath, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); data = ((original_value & (~bitmask)) | (data << bitshift)); diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/phy.h b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/phy.h index c7a0d4c776f0..7582a162bd11 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/phy.h +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/phy.h @@ -94,6 +94,7 @@ u32 _rtl92c_phy_rf_serial_read(struct ieee80211_hw *hw, enum radio_path rfpath, u32 offset); u32 _rtl92c_phy_fw_rf_serial_read(struct ieee80211_hw *hw, enum radio_path rfpath, u32 offset); +u32 _rtl92c_phy_calculate_bit_shift(u32 bitmask); void _rtl92c_phy_rf_serial_write(struct ieee80211_hw *hw, enum radio_path rfpath, u32 offset, u32 data); void _rtl92c_phy_fw_rf_serial_write(struct ieee80211_hw *hw, diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/phy.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/phy.c index 0b8cb7e61fd8..a8d9fe269f31 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/phy.c +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/phy.c @@ -32,7 +32,7 @@ u32 rtl92cu_phy_query_rf_reg(struct ieee80211_hw *hw, original_value = _rtl92c_phy_fw_rf_serial_read(hw, rfpath, regaddr); } - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); readback_value = (original_value & bitmask) >> bitshift; rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n", @@ -56,7 +56,7 @@ void rtl92cu_phy_set_rf_reg(struct ieee80211_hw *hw, original_value = _rtl92c_phy_rf_serial_read(hw, rfpath, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); data = ((original_value & (~bitmask)) | (data << bitshift)); @@ -67,7 +67,7 @@ void rtl92cu_phy_set_rf_reg(struct ieee80211_hw *hw, original_value = _rtl92c_phy_fw_rf_serial_read(hw, rfpath, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); data = ((original_value & (~bitmask)) | (data << bitshift)); diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c index d835a27429f0..d18c092b6142 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c @@ -169,6 +169,13 @@ static const u8 channel_all[59] = { 157, 159, 161, 163, 165 }; +static u32 _rtl92d_phy_calculate_bit_shift(u32 bitmask) +{ + u32 i = ffs(bitmask); + + return i ? i - 1 : 32; +} + u32 rtl92d_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask) { struct rtl_priv *rtlpriv = rtl_priv(hw); @@ -191,7 +198,7 @@ u32 rtl92d_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask) } else { originalvalue = rtl_read_dword(rtlpriv, regaddr); } - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92d_phy_calculate_bit_shift(bitmask); returnvalue = (originalvalue & bitmask) >> bitshift; rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "BBR MASK=0x%x Addr[0x%x]=0x%x\n", @@ -223,7 +230,7 @@ void rtl92d_phy_set_bb_reg(struct ieee80211_hw *hw, dbi_direct); else originalvalue = rtl_read_dword(rtlpriv, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92d_phy_calculate_bit_shift(bitmask); data = ((originalvalue & (~bitmask)) | (data << bitshift)); } if (rtlhal->during_mac1init_radioa || rtlhal->during_mac0init_radiob) @@ -310,7 +317,7 @@ u32 rtl92d_phy_query_rf_reg(struct ieee80211_hw *hw, regaddr, rfpath, bitmask); spin_lock(&rtlpriv->locks.rf_lock); original_value = _rtl92d_phy_rf_serial_read(hw, rfpath, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92d_phy_calculate_bit_shift(bitmask); readback_value = (original_value & bitmask) >> bitshift; spin_unlock(&rtlpriv->locks.rf_lock); rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, @@ -336,7 +343,7 @@ void rtl92d_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath, if (bitmask != RFREG_OFFSET_MASK) { original_value = _rtl92d_phy_rf_serial_read(hw, rfpath, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92d_phy_calculate_bit_shift(bitmask); data = ((original_value & (~bitmask)) | (data << bitshift)); } diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/phy.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/phy.c index 73ef602bfb01..cc0bcaf13e96 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/phy.c +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/phy.c @@ -16,6 +16,7 @@ static u32 _rtl92ee_phy_rf_serial_read(struct ieee80211_hw *hw, static void _rtl92ee_phy_rf_serial_write(struct ieee80211_hw *hw, enum radio_path rfpath, u32 offset, u32 data); +static u32 _rtl92ee_phy_calculate_bit_shift(u32 bitmask); static bool _rtl92ee_phy_bb8192ee_config_parafile(struct ieee80211_hw *hw); static bool _rtl92ee_phy_config_mac_with_headerfile(struct ieee80211_hw *hw); static bool phy_config_bb_with_hdr_file(struct ieee80211_hw *hw, @@ -45,7 +46,7 @@ u32 rtl92ee_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask) rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "regaddr(%#x), bitmask(%#x)\n", regaddr, bitmask); originalvalue = rtl_read_dword(rtlpriv, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask); returnvalue = (originalvalue & bitmask) >> bitshift; rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, @@ -67,7 +68,7 @@ void rtl92ee_phy_set_bb_reg(struct ieee80211_hw *hw, u32 regaddr, if (bitmask != MASKDWORD) { originalvalue = rtl_read_dword(rtlpriv, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask); data = ((originalvalue & (~bitmask)) | (data << bitshift)); } @@ -91,7 +92,7 @@ u32 rtl92ee_phy_query_rf_reg(struct ieee80211_hw *hw, spin_lock(&rtlpriv->locks.rf_lock); original_value = _rtl92ee_phy_rf_serial_read(hw , rfpath, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask); readback_value = (original_value & bitmask) >> bitshift; spin_unlock(&rtlpriv->locks.rf_lock); @@ -118,7 +119,7 @@ void rtl92ee_phy_set_rf_reg(struct ieee80211_hw *hw, if (bitmask != RFREG_OFFSET_MASK) { original_value = _rtl92ee_phy_rf_serial_read(hw, rfpath, addr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask); data = (original_value & (~bitmask)) | (data << bitshift); } @@ -200,6 +201,13 @@ static void _rtl92ee_phy_rf_serial_write(struct ieee80211_hw *hw, pphyreg->rf3wire_offset, data_and_addr); } +static u32 _rtl92ee_phy_calculate_bit_shift(u32 bitmask) +{ + u32 i = ffs(bitmask); + + return i ? i - 1 : 32; +} + bool rtl92ee_phy_mac_config(struct ieee80211_hw *hw) { return _rtl92ee_phy_config_mac_with_headerfile(hw); diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192se/phy.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192se/phy.c index 0e2b9698088b..aaa004d4d6d0 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192se/phy.c +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192se/phy.c @@ -14,6 +14,13 @@ #include "hw.h" #include "table.h" +static u32 _rtl92s_phy_calculate_bit_shift(u32 bitmask) +{ + u32 i = ffs(bitmask); + + return i ? i - 1 : 32; +} + u32 rtl92s_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask) { struct rtl_priv *rtlpriv = rtl_priv(hw); @@ -23,7 +30,7 @@ u32 rtl92s_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask) regaddr, bitmask); originalvalue = rtl_read_dword(rtlpriv, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92s_phy_calculate_bit_shift(bitmask); returnvalue = (originalvalue & bitmask) >> bitshift; rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "BBR MASK=0x%x Addr[0x%x]=0x%x\n", @@ -45,7 +52,7 @@ void rtl92s_phy_set_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask, if (bitmask != MASKDWORD) { originalvalue = rtl_read_dword(rtlpriv, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92s_phy_calculate_bit_shift(bitmask); data = ((originalvalue & (~bitmask)) | (data << bitshift)); } @@ -153,7 +160,7 @@ u32 rtl92s_phy_query_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath, original_value = _rtl92s_phy_rf_serial_read(hw, rfpath, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92s_phy_calculate_bit_shift(bitmask); readback_value = (original_value & bitmask) >> bitshift; spin_unlock(&rtlpriv->locks.rf_lock); @@ -184,7 +191,7 @@ void rtl92s_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath, if (bitmask != RFREG_OFFSET_MASK) { original_value = _rtl92s_phy_rf_serial_read(hw, rfpath, regaddr); - bitshift = calculate_bit_shift(bitmask); + bitshift = _rtl92s_phy_calculate_bit_shift(bitmask); data = ((original_value & (~bitmask)) | (data << bitshift)); } diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/phy.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/phy.c index fa1839d8ee55..5323ead30db0 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/phy.c +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/phy.c @@ -29,10 +29,9 @@ static void _rtl8821ae_phy_rf_serial_write(struct ieee80211_hw *hw, u32 data); static u32 _rtl8821ae_phy_calculate_bit_shift(u32 bitmask) { - if (WARN_ON_ONCE(!bitmask)) - return 0; + u32 i = ffs(bitmask); - return __ffs(bitmask); + return i ? i - 1 : 32; } static bool _rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw *hw); /*static bool _rtl8812ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);*/ diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h b/drivers/net/wireless/realtek/rtlwifi/wifi.h index 0bac788ccd6e..31f9e9e5c680 100644 --- a/drivers/net/wireless/realtek/rtlwifi/wifi.h +++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h @@ -3105,11 +3105,4 @@ static inline struct ieee80211_sta *rtl_find_sta(struct ieee80211_hw *hw, return ieee80211_find_sta(mac->vif, mac_addr); } -static inline u32 calculate_bit_shift(u32 bitmask) -{ - if (WARN_ON_ONCE(!bitmask)) - return 0; - - return __ffs(bitmask); -} #endif diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c index 0970d6bcba43..fabca307867a 100644 --- a/drivers/net/wireless/realtek/rtw88/mac80211.c +++ b/drivers/net/wireless/realtek/rtw88/mac80211.c @@ -266,9 +266,9 @@ static void rtw_ops_configure_filter(struct ieee80211_hw *hw, if (changed_flags & FIF_ALLMULTI) { if (*new_flags & FIF_ALLMULTI) - rtwdev->hal.rcr |= BIT_AM; + rtwdev->hal.rcr |= BIT_AM | BIT_AB; else - rtwdev->hal.rcr &= ~(BIT_AM); + rtwdev->hal.rcr &= ~(BIT_AM | BIT_AB); } if (changed_flags & FIF_FCSFAIL) { if (*new_flags & FIF_FCSFAIL) diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 271604098574..c3a8d78a41a7 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c @@ -463,25 +463,12 @@ static void xenvif_get_requests(struct xenvif_queue *queue, } for (shinfo->nr_frags = 0; nr_slots > 0 && shinfo->nr_frags < MAX_SKB_FRAGS; - nr_slots--) { - if (unlikely(!txp->size)) { - unsigned long flags; - - spin_lock_irqsave(&queue->response_lock, flags); - make_tx_response(queue, txp, 0, XEN_NETIF_RSP_OKAY); - push_tx_responses(queue); - spin_unlock_irqrestore(&queue->response_lock, flags); - ++txp; - continue; - } - + shinfo->nr_frags++, gop++, nr_slots--) { index = pending_index(queue->pending_cons++); pending_idx = queue->pending_ring[index]; xenvif_tx_create_map_op(queue, pending_idx, txp, txp == first ? extra_count : 0, gop); frag_set_pending_idx(&frags[shinfo->nr_frags], pending_idx); - ++shinfo->nr_frags; - ++gop; if (txp == first) txp = txfrags; @@ -494,39 +481,20 @@ static void xenvif_get_requests(struct xenvif_queue *queue, shinfo = skb_shinfo(nskb); frags = shinfo->frags; - for (shinfo->nr_frags = 0; shinfo->nr_frags < nr_slots; ++txp) { - if (unlikely(!txp->size)) { - unsigned long flags; - - spin_lock_irqsave(&queue->response_lock, flags); - make_tx_response(queue, txp, 0, - XEN_NETIF_RSP_OKAY); - push_tx_responses(queue); - spin_unlock_irqrestore(&queue->response_lock, - flags); - continue; - } - + for (shinfo->nr_frags = 0; shinfo->nr_frags < nr_slots; + shinfo->nr_frags++, txp++, gop++) { index = pending_index(queue->pending_cons++); pending_idx = queue->pending_ring[index]; xenvif_tx_create_map_op(queue, pending_idx, txp, 0, gop); frag_set_pending_idx(&frags[shinfo->nr_frags], pending_idx); - ++shinfo->nr_frags; - ++gop; } - if (shinfo->nr_frags) { - skb_shinfo(skb)->frag_list = nskb; - nskb = NULL; - } - } - - if (nskb) { + skb_shinfo(skb)->frag_list = nskb; + } else if (nskb) { /* A frag_list skb was allocated but it is no longer needed - * because enough slots were converted to copy ops above or some - * were empty. + * because enough slots were converted to copy ops above. */ kfree_skb(nskb); } diff --git a/drivers/nvme/host/auth.c b/drivers/nvme/host/auth.c index 69aef668f105..9dfd3d029305 100644 --- a/drivers/nvme/host/auth.c +++ b/drivers/nvme/host/auth.c @@ -834,8 +834,6 @@ static void nvme_queue_auth_work(struct work_struct *work) } fail2: - if (chap->status == 0) - chap->status = NVME_AUTH_DHCHAP_FAILURE_FAILED; dev_dbg(ctrl->device, "%s: qid %d send failure2, status %x\n", __func__, chap->qid, chap->status); tl = nvme_auth_set_dhchap_failure2_data(ctrl, chap); diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 36531ac0d630..8f69f83e277d 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -1511,8 +1511,7 @@ static int nvme_ns_info_from_identify(struct nvme_ctrl *ctrl, if (id->ncap == 0) { /* namespace not allocated or attached */ info->is_removed = true; - ret = -ENODEV; - goto error; + return -ENODEV; } info->anagrpid = id->anagrpid; @@ -1530,10 +1529,8 @@ static int nvme_ns_info_from_identify(struct nvme_ctrl *ctrl, !memchr_inv(ids->nguid, 0, sizeof(ids->nguid))) memcpy(ids->nguid, id->nguid, sizeof(ids->nguid)); } - -error: kfree(id); - return ret; + return 0; } static int nvme_ns_info_from_id_cs_indep(struct nvme_ctrl *ctrl, @@ -1848,18 +1845,16 @@ set_pi: return ret; } -static int nvme_configure_metadata(struct nvme_ns *ns, struct nvme_id_ns *id) +static void nvme_configure_metadata(struct nvme_ns *ns, struct nvme_id_ns *id) { struct nvme_ctrl *ctrl = ns->ctrl; - int ret; - ret = nvme_init_ms(ns, id); - if (ret) - return ret; + if (nvme_init_ms(ns, id)) + return; ns->features &= ~(NVME_NS_METADATA_SUPPORTED | NVME_NS_EXT_LBAS); if (!ns->ms || !(ctrl->ops->flags & NVME_F_METADATA_SUPPORTED)) - return 0; + return; if (ctrl->ops->flags & NVME_F_FABRICS) { /* @@ -1868,7 +1863,7 @@ static int nvme_configure_metadata(struct nvme_ns *ns, struct nvme_id_ns *id) * remap the separate metadata buffer from the block layer. */ if (WARN_ON_ONCE(!(id->flbas & NVME_NS_FLBAS_META_EXT))) - return 0; + return; ns->features |= NVME_NS_EXT_LBAS; @@ -1895,7 +1890,6 @@ static int nvme_configure_metadata(struct nvme_ns *ns, struct nvme_id_ns *id) else ns->features |= NVME_NS_METADATA_SUPPORTED; } - return 0; } static void nvme_set_queue_limits(struct nvme_ctrl *ctrl, @@ -1925,10 +1919,9 @@ static void nvme_update_disk_info(struct gendisk *disk, /* * The block layer can't support LBA sizes larger than the page size - * or smaller than a sector size yet, so catch this early and don't - * allow block I/O. + * yet, so catch this early and don't allow block I/O. */ - if (ns->lba_shift > PAGE_SHIFT || ns->lba_shift < SECTOR_SHIFT) { + if (ns->lba_shift > PAGE_SHIFT) { capacity = 0; bs = (1 << 9); } @@ -2077,11 +2070,7 @@ static int nvme_update_ns_info_block(struct nvme_ns *ns, ns->lba_shift = id->lbaf[lbaf].ds; nvme_set_queue_limits(ns->ctrl, ns->queue); - ret = nvme_configure_metadata(ns, id); - if (ret < 0) { - blk_mq_unfreeze_queue(ns->disk->queue); - goto out; - } + nvme_configure_metadata(ns, id); nvme_set_chunk_sectors(ns, id); nvme_update_disk_info(ns->disk, ns, id); @@ -4839,8 +4828,6 @@ static void nvme_fw_act_work(struct work_struct *work) struct nvme_ctrl, fw_act_work); unsigned long fw_act_timeout; - nvme_auth_stop(ctrl); - if (ctrl->mtfa) fw_act_timeout = jiffies + msecs_to_jiffies(ctrl->mtfa * 100); @@ -4896,6 +4883,7 @@ static bool nvme_handle_aen_notice(struct nvme_ctrl *ctrl, u32 result) * firmware activation. */ if (nvme_change_ctrl_state(ctrl, NVME_CTRL_RESETTING)) { + nvme_auth_stop(ctrl); requeue = false; queue_work(nvme_wq, &ctrl->fw_act_work); } diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index a892d679e338..118bf08a708b 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -382,11 +382,6 @@ struct nvme_ctrl { enum nvme_dctype dctype; }; -static inline enum nvme_ctrl_state nvme_ctrl_state(struct nvme_ctrl *ctrl) -{ - return READ_ONCE(ctrl->state); -} - enum nvme_iopolicy { NVME_IOPOLICY_NUMA, NVME_IOPOLICY_RR, diff --git a/drivers/nvme/target/configfs.c b/drivers/nvme/target/configfs.c index 73ae16059a1c..6a2816f3b4e8 100644 --- a/drivers/nvme/target/configfs.c +++ b/drivers/nvme/target/configfs.c @@ -16,7 +16,6 @@ #endif #include #include -#include #include "nvmet.h" @@ -509,7 +508,6 @@ static ssize_t nvmet_ns_ana_grpid_store(struct config_item *item, down_write(&nvmet_ana_sem); oldgrpid = ns->anagrpid; - newgrpid = array_index_nospec(newgrpid, NVMET_MAX_ANAGRPS); nvmet_ana_group_enabled[newgrpid]++; ns->anagrpid = newgrpid; nvmet_ana_group_enabled[oldgrpid]--; @@ -1582,7 +1580,6 @@ static struct config_group *nvmet_ana_groups_make_group( grp->grpid = grpid; down_write(&nvmet_ana_sem); - grpid = array_index_nospec(grpid, NVMET_MAX_ANAGRPS); nvmet_ana_group_enabled[grpid]++; up_write(&nvmet_ana_sem); diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c index ce42afe8f64e..355d80323b83 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -18,7 +18,6 @@ #include "nvmet.h" #define NVMET_TCP_DEF_INLINE_DATA_SIZE (4 * PAGE_SIZE) -#define NVMET_TCP_MAXH2CDATA 0x400000 /* 16M arbitrary limit */ /* Define the socket priority to use for connections were it is desirable * that the NIC consider performing optimized packet processing or filtering. @@ -862,7 +861,7 @@ static int nvmet_tcp_handle_icreq(struct nvmet_tcp_queue *queue) icresp->hdr.pdo = 0; icresp->hdr.plen = cpu_to_le32(icresp->hdr.hlen); icresp->pfv = cpu_to_le16(NVME_TCP_PFV_1_0); - icresp->maxdata = cpu_to_le32(NVMET_TCP_MAXH2CDATA); + icresp->maxdata = cpu_to_le32(0x400000); /* 16M arbitrary limit */ icresp->cpda = 0; if (queue->hdr_digest) icresp->digest |= NVME_TCP_HDR_DIGEST_ENABLE; @@ -915,7 +914,6 @@ static int nvmet_tcp_handle_h2c_data_pdu(struct nvmet_tcp_queue *queue) { struct nvme_tcp_data_pdu *data = &queue->pdu.data; struct nvmet_tcp_cmd *cmd; - unsigned int exp_data_len; if (likely(queue->nr_cmds)) { if (unlikely(data->ttag >= queue->nr_cmds)) { @@ -934,24 +932,12 @@ static int nvmet_tcp_handle_h2c_data_pdu(struct nvmet_tcp_queue *queue) data->ttag, le32_to_cpu(data->data_offset), cmd->rbytes_done); /* FIXME: use path and transport errors */ - nvmet_tcp_fatal_error(queue); + nvmet_req_complete(&cmd->req, + NVME_SC_INVALID_FIELD | NVME_SC_DNR); return -EPROTO; } - exp_data_len = le32_to_cpu(data->hdr.plen) - - nvmet_tcp_hdgst_len(queue) - - nvmet_tcp_ddgst_len(queue) - - sizeof(*data); - cmd->pdu_len = le32_to_cpu(data->data_length); - if (unlikely(cmd->pdu_len != exp_data_len || - cmd->pdu_len == 0 || - cmd->pdu_len > NVMET_TCP_MAXH2CDATA)) { - pr_err("H2CData PDU len %u is invalid\n", cmd->pdu_len); - /* FIXME: use proper transport errors */ - nvmet_tcp_fatal_error(queue); - return -EPROTO; - } cmd->pdu_recv = 0; nvmet_tcp_build_pdu_iovec(cmd); queue->cmd = cmd; diff --git a/drivers/nvme/target/trace.h b/drivers/nvme/target/trace.h index 974d99d47f51..6109b3806b12 100644 --- a/drivers/nvme/target/trace.h +++ b/drivers/nvme/target/trace.h @@ -53,7 +53,8 @@ static inline void __assign_req_name(char *name, struct nvmet_req *req) return; } - strscpy_pad(name, req->ns->device_path, DISK_NAME_LEN); + strncpy(name, req->ns->device_path, + min_t(size_t, DISK_NAME_LEN, strlen(req->ns->device_path))); } #endif @@ -84,7 +85,7 @@ TRACE_EVENT(nvmet_req_init, __entry->flags = cmd->common.flags; __entry->nsid = le32_to_cpu(cmd->common.nsid); __entry->metadata = le64_to_cpu(cmd->common.metadata); - memcpy(__entry->cdw10, &cmd->common.cdws, + memcpy(__entry->cdw10, &cmd->common.cdw10, sizeof(__entry->cdw10)); ), TP_printk("nvmet%s: %sqid=%d, cmdid=%u, nsid=%u, flags=%#x, " diff --git a/drivers/of/base.c b/drivers/of/base.c index f849bbb9ef8c..d5a5c35eba72 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -1646,7 +1646,6 @@ int of_parse_phandle_with_args_map(const struct device_node *np, out_args->np = new; of_node_put(cur); cur = new; - new = NULL; } put: of_node_put(cur); diff --git a/drivers/of/unittest-data/tests-phandle.dtsi b/drivers/of/unittest-data/tests-phandle.dtsi index aa0d7027ffa6..6b33be4c4416 100644 --- a/drivers/of/unittest-data/tests-phandle.dtsi +++ b/drivers/of/unittest-data/tests-phandle.dtsi @@ -38,13 +38,6 @@ phandle-map-pass-thru = <0x0 0xf0>; }; - provider5: provider5 { - #phandle-cells = <2>; - phandle-map = <2 7 &provider4 2 3>; - phandle-map-mask = <0xff 0xf>; - phandle-map-pass-thru = <0x0 0xf0>; - }; - consumer-a { phandle-list = <&provider1 1>, <&provider2 2 0>, @@ -71,8 +64,7 @@ <&provider4 4 0x100>, <&provider4 0 0x61>, <&provider0>, - <&provider4 19 0x20>, - <&provider5 2 7>; + <&provider4 19 0x20>; phandle-list-bad-phandle = <12345678 0 0>; phandle-list-bad-args = <&provider2 1 0>, <&provider4 0>; diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c index e541a8960f1d..edd2342598e4 100644 --- a/drivers/of/unittest.c +++ b/drivers/of/unittest.c @@ -448,9 +448,6 @@ static void __init of_unittest_parse_phandle_with_args(void) unittest(passed, "index %i - data error on node %pOF rc=%i\n", i, args.np, rc); - - if (rc == 0) - of_node_put(args.np); } /* Check for missing list property */ @@ -540,9 +537,8 @@ static void __init of_unittest_parse_phandle_with_args(void) static void __init of_unittest_parse_phandle_with_args_map(void) { - struct device_node *np, *p[6] = {}; + struct device_node *np, *p0, *p1, *p2, *p3; struct of_phandle_args args; - unsigned int prefs[6]; int i, rc; np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-b"); @@ -551,24 +547,34 @@ static void __init of_unittest_parse_phandle_with_args_map(void) return; } - p[0] = of_find_node_by_path("/testcase-data/phandle-tests/provider0"); - p[1] = of_find_node_by_path("/testcase-data/phandle-tests/provider1"); - p[2] = of_find_node_by_path("/testcase-data/phandle-tests/provider2"); - p[3] = of_find_node_by_path("/testcase-data/phandle-tests/provider3"); - p[4] = of_find_node_by_path("/testcase-data/phandle-tests/provider4"); - p[5] = of_find_node_by_path("/testcase-data/phandle-tests/provider5"); - for (i = 0; i < ARRAY_SIZE(p); ++i) { - if (!p[i]) { - pr_err("missing testcase data\n"); - return; - } - prefs[i] = kref_read(&p[i]->kobj.kref); + p0 = of_find_node_by_path("/testcase-data/phandle-tests/provider0"); + if (!p0) { + pr_err("missing testcase data\n"); + return; + } + + p1 = of_find_node_by_path("/testcase-data/phandle-tests/provider1"); + if (!p1) { + pr_err("missing testcase data\n"); + return; + } + + p2 = of_find_node_by_path("/testcase-data/phandle-tests/provider2"); + if (!p2) { + pr_err("missing testcase data\n"); + return; + } + + p3 = of_find_node_by_path("/testcase-data/phandle-tests/provider3"); + if (!p3) { + pr_err("missing testcase data\n"); + return; } rc = of_count_phandle_with_args(np, "phandle-list", "#phandle-cells"); - unittest(rc == 8, "of_count_phandle_with_args() returned %i, expected 8\n", rc); + unittest(rc == 7, "of_count_phandle_with_args() returned %i, expected 7\n", rc); - for (i = 0; i < 9; i++) { + for (i = 0; i < 8; i++) { bool passed = true; memset(&args, 0, sizeof(args)); @@ -579,13 +585,13 @@ static void __init of_unittest_parse_phandle_with_args_map(void) switch (i) { case 0: passed &= !rc; - passed &= (args.np == p[1]); + passed &= (args.np == p1); passed &= (args.args_count == 1); passed &= (args.args[0] == 1); break; case 1: passed &= !rc; - passed &= (args.np == p[3]); + passed &= (args.np == p3); passed &= (args.args_count == 3); passed &= (args.args[0] == 2); passed &= (args.args[1] == 5); @@ -596,36 +602,28 @@ static void __init of_unittest_parse_phandle_with_args_map(void) break; case 3: passed &= !rc; - passed &= (args.np == p[0]); + passed &= (args.np == p0); passed &= (args.args_count == 0); break; case 4: passed &= !rc; - passed &= (args.np == p[1]); + passed &= (args.np == p1); passed &= (args.args_count == 1); passed &= (args.args[0] == 3); break; case 5: passed &= !rc; - passed &= (args.np == p[0]); + passed &= (args.np == p0); passed &= (args.args_count == 0); break; case 6: passed &= !rc; - passed &= (args.np == p[2]); + passed &= (args.np == p2); passed &= (args.args_count == 2); passed &= (args.args[0] == 15); passed &= (args.args[1] == 0x20); break; case 7: - passed &= !rc; - passed &= (args.np == p[3]); - passed &= (args.args_count == 3); - passed &= (args.args[0] == 2); - passed &= (args.args[1] == 5); - passed &= (args.args[2] == 3); - break; - case 8: passed &= (rc == -ENOENT); break; default: @@ -634,9 +632,6 @@ static void __init of_unittest_parse_phandle_with_args_map(void) unittest(passed, "index %i - data error on node %s rc=%i\n", i, args.np->full_name, rc); - - if (rc == 0) - of_node_put(args.np); } /* Check for missing list property */ @@ -683,13 +678,6 @@ static void __init of_unittest_parse_phandle_with_args_map(void) "OF: /testcase-data/phandle-tests/consumer-b: #phandle-cells = 2 found 1"); unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc); - - for (i = 0; i < ARRAY_SIZE(p); ++i) { - unittest(prefs[i] == kref_read(&p[i]->kobj.kref), - "provider%d: expected:%d got:%d\n", - i, prefs[i], kref_read(&p[i]->kobj.kref)); - of_node_put(p[i]); - } } static void __init of_unittest_property_string(void) diff --git a/drivers/parport/parport_serial.c b/drivers/parport/parport_serial.c index 3644997a8342..9f5d784cd95d 100644 --- a/drivers/parport/parport_serial.c +++ b/drivers/parport/parport_serial.c @@ -65,10 +65,6 @@ enum parport_pc_pci_cards { sunix_5069a, sunix_5079a, sunix_5099a, - brainboxes_uc257, - brainboxes_is300, - brainboxes_uc414, - brainboxes_px263, }; /* each element directly indexed from enum list, above */ @@ -162,10 +158,6 @@ static struct parport_pc_pci cards[] = { /* sunix_5069a */ { 1, { { 1, 2 }, } }, /* sunix_5079a */ { 1, { { 1, 2 }, } }, /* sunix_5099a */ { 1, { { 1, 2 }, } }, - /* brainboxes_uc257 */ { 1, { { 3, -1 }, } }, - /* brainboxes_is300 */ { 1, { { 3, -1 }, } }, - /* brainboxes_uc414 */ { 1, { { 3, -1 }, } }, - /* brainboxes_px263 */ { 1, { { 3, -1 }, } }, }; static struct pci_device_id parport_serial_pci_tbl[] = { @@ -285,38 +277,6 @@ static struct pci_device_id parport_serial_pci_tbl[] = { { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999, PCI_VENDOR_ID_SUNIX, 0x0104, 0, 0, sunix_5099a }, - /* Brainboxes UC-203 */ - { PCI_VENDOR_ID_INTASHIELD, 0x0bc1, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 }, - { PCI_VENDOR_ID_INTASHIELD, 0x0bc2, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 }, - - /* Brainboxes UC-257 */ - { PCI_VENDOR_ID_INTASHIELD, 0x0861, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 }, - { PCI_VENDOR_ID_INTASHIELD, 0x0862, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 }, - { PCI_VENDOR_ID_INTASHIELD, 0x0863, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 }, - - /* Brainboxes UC-414 */ - { PCI_VENDOR_ID_INTASHIELD, 0x0e61, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc414 }, - - /* Brainboxes UC-475 */ - { PCI_VENDOR_ID_INTASHIELD, 0x0981, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 }, - { PCI_VENDOR_ID_INTASHIELD, 0x0982, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 }, - - /* Brainboxes IS-300/IS-500 */ - { PCI_VENDOR_ID_INTASHIELD, 0x0da0, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_is300 }, - - /* Brainboxes PX-263/PX-295 */ - { PCI_VENDOR_ID_INTASHIELD, 0x402c, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_px263 }, - { 0, } /* terminate list */ }; MODULE_DEVICE_TABLE(pci,parport_serial_pci_tbl); @@ -582,30 +542,6 @@ static struct pciserial_board pci_parport_serial_boards[] = { .base_baud = 921600, .uart_offset = 0x8, }, - [brainboxes_uc257] = { - .flags = FL_BASE2, - .num_ports = 2, - .base_baud = 115200, - .uart_offset = 8, - }, - [brainboxes_is300] = { - .flags = FL_BASE2, - .num_ports = 1, - .base_baud = 115200, - .uart_offset = 8, - }, - [brainboxes_uc414] = { - .flags = FL_BASE2, - .num_ports = 4, - .base_baud = 115200, - .uart_offset = 8, - }, - [brainboxes_px263] = { - .flags = FL_BASE2, - .num_ports = 4, - .base_baud = 921600, - .uart_offset = 8, - }, }; struct parport_serial_private { diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c index 7ecad72cff7e..d2634dafb68e 100644 --- a/drivers/pci/controller/dwc/pci-keystone.c +++ b/drivers/pci/controller/dwc/pci-keystone.c @@ -1219,16 +1219,7 @@ static int ks_pcie_probe(struct platform_device *pdev) goto err_link; } - /* Obtain references to the PHYs */ - for (i = 0; i < num_lanes; i++) - phy_pm_runtime_get_sync(ks_pcie->phy[i]); - ret = ks_pcie_enable_phy(ks_pcie); - - /* Release references to the PHYs */ - for (i = 0; i < num_lanes; i++) - phy_pm_runtime_put_sync(ks_pcie->phy[i]); - if (ret) { dev_err(dev, "failed to enable phy\n"); goto err_link; diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c index 59c164b5c64a..83ddb190292e 100644 --- a/drivers/pci/controller/dwc/pcie-designware-ep.c +++ b/drivers/pci/controller/dwc/pcie-designware-ep.c @@ -600,7 +600,6 @@ int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no, } aligned_offset = msg_addr & (epc->mem->window.page_size - 1); - msg_addr &= ~aligned_offset; ret = dw_pcie_ep_map_addr(epc, func_no, 0, ep->msi_mem_phys, msg_addr, epc->mem->window.page_size); if (ret) diff --git a/drivers/pci/controller/pci-loongson.c b/drivers/pci/controller/pci-loongson.c index a860f25473df..fe0f732f6e43 100644 --- a/drivers/pci/controller/pci-loongson.c +++ b/drivers/pci/controller/pci-loongson.c @@ -80,49 +80,13 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON, DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON, DEV_LS7A_LPC, system_bus_quirk); -/* - * Some Loongson PCIe ports have hardware limitations on their Maximum Read - * Request Size. They can't handle anything larger than this. Sane - * firmware will set proper MRRS at boot, so we only need no_inc_mrrs for - * bridges. However, some MIPS Loongson firmware doesn't set MRRS properly, - * so we have to enforce maximum safe MRRS, which is 256 bytes. - */ -#ifdef CONFIG_MIPS -static void loongson_set_min_mrrs_quirk(struct pci_dev *pdev) -{ - struct pci_bus *bus = pdev->bus; - struct pci_dev *bridge; - static const struct pci_device_id bridge_devids[] = { - { PCI_VDEVICE(LOONGSON, DEV_LS2K_PCIE_PORT0) }, - { PCI_VDEVICE(LOONGSON, DEV_LS7A_PCIE_PORT0) }, - { PCI_VDEVICE(LOONGSON, DEV_LS7A_PCIE_PORT1) }, - { PCI_VDEVICE(LOONGSON, DEV_LS7A_PCIE_PORT2) }, - { PCI_VDEVICE(LOONGSON, DEV_LS7A_PCIE_PORT3) }, - { PCI_VDEVICE(LOONGSON, DEV_LS7A_PCIE_PORT4) }, - { PCI_VDEVICE(LOONGSON, DEV_LS7A_PCIE_PORT5) }, - { PCI_VDEVICE(LOONGSON, DEV_LS7A_PCIE_PORT6) }, - { 0, }, - }; - - /* look for the matching bridge */ - while (!pci_is_root_bus(bus)) { - bridge = bus->self; - bus = bus->parent; - - if (pci_match_id(bridge_devids, bridge)) { - if (pcie_get_readrq(pdev) > 256) { - pci_info(pdev, "limiting MRRS to 256\n"); - pcie_set_readrq(pdev, 256); - } - break; - } - } -} -DECLARE_PCI_FIXUP_ENABLE(PCI_ANY_ID, PCI_ANY_ID, loongson_set_min_mrrs_quirk); -#endif - static void loongson_mrrs_quirk(struct pci_dev *pdev) { + /* + * Some Loongson PCIe ports have h/w limitations of maximum read + * request size. They can't handle anything larger than this. So + * force this limit on any devices attached under these ports. + */ struct pci_host_bridge *bridge = pci_find_host_bridge(pdev->bus); bridge->no_inc_mrrs = 1; diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c b/drivers/pci/controller/pcie-mediatek-gen3.c index 40c38ca5a42e..b8612ce5f4d0 100644 --- a/drivers/pci/controller/pcie-mediatek-gen3.c +++ b/drivers/pci/controller/pcie-mediatek-gen3.c @@ -245,60 +245,35 @@ static int mtk_pcie_set_trans_table(struct mtk_gen3_pcie *pcie, resource_size_t cpu_addr, resource_size_t pci_addr, resource_size_t size, - unsigned long type, int *num) + unsigned long type, int num) { - resource_size_t remaining = size; - resource_size_t table_size; - resource_size_t addr_align; - const char *range_type; void __iomem *table; u32 val; - while (remaining && (*num < PCIE_MAX_TRANS_TABLES)) { - /* Table size needs to be a power of 2 */ - table_size = BIT(fls(remaining) - 1); - - if (cpu_addr > 0) { - addr_align = BIT(ffs(cpu_addr) - 1); - table_size = min(table_size, addr_align); - } - - /* Minimum size of translate table is 4KiB */ - if (table_size < 0x1000) { - dev_err(pcie->dev, "illegal table size %#llx\n", - (unsigned long long)table_size); - return -EINVAL; - } - - table = pcie->base + PCIE_TRANS_TABLE_BASE_REG + *num * PCIE_ATR_TLB_SET_OFFSET; - writel_relaxed(lower_32_bits(cpu_addr) | PCIE_ATR_SIZE(fls(table_size) - 1), table); - writel_relaxed(upper_32_bits(cpu_addr), table + PCIE_ATR_SRC_ADDR_MSB_OFFSET); - writel_relaxed(lower_32_bits(pci_addr), table + PCIE_ATR_TRSL_ADDR_LSB_OFFSET); - writel_relaxed(upper_32_bits(pci_addr), table + PCIE_ATR_TRSL_ADDR_MSB_OFFSET); - - if (type == IORESOURCE_IO) { - val = PCIE_ATR_TYPE_IO | PCIE_ATR_TLP_TYPE_IO; - range_type = "IO"; - } else { - val = PCIE_ATR_TYPE_MEM | PCIE_ATR_TLP_TYPE_MEM; - range_type = "MEM"; - } - - writel_relaxed(val, table + PCIE_ATR_TRSL_PARAM_OFFSET); - - dev_dbg(pcie->dev, "set %s trans window[%d]: cpu_addr = %#llx, pci_addr = %#llx, size = %#llx\n", - range_type, *num, (unsigned long long)cpu_addr, - (unsigned long long)pci_addr, (unsigned long long)table_size); - - cpu_addr += table_size; - pci_addr += table_size; - remaining -= table_size; - (*num)++; + if (num >= PCIE_MAX_TRANS_TABLES) { + dev_err(pcie->dev, "not enough translate table for addr: %#llx, limited to [%d]\n", + (unsigned long long)cpu_addr, PCIE_MAX_TRANS_TABLES); + return -ENODEV; } - if (remaining) - dev_warn(pcie->dev, "not enough translate table for addr: %#llx, limited to [%d]\n", - (unsigned long long)cpu_addr, PCIE_MAX_TRANS_TABLES); + table = pcie->base + PCIE_TRANS_TABLE_BASE_REG + + num * PCIE_ATR_TLB_SET_OFFSET; + + writel_relaxed(lower_32_bits(cpu_addr) | PCIE_ATR_SIZE(fls(size) - 1), + table); + writel_relaxed(upper_32_bits(cpu_addr), + table + PCIE_ATR_SRC_ADDR_MSB_OFFSET); + writel_relaxed(lower_32_bits(pci_addr), + table + PCIE_ATR_TRSL_ADDR_LSB_OFFSET); + writel_relaxed(upper_32_bits(pci_addr), + table + PCIE_ATR_TRSL_ADDR_MSB_OFFSET); + + if (type == IORESOURCE_IO) + val = PCIE_ATR_TYPE_IO | PCIE_ATR_TLP_TYPE_IO; + else + val = PCIE_ATR_TYPE_MEM | PCIE_ATR_TLP_TYPE_MEM; + + writel_relaxed(val, table + PCIE_ATR_TRSL_PARAM_OFFSET); return 0; } @@ -405,20 +380,30 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie) resource_size_t cpu_addr; resource_size_t pci_addr; resource_size_t size; + const char *range_type; - if (type == IORESOURCE_IO) + if (type == IORESOURCE_IO) { cpu_addr = pci_pio_to_address(res->start); - else if (type == IORESOURCE_MEM) + range_type = "IO"; + } else if (type == IORESOURCE_MEM) { cpu_addr = res->start; - else + range_type = "MEM"; + } else { continue; + } pci_addr = res->start - entry->offset; size = resource_size(res); err = mtk_pcie_set_trans_table(pcie, cpu_addr, pci_addr, size, - type, &table_index); + type, table_index); if (err) return err; + + dev_dbg(pcie->dev, "set %s trans window[%d]: cpu_addr = %#llx, pci_addr = %#llx, size = %#llx\n", + range_type, table_index, (unsigned long long)cpu_addr, + (unsigned long long)pci_addr, (unsigned long long)size); + + table_index++; } return 0; diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c index 11bdef206d12..ae5ad05ddc1d 100644 --- a/drivers/pci/controller/pcie-mediatek.c +++ b/drivers/pci/controller/pcie-mediatek.c @@ -617,18 +617,12 @@ static void mtk_pcie_intr_handler(struct irq_desc *desc) if (status & MSI_STATUS){ unsigned long imsi_status; - /* - * The interrupt status can be cleared even if the - * MSI status remains pending. As such, given the - * edge-triggered interrupt type, its status should - * be cleared before being dispatched to the - * handler of the underlying device. - */ - writel(MSI_STATUS, port->base + PCIE_INT_STATUS); while ((imsi_status = readl(port->base + PCIE_IMSI_STATUS))) { for_each_set_bit(bit, &imsi_status, MTK_MSI_IRQS_NUM) generic_handle_domain_irq(port->inner_domain, bit); } + /* Clear MSI interrupt status */ + writel(MSI_STATUS, port->base + PCIE_INT_STATUS); } } diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index 6efa3d8db9a5..ea0195337bab 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c @@ -504,12 +504,15 @@ static void enable_slot(struct acpiphp_slot *slot, bool bridge) if (pass && dev->subordinate) { check_hotplug_bridge(slot, dev); pcibios_resource_survey_bus(dev->subordinate); - __pci_bus_size_bridges(dev->subordinate, - &add_list); + if (pci_is_root_bus(bus)) + __pci_bus_size_bridges(dev->subordinate, &add_list); } } } - __pci_bus_assign_resources(bus, &add_list, NULL); + if (pci_is_root_bus(bus)) + __pci_bus_assign_resources(bus, &add_list, NULL); + else + pci_assign_unassigned_bridge_resources(bus->self); } acpiphp_sanitize_bus(bus); diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 5368a37154cf..8df156c28aad 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -1302,9 +1302,6 @@ static int pci_set_full_power_state(struct pci_dev *dev) pci_restore_bars(dev); } - if (dev->bus->self) - pcie_aspm_pm_state_change(dev->bus->self); - return 0; } @@ -1399,9 +1396,6 @@ static int pci_set_low_power_state(struct pci_dev *dev, pci_power_t state) pci_power_name(dev->current_state), pci_power_name(state)); - if (dev->bus->self) - pcie_aspm_pm_state_change(dev->bus->self); - return 0; } diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index a39889f2b222..02effb2c918e 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -567,12 +567,10 @@ bool pcie_wait_for_link(struct pci_dev *pdev, bool active); #ifdef CONFIG_PCIEASPM void pcie_aspm_init_link_state(struct pci_dev *pdev); void pcie_aspm_exit_link_state(struct pci_dev *pdev); -void pcie_aspm_pm_state_change(struct pci_dev *pdev); void pcie_aspm_powersave_config_link(struct pci_dev *pdev); #else static inline void pcie_aspm_init_link_state(struct pci_dev *pdev) { } static inline void pcie_aspm_exit_link_state(struct pci_dev *pdev) { } -static inline void pcie_aspm_pm_state_change(struct pci_dev *pdev) { } static inline void pcie_aspm_powersave_config_link(struct pci_dev *pdev) { } #endif diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index 25736d408e88..5d1756f53ba8 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -1055,25 +1055,6 @@ void pcie_aspm_exit_link_state(struct pci_dev *pdev) up_read(&pci_bus_sem); } -/* @pdev: the root port or switch downstream port */ -void pcie_aspm_pm_state_change(struct pci_dev *pdev) -{ - struct pcie_link_state *link = pdev->link_state; - - if (aspm_disabled || !link) - return; - /* - * Devices changed PM state, we should recheck if latency - * meets all functions' requirement - */ - down_read(&pci_bus_sem); - mutex_lock(&aspm_lock); - pcie_update_aspm_capable(link->root); - pcie_config_aspm_path(link); - mutex_unlock(&aspm_lock); - up_read(&pci_bus_sem); -} - void pcie_aspm_powersave_config_link(struct pci_dev *pdev) { struct pcie_link_state *link = pdev->link_state; diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 8765544bac35..c132839d99dc 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -4602,21 +4602,17 @@ static int pci_quirk_xgene_acs(struct pci_dev *dev, u16 acs_flags) * But the implementation could block peer-to-peer transactions between them * and provide ACS-like functionality. */ -static int pci_quirk_zhaoxin_pcie_ports_acs(struct pci_dev *dev, u16 acs_flags) +static int pci_quirk_zhaoxin_pcie_ports_acs(struct pci_dev *dev, u16 acs_flags) { if (!pci_is_pcie(dev) || ((pci_pcie_type(dev) != PCI_EXP_TYPE_ROOT_PORT) && (pci_pcie_type(dev) != PCI_EXP_TYPE_DOWNSTREAM))) return -ENOTTY; - /* - * Future Zhaoxin Root Ports and Switch Downstream Ports will - * implement ACS capability in accordance with the PCIe Spec. - */ switch (dev->device) { case 0x0710 ... 0x071e: case 0x0721: - case 0x0723 ... 0x0752: + case 0x0723 ... 0x0732: return pci_acs_ctrl_enabled(acs_flags, PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF); } diff --git a/drivers/pinctrl/cirrus/Kconfig b/drivers/pinctrl/cirrus/Kconfig index b3cea8d56c4f..530426a74f75 100644 --- a/drivers/pinctrl/cirrus/Kconfig +++ b/drivers/pinctrl/cirrus/Kconfig @@ -1,8 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only config PINCTRL_LOCHNAGAR tristate "Cirrus Logic Lochnagar pinctrl driver" - # Avoid clash caused by MIPS defining RST, which is used in the driver - depends on MFD_LOCHNAGAR && !MIPS + depends on MFD_LOCHNAGAR select GPIOLIB select PINMUX select PINCONF diff --git a/drivers/pinctrl/pinctrl-at91-pio4.c b/drivers/pinctrl/pinctrl-at91-pio4.c index 2425d4813c3c..f71c6457e350 100644 --- a/drivers/pinctrl/pinctrl-at91-pio4.c +++ b/drivers/pinctrl/pinctrl-at91-pio4.c @@ -1033,13 +1033,6 @@ static const struct of_device_id atmel_pctrl_of_match[] = { } }; -/* - * This lock class allows to tell lockdep that parent IRQ and children IRQ do - * not share the same class so it does not raise false positive - */ -static struct lock_class_key atmel_lock_key; -static struct lock_class_key atmel_request_key; - static int atmel_pinctrl_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -1192,7 +1185,6 @@ static int atmel_pinctrl_probe(struct platform_device *pdev) irq_set_chip_and_handler(irq, &atmel_gpio_irq_chip, handle_simple_irq); irq_set_chip_data(irq, atmel_pioctrl); - irq_set_lockdep_class(irq, &atmel_lock_key, &atmel_request_key); dev_dbg(dev, "atmel gpio irq domain: hwirq: %d, linux irq: %d\n", i, irq); diff --git a/drivers/pinctrl/pinctrl-cy8c95x0.c b/drivers/pinctrl/pinctrl-cy8c95x0.c index 5abab6bc763a..68509a2301b8 100644 --- a/drivers/pinctrl/pinctrl-cy8c95x0.c +++ b/drivers/pinctrl/pinctrl-cy8c95x0.c @@ -749,8 +749,6 @@ static int cy8c95x0_gpio_get_pincfg(struct cy8c95x0_pinctrl *chip, ret = regmap_read(chip->regmap, reg, ®_val); if (reg_val & bit) arg = 1; - if (param == PIN_CONFIG_OUTPUT_ENABLE) - arg = !arg; *config = pinconf_to_config_packed(param, (u16)arg); out: @@ -859,7 +857,7 @@ static int cy8c95x0_setup_gpiochip(struct cy8c95x0_pinctrl *chip) gc->get_direction = cy8c95x0_gpio_get_direction; gc->get_multiple = cy8c95x0_gpio_get_multiple; gc->set_multiple = cy8c95x0_gpio_set_multiple; - gc->set_config = gpiochip_generic_config; + gc->set_config = gpiochip_generic_config, gc->can_sleep = true; gc->add_pin_ranges = cy8c95x0_add_pin_ranges; diff --git a/drivers/pinctrl/starfive/pinctrl-starfive-jh7100.c b/drivers/pinctrl/starfive/pinctrl-starfive-jh7100.c index 3b18a03075f4..5b544fb7f3d8 100644 --- a/drivers/pinctrl/starfive/pinctrl-starfive-jh7100.c +++ b/drivers/pinctrl/starfive/pinctrl-starfive-jh7100.c @@ -489,7 +489,7 @@ static int starfive_dt_node_to_map(struct pinctrl_dev *pctldev, nmaps = 0; ngroups = 0; - for_each_available_child_of_node(np, child) { + for_each_child_of_node(np, child) { int npinmux = of_property_count_u32_elems(child, "pinmux"); int npins = of_property_count_u32_elems(child, "pins"); @@ -524,7 +524,7 @@ static int starfive_dt_node_to_map(struct pinctrl_dev *pctldev, nmaps = 0; ngroups = 0; mutex_lock(&sfp->mutex); - for_each_available_child_of_node(np, child) { + for_each_child_of_node(np, child) { int npins; int i; diff --git a/drivers/platform/x86/intel/telemetry/core.c b/drivers/platform/x86/intel/telemetry/core.c index e4be40f73eeb..fdf55b5d6948 100644 --- a/drivers/platform/x86/intel/telemetry/core.c +++ b/drivers/platform/x86/intel/telemetry/core.c @@ -102,7 +102,7 @@ static const struct telemetry_core_ops telm_defpltops = { /** * telemetry_update_events() - Update telemetry Configuration * @pss_evtconfig: PSS related config. No change if num_evts = 0. - * @ioss_evtconfig: IOSS related config. No change if num_evts = 0. + * @pss_evtconfig: IOSS related config. No change if num_evts = 0. * * This API updates the IOSS & PSS Telemetry configuration. Old config * is overwritten. Call telemetry_reset_events when logging is over @@ -176,7 +176,7 @@ EXPORT_SYMBOL_GPL(telemetry_reset_events); /** * telemetry_get_eventconfig() - Returns the pss and ioss events enabled * @pss_evtconfig: Pointer to PSS related configuration. - * @ioss_evtconfig: Pointer to IOSS related configuration. + * @pss_evtconfig: Pointer to IOSS related configuration. * @pss_len: Number of u32 elements allocated for pss_evtconfig array * @ioss_len: Number of u32 elements allocated for ioss_evtconfig array * diff --git a/drivers/platform/x86/intel/vbtn.c b/drivers/platform/x86/intel/vbtn.c index 8e2b07ed2ce9..c5e4e35c8d20 100644 --- a/drivers/platform/x86/intel/vbtn.c +++ b/drivers/platform/x86/intel/vbtn.c @@ -73,10 +73,10 @@ struct intel_vbtn_priv { bool wakeup_mode; }; -static void detect_tablet_mode(struct device *dev) +static void detect_tablet_mode(struct platform_device *device) { - struct intel_vbtn_priv *priv = dev_get_drvdata(dev); - acpi_handle handle = ACPI_HANDLE(dev); + struct intel_vbtn_priv *priv = dev_get_drvdata(&device->dev); + acpi_handle handle = ACPI_HANDLE(&device->dev); unsigned long long vgbs; acpi_status status; int m; @@ -89,8 +89,6 @@ static void detect_tablet_mode(struct device *dev) input_report_switch(priv->switches_dev, SW_TABLET_MODE, m); m = (vgbs & VGBS_DOCK_MODE_FLAG) ? 1 : 0; input_report_switch(priv->switches_dev, SW_DOCK, m); - - input_sync(priv->switches_dev); } /* @@ -136,7 +134,7 @@ static int intel_vbtn_input_setup(struct platform_device *device) priv->switches_dev->id.bustype = BUS_HOST; if (priv->has_switches) { - detect_tablet_mode(&device->dev); + detect_tablet_mode(device); ret = input_register_device(priv->switches_dev); if (ret) @@ -200,9 +198,6 @@ static void notify_handler(acpi_handle handle, u32 event, void *context) autorelease = val && (!ke_rel || ke_rel->type == KE_IGNORE); sparse_keymap_report_event(input_dev, event, val, autorelease); - - /* Some devices need this to report further events */ - acpi_evaluate_object(handle, "VBDL", NULL, NULL); } /* @@ -363,13 +358,7 @@ static void intel_vbtn_pm_complete(struct device *dev) static int intel_vbtn_pm_resume(struct device *dev) { - struct intel_vbtn_priv *priv = dev_get_drvdata(dev); - intel_vbtn_pm_complete(dev); - - if (priv->has_switches) - detect_tablet_mode(dev); - return 0; } diff --git a/drivers/platform/x86/intel/vsec.c b/drivers/platform/x86/intel/vsec.c index 40477d1d41b5..483bb6565166 100644 --- a/drivers/platform/x86/intel/vsec.c +++ b/drivers/platform/x86/intel/vsec.c @@ -124,60 +124,36 @@ static void intel_vsec_remove_aux(void *data) auxiliary_device_uninit(data); } -static DEFINE_MUTEX(vsec_ida_lock); - static void intel_vsec_dev_release(struct device *dev) { struct intel_vsec_device *intel_vsec_dev = dev_to_ivdev(dev); - xa_erase(&auxdev_array, intel_vsec_dev->id); - - mutex_lock(&vsec_ida_lock); ida_free(intel_vsec_dev->ida, intel_vsec_dev->auxdev.id); - mutex_unlock(&vsec_ida_lock); - kfree(intel_vsec_dev->resource); kfree(intel_vsec_dev); } -int intel_vsec_add_aux(struct pci_dev *pdev, struct device *parent, - struct intel_vsec_device *intel_vsec_dev, - const char *name) +static int intel_vsec_add_aux(struct pci_dev *pdev, struct intel_vsec_device *intel_vsec_dev, + const char *name) { struct auxiliary_device *auxdev = &intel_vsec_dev->auxdev; int ret, id; - ret = xa_alloc(&auxdev_array, &intel_vsec_dev->id, intel_vsec_dev, - PMT_XA_LIMIT, GFP_KERNEL); + ret = ida_alloc(intel_vsec_dev->ida, GFP_KERNEL); if (ret < 0) { kfree(intel_vsec_dev->resource); kfree(intel_vsec_dev); return ret; } - mutex_lock(&vsec_ida_lock); - id = ida_alloc(intel_vsec_dev->ida, GFP_KERNEL); - mutex_unlock(&vsec_ida_lock); - if (id < 0) { - xa_erase(&auxdev_array, intel_vsec_dev->id); - kfree(intel_vsec_dev->resource); - kfree(intel_vsec_dev); - return id; - } - - if (!parent) - parent = &pdev->dev; - - auxdev->id = id; + auxdev->id = ret; auxdev->name = name; - auxdev->dev.parent = parent; + auxdev->dev.parent = &pdev->dev; auxdev->dev.release = intel_vsec_dev_release; ret = auxiliary_device_init(auxdev); if (ret < 0) { - mutex_lock(&vsec_ida_lock); ida_free(intel_vsec_dev->ida, auxdev->id); - mutex_unlock(&vsec_ida_lock); kfree(intel_vsec_dev->resource); kfree(intel_vsec_dev); return ret; @@ -189,14 +165,19 @@ int intel_vsec_add_aux(struct pci_dev *pdev, struct device *parent, return ret; } - ret = devm_add_action_or_reset(parent, intel_vsec_remove_aux, + ret = devm_add_action_or_reset(&pdev->dev, intel_vsec_remove_aux, auxdev); if (ret < 0) return ret; + /* Add auxdev to list */ + ret = xa_alloc(&auxdev_array, &id, intel_vsec_dev, PMT_XA_LIMIT, + GFP_KERNEL); + if (ret) + return ret; + return 0; } -EXPORT_SYMBOL_NS_GPL(intel_vsec_add_aux, INTEL_VSEC); static int intel_vsec_add_dev(struct pci_dev *pdev, struct intel_vsec_header *header, struct intel_vsec_platform_info *info) @@ -254,8 +235,7 @@ static int intel_vsec_add_dev(struct pci_dev *pdev, struct intel_vsec_header *he else intel_vsec_dev->ida = &intel_vsec_ida; - return intel_vsec_add_aux(pdev, NULL, intel_vsec_dev, - intel_vsec_name(header->id)); + return intel_vsec_add_aux(pdev, intel_vsec_dev, intel_vsec_name(header->id)); } static bool intel_vsec_walk_header(struct pci_dev *pdev, diff --git a/drivers/platform/x86/intel/vsec.h b/drivers/platform/x86/intel/vsec.h index 330672588868..3deeb05cf394 100644 --- a/drivers/platform/x86/intel/vsec.h +++ b/drivers/platform/x86/intel/vsec.h @@ -38,15 +38,8 @@ struct intel_vsec_device { struct ida *ida; struct intel_vsec_platform_info *info; int num_resources; - int id; /* xa */ - void *priv_data; - size_t priv_data_size; }; -int intel_vsec_add_aux(struct pci_dev *pdev, struct device *parent, - struct intel_vsec_device *intel_vsec_dev, - const char *name); - static inline struct intel_vsec_device *dev_to_ivdev(struct device *dev) { return container_of(dev, struct intel_vsec_device, auxdev.dev); diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index 6edd2e294750..05a55bc31c79 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -8149,19 +8149,8 @@ static struct ibm_struct volume_driver_data = { * TPACPI_FAN_WR_TPEC is also available and should be used to * command the fan. The X31/X40/X41 seems to have 8 fan levels, * but the ACPI tables just mention level 7. - * - * TPACPI_FAN_RD_TPEC_NS: - * This mode is used for a few ThinkPads (L13 Yoga Gen2, X13 Yoga Gen2 etc.) - * that are using non-standard EC locations for reporting fan speeds. - * Currently these platforms only provide fan rpm reporting. - * */ -#define FAN_RPM_CAL_CONST 491520 /* FAN RPM calculation offset for some non-standard ECFW */ - -#define FAN_NS_CTRL_STATUS BIT(2) /* Bit which determines control is enabled or not */ -#define FAN_NS_CTRL BIT(4) /* Bit which determines control is by host or EC */ - enum { /* Fan control constants */ fan_status_offset = 0x2f, /* EC register 0x2f */ fan_rpm_offset = 0x84, /* EC register 0x84: LSB, 0x85 MSB (RPM) @@ -8169,11 +8158,6 @@ enum { /* Fan control constants */ fan_select_offset = 0x31, /* EC register 0x31 (Firmware 7M) bit 0 selects which fan is active */ - fan_status_offset_ns = 0x93, /* Special status/control offset for non-standard EC Fan1 */ - fan2_status_offset_ns = 0x96, /* Special status/control offset for non-standard EC Fan2 */ - fan_rpm_status_ns = 0x95, /* Special offset for Fan1 RPM status for non-standard EC */ - fan2_rpm_status_ns = 0x98, /* Special offset for Fan2 RPM status for non-standard EC */ - TP_EC_FAN_FULLSPEED = 0x40, /* EC fan mode: full speed */ TP_EC_FAN_AUTO = 0x80, /* EC fan mode: auto fan control */ @@ -8184,7 +8168,6 @@ enum fan_status_access_mode { TPACPI_FAN_NONE = 0, /* No fan status or control */ TPACPI_FAN_RD_ACPI_GFAN, /* Use ACPI GFAN */ TPACPI_FAN_RD_TPEC, /* Use ACPI EC regs 0x2f, 0x84-0x85 */ - TPACPI_FAN_RD_TPEC_NS, /* Use non-standard ACPI EC regs (eg: L13 Yoga gen2 etc.) */ }; enum fan_control_access_mode { @@ -8212,8 +8195,6 @@ static u8 fan_control_desired_level; static u8 fan_control_resume_level; static int fan_watchdog_maxinterval; -static bool fan_with_ns_addr; - static struct mutex fan_mutex; static void fan_watchdog_fire(struct work_struct *ignored); @@ -8344,15 +8325,6 @@ static int fan_get_status(u8 *status) } break; - case TPACPI_FAN_RD_TPEC_NS: - /* Default mode is AUTO which means controlled by EC */ - if (!acpi_ec_read(fan_status_offset_ns, &s)) - return -EIO; - - if (status) - *status = s; - - break; default: return -ENXIO; @@ -8369,8 +8341,7 @@ static int fan_get_status_safe(u8 *status) if (mutex_lock_killable(&fan_mutex)) return -ERESTARTSYS; rc = fan_get_status(&s); - /* NS EC doesn't have register with level settings */ - if (!rc && !fan_with_ns_addr) + if (!rc) fan_update_desired_level(s); mutex_unlock(&fan_mutex); @@ -8397,13 +8368,7 @@ static int fan_get_speed(unsigned int *speed) if (likely(speed)) *speed = (hi << 8) | lo; - break; - case TPACPI_FAN_RD_TPEC_NS: - if (!acpi_ec_read(fan_rpm_status_ns, &lo)) - return -EIO; - if (speed) - *speed = lo ? FAN_RPM_CAL_CONST / lo : 0; break; default: @@ -8415,7 +8380,7 @@ static int fan_get_speed(unsigned int *speed) static int fan2_get_speed(unsigned int *speed) { - u8 hi, lo, status; + u8 hi, lo; bool rc; switch (fan_status_access_mode) { @@ -8431,21 +8396,7 @@ static int fan2_get_speed(unsigned int *speed) if (likely(speed)) *speed = (hi << 8) | lo; - break; - case TPACPI_FAN_RD_TPEC_NS: - rc = !acpi_ec_read(fan2_status_offset_ns, &status); - if (rc) - return -EIO; - if (!(status & FAN_NS_CTRL_STATUS)) { - pr_info("secondary fan control not supported\n"); - return -EIO; - } - rc = !acpi_ec_read(fan2_rpm_status_ns, &lo); - if (rc) - return -EIO; - if (speed) - *speed = lo ? FAN_RPM_CAL_CONST / lo : 0; break; default: @@ -8948,7 +8899,6 @@ static const struct attribute_group fan_driver_attr_group = { #define TPACPI_FAN_2FAN 0x0002 /* EC 0x31 bit 0 selects fan2 */ #define TPACPI_FAN_2CTL 0x0004 /* selects fan2 control */ #define TPACPI_FAN_NOFAN 0x0008 /* no fan available */ -#define TPACPI_FAN_NS 0x0010 /* For EC with non-Standard register addresses */ static const struct tpacpi_quirk fan_quirk_table[] __initconst = { TPACPI_QEC_IBM('1', 'Y', TPACPI_FAN_Q1), @@ -8967,8 +8917,6 @@ static const struct tpacpi_quirk fan_quirk_table[] __initconst = { TPACPI_Q_LNV3('N', '2', 'O', TPACPI_FAN_2CTL), /* P1 / X1 Extreme (2nd gen) */ TPACPI_Q_LNV3('N', '3', '0', TPACPI_FAN_2CTL), /* P15 (1st gen) / P15v (1st gen) */ TPACPI_Q_LNV3('N', '3', '7', TPACPI_FAN_2CTL), /* T15g (2nd gen) */ - TPACPI_Q_LNV3('R', '1', 'F', TPACPI_FAN_NS), /* L13 Yoga Gen 2 */ - TPACPI_Q_LNV3('N', '2', 'U', TPACPI_FAN_NS), /* X13 Yoga Gen 2*/ TPACPI_Q_LNV3('N', '1', 'O', TPACPI_FAN_NOFAN), /* X1 Tablet (2nd gen) */ }; @@ -9003,27 +8951,18 @@ static int __init fan_init(struct ibm_init_struct *iibm) return -ENODEV; } - if (quirks & TPACPI_FAN_NS) { - pr_info("ECFW with non-standard fan reg control found\n"); - fan_with_ns_addr = 1; - /* Fan ctrl support from host is undefined for now */ - tp_features.fan_ctrl_status_undef = 1; - } - if (gfan_handle) { /* 570, 600e/x, 770e, 770x */ fan_status_access_mode = TPACPI_FAN_RD_ACPI_GFAN; } else { /* all other ThinkPads: note that even old-style * ThinkPad ECs supports the fan control register */ - if (fan_with_ns_addr || - likely(acpi_ec_read(fan_status_offset, &fan_control_initial_status))) { + if (likely(acpi_ec_read(fan_status_offset, + &fan_control_initial_status))) { int res; unsigned int speed; - fan_status_access_mode = fan_with_ns_addr ? - TPACPI_FAN_RD_TPEC_NS : TPACPI_FAN_RD_TPEC; - + fan_status_access_mode = TPACPI_FAN_RD_TPEC; if (quirks & TPACPI_FAN_Q1) fan_quirk1_setup(); /* Try and probe the 2nd fan */ @@ -9032,8 +8971,7 @@ static int __init fan_init(struct ibm_init_struct *iibm) if (res >= 0 && speed != FAN_NOT_PRESENT) { /* It responded - so let's assume it's there */ tp_features.second_fan = 1; - /* fan control not currently available for ns ECFW */ - tp_features.second_fan_ctl = !fan_with_ns_addr; + tp_features.second_fan_ctl = 1; pr_info("secondary fan control detected & enabled\n"); } else { /* Fan not auto-detected */ @@ -9208,7 +9146,6 @@ static int fan_read(struct seq_file *m) str_enabled_disabled(status), status); break; - case TPACPI_FAN_RD_TPEC_NS: case TPACPI_FAN_RD_TPEC: /* all except 570, 600e/x, 770e, 770x */ rc = fan_get_status_safe(&status); @@ -9223,22 +9160,13 @@ static int fan_read(struct seq_file *m) seq_printf(m, "speed:\t\t%d\n", speed); - if (fan_status_access_mode == TPACPI_FAN_RD_TPEC_NS) { - /* - * No full speed bit in NS EC - * EC Auto mode is set by default. - * No other levels settings available - */ - seq_printf(m, "level:\t\t%s\n", status & FAN_NS_CTRL ? "unknown" : "auto"); - } else { - if (status & TP_EC_FAN_FULLSPEED) - /* Disengaged mode takes precedence */ - seq_printf(m, "level:\t\tdisengaged\n"); - else if (status & TP_EC_FAN_AUTO) - seq_printf(m, "level:\t\tauto\n"); - else - seq_printf(m, "level:\t\t%d\n", status); - } + if (status & TP_EC_FAN_FULLSPEED) + /* Disengaged mode takes precedence */ + seq_printf(m, "level:\t\tdisengaged\n"); + else if (status & TP_EC_FAN_AUTO) + seq_printf(m, "level:\t\tauto\n"); + else + seq_printf(m, "level:\t\t%d\n", status); break; case TPACPI_FAN_NONE: diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c index 686eb8d86e22..01ad84fd147c 100644 --- a/drivers/power/supply/bq256xx_charger.c +++ b/drivers/power/supply/bq256xx_charger.c @@ -1514,16 +1514,13 @@ static int bq256xx_hw_init(struct bq256xx_device *bq) wd_reg_val = i; break; } - if (i + 1 < BQ256XX_NUM_WD_VAL && - bq->watchdog_timer > bq256xx_watchdog_time[i] && + if (bq->watchdog_timer > bq256xx_watchdog_time[i] && bq->watchdog_timer < bq256xx_watchdog_time[i + 1]) wd_reg_val = i; } ret = regmap_update_bits(bq->regmap, BQ256XX_CHARGER_CONTROL_1, BQ256XX_WATCHDOG_MASK, wd_reg_val << BQ256XX_WDT_BIT_SHIFT); - if (ret) - return ret; ret = power_supply_get_battery_info(bq->charger, &bat_info); if (ret == -ENOMEM) diff --git a/drivers/power/supply/cw2015_battery.c b/drivers/power/supply/cw2015_battery.c index 9d957cf8edf0..473522b4326a 100644 --- a/drivers/power/supply/cw2015_battery.c +++ b/drivers/power/supply/cw2015_battery.c @@ -491,7 +491,7 @@ static int cw_battery_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW: if (cw_battery_valid_time_to_empty(cw_bat)) - val->intval = cw_bat->time_to_empty * 60; + val->intval = cw_bat->time_to_empty; else val->intval = 0; break; diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c index 9726f96bf763..d333e7422f4a 100644 --- a/drivers/pwm/core.c +++ b/drivers/pwm/core.c @@ -171,7 +171,7 @@ of_pwm_single_xlate(struct pwm_chip *pc, const struct of_phandle_args *args) pwm->args.period = args->args[0]; pwm->args.polarity = PWM_POLARITY_NORMAL; - if (args->args_count == 2 && args->args[1] & PWM_POLARITY_INVERTED) + if (args->args_count == 2 && args->args[2] & PWM_POLARITY_INVERTED) pwm->args.polarity = PWM_POLARITY_INVERSED; return pwm; diff --git a/drivers/pwm/pwm-jz4740.c b/drivers/pwm/pwm-jz4740.c index 246499128142..a5fdf97c0d2e 100644 --- a/drivers/pwm/pwm-jz4740.c +++ b/drivers/pwm/pwm-jz4740.c @@ -60,10 +60,9 @@ static int jz4740_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) snprintf(name, sizeof(name), "timer%u", pwm->hwpwm); clk = clk_get(chip->dev, name); - if (IS_ERR(clk)) { - dev_err(chip->dev, "error %pe: Failed to get clock\n", clk); - return PTR_ERR(clk); - } + if (IS_ERR(clk)) + return dev_err_probe(chip->dev, PTR_ERR(clk), + "Failed to get clock\n"); err = clk_prepare_enable(clk); if (err < 0) { diff --git a/drivers/pwm/pwm-stm32.c b/drivers/pwm/pwm-stm32.c index bdcdb7f38312..794ca5b02968 100644 --- a/drivers/pwm/pwm-stm32.c +++ b/drivers/pwm/pwm-stm32.c @@ -115,14 +115,14 @@ static int stm32_pwm_raw_capture(struct stm32_pwm *priv, struct pwm_device *pwm, int ret; /* Ensure registers have been updated, enable counter and capture */ - regmap_set_bits(priv->regmap, TIM_EGR, TIM_EGR_UG); - regmap_set_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN); + regmap_update_bits(priv->regmap, TIM_EGR, TIM_EGR_UG, TIM_EGR_UG); + regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, TIM_CR1_CEN); /* Use cc1 or cc3 DMA resp for PWM input channels 1 & 2 or 3 & 4 */ dma_id = pwm->hwpwm < 2 ? STM32_TIMERS_DMA_CH1 : STM32_TIMERS_DMA_CH3; ccen = pwm->hwpwm < 2 ? TIM_CCER_CC12E : TIM_CCER_CC34E; ccr = pwm->hwpwm < 2 ? TIM_CCR1 : TIM_CCR3; - regmap_set_bits(priv->regmap, TIM_CCER, ccen); + regmap_update_bits(priv->regmap, TIM_CCER, ccen, ccen); /* * Timer DMA burst mode. Request 2 registers, 2 bursts, to get both @@ -160,8 +160,8 @@ static int stm32_pwm_raw_capture(struct stm32_pwm *priv, struct pwm_device *pwm, } stop: - regmap_clear_bits(priv->regmap, TIM_CCER, ccen); - regmap_clear_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN); + regmap_update_bits(priv->regmap, TIM_CCER, ccen, 0); + regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0); return ret; } @@ -359,7 +359,7 @@ static int stm32_pwm_config(struct stm32_pwm *priv, int ch, regmap_write(priv->regmap, TIM_PSC, prescaler); regmap_write(priv->regmap, TIM_ARR, prd - 1); - regmap_set_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE); + regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, TIM_CR1_ARPE); /* Calculate the duty cycles */ dty = prd * duty_ns; @@ -377,7 +377,7 @@ static int stm32_pwm_config(struct stm32_pwm *priv, int ch, else regmap_update_bits(priv->regmap, TIM_CCMR2, mask, ccmr); - regmap_set_bits(priv->regmap, TIM_BDTR, TIM_BDTR_MOE); + regmap_update_bits(priv->regmap, TIM_BDTR, TIM_BDTR_MOE, TIM_BDTR_MOE); return 0; } @@ -411,13 +411,13 @@ static int stm32_pwm_enable(struct stm32_pwm *priv, int ch) if (priv->have_complementary_output) mask |= TIM_CCER_CC1NE << (ch * 4); - regmap_set_bits(priv->regmap, TIM_CCER, mask); + regmap_update_bits(priv->regmap, TIM_CCER, mask, mask); /* Make sure that registers are updated */ - regmap_set_bits(priv->regmap, TIM_EGR, TIM_EGR_UG); + regmap_update_bits(priv->regmap, TIM_EGR, TIM_EGR_UG, TIM_EGR_UG); /* Enable controller */ - regmap_set_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN); + regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, TIM_CR1_CEN); return 0; } @@ -431,11 +431,11 @@ static void stm32_pwm_disable(struct stm32_pwm *priv, int ch) if (priv->have_complementary_output) mask |= TIM_CCER_CC1NE << (ch * 4); - regmap_clear_bits(priv->regmap, TIM_CCER, mask); + regmap_update_bits(priv->regmap, TIM_CCER, mask, 0); /* When all channels are disabled, we can disable the controller */ if (!active_channels(priv)) - regmap_clear_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN); + regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0); clk_disable(priv->clk); } @@ -568,30 +568,41 @@ static void stm32_pwm_detect_complementary(struct stm32_pwm *priv) * If complementary bit doesn't exist writing 1 will have no * effect so we can detect it. */ - regmap_set_bits(priv->regmap, TIM_CCER, TIM_CCER_CC1NE); + regmap_update_bits(priv->regmap, + TIM_CCER, TIM_CCER_CC1NE, TIM_CCER_CC1NE); regmap_read(priv->regmap, TIM_CCER, &ccer); - regmap_clear_bits(priv->regmap, TIM_CCER, TIM_CCER_CC1NE); + regmap_update_bits(priv->regmap, TIM_CCER, TIM_CCER_CC1NE, 0); priv->have_complementary_output = (ccer != 0); } -static unsigned int stm32_pwm_detect_channels(struct stm32_pwm *priv, - unsigned int *num_enabled) +static int stm32_pwm_detect_channels(struct stm32_pwm *priv) { - u32 ccer, ccer_backup; + u32 ccer; + int npwm = 0; /* * If channels enable bits don't exist writing 1 will have no * effect so we can detect and count them. */ - regmap_read(priv->regmap, TIM_CCER, &ccer_backup); - regmap_set_bits(priv->regmap, TIM_CCER, TIM_CCER_CCXE); + regmap_update_bits(priv->regmap, + TIM_CCER, TIM_CCER_CCXE, TIM_CCER_CCXE); regmap_read(priv->regmap, TIM_CCER, &ccer); - regmap_write(priv->regmap, TIM_CCER, ccer_backup); + regmap_update_bits(priv->regmap, TIM_CCER, TIM_CCER_CCXE, 0); - *num_enabled = hweight32(ccer_backup & TIM_CCER_CCXE); + if (ccer & TIM_CCER_CC1E) + npwm++; - return hweight32(ccer & TIM_CCER_CCXE); + if (ccer & TIM_CCER_CC2E) + npwm++; + + if (ccer & TIM_CCER_CC3E) + npwm++; + + if (ccer & TIM_CCER_CC4E) + npwm++; + + return npwm; } static int stm32_pwm_probe(struct platform_device *pdev) @@ -600,8 +611,6 @@ static int stm32_pwm_probe(struct platform_device *pdev) struct device_node *np = dev->of_node; struct stm32_timers *ddata = dev_get_drvdata(pdev->dev.parent); struct stm32_pwm *priv; - unsigned int num_enabled; - unsigned int i; int ret; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); @@ -624,11 +633,7 @@ static int stm32_pwm_probe(struct platform_device *pdev) priv->chip.dev = dev; priv->chip.ops = &stm32pwm_ops; - priv->chip.npwm = stm32_pwm_detect_channels(priv, &num_enabled); - - /* Initialize clock refcount to number of enabled PWM channels. */ - for (i = 0; i < num_enabled; i++) - clk_enable(priv->clk); + priv->chip.npwm = stm32_pwm_detect_channels(priv); ret = pwmchip_add(&priv->chip); if (ret < 0) diff --git a/drivers/reset/core.c b/drivers/reset/core.c index 92cc13ef3e56..f0a076e94118 100644 --- a/drivers/reset/core.c +++ b/drivers/reset/core.c @@ -807,9 +807,6 @@ static void __reset_control_put_internal(struct reset_control *rstc) { lockdep_assert_held(&reset_list_mutex); - if (IS_ERR_OR_NULL(rstc)) - return; - kref_put(&rstc->refcnt, __reset_control_release); } @@ -1020,8 +1017,11 @@ EXPORT_SYMBOL_GPL(reset_control_put); void reset_control_bulk_put(int num_rstcs, struct reset_control_bulk_data *rstcs) { mutex_lock(&reset_list_mutex); - while (num_rstcs--) + while (num_rstcs--) { + if (IS_ERR_OR_NULL(rstcs[num_rstcs].rstc)) + continue; __reset_control_put_internal(rstcs[num_rstcs].rstc); + } mutex_unlock(&reset_list_mutex); } EXPORT_SYMBOL_GPL(reset_control_bulk_put); diff --git a/drivers/reset/hisilicon/hi6220_reset.c b/drivers/reset/hisilicon/hi6220_reset.c index 30951914afac..5ca145b64e63 100644 --- a/drivers/reset/hisilicon/hi6220_reset.c +++ b/drivers/reset/hisilicon/hi6220_reset.c @@ -164,7 +164,7 @@ static int hi6220_reset_probe(struct platform_device *pdev) if (!data) return -ENOMEM; - type = (uintptr_t)of_device_get_match_data(dev); + type = (enum hi6220_reset_ctrl_type)of_device_get_match_data(dev); regmap = syscon_node_to_regmap(np); if (IS_ERR(regmap)) { diff --git a/drivers/s390/block/scm_blk.c b/drivers/s390/block/scm_blk.c index a165b1a59fde..0c1df1d5f1ac 100644 --- a/drivers/s390/block/scm_blk.c +++ b/drivers/s390/block/scm_blk.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include "scm_blk.h" @@ -131,7 +130,7 @@ static void scm_request_done(struct scm_request *scmrq) for (i = 0; i < nr_requests_per_io && scmrq->request[i]; i++) { msb = &scmrq->aob->msb[i]; - aidaw = (u64)phys_to_virt(msb->data_addr); + aidaw = msb->data_addr; if ((msb->flags & MSB_FLAG_IDA) && aidaw && IS_ALIGNED(aidaw, PAGE_SIZE)) @@ -196,12 +195,12 @@ static int scm_request_prepare(struct scm_request *scmrq) msb->scm_addr = scmdev->address + ((u64) blk_rq_pos(req) << 9); msb->oc = (rq_data_dir(req) == READ) ? MSB_OC_READ : MSB_OC_WRITE; msb->flags |= MSB_FLAG_IDA; - msb->data_addr = (u64)virt_to_phys(aidaw); + msb->data_addr = (u64) aidaw; rq_for_each_segment(bv, req, iter) { WARN_ON(bv.bv_offset); msb->blk_count += bv.bv_len >> 12; - aidaw->data_addr = virt_to_phys(page_address(bv.bv_page)); + aidaw->data_addr = (u64) page_address(bv.bv_page); aidaw++; } diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index 5e115e8b2ba4..7c6efde75da6 100644 --- a/drivers/scsi/aacraid/aacraid.h +++ b/drivers/scsi/aacraid/aacraid.h @@ -1678,6 +1678,7 @@ struct aac_dev u32 handle_pci_error; bool init_reset; u8 soft_reset_support; + u8 use_map_queue; }; #define aac_adapter_interrupt(dev) \ diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c index 25cee03d7f97..013a9a334972 100644 --- a/drivers/scsi/aacraid/commsup.c +++ b/drivers/scsi/aacraid/commsup.c @@ -223,8 +223,12 @@ int aac_fib_setup(struct aac_dev * dev) struct fib *aac_fib_alloc_tag(struct aac_dev *dev, struct scsi_cmnd *scmd) { struct fib *fibptr; + u32 blk_tag; + int i; - fibptr = &dev->fibs[scsi_cmd_to_rq(scmd)->tag]; + blk_tag = blk_mq_unique_tag(scsi_cmd_to_rq(scmd)); + i = blk_mq_unique_tag_to_tag(blk_tag); + fibptr = &dev->fibs[i]; /* * Null out fields that depend on being zero at the start of * each I/O diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index 5ba5c18b77b4..bff49b8ab057 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -505,6 +506,15 @@ common_config: return 0; } +static void aac_map_queues(struct Scsi_Host *shost) +{ + struct aac_dev *aac = (struct aac_dev *)shost->hostdata; + + blk_mq_pci_map_queues(&shost->tag_set.map[HCTX_TYPE_DEFAULT], + aac->pdev, 0); + aac->use_map_queue = true; +} + /** * aac_change_queue_depth - alter queue depths * @sdev: SCSI device we are considering @@ -1489,6 +1499,7 @@ static struct scsi_host_template aac_driver_template = { .bios_param = aac_biosparm, .shost_groups = aac_host_groups, .slave_configure = aac_slave_configure, + .map_queues = aac_map_queues, .change_queue_depth = aac_change_queue_depth, .sdev_groups = aac_dev_groups, .eh_abort_handler = aac_eh_abort, @@ -1776,6 +1787,8 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) shost->max_lun = AAC_MAX_LUN; pci_set_drvdata(pdev, shost); + shost->nr_hw_queues = aac->max_msix; + shost->host_tagset = 1; error = scsi_add_host(shost, &pdev->dev); if (error) @@ -1908,6 +1921,7 @@ static void aac_remove_one(struct pci_dev *pdev) struct aac_dev *aac = (struct aac_dev *)shost->hostdata; aac_cancel_rescan_worker(aac); + aac->use_map_queue = false; scsi_remove_host(shost); __aac_shutdown(aac); diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c index 11ef58204e96..61949f374188 100644 --- a/drivers/scsi/aacraid/src.c +++ b/drivers/scsi/aacraid/src.c @@ -493,6 +493,10 @@ static int aac_src_deliver_message(struct fib *fib) #endif u16 vector_no; + struct scsi_cmnd *scmd; + u32 blk_tag; + struct Scsi_Host *shost = dev->scsi_host_ptr; + struct blk_mq_queue_map *qmap; atomic_inc(&q->numpending); @@ -505,8 +509,25 @@ static int aac_src_deliver_message(struct fib *fib) if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) && dev->sa_firmware) vector_no = aac_get_vector(dev); - else - vector_no = fib->vector_no; + else { + if (!fib->vector_no || !fib->callback_data) { + if (shost && dev->use_map_queue) { + qmap = &shost->tag_set.map[HCTX_TYPE_DEFAULT]; + vector_no = qmap->mq_map[raw_smp_processor_id()]; + } + /* + * We hardcode the vector_no for + * reserved commands as a valid shost is + * absent during the init + */ + else + vector_no = 0; + } else { + scmd = (struct scsi_cmnd *)fib->callback_data; + blk_tag = blk_mq_unique_tag(scsi_cmd_to_rq(scmd)); + vector_no = blk_mq_unique_tag_to_hwq(blk_tag); + } + } if (native_hba) { if (fib->flags & FIB_CONTEXT_FLAG_NATIVE_HBA_TMF) { diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c index 451a58e0fd96..05ddbb9bb7d8 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c +++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c @@ -429,6 +429,7 @@ static int bnx2fc_rcv(struct sk_buff *skb, struct net_device *dev, struct fcoe_ctlr *ctlr; struct fcoe_rcv_info *fr; struct fcoe_percpu_s *bg; + struct sk_buff *tmp_skb; interface = container_of(ptype, struct bnx2fc_interface, fcoe_packet_type); @@ -440,9 +441,11 @@ static int bnx2fc_rcv(struct sk_buff *skb, struct net_device *dev, goto err; } - skb = skb_share_check(skb, GFP_ATOMIC); - if (!skb) - return -1; + tmp_skb = skb_share_check(skb, GFP_ATOMIC); + if (!tmp_skb) + goto err; + + skb = tmp_skb; if (unlikely(eth_hdr(skb)->h_proto != htons(ETH_P_FCOE))) { printk(KERN_ERR PFX "bnx2fc_rcv: Wrong FC type frame\n"); diff --git a/drivers/scsi/fnic/fnic_debugfs.c b/drivers/scsi/fnic/fnic_debugfs.c index eb895a65ea8f..6fedc3b7d1ab 100644 --- a/drivers/scsi/fnic/fnic_debugfs.c +++ b/drivers/scsi/fnic/fnic_debugfs.c @@ -52,10 +52,9 @@ int fnic_debugfs_init(void) fc_trc_flag->fnic_trace = 2; fc_trc_flag->fc_trace = 3; fc_trc_flag->fc_clear = 4; - return 0; } - return -ENOMEM; + return 0; } /* diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c index 450a8578157c..a8142e2b9643 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -1502,12 +1502,12 @@ EXPORT_SYMBOL_GPL(hisi_sas_controller_reset_done); static int hisi_sas_controller_prereset(struct hisi_hba *hisi_hba) { if (!hisi_hba->hw->soft_reset) - return -ENOENT; + return -1; down(&hisi_hba->sem); if (test_and_set_bit(HISI_SAS_RESETTING_BIT, &hisi_hba->flags)) { up(&hisi_hba->sem); - return -EPERM; + return -1; } if (hisi_sas_debugfs_enable && hisi_hba->debugfs_itct[0].itct) diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c index 0c80ff9affa3..c4305ec38ebf 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c @@ -3330,7 +3330,7 @@ static void debugfs_snapshot_global_reg_v3_hw(struct hisi_hba *hisi_hba) u32 *databuf = hisi_hba->debugfs_regs[dump_index][DEBUGFS_GLOBAL].data; int i; - for (i = 0; i < debugfs_global_reg.count; i++, databuf++) + for (i = 0; i < debugfs_axi_reg.count; i++, databuf++) *databuf = hisi_sas_read32(hisi_hba, 4 * i); } @@ -4946,7 +4946,6 @@ static void hisi_sas_reset_done_v3_hw(struct pci_dev *pdev) { struct sas_ha_struct *sha = pci_get_drvdata(pdev); struct hisi_hba *hisi_hba = sha->lldd_ha; - struct Scsi_Host *shost = hisi_hba->shost; struct device *dev = hisi_hba->dev; int rc; @@ -4955,10 +4954,6 @@ static void hisi_sas_reset_done_v3_hw(struct pci_dev *pdev) rc = hw_init_v3_hw(hisi_hba); if (rc) { dev_err(dev, "FLR: hw init failed rc=%d\n", rc); - clear_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags); - scsi_unblock_requests(shost); - clear_bit(HISI_SAS_RESETTING_BIT, &hisi_hba->flags); - up(&hisi_hba->sem); return; } @@ -4986,7 +4981,7 @@ static int _suspend_v3_hw(struct device *device) } if (test_and_set_bit(HISI_SAS_RESETTING_BIT, &hisi_hba->flags)) - return -EPERM; + return -1; dev_warn(dev, "entering suspend state\n"); diff --git a/drivers/scsi/mpi3mr/mpi3mr_app.c b/drivers/scsi/mpi3mr/mpi3mr_app.c index 8c662d08706f..d10c6afb7f9c 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_app.c +++ b/drivers/scsi/mpi3mr/mpi3mr_app.c @@ -223,22 +223,6 @@ static long mpi3mr_bsg_pel_enable(struct mpi3mr_ioc *mrioc, return rval; } - if (mrioc->unrecoverable) { - dprint_bsg_err(mrioc, "%s: unrecoverable controller\n", - __func__); - return -EFAULT; - } - - if (mrioc->reset_in_progress) { - dprint_bsg_err(mrioc, "%s: reset in progress\n", __func__); - return -EAGAIN; - } - - if (mrioc->stop_bsgs) { - dprint_bsg_err(mrioc, "%s: bsgs are blocked\n", __func__); - return -EAGAIN; - } - sg_copy_to_buffer(job->request_payload.sg_list, job->request_payload.sg_cnt, &pel_enable, sizeof(pel_enable)); diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c index 85f5b349c7e4..6d55698ea4d1 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_os.c +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c @@ -1044,14 +1044,8 @@ void mpi3mr_rfresh_tgtdevs(struct mpi3mr_ioc *mrioc) tgtdev = NULL; list_for_each_entry(tgtdev, &mrioc->tgtdev_list, list) { if ((tgtdev->dev_handle != MPI3MR_INVALID_DEV_HANDLE) && - !tgtdev->is_hidden) { - if (!tgtdev->host_exposed) - mpi3mr_report_tgtdev_to_host(mrioc, - tgtdev->perst_id); - else if (tgtdev->starget) - starget_for_each_device(tgtdev->starget, - (void *)tgtdev, mpi3mr_update_sdev); - } + !tgtdev->is_hidden && !tgtdev->host_exposed) + mpi3mr_report_tgtdev_to_host(mrioc, tgtdev->perst_id); } } diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 4b07bdc4e3b6..2c53965f903f 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -1118,7 +1118,6 @@ retry: scsi_log_send(scmd); scmd->submitter = SUBMITTED_BY_SCSI_ERROR_HANDLER; - scmd->flags |= SCMD_LAST; /* * Lock sdev->state_mutex to avoid that scsi_device_quiesce() can @@ -2413,7 +2412,6 @@ scsi_ioctl_reset(struct scsi_device *dev, int __user *arg) scsi_init_command(dev, scmd); scmd->submitter = SUBMITTED_BY_SCSI_RESET_IOCTL; - scmd->flags |= SCMD_LAST; memset(&scmd->sdb, 0, sizeof(scmd->sdb)); scmd->cmd_len = 0; diff --git a/drivers/soc/qcom/llcc-qcom.c b/drivers/soc/qcom/llcc-qcom.c index 16a05143d0d6..bc400669ee02 100644 --- a/drivers/soc/qcom/llcc-qcom.c +++ b/drivers/soc/qcom/llcc-qcom.c @@ -680,14 +680,14 @@ static int _qcom_llcc_cfg_program(const struct llcc_slice_config *config, u32 disable_cap_alloc, retain_pc; disable_cap_alloc = config->dis_cap_alloc << config->slice_id; - ret = regmap_update_bits(drv_data->bcast_regmap, LLCC_TRP_SCID_DIS_CAP_ALLOC, - BIT(config->slice_id), disable_cap_alloc); + ret = regmap_write(drv_data->bcast_regmap, + LLCC_TRP_SCID_DIS_CAP_ALLOC, disable_cap_alloc); if (ret) return ret; retain_pc = config->retain_on_pc << config->slice_id; - ret = regmap_update_bits(drv_data->bcast_regmap, LLCC_TRP_PCB_ACT, - BIT(config->slice_id), retain_pc); + ret = regmap_write(drv_data->bcast_regmap, + LLCC_TRP_PCB_ACT, retain_pc); if (ret) return ret; } diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index 2624441d2fa9..b10ea69a638e 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -744,15 +744,14 @@ error_1: * sdw_ml_sync_bank_switch: Multilink register bank switch * * @bus: SDW bus instance - * @multi_link: whether this is a multi-link stream with hardware-based sync * * Caller function should free the buffers on error */ -static int sdw_ml_sync_bank_switch(struct sdw_bus *bus, bool multi_link) +static int sdw_ml_sync_bank_switch(struct sdw_bus *bus) { unsigned long time_left; - if (!multi_link) + if (!bus->multi_link) return 0; /* Wait for completion of transfer */ @@ -849,7 +848,7 @@ static int do_bank_switch(struct sdw_stream_runtime *stream) bus->bank_switch_timeout = DEFAULT_BANK_SWITCH_TIMEOUT; /* Check if bank switch was successful */ - ret = sdw_ml_sync_bank_switch(bus, multi_link); + ret = sdw_ml_sync_bank_switch(bus); if (ret < 0) { dev_err(bus->dev, "multi link bank switch failed: %d\n", ret); diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index 15ea11ebcbe0..946e2186d244 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig @@ -1101,10 +1101,9 @@ config SPI_ZYNQ_QSPI config SPI_ZYNQMP_GQSPI tristate "Xilinx ZynqMP GQSPI controller" - depends on (SPI_MEM && HAS_DMA) || COMPILE_TEST + depends on (SPI_MASTER && HAS_DMA) || COMPILE_TEST help Enables Xilinx GQSPI controller driver for Zynq UltraScale+ MPSoC. - This controller only supports SPI memory interface. config SPI_AMD tristate "AMD SPI controller" diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c index 78daf2b2143c..c4f22d50dba5 100644 --- a/drivers/spi/spi-atmel.c +++ b/drivers/spi/spi-atmel.c @@ -22,7 +22,6 @@ #include #include #include -#include #include /* SPI register offsets */ @@ -279,7 +278,6 @@ struct atmel_spi { bool keep_cs; u32 fifo_size; - bool last_polarity; u8 native_cs_free; u8 native_cs_for_gpio; }; @@ -292,22 +290,6 @@ struct atmel_spi_device { #define SPI_MAX_DMA_XFER 65535 /* true for both PDC and DMA */ #define INVALID_DMA_ADDRESS 0xffffffff -/* - * This frequency can be anything supported by the controller, but to avoid - * unnecessary delay, the highest possible frequency is chosen. - * - * This frequency is the highest possible which is not interfering with other - * chip select registers (see Note for Serial Clock Bit Rate configuration in - * Atmel-11121F-ATARM-SAMA5D3-Series-Datasheet_02-Feb-16, page 1283) - */ -#define DUMMY_MSG_FREQUENCY 0x02 -/* - * 8 bits is the minimum data the controller is capable of sending. - * - * This message can be anything as it should not be treated by any SPI device. - */ -#define DUMMY_MSG 0xAA - /* * Version 2 of the SPI controller has * - CR.LASTXFER @@ -321,43 +303,6 @@ static bool atmel_spi_is_v2(struct atmel_spi *as) return as->caps.is_spi2; } -/* - * Send a dummy message. - * - * This is sometimes needed when using a CS GPIO to force clock transition when - * switching between devices with different polarities. - */ -static void atmel_spi_send_dummy(struct atmel_spi *as, struct spi_device *spi, int chip_select) -{ - u32 status; - u32 csr; - - /* - * Set a clock frequency to allow sending message on SPI bus. - * The frequency here can be anything, but is needed for - * the controller to send the data. - */ - csr = spi_readl(as, CSR0 + 4 * chip_select); - csr = SPI_BFINS(SCBR, DUMMY_MSG_FREQUENCY, csr); - spi_writel(as, CSR0 + 4 * chip_select, csr); - - /* - * Read all data coming from SPI bus, needed to be able to send - * the message. - */ - spi_readl(as, RDR); - while (spi_readl(as, SR) & SPI_BIT(RDRF)) { - spi_readl(as, RDR); - cpu_relax(); - } - - spi_writel(as, TDR, DUMMY_MSG); - - readl_poll_timeout_atomic(as->regs + SPI_SR, status, - (status & SPI_BIT(TXEMPTY)), 1, 1000); -} - - /* * Earlier SPI controllers (e.g. on at91rm9200) have a design bug whereby * they assume that spi slave device state will not change on deselect, so @@ -374,17 +319,11 @@ static void atmel_spi_send_dummy(struct atmel_spi *as, struct spi_device *spi, i * Master on Chip Select 0.") No workaround exists for that ... so for * nCS0 on that chip, we (a) don't use the GPIO, (b) can't support CS_HIGH, * and (c) will trigger that first erratum in some cases. - * - * When changing the clock polarity, the SPI controller waits for the next - * transmission to enforce the default clock state. This may be an issue when - * using a GPIO as Chip Select: the clock level is applied only when the first - * packet is sent, once the CS has already been asserted. The workaround is to - * avoid this by sending a first (dummy) message before toggling the CS state. */ + static void cs_activate(struct atmel_spi *as, struct spi_device *spi) { struct atmel_spi_device *asd = spi->controller_state; - bool new_polarity; int chip_select; u32 mr; @@ -413,25 +352,6 @@ static void cs_activate(struct atmel_spi *as, struct spi_device *spi) } mr = spi_readl(as, MR); - - /* - * Ensures the clock polarity is valid before we actually - * assert the CS to avoid spurious clock edges to be - * processed by the spi devices. - */ - if (spi_get_csgpiod(spi, 0)) { - new_polarity = (asd->csr & SPI_BIT(CPOL)) != 0; - if (new_polarity != as->last_polarity) { - /* - * Need to disable the GPIO before sending the dummy - * message because it is already set by the spi core. - */ - gpiod_set_value_cansleep(spi_get_csgpiod(spi, 0), 0); - atmel_spi_send_dummy(as, spi, chip_select); - as->last_polarity = new_polarity; - gpiod_set_value_cansleep(spi_get_csgpiod(spi, 0), 1); - } - } } else { u32 cpol = (spi->mode & SPI_CPOL) ? SPI_BIT(CPOL) : 0; int i; diff --git a/drivers/spi/spi-sh-msiof.c b/drivers/spi/spi-sh-msiof.c index 51ceaa485724..9bca3d076f05 100644 --- a/drivers/spi/spi-sh-msiof.c +++ b/drivers/spi/spi-sh-msiof.c @@ -30,15 +30,12 @@ #include -#define SH_MSIOF_FLAG_FIXED_DTDL_200 BIT(0) - struct sh_msiof_chipdata { u32 bits_per_word_mask; u16 tx_fifo_size; u16 rx_fifo_size; u16 ctlr_flags; u16 min_div_pow; - u32 flags; }; struct sh_msiof_spi_priv { @@ -1076,16 +1073,6 @@ static const struct sh_msiof_chipdata rcar_gen3_data = { .min_div_pow = 1, }; -static const struct sh_msiof_chipdata rcar_r8a7795_data = { - .bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(16) | - SPI_BPW_MASK(24) | SPI_BPW_MASK(32), - .tx_fifo_size = 64, - .rx_fifo_size = 64, - .ctlr_flags = SPI_CONTROLLER_MUST_TX, - .min_div_pow = 1, - .flags = SH_MSIOF_FLAG_FIXED_DTDL_200, -}; - static const struct of_device_id sh_msiof_match[] = { { .compatible = "renesas,sh-mobile-msiof", .data = &sh_data }, { .compatible = "renesas,msiof-r8a7743", .data = &rcar_gen2_data }, @@ -1096,7 +1083,6 @@ static const struct of_device_id sh_msiof_match[] = { { .compatible = "renesas,msiof-r8a7793", .data = &rcar_gen2_data }, { .compatible = "renesas,msiof-r8a7794", .data = &rcar_gen2_data }, { .compatible = "renesas,rcar-gen2-msiof", .data = &rcar_gen2_data }, - { .compatible = "renesas,msiof-r8a7795", .data = &rcar_r8a7795_data }, { .compatible = "renesas,msiof-r8a7796", .data = &rcar_gen3_data }, { .compatible = "renesas,rcar-gen3-msiof", .data = &rcar_gen3_data }, { .compatible = "renesas,rcar-gen4-msiof", .data = &rcar_gen3_data }, @@ -1294,9 +1280,6 @@ static int sh_msiof_spi_probe(struct platform_device *pdev) return -ENXIO; } - if (chipdata->flags & SH_MSIOF_FLAG_FIXED_DTDL_200) - info->dtdl = 200; - if (info->mode == MSIOF_SPI_SLAVE) ctlr = spi_alloc_slave(&pdev->dev, sizeof(struct sh_msiof_spi_priv)); diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 22d227878bc4..5d046be8b2dd 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -360,18 +360,6 @@ const struct spi_device_id *spi_get_device_id(const struct spi_device *sdev) } EXPORT_SYMBOL_GPL(spi_get_device_id); -const void *spi_get_device_match_data(const struct spi_device *sdev) -{ - const void *match; - - match = device_get_match_data(&sdev->dev); - if (match) - return match; - - return (const void *)spi_get_device_id(sdev)->driver_data; -} -EXPORT_SYMBOL_GPL(spi_get_device_match_data); - static int spi_match_device(struct device *dev, struct device_driver *drv) { const struct spi_device *spi = to_spi_device(dev); @@ -604,7 +592,7 @@ static void spi_dev_set_name(struct spi_device *spi) } dev_set_name(&spi->dev, "%s.%u", dev_name(&spi->controller->dev), - spi_get_chipselect(spi, 0)); + spi->chip_select); } static int spi_dev_check(struct device *dev, void *data) @@ -613,7 +601,7 @@ static int spi_dev_check(struct device *dev, void *data) struct spi_device *new_spi = data; if (spi->controller == new_spi->controller && - spi_get_chipselect(spi, 0) == spi_get_chipselect(new_spi, 0)) + spi->chip_select == new_spi->chip_select) return -EBUSY; return 0; } @@ -638,7 +626,7 @@ static int __spi_add_device(struct spi_device *spi) status = bus_for_each_dev(&spi_bus_type, NULL, spi, spi_dev_check); if (status) { dev_err(dev, "chipselect %d already in use\n", - spi_get_chipselect(spi, 0)); + spi->chip_select); return status; } @@ -649,7 +637,7 @@ static int __spi_add_device(struct spi_device *spi) } if (ctlr->cs_gpiods) - spi_set_csgpiod(spi, 0, ctlr->cs_gpiods[spi_get_chipselect(spi, 0)]); + spi->cs_gpiod = ctlr->cs_gpiods[spi->chip_select]; /* * Drivers may modify this initial i/o setup, but will @@ -692,8 +680,8 @@ int spi_add_device(struct spi_device *spi) int status; /* Chipselects are numbered 0..max; validate. */ - if (spi_get_chipselect(spi, 0) >= ctlr->num_chipselect) { - dev_err(dev, "cs%d >= max %d\n", spi_get_chipselect(spi, 0), + if (spi->chip_select >= ctlr->num_chipselect) { + dev_err(dev, "cs%d >= max %d\n", spi->chip_select, ctlr->num_chipselect); return -EINVAL; } @@ -714,8 +702,8 @@ static int spi_add_device_locked(struct spi_device *spi) struct device *dev = ctlr->dev.parent; /* Chipselects are numbered 0..max; validate. */ - if (spi_get_chipselect(spi, 0) >= ctlr->num_chipselect) { - dev_err(dev, "cs%d >= max %d\n", spi_get_chipselect(spi, 0), + if (spi->chip_select >= ctlr->num_chipselect) { + dev_err(dev, "cs%d >= max %d\n", spi->chip_select, ctlr->num_chipselect); return -EINVAL; } @@ -761,7 +749,7 @@ struct spi_device *spi_new_device(struct spi_controller *ctlr, WARN_ON(strlen(chip->modalias) >= sizeof(proxy->modalias)); - spi_set_chipselect(proxy, 0, chip->chip_select); + proxy->chip_select = chip->chip_select; proxy->max_speed_hz = chip->max_speed_hz; proxy->mode = chip->mode; proxy->irq = chip->irq; @@ -970,23 +958,24 @@ static void spi_set_cs(struct spi_device *spi, bool enable, bool force) * Avoid calling into the driver (or doing delays) if the chip select * isn't actually changing from the last time this was called. */ - if (!force && ((enable && spi->controller->last_cs == spi_get_chipselect(spi, 0)) || - (!enable && spi->controller->last_cs != spi_get_chipselect(spi, 0))) && + if (!force && ((enable && spi->controller->last_cs == spi->chip_select) || + (!enable && spi->controller->last_cs != spi->chip_select)) && (spi->controller->last_cs_mode_high == (spi->mode & SPI_CS_HIGH))) return; trace_spi_set_cs(spi, activate); - spi->controller->last_cs = enable ? spi_get_chipselect(spi, 0) : -1; + spi->controller->last_cs = enable ? spi->chip_select : -1; spi->controller->last_cs_mode_high = spi->mode & SPI_CS_HIGH; - if ((spi_get_csgpiod(spi, 0) || !spi->controller->set_cs_timing) && !activate) + if ((spi->cs_gpiod || !spi->controller->set_cs_timing) && !activate) { spi_delay_exec(&spi->cs_hold, NULL); + } if (spi->mode & SPI_CS_HIGH) enable = !enable; - if (spi_get_csgpiod(spi, 0)) { + if (spi->cs_gpiod) { if (!(spi->mode & SPI_NO_CS)) { /* * Historically ACPI has no means of the GPIO polarity and @@ -999,10 +988,10 @@ static void spi_set_cs(struct spi_device *spi, bool enable, bool force) * into account. */ if (has_acpi_companion(&spi->dev)) - gpiod_set_value_cansleep(spi_get_csgpiod(spi, 0), !enable); + gpiod_set_value_cansleep(spi->cs_gpiod, !enable); else /* Polarity handled by GPIO library */ - gpiod_set_value_cansleep(spi_get_csgpiod(spi, 0), activate); + gpiod_set_value_cansleep(spi->cs_gpiod, activate); } /* Some SPI masters need both GPIO CS & slave_select */ if ((spi->controller->flags & SPI_MASTER_GPIO_SS) && @@ -1012,7 +1001,7 @@ static void spi_set_cs(struct spi_device *spi, bool enable, bool force) spi->controller->set_cs(spi, !enable); } - if (spi_get_csgpiod(spi, 0) || !spi->controller->set_cs_timing) { + if (spi->cs_gpiod || !spi->controller->set_cs_timing) { if (activate) spi_delay_exec(&spi->cs_setup, NULL); else @@ -2302,7 +2291,7 @@ static int of_spi_parse_dt(struct spi_controller *ctlr, struct spi_device *spi, nc, rc); return rc; } - spi_set_chipselect(spi, 0, value); + spi->chip_select = value; /* Device speed */ if (!of_property_read_u32(nc, "spi-max-frequency", &value)) @@ -2416,7 +2405,7 @@ struct spi_device *spi_new_ancillary_device(struct spi_device *spi, strscpy(ancillary->modalias, "dummy", sizeof(ancillary->modalias)); /* Use provided chip-select for ancillary device */ - spi_set_chipselect(ancillary, 0, chip_select); + ancillary->chip_select = chip_select; /* Take over SPI mode/speed from SPI main device */ ancillary->max_speed_hz = spi->max_speed_hz; @@ -2663,7 +2652,7 @@ struct spi_device *acpi_spi_device_alloc(struct spi_controller *ctlr, spi->mode |= lookup.mode; spi->irq = lookup.irq; spi->bits_per_word = lookup.bits_per_word; - spi_set_chipselect(spi, 0, lookup.chip_select); + spi->chip_select = lookup.chip_select; return spi; } @@ -3622,37 +3611,6 @@ static int __spi_validate_bits_per_word(struct spi_controller *ctlr, return 0; } -/** - * spi_set_cs_timing - configure CS setup, hold, and inactive delays - * @spi: the device that requires specific CS timing configuration - * - * Return: zero on success, else a negative error code. - */ -static int spi_set_cs_timing(struct spi_device *spi) -{ - struct device *parent = spi->controller->dev.parent; - int status = 0; - - if (spi->controller->set_cs_timing && !spi_get_csgpiod(spi, 0)) { - if (spi->controller->auto_runtime_pm) { - status = pm_runtime_get_sync(parent); - if (status < 0) { - pm_runtime_put_noidle(parent); - dev_err(&spi->controller->dev, "Failed to power device: %d\n", - status); - return status; - } - - status = spi->controller->set_cs_timing(spi); - pm_runtime_mark_last_busy(parent); - pm_runtime_put_autosuspend(parent); - } else { - status = spi->controller->set_cs_timing(spi); - } - } - return status; -} - /** * spi_setup - setup SPI mode and clock rate * @spi: the device whose settings are being modified @@ -3749,12 +3707,6 @@ int spi_setup(struct spi_device *spi) } } - status = spi_set_cs_timing(spi); - if (status) { - mutex_unlock(&spi->controller->io_mutex); - return status; - } - if (spi->controller->auto_runtime_pm && spi->controller->set_cs) { status = pm_runtime_resume_and_get(spi->controller->dev.parent); if (status < 0) { @@ -3838,7 +3790,7 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message) * cs_change is set for each transfer. */ if ((spi->mode & SPI_CS_WORD) && (!(ctlr->mode_bits & SPI_CS_WORD) || - spi_get_csgpiod(spi, 0))) { + spi->cs_gpiod)) { size_t maxsize; int ret; diff --git a/drivers/spmi/spmi-mtk-pmif.c b/drivers/spmi/spmi-mtk-pmif.c index 01e8851e639d..ad511f2c3324 100644 --- a/drivers/spmi/spmi-mtk-pmif.c +++ b/drivers/spmi/spmi-mtk-pmif.c @@ -50,7 +50,6 @@ struct pmif { struct clk_bulk_data clks[PMIF_MAX_CLKS]; size_t nclks; const struct pmif_data *data; - raw_spinlock_t lock; }; static const char * const pmif_clock_names[] = { @@ -315,7 +314,6 @@ static int pmif_spmi_read_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid, struct ch_reg *inf_reg; int ret; u32 data, cmd; - unsigned long flags; /* Check for argument validation. */ if (sid & ~0xf) { @@ -336,7 +334,6 @@ static int pmif_spmi_read_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid, else return -EINVAL; - raw_spin_lock_irqsave(&arb->lock, flags); /* Wait for Software Interface FSM state to be IDLE. */ inf_reg = &arb->chan; ret = readl_poll_timeout_atomic(arb->base + arb->data->regs[inf_reg->ch_sta], @@ -346,7 +343,6 @@ static int pmif_spmi_read_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid, /* set channel ready if the data has transferred */ if (pmif_is_fsm_vldclr(arb)) pmif_writel(arb, 1, inf_reg->ch_rdy); - raw_spin_unlock_irqrestore(&arb->lock, flags); dev_err(&ctrl->dev, "failed to wait for SWINF_IDLE\n"); return ret; } @@ -354,7 +350,6 @@ static int pmif_spmi_read_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid, /* Send the command. */ cmd = (opc << 30) | (sid << 24) | ((len - 1) << 16) | addr; pmif_writel(arb, cmd, inf_reg->ch_send); - raw_spin_unlock_irqrestore(&arb->lock, flags); /* * Wait for Software Interface FSM state to be WFVLDCLR, @@ -381,8 +376,7 @@ static int pmif_spmi_write_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid, struct pmif *arb = spmi_controller_get_drvdata(ctrl); struct ch_reg *inf_reg; int ret; - u32 data, wdata, cmd; - unsigned long flags; + u32 data, cmd; if (len > 4) { dev_err(&ctrl->dev, "pmif supports 1..4 bytes per trans, but:%zu requested", len); @@ -400,10 +394,6 @@ static int pmif_spmi_write_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid, else return -EINVAL; - /* Set the write data. */ - memcpy(&wdata, buf, len); - - raw_spin_lock_irqsave(&arb->lock, flags); /* Wait for Software Interface FSM state to be IDLE. */ inf_reg = &arb->chan; ret = readl_poll_timeout_atomic(arb->base + arb->data->regs[inf_reg->ch_sta], @@ -413,17 +403,17 @@ static int pmif_spmi_write_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid, /* set channel ready if the data has transferred */ if (pmif_is_fsm_vldclr(arb)) pmif_writel(arb, 1, inf_reg->ch_rdy); - raw_spin_unlock_irqrestore(&arb->lock, flags); dev_err(&ctrl->dev, "failed to wait for SWINF_IDLE\n"); return ret; } - pmif_writel(arb, wdata, inf_reg->wdata); + /* Set the write data. */ + memcpy(&data, buf, len); + pmif_writel(arb, data, inf_reg->wdata); /* Send the command. */ cmd = (opc << 30) | BIT(29) | (sid << 24) | ((len - 1) << 16) | addr; pmif_writel(arb, cmd, inf_reg->ch_send); - raw_spin_unlock_irqrestore(&arb->lock, flags); return 0; } @@ -498,8 +488,6 @@ static int mtk_spmi_probe(struct platform_device *pdev) arb->chan.ch_send = PMIF_SWINF_0_ACC + chan_offset; arb->chan.ch_rdy = PMIF_SWINF_0_VLD_CLR + chan_offset; - raw_spin_lock_init(&arb->lock); - platform_set_drvdata(pdev, ctrl); err = spmi_controller_add(ctrl); diff --git a/drivers/staging/gdm724x/gdm_lte.c b/drivers/staging/gdm724x/gdm_lte.c index 5703a9ddb6d0..671ee8843c88 100644 --- a/drivers/staging/gdm724x/gdm_lte.c +++ b/drivers/staging/gdm724x/gdm_lte.c @@ -349,7 +349,7 @@ static s32 gdm_lte_tx_nic_type(struct net_device *dev, struct sk_buff *skb) /* Get ethernet protocol */ eth = (struct ethhdr *)skb->data; if (ntohs(eth->h_proto) == ETH_P_8021Q) { - vlan_eth = skb_vlan_eth_hdr(skb); + vlan_eth = (struct vlan_ethhdr *)skb->data; mac_proto = ntohs(vlan_eth->h_vlan_encapsulated_proto); network_data = skb->data + VLAN_ETH_HLEN; nic_type |= NIC_TYPE_F_VLAN; @@ -435,7 +435,7 @@ static netdev_tx_t gdm_lte_tx(struct sk_buff *skb, struct net_device *dev) * driver based on the NIC mac */ if (nic_type & NIC_TYPE_F_VLAN) { - struct vlan_ethhdr *vlan_eth = skb_vlan_eth_hdr(skb); + struct vlan_ethhdr *vlan_eth = (struct vlan_ethhdr *)skb->data; nic->vlan_id = ntohs(vlan_eth->h_vlan_TCI) & VLAN_VID_MASK; data_buf = skb->data + (VLAN_ETH_HLEN - ETH_HLEN); diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c index d16cf4115d03..a9bd1e71ea48 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c @@ -461,9 +461,6 @@ static const struct v4l2_ioctl_ops rkvdec_ioctl_ops = { .vidioc_streamon = v4l2_m2m_ioctl_streamon, .vidioc_streamoff = v4l2_m2m_ioctl_streamoff, - - .vidioc_decoder_cmd = v4l2_m2m_ioctl_stateless_decoder_cmd, - .vidioc_try_decoder_cmd = v4l2_m2m_ioctl_stateless_try_decoder_cmd, }; static int rkvdec_queue_setup(struct vb2_queue *vq, unsigned int *num_buffers, diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index 8d74e97c9874..7e81a53dbf3c 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c @@ -338,13 +338,11 @@ static int fd_do_rw(struct se_cmd *cmd, struct file *fd, } iov_iter_bvec(&iter, is_write, bvec, sgl_nents, len); - if (is_write) { - file_start_write(fd); + if (is_write) ret = vfs_iter_write(fd, &iter, &pos, 0); - file_end_write(fd); - } else { + else ret = vfs_iter_read(fd, &iter, &pos, 0); - } + if (is_write) { if (ret < 0 || ret != data_length) { pr_err("%s() write returned %d\n", __func__, ret); @@ -476,9 +474,7 @@ fd_execute_write_same(struct se_cmd *cmd) } iov_iter_bvec(&iter, ITER_SOURCE, bvec, nolb, len); - file_start_write(fd_dev->fd_file); ret = vfs_iter_write(fd_dev->fd_file, &iter, &pos, 0); - file_end_write(fd_dev->fd_file); kfree(bvec); if (ret < 0 || ret != len) { diff --git a/drivers/thunderbolt/debugfs.c b/drivers/thunderbolt/debugfs.c index f691bce5c147..d89f92032c1c 100644 --- a/drivers/thunderbolt/debugfs.c +++ b/drivers/thunderbolt/debugfs.c @@ -943,7 +943,7 @@ static void margining_port_remove(struct tb_port *port) snprintf(dir_name, sizeof(dir_name), "port%d", port->port); parent = debugfs_lookup(dir_name, port->sw->debugfs_dir); if (parent) - debugfs_lookup_and_remove("margining", parent); + debugfs_remove_recursive(debugfs_lookup("margining", parent)); kfree(port->usb4->margining); port->usb4->margining = NULL; diff --git a/drivers/tty/serial/8250/8250_bcm2835aux.c b/drivers/tty/serial/8250/8250_bcm2835aux.c index 4f4502fb5454..15a2387a5b25 100644 --- a/drivers/tty/serial/8250/8250_bcm2835aux.c +++ b/drivers/tty/serial/8250/8250_bcm2835aux.c @@ -119,8 +119,6 @@ static int bcm2835aux_serial_probe(struct platform_device *pdev) /* get the clock - this also enables the HW */ data->clk = devm_clk_get_optional(&pdev->dev, NULL); - if (IS_ERR(data->clk)) - return dev_err_probe(&pdev->dev, PTR_ERR(data->clk), "could not get clk\n"); /* get the interrupt */ ret = platform_get_irq(pdev, 0); diff --git a/drivers/tty/serial/8250/8250_exar.c b/drivers/tty/serial/8250/8250_exar.c index dca1abe36324..b406cba10b0e 100644 --- a/drivers/tty/serial/8250/8250_exar.c +++ b/drivers/tty/serial/8250/8250_exar.c @@ -442,7 +442,7 @@ static int generic_rs485_config(struct uart_port *port, struct ktermios *termios } static const struct serial_rs485 generic_rs485_supported = { - .flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND, + .flags = SER_RS485_ENABLED, }; static const struct exar8250_platform exar8250_default_platform = { @@ -486,8 +486,7 @@ static int iot2040_rs485_config(struct uart_port *port, struct ktermios *termios } static const struct serial_rs485 iot2040_rs485_supported = { - .flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND | - SER_RS485_RX_DURING_TX | SER_RS485_TERMINATE_BUS, + .flags = SER_RS485_ENABLED | SER_RS485_RX_DURING_TX | SER_RS485_TERMINATE_BUS, }; static const struct property_entry iot2040_gpio_properties[] = { diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c index 037d613006f5..0b04d810b3e6 100644 --- a/drivers/tty/serial/8250/8250_omap.c +++ b/drivers/tty/serial/8250/8250_omap.c @@ -1476,7 +1476,7 @@ static int omap8250_remove(struct platform_device *pdev) err = pm_runtime_resume_and_get(&pdev->dev); if (err) - dev_err(&pdev->dev, "Failed to resume hardware\n"); + return err; serial8250_unregister_port(priv->line); priv->line = -ENODEV; diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index f8962a3d4421..d2137f6eff32 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -450,13 +450,13 @@ static void imx_uart_stop_tx(struct uart_port *port) ucr1 = imx_uart_readl(sport, UCR1); imx_uart_writel(sport, ucr1 & ~UCR1_TRDYEN, UCR1); - ucr4 = imx_uart_readl(sport, UCR4); usr2 = imx_uart_readl(sport, USR2); - if ((!(usr2 & USR2_TXDC)) && (ucr4 & UCR4_TCEN)) { + if (!(usr2 & USR2_TXDC)) { /* The shifter is still busy, so retry once TC triggers */ return; } + ucr4 = imx_uart_readl(sport, UCR4); ucr4 &= ~UCR4_TCEN; imx_uart_writel(sport, ucr4, UCR4); @@ -2229,6 +2229,7 @@ static enum hrtimer_restart imx_trigger_stop_tx(struct hrtimer *t) return HRTIMER_NORESTART; } +static const struct serial_rs485 imx_no_rs485 = {}; /* No RS485 if no RTS */ static const struct serial_rs485 imx_rs485_supported = { .flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND | SER_RS485_RTS_AFTER_SEND | SER_RS485_RX_DURING_TX, @@ -2318,6 +2319,8 @@ static int imx_uart_probe(struct platform_device *pdev) /* RTS is required to control the RS485 transmitter */ if (sport->have_rtscts || sport->have_rtsgpio) sport->port.rs485_supported = imx_rs485_supported; + else + sport->port.rs485_supported = imx_no_rs485; sport->port.flags = UPF_BOOT_AUTOCONF; timer_setup(&sport->timer, imx_uart_timeout, 0); @@ -2344,7 +2347,7 @@ static int imx_uart_probe(struct platform_device *pdev) /* For register access, we only need to enable the ipg clock. */ ret = clk_prepare_enable(sport->clk_ipg); if (ret) { - dev_err(&pdev->dev, "failed to enable ipg clk: %d\n", ret); + dev_err(&pdev->dev, "failed to enable per clk: %d\n", ret); return ret; } @@ -2356,8 +2359,14 @@ static int imx_uart_probe(struct platform_device *pdev) sport->ufcr = readl(sport->port.membase + UFCR); ret = uart_get_rs485_mode(&sport->port); - if (ret) - goto err_clk; + if (ret) { + clk_disable_unprepare(sport->clk_ipg); + return ret; + } + + if (sport->port.rs485.flags & SER_RS485_ENABLED && + (!sport->have_rtscts && !sport->have_rtsgpio)) + dev_err(&pdev->dev, "no RTS control, disabling rs485\n"); /* * If using the i.MX UART RTS/CTS control then the RTS (CTS_B) @@ -2437,6 +2446,8 @@ static int imx_uart_probe(struct platform_device *pdev) imx_uart_writel(sport, ucr3, UCR3); } + clk_disable_unprepare(sport->clk_ipg); + hrtimer_init(&sport->trigger_start_tx, CLOCK_MONOTONIC, HRTIMER_MODE_REL); hrtimer_init(&sport->trigger_stop_tx, CLOCK_MONOTONIC, HRTIMER_MODE_REL); sport->trigger_start_tx.function = imx_trigger_start_tx; @@ -2452,7 +2463,7 @@ static int imx_uart_probe(struct platform_device *pdev) if (ret) { dev_err(&pdev->dev, "failed to request rx irq: %d\n", ret); - goto err_clk; + return ret; } ret = devm_request_irq(&pdev->dev, txirq, imx_uart_txint, 0, @@ -2460,7 +2471,7 @@ static int imx_uart_probe(struct platform_device *pdev) if (ret) { dev_err(&pdev->dev, "failed to request tx irq: %d\n", ret); - goto err_clk; + return ret; } ret = devm_request_irq(&pdev->dev, rtsirq, imx_uart_rtsint, 0, @@ -2468,14 +2479,14 @@ static int imx_uart_probe(struct platform_device *pdev) if (ret) { dev_err(&pdev->dev, "failed to request rts irq: %d\n", ret); - goto err_clk; + return ret; } } else { ret = devm_request_irq(&pdev->dev, rxirq, imx_uart_int, 0, dev_name(&pdev->dev), sport); if (ret) { dev_err(&pdev->dev, "failed to request irq: %d\n", ret); - goto err_clk; + return ret; } } @@ -2483,12 +2494,7 @@ static int imx_uart_probe(struct platform_device *pdev) platform_set_drvdata(pdev, sport); - ret = uart_add_one_port(&imx_uart_uart_driver, &sport->port); - -err_clk: - clk_disable_unprepare(sport->clk_ipg); - - return ret; + return uart_add_one_port(&imx_uart_uart_driver, &sport->port); } static int imx_uart_remove(struct platform_device *pdev) diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c index beb7896ebf8a..7d0d2718ef59 100644 --- a/drivers/tty/serial/omap-serial.c +++ b/drivers/tty/serial/omap-serial.c @@ -1512,13 +1512,6 @@ static struct omap_uart_port_info *of_get_uart_port_info(struct device *dev) return omap_up_info; } -static const struct serial_rs485 serial_omap_rs485_supported = { - .flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND | SER_RS485_RTS_AFTER_SEND | - SER_RS485_RX_DURING_TX, - .delay_rts_before_send = 1, - .delay_rts_after_send = 1, -}; - static int serial_omap_probe_rs485(struct uart_omap_port *up, struct device *dev) { @@ -1533,9 +1526,6 @@ static int serial_omap_probe_rs485(struct uart_omap_port *up, if (!np) return 0; - up->port.rs485_config = serial_omap_config_rs485; - up->port.rs485_supported = serial_omap_rs485_supported; - ret = uart_get_rs485_mode(&up->port); if (ret) return ret; @@ -1570,6 +1560,13 @@ static int serial_omap_probe_rs485(struct uart_omap_port *up, return 0; } +static const struct serial_rs485 serial_omap_rs485_supported = { + .flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND | SER_RS485_RTS_AFTER_SEND | + SER_RS485_RX_DURING_TX, + .delay_rts_before_send = 1, + .delay_rts_after_send = 1, +}; + static int serial_omap_probe(struct platform_device *pdev) { struct omap_uart_port_info *omap_up_info = dev_get_platdata(&pdev->dev); @@ -1637,11 +1634,17 @@ static int serial_omap_probe(struct platform_device *pdev) dev_info(up->port.dev, "no wakeirq for uart%d\n", up->port.line); + ret = serial_omap_probe_rs485(up, &pdev->dev); + if (ret < 0) + goto err_rs485; + sprintf(up->name, "OMAP UART%d", up->port.line); up->port.mapbase = mem->start; up->port.membase = base; up->port.flags = omap_up_info->flags; up->port.uartclk = omap_up_info->uartclk; + up->port.rs485_config = serial_omap_config_rs485; + up->port.rs485_supported = serial_omap_rs485_supported; if (!up->port.uartclk) { up->port.uartclk = DEFAULT_CLK_SPEED; dev_warn(&pdev->dev, @@ -1649,10 +1652,6 @@ static int serial_omap_probe(struct platform_device *pdev) DEFAULT_CLK_SPEED); } - ret = serial_omap_probe_rs485(up, &pdev->dev); - if (ret < 0) - goto err_rs485; - up->latency = PM_QOS_CPU_LATENCY_DEFAULT_VALUE; up->calc_latency = PM_QOS_CPU_LATENCY_DEFAULT_VALUE; cpu_latency_qos_add_request(&up->pm_qos_request, up->latency); diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c index db33790e6675..b4b849415c50 100644 --- a/drivers/tty/serial/sc16is7xx.c +++ b/drivers/tty/serial/sc16is7xx.c @@ -24,7 +24,6 @@ #include #include #include -#include #include #define SC16IS7XX_NAME "sc16is7xx" @@ -1717,12 +1716,9 @@ static int sc16is7xx_spi_probe(struct spi_device *spi) /* Setup SPI bus */ spi->bits_per_word = 8; - /* For all variants, only mode 0 is supported */ - if ((spi->mode & SPI_MODE_X_MASK) != SPI_MODE_0) - return dev_err_probe(&spi->dev, -EINVAL, "Unsupported SPI mode\n"); - + /* only supports mode 0 on SC16IS762 */ spi->mode = spi->mode ? : SPI_MODE_0; - spi->max_speed_hz = spi->max_speed_hz ? : 4 * HZ_PER_MHZ; + spi->max_speed_hz = spi->max_speed_hz ? : 15000000; ret = spi_setup(spi); if (ret) return ret; diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c index f0ed30d0a697..d4e57f9017db 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c @@ -1353,28 +1353,20 @@ static void uart_sanitize_serial_rs485(struct uart_port *port, struct serial_rs4 return; } - rs485->flags &= supported_flags; - /* Pick sane settings if the user hasn't */ - if (!(rs485->flags & SER_RS485_RTS_ON_SEND) == + if ((supported_flags & (SER_RS485_RTS_ON_SEND|SER_RS485_RTS_AFTER_SEND)) && + !(rs485->flags & SER_RS485_RTS_ON_SEND) == !(rs485->flags & SER_RS485_RTS_AFTER_SEND)) { - if (supported_flags & SER_RS485_RTS_ON_SEND) { - rs485->flags |= SER_RS485_RTS_ON_SEND; - rs485->flags &= ~SER_RS485_RTS_AFTER_SEND; - - dev_warn_ratelimited(port->dev, - "%s (%d): invalid RTS setting, using RTS_ON_SEND instead\n", - port->name, port->line); - } else { - rs485->flags |= SER_RS485_RTS_AFTER_SEND; - rs485->flags &= ~SER_RS485_RTS_ON_SEND; - - dev_warn_ratelimited(port->dev, - "%s (%d): invalid RTS setting, using RTS_AFTER_SEND instead\n", - port->name, port->line); - } + dev_warn_ratelimited(port->dev, + "%s (%d): invalid RTS setting, using RTS_ON_SEND instead\n", + port->name, port->line); + rs485->flags |= SER_RS485_RTS_ON_SEND; + rs485->flags &= ~SER_RS485_RTS_AFTER_SEND; + supported_flags |= SER_RS485_RTS_ON_SEND|SER_RS485_RTS_AFTER_SEND; } + rs485->flags &= supported_flags; + uart_sanitize_serial_rs485_delays(port, rs485); /* Return clean padding area to userspace */ @@ -1436,7 +1428,7 @@ static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port, int ret; unsigned long flags; - if (!(port->rs485_supported.flags & SER_RS485_ENABLED)) + if (!port->rs485_config) return -ENOTTY; if (copy_from_user(&rs485, rs485_user, sizeof(*rs485_user))) @@ -3428,9 +3420,6 @@ int uart_get_rs485_mode(struct uart_port *port) u32 rs485_delay[2]; int ret; - if (!(port->rs485_supported.flags & SER_RS485_ENABLED)) - return 0; - ret = device_property_read_u32_array(dev, "rs485-rts-delay", rs485_delay, 2); if (!ret) { diff --git a/drivers/tty/tty.h b/drivers/tty/tty.h index 91515e1ebc8d..c5ee21912755 100644 --- a/drivers/tty/tty.h +++ b/drivers/tty/tty.h @@ -63,7 +63,7 @@ int tty_check_change(struct tty_struct *tty); void __stop_tty(struct tty_struct *tty); void __start_tty(struct tty_struct *tty); void tty_write_unlock(struct tty_struct *tty); -int tty_write_lock(struct tty_struct *tty, bool ndelay); +int tty_write_lock(struct tty_struct *tty, int ndelay); void tty_vhangup_session(struct tty_struct *tty); void tty_open_proc_set_tty(struct file *filp, struct tty_struct *tty); int tty_signal_session_leader(struct tty_struct *tty, int exit_session); diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index aaf77a5616ff..8fb6c6853556 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -939,7 +939,7 @@ void tty_write_unlock(struct tty_struct *tty) wake_up_interruptible_poll(&tty->write_wait, EPOLLOUT); } -int tty_write_lock(struct tty_struct *tty, bool ndelay) +int tty_write_lock(struct tty_struct *tty, int ndelay) { if (!mutex_trylock(&tty->atomic_write_lock)) { if (ndelay) @@ -1153,7 +1153,7 @@ int tty_send_xchar(struct tty_struct *tty, char ch) return 0; } - if (tty_write_lock(tty, false) < 0) + if (tty_write_lock(tty, 0) < 0) return -ERESTARTSYS; down_read(&tty->termios_rwsem); @@ -2472,25 +2472,22 @@ static int send_break(struct tty_struct *tty, unsigned int duration) return 0; if (tty->driver->flags & TTY_DRIVER_HARDWARE_BREAK) - return tty->ops->break_ctl(tty, duration); - - /* Do the work ourselves */ - if (tty_write_lock(tty, false) < 0) - return -EINTR; - - retval = tty->ops->break_ctl(tty, -1); - if (!retval) { - msleep_interruptible(duration); + retval = tty->ops->break_ctl(tty, duration); + else { + /* Do the work ourselves */ + if (tty_write_lock(tty, 0) < 0) + return -EINTR; + retval = tty->ops->break_ctl(tty, -1); + if (retval) + goto out; + if (!signal_pending(current)) + msleep_interruptible(duration); retval = tty->ops->break_ctl(tty, 0); - } else if (retval == -EOPNOTSUPP) { - /* some drivers can tell only dynamically */ - retval = 0; +out: + tty_write_unlock(tty); + if (signal_pending(current)) + retval = -EINTR; } - tty_write_unlock(tty); - - if (signal_pending(current)) - retval = -EINTR; - return retval; } diff --git a/drivers/tty/tty_ioctl.c b/drivers/tty/tty_ioctl.c index 8767c504b95d..ad1cf51ecd11 100644 --- a/drivers/tty/tty_ioctl.c +++ b/drivers/tty/tty_ioctl.c @@ -506,7 +506,7 @@ retry_write_wait: if (retval < 0) return retval; - if (tty_write_lock(tty, false) < 0) + if (tty_write_lock(tty, 0) < 0) goto retry_write_wait; /* Racing writer? */ diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c index 2d572f6c8ec8..62082d64ece0 100644 --- a/drivers/uio/uio.c +++ b/drivers/uio/uio.c @@ -466,13 +466,13 @@ static int uio_open(struct inode *inode, struct file *filep) mutex_lock(&minor_lock); idev = idr_find(&uio_idr, iminor(inode)); + mutex_unlock(&minor_lock); if (!idev) { ret = -ENODEV; - mutex_unlock(&minor_lock); goto out; } + get_device(&idev->dev); - mutex_unlock(&minor_lock); if (!try_module_get(idev->owner)) { ret = -ENODEV; @@ -1064,9 +1064,10 @@ void uio_unregister_device(struct uio_info *info) wake_up_interruptible(&idev->wait); kill_fasync(&idev->async_queue, SIGIO, POLL_HUP); - uio_free_minor(minor); device_unregister(&idev->dev); + uio_free_minor(minor); + return; } EXPORT_SYMBOL_GPL(uio_unregister_device); diff --git a/drivers/usb/cdns3/cdns3-gadget.c b/drivers/usb/cdns3/cdns3-gadget.c index ccdd525bd7c8..69a44bd7e5d0 100644 --- a/drivers/usb/cdns3/cdns3-gadget.c +++ b/drivers/usb/cdns3/cdns3-gadget.c @@ -1117,8 +1117,6 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep, dma_addr_t trb_dma; u32 togle_pcs = 1; int sg_iter = 0; - int num_trb_req; - int trb_burst; int num_trb; int address; u32 control; @@ -1127,13 +1125,15 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep, struct scatterlist *s = NULL; bool sg_supported = !!(request->num_mapped_sgs); - num_trb_req = sg_supported ? request->num_mapped_sgs : 1; - - /* ISO transfer require each SOF have a TD, each TD include some TRBs */ if (priv_ep->type == USB_ENDPOINT_XFER_ISOC) - num_trb = priv_ep->interval * num_trb_req; + num_trb = priv_ep->interval; else - num_trb = num_trb_req; + num_trb = sg_supported ? request->num_mapped_sgs : 1; + + if (num_trb > priv_ep->free_trbs) { + priv_ep->flags |= EP_RING_FULL; + return -ENOBUFS; + } priv_req = to_cdns3_request(request); address = priv_ep->endpoint.desc->bEndpointAddress; @@ -1182,31 +1182,14 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep, link_trb->control = cpu_to_le32(((priv_ep->pcs) ? TRB_CYCLE : 0) | TRB_TYPE(TRB_LINK) | TRB_TOGGLE | ch_bit); - - if (priv_ep->type == USB_ENDPOINT_XFER_ISOC) { - /* - * ISO require LINK TRB must be first one of TD. - * Fill LINK TRBs for left trb space to simply software process logic. - */ - while (priv_ep->enqueue) { - *trb = *link_trb; - trace_cdns3_prepare_trb(priv_ep, trb); - - cdns3_ep_inc_enq(priv_ep); - trb = priv_ep->trb_pool + priv_ep->enqueue; - priv_req->trb = trb; - } - } - } - - if (num_trb > priv_ep->free_trbs) { - priv_ep->flags |= EP_RING_FULL; - return -ENOBUFS; } if (priv_dev->dev_ver <= DEV_VER_V2) togle_pcs = cdns3_wa1_update_guard(priv_ep, trb); + if (sg_supported) + s = request->sg; + /* set incorrect Cycle Bit for first trb*/ control = priv_ep->pcs ? 0 : TRB_CYCLE; trb->length = 0; @@ -1224,9 +1207,6 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep, do { u32 length; - if (!(sg_iter % num_trb_req) && sg_supported) - s = request->sg; - /* fill TRB */ control |= TRB_TYPE(TRB_NORMAL); if (sg_supported) { @@ -1241,36 +1221,7 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep, total_tdl += DIV_ROUND_UP(length, priv_ep->endpoint.maxpacket); - trb_burst = priv_ep->trb_burst_size; - - /* - * Supposed DMA cross 4k bounder problem should be fixed at DEV_VER_V2, but still - * met problem when do ISO transfer if sg enabled. - * - * Data pattern likes below when sg enabled, package size is 1k and mult is 2 - * [UVC Header(8B) ] [data(3k - 8)] ... - * - * The received data at offset 0xd000 will get 0xc000 data, len 0x70. Error happen - * as below pattern: - * 0xd000: wrong - * 0xe000: wrong - * 0xf000: correct - * 0x10000: wrong - * 0x11000: wrong - * 0x12000: correct - * ... - * - * But it is still unclear about why error have not happen below 0xd000, it should - * cross 4k bounder. But anyway, the below code can fix this problem. - * - * To avoid DMA cross 4k bounder at ISO transfer, reduce burst len according to 16. - */ - if (priv_ep->type == USB_ENDPOINT_XFER_ISOC && priv_dev->dev_ver <= DEV_VER_V2) - if (ALIGN_DOWN(trb->buffer, SZ_4K) != - ALIGN_DOWN(trb->buffer + length, SZ_4K)) - trb_burst = 16; - - trb->length |= cpu_to_le32(TRB_BURST_LEN(trb_burst) | + trb->length |= cpu_to_le32(TRB_BURST_LEN(priv_ep->trb_burst_size) | TRB_LEN(length)); pcs = priv_ep->pcs ? TRB_CYCLE : 0; @@ -1297,7 +1248,7 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep, if (sg_supported) { trb->control |= cpu_to_le32(TRB_ISP); /* Don't set chain bit for last TRB */ - if ((sg_iter % num_trb_req) < num_trb_req - 1) + if (sg_iter < num_trb - 1) trb->control |= cpu_to_le32(TRB_CHAIN); s = sg_next(s); @@ -1555,12 +1506,6 @@ static void cdns3_transfer_completed(struct cdns3_device *priv_dev, /* The TRB was changed as link TRB, and the request was handled at ep_dequeue */ while (TRB_FIELD_TO_TYPE(le32_to_cpu(trb->control)) == TRB_LINK) { - - /* ISO ep_traddr may stop at LINK TRB */ - if (priv_ep->dequeue == cdns3_get_dma_pos(priv_dev, priv_ep) && - priv_ep->type == USB_ENDPOINT_XFER_ISOC) - break; - trace_cdns3_complete_trb(priv_ep, trb); cdns3_ep_inc_deq(priv_ep); trb = priv_ep->trb_pool + priv_ep->dequeue; @@ -1593,10 +1538,6 @@ static void cdns3_transfer_completed(struct cdns3_device *priv_dev, } if (request_handled) { - /* TRBs are duplicated by priv_ep->interval time for ISO IN */ - if (priv_ep->type == USB_ENDPOINT_XFER_ISOC && priv_ep->dir) - request->actual /= priv_ep->interval; - cdns3_gadget_giveback(priv_ep, priv_req, 0); request_handled = false; transfer_end = false; @@ -2092,10 +2033,11 @@ int cdns3_ep_config(struct cdns3_endpoint *priv_ep, bool enable) bool is_iso_ep = (priv_ep->type == USB_ENDPOINT_XFER_ISOC); struct cdns3_device *priv_dev = priv_ep->cdns3_dev; u32 bEndpointAddress = priv_ep->num | priv_ep->dir; - u32 max_packet_size = priv_ep->wMaxPacketSize; - u8 maxburst = priv_ep->bMaxBurst; + u32 max_packet_size = 0; + u8 maxburst = 0; u32 ep_cfg = 0; u8 buffering; + u8 mult = 0; int ret; buffering = priv_dev->ep_buf_size - 1; @@ -2117,7 +2059,8 @@ int cdns3_ep_config(struct cdns3_endpoint *priv_ep, bool enable) break; default: ep_cfg = EP_CFG_EPTYPE(USB_ENDPOINT_XFER_ISOC); - buffering = (priv_ep->bMaxBurst + 1) * (priv_ep->mult + 1) - 1; + mult = priv_dev->ep_iso_burst - 1; + buffering = mult + 1; } switch (priv_dev->gadget.speed) { @@ -2128,8 +2071,17 @@ int cdns3_ep_config(struct cdns3_endpoint *priv_ep, bool enable) max_packet_size = is_iso_ep ? 1024 : 512; break; case USB_SPEED_SUPER: - if (priv_ep->type != USB_ENDPOINT_XFER_ISOC) { - max_packet_size = 1024; + /* It's limitation that driver assumes in driver. */ + mult = 0; + max_packet_size = 1024; + if (priv_ep->type == USB_ENDPOINT_XFER_ISOC) { + maxburst = priv_dev->ep_iso_burst - 1; + buffering = (mult + 1) * + (maxburst + 1); + + if (priv_ep->interval > 1) + buffering++; + } else { maxburst = priv_dev->ep_buf_size - 1; } break; @@ -2158,6 +2110,7 @@ int cdns3_ep_config(struct cdns3_endpoint *priv_ep, bool enable) if (priv_dev->dev_ver < DEV_VER_V2) priv_ep->trb_burst_size = 16; + mult = min_t(u8, mult, EP_CFG_MULT_MAX); buffering = min_t(u8, buffering, EP_CFG_BUFFERING_MAX); maxburst = min_t(u8, maxburst, EP_CFG_MAXBURST_MAX); @@ -2191,7 +2144,7 @@ int cdns3_ep_config(struct cdns3_endpoint *priv_ep, bool enable) } ep_cfg |= EP_CFG_MAXPKTSIZE(max_packet_size) | - EP_CFG_MULT(priv_ep->mult) | /* must match EP setting */ + EP_CFG_MULT(mult) | EP_CFG_BUFFERING(buffering) | EP_CFG_MAXBURST(maxburst); @@ -2281,13 +2234,6 @@ usb_ep *cdns3_gadget_match_ep(struct usb_gadget *gadget, priv_ep->type = usb_endpoint_type(desc); priv_ep->flags |= EP_CLAIMED; priv_ep->interval = desc->bInterval ? BIT(desc->bInterval - 1) : 0; - priv_ep->wMaxPacketSize = usb_endpoint_maxp(desc); - priv_ep->mult = USB_EP_MAXP_MULT(priv_ep->wMaxPacketSize); - priv_ep->wMaxPacketSize &= USB_ENDPOINT_MAXP_MASK; - if (priv_ep->type == USB_ENDPOINT_XFER_ISOC && comp_desc) { - priv_ep->mult = USB_SS_MULT(comp_desc->bmAttributes) - 1; - priv_ep->bMaxBurst = comp_desc->bMaxBurst; - } spin_unlock_irqrestore(&priv_dev->lock, flags); return &priv_ep->endpoint; @@ -3069,40 +3015,22 @@ static int cdns3_gadget_check_config(struct usb_gadget *gadget) struct cdns3_endpoint *priv_ep; struct usb_ep *ep; int n_in = 0; - int iso = 0; - int out = 1; int total; - int n; list_for_each_entry(ep, &gadget->ep_list, ep_list) { priv_ep = ep_to_cdns3_ep(ep); - if (!(priv_ep->flags & EP_CLAIMED)) - continue; - - n = (priv_ep->mult + 1) * (priv_ep->bMaxBurst + 1); - if (ep->address & USB_DIR_IN) { - /* - * ISO transfer: DMA start move data when get ISO, only transfer - * data as min(TD size, iso). No benefit for allocate bigger - * internal memory than 'iso'. - */ - if (priv_ep->type == USB_ENDPOINT_XFER_ISOC) - iso += n; - else - n_in++; - } else { - if (priv_ep->type == USB_ENDPOINT_XFER_ISOC) - out = max_t(int, out, n); - } + if ((priv_ep->flags & EP_CLAIMED) && (ep->address & USB_DIR_IN)) + n_in++; } /* 2KB are reserved for EP0, 1KB for out*/ - total = 2 + n_in + out + iso; + total = 2 + n_in + 1; if (total > priv_dev->onchip_buffers) return -ENOMEM; - priv_dev->ep_buf_size = (priv_dev->onchip_buffers - 2 - iso) / (n_in + out); + priv_dev->ep_buf_size = priv_dev->ep_iso_burst = + (priv_dev->onchip_buffers - 2) / (n_in + 1); return 0; } diff --git a/drivers/usb/cdns3/cdns3-gadget.h b/drivers/usb/cdns3/cdns3-gadget.h index 086a7bb83897..fbe4a8e3aa89 100644 --- a/drivers/usb/cdns3/cdns3-gadget.h +++ b/drivers/usb/cdns3/cdns3-gadget.h @@ -1168,9 +1168,6 @@ struct cdns3_endpoint { u8 dir; u8 num; u8 type; - u8 mult; - u8 bMaxBurst; - u16 wMaxPacketSize; int interval; int free_trbs; diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index 763d6858a8e6..b9227f41cf1c 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c @@ -523,13 +523,6 @@ static irqreturn_t ci_irq_handler(int irq, void *data) u32 otgsc = 0; if (ci->in_lpm) { - /* - * If we already have a wakeup irq pending there, - * let's just return to wait resume finished firstly. - */ - if (ci->wakeup_int) - return IRQ_HANDLED; - disable_irq_nosync(irq); ci->wakeup_int = true; pm_runtime_get(ci->dev); diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 2a7eea4e251a..36bf051b345b 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -892,9 +892,6 @@ static int acm_tty_break_ctl(struct tty_struct *tty, int state) struct acm *acm = tty->driver_data; int retval; - if (!(acm->ctrl_caps & USB_CDC_CAP_BRK)) - return -EOPNOTSUPP; - retval = acm_send_break(acm, state ? 0xffff : 0); if (retval < 0) dev_dbg(&acm->control->dev, diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index ab94a0ef339d..bff3a4e30e12 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -277,11 +277,48 @@ int dwc3_core_soft_reset(struct dwc3 *dwc) /* * We're resetting only the device side because, if we're in host mode, * XHCI driver will reset the host block. If dwc3 was configured for - * host-only mode, then we can return early. + * host-only mode or current role is host, then we can return early. */ if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_HOST) return 0; + /* + * If the dr_mode is host and the dwc->current_dr_role is not the + * corresponding DWC3_GCTL_PRTCAP_HOST, then the dwc3_core_init_mode + * isn't executed yet. Ensure the phy is ready before the controller + * updates the GCTL.PRTCAPDIR or other settings by soft-resetting + * the phy. + * + * Note: GUSB3PIPECTL[n] and GUSB2PHYCFG[n] are port settings where n + * is port index. If this is a multiport host, then we need to reset + * all active ports. + */ + if (dwc->dr_mode == USB_DR_MODE_HOST) { + u32 usb3_port; + u32 usb2_port; + + usb3_port = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0)); + usb3_port |= DWC3_GUSB3PIPECTL_PHYSOFTRST; + dwc3_writel(dwc->regs, DWC3_GUSB3PIPECTL(0), usb3_port); + + usb2_port = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); + usb2_port |= DWC3_GUSB2PHYCFG_PHYSOFTRST; + dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), usb2_port); + + /* Small delay for phy reset assertion */ + usleep_range(1000, 2000); + + usb3_port &= ~DWC3_GUSB3PIPECTL_PHYSOFTRST; + dwc3_writel(dwc->regs, DWC3_GUSB3PIPECTL(0), usb3_port); + + usb2_port &= ~DWC3_GUSB2PHYCFG_PHYSOFTRST; + dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), usb2_port); + + /* Wait for clock synchronization */ + msleep(50); + return 0; + } + reg = dwc3_readl(dwc->regs, DWC3_DCTL); reg |= DWC3_DCTL_CSFTRST; reg &= ~DWC3_DCTL_RUN_STOP; diff --git a/drivers/usb/host/fotg210-hcd.c b/drivers/usb/host/fotg210-hcd.c index dc968960769e..c4c1fbc12b4c 100644 --- a/drivers/usb/host/fotg210-hcd.c +++ b/drivers/usb/host/fotg210-hcd.c @@ -429,6 +429,8 @@ static void qh_lines(struct fotg210_hcd *fotg210, struct fotg210_qh *qh, temp = size; size -= temp; next += temp; + if (temp == size) + goto done; } temp = snprintf(next, size, "\n"); @@ -438,6 +440,7 @@ static void qh_lines(struct fotg210_hcd *fotg210, struct fotg210_qh *qh, size -= temp; next += temp; +done: *sizep = size; *nextp = next; } diff --git a/drivers/usb/host/xhci-mtk.c b/drivers/usb/host/xhci-mtk.c index bb4f80627cdc..a0921687444b 100644 --- a/drivers/usb/host/xhci-mtk.c +++ b/drivers/usb/host/xhci-mtk.c @@ -7,7 +7,6 @@ * Chunfeng Yun */ -#include #include #include #include @@ -74,9 +73,6 @@ #define FRMCNT_LEV1_RANG (0x12b << 8) #define FRMCNT_LEV1_RANG_MASK GENMASK(19, 8) -#define HSCH_CFG1 0x960 -#define SCH3_RXFIFO_DEPTH_MASK GENMASK(21, 20) - #define SS_GEN2_EOF_CFG 0x990 #define SSG2EOF_OFFSET 0x3c @@ -118,8 +114,6 @@ #define SSC_IP_SLEEP_EN BIT(4) #define SSC_SPM_INT_EN BIT(1) -#define SCH_FIFO_TO_KB(x) ((x) >> 10) - enum ssusb_uwk_vers { SSUSB_UWK_V1 = 1, SSUSB_UWK_V2, @@ -171,35 +165,6 @@ static void xhci_mtk_set_frame_interval(struct xhci_hcd_mtk *mtk) writel(value, hcd->regs + SS_GEN2_EOF_CFG); } -/* - * workaround: usb3.2 gen1 isoc rx hw issue - * host send out unexpected ACK afer device fininsh a burst transfer with - * a short packet. - */ -static void xhci_mtk_rxfifo_depth_set(struct xhci_hcd_mtk *mtk) -{ - struct usb_hcd *hcd = mtk->hcd; - u32 value; - - if (!mtk->rxfifo_depth) - return; - - value = readl(hcd->regs + HSCH_CFG1); - value &= ~SCH3_RXFIFO_DEPTH_MASK; - value |= FIELD_PREP(SCH3_RXFIFO_DEPTH_MASK, - SCH_FIFO_TO_KB(mtk->rxfifo_depth) - 1); - writel(value, hcd->regs + HSCH_CFG1); -} - -static void xhci_mtk_init_quirk(struct xhci_hcd_mtk *mtk) -{ - /* workaround only for mt8195 */ - xhci_mtk_set_frame_interval(mtk); - - /* workaround for SoCs using SSUSB about before IPM v1.6.0 */ - xhci_mtk_rxfifo_depth_set(mtk); -} - static int xhci_mtk_host_enable(struct xhci_hcd_mtk *mtk) { struct mu3c_ippc_regs __iomem *ippc = mtk->ippc_regs; @@ -488,7 +453,8 @@ static int xhci_mtk_setup(struct usb_hcd *hcd) if (ret) return ret; - xhci_mtk_init_quirk(mtk); + /* workaround only for mt8195 */ + xhci_mtk_set_frame_interval(mtk); } ret = xhci_gen_setup(hcd, xhci_mtk_quirks); @@ -565,8 +531,6 @@ static int xhci_mtk_probe(struct platform_device *pdev) of_property_read_u32(node, "mediatek,u2p-dis-msk", &mtk->u2p_dis_msk); - of_property_read_u32(node, "rx-fifo-depth", &mtk->rxfifo_depth); - ret = usb_wakeup_of_property_parse(mtk, node); if (ret) { dev_err(dev, "failed to parse uwk property\n"); diff --git a/drivers/usb/host/xhci-mtk.h b/drivers/usb/host/xhci-mtk.h index 2a6a47d0f09a..1174a510dd38 100644 --- a/drivers/usb/host/xhci-mtk.h +++ b/drivers/usb/host/xhci-mtk.h @@ -160,8 +160,6 @@ struct xhci_hcd_mtk { struct regmap *uwk; u32 uwk_reg_base; u32 uwk_vers; - /* quirk */ - u32 rxfifo_depth; }; static inline struct xhci_hcd_mtk *hcd_to_mtk(struct usb_hcd *hcd) diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c index 447887f101f5..abb1cd35d8a6 100644 --- a/drivers/usb/mon/mon_bin.c +++ b/drivers/usb/mon/mon_bin.c @@ -1247,19 +1247,14 @@ static vm_fault_t mon_bin_vma_fault(struct vm_fault *vmf) struct mon_reader_bin *rp = vmf->vma->vm_private_data; unsigned long offset, chunk_idx; struct page *pageptr; - unsigned long flags; - spin_lock_irqsave(&rp->b_lock, flags); offset = vmf->pgoff << PAGE_SHIFT; - if (offset >= rp->b_size) { - spin_unlock_irqrestore(&rp->b_lock, flags); + if (offset >= rp->b_size) return VM_FAULT_SIGBUS; - } chunk_idx = offset / CHUNK_SIZE; pageptr = rp->b_vec[chunk_idx].pg; get_page(pageptr); vmf->page = pageptr; - spin_unlock_irqrestore(&rp->b_lock, flags); return 0; } diff --git a/drivers/usb/phy/phy-mxs-usb.c b/drivers/usb/phy/phy-mxs-usb.c index 160c9264339f..9299df53eb9d 100644 --- a/drivers/usb/phy/phy-mxs-usb.c +++ b/drivers/usb/phy/phy-mxs-usb.c @@ -388,7 +388,8 @@ static void __mxs_phy_disconnect_line(struct mxs_phy *mxs_phy, bool disconnect) static bool mxs_phy_is_otg_host(struct mxs_phy *mxs_phy) { - return mxs_phy->phy.last_event == USB_EVENT_ID; + return IS_ENABLED(CONFIG_USB_OTG) && + mxs_phy->phy.last_event == USB_EVENT_ID; } static void mxs_phy_disconnect_line(struct mxs_phy *mxs_phy, bool on) diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index fe2173e37b06..05e28a5ce42b 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c @@ -1033,9 +1033,9 @@ static const struct usb_device_id id_table_combined[] = { { USB_DEVICE(FTDI_VID, ACTISENSE_USG_PID) }, { USB_DEVICE(FTDI_VID, ACTISENSE_NGT_PID) }, { USB_DEVICE(FTDI_VID, ACTISENSE_NGW_PID) }, - { USB_DEVICE(FTDI_VID, ACTISENSE_UID_PID) }, - { USB_DEVICE(FTDI_VID, ACTISENSE_USA_PID) }, - { USB_DEVICE(FTDI_VID, ACTISENSE_NGX_PID) }, + { USB_DEVICE(FTDI_VID, ACTISENSE_D9AC_PID) }, + { USB_DEVICE(FTDI_VID, ACTISENSE_D9AD_PID) }, + { USB_DEVICE(FTDI_VID, ACTISENSE_D9AE_PID) }, { USB_DEVICE(FTDI_VID, ACTISENSE_D9AF_PID) }, { USB_DEVICE(FTDI_VID, CHETCO_SEAGAUGE_PID) }, { USB_DEVICE(FTDI_VID, CHETCO_SEASWITCH_PID) }, diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 21a2b5a25fc0..e2099445db70 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h @@ -1568,9 +1568,9 @@ #define ACTISENSE_USG_PID 0xD9A9 /* USG USB Serial Adapter */ #define ACTISENSE_NGT_PID 0xD9AA /* NGT NMEA2000 Interface */ #define ACTISENSE_NGW_PID 0xD9AB /* NGW NMEA2000 Gateway */ -#define ACTISENSE_UID_PID 0xD9AC /* USB Isolating Device */ -#define ACTISENSE_USA_PID 0xD9AD /* USB to Serial Adapter */ -#define ACTISENSE_NGX_PID 0xD9AE /* NGX NMEA2000 Gateway */ +#define ACTISENSE_D9AC_PID 0xD9AC /* Actisense Reserved */ +#define ACTISENSE_D9AD_PID 0xD9AD /* Actisense Reserved */ +#define ACTISENSE_D9AE_PID 0xD9AE /* Actisense Reserved */ #define ACTISENSE_D9AF_PID 0xD9AF /* Actisense Reserved */ #define CHETCO_SEAGAUGE_PID 0xA548 /* SeaGauge USB Adapter */ #define CHETCO_SEASWITCH_PID 0xA549 /* SeaSwitch USB Adapter */ diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 4adef9259870..7f2aa72d52e6 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -272,7 +272,6 @@ static void option_instat_callback(struct urb *urb); #define QUECTEL_PRODUCT_RM500Q 0x0800 #define QUECTEL_PRODUCT_RM520N 0x0801 #define QUECTEL_PRODUCT_EC200U 0x0901 -#define QUECTEL_PRODUCT_EG912Y 0x6001 #define QUECTEL_PRODUCT_EC200S_CN 0x6002 #define QUECTEL_PRODUCT_EC200A 0x6005 #define QUECTEL_PRODUCT_EM061K_LWW 0x6008 @@ -1233,7 +1232,6 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE_INTERFACE_CLASS(QUECTEL_VENDOR_ID, 0x0700, 0xff), /* BG95 */ .driver_info = RSVD(3) | ZLP }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x30) }, - { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0, 0x40) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x10), .driver_info = ZLP }, @@ -1246,7 +1244,6 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200U, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) }, - { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG912Y, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500K, 0xff, 0x00, 0x00) }, { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, @@ -2245,8 +2242,6 @@ static const struct usb_device_id option_ids[] = { .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, { USB_DEVICE(0x0489, 0xe0b5), /* Foxconn T77W968 ESIM */ .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, - { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0da, 0xff), /* Foxconn T99W265 MBIM variant */ - .driver_info = RSVD(3) | RSVD(5) }, { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0db, 0xff), /* Foxconn T99W265 MBIM */ .driver_info = RSVD(3) }, { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0ee, 0xff), /* Foxconn T99W368 MBIM */ diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index fd68204374f2..20dcbccb290b 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h @@ -1305,17 +1305,6 @@ UNUSUAL_DEV( 0x090c, 0x6000, 0x0100, 0x0100, USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_INITIAL_READ10 ), -/* - * Patch by Tasos Sahanidis - * This flash drive always shows up with write protect enabled - * during the first mode sense. - */ -UNUSUAL_DEV(0x0951, 0x1697, 0x0100, 0x0100, - "Kingston", - "DT Ultimate G3", - USB_SC_DEVICE, USB_PR_DEVICE, NULL, - US_FL_NO_WP_DETECT), - /* * This Pentax still camera is not conformant * to the USB storage specification: - diff --git a/drivers/vdpa/alibaba/eni_vdpa.c b/drivers/vdpa/alibaba/eni_vdpa.c index cce3d1837104..5a09a09cca70 100644 --- a/drivers/vdpa/alibaba/eni_vdpa.c +++ b/drivers/vdpa/alibaba/eni_vdpa.c @@ -497,7 +497,7 @@ static int eni_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id) if (!eni_vdpa->vring) { ret = -ENOMEM; ENI_ERR(pdev, "failed to allocate virtqueues\n"); - goto err_remove_vp_legacy; + goto err; } for (i = 0; i < eni_vdpa->queues; i++) { @@ -509,13 +509,11 @@ static int eni_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id) ret = vdpa_register_device(&eni_vdpa->vdpa, eni_vdpa->queues); if (ret) { ENI_ERR(pdev, "failed to register to vdpa bus\n"); - goto err_remove_vp_legacy; + goto err; } return 0; -err_remove_vp_legacy: - vp_legacy_remove(&eni_vdpa->ldev); err: put_device(&eni_vdpa->vdpa.dev); return ret; diff --git a/drivers/video/fbdev/core/fb_defio.c b/drivers/video/fbdev/core/fb_defio.c index fc8d5ad1ee47..ed5e4a5699b8 100644 --- a/drivers/video/fbdev/core/fb_defio.c +++ b/drivers/video/fbdev/core/fb_defio.c @@ -132,7 +132,11 @@ int fb_deferred_io_fsync(struct file *file, loff_t start, loff_t end, int datasy return 0; inode_lock(inode); - flush_delayed_work(&info->deferred_work); + /* Kill off the delayed work */ + cancel_delayed_work_sync(&info->deferred_work); + + /* Run it immediately */ + schedule_delayed_work(&info->deferred_work, 0); inode_unlock(inode); return 0; @@ -317,7 +321,7 @@ static void fb_deferred_io_lastclose(struct fb_info *info) struct page *page; int i; - flush_delayed_work(&info->deferred_work); + cancel_delayed_work_sync(&info->deferred_work); /* clear out the mapping that we setup */ for (i = 0 ; i < info->fix.smem_len; i += PAGE_SIZE) { diff --git a/drivers/video/fbdev/imsttfb.c b/drivers/video/fbdev/imsttfb.c index aa51cb72cbba..b194e71f07bf 100644 --- a/drivers/video/fbdev/imsttfb.c +++ b/drivers/video/fbdev/imsttfb.c @@ -1419,6 +1419,7 @@ static int init_imstt(struct fb_info *info) if ((info->var.xres * info->var.yres) * (info->var.bits_per_pixel >> 3) > info->fix.smem_len || !(compute_imstt_regvals(par, info->var.xres, info->var.yres))) { printk("imsttfb: %ux%ux%u not supported\n", info->var.xres, info->var.yres, info->var.bits_per_pixel); + framebuffer_release(info); return -ENODEV; } @@ -1451,11 +1452,10 @@ static int init_imstt(struct fb_info *info) FBINFO_HWACCEL_FILLRECT | FBINFO_HWACCEL_YPAN; - if (fb_alloc_cmap(&info->cmap, 0, 0)) - return -ENODEV; + fb_alloc_cmap(&info->cmap, 0, 0); if (register_framebuffer(info) < 0) { - fb_dealloc_cmap(&info->cmap); + framebuffer_release(info); return -ENODEV; } diff --git a/drivers/video/fbdev/imxfb.c b/drivers/video/fbdev/imxfb.c index 32b8374abeca..36ada87b49a4 100644 --- a/drivers/video/fbdev/imxfb.c +++ b/drivers/video/fbdev/imxfb.c @@ -42,7 +42,6 @@ #include