From: Sasha Levin Date: Fri, 22 Mar 2024 16:53:57 +0000 (-0400) Subject: Fixes for 5.4 X-Git-Tag: v6.8.2~83 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b65b24c829017ea14c66940a8bf7352259e212ea;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 5.4 Signed-off-by: Sasha Levin --- diff --git a/queue-5.4/acpi-processor_idle-fix-memory-leak-in-acpi_processo.patch b/queue-5.4/acpi-processor_idle-fix-memory-leak-in-acpi_processo.patch new file mode 100644 index 00000000000..c7220e7192e --- /dev/null +++ b/queue-5.4/acpi-processor_idle-fix-memory-leak-in-acpi_processo.patch @@ -0,0 +1,61 @@ +From 28131c6dbf02565651cada6d2bc0c21a75e16154 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 13 Feb 2024 01:41:58 +0100 +Subject: ACPI: processor_idle: Fix memory leak in acpi_processor_power_exit() + +From: Armin Wolf + +[ Upstream commit e18afcb7b2a12b635ac10081f943fcf84ddacc51 ] + +After unregistering the CPU idle device, the memory associated with +it is not freed, leading to a memory leak: + +unreferenced object 0xffff896282f6c000 (size 1024): + comm "swapper/0", pid 1, jiffies 4294893170 + hex dump (first 32 bytes): + 00 00 00 00 0b 00 00 00 00 00 00 00 00 00 00 00 ................ + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + backtrace (crc 8836a742): + [] kmalloc_trace+0x29d/0x340 + [] acpi_processor_power_init+0xf3/0x1c0 + [] __acpi_processor_start+0xd3/0xf0 + [] acpi_processor_start+0x2c/0x50 + [] really_probe+0xe2/0x480 + [] __driver_probe_device+0x78/0x160 + [] driver_probe_device+0x1f/0x90 + [] __driver_attach+0xce/0x1c0 + [] bus_for_each_dev+0x70/0xc0 + [] bus_add_driver+0x112/0x210 + [] driver_register+0x55/0x100 + [] acpi_processor_driver_init+0x3b/0xc0 + [] do_one_initcall+0x41/0x300 + [] kernel_init_freeable+0x320/0x470 + [] kernel_init+0x16/0x1b0 + [] ret_from_fork+0x2d/0x50 + +Fix this by freeing the CPU idle device after unregistering it. + +Fixes: 3d339dcbb56d ("cpuidle / ACPI : move cpuidle_device field out of the acpi_processor_power structure") +Signed-off-by: Armin Wolf +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/processor_idle.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c +index 0ea5e677f00ee..0aca77cb8301c 100644 +--- a/drivers/acpi/processor_idle.c ++++ b/drivers/acpi/processor_idle.c +@@ -1531,6 +1531,8 @@ int acpi_processor_power_exit(struct acpi_processor *pr) + acpi_processor_registered--; + if (acpi_processor_registered == 0) + cpuidle_unregister_driver(&acpi_idle_driver); ++ ++ kfree(dev); + } + + pr->flags.power_setup_done = 0; +-- +2.43.0 + diff --git a/queue-5.4/acpi-scan-fix-device-check-notification-handling.patch b/queue-5.4/acpi-scan-fix-device-check-notification-handling.patch new file mode 100644 index 00000000000..2c40212fa4e --- /dev/null +++ b/queue-5.4/acpi-scan-fix-device-check-notification-handling.patch @@ -0,0 +1,57 @@ +From 4c616a0d14727251679cdd19e8bd4924f084b7a3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 Feb 2024 17:35:27 +0100 +Subject: ACPI: scan: Fix device check notification handling + +From: Rafael J. Wysocki + +[ Upstream commit 793551c965116d9dfaf0550dacae1396a20efa69 ] + +It is generally invalid to fail a Device Check notification if the scan +handler has not been attached to the given device after a bus rescan, +because there may be valid reasons for the scan handler to refuse +attaching to the device (for example, the device is not ready). + +For this reason, modify acpi_scan_device_check() to return 0 in that +case without printing a warning. + +While at it, reduce the log level of the "already enumerated" message +in the same function, because it is only interesting when debugging +notification handling + +Fixes: 443fc8202272 ("ACPI / hotplug: Rework generic code to handle suprise removals") +Signed-off-by: Rafael J. Wysocki +Reviewed-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + drivers/acpi/scan.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c +index 5d4be80ee6cb4..629e6044f6233 100644 +--- a/drivers/acpi/scan.c ++++ b/drivers/acpi/scan.c +@@ -322,18 +322,14 @@ static int acpi_scan_device_check(struct acpi_device *adev) + * again). + */ + if (adev->handler) { +- dev_warn(&adev->dev, "Already enumerated\n"); +- return -EALREADY; ++ dev_dbg(&adev->dev, "Already enumerated\n"); ++ return 0; + } + error = acpi_bus_scan(adev->handle); + if (error) { + dev_warn(&adev->dev, "Namespace scan failure\n"); + return error; + } +- if (!adev->handler) { +- dev_warn(&adev->dev, "Enumeration failure\n"); +- error = -ENODEV; +- } + } else { + error = acpi_scan_device_not_present(adev); + } +-- +2.43.0 + diff --git a/queue-5.4/af_unix-annotate-data-race-of-gc_in_progress-in-wait.patch b/queue-5.4/af_unix-annotate-data-race-of-gc_in_progress-in-wait.patch new file mode 100644 index 00000000000..5f26bdaf6a9 --- /dev/null +++ b/queue-5.4/af_unix-annotate-data-race-of-gc_in_progress-in-wait.patch @@ -0,0 +1,39 @@ +From b88e1dedcbdeef203c17b12d136f3a3d0ae6cf70 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 23 Jan 2024 09:08:52 -0800 +Subject: af_unix: Annotate data-race of gc_in_progress in wait_for_unix_gc(). + +From: Kuniyuki Iwashima + +[ Upstream commit 31e03207119a535d0b0e3b3a7f91983aeb2cb14d ] + +gc_in_progress is changed under spin_lock(&unix_gc_lock), +but wait_for_unix_gc() reads it locklessly. + +Let's use READ_ONCE(). + +Fixes: 5f23b734963e ("net: Fix soft lockups/OOM issues w/ unix garbage collector") +Signed-off-by: Kuniyuki Iwashima +Link: https://lore.kernel.org/r/20240123170856.41348-2-kuniyu@amazon.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/unix/garbage.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/unix/garbage.c b/net/unix/garbage.c +index dc27635403932..9121a4d5436d5 100644 +--- a/net/unix/garbage.c ++++ b/net/unix/garbage.c +@@ -198,7 +198,7 @@ void wait_for_unix_gc(void) + if (READ_ONCE(unix_tot_inflight) > UNIX_INFLIGHT_TRIGGER_GC && + !READ_ONCE(gc_in_progress)) + unix_gc(); +- wait_event(unix_gc_wait, gc_in_progress == false); ++ wait_event(unix_gc_wait, !READ_ONCE(gc_in_progress)); + } + + /* The external entry point: unix_gc() */ +-- +2.43.0 + diff --git a/queue-5.4/afs-revert-afs-hide-silly-rename-files-from-userspac.patch b/queue-5.4/afs-revert-afs-hide-silly-rename-files-from-userspac.patch new file mode 100644 index 00000000000..1a16d1a7d8e --- /dev/null +++ b/queue-5.4/afs-revert-afs-hide-silly-rename-files-from-userspac.patch @@ -0,0 +1,55 @@ +From 21c2b9027fd03f6badb79effcb9ced7c3f2800db Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Mar 2024 11:08:41 +0000 +Subject: afs: Revert "afs: Hide silly-rename files from userspace" + +From: David Howells + +[ Upstream commit 0aec3847d044273733285dcff90afda89ad461d2 ] + +This reverts commit 57e9d49c54528c49b8bffe6d99d782ea051ea534. + +This undoes the hiding of .__afsXXXX silly-rename files. The problem with +hiding them is that rm can't then manually delete them. + +This also reverts commit 5f7a07646655fb4108da527565dcdc80124b14c4 ("afs: Fix +endless loop in directory parsing") as that's a bugfix for the above. + +Fixes: 57e9d49c5452 ("afs: Hide silly-rename files from userspace") +Reported-by: Markus Suvanto +Link: https://lists.infradead.org/pipermail/linux-afs/2024-February/008102.html +Signed-off-by: David Howells +Link: https://lore.kernel.org/r/3085695.1710328121@warthog.procyon.org.uk +Reviewed-by: Jeffrey E Altman +cc: Marc Dionne +cc: linux-afs@lists.infradead.org +Signed-off-by: Christian Brauner +Signed-off-by: Sasha Levin +--- + fs/afs/dir.c | 10 ---------- + 1 file changed, 10 deletions(-) + +diff --git a/fs/afs/dir.c b/fs/afs/dir.c +index 1ada9b9cb21ec..43f5b972fcead 100644 +--- a/fs/afs/dir.c ++++ b/fs/afs/dir.c +@@ -421,16 +421,6 @@ static int afs_dir_iterate_block(struct afs_vnode *dvnode, + continue; + } + +- /* Don't expose silly rename entries to userspace. */ +- if (nlen > 6 && +- dire->u.name[0] == '.' && +- ctx->actor != afs_lookup_filldir && +- ctx->actor != afs_lookup_one_filldir && +- memcmp(dire->u.name, ".__afs", 6) == 0) { +- ctx->pos = blkoff + next * sizeof(union afs_xdr_dirent); +- continue; +- } +- + /* found the next entry */ + if (!dir_emit(ctx, dire->u.name, nlen, + ntohl(dire->u.vnode), +-- +2.43.0 + diff --git a/queue-5.4/alsa-seq-fix-function-cast-warnings.patch b/queue-5.4/alsa-seq-fix-function-cast-warnings.patch new file mode 100644 index 00000000000..b29ad9fd521 --- /dev/null +++ b/queue-5.4/alsa-seq-fix-function-cast-warnings.patch @@ -0,0 +1,95 @@ +From 3f648c02c83e5221bc8290d95356a63398d0096a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 13 Feb 2024 14:53:43 +0100 +Subject: ALSA: seq: fix function cast warnings + +From: Takashi Iwai + +[ Upstream commit d7bf73809849463f76de42aad62c850305dd6c5d ] + +clang-16 points out a control flow integrity (kcfi) issue when event +callbacks get converted to incompatible types: + +sound/core/seq/seq_midi.c:135:30: error: cast from 'int (*)(struct snd_rawmidi_substream *, const char *, int)' to 'snd_seq_dump_func_t' (aka 'int (*)(void *, void *, int)') converts to incompatible function type [-Werror,-Wcast-function-type-strict] + 135 | snd_seq_dump_var_event(ev, (snd_seq_dump_func_t)dump_midi, substream); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +sound/core/seq/seq_virmidi.c:83:31: error: cast from 'int (*)(struct snd_rawmidi_substream *, const unsigned char *, int)' to 'snd_seq_dump_func_t' (aka 'int (*)(void *, void *, int)') converts to incompatible function type [-Werror,-Wcast-function-type-strict] + 83 | snd_seq_dump_var_event(ev, (snd_seq_dump_func_t)snd_rawmidi_receive, vmidi->substream); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For addressing those errors, introduce wrapper functions that are used +for callbacks and bridge to the actual function call with pointer +cast. + +The code was originally added with the initial ALSA merge in linux-2.5.4. + +[ the patch description shamelessly copied from Arnd's original patch + -- tiwai ] + +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Reported-by: Arnd Bergmann +Link: https://lore.kernel.org/r/20240213101020.459183-1-arnd@kernel.org +Link: https://lore.kernel.org/r/20240213135343.16411-1-tiwai@suse.de +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + sound/core/seq/seq_midi.c | 8 +++++++- + sound/core/seq/seq_virmidi.c | 9 ++++++++- + 2 files changed, 15 insertions(+), 2 deletions(-) + +diff --git a/sound/core/seq/seq_midi.c b/sound/core/seq/seq_midi.c +index 6825940ea2cf8..a741d1ae6639a 100644 +--- a/sound/core/seq/seq_midi.c ++++ b/sound/core/seq/seq_midi.c +@@ -111,6 +111,12 @@ static int dump_midi(struct snd_rawmidi_substream *substream, const char *buf, i + return 0; + } + ++/* callback for snd_seq_dump_var_event(), bridging to dump_midi() */ ++static int __dump_midi(void *ptr, void *buf, int count) ++{ ++ return dump_midi(ptr, buf, count); ++} ++ + static int event_process_midi(struct snd_seq_event *ev, int direct, + void *private_data, int atomic, int hop) + { +@@ -130,7 +136,7 @@ static int event_process_midi(struct snd_seq_event *ev, int direct, + pr_debug("ALSA: seq_midi: invalid sysex event flags = 0x%x\n", ev->flags); + return 0; + } +- snd_seq_dump_var_event(ev, (snd_seq_dump_func_t)dump_midi, substream); ++ snd_seq_dump_var_event(ev, __dump_midi, substream); + snd_midi_event_reset_decode(msynth->parser); + } else { + if (msynth->parser == NULL) +diff --git a/sound/core/seq/seq_virmidi.c b/sound/core/seq/seq_virmidi.c +index 77d7037d1476f..82396b8c885a5 100644 +--- a/sound/core/seq/seq_virmidi.c ++++ b/sound/core/seq/seq_virmidi.c +@@ -62,6 +62,13 @@ static void snd_virmidi_init_event(struct snd_virmidi *vmidi, + /* + * decode input event and put to read buffer of each opened file + */ ++ ++/* callback for snd_seq_dump_var_event(), bridging to snd_rawmidi_receive() */ ++static int dump_to_rawmidi(void *ptr, void *buf, int count) ++{ ++ return snd_rawmidi_receive(ptr, buf, count); ++} ++ + static int snd_virmidi_dev_receive_event(struct snd_virmidi_dev *rdev, + struct snd_seq_event *ev, + bool atomic) +@@ -80,7 +87,7 @@ static int snd_virmidi_dev_receive_event(struct snd_virmidi_dev *rdev, + if (ev->type == SNDRV_SEQ_EVENT_SYSEX) { + if ((ev->flags & SNDRV_SEQ_EVENT_LENGTH_MASK) != SNDRV_SEQ_EVENT_LENGTH_VARIABLE) + continue; +- snd_seq_dump_var_event(ev, (snd_seq_dump_func_t)snd_rawmidi_receive, vmidi->substream); ++ snd_seq_dump_var_event(ev, dump_to_rawmidi, vmidi->substream); + snd_midi_event_reset_decode(vmidi->parser); + } else { + len = snd_midi_event_decode(vmidi->parser, msg, sizeof(msg), ev); +-- +2.43.0 + diff --git a/queue-5.4/alsa-usb-audio-stop-parsing-channels-bits-when-all-c.patch b/queue-5.4/alsa-usb-audio-stop-parsing-channels-bits-when-all-c.patch new file mode 100644 index 00000000000..505aee984ab --- /dev/null +++ b/queue-5.4/alsa-usb-audio-stop-parsing-channels-bits-when-all-c.patch @@ -0,0 +1,43 @@ +From 5571648898090f7bf7b0d0d928c2c2ef52a5a2bd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Mar 2024 09:15:09 +0100 +Subject: ALSA: usb-audio: Stop parsing channels bits when all channels are + found. + +From: Johan Carlsson + +[ Upstream commit a39d51ff1f52cd0b6fe7d379ac93bd8b4237d1b7 ] + +If a usb audio device sets more bits than the amount of channels +it could write outside of the map array. + +Signed-off-by: Johan Carlsson +Fixes: 04324ccc75f9 ("ALSA: usb-audio: add channel map support") +Message-ID: <20240313081509.9801-1-johan.carlsson@teenage.engineering> +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + sound/usb/stream.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/sound/usb/stream.c b/sound/usb/stream.c +index d35684e5f07f0..967f05d7e205f 100644 +--- a/sound/usb/stream.c ++++ b/sound/usb/stream.c +@@ -301,9 +301,12 @@ static struct snd_pcm_chmap_elem *convert_chmap(int channels, unsigned int bits, + c = 0; + + if (bits) { +- for (; bits && *maps; maps++, bits >>= 1) ++ for (; bits && *maps; maps++, bits >>= 1) { + if (bits & 1) + chmap->map[c++] = *maps; ++ if (c == chmap->channels) ++ break; ++ } + } else { + /* If we're missing wChannelConfig, then guess something + to make sure the channel map is not skipped entirely */ +-- +2.43.0 + diff --git a/queue-5.4/aoe-fix-the-potential-use-after-free-problem-in-aoec.patch b/queue-5.4/aoe-fix-the-potential-use-after-free-problem-in-aoec.patch new file mode 100644 index 00000000000..aac97e49935 --- /dev/null +++ b/queue-5.4/aoe-fix-the-potential-use-after-free-problem-in-aoec.patch @@ -0,0 +1,88 @@ +From 02eeaeb239f88e5ce552c2544ca548b0a9306e02 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Mar 2024 16:20:48 +0800 +Subject: aoe: fix the potential use-after-free problem in aoecmd_cfg_pkts + +From: Chun-Yi Lee + +[ Upstream commit f98364e926626c678fb4b9004b75cacf92ff0662 ] + +This patch is against CVE-2023-6270. The description of cve is: + + A flaw was found in the ATA over Ethernet (AoE) driver in the Linux + kernel. The aoecmd_cfg_pkts() function improperly updates the refcnt on + `struct net_device`, and a use-after-free can be triggered by racing + between the free on the struct and the access through the `skbtxq` + global queue. This could lead to a denial of service condition or + potential code execution. + +In aoecmd_cfg_pkts(), it always calls dev_put(ifp) when skb initial +code is finished. But the net_device ifp will still be used in +later tx()->dev_queue_xmit() in kthread. Which means that the +dev_put(ifp) should NOT be called in the success path of skb +initial code in aoecmd_cfg_pkts(). Otherwise tx() may run into +use-after-free because the net_device is freed. + +This patch removed the dev_put(ifp) in the success path in +aoecmd_cfg_pkts(), and added dev_put() after skb xmit in tx(). + +Link: https://nvd.nist.gov/vuln/detail/CVE-2023-6270 +Fixes: 7562f876cd93 ("[NET]: Rework dev_base via list_head (v3)") +Signed-off-by: Chun-Yi Lee +Link: https://lore.kernel.org/r/20240305082048.25526-1-jlee@suse.com +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + drivers/block/aoe/aoecmd.c | 12 ++++++------ + drivers/block/aoe/aoenet.c | 1 + + 2 files changed, 7 insertions(+), 6 deletions(-) + +diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c +index 3cf9bc5d8d959..3d5117be57f9f 100644 +--- a/drivers/block/aoe/aoecmd.c ++++ b/drivers/block/aoe/aoecmd.c +@@ -420,13 +420,16 @@ aoecmd_cfg_pkts(ushort aoemajor, unsigned char aoeminor, struct sk_buff_head *qu + rcu_read_lock(); + for_each_netdev_rcu(&init_net, ifp) { + dev_hold(ifp); +- if (!is_aoe_netif(ifp)) +- goto cont; ++ if (!is_aoe_netif(ifp)) { ++ dev_put(ifp); ++ continue; ++ } + + skb = new_skb(sizeof *h + sizeof *ch); + if (skb == NULL) { + printk(KERN_INFO "aoe: skb alloc failure\n"); +- goto cont; ++ dev_put(ifp); ++ continue; + } + skb_put(skb, sizeof *h + sizeof *ch); + skb->dev = ifp; +@@ -441,9 +444,6 @@ aoecmd_cfg_pkts(ushort aoemajor, unsigned char aoeminor, struct sk_buff_head *qu + h->major = cpu_to_be16(aoemajor); + h->minor = aoeminor; + h->cmd = AOECMD_CFG; +- +-cont: +- dev_put(ifp); + } + rcu_read_unlock(); + } +diff --git a/drivers/block/aoe/aoenet.c b/drivers/block/aoe/aoenet.c +index 63773a90581dd..1e66c7a188a12 100644 +--- a/drivers/block/aoe/aoenet.c ++++ b/drivers/block/aoe/aoenet.c +@@ -64,6 +64,7 @@ tx(int id) __must_hold(&txlock) + pr_warn("aoe: packet could not be sent on %s. %s\n", + ifp ? ifp->name : "netif", + "consider increasing tx_queue_len"); ++ dev_put(ifp); + spin_lock_irq(&txlock); + } + return 0; +-- +2.43.0 + diff --git a/queue-5.4/arch-powerpc-remove-linux-fb.h-from-backlight-code.patch b/queue-5.4/arch-powerpc-remove-linux-fb.h-from-backlight-code.patch new file mode 100644 index 00000000000..6989eb1c252 --- /dev/null +++ b/queue-5.4/arch-powerpc-remove-linux-fb.h-from-backlight-code.patch @@ -0,0 +1,98 @@ +From 386a937d0b3d43b9e3e3dcd86357e7e103ecc41b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 6 Mar 2024 13:28:20 +0100 +Subject: arch/powerpc: Remove from backlight code + +From: Thomas Zimmermann + +[ Upstream commit 838f865802b9f26135ea7df4e30f89ac2f50c23e ] + +Replace with a forward declaration in to +resolve an unnecessary dependency. Remove pmac_backlight_curve_lookup() +and struct fb_info from source and header files. The function and the +framebuffer struct are unused. No functional changes. + +v3: + * Add Fixes tag (Christophe) + * fix typos in commit message (Jani) + +Signed-off-by: Thomas Zimmermann +Fixes: d565dd3b0824 ("[PATCH] powerpc: More via-pmu backlight fixes") +Reviewed-by: Jani Nikula +Acked-by: Michael Ellerman # (powerpc) +Link: https://patchwork.freedesktop.org/patch/msgid/20240306122935.10626-4-tzimmermann@suse.de +Signed-off-by: Sasha Levin +--- + arch/powerpc/include/asm/backlight.h | 5 ++-- + arch/powerpc/platforms/powermac/backlight.c | 26 --------------------- + 2 files changed, 2 insertions(+), 29 deletions(-) + +diff --git a/arch/powerpc/include/asm/backlight.h b/arch/powerpc/include/asm/backlight.h +index 1b5eab62ed047..061a910d74929 100644 +--- a/arch/powerpc/include/asm/backlight.h ++++ b/arch/powerpc/include/asm/backlight.h +@@ -10,15 +10,14 @@ + #define __ASM_POWERPC_BACKLIGHT_H + #ifdef __KERNEL__ + +-#include + #include + ++struct backlight_device; ++ + /* For locking instructions, see the implementation file */ + extern struct backlight_device *pmac_backlight; + extern struct mutex pmac_backlight_mutex; + +-extern int pmac_backlight_curve_lookup(struct fb_info *info, int value); +- + extern int pmac_has_backlight_type(const char *type); + + extern void pmac_backlight_key(int direction); +diff --git a/arch/powerpc/platforms/powermac/backlight.c b/arch/powerpc/platforms/powermac/backlight.c +index 32224cb489d75..eab339d2059d5 100644 +--- a/arch/powerpc/platforms/powermac/backlight.c ++++ b/arch/powerpc/platforms/powermac/backlight.c +@@ -9,7 +9,6 @@ + */ + + #include +-#include + #include + #include + #include +@@ -73,31 +72,6 @@ int pmac_has_backlight_type(const char *type) + return 0; + } + +-int pmac_backlight_curve_lookup(struct fb_info *info, int value) +-{ +- int level = (FB_BACKLIGHT_LEVELS - 1); +- +- if (info && info->bl_dev) { +- int i, max = 0; +- +- /* Look for biggest value */ +- for (i = 0; i < FB_BACKLIGHT_LEVELS; i++) +- max = max((int)info->bl_curve[i], max); +- +- /* Look for nearest value */ +- for (i = 0; i < FB_BACKLIGHT_LEVELS; i++) { +- int diff = abs(info->bl_curve[i] - value); +- if (diff < max) { +- max = diff; +- level = i; +- } +- } +- +- } +- +- return level; +-} +- + static void pmac_backlight_key_worker(struct work_struct *work) + { + if (atomic_read(&kernel_backlight_disabled)) +-- +2.43.0 + diff --git a/queue-5.4/arm-dts-arm-realview-fix-development-chip-rom-compat.patch b/queue-5.4/arm-dts-arm-realview-fix-development-chip-rom-compat.patch new file mode 100644 index 00000000000..5b5f8b787a8 --- /dev/null +++ b/queue-5.4/arm-dts-arm-realview-fix-development-chip-rom-compat.patch @@ -0,0 +1,43 @@ +From 5d42c847d6d54abd4e8ce80310b57b3a77df3c4a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 30 Aug 2023 17:03:04 +0200 +Subject: ARM: dts: arm: realview: Fix development chip ROM compatible value + +From: Geert Uytterhoeven + +[ Upstream commit 3baa4c5143d65ebab2de0d99a395e5f4f1f46608 ] + +When the development chip ROM was added, the "direct-mapped" compatible +value was already obsolete. In addition, the device node lacked the +accompanying "probe-type" property, causing the old physmap_of_core +driver to fall back to trying all available probe types. +Unfortunately this fallback was lost when the DT and pdata cases were +merged. + +Fix this by using the modern "mtd-rom" compatible value instead. + +Fixes: 5c3f5edbe0a1dff3 ("ARM: realview: add flash devices to the PB1176 DTS") +Fixes: 642b1e8dbed7bbbf ("mtd: maps: Merge physmap_of.c into physmap-core.c") +Signed-off-by: Geert Uytterhoeven +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/arm-realview-pb1176.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/arm-realview-pb1176.dts b/arch/arm/boot/dts/arm-realview-pb1176.dts +index 2625ce66f8e7e..673c6e5b2f565 100644 +--- a/arch/arm/boot/dts/arm-realview-pb1176.dts ++++ b/arch/arm/boot/dts/arm-realview-pb1176.dts +@@ -435,7 +435,7 @@ pb1176_serial3: serial@1010f000 { + + /* Direct-mapped development chip ROM */ + pb1176_rom@10200000 { +- compatible = "direct-mapped"; ++ compatible = "mtd-rom"; + reg = <0x10200000 0x4000>; + bank-width = <1>; + }; +-- +2.43.0 + diff --git a/queue-5.4/arm-dts-imx6dl-yapp4-fix-typo-in-the-qca-switch-regi.patch b/queue-5.4/arm-dts-imx6dl-yapp4-fix-typo-in-the-qca-switch-regi.patch new file mode 100644 index 00000000000..ed4040f899f --- /dev/null +++ b/queue-5.4/arm-dts-imx6dl-yapp4-fix-typo-in-the-qca-switch-regi.patch @@ -0,0 +1,42 @@ +From 2c4e79e51452c988dfd2fffda5f0096be19b3990 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 14 Feb 2024 10:03:27 +0100 +Subject: ARM: dts: imx6dl-yapp4: Fix typo in the QCA switch register address +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Michal Vokáč + +[ Upstream commit 023bd910d3ab735459f84b22bb99fb9e00bd9d76 ] + +This change does not have any functional effect. The switch works just +fine without this patch as it has full access to all the addresses +on the bus. This is simply a clean-up to set the node name address +and reg address to the same value. + +Fixes: 15b43e497ffd ("ARM: dts: imx6dl-yapp4: Use correct pseudo PHY address for the switch") +Signed-off-by: Michal Vokáč +Reviewed-by: Andrew Lunn +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6dl-yapp4-common.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/imx6dl-yapp4-common.dtsi b/arch/arm/boot/dts/imx6dl-yapp4-common.dtsi +index 4d1e65c307f86..e86f409ca8801 100644 +--- a/arch/arm/boot/dts/imx6dl-yapp4-common.dtsi ++++ b/arch/arm/boot/dts/imx6dl-yapp4-common.dtsi +@@ -118,7 +118,7 @@ phy_port3: phy@2 { + + switch@10 { + compatible = "qca,qca8334"; +- reg = <10>; ++ reg = <0x10>; + reset-gpios = <&gpio1 25 GPIO_ACTIVE_LOW>; + + switch_ports: ports { +-- +2.43.0 + diff --git a/queue-5.4/arm-dts-imx6dl-yapp4-move-phy-reset-into-switch-node.patch b/queue-5.4/arm-dts-imx6dl-yapp4-move-phy-reset-into-switch-node.patch new file mode 100644 index 00000000000..ff9b57dabf5 --- /dev/null +++ b/queue-5.4/arm-dts-imx6dl-yapp4-move-phy-reset-into-switch-node.patch @@ -0,0 +1,47 @@ +From baad6392e010af3ac4f8ceee8c8688428fefee0b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 14 Mar 2023 19:06:04 +0100 +Subject: ARM: dts: imx6dl-yapp4: Move phy reset into switch node +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Michal Vokáč + +[ Upstream commit 7da7b84fee58c85a6075022023d31edea40e81a1 ] + +Drop the phy-reset-duration and phy-reset-gpios deprecated properties and +move reset-gpios under the switch node. + +Signed-off-by: Michal Vokáč +Signed-off-by: Shawn Guo +Stable-dep-of: 023bd910d3ab ("ARM: dts: imx6dl-yapp4: Fix typo in the QCA switch register address") +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6dl-yapp4-common.dtsi | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/arch/arm/boot/dts/imx6dl-yapp4-common.dtsi b/arch/arm/boot/dts/imx6dl-yapp4-common.dtsi +index ce4a5a8074422..4d1e65c307f86 100644 +--- a/arch/arm/boot/dts/imx6dl-yapp4-common.dtsi ++++ b/arch/arm/boot/dts/imx6dl-yapp4-common.dtsi +@@ -96,8 +96,6 @@ &fec { + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_enet>; + phy-mode = "rgmii-id"; +- phy-reset-gpios = <&gpio1 25 GPIO_ACTIVE_LOW>; +- phy-reset-duration = <20>; + phy-supply = <&sw2_reg>; + status = "okay"; + +@@ -121,6 +119,7 @@ phy_port3: phy@2 { + switch@10 { + compatible = "qca,qca8334"; + reg = <10>; ++ reset-gpios = <&gpio1 25 GPIO_ACTIVE_LOW>; + + switch_ports: ports { + #address-cells = <1>; +-- +2.43.0 + diff --git a/queue-5.4/arm-dts-imx6dl-yapp4-move-the-internal-switch-phys-u.patch b/queue-5.4/arm-dts-imx6dl-yapp4-move-the-internal-switch-phys-u.patch new file mode 100644 index 00000000000..fb01fcf4973 --- /dev/null +++ b/queue-5.4/arm-dts-imx6dl-yapp4-move-the-internal-switch-phys-u.patch @@ -0,0 +1,98 @@ +From efe55ffd9720f78d2871a1cda267e6bdbfbbd757 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 14 Feb 2024 10:03:28 +0100 +Subject: ARM: dts: imx6dl-yapp4: Move the internal switch PHYs under the + switch node +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Michal Vokáč + +[ Upstream commit 79978bff2e4b8e05ebdf5fc3ee6b794002393484 ] + +We identified that the PHYs actually do not work since commit 7da7b84fee58 +("ARM: dts: imx6dl-yapp4: Move phy reset into switch node") as +a coincidence of several circumstances. + +The reset signal is kept asserted by a pull-down resistor on the board +unless it is deasserted by GPIO from the SoC. This is to keep the switch +dead until it is configured properly by the kernel and user space. + +Prior to the referenced commit the switch was reset by the FEC driver +and the reset GPIO was actively deasserted. The mdio-bus was scanned +and the attached switch and its PHYs were found and configured. + +With the referenced commit the switch is reset by the qca8k driver. +Because of another bug in the qca8k driver, functionality of the reset +pin depends on its pre-kernel configuration. See commit c44fc98f0a8f +("net: dsa: qca8k: fix illegal usage of GPIO") + +The problem did not appear until we removed support for the switch +and configuration of its reset pin from the bootloader. + +To fix that, properly describe the internal mdio-bus configuration of +the qca8334 switch. The PHYs are internal to the switch and sit on its +internal mdio-bus. + +Fixes: 7da7b84fee58 ("ARM: dts: imx6dl-yapp4: Move phy reset into switch node") +Signed-off-by: Michal Vokáč +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6dl-yapp4-common.dtsi | 23 ++++++++++++++-------- + 1 file changed, 15 insertions(+), 8 deletions(-) + +diff --git a/arch/arm/boot/dts/imx6dl-yapp4-common.dtsi b/arch/arm/boot/dts/imx6dl-yapp4-common.dtsi +index e86f409ca8801..68af441e78948 100644 +--- a/arch/arm/boot/dts/imx6dl-yapp4-common.dtsi ++++ b/arch/arm/boot/dts/imx6dl-yapp4-common.dtsi +@@ -108,14 +108,6 @@ mdio { + #address-cells = <1>; + #size-cells = <0>; + +- phy_port2: phy@1 { +- reg = <1>; +- }; +- +- phy_port3: phy@2 { +- reg = <2>; +- }; +- + switch@10 { + compatible = "qca,qca8334"; + reg = <0x10>; +@@ -140,15 +132,30 @@ fixed-link { + port@2 { + reg = <2>; + label = "eth2"; ++ phy-mode = "internal"; + phy-handle = <&phy_port2>; + }; + + port@3 { + reg = <3>; + label = "eth1"; ++ phy-mode = "internal"; + phy-handle = <&phy_port3>; + }; + }; ++ ++ mdio { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ phy_port2: ethernet-phy@1 { ++ reg = <1>; ++ }; ++ ++ phy_port3: ethernet-phy@2 { ++ reg = <2>; ++ }; ++ }; + }; + }; + }; +-- +2.43.0 + diff --git a/queue-5.4/arm-dts-renesas-r8a73a4-fix-external-clocks-and-cloc.patch b/queue-5.4/arm-dts-renesas-r8a73a4-fix-external-clocks-and-cloc.patch new file mode 100644 index 00000000000..4096f671e1e --- /dev/null +++ b/queue-5.4/arm-dts-renesas-r8a73a4-fix-external-clocks-and-cloc.patch @@ -0,0 +1,82 @@ +From b53384f6c1c9f86651745dd7cb122a29b34e874e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Jan 2024 12:03:03 +0100 +Subject: ARM: dts: renesas: r8a73a4: Fix external clocks and clock rate +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Geert Uytterhoeven + +[ Upstream commit 090c4094574705b0afc7d37825cdc5d06f0e7e02 ] + +External clocks should be defined as zero-Hz clocks in the SoC .dtsi, +and overridden in the board .dts when present. + +Correct the clock rate of extal1 from 25 to 26 MHz, to match the crystal +oscillator present on the APE6-EVM board. + +Fixes: a76809a329d6ebae ("ARM: shmobile: r8a73a4: Common clock framework DT description") +Signed-off-by: Geert Uytterhoeven +Reviewed-by: Niklas Söderlund +Link: https://lore.kernel.org/r/1692bc8cd465d62168cbf110522ad62a7af3f606.1705315614.git.geert+renesas@glider.be +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/r8a73a4-ape6evm.dts | 12 ++++++++++++ + arch/arm/boot/dts/r8a73a4.dtsi | 9 ++++++--- + 2 files changed, 18 insertions(+), 3 deletions(-) + +diff --git a/arch/arm/boot/dts/r8a73a4-ape6evm.dts b/arch/arm/boot/dts/r8a73a4-ape6evm.dts +index a5351ddbf5060..a396f403c9091 100644 +--- a/arch/arm/boot/dts/r8a73a4-ape6evm.dts ++++ b/arch/arm/boot/dts/r8a73a4-ape6evm.dts +@@ -211,6 +211,18 @@ &cmt1 { + status = "okay"; + }; + ++&extal1_clk { ++ clock-frequency = <26000000>; ++}; ++ ++&extal2_clk { ++ clock-frequency = <48000000>; ++}; ++ ++&extalr_clk { ++ clock-frequency = <32768>; ++}; ++ + &pfc { + scifa0_pins: scifa0 { + groups = "scifa0_data"; +diff --git a/arch/arm/boot/dts/r8a73a4.dtsi b/arch/arm/boot/dts/r8a73a4.dtsi +index 4447f45f0cba9..48121ef690c9d 100644 +--- a/arch/arm/boot/dts/r8a73a4.dtsi ++++ b/arch/arm/boot/dts/r8a73a4.dtsi +@@ -494,17 +494,20 @@ clocks { + extalr_clk: extalr { + compatible = "fixed-clock"; + #clock-cells = <0>; +- clock-frequency = <32768>; ++ /* This value must be overridden by the board. */ ++ clock-frequency = <0>; + }; + extal1_clk: extal1 { + compatible = "fixed-clock"; + #clock-cells = <0>; +- clock-frequency = <25000000>; ++ /* This value must be overridden by the board. */ ++ clock-frequency = <0>; + }; + extal2_clk: extal2 { + compatible = "fixed-clock"; + #clock-cells = <0>; +- clock-frequency = <48000000>; ++ /* This value must be overridden by the board. */ ++ clock-frequency = <0>; + }; + fsiack_clk: fsiack { + compatible = "fixed-clock"; +-- +2.43.0 + diff --git a/queue-5.4/arm64-dts-mediatek-mt7622-add-missing-device_type-to.patch b/queue-5.4/arm64-dts-mediatek-mt7622-add-missing-device_type-to.patch new file mode 100644 index 00000000000..cc9668c40a9 --- /dev/null +++ b/queue-5.4/arm64-dts-mediatek-mt7622-add-missing-device_type-to.patch @@ -0,0 +1,57 @@ +From 9b381e14eb7a4cbcf3957261b52d7be8609775ac Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 22 Jan 2024 14:23:57 +0100 +Subject: arm64: dts: mediatek: mt7622: add missing "device_type" to memory + nodes +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Rafał Miłecki + +[ Upstream commit 99d100e00144bc01b49a697f4bc4398f2f7e7ce4 ] + +This fixes: +arch/arm64/boot/dts/mediatek/mt7622-rfb1.dtb: /: memory@40000000: 'device_type' is a required property + from schema $id: http://devicetree.org/schemas/memory.yaml# +arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dtb: /: memory@40000000: 'device_type' is a required property + from schema $id: http://devicetree.org/schemas/memory.yaml# + +Signed-off-by: Rafał Miłecki +Reviewed-by: Matthias Brugger +Reviewed-by: AngeloGioacchino Del Regno +Link: https://lore.kernel.org/r/20240122132357.31264-1-zajec5@gmail.com +Signed-off-by: AngeloGioacchino Del Regno +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts | 1 + + arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts +index 7b095378c96cd..eec9ec1db682a 100644 +--- a/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts ++++ b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts +@@ -71,6 +71,7 @@ red { + + memory@40000000 { + reg = <0 0x40000000 0 0x40000000>; ++ device_type = "memory"; + }; + + reg_1p8v: regulator-1p8v { +diff --git a/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts b/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts +index f586c1ee4a59e..ee57fccd489a3 100644 +--- a/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts ++++ b/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts +@@ -57,6 +57,7 @@ wps { + + memory@40000000 { + reg = <0 0x40000000 0 0x20000000>; ++ device_type = "memory"; + }; + + reg_1p8v: regulator-1p8v { +-- +2.43.0 + diff --git a/queue-5.4/arm64-dts-qcom-db820c-move-non-soc-entries-out-of-so.patch b/queue-5.4/arm64-dts-qcom-db820c-move-non-soc-entries-out-of-so.patch new file mode 100644 index 00000000000..d75646306ca --- /dev/null +++ b/queue-5.4/arm64-dts-qcom-db820c-move-non-soc-entries-out-of-so.patch @@ -0,0 +1,106 @@ +From 2d3a11b4574cbe2e6fe964d556e9d2422970d11b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 20 Oct 2019 22:13:12 -0700 +Subject: arm64: dts: qcom: db820c: Move non-soc entries out of /soc + +From: Bjorn Andersson + +[ Upstream commit f978d45b4aaba6c8e9ad2406147be67f8f733c42 ] + +The USB id pins and wlan regulator are not platform devices, so move +them out of /soc + +Acked-by: Vinod Koul +Signed-off-by: Bjorn Andersson +Stable-dep-of: 68c4c20848d7 ("arm64: dts: qcom: msm8996: Define UFS UniPro clock limits") +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi | 58 ++++++++++---------- + 1 file changed, 29 insertions(+), 29 deletions(-) + +diff --git a/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi b/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi +index dba3488492f1b..da2f01eb3be2c 100644 +--- a/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi ++++ b/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi +@@ -399,13 +399,6 @@ dwc3@6a00000 { + }; + }; + +- usb3_id: usb3-id { +- compatible = "linux,extcon-usb-gpio"; +- id-gpio = <&pm8994_gpios 22 GPIO_ACTIVE_HIGH>; +- pinctrl-names = "default"; +- pinctrl-0 = <&usb3_vbus_det_gpio>; +- }; +- + usb@76f8800 { + status = "okay"; + extcon = <&usb2_id>; +@@ -417,28 +410,6 @@ dwc3@7600000 { + }; + }; + +- usb2_id: usb2-id { +- compatible = "linux,extcon-usb-gpio"; +- id-gpio = <&pmi8994_gpios 6 GPIO_ACTIVE_HIGH>; +- pinctrl-names = "default"; +- pinctrl-0 = <&usb2_vbus_det_gpio>; +- }; +- +- wlan_en: wlan-en-1-8v { +- pinctrl-names = "default"; +- pinctrl-0 = <&wlan_en_gpios>; +- compatible = "regulator-fixed"; +- regulator-name = "wlan-en-regulator"; +- regulator-min-microvolt = <1800000>; +- regulator-max-microvolt = <1800000>; +- +- gpio = <&pm8994_gpios 8 0>; +- +- /* WLAN card specific delay */ +- startup-delay-us = <70000>; +- enable-active-high; +- }; +- + agnoc@0 { + pcie@600000 { + status = "okay"; +@@ -667,6 +638,35 @@ l32 { + }; + }; + }; ++ ++ usb2_id: usb2-id { ++ compatible = "linux,extcon-usb-gpio"; ++ id-gpio = <&pmi8994_gpios 6 GPIO_ACTIVE_HIGH>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&usb2_vbus_det_gpio>; ++ }; ++ ++ usb3_id: usb3-id { ++ compatible = "linux,extcon-usb-gpio"; ++ id-gpio = <&pm8994_gpios 22 GPIO_ACTIVE_HIGH>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&usb3_vbus_det_gpio>; ++ }; ++ ++ wlan_en: wlan-en-1-8v { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&wlan_en_gpios>; ++ compatible = "regulator-fixed"; ++ regulator-name = "wlan-en-regulator"; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ ++ gpio = <&pm8994_gpios 8 0>; ++ ++ /* WLAN card specific delay */ ++ startup-delay-us = <70000>; ++ enable-active-high; ++ }; + }; + + &spmi_bus { +-- +2.43.0 + diff --git a/queue-5.4/arm64-dts-qcom-msm8996-define-ufs-unipro-clock-limit.patch b/queue-5.4/arm64-dts-qcom-msm8996-define-ufs-unipro-clock-limit.patch new file mode 100644 index 00000000000..e288c86cf79 --- /dev/null +++ b/queue-5.4/arm64-dts-qcom-msm8996-define-ufs-unipro-clock-limit.patch @@ -0,0 +1,42 @@ +From 286ebeed6b391c2967b248c3181e588c4e97e002 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Dec 2023 13:39:42 +0000 +Subject: arm64: dts: qcom: msm8996: Define UFS UniPro clock limits + +From: Yassine Oudjana + +[ Upstream commit 68c4c20848d71b0e69c3403becb5dd23e89e5896 ] + +These limits were always defined as 0, but that didn't cause any issue +since the driver had hardcoded limits. In commit b4e13e1ae95e ("scsi: ufs: +qcom: Add multiple frequency support for MAX_CORE_CLK_1US_CYCLES") the +hardcoded limits were removed and the driver started reading them from DT, +causing UFS to stop working on MSM8996. Add real UniPro clock limits to fix +UFS. + +Signed-off-by: Yassine Oudjana +Fixes: 57fc67ef0d35 ("arm64: dts: qcom: msm8996: Add ufs related nodes") +Reviewed-by: Konrad Dybcio +Link: https://lore.kernel.org/r/20231218133917.78770-1-y.oudjana@protonmail.com +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/msm8996.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/qcom/msm8996.dtsi b/arch/arm64/boot/dts/qcom/msm8996.dtsi +index 8bfb897b0e81b..6b11bcd09635e 100644 +--- a/arch/arm64/boot/dts/qcom/msm8996.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi +@@ -1391,7 +1391,7 @@ ufshc: ufshc@624000 { + <0 0>, + <0 0>, + <150000000 300000000>, +- <0 0>, ++ <75000000 150000000>, + <0 0>, + <0 0>, + <0 0>, +-- +2.43.0 + diff --git a/queue-5.4/arm64-dts-qcom-msm8996-move-regulator-consumers-to-d.patch b/queue-5.4/arm64-dts-qcom-msm8996-move-regulator-consumers-to-d.patch new file mode 100644 index 00000000000..03903c279d1 --- /dev/null +++ b/queue-5.4/arm64-dts-qcom-msm8996-move-regulator-consumers-to-d.patch @@ -0,0 +1,258 @@ +From 7f98bac6e8ca1cc9626b5bf513bc235288d5f8fc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 20 Oct 2019 22:13:14 -0700 +Subject: arm64: dts: qcom: msm8996: Move regulator consumers to db820c + +From: Bjorn Andersson + +[ Upstream commit 80884431430995254257848d1a05266a2b791c58 ] + +Supplies for the various components in the SoC depends on board layout, +so move the supply definitions to db820c.dtsi instead of carrying them +in the platform dtsi. + +Acked-by: Vinod Koul +Signed-off-by: Bjorn Andersson +Stable-dep-of: 68c4c20848d7 ("arm64: dts: qcom: msm8996: Define UFS UniPro clock limits") +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi | 44 ++++++++++++++++++++ + arch/arm64/boot/dts/qcom/msm8996.dtsi | 44 -------------------- + 2 files changed, 44 insertions(+), 44 deletions(-) + +diff --git a/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi b/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi +index 44ec3eb1c8e85..21e029afb27bb 100644 +--- a/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi ++++ b/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi +@@ -142,6 +142,10 @@ &blsp2_spi5 { + status = "okay"; + }; + ++&camss { ++ vdda-supply = <&pm8994_l2>; ++}; ++ + &sdhc2 { + /* External SD card */ + pinctrl-names = "default", "sleep"; +@@ -155,10 +159,28 @@ &sdhc2 { + + &ufsphy { + status = "okay"; ++ ++ vdda-phy-supply = <&pm8994_l28>; ++ vdda-pll-supply = <&pm8994_l12>; ++ ++ vdda-phy-max-microamp = <18380>; ++ vdda-pll-max-microamp = <9440>; ++ ++ vddp-ref-clk-supply = <&pm8994_l25>; ++ vddp-ref-clk-max-microamp = <100>; ++ vddp-ref-clk-always-on; + }; + + &ufshc { + status = "okay"; ++ ++ vcc-supply = <&pm8994_l20>; ++ vccq-supply = <&pm8994_l25>; ++ vccq2-supply = <&pm8994_s4>; ++ ++ vcc-max-microamp = <600000>; ++ vccq-max-microamp = <450000>; ++ vccq2-max-microamp = <450000>; + }; + + &msmgpio { +@@ -369,18 +391,31 @@ &pmi8994_gpios { + + &pcie_phy { + status = "okay"; ++ ++ vdda-phy-supply = <&pm8994_l28>; ++ vdda-pll-supply = <&pm8994_l12>; + }; + + &usb3phy { + status = "okay"; ++ ++ vdda-phy-supply = <&pm8994_l28>; ++ vdda-pll-supply = <&pm8994_l12>; ++ + }; + + &hsusb_phy1 { + status = "okay"; ++ ++ vdda-pll-supply = <&pm8994_l12>; ++ vdda-phy-dpdm-supply = <&pm8994_l24>; + }; + + &hsusb_phy2 { + status = "okay"; ++ ++ vdda-pll-supply = <&pm8994_l12>; ++ vdda-phy-dpdm-supply = <&pm8994_l24>; + }; + + &usb3 { +@@ -408,22 +443,31 @@ &pcie0 { + status = "okay"; + perst-gpio = <&msmgpio 35 GPIO_ACTIVE_LOW>; + vddpe-3v3-supply = <&wlan_en>; ++ vdda-supply = <&pm8994_l28>; + }; + + &pcie1 { + status = "okay"; + perst-gpio = <&msmgpio 130 GPIO_ACTIVE_LOW>; ++ vdda-supply = <&pm8994_l28>; + }; + + &pcie2 { + status = "okay"; + perst-gpio = <&msmgpio 114 GPIO_ACTIVE_LOW>; ++ vdda-supply = <&pm8994_l28>; + }; + + &wcd9335 { + clock-names = "mclk", "slimbus"; + clocks = <&div1_mclk>, + <&rpmcc RPM_SMD_BB_CLK1>; ++ ++ vdd-buck-supply = <&pm8994_s4>; ++ vdd-buck-sido-supply = <&pm8994_s4>; ++ vdd-tx-supply = <&pm8994_s4>; ++ vdd-rx-supply = <&pm8994_s4>; ++ vdd-io-supply = <&pm8994_s4>; + }; + + &mdss { +diff --git a/arch/arm64/boot/dts/qcom/msm8996.dtsi b/arch/arm64/boot/dts/qcom/msm8996.dtsi +index bbdb0fcd818e9..bcadbdf2690e3 100644 +--- a/arch/arm64/boot/dts/qcom/msm8996.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi +@@ -1343,16 +1343,6 @@ ufsphy: phy@627000 { + reg-names = "phy_mem"; + #phy-cells = <0>; + +- vdda-phy-supply = <&pm8994_l28>; +- vdda-pll-supply = <&pm8994_l12>; +- +- vdda-phy-max-microamp = <18380>; +- vdda-pll-max-microamp = <9440>; +- +- vddp-ref-clk-supply = <&pm8994_l25>; +- vddp-ref-clk-max-microamp = <100>; +- vddp-ref-clk-always-on; +- + clock-names = "ref_clk_src", "ref_clk"; + clocks = <&rpmcc RPM_SMD_LN_BB_CLK>, + <&gcc GCC_UFS_CLKREF_CLK>; +@@ -1368,14 +1358,6 @@ ufshc: ufshc@624000 { + phys = <&ufsphy>; + phy-names = "ufsphy"; + +- vcc-supply = <&pm8994_l20>; +- vccq-supply = <&pm8994_l25>; +- vccq2-supply = <&pm8994_s4>; +- +- vcc-max-microamp = <600000>; +- vccq-max-microamp = <450000>; +- vccq2-max-microamp = <450000>; +- + power-domains = <&gcc UFS_GDSC>; + + clock-names = +@@ -1477,9 +1459,6 @@ pcie_phy: phy@34000 { + <&gcc GCC_PCIE_CLKREF_CLK>; + clock-names = "aux", "cfg_ahb", "ref"; + +- vdda-phy-supply = <&pm8994_l28>; +- vdda-pll-supply = <&pm8994_l12>; +- + resets = <&gcc GCC_PCIE_PHY_BCR>, + <&gcc GCC_PCIE_PHY_COM_BCR>, + <&gcc GCC_PCIE_PHY_COM_NOCSR_BCR>; +@@ -1539,9 +1518,6 @@ usb3phy: phy@7410000 { + <&gcc GCC_USB3_CLKREF_CLK>; + clock-names = "aux", "cfg_ahb", "ref"; + +- vdda-phy-supply = <&pm8994_l28>; +- vdda-pll-supply = <&pm8994_l12>; +- + resets = <&gcc GCC_USB3_PHY_BCR>, + <&gcc GCC_USB3PHY_PHY_BCR>; + reset-names = "phy", "common"; +@@ -1568,9 +1544,6 @@ hsusb_phy1: phy@7411000 { + <&gcc GCC_RX1_USB2_CLKREF_CLK>; + clock-names = "cfg_ahb", "ref"; + +- vdda-pll-supply = <&pm8994_l12>; +- vdda-phy-dpdm-supply = <&pm8994_l24>; +- + resets = <&gcc GCC_QUSB2PHY_PRIM_BCR>; + nvmem-cells = <&qusb2p_hstx_trim>; + status = "disabled"; +@@ -1585,9 +1558,6 @@ hsusb_phy2: phy@7412000 { + <&gcc GCC_RX2_USB2_CLKREF_CLK>; + clock-names = "cfg_ahb", "ref"; + +- vdda-pll-supply = <&pm8994_l12>; +- vdda-phy-dpdm-supply = <&pm8994_l24>; +- + resets = <&gcc GCC_QUSB2PHY_SEC_BCR>; + nvmem-cells = <&qusb2s_hstx_trim>; + status = "disabled"; +@@ -1795,7 +1765,6 @@ camss: camss@a00000 { + "vfe1_stream", + "vfe_ahb", + "vfe_axi"; +- vdda-supply = <&pm8994_l2>; + iommus = <&vfe_smmu 0>, + <&vfe_smmu 1>, + <&vfe_smmu 2>, +@@ -1907,9 +1876,6 @@ pcie0: pcie@600000 { + pinctrl-0 = <&pcie0_clkreq_default &pcie0_perst_default &pcie0_wake_default>; + pinctrl-1 = <&pcie0_clkreq_sleep &pcie0_perst_default &pcie0_wake_sleep>; + +- +- vdda-supply = <&pm8994_l28>; +- + linux,pci-domain = <0>; + + clocks = <&gcc GCC_PCIE_0_PIPE_CLK>, +@@ -1962,8 +1928,6 @@ pcie1: pcie@608000 { + pinctrl-0 = <&pcie1_clkreq_default &pcie1_perst_default &pcie1_wake_default>; + pinctrl-1 = <&pcie1_clkreq_sleep &pcie1_perst_default &pcie1_wake_sleep>; + +- +- vdda-supply = <&pm8994_l28>; + linux,pci-domain = <1>; + + clocks = <&gcc GCC_PCIE_1_PIPE_CLK>, +@@ -2015,8 +1979,6 @@ pcie2: pcie@610000 { + pinctrl-0 = <&pcie2_clkreq_default &pcie2_perst_default &pcie2_wake_default>; + pinctrl-1 = <&pcie2_clkreq_sleep &pcie2_perst_default &pcie2_wake_sleep >; + +- vdda-supply = <&pm8994_l28>; +- + linux,pci-domain = <2>; + clocks = <&gcc GCC_PCIE_2_PIPE_CLK>, + <&gcc GCC_PCIE_2_AUX_CLK>, +@@ -2081,12 +2043,6 @@ wcd9335: codec@1{ + + slim-ifc-dev = <&tasha_ifd>; + +- vdd-buck-supply = <&pm8994_s4>; +- vdd-buck-sido-supply = <&pm8994_s4>; +- vdd-tx-supply = <&pm8994_s4>; +- vdd-rx-supply = <&pm8994_s4>; +- vdd-io-supply = <&pm8994_s4>; +- + #sound-dai-cells = <1>; + }; + }; +-- +2.43.0 + diff --git a/queue-5.4/arm64-dts-qcom-msm8996-pad-addresses.patch b/queue-5.4/arm64-dts-qcom-msm8996-pad-addresses.patch new file mode 100644 index 00000000000..4f85be6a973 --- /dev/null +++ b/queue-5.4/arm64-dts-qcom-msm8996-pad-addresses.patch @@ -0,0 +1,432 @@ +From 96d6cb5498f324e7756eb84cd81c8966bd337aeb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 20 Oct 2019 22:13:19 -0700 +Subject: arm64: dts: qcom: msm8996: Pad addresses + +From: Bjorn Andersson + +[ Upstream commit 86f6d6225e5e546ffeaae6db597f4aabe50d26c1 ] + +Pad all addresses in msm8996.dtsi to 8 digits, in order to make it +easier to ensure ordering when adding new nodes. + +Acked-by: Vinod Koul +Signed-off-by: Bjorn Andersson +Stable-dep-of: 68c4c20848d7 ("arm64: dts: qcom: msm8996: Define UFS UniPro clock limits") +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/msm8996.dtsi | 144 +++++++++++++------------- + 1 file changed, 72 insertions(+), 72 deletions(-) + +diff --git a/arch/arm64/boot/dts/qcom/msm8996.dtsi b/arch/arm64/boot/dts/qcom/msm8996.dtsi +index bcadbdf2690e3..8bfb897b0e81b 100644 +--- a/arch/arm64/boot/dts/qcom/msm8996.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi +@@ -584,7 +584,7 @@ soc: soc { + + rpm_msg_ram: memory@68000 { + compatible = "qcom,rpm-msg-ram"; +- reg = <0x68000 0x6000>; ++ reg = <0x00068000 0x6000>; + }; + + rng: rng@83000 { +@@ -596,28 +596,28 @@ rng: rng@83000 { + + tcsr_mutex_regs: syscon@740000 { + compatible = "syscon"; +- reg = <0x740000 0x20000>; ++ reg = <0x00740000 0x20000>; + }; + + tsens0: thermal-sensor@4a9000 { + compatible = "qcom,msm8996-tsens"; +- reg = <0x4a9000 0x1000>, /* TM */ +- <0x4a8000 0x1000>; /* SROT */ ++ reg = <0x004a9000 0x1000>, /* TM */ ++ <0x004a8000 0x1000>; /* SROT */ + #qcom,sensors = <13>; + #thermal-sensor-cells = <1>; + }; + + tsens1: thermal-sensor@4ad000 { + compatible = "qcom,msm8996-tsens"; +- reg = <0x4ad000 0x1000>, /* TM */ +- <0x4ac000 0x1000>; /* SROT */ ++ reg = <0x004ad000 0x1000>, /* TM */ ++ <0x004ac000 0x1000>; /* SROT */ + #qcom,sensors = <8>; + #thermal-sensor-cells = <1>; + }; + + tcsr: syscon@7a0000 { + compatible = "qcom,tcsr-msm8996", "syscon"; +- reg = <0x7a0000 0x18000>; ++ reg = <0x007a0000 0x18000>; + }; + + intc: interrupt-controller@9bc0000 { +@@ -633,7 +633,7 @@ intc: interrupt-controller@9bc0000 { + + apcs_glb: mailbox@9820000 { + compatible = "qcom,msm8996-apcs-hmss-global"; +- reg = <0x9820000 0x1000>; ++ reg = <0x09820000 0x1000>; + + #mbox-cells = <1>; + }; +@@ -643,7 +643,7 @@ gcc: clock-controller@300000 { + #clock-cells = <1>; + #reset-cells = <1>; + #power-domain-cells = <1>; +- reg = <0x300000 0x90000>; ++ reg = <0x00300000 0x90000>; + }; + + stm@3002000 { +@@ -1124,7 +1124,7 @@ apss_merge_funnel_out: endpoint { + + kryocc: clock-controller@6400000 { + compatible = "qcom,apcc-msm8996"; +- reg = <0x6400000 0x90000>; ++ reg = <0x06400000 0x90000>; + #clock-cells = <1>; + }; + +@@ -1170,7 +1170,7 @@ blsp2_i2c0: i2c@75b5000 { + + blsp2_uart1: serial@75b0000 { + compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; +- reg = <0x75b0000 0x1000>; ++ reg = <0x075b0000 0x1000>; + interrupts = ; + clocks = <&gcc GCC_BLSP2_UART2_APPS_CLK>, + <&gcc GCC_BLSP2_AHB_CLK>; +@@ -1236,7 +1236,7 @@ blsp2_spi5: spi@75ba000{ + sdhc2: sdhci@74a4900 { + status = "disabled"; + compatible = "qcom,sdhci-msm-v4"; +- reg = <0x74a4900 0x314>, <0x74a4000 0x800>; ++ reg = <0x074a4900 0x314>, <0x074a4000 0x800>; + reg-names = "hc_mem", "core_mem"; + + interrupts = <0 125 IRQ_TYPE_LEVEL_HIGH>, +@@ -1321,11 +1321,11 @@ frame@98c0000 { + + spmi_bus: qcom,spmi@400f000 { + compatible = "qcom,spmi-pmic-arb"; +- reg = <0x400f000 0x1000>, +- <0x4400000 0x800000>, +- <0x4c00000 0x800000>, +- <0x5800000 0x200000>, +- <0x400a000 0x002100>; ++ reg = <0x0400f000 0x1000>, ++ <0x04400000 0x800000>, ++ <0x04c00000 0x800000>, ++ <0x05800000 0x200000>, ++ <0x0400a000 0x002100>; + reg-names = "core", "chnls", "obsrvr", "intr", "cnfg"; + interrupt-names = "periph_irq"; + interrupts = ; +@@ -1339,7 +1339,7 @@ spmi_bus: qcom,spmi@400f000 { + + ufsphy: phy@627000 { + compatible = "qcom,msm8996-ufs-phy-qmp-14nm"; +- reg = <0x627000 0xda8>; ++ reg = <0x00627000 0xda8>; + reg-names = "phy_mem"; + #phy-cells = <0>; + +@@ -1352,7 +1352,7 @@ ufsphy: phy@627000 { + + ufshc: ufshc@624000 { + compatible = "qcom,ufshc"; +- reg = <0x624000 0x2500>; ++ reg = <0x00624000 0x2500>; + interrupts = ; + + phys = <&ufsphy>; +@@ -1411,7 +1411,7 @@ mmcc: clock-controller@8c0000 { + #clock-cells = <1>; + #reset-cells = <1>; + #power-domain-cells = <1>; +- reg = <0x8c0000 0x40000>; ++ reg = <0x008c0000 0x40000>; + assigned-clocks = <&mmcc MMPLL9_PLL>, + <&mmcc MMPLL1_PLL>, + <&mmcc MMPLL3_PLL>, +@@ -1426,7 +1426,7 @@ mmcc: clock-controller@8c0000 { + + qfprom@74000 { + compatible = "qcom,qfprom"; +- reg = <0x74000 0x8ff>; ++ reg = <0x00074000 0x8ff>; + #address-cells = <1>; + #size-cells = <1>; + +@@ -1448,7 +1448,7 @@ gpu_speed_bin: gpu_speed_bin@133 { + + pcie_phy: phy@34000 { + compatible = "qcom,msm8996-qmp-pcie-phy"; +- reg = <0x34000 0x488>; ++ reg = <0x00034000 0x488>; + #clock-cells = <1>; + #address-cells = <1>; + #size-cells = <1>; +@@ -1466,9 +1466,9 @@ pcie_phy: phy@34000 { + status = "disabled"; + + pciephy_0: lane@35000 { +- reg = <0x035000 0x130>, +- <0x035200 0x200>, +- <0x035400 0x1dc>; ++ reg = <0x00035000 0x130>, ++ <0x00035200 0x200>, ++ <0x00035400 0x1dc>; + #phy-cells = <0>; + + clock-output-names = "pcie_0_pipe_clk_src"; +@@ -1479,9 +1479,9 @@ pciephy_0: lane@35000 { + }; + + pciephy_1: lane@36000 { +- reg = <0x036000 0x130>, +- <0x036200 0x200>, +- <0x036400 0x1dc>; ++ reg = <0x00036000 0x130>, ++ <0x00036200 0x200>, ++ <0x00036400 0x1dc>; + #phy-cells = <0>; + + clock-output-names = "pcie_1_pipe_clk_src"; +@@ -1492,9 +1492,9 @@ pciephy_1: lane@36000 { + }; + + pciephy_2: lane@37000 { +- reg = <0x037000 0x130>, +- <0x037200 0x200>, +- <0x037400 0x1dc>; ++ reg = <0x00037000 0x130>, ++ <0x00037200 0x200>, ++ <0x00037400 0x1dc>; + #phy-cells = <0>; + + clock-output-names = "pcie_2_pipe_clk_src"; +@@ -1507,7 +1507,7 @@ pciephy_2: lane@37000 { + + usb3phy: phy@7410000 { + compatible = "qcom,msm8996-qmp-usb3-phy"; +- reg = <0x7410000 0x1c4>; ++ reg = <0x07410000 0x1c4>; + #clock-cells = <1>; + #address-cells = <1>; + #size-cells = <1>; +@@ -1524,9 +1524,9 @@ usb3phy: phy@7410000 { + status = "disabled"; + + ssusb_phy_0: lane@7410200 { +- reg = <0x7410200 0x200>, +- <0x7410400 0x130>, +- <0x7410600 0x1a8>; ++ reg = <0x07410200 0x200>, ++ <0x07410400 0x130>, ++ <0x07410600 0x1a8>; + #phy-cells = <0>; + + clock-output-names = "usb3_phy_pipe_clk_src"; +@@ -1537,7 +1537,7 @@ ssusb_phy_0: lane@7410200 { + + hsusb_phy1: phy@7411000 { + compatible = "qcom,msm8996-qusb2-phy"; +- reg = <0x7411000 0x180>; ++ reg = <0x07411000 0x180>; + #phy-cells = <0>; + + clocks = <&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>, +@@ -1551,7 +1551,7 @@ hsusb_phy1: phy@7411000 { + + hsusb_phy2: phy@7412000 { + compatible = "qcom,msm8996-qusb2-phy"; +- reg = <0x7412000 0x180>; ++ reg = <0x07412000 0x180>; + #phy-cells = <0>; + + clocks = <&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>, +@@ -1565,7 +1565,7 @@ hsusb_phy2: phy@7412000 { + + usb2: usb@76f8800 { + compatible = "qcom,msm8996-dwc3", "qcom,dwc3"; +- reg = <0x76f8800 0x400>; ++ reg = <0x076f8800 0x400>; + #address-cells = <1>; + #size-cells = <1>; + ranges; +@@ -1585,7 +1585,7 @@ usb2: usb@76f8800 { + + dwc3@7600000 { + compatible = "snps,dwc3"; +- reg = <0x7600000 0xcc00>; ++ reg = <0x07600000 0xcc00>; + interrupts = <0 138 IRQ_TYPE_LEVEL_HIGH>; + phys = <&hsusb_phy2>; + phy-names = "usb2-phy"; +@@ -1596,7 +1596,7 @@ dwc3@7600000 { + + usb3: usb@6af8800 { + compatible = "qcom,msm8996-dwc3", "qcom,dwc3"; +- reg = <0x6af8800 0x400>; ++ reg = <0x06af8800 0x400>; + #address-cells = <1>; + #size-cells = <1>; + ranges; +@@ -1617,7 +1617,7 @@ usb3: usb@6af8800 { + + dwc3@6a00000 { + compatible = "snps,dwc3"; +- reg = <0x6a00000 0xcc00>; ++ reg = <0x06a00000 0xcc00>; + interrupts = <0 131 IRQ_TYPE_LEVEL_HIGH>; + phys = <&hsusb_phy1>, <&ssusb_phy_0>; + phy-names = "usb2-phy", "usb3-phy"; +@@ -1628,7 +1628,7 @@ dwc3@6a00000 { + + vfe_smmu: iommu@da0000 { + compatible = "qcom,msm8996-smmu-v2", "qcom,smmu-v2"; +- reg = <0xda0000 0x10000>; ++ reg = <0x00da0000 0x10000>; + + #global-interrupts = <1>; + interrupts = , +@@ -1644,20 +1644,20 @@ vfe_smmu: iommu@da0000 { + + camss: camss@a00000 { + compatible = "qcom,msm8996-camss"; +- reg = <0xa34000 0x1000>, +- <0xa00030 0x4>, +- <0xa35000 0x1000>, +- <0xa00038 0x4>, +- <0xa36000 0x1000>, +- <0xa00040 0x4>, +- <0xa30000 0x100>, +- <0xa30400 0x100>, +- <0xa30800 0x100>, +- <0xa30c00 0x100>, +- <0xa31000 0x500>, +- <0xa00020 0x10>, +- <0xa10000 0x1000>, +- <0xa14000 0x1000>; ++ reg = <0x00a34000 0x1000>, ++ <0x00a00030 0x4>, ++ <0x00a35000 0x1000>, ++ <0x00a00038 0x4>, ++ <0x00a36000 0x1000>, ++ <0x00a00040 0x4>, ++ <0x00a30000 0x100>, ++ <0x00a30400 0x100>, ++ <0x00a30800 0x100>, ++ <0x00a30c00 0x100>, ++ <0x00a31000 0x500>, ++ <0x00a00020 0x10>, ++ <0x00a10000 0x1000>, ++ <0x00a14000 0x1000>; + reg-names = "csiphy0", + "csiphy0_clk_mux", + "csiphy1", +@@ -1778,7 +1778,7 @@ ports { + + adreno_smmu: iommu@b40000 { + compatible = "qcom,msm8996-smmu-v2", "qcom,smmu-v2"; +- reg = <0xb40000 0x10000>; ++ reg = <0x00b40000 0x10000>; + + #global-interrupts = <1>; + interrupts = , +@@ -1795,7 +1795,7 @@ adreno_smmu: iommu@b40000 { + + mdp_smmu: iommu@d00000 { + compatible = "qcom,msm8996-smmu-v2", "qcom,smmu-v2"; +- reg = <0xd00000 0x10000>; ++ reg = <0x00d00000 0x10000>; + + #global-interrupts = <1>; + interrupts = , +@@ -1811,7 +1811,7 @@ mdp_smmu: iommu@d00000 { + + lpass_q6_smmu: iommu@1600000 { + compatible = "qcom,msm8996-smmu-v2", "qcom,smmu-v2"; +- reg = <0x1600000 0x20000>; ++ reg = <0x01600000 0x20000>; + #iommu-cells = <1>; + power-domains = <&gcc HLOS1_VOTE_LPASS_CORE_GDSC>; + +@@ -1998,7 +1998,7 @@ slimbam:dma@9184000 + { + compatible = "qcom,bam-v1.7.0"; + qcom,controlled-remotely; +- reg = <0x9184000 0x32000>; ++ reg = <0x09184000 0x32000>; + num-channels = <31>; + interrupts = <0 164 IRQ_TYPE_LEVEL_HIGH>; + #dma-cells = <1>; +@@ -2008,7 +2008,7 @@ slimbam:dma@9184000 + + slim_msm: slim@91c0000 { + compatible = "qcom,slim-ngd-v1.5.0"; +- reg = <0x91c0000 0x2C000>; ++ reg = <0x091c0000 0x2C000>; + reg-names = "ctrl"; + interrupts = <0 163 IRQ_TYPE_LEVEL_HIGH>; + dmas = <&slimbam 3>, <&slimbam 4>, +@@ -2052,7 +2052,7 @@ gpu@b00000 { + compatible = "qcom,adreno-530.2", "qcom,adreno"; + #stream-id-cells = <16>; + +- reg = <0xb00000 0x3f000>; ++ reg = <0x00b00000 0x3f000>; + reg-names = "kgsl_3d0_reg_memory"; + + interrupts = <0 300 IRQ_TYPE_LEVEL_HIGH>; +@@ -2123,9 +2123,9 @@ zap-shader { + mdss: mdss@900000 { + compatible = "qcom,mdss"; + +- reg = <0x900000 0x1000>, +- <0x9b0000 0x1040>, +- <0x9b8000 0x1040>; ++ reg = <0x00900000 0x1000>, ++ <0x009b0000 0x1040>, ++ <0x009b8000 0x1040>; + reg-names = "mdss_phys", + "vbif_phys", + "vbif_nrt_phys"; +@@ -2145,7 +2145,7 @@ mdss: mdss@900000 { + + mdp: mdp@901000 { + compatible = "qcom,mdp5"; +- reg = <0x901000 0x90000>; ++ reg = <0x00901000 0x90000>; + reg-names = "mdp_phys"; + + interrupt-parent = <&mdss>; +@@ -2221,12 +2221,12 @@ hdmi_in: endpoint { + hdmi_phy: hdmi-phy@9a0600 { + #phy-cells = <0>; + compatible = "qcom,hdmi-phy-8996"; +- reg = <0x9a0600 0x1c4>, +- <0x9a0a00 0x124>, +- <0x9a0c00 0x124>, +- <0x9a0e00 0x124>, +- <0x9a1000 0x124>, +- <0x9a1200 0x0c8>; ++ reg = <0x009a0600 0x1c4>, ++ <0x009a0a00 0x124>, ++ <0x009a0c00 0x124>, ++ <0x009a0e00 0x124>, ++ <0x009a1000 0x124>, ++ <0x009a1200 0x0c8>; + reg-names = "hdmi_pll", + "hdmi_tx_l0", + "hdmi_tx_l1", +-- +2.43.0 + diff --git a/queue-5.4/arm64-dts-qcom-msm8996-use-node-references-in-db820c.patch b/queue-5.4/arm64-dts-qcom-msm8996-use-node-references-in-db820c.patch new file mode 100644 index 00000000000..85ef20772a1 --- /dev/null +++ b/queue-5.4/arm64-dts-qcom-msm8996-use-node-references-in-db820c.patch @@ -0,0 +1,787 @@ +From fd3fbfd2046aecd7f1e6c25d837f34382c15e1d1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 20 Oct 2019 22:13:13 -0700 +Subject: arm64: dts: qcom: msm8996: Use node references in db820c + +From: Bjorn Andersson + +[ Upstream commit 75b77d6492eb5e582e17618b71f62140faf2de29 ] + +Instead of mimicing the structure of the platform, reference nodes by +their label in apq8096-db820c.dtsi. Add labels in msm8996.dtsi where +necessary. + +Acked-by: Vinod Koul +Signed-off-by: Bjorn Andersson +Stable-dep-of: 68c4c20848d7 ("arm64: dts: qcom: msm8996: Define UFS UniPro clock limits") +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi | 691 +++++++++---------- + arch/arm64/boot/dts/qcom/msm8996.dtsi | 4 +- + 2 files changed, 341 insertions(+), 354 deletions(-) + +diff --git a/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi b/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi +index da2f01eb3be2c..44ec3eb1c8e85 100644 +--- a/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi ++++ b/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi +@@ -77,396 +77,383 @@ div1_mclk: divclk1 { + enable-gpios = <&pm8994_gpios 15 0>; + }; + }; ++}; + +- soc { +- serial@7570000 { +- label = "BT-UART"; +- status = "okay"; +- pinctrl-names = "default", "sleep"; +- pinctrl-0 = <&blsp1_uart1_default>; +- pinctrl-1 = <&blsp1_uart1_sleep>; ++&blsp1_uart1 { ++ label = "BT-UART"; ++ status = "okay"; ++ pinctrl-names = "default", "sleep"; ++ pinctrl-0 = <&blsp1_uart1_default>; ++ pinctrl-1 = <&blsp1_uart1_sleep>; + +- bluetooth { +- compatible = "qcom,qca6174-bt"; ++ bluetooth { ++ compatible = "qcom,qca6174-bt"; + +- /* bt_disable_n gpio */ +- enable-gpios = <&pm8994_gpios 19 GPIO_ACTIVE_HIGH>; ++ /* bt_disable_n gpio */ ++ enable-gpios = <&pm8994_gpios 19 GPIO_ACTIVE_HIGH>; + +- clocks = <&divclk4>; +- }; +- }; ++ clocks = <&divclk4>; ++ }; ++}; + +- serial@75b0000 { +- label = "LS-UART1"; +- status = "okay"; +- pinctrl-names = "default", "sleep"; +- pinctrl-0 = <&blsp2_uart1_2pins_default>; +- pinctrl-1 = <&blsp2_uart1_2pins_sleep>; +- }; ++&blsp2_uart1 { ++ label = "LS-UART1"; ++ status = "okay"; ++ pinctrl-names = "default", "sleep"; ++ pinctrl-0 = <&blsp2_uart1_2pins_default>; ++ pinctrl-1 = <&blsp2_uart1_2pins_sleep>; ++}; + +- serial@75b1000 { +- label = "LS-UART0"; +- status = "disabled"; +- pinctrl-names = "default", "sleep"; +- pinctrl-0 = <&blsp2_uart2_4pins_default>; +- pinctrl-1 = <&blsp2_uart2_4pins_sleep>; +- }; ++&blsp2_uart2 { ++ label = "LS-UART0"; ++ status = "disabled"; ++ pinctrl-names = "default", "sleep"; ++ pinctrl-0 = <&blsp2_uart2_4pins_default>; ++ pinctrl-1 = <&blsp2_uart2_4pins_sleep>; ++}; + +- i2c@7577000 { +- /* On Low speed expansion */ +- label = "LS-I2C0"; +- status = "okay"; +- }; ++&blsp1_i2c2 { ++ /* On Low speed expansion */ ++ label = "LS-I2C0"; ++ status = "okay"; ++}; + +- i2c@75b6000 { +- /* On Low speed expansion */ +- label = "LS-I2C1"; +- status = "okay"; +- }; ++&blsp2_i2c1 { ++ /* On Low speed expansion */ ++ label = "LS-I2C1"; ++ status = "okay"; ++}; + +- spi@7575000 { +- /* On Low speed expansion */ +- label = "LS-SPI0"; +- status = "okay"; +- }; ++&blsp1_spi0 { ++ /* On Low speed expansion */ ++ label = "LS-SPI0"; ++ status = "okay"; ++}; + +- i2c@75b5000 { +- /* On High speed expansion */ +- label = "HS-I2C2"; +- status = "okay"; +- }; ++&blsp2_i2c0 { ++ /* On High speed expansion */ ++ label = "HS-I2C2"; ++ status = "okay"; ++}; + +- spi@75ba000{ +- /* On High speed expansion */ +- label = "HS-SPI1"; +- status = "okay"; +- }; ++&blsp2_spi5 { ++ /* On High speed expansion */ ++ label = "HS-SPI1"; ++ status = "okay"; ++}; + +- sdhci@74a4900 { +- /* External SD card */ +- pinctrl-names = "default", "sleep"; +- pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdc2_cd_on>; +- pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off &sdc2_cd_off>; +- cd-gpios = <&msmgpio 38 0x1>; +- vmmc-supply = <&pm8994_l21>; +- vqmmc-supply = <&pm8994_l13>; +- status = "okay"; +- }; ++&sdhc2 { ++ /* External SD card */ ++ pinctrl-names = "default", "sleep"; ++ pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdc2_cd_on>; ++ pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off &sdc2_cd_off>; ++ cd-gpios = <&msmgpio 38 0x1>; ++ vmmc-supply = <&pm8994_l21>; ++ vqmmc-supply = <&pm8994_l13>; ++ status = "okay"; ++}; + +- phy@627000 { +- status = "okay"; +- }; ++&ufsphy { ++ status = "okay"; ++}; + +- ufshc@624000 { +- status = "okay"; +- }; ++&ufshc { ++ status = "okay"; ++}; + +- pinctrl@1010000 { +- gpio-line-names = +- "[SPI0_DOUT]", /* GPIO_0, BLSP1_SPI_MOSI, LSEC pin 14 */ +- "[SPI0_DIN]", /* GPIO_1, BLSP1_SPI_MISO, LSEC pin 10 */ +- "[SPI0_CS]", /* GPIO_2, BLSP1_SPI_CS_N, LSEC pin 12 */ +- "[SPI0_SCLK]", /* GPIO_3, BLSP1_SPI_CLK, LSEC pin 8 */ +- "[UART1_TxD]", /* GPIO_4, BLSP8_UART_TX, LSEC pin 11 */ +- "[UART1_RxD]", /* GPIO_5, BLSP8_UART_RX, LSEC pin 13 */ +- "[I2C1_SDA]", /* GPIO_6, BLSP8_I2C_SDA, LSEC pin 21 */ +- "[I2C1_SCL]", /* GPIO_7, BLSP8_I2C_SCL, LSEC pin 19 */ +- "GPIO-H", /* GPIO_8, LCD0_RESET_N, LSEC pin 30 */ +- "TP93", /* GPIO_9 */ +- "GPIO-G", /* GPIO_10, MDP_VSYNC_P, LSEC pin 29 */ +- "[MDP_VSYNC_S]", /* GPIO_11, S HSEC pin 55 */ +- "NC", /* GPIO_12 */ +- "[CSI0_MCLK]", /* GPIO_13, CAM_MCLK0, P HSEC pin 15 */ +- "[CAM_MCLK1]", /* GPIO_14, J14 pin 11 */ +- "[CSI1_MCLK]", /* GPIO_15, CAM_MCLK2, P HSEC pin 17 */ +- "TP99", /* GPIO_16 */ +- "[I2C2_SDA]", /* GPIO_17, CCI_I2C_SDA0, P HSEC pin 34 */ +- "[I2C2_SCL]", /* GPIO_18, CCI_I2C_SCL0, P HSEC pin 32 */ +- "[CCI_I2C_SDA1]", /* GPIO_19, S HSEC pin 38 */ +- "[CCI_I2C_SCL1]", /* GPIO_20, S HSEC pin 36 */ +- "FLASH_STROBE_EN", /* GPIO_21, S HSEC pin 5 */ +- "FLASH_STROBE_TRIG", /* GPIO_22, S HSEC pin 1 */ +- "GPIO-K", /* GPIO_23, CAM2_RST_N, LSEC pin 33 */ +- "GPIO-D", /* GPIO_24, LSEC pin 26 */ +- "GPIO-I", /* GPIO_25, CAM0_RST_N, LSEC pin 31 */ +- "GPIO-J", /* GPIO_26, CAM0_STANDBY_N, LSEC pin 32 */ +- "BLSP6_I2C_SDA", /* GPIO_27 */ +- "BLSP6_I2C_SCL", /* GPIO_28 */ +- "GPIO-B", /* GPIO_29, TS0_RESET_N, LSEC pin 24 */ +- "GPIO30", /* GPIO_30, S HSEC pin 4 */ +- "HDMI_CEC", /* GPIO_31 */ +- "HDMI_DDC_CLOCK", /* GPIO_32 */ +- "HDMI_DDC_DATA", /* GPIO_33 */ +- "HDMI_HOT_PLUG_DETECT", /* GPIO_34 */ +- "PCIE0_RST_N", /* GPIO_35 */ +- "PCIE0_CLKREQ_N", /* GPIO_36 */ +- "PCIE0_WAKE", /* GPIO_37 */ +- "SD_CARD_DET_N", /* GPIO_38 */ +- "TSIF1_SYNC", /* GPIO_39, S HSEC pin 48 */ +- "W_DISABLE_N", /* GPIO_40 */ +- "[BLSP9_UART_TX]", /* GPIO_41 */ +- "[BLSP9_UART_RX]", /* GPIO_42 */ +- "[BLSP2_UART_CTS_N]", /* GPIO_43 */ +- "[BLSP2_UART_RFR_N]", /* GPIO_44 */ +- "[BLSP3_UART_TX]", /* GPIO_45 */ +- "[BLSP3_UART_RX]", /* GPIO_46 */ +- "[I2C0_SDA]", /* GPIO_47, LS_I2C0_SDA, LSEC pin 17 */ +- "[I2C0_SCL]", /* GPIO_48, LS_I2C0_SCL, LSEC pin 15 */ +- "[UART0_TxD]", /* GPIO_49, BLSP9_UART_TX, LSEC pin 5 */ +- "[UART0_RxD]", /* GPIO_50, BLSP9_UART_RX, LSEC pin 7 */ +- "[UART0_CTS]", /* GPIO_51, BLSP9_UART_CTS_N, LSEC pin 3 */ +- "[UART0_RTS]", /* GPIO_52, BLSP9_UART_RFR_N, LSEC pin 9 */ +- "[CODEC_INT1_N]", /* GPIO_53 */ +- "[CODEC_INT2_N]", /* GPIO_54 */ +- "[BLSP7_I2C_SDA]", /* GPIO_55 */ +- "[BLSP7_I2C_SCL]", /* GPIO_56 */ +- "MI2S_MCLK", /* GPIO_57, S HSEC pin 3 */ +- "[PCM_CLK]", /* GPIO_58, QUA_MI2S_SCK, LSEC pin 18 */ +- "[PCM_FS]", /* GPIO_59, QUA_MI2S_WS, LSEC pin 16 */ +- "[PCM_DO]", /* GPIO_60, QUA_MI2S_DATA0, LSEC pin 20 */ +- "[PCM_DI]", /* GPIO_61, QUA_MI2S_DATA1, LSEC pin 22 */ +- "GPIO-E", /* GPIO_62, LSEC pin 27 */ +- "TP87", /* GPIO_63 */ +- "[CODEC_RST_N]", /* GPIO_64 */ +- "[PCM1_CLK]", /* GPIO_65 */ +- "[PCM1_SYNC]", /* GPIO_66 */ +- "[PCM1_DIN]", /* GPIO_67 */ +- "[PCM1_DOUT]", /* GPIO_68 */ +- "AUDIO_REF_CLK", /* GPIO_69 */ +- "SLIMBUS_CLK", /* GPIO_70 */ +- "SLIMBUS_DATA0", /* GPIO_71 */ +- "SLIMBUS_DATA1", /* GPIO_72 */ +- "NC", /* GPIO_73 */ +- "NC", /* GPIO_74 */ +- "NC", /* GPIO_75 */ +- "NC", /* GPIO_76 */ +- "TP94", /* GPIO_77 */ +- "NC", /* GPIO_78 */ +- "TP95", /* GPIO_79 */ +- "GPIO-A", /* GPIO_80, MEMS_RESET_N, LSEC pin 23 */ +- "TP88", /* GPIO_81 */ +- "TP89", /* GPIO_82 */ +- "TP90", /* GPIO_83 */ +- "TP91", /* GPIO_84 */ +- "[SD_DAT0]", /* GPIO_85, BLSP12_SPI_MOSI, P HSEC pin 1 */ +- "[SD_CMD]", /* GPIO_86, BLSP12_SPI_MISO, P HSEC pin 11 */ +- "[SD_DAT3]", /* GPIO_87, BLSP12_SPI_CS_N, P HSEC pin 7 */ +- "[SD_SCLK]", /* GPIO_88, BLSP12_SPI_CLK, P HSEC pin 9 */ +- "TSIF1_CLK", /* GPIO_89, S HSEC pin 42 */ +- "TSIF1_EN", /* GPIO_90, S HSEC pin 46 */ +- "TSIF1_DATA", /* GPIO_91, S HSEC pin 44 */ +- "NC", /* GPIO_92 */ +- "TSIF2_CLK", /* GPIO_93, S HSEC pin 52 */ +- "TSIF2_EN", /* GPIO_94, S HSEC pin 56 */ +- "TSIF2_DATA", /* GPIO_95, S HSEC pin 54 */ +- "TSIF2_SYNC", /* GPIO_96, S HSEC pin 58 */ +- "NC", /* GPIO_97 */ +- "CAM1_STANDBY_N", /* GPIO_98 */ +- "NC", /* GPIO_99 */ +- "NC", /* GPIO_100 */ +- "[LCD1_RESET_N]", /* GPIO_101, S HSEC pin 51 */ +- "BOOT_CONFIG1", /* GPIO_102 */ +- "USB_HUB_RESET", /* GPIO_103 */ +- "CAM1_RST_N", /* GPIO_104 */ +- "NC", /* GPIO_105 */ +- "NC", /* GPIO_106 */ +- "NC", /* GPIO_107 */ +- "NC", /* GPIO_108 */ +- "NC", /* GPIO_109 */ +- "NC", /* GPIO_110 */ +- "NC", /* GPIO_111 */ +- "NC", /* GPIO_112 */ +- "PMI8994_BUA", /* GPIO_113 */ +- "PCIE2_RST_N", /* GPIO_114 */ +- "PCIE2_CLKREQ_N", /* GPIO_115 */ +- "PCIE2_WAKE", /* GPIO_116 */ +- "SSC_IRQ_0", /* GPIO_117 */ +- "SSC_IRQ_1", /* GPIO_118 */ +- "SSC_IRQ_2", /* GPIO_119 */ +- "NC", /* GPIO_120 */ +- "GPIO121", /* GPIO_121, S HSEC pin 2 */ +- "NC", /* GPIO_122 */ +- "SSC_IRQ_6", /* GPIO_123 */ +- "SSC_IRQ_7", /* GPIO_124 */ +- "GPIO-C", /* GPIO_125, TS_INT0, LSEC pin 25 */ +- "BOOT_CONFIG5", /* GPIO_126 */ +- "NC", /* GPIO_127 */ +- "NC", /* GPIO_128 */ +- "BOOT_CONFIG7", /* GPIO_129 */ +- "PCIE1_RST_N", /* GPIO_130 */ +- "PCIE1_CLKREQ_N", /* GPIO_131 */ +- "PCIE1_WAKE", /* GPIO_132 */ +- "GPIO-L", /* GPIO_133, CAM2_STANDBY_N, LSEC pin 34 */ +- "NC", /* GPIO_134 */ +- "NC", /* GPIO_135 */ +- "BOOT_CONFIG8", /* GPIO_136 */ +- "NC", /* GPIO_137 */ +- "NC", /* GPIO_138 */ +- "GPS_SSBI2", /* GPIO_139 */ +- "GPS_SSBI1", /* GPIO_140 */ +- "NC", /* GPIO_141 */ +- "NC", /* GPIO_142 */ +- "NC", /* GPIO_143 */ +- "BOOT_CONFIG6", /* GPIO_144 */ +- "NC", /* GPIO_145 */ +- "NC", /* GPIO_146 */ +- "NC", /* GPIO_147 */ +- "NC", /* GPIO_148 */ +- "NC"; /* GPIO_149 */ +- }; ++&msmgpio { ++ gpio-line-names = ++ "[SPI0_DOUT]", /* GPIO_0, BLSP1_SPI_MOSI, LSEC pin 14 */ ++ "[SPI0_DIN]", /* GPIO_1, BLSP1_SPI_MISO, LSEC pin 10 */ ++ "[SPI0_CS]", /* GPIO_2, BLSP1_SPI_CS_N, LSEC pin 12 */ ++ "[SPI0_SCLK]", /* GPIO_3, BLSP1_SPI_CLK, LSEC pin 8 */ ++ "[UART1_TxD]", /* GPIO_4, BLSP8_UART_TX, LSEC pin 11 */ ++ "[UART1_RxD]", /* GPIO_5, BLSP8_UART_RX, LSEC pin 13 */ ++ "[I2C1_SDA]", /* GPIO_6, BLSP8_I2C_SDA, LSEC pin 21 */ ++ "[I2C1_SCL]", /* GPIO_7, BLSP8_I2C_SCL, LSEC pin 19 */ ++ "GPIO-H", /* GPIO_8, LCD0_RESET_N, LSEC pin 30 */ ++ "TP93", /* GPIO_9 */ ++ "GPIO-G", /* GPIO_10, MDP_VSYNC_P, LSEC pin 29 */ ++ "[MDP_VSYNC_S]", /* GPIO_11, S HSEC pin 55 */ ++ "NC", /* GPIO_12 */ ++ "[CSI0_MCLK]", /* GPIO_13, CAM_MCLK0, P HSEC pin 15 */ ++ "[CAM_MCLK1]", /* GPIO_14, J14 pin 11 */ ++ "[CSI1_MCLK]", /* GPIO_15, CAM_MCLK2, P HSEC pin 17 */ ++ "TP99", /* GPIO_16 */ ++ "[I2C2_SDA]", /* GPIO_17, CCI_I2C_SDA0, P HSEC pin 34 */ ++ "[I2C2_SCL]", /* GPIO_18, CCI_I2C_SCL0, P HSEC pin 32 */ ++ "[CCI_I2C_SDA1]", /* GPIO_19, S HSEC pin 38 */ ++ "[CCI_I2C_SCL1]", /* GPIO_20, S HSEC pin 36 */ ++ "FLASH_STROBE_EN", /* GPIO_21, S HSEC pin 5 */ ++ "FLASH_STROBE_TRIG", /* GPIO_22, S HSEC pin 1 */ ++ "GPIO-K", /* GPIO_23, CAM2_RST_N, LSEC pin 33 */ ++ "GPIO-D", /* GPIO_24, LSEC pin 26 */ ++ "GPIO-I", /* GPIO_25, CAM0_RST_N, LSEC pin 31 */ ++ "GPIO-J", /* GPIO_26, CAM0_STANDBY_N, LSEC pin 32 */ ++ "BLSP6_I2C_SDA", /* GPIO_27 */ ++ "BLSP6_I2C_SCL", /* GPIO_28 */ ++ "GPIO-B", /* GPIO_29, TS0_RESET_N, LSEC pin 24 */ ++ "GPIO30", /* GPIO_30, S HSEC pin 4 */ ++ "HDMI_CEC", /* GPIO_31 */ ++ "HDMI_DDC_CLOCK", /* GPIO_32 */ ++ "HDMI_DDC_DATA", /* GPIO_33 */ ++ "HDMI_HOT_PLUG_DETECT", /* GPIO_34 */ ++ "PCIE0_RST_N", /* GPIO_35 */ ++ "PCIE0_CLKREQ_N", /* GPIO_36 */ ++ "PCIE0_WAKE", /* GPIO_37 */ ++ "SD_CARD_DET_N", /* GPIO_38 */ ++ "TSIF1_SYNC", /* GPIO_39, S HSEC pin 48 */ ++ "W_DISABLE_N", /* GPIO_40 */ ++ "[BLSP9_UART_TX]", /* GPIO_41 */ ++ "[BLSP9_UART_RX]", /* GPIO_42 */ ++ "[BLSP2_UART_CTS_N]", /* GPIO_43 */ ++ "[BLSP2_UART_RFR_N]", /* GPIO_44 */ ++ "[BLSP3_UART_TX]", /* GPIO_45 */ ++ "[BLSP3_UART_RX]", /* GPIO_46 */ ++ "[I2C0_SDA]", /* GPIO_47, LS_I2C0_SDA, LSEC pin 17 */ ++ "[I2C0_SCL]", /* GPIO_48, LS_I2C0_SCL, LSEC pin 15 */ ++ "[UART0_TxD]", /* GPIO_49, BLSP9_UART_TX, LSEC pin 5 */ ++ "[UART0_RxD]", /* GPIO_50, BLSP9_UART_RX, LSEC pin 7 */ ++ "[UART0_CTS]", /* GPIO_51, BLSP9_UART_CTS_N, LSEC pin 3 */ ++ "[UART0_RTS]", /* GPIO_52, BLSP9_UART_RFR_N, LSEC pin 9 */ ++ "[CODEC_INT1_N]", /* GPIO_53 */ ++ "[CODEC_INT2_N]", /* GPIO_54 */ ++ "[BLSP7_I2C_SDA]", /* GPIO_55 */ ++ "[BLSP7_I2C_SCL]", /* GPIO_56 */ ++ "MI2S_MCLK", /* GPIO_57, S HSEC pin 3 */ ++ "[PCM_CLK]", /* GPIO_58, QUA_MI2S_SCK, LSEC pin 18 */ ++ "[PCM_FS]", /* GPIO_59, QUA_MI2S_WS, LSEC pin 16 */ ++ "[PCM_DO]", /* GPIO_60, QUA_MI2S_DATA0, LSEC pin 20 */ ++ "[PCM_DI]", /* GPIO_61, QUA_MI2S_DATA1, LSEC pin 22 */ ++ "GPIO-E", /* GPIO_62, LSEC pin 27 */ ++ "TP87", /* GPIO_63 */ ++ "[CODEC_RST_N]", /* GPIO_64 */ ++ "[PCM1_CLK]", /* GPIO_65 */ ++ "[PCM1_SYNC]", /* GPIO_66 */ ++ "[PCM1_DIN]", /* GPIO_67 */ ++ "[PCM1_DOUT]", /* GPIO_68 */ ++ "AUDIO_REF_CLK", /* GPIO_69 */ ++ "SLIMBUS_CLK", /* GPIO_70 */ ++ "SLIMBUS_DATA0", /* GPIO_71 */ ++ "SLIMBUS_DATA1", /* GPIO_72 */ ++ "NC", /* GPIO_73 */ ++ "NC", /* GPIO_74 */ ++ "NC", /* GPIO_75 */ ++ "NC", /* GPIO_76 */ ++ "TP94", /* GPIO_77 */ ++ "NC", /* GPIO_78 */ ++ "TP95", /* GPIO_79 */ ++ "GPIO-A", /* GPIO_80, MEMS_RESET_N, LSEC pin 23 */ ++ "TP88", /* GPIO_81 */ ++ "TP89", /* GPIO_82 */ ++ "TP90", /* GPIO_83 */ ++ "TP91", /* GPIO_84 */ ++ "[SD_DAT0]", /* GPIO_85, BLSP12_SPI_MOSI, P HSEC pin 1 */ ++ "[SD_CMD]", /* GPIO_86, BLSP12_SPI_MISO, P HSEC pin 11 */ ++ "[SD_DAT3]", /* GPIO_87, BLSP12_SPI_CS_N, P HSEC pin 7 */ ++ "[SD_SCLK]", /* GPIO_88, BLSP12_SPI_CLK, P HSEC pin 9 */ ++ "TSIF1_CLK", /* GPIO_89, S HSEC pin 42 */ ++ "TSIF1_EN", /* GPIO_90, S HSEC pin 46 */ ++ "TSIF1_DATA", /* GPIO_91, S HSEC pin 44 */ ++ "NC", /* GPIO_92 */ ++ "TSIF2_CLK", /* GPIO_93, S HSEC pin 52 */ ++ "TSIF2_EN", /* GPIO_94, S HSEC pin 56 */ ++ "TSIF2_DATA", /* GPIO_95, S HSEC pin 54 */ ++ "TSIF2_SYNC", /* GPIO_96, S HSEC pin 58 */ ++ "NC", /* GPIO_97 */ ++ "CAM1_STANDBY_N", /* GPIO_98 */ ++ "NC", /* GPIO_99 */ ++ "NC", /* GPIO_100 */ ++ "[LCD1_RESET_N]", /* GPIO_101, S HSEC pin 51 */ ++ "BOOT_CONFIG1", /* GPIO_102 */ ++ "USB_HUB_RESET", /* GPIO_103 */ ++ "CAM1_RST_N", /* GPIO_104 */ ++ "NC", /* GPIO_105 */ ++ "NC", /* GPIO_106 */ ++ "NC", /* GPIO_107 */ ++ "NC", /* GPIO_108 */ ++ "NC", /* GPIO_109 */ ++ "NC", /* GPIO_110 */ ++ "NC", /* GPIO_111 */ ++ "NC", /* GPIO_112 */ ++ "PMI8994_BUA", /* GPIO_113 */ ++ "PCIE2_RST_N", /* GPIO_114 */ ++ "PCIE2_CLKREQ_N", /* GPIO_115 */ ++ "PCIE2_WAKE", /* GPIO_116 */ ++ "SSC_IRQ_0", /* GPIO_117 */ ++ "SSC_IRQ_1", /* GPIO_118 */ ++ "SSC_IRQ_2", /* GPIO_119 */ ++ "NC", /* GPIO_120 */ ++ "GPIO121", /* GPIO_121, S HSEC pin 2 */ ++ "NC", /* GPIO_122 */ ++ "SSC_IRQ_6", /* GPIO_123 */ ++ "SSC_IRQ_7", /* GPIO_124 */ ++ "GPIO-C", /* GPIO_125, TS_INT0, LSEC pin 25 */ ++ "BOOT_CONFIG5", /* GPIO_126 */ ++ "NC", /* GPIO_127 */ ++ "NC", /* GPIO_128 */ ++ "BOOT_CONFIG7", /* GPIO_129 */ ++ "PCIE1_RST_N", /* GPIO_130 */ ++ "PCIE1_CLKREQ_N", /* GPIO_131 */ ++ "PCIE1_WAKE", /* GPIO_132 */ ++ "GPIO-L", /* GPIO_133, CAM2_STANDBY_N, LSEC pin 34 */ ++ "NC", /* GPIO_134 */ ++ "NC", /* GPIO_135 */ ++ "BOOT_CONFIG8", /* GPIO_136 */ ++ "NC", /* GPIO_137 */ ++ "NC", /* GPIO_138 */ ++ "GPS_SSBI2", /* GPIO_139 */ ++ "GPS_SSBI1", /* GPIO_140 */ ++ "NC", /* GPIO_141 */ ++ "NC", /* GPIO_142 */ ++ "NC", /* GPIO_143 */ ++ "BOOT_CONFIG6", /* GPIO_144 */ ++ "NC", /* GPIO_145 */ ++ "NC", /* GPIO_146 */ ++ "NC", /* GPIO_147 */ ++ "NC", /* GPIO_148 */ ++ "NC"; /* GPIO_149 */ ++}; + +- qcom,spmi@400f000 { +- pmic@0 { +- gpios@c000 { +- gpio-line-names = +- "NC", +- "KEY_VOLP_N", +- "NC", +- "BL1_PWM", +- "GPIO-F", /* BL0_PWM, LSEC pin 28 */ +- "BL1_EN", +- "NC", +- "WLAN_EN", +- "NC", +- "NC", +- "NC", +- "NC", +- "NC", +- "NC", +- "DIVCLK1", +- "DIVCLK2", +- "DIVCLK3", +- "DIVCLK4", +- "BT_EN", +- "PMIC_SLB", +- "PMIC_BUA", +- "USB_VBUS_DET"; +- }; +- +- mpps@a000 { +- gpio-line-names = +- "VDDPX_BIAS", +- "WIFI_LED", +- "NC", +- "BT_LED", +- "PM_MPP05", +- "PM_MPP06", +- "PM_MPP07", +- "NC"; +- }; +- }; ++&pm8994_gpios { ++ gpio-line-names = ++ "NC", ++ "KEY_VOLP_N", ++ "NC", ++ "BL1_PWM", ++ "GPIO-F", /* BL0_PWM, LSEC pin 28 */ ++ "BL1_EN", ++ "NC", ++ "WLAN_EN", ++ "NC", ++ "NC", ++ "NC", ++ "NC", ++ "NC", ++ "NC", ++ "DIVCLK1", ++ "DIVCLK2", ++ "DIVCLK3", ++ "DIVCLK4", ++ "BT_EN", ++ "PMIC_SLB", ++ "PMIC_BUA", ++ "USB_VBUS_DET"; ++}; + +- pmic@2 { +- gpios@c000 { +- gpio-line-names = +- "NC", +- "SPKR_AMP_EN1", +- "SPKR_AMP_EN2", +- "TP61", +- "NC", +- "USB2_VBUS_DET", +- "NC", +- "NC", +- "NC", +- "NC"; +- }; +- }; +- }; ++&pm8994_mpps { ++ gpio-line-names = ++ "VDDPX_BIAS", ++ "WIFI_LED", ++ "NC", ++ "BT_LED", ++ "PM_MPP05", ++ "PM_MPP06", ++ "PM_MPP07", ++ "NC"; ++}; + +- phy@34000 { +- status = "okay"; +- }; ++&pmi8994_gpios { ++ gpio-line-names = ++ "NC", ++ "SPKR_AMP_EN1", ++ "SPKR_AMP_EN2", ++ "TP61", ++ "NC", ++ "USB2_VBUS_DET", ++ "NC", ++ "NC", ++ "NC", ++ "NC"; ++}; + +- phy@7410000 { +- status = "okay"; +- }; ++&pcie_phy { ++ status = "okay"; ++}; + +- phy@7411000 { +- status = "okay"; +- }; ++&usb3phy { ++ status = "okay"; ++}; + +- phy@7412000 { +- status = "okay"; +- }; ++&hsusb_phy1 { ++ status = "okay"; ++}; + +- usb@6af8800 { +- status = "okay"; +- extcon = <&usb3_id>; ++&hsusb_phy2 { ++ status = "okay"; ++}; + +- dwc3@6a00000 { +- extcon = <&usb3_id>; +- dr_mode = "otg"; +- }; +- }; ++&usb3 { ++ status = "okay"; ++ extcon = <&usb3_id>; + +- usb@76f8800 { +- status = "okay"; +- extcon = <&usb2_id>; ++ dwc3@6a00000 { ++ extcon = <&usb3_id>; ++ dr_mode = "otg"; ++ }; ++}; + +- dwc3@7600000 { +- extcon = <&usb2_id>; +- dr_mode = "otg"; +- maximum-speed = "high-speed"; +- }; +- }; ++&usb2 { ++ status = "okay"; ++ extcon = <&usb2_id>; + +- agnoc@0 { +- pcie@600000 { +- status = "okay"; +- perst-gpio = <&msmgpio 35 GPIO_ACTIVE_LOW>; +- vddpe-3v3-supply = <&wlan_en>; +- }; ++ dwc3@7600000 { ++ extcon = <&usb2_id>; ++ dr_mode = "otg"; ++ maximum-speed = "high-speed"; ++ }; ++}; + +- pcie@608000 { +- status = "okay"; +- perst-gpio = <&msmgpio 130 GPIO_ACTIVE_LOW>; +- }; ++&pcie0 { ++ status = "okay"; ++ perst-gpio = <&msmgpio 35 GPIO_ACTIVE_LOW>; ++ vddpe-3v3-supply = <&wlan_en>; ++}; + +- pcie@610000 { +- status = "okay"; +- perst-gpio = <&msmgpio 114 GPIO_ACTIVE_LOW>; +- }; +- }; ++&pcie1 { ++ status = "okay"; ++ perst-gpio = <&msmgpio 130 GPIO_ACTIVE_LOW>; ++}; + +- slim_msm: slim@91c0000 { +- ngd@1 { +- wcd9335: codec@1{ +- clock-names = "mclk", "slimbus"; +- clocks = <&div1_mclk>, +- <&rpmcc RPM_SMD_BB_CLK1>; +- }; +- }; +- }; ++&pcie2 { ++ status = "okay"; ++ perst-gpio = <&msmgpio 114 GPIO_ACTIVE_LOW>; ++}; + +- mdss@900000 { +- status = "okay"; ++&wcd9335 { ++ clock-names = "mclk", "slimbus"; ++ clocks = <&div1_mclk>, ++ <&rpmcc RPM_SMD_BB_CLK1>; ++}; + +- mdp@901000 { +- status = "okay"; +- }; ++&mdss { ++ status = "okay"; ++}; + +- hdmi-phy@9a0600 { +- status = "okay"; ++&mdp { ++ status = "okay"; ++}; + +- vddio-supply = <&pm8994_l12>; +- vcca-supply = <&pm8994_l28>; +- #phy-cells = <0>; +- }; ++&hdmi_phy { ++ status = "okay"; + +- hdmi-tx@9a0000 { +- status = "okay"; ++ vddio-supply = <&pm8994_l12>; ++ vcca-supply = <&pm8994_l28>; ++ #phy-cells = <0>; ++}; + +- pinctrl-names = "default", "sleep"; +- pinctrl-0 = <&hdmi_hpd_active &hdmi_ddc_active>; +- pinctrl-1 = <&hdmi_hpd_suspend &hdmi_ddc_suspend>; ++&hdmi { ++ status = "okay"; + +- core-vdda-supply = <&pm8994_l12>; +- core-vcc-supply = <&pm8994_s4>; +- }; +- }; +- }; ++ pinctrl-names = "default", "sleep"; ++ pinctrl-0 = <&hdmi_hpd_active &hdmi_ddc_active>; ++ pinctrl-1 = <&hdmi_hpd_suspend &hdmi_ddc_suspend>; + ++ core-vdda-supply = <&pm8994_l12>; ++ core-vcc-supply = <&pm8994_s4>; ++}; + ++/ { + gpio_keys { + compatible = "gpio-keys"; + #address-cells = <1>; +diff --git a/arch/arm64/boot/dts/qcom/msm8996.dtsi b/arch/arm64/boot/dts/qcom/msm8996.dtsi +index fb9556f57f55b..bbdb0fcd818e9 100644 +--- a/arch/arm64/boot/dts/qcom/msm8996.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi +@@ -1464,7 +1464,7 @@ gpu_speed_bin: gpu_speed_bin@133 { + }; + }; + +- phy@34000 { ++ pcie_phy: phy@34000 { + compatible = "qcom,msm8996-qmp-pcie-phy"; + reg = <0x34000 0x488>; + #clock-cells = <1>; +@@ -1526,7 +1526,7 @@ pciephy_2: lane@37000 { + }; + }; + +- phy@7410000 { ++ usb3phy: phy@7410000 { + compatible = "qcom,msm8996-qmp-usb3-phy"; + reg = <0x7410000 0x1c4>; + #clock-cells = <1>; +-- +2.43.0 + diff --git a/queue-5.4/arm64-dts-qcom-msm8998-fix-ufs-phy-clocks.patch b/queue-5.4/arm64-dts-qcom-msm8998-fix-ufs-phy-clocks.patch new file mode 100644 index 00000000000..b9b707d8fec --- /dev/null +++ b/queue-5.4/arm64-dts-qcom-msm8998-fix-ufs-phy-clocks.patch @@ -0,0 +1,51 @@ +From 7478e134dbd5a673861947aad1db0b44a9773ab6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 31 Jan 2024 12:37:29 +0530 +Subject: arm64: dts: qcom: msm8998: Fix UFS PHY clocks + +From: Manivannan Sadhasivam + +[ Upstream commit 5e653a7ff4426242f22dd8bc6af7f29e10ee0d68 ] + +QMP PHY used in MSM8998 requires 3 clocks: + +* ref - 19.2MHz reference clock from RPM +* ref_aux - Auxiliary reference clock from GCC +* qref - QREF clock from GCC + +Fixes: cd3dbe2a4e6c ("arm64: dts: qcom: msm8998: Add UFS nodes") +Reviewed-by: Konrad Dybcio +Signed-off-by: Manivannan Sadhasivam +Link: https://lore.kernel.org/r/20240131-ufs-phy-clock-v3-6-58a49d2f4605@linaro.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/msm8998.dtsi | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/arch/arm64/boot/dts/qcom/msm8998.dtsi b/arch/arm64/boot/dts/qcom/msm8998.dtsi +index 9cb7163c5714c..697f992aa1c3a 100644 +--- a/arch/arm64/boot/dts/qcom/msm8998.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8998.dtsi +@@ -967,12 +967,12 @@ ufsphy: phy@1da7000 { + #size-cells = <1>; + ranges; + +- clock-names = +- "ref", +- "ref_aux"; +- clocks = +- <&gcc GCC_UFS_CLKREF_CLK>, +- <&gcc GCC_UFS_PHY_AUX_CLK>; ++ clocks = <&rpmcc RPM_SMD_LN_BB_CLK1>, ++ <&gcc GCC_UFS_PHY_AUX_CLK>, ++ <&gcc GCC_UFS_CLKREF_CLK>; ++ clock-names = "ref", ++ "ref_aux", ++ "qref"; + + reset-names = "ufsphy"; + resets = <&ufshc 0>; +-- +2.43.0 + diff --git a/queue-5.4/asoc-meson-axg-tdm-interface-fix-mclk-setup-without-.patch b/queue-5.4/asoc-meson-axg-tdm-interface-fix-mclk-setup-without-.patch new file mode 100644 index 00000000000..aa0cc8e05bc --- /dev/null +++ b/queue-5.4/asoc-meson-axg-tdm-interface-fix-mclk-setup-without-.patch @@ -0,0 +1,49 @@ +From dc75730b1608c8aac8aa1485da99665428be99a1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 23 Feb 2024 18:51:07 +0100 +Subject: ASoC: meson: axg-tdm-interface: fix mclk setup without mclk-fs + +From: Jerome Brunet + +[ Upstream commit e3741a8d28a1137f8b19ae6f3d6e3be69a454a0a ] + +By default, when mclk-fs is not provided, the tdm-interface driver +requests an MCLK that is 4x the bit clock, SCLK. + +However there is no justification for this: + +* If the codec needs MCLK for its operation, mclk-fs is expected to be set + according to the codec requirements. +* If the codec does not need MCLK the minimum is 2 * SCLK, because this is + minimum the divider between SCLK and MCLK can do. + +Multiplying by 4 may cause problems because the PLL limit may be reached +sooner than it should, so use 2x instead. + +Fixes: d60e4f1e4be5 ("ASoC: meson: add tdm interface driver") +Signed-off-by: Jerome Brunet +Link: https://msgid.link/r/20240223175116.2005407-2-jbrunet@baylibre.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/meson/axg-tdm-interface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/sound/soc/meson/axg-tdm-interface.c b/sound/soc/meson/axg-tdm-interface.c +index f5a431b8de6c3..34aff050caf25 100644 +--- a/sound/soc/meson/axg-tdm-interface.c ++++ b/sound/soc/meson/axg-tdm-interface.c +@@ -266,8 +266,8 @@ static int axg_tdm_iface_set_sclk(struct snd_soc_dai *dai, + srate = iface->slots * iface->slot_width * params_rate(params); + + if (!iface->mclk_rate) { +- /* If no specific mclk is requested, default to bit clock * 4 */ +- clk_set_rate(iface->mclk, 4 * srate); ++ /* If no specific mclk is requested, default to bit clock * 2 */ ++ clk_set_rate(iface->mclk, 2 * srate); + } else { + /* Check if we can actually get the bit clock from mclk */ + if (iface->mclk_rate % srate) { +-- +2.43.0 + diff --git a/queue-5.4/b43-dma-fix-use-true-false-for-bool-type-variable.patch b/queue-5.4/b43-dma-fix-use-true-false-for-bool-type-variable.patch new file mode 100644 index 00000000000..7d7f559badd --- /dev/null +++ b/queue-5.4/b43-dma-fix-use-true-false-for-bool-type-variable.patch @@ -0,0 +1,44 @@ +From b2a6f78acd6c8c7b5a92a58d1621c73306034485 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 29 Oct 2019 00:42:59 +0530 +Subject: b43: dma: Fix use true/false for bool type variable + +From: Saurav Girepunje + +[ Upstream commit a9160bb35ad9ada8428a4d48426f7fc128db40cc ] + +use true/false for bool type variables assignment. + +Signed-off-by: Saurav Girepunje +Signed-off-by: Kalle Valo +Stable-dep-of: 9636951e4468 ("wifi: b43: Stop/wake correct queue in DMA Tx path when QoS is disabled") +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/broadcom/b43/dma.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/wireless/broadcom/b43/dma.c b/drivers/net/wireless/broadcom/b43/dma.c +index 72bf07540da39..ca671fc13116f 100644 +--- a/drivers/net/wireless/broadcom/b43/dma.c ++++ b/drivers/net/wireless/broadcom/b43/dma.c +@@ -1400,7 +1400,7 @@ int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb) + /* This TX ring is full. */ + unsigned int skb_mapping = skb_get_queue_mapping(skb); + ieee80211_stop_queue(dev->wl->hw, skb_mapping); +- dev->wl->tx_queue_stopped[skb_mapping] = 1; ++ dev->wl->tx_queue_stopped[skb_mapping] = true; + ring->stopped = true; + if (b43_debug(dev, B43_DBG_DMAVERBOSE)) { + b43dbg(dev->wl, "Stopped TX ring %d\n", ring->index); +@@ -1566,7 +1566,7 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, + } + + if (dev->wl->tx_queue_stopped[ring->queue_prio]) { +- dev->wl->tx_queue_stopped[ring->queue_prio] = 0; ++ dev->wl->tx_queue_stopped[ring->queue_prio] = false; + } else { + /* If the driver queue is running wake the corresponding + * mac80211 queue. */ +-- +2.43.0 + diff --git a/queue-5.4/b43-main-fix-use-true-false-for-bool-type.patch b/queue-5.4/b43-main-fix-use-true-false-for-bool-type.patch new file mode 100644 index 00000000000..687a8250033 --- /dev/null +++ b/queue-5.4/b43-main-fix-use-true-false-for-bool-type.patch @@ -0,0 +1,53 @@ +From 7cdfd72b8a48051ea0acb553482d548d8f8428ec Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 29 Oct 2019 00:32:04 +0530 +Subject: b43: main: Fix use true/false for bool type + +From: Saurav Girepunje + +[ Upstream commit 6db774c1725059f98e4fce97f878688248584be5 ] + +use true/false on bool type variable assignment. + +Signed-off-by: Saurav Girepunje +Signed-off-by: Kalle Valo +Stable-dep-of: 581c8967d66c ("wifi: b43: Stop correct queue in DMA worker when QoS is disabled") +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/broadcom/b43/main.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/wireless/broadcom/b43/main.c b/drivers/net/wireless/broadcom/b43/main.c +index 3432dfe1ddb47..3ad94dad2d89b 100644 +--- a/drivers/net/wireless/broadcom/b43/main.c ++++ b/drivers/net/wireless/broadcom/b43/main.c +@@ -3600,7 +3600,7 @@ static void b43_tx_work(struct work_struct *work) + else + err = b43_dma_tx(dev, skb); + if (err == -ENOSPC) { +- wl->tx_queue_stopped[queue_num] = 1; ++ wl->tx_queue_stopped[queue_num] = true; + ieee80211_stop_queue(wl->hw, queue_num); + skb_queue_head(&wl->tx_queue[queue_num], skb); + break; +@@ -3611,7 +3611,7 @@ static void b43_tx_work(struct work_struct *work) + } + + if (!err) +- wl->tx_queue_stopped[queue_num] = 0; ++ wl->tx_queue_stopped[queue_num] = false; + } + + #if B43_DEBUG +@@ -5603,7 +5603,7 @@ static struct b43_wl *b43_wireless_init(struct b43_bus_dev *dev) + /* Initialize queues and flags. */ + for (queue_num = 0; queue_num < B43_QOS_QUEUE_NUM; queue_num++) { + skb_queue_head_init(&wl->tx_queue[queue_num]); +- wl->tx_queue_stopped[queue_num] = 0; ++ wl->tx_queue_stopped[queue_num] = false; + } + + snprintf(chip_name, ARRAY_SIZE(chip_name), +-- +2.43.0 + diff --git a/queue-5.4/backlight-da9052-fully-initialize-backlight_properti.patch b/queue-5.4/backlight-da9052-fully-initialize-backlight_properti.patch new file mode 100644 index 00000000000..2b79a873e6b --- /dev/null +++ b/queue-5.4/backlight-da9052-fully-initialize-backlight_properti.patch @@ -0,0 +1,37 @@ +From c3bc716c5214b3d09d53c169b5e359527939b1df Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 20 Feb 2024 15:35:24 +0000 +Subject: backlight: da9052: Fully initialize backlight_properties during probe + +From: Daniel Thompson + +[ Upstream commit 0285e9efaee8276305db5c52a59baf84e9731556 ] + +props is stack allocated and the fields that are not explcitly set +by the probe function need to be zeroed or we'll get undefined behaviour +(especially so power/blank states)! + +Fixes: 6ede3d832aaa ("backlight: add driver for DA9052/53 PMIC v1") +Signed-off-by: Daniel Thompson +Link: https://lore.kernel.org/r/20240220153532.76613-2-daniel.thompson@linaro.org +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/video/backlight/da9052_bl.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/video/backlight/da9052_bl.c b/drivers/video/backlight/da9052_bl.c +index 882359dd288c0..aa00379392a0f 100644 +--- a/drivers/video/backlight/da9052_bl.c ++++ b/drivers/video/backlight/da9052_bl.c +@@ -117,6 +117,7 @@ static int da9052_backlight_probe(struct platform_device *pdev) + wleds->led_reg = platform_get_device_id(pdev)->driver_data; + wleds->state = DA9052_WLEDS_OFF; + ++ memset(&props, 0, sizeof(struct backlight_properties)); + props.type = BACKLIGHT_RAW; + props.max_brightness = DA9052_MAX_BRIGHTNESS; + +-- +2.43.0 + diff --git a/queue-5.4/backlight-lm3630a-don-t-set-bl-props.brightness-in-g.patch b/queue-5.4/backlight-lm3630a-don-t-set-bl-props.brightness-in-g.patch new file mode 100644 index 00000000000..143c54f5c41 --- /dev/null +++ b/queue-5.4/backlight-lm3630a-don-t-set-bl-props.brightness-in-g.patch @@ -0,0 +1,77 @@ +From b80416da33b2afd417e9cc6123b3881b2f998f91 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 20 Feb 2024 00:11:20 +0100 +Subject: backlight: lm3630a: Don't set bl->props.brightness in get_brightness + +From: Luca Weiss + +[ Upstream commit 4bf7ddd2d2f0f8826f25f74c7eba4e2c323a1446 ] + +There's no need to set bl->props.brightness, the get_brightness function +is just supposed to return the current brightness and not touch the +struct. + +With that done we can also remove the 'goto out' and just return the +value. + +Fixes: 0c2a665a648e ("backlight: add Backlight driver for lm3630 chip") +Signed-off-by: Luca Weiss +Reviewed-by: Daniel Thompson +Link: https://lore.kernel.org/r/20240220-lm3630a-fixups-v1-2-9ca62f7e4a33@z3ntu.xyz +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/video/backlight/lm3630a_bl.c | 14 ++++---------- + 1 file changed, 4 insertions(+), 10 deletions(-) + +diff --git a/drivers/video/backlight/lm3630a_bl.c b/drivers/video/backlight/lm3630a_bl.c +index a381b3990986d..8d22ba62d78b0 100644 +--- a/drivers/video/backlight/lm3630a_bl.c ++++ b/drivers/video/backlight/lm3630a_bl.c +@@ -227,7 +227,7 @@ static int lm3630a_bank_a_get_brightness(struct backlight_device *bl) + if (rval < 0) + goto out_i2c_err; + brightness |= rval; +- goto out; ++ return brightness; + } + + /* disable sleep */ +@@ -238,11 +238,8 @@ static int lm3630a_bank_a_get_brightness(struct backlight_device *bl) + rval = lm3630a_read(pchip, REG_BRT_A); + if (rval < 0) + goto out_i2c_err; +- brightness = rval; ++ return rval; + +-out: +- bl->props.brightness = brightness; +- return bl->props.brightness; + out_i2c_err: + dev_err(pchip->dev, "i2c failed to access register\n"); + return 0; +@@ -304,7 +301,7 @@ static int lm3630a_bank_b_get_brightness(struct backlight_device *bl) + if (rval < 0) + goto out_i2c_err; + brightness |= rval; +- goto out; ++ return brightness; + } + + /* disable sleep */ +@@ -315,11 +312,8 @@ static int lm3630a_bank_b_get_brightness(struct backlight_device *bl) + rval = lm3630a_read(pchip, REG_BRT_B); + if (rval < 0) + goto out_i2c_err; +- brightness = rval; ++ return rval; + +-out: +- bl->props.brightness = brightness; +- return bl->props.brightness; + out_i2c_err: + dev_err(pchip->dev, "i2c failed to access register\n"); + return 0; +-- +2.43.0 + diff --git a/queue-5.4/backlight-lm3630a-initialize-backlight_properties-on.patch b/queue-5.4/backlight-lm3630a-initialize-backlight_properties-on.patch new file mode 100644 index 00000000000..f9214d1c002 --- /dev/null +++ b/queue-5.4/backlight-lm3630a-initialize-backlight_properties-on.patch @@ -0,0 +1,37 @@ +From 2795fd6943fbb42bca86afbe68ef58e6421c05b7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 20 Feb 2024 00:11:19 +0100 +Subject: backlight: lm3630a: Initialize backlight_properties on init + +From: Luca Weiss + +[ Upstream commit ad9aeb0e3aa90ebdad5fabf9c21783740eb95907 ] + +The backlight_properties struct should be initialized to zero before +using, otherwise there will be some random values in the struct. + +Fixes: 0c2a665a648e ("backlight: add Backlight driver for lm3630 chip") +Signed-off-by: Luca Weiss +Reviewed-by: Daniel Thompson +Link: https://lore.kernel.org/r/20240220-lm3630a-fixups-v1-1-9ca62f7e4a33@z3ntu.xyz +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/video/backlight/lm3630a_bl.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/video/backlight/lm3630a_bl.c b/drivers/video/backlight/lm3630a_bl.c +index 8096202fbe5d5..a381b3990986d 100644 +--- a/drivers/video/backlight/lm3630a_bl.c ++++ b/drivers/video/backlight/lm3630a_bl.c +@@ -337,6 +337,7 @@ static int lm3630a_backlight_register(struct lm3630a_chip *pchip) + struct backlight_properties props; + const char *label; + ++ memset(&props, 0, sizeof(struct backlight_properties)); + props.type = BACKLIGHT_RAW; + if (pdata->leda_ctrl != LM3630A_LEDA_DISABLE) { + props.brightness = pdata->leda_init_brt; +-- +2.43.0 + diff --git a/queue-5.4/backlight-lm3639-fully-initialize-backlight_properti.patch b/queue-5.4/backlight-lm3639-fully-initialize-backlight_properti.patch new file mode 100644 index 00000000000..c9cd3239545 --- /dev/null +++ b/queue-5.4/backlight-lm3639-fully-initialize-backlight_properti.patch @@ -0,0 +1,37 @@ +From 43c69556f72adaa3ecb692d486566205115dd44b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 20 Feb 2024 15:35:25 +0000 +Subject: backlight: lm3639: Fully initialize backlight_properties during probe + +From: Daniel Thompson + +[ Upstream commit abb5a5d951fbea3feb5c4ba179b89bb96a1d3462 ] + +props is stack allocated and the fields that are not explcitly set +by the probe function need to be zeroed or we'll get undefined behaviour +(especially so power/blank states)! + +Fixes: 0f59858d5119 ("backlight: add new lm3639 backlight driver") +Signed-off-by: Daniel Thompson +Link: https://lore.kernel.org/r/20240220153532.76613-3-daniel.thompson@linaro.org +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/video/backlight/lm3639_bl.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/video/backlight/lm3639_bl.c b/drivers/video/backlight/lm3639_bl.c +index 48c04155a5f9d..bb617f4673e94 100644 +--- a/drivers/video/backlight/lm3639_bl.c ++++ b/drivers/video/backlight/lm3639_bl.c +@@ -339,6 +339,7 @@ static int lm3639_probe(struct i2c_client *client, + } + + /* backlight */ ++ memset(&props, 0, sizeof(struct backlight_properties)); + props.type = BACKLIGHT_RAW; + props.brightness = pdata->init_brt_led; + props.max_brightness = pdata->max_brt_led; +-- +2.43.0 + diff --git a/queue-5.4/backlight-lp8788-fully-initialize-backlight_properti.patch b/queue-5.4/backlight-lp8788-fully-initialize-backlight_properti.patch new file mode 100644 index 00000000000..d6271a6a490 --- /dev/null +++ b/queue-5.4/backlight-lp8788-fully-initialize-backlight_properti.patch @@ -0,0 +1,37 @@ +From 14ca440959b1f212135133d85f87d681287fcd4a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 20 Feb 2024 15:35:26 +0000 +Subject: backlight: lp8788: Fully initialize backlight_properties during probe + +From: Daniel Thompson + +[ Upstream commit 392346827fbe8a7fd573dfb145170d7949f639a6 ] + +props is stack allocated and the fields that are not explcitly set +by the probe function need to be zeroed or we'll get undefined behaviour +(especially so power/blank states)! + +Fixes: c5a51053cf3b ("backlight: add new lp8788 backlight driver") +Signed-off-by: Daniel Thompson +Link: https://lore.kernel.org/r/20240220153532.76613-4-daniel.thompson@linaro.org +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/video/backlight/lp8788_bl.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/video/backlight/lp8788_bl.c b/drivers/video/backlight/lp8788_bl.c +index ba42f3fe0c739..d9b95dbd40d30 100644 +--- a/drivers/video/backlight/lp8788_bl.c ++++ b/drivers/video/backlight/lp8788_bl.c +@@ -191,6 +191,7 @@ static int lp8788_backlight_register(struct lp8788_bl *bl) + int init_brt; + char *name; + ++ memset(&props, 0, sizeof(struct backlight_properties)); + props.type = BACKLIGHT_PLATFORM; + props.max_brightness = MAX_BRIGHTNESS; + +-- +2.43.0 + diff --git a/queue-5.4/bluetooth-hci_core-fix-possible-buffer-overflow.patch b/queue-5.4/bluetooth-hci_core-fix-possible-buffer-overflow.patch new file mode 100644 index 00000000000..3fc69982207 --- /dev/null +++ b/queue-5.4/bluetooth-hci_core-fix-possible-buffer-overflow.patch @@ -0,0 +1,36 @@ +From e505c555d84705559390ec4f311f856c67cc0fb7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 28 Feb 2024 10:49:26 -0500 +Subject: Bluetooth: hci_core: Fix possible buffer overflow + +From: Luiz Augusto von Dentz + +[ Upstream commit 81137162bfaa7278785b24c1fd2e9e74f082e8e4 ] + +struct hci_dev_info has a fixed size name[8] field so in the event that +hdev->name is bigger than that strcpy would attempt to write past its +size, so this fixes this problem by switching to use strscpy. + +Fixes: dcda165706b9 ("Bluetooth: hci_core: Fix build warnings") +Signed-off-by: Luiz Augusto von Dentz +Signed-off-by: Sasha Levin +--- + net/bluetooth/hci_core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c +index 289fb28529f8c..c60204b639ab7 100644 +--- a/net/bluetooth/hci_core.c ++++ b/net/bluetooth/hci_core.c +@@ -2129,7 +2129,7 @@ int hci_get_dev_info(void __user *arg) + else + flags = hdev->flags; + +- strcpy(di.name, hdev->name); ++ strscpy(di.name, hdev->name, sizeof(di.name)); + di.bdaddr = hdev->bdaddr; + di.type = (hdev->bus & 0x0f) | ((hdev->dev_type & 0x03) << 4); + di.flags = flags; +-- +2.43.0 + diff --git a/queue-5.4/bluetooth-remove-superfluous-call-to-hci_conn_check_.patch b/queue-5.4/bluetooth-remove-superfluous-call-to-hci_conn_check_.patch new file mode 100644 index 00000000000..3af4dc0a1ff --- /dev/null +++ b/queue-5.4/bluetooth-remove-superfluous-call-to-hci_conn_check_.patch @@ -0,0 +1,62 @@ +From 0cb3bb667d749727b5a4da012d003f71dd36a6a1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Jan 2024 23:46:06 +0100 +Subject: Bluetooth: Remove superfluous call to hci_conn_check_pending() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Jonas Dreßler + +[ Upstream commit 78e3639fc8031275010c3287ac548c0bc8de83b1 ] + +The "pending connections" feature was originally introduced with commit +4c67bc74f016 ("[Bluetooth] Support concurrent connect requests") and +6bd57416127e ("[Bluetooth] Handling pending connect attempts after +inquiry") to handle controllers supporting only a single connection request +at a time. Later things were extended to also cancel ongoing inquiries on +connect() with commit 89e65975fea5 ("Bluetooth: Cancel Inquiry before +Create Connection"). + +With commit a9de9248064b ("[Bluetooth] Switch from OGF+OCF to using only +opcodes"), hci_conn_check_pending() was introduced as a helper to +consolidate a few places where we check for pending connections (indicated +by the BT_CONNECT2 flag) and then try to connect. + +This refactoring commit also snuck in two more calls to +hci_conn_check_pending(): + +- One is in the failure callback of hci_cs_inquiry(), this one probably +makes sense: If we send an "HCI Inquiry" command and then immediately +after a "Create Connection" command, the "Create Connection" command might +fail before the "HCI Inquiry" command, and then we want to retry the +"Create Connection" on failure of the "HCI Inquiry". + +- The other added call to hci_conn_check_pending() is in the event handler +for the "Remote Name" event, this seems unrelated and is possibly a +copy-paste error, so remove that one. + +Fixes: a9de9248064b ("[Bluetooth] Switch from OGF+OCF to using only opcodes") +Signed-off-by: Jonas Dreßler +Signed-off-by: Luiz Augusto von Dentz +Signed-off-by: Sasha Levin +--- + net/bluetooth/hci_event.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c +index 32793d22ba61c..2125421ad7465 100644 +--- a/net/bluetooth/hci_event.c ++++ b/net/bluetooth/hci_event.c +@@ -2861,8 +2861,6 @@ static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb) + + BT_DBG("%s", hdev->name); + +- hci_conn_check_pending(hdev); +- + hci_dev_lock(hdev); + + conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr); +-- +2.43.0 + diff --git a/queue-5.4/bpf-add-typecast-to-bpf-helpers-to-help-btf-generati.patch b/queue-5.4/bpf-add-typecast-to-bpf-helpers-to-help-btf-generati.patch new file mode 100644 index 00000000000..f06f89ad478 --- /dev/null +++ b/queue-5.4/bpf-add-typecast-to-bpf-helpers-to-help-btf-generati.patch @@ -0,0 +1,50 @@ +From e27bf3ca32518092a5b2bda8aeb568d268f75a76 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 15 Oct 2019 20:24:56 -0700 +Subject: bpf: Add typecast to bpf helpers to help BTF generation + +From: Alexei Starovoitov + +[ Upstream commit 7c6a469e3416fa23568c2395a3faa7dd6e376dcb ] + +When pahole converts dwarf to btf it emits only used types. +Wrap existing bpf helper functions into typedef and use it in +typecast to make gcc emits this type into dwarf. +Then pahole will convert it to btf. +The "btf_#name_of_helper" types will be used to figure out +types of arguments of bpf helpers. +The generated code before and after is the same. +Only dwarf and btf sections are different. + +Signed-off-by: Alexei Starovoitov +Signed-off-by: Daniel Borkmann +Acked-by: Andrii Nakryiko +Acked-by: John Fastabend +Acked-by: Martin KaFai Lau +Link: https://lore.kernel.org/bpf/20191016032505.2089704-3-ast@kernel.org +Stable-dep-of: 178c54666f9c ("bpf: Mark bpf_spin_{lock,unlock}() helpers with notrace correctly") +Signed-off-by: Sasha Levin +--- + include/linux/filter.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/include/linux/filter.h b/include/linux/filter.h +index 440014875acf4..11407e9e606db 100644 +--- a/include/linux/filter.h ++++ b/include/linux/filter.h +@@ -479,10 +479,11 @@ static inline bool insn_is_zext(const struct bpf_insn *insn) + #define BPF_CALL_x(x, name, ...) \ + static __always_inline \ + u64 ____##name(__BPF_MAP(x, __BPF_DECL_ARGS, __BPF_V, __VA_ARGS__)); \ ++ typedef u64 (*btf_##name)(__BPF_MAP(x, __BPF_DECL_ARGS, __BPF_V, __VA_ARGS__)); \ + u64 name(__BPF_REG(x, __BPF_DECL_REGS, __BPF_N, __VA_ARGS__)); \ + u64 name(__BPF_REG(x, __BPF_DECL_REGS, __BPF_N, __VA_ARGS__)) \ + { \ +- return ____##name(__BPF_MAP(x,__BPF_CAST,__BPF_N,__VA_ARGS__));\ ++ return ((btf_##name)____##name)(__BPF_MAP(x,__BPF_CAST,__BPF_N,__VA_ARGS__));\ + } \ + static __always_inline \ + u64 ____##name(__BPF_MAP(x, __BPF_DECL_ARGS, __BPF_V, __VA_ARGS__)) +-- +2.43.0 + diff --git a/queue-5.4/bpf-factor-out-bpf_spin_lock-into-helpers.patch b/queue-5.4/bpf-factor-out-bpf_spin_lock-into-helpers.patch new file mode 100644 index 00000000000..4f6c73e1e33 --- /dev/null +++ b/queue-5.4/bpf-factor-out-bpf_spin_lock-into-helpers.patch @@ -0,0 +1,86 @@ +From 2c6156064b0a73d8d4123f43fa28ba10e8bfd922 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 14 Jul 2021 17:54:08 -0700 +Subject: bpf: Factor out bpf_spin_lock into helpers. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Alexei Starovoitov + +[ Upstream commit c1b3fed319d32a721d4b9c17afaeb430444ff773 ] + +Move ____bpf_spin_lock/unlock into helpers to make it more clear +that quadruple underscore bpf_spin_lock/unlock are irqsave/restore variants. + +Signed-off-by: Alexei Starovoitov +Signed-off-by: Daniel Borkmann +Acked-by: Martin KaFai Lau +Acked-by: Andrii Nakryiko +Acked-by: Toke Høiland-Jørgensen +Link: https://lore.kernel.org/bpf/20210715005417.78572-3-alexei.starovoitov@gmail.com +Stable-dep-of: 178c54666f9c ("bpf: Mark bpf_spin_{lock,unlock}() helpers with notrace correctly") +Signed-off-by: Sasha Levin +--- + kernel/bpf/helpers.c | 18 ++++++++++++++---- + 1 file changed, 14 insertions(+), 4 deletions(-) + +diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c +index a77d2814cac5d..4ba3dc621a345 100644 +--- a/kernel/bpf/helpers.c ++++ b/kernel/bpf/helpers.c +@@ -262,13 +262,18 @@ static inline void __bpf_spin_unlock(struct bpf_spin_lock *lock) + + static DEFINE_PER_CPU(unsigned long, irqsave_flags); + +-notrace BPF_CALL_1(bpf_spin_lock, struct bpf_spin_lock *, lock) ++static inline void __bpf_spin_lock_irqsave(struct bpf_spin_lock *lock) + { + unsigned long flags; + + local_irq_save(flags); + __bpf_spin_lock(lock); + __this_cpu_write(irqsave_flags, flags); ++} ++ ++notrace BPF_CALL_1(bpf_spin_lock, struct bpf_spin_lock *, lock) ++{ ++ __bpf_spin_lock_irqsave(lock); + return 0; + } + +@@ -279,13 +284,18 @@ const struct bpf_func_proto bpf_spin_lock_proto = { + .arg1_type = ARG_PTR_TO_SPIN_LOCK, + }; + +-notrace BPF_CALL_1(bpf_spin_unlock, struct bpf_spin_lock *, lock) ++static inline void __bpf_spin_unlock_irqrestore(struct bpf_spin_lock *lock) + { + unsigned long flags; + + flags = __this_cpu_read(irqsave_flags); + __bpf_spin_unlock(lock); + local_irq_restore(flags); ++} ++ ++notrace BPF_CALL_1(bpf_spin_unlock, struct bpf_spin_lock *, lock) ++{ ++ __bpf_spin_unlock_irqrestore(lock); + return 0; + } + +@@ -306,9 +316,9 @@ void copy_map_value_locked(struct bpf_map *map, void *dst, void *src, + else + lock = dst + map->spin_lock_off; + preempt_disable(); +- ____bpf_spin_lock(lock); ++ __bpf_spin_lock_irqsave(lock); + copy_map_value(map, dst, src); +- ____bpf_spin_unlock(lock); ++ __bpf_spin_unlock_irqrestore(lock); + preempt_enable(); + } + +-- +2.43.0 + diff --git a/queue-5.4/bpf-fix-hashtab-overflow-check-on-32-bit-arches.patch b/queue-5.4/bpf-fix-hashtab-overflow-check-on-32-bit-arches.patch new file mode 100644 index 00000000000..ac6d794cabe --- /dev/null +++ b/queue-5.4/bpf-fix-hashtab-overflow-check-on-32-bit-arches.patch @@ -0,0 +1,65 @@ +From 8a634e92879a79fb73bc729d3612997e4e2b915d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Mar 2024 13:03:36 +0100 +Subject: bpf: Fix hashtab overflow check on 32-bit arches +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Toke Høiland-Jørgensen + +[ Upstream commit 6787d916c2cf9850c97a0a3f73e08c43e7d973b1 ] + +The hashtab code relies on roundup_pow_of_two() to compute the number of +hash buckets, and contains an overflow check by checking if the +resulting value is 0. However, on 32-bit arches, the roundup code itself +can overflow by doing a 32-bit left-shift of an unsigned long value, +which is undefined behaviour, so it is not guaranteed to truncate +neatly. This was triggered by syzbot on the DEVMAP_HASH type, which +contains the same check, copied from the hashtab code. So apply the same +fix to hashtab, by moving the overflow check to before the roundup. + +Fixes: daaf427c6ab3 ("bpf: fix arraymap NULL deref and missing overflow and zero size checks") +Signed-off-by: Toke Høiland-Jørgensen +Message-ID: <20240307120340.99577-3-toke@redhat.com> +Signed-off-by: Alexei Starovoitov +Signed-off-by: Sasha Levin +--- + kernel/bpf/hashtab.c | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +diff --git a/kernel/bpf/hashtab.c b/kernel/bpf/hashtab.c +index f1dec90f3a522..34c4f709b1ede 100644 +--- a/kernel/bpf/hashtab.c ++++ b/kernel/bpf/hashtab.c +@@ -327,7 +327,13 @@ static struct bpf_map *htab_map_alloc(union bpf_attr *attr) + num_possible_cpus()); + } + +- /* hash table size must be power of 2 */ ++ /* hash table size must be power of 2; roundup_pow_of_two() can overflow ++ * into UB on 32-bit arches, so check that first ++ */ ++ err = -E2BIG; ++ if (htab->map.max_entries > 1UL << 31) ++ goto free_htab; ++ + htab->n_buckets = roundup_pow_of_two(htab->map.max_entries); + + htab->elem_size = sizeof(struct htab_elem) + +@@ -337,10 +343,8 @@ static struct bpf_map *htab_map_alloc(union bpf_attr *attr) + else + htab->elem_size += round_up(htab->map.value_size, 8); + +- err = -E2BIG; +- /* prevent zero size kmalloc and check for u32 overflow */ +- if (htab->n_buckets == 0 || +- htab->n_buckets > U32_MAX / sizeof(struct bucket)) ++ /* check for u32 overflow */ ++ if (htab->n_buckets > U32_MAX / sizeof(struct bucket)) + goto free_htab; + + cost = (u64) htab->n_buckets * sizeof(struct bucket) + +-- +2.43.0 + diff --git a/queue-5.4/bpf-fix-stackmap-overflow-check-on-32-bit-arches.patch b/queue-5.4/bpf-fix-stackmap-overflow-check-on-32-bit-arches.patch new file mode 100644 index 00000000000..35ea1abbbbb --- /dev/null +++ b/queue-5.4/bpf-fix-stackmap-overflow-check-on-32-bit-arches.patch @@ -0,0 +1,61 @@ +From 3085f170e3cb3bb5795ef0a9e5609e4636afed16 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Mar 2024 13:03:37 +0100 +Subject: bpf: Fix stackmap overflow check on 32-bit arches +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Toke Høiland-Jørgensen + +[ Upstream commit 7a4b21250bf79eef26543d35bd390448646c536b ] + +The stackmap code relies on roundup_pow_of_two() to compute the number +of hash buckets, and contains an overflow check by checking if the +resulting value is 0. However, on 32-bit arches, the roundup code itself +can overflow by doing a 32-bit left-shift of an unsigned long value, +which is undefined behaviour, so it is not guaranteed to truncate +neatly. This was triggered by syzbot on the DEVMAP_HASH type, which +contains the same check, copied from the hashtab code. + +The commit in the fixes tag actually attempted to fix this, but the fix +did not account for the UB, so the fix only works on CPUs where an +overflow does result in a neat truncation to zero, which is not +guaranteed. Checking the value before rounding does not have this +problem. + +Fixes: 6183f4d3a0a2 ("bpf: Check for integer overflow when using roundup_pow_of_two()") +Signed-off-by: Toke Høiland-Jørgensen +Reviewed-by: Bui Quang Minh +Message-ID: <20240307120340.99577-4-toke@redhat.com> +Signed-off-by: Alexei Starovoitov +Signed-off-by: Sasha Levin +--- + kernel/bpf/stackmap.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c +index 811071c227f11..bd8516d967453 100644 +--- a/kernel/bpf/stackmap.c ++++ b/kernel/bpf/stackmap.c +@@ -111,11 +111,14 @@ static struct bpf_map *stack_map_alloc(union bpf_attr *attr) + } else if (value_size / 8 > sysctl_perf_event_max_stack) + return ERR_PTR(-EINVAL); + +- /* hash table size must be power of 2 */ +- n_buckets = roundup_pow_of_two(attr->max_entries); +- if (!n_buckets) ++ /* hash table size must be power of 2; roundup_pow_of_two() can overflow ++ * into UB on 32-bit arches, so check that first ++ */ ++ if (attr->max_entries > 1UL << 31) + return ERR_PTR(-E2BIG); + ++ n_buckets = roundup_pow_of_two(attr->max_entries); ++ + cost = n_buckets * sizeof(struct stack_map_bucket *) + sizeof(*smap); + err = bpf_map_charge_init(&mem, cost + attr->max_entries * + (sizeof(struct stack_map_bucket) + (u64)value_size)); +-- +2.43.0 + diff --git a/queue-5.4/bpf-mark-bpf_spin_-lock-unlock-helpers-with-notrace-.patch b/queue-5.4/bpf-mark-bpf_spin_-lock-unlock-helpers-with-notrace-.patch new file mode 100644 index 00000000000..af0ece1a859 --- /dev/null +++ b/queue-5.4/bpf-mark-bpf_spin_-lock-unlock-helpers-with-notrace-.patch @@ -0,0 +1,133 @@ +From 218a47bca69c12193e01416ce7a3b5e6968acd4f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 6 Feb 2024 23:01:02 -0800 +Subject: bpf: Mark bpf_spin_{lock,unlock}() helpers with notrace correctly + +From: Yonghong Song + +[ Upstream commit 178c54666f9c4d2f49f2ea661d0c11b52f0ed190 ] + +Currently tracing is supposed not to allow for bpf_spin_{lock,unlock}() +helper calls. This is to prevent deadlock for the following cases: + - there is a prog (prog-A) calling bpf_spin_{lock,unlock}(). + - there is a tracing program (prog-B), e.g., fentry, attached + to bpf_spin_lock() and/or bpf_spin_unlock(). + - prog-B calls bpf_spin_{lock,unlock}(). +For such a case, when prog-A calls bpf_spin_{lock,unlock}(), +a deadlock will happen. + +The related source codes are below in kernel/bpf/helpers.c: + notrace BPF_CALL_1(bpf_spin_lock, struct bpf_spin_lock *, lock) + notrace BPF_CALL_1(bpf_spin_unlock, struct bpf_spin_lock *, lock) +notrace is supposed to prevent fentry prog from attaching to +bpf_spin_{lock,unlock}(). + +But actually this is not the case and fentry prog can successfully +attached to bpf_spin_lock(). Siddharth Chintamaneni reported +the issue in [1]. The following is the macro definition for +above BPF_CALL_1: + #define BPF_CALL_x(x, name, ...) \ + static __always_inline \ + u64 ____##name(__BPF_MAP(x, __BPF_DECL_ARGS, __BPF_V, __VA_ARGS__)); \ + typedef u64 (*btf_##name)(__BPF_MAP(x, __BPF_DECL_ARGS, __BPF_V, __VA_ARGS__)); \ + u64 name(__BPF_REG(x, __BPF_DECL_REGS, __BPF_N, __VA_ARGS__)); \ + u64 name(__BPF_REG(x, __BPF_DECL_REGS, __BPF_N, __VA_ARGS__)) \ + { \ + return ((btf_##name)____##name)(__BPF_MAP(x,__BPF_CAST,__BPF_N,__VA_ARGS__));\ + } \ + static __always_inline \ + u64 ____##name(__BPF_MAP(x, __BPF_DECL_ARGS, __BPF_V, __VA_ARGS__)) + + #define BPF_CALL_1(name, ...) BPF_CALL_x(1, name, __VA_ARGS__) + +The notrace attribute is actually applied to the static always_inline function +____bpf_spin_{lock,unlock}(). The actual callback function +bpf_spin_{lock,unlock}() is not marked with notrace, hence +allowing fentry prog to attach to two helpers, and this +may cause the above mentioned deadlock. Siddharth Chintamaneni +actually has a reproducer in [2]. + +To fix the issue, a new macro NOTRACE_BPF_CALL_1 is introduced which +will add notrace attribute to the original function instead of +the hidden always_inline function and this fixed the problem. + + [1] https://lore.kernel.org/bpf/CAE5sdEigPnoGrzN8WU7Tx-h-iFuMZgW06qp0KHWtpvoXxf1OAQ@mail.gmail.com/ + [2] https://lore.kernel.org/bpf/CAE5sdEg6yUc_Jz50AnUXEEUh6O73yQ1Z6NV2srJnef0ZrQkZew@mail.gmail.com/ + +Fixes: d83525ca62cf ("bpf: introduce bpf_spin_lock") +Signed-off-by: Yonghong Song +Signed-off-by: Andrii Nakryiko +Acked-by: Jiri Olsa +Link: https://lore.kernel.org/bpf/20240207070102.335167-1-yonghong.song@linux.dev +Signed-off-by: Sasha Levin +--- + include/linux/filter.h | 21 ++++++++++++--------- + kernel/bpf/helpers.c | 4 ++-- + 2 files changed, 14 insertions(+), 11 deletions(-) + +diff --git a/include/linux/filter.h b/include/linux/filter.h +index 11407e9e606db..0bec300b2e516 100644 +--- a/include/linux/filter.h ++++ b/include/linux/filter.h +@@ -476,24 +476,27 @@ static inline bool insn_is_zext(const struct bpf_insn *insn) + __BPF_MAP(n, __BPF_DECL_ARGS, __BPF_N, u64, __ur_1, u64, __ur_2, \ + u64, __ur_3, u64, __ur_4, u64, __ur_5) + +-#define BPF_CALL_x(x, name, ...) \ ++#define BPF_CALL_x(x, attr, name, ...) \ + static __always_inline \ + u64 ____##name(__BPF_MAP(x, __BPF_DECL_ARGS, __BPF_V, __VA_ARGS__)); \ + typedef u64 (*btf_##name)(__BPF_MAP(x, __BPF_DECL_ARGS, __BPF_V, __VA_ARGS__)); \ +- u64 name(__BPF_REG(x, __BPF_DECL_REGS, __BPF_N, __VA_ARGS__)); \ +- u64 name(__BPF_REG(x, __BPF_DECL_REGS, __BPF_N, __VA_ARGS__)) \ ++ attr u64 name(__BPF_REG(x, __BPF_DECL_REGS, __BPF_N, __VA_ARGS__)); \ ++ attr u64 name(__BPF_REG(x, __BPF_DECL_REGS, __BPF_N, __VA_ARGS__)) \ + { \ + return ((btf_##name)____##name)(__BPF_MAP(x,__BPF_CAST,__BPF_N,__VA_ARGS__));\ + } \ + static __always_inline \ + u64 ____##name(__BPF_MAP(x, __BPF_DECL_ARGS, __BPF_V, __VA_ARGS__)) + +-#define BPF_CALL_0(name, ...) BPF_CALL_x(0, name, __VA_ARGS__) +-#define BPF_CALL_1(name, ...) BPF_CALL_x(1, name, __VA_ARGS__) +-#define BPF_CALL_2(name, ...) BPF_CALL_x(2, name, __VA_ARGS__) +-#define BPF_CALL_3(name, ...) BPF_CALL_x(3, name, __VA_ARGS__) +-#define BPF_CALL_4(name, ...) BPF_CALL_x(4, name, __VA_ARGS__) +-#define BPF_CALL_5(name, ...) BPF_CALL_x(5, name, __VA_ARGS__) ++#define __NOATTR ++#define BPF_CALL_0(name, ...) BPF_CALL_x(0, __NOATTR, name, __VA_ARGS__) ++#define BPF_CALL_1(name, ...) BPF_CALL_x(1, __NOATTR, name, __VA_ARGS__) ++#define BPF_CALL_2(name, ...) BPF_CALL_x(2, __NOATTR, name, __VA_ARGS__) ++#define BPF_CALL_3(name, ...) BPF_CALL_x(3, __NOATTR, name, __VA_ARGS__) ++#define BPF_CALL_4(name, ...) BPF_CALL_x(4, __NOATTR, name, __VA_ARGS__) ++#define BPF_CALL_5(name, ...) BPF_CALL_x(5, __NOATTR, name, __VA_ARGS__) ++ ++#define NOTRACE_BPF_CALL_1(name, ...) BPF_CALL_x(1, notrace, name, __VA_ARGS__) + + #define bpf_ctx_range(TYPE, MEMBER) \ + offsetof(TYPE, MEMBER) ... offsetofend(TYPE, MEMBER) - 1 +diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c +index 4ba3dc621a345..9bfb4685d0684 100644 +--- a/kernel/bpf/helpers.c ++++ b/kernel/bpf/helpers.c +@@ -271,7 +271,7 @@ static inline void __bpf_spin_lock_irqsave(struct bpf_spin_lock *lock) + __this_cpu_write(irqsave_flags, flags); + } + +-notrace BPF_CALL_1(bpf_spin_lock, struct bpf_spin_lock *, lock) ++NOTRACE_BPF_CALL_1(bpf_spin_lock, struct bpf_spin_lock *, lock) + { + __bpf_spin_lock_irqsave(lock); + return 0; +@@ -293,7 +293,7 @@ static inline void __bpf_spin_unlock_irqrestore(struct bpf_spin_lock *lock) + local_irq_restore(flags); + } + +-notrace BPF_CALL_1(bpf_spin_unlock, struct bpf_spin_lock *, lock) ++NOTRACE_BPF_CALL_1(bpf_spin_unlock, struct bpf_spin_lock *, lock) + { + __bpf_spin_unlock_irqrestore(lock); + return 0; +-- +2.43.0 + diff --git a/queue-5.4/bus-tegra-aconnect-update-dependency-to-arch_tegra.patch b/queue-5.4/bus-tegra-aconnect-update-dependency-to-arch_tegra.patch new file mode 100644 index 00000000000..7e29eecce2d --- /dev/null +++ b/queue-5.4/bus-tegra-aconnect-update-dependency-to-arch_tegra.patch @@ -0,0 +1,47 @@ +From 74b741f23a8871b5a9c211dcf6f852cbc48a2c72 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 16 Feb 2024 10:02:37 +0000 +Subject: bus: tegra-aconnect: Update dependency to ARCH_TEGRA + +From: Peter Robinson + +[ Upstream commit 4acd21a45c1446277e2abaece97d7fa7c2e692a9 ] + +Update the architecture dependency to be the generic Tegra +because the driver works on the four latest Tegra generations +not just Tegra210, if you build a kernel with a specific +ARCH_TEGRA_xxx_SOC option that excludes Tegra210 you don't get +this driver. + +Fixes: 46a88534afb59 ("bus: Add support for Tegra ACONNECT") +Signed-off-by: Peter Robinson +Cc: Jon Hunter +Cc: Thierry Reding +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + drivers/bus/Kconfig | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/bus/Kconfig b/drivers/bus/Kconfig +index 47c2bb444ab4a..072dc40e29a69 100644 +--- a/drivers/bus/Kconfig ++++ b/drivers/bus/Kconfig +@@ -136,11 +136,12 @@ config SUNXI_RSB + + config TEGRA_ACONNECT + tristate "Tegra ACONNECT Bus Driver" +- depends on ARCH_TEGRA_210_SOC ++ depends on ARCH_TEGRA + depends on OF && PM + help + Driver for the Tegra ACONNECT bus which is used to interface with +- the devices inside the Audio Processing Engine (APE) for Tegra210. ++ the devices inside the Audio Processing Engine (APE) for ++ Tegra210 and later. + + config TEGRA_GMI + tristate "Tegra Generic Memory Interface bus driver" +-- +2.43.0 + diff --git a/queue-5.4/clk-fix-clk_core_get-null-dereference.patch b/queue-5.4/clk-fix-clk_core_get-null-dereference.patch new file mode 100644 index 00000000000..90c0387d8f3 --- /dev/null +++ b/queue-5.4/clk-fix-clk_core_get-null-dereference.patch @@ -0,0 +1,56 @@ +From f8a653fdc7482d9afe4c8273dd2bb38de56db489 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 2 Mar 2024 00:52:14 +0000 +Subject: clk: Fix clk_core_get NULL dereference + +From: Bryan O'Donoghue + +[ Upstream commit e97fe4901e0f59a0bfd524578fe3768f8ca42428 ] + +It is possible for clk_core_get to dereference a NULL in the following +sequence: + +clk_core_get() + of_clk_get_hw_from_clkspec() + __of_clk_get_hw_from_provider() + __clk_get_hw() + +__clk_get_hw() can return NULL which is dereferenced by clk_core_get() at +hw->core. + +Prior to commit dde4eff47c82 ("clk: Look for parents with clkdev based +clk_lookups") the check IS_ERR_OR_NULL() was performed which would have +caught the NULL. + +Reading the description of this function it talks about returning NULL but +that cannot be so at the moment. + +Update the function to check for hw before dereferencing it and return NULL +if hw is NULL. + +Fixes: dde4eff47c82 ("clk: Look for parents with clkdev based clk_lookups") +Signed-off-by: Bryan O'Donoghue +Link: https://lore.kernel.org/r/20240302-linux-next-24-03-01-simple-clock-fixes-v1-1-25f348a5982b@linaro.org +Signed-off-by: Stephen Boyd +Signed-off-by: Sasha Levin +--- + drivers/clk/clk.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c +index 661d456fb0adf..67051ca60920a 100644 +--- a/drivers/clk/clk.c ++++ b/drivers/clk/clk.c +@@ -425,6 +425,9 @@ static struct clk_core *clk_core_get(struct clk_core *core, u8 p_index) + if (IS_ERR(hw)) + return ERR_CAST(hw); + ++ if (!hw) ++ return NULL; ++ + return hw->core; + } + +-- +2.43.0 + diff --git a/queue-5.4/clk-hisilicon-hi3519-release-the-correct-number-of-g.patch b/queue-5.4/clk-hisilicon-hi3519-release-the-correct-number-of-g.patch new file mode 100644 index 00000000000..71e4e898191 --- /dev/null +++ b/queue-5.4/clk-hisilicon-hi3519-release-the-correct-number-of-g.patch @@ -0,0 +1,39 @@ +From 6f87df3184c702fe8a6c1264ec2f0a31e81b2354 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Jan 2024 19:58:21 +0100 +Subject: clk: hisilicon: hi3519: Release the correct number of gates in + hi3519_clk_unregister() + +From: Christophe JAILLET + +[ Upstream commit 74e39f526d95c0c119ada1874871ee328c59fbee ] + +The gates are stored in 'hi3519_gate_clks', not 'hi3519_mux_clks'. +This is also in line with how hisi_clk_register_gate() is called in the +probe. + +Fixes: 224b3b262c52 ("clk: hisilicon: hi3519: add driver remove path and fix some issues") +Signed-off-by: Christophe JAILLET +Link: https://lore.kernel.org/r/c3f1877c9a0886fa35c949c8f0ef25547f284f18.1704912510.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Stephen Boyd +Signed-off-by: Sasha Levin +--- + drivers/clk/hisilicon/clk-hi3519.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/clk/hisilicon/clk-hi3519.c b/drivers/clk/hisilicon/clk-hi3519.c +index ad0c7f350cf03..60d8a27a90824 100644 +--- a/drivers/clk/hisilicon/clk-hi3519.c ++++ b/drivers/clk/hisilicon/clk-hi3519.c +@@ -130,7 +130,7 @@ static void hi3519_clk_unregister(struct platform_device *pdev) + of_clk_del_provider(pdev->dev.of_node); + + hisi_clk_unregister_gate(hi3519_gate_clks, +- ARRAY_SIZE(hi3519_mux_clks), ++ ARRAY_SIZE(hi3519_gate_clks), + crg->clk_data); + hisi_clk_unregister_mux(hi3519_mux_clks, + ARRAY_SIZE(hi3519_mux_clks), +-- +2.43.0 + diff --git a/queue-5.4/clk-qcom-dispcc-sdm845-adjust-internal-gdsc-wait-tim.patch b/queue-5.4/clk-qcom-dispcc-sdm845-adjust-internal-gdsc-wait-tim.patch new file mode 100644 index 00000000000..851b0d0e3c2 --- /dev/null +++ b/queue-5.4/clk-qcom-dispcc-sdm845-adjust-internal-gdsc-wait-tim.patch @@ -0,0 +1,38 @@ +From 72009e4ad08865b2280edb4c77e7be8c8bfca478 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Jan 2024 21:20:18 +0100 +Subject: clk: qcom: dispcc-sdm845: Adjust internal GDSC wait times + +From: Konrad Dybcio + +[ Upstream commit 117e7dc697c2739d754db8fe0c1e2d4f1f5d5f82 ] + +SDM845 downstream uses non-default values for GDSC internal waits. +Program them accordingly to avoid surprises. + +Fixes: 81351776c9fb ("clk: qcom: Add display clock controller driver for SDM845") +Signed-off-by: Konrad Dybcio +Tested-by: Caleb Connolly # OnePlus 6 +Link: https://lore.kernel.org/r/20240103-topic-845gdsc-v1-1-368efbe1a61d@linaro.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/dispcc-sdm845.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/clk/qcom/dispcc-sdm845.c b/drivers/clk/qcom/dispcc-sdm845.c +index 0cc4909b5dbef..cb7a2d9247b04 100644 +--- a/drivers/clk/qcom/dispcc-sdm845.c ++++ b/drivers/clk/qcom/dispcc-sdm845.c +@@ -569,6 +569,8 @@ static struct clk_branch disp_cc_mdss_vsync_clk = { + + static struct gdsc mdss_gdsc = { + .gdscr = 0x3000, ++ .en_few_wait_val = 0x6, ++ .en_rest_wait_val = 0x5, + .pd = { + .name = "mdss_gdsc", + }, +-- +2.43.0 + diff --git a/queue-5.4/clk-qcom-reset-allow-specifying-custom-reset-delay.patch b/queue-5.4/clk-qcom-reset-allow-specifying-custom-reset-delay.patch new file mode 100644 index 00000000000..73e02604649 --- /dev/null +++ b/queue-5.4/clk-qcom-reset-allow-specifying-custom-reset-delay.patch @@ -0,0 +1,67 @@ +From a15aef6cb8d0f31c6f941b95768c8632de0f533b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 6 Jul 2022 15:41:29 +0200 +Subject: clk: qcom: reset: Allow specifying custom reset delay + +From: Stephan Gerhold + +[ Upstream commit 2cb8a39b6781ea23accd1fa93b3ad000d0948aec ] + +The amount of time required between asserting and deasserting the reset +signal can vary depending on the involved hardware component. Sometimes +1 us might not be enough and a larger delay is necessary to conform to +the specifications. + +Usually this is worked around in the consuming drivers, by replacing +reset_control_reset() with a sequence of reset_control_assert(), waiting +for a custom delay, followed by reset_control_deassert(). + +However, in some cases the driver making use of the reset is generic and +can be used with different reset controllers. In this case the reset +time requirement is better handled directly by the reset controller +driver. + +Make this possible by adding an "udelay" field to the qcom_reset_map +that allows setting a different reset delay (in microseconds). + +Signed-off-by: Stephan Gerhold +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220706134132.3623415-4-stephan.gerhold@kernkonzept.com +Stable-dep-of: 2f8cf2c3f3e3 ("clk: qcom: reset: Ensure write completion on reset de/assertion") +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/reset.c | 4 +++- + drivers/clk/qcom/reset.h | 1 + + 2 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/clk/qcom/reset.c b/drivers/clk/qcom/reset.c +index 819d194be8f7b..2a16adb572d2b 100644 +--- a/drivers/clk/qcom/reset.c ++++ b/drivers/clk/qcom/reset.c +@@ -13,8 +13,10 @@ + + static int qcom_reset(struct reset_controller_dev *rcdev, unsigned long id) + { ++ struct qcom_reset_controller *rst = to_qcom_reset_controller(rcdev); ++ + rcdev->ops->assert(rcdev, id); +- udelay(1); ++ udelay(rst->reset_map[id].udelay ?: 1); /* use 1 us as default */ + rcdev->ops->deassert(rcdev, id); + return 0; + } +diff --git a/drivers/clk/qcom/reset.h b/drivers/clk/qcom/reset.h +index 2a08b5e282c77..b8c113582072b 100644 +--- a/drivers/clk/qcom/reset.h ++++ b/drivers/clk/qcom/reset.h +@@ -11,6 +11,7 @@ + struct qcom_reset_map { + unsigned int reg; + u8 bit; ++ u8 udelay; + }; + + struct regmap; +-- +2.43.0 + diff --git a/queue-5.4/clk-qcom-reset-commonize-the-de-assert-functions.patch b/queue-5.4/clk-qcom-reset-commonize-the-de-assert-functions.patch new file mode 100644 index 00000000000..8600ac2685b --- /dev/null +++ b/queue-5.4/clk-qcom-reset-commonize-the-de-assert-functions.patch @@ -0,0 +1,69 @@ +From 63f8a1416c5469c069d37eccb6850f9125cdcfa9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 6 Feb 2024 19:43:35 +0100 +Subject: clk: qcom: reset: Commonize the de/assert functions + +From: Konrad Dybcio + +[ Upstream commit eda40d9c583e95e0b6ac69d2950eec10f802e0e8 ] + +They do the same thing, except the last argument of the last function +call differs. Commonize them. + +Reviewed-by: Bryan O'Donoghue +Signed-off-by: Konrad Dybcio +Link: https://lore.kernel.org/r/20240105-topic-venus_reset-v2-2-c37eba13b5ce@linaro.org +Signed-off-by: Bjorn Andersson +Stable-dep-of: 2f8cf2c3f3e3 ("clk: qcom: reset: Ensure write completion on reset de/assertion") +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/reset.c | 22 +++++++++------------- + 1 file changed, 9 insertions(+), 13 deletions(-) + +diff --git a/drivers/clk/qcom/reset.c b/drivers/clk/qcom/reset.c +index 0e914ec7aeae1..338b1210c8f87 100644 +--- a/drivers/clk/qcom/reset.c ++++ b/drivers/clk/qcom/reset.c +@@ -21,8 +21,8 @@ static int qcom_reset(struct reset_controller_dev *rcdev, unsigned long id) + return 0; + } + +-static int +-qcom_reset_assert(struct reset_controller_dev *rcdev, unsigned long id) ++static int qcom_reset_set_assert(struct reset_controller_dev *rcdev, ++ unsigned long id, bool assert) + { + struct qcom_reset_controller *rst; + const struct qcom_reset_map *map; +@@ -32,21 +32,17 @@ qcom_reset_assert(struct reset_controller_dev *rcdev, unsigned long id) + map = &rst->reset_map[id]; + mask = map->bitmask ? map->bitmask : BIT(map->bit); + +- return regmap_update_bits(rst->regmap, map->reg, mask, mask); ++ return regmap_update_bits(rst->regmap, map->reg, mask, assert ? mask : 0); + } + +-static int +-qcom_reset_deassert(struct reset_controller_dev *rcdev, unsigned long id) ++static int qcom_reset_assert(struct reset_controller_dev *rcdev, unsigned long id) + { +- struct qcom_reset_controller *rst; +- const struct qcom_reset_map *map; +- u32 mask; +- +- rst = to_qcom_reset_controller(rcdev); +- map = &rst->reset_map[id]; +- mask = map->bitmask ? map->bitmask : BIT(map->bit); ++ return qcom_reset_set_assert(rcdev, id, true); ++} + +- return regmap_update_bits(rst->regmap, map->reg, mask, 0); ++static int qcom_reset_deassert(struct reset_controller_dev *rcdev, unsigned long id) ++{ ++ return qcom_reset_set_assert(rcdev, id, false); + } + + const struct reset_control_ops qcom_reset_ops = { +-- +2.43.0 + diff --git a/queue-5.4/clk-qcom-reset-ensure-write-completion-on-reset-de-a.patch b/queue-5.4/clk-qcom-reset-ensure-write-completion-on-reset-de-a.patch new file mode 100644 index 00000000000..53e77ca9060 --- /dev/null +++ b/queue-5.4/clk-qcom-reset-ensure-write-completion-on-reset-de-a.patch @@ -0,0 +1,45 @@ +From d74d6e686a9b0c70f03691f1f60bf66b9d5601d6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 6 Feb 2024 19:43:36 +0100 +Subject: clk: qcom: reset: Ensure write completion on reset de/assertion + +From: Konrad Dybcio + +[ Upstream commit 2f8cf2c3f3e3f7ef61bd19abb4b0bb797ad50aaf ] + +Trying to toggle the resets in a rapid fashion can lead to the changes +not actually arriving at the clock controller block when we expect them +to. This was observed at least on SM8250. + +Read back the value after regmap_update_bits to ensure write completion. + +Fixes: b36ba30c8ac6 ("clk: qcom: Add reset controller support") +Signed-off-by: Konrad Dybcio +Link: https://lore.kernel.org/r/20240105-topic-venus_reset-v2-3-c37eba13b5ce@linaro.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/reset.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/drivers/clk/qcom/reset.c b/drivers/clk/qcom/reset.c +index 338b1210c8f87..5a44dc8bd25f2 100644 +--- a/drivers/clk/qcom/reset.c ++++ b/drivers/clk/qcom/reset.c +@@ -32,7 +32,12 @@ static int qcom_reset_set_assert(struct reset_controller_dev *rcdev, + map = &rst->reset_map[id]; + mask = map->bitmask ? map->bitmask : BIT(map->bit); + +- return regmap_update_bits(rst->regmap, map->reg, mask, assert ? mask : 0); ++ regmap_update_bits(rst->regmap, map->reg, mask, assert ? mask : 0); ++ ++ /* Read back the register to ensure write completion, ignore the value */ ++ regmap_read(rst->regmap, map->reg, &mask); ++ ++ return 0; + } + + static int qcom_reset_assert(struct reset_controller_dev *rcdev, unsigned long id) +-- +2.43.0 + diff --git a/queue-5.4/clk-qcom-reset-support-resetting-multiple-bits.patch b/queue-5.4/clk-qcom-reset-support-resetting-multiple-bits.patch new file mode 100644 index 00000000000..e6856429ca5 --- /dev/null +++ b/queue-5.4/clk-qcom-reset-support-resetting-multiple-bits.patch @@ -0,0 +1,72 @@ +From eac7e8836a0f6191ca2f5457eecb0fee750ea2d8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 7 Nov 2022 14:28:59 +0100 +Subject: clk: qcom: reset: support resetting multiple bits + +From: Robert Marko + +[ Upstream commit 4a5210893625f89723ea210d7c630b730abb37ad ] + +This patch adds the support for giving the complete bitmask +in reset structure and reset operation will use this bitmask +for all reset operations. + +Currently, reset structure only takes a single bit for each reset +and then calculates the bitmask by using the BIT() macro. + +However, this is not sufficient anymore for newer SoC-s like IPQ8074, +IPQ6018 and more, since their networking resets require multiple bits +to be asserted in order to properly reset the HW block completely. + +So, in order to allow asserting multiple bits add "bitmask" field to +qcom_reset_map, and then use that bitmask value if its populated in the +driver, if its not populated, then we just default to existing behaviour +and calculate the bitmask on the fly. + +Signed-off-by: Robert Marko +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20221107132901.489240-1-robimarko@gmail.com +Stable-dep-of: 2f8cf2c3f3e3 ("clk: qcom: reset: Ensure write completion on reset de/assertion") +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/reset.c | 4 ++-- + drivers/clk/qcom/reset.h | 1 + + 2 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/clk/qcom/reset.c b/drivers/clk/qcom/reset.c +index 2a16adb572d2b..0e914ec7aeae1 100644 +--- a/drivers/clk/qcom/reset.c ++++ b/drivers/clk/qcom/reset.c +@@ -30,7 +30,7 @@ qcom_reset_assert(struct reset_controller_dev *rcdev, unsigned long id) + + rst = to_qcom_reset_controller(rcdev); + map = &rst->reset_map[id]; +- mask = BIT(map->bit); ++ mask = map->bitmask ? map->bitmask : BIT(map->bit); + + return regmap_update_bits(rst->regmap, map->reg, mask, mask); + } +@@ -44,7 +44,7 @@ qcom_reset_deassert(struct reset_controller_dev *rcdev, unsigned long id) + + rst = to_qcom_reset_controller(rcdev); + map = &rst->reset_map[id]; +- mask = BIT(map->bit); ++ mask = map->bitmask ? map->bitmask : BIT(map->bit); + + return regmap_update_bits(rst->regmap, map->reg, mask, 0); + } +diff --git a/drivers/clk/qcom/reset.h b/drivers/clk/qcom/reset.h +index b8c113582072b..9a47c838d9b1b 100644 +--- a/drivers/clk/qcom/reset.h ++++ b/drivers/clk/qcom/reset.h +@@ -12,6 +12,7 @@ struct qcom_reset_map { + unsigned int reg; + u8 bit; + u8 udelay; ++ u32 bitmask; + }; + + struct regmap; +-- +2.43.0 + diff --git a/queue-5.4/cpufreq-brcmstb-avs-cpufreq-add-check-for-cpufreq_cp.patch b/queue-5.4/cpufreq-brcmstb-avs-cpufreq-add-check-for-cpufreq_cp.patch new file mode 100644 index 00000000000..790e0f78669 --- /dev/null +++ b/queue-5.4/cpufreq-brcmstb-avs-cpufreq-add-check-for-cpufreq_cp.patch @@ -0,0 +1,39 @@ +From bf5d74f51a2359a40fe8629cd1659f7a2ad9a9ad Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Jan 2024 10:12:20 +0300 +Subject: cpufreq: brcmstb-avs-cpufreq: add check for cpufreq_cpu_get's return + value + +From: Anastasia Belova + +[ Upstream commit f661017e6d326ee187db24194cabb013d81bc2a6 ] + +cpufreq_cpu_get may return NULL. To avoid NULL-dereference check it +and return 0 in case of error. + +Found by Linux Verification Center (linuxtesting.org) with SVACE. + +Fixes: de322e085995 ("cpufreq: brcmstb-avs-cpufreq: AVS CPUfreq driver for Broadcom STB SoCs") +Signed-off-by: Anastasia Belova +Signed-off-by: Viresh Kumar +Signed-off-by: Sasha Levin +--- + drivers/cpufreq/brcmstb-avs-cpufreq.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/cpufreq/brcmstb-avs-cpufreq.c b/drivers/cpufreq/brcmstb-avs-cpufreq.c +index 541486217984b..1302e1900dcb1 100644 +--- a/drivers/cpufreq/brcmstb-avs-cpufreq.c ++++ b/drivers/cpufreq/brcmstb-avs-cpufreq.c +@@ -457,6 +457,8 @@ static bool brcm_avs_is_firmware_loaded(struct private_data *priv) + static unsigned int brcm_avs_cpufreq_get(unsigned int cpu) + { + struct cpufreq_policy *policy = cpufreq_cpu_get(cpu); ++ if (!policy) ++ return 0; + struct private_data *priv = policy->driver_data; + + return brcm_avs_get_frequency(priv->base); +-- +2.43.0 + diff --git a/queue-5.4/crypto-arm-sha-fix-function-cast-warnings.patch b/queue-5.4/crypto-arm-sha-fix-function-cast-warnings.patch new file mode 100644 index 00000000000..db184cb000e --- /dev/null +++ b/queue-5.4/crypto-arm-sha-fix-function-cast-warnings.patch @@ -0,0 +1,115 @@ +From 03df4d2678f08070a7ce6a81ce2e7ab1162d27ea Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 13 Feb 2024 14:49:46 +0100 +Subject: crypto: arm/sha - fix function cast warnings + +From: Arnd Bergmann + +[ Upstream commit 53cc9baeb9bc2a187eb9c9790d30995148852b12 ] + +clang-16 warns about casting between incompatible function types: + +arch/arm/crypto/sha256_glue.c:37:5: error: cast from 'void (*)(u32 *, const void *, unsigned int)' (aka 'void (*)(unsigned int *, const void *, unsigned int)') to 'sha256_block_fn *' (aka 'void (*)(struct sha256_state *, const unsigned char *, int)') converts to incompatible function type [-Werror,-Wcast-function-type-strict] + 37 | (sha256_block_fn *)sha256_block_data_order); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +arch/arm/crypto/sha512-glue.c:34:3: error: cast from 'void (*)(u64 *, const u8 *, int)' (aka 'void (*)(unsigned long long *, const unsigned char *, int)') to 'sha512_block_fn *' (aka 'void (*)(struct sha512_state *, const unsigned char *, int)') converts to incompatible function type [-Werror,-Wcast-function-type-strict] + 34 | (sha512_block_fn *)sha512_block_data_order); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Fix the prototypes for the assembler functions to match the typedef. +The code already relies on the digest being the first part of the +state structure, so there is no change in behavior. + +Fixes: c80ae7ca3726 ("crypto: arm/sha512 - accelerated SHA-512 using ARM generic ASM and NEON") +Fixes: b59e2ae3690c ("crypto: arm/sha256 - move SHA-224/256 ASM/NEON implementation to base layer") +Signed-off-by: Arnd Bergmann +Reviewed-by: Ard Biesheuvel +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + arch/arm/crypto/sha256_glue.c | 13 +++++-------- + arch/arm/crypto/sha512-glue.c | 12 +++++------- + 2 files changed, 10 insertions(+), 15 deletions(-) + +diff --git a/arch/arm/crypto/sha256_glue.c b/arch/arm/crypto/sha256_glue.c +index 215497f011f23..cb3be0c15a044 100644 +--- a/arch/arm/crypto/sha256_glue.c ++++ b/arch/arm/crypto/sha256_glue.c +@@ -25,8 +25,8 @@ + + #include "sha256_glue.h" + +-asmlinkage void sha256_block_data_order(u32 *digest, const void *data, +- unsigned int num_blks); ++asmlinkage void sha256_block_data_order(struct sha256_state *state, ++ const u8 *data, int num_blks); + + int crypto_sha256_arm_update(struct shash_desc *desc, const u8 *data, + unsigned int len) +@@ -34,23 +34,20 @@ int crypto_sha256_arm_update(struct shash_desc *desc, const u8 *data, + /* make sure casting to sha256_block_fn() is safe */ + BUILD_BUG_ON(offsetof(struct sha256_state, state) != 0); + +- return sha256_base_do_update(desc, data, len, +- (sha256_block_fn *)sha256_block_data_order); ++ return sha256_base_do_update(desc, data, len, sha256_block_data_order); + } + EXPORT_SYMBOL(crypto_sha256_arm_update); + + static int crypto_sha256_arm_final(struct shash_desc *desc, u8 *out) + { +- sha256_base_do_finalize(desc, +- (sha256_block_fn *)sha256_block_data_order); ++ sha256_base_do_finalize(desc, sha256_block_data_order); + return sha256_base_finish(desc, out); + } + + int crypto_sha256_arm_finup(struct shash_desc *desc, const u8 *data, + unsigned int len, u8 *out) + { +- sha256_base_do_update(desc, data, len, +- (sha256_block_fn *)sha256_block_data_order); ++ sha256_base_do_update(desc, data, len, sha256_block_data_order); + return crypto_sha256_arm_final(desc, out); + } + EXPORT_SYMBOL(crypto_sha256_arm_finup); +diff --git a/arch/arm/crypto/sha512-glue.c b/arch/arm/crypto/sha512-glue.c +index 8775aa42bbbe8..1a16b98ec1085 100644 +--- a/arch/arm/crypto/sha512-glue.c ++++ b/arch/arm/crypto/sha512-glue.c +@@ -25,27 +25,25 @@ MODULE_ALIAS_CRYPTO("sha512"); + MODULE_ALIAS_CRYPTO("sha384-arm"); + MODULE_ALIAS_CRYPTO("sha512-arm"); + +-asmlinkage void sha512_block_data_order(u64 *state, u8 const *src, int blocks); ++asmlinkage void sha512_block_data_order(struct sha512_state *state, ++ u8 const *src, int blocks); + + int sha512_arm_update(struct shash_desc *desc, const u8 *data, + unsigned int len) + { +- return sha512_base_do_update(desc, data, len, +- (sha512_block_fn *)sha512_block_data_order); ++ return sha512_base_do_update(desc, data, len, sha512_block_data_order); + } + + static int sha512_arm_final(struct shash_desc *desc, u8 *out) + { +- sha512_base_do_finalize(desc, +- (sha512_block_fn *)sha512_block_data_order); ++ sha512_base_do_finalize(desc, sha512_block_data_order); + return sha512_base_finish(desc, out); + } + + int sha512_arm_finup(struct shash_desc *desc, const u8 *data, + unsigned int len, u8 *out) + { +- sha512_base_do_update(desc, data, len, +- (sha512_block_fn *)sha512_block_data_order); ++ sha512_base_do_update(desc, data, len, sha512_block_data_order); + return sha512_arm_final(desc, out); + } + +-- +2.43.0 + diff --git a/queue-5.4/dm-call-the-resume-method-on-internal-suspend.patch b/queue-5.4/dm-call-the-resume-method-on-internal-suspend.patch new file mode 100644 index 00000000000..5e8d61e796d --- /dev/null +++ b/queue-5.4/dm-call-the-resume-method-on-internal-suspend.patch @@ -0,0 +1,123 @@ +From d673c3945aeaf2abcd1fc22393093a656ec89ba2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Mar 2024 15:06:39 +0100 +Subject: dm: call the resume method on internal suspend + +From: Mikulas Patocka + +[ Upstream commit 65e8fbde64520001abf1c8d0e573561b4746ef38 ] + +There is this reported crash when experimenting with the lvm2 testsuite. +The list corruption is caused by the fact that the postsuspend and resume +methods were not paired correctly; there were two consecutive calls to the +origin_postsuspend function. The second call attempts to remove the +"hash_list" entry from a list, while it was already removed by the first +call. + +Fix __dm_internal_resume so that it calls the preresume and resume +methods of the table's targets. + +If a preresume method of some target fails, we are in a tricky situation. +We can't return an error because dm_internal_resume isn't supposed to +return errors. We can't return success, because then the "resume" and +"postsuspend" methods would not be paired correctly. So, we set the +DMF_SUSPENDED flag and we fake normal suspend - it may confuse userspace +tools, but it won't cause a kernel crash. + +------------[ cut here ]------------ +kernel BUG at lib/list_debug.c:56! +invalid opcode: 0000 [#1] PREEMPT SMP +CPU: 1 PID: 8343 Comm: dmsetup Not tainted 6.8.0-rc6 #4 +Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014 +RIP: 0010:__list_del_entry_valid_or_report+0x77/0xc0 + +RSP: 0018:ffff8881b831bcc0 EFLAGS: 00010282 +RAX: 000000000000004e RBX: ffff888143b6eb80 RCX: 0000000000000000 +RDX: 0000000000000001 RSI: ffffffff819053d0 RDI: 00000000ffffffff +RBP: ffff8881b83a3400 R08: 00000000fffeffff R09: 0000000000000058 +R10: 0000000000000000 R11: ffffffff81a24080 R12: 0000000000000001 +R13: ffff88814538e000 R14: ffff888143bc6dc0 R15: ffffffffa02e4bb0 +FS: 00000000f7c0f780(0000) GS:ffff8893f0a40000(0000) knlGS:0000000000000000 +CS: 0010 DS: 002b ES: 002b CR0: 0000000080050033 +CR2: 0000000057fb5000 CR3: 0000000143474000 CR4: 00000000000006b0 +Call Trace: + + ? die+0x2d/0x80 + ? do_trap+0xeb/0xf0 + ? __list_del_entry_valid_or_report+0x77/0xc0 + ? do_error_trap+0x60/0x80 + ? __list_del_entry_valid_or_report+0x77/0xc0 + ? exc_invalid_op+0x49/0x60 + ? __list_del_entry_valid_or_report+0x77/0xc0 + ? asm_exc_invalid_op+0x16/0x20 + ? table_deps+0x1b0/0x1b0 [dm_mod] + ? __list_del_entry_valid_or_report+0x77/0xc0 + origin_postsuspend+0x1a/0x50 [dm_snapshot] + dm_table_postsuspend_targets+0x34/0x50 [dm_mod] + dm_suspend+0xd8/0xf0 [dm_mod] + dev_suspend+0x1f2/0x2f0 [dm_mod] + ? table_deps+0x1b0/0x1b0 [dm_mod] + ctl_ioctl+0x300/0x5f0 [dm_mod] + dm_compat_ctl_ioctl+0x7/0x10 [dm_mod] + __x64_compat_sys_ioctl+0x104/0x170 + do_syscall_64+0x184/0x1b0 + entry_SYSCALL_64_after_hwframe+0x46/0x4e +RIP: 0033:0xf7e6aead + +---[ end trace 0000000000000000 ]--- + +Fixes: ffcc39364160 ("dm: enhance internal suspend and resume interface") +Signed-off-by: Mikulas Patocka +Signed-off-by: Mike Snitzer +Signed-off-by: Sasha Levin +--- + drivers/md/dm.c | 26 ++++++++++++++++++++------ + 1 file changed, 20 insertions(+), 6 deletions(-) + +diff --git a/drivers/md/dm.c b/drivers/md/dm.c +index 771167ee552cd..a7724ba45b437 100644 +--- a/drivers/md/dm.c ++++ b/drivers/md/dm.c +@@ -2809,6 +2809,9 @@ static void __dm_internal_suspend(struct mapped_device *md, unsigned suspend_fla + + static void __dm_internal_resume(struct mapped_device *md) + { ++ int r; ++ struct dm_table *map; ++ + BUG_ON(!md->internal_suspend_count); + + if (--md->internal_suspend_count) +@@ -2817,12 +2820,23 @@ static void __dm_internal_resume(struct mapped_device *md) + if (dm_suspended_md(md)) + goto done; /* resume from nested suspend */ + +- /* +- * NOTE: existing callers don't need to call dm_table_resume_targets +- * (which may fail -- so best to avoid it for now by passing NULL map) +- */ +- (void) __dm_resume(md, NULL); +- ++ map = rcu_dereference_protected(md->map, lockdep_is_held(&md->suspend_lock)); ++ r = __dm_resume(md, map); ++ if (r) { ++ /* ++ * If a preresume method of some target failed, we are in a ++ * tricky situation. We can't return an error to the caller. We ++ * can't fake success because then the "resume" and ++ * "postsuspend" methods would not be paired correctly, and it ++ * would break various targets, for example it would cause list ++ * corruption in the "origin" target. ++ * ++ * So, we fake normal suspend here, to make sure that the ++ * "resume" and "postsuspend" methods will be paired correctly. ++ */ ++ DMERR("Preresume method failed: %d", r); ++ set_bit(DMF_SUSPENDED, &md->flags); ++ } + done: + clear_bit(DMF_SUSPENDED_INTERNALLY, &md->flags); + smp_mb__after_atomic(); +-- +2.43.0 + diff --git a/queue-5.4/dm-raid-fix-false-positive-for-requeue-needed-during.patch b/queue-5.4/dm-raid-fix-false-positive-for-requeue-needed-during.patch new file mode 100644 index 00000000000..bfae8a6f9ce --- /dev/null +++ b/queue-5.4/dm-raid-fix-false-positive-for-requeue-needed-during.patch @@ -0,0 +1,46 @@ +From ef59ad0df33929e92c7886a2064beb24b132cfa3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Mar 2024 13:42:55 -0400 +Subject: dm raid: fix false positive for requeue needed during reshape + +From: Ming Lei + +[ Upstream commit b25b8f4b8ecef0f48c05f0c3572daeabefe16526 ] + +An empty flush doesn't have a payload, so it should never be looked at +when considering to possibly requeue a bio for the case when a reshape +is in progress. + +Fixes: 9dbd1aa3a81c ("dm raid: add reshaping support to the target") +Reported-by: Patrick Plenefisch +Signed-off-by: Ming Lei +Signed-off-by: Mike Snitzer +Signed-off-by: Sasha Levin +--- + drivers/md/dm-raid.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c +index 9f05ae2b90191..1ccd765fad938 100644 +--- a/drivers/md/dm-raid.c ++++ b/drivers/md/dm-raid.c +@@ -3343,14 +3343,14 @@ static int raid_map(struct dm_target *ti, struct bio *bio) + struct mddev *mddev = &rs->md; + + /* +- * If we're reshaping to add disk(s)), ti->len and ++ * If we're reshaping to add disk(s), ti->len and + * mddev->array_sectors will differ during the process + * (ti->len > mddev->array_sectors), so we have to requeue + * bios with addresses > mddev->array_sectors here or + * there will occur accesses past EOD of the component + * data images thus erroring the raid set. + */ +- if (unlikely(bio_end_sector(bio) > mddev->array_sectors)) ++ if (unlikely(bio_has_data(bio) && bio_end_sector(bio) > mddev->array_sectors)) + return DM_MAPIO_REQUEUE; + + md_handle_request(mddev, bio); +-- +2.43.0 + diff --git a/queue-5.4/dmaengine-tegra210-adma-update-dependency-to-arch_te.patch b/queue-5.4/dmaengine-tegra210-adma-update-dependency-to-arch_te.patch new file mode 100644 index 00000000000..2877ea503b0 --- /dev/null +++ b/queue-5.4/dmaengine-tegra210-adma-update-dependency-to-arch_te.patch @@ -0,0 +1,60 @@ +From d956a61059b4be059cd99018ee132f513f079927 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Jan 2024 09:32:56 +0000 +Subject: dmaengine: tegra210-adma: Update dependency to ARCH_TEGRA + +From: Peter Robinson + +[ Upstream commit 33b7db45533af240fe44e809f9dc4d604cf82d07 ] + +Update the architecture dependency to be the generic Tegra +because the driver works on the four latest Tegra generations +not just T210, if you build a kernel with a specific +ARCH_TEGRA_xxx_SOC option that excludes 210 you don't get +this driver. + +Fixes: 433de642a76c9 ("dmaengine: tegra210-adma: add support for Tegra186/Tegra194") +Signed-off-by: Peter Robinson +Cc: Jon Hunter +Cc: Thierry Reding +Cc: Sameer Pujar +Cc: Laxman Dewangan +Reviewed-by: Jon Hunter +Link: https://lore.kernel.org/r/20240112093310.329642-2-pbrobinson@gmail.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/dma/Kconfig | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig +index 66aad9dbd58c5..a7c156ce2c298 100644 +--- a/drivers/dma/Kconfig ++++ b/drivers/dma/Kconfig +@@ -582,16 +582,16 @@ config TEGRA20_APB_DMA + + config TEGRA210_ADMA + tristate "NVIDIA Tegra210 ADMA support" +- depends on (ARCH_TEGRA_210_SOC || COMPILE_TEST) ++ depends on (ARCH_TEGRA || COMPILE_TEST) + select DMA_ENGINE + select DMA_VIRTUAL_CHANNELS + help +- Support for the NVIDIA Tegra210 ADMA controller driver. The +- DMA controller has multiple DMA channels and is used to service +- various audio clients in the Tegra210 audio processing engine +- (APE). This DMA controller transfers data from memory to +- peripheral and vice versa. It does not support memory to +- memory data transfer. ++ Support for the NVIDIA Tegra210/Tegra186/Tegra194/Tegra234 ADMA ++ controller driver. The DMA controller has multiple DMA channels ++ and is used to service various audio clients in the Tegra210 ++ audio processing engine (APE). This DMA controller transfers ++ data from memory to peripheral and vice versa. It does not ++ support memory to memory data transfer. + + config TIMB_DMA + tristate "Timberdale FPGA DMA support" +-- +2.43.0 + diff --git a/queue-5.4/do_sys_name_to_handle-use-kzalloc-to-fix-kernel-info.patch b/queue-5.4/do_sys_name_to_handle-use-kzalloc-to-fix-kernel-info.patch new file mode 100644 index 00000000000..acaaec89877 --- /dev/null +++ b/queue-5.4/do_sys_name_to_handle-use-kzalloc-to-fix-kernel-info.patch @@ -0,0 +1,72 @@ +From b7a9367f2769c7be9b1daa4918475df8d2c75936 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 19 Jan 2024 07:39:06 -0800 +Subject: do_sys_name_to_handle(): use kzalloc() to fix kernel-infoleak + +From: Nikita Zhandarovich + +[ Upstream commit 3948abaa4e2be938ccdfc289385a27342fb13d43 ] + +syzbot identified a kernel information leak vulnerability in +do_sys_name_to_handle() and issued the following report [1]. + +[1] +"BUG: KMSAN: kernel-infoleak in instrument_copy_to_user include/linux/instrumented.h:114 [inline] +BUG: KMSAN: kernel-infoleak in _copy_to_user+0xbc/0x100 lib/usercopy.c:40 + instrument_copy_to_user include/linux/instrumented.h:114 [inline] + _copy_to_user+0xbc/0x100 lib/usercopy.c:40 + copy_to_user include/linux/uaccess.h:191 [inline] + do_sys_name_to_handle fs/fhandle.c:73 [inline] + __do_sys_name_to_handle_at fs/fhandle.c:112 [inline] + __se_sys_name_to_handle_at+0x949/0xb10 fs/fhandle.c:94 + __x64_sys_name_to_handle_at+0xe4/0x140 fs/fhandle.c:94 + ... + +Uninit was created at: + slab_post_alloc_hook+0x129/0xa70 mm/slab.h:768 + slab_alloc_node mm/slub.c:3478 [inline] + __kmem_cache_alloc_node+0x5c9/0x970 mm/slub.c:3517 + __do_kmalloc_node mm/slab_common.c:1006 [inline] + __kmalloc+0x121/0x3c0 mm/slab_common.c:1020 + kmalloc include/linux/slab.h:604 [inline] + do_sys_name_to_handle fs/fhandle.c:39 [inline] + __do_sys_name_to_handle_at fs/fhandle.c:112 [inline] + __se_sys_name_to_handle_at+0x441/0xb10 fs/fhandle.c:94 + __x64_sys_name_to_handle_at+0xe4/0x140 fs/fhandle.c:94 + ... + +Bytes 18-19 of 20 are uninitialized +Memory access of size 20 starts at ffff888128a46380 +Data copied to user address 0000000020000240" + +Per Chuck Lever's suggestion, use kzalloc() instead of kmalloc() to +solve the problem. + +Fixes: 990d6c2d7aee ("vfs: Add name to file handle conversion support") +Suggested-by: Chuck Lever III +Reported-and-tested-by: +Signed-off-by: Nikita Zhandarovich +Link: https://lore.kernel.org/r/20240119153906.4367-1-n.zhandarovich@fintech.ru +Reviewed-by: Jan Kara +Signed-off-by: Christian Brauner +Signed-off-by: Sasha Levin +--- + fs/fhandle.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/fs/fhandle.c b/fs/fhandle.c +index 01263ffbc4c08..9a5f153c8919e 100644 +--- a/fs/fhandle.c ++++ b/fs/fhandle.c +@@ -37,7 +37,7 @@ static long do_sys_name_to_handle(struct path *path, + if (f_handle.handle_bytes > MAX_HANDLE_SZ) + return -EINVAL; + +- handle = kmalloc(sizeof(struct file_handle) + f_handle.handle_bytes, ++ handle = kzalloc(sizeof(struct file_handle) + f_handle.handle_bytes, + GFP_KERNEL); + if (!handle) + return -ENOMEM; +-- +2.43.0 + diff --git a/queue-5.4/drm-amd-display-fix-potential-null-pointer-dereferen.patch b/queue-5.4/drm-amd-display-fix-potential-null-pointer-dereferen.patch new file mode 100644 index 00000000000..58a521fa8ba --- /dev/null +++ b/queue-5.4/drm-amd-display-fix-potential-null-pointer-dereferen.patch @@ -0,0 +1,57 @@ +From 7f9162a14b21ec0b9b1a9d444db276499143d48b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 25 Jan 2024 21:16:04 +0530 +Subject: drm/amd/display: Fix potential NULL pointer dereferences in + 'dcn10_set_output_transfer_func()' + +From: Srinivasan Shanmugam + +[ Upstream commit 9ccfe80d022df7c595f1925afb31de2232900656 ] + +The 'stream' pointer is used in dcn10_set_output_transfer_func() before +the check if 'stream' is NULL. + +Fixes the below: +drivers/gpu/drm/amd/amdgpu/../display/dc/hwss/dcn10/dcn10_hwseq.c:1892 dcn10_set_output_transfer_func() warn: variable dereferenced before check 'stream' (see line 1875) + +Fixes: ddef02de0d71 ("drm/amd/display: add null checks before logging") +Cc: Wyatt Wood +Cc: Anthony Koo +Cc: Rodrigo Siqueira +Cc: Aurabindo Pillai +Signed-off-by: Srinivasan Shanmugam +Reviewed-by: Anthony Koo +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +index c4c99bc7f2890..3059739695d8c 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +@@ -1470,6 +1470,9 @@ dcn10_set_output_transfer_func(struct pipe_ctx *pipe_ctx, + { + struct dpp *dpp = pipe_ctx->plane_res.dpp; + ++ if (!stream) ++ return false; ++ + if (dpp == NULL) + return false; + +@@ -1492,8 +1495,8 @@ dcn10_set_output_transfer_func(struct pipe_ctx *pipe_ctx, + } else + dpp->funcs->dpp_program_regamma_pwl(dpp, NULL, OPP_REGAMMA_BYPASS); + +- if (stream != NULL && stream->ctx != NULL && +- stream->out_transfer_func != NULL) { ++ if (stream->ctx && ++ stream->out_transfer_func) { + log_tf(stream->ctx, + stream->out_transfer_func, + dpp->regamma_params.hw_points_num); +-- +2.43.0 + diff --git a/queue-5.4/drm-amdgpu-fix-missing-break-in-atom_arg_imm-case-of.patch b/queue-5.4/drm-amdgpu-fix-missing-break-in-atom_arg_imm-case-of.patch new file mode 100644 index 00000000000..6eaad098419 --- /dev/null +++ b/queue-5.4/drm-amdgpu-fix-missing-break-in-atom_arg_imm-case-of.patch @@ -0,0 +1,48 @@ +From b936080134a53d088fb5102b833be15079d26e89 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 24 Feb 2024 07:48:52 +0530 +Subject: drm/amdgpu: Fix missing break in ATOM_ARG_IMM Case of + atom_get_src_int() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Srinivasan Shanmugam + +[ Upstream commit 7cf1ad2fe10634238b38442a851d89514cb14ea2 ] + +Missing break statement in the ATOM_ARG_IMM case of a switch statement, +adds the missing break statement, ensuring that the program's control +flow is as intended. + +Fixes the below: +drivers/gpu/drm/amd/amdgpu/atom.c:323 atom_get_src_int() warn: ignoring unreachable code. + +Fixes: d38ceaf99ed0 ("drm/amdgpu: add core driver (v4)") +Cc: Jammy Zhou +Cc: Christian König +Cc: Alex Deucher +Signed-off-by: Srinivasan Shanmugam +Reviewed-by: Alex Deucher +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/amdgpu/atom.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/atom.c b/drivers/gpu/drm/amd/amdgpu/atom.c +index cae426c7c0863..e1503b52519a0 100644 +--- a/drivers/gpu/drm/amd/amdgpu/atom.c ++++ b/drivers/gpu/drm/amd/amdgpu/atom.c +@@ -308,7 +308,7 @@ static uint32_t atom_get_src_int(atom_exec_context *ctx, uint8_t attr, + DEBUG("IMM 0x%02X\n", val); + return val; + } +- return 0; ++ break; + case ATOM_ARG_PLL: + idx = U8(*ptr); + (*ptr)++; +-- +2.43.0 + diff --git a/queue-5.4/drm-don-t-treat-0-as-1-in-drm_fixp2int_ceil.patch b/queue-5.4/drm-don-t-treat-0-as-1-in-drm_fixp2int_ceil.patch new file mode 100644 index 00000000000..8797a8ddd1f --- /dev/null +++ b/queue-5.4/drm-don-t-treat-0-as-1-in-drm_fixp2int_ceil.patch @@ -0,0 +1,41 @@ +From 5881c2b1095e0b94f57324555145fcd6904998ce Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Nov 2023 11:36:20 -0500 +Subject: drm: Don't treat 0 as -1 in drm_fixp2int_ceil + +From: Harry Wentland + +[ Upstream commit cf8837d7204481026335461629b84ac7f4538fa5 ] + +Unit testing this in VKMS shows that passing 0 into +this function returns -1, which is highly counter- +intuitive. Fix it by checking whether the input is +>= 0 instead of > 0. + +Fixes: 64566b5e767f ("drm: Add drm_fixp_from_fraction and drm_fixp2int_ceil") +Signed-off-by: Harry Wentland +Reviewed-by: Simon Ser +Reviewed-by: Melissa Wen +Signed-off-by: Melissa Wen +Link: https://patchwork.freedesktop.org/patch/msgid/20231108163647.106853-2-harry.wentland@amd.com +Signed-off-by: Sasha Levin +--- + include/drm/drm_fixed.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/include/drm/drm_fixed.h b/include/drm/drm_fixed.h +index 553210c02ee0f..627efa56e59fb 100644 +--- a/include/drm/drm_fixed.h ++++ b/include/drm/drm_fixed.h +@@ -88,7 +88,7 @@ static inline int drm_fixp2int(s64 a) + + static inline int drm_fixp2int_ceil(s64 a) + { +- if (a > 0) ++ if (a >= 0) + return drm_fixp2int(a + DRM_FIXED_ALMOST_ONE); + else + return drm_fixp2int(a - DRM_FIXED_ALMOST_ONE); +-- +2.43.0 + diff --git a/queue-5.4/drm-mediatek-dsi-fix-dsi-rgb666-formats-and-definiti.patch b/queue-5.4/drm-mediatek-dsi-fix-dsi-rgb666-formats-and-definiti.patch new file mode 100644 index 00000000000..354a2a42d06 --- /dev/null +++ b/queue-5.4/drm-mediatek-dsi-fix-dsi-rgb666-formats-and-definiti.patch @@ -0,0 +1,78 @@ +From 58123137a0c40141febe4e91e6d14f1a38b4c0df Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 15 Feb 2024 09:53:09 +0100 +Subject: drm/mediatek: dsi: Fix DSI RGB666 formats and definitions + +From: AngeloGioacchino Del Regno + +[ Upstream commit fae6f815505301b92d9113764f4d76d0bfe45607 ] + +The register bits definitions for RGB666 formats are wrong in multiple +ways: first, in the DSI_PS_SEL bits region, the Packed 18-bits RGB666 +format is selected with bit 1, while the Loosely Packed one is bit 2, +and second - the definition name "LOOSELY_PS_18BIT_RGB666" is wrong +because the loosely packed format is 24 bits instead! + +Either way, functions mtk_dsi_ps_control_vact() and mtk_dsi_ps_control() +do not even agree on the DSI_PS_SEL bit to set in DSI_PSCTRL: one sets +loosely packed (24) on RGB666, the other sets packed (18), and the other +way around for RGB666_PACKED. + +Fixing this entire stack of issues is done in one go: + - Use the correct bit for the Loosely Packed RGB666 definition + - Rename LOOSELY_PS_18BIT_RGB666 to LOOSELY_PS_24BIT_RGB666 + - Change ps_bpp_mode in mtk_dsi_ps_control_vact() to set: + - Loosely Packed, 24-bits for MIPI_DSI_FMT_RGB666 + - Packed, 18-bits for MIPI_DSI_FMT_RGB666_PACKED + +Fixes: 2e54c14e310f ("drm/mediatek: Add DSI sub driver") +Reviewed-by: Alexandre Mergnat +Reviewed-by: CK Hu +Signed-off-by: AngeloGioacchino Del Regno +Link: https://patchwork.kernel.org/project/dri-devel/patch/20240215085316.56835-3-angelogioacchino.delregno@collabora.com/ +Signed-off-by: Chun-Kuang Hu +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/mediatek/mtk_dsi.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c +index e82705a33acfd..9af900076dee4 100644 +--- a/drivers/gpu/drm/mediatek/mtk_dsi.c ++++ b/drivers/gpu/drm/mediatek/mtk_dsi.c +@@ -64,8 +64,8 @@ + #define DSI_PS_WC 0x3fff + #define DSI_PS_SEL (3 << 16) + #define PACKED_PS_16BIT_RGB565 (0 << 16) +-#define LOOSELY_PS_18BIT_RGB666 (1 << 16) +-#define PACKED_PS_18BIT_RGB666 (2 << 16) ++#define PACKED_PS_18BIT_RGB666 (1 << 16) ++#define LOOSELY_PS_24BIT_RGB666 (2 << 16) + #define PACKED_PS_24BIT_RGB888 (3 << 16) + + #define DSI_VSA_NL 0x20 +@@ -321,10 +321,10 @@ static void mtk_dsi_ps_control_vact(struct mtk_dsi *dsi) + ps_bpp_mode |= PACKED_PS_24BIT_RGB888; + break; + case MIPI_DSI_FMT_RGB666: +- ps_bpp_mode |= PACKED_PS_18BIT_RGB666; ++ ps_bpp_mode |= LOOSELY_PS_24BIT_RGB666; + break; + case MIPI_DSI_FMT_RGB666_PACKED: +- ps_bpp_mode |= LOOSELY_PS_18BIT_RGB666; ++ ps_bpp_mode |= PACKED_PS_18BIT_RGB666; + break; + case MIPI_DSI_FMT_RGB565: + ps_bpp_mode |= PACKED_PS_16BIT_RGB565; +@@ -375,7 +375,7 @@ static void mtk_dsi_ps_control(struct mtk_dsi *dsi) + dsi_tmp_buf_bpp = 3; + break; + case MIPI_DSI_FMT_RGB666: +- tmp_reg = LOOSELY_PS_18BIT_RGB666; ++ tmp_reg = LOOSELY_PS_24BIT_RGB666; + dsi_tmp_buf_bpp = 3; + break; + case MIPI_DSI_FMT_RGB666_PACKED: +-- +2.43.0 + diff --git a/queue-5.4/drm-mediatek-fix-a-null-pointer-crash-in-mtk_drm_crt.patch b/queue-5.4/drm-mediatek-fix-a-null-pointer-crash-in-mtk_drm_crt.patch new file mode 100644 index 00000000000..acb0c73d522 --- /dev/null +++ b/queue-5.4/drm-mediatek-fix-a-null-pointer-crash-in-mtk_drm_crt.patch @@ -0,0 +1,81 @@ +From 488d44b1fd4d05b32a1029a9f6e38b2c54629641 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 23 Feb 2024 13:23:29 -0800 +Subject: drm/mediatek: Fix a null pointer crash in + mtk_drm_crtc_finish_page_flip + +From: Hsin-Yi Wang + +[ Upstream commit c958e86e9cc1b48cac004a6e245154dfba8e163b ] + +It's possible that mtk_crtc->event is NULL in +mtk_drm_crtc_finish_page_flip(). + +pending_needs_vblank value is set by mtk_crtc->event, but in +mtk_drm_crtc_atomic_flush(), it's is not guarded by the same +lock in mtk_drm_finish_page_flip(), thus a race condition happens. + +Consider the following case: + +CPU1 CPU2 +step 1: +mtk_drm_crtc_atomic_begin() +mtk_crtc->event is not null, + step 1: + mtk_drm_crtc_atomic_flush: + mtk_drm_crtc_update_config( + !!mtk_crtc->event) +step 2: +mtk_crtc_ddp_irq -> +mtk_drm_finish_page_flip: +lock +mtk_crtc->event set to null, +pending_needs_vblank set to false +unlock + pending_needs_vblank set to true, + + step 2: + mtk_crtc_ddp_irq -> + mtk_drm_finish_page_flip called again, + pending_needs_vblank is still true + //null pointer + +Instead of guarding the entire mtk_drm_crtc_atomic_flush(), it's more +efficient to just check if mtk_crtc->event is null before use. + +Fixes: 119f5173628a ("drm/mediatek: Add DRM Driver for Mediatek SoC MT8173.") +Signed-off-by: Hsin-Yi Wang +Reviewed-by: CK Hu +Link: https://patchwork.kernel.org/project/dri-devel/patch/20240223212404.3709690-1-hsinyi@chromium.org/ +Signed-off-by: Chun-Kuang Hu +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c +index f370d41b3d041..9bbad33500691 100644 +--- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c ++++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c +@@ -73,11 +73,13 @@ static void mtk_drm_crtc_finish_page_flip(struct mtk_drm_crtc *mtk_crtc) + struct drm_crtc *crtc = &mtk_crtc->base; + unsigned long flags; + +- spin_lock_irqsave(&crtc->dev->event_lock, flags); +- drm_crtc_send_vblank_event(crtc, mtk_crtc->event); +- drm_crtc_vblank_put(crtc); +- mtk_crtc->event = NULL; +- spin_unlock_irqrestore(&crtc->dev->event_lock, flags); ++ if (mtk_crtc->event) { ++ spin_lock_irqsave(&crtc->dev->event_lock, flags); ++ drm_crtc_send_vblank_event(crtc, mtk_crtc->event); ++ drm_crtc_vblank_put(crtc); ++ mtk_crtc->event = NULL; ++ spin_unlock_irqrestore(&crtc->dev->event_lock, flags); ++ } + } + + static void mtk_drm_finish_page_flip(struct mtk_drm_crtc *mtk_crtc) +-- +2.43.0 + diff --git a/queue-5.4/drm-msm-dpu-add-division-of-drm_display_mode-s-hskew.patch b/queue-5.4/drm-msm-dpu-add-division-of-drm_display_mode-s-hskew.patch new file mode 100644 index 00000000000..b5966bd686a --- /dev/null +++ b/queue-5.4/drm-msm-dpu-add-division-of-drm_display_mode-s-hskew.patch @@ -0,0 +1,49 @@ +From 3f715617d610f454fabe8015fcfaeba7f7c2ea49 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 22 Feb 2024 11:39:47 -0800 +Subject: drm/msm/dpu: add division of drm_display_mode's hskew parameter + +From: Paloma Arellano + +[ Upstream commit 551ee0f210991d25f336bc27262353bfe99d3eed ] + +Setting up the timing engine when the physical encoder has a split role +neglects dividing the drm_display_mode's hskew parameter. Let's fix this +since this must also be done in preparation for implementing YUV420 over +DP. + +Fixes: 25fdd5933e4c ("drm/msm: Add SDM845 DPU support") +Signed-off-by: Paloma Arellano +Reviewed-by: Dmitry Baryshkov +Patchwork: https://patchwork.freedesktop.org/patch/579605/ +Link: https://lore.kernel.org/r/20240222194025.25329-3-quic_parellan@quicinc.com +Signed-off-by: Dmitry Baryshkov +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c +index b9c84fb4d4a1f..311863a05a6fa 100644 +--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c ++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c +@@ -258,12 +258,14 @@ static void dpu_encoder_phys_vid_setup_timing_engine( + mode.htotal >>= 1; + mode.hsync_start >>= 1; + mode.hsync_end >>= 1; ++ mode.hskew >>= 1; + + DPU_DEBUG_VIDENC(phys_enc, +- "split_role %d, halve horizontal %d %d %d %d\n", ++ "split_role %d, halve horizontal %d %d %d %d %d\n", + phys_enc->split_role, + mode.hdisplay, mode.htotal, +- mode.hsync_start, mode.hsync_end); ++ mode.hsync_start, mode.hsync_end, ++ mode.hskew); + } + + drm_mode_to_intf_timing_params(phys_enc, &mode, &timing_params); +-- +2.43.0 + diff --git a/queue-5.4/drm-radeon-ni-fix-wrong-firmware-size-logging-in-ni_.patch b/queue-5.4/drm-radeon-ni-fix-wrong-firmware-size-logging-in-ni_.patch new file mode 100644 index 00000000000..f6c84bd7409 --- /dev/null +++ b/queue-5.4/drm-radeon-ni-fix-wrong-firmware-size-logging-in-ni_.patch @@ -0,0 +1,39 @@ +From 098aeb6ccfece430857cadf3a65c3c1187b8a62f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 6 Feb 2024 08:48:14 -0800 +Subject: drm/radeon/ni: Fix wrong firmware size logging in ni_init_microcode() + +From: Nikita Zhandarovich + +[ Upstream commit c4891d979c7668b195a0a75787967ec95a24ecef ] + +Clean up a typo in pr_err() erroneously printing NI MC 'rdev->mc_fw->size' +during SMC firmware load. Log 'rdev->smc_fw->size' instead. + +Found by Linux Verification Center (linuxtesting.org) with static +analysis tool SVACE. + +Fixes: 6596afd48af4 ("drm/radeon/kms: add dpm support for btc (v3)") +Signed-off-by: Nikita Zhandarovich +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/radeon/ni.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c +index 410f626a39d43..1fa48853b54e4 100644 +--- a/drivers/gpu/drm/radeon/ni.c ++++ b/drivers/gpu/drm/radeon/ni.c +@@ -826,7 +826,7 @@ int ni_init_microcode(struct radeon_device *rdev) + err = 0; + } else if (rdev->smc_fw->size != smc_req_size) { + pr_err("ni_mc: Bogus length %zu in firmware \"%s\"\n", +- rdev->mc_fw->size, fw_name); ++ rdev->smc_fw->size, fw_name); + err = -EINVAL; + } + } +-- +2.43.0 + diff --git a/queue-5.4/drm-rockchip-inno_hdmi-fix-video-timing.patch b/queue-5.4/drm-rockchip-inno_hdmi-fix-video-timing.patch new file mode 100644 index 00000000000..c3d45da80e3 --- /dev/null +++ b/queue-5.4/drm-rockchip-inno_hdmi-fix-video-timing.patch @@ -0,0 +1,51 @@ +From 97e9f6e9f49abbf007ef5e5698d43bb5067fe461 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Dec 2023 18:41:54 +0100 +Subject: drm/rockchip: inno_hdmi: Fix video timing + +From: Alex Bee + +[ Upstream commit 47a145c03484d33e65d773169d5ca1b9fe2a492e ] + +The controller wants the difference between *total and *sync_start in the +HDMI_VIDEO_EXT_*DELAY registers. Otherwise the signal is very unstable for +certain non-VIC modes. See downstream commit [0]. + +[0] https://github.com/rockchip-linux/kernel/commit/8eb559f2502c + +Fixes: 412d4ae6b7a5 ("drm/rockchip: hdmi: add Innosilicon HDMI support") +Co-developed-by: Zheng Yang +Signed-off-by: Zheng Yang +Signed-off-by: Alex Bee +Signed-off-by: Heiko Stuebner +Link: https://patchwork.freedesktop.org/patch/msgid/20231222174220.55249-4-knaerzche@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/rockchip/inno_hdmi.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/rockchip/inno_hdmi.c b/drivers/gpu/drm/rockchip/inno_hdmi.c +index f2e2cc66f4897..95888e64bd8bc 100644 +--- a/drivers/gpu/drm/rockchip/inno_hdmi.c ++++ b/drivers/gpu/drm/rockchip/inno_hdmi.c +@@ -401,7 +401,7 @@ static int inno_hdmi_config_video_timing(struct inno_hdmi *hdmi, + hdmi_writeb(hdmi, HDMI_VIDEO_EXT_HBLANK_L, value & 0xFF); + hdmi_writeb(hdmi, HDMI_VIDEO_EXT_HBLANK_H, (value >> 8) & 0xFF); + +- value = mode->hsync_start - mode->hdisplay; ++ value = mode->htotal - mode->hsync_start; + hdmi_writeb(hdmi, HDMI_VIDEO_EXT_HDELAY_L, value & 0xFF); + hdmi_writeb(hdmi, HDMI_VIDEO_EXT_HDELAY_H, (value >> 8) & 0xFF); + +@@ -416,7 +416,7 @@ static int inno_hdmi_config_video_timing(struct inno_hdmi *hdmi, + value = mode->vtotal - mode->vdisplay; + hdmi_writeb(hdmi, HDMI_VIDEO_EXT_VBLANK, value & 0xFF); + +- value = mode->vsync_start - mode->vdisplay; ++ value = mode->vtotal - mode->vsync_start; + hdmi_writeb(hdmi, HDMI_VIDEO_EXT_VDELAY, value & 0xFF); + + value = mode->vsync_end - mode->vsync_start; +-- +2.43.0 + diff --git a/queue-5.4/drm-rockchip-lvds-do-not-overwrite-error-code.patch b/queue-5.4/drm-rockchip-lvds-do-not-overwrite-error-code.patch new file mode 100644 index 00000000000..bbd2ff18f89 --- /dev/null +++ b/queue-5.4/drm-rockchip-lvds-do-not-overwrite-error-code.patch @@ -0,0 +1,38 @@ +From d4aae77b06b4b2f5511454b81ec448e6bb3e437d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Nov 2023 13:29:48 +0100 +Subject: drm/rockchip: lvds: do not overwrite error code + +From: Quentin Schulz + +[ Upstream commit 79b09453c4e369ca81cfb670d0136d089e3b92f0 ] + +ret variable stores the return value of drm_of_find_panel_or_bridge +which can return error codes different from EPROBE_DEFER. Therefore, +let's just return that error code instead of forcing it to EPROBE_DEFER. + +Fixes: 34cc0aa25456 ("drm/rockchip: Add support for Rockchip Soc LVDS") +Cc: Quentin Schulz +Signed-off-by: Quentin Schulz +Signed-off-by: Heiko Stuebner +Link: https://patchwork.freedesktop.org/patch/msgid/20231120-rk-lvds-defer-msg-v2-1-9c59a5779cf9@theobroma-systems.com +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/rockchip/rockchip_lvds.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/gpu/drm/rockchip/rockchip_lvds.c b/drivers/gpu/drm/rockchip/rockchip_lvds.c +index 64aefa8568963..aa8212c721b10 100644 +--- a/drivers/gpu/drm/rockchip/rockchip_lvds.c ++++ b/drivers/gpu/drm/rockchip/rockchip_lvds.c +@@ -366,7 +366,6 @@ static int rockchip_lvds_bind(struct device *dev, struct device *master, + goto err_put_port; + } else if (ret) { + DRM_DEV_ERROR(dev, "failed to find panel and bridge node\n"); +- ret = -EPROBE_DEFER; + goto err_put_port; + } + if (lvds->panel) +-- +2.43.0 + diff --git a/queue-5.4/drm-tegra-dsi-add-missing-check-for-of_find_device_b.patch b/queue-5.4/drm-tegra-dsi-add-missing-check-for-of_find_device_b.patch new file mode 100644 index 00000000000..6ac3531d00c --- /dev/null +++ b/queue-5.4/drm-tegra-dsi-add-missing-check-for-of_find_device_b.patch @@ -0,0 +1,41 @@ +From 2f3c9b3bbd79e76a02f568ca6d3e234f7b9d6149 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 24 Oct 2023 08:07:38 +0000 +Subject: drm/tegra: dsi: Add missing check for of_find_device_by_node + +From: Chen Ni + +[ Upstream commit afe6fcb9775882230cd29b529203eabd5d2a638d ] + +Add check for the return value of of_find_device_by_node() and return +the error if it fails in order to avoid NULL pointer dereference. + +Fixes: e94236cde4d5 ("drm/tegra: dsi: Add ganged mode support") +Signed-off-by: Chen Ni +Signed-off-by: Thierry Reding +Link: https://patchwork.freedesktop.org/patch/msgid/20231024080738.825553-1-nichen@iscas.ac.cn +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/tegra/dsi.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/tegra/dsi.c b/drivers/gpu/drm/tegra/dsi.c +index 13413d2b26028..4e454479ff157 100644 +--- a/drivers/gpu/drm/tegra/dsi.c ++++ b/drivers/gpu/drm/tegra/dsi.c +@@ -1451,9 +1451,11 @@ static int tegra_dsi_ganged_probe(struct tegra_dsi *dsi) + np = of_parse_phandle(dsi->dev->of_node, "nvidia,ganged-mode", 0); + if (np) { + struct platform_device *gangster = of_find_device_by_node(np); ++ of_node_put(np); ++ if (!gangster) ++ return -EPROBE_DEFER; + + dsi->slave = platform_get_drvdata(gangster); +- of_node_put(np); + + if (!dsi->slave) { + put_device(&gangster->dev); +-- +2.43.0 + diff --git a/queue-5.4/drm-tegra-dsi-fix-missing-pm_runtime_disable-in-the-.patch b/queue-5.4/drm-tegra-dsi-fix-missing-pm_runtime_disable-in-the-.patch new file mode 100644 index 00000000000..008ccfd9d78 --- /dev/null +++ b/queue-5.4/drm-tegra-dsi-fix-missing-pm_runtime_disable-in-the-.patch @@ -0,0 +1,37 @@ +From acf4804bf62489a58d5bd168984047720620d987 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 2 Sep 2023 17:22:09 +0200 +Subject: drm/tegra: dsi: Fix missing pm_runtime_disable() in the error + handling path of tegra_dsi_probe() + +From: Christophe JAILLET + +[ Upstream commit 5286a9fc280c45b6b307ee1b07f7a997e042252c ] + +If an error occurs after calling pm_runtime_enable(), pm_runtime_disable() +should be called as already done in the remove function. + +Fixes: ef8187d75265 ("drm/tegra: dsi: Implement runtime PM") +Signed-off-by: Christophe JAILLET +Signed-off-by: Thierry Reding +Link: https://patchwork.freedesktop.org/patch/msgid/ee4a15c9cd4b574a55cd67c30d2411239ba2cee9.1693667005.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/tegra/dsi.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/gpu/drm/tegra/dsi.c b/drivers/gpu/drm/tegra/dsi.c +index 072a4c1d8eff4..03ccfb6ce8a89 100644 +--- a/drivers/gpu/drm/tegra/dsi.c ++++ b/drivers/gpu/drm/tegra/dsi.c +@@ -1582,6 +1582,7 @@ static int tegra_dsi_probe(struct platform_device *pdev) + return 0; + + unregister: ++ pm_runtime_disable(&pdev->dev); + mipi_dsi_host_unregister(&dsi->host); + mipi_free: + tegra_mipi_free(dsi->mipi); +-- +2.43.0 + diff --git a/queue-5.4/drm-tegra-dsi-fix-some-error-handling-paths-in-tegra.patch b/queue-5.4/drm-tegra-dsi-fix-some-error-handling-paths-in-tegra.patch new file mode 100644 index 00000000000..0333149a70f --- /dev/null +++ b/queue-5.4/drm-tegra-dsi-fix-some-error-handling-paths-in-tegra.patch @@ -0,0 +1,116 @@ +From f43d6097fb1f2e32f5a2d2e592e0e675e136826e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 2 Sep 2023 17:22:08 +0200 +Subject: drm/tegra: dsi: Fix some error handling paths in tegra_dsi_probe() + +From: Christophe JAILLET + +[ Upstream commit 830c1ded356369cd1303e8bb87ce3fea6e744de8 ] + +If an error occurs after calling tegra_output_probe(), +tegra_output_remove() should be called as already done in the remove +function. + +Fixes: dec727399a4b ("drm/tegra: Add DSI support") +Signed-off-by: Christophe JAILLET +Signed-off-by: Thierry Reding +Link: https://patchwork.freedesktop.org/patch/msgid/16820073278d031f6c474a08d5f22a255158585e.1693667005.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/tegra/dsi.c | 54 ++++++++++++++++++++++++------------- + 1 file changed, 35 insertions(+), 19 deletions(-) + +diff --git a/drivers/gpu/drm/tegra/dsi.c b/drivers/gpu/drm/tegra/dsi.c +index cc0ac038a4208..072a4c1d8eff4 100644 +--- a/drivers/gpu/drm/tegra/dsi.c ++++ b/drivers/gpu/drm/tegra/dsi.c +@@ -1503,44 +1503,58 @@ static int tegra_dsi_probe(struct platform_device *pdev) + + if (!pdev->dev.pm_domain) { + dsi->rst = devm_reset_control_get(&pdev->dev, "dsi"); +- if (IS_ERR(dsi->rst)) +- return PTR_ERR(dsi->rst); ++ if (IS_ERR(dsi->rst)) { ++ err = PTR_ERR(dsi->rst); ++ goto remove; ++ } + } + + dsi->clk = devm_clk_get(&pdev->dev, NULL); +- if (IS_ERR(dsi->clk)) +- return dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk), +- "cannot get DSI clock\n"); ++ if (IS_ERR(dsi->clk)) { ++ err = dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk), ++ "cannot get DSI clock\n"); ++ goto remove; ++ } + + dsi->clk_lp = devm_clk_get(&pdev->dev, "lp"); +- if (IS_ERR(dsi->clk_lp)) +- return dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_lp), +- "cannot get low-power clock\n"); ++ if (IS_ERR(dsi->clk_lp)) { ++ err = dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_lp), ++ "cannot get low-power clock\n"); ++ goto remove; ++ } + + dsi->clk_parent = devm_clk_get(&pdev->dev, "parent"); +- if (IS_ERR(dsi->clk_parent)) +- return dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_parent), +- "cannot get parent clock\n"); ++ if (IS_ERR(dsi->clk_parent)) { ++ err = dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_parent), ++ "cannot get parent clock\n"); ++ goto remove; ++ } + + dsi->vdd = devm_regulator_get(&pdev->dev, "avdd-dsi-csi"); +- if (IS_ERR(dsi->vdd)) +- return dev_err_probe(&pdev->dev, PTR_ERR(dsi->vdd), +- "cannot get VDD supply\n"); ++ if (IS_ERR(dsi->vdd)) { ++ err = dev_err_probe(&pdev->dev, PTR_ERR(dsi->vdd), ++ "cannot get VDD supply\n"); ++ goto remove; ++ } + + err = tegra_dsi_setup_clocks(dsi); + if (err < 0) { + dev_err(&pdev->dev, "cannot setup clocks\n"); +- return err; ++ goto remove; + } + + regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); + dsi->regs = devm_ioremap_resource(&pdev->dev, regs); +- if (IS_ERR(dsi->regs)) +- return PTR_ERR(dsi->regs); ++ if (IS_ERR(dsi->regs)) { ++ err = PTR_ERR(dsi->regs); ++ goto remove; ++ } + + dsi->mipi = tegra_mipi_request(&pdev->dev, pdev->dev.of_node); +- if (IS_ERR(dsi->mipi)) +- return PTR_ERR(dsi->mipi); ++ if (IS_ERR(dsi->mipi)) { ++ err = PTR_ERR(dsi->mipi); ++ goto remove; ++ } + + dsi->host.ops = &tegra_dsi_host_ops; + dsi->host.dev = &pdev->dev; +@@ -1571,6 +1585,8 @@ static int tegra_dsi_probe(struct platform_device *pdev) + mipi_dsi_host_unregister(&dsi->host); + mipi_free: + tegra_mipi_free(dsi->mipi); ++remove: ++ tegra_output_remove(&dsi->output); + return err; + } + +-- +2.43.0 + diff --git a/queue-5.4/drm-tegra-dsi-make-use-of-the-helper-function-dev_er.patch b/queue-5.4/drm-tegra-dsi-make-use-of-the-helper-function-dev_er.patch new file mode 100644 index 00000000000..129f6645e37 --- /dev/null +++ b/queue-5.4/drm-tegra-dsi-make-use-of-the-helper-function-dev_er.patch @@ -0,0 +1,71 @@ +From 3e2aa1ebc54a6f686c36e2d6e9811c99cd253e3d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 16 Sep 2021 18:56:40 +0800 +Subject: drm/tegra: dsi: Make use of the helper function dev_err_probe() + +From: Cai Huoqing + +[ Upstream commit fc75e4fcbd1e4252a0481ebb23cd4516c127a8e2 ] + +When possible use dev_err_probe help to properly deal with the +PROBE_DEFER error, the benefit is that DEFER issue will be logged +in the devices_deferred debugfs file. +And using dev_err_probe() can reduce code size, the error value +gets printed. + +Signed-off-by: Cai Huoqing +Signed-off-by: Thierry Reding +Stable-dep-of: 830c1ded3563 ("drm/tegra: dsi: Fix some error handling paths in tegra_dsi_probe()") +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/tegra/dsi.c | 28 ++++++++++++---------------- + 1 file changed, 12 insertions(+), 16 deletions(-) + +diff --git a/drivers/gpu/drm/tegra/dsi.c b/drivers/gpu/drm/tegra/dsi.c +index 1cc6dc6167771..cc0ac038a4208 100644 +--- a/drivers/gpu/drm/tegra/dsi.c ++++ b/drivers/gpu/drm/tegra/dsi.c +@@ -1508,28 +1508,24 @@ static int tegra_dsi_probe(struct platform_device *pdev) + } + + dsi->clk = devm_clk_get(&pdev->dev, NULL); +- if (IS_ERR(dsi->clk)) { +- dev_err(&pdev->dev, "cannot get DSI clock\n"); +- return PTR_ERR(dsi->clk); +- } ++ if (IS_ERR(dsi->clk)) ++ return dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk), ++ "cannot get DSI clock\n"); + + dsi->clk_lp = devm_clk_get(&pdev->dev, "lp"); +- if (IS_ERR(dsi->clk_lp)) { +- dev_err(&pdev->dev, "cannot get low-power clock\n"); +- return PTR_ERR(dsi->clk_lp); +- } ++ if (IS_ERR(dsi->clk_lp)) ++ return dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_lp), ++ "cannot get low-power clock\n"); + + dsi->clk_parent = devm_clk_get(&pdev->dev, "parent"); +- if (IS_ERR(dsi->clk_parent)) { +- dev_err(&pdev->dev, "cannot get parent clock\n"); +- return PTR_ERR(dsi->clk_parent); +- } ++ if (IS_ERR(dsi->clk_parent)) ++ return dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_parent), ++ "cannot get parent clock\n"); + + dsi->vdd = devm_regulator_get(&pdev->dev, "avdd-dsi-csi"); +- if (IS_ERR(dsi->vdd)) { +- dev_err(&pdev->dev, "cannot get VDD supply\n"); +- return PTR_ERR(dsi->vdd); +- } ++ if (IS_ERR(dsi->vdd)) ++ return dev_err_probe(&pdev->dev, PTR_ERR(dsi->vdd), ++ "cannot get VDD supply\n"); + + err = tegra_dsi_setup_clocks(dsi); + if (err < 0) { +-- +2.43.0 + diff --git a/queue-5.4/drm-tegra-output-fix-missing-i2c_put_adapter-in-the-.patch b/queue-5.4/drm-tegra-output-fix-missing-i2c_put_adapter-in-the-.patch new file mode 100644 index 00000000000..3bc9b2a6a88 --- /dev/null +++ b/queue-5.4/drm-tegra-output-fix-missing-i2c_put_adapter-in-the-.patch @@ -0,0 +1,75 @@ +From 5eb26bd6e04451a337ad95376942549519e62fcb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 2 Sep 2023 17:22:13 +0200 +Subject: drm/tegra: output: Fix missing i2c_put_adapter() in the error + handling paths of tegra_output_probe() + +From: Christophe JAILLET + +[ Upstream commit 2db4578ef6ffb2b52115ca0ebf897b60ec559556 ] + +If an error occurs after a successful of_get_i2c_adapter_by_node() call, it +should be undone by a corresponding i2c_put_adapter(). + +Add the missing i2c_put_adapter() call. + +Fixes: 9be7d864cf07 ("drm/tegra: Implement panel support") +Signed-off-by: Christophe JAILLET +Signed-off-by: Thierry Reding +Link: https://patchwork.freedesktop.org/patch/msgid/b38604178991e1f08b2cda219103be266be2d680.1693667005.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/tegra/output.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +diff --git a/drivers/gpu/drm/tegra/output.c b/drivers/gpu/drm/tegra/output.c +index bdcaa4c7168cf..806249c0b7e85 100644 +--- a/drivers/gpu/drm/tegra/output.c ++++ b/drivers/gpu/drm/tegra/output.c +@@ -127,8 +127,10 @@ int tegra_output_probe(struct tegra_output *output) + GPIOD_IN, + "HDMI hotplug detect"); + if (IS_ERR(output->hpd_gpio)) { +- if (PTR_ERR(output->hpd_gpio) != -ENOENT) +- return PTR_ERR(output->hpd_gpio); ++ if (PTR_ERR(output->hpd_gpio) != -ENOENT) { ++ err = PTR_ERR(output->hpd_gpio); ++ goto put_i2c; ++ } + + output->hpd_gpio = NULL; + } +@@ -137,7 +139,7 @@ int tegra_output_probe(struct tegra_output *output) + err = gpiod_to_irq(output->hpd_gpio); + if (err < 0) { + dev_err(output->dev, "gpiod_to_irq(): %d\n", err); +- return err; ++ goto put_i2c; + } + + output->hpd_irq = err; +@@ -150,7 +152,7 @@ int tegra_output_probe(struct tegra_output *output) + if (err < 0) { + dev_err(output->dev, "failed to request IRQ#%u: %d\n", + output->hpd_irq, err); +- return err; ++ goto put_i2c; + } + + output->connector.polled = DRM_CONNECTOR_POLL_HPD; +@@ -168,6 +170,12 @@ int tegra_output_probe(struct tegra_output *output) + return -ENOMEM; + + return 0; ++ ++put_i2c: ++ if (output->ddc) ++ i2c_put_adapter(output->ddc); ++ ++ return err; + } + + void tegra_output_remove(struct tegra_output *output) +-- +2.43.0 + diff --git a/queue-5.4/drm-tegra-put-drm_gem_object-ref-on-error-in-tegra_f.patch b/queue-5.4/drm-tegra-put-drm_gem_object-ref-on-error-in-tegra_f.patch new file mode 100644 index 00000000000..91342592f05 --- /dev/null +++ b/queue-5.4/drm-tegra-put-drm_gem_object-ref-on-error-in-tegra_f.patch @@ -0,0 +1,40 @@ +From d891269f13bb800ef5bfb0cc6551c64fe0a51c73 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Dec 2023 12:33:55 +0300 +Subject: drm/tegra: put drm_gem_object ref on error in tegra_fb_create + +From: Fedor Pchelkin + +[ Upstream commit 32e5a120a5105bce01561978ee55aee8e40ac0dc ] + +Inside tegra_fb_create(), drm_gem_object_lookup() increments ref count of +the found object. But if the following size check fails then the last +found object's ref count should be put there as the unreferencing loop +can't detect this situation. + +Found by Linux Verification Center (linuxtesting.org). + +Fixes: de2ba664c30f ("gpu: host1x: drm: Add memory manager and fb") +Signed-off-by: Fedor Pchelkin +Signed-off-by: Thierry Reding +Link: https://patchwork.freedesktop.org/patch/msgid/20231215093356.12067-1-pchelkin@ispras.ru +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/tegra/fb.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c +index e34325c83d28e..361e67e4cd984 100644 +--- a/drivers/gpu/drm/tegra/fb.c ++++ b/drivers/gpu/drm/tegra/fb.c +@@ -155,6 +155,7 @@ struct drm_framebuffer *tegra_fb_create(struct drm_device *drm, + + if (gem->size < size) { + err = -EINVAL; ++ drm_gem_object_put(gem); + goto unreference; + } + +-- +2.43.0 + diff --git a/queue-5.4/fs-select-rework-stack-allocation-hack-for-clang.patch b/queue-5.4/fs-select-rework-stack-allocation-hack-for-clang.patch new file mode 100644 index 00000000000..cd53506271d --- /dev/null +++ b/queue-5.4/fs-select-rework-stack-allocation-hack-for-clang.patch @@ -0,0 +1,67 @@ +From ffd63a7f017b23ec8c463c9a39c9adb5956d3075 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 16 Feb 2024 21:23:34 +0100 +Subject: fs/select: rework stack allocation hack for clang + +From: Arnd Bergmann + +[ Upstream commit ddb9fd7a544088ed70eccbb9f85e9cc9952131c1 ] + +A while ago, we changed the way that select() and poll() preallocate +a temporary buffer just under the size of the static warning limit of +1024 bytes, as clang was frequently going slightly above that limit. + +The warnings have recently returned and I took another look. As it turns +out, clang is not actually inherently worse at reserving stack space, +it just happens to inline do_select() into core_sys_select(), while gcc +never inlines it. + +Annotate do_select() to never be inlined and in turn remove the special +case for the allocation size. This should give the same behavior for +both clang and gcc all the time and once more avoids those warnings. + +Fixes: ad312f95d41c ("fs/select: avoid clang stack usage warning") +Signed-off-by: Arnd Bergmann +Link: https://lore.kernel.org/r/20240216202352.2492798-1-arnd@kernel.org +Reviewed-by: Kees Cook +Reviewed-by: Andi Kleen +Reviewed-by: Jan Kara +Signed-off-by: Christian Brauner +Signed-off-by: Sasha Levin +--- + fs/select.c | 2 +- + include/linux/poll.h | 4 ---- + 2 files changed, 1 insertion(+), 5 deletions(-) + +diff --git a/fs/select.c b/fs/select.c +index 7716d9d5be1e8..f405dc5adf3ca 100644 +--- a/fs/select.c ++++ b/fs/select.c +@@ -475,7 +475,7 @@ static inline void wait_key_set(poll_table *wait, unsigned long in, + wait->_key |= POLLOUT_SET; + } + +-static int do_select(int n, fd_set_bits *fds, struct timespec64 *end_time) ++static noinline_for_stack int do_select(int n, fd_set_bits *fds, struct timespec64 *end_time) + { + ktime_t expire, *to = NULL; + struct poll_wqueues table; +diff --git a/include/linux/poll.h b/include/linux/poll.h +index 1cdc32b1f1b08..7e0fdcf905d2e 100644 +--- a/include/linux/poll.h ++++ b/include/linux/poll.h +@@ -16,11 +16,7 @@ + extern struct ctl_table epoll_table[]; /* for sysctl */ + /* ~832 bytes of stack space used max in sys_select/sys_poll before allocating + additional memory. */ +-#ifdef __clang__ +-#define MAX_STACK_ALLOC 768 +-#else + #define MAX_STACK_ALLOC 832 +-#endif + #define FRONTEND_STACK_ALLOC 256 + #define SELECT_STACK_ALLOC FRONTEND_STACK_ALLOC + #define POLL_STACK_ALLOC FRONTEND_STACK_ALLOC +-- +2.43.0 + diff --git a/queue-5.4/gpu-host1x-mipi-update-tegra_mipi_request-to-be-node.patch b/queue-5.4/gpu-host1x-mipi-update-tegra_mipi_request-to-be-node.patch new file mode 100644 index 00000000000..e5e6dc2cf92 --- /dev/null +++ b/queue-5.4/gpu-host1x-mipi-update-tegra_mipi_request-to-be-node.patch @@ -0,0 +1,73 @@ +From e0bcc65bdffd9d443cf730eb5f83693201c91801 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 14 Jul 2020 21:20:51 -0700 +Subject: gpu: host1x: mipi: Update tegra_mipi_request() to be node based + +From: Sowjanya Komatineni + +[ Upstream commit 767598d447aa46411289c5808b0e45e20a1823b4 ] + +Tegra CSI driver need a separate MIPI device for each channel as +calibration of corresponding MIPI pads for each channel should +happen independently. + +So, this patch updates tegra_mipi_request() API to add a device_node +pointer argument to allow creating mipi device for specific device +node rather than a device. + +Signed-off-by: Sowjanya Komatineni +Signed-off-by: Thierry Reding +Stable-dep-of: 830c1ded3563 ("drm/tegra: dsi: Fix some error handling paths in tegra_dsi_probe()") +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/tegra/dsi.c | 2 +- + drivers/gpu/host1x/mipi.c | 4 ++-- + include/linux/host1x.h | 3 ++- + 3 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/drivers/gpu/drm/tegra/dsi.c b/drivers/gpu/drm/tegra/dsi.c +index 4e454479ff157..1cc6dc6167771 100644 +--- a/drivers/gpu/drm/tegra/dsi.c ++++ b/drivers/gpu/drm/tegra/dsi.c +@@ -1542,7 +1542,7 @@ static int tegra_dsi_probe(struct platform_device *pdev) + if (IS_ERR(dsi->regs)) + return PTR_ERR(dsi->regs); + +- dsi->mipi = tegra_mipi_request(&pdev->dev); ++ dsi->mipi = tegra_mipi_request(&pdev->dev, pdev->dev.of_node); + if (IS_ERR(dsi->mipi)) + return PTR_ERR(dsi->mipi); + +diff --git a/drivers/gpu/host1x/mipi.c b/drivers/gpu/host1x/mipi.c +index e00809d996a29..762d349ad00f1 100644 +--- a/drivers/gpu/host1x/mipi.c ++++ b/drivers/gpu/host1x/mipi.c +@@ -206,9 +206,9 @@ static int tegra_mipi_power_down(struct tegra_mipi *mipi) + return 0; + } + +-struct tegra_mipi_device *tegra_mipi_request(struct device *device) ++struct tegra_mipi_device *tegra_mipi_request(struct device *device, ++ struct device_node *np) + { +- struct device_node *np = device->of_node; + struct tegra_mipi_device *dev; + struct of_phandle_args args; + int err; +diff --git a/include/linux/host1x.h b/include/linux/host1x.h +index e6eea45e11549..0b9d59807e5e2 100644 +--- a/include/linux/host1x.h ++++ b/include/linux/host1x.h +@@ -314,7 +314,8 @@ int host1x_client_unregister(struct host1x_client *client); + + struct tegra_mipi_device; + +-struct tegra_mipi_device *tegra_mipi_request(struct device *device); ++struct tegra_mipi_device *tegra_mipi_request(struct device *device, ++ struct device_node *np); + void tegra_mipi_free(struct tegra_mipi_device *device); + int tegra_mipi_enable(struct tegra_mipi_device *device); + int tegra_mipi_disable(struct tegra_mipi_device *device); +-- +2.43.0 + diff --git a/queue-5.4/igb-fix-missing-time-sync-events.patch b/queue-5.4/igb-fix-missing-time-sync-events.patch new file mode 100644 index 00000000000..b76ef13fbbc --- /dev/null +++ b/queue-5.4/igb-fix-missing-time-sync-events.patch @@ -0,0 +1,94 @@ +From 0da7d7f0f29c31f79ca560f23a9bd70fc88b7dcf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 20 Feb 2024 15:57:11 -0800 +Subject: igb: Fix missing time sync events + +From: Vinicius Costa Gomes + +[ Upstream commit ee14cc9ea19ba9678177e2224a9c58cce5937c73 ] + +Fix "double" clearing of interrupts, which can cause external events +or timestamps to be missed. + +The E1000_TSIRC Time Sync Interrupt Cause register can be cleared in two +ways, by either reading it or by writing '1' into the specific cause +bit. This is documented in section 8.16.1. + +The following flow was used: + 1. read E1000_TSIRC into 'tsicr'; + 2. handle the interrupts present into 'tsirc' and mark them in 'ack'; + 3. write 'ack' into E1000_TSICR; + +As both (1) and (3) will clear the interrupt cause, if the same +interrupt happens again between (1) and (3) it will be ignored, +causing events to be missed. + +Remove the extra clear in (3). + +Fixes: 00c65578b47b ("igb: enable internal PPS for the i210") +Acked-by: Richard Cochran +Signed-off-by: Vinicius Costa Gomes +Tested-by: Pucha Himasekhar Reddy (A Contingent worker at Intel) +Signed-off-by: Tony Nguyen +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/igb/igb_main.c | 23 +++++------------------ + 1 file changed, 5 insertions(+), 18 deletions(-) + +diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c +index fd1efac092472..cceff1515ea1d 100644 +--- a/drivers/net/ethernet/intel/igb/igb_main.c ++++ b/drivers/net/ethernet/intel/igb/igb_main.c +@@ -6523,44 +6523,31 @@ static void igb_extts(struct igb_adapter *adapter, int tsintr_tt) + static void igb_tsync_interrupt(struct igb_adapter *adapter) + { + struct e1000_hw *hw = &adapter->hw; +- u32 ack = 0, tsicr = rd32(E1000_TSICR); ++ u32 tsicr = rd32(E1000_TSICR); + struct ptp_clock_event event; + + if (tsicr & TSINTR_SYS_WRAP) { + event.type = PTP_CLOCK_PPS; + if (adapter->ptp_caps.pps) + ptp_clock_event(adapter->ptp_clock, &event); +- ack |= TSINTR_SYS_WRAP; + } + + if (tsicr & E1000_TSICR_TXTS) { + /* retrieve hardware timestamp */ + schedule_work(&adapter->ptp_tx_work); +- ack |= E1000_TSICR_TXTS; + } + +- if (tsicr & TSINTR_TT0) { ++ if (tsicr & TSINTR_TT0) + igb_perout(adapter, 0); +- ack |= TSINTR_TT0; +- } + +- if (tsicr & TSINTR_TT1) { ++ if (tsicr & TSINTR_TT1) + igb_perout(adapter, 1); +- ack |= TSINTR_TT1; +- } + +- if (tsicr & TSINTR_AUTT0) { ++ if (tsicr & TSINTR_AUTT0) + igb_extts(adapter, 0); +- ack |= TSINTR_AUTT0; +- } + +- if (tsicr & TSINTR_AUTT1) { ++ if (tsicr & TSINTR_AUTT1) + igb_extts(adapter, 1); +- ack |= TSINTR_AUTT1; +- } +- +- /* acknowledge the interrupts */ +- wr32(E1000_TSICR, ack); + } + + static irqreturn_t igb_msix_other(int irq, void *data) +-- +2.43.0 + diff --git a/queue-5.4/igb-move-perout-and-extts-isr-logic-to-separate-func.patch b/queue-5.4/igb-move-perout-and-extts-isr-logic-to-separate-func.patch new file mode 100644 index 00000000000..a9f3a71c560 --- /dev/null +++ b/queue-5.4/igb-move-perout-and-extts-isr-logic-to-separate-func.patch @@ -0,0 +1,141 @@ +From a82c2082295aea217b429c25c57421771f2eef99 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 Oct 2021 16:34:57 +0200 +Subject: igb: move PEROUT and EXTTS isr logic to separate functions + +From: Ruud Bos + +[ Upstream commit cf99c1dd7b7729091043374b90807c7a5f9fd9b1 ] + +Remove code duplication in the tsync interrupt handler function by moving +this logic to separate functions. This keeps the interrupt handler readable +and allows the new functions to be extended for adapter types other than +i210. + +Signed-off-by: Ruud Bos +Tested-by: Gurucharan G +Signed-off-by: Tony Nguyen +Stable-dep-of: ee14cc9ea19b ("igb: Fix missing time sync events") +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/igb/igb_main.c | 81 +++++++++++++---------- + 1 file changed, 46 insertions(+), 35 deletions(-) + +diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c +index 6638d314c811c..fd1efac092472 100644 +--- a/drivers/net/ethernet/intel/igb/igb_main.c ++++ b/drivers/net/ethernet/intel/igb/igb_main.c +@@ -6479,12 +6479,52 @@ void igb_update_stats(struct igb_adapter *adapter) + } + } + ++static void igb_perout(struct igb_adapter *adapter, int tsintr_tt) ++{ ++ int pin = ptp_find_pin(adapter->ptp_clock, PTP_PF_PEROUT, tsintr_tt); ++ struct e1000_hw *hw = &adapter->hw; ++ struct timespec64 ts; ++ u32 tsauxc; ++ ++ if (pin < 0 || pin >= IGB_N_PEROUT) ++ return; ++ ++ spin_lock(&adapter->tmreg_lock); ++ ts = timespec64_add(adapter->perout[pin].start, ++ adapter->perout[pin].period); ++ /* u32 conversion of tv_sec is safe until y2106 */ ++ wr32((tsintr_tt == 1) ? E1000_TRGTTIML1 : E1000_TRGTTIML0, ts.tv_nsec); ++ wr32((tsintr_tt == 1) ? E1000_TRGTTIMH1 : E1000_TRGTTIMH0, (u32)ts.tv_sec); ++ tsauxc = rd32(E1000_TSAUXC); ++ tsauxc |= TSAUXC_EN_TT0; ++ wr32(E1000_TSAUXC, tsauxc); ++ adapter->perout[pin].start = ts; ++ spin_unlock(&adapter->tmreg_lock); ++} ++ ++static void igb_extts(struct igb_adapter *adapter, int tsintr_tt) ++{ ++ int pin = ptp_find_pin(adapter->ptp_clock, PTP_PF_EXTTS, tsintr_tt); ++ struct e1000_hw *hw = &adapter->hw; ++ struct ptp_clock_event event; ++ u32 sec, nsec; ++ ++ if (pin < 0 || pin >= IGB_N_EXTTS) ++ return; ++ ++ nsec = rd32((tsintr_tt == 1) ? E1000_AUXSTMPL1 : E1000_AUXSTMPL0); ++ sec = rd32((tsintr_tt == 1) ? E1000_AUXSTMPH1 : E1000_AUXSTMPH0); ++ event.type = PTP_CLOCK_EXTTS; ++ event.index = tsintr_tt; ++ event.timestamp = sec * 1000000000ULL + nsec; ++ ptp_clock_event(adapter->ptp_clock, &event); ++} ++ + static void igb_tsync_interrupt(struct igb_adapter *adapter) + { + struct e1000_hw *hw = &adapter->hw; ++ u32 ack = 0, tsicr = rd32(E1000_TSICR); + struct ptp_clock_event event; +- struct timespec64 ts; +- u32 ack = 0, tsauxc, sec, nsec, tsicr = rd32(E1000_TSICR); + + if (tsicr & TSINTR_SYS_WRAP) { + event.type = PTP_CLOCK_PPS; +@@ -6500,51 +6540,22 @@ static void igb_tsync_interrupt(struct igb_adapter *adapter) + } + + if (tsicr & TSINTR_TT0) { +- spin_lock(&adapter->tmreg_lock); +- ts = timespec64_add(adapter->perout[0].start, +- adapter->perout[0].period); +- /* u32 conversion of tv_sec is safe until y2106 */ +- wr32(E1000_TRGTTIML0, ts.tv_nsec); +- wr32(E1000_TRGTTIMH0, (u32)ts.tv_sec); +- tsauxc = rd32(E1000_TSAUXC); +- tsauxc |= TSAUXC_EN_TT0; +- wr32(E1000_TSAUXC, tsauxc); +- adapter->perout[0].start = ts; +- spin_unlock(&adapter->tmreg_lock); ++ igb_perout(adapter, 0); + ack |= TSINTR_TT0; + } + + if (tsicr & TSINTR_TT1) { +- spin_lock(&adapter->tmreg_lock); +- ts = timespec64_add(adapter->perout[1].start, +- adapter->perout[1].period); +- wr32(E1000_TRGTTIML1, ts.tv_nsec); +- wr32(E1000_TRGTTIMH1, (u32)ts.tv_sec); +- tsauxc = rd32(E1000_TSAUXC); +- tsauxc |= TSAUXC_EN_TT1; +- wr32(E1000_TSAUXC, tsauxc); +- adapter->perout[1].start = ts; +- spin_unlock(&adapter->tmreg_lock); ++ igb_perout(adapter, 1); + ack |= TSINTR_TT1; + } + + if (tsicr & TSINTR_AUTT0) { +- nsec = rd32(E1000_AUXSTMPL0); +- sec = rd32(E1000_AUXSTMPH0); +- event.type = PTP_CLOCK_EXTTS; +- event.index = 0; +- event.timestamp = sec * 1000000000ULL + nsec; +- ptp_clock_event(adapter->ptp_clock, &event); ++ igb_extts(adapter, 0); + ack |= TSINTR_AUTT0; + } + + if (tsicr & TSINTR_AUTT1) { +- nsec = rd32(E1000_AUXSTMPL1); +- sec = rd32(E1000_AUXSTMPH1); +- event.type = PTP_CLOCK_EXTTS; +- event.index = 1; +- event.timestamp = sec * 1000000000ULL + nsec; +- ptp_clock_event(adapter->ptp_clock, &event); ++ igb_extts(adapter, 1); + ack |= TSINTR_AUTT1; + } + +-- +2.43.0 + diff --git a/queue-5.4/iommu-amd-mark-interrupt-as-managed.patch b/queue-5.4/iommu-amd-mark-interrupt-as-managed.patch new file mode 100644 index 00000000000..2a4e951e67d --- /dev/null +++ b/queue-5.4/iommu-amd-mark-interrupt-as-managed.patch @@ -0,0 +1,69 @@ +From 9f9fc63ce978053cc2b4254754ea31ecb165790e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 22 Jan 2024 17:34:00 -0600 +Subject: iommu/amd: Mark interrupt as managed + +From: Mario Limonciello + +[ Upstream commit 0feda94c868d396fac3b3cb14089d2d989a07c72 ] + +On many systems that have an AMD IOMMU the following sequence of +warnings is observed during bootup. + +``` +pci 0000:00:00.2 can't derive routing for PCI INT A +pci 0000:00:00.2: PCI INT A: not connected +``` + +This series of events happens because of the IOMMU initialization +sequence order and the lack of _PRT entries for the IOMMU. + +During initialization the IOMMU driver first enables the PCI device +using pci_enable_device(). This will call acpi_pci_irq_enable() +which will check if the interrupt is declared in a PCI routing table +(_PRT) entry. According to the PCI spec [1] these routing entries +are only required under PCI root bridges: + The _PRT object is required under all PCI root bridges + +The IOMMU is directly connected to the root complex, so there is no +parent bridge to look for a _PRT entry. The first warning is emitted +since no entry could be found in the hierarchy. The second warning is +then emitted because the interrupt hasn't yet been configured to any +value. The pin was configured in pci_read_irq() but the byte in +PCI_INTERRUPT_LINE return 0xff which means "Unknown". + +After that sequence of events pci_enable_msi() is called and this +will allocate an interrupt. + +That is both of these warnings are totally harmless because the IOMMU +uses MSI for interrupts. To avoid even trying to probe for a _PRT +entry mark the IOMMU as IRQ managed. This avoids both warnings. + +Link: https://uefi.org/htmlspecs/ACPI_Spec_6_4_html/06_Device_Configuration/Device_Configuration.html?highlight=_prt#prt-pci-routing-table [1] +Signed-off-by: Mario Limonciello +Fixes: cffe0a2b5a34 ("x86, irq: Keep balance of IOAPIC pin reference count") +Reviewed-by: Vasant Hegde +Link: https://lore.kernel.org/r/20240122233400.1802-1-mario.limonciello@amd.com +Signed-off-by: Joerg Roedel +Signed-off-by: Sasha Levin +--- + drivers/iommu/amd_iommu_init.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c +index 4a9feff340da7..15e25f712f393 100644 +--- a/drivers/iommu/amd_iommu_init.c ++++ b/drivers/iommu/amd_iommu_init.c +@@ -1745,6 +1745,9 @@ static int __init iommu_init_pci(struct amd_iommu *iommu) + /* Prevent binding other PCI device drivers to IOMMU devices */ + iommu->dev->match_driver = false; + ++ /* ACPI _PRT won't have an IRQ for IOMMU */ ++ iommu->dev->irq_managed = 1; ++ + pci_read_config_dword(iommu->dev, cap_ptr + MMIO_CAP_HDR_OFFSET, + &iommu->cap); + pci_read_config_dword(iommu->dev, cap_ptr + MMIO_RANGE_OFFSET, +-- +2.43.0 + diff --git a/queue-5.4/ipv6-fib6_rules-flush-route-cache-when-rule-is-chang.patch b/queue-5.4/ipv6-fib6_rules-flush-route-cache-when-rule-is-chang.patch new file mode 100644 index 00000000000..2db4d9e23ca --- /dev/null +++ b/queue-5.4/ipv6-fib6_rules-flush-route-cache-when-rule-is-chang.patch @@ -0,0 +1,55 @@ +From 5724ad286f6decc6d4c01c1a03cffd9b1e641749 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Mar 2024 18:01:57 +0800 +Subject: ipv6: fib6_rules: flush route cache when rule is changed + +From: Shiming Cheng + +[ Upstream commit c4386ab4f6c600f75fdfd21143f89bac3e625d0d ] + +When rule policy is changed, ipv6 socket cache is not refreshed. +The sock's skb still uses a outdated route cache and was sent to +a wrong interface. + +To avoid this error we should update fib node's version when +rule is changed. Then skb's route will be reroute checked as +route cache version is already different with fib node version. +The route cache is refreshed to match the latest rule. + +Fixes: 101367c2f8c4 ("[IPV6]: Policy Routing Rules") +Signed-off-by: Shiming Cheng +Signed-off-by: Lena Wang +Reviewed-by: David Ahern +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/ipv6/fib6_rules.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c +index 1727269396523..cdc8a49d7fc34 100644 +--- a/net/ipv6/fib6_rules.c ++++ b/net/ipv6/fib6_rules.c +@@ -437,6 +437,11 @@ static size_t fib6_rule_nlmsg_payload(struct fib_rule *rule) + + nla_total_size(16); /* src */ + } + ++static void fib6_rule_flush_cache(struct fib_rules_ops *ops) ++{ ++ rt_genid_bump_ipv6(ops->fro_net); ++} ++ + static const struct fib_rules_ops __net_initconst fib6_rules_ops_template = { + .family = AF_INET6, + .rule_size = sizeof(struct fib6_rule), +@@ -449,6 +454,7 @@ static const struct fib_rules_ops __net_initconst fib6_rules_ops_template = { + .compare = fib6_rule_compare, + .fill = fib6_rule_fill, + .nlmsg_payload = fib6_rule_nlmsg_payload, ++ .flush_cache = fib6_rule_flush_cache, + .nlgroup = RTNLGRP_IPV6_RULE, + .policy = fib6_rule_policy, + .owner = THIS_MODULE, +-- +2.43.0 + diff --git a/queue-5.4/l2tp-fix-incorrect-parameter-validation-in-the-pppol.patch b/queue-5.4/l2tp-fix-incorrect-parameter-validation-in-the-pppol.patch new file mode 100644 index 00000000000..329875dbe92 --- /dev/null +++ b/queue-5.4/l2tp-fix-incorrect-parameter-validation-in-the-pppol.patch @@ -0,0 +1,47 @@ +From 56236f13f197fb299730bbfe7692339918458564 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Mar 2024 14:23:50 +0000 +Subject: l2tp: fix incorrect parameter validation in the pppol2tp_getsockopt() + function + +From: Gavrilov Ilia + +[ Upstream commit 955e9876ba4ee26eeaab1b13517f5b2c88e73d55 ] + +The 'len' variable can't be negative when assigned the result of +'min_t' because all 'min_t' parameters are cast to unsigned int, +and then the minimum one is chosen. + +To fix the logic, check 'len' as read from 'optlen', +where the types of relevant variables are (signed) int. + +Fixes: 3557baabf280 ("[L2TP]: PPP over L2TP driver core") +Reviewed-by: Tom Parkin +Signed-off-by: Gavrilov Ilia +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/l2tp/l2tp_ppp.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c +index c54cb59593ef8..7d3c782e5ab1e 100644 +--- a/net/l2tp/l2tp_ppp.c ++++ b/net/l2tp/l2tp_ppp.c +@@ -1375,11 +1375,11 @@ static int pppol2tp_getsockopt(struct socket *sock, int level, int optname, + if (get_user(len, optlen)) + return -EFAULT; + +- len = min_t(unsigned int, len, sizeof(int)); +- + if (len < 0) + return -EINVAL; + ++ len = min_t(unsigned int, len, sizeof(int)); ++ + err = -ENOTCONN; + if (sk->sk_user_data == NULL) + goto end; +-- +2.43.0 + diff --git a/queue-5.4/media-dvb-frontends-avoid-stack-overflow-warnings-wi.patch b/queue-5.4/media-dvb-frontends-avoid-stack-overflow-warnings-wi.patch new file mode 100644 index 00000000000..b37b7e9aa3e --- /dev/null +++ b/queue-5.4/media-dvb-frontends-avoid-stack-overflow-warnings-wi.patch @@ -0,0 +1,95 @@ +From 5cc13a131820358d156987a38742a486ae5ed252 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 16 Feb 2024 17:31:44 +0100 +Subject: media: dvb-frontends: avoid stack overflow warnings with clang + +From: Arnd Bergmann + +[ Upstream commit 7a4cf27d1f0538f779bf31b8c99eda394e277119 ] + +A previous patch worked around a KASAN issue in stv0367, now a similar +problem showed up with clang: + +drivers/media/dvb-frontends/stv0367.c:1222:12: error: stack frame size (3624) exceeds limit (2048) in 'stv0367ter_set_frontend' [-Werror,-Wframe-larger-than] + 1214 | static int stv0367ter_set_frontend(struct dvb_frontend *fe) + +Rework the stv0367_writereg() function to be simpler and mark both +register access functions as noinline_for_stack so the temporary +i2c_msg structures do not get duplicated on the stack when KASAN_STACK +is enabled. + +Fixes: 3cd890dbe2a4 ("media: dvb-frontends: fix i2c access helpers for KASAN") +Signed-off-by: Arnd Bergmann +Reviewed-by: Justin Stitt +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/dvb-frontends/stv0367.c | 34 +++++++-------------------- + 1 file changed, 8 insertions(+), 26 deletions(-) + +diff --git a/drivers/media/dvb-frontends/stv0367.c b/drivers/media/dvb-frontends/stv0367.c +index 0bfca1174e9e7..8cbae8235b174 100644 +--- a/drivers/media/dvb-frontends/stv0367.c ++++ b/drivers/media/dvb-frontends/stv0367.c +@@ -118,50 +118,32 @@ static const s32 stv0367cab_RF_LookUp2[RF_LOOKUP_TABLE2_SIZE][RF_LOOKUP_TABLE2_S + } + }; + +-static +-int stv0367_writeregs(struct stv0367_state *state, u16 reg, u8 *data, int len) ++static noinline_for_stack ++int stv0367_writereg(struct stv0367_state *state, u16 reg, u8 data) + { +- u8 buf[MAX_XFER_SIZE]; ++ u8 buf[3] = { MSB(reg), LSB(reg), data }; + struct i2c_msg msg = { + .addr = state->config->demod_address, + .flags = 0, + .buf = buf, +- .len = len + 2 ++ .len = 3, + }; + int ret; + +- if (2 + len > sizeof(buf)) { +- printk(KERN_WARNING +- "%s: i2c wr reg=%04x: len=%d is too big!\n", +- KBUILD_MODNAME, reg, len); +- return -EINVAL; +- } +- +- +- buf[0] = MSB(reg); +- buf[1] = LSB(reg); +- memcpy(buf + 2, data, len); +- + if (i2cdebug) + printk(KERN_DEBUG "%s: [%02x] %02x: %02x\n", __func__, +- state->config->demod_address, reg, buf[2]); ++ state->config->demod_address, reg, data); + + ret = i2c_transfer(state->i2c, &msg, 1); + if (ret != 1) + printk(KERN_ERR "%s: i2c write error! ([%02x] %02x: %02x)\n", +- __func__, state->config->demod_address, reg, buf[2]); ++ __func__, state->config->demod_address, reg, data); + + return (ret != 1) ? -EREMOTEIO : 0; + } + +-static int stv0367_writereg(struct stv0367_state *state, u16 reg, u8 data) +-{ +- u8 tmp = data; /* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */ +- +- return stv0367_writeregs(state, reg, &tmp, 1); +-} +- +-static u8 stv0367_readreg(struct stv0367_state *state, u16 reg) ++static noinline_for_stack ++u8 stv0367_readreg(struct stv0367_state *state, u16 reg) + { + u8 b0[] = { 0, 0 }; + u8 b1[] = { 0 }; +-- +2.43.0 + diff --git a/queue-5.4/media-edia-dvbdev-fix-a-use-after-free.patch b/queue-5.4/media-edia-dvbdev-fix-a-use-after-free.patch new file mode 100644 index 00000000000..41d8bd86daa --- /dev/null +++ b/queue-5.4/media-edia-dvbdev-fix-a-use-after-free.patch @@ -0,0 +1,84 @@ +From 4030eb4304f847a6a4f12962d4f6b25cad85ab2d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 3 Feb 2024 14:40:43 +0100 +Subject: media: edia: dvbdev: fix a use-after-free + +From: Zhipeng Lu + +[ Upstream commit 8c64f4cdf4e6cc5682c52523713af8c39c94e6d5 ] + +In dvb_register_device, *pdvbdev is set equal to dvbdev, which is freed +in several error-handling paths. However, *pdvbdev is not set to NULL +after dvbdev's deallocation, causing use-after-frees in many places, +for example, in the following call chain: + +budget_register + |-> dvb_dmxdev_init + |-> dvb_register_device + |-> dvb_dmxdev_release + |-> dvb_unregister_device + |-> dvb_remove_device + |-> dvb_device_put + |-> kref_put + +When calling dvb_unregister_device, dmxdev->dvbdev (i.e. *pdvbdev in +dvb_register_device) could point to memory that had been freed in +dvb_register_device. Thereafter, this pointer is transferred to +kref_put and triggering a use-after-free. + +Link: https://lore.kernel.org/linux-media/20240203134046.3120099-1-alexious@zju.edu.cn +Fixes: b61901024776 ("V4L/DVB (5244): Dvbdev: fix illegal re-usage of fileoperations struct") +Signed-off-by: Zhipeng Lu +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/dvb-core/dvbdev.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c +index e7cd7b13fc28c..d4d903a9dc31e 100644 +--- a/drivers/media/dvb-core/dvbdev.c ++++ b/drivers/media/dvb-core/dvbdev.c +@@ -504,6 +504,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, + dvbdevfops = kmemdup(template->fops, sizeof(*dvbdevfops), GFP_KERNEL); + if (!dvbdevfops) { + kfree(dvbdev); ++ *pdvbdev = NULL; + mutex_unlock(&dvbdev_register_lock); + return -ENOMEM; + } +@@ -512,6 +513,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, + if (!new_node) { + kfree(dvbdevfops); + kfree(dvbdev); ++ *pdvbdev = NULL; + mutex_unlock(&dvbdev_register_lock); + return -ENOMEM; + } +@@ -545,6 +547,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, + } + list_del (&dvbdev->list_head); + kfree(dvbdev); ++ *pdvbdev = NULL; + up_write(&minor_rwsem); + mutex_unlock(&dvbdev_register_lock); + return -EINVAL; +@@ -567,6 +570,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, + dvb_media_device_free(dvbdev); + list_del (&dvbdev->list_head); + kfree(dvbdev); ++ *pdvbdev = NULL; + mutex_unlock(&dvbdev_register_lock); + return ret; + } +@@ -585,6 +589,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, + dvb_media_device_free(dvbdev); + list_del (&dvbdev->list_head); + kfree(dvbdev); ++ *pdvbdev = NULL; + mutex_unlock(&dvbdev_register_lock); + return PTR_ERR(clsdev); + } +-- +2.43.0 + diff --git a/queue-5.4/media-em28xx-annotate-unchecked-call-to-media_device.patch b/queue-5.4/media-em28xx-annotate-unchecked-call-to-media_device.patch new file mode 100644 index 00000000000..fbdea880798 --- /dev/null +++ b/queue-5.4/media-em28xx-annotate-unchecked-call-to-media_device.patch @@ -0,0 +1,42 @@ +From c0c7de7f1b2cd5c0ffd115dbcda131e6d9c7a318 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Jan 2024 05:42:26 -0800 +Subject: media: em28xx: annotate unchecked call to media_device_register() + +From: Nikita Zhandarovich + +[ Upstream commit fd61d77a3d28444b2635f0c8b5a2ecd6a4d94026 ] + +Static analyzers generate alerts for an unchecked call to +`media_device_register()`. However, in this case, the device will work +reliably without the media controller API. + +Add a comment above the call to prevent future unnecessary changes. + +Suggested-by: Mauro Carvalho Chehab +Fixes: 37ecc7b1278f ("[media] em28xx: add media controller support") +Signed-off-by: Nikita Zhandarovich +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/usb/em28xx/em28xx-cards.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c +index 5ae13ee9272d5..252e463cc13b4 100644 +--- a/drivers/media/usb/em28xx/em28xx-cards.c ++++ b/drivers/media/usb/em28xx/em28xx-cards.c +@@ -3989,6 +3989,10 @@ static int em28xx_usb_probe(struct usb_interface *intf, + * topology will likely change after the load of the em28xx subdrivers. + */ + #ifdef CONFIG_MEDIA_CONTROLLER ++ /* ++ * No need to check the return value, the device will still be ++ * usable without media controller API. ++ */ + retval = media_device_register(dev->media_dev); + #endif + +-- +2.43.0 + diff --git a/queue-5.4/media-go7007-add-check-of-return-value-of-go7007_rea.patch b/queue-5.4/media-go7007-add-check-of-return-value-of-go7007_rea.patch new file mode 100644 index 00000000000..ea13616d6f6 --- /dev/null +++ b/queue-5.4/media-go7007-add-check-of-return-value-of-go7007_rea.patch @@ -0,0 +1,40 @@ +From 205c2a88318e596031c3580bdd79cfab34cd690a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 11 Feb 2024 07:07:05 -0800 +Subject: media: go7007: add check of return value of go7007_read_addr() + +From: Daniil Dulov + +[ Upstream commit 0b70530ee740861f4776ff724fcc25023df1799a ] + +If go7007_read_addr() returns error channel is not assigned a value. +In this case go to allocfail. + +Found by Linux Verification Center (linuxtesting.org) with SVACE. + +Fixes: 866b8695d67e ("Staging: add the go7007 video driver") +Signed-off-by: Daniil Dulov +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/usb/go7007/go7007-usb.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/media/usb/go7007/go7007-usb.c b/drivers/media/usb/go7007/go7007-usb.c +index f889c9d740cd1..1cfe8371511d0 100644 +--- a/drivers/media/usb/go7007/go7007-usb.c ++++ b/drivers/media/usb/go7007/go7007-usb.c +@@ -1198,7 +1198,9 @@ static int go7007_usb_probe(struct usb_interface *intf, + u16 channel; + + /* read channel number from GPIO[1:0] */ +- go7007_read_addr(go, 0x3c81, &channel); ++ if (go7007_read_addr(go, 0x3c81, &channel)) ++ goto allocfail; ++ + channel &= 0x3; + go->board_id = GO7007_BOARDID_ADLINK_MPG24; + usb->board = board = &board_adlink_mpg24; +-- +2.43.0 + diff --git a/queue-5.4/media-go7007-fix-a-memleak-in-go7007_load_encoder.patch b/queue-5.4/media-go7007-fix-a-memleak-in-go7007_load_encoder.patch new file mode 100644 index 00000000000..7b95282a59f --- /dev/null +++ b/queue-5.4/media-go7007-fix-a-memleak-in-go7007_load_encoder.patch @@ -0,0 +1,57 @@ +From 8bc3e8e2bb55eecfeb77bff7ec16d021cd29269b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 21 Feb 2024 12:37:13 +0800 +Subject: media: go7007: fix a memleak in go7007_load_encoder + +From: Zhipeng Lu + +[ Upstream commit b9b683844b01d171a72b9c0419a2d760d946ee12 ] + +In go7007_load_encoder, bounce(i.e. go->boot_fw), is allocated without +a deallocation thereafter. After the following call chain: + +saa7134_go7007_init + |-> go7007_boot_encoder + |-> go7007_load_encoder + |-> kfree(go) + +go is freed and thus bounce is leaked. + +Fixes: 95ef39403f89 ("[media] go7007: remember boot firmware") +Signed-off-by: Zhipeng Lu +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/usb/go7007/go7007-driver.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/media/usb/go7007/go7007-driver.c b/drivers/media/usb/go7007/go7007-driver.c +index b9302d77d6c83..8ee0d5ea84157 100644 +--- a/drivers/media/usb/go7007/go7007-driver.c ++++ b/drivers/media/usb/go7007/go7007-driver.c +@@ -80,7 +80,7 @@ static int go7007_load_encoder(struct go7007 *go) + const struct firmware *fw_entry; + char fw_name[] = "go7007/go7007fw.bin"; + void *bounce; +- int fw_len, rv = 0; ++ int fw_len; + u16 intr_val, intr_data; + + if (go->boot_fw == NULL) { +@@ -109,9 +109,11 @@ static int go7007_load_encoder(struct go7007 *go) + go7007_read_interrupt(go, &intr_val, &intr_data) < 0 || + (intr_val & ~0x1) != 0x5a5a) { + v4l2_err(go, "error transferring firmware\n"); +- rv = -1; ++ kfree(go->boot_fw); ++ go->boot_fw = NULL; ++ return -1; + } +- return rv; ++ return 0; + } + + MODULE_FIRMWARE("go7007/go7007fw.bin"); +-- +2.43.0 + diff --git a/queue-5.4/media-imx-csc-scaler-fix-v4l2_ctrl_handler-memory-le.patch b/queue-5.4/media-imx-csc-scaler-fix-v4l2_ctrl_handler-memory-le.patch new file mode 100644 index 00000000000..07f781fd619 --- /dev/null +++ b/queue-5.4/media-imx-csc-scaler-fix-v4l2_ctrl_handler-memory-le.patch @@ -0,0 +1,35 @@ +From 48a984942ca0bc73eb1ee12581f08bac47c6406d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 31 Jan 2024 13:00:33 +0100 +Subject: media: imx: csc/scaler: fix v4l2_ctrl_handler memory leak + +From: Lucas Stach + +[ Upstream commit 4797a3dd46f220e6d83daf54d70c5b33db6deb01 ] + +Free the memory allocated in v4l2_ctrl_handler_init on release. + +Fixes: a8ef0488cc59 ("media: imx: add csc/scaler mem2mem device") +Signed-off-by: Lucas Stach +Reviewed-by: Philipp Zabel +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/staging/media/imx/imx-media-csc-scaler.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/staging/media/imx/imx-media-csc-scaler.c b/drivers/staging/media/imx/imx-media-csc-scaler.c +index a15d970adb983..135e1e64c2443 100644 +--- a/drivers/staging/media/imx/imx-media-csc-scaler.c ++++ b/drivers/staging/media/imx/imx-media-csc-scaler.c +@@ -800,6 +800,7 @@ static int ipu_csc_scaler_release(struct file *file) + + dev_dbg(priv->dev, "Releasing instance %p\n", ctx); + ++ v4l2_ctrl_handler_free(&ctx->ctrl_hdlr); + v4l2_m2m_ctx_release(ctx->fh.m2m_ctx); + v4l2_fh_del(&ctx->fh); + v4l2_fh_exit(&ctx->fh); +-- +2.43.0 + diff --git a/queue-5.4/media-media-pci-rename-vfl_type_grabber-to-_video.patch b/queue-5.4/media-media-pci-rename-vfl_type_grabber-to-_video.patch new file mode 100644 index 00000000000..ea63c247d08 --- /dev/null +++ b/queue-5.4/media-media-pci-rename-vfl_type_grabber-to-_video.patch @@ -0,0 +1,480 @@ +From 2b6c70927c2cce4b5db969466b24e20e57ce7ec4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 3 Feb 2020 12:41:17 +0100 +Subject: media: media/pci: rename VFL_TYPE_GRABBER to _VIDEO + +From: Hans Verkuil + +[ Upstream commit 3e30a927af3ca86f6556faf437da44ca8bcf54a4 ] + +'GRABBER' is a weird name, all other types map to the /dev +device names. Rename to 'VIDEO' to be consistent with the +other types. + +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Stable-dep-of: d0b07f712bf6 ("media: ttpci: fix two memleaks in budget_av_attach") +Signed-off-by: Sasha Levin +--- + drivers/media/pci/bt8xx/bttv-driver.c | 4 ++-- + drivers/media/pci/cobalt/cobalt-v4l2.c | 2 +- + drivers/media/pci/cx18/cx18-streams.c | 12 ++++++------ + drivers/media/pci/cx23885/cx23885-417.c | 2 +- + drivers/media/pci/cx23885/cx23885-video.c | 2 +- + drivers/media/pci/cx25821/cx25821-video.c | 2 +- + drivers/media/pci/cx88/cx88-blackbird.c | 2 +- + drivers/media/pci/cx88/cx88-video.c | 2 +- + drivers/media/pci/dt3155/dt3155.c | 2 +- + drivers/media/pci/intel/ipu3/ipu3-cio2.c | 2 +- + drivers/media/pci/ivtv/ivtv-streams.c | 12 ++++++------ + drivers/media/pci/meye/meye.c | 2 +- + drivers/media/pci/saa7134/saa7134-core.c | 2 +- + drivers/media/pci/saa7134/saa7134-empress.c | 2 +- + drivers/media/pci/saa7146/hexium_gemini.c | 2 +- + drivers/media/pci/saa7146/hexium_orion.c | 2 +- + drivers/media/pci/saa7146/mxb.c | 2 +- + drivers/media/pci/saa7164/saa7164-encoder.c | 2 +- + drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c | 2 +- + drivers/media/pci/solo6x10/solo6x10-v4l2.c | 2 +- + drivers/media/pci/sta2x11/sta2x11_vip.c | 2 +- + drivers/media/pci/ttpci/av7110_v4l.c | 2 +- + drivers/media/pci/ttpci/budget-av.c | 2 +- + drivers/media/pci/tw5864/tw5864-video.c | 2 +- + drivers/media/pci/tw68/tw68-video.c | 2 +- + drivers/media/pci/tw686x/tw686x-video.c | 2 +- + 26 files changed, 37 insertions(+), 37 deletions(-) + +diff --git a/drivers/media/pci/bt8xx/bttv-driver.c b/drivers/media/pci/bt8xx/bttv-driver.c +index a0be1ca89b29a..cdde56889fe2a 100644 +--- a/drivers/media/pci/bt8xx/bttv-driver.c ++++ b/drivers/media/pci/bt8xx/bttv-driver.c +@@ -2964,7 +2964,7 @@ static int bttv_open(struct file *file) + + dprintk("open dev=%s\n", video_device_node_name(vdev)); + +- if (vdev->vfl_type == VFL_TYPE_GRABBER) { ++ if (vdev->vfl_type == VFL_TYPE_VIDEO) { + type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + } else if (vdev->vfl_type == VFL_TYPE_VBI) { + type = V4L2_BUF_TYPE_VBI_CAPTURE; +@@ -3905,7 +3905,7 @@ static int bttv_register_video(struct bttv *btv) + if (no_overlay <= 0) + btv->video_dev.device_caps |= V4L2_CAP_VIDEO_OVERLAY; + +- if (video_register_device(&btv->video_dev, VFL_TYPE_GRABBER, ++ if (video_register_device(&btv->video_dev, VFL_TYPE_VIDEO, + video_nr[btv->c.nr]) < 0) + goto err; + pr_info("%d: registered device %s\n", +diff --git a/drivers/media/pci/cobalt/cobalt-v4l2.c b/drivers/media/pci/cobalt/cobalt-v4l2.c +index c5207501d5e03..0ff37496c9ab7 100644 +--- a/drivers/media/pci/cobalt/cobalt-v4l2.c ++++ b/drivers/media/pci/cobalt/cobalt-v4l2.c +@@ -1272,7 +1272,7 @@ static int cobalt_node_register(struct cobalt *cobalt, int node) + video_set_drvdata(vdev, s); + ret = vb2_queue_init(q); + if (!s->is_audio && ret == 0) +- ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1); ++ ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1); + else if (!s->is_dummy) + ret = cobalt_alsa_init(s); + +diff --git a/drivers/media/pci/cx18/cx18-streams.c b/drivers/media/pci/cx18/cx18-streams.c +index b79718519b9ba..3178df3c49224 100644 +--- a/drivers/media/pci/cx18/cx18-streams.c ++++ b/drivers/media/pci/cx18/cx18-streams.c +@@ -48,19 +48,19 @@ static struct { + } cx18_stream_info[] = { + { /* CX18_ENC_STREAM_TYPE_MPG */ + "encoder MPEG", +- VFL_TYPE_GRABBER, 0, ++ VFL_TYPE_VIDEO, 0, + PCI_DMA_FROMDEVICE, + V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE | + V4L2_CAP_AUDIO | V4L2_CAP_TUNER + }, + { /* CX18_ENC_STREAM_TYPE_TS */ + "TS", +- VFL_TYPE_GRABBER, -1, ++ VFL_TYPE_VIDEO, -1, + PCI_DMA_FROMDEVICE, + }, + { /* CX18_ENC_STREAM_TYPE_YUV */ + "encoder YUV", +- VFL_TYPE_GRABBER, CX18_V4L2_ENC_YUV_OFFSET, ++ VFL_TYPE_VIDEO, CX18_V4L2_ENC_YUV_OFFSET, + PCI_DMA_FROMDEVICE, + V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE | + V4L2_CAP_STREAMING | V4L2_CAP_AUDIO | V4L2_CAP_TUNER +@@ -74,13 +74,13 @@ static struct { + }, + { /* CX18_ENC_STREAM_TYPE_PCM */ + "encoder PCM audio", +- VFL_TYPE_GRABBER, CX18_V4L2_ENC_PCM_OFFSET, ++ VFL_TYPE_VIDEO, CX18_V4L2_ENC_PCM_OFFSET, + PCI_DMA_FROMDEVICE, + V4L2_CAP_TUNER | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE, + }, + { /* CX18_ENC_STREAM_TYPE_IDX */ + "encoder IDX", +- VFL_TYPE_GRABBER, -1, ++ VFL_TYPE_VIDEO, -1, + PCI_DMA_FROMDEVICE, + }, + { /* CX18_ENC_STREAM_TYPE_RAD */ +@@ -434,7 +434,7 @@ static int cx18_reg_dev(struct cx18 *cx, int type) + name = video_device_node_name(&s->video_dev); + + switch (vfl_type) { +- case VFL_TYPE_GRABBER: ++ case VFL_TYPE_VIDEO: + CX18_INFO("Registered device %s for %s (%d x %d.%02d kB)\n", + name, s->name, cx->stream_buffers[type], + cx->stream_buf_size[type] / 1024, +diff --git a/drivers/media/pci/cx23885/cx23885-417.c b/drivers/media/pci/cx23885/cx23885-417.c +index 2327fe6126102..434677bd4ad17 100644 +--- a/drivers/media/pci/cx23885/cx23885-417.c ++++ b/drivers/media/pci/cx23885/cx23885-417.c +@@ -1545,7 +1545,7 @@ int cx23885_417_register(struct cx23885_dev *dev) + if (dev->tuner_type != TUNER_ABSENT) + dev->v4l_device->device_caps |= V4L2_CAP_TUNER; + err = video_register_device(dev->v4l_device, +- VFL_TYPE_GRABBER, -1); ++ VFL_TYPE_VIDEO, -1); + if (err < 0) { + pr_info("%s: can't register mpeg device\n", dev->name); + return err; +diff --git a/drivers/media/pci/cx23885/cx23885-video.c b/drivers/media/pci/cx23885/cx23885-video.c +index f56b271db8bea..90224a9947022 100644 +--- a/drivers/media/pci/cx23885/cx23885-video.c ++++ b/drivers/media/pci/cx23885/cx23885-video.c +@@ -1304,7 +1304,7 @@ int cx23885_video_register(struct cx23885_dev *dev) + V4L2_CAP_AUDIO | V4L2_CAP_VIDEO_CAPTURE; + if (dev->tuner_type != TUNER_ABSENT) + dev->video_dev->device_caps |= V4L2_CAP_TUNER; +- err = video_register_device(dev->video_dev, VFL_TYPE_GRABBER, ++ err = video_register_device(dev->video_dev, VFL_TYPE_VIDEO, + video_nr[dev->nr]); + if (err < 0) { + pr_info("%s: can't register video device\n", +diff --git a/drivers/media/pci/cx25821/cx25821-video.c b/drivers/media/pci/cx25821/cx25821-video.c +index a10261da0db6e..1b80c990cb946 100644 +--- a/drivers/media/pci/cx25821/cx25821-video.c ++++ b/drivers/media/pci/cx25821/cx25821-video.c +@@ -757,7 +757,7 @@ int cx25821_video_register(struct cx25821_dev *dev) + snprintf(vdev->name, sizeof(vdev->name), "%s #%d", dev->name, i); + video_set_drvdata(vdev, chan); + +- err = video_register_device(vdev, VFL_TYPE_GRABBER, ++ err = video_register_device(vdev, VFL_TYPE_VIDEO, + video_nr[dev->nr]); + + if (err < 0) +diff --git a/drivers/media/pci/cx88/cx88-blackbird.c b/drivers/media/pci/cx88/cx88-blackbird.c +index d3da7f4297af8..fa4ca002ed191 100644 +--- a/drivers/media/pci/cx88/cx88-blackbird.c ++++ b/drivers/media/pci/cx88/cx88-blackbird.c +@@ -1138,7 +1138,7 @@ static int blackbird_register_video(struct cx8802_dev *dev) + V4L2_CAP_VIDEO_CAPTURE; + if (dev->core->board.tuner_type != UNSET) + dev->mpeg_dev.device_caps |= V4L2_CAP_TUNER; +- err = video_register_device(&dev->mpeg_dev, VFL_TYPE_GRABBER, -1); ++ err = video_register_device(&dev->mpeg_dev, VFL_TYPE_VIDEO, -1); + if (err < 0) { + pr_info("can't register mpeg device\n"); + return err; +diff --git a/drivers/media/pci/cx88/cx88-video.c b/drivers/media/pci/cx88/cx88-video.c +index 547e18da1ad7d..151ffb5fd4042 100644 +--- a/drivers/media/pci/cx88/cx88-video.c ++++ b/drivers/media/pci/cx88/cx88-video.c +@@ -1452,7 +1452,7 @@ static int cx8800_initdev(struct pci_dev *pci_dev, + V4L2_CAP_VIDEO_CAPTURE; + if (core->board.tuner_type != UNSET) + dev->video_dev.device_caps |= V4L2_CAP_TUNER; +- err = video_register_device(&dev->video_dev, VFL_TYPE_GRABBER, ++ err = video_register_device(&dev->video_dev, VFL_TYPE_VIDEO, + video_nr[core->nr]); + if (err < 0) { + pr_err("can't register video device\n"); +diff --git a/drivers/media/pci/dt3155/dt3155.c b/drivers/media/pci/dt3155/dt3155.c +index 7480f0d3ad0fa..82581aa5a2a39 100644 +--- a/drivers/media/pci/dt3155/dt3155.c ++++ b/drivers/media/pci/dt3155/dt3155.c +@@ -550,7 +550,7 @@ static int dt3155_probe(struct pci_dev *pdev, const struct pci_device_id *id) + IRQF_SHARED, DT3155_NAME, pd); + if (err) + goto err_iounmap; +- err = video_register_device(&pd->vdev, VFL_TYPE_GRABBER, -1); ++ err = video_register_device(&pd->vdev, VFL_TYPE_VIDEO, -1); + if (err) + goto err_free_irq; + dev_info(&pdev->dev, "/dev/video%i is ready\n", pd->vdev.minor); +diff --git a/drivers/media/pci/intel/ipu3/ipu3-cio2.c b/drivers/media/pci/intel/ipu3/ipu3-cio2.c +index 9c0d117e093b1..385b20b22ac35 100644 +--- a/drivers/media/pci/intel/ipu3/ipu3-cio2.c ++++ b/drivers/media/pci/intel/ipu3/ipu3-cio2.c +@@ -1651,7 +1651,7 @@ static int cio2_queue_init(struct cio2_device *cio2, struct cio2_queue *q) + vdev->queue = &q->vbq; + vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE_MPLANE | V4L2_CAP_STREAMING; + video_set_drvdata(vdev, cio2); +- r = video_register_device(vdev, VFL_TYPE_GRABBER, -1); ++ r = video_register_device(vdev, VFL_TYPE_VIDEO, -1); + if (r) { + dev_err(&cio2->pci_dev->dev, + "failed to register video device (%d)\n", r); +diff --git a/drivers/media/pci/ivtv/ivtv-streams.c b/drivers/media/pci/ivtv/ivtv-streams.c +index 200d2100dbffd..f9de5d1605fe3 100644 +--- a/drivers/media/pci/ivtv/ivtv-streams.c ++++ b/drivers/media/pci/ivtv/ivtv-streams.c +@@ -99,7 +99,7 @@ static struct { + } ivtv_stream_info[] = { + { /* IVTV_ENC_STREAM_TYPE_MPG */ + "encoder MPG", +- VFL_TYPE_GRABBER, 0, ++ VFL_TYPE_VIDEO, 0, + PCI_DMA_FROMDEVICE, 0, + V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER | + V4L2_CAP_AUDIO | V4L2_CAP_READWRITE, +@@ -107,7 +107,7 @@ static struct { + }, + { /* IVTV_ENC_STREAM_TYPE_YUV */ + "encoder YUV", +- VFL_TYPE_GRABBER, IVTV_V4L2_ENC_YUV_OFFSET, ++ VFL_TYPE_VIDEO, IVTV_V4L2_ENC_YUV_OFFSET, + PCI_DMA_FROMDEVICE, 0, + V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER | + V4L2_CAP_AUDIO | V4L2_CAP_READWRITE, +@@ -123,7 +123,7 @@ static struct { + }, + { /* IVTV_ENC_STREAM_TYPE_PCM */ + "encoder PCM", +- VFL_TYPE_GRABBER, IVTV_V4L2_ENC_PCM_OFFSET, ++ VFL_TYPE_VIDEO, IVTV_V4L2_ENC_PCM_OFFSET, + PCI_DMA_FROMDEVICE, 0, + V4L2_CAP_TUNER | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE, + &ivtv_v4l2_enc_fops +@@ -137,7 +137,7 @@ static struct { + }, + { /* IVTV_DEC_STREAM_TYPE_MPG */ + "decoder MPG", +- VFL_TYPE_GRABBER, IVTV_V4L2_DEC_MPG_OFFSET, ++ VFL_TYPE_VIDEO, IVTV_V4L2_DEC_MPG_OFFSET, + PCI_DMA_TODEVICE, 0, + V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE, + &ivtv_v4l2_dec_fops +@@ -158,7 +158,7 @@ static struct { + }, + { /* IVTV_DEC_STREAM_TYPE_YUV */ + "decoder YUV", +- VFL_TYPE_GRABBER, IVTV_V4L2_DEC_YUV_OFFSET, ++ VFL_TYPE_VIDEO, IVTV_V4L2_DEC_YUV_OFFSET, + PCI_DMA_TODEVICE, 0, + V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE, + &ivtv_v4l2_dec_fops +@@ -315,7 +315,7 @@ static int ivtv_reg_dev(struct ivtv *itv, int type) + name = video_device_node_name(&s->vdev); + + switch (vfl_type) { +- case VFL_TYPE_GRABBER: ++ case VFL_TYPE_VIDEO: + IVTV_INFO("Registered device %s for %s (%d kB)\n", + name, s->name, itv->options.kilobytes[type]); + break; +diff --git a/drivers/media/pci/meye/meye.c b/drivers/media/pci/meye/meye.c +index 0e61c81356ef5..c42e48bc5c1cb 100644 +--- a/drivers/media/pci/meye/meye.c ++++ b/drivers/media/pci/meye/meye.c +@@ -1711,7 +1711,7 @@ static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent) + v4l2_ctrl_handler_setup(&meye.hdl); + meye.vdev.ctrl_handler = &meye.hdl; + +- if (video_register_device(&meye.vdev, VFL_TYPE_GRABBER, ++ if (video_register_device(&meye.vdev, VFL_TYPE_VIDEO, + video_nr) < 0) { + v4l2_err(v4l2_dev, "video_register_device failed\n"); + goto outvideoreg; +diff --git a/drivers/media/pci/saa7134/saa7134-core.c b/drivers/media/pci/saa7134/saa7134-core.c +index 2d582c02adbf9..e4623ed2f8319 100644 +--- a/drivers/media/pci/saa7134/saa7134-core.c ++++ b/drivers/media/pci/saa7134/saa7134-core.c +@@ -1214,7 +1214,7 @@ static int saa7134_initdev(struct pci_dev *pci_dev, + if (saa7134_no_overlay <= 0) + dev->video_dev->device_caps |= V4L2_CAP_VIDEO_OVERLAY; + +- err = video_register_device(dev->video_dev,VFL_TYPE_GRABBER, ++ err = video_register_device(dev->video_dev,VFL_TYPE_VIDEO, + video_nr[dev->nr]); + if (err < 0) { + pr_info("%s: can't register video device\n", +diff --git a/drivers/media/pci/saa7134/saa7134-empress.c b/drivers/media/pci/saa7134/saa7134-empress.c +index e2666d1c68964..141ee18ed827e 100644 +--- a/drivers/media/pci/saa7134/saa7134-empress.c ++++ b/drivers/media/pci/saa7134/saa7134-empress.c +@@ -294,7 +294,7 @@ static int empress_init(struct saa7134_dev *dev) + dev->empress_dev->device_caps |= V4L2_CAP_TUNER; + + video_set_drvdata(dev->empress_dev, dev); +- err = video_register_device(dev->empress_dev,VFL_TYPE_GRABBER, ++ err = video_register_device(dev->empress_dev,VFL_TYPE_VIDEO, + empress_nr[dev->nr]); + if (err < 0) { + pr_info("%s: can't register video device\n", +diff --git a/drivers/media/pci/saa7146/hexium_gemini.c b/drivers/media/pci/saa7146/hexium_gemini.c +index 86d4e2abed82a..3947701cd6c7e 100644 +--- a/drivers/media/pci/saa7146/hexium_gemini.c ++++ b/drivers/media/pci/saa7146/hexium_gemini.c +@@ -294,7 +294,7 @@ static int hexium_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_d + vv_data.vid_ops.vidioc_enum_input = vidioc_enum_input; + vv_data.vid_ops.vidioc_g_input = vidioc_g_input; + vv_data.vid_ops.vidioc_s_input = vidioc_s_input; +- ret = saa7146_register_device(&hexium->video_dev, dev, "hexium gemini", VFL_TYPE_GRABBER); ++ ret = saa7146_register_device(&hexium->video_dev, dev, "hexium gemini", VFL_TYPE_VIDEO); + if (ret < 0) { + pr_err("cannot register capture v4l2 device. skipping.\n"); + saa7146_vv_release(dev); +diff --git a/drivers/media/pci/saa7146/hexium_orion.c b/drivers/media/pci/saa7146/hexium_orion.c +index 31388597386aa..2eb4bee16b71f 100644 +--- a/drivers/media/pci/saa7146/hexium_orion.c ++++ b/drivers/media/pci/saa7146/hexium_orion.c +@@ -368,7 +368,7 @@ static int hexium_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_d + vv_data.vid_ops.vidioc_enum_input = vidioc_enum_input; + vv_data.vid_ops.vidioc_g_input = vidioc_g_input; + vv_data.vid_ops.vidioc_s_input = vidioc_s_input; +- if (0 != saa7146_register_device(&hexium->video_dev, dev, "hexium orion", VFL_TYPE_GRABBER)) { ++ if (0 != saa7146_register_device(&hexium->video_dev, dev, "hexium orion", VFL_TYPE_VIDEO)) { + pr_err("cannot register capture v4l2 device. skipping.\n"); + return -1; + } +diff --git a/drivers/media/pci/saa7146/mxb.c b/drivers/media/pci/saa7146/mxb.c +index 58fe4c1619eeb..bf0b9b0914cd5 100644 +--- a/drivers/media/pci/saa7146/mxb.c ++++ b/drivers/media/pci/saa7146/mxb.c +@@ -714,7 +714,7 @@ static int mxb_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_data + vv_data.vid_ops.vidioc_g_register = vidioc_g_register; + vv_data.vid_ops.vidioc_s_register = vidioc_s_register; + #endif +- if (saa7146_register_device(&mxb->video_dev, dev, "mxb", VFL_TYPE_GRABBER)) { ++ if (saa7146_register_device(&mxb->video_dev, dev, "mxb", VFL_TYPE_VIDEO)) { + ERR("cannot register capture v4l2 device. skipping.\n"); + saa7146_vv_release(dev); + return -1; +diff --git a/drivers/media/pci/saa7164/saa7164-encoder.c b/drivers/media/pci/saa7164/saa7164-encoder.c +index df494644b5b64..1d1d32e043f16 100644 +--- a/drivers/media/pci/saa7164/saa7164-encoder.c ++++ b/drivers/media/pci/saa7164/saa7164-encoder.c +@@ -1087,7 +1087,7 @@ int saa7164_encoder_register(struct saa7164_port *port) + v4l2_ctrl_handler_setup(hdl); + video_set_drvdata(port->v4l_device, port); + result = video_register_device(port->v4l_device, +- VFL_TYPE_GRABBER, -1); ++ VFL_TYPE_VIDEO, -1); + if (result < 0) { + printk(KERN_INFO "%s: can't register mpeg device\n", + dev->name); +diff --git a/drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c b/drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c +index 476d7f3b32d63..cbf85231b708f 100644 +--- a/drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c ++++ b/drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c +@@ -1304,7 +1304,7 @@ static struct solo_enc_dev *solo_enc_alloc(struct solo_dev *solo_dev, + solo_enc->vfd->queue = &solo_enc->vidq; + solo_enc->vfd->lock = &solo_enc->lock; + video_set_drvdata(solo_enc->vfd, solo_enc); +- ret = video_register_device(solo_enc->vfd, VFL_TYPE_GRABBER, nr); ++ ret = video_register_device(solo_enc->vfd, VFL_TYPE_VIDEO, nr); + if (ret < 0) + goto vdev_release; + +diff --git a/drivers/media/pci/solo6x10/solo6x10-v4l2.c b/drivers/media/pci/solo6x10/solo6x10-v4l2.c +index 78792067e920f..54434f3c428d0 100644 +--- a/drivers/media/pci/solo6x10/solo6x10-v4l2.c ++++ b/drivers/media/pci/solo6x10/solo6x10-v4l2.c +@@ -692,7 +692,7 @@ int solo_v4l2_init(struct solo_dev *solo_dev, unsigned nr) + while (erase_off(solo_dev)) + /* Do nothing */; + +- ret = video_register_device(solo_dev->vfd, VFL_TYPE_GRABBER, nr); ++ ret = video_register_device(solo_dev->vfd, VFL_TYPE_VIDEO, nr); + if (ret < 0) + goto fail; + +diff --git a/drivers/media/pci/sta2x11/sta2x11_vip.c b/drivers/media/pci/sta2x11/sta2x11_vip.c +index fd3de3bb0c89b..798574cfad35e 100644 +--- a/drivers/media/pci/sta2x11/sta2x11_vip.c ++++ b/drivers/media/pci/sta2x11/sta2x11_vip.c +@@ -1069,7 +1069,7 @@ static int sta2x11_vip_init_one(struct pci_dev *pdev, + vip->video_dev.lock = &vip->v4l_lock; + video_set_drvdata(&vip->video_dev, vip); + +- ret = video_register_device(&vip->video_dev, VFL_TYPE_GRABBER, -1); ++ ret = video_register_device(&vip->video_dev, VFL_TYPE_VIDEO, -1); + if (ret) + goto vrelease; + +diff --git a/drivers/media/pci/ttpci/av7110_v4l.c b/drivers/media/pci/ttpci/av7110_v4l.c +index f3d6c3cdb8721..cabe006658ddb 100644 +--- a/drivers/media/pci/ttpci/av7110_v4l.c ++++ b/drivers/media/pci/ttpci/av7110_v4l.c +@@ -831,7 +831,7 @@ int av7110_init_v4l(struct av7110 *av7110) + if (FW_VERSION(av7110->arm_app) < 0x2623) + vv_data->capabilities &= ~V4L2_CAP_SLICED_VBI_OUTPUT; + +- if (saa7146_register_device(&av7110->v4l_dev, dev, "av7110", VFL_TYPE_GRABBER)) { ++ if (saa7146_register_device(&av7110->v4l_dev, dev, "av7110", VFL_TYPE_VIDEO)) { + ERR("cannot register capture device. skipping\n"); + saa7146_vv_release(dev); + return -ENODEV; +diff --git a/drivers/media/pci/ttpci/budget-av.c b/drivers/media/pci/ttpci/budget-av.c +index e2d482af23677..38cac508bd728 100644 +--- a/drivers/media/pci/ttpci/budget-av.c ++++ b/drivers/media/pci/ttpci/budget-av.c +@@ -1470,7 +1470,7 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio + vv_data.vid_ops.vidioc_g_input = vidioc_g_input; + vv_data.vid_ops.vidioc_s_input = vidioc_s_input; + +- if ((err = saa7146_register_device(&budget_av->vd, dev, "knc1", VFL_TYPE_GRABBER))) { ++ if ((err = saa7146_register_device(&budget_av->vd, dev, "knc1", VFL_TYPE_VIDEO))) { + /* fixme: proper cleanup here */ + ERR("cannot register capture v4l2 device\n"); + saa7146_vv_release(dev); +diff --git a/drivers/media/pci/tw5864/tw5864-video.c b/drivers/media/pci/tw5864/tw5864-video.c +index 656142c7a2cc7..a65114e7ca346 100644 +--- a/drivers/media/pci/tw5864/tw5864-video.c ++++ b/drivers/media/pci/tw5864/tw5864-video.c +@@ -1162,7 +1162,7 @@ static int tw5864_video_input_init(struct tw5864_input *input, int video_nr) + input->gop = GOP_SIZE; + input->frame_interval = 1; + +- ret = video_register_device(&input->vdev, VFL_TYPE_GRABBER, video_nr); ++ ret = video_register_device(&input->vdev, VFL_TYPE_VIDEO, video_nr); + if (ret) + goto free_v4l2_hdl; + +diff --git a/drivers/media/pci/tw68/tw68-video.c b/drivers/media/pci/tw68/tw68-video.c +index 2fb82d50c53e5..10986fcd66a55 100644 +--- a/drivers/media/pci/tw68/tw68-video.c ++++ b/drivers/media/pci/tw68/tw68-video.c +@@ -962,7 +962,7 @@ int tw68_video_init2(struct tw68_dev *dev, int video_nr) + dev->vdev.lock = &dev->lock; + dev->vdev.queue = &dev->vidq; + video_set_drvdata(&dev->vdev, dev); +- return video_register_device(&dev->vdev, VFL_TYPE_GRABBER, video_nr); ++ return video_register_device(&dev->vdev, VFL_TYPE_VIDEO, video_nr); + } + + /* +diff --git a/drivers/media/pci/tw686x/tw686x-video.c b/drivers/media/pci/tw686x/tw686x-video.c +index 9be8c6e4fb693..1ced2b0ddb241 100644 +--- a/drivers/media/pci/tw686x/tw686x-video.c ++++ b/drivers/media/pci/tw686x/tw686x-video.c +@@ -1282,7 +1282,7 @@ int tw686x_video_init(struct tw686x_dev *dev) + vc->device = vdev; + video_set_drvdata(vdev, vc); + +- err = video_register_device(vdev, VFL_TYPE_GRABBER, -1); ++ err = video_register_device(vdev, VFL_TYPE_VIDEO, -1); + if (err < 0) + goto error; + vc->num = vdev->num; +-- +2.43.0 + diff --git a/queue-5.4/media-pvrusb2-fix-pvr2_stream_callback-casts.patch b/queue-5.4/media-pvrusb2-fix-pvr2_stream_callback-casts.patch new file mode 100644 index 00000000000..7cbc1efc338 --- /dev/null +++ b/queue-5.4/media-pvrusb2-fix-pvr2_stream_callback-casts.patch @@ -0,0 +1,115 @@ +From 6a5d916ce342323a2aa640312f993489793cb842 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 13 Feb 2024 11:04:27 +0100 +Subject: media: pvrusb2: fix pvr2_stream_callback casts + +From: Arnd Bergmann + +[ Upstream commit 30baa4a96b23add91a87305baaeba82c4e109e1f ] + +clang-16 complains about a control flow integrity (KCFI) issue in pvrusb2, +which casts three different prototypes into pvr2_stream_callback: + +drivers/media/usb/pvrusb2/pvrusb2-v4l2.c:1070:30: error: cast from 'void (*)(struct pvr2_v4l2_fh *)' to 'pvr2_stream_callback' (aka 'void (*)(void *)') converts to incompatible function type [-Werror,-Wcast-function-type-strict] + 1070 | pvr2_stream_set_callback(sp,(pvr2_stream_callback)pvr2_v4l2_notify,fh); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +drivers/media/usb/pvrusb2/pvrusb2-context.c:110:6: error: cast from 'void (*)(struct pvr2_context *)' to 'void (*)(void *)' converts to incompatible function type [-Werror,-Wcast-function-type-strict] + 110 | (void (*)(void *))pvr2_context_notify, + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +drivers/media/usb/pvrusb2/pvrusb2-dvb.c:152:6: error: cast from 'void (*)(struct pvr2_dvb_adapter *)' to 'pvr2_stream_callback' (aka 'void (*)(void *)') converts to incompatible function type [-Werror,-Wcast-function-type-strict] + 152 | (pvr2_stream_callback) pvr2_dvb_notify, adap); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Change the functions to actually take a void* argument so the cast is no longer +needed. + +Fixes: bb8ce9d9143c ("V4L/DVB (7682): pvrusb2-dvb: finish up stream & buffer handling") +Signed-off-by: Arnd Bergmann +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/usb/pvrusb2/pvrusb2-context.c | 8 ++++---- + drivers/media/usb/pvrusb2/pvrusb2-dvb.c | 6 ++++-- + drivers/media/usb/pvrusb2/pvrusb2-v4l2.c | 6 ++++-- + 3 files changed, 12 insertions(+), 8 deletions(-) + +diff --git a/drivers/media/usb/pvrusb2/pvrusb2-context.c b/drivers/media/usb/pvrusb2/pvrusb2-context.c +index 1764674de98bc..58f2f3ff10ee2 100644 +--- a/drivers/media/usb/pvrusb2/pvrusb2-context.c ++++ b/drivers/media/usb/pvrusb2/pvrusb2-context.c +@@ -90,8 +90,10 @@ static void pvr2_context_destroy(struct pvr2_context *mp) + } + + +-static void pvr2_context_notify(struct pvr2_context *mp) ++static void pvr2_context_notify(void *ptr) + { ++ struct pvr2_context *mp = ptr; ++ + pvr2_context_set_notify(mp,!0); + } + +@@ -106,9 +108,7 @@ static void pvr2_context_check(struct pvr2_context *mp) + pvr2_trace(PVR2_TRACE_CTXT, + "pvr2_context %p (initialize)", mp); + /* Finish hardware initialization */ +- if (pvr2_hdw_initialize(mp->hdw, +- (void (*)(void *))pvr2_context_notify, +- mp)) { ++ if (pvr2_hdw_initialize(mp->hdw, pvr2_context_notify, mp)) { + mp->video_stream.stream = + pvr2_hdw_get_video_stream(mp->hdw); + /* Trigger interface initialization. By doing this +diff --git a/drivers/media/usb/pvrusb2/pvrusb2-dvb.c b/drivers/media/usb/pvrusb2/pvrusb2-dvb.c +index 6954584526a32..1b768e7466721 100644 +--- a/drivers/media/usb/pvrusb2/pvrusb2-dvb.c ++++ b/drivers/media/usb/pvrusb2/pvrusb2-dvb.c +@@ -88,8 +88,10 @@ static int pvr2_dvb_feed_thread(void *data) + return stat; + } + +-static void pvr2_dvb_notify(struct pvr2_dvb_adapter *adap) ++static void pvr2_dvb_notify(void *ptr) + { ++ struct pvr2_dvb_adapter *adap = ptr; ++ + wake_up(&adap->buffer_wait_data); + } + +@@ -149,7 +151,7 @@ static int pvr2_dvb_stream_do_start(struct pvr2_dvb_adapter *adap) + } + + pvr2_stream_set_callback(pvr->video_stream.stream, +- (pvr2_stream_callback) pvr2_dvb_notify, adap); ++ pvr2_dvb_notify, adap); + + ret = pvr2_stream_set_buffer_count(stream, PVR2_DVB_BUFFER_COUNT); + if (ret < 0) return ret; +diff --git a/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c b/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c +index d79b4083c9d4a..f8da501689c32 100644 +--- a/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c ++++ b/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c +@@ -1037,8 +1037,10 @@ static int pvr2_v4l2_open(struct file *file) + } + + +-static void pvr2_v4l2_notify(struct pvr2_v4l2_fh *fhp) ++static void pvr2_v4l2_notify(void *ptr) + { ++ struct pvr2_v4l2_fh *fhp = ptr; ++ + wake_up(&fhp->wait_data); + } + +@@ -1071,7 +1073,7 @@ static int pvr2_v4l2_iosetup(struct pvr2_v4l2_fh *fh) + + hdw = fh->channel.mc_head->hdw; + sp = fh->pdi->stream->stream; +- pvr2_stream_set_callback(sp,(pvr2_stream_callback)pvr2_v4l2_notify,fh); ++ pvr2_stream_set_callback(sp, pvr2_v4l2_notify, fh); + pvr2_hdw_set_stream_type(hdw,fh->pdi->config); + if ((ret = pvr2_hdw_set_streaming(hdw,!0)) < 0) return ret; + return pvr2_ioread_set_enabled(fh->rhp,!0); +-- +2.43.0 + diff --git a/queue-5.4/media-pvrusb2-fix-uaf-in-pvr2_context_set_notify.patch b/queue-5.4/media-pvrusb2-fix-uaf-in-pvr2_context_set_notify.patch new file mode 100644 index 00000000000..dd5e2ea6f21 --- /dev/null +++ b/queue-5.4/media-pvrusb2-fix-uaf-in-pvr2_context_set_notify.patch @@ -0,0 +1,75 @@ +From cf1355baa8f675bf956ddc579ae678db3d65107a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 16 Feb 2024 15:30:47 +0800 +Subject: media: pvrusb2: fix uaf in pvr2_context_set_notify + +From: Edward Adam Davis + +[ Upstream commit 0a0b79ea55de8514e1750884e5fec77f9fdd01ee ] + +[Syzbot reported] +BUG: KASAN: slab-use-after-free in pvr2_context_set_notify+0x2c4/0x310 drivers/media/usb/pvrusb2/pvrusb2-context.c:35 +Read of size 4 at addr ffff888113aeb0d8 by task kworker/1:1/26 + +CPU: 1 PID: 26 Comm: kworker/1:1 Not tainted 6.8.0-rc1-syzkaller-00046-gf1a27f081c1f #0 +Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/25/2024 +Workqueue: usb_hub_wq hub_event +Call Trace: + + __dump_stack lib/dump_stack.c:88 [inline] + dump_stack_lvl+0xd9/0x1b0 lib/dump_stack.c:106 + print_address_description mm/kasan/report.c:377 [inline] + print_report+0xc4/0x620 mm/kasan/report.c:488 + kasan_report+0xda/0x110 mm/kasan/report.c:601 + pvr2_context_set_notify+0x2c4/0x310 drivers/media/usb/pvrusb2/pvrusb2-context.c:35 + pvr2_context_notify drivers/media/usb/pvrusb2/pvrusb2-context.c:95 [inline] + pvr2_context_disconnect+0x94/0xb0 drivers/media/usb/pvrusb2/pvrusb2-context.c:272 + +Freed by task 906: +kasan_save_stack+0x33/0x50 mm/kasan/common.c:47 +kasan_save_track+0x14/0x30 mm/kasan/common.c:68 +kasan_save_free_info+0x3f/0x60 mm/kasan/generic.c:640 +poison_slab_object mm/kasan/common.c:241 [inline] +__kasan_slab_free+0x106/0x1b0 mm/kasan/common.c:257 +kasan_slab_free include/linux/kasan.h:184 [inline] +slab_free_hook mm/slub.c:2121 [inline] +slab_free mm/slub.c:4299 [inline] +kfree+0x105/0x340 mm/slub.c:4409 +pvr2_context_check drivers/media/usb/pvrusb2/pvrusb2-context.c:137 [inline] +pvr2_context_thread_func+0x69d/0x960 drivers/media/usb/pvrusb2/pvrusb2-context.c:158 + +[Analyze] +Task A set disconnect_flag = !0, which resulted in Task B's condition being met +and releasing mp, leading to this issue. + +[Fix] +Place the disconnect_flag assignment operation after all code in pvr2_context_disconnect() +to avoid this issue. + +Reported-and-tested-by: syzbot+ce750e124675d4599449@syzkaller.appspotmail.com +Fixes: e5be15c63804 ("V4L/DVB (7711): pvrusb2: Fix race on module unload") +Signed-off-by: Edward Adam Davis +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/usb/pvrusb2/pvrusb2-context.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/media/usb/pvrusb2/pvrusb2-context.c b/drivers/media/usb/pvrusb2/pvrusb2-context.c +index 58f2f3ff10ee2..73c95ba2328a4 100644 +--- a/drivers/media/usb/pvrusb2/pvrusb2-context.c ++++ b/drivers/media/usb/pvrusb2/pvrusb2-context.c +@@ -267,9 +267,9 @@ static void pvr2_context_exit(struct pvr2_context *mp) + void pvr2_context_disconnect(struct pvr2_context *mp) + { + pvr2_hdw_disconnect(mp->hdw); +- mp->disconnect_flag = !0; + if (!pvr2_context_shutok()) + pvr2_context_notify(mp); ++ mp->disconnect_flag = !0; + } + + +-- +2.43.0 + diff --git a/queue-5.4/media-pvrusb2-remove-redundant-null-check.patch b/queue-5.4/media-pvrusb2-remove-redundant-null-check.patch new file mode 100644 index 00000000000..456e31f44a4 --- /dev/null +++ b/queue-5.4/media-pvrusb2-remove-redundant-null-check.patch @@ -0,0 +1,41 @@ +From 76c9036b47d334161d05e97842d10a2abac24a47 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 11 Feb 2024 07:07:25 -0800 +Subject: media: pvrusb2: remove redundant NULL check + +From: Daniil Dulov + +[ Upstream commit 95ac1210fb2753f968ebce0730d4fbc553c2a3dc ] + +Pointer dip->stream cannot be NULL due to a shift, thus remove redundant +NULL check. + +Found by Linux Verification Center (linuxtesting.org) with SVACE. + +Fixes: c74e0062684b ("V4L/DVB (5059): Pvrusb2: Be smarter about mode restoration") +Signed-off-by: Daniil Dulov +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/usb/pvrusb2/pvrusb2-v4l2.c | 5 ----- + 1 file changed, 5 deletions(-) + +diff --git a/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c b/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c +index eaa08c7999d4f..d79b4083c9d4a 100644 +--- a/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c ++++ b/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c +@@ -1202,11 +1202,6 @@ static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip, + dip->minor_type = pvr2_v4l_type_video; + nr_ptr = video_nr; + caps |= V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_AUDIO; +- if (!dip->stream) { +- pr_err(KBUILD_MODNAME +- ": Failed to set up pvrusb2 v4l video dev due to missing stream instance\n"); +- return; +- } + break; + case VFL_TYPE_VBI: + dip->config = pvr2_config_vbi; +-- +2.43.0 + diff --git a/queue-5.4/media-rename-vfl_type_grabber-to-_video.patch b/queue-5.4/media-rename-vfl_type_grabber-to-_video.patch new file mode 100644 index 00000000000..354c8c1fd7b --- /dev/null +++ b/queue-5.4/media-rename-vfl_type_grabber-to-_video.patch @@ -0,0 +1,192 @@ +From 46e2188164265b1ca3e0b2790da559a5147d0a3d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 3 Feb 2020 12:41:09 +0100 +Subject: media: rename VFL_TYPE_GRABBER to _VIDEO + +From: Hans Verkuil + +[ Upstream commit 238e4a5baa361256ae1641ad9455bb2bb359273f ] + +We currently have the following devnode types: + +enum vfl_devnode_type { + VFL_TYPE_GRABBER = 0, + VFL_TYPE_VBI, + VFL_TYPE_RADIO, + VFL_TYPE_SUBDEV, + VFL_TYPE_SDR, + VFL_TYPE_TOUCH, + VFL_TYPE_MAX /* Shall be the last one */ +}; + +They all make sense, except for the first: GRABBER really refers to /dev/videoX +devices, which can be capture, output or m2m, so 'grabber' doesn't even refer to +their function anymore. + +Let's call a spade a spade and rename this to VFL_TYPE_VIDEO. + +Signed-off-by: Hans Verkuil +Acked-by: Sakari Ailus +Reviewed-by: Laurent Pinchart +Signed-off-by: Mauro Carvalho Chehab +Stable-dep-of: d0b07f712bf6 ("media: ttpci: fix two memleaks in budget_av_attach") +Signed-off-by: Sasha Levin +--- + Documentation/media/kapi/v4l2-dev.rst | 4 ++-- + .../translations/zh_CN/video4linux/v4l2-framework.txt | 4 ++-- + drivers/media/v4l2-core/v4l2-dev.c | 10 +++++----- + drivers/media/v4l2-core/v4l2-ioctl.c | 4 ++-- + include/media/v4l2-dev.h | 6 ++++-- + samples/v4l/v4l2-pci-skeleton.c | 2 +- + 6 files changed, 16 insertions(+), 14 deletions(-) + +diff --git a/Documentation/media/kapi/v4l2-dev.rst b/Documentation/media/kapi/v4l2-dev.rst +index 4c5a15c53dbfb..63c064837c008 100644 +--- a/Documentation/media/kapi/v4l2-dev.rst ++++ b/Documentation/media/kapi/v4l2-dev.rst +@@ -185,7 +185,7 @@ This will create the character device for you. + + .. code-block:: c + +- err = video_register_device(vdev, VFL_TYPE_GRABBER, -1); ++ err = video_register_device(vdev, VFL_TYPE_VIDEO, -1); + if (err) { + video_device_release(vdev); /* or kfree(my_vdev); */ + return err; +@@ -201,7 +201,7 @@ types exist: + ========================== ==================== ============================== + :c:type:`vfl_devnode_type` Device name Usage + ========================== ==================== ============================== +-``VFL_TYPE_GRABBER`` ``/dev/videoX`` for video input/output devices ++``VFL_TYPE_VIDEO`` ``/dev/videoX`` for video input/output devices + ``VFL_TYPE_VBI`` ``/dev/vbiX`` for vertical blank data (i.e. + closed captions, teletext) + ``VFL_TYPE_RADIO`` ``/dev/radioX`` for radio tuners +diff --git a/Documentation/translations/zh_CN/video4linux/v4l2-framework.txt b/Documentation/translations/zh_CN/video4linux/v4l2-framework.txt +index 66c7c568bd866..9c39ee58ea507 100644 +--- a/Documentation/translations/zh_CN/video4linux/v4l2-framework.txt ++++ b/Documentation/translations/zh_CN/video4linux/v4l2-framework.txt +@@ -649,7 +649,7 @@ video_device注册 + + 接下来你需要注册视频设备:这会为你创建一个字符设备。 + +- err = video_register_device(vdev, VFL_TYPE_GRABBER, -1); ++ err = video_register_device(vdev, VFL_TYPE_VIDEO, -1); + if (err) { + video_device_release(vdev); /* or kfree(my_vdev); */ + return err; +@@ -660,7 +660,7 @@ video_device注册 + + 注册哪种设备是根据类型(type)参数。存在以下类型: + +-VFL_TYPE_GRABBER: 用于视频输入/输出设备的 videoX ++VFL_TYPE_VIDEO: 用于视频输入/输出设备的 videoX + VFL_TYPE_VBI: 用于垂直消隐数据的 vbiX (例如,隐藏式字幕,图文电视) + VFL_TYPE_RADIO: 用于广播调谐器的 radioX + +diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c +index 1bf543932e4f9..ddc861868ce08 100644 +--- a/drivers/media/v4l2-core/v4l2-dev.c ++++ b/drivers/media/v4l2-core/v4l2-dev.c +@@ -542,13 +542,13 @@ static void determine_valid_ioctls(struct video_device *vdev) + V4L2_CAP_META_OUTPUT; + DECLARE_BITMAP(valid_ioctls, BASE_VIDIOC_PRIVATE); + const struct v4l2_ioctl_ops *ops = vdev->ioctl_ops; +- bool is_vid = vdev->vfl_type == VFL_TYPE_GRABBER && ++ bool is_vid = vdev->vfl_type == VFL_TYPE_VIDEO && + (vdev->device_caps & vid_caps); + bool is_vbi = vdev->vfl_type == VFL_TYPE_VBI; + bool is_radio = vdev->vfl_type == VFL_TYPE_RADIO; + bool is_sdr = vdev->vfl_type == VFL_TYPE_SDR; + bool is_tch = vdev->vfl_type == VFL_TYPE_TOUCH; +- bool is_meta = vdev->vfl_type == VFL_TYPE_GRABBER && ++ bool is_meta = vdev->vfl_type == VFL_TYPE_VIDEO && + (vdev->device_caps & meta_caps); + bool is_rx = vdev->vfl_dir != VFL_DIR_TX; + bool is_tx = vdev->vfl_dir != VFL_DIR_RX; +@@ -777,7 +777,7 @@ static int video_register_media_controller(struct video_device *vdev) + vdev->entity.function = MEDIA_ENT_F_UNKNOWN; + + switch (vdev->vfl_type) { +- case VFL_TYPE_GRABBER: ++ case VFL_TYPE_VIDEO: + intf_type = MEDIA_INTF_T_V4L_VIDEO; + vdev->entity.function = MEDIA_ENT_F_IO_V4L; + break; +@@ -885,7 +885,7 @@ int __video_register_device(struct video_device *vdev, + + /* Part 1: check device type */ + switch (type) { +- case VFL_TYPE_GRABBER: ++ case VFL_TYPE_VIDEO: + name_base = "video"; + break; + case VFL_TYPE_VBI: +@@ -929,7 +929,7 @@ int __video_register_device(struct video_device *vdev, + * of 128-191 and just pick the first free minor there + * (new style). */ + switch (type) { +- case VFL_TYPE_GRABBER: ++ case VFL_TYPE_VIDEO: + minor_offset = 0; + minor_cnt = 64; + break; +diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c +index b8edef9160864..682ba53b1a7a7 100644 +--- a/drivers/media/v4l2-core/v4l2-ioctl.c ++++ b/drivers/media/v4l2-core/v4l2-ioctl.c +@@ -959,12 +959,12 @@ static int check_fmt(struct file *file, enum v4l2_buf_type type) + V4L2_CAP_META_OUTPUT; + struct video_device *vfd = video_devdata(file); + const struct v4l2_ioctl_ops *ops = vfd->ioctl_ops; +- bool is_vid = vfd->vfl_type == VFL_TYPE_GRABBER && ++ bool is_vid = vfd->vfl_type == VFL_TYPE_VIDEO && + (vfd->device_caps & vid_caps); + bool is_vbi = vfd->vfl_type == VFL_TYPE_VBI; + bool is_sdr = vfd->vfl_type == VFL_TYPE_SDR; + bool is_tch = vfd->vfl_type == VFL_TYPE_TOUCH; +- bool is_meta = vfd->vfl_type == VFL_TYPE_GRABBER && ++ bool is_meta = vfd->vfl_type == VFL_TYPE_VIDEO && + (vfd->device_caps & meta_caps); + bool is_rx = vfd->vfl_dir != VFL_DIR_TX; + bool is_tx = vfd->vfl_dir != VFL_DIR_RX; +diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h +index 48531e57cc5a8..5e7c0f8acd054 100644 +--- a/include/media/v4l2-dev.h ++++ b/include/media/v4l2-dev.h +@@ -24,7 +24,8 @@ + /** + * enum vfl_devnode_type - type of V4L2 device node + * +- * @VFL_TYPE_GRABBER: for video input/output devices ++ * @VFL_TYPE_VIDEO: for video input/output devices ++ * @VFL_TYPE_GRABBER: deprecated, same as VFL_TYPE_VIDEO + * @VFL_TYPE_VBI: for vertical blank data (i.e. closed captions, teletext) + * @VFL_TYPE_RADIO: for radio tuners + * @VFL_TYPE_SUBDEV: for V4L2 subdevices +@@ -33,7 +34,8 @@ + * @VFL_TYPE_MAX: number of VFL types, must always be last in the enum + */ + enum vfl_devnode_type { +- VFL_TYPE_GRABBER = 0, ++ VFL_TYPE_VIDEO, ++ VFL_TYPE_GRABBER = VFL_TYPE_VIDEO, + VFL_TYPE_VBI, + VFL_TYPE_RADIO, + VFL_TYPE_SUBDEV, +diff --git a/samples/v4l/v4l2-pci-skeleton.c b/samples/v4l/v4l2-pci-skeleton.c +index f6a551bd57ef1..3fa6582b4a689 100644 +--- a/samples/v4l/v4l2-pci-skeleton.c ++++ b/samples/v4l/v4l2-pci-skeleton.c +@@ -879,7 +879,7 @@ static int skeleton_probe(struct pci_dev *pdev, const struct pci_device_id *ent) + vdev->tvnorms = SKEL_TVNORMS; + video_set_drvdata(vdev, skel); + +- ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1); ++ ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1); + if (ret) + goto free_hdl; + +-- +2.43.0 + diff --git a/queue-5.4/media-tc358743-register-v4l2-async-device-only-after.patch b/queue-5.4/media-tc358743-register-v4l2-async-device-only-after.patch new file mode 100644 index 00000000000..cbeb62f875b --- /dev/null +++ b/queue-5.4/media-tc358743-register-v4l2-async-device-only-after.patch @@ -0,0 +1,51 @@ +From fe7c15668c765a9d97d65c61e01f4a88a6ecb397 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Jan 2024 10:01:11 +0100 +Subject: media: tc358743: register v4l2 async device only after successful + setup + +From: Alexander Stein + +[ Upstream commit 87399f1ff92203d65f1febf5919429f4bb613a02 ] + +Ensure the device has been setup correctly before registering the v4l2 +async device, thus allowing userspace to access. + +Signed-off-by: Alexander Stein +Reviewed-by: Robert Foss +Fixes: 4c5211a10039 ("[media] tc358743: register v4l2 asynchronous subdevice") +Signed-off-by: Robert Foss +Link: https://patchwork.freedesktop.org/patch/msgid/20240110090111.458115-1-alexander.stein@ew.tq-group.com +Signed-off-by: Sasha Levin +--- + drivers/media/i2c/tc358743.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/drivers/media/i2c/tc358743.c b/drivers/media/i2c/tc358743.c +index 76c443067ec2d..ef1460c61bea0 100644 +--- a/drivers/media/i2c/tc358743.c ++++ b/drivers/media/i2c/tc358743.c +@@ -2107,9 +2107,6 @@ static int tc358743_probe(struct i2c_client *client) + state->mbus_fmt_code = MEDIA_BUS_FMT_RGB888_1X24; + + sd->dev = &client->dev; +- err = v4l2_async_register_subdev(sd); +- if (err < 0) +- goto err_hdl; + + mutex_init(&state->confctl_mutex); + +@@ -2167,6 +2164,10 @@ static int tc358743_probe(struct i2c_client *client) + if (err) + goto err_work_queues; + ++ err = v4l2_async_register_subdev(sd); ++ if (err < 0) ++ goto err_work_queues; ++ + v4l2_info(sd, "%s found @ 0x%x (%s)\n", client->name, + client->addr << 1, client->adapter->name); + +-- +2.43.0 + diff --git a/queue-5.4/media-ttpci-fix-two-memleaks-in-budget_av_attach.patch b/queue-5.4/media-ttpci-fix-two-memleaks-in-budget_av_attach.patch new file mode 100644 index 00000000000..4263a2aa164 --- /dev/null +++ b/queue-5.4/media-ttpci-fix-two-memleaks-in-budget_av_attach.patch @@ -0,0 +1,52 @@ +From f85a456a06c31d92429bfe7d7f6616c45e9226d3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 21 Feb 2024 13:17:04 +0800 +Subject: media: ttpci: fix two memleaks in budget_av_attach + +From: Zhipeng Lu + +[ Upstream commit d0b07f712bf61e1a3cf23c87c663791c42e50837 ] + +When saa7146_register_device and saa7146_vv_init fails, budget_av_attach +should free the resources it allocates, like the error-handling of +ttpci_budget_init does. Besides, there are two fixme comment refers to +such deallocations. + +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Signed-off-by: Zhipeng Lu +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/pci/ttpci/budget-av.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/media/pci/ttpci/budget-av.c b/drivers/media/pci/ttpci/budget-av.c +index 38cac508bd728..3766c7aa96f44 100644 +--- a/drivers/media/pci/ttpci/budget-av.c ++++ b/drivers/media/pci/ttpci/budget-av.c +@@ -1462,7 +1462,8 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio + budget_av->has_saa7113 = 1; + err = saa7146_vv_init(dev, &vv_data); + if (err != 0) { +- /* fixme: proper cleanup here */ ++ ttpci_budget_deinit(&budget_av->budget); ++ kfree(budget_av); + ERR("cannot init vv subsystem\n"); + return err; + } +@@ -1471,9 +1472,10 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio + vv_data.vid_ops.vidioc_s_input = vidioc_s_input; + + if ((err = saa7146_register_device(&budget_av->vd, dev, "knc1", VFL_TYPE_VIDEO))) { +- /* fixme: proper cleanup here */ +- ERR("cannot register capture v4l2 device\n"); + saa7146_vv_release(dev); ++ ttpci_budget_deinit(&budget_av->budget); ++ kfree(budget_av); ++ ERR("cannot register capture v4l2 device\n"); + return err; + } + +-- +2.43.0 + diff --git a/queue-5.4/media-v4l2-core-correctly-validate-video-and-metadat.patch b/queue-5.4/media-v4l2-core-correctly-validate-video-and-metadat.patch new file mode 100644 index 00000000000..d4471c6bb81 --- /dev/null +++ b/queue-5.4/media-v4l2-core-correctly-validate-video-and-metadat.patch @@ -0,0 +1,200 @@ +From eab888cbae10d74220e036df0d1b99e26de07eec Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Oct 2019 05:40:19 -0300 +Subject: media: v4l2-core: correctly validate video and metadata ioctls + +From: Vandana BN + +[ Upstream commit 96f49c1ac370c23ae55c63c67a0b40d83928bfbd ] + +If the type is VFL_TYPE_GRABBER, then also check device_caps +to see if the video device supports video and/or metadata and +disable unneeded ioctls. + +Without this change, format ioctls for both video and metadata devices +could be called on both device nodes. This is true for other ioctls as +well, even if the device supports only video or metadata. + +Metadata devices act similar to VBI devices w.r.t. which ioctls should +be enabled. This makes sense since VBI *is* metadata. + +Signed-off-by: Vandana BN +Co-developed-by: Hans Verkuil +Signed-off-by: Hans Verkuil +Acked-by: Laurent Pinchart +Signed-off-by: Mauro Carvalho Chehab +Stable-dep-of: d0b07f712bf6 ("media: ttpci: fix two memleaks in budget_av_attach") +Signed-off-by: Sasha Levin +--- + drivers/media/v4l2-core/v4l2-dev.c | 62 +++++++++++++++++----------- + drivers/media/v4l2-core/v4l2-ioctl.c | 16 +++++-- + 2 files changed, 52 insertions(+), 26 deletions(-) + +diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c +index 4037689a945a5..1bf543932e4f9 100644 +--- a/drivers/media/v4l2-core/v4l2-dev.c ++++ b/drivers/media/v4l2-core/v4l2-dev.c +@@ -533,13 +533,23 @@ static int get_index(struct video_device *vdev) + */ + static void determine_valid_ioctls(struct video_device *vdev) + { ++ const u32 vid_caps = V4L2_CAP_VIDEO_CAPTURE | ++ V4L2_CAP_VIDEO_CAPTURE_MPLANE | ++ V4L2_CAP_VIDEO_OUTPUT | ++ V4L2_CAP_VIDEO_OUTPUT_MPLANE | ++ V4L2_CAP_VIDEO_M2M | V4L2_CAP_VIDEO_M2M_MPLANE; ++ const u32 meta_caps = V4L2_CAP_META_CAPTURE | ++ V4L2_CAP_META_OUTPUT; + DECLARE_BITMAP(valid_ioctls, BASE_VIDIOC_PRIVATE); + const struct v4l2_ioctl_ops *ops = vdev->ioctl_ops; +- bool is_vid = vdev->vfl_type == VFL_TYPE_GRABBER; ++ bool is_vid = vdev->vfl_type == VFL_TYPE_GRABBER && ++ (vdev->device_caps & vid_caps); + bool is_vbi = vdev->vfl_type == VFL_TYPE_VBI; + bool is_radio = vdev->vfl_type == VFL_TYPE_RADIO; + bool is_sdr = vdev->vfl_type == VFL_TYPE_SDR; + bool is_tch = vdev->vfl_type == VFL_TYPE_TOUCH; ++ bool is_meta = vdev->vfl_type == VFL_TYPE_GRABBER && ++ (vdev->device_caps & meta_caps); + bool is_rx = vdev->vfl_dir != VFL_DIR_TX; + bool is_tx = vdev->vfl_dir != VFL_DIR_RX; + +@@ -587,39 +597,31 @@ static void determine_valid_ioctls(struct video_device *vdev) + set_bit(_IOC_NR(VIDIOC_ENUM_FREQ_BANDS), valid_ioctls); + + if (is_vid || is_tch) { +- /* video and metadata specific ioctls */ ++ /* video and touch specific ioctls */ + if ((is_rx && (ops->vidioc_enum_fmt_vid_cap || +- ops->vidioc_enum_fmt_vid_overlay || +- ops->vidioc_enum_fmt_meta_cap)) || +- (is_tx && (ops->vidioc_enum_fmt_vid_out || +- ops->vidioc_enum_fmt_meta_out))) ++ ops->vidioc_enum_fmt_vid_overlay)) || ++ (is_tx && ops->vidioc_enum_fmt_vid_out)) + set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls); + if ((is_rx && (ops->vidioc_g_fmt_vid_cap || + ops->vidioc_g_fmt_vid_cap_mplane || +- ops->vidioc_g_fmt_vid_overlay || +- ops->vidioc_g_fmt_meta_cap)) || ++ ops->vidioc_g_fmt_vid_overlay)) || + (is_tx && (ops->vidioc_g_fmt_vid_out || + ops->vidioc_g_fmt_vid_out_mplane || +- ops->vidioc_g_fmt_vid_out_overlay || +- ops->vidioc_g_fmt_meta_out))) ++ ops->vidioc_g_fmt_vid_out_overlay))) + set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls); + if ((is_rx && (ops->vidioc_s_fmt_vid_cap || + ops->vidioc_s_fmt_vid_cap_mplane || +- ops->vidioc_s_fmt_vid_overlay || +- ops->vidioc_s_fmt_meta_cap)) || ++ ops->vidioc_s_fmt_vid_overlay)) || + (is_tx && (ops->vidioc_s_fmt_vid_out || + ops->vidioc_s_fmt_vid_out_mplane || +- ops->vidioc_s_fmt_vid_out_overlay || +- ops->vidioc_s_fmt_meta_out))) ++ ops->vidioc_s_fmt_vid_out_overlay))) + set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls); + if ((is_rx && (ops->vidioc_try_fmt_vid_cap || + ops->vidioc_try_fmt_vid_cap_mplane || +- ops->vidioc_try_fmt_vid_overlay || +- ops->vidioc_try_fmt_meta_cap)) || ++ ops->vidioc_try_fmt_vid_overlay)) || + (is_tx && (ops->vidioc_try_fmt_vid_out || + ops->vidioc_try_fmt_vid_out_mplane || +- ops->vidioc_try_fmt_vid_out_overlay || +- ops->vidioc_try_fmt_meta_out))) ++ ops->vidioc_try_fmt_vid_out_overlay))) + set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls); + SET_VALID_IOCTL(ops, VIDIOC_OVERLAY, vidioc_overlay); + SET_VALID_IOCTL(ops, VIDIOC_G_FBUF, vidioc_g_fbuf); +@@ -641,7 +643,21 @@ static void determine_valid_ioctls(struct video_device *vdev) + set_bit(_IOC_NR(VIDIOC_S_CROP), valid_ioctls); + SET_VALID_IOCTL(ops, VIDIOC_G_SELECTION, vidioc_g_selection); + SET_VALID_IOCTL(ops, VIDIOC_S_SELECTION, vidioc_s_selection); +- } else if (is_vbi) { ++ } ++ if (is_meta && is_rx) { ++ /* metadata capture specific ioctls */ ++ SET_VALID_IOCTL(ops, VIDIOC_ENUM_FMT, vidioc_enum_fmt_meta_cap); ++ SET_VALID_IOCTL(ops, VIDIOC_G_FMT, vidioc_g_fmt_meta_cap); ++ SET_VALID_IOCTL(ops, VIDIOC_S_FMT, vidioc_s_fmt_meta_cap); ++ SET_VALID_IOCTL(ops, VIDIOC_TRY_FMT, vidioc_try_fmt_meta_cap); ++ } else if (is_meta && is_tx) { ++ /* metadata output specific ioctls */ ++ SET_VALID_IOCTL(ops, VIDIOC_ENUM_FMT, vidioc_enum_fmt_meta_out); ++ SET_VALID_IOCTL(ops, VIDIOC_G_FMT, vidioc_g_fmt_meta_out); ++ SET_VALID_IOCTL(ops, VIDIOC_S_FMT, vidioc_s_fmt_meta_out); ++ SET_VALID_IOCTL(ops, VIDIOC_TRY_FMT, vidioc_try_fmt_meta_out); ++ } ++ if (is_vbi) { + /* vbi specific ioctls */ + if ((is_rx && (ops->vidioc_g_fmt_vbi_cap || + ops->vidioc_g_fmt_sliced_vbi_cap)) || +@@ -681,8 +697,8 @@ static void determine_valid_ioctls(struct video_device *vdev) + set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls); + } + +- if (is_vid || is_vbi || is_sdr || is_tch) { +- /* ioctls valid for video, metadata, vbi or sdr */ ++ if (is_vid || is_vbi || is_sdr || is_tch || is_meta) { ++ /* ioctls valid for video, vbi, sdr, touch and metadata */ + SET_VALID_IOCTL(ops, VIDIOC_REQBUFS, vidioc_reqbufs); + SET_VALID_IOCTL(ops, VIDIOC_QUERYBUF, vidioc_querybuf); + SET_VALID_IOCTL(ops, VIDIOC_QBUF, vidioc_qbuf); +@@ -694,8 +710,8 @@ static void determine_valid_ioctls(struct video_device *vdev) + SET_VALID_IOCTL(ops, VIDIOC_STREAMOFF, vidioc_streamoff); + } + +- if (is_vid || is_vbi || is_tch) { +- /* ioctls valid for video or vbi */ ++ if (is_vid || is_vbi || is_tch || is_meta) { ++ /* ioctls valid for video, vbi, touch and metadata */ + if (ops->vidioc_s_std) + set_bit(_IOC_NR(VIDIOC_ENUMSTD), valid_ioctls); + SET_VALID_IOCTL(ops, VIDIOC_S_STD, vidioc_s_std); +diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c +index 3012e8ecffb94..b8edef9160864 100644 +--- a/drivers/media/v4l2-core/v4l2-ioctl.c ++++ b/drivers/media/v4l2-core/v4l2-ioctl.c +@@ -950,12 +950,22 @@ static bool check_ext_ctrls(struct v4l2_ext_controls *c, unsigned long ioctl) + + static int check_fmt(struct file *file, enum v4l2_buf_type type) + { ++ const u32 vid_caps = V4L2_CAP_VIDEO_CAPTURE | ++ V4L2_CAP_VIDEO_CAPTURE_MPLANE | ++ V4L2_CAP_VIDEO_OUTPUT | ++ V4L2_CAP_VIDEO_OUTPUT_MPLANE | ++ V4L2_CAP_VIDEO_M2M | V4L2_CAP_VIDEO_M2M_MPLANE; ++ const u32 meta_caps = V4L2_CAP_META_CAPTURE | ++ V4L2_CAP_META_OUTPUT; + struct video_device *vfd = video_devdata(file); + const struct v4l2_ioctl_ops *ops = vfd->ioctl_ops; +- bool is_vid = vfd->vfl_type == VFL_TYPE_GRABBER; ++ bool is_vid = vfd->vfl_type == VFL_TYPE_GRABBER && ++ (vfd->device_caps & vid_caps); + bool is_vbi = vfd->vfl_type == VFL_TYPE_VBI; + bool is_sdr = vfd->vfl_type == VFL_TYPE_SDR; + bool is_tch = vfd->vfl_type == VFL_TYPE_TOUCH; ++ bool is_meta = vfd->vfl_type == VFL_TYPE_GRABBER && ++ (vfd->device_caps & meta_caps); + bool is_rx = vfd->vfl_dir != VFL_DIR_TX; + bool is_tx = vfd->vfl_dir != VFL_DIR_RX; + +@@ -1014,11 +1024,11 @@ static int check_fmt(struct file *file, enum v4l2_buf_type type) + return 0; + break; + case V4L2_BUF_TYPE_META_CAPTURE: +- if (is_vid && is_rx && ops->vidioc_g_fmt_meta_cap) ++ if (is_meta && is_rx && ops->vidioc_g_fmt_meta_cap) + return 0; + break; + case V4L2_BUF_TYPE_META_OUTPUT: +- if (is_vid && is_tx && ops->vidioc_g_fmt_meta_out) ++ if (is_meta && is_tx && ops->vidioc_g_fmt_meta_out) + return 0; + break; + default: +-- +2.43.0 + diff --git a/queue-5.4/media-v4l2-mem2mem-fix-a-memleak-in-v4l2_m2m_registe.patch b/queue-5.4/media-v4l2-mem2mem-fix-a-memleak-in-v4l2_m2m_registe.patch new file mode 100644 index 00000000000..a12a1a71530 --- /dev/null +++ b/queue-5.4/media-v4l2-mem2mem-fix-a-memleak-in-v4l2_m2m_registe.patch @@ -0,0 +1,48 @@ +From 5b579421ac30c851a73a25a498b9676842fc9c32 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 1 Feb 2024 20:48:44 +0800 +Subject: media: v4l2-mem2mem: fix a memleak in v4l2_m2m_register_entity + +From: Zhipeng Lu + +[ Upstream commit 8f94b49a5b5d386c038e355bef6347298aabd211 ] + +The entity->name (i.e. name) is allocated in v4l2_m2m_register_entity +but isn't freed in its following error-handling paths. This patch +adds such deallocation to prevent memleak of entity->name. + +Fixes: be2fff656322 ("media: add helpers for memory-to-memory media controller") +Signed-off-by: Zhipeng Lu +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/v4l2-core/v4l2-mem2mem.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c +index d56837c04a81a..b374c9fab4b9e 100644 +--- a/drivers/media/v4l2-core/v4l2-mem2mem.c ++++ b/drivers/media/v4l2-core/v4l2-mem2mem.c +@@ -799,11 +799,17 @@ static int v4l2_m2m_register_entity(struct media_device *mdev, + entity->function = function; + + ret = media_entity_pads_init(entity, num_pads, pads); +- if (ret) ++ if (ret) { ++ kfree(entity->name); ++ entity->name = NULL; + return ret; ++ } + ret = media_device_register_entity(mdev, entity); +- if (ret) ++ if (ret) { ++ kfree(entity->name); ++ entity->name = NULL; + return ret; ++ } + + return 0; + } +-- +2.43.0 + diff --git a/queue-5.4/media-v4l2-tpg-fix-some-memleaks-in-tpg_alloc.patch b/queue-5.4/media-v4l2-tpg-fix-some-memleaks-in-tpg_alloc.patch new file mode 100644 index 00000000000..b8a7ad17727 --- /dev/null +++ b/queue-5.4/media-v4l2-tpg-fix-some-memleaks-in-tpg_alloc.patch @@ -0,0 +1,112 @@ +From e40099911e10cb90f0254018da0e18cad7931d3a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 1 Feb 2024 20:47:53 +0800 +Subject: media: v4l2-tpg: fix some memleaks in tpg_alloc + +From: Zhipeng Lu + +[ Upstream commit 8cf9c5051076e0eb958f4361d50d8b0c3ee6691c ] + +In tpg_alloc, resources should be deallocated in each and every +error-handling paths, since they are allocated in for statements. +Otherwise there would be memleaks because tpg_free is called only when +tpg_alloc return 0. + +Fixes: 63881df94d3e ("[media] vivid: add the Test Pattern Generator") +Signed-off-by: Zhipeng Lu +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/common/v4l2-tpg/v4l2-tpg-core.c | 52 +++++++++++++++---- + 1 file changed, 42 insertions(+), 10 deletions(-) + +diff --git a/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c b/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c +index 50f1e0b28b250..a4d729a4f3301 100644 +--- a/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c ++++ b/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c +@@ -113,6 +113,7 @@ int tpg_alloc(struct tpg_data *tpg, unsigned max_w) + { + unsigned pat; + unsigned plane; ++ int ret = 0; + + tpg->max_line_width = max_w; + for (pat = 0; pat < TPG_MAX_PAT_LINES; pat++) { +@@ -121,14 +122,18 @@ int tpg_alloc(struct tpg_data *tpg, unsigned max_w) + + tpg->lines[pat][plane] = + vzalloc(array3_size(max_w, 2, pixelsz)); +- if (!tpg->lines[pat][plane]) +- return -ENOMEM; ++ if (!tpg->lines[pat][plane]) { ++ ret = -ENOMEM; ++ goto free_lines; ++ } + if (plane == 0) + continue; + tpg->downsampled_lines[pat][plane] = + vzalloc(array3_size(max_w, 2, pixelsz)); +- if (!tpg->downsampled_lines[pat][plane]) +- return -ENOMEM; ++ if (!tpg->downsampled_lines[pat][plane]) { ++ ret = -ENOMEM; ++ goto free_lines; ++ } + } + } + for (plane = 0; plane < TPG_MAX_PLANES; plane++) { +@@ -136,18 +141,45 @@ int tpg_alloc(struct tpg_data *tpg, unsigned max_w) + + tpg->contrast_line[plane] = + vzalloc(array_size(pixelsz, max_w)); +- if (!tpg->contrast_line[plane]) +- return -ENOMEM; ++ if (!tpg->contrast_line[plane]) { ++ ret = -ENOMEM; ++ goto free_contrast_line; ++ } + tpg->black_line[plane] = + vzalloc(array_size(pixelsz, max_w)); +- if (!tpg->black_line[plane]) +- return -ENOMEM; ++ if (!tpg->black_line[plane]) { ++ ret = -ENOMEM; ++ goto free_contrast_line; ++ } + tpg->random_line[plane] = + vzalloc(array3_size(max_w, 2, pixelsz)); +- if (!tpg->random_line[plane]) +- return -ENOMEM; ++ if (!tpg->random_line[plane]) { ++ ret = -ENOMEM; ++ goto free_contrast_line; ++ } + } + return 0; ++ ++free_contrast_line: ++ for (plane = 0; plane < TPG_MAX_PLANES; plane++) { ++ vfree(tpg->contrast_line[plane]); ++ vfree(tpg->black_line[plane]); ++ vfree(tpg->random_line[plane]); ++ tpg->contrast_line[plane] = NULL; ++ tpg->black_line[plane] = NULL; ++ tpg->random_line[plane] = NULL; ++ } ++free_lines: ++ for (pat = 0; pat < TPG_MAX_PAT_LINES; pat++) ++ for (plane = 0; plane < TPG_MAX_PLANES; plane++) { ++ vfree(tpg->lines[pat][plane]); ++ tpg->lines[pat][plane] = NULL; ++ if (plane == 0) ++ continue; ++ vfree(tpg->downsampled_lines[pat][plane]); ++ tpg->downsampled_lines[pat][plane] = NULL; ++ } ++ return ret; + } + EXPORT_SYMBOL_GPL(tpg_alloc); + +-- +2.43.0 + diff --git a/queue-5.4/mfd-altera-sysmgr-call-of_node_put-only-when-of_pars.patch b/queue-5.4/mfd-altera-sysmgr-call-of_node_put-only-when-of_pars.patch new file mode 100644 index 00000000000..634e22b5fc7 --- /dev/null +++ b/queue-5.4/mfd-altera-sysmgr-call-of_node_put-only-when-of_pars.patch @@ -0,0 +1,42 @@ +From 2990791743014a70d0c4329306f601f9ded30df1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 20 Feb 2024 11:50:12 +0000 +Subject: mfd: altera-sysmgr: Call of_node_put() only when of_parse_phandle() + takes a ref + +From: Peter Griffin + +[ Upstream commit e28c28a34ee9fa2ea671a20e5e7064e6220d55e7 ] + +of_parse_phandle() returns a device_node with refcount incremented, which +the callee needs to call of_node_put() on when done. We should only call +of_node_put() when the property argument is provided though as otherwise +nothing has taken a reference on the node. + +Fixes: f36e789a1f8d ("mfd: altera-sysmgr: Add SOCFPGA System Manager") +Signed-off-by: Peter Griffin +Link: https://lore.kernel.org/r/20240220115012.471689-4-peter.griffin@linaro.org +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/mfd/altera-sysmgr.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/mfd/altera-sysmgr.c b/drivers/mfd/altera-sysmgr.c +index d2a13a547a3ca..5610a5d9fad12 100644 +--- a/drivers/mfd/altera-sysmgr.c ++++ b/drivers/mfd/altera-sysmgr.c +@@ -109,7 +109,9 @@ struct regmap *altr_sysmgr_regmap_lookup_by_phandle(struct device_node *np, + + dev = driver_find_device_by_of_node(&altr_sysmgr_driver.driver, + (void *)sysmgr_np); +- of_node_put(sysmgr_np); ++ if (property) ++ of_node_put(sysmgr_np); ++ + if (!dev) + return ERR_PTR(-EPROBE_DEFER); + +-- +2.43.0 + diff --git a/queue-5.4/mfd-syscon-call-of_node_put-only-when-of_parse_phand.patch b/queue-5.4/mfd-syscon-call-of_node_put-only-when-of_parse_phand.patch new file mode 100644 index 00000000000..c5d94575a78 --- /dev/null +++ b/queue-5.4/mfd-syscon-call-of_node_put-only-when-of_parse_phand.patch @@ -0,0 +1,42 @@ +From 75a0cfa3e42d71cda110c6863cbe0d224c01dad8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 20 Feb 2024 11:50:10 +0000 +Subject: mfd: syscon: Call of_node_put() only when of_parse_phandle() takes a + ref + +From: Peter Griffin + +[ Upstream commit d2b0680cf3b05490b579e71b0df6e07451977745 ] + +of_parse_phandle() returns a device_node with refcount incremented, which +the callee needs to call of_node_put() on when done. We should only call +of_node_put() when the property argument is provided though as otherwise +nothing has taken a reference on the node. + +Fixes: 45330bb43421 ("mfd: syscon: Allow property as NULL in syscon_regmap_lookup_by_phandle") +Signed-off-by: Peter Griffin +Link: https://lore.kernel.org/r/20240220115012.471689-2-peter.griffin@linaro.org +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/mfd/syscon.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c +index 660723276481c..9ec90ce12f4d7 100644 +--- a/drivers/mfd/syscon.c ++++ b/drivers/mfd/syscon.c +@@ -219,7 +219,9 @@ struct regmap *syscon_regmap_lookup_by_phandle(struct device_node *np, + return ERR_PTR(-ENODEV); + + regmap = syscon_node_to_regmap(syscon_np); +- of_node_put(syscon_np); ++ ++ if (property) ++ of_node_put(syscon_np); + + return regmap; + } +-- +2.43.0 + diff --git a/queue-5.4/mmc-wmt-sdmmc-remove-an-incorrect-release_mem_region.patch b/queue-5.4/mmc-wmt-sdmmc-remove-an-incorrect-release_mem_region.patch new file mode 100644 index 00000000000..68681239b9c --- /dev/null +++ b/queue-5.4/mmc-wmt-sdmmc-remove-an-incorrect-release_mem_region.patch @@ -0,0 +1,50 @@ +From 47d35c644435cfc0d43e0790947d62c9d8063a80 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 Feb 2024 22:37:39 +0100 +Subject: mmc: wmt-sdmmc: remove an incorrect release_mem_region() call in the + .remove function + +From: Christophe JAILLET + +[ Upstream commit ae5004a40a262d329039b99b62bd3fe7645b66ad ] + +This looks strange to call release_mem_region() in a remove function +without any request_mem_region() in the probe or "struct resource" +somewhere. + +So remove the corresponding code. + +Fixes: 3a96dff0f828 ("mmc: SD/MMC Host Controller for Wondermedia WM8505/WM8650") +Signed-off-by: Christophe JAILLET +Link: https://lore.kernel.org/r/bb0bb1ed1e18de55e8c0547625bde271e64b8c31.1708983064.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + drivers/mmc/host/wmt-sdmmc.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/drivers/mmc/host/wmt-sdmmc.c b/drivers/mmc/host/wmt-sdmmc.c +index b1e4199f82920..345b3c50f27dd 100644 +--- a/drivers/mmc/host/wmt-sdmmc.c ++++ b/drivers/mmc/host/wmt-sdmmc.c +@@ -889,7 +889,6 @@ static int wmt_mci_remove(struct platform_device *pdev) + { + struct mmc_host *mmc; + struct wmt_mci_priv *priv; +- struct resource *res; + u32 reg_tmp; + + mmc = platform_get_drvdata(pdev); +@@ -917,9 +916,6 @@ static int wmt_mci_remove(struct platform_device *pdev) + clk_disable_unprepare(priv->clk_sdmmc); + clk_put(priv->clk_sdmmc); + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- release_mem_region(res->start, resource_size(res)); +- + mmc_free_host(mmc); + + dev_info(&pdev->dev, "WMT MCI device removed\n"); +-- +2.43.0 + diff --git a/queue-5.4/mtd-maps-physmap-core-fix-flash-size-larger-than-32-.patch b/queue-5.4/mtd-maps-physmap-core-fix-flash-size-larger-than-32-.patch new file mode 100644 index 00000000000..f9e33d7abee --- /dev/null +++ b/queue-5.4/mtd-maps-physmap-core-fix-flash-size-larger-than-32-.patch @@ -0,0 +1,39 @@ +From 329c21941fe1d020a487e63c2dd49f65e7452d0b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 8 Feb 2024 12:34:18 +0200 +Subject: mtd: maps: physmap-core: fix flash size larger than 32-bit + +From: Baruch Siach + +[ Upstream commit 3884f03edd34887514a0865a80769cd5362d5c3b ] + +mtd-ram can potentially be larger than 4GB. get_bitmask_order() uses +fls() that is not guaranteed to work with values larger than 32-bit. +Specifically on aarch64 fls() returns 0 when all 32 LSB bits are clear. +Use fls64() instead. + +Fixes: ba32ce95cbd987 ("mtd: maps: Merge gpio-addr-flash.c into physmap-core.c") +Signed-off-by: Baruch Siach +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/9fbf3664ce00f8b07867f1011834015f21d162a5.1707388458.git.baruch@tkos.co.il +Signed-off-by: Sasha Levin +--- + drivers/mtd/maps/physmap-core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/maps/physmap-core.c b/drivers/mtd/maps/physmap-core.c +index e4f72b2df8039..fa7e1c0b70c64 100644 +--- a/drivers/mtd/maps/physmap-core.c ++++ b/drivers/mtd/maps/physmap-core.c +@@ -505,7 +505,7 @@ static int physmap_flash_probe(struct platform_device *dev) + if (!info->maps[i].phys) + info->maps[i].phys = res->start; + +- info->win_order = get_bitmask_order(resource_size(res)) - 1; ++ info->win_order = fls64(resource_size(res)) - 1; + info->maps[i].size = BIT(info->win_order + + (info->gpios ? + info->gpios->ndescs : 0)); +-- +2.43.0 + diff --git a/queue-5.4/mtd-rawnand-lpc32xx_mlc-fix-irq-handler-prototype.patch b/queue-5.4/mtd-rawnand-lpc32xx_mlc-fix-irq-handler-prototype.patch new file mode 100644 index 00000000000..09ac241d45a --- /dev/null +++ b/queue-5.4/mtd-rawnand-lpc32xx_mlc-fix-irq-handler-prototype.patch @@ -0,0 +1,52 @@ +From 2a64ca07ef3afd9fed2fb9b641259752f129b420 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 13 Feb 2024 11:00:09 +0100 +Subject: mtd: rawnand: lpc32xx_mlc: fix irq handler prototype + +From: Arnd Bergmann + +[ Upstream commit 347b828882e6334690e7003ce5e2fe5f233dc508 ] + +clang-16 warns about mismatched function prototypes: + +drivers/mtd/nand/raw/lpc32xx_mlc.c:783:29: error: cast from 'irqreturn_t (*)(int, struct lpc32xx_nand_host *)' (aka 'enum irqreturn (*)(int, struct lpc32xx_nand_host *)') to 'irq_handler_t' (aka 'enum irqreturn (*)(int, void *)') converts to incompatible function type [-Werror,-Wcast-function-type-strict] + +Change the interrupt handler to the normal way of just passing +a void* pointer and converting it inside the function.. + +Fixes: 70f7cb78ec53 ("mtd: add LPC32xx MLC NAND driver") +Signed-off-by: Arnd Bergmann +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20240213100146.455811-1-arnd@kernel.org +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/lpc32xx_mlc.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/mtd/nand/raw/lpc32xx_mlc.c b/drivers/mtd/nand/raw/lpc32xx_mlc.c +index 78b31f845c50a..a7d0a76eee7f4 100644 +--- a/drivers/mtd/nand/raw/lpc32xx_mlc.c ++++ b/drivers/mtd/nand/raw/lpc32xx_mlc.c +@@ -304,8 +304,9 @@ static int lpc32xx_nand_device_ready(struct nand_chip *nand_chip) + return 0; + } + +-static irqreturn_t lpc3xxx_nand_irq(int irq, struct lpc32xx_nand_host *host) ++static irqreturn_t lpc3xxx_nand_irq(int irq, void *data) + { ++ struct lpc32xx_nand_host *host = data; + uint8_t sr; + + /* Clear interrupt flag by reading status */ +@@ -778,7 +779,7 @@ static int lpc32xx_nand_probe(struct platform_device *pdev) + goto release_dma_chan; + } + +- if (request_irq(host->irq, (irq_handler_t)&lpc3xxx_nand_irq, ++ if (request_irq(host->irq, &lpc3xxx_nand_irq, + IRQF_TRIGGER_HIGH, DRV_NAME, host)) { + dev_err(&pdev->dev, "Error requesting NAND IRQ\n"); + res = -ENXIO; +-- +2.43.0 + diff --git a/queue-5.4/nbd-null-check-for-nla_nest_start.patch b/queue-5.4/nbd-null-check-for-nla_nest_start.patch new file mode 100644 index 00000000000..08586fa6580 --- /dev/null +++ b/queue-5.4/nbd-null-check-for-nla_nest_start.patch @@ -0,0 +1,43 @@ +From ea4f58c4039f669562f63878f73770519a2dacd9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 17 Feb 2024 20:25:38 -0800 +Subject: nbd: null check for nla_nest_start + +From: Navid Emamdoost + +[ Upstream commit 31edf4bbe0ba27fd03ac7d87eb2ee3d2a231af6d ] + +nla_nest_start() may fail and return NULL. Insert a check and set errno +based on other call sites within the same source code. + +Signed-off-by: Navid Emamdoost +Reviewed-by: Michal Kubecek +Fixes: 47d902b90a32 ("nbd: add a status netlink command") +Signed-off-by: Kees Cook +Link: https://lore.kernel.org/r/20240218042534.it.206-kees@kernel.org +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + drivers/block/nbd.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c +index 37994a7a1b6f4..f2d847ffcbc75 100644 +--- a/drivers/block/nbd.c ++++ b/drivers/block/nbd.c +@@ -2313,6 +2313,12 @@ static int nbd_genl_status(struct sk_buff *skb, struct genl_info *info) + } + + dev_list = nla_nest_start_noflag(reply, NBD_ATTR_DEVICE_LIST); ++ if (!dev_list) { ++ nlmsg_free(reply); ++ ret = -EMSGSIZE; ++ goto out; ++ } ++ + if (index == -1) { + ret = idr_for_each(&nbd_index_idr, &status_cb, reply); + if (ret) { +-- +2.43.0 + diff --git a/queue-5.4/net-blackhole_dev-fix-build-warning-for-ethh-set-but.patch b/queue-5.4/net-blackhole_dev-fix-build-warning-for-ethh-set-but.patch new file mode 100644 index 00000000000..b431ed762c4 --- /dev/null +++ b/queue-5.4/net-blackhole_dev-fix-build-warning-for-ethh-set-but.patch @@ -0,0 +1,49 @@ +From 2f98a96b28521eb5d89734ecad5fbff4d687586a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 2 Feb 2024 07:13:29 -0800 +Subject: net: blackhole_dev: fix build warning for ethh set but not used + +From: Breno Leitao + +[ Upstream commit 843a8851e89e2e85db04caaf88d8554818319047 ] + +lib/test_blackhole_dev.c sets a variable that is never read, causing +this following building warning: + + lib/test_blackhole_dev.c:32:17: warning: variable 'ethh' set but not used [-Wunused-but-set-variable] + +Remove the variable struct ethhdr *ethh, which is unused. + +Fixes: 509e56b37cc3 ("blackhole_dev: add a selftest") +Signed-off-by: Breno Leitao +Reviewed-by: Jiri Pirko +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + lib/test_blackhole_dev.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/lib/test_blackhole_dev.c b/lib/test_blackhole_dev.c +index 4c40580a99a36..f247089d63c08 100644 +--- a/lib/test_blackhole_dev.c ++++ b/lib/test_blackhole_dev.c +@@ -29,7 +29,6 @@ static int __init test_blackholedev_init(void) + { + struct ipv6hdr *ip6h; + struct sk_buff *skb; +- struct ethhdr *ethh; + struct udphdr *uh; + int data_len; + int ret; +@@ -61,7 +60,7 @@ static int __init test_blackholedev_init(void) + ip6h->saddr = in6addr_loopback; + ip6h->daddr = in6addr_loopback; + /* Ether */ +- ethh = (struct ethhdr *)skb_push(skb, sizeof(struct ethhdr)); ++ skb_push(skb, sizeof(struct ethhdr)); + skb_set_mac_header(skb, 0); + + skb->protocol = htons(ETH_P_IPV6); +-- +2.43.0 + diff --git a/queue-5.4/net-ena-cosmetic-fix-line-break-issues.patch b/queue-5.4/net-ena-cosmetic-fix-line-break-issues.patch new file mode 100644 index 00000000000..1aead99256b --- /dev/null +++ b/queue-5.4/net-ena-cosmetic-fix-line-break-issues.patch @@ -0,0 +1,71 @@ +From 69552859b03d39637a5d6272fb11c821e40dd981 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 May 2020 12:09:00 +0300 +Subject: net: ena: cosmetic: fix line break issues + +From: Arthur Kiyanovski + +[ Upstream commit 46143e58884025292bd977ca8bc0fdd9dac47c4c ] + +1. Join unnecessarily broken short lines in ena_com.c ena_netdev.c +2. Fix Indentations of broken lines + +Signed-off-by: Arthur Kiyanovski +Signed-off-by: David S. Miller +Stable-dep-of: 78e886ba2b54 ("net: ena: Remove ena_select_queue") +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/amazon/ena/ena_com.c | 8 +++----- + drivers/net/ethernet/amazon/ena/ena_netdev.c | 3 +-- + 2 files changed, 4 insertions(+), 7 deletions(-) + +diff --git a/drivers/net/ethernet/amazon/ena/ena_com.c b/drivers/net/ethernet/amazon/ena/ena_com.c +index 9225733f4fece..29700fee42e9d 100644 +--- a/drivers/net/ethernet/amazon/ena/ena_com.c ++++ b/drivers/net/ethernet/amazon/ena/ena_com.c +@@ -375,7 +375,7 @@ static int ena_com_init_io_sq(struct ena_com_dev *ena_dev, + io_sq->bounce_buf_ctrl.next_to_use = 0; + + size = io_sq->bounce_buf_ctrl.buffer_size * +- io_sq->bounce_buf_ctrl.buffers_num; ++ io_sq->bounce_buf_ctrl.buffers_num; + + dev_node = dev_to_node(ena_dev->dmadev); + set_dev_node(ena_dev->dmadev, ctx->numa_node); +@@ -702,8 +702,7 @@ static int ena_com_config_llq_info(struct ena_com_dev *ena_dev, + /* The desc list entry size should be whole multiply of 8 + * This requirement comes from __iowrite64_copy() + */ +- pr_err("illegal entry size %d\n", +- llq_info->desc_list_entry_size); ++ pr_err("illegal entry size %d\n", llq_info->desc_list_entry_size); + return -EINVAL; + } + +@@ -2063,8 +2062,7 @@ void ena_com_aenq_intr_handler(struct ena_com_dev *dev, void *data) + + /* write the aenq doorbell after all AENQ descriptors were read */ + mb(); +- writel_relaxed((u32)aenq->head, +- dev->reg_bar + ENA_REGS_AENQ_HEAD_DB_OFF); ++ writel_relaxed((u32)aenq->head, dev->reg_bar + ENA_REGS_AENQ_HEAD_DB_OFF); + } + + int ena_com_dev_reset(struct ena_com_dev *ena_dev, +diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c +index 2e5348ec2a2e9..734da4e9ead2f 100644 +--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c ++++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c +@@ -2401,8 +2401,7 @@ static u16 ena_select_queue(struct net_device *dev, struct sk_buff *skb, + return qid; + } + +-static void ena_config_host_info(struct ena_com_dev *ena_dev, +- struct pci_dev *pdev) ++static void ena_config_host_info(struct ena_com_dev *ena_dev, struct pci_dev *pdev) + { + struct ena_admin_host_info *host_info; + int rc; +-- +2.43.0 + diff --git a/queue-5.4/net-ena-remove-ena_select_queue.patch b/queue-5.4/net-ena-remove-ena_select_queue.patch new file mode 100644 index 00000000000..efd13eaca9a --- /dev/null +++ b/queue-5.4/net-ena-remove-ena_select_queue.patch @@ -0,0 +1,66 @@ +From b46ba991906051ab6920cfe19f8e55165bd4b4f7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 15 Feb 2024 17:31:04 -0500 +Subject: net: ena: Remove ena_select_queue + +From: Kamal Heib + +[ Upstream commit 78e886ba2b549945ecada055ee0765f0ded5707a ] + +Avoid the following warnings by removing the ena_select_queue() function +and rely on the net core to do the queue selection, The issue happen +when an skb received from an interface with more queues than ena is +forwarded to the ena interface. + +[ 1176.159959] eth0 selects TX queue 11, but real number of TX queues is 8 +[ 1176.863976] eth0 selects TX queue 14, but real number of TX queues is 8 +[ 1180.767877] eth0 selects TX queue 14, but real number of TX queues is 8 +[ 1188.703742] eth0 selects TX queue 14, but real number of TX queues is 8 + +Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)") +Signed-off-by: Kamal Heib +Reviewed-by: Jacob Keller +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/amazon/ena/ena_netdev.c | 17 ----------------- + 1 file changed, 17 deletions(-) + +diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c +index 734da4e9ead2f..8e2e0c3bee0b9 100644 +--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c ++++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c +@@ -2385,22 +2385,6 @@ static netdev_tx_t ena_start_xmit(struct sk_buff *skb, struct net_device *dev) + return NETDEV_TX_OK; + } + +-static u16 ena_select_queue(struct net_device *dev, struct sk_buff *skb, +- struct net_device *sb_dev) +-{ +- u16 qid; +- /* we suspect that this is good for in--kernel network services that +- * want to loop incoming skb rx to tx in normal user generated traffic, +- * most probably we will not get to this +- */ +- if (skb_rx_queue_recorded(skb)) +- qid = skb_get_rx_queue(skb); +- else +- qid = netdev_pick_tx(dev, skb, NULL); +- +- return qid; +-} +- + static void ena_config_host_info(struct ena_com_dev *ena_dev, struct pci_dev *pdev) + { + struct ena_admin_host_info *host_info; +@@ -2549,7 +2533,6 @@ static const struct net_device_ops ena_netdev_ops = { + .ndo_open = ena_open, + .ndo_stop = ena_close, + .ndo_start_xmit = ena_start_xmit, +- .ndo_select_queue = ena_select_queue, + .ndo_get_stats64 = ena_get_stats64, + .ndo_tx_timeout = ena_tx_timeout, + .ndo_change_mtu = ena_change_mtu, +-- +2.43.0 + diff --git a/queue-5.4/net-hns3-fix-port-duplex-configure-error-in-imp-rese.patch b/queue-5.4/net-hns3-fix-port-duplex-configure-error-in-imp-rese.patch new file mode 100644 index 00000000000..7c6232c04a0 --- /dev/null +++ b/queue-5.4/net-hns3-fix-port-duplex-configure-error-in-imp-rese.patch @@ -0,0 +1,44 @@ +From 056d23adc35eb3e77513a9d7ccecf28d6197a893 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Mar 2024 09:01:14 +0800 +Subject: net: hns3: fix port duplex configure error in IMP reset + +From: Jie Wang + +[ Upstream commit 11d80f79dd9f871a52feba4bf24b5ac39f448eb7 ] + +Currently, the mac port is fixed to configured as full dplex mode in +hclge_mac_init() when driver initialization or reset restore. Users may +change the mode to half duplex with ethtool, so it may cause the user +configuration dropped after reset. + +To fix it, don't change the duplex mode when resetting. + +Fixes: 2d03eacc0b7e ("net: hns3: Only update mac configuation when necessary") +Signed-off-by: Jie Wang +Signed-off-by: Jijie Shao +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +index 6b2d54c972b7c..f5956977fe39a 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +@@ -2588,7 +2588,10 @@ static int hclge_mac_init(struct hclge_dev *hdev) + int ret; + + hdev->support_sfp_query = true; +- hdev->hw.mac.duplex = HCLGE_MAC_FULL; ++ ++ if (!test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state)) ++ hdev->hw.mac.duplex = HCLGE_MAC_FULL; ++ + ret = hclge_cfg_mac_speed_dup_hw(hdev, hdev->hw.mac.speed, + hdev->hw.mac.duplex); + if (ret) { +-- +2.43.0 + diff --git a/queue-5.4/net-ip_tunnel-make-sure-to-pull-inner-header-in-ip_t.patch b/queue-5.4/net-ip_tunnel-make-sure-to-pull-inner-header-in-ip_t.patch new file mode 100644 index 00000000000..c4d3d4702b9 --- /dev/null +++ b/queue-5.4/net-ip_tunnel-make-sure-to-pull-inner-header-in-ip_t.patch @@ -0,0 +1,125 @@ +From ad54e6abf4a6fa727a4dfe5da51fe0c757c2c9c1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Mar 2024 10:07:16 +0000 +Subject: net: ip_tunnel: make sure to pull inner header in ip_tunnel_rcv() + +From: Eric Dumazet + +[ Upstream commit b0ec2abf98267f14d032102551581c833b0659d3 ] + +Apply the same fix than ones found in : + +8d975c15c0cd ("ip6_tunnel: make sure to pull inner header in __ip6_tnl_rcv()") +1ca1ba465e55 ("geneve: make sure to pull inner header in geneve_rx()") + +We have to save skb->network_header in a temporary variable +in order to be able to recompute the network_header pointer +after a pskb_inet_may_pull() call. + +pskb_inet_may_pull() makes sure the needed headers are in skb->head. + +syzbot reported: +BUG: KMSAN: uninit-value in __INET_ECN_decapsulate include/net/inet_ecn.h:253 [inline] + BUG: KMSAN: uninit-value in INET_ECN_decapsulate include/net/inet_ecn.h:275 [inline] + BUG: KMSAN: uninit-value in IP_ECN_decapsulate include/net/inet_ecn.h:302 [inline] + BUG: KMSAN: uninit-value in ip_tunnel_rcv+0xed9/0x2ed0 net/ipv4/ip_tunnel.c:409 + __INET_ECN_decapsulate include/net/inet_ecn.h:253 [inline] + INET_ECN_decapsulate include/net/inet_ecn.h:275 [inline] + IP_ECN_decapsulate include/net/inet_ecn.h:302 [inline] + ip_tunnel_rcv+0xed9/0x2ed0 net/ipv4/ip_tunnel.c:409 + __ipgre_rcv+0x9bc/0xbc0 net/ipv4/ip_gre.c:389 + ipgre_rcv net/ipv4/ip_gre.c:411 [inline] + gre_rcv+0x423/0x19f0 net/ipv4/ip_gre.c:447 + gre_rcv+0x2a4/0x390 net/ipv4/gre_demux.c:163 + ip_protocol_deliver_rcu+0x264/0x1300 net/ipv4/ip_input.c:205 + ip_local_deliver_finish+0x2b8/0x440 net/ipv4/ip_input.c:233 + NF_HOOK include/linux/netfilter.h:314 [inline] + ip_local_deliver+0x21f/0x490 net/ipv4/ip_input.c:254 + dst_input include/net/dst.h:461 [inline] + ip_rcv_finish net/ipv4/ip_input.c:449 [inline] + NF_HOOK include/linux/netfilter.h:314 [inline] + ip_rcv+0x46f/0x760 net/ipv4/ip_input.c:569 + __netif_receive_skb_one_core net/core/dev.c:5534 [inline] + __netif_receive_skb+0x1a6/0x5a0 net/core/dev.c:5648 + netif_receive_skb_internal net/core/dev.c:5734 [inline] + netif_receive_skb+0x58/0x660 net/core/dev.c:5793 + tun_rx_batched+0x3ee/0x980 drivers/net/tun.c:1556 + tun_get_user+0x53b9/0x66e0 drivers/net/tun.c:2009 + tun_chr_write_iter+0x3af/0x5d0 drivers/net/tun.c:2055 + call_write_iter include/linux/fs.h:2087 [inline] + new_sync_write fs/read_write.c:497 [inline] + vfs_write+0xb6b/0x1520 fs/read_write.c:590 + ksys_write+0x20f/0x4c0 fs/read_write.c:643 + __do_sys_write fs/read_write.c:655 [inline] + __se_sys_write fs/read_write.c:652 [inline] + __x64_sys_write+0x93/0xd0 fs/read_write.c:652 + do_syscall_x64 arch/x86/entry/common.c:52 [inline] + do_syscall_64+0xcf/0x1e0 arch/x86/entry/common.c:83 + entry_SYSCALL_64_after_hwframe+0x63/0x6b + +Uninit was created at: + __alloc_pages+0x9a6/0xe00 mm/page_alloc.c:4590 + alloc_pages_mpol+0x62b/0x9d0 mm/mempolicy.c:2133 + alloc_pages+0x1be/0x1e0 mm/mempolicy.c:2204 + skb_page_frag_refill+0x2bf/0x7c0 net/core/sock.c:2909 + tun_build_skb drivers/net/tun.c:1686 [inline] + tun_get_user+0xe0a/0x66e0 drivers/net/tun.c:1826 + tun_chr_write_iter+0x3af/0x5d0 drivers/net/tun.c:2055 + call_write_iter include/linux/fs.h:2087 [inline] + new_sync_write fs/read_write.c:497 [inline] + vfs_write+0xb6b/0x1520 fs/read_write.c:590 + ksys_write+0x20f/0x4c0 fs/read_write.c:643 + __do_sys_write fs/read_write.c:655 [inline] + __se_sys_write fs/read_write.c:652 [inline] + __x64_sys_write+0x93/0xd0 fs/read_write.c:652 + do_syscall_x64 arch/x86/entry/common.c:52 [inline] + do_syscall_64+0xcf/0x1e0 arch/x86/entry/common.c:83 + entry_SYSCALL_64_after_hwframe+0x63/0x6b + +Fixes: c54419321455 ("GRE: Refactor GRE tunneling code.") +Reported-by: syzbot +Signed-off-by: Eric Dumazet +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/ipv4/ip_tunnel.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c +index ba1decf81fe32..906c37c7f80d5 100644 +--- a/net/ipv4/ip_tunnel.c ++++ b/net/ipv4/ip_tunnel.c +@@ -365,7 +365,7 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb, + { + struct pcpu_sw_netstats *tstats; + const struct iphdr *iph = ip_hdr(skb); +- int err; ++ int nh, err; + + #ifdef CONFIG_NET_IPGRE_BROADCAST + if (ipv4_is_multicast(iph->daddr)) { +@@ -391,8 +391,21 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb, + tunnel->i_seqno = ntohl(tpi->seq) + 1; + } + ++ /* Save offset of outer header relative to skb->head, ++ * because we are going to reset the network header to the inner header ++ * and might change skb->head. ++ */ ++ nh = skb_network_header(skb) - skb->head; ++ + skb_set_network_header(skb, (tunnel->dev->type == ARPHRD_ETHER) ? ETH_HLEN : 0); + ++ if (!pskb_inet_may_pull(skb)) { ++ DEV_STATS_INC(tunnel->dev, rx_length_errors); ++ DEV_STATS_INC(tunnel->dev, rx_errors); ++ goto drop; ++ } ++ iph = (struct iphdr *)(skb->head + nh); ++ + err = IP_ECN_decapsulate(iph, skb); + if (unlikely(err)) { + if (log_ecn_error) +-- +2.43.0 + diff --git a/queue-5.4/net-kcm-fix-incorrect-parameter-validation-in-the-kc.patch b/queue-5.4/net-kcm-fix-incorrect-parameter-validation-in-the-kc.patch new file mode 100644 index 00000000000..6612e0110fe --- /dev/null +++ b/queue-5.4/net-kcm-fix-incorrect-parameter-validation-in-the-kc.patch @@ -0,0 +1,45 @@ +From eb35249ab0799c2b11be25acf6b1db31a827d214 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Mar 2024 14:23:50 +0000 +Subject: net: kcm: fix incorrect parameter validation in the kcm_getsockopt) + function + +From: Gavrilov Ilia + +[ Upstream commit 3ed5f415133f9b7518fbe55ba9ae9a3f5e700929 ] + +The 'len' variable can't be negative when assigned the result of +'min_t' because all 'min_t' parameters are cast to unsigned int, +and then the minimum one is chosen. + +To fix the logic, check 'len' as read from 'optlen', +where the types of relevant variables are (signed) int. + +Fixes: ab7ac4eb9832 ("kcm: Kernel Connection Multiplexor module") +Signed-off-by: Gavrilov Ilia +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/kcm/kcmsock.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c +index 8a8ea7e6774d5..920b0ebf1cb80 100644 +--- a/net/kcm/kcmsock.c ++++ b/net/kcm/kcmsock.c +@@ -1277,10 +1277,11 @@ static int kcm_getsockopt(struct socket *sock, int level, int optname, + if (get_user(len, optlen)) + return -EFAULT; + +- len = min_t(unsigned int, len, sizeof(int)); + if (len < 0) + return -EINVAL; + ++ len = min_t(unsigned int, len, sizeof(int)); ++ + switch (optname) { + case KCM_RECV_DISABLE: + val = kcm->rx_disabled; +-- +2.43.0 + diff --git a/queue-5.4/net-sunrpc-fix-an-off-by-one-in-rpc_sockaddr2uaddr.patch b/queue-5.4/net-sunrpc-fix-an-off-by-one-in-rpc_sockaddr2uaddr.patch new file mode 100644 index 00000000000..e75161163d0 --- /dev/null +++ b/queue-5.4/net-sunrpc-fix-an-off-by-one-in-rpc_sockaddr2uaddr.patch @@ -0,0 +1,42 @@ +From 2ba2f901fa050cae7b024f208f0219931f5b2568 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 24 Oct 2023 23:58:20 +0200 +Subject: net: sunrpc: Fix an off by one in rpc_sockaddr2uaddr() + +From: Christophe JAILLET + +[ Upstream commit d6f4de70f73a106986ee315d7d512539f2f3303a ] + +The intent is to check if the strings' are truncated or not. So, >= should +be used instead of >, because strlcat() and snprintf() return the length of +the output, excluding the trailing NULL. + +Fixes: a02d69261134 ("SUNRPC: Provide functions for managing universal addresses") +Signed-off-by: Christophe JAILLET +Reviewed-by: Benjamin Coddington +Signed-off-by: Trond Myklebust +Signed-off-by: Sasha Levin +--- + net/sunrpc/addr.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/net/sunrpc/addr.c b/net/sunrpc/addr.c +index 0d4a2bb09589c..be2fc88f5bde1 100644 +--- a/net/sunrpc/addr.c ++++ b/net/sunrpc/addr.c +@@ -288,10 +288,10 @@ char *rpc_sockaddr2uaddr(const struct sockaddr *sap, gfp_t gfp_flags) + } + + if (snprintf(portbuf, sizeof(portbuf), +- ".%u.%u", port >> 8, port & 0xff) > (int)sizeof(portbuf)) ++ ".%u.%u", port >> 8, port & 0xff) >= (int)sizeof(portbuf)) + return NULL; + +- if (strlcat(addrbuf, portbuf, sizeof(addrbuf)) > sizeof(addrbuf)) ++ if (strlcat(addrbuf, portbuf, sizeof(addrbuf)) >= sizeof(addrbuf)) + return NULL; + + return kstrdup(addrbuf, gfp_flags); +-- +2.43.0 + diff --git a/queue-5.4/net-x25-fix-incorrect-parameter-validation-in-the-x2.patch b/queue-5.4/net-x25-fix-incorrect-parameter-validation-in-the-x2.patch new file mode 100644 index 00000000000..d08c900ab07 --- /dev/null +++ b/queue-5.4/net-x25-fix-incorrect-parameter-validation-in-the-x2.patch @@ -0,0 +1,47 @@ +From 04489a5f01016807dc7a700e60c16ff4f7356491 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Mar 2024 14:23:50 +0000 +Subject: net/x25: fix incorrect parameter validation in the x25_getsockopt() + function + +From: Gavrilov Ilia + +[ Upstream commit d6eb8de2015f0c24822e47356f839167ebde2945 ] + +The 'len' variable can't be negative when assigned the result of +'min_t' because all 'min_t' parameters are cast to unsigned int, +and then the minimum one is chosen. + +To fix the logic, check 'len' as read from 'optlen', +where the types of relevant variables are (signed) int. + +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Signed-off-by: Gavrilov Ilia +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/x25/af_x25.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c +index 43dd489ad6db9..851096110b4d4 100644 +--- a/net/x25/af_x25.c ++++ b/net/x25/af_x25.c +@@ -470,12 +470,12 @@ static int x25_getsockopt(struct socket *sock, int level, int optname, + if (get_user(len, optlen)) + goto out; + +- len = min_t(unsigned int, len, sizeof(int)); +- + rc = -EINVAL; + if (len < 0) + goto out; + ++ len = min_t(unsigned int, len, sizeof(int)); ++ + rc = -EFAULT; + if (put_user(len, optlen)) + goto out; +-- +2.43.0 + diff --git a/queue-5.4/nfp-flower-handle-acti_netdevs-allocation-failure.patch b/queue-5.4/nfp-flower-handle-acti_netdevs-allocation-failure.patch new file mode 100644 index 00000000000..0736fc5e196 --- /dev/null +++ b/queue-5.4/nfp-flower-handle-acti_netdevs-allocation-failure.patch @@ -0,0 +1,45 @@ +From f131825cc9162fb98697a7e1adf29deb74dc8845 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 Mar 2024 22:25:40 +0800 +Subject: nfp: flower: handle acti_netdevs allocation failure + +From: Duoming Zhou + +[ Upstream commit 84e95149bd341705f0eca6a7fcb955c548805002 ] + +The kmalloc_array() in nfp_fl_lag_do_work() will return null, if +the physical memory has run out. As a result, if we dereference +the acti_netdevs, the null pointer dereference bugs will happen. + +This patch adds a check to judge whether allocation failure occurs. +If it happens, the delayed work will be rescheduled and try again. + +Fixes: bb9a8d031140 ("nfp: flower: monitor and offload LAG groups") +Signed-off-by: Duoming Zhou +Reviewed-by: Louis Peens +Link: https://lore.kernel.org/r/20240308142540.9674-1-duoming@zju.edu.cn +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/netronome/nfp/flower/lag_conf.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/drivers/net/ethernet/netronome/nfp/flower/lag_conf.c b/drivers/net/ethernet/netronome/nfp/flower/lag_conf.c +index 63907aeb3884e..3167f9675ae0f 100644 +--- a/drivers/net/ethernet/netronome/nfp/flower/lag_conf.c ++++ b/drivers/net/ethernet/netronome/nfp/flower/lag_conf.c +@@ -308,6 +308,11 @@ static void nfp_fl_lag_do_work(struct work_struct *work) + + acti_netdevs = kmalloc_array(entry->slave_cnt, + sizeof(*acti_netdevs), GFP_KERNEL); ++ if (!acti_netdevs) { ++ schedule_delayed_work(&lag->work, ++ NFP_FL_LAG_DELAY); ++ continue; ++ } + + /* Include sanity check in the loop. It may be that a bond has + * changed between processing the last notification and the +-- +2.43.0 + diff --git a/queue-5.4/nfs-fix-an-off-by-one-in-root_nfs_cat.patch b/queue-5.4/nfs-fix-an-off-by-one-in-root_nfs_cat.patch new file mode 100644 index 00000000000..d0555aab7e1 --- /dev/null +++ b/queue-5.4/nfs-fix-an-off-by-one-in-root_nfs_cat.patch @@ -0,0 +1,42 @@ +From c8ef75a6806194db4024dda2c2f8283a8e17f5fd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 18 Feb 2024 22:16:53 +0100 +Subject: NFS: Fix an off by one in root_nfs_cat() + +From: Christophe JAILLET + +[ Upstream commit 698ad1a538da0b6bf969cfee630b4e3a026afb87 ] + +The intent is to check if 'dest' is truncated or not. So, >= should be +used instead of >, because strlcat() returns the length of 'dest' and 'src' +excluding the trailing NULL. + +Fixes: 56463e50d1fc ("NFS: Use super.c for NFSROOT mount option parsing") +Signed-off-by: Christophe JAILLET +Reviewed-by: Benjamin Coddington +Signed-off-by: Trond Myklebust +Signed-off-by: Sasha Levin +--- + fs/nfs/nfsroot.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/fs/nfs/nfsroot.c b/fs/nfs/nfsroot.c +index effaa4247b912..c0f2e1751c33e 100644 +--- a/fs/nfs/nfsroot.c ++++ b/fs/nfs/nfsroot.c +@@ -169,10 +169,10 @@ static int __init root_nfs_cat(char *dest, const char *src, + size_t len = strlen(dest); + + if (len && dest[len - 1] != ',') +- if (strlcat(dest, ",", destlen) > destlen) ++ if (strlcat(dest, ",", destlen) >= destlen) + return -1; + +- if (strlcat(dest, src, destlen) > destlen) ++ if (strlcat(dest, src, destlen) >= destlen) + return -1; + return 0; + } +-- +2.43.0 + diff --git a/queue-5.4/pci-aer-fix-rootport-attribute-paths-in-abi-docs.patch b/queue-5.4/pci-aer-fix-rootport-attribute-paths-in-abi-docs.patch new file mode 100644 index 00000000000..8bd4c0b2c92 --- /dev/null +++ b/queue-5.4/pci-aer-fix-rootport-attribute-paths-in-abi-docs.patch @@ -0,0 +1,52 @@ +From e8f52dae02bfa3f9df767f93237290de6771ab6b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 2 Feb 2024 14:16:34 +0100 +Subject: PCI/AER: Fix rootport attribute paths in ABI docs + +From: Johan Hovold + +[ Upstream commit 0e7d29a39a546161ea3a49e8e282a43212d7ff68 ] + +The 'aer_stats' directory never made it into the sixth and final revision +of the series adding the sysfs AER attributes. + +Link: https://lore.kernel.org/r/20240202131635.11405-2-johan+linaro@kernel.org +Link: https://lore.kernel.org/lkml/20180621184822.GB14136@bhelgaas-glaptop.roam.corp.google.com/ +Fixes: 12833017e581 ("PCI/AER: Add sysfs attributes for rootport cumulative stats") +Signed-off-by: Johan Hovold +Signed-off-by: Bjorn Helgaas +Signed-off-by: Sasha Levin +--- + Documentation/ABI/testing/sysfs-bus-pci-devices-aer_stats | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/Documentation/ABI/testing/sysfs-bus-pci-devices-aer_stats b/Documentation/ABI/testing/sysfs-bus-pci-devices-aer_stats +index 3c9a8c4a25eb8..988724cc85182 100644 +--- a/Documentation/ABI/testing/sysfs-bus-pci-devices-aer_stats ++++ b/Documentation/ABI/testing/sysfs-bus-pci-devices-aer_stats +@@ -103,19 +103,19 @@ collectors) that are AER capable. These indicate the number of error messages as + device, so these counters include them and are thus cumulative of all the error + messages on the PCI hierarchy originating at that root port. + +-What: /sys/bus/pci/devices//aer_stats/aer_rootport_total_err_cor ++What: /sys/bus/pci/devices//aer_rootport_total_err_cor + Date: July 2018 + KernelVersion: 4.19.0 + Contact: linux-pci@vger.kernel.org, rajatja@google.com + Description: Total number of ERR_COR messages reported to rootport. + +-What: /sys/bus/pci/devices//aer_stats/aer_rootport_total_err_fatal ++What: /sys/bus/pci/devices//aer_rootport_total_err_fatal + Date: July 2018 + KernelVersion: 4.19.0 + Contact: linux-pci@vger.kernel.org, rajatja@google.com + Description: Total number of ERR_FATAL messages reported to rootport. + +-What: /sys/bus/pci/devices//aer_stats/aer_rootport_total_err_nonfatal ++What: /sys/bus/pci/devices//aer_rootport_total_err_nonfatal + Date: July 2018 + KernelVersion: 4.19.0 + Contact: linux-pci@vger.kernel.org, rajatja@google.com +-- +2.43.0 + diff --git a/queue-5.4/pci-dpc-print-all-tlp-prefixes-not-just-the-first.patch b/queue-5.4/pci-dpc-print-all-tlp-prefixes-not-just-the-first.patch new file mode 100644 index 00000000000..e7160583d81 --- /dev/null +++ b/queue-5.4/pci-dpc-print-all-tlp-prefixes-not-just-the-first.patch @@ -0,0 +1,45 @@ +From 9af1d0a621464366dd368bfacae06a665b0510d3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 18 Jan 2024 13:08:15 +0200 +Subject: PCI/DPC: Print all TLP Prefixes, not just the first +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Ilpo Järvinen + +[ Upstream commit 6568d82512b0a64809acff3d7a747362fa4288c8 ] + +The TLP Prefix Log Register consists of multiple DWORDs (PCIe r6.1 sec +7.9.14.13) but the loop in dpc_process_rp_pio_error() keeps reading from +the first DWORD, so we print only the first PIO TLP Prefix (duplicated +several times), and we never print the second, third, etc., Prefixes. + +Add the iteration count based offset calculation into the config read. + +Fixes: f20c4ea49ec4 ("PCI/DPC: Add eDPC support") +Link: https://lore.kernel.org/r/20240118110815.3867-1-ilpo.jarvinen@linux.intel.com +Signed-off-by: Ilpo Järvinen +[bhelgaas: add user-visible details to commit log] +Signed-off-by: Bjorn Helgaas +Signed-off-by: Sasha Levin +--- + drivers/pci/pcie/dpc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/pci/pcie/dpc.c b/drivers/pci/pcie/dpc.c +index a32ec3487a8d0..d5734a83606fb 100644 +--- a/drivers/pci/pcie/dpc.c ++++ b/drivers/pci/pcie/dpc.c +@@ -195,7 +195,7 @@ static void dpc_process_rp_pio_error(struct dpc_dev *dpc) + + for (i = 0; i < dpc->rp_log_size - 5; i++) { + pci_read_config_dword(pdev, +- cap + PCI_EXP_DPC_RP_PIO_TLPPREFIX_LOG, &prefix); ++ cap + PCI_EXP_DPC_RP_PIO_TLPPREFIX_LOG + i * 4, &prefix); + pci_err(pdev, "TLP Prefix Header: dw%d, %#010x\n", i, prefix); + } + clear_status: +-- +2.43.0 + diff --git a/queue-5.4/pci-mark-3ware-9650se-root-port-extended-tags-as-bro.patch b/queue-5.4/pci-mark-3ware-9650se-root-port-extended-tags-as-bro.patch new file mode 100644 index 00000000000..f45555a4cba --- /dev/null +++ b/queue-5.4/pci-mark-3ware-9650se-root-port-extended-tags-as-bro.patch @@ -0,0 +1,56 @@ +From 4b8093ccdf31d8455e46336fe62934ce8df54c96 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 19 Feb 2024 14:28:11 +0100 +Subject: PCI: Mark 3ware-9650SE Root Port Extended Tags as broken +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Jörg Wedekind + +[ Upstream commit baf67aefbe7d7deafa59ca49612d163f8889934c ] + +Per PCIe r6.1, sec 2.2.6.2 and 7.5.3.4, a Requester may not use 8-bit Tags +unless its Extended Tag Field Enable is set, but all Receivers/Completers +must handle 8-bit Tags correctly regardless of their Extended Tag Field +Enable. + +Some devices do not handle 8-bit Tags as Completers, so add a quirk for +them. If we find such a device, we disable Extended Tags for the entire +hierarchy to make peer-to-peer DMA possible. + +The 3ware 9650SE seems to have issues with handling 8-bit tags. Mark it as +broken. + +This fixes PCI Parity Errors like : + + 3w-9xxx: scsi0: ERROR: (0x06:0x000C): PCI Parity Error: clearing. + 3w-9xxx: scsi0: ERROR: (0x06:0x000D): PCI Abort: clearing. + 3w-9xxx: scsi0: ERROR: (0x06:0x000E): Controller Queue Error: clearing. + 3w-9xxx: scsi0: ERROR: (0x06:0x0010): Microcontroller Error: clearing. + +Link: https://lore.kernel.org/r/20240219132811.8351-1-joerg@wedekind.de +Fixes: 60db3a4d8cc9 ("PCI: Enable PCIe Extended Tags if supported") +Closes: https://bugzilla.kernel.org/show_bug.cgi?id=202425 +Signed-off-by: Jörg Wedekind +Signed-off-by: Bjorn Helgaas +Signed-off-by: Sasha Levin +--- + drivers/pci/quirks.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c +index 821e71a45849c..3bc7058404156 100644 +--- a/drivers/pci/quirks.c ++++ b/drivers/pci/quirks.c +@@ -5396,6 +5396,7 @@ static void quirk_no_ext_tags(struct pci_dev *pdev) + + pci_walk_bus(bridge->bus, pci_configure_extended_tags, NULL); + } ++DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_3WARE, 0x1004, quirk_no_ext_tags); + DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0132, quirk_no_ext_tags); + DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0140, quirk_no_ext_tags); + DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0141, quirk_no_ext_tags); +-- +2.43.0 + diff --git a/queue-5.4/pci-switchtec-fix-an-error-handling-path-in-switchte.patch b/queue-5.4/pci-switchtec-fix-an-error-handling-path-in-switchte.patch new file mode 100644 index 00000000000..bba63665d23 --- /dev/null +++ b/queue-5.4/pci-switchtec-fix-an-error-handling-path-in-switchte.patch @@ -0,0 +1,51 @@ +From 860f138d710081c5f845bc19410131ae86760b1a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Dec 2023 15:30:01 +0100 +Subject: PCI: switchtec: Fix an error handling path in switchtec_pci_probe() + +From: Christophe JAILLET + +[ Upstream commit dec529b0b0572b32f9eb91c882dd1f08ca657efb ] + +The commit in Fixes changed the logic on how resources are released and +introduced a new switchtec_exit_pci() that need to be called explicitly in +order to undo a corresponding switchtec_init_pci(). + +This was done in the remove function, but not in the probe. + +Fix the probe now. + +Fixes: df25461119d9 ("PCI: switchtec: Fix stdev_release() crash after surprise hot remove") +Link: https://lore.kernel.org/r/01446d2ccb91a578239915812f2b7dfbeb2882af.1703428183.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Christophe JAILLET +Signed-off-by: Bjorn Helgaas +Signed-off-by: Sasha Levin +--- + drivers/pci/switch/switchtec.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/pci/switch/switchtec.c b/drivers/pci/switch/switchtec.c +index 0037f368f62b9..0b83252358527 100644 +--- a/drivers/pci/switch/switchtec.c ++++ b/drivers/pci/switch/switchtec.c +@@ -1433,7 +1433,7 @@ static int switchtec_pci_probe(struct pci_dev *pdev, + rc = switchtec_init_isr(stdev); + if (rc) { + dev_err(&stdev->dev, "failed to init isr.\n"); +- goto err_put; ++ goto err_exit_pci; + } + + iowrite32(SWITCHTEC_EVENT_CLEAR | +@@ -1454,6 +1454,8 @@ static int switchtec_pci_probe(struct pci_dev *pdev, + + err_devadd: + stdev_kill(stdev); ++err_exit_pci: ++ switchtec_exit_pci(stdev); + err_put: + ida_simple_remove(&switchtec_minor_ida, MINOR(stdev->dev.devt)); + put_device(&stdev->dev); +-- +2.43.0 + diff --git a/queue-5.4/perf-evsel-fix-duplicate-initialization-of-data-id-i.patch b/queue-5.4/perf-evsel-fix-duplicate-initialization-of-data-id-i.patch new file mode 100644 index 00000000000..0ac20a2a146 --- /dev/null +++ b/queue-5.4/perf-evsel-fix-duplicate-initialization-of-data-id-i.patch @@ -0,0 +1,38 @@ +From 05593d669f20d14c10a70fdce0fe9c432b92b9e2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 27 Jan 2024 02:57:56 +0000 +Subject: perf evsel: Fix duplicate initialization of data->id in + evsel__parse_sample() + +From: Yang Jihong + +[ Upstream commit 4962aec0d684c8edb14574ccd0da53e4926ff834 ] + +data->id has been initialized at line 2362, remove duplicate initialization. + +Fixes: 3ad31d8a0df2 ("perf evsel: Centralize perf_sample initialization") +Signed-off-by: Yang Jihong +Reviewed-by: Arnaldo Carvalho de Melo +Reviewed-by: Ian Rogers +Signed-off-by: Namhyung Kim +Link: https://lore.kernel.org/r/20240127025756.4041808-1-yangjihong1@huawei.com +Signed-off-by: Sasha Levin +--- + tools/perf/util/evsel.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c +index 9dd9e3f4ef591..cd1eddf0ab371 100644 +--- a/tools/perf/util/evsel.c ++++ b/tools/perf/util/evsel.c +@@ -1955,7 +1955,6 @@ int perf_evsel__parse_sample(struct evsel *evsel, union perf_event *event, + data->period = evsel->core.attr.sample_period; + data->cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; + data->misc = event->header.misc; +- data->id = -1ULL; + data->data_src = PERF_MEM_DATA_SRC_NONE; + + if (event->header.type != PERF_RECORD_SAMPLE) { +-- +2.43.0 + diff --git a/queue-5.4/perf-record-fix-possible-incorrect-free-in-record__s.patch b/queue-5.4/perf-record-fix-possible-incorrect-free-in-record__s.patch new file mode 100644 index 00000000000..39390717f7a --- /dev/null +++ b/queue-5.4/perf-record-fix-possible-incorrect-free-in-record__s.patch @@ -0,0 +1,40 @@ +From c1466ae4f9cfc4899517b440cba829a4b6ed0dd7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 19 Jan 2024 04:03:02 +0000 +Subject: perf record: Fix possible incorrect free in record__switch_output() + +From: Yang Jihong + +[ Upstream commit aff10a165201f6f60cff225083ce301ad3f5d8f1 ] + +perf_data__switch() may not assign a legal value to 'new_filename'. +In this case, 'new_filename' uses the on-stack value, which may cause a +incorrect free and unexpected result. + +Fixes: 03724b2e9c45 ("perf record: Allow to limit number of reported perf.data files") +Signed-off-by: Yang Jihong +Acked-by: Namhyung Kim +Link: https://lore.kernel.org/r/20240119040304.3708522-2-yangjihong1@huawei.com +Signed-off-by: Namhyung Kim +Signed-off-by: Sasha Levin +--- + tools/perf/builtin-record.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c +index a9891c9fe94d5..9c03f67398cb2 100644 +--- a/tools/perf/builtin-record.c ++++ b/tools/perf/builtin-record.c +@@ -1110,8 +1110,8 @@ static int + record__switch_output(struct record *rec, bool at_exit) + { + struct perf_data *data = &rec->data; ++ char *new_filename = NULL; + int fd, err; +- char *new_filename; + + /* Same Size: "2015122520103046"*/ + char timestamp[] = "InvalidTimestamp"; +-- +2.43.0 + diff --git a/queue-5.4/perf-stat-avoid-metric-only-segv.patch b/queue-5.4/perf-stat-avoid-metric-only-segv.patch new file mode 100644 index 00000000000..e9916d055e6 --- /dev/null +++ b/queue-5.4/perf-stat-avoid-metric-only-segv.patch @@ -0,0 +1,43 @@ +From a909df0d22f3cef465889b38a1f0523b86c7bbb7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 9 Feb 2024 12:49:46 -0800 +Subject: perf stat: Avoid metric-only segv + +From: Ian Rogers + +[ Upstream commit 2543947c77e0e224bda86b4e7220c2f6714da463 ] + +Cycles is recognized as part of a hard coded metric in stat-shadow.c, +it may call print_metric_only with a NULL fmt string leading to a +segfault. Handle the NULL fmt explicitly. + +Fixes: 088519f318be ("perf stat: Move the display functions to stat-display.c") +Signed-off-by: Ian Rogers +Reviewed-by: Kan Liang +Cc: K Prateek Nayak +Cc: James Clark +Cc: Kaige Ye +Cc: John Garry +Signed-off-by: Namhyung Kim +Link: https://lore.kernel.org/r/20240209204947.3873294-4-irogers@google.com +Signed-off-by: Sasha Levin +--- + tools/perf/util/stat-display.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c +index e18c26501a7fe..70612ec583f35 100644 +--- a/tools/perf/util/stat-display.c ++++ b/tools/perf/util/stat-display.c +@@ -263,7 +263,7 @@ static void print_metric_only(struct perf_stat_config *config, + if (color) + mlen += strlen(color) + sizeof(PERF_COLOR_RESET) - 1; + +- color_snprintf(str, sizeof(str), color ?: "", fmt, val); ++ color_snprintf(str, sizeof(str), color ?: "", fmt ?: "", val); + fprintf(out, "%*s ", mlen, str); + } + +-- +2.43.0 + diff --git a/queue-5.4/perf-thread_map-free-strlist-on-normal-path-in-threa.patch b/queue-5.4/perf-thread_map-free-strlist-on-normal-path-in-threa.patch new file mode 100644 index 00000000000..ff4ac53adf0 --- /dev/null +++ b/queue-5.4/perf-thread_map-free-strlist-on-normal-path-in-threa.patch @@ -0,0 +1,45 @@ +From 44e988778f11aafc0e53ed383dcd46c6f3cbfdc6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 6 Feb 2024 08:32:28 +0000 +Subject: perf thread_map: Free strlist on normal path in + thread_map__new_by_tid_str() + +From: Yang Jihong + +[ Upstream commit 1eb3d924e3c0b8c27388b0583a989d757866efb6 ] + +slist needs to be freed in both error path and normal path in +thread_map__new_by_tid_str(). + +Fixes: b52956c961be3a04 ("perf tools: Allow multiple threads or processes in record, stat, top") +Reviewed-by: Arnaldo Carvalho de Melo +Signed-off-by: Yang Jihong +Signed-off-by: Namhyung Kim +Link: https://lore.kernel.org/r/20240206083228.172607-6-yangjihong1@huawei.com +Signed-off-by: Sasha Levin +--- + tools/perf/util/thread_map.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/perf/util/thread_map.c b/tools/perf/util/thread_map.c +index c9bfe4696943b..cee7fc3b5bb0c 100644 +--- a/tools/perf/util/thread_map.c ++++ b/tools/perf/util/thread_map.c +@@ -279,13 +279,13 @@ struct perf_thread_map *thread_map__new_by_tid_str(const char *tid_str) + threads->nr = ntasks; + } + out: ++ strlist__delete(slist); + if (threads) + refcount_set(&threads->refcnt, 1); + return threads; + + out_free_threads: + zfree(&threads); +- strlist__delete(slist); + goto out; + } + +-- +2.43.0 + diff --git a/queue-5.4/powerpc-embedded6xx-fix-no-previous-prototype-for-av.patch b/queue-5.4/powerpc-embedded6xx-fix-no-previous-prototype-for-av.patch new file mode 100644 index 00000000000..fc8bb6fe1bb --- /dev/null +++ b/queue-5.4/powerpc-embedded6xx-fix-no-previous-prototype-for-av.patch @@ -0,0 +1,53 @@ +From a6d4d25715e7cd0f1f06a982c6b3ed9a121015d8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Mar 2024 23:34:08 +1100 +Subject: powerpc/embedded6xx: Fix no previous prototype for avr_uart_send() + etc. + +From: Michael Ellerman + +[ Upstream commit 20933531be0577cdd782216858c26150dbc7936f ] + +Move the prototypes into mpc10x.h which is included by all the relevant +C files, fixes: + + arch/powerpc/platforms/embedded6xx/ls_uart.c:59:6: error: no previous prototype for 'avr_uart_configure' + arch/powerpc/platforms/embedded6xx/ls_uart.c:82:6: error: no previous prototype for 'avr_uart_send' + +Signed-off-by: Michael Ellerman +Link: https://msgid.link/20240305123410.3306253-1-mpe@ellerman.id.au +Signed-off-by: Sasha Levin +--- + arch/powerpc/platforms/embedded6xx/linkstation.c | 3 --- + arch/powerpc/platforms/embedded6xx/mpc10x.h | 3 +++ + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/arch/powerpc/platforms/embedded6xx/linkstation.c b/arch/powerpc/platforms/embedded6xx/linkstation.c +index f514d5d28cd4f..3f3821eb4c36b 100644 +--- a/arch/powerpc/platforms/embedded6xx/linkstation.c ++++ b/arch/powerpc/platforms/embedded6xx/linkstation.c +@@ -97,9 +97,6 @@ static void __init linkstation_init_IRQ(void) + mpic_init(mpic); + } + +-extern void avr_uart_configure(void); +-extern void avr_uart_send(const char); +- + static void __noreturn linkstation_restart(char *cmd) + { + local_irq_disable(); +diff --git a/arch/powerpc/platforms/embedded6xx/mpc10x.h b/arch/powerpc/platforms/embedded6xx/mpc10x.h +index 5ad12023e5628..ebc258fa4858d 100644 +--- a/arch/powerpc/platforms/embedded6xx/mpc10x.h ++++ b/arch/powerpc/platforms/embedded6xx/mpc10x.h +@@ -156,4 +156,7 @@ int mpc10x_disable_store_gathering(struct pci_controller *hose); + /* For MPC107 boards that use the built-in openpic */ + void mpc10x_set_openpic(void); + ++void avr_uart_configure(void); ++void avr_uart_send(const char c); ++ + #endif /* __PPC_KERNEL_MPC10X_H */ +-- +2.43.0 + diff --git a/queue-5.4/powerpc-hv-gpci-fix-the-h_get_perf_counter_info-hcal.patch b/queue-5.4/powerpc-hv-gpci-fix-the-h_get_perf_counter_info-hcal.patch new file mode 100644 index 00000000000..ca9fa8e45bc --- /dev/null +++ b/queue-5.4/powerpc-hv-gpci-fix-the-h_get_perf_counter_info-hcal.patch @@ -0,0 +1,118 @@ +From 2569940bd45e338fc1cd599aee47acac2f85319f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 29 Feb 2024 17:58:47 +0530 +Subject: powerpc/hv-gpci: Fix the H_GET_PERF_COUNTER_INFO hcall return value + checks + +From: Kajol Jain + +[ Upstream commit ad86d7ee43b22aa2ed60fb982ae94b285c1be671 ] + +Running event hv_gpci/dispatch_timebase_by_processor_processor_time_in_timebase_cycles,phys_processor_idx=0/ +in one of the system throws below error: + + ---Logs--- + # perf list | grep hv_gpci/dispatch_timebase_by_processor_processor_time_in_timebase_cycles + hv_gpci/dispatch_timebase_by_processor_processor_time_in_timebase_cycles,phys_processor_idx=?/[Kernel PMU event] + + # perf stat -v -e hv_gpci/dispatch_timebase_by_processor_processor_time_in_timebase_cycles,phys_processor_idx=0/ sleep 2 +Using CPUID 00800200 +Control descriptor is not initialized +Warning: +hv_gpci/dispatch_timebase_by_processor_processor_time_in_timebase_cycles,phys_processor_idx=0/ event is not supported by the kernel. +failed to read counter hv_gpci/dispatch_timebase_by_processor_processor_time_in_timebase_cycles,phys_processor_idx=0/ + + Performance counter stats for 'system wide': + + hv_gpci/dispatch_timebase_by_processor_processor_time_in_timebase_cycles,phys_processor_idx=0/ + + 2.000700771 seconds time elapsed + +The above error is because of the hcall failure as required +permission "Enable Performance Information Collection" is not set. +Based on current code, single_gpci_request function did not check the +error type incase hcall fails and by default returns EINVAL. But we can +have other reasons for hcall failures like H_AUTHORITY/H_PARAMETER with +detail_rc as GEN_BUF_TOO_SMALL, for which we need to act accordingly. + +Fix this issue by adding new checks in the single_gpci_request and +h_gpci_event_init functions. + +Result after fix patch changes: + + # perf stat -e hv_gpci/dispatch_timebase_by_processor_processor_time_in_timebase_cycles,phys_processor_idx=0/ sleep 2 +Error: +No permission to enable hv_gpci/dispatch_timebase_by_processor_processor_time_in_timebase_cycles,phys_processor_idx=0/ event. + +Fixes: 220a0c609ad1 ("powerpc/perf: Add support for the hv gpci (get performance counter info) interface") +Reported-by: Akanksha J N +Signed-off-by: Kajol Jain +Signed-off-by: Michael Ellerman +Link: https://msgid.link/20240229122847.101162-1-kjain@linux.ibm.com +Signed-off-by: Sasha Levin +--- + arch/powerpc/perf/hv-gpci.c | 29 +++++++++++++++++++++++++++-- + 1 file changed, 27 insertions(+), 2 deletions(-) + +diff --git a/arch/powerpc/perf/hv-gpci.c b/arch/powerpc/perf/hv-gpci.c +index ac3f3df57fe39..e85f1962be024 100644 +--- a/arch/powerpc/perf/hv-gpci.c ++++ b/arch/powerpc/perf/hv-gpci.c +@@ -153,6 +153,20 @@ static unsigned long single_gpci_request(u32 req, u32 starting_index, + + ret = plpar_hcall_norets(H_GET_PERF_COUNTER_INFO, + virt_to_phys(arg), HGPCI_REQ_BUFFER_SIZE); ++ ++ /* ++ * ret value as 'H_PARAMETER' with detail_rc as 'GEN_BUF_TOO_SMALL', ++ * specifies that the current buffer size cannot accommodate ++ * all the information and a partial buffer returned. ++ * Since in this function we are only accessing data for a given starting index, ++ * we don't need to accommodate whole data and can get required count by ++ * accessing first entry data. ++ * Hence hcall fails only incase the ret value is other than H_SUCCESS or ++ * H_PARAMETER with detail_rc value as GEN_BUF_TOO_SMALL(0x1B). ++ */ ++ if (ret == H_PARAMETER && be32_to_cpu(arg->params.detail_rc) == 0x1B) ++ ret = 0; ++ + if (ret) { + pr_devel("hcall failed: 0x%lx\n", ret); + goto out; +@@ -217,6 +231,7 @@ static int h_gpci_event_init(struct perf_event *event) + { + u64 count; + u8 length; ++ unsigned long ret; + + /* Not our event */ + if (event->attr.type != event->pmu->type) +@@ -247,13 +262,23 @@ static int h_gpci_event_init(struct perf_event *event) + } + + /* check if the request works... */ +- if (single_gpci_request(event_get_request(event), ++ ret = single_gpci_request(event_get_request(event), + event_get_starting_index(event), + event_get_secondary_index(event), + event_get_counter_info_version(event), + event_get_offset(event), + length, +- &count)) { ++ &count); ++ ++ /* ++ * ret value as H_AUTHORITY implies that partition is not permitted to retrieve ++ * performance information, and required to set ++ * "Enable Performance Information Collection" option. ++ */ ++ if (ret == H_AUTHORITY) ++ return -EPERM; ++ ++ if (ret) { + pr_devel("gpci hcall failed\n"); + return -EINVAL; + } +-- +2.43.0 + diff --git a/queue-5.4/quota-fix-potential-null-pointer-dereference.patch b/queue-5.4/quota-fix-potential-null-pointer-dereference.patch new file mode 100644 index 00000000000..72fe45b00d2 --- /dev/null +++ b/queue-5.4/quota-fix-potential-null-pointer-dereference.patch @@ -0,0 +1,278 @@ +From 8b54f5837a040f25dc623e086bded121674b1c41 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 2 Feb 2024 16:18:52 +0800 +Subject: quota: Fix potential NULL pointer dereference + +From: Wang Jianjian + +[ Upstream commit d0aa72604fbd80c8aabb46eda00535ed35570f1f ] + +Below race may cause NULL pointer dereference + +P1 P2 +dquot_free_inode quota_off + drop_dquot_ref + remove_dquot_ref + dquots = i_dquot(inode) + dquots = i_dquot(inode) + srcu_read_lock + dquots[cnt]) != NULL (1) + dquots[type] = NULL (2) + spin_lock(&dquots[cnt]->dq_dqb_lock) (3) + .... + +If dquot_free_inode(or other routines) checks inode's quota pointers (1) +before quota_off sets it to NULL(2) and use it (3) after that, NULL pointer +dereference will be triggered. + +So let's fix it by using a temporary pointer to avoid this issue. + +Signed-off-by: Wang Jianjian +Signed-off-by: Jan Kara +Message-Id: <20240202081852.2514092-1-wangjianjian3@huawei.com> +Stable-dep-of: 179b8c97ebf6 ("quota: Fix rcu annotations of inode dquot pointers") +Signed-off-by: Sasha Levin +--- + fs/quota/dquot.c | 98 ++++++++++++++++++++++++++++-------------------- + 1 file changed, 57 insertions(+), 41 deletions(-) + +diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c +index 08ca5b1a5fba5..c4726a1895582 100644 +--- a/fs/quota/dquot.c ++++ b/fs/quota/dquot.c +@@ -399,15 +399,17 @@ int dquot_mark_dquot_dirty(struct dquot *dquot) + EXPORT_SYMBOL(dquot_mark_dquot_dirty); + + /* Dirtify all the dquots - this can block when journalling */ +-static inline int mark_all_dquot_dirty(struct dquot * const *dquot) ++static inline int mark_all_dquot_dirty(struct dquot * const *dquots) + { + int ret, err, cnt; ++ struct dquot *dquot; + + ret = err = 0; + for (cnt = 0; cnt < MAXQUOTAS; cnt++) { +- if (dquot[cnt]) ++ dquot = srcu_dereference(dquots[cnt], &dquot_srcu); ++ if (dquot) + /* Even in case of error we have to continue */ +- ret = mark_dquot_dirty(dquot[cnt]); ++ ret = mark_dquot_dirty(dquot); + if (!err) + err = ret; + } +@@ -1675,6 +1677,7 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags) + struct dquot_warn warn[MAXQUOTAS]; + int reserve = flags & DQUOT_SPACE_RESERVE; + struct dquot **dquots; ++ struct dquot *dquot; + + if (!inode_quota_active(inode)) { + if (reserve) { +@@ -1694,27 +1697,26 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags) + index = srcu_read_lock(&dquot_srcu); + spin_lock(&inode->i_lock); + for (cnt = 0; cnt < MAXQUOTAS; cnt++) { +- if (!dquots[cnt]) ++ dquot = srcu_dereference(dquots[cnt], &dquot_srcu); ++ if (!dquot) + continue; + if (reserve) { +- ret = dquot_add_space(dquots[cnt], 0, number, flags, +- &warn[cnt]); ++ ret = dquot_add_space(dquot, 0, number, flags, &warn[cnt]); + } else { +- ret = dquot_add_space(dquots[cnt], number, 0, flags, +- &warn[cnt]); ++ ret = dquot_add_space(dquot, number, 0, flags, &warn[cnt]); + } + if (ret) { + /* Back out changes we already did */ + for (cnt--; cnt >= 0; cnt--) { +- if (!dquots[cnt]) ++ dquot = srcu_dereference(dquots[cnt], &dquot_srcu); ++ if (!dquot) + continue; +- spin_lock(&dquots[cnt]->dq_dqb_lock); ++ spin_lock(&dquot->dq_dqb_lock); + if (reserve) +- dquot_free_reserved_space(dquots[cnt], +- number); ++ dquot_free_reserved_space(dquot, number); + else +- dquot_decr_space(dquots[cnt], number); +- spin_unlock(&dquots[cnt]->dq_dqb_lock); ++ dquot_decr_space(dquot, number); ++ spin_unlock(&dquot->dq_dqb_lock); + } + spin_unlock(&inode->i_lock); + goto out_flush_warn; +@@ -1745,6 +1747,7 @@ int dquot_alloc_inode(struct inode *inode) + int cnt, ret = 0, index; + struct dquot_warn warn[MAXQUOTAS]; + struct dquot * const *dquots; ++ struct dquot *dquot; + + if (!inode_quota_active(inode)) + return 0; +@@ -1755,17 +1758,19 @@ int dquot_alloc_inode(struct inode *inode) + index = srcu_read_lock(&dquot_srcu); + spin_lock(&inode->i_lock); + for (cnt = 0; cnt < MAXQUOTAS; cnt++) { +- if (!dquots[cnt]) ++ dquot = srcu_dereference(dquots[cnt], &dquot_srcu); ++ if (!dquot) + continue; +- ret = dquot_add_inodes(dquots[cnt], 1, &warn[cnt]); ++ ret = dquot_add_inodes(dquot, 1, &warn[cnt]); + if (ret) { + for (cnt--; cnt >= 0; cnt--) { +- if (!dquots[cnt]) ++ dquot = srcu_dereference(dquots[cnt], &dquot_srcu); ++ if (!dquot) + continue; + /* Back out changes we already did */ +- spin_lock(&dquots[cnt]->dq_dqb_lock); +- dquot_decr_inodes(dquots[cnt], 1); +- spin_unlock(&dquots[cnt]->dq_dqb_lock); ++ spin_lock(&dquot->dq_dqb_lock); ++ dquot_decr_inodes(dquot, 1); ++ spin_unlock(&dquot->dq_dqb_lock); + } + goto warn_put_all; + } +@@ -1787,6 +1792,7 @@ EXPORT_SYMBOL(dquot_alloc_inode); + int dquot_claim_space_nodirty(struct inode *inode, qsize_t number) + { + struct dquot **dquots; ++ struct dquot *dquot; + int cnt, index; + + if (!inode_quota_active(inode)) { +@@ -1802,9 +1808,8 @@ int dquot_claim_space_nodirty(struct inode *inode, qsize_t number) + spin_lock(&inode->i_lock); + /* Claim reserved quotas to allocated quotas */ + for (cnt = 0; cnt < MAXQUOTAS; cnt++) { +- if (dquots[cnt]) { +- struct dquot *dquot = dquots[cnt]; +- ++ dquot = srcu_dereference(dquots[cnt], &dquot_srcu); ++ if (dquot) { + spin_lock(&dquot->dq_dqb_lock); + if (WARN_ON_ONCE(dquot->dq_dqb.dqb_rsvspace < number)) + number = dquot->dq_dqb.dqb_rsvspace; +@@ -1829,6 +1834,7 @@ EXPORT_SYMBOL(dquot_claim_space_nodirty); + void dquot_reclaim_space_nodirty(struct inode *inode, qsize_t number) + { + struct dquot **dquots; ++ struct dquot *dquot; + int cnt, index; + + if (!inode_quota_active(inode)) { +@@ -1844,9 +1850,8 @@ void dquot_reclaim_space_nodirty(struct inode *inode, qsize_t number) + spin_lock(&inode->i_lock); + /* Claim reserved quotas to allocated quotas */ + for (cnt = 0; cnt < MAXQUOTAS; cnt++) { +- if (dquots[cnt]) { +- struct dquot *dquot = dquots[cnt]; +- ++ dquot = srcu_dereference(dquots[cnt], &dquot_srcu); ++ if (dquot) { + spin_lock(&dquot->dq_dqb_lock); + if (WARN_ON_ONCE(dquot->dq_dqb.dqb_curspace < number)) + number = dquot->dq_dqb.dqb_curspace; +@@ -1873,6 +1878,7 @@ void __dquot_free_space(struct inode *inode, qsize_t number, int flags) + unsigned int cnt; + struct dquot_warn warn[MAXQUOTAS]; + struct dquot **dquots; ++ struct dquot *dquot; + int reserve = flags & DQUOT_SPACE_RESERVE, index; + + if (!inode_quota_active(inode)) { +@@ -1893,17 +1899,18 @@ void __dquot_free_space(struct inode *inode, qsize_t number, int flags) + int wtype; + + warn[cnt].w_type = QUOTA_NL_NOWARN; +- if (!dquots[cnt]) ++ dquot = srcu_dereference(dquots[cnt], &dquot_srcu); ++ if (!dquot) + continue; +- spin_lock(&dquots[cnt]->dq_dqb_lock); +- wtype = info_bdq_free(dquots[cnt], number); ++ spin_lock(&dquot->dq_dqb_lock); ++ wtype = info_bdq_free(dquot, number); + if (wtype != QUOTA_NL_NOWARN) +- prepare_warning(&warn[cnt], dquots[cnt], wtype); ++ prepare_warning(&warn[cnt], dquot, wtype); + if (reserve) +- dquot_free_reserved_space(dquots[cnt], number); ++ dquot_free_reserved_space(dquot, number); + else +- dquot_decr_space(dquots[cnt], number); +- spin_unlock(&dquots[cnt]->dq_dqb_lock); ++ dquot_decr_space(dquot, number); ++ spin_unlock(&dquot->dq_dqb_lock); + } + if (reserve) + *inode_reserved_space(inode) -= number; +@@ -1928,6 +1935,7 @@ void dquot_free_inode(struct inode *inode) + unsigned int cnt; + struct dquot_warn warn[MAXQUOTAS]; + struct dquot * const *dquots; ++ struct dquot *dquot; + int index; + + if (!inode_quota_active(inode)) +@@ -1938,16 +1946,16 @@ void dquot_free_inode(struct inode *inode) + spin_lock(&inode->i_lock); + for (cnt = 0; cnt < MAXQUOTAS; cnt++) { + int wtype; +- + warn[cnt].w_type = QUOTA_NL_NOWARN; +- if (!dquots[cnt]) ++ dquot = srcu_dereference(dquots[cnt], &dquot_srcu); ++ if (!dquot) + continue; +- spin_lock(&dquots[cnt]->dq_dqb_lock); +- wtype = info_idq_free(dquots[cnt], 1); ++ spin_lock(&dquot->dq_dqb_lock); ++ wtype = info_idq_free(dquot, 1); + if (wtype != QUOTA_NL_NOWARN) +- prepare_warning(&warn[cnt], dquots[cnt], wtype); +- dquot_decr_inodes(dquots[cnt], 1); +- spin_unlock(&dquots[cnt]->dq_dqb_lock); ++ prepare_warning(&warn[cnt], dquot, wtype); ++ dquot_decr_inodes(dquot, 1); ++ spin_unlock(&dquot->dq_dqb_lock); + } + spin_unlock(&inode->i_lock); + mark_all_dquot_dirty(dquots); +@@ -1974,7 +1982,7 @@ int __dquot_transfer(struct inode *inode, struct dquot **transfer_to) + qsize_t rsv_space = 0; + qsize_t inode_usage = 1; + struct dquot *transfer_from[MAXQUOTAS] = {}; +- int cnt, ret = 0; ++ int cnt, index, ret = 0; + char is_valid[MAXQUOTAS] = {}; + struct dquot_warn warn_to[MAXQUOTAS]; + struct dquot_warn warn_from_inodes[MAXQUOTAS]; +@@ -2063,8 +2071,16 @@ int __dquot_transfer(struct inode *inode, struct dquot **transfer_to) + spin_unlock(&inode->i_lock); + spin_unlock(&dq_data_lock); + ++ /* ++ * These arrays are local and we hold dquot references so we don't need ++ * the srcu protection but still take dquot_srcu to avoid warning in ++ * mark_all_dquot_dirty(). ++ */ ++ index = srcu_read_lock(&dquot_srcu); + mark_all_dquot_dirty(transfer_from); + mark_all_dquot_dirty(transfer_to); ++ srcu_read_unlock(&dquot_srcu, index); ++ + flush_warnings(warn_to); + flush_warnings(warn_from_inodes); + flush_warnings(warn_from_space); +-- +2.43.0 + diff --git a/queue-5.4/quota-fix-rcu-annotations-of-inode-dquot-pointers.patch b/queue-5.4/quota-fix-rcu-annotations-of-inode-dquot-pointers.patch new file mode 100644 index 00000000000..02035a9e3e6 --- /dev/null +++ b/queue-5.4/quota-fix-rcu-annotations-of-inode-dquot-pointers.patch @@ -0,0 +1,253 @@ +From 4371c9681962c584900a337b122d2f7c685cfffc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 6 Feb 2024 15:32:09 +0100 +Subject: quota: Fix rcu annotations of inode dquot pointers + +From: Jan Kara + +[ Upstream commit 179b8c97ebf63429589f5afeba59a181fe70603e ] + +Dquot pointers in i_dquot array in the inode are protected by +dquot_srcu. Annotate the array pointers with __rcu, perform the locked +dereferences with srcu_dereference_check() instead of plain reads, and +set the array elements with rcu_assign_pointer(). + +Fixes: b9ba6f94b238 ("quota: remove dqptr_sem") +Reported-by: kernel test robot +Closes: https://lore.kernel.org/oe-kbuild-all/202402061900.rTuYDlo6-lkp@intel.com/ +Signed-off-by: Jan Kara +Signed-off-by: Sasha Levin +--- + fs/quota/dquot.c | 66 ++++++++++++++++++++++++++++-------------------- + 1 file changed, 39 insertions(+), 27 deletions(-) + +diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c +index c4726a1895582..a7ddb874912d4 100644 +--- a/fs/quota/dquot.c ++++ b/fs/quota/dquot.c +@@ -399,7 +399,7 @@ int dquot_mark_dquot_dirty(struct dquot *dquot) + EXPORT_SYMBOL(dquot_mark_dquot_dirty); + + /* Dirtify all the dquots - this can block when journalling */ +-static inline int mark_all_dquot_dirty(struct dquot * const *dquots) ++static inline int mark_all_dquot_dirty(struct dquot __rcu * const *dquots) + { + int ret, err, cnt; + struct dquot *dquot; +@@ -997,14 +997,15 @@ struct dquot *dqget(struct super_block *sb, struct kqid qid) + } + EXPORT_SYMBOL(dqget); + +-static inline struct dquot **i_dquot(struct inode *inode) ++static inline struct dquot __rcu **i_dquot(struct inode *inode) + { +- return inode->i_sb->s_op->get_dquots(inode); ++ /* Force __rcu for now until filesystems are fixed */ ++ return (struct dquot __rcu **)inode->i_sb->s_op->get_dquots(inode); + } + + static int dqinit_needed(struct inode *inode, int type) + { +- struct dquot * const *dquots; ++ struct dquot __rcu * const *dquots; + int cnt; + + if (IS_NOQUOTA(inode)) +@@ -1094,14 +1095,16 @@ static void remove_dquot_ref(struct super_block *sb, int type) + */ + spin_lock(&dq_data_lock); + if (!IS_NOQUOTA(inode)) { +- struct dquot **dquots = i_dquot(inode); +- struct dquot *dquot = dquots[type]; ++ struct dquot __rcu **dquots = i_dquot(inode); ++ struct dquot *dquot = srcu_dereference_check( ++ dquots[type], &dquot_srcu, ++ lockdep_is_held(&dq_data_lock)); + + #ifdef CONFIG_QUOTA_DEBUG + if (unlikely(inode_get_rsv_space(inode) > 0)) + reserved = 1; + #endif +- dquots[type] = NULL; ++ rcu_assign_pointer(dquots[type], NULL); + if (dquot) + dqput(dquot); + } +@@ -1454,7 +1457,8 @@ static int inode_quota_active(const struct inode *inode) + static int __dquot_initialize(struct inode *inode, int type) + { + int cnt, init_needed = 0; +- struct dquot **dquots, *got[MAXQUOTAS] = {}; ++ struct dquot __rcu **dquots; ++ struct dquot *got[MAXQUOTAS] = {}; + struct super_block *sb = inode->i_sb; + qsize_t rsv; + int ret = 0; +@@ -1529,7 +1533,7 @@ static int __dquot_initialize(struct inode *inode, int type) + if (!got[cnt]) + continue; + if (!dquots[cnt]) { +- dquots[cnt] = got[cnt]; ++ rcu_assign_pointer(dquots[cnt], got[cnt]); + got[cnt] = NULL; + /* + * Make quota reservation system happy if someone +@@ -1537,12 +1541,16 @@ static int __dquot_initialize(struct inode *inode, int type) + */ + rsv = inode_get_rsv_space(inode); + if (unlikely(rsv)) { ++ struct dquot *dquot = srcu_dereference_check( ++ dquots[cnt], &dquot_srcu, ++ lockdep_is_held(&dq_data_lock)); ++ + spin_lock(&inode->i_lock); + /* Get reservation again under proper lock */ + rsv = __inode_get_rsv_space(inode); +- spin_lock(&dquots[cnt]->dq_dqb_lock); +- dquots[cnt]->dq_dqb.dqb_rsvspace += rsv; +- spin_unlock(&dquots[cnt]->dq_dqb_lock); ++ spin_lock(&dquot->dq_dqb_lock); ++ dquot->dq_dqb.dqb_rsvspace += rsv; ++ spin_unlock(&dquot->dq_dqb_lock); + spin_unlock(&inode->i_lock); + } + } +@@ -1564,7 +1572,7 @@ EXPORT_SYMBOL(dquot_initialize); + + bool dquot_initialize_needed(struct inode *inode) + { +- struct dquot **dquots; ++ struct dquot __rcu **dquots; + int i; + + if (!inode_quota_active(inode)) +@@ -1589,13 +1597,14 @@ EXPORT_SYMBOL(dquot_initialize_needed); + static void __dquot_drop(struct inode *inode) + { + int cnt; +- struct dquot **dquots = i_dquot(inode); ++ struct dquot __rcu **dquots = i_dquot(inode); + struct dquot *put[MAXQUOTAS]; + + spin_lock(&dq_data_lock); + for (cnt = 0; cnt < MAXQUOTAS; cnt++) { +- put[cnt] = dquots[cnt]; +- dquots[cnt] = NULL; ++ put[cnt] = srcu_dereference_check(dquots[cnt], &dquot_srcu, ++ lockdep_is_held(&dq_data_lock)); ++ rcu_assign_pointer(dquots[cnt], NULL); + } + spin_unlock(&dq_data_lock); + dqput_all(put); +@@ -1603,7 +1612,7 @@ static void __dquot_drop(struct inode *inode) + + void dquot_drop(struct inode *inode) + { +- struct dquot * const *dquots; ++ struct dquot __rcu * const *dquots; + int cnt; + + if (IS_NOQUOTA(inode)) +@@ -1676,7 +1685,7 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags) + int cnt, ret = 0, index; + struct dquot_warn warn[MAXQUOTAS]; + int reserve = flags & DQUOT_SPACE_RESERVE; +- struct dquot **dquots; ++ struct dquot __rcu **dquots; + struct dquot *dquot; + + if (!inode_quota_active(inode)) { +@@ -1746,7 +1755,7 @@ int dquot_alloc_inode(struct inode *inode) + { + int cnt, ret = 0, index; + struct dquot_warn warn[MAXQUOTAS]; +- struct dquot * const *dquots; ++ struct dquot __rcu * const *dquots; + struct dquot *dquot; + + if (!inode_quota_active(inode)) +@@ -1791,7 +1800,7 @@ EXPORT_SYMBOL(dquot_alloc_inode); + */ + int dquot_claim_space_nodirty(struct inode *inode, qsize_t number) + { +- struct dquot **dquots; ++ struct dquot __rcu **dquots; + struct dquot *dquot; + int cnt, index; + +@@ -1833,7 +1842,7 @@ EXPORT_SYMBOL(dquot_claim_space_nodirty); + */ + void dquot_reclaim_space_nodirty(struct inode *inode, qsize_t number) + { +- struct dquot **dquots; ++ struct dquot __rcu **dquots; + struct dquot *dquot; + int cnt, index; + +@@ -1877,7 +1886,7 @@ void __dquot_free_space(struct inode *inode, qsize_t number, int flags) + { + unsigned int cnt; + struct dquot_warn warn[MAXQUOTAS]; +- struct dquot **dquots; ++ struct dquot __rcu **dquots; + struct dquot *dquot; + int reserve = flags & DQUOT_SPACE_RESERVE, index; + +@@ -1934,7 +1943,7 @@ void dquot_free_inode(struct inode *inode) + { + unsigned int cnt; + struct dquot_warn warn[MAXQUOTAS]; +- struct dquot * const *dquots; ++ struct dquot __rcu * const *dquots; + struct dquot *dquot; + int index; + +@@ -1981,6 +1990,7 @@ int __dquot_transfer(struct inode *inode, struct dquot **transfer_to) + qsize_t cur_space; + qsize_t rsv_space = 0; + qsize_t inode_usage = 1; ++ struct dquot __rcu **dquots; + struct dquot *transfer_from[MAXQUOTAS] = {}; + int cnt, index, ret = 0; + char is_valid[MAXQUOTAS] = {}; +@@ -2013,6 +2023,7 @@ int __dquot_transfer(struct inode *inode, struct dquot **transfer_to) + } + cur_space = __inode_get_bytes(inode); + rsv_space = __inode_get_rsv_space(inode); ++ dquots = i_dquot(inode); + /* + * Build the transfer_from list, check limits, and update usage in + * the target structures. +@@ -2027,7 +2038,8 @@ int __dquot_transfer(struct inode *inode, struct dquot **transfer_to) + if (!sb_has_quota_active(inode->i_sb, cnt)) + continue; + is_valid[cnt] = 1; +- transfer_from[cnt] = i_dquot(inode)[cnt]; ++ transfer_from[cnt] = srcu_dereference_check(dquots[cnt], ++ &dquot_srcu, lockdep_is_held(&dq_data_lock)); + ret = dquot_add_inodes(transfer_to[cnt], inode_usage, + &warn_to[cnt]); + if (ret) +@@ -2066,7 +2078,7 @@ int __dquot_transfer(struct inode *inode, struct dquot **transfer_to) + rsv_space); + spin_unlock(&transfer_from[cnt]->dq_dqb_lock); + } +- i_dquot(inode)[cnt] = transfer_to[cnt]; ++ rcu_assign_pointer(dquots[cnt], transfer_to[cnt]); + } + spin_unlock(&inode->i_lock); + spin_unlock(&dq_data_lock); +@@ -2077,8 +2089,8 @@ int __dquot_transfer(struct inode *inode, struct dquot **transfer_to) + * mark_all_dquot_dirty(). + */ + index = srcu_read_lock(&dquot_srcu); +- mark_all_dquot_dirty(transfer_from); +- mark_all_dquot_dirty(transfer_to); ++ mark_all_dquot_dirty((struct dquot __rcu **)transfer_from); ++ mark_all_dquot_dirty((struct dquot __rcu **)transfer_to); + srcu_read_unlock(&dquot_srcu, index); + + flush_warnings(warn_to); +-- +2.43.0 + diff --git a/queue-5.4/quota-simplify-drop_dquot_ref.patch b/queue-5.4/quota-simplify-drop_dquot_ref.patch new file mode 100644 index 00000000000..bb890cf4c4d --- /dev/null +++ b/queue-5.4/quota-simplify-drop_dquot_ref.patch @@ -0,0 +1,132 @@ +From f4af1df6611aaade2f4b38ba190a1415d8f29639 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 30 Jun 2023 19:08:22 +0800 +Subject: quota: simplify drop_dquot_ref() + +From: Baokun Li + +[ Upstream commit 7bce48f0fec602b3b6c335963b26d9eefa417788 ] + +As Honza said, remove_inode_dquot_ref() currently does not release the +last dquot reference but instead adds the dquot to tofree_head list. This +is because dqput() can sleep while dropping of the last dquot reference +(writing back the dquot and calling ->release_dquot()) and that must not +happen under dq_list_lock. Now that dqput() queues the final dquot cleanup +into a workqueue, remove_inode_dquot_ref() can call dqput() unconditionally +and we can significantly simplify it. + +Here we open code the simplified code of remove_inode_dquot_ref() into +remove_dquot_ref() and remove the function put_dquot_list() which is no +longer used. + +Signed-off-by: Baokun Li +Signed-off-by: Jan Kara +Message-Id: <20230630110822.3881712-6-libaokun1@huawei.com> +Stable-dep-of: 179b8c97ebf6 ("quota: Fix rcu annotations of inode dquot pointers") +Signed-off-by: Sasha Levin +--- + fs/quota/dquot.c | 70 +++++++----------------------------------------- + 1 file changed, 9 insertions(+), 61 deletions(-) + +diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c +index d9da4a8c4317c..08ca5b1a5fba5 100644 +--- a/fs/quota/dquot.c ++++ b/fs/quota/dquot.c +@@ -1075,59 +1075,7 @@ static int add_dquot_ref(struct super_block *sb, int type) + return err; + } + +-/* +- * Remove references to dquots from inode and add dquot to list for freeing +- * if we have the last reference to dquot +- */ +-static void remove_inode_dquot_ref(struct inode *inode, int type, +- struct list_head *tofree_head) +-{ +- struct dquot **dquots = i_dquot(inode); +- struct dquot *dquot = dquots[type]; +- +- if (!dquot) +- return; +- +- dquots[type] = NULL; +- if (list_empty(&dquot->dq_free)) { +- /* +- * The inode still has reference to dquot so it can't be in the +- * free list +- */ +- spin_lock(&dq_list_lock); +- list_add(&dquot->dq_free, tofree_head); +- spin_unlock(&dq_list_lock); +- } else { +- /* +- * Dquot is already in a list to put so we won't drop the last +- * reference here. +- */ +- dqput(dquot); +- } +-} +- +-/* +- * Free list of dquots +- * Dquots are removed from inodes and no new references can be got so we are +- * the only ones holding reference +- */ +-static void put_dquot_list(struct list_head *tofree_head) +-{ +- struct list_head *act_head; +- struct dquot *dquot; +- +- act_head = tofree_head->next; +- while (act_head != tofree_head) { +- dquot = list_entry(act_head, struct dquot, dq_free); +- act_head = act_head->next; +- /* Remove dquot from the list so we won't have problems... */ +- list_del_init(&dquot->dq_free); +- dqput(dquot); +- } +-} +- +-static void remove_dquot_ref(struct super_block *sb, int type, +- struct list_head *tofree_head) ++static void remove_dquot_ref(struct super_block *sb, int type) + { + struct inode *inode; + #ifdef CONFIG_QUOTA_DEBUG +@@ -1144,11 +1092,16 @@ static void remove_dquot_ref(struct super_block *sb, int type, + */ + spin_lock(&dq_data_lock); + if (!IS_NOQUOTA(inode)) { ++ struct dquot **dquots = i_dquot(inode); ++ struct dquot *dquot = dquots[type]; ++ + #ifdef CONFIG_QUOTA_DEBUG + if (unlikely(inode_get_rsv_space(inode) > 0)) + reserved = 1; + #endif +- remove_inode_dquot_ref(inode, type, tofree_head); ++ dquots[type] = NULL; ++ if (dquot) ++ dqput(dquot); + } + spin_unlock(&dq_data_lock); + } +@@ -1165,13 +1118,8 @@ static void remove_dquot_ref(struct super_block *sb, int type, + /* Gather all references from inodes and drop them */ + static void drop_dquot_ref(struct super_block *sb, int type) + { +- LIST_HEAD(tofree_head); +- +- if (sb->dq_op) { +- remove_dquot_ref(sb, type, &tofree_head); +- synchronize_srcu(&dquot_srcu); +- put_dquot_list(&tofree_head); +- } ++ if (sb->dq_op) ++ remove_dquot_ref(sb, type); + } + + static inline +-- +2.43.0 + diff --git a/queue-5.4/rdma-device-fix-a-race-between-mad_client-and-cm_cli.patch b/queue-5.4/rdma-device-fix-a-race-between-mad_client-and-cm_cli.patch new file mode 100644 index 00000000000..ff65ba96453 --- /dev/null +++ b/queue-5.4/rdma-device-fix-a-race-between-mad_client-and-cm_cli.patch @@ -0,0 +1,133 @@ +From 7c4f32b0eb9bacc9e621765db9b897798383b597 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 2 Feb 2024 19:53:13 -0800 +Subject: RDMA/device: Fix a race between mad_client and cm_client init + +From: Shifeng Li + +[ Upstream commit 7a8bccd8b29c321ac181369b42b04fecf05f98e2 ] + +The mad_client will be initialized in enable_device_and_get(), while the +devices_rwsem will be downgraded to a read semaphore. There is a window +that leads to the failed initialization for cm_client, since it can not +get matched mad port from ib_mad_port_list, and the matched mad port will +be added to the list after that. + + mad_client | cm_client +------------------|-------------------------------------------------------- +ib_register_device| +enable_device_and_get +down_write(&devices_rwsem) +xa_set_mark(&devices, DEVICE_REGISTERED) +downgrade_write(&devices_rwsem) + | + |ib_cm_init + |ib_register_client(&cm_client) + |down_read(&devices_rwsem) + |xa_for_each_marked (&devices, DEVICE_REGISTERED) + |add_client_context + |cm_add_one + |ib_register_mad_agent + |ib_get_mad_port + |__ib_get_mad_port + |list_for_each_entry(entry, &ib_mad_port_list, port_list) + |return NULL + |up_read(&devices_rwsem) + | +add_client_context| +ib_mad_init_device| +ib_mad_port_open | +list_add_tail(&port_priv->port_list, &ib_mad_port_list) +up_read(&devices_rwsem) + | + +Fix it by using down_write(&devices_rwsem) in ib_register_client(). + +Fixes: d0899892edd0 ("RDMA/device: Provide APIs from the core code to help unregistration") +Link: https://lore.kernel.org/r/20240203035313.98991-1-lishifeng@sangfor.com.cn +Suggested-by: Jason Gunthorpe +Signed-off-by: Shifeng Li +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/core/device.c | 37 +++++++++++++++++++------------- + 1 file changed, 22 insertions(+), 15 deletions(-) + +diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c +index a12ee8ef27a89..c7c3b9bae938c 100644 +--- a/drivers/infiniband/core/device.c ++++ b/drivers/infiniband/core/device.c +@@ -1700,7 +1700,7 @@ static int assign_client_id(struct ib_client *client) + { + int ret; + +- down_write(&clients_rwsem); ++ lockdep_assert_held(&clients_rwsem); + /* + * The add/remove callbacks must be called in FIFO/LIFO order. To + * achieve this we assign client_ids so they are sorted in +@@ -1709,14 +1709,11 @@ static int assign_client_id(struct ib_client *client) + client->client_id = highest_client_id; + ret = xa_insert(&clients, client->client_id, client, GFP_KERNEL); + if (ret) +- goto out; ++ return ret; + + highest_client_id++; + xa_set_mark(&clients, client->client_id, CLIENT_REGISTERED); +- +-out: +- up_write(&clients_rwsem); +- return ret; ++ return 0; + } + + static void remove_client_id(struct ib_client *client) +@@ -1746,25 +1743,35 @@ int ib_register_client(struct ib_client *client) + { + struct ib_device *device; + unsigned long index; ++ bool need_unreg = false; + int ret; + + refcount_set(&client->uses, 1); + init_completion(&client->uses_zero); ++ ++ /* ++ * The devices_rwsem is held in write mode to ensure that a racing ++ * ib_register_device() sees a consisent view of clients and devices. ++ */ ++ down_write(&devices_rwsem); ++ down_write(&clients_rwsem); + ret = assign_client_id(client); + if (ret) +- return ret; ++ goto out; + +- down_read(&devices_rwsem); ++ need_unreg = true; + xa_for_each_marked (&devices, index, device, DEVICE_REGISTERED) { + ret = add_client_context(device, client); +- if (ret) { +- up_read(&devices_rwsem); +- ib_unregister_client(client); +- return ret; +- } ++ if (ret) ++ goto out; + } +- up_read(&devices_rwsem); +- return 0; ++ ret = 0; ++out: ++ up_write(&clients_rwsem); ++ up_write(&devices_rwsem); ++ if (need_unreg && ret) ++ ib_unregister_client(client); ++ return ret; + } + EXPORT_SYMBOL(ib_register_client); + +-- +2.43.0 + diff --git a/queue-5.4/scsi-bfa-fix-function-pointer-type-mismatch-for-hcb_.patch b/queue-5.4/scsi-bfa-fix-function-pointer-type-mismatch-for-hcb_.patch new file mode 100644 index 00000000000..14f0ac25a8b --- /dev/null +++ b/queue-5.4/scsi-bfa-fix-function-pointer-type-mismatch-for-hcb_.patch @@ -0,0 +1,152 @@ +From 536e98e505be8dae9d9b30eef14c55d464ba3bd4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 22 Feb 2024 13:44:06 +0100 +Subject: scsi: bfa: Fix function pointer type mismatch for hcb_qe->cbfn + +From: Arnd Bergmann + +[ Upstream commit b69600231f751304db914c63b937f7098ed2895c ] + +Some callback functions used here take a boolean argument, others take a +status argument. This breaks KCFI type checking, so clang now warns about +the function pointer cast: + +drivers/scsi/bfa/bfad_bsg.c:2138:29: error: cast from 'void (*)(void *, enum bfa_status)' to 'bfa_cb_cbfn_t' (aka 'void (*)(void *, enum bfa_boolean)') converts to incompatible function type [-Werror,-Wcast-function-type-strict] + +Assuming the code is actually correct here and the callers always match the +argument types of the callee, rework this to replace the explicit cast with +a union of the two pointer types. This does not change the behavior of the +code, so if something is actually broken here, a larger rework may be +necessary. + +Fixes: 37ea0558b87a ("[SCSI] bfa: Added support to collect and reset fcport stats") +Fixes: 3ec4f2c8bff2 ("[SCSI] bfa: Added support to configure QOS and collect stats.") +Reviewed-by: Kees Cook +Signed-off-by: Arnd Bergmann +Link: https://lore.kernel.org/r/20240222124433.2046570-1-arnd@kernel.org +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/bfa/bfa.h | 9 ++++++++- + drivers/scsi/bfa/bfa_core.c | 4 +--- + drivers/scsi/bfa/bfa_ioc.h | 8 ++++++-- + drivers/scsi/bfa/bfad_bsg.c | 11 ++++------- + 4 files changed, 19 insertions(+), 13 deletions(-) + +diff --git a/drivers/scsi/bfa/bfa.h b/drivers/scsi/bfa/bfa.h +index 7bd2ba1ad4d11..f30fe324e6ecc 100644 +--- a/drivers/scsi/bfa/bfa.h ++++ b/drivers/scsi/bfa/bfa.h +@@ -20,7 +20,6 @@ + struct bfa_s; + + typedef void (*bfa_isr_func_t) (struct bfa_s *bfa, struct bfi_msg_s *m); +-typedef void (*bfa_cb_cbfn_status_t) (void *cbarg, bfa_status_t status); + + /* + * Interrupt message handlers +@@ -437,4 +436,12 @@ struct bfa_cb_pending_q_s { + (__qe)->data = (__data); \ + } while (0) + ++#define bfa_pending_q_init_status(__qe, __cbfn, __cbarg, __data) do { \ ++ bfa_q_qe_init(&((__qe)->hcb_qe.qe)); \ ++ (__qe)->hcb_qe.cbfn_status = (__cbfn); \ ++ (__qe)->hcb_qe.cbarg = (__cbarg); \ ++ (__qe)->hcb_qe.pre_rmv = BFA_TRUE; \ ++ (__qe)->data = (__data); \ ++} while (0) ++ + #endif /* __BFA_H__ */ +diff --git a/drivers/scsi/bfa/bfa_core.c b/drivers/scsi/bfa/bfa_core.c +index 0f554ebb8f2c6..09819f076699f 100644 +--- a/drivers/scsi/bfa/bfa_core.c ++++ b/drivers/scsi/bfa/bfa_core.c +@@ -1907,15 +1907,13 @@ bfa_comp_process(struct bfa_s *bfa, struct list_head *comp_q) + struct list_head *qe; + struct list_head *qen; + struct bfa_cb_qe_s *hcb_qe; +- bfa_cb_cbfn_status_t cbfn; + + list_for_each_safe(qe, qen, comp_q) { + hcb_qe = (struct bfa_cb_qe_s *) qe; + if (hcb_qe->pre_rmv) { + /* qe is invalid after return, dequeue before cbfn() */ + list_del(qe); +- cbfn = (bfa_cb_cbfn_status_t)(hcb_qe->cbfn); +- cbfn(hcb_qe->cbarg, hcb_qe->fw_status); ++ hcb_qe->cbfn_status(hcb_qe->cbarg, hcb_qe->fw_status); + } else + hcb_qe->cbfn(hcb_qe->cbarg, BFA_TRUE); + } +diff --git a/drivers/scsi/bfa/bfa_ioc.h b/drivers/scsi/bfa/bfa_ioc.h +index 933a1c3890ff5..5e568d6d7b261 100644 +--- a/drivers/scsi/bfa/bfa_ioc.h ++++ b/drivers/scsi/bfa/bfa_ioc.h +@@ -361,14 +361,18 @@ struct bfa_reqq_wait_s { + void *cbarg; + }; + +-typedef void (*bfa_cb_cbfn_t) (void *cbarg, bfa_boolean_t complete); ++typedef void (*bfa_cb_cbfn_t) (void *cbarg, bfa_boolean_t complete); ++typedef void (*bfa_cb_cbfn_status_t) (void *cbarg, bfa_status_t status); + + /* + * Generic BFA callback element. + */ + struct bfa_cb_qe_s { + struct list_head qe; +- bfa_cb_cbfn_t cbfn; ++ union { ++ bfa_cb_cbfn_status_t cbfn_status; ++ bfa_cb_cbfn_t cbfn; ++ }; + bfa_boolean_t once; + bfa_boolean_t pre_rmv; /* set for stack based qe(s) */ + bfa_status_t fw_status; /* to access fw status in comp proc */ +diff --git a/drivers/scsi/bfa/bfad_bsg.c b/drivers/scsi/bfa/bfad_bsg.c +index a76c968dbac59..9f5964944d787 100644 +--- a/drivers/scsi/bfa/bfad_bsg.c ++++ b/drivers/scsi/bfa/bfad_bsg.c +@@ -2135,8 +2135,7 @@ bfad_iocmd_fcport_get_stats(struct bfad_s *bfad, void *cmd) + struct bfa_cb_pending_q_s cb_qe; + + init_completion(&fcomp.comp); +- bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp, +- &fcomp, &iocmd->stats); ++ bfa_pending_q_init_status(&cb_qe, bfad_hcb_comp, &fcomp, &iocmd->stats); + spin_lock_irqsave(&bfad->bfad_lock, flags); + iocmd->status = bfa_fcport_get_stats(&bfad->bfa, &cb_qe); + spin_unlock_irqrestore(&bfad->bfad_lock, flags); +@@ -2159,7 +2158,7 @@ bfad_iocmd_fcport_reset_stats(struct bfad_s *bfad, void *cmd) + struct bfa_cb_pending_q_s cb_qe; + + init_completion(&fcomp.comp); +- bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp, &fcomp, NULL); ++ bfa_pending_q_init_status(&cb_qe, bfad_hcb_comp, &fcomp, NULL); + + spin_lock_irqsave(&bfad->bfad_lock, flags); + iocmd->status = bfa_fcport_clear_stats(&bfad->bfa, &cb_qe); +@@ -2443,8 +2442,7 @@ bfad_iocmd_qos_get_stats(struct bfad_s *bfad, void *cmd) + struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa); + + init_completion(&fcomp.comp); +- bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp, +- &fcomp, &iocmd->stats); ++ bfa_pending_q_init_status(&cb_qe, bfad_hcb_comp, &fcomp, &iocmd->stats); + + spin_lock_irqsave(&bfad->bfad_lock, flags); + WARN_ON(!bfa_ioc_get_fcmode(&bfad->bfa.ioc)); +@@ -2474,8 +2472,7 @@ bfad_iocmd_qos_reset_stats(struct bfad_s *bfad, void *cmd) + struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa); + + init_completion(&fcomp.comp); +- bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp, +- &fcomp, NULL); ++ bfa_pending_q_init_status(&cb_qe, bfad_hcb_comp, &fcomp, NULL); + + spin_lock_irqsave(&bfad->bfad_lock, flags); + WARN_ON(!bfa_ioc_get_fcmode(&bfad->bfa.ioc)); +-- +2.43.0 + diff --git a/queue-5.4/scsi-csiostor-avoid-function-pointer-casts.patch b/queue-5.4/scsi-csiostor-avoid-function-pointer-casts.patch new file mode 100644 index 00000000000..bfd5bcf3239 --- /dev/null +++ b/queue-5.4/scsi-csiostor-avoid-function-pointer-casts.patch @@ -0,0 +1,135 @@ +From c6425e0f14e10ddba8d7e5f462db84c46b771664 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 13 Feb 2024 11:05:00 +0100 +Subject: scsi: csiostor: Avoid function pointer casts + +From: Arnd Bergmann + +[ Upstream commit 9f3dbcb5632d6876226031d552ef6163bb3ad215 ] + +csiostor uses function pointer casts to keep the csio_ln_ev state machine +hidden, but this causes warnings about control flow integrity (KCFI) +violations in clang-16 and higher: + +drivers/scsi/csiostor/csio_lnode.c:1098:33: error: cast from 'void (*)(struct csio_lnode *, enum csio_ln_ev)' to 'csio_sm_state_t' (aka 'void (*)(void *, unsigned int)') converts to incompatible function type [-Werror,-Wcast-function-type-strict] + 1098 | return (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_ready)); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +drivers/scsi/csiostor/csio_lnode.c:1369:29: error: cast from 'void (*)(struct csio_lnode *, enum csio_ln_ev)' to 'csio_sm_state_t' (aka 'void (*)(void *, unsigned int)') converts to incompatible function type [-Werror,-Wcast-function-type-strict] + 1369 | if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_uninit)) { + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +drivers/scsi/csiostor/csio_lnode.c:1373:29: error: cast from 'void (*)(struct csio_lnode *, enum csio_ln_ev)' to 'csio_sm_state_t' (aka 'void (*)(void *, unsigned int)') converts to incompatible function type [-Werror,-Wcast-function-type-strict] + 1373 | if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_ready)) { + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +drivers/scsi/csiostor/csio_lnode.c:1377:29: error: cast from 'void (*)(struct csio_lnode *, enum csio_ln_ev)' to 'csio_sm_state_t' (aka 'void (*)(void *, unsigned int)') converts to incompatible function type [-Werror,-Wcast-function-type-strict] + 1377 | if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_offline)) { + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Move the enum into a shared header so the correct types can be used without +the need for casts. + +Fixes: a3667aaed569 ("[SCSI] csiostor: Chelsio FCoE offload driver") +Signed-off-by: Arnd Bergmann +Link: https://lore.kernel.org/r/20240213100518.457623-1-arnd@kernel.org +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/csiostor/csio_defs.h | 18 ++++++++++++++++-- + drivers/scsi/csiostor/csio_lnode.c | 8 ++++---- + drivers/scsi/csiostor/csio_lnode.h | 13 ------------- + 3 files changed, 20 insertions(+), 19 deletions(-) + +diff --git a/drivers/scsi/csiostor/csio_defs.h b/drivers/scsi/csiostor/csio_defs.h +index c38017b4af982..e50e93e7fe5a1 100644 +--- a/drivers/scsi/csiostor/csio_defs.h ++++ b/drivers/scsi/csiostor/csio_defs.h +@@ -73,7 +73,21 @@ csio_list_deleted(struct list_head *list) + #define csio_list_prev(elem) (((struct list_head *)(elem))->prev) + + /* State machine */ +-typedef void (*csio_sm_state_t)(void *, uint32_t); ++struct csio_lnode; ++ ++/* State machine evets */ ++enum csio_ln_ev { ++ CSIO_LNE_NONE = (uint32_t)0, ++ CSIO_LNE_LINKUP, ++ CSIO_LNE_FAB_INIT_DONE, ++ CSIO_LNE_LINK_DOWN, ++ CSIO_LNE_DOWN_LINK, ++ CSIO_LNE_LOGO, ++ CSIO_LNE_CLOSE, ++ CSIO_LNE_MAX_EVENT, ++}; ++ ++typedef void (*csio_sm_state_t)(struct csio_lnode *ln, enum csio_ln_ev evt); + + struct csio_sm { + struct list_head sm_list; +@@ -83,7 +97,7 @@ struct csio_sm { + static inline void + csio_set_state(void *smp, void *state) + { +- ((struct csio_sm *)smp)->sm_state = (csio_sm_state_t)state; ++ ((struct csio_sm *)smp)->sm_state = state; + } + + static inline void +diff --git a/drivers/scsi/csiostor/csio_lnode.c b/drivers/scsi/csiostor/csio_lnode.c +index c3bf590f5d685..47803268b138f 100644 +--- a/drivers/scsi/csiostor/csio_lnode.c ++++ b/drivers/scsi/csiostor/csio_lnode.c +@@ -1095,7 +1095,7 @@ csio_handle_link_down(struct csio_hw *hw, uint8_t portid, uint32_t fcfi, + int + csio_is_lnode_ready(struct csio_lnode *ln) + { +- return (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_ready)); ++ return (csio_get_state(ln) == csio_lns_ready); + } + + /*****************************************************************************/ +@@ -1367,15 +1367,15 @@ csio_free_fcfinfo(struct kref *kref) + void + csio_lnode_state_to_str(struct csio_lnode *ln, int8_t *str) + { +- if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_uninit)) { ++ if (csio_get_state(ln) == csio_lns_uninit) { + strcpy(str, "UNINIT"); + return; + } +- if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_ready)) { ++ if (csio_get_state(ln) == csio_lns_ready) { + strcpy(str, "READY"); + return; + } +- if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_offline)) { ++ if (csio_get_state(ln) == csio_lns_offline) { + strcpy(str, "OFFLINE"); + return; + } +diff --git a/drivers/scsi/csiostor/csio_lnode.h b/drivers/scsi/csiostor/csio_lnode.h +index 372a67d122d38..607698a0f0631 100644 +--- a/drivers/scsi/csiostor/csio_lnode.h ++++ b/drivers/scsi/csiostor/csio_lnode.h +@@ -53,19 +53,6 @@ + extern int csio_fcoe_rnodes; + extern int csio_fdmi_enable; + +-/* State machine evets */ +-enum csio_ln_ev { +- CSIO_LNE_NONE = (uint32_t)0, +- CSIO_LNE_LINKUP, +- CSIO_LNE_FAB_INIT_DONE, +- CSIO_LNE_LINK_DOWN, +- CSIO_LNE_DOWN_LINK, +- CSIO_LNE_LOGO, +- CSIO_LNE_CLOSE, +- CSIO_LNE_MAX_EVENT, +-}; +- +- + struct csio_fcf_info { + struct list_head list; + uint8_t priority; +-- +2.43.0 + diff --git a/queue-5.4/series b/queue-5.4/series index e712dc4af85..47e95ed2542 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -19,3 +19,143 @@ input-gpio_keys_polled-suppress-deferred-probe-error.patch asoc-wm8962-enable-oscillator-if-selecting-wm8962_fl.patch asoc-wm8962-enable-both-spkoutr_ena-and-spkoutl_ena-.patch asoc-wm8962-fix-up-incorrect-error-message-in-wm8962.patch +do_sys_name_to_handle-use-kzalloc-to-fix-kernel-info.patch +nbd-null-check-for-nla_nest_start.patch +fs-select-rework-stack-allocation-hack-for-clang.patch +aoe-fix-the-potential-use-after-free-problem-in-aoec.patch +timekeeping-fix-cross-timestamp-interpolation-on-cou.patch +timekeeping-fix-cross-timestamp-interpolation-corner.patch +timekeeping-fix-cross-timestamp-interpolation-for-no.patch +wifi-ath10k-fix-null-pointer-dereference-in-ath10k_w.patch +b43-dma-fix-use-true-false-for-bool-type-variable.patch +wifi-b43-stop-wake-correct-queue-in-dma-tx-path-when.patch +wifi-b43-stop-wake-correct-queue-in-pio-tx-path-when.patch +b43-main-fix-use-true-false-for-bool-type.patch +wifi-b43-stop-correct-queue-in-dma-worker-when-qos-i.patch +wifi-b43-disable-qos-for-bcm4331.patch +wifi-wilc1000-fix-declarations-ordering.patch +wifi-wilc1000-fix-rcu-usage-in-connect-path.patch +wifi-mwifiex-debugfs-drop-unnecessary-error-check-fo.patch +arm-dts-renesas-r8a73a4-fix-external-clocks-and-cloc.patch +cpufreq-brcmstb-avs-cpufreq-add-check-for-cpufreq_cp.patch +sock_diag-annotate-data-races-around-sock_diag_handl.patch +af_unix-annotate-data-race-of-gc_in_progress-in-wait.patch +net-blackhole_dev-fix-build-warning-for-ethh-set-but.patch +wifi-libertas-fix-some-memleaks-in-lbs_allocate_cmd_.patch +arm64-dts-qcom-msm8998-fix-ufs-phy-clocks.patch +arm64-dts-mediatek-mt7622-add-missing-device_type-to.patch +bpf-add-typecast-to-bpf-helpers-to-help-btf-generati.patch +bpf-factor-out-bpf_spin_lock-into-helpers.patch +bpf-mark-bpf_spin_-lock-unlock-helpers-with-notrace-.patch +arm64-dts-qcom-db820c-move-non-soc-entries-out-of-so.patch +arm64-dts-qcom-msm8996-use-node-references-in-db820c.patch +arm64-dts-qcom-msm8996-move-regulator-consumers-to-d.patch +arm64-dts-qcom-msm8996-pad-addresses.patch +arm64-dts-qcom-msm8996-define-ufs-unipro-clock-limit.patch +acpi-processor_idle-fix-memory-leak-in-acpi_processo.patch +bus-tegra-aconnect-update-dependency-to-arch_tegra.patch +iommu-amd-mark-interrupt-as-managed.patch +wifi-brcmsmac-avoid-function-pointer-casts.patch +net-ena-cosmetic-fix-line-break-issues.patch +net-ena-remove-ena_select_queue.patch +arm-dts-arm-realview-fix-development-chip-rom-compat.patch +arm-dts-imx6dl-yapp4-move-phy-reset-into-switch-node.patch +arm-dts-imx6dl-yapp4-fix-typo-in-the-qca-switch-regi.patch +arm-dts-imx6dl-yapp4-move-the-internal-switch-phys-u.patch +acpi-scan-fix-device-check-notification-handling.patch +x86-relocs-ignore-relocations-in-.notes-section.patch +sunrpc-fix-some-memleaks-in-gssx_dec_option_array.patch +mmc-wmt-sdmmc-remove-an-incorrect-release_mem_region.patch +igb-move-perout-and-extts-isr-logic-to-separate-func.patch +igb-fix-missing-time-sync-events.patch +bluetooth-remove-superfluous-call-to-hci_conn_check_.patch +bluetooth-hci_core-fix-possible-buffer-overflow.patch +sr9800-add-check-for-usbnet_get_endpoints.patch +bpf-fix-hashtab-overflow-check-on-32-bit-arches.patch +bpf-fix-stackmap-overflow-check-on-32-bit-arches.patch +ipv6-fib6_rules-flush-route-cache-when-rule-is-chang.patch +net-ip_tunnel-make-sure-to-pull-inner-header-in-ip_t.patch +net-hns3-fix-port-duplex-configure-error-in-imp-rese.patch +tcp-fix-incorrect-parameter-validation-in-the-do_tcp.patch +l2tp-fix-incorrect-parameter-validation-in-the-pppol.patch +udp-fix-incorrect-parameter-validation-in-the-udp_li.patch +net-kcm-fix-incorrect-parameter-validation-in-the-kc.patch +net-x25-fix-incorrect-parameter-validation-in-the-x2.patch +nfp-flower-handle-acti_netdevs-allocation-failure.patch +dm-raid-fix-false-positive-for-requeue-needed-during.patch +dm-call-the-resume-method-on-internal-suspend.patch +drm-tegra-dsi-add-missing-check-for-of_find_device_b.patch +gpu-host1x-mipi-update-tegra_mipi_request-to-be-node.patch +drm-tegra-dsi-make-use-of-the-helper-function-dev_er.patch +drm-tegra-dsi-fix-some-error-handling-paths-in-tegra.patch +drm-tegra-dsi-fix-missing-pm_runtime_disable-in-the-.patch +drm-tegra-output-fix-missing-i2c_put_adapter-in-the-.patch +drm-rockchip-inno_hdmi-fix-video-timing.patch +drm-don-t-treat-0-as-1-in-drm_fixp2int_ceil.patch +drm-rockchip-lvds-do-not-overwrite-error-code.patch +dmaengine-tegra210-adma-update-dependency-to-arch_te.patch +media-tc358743-register-v4l2-async-device-only-after.patch +pci-dpc-print-all-tlp-prefixes-not-just-the-first.patch +perf-record-fix-possible-incorrect-free-in-record__s.patch +drm-amd-display-fix-potential-null-pointer-dereferen.patch +perf-evsel-fix-duplicate-initialization-of-data-id-i.patch +pci-aer-fix-rootport-attribute-paths-in-abi-docs.patch +media-em28xx-annotate-unchecked-call-to-media_device.patch +media-v4l2-tpg-fix-some-memleaks-in-tpg_alloc.patch +media-v4l2-mem2mem-fix-a-memleak-in-v4l2_m2m_registe.patch +media-edia-dvbdev-fix-a-use-after-free.patch +clk-qcom-reset-allow-specifying-custom-reset-delay.patch +clk-qcom-reset-support-resetting-multiple-bits.patch +clk-qcom-reset-commonize-the-de-assert-functions.patch +clk-qcom-reset-ensure-write-completion-on-reset-de-a.patch +quota-simplify-drop_dquot_ref.patch +quota-fix-potential-null-pointer-dereference.patch +quota-fix-rcu-annotations-of-inode-dquot-pointers.patch +pci-switchtec-fix-an-error-handling-path-in-switchte.patch +perf-thread_map-free-strlist-on-normal-path-in-threa.patch +drm-radeon-ni-fix-wrong-firmware-size-logging-in-ni_.patch +alsa-seq-fix-function-cast-warnings.patch +perf-stat-avoid-metric-only-segv.patch +media-imx-csc-scaler-fix-v4l2_ctrl_handler-memory-le.patch +media-go7007-add-check-of-return-value-of-go7007_rea.patch +media-pvrusb2-remove-redundant-null-check.patch +media-pvrusb2-fix-pvr2_stream_callback-casts.patch +clk-qcom-dispcc-sdm845-adjust-internal-gdsc-wait-tim.patch +drm-mediatek-dsi-fix-dsi-rgb666-formats-and-definiti.patch +pci-mark-3ware-9650se-root-port-extended-tags-as-bro.patch +clk-hisilicon-hi3519-release-the-correct-number-of-g.patch +drm-tegra-put-drm_gem_object-ref-on-error-in-tegra_f.patch +mfd-syscon-call-of_node_put-only-when-of_parse_phand.patch +mfd-altera-sysmgr-call-of_node_put-only-when-of_pars.patch +crypto-arm-sha-fix-function-cast-warnings.patch +mtd-maps-physmap-core-fix-flash-size-larger-than-32-.patch +mtd-rawnand-lpc32xx_mlc-fix-irq-handler-prototype.patch +asoc-meson-axg-tdm-interface-fix-mclk-setup-without-.patch +drm-amdgpu-fix-missing-break-in-atom_arg_imm-case-of.patch +media-pvrusb2-fix-uaf-in-pvr2_context_set_notify.patch +media-dvb-frontends-avoid-stack-overflow-warnings-wi.patch +media-go7007-fix-a-memleak-in-go7007_load_encoder.patch +media-v4l2-core-correctly-validate-video-and-metadat.patch +media-rename-vfl_type_grabber-to-_video.patch +media-media-pci-rename-vfl_type_grabber-to-_video.patch +media-ttpci-fix-two-memleaks-in-budget_av_attach.patch +drm-mediatek-fix-a-null-pointer-crash-in-mtk_drm_crt.patch +powerpc-hv-gpci-fix-the-h_get_perf_counter_info-hcal.patch +drm-msm-dpu-add-division-of-drm_display_mode-s-hskew.patch +powerpc-embedded6xx-fix-no-previous-prototype-for-av.patch +backlight-lm3630a-initialize-backlight_properties-on.patch +backlight-lm3630a-don-t-set-bl-props.brightness-in-g.patch +backlight-da9052-fully-initialize-backlight_properti.patch +backlight-lm3639-fully-initialize-backlight_properti.patch +backlight-lp8788-fully-initialize-backlight_properti.patch +arch-powerpc-remove-linux-fb.h-from-backlight-code.patch +sparc32-fix-section-mismatch-in-leon_pci_grpci.patch +clk-fix-clk_core_get-null-dereference.patch +alsa-usb-audio-stop-parsing-channels-bits-when-all-c.patch +scsi-csiostor-avoid-function-pointer-casts.patch +rdma-device-fix-a-race-between-mad_client-and-cm_cli.patch +scsi-bfa-fix-function-pointer-type-mismatch-for-hcb_.patch +net-sunrpc-fix-an-off-by-one-in-rpc_sockaddr2uaddr.patch +watchdog-stm32_iwdg-initialize-default-timeout.patch +nfs-fix-an-off-by-one-in-root_nfs_cat.patch +afs-revert-afs-hide-silly-rename-files-from-userspac.patch diff --git a/queue-5.4/sock_diag-annotate-data-races-around-sock_diag_handl.patch b/queue-5.4/sock_diag-annotate-data-races-around-sock_diag_handl.patch new file mode 100644 index 00000000000..befdbf171df --- /dev/null +++ b/queue-5.4/sock_diag-annotate-data-races-around-sock_diag_handl.patch @@ -0,0 +1,74 @@ +From fd2e82fe3a1ecf1dedb9a0e9431bff5f594fbd42 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 22 Jan 2024 11:25:55 +0000 +Subject: sock_diag: annotate data-races around sock_diag_handlers[family] + +From: Eric Dumazet + +[ Upstream commit efd402537673f9951992aea4ef0f5ff51d858f4b ] + +__sock_diag_cmd() and sock_diag_bind() read sock_diag_handlers[family] +without a lock held. + +Use READ_ONCE()/WRITE_ONCE() annotations to avoid potential issues. + +Fixes: 8ef874bfc729 ("sock_diag: Move the sock_ code to net/core/") +Signed-off-by: Eric Dumazet +Reviewed-by: Guillaume Nault +Reviewed-by: Kuniyuki Iwashima +Reviewed-by: Willem de Bruijn +Signed-off-by: Paolo Abeni +Signed-off-by: Sasha Levin +--- + net/core/sock_diag.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/net/core/sock_diag.c b/net/core/sock_diag.c +index c13ffbd33d8d6..315a5200d170b 100644 +--- a/net/core/sock_diag.c ++++ b/net/core/sock_diag.c +@@ -188,7 +188,7 @@ int sock_diag_register(const struct sock_diag_handler *hndl) + if (sock_diag_handlers[hndl->family]) + err = -EBUSY; + else +- sock_diag_handlers[hndl->family] = hndl; ++ WRITE_ONCE(sock_diag_handlers[hndl->family], hndl); + mutex_unlock(&sock_diag_table_mutex); + + return err; +@@ -204,7 +204,7 @@ void sock_diag_unregister(const struct sock_diag_handler *hnld) + + mutex_lock(&sock_diag_table_mutex); + BUG_ON(sock_diag_handlers[family] != hnld); +- sock_diag_handlers[family] = NULL; ++ WRITE_ONCE(sock_diag_handlers[family], NULL); + mutex_unlock(&sock_diag_table_mutex); + } + EXPORT_SYMBOL_GPL(sock_diag_unregister); +@@ -222,7 +222,7 @@ static int __sock_diag_cmd(struct sk_buff *skb, struct nlmsghdr *nlh) + return -EINVAL; + req->sdiag_family = array_index_nospec(req->sdiag_family, AF_MAX); + +- if (sock_diag_handlers[req->sdiag_family] == NULL) ++ if (READ_ONCE(sock_diag_handlers[req->sdiag_family]) == NULL) + sock_load_diag_module(req->sdiag_family, 0); + + mutex_lock(&sock_diag_table_mutex); +@@ -281,12 +281,12 @@ static int sock_diag_bind(struct net *net, int group) + switch (group) { + case SKNLGRP_INET_TCP_DESTROY: + case SKNLGRP_INET_UDP_DESTROY: +- if (!sock_diag_handlers[AF_INET]) ++ if (!READ_ONCE(sock_diag_handlers[AF_INET])) + sock_load_diag_module(AF_INET, 0); + break; + case SKNLGRP_INET6_TCP_DESTROY: + case SKNLGRP_INET6_UDP_DESTROY: +- if (!sock_diag_handlers[AF_INET6]) ++ if (!READ_ONCE(sock_diag_handlers[AF_INET6])) + sock_load_diag_module(AF_INET6, 0); + break; + } +-- +2.43.0 + diff --git a/queue-5.4/sparc32-fix-section-mismatch-in-leon_pci_grpci.patch b/queue-5.4/sparc32-fix-section-mismatch-in-leon_pci_grpci.patch new file mode 100644 index 00000000000..9e36d22df32 --- /dev/null +++ b/queue-5.4/sparc32-fix-section-mismatch-in-leon_pci_grpci.patch @@ -0,0 +1,62 @@ +From 19d0b89beea692678a5aa134b96531cf989a8114 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 24 Feb 2024 18:42:28 +0100 +Subject: sparc32: Fix section mismatch in leon_pci_grpci + +From: Sam Ravnborg + +[ Upstream commit 24338a6ae13cb743ced77da1b3a12c83f08a0c96 ] + +Passing a datastructre marked _initconst to platform_driver_register() +is wrong. Drop the __initconst notation. + +This fixes the following warnings: + +WARNING: modpost: vmlinux: section mismatch in reference: grpci1_of_driver+0x30 (section: .data) -> grpci1_of_match (section: .init.rodata) +WARNING: modpost: vmlinux: section mismatch in reference: grpci2_of_driver+0x30 (section: .data) -> grpci2_of_match (section: .init.rodata) + +Signed-off-by: Sam Ravnborg +Cc: "David S. Miller" +Cc: Andreas Larsson +Fixes: 4154bb821f0b ("sparc: leon: grpci1: constify of_device_id") +Fixes: 03949b1cb9f1 ("sparc: leon: grpci2: constify of_device_id") +Tested-by: Randy Dunlap # build-tested +Reviewed-by: Andreas Larsson +Tested-by: Andreas Larsson +Signed-off-by: Andreas Larsson +Link: https://lore.kernel.org/r/20240224-sam-fix-sparc32-all-builds-v2-7-1f186603c5c4@ravnborg.org +Signed-off-by: Sasha Levin +--- + arch/sparc/kernel/leon_pci_grpci1.c | 2 +- + arch/sparc/kernel/leon_pci_grpci2.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/sparc/kernel/leon_pci_grpci1.c b/arch/sparc/kernel/leon_pci_grpci1.c +index e6935d0ac1ec9..c32590bdd3120 100644 +--- a/arch/sparc/kernel/leon_pci_grpci1.c ++++ b/arch/sparc/kernel/leon_pci_grpci1.c +@@ -696,7 +696,7 @@ static int grpci1_of_probe(struct platform_device *ofdev) + return err; + } + +-static const struct of_device_id grpci1_of_match[] __initconst = { ++static const struct of_device_id grpci1_of_match[] = { + { + .name = "GAISLER_PCIFBRG", + }, +diff --git a/arch/sparc/kernel/leon_pci_grpci2.c b/arch/sparc/kernel/leon_pci_grpci2.c +index ca22f93d90454..dd06abc61657f 100644 +--- a/arch/sparc/kernel/leon_pci_grpci2.c ++++ b/arch/sparc/kernel/leon_pci_grpci2.c +@@ -887,7 +887,7 @@ static int grpci2_of_probe(struct platform_device *ofdev) + return err; + } + +-static const struct of_device_id grpci2_of_match[] __initconst = { ++static const struct of_device_id grpci2_of_match[] = { + { + .name = "GAISLER_GRPCI2", + }, +-- +2.43.0 + diff --git a/queue-5.4/sr9800-add-check-for-usbnet_get_endpoints.patch b/queue-5.4/sr9800-add-check-for-usbnet_get_endpoints.patch new file mode 100644 index 00000000000..2ff74f6242c --- /dev/null +++ b/queue-5.4/sr9800-add-check-for-usbnet_get_endpoints.patch @@ -0,0 +1,40 @@ +From 313762ea2293dfc66dccde376ebf6924ca3326d2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Mar 2024 07:59:27 +0000 +Subject: sr9800: Add check for usbnet_get_endpoints + +From: Chen Ni + +[ Upstream commit 07161b2416f740a2cb87faa5566873f401440a61 ] + +Add check for usbnet_get_endpoints() and return the error if it fails +in order to transfer the error. + +Signed-off-by: Chen Ni +Reviewed-by: Simon Horman +Fixes: 19a38d8e0aa3 ("USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800 Device Driver Support") +Link: https://lore.kernel.org/r/20240305075927.261284-1-nichen@iscas.ac.cn +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/usb/sr9800.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/usb/sr9800.c b/drivers/net/usb/sr9800.c +index 681e0def6356b..a5332e99102a5 100644 +--- a/drivers/net/usb/sr9800.c ++++ b/drivers/net/usb/sr9800.c +@@ -736,7 +736,9 @@ static int sr9800_bind(struct usbnet *dev, struct usb_interface *intf) + + data->eeprom_len = SR9800_EEPROM_LEN; + +- usbnet_get_endpoints(dev, intf); ++ ret = usbnet_get_endpoints(dev, intf); ++ if (ret) ++ goto out; + + /* LED Setting Rule : + * AABB:CCDD +-- +2.43.0 + diff --git a/queue-5.4/sunrpc-fix-some-memleaks-in-gssx_dec_option_array.patch b/queue-5.4/sunrpc-fix-some-memleaks-in-gssx_dec_option_array.patch new file mode 100644 index 00000000000..5b3a57cbf87 --- /dev/null +++ b/queue-5.4/sunrpc-fix-some-memleaks-in-gssx_dec_option_array.patch @@ -0,0 +1,86 @@ +From 3c3070daabeeb74877c98fab18a6e7d87f9c5758 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Jan 2024 13:38:13 +0800 +Subject: SUNRPC: fix some memleaks in gssx_dec_option_array + +From: Zhipeng Lu + +[ Upstream commit 3cfcfc102a5e57b021b786a755a38935e357797d ] + +The creds and oa->data need to be freed in the error-handling paths after +their allocation. So this patch add these deallocations in the +corresponding paths. + +Fixes: 1d658336b05f ("SUNRPC: Add RPC based upcall mechanism for RPCGSS auth") +Signed-off-by: Zhipeng Lu +Signed-off-by: Chuck Lever +Signed-off-by: Sasha Levin +--- + net/sunrpc/auth_gss/gss_rpc_xdr.c | 27 +++++++++++++++++++-------- + 1 file changed, 19 insertions(+), 8 deletions(-) + +diff --git a/net/sunrpc/auth_gss/gss_rpc_xdr.c b/net/sunrpc/auth_gss/gss_rpc_xdr.c +index 2ff7b7083ebab..e265b8d38aa14 100644 +--- a/net/sunrpc/auth_gss/gss_rpc_xdr.c ++++ b/net/sunrpc/auth_gss/gss_rpc_xdr.c +@@ -250,8 +250,8 @@ static int gssx_dec_option_array(struct xdr_stream *xdr, + + creds = kzalloc(sizeof(struct svc_cred), GFP_KERNEL); + if (!creds) { +- kfree(oa->data); +- return -ENOMEM; ++ err = -ENOMEM; ++ goto free_oa; + } + + oa->data[0].option.data = CREDS_VALUE; +@@ -265,29 +265,40 @@ static int gssx_dec_option_array(struct xdr_stream *xdr, + + /* option buffer */ + p = xdr_inline_decode(xdr, 4); +- if (unlikely(p == NULL)) +- return -ENOSPC; ++ if (unlikely(p == NULL)) { ++ err = -ENOSPC; ++ goto free_creds; ++ } + + length = be32_to_cpup(p); + p = xdr_inline_decode(xdr, length); +- if (unlikely(p == NULL)) +- return -ENOSPC; ++ if (unlikely(p == NULL)) { ++ err = -ENOSPC; ++ goto free_creds; ++ } + + if (length == sizeof(CREDS_VALUE) && + memcmp(p, CREDS_VALUE, sizeof(CREDS_VALUE)) == 0) { + /* We have creds here. parse them */ + err = gssx_dec_linux_creds(xdr, creds); + if (err) +- return err; ++ goto free_creds; + oa->data[0].value.len = 1; /* presence */ + } else { + /* consume uninteresting buffer */ + err = gssx_dec_buffer(xdr, &dummy); + if (err) +- return err; ++ goto free_creds; + } + } + return 0; ++ ++free_creds: ++ kfree(creds); ++free_oa: ++ kfree(oa->data); ++ oa->data = NULL; ++ return err; + } + + static int gssx_dec_status(struct xdr_stream *xdr, +-- +2.43.0 + diff --git a/queue-5.4/tcp-fix-incorrect-parameter-validation-in-the-do_tcp.patch b/queue-5.4/tcp-fix-incorrect-parameter-validation-in-the-do_tcp.patch new file mode 100644 index 00000000000..13bc5295701 --- /dev/null +++ b/queue-5.4/tcp-fix-incorrect-parameter-validation-in-the-do_tcp.patch @@ -0,0 +1,47 @@ +From e1bea68bec2b25957989c5f49b0bcaff36efe182 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Mar 2024 14:23:49 +0000 +Subject: tcp: fix incorrect parameter validation in the do_tcp_getsockopt() + function + +From: Gavrilov Ilia + +[ Upstream commit 716edc9706deb3bb2ff56e2eeb83559cea8f22db ] + +The 'len' variable can't be negative when assigned the result of +'min_t' because all 'min_t' parameters are cast to unsigned int, +and then the minimum one is chosen. + +To fix the logic, check 'len' as read from 'optlen', +where the types of relevant variables are (signed) int. + +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Signed-off-by: Gavrilov Ilia +Reviewed-by: Jason Xing +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/ipv4/tcp.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c +index 8d7933989de0e..8ebcff40bc5ac 100644 +--- a/net/ipv4/tcp.c ++++ b/net/ipv4/tcp.c +@@ -3451,11 +3451,11 @@ static int do_tcp_getsockopt(struct sock *sk, int level, + if (get_user(len, optlen)) + return -EFAULT; + +- len = min_t(unsigned int, len, sizeof(int)); +- + if (len < 0) + return -EINVAL; + ++ len = min_t(unsigned int, len, sizeof(int)); ++ + switch (optname) { + case TCP_MAXSEG: + val = tp->mss_cache; +-- +2.43.0 + diff --git a/queue-5.4/timekeeping-fix-cross-timestamp-interpolation-corner.patch b/queue-5.4/timekeeping-fix-cross-timestamp-interpolation-corner.patch new file mode 100644 index 00000000000..a00785f79b3 --- /dev/null +++ b/queue-5.4/timekeeping-fix-cross-timestamp-interpolation-corner.patch @@ -0,0 +1,114 @@ +From 9478f2079dbb7513bbf032aad557ae5420baab85 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Dec 2023 08:38:40 +0100 +Subject: timekeeping: Fix cross-timestamp interpolation corner case decision + +From: Peter Hilber + +[ Upstream commit 87a41130881995f82f7adbafbfeddaebfb35f0ef ] + +The cycle_between() helper checks if parameter test is in the open interval +(before, after). Colloquially speaking, this also applies to the counter +wrap-around special case before > after. get_device_system_crosststamp() +currently uses cycle_between() at the first call site to decide whether to +interpolate for older counter readings. + +get_device_system_crosststamp() has the following problem with +cycle_between() testing against an open interval: Assume that, by chance, +cycles == tk->tkr_mono.cycle_last (in the following, "cycle_last" for +brevity). Then, cycle_between() at the first call site, with effective +argument values cycle_between(cycle_last, cycles, now), returns false, +enabling interpolation. During interpolation, +get_device_system_crosststamp() will then call cycle_between() at the +second call site (if a history_begin was supplied). The effective argument +values are cycle_between(history_begin->cycles, cycles, cycles), since +system_counterval.cycles == interval_start == cycles, per the assumption. +Due to the test against the open interval, cycle_between() returns false +again. This causes get_device_system_crosststamp() to return -EINVAL. + +This failure should be avoided, since get_device_system_crosststamp() works +both when cycles follows cycle_last (no interpolation), and when cycles +precedes cycle_last (interpolation). For the case cycles == cycle_last, +interpolation is actually unneeded. + +Fix this by changing cycle_between() into timestamp_in_interval(), which +now checks against the closed interval, rather than the open interval. + +This changes the get_device_system_crosststamp() behavior for three corner +cases: + +1. Bypass interpolation in the case cycles == tk->tkr_mono.cycle_last, + fixing the problem described above. + +2. At the first timestamp_in_interval() call site, cycles == now no longer + causes failure. + +3. At the second timestamp_in_interval() call site, history_begin->cycles + == system_counterval.cycles no longer causes failure. + adjust_historical_crosststamp() also works for this corner case, + where partial_history_cycles == total_history_cycles. + +These behavioral changes should not cause any problems. + +Fixes: 2c756feb18d9 ("time: Add history to cross timestamp interface supporting slower devices") +Signed-off-by: Peter Hilber +Signed-off-by: Thomas Gleixner +Link: https://lore.kernel.org/r/20231218073849.35294-3-peter.hilber@opensynergy.com +Signed-off-by: Sasha Levin +--- + kernel/time/timekeeping.c | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c +index 5ae2b5b5ce4a0..2a43c26e913e9 100644 +--- a/kernel/time/timekeeping.c ++++ b/kernel/time/timekeeping.c +@@ -1093,13 +1093,15 @@ static int adjust_historical_crosststamp(struct system_time_snapshot *history, + } + + /* +- * cycle_between - true if test occurs chronologically between before and after ++ * timestamp_in_interval - true if ts is chronologically in [start, end] ++ * ++ * True if ts occurs chronologically at or after start, and before or at end. + */ +-static bool cycle_between(u64 before, u64 test, u64 after) ++static bool timestamp_in_interval(u64 start, u64 end, u64 ts) + { +- if (test > before && test < after) ++ if (ts >= start && ts <= end) + return true; +- if (before > after && (test > before || test < after)) ++ if (start > end && (ts >= start || ts <= end)) + return true; + return false; + } +@@ -1159,7 +1161,7 @@ int get_device_system_crosststamp(int (*get_time_fn) + */ + now = tk_clock_read(&tk->tkr_mono); + interval_start = tk->tkr_mono.cycle_last; +- if (!cycle_between(interval_start, cycles, now)) { ++ if (!timestamp_in_interval(interval_start, now, cycles)) { + clock_was_set_seq = tk->clock_was_set_seq; + cs_was_changed_seq = tk->cs_was_changed_seq; + cycles = interval_start; +@@ -1190,13 +1192,13 @@ int get_device_system_crosststamp(int (*get_time_fn) + bool discontinuity; + + /* +- * Check that the counter value occurs after the provided ++ * Check that the counter value is not before the provided + * history reference and that the history doesn't cross a + * clocksource change + */ + if (!history_begin || +- !cycle_between(history_begin->cycles, +- system_counterval.cycles, cycles) || ++ !timestamp_in_interval(history_begin->cycles, ++ cycles, system_counterval.cycles) || + history_begin->cs_was_changed_seq != cs_was_changed_seq) + return -EINVAL; + partial_history_cycles = cycles - system_counterval.cycles; +-- +2.43.0 + diff --git a/queue-5.4/timekeeping-fix-cross-timestamp-interpolation-for-no.patch b/queue-5.4/timekeeping-fix-cross-timestamp-interpolation-for-no.patch new file mode 100644 index 00000000000..d1627da9dd4 --- /dev/null +++ b/queue-5.4/timekeeping-fix-cross-timestamp-interpolation-for-no.patch @@ -0,0 +1,58 @@ +From f77216593cf18873920ce3762905eb9559c0b1b7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Dec 2023 08:38:41 +0100 +Subject: timekeeping: Fix cross-timestamp interpolation for non-x86 + +From: Peter Hilber + +[ Upstream commit 14274d0bd31b4debf28284604589f596ad2e99f2 ] + +So far, get_device_system_crosststamp() unconditionally passes +system_counterval.cycles to timekeeping_cycles_to_ns(). But when +interpolating system time (do_interp == true), system_counterval.cycles is +before tkr_mono.cycle_last, contrary to the timekeeping_cycles_to_ns() +expectations. + +On x86, CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE will mitigate on +interpolating, setting delta to 0. With delta == 0, xtstamp->sys_monoraw +and xtstamp->sys_realtime are then set to the last update time, as +implicitly expected by adjust_historical_crosststamp(). On other +architectures, the resulting nonsense xtstamp->sys_monoraw and +xtstamp->sys_realtime corrupt the xtstamp (ts) adjustment in +adjust_historical_crosststamp(). + +Fix this by deriving xtstamp->sys_monoraw and xtstamp->sys_realtime from +the last update time when interpolating, by using the local variable +"cycles". The local variable already has the right value when +interpolating, unlike system_counterval.cycles. + +Fixes: 2c756feb18d9 ("time: Add history to cross timestamp interface supporting slower devices") +Signed-off-by: Peter Hilber +Signed-off-by: Thomas Gleixner +Acked-by: John Stultz +Link: https://lore.kernel.org/r/20231218073849.35294-4-peter.hilber@opensynergy.com +Signed-off-by: Sasha Levin +--- + kernel/time/timekeeping.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c +index 2a43c26e913e9..c202dbd87860c 100644 +--- a/kernel/time/timekeeping.c ++++ b/kernel/time/timekeeping.c +@@ -1174,10 +1174,8 @@ int get_device_system_crosststamp(int (*get_time_fn) + tk_core.timekeeper.offs_real); + base_raw = tk->tkr_raw.base; + +- nsec_real = timekeeping_cycles_to_ns(&tk->tkr_mono, +- system_counterval.cycles); +- nsec_raw = timekeeping_cycles_to_ns(&tk->tkr_raw, +- system_counterval.cycles); ++ nsec_real = timekeeping_cycles_to_ns(&tk->tkr_mono, cycles); ++ nsec_raw = timekeeping_cycles_to_ns(&tk->tkr_raw, cycles); + } while (read_seqcount_retry(&tk_core.seq, seq)); + + xtstamp->sys_realtime = ktime_add_ns(base_real, nsec_real); +-- +2.43.0 + diff --git a/queue-5.4/timekeeping-fix-cross-timestamp-interpolation-on-cou.patch b/queue-5.4/timekeeping-fix-cross-timestamp-interpolation-on-cou.patch new file mode 100644 index 00000000000..ea09540327e --- /dev/null +++ b/queue-5.4/timekeeping-fix-cross-timestamp-interpolation-on-cou.patch @@ -0,0 +1,43 @@ +From 2b0d2176f0f69d9831d0d04cc04889c3b26c9e5d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Dec 2023 08:38:39 +0100 +Subject: timekeeping: Fix cross-timestamp interpolation on counter wrap + +From: Peter Hilber + +[ Upstream commit 84dccadd3e2a3f1a373826ad71e5ced5e76b0c00 ] + +cycle_between() decides whether get_device_system_crosststamp() will +interpolate for older counter readings. + +cycle_between() yields wrong results for a counter wrap-around where after +< before < test, and for the case after < test < before. + +Fix the comparison logic. + +Fixes: 2c756feb18d9 ("time: Add history to cross timestamp interface supporting slower devices") +Signed-off-by: Peter Hilber +Signed-off-by: Thomas Gleixner +Acked-by: John Stultz +Link: https://lore.kernel.org/r/20231218073849.35294-2-peter.hilber@opensynergy.com +Signed-off-by: Sasha Levin +--- + kernel/time/timekeeping.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c +index 105dd0b663291..5ae2b5b5ce4a0 100644 +--- a/kernel/time/timekeeping.c ++++ b/kernel/time/timekeeping.c +@@ -1099,7 +1099,7 @@ static bool cycle_between(u64 before, u64 test, u64 after) + { + if (test > before && test < after) + return true; +- if (test < before && before > after) ++ if (before > after && (test > before || test < after)) + return true; + return false; + } +-- +2.43.0 + diff --git a/queue-5.4/udp-fix-incorrect-parameter-validation-in-the-udp_li.patch b/queue-5.4/udp-fix-incorrect-parameter-validation-in-the-udp_li.patch new file mode 100644 index 00000000000..09d5db8c8f2 --- /dev/null +++ b/queue-5.4/udp-fix-incorrect-parameter-validation-in-the-udp_li.patch @@ -0,0 +1,47 @@ +From 070db7dc37043cb02652e141674f44478b7ceecd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Mar 2024 14:23:50 +0000 +Subject: udp: fix incorrect parameter validation in the udp_lib_getsockopt() + function + +From: Gavrilov Ilia + +[ Upstream commit 4bb3ba7b74fceec6f558745b25a43c6521cf5506 ] + +The 'len' variable can't be negative when assigned the result of +'min_t' because all 'min_t' parameters are cast to unsigned int, +and then the minimum one is chosen. + +To fix the logic, check 'len' as read from 'optlen', +where the types of relevant variables are (signed) int. + +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Reviewed-by: Willem de Bruijn +Signed-off-by: Gavrilov Ilia +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/ipv4/udp.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c +index a6f982b2d32af..3b3f944798850 100644 +--- a/net/ipv4/udp.c ++++ b/net/ipv4/udp.c +@@ -2679,11 +2679,11 @@ int udp_lib_getsockopt(struct sock *sk, int level, int optname, + if (get_user(len, optlen)) + return -EFAULT; + +- len = min_t(unsigned int, len, sizeof(int)); +- + if (len < 0) + return -EINVAL; + ++ len = min_t(unsigned int, len, sizeof(int)); ++ + switch (optname) { + case UDP_CORK: + val = READ_ONCE(up->corkflag); +-- +2.43.0 + diff --git a/queue-5.4/watchdog-stm32_iwdg-initialize-default-timeout.patch b/queue-5.4/watchdog-stm32_iwdg-initialize-default-timeout.patch new file mode 100644 index 00000000000..fb3fd57bf13 --- /dev/null +++ b/queue-5.4/watchdog-stm32_iwdg-initialize-default-timeout.patch @@ -0,0 +1,59 @@ +From abbdf0e323fceeb91073287910c5e22e6087bdca Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 28 Feb 2024 13:27:23 -0500 +Subject: watchdog: stm32_iwdg: initialize default timeout + +From: Ben Wolsieffer + +[ Upstream commit dbd7c0088b7f44aa0b9276ed3449df075a7b5b54 ] + +The driver never sets a default timeout value, therefore it is +initialized to zero. When CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED is +enabled, the watchdog is started during probe. The kernel is supposed to +automatically ping the watchdog from this point until userspace takes +over, but this does not happen if the configured timeout is zero. A zero +timeout causes watchdog_need_worker() to return false, so the heartbeat +worker does not run and the system therefore resets soon after the +driver is probed. + +This patch fixes this by setting an arbitrary non-zero default timeout. +The default could be read from the hardware instead, but I didn't see +any reason to add this complexity. + +This has been tested on an STM32F746. + +Fixes: 85fdc63fe256 ("drivers: watchdog: stm32_iwdg: set WDOG_HW_RUNNING at probe") +Signed-off-by: Ben Wolsieffer +Reviewed-by: Guenter Roeck +Link: https://lore.kernel.org/r/20240228182723.12855-1-ben.wolsieffer@hefring.com +Signed-off-by: Guenter Roeck +Signed-off-by: Wim Van Sebroeck +Signed-off-by: Sasha Levin +--- + drivers/watchdog/stm32_iwdg.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/watchdog/stm32_iwdg.c b/drivers/watchdog/stm32_iwdg.c +index 25188d6bbe152..16dd1aab7c676 100644 +--- a/drivers/watchdog/stm32_iwdg.c ++++ b/drivers/watchdog/stm32_iwdg.c +@@ -21,6 +21,8 @@ + #include + #include + ++#define DEFAULT_TIMEOUT 10 ++ + /* IWDG registers */ + #define IWDG_KR 0x00 /* Key register */ + #define IWDG_PR 0x04 /* Prescaler Register */ +@@ -254,6 +256,7 @@ static int stm32_iwdg_probe(struct platform_device *pdev) + wdd->parent = dev; + wdd->info = &stm32_iwdg_info; + wdd->ops = &stm32_iwdg_ops; ++ wdd->timeout = DEFAULT_TIMEOUT; + wdd->min_timeout = DIV_ROUND_UP((RLR_MIN + 1) * PR_MIN, wdt->rate); + wdd->max_hw_heartbeat_ms = ((RLR_MAX + 1) * wdt->data->max_prescaler * + 1000) / wdt->rate; +-- +2.43.0 + diff --git a/queue-5.4/wifi-ath10k-fix-null-pointer-dereference-in-ath10k_w.patch b/queue-5.4/wifi-ath10k-fix-null-pointer-dereference-in-ath10k_w.patch new file mode 100644 index 00000000000..a4d435a5cf9 --- /dev/null +++ b/queue-5.4/wifi-ath10k-fix-null-pointer-dereference-in-ath10k_w.patch @@ -0,0 +1,42 @@ +From 195160377ddf8f7477c72c6ec9a23fc220d3425f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 17 Dec 2023 13:29:01 +0200 +Subject: wifi: ath10k: fix NULL pointer dereference in + ath10k_wmi_tlv_op_pull_mgmt_tx_compl_ev() + +From: Xingyuan Mo + +[ Upstream commit ad25ee36f00172f7d53242dc77c69fff7ced0755 ] + +We should check whether the WMI_TLV_TAG_STRUCT_MGMT_TX_COMPL_EVENT tlv is +present before accessing it, otherwise a null pointer deference error will +occur. + +Fixes: dc405152bb64 ("ath10k: handle mgmt tx completion event") +Signed-off-by: Xingyuan Mo +Acked-by: Jeff Johnson +Signed-off-by: Kalle Valo +Link: https://msgid.link/20231208043433.271449-1-hdthky0@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath10k/wmi-tlv.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c +index 315d20f5c8eb1..ee1c86bb5078b 100644 +--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c ++++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c +@@ -707,6 +707,10 @@ ath10k_wmi_tlv_op_pull_mgmt_tx_compl_ev(struct ath10k *ar, struct sk_buff *skb, + } + + ev = tb[WMI_TLV_TAG_STRUCT_MGMT_TX_COMPL_EVENT]; ++ if (!ev) { ++ kfree(tb); ++ return -EPROTO; ++ } + + arg->desc_id = ev->desc_id; + arg->status = ev->status; +-- +2.43.0 + diff --git a/queue-5.4/wifi-b43-disable-qos-for-bcm4331.patch b/queue-5.4/wifi-b43-disable-qos-for-bcm4331.patch new file mode 100644 index 00000000000..1e1b4513dd0 --- /dev/null +++ b/queue-5.4/wifi-b43-disable-qos-for-bcm4331.patch @@ -0,0 +1,68 @@ +From 0ac941d227f362360ee8497f5043c1dd64efdaa2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 31 Dec 2023 05:03:58 +0000 +Subject: wifi: b43: Disable QoS for bcm4331 + +From: Rahul Rameshbabu + +[ Upstream commit 09795bded2e725443fe4a4803cae2079cdaf7b26 ] + +bcm4331 seems to not function correctly with QoS support. This may be due +to issues with currently available firmware or potentially a device +specific issue. + +When queues that are not of the default "best effort" priority are +selected, traffic appears to not transmit out of the hardware while no +errors are returned. This behavior is present among all the other priority +queues: video, voice, and background. While this can be worked around by +setting a kernel parameter, the default behavior is problematic for most +users and may be difficult to debug. This patch offers a working out-of-box +experience for bcm4331 users. + +Log of the issue (using ssh low-priority traffic as an example): + ssh -T -vvvv git@github.com + OpenSSH_9.6p1, OpenSSL 3.0.12 24 Oct 2023 + debug1: Reading configuration data /etc/ssh/ssh_config + debug2: checking match for 'host * exec "/nix/store/q1c2flcykgr4wwg5a6h450hxbk4ch589-bash-5.2-p15/bin/bash -c '/nix/store/c015armnkhr6v18za0rypm7sh1i8js8w-gnupg-2.4.1/bin/gpg-connect-agent --quiet updatestartuptty /bye >/dev/null 2>&1'"' host github.com originally github.com + debug3: /etc/ssh/ssh_config line 5: matched 'host "github.com"' + debug1: Executing command: '/nix/store/q1c2flcykgr4wwg5a6h450hxbk4ch589-bash-5.2-p15/bin/bash -c '/nix/store/c015armnkhr6v18za0rypm7sh1i8js8w-gnupg-2.4.1/bin/gpg-connect-agent --quiet updatestartuptty /bye >/dev/null 2>&1'' + debug3: command returned status 0 + debug3: /etc/ssh/ssh_config line 5: matched 'exec "/nix/store/q1c2flcykgr4wwg5a6h450hxbk4ch589-bash-5.2-p15/bin/bash -c '/nix/store/c015armnkhr6v18za0r"' + debug2: match found + debug1: /etc/ssh/ssh_config line 9: Applying options for * + debug3: expanded UserKnownHostsFile '~/.ssh/known_hosts' -> '/home/binary-eater/.ssh/known_hosts' + debug3: expanded UserKnownHostsFile '~/.ssh/known_hosts2' -> '/home/binary-eater/.ssh/known_hosts2' + debug2: resolving "github.com" port 22 + debug3: resolve_host: lookup github.com:22 + debug3: channel_clear_timeouts: clearing + debug3: ssh_connect_direct: entering + debug1: Connecting to github.com [192.30.255.113] port 22. + debug3: set_sock_tos: set socket 3 IP_TOS 0x48 + +Fixes: e6f5b934fba8 ("b43: Add QOS support") +Signed-off-by: Rahul Rameshbabu +Reviewed-by: Julian Calaby +Signed-off-by: Kalle Valo +Link: https://msgid.link/20231231050300.122806-5-sergeantsagara@protonmail.com +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/broadcom/b43/main.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/broadcom/b43/main.c b/drivers/net/wireless/broadcom/b43/main.c +index b4701846caf3e..e466324a1fd24 100644 +--- a/drivers/net/wireless/broadcom/b43/main.c ++++ b/drivers/net/wireless/broadcom/b43/main.c +@@ -2585,7 +2585,8 @@ static void b43_request_firmware(struct work_struct *work) + + start_ieee80211: + wl->hw->queues = B43_QOS_QUEUE_NUM; +- if (!modparam_qos || dev->fw.opensource) ++ if (!modparam_qos || dev->fw.opensource || ++ dev->dev->chip_id == BCMA_CHIP_ID_BCM4331) + wl->hw->queues = 1; + + err = ieee80211_register_hw(wl->hw); +-- +2.43.0 + diff --git a/queue-5.4/wifi-b43-stop-correct-queue-in-dma-worker-when-qos-i.patch b/queue-5.4/wifi-b43-stop-correct-queue-in-dma-worker-when-qos-i.patch new file mode 100644 index 00000000000..6e7d95185d2 --- /dev/null +++ b/queue-5.4/wifi-b43-stop-correct-queue-in-dma-worker-when-qos-i.patch @@ -0,0 +1,66 @@ +From 30ebd5e50361bbe7eaf7f60d7fcd6fd8f09c89a7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 31 Dec 2023 05:03:51 +0000 +Subject: wifi: b43: Stop correct queue in DMA worker when QoS is disabled + +From: Rahul Rameshbabu + +[ Upstream commit 581c8967d66c4961076dbbee356834e9c6777184 ] + +When QoS is disabled, the queue priority value will not map to the correct +ieee80211 queue since there is only one queue. Stop queue 0 when QoS is +disabled to prevent trying to stop a non-existent queue and failing to stop +the actual queue instantiated. + +Fixes: bad691946966 ("b43: avoid packet losses in the dma worker code.") +Signed-off-by: Rahul Rameshbabu +Reviewed-by: Julian Calaby +Signed-off-by: Kalle Valo +Link: https://msgid.link/20231231050300.122806-4-sergeantsagara@protonmail.com +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/broadcom/b43/main.c | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +diff --git a/drivers/net/wireless/broadcom/b43/main.c b/drivers/net/wireless/broadcom/b43/main.c +index 3ad94dad2d89b..b4701846caf3e 100644 +--- a/drivers/net/wireless/broadcom/b43/main.c ++++ b/drivers/net/wireless/broadcom/b43/main.c +@@ -3601,7 +3601,7 @@ static void b43_tx_work(struct work_struct *work) + err = b43_dma_tx(dev, skb); + if (err == -ENOSPC) { + wl->tx_queue_stopped[queue_num] = true; +- ieee80211_stop_queue(wl->hw, queue_num); ++ b43_stop_queue(dev, queue_num); + skb_queue_head(&wl->tx_queue[queue_num], skb); + break; + } +@@ -3625,6 +3625,7 @@ static void b43_op_tx(struct ieee80211_hw *hw, + struct sk_buff *skb) + { + struct b43_wl *wl = hw_to_b43_wl(hw); ++ u16 skb_queue_mapping; + + if (unlikely(skb->len < 2 + 2 + 6)) { + /* Too short, this can't be a valid frame. */ +@@ -3633,12 +3634,12 @@ static void b43_op_tx(struct ieee80211_hw *hw, + } + B43_WARN_ON(skb_shinfo(skb)->nr_frags); + +- skb_queue_tail(&wl->tx_queue[skb->queue_mapping], skb); +- if (!wl->tx_queue_stopped[skb->queue_mapping]) { ++ skb_queue_mapping = skb_get_queue_mapping(skb); ++ skb_queue_tail(&wl->tx_queue[skb_queue_mapping], skb); ++ if (!wl->tx_queue_stopped[skb_queue_mapping]) + ieee80211_queue_work(wl->hw, &wl->tx_work); +- } else { +- ieee80211_stop_queue(wl->hw, skb->queue_mapping); +- } ++ else ++ b43_stop_queue(wl->current_dev, skb_queue_mapping); + } + + static void b43_qos_params_upload(struct b43_wldev *dev, +-- +2.43.0 + diff --git a/queue-5.4/wifi-b43-stop-wake-correct-queue-in-dma-tx-path-when.patch b/queue-5.4/wifi-b43-stop-wake-correct-queue-in-dma-tx-path-when.patch new file mode 100644 index 00000000000..17b45493afa --- /dev/null +++ b/queue-5.4/wifi-b43-stop-wake-correct-queue-in-dma-tx-path-when.patch @@ -0,0 +1,167 @@ +From 0ee11e91c32e72ebfc100547f78ea2a104f2399c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 31 Dec 2023 05:03:33 +0000 +Subject: wifi: b43: Stop/wake correct queue in DMA Tx path when QoS is + disabled + +From: Rahul Rameshbabu + +[ Upstream commit 9636951e4468f02c72cc75a82dc65d003077edbc ] + +When QoS is disabled, the queue priority value will not map to the correct +ieee80211 queue since there is only one queue. Stop/wake queue 0 when QoS +is disabled to prevent trying to stop/wake a non-existent queue and failing +to stop/wake the actual queue instantiated. + +Log of issue before change (with kernel parameter qos=0): + [ +5.112651] ------------[ cut here ]------------ + [ +0.000005] WARNING: CPU: 7 PID: 25513 at net/mac80211/util.c:449 __ieee80211_wake_queue+0xd5/0x180 [mac80211] + [ +0.000067] Modules linked in: b43(O) snd_seq_dummy snd_hrtimer snd_seq snd_seq_device nft_chain_nat xt_MASQUERADE nf_nat xfrm_user xfrm_algo xt_addrtype overlay ccm af_packet amdgpu snd_hda_codec_cirrus snd_hda_codec_generic ledtrig_audio drm_exec amdxcp gpu_sched xt_conntrack nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 ip6t_rpfilter ipt_rpfilter xt_pkttype xt_LOG nf_log_syslog xt_tcpudp nft_compat nf_tables nfnetlink sch_fq_codel btusb uinput iTCO_wdt ctr btrtl intel_pmc_bxt i915 intel_rapl_msr mei_hdcp mei_pxp joydev at24 watchdog btintel atkbd libps2 serio radeon btbcm vivaldi_fmap btmtk intel_rapl_common snd_hda_codec_hdmi bluetooth uvcvideo nls_iso8859_1 applesmc nls_cp437 x86_pkg_temp_thermal snd_hda_intel intel_powerclamp vfat videobuf2_vmalloc coretemp fat snd_intel_dspcfg crc32_pclmul uvc polyval_clmulni snd_intel_sdw_acpi loop videobuf2_memops snd_hda_codec tun drm_suballoc_helper polyval_generic drm_ttm_helper drm_buddy tap ecdh_generic videobuf2_v4l2 gf128mul macvlan ttm ghash_clmulni_intel ecc tg3 + [ +0.000044] videodev bridge snd_hda_core rapl crc16 drm_display_helper cec mousedev snd_hwdep evdev intel_cstate bcm5974 hid_appleir videobuf2_common stp mac_hid libphy snd_pcm drm_kms_helper acpi_als mei_me intel_uncore llc mc snd_timer intel_gtt industrialio_triggered_buffer apple_mfi_fastcharge i2c_i801 mei snd lpc_ich agpgart ptp i2c_smbus thunderbolt apple_gmux i2c_algo_bit kfifo_buf video industrialio soundcore pps_core wmi tiny_power_button sbs sbshc button ac cordic bcma mac80211 cfg80211 ssb rfkill libarc4 kvm_intel kvm drm irqbypass fuse backlight firmware_class efi_pstore configfs efivarfs dmi_sysfs ip_tables x_tables autofs4 dm_crypt cbc encrypted_keys trusted asn1_encoder tee tpm rng_core input_leds hid_apple led_class hid_generic usbhid hid sd_mod t10_pi crc64_rocksoft crc64 crc_t10dif crct10dif_generic ahci libahci libata uhci_hcd ehci_pci ehci_hcd crct10dif_pclmul crct10dif_common sha512_ssse3 sha512_generic sha256_ssse3 sha1_ssse3 aesni_intel usbcore scsi_mod libaes crypto_simd cryptd scsi_common + [ +0.000055] usb_common rtc_cmos btrfs blake2b_generic libcrc32c crc32c_generic crc32c_intel xor raid6_pq dm_snapshot dm_bufio dm_mod dax [last unloaded: b43(O)] + [ +0.000009] CPU: 7 PID: 25513 Comm: irq/17-b43 Tainted: G W O 6.6.7 #1-NixOS + [ +0.000003] Hardware name: Apple Inc. MacBookPro8,3/Mac-942459F5819B171B, BIOS 87.0.0.0.0 06/13/2019 + [ +0.000001] RIP: 0010:__ieee80211_wake_queue+0xd5/0x180 [mac80211] + [ +0.000046] Code: 00 45 85 e4 0f 85 9b 00 00 00 48 8d bd 40 09 00 00 f0 48 0f ba ad 48 09 00 00 00 72 0f 5b 5d 41 5c 41 5d 41 5e e9 cb 6d 3c d0 <0f> 0b 5b 5d 41 5c 41 5d 41 5e c3 cc cc cc cc 48 8d b4 16 94 00 00 + [ +0.000002] RSP: 0018:ffffc90003c77d60 EFLAGS: 00010097 + [ +0.000001] RAX: 0000000000000001 RBX: 0000000000000002 RCX: 0000000000000000 + [ +0.000001] RDX: 0000000000000000 RSI: 0000000000000002 RDI: ffff88820b924900 + [ +0.000002] RBP: ffff88820b924900 R08: ffffc90003c77d90 R09: 000000000003bfd0 + [ +0.000001] R10: ffff88820b924900 R11: ffffc90003c77c68 R12: 0000000000000000 + [ +0.000001] R13: 0000000000000000 R14: ffffc90003c77d90 R15: ffffffffc0fa6f40 + [ +0.000001] FS: 0000000000000000(0000) GS:ffff88846fb80000(0000) knlGS:0000000000000000 + [ +0.000001] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 + [ +0.000001] CR2: 00007fafda7ae008 CR3: 000000046d220005 CR4: 00000000000606e0 + [ +0.000002] Call Trace: + [ +0.000003] + [ +0.000001] ? __ieee80211_wake_queue+0xd5/0x180 [mac80211] + [ +0.000044] ? __warn+0x81/0x130 + [ +0.000005] ? __ieee80211_wake_queue+0xd5/0x180 [mac80211] + [ +0.000045] ? report_bug+0x171/0x1a0 + [ +0.000004] ? handle_bug+0x41/0x70 + [ +0.000004] ? exc_invalid_op+0x17/0x70 + [ +0.000003] ? asm_exc_invalid_op+0x1a/0x20 + [ +0.000005] ? __ieee80211_wake_queue+0xd5/0x180 [mac80211] + [ +0.000043] ieee80211_wake_queue+0x4a/0x80 [mac80211] + [ +0.000044] b43_dma_handle_txstatus+0x29c/0x3a0 [b43] + [ +0.000016] ? __pfx_irq_thread_fn+0x10/0x10 + [ +0.000002] b43_handle_txstatus+0x61/0x80 [b43] + [ +0.000012] b43_interrupt_thread_handler+0x3f9/0x6b0 [b43] + [ +0.000011] irq_thread_fn+0x23/0x60 + [ +0.000002] irq_thread+0xfe/0x1c0 + [ +0.000002] ? __pfx_irq_thread_dtor+0x10/0x10 + [ +0.000001] ? __pfx_irq_thread+0x10/0x10 + [ +0.000001] kthread+0xe8/0x120 + [ +0.000003] ? __pfx_kthread+0x10/0x10 + [ +0.000003] ret_from_fork+0x34/0x50 + [ +0.000002] ? __pfx_kthread+0x10/0x10 + [ +0.000002] ret_from_fork_asm+0x1b/0x30 + [ +0.000004] + [ +0.000001] ---[ end trace 0000000000000000 ]--- + + [ +0.000065] ------------[ cut here ]------------ + [ +0.000001] WARNING: CPU: 0 PID: 56077 at net/mac80211/util.c:514 __ieee80211_stop_queue+0xcc/0xe0 [mac80211] + [ +0.000077] Modules linked in: b43(O) snd_seq_dummy snd_hrtimer snd_seq snd_seq_device nft_chain_nat xt_MASQUERADE nf_nat xfrm_user xfrm_algo xt_addrtype overlay ccm af_packet amdgpu snd_hda_codec_cirrus snd_hda_codec_generic ledtrig_audio drm_exec amdxcp gpu_sched xt_conntrack nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 ip6t_rpfilter ipt_rpfilter xt_pkttype xt_LOG nf_log_syslog xt_tcpudp nft_compat nf_tables nfnetlink sch_fq_codel btusb uinput iTCO_wdt ctr btrtl intel_pmc_bxt i915 intel_rapl_msr mei_hdcp mei_pxp joydev at24 watchdog btintel atkbd libps2 serio radeon btbcm vivaldi_fmap btmtk intel_rapl_common snd_hda_codec_hdmi bluetooth uvcvideo nls_iso8859_1 applesmc nls_cp437 x86_pkg_temp_thermal snd_hda_intel intel_powerclamp vfat videobuf2_vmalloc coretemp fat snd_intel_dspcfg crc32_pclmul uvc polyval_clmulni snd_intel_sdw_acpi loop videobuf2_memops snd_hda_codec tun drm_suballoc_helper polyval_generic drm_ttm_helper drm_buddy tap ecdh_generic videobuf2_v4l2 gf128mul macvlan ttm ghash_clmulni_intel ecc tg3 + [ +0.000073] videodev bridge snd_hda_core rapl crc16 drm_display_helper cec mousedev snd_hwdep evdev intel_cstate bcm5974 hid_appleir videobuf2_common stp mac_hid libphy snd_pcm drm_kms_helper acpi_als mei_me intel_uncore llc mc snd_timer intel_gtt industrialio_triggered_buffer apple_mfi_fastcharge i2c_i801 mei snd lpc_ich agpgart ptp i2c_smbus thunderbolt apple_gmux i2c_algo_bit kfifo_buf video industrialio soundcore pps_core wmi tiny_power_button sbs sbshc button ac cordic bcma mac80211 cfg80211 ssb rfkill libarc4 kvm_intel kvm drm irqbypass fuse backlight firmware_class efi_pstore configfs efivarfs dmi_sysfs ip_tables x_tables autofs4 dm_crypt cbc encrypted_keys trusted asn1_encoder tee tpm rng_core input_leds hid_apple led_class hid_generic usbhid hid sd_mod t10_pi crc64_rocksoft crc64 crc_t10dif crct10dif_generic ahci libahci libata uhci_hcd ehci_pci ehci_hcd crct10dif_pclmul crct10dif_common sha512_ssse3 sha512_generic sha256_ssse3 sha1_ssse3 aesni_intel usbcore scsi_mod libaes crypto_simd cryptd scsi_common + [ +0.000084] usb_common rtc_cmos btrfs blake2b_generic libcrc32c crc32c_generic crc32c_intel xor raid6_pq dm_snapshot dm_bufio dm_mod dax [last unloaded: b43] + [ +0.000012] CPU: 0 PID: 56077 Comm: kworker/u16:17 Tainted: G W O 6.6.7 #1-NixOS + [ +0.000003] Hardware name: Apple Inc. MacBookPro8,3/Mac-942459F5819B171B, BIOS 87.0.0.0.0 06/13/2019 + [ +0.000001] Workqueue: phy7 b43_tx_work [b43] + [ +0.000019] RIP: 0010:__ieee80211_stop_queue+0xcc/0xe0 [mac80211] + [ +0.000076] Code: 74 11 48 8b 78 08 0f b7 d6 89 e9 4c 89 e6 e8 ab f4 00 00 65 ff 0d 9c b7 34 3f 0f 85 55 ff ff ff 0f 1f 44 00 00 e9 4b ff ff ff <0f> 0b 5b 5d 41 5c 41 5d c3 cc cc cc cc 0f 1f 80 00 00 00 00 90 90 + [ +0.000002] RSP: 0000:ffffc90004157d50 EFLAGS: 00010097 + [ +0.000002] RAX: 0000000000000001 RBX: 0000000000000002 RCX: 0000000000000000 + [ +0.000002] RDX: 0000000000000000 RSI: 0000000000000002 RDI: ffff8882d65d0900 + [ +0.000002] RBP: 0000000000000000 R08: 0000000000000001 R09: 0000000000000001 + [ +0.000001] R10: 00000000000000ff R11: ffff88814d0155a0 R12: ffff8882d65d0900 + [ +0.000002] R13: 0000000000000000 R14: ffff8881002d2800 R15: 00000000000000d0 + [ +0.000002] FS: 0000000000000000(0000) GS:ffff88846f800000(0000) knlGS:0000000000000000 + [ +0.000003] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 + [ +0.000002] CR2: 00007f2e8c10c880 CR3: 0000000385b66005 CR4: 00000000000606f0 + [ +0.000002] Call Trace: + [ +0.000001] + [ +0.000001] ? __ieee80211_stop_queue+0xcc/0xe0 [mac80211] + [ +0.000075] ? __warn+0x81/0x130 + [ +0.000004] ? __ieee80211_stop_queue+0xcc/0xe0 [mac80211] + [ +0.000075] ? report_bug+0x171/0x1a0 + [ +0.000005] ? handle_bug+0x41/0x70 + [ +0.000003] ? exc_invalid_op+0x17/0x70 + [ +0.000004] ? asm_exc_invalid_op+0x1a/0x20 + [ +0.000004] ? __ieee80211_stop_queue+0xcc/0xe0 [mac80211] + [ +0.000076] ieee80211_stop_queue+0x36/0x50 [mac80211] + [ +0.000077] b43_dma_tx+0x550/0x780 [b43] + [ +0.000023] b43_tx_work+0x90/0x130 [b43] + [ +0.000018] process_one_work+0x174/0x340 + [ +0.000003] worker_thread+0x27b/0x3a0 + [ +0.000004] ? __pfx_worker_thread+0x10/0x10 + [ +0.000002] kthread+0xe8/0x120 + [ +0.000003] ? __pfx_kthread+0x10/0x10 + [ +0.000004] ret_from_fork+0x34/0x50 + [ +0.000002] ? __pfx_kthread+0x10/0x10 + [ +0.000003] ret_from_fork_asm+0x1b/0x30 + [ +0.000006] + [ +0.000001] ---[ end trace 0000000000000000 ]--- + +Fixes: e6f5b934fba8 ("b43: Add QOS support") +Signed-off-by: Rahul Rameshbabu +Reviewed-by: Julian Calaby +Signed-off-by: Kalle Valo +Link: https://msgid.link/20231231050300.122806-2-sergeantsagara@protonmail.com +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/broadcom/b43/b43.h | 16 ++++++++++++++++ + drivers/net/wireless/broadcom/b43/dma.c | 4 ++-- + 2 files changed, 18 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/wireless/broadcom/b43/b43.h b/drivers/net/wireless/broadcom/b43/b43.h +index 67b4bac048e58..c0d8fc0b22fb2 100644 +--- a/drivers/net/wireless/broadcom/b43/b43.h ++++ b/drivers/net/wireless/broadcom/b43/b43.h +@@ -1082,6 +1082,22 @@ static inline bool b43_using_pio_transfers(struct b43_wldev *dev) + return dev->__using_pio_transfers; + } + ++static inline void b43_wake_queue(struct b43_wldev *dev, int queue_prio) ++{ ++ if (dev->qos_enabled) ++ ieee80211_wake_queue(dev->wl->hw, queue_prio); ++ else ++ ieee80211_wake_queue(dev->wl->hw, 0); ++} ++ ++static inline void b43_stop_queue(struct b43_wldev *dev, int queue_prio) ++{ ++ if (dev->qos_enabled) ++ ieee80211_stop_queue(dev->wl->hw, queue_prio); ++ else ++ ieee80211_stop_queue(dev->wl->hw, 0); ++} ++ + /* Message printing */ + __printf(2, 3) void b43info(struct b43_wl *wl, const char *fmt, ...); + __printf(2, 3) void b43err(struct b43_wl *wl, const char *fmt, ...); +diff --git a/drivers/net/wireless/broadcom/b43/dma.c b/drivers/net/wireless/broadcom/b43/dma.c +index ca671fc13116f..19624133b64ad 100644 +--- a/drivers/net/wireless/broadcom/b43/dma.c ++++ b/drivers/net/wireless/broadcom/b43/dma.c +@@ -1399,7 +1399,7 @@ int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb) + should_inject_overflow(ring)) { + /* This TX ring is full. */ + unsigned int skb_mapping = skb_get_queue_mapping(skb); +- ieee80211_stop_queue(dev->wl->hw, skb_mapping); ++ b43_stop_queue(dev, skb_mapping); + dev->wl->tx_queue_stopped[skb_mapping] = true; + ring->stopped = true; + if (b43_debug(dev, B43_DBG_DMAVERBOSE)) { +@@ -1570,7 +1570,7 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, + } else { + /* If the driver queue is running wake the corresponding + * mac80211 queue. */ +- ieee80211_wake_queue(dev->wl->hw, ring->queue_prio); ++ b43_wake_queue(dev, ring->queue_prio); + if (b43_debug(dev, B43_DBG_DMAVERBOSE)) { + b43dbg(dev->wl, "Woke up TX ring %d\n", ring->index); + } +-- +2.43.0 + diff --git a/queue-5.4/wifi-b43-stop-wake-correct-queue-in-pio-tx-path-when.patch b/queue-5.4/wifi-b43-stop-wake-correct-queue-in-pio-tx-path-when.patch new file mode 100644 index 00000000000..0aac67e3c3e --- /dev/null +++ b/queue-5.4/wifi-b43-stop-wake-correct-queue-in-pio-tx-path-when.patch @@ -0,0 +1,59 @@ +From abbadaa19ad1b6e22dd7f7cfd80ba1c7b71d6681 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 31 Dec 2023 05:03:45 +0000 +Subject: wifi: b43: Stop/wake correct queue in PIO Tx path when QoS is + disabled + +From: Rahul Rameshbabu + +[ Upstream commit 77135a38f6c2f950d2306ac3d37cbb407e6243f2 ] + +When QoS is disabled, the queue priority value will not map to the correct +ieee80211 queue since there is only one queue. Stop/wake queue 0 when QoS +is disabled to prevent trying to stop/wake a non-existent queue and failing +to stop/wake the actual queue instantiated. + +Fixes: 5100d5ac81b9 ("b43: Add PIO support for PCMCIA devices") +Signed-off-by: Rahul Rameshbabu +Reviewed-by: Julian Calaby +Signed-off-by: Kalle Valo +Link: https://msgid.link/20231231050300.122806-3-sergeantsagara@protonmail.com +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/broadcom/b43/pio.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/wireless/broadcom/b43/pio.c b/drivers/net/wireless/broadcom/b43/pio.c +index 69f8b46c90157..468fd647d0a08 100644 +--- a/drivers/net/wireless/broadcom/b43/pio.c ++++ b/drivers/net/wireless/broadcom/b43/pio.c +@@ -525,7 +525,7 @@ int b43_pio_tx(struct b43_wldev *dev, struct sk_buff *skb) + if (total_len > (q->buffer_size - q->buffer_used)) { + /* Not enough memory on the queue. */ + err = -EBUSY; +- ieee80211_stop_queue(dev->wl->hw, skb_get_queue_mapping(skb)); ++ b43_stop_queue(dev, skb_get_queue_mapping(skb)); + q->stopped = true; + goto out; + } +@@ -552,7 +552,7 @@ int b43_pio_tx(struct b43_wldev *dev, struct sk_buff *skb) + if (((q->buffer_size - q->buffer_used) < roundup(2 + 2 + 6, 4)) || + (q->free_packet_slots == 0)) { + /* The queue is full. */ +- ieee80211_stop_queue(dev->wl->hw, skb_get_queue_mapping(skb)); ++ b43_stop_queue(dev, skb_get_queue_mapping(skb)); + q->stopped = true; + } + +@@ -587,7 +587,7 @@ void b43_pio_handle_txstatus(struct b43_wldev *dev, + list_add(&pack->list, &q->packets_list); + + if (q->stopped) { +- ieee80211_wake_queue(dev->wl->hw, q->queue_prio); ++ b43_wake_queue(dev, q->queue_prio); + q->stopped = false; + } + } +-- +2.43.0 + diff --git a/queue-5.4/wifi-brcmsmac-avoid-function-pointer-casts.patch b/queue-5.4/wifi-brcmsmac-avoid-function-pointer-casts.patch new file mode 100644 index 00000000000..0af6662c763 --- /dev/null +++ b/queue-5.4/wifi-brcmsmac-avoid-function-pointer-casts.patch @@ -0,0 +1,81 @@ +From ef2415897e6270986ecfaa605831a59c8586a91c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 13 Feb 2024 11:05:37 +0100 +Subject: wifi: brcmsmac: avoid function pointer casts + +From: Arnd Bergmann + +[ Upstream commit e1ea6db35fc3ba5ff063f097385e9f7a88c25356 ] + +An old cleanup went a little too far and causes a warning with clang-16 +and higher as it breaks control flow integrity (KCFI) rules: + +drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy_shim.c:64:34: error: cast from 'void (*)(struct brcms_phy *)' to 'void (*)(void *)' converts to incompatible function type [-Werror,-Wcast-function-type-strict] + 64 | brcms_init_timer(physhim->wl, (void (*)(void *))fn, + | ^~~~~~~~~~~~~~~~~~~~ + +Change this one instance back to passing a void pointer so it can be +used with the timer callback interface. + +Fixes: d89a4c80601d ("staging: brcm80211: removed void * from softmac phy") +Signed-off-by: Arnd Bergmann +Acked-by: Arend van Spriel +Signed-off-by: Kalle Valo +Link: https://msgid.link/20240213100548.457854-1-arnd@kernel.org +Signed-off-by: Sasha Levin +--- + .../net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_cmn.c | 3 ++- + drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy_shim.c | 5 ++--- + drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy_shim.h | 2 +- + 3 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_cmn.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_cmn.c +index 2441714169de1..849c8109b3982 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_cmn.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_cmn.c +@@ -383,8 +383,9 @@ struct shared_phy *wlc_phy_shared_attach(struct shared_phy_params *shp) + return sh; + } + +-static void wlc_phy_timercb_phycal(struct brcms_phy *pi) ++static void wlc_phy_timercb_phycal(void *ptr) + { ++ struct brcms_phy *pi = ptr; + uint delay = 5; + + if (PHY_PERICAL_MPHASE_PENDING(pi)) { +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy_shim.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy_shim.c +index a0de5db0cd646..b723817915365 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy_shim.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy_shim.c +@@ -57,12 +57,11 @@ void wlc_phy_shim_detach(struct phy_shim_info *physhim) + } + + struct wlapi_timer *wlapi_init_timer(struct phy_shim_info *physhim, +- void (*fn)(struct brcms_phy *pi), ++ void (*fn)(void *pi), + void *arg, const char *name) + { + return (struct wlapi_timer *) +- brcms_init_timer(physhim->wl, (void (*)(void *))fn, +- arg, name); ++ brcms_init_timer(physhim->wl, fn, arg, name); + } + + void wlapi_free_timer(struct wlapi_timer *t) +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy_shim.h b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy_shim.h +index dd8774717adee..27d0934e600ed 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy_shim.h ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy_shim.h +@@ -131,7 +131,7 @@ void wlc_phy_shim_detach(struct phy_shim_info *physhim); + + /* PHY to WL utility functions */ + struct wlapi_timer *wlapi_init_timer(struct phy_shim_info *physhim, +- void (*fn)(struct brcms_phy *pi), ++ void (*fn)(void *pi), + void *arg, const char *name); + void wlapi_free_timer(struct wlapi_timer *t); + void wlapi_add_timer(struct wlapi_timer *t, uint ms, int periodic); +-- +2.43.0 + diff --git a/queue-5.4/wifi-libertas-fix-some-memleaks-in-lbs_allocate_cmd_.patch b/queue-5.4/wifi-libertas-fix-some-memleaks-in-lbs_allocate_cmd_.patch new file mode 100644 index 00000000000..940624fc797 --- /dev/null +++ b/queue-5.4/wifi-libertas-fix-some-memleaks-in-lbs_allocate_cmd_.patch @@ -0,0 +1,57 @@ +From 1b36a94e2295b430a27add017f061d42d7eea6ec Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 26 Jan 2024 15:53:34 +0800 +Subject: wifi: libertas: fix some memleaks in lbs_allocate_cmd_buffer() + +From: Zhipeng Lu + +[ Upstream commit 5f0e4aede01cb01fa633171f0533affd25328c3a ] + +In the for statement of lbs_allocate_cmd_buffer(), if the allocation of +cmdarray[i].cmdbuf fails, both cmdarray and cmdarray[i].cmdbuf needs to +be freed. Otherwise, there will be memleaks in lbs_allocate_cmd_buffer(). + +Fixes: 876c9d3aeb98 ("[PATCH] Marvell Libertas 8388 802.11b/g USB driver") +Signed-off-by: Zhipeng Lu +Signed-off-by: Kalle Valo +Link: https://msgid.link/20240126075336.2825608-1-alexious@zju.edu.cn +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/marvell/libertas/cmd.c | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/wireless/marvell/libertas/cmd.c b/drivers/net/wireless/marvell/libertas/cmd.c +index a4d9dd73b2588..db9a852fa58a3 100644 +--- a/drivers/net/wireless/marvell/libertas/cmd.c ++++ b/drivers/net/wireless/marvell/libertas/cmd.c +@@ -1133,7 +1133,7 @@ int lbs_allocate_cmd_buffer(struct lbs_private *priv) + if (!cmdarray[i].cmdbuf) { + lbs_deb_host("ALLOC_CMD_BUF: ptempvirtualaddr is NULL\n"); + ret = -1; +- goto done; ++ goto free_cmd_array; + } + } + +@@ -1141,8 +1141,17 @@ int lbs_allocate_cmd_buffer(struct lbs_private *priv) + init_waitqueue_head(&cmdarray[i].cmdwait_q); + lbs_cleanup_and_insert_cmd(priv, &cmdarray[i]); + } +- ret = 0; ++ return 0; + ++free_cmd_array: ++ for (i = 0; i < LBS_NUM_CMD_BUFFERS; i++) { ++ if (cmdarray[i].cmdbuf) { ++ kfree(cmdarray[i].cmdbuf); ++ cmdarray[i].cmdbuf = NULL; ++ } ++ } ++ kfree(priv->cmd_array); ++ priv->cmd_array = NULL; + done: + return ret; + } +-- +2.43.0 + diff --git a/queue-5.4/wifi-mwifiex-debugfs-drop-unnecessary-error-check-fo.patch b/queue-5.4/wifi-mwifiex-debugfs-drop-unnecessary-error-check-fo.patch new file mode 100644 index 00000000000..77157a95b28 --- /dev/null +++ b/queue-5.4/wifi-mwifiex-debugfs-drop-unnecessary-error-check-fo.patch @@ -0,0 +1,46 @@ +From 8816fed9dc547c270b5c17ff708d128027034bba Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 3 Sep 2023 11:02:15 +0800 +Subject: wifi: mwifiex: debugfs: Drop unnecessary error check for + debugfs_create_dir() + +From: Jinjie Ruan + +[ Upstream commit 50180c7f8e3de7c2d87f619131776598fcb1478d ] + +debugfs_create_dir() returns ERR_PTR and never return NULL. + +As Russell suggested, this patch removes the error checking for +debugfs_create_dir(). This is because the DebugFS kernel API is developed +in a way that the caller can safely ignore the errors that occur during +the creation of DebugFS nodes. The debugfs APIs have a IS_ERR() judge in +start_creating() which can handle it gracefully. So these checks are +unnecessary. + +Fixes: 5e6e3a92b9a4 ("wireless: mwifiex: initial commit for Marvell mwifiex driver") +Signed-off-by: Jinjie Ruan +Suggested-by: Russell King (Oracle) +Signed-off-by: Kalle Valo +Link: https://msgid.link/20230903030216.1509013-3-ruanjinjie@huawei.com +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/marvell/mwifiex/debugfs.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/drivers/net/wireless/marvell/mwifiex/debugfs.c b/drivers/net/wireless/marvell/mwifiex/debugfs.c +index e4cb7ce1c8b85..a6f4655b301d6 100644 +--- a/drivers/net/wireless/marvell/mwifiex/debugfs.c ++++ b/drivers/net/wireless/marvell/mwifiex/debugfs.c +@@ -976,9 +976,6 @@ mwifiex_dev_debugfs_init(struct mwifiex_private *priv) + priv->dfs_dev_dir = debugfs_create_dir(priv->netdev->name, + mwifiex_dfs_dir); + +- if (!priv->dfs_dev_dir) +- return; +- + MWIFIEX_DFS_ADD_FILE(info); + MWIFIEX_DFS_ADD_FILE(debug); + MWIFIEX_DFS_ADD_FILE(getlog); +-- +2.43.0 + diff --git a/queue-5.4/wifi-wilc1000-fix-declarations-ordering.patch b/queue-5.4/wifi-wilc1000-fix-declarations-ordering.patch new file mode 100644 index 00000000000..5e728b9e9f7 --- /dev/null +++ b/queue-5.4/wifi-wilc1000-fix-declarations-ordering.patch @@ -0,0 +1,49 @@ +From 0fbb6011141064bffd95321c466ac9b0806f6589 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Jan 2024 08:57:32 +0100 +Subject: wifi: wilc1000: fix declarations ordering +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Alexis Lothoré + +[ Upstream commit 535733e90e5d8912ebeccebb05b354a2d06ff459 ] + +Reorder parameters declaration in wilc_parse_join_bss_param to enforce +reverse christmas tree + +Signed-off-by: Alexis Lothoré +Signed-off-by: Kalle Valo +Link: https://msgid.link/20240105075733.36331-2-alexis.lothore@bootlin.com +Stable-dep-of: 205c50306acf ("wifi: wilc1000: fix RCU usage in connect path") +Signed-off-by: Sasha Levin +--- + drivers/staging/wilc1000/wilc_hif.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/staging/wilc1000/wilc_hif.c b/drivers/staging/wilc1000/wilc_hif.c +index 221e3d93db148..b9c21315a403a 100644 +--- a/drivers/staging/wilc1000/wilc_hif.c ++++ b/drivers/staging/wilc1000/wilc_hif.c +@@ -441,13 +441,13 @@ static void handle_connect_timeout(struct work_struct *work) + void *wilc_parse_join_bss_param(struct cfg80211_bss *bss, + struct cfg80211_crypto_settings *crypto) + { +- struct wilc_join_bss_param *param; +- struct ieee80211_p2p_noa_attr noa_attr; +- u8 rates_len = 0; ++ const struct cfg80211_bss_ies *ies = rcu_dereference(bss->ies); + const u8 *tim_elm, *ssid_elm, *rates_ie, *supp_rates_ie; + const u8 *ht_ie, *wpa_ie, *wmm_ie, *rsn_ie; ++ struct ieee80211_p2p_noa_attr noa_attr; ++ struct wilc_join_bss_param *param; ++ u8 rates_len = 0; + int ret; +- const struct cfg80211_bss_ies *ies = rcu_dereference(bss->ies); + + param = kzalloc(sizeof(*param), GFP_KERNEL); + if (!param) +-- +2.43.0 + diff --git a/queue-5.4/wifi-wilc1000-fix-rcu-usage-in-connect-path.patch b/queue-5.4/wifi-wilc1000-fix-rcu-usage-in-connect-path.patch new file mode 100644 index 00000000000..b44390d483c --- /dev/null +++ b/queue-5.4/wifi-wilc1000-fix-rcu-usage-in-connect-path.patch @@ -0,0 +1,176 @@ +From efd8c702091ba59ec1c31ca1908cc3ccc2a7f8cc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Jan 2024 08:57:33 +0100 +Subject: wifi: wilc1000: fix RCU usage in connect path +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Alexis Lothoré + +[ Upstream commit 205c50306acf58a335eb19fa84e40140f4fe814f ] + +With lockdep enabled, calls to the connect function from cfg802.11 layer +lead to the following warning: + +============================= +WARNING: suspicious RCU usage +6.7.0-rc1-wt+ #333 Not tainted +----------------------------- +drivers/net/wireless/microchip/wilc1000/hif.c:386 +suspicious rcu_dereference_check() usage! +[...] +stack backtrace: +CPU: 0 PID: 100 Comm: wpa_supplicant Not tainted 6.7.0-rc1-wt+ #333 +Hardware name: Atmel SAMA5 + unwind_backtrace from show_stack+0x18/0x1c + show_stack from dump_stack_lvl+0x34/0x48 + dump_stack_lvl from wilc_parse_join_bss_param+0x7dc/0x7f4 + wilc_parse_join_bss_param from connect+0x2c4/0x648 + connect from cfg80211_connect+0x30c/0xb74 + cfg80211_connect from nl80211_connect+0x860/0xa94 + nl80211_connect from genl_rcv_msg+0x3fc/0x59c + genl_rcv_msg from netlink_rcv_skb+0xd0/0x1f8 + netlink_rcv_skb from genl_rcv+0x2c/0x3c + genl_rcv from netlink_unicast+0x3b0/0x550 + netlink_unicast from netlink_sendmsg+0x368/0x688 + netlink_sendmsg from ____sys_sendmsg+0x190/0x430 + ____sys_sendmsg from ___sys_sendmsg+0x110/0x158 + ___sys_sendmsg from sys_sendmsg+0xe8/0x150 + sys_sendmsg from ret_fast_syscall+0x0/0x1c + +This warning is emitted because in the connect path, when trying to parse +target BSS parameters, we dereference a RCU pointer whithout being in RCU +critical section. +Fix RCU dereference usage by moving it to a RCU read critical section. To +avoid wrapping the whole wilc_parse_join_bss_param under the critical +section, just use the critical section to copy ies data + +Fixes: c460495ee072 ("staging: wilc1000: fix incorrent type in initializer") +Signed-off-by: Alexis Lothoré +Signed-off-by: Kalle Valo +Link: https://msgid.link/20240105075733.36331-3-alexis.lothore@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/staging/wilc1000/wilc_hif.c | 36 +++++++++++++++++++---------- + 1 file changed, 24 insertions(+), 12 deletions(-) + +diff --git a/drivers/staging/wilc1000/wilc_hif.c b/drivers/staging/wilc1000/wilc_hif.c +index b9c21315a403a..22e02fd068b4d 100644 +--- a/drivers/staging/wilc1000/wilc_hif.c ++++ b/drivers/staging/wilc1000/wilc_hif.c +@@ -441,38 +441,49 @@ static void handle_connect_timeout(struct work_struct *work) + void *wilc_parse_join_bss_param(struct cfg80211_bss *bss, + struct cfg80211_crypto_settings *crypto) + { +- const struct cfg80211_bss_ies *ies = rcu_dereference(bss->ies); +- const u8 *tim_elm, *ssid_elm, *rates_ie, *supp_rates_ie; ++ const u8 *ies_data, *tim_elm, *ssid_elm, *rates_ie, *supp_rates_ie; + const u8 *ht_ie, *wpa_ie, *wmm_ie, *rsn_ie; + struct ieee80211_p2p_noa_attr noa_attr; ++ const struct cfg80211_bss_ies *ies; + struct wilc_join_bss_param *param; +- u8 rates_len = 0; ++ u8 rates_len = 0, ies_len; + int ret; + + param = kzalloc(sizeof(*param), GFP_KERNEL); + if (!param) + return NULL; + ++ rcu_read_lock(); ++ ies = rcu_dereference(bss->ies); ++ ies_data = kmemdup(ies->data, ies->len, GFP_ATOMIC); ++ if (!ies_data) { ++ rcu_read_unlock(); ++ kfree(param); ++ return NULL; ++ } ++ ies_len = ies->len; ++ rcu_read_unlock(); ++ + param->beacon_period = cpu_to_le16(bss->beacon_interval); + param->cap_info = cpu_to_le16(bss->capability); + param->bss_type = WILC_FW_BSS_TYPE_INFRA; + param->ch = ieee80211_frequency_to_channel(bss->channel->center_freq); + ether_addr_copy(param->bssid, bss->bssid); + +- ssid_elm = cfg80211_find_ie(WLAN_EID_SSID, ies->data, ies->len); ++ ssid_elm = cfg80211_find_ie(WLAN_EID_SSID, ies_data, ies_len); + if (ssid_elm) { + if (ssid_elm[1] <= IEEE80211_MAX_SSID_LEN) + memcpy(param->ssid, ssid_elm + 2, ssid_elm[1]); + } + +- tim_elm = cfg80211_find_ie(WLAN_EID_TIM, ies->data, ies->len); ++ tim_elm = cfg80211_find_ie(WLAN_EID_TIM, ies_data, ies_len); + if (tim_elm && tim_elm[1] >= 2) + param->dtim_period = tim_elm[3]; + + memset(param->p_suites, 0xFF, 3); + memset(param->akm_suites, 0xFF, 3); + +- rates_ie = cfg80211_find_ie(WLAN_EID_SUPP_RATES, ies->data, ies->len); ++ rates_ie = cfg80211_find_ie(WLAN_EID_SUPP_RATES, ies_data, ies_len); + if (rates_ie) { + rates_len = rates_ie[1]; + if (rates_len > WILC_MAX_RATES_SUPPORTED) +@@ -483,7 +494,7 @@ void *wilc_parse_join_bss_param(struct cfg80211_bss *bss, + + if (rates_len < WILC_MAX_RATES_SUPPORTED) { + supp_rates_ie = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, +- ies->data, ies->len); ++ ies_data, ies_len); + if (supp_rates_ie) { + u8 ext_rates = supp_rates_ie[1]; + +@@ -498,11 +509,11 @@ void *wilc_parse_join_bss_param(struct cfg80211_bss *bss, + } + } + +- ht_ie = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, ies->data, ies->len); ++ ht_ie = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, ies_data, ies_len); + if (ht_ie) + param->ht_capable = true; + +- ret = cfg80211_get_p2p_attr(ies->data, ies->len, ++ ret = cfg80211_get_p2p_attr(ies_data, ies_len, + IEEE80211_P2P_ATTR_ABSENCE_NOTICE, + (u8 *)&noa_attr, sizeof(noa_attr)); + if (ret > 0) { +@@ -526,7 +537,7 @@ void *wilc_parse_join_bss_param(struct cfg80211_bss *bss, + } + wmm_ie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, + WLAN_OUI_TYPE_MICROSOFT_WMM, +- ies->data, ies->len); ++ ies_data, ies_len); + if (wmm_ie) { + struct ieee80211_wmm_param_ie *ie; + +@@ -541,13 +552,13 @@ void *wilc_parse_join_bss_param(struct cfg80211_bss *bss, + + wpa_ie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, + WLAN_OUI_TYPE_MICROSOFT_WPA, +- ies->data, ies->len); ++ ies_data, ies_len); + if (wpa_ie) { + param->mode_802_11i = 1; + param->rsn_found = true; + } + +- rsn_ie = cfg80211_find_ie(WLAN_EID_RSN, ies->data, ies->len); ++ rsn_ie = cfg80211_find_ie(WLAN_EID_RSN, ies_data, ies_len); + if (rsn_ie) { + int offset = 8; + +@@ -570,6 +581,7 @@ void *wilc_parse_join_bss_param(struct cfg80211_bss *bss, + param->akm_suites[i] = crypto->akm_suites[i] & 0xFF; + } + ++ kfree(ies_data); + return (void *)param; + } + +-- +2.43.0 + diff --git a/queue-5.4/x86-relocs-ignore-relocations-in-.notes-section.patch b/queue-5.4/x86-relocs-ignore-relocations-in-.notes-section.patch new file mode 100644 index 00000000000..071161c86ad --- /dev/null +++ b/queue-5.4/x86-relocs-ignore-relocations-in-.notes-section.patch @@ -0,0 +1,54 @@ +From 91aa857ccbd1212a23cd80bb45f71715f2db7144 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 27 Feb 2024 09:51:12 -0800 +Subject: x86, relocs: Ignore relocations in .notes section + +From: Kees Cook + +[ Upstream commit aaa8736370db1a78f0e8434344a484f9fd20be3b ] + +When building with CONFIG_XEN_PV=y, .text symbols are emitted into +the .notes section so that Xen can find the "startup_xen" entry point. +This information is used prior to booting the kernel, so relocations +are not useful. In fact, performing relocations against the .notes +section means that the KASLR base is exposed since /sys/kernel/notes +is world-readable. + +To avoid leaking the KASLR base without breaking unprivileged tools that +are expecting to read /sys/kernel/notes, skip performing relocations in +the .notes section. The values readable in .notes are then identical to +those found in System.map. + +Reported-by: Guixiong Wei +Closes: https://lore.kernel.org/all/20240218073501.54555-1-guixiongwei@gmail.com/ +Fixes: 5ead97c84fa7 ("xen: Core Xen implementation") +Fixes: da1a679cde9b ("Add /sys/kernel/notes") +Reviewed-by: Juergen Gross +Signed-off-by: Kees Cook +Signed-off-by: Sasha Levin +--- + arch/x86/tools/relocs.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c +index 1c3a1962cade6..0043fd374a62f 100644 +--- a/arch/x86/tools/relocs.c ++++ b/arch/x86/tools/relocs.c +@@ -596,6 +596,14 @@ static void print_absolute_relocs(void) + if (!(sec_applies->shdr.sh_flags & SHF_ALLOC)) { + continue; + } ++ /* ++ * Do not perform relocations in .notes section; any ++ * values there are meant for pre-boot consumption (e.g. ++ * startup_xen). ++ */ ++ if (sec_applies->shdr.sh_type == SHT_NOTE) { ++ continue; ++ } + sh_symtab = sec_symtab->symtab; + sym_strtab = sec_symtab->link->strtab; + for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Rel); j++) { +-- +2.43.0 +