6.12.58-rc1 review
Subsystems (2)
Greg Kroah-Hartman
maintainerPATCH 138/565 nvme-fc: use lock accessing port_state and rport state
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Wagner <[email protected]>
[ Upstream commit 891cdbb162ccdb079cd5228ae43bdeebce8597ad ]
nvme_fc_unregister_remote removes the remote port on a lport object at any point in time when there is no active association. This races with with the reconnect logic, because nvme_fc_create_association is not taking a lock to check the port_state and atomically increase the active count on the rport.
--- drivers/nvme/host/fc.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/nvme/host/fc.c +8 -2
@@ -3026,11 +3026,17 @@ nvme_fc_create_association(struct nvme_fc_ctrl *ctrl) ++ctrl->ctrl.nr_reconnects; -if (ctrl->rport->remoteport.port_state !=FC_OBJSTATE_ONLINE ) +spin_lock_irqsave (&ctrl->rport->lock, flags); +if (ctrl->rport->remoteport.port_state !=FC_OBJSTATE_ONLINE ) { +spin_unlock_irqrestore (&ctrl->rport->lock, flags);return -ENODEV ; + } -if (nvme_fc_ctlr_active_on_rport (ctrl)) +if (nvme_fc_ctlr_active_on_rport (ctrl)) { +spin_unlock_irqrestore (&ctrl->rport->lock, flags);return -ENOTUNIQ ; + } +spin_unlock_irqrestore (&ctrl->rport->lock, flags);dev_info (ctrl->ctrl.device, "NVME-FC{%d}: create association : host wwpn 0x%016llx "
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 139/565 bpf: Do not limit bpf_cgroup_from_id to currents namespace
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kumar Kartikeya Dwivedi <[email protected]>
[ Upstream commit 2c895133950646f45e5cf3900b168c952c8dbee8 ]
The bpf_cgroup_from_id kfunc relies on cgroup_get_from_id to obtain the cgroup corresponding to a given cgroup ID. This helper can be called in a lot of contexts where the current thread can be random. A recent example was its use in sched_ext's ops.tick(), to obtain the root cgroup pointer. Since the current task can be whatever random user space task preempted by the timer tick, this makes the behavior of the helper unreliable.
Refactor out __cgroup_get_from_id as the non-namespace aware version of cgroup_get_from_id, and change bpf_cgroup_from_id to make use of it.
There is no compatibility breakage here, since changing the namespace against which the lookup is being done to the root cgroup namespace only permits a wider set of lookups to succeed now. The cgroup IDs across namespaces are globally unique, and thus don't need to be retranslated.
--- include/linux/cgroup.h | 1 + kernel/bpf/helpers.c | 2 +- kernel/cgroup/cgroup.c | 24 ++++++++++++++++++++---- 3 files changed, 22 insertions(+), 5 deletions(-)
include/linux/cgroup.h +1 -0
@@ -631,6 +631,7 @@ static inline void cgroup_kthread_ready(void) }void cgroup_path_from_kernfs_id (u64 id,char *buf,size_t buflen); +struct cgroup *__cgroup_get_from_id (u64 id);struct cgroup *cgroup_get_from_id (u64 id);#else /* !CONFIG_CGROUPS */
kernel/bpf/helpers.c +1 -1
@@ -2455,7 +2455,7 @@ __bpf_kfunc struct cgroup *bpf_cgroup_from_id(u64 cgid) {struct cgroup *cgrp; - cgrp =cgroup_get_from_id (cgid); + cgrp =__cgroup_get_from_id (cgid);if (IS_ERR (cgrp))return NULL ;return cgrp;
kernel/cgroup/cgroup.c +20 -4
@@ -6343,15 +6343,15 @@ void cgroup_path_from_kernfs_id(u64 id, char *buf, size_t buflen) }/* -* cgroup_get_from_id : get the cgroup associated with cgroup id +* __cgroup_get_from_id : get the cgroup associated with cgroup id * @id: cgroup id * On success return the cgrp or ERR_PTR on failure -* Only cgroups within current task's cgroup NS are valid. +* There are no cgroup NS restrictions. */ -struct cgroup *cgroup_get_from_id (u64 id) +struct cgroup *__cgroup_get_from_id (u64 id) {struct kernfs_node *kn; -struct cgroup *cgrp, *root_cgrp; +struct cgroup *cgrp; kn =kernfs_find_and_get_node_by_id (cgrp_dfl_root.kf_root, id);if (!kn)
@@ -6373,6 +6373,22 @@ struct cgroup *cgroup_get_from_id(u64 id)if (!cgrp)return ERR_PTR (-ENOENT ); +return cgrp; +} + +/* +* cgroup_get_from_id : get the cgroup associated with cgroup id +* @id: cgroup id +* On success return the cgrp or ERR_PTR on failure +* Only cgroups within current task's cgroup NS are valid. +*/ +struct cgroup *cgroup_get_from_id (u64 id) +{ +struct cgroup *cgrp, *root_cgrp; + + cgrp =__cgroup_get_from_id (id); +if (IS_ERR (cgrp)) +return cgrp; root_cgrp =current_cgns_cgroup_dfl ();if (!cgroup_is_descendant (cgrp, root_cgrp)) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 140/565 i3c: mipi-i3c-hci-pci: Add support for Intel Wildcat Lake-U I3C
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jarkko Nikula <[email protected]>
[ Upstream commit d515503f3c8a8475b2f78782534aad09722904e1 ]
Add I3C controller PCI IDs on Intel Wildcat Lake-U.
--- drivers/i3c/master/mipi-i3c-hci/mipi-i3c-hci-pci.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/i3c/master/mipi-i3c-hci/mipi-i3c-hci-pci.c +3 -0
@@ -124,6 +124,9 @@ static void mipi_i3c_hci_pci_remove(struct pci_dev *pci) }static const struct pci_device_id mipi_i3c_hci_pci_devices[] = { +/* Wildcat Lake-U */ + {PCI_VDEVICE (INTEL ,0x4d7c ), (kernel_ulong_t)&intel_info}, + {PCI_VDEVICE (INTEL ,0x4d6f ), (kernel_ulong_t)&intel_info},/* Panther Lake-H */ {PCI_VDEVICE (INTEL ,0xe37c ), (kernel_ulong_t)&intel_info}, {PCI_VDEVICE (INTEL ,0xe36f ), (kernel_ulong_t)&intel_info},
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 141/565 video: backlight: lp855x_bl: Set correct EPROM start for LP8556
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Svyatoslav Ryhel <[email protected]>
[ Upstream commit 07c7efda24453e05951fb2879f5452b720b91169 ]
According to LP8556 datasheet EPROM region starts at 0x98 so adjust value in the driver accordingly.
--- drivers/video/backlight/lp855x_bl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/video/backlight/lp855x_bl.c +1 -1
@@ -22,7 +22,7 @@#define LP855X_DEVICE_CTRL 0x01#define LP855X_EEPROM_START 0xA0#define LP855X_EEPROM_END 0xA7 -#define LP8556_EPROM_START 0xA0 +#define LP8556_EPROM_START 0x98#define LP8556_EPROM_END 0xAF/* LP8555/7 Registers */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 142/565 tools/cpupower: fix error return value in cpupower_write_sysfs()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kaushlendra Kumar <[email protected]>
[ Upstream commit 57b100d4cf14276e0340eecb561005c07c129eb8 ]
The cpupower_write_sysfs() function currently returns -1 on write failure, but the function signature indicates it should return an unsigned int. Returning -1 from an unsigned function results in a large positive value rather than indicating an error condition.
Fix this by returning 0 on failure, which is more appropriate for an unsigned return type and maintains consistency with typical success/failure semantics where 0 indicates failure and non-zero indicates success (bytes written).
--- tools/power/cpupower/lib/cpupower.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/power/cpupower/lib/cpupower.c +1 -1
@@ -55,7 +55,7 @@ unsigned int cpupower_write_sysfs(const char *path, char *buf, size_t buflen)if (numwritten <1 ) {perror (path);close (fd); -return -1 ; +return 0 ; }close (fd);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 143/565 pmdomain: apple: Add "apple,t8103-pmgr-pwrstate"
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Janne Grunau <[email protected]>
[ Upstream commit 442816f97a4f84cb321d3359177a3b9b0ce48a60 ]
After discussion with the devicetree maintainers we agreed to not extend lists with the generic compatible "apple,pmgr-pwrstate" anymore [1]. Use "apple,t8103-pmgr-pwrstate" as base compatible as it is the SoC the driver and bindings were written for.
[1]: https://lore.kernel.org/asahi/[email protected]/
--- drivers/pmdomain/apple/pmgr-pwrstate.c | 1 + 1 file changed, 1 insertion(+)
drivers/pmdomain/apple/pmgr-pwrstate.c +1 -0
@@ -306,6 +306,7 @@ static int apple_pmgr_ps_probe(struct platform_device *pdev) }static const struct of_device_id apple_pmgr_ps_of_match[] = { + { .compatible ="apple,t8103-pmgr-pwrstate" }, { .compatible ="apple,pmgr-pwrstate" }, {} };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 144/565 power: supply: qcom_battmgr: handle charging state change notifications
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fenglin Wu <[email protected]>
[ Upstream commit 41307ec7df057239aae3d0f089cc35a0d735cdf8 ]
The X1E80100 battery management firmware sends a notification with code 0x83 when the battery charging state changes, such as switching between fast charge, taper charge, end of charge, or any other error charging states.
The same notification code is used with bit[8] set when charging stops because the charge control end threshold is reached. Additionally, a 2-bit value is included in bit[10:9] with the same code to indicate the charging source capability, which is determined by the calculated power from voltage and current readings from PDOs: 2 means a strong charger over 60W, 1 indicates a weak charger, and 0 means there is no charging source.
These 3-MSB [10:8] in the notification code is not much useful for now, hence just ignore them and trigger a power supply change event whenever 0x83 notification code is received. This helps to eliminate the unknown notification error messages.
--- drivers/power/supply/qcom_battmgr.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/power/supply/qcom_battmgr.c +4 -1
@@ -29,8 +29,9 @@ enum qcom_battmgr_variant {#define NOTIF_BAT_PROPERTY 0x30#define NOTIF_USB_PROPERTY 0x32#define NOTIF_WLS_PROPERTY 0x34 -#define NOTIF_BAT_INFO 0x81#define NOTIF_BAT_STATUS 0x80 +#define NOTIF_BAT_INFO 0x81 +#define NOTIF_BAT_CHARGING_STATE 0x83#define BATTMGR_BAT_INFO 0x9
@@ -943,12 +944,14 @@ static void qcom_battmgr_notification(struct qcom_battmgr *battmgr, } notification =le32_to_cpu (msg->notification); + notification &=0xff ;switch (notification) {case NOTIF_BAT_INFO : battmgr->info.valid = false; fallthrough;case NOTIF_BAT_STATUS :case NOTIF_BAT_PROPERTY : +case NOTIF_BAT_CHARGING_STATE :power_supply_changed (battmgr->bat_psy);break ;case NOTIF_USB_PROPERTY :
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 145/565 bpftool: Fix -Wuninitialized-const-pointer warnings with clang >= 21
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tom Stellard <[email protected]>
[ Upstream commit 5612ea8b554375d45c14cbb0f8ea93ec5d172891 ]
This fixes the build with -Werror -Wall.
btf_dumper.c:71:31: error: variable 'finfo' is uninitialized when passed as a const pointer argument here [-Werror,-Wuninitialized-const-pointer]
71 | info.func_info = ptr_to_u64(&finfo);
| ^~~~~
prog.c:2294:31: error: variable 'func_info' is uninitialized when passed as a const pointer argument here [-Werror,-Wuninitialized-const-pointer]
2294 | info.func_info = ptr_to_u64(&func_info);
|v2:
- Initialize instead of using memset.
--- tools/bpf/bpftool/btf_dumper.c | 2 +- tools/bpf/bpftool/prog.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
tools/bpf/bpftool/btf_dumper.c +1 -1
@@ -38,7 +38,7 @@ static int dump_prog_id_as_func_ptr(const struct btf_dumper *d,__u32 info_len =sizeof (info);const char *prog_name =NULL ;struct btf *prog_btf =NULL ; -struct bpf_func_info finfo; +struct bpf_func_info finfo = {};__u32 finfo_rec_size;char prog_str[1024 ];int err;
tools/bpf/bpftool/prog.c +1 -1
@@ -2207,7 +2207,7 @@ static void profile_print_readings(void)static char *profile_target_name (int tgt_fd) { -struct bpf_func_info func_info; +struct bpf_func_info func_info = {};struct bpf_prog_info info = {};__u32 info_len =sizeof (info);const struct btf_type *t;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 146/565 cpuidle: Fail cpuidle device registration if there is one already
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafael J. Wysocki <[email protected]>
[ Upstream commit 7b1b7961170e4fcad488755e5ffaaaf9bd527e8f ]
Refuse to register a cpuidle device if the given CPU has a cpuidle device already and print a message regarding it.
Without this, an attempt to register a new cpuidle device without unregistering the existing one leads to the removal of the existing cpuidle device without removing its sysfs interface.
--- drivers/cpuidle/cpuidle.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/cpuidle/cpuidle.c +7 -1
@@ -631,8 +631,14 @@ static void __cpuidle_device_init(struct cpuidle_device *dev)static int __cpuidle_register_device (struct cpuidle_device *dev) {struct cpuidle_driver *drv =cpuidle_get_cpu_driver (dev); +unsigned int cpu = dev->cpu;int i, ret; +if (per_cpu (cpuidle_devices, cpu)) { +pr_info ("CPU%d: cpuidle device already registered\n" , cpu); +return -EEXIST ; + } +if (!try_module_get (drv->owner))return -EINVAL ;
@@ -644,7 +650,7 @@ static int __cpuidle_register_device(struct cpuidle_device *dev) dev->states_usage[i].disable |=CPUIDLE_STATE_DISABLED_BY_USER ; } -per_cpu (cpuidle_devices, dev->cpu) = dev; +per_cpu (cpuidle_devices, cpu) = dev;list_add (&dev->device_list, &cpuidle_detected_devices); ret =cpuidle_coupled_register_device (dev);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 147/565 futex: Dont leak robust_list pointer on exec race
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pranav Tyagi <[email protected]>
[ Upstream commit 6b54082c3ed4dc9821cdf0edb17302355cc5bb45 ]
sys_get_robust_list() and compat_get_robust_list() use ptrace_may_access() to check if the calling task is allowed to access another task's robust_list pointer. This check is racy against a concurrent exec() in the target process.
During exec(), a task may transition from a non-privileged binary to a privileged one (e.g., setuid binary) and its credentials/memory mappings may change. If get_robust_list() performs ptrace_may_access() before this transition, it may erroneously allow access to sensitive information after the target becomes privileged.
A racy access allows an attacker to exploit a window during which ptrace_may_access() passes before a target process transitions to a privileged state via exec().
For example, consider a non-privileged task T that is about to execute a setuid-root binary. An attacker task A calls get_robust_list(T) while T is still unprivileged. Since ptrace_may_access() checks permissions based on current credentials, it succeeds. However, if T begins exec immediately afterwards, it becomes privileged and may change its memory mappings. Because get_robust_list() proceeds to access T->robust_list without synchronizing with exec() it may read user-space pointers from a now-privileged process.
This violates the intended post-exec access restrictions and could expose sensitive memory addresses or be used as a primitive in a larger exploit chain. Consequently, the race can lead to unauthorized disclosure of information across privilege boundaries and poses a potential security risk.
Take a read lock on signal->exec_update_lock prior to invoking ptrace_may_access() and accessing the robust_list/compat_robust_list. This ensures that the target task's exec state remains stable during the check, allowing for consistent and synchronized validation of credentials.
--- kernel/futex/syscalls.c | 106 +++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 50 deletions(-)
kernel/futex/syscalls.c +56 -50
@@ -39,6 +39,56 @@ SYSCALL_DEFINE2(set_robust_list, struct robust_list_head __user *, head,return 0 ; } +static inline void __user *futex_task_robust_list (struct task_struct *p,bool compat) +{ +#ifdef CONFIG_COMPAT +if (compat) +return p->compat_robust_list; +#endif +return p->robust_list; +} + +static void __user *futex_get_robust_list_common (int pid,bool compat) +{ +struct task_struct *p = current; +void __user *head; +int ret; + +scoped_guard (rcu) { +if (pid) { + p =find_task_by_vpid (pid); +if (!p) +return (void __user *)ERR_PTR (-ESRCH ); + } +get_task_struct (p); + } + +/* +* Hold exec_update_lock to serialize with concurrent exec() +* so ptrace_may_access() is checked against stable credentials +*/ + ret =down_read_killable (&p->signal->exec_update_lock); +if (ret) + goto err_put; + + ret = -EPERM ; +if (!ptrace_may_access (p,PTRACE_MODE_READ_REALCREDS )) + goto err_unlock; + + head =futex_task_robust_list (p, compat); + +up_read (&p->signal->exec_update_lock); +put_task_struct (p); + +return head; + +err_unlock: +up_read (&p->signal->exec_update_lock); +err_put: +put_task_struct (p); +return (void __user *)ERR_PTR (ret); +} +/** * sys_get_robust_list() - Get the robust-futex list head of a task * @pid: pid of the process [zero for current task]
@@ -49,36 +99,14 @@ SYSCALL_DEFINE3(get_robust_list, int, pid, struct robust_list_head __user * __user *, head_ptr, size_t __user *, len_ptr) { - struct robust_list_head __user *head; -unsigned long ret; -struct task_struct *p; - -rcu_read_lock (); - - ret = -ESRCH ; -if (!pid) - p = current; -else { - p =find_task_by_vpid (pid); -if (!p) - goto err_unlock; - } - - ret = -EPERM ; -if (!ptrace_may_access (p,PTRACE_MODE_READ_REALCREDS )) - goto err_unlock; + struct robust_list_head __user *head = futex_get_robust_list_common(pid, false); - head = p->robust_list; -rcu_read_unlock (); +if (IS_ERR (head)) +return PTR_ERR (head);if (put_user (sizeof (*head), len_ptr))return -EFAULT ;return put_user (head, head_ptr); - -err_unlock: -rcu_read_unlock (); - -return ret; } long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
@@ -455,36 +483,14 @@ COMPAT_SYSCALL_DEFINE3(get_robust_list, int, pid, compat_uptr_t __user *, head_ptr, compat_size_t __user *, len_ptr) { -struct compat_robust_list_head __user *head; -unsigned long ret; -struct task_struct *p; - -rcu_read_lock (); - - ret = -ESRCH ; -if (!pid) - p = current; -else { - p =find_task_by_vpid (pid); -if (!p) - goto err_unlock; - } - - ret = -EPERM ; -if (!ptrace_may_access (p,PTRACE_MODE_READ_REALCREDS )) - goto err_unlock; +struct compat_robust_list_head __user *head =futex_get_robust_list_common (pid, true); - head = p->compat_robust_list; -rcu_read_unlock (); +if (IS_ERR (head)) +return PTR_ERR (head);if (put_user (sizeof (*head), len_ptr))return -EFAULT ;return put_user (ptr_to_compat (head), head_ptr); - -err_unlock: -rcu_read_unlock (); - -return ret; }#endif /* CONFIG_COMPAT */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 148/565 selftests/bpf: Fix selftest verifier_arena_large failure
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yonghong Song <[email protected]>
[ Upstream commit 5a427fddec5e76360725a0f03df3a2a003efbe2e ]
With latest llvm22, I got the following verification failure:
... ; int big_alloc2(void *ctx) @ verifier_arena_large.c:207 0: (b4) w6 = 1 ; R6_w=1 ... ; if (err) @ verifier_arena_large.c:233 53: (56) if w6 != 0x0 goto pc+62 ; R6=0 54: (b7) r7 = -4 ; R7_w=-4 55: (18) r8 = 0x7f4000000000 ; R8_w=scalar() 57: (bf) r9 = addr_space_cast(r8, 0, 1) ; R8_w=scalar() R9_w=arena 58: (b4) w6 = 5 ; R6_w=5 ; pg = page[i]; @ verifier_arena_large.c:238 59: (bf) r1 = r7 ; R1_w=-4 R7_w=-4 60: (07) r1 += 4 ; R1_w=0 61: (79) r2 = *(u64 *)(r9 +0) ; R2_w=scalar() R9_w=arena ; if (*pg != i) @ verifier_arena_large.c:239 62: (bf) r3 = addr_space_cast(r2, 0, 1) ; R2_w=scalar() R3_w=arena 63: (71) r3 = *(u8 *)(r3 +0) ; R3_w=scalar(smin=smin32=0,smax=umax=smax32=umax32=255,var_off=(0x0; 0xff)) 64: (5d) if r1 != r3 goto pc+51 ; R1_w=0 R3_w=0 ; bpf_arena_free_pages(&arena, (void __arena *)pg, 2); @ verifier_arena_large.c:241 65: (18) r1 = 0xff11000114548000 ; R1_w=map_ptr(map=arena,ks=0,vs=0) 67: (b4) w3 = 2 ; R3_w=2 68: (85) call bpf_arena_free_pages#72675 ; 69: (b7) r1 = 0 ; R1_w=0 ; page[i + 1] = NULL; @ verifier_arena_large.c:243 70: (7b) *(u64 *)(r8 +8) = r1 R8 invalid mem access 'scalar' processed 61 insns (limit 1000000) max_states_per_insn 0 total_states 6 peak_states 6 mark_read 2 ============= #489/5 verifier_arena_large/big_alloc2:FAIL
The main reason is that 'r8' in insn '70' is not an arena pointer. Further debugging at llvm side shows that llvm commit ([1]) caused the failure. For the original code:
page[i] = NULL;
page[i + 1] = NULL;
the llvm transformed it to something like below at source level:
__builtin_memset(&page[i], 0, 16)
Such transformation prevents llvm BPFCheckAndAdjustIR pass from generating proper addr_space_cast insns ([2]).
Adding support in llvm BPFCheckAndAdjustIR pass should work, but not sure that such a pattern exists or not in real applications. At the same time, simply adding a memory barrier between two 'page' assignment can fix the issue.
[1] https://github.com/llvm/llvm-project/pull/155415
[2] https://github.com/llvm/llvm-project/pull/84410
--- tools/testing/selftests/bpf/progs/verifier_arena_large.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/bpf/progs/verifier_arena_large.c +1 -0
@@ -142,6 +142,7 @@ int big_alloc2(void *ctx)return 5 ; bpf_arena_free_pages(&arena, (void __arena *)pg, 2); page[i] =NULL ; +barrier (); page[i +1 ] =NULL ; cond_break; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 149/565 spi: rpc-if: Add resume support for RZ/G3E
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Biju Das <[email protected]>
[ Upstream commit ad4728740bd68d74365a43acc25a65339a9b2173 ]
On RZ/G3E using PSCI, s2ram powers down the SoC. After resume, reinitialize the hardware for SPI operations.
--- drivers/spi/spi-rpc-if.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/spi/spi-rpc-if.c +2 -0
@@ -193,6 +193,8 @@ static int __maybe_unused rpcif_spi_resume(struct device *dev) {struct spi_controller *ctlr =dev_get_drvdata (dev); +rpcif_hw_init (dev, false); +return spi_controller_resume (ctlr); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 150/565 ACPI: SPCR: Support Precise Baud Rate field
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Pei <[email protected]>
[ Upstream commit 4d330fe54145ecfbb657ac01a554fdedf3c1927e ]
The Microsoft Serial Port Console Redirection (SPCR) specification revision 1.09 comprises additional field: Precise Baud Rate [1].
It is used to describe non-traditional baud rates (such as those used by high-speed UARTs).
It contains a specific non-zero baud rate which overrides the value of the Configured Baud Rate field. If this field is zero or not present, Configured Baud Rate is used.
--- drivers/acpi/spcr.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/acpi/spcr.c +9 -1
@@ -146,7 +146,15 @@ int __init acpi_parse_spcr(bool enable_earlycon, bool enable_console) goto done; } -switch (table->baud_rate) { +/* +* SPCR 1.09 defines Precise Baud Rate Filed contains a specific +* non-zero baud rate which overrides the value of the Configured +* Baud Rate field. If this field is zero or not present, Configured +* Baud Rate is used. +*/ +if (table->precise_baudrate) + baud_rate = table->precise_baudrate; +else switch (table->baud_rate) {case 0 :/* * SPCR 1.04 defines 0 as a preconfigured state of UART.
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 151/565 clocksource/drivers/vf-pit: Replace raw_readl/writel to readl/writel
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Lezcano <[email protected]>
[ Upstream commit 0b781f527d6f99e68e5b3780ae03cd69a7cb5c0c ]
The driver uses the raw_readl() and raw_writel() functions. Those are not for MMIO devices. Replace them with readl() and writel()
[ dlezcano: Fixed typo in the subject s/reald/readl/ ]
--- drivers/clocksource/timer-vf-pit.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
drivers/clocksource/timer-vf-pit.c +11 -11
@@ -35,30 +35,30 @@ static unsigned long cycle_per_jiffy;static inline void pit_timer_enable (void ) { -__raw_writel (PITTCTRL_TEN |PITTCTRL_TIE , clkevt_base +PITTCTRL ); +writel (PITTCTRL_TEN |PITTCTRL_TIE , clkevt_base +PITTCTRL ); }static inline void pit_timer_disable (void ) { -__raw_writel (0 , clkevt_base +PITTCTRL ); +writel (0 , clkevt_base +PITTCTRL ); }static inline void pit_irq_acknowledge (void ) { -__raw_writel (PITTFLG_TIF , clkevt_base +PITTFLG ); +writel (PITTFLG_TIF , clkevt_base +PITTFLG ); } static u64 notrace pit_read_sched_clock(void) { -return ~__raw_readl (clksrc_base +PITCVAL ); +return ~readl (clksrc_base +PITCVAL ); }static int __init pit_clocksource_init (unsigned long rate) {/* set the max load value and start the clock source counter */ -__raw_writel (0 , clksrc_base +PITTCTRL ); -__raw_writel (~0UL , clksrc_base +PITLDVAL ); -__raw_writel (PITTCTRL_TEN , clksrc_base +PITTCTRL ); +writel (0 , clksrc_base +PITTCTRL ); +writel (~0UL , clksrc_base +PITLDVAL ); +writel (PITTCTRL_TEN , clksrc_base +PITTCTRL );sched_clock_register (pit_read_sched_clock,32 , rate); return clocksource_mmio_init(clksrc_base + PITCVAL, "vf-pit", rate,
@@ -76,7 +76,7 @@ static int pit_set_next_event(unsigned long delta,* hardware requirement. */ pit_timer_disable (); -__raw_writel (delta -1 , clkevt_base +PITLDVAL ); +writel (delta -1 , clkevt_base +PITLDVAL );pit_timer_enable ();return 0 ;
@@ -125,8 +125,8 @@ static struct clock_event_device clockevent_pit = {static int __init pit_clockevent_init (unsigned long rate,int irq) { -__raw_writel (0 , clkevt_base +PITTCTRL ); -__raw_writel (PITTFLG_TIF , clkevt_base +PITTFLG ); +writel (0 , clkevt_base +PITTCTRL ); +writel (PITTFLG_TIF , clkevt_base +PITTFLG );BUG_ON (request_irq (irq, pit_timer_interrupt,IRQF_TIMER |IRQF_IRQPOLL ,"VF pit timer" , &clockevent_pit));
@@ -183,7 +183,7 @@ static int __init pit_timer_init(struct device_node *np) cycle_per_jiffy = clk_rate / (HZ );/* enable the pit module */ -__raw_writel (~PITMCR_MDIS , timer_base +PITMCR ); +writel (~PITMCR_MDIS , timer_base +PITMCR ); ret =pit_clocksource_init (clk_rate);if (ret)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 152/565 clocksource/drivers/timer-rtl-otto: Work around dying timers
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markus Stockhausen <[email protected]>
[ Upstream commit e7a25106335041aeca4fdf50a84804c90142c886 ]
The OpenWrt distribution has switched from kernel longterm 6.6 to 6.12. Reports show that devices with the Realtek Otto switch platform die during operation and are rebooted by the watchdog. Sorting out other possible reasons the Otto timer is to blame. The platform currently consists of 4 targets with different hardware revisions. It is not 100% clear which devices and revisions are affected.
Analysis shows:
A more aggressive sched/deadline handling leads to more timer starts with small intervals. This increases the bug chances. See
https://marc.info/?l=linux-kernel&m=175276556023276&w=2
Focusing on the real issue a hardware limitation on some devices was found. There is a minimal chance that a timer ends without firing an interrupt if it is reprogrammed within the 5us before its expiration time. Work around this issue by introducing a bounce() function. It restarts the timer directly before the normal restart functions as follows:
- Stop timer
- Restart timer with a slow frequency.
- Target time will be >5us
- The subsequent normal restart is outside the critical window
Downstream has already tested and confirmed a patch. See
https://github.com/openwrt/openwrt/pull/19468
https://forum.openwrt.org/t/support-for-rtl838x-based-managed-switches/57875/3788
--- drivers/clocksource/timer-rtl-otto.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
drivers/clocksource/timer-rtl-otto.c +20 -0
@@ -38,6 +38,7 @@#define RTTM_BIT_COUNT 28#define RTTM_MIN_DELTA 8#define RTTM_MAX_DELTA CLOCKSOURCE_MASK(28) +#define RTTM_MAX_DIVISOR GENMASK(15, 0)/* * Timers are derived from the LXB clock frequency. Usually this is a fixed
@@ -112,6 +113,22 @@ static irqreturn_t rttm_timer_interrupt(int irq, void *dev_id)return IRQ_HANDLED ; } +static void rttm_bounce_timer (void __iomem *base,u32 mode) +{ +/* +* When a running timer has less than ~5us left, a stop/start sequence +* might fail. While the details are unknown the most evident effect is +* that the subsequent interrupt will not be fired. +* +* As a workaround issue an intermediate restart with a very slow +* frequency of ~3kHz keeping the target counter (>=8). So the follow +* up restart will always be issued outside the critical window. +*/ + +rttm_disable_timer (base); +rttm_enable_timer (base, mode,RTTM_MAX_DIVISOR ); +} +static void rttm_stop_timer (void __iomem *base) {rttm_disable_timer (base);
@@ -129,6 +146,7 @@ static int rttm_next_event(unsigned long delta, struct clock_event_device *clkevstruct timer_of *to =to_timer_of (clkevt);RTTM_DEBUG (to->of_base.base); +rttm_bounce_timer (to->of_base.base,RTTM_CTRL_COUNTER );rttm_stop_timer (to->of_base.base);rttm_set_period (to->of_base.base, delta);rttm_start_timer (to,RTTM_CTRL_COUNTER );
@@ -141,6 +159,7 @@ static int rttm_state_oneshot(struct clock_event_device *clkevt)struct timer_of *to =to_timer_of (clkevt);RTTM_DEBUG (to->of_base.base); +rttm_bounce_timer (to->of_base.base,RTTM_CTRL_COUNTER );rttm_stop_timer (to->of_base.base);rttm_set_period (to->of_base.base,RTTM_TICKS_PER_SEC /HZ );rttm_start_timer (to,RTTM_CTRL_COUNTER );
@@ -153,6 +172,7 @@ static int rttm_state_periodic(struct clock_event_device *clkevt)struct timer_of *to =to_timer_of (clkevt);RTTM_DEBUG (to->of_base.base); +rttm_bounce_timer (to->of_base.base,RTTM_CTRL_TIMER );rttm_stop_timer (to->of_base.base);rttm_set_period (to->of_base.base,RTTM_TICKS_PER_SEC /HZ );rttm_start_timer (to,RTTM_CTRL_TIMER );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 153/565 clocksource/drivers/timer-rtl-otto: Do not interfere with interrupts
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markus Stockhausen <[email protected]>
[ Upstream commit c445bffbf28f721e05d0ce06895045fc62aaff7c ]
During normal operation the timers are reprogrammed including an interrupt acknowledgement. This has no effect as the whole timer is setup from scratch afterwards. Especially in an interrupt this has already been done by rttm_timer_interrupt().
Change the behaviour as follows:
- Use rttm_disable_timer() during reprogramming
- Keep rttm_stop_timer() for all other use cases.
Downstream has already tested and confirmed a patch. See
https://github.com/openwrt/openwrt/pull/19468
https://forum.openwrt.org/t/support-for-rtl838x-based-managed-switches/57875/3788
--- drivers/clocksource/timer-rtl-otto.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/clocksource/timer-rtl-otto.c +3 -3
@@ -147,7 +147,7 @@ static int rttm_next_event(unsigned long delta, struct clock_event_device *clkevRTTM_DEBUG (to->of_base.base);rttm_bounce_timer (to->of_base.base,RTTM_CTRL_COUNTER ); -rttm_stop_timer (to->of_base.base); +rttm_disable_timer (to->of_base.base);rttm_set_period (to->of_base.base, delta);rttm_start_timer (to,RTTM_CTRL_COUNTER );
@@ -160,7 +160,7 @@ static int rttm_state_oneshot(struct clock_event_device *clkevt)RTTM_DEBUG (to->of_base.base);rttm_bounce_timer (to->of_base.base,RTTM_CTRL_COUNTER ); -rttm_stop_timer (to->of_base.base); +rttm_disable_timer (to->of_base.base);rttm_set_period (to->of_base.base,RTTM_TICKS_PER_SEC /HZ );rttm_start_timer (to,RTTM_CTRL_COUNTER );
@@ -173,7 +173,7 @@ static int rttm_state_periodic(struct clock_event_device *clkevt)RTTM_DEBUG (to->of_base.base);rttm_bounce_timer (to->of_base.base,RTTM_CTRL_TIMER ); -rttm_stop_timer (to->of_base.base); +rttm_disable_timer (to->of_base.base);rttm_set_period (to->of_base.base,RTTM_TICKS_PER_SEC /HZ );rttm_start_timer (to,RTTM_CTRL_TIMER );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 154/565 blk-cgroup: fix possible deadlock while configuring policy
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yu Kuai <[email protected]>
[ Upstream commit 5d726c4dbeeddef612e6bed27edd29733f4d13af ]
Following deadlock can be triggered easily by lockdep:
WARNING: possible circular locking dependency detected 6.17.0-rc3-00124-ga12c2658ced0 #1665 Not tainted
------------------------------------------------------
check/1334 is trying to acquire lock:ff1100011d9d0678 (&q->sysfs_lock){+.+.}-{4:4}, at: blk_unregister_queue+0x53/0x180
but task is already holding lock:ff1100011d9d00e0 (&q->q_usage_counter(queue)#3){++++}-{0:0}, at: del_gendisk+0xba/0x110
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #2 (&q->q_usage_counter(queue)#3){++++}-{0:0}:
blk_queue_enter+0x40b/0x470
blkg_conf_prep+0x7b/0x3c0
tg_set_limit+0x10a/0x3e0
cgroup_file_write+0xc6/0x420
kernfs_fop_write_iter+0x189/0x280
vfs_write+0x256/0x490
ksys_write+0x83/0x190
__x64_sys_write+0x21/0x30
x64_sys_call+0x4608/0x4630
do_syscall_64+0xdb/0x6b0
entry_SYSCALL_64_after_hwframe+0x76/0x7e-> #1 (&q->rq_qos_mutex){+.+.}-{4:4}:
__mutex_lock+0xd8/0xf50
mutex_lock_nested+0x2b/0x40
wbt_init+0x17e/0x280
wbt_enable_default+0xe9/0x140
blk_register_queue+0x1da/0x2e0
__add_disk+0x38c/0x5d0
add_disk_fwnode+0x89/0x250
device_add_disk+0x18/0x30
virtblk_probe+0x13a3/0x1800
virtio_dev_probe+0x389/0x610
really_probe+0x136/0x620
__driver_probe_device+0xb3/0x230
driver_probe_device+0x2f/0xe0
__driver_attach+0x158/0x250
bus_for_each_dev+0xa9/0x130
driver_attach+0x26/0x40
bus_add_driver+0x178/0x3d0
driver_register+0x7d/0x1c0
__register_virtio_driver+0x2c/0x60
virtio_blk_init+0x6f/0xe0
do_one_initcall+0x94/0x540
kernel_init_freeable+0x56a/0x7b0
kernel_init+0x2b/0x270
ret_from_fork+0x268/0x4c0
ret_from_fork_asm+0x1a/0x30-> #0 (&q->sysfs_lock){+.+.}-{4:4}:
__lock_acquire+0x1835/0x2940
lock_acquire+0xf9/0x450
__mutex_lock+0xd8/0xf50
mutex_lock_nested+0x2b/0x40
blk_unregister_queue+0x53/0x180
__del_gendisk+0x226/0x690
del_gendisk+0xba/0x110
sd_remove+0x49/0xb0 [sd_mod]
device_remove+0x87/0xb0
device_release_driver_internal+0x11e/0x230
device_release_driver+0x1a/0x30
bus_remove_device+0x14d/0x220
device_del+0x1e1/0x5a0
__scsi_remove_device+0x1ff/0x2f0
scsi_remove_device+0x37/0x60
sdev_store_delete+0x77/0x100
dev_attr_store+0x1f/0x40
sysfs_kf_write+0x65/0x90
kernfs_fop_write_iter+0x189/0x280
vfs_write+0x256/0x490
ksys_write+0x83/0x190
__x64_sys_write+0x21/0x30
x64_sys_call+0x4608/0x4630
do_syscall_64+0xdb/0x6b0
entry_SYSCALL_64_after_hwframe+0x76/0x7eother info that might help us debug this:
Chain exists of: &q->sysfs_lock --> &q->rq_qos_mutex --> &q->q_usage_counter(queue)#3 Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&q->q_usage_counter(queue)#3);
lock(&q->rq_qos_mutex);
lock(&q->q_usage_counter(queue)#3); lock(&q->sysfs_lock);
Root cause is that queue_usage_counter is grabbed with rq_qos_mutex held in blkg_conf_prep(), while queue should be freezed before rq_qos_mutex from other context.
The blk_queue_enter() from blkg_conf_prep() is used to protect against policy deactivation, which is already protected with blkcg_mutex, hence convert blk_queue_enter() to blkcg_mutex to fix this problem. Meanwhile, consider that blkcg_mutex is held after queue is freezed from policy deactivation, also convert blkg_alloc() to use GFP_NOIO.
--- block/blk-cgroup.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-)
block/blk-cgroup.c +8 -15
@@ -847,14 +847,8 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol, disk = ctx->bdev->bd_disk; q = disk->queue; -/* -* blkcg_deactivate_policy() requires queue to be frozen, we can grab -* q_usage_counter to prevent concurrent with blkcg_deactivate_policy(). -*/ - ret =blk_queue_enter (q,0 ); -if (ret) - goto fail; - +/* Prevent concurrent with blkcg_deactivate_policy() */ +mutex_lock (&q->blkcg_mutex);spin_lock_irq (&q->queue_lock);if (!blkcg_policy_enabled (q, pol)) {
@@ -884,16 +878,16 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,/* Drop locks to do new blkg allocation with GFP_KERNEL. */ spin_unlock_irq (&q->queue_lock); - new_blkg =blkg_alloc (pos, disk,GFP_KERNEL ); + new_blkg =blkg_alloc (pos, disk,GFP_NOIO );if (unlikely (!new_blkg)) { ret = -ENOMEM ; - goto fail_exit_queue; + goto fail_exit; }if (radix_tree_preload (GFP_KERNEL )) {blkg_free (new_blkg); ret = -ENOMEM ; - goto fail_exit_queue; + goto fail_exit; }spin_lock_irq (&q->queue_lock);
@@ -921,7 +915,7 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol, goto success; } success: -blk_queue_exit (q); +mutex_unlock (&q->blkcg_mutex); ctx->blkg = blkg;return 0 ;
@@ -929,9 +923,8 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,radix_tree_preload_end (); fail_unlock:spin_unlock_irq (&q->queue_lock); -fail_exit_queue: -blk_queue_exit (q); -fail: +fail_exit: +mutex_unlock (&q->blkcg_mutex);/* * If queue was bypassing, we should retry. Do so after a * short msleep(). It isn't strictly necessary but queue
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 155/565 riscv: bpf: Fix uninitialized symbol retval_off
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chenghao Duan <[email protected]>
[ Upstream commit d0bf7cd5df18466d969bb60e8890b74cf96081ca ]
In the __arch_prepare_bpf_trampoline() function, retval_off is only meaningful when save_ret is true, so the current logic is correct. However, in the original logic, retval_off is only initialized under certain conditions; for example, in the fmod_ret logic, the compiler is not aware that the flags of the fmod_ret program (prog) have set BPF_TRAMP_F_CALL_ORIG, which results in an uninitialized symbol compilation warning.
So initialize retval_off unconditionally to fix it.
--- arch/riscv/net/bpf_jit_comp64.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/riscv/net/bpf_jit_comp64.c +2 -3
@@ -906,10 +906,9 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, stack_size +=16 ; save_ret = flags & (BPF_TRAMP_F_CALL_ORIG |BPF_TRAMP_F_RET_FENTRY_RET ); -if (save_ret) { +if (save_ret) stack_size +=16 ;/* Save both A5 (BPF R0) and A0 */ - retval_off = stack_size; - } + retval_off = stack_size; stack_size += nr_arg_slots *8 ; args_off = stack_size;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 156/565 bpf: Clear pfmemalloc flag when freeing all fragments
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amery Hung <[email protected]>
[ Upstream commit 8f12d1137c2382c80aada8e05d7cc650cd4e403c ]
It is possible for bpf_xdp_adjust_tail() to free all fragments. The kfunc currently clears the XDP_FLAGS_HAS_FRAGS bit, but not XDP_FLAGS_FRAGS_PF_MEMALLOC. So far, this has not caused a issue when building sk_buff from xdp_buff since all readers of xdp_buff->flags use the flag only when there are fragments. Clear the XDP_FLAGS_FRAGS_PF_MEMALLOC bit as well to make the flags correct.
--- include/net/xdp.h | 5 +++++ net/core/filter.c | 1 + 2 files changed, 6 insertions(+)
include/net/xdp.h +5 -0
@@ -113,6 +113,11 @@ static __always_inline void xdp_buff_set_frag_pfmemalloc(struct xdp_buff *xdp) xdp->flags |=XDP_FLAGS_FRAGS_PF_MEMALLOC ; } +static __always_inline void xdp_buff_clear_frag_pfmemalloc(struct xdp_buff *xdp) +{ + xdp->flags &= ~XDP_FLAGS_FRAGS_PF_MEMALLOC ; +} + static __always_inline voidxdp_init_buff (struct xdp_buff *xdp,u32 frame_sz,struct xdp_rxq_info *rxq) {
net/core/filter.c +1 -0
@@ -4223,6 +4223,7 @@ static int bpf_xdp_frags_shrink_tail(struct xdp_buff *xdp, int offset)if (unlikely (!sinfo->nr_frags)) {xdp_buff_clear_frags_flag (xdp); +xdp_buff_clear_frag_pfmemalloc (xdp); xdp->data_end -= offset; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 157/565 nvme: Use non zero KATO for persistent discovery connections
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alistair Francis <[email protected]>
[ Upstream commit 2e482655019ab6fcfe8865b62432c6d03f0b5f80 ]
The NVMe Base Specification 2.1 states that:
"""
A host requests an explicit persistent connection ... by specifying a non-zero Keep Alive Timer value in the Connect command. """
As such if we are starting a persistent connection to a discovery controller and the KATO is currently 0 we need to update KATO to a non zero value to avoid continuous timeouts on the target.
--- drivers/nvme/host/core.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/nvme/host/core.c +7 -1
@@ -4740,8 +4740,14 @@ void nvme_start_ctrl(struct nvme_ctrl *ctrl)* checking that they started once before, hence are reconnecting back. */ if (test_bit (NVME_CTRL_STARTED_ONCE , &ctrl->flags) && -nvme_discovery_ctrl (ctrl)) +nvme_discovery_ctrl (ctrl)) { +if (!ctrl->kato) { +nvme_stop_keep_alive (ctrl); + ctrl->kato =NVME_DEFAULT_KATO ; +nvme_start_keep_alive (ctrl); + }nvme_change_uevent (ctrl,"NVME_EVENT=rediscover" ); + }if (ctrl->queue_count >1 ) {nvme_queue_scan (ctrl);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 158/565 uprobe: Do not emulate/sstep original instruction when ip is changed
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Olsa <[email protected]>
[ Upstream commit 4363264111e1297fa37aa39b0598faa19298ecca ]
If uprobe handler changes instruction pointer we still execute single step) or emulate the original instruction and increment the (new) ip with its length.
This makes the new instruction pointer bogus and application will likely crash on illegal instruction execution.
If user decided to take execution elsewhere, it makes little sense to execute the original instruction, so let's skip it.
--- kernel/events/uprobes.c | 7 +++++++ 1 file changed, 7 insertions(+)
kernel/events/uprobes.c +7 -0
@@ -2338,6 +2338,13 @@ static void handle_swbp(struct pt_regs *regs)handler_chain (uprobe, regs); +/* +* If user decided to take execution elsewhere, it makes little sense +* to execute the original instruction, so let's skip it. +*/ +if (instruction_pointer (regs) != bp_vaddr) + goto out; +if (arch_uprobe_skip_sstep (&uprobe->arch, regs)) goto out;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 159/565 hwmon: (asus-ec-sensors) increase timeout for locking ACPI mutex
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Copeland <[email protected]>
[ Upstream commit 584d55be66ef151e6ef9ccb3dcbc0a2155559be1 ]
Some motherboards require more time to acquire the ACPI mutex, causing "Failed to acquire mutex" messages to appear in the kernel log. Increase the timeout from 500ms to 800ms to accommodate these cases.
--- drivers/hwmon/asus-ec-sensors.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/asus-ec-sensors.c +1 -1
@@ -49,7 +49,7 @@ static char *mutex_path_override;*/ #define ASUS_EC_MAX_BANK 3 -#define ACPI_LOCK_DELAY_MS 500 +#define ACPI_LOCK_DELAY_MS 800/* ACPI mutex for locking access to the EC for the firmware */ #define ASUS_HW_ACCESS_MUTEX_ASMX "\\AMW0.ASMX"
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 160/565 hwmon: (dell-smm) Remove Dell Precision 490 custom config data
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit ddb61e737f04e3c6c8299c1e00bf17a42a7f05cf ]
It turns out the second fan on the Dell Precision 490 does not really support I8K_FAN_TURBO. Setting the fan state to 3 enables automatic fan control, just like on the other two fans. The reason why this was misinterpreted as turbo mode was that the second fan normally spins faster in automatic mode than in the previous fan states. Yet when in state 3, the fan speed reacts to heat exposure, exposing the automatic mode setting.
--- drivers/hwmon/dell-smm-hwmon.c | 14 -------------- 1 file changed, 14 deletions(-)
drivers/hwmon/dell-smm-hwmon.c +0 -14
@@ -1324,7 +1324,6 @@ struct i8k_config_data {enum i8k_configs {DELL_LATITUDE_D520 , -DELL_PRECISION_490 ,DELL_STUDIO ,DELL_XPS , };
@@ -1334,10 +1333,6 @@ static const struct i8k_config_data i8k_config_data[] __initconst = { .fan_mult = 1, .fan_max = I8K_FAN_TURBO, }, - [DELL_PRECISION_490] = { - .fan_mult = 1, - .fan_max = I8K_FAN_TURBO, - }, [DELL_STUDIO] = { .fan_mult = 1, .fan_max = I8K_FAN_HIGH,
@@ -1357,15 +1352,6 @@ static const struct dmi_system_id i8k_config_dmi_table[] __initconst = { }, .driver_data = (void *)&i8k_config_data[DELL_LATITUDE_D520], }, - { - .ident = "Dell Precision 490", - .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), -DMI_MATCH (DMI_PRODUCT_NAME , - "Precision WorkStation 490"), - }, - .driver_data = (void *)&i8k_config_data[DELL_PRECISION_490], - }, { .ident = "Dell Studio", .matches = {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 161/565 tools/cpupower: Fix incorrect size in cpuidle_state_disable()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kaushlendra Kumar <[email protected]>
[ Upstream commit 23199d2aa6dcaf6dd2da772f93d2c94317d71459 ]
Fix incorrect size parameter passed to cpuidle_state_write_file() in cpuidle_state_disable().
The function was incorrectly using sizeof(disable) which returns the size of the unsigned int variable (4 bytes) instead of the actual length of the string stored in the 'value' buffer.
Since 'value' is populated with snprintf() to contain the string representation of the disable value, we should use the length returned by snprintf() to get the correct string length for writing to the sysfs file.
This ensures the correct number of bytes is written to the cpuidle state disable file in sysfs.
--- tools/power/cpupower/lib/cpuidle.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
tools/power/cpupower/lib/cpuidle.c +3 -2
@@ -233,6 +233,7 @@ int cpuidle_state_disable(unsigned int cpu, {char value[SYSFS_PATH_MAX ];int bytes_written; +int len;if (cpuidle_state_count (cpu) <= idlestate)return -1 ;
@@ -241,10 +242,10 @@ int cpuidle_state_disable(unsigned int cpu, idlestate_value_files[IDLESTATE_DISABLE]))return -2 ; -snprintf (value,SYSFS_PATH_MAX ,"%u" , disable); + len =snprintf (value,SYSFS_PATH_MAX ,"%u" , disable); bytes_written =cpuidle_state_write_file (cpu, idlestate,"disable" , - value,sizeof (disable)); + value, len);if (bytes_written)return 0 ;return -3 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 162/565 selftests/bpf: Fix flaky bpf_cookie selftest
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mykyta Yatsenko <[email protected]>
[ Upstream commit 105eb5dc74109a9f53c2f26c9a918d9347a73595 ]
bpf_cookie can fail on perf_event_open(), when it runs after the task_work selftest. The task_work test causes perf to lower sysctl_perf_event_sample_rate, and bpf_cookie uses sample_freq, which is validated against that sysctl. As a result, perf_event_open() rejects the attr if the (now tighter) limit is exceeded.
Quoted 1 line
From
perf_event_open():
if (attr.freq) {
if (attr.sample_freq > sysctl_perf_event_sample_rate)
return -EINVAL;
} else {
if (attr.sample_period & (1ULL << 63))
return -EINVAL;
}Switch bpf_cookie to use sample_period, which is not checked against sysctl_perf_event_sample_rate.
--- tools/testing/selftests/bpf/prog_tests/bpf_cookie.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
tools/testing/selftests/bpf/prog_tests/bpf_cookie.c +1 -2
@@ -450,8 +450,7 @@ static void pe_subtest(struct test_bpf_cookie *skel) attr.size =sizeof (attr); attr.type =PERF_TYPE_SOFTWARE ; attr.config =PERF_COUNT_SW_CPU_CLOCK ; - attr.freq =1 ; - attr.sample_freq =10000 ; + attr.sample_period =100000 ; pfd =syscall (__NR_perf_event_open, &attr,-1 ,0 ,-1 ,PERF_FLAG_FD_CLOEXEC );if (!ASSERT_GE (pfd,0 ,"perf_fd" )) goto cleanup;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 163/565 tools/power x86_energy_perf_policy: Fix incorrect fopen mode usage
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kaushlendra Kumar <[email protected]>
[ Upstream commit 62127655b7ab7b8c2997041aca48a81bf5c6da0c ]
The fopen_or_die() function was previously hardcoded to open files in read-only mode ("r"), ignoring the mode parameter passed to it. This patch corrects fopen_or_die() to use the provided mode argument, allowing for flexible file access as intended.
Additionally, the call to fopen_or_die() inerr_on_hypervisor() incorrectly used the mode
"ro", which is not a valid fopen mode. This is
fixed to use the correct "r" mode.
--- .../power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c +2 -2
@@ -630,7 +630,7 @@ void cmdline(int argc, char **argv)*/ FILE *fopen_or_die (const char *path,const char *mode) { -FILE *filep =fopen (path,"r" ); +FILE *filep =fopen (path, mode);if (!filep)err (1 ,"%s: open failed" , path);
@@ -644,7 +644,7 @@ void err_on_hypervisor(void)char *buffer;/* On VMs /proc/cpuinfo contains a "flags" entry for hypervisor */ - cpuinfo =fopen_or_die ("/proc/cpuinfo" ,"ro" ); + cpuinfo =fopen_or_die ("/proc/cpuinfo" ,"r" ); buffer =malloc (4096 );if (!buffer) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 164/565 tools/power x86_energy_perf_policy: Enhance HWP enable
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Len Brown <[email protected]>
[ Upstream commit c97c057d357c4b39b153e9e430bbf8976e05bd4e ]
On enabling HWP, preserve the reserved bits in MSR_PM_ENABLE.
Also, skip writing the MSR_PM_ENABLE if HWP is already enabled.
--- .../x86_energy_perf_policy/x86_energy_perf_policy.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c +9 -4
@@ -1166,13 +1166,18 @@ int update_hwp_request_pkg(int pkg)int enable_hwp_on_cpu (int cpu) { -unsigned long long msr; +unsigned long long old_msr, new_msr; + +get_msr (cpu,MSR_PM_ENABLE , &old_msr); + +if (old_msr &1 ) +return 0 ;/* already enabled */ -get_msr (cpu,MSR_PM_ENABLE , &msr); -put_msr (cpu,MSR_PM_ENABLE ,1 ); + new_msr = old_msr |1 ; +put_msr (cpu,MSR_PM_ENABLE , new_msr);if (verbose) -printf ("cpu%d: MSR_PM_ENABLE old: %d new: %d\n" , cpu, (unsigned int ) msr,1 ); +printf ("cpu%d: MSR_PM_ENABLE old: %llX new: %llX\n" , cpu, old_msr, new_msr);return 0 ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 165/565 tools/power x86_energy_perf_policy: Prefer driver HWP limits
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Len Brown <[email protected]>
[ Upstream commit 2734fdbc9bb8a3aeb309ba0d62212d7f53f30bc7 ]
When we are successful in using cpufreq min/max limits, skip setting the raw MSR limits entirely.
This is necessary to avoid undoing any modification that the cpufreq driver makes to our sysfs request.
eg. intel_pstate may take our request for a limit that is valid according to HWP.CAP.MIN/MAX and clip it to be within the range available in PLATFORM_INFO.
--- .../x86_energy_perf_policy/x86_energy_perf_policy.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c +9 -4
@@ -62,6 +62,7 @@ unsigned char turbo_update_value;unsigned char update_hwp_epp;unsigned char update_hwp_min;unsigned char update_hwp_max; +unsigned char hwp_limits_done_via_sysfs;unsigned char update_hwp_desired;unsigned char update_hwp_window;unsigned char update_hwp_use_pkg;
@@ -951,8 +952,10 @@ int ratio_2_sysfs_khz(int ratio) }/* * If HWP is enabled and cpufreq sysfs attribtes are present, -* then update sysfs, so that it will not become -* stale when we write to MSRs. +* then update via sysfs. The intel_pstate driver may modify (clip) +* this request, say, when HWP_CAP is outside of PLATFORM_INFO limits, +* and the driver-chosen value takes precidence. +* * (intel_pstate's max_perf_pct and min_perf_pct will follow cpufreq, * so we don't have to touch that.) */
@@ -1007,6 +1010,8 @@ int update_sysfs(int cpu)if (update_hwp_max)update_cpufreq_scaling_freq (1 , cpu, req_update.hwp_max); + hwp_limits_done_via_sysfs =1 ; +return 0 ; }
@@ -1085,10 +1090,10 @@ int update_hwp_request(int cpu)if (debug)print_hwp_request (cpu, &req,"old: " ); -if (update_hwp_min) +if (update_hwp_min && !hwp_limits_done_via_sysfs) req.hwp_min = req_update.hwp_min; -if (update_hwp_max) +if (update_hwp_max && !hwp_limits_done_via_sysfs) req.hwp_max = req_update.hwp_max;if (update_hwp_desired)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 166/565 mfd: stmpe: Remove IRQ domain upon removal
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Stein <[email protected]>
[ Upstream commit 57bf2a312ab2d0bc8ee0f4e8a447fa94a2fc877d ]
The IRQ domain is (optionally) added during stmpe_probe, but never removed. Add the call to stmpe_remove.
--- drivers/mfd/stmpe.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/mfd/stmpe.c +3 -0
@@ -1485,6 +1485,9 @@ int stmpe_probe(struct stmpe_client_info *ci, enum stmpe_partnum partnum)void stmpe_remove (struct stmpe *stmpe) { +if (stmpe->domain) +irq_domain_remove (stmpe->domain); +if (!IS_ERR (stmpe->vio) &®ulator_is_enabled (stmpe->vio))regulator_disable (stmpe->vio);if (!IS_ERR (stmpe->vcc) &®ulator_is_enabled (stmpe->vcc))
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 167/565 mfd: stmpe-i2c: Add missing MODULE_LICENSE
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Stein <[email protected]>
[ Upstream commit 00ea54f058cd4cb082302fe598cfe148e0aadf94 ]
This driver is licensed GPL-2.0-only, so add the corresponding module flag.
--- drivers/mfd/stmpe-i2c.c | 1 + 1 file changed, 1 insertion(+)
drivers/mfd/stmpe-i2c.c +1 -0
@@ -137,3 +137,4 @@ module_exit(stmpe_exit);MODULE_DESCRIPTION ("STMPE MFD I2C Interface Driver" );MODULE_AUTHOR ("Rabin Vincent <[email protected]>" ); +MODULE_LICENSE ("GPL" );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 168/565 mfd: madera: Work around false-positive -Wininitialized warning
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 364752aa0c6ab0a06a2d5bfdb362c1ca407f1a30 ]
clang-21 warns about one uninitialized variable getting dereferenced in madera_dev_init:
drivers/mfd/madera-core.c:739:10: error: variable 'mfd_devs' is uninitialized when used here [-Werror,-Wuninitialized]
739 | mfd_devs, n_devs,
| ^~~~~~~~
drivers/mfd/madera-core.c:459:33: note: initialize the variable 'mfd_devs' to silence this warning
459 | const struct mfd_cell *mfd_devs;
| ^
| = NULLThe code is actually correct here because n_devs is only nonzero when mfd_devs is a valid pointer, but this is impossible for the compiler to see reliably.
Change the logic to check for the pointer as well, to make this easier for the compiler to follow.
--- drivers/mfd/madera-core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/mfd/madera-core.c +2 -2
@@ -456,7 +456,7 @@ int madera_dev_init(struct madera *madera)struct device *dev = madera->dev;unsigned int hwid;int (*patch_fn)(struct madera *) =NULL ; -const struct mfd_cell *mfd_devs; +const struct mfd_cell *mfd_devs =NULL ;int n_devs =0 ;int i, ret;
@@ -670,7 +670,7 @@ int madera_dev_init(struct madera *madera) goto err_reset; } -if (!n_devs) { +if (!n_devs || !mfd_devs) {dev_err (madera->dev,"Device ID 0x%x not a %s\n" , hwid, madera->type_name); ret = -ENODEV ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 169/565 mfd: da9063: Split chip variant reading in two bus transactions
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jens Kehne <[email protected]>
[ Upstream commit 9ac4890ac39352ccea132109e32911495574c3ec ]
We observed the initial probe of the da9063 failing in da9063_get_device_type in about 30% of boots on a Xilinx ZynqMP based board. The problem originates in da9063_i2c_blockreg_read, which uses a single bus transaction to turn the register page and then read a register. On the bus, this should translate to a write to register 0, followed by a read to the target register, separated by a repeated start. However, we found that after the write to register 0, the controller sometimes continues directly with the register address of the read request, without sending the chip address or a repeated start in between, which makes the read request invalid.
To fix this, separate turning the page and reading the register into two separate transactions. This brings the initialization code in line with the rest of the driver, which uses register maps (which to my knowledge do not use repeated starts after turning the page). This has been included in our kernel for several months and was recently included in a shipped product. For us, it reliably fixes the issue, and we have not observed any new issues.
While the underlying problem is probably with the i2c controller or its driver, I still propose a change here in the interest of
robustness: First, I'm not sure this issue can be fixed on the controller side, since there are other issues related to repeated start which can't (AR# 60695, AR# 61664). Second, similar problems might exist with other controllers.
--- drivers/mfd/da9063-i2c.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-)
drivers/mfd/da9063-i2c.c +21 -6
@@ -37,9 +37,13 @@ enum da9063_page_sel_buf_fmt { DA9063_PAGE_SEL_BUF_SIZE, }; +enum da9063_page_sel_msgs { +DA9063_PAGE_SEL_MSG =0 , +DA9063_PAGE_SEL_CNT , +}; +enum da9063_paged_read_msgs { -DA9063_PAGED_READ_MSG_PAGE_SEL =0 , -DA9063_PAGED_READ_MSG_REG_SEL , +DA9063_PAGED_READ_MSG_REG_SEL =0 ,DA9063_PAGED_READ_MSG_DATA ,DA9063_PAGED_READ_MSG_CNT , };
@@ -65,10 +69,21 @@ static int da9063_i2c_blockreg_read(struct i2c_client *client, u16 addr, (page_num <<DA9063_I2C_PAGE_SEL_SHIFT ) &DA9063_REG_PAGE_MASK ;/* Write reg address, page selection */ - xfer[DA9063_PAGED_READ_MSG_PAGE_SEL ].addr = client->addr; - xfer[DA9063_PAGED_READ_MSG_PAGE_SEL ].flags =0 ; - xfer[DA9063_PAGED_READ_MSG_PAGE_SEL ].len =DA9063_PAGE_SEL_BUF_SIZE ; - xfer[DA9063_PAGED_READ_MSG_PAGE_SEL ].buf = page_sel_buf; + xfer[DA9063_PAGE_SEL_MSG ].addr = client->addr; + xfer[DA9063_PAGE_SEL_MSG ].flags =0 ; + xfer[DA9063_PAGE_SEL_MSG ].len =DA9063_PAGE_SEL_BUF_SIZE ; + xfer[DA9063_PAGE_SEL_MSG ].buf = page_sel_buf; + + ret =i2c_transfer (client->adapter, xfer,DA9063_PAGE_SEL_CNT ); +if (ret <0 ) { +dev_err (&client->dev,"Page switch failed: %d\n" , ret); +return ret; + } + +if (ret !=DA9063_PAGE_SEL_CNT ) { +dev_err (&client->dev,"Page switch failed to complete\n" ); +return -EIO ; + }/* Select register address */ xfer[DA9063_PAGED_READ_MSG_REG_SEL ].addr = client->addr;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 170/565 mfd: core: Increment of_nodes refcount before linking it to the platform device
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bastien Curutchet <[email protected]>
[ Upstream commit 5f4bbee069836e51ed0b6d7e565a292f070ababc ]
When an MFD device is added, a platform_device is allocated. If this device is linked to a DT description, the corresponding OF node is linked to the new platform device but the OF node's refcount isn't incremented. As of_node_put() is called during the platform device release, it leads to a refcount underflow.
Call of_node_get() to increment the OF node's refcount when the node is linked to the newly created platform device.
--- drivers/mfd/mfd-core.c | 1 + 1 file changed, 1 insertion(+)
drivers/mfd/mfd-core.c +1 -0
@@ -131,6 +131,7 @@ static int mfd_match_of_node_to_dev(struct platform_device *pdev, of_entry->np = np;list_add_tail (&of_entry->list, &mfd_of_node_list); +of_node_get (np);device_set_node (&pdev->dev,of_fwnode_handle (np));#endif return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 171/565 mfd: intel-lpss: Add Intel Wildcat Lake LPSS PCI IDs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit c91a0e4e549d0457c61f2199fcd84d699400bee1 ]
Add Intel Wildcat Lake PCI IDs.
--- drivers/mfd/intel-lpss-pci.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/mfd/intel-lpss-pci.c +13 -0
@@ -367,6 +367,19 @@ static const struct pci_device_id intel_lpss_pci_ids[] = { { PCI_VDEVICE(INTEL, 0x4b79), (kernel_ulong_t)&ehl_i2c_info }, { PCI_VDEVICE(INTEL, 0x4b7a), (kernel_ulong_t)&ehl_i2c_info }, { PCI_VDEVICE(INTEL, 0x4b7b), (kernel_ulong_t)&ehl_i2c_info }, +/* WCL */ + { PCI_VDEVICE(INTEL, 0x4d25), (kernel_ulong_t)&bxt_uart_info }, + { PCI_VDEVICE(INTEL, 0x4d26), (kernel_ulong_t)&bxt_uart_info }, + { PCI_VDEVICE(INTEL, 0x4d27), (kernel_ulong_t)&tgl_spi_info }, + { PCI_VDEVICE(INTEL, 0x4d30), (kernel_ulong_t)&tgl_spi_info }, + { PCI_VDEVICE(INTEL, 0x4d46), (kernel_ulong_t)&tgl_spi_info }, + { PCI_VDEVICE(INTEL, 0x4d50), (kernel_ulong_t)&ehl_i2c_info }, + { PCI_VDEVICE(INTEL, 0x4d51), (kernel_ulong_t)&ehl_i2c_info }, + { PCI_VDEVICE(INTEL, 0x4d52), (kernel_ulong_t)&bxt_uart_info }, + { PCI_VDEVICE(INTEL, 0x4d78), (kernel_ulong_t)&ehl_i2c_info }, + { PCI_VDEVICE(INTEL, 0x4d79), (kernel_ulong_t)&ehl_i2c_info }, + { PCI_VDEVICE(INTEL, 0x4d7a), (kernel_ulong_t)&ehl_i2c_info }, + { PCI_VDEVICE(INTEL, 0x4d7b), (kernel_ulong_t)&ehl_i2c_info },/* JSL */ { PCI_VDEVICE(INTEL, 0x4da8), (kernel_ulong_t)&spt_uart_info }, { PCI_VDEVICE(INTEL, 0x4da9), (kernel_ulong_t)&spt_uart_info },
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 172/565 drm/amd/display: fix condition for setting timing_adjust_pending
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aurabindo Pillai <[email protected]>
[ Upstream commit 1a6a3374ecb9899ccf0d209b5783a796bdba8cec ]
timing_adjust_pending is used to defer certain programming sequences when OTG timing is about to be changed, like with VRR. Insufficient checking for timing change in this case caused a regression which reduces PSR Replay residency.
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +3 -1
@@ -453,7 +453,9 @@ bool dc_stream_adjust_vmin_vmax(struct dc *dc,* avoid conflicting with firmware updates. */ if (dc->ctx->dce_version >DCE_VERSION_MAX ) { -if (dc->optimized_required || dc->wm_optimized_required) { +if ((dc->optimized_required || dc->wm_optimized_required) && + (stream->adjust.v_total_max != adjust->v_total_max || + stream->adjust.v_total_min != adjust->v_total_min)) { stream->adjust.timing_adjust_pending = true;return false; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 173/565 drm/amd/display: ensure committing streams is seamless
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Clay King <[email protected]>
[ Upstream commit ca74cc428f2b9d0170c56b473dbcfd7fa01daf2d ]
[Why]
When transitioning between topologies such as multi-display to single display ODM 2:1, pipes might not be freed before use.
[How]
In dc_commit_streams, commit an additional, minimal transition if original transition is not seamless to ensure pipes are freed.
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/gpu/drm/amd/display/dc/core/dc.c +12 -0
@@ -2182,6 +2182,18 @@ enum dc_status dc_commit_streams(struct dc *dc, struct dc_commit_streams_params goto fail; } +/* +* If not already seamless, make transition seamless by inserting intermediate minimal transition +*/ +if (dc->hwss.is_pipe_topology_transition_seamless && + !dc->hwss.is_pipe_topology_transition_seamless (dc, dc->current_state, context)) { + res =commit_minimal_transition_state (dc, context); +if (res !=DC_OK ) { +BREAK_TO_DEBUGGER (); + goto fail; + } + } + res =dc_commit_state_no_check (dc, context);for (i =0 ; i < params->stream_count; i++) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 174/565 drm/amdgpu: add range check for RAS bad page address
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tao Zhou <[email protected]>
[ Upstream commit 2b17c240e8cd9ac61d3c82277fbed27edad7f002 ]
Exclude invalid bad pages.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 58 ++++++++++++------------- 1 file changed, 28 insertions(+), 30 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +28 -30
@@ -134,9 +134,9 @@ enum amdgpu_ras_retire_page_reservation {atomic_t amdgpu_ras_in_intr =ATOMIC_INIT (0 ); -static bool amdgpu_ras_check_bad_page_unlock (struct amdgpu_ras *con, +static int amdgpu_ras_check_bad_page_unlock (struct amdgpu_ras *con,uint64_t addr); -static bool amdgpu_ras_check_bad_page (struct amdgpu_device *adev, +static int amdgpu_ras_check_bad_page (struct amdgpu_device *adev,uint64_t addr);#ifdef CONFIG_X86_MCE_AMD static void amdgpu_register_bad_pages_mca_notifier (struct amdgpu_device *adev);
@@ -167,18 +167,16 @@ static int amdgpu_reserve_page_direct(struct amdgpu_device *adev, uint64_t addrestruct eeprom_table_record err_rec;int ret; -if ((address >= adev->gmc.mc_vram_size) || - (address >=RAS_UMC_INJECT_ADDR_LIMIT )) { + ret =amdgpu_ras_check_bad_page (adev, address); +if (ret == -EINVAL ) {dev_warn (adev->dev, -"RAS WARN: input address 0x%llx is invalid.\n" , - address); +"RAS WARN: input address 0x%llx is invalid.\n" , + address);return -EINVAL ; - } - -if (amdgpu_ras_check_bad_page (adev, address)) { + }else if (ret ==1 ) {dev_warn (adev->dev, -"RAS WARN: 0x%llx has already been marked as bad page!\n" , - address); +"RAS WARN: 0x%llx has already been marked as bad page!\n" , + address);return 0 ; }
@@ -511,22 +509,16 @@ static ssize_t amdgpu_ras_debugfs_ctrl_write(struct file *f, ret =amdgpu_ras_feature_enable (adev, &data.head,1 );break ;case 2 : -if ((data.inject.address >= adev->gmc.mc_vram_size && - adev->gmc.mc_vram_size) || - (data.inject.address >=RAS_UMC_INJECT_ADDR_LIMIT )) { -dev_warn (adev->dev,"RAS WARN: input address " -"0x%llx is invalid." , +/* umc ce/ue error injection for a bad page is not allowed */ +if (data.head.block ==AMDGPU_RAS_BLOCK__UMC ) + ret =amdgpu_ras_check_bad_page (adev, data.inject.address); +if (ret == -EINVAL ) { +dev_warn (adev->dev,"RAS WARN: input address 0x%llx is invalid." , data.inject.address); - ret = -EINVAL ;break ; - } - -/* umc ce/ue error injection for a bad page is not allowed */ -if ((data.head.block ==AMDGPU_RAS_BLOCK__UMC ) && -amdgpu_ras_check_bad_page (adev, data.inject.address)) { -dev_warn (adev->dev,"RAS WARN: inject: 0x%llx has " -"already been marked as bad!\n" , - data.inject.address); + }else if (ret ==1 ) { +dev_warn (adev->dev,"RAS WARN: inject: 0x%llx has already been marked as bad!\n" , + data.inject.address);break ; }
@@ -2774,18 +2766,24 @@ static int amdgpu_ras_load_bad_pages(struct amdgpu_device *adev)return ret; } -static bool amdgpu_ras_check_bad_page_unlock (struct amdgpu_ras *con, +static int amdgpu_ras_check_bad_page_unlock (struct amdgpu_ras *con,uint64_t addr) {struct ras_err_handler_data *data = con->eh_data; +struct amdgpu_device *adev = con->adev;int i; +if ((addr >= adev->gmc.mc_vram_size && + adev->gmc.mc_vram_size) || + (addr >=RAS_UMC_INJECT_ADDR_LIMIT )) +return -EINVAL ; + addr >>=AMDGPU_GPU_PAGE_SHIFT ;for (i =0 ; i < data->count; i++)if (addr == data->bps[i].retired_page) -return true; +return 1 ; -return false; +return 0 ; }/*
@@ -2793,11 +2791,11 @@ static bool amdgpu_ras_check_bad_page_unlock(struct amdgpu_ras *con,* * Note: this check is only for umc block */ -static bool amdgpu_ras_check_bad_page (struct amdgpu_device *adev, +static int amdgpu_ras_check_bad_page (struct amdgpu_device *adev,uint64_t addr) {struct amdgpu_ras *con =amdgpu_ras_get_context (adev); -bool ret = false; +int ret =0 ;if (!con || !con->eh_data)return ret;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 175/565 drm/amdgpu: Check vcn sram load return value
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sathishkumar S <[email protected]>
[ Upstream commit faab5ea0836733ef1c8e83cf6b05690a5c9066be ]
Log an error when vcn sram load fails in indirect mode and return the same error value.
--- drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c | 10 ++++++++-- drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c | 10 ++++++++-- drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c | 10 ++++++++-- drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c | 10 ++++++++-- drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c | 11 ++++++++--- drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c | 10 ++++++++-- drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c | 9 +++++++-- drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c | 11 ++++++++--- 8 files changed, 63 insertions(+), 18 deletions(-)
drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c +8 -2
@@ -842,6 +842,7 @@ static int vcn_v2_0_start_dpg_mode(struct amdgpu_device *adev, bool indirect)volatile struct amdgpu_fw_shared *fw_shared = adev->vcn.inst->fw_shared.cpu_addr;struct amdgpu_ring *ring = &adev->vcn.inst->ring_dec;uint32_t rb_bufsz, tmp; +int ret;vcn_v2_0_enable_static_power_gating (adev);
@@ -925,8 +926,13 @@ static int vcn_v2_0_start_dpg_mode(struct amdgpu_device *adev, bool indirect) UVD, 0, mmUVD_MASTINT_EN), UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect); -if (indirect) -amdgpu_vcn_psp_update_sram (adev,0 ,0 ); +if (indirect) { + ret =amdgpu_vcn_psp_update_sram (adev,0 ,0 ); +if (ret) { +dev_err (adev->dev,"vcn sram load failed %d\n" , ret); +return ret; + } + }/* force RBC into idle state */ rb_bufsz =order_base_2 (ring->ring_size);
drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c +8 -2
@@ -870,6 +870,7 @@ static int vcn_v2_5_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boovolatile struct amdgpu_fw_shared *fw_shared = adev->vcn.inst[inst_idx].fw_shared.cpu_addr;struct amdgpu_ring *ring;uint32_t rb_bufsz, tmp; +int ret;/* disable register anti-hang mechanism */ WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS), 1,
@@ -960,8 +961,13 @@ static int vcn_v2_5_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo VCN, 0, mmUVD_MASTINT_EN), UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect); -if (indirect) -amdgpu_vcn_psp_update_sram (adev, inst_idx,0 ); +if (indirect) { + ret =amdgpu_vcn_psp_update_sram (adev, inst_idx,0 ); +if (ret) { +dev_err (adev->dev,"vcn sram load failed %d\n" , ret); +return ret; + } + } ring = &adev->vcn.inst[inst_idx].ring_dec;/* force RBC into idle state */
drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c +8 -2
@@ -990,6 +990,7 @@ static int vcn_v3_0_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boovolatile struct amdgpu_fw_shared *fw_shared = adev->vcn.inst[inst_idx].fw_shared.cpu_addr;struct amdgpu_ring *ring;uint32_t rb_bufsz, tmp; +int ret;/* disable register anti-hang mechanism */ WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS), 1,
@@ -1082,8 +1083,13 @@ static int vcn_v3_0_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, booWREG32_SOC15_DPG_MODE (inst_idx,SOC15_DPG_MODE_OFFSET (VCN , inst_idx, mmUVD_VCPU_CNTL), tmp,0 , indirect); -if (indirect) -amdgpu_vcn_psp_update_sram (adev, inst_idx,0 ); +if (indirect) { + ret =amdgpu_vcn_psp_update_sram (adev, inst_idx,0 ); +if (ret) { +dev_err (adev->dev,"vcn sram load failed %d\n" , ret); +return ret; + } + } ring = &adev->vcn.inst[inst_idx].ring_dec;/* force RBC into idle state */
drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c +8 -2
@@ -963,6 +963,7 @@ static int vcn_v4_0_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boovolatile struct amdgpu_vcn4_fw_shared *fw_shared = adev->vcn.inst[inst_idx].fw_shared.cpu_addr;struct amdgpu_ring *ring;uint32_t tmp; +int ret;/* disable register anti-hang mechanism */ WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, regUVD_POWER_STATUS), 1,
@@ -1045,8 +1046,13 @@ static int vcn_v4_0_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect); -if (indirect) -amdgpu_vcn_psp_update_sram (adev, inst_idx,0 ); +if (indirect) { + ret =amdgpu_vcn_psp_update_sram (adev, inst_idx,0 ); +if (ret) { +dev_err (adev->dev,"vcn sram load failed %d\n" , ret); +return ret; + } + } ring = &adev->vcn.inst[inst_idx].ring_enc[0 ];
drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c +8 -3
@@ -778,7 +778,7 @@ static int vcn_v4_0_3_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, bvolatile struct amdgpu_vcn4_fw_shared *fw_shared = adev->vcn.inst[inst_idx].fw_shared.cpu_addr;struct amdgpu_ring *ring; -int vcn_inst; +int vcn_inst, ret;uint32_t tmp; vcn_inst =GET_INST (VCN , inst_idx);
@@ -871,8 +871,13 @@ static int vcn_v4_0_3_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, b VCN, 0, regUVD_MASTINT_EN), UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect); -if (indirect) -amdgpu_vcn_psp_update_sram (adev, inst_idx,AMDGPU_UCODE_ID_VCN0_RAM ); +if (indirect) { + ret =amdgpu_vcn_psp_update_sram (adev, inst_idx,AMDGPU_UCODE_ID_VCN0_RAM ); +if (ret) { +dev_err (adev->dev,"vcn sram load failed %d\n" , ret); +return ret; + } + } ring = &adev->vcn.inst[inst_idx].ring_enc[0 ];
drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c +8 -2
@@ -876,6 +876,7 @@ static int vcn_v4_0_5_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, bvolatile struct amdgpu_vcn4_fw_shared *fw_shared = adev->vcn.inst[inst_idx].fw_shared.cpu_addr;struct amdgpu_ring *ring;uint32_t tmp; +int ret;/* disable register anti-hang mechanism */ WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, regUVD_POWER_STATUS), 1,
@@ -956,8 +957,13 @@ static int vcn_v4_0_5_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, b VCN, inst_idx, regUVD_MASTINT_EN), UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect); -if (indirect) -amdgpu_vcn_psp_update_sram (adev, inst_idx,0 ); +if (indirect) { + ret =amdgpu_vcn_psp_update_sram (adev, inst_idx,0 ); +if (ret) { +dev_err (adev->dev,"vcn sram load failed %d\n" , ret); +return ret; + } + } ring = &adev->vcn.inst[inst_idx].ring_enc[0 ];
drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c +7 -2
@@ -665,6 +665,7 @@ static int vcn_v5_0_0_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, bvolatile struct amdgpu_vcn5_fw_shared *fw_shared = adev->vcn.inst[inst_idx].fw_shared.cpu_addr;struct amdgpu_ring *ring;uint32_t tmp; +int ret;/* disable register anti-hang mechanism */ WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, regUVD_POWER_STATUS), 1,
@@ -718,8 +719,12 @@ static int vcn_v5_0_0_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, b VCN, inst_idx, regUVD_MASTINT_EN), UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect); -if (indirect) -amdgpu_vcn_psp_update_sram (adev, inst_idx,0 ); +if (indirect) { + ret =amdgpu_vcn_psp_update_sram (adev, inst_idx,0 ); +dev_err (adev->dev,"%s: vcn sram load failed %d\n" , __func__, ret); +if (ret) +return ret; + } ring = &adev->vcn.inst[inst_idx].ring_enc[0 ];
drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c +8 -3
@@ -605,7 +605,7 @@ static int vcn_v5_0_1_start_dpg_mode(struct amdgpu_vcn_inst *vinst, adev->vcn.inst[inst_idx].fw_shared.cpu_addr;struct amdgpu_ring *ring;struct dpg_pause_state state = {.fw_based =VCN_DPG_STATE__PAUSE }; -int vcn_inst; +int vcn_inst, ret;uint32_t tmp; vcn_inst =GET_INST (VCN , inst_idx);
@@ -666,8 +666,13 @@ static int vcn_v5_0_1_start_dpg_mode(struct amdgpu_vcn_inst *vinst, VCN, 0, regUVD_MASTINT_EN), UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect); -if (indirect) -amdgpu_vcn_psp_update_sram (adev, inst_idx,AMDGPU_UCODE_ID_VCN0_RAM ); +if (indirect) { + ret =amdgpu_vcn_psp_update_sram (adev, inst_idx,AMDGPU_UCODE_ID_VCN0_RAM ); +if (ret) { +dev_err (adev->dev,"vcn sram load failed %d\n" , ret); +return ret; + } + }/* resetting ring, fw should not check RB ring */ fw_shared->sq.queue_mode |=FW_QUEUE_RING_RESET ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 176/565 drm/amd/display: Move setup_stream_attribute
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Strauss <[email protected]>
[ Upstream commit 2681bf4ae8d24df950138b8c9ea9c271cd62e414 ]
[WHY]
If symclk RCO is enabled, stream encoder may not be receiving an ungated clock by the time we attempt to set stream attributes when setting dpms on. Since the clock is gated, register writes to the stream encoder fail.
[HOW]
Move set_stream_attribute call into enable_stream, just after the point where symclk32_se is ungated.
Logically there is no need to set stream attributes as early as is currently done in link_set_dpms_on, so this should have no impact beyond the RCO fix.
--- drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c | 1 + drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c | 2 ++ drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c | 2 ++ drivers/gpu/drm/amd/display/dc/link/link_dpms.c | 3 --- .../drm/amd/display/dc/virtual/virtual_stream_encoder.c | 7 +++++++ 5 files changed, 12 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c +1 -0
@@ -670,6 +670,7 @@ void dce110_enable_stream(struct pipe_ctx *pipe_ctx)uint32_t early_control =0 ;struct timing_generator *tg = pipe_ctx->stream_res.tg; + link_hwss->setup_stream_attribute (pipe_ctx); link_hwss->setup_stream_encoder (pipe_ctx); dc->hwss.update_info_frame (pipe_ctx);
drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c +2 -0
@@ -3009,6 +3009,8 @@ void dcn20_enable_stream(struct pipe_ctx *pipe_ctx) link_enc->transmitter - TRANSMITTER_UNIPHY_A); } + link_hwss->setup_stream_attribute (pipe_ctx); +if (dc->res_pool->dccg->funcs->set_pixel_rate_div) dc->res_pool->dccg->funcs->set_pixel_rate_div( dc->res_pool->dccg,
drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c +2 -0
@@ -1019,6 +1019,8 @@ void dcn401_enable_stream(struct pipe_ctx *pipe_ctx) } } + link_hwss->setup_stream_attribute (pipe_ctx); +if (dc->res_pool->dccg->funcs->set_pixel_rate_div) { dc->res_pool->dccg->funcs->set_pixel_rate_div( dc->res_pool->dccg,
drivers/gpu/drm/amd/display/dc/link/link_dpms.c +0 -3
@@ -2447,7 +2447,6 @@ void link_set_dpms_on(struct link_encoder *link_enc;enum otg_out_mux_dest otg_out_dest =OUT_MUX_DIO ;struct vpg *vpg = pipe_ctx->stream_res.stream_enc->vpg; -const struct link_hwss *link_hwss =get_link_hwss (link, &pipe_ctx->link_res);bool apply_edp_fast_boot_optimization = pipe_ctx->stream->apply_edp_fast_boot_optimization;
@@ -2490,8 +2489,6 @@ void link_set_dpms_on( pipe_ctx->stream_res.tg->funcs->set_out_mux (pipe_ctx->stream_res.tg, otg_out_dest); } - link_hwss->setup_stream_attribute (pipe_ctx); - pipe_ctx->stream->apply_edp_fast_boot_optimization = false;// Enable VPG before building infoframe
drivers/gpu/drm/amd/display/dc/virtual/virtual_stream_encoder.c +7 -0
@@ -44,6 +44,11 @@ static void virtual_stream_encoder_dvi_set_stream_attribute( struct dc_crtc_timing *crtc_timing, bool is_dual_link) {} +static void virtual_stream_encoder_lvds_set_stream_attribute ( +struct stream_encoder *enc, +struct dc_crtc_timing *crtc_timing) +{} +static void virtual_stream_encoder_set_throttled_vcp_size (struct stream_encoder *enc,struct fixed31_32 avg_time_slots_per_mtp)
@@ -115,6 +120,8 @@ static const struct stream_encoder_funcs virtual_str_enc_funcs = { virtual_stream_encoder_hdmi_set_stream_attribute, .dvi_set_stream_attribute = virtual_stream_encoder_dvi_set_stream_attribute, + .lvds_set_stream_attribute = + virtual_stream_encoder_lvds_set_stream_attribute, .set_throttled_vcp_size = virtual_stream_encoder_set_throttled_vcp_size, .update_hdmi_info_packets =
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 177/565 drm/amd/display: Increase AUX Intra-Hop Done Max Wait Duration
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Strauss <[email protected]>
[ Upstream commit e3419e1e44b87d4176fb98679a77301b1ca40f63 ]
[WHY]
In the worst case, AUX intra-hop done can take hundreds of milliseconds as each retimer in a link might have to wait a full AUX_RD_INTERVAL to send LT abort downstream.
[HOW]
Wait 300ms for each retimer in a link to allow time to propagate a LT abort without infinitely waiting on intra-hop done.
For no-retimer case, keep the max duration at 10ms.
--- .../drm/amd/display/dc/link/protocols/link_dp_training.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training.c +7 -2
@@ -1012,7 +1012,12 @@ static enum link_training_result dpcd_exit_training_mode(struct dc_link *link, e {enum dc_status status;uint8_t sink_status =0 ; -uint8_t i; +uint32_t i; +uint8_t lttpr_count =dp_parse_lttpr_repeater_count (link->dpcd_caps.lttpr_caps.phy_repeater_cnt); +uint32_t intra_hop_disable_time_ms = (lttpr_count >0 ? lttpr_count *300 :10 ); + +// Each hop could theoretically take over 256ms (max 128b/132b AUX RD INTERVAL) +// To be safe, allow 300ms per LTTPR and 10ms for no LTTPR case /* clear training pattern set */ status =dpcd_set_training_pattern (link,DP_TRAINING_PATTERN_VIDEOIDLE );
@@ -1022,7 +1027,7 @@ static enum link_training_result dpcd_exit_training_mode(struct dc_link *link, eif (encoding == DP_128b_132b_ENCODING) {/* poll for intra-hop disable */ -for (i =0 ; i <10 ; i++) { +for (i =0 ; i < intra_hop_disable_time_ms; i++) {if ((core_link_read_dpcd (link,DP_SINK_STATUS , &sink_status,1 ) ==DC_OK ) && (sink_status &DP_INTRA_HOP_AUX_REPLY_INDICATION ) ==0 )break ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 178/565 drm/xe/guc: Add more GuC load error status codes
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Harrison <[email protected]>
[ Upstream commit 45fbb51050e72723c2bdcedc1ce32305256c70ed ]
The GuC load process will abort if certain status codes (which are indicative of a fatal error) are reported. Otherwise, it keeps waiting until the 'success' code is returned. New error codes have been added in recent GuC releases, so add support for aborting on those as well.
v2: Shuffle HWCONFIG_START to the front of the switch to keep the ordering as per the enum define for clarity (review feedback by Jonathan). Also add a description for the basic 'invalid init data' code which was missing.
--- drivers/gpu/drm/xe/abi/guc_errors_abi.h | 3 +++ drivers/gpu/drm/xe/xe_guc.c | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-)
drivers/gpu/drm/xe/abi/guc_errors_abi.h +3 -0
@@ -55,6 +55,7 @@ enum xe_guc_load_status {XE_GUC_LOAD_STATUS_HWCONFIG_START =0x05 ,XE_GUC_LOAD_STATUS_HWCONFIG_DONE =0x06 ,XE_GUC_LOAD_STATUS_HWCONFIG_ERROR =0x07 , +XE_GUC_LOAD_STATUS_BOOTROM_VERSION_MISMATCH =0x08 ,XE_GUC_LOAD_STATUS_GDT_DONE =0x10 ,XE_GUC_LOAD_STATUS_IDT_DONE =0x20 , XE_GUC_LOAD_STATUS_LAPIC_DONE = 0x30,
@@ -67,6 +68,8 @@ enum xe_guc_load_status {XE_GUC_LOAD_STATUS_INVALID_INIT_DATA_RANGE_START ,XE_GUC_LOAD_STATUS_MPU_DATA_INVALID =0x73 ,XE_GUC_LOAD_STATUS_INIT_MMIO_SAVE_RESTORE_INVALID =0x74 , +XE_GUC_LOAD_STATUS_KLV_WORKAROUND_INIT_ERROR =0x75 , +XE_GUC_LOAD_STATUS_INVALID_FTR_FLAG =0x76 ,XE_GUC_LOAD_STATUS_INVALID_INIT_DATA_RANGE_END , XE_GUC_LOAD_STATUS_READY = 0xF0,
drivers/gpu/drm/xe/xe_guc.c +17 -2
@@ -527,11 +527,14 @@ static int guc_load_done(u32 status)case XE_GUC_LOAD_STATUS_GUC_PREPROD_BUILD_MISMATCH :case XE_GUC_LOAD_STATUS_ERROR_DEVID_INVALID_GUCTYPE :case XE_GUC_LOAD_STATUS_HWCONFIG_ERROR : +case XE_GUC_LOAD_STATUS_BOOTROM_VERSION_MISMATCH :case XE_GUC_LOAD_STATUS_DPC_ERROR :case XE_GUC_LOAD_STATUS_EXCEPTION :case XE_GUC_LOAD_STATUS_INIT_DATA_INVALID :case XE_GUC_LOAD_STATUS_MPU_DATA_INVALID :case XE_GUC_LOAD_STATUS_INIT_MMIO_SAVE_RESTORE_INVALID : +case XE_GUC_LOAD_STATUS_KLV_WORKAROUND_INIT_ERROR : +case XE_GUC_LOAD_STATUS_INVALID_FTR_FLAG :return -1 ; }
@@ -670,17 +673,29 @@ static void guc_wait_ucode(struct xe_guc *guc) }switch (ukernel) { +case XE_GUC_LOAD_STATUS_HWCONFIG_START : +xe_gt_err (gt,"still extracting hwconfig table.\n" ); +break ; +case XE_GUC_LOAD_STATUS_EXCEPTION :xe_gt_err (gt,"firmware exception. EIP: %#x\n" ,xe_mmio_read32 (gt,SOFT_SCRATCH (13 )));break ; +case XE_GUC_LOAD_STATUS_INIT_DATA_INVALID : +xe_gt_err (gt,"illegal init/ADS data\n" ); +break ; +case XE_GUC_LOAD_STATUS_INIT_MMIO_SAVE_RESTORE_INVALID :xe_gt_err (gt,"illegal register in save/restore workaround list\n" );break ; -case XE_GUC_LOAD_STATUS_HWCONFIG_START : -xe_gt_err (gt,"still extracting hwconfig table.\n" ); +case XE_GUC_LOAD_STATUS_KLV_WORKAROUND_INIT_ERROR : +xe_gt_err (gt,"illegal workaround KLV data\n" ); +break ; + +case XE_GUC_LOAD_STATUS_INVALID_FTR_FLAG : +xe_gt_err (gt,"illegal feature flag specified\n" );break ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 179/565 drm/xe: Fix oops in xe_gem_fault when running core_hotunplug test.
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maarten Lankhorst <[email protected]>
[ Upstream commit 1cda3c755bb7770be07d75949bb0f45fb88651f6 ]
I saw an oops in xe_gem_fault when running the xe-fast-feedback testlist against the realtime kernel without debug options enabled.
The panic happens after core_hotunplug unbind-rebind finishes. Presumably what happens is that a process mmaps, unlocks because of the FAULT_FLAG_RETRY_NOWAIT logic, has no process memory left, causing ttm_bo_vm_dummy_page() to return VM_FAULT_NOPAGE, since there was nothing left to populate, and then oopses in "mem_type_is_vram(tbo->resource->mem_type)" because tbo->resource is NULL.
It's convoluted, but fits the data and explains the oops after the test exits.
--- drivers/gpu/drm/xe/xe_bo.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-)
drivers/gpu/drm/xe/xe_bo.c +16 -12
@@ -1218,22 +1218,26 @@ static vm_fault_t xe_gem_fault(struct vm_fault *vmf) ret =ttm_bo_vm_fault_reserved (vmf, vmf->vma->vm_page_prot,TTM_BO_VM_NUM_PREFAULT );drm_dev_exit (idx); + +if (ret ==VM_FAULT_RETRY && + !(vmf->flags &FAULT_FLAG_RETRY_NOWAIT )) + goto out; + +/* +* ttm_bo_vm_reserve() already has dma_resv_lock. +*/ +if (ret ==VM_FAULT_NOPAGE && +mem_type_is_vram (tbo->resource->mem_type)) { +mutex_lock (&xe->mem_access.vram_userfault.lock); +if (list_empty (&bo->vram_userfault_link)) +list_add (&bo->vram_userfault_link, + &xe->mem_access.vram_userfault.list); +mutex_unlock (&xe->mem_access.vram_userfault.lock); + } }else { ret =ttm_bo_vm_dummy_page (vmf, vmf->vma->vm_page_prot); } -if (ret ==VM_FAULT_RETRY && !(vmf->flags &FAULT_FLAG_RETRY_NOWAIT )) - goto out; -/* -* ttm_bo_vm_reserve() already has dma_resv_lock. -*/ -if (ret ==VM_FAULT_NOPAGE &&mem_type_is_vram (tbo->resource->mem_type)) { -mutex_lock (&xe->mem_access.vram_userfault.lock); -if (list_empty (&bo->vram_userfault_link)) -list_add (&bo->vram_userfault_link, &xe->mem_access.vram_userfault.list); -mutex_unlock (&xe->mem_access.vram_userfault.lock); - } -dma_resv_unlock (tbo->base.resv); out:if (needs_rpm)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 180/565 drm/amdgpu: Avoid rma causes GPU duplicate reset
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ce Sun <[email protected]>
[ Upstream commit 21c0ffa612c98bcc6dab5bd9d977a18d565ee28e ]
Try to ensure poison creation handle is completed in time to set device rma value.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 17 ++++++++++------- drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h | 1 + 2 files changed, 11 insertions(+), 7 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +10 -7
@@ -2927,7 +2927,6 @@ static void amdgpu_ras_do_page_retirement(struct work_struct *work) page_retirement_dwork.work);struct amdgpu_device *adev = con->adev;struct ras_err_data err_data; -unsigned long err_cnt;/* If gpu reset is ongoing, delay retiring the bad pages */ if (amdgpu_in_reset (adev) ||amdgpu_ras_in_recovery (adev)) {
@@ -2939,13 +2938,9 @@ static void amdgpu_ras_do_page_retirement(struct work_struct *work)amdgpu_ras_error_data_init (&err_data);amdgpu_umc_handle_bad_pages (adev, &err_data); - err_cnt = err_data.err_addr_cnt;amdgpu_ras_error_data_fini (&err_data); -if (err_cnt &&amdgpu_ras_is_rma (adev)) -amdgpu_ras_reset_gpu (adev); -amdgpu_ras_schedule_retirement_dwork (con,AMDGPU_RAS_RETIRE_PAGE_INTERVAL ); }
@@ -3008,6 +3003,9 @@ static int amdgpu_ras_poison_creation_handler(struct amdgpu_device *adev,if (total_detect_count)schedule_delayed_work (&ras->page_retirement_dwork,0 ); +if (amdgpu_ras_is_rma (adev) &&atomic_cmpxchg (&ras->rma_in_recovery,0 ,1 ) ==0 ) +amdgpu_ras_reset_gpu (adev); +return 0 ; }
@@ -3043,6 +3041,12 @@ static int amdgpu_ras_poison_consumption_handler(struct amdgpu_device *adev, reset_flags |= msg.reset; } +/* +* Try to ensure poison creation handler is completed first +* to set rma if bad page exceed threshold. +*/ +flush_delayed_work (&con->page_retirement_dwork); +/* for RMA, amdgpu_ras_poison_creation_handler will trigger gpu reset */ if (reset_flags && !amdgpu_ras_is_rma (adev)) {if (reset_flags &AMDGPU_RAS_GPU_RESET_MODE1_RESET )
@@ -3052,8 +3056,6 @@ static int amdgpu_ras_poison_consumption_handler(struct amdgpu_device *adev,else reset = reset_flags; -flush_delayed_work (&con->page_retirement_dwork); - con->gpu_reset_flags |= reset;amdgpu_ras_reset_gpu (adev);
@@ -3174,6 +3176,7 @@ int amdgpu_ras_recovery_init(struct amdgpu_device *adev)mutex_init (&con->recovery_lock);INIT_WORK (&con->recovery_work, amdgpu_ras_do_recovery);atomic_set (&con->in_recovery,0 ); +atomic_set (&con->rma_in_recovery,0 ); con->eeprom_control.bad_channel_bitmap =0 ; max_eeprom_records_count =amdgpu_ras_eeprom_max_record_count (&con->eeprom_control);
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h +1 -0
@@ -510,6 +510,7 @@ struct amdgpu_ras {/* gpu recovery */ struct work_struct recovery_work;atomic_t in_recovery; +atomic_t rma_in_recovery;struct amdgpu_device *adev;/* error handler data */ struct ras_err_handler_data *eh_data;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 181/565 drm/amd/amdgpu: Release xcp drm memory after unplug
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Meng Li <[email protected]>
[ Upstream commit e6c2b0f23221ed43c4cc6f636e9ab7862954d562 ]
Add a new API amdgpu_xcp_drm_dev_free().
After unplug xcp device, need to release xcp drm memory etc.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c | 1 + drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c | 56 +++++++++++++++++---- drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.h | 1 + 3 files changed, 49 insertions(+), 9 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c +1 -0
@@ -382,6 +382,7 @@ void amdgpu_xcp_dev_unplug(struct amdgpu_device *adev) p_ddev->primary->dev = adev->xcp_mgr->xcp[i].pdev; p_ddev->driver = adev->xcp_mgr->xcp[i].driver; p_ddev->vma_offset_manager = adev->xcp_mgr->xcp[i].vma_offset_manager; +amdgpu_xcp_drm_dev_free (p_ddev); } }
drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c +47 -9
89 lines not on this page · raw message
drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.h +1 -0
@@ -25,5 +25,6 @@#define _AMDGPU_XCP_DRV_H_int amdgpu_xcp_drm_dev_alloc (struct drm_device **ddev); +void amdgpu_xcp_drm_dev_free (struct drm_device *ddev);void amdgpu_xcp_drv_release (void );#endif /* _AMDGPU_XCP_DRV_H_ */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 182/565 drm/amdgpu: Skip poison aca bank from UE channel
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Liu <[email protected]>
[ Upstream commit 8e8e08c831f088ed581444c58a635c49ea1222ab ]
Avoid GFX poison consumption errors logged when fatal error occurs.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c | 51 +++++++++++++++---------- 1 file changed, 30 insertions(+), 21 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c +30 -21
@@ -132,6 +132,27 @@ static void aca_smu_bank_dump(struct amdgpu_device *adev, int idx, int total, st idx + 1, total, aca_regs[i].name, bank->regs[aca_regs[i].reg_idx]); } +static bool aca_bank_hwip_is_matched (struct aca_bank *bank,enum aca_hwip_type type) +{ + +struct aca_hwip *hwip; +int hwid, mcatype; +u64 ipid; + +if (!bank || type ==ACA_HWIP_TYPE_UNKNOW ) +return false; + + hwip = &aca_hwid_mcatypes[type]; +if (!hwip->hwid) +return false; + + ipid = bank->regs[ACA_REG_IDX_IPID ]; + hwid =ACA_REG__IPID__HARDWAREID (ipid); + mcatype =ACA_REG__IPID__MCATYPE (ipid); + +return hwip->hwid == hwid && hwip->mcatype == mcatype; +} +static int aca_smu_get_valid_aca_banks (struct amdgpu_device *adev,enum aca_smu_type type,int start,int count,struct aca_banks *banks,struct ras_query_context *qctx)
@@ -170,6 +191,15 @@ static int aca_smu_get_valid_aca_banks(struct amdgpu_device *adev, enum aca_smu_ bank.type = type; +/* +* Poison being consumed when injecting a UE while running background workloads, +* which are unexpected. +*/ +if (type ==ACA_SMU_TYPE_UE && +ACA_REG__STATUS__POISON (bank.regs[ACA_REG_IDX_STATUS ]) && + !aca_bank_hwip_is_matched (&bank,ACA_HWIP_TYPE_UMC )) +continue ; +aca_smu_bank_dump (adev, i, count, &bank, qctx); ret =aca_banks_add_bank (banks, &bank);
@@ -180,27 +210,6 @@ static int aca_smu_get_valid_aca_banks(struct amdgpu_device *adev, enum aca_smu_return 0 ; } -static bool aca_bank_hwip_is_matched (struct aca_bank *bank,enum aca_hwip_type type) -{ - -struct aca_hwip *hwip; -int hwid, mcatype; -u64 ipid; - -if (!bank || type ==ACA_HWIP_TYPE_UNKNOW ) -return false; - - hwip = &aca_hwid_mcatypes[type]; -if (!hwip->hwid) -return false; - - ipid = bank->regs[ACA_REG_IDX_IPID ]; - hwid =ACA_REG__IPID__HARDWAREID (ipid); - mcatype =ACA_REG__IPID__MCATYPE (ipid); - -return hwip->hwid == hwid && hwip->mcatype == mcatype; -} -static bool aca_bank_is_valid (struct aca_handle *handle,struct aca_bank *bank,enum aca_smu_type type) {const struct aca_bank_ops *bank_ops = handle->bank_ops;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 183/565 drm/amd/display: add more cyan skillfish devices
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
[ Upstream commit 3cf06bd4cf2512d564fdb451b07de0cebe7b138d ]
Add PCI IDs to support display probe for cyan skillfish family of SOCs.
--- drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 8 +++++++- drivers/gpu/drm/amd/display/include/dal_asic_id.h | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/core/dc_resource.c +7 -1
@@ -164,7 +164,13 @@ enum dce_version resource_parse_asic_id(struct hw_asic_id asic_id)case FAMILY_NV : dc_version =DCN_VERSION_2_0 ; -if (asic_id.chip_id ==DEVICE_ID_NV_13FE || asic_id.chip_id ==DEVICE_ID_NV_143F ) { +if (asic_id.chip_id ==DEVICE_ID_NV_13FE || + asic_id.chip_id ==DEVICE_ID_NV_143F || + asic_id.chip_id ==DEVICE_ID_NV_13F9 || + asic_id.chip_id ==DEVICE_ID_NV_13FA || + asic_id.chip_id ==DEVICE_ID_NV_13FB || + asic_id.chip_id ==DEVICE_ID_NV_13FC || + asic_id.chip_id ==DEVICE_ID_NV_13DB ) { dc_version =DCN_VERSION_2_01 ;break ; }
drivers/gpu/drm/amd/display/include/dal_asic_id.h +5 -0
@@ -213,6 +213,11 @@ enum {#endif #define DEVICE_ID_NV_13FE 0x13FE // CYAN_SKILLFISH#define DEVICE_ID_NV_143F 0x143F +#define DEVICE_ID_NV_13F9 0x13F9 +#define DEVICE_ID_NV_13FA 0x13FA +#define DEVICE_ID_NV_13FB 0x13FB +#define DEVICE_ID_NV_13FC 0x13FC +#define DEVICE_ID_NV_13DB 0x13DB#define FAMILY_VGH 144#define DEVICE_ID_VGH_163F 0x163F#define DEVICE_ID_VGH_1435 0x1435
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 184/565 drm/amd/display: update dpp/disp clock from smu clock table
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Hsieh <[email protected]>
[ Upstream commit 2e72fdba8a32ce062a86571edff4592710c26215 ]
[Why]
The reason some high-resolution monitors fail to display properly is that this platform does not support sufficiently high DPP and DISP clock frequencies
[How]
Update DISP and DPP clocks from the smu clock table then DML can filter these mode if not support.
--- .../display/dc/clk_mgr/dcn301/vg_clk_mgr.c | 16 +++++++++++++++ .../amd/display/dc/dml/dcn301/dcn301_fpu.c | 20 ++++++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn301/vg_clk_mgr.c +16 -0
@@ -563,6 +563,7 @@ static void vg_clk_mgr_helper_populate_bw_params( {int i, j;struct clk_bw_params *bw_params = clk_mgr->base.bw_params; +uint32_t max_dispclk =0 , max_dppclk =0 ; j =-1 ;
@@ -584,6 +585,15 @@ static void vg_clk_mgr_helper_populate_bw_params(return ; } +/* dispclk and dppclk can be max at any voltage, same number of levels for both */ +if (clock_table->NumDispClkLevelsEnabled <=VG_NUM_DISPCLK_DPM_LEVELS && + clock_table->NumDispClkLevelsEnabled <=VG_NUM_DPPCLK_DPM_LEVELS ) { + max_dispclk =find_max_clk_value (clock_table->DispClocks, clock_table->NumDispClkLevelsEnabled); + max_dppclk =find_max_clk_value (clock_table->DppClocks, clock_table->NumDispClkLevelsEnabled); + }else { +ASSERT (0 ); + } + bw_params->clk_table.num_entries = j +1 ;for (i =0 ; i < bw_params->clk_table.num_entries -1 ; i++, j--) {
@@ -591,11 +601,17 @@ static void vg_clk_mgr_helper_populate_bw_params( bw_params->clk_table.entries[i].memclk_mhz = clock_table->DfPstateTable[j].memclk; bw_params->clk_table.entries[i].voltage = clock_table->DfPstateTable[j].voltage; bw_params->clk_table.entries[i].dcfclk_mhz =find_dcfclk_for_voltage (clock_table, clock_table->DfPstateTable[j].voltage); + +/* Now update clocks we do read */ + bw_params->clk_table.entries[i].dispclk_mhz = max_dispclk; + bw_params->clk_table.entries[i].dppclk_mhz = max_dppclk; } bw_params->clk_table.entries[i].fclk_mhz = clock_table->DfPstateTable[j].fclk; bw_params->clk_table.entries[i].memclk_mhz = clock_table->DfPstateTable[j].memclk; bw_params->clk_table.entries[i].voltage = clock_table->DfPstateTable[j].voltage; bw_params->clk_table.entries[i].dcfclk_mhz =find_max_clk_value (clock_table->DcfClocks,VG_NUM_DCFCLK_DPM_LEVELS ); + bw_params->clk_table.entries[i].dispclk_mhz =find_max_clk_value (clock_table->DispClocks,VG_NUM_DISPCLK_DPM_LEVELS ); + bw_params->clk_table.entries[i].dppclk_mhz =find_max_clk_value (clock_table->DppClocks,VG_NUM_DPPCLK_DPM_LEVELS ); bw_params->vram_type = bios_info->memory_type; bw_params->num_channels = bios_info->ma_channel_number;
drivers/gpu/drm/amd/display/dc/dml/dcn301/dcn301_fpu.c +17 -3
@@ -326,7 +326,7 @@ void dcn301_fpu_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_pstruct dcn301_resource_pool *pool =TO_DCN301_RES_POOL (dc->res_pool);struct clk_limit_table *clk_table = &bw_params->clk_table;unsigned int i, closest_clk_lvl; -int j; +int j =0 , max_dispclk_mhz =0 , max_dppclk_mhz =0 ;dc_assert_fp_enabled ();
@@ -338,6 +338,15 @@ void dcn301_fpu_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_p dcn3_01_soc.num_chans = bw_params->num_channels;ASSERT (clk_table->num_entries); + +/* Prepass to find max clocks independent of voltage level. */ +for (i =0 ; i < clk_table->num_entries; ++i) { +if (clk_table->entries[i].dispclk_mhz > max_dispclk_mhz) + max_dispclk_mhz = clk_table->entries[i].dispclk_mhz; +if (clk_table->entries[i].dppclk_mhz > max_dppclk_mhz) + max_dppclk_mhz = clk_table->entries[i].dppclk_mhz; + } +for (i =0 ; i < clk_table->num_entries; i++) {/* loop backwards*/ for (closest_clk_lvl =0 , j = dcn3_01_soc.num_states -1 ; j >=0 ; j--) {
@@ -353,8 +362,13 @@ void dcn301_fpu_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_p s[i].socclk_mhz = clk_table->entries[i].socclk_mhz; s[i].dram_speed_mts = clk_table->entries[i].memclk_mhz *2 ; - s[i].dispclk_mhz = dcn3_01_soc.clock_limits[closest_clk_lvl].dispclk_mhz; - s[i].dppclk_mhz = dcn3_01_soc.clock_limits[closest_clk_lvl].dppclk_mhz; +/* Clocks independent of voltage level. */ + s[i].dispclk_mhz = max_dispclk_mhz ? max_dispclk_mhz : + dcn3_01_soc.clock_limits[closest_clk_lvl].dispclk_mhz; + + s[i].dppclk_mhz = max_dppclk_mhz ? max_dppclk_mhz : + dcn3_01_soc.clock_limits[closest_clk_lvl].dppclk_mhz; + s[i].dram_bw_per_chan_gbps = dcn3_01_soc.clock_limits[closest_clk_lvl].dram_bw_per_chan_gbps; s[i].dscclk_mhz = dcn3_01_soc.clock_limits[closest_clk_lvl].dscclk_mhz;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 185/565 drm/amd/pm: Use cached metrics data on aldebaran
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lijo Lazar <[email protected]>
[ Upstream commit e87577ef6daa0cfb10ca139c720f0c57bd894174 ]
Cached metrics data validity is 1ms on aldebaran. It's not reasonable for any client to query gpu_metrics at a faster rate and constantly interrupt PMFW.
--- drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c +1 -1
@@ -1716,7 +1716,7 @@ static ssize_t aldebaran_get_gpu_metrics(struct smu_context *smu, ret =smu_cmn_get_metrics_table (smu, &metrics, - true); + false);if (ret)return ret;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 186/565 drm/amd/pm: Use cached metrics data on arcturus
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lijo Lazar <[email protected]>
[ Upstream commit 2f3b1ccf83be83a3330e38194ddfd1a91fec69be ]
Cached metrics data validity is 1ms on arcturus. It's not reasonable for any client to query gpu_metrics at a faster rate and constantly interrupt PMFW.
--- drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c +1 -1
@@ -2326,7 +2326,7 @@ static ssize_t arcturus_get_gpu_metrics(struct smu_context *smu, ret =smu_cmn_get_metrics_table (smu, &metrics, - true); + false);if (ret)return ret;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 187/565 drm/amdgpu/jpeg: Hold pg_lock before jpeg poweroff
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sathishkumar S <[email protected]>
[ Upstream commit 0e7581eda8c76d1ca4cf519631a4d4eb9f82b94c ]
Acquire jpeg_pg_lock before changes to jpeg power state and release it after power off from idle work handler.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c +4 -2
@@ -117,10 +117,12 @@ static void amdgpu_jpeg_idle_work_handler(struct work_struct *work) fences +=amdgpu_fence_count_emitted (&adev->jpeg.inst[i].ring_dec[j]); } -if (!fences && !atomic_read (&adev->jpeg.total_submission_cnt)) +if (!fences && !atomic_read (&adev->jpeg.total_submission_cnt)) { +mutex_lock (&adev->jpeg.jpeg_pg_lock);amdgpu_device_ip_set_powergating_state (adev,AMD_IP_BLOCK_TYPE_JPEG ,AMD_PG_STATE_GATE ); -else +mutex_unlock (&adev->jpeg.jpeg_pg_lock); + }else schedule_delayed_work (&adev->jpeg.idle_work,JPEG_IDLE_TIMEOUT ); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 188/565 drm/nouveau: replace snprintf() with scnprintf() in nvkm_snprintbf()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Seyediman Seyedarab <[email protected]>
[ Upstream commit 6510b62fe9303aaf48ff136ff69186bcfc32172d ]
snprintf() returns the number of characters that *would* have been written, which can overestimate how much you actually wrote to the buffer in case of truncation. That leads to 'data += this' advancing the pointer past the end of the buffer and size going negative.
Switching to scnprintf() prevents potential buffer overflows and ensures consistent behavior when building the output string.
--- drivers/gpu/drm/nouveau/nvkm/core/enum.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/nouveau/nvkm/core/enum.c +1 -1
@@ -44,7 +44,7 @@ nvkm_snprintbf(char *data, int size, const struct nvkm_bitfield *bf, u32 value)bool space = false;while (size >=1 && bf->name) {if (value & bf->mask) { -int this =snprintf (data, size,"%s%s" , +int this =scnprintf (data, size,"%s%s" , space ?" " :"" , bf->name); size -= this; data += this;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 189/565 ASoC: mediatek: Use SND_JACK_AVOUT for HDMI/DP jacks
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Terry Cheong <[email protected]>
[ Upstream commit 8ed2dca4df2297177e0edcb7e0c72ef87f3fd81a ]
The SND_JACK_AVOUT is a more specific jack type for HDMI and DisplayPort. Updatae the MediaTek drivers to use such jack type, allowing system to determine the device type based on jack event.
--- sound/soc/mediatek/mt8173/mt8173-rt5650.c | 2 +- sound/soc/mediatek/mt8183/mt8183-da7219-max98357.c | 2 +- .../soc/mediatek/mt8183/mt8183-mt6358-ts3a227-max98357.c | 2 +- sound/soc/mediatek/mt8186/mt8186-mt6366.c | 2 +- sound/soc/mediatek/mt8188/mt8188-mt6359.c | 8 ++++---- sound/soc/mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c | 2 +- sound/soc/mediatek/mt8195/mt8195-mt6359.c | 4 ++-- 7 files changed, 11 insertions(+), 11 deletions(-)
sound/soc/mediatek/mt8173/mt8173-rt5650.c +1 -1
@@ -159,7 +159,7 @@ static int mt8173_rt5650_hdmi_init(struct snd_soc_pcm_runtime *rtd) {int ret; - ret =snd_soc_card_jack_new (rtd->card,"HDMI Jack" ,SND_JACK_LINEOUT , + ret =snd_soc_card_jack_new (rtd->card,"HDMI Jack" ,SND_JACK_AVOUT , &mt8173_rt5650_hdmi_jack);if (ret)return ret;
sound/soc/mediatek/mt8183/mt8183-da7219-max98357.c +1 -1
@@ -378,7 +378,7 @@ static int mt8183_da7219_max98357_hdmi_init(struct snd_soc_pcm_runtime *rtd)snd_soc_card_get_drvdata (rtd->card);int ret; - ret =snd_soc_card_jack_new (rtd->card,"HDMI Jack" ,SND_JACK_LINEOUT , + ret =snd_soc_card_jack_new (rtd->card,"HDMI Jack" ,SND_JACK_AVOUT , &priv->hdmi_jack);if (ret)return ret;
sound/soc/mediatek/mt8183/mt8183-mt6358-ts3a227-max98357.c +1 -1
@@ -383,7 +383,7 @@ mt8183_mt6358_ts3a227_max98357_hdmi_init(struct snd_soc_pcm_runtime *rtd)snd_soc_card_get_drvdata (rtd->card);int ret; - ret =snd_soc_card_jack_new (rtd->card,"HDMI Jack" ,SND_JACK_LINEOUT , + ret =snd_soc_card_jack_new (rtd->card,"HDMI Jack" ,SND_JACK_AVOUT , &priv->hdmi_jack);if (ret)return ret;
sound/soc/mediatek/mt8186/mt8186-mt6366.c +1 -1
@@ -362,7 +362,7 @@ static int mt8186_mt6366_rt1019_rt5682s_hdmi_init(struct snd_soc_pcm_runtime *rtreturn ret; } - ret =snd_soc_card_jack_new (rtd->card,"HDMI Jack" ,SND_JACK_LINEOUT , jack); + ret =snd_soc_card_jack_new (rtd->card,"HDMI Jack" ,SND_JACK_AVOUT , jack);if (ret) {dev_err (rtd->dev,"HDMI Jack creation failed: %d\n" , ret);return ret;
sound/soc/mediatek/mt8188/mt8188-mt6359.c +4 -4
@@ -244,14 +244,14 @@ enum mt8188_jacks {static struct snd_soc_jack_pin mt8188_hdmi_jack_pins[] = { { .pin ="HDMI" , - .mask =SND_JACK_LINEOUT , + .mask =SND_JACK_AVOUT , }, };static struct snd_soc_jack_pin mt8188_dp_jack_pins[] = { { .pin ="DP" , - .mask =SND_JACK_LINEOUT , + .mask =SND_JACK_AVOUT , }, };
@@ -588,7 +588,7 @@ static int mt8188_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd)int ret =0 ; ret =snd_soc_card_jack_new_pins (rtd->card,"HDMI Jack" , -SND_JACK_LINEOUT , jack, +SND_JACK_AVOUT , jack, mt8188_hdmi_jack_pins,ARRAY_SIZE (mt8188_hdmi_jack_pins));if (ret) {
@@ -613,7 +613,7 @@ static int mt8188_dptx_codec_init(struct snd_soc_pcm_runtime *rtd)struct snd_soc_component *component =snd_soc_rtd_to_codec (rtd,0 )->component;int ret =0 ; - ret =snd_soc_card_jack_new_pins (rtd->card,"DP Jack" ,SND_JACK_LINEOUT , + ret =snd_soc_card_jack_new_pins (rtd->card,"DP Jack" ,SND_JACK_AVOUT , jack, mt8188_dp_jack_pins,ARRAY_SIZE (mt8188_dp_jack_pins));if (ret) {
sound/soc/mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c +1 -1
@@ -368,7 +368,7 @@ static int mt8192_mt6359_hdmi_init(struct snd_soc_pcm_runtime *rtd)snd_soc_rtd_to_codec (rtd,0 )->component;int ret; - ret =snd_soc_card_jack_new (rtd->card,"HDMI Jack" ,SND_JACK_LINEOUT , jack); + ret =snd_soc_card_jack_new (rtd->card,"HDMI Jack" ,SND_JACK_AVOUT , jack);if (ret) {dev_err (rtd->dev,"HDMI Jack creation failed: %d\n" , ret);return ret;
sound/soc/mediatek/mt8195/mt8195-mt6359.c +2 -2
@@ -357,7 +357,7 @@ static int mt8195_dptx_codec_init(struct snd_soc_pcm_runtime *rtd)snd_soc_rtd_to_codec (rtd,0 )->component;int ret; - ret =snd_soc_card_jack_new (rtd->card,"DP Jack" ,SND_JACK_LINEOUT , jack); + ret =snd_soc_card_jack_new (rtd->card,"DP Jack" ,SND_JACK_AVOUT , jack);if (ret)return ret;
@@ -372,7 +372,7 @@ static int mt8195_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd)snd_soc_rtd_to_codec (rtd,0 )->component;int ret; - ret =snd_soc_card_jack_new (rtd->card,"HDMI Jack" ,SND_JACK_LINEOUT , jack); + ret =snd_soc_card_jack_new (rtd->card,"HDMI Jack" ,SND_JACK_AVOUT , jack);if (ret)return ret;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 190/565 drm/amd/display: Reset apply_eamless_boot_optimization when dpms_off
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Danny Wang <[email protected]>
[ Upstream commit ad335b5fc9ed1cdeb33fbe97d2969b3a2eedaf3e ]
[WHY&HOW]
The user closed the lid while the system was powering on and opened it again before the “apply_seamless_boot_optimization” was set to false, resulting in the eDP remaining blank.
Reset the “apply_seamless_boot_optimization” to false when dpms off.
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +1 -1
@@ -3132,7 +3132,7 @@ static void update_seamless_boot_flags(struct dc *dc, int surface_count, struct dc_stream_state *stream) { - if (get_seamless_boot_stream_count(context) > 0 && surface_count > 0) { + if (get_seamless_boot_stream_count(context) > 0 && (surface_count > 0 || stream->dpms_off)) {/* Optimize seamless boot flag keeps clocks and watermarks high until * first flip. After first flip, optimization is required to lower * bandwidth. Important to note that it is expected UEFI will
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 191/565 drm/amd/display: Wait until OTG enable state is cleared
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: TungYu Lu <[email protected]>
[ Upstream commit e7496c15d830689cc4fc666b976c845ed2c5ed28 ]
[Why]
Customer reported an issue that OS starts and stops device multiple times during driver installation. Frequently disabling and enabling OTG may prevent OTG from being safely disabled and cause incorrect configuration upon the next enablement.
[How]
Add a wait until OTG_CURRENT_MASTER_EN_STATE is cleared as a short term solution.
--- drivers/gpu/drm/amd/display/dc/optc/dcn401/dcn401_optc.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/gpu/drm/amd/display/dc/optc/dcn401/dcn401_optc.c +5 -0
@@ -226,6 +226,11 @@ static bool optc401_disable_crtc(struct timing_generator *optc)REG_UPDATE (CONTROL ,VTG0_ENABLE ,0 ); +// wait until CRTC_CURRENT_MASTER_EN_STATE == 0 +REG_WAIT (OTG_CONTROL , +OTG_CURRENT_MASTER_EN_STATE , +0 ,10 ,15000 ); +/* CRTC disabled, so disable clock. */ REG_WAIT(OTG_CLOCK_CONTROL, OTG_BUSY, 0,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 192/565 PCI: Disable MSI on RDC PCI to PCIe bridges
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcos Del Sol Vives <[email protected]>
[ Upstream commit ebc7086b39e5e4f3d3ca82caaea20538c9b62d42 ]
RDC PCI to PCIe bridges, present on Vortex86DX3 and Vortex86EX2 SoCs, do not support MSIs. If enabled, interrupts generated by PCIe devices never reach the processor.
I have contacted the manufacturer (DM&P) and they confirmed that PCI MSIs need to be disabled for them.
--- drivers/pci/quirks.c | 1 + 1 file changed, 1 insertion(+)
drivers/pci/quirks.c +1 -0
@@ -2719,6 +2719,7 @@ static void quirk_disable_msi(struct pci_dev *dev)DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_AMD ,PCI_DEVICE_ID_AMD_8131_BRIDGE , quirk_disable_msi);DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_VIA ,0xa238 , quirk_disable_msi);DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_ATI ,0x5a3f , quirk_disable_msi); +DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_RDC ,0x1031 , quirk_disable_msi);/* * The APC bridge device in AMD 780 family northbridges has some random
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 193/565 selftests/net: Replace non-standard __WORDSIZE with sizeof(long) * 8
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wake Liu <[email protected]>
[ Upstream commit c36748e8733ef9c5f4cd1d7c4327994e5b88b8df ]
The __WORDSIZE macro, defined in the non-standard <bits/wordsize.h> header, is a GNU extension and not universally available with all toolchains, such as Clang when used with musl libc.
This can lead to build failures in environments where this header is missing.
The intention of the code is to determine the bit width of a C long. Replace the non-portable __WORDSIZE with the standard and portable sizeof(long) * 8 expression to achieve the same result.
This change also removes the inclusion of the now-unused <bits/wordsize.h> header.
--- tools/testing/selftests/net/psock_tpacket.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
tools/testing/selftests/net/psock_tpacket.c +1 -2
@@ -33,7 +33,6 @@#include <ctype.h> #include <fcntl.h> #include <unistd.h> -#include <bits/wordsize.h> #include <net/ethernet.h> #include <netinet/ip.h> #include <arpa/inet.h>
@@ -785,7 +784,7 @@ static int test_kernel_bit_width(void)static int test_user_bit_width (void ) { -return __WORDSIZE; +return sizeof (long ) *8 ; }static const char *tpacket_str[] = {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 194/565 selftests/net: Ensure assert() triggers in psock_tpacket.c
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wake Liu <[email protected]>
[ Upstream commit bc4c0a48bdad7f225740b8e750fdc1da6d85e1eb ]
The get_next_frame() function in psock_tpacket.c was missing a return statement in its default switch case, leading to a compiler warning.
This was caused by a bug_on(1) call, which is defined as an assert(), being compiled out because NDEBUG is defined during the build.
Instead of adding a return NULL; which would silently hide the error and could lead to crashes later, this change restores the original author's intent. By adding #undef NDEBUG before including <assert.h>, we ensure the assertion is active and will cause the test to abort if this unreachable code is ever executed.
--- tools/testing/selftests/net/psock_tpacket.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/net/psock_tpacket.c +1 -0
@@ -22,6 +22,7 @@* - TPACKET_V3: RX_RING */ +#undef NDEBUG#include <stdio.h> #include <stdlib.h> #include <sys/types.h>
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 195/565 wifi: rtw89: print just once for unknown C2H events
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ping-Ke Shih <[email protected]>
[ Upstream commit 7e1c44fe4c2e1e01fa47d9490893d95309a99687 ]
When driver receives new or unknown C2H events, it print out messages repeatedly once events are received, like
rtw89_8922ae 0000:81:00.0: PHY c2h class 2 not support
To avoid the thousands of messages, use rtw89_info_once() instead. Also, print out class/func for unknown (undefined) class.
--- drivers/net/wireless/realtek/rtw89/debug.h | 1 + drivers/net/wireless/realtek/rtw89/mac.c | 7 +++---- drivers/net/wireless/realtek/rtw89/phy.c | 7 +++---- 3 files changed, 7 insertions(+), 8 deletions(-)
drivers/net/wireless/realtek/rtw89/debug.h +1 -0
@@ -56,6 +56,7 @@ static inline void rtw89_debugfs_deinit(struct rtw89_dev *rtwdev) {}#endif #define rtw89_info(rtwdev, a...) dev_info((rtwdev)->dev, ##a) +#define rtw89_info_once(rtwdev, a...) dev_info_once((rtwdev)->dev, ##a) #define rtw89_warn(rtwdev, a...) dev_warn((rtwdev)->dev, ##a) #define rtw89_err(rtwdev, a...) dev_err((rtwdev)->dev, ##a)
drivers/net/wireless/realtek/rtw89/mac.c +3 -4
@@ -5532,12 +5532,11 @@ void rtw89_mac_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb,case RTW89_MAC_C2H_CLASS_FWDBG :return ;default : -rtw89_info (rtwdev,"MAC c2h class %d not support\n" , class); -return ; +break ; }if (!handler) { -rtw89_info (rtwdev,"MAC c2h class %d func %d not support\n" , class, - func); +rtw89_info_once (rtwdev,"MAC c2h class %d func %d not support\n" , + class, func);return ; }handler (rtwdev, skb, len);
drivers/net/wireless/realtek/rtw89/phy.c +3 -4
@@ -3125,12 +3125,11 @@ void rtw89_phy_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb,return ; fallthrough;default : -rtw89_info (rtwdev,"PHY c2h class %d not support\n" , class); -return ; +break ; }if (!handler) { -rtw89_info (rtwdev,"PHY c2h class %d func %d not support\n" , class, - func); +rtw89_info_once (rtwdev,"PHY c2h class %d func %d not support\n" , + class, func);return ; }handler (rtwdev, skb, len);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 196/565 wifi: rtw88: sdio: use indirect IO for device registers before power-on
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ping-Ke Shih <[email protected]>
[ Upstream commit 58de1f91e033b1fface8d8948984583125f93736 ]
The register REG_SYS_CFG1 is used to determine chip basic information as arguments of following flows, such as download firmware and load PHY parameters, so driver read the value early (before power-on).
However, the direct IO is disallowed before power-on, or it causes wrong values, which driver recognizes a chip as a wrong type RF_1T1R, but actually RF_2T2R, causing driver warns:
rtw88_8822cs mmc1:0001:1: unsupported rf path (1)
Fix it by using indirect IO before power-on.
--- drivers/net/wireless/realtek/rtw88/sdio.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/wireless/realtek/rtw88/sdio.c +4 -0
@@ -144,6 +144,10 @@ static u32 rtw_sdio_to_io_address(struct rtw_dev *rtwdev, u32 addr,static bool rtw_sdio_use_direct_io (struct rtw_dev *rtwdev,u32 addr) { +if (!test_bit (RTW_FLAG_POWERON , rtwdev->flags) && + !rtw_sdio_is_bus_addr (addr)) +return false; +return !rtw_sdio_is_sdio30_supported (rtwdev) ||rtw_sdio_is_bus_addr (addr); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 197/565 drm/amdkfd: return -ENOTTY for unsupported IOCTLs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey McRae <[email protected]>
[ Upstream commit 57af162bfc8c05332a28c4d458d246cc46d2746d ]
Some kfd ioctls may not be available depending on the kernel version the user is running, as such we need to report -ENOTTY so userland can determine the cause of the ioctl failure.
--- drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +6 -2
@@ -3253,8 +3253,10 @@ static long kfd_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)int retcode = -EINVAL ;bool ptrace_attached = false; -if (nr >=AMDKFD_CORE_IOCTL_COUNT ) +if (nr >=AMDKFD_CORE_IOCTL_COUNT ) { + retcode = -ENOTTY ; goto err_i1; + }if ((nr >=AMDKFD_COMMAND_START ) && (nr <AMDKFD_COMMAND_END )) {u32 amdkfd_size;
@@ -3267,8 +3269,10 @@ static long kfd_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) asize = amdkfd_size; cmd = ioctl->cmd; - }else + }else { + retcode = -ENOTTY ; goto err_i1; + }dev_dbg (kfd_device,"ioctl cmd 0x%x (#0x%x), arg 0x%lx\n" , cmd, nr, arg);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 198/565 media: pci: ivtv: Dont create fake v4l2_fh
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Laurent Pinchart <[email protected]>
[ Upstream commit cc6e8d1ccea792d8550428e0831e3a35b0ccfddc ]
The ivtv driver has a structure named ivtv_open_id that models an open file handle for the device. It embeds a v4l2_fh instance for file handles that correspond to a V4L2 video device, and stores a pointer to that v4l2_fh in struct ivtv_stream to identify which open file handle owns a particular stream.
In addition to video devices, streams can be owned by ALSA PCM devices. Those devices do not make use of the v4l2_fh instance for obvious reasons, but the snd_ivtv_pcm_capture_open() function still initializes a "fake" v4l2_fh for the sole purpose of using it as an open file handle identifier. The v4l2_fh is not properly destroyed when the ALSA PCM device is closed, leading to possible resource leaks.
Fortunately, the v4l2_fh instance pointed to by ivtv_stream is not accessed, only the pointer value is used for comparison. Replace it with a pointer to the ivtv_open_id structure that embeds the v4l2_fh, and don't initialize the v4l2_fh for ALSA PCM devices.
--- drivers/media/pci/ivtv/ivtv-alsa-pcm.c | 2 -- drivers/media/pci/ivtv/ivtv-driver.h | 3 ++- drivers/media/pci/ivtv/ivtv-fileops.c | 18 +++++++++--------- drivers/media/pci/ivtv/ivtv-irq.c | 4 ++-- 4 files changed, 13 insertions(+), 14 deletions(-)
drivers/media/pci/ivtv/ivtv-alsa-pcm.c +0 -2
@@ -148,14 +148,12 @@ static int snd_ivtv_pcm_capture_open(struct snd_pcm_substream *substream) s = &itv->streams[IVTV_ENC_STREAM_TYPE_PCM ]; -v4l2_fh_init (&item.fh, &s->vdev); item.itv = itv; item.type = s->type;/* See if the stream is available */ if (ivtv_claim_stream (&item, item.type)) {/* No, it's already in use */ -v4l2_fh_exit (&item.fh);snd_ivtv_unlock (itvsc);return -EBUSY ; }
drivers/media/pci/ivtv/ivtv-driver.h +2 -1
@@ -322,6 +322,7 @@ struct ivtv_queue { };struct ivtv ;/* forward reference */ +struct ivtv_open_id ;struct ivtv_stream {/* These first four fields are always set, even if the stream
@@ -331,7 +332,7 @@ struct ivtv_stream {const char *name;/* name of the stream */ int type;/* stream type */ -struct v4l2_fh *fh;/* pointer to the streaming filehandle */ +struct ivtv_open_id *id;/* pointer to the streaming ivtv_open_id */ spinlock_t qlock;/* locks access to the queues */ unsigned long s_flags;/* status flags, see above */ int dma;/* can be PCI_DMA_TODEVICE, PCI_DMA_FROMDEVICE or PCI_DMA_NONE */
drivers/media/pci/ivtv/ivtv-fileops.c +9 -9
@@ -39,16 +39,16 @@ int ivtv_claim_stream(struct ivtv_open_id *id, int type)if (test_and_set_bit (IVTV_F_S_CLAIMED , &s->s_flags)) {/* someone already claimed this stream */ -if (s->fh == &id->fh) { +if (s->id == id) {/* yes, this file descriptor did. So that's OK. */ return 0 ; } -if (s->fh ==NULL && (type ==IVTV_DEC_STREAM_TYPE_VBI || +if (s->id ==NULL && (type ==IVTV_DEC_STREAM_TYPE_VBI || type ==IVTV_ENC_STREAM_TYPE_VBI )) {/* VBI is handled already internally, now also assign the file descriptor to this stream for external reading of the stream. */ - s->fh = &id->fh; + s->id = id;IVTV_DEBUG_INFO ("Start Read VBI\n" );return 0 ; }
@@ -56,7 +56,7 @@ int ivtv_claim_stream(struct ivtv_open_id *id, int type)IVTV_DEBUG_INFO ("Stream %d is busy\n" , type);return -EBUSY ; } - s->fh = &id->fh; + s->id = id;if (type ==IVTV_DEC_STREAM_TYPE_VBI ) {/* Enable reinsertion interrupt */ ivtv_clear_irq_mask (itv,IVTV_IRQ_DEC_VBI_RE_INSERT );
@@ -94,7 +94,7 @@ void ivtv_release_stream(struct ivtv_stream *s)struct ivtv *itv = s->itv;struct ivtv_stream *s_vbi; - s->fh =NULL ; + s->id =NULL ;if ((s->type ==IVTV_DEC_STREAM_TYPE_VBI || s->type ==IVTV_ENC_STREAM_TYPE_VBI ) &&test_bit (IVTV_F_S_INTERNAL_USE , &s->s_flags)) {/* this stream is still in use internally */
@@ -126,7 +126,7 @@ void ivtv_release_stream(struct ivtv_stream *s)/* was already cleared */ return ; } -if (s_vbi->fh) { +if (s_vbi->id) {/* VBI stream still claimed by a file descriptor */ return ; }
@@ -359,7 +359,7 @@ static ssize_t ivtv_read(struct ivtv_stream *s, char __user *ubuf, size_t tot_cosize_t tot_written =0 ;int single_frame =0 ; -if (atomic_read (&itv->capturing) ==0 && s->fh ==NULL ) { +if (atomic_read (&itv->capturing) ==0 && s->id ==NULL ) {/* shouldn't happen */ IVTV_DEBUG_WARN ("Stream %s not initialized before read\n" , s->name);return -EIO ;
@@ -831,7 +831,7 @@ void ivtv_stop_capture(struct ivtv_open_id *id, int gop_end) id->type == IVTV_ENC_STREAM_TYPE_VBI) && test_bit(IVTV_F_S_INTERNAL_USE, &s->s_flags)) { /* Also used internally, don't stop capturing */ - s->fh = NULL; + s->id = NULL; } else {ivtv_stop_v4l2_encode_stream (s, gop_end);
@@ -915,7 +915,7 @@ int ivtv_v4l2_close(struct file *filp)v4l2_fh_exit (fh);/* Easy case first: this stream was never claimed by us */ -if (s->fh != &id->fh) +if (s->id != id) goto close_done;/* 'Unclaim' this stream */
drivers/media/pci/ivtv/ivtv-irq.c +2 -2
@@ -305,7 +305,7 @@ static void dma_post(struct ivtv_stream *s)ivtv_process_vbi_data (itv, buf,0 , s->type); s->q_dma.bytesused += buf->bytesused; } -if (s->fh ==NULL ) { +if (s->id ==NULL ) {ivtv_queue_move (s, &s->q_dma,NULL , &s->q_free,0 );return ; }
@@ -330,7 +330,7 @@ static void dma_post(struct ivtv_stream *s)set_bit (IVTV_F_I_HAVE_WORK , &itv->i_flags); } -if (s->fh) +if (s->id)wake_up (&s->waitq); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 199/565 media: amphion: Delete v4l2_fh synchronously in .release()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Laurent Pinchart <[email protected]>
[ Upstream commit 19fb9c5b815f70eb90d5b545f65b83bc9c490ecd ]
The v4l2_fh initialized and added in vpu_v4l2_open() is delete and cleaned up when the last reference to the vpu_inst is released. This may happen later than at vpu_v4l2_close() time.
Not deleting and cleaning up the v4l2_fh when closing the file handle to the video device is not ideal, as the v4l2_fh will still be present in the video device's fh_list, and will store a copy of events queued to the video device. There may also be other side effects of keeping alive an object that represents an open file handle after the file handle is closed.
The v4l2_fh instance is embedded in the vpu_inst structure, and is accessed in two different ways:
- in vpu_notify_eos() and vpu_notify_source_change(), to queue V4L2 events to the file handle ; and
- through the driver to access the v4l2_fh.m2m_ctx pointer.
The v4l2_fh.m2m_ctx pointer is not touched by v4l2_fh_del() and v4l2_fh_exit(). It is set to NULL by the driver when closing the file handle, in vpu_v4l2_close().
The vpu_notify_eos() and vpu_notify_source_change() functions are called in vpu_set_last_buffer_dequeued() and vdec_handle_resolution_change() respectively, only if the v4l2_fh.m2m_ctx pointer is not NULL. There is therefore a guarantee that no new event will be queued to the v4l2_fh after vpu_v4l2_close() destroys the m2m_ctx.
The vpu_notify_eos() function is also called from vpu_vb2_buf_finish(), which is guaranteed to be called for all queued buffers when vpu_v4l2_close() calls v4l2_m2m_ctx_release(), and will not be called later.
It is therefore safe to assume that the driver will not touch the v4l2_fh, except to check the m2m_ctx pointer, after vpu_v4l2_close() destroys the m2m_ctx. We can safely delete and cleanup the v4l2_fh synchronously in vpu_v4l2_close().
--- drivers/media/platform/amphion/vpu_v4l2.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/media/platform/amphion/vpu_v4l2.c +5 -2
@@ -709,8 +709,6 @@ static int vpu_v4l2_release(struct vpu_inst *inst)v4l2_ctrl_handler_free (&inst->ctrl_handler);mutex_destroy (&inst->lock); -v4l2_fh_del (&inst->fh); -v4l2_fh_exit (&inst->fh);call_void_vop (inst, cleanup);
@@ -779,6 +777,8 @@ int vpu_v4l2_open(struct file *file, struct vpu_inst *inst)return 0 ; error: +v4l2_fh_del (&inst->fh); +v4l2_fh_exit (&inst->fh);vpu_inst_put (inst);return ret; }
@@ -798,6 +798,9 @@ int vpu_v4l2_close(struct file *file)call_void_vop (inst, release);vpu_inst_unlock (inst); +v4l2_fh_del (&inst->fh); +v4l2_fh_exit (&inst->fh); +vpu_inst_unregister (inst);vpu_inst_put (inst);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 200/565 drm/tidss: Use the crtc_* timings when programming the HW
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 478306edc23eec4f0ec24a46222485910c66212d ]
Use the crtc_* fields from drm_display_mode, instead of the "logical" fields. This shouldn't change anything in practice, but afaiu the crtc_* fields are the correct ones to use here.
--- drivers/gpu/drm/tidss/tidss_crtc.c | 2 +- drivers/gpu/drm/tidss/tidss_dispc.c | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-)
drivers/gpu/drm/tidss/tidss_crtc.c +1 -1
@@ -225,7 +225,7 @@ static void tidss_crtc_atomic_enable(struct drm_crtc *crtc,tidss_runtime_get (tidss); r =dispc_vp_set_clk_rate (tidss->dispc, tcrtc->hw_videoport, - mode->clock *1000 ); + mode->crtc_clock *1000 );if (r !=0 )return ;
drivers/gpu/drm/tidss/tidss_dispc.c +8 -8
@@ -1086,13 +1086,13 @@ void dispc_vp_enable(struct dispc_device *dispc, u32 hw_videoport,dispc_set_num_datalines (dispc, hw_videoport, fmt->data_width); - hfp = mode->hsync_start - mode->hdisplay; - hsw = mode->hsync_end - mode->hsync_start; - hbp = mode->htotal - mode->hsync_end; + hfp = mode->crtc_hsync_start - mode->crtc_hdisplay; + hsw = mode->crtc_hsync_end - mode->crtc_hsync_start; + hbp = mode->crtc_htotal - mode->crtc_hsync_end; - vfp = mode->vsync_start - mode->vdisplay; - vsw = mode->vsync_end - mode->vsync_start; - vbp = mode->vtotal - mode->vsync_end; + vfp = mode->crtc_vsync_start - mode->crtc_vdisplay; + vsw = mode->crtc_vsync_end - mode->crtc_vsync_start; + vbp = mode->crtc_vtotal - mode->crtc_vsync_end; dispc_vp_write(dispc, hw_videoport, DISPC_VP_TIMING_H, FLD_VAL(hsw - 1, 7, 0) |
@@ -1134,8 +1134,8 @@ void dispc_vp_enable(struct dispc_device *dispc, u32 hw_videoport, FLD_VAL(ivs, 12, 12));dispc_vp_write (dispc, hw_videoport,DISPC_VP_SIZE_SCREEN , -FLD_VAL (mode->hdisplay -1 ,11 ,0 ) | -FLD_VAL (mode->vdisplay -1 ,27 ,16 )); +FLD_VAL (mode->crtc_hdisplay -1 ,11 ,0 ) | +FLD_VAL (mode->crtc_vdisplay -1 ,27 ,16 ));VP_REG_FLD_MOD (dispc, hw_videoport,DISPC_VP_CONTROL ,1 ,0 ,0 ); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 201/565 drm/bridge: cdns-dsi: Fix REG_WAKEUP_TIME value
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit eea4f89b6461294ed6bea1d3285bb3f79c09a041 ]
The driver tries to calculate the value for REG_WAKEUP_TIME. However, the calculation itself is not correct, and to add on it, the resulting value is almost always larger than the field's size, so the actual result is more or less random.
According to the docs, figuring out the value for REG_WAKEUP_TIME requires HW characterization and there's no way to have a generic algorithm to come up with the value. That doesn't help at all...
However, we know that the value must be smaller than the line time, and, at least in my understanding, the proper value for it is quite small. Testing shows that setting it to 1/10 of the line time seems to work well. All video modes from my HDMI monitor work with this algorithm.
Hopefully we'll get more information on how to calculate the value, and we can then update this.
--- drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c +7 -1
@@ -833,7 +833,13 @@ static void cdns_dsi_bridge_enable(struct drm_bridge *bridge) tx_byte_period =DIV_ROUND_DOWN_ULL ((u64 )NSEC_PER_SEC *8 , phy_cfg->hs_clk_rate); - reg_wakeup = (phy_cfg->hs_prepare + phy_cfg->hs_zero) / tx_byte_period; + +/* +* Estimated time [in clock cycles] to perform LP->HS on D-PHY. +* It is not clear how to calculate this, so for now, +* set it to 1/10 of the total number of clocks in a line. +*/ + reg_wakeup = dsi_cfg.htotal / nlanes /10 ;writel (REG_WAKEUP_TIME (reg_wakeup) |REG_LINE_DURATION (tmp), dsi->regs +VID_DPHY_TIME );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 202/565 drm/bridge: cdns-dsi: Dont fail on MIPI_DSI_MODE_VIDEO_BURST
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 7070f55f294745c5a3c033623b76309f3512be67 ]
While the cdns-dsi does not support DSI burst mode, the burst mode is essentially DSI event mode with more versatile clocking and timings. Thus cdns-dsi doesn't need to fail if the DSI peripheral driver requests MIPI_DSI_MODE_VIDEO_BURST.
In my particular use case, this allows the use of ti-sn65dsi83 driver.
--- drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c +0 -4
@@ -959,10 +959,6 @@ static int cdns_dsi_attach(struct mipi_dsi_host *host,if (output->dev)return -EBUSY ; -/* We do not support burst mode yet. */ -if (dev->mode_flags &MIPI_DSI_MODE_VIDEO_BURST ) -return -ENOTSUPP ; -/* * The host <-> device link might be described using an OF-graph * representation, in this case we extract the device of_node from
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 203/565 drm/tidss: Set crtc modesetting parameters with adjusted mode
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jayesh Choudhary <[email protected]>
[ Upstream commit cfb29225db20c56432a8525366321c0c09edfb2e ]
TIDSS uses crtc_* fields to propagate its registers and set the clock rates. So set the CRTC modesetting timing parameters with the adjusted mode when needed, to set correct values.
--- drivers/gpu/drm/tidss/tidss_crtc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/gpu/drm/tidss/tidss_crtc.c +4 -1
@@ -91,7 +91,7 @@ static int tidss_crtc_atomic_check(struct drm_crtc *crtc,struct dispc_device *dispc = tidss->dispc;struct tidss_crtc *tcrtc =to_tidss_crtc (crtc);u32 hw_videoport = tcrtc->hw_videoport; -const struct drm_display_mode *mode; +struct drm_display_mode *mode;enum drm_mode_status ok;dev_dbg (ddev->dev,"%s\n" , __func__);
@@ -108,6 +108,9 @@ static int tidss_crtc_atomic_check(struct drm_crtc *crtc,return -EINVAL ; } +if (drm_atomic_crtc_needs_modeset (crtc_state)) +drm_mode_set_crtcinfo (mode,0 ); +return dispc_vp_bus_check (dispc, hw_videoport, crtc_state); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 204/565 media: i2c: Kconfig: Ensure a dependency on HAVE_CLK for VIDEO_CAMERA_SENSOR
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mehdi Djait <[email protected]>
[ Upstream commit 2d240b124cc9df62ccccee6054bc3d1d19018758 ]
Both ACPI and DT-based systems are required to obtain the external camera sensor clock using the new devm_v4l2_sensor_clk_get() helper function.
Ensure a dependency on HAVE_CLK when config VIDEO_CAMERA_SENSOR is enabled.
--- drivers/media/i2c/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/i2c/Kconfig +1 -1
@@ -27,7 +27,7 @@ config VIDEO_IR_I2C menuconfig VIDEO_CAMERA_SENSOR bool "Camera sensor devices" - depends on MEDIA_CAMERA_SUPPORT && I2C + depends on MEDIA_CAMERA_SUPPORT && I2C && HAVE_CLK select MEDIA_CONTROLLER select V4L2_FWNODE select VIDEO_V4L2_SUBDEV_API
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 205/565 PCI/ERR: Update device error_state already after reset
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukas Wunner <[email protected]>
[ Upstream commit 45bc82563d5505327d97963bc54d3709939fa8f8 ]
After a Fatal Error has been reported by a device and has been recovered through a Secondary Bus Reset, AER updates the device's error_state to pci_channel_io_normal before invoking its driver's ->resume() callback.
By contrast, EEH updates the error_state earlier, namely after resetting the device and before invoking its driver's ->slot_reset() callback. Commit c58dc575f3c8 ("powerpc/pseries: Set error_state to pci_channel_io_normal in eeh_report_reset()") explains in great detail that the earlier invocation is necessitated by various drivers checking accessibility of the device with pci_channel_offline() and avoiding accesses if it returns true. It returns true for any other error_state than pci_channel_io_normal.
The device should be accessible already after reset, hence the reasoning is that it's safe to update the error_state immediately afterwards.
This deviation between AER and EEH seems problematic because drivers behave differently depending on which error recovery mechanism the platform uses. Three drivers have gone so far as to update the error_state themselves, presumably to work around AER's behavior.
For consistency, amend AER to update the error_state at the same recovery steps as EEH. Drop the now unnecessary workaround from the three drivers.
Keep updating the error_state before ->resume() in case ->error_detected() or ->mmio_enabled() return PCI_ERS_RESULT_RECOVERED, which causes ->slot_reset() to be skipped. There are drivers doing this even for Fatal Errors, e.g. mhi_pci_error_detected().
--- drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 1 - drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 2 -- drivers/pci/pcie/err.c | 3 ++- drivers/scsi/qla2xxx/qla_os.c | 5 ----- 4 files changed, 2 insertions(+), 9 deletions(-)
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +0 -1
@@ -4215,7 +4215,6 @@ static pci_ers_result_t qlcnic_83xx_io_slot_reset(struct pci_dev *pdev)struct qlcnic_adapter *adapter =pci_get_drvdata (pdev);int err =0 ; - pdev->error_state = pci_channel_io_normal; err =pci_enable_device (pdev);if (err) goto disconnect;
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +0 -2
@@ -3767,8 +3767,6 @@ static int qlcnic_attach_func(struct pci_dev *pdev)struct qlcnic_adapter *adapter =pci_get_drvdata (pdev);struct net_device *netdev = adapter->netdev; - pdev->error_state = pci_channel_io_normal; - err =pci_enable_device (pdev);if (err)return err;
drivers/pci/pcie/err.c +2 -1
@@ -141,7 +141,8 @@ static int report_slot_reset(struct pci_dev *dev, void *data)device_lock (&dev->dev); pdrv = dev->driver; -if (!pdrv || !pdrv->err_handler || !pdrv->err_handler->slot_reset) +if (!pci_dev_set_io_state (dev, pci_channel_io_normal) || + !pdrv || !pdrv->err_handler || !pdrv->err_handler->slot_reset) goto out; err_handler = pdrv->err_handler;
drivers/scsi/qla2xxx/qla_os.c +0 -5
@@ -7895,11 +7895,6 @@ qla2xxx_pci_slot_reset(struct pci_dev *pdev) "Slot Reset.\n"); ha->pci_error_state =QLA_PCI_SLOT_RESET ; -/* Workaround: qla2xxx driver which access hardware earlier -* needs error state to be pci_channel_io_online. -* Otherwise mailbox command timesout. -*/ - pdev->error_state = pci_channel_io_normal;pci_restore_state (pdev);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 206/565 x86/vsyscall: Do not require X86_PF_INSTR to emulate vsyscall
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kirill A. Shutemov <[email protected]>
[ Upstream commit 8ba38a7a9a699905b84fa97578a8291010dec273 ]
emulate_vsyscall() expects to see X86_PF_INSTR in PFEC on a vsyscall page fault, but the CPU does not report X86_PF_INSTR if neither X86_FEATURE_NX nor X86_FEATURE_SMEP are enabled.
X86_FEATURE_NX should be enabled on nearly all 64-bit CPUs, except for early P4 processors that did not support this feature.
Instead of explicitly checking for X86_PF_INSTR, compare the fault address to RIP.
On machines with X86_FEATURE_NX enabled, issue a warning if RIP is equal to fault address but X86_PF_INSTR is absent.
[ dhansen: flesh out code comments ]
--- arch/x86/entry/vsyscall/vsyscall_64.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
arch/x86/entry/vsyscall/vsyscall_64.c +14 -3
@@ -124,7 +124,12 @@ bool emulate_vsyscall(unsigned long error_code,if ((error_code & (X86_PF_WRITE |X86_PF_USER )) !=X86_PF_USER )return false; -if (!(error_code &X86_PF_INSTR )) { +/* +* Assume that faults at regs->ip are because of an +* instruction fetch. Return early and avoid +* emulation for faults during data accesses: +*/ +if (address != regs->ip) {/* Failed vsyscall read */ if (vsyscall_mode ==EMULATE )return false;
@@ -136,13 +141,19 @@ bool emulate_vsyscall(unsigned long error_code,return false; } +/* +* X86_PF_INSTR is only set when NX is supported. When +* available, use it to double-check that the emulation code +* is only being used for instruction fetches: +*/ +if (cpu_feature_enabled (X86_FEATURE_NX )) +WARN_ON_ONCE (!(error_code &X86_PF_INSTR )); +/* * No point in checking CS -- the only way to get here is a user mode * trap to a high address, which means that we're in 64-bit user code. */ -WARN_ON_ONCE (address != regs->ip); -if (vsyscall_mode ==NONE ) {warn_bad_vsyscall (KERN_INFO , regs,"vsyscall attempted with vsyscall=none" );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 207/565 net: stmmac: Check stmmac_hw_setup() in stmmac_resume()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tiezhu Yang <[email protected]>
[ Upstream commit 6896c2449a1858acb643014894d01b3a1223d4e5 ]
stmmac_hw_setup() may return 0 on success and an appropriate negative integer as defined in errno.h file on failure, just check it and then return early if failed in stmmac_resume().
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +8 -1
@@ -8030,7 +8030,14 @@ int stmmac_resume(struct device *dev)stmmac_free_tx_skbufs (priv);stmmac_clear_descriptors (priv, &priv->dma_conf); -stmmac_hw_setup (ndev, false); + ret =stmmac_hw_setup (ndev, false); +if (ret <0 ) { +netdev_err (priv->dev,"%s: Hw setup failed\n" , __func__); +mutex_unlock (&priv->lock); +rtnl_unlock (); +return ret; + } +stmmac_init_coalesce (priv);stmmac_set_rx_mode (ndev);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 208/565 ice: Dont use %pK through printk or tracepoints
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Weißschuh <[email protected]>
[ Upstream commit 66ceb45b7d7e9673254116eefe5b6d3a44eba267 ]
In the past %pK was preferable to %p as it would not leak raw pointer values into the kernel log.
Since commit ad67b74d2469 ("printk: hash addresses printed with %p") the regular %p has been improved to avoid this issue. Furthermore, restricted pointers ("%pK") were never meant to be used through printk(). They can still unintentionally leak raw pointers or acquire sleeping locks in atomic contexts.
Switch to the regular pointer formatting which is safer and easier to reason about.
There are still a few users of %pK left, but these use it through seq_file, for which its usage is safe.
--- drivers/net/ethernet/intel/ice/ice_main.c | 2 +- drivers/net/ethernet/intel/ice/ice_trace.h | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-)
drivers/net/ethernet/intel/ice/ice_main.c +1 -1
@@ -9109,7 +9109,7 @@ static int ice_create_q_channels(struct ice_vsi *vsi)list_add_tail (&ch->list, &vsi->ch_list); vsi->tc_map_vsi[i] = ch->ch_vsi;dev_dbg (ice_pf_to_dev (pf), -"successfully created channel: VSI %pK\n" , ch->ch_vsi); +"successfully created channel: VSI %p\n" , ch->ch_vsi); }return 0 ;
drivers/net/ethernet/intel/ice/ice_trace.h +5 -5
@@ -130,7 +130,7 @@ DECLARE_EVENT_CLASS(ice_tx_template, __entry->buf = buf; __assign_str(devname);), -TP_printk ("netdev: %s ring: %pK desc: %pK buf %pK" ,__get_str (devname), +TP_printk ("netdev: %s ring: %p desc: %p buf %p" ,__get_str (devname), __entry->ring, __entry->desc, __entry->buf) );
@@ -158,7 +158,7 @@ DECLARE_EVENT_CLASS(ice_rx_template, __entry->desc = desc; __assign_str(devname);), -TP_printk ("netdev: %s ring: %pK desc: %pK" ,__get_str (devname), +TP_printk ("netdev: %s ring: %p desc: %p" ,__get_str (devname), __entry->ring, __entry->desc) ); DEFINE_EVENT(ice_rx_template, ice_clean_rx_irq,
@@ -182,7 +182,7 @@ DECLARE_EVENT_CLASS(ice_rx_indicate_template, __entry->skb = skb; __assign_str(devname);), -TP_printk ("netdev: %s ring: %pK desc: %pK skb %pK" ,__get_str (devname), +TP_printk ("netdev: %s ring: %p desc: %p skb %p" ,__get_str (devname), __entry->ring, __entry->desc, __entry->skb) );
@@ -205,7 +205,7 @@ DECLARE_EVENT_CLASS(ice_xmit_template, __entry->skb = skb; __assign_str(devname);), -TP_printk ("netdev: %s skb: %pK ring: %pK" ,__get_str (devname), +TP_printk ("netdev: %s skb: %p ring: %p" ,__get_str (devname), __entry->skb, __entry->ring) );
@@ -228,7 +228,7 @@ DECLARE_EVENT_CLASS(ice_tx_tstamp_template, TP_fast_assign(__entry->skb = skb; __entry->idx = idx;), -TP_printk ("skb %pK idx %d" , +TP_printk ("skb %p idx %d" , __entry->skb, __entry->idx) );#define DEFINE_TX_TSTAMP_OP_EVENT (name) \
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 209/565 thunderbolt: Use is_pciehp instead of is_hotplug_bridge
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukas Wunner <[email protected]>
[ Upstream commit 5d03847175e81e86d4865456c15638faaf7c0634 ]
The thunderbolt driver sets up device link dependencies from hotplug ports to the Host Router (aka Native Host Interface, NHI). When resuming from system sleep, this allows the Host Router to re-establish tunnels to attached Thunderbolt devices before the hotplug ports resume.
To identify the hotplug ports, the driver utilizes the is_hotplug_bridge flag which also encompasses ACPI slots handled by the ACPI hotplug driver.
Thunderbolt hotplug ports are always Hot-Plug Capable PCIe ports, so it is more apt to identify them with the is_pciehp flag.
Similarly, hotplug ports on older Thunderbolt controllers have broken MSI support and are quirked to use legacy INTx interrupts instead. The quirk identifies them with is_hotplug_bridge, even though all affected ports are also matched by is_pciehp. So use is_pciehp here as well.
--- drivers/pci/quirks.c | 2 +- drivers/thunderbolt/tb.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/pci/quirks.c +1 -1
@@ -3832,7 +3832,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MELLANOX, 0xcf80, quirk_no_pm_reset);*/ static void quirk_thunderbolt_hotplug_msi (struct pci_dev *pdev) { -if (pdev->is_hotplug_bridge && +if (pdev->is_pciehp && (pdev->device !=PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C || pdev->revision <=1 )) pdev->no_msi =1 ;
drivers/thunderbolt/tb.c +1 -1
@@ -3242,7 +3242,7 @@ static bool tb_apple_add_links(struct tb_nhi *nhi)if (!pci_is_pcie (pdev))continue ;if (pci_pcie_type (pdev) !=PCI_EXP_TYPE_DOWNSTREAM || - !pdev->is_hotplug_bridge) + !pdev->is_pciehp)continue ; link = device_link_add(&pdev->dev, &nhi->pdev->dev,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 210/565 tty: serial: ip22zilog: Use platform device for probing
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Bogendoerfer <[email protected]>
[ Upstream commit 3fc36ae6abd263a5cbf93b2f5539eccc1fc753f7 ]
After commit 84a9582fd203 ("serial: core: Start managing serial controllers to enable runtime PM") serial drivers need to provide a device in struct uart_port.dev otherwise an oops happens. To fix this issue for ip22zilog driver switch driver to a platform driver and setup the serial device in sgi-ip22 code.
--- arch/mips/sgi-ip22/ip22-platform.c | 32 +++ drivers/tty/serial/ip22zilog.c | 352 ++++++++++++----------------- 2 files changed, 175 insertions(+), 209 deletions(-)
arch/mips/sgi-ip22/ip22-platform.c +32 -0
@@ -221,3 +221,35 @@ static int __init sgi_ds1286_devinit(void) }device_initcall (sgi_ds1286_devinit); + +#define SGI_ZILOG_BASE (HPC3_CHIP0_BASE + \ + offsetof(struct hpc3_regs, pbus_extregs[6]) + \ + offsetof(struct sgioc_regs, uart)) + +static struct resource sgi_zilog_resources[] = { + { + .start =SGI_ZILOG_BASE , + .end =SGI_ZILOG_BASE +15 , + .flags =IORESOURCE_MEM + }, + { + .start =SGI_SERIAL_IRQ , + .end =SGI_SERIAL_IRQ , + .flags =IORESOURCE_IRQ + } +}; + +static struct platform_device zilog_device = { + .name ="ip22zilog" , + .id =0 , + .num_resources =ARRAY_SIZE (sgi_zilog_resources), + .resource = sgi_zilog_resources, +}; + + +static int __init sgi_zilog_devinit (void ) +{ +return platform_device_register (&zilog_device); +} + +device_initcall (sgi_zilog_devinit);
drivers/tty/serial/ip22zilog.c +143 -209
453 lines not on this page · raw message
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 211/565 powerpc/eeh: Use result of error_detected() in uevent
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Schnelle <[email protected]>
[ Upstream commit 704e5dd1c02371dfc7d22e1520102b197a3b628b ]
Ever since uevent support was added for AER and EEH with commit 856e1eb9bdd4 ("PCI/AER: Add uevents in AER and EEH error/resume"), it reported PCI_ERS_RESULT_NONE as uevent when recovery begins.
Commit 7b42d97e99d3 ("PCI/ERR: Always report current recovery status for udev") subsequently amended AER to report the actual return value of error_detected().
Make the same change to EEH to align it with AER and s390.
--- arch/powerpc/kernel/eeh_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/kernel/eeh_driver.c +1 -1
@@ -334,7 +334,7 @@ static enum pci_ers_result eeh_report_error(struct eeh_dev *edev, rc = driver->err_handler->error_detected (pdev, pci_channel_io_frozen); edev->in_error = true; -pci_uevent_ers (pdev,PCI_ERS_RESULT_NONE ); +pci_uevent_ers (pdev, rc);return rc; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 212/565 s390/pci: Use pci_uevent_ers() in PCI recovery
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Schnelle <[email protected]>
[ Upstream commit dab32f2576a39d5f54f3dbbbc718d92fa5109ce9 ]
Issue uevents on s390 during PCI recovery using pci_uevent_ers() as done by EEH and AER PCIe recovery routines.
--- arch/s390/pci/pci_event.c | 3 +++ drivers/pci/pci-driver.c | 2 +- include/linux/pci.h | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-)
arch/s390/pci/pci_event.c +3 -0
@@ -90,6 +90,7 @@ static pci_ers_result_t zpci_event_notifpci_ers_result_t ers_res =PCI_ERS_RESULT_DISCONNECT ; ers_res = driver->err_handler->error_detected (pdev, pdev->error_state); +pci_uevent_ers (pdev, ers_res);if (ers_result_indicates_abort (ers_res))pr_info ("%s: Automatic recovery failed after initial reporting\n" ,pci_name (pdev));else if (ers_res ==PCI_ERS_RESULT_NEED_RESET )
@@ -219,6 +220,7 @@ static pci_ers_result_t zpci_event_attem ers_res =zpci_event_do_reset (pdev, driver);if (ers_res !=PCI_ERS_RESULT_RECOVERED ) { +pci_uevent_ers (pdev,PCI_ERS_RESULT_DISCONNECT );pr_err ("%s: Automatic recovery failed; operator intervention is required\n" ,pci_name (pdev)); goto out_unlock;
@@ -227,6 +229,7 @@ static pci_ers_result_t zpci_event_attempr_info ("%s: The device is ready to resume operations\n" ,pci_name (pdev));if (driver->err_handler->resume) driver->err_handler->resume (pdev); +pci_uevent_ers (pdev,PCI_ERS_RESULT_RECOVERED ); out_unlock:device_unlock (&pdev->dev);
drivers/pci/pci-driver.c +1 -1
@@ -1586,7 +1586,7 @@ static int pci_uevent(const struct devicreturn 0 ; } -#if defined(CONFIG_PCIEAER ) || defined(CONFIG_EEH ) +#if defined(CONFIG_PCIEAER ) || defined(CONFIG_EEH ) || defined(CONFIG_S390 )/** * pci_uevent_ers - emit a uevent during recovery path of PCI device * @pdev: PCI device undergoing error recovery
include/linux/pci.h +1 -1
@@ -2707,7 +2707,7 @@ static inline bool pci_is_thunderbolt_atreturn false; } -#if defined(CONFIG_PCIEPORTBUS ) || defined(CONFIG_EEH ) +#if defined(CONFIG_PCIEPORTBUS ) || defined(CONFIG_EEH ) || defined(CONFIG_S390 )void pci_uevent_ers (struct pci_dev *pdev,enum pci_ers_result err_type);#endif
Greg Kroah-Hartman
maintainerPATCH 213/565 bridge: Redirect to backup port when port is administratively down
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 3d05b24429e1de7a17c8fdccb04a04dbc8ad297b ]
If a backup port is configured for a bridge port, the bridge will redirect known unicast traffic towards the backup port when the primary port is administratively up but without a carrier. This is useful, for example, in MLAG configurations where a system is connected to two switches and there is a peer link between both switches. The peer link serves as the backup port in case one of the switches loses its connection to the multi-homed system.
In order to avoid flooding when the primary port loses its carrier, the bridge does not flush dynamic FDB entries pointing to the port upon STP disablement, if the port has a backup port.
The above means that known unicast traffic destined to the primary port will be blackholed when the port is put administratively down, until the FDB entries pointing to it are aged-out.
Given that the current behavior is quite weird and unlikely to be depended on by anyone, amend the bridge to redirect to the backup port also when the primary port is administratively down and not only when it does not have a carrier.
The change is motivated by a report from a user who expected traffic to be redirected to the backup port when the primary port was put administratively down while debugging a network issue.
--- net/bridge/br_forward.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/bridge/br_forward.c +2 -1
@@ -148,7 +148,8 @@ void br_forward(const struct net_bridge_port *to, goto out;/* redirect to backup link if the destination port is down */ -if (rcu_access_pointer (to->backup_port) && !netif_carrier_ok (to->dev)) { +if (rcu_access_pointer (to->backup_port) && + (!netif_carrier_ok (to->dev) || !netif_running (to->dev))) {struct net_bridge_port *backup_port; backup_port =rcu_dereference (to->backup_port);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 214/565 scsi: ufs: host: mediatek: Fix auto-hibern8 timer configuration
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Wang <[email protected]>
[ Upstream commit aa86602a483ba48f51044fbaefa1ebbf6da194a4 ]
Move the configuration of the Auto-Hibern8 (AHIT) timer from the post-link stage to the 'fixup_dev_quirks' function. This change allows setting the AHIT based on the vendor requirements:
(a) Samsung: 3.5 ms
(b) Micron: 2 ms
(c) Others: 1 ms
Additionally, the clock gating timer is adjusted based on the AHIT scale, with a maximum setting of 10 ms. This ensures that the clock gating delay is appropriately configured to match the AHIT settings.
--- drivers/ufs/host/ufs-mediatek.c | 86 ++++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 22 deletions(-)
drivers/ufs/host/ufs-mediatek.c +64 -22
@@ -916,6 +916,69 @@ static void ufs_mtk_vreg_fix_vccqx(struct ufs_hba *hba) } } +static void ufs_mtk_setup_clk_gating (struct ufs_hba *hba) +{ +unsigned long flags; +u32 ah_ms =10 ; +u32 ah_scale, ah_timer; +u32 scale_us[] = {1 ,10 ,100 ,1000 ,10000 ,100000 }; + +if (ufshcd_is_clkgating_allowed (hba)) { +if (ufshcd_is_auto_hibern8_supported (hba) && hba->ahit) { + ah_scale =FIELD_GET (UFSHCI_AHIBERN8_SCALE_MASK , + hba->ahit); + ah_timer =FIELD_GET (UFSHCI_AHIBERN8_TIMER_MASK , + hba->ahit); +if (ah_scale <=5 ) + ah_ms = ah_timer * scale_us[ah_scale] /1000 ; + } + +spin_lock_irqsave (hba->host->host_lock, flags); + hba->clk_gating.delay_ms =max (ah_ms,10U ); +spin_unlock_irqrestore (hba->host->host_lock, flags); + } +} + +/* Convert microseconds to Auto-Hibernate Idle Timer register value */ +static u32 ufs_mtk_us_to_ahit (unsigned int timer) +{ +unsigned int scale; + +for (scale =0 ; timer >UFSHCI_AHIBERN8_TIMER_MASK ; ++scale) + timer /=UFSHCI_AHIBERN8_SCALE_FACTOR ; + +return FIELD_PREP (UFSHCI_AHIBERN8_TIMER_MASK , timer) | +FIELD_PREP (UFSHCI_AHIBERN8_SCALE_MASK , scale); +} + +static void ufs_mtk_fix_ahit (struct ufs_hba *hba) +{ +unsigned int us; + +if (ufshcd_is_auto_hibern8_supported (hba)) { +switch (hba->dev_info.wmanufacturerid) { +case UFS_VENDOR_SAMSUNG : +/* configure auto-hibern8 timer to 3.5 ms */ + us =3500 ; +break ; + +case UFS_VENDOR_MICRON : +/* configure auto-hibern8 timer to 2 ms */ + us =2000 ; +break ; + +default : +/* configure auto-hibern8 timer to 1 ms */ + us =1000 ; +break ; + } + + hba->ahit =ufs_mtk_us_to_ahit (us); + } + +ufs_mtk_setup_clk_gating (hba); +} +static void ufs_mtk_init_mcq_irq (struct ufs_hba *hba) {struct ufs_mtk_host *host =ufshcd_get_variant (hba);
@@ -1206,32 +1269,10 @@ static int ufs_mtk_pre_link(struct ufs_hba *hba)return ret; } - -static void ufs_mtk_setup_clk_gating (struct ufs_hba *hba) -{ -u32 ah_ms; - -if (ufshcd_is_clkgating_allowed (hba)) { -if (ufshcd_is_auto_hibern8_supported (hba) && hba->ahit) - ah_ms =FIELD_GET (UFSHCI_AHIBERN8_TIMER_MASK , - hba->ahit); -else - ah_ms =10 ; -ufshcd_clkgate_delay_set (hba->dev, ah_ms +5 ); - } -} -static void ufs_mtk_post_link (struct ufs_hba *hba) {/* enable unipro clock gating feature */ ufs_mtk_cfg_unipro_cg (hba, true); - -/* will be configured during probe hba */ -if (ufshcd_is_auto_hibern8_supported (hba)) - hba->ahit =FIELD_PREP (UFSHCI_AHIBERN8_TIMER_MASK ,10 ) | -FIELD_PREP (UFSHCI_AHIBERN8_SCALE_MASK ,3 ); - -ufs_mtk_setup_clk_gating (hba); } static int ufs_mtk_link_startup_notify(struct ufs_hba *hba,
@@ -1556,6 +1597,7 @@ static void ufs_mtk_fixup_dev_quirks(struct ufs_hba *hba)ufs_mtk_vreg_fix_vcc (hba);ufs_mtk_vreg_fix_vccqx (hba); +ufs_mtk_fix_ahit (hba); } static void ufs_mtk_event_notify(struct ufs_hba *hba,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 215/565 scsi: ufs: host: mediatek: Fix PWM mode switch issue
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Wang <[email protected]>
[ Upstream commit 7212d624f8638f8ea8ad1ecbb80622c7987bc7a1 ]
Address a failure in switching to PWM mode by ensuring proper configuration of power modes and adaptation settings. The changes include checks for SLOW_MODE and adjustments to the desired working mode and adaptation configuration based on the device's power mode and hardware version.
--- drivers/ufs/host/ufs-mediatek.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-)
drivers/ufs/host/ufs-mediatek.c +22 -3
@@ -1140,6 +1140,10 @@ static bool ufs_mtk_pmc_via_fastauto(struct ufs_hba *hba, dev_req_params->gear_rx < UFS_HS_G4)return false; +if (dev_req_params->pwr_tx ==SLOW_MODE || + dev_req_params->pwr_rx ==SLOW_MODE ) +return false; +return true; }
@@ -1155,6 +1159,10 @@ static int ufs_mtk_pre_pwr_change(struct ufs_hba *hba, host_params.hs_rx_gear =UFS_HS_G5 ; host_params.hs_tx_gear =UFS_HS_G5 ; +if (dev_max_params->pwr_rx ==SLOW_MODE || + dev_max_params->pwr_tx ==SLOW_MODE ) + host_params.desired_working_mode =UFS_PWM_MODE ; + ret =ufshcd_negotiate_pwr_params (&host_params, dev_max_params, dev_req_params);if (ret) { pr_info("%s: failed to determine capabilities\n",
@@ -1187,10 +1195,21 @@ static int ufs_mtk_pre_pwr_change(struct ufs_hba *hba, } } -if (host->hw_ver.major >=3 ) { +if (dev_req_params->pwr_rx ==FAST_MODE || + dev_req_params->pwr_rx ==FASTAUTO_MODE ) { +if (host->hw_ver.major >=3 ) { + ret =ufshcd_dme_configure_adapt (hba, + dev_req_params->gear_tx, +PA_INITIAL_ADAPT ); + }else { + ret =ufshcd_dme_configure_adapt (hba, + dev_req_params->gear_tx, +PA_NO_ADAPT ); + } + }else { ret =ufshcd_dme_configure_adapt (hba, - dev_req_params->gear_tx, -PA_INITIAL_ADAPT ); + dev_req_params->gear_tx, +PA_NO_ADAPT ); }return ret;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 216/565 scsi: ufs: host: mediatek: Assign power mode userdata before FASTAUTO mode change
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alice Chao <[email protected]>
[ Upstream commit 979feee0cf43b32d288931649d7c6d9a5524ea55 ]
Assign power mode userdata settings before transitioning to FASTAUTO power mode. This ensures that default timeout values are set for various parameters, enhancing the reliability and performance of the power mode change process.
--- drivers/ufs/host/ufs-mediatek.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
drivers/ufs/host/ufs-mediatek.c +22 -0
@@ -1186,6 +1186,28 @@ static int ufs_mtk_pre_pwr_change(struct ufs_hba *hba,ufshcd_dme_set (hba,UIC_ARG_MIB (PA_TXHSADAPTTYPE ),PA_NO_ADAPT ); +if (!(hba->quirks &UFSHCD_QUIRK_SKIP_DEF_UNIPRO_TIMEOUT_SETTING )) { +ufshcd_dme_set (hba,UIC_ARG_MIB (PA_PWRMODEUSERDATA0 ), + DL_FC0ProtectionTimeOutVal_Default); +ufshcd_dme_set (hba,UIC_ARG_MIB (PA_PWRMODEUSERDATA1 ), + DL_TC0ReplayTimeOutVal_Default); +ufshcd_dme_set (hba,UIC_ARG_MIB (PA_PWRMODEUSERDATA2 ), + DL_AFC0ReqTimeOutVal_Default); +ufshcd_dme_set (hba,UIC_ARG_MIB (PA_PWRMODEUSERDATA3 ), + DL_FC1ProtectionTimeOutVal_Default); +ufshcd_dme_set (hba,UIC_ARG_MIB (PA_PWRMODEUSERDATA4 ), + DL_TC1ReplayTimeOutVal_Default); +ufshcd_dme_set (hba,UIC_ARG_MIB (PA_PWRMODEUSERDATA5 ), + DL_AFC1ReqTimeOutVal_Default); + +ufshcd_dme_set (hba,UIC_ARG_MIB (DME_LocalFC0ProtectionTimeOutVal), + DL_FC0ProtectionTimeOutVal_Default); +ufshcd_dme_set (hba,UIC_ARG_MIB (DME_LocalTC0ReplayTimeOutVal), + DL_TC0ReplayTimeOutVal_Default); +ufshcd_dme_set (hba,UIC_ARG_MIB (DME_LocalAFC0ReqTimeOutVal), + DL_AFC0ReqTimeOutVal_Default); + } + ret =ufshcd_uic_change_pwr_mode (hba,FASTAUTO_MODE <<4 |FASTAUTO_MODE );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 217/565 scsi: ufs: host: mediatek: Change reset sequence for improved stability
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Wang <[email protected]>
[ Upstream commit 878ed88c50bfb14d972dd3b86a1c8188c58de4e5 ]
Modify the reset sequence to ensure that the device reset pin is set low before the host is disabled. This change enhances the stability of the reset process by ensuring the correct order of operations.
--- drivers/ufs/host/ufs-mediatek.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/ufs/host/ufs-mediatek.c +3 -3
@@ -1340,11 +1340,11 @@ static int ufs_mtk_device_reset(struct ufs_hba *hba) {struct arm_smccc_res res; -/* disable hba before device reset */ -ufshcd_hba_stop (hba); -ufs_mtk_device_reset_ctrl (0 , res); +/* disable hba in middle of device reset */ +ufshcd_hba_stop (hba); +/* * The reset signal is active low. UFS devices shall detect * more than or equal to 1us of positive or negative RST_n
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 218/565 scsi: ufs: host: mediatek: Fix invalid access in vccqx handling
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alice Chao <[email protected]>
[ Upstream commit 5863638598f5e4f64d2f85b03f376383ca1f2ab7 ]
Add a NULL check before accessing the 'vccqx' pointer to prevent invalid memory access. This ensures that the function safely handles cases where 'vccq' and 'vccq2' are not initialized, improving the robustness of the power management code.
--- drivers/ufs/host/ufs-mediatek.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/ufs/host/ufs-mediatek.c +3 -0
@@ -1426,6 +1426,9 @@ static void ufs_mtk_vccqx_set_lpm(struct ufs_hba *hba, bool lpm) {struct ufs_vreg *vccqx =NULL ; +if (!hba->vreg_info.vccq && !hba->vreg_info.vccq2) +return ; +if (hba->vreg_info.vccq) vccqx = hba->vreg_info.vccq;else
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 219/565 net: ipv6: fix field-spanning memcpy warning in AH output
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charalampos Mitrodimas <[email protected]>
[ Upstream commit 2327a3d6f65ce2fe2634546dde4a25ef52296fec ]
Fix field-spanning memcpy warnings in ah6_output() and ah6_output_done() where extension headers are copied to/from IPv6 address fields, triggering fortify-string warnings about writes beyond the 16-byte address fields.
memcpy: detected field-spanning write (size 40) of single field "&top_iph->saddr" at net/ipv6/ah6.c:439 (size 16)
WARNING: CPU: 0 PID: 8838 at net/ipv6/ah6.c:439 ah6_output+0xe7e/0x14e0 net/ipv6/ah6.c:439
The warnings are false positives as the extension headers are intentionally placed after the IPv6 header in memory. Fix by properly copying addresses and extension headers separately, and introduce helper functions to avoid code duplication.
--- net/ipv6/ah6.c | 50 +++++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 19 deletions(-)
net/ipv6/ah6.c +31 -19
@@ -46,6 +46,34 @@ struct ah_skb_cb {#define AH_SKB_CB (__skb) ((struct ah_skb_cb *)&((__skb)->cb[0])) +/* Helper to save IPv6 addresses and extension headers to temporary storage */ +static inline void ah6_save_hdrs (struct tmp_ext *iph_ext, +struct ipv6hdr *top_iph,int extlen) +{ +if (!extlen) +return ; + +#if IS_ENABLED (CONFIG_IPV6_MIP6 ) + iph_ext->saddr = top_iph->saddr; +#endif + iph_ext->daddr = top_iph->daddr; +memcpy (&iph_ext->hdrs, top_iph +1 , extlen -sizeof (*iph_ext)); +} + +/* Helper to restore IPv6 addresses and extension headers from temporary storage */ +static inline void ah6_restore_hdrs (struct ipv6hdr *top_iph, +struct tmp_ext *iph_ext,int extlen) +{ +if (!extlen) +return ; + +#if IS_ENABLED (CONFIG_IPV6_MIP6 ) + top_iph->saddr = iph_ext->saddr; +#endif + top_iph->daddr = iph_ext->daddr; +memcpy (top_iph +1 , &iph_ext->hdrs, extlen -sizeof (*iph_ext)); +} +static void *ah_alloc_tmp (struct crypto_ahash *ahash,int nfrags,unsigned int size) {
@@ -301,13 +329,7 @@ static void ah6_output_done(void *data, int err)memcpy (ah->auth_data, icv, ahp->icv_trunc_len);memcpy (top_iph, iph_base,IPV6HDR_BASELEN ); -if (extlen) { -#if IS_ENABLED (CONFIG_IPV6_MIP6 ) -memcpy (&top_iph->saddr, iph_ext, extlen); -#else -memcpy (&top_iph->daddr, iph_ext, extlen); -#endif - } +ah6_restore_hdrs (top_iph, iph_ext, extlen);kfree (AH_SKB_CB (skb)->tmp);xfrm_output_resume (skb->sk, skb, err);
@@ -378,12 +400,8 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb)*/ memcpy (iph_base, top_iph,IPV6HDR_BASELEN ); +ah6_save_hdrs (iph_ext, top_iph, extlen);if (extlen) { -#if IS_ENABLED (CONFIG_IPV6_MIP6 ) -memcpy (iph_ext, &top_iph->saddr, extlen); -#else -memcpy (iph_ext, &top_iph->daddr, extlen); -#endif err = ipv6_clear_mutable_options(top_iph, extlen - sizeof(*iph_ext) + sizeof(*top_iph),
@@ -434,13 +452,7 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb)memcpy (ah->auth_data, icv, ahp->icv_trunc_len);memcpy (top_iph, iph_base,IPV6HDR_BASELEN ); -if (extlen) { -#if IS_ENABLED (CONFIG_IPV6_MIP6 ) -memcpy (&top_iph->saddr, iph_ext, extlen); -#else -memcpy (&top_iph->daddr, iph_ext, extlen); -#endif - } +ah6_restore_hdrs (top_iph, iph_ext, extlen); out_free:kfree (iph_base);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 220/565 media: imon: make send_packet() more robust
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
[ Upstream commit eecd203ada43a4693ce6fdd3a58ae10c7819252c ]
syzbot is reporting that imon has three problems which result in hung tasks due to forever holding device lock [1].
First problem is that when usb_rx_callback_intf0() once got -EPROTO error after ictx->dev_present_intf0 became true, usb_rx_callback_intf0() resubmits urb after printk(), and resubmitted urb causes usb_rx_callback_intf0() to again get -EPROTO error. This results in printk() flooding (RCU stalls).
Alan Stern commented [2] that
In theory it's okay to resubmit _if_ the driver has a robust error-recovery scheme (such as giving up after some fixed limit on the number of errors or after some fixed time has elapsed, perhaps with a time delay to prevent a flood of errors). Most drivers don't bother to do this; they simply give up right away. This makes them more vulnerable to short-term noise interference during USB transfers, but in reality such interference is quite rare. There's nothing really wrong with giving up right away.
but imon has a poor error-recovery scheme which just retries forever; this behavior should be fixed.
Since I'm not sure whether it is safe for imon users to give up upon any error code, this patch takes care of only union of error codes chosen from modules in drivers/media/rc/ directory which handle -EPROTO error (i.e. ir_toy, mceusb and igorplugusb).
Second problem is that when usb_rx_callback_intf0() once got -EPROTO error before ictx->dev_present_intf0 becomes true, usb_rx_callback_intf0() always resubmits urb due to commit 8791d63af0cf ("[media] imon: don't wedge hardware after early callbacks"). Move the ictx->dev_present_intf0 test introduced by commit 6f6b90c9231a ("[media] imon: don't parse scancodes until intf configured") to immediately before imon_incoming_packet(), or the first problem explained above happens without printk() flooding (i.e. hung task).
Third problem is that when usb_rx_callback_intf0() is not called for some reason (e.g. flaky hardware; the reproducer for this problem sometimes prevents usb_rx_callback_intf0() from being called), wait_for_completion_interruptible() in send_packet() never returns (i.e. hung task). As a workaround for such situation, change send_packet() to wait for completion with timeout of 10 seconds.
--- drivers/media/rc/imon.c | 61 +++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 24 deletions(-)
drivers/media/rc/imon.c +37 -24
@@ -650,12 +650,15 @@ static int send_packet(struct imon_context *ictx)smp_rmb ();/* ensure later readers know we're not busy */ pr_err_ratelimited ("error submitting urb(%d)\n" , retval); }else { -/* Wait for transmission to complete (or abort) */ - retval =wait_for_completion_interruptible ( - &ictx->tx.finished); -if (retval) { +/* Wait for transmission to complete (or abort or timeout) */ + retval =wait_for_completion_interruptible_timeout (&ictx->tx.finished,10 *HZ ); +if (retval <=0 ) {usb_kill_urb (ictx->tx_urb);pr_err_ratelimited ("task interrupted\n" ); +if (retval <0 ) + ictx->tx.status = retval; +else + ictx->tx.status = -ETIMEDOUT ; } ictx->tx.busy = false;
@@ -1754,14 +1757,6 @@ static void usb_rx_callback_intf0(struct urb *urb)if (!ictx)return ; -/* -* if we get a callback before we're done configuring the hardware, we -* can't yet process the data, as there's nowhere to send it, but we -* still need to submit a new rx URB to avoid wedging the hardware -*/ -if (!ictx->dev_present_intf0) - goto out; -switch (urb->status) {case -ENOENT :/* usbcore unlink successful! */ return ;
@@ -1770,16 +1765,29 @@ static void usb_rx_callback_intf0(struct urb *urb)break ;case 0 : -imon_incoming_packet (ictx, urb, intfnum); +/* +* if we get a callback before we're done configuring the hardware, we +* can't yet process the data, as there's nowhere to send it, but we +* still need to submit a new rx URB to avoid wedging the hardware +*/ +if (ictx->dev_present_intf0) +imon_incoming_packet (ictx, urb, intfnum);break ; +case -ECONNRESET : +case -EILSEQ : +case -EPROTO : +case -EPIPE : +dev_warn (ictx->dev,"imon %s: status(%d)\n" , + __func__, urb->status); +return ; +default :dev_warn (ictx->dev,"imon %s: status(%d): ignored\n" , __func__, urb->status);break ; } -out:usb_submit_urb (ictx->rx_urb_intf0,GFP_ATOMIC ); }
@@ -1795,14 +1803,6 @@ static void usb_rx_callback_intf1(struct urb *urb)if (!ictx)return ; -/* -* if we get a callback before we're done configuring the hardware, we -* can't yet process the data, as there's nowhere to send it, but we -* still need to submit a new rx URB to avoid wedging the hardware -*/ -if (!ictx->dev_present_intf1) - goto out; -switch (urb->status) {case -ENOENT :/* usbcore unlink successful! */ return ;
@@ -1811,16 +1811,29 @@ static void usb_rx_callback_intf1(struct urb *urb)break ;case 0 : -imon_incoming_packet (ictx, urb, intfnum); +/* +* if we get a callback before we're done configuring the hardware, we +* can't yet process the data, as there's nowhere to send it, but we +* still need to submit a new rx URB to avoid wedging the hardware +*/ +if (ictx->dev_present_intf1) +imon_incoming_packet (ictx, urb, intfnum);break ; +case -ECONNRESET : +case -EILSEQ : +case -EPROTO : +case -EPIPE : +dev_warn (ictx->dev,"imon %s: status(%d)\n" , + __func__, urb->status); +return ; +default :dev_warn (ictx->dev,"imon %s: status(%d): ignored\n" , __func__, urb->status);break ; } -out:usb_submit_urb (ictx->rx_urb_intf1,GFP_ATOMIC ); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 221/565 drm/panthor: Serialize GPU cache flush operations
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karunika Choo <[email protected]>
[ Upstream commit e322a4844811b54477b7072eb40dc9e402a1725d ]
In certain scenarios, it is possible for multiple cache flushes to be requested before the previous one completes. This patch introduces the cache_flush_lock mutex to serialize these operations and ensure that any requested cache flushes are completed instead of dropped.
--- drivers/gpu/drm/panthor/panthor_gpu.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/gpu/drm/panthor/panthor_gpu.c +7 -0
@@ -35,6 +35,9 @@ struct panthor_gpu {/** @reqs_acked: GPU request wait queue. */ wait_queue_head_t reqs_acked; + +/** @cache_flush_lock: Lock to serialize cache flushes */ +struct mutex cache_flush_lock; };/**
@@ -201,6 +204,7 @@ int panthor_gpu_init(struct panthor_device *ptdev)spin_lock_init (&gpu->reqs_lock);init_waitqueue_head (&gpu->reqs_acked); +mutex_init (&gpu->cache_flush_lock); ptdev->gpu = gpu;panthor_gpu_init_info (ptdev);
@@ -383,6 +387,9 @@ int panthor_gpu_flush_caches(struct panthor_device *ptdev,bool timedout = false;unsigned long flags; +/* Serialize cache flush operations. */ +guard (mutex)(&ptdev->gpu->cache_flush_lock); +spin_lock_irqsave (&ptdev->gpu->reqs_lock, flags);if (!drm_WARN_ON (&ptdev->base, ptdev->gpu->pending_reqs &GPU_IRQ_CLEAN_CACHES_COMPLETED )) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 222/565 HID: pidff: Use direction fix only for conditional effects
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomasz Pakuła <[email protected]>
[ Upstream commit f345a4798dab800159b09d088e7bdae0f16076c3 ]
The already fixed bug in SDL only affected conditional effects. This should fix FFB in Forza Horizion 4/5 on Moza Devices as Forza Horizon flips the constant force direction instead of using negative magnitude values.
Changing the direction in the effect directly in pidff_upload_effect() would affect it's value in further operations like comparing to the old effect and/or just reading the effect values in the user application.
This, in turn, would lead to constant PID_SET_EFFECT spam as the effect direction would constantly not match the value that's set by the application.
This way, it's still transparent to any software/API.
Only affects conditional effects now so it's better for it to explicitly state that in the name. If any HW ever needs fixed direction for other effects, we'll add more quirks.
--- drivers/hid/hid-universal-pidff.c | 20 ++++++++++---------- drivers/hid/usbhid/hid-pidff.c | 28 +++++++++++++++++++++++----- drivers/hid/usbhid/hid-pidff.h | 2 +- 3 files changed, 34 insertions(+), 16 deletions(-)
drivers/hid/hid-universal-pidff.c +10 -10
@@ -143,25 +143,25 @@ static int universal_pidff_input_configured(struct hid_device *hdev,static const struct hid_device_id universal_pidff_devices[] = { {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R3 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R3_2 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R5 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R5_2 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R9 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R9_2 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R12 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R12_2 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R16_R21 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R16_R21_2 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_CAMMUS ,USB_DEVICE_ID_CAMMUS_C5 ) }, {HID_USB_DEVICE (USB_VENDOR_ID_CAMMUS ,USB_DEVICE_ID_CAMMUS_C12 ) }, {HID_USB_DEVICE (USB_VENDOR_ID_VRS ,USB_DEVICE_ID_VRS_DFP ),
drivers/hid/usbhid/hid-pidff.c +23 -5
@@ -205,6 +205,14 @@ struct pidff_device {u8 effect_count; }; +static int pidff_is_effect_conditional (struct ff_effect *effect) +{ +return effect->type ==FF_SPRING || + effect->type ==FF_DAMPER || + effect->type ==FF_INERTIA || + effect->type ==FF_FRICTION ; +} +/* * Clamp value for a given field */
@@ -294,6 +302,20 @@ static void pidff_set_duration(struct pidff_usage *usage, u16 duration)pidff_set_time (usage, duration); } +static void pidff_set_effect_direction (struct pidff_device *pidff, +struct ff_effect *effect) +{ +u16 direction = effect->direction; + +/* Use fixed direction if needed */ +if (pidff->quirks &HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION && +pidff_is_effect_conditional (effect)) + direction =PIDFF_FIXED_WHEEL_DIRECTION ; + + pidff->effect_direction->value[0 ] = +pidff_rescale (direction,U16_MAX , pidff->effect_direction); +} +/* * Send envelope report to the device */
@@ -394,11 +416,7 @@ static void pidff_set_effect_report(struct pidff_device *pidff, pidff->set_effect[PID_GAIN ].field->logical_maximum; pidff->set_effect[PID_DIRECTION_ENABLE ].value[0 ] =1 ; -/* Use fixed direction if needed */ - pidff->effect_direction->value[0 ] =pidff_rescale ( - pidff->quirks &HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION ? -PIDFF_FIXED_WHEEL_DIRECTION : effect->direction, -U16_MAX , pidff->effect_direction); +pidff_set_effect_direction (pidff, effect);/* Omit setting delay field if it's missing */ if (!(pidff->quirks &HID_PIDFF_QUIRK_MISSING_DELAY ))
drivers/hid/usbhid/hid-pidff.h +1 -1
@@ -17,7 +17,7 @@#define HID_PIDFF_QUIRK_PERMISSIVE_CONTROL BIT(2)/* Use fixed 0x4000 direction during SET_EFFECT report upload */ -#define HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION BIT(3) +#define HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION BIT(3)/* Force all periodic effects to be uploaded as SINE */ #define HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY BIT(4)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 223/565 HID: pidff: PERMISSIVE_CONTROL quirk autodetection
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomasz Pakuła <[email protected]>
[ Upstream commit c2dc9f0b368c08c34674311cf78407718d5715a7 ]
Fixes force feedback for devices built with MMOS firmware and many more not yet detected devices.
Update quirks mask debug message to always contain all 32 bits of data.
--- drivers/hid/usbhid/hid-pidff.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
drivers/hid/usbhid/hid-pidff.c +11 -3
@@ -1152,8 +1152,16 @@ static int pidff_find_special_fields(struct pidff_device *pidff) PID_DIRECTION, 0); pidff->device_control =pidff_find_special_field (pidff->reports[PID_DEVICE_CONTROL ], -PID_DEVICE_CONTROL_ARRAY , - !(pidff->quirks &HID_PIDFF_QUIRK_PERMISSIVE_CONTROL )); +PID_DEVICE_CONTROL_ARRAY ,1 ); + +/* Detect and set permissive control quirk */ +if (!pidff->device_control) { +pr_debug ("Setting PERMISSIVE_CONTROL quirk\n" ); + pidff->quirks |=HID_PIDFF_QUIRK_PERMISSIVE_CONTROL ; + pidff->device_control =pidff_find_special_field ( + pidff->reports[PID_DEVICE_CONTROL ], +PID_DEVICE_CONTROL_ARRAY ,0 ); + } pidff->block_load_status = pidff_find_special_field(pidff->reports[PID_BLOCK_LOAD],
@@ -1492,7 +1500,7 @@ int hid_pidff_init_with_quirks(struct hid_device *hid, u32 initial_quirks) ff->playback = pidff_playback;hid_info (dev,"Force feedback for USB HID PID devices by Anssi Hannula <[email protected]>\n" ); -hid_dbg (dev,"Active quirks mask: 0x%x\n" , pidff->quirks); +hid_dbg (dev,"Active quirks mask: 0x%08x\n" , pidff->quirks);hid_device_io_stop (hid);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 224/565 drm/bridge: display-connector: dont set OP_DETECT for DisplayPorts
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit cb640b2ca54617f4a9d4d6efd5ff2afd6be11f19 ]
Detecting the monitor for DisplayPort targets is more complicated than just reading the HPD pin level: it requires reading the DPCD in order to check what kind of device is attached to the port and whether there is an actual display attached.
In order to let DRM framework handle such configurations, disable DRM_BRIDGE_OP_DETECT for dp-connector devices, letting the actual DP driver perform detection. This still keeps DRM_BRIDGE_OP_HPD enabled, so it is valid for the bridge to report HPD events.
Currently inside the kernel there are only two targets which list hpd-gpios for dp-connector devices: arm64/qcom/qcs6490-rb3gen2 and arm64/qcom/sa8295p-adp. Both should be fine with this change.
--- drivers/gpu/drm/bridge/display-connector.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/bridge/display-connector.c +2 -1
@@ -363,7 +363,8 @@ static int display_connector_probe(struct platform_device *pdev)if (conn->bridge.ddc) conn->bridge.ops |=DRM_BRIDGE_OP_EDID |DRM_BRIDGE_OP_DETECT ; -if (conn->hpd_gpio) +/* Detecting the monitor requires reading DPCD */ +if (conn->hpd_gpio && type != DRM_MODE_CONNECTOR_DisplayPort) conn->bridge.ops |=DRM_BRIDGE_OP_DETECT ;if (conn->hpd_irq >=0 ) conn->bridge.ops |=DRM_BRIDGE_OP_HPD ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 225/565 drm/amdgpu: fix nullptr err of vm_handle_moved
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heng Zhou <[email protected]>
[ Upstream commit 859958a7faefe5b7742b7b8cdbc170713d4bf158 ]
If a amdgpu_bo_va is fpriv->prt_va, the bo of this one is always NULL. So, such kind of amdgpu_bo_va should be updated separately before amdgpu_vm_handle_moved.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +14 -1
@@ -3001,9 +3001,22 @@ int amdgpu_amdkfd_gpuvm_restore_process_bos(void *info, struct dma_fence __rcu *struct amdgpu_device *adev =amdgpu_ttm_adev ( peer_vm->root.bo->tbo.bdev); +struct amdgpu_fpriv *fpriv = + container_of(peer_vm, struct amdgpu_fpriv, vm); + + ret =amdgpu_vm_bo_update (adev, fpriv->prt_va, false); +if (ret) { +dev_dbg (adev->dev, +"Memory eviction: handle PRT moved failed, pid %8d. Try again.\n" , +pid_nr (process_info->pid)); + goto validate_map_fail; + } + ret =amdgpu_vm_handle_moved (adev, peer_vm, &exec.ticket);if (ret) { -pr_debug ("Memory eviction: handle moved failed. Try again\n" ); +dev_dbg (adev->dev, +"Memory eviction: handle moved failed, pid %8d. Try again.\n" , +pid_nr (process_info->pid)); goto validate_map_fail; } }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 226/565 drm/amdkfd: Handle lack of READ permissions in SVM mapping
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kent Russell <[email protected]>
[ Upstream commit 0ed704d058cec7643a716a21888d58c7d03f2c3e ]
HMM assumes that pages have READ permissions by default. Inside svm_range_validate_and_map, we add READ permissions then add WRITE permissions if the VMA isn't read-only. This will conflict with regions that only have PROT_WRITE or have PROT_NONE. When that happens, svm_range_restore_work will continue to retry, silently, giving the impression of a hang if pr_debug isn't enabled to show the retries..
If pages don't have READ permissions, simply unmap them and continue. If they weren't mapped in the first place, this would be a no-op. Since x86 doesn't support write-only, and PROT_NONE doesn't allow reads or writes anyways, this will allow the svm range validation to continue without getting stuck in a loop forever on mappings we can't use with HMM.
--- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
drivers/gpu/drm/amd/amdkfd/kfd_svm.c +23 -0
@@ -1704,6 +1704,29 @@ static int svm_range_validate_and_map(struct mm_struct *mm, next =min (vma->vm_end, end); npages = (next - addr) >>PAGE_SHIFT ; +/* HMM requires at least READ permissions. If provided with PROT_NONE, +* unmap the memory. If it's not already mapped, this is a no-op +* If PROT_WRITE is provided without READ, warn first then unmap +*/ +if (!(vma->vm_flags &VM_READ )) { +unsigned long e, s; + +svm_range_lock (prange); +if (vma->vm_flags &VM_WRITE ) +pr_debug ("VM_WRITE without VM_READ is not supported" ); + s =max (start, prange->start); + e =min (end, prange->last); +if (e >= s) + r =svm_range_unmap_from_gpus (prange, s, e, +KFD_SVM_UNMAP_TRIGGER_UNMAP_FROM_CPU ); +svm_range_unlock (prange); +/* If unmap returns non-zero, we'll bail on the next for loop +* iteration, so just leave r and continue +*/ + addr = next; +continue ; + } +WRITE_ONCE (p->svms.faulting_task, current); r = amdgpu_hmm_range_get_pages(&prange->notifier, addr, npages, readonly, owner, NULL,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 227/565 iio: adc: spear_adc: mask SPEAR_ADC_STATUS channel and avg sample before setting register
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rodrigo Gobbi <[email protected]>
[ Upstream commit d75c7021c08e8ae3f311ef2464dca0eaf75fab9f ]
avg sample info is a bit field coded inside the following
bits: 5,6,7 and 8 of a device status register.
Channel num info the same, but over bits: 1, 2 and 3.
Mask both values in order to avoid touching other register bits, since the first info (avg sample), came from DT.
--- drivers/iio/adc/spear_adc.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/iio/adc/spear_adc.c +5 -4
@@ -14,6 +14,7 @@#include <linux/kernel.h> #include <linux/slab.h> #include <linux/io.h> +#include <linux/bitfield.h> #include <linux/clk.h> #include <linux/err.h> #include <linux/completion.h>
@@ -29,9 +30,9 @@/* Bit definitions for SPEAR_ADC_STATUS */ #define SPEAR_ADC_STATUS_START_CONVERSION BIT(0) -#define SPEAR_ADC_STATUS_CHANNEL_NUM (x) ((x) << 1) +#define SPEAR_ADC_STATUS_CHANNEL_NUM_MASK GENMASK(3, 1)#define SPEAR_ADC_STATUS_ADC_ENABLE BIT(4) -#define SPEAR_ADC_STATUS_AVG_SAMPLE (x) ((x) << 5) +#define SPEAR_ADC_STATUS_AVG_SAMPLE_MASK GENMASK(8, 5)#define SPEAR_ADC_STATUS_VREF_INTERNAL BIT(9)#define SPEAR_ADC_DATA_MASK 0x03ff
@@ -157,8 +158,8 @@ static int spear_adc_read_raw(struct iio_dev *indio_dev,case IIO_CHAN_INFO_RAW :mutex_lock (&st->lock); - status =SPEAR_ADC_STATUS_CHANNEL_NUM (chan->channel) | -SPEAR_ADC_STATUS_AVG_SAMPLE (st->avg_samples) | + status =FIELD_PREP (SPEAR_ADC_STATUS_CHANNEL_NUM_MASK , chan->channel) | +FIELD_PREP (SPEAR_ADC_STATUS_AVG_SAMPLE_MASK , st->avg_samples) |SPEAR_ADC_STATUS_START_CONVERSION |SPEAR_ADC_STATUS_ADC_ENABLE ;if (st->vref_external ==0 )
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 228/565 iio: adc: imx93_adc: load calibrated values even calibration failed
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haibo Chen <[email protected]>
[ Upstream commit 12c9b09e981ab14ebec8e4eefa946cbd26dd306b ]
ADC calibration might fail because of the noise on reference voltage. To avoid calibration fail, need to meet the following requirement:
ADC reference voltage Noise < 1.8V * 1/2^ENOB
For the case which the ADC reference voltage on board do not meet the requirement, still load the calibrated values, so ADC can also work but maybe not that accurate.
--- drivers/iio/adc/imx93_adc.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
drivers/iio/adc/imx93_adc.c +15 -3
@@ -38,6 +38,7 @@#define IMX93_ADC_PCDR6 0x118#define IMX93_ADC_PCDR7 0x11c#define IMX93_ADC_CALSTAT 0x39C +#define IMX93_ADC_CALCFG0 0x3A0/* ADC bit shift */ #define IMX93_ADC_MCR_MODE_MASK BIT(29)
@@ -58,6 +59,8 @@#define IMX93_ADC_IMR_ECH_MASK BIT(0)#define IMX93_ADC_PCDR_CDATA_MASK GENMASK(11, 0) +#define IMX93_ADC_CALCFG0_LDFAIL_MASK BIT(4) +/* ADC status */ #define IMX93_ADC_MSR_ADCSTATUS_IDLE 0#define IMX93_ADC_MSR_ADCSTATUS_POWER_DOWN 1
@@ -145,7 +148,7 @@ static void imx93_adc_config_ad_clk(struct imx93_adc *adc)static int imx93_adc_calibration (struct imx93_adc *adc) { -u32 mcr, msr; +u32 mcr, msr, calcfg;int ret;/* make sure ADC in power down mode */
@@ -158,6 +161,11 @@ static int imx93_adc_calibration(struct imx93_adc *adc)imx93_adc_power_up (adc); +/* Enable loading of calibrated values even in fail condition */ + calcfg =readl (adc->regs +IMX93_ADC_CALCFG0 ); + calcfg |=IMX93_ADC_CALCFG0_LDFAIL_MASK ; +writel (calcfg, adc->regs +IMX93_ADC_CALCFG0 ); +/* * TODO: we use the default TSAMP/NRSMPL/AVGEN in MCR, * can add the setting of these bit if need in future.
@@ -180,9 +188,13 @@ static int imx93_adc_calibration(struct imx93_adc *adc)/* check whether calbration is success or not */ msr =readl (adc->regs +IMX93_ADC_MSR );if (msr &IMX93_ADC_MSR_CALFAIL_MASK ) { +/* +* Only give warning here, this means the noise of the +* reference voltage do not meet the requirement: +* ADC reference voltage Noise < 1.8V * 1/2^ENOB +* And the resault of ADC is not that accurate. +*/ dev_warn (adc->dev,"ADC calibration failed!\n" ); -imx93_adc_power_down (adc); -return -EAGAIN ; }return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 229/565 usb: gadget: f_ncm: Fix MAC assignment NCM ethernet
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: raub camaioni <[email protected]>
[ Upstream commit 956606bafb5fc6e5968aadcda86fc0037e1d7548 ]
This fix is already present in f_ecm.c and was never propagated to f_ncm.c
When creating multiple NCM ethernet devices
on a composite usb gadget device
each MAC address on the HOST side will be identical. Having the same MAC on different network interfaces is bad.
This fix updates the MAC address inside the ncm_strings_defs global during the ncm_bind call. This ensures each device has a unique MAC.
In f_ecm.c ecm_string_defs is updated in the same way.
The defunct MAC assignment in ncm_alloc has been removed.
--- drivers/usb/gadget/function/f_ncm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/gadget/function/f_ncm.c +2 -1
@@ -1464,6 +1464,8 @@ static int ncm_bind(struct usb_configuration *c, struct usb_function *f) ncm_opts->bound = true; + ncm_string_defs[1 ].s = ncm->ethaddr; + us =usb_gstrings_attach (cdev, ncm_strings,ARRAY_SIZE (ncm_string_defs));if (IS_ERR (us))
@@ -1759,7 +1761,6 @@ static struct usb_function *ncm_alloc(struct usb_function_instance *fi)mutex_unlock (&opts->lock);return ERR_PTR (-EINVAL ); } - ncm_string_defs[STRING_MAC_IDX ].s = ncm->ethaddr;spin_lock_init (&ncm->lock);ncm_reset_values (ncm);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 230/565 wifi: rtw89: wow: remove notify during WoWLAN net-detect
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuan-Chung Chen <[email protected]>
[ Upstream commit 38846585f9df9af1f7261d85134a5510fc079458 ]
In WoWLAN net-detect mode, the firmware periodically performs scans and sends scan reports via C2H, which driver does not need. These unnecessary C2H events cause firmware watchdog timeout, leading to unexpected wakeups and SER 0x2599 on 8922AE.
--- drivers/net/wireless/realtek/rtw89/fw.c | 2 -- 1 file changed, 2 deletions(-)
drivers/net/wireless/realtek/rtw89/fw.c +0 -2
@@ -6212,7 +6212,6 @@ static void rtw89_pno_scan_add_chan_ax(struct rtw89_dev *rtwdev,struct rtw89_pktofld_info *info;u8 probe_count =0 ; - ch_info->notify_action =RTW89_SCANOFLD_DEBUG_MASK ; ch_info->dfs_ch = chan_type ==RTW89_CHAN_DFS ; ch_info->bw =RTW89_SCAN_WIDTH ; ch_info->tx_pkt = true;
@@ -6341,7 +6340,6 @@ static void rtw89_pno_scan_add_chan_be(struct rtw89_dev *rtwdev, int chan_type,struct rtw89_pktofld_info *info;u8 probe_count =0 , i; - ch_info->notify_action =RTW89_SCANOFLD_DEBUG_MASK ; ch_info->dfs_ch = chan_type ==RTW89_CHAN_DFS ; ch_info->bw =RTW89_SCAN_WIDTH ; ch_info->tx_null = false;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 231/565 wifi: rtw89: fix BSSID comparison for non-transmitted BSSID
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuan-Chung Chen <[email protected]>
[ Upstream commit c4c16c88e78417424b4e3f33177e84baf0bc9a99 ]
For non-transmitted connections, beacons are received from the transmitted BSSID. Fix this to avoid missing beacon statistics.
--- drivers/net/wireless/realtek/rtw89/core.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtw89/core.c +5 -1
@@ -2074,6 +2074,7 @@ static void rtw89_vif_rx_stats_iter(void *data, u8 *mac,struct ieee80211_bss_conf *bss_conf;struct rtw89_vif_link *rtwvif_link;const u8 *bssid = iter_data->bssid; +const u8 *target_bssid; if (rtwdev->scanning && (ieee80211_is_beacon(hdr->frame_control) ||
@@ -2098,7 +2099,10 @@ static void rtw89_vif_rx_stats_iter(void *data, u8 *mac, goto out; } -if (!ether_addr_equal (bss_conf->bssid, bssid)) + target_bssid =ieee80211_is_beacon (hdr->frame_control) && + bss_conf->nontransmitted ? + bss_conf->transmitter_bssid : bss_conf->bssid; +if (!ether_addr_equal (target_bssid, bssid)) goto out;if (ieee80211_is_beacon (hdr->frame_control)) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 232/565 dm error: mark as DM_TARGET_PASSES_INTEGRITY
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Hellwig <[email protected]>
[ Upstream commit 499cbe0f2fb0641cf07a1a8ac9f7317674295fea ]
Mark dm error as DM_TARGET_PASSES_INTEGRITY so that it can be stacked on top of PI capable devices. The claim is strictly speaking as lie as dm error fails all I/O and doesn't pass anything on, but doing the same for integrity I/O work just fine :)
This helps to make about two dozen xfstests test cases pass on PI capable devices.
--- drivers/md/dm-target.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/md/dm-target.c +2 -1
@@ -263,7 +263,8 @@ static long io_err_dax_direct_access(struct dm_target *ti, pgoff_t pgoff,static struct target_type error_target = { .name ="error" , .version = {1 ,7 ,0 }, - .features =DM_TARGET_WILDCARD |DM_TARGET_ZONED_HM , + .features =DM_TARGET_WILDCARD |DM_TARGET_ZONED_HM | +DM_TARGET_PASSES_INTEGRITY , .ctr = io_err_ctr, .dtr = io_err_dtr, .map = io_err_map,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 233/565 char: misc: Make misc_register() reentry for miscdevice who wants dynamic minor
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijun Hu <[email protected]>
[ Upstream commit 52e2bb5ff089d65e2c7d982fe2826dc88e473d50 ]
For miscdevice who wants dynamic minor, it may fail to be registered again without reinitialization after being de-registered, which is illustrated by kunit test case miscdev_test_dynamic_reentry() newly added.
There is a real case found by cascardo when a part of minor range were contained by range [0, 255):
1) wmi/dell-smbios registered minor 122, and acpi_thermal_rel registered minor 123
2) unbind "int3400 thermal" driver from its device, this will de-register acpi_thermal_rel
3) rmmod then insmod dell_smbios again, now wmi/dell-smbios is using minor 123
4) bind the device to "int3400 thermal" driver again, acpi_thermal_rel fails to register.
Some drivers may reuse the miscdevice structure after they are deregistered If the intention is to allocate a dynamic minor, if the minor number is not reset to MISC_DYNAMIC_MINOR before calling misc_register(), it will try to register a previously dynamically allocated minor number, which may have been registered by a different driver.
One such case is the acpi_thermal_rel misc device, registered by the int3400 thermal driver. If the device is unbound from the driver and later bound, if there was another dynamic misc device registered in between, it would fail to register the acpi_thermal_rel misc device. Other drivers behave similarly.
Actually, this kind of issue is prone to happen if APIs misc_register()/misc_deregister() are invoked by driver's probe()/remove() separately.
Instead of fixing all the drivers, just reset the minor member to MISC_DYNAMIC_MINOR in misc_deregister() in case it was a dynamically allocated minor number, as error handling of misc_register() does.
--- drivers/char/misc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/char/misc.c +2 -0
@@ -300,6 +300,8 @@ void misc_deregister(struct miscdevice *misc)list_del (&misc->list);device_destroy (&misc_class,MKDEV (MISC_MAJOR , misc->minor));misc_minor_free (misc->minor); +if (misc->minor >MISC_DYNAMIC_MINOR ) + misc->minor =MISC_DYNAMIC_MINOR ;mutex_unlock (&misc_mtx); }EXPORT_SYMBOL (misc_deregister);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 234/565 char: misc: Does not request module for miscdevice with dynamic minor
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijun Hu <[email protected]>
[ Upstream commit 1ba0fb42aa6a5f072b1b8c0b0520b32ad4ef4b45 ]
misc_open() may request module for miscdevice with dynamic minor, which is meaningless since:
- The dynamic minor allocated is unknown in advance without registering miscdevice firstly.
- Macro MODULE_ALIAS_MISCDEV() is not applicable for dynamic minor.
Fix by only requesting module for miscdevice with fixed minor.
--- drivers/char/misc.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/char/misc.c +5 -3
@@ -150,7 +150,8 @@ static int misc_open(struct inode *inode, struct file *file)break ; } -if (!new_fops) { +/* Only request module for fixed minor code */ +if (!new_fops && minor <MISC_DYNAMIC_MINOR ) {mutex_unlock (&misc_mtx);request_module ("char-major-%d-%d" ,MISC_MAJOR , minor);mutex_lock (&misc_mtx);
@@ -162,10 +163,11 @@ static int misc_open(struct inode *inode, struct file *file) new_fops =fops_get (iter->fops);break ; } -if (!new_fops) - goto fail; } +if (!new_fops) + goto fail; +/* * Place the miscdevice in the file's * private_data so it can be used by the
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 235/565 net: When removing nexthops, dont call synchronize_net if it is not necessary
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Paasch <[email protected]>
[ Upstream commit b0ac6d3b56a2384db151696cfda2836a8a961b6d ]
When removing a nexthop, commit90f33bffa382 ("nexthops: don't modify published nexthop groups") added a call to synchronize_rcu() (later changed to _net()) to make sure everyone sees the new nexthop-group before the rtnl-lock is released.
When one wants to delete a large number of groups and nexthops, it is fastest to first flush the groups (ip nexthop flush groups) and then flush the nexthops themselves (ip -6 nexthop flush). As that way the groups don't need to be rebalanced.
However, ip -6 nexthop flush will still take a long time if there is a very large number of nexthops because of the call to synchronize_net(). Now, if there are no more groups, there is no point in calling synchronize_net(). So, let's skip that entirely by checking if nh->grp_list is empty.
This gives us a nice speedup:
BEFORE:
=======
$ time sudo ip -6 nexthop flush Dump was interrupted and may be inconsistent. Flushed 2097152 nexthops
real 1m45.345s
user 0m0.001s
sys 0m0.005s
$ time sudo ip -6 nexthop flush Dump was interrupted and may be inconsistent. Flushed 4194304 nexthops
real 3m10.430s
user 0m0.002s
sys 0m0.004s
AFTER:
======
$ time sudo ip -6 nexthop flush Dump was interrupted and may be inconsistent. Flushed 2097152 nexthops
real 0m17.545s
user 0m0.003s
sys 0m0.003s
$ time sudo ip -6 nexthop flush Dump was interrupted and may be inconsistent. Flushed 4194304 nexthops
real 0m35.823s
user 0m0.002s
sys 0m0.004s
--- net/ipv4/nexthop.c | 6 ++++++ 1 file changed, 6 insertions(+)
net/ipv4/nexthop.c +6 -0
@@ -2074,6 +2074,12 @@ static void remove_nexthop_from_groups(struct net *net, struct nexthop *nh, {struct nh_grp_entry *nhge, *tmp; +/* If there is nothing to do, let's avoid the costly call to +* synchronize_net() +*/ +if (list_empty (&nh->grp_list)) +return ; +list_for_each_entry_safe (nhge, tmp, &nh->grp_list, nh_list)remove_nh_grp_entry (net, nhge, nlinfo);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 236/565 net: stmmac: Correctly handle Rx checksum offload errors
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksij Rempel <[email protected]>
[ Upstream commit ee0aace5f844ef59335148875d05bec8764e71e8 ]
The stmmac_rx function would previously set skb->ip_summed to CHECKSUM_UNNECESSARY if hardware checksum offload (CoE) was enabled and the packet was of a known IP ethertype.
However, this logic failed to check if the hardware had actually reported a checksum error. The hardware status, indicating a header or payload checksum failure, was being ignored at this stage. This could cause corrupt packets to be passed up the network stack as valid.
This patch corrects the logic by checking the csum_none status flag, which is set when the hardware reports a checksum error. If this flag is set, skb->ip_summed is now correctly set to CHECKSUM_NONE, ensuring the kernel's network stack will perform its own validation and properly handle the corrupt packet.
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +2 -1
@@ -5658,7 +5658,8 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) skb->protocol =eth_type_trans (skb, priv->dev); -if (unlikely (!coe) || !stmmac_has_ip_ethertype (skb)) +if (unlikely (!coe) || !stmmac_has_ip_ethertype (skb) || + (status & csum_none))skb_checksum_none_assert (skb);else skb->ip_summed =CHECKSUM_UNNECESSARY ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 237/565 net: Call trace_sock_exceed_buf_limit() for memcg failure with SK_MEM_RECV.
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 9d85c565a7b7c78b732393c02bcaa4d5c275fe58 ]
Initially, trace_sock_exceed_buf_limit() was invoked when __sk_mem_raise_allocated() failed due to the memcg limit or the global limit.
However, commit d6f19938eb031 ("net: expose sk wmem in sock_exceed_buf_limit tracepoint") somehow suppressed the event only when memcg failed to charge for SK_MEM_RECV, although the memcg failure for SK_MEM_SEND still triggers the event.
Let's restore the event for SK_MEM_RECV.
--- net/core/sock.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
net/core/sock.c +1 -2
@@ -3267,8 +3267,7 @@ int __sk_mem_raise_allocated(struct sock *sk, int size, int amt, int kind) } } -if (kind ==SK_MEM_SEND || (kind ==SK_MEM_RECV && charged)) -trace_sock_exceed_buf_limit (sk, prot, allocated, kind); +trace_sock_exceed_buf_limit (sk, prot, allocated, kind);sk_memory_allocated_sub (sk, amt);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 238/565 f2fs: fix to detect potential corrupted nid in free_nid_list
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 8fc6056dcf79937c46c97fa4996cda65956437a9 ]
As reported, on-disk footer.ino and footer.nid is the same and out-of-range, let's add sanity check on f2fs_alloc_nid() to detect any potential corruption in free_nid_list.
--- fs/f2fs/node.c | 17 ++++++++++++++++- include/linux/f2fs_fs.h | 1 + 2 files changed, 17 insertions(+), 1 deletion(-)
fs/f2fs/node.c +16 -1
@@ -27,12 +27,17 @@ static struct kmem_cache *free_nid_slab;static struct kmem_cache *nat_entry_set_slab;static struct kmem_cache *fsync_node_entry_slab; +static inline bool is_invalid_nid (struct f2fs_sb_info *sbi,nid_t nid) +{ +return nid <F2FS_ROOT_INO (sbi) || nid >=NM_I (sbi)->max_nid; +} +/* * Check whether the given nid is within node id range. */ int f2fs_check_nid_range (struct f2fs_sb_info *sbi,nid_t nid) { -if (unlikely (nid <F2FS_ROOT_INO (sbi) || nid >=NM_I (sbi)->max_nid)) { +if (unlikely (is_invalid_nid (sbi, nid))) {set_sbi_flag (sbi,SBI_NEED_FSCK );f2fs_warn (sbi,"%s: out-of-range nid=%x, run fsck to fix." , __func__, nid);
@@ -2609,6 +2614,16 @@ bool f2fs_alloc_nid(struct f2fs_sb_info *sbi, nid_t *nid)f2fs_bug_on (sbi,list_empty (&nm_i->free_nid_list)); i =list_first_entry (&nm_i->free_nid_list, struct free_nid, list); + +if (unlikely (is_invalid_nid (sbi, i->nid))) { +spin_unlock (&nm_i->nid_list_lock); +f2fs_err (sbi,"Corrupted nid %u in free_nid_list" , + i->nid); +f2fs_stop_checkpoint (sbi, false, +STOP_CP_REASON_CORRUPTED_NID ); +return false; + } + *nid = i->nid;__move_free_nid (sbi, i,FREE_NID ,PREALLOC_NID );
include/linux/f2fs_fs.h +1 -0
@@ -79,6 +79,7 @@ enum stop_cp_reason {STOP_CP_REASON_FLUSH_FAIL ,STOP_CP_REASON_NO_SEGMENT ,STOP_CP_REASON_CORRUPTED_FREE_BITMAP , +STOP_CP_REASON_CORRUPTED_NID , STOP_CP_REASON_MAX, };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 239/565 PCI/P2PDMA: Fix incorrect pointer usage in devm_kfree() call
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sungho Kim <[email protected]>
[ Upstream commit 6238784e502b6a9fbeb3a6b77284b29baa4135cc ]
The error handling path in pci_p2pdma_add_resource() contains a bug in its pgmap_free label.
Memory is allocated for the p2p_pgmap struct, and the pointer is stored in p2p_pgmap. However, the error path calls devm_kfree() with pgmap, which is a pointer to a member field within the p2p_pgmap struct, not the base pointer of the allocation.
Correct the bug by passing the correct base pointer, p2p_pgmap, to devm_kfree().
--- drivers/pci/p2pdma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/p2pdma.c +1 -1
@@ -351,7 +351,7 @@ int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, size_t size, pages_free:devm_memunmap_pages (&pdev->dev, pgmap); pgmap_free: -devm_kfree (&pdev->dev, pgmap); +devm_kfree (&pdev->dev, p2p_pgmap);return error; }EXPORT_SYMBOL_GPL (pci_p2pdma_add_resource);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 240/565 bnxt_en: Add Hyper-V VF ID
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pavan Chebbi <[email protected]>
[ Upstream commit 5be7cb805bd9a6680b863a1477dbc6e7986cc223 ]
VFs of the P7 chip family created by Hyper-V will have the device ID of 0x181b.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 5 ++++- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +4 -1
@@ -139,6 +139,7 @@ static const struct { [NETXTREME_E_P5_VF] = { "Broadcom BCM5750X NetXtreme-E Ethernet Virtual Function" }, [NETXTREME_E_P5_VF_HV] = { "Broadcom BCM5750X NetXtreme-E Virtual Function for Hyper-V" }, [NETXTREME_E_P7_VF] = { "Broadcom BCM5760X Virtual Function" }, + [NETXTREME_E_P7_VF_HV] = { "Broadcom BCM5760X Virtual Function for Hyper-V" }, };static const struct pci_device_id bnxt_pci_tbl[] = {
@@ -214,6 +215,7 @@ static const struct pci_device_id bnxt_pci_tbl[] = { { PCI_VDEVICE(BROADCOM, 0x1808), .driver_data = NETXTREME_E_P5_VF_HV }, { PCI_VDEVICE(BROADCOM, 0x1809), .driver_data = NETXTREME_E_P5_VF_HV }, { PCI_VDEVICE(BROADCOM, 0x1819), .driver_data = NETXTREME_E_P7_VF }, + { PCI_VDEVICE(BROADCOM, 0x181b), .driver_data = NETXTREME_E_P7_VF_HV }, { PCI_VDEVICE(BROADCOM, 0xd800), .driver_data = NETXTREME_S_VF }, #endif { 0 }
@@ -297,7 +299,8 @@ static bool bnxt_vf_pciid(enum board_idx idx)return (idx ==NETXTREME_C_VF || idx ==NETXTREME_E_VF || idx ==NETXTREME_S_VF || idx ==NETXTREME_C_VF_HV || idx ==NETXTREME_E_VF_HV || idx ==NETXTREME_E_P5_VF || - idx ==NETXTREME_E_P5_VF_HV || idx ==NETXTREME_E_P7_VF ); + idx ==NETXTREME_E_P5_VF_HV || idx ==NETXTREME_E_P7_VF || + idx ==NETXTREME_E_P7_VF_HV ); }#define DB_CP_REARM_FLAGS (DB_KEY_CP | DB_IDX_VALID)
drivers/net/ethernet/broadcom/bnxt/bnxt.h +1 -0
@@ -2096,6 +2096,7 @@ enum board_idx {NETXTREME_E_P5_VF ,NETXTREME_E_P5_VF_HV ,NETXTREME_E_P7_VF , + NETXTREME_E_P7_VF_HV, }; struct bnxt {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 241/565 tty: serial: Modify the use of dev_err_probe()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xichao Zhao <[email protected]>
[ Upstream commit 706c3c02eecd41dc675e9102b3719661cd3e30e2 ]
The dev_err_probe() doesn't do anything when error is '-ENOMEM'. Make the following two changes:
(1) Replace -ENOMEM with -ENOSPC in max3100_probe().
(2) Just return -ENOMEM instead in max310x_probe().
--- drivers/tty/serial/max3100.c | 2 +- drivers/tty/serial/max310x.c | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-)
drivers/tty/serial/max3100.c +1 -1
@@ -704,7 +704,7 @@ static int max3100_probe(struct spi_device *spi)break ;if (i ==MAX_MAX3100 ) {mutex_unlock (&max3100s_lock); -return dev_err_probe (dev, -ENOMEM ,"too many MAX3100 chips\n" ); +return dev_err_probe (dev, -ENOSPC ,"too many MAX3100 chips\n" ); } max3100s[i] =kzalloc (sizeof (struct max3100_port ),GFP_KERNEL );
drivers/tty/serial/max310x.c +1 -2
@@ -1266,8 +1266,7 @@ static int max310x_probe(struct device *dev, const struct max310x_devtype *devty/* Alloc port structure */ s =devm_kzalloc (dev,struct_size (s, p, devtype->nr),GFP_KERNEL );if (!s) -return dev_err_probe (dev, -ENOMEM , -"Error allocating port structure\n" ); +return -ENOMEM ;/* Always ask for fixed clock rate from a property. */ device_property_read_u32 (dev,"clock-frequency" , &uartclk);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 242/565 ALSA: usb-audio: Add validation of UAC2/UAC3 effect units
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 2aec0b6a6b5395bca7d6fde9c7e9dc391d329698 ]
Just add fixed struct size validations for UAC2 and UAC3 effect units. The descriptor has a variable-length array, so it should be validated with a proper function later once when the unit is really parsed and used by the driver (currently only referred partially for the input terminal parsing).
--- sound/usb/validate.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
sound/usb/validate.c +7 -2
@@ -266,7 +266,11 @@ static const struct usb_desc_validator audio_validators[] = {FUNC (UAC_VERSION_2 ,UAC_MIXER_UNIT , validate_mixer_unit),FUNC (UAC_VERSION_2 ,UAC_SELECTOR_UNIT , validate_selector_unit),FUNC (UAC_VERSION_2 ,UAC_FEATURE_UNIT , validate_uac2_feature_unit), -/* UAC_VERSION_2, UAC2_EFFECT_UNIT: not implemented yet */ +/* just a stop-gap, it should be a proper function for the array +* once if the unit is really parsed/used +*/ +FIXED (UAC_VERSION_2 ,UAC2_EFFECT_UNIT , + struct uac2_effect_unit_descriptor),FUNC (UAC_VERSION_2 ,UAC2_PROCESSING_UNIT_V2 , validate_processing_unit),FUNC (UAC_VERSION_2 ,UAC2_EXTENSION_UNIT_V2 , validate_processing_unit), FIXED(UAC_VERSION_2, UAC2_CLOCK_SOURCE,
@@ -286,7 +290,8 @@ static const struct usb_desc_validator audio_validators[] = {FUNC (UAC_VERSION_3 ,UAC3_MIXER_UNIT , validate_mixer_unit),FUNC (UAC_VERSION_3 ,UAC3_SELECTOR_UNIT , validate_selector_unit),FUNC (UAC_VERSION_3 ,UAC3_FEATURE_UNIT , validate_uac3_feature_unit), -/* UAC_VERSION_3, UAC3_EFFECT_UNIT: not implemented yet */ +FIXED (UAC_VERSION_3 ,UAC3_EFFECT_UNIT , + struct uac2_effect_unit_descriptor), /* sharing the same struct */FUNC (UAC_VERSION_3 ,UAC3_PROCESSING_UNIT , validate_processing_unit),FUNC (UAC_VERSION_3 ,UAC3_EXTENSION_UNIT , validate_processing_unit), FIXED(UAC_VERSION_3, UAC3_CLOCK_SOURCE,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 243/565 idpf: do not linearize big TSO packets
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 02614eee26fbdfd73b944769001cefeff6ed008c ]
idpf has a limit on number of scatter-gather frags that can be used per segment.
Currently, idpf_tx_start() checks if the limit is hit and forces a linearization of the whole packet.
This requires high order allocations that can fail under memory pressure. A full size BIG-TCP packet would require order-7 alocation on x86_64 :/
We can move the check earlier from idpf_features_check() for TSO packets, to force GSO in this case, removing the cost of a big copy.
This means that a linearization will eventually happen with sizes smaller than one MSS.
__idpf_chk_linearize() is renamed to idpf_chk_tso_segment() and moved to idpf_lib.c
--- drivers/net/ethernet/intel/idpf/idpf.h | 2 + drivers/net/ethernet/intel/idpf/idpf_lib.c | 102 +++++++++++++++- drivers/net/ethernet/intel/idpf/idpf_txrx.c | 129 ++++---------------- 3 files changed, 120 insertions(+), 113 deletions(-)
drivers/net/ethernet/intel/idpf/idpf.h +2 -0
@@ -144,6 +144,7 @@ enum idpf_vport_state {* @link_speed_mbps: Link speed in mbps * @vport_idx: Relative vport index * @max_tx_hdr_size: Max header length hardware can support +* @tx_max_bufs: Max buffers that can be transmitted with scatter-gather * @state: See enum idpf_vport_state * @netstats: Packet and byte stats * @stats_lock: Lock to protect stats update
@@ -155,6 +156,7 @@ struct idpf_netdev_priv {u32 link_speed_mbps;u16 vport_idx;u16 max_tx_hdr_size; +u16 tx_max_bufs;enum idpf_vport_state state;struct rtnl_link_stats64 netstats;spinlock_t stats_lock;
drivers/net/ethernet/intel/idpf/idpf_lib.c +96 -6
120 lines not on this page · raw message
drivers/net/ethernet/intel/idpf/idpf_txrx.c +22 -107
141 lines not on this page · raw message
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 244/565 rds: Fix endianness annotation for RDS_MPATH_HASH
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ujwal Kundur <[email protected]>
[ Upstream commit 77907a068717fbefb25faf01fecca553aca6ccaa ]
jhash_1word accepts host endian inputs while rs_bound_port is a be16 value (sockaddr_in6.sin6_port). Use ntohs() for consistency.
Flagged by Sparse.
--- net/rds/rds.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/rds/rds.h +1 -1
@@ -93,7 +93,7 @@ enum {/* Max number of multipaths per RDS connection. Must be a power of 2 */ #define RDS_MPATH_WORKERS 8 -#define RDS_MPATH_HASH (rs, n) (jhash_1word((rs)->rs_bound_port, \ +#define RDS_MPATH_HASH (rs, n) (jhash_1word(ntohs((rs)->rs_bound_port), \ (rs)->rs_hash_initval) & ((n) - 1))#define IS_CANONICAL (laddr, faddr) (htonl(laddr) < htonl(faddr))
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 245/565 net: wangxun: limit tx_max_coalesced_frames_irq
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiawen Wu <[email protected]>
[ Upstream commit fd4aa243f154a80bbeb3dd311d2114eeb538f479 ]
Add limitation on tx_max_coalesced_frames_irq as 0 ~ 65535, because 'wx->tx_work_limit' is declared as a member of type u16.
--- drivers/net/ethernet/wangxun/libwx/wx_ethtool.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/net/ethernet/wangxun/libwx/wx_ethtool.c +5 -2
@@ -319,8 +319,11 @@ int wx_set_coalesce(struct net_device *netdev,return -EOPNOTSUPP ; } -if (ec->tx_max_coalesced_frames_irq) - wx->tx_work_limit = ec->tx_max_coalesced_frames_irq; +if (ec->tx_max_coalesced_frames_irq >U16_MAX || + !ec->tx_max_coalesced_frames_irq) +return -EINVAL ; + + wx->tx_work_limit = ec->tx_max_coalesced_frames_irq;if (wx->mac.type == wx_mac_sp) max_eitr =WX_SP_MAX_EITR ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 246/565 media: ipu6: isys: Set embedded data type correctly for metadata formats
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sakari Ailus <[email protected]>
[ Upstream commit f5a2826cd50c6fd1af803812d1d910a64ae8e0a1 ]
The IPU6 ISYS driver supported metadata formats but was missing correct embedded data type in the receiver configuration. Add it now.
--- drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c +6 -0
@@ -81,6 +81,12 @@ unsigned int ipu6_isys_mbus_code_to_mipi(u32 code)case MEDIA_BUS_FMT_SGRBG8_1X8 :case MEDIA_BUS_FMT_SRGGB8_1X8 :return MIPI_CSI2_DT_RAW8 ; +case MEDIA_BUS_FMT_META_8 : +case MEDIA_BUS_FMT_META_10 : +case MEDIA_BUS_FMT_META_12 : +case MEDIA_BUS_FMT_META_16 : +case MEDIA_BUS_FMT_META_24 : +return MIPI_CSI2_DT_EMBEDDED_8B ;default :/* return unavailable MIPI data type - 0x3f */ WARN_ON (1 );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 247/565 rpmsg: char: Export alias for RPMSG ID rpmsg-raw from table
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrew Davis <[email protected]>
[ Upstream commit 6e29c30d8ddea6109ea7e0b9f17e7841df0794ea ]
Module aliases are used by userspace to identify the correct module to load for a detected hardware. The currently supported RPMSG device IDs for this module include "rpmsg-raw", but the module alias is "rpmsg_chrdev".
Use the helper macro MODULE_DEVICE_TABLE(rpmsg) to export the correct supported IDs. And while here, to keep backwards compatibility we also add the other ID "rpmsg_chrdev" so that it is also still exported as an alias.
This has the side benefit of adding support for some legacy firmware which still uses the original "rpmsg_chrdev" ID. This was the ID used for this driver before it was upstreamed (as reflected by the module alias).
--- drivers/rpmsg/rpmsg_char.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/rpmsg/rpmsg_char.c +2 -1
@@ -522,8 +522,10 @@ static void rpmsg_chrdev_remove(struct rpmsg_device *rpdev)static struct rpmsg_device_id rpmsg_chrdev_id_table[] = { { .name ="rpmsg-raw" }, + { .name ="rpmsg_chrdev" }, { }, }; +MODULE_DEVICE_TABLE (rpmsg, rpmsg_chrdev_id_table);static struct rpmsg_driver rpmsg_chrdev_driver = { .probe = rpmsg_chrdev_probe,
@@ -565,6 +567,5 @@ static void rpmsg_chrdev_exit(void) }module_exit (rpmsg_chrdev_exit); -MODULE_ALIAS ("rpmsg:rpmsg_chrdev" );MODULE_DESCRIPTION ("RPMSG device interface" );MODULE_LICENSE ("GPL v2" );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 248/565 net: ipv4: allow directed broadcast routes to use dst hint
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oscar Maes <[email protected]>
[ Upstream commit 1b8c5fa0cb35efd08f07f700e6d78a541ebabe26 ]
Currently, ip_extract_route_hint uses RTN_BROADCAST to decide whether to use the route dst hint mechanism.
This check is too strict, as it prevents directed broadcast routes from using the hint, resulting in poor performance during bursts of directed broadcast traffic.
Fix this in ip_extract_route_hint and modify ip_route_use_hint to preserve the intended behaviour.
--- net/ipv4/ip_input.c | 11 +++++++---- net/ipv4/route.c | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-)
net/ipv4/ip_input.c +7 -4
@@ -582,9 +582,13 @@ static void ip_sublist_rcv_finish(struct list_head *head) }static struct sk_buff *ip_extract_route_hint (const struct net *net, -struct sk_buff *skb,int rt_type) +struct sk_buff *skb) { -if (fib4_has_custom_rules (net) || rt_type ==RTN_BROADCAST || +const struct iphdr *iph =ip_hdr (skb); + +if (fib4_has_custom_rules (net) || +ipv4_is_lbcast (iph->daddr) || +ipv4_is_zeronet (iph->daddr) ||IPCB (skb)->flags &IPSKB_MULTIPATH )return NULL ;
@@ -614,8 +618,7 @@ static void ip_list_rcv_finish(struct net *net, struct sock *sk, dst =skb_dst (skb);if (curr_dst != dst) { - hint =ip_extract_route_hint (net, skb, -dst_rtable (dst)->rt_type); + hint =ip_extract_route_hint (net, skb);/* dispatch old sublist */ if (!list_empty (&sublist))
net/ipv4/route.c +1 -1
@@ -2187,7 +2187,7 @@ int ip_route_use_hint(struct sk_buff *skb, __be32 daddr, __be32 saddr,if (ipv4_is_loopback (saddr) && !IN_DEV_NET_ROUTE_LOCALNET (in_dev, net)) goto martian_source; -if (rt->rt_type !=RTN_LOCAL ) +if (!(rt->rt_flags &RTCF_LOCAL )) goto skip_validate_source; tos &=INET_DSCP_MASK ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 249/565 scsi: mpi3mr: Fix I/O failures during controller reset
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chandrakanth Patil <[email protected]>
[ Upstream commit b7b2176e30fc8e57664e5a8a23387af66eb7f72b ]
I/Os can race with controller reset and fail.
Block requests at the mid layer when reset starts using scsi_host_block(), and resume with scsi_host_unblock() after reset completes.
--- drivers/scsi/mpi3mr/mpi3mr_fw.c | 3 +++ drivers/scsi/mpi3mr/mpi3mr_os.c | 2 ++ 2 files changed, 5 insertions(+)
drivers/scsi/mpi3mr/mpi3mr_fw.c +3 -0
@@ -5372,6 +5372,7 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc, mpi3mr_reset_rc_name(reset_reason)); mrioc->device_refresh_on =0 ; +scsi_block_requests (mrioc->shost); mrioc->reset_in_progress =1 ; mrioc->stop_bsgs =1 ; mrioc->prev_reset_result =-1 ;
@@ -5480,6 +5481,7 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc,if (!retval) { mrioc->diagsave_timeout =0 ; mrioc->reset_in_progress =0 ; +scsi_unblock_requests (mrioc->shost); mrioc->pel_abort_requested =0 ;if (mrioc->pel_enabled) { mrioc->pel_cmds.retry_count =0 ;
@@ -5504,6 +5506,7 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc, mrioc->device_refresh_on =0 ; mrioc->unrecoverable =1 ; mrioc->reset_in_progress =0 ; +scsi_unblock_requests (mrioc->shost); mrioc->stop_bsgs =0 ; retval =-1 ;mpi3mr_flush_cmds_for_unrecovered_controller (mrioc);
drivers/scsi/mpi3mr/mpi3mr_os.c +2 -0
@@ -2839,12 +2839,14 @@ static void mpi3mr_preparereset_evt_th(struct mpi3mr_ioc *mrioc, "prepare for reset event top half with rc=start\n");if (mrioc->prepare_for_reset)return ; +scsi_block_requests (mrioc->shost); mrioc->prepare_for_reset =1 ; mrioc->prepare_for_reset_timeout_counter =0 ; }else if (evtdata->reason_code ==MPI3_EVENT_PREPARE_RESET_RC_ABORT ) {dprint_event_th (mrioc,"prepare for reset top half with rc=abort\n" ); mrioc->prepare_for_reset =0 ; +scsi_unblock_requests (mrioc->shost); mrioc->prepare_for_reset_timeout_counter =0 ; } if ((event_reply->msg_flags & MPI3_EVENT_NOTIFY_MSGFLAGS_ACK_MASK)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 250/565 scsi: mpi3mr: Fix controller init failure on fault during queue creation
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chandrakanth Patil <[email protected]>
[ Upstream commit 829fa1582b6ff607b0e2fe41ba1c45c77f686618 ]
Firmware can enter a transient fault while creating operational queues. The driver fails the load immediately.
Add a retry loop that checks controller status and history bit after queue creation. If either indicates a fault, retry init up to a set limit before failing.
--- drivers/scsi/mpi3mr/mpi3mr_fw.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/scsi/mpi3mr/mpi3mr_fw.c +10 -0
@@ -2337,6 +2337,8 @@ static int mpi3mr_create_op_queues(struct mpi3mr_ioc *mrioc) {int retval =0 ;u16 num_queues =0 , i =0 , msix_count_op_q =1 ; +u32 ioc_status; +enum mpi3mr_iocstate ioc_state; num_queues =min_t (int, mrioc->facts.max_op_reply_q, mrioc->facts.max_op_req_q);
@@ -2392,6 +2394,14 @@ static int mpi3mr_create_op_queues(struct mpi3mr_ioc *mrioc) retval =-1 ; goto out_failed; } + ioc_status =readl (&mrioc->sysif_regs->ioc_status); + ioc_state =mpi3mr_get_iocstate (mrioc); +if ((ioc_status &MPI3_SYSIF_IOC_STATUS_RESET_HISTORY ) || + ioc_state !=MRIOC_STATE_READY ) { +mpi3mr_print_fault_info (mrioc); + retval =-1 ; + goto out_failed; + } mrioc->num_op_reply_q = mrioc->num_op_req_q = i; ioc_info(mrioc, "successfully created %d operational queue pairs(default/polled) queue = (%d/%d)\n",
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 251/565 scsi: pm80xx: Fix race condition caused by static variables
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Francisco Gutierrez <[email protected]>
[ Upstream commit d6477ee38ccfbeaed885733c13f41d9076e2f94a ]
Eliminate the use of static variables within the log pull implementation to resolve a race condition and prevent data gaps when pulling logs from multiple controllers in parallel, ensuring each operation is properly isolated.
--- drivers/scsi/pm8001/pm8001_ctl.c | 22 ++++++++++++---------- drivers/scsi/pm8001/pm8001_init.c | 1 + drivers/scsi/pm8001/pm8001_sas.h | 4 ++++ 3 files changed, 17 insertions(+), 10 deletions(-)
drivers/scsi/pm8001/pm8001_ctl.c +12 -10
@@ -534,23 +534,25 @@ static ssize_t pm8001_ctl_iop_log_show(struct device *cdev,char *str = buf;u32 read_size = pm8001_ha->main_cfg_tbl.pm80xx_tbl.event_log_size /1024 ; -static u32 start, end, count;u32 max_read_times =32 ;u32 max_count = (read_size *1024 ) / (max_read_times *4 );u32 *temp = (u32 *)pm8001_ha->memoryMap.region[IOP ].virt_ptr; -if ((count % max_count) ==0 ) { - start =0 ; - end = max_read_times; - count =0 ; +mutex_lock (&pm8001_ha->iop_log_lock); + +if ((pm8001_ha->iop_log_count % max_count) ==0 ) { + pm8001_ha->iop_log_start =0 ; + pm8001_ha->iop_log_end = max_read_times; + pm8001_ha->iop_log_count =0 ; }else { - start = end; - end = end + max_read_times; + pm8001_ha->iop_log_start = pm8001_ha->iop_log_end; + pm8001_ha->iop_log_end = pm8001_ha->iop_log_end + max_read_times; } -for (; start < end; start++) - str +=sprintf (str,"%08x " , *(temp+start)); - count++; +for (; pm8001_ha->iop_log_start < pm8001_ha->iop_log_end; pm8001_ha->iop_log_start++) + str +=sprintf (str,"%08x " , *(temp+pm8001_ha->iop_log_start)); + pm8001_ha->iop_log_count++; +mutex_unlock (&pm8001_ha->iop_log_lock);return str - buf; } static DEVICE_ATTR(iop_log, S_IRUGO, pm8001_ctl_iop_log_show, NULL);
drivers/scsi/pm8001/pm8001_init.c +1 -0
@@ -550,6 +550,7 @@ static struct pm8001_hba_info *pm8001_pci_alloc(struct pci_dev *pdev, pm8001_ha->id = pm8001_id++; pm8001_ha->logging_level = logging_level; pm8001_ha->non_fatal_count =0 ; +mutex_init (&pm8001_ha->iop_log_lock);if (link_rate >=1 && link_rate <=15 ) pm8001_ha->link_rate = (link_rate <<8 );else {
drivers/scsi/pm8001/pm8001_sas.h +4 -0
@@ -537,6 +537,10 @@ struct pm8001_hba_info {u32 ci_offset;u32 pi_offset;u32 max_memcnt; +u32 iop_log_start; +u32 iop_log_end; +u32 iop_log_count; +struct mutex iop_log_lock; };struct pm8001_work {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 252/565 extcon: adc-jack: Fix wakeup source leaks on device unbind
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 78b6a991eb6c6f19ed7d0ac91cda3b3b117fda8f ]
Device can be unbound, so driver must also release memory for the wakeup source. Do not use devm interface, because it would change the order of cleanup.
--- drivers/extcon/extcon-adc-jack.c | 1 + 1 file changed, 1 insertion(+)
drivers/extcon/extcon-adc-jack.c +1 -0
@@ -164,6 +164,7 @@ static void adc_jack_remove(struct platform_device *pdev) {struct adc_jack_data *data =platform_get_drvdata (pdev); +device_init_wakeup (&pdev->dev, false);free_irq (data->irq, data);cancel_work_sync (&data->handler.work); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 253/565 remoteproc: wkup_m3: Use devm_pm_runtime_enable() helper
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrew Davis <[email protected]>
[ Upstream commit 461edcf73eec57bc0006fbb5209f5012c514c58b ]
Use device life-cycle managed runtime enable function to simplify probe and exit paths.
--- drivers/remoteproc/wkup_m3_rproc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/remoteproc/wkup_m3_rproc.c +3 -3
@@ -148,7 +148,9 @@ static int wkup_m3_rproc_probe(struct platform_device *pdev)return -ENODEV ; } -pm_runtime_enable (&pdev->dev); + ret =devm_pm_runtime_enable (dev); +if (ret <0 ) +return dev_err_probe (dev, ret,"Failed to enable runtime PM\n" ); ret =pm_runtime_get_sync (&pdev->dev);if (ret <0 ) {dev_err (&pdev->dev,"pm_runtime_get_sync() failed\n" );
@@ -219,7 +221,6 @@ static int wkup_m3_rproc_probe(struct platform_device *pdev)rproc_free (rproc); err:pm_runtime_put_noidle (dev); -pm_runtime_disable (dev);return ret; }
@@ -230,7 +231,6 @@ static void wkup_m3_rproc_remove(struct platform_device *pdev)rproc_del (rproc);rproc_free (rproc);pm_runtime_put_sync (&pdev->dev); -pm_runtime_disable (&pdev->dev); }#ifdef CONFIG_PM
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 254/565 net: phy: fixed_phy: let fixed_phy_unregister free the phy_device
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
[ Upstream commit a0f849c1cc6df0db9083b4c81c05a5456b1ed0fb ]
fixed_phy_register() creates and registers the phy_device. To be symmetric, we should not only unregister, but also free the phy_device in fixed_phy_unregister(). This allows to simplify code in users.
Note wrt of_phy_deregister_fixed_link():put_device(&phydev->mdio.dev) and phy_device_free(phydev) are identical.
--- drivers/net/dsa/dsa_loop.c | 9 +++------ drivers/net/mdio/of_mdio.c | 1 - drivers/net/phy/fixed_phy.c | 1 + 3 files changed, 4 insertions(+), 7 deletions(-)
drivers/net/dsa/dsa_loop.c +3 -6
@@ -387,13 +387,10 @@ static struct mdio_driver dsa_loop_drv = {static void dsa_loop_phydevs_unregister (void ) { -unsigned int i; - -for (i =0 ; i <NUM_FIXED_PHYS ; i++) -if (!IS_ERR (phydevs[i])) { +for (int i =0 ; i <NUM_FIXED_PHYS ; i++) { +if (!IS_ERR (phydevs[i]))fixed_phy_unregister (phydevs[i]); -phy_device_free (phydevs[i]); - } + } }static int __init dsa_loop_init (void )
drivers/net/mdio/of_mdio.c +0 -1
@@ -473,6 +473,5 @@ void of_phy_deregister_fixed_link(struct device_node *np)fixed_phy_unregister (phydev);put_device (&phydev->mdio.dev);/* of_phy_find_device() */ -phy_device_free (phydev);/* fixed_phy_register() */ }EXPORT_SYMBOL (of_phy_deregister_fixed_link);
drivers/net/phy/fixed_phy.c +1 -0
@@ -329,6 +329,7 @@ void fixed_phy_unregister(struct phy_device *phy)phy_device_remove (phy);of_node_put (phy->mdio.dev.of_node);fixed_phy_del (phy->mdio.addr); +phy_device_free (phy); }EXPORT_SYMBOL_GPL (fixed_phy_unregister);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 255/565 fuse: zero initialize inode private data
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miklos Szeredi <[email protected]>
[ Upstream commit 3ca1b311181072415b6432a169de765ac2034e5a ]
This is slightly tricky, since the VFS uses non-zeroing allocation to preserve some fields that are left in a consistent state.
--- fs/fuse/inode.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
fs/fuse/inode.c +4 -7
@@ -94,14 +94,11 @@ static struct inode *fuse_alloc_inode(struct super_block *sb)if (!fi)return NULL ; - fi->i_time =0 ; +/* Initialize private data (i.e. everything except fi->inode) */ +BUILD_BUG_ON (offsetof(struct fuse_inode , inode) !=0 ); +memset ((void *) fi +sizeof (fi->inode),0 ,sizeof (*fi) -sizeof (fi->inode)); + fi->inval_mask = ~0 ; - fi->nodeid =0 ; - fi->nlookup =0 ; - fi->attr_version =0 ; - fi->orig_ino =0 ; - fi->state =0 ; - fi->submount_lookup =NULL ;mutex_init (&fi->mutex);spin_lock_init (&fi->lock); fi->forget =fuse_alloc_forget ();
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 256/565 drm/amdgpu: Correct the counts of nr_banks and nr_errors
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ce Sun <[email protected]>
[ Upstream commit 907813e5d7cadfeafab12467d748705a5309efb0 ]
Correct the counts of nr_banks and nr_errors
--- drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c +2 -0
@@ -86,6 +86,7 @@ static void aca_banks_release(struct aca_banks *banks)list_for_each_entry_safe (node, tmp, &banks->list, node) {list_del (&node->node);kvfree (node); + banks->nr_banks--; } }
@@ -236,6 +237,7 @@ static struct aca_bank_error *new_bank_error(struct aca_error *aerr, struct aca_mutex_lock (&aerr->lock);list_add_tail (&bank_error->node, &aerr->list); + aerr->nr_errors++;mutex_unlock (&aerr->lock);return bank_error;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 257/565 drm/amdkfd: fix vram allocation failure for a special case
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Huang <[email protected]>
[ Upstream commit 93aa919ca05bec544b17ee9a1bfe394ce6c94bd8 ]
When it only allocates vram without va, which is 0, and a SVM range allocated stays in this range, the vram allocation returns failure. It should be skipped for this case from SVM usage check.
--- drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +6 -1
@@ -1069,7 +1069,12 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep,svm_range_list_lock_and_flush_work (&p->svms, current->mm);mutex_lock (&p->svms.lock);mmap_write_unlock (current->mm); -if (interval_tree_iter_first (&p->svms.objects, + +/* Skip a special case that allocates VRAM without VA, +* VA will be invalid of 0. +*/ +if (!(!args->va_addr && (flags &KFD_IOC_ALLOC_MEM_FLAGS_VRAM )) && +interval_tree_iter_first (&p->svms.objects, args->va_addr >>PAGE_SHIFT , (args->va_addr + args->size -1 ) >>PAGE_SHIFT )) { pr_err("Address: 0x%llx already allocated by SVM\n",
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 258/565 drm/amd/display: Support HW cursor 180 rot for any number of pipe splits
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ivan Lipski <[email protected]>
[ Upstream commit 8a359f0f138d5ac7ceffd21b73279be50e516c0a ]
[Why]
For the HW cursor, its current position in the pipe_ctx->stream struct is not affected by the 180 rotation, i. e. the top left corner is still at 0,0. However, the DPP & HUBP set_cursor_position functions require rotated position.
The current approach is hard-coded for ODM 2:1, thus it's failing for ODM 4:1, resulting in a double cursor.
[How]
Instead of calculating the new cursor position relatively to the viewports, we calculate it using a viewavable clip_rect of each plane.
The clip_rects are first offset and scaled to the same space as the src_rect, i. e. Stream space -> Plane space.
In case of a pipe split, which divides the plane into 2 or more viewports, the clip_rect is the union of all the viewports of the given plane.
With the assumption that the viewports in HUBP's set_cursor_position are in the Plane space as well, it should produce a correct cursor position for any number of pipe splits.
--- .../amd/display/dc/hwss/dcn10/dcn10_hwseq.c | 73 +++++++------------ 1 file changed, 27 insertions(+), 46 deletions(-)
drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c +27 -46
@@ -3494,6 +3494,8 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx)int y_plane = pipe_ctx->plane_state->dst_rect.y;int x_pos = pos_cpy.x;int y_pos = pos_cpy.y; +int clip_x = pipe_ctx->plane_state->clip_rect.x; +int clip_width = pipe_ctx->plane_state->clip_rect.width;if ((pipe_ctx->top_pipe !=NULL ) || (pipe_ctx->bottom_pipe !=NULL )) { if ((pipe_ctx->plane_state->src_rect.width != pipe_ctx->plane_res.scl_data.viewport.width) ||
@@ -3512,7 +3514,7 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx)*/ /** -* Translate cursor from stream space to plane space. +* Translate cursor and clip offset from stream space to plane space. * * If the cursor is scaled then we need to scale the position * to be in the approximately correct place. We can't do anything
@@ -3529,6 +3531,10 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx) pipe_ctx->plane_state->dst_rect.width; y_pos = (y_pos - y_plane) * pipe_ctx->plane_state->src_rect.height / pipe_ctx->plane_state->dst_rect.height; + clip_x = (clip_x - x_plane) * pipe_ctx->plane_state->src_rect.width / + pipe_ctx->plane_state->dst_rect.width; + clip_width = clip_width * pipe_ctx->plane_state->src_rect.width / + pipe_ctx->plane_state->dst_rect.width; }/**
@@ -3575,30 +3581,18 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx)if (param.rotation ==ROTATION_ANGLE_0 ) { -int viewport_width = - pipe_ctx->plane_res.scl_data.viewport.width; -int viewport_x = - pipe_ctx->plane_res.scl_data.viewport.x;if (param.mirror) { -if (pipe_split_on || odm_combine_on) { -if (pos_cpy.x >= viewport_width + viewport_x) { - pos_cpy.x =2 * viewport_width - - pos_cpy.x +2 * viewport_x; - }else { -uint32_t temp_x = pos_cpy.x; - - pos_cpy.x =2 * viewport_x - pos_cpy.x; -if (temp_x >= viewport_x + - (int )hubp->curs_attr.width || pos_cpy.x - <= (int )hubp->curs_attr.width + - pipe_ctx->plane_state->src_rect.x) { - pos_cpy.x =2 * viewport_width - temp_x; - } - } - }else { - pos_cpy.x = viewport_width - pos_cpy.x +2 * viewport_x; - } +/* +* The plane is split into multiple viewports. +* The combination of all viewports span the +* entirety of the clip rect. +* +* For no pipe_split, viewport_width is represents +* the full width of the clip_rect, so we can just +* mirror it. +*/ + pos_cpy.x = clip_width - pos_cpy.x +2 * clip_x; } }// Swap axis and mirror horizontally
@@ -3668,30 +3662,17 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx) }// Mirror horizontally and vertically else if (param.rotation ==ROTATION_ANGLE_180 ) { -int viewport_width = - pipe_ctx->plane_res.scl_data.viewport.width; -int viewport_x = - pipe_ctx->plane_res.scl_data.viewport.x; -if (!param.mirror) { -if (pipe_split_on || odm_combine_on) { -if (pos_cpy.x >= viewport_width + viewport_x) { - pos_cpy.x =2 * viewport_width - - pos_cpy.x +2 * viewport_x; - }else { -uint32_t temp_x = pos_cpy.x; - - pos_cpy.x =2 * viewport_x - pos_cpy.x; -if (temp_x >= viewport_x + - (int )hubp->curs_attr.width || pos_cpy.x - <= (int )hubp->curs_attr.width + - pipe_ctx->plane_state->src_rect.x) { - pos_cpy.x = temp_x + viewport_width; - } - } - }else { - pos_cpy.x = viewport_width - pos_cpy.x +2 * viewport_x; - } +/* +* The plane is split into multiple viewports. +* The combination of all viewports span the +* entirety of the clip rect. +* +* For no pipe_split, viewport_width is represents +* the full width of the clip_rect, so we can just +* mirror it. +*/ + pos_cpy.x = clip_width - pos_cpy.x +2 * clip_x; }/**
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 259/565 drm/amdkfd: Tie UNMAP_LATENCY to queue_preemption
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amber Lin <[email protected]>
[ Upstream commit f3820e9d356132e18405cd7606e22dc87ccfa6d1 ]
When KFD asks CP to preempt queues, other than preempt CP queues, CP also requests SDMA to preempt SDMA queues with UNMAP_LATENCY timeout. Currently queue_preemption_timeout_ms is 9000 ms by default but can be configured via module parameter. KFD_UNMAP_LATENCY_MS is hard coded as 4000 ms though. This patch ties KFD_UNMAP_LATENCY_MS to queue_preemption_timeout_ms so in a slow system such as emulator, both CP and SDMA slowness are taken into account.
--- drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdkfd/kfd_priv.h +8 -1
@@ -111,7 +111,14 @@#define KFD_KERNEL_QUEUE_SIZE 2048 -#define KFD_UNMAP_LATENCY_MS (4000) +/* KFD_UNMAP_LATENCY_MS is the timeout CP waiting for SDMA preemption. One XCC +* can be associated to 2 SDMA engines. queue_preemption_timeout_ms is the time +* driver waiting for CP returning the UNMAP_QUEUE fence. Thus the math is +* queue_preemption_timeout_ms = sdma_preemption_time * 2 + cp workload +* The format here makes CP workload 10% of total timeout +*/ +#define KFD_UNMAP_LATENCY_MS \ + ((queue_preemption_timeout_ms - queue_preemption_timeout_ms / 10) >> 1)#define KFD_MAX_SDMA_QUEUES 128
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 260/565 platform/x86/intel-uncore-freq: Fix warning in partitioned system
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Pandruvada <[email protected]>
[ Upstream commit 6d47b4f08436cb682fb2644e6265a3897fd42a77 ]
A partitioned system configured with only one package and one compute die, warning will be generated for duplicate sysfs entry. This typically occurs during the platform bring-up phase.
Partitioned systems expose dies, equivalent to TPMI compute domains, through the CPUID. Each partitioned system must contains at least one compute die per partition, resulting in a minimum of two dies per package. Hence the function topology_max_dies_per_package() returns at least two, and the condition "topology_max_dies_per_package() > 1" prevents the creation of a root domain.
In this case topology_max_dies_per_package() will return 1 and root domain will be created for partition 0 and a duplicate sysfs warning for partition 1 as both partitions have same package ID.
To address this also check for non zero partition in addition to topology_max_dies_per_package() > 1.
--- .../platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c +1 -1
@@ -589,7 +589,7 @@ static int uncore_probe(struct auxiliary_device *auxdev, const struct auxiliary_auxiliary_set_drvdata (auxdev, tpmi_uncore); -if (topology_max_dies_per_package () >1 ) +if (topology_max_dies_per_package () >1 || plat_info->partition)return 0 ; tpmi_uncore->root_cluster.root_domain = true;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 261/565 selftests: drv-net: rss_ctx: fix the queue count check
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit c158b5a570a188b990ef10ded172b8b93e737826 ]
Commit 0d6ccfe6b319 ("selftests: drv-net: rss_ctx: check for all-zero keys") added a skip exception if NIC has fewer than 3 queues enabled, but it's just constructing the object, it's not actually rising this exception.
Before:
# Exception| net.lib.py.utils.CmdExitFailure: Command failed: ethtool -X enp1s0 equal 3 hkey d1:cc:77:47:9d:ea:15:f2:b9:6c:ef:68:62:c0:45:d5:b0:99:7d:cf:29:53:40:06:3d:8e:b9:bc:d4:70:89:b8:8d:59:04:ea:a9:c2:21:b3:55:b8:ab:6b:d9:48:b4:bd:4c:ff:a5:f0:a8:c2 not ok 1 rss_ctx.test_rss_key_indir
After:
ok 1 rss_ctx.test_rss_key_indir # SKIP Device has fewer than 3 queues (or doesn't support queue stats)
--- tools/testing/selftests/drivers/net/hw/rss_ctx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/drivers/net/hw/rss_ctx.py +1 -1
@@ -101,7 +101,7 @@ def test_rss_key_indir(cfg): qcnt = len(_get_rx_cnts(cfg)) if qcnt < 3: - KsftSkipEx("Device has fewer than 3 queues (or doesn't support queue stats)") + raise KsftSkipEx("Device has fewer than 3 queues (or doesn't support queue stats)") data = get_rss(cfg) want_keys = ['rss-hash-key', 'rss-hash-function', 'rss-indirection-table']
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 262/565 media: fix uninitialized symbol warnings
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chelsy Ratnawat <[email protected]>
[ Upstream commit b4c441310c3baaa7c39a5457e305ca93c7a0400d ]
Initialize variables to fix these smatch warnings drivers/media/i2c/ir-kbd-i2c.c:339 ir_key_poll() error: uninitialized symbol 'protocol'.drivers/media/i2c/ir-kbd-i2c.c:339 ir_key_poll() error: uninitialized symbol 'scancode'.drivers/media/i2c/ir-kbd-i2c.c:339 ir_key_poll() error: uninitialized symbol 'toggle'.drivers/media/tuners/xc4000.c:1102 xc_debug_dump() error: uninitialized symbol 'adc_envelope'.drivers/media/tuners/xc4000.c:1108 xc_debug_dump() error: uninitialized symbol 'lock_status'.drivers/media/tuners/xc4000.c:1123 xc_debug_dump() error: uninitialized symbol 'frame_lines'.drivers/media/tuners/xc4000.c:1127 xc_debug_dump() error: uninitialized symbol 'quality'.drivers/media/tuners/xc5000.c:645 xc_debug_dump() error: uninitialized symbol 'adc_envelope'.drivers/media/tuners/xc5000.c:651 xc_debug_dump() error: uninitialized symbol 'lock_status'.drivers/media/tuners/xc5000.c:665 xc_debug_dump() error: uninitialized symbol 'frame_lines'.drivers/media/tuners/xc5000.c:668 xc_debug_dump() error: uninitialized symbol 'quality'.drivers/media/tuners/xc5000.c:671 xc_debug_dump() error: uninitialized symbol 'snr'.drivers/media/tuners/xc5000.c:674 xc_debug_dump() error: uninitialized symbol 'totalgain'.
--- drivers/media/i2c/ir-kbd-i2c.c | 6 +++--- drivers/media/tuners/xc4000.c | 8 ++++---- drivers/media/tuners/xc5000.c | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-)
drivers/media/i2c/ir-kbd-i2c.c +3 -3
@@ -321,9 +321,9 @@ static int get_key_avermedia_cardbus(struct IR_i2c *ir, enum rc_proto *protocol,static int ir_key_poll (struct IR_i2c *ir) { -enum rc_proto protocol; -u32 scancode; -u8 toggle; +enum rc_proto protocol =0 ; +u32 scancode =0 ; +u8 toggle =0 ;int rc;dev_dbg (&ir->rc->dev,"%s\n" , __func__);
drivers/media/tuners/xc4000.c +4 -4
@@ -1087,12 +1087,12 @@ static int check_firmware(struct dvb_frontend *fe, unsigned int type,static void xc_debug_dump (struct xc4000_priv *priv) { -u16 adc_envelope; +u16 adc_envelope =0 ;u32 freq_error_hz =0 ; -u16 lock_status; +u16 lock_status =0 ;u32 hsync_freq_hz =0 ; -u16 frame_lines; -u16 quality; +u16 frame_lines =0 ; +u16 quality =0 ;u16 signal =0 ;u16 noise =0 ;u8 hw_majorversion =0 , hw_minorversion =0 ;
drivers/media/tuners/xc5000.c +6 -6
@@ -622,14 +622,14 @@ static int xc5000_fwupload(struct dvb_frontend *fe,static void xc_debug_dump (struct xc5000_priv *priv) { -u16 adc_envelope; +u16 adc_envelope =0 ;u32 freq_error_hz =0 ; -u16 lock_status; +u16 lock_status =0 ;u32 hsync_freq_hz =0 ; -u16 frame_lines; -u16 quality; -u16 snr; -u16 totalgain; +u16 frame_lines =0 ; +u16 quality =0 ; +u16 snr =0 ; +u16 totalgain =0 ;u8 hw_majorversion =0 , hw_minorversion =0 ;u8 fw_majorversion =0 , fw_minorversion =0 ;u16 fw_buildversion =0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 263/565 media: pci: mgb4: Fix timings comparison in VIDIOC_S_DV_TIMINGS
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Tůma <[email protected]>
[ Upstream commit 0750649b528ff18d1d68aecb45b34ec22d5ab778 ]
Compare the whole v4l2_bt_timings struct, not just the width/height when setting new timings. Timings with the same resolution and different pixelclock can now be properly set.
--- drivers/media/pci/mgb4/mgb4_vin.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/media/pci/mgb4/mgb4_vin.c +1 -2
@@ -624,8 +624,7 @@ static int vidioc_s_dv_timings(struct file *file, void *fh, timings->bt.height < video_timings_cap.bt.min_height || timings->bt.height > video_timings_cap.bt.max_height) return -EINVAL; -if (timings->bt.width == vindev->timings.bt.width && - timings->bt.height == vindev->timings.bt.height) +if (v4l2_match_dv_timings (timings, &vindev->timings,0 , false))return 0 ;if (vb2_is_busy (&vindev->queue))return -EBUSY ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 264/565 ASoC: SOF: ipc4-pcm: Add fixup for channels
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Ujfalusi <[email protected]>
[ Upstream commit 6ad299a9b968e1c63988e2a327295e522cf6bbf5 ]
We can have modules in path which can change the number of channels and in this case the BE params needs to be adjusted to configure the DAI according to the copier configuration.
Message-ID: <[email protected]>
--- sound/soc/sof/ipc4-pcm.c | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+)
sound/soc/sof/ipc4-pcm.c +56 -0
@@ -675,6 +675,58 @@ static int sof_ipc4_pcm_dai_link_fixup_rate(struct snd_sof_dev *sdev,return 0 ; } +static int sof_ipc4_pcm_dai_link_fixup_channels (struct snd_sof_dev *sdev, +struct snd_pcm_hw_params *params, +struct sof_ipc4_copier *ipc4_copier) +{ +struct sof_ipc4_pin_format *pin_fmts = ipc4_copier->available_fmt.input_pin_fmts; +struct snd_interval *channels =hw_param_interval (params,SNDRV_PCM_HW_PARAM_CHANNELS ); +int num_input_formats = ipc4_copier->available_fmt.num_input_formats; +unsigned int fe_channels =params_channels (params); +bool fe_be_match = false; +bool single_be_channels = true; +unsigned int be_channels, val; +int i; + +if (WARN_ON_ONCE (!num_input_formats)) +return -EINVAL ; + +/* +* Copier does not change channels, so we +* need to only consider the input pin information. +*/ + be_channels =SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT (pin_fmts[0 ].audio_fmt.fmt_cfg); +for (i =0 ; i < num_input_formats; i++) { + val =SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT (pin_fmts[i].audio_fmt.fmt_cfg); + +if (val != be_channels) + single_be_channels = false; + +if (val == fe_channels) { + fe_be_match = true; +break ; + } + } + +/* +* If channels is different than FE channels, topology must contain a +* module which can change the number of channels. But we do require +* topology to define a single channels in the DAI copier config in +* this case (FE channels may be variable). +*/ +if (!fe_be_match) { +if (!single_be_channels) { +dev_err (sdev->dev,"Unable to select channels for DAI link\n" ); +return -EINVAL ; + } + + channels->min = be_channels; + channels->max = be_channels; + } + +return 0 ; +} +static int sof_ipc4_pcm_dai_link_fixup (struct snd_soc_pcm_runtime *rtd,struct snd_pcm_hw_params *params) {
@@ -738,6 +790,10 @@ static int sof_ipc4_pcm_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,if (ret)return ret; + ret =sof_ipc4_pcm_dai_link_fixup_channels (sdev, params, ipc4_copier); +if (ret) +return ret; +if (single_bitdepth) {snd_mask_none (fmt); valid_bits =SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH (ipc4_fmt->fmt_cfg);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 265/565 drm/amd/display: Increase minimum clock for TMDS 420 with pipe splitting
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Relja Vojvodic <[email protected]>
[ Upstream commit 002a612023c8b105bd3829d81862dee04368d6de ]
[Why]
-Pipe splitting allows for clocks to be reduced, but when using TMDS 420, reduced clocks lead to missed clocks cycles on clock resyncing
[How]
-Impose a minimum clock when using TMDS 420
--- .../src/dml2_core/dml2_core_dcn4_calcs.c | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-)
drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c +19 -9
@@ -1262,18 +1262,27 @@ static void CalculateDETBufferSize(static double CalculateRequiredDispclk (enum dml2_odm_mode ODMMode, -double PixelClock) +double PixelClock, +bool isTMDS420) { +double DispClk;if (ODMMode == dml2_odm_mode_combine_4to1) { -return PixelClock /4.0 ; + DispClk = PixelClock /4.0 ; }else if (ODMMode == dml2_odm_mode_combine_3to1) { -return PixelClock /3.0 ; + DispClk = PixelClock /3.0 ; }else if (ODMMode == dml2_odm_mode_combine_2to1) { -return PixelClock /2.0 ; + DispClk = PixelClock /2.0 ; }else { -return PixelClock; + DispClk = PixelClock; + } + +if (isTMDS420) { +double TMDS420MinPixClock = PixelClock /2.0 ; + DispClk =math_max2 (DispClk, TMDS420MinPixClock); } + +return DispClk; } static double TruncToValidBPP(
@@ -4088,11 +4097,12 @@ static void CalculateODMMode(bool success;bool UseDSC = DSCEnable && (NumberOfDSCSlices >0 );enum dml2_odm_mode DecidedODMMode; +bool isTMDS420 = (OutFormat == dml2_420 && Output == dml2_hdmi); - SurfaceRequiredDISPCLKWithoutODMCombine =CalculateRequiredDispclk (dml2_odm_mode_bypass, PixelClock); - SurfaceRequiredDISPCLKWithODMCombineTwoToOne =CalculateRequiredDispclk (dml2_odm_mode_combine_2to1, PixelClock); - SurfaceRequiredDISPCLKWithODMCombineThreeToOne =CalculateRequiredDispclk (dml2_odm_mode_combine_3to1, PixelClock); - SurfaceRequiredDISPCLKWithODMCombineFourToOne =CalculateRequiredDispclk (dml2_odm_mode_combine_4to1, PixelClock); + SurfaceRequiredDISPCLKWithoutODMCombine =CalculateRequiredDispclk (dml2_odm_mode_bypass, PixelClock, isTMDS420); + SurfaceRequiredDISPCLKWithODMCombineTwoToOne =CalculateRequiredDispclk (dml2_odm_mode_combine_2to1, PixelClock, isTMDS420); + SurfaceRequiredDISPCLKWithODMCombineThreeToOne =CalculateRequiredDispclk (dml2_odm_mode_combine_3to1, PixelClock, isTMDS420); + SurfaceRequiredDISPCLKWithODMCombineFourToOne =CalculateRequiredDispclk (dml2_odm_mode_combine_4to1, PixelClock, isTMDS420);#ifdef __DML_VBA_DEBUG__dml2_printf ("DML::%s: ODMUse = %d\n" , __func__, ODMUse);dml2_printf ("DML::%s: Output = %d\n" , __func__, Output);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 266/565 drm/amd/display: incorrect conditions for failing dto calculations
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Clay King <[email protected]>
[ Upstream commit 306cbcc6f687d791ab3cc8fbbe30f5286fd0d1e5 ]
[Why & How]
Previously, when calculating dto phase, we would incorrectly fail when phase <=0 without additionally checking for the integer value. This meant that calculations would incorrectly fail when the desired pixel clock was an exact multiple of the reference clock.
--- drivers/gpu/drm/amd/display/dc/dccg/dcn401/dcn401_dccg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/dccg/dcn401/dcn401_dccg.c +1 -1
@@ -619,7 +619,7 @@ static void dccg401_set_dp_dto( dto_integer =div_u64 (params->pixclk_hz, dto_modulo_hz); dto_phase_hz = params->pixclk_hz - dto_integer * dto_modulo_hz; -if (dto_phase_hz <=0 ) { +if (dto_phase_hz <=0 && dto_integer <=0 ) {/* negative pixel rate should never happen */ BREAK_TO_DEBUGGER ();return ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 267/565 drm/amdgpu: Avoid vcn v5.0.1 poison irq call trace on sriov guest
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mangesh Gadre <[email protected]>
[ Upstream commit 37551277dfed796b6749e4fa52bdb62403cfdb42 ]
Sriov guest side doesn't init ras feature hence the poison irq shouldn't be put during hw fini
--- drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c +1 -1
@@ -284,7 +284,7 @@ static int vcn_v5_0_1_hw_fini(struct amdgpu_ip_block *ip_block) vinst->set_pg_state (vinst,AMD_PG_STATE_GATE ); } -if (amdgpu_ras_is_supported (adev,AMDGPU_RAS_BLOCK__VCN )) +if (amdgpu_ras_is_supported (adev,AMDGPU_RAS_BLOCK__VCN ) && !amdgpu_sriov_vf (adev))amdgpu_irq_put (adev, &adev->vcn.inst->ras_poison_irq,0 );return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 268/565 drm/amdgpu: Respect max pixel clock for HDMI and DVI-D (v2)
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timur Kristóf <[email protected]>
[ Upstream commit 585b2f685c56c5095cc22c7202bf74d8e9a73cdd ]
Update the legacy (non-DC) display code to respect the maximum pixel clock for HDMI and DVI-D. Reject modes that would require a higher pixel clock than can be supported.
Also update the maximum supported HDMI clock value depending on the ASIC type.
For reference, see the DC code:
check max_hdmi_pixel_clock in dce*_resource.c
v2:
Fix maximum clocks for DVI-D and DVI/HDMI adapters.
--- .../gpu/drm/amd/amdgpu/amdgpu_connectors.c | 57 ++++++++++++++----- 1 file changed, 44 insertions(+), 13 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c +44 -13
@@ -1195,29 +1195,60 @@ static void amdgpu_connector_dvi_force(struct drm_connector *connector) amdgpu_connector->use_digital = true; } +/** +* Returns the maximum supported HDMI (TMDS) pixel clock in KHz. +*/ +static int amdgpu_max_hdmi_pixel_clock (const struct amdgpu_device *adev) +{ +if (adev->asic_type >=CHIP_POLARIS10 ) +return 600000 ; +else if (adev->asic_type >=CHIP_TONGA ) +return 300000 ; +else +return 297000 ; +} + +/** +* Validates the given display mode on DVI and HDMI connectors, +* including analog signals on DVI-I. +*/ static enum drm_mode_status amdgpu_connector_dvi_mode_valid (struct drm_connector *connector,struct drm_display_mode *mode) {struct drm_device *dev = connector->dev;struct amdgpu_device *adev =drm_to_adev (dev);struct amdgpu_connector *amdgpu_connector =to_amdgpu_connector (connector); +const int max_hdmi_pixel_clock =amdgpu_max_hdmi_pixel_clock (adev); +const int max_dvi_single_link_pixel_clock =165000 ; +int max_digital_pixel_clock_khz;/* XXX check mode bandwidth */ -if (amdgpu_connector->use_digital && (mode->clock >165000 )) { -if ((amdgpu_connector->connector_object_id ==CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I ) || - (amdgpu_connector->connector_object_id ==CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D ) || - (amdgpu_connector->connector_object_id ==CONNECTOR_OBJECT_ID_HDMI_TYPE_B )) { -return MODE_OK ; - }else if (connector->display_info.is_hdmi) { -/* HDMI 1.3+ supports max clock of 340 Mhz */ -if (mode->clock >340000 ) -return MODE_CLOCK_HIGH ; -else -return MODE_OK ; - }else { -return MODE_CLOCK_HIGH ; +if (amdgpu_connector->use_digital) { +switch (amdgpu_connector->connector_object_id) { +case CONNECTOR_OBJECT_ID_HDMI_TYPE_A : + max_digital_pixel_clock_khz = max_hdmi_pixel_clock; +break ; +case CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I : +case CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D : + max_digital_pixel_clock_khz = max_dvi_single_link_pixel_clock; +break ; +case CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I : +case CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D : +case CONNECTOR_OBJECT_ID_HDMI_TYPE_B : + max_digital_pixel_clock_khz = max_dvi_single_link_pixel_clock *2 ; +break ; } + +/* When the display EDID claims that it's an HDMI display, +* we use the HDMI encoder mode of the display HW, +* so we should verify against the max HDMI clock here. +*/ +if (connector->display_info.is_hdmi) + max_digital_pixel_clock_khz = max_hdmi_pixel_clock; + +if (mode->clock > max_digital_pixel_clock_khz) +return MODE_CLOCK_HIGH ; }/* check against the max pixel clock */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 269/565 mips: lantiq: danube: add missing properties to cpu node
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksander Jan Bajkowski <[email protected]>
[ Upstream commit e8dee66c37085dc9858eb8608bc783c2900e50e7 ]
This fixes the following warnings:arch/mips/boot/dts/lantiq/danube_easy50712.dtb: cpus: '#address-cells' is a required property
from schema $id: http://devicetree.org/schemas/cpus.yaml#arch/mips/boot/dts/lantiq/danube_easy50712.dtb: cpus: '#size-cells' is a required property
from schema $id: http://devicetree.org/schemas/cpus.yaml#arch/mips/boot/dts/lantiq/danube_easy50712.dtb: cpu@0 (mips,mips24Kc): 'reg' is a required property
from schema $id: http://devicetree.org/schemas/mips/cpus.yaml#
--- arch/mips/boot/dts/lantiq/danube.dtsi | 4 ++++ 1 file changed, 4 insertions(+)
arch/mips/boot/dts/lantiq/danube.dtsi +4 -0
@@ -5,8 +5,12 @@ compatible = "lantiq,xway", "lantiq,danube"; cpus { + #address-cells = <1>; + #size-cells = <0>; + cpu@0 { compatible = "mips,mips24Kc"; + reg = <0>; }; };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 270/565 mips: lantiq: danube: add model to EASY50712 dts
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksander Jan Bajkowski <[email protected]>
[ Upstream commit cb96fd880ef78500b34d10fa76ddd3fa070287d6 ]
This fixes the following warning:arch/mips/boot/dts/lantiq/danube_easy50712.dtb: / (lantiq,xway): 'model' is a required property
from schema $id: http://devicetree.org/schemas/root-node.yaml#
--- arch/mips/boot/dts/lantiq/danube_easy50712.dts | 2 ++ 1 file changed, 2 insertions(+)
arch/mips/boot/dts/lantiq/danube_easy50712.dts +2 -0
@@ -4,6 +4,8 @@ /include/ "danube.dtsi" / { + model = "Intel EASY50712"; + chosen { bootargs = "console=ttyLTQ0,115200 init=/etc/preinit"; };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 271/565 mips: lantiq: danube: add missing device_type in pci node
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksander Jan Bajkowski <[email protected]>
[ Upstream commit d66949a1875352d2ddd52b144333288952a9e36f ]
This fixes the following warning:arch/mips/boot/dts/lantiq/danube_easy50712.dtb: pci@e105400 (lantiq,pci-xway): 'device_type' is a required property
from schema $id: http://devicetree.org/schemas/pci/pci-bus-common.yaml#
--- arch/mips/boot/dts/lantiq/danube.dtsi | 2 ++ 1 file changed, 2 insertions(+)
arch/mips/boot/dts/lantiq/danube.dtsi +2 -0
@@ -104,6 +104,8 @@ 0x1000000 0 0x00000000 0xae00000 0 0x200000>; /* io space */ reg = <0x7000000 0x8000 /* config space */ 0xe105400 0x400>; /* pci bridge */ + + device_type = "pci"; }; }; };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 272/565 mips: lantiq: xway: sysctrl: rename stp clock
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksander Jan Bajkowski <[email protected]>
[ Upstream commit b0d04fe6a633ada2c7bc1b5ddd011cbd85961868 ]
Bindig requires a node name matching ‘^gpio@[0-9a-f]+$’. This patch changes the clock name from “stp” to “gpio”.
--- arch/mips/lantiq/xway/sysctrl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/lantiq/xway/sysctrl.c +1 -1
@@ -485,7 +485,7 @@ void __init ltq_soc_init(void)/* add our generic xway clocks */ clkdev_add_pmu ("10000000.fpi" ,NULL ,0 ,0 ,PMU_FPI );clkdev_add_pmu ("1e100a00.gptu" ,NULL ,1 ,0 ,PMU_GPT ); -clkdev_add_pmu ("1e100bb0.stp" ,NULL ,1 ,0 ,PMU_STP ); +clkdev_add_pmu ("1e100bb0.gpio" ,NULL ,1 ,0 ,PMU_STP );clkdev_add_pmu ("1e100c00.serial" ,NULL ,0 ,0 ,PMU_ASC1 );clkdev_add_pmu ("1e104100.dma" ,NULL ,1 ,0 ,PMU_DMA );clkdev_add_pmu ("1e100800.spi" ,NULL ,1 ,0 ,PMU_SPI );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 273/565 mips: lantiq: danube: rename stp node on EASY50712 reference board
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksander Jan Bajkowski <[email protected]>
[ Upstream commit 2b9706ce84be9cb26be03e1ad2e43ec8bc3986be ]
This fixes the following warning:arch/mips/boot/dts/lantiq/danube_easy50712.dtb: stp@e100bb0 (lantiq,gpio-stp-xway): $nodename:0: 'stp@e100bb0' does not match '^gpio@[0-9a-f]+$'
from schema $id: http://devicetree.org/schemas/gpio/gpio-stp-xway.yaml#
--- arch/mips/boot/dts/lantiq/danube_easy50712.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/boot/dts/lantiq/danube_easy50712.dts +1 -1
@@ -96,7 +96,7 @@ lantiq,tx-burst-length = <4>; }; - stp0: stp@e100bb0 { + stp0: gpio@e100bb0 { #gpio-cells = <2>; compatible = "lantiq,gpio-stp-xway"; gpio-controller;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 274/565 inet_diag: annotate data-races in inet_diag_bc_sk()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 4fd84a0aaf2ba125b441aa09d415022385e66bf2 ]
inet_diag_bc_sk() runs with an unlocked socket, annotate potential races with READ_ONCE().
--- net/ipv4/inet_diag.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
net/ipv4/inet_diag.c +7 -7
@@ -783,7 +783,7 @@ static void entry_fill_addrs(struct inet_diag_entry *entry, const struct sock *sk) {#if IS_ENABLED (CONFIG_IPV6 ) -if (sk->sk_family ==AF_INET6 ) { +if (entry->family ==AF_INET6 ) { entry->saddr = sk->sk_v6_rcv_saddr.s6_addr32; entry->daddr = sk->sk_v6_daddr.s6_addr32; }else
@@ -796,18 +796,18 @@ static void entry_fill_addrs(struct inet_diag_entry *entry,int inet_diag_bc_sk (const struct nlattr *bc,struct sock *sk) { -struct inet_sock *inet =inet_sk (sk); +const struct inet_sock *inet =inet_sk (sk);struct inet_diag_entry entry;if (!bc)return 1 ; - entry.family = sk->sk_family; + entry.family =READ_ONCE (sk->sk_family);entry_fill_addrs (&entry, sk); - entry.sport = inet->inet_num; - entry.dport =ntohs (inet->inet_dport); - entry.ifindex = sk->sk_bound_dev_if; - entry.userlocks =sk_fullsock (sk) ? sk->sk_userlocks :0 ; + entry.sport =READ_ONCE (inet->inet_num); + entry.dport =ntohs (READ_ONCE (inet->inet_dport)); + entry.ifindex =READ_ONCE (sk->sk_bound_dev_if); + entry.userlocks =sk_fullsock (sk) ?READ_ONCE (sk->sk_userlocks) :0 ;if (sk_fullsock (sk)) entry.mark =READ_ONCE (sk->sk_mark);else if (sk->sk_state ==TCP_NEW_SYN_RECV )
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 275/565 microchip: lan865x: add ndo_eth_ioctl handler to enable PHY ioctl support
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Parthiban Veerasooran <[email protected]>
[ Upstream commit 34c21e91192aa1ff66f9d6cef8132717840d04e6 ]
Introduce support for standard MII ioctl operations in the LAN865x Ethernet driver by implementing the .ndo_eth_ioctl callback. This allows PHY-related ioctl commands to be handled via phy_do_ioctl_running() and enables support for ethtool and other user-space tools that rely on ioctl interface to perform PHY register access using commands like SIOCGMIIREG and SIOCSMIIREG.
This feature enables improved diagnostics and PHY configuration capabilities from userspace.
--- drivers/net/ethernet/microchip/lan865x/lan865x.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/microchip/lan865x/lan865x.c +1 -0
@@ -326,6 +326,7 @@ static const struct net_device_ops lan865x_netdev_ops = { .ndo_start_xmit = lan865x_send_packet, .ndo_set_rx_mode = lan865x_set_multicast_list, .ndo_set_mac_address = lan865x_set_mac_address, + .ndo_eth_ioctl = phy_do_ioctl_running, };static int lan865x_probe (struct spi_device *spi)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 276/565 tcp: use dst_dev_rcu() in tcp_fastopen_active_disable_ofo_check()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit b62a59c18b692f892dcb8109c1c2e653b2abc95c ]
Use RCU to avoid a pair of atomic operations and a potential UAF on dst_dev()->flags.
--- net/ipv4/tcp_fastopen.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/ipv4/tcp_fastopen.c +4 -3
@@ -575,11 +575,12 @@ void tcp_fastopen_active_disable_ofo_check(struct sock *sk) } }else if (tp->syn_fastopen_ch &&atomic_read (&sock_net (sk)->ipv4.tfo_active_disable_times)) { - dst =sk_dst_get (sk); - dev = dst ?dst_dev (dst) :NULL ; +rcu_read_lock (); + dst =__sk_dst_get (sk); + dev = dst ?dst_dev_rcu (dst) :NULL ;if (!(dev && (dev->flags &IFF_LOOPBACK )))atomic_set (&sock_net (sk)->ipv4.tfo_active_disable_times,0 ); -dst_release (dst); +rcu_read_unlock (); } }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 277/565 crypto: qat - use kcalloc() in qat_uclo_map_objs_from_mof()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qianfeng Rong <[email protected]>
[ Upstream commit 4c634b6b3c77bba237ee64bca172e73f9cee0cb2 ]
As noted in the kernel documentation [1], open-coded multiplication in allocator arguments is discouraged because it can lead to integer overflow.
Use kcalloc() to gain built-in overflow protection, making memory allocation safer when calculating allocation size compared to explicit multiplication. Similarly, use size_add() instead of explicit addition for 'uobj_chunk_num + sobj_chunk_num'.
--- drivers/crypto/intel/qat/qat_common/qat_uclo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/intel/qat/qat_common/qat_uclo.c +1 -1
@@ -1746,7 +1746,7 @@ static int qat_uclo_map_objs_from_mof(struct icp_qat_mof_handle *mobj_handle)if (sobj_hdr) sobj_chunk_num = sobj_hdr->num_chunks; - mobj_hdr =kzalloc ((uobj_chunk_num + sobj_chunk_num) * + mobj_hdr =kcalloc (size_add (uobj_chunk_num, sobj_chunk_num),sizeof (*mobj_hdr),GFP_KERNEL );if (!mobj_hdr)return -ENOMEM ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 278/565 scsi: pm8001: Use int instead of u32 to store error codes
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qianfeng Rong <[email protected]>
[ Upstream commit bee3554d1a4efbce91d6eca732f41b97272213a5 ]
Use int instead of u32 for 'ret' variable to store negative error codes returned by PM8001_CHIP_DISP->set_nvmd_req().
--- drivers/scsi/pm8001/pm8001_ctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/pm8001/pm8001_ctl.c +1 -1
@@ -682,7 +682,7 @@ static int pm8001_set_nvmd(struct pm8001_hba_info *pm8001_ha)struct pm8001_ioctl_payload *payload;DECLARE_COMPLETION_ONSTACK (completion);u8 *ioctlbuffer; -u32 ret; +int ret;u32 length =1024 *5 +sizeof (*payload) -1 ;if (pm8001_ha->fw_image->size >4096 ) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 279/565 scsi: ufs: exynos: fsd: Gate ref_clk and put UFS device in reset on suspend
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bharat Uppal <[email protected]>
[ Upstream commit 6d55af0f0740bf3d77943425fdafb77dc0fa6bb9 ]
On FSD platform, gating the reference clock (ref_clk) and putting the UFS device in reset by asserting the reset signal during UFS suspend, improves the power savings and ensures the PHY is fully turned off.
These operations are added as FSD specific suspend hook to avoid unintended side effects on other SoCs supported by this driver.
--- drivers/ufs/host/ufs-exynos.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/ufs/host/ufs-exynos.c +8 -0
@@ -1882,6 +1882,13 @@ static int fsd_ufs_pre_pwr_change(struct exynos_ufs *ufs,return 0 ; } +static int fsd_ufs_suspend (struct exynos_ufs *ufs) +{ +exynos_ufs_gate_clks (ufs); +hci_writel (ufs,0 ,HCI_GPIO_OUT ); +return 0 ; +} +static inline u32 get_mclk_period_unipro_18 (struct exynos_ufs *ufs) {return (16 *1000 *1000000UL / ufs->mclk_rate);
@@ -2162,6 +2169,7 @@ static const struct exynos_ufs_drv_data fsd_ufs_drvs = { .pre_link = fsd_ufs_pre_link, .post_link = fsd_ufs_post_link, .pre_pwr_change = fsd_ufs_pre_pwr_change, + .suspend = fsd_ufs_suspend, };static const struct exynos_ufs_drv_data gs101_ufs_drvs = {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 280/565 ptp: Limit time setting of PTP clocks
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miroslav Lichvar <[email protected]>
[ Upstream commit 5a8c02a6bf52b1cf9cfb7868a8330f7c3c6aebe9 ]
Networking drivers implementing PTP clocks and kernel socket code handling hardware timestamps use the 64-bit signed ktime_t type counting nanoseconds. When a PTP clock reaches the maximum value in year 2262, the timestamps returned to applications will overflow into year 1667. The same thing happens when injecting a large offset with clock_adjtime(ADJ_SETOFFSET).
The commit 7a8e61f84786 ("timekeeping: Force upper bound for setting CLOCK_REALTIME") limited the maximum accepted value setting the system clock to 30 years before the maximum representable value (i.e. year 2232) to avoid the overflow, assuming the system will not run for more than 30 years.
Enforce the same limit for PTP clocks. Don't allow negative values and values closer than 30 years to the maximum value. Drivers may implement an even lower limit if the hardware registers cannot represent the whole interval between years 1970 and 2262 in the required resolution.
--- drivers/ptp/ptp_clock.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/ptp/ptp_clock.c +12 -1
@@ -100,6 +100,9 @@ static int ptp_clock_settime(struct posix_clock *pc, const struct timespec64 *tpreturn -EBUSY ; } +if (!timespec64_valid_settod (tp)) +return -EINVAL ; +return ptp->info->settime64 (ptp->info, tp); }
@@ -130,7 +133,7 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct __kernel_timex *tx) ops = ptp->info;if (tx->modes &ADJ_SETOFFSET ) { -struct timespec64 ts; +struct timespec64 ts, ts2;ktime_t kt;s64 delta;
@@ -143,6 +146,14 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct __kernel_timex *tx)if ((unsigned long ) ts.tv_nsec >=NSEC_PER_SEC )return -EINVAL ; +/* Make sure the offset is valid */ + err =ptp_clock_gettime (pc, &ts2); +if (err) +return err; + ts2 =timespec64_add (ts2, ts); +if (!timespec64_valid_settod (&ts2)) +return -EINVAL ; + kt =timespec64_to_ktime (ts); delta =ktime_to_ns (kt); err = ops->adjtime (ops, delta);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 281/565 dmaengine: sh: setup_xref error handling
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Andreatta <[email protected]>
[ Upstream commit d9a3e9929452780df16f3414f0d59b5f69d058cf ]
This patch modifies the type of setup_xref from void to int and handles errors since the function can fail.
setup_xref now returns the (eventual) error from dmae_set_dmars|dmae_set_chcr, while shdma_tx_submit handles the result, removing the chunks from the queue and marking PM as idle in case of an error.
--- drivers/dma/sh/shdma-base.c | 25 +++++++++++++++++++------ drivers/dma/sh/shdmac.c | 17 +++++++++++++---- include/linux/shdma-base.h | 2 +- 3 files changed, 33 insertions(+), 11 deletions(-)
drivers/dma/sh/shdma-base.c +19 -6
@@ -129,12 +129,25 @@ static dma_cookie_t shdma_tx_submit(struct dma_async_tx_descriptor *tx)const struct shdma_ops *ops = sdev->ops;dev_dbg (schan->dev,"Bring up channel %d\n" , schan->id); -/* -* TODO: .xfer_setup() might fail on some platforms. -* Make it int then, on error remove chunks from the -* queue again -*/ - ops->setup_xfer (schan, schan->slave_id); + + ret = ops->setup_xfer (schan, schan->slave_id); +if (ret <0 ) { +dev_err (schan->dev,"setup_xfer failed: %d\n" , ret); + +/* Remove chunks from the queue and mark them as idle */ +list_for_each_entry_safe (chunk, c, &schan->ld_queue, node) { +if (chunk->cookie == cookie) { + chunk->mark =DESC_IDLE ; +list_move (&chunk->node, &schan->ld_free); + } + } + + schan->pm_state =SHDMA_PM_ESTABLISHED ; + ret =pm_runtime_put (schan->dev); + +spin_unlock_irq (&schan->chan_lock); +return ret; + }if (schan->pm_state ==SHDMA_PM_PENDING )shdma_chan_xfer_ld_queue (schan);
drivers/dma/sh/shdmac.c +13 -4
@@ -300,21 +300,30 @@ static bool sh_dmae_channel_busy(struct shdma_chan *schan)return dmae_is_busy (sh_chan); } -static void sh_dmae_setup_xfer (struct shdma_chan *schan, -int slave_id) +static int sh_dmae_setup_xfer (struct shdma_chan *schan,int slave_id) { struct sh_dmae_chan *sh_chan = container_of(schan, struct sh_dmae_chan, shdma_chan); +int ret =0 ;if (slave_id >=0 ) {const struct sh_dmae_slave_config *cfg = sh_chan->config; -dmae_set_dmars (sh_chan, cfg->mid_rid); -dmae_set_chcr (sh_chan, cfg->chcr); + ret =dmae_set_dmars (sh_chan, cfg->mid_rid); +if (ret <0 ) + goto END; + + ret =dmae_set_chcr (sh_chan, cfg->chcr); +if (ret <0 ) + goto END; + }else {dmae_init (sh_chan); } + +END: +return ret; }/*
include/linux/shdma-base.h +1 -1
@@ -96,7 +96,7 @@ struct shdma_ops {int (*desc_setup)(struct shdma_chan *,struct shdma_desc *,dma_addr_t ,dma_addr_t ,size_t *);int (*set_slave)(struct shdma_chan *,int ,dma_addr_t ,bool ); -void (*setup_xfer)(struct shdma_chan *,int ); +int (*setup_xfer)(struct shdma_chan *,int );void (*start_xfer)(struct shdma_chan *,struct shdma_desc *);struct shdma_desc *(*embedded_desc)(void *,int );bool (*chan_irq)(struct shdma_chan *,int );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 282/565 dmaengine: mv_xor: match alloc_wc and free_wc
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit a33e3b667d2f004fdfae6b442bd4676f6c510abb ]
dma_alloc_wc is used but not dma_free_wc.
--- drivers/dma/mv_xor.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/dma/mv_xor.c +2 -2
@@ -1013,7 +1013,7 @@ static int mv_xor_channel_remove(struct mv_xor_chan *mv_chan)dma_async_device_unregister (&mv_chan->dmadev); -dma_free_coherent (dev,MV_XOR_POOL_SIZE , +dma_free_wc (dev,MV_XOR_POOL_SIZE , mv_chan->dma_desc_pool_virt, mv_chan->dma_desc_pool);dma_unmap_single (dev, mv_chan->dummy_src_addr,MV_XOR_MIN_BYTE_COUNT ,DMA_FROM_DEVICE );
@@ -1163,7 +1163,7 @@ mv_xor_channel_add(struct mv_xor_device *xordev, err_free_irq:free_irq (mv_chan->irq, mv_chan); err_free_dma: -dma_free_coherent (&pdev->dev,MV_XOR_POOL_SIZE , +dma_free_wc (&pdev->dev,MV_XOR_POOL_SIZE , mv_chan->dma_desc_pool_virt, mv_chan->dma_desc_pool); err_unmap_dst: dma_unmap_single(dma_dev->dev, mv_chan->dummy_dst_addr,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 283/565 dmaengine: dw-edma: Set status for callback_result
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Devendra K Verma <[email protected]>
[ Upstream commit 5e742de97c806a4048418237ef1283e7d71eaf4b ]
DMA Engine has support for the callback_result which provides the status of the request and the residue. This helps in determining the correct status of the request and in efficient resource management of the request.
The 'callback_result' method is preferred over the deprecated 'callback' method.
--- drivers/dma/dw-edma/dw-edma-core.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
drivers/dma/dw-edma/dw-edma-core.c +22 -0
@@ -595,6 +595,25 @@ dw_edma_device_prep_interleaved_dma(struct dma_chan *dchan,return dw_edma_device_transfer (&xfer); } +static void dw_hdma_set_callback_result (struct virt_dma_desc *vd, +enum dmaengine_tx_result result) +{ +u32 residue =0 ; +struct dw_edma_desc *desc; +struct dmaengine_result *res; + +if (!vd->tx.callback_result) +return ; + + desc =vd2dw_edma_desc (vd); +if (desc) + residue = desc->alloc_sz - desc->xfer_sz; + + res = &vd->tx_result; + res->result = result; + res->residue = residue; +} +static void dw_edma_done_interrupt (struct dw_edma_chan *chan) {struct dw_edma_desc *desc;
@@ -608,6 +627,8 @@ static void dw_edma_done_interrupt(struct dw_edma_chan *chan)case EDMA_REQ_NONE : desc =vd2dw_edma_desc (vd);if (!desc->chunks_alloc) { +dw_hdma_set_callback_result (vd, +DMA_TRANS_NOERROR );list_del (&vd->node);vchan_cookie_complete (vd); }
@@ -644,6 +665,7 @@ static void dw_edma_abort_interrupt(struct dw_edma_chan *chan)spin_lock_irqsave (&chan->vc.lock, flags); vd =vchan_next_desc (&chan->vc);if (vd) { +dw_hdma_set_callback_result (vd,DMA_TRANS_ABORTED );list_del (&vd->node);vchan_cookie_complete (vd); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 284/565 drm/msm/dsi/phy: Toggle back buffer resync after preparing PLL
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit b63f008f395ca5f6bc89123db97440bdc19981c4 ]
According to Hardware Programming Guide for DSI PHY, the retime buffer resync should be done after PLL clock users (byte_clk and intf_byte_clk) are enabled. Downstream also does it as part of configuring the PLL.
Driver was only turning off the resync FIFO buffer, but never bringing it on again.
Patchwork: https://patchwork.freedesktop.org/patch/657823/
--- drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c +4 -0
@@ -465,6 +465,10 @@ static int dsi_pll_7nm_vco_prepare(struct clk_hw *hw)if (pll_7nm->slave)dsi_pll_enable_global_clk (pll_7nm->slave); +writel (0x1 , pll_7nm->phy->base + REG_DSI_7nm_PHY_CMN_RBUF_CTRL); +if (pll_7nm->slave) +writel (0x1 , pll_7nm->slave->phy->base + REG_DSI_7nm_PHY_CMN_RBUF_CTRL); + error:return rc; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 285/565 drm/msm/dsi/phy_7nm: Fix missing initial VCO rate
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 5ddcb0cb9d10e6e70a68e0cb8f0b8e3a7eb8ccaf ]
Driver unconditionally saves current state on first init in dsi_pll_7nm_init(), but does not save the VCO rate, only some of the divider registers. The state is then restored during probe/enable via msm_dsi_phy_enable() -> msm_dsi_phy_pll_restore_state() -> dsi_7nm_pll_restore_state().
Restoring calls dsi_pll_7nm_vco_set_rate() with pll_7nm->vco_current_rate=0, which basically overwrites existing rate of VCO and messes with clock hierarchy, by setting frequency to 0 to clock tree. This makes anyway little sense - VCO rate was not saved, so should not be restored.
If PLL was not configured configure it to minimum rate to avoid glitches and configuring entire in clock hierarchy to 0 Hz.
Patchwork: https://patchwork.freedesktop.org/patch/657827/
--- drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c +6 -0
@@ -814,6 +814,12 @@ static int dsi_pll_7nm_init(struct msm_dsi_phy *phy)/* TODO: Remove this when we have proper display handover support */ msm_dsi_phy_pll_save_state (phy); +/* +* Store also proper vco_current_rate, because its value will be used in +* dsi_7nm_pll_restore_state(). +*/ +if (!dsi_pll_7nm_vco_recalc_rate (&pll_7nm->clk_hw,VCO_REF_CLK_RATE )) + pll_7nm->vco_current_rate = pll_7nm->phy->cfg->min_pll_rate;return 0 ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 286/565 drm/amdgpu: Allow kfd CRIU with no buffer objects
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Francis <[email protected]>
[ Upstream commit 85705b18ae7674347f8675f64b2b3115fb1d5629 ]
The kfd CRIU checkpoint ioctl would return an error if trying to checkpoint a process with no kfd buffer objects.
This is a normal case and should not be an error.
--- drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +2 -2
@@ -2572,8 +2572,8 @@ static int criu_restore(struct file *filep,pr_debug ("CRIU restore (num_devices:%u num_bos:%u num_objects:%u priv_data_size:%llu)\n" , args->num_devices, args->num_bos, args->num_objects, args->priv_data_size); -if (!args->bos || !args->devices || !args->priv_data || !args->priv_data_size || - !args->num_devices || !args->num_bos) +if ((args->num_bos >0 && !args->bos) || !args->devices || !args->priv_data || + !args->priv_data_size || !args->num_devices)return -EINVAL ;mutex_lock (&p->mutex);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 287/565 drm/xe/guc: Increase GuC crash dump buffer size
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhanjun Dong <[email protected]>
[ Upstream commit ad83b1da5b786ee2d245e41ce55cb1c71fed7c22 ]
There are platforms already have a maximum dump size of 12KB, to avoid data truncating, increase GuC crash dump buffer size to 16KB.
--- drivers/gpu/drm/xe/xe_guc_log.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/xe/xe_guc_log.h +1 -1
@@ -15,7 +15,7 @@ struct drm_printer;#define DEBUG_BUFFER_SIZE SZ_8M#define CAPTURE_BUFFER_SIZE SZ_2M#else -#define CRASH_BUFFER_SIZE SZ_8K +#define CRASH_BUFFER_SIZE SZ_16K#define DEBUG_BUFFER_SIZE SZ_64K#define CAPTURE_BUFFER_SIZE SZ_16K#endif
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 288/565 selftests: drv-net: rss_ctx: make the test pass with few queues
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit e2cf2d5baa09248d3d50b73522594b778388e3bc ]
rss_ctx.test_rss_key_indir implicitly expects at least 5 queues, as it checks that the traffic on first 2 queues is lower than the remaining queues when we use all queues. Special case fewer queues.
--- tools/testing/selftests/drivers/net/hw/rss_ctx.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
tools/testing/selftests/drivers/net/hw/rss_ctx.py +7 -2
@@ -161,8 +161,13 @@ def test_rss_key_indir(cfg): cnts = _get_rx_cnts(cfg) GenerateTraffic(cfg).wait_pkts_and_stop(20000) cnts = _get_rx_cnts(cfg, prev=cnts) - # First two queues get less traffic than all the rest - ksft_lt(sum(cnts[:2]), sum(cnts[2:]), "traffic distributed: " + str(cnts)) + if qcnt > 4: + # First two queues get less traffic than all the rest + ksft_lt(sum(cnts[:2]), sum(cnts[2:]), + "traffic distributed: " + str(cnts)) + else: + # When queue count is low make sure third queue got significant pkts + ksft_ge(cnts[2], 3500, "traffic distributed: " + str(cnts)) def test_rss_queue_reconfigure(cfg, main_ctx=True):
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 289/565 ipv6: Add sanity checks on ipv6_devconf.rpl_seg_enabled
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yue Haibing <[email protected]>
[ Upstream commit 3d95261eeb74958cd496e1875684827dc5d028cc ]
In ipv6_rpl_srh_rcv() we use min(net->ipv6.devconf_all->rpl_seg_enabled, idev->cnf.rpl_seg_enabled) is intended to return 0 when either value is zero, but if one of the values is negative it will in fact return non-zero.
--- net/ipv6/addrconf.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/ipv6/addrconf.c +3 -1
@@ -7176,7 +7176,9 @@ static const struct ctl_table addrconf_sysctl[] = { .data = &ipv6_devconf.rpl_seg_enabled, .maxlen = sizeof(int), .mode = 0644, - .proc_handler = proc_dointvec, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_ONE, }, { .procname = "ioam6_enabled",
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 290/565 drm/panthor: check bo offset alignment in vm bind
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chia-I Wu <[email protected]>
[ Upstream commit 5afa9d2a9bb1410f816e0123846047288b16e4b9 ]
Fail early from panthor_vm_bind_prepare_op_ctx instead of late from ops->map_pages.
--- drivers/gpu/drm/panthor/panthor_mmu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/panthor/panthor_mmu.c +2 -2
@@ -1219,7 +1219,7 @@ static int panthor_vm_prepare_map_op_ctx(struct panthor_vm_op_ctx *op_ctx, (flags & DRM_PANTHOR_VM_BIND_OP_TYPE_MASK) != DRM_PANTHOR_VM_BIND_OP_TYPE_MAP)return -EINVAL ; -/* Make sure the VA and size are aligned and in-bounds. */ +/* Make sure the VA and size are in-bounds. */ if (size > bo->base.base.size || offset > bo->base.base.size - size)return -EINVAL ;
@@ -2389,7 +2389,7 @@ panthor_vm_bind_prepare_op_ctx(struct drm_file *file,int ret;/* Aligned on page size. */ -if (!IS_ALIGNED (op->va | op->size, vm_pgsz)) +if (!IS_ALIGNED (op->va | op->size | op->bo_offset, vm_pgsz))return -EINVAL ;switch (op->flags &DRM_PANTHOR_VM_BIND_OP_TYPE_MASK ) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 291/565 drm: panel-backlight-quirks: Make EDID match optional
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antheas Kapenekakis <[email protected]>
[ Upstream commit 9931e4be11f2129a20ffd908bc364598a63016f8 ]
Currently, having a valid panel_id match is required to use the quirk system. For certain devices, we know that all SKUs need a certain quirk. Therefore, allow not specifying ident by only checking for a match if panel_id is non-zero.
--- drivers/gpu/drm/drm_panel_backlight_quirks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_panel_backlight_quirks.c +1 -1
@@ -49,7 +49,7 @@ static bool drm_panel_min_backlight_quirk_matches(const struct drm_panel_min_bacif (!dmi_match (quirk->dmi_match.field, quirk->dmi_match.value))return false; -if (!drm_edid_match (edid, &quirk->ident)) +if (quirk->ident.panel_id && !drm_edid_match (edid, &quirk->ident))return false;return true;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 292/565 net: nfc: nci: Increase NCI_DATA_TIMEOUT to 3000 ms
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Juraj Šarinay <[email protected]>
[ Upstream commit 21f82062d0f241e55dd59eb630e8710862cc90b4 ]
An exchange with a NFC target must complete within NCI_DATA_TIMEOUT. A delay of 700 ms is not sufficient for cryptographic operations on smart cards. CardOS 6.0 may need up to 1.3 seconds to perform 256-bit ECDH or 3072-bit RSA. To prevent brute-force attacks, passports and similar documents introduce even longer delays into access control protocols (BAC/PACE).
The timeout should be higher, but not too much. The expiration allows us to detect that a NFC target has disappeared.
--- include/net/nfc/nci_core.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/net/nfc/nci_core.h +1 -1
@@ -52,7 +52,7 @@ enum nci_state {#define NCI_RF_DISC_SELECT_TIMEOUT 5000#define NCI_RF_DEACTIVATE_TIMEOUT 30000#define NCI_CMD_TIMEOUT 5000 -#define NCI_DATA_TIMEOUT 700 +#define NCI_DATA_TIMEOUT 3000struct nci_dev ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 293/565 media: adv7180: Add missing lock in suspend callback
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Söderlund <[email protected]>
[ Upstream commit 878c496ac5080f94a93a9216a8f70cfd67ace8c9 ]
The adv7180_set_power() utilizes adv7180_write() which in turn requires the state mutex to be held, take it before calling adv7180_set_power() to avoid tripping a lockdep_assert_held().
--- drivers/media/i2c/adv7180.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/media/i2c/adv7180.c +6 -0
@@ -813,6 +813,8 @@ static int adv7180_set_pad_format(struct v4l2_subdev *sd,if (format->which ==V4L2_SUBDEV_FORMAT_ACTIVE ) {if (state->field != format->format.field) { +guard (mutex)(&state->mutex); + state->field = format->format.field;adv7180_set_power (state, false);adv7180_set_field_mode (state);
@@ -1564,6 +1566,8 @@ static int adv7180_suspend(struct device *dev)struct v4l2_subdev *sd =dev_get_drvdata (dev);struct adv7180_state *state =to_state (sd); +guard (mutex)(&state->mutex); +return adv7180_set_power (state, false); }
@@ -1577,6 +1581,8 @@ static int adv7180_resume(struct device *dev)if (ret <0 )return ret; +guard (mutex)(&state->mutex); + ret =adv7180_set_power (state, state->powered);if (ret)return ret;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 294/565 media: adv7180: Do not write format to device in set_fmt
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Söderlund <[email protected]>
[ Upstream commit 46c1e7814d1c3310ef23c01ed1a582ef0c8ab1d2 ]
The .set_fmt callback should not write the new format directly do the device, it should only store it and have it applied by .s_stream.
The .s_stream callback already calls adv7180_set_field_mode() so it's safe to remove programming of the device and just store the format and have .s_stream apply it.
--- drivers/media/i2c/adv7180.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-)
drivers/media/i2c/adv7180.c +1 -8
@@ -812,14 +812,7 @@ static int adv7180_set_pad_format(struct v4l2_subdev *sd, ret =adv7180_mbus_fmt (sd, &format->format);if (format->which ==V4L2_SUBDEV_FORMAT_ACTIVE ) { -if (state->field != format->format.field) { -guard (mutex)(&state->mutex); - - state->field = format->format.field; -adv7180_set_power (state, false); -adv7180_set_field_mode (state); -adv7180_set_power (state, true); - } + state->field = format->format.field; }else { framefmt =v4l2_subdev_state_get_format (sd_state,0 ); *framefmt = format->format;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 295/565 media: adv7180: Only validate format in querystd
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Söderlund <[email protected]>
[ Upstream commit 91c5d7c849273d14bc4bae1b92666bdb5409294a ]
The .querystd callback should not program the device with the detected standard, it should only report the standard to user-space. User-space may then use .s_std to set the standard, if it wants to use it.
All that is required of .querystd is to setup the auto detection of standards and report its findings.
While at it add some documentation on why this can't happen while streaming and improve the error handling using a scoped guard.
--- drivers/media/i2c/adv7180.c | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-)
drivers/media/i2c/adv7180.c +16 -21
@@ -357,32 +357,27 @@ static inline struct adv7180_state *to_state(struct v4l2_subdev *sd)static int adv7180_querystd (struct v4l2_subdev *sd,v4l2_std_id *std) {struct adv7180_state *state =to_state (sd); -int err =mutex_lock_interruptible (&state->mutex); -if (err) -return err; - -if (state->streaming) { - err = -EBUSY ; - goto unlock; - } +int ret; - err =adv7180_set_video_standard (state, -ADV7180_STD_AD_PAL_BG_NTSC_J_SECAM ); -if (err) - goto unlock; +guard (mutex)(&state->mutex); -msleep (100 ); -__adv7180_status (state,NULL , std); +/* +* We can't sample the standard if the device is streaming as that would +* interfere with the capture session as the VID_SEL reg is touched. +*/ +if (state->streaming) +return -EBUSY ; - err =v4l2_std_to_adv7180 (state->curr_norm); -if (err <0 ) - goto unlock; +/* Set the standard to autodetect PAL B/G/H/I/D, NTSC J or SECAM */ + ret =adv7180_set_video_standard (state, +ADV7180_STD_AD_PAL_BG_NTSC_J_SECAM ); +if (ret) +return ret; - err =adv7180_set_video_standard (state, err); +/* Allow some time for the autodetection to run. */ +msleep (100 ); -unlock: -mutex_unlock (&state->mutex); -return err; +return __adv7180_status (state,NULL , std); } static int adv7180_s_routing(struct v4l2_subdev *sd, u32 input,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 296/565 media: verisilicon: Explicitly disable selection api ioctls for decoders
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Kocialkowski <[email protected]>
[ Upstream commit 73d50aa92f28ee8414fbfde011974fce970b82cc ]
Call the dedicated v4l2_disable_ioctl helper instead of manually checking whether the current context is an encoder for the selection api ioctls.
--- drivers/media/platform/verisilicon/hantro_drv.c | 2 ++ drivers/media/platform/verisilicon/hantro_v4l2.c | 6 ++---- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/media/platform/verisilicon/hantro_drv.c +2 -0
@@ -918,6 +918,8 @@ static int hantro_add_func(struct hantro_dev *vpu, unsigned int funcid) vpu->decoder = func;v4l2_disable_ioctl (vfd,VIDIOC_TRY_ENCODER_CMD );v4l2_disable_ioctl (vfd,VIDIOC_ENCODER_CMD ); +v4l2_disable_ioctl (vfd,VIDIOC_G_SELECTION ); +v4l2_disable_ioctl (vfd,VIDIOC_S_SELECTION ); }video_set_drvdata (vfd, vpu);
drivers/media/platform/verisilicon/hantro_v4l2.c +2 -4
@@ -633,8 +633,7 @@ static int vidioc_g_selection(struct file *file, void *priv,struct hantro_ctx *ctx =fh_to_ctx (priv);/* Crop only supported on source. */ -if (!ctx->is_encoder || - sel->type !=V4L2_BUF_TYPE_VIDEO_OUTPUT ) +if (sel->type !=V4L2_BUF_TYPE_VIDEO_OUTPUT )return -EINVAL ;switch (sel->target) {
@@ -666,8 +665,7 @@ static int vidioc_s_selection(struct file *file, void *priv,struct vb2_queue *vq;/* Crop only supported on source. */ -if (!ctx->is_encoder || - sel->type !=V4L2_BUF_TYPE_VIDEO_OUTPUT ) +if (sel->type !=V4L2_BUF_TYPE_VIDEO_OUTPUT )return -EINVAL ;/* Change not allowed if the queue is streaming. */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 297/565 wifi: mac80211: Fix 6 GHz Band capabilities element advertisement in lower bands
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ramya Gnanasekar <[email protected]>
[ Upstream commit e53f8b12a21c2974b66fa8c706090182da06fff3 ]
Currently, when adding the 6 GHz Band Capabilities element, the channel list of the wiphy is checked to determine if 6 GHz is supported for a given virtual interface. However, in a multi-radio wiphy (e.g., one that has both lower bands and 6 GHz combined), the wiphy advertises support for all bands. As a result, the 6 GHz Band Capabilities element is incorrectly included in mesh beacon and station's association request frames of interfaces operating in lower bands, without verifying whether the interface is actually operating in a 6 GHz channel.
Fix this by verifying if the interface operates on 6 GHz channel before adding the element. Note that this check cannot be placed directly in ieee80211_put_he_6ghz_cap() as the same function is used to add probe request elements while initiating scan in which case the interface may not be operating in any band's channel.
--- net/mac80211/mesh.c | 3 +++ net/mac80211/mlme.c | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-)
net/mac80211/mesh.c +3 -0
@@ -623,6 +623,9 @@ int mesh_add_he_6ghz_cap_ie(struct ieee80211_sub_if_data *sdata,if (!sband)return -EINVAL ; +if (sband->band !=NL80211_BAND_6GHZ ) +return 0 ; + iftd =ieee80211_get_sband_iftype_data (sband,NL80211_IFTYPE_MESH_POINT );/* The device doesn't support HE in mesh mode or at all */
net/mac80211/mlme.c +2 -1
@@ -1569,7 +1569,8 @@ static size_t ieee80211_assoc_link_elems(struct ieee80211_sub_if_data *sdata,ieee80211_put_he_cap (skb, sdata, sband, &assoc_data->link[link_id].conn);ADD_PRESENT_EXT_ELEM (WLAN_EID_EXT_HE_CAPABILITY ); -ieee80211_put_he_6ghz_cap (skb, sdata, smps_mode); +if (sband->band ==NL80211_BAND_6GHZ ) +ieee80211_put_he_6ghz_cap (skb, sdata, smps_mode); }/*
Signature · 1 line
2.51.0