From: Sasha Levin Date: Tue, 10 Dec 2024 20:35:45 +0000 (-0500) Subject: Fixes for 6.6 X-Git-Tag: v6.6.65~4^2~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=298286a861be109e3170a7524c5c26faf5e4607a;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 6.6 Signed-off-by: Sasha Levin --- diff --git a/queue-6.6/acpi-x86-add-skip-i2c-clients-quirk-for-acer-iconia-.patch b/queue-6.6/acpi-x86-add-skip-i2c-clients-quirk-for-acer-iconia-.patch new file mode 100644 index 00000000000..f737bbaabf7 --- /dev/null +++ b/queue-6.6/acpi-x86-add-skip-i2c-clients-quirk-for-acer-iconia-.patch @@ -0,0 +1,62 @@ +From 799485c2f3c6ea480006751100cf57009f22aab1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 16 Nov 2024 10:58:24 +0100 +Subject: ACPI: x86: Add skip i2c clients quirk for Acer Iconia One 8 A1-840 + +From: Hans de Goede + +[ Upstream commit 82f250ed1a1dcde0ad2a1513f85af7f9514635e8 ] + +The Acer Iconia One 8 A1-840 (not to be confused with the A1-840FHD which +is a different model) ships with Android 4.4 as factory OS and has the +usual broken DSDT issues for x86 Android tablets. + +Add quirks to skip ACPI I2C client enumeration and disable ACPI battery/AC +and ACPI GPIO event handlers. + +Also add the "INT33F5" HID for the TI PMIC used on this tablet to the list +of HIDs for which not to skip i2c_client instantiation, since we do want +an ACPI instantiated i2c_client for the PMIC. + +Signed-off-by: Hans de Goede +Link: https://patch.msgid.link/20241116095825.11660-1-hdegoede@redhat.com +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/x86/utils.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/drivers/acpi/x86/utils.c b/drivers/acpi/x86/utils.c +index 33d200cfc2fe1..5fa37e4fecc55 100644 +--- a/drivers/acpi/x86/utils.c ++++ b/drivers/acpi/x86/utils.c +@@ -300,6 +300,18 @@ static const struct dmi_system_id acpi_quirk_skip_dmi_ids[] = { + ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY | + ACPI_QUIRK_SKIP_GPIO_EVENT_HANDLERS), + }, ++ { ++ /* Acer Iconia One 8 A1-840 (non FHD version) */ ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "BayTrail"), ++ /* Above strings are too generic also match BIOS date */ ++ DMI_MATCH(DMI_BIOS_DATE, "04/01/2014"), ++ }, ++ .driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS | ++ ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY | ++ ACPI_QUIRK_SKIP_GPIO_EVENT_HANDLERS), ++ }, + { + .matches = { + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +@@ -418,6 +430,7 @@ static const struct acpi_device_id i2c_acpi_known_good_ids[] = { + { "10EC5640", 0 }, /* RealTek ALC5640 audio codec */ + { "10EC5651", 0 }, /* RealTek ALC5651 audio codec */ + { "INT33F4", 0 }, /* X-Powers AXP288 PMIC */ ++ { "INT33F5", 0 }, /* TI Dollar Cove PMIC */ + { "INT33FD", 0 }, /* Intel Crystal Cove PMIC */ + { "INT34D3", 0 }, /* Intel Whiskey Cove PMIC */ + { "NPCE69A", 0 }, /* Asus Transformer keyboard dock */ +-- +2.43.0 + diff --git a/queue-6.6/acpi-x86-clean-up-asus-entries-in-acpi_quirk_skip_dm.patch b/queue-6.6/acpi-x86-clean-up-asus-entries-in-acpi_quirk_skip_dm.patch new file mode 100644 index 00000000000..01476c51977 --- /dev/null +++ b/queue-6.6/acpi-x86-clean-up-asus-entries-in-acpi_quirk_skip_dm.patch @@ -0,0 +1,80 @@ +From c5a5a71eef00bdc0d3590175dafcaa4057bf6a17 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 16 Nov 2024 10:58:25 +0100 +Subject: ACPI: x86: Clean up Asus entries in acpi_quirk_skip_dmi_ids[] + +From: Hans de Goede + +[ Upstream commit bd8aa15848f5f21951cd0b0d01510b3ad1f777d4 ] + +The Asus entries in the acpi_quirk_skip_dmi_ids[] table are the only +entries without a comment which model they apply to. Add these comments. + +The Asus TF103C entry also is in the wrong place for what is supposed to +be an alphabetically sorted list. Move it up so that the list is properly +sorted and add a comment that the list is alphabetically sorted. + +Signed-off-by: Hans de Goede +Link: https://patch.msgid.link/20241116095825.11660-2-hdegoede@redhat.com +[ rjw: Changelog and subject edits ] +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/x86/utils.c | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +diff --git a/drivers/acpi/x86/utils.c b/drivers/acpi/x86/utils.c +index 5fa37e4fecc55..fdfc88e09986e 100644 +--- a/drivers/acpi/x86/utils.c ++++ b/drivers/acpi/x86/utils.c +@@ -288,6 +288,7 @@ static const struct dmi_system_id acpi_quirk_skip_dmi_ids[] = { + /* + * 2. Devices which also have the skip i2c/serdev quirks and which + * need the x86-android-tablets module to properly work. ++ * Sorted alphabetically. + */ + #if IS_ENABLED(CONFIG_X86_ANDROID_TABLETS) + { +@@ -313,6 +314,7 @@ static const struct dmi_system_id acpi_quirk_skip_dmi_ids[] = { + ACPI_QUIRK_SKIP_GPIO_EVENT_HANDLERS), + }, + { ++ /* Asus ME176C tablet */ + .matches = { + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "ME176C"), +@@ -323,23 +325,24 @@ static const struct dmi_system_id acpi_quirk_skip_dmi_ids[] = { + ACPI_QUIRK_SKIP_GPIO_EVENT_HANDLERS), + }, + { +- /* Lenovo Yoga Book X90F/L */ ++ /* Asus TF103C transformer 2-in-1 */ + .matches = { +- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Intel Corporation"), +- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "CHERRYVIEW D1 PLATFORM"), +- DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "YETI-11"), ++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), ++ DMI_MATCH(DMI_PRODUCT_NAME, "TF103C"), + }, + .driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS | +- ACPI_QUIRK_UART1_SKIP | + ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY | + ACPI_QUIRK_SKIP_GPIO_EVENT_HANDLERS), + }, + { ++ /* Lenovo Yoga Book X90F/L */ + .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +- DMI_MATCH(DMI_PRODUCT_NAME, "TF103C"), ++ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Intel Corporation"), ++ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "CHERRYVIEW D1 PLATFORM"), ++ DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "YETI-11"), + }, + .driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS | ++ ACPI_QUIRK_UART1_SKIP | + ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY | + ACPI_QUIRK_SKIP_GPIO_EVENT_HANDLERS), + }, +-- +2.43.0 + diff --git a/queue-6.6/acpi-x86-make-uart-skip-quirks-work-on-pci-uarts-wit.patch b/queue-6.6/acpi-x86-make-uart-skip-quirks-work-on-pci-uarts-wit.patch new file mode 100644 index 00000000000..8d736e159d6 --- /dev/null +++ b/queue-6.6/acpi-x86-make-uart-skip-quirks-work-on-pci-uarts-wit.patch @@ -0,0 +1,118 @@ +From 538bad6ac4614fa8310cfa2671d2ebc8ed6bd888 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 9 Nov 2024 22:59:36 +0100 +Subject: ACPI: x86: Make UART skip quirks work on PCI UARTs without an UID + +From: Hans de Goede + +[ Upstream commit 7f261203d7c2e0c06e668b25dfaaee091a79ab25 ] + +The Vexia EDU ATLA 10 tablet (9V version) which shipped with Android 4.2 +as factory OS has the usual broken DSDT issues for x86 Android tablets. + +On top of that this tablet is special because all its LPSS island +peripherals are enumerated as PCI devices rather then as ACPI devices as +they typically are. + +For the x86-android-tablets kmod to be able to instantiate a serdev client +for the Bluetooth HCI on this tablet, an ACPI_QUIRK_UART1_SKIP quirk is +necessary. + +Modify acpi_dmi_skip_serdev_enumeration() to work with PCI enumerated +UARTs without an UID, such as the UARTs on this tablet. + +Also make acpi_dmi_skip_serdev_enumeration() exit early if there are no +quirks, since there is nothing to do then. + +And add the necessary quirks for the Vexia EDU ATLA 10 tablet. + +This should compile with CONFIG_PCI being unset without issues because +dev_is_pci() is defined as "(false)" then. + +Signed-off-by: Hans de Goede +Link: https://patch.msgid.link/20241109215936.83004-1-hdegoede@redhat.com +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/x86/utils.c | 47 +++++++++++++++++++++++++++++++++------- + 1 file changed, 39 insertions(+), 8 deletions(-) + +diff --git a/drivers/acpi/x86/utils.c b/drivers/acpi/x86/utils.c +index e035cec614dc8..33d200cfc2fe1 100644 +--- a/drivers/acpi/x86/utils.c ++++ b/drivers/acpi/x86/utils.c +@@ -12,6 +12,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -384,6 +385,19 @@ static const struct dmi_system_id acpi_quirk_skip_dmi_ids[] = { + .driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS | + ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY), + }, ++ { ++ /* Vexia Edu Atla 10 tablet 9V version */ ++ .matches = { ++ DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"), ++ DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"), ++ /* Above strings are too generic, also match on BIOS date */ ++ DMI_MATCH(DMI_BIOS_DATE, "08/25/2014"), ++ }, ++ .driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS | ++ ACPI_QUIRK_UART1_SKIP | ++ ACPI_QUIRK_SKIP_ACPI_AC_AND_BATTERY | ++ ACPI_QUIRK_SKIP_GPIO_EVENT_HANDLERS), ++ }, + { + /* Whitelabel (sold as various brands) TM800A550L */ + .matches = { +@@ -432,18 +446,35 @@ static int acpi_dmi_skip_serdev_enumeration(struct device *controller_parent, bo + struct acpi_device *adev = ACPI_COMPANION(controller_parent); + const struct dmi_system_id *dmi_id; + long quirks = 0; +- u64 uid; +- int ret; ++ u64 uid = 0; + +- ret = acpi_dev_uid_to_integer(adev, &uid); +- if (ret) ++ dmi_id = dmi_first_match(acpi_quirk_skip_dmi_ids); ++ if (!dmi_id) + return 0; + +- dmi_id = dmi_first_match(acpi_quirk_skip_dmi_ids); +- if (dmi_id) +- quirks = (unsigned long)dmi_id->driver_data; ++ quirks = (unsigned long)dmi_id->driver_data; ++ ++ /* uid is left at 0 on errors and 0 is not a valid UART UID */ ++ acpi_dev_uid_to_integer(adev, &uid); ++ ++ /* For PCI UARTs without an UID */ ++ if (!uid && dev_is_pci(controller_parent)) { ++ struct pci_dev *pdev = to_pci_dev(controller_parent); ++ ++ /* ++ * Devfn values for PCI UARTs on Bay Trail SoCs, which are ++ * the only devices where this fallback is necessary. ++ */ ++ if (pdev->devfn == PCI_DEVFN(0x1e, 3)) ++ uid = 1; ++ else if (pdev->devfn == PCI_DEVFN(0x1e, 4)) ++ uid = 2; ++ } ++ ++ if (!uid) ++ return 0; + +- if (!dev_is_platform(controller_parent)) { ++ if (!dev_is_platform(controller_parent) && !dev_is_pci(controller_parent)) { + /* PNP enumerated UARTs */ + if ((quirks & ACPI_QUIRK_PNP_UART1_SKIP) && uid == 1) + *skip = true; +-- +2.43.0 + diff --git a/queue-6.6/af_packet-avoid-erroring-out-after-sock_init_data-in.patch b/queue-6.6/af_packet-avoid-erroring-out-after-sock_init_data-in.patch new file mode 100644 index 00000000000..e100eab60ba --- /dev/null +++ b/queue-6.6/af_packet-avoid-erroring-out-after-sock_init_data-in.patch @@ -0,0 +1,66 @@ +From 70e64a6b9c952f51b4204885f6de57e0a2d86bb5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Oct 2024 16:38:00 +0100 +Subject: af_packet: avoid erroring out after sock_init_data() in + packet_create() + +From: Ignat Korchagin + +[ Upstream commit 46f2a11cb82b657fd15bab1c47821b635e03838b ] + +After sock_init_data() the allocated sk object is attached to the provided +sock object. On error, packet_create() frees the sk object leaving the +dangling pointer in the sock object on return. Some other code may try +to use this pointer and cause use-after-free. + +Suggested-by: Eric Dumazet +Signed-off-by: Ignat Korchagin +Reviewed-by: Kuniyuki Iwashima +Reviewed-by: Willem de Bruijn +Reviewed-by: Eric Dumazet +Link: https://patch.msgid.link/20241014153808.51894-2-ignat@cloudflare.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/packet/af_packet.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c +index 3e5703537e4eb..56e3ae3b6be93 100644 +--- a/net/packet/af_packet.c ++++ b/net/packet/af_packet.c +@@ -3428,17 +3428,17 @@ static int packet_create(struct net *net, struct socket *sock, int protocol, + if (sock->type == SOCK_PACKET) + sock->ops = &packet_ops_spkt; + ++ po = pkt_sk(sk); ++ err = packet_alloc_pending(po); ++ if (err) ++ goto out_sk_free; ++ + sock_init_data(sock, sk); + +- po = pkt_sk(sk); + init_completion(&po->skb_completion); + sk->sk_family = PF_PACKET; + po->num = proto; + +- err = packet_alloc_pending(po); +- if (err) +- goto out2; +- + packet_cached_dev_reset(po); + + sk->sk_destruct = packet_sock_destruct; +@@ -3470,7 +3470,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol, + sock_prot_inuse_add(net, &packet_proto, 1); + + return 0; +-out2: ++out_sk_free: + sk_free(sk); + out: + return err; +-- +2.43.0 + diff --git a/queue-6.6/alsa-hda-conexant-use-the-new-codec-ssid-matching.patch b/queue-6.6/alsa-hda-conexant-use-the-new-codec-ssid-matching.patch new file mode 100644 index 00000000000..3c3b82d1ec7 --- /dev/null +++ b/queue-6.6/alsa-hda-conexant-use-the-new-codec-ssid-matching.patch @@ -0,0 +1,76 @@ +From 7ac68c4d8b7e3156132e784df39cc19cfd0746fa Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 8 Oct 2024 14:02:30 +0200 +Subject: ALSA: hda/conexant: Use the new codec SSID matching + +From: Takashi Iwai + +[ Upstream commit 1f55e3699fc9ced72400cdca39fe248bf2b288a2 ] + +Now we can perform the codec ID matching primarily, and reduce the +conditional application of the quirk for conflicting PCI SSID between +System76 and Tuxedo devices. + +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20241008120233.7154-3-tiwai@suse.de +Signed-off-by: Sasha Levin +--- + sound/pci/hda/patch_conexant.c | 28 +++++++--------------------- + 1 file changed, 7 insertions(+), 21 deletions(-) + +diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c +index 5cd3589153b6d..b3208b068dd80 100644 +--- a/sound/pci/hda/patch_conexant.c ++++ b/sound/pci/hda/patch_conexant.c +@@ -832,23 +832,6 @@ static const struct hda_pintbl cxt_pincfg_sws_js201d[] = { + {} + }; + +-/* pincfg quirk for Tuxedo Sirius; +- * unfortunately the (PCI) SSID conflicts with System76 Pangolin pang14, +- * which has incompatible pin setup, so we check the codec SSID (luckily +- * different one!) and conditionally apply the quirk here +- */ +-static void cxt_fixup_sirius_top_speaker(struct hda_codec *codec, +- const struct hda_fixup *fix, +- int action) +-{ +- /* ignore for incorrectly picked-up pang14 */ +- if (codec->core.subsystem_id == 0x278212b3) +- return; +- /* set up the top speaker pin */ +- if (action == HDA_FIXUP_ACT_PRE_PROBE) +- snd_hda_codec_set_pincfg(codec, 0x1d, 0x82170111); +-} +- + static const struct hda_fixup cxt_fixups[] = { + [CXT_PINCFG_LENOVO_X200] = { + .type = HDA_FIXUP_PINS, +@@ -1013,8 +996,11 @@ static const struct hda_fixup cxt_fixups[] = { + .v.pins = cxt_pincfg_sws_js201d, + }, + [CXT_PINCFG_TOP_SPEAKER] = { +- .type = HDA_FIXUP_FUNC, +- .v.func = cxt_fixup_sirius_top_speaker, ++ .type = HDA_FIXUP_PINS, ++ .v.pins = (const struct hda_pintbl[]) { ++ { 0x1d, 0x82170111 }, ++ { } ++ }, + }, + }; + +@@ -1113,8 +1099,8 @@ static const struct hda_quirk cxt5066_fixups[] = { + SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", CXT_FIXUP_THINKPAD_ACPI), + SND_PCI_QUIRK(0x1c06, 0x2011, "Lemote A1004", CXT_PINCFG_LEMOTE_A1004), + SND_PCI_QUIRK(0x1c06, 0x2012, "Lemote A1205", CXT_PINCFG_LEMOTE_A1205), +- SND_PCI_QUIRK(0x2782, 0x12c3, "Sirius Gen1", CXT_PINCFG_TOP_SPEAKER), +- SND_PCI_QUIRK(0x2782, 0x12c5, "Sirius Gen2", CXT_PINCFG_TOP_SPEAKER), ++ HDA_CODEC_QUIRK(0x2782, 0x12c3, "Sirius Gen1", CXT_PINCFG_TOP_SPEAKER), ++ HDA_CODEC_QUIRK(0x2782, 0x12c5, "Sirius Gen2", CXT_PINCFG_TOP_SPEAKER), + {} + }; + +-- +2.43.0 + diff --git a/queue-6.6/alsa-hda-use-own-quirk-lookup-helper.patch b/queue-6.6/alsa-hda-use-own-quirk-lookup-helper.patch new file mode 100644 index 00000000000..1055b25a2d5 --- /dev/null +++ b/queue-6.6/alsa-hda-use-own-quirk-lookup-helper.patch @@ -0,0 +1,529 @@ +From 81919d7f64f931e713ef28fca59f71bf1907c5b9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 8 Oct 2024 14:02:29 +0200 +Subject: ALSA: hda: Use own quirk lookup helper + +From: Takashi Iwai + +[ Upstream commit 5b1913a79c3e0518d9c5db343fa9fc4edcea041f ] + +For allowing the primary codec SSID matching (that works around the +conflicting PCI SSID problems), introduce a new struct hda_quirk, +which is compatible with the existing struct snd_pci_quirk along with +new helper functions and macros. + +The existing snd_pci_quirk tables are replaced with hda_quirk tables +accordingly, while keeping SND_PCI_QUIRK() entry definitions as is. + +This patch shouldn't bring any behavior change, just some renaming and +shifting the code. The actual change for the codec SSID matching will +follow after this. + +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20241008120233.7154-2-tiwai@suse.de +Signed-off-by: Sasha Levin +--- + sound/pci/hda/hda_auto_parser.c | 61 +++++++++++++++++++++++------ + sound/pci/hda/hda_local.h | 22 ++++++++++- + sound/pci/hda/patch_analog.c | 6 +-- + sound/pci/hda/patch_cirrus.c | 8 ++-- + sound/pci/hda/patch_conexant.c | 8 ++-- + sound/pci/hda/patch_cs8409-tables.c | 2 +- + sound/pci/hda/patch_cs8409.h | 2 +- + sound/pci/hda/patch_realtek.c | 20 +++++----- + sound/pci/hda/patch_sigmatel.c | 22 +++++------ + sound/pci/hda/patch_via.c | 2 +- + 10 files changed, 106 insertions(+), 47 deletions(-) + +diff --git a/sound/pci/hda/hda_auto_parser.c b/sound/pci/hda/hda_auto_parser.c +index 7c6b1fe8dfcce..8e74be038b0fa 100644 +--- a/sound/pci/hda/hda_auto_parser.c ++++ b/sound/pci/hda/hda_auto_parser.c +@@ -956,6 +956,28 @@ void snd_hda_pick_pin_fixup(struct hda_codec *codec, + } + EXPORT_SYMBOL_GPL(snd_hda_pick_pin_fixup); + ++/* check whether the given quirk entry matches with vendor/device pair */ ++static bool hda_quirk_match(u16 vendor, u16 device, const struct hda_quirk *q) ++{ ++ if (q->subvendor != vendor) ++ return false; ++ return !q->subdevice || ++ (device & q->subdevice_mask) == q->subdevice; ++} ++ ++/* look through the quirk list and return the matching entry */ ++static const struct hda_quirk * ++hda_quirk_lookup_id(u16 vendor, u16 device, const struct hda_quirk *list) ++{ ++ const struct hda_quirk *q; ++ ++ for (q = list; q->subvendor || q->subdevice; q++) { ++ if (hda_quirk_match(vendor, device, q)) ++ return q; ++ } ++ return NULL; ++} ++ + /** + * snd_hda_pick_fixup - Pick up a fixup matching with PCI/codec SSID or model string + * @codec: the HDA codec +@@ -975,14 +997,16 @@ EXPORT_SYMBOL_GPL(snd_hda_pick_pin_fixup); + */ + void snd_hda_pick_fixup(struct hda_codec *codec, + const struct hda_model_fixup *models, +- const struct snd_pci_quirk *quirk, ++ const struct hda_quirk *quirk, + const struct hda_fixup *fixlist) + { +- const struct snd_pci_quirk *q; ++ const struct hda_quirk *q; + int id = HDA_FIXUP_ID_NOT_SET; + const char *name = NULL; + const char *type = NULL; + unsigned int vendor, device; ++ u16 pci_vendor, pci_device; ++ u16 codec_vendor, codec_device; + + if (codec->fixup_id != HDA_FIXUP_ID_NOT_SET) + return; +@@ -1013,27 +1037,42 @@ void snd_hda_pick_fixup(struct hda_codec *codec, + if (!quirk) + return; + ++ if (codec->bus->pci) { ++ pci_vendor = codec->bus->pci->subsystem_vendor; ++ pci_device = codec->bus->pci->subsystem_device; ++ } ++ ++ codec_vendor = codec->core.subsystem_id >> 16; ++ codec_device = codec->core.subsystem_id & 0xffff; ++ + /* match with the SSID alias given by the model string "XXXX:YYYY" */ + if (codec->modelname && + sscanf(codec->modelname, "%04x:%04x", &vendor, &device) == 2) { +- q = snd_pci_quirk_lookup_id(vendor, device, quirk); ++ q = hda_quirk_lookup_id(vendor, device, quirk); + if (q) { + type = "alias SSID"; + goto found_device; + } + } + +- /* match with the PCI SSID */ +- q = snd_pci_quirk_lookup(codec->bus->pci, quirk); +- if (q) { +- type = "PCI SSID"; +- goto found_device; ++ /* match primarily with the PCI SSID */ ++ for (q = quirk; q->subvendor || q->subdevice; q++) { ++ /* if the entry is specific to codec SSID, check with it */ ++ if (!codec->bus->pci || q->match_codec_ssid) { ++ if (hda_quirk_match(codec_vendor, codec_device, q)) { ++ type = "codec SSID"; ++ goto found_device; ++ } ++ } else { ++ if (hda_quirk_match(pci_vendor, pci_device, q)) { ++ type = "PCI SSID"; ++ goto found_device; ++ } ++ } + } + + /* match with the codec SSID */ +- q = snd_pci_quirk_lookup_id(codec->core.subsystem_id >> 16, +- codec->core.subsystem_id & 0xffff, +- quirk); ++ q = hda_quirk_lookup_id(codec_vendor, codec_device, quirk); + if (q) { + type = "codec SSID"; + goto found_device; +diff --git a/sound/pci/hda/hda_local.h b/sound/pci/hda/hda_local.h +index 53a5a62b78fa9..b7d926e9eb947 100644 +--- a/sound/pci/hda/hda_local.h ++++ b/sound/pci/hda/hda_local.h +@@ -292,6 +292,26 @@ struct hda_fixup { + } v; + }; + ++/* ++ * extended form of snd_pci_quirk: ++ * for PCI SSID matching, use SND_PCI_QUIRK() like before; ++ * for codec SSID matching, use the new HDA_CODEC_QUIRK() instead ++ */ ++struct hda_quirk { ++ unsigned short subvendor; /* PCI subvendor ID */ ++ unsigned short subdevice; /* PCI subdevice ID */ ++ unsigned short subdevice_mask; /* bitmask to match */ ++ bool match_codec_ssid; /* match only with codec SSID */ ++ int value; /* value */ ++#ifdef CONFIG_SND_DEBUG_VERBOSE ++ const char *name; /* name of the device (optional) */ ++#endif ++}; ++ ++#define HDA_CODEC_QUIRK(vend, dev, xname, val) \ ++ { _SND_PCI_QUIRK_ID(vend, dev), .value = (val), .name = (xname),\ ++ .match_codec_ssid = true } ++ + struct snd_hda_pin_quirk { + unsigned int codec; /* Codec vendor/device ID */ + unsigned short subvendor; /* PCI subvendor ID */ +@@ -351,7 +371,7 @@ void snd_hda_apply_fixup(struct hda_codec *codec, int action); + void __snd_hda_apply_fixup(struct hda_codec *codec, int id, int action, int depth); + void snd_hda_pick_fixup(struct hda_codec *codec, + const struct hda_model_fixup *models, +- const struct snd_pci_quirk *quirk, ++ const struct hda_quirk *quirk, + const struct hda_fixup *fixlist); + void snd_hda_pick_pin_fixup(struct hda_codec *codec, + const struct snd_hda_pin_quirk *pin_quirk, +diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c +index 8afe6000f7dad..8d6ca73a8f582 100644 +--- a/sound/pci/hda/patch_analog.c ++++ b/sound/pci/hda/patch_analog.c +@@ -349,7 +349,7 @@ static const struct hda_fixup ad1986a_fixups[] = { + }, + }; + +-static const struct snd_pci_quirk ad1986a_fixup_tbl[] = { ++static const struct hda_quirk ad1986a_fixup_tbl[] = { + SND_PCI_QUIRK(0x103c, 0x30af, "HP B2800", AD1986A_FIXUP_LAPTOP_IMIC), + SND_PCI_QUIRK(0x1043, 0x1153, "ASUS M9V", AD1986A_FIXUP_LAPTOP_IMIC), + SND_PCI_QUIRK(0x1043, 0x1443, "ASUS Z99He", AD1986A_FIXUP_EAPD), +@@ -592,7 +592,7 @@ static const struct hda_fixup ad1981_fixups[] = { + }, + }; + +-static const struct snd_pci_quirk ad1981_fixup_tbl[] = { ++static const struct hda_quirk ad1981_fixup_tbl[] = { + SND_PCI_QUIRK_VENDOR(0x1014, "Lenovo", AD1981_FIXUP_AMP_OVERRIDE), + SND_PCI_QUIRK_VENDOR(0x103c, "HP", AD1981_FIXUP_HP_EAPD), + SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", AD1981_FIXUP_AMP_OVERRIDE), +@@ -1065,7 +1065,7 @@ static const struct hda_fixup ad1884_fixups[] = { + }, + }; + +-static const struct snd_pci_quirk ad1884_fixup_tbl[] = { ++static const struct hda_quirk ad1884_fixup_tbl[] = { + SND_PCI_QUIRK(0x103c, 0x2a82, "HP Touchsmart", AD1884_FIXUP_HP_TOUCHSMART), + SND_PCI_QUIRK_VENDOR(0x103c, "HP", AD1884_FIXUP_HP_EAPD), + SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1884_FIXUP_THINKPAD), +diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c +index 6807b4708a176..9b472c7fd4cf8 100644 +--- a/sound/pci/hda/patch_cirrus.c ++++ b/sound/pci/hda/patch_cirrus.c +@@ -385,7 +385,7 @@ static const struct hda_model_fixup cs420x_models[] = { + {} + }; + +-static const struct snd_pci_quirk cs420x_fixup_tbl[] = { ++static const struct hda_quirk cs420x_fixup_tbl[] = { + SND_PCI_QUIRK(0x10de, 0x0ac0, "MacBookPro 5,3", CS420X_MBP53), + SND_PCI_QUIRK(0x10de, 0x0d94, "MacBookAir 3,1(2)", CS420X_MBP55), + SND_PCI_QUIRK(0x10de, 0xcb79, "MacBookPro 5,5", CS420X_MBP55), +@@ -634,13 +634,13 @@ static const struct hda_model_fixup cs4208_models[] = { + {} + }; + +-static const struct snd_pci_quirk cs4208_fixup_tbl[] = { ++static const struct hda_quirk cs4208_fixup_tbl[] = { + SND_PCI_QUIRK_VENDOR(0x106b, "Apple", CS4208_MAC_AUTO), + {} /* terminator */ + }; + + /* codec SSID matching */ +-static const struct snd_pci_quirk cs4208_mac_fixup_tbl[] = { ++static const struct hda_quirk cs4208_mac_fixup_tbl[] = { + SND_PCI_QUIRK(0x106b, 0x5e00, "MacBookPro 11,2", CS4208_MBP11), + SND_PCI_QUIRK(0x106b, 0x6c00, "MacMini 7,1", CS4208_MACMINI), + SND_PCI_QUIRK(0x106b, 0x7100, "MacBookAir 6,1", CS4208_MBA6), +@@ -818,7 +818,7 @@ static const struct hda_model_fixup cs421x_models[] = { + {} + }; + +-static const struct snd_pci_quirk cs421x_fixup_tbl[] = { ++static const struct hda_quirk cs421x_fixup_tbl[] = { + /* Test Intel board + CDB2410 */ + SND_PCI_QUIRK(0x8086, 0x5001, "DP45SG/CDB4210", CS421X_CDB4210), + {} /* terminator */ +diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c +index a14b9cb48f69a..5cd3589153b6d 100644 +--- a/sound/pci/hda/patch_conexant.c ++++ b/sound/pci/hda/patch_conexant.c +@@ -1018,7 +1018,7 @@ static const struct hda_fixup cxt_fixups[] = { + }, + }; + +-static const struct snd_pci_quirk cxt5045_fixups[] = { ++static const struct hda_quirk cxt5045_fixups[] = { + SND_PCI_QUIRK(0x103c, 0x30d5, "HP 530", CXT_FIXUP_HP_530), + SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba P105", CXT_FIXUP_TOSHIBA_P105), + /* HP, Packard Bell, Fujitsu-Siemens & Lenovo laptops have +@@ -1038,7 +1038,7 @@ static const struct hda_model_fixup cxt5045_fixup_models[] = { + {} + }; + +-static const struct snd_pci_quirk cxt5047_fixups[] = { ++static const struct hda_quirk cxt5047_fixups[] = { + /* HP laptops have really bad sound over 0 dB on NID 0x10. + */ + SND_PCI_QUIRK_VENDOR(0x103c, "HP", CXT_FIXUP_CAP_MIX_AMP_5047), +@@ -1050,7 +1050,7 @@ static const struct hda_model_fixup cxt5047_fixup_models[] = { + {} + }; + +-static const struct snd_pci_quirk cxt5051_fixups[] = { ++static const struct hda_quirk cxt5051_fixups[] = { + SND_PCI_QUIRK(0x103c, 0x360b, "Compaq CQ60", CXT_PINCFG_COMPAQ_CQ60), + SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo X200", CXT_PINCFG_LENOVO_X200), + {} +@@ -1061,7 +1061,7 @@ static const struct hda_model_fixup cxt5051_fixup_models[] = { + {} + }; + +-static const struct snd_pci_quirk cxt5066_fixups[] = { ++static const struct hda_quirk cxt5066_fixups[] = { + SND_PCI_QUIRK(0x1025, 0x0543, "Acer Aspire One 522", CXT_FIXUP_STEREO_DMIC), + SND_PCI_QUIRK(0x1025, 0x054c, "Acer Aspire 3830TG", CXT_FIXUP_ASPIRE_DMIC), + SND_PCI_QUIRK(0x1025, 0x054f, "Acer Aspire 4830T", CXT_FIXUP_ASPIRE_DMIC), +diff --git a/sound/pci/hda/patch_cs8409-tables.c b/sound/pci/hda/patch_cs8409-tables.c +index 36b411d1a9609..759f48038273d 100644 +--- a/sound/pci/hda/patch_cs8409-tables.c ++++ b/sound/pci/hda/patch_cs8409-tables.c +@@ -473,7 +473,7 @@ struct sub_codec dolphin_cs42l42_1 = { + * Arrays Used for all projects using CS8409 + ******************************************************************************/ + +-const struct snd_pci_quirk cs8409_fixup_tbl[] = { ++const struct hda_quirk cs8409_fixup_tbl[] = { + SND_PCI_QUIRK(0x1028, 0x0A11, "Bullseye", CS8409_BULLSEYE), + SND_PCI_QUIRK(0x1028, 0x0A12, "Bullseye", CS8409_BULLSEYE), + SND_PCI_QUIRK(0x1028, 0x0A23, "Bullseye", CS8409_BULLSEYE), +diff --git a/sound/pci/hda/patch_cs8409.h b/sound/pci/hda/patch_cs8409.h +index 937e9387abdc7..5e48115caf096 100644 +--- a/sound/pci/hda/patch_cs8409.h ++++ b/sound/pci/hda/patch_cs8409.h +@@ -355,7 +355,7 @@ int cs42l42_volume_put(struct snd_kcontrol *kctrl, struct snd_ctl_elem_value *uc + + extern const struct hda_pcm_stream cs42l42_48k_pcm_analog_playback; + extern const struct hda_pcm_stream cs42l42_48k_pcm_analog_capture; +-extern const struct snd_pci_quirk cs8409_fixup_tbl[]; ++extern const struct hda_quirk cs8409_fixup_tbl[]; + extern const struct hda_model_fixup cs8409_models[]; + extern const struct hda_fixup cs8409_fixups[]; + extern const struct hda_verb cs8409_cs42l42_init_verbs[]; +diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c +index f4e773662c109..d61c317b49ead 100644 +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -1556,7 +1556,7 @@ static const struct hda_fixup alc880_fixups[] = { + }, + }; + +-static const struct snd_pci_quirk alc880_fixup_tbl[] = { ++static const struct hda_quirk alc880_fixup_tbl[] = { + SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810), + SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A), + SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V), +@@ -1865,7 +1865,7 @@ static const struct hda_fixup alc260_fixups[] = { + }, + }; + +-static const struct snd_pci_quirk alc260_fixup_tbl[] = { ++static const struct hda_quirk alc260_fixup_tbl[] = { + SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1), + SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF), + SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1), +@@ -2557,7 +2557,7 @@ static const struct hda_fixup alc882_fixups[] = { + }, + }; + +-static const struct snd_pci_quirk alc882_fixup_tbl[] = { ++static const struct hda_quirk alc882_fixup_tbl[] = { + SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD), + SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD), + SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD), +@@ -2901,7 +2901,7 @@ static const struct hda_fixup alc262_fixups[] = { + }, + }; + +-static const struct snd_pci_quirk alc262_fixup_tbl[] = { ++static const struct hda_quirk alc262_fixup_tbl[] = { + SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200), + SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110), + SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ), +@@ -3062,7 +3062,7 @@ static const struct hda_model_fixup alc268_fixup_models[] = { + {} + }; + +-static const struct snd_pci_quirk alc268_fixup_tbl[] = { ++static const struct hda_quirk alc268_fixup_tbl[] = { + SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF), + SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC), + /* below is codec SSID since multiple Toshiba laptops have the +@@ -9687,7 +9687,7 @@ static const struct hda_fixup alc269_fixups[] = { + }, + }; + +-static const struct snd_pci_quirk alc269_fixup_tbl[] = { ++static const struct hda_quirk alc269_fixup_tbl[] = { + SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC), + SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC), + SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC), +@@ -10488,7 +10488,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { + {} + }; + +-static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = { ++static const struct hda_quirk alc269_fixup_vendor_tbl[] = { + SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC), + SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED), + SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), +@@ -11416,7 +11416,7 @@ static const struct hda_fixup alc861_fixups[] = { + } + }; + +-static const struct snd_pci_quirk alc861_fixup_tbl[] = { ++static const struct hda_quirk alc861_fixup_tbl[] = { + SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J), + SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J), + SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP), +@@ -11522,7 +11522,7 @@ static const struct hda_fixup alc861vd_fixups[] = { + }, + }; + +-static const struct snd_pci_quirk alc861vd_fixup_tbl[] = { ++static const struct hda_quirk alc861vd_fixup_tbl[] = { + SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS), + SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1), + SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS), +@@ -12323,7 +12323,7 @@ static const struct hda_fixup alc662_fixups[] = { + }, + }; + +-static const struct snd_pci_quirk alc662_fixup_tbl[] = { ++static const struct hda_quirk alc662_fixup_tbl[] = { + SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2), + SND_PCI_QUIRK(0x1019, 0x9859, "JP-IK LEAP W502", ALC897_FIXUP_HEADSET_MIC_PIN3), + SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC), +diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c +index 61258b0aac8d6..9650569715457 100644 +--- a/sound/pci/hda/patch_sigmatel.c ++++ b/sound/pci/hda/patch_sigmatel.c +@@ -1462,7 +1462,7 @@ static const struct hda_model_fixup stac9200_models[] = { + {} + }; + +-static const struct snd_pci_quirk stac9200_fixup_tbl[] = { ++static const struct hda_quirk stac9200_fixup_tbl[] = { + /* SigmaTel reference board */ + SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, + "DFI LanParty", STAC_REF), +@@ -1683,7 +1683,7 @@ static const struct hda_model_fixup stac925x_models[] = { + {} + }; + +-static const struct snd_pci_quirk stac925x_fixup_tbl[] = { ++static const struct hda_quirk stac925x_fixup_tbl[] = { + /* SigmaTel reference board */ + SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF), + SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, "DFI LanParty", STAC_REF), +@@ -1957,7 +1957,7 @@ static const struct hda_model_fixup stac92hd73xx_models[] = { + {} + }; + +-static const struct snd_pci_quirk stac92hd73xx_fixup_tbl[] = { ++static const struct hda_quirk stac92hd73xx_fixup_tbl[] = { + /* SigmaTel reference board */ + SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, + "DFI LanParty", STAC_92HD73XX_REF), +@@ -2755,7 +2755,7 @@ static const struct hda_model_fixup stac92hd83xxx_models[] = { + {} + }; + +-static const struct snd_pci_quirk stac92hd83xxx_fixup_tbl[] = { ++static const struct hda_quirk stac92hd83xxx_fixup_tbl[] = { + /* SigmaTel reference board */ + SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, + "DFI LanParty", STAC_92HD83XXX_REF), +@@ -3238,7 +3238,7 @@ static const struct hda_model_fixup stac92hd71bxx_models[] = { + {} + }; + +-static const struct snd_pci_quirk stac92hd71bxx_fixup_tbl[] = { ++static const struct hda_quirk stac92hd71bxx_fixup_tbl[] = { + /* SigmaTel reference board */ + SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, + "DFI LanParty", STAC_92HD71BXX_REF), +@@ -3498,7 +3498,7 @@ static const struct hda_pintbl ecs202_pin_configs[] = { + }; + + /* codec SSIDs for Intel Mac sharing the same PCI SSID 8384:7680 */ +-static const struct snd_pci_quirk stac922x_intel_mac_fixup_tbl[] = { ++static const struct hda_quirk stac922x_intel_mac_fixup_tbl[] = { + SND_PCI_QUIRK(0x0000, 0x0100, "Mac Mini", STAC_INTEL_MAC_V3), + SND_PCI_QUIRK(0x106b, 0x0800, "Mac", STAC_INTEL_MAC_V1), + SND_PCI_QUIRK(0x106b, 0x0600, "Mac", STAC_INTEL_MAC_V2), +@@ -3642,7 +3642,7 @@ static const struct hda_model_fixup stac922x_models[] = { + {} + }; + +-static const struct snd_pci_quirk stac922x_fixup_tbl[] = { ++static const struct hda_quirk stac922x_fixup_tbl[] = { + /* SigmaTel reference board */ + SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, + "DFI LanParty", STAC_D945_REF), +@@ -3970,7 +3970,7 @@ static const struct hda_model_fixup stac927x_models[] = { + {} + }; + +-static const struct snd_pci_quirk stac927x_fixup_tbl[] = { ++static const struct hda_quirk stac927x_fixup_tbl[] = { + /* SigmaTel reference board */ + SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, + "DFI LanParty", STAC_D965_REF), +@@ -4180,7 +4180,7 @@ static const struct hda_model_fixup stac9205_models[] = { + {} + }; + +-static const struct snd_pci_quirk stac9205_fixup_tbl[] = { ++static const struct hda_quirk stac9205_fixup_tbl[] = { + /* SigmaTel reference board */ + SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, + "DFI LanParty", STAC_9205_REF), +@@ -4257,7 +4257,7 @@ static const struct hda_fixup stac92hd95_fixups[] = { + }, + }; + +-static const struct snd_pci_quirk stac92hd95_fixup_tbl[] = { ++static const struct hda_quirk stac92hd95_fixup_tbl[] = { + SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1911, "HP Spectre 13", STAC_92HD95_HP_BASS), + {} /* terminator */ + }; +@@ -5010,7 +5010,7 @@ static const struct hda_fixup stac9872_fixups[] = { + }, + }; + +-static const struct snd_pci_quirk stac9872_fixup_tbl[] = { ++static const struct hda_quirk stac9872_fixup_tbl[] = { + SND_PCI_QUIRK_MASK(0x104d, 0xfff0, 0x81e0, + "Sony VAIO F/S", STAC_9872_VAIO), + {} /* terminator */ +diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c +index 2994f85bc1b9a..bbd521859a3af 100644 +--- a/sound/pci/hda/patch_via.c ++++ b/sound/pci/hda/patch_via.c +@@ -1041,7 +1041,7 @@ static const struct hda_fixup via_fixups[] = { + }, + }; + +-static const struct snd_pci_quirk vt2002p_fixups[] = { ++static const struct hda_quirk vt2002p_fixups[] = { + SND_PCI_QUIRK(0x1043, 0x13f7, "Asus B23E", VIA_FIXUP_POWER_SAVE), + SND_PCI_QUIRK(0x1043, 0x1487, "Asus G75", VIA_FIXUP_ASUS_G75), + SND_PCI_QUIRK(0x1043, 0x8532, "Asus X202E", VIA_FIXUP_INTMIC_BOOST), +-- +2.43.0 + diff --git a/queue-6.6/alsa-usb-audio-make-mic-volume-workarounds-globally-.patch b/queue-6.6/alsa-usb-audio-make-mic-volume-workarounds-globally-.patch new file mode 100644 index 00000000000..ed619b2140c --- /dev/null +++ b/queue-6.6/alsa-usb-audio-make-mic-volume-workarounds-globally-.patch @@ -0,0 +1,197 @@ +From abded196a7df8a37326f7976272dcdde85090275 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Nov 2024 13:02:18 +0100 +Subject: ALSA: usb-audio: Make mic volume workarounds globally applicable + +From: Takashi Iwai + +[ Upstream commit d6e6b9218ced5249b9136833ef5ec3f554ec7fde ] + +It seems that many webcams have buggy firmware and don't expose the +mic capture volume with the proper resolution. We have workarounds in +mixer.c, but judging from the numbers, those can be better managed as +global quirk flags. + +Link: https://patch.msgid.link/20241105120220.5740-2-tiwai@suse.de +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + sound/usb/mixer.c | 58 ++++++++++++-------------------------------- + sound/usb/quirks.c | 31 +++++++++++++++++++---- + sound/usb/usbaudio.h | 4 +++ + 3 files changed, 45 insertions(+), 48 deletions(-) + +diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c +index 22b206595a4f1..b8fa0a866153b 100644 +--- a/sound/usb/mixer.c ++++ b/sound/usb/mixer.c +@@ -1084,6 +1084,21 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval, + struct snd_kcontrol *kctl) + { + struct snd_usb_audio *chip = cval->head.mixer->chip; ++ ++ if (chip->quirk_flags & QUIRK_FLAG_MIC_RES_384) { ++ if (!strcmp(kctl->id.name, "Mic Capture Volume")) { ++ usb_audio_info(chip, ++ "set resolution quirk: cval->res = 384\n"); ++ cval->res = 384; ++ } ++ } else if (chip->quirk_flags & QUIRK_FLAG_MIC_RES_16) { ++ if (!strcmp(kctl->id.name, "Mic Capture Volume")) { ++ usb_audio_info(chip, ++ "set resolution quirk: cval->res = 16\n"); ++ cval->res = 16; ++ } ++ } ++ + switch (chip->usb_id) { + case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */ + case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C600 */ +@@ -1168,27 +1183,6 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval, + } + break; + +- case USB_ID(0x046d, 0x0807): /* Logitech Webcam C500 */ +- case USB_ID(0x046d, 0x0808): +- case USB_ID(0x046d, 0x0809): +- case USB_ID(0x046d, 0x0819): /* Logitech Webcam C210 */ +- case USB_ID(0x046d, 0x081b): /* HD Webcam c310 */ +- case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */ +- case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */ +- case USB_ID(0x046d, 0x0826): /* HD Webcam c525 */ +- case USB_ID(0x046d, 0x08ca): /* Logitech Quickcam Fusion */ +- case USB_ID(0x046d, 0x0991): +- case USB_ID(0x046d, 0x09a2): /* QuickCam Communicate Deluxe/S7500 */ +- /* Most audio usb devices lie about volume resolution. +- * Most Logitech webcams have res = 384. +- * Probably there is some logitech magic behind this number --fishor +- */ +- if (!strcmp(kctl->id.name, "Mic Capture Volume")) { +- usb_audio_info(chip, +- "set resolution quirk: cval->res = 384\n"); +- cval->res = 384; +- } +- break; + case USB_ID(0x0495, 0x3042): /* ESS Technology Asus USB DAC */ + if ((strstr(kctl->id.name, "Playback Volume") != NULL) || + strstr(kctl->id.name, "Capture Volume") != NULL) { +@@ -1197,28 +1191,6 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval, + cval->res = 1; + } + break; +- case USB_ID(0x1224, 0x2a25): /* Jieli Technology USB PHY 2.0 */ +- if (!strcmp(kctl->id.name, "Mic Capture Volume")) { +- usb_audio_info(chip, +- "set resolution quirk: cval->res = 16\n"); +- cval->res = 16; +- } +- break; +- case USB_ID(0x1bcf, 0x2283): /* NexiGo N930AF FHD Webcam */ +- case USB_ID(0x03f0, 0x654a): /* HP 320 FHD Webcam */ +- if (!strcmp(kctl->id.name, "Mic Capture Volume")) { +- usb_audio_info(chip, +- "set resolution quirk: cval->res = 16\n"); +- cval->res = 16; +- } +- break; +- case USB_ID(0x1bcf, 0x2281): /* HD Webcam */ +- if (!strcmp(kctl->id.name, "Mic Capture Volume")) { +- usb_audio_info(chip, +- "set resolution quirk: cval->res = 16\n"); +- cval->res = 16; +- } +- break; + } + } + +diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c +index 30a4d2deefdab..65c44649c067a 100644 +--- a/sound/usb/quirks.c ++++ b/sound/usb/quirks.c +@@ -2032,7 +2032,7 @@ struct usb_audio_quirk_flags_table { + static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { + /* Device matches */ + DEVICE_FLG(0x03f0, 0x654a, /* HP 320 FHD Webcam */ +- QUIRK_FLAG_GET_SAMPLE_RATE), ++ QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16), + DEVICE_FLG(0x041e, 0x3000, /* Creative SB Extigy */ + QUIRK_FLAG_IGNORE_CTL_ERROR), + DEVICE_FLG(0x041e, 0x4080, /* Creative Live Cam VF0610 */ +@@ -2040,10 +2040,31 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { + DEVICE_FLG(0x045e, 0x083c, /* MS USB Link headset */ + QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_CTL_MSG_DELAY | + QUIRK_FLAG_DISABLE_AUTOSUSPEND), ++ DEVICE_FLG(0x046d, 0x0807, /* Logitech Webcam C500 */ ++ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384), ++ DEVICE_FLG(0x046d, 0x0808, /* Logitech Webcam C600 */ ++ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384), ++ DEVICE_FLG(0x046d, 0x0809, ++ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384), ++ DEVICE_FLG(0x046d, 0x0819, /* Logitech Webcam C210 */ ++ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384), ++ DEVICE_FLG(0x046d, 0x081b, /* HD Webcam c310 */ ++ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384), ++ DEVICE_FLG(0x046d, 0x081d, /* HD Webcam c510 */ ++ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384), ++ DEVICE_FLG(0x046d, 0x0825, /* HD Webcam c270 */ ++ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384), ++ DEVICE_FLG(0x046d, 0x0826, /* HD Webcam c525 */ ++ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384), + DEVICE_FLG(0x046d, 0x084c, /* Logitech ConferenceCam Connect */ + QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_CTL_MSG_DELAY_1M), ++ DEVICE_FLG(0x046d, 0x08ca, /* Logitech Quickcam Fusion */ ++ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384), + DEVICE_FLG(0x046d, 0x0991, /* Logitech QuickCam Pro */ +- QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_IGNORE_CTL_ERROR), ++ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_IGNORE_CTL_ERROR | ++ QUIRK_FLAG_MIC_RES_384), ++ DEVICE_FLG(0x046d, 0x09a2, /* QuickCam Communicate Deluxe/S7500 */ ++ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384), + DEVICE_FLG(0x046d, 0x09a4, /* Logitech QuickCam E 3500 */ + QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_IGNORE_CTL_ERROR), + DEVICE_FLG(0x0499, 0x1509, /* Steinberg UR22 */ +@@ -2111,7 +2132,7 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { + DEVICE_FLG(0x0fd9, 0x0008, /* Hauppauge HVR-950Q */ + QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER), + DEVICE_FLG(0x1224, 0x2a25, /* Jieli Technology USB PHY 2.0 */ +- QUIRK_FLAG_GET_SAMPLE_RATE), ++ QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16), + DEVICE_FLG(0x1395, 0x740a, /* Sennheiser DECT */ + QUIRK_FLAG_GET_SAMPLE_RATE), + DEVICE_FLG(0x1397, 0x0507, /* Behringer UMC202HD */ +@@ -2149,9 +2170,9 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { + DEVICE_FLG(0x19f7, 0x0035, /* RODE NT-USB+ */ + QUIRK_FLAG_GET_SAMPLE_RATE), + DEVICE_FLG(0x1bcf, 0x2281, /* HD Webcam */ +- QUIRK_FLAG_GET_SAMPLE_RATE), ++ QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16), + DEVICE_FLG(0x1bcf, 0x2283, /* NexiGo N930AF FHD Webcam */ +- QUIRK_FLAG_GET_SAMPLE_RATE), ++ QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16), + DEVICE_FLG(0x2040, 0x7200, /* Hauppauge HVR-950Q */ + QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER), + DEVICE_FLG(0x2040, 0x7201, /* Hauppauge HVR-950Q-MXL */ +diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h +index 43d4029edab46..ddfbe045e7a94 100644 +--- a/sound/usb/usbaudio.h ++++ b/sound/usb/usbaudio.h +@@ -182,6 +182,8 @@ extern bool snd_usb_skip_validation; + * QUIRK_FLAG_FIXED_RATE + * Do not set PCM rate (frequency) when only one rate is available + * for the given endpoint. ++ * QUIRK_FLAG_MIC_RES_16 and QUIRK_FLAG_MIC_RES_384 ++ * Set the fixed resolution for Mic Capture Volume (mostly for webcams) + */ + + #define QUIRK_FLAG_GET_SAMPLE_RATE (1U << 0) +@@ -206,5 +208,7 @@ extern bool snd_usb_skip_validation; + #define QUIRK_FLAG_IFACE_SKIP_CLOSE (1U << 19) + #define QUIRK_FLAG_FORCE_IFACE_RESET (1U << 20) + #define QUIRK_FLAG_FIXED_RATE (1U << 21) ++#define QUIRK_FLAG_MIC_RES_16 (1U << 22) ++#define QUIRK_FLAG_MIC_RES_384 (1U << 23) + + #endif /* __USBAUDIO_H */ +-- +2.43.0 + diff --git a/queue-6.6/asoc-amd-yc-add-quirk-for-microphone-on-lenovo-think.patch b/queue-6.6/asoc-amd-yc-add-quirk-for-microphone-on-lenovo-think.patch new file mode 100644 index 00000000000..a0d7feb741f --- /dev/null +++ b/queue-6.6/asoc-amd-yc-add-quirk-for-microphone-on-lenovo-think.patch @@ -0,0 +1,46 @@ +From c2d937ed517f88e0561629a4dd0c4a712acfa6d0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Nov 2024 08:56:05 +0100 +Subject: ASoC: amd: yc: Add quirk for microphone on Lenovo Thinkpad T14s Gen 6 + 21M1CTO1WW +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ Upstream commit cbc86dd0a4fe9f8c41075328c2e740b68419d639 ] + +Add a quirk for Tova's Lenovo Thinkpad T14s with product name 21M1. + +Suggested-by: Tova +Link: https://bugs.debian.org/1087673 +Signed-off-by: Uwe Kleine-König +Link: https://patch.msgid.link/20241122075606.213132-2-ukleinek@debian.org +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/amd/yc/acp6x-mach.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/sound/soc/amd/yc/acp6x-mach.c b/sound/soc/amd/yc/acp6x-mach.c +index 8a99ba5394b4a..39f151d073a6c 100644 +--- a/sound/soc/amd/yc/acp6x-mach.c ++++ b/sound/soc/amd/yc/acp6x-mach.c +@@ -220,6 +220,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "21J6"), + } + }, ++ { ++ .driver_data = &acp6x_card, ++ .matches = { ++ DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "21M1"), ++ } ++ }, + { + .driver_data = &acp6x_card, + .matches = { +-- +2.43.0 + diff --git a/queue-6.6/asoc-amd-yc-fix-internal-mic-on-redmi-g-2022.patch b/queue-6.6/asoc-amd-yc-fix-internal-mic-on-redmi-g-2022.patch new file mode 100644 index 00000000000..24d30c94da0 --- /dev/null +++ b/queue-6.6/asoc-amd-yc-fix-internal-mic-on-redmi-g-2022.patch @@ -0,0 +1,41 @@ +From a3bf83b2e688916ab73c9626b0223ed7d61e1d46 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 16 Nov 2024 21:58:45 +0300 +Subject: ASoC: amd: yc: fix internal mic on Redmi G 2022 + +From: Alex Far + +[ Upstream commit 67a0463d339059eeeead9cd015afa594659cfdaf ] + +This laptop model requires an additional detection quirk to enable the +internal microphone + +Signed-off-by: Alex Far +Link: https://patch.msgid.link/ZzjrZY3sImcqTtGx@RedmiG +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/amd/yc/acp6x-mach.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/sound/soc/amd/yc/acp6x-mach.c b/sound/soc/amd/yc/acp6x-mach.c +index a00933df9168a..8a99ba5394b4a 100644 +--- a/sound/soc/amd/yc/acp6x-mach.c ++++ b/sound/soc/amd/yc/acp6x-mach.c +@@ -416,6 +416,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "Xiaomi Book Pro 14 2022"), + } + }, ++ { ++ .driver_data = &acp6x_card, ++ .matches = { ++ DMI_MATCH(DMI_BOARD_VENDOR, "TIMI"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "Redmi G 2022"), ++ } ++ }, + { + .driver_data = &acp6x_card, + .matches = { +-- +2.43.0 + diff --git a/queue-6.6/asoc-hdmi-codec-reorder-channel-allocation-list.patch b/queue-6.6/asoc-hdmi-codec-reorder-channel-allocation-list.patch new file mode 100644 index 00000000000..1792d084f10 --- /dev/null +++ b/queue-6.6/asoc-hdmi-codec-reorder-channel-allocation-list.patch @@ -0,0 +1,210 @@ +From a138a68dcb6d7c403bbff98e41689ebba441ab5e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Nov 2024 04:43:44 +0000 +Subject: ASoC: hdmi-codec: reorder channel allocation list + +From: Jonas Karlman + +[ Upstream commit 82ff5abc2edcfba0c0f1a1be807795e2876f46e9 ] + +The ordering in hdmi_codec_get_ch_alloc_table_idx() results in +wrong channel allocation for a number of cases, e.g. when ELD +reports FL|FR|LFE|FC|RL|RR or FL|FR|LFE|FC|RL|RR|RC|RLC|RRC: + +ca_id 0x01 with speaker mask FL|FR|LFE is selected instead of +ca_id 0x03 with speaker mask FL|FR|LFE|FC for 4 channels + +and + +ca_id 0x04 with speaker mask FL|FR|RC gets selected instead of +ca_id 0x0b with speaker mask FL|FR|LFE|FC|RL|RR for 6 channels + +Fix this by reordering the channel allocation list with most +specific speaker masks at the top. + +Signed-off-by: Jonas Karlman +Signed-off-by: Christian Hewitt +Link: https://patch.msgid.link/20241115044344.3510979-1-christianshewitt@gmail.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/hdmi-codec.c | 140 +++++++++++++++++++--------------- + 1 file changed, 77 insertions(+), 63 deletions(-) + +diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c +index 0938671700c62..03290d3ae59cc 100644 +--- a/sound/soc/codecs/hdmi-codec.c ++++ b/sound/soc/codecs/hdmi-codec.c +@@ -184,84 +184,97 @@ static const struct snd_pcm_chmap_elem hdmi_codec_8ch_chmaps[] = { + /* + * hdmi_codec_channel_alloc: speaker configuration available for CEA + * +- * This is an ordered list that must match with hdmi_codec_8ch_chmaps struct ++ * This is an ordered list where ca_id must exist in hdmi_codec_8ch_chmaps + * The preceding ones have better chances to be selected by + * hdmi_codec_get_ch_alloc_table_idx(). + */ + static const struct hdmi_codec_cea_spk_alloc hdmi_codec_channel_alloc[] = { + { .ca_id = 0x00, .n_ch = 2, +- .mask = FL | FR}, +- /* 2.1 */ +- { .ca_id = 0x01, .n_ch = 4, +- .mask = FL | FR | LFE}, +- /* Dolby Surround */ ++ .mask = FL | FR }, ++ { .ca_id = 0x03, .n_ch = 4, ++ .mask = FL | FR | LFE | FC }, + { .ca_id = 0x02, .n_ch = 4, + .mask = FL | FR | FC }, +- /* surround51 */ ++ { .ca_id = 0x01, .n_ch = 4, ++ .mask = FL | FR | LFE }, + { .ca_id = 0x0b, .n_ch = 6, +- .mask = FL | FR | LFE | FC | RL | RR}, +- /* surround40 */ +- { .ca_id = 0x08, .n_ch = 6, +- .mask = FL | FR | RL | RR }, +- /* surround41 */ +- { .ca_id = 0x09, .n_ch = 6, +- .mask = FL | FR | LFE | RL | RR }, +- /* surround50 */ ++ .mask = FL | FR | LFE | FC | RL | RR }, + { .ca_id = 0x0a, .n_ch = 6, + .mask = FL | FR | FC | RL | RR }, +- /* 6.1 */ +- { .ca_id = 0x0f, .n_ch = 8, +- .mask = FL | FR | LFE | FC | RL | RR | RC }, +- /* surround71 */ ++ { .ca_id = 0x09, .n_ch = 6, ++ .mask = FL | FR | LFE | RL | RR }, ++ { .ca_id = 0x08, .n_ch = 6, ++ .mask = FL | FR | RL | RR }, ++ { .ca_id = 0x07, .n_ch = 6, ++ .mask = FL | FR | LFE | FC | RC }, ++ { .ca_id = 0x06, .n_ch = 6, ++ .mask = FL | FR | FC | RC }, ++ { .ca_id = 0x05, .n_ch = 6, ++ .mask = FL | FR | LFE | RC }, ++ { .ca_id = 0x04, .n_ch = 6, ++ .mask = FL | FR | RC }, + { .ca_id = 0x13, .n_ch = 8, + .mask = FL | FR | LFE | FC | RL | RR | RLC | RRC }, +- /* others */ +- { .ca_id = 0x03, .n_ch = 8, +- .mask = FL | FR | LFE | FC }, +- { .ca_id = 0x04, .n_ch = 8, +- .mask = FL | FR | RC}, +- { .ca_id = 0x05, .n_ch = 8, +- .mask = FL | FR | LFE | RC }, +- { .ca_id = 0x06, .n_ch = 8, +- .mask = FL | FR | FC | RC }, +- { .ca_id = 0x07, .n_ch = 8, +- .mask = FL | FR | LFE | FC | RC }, +- { .ca_id = 0x0c, .n_ch = 8, +- .mask = FL | FR | RC | RL | RR }, +- { .ca_id = 0x0d, .n_ch = 8, +- .mask = FL | FR | LFE | RL | RR | RC }, +- { .ca_id = 0x0e, .n_ch = 8, +- .mask = FL | FR | FC | RL | RR | RC }, +- { .ca_id = 0x10, .n_ch = 8, +- .mask = FL | FR | RL | RR | RLC | RRC }, +- { .ca_id = 0x11, .n_ch = 8, +- .mask = FL | FR | LFE | RL | RR | RLC | RRC }, ++ { .ca_id = 0x1f, .n_ch = 8, ++ .mask = FL | FR | LFE | FC | RL | RR | FLC | FRC }, + { .ca_id = 0x12, .n_ch = 8, + .mask = FL | FR | FC | RL | RR | RLC | RRC }, +- { .ca_id = 0x14, .n_ch = 8, +- .mask = FL | FR | FLC | FRC }, +- { .ca_id = 0x15, .n_ch = 8, +- .mask = FL | FR | LFE | FLC | FRC }, +- { .ca_id = 0x16, .n_ch = 8, +- .mask = FL | FR | FC | FLC | FRC }, +- { .ca_id = 0x17, .n_ch = 8, +- .mask = FL | FR | LFE | FC | FLC | FRC }, +- { .ca_id = 0x18, .n_ch = 8, +- .mask = FL | FR | RC | FLC | FRC }, +- { .ca_id = 0x19, .n_ch = 8, +- .mask = FL | FR | LFE | RC | FLC | FRC }, +- { .ca_id = 0x1a, .n_ch = 8, +- .mask = FL | FR | RC | FC | FLC | FRC }, +- { .ca_id = 0x1b, .n_ch = 8, +- .mask = FL | FR | LFE | RC | FC | FLC | FRC }, +- { .ca_id = 0x1c, .n_ch = 8, +- .mask = FL | FR | RL | RR | FLC | FRC }, +- { .ca_id = 0x1d, .n_ch = 8, +- .mask = FL | FR | LFE | RL | RR | FLC | FRC }, + { .ca_id = 0x1e, .n_ch = 8, + .mask = FL | FR | FC | RL | RR | FLC | FRC }, +- { .ca_id = 0x1f, .n_ch = 8, +- .mask = FL | FR | LFE | FC | RL | RR | FLC | FRC }, ++ { .ca_id = 0x11, .n_ch = 8, ++ .mask = FL | FR | LFE | RL | RR | RLC | RRC }, ++ { .ca_id = 0x1d, .n_ch = 8, ++ .mask = FL | FR | LFE | RL | RR | FLC | FRC }, ++ { .ca_id = 0x10, .n_ch = 8, ++ .mask = FL | FR | RL | RR | RLC | RRC }, ++ { .ca_id = 0x1c, .n_ch = 8, ++ .mask = FL | FR | RL | RR | FLC | FRC }, ++ { .ca_id = 0x0f, .n_ch = 8, ++ .mask = FL | FR | LFE | FC | RL | RR | RC }, ++ { .ca_id = 0x1b, .n_ch = 8, ++ .mask = FL | FR | LFE | RC | FC | FLC | FRC }, ++ { .ca_id = 0x0e, .n_ch = 8, ++ .mask = FL | FR | FC | RL | RR | RC }, ++ { .ca_id = 0x1a, .n_ch = 8, ++ .mask = FL | FR | RC | FC | FLC | FRC }, ++ { .ca_id = 0x0d, .n_ch = 8, ++ .mask = FL | FR | LFE | RL | RR | RC }, ++ { .ca_id = 0x19, .n_ch = 8, ++ .mask = FL | FR | LFE | RC | FLC | FRC }, ++ { .ca_id = 0x0c, .n_ch = 8, ++ .mask = FL | FR | RC | RL | RR }, ++ { .ca_id = 0x18, .n_ch = 8, ++ .mask = FL | FR | RC | FLC | FRC }, ++ { .ca_id = 0x17, .n_ch = 8, ++ .mask = FL | FR | LFE | FC | FLC | FRC }, ++ { .ca_id = 0x16, .n_ch = 8, ++ .mask = FL | FR | FC | FLC | FRC }, ++ { .ca_id = 0x15, .n_ch = 8, ++ .mask = FL | FR | LFE | FLC | FRC }, ++ { .ca_id = 0x14, .n_ch = 8, ++ .mask = FL | FR | FLC | FRC }, ++ { .ca_id = 0x0b, .n_ch = 8, ++ .mask = FL | FR | LFE | FC | RL | RR }, ++ { .ca_id = 0x0a, .n_ch = 8, ++ .mask = FL | FR | FC | RL | RR }, ++ { .ca_id = 0x09, .n_ch = 8, ++ .mask = FL | FR | LFE | RL | RR }, ++ { .ca_id = 0x08, .n_ch = 8, ++ .mask = FL | FR | RL | RR }, ++ { .ca_id = 0x07, .n_ch = 8, ++ .mask = FL | FR | LFE | FC | RC }, ++ { .ca_id = 0x06, .n_ch = 8, ++ .mask = FL | FR | FC | RC }, ++ { .ca_id = 0x05, .n_ch = 8, ++ .mask = FL | FR | LFE | RC }, ++ { .ca_id = 0x04, .n_ch = 8, ++ .mask = FL | FR | RC }, ++ { .ca_id = 0x03, .n_ch = 8, ++ .mask = FL | FR | LFE | FC }, ++ { .ca_id = 0x02, .n_ch = 8, ++ .mask = FL | FR | FC }, ++ { .ca_id = 0x01, .n_ch = 8, ++ .mask = FL | FR | LFE }, + }; + + struct hdmi_codec_priv { +@@ -370,7 +383,8 @@ static int hdmi_codec_chmap_ctl_get(struct snd_kcontrol *kcontrol, + struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol); + struct hdmi_codec_priv *hcp = info->private_data; + +- map = info->chmap[hcp->chmap_idx].map; ++ if (hcp->chmap_idx != HDMI_CODEC_CHMAP_IDX_UNKNOWN) ++ map = info->chmap[hcp->chmap_idx].map; + + for (i = 0; i < info->max_channels; i++) { + if (hcp->chmap_idx == HDMI_CODEC_CHMAP_IDX_UNKNOWN) +-- +2.43.0 + diff --git a/queue-6.6/bluetooth-add-new-quirks-for-ats2851.patch b/queue-6.6/bluetooth-add-new-quirks-for-ats2851.patch new file mode 100644 index 00000000000..89489d52a06 --- /dev/null +++ b/queue-6.6/bluetooth-add-new-quirks-for-ats2851.patch @@ -0,0 +1,76 @@ +From 523f94bc280b91564dd6684460989caeb3af0a4b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 21 Oct 2024 12:22:44 +0000 +Subject: Bluetooth: Add new quirks for ATS2851 + +From: Danil Pylaev + +[ Upstream commit 94464a7b71634037b13d54021e0dfd0fb0d8c1f0 ] + +This adds quirks for broken extended create connection, +and write auth payload timeout. + +Signed-off-by: Danil Pylaev +Signed-off-by: Luiz Augusto von Dentz +Signed-off-by: Sasha Levin +--- + include/net/bluetooth/hci.h | 14 ++++++++++++++ + include/net/bluetooth/hci_core.h | 10 ++++++---- + 2 files changed, 20 insertions(+), 4 deletions(-) + +diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h +index 2129d071c3725..77a3040a3f29d 100644 +--- a/include/net/bluetooth/hci.h ++++ b/include/net/bluetooth/hci.h +@@ -297,6 +297,20 @@ enum { + */ + HCI_QUIRK_BROKEN_SET_RPA_TIMEOUT, + ++ /* ++ * When this quirk is set, the HCI_OP_LE_EXT_CREATE_CONN command is ++ * disabled. This is required for the Actions Semiconductor ATS2851 ++ * based controllers, which erroneously claims to support it. ++ */ ++ HCI_QUIRK_BROKEN_EXT_CREATE_CONN, ++ ++ /* ++ * When this quirk is set, the command WRITE_AUTH_PAYLOAD_TIMEOUT is ++ * skipped. This is required for the Actions Semiconductor ATS2851 ++ * based controllers, due to a race condition in pairing process. ++ */ ++ HCI_QUIRK_BROKEN_WRITE_AUTH_PAYLOAD_TIMEOUT, ++ + /* When this quirk is set, MSFT extension monitor tracking by + * address filter is supported. Since tracking quantity of each + * pattern is limited, this feature supports tracking multiple +diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h +index 0f50c0cefcb7d..4185eb679180d 100644 +--- a/include/net/bluetooth/hci_core.h ++++ b/include/net/bluetooth/hci_core.h +@@ -1852,8 +1852,8 @@ void hci_conn_del_sysfs(struct hci_conn *conn); + !test_bit(HCI_QUIRK_BROKEN_EXT_SCAN, &(dev)->quirks)) + + /* Use ext create connection if command is supported */ +-#define use_ext_conn(dev) ((dev)->commands[37] & 0x80) +- ++#define use_ext_conn(dev) (((dev)->commands[37] & 0x80) && \ ++ !test_bit(HCI_QUIRK_BROKEN_EXT_CREATE_CONN, &(dev)->quirks)) + /* Extended advertising support */ + #define ext_adv_capable(dev) (((dev)->le_features[1] & HCI_LE_EXT_ADV)) + +@@ -1866,8 +1866,10 @@ void hci_conn_del_sysfs(struct hci_conn *conn); + * C24: Mandatory if the LE Controller supports Connection State and either + * LE Feature (LL Privacy) or LE Feature (Extended Advertising) is supported + */ +-#define use_enhanced_conn_complete(dev) (ll_privacy_capable(dev) || \ +- ext_adv_capable(dev)) ++#define use_enhanced_conn_complete(dev) ((ll_privacy_capable(dev) || \ ++ ext_adv_capable(dev)) && \ ++ !test_bit(HCI_QUIRK_BROKEN_EXT_CREATE_CONN, \ ++ &(dev)->quirks)) + + /* Periodic advertising support */ + #define per_adv_capable(dev) (((dev)->le_features[1] & HCI_LE_PERIODIC_ADV)) +-- +2.43.0 + diff --git a/queue-6.6/bluetooth-btusb-add-rtl8852be-device-0489-e123-to-de.patch b/queue-6.6/bluetooth-btusb-add-rtl8852be-device-0489-e123-to-de.patch new file mode 100644 index 00000000000..bcd2d06c306 --- /dev/null +++ b/queue-6.6/bluetooth-btusb-add-rtl8852be-device-0489-e123-to-de.patch @@ -0,0 +1,67 @@ +From 019207dff73c2117dae2996d5f8d54a3096e7f1d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 1 Oct 2024 16:37:29 +0800 +Subject: Bluetooth: btusb: Add RTL8852BE device 0489:e123 to device tables + +From: Hilda Wu + +[ Upstream commit 69b84ffce260ff13826dc10aeb3c3e5c2288a552 ] + +Add the support ID 0489:e123 to usb_device_id table for +Realtek RTL8852B chip. + +The device info from /sys/kernel/debug/usb/devices as below. + +T: Bus=01 Lev=01 Prnt=01 Port=07 Cnt=04 Dev#= 7 Spd=12 MxCh= 0 +D: Ver= 1.00 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 +P: Vendor=0489 ProdID=e123 Rev= 0.00 +S: Manufacturer=Realtek +S: Product=Bluetooth Radio +S: SerialNumber=00e04c000001 +C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=500mA +I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=1ms +E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms +E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms +I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms +E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms +I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms +E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms +I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms +E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms +I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms +E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms +I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms +E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms +I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms +E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms + +Signed-off-by: Hilda Wu +Signed-off-by: Luiz Augusto von Dentz +Signed-off-by: Sasha Levin +--- + drivers/bluetooth/btusb.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index b3a9b93f027a9..326ef250bab94 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -555,6 +555,8 @@ static const struct usb_device_id quirks_table[] = { + BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x13d3, 0x3591), .driver_info = BTUSB_REALTEK | + BTUSB_WIDEBAND_SPEECH }, ++ { USB_DEVICE(0x0489, 0xe123), .driver_info = BTUSB_REALTEK | ++ BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x0489, 0xe125), .driver_info = BTUSB_REALTEK | + BTUSB_WIDEBAND_SPEECH }, + +-- +2.43.0 + diff --git a/queue-6.6/bluetooth-hci_core-fix-not-checking-skb-length-on-hc.patch b/queue-6.6/bluetooth-hci_core-fix-not-checking-skb-length-on-hc.patch new file mode 100644 index 00000000000..b07c3f63905 --- /dev/null +++ b/queue-6.6/bluetooth-hci_core-fix-not-checking-skb-length-on-hc.patch @@ -0,0 +1,65 @@ +From 559d18b0cc04d305353dae21693a03b37d772a7c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 8 Oct 2024 10:16:48 -0400 +Subject: Bluetooth: hci_core: Fix not checking skb length on + hci_acldata_packet + +From: Luiz Augusto von Dentz + +[ Upstream commit 3fe288a8214e7dd784d1f9b7c9e448244d316b47 ] + +This fixes not checking if skb really contains an ACL header otherwise +the code may attempt to access some uninitilized/invalid memory past the +valid skb->data. + +Reported-by: syzbot+6ea290ba76d8c1eb1ac2@syzkaller.appspotmail.com +Tested-by: syzbot+6ea290ba76d8c1eb1ac2@syzkaller.appspotmail.com +Closes: https://syzkaller.appspot.com/bug?extid=6ea290ba76d8c1eb1ac2 +Signed-off-by: Luiz Augusto von Dentz +Signed-off-by: Sasha Levin +--- + net/bluetooth/hci_core.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c +index 3cf4dd9cad8a3..30519d47e8a69 100644 +--- a/net/bluetooth/hci_core.c ++++ b/net/bluetooth/hci_core.c +@@ -3735,18 +3735,22 @@ static void hci_tx_work(struct work_struct *work) + /* ACL data packet */ + static void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb) + { +- struct hci_acl_hdr *hdr = (void *) skb->data; ++ struct hci_acl_hdr *hdr; + struct hci_conn *conn; + __u16 handle, flags; + +- skb_pull(skb, HCI_ACL_HDR_SIZE); ++ hdr = skb_pull_data(skb, sizeof(*hdr)); ++ if (!hdr) { ++ bt_dev_err(hdev, "ACL packet too small"); ++ goto drop; ++ } + + handle = __le16_to_cpu(hdr->handle); + flags = hci_flags(handle); + handle = hci_handle(handle); + +- BT_DBG("%s len %d handle 0x%4.4x flags 0x%4.4x", hdev->name, skb->len, +- handle, flags); ++ bt_dev_dbg(hdev, "len %d handle 0x%4.4x flags 0x%4.4x", skb->len, ++ handle, flags); + + hdev->stat.acl_rx++; + +@@ -3765,6 +3769,7 @@ static void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb) + handle); + } + ++drop: + kfree_skb(skb); + } + +-- +2.43.0 + diff --git a/queue-6.6/bluetooth-l2cap-do-not-leave-dangling-sk-pointer-on-.patch b/queue-6.6/bluetooth-l2cap-do-not-leave-dangling-sk-pointer-on-.patch new file mode 100644 index 00000000000..8a3949a46f1 --- /dev/null +++ b/queue-6.6/bluetooth-l2cap-do-not-leave-dangling-sk-pointer-on-.patch @@ -0,0 +1,40 @@ +From ecf040bc0a5dfff6e9db1ea79ca6885ada698efc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Oct 2024 16:38:01 +0100 +Subject: Bluetooth: L2CAP: do not leave dangling sk pointer on error in + l2cap_sock_create() + +From: Ignat Korchagin + +[ Upstream commit 7c4f78cdb8e7501e9f92d291a7d956591bf73be9 ] + +bt_sock_alloc() allocates the sk object and attaches it to the provided +sock object. On error l2cap_sock_alloc() frees the sk object, but the +dangling pointer is still attached to the sock object, which may create +use-after-free in other code. + +Signed-off-by: Ignat Korchagin +Reviewed-by: Kuniyuki Iwashima +Reviewed-by: Eric Dumazet +Link: https://patch.msgid.link/20241014153808.51894-3-ignat@cloudflare.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/bluetooth/l2cap_sock.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c +index f04ce84267988..379ca86c41cd5 100644 +--- a/net/bluetooth/l2cap_sock.c ++++ b/net/bluetooth/l2cap_sock.c +@@ -1885,6 +1885,7 @@ static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, + chan = l2cap_chan_create(); + if (!chan) { + sk_free(sk); ++ sock->sk = NULL; + return NULL; + } + +-- +2.43.0 + diff --git a/queue-6.6/bluetooth-rfcomm-avoid-leaving-dangling-sk-pointer-i.patch b/queue-6.6/bluetooth-rfcomm-avoid-leaving-dangling-sk-pointer-i.patch new file mode 100644 index 00000000000..880cf39874a --- /dev/null +++ b/queue-6.6/bluetooth-rfcomm-avoid-leaving-dangling-sk-pointer-i.patch @@ -0,0 +1,52 @@ +From 4850a9b8121c710635e6140b0189c6106ad81c32 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Oct 2024 16:38:02 +0100 +Subject: Bluetooth: RFCOMM: avoid leaving dangling sk pointer in + rfcomm_sock_alloc() + +From: Ignat Korchagin + +[ Upstream commit 3945c799f12b8d1f49a3b48369ca494d981ac465 ] + +bt_sock_alloc() attaches allocated sk object to the provided sock object. +If rfcomm_dlc_alloc() fails, we release the sk object, but leave the +dangling pointer in the sock object, which may cause use-after-free. + +Fix this by swapping calls to bt_sock_alloc() and rfcomm_dlc_alloc(). + +Signed-off-by: Ignat Korchagin +Reviewed-by: Kuniyuki Iwashima +Reviewed-by: Eric Dumazet +Link: https://patch.msgid.link/20241014153808.51894-4-ignat@cloudflare.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/bluetooth/rfcomm/sock.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c +index 4fae82fedccaf..1cf6543bdec55 100644 +--- a/net/bluetooth/rfcomm/sock.c ++++ b/net/bluetooth/rfcomm/sock.c +@@ -274,13 +274,13 @@ static struct sock *rfcomm_sock_alloc(struct net *net, struct socket *sock, + struct rfcomm_dlc *d; + struct sock *sk; + +- sk = bt_sock_alloc(net, sock, &rfcomm_proto, proto, prio, kern); +- if (!sk) ++ d = rfcomm_dlc_alloc(prio); ++ if (!d) + return NULL; + +- d = rfcomm_dlc_alloc(prio); +- if (!d) { +- sk_free(sk); ++ sk = bt_sock_alloc(net, sock, &rfcomm_proto, proto, prio, kern); ++ if (!sk) { ++ rfcomm_dlc_free(d); + return NULL; + } + +-- +2.43.0 + diff --git a/queue-6.6/bluetooth-set-quirks-for-ats2851.patch b/queue-6.6/bluetooth-set-quirks-for-ats2851.patch new file mode 100644 index 00000000000..e76b5fe170d --- /dev/null +++ b/queue-6.6/bluetooth-set-quirks-for-ats2851.patch @@ -0,0 +1,34 @@ +From 09d8d310a0999e4bfe25f1067fadd929209c6d03 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 21 Oct 2024 12:22:46 +0000 +Subject: Bluetooth: Set quirks for ATS2851 + +From: Danil Pylaev + +[ Upstream commit 677a55ba11a82c2835550a82324cec5fcb2f9e2d ] + +This adds quirks for broken ats2851 features. + +Signed-off-by: Danil Pylaev +Signed-off-by: Luiz Augusto von Dentz +Signed-off-by: Sasha Levin +--- + drivers/bluetooth/btusb.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index 326ef250bab94..fe5e30662017d 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -4490,6 +4490,8 @@ static int btusb_probe(struct usb_interface *intf, + set_bit(HCI_QUIRK_BROKEN_SET_RPA_TIMEOUT, &hdev->quirks); + set_bit(HCI_QUIRK_BROKEN_EXT_SCAN, &hdev->quirks); + set_bit(HCI_QUIRK_BROKEN_READ_ENC_KEY_SIZE, &hdev->quirks); ++ set_bit(HCI_QUIRK_BROKEN_EXT_CREATE_CONN, &hdev->quirks); ++ set_bit(HCI_QUIRK_BROKEN_WRITE_AUTH_PAYLOAD_TIMEOUT, &hdev->quirks); + } + + if (!reset) +-- +2.43.0 + diff --git a/queue-6.6/bluetooth-support-new-quirks-for-ats2851.patch b/queue-6.6/bluetooth-support-new-quirks-for-ats2851.patch new file mode 100644 index 00000000000..56cbe64a071 --- /dev/null +++ b/queue-6.6/bluetooth-support-new-quirks-for-ats2851.patch @@ -0,0 +1,68 @@ +From f5407f25847d575ecd4c2a32c1c4249ef002a877 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 21 Oct 2024 12:22:45 +0000 +Subject: Bluetooth: Support new quirks for ATS2851 + +From: Danil Pylaev + +[ Upstream commit 5bd3135924b4570dcecc8793f7771cb8d42d8b19 ] + +This adds support for quirks for broken extended create connection, +and write auth payload timeout. + +Signed-off-by: Danil Pylaev +Signed-off-by: Luiz Augusto von Dentz +Signed-off-by: Sasha Levin +--- + net/bluetooth/hci_event.c | 7 +++++++ + net/bluetooth/hci_sync.c | 9 ++++++++- + 2 files changed, 15 insertions(+), 1 deletion(-) + +diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c +index da056cca3edbc..141b4fce55e35 100644 +--- a/net/bluetooth/hci_event.c ++++ b/net/bluetooth/hci_event.c +@@ -3627,6 +3627,13 @@ static void hci_encrypt_change_evt(struct hci_dev *hdev, void *data, + goto unlock; + } + ++ /* We skip the WRITE_AUTH_PAYLOAD_TIMEOUT for ATS2851 based controllers ++ * to avoid unexpected SMP command errors when pairing. ++ */ ++ if (test_bit(HCI_QUIRK_BROKEN_WRITE_AUTH_PAYLOAD_TIMEOUT, ++ &hdev->quirks)) ++ goto notify; ++ + /* Set the default Authenticated Payload Timeout after + * an LE Link is established. As per Core Spec v5.0, Vol 2, Part B + * Section 3.3, the HCI command WRITE_AUTH_PAYLOAD_TIMEOUT should be +diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c +index c553b637cda7f..d95e2b55badb4 100644 +--- a/net/bluetooth/hci_sync.c ++++ b/net/bluetooth/hci_sync.c +@@ -4853,6 +4853,13 @@ static const struct { + HCI_QUIRK_BROKEN(SET_RPA_TIMEOUT, + "HCI LE Set Random Private Address Timeout command is " + "advertised, but not supported."), ++ HCI_QUIRK_BROKEN(EXT_CREATE_CONN, ++ "HCI LE Extended Create Connection command is " ++ "advertised, but not supported."), ++ HCI_QUIRK_BROKEN(WRITE_AUTH_PAYLOAD_TIMEOUT, ++ "HCI WRITE AUTH PAYLOAD TIMEOUT command leads " ++ "to unexpected SMP errors when pairing " ++ "and will not be used."), + HCI_QUIRK_BROKEN(LE_CODED, + "HCI LE Coded PHY feature bit is set, " + "but its usage is not supported.") +@@ -6485,7 +6492,7 @@ static int hci_le_create_conn_sync(struct hci_dev *hdev, void *data) + &own_addr_type); + if (err) + goto done; +- ++ /* Send command LE Extended Create Connection if supported */ + if (use_ext_conn(hdev)) { + err = hci_le_ext_create_conn_sync(hdev, conn, own_addr_type); + goto done; +-- +2.43.0 + diff --git a/queue-6.6/bpf-call-free_htab_elem-after-htab_unlock_bucket.patch b/queue-6.6/bpf-call-free_htab_elem-after-htab_unlock_bucket.patch new file mode 100644 index 00000000000..7a3592fe307 --- /dev/null +++ b/queue-6.6/bpf-call-free_htab_elem-after-htab_unlock_bucket.patch @@ -0,0 +1,244 @@ +From 7eeba1f92fc27cae660231aa1eb16faec6577460 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 6 Nov 2024 14:35:40 +0800 +Subject: bpf: Call free_htab_elem() after htab_unlock_bucket() + +From: Hou Tao + +[ Upstream commit b9e9ed90b10c82a4e9d4d70a2890f06bfcdd3b78 ] + +For htab of maps, when the map is removed from the htab, it may hold the +last reference of the map. bpf_map_fd_put_ptr() will invoke +bpf_map_free_id() to free the id of the removed map element. However, +bpf_map_fd_put_ptr() is invoked while holding a bucket lock +(raw_spin_lock_t), and bpf_map_free_id() attempts to acquire map_idr_lock +(spinlock_t), triggering the following lockdep warning: + + ============================= + [ BUG: Invalid wait context ] + 6.11.0-rc4+ #49 Not tainted + ----------------------------- + test_maps/4881 is trying to lock: + ffffffff84884578 (map_idr_lock){+...}-{3:3}, at: bpf_map_free_id.part.0+0x21/0x70 + other info that might help us debug this: + context-{5:5} + 2 locks held by test_maps/4881: + #0: ffffffff846caf60 (rcu_read_lock){....}-{1:3}, at: bpf_fd_htab_map_update_elem+0xf9/0x270 + #1: ffff888149ced148 (&htab->lockdep_key#2){....}-{2:2}, at: htab_map_update_elem+0x178/0xa80 + stack backtrace: + CPU: 0 UID: 0 PID: 4881 Comm: test_maps Not tainted 6.11.0-rc4+ #49 + Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), ... + Call Trace: + + dump_stack_lvl+0x6e/0xb0 + dump_stack+0x10/0x20 + __lock_acquire+0x73e/0x36c0 + lock_acquire+0x182/0x450 + _raw_spin_lock_irqsave+0x43/0x70 + bpf_map_free_id.part.0+0x21/0x70 + bpf_map_put+0xcf/0x110 + bpf_map_fd_put_ptr+0x9a/0xb0 + free_htab_elem+0x69/0xe0 + htab_map_update_elem+0x50f/0xa80 + bpf_fd_htab_map_update_elem+0x131/0x270 + htab_map_update_elem+0x50f/0xa80 + bpf_fd_htab_map_update_elem+0x131/0x270 + bpf_map_update_value+0x266/0x380 + __sys_bpf+0x21bb/0x36b0 + __x64_sys_bpf+0x45/0x60 + x64_sys_call+0x1b2a/0x20d0 + do_syscall_64+0x5d/0x100 + entry_SYSCALL_64_after_hwframe+0x76/0x7e + +One way to fix the lockdep warning is using raw_spinlock_t for +map_idr_lock as well. However, bpf_map_alloc_id() invokes +idr_alloc_cyclic() after acquiring map_idr_lock, it will trigger a +similar lockdep warning because the slab's lock (s->cpu_slab->lock) is +still a spinlock. + +Instead of changing map_idr_lock's type, fix the issue by invoking +htab_put_fd_value() after htab_unlock_bucket(). However, only deferring +the invocation of htab_put_fd_value() is not enough, because the old map +pointers in htab of maps can not be saved during batched deletion. +Therefore, also defer the invocation of free_htab_elem(), so these +to-be-freed elements could be linked together similar to lru map. + +There are four callers for ->map_fd_put_ptr: + +(1) alloc_htab_elem() (through htab_put_fd_value()) +It invokes ->map_fd_put_ptr() under a raw_spinlock_t. The invocation of +htab_put_fd_value() can not simply move after htab_unlock_bucket(), +because the old element has already been stashed in htab->extra_elems. +It may be reused immediately after htab_unlock_bucket() and the +invocation of htab_put_fd_value() after htab_unlock_bucket() may release +the newly-added element incorrectly. Therefore, saving the map pointer +of the old element for htab of maps before unlocking the bucket and +releasing the map_ptr after unlock. Beside the map pointer in the old +element, should do the same thing for the special fields in the old +element as well. + +(2) free_htab_elem() (through htab_put_fd_value()) +Its caller includes __htab_map_lookup_and_delete_elem(), +htab_map_delete_elem() and __htab_map_lookup_and_delete_batch(). + +For htab_map_delete_elem(), simply invoke free_htab_elem() after +htab_unlock_bucket(). For __htab_map_lookup_and_delete_batch(), just +like lru map, linking the to-be-freed element into node_to_free list +and invoking free_htab_elem() for these element after unlock. It is safe +to reuse batch_flink as the link for node_to_free, because these +elements have been removed from the hash llist. + +Because htab of maps doesn't support lookup_and_delete operation, +__htab_map_lookup_and_delete_elem() doesn't have the problem, so kept +it as is. + +(3) fd_htab_map_free() +It invokes ->map_fd_put_ptr without raw_spinlock_t. + +(4) bpf_fd_htab_map_update_elem() +It invokes ->map_fd_put_ptr without raw_spinlock_t. + +After moving free_htab_elem() outside htab bucket lock scope, using +pcpu_freelist_push() instead of __pcpu_freelist_push() to disable +the irq before freeing elements, and protecting the invocations of +bpf_mem_cache_free() with migrate_{disable|enable} pair. + +Signed-off-by: Hou Tao +Link: https://lore.kernel.org/r/20241106063542.357743-2-houtao@huaweicloud.com +Signed-off-by: Alexei Starovoitov +Signed-off-by: Andrii Nakryiko +Signed-off-by: Sasha Levin +--- + kernel/bpf/hashtab.c | 56 ++++++++++++++++++++++++++++++-------------- + 1 file changed, 39 insertions(+), 17 deletions(-) + +diff --git a/kernel/bpf/hashtab.c b/kernel/bpf/hashtab.c +index 7c64ad4f3732b..fc34f72702cc4 100644 +--- a/kernel/bpf/hashtab.c ++++ b/kernel/bpf/hashtab.c +@@ -892,9 +892,12 @@ static int htab_map_get_next_key(struct bpf_map *map, void *key, void *next_key) + static void htab_elem_free(struct bpf_htab *htab, struct htab_elem *l) + { + check_and_free_fields(htab, l); ++ ++ migrate_disable(); + if (htab->map.map_type == BPF_MAP_TYPE_PERCPU_HASH) + bpf_mem_cache_free(&htab->pcpu_ma, l->ptr_to_pptr); + bpf_mem_cache_free(&htab->ma, l); ++ migrate_enable(); + } + + static void htab_put_fd_value(struct bpf_htab *htab, struct htab_elem *l) +@@ -944,7 +947,7 @@ static void free_htab_elem(struct bpf_htab *htab, struct htab_elem *l) + if (htab_is_prealloc(htab)) { + bpf_map_dec_elem_count(&htab->map); + check_and_free_fields(htab, l); +- __pcpu_freelist_push(&htab->freelist, &l->fnode); ++ pcpu_freelist_push(&htab->freelist, &l->fnode); + } else { + dec_elem_count(htab); + htab_elem_free(htab, l); +@@ -1014,7 +1017,6 @@ static struct htab_elem *alloc_htab_elem(struct bpf_htab *htab, void *key, + */ + pl_new = this_cpu_ptr(htab->extra_elems); + l_new = *pl_new; +- htab_put_fd_value(htab, old_elem); + *pl_new = old_elem; + } else { + struct pcpu_freelist_node *l; +@@ -1100,6 +1102,7 @@ static long htab_map_update_elem(struct bpf_map *map, void *key, void *value, + struct htab_elem *l_new = NULL, *l_old; + struct hlist_nulls_head *head; + unsigned long flags; ++ void *old_map_ptr; + struct bucket *b; + u32 key_size, hash; + int ret; +@@ -1178,12 +1181,27 @@ static long htab_map_update_elem(struct bpf_map *map, void *key, void *value, + hlist_nulls_add_head_rcu(&l_new->hash_node, head); + if (l_old) { + hlist_nulls_del_rcu(&l_old->hash_node); ++ ++ /* l_old has already been stashed in htab->extra_elems, free ++ * its special fields before it is available for reuse. Also ++ * save the old map pointer in htab of maps before unlock ++ * and release it after unlock. ++ */ ++ old_map_ptr = NULL; ++ if (htab_is_prealloc(htab)) { ++ if (map->ops->map_fd_put_ptr) ++ old_map_ptr = fd_htab_map_get_ptr(map, l_old); ++ check_and_free_fields(htab, l_old); ++ } ++ } ++ htab_unlock_bucket(htab, b, hash, flags); ++ if (l_old) { ++ if (old_map_ptr) ++ map->ops->map_fd_put_ptr(map, old_map_ptr, true); + if (!htab_is_prealloc(htab)) + free_htab_elem(htab, l_old); +- else +- check_and_free_fields(htab, l_old); + } +- ret = 0; ++ return 0; + err: + htab_unlock_bucket(htab, b, hash, flags); + return ret; +@@ -1427,15 +1445,15 @@ static long htab_map_delete_elem(struct bpf_map *map, void *key) + return ret; + + l = lookup_elem_raw(head, hash, key, key_size); +- +- if (l) { ++ if (l) + hlist_nulls_del_rcu(&l->hash_node); +- free_htab_elem(htab, l); +- } else { ++ else + ret = -ENOENT; +- } + + htab_unlock_bucket(htab, b, hash, flags); ++ ++ if (l) ++ free_htab_elem(htab, l); + return ret; + } + +@@ -1842,13 +1860,14 @@ __htab_map_lookup_and_delete_batch(struct bpf_map *map, + * may cause deadlock. See comments in function + * prealloc_lru_pop(). Let us do bpf_lru_push_free() + * after releasing the bucket lock. ++ * ++ * For htab of maps, htab_put_fd_value() in ++ * free_htab_elem() may acquire a spinlock with bucket ++ * lock being held and it violates the lock rule, so ++ * invoke free_htab_elem() after unlock as well. + */ +- if (is_lru_map) { +- l->batch_flink = node_to_free; +- node_to_free = l; +- } else { +- free_htab_elem(htab, l); +- } ++ l->batch_flink = node_to_free; ++ node_to_free = l; + } + dst_key += key_size; + dst_val += value_size; +@@ -1860,7 +1879,10 @@ __htab_map_lookup_and_delete_batch(struct bpf_map *map, + while (node_to_free) { + l = node_to_free; + node_to_free = node_to_free->batch_flink; +- htab_lru_push_free(htab, l); ++ if (is_lru_map) ++ htab_lru_push_free(htab, l); ++ else ++ free_htab_elem(htab, l); + } + + next_batch: +-- +2.43.0 + diff --git a/queue-6.6/bpf-put-bpf_link-s-program-when-link-is-safe-to-be-d.patch b/queue-6.6/bpf-put-bpf_link-s-program-when-link-is-safe-to-be-d.patch new file mode 100644 index 00000000000..e6e2760fb35 --- /dev/null +++ b/queue-6.6/bpf-put-bpf_link-s-program-when-link-is-safe-to-be-d.patch @@ -0,0 +1,103 @@ +From 665ca79fe5cc241071b012033d3cb573e941f76f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Nov 2024 11:17:52 -0700 +Subject: bpf: put bpf_link's program when link is safe to be deallocated + +From: Andrii Nakryiko + +[ Upstream commit f44ec8733a8469143fde1984b5e6931b2e2f6f3f ] + +In general, BPF link's underlying BPF program should be considered to be +reachable through attach hook -> link -> prog chain, and, pessimistically, +we have to assume that as long as link's memory is not safe to free, +attach hook's code might hold a pointer to BPF program and use it. + +As such, it's not (generally) correct to put link's program early before +waiting for RCU GPs to go through. More eager bpf_prog_put() that we +currently do is mostly correct due to BPF program's release code doing +similar RCU GP waiting, but as will be shown in the following patches, +BPF program can be non-sleepable (and, thus, reliant on only "classic" +RCU GP), while BPF link's attach hook can have sleepable semantics and +needs to be protected by RCU Tasks Trace, and for such cases BPF link +has to go through RCU Tasks Trace + "classic" RCU GPs before being +deallocated. And so, if we put BPF program early, we might free BPF +program before we free BPF link, leading to use-after-free situation. + +So, this patch defers bpf_prog_put() until we are ready to perform +bpf_link's deallocation. At worst, this delays BPF program freeing by +one extra RCU GP, but that seems completely acceptable. Alternatively, +we'd need more elaborate ways to determine BPF hook, BPF link, and BPF +program lifetimes, and how they relate to each other, which seems like +an unnecessary complication. + +Note, for most BPF links we still will perform eager bpf_prog_put() and +link dealloc, so for those BPF links there are no observable changes +whatsoever. Only BPF links that use deferred dealloc might notice +slightly delayed freeing of BPF programs. + +Also, to reduce code and logic duplication, extract program put + link +dealloc logic into bpf_link_dealloc() helper. + +Link: https://lore.kernel.org/20241101181754.782341-1-andrii@kernel.org +Tested-by: Jordan Rife +Signed-off-by: Andrii Nakryiko +Signed-off-by: Steven Rostedt (Google) +Signed-off-by: Sasha Levin +--- + kernel/bpf/syscall.c | 22 +++++++++++++++++----- + 1 file changed, 17 insertions(+), 5 deletions(-) + +diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c +index 252aed82d45ea..ba38c08a9a059 100644 +--- a/kernel/bpf/syscall.c ++++ b/kernel/bpf/syscall.c +@@ -2870,12 +2870,24 @@ void bpf_link_inc(struct bpf_link *link) + atomic64_inc(&link->refcnt); + } + ++static void bpf_link_dealloc(struct bpf_link *link) ++{ ++ /* now that we know that bpf_link itself can't be reached, put underlying BPF program */ ++ if (link->prog) ++ bpf_prog_put(link->prog); ++ ++ /* free bpf_link and its containing memory */ ++ if (link->ops->dealloc_deferred) ++ link->ops->dealloc_deferred(link); ++ else ++ link->ops->dealloc(link); ++} ++ + static void bpf_link_defer_dealloc_rcu_gp(struct rcu_head *rcu) + { + struct bpf_link *link = container_of(rcu, struct bpf_link, rcu); + +- /* free bpf_link and its containing memory */ +- link->ops->dealloc_deferred(link); ++ bpf_link_dealloc(link); + } + + static void bpf_link_defer_dealloc_mult_rcu_gp(struct rcu_head *rcu) +@@ -2897,7 +2909,6 @@ static void bpf_link_free(struct bpf_link *link) + sleepable = link->prog->aux->sleepable; + /* detach BPF program, clean up used resources */ + ops->release(link); +- bpf_prog_put(link->prog); + } + if (ops->dealloc_deferred) { + /* schedule BPF link deallocation; if underlying BPF program +@@ -2908,8 +2919,9 @@ static void bpf_link_free(struct bpf_link *link) + call_rcu_tasks_trace(&link->rcu, bpf_link_defer_dealloc_mult_rcu_gp); + else + call_rcu(&link->rcu, bpf_link_defer_dealloc_rcu_gp); +- } else if (ops->dealloc) +- ops->dealloc(link); ++ } else if (ops->dealloc) { ++ bpf_link_dealloc(link); ++ } + } + + static void bpf_link_put_deferred(struct work_struct *work) +-- +2.43.0 + diff --git a/queue-6.6/btrfs-avoid-unnecessary-device-path-update-for-the-s.patch b/queue-6.6/btrfs-avoid-unnecessary-device-path-update-for-the-s.patch new file mode 100644 index 00000000000..c2eb6275cd3 --- /dev/null +++ b/queue-6.6/btrfs-avoid-unnecessary-device-path-update-for-the-s.patch @@ -0,0 +1,126 @@ +From c49ce4c404d9ce1a501df01dfd66fdf1be991ae9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 24 Sep 2024 12:52:17 +0930 +Subject: btrfs: avoid unnecessary device path update for the same device + +From: Qu Wenruo + +[ Upstream commit 2e8b6bc0ab41ce41e6dfcc204b6cc01d5abbc952 ] + +[PROBLEM] +It is very common for udev to trigger device scan, and every time a +mounted btrfs device got re-scan from different soft links, we will get +some of unnecessary device path updates, this is especially common +for LVM based storage: + + # lvs + scratch1 test -wi-ao---- 10.00g + scratch2 test -wi-a----- 10.00g + scratch3 test -wi-a----- 10.00g + scratch4 test -wi-a----- 10.00g + scratch5 test -wi-a----- 10.00g + test test -wi-a----- 10.00g + + # mkfs.btrfs -f /dev/test/scratch1 + # mount /dev/test/scratch1 /mnt/btrfs + # dmesg -c + [ 205.705234] BTRFS: device fsid 7be2602f-9e35-4ecf-a6ff-9e91d2c182c9 devid 1 transid 6 /dev/mapper/test-scratch1 (253:4) scanned by mount (1154) + [ 205.710864] BTRFS info (device dm-4): first mount of filesystem 7be2602f-9e35-4ecf-a6ff-9e91d2c182c9 + [ 205.711923] BTRFS info (device dm-4): using crc32c (crc32c-intel) checksum algorithm + [ 205.713856] BTRFS info (device dm-4): using free-space-tree + [ 205.722324] BTRFS info (device dm-4): checking UUID tree + +So far so good, but even if we just touched any soft link of +"dm-4", we will get quite some unnecessary device path updates. + + # touch /dev/mapper/test-scratch1 + # dmesg -c + [ 469.295796] BTRFS info: devid 1 device path /dev/mapper/test-scratch1 changed to /dev/dm-4 scanned by (udev-worker) (1221) + [ 469.300494] BTRFS info: devid 1 device path /dev/dm-4 changed to /dev/mapper/test-scratch1 scanned by (udev-worker) (1221) + +Such device path rename is unnecessary and can lead to random path +change due to the udev race. + +[CAUSE] +Inside device_list_add(), we are using a very primitive way checking if +the device has changed, strcmp(). + +Which can never handle links well, no matter if it's hard or soft links. + +So every different link of the same device will be treated as a different +device, causing the unnecessary device path update. + +[FIX] +Introduce a helper, is_same_device(), and use path_equal() to properly +detect the same block device. +So that the different soft links won't trigger the rename race. + +Reviewed-by: Filipe Manana +Link: https://bugzilla.suse.com/show_bug.cgi?id=1230641 +Reported-by: Fabian Vogt +Signed-off-by: Qu Wenruo +Signed-off-by: David Sterba +Signed-off-by: Sasha Levin +--- + fs/btrfs/volumes.c | 38 +++++++++++++++++++++++++++++++++++++- + 1 file changed, 37 insertions(+), 1 deletion(-) + +diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c +index 790e30e2101a6..fdd392334916f 100644 +--- a/fs/btrfs/volumes.c ++++ b/fs/btrfs/volumes.c +@@ -689,6 +689,42 @@ u8 *btrfs_sb_fsid_ptr(struct btrfs_super_block *sb) + return has_metadata_uuid ? sb->metadata_uuid : sb->fsid; + } + ++static bool is_same_device(struct btrfs_device *device, const char *new_path) ++{ ++ struct path old = { .mnt = NULL, .dentry = NULL }; ++ struct path new = { .mnt = NULL, .dentry = NULL }; ++ char *old_path = NULL; ++ bool is_same = false; ++ int ret; ++ ++ if (!device->name) ++ goto out; ++ ++ old_path = kzalloc(PATH_MAX, GFP_NOFS); ++ if (!old_path) ++ goto out; ++ ++ rcu_read_lock(); ++ ret = strscpy(old_path, rcu_str_deref(device->name), PATH_MAX); ++ rcu_read_unlock(); ++ if (ret < 0) ++ goto out; ++ ++ ret = kern_path(old_path, LOOKUP_FOLLOW, &old); ++ if (ret) ++ goto out; ++ ret = kern_path(new_path, LOOKUP_FOLLOW, &new); ++ if (ret) ++ goto out; ++ if (path_equal(&old, &new)) ++ is_same = true; ++out: ++ kfree(old_path); ++ path_put(&old); ++ path_put(&new); ++ return is_same; ++} ++ + /* + * Handle scanned device having its CHANGING_FSID_V2 flag set and the fs_devices + * being created with a disk that has already completed its fsid change. Such +@@ -888,7 +924,7 @@ static noinline struct btrfs_device *device_list_add(const char *path, + disk_super->fsid, devid, found_transid, path, + current->comm, task_pid_nr(current)); + +- } else if (!device->name || strcmp(device->name->str, path)) { ++ } else if (!device->name || !is_same_device(device, path)) { + /* + * When FS is already mounted. + * 1. If you are here and if the device->name is NULL that +-- +2.43.0 + diff --git a/queue-6.6/btrfs-do-not-clear-read-only-when-adding-sprout-devi.patch b/queue-6.6/btrfs-do-not-clear-read-only-when-adding-sprout-devi.patch new file mode 100644 index 00000000000..71a3b53fbc5 --- /dev/null +++ b/queue-6.6/btrfs-do-not-clear-read-only-when-adding-sprout-devi.patch @@ -0,0 +1,66 @@ +From 359e5d74546c5a3025d037ac87459850c41f8bdf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 15 Oct 2024 14:27:32 -0700 +Subject: btrfs: do not clear read-only when adding sprout device + +From: Boris Burkov + +[ Upstream commit 70958a949d852cbecc3d46127bf0b24786df0130 ] + +If you follow the seed/sprout wiki, it suggests the following workflow: + +btrfstune -S 1 seed_dev +mount seed_dev mnt +btrfs device add sprout_dev +mount -o remount,rw mnt + +The first mount mounts the FS readonly, which results in not setting +BTRFS_FS_OPEN, and setting the readonly bit on the sb. The device add +somewhat surprisingly clears the readonly bit on the sb (though the +mount is still practically readonly, from the users perspective...). +Finally, the remount checks the readonly bit on the sb against the flag +and sees no change, so it does not run the code intended to run on +ro->rw transitions, leaving BTRFS_FS_OPEN unset. + +As a result, when the cleaner_kthread runs, it sees no BTRFS_FS_OPEN and +does no work. This results in leaking deleted snapshots until we run out +of space. + +I propose fixing it at the first departure from what feels reasonable: +when we clear the readonly bit on the sb during device add. + +A new fstest I have written reproduces the bug and confirms the fix. + +Reviewed-by: Qu Wenruo +Signed-off-by: Boris Burkov +Signed-off-by: David Sterba +Signed-off-by: Sasha Levin +--- + fs/btrfs/volumes.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c +index fdd392334916f..b9a0b26d08e1c 100644 +--- a/fs/btrfs/volumes.c ++++ b/fs/btrfs/volumes.c +@@ -2738,8 +2738,6 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path + set_blocksize(device->bdev, BTRFS_BDEV_BLOCKSIZE); + + if (seeding_dev) { +- btrfs_clear_sb_rdonly(sb); +- + /* GFP_KERNEL allocation must not be under device_list_mutex */ + seed_devices = btrfs_init_sprout(fs_info); + if (IS_ERR(seed_devices)) { +@@ -2882,8 +2880,6 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path + mutex_unlock(&fs_info->chunk_mutex); + mutex_unlock(&fs_info->fs_devices->device_list_mutex); + error_trans: +- if (seeding_dev) +- btrfs_set_sb_rdonly(sb); + if (trans) + btrfs_end_transaction(trans); + error_free_zone: +-- +2.43.0 + diff --git a/queue-6.6/btrfs-don-t-take-dev_replace-rwsem-on-task-already-h.patch b/queue-6.6/btrfs-don-t-take-dev_replace-rwsem-on-task-already-h.patch new file mode 100644 index 00000000000..0d8d93f08bf --- /dev/null +++ b/queue-6.6/btrfs-don-t-take-dev_replace-rwsem-on-task-already-h.patch @@ -0,0 +1,241 @@ +From 9fdf887c9ffc5202d5205b5c226e1a357a3e9269 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 10 Sep 2024 09:55:01 +0200 +Subject: btrfs: don't take dev_replace rwsem on task already holding it + +From: Johannes Thumshirn + +[ Upstream commit 8cca35cb29f81eba3e96ec44dad8696c8a2f9138 ] + +Running fstests btrfs/011 with MKFS_OPTIONS="-O rst" to force the usage of +the RAID stripe-tree, we get the following splat from lockdep: + + BTRFS info (device sdd): dev_replace from /dev/sdd (devid 1) to /dev/sdb started + + ============================================ + WARNING: possible recursive locking detected + 6.11.0-rc3-btrfs-for-next #599 Not tainted + -------------------------------------------- + btrfs/2326 is trying to acquire lock: + ffff88810f215c98 (&fs_info->dev_replace.rwsem){++++}-{3:3}, at: btrfs_map_block+0x39f/0x2250 + + but task is already holding lock: + ffff88810f215c98 (&fs_info->dev_replace.rwsem){++++}-{3:3}, at: btrfs_map_block+0x39f/0x2250 + + other info that might help us debug this: + Possible unsafe locking scenario: + + CPU0 + ---- + lock(&fs_info->dev_replace.rwsem); + lock(&fs_info->dev_replace.rwsem); + + *** DEADLOCK *** + + May be due to missing lock nesting notation + + 1 lock held by btrfs/2326: + #0: ffff88810f215c98 (&fs_info->dev_replace.rwsem){++++}-{3:3}, at: btrfs_map_block+0x39f/0x2250 + + stack backtrace: + CPU: 1 UID: 0 PID: 2326 Comm: btrfs Not tainted 6.11.0-rc3-btrfs-for-next #599 + Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 + Call Trace: + + dump_stack_lvl+0x5b/0x80 + __lock_acquire+0x2798/0x69d0 + ? __pfx___lock_acquire+0x10/0x10 + ? __pfx___lock_acquire+0x10/0x10 + lock_acquire+0x19d/0x4a0 + ? btrfs_map_block+0x39f/0x2250 + ? __pfx_lock_acquire+0x10/0x10 + ? find_held_lock+0x2d/0x110 + ? lock_is_held_type+0x8f/0x100 + down_read+0x8e/0x440 + ? btrfs_map_block+0x39f/0x2250 + ? __pfx_down_read+0x10/0x10 + ? do_raw_read_unlock+0x44/0x70 + ? _raw_read_unlock+0x23/0x40 + btrfs_map_block+0x39f/0x2250 + ? btrfs_dev_replace_by_ioctl+0xd69/0x1d00 + ? btrfs_bio_counter_inc_blocked+0xd9/0x2e0 + ? __kasan_slab_alloc+0x6e/0x70 + ? __pfx_btrfs_map_block+0x10/0x10 + ? __pfx_btrfs_bio_counter_inc_blocked+0x10/0x10 + ? kmem_cache_alloc_noprof+0x1f2/0x300 + ? mempool_alloc_noprof+0xed/0x2b0 + btrfs_submit_chunk+0x28d/0x17e0 + ? __pfx_btrfs_submit_chunk+0x10/0x10 + ? bvec_alloc+0xd7/0x1b0 + ? bio_add_folio+0x171/0x270 + ? __pfx_bio_add_folio+0x10/0x10 + ? __kasan_check_read+0x20/0x20 + btrfs_submit_bio+0x37/0x80 + read_extent_buffer_pages+0x3df/0x6c0 + btrfs_read_extent_buffer+0x13e/0x5f0 + read_tree_block+0x81/0xe0 + read_block_for_search+0x4bd/0x7a0 + ? __pfx_read_block_for_search+0x10/0x10 + btrfs_search_slot+0x78d/0x2720 + ? __pfx_btrfs_search_slot+0x10/0x10 + ? lock_is_held_type+0x8f/0x100 + ? kasan_save_track+0x14/0x30 + ? __kasan_slab_alloc+0x6e/0x70 + ? kmem_cache_alloc_noprof+0x1f2/0x300 + btrfs_get_raid_extent_offset+0x181/0x820 + ? __pfx_lock_acquire+0x10/0x10 + ? __pfx_btrfs_get_raid_extent_offset+0x10/0x10 + ? down_read+0x194/0x440 + ? __pfx_down_read+0x10/0x10 + ? do_raw_read_unlock+0x44/0x70 + ? _raw_read_unlock+0x23/0x40 + btrfs_map_block+0x5b5/0x2250 + ? __pfx_btrfs_map_block+0x10/0x10 + scrub_submit_initial_read+0x8fe/0x11b0 + ? __pfx_scrub_submit_initial_read+0x10/0x10 + submit_initial_group_read+0x161/0x3a0 + ? lock_release+0x20e/0x710 + ? __pfx_submit_initial_group_read+0x10/0x10 + ? __pfx_lock_release+0x10/0x10 + scrub_simple_mirror.isra.0+0x3eb/0x580 + scrub_stripe+0xe4d/0x1440 + ? lock_release+0x20e/0x710 + ? __pfx_scrub_stripe+0x10/0x10 + ? __pfx_lock_release+0x10/0x10 + ? do_raw_read_unlock+0x44/0x70 + ? _raw_read_unlock+0x23/0x40 + scrub_chunk+0x257/0x4a0 + scrub_enumerate_chunks+0x64c/0xf70 + ? __mutex_unlock_slowpath+0x147/0x5f0 + ? __pfx_scrub_enumerate_chunks+0x10/0x10 + ? bit_wait_timeout+0xb0/0x170 + ? __up_read+0x189/0x700 + ? scrub_workers_get+0x231/0x300 + ? up_write+0x490/0x4f0 + btrfs_scrub_dev+0x52e/0xcd0 + ? create_pending_snapshots+0x230/0x250 + ? __pfx_btrfs_scrub_dev+0x10/0x10 + btrfs_dev_replace_by_ioctl+0xd69/0x1d00 + ? lock_acquire+0x19d/0x4a0 + ? __pfx_btrfs_dev_replace_by_ioctl+0x10/0x10 + ? lock_release+0x20e/0x710 + ? btrfs_ioctl+0xa09/0x74f0 + ? __pfx_lock_release+0x10/0x10 + ? do_raw_spin_lock+0x11e/0x240 + ? __pfx_do_raw_spin_lock+0x10/0x10 + btrfs_ioctl+0xa14/0x74f0 + ? lock_acquire+0x19d/0x4a0 + ? find_held_lock+0x2d/0x110 + ? __pfx_btrfs_ioctl+0x10/0x10 + ? lock_release+0x20e/0x710 + ? do_sigaction+0x3f0/0x860 + ? __pfx_do_vfs_ioctl+0x10/0x10 + ? do_raw_spin_lock+0x11e/0x240 + ? lockdep_hardirqs_on_prepare+0x270/0x3e0 + ? _raw_spin_unlock_irq+0x28/0x50 + ? do_sigaction+0x3f0/0x860 + ? __pfx_do_sigaction+0x10/0x10 + ? __x64_sys_rt_sigaction+0x18e/0x1e0 + ? __pfx___x64_sys_rt_sigaction+0x10/0x10 + ? __x64_sys_close+0x7c/0xd0 + __x64_sys_ioctl+0x137/0x190 + do_syscall_64+0x71/0x140 + entry_SYSCALL_64_after_hwframe+0x76/0x7e + RIP: 0033:0x7f0bd1114f9b + Code: Unable to access opcode bytes at 0x7f0bd1114f71. + RSP: 002b:00007ffc8a8c3130 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 + RAX: ffffffffffffffda RBX: 0000000000000003 RCX: 00007f0bd1114f9b + RDX: 00007ffc8a8c35e0 RSI: 00000000ca289435 RDI: 0000000000000003 + RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000007 + R10: 0000000000000008 R11: 0000000000000246 R12: 00007ffc8a8c6c85 + R13: 00000000398e72a0 R14: 0000000000004361 R15: 0000000000000004 + + +This happens because on RAID stripe-tree filesystems we recurse back into +btrfs_map_block() on scrub to perform the logical to device physical +mapping. + +But as the device replace task is already holding the dev_replace::rwsem +we deadlock. + +So don't take the dev_replace::rwsem in case our task is the task performing +the device replace. + +Suggested-by: Filipe Manana +Signed-off-by: Johannes Thumshirn +Reviewed-by: Filipe Manana +Signed-off-by: David Sterba +Signed-off-by: Sasha Levin +--- + fs/btrfs/dev-replace.c | 2 ++ + fs/btrfs/fs.h | 2 ++ + fs/btrfs/volumes.c | 8 +++++--- + 3 files changed, 9 insertions(+), 3 deletions(-) + +diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c +index 8400e212e3304..f77ef719a3b11 100644 +--- a/fs/btrfs/dev-replace.c ++++ b/fs/btrfs/dev-replace.c +@@ -644,6 +644,7 @@ static int btrfs_dev_replace_start(struct btrfs_fs_info *fs_info, + return ret; + + down_write(&dev_replace->rwsem); ++ dev_replace->replace_task = current; + switch (dev_replace->replace_state) { + case BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED: + case BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED: +@@ -976,6 +977,7 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info, + list_add(&tgt_device->dev_alloc_list, &fs_devices->alloc_list); + fs_devices->rw_devices++; + ++ dev_replace->replace_task = NULL; + up_write(&dev_replace->rwsem); + btrfs_rm_dev_replace_blocked(fs_info); + +diff --git a/fs/btrfs/fs.h b/fs/btrfs/fs.h +index a523d64d54912..d24d41f7811a6 100644 +--- a/fs/btrfs/fs.h ++++ b/fs/btrfs/fs.h +@@ -271,6 +271,8 @@ struct btrfs_dev_replace { + + struct percpu_counter bio_counter; + wait_queue_head_t replace_wait; ++ ++ struct task_struct *replace_task; + }; + + /* +diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c +index d2285c9726e7b..790e30e2101a6 100644 +--- a/fs/btrfs/volumes.c ++++ b/fs/btrfs/volumes.c +@@ -6313,13 +6313,15 @@ int btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op, + &stripe_offset, &raid56_full_stripe_start); + *length = min_t(u64, em->len - map_offset, max_len); + +- down_read(&dev_replace->rwsem); ++ if (dev_replace->replace_task != current) ++ down_read(&dev_replace->rwsem); ++ + dev_replace_is_ongoing = btrfs_dev_replace_is_ongoing(dev_replace); + /* + * Hold the semaphore for read during the whole operation, write is + * requested at commit time but must wait. + */ +- if (!dev_replace_is_ongoing) ++ if (!dev_replace_is_ongoing && dev_replace->replace_task != current) + up_read(&dev_replace->rwsem); + + num_stripes = 1; +@@ -6509,7 +6511,7 @@ int btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op, + bioc->mirror_num = mirror_num; + + out: +- if (dev_replace_is_ongoing) { ++ if (dev_replace_is_ongoing && dev_replace->replace_task != current) { + lockdep_assert_held(&dev_replace->rwsem); + /* Unlock and let waiting writers proceed */ + up_read(&dev_replace->rwsem); +-- +2.43.0 + diff --git a/queue-6.6/clk-qcom-rcg2-add-clk_rcg2_shared_floor_ops.patch b/queue-6.6/clk-qcom-rcg2-add-clk_rcg2_shared_floor_ops.patch new file mode 100644 index 00000000000..d821c8a750c --- /dev/null +++ b/queue-6.6/clk-qcom-rcg2-add-clk_rcg2_shared_floor_ops.patch @@ -0,0 +1,119 @@ +From 295bfbb0d883ea8f37b31a03cd34adac30ed58c5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 27 Oct 2024 03:24:45 +0200 +Subject: clk: qcom: rcg2: add clk_rcg2_shared_floor_ops + +From: Dmitry Baryshkov + +[ Upstream commit aec8c0e28ce4a1f89fd82fcc06a5cc73147e9817 ] + +Generally SDCC clocks use clk_rcg2_floor_ops, however on SAR2130P +platform it's recommended to use rcg2_shared_ops for all Root Clock +Generators to park them instead of disabling. Implement a mix of those, +clk_rcg2_shared_floor_ops. + +Signed-off-by: Dmitry Baryshkov +Link: https://lore.kernel.org/r/20241027-sar2130p-clocks-v5-6-ecad2a1432ba@linaro.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/clk-rcg.h | 1 + + drivers/clk/qcom/clk-rcg2.c | 48 +++++++++++++++++++++++++++++++++---- + 2 files changed, 44 insertions(+), 5 deletions(-) + +diff --git a/drivers/clk/qcom/clk-rcg.h b/drivers/clk/qcom/clk-rcg.h +index 84c497f361bc6..7d0f925960559 100644 +--- a/drivers/clk/qcom/clk-rcg.h ++++ b/drivers/clk/qcom/clk-rcg.h +@@ -176,6 +176,7 @@ extern const struct clk_ops clk_byte2_ops; + extern const struct clk_ops clk_pixel_ops; + extern const struct clk_ops clk_gfx3d_ops; + extern const struct clk_ops clk_rcg2_shared_ops; ++extern const struct clk_ops clk_rcg2_shared_floor_ops; + extern const struct clk_ops clk_rcg2_shared_no_init_park_ops; + extern const struct clk_ops clk_dp_ops; + +diff --git a/drivers/clk/qcom/clk-rcg2.c b/drivers/clk/qcom/clk-rcg2.c +index 461f54fe5e4f1..fae1c07982aba 100644 +--- a/drivers/clk/qcom/clk-rcg2.c ++++ b/drivers/clk/qcom/clk-rcg2.c +@@ -1020,15 +1020,23 @@ clk_rcg2_shared_force_enable_clear(struct clk_hw *hw, const struct freq_tbl *f) + return clk_rcg2_clear_force_enable(hw); + } + +-static int clk_rcg2_shared_set_rate(struct clk_hw *hw, unsigned long rate, +- unsigned long parent_rate) ++static int __clk_rcg2_shared_set_rate(struct clk_hw *hw, unsigned long rate, ++ unsigned long parent_rate, ++ enum freq_policy policy) + { + struct clk_rcg2 *rcg = to_clk_rcg2(hw); + const struct freq_tbl *f; + +- f = qcom_find_freq(rcg->freq_tbl, rate); +- if (!f) ++ switch (policy) { ++ case FLOOR: ++ f = qcom_find_freq_floor(rcg->freq_tbl, rate); ++ break; ++ case CEIL: ++ f = qcom_find_freq(rcg->freq_tbl, rate); ++ break; ++ default: + return -EINVAL; ++ } + + /* + * In case clock is disabled, update the M, N and D registers, cache +@@ -1041,10 +1049,28 @@ static int clk_rcg2_shared_set_rate(struct clk_hw *hw, unsigned long rate, + return clk_rcg2_shared_force_enable_clear(hw, f); + } + ++static int clk_rcg2_shared_set_rate(struct clk_hw *hw, unsigned long rate, ++ unsigned long parent_rate) ++{ ++ return __clk_rcg2_shared_set_rate(hw, rate, parent_rate, CEIL); ++} ++ + static int clk_rcg2_shared_set_rate_and_parent(struct clk_hw *hw, + unsigned long rate, unsigned long parent_rate, u8 index) + { +- return clk_rcg2_shared_set_rate(hw, rate, parent_rate); ++ return __clk_rcg2_shared_set_rate(hw, rate, parent_rate, CEIL); ++} ++ ++static int clk_rcg2_shared_set_floor_rate(struct clk_hw *hw, unsigned long rate, ++ unsigned long parent_rate) ++{ ++ return __clk_rcg2_shared_set_rate(hw, rate, parent_rate, FLOOR); ++} ++ ++static int clk_rcg2_shared_set_floor_rate_and_parent(struct clk_hw *hw, ++ unsigned long rate, unsigned long parent_rate, u8 index) ++{ ++ return __clk_rcg2_shared_set_rate(hw, rate, parent_rate, FLOOR); + } + + static int clk_rcg2_shared_enable(struct clk_hw *hw) +@@ -1182,6 +1208,18 @@ const struct clk_ops clk_rcg2_shared_ops = { + }; + EXPORT_SYMBOL_GPL(clk_rcg2_shared_ops); + ++const struct clk_ops clk_rcg2_shared_floor_ops = { ++ .enable = clk_rcg2_shared_enable, ++ .disable = clk_rcg2_shared_disable, ++ .get_parent = clk_rcg2_shared_get_parent, ++ .set_parent = clk_rcg2_shared_set_parent, ++ .recalc_rate = clk_rcg2_shared_recalc_rate, ++ .determine_rate = clk_rcg2_determine_floor_rate, ++ .set_rate = clk_rcg2_shared_set_floor_rate, ++ .set_rate_and_parent = clk_rcg2_shared_set_floor_rate_and_parent, ++}; ++EXPORT_SYMBOL_GPL(clk_rcg2_shared_floor_ops); ++ + static int clk_rcg2_shared_no_init_park(struct clk_hw *hw) + { + struct clk_rcg2 *rcg = to_clk_rcg2(hw); +-- +2.43.0 + diff --git a/queue-6.6/clk-qcom-rpmh-add-support-for-sar2130p.patch b/queue-6.6/clk-qcom-rpmh-add-support-for-sar2130p.patch new file mode 100644 index 00000000000..079ae38d5a9 --- /dev/null +++ b/queue-6.6/clk-qcom-rpmh-add-support-for-sar2130p.patch @@ -0,0 +1,56 @@ +From 5b2b64b0686c96c008327bf027aee6541a31719e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 27 Oct 2024 03:24:46 +0200 +Subject: clk: qcom: rpmh: add support for SAR2130P + +From: Dmitry Baryshkov + +[ Upstream commit 2cc88de6261f01ebd4e2a3b4e29681fe87d0c089 ] + +Define clocks as supported by the RPMh on the SAR2130P platform. The +msm-5.10 kernel declares just the CXO clock, the RF_CLK1 clock was added +following recommendation from Taniya Das. + +Signed-off-by: Dmitry Baryshkov +Reviewed-by: Taniya Das +Link: https://lore.kernel.org/r/20241027-sar2130p-clocks-v5-7-ecad2a1432ba@linaro.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/clk-rpmh.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/drivers/clk/qcom/clk-rpmh.c b/drivers/clk/qcom/clk-rpmh.c +index a556c9e77d192..a8b5f4d8a7b9e 100644 +--- a/drivers/clk/qcom/clk-rpmh.c ++++ b/drivers/clk/qcom/clk-rpmh.c +@@ -385,6 +385,18 @@ DEFINE_CLK_RPMH_BCM(ipa, "IP0"); + DEFINE_CLK_RPMH_BCM(pka, "PKA0"); + DEFINE_CLK_RPMH_BCM(qpic_clk, "QP0"); + ++static struct clk_hw *sar2130p_rpmh_clocks[] = { ++ [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div1.hw, ++ [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div1_ao.hw, ++ [RPMH_RF_CLK1] = &clk_rpmh_rf_clk1_a.hw, ++ [RPMH_RF_CLK1_A] = &clk_rpmh_rf_clk1_a_ao.hw, ++}; ++ ++static const struct clk_rpmh_desc clk_rpmh_sar2130p = { ++ .clks = sar2130p_rpmh_clocks, ++ .num_clks = ARRAY_SIZE(sar2130p_rpmh_clocks), ++}; ++ + static struct clk_hw *sdm845_rpmh_clocks[] = { + [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw, + [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw, +@@ -804,6 +816,7 @@ static int clk_rpmh_probe(struct platform_device *pdev) + static const struct of_device_id clk_rpmh_match_table[] = { + { .compatible = "qcom,qdu1000-rpmh-clk", .data = &clk_rpmh_qdu1000}, + { .compatible = "qcom,sa8775p-rpmh-clk", .data = &clk_rpmh_sa8775p}, ++ { .compatible = "qcom,sar2130p-rpmh-clk", .data = &clk_rpmh_sar2130p}, + { .compatible = "qcom,sc7180-rpmh-clk", .data = &clk_rpmh_sc7180}, + { .compatible = "qcom,sc8180x-rpmh-clk", .data = &clk_rpmh_sc8180x}, + { .compatible = "qcom,sc8280xp-rpmh-clk", .data = &clk_rpmh_sc8280xp}, +-- +2.43.0 + diff --git a/queue-6.6/clk-qcom-tcsrcc-sm8550-add-sar2130p-support.patch b/queue-6.6/clk-qcom-tcsrcc-sm8550-add-sar2130p-support.patch new file mode 100644 index 00000000000..59e297ba4d2 --- /dev/null +++ b/queue-6.6/clk-qcom-tcsrcc-sm8550-add-sar2130p-support.patch @@ -0,0 +1,75 @@ +From d774a58b25a034924469ced5f43dacf75fab4cd2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 27 Oct 2024 03:24:48 +0200 +Subject: clk: qcom: tcsrcc-sm8550: add SAR2130P support + +From: Dmitry Baryshkov + +[ Upstream commit d2e0a043530b9d6f37a8de8f05e0725667aba0a6 ] + +The SAR2130P platform has the same TCSR Clock Controller as the SM8550, +except for the lack of the UFS clocks. Extend the SM8550 TCSRCC driver +to support SAR2130P. + +Reviewed-by: Konrad Dybcio +Signed-off-by: Dmitry Baryshkov +Link: https://lore.kernel.org/r/20241027-sar2130p-clocks-v5-9-ecad2a1432ba@linaro.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/tcsrcc-sm8550.c | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +diff --git a/drivers/clk/qcom/tcsrcc-sm8550.c b/drivers/clk/qcom/tcsrcc-sm8550.c +index 552a3eb1fd910..fd93145c64090 100644 +--- a/drivers/clk/qcom/tcsrcc-sm8550.c ++++ b/drivers/clk/qcom/tcsrcc-sm8550.c +@@ -129,6 +129,13 @@ static struct clk_branch tcsr_usb3_clkref_en = { + }, + }; + ++static struct clk_regmap *tcsr_cc_sar2130p_clocks[] = { ++ [TCSR_PCIE_0_CLKREF_EN] = &tcsr_pcie_0_clkref_en.clkr, ++ [TCSR_PCIE_1_CLKREF_EN] = &tcsr_pcie_1_clkref_en.clkr, ++ [TCSR_USB2_CLKREF_EN] = &tcsr_usb2_clkref_en.clkr, ++ [TCSR_USB3_CLKREF_EN] = &tcsr_usb3_clkref_en.clkr, ++}; ++ + static struct clk_regmap *tcsr_cc_sm8550_clocks[] = { + [TCSR_PCIE_0_CLKREF_EN] = &tcsr_pcie_0_clkref_en.clkr, + [TCSR_PCIE_1_CLKREF_EN] = &tcsr_pcie_1_clkref_en.clkr, +@@ -146,6 +153,12 @@ static const struct regmap_config tcsr_cc_sm8550_regmap_config = { + .fast_io = true, + }; + ++static const struct qcom_cc_desc tcsr_cc_sar2130p_desc = { ++ .config = &tcsr_cc_sm8550_regmap_config, ++ .clks = tcsr_cc_sar2130p_clocks, ++ .num_clks = ARRAY_SIZE(tcsr_cc_sar2130p_clocks), ++}; ++ + static const struct qcom_cc_desc tcsr_cc_sm8550_desc = { + .config = &tcsr_cc_sm8550_regmap_config, + .clks = tcsr_cc_sm8550_clocks, +@@ -153,7 +166,8 @@ static const struct qcom_cc_desc tcsr_cc_sm8550_desc = { + }; + + static const struct of_device_id tcsr_cc_sm8550_match_table[] = { +- { .compatible = "qcom,sm8550-tcsr" }, ++ { .compatible = "qcom,sar2130p-tcsr", .data = &tcsr_cc_sar2130p_desc }, ++ { .compatible = "qcom,sm8550-tcsr", .data = &tcsr_cc_sm8550_desc }, + { } + }; + MODULE_DEVICE_TABLE(of, tcsr_cc_sm8550_match_table); +@@ -162,7 +176,7 @@ static int tcsr_cc_sm8550_probe(struct platform_device *pdev) + { + struct regmap *regmap; + +- regmap = qcom_cc_map(pdev, &tcsr_cc_sm8550_desc); ++ regmap = qcom_cc_map(pdev, of_device_get_match_data(&pdev->dev)); + if (IS_ERR(regmap)) + return PTR_ERR(regmap); + +-- +2.43.0 + diff --git a/queue-6.6/dlm-fix-possible-lkb_resource-null-dereference.patch b/queue-6.6/dlm-fix-possible-lkb_resource-null-dereference.patch new file mode 100644 index 00000000000..de32fe3e02a --- /dev/null +++ b/queue-6.6/dlm-fix-possible-lkb_resource-null-dereference.patch @@ -0,0 +1,61 @@ +From 14bac497f529579ad5217dd0c99dd81069e903e4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 4 Oct 2024 11:13:38 -0400 +Subject: dlm: fix possible lkb_resource null dereference + +From: Alexander Aring + +[ Upstream commit b98333c67daf887c724cd692e88e2db9418c0861 ] + +This patch fixes a possible null pointer dereference when this function is +called from request_lock() as lkb->lkb_resource is not assigned yet, +only after validate_lock_args() by calling attach_lkb(). Another issue +is that a resource name could be a non printable bytearray and we cannot +assume to be ASCII coded. + +The log functionality is probably never being hit when DLM is used in +normal way and no debug logging is enabled. The null pointer dereference +can only occur on a new created lkb that does not have the resource +assigned yet, it probably never hits the null pointer dereference but we +should be sure that other changes might not change this behaviour and we +actually can hit the mentioned null pointer dereference. + +In this patch we just drop the printout of the resource name, the lkb id +is enough to make a possible connection to a resource name if this +exists. + +Signed-off-by: Alexander Aring +Signed-off-by: David Teigland +Signed-off-by: Sasha Levin +--- + fs/dlm/lock.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +diff --git a/fs/dlm/lock.c b/fs/dlm/lock.c +index 652c51fbbf768..6712d733fc90b 100644 +--- a/fs/dlm/lock.c ++++ b/fs/dlm/lock.c +@@ -2698,16 +2698,14 @@ static int validate_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, + case -EINVAL: + /* annoy the user because dlm usage is wrong */ + WARN_ON(1); +- log_error(ls, "%s %d %x %x %x %d %d %s", __func__, ++ log_error(ls, "%s %d %x %x %x %d %d", __func__, + rv, lkb->lkb_id, dlm_iflags_val(lkb), args->flags, +- lkb->lkb_status, lkb->lkb_wait_type, +- lkb->lkb_resource->res_name); ++ lkb->lkb_status, lkb->lkb_wait_type); + break; + default: +- log_debug(ls, "%s %d %x %x %x %d %d %s", __func__, ++ log_debug(ls, "%s %d %x %x %x %d %d", __func__, + rv, lkb->lkb_id, dlm_iflags_val(lkb), args->flags, +- lkb->lkb_status, lkb->lkb_wait_type, +- lkb->lkb_resource->res_name); ++ lkb->lkb_status, lkb->lkb_wait_type); + break; + } + +-- +2.43.0 + diff --git a/queue-6.6/dma-debug-fix-a-possible-deadlock-on-radix_lock.patch b/queue-6.6/dma-debug-fix-a-possible-deadlock-on-radix_lock.patch new file mode 100644 index 00000000000..214d0717d6c --- /dev/null +++ b/queue-6.6/dma-debug-fix-a-possible-deadlock-on-radix_lock.patch @@ -0,0 +1,68 @@ +From 72992b774a7ab4ba35283a8e3ce7b1ac4f42c2c1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 25 Oct 2024 11:06:00 +0100 +Subject: dma-debug: fix a possible deadlock on radix_lock + +From: Levi Yun + +[ Upstream commit 7543c3e3b9b88212fcd0aaf5cab5588797bdc7de ] + +radix_lock() shouldn't be held while holding dma_hash_entry[idx].lock +otherwise, there's a possible deadlock scenario when +dma debug API is called holding rq_lock(): + +CPU0 CPU1 CPU2 +dma_free_attrs() +check_unmap() add_dma_entry() __schedule() //out + (A) rq_lock() +get_hash_bucket() +(A) dma_entry_hash + check_sync() + (A) radix_lock() (W) dma_entry_hash +dma_entry_free() +(W) radix_lock() + // CPU2's one + (W) rq_lock() + +CPU1 situation can happen when it extending radix tree and +it tries to wake up kswapd via wake_all_kswapd(). + +CPU2 situation can happen while perf_event_task_sched_out() +(i.e. dma sync operation is called while deleting perf_event using + etm and etr tmc which are Arm Coresight hwtracing driver backends). + +To remove this possible situation, call dma_entry_free() after +put_hash_bucket() in check_unmap(). + +Reported-by: Denis Nikitin +Closes: https://lists.linaro.org/archives/list/coresight@lists.linaro.org/thread/2WMS7BBSF5OZYB63VT44U5YWLFP5HL6U/#RWM6MLQX5ANBTEQ2PRM7OXCBGCE6NPWU +Signed-off-by: Levi Yun +Signed-off-by: Christoph Hellwig +Signed-off-by: Sasha Levin +--- + kernel/dma/debug.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c +index e472cc37d7de4..958d4aa77dcad 100644 +--- a/kernel/dma/debug.c ++++ b/kernel/dma/debug.c +@@ -1051,9 +1051,13 @@ static void check_unmap(struct dma_debug_entry *ref) + } + + hash_bucket_del(entry); +- dma_entry_free(entry); +- + put_hash_bucket(bucket, flags); ++ ++ /* ++ * Free the entry outside of bucket_lock to avoid ABBA deadlocks ++ * between that and radix_lock. ++ */ ++ dma_entry_free(entry); + } + + static void check_for_stack(struct device *dev, +-- +2.43.0 + diff --git a/queue-6.6/drm-amdgpu-clear-rb_overflow-bit-when-enabling-inter.patch b/queue-6.6/drm-amdgpu-clear-rb_overflow-bit-when-enabling-inter.patch new file mode 100644 index 00000000000..a1b63ea9ef5 --- /dev/null +++ b/queue-6.6/drm-amdgpu-clear-rb_overflow-bit-when-enabling-inter.patch @@ -0,0 +1,73 @@ +From c8e5a4600c63c1232a415bf5f54baef901ff1d83 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 18 Jul 2024 18:01:23 -0400 +Subject: drm/amdgpu: clear RB_OVERFLOW bit when enabling interrupts for + vega20_ih + +From: Victor Lu + +[ Upstream commit 8b22f048331dfd45fdfbf0efdfb1d43deff7518d ] + +Port this change to vega20_ih.c: +commit afbf7955ff01 ("drm/amdgpu: clear RB_OVERFLOW bit when enabling interrupts") + +Original commit message: +"Why: +Setting IH_RB_WPTR register to 0 will not clear the RB_OVERFLOW bit +if RB_ENABLE is not set. + +How to fix: +Set WPTR_OVERFLOW_CLEAR bit after RB_ENABLE bit is set. +The RB_ENABLE bit is required to be set, together with +WPTR_OVERFLOW_ENABLE bit so that setting WPTR_OVERFLOW_CLEAR bit +would clear the RB_OVERFLOW." + +Signed-off-by: Victor Lu +Reviewed-by: Alex Deucher +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/amdgpu/vega20_ih.c | 27 ++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) + +diff --git a/drivers/gpu/drm/amd/amdgpu/vega20_ih.c b/drivers/gpu/drm/amd/amdgpu/vega20_ih.c +index 131e7b769519c..8ab2011e82098 100644 +--- a/drivers/gpu/drm/amd/amdgpu/vega20_ih.c ++++ b/drivers/gpu/drm/amd/amdgpu/vega20_ih.c +@@ -114,6 +114,33 @@ static int vega20_ih_toggle_ring_interrupts(struct amdgpu_device *adev, + tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, RB_ENABLE, (enable ? 1 : 0)); + tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, RB_GPU_TS_ENABLE, 1); + ++ if (enable) { ++ /* Unset the CLEAR_OVERFLOW bit to make sure the next step ++ * is switching the bit from 0 to 1 ++ */ ++ tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 0); ++ if (amdgpu_sriov_vf(adev) && amdgpu_sriov_reg_indirect_ih(adev)) { ++ if (psp_reg_program(&adev->psp, ih_regs->psp_reg_id, tmp)) ++ return -ETIMEDOUT; ++ } else { ++ WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp); ++ } ++ ++ /* Clear RB_OVERFLOW bit */ ++ tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 1); ++ if (amdgpu_sriov_vf(adev) && amdgpu_sriov_reg_indirect_ih(adev)) { ++ if (psp_reg_program(&adev->psp, ih_regs->psp_reg_id, tmp)) ++ return -ETIMEDOUT; ++ } else { ++ WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp); ++ } ++ ++ /* Unset the CLEAR_OVERFLOW bit immediately so new overflows ++ * can be detected. ++ */ ++ tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 0); ++ } ++ + /* enable_intr field is only valid in ring0 */ + if (ih == &adev->irq.ih) + tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, ENABLE_INTR, (enable ? 1 : 0)); +-- +2.43.0 + diff --git a/queue-6.6/drm-amdgpu-dereference-the-atcs-acpi-buffer.patch b/queue-6.6/drm-amdgpu-dereference-the-atcs-acpi-buffer.patch new file mode 100644 index 00000000000..bcf2c63cb42 --- /dev/null +++ b/queue-6.6/drm-amdgpu-dereference-the-atcs-acpi-buffer.patch @@ -0,0 +1,36 @@ +From 57ea7741295b5d2b68138e18b0b068fff3bdd224 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Oct 2024 14:54:31 +0800 +Subject: drm/amdgpu: Dereference the ATCS ACPI buffer + +From: Prike Liang + +[ Upstream commit 32e7ee293ff476c67b51be006e986021967bc525 ] + +Need to dereference the atcs acpi buffer after +the method is executed, otherwise it will result in +a memory leak. + +Signed-off-by: Prike Liang +Reviewed-by: Alex Deucher +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c +index 12a0ac42fcfea..8b2f2b921d9de 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c +@@ -798,6 +798,7 @@ int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev, + return -EIO; + } + ++ kfree(info); + return 0; + } + +-- +2.43.0 + diff --git a/queue-6.6/drm-amdgpu-refine-error-handling-in-amdgpu_ttm_tt_pi.patch b/queue-6.6/drm-amdgpu-refine-error-handling-in-amdgpu_ttm_tt_pi.patch new file mode 100644 index 00000000000..e40788ced63 --- /dev/null +++ b/queue-6.6/drm-amdgpu-refine-error-handling-in-amdgpu_ttm_tt_pi.patch @@ -0,0 +1,44 @@ +From 949ad81266f280799f6019d9ce1e887ee5236781 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 18 Oct 2024 17:21:09 +0800 +Subject: drm/amdgpu: refine error handling in amdgpu_ttm_tt_pin_userptr + +From: Lang Yu + +[ Upstream commit 46186667f98fb7158c98f4ff5da62c427761ffcd ] + +Free sg table when dma_map_sgtable() failed to avoid memory leak. + +Signed-off-by: Lang Yu +Reviewed-by: Alex Deucher +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +index 8c3fb1562ffef..6f06183e82b2b 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +@@ -794,7 +794,7 @@ static int amdgpu_ttm_tt_pin_userptr(struct ttm_device *bdev, + /* Map SG to device */ + r = dma_map_sgtable(adev->dev, ttm->sg, direction, 0); + if (r) +- goto release_sg; ++ goto release_sg_table; + + /* convert SG to linear array of pages and dma addresses */ + drm_prime_sg_to_dma_addr_array(ttm->sg, gtt->ttm.dma_address, +@@ -802,6 +802,8 @@ static int amdgpu_ttm_tt_pin_userptr(struct ttm_device *bdev, + + return 0; + ++release_sg_table: ++ sg_free_table(ttm->sg); + release_sg: + kfree(ttm->sg); + ttm->sg = NULL; +-- +2.43.0 + diff --git a/queue-6.6/drm-amdgpu-set-the-right-amdgpu-sg-segment-limitatio.patch b/queue-6.6/drm-amdgpu-set-the-right-amdgpu-sg-segment-limitatio.patch new file mode 100644 index 00000000000..fa5f2d818f8 --- /dev/null +++ b/queue-6.6/drm-amdgpu-set-the-right-amdgpu-sg-segment-limitatio.patch @@ -0,0 +1,85 @@ +From 4a768f534d70b4aceebe88057cb76749334fdd61 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 31 Oct 2024 10:59:17 +0800 +Subject: drm/amdgpu: set the right AMDGPU sg segment limitation +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Prike Liang + +[ Upstream commit e2e97435783979124ba92d6870415c57ecfef6a5 ] + +The driver needs to set the correct max_segment_size; +otherwise debug_dma_map_sg() will complain about the +over-mapping of the AMDGPU sg length as following: + +WARNING: CPU: 6 PID: 1964 at kernel/dma/debug.c:1178 debug_dma_map_sg+0x2dc/0x370 +[ 364.049444] Modules linked in: veth amdgpu(OE) amdxcp drm_exec gpu_sched drm_buddy drm_ttm_helper ttm(OE) drm_suballoc_helper drm_display_helper drm_kms_helper i2c_algo_bit rpcsec_gss_krb5 auth_rpcgss nfsv4 nfs lockd grace netfs xt_conntrack xt_MASQUERADE nf_conntrack_netlink xfrm_user xfrm_algo iptable_nat xt_addrtype iptable_filter br_netfilter nvme_fabrics overlay nfnetlink_cttimeout nfnetlink openvswitch nsh nf_conncount nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 libcrc32c bridge stp llc amd_atl intel_rapl_msr intel_rapl_common sunrpc sch_fq_codel snd_hda_codec_realtek snd_hda_codec_generic snd_hda_scodec_component snd_hda_codec_hdmi snd_hda_intel snd_intel_dspcfg edac_mce_amd binfmt_misc snd_hda_codec snd_pci_acp6x snd_hda_core snd_acp_config snd_hwdep snd_soc_acpi kvm_amd snd_pcm kvm snd_seq_midi snd_seq_midi_event crct10dif_pclmul ghash_clmulni_intel sha512_ssse3 snd_rawmidi sha256_ssse3 sha1_ssse3 aesni_intel snd_seq nls_iso8859_1 crypto_simd snd_seq_device cryptd snd_timer rapl input_leds snd +[ 364.049532] ipmi_devintf wmi_bmof ccp serio_raw k10temp sp5100_tco soundcore ipmi_msghandler cm32181 industrialio mac_hid msr parport_pc ppdev lp parport drm efi_pstore ip_tables x_tables pci_stub crc32_pclmul nvme ahci libahci i2c_piix4 r8169 nvme_core i2c_designware_pci realtek i2c_ccgx_ucsi video wmi hid_generic cdc_ether usbnet usbhid hid r8152 mii +[ 364.049576] CPU: 6 PID: 1964 Comm: rocminfo Tainted: G OE 6.10.0-custom #492 +[ 364.049579] Hardware name: AMD Majolica-RN/Majolica-RN, BIOS RMJ1009A 06/13/2021 +[ 364.049582] RIP: 0010:debug_dma_map_sg+0x2dc/0x370 +[ 364.049585] Code: 89 4d b8 e8 36 b1 86 00 8b 4d b8 48 8b 55 b0 44 8b 45 a8 4c 8b 4d a0 48 89 c6 48 c7 c7 00 4b 74 bc 4c 89 4d b8 e8 b4 73 f3 ff <0f> 0b 4c 8b 4d b8 8b 15 c8 2c b8 01 85 d2 0f 85 ee fd ff ff 8b 05 +[ 364.049588] RSP: 0018:ffff9ca600b57ac0 EFLAGS: 00010286 +[ 364.049590] RAX: 0000000000000000 RBX: ffff88b7c132b0c8 RCX: 0000000000000027 +[ 364.049592] RDX: ffff88bb0f521688 RSI: 0000000000000001 RDI: ffff88bb0f521680 +[ 364.049594] RBP: ffff9ca600b57b20 R08: 000000000000006f R09: ffff9ca600b57930 +[ 364.049596] R10: ffff9ca600b57928 R11: ffffffffbcb46328 R12: 0000000000000000 +[ 364.049597] R13: 0000000000000001 R14: ffff88b7c19c0700 R15: ffff88b7c9059800 +[ 364.049599] FS: 00007fb2d3516e80(0000) GS:ffff88bb0f500000(0000) knlGS:0000000000000000 +[ 364.049601] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 +[ 364.049603] CR2: 000055610bd03598 CR3: 00000001049f6000 CR4: 0000000000350ef0 +[ 364.049605] Call Trace: +[ 364.049607] +[ 364.049609] ? show_regs+0x6d/0x80 +[ 364.049614] ? __warn+0x8c/0x140 +[ 364.049618] ? debug_dma_map_sg+0x2dc/0x370 +[ 364.049621] ? report_bug+0x193/0x1a0 +[ 364.049627] ? handle_bug+0x46/0x80 +[ 364.049631] ? exc_invalid_op+0x1d/0x80 +[ 364.049635] ? asm_exc_invalid_op+0x1f/0x30 +[ 364.049642] ? debug_dma_map_sg+0x2dc/0x370 +[ 364.049647] __dma_map_sg_attrs+0x90/0xe0 +[ 364.049651] dma_map_sgtable+0x25/0x40 +[ 364.049654] amdgpu_bo_move+0x59a/0x850 [amdgpu] +[ 364.049935] ? srso_return_thunk+0x5/0x5f +[ 364.049939] ? amdgpu_ttm_tt_populate+0x5d/0xc0 [amdgpu] +[ 364.050095] ttm_bo_handle_move_mem+0xc3/0x180 [ttm] +[ 364.050103] ttm_bo_validate+0xc1/0x160 [ttm] +[ 364.050108] ? amdgpu_ttm_tt_get_user_pages+0xe5/0x1b0 [amdgpu] +[ 364.050263] amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu+0xa12/0xc90 [amdgpu] +[ 364.050473] kfd_ioctl_alloc_memory_of_gpu+0x16b/0x3b0 [amdgpu] +[ 364.050680] kfd_ioctl+0x3c2/0x530 [amdgpu] +[ 364.050866] ? __pfx_kfd_ioctl_alloc_memory_of_gpu+0x10/0x10 [amdgpu] +[ 364.051054] ? srso_return_thunk+0x5/0x5f +[ 364.051057] ? tomoyo_file_ioctl+0x20/0x30 +[ 364.051063] __x64_sys_ioctl+0x9c/0xd0 +[ 364.051068] x64_sys_call+0x1219/0x20d0 +[ 364.051073] do_syscall_64+0x51/0x120 +[ 364.051077] entry_SYSCALL_64_after_hwframe+0x76/0x7e +[ 364.051081] RIP: 0033:0x7fb2d2f1a94f + +Signed-off-by: Prike Liang +Reviewed-by: Christian König +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +index 6f06183e82b2b..c89264242bea3 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +@@ -1835,6 +1835,7 @@ int amdgpu_ttm_init(struct amdgpu_device *adev) + + mutex_init(&adev->mman.gtt_window_lock); + ++ dma_set_max_seg_size(adev->dev, UINT_MAX); + /* No others user of address space so set it to 0 */ + r = ttm_device_init(&adev->mman.bdev, &amdgpu_bo_driver, adev->dev, + adev_to_drm(adev)->anon_inode->i_mapping, +-- +2.43.0 + diff --git a/queue-6.6/drm-amdgpu-skip-amdgpu_device_cache_pci_state-under-.patch b/queue-6.6/drm-amdgpu-skip-amdgpu_device_cache_pci_state-under-.patch new file mode 100644 index 00000000000..0b4ba06a946 --- /dev/null +++ b/queue-6.6/drm-amdgpu-skip-amdgpu_device_cache_pci_state-under-.patch @@ -0,0 +1,41 @@ +From 7b675b636faf96ef3edc5611485f26df5bb31aa3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 24 Oct 2024 13:40:39 +0800 +Subject: drm/amdgpu: skip amdgpu_device_cache_pci_state under sriov + +From: Victor Zhao + +[ Upstream commit afe260df55ac280cd56306248cb6d8a6b0db095c ] + +Under sriov, host driver will save and restore vf pci cfg space during +reset. And during device init, under sriov, pci_restore_state happens after +fullaccess released, and it can have race condition with mmio protection +enable from host side leading to missing interrupts. + +So skip amdgpu_device_cache_pci_state for sriov. + +Signed-off-by: Victor Zhao +Acked-by: Lijo Lazar +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +index cd2d99e00b5d9..2e739b80cfccf 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +@@ -5841,6 +5841,9 @@ bool amdgpu_device_cache_pci_state(struct pci_dev *pdev) + struct amdgpu_device *adev = drm_to_adev(dev); + int r; + ++ if (amdgpu_sriov_vf(adev)) ++ return false; ++ + r = pci_save_state(pdev); + if (!r) { + kfree(adev->pci_state); +-- +2.43.0 + diff --git a/queue-6.6/drm-amdgpu-vcn-reset-fw_shared-when-vcpu-buffers-cor.patch b/queue-6.6/drm-amdgpu-vcn-reset-fw_shared-when-vcpu-buffers-cor.patch new file mode 100644 index 00000000000..ab15a97af67 --- /dev/null +++ b/queue-6.6/drm-amdgpu-vcn-reset-fw_shared-when-vcpu-buffers-cor.patch @@ -0,0 +1,104 @@ +From f373f63650ac4b94a2e721cb368953fecef1bbbd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Nov 2024 16:59:30 +0800 +Subject: drm/amdgpu/vcn: reset fw_shared when VCPU buffers corrupted on vcn + v4.0.3 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Xiang Liu + +[ Upstream commit 928cd772e18ffbd7723cb2361db4a8ccf2222235 ] + +It is not necessarily corrupted. When there is RAS fatal error, device +memory access is blocked. Hence vcpu bo cannot be saved to system memory +as in a regular suspend sequence before going for reset. In other full +device reset cases, that gets saved and restored during resume. + +v2: Remove redundant code like vcn_v4_0 did +v2: Refine commit message +v3: Drop the volatile +v3: Refine commit message + +Signed-off-by: Xiang Liu +Acked-by: Christian König +Reviewed-by: Stanley.Yang +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c | 30 ++++++++++++++++++------- + 1 file changed, 22 insertions(+), 8 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c +index f85d18cd74eca..e80c4f5b4f402 100644 +--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c ++++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c +@@ -77,6 +77,20 @@ static int vcn_v4_0_3_early_init(void *handle) + return amdgpu_vcn_early_init(adev); + } + ++static int vcn_v4_0_3_fw_shared_init(struct amdgpu_device *adev, int inst_idx) ++{ ++ struct amdgpu_vcn4_fw_shared *fw_shared; ++ ++ fw_shared = adev->vcn.inst[inst_idx].fw_shared.cpu_addr; ++ fw_shared->present_flag_0 = cpu_to_le32(AMDGPU_FW_SHARED_FLAG_0_UNIFIED_QUEUE); ++ fw_shared->sq.is_enabled = 1; ++ ++ if (amdgpu_vcnfw_log) ++ amdgpu_vcn_fwlog_init(&adev->vcn.inst[inst_idx]); ++ ++ return 0; ++} ++ + /** + * vcn_v4_0_3_sw_init - sw init for VCN block + * +@@ -107,8 +121,6 @@ static int vcn_v4_0_3_sw_init(void *handle) + return r; + + for (i = 0; i < adev->vcn.num_vcn_inst; i++) { +- volatile struct amdgpu_vcn4_fw_shared *fw_shared; +- + vcn_inst = GET_INST(VCN, i); + + ring = &adev->vcn.inst[i].ring_enc[0]; +@@ -131,12 +143,7 @@ static int vcn_v4_0_3_sw_init(void *handle) + if (r) + return r; + +- fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr; +- fw_shared->present_flag_0 = cpu_to_le32(AMDGPU_FW_SHARED_FLAG_0_UNIFIED_QUEUE); +- fw_shared->sq.is_enabled = true; +- +- if (amdgpu_vcnfw_log) +- amdgpu_vcn_fwlog_init(&adev->vcn.inst[i]); ++ vcn_v4_0_3_fw_shared_init(adev, i); + } + + if (amdgpu_sriov_vf(adev)) { +@@ -221,6 +228,8 @@ static int vcn_v4_0_3_hw_init(void *handle) + } + } else { + for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { ++ struct amdgpu_vcn4_fw_shared *fw_shared; ++ + vcn_inst = GET_INST(VCN, i); + ring = &adev->vcn.inst[i].ring_enc[0]; + +@@ -244,6 +253,11 @@ static int vcn_v4_0_3_hw_init(void *handle) + regVCN_RB1_DB_CTRL); + } + ++ /* Re-init fw_shared when RAS fatal error occurred */ ++ fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr; ++ if (!fw_shared->sq.is_enabled) ++ vcn_v4_0_3_fw_shared_init(adev, i); ++ + r = amdgpu_ring_test_helper(ring); + if (r) + goto done; +-- +2.43.0 + diff --git a/queue-6.6/drm-bridge-it6505-enable-module-autoloading.patch b/queue-6.6/drm-bridge-it6505-enable-module-autoloading.patch new file mode 100644 index 00000000000..ad592fa0e5e --- /dev/null +++ b/queue-6.6/drm-bridge-it6505-enable-module-autoloading.patch @@ -0,0 +1,36 @@ +From 249ea3773f763d56e085dff43c77343669ce08a2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 2 Sep 2024 11:33:18 +0000 +Subject: drm/bridge: it6505: Enable module autoloading + +From: Liao Chen + +[ Upstream commit 1e2ab24cd708b1c864ff983ee1504c0a409d2f8e ] + +Add MODULE_DEVICE_TABLE(), so modules could be properly autoloaded based +on the alias from of_device_id table. + +Signed-off-by: Liao Chen +Reviewed-by: Neil Armstrong +Link: https://patchwork.freedesktop.org/patch/msgid/20240902113320.903147-2-liaochen4@huawei.com +Signed-off-by: Dmitry Baryshkov +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/bridge/ite-it6505.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/gpu/drm/bridge/ite-it6505.c b/drivers/gpu/drm/bridge/ite-it6505.c +index 2a7c620626a03..26d3b9b843267 100644 +--- a/drivers/gpu/drm/bridge/ite-it6505.c ++++ b/drivers/gpu/drm/bridge/ite-it6505.c +@@ -3503,6 +3503,7 @@ static const struct of_device_id it6505_of_match[] = { + { .compatible = "ite,it6505" }, + { } + }; ++MODULE_DEVICE_TABLE(of, it6505_of_match); + + static struct i2c_driver it6505_i2c_driver = { + .driver = { +-- +2.43.0 + diff --git a/queue-6.6/drm-display-fix-building-with-gcc-15.patch b/queue-6.6/drm-display-fix-building-with-gcc-15.patch new file mode 100644 index 00000000000..e62b75bcc1e --- /dev/null +++ b/queue-6.6/drm-display-fix-building-with-gcc-15.patch @@ -0,0 +1,55 @@ +From d35d3da68de0843f1a1dcb19afbd542e63524e0a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 2 Oct 2024 14:53:11 +0530 +Subject: drm/display: Fix building with GCC 15 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Brahmajit Das + +[ Upstream commit a500f3751d3c861be7e4463c933cf467240cca5d ] + +GCC 15 enables -Werror=unterminated-string-initialization by default. +This results in the following build error + +drivers/gpu/drm/display/drm_dp_dual_mode_helper.c: In function ‘is_hdmi_adaptor’: +drivers/gpu/drm/display/drm_dp_dual_mode_helper.c:164:17: error: initializer-string for array of + ‘char’ is too long [-Werror=unterminated-string-initialization] + 164 | "DP-HDMI ADAPTOR\x04"; + | ^~~~~~~~~~~~~~~~~~~~~ + +After discussion with Ville, the fix was to increase the size of +dp_dual_mode_hdmi_id array by one, so that it can accommodate the NULL +line character. This should let us build the kernel with GCC 15. + +Signed-off-by: Brahmajit Das +Reviewed-by: Jani Nikula +Link: https://patchwork.freedesktop.org/patch/msgid/20241002092311.942822-1-brahmajit.xyz@gmail.com +Signed-off-by: Jani Nikula +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/display/drm_dp_dual_mode_helper.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/display/drm_dp_dual_mode_helper.c b/drivers/gpu/drm/display/drm_dp_dual_mode_helper.c +index bd61e20770a5b..719da3610310f 100644 +--- a/drivers/gpu/drm/display/drm_dp_dual_mode_helper.c ++++ b/drivers/gpu/drm/display/drm_dp_dual_mode_helper.c +@@ -160,11 +160,11 @@ EXPORT_SYMBOL(drm_dp_dual_mode_write); + + static bool is_hdmi_adaptor(const char hdmi_id[DP_DUAL_MODE_HDMI_ID_LEN]) + { +- static const char dp_dual_mode_hdmi_id[DP_DUAL_MODE_HDMI_ID_LEN] = ++ static const char dp_dual_mode_hdmi_id[DP_DUAL_MODE_HDMI_ID_LEN + 1] = + "DP-HDMI ADAPTOR\x04"; + + return memcmp(hdmi_id, dp_dual_mode_hdmi_id, +- sizeof(dp_dual_mode_hdmi_id)) == 0; ++ DP_DUAL_MODE_HDMI_ID_LEN) == 0; + } + + static bool is_type1_adaptor(uint8_t adaptor_id) +-- +2.43.0 + diff --git a/queue-6.6/drm-mcde-enable-module-autoloading.patch b/queue-6.6/drm-mcde-enable-module-autoloading.patch new file mode 100644 index 00000000000..05251f0612d --- /dev/null +++ b/queue-6.6/drm-mcde-enable-module-autoloading.patch @@ -0,0 +1,36 @@ +From 6534b42e77ba599fdbd537cdddf527a38504c279 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 2 Sep 2024 11:33:20 +0000 +Subject: drm/mcde: Enable module autoloading + +From: Liao Chen + +[ Upstream commit 8a16b5cdae26207ff4c22834559384ad3d7bc970 ] + +Add MODULE_DEVICE_TABLE(), so modules could be properly autoloaded based +on the alias from of_device_id table. + +Signed-off-by: Liao Chen +Reviewed-by: Linus Walleij +Link: https://patchwork.freedesktop.org/patch/msgid/20240902113320.903147-4-liaochen4@huawei.com +Signed-off-by: Dmitry Baryshkov +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/mcde/mcde_drv.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/gpu/drm/mcde/mcde_drv.c b/drivers/gpu/drm/mcde/mcde_drv.c +index a2572fb311f08..753f261dad678 100644 +--- a/drivers/gpu/drm/mcde/mcde_drv.c ++++ b/drivers/gpu/drm/mcde/mcde_drv.c +@@ -465,6 +465,7 @@ static const struct of_device_id mcde_of_match[] = { + }, + {}, + }; ++MODULE_DEVICE_TABLE(of, mcde_of_match); + + static struct platform_driver mcde_driver = { + .driver = { +-- +2.43.0 + diff --git a/queue-6.6/drm-panel-orientation-quirks-add-quirk-for-aya-neo-2.patch b/queue-6.6/drm-panel-orientation-quirks-add-quirk-for-aya-neo-2.patch new file mode 100644 index 00000000000..715f63afe52 --- /dev/null +++ b/queue-6.6/drm-panel-orientation-quirks-add-quirk-for-aya-neo-2.patch @@ -0,0 +1,51 @@ +From b6fb9c41fc9b8378820410296ffbf7102e9ab7c7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 16 Sep 2024 15:18:51 +0200 +Subject: drm: panel-orientation-quirks: Add quirk for AYA NEO 2 model +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Joaquín Ignacio Aramendía + +[ Upstream commit 361ebf5ef843b0aa1704c72eb26b91cf76c3c5b7 ] + +Add quirk orientation for AYA NEO 2. The name appears without spaces in +DMI strings. That made it difficult to reuse the 2021 match. Also the +display is larger in resolution. + +Tested by the JELOS team that has been patching their own kernel for a +while now and confirmed by users in the AYA NEO and ChimeraOS discord +servers. + +Signed-off-by: Joaquín Ignacio Aramendía +Signed-off-by: Tobias Jakobi +Reviewed-by: Dmitry Baryshkov +Reviewed-by: Hans de Goede +Link: https://patchwork.freedesktop.org/patch/msgid/2b35545b77a9fd8c9699b751ca282226dcecb1dd.1726492131.git.tjakobi@math.uni-bielefeld.de +Signed-off-by: Dmitry Baryshkov +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/drm_panel_orientation_quirks.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/drivers/gpu/drm/drm_panel_orientation_quirks.c b/drivers/gpu/drm/drm_panel_orientation_quirks.c +index 259a0c765bafb..55635c7bfcefc 100644 +--- a/drivers/gpu/drm/drm_panel_orientation_quirks.c ++++ b/drivers/gpu/drm/drm_panel_orientation_quirks.c +@@ -184,6 +184,12 @@ static const struct dmi_system_id orientation_data[] = { + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T103HAF"), + }, + .driver_data = (void *)&lcd800x1280_rightside_up, ++ }, { /* AYA NEO AYANEO 2 */ ++ .matches = { ++ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYANEO"), ++ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "AYANEO 2"), ++ }, ++ .driver_data = (void *)&lcd1200x1920_rightside_up, + }, { /* AYA NEO 2021 */ + .matches = { + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYADEVICE"), +-- +2.43.0 + diff --git a/queue-6.6/drm-panel-orientation-quirks-add-quirk-for-aya-neo-f.patch b/queue-6.6/drm-panel-orientation-quirks-add-quirk-for-aya-neo-f.patch new file mode 100644 index 00000000000..022990ef2cb --- /dev/null +++ b/queue-6.6/drm-panel-orientation-quirks-add-quirk-for-aya-neo-f.patch @@ -0,0 +1,52 @@ +From 8bd67d68ad0532eae292393b7602fa601ce1870f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 16 Sep 2024 15:18:53 +0200 +Subject: drm: panel-orientation-quirks: Add quirk for AYA NEO Founder edition +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Joaquín Ignacio Aramendía + +[ Upstream commit d7972d735ca80a40a571bf753c138263981a5698 ] + +Add quirk orientation for AYA NEO Founder. The name appears with spaces in +DMI strings as other devices of the brand. The panel is the same as the +NEXT and 2021 models. Those could not be reused as the former has VENDOR +name as "AYANEO" without spaces and the latter has "AYADEVICE". + +Tested by the JELOS team that has been patching their own kernel for a +while now and confirmed by users in the AYA NEO and ChimeraOS discord +servers. + +Signed-off-by: Joaquín Ignacio Aramendía +Signed-off-by: Tobias Jakobi +Reviewed-by: Dmitry Baryshkov +Reviewed-by: Hans de Goede +Link: https://patchwork.freedesktop.org/patch/msgid/f71889a0b39f13f4b78481bd030377ca15035680.1726492131.git.tjakobi@math.uni-bielefeld.de +Signed-off-by: Dmitry Baryshkov +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/drm_panel_orientation_quirks.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/drivers/gpu/drm/drm_panel_orientation_quirks.c b/drivers/gpu/drm/drm_panel_orientation_quirks.c +index 55635c7bfcefc..2ee14c6b6fd62 100644 +--- a/drivers/gpu/drm/drm_panel_orientation_quirks.c ++++ b/drivers/gpu/drm/drm_panel_orientation_quirks.c +@@ -202,6 +202,12 @@ static const struct dmi_system_id orientation_data[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "AIR"), + }, + .driver_data = (void *)&lcd1080x1920_leftside_up, ++ }, { /* AYA NEO Founder */ ++ .matches = { ++ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYA NEO"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "AYA NEO Founder"), ++ }, ++ .driver_data = (void *)&lcd800x1280_rightside_up, + }, { /* AYA NEO NEXT */ + .matches = { + DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AYANEO"), +-- +2.43.0 + diff --git a/queue-6.6/drm-panel-orientation-quirks-add-quirk-for-aya-neo-g.patch b/queue-6.6/drm-panel-orientation-quirks-add-quirk-for-aya-neo-g.patch new file mode 100644 index 00000000000..12f6e683fda --- /dev/null +++ b/queue-6.6/drm-panel-orientation-quirks-add-quirk-for-aya-neo-g.patch @@ -0,0 +1,52 @@ +From 8ac7feb0f2e517a3ab54abf7678c6b5196034a78 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 16 Sep 2024 15:18:55 +0200 +Subject: drm: panel-orientation-quirks: Add quirk for AYA NEO GEEK +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Joaquín Ignacio Aramendía + +[ Upstream commit 428656feb972ca99200fc127b5aecb574efd9d3d ] + +Add quirk orientation for AYA NEO GEEK. The name appears without +spaces in DMI strings. The board name is completely different to +the previous models making it difficult to reuse their quirks +despite being the same resolution and using the same orientation. + +Tested by the JELOS team that has been patching their own kernel for a +while now and confirmed by users in the AYA NEO and ChimeraOS discord +servers. + +Signed-off-by: Joaquín Ignacio Aramendía +Signed-off-by: Tobias Jakobi +Reviewed-by: Dmitry Baryshkov +Reviewed-by: Hans de Goede +Link: https://patchwork.freedesktop.org/patch/msgid/40350b0d63fe2b54e7cba1e14be50917203f0079.1726492131.git.tjakobi@math.uni-bielefeld.de +Signed-off-by: Dmitry Baryshkov +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/drm_panel_orientation_quirks.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/drivers/gpu/drm/drm_panel_orientation_quirks.c b/drivers/gpu/drm/drm_panel_orientation_quirks.c +index 2ee14c6b6fd62..c00f6f16244c0 100644 +--- a/drivers/gpu/drm/drm_panel_orientation_quirks.c ++++ b/drivers/gpu/drm/drm_panel_orientation_quirks.c +@@ -208,6 +208,12 @@ static const struct dmi_system_id orientation_data[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "AYA NEO Founder"), + }, + .driver_data = (void *)&lcd800x1280_rightside_up, ++ }, { /* AYA NEO GEEK */ ++ .matches = { ++ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYANEO"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "GEEK"), ++ }, ++ .driver_data = (void *)&lcd800x1280_rightside_up, + }, { /* AYA NEO NEXT */ + .matches = { + DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AYANEO"), +-- +2.43.0 + diff --git a/queue-6.6/drm-panel-simple-add-microchip-ac69t88a-lvds-display.patch b/queue-6.6/drm-panel-simple-add-microchip-ac69t88a-lvds-display.patch new file mode 100644 index 00000000000..e9fa2192bcb --- /dev/null +++ b/queue-6.6/drm-panel-simple-add-microchip-ac69t88a-lvds-display.patch @@ -0,0 +1,72 @@ +From 9f7d3e67d8da095101c8e0a10c81341c1a762058 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 19 Sep 2024 14:45:48 +0530 +Subject: drm/panel: simple: Add Microchip AC69T88A LVDS Display panel + +From: Manikandan Muralidharan + +[ Upstream commit 40da1463cd6879f542238b36c1148f517927c595 ] + +Add support for Microchip AC69T88A 5 inch TFT LCD 800x480 +Display module with LVDS interface.The panel uses the Sitronix +ST7262 800x480 Display driver + +Signed-off-by: Manikandan Muralidharan +Signed-off-by: Dharma Balasubiramani +Reviewed-by: Dmitry Baryshkov +Link: https://patchwork.freedesktop.org/patch/msgid/20240919091548.430285-2-manikandan.m@microchip.com +Signed-off-by: Dmitry Baryshkov +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/panel/panel-simple.c | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c +index 11ade6bac592f..37fe54c34b141 100644 +--- a/drivers/gpu/drm/panel/panel-simple.c ++++ b/drivers/gpu/drm/panel/panel-simple.c +@@ -4087,6 +4087,31 @@ static const struct panel_desc yes_optoelectronics_ytc700tlag_05_201c = { + .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + ++static const struct drm_display_mode mchp_ac69t88a_mode = { ++ .clock = 25000, ++ .hdisplay = 800, ++ .hsync_start = 800 + 88, ++ .hsync_end = 800 + 88 + 5, ++ .htotal = 800 + 88 + 5 + 40, ++ .vdisplay = 480, ++ .vsync_start = 480 + 23, ++ .vsync_end = 480 + 23 + 5, ++ .vtotal = 480 + 23 + 5 + 1, ++}; ++ ++static const struct panel_desc mchp_ac69t88a = { ++ .modes = &mchp_ac69t88a_mode, ++ .num_modes = 1, ++ .bpc = 8, ++ .size = { ++ .width = 108, ++ .height = 65, ++ }, ++ .bus_flags = DRM_BUS_FLAG_DE_HIGH, ++ .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, ++}; ++ + static const struct drm_display_mode arm_rtsm_mode[] = { + { + .clock = 65000, +@@ -4522,6 +4547,9 @@ static const struct of_device_id platform_of_match[] = { + }, { + .compatible = "yes-optoelectronics,ytc700tlag-05-201c", + .data = &yes_optoelectronics_ytc700tlag_05_201c, ++ }, { ++ .compatible = "microchip,ac69t88a", ++ .data = &mchp_ac69t88a, + }, { + /* Must be the last entry */ + .compatible = "panel-dpi", +-- +2.43.0 + diff --git a/queue-6.6/drm-radeon-r600_cs-fix-possible-int-overflow-in-r600.patch b/queue-6.6/drm-radeon-r600_cs-fix-possible-int-overflow-in-r600.patch new file mode 100644 index 00000000000..ca6c885aee8 --- /dev/null +++ b/queue-6.6/drm-radeon-r600_cs-fix-possible-int-overflow-in-r600.patch @@ -0,0 +1,40 @@ +From 833c52816071b380189a66ba0ed23f12a9a530a3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 27 Sep 2024 18:07:19 +0300 +Subject: drm/radeon/r600_cs: Fix possible int overflow in r600_packet3_check() + +From: Igor Artemiev + +[ Upstream commit a1e2da6a5072f8abe5b0feaa91a5bcd9dc544a04 ] + +It is possible, although unlikely, that an integer overflow will occur +when the result of radeon_get_ib_value() is shifted to the left. + +Avoid it by casting one of the operands to larger data type (u64). + +Found by Linux Verification Center (linuxtesting.org) with static +analysis tool SVACE. + +Signed-off-by: Igor Artemiev +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/radeon/r600_cs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c +index 1b2d31c4d77ca..ac77d1246b945 100644 +--- a/drivers/gpu/drm/radeon/r600_cs.c ++++ b/drivers/gpu/drm/radeon/r600_cs.c +@@ -2104,7 +2104,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, + return -EINVAL; + } + +- offset = radeon_get_ib_value(p, idx+1) << 8; ++ offset = (u64)radeon_get_ib_value(p, idx+1) << 8; + if (offset != track->vgt_strmout_bo_offset[idx_value]) { + DRM_ERROR("bad STRMOUT_BASE_UPDATE, bo offset does not match: 0x%llx, 0x%x\n", + offset, track->vgt_strmout_bo_offset[idx_value]); +-- +2.43.0 + diff --git a/queue-6.6/drm-sched-memset-job-in-drm_sched_job_init.patch b/queue-6.6/drm-sched-memset-job-in-drm_sched_job_init.patch new file mode 100644 index 00000000000..2f7bed172bd --- /dev/null +++ b/queue-6.6/drm-sched-memset-job-in-drm_sched_job_init.patch @@ -0,0 +1,56 @@ +From d051caa97cc983fa6ee9c641d78f7a38d7020b27 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 21 Oct 2024 12:50:28 +0200 +Subject: drm/sched: memset() 'job' in drm_sched_job_init() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Philipp Stanner + +[ Upstream commit 2320c9e6a768d135c7b0039995182bb1a4e4fd22 ] + +drm_sched_job_init() has no control over how users allocate struct +drm_sched_job. Unfortunately, the function can also not set some struct +members such as job->sched. + +This could theoretically lead to UB by users dereferencing the struct's +pointer members too early. + +It is easier to debug such issues if these pointers are initialized to +NULL, so dereferencing them causes a NULL pointer exception. +Accordingly, drm_sched_entity_init() does precisely that and initializes +its struct with memset(). + +Initialize parameter "job" to 0 in drm_sched_job_init(). + +Signed-off-by: Philipp Stanner +Link: https://patchwork.freedesktop.org/patch/msgid/20241021105028.19794-2-pstanner@redhat.com +Reviewed-by: Christian König +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/scheduler/sched_main.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c +index 5a3a622fc672f..fa4652f234718 100644 +--- a/drivers/gpu/drm/scheduler/sched_main.c ++++ b/drivers/gpu/drm/scheduler/sched_main.c +@@ -635,6 +635,14 @@ int drm_sched_job_init(struct drm_sched_job *job, + if (!entity->rq) + return -ENOENT; + ++ /* ++ * We don't know for sure how the user has allocated. Thus, zero the ++ * struct so that unallowed (i.e., too early) usage of pointers that ++ * this function does not set is guaranteed to lead to a NULL pointer ++ * exception instead of UB. ++ */ ++ memset(job, 0, sizeof(*job)); ++ + job->entity = entity; + job->s_fence = drm_sched_fence_alloc(entity, owner); + if (!job->s_fence) +-- +2.43.0 + diff --git a/queue-6.6/drm-vc4-hdmi-avoid-log-spam-for-audio-start-failure.patch b/queue-6.6/drm-vc4-hdmi-avoid-log-spam-for-audio-start-failure.patch new file mode 100644 index 00000000000..c50309fa665 --- /dev/null +++ b/queue-6.6/drm-vc4-hdmi-avoid-log-spam-for-audio-start-failure.patch @@ -0,0 +1,46 @@ +From 7f4bc5c7299fe6e2bfecedf2f26a8c4da87b7f33 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 21 Jun 2024 16:20:28 +0100 +Subject: drm/vc4: hdmi: Avoid log spam for audio start failure + +From: Dom Cobley + +[ Upstream commit b4e5646178e86665f5caef2894578600f597098a ] + +We regularly get dmesg error reports of: +[ 18.184066] hdmi-audio-codec hdmi-audio-codec.3.auto: ASoC: error at snd_soc_dai_startup on i2s-hifi: -19 +[ 18.184098] MAI: soc_pcm_open() failed (-19) + +These are generated for any disconnected hdmi interface when pulseaudio +attempts to open the associated ALSA device (numerous times). Each open +generates a kernel error message, generating general log spam. + +The error messages all come from _soc_pcm_ret in sound/soc/soc-pcm.c#L39 +which suggests returning ENOTSUPP, rather that ENODEV will be quiet. +And indeed it is. + +Signed-off-by: Dom Cobley +Reviewed-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20240621152055.4180873-5-dave.stevenson@raspberrypi.com +Signed-off-by: Dave Stevenson +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index d4487f4cb3034..1727d447786f1 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -2396,7 +2396,7 @@ static int vc4_hdmi_audio_startup(struct device *dev, void *data) + } + + if (!vc4_hdmi_audio_can_stream(vc4_hdmi)) { +- ret = -ENODEV; ++ ret = -ENOTSUPP; + goto out_dev_exit; + } + +-- +2.43.0 + diff --git a/queue-6.6/drm-vc4-hvs-set-axi-panic-modes-for-the-hvs.patch b/queue-6.6/drm-vc4-hvs-set-axi-panic-modes-for-the-hvs.patch new file mode 100644 index 00000000000..01209a3a649 --- /dev/null +++ b/queue-6.6/drm-vc4-hvs-set-axi-panic-modes-for-the-hvs.patch @@ -0,0 +1,51 @@ +From 5f8c9d78485b9673d05ed59a0eee5d48d0325e30 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 21 Jun 2024 16:20:30 +0100 +Subject: drm/vc4: hvs: Set AXI panic modes for the HVS + +From: Dave Stevenson + +[ Upstream commit 014eccc9da7bfc76a3107fceea37dd60f1d63630 ] + +The HVS can change AXI request mode based on how full the COB +FIFOs are. +Until now the vc4 driver has been relying on the firmware to +have set these to sensible values. + +With HVS channel 2 now being used for live video, change the +panic mode for all channels to be explicitly set by the driver, +and the same for all channels. + +Reviewed-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20240621152055.4180873-7-dave.stevenson@raspberrypi.com +Signed-off-by: Dave Stevenson +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_hvs.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/drivers/gpu/drm/vc4/vc4_hvs.c b/drivers/gpu/drm/vc4/vc4_hvs.c +index 008352166579e..bea1b3d35cdd3 100644 +--- a/drivers/gpu/drm/vc4/vc4_hvs.c ++++ b/drivers/gpu/drm/vc4/vc4_hvs.c +@@ -956,6 +956,17 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data) + SCALER_DISPCTRL_SCLEIRQ); + + ++ /* Set AXI panic mode. ++ * VC4 panics when < 2 lines in FIFO. ++ * VC5 panics when less than 1 line in the FIFO. ++ */ ++ dispctrl &= ~(SCALER_DISPCTRL_PANIC0_MASK | ++ SCALER_DISPCTRL_PANIC1_MASK | ++ SCALER_DISPCTRL_PANIC2_MASK); ++ dispctrl |= VC4_SET_FIELD(2, SCALER_DISPCTRL_PANIC0); ++ dispctrl |= VC4_SET_FIELD(2, SCALER_DISPCTRL_PANIC1); ++ dispctrl |= VC4_SET_FIELD(2, SCALER_DISPCTRL_PANIC2); ++ + /* Set AXI panic mode. + * VC4 panics when < 2 lines in FIFO. + * VC5 panics when less than 1 line in the FIFO. +-- +2.43.0 + diff --git a/queue-6.6/dsa-qca8k-use-nested-lock-to-avoid-splat.patch b/queue-6.6/dsa-qca8k-use-nested-lock-to-avoid-splat.patch new file mode 100644 index 00000000000..ee493fa93eb --- /dev/null +++ b/queue-6.6/dsa-qca8k-use-nested-lock-to-avoid-splat.patch @@ -0,0 +1,39 @@ +From 1a1bcd16f25330bbc2bdf32d99874d6ef56f648a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 10 Nov 2024 18:59:55 +0100 +Subject: dsa: qca8k: Use nested lock to avoid splat + +From: Andrew Lunn + +[ Upstream commit 078e0d596f7b5952dad8662ace8f20ed2165e2ce ] + +qca8k_phy_eth_command() is used to probe the child MDIO bus while the +parent MDIO is locked. This causes lockdep splat, reporting a possible +deadlock. It is not an actually deadlock, because different locks are +used. By making use of mutex_lock_nested() we can avoid this false +positive. + +Signed-off-by: Andrew Lunn +Link: https://patch.msgid.link/20241110175955.3053664-1-andrew@lunn.ch +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/dsa/qca/qca8k-8xxx.c b/drivers/net/dsa/qca/qca8k-8xxx.c +index 17c28fe2d7433..384ae32c05b1c 100644 +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -673,7 +673,7 @@ qca8k_phy_eth_command(struct qca8k_priv *priv, bool read, int phy, + * We therefore need to lock the MDIO bus onto which the switch is + * connected. + */ +- mutex_lock(&priv->bus->mdio_lock); ++ mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); + + /* Actually start the request: + * 1. Send mdio master packet +-- +2.43.0 + diff --git a/queue-6.6/epoll-annotate-racy-check.patch b/queue-6.6/epoll-annotate-racy-check.patch new file mode 100644 index 00000000000..e243a569cba --- /dev/null +++ b/queue-6.6/epoll-annotate-racy-check.patch @@ -0,0 +1,64 @@ +From b5b6c900402fc55721fe9c29ac010456a630ead5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 25 Sep 2024 11:05:16 +0200 +Subject: epoll: annotate racy check + +From: Christian Brauner + +[ Upstream commit 6474353a5e3d0b2cf610153cea0c61f576a36d0a ] + +Epoll relies on a racy fastpath check during __fput() in +eventpoll_release() to avoid the hit of pointlessly acquiring a +semaphore. Annotate that race by using WRITE_ONCE() and READ_ONCE(). + +Link: https://lore.kernel.org/r/66edfb3c.050a0220.3195df.001a.GAE@google.com +Link: https://lore.kernel.org/r/20240925-fungieren-anbauen-79b334b00542@brauner +Reviewed-by: Jan Kara +Reported-by: syzbot+3b6b32dc50537a49bb4a@syzkaller.appspotmail.com +Signed-off-by: Christian Brauner +Signed-off-by: Sasha Levin +--- + fs/eventpoll.c | 6 ++++-- + include/linux/eventpoll.h | 2 +- + 2 files changed, 5 insertions(+), 3 deletions(-) + +diff --git a/fs/eventpoll.c b/fs/eventpoll.c +index 0ed73bc7d4652..bcaad495930c3 100644 +--- a/fs/eventpoll.c ++++ b/fs/eventpoll.c +@@ -741,7 +741,8 @@ static bool __ep_remove(struct eventpoll *ep, struct epitem *epi, bool force) + to_free = NULL; + head = file->f_ep; + if (head->first == &epi->fllink && !epi->fllink.next) { +- file->f_ep = NULL; ++ /* See eventpoll_release() for details. */ ++ WRITE_ONCE(file->f_ep, NULL); + if (!is_file_epoll(file)) { + struct epitems_head *v; + v = container_of(head, struct epitems_head, epitems); +@@ -1498,7 +1499,8 @@ static int attach_epitem(struct file *file, struct epitem *epi) + spin_unlock(&file->f_lock); + goto allocate; + } +- file->f_ep = head; ++ /* See eventpoll_release() for details. */ ++ WRITE_ONCE(file->f_ep, head); + to_free = NULL; + } + hlist_add_head_rcu(&epi->fllink, file->f_ep); +diff --git a/include/linux/eventpoll.h b/include/linux/eventpoll.h +index 3337745d81bd6..0c0d00fcd131f 100644 +--- a/include/linux/eventpoll.h ++++ b/include/linux/eventpoll.h +@@ -42,7 +42,7 @@ static inline void eventpoll_release(struct file *file) + * because the file in on the way to be removed and nobody ( but + * eventpoll ) has still a reference to this file. + */ +- if (likely(!file->f_ep)) ++ if (likely(!READ_ONCE(file->f_ep))) + return; + + /* +-- +2.43.0 + diff --git a/queue-6.6/f2fs-fix-f2fs_bug_on-when-uninstalling-filesystem-ca.patch b/queue-6.6/f2fs-fix-f2fs_bug_on-when-uninstalling-filesystem-ca.patch new file mode 100644 index 00000000000..57f1003b96a --- /dev/null +++ b/queue-6.6/f2fs-fix-f2fs_bug_on-when-uninstalling-filesystem-ca.patch @@ -0,0 +1,85 @@ +From 6a9c51e0a4c64fb9f77b4f8e4b4e71e19e94ae35 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 18 Sep 2024 02:44:00 -0600 +Subject: f2fs: fix f2fs_bug_on when uninstalling filesystem call + f2fs_evict_inode. + +From: Qi Han + +[ Upstream commit d5c367ef8287fb4d235c46a2f8c8d68715f3a0ca ] + +creating a large files during checkpoint disable until it runs out of +space and then delete it, then remount to enable checkpoint again, and +then unmount the filesystem triggers the f2fs_bug_on as below: + +------------[ cut here ]------------ +kernel BUG at fs/f2fs/inode.c:896! +CPU: 2 UID: 0 PID: 1286 Comm: umount Not tainted 6.11.0-rc7-dirty #360 +Oops: invalid opcode: 0000 [#1] PREEMPT SMP NOPTI +RIP: 0010:f2fs_evict_inode+0x58c/0x610 +Call Trace: + __die_body+0x15/0x60 + die+0x33/0x50 + do_trap+0x10a/0x120 + f2fs_evict_inode+0x58c/0x610 + do_error_trap+0x60/0x80 + f2fs_evict_inode+0x58c/0x610 + exc_invalid_op+0x53/0x60 + f2fs_evict_inode+0x58c/0x610 + asm_exc_invalid_op+0x16/0x20 + f2fs_evict_inode+0x58c/0x610 + evict+0x101/0x260 + dispose_list+0x30/0x50 + evict_inodes+0x140/0x190 + generic_shutdown_super+0x2f/0x150 + kill_block_super+0x11/0x40 + kill_f2fs_super+0x7d/0x140 + deactivate_locked_super+0x2a/0x70 + cleanup_mnt+0xb3/0x140 + task_work_run+0x61/0x90 + +The root cause is: creating large files during disable checkpoint +period results in not enough free segments, so when writing back root +inode will failed in f2fs_enable_checkpoint. When umount the file +system after enabling checkpoint, the root inode is dirty in +f2fs_evict_inode function, which triggers BUG_ON. The steps to +reproduce are as follows: + +dd if=/dev/zero of=f2fs.img bs=1M count=55 +mount f2fs.img f2fs_dir -o checkpoint=disable:10% +dd if=/dev/zero of=big bs=1M count=50 +sync +rm big +mount -o remount,checkpoint=enable f2fs_dir +umount f2fs_dir + +Let's redirty inode when there is not free segments during checkpoint +is disable. + +Signed-off-by: Qi Han +Reviewed-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/inode.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c +index a3e0c92735433..7ad4a92417591 100644 +--- a/fs/f2fs/inode.c ++++ b/fs/f2fs/inode.c +@@ -788,8 +788,10 @@ int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc) + !is_inode_flag_set(inode, FI_DIRTY_INODE)) + return 0; + +- if (!f2fs_is_checkpoint_ready(sbi)) ++ if (!f2fs_is_checkpoint_ready(sbi)) { ++ f2fs_mark_inode_dirty_sync(inode, true); + return -ENOSPC; ++ } + + /* + * We need to balance fs here to prevent from producing dirty node pages +-- +2.43.0 + diff --git a/queue-6.6/f2fs-fix-to-shrink-read-extent-node-in-batches.patch b/queue-6.6/f2fs-fix-to-shrink-read-extent-node-in-batches.patch new file mode 100644 index 00000000000..3b4bb07ee2b --- /dev/null +++ b/queue-6.6/f2fs-fix-to-shrink-read-extent-node-in-batches.patch @@ -0,0 +1,181 @@ +From fc586c1ec16a99e5e7120428999e182774e8a466 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Nov 2024 09:57:50 +0800 +Subject: f2fs: fix to shrink read extent node in batches + +From: Chao Yu + +[ Upstream commit 3fc5d5a182f6a1f8bd4dc775feb54c369dd2c343 ] + +We use rwlock to protect core structure data of extent tree during +its shrink, however, if there is a huge number of extent nodes in +extent tree, during shrink of extent tree, it may hold rwlock for +a very long time, which may trigger kernel hang issue. + +This patch fixes to shrink read extent node in batches, so that, +critical region of the rwlock can be shrunk to avoid its extreme +long time hold. + +Reported-by: Xiuhong Wang +Closes: https://lore.kernel.org/linux-f2fs-devel/20241112110627.1314632-1-xiuhong.wang@unisoc.com/ +Signed-off-by: Xiuhong Wang +Signed-off-by: Zhiguo Niu +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/extent_cache.c | 69 +++++++++++++++++++++++++----------------- + 1 file changed, 41 insertions(+), 28 deletions(-) + +diff --git a/fs/f2fs/extent_cache.c b/fs/f2fs/extent_cache.c +index d6fb053b6dfbb..bfa2d89dc9ea3 100644 +--- a/fs/f2fs/extent_cache.c ++++ b/fs/f2fs/extent_cache.c +@@ -347,21 +347,22 @@ static struct extent_tree *__grab_extent_tree(struct inode *inode, + } + + static unsigned int __free_extent_tree(struct f2fs_sb_info *sbi, +- struct extent_tree *et) ++ struct extent_tree *et, unsigned int nr_shrink) + { + struct rb_node *node, *next; + struct extent_node *en; +- unsigned int count = atomic_read(&et->node_cnt); ++ unsigned int count; + + node = rb_first_cached(&et->root); +- while (node) { ++ ++ for (count = 0; node && count < nr_shrink; count++) { + next = rb_next(node); + en = rb_entry(node, struct extent_node, rb_node); + __release_extent_node(sbi, et, en); + node = next; + } + +- return count - atomic_read(&et->node_cnt); ++ return count; + } + + static void __drop_largest_extent(struct extent_tree *et, +@@ -580,6 +581,30 @@ static struct extent_node *__insert_extent_tree(struct f2fs_sb_info *sbi, + return en; + } + ++static unsigned int __destroy_extent_node(struct inode *inode, ++ enum extent_type type) ++{ ++ struct f2fs_sb_info *sbi = F2FS_I_SB(inode); ++ struct extent_tree *et = F2FS_I(inode)->extent_tree[type]; ++ unsigned int nr_shrink = type == EX_READ ? ++ READ_EXTENT_CACHE_SHRINK_NUMBER : ++ AGE_EXTENT_CACHE_SHRINK_NUMBER; ++ unsigned int node_cnt = 0; ++ ++ if (!et || !atomic_read(&et->node_cnt)) ++ return 0; ++ ++ while (atomic_read(&et->node_cnt)) { ++ write_lock(&et->lock); ++ node_cnt += __free_extent_tree(sbi, et, nr_shrink); ++ write_unlock(&et->lock); ++ } ++ ++ f2fs_bug_on(sbi, atomic_read(&et->node_cnt)); ++ ++ return node_cnt; ++} ++ + static void __update_extent_tree_range(struct inode *inode, + struct extent_info *tei, enum extent_type type) + { +@@ -718,9 +743,6 @@ static void __update_extent_tree_range(struct inode *inode, + } + } + +- if (is_inode_flag_set(inode, FI_NO_EXTENT)) +- __free_extent_tree(sbi, et); +- + if (et->largest_updated) { + et->largest_updated = false; + updated = true; +@@ -738,6 +760,9 @@ static void __update_extent_tree_range(struct inode *inode, + out_read_extent_cache: + write_unlock(&et->lock); + ++ if (is_inode_flag_set(inode, FI_NO_EXTENT)) ++ __destroy_extent_node(inode, EX_READ); ++ + if (updated) + f2fs_mark_inode_dirty_sync(inode, true); + } +@@ -902,10 +927,14 @@ static unsigned int __shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink + list_for_each_entry_safe(et, next, &eti->zombie_list, list) { + if (atomic_read(&et->node_cnt)) { + write_lock(&et->lock); +- node_cnt += __free_extent_tree(sbi, et); ++ node_cnt += __free_extent_tree(sbi, et, ++ nr_shrink - node_cnt - tree_cnt); + write_unlock(&et->lock); + } +- f2fs_bug_on(sbi, atomic_read(&et->node_cnt)); ++ ++ if (atomic_read(&et->node_cnt)) ++ goto unlock_out; ++ + list_del_init(&et->list); + radix_tree_delete(&eti->extent_tree_root, et->ino); + kmem_cache_free(extent_tree_slab, et); +@@ -1044,23 +1073,6 @@ unsigned int f2fs_shrink_age_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink + return __shrink_extent_tree(sbi, nr_shrink, EX_BLOCK_AGE); + } + +-static unsigned int __destroy_extent_node(struct inode *inode, +- enum extent_type type) +-{ +- struct f2fs_sb_info *sbi = F2FS_I_SB(inode); +- struct extent_tree *et = F2FS_I(inode)->extent_tree[type]; +- unsigned int node_cnt = 0; +- +- if (!et || !atomic_read(&et->node_cnt)) +- return 0; +- +- write_lock(&et->lock); +- node_cnt = __free_extent_tree(sbi, et); +- write_unlock(&et->lock); +- +- return node_cnt; +-} +- + void f2fs_destroy_extent_node(struct inode *inode) + { + __destroy_extent_node(inode, EX_READ); +@@ -1069,7 +1081,6 @@ void f2fs_destroy_extent_node(struct inode *inode) + + static void __drop_extent_tree(struct inode *inode, enum extent_type type) + { +- struct f2fs_sb_info *sbi = F2FS_I_SB(inode); + struct extent_tree *et = F2FS_I(inode)->extent_tree[type]; + bool updated = false; + +@@ -1077,7 +1088,6 @@ static void __drop_extent_tree(struct inode *inode, enum extent_type type) + return; + + write_lock(&et->lock); +- __free_extent_tree(sbi, et); + if (type == EX_READ) { + set_inode_flag(inode, FI_NO_EXTENT); + if (et->largest.len) { +@@ -1086,6 +1096,9 @@ static void __drop_extent_tree(struct inode *inode, enum extent_type type) + } + } + write_unlock(&et->lock); ++ ++ __destroy_extent_node(inode, type); ++ + if (updated) + f2fs_mark_inode_dirty_sync(inode, true); + } +-- +2.43.0 + diff --git a/queue-6.6/f2fs-print-message-if-fscorrupted-was-found-in-f2fs_.patch b/queue-6.6/f2fs-print-message-if-fscorrupted-was-found-in-f2fs_.patch new file mode 100644 index 00000000000..8fbec7f0d36 --- /dev/null +++ b/queue-6.6/f2fs-print-message-if-fscorrupted-was-found-in-f2fs_.patch @@ -0,0 +1,44 @@ +From 4841872fc8ce88ad1e3b7ee08bfd1e1f2848eaa0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Nov 2024 14:58:50 +0800 +Subject: f2fs: print message if fscorrupted was found in f2fs_new_node_page() + +From: Chao Yu + +[ Upstream commit 81520c684ca67aea6a589461a3caebb9b11dcc90 ] + +If fs corruption occurs in f2fs_new_node_page(), let's print +more information about corrupted metadata into kernel log. + +Meanwhile, it updates to record ERROR_INCONSISTENT_NAT instead +of ERROR_INVALID_BLKADDR if blkaddr in nat entry is not +NULL_ADDR which means nat bitmap and nat entry is inconsistent. + +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/node.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c +index a9ab93d30dceb..dedba481b66d0 100644 +--- a/fs/f2fs/node.c ++++ b/fs/f2fs/node.c +@@ -1331,7 +1331,12 @@ struct page *f2fs_new_node_page(struct dnode_of_data *dn, unsigned int ofs) + err = -EFSCORRUPTED; + dec_valid_node_count(sbi, dn->inode, !ofs); + set_sbi_flag(sbi, SBI_NEED_FSCK); +- f2fs_handle_error(sbi, ERROR_INVALID_BLKADDR); ++ f2fs_warn_ratelimited(sbi, ++ "f2fs_new_node_page: inconsistent nat entry, " ++ "ino:%u, nid:%u, blkaddr:%u, ver:%u, flag:%u", ++ new_ni.ino, new_ni.nid, new_ni.blk_addr, ++ new_ni.version, new_ni.flag); ++ f2fs_handle_error(sbi, ERROR_INCONSISTENT_NAT); + goto fail; + } + #endif +-- +2.43.0 + diff --git a/queue-6.6/fanotify-allow-reporting-errors-on-failure-to-open-f.patch b/queue-6.6/fanotify-allow-reporting-errors-on-failure-to-open-f.patch new file mode 100644 index 00000000000..0193eb4188f --- /dev/null +++ b/queue-6.6/fanotify-allow-reporting-errors-on-failure-to-open-f.patch @@ -0,0 +1,231 @@ +From 1ed2bfa84fc2a2f94caad0716c064e617e75d0e1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 3 Oct 2024 16:29:22 +0200 +Subject: fanotify: allow reporting errors on failure to open fd + +From: Amir Goldstein + +[ Upstream commit 522249f05c5551aec9ec0ba9b6438f1ec19c138d ] + +When working in "fd mode", fanotify_read() needs to open an fd +from a dentry to report event->fd to userspace. + +Opening an fd from dentry can fail for several reasons. +For example, when tasks are gone and we try to open their +/proc files or we try to open a WRONLY file like in sysfs +or when trying to open a file that was deleted on the +remote network server. + +Add a new flag FAN_REPORT_FD_ERROR for fanotify_init(). +For a group with FAN_REPORT_FD_ERROR, we will send the +event with the error instead of the open fd, otherwise +userspace may not get the error at all. + +For an overflow event, we report -EBADF to avoid confusing FAN_NOFD +with -EPERM. Similarly for pidfd open errors we report either -ESRCH +or the open error instead of FAN_NOPIDFD and FAN_EPIDFD. + +In any case, userspace will not know which file failed to +open, so add a debug print for further investigation. + +Reported-by: Krishna Vivek Vitta +Link: https://lore.kernel.org/linux-fsdevel/SI2P153MB07182F3424619EDDD1F393EED46D2@SI2P153MB0718.APCP153.PROD.OUTLOOK.COM/ +Signed-off-by: Amir Goldstein +Signed-off-by: Jan Kara +Link: https://patch.msgid.link/20241003142922.111539-1-amir73il@gmail.com +Signed-off-by: Sasha Levin +--- + fs/notify/fanotify/fanotify_user.c | 85 +++++++++++++++++------------- + include/linux/fanotify.h | 1 + + include/uapi/linux/fanotify.h | 1 + + 3 files changed, 50 insertions(+), 37 deletions(-) + +diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c +index 62fe0b679e586..f4798d613dc22 100644 +--- a/fs/notify/fanotify/fanotify_user.c ++++ b/fs/notify/fanotify/fanotify_user.c +@@ -267,13 +267,6 @@ static int create_fd(struct fsnotify_group *group, const struct path *path, + group->fanotify_data.f_flags | __FMODE_NONOTIFY, + current_cred()); + if (IS_ERR(new_file)) { +- /* +- * we still send an event even if we can't open the file. this +- * can happen when say tasks are gone and we try to open their +- * /proc files or we try to open a WRONLY file like in sysfs +- * we just send the errno to userspace since there isn't much +- * else we can do. +- */ + put_unused_fd(client_fd); + client_fd = PTR_ERR(new_file); + } else { +@@ -664,7 +657,7 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group, + unsigned int info_mode = FAN_GROUP_FLAG(group, FANOTIFY_INFO_MODES); + unsigned int pidfd_mode = info_mode & FAN_REPORT_PIDFD; + struct file *f = NULL, *pidfd_file = NULL; +- int ret, pidfd = FAN_NOPIDFD, fd = FAN_NOFD; ++ int ret, pidfd = -ESRCH, fd = -EBADF; + + pr_debug("%s: group=%p event=%p\n", __func__, group, event); + +@@ -692,10 +685,39 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group, + if (!FAN_GROUP_FLAG(group, FANOTIFY_UNPRIV) && + path && path->mnt && path->dentry) { + fd = create_fd(group, path, &f); +- if (fd < 0) +- return fd; ++ /* ++ * Opening an fd from dentry can fail for several reasons. ++ * For example, when tasks are gone and we try to open their ++ * /proc files or we try to open a WRONLY file like in sysfs ++ * or when trying to open a file that was deleted on the ++ * remote network server. ++ * ++ * For a group with FAN_REPORT_FD_ERROR, we will send the ++ * event with the error instead of the open fd, otherwise ++ * Userspace may not get the error at all. ++ * In any case, userspace will not know which file failed to ++ * open, so add a debug print for further investigation. ++ */ ++ if (fd < 0) { ++ pr_debug("fanotify: create_fd(%pd2) failed err=%d\n", ++ path->dentry, fd); ++ if (!FAN_GROUP_FLAG(group, FAN_REPORT_FD_ERROR)) { ++ /* ++ * Historically, we've handled EOPENSTALE in a ++ * special way and silently dropped such ++ * events. Now we have to keep it to maintain ++ * backward compatibility... ++ */ ++ if (fd == -EOPENSTALE) ++ fd = 0; ++ return fd; ++ } ++ } + } +- metadata.fd = fd; ++ if (FAN_GROUP_FLAG(group, FAN_REPORT_FD_ERROR)) ++ metadata.fd = fd; ++ else ++ metadata.fd = fd >= 0 ? fd : FAN_NOFD; + + if (pidfd_mode) { + /* +@@ -710,18 +732,16 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group, + * The PIDTYPE_TGID check for an event->pid is performed + * preemptively in an attempt to catch out cases where the event + * listener reads events after the event generating process has +- * already terminated. Report FAN_NOPIDFD to the event listener +- * in those cases, with all other pidfd creation errors being +- * reported as FAN_EPIDFD. ++ * already terminated. Depending on flag FAN_REPORT_FD_ERROR, ++ * report either -ESRCH or FAN_NOPIDFD to the event listener in ++ * those cases with all other pidfd creation errors reported as ++ * the error code itself or as FAN_EPIDFD. + */ +- if (metadata.pid == 0 || +- !pid_has_task(event->pid, PIDTYPE_TGID)) { +- pidfd = FAN_NOPIDFD; +- } else { ++ if (metadata.pid && pid_has_task(event->pid, PIDTYPE_TGID)) + pidfd = pidfd_prepare(event->pid, 0, &pidfd_file); +- if (pidfd < 0) +- pidfd = FAN_EPIDFD; +- } ++ ++ if (!FAN_GROUP_FLAG(group, FAN_REPORT_FD_ERROR) && pidfd < 0) ++ pidfd = pidfd == -ESRCH ? FAN_NOPIDFD : FAN_EPIDFD; + } + + ret = -EFAULT; +@@ -738,9 +758,6 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group, + buf += FAN_EVENT_METADATA_LEN; + count -= FAN_EVENT_METADATA_LEN; + +- if (fanotify_is_perm_event(event->mask)) +- FANOTIFY_PERM(event)->fd = fd; +- + if (info_mode) { + ret = copy_info_records_to_user(event, info, info_mode, pidfd, + buf, count); +@@ -754,15 +771,18 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group, + if (pidfd_file) + fd_install(pidfd, pidfd_file); + ++ if (fanotify_is_perm_event(event->mask)) ++ FANOTIFY_PERM(event)->fd = fd; ++ + return metadata.event_len; + + out_close_fd: +- if (fd != FAN_NOFD) { ++ if (f) { + put_unused_fd(fd); + fput(f); + } + +- if (pidfd >= 0) { ++ if (pidfd_file) { + put_unused_fd(pidfd); + fput(pidfd_file); + } +@@ -829,15 +849,6 @@ static ssize_t fanotify_read(struct file *file, char __user *buf, + } + + ret = copy_event_to_user(group, event, buf, count); +- if (unlikely(ret == -EOPENSTALE)) { +- /* +- * We cannot report events with stale fd so drop it. +- * Setting ret to 0 will continue the event loop and +- * do the right thing if there are no more events to +- * read (i.e. return bytes read, -EAGAIN or wait). +- */ +- ret = 0; +- } + + /* + * Permission events get queued to wait for response. Other +@@ -846,7 +857,7 @@ static ssize_t fanotify_read(struct file *file, char __user *buf, + if (!fanotify_is_perm_event(event->mask)) { + fsnotify_destroy_event(group, &event->fse); + } else { +- if (ret <= 0) { ++ if (ret <= 0 || FANOTIFY_PERM(event)->fd < 0) { + spin_lock(&group->notification_lock); + finish_permission_event(group, + FANOTIFY_PERM(event), FAN_DENY, NULL); +@@ -1932,7 +1943,7 @@ static int __init fanotify_user_setup(void) + FANOTIFY_DEFAULT_MAX_USER_MARKS); + + BUILD_BUG_ON(FANOTIFY_INIT_FLAGS & FANOTIFY_INTERNAL_GROUP_FLAGS); +- BUILD_BUG_ON(HWEIGHT32(FANOTIFY_INIT_FLAGS) != 12); ++ BUILD_BUG_ON(HWEIGHT32(FANOTIFY_INIT_FLAGS) != 13); + BUILD_BUG_ON(HWEIGHT32(FANOTIFY_MARK_FLAGS) != 11); + + fanotify_mark_cache = KMEM_CACHE(fsnotify_mark, +diff --git a/include/linux/fanotify.h b/include/linux/fanotify.h +index 4f1c4f6031180..89ff45bd6f01b 100644 +--- a/include/linux/fanotify.h ++++ b/include/linux/fanotify.h +@@ -36,6 +36,7 @@ + #define FANOTIFY_ADMIN_INIT_FLAGS (FANOTIFY_PERM_CLASSES | \ + FAN_REPORT_TID | \ + FAN_REPORT_PIDFD | \ ++ FAN_REPORT_FD_ERROR | \ + FAN_UNLIMITED_QUEUE | \ + FAN_UNLIMITED_MARKS) + +diff --git a/include/uapi/linux/fanotify.h b/include/uapi/linux/fanotify.h +index cd14c94e9a1e0..2aae6dd706a91 100644 +--- a/include/uapi/linux/fanotify.h ++++ b/include/uapi/linux/fanotify.h +@@ -60,6 +60,7 @@ + #define FAN_REPORT_DIR_FID 0x00000400 /* Report unique directory id */ + #define FAN_REPORT_NAME 0x00000800 /* Report events with name */ + #define FAN_REPORT_TARGET_FID 0x00001000 /* Report dirent target id */ ++#define FAN_REPORT_FD_ERROR 0x00002000 /* event->fd can report error */ + + /* Convenience macro - FAN_REPORT_NAME requires FAN_REPORT_DIR_FID */ + #define FAN_REPORT_DFID_NAME (FAN_REPORT_DIR_FID | FAN_REPORT_NAME) +-- +2.43.0 + diff --git a/queue-6.6/fs-ntfs3-fix-case-when-unmarked-clusters-intersect-w.patch b/queue-6.6/fs-ntfs3-fix-case-when-unmarked-clusters-intersect-w.patch new file mode 100644 index 00000000000..9c458df21bc --- /dev/null +++ b/queue-6.6/fs-ntfs3-fix-case-when-unmarked-clusters-intersect-w.patch @@ -0,0 +1,86 @@ +From a90a4ab20743865d1d64d321e67b82c7f215d9e3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Oct 2024 20:09:24 +0300 +Subject: fs/ntfs3: Fix case when unmarked clusters intersect with zone + +From: Konstantin Komarov + +[ Upstream commit 5fc982fe7eca9d0cf7b25832450ebd4f7c8e1c36 ] + +Reported-by: syzbot+7f3761b790fa41d0f3d5@syzkaller.appspotmail.com +Signed-off-by: Konstantin Komarov +Signed-off-by: Sasha Levin +--- + fs/ntfs3/run.c | 40 ++++++++++++++++++++++++++++++---------- + 1 file changed, 30 insertions(+), 10 deletions(-) + +diff --git a/fs/ntfs3/run.c b/fs/ntfs3/run.c +index cb8cf0161177b..44e93ad491ba7 100644 +--- a/fs/ntfs3/run.c ++++ b/fs/ntfs3/run.c +@@ -1053,8 +1053,8 @@ int run_unpack_ex(struct runs_tree *run, struct ntfs_sb_info *sbi, CLST ino, + { + int ret, err; + CLST next_vcn, lcn, len; +- size_t index; +- bool ok; ++ size_t index, done; ++ bool ok, zone; + struct wnd_bitmap *wnd; + + ret = run_unpack(run, sbi, ino, svcn, evcn, vcn, run_buf, run_buf_size); +@@ -1085,8 +1085,9 @@ int run_unpack_ex(struct runs_tree *run, struct ntfs_sb_info *sbi, CLST ino, + continue; + + down_read_nested(&wnd->rw_lock, BITMAP_MUTEX_CLUSTERS); ++ zone = max(wnd->zone_bit, lcn) < min(wnd->zone_end, lcn + len); + /* Check for free blocks. */ +- ok = wnd_is_used(wnd, lcn, len); ++ ok = !zone && wnd_is_used(wnd, lcn, len); + up_read(&wnd->rw_lock); + if (ok) + continue; +@@ -1094,14 +1095,33 @@ int run_unpack_ex(struct runs_tree *run, struct ntfs_sb_info *sbi, CLST ino, + /* Looks like volume is corrupted. */ + ntfs_set_state(sbi, NTFS_DIRTY_ERROR); + +- if (down_write_trylock(&wnd->rw_lock)) { +- /* Mark all zero bits as used in range [lcn, lcn+len). */ +- size_t done; +- err = wnd_set_used_safe(wnd, lcn, len, &done); +- up_write(&wnd->rw_lock); +- if (err) +- return err; ++ if (!down_write_trylock(&wnd->rw_lock)) ++ continue; ++ ++ if (zone) { ++ /* ++ * Range [lcn, lcn + len) intersects with zone. ++ * To avoid complex with zone just turn it off. ++ */ ++ wnd_zone_set(wnd, 0, 0); ++ } ++ ++ /* Mark all zero bits as used in range [lcn, lcn+len). */ ++ err = wnd_set_used_safe(wnd, lcn, len, &done); ++ if (zone) { ++ /* Restore zone. Lock mft run. */ ++ struct rw_semaphore *lock; ++ lock = is_mounted(sbi) ? &sbi->mft.ni->file.run_lock : ++ NULL; ++ if (lock) ++ down_read(lock); ++ ntfs_refresh_zone(sbi); ++ if (lock) ++ up_read(lock); + } ++ up_write(&wnd->rw_lock); ++ if (err) ++ return err; + } + + return ret; +-- +2.43.0 + diff --git a/queue-6.6/fsl-fman-validate-cell-index-value-obtained-from-dev.patch b/queue-6.6/fsl-fman-validate-cell-index-value-obtained-from-dev.patch new file mode 100644 index 00000000000..69a7f8f9610 --- /dev/null +++ b/queue-6.6/fsl-fman-validate-cell-index-value-obtained-from-dev.patch @@ -0,0 +1,75 @@ +From 3f2bf0898bfa1211747f0e0e341eb36df69fdb06 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 28 Oct 2024 09:58:24 +0300 +Subject: fsl/fman: Validate cell-index value obtained from Device Tree + +From: Aleksandr Mishin + +[ Upstream commit bd50c4125c98bd1a86f8e514872159700a9c678c ] + +Cell-index value is obtained from Device Tree and then used to calculate +the index for accessing arrays port_mfl[], mac_mfl[] and intr_mng[]. +In case of broken DT due to any error cell-index can contain any value +and it is possible to go beyond the array boundaries which can lead +at least to memory corruption. + +Validate cell-index value obtained from Device Tree. + +Found by Linux Verification Center (linuxtesting.org) with SVACE. + +Reviewed-by: Sean Anderson +Signed-off-by: Aleksandr Mishin +Link: https://patch.msgid.link/20241028065824.15452-1-amishin@t-argos.ru +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/freescale/fman/fman.c | 1 - + drivers/net/ethernet/freescale/fman/fman.h | 3 +++ + drivers/net/ethernet/freescale/fman/mac.c | 5 +++++ + 3 files changed, 8 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/freescale/fman/fman.c b/drivers/net/ethernet/freescale/fman/fman.c +index d96028f01770c..fb416d60dcd72 100644 +--- a/drivers/net/ethernet/freescale/fman/fman.c ++++ b/drivers/net/ethernet/freescale/fman/fman.c +@@ -24,7 +24,6 @@ + + /* General defines */ + #define FMAN_LIODN_TBL 64 /* size of LIODN table */ +-#define MAX_NUM_OF_MACS 10 + #define FM_NUM_OF_FMAN_CTRL_EVENT_REGS 4 + #define BASE_RX_PORTID 0x08 + #define BASE_TX_PORTID 0x28 +diff --git a/drivers/net/ethernet/freescale/fman/fman.h b/drivers/net/ethernet/freescale/fman/fman.h +index 2ea575a46675b..74eb62eba0d7f 100644 +--- a/drivers/net/ethernet/freescale/fman/fman.h ++++ b/drivers/net/ethernet/freescale/fman/fman.h +@@ -74,6 +74,9 @@ + #define BM_MAX_NUM_OF_POOLS 64 /* Buffers pools */ + #define FMAN_PORT_MAX_EXT_POOLS_NUM 8 /* External BM pools per Rx port */ + ++/* General defines */ ++#define MAX_NUM_OF_MACS 10 ++ + struct fman; /* FMan data */ + + /* Enum for defining port types */ +diff --git a/drivers/net/ethernet/freescale/fman/mac.c b/drivers/net/ethernet/freescale/fman/mac.c +index 11da139082e1b..1916a2ac48b9f 100644 +--- a/drivers/net/ethernet/freescale/fman/mac.c ++++ b/drivers/net/ethernet/freescale/fman/mac.c +@@ -259,6 +259,11 @@ static int mac_probe(struct platform_device *_of_dev) + err = -EINVAL; + goto _return_dev_put; + } ++ if (val >= MAX_NUM_OF_MACS) { ++ dev_err(dev, "cell-index value is too big for %pOF\n", mac_node); ++ err = -EINVAL; ++ goto _return_dev_put; ++ } + priv->cell_index = (u8)val; + + /* Get the MAC address */ +-- +2.43.0 + diff --git a/queue-6.6/hid-add-per-device-quirk-to-force-bind-to-hid-generi.patch b/queue-6.6/hid-add-per-device-quirk-to-force-bind-to-hid-generi.patch new file mode 100644 index 00000000000..50ec2aae1b0 --- /dev/null +++ b/queue-6.6/hid-add-per-device-quirk-to-force-bind-to-hid-generi.patch @@ -0,0 +1,80 @@ +From 113a1cf7d2f6b9b50247f1b29ad843b0d738fc31 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 1 Oct 2024 16:30:12 +0200 +Subject: HID: add per device quirk to force bind to hid-generic + +From: Benjamin Tissoires + +[ Upstream commit 645c224ac5f6e0013931c342ea707b398d24d410 ] + +We already have the possibility to force not binding to hid-generic and +rely on a dedicated driver, but we couldn't do the other way around. + +This is useful for BPF programs where we are fixing the report descriptor +and the events, but want to avoid a specialized driver to come after BPF +which would unwind everything that is done there. + +Reviewed-by: Peter Hutterer +Link: https://patch.msgid.link/20241001-hid-bpf-hid-generic-v3-8-2ef1019468df@kernel.org +Signed-off-by: Benjamin Tissoires +Signed-off-by: Sasha Levin +--- + drivers/hid/hid-core.c | 5 +++-- + drivers/hid/hid-generic.c | 3 +++ + include/linux/hid.h | 2 ++ + 3 files changed, 8 insertions(+), 2 deletions(-) + +diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c +index 1467c5a732db4..558f3988fb2cf 100644 +--- a/drivers/hid/hid-core.c ++++ b/drivers/hid/hid-core.c +@@ -2607,9 +2607,10 @@ static bool hid_check_device_match(struct hid_device *hdev, + /* + * hid-generic implements .match(), so we must be dealing with a + * different HID driver here, and can simply check if +- * hid_ignore_special_drivers is set or not. ++ * hid_ignore_special_drivers or HID_QUIRK_IGNORE_SPECIAL_DRIVER ++ * are set or not. + */ +- return !hid_ignore_special_drivers; ++ return !hid_ignore_special_drivers && !(hdev->quirks & HID_QUIRK_IGNORE_SPECIAL_DRIVER); + } + + static int __hid_device_probe(struct hid_device *hdev, struct hid_driver *hdrv) +diff --git a/drivers/hid/hid-generic.c b/drivers/hid/hid-generic.c +index f9db991d3c5a2..88882c1bfffe7 100644 +--- a/drivers/hid/hid-generic.c ++++ b/drivers/hid/hid-generic.c +@@ -40,6 +40,9 @@ static bool hid_generic_match(struct hid_device *hdev, + if (ignore_special_driver) + return true; + ++ if (hdev->quirks & HID_QUIRK_IGNORE_SPECIAL_DRIVER) ++ return true; ++ + if (hdev->quirks & HID_QUIRK_HAVE_SPECIAL_DRIVER) + return false; + +diff --git a/include/linux/hid.h b/include/linux/hid.h +index 3b08a29572298..af55a25db91b0 100644 +--- a/include/linux/hid.h ++++ b/include/linux/hid.h +@@ -359,6 +359,7 @@ struct hid_item { + * | @HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP: + * | @HID_QUIRK_HAVE_SPECIAL_DRIVER: + * | @HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE: ++ * | @HID_QUIRK_IGNORE_SPECIAL_DRIVER + * | @HID_QUIRK_FULLSPEED_INTERVAL: + * | @HID_QUIRK_NO_INIT_REPORTS: + * | @HID_QUIRK_NO_IGNORE: +@@ -384,6 +385,7 @@ struct hid_item { + #define HID_QUIRK_HAVE_SPECIAL_DRIVER BIT(19) + #define HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE BIT(20) + #define HID_QUIRK_NOINVERT BIT(21) ++#define HID_QUIRK_IGNORE_SPECIAL_DRIVER BIT(22) + #define HID_QUIRK_FULLSPEED_INTERVAL BIT(28) + #define HID_QUIRK_NO_INIT_REPORTS BIT(29) + #define HID_QUIRK_NO_IGNORE BIT(30) +-- +2.43.0 + diff --git a/queue-6.6/hid-bpf-fix-nkro-on-mistel-md770.patch b/queue-6.6/hid-bpf-fix-nkro-on-mistel-md770.patch new file mode 100644 index 00000000000..0fd2d2b4800 --- /dev/null +++ b/queue-6.6/hid-bpf-fix-nkro-on-mistel-md770.patch @@ -0,0 +1,191 @@ +From ad2a792488fb4d41b30190360837022bfca634cf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Oct 2024 18:34:58 +0200 +Subject: HID: bpf: Fix NKRO on Mistel MD770 + +From: Benjamin Tissoires + +[ Upstream commit 9bc089307e8dff7797233308372b4a90ce8f79be ] + +Mistel MD770 keyboard (using Holtek Semiconductor, Inc. controller) has +a quirk in report descriptor in one of its interfaces (more detail in +the source file). Fix up the descriptor to allow NKRO to work again. + +Tested by loading the BPF program and confirming that 8 simultaneous +keypresses work. + +Link: https://bugzilla.kernel.org/show_bug.cgi?id=218495 +Link: https://gitlab.freedesktop.org/libevdev/udev-hid-bpf/-/merge_requests/122 +Signed-off-by: Tatsuyuki Ishi +Acked-by: Jiri Kosina +Link: https://patch.msgid.link/20241017-import_bpf_6-13-v2-1-6a7acb89a97f@kernel.org +Signed-off-by: Benjamin Tissoires +Signed-off-by: Sasha Levin +--- + drivers/hid/bpf/progs/Mistel__MD770.bpf.c | 154 ++++++++++++++++++++++ + 1 file changed, 154 insertions(+) + create mode 100644 drivers/hid/bpf/progs/Mistel__MD770.bpf.c + +diff --git a/drivers/hid/bpf/progs/Mistel__MD770.bpf.c b/drivers/hid/bpf/progs/Mistel__MD770.bpf.c +new file mode 100644 +index 0000000000000..fb8b5a6968b12 +--- /dev/null ++++ b/drivers/hid/bpf/progs/Mistel__MD770.bpf.c +@@ -0,0 +1,154 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright (c) 2024 Tatsuyuki Ishi ++ */ ++ ++#include "vmlinux.h" ++#include "hid_bpf.h" ++#include "hid_bpf_helpers.h" ++#include ++ ++#define VID_HOLTEK 0x04D9 ++#define PID_MD770 0x0339 ++#define RDESC_SIZE 203 ++ ++HID_BPF_CONFIG( ++ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, VID_HOLTEK, PID_MD770) ++); ++ ++/* ++ * The Mistel MD770 keyboard reports the first 6 simultaneous key presses ++ * through the first interface, and anything beyond that through a second ++ * interface. Unfortunately, the second interface's report descriptor has an ++ * error, causing events to be malformed and ignored. This HID-BPF driver ++ * fixes the descriptor to allow NKRO to work again. ++ * ++ * For reference, this is the original report descriptor: ++ * ++ * 0x05, 0x01, // Usage Page (Generic Desktop) 0 ++ * 0x09, 0x80, // Usage (System Control) 2 ++ * 0xa1, 0x01, // Collection (Application) 4 ++ * 0x85, 0x01, // Report ID (1) 6 ++ * 0x19, 0x81, // Usage Minimum (129) 8 ++ * 0x29, 0x83, // Usage Maximum (131) 10 ++ * 0x15, 0x00, // Logical Minimum (0) 12 ++ * 0x25, 0x01, // Logical Maximum (1) 14 ++ * 0x95, 0x03, // Report Count (3) 16 ++ * 0x75, 0x01, // Report Size (1) 18 ++ * 0x81, 0x02, // Input (Data,Var,Abs) 20 ++ * 0x95, 0x01, // Report Count (1) 22 ++ * 0x75, 0x05, // Report Size (5) 24 ++ * 0x81, 0x01, // Input (Cnst,Arr,Abs) 26 ++ * 0xc0, // End Collection 28 ++ * 0x05, 0x0c, // Usage Page (Consumer Devices) 29 ++ * 0x09, 0x01, // Usage (Consumer Control) 31 ++ * 0xa1, 0x01, // Collection (Application) 33 ++ * 0x85, 0x02, // Report ID (2) 35 ++ * 0x15, 0x00, // Logical Minimum (0) 37 ++ * 0x25, 0x01, // Logical Maximum (1) 39 ++ * 0x95, 0x12, // Report Count (18) 41 ++ * 0x75, 0x01, // Report Size (1) 43 ++ * 0x0a, 0x83, 0x01, // Usage (AL Consumer Control Config) 45 ++ * 0x0a, 0x8a, 0x01, // Usage (AL Email Reader) 48 ++ * 0x0a, 0x92, 0x01, // Usage (AL Calculator) 51 ++ * 0x0a, 0x94, 0x01, // Usage (AL Local Machine Browser) 54 ++ * 0x09, 0xcd, // Usage (Play/Pause) 57 ++ * 0x09, 0xb7, // Usage (Stop) 59 ++ * 0x09, 0xb6, // Usage (Scan Previous Track) 61 ++ * 0x09, 0xb5, // Usage (Scan Next Track) 63 ++ * 0x09, 0xe2, // Usage (Mute) 65 ++ * 0x09, 0xea, // Usage (Volume Down) 67 ++ * 0x09, 0xe9, // Usage (Volume Up) 69 ++ * 0x0a, 0x21, 0x02, // Usage (AC Search) 71 ++ * 0x0a, 0x23, 0x02, // Usage (AC Home) 74 ++ * 0x0a, 0x24, 0x02, // Usage (AC Back) 77 ++ * 0x0a, 0x25, 0x02, // Usage (AC Forward) 80 ++ * 0x0a, 0x26, 0x02, // Usage (AC Stop) 83 ++ * 0x0a, 0x27, 0x02, // Usage (AC Refresh) 86 ++ * 0x0a, 0x2a, 0x02, // Usage (AC Bookmarks) 89 ++ * 0x81, 0x02, // Input (Data,Var,Abs) 92 ++ * 0x95, 0x01, // Report Count (1) 94 ++ * 0x75, 0x0e, // Report Size (14) 96 ++ * 0x81, 0x01, // Input (Cnst,Arr,Abs) 98 ++ * 0xc0, // End Collection 100 ++ * 0x05, 0x01, // Usage Page (Generic Desktop) 101 ++ * 0x09, 0x02, // Usage (Mouse) 103 ++ * 0xa1, 0x01, // Collection (Application) 105 ++ * 0x09, 0x01, // Usage (Pointer) 107 ++ * 0xa1, 0x00, // Collection (Physical) 109 ++ * 0x85, 0x03, // Report ID (3) 111 ++ * 0x05, 0x09, // Usage Page (Button) 113 ++ * 0x19, 0x01, // Usage Minimum (1) 115 ++ * 0x29, 0x08, // Usage Maximum (8) 117 ++ * 0x15, 0x00, // Logical Minimum (0) 119 ++ * 0x25, 0x01, // Logical Maximum (1) 121 ++ * 0x75, 0x01, // Report Size (1) 123 ++ * 0x95, 0x08, // Report Count (8) 125 ++ * 0x81, 0x02, // Input (Data,Var,Abs) 127 ++ * 0x05, 0x01, // Usage Page (Generic Desktop) 129 ++ * 0x09, 0x30, // Usage (X) 131 ++ * 0x09, 0x31, // Usage (Y) 133 ++ * 0x16, 0x01, 0x80, // Logical Minimum (-32767) 135 ++ * 0x26, 0xff, 0x7f, // Logical Maximum (32767) 138 ++ * 0x75, 0x10, // Report Size (16) 141 ++ * 0x95, 0x02, // Report Count (2) 143 ++ * 0x81, 0x06, // Input (Data,Var,Rel) 145 ++ * 0x09, 0x38, // Usage (Wheel) 147 ++ * 0x15, 0x81, // Logical Minimum (-127) 149 ++ * 0x25, 0x7f, // Logical Maximum (127) 151 ++ * 0x75, 0x08, // Report Size (8) 153 ++ * 0x95, 0x01, // Report Count (1) 155 ++ * 0x81, 0x06, // Input (Data,Var,Rel) 157 ++ * 0x05, 0x0c, // Usage Page (Consumer Devices) 159 ++ * 0x0a, 0x38, 0x02, // Usage (AC Pan) 161 ++ * 0x95, 0x01, // Report Count (1) 164 ++ * 0x81, 0x06, // Input (Data,Var,Rel) 166 ++ * 0xc0, // End Collection 168 ++ * 0xc0, // End Collection 169 ++ * 0x05, 0x01, // Usage Page (Generic Desktop) 170 ++ * 0x09, 0x06, // Usage (Keyboard) 172 ++ * 0xa1, 0x01, // Collection (Application) 174 ++ * 0x85, 0x04, // Report ID (4) 176 ++ * 0x05, 0x07, // Usage Page (Keyboard) 178 ++ * 0x95, 0x01, // Report Count (1) 180 ++ * 0x75, 0x08, // Report Size (8) 182 ++ * 0x81, 0x03, // Input (Cnst,Var,Abs) 184 ++ * 0x95, 0xe8, // Report Count (232) 186 ++ * 0x75, 0x01, // Report Size (1) 188 ++ * 0x15, 0x00, // Logical Minimum (0) 190 ++ * 0x25, 0x01, // Logical Maximum (1) 192 ++ * 0x05, 0x07, // Usage Page (Keyboard) 194 ++ * 0x19, 0x00, // Usage Minimum (0) 196 ++ * 0x29, 0xe7, // Usage Maximum (231) 198 ++ * 0x81, 0x00, // Input (Data,Arr,Abs) 200 <- change to 0x81, 0x02 (Data,Var,Abs) ++ * 0xc0, // End Collection 202 ++ */ ++ ++SEC(HID_BPF_RDESC_FIXUP) ++int BPF_PROG(hid_rdesc_fixup_mistel_md770, struct hid_bpf_ctx *hctx) ++{ ++ __u8 *data = hid_bpf_get_data(hctx, 0, HID_MAX_DESCRIPTOR_SIZE); ++ ++ if (!data) ++ return 0; /* EPERM check */ ++ ++ if (data[201] == 0x00) ++ data[201] = 0x02; ++ ++ return 0; ++} ++ ++HID_BPF_OPS(mistel_md770) = { ++ .hid_rdesc_fixup = (void *)hid_rdesc_fixup_mistel_md770, ++}; ++ ++SEC("syscall") ++int probe(struct hid_bpf_probe_args *ctx) ++{ ++ ctx->retval = ctx->rdesc_size != RDESC_SIZE; ++ if (ctx->retval) ++ ctx->retval = -EINVAL; ++ ++ return 0; ++} ++ ++char _license[] SEC("license") = "GPL"; +-- +2.43.0 + diff --git a/queue-6.6/hid-magicmouse-apple-magic-trackpad-2-usb-c-driver-s.patch b/queue-6.6/hid-magicmouse-apple-magic-trackpad-2-usb-c-driver-s.patch new file mode 100644 index 00000000000..0077b72d7d1 --- /dev/null +++ b/queue-6.6/hid-magicmouse-apple-magic-trackpad-2-usb-c-driver-s.patch @@ -0,0 +1,203 @@ +From 358847f8398463487182b06ba7f89258fff1802c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Nov 2024 22:49:28 +0100 +Subject: HID: magicmouse: Apple Magic Trackpad 2 USB-C driver support + +From: Callahan Kovacs + +[ Upstream commit 87a2f10395c82c2b4687bb8611a6c5663a12f9e7 ] + +Adds driver support for the USB-C model of Apple's Magic Trackpad 2. + +The 2024 USB-C model is compatible with the existing Magic Trackpad 2 +driver but has a different hardware ID. + +Link: https://bugzilla.kernel.org/show_bug.cgi?id=219470 +Signed-off-by: Callahan Kovacs +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + drivers/hid/hid-ids.h | 1 + + drivers/hid/hid-magicmouse.c | 56 ++++++++++++++++++++++++++---------- + 2 files changed, 42 insertions(+), 15 deletions(-) + +diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h +index 1a05e22685895..f16940f3d93d4 100644 +--- a/drivers/hid/hid-ids.h ++++ b/drivers/hid/hid-ids.h +@@ -94,6 +94,7 @@ + #define USB_DEVICE_ID_APPLE_MAGICMOUSE2 0x0269 + #define USB_DEVICE_ID_APPLE_MAGICTRACKPAD 0x030e + #define USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 0x0265 ++#define USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC 0x0324 + #define USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI 0x020e + #define USB_DEVICE_ID_APPLE_FOUNTAIN_ISO 0x020f + #define USB_DEVICE_ID_APPLE_GEYSER_ANSI 0x0214 +diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c +index c9c968d4b36a3..9bb8daf7f7860 100644 +--- a/drivers/hid/hid-magicmouse.c ++++ b/drivers/hid/hid-magicmouse.c +@@ -224,7 +224,9 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda + touch_minor = tdata[4]; + state = tdata[7] & TOUCH_STATE_MASK; + down = state != TOUCH_STATE_NONE; +- } else if (input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2) { ++ } else if (input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || ++ input->id.product == ++ USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) { + id = tdata[8] & 0xf; + x = (tdata[1] << 27 | tdata[0] << 19) >> 19; + y = -((tdata[3] << 30 | tdata[2] << 22 | tdata[1] << 14) >> 19); +@@ -256,8 +258,9 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda + /* If requested, emulate a scroll wheel by detecting small + * vertical touch motions. + */ +- if (emulate_scroll_wheel && (input->id.product != +- USB_DEVICE_ID_APPLE_MAGICTRACKPAD2)) { ++ if (emulate_scroll_wheel && ++ input->id.product != USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 && ++ input->id.product != USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) { + unsigned long now = jiffies; + int step_x = msc->touches[id].scroll_x - x; + int step_y = msc->touches[id].scroll_y - y; +@@ -356,7 +359,9 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda + input_report_abs(input, ABS_MT_POSITION_X, x); + input_report_abs(input, ABS_MT_POSITION_Y, y); + +- if (input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2) ++ if (input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || ++ input->id.product == ++ USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) + input_report_abs(input, ABS_MT_PRESSURE, pressure); + + if (report_undeciphered) { +@@ -364,7 +369,9 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda + input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2) + input_event(input, EV_MSC, MSC_RAW, tdata[7]); + else if (input->id.product != +- USB_DEVICE_ID_APPLE_MAGICTRACKPAD2) ++ USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 && ++ input->id.product != ++ USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) + input_event(input, EV_MSC, MSC_RAW, tdata[8]); + } + } +@@ -490,7 +497,9 @@ static int magicmouse_raw_event(struct hid_device *hdev, + magicmouse_emit_buttons(msc, clicks & 3); + input_report_rel(input, REL_X, x); + input_report_rel(input, REL_Y, y); +- } else if (input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2) { ++ } else if (input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || ++ input->id.product == ++ USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) { + input_mt_sync_frame(input); + input_report_key(input, BTN_MOUSE, clicks & 1); + } else { /* USB_DEVICE_ID_APPLE_MAGICTRACKPAD */ +@@ -542,7 +551,9 @@ static int magicmouse_setup_input(struct input_dev *input, struct hid_device *hd + __set_bit(REL_WHEEL_HI_RES, input->relbit); + __set_bit(REL_HWHEEL_HI_RES, input->relbit); + } +- } else if (input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2) { ++ } else if (input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || ++ input->id.product == ++ USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) { + /* If the trackpad has been connected to a Mac, the name is + * automatically personalized, e.g., "José Expósito's Trackpad". + * When connected through Bluetooth, the personalized name is +@@ -618,7 +629,9 @@ static int magicmouse_setup_input(struct input_dev *input, struct hid_device *hd + MOUSE_RES_X); + input_abs_set_res(input, ABS_MT_POSITION_Y, + MOUSE_RES_Y); +- } else if (input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2) { ++ } else if (input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || ++ input->id.product == ++ USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) { + input_set_abs_params(input, ABS_MT_PRESSURE, 0, 253, 0, 0); + input_set_abs_params(input, ABS_PRESSURE, 0, 253, 0, 0); + input_set_abs_params(input, ABS_MT_ORIENTATION, -3, 4, 0, 0); +@@ -657,7 +670,8 @@ static int magicmouse_setup_input(struct input_dev *input, struct hid_device *hd + input_set_events_per_packet(input, 60); + + if (report_undeciphered && +- input->id.product != USB_DEVICE_ID_APPLE_MAGICTRACKPAD2) { ++ input->id.product != USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 && ++ input->id.product != USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) { + __set_bit(EV_MSC, input->evbit); + __set_bit(MSC_RAW, input->mscbit); + } +@@ -682,7 +696,9 @@ static int magicmouse_input_mapping(struct hid_device *hdev, + + /* Magic Trackpad does not give relative data after switching to MT */ + if ((hi->input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD || +- hi->input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2) && ++ hi->input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || ++ hi->input->id.product == ++ USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) && + field->flags & HID_MAIN_ITEM_RELATIVE) + return -1; + +@@ -718,7 +734,8 @@ static int magicmouse_enable_multitouch(struct hid_device *hdev) + int ret; + int feature_size; + +- if (hdev->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2) { ++ if (hdev->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || ++ hdev->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) { + if (hdev->vendor == BT_VENDOR_ID_APPLE) { + feature_size = sizeof(feature_mt_trackpad2_bt); + feature = feature_mt_trackpad2_bt; +@@ -763,7 +780,8 @@ static int magicmouse_fetch_battery(struct hid_device *hdev) + + if (!hdev->battery || hdev->vendor != USB_VENDOR_ID_APPLE || + (hdev->product != USB_DEVICE_ID_APPLE_MAGICMOUSE2 && +- hdev->product != USB_DEVICE_ID_APPLE_MAGICTRACKPAD2)) ++ hdev->product != USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 && ++ hdev->product != USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC)) + return -1; + + report_enum = &hdev->report_enum[hdev->battery_report_type]; +@@ -832,7 +850,9 @@ static int magicmouse_probe(struct hid_device *hdev, + + if (id->vendor == USB_VENDOR_ID_APPLE && + (id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2 || +- (id->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 && hdev->type != HID_TYPE_USBMOUSE))) ++ ((id->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || ++ id->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) && ++ hdev->type != HID_TYPE_USBMOUSE))) + return 0; + + if (!msc->input) { +@@ -847,7 +867,8 @@ static int magicmouse_probe(struct hid_device *hdev, + else if (id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2) + report = hid_register_report(hdev, HID_INPUT_REPORT, + MOUSE2_REPORT_ID, 0); +- else if (id->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2) { ++ else if (id->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || ++ id->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) { + if (id->vendor == BT_VENDOR_ID_APPLE) + report = hid_register_report(hdev, HID_INPUT_REPORT, + TRACKPAD2_BT_REPORT_ID, 0); +@@ -917,7 +938,8 @@ static __u8 *magicmouse_report_fixup(struct hid_device *hdev, __u8 *rdesc, + */ + if (hdev->vendor == USB_VENDOR_ID_APPLE && + (hdev->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2 || +- hdev->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2) && ++ hdev->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || ++ hdev->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) && + *rsize == 83 && rdesc[46] == 0x84 && rdesc[58] == 0x85) { + hid_info(hdev, + "fixing up magicmouse battery report descriptor\n"); +@@ -948,6 +970,10 @@ static const struct hid_device_id magic_mice[] = { + USB_DEVICE_ID_APPLE_MAGICTRACKPAD2), .driver_data = 0 }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, + USB_DEVICE_ID_APPLE_MAGICTRACKPAD2), .driver_data = 0 }, ++ { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, ++ USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC), .driver_data = 0 }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, ++ USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC), .driver_data = 0 }, + { } + }; + MODULE_DEVICE_TABLE(hid, magic_mice); +-- +2.43.0 + diff --git a/queue-6.6/hwmon-nct6775-add-665-ace-600m-cl-to-asus-wmi-monito.patch b/queue-6.6/hwmon-nct6775-add-665-ace-600m-cl-to-asus-wmi-monito.patch new file mode 100644 index 00000000000..9a191eb5fa9 --- /dev/null +++ b/queue-6.6/hwmon-nct6775-add-665-ace-600m-cl-to-asus-wmi-monito.patch @@ -0,0 +1,45 @@ +From 84deb1671a0ffc6cb535d9546014b126fc8c99f7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 18 Oct 2024 09:46:10 +0200 +Subject: hwmon: (nct6775) Add 665-ACE/600M-CL to ASUS WMI monitoring list + +From: Sarah Maedel + +[ Upstream commit ccae49e5cf6ebda1a7fa5d2ca99500987c7420c4 ] + +Boards such as +* Pro WS 665-ACE +* Pro WS 600M-CL +have got a nct6775 chip, but by default there's no use of it +because of resource conflict with WMI method. + +Add affected boards to the WMI monitoring list. + +Link: https://bugzilla.kernel.org/show_bug.cgi?id=204807 +Co-developed-by: Tommy Giesler +Signed-off-by: Tommy Giesler +Signed-off-by: Sarah Maedel +Message-ID: <20241018074611.358619-1-sarah.maedel@hetzner-cloud.de> +[groeck: Change commit message to imperative mood] +Signed-off-by: Guenter Roeck +Signed-off-by: Sasha Levin +--- + drivers/hwmon/nct6775-platform.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/hwmon/nct6775-platform.c b/drivers/hwmon/nct6775-platform.c +index 706a662dd077d..7e0ac3fcbc050 100644 +--- a/drivers/hwmon/nct6775-platform.c ++++ b/drivers/hwmon/nct6775-platform.c +@@ -1350,6 +1350,8 @@ static const char * const asus_msi_boards[] = { + "Pro H610M-CT D4", + "Pro H610T D4", + "Pro Q670M-C", ++ "Pro WS 600M-CL", ++ "Pro WS 665-ACE", + "Pro WS W680-ACE", + "Pro WS W680-ACE IPMI", + "Pro WS W790-ACE", +-- +2.43.0 + diff --git a/queue-6.6/i3c-mipi-i3c-hci-mask-ring-interrupts-before-ring-st.patch b/queue-6.6/i3c-mipi-i3c-hci-mask-ring-interrupts-before-ring-st.patch new file mode 100644 index 00000000000..445bee9e0d7 --- /dev/null +++ b/queue-6.6/i3c-mipi-i3c-hci-mask-ring-interrupts-before-ring-st.patch @@ -0,0 +1,44 @@ +From 7392aa22dc8e81a632d3469429242febbb26acfc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 Sep 2024 17:44:31 +0300 +Subject: i3c: mipi-i3c-hci: Mask ring interrupts before ring stop request + +From: Jarkko Nikula + +[ Upstream commit 6ca2738174e4ee44edb2ab2d86ce74f015a0cc32 ] + +Bus cleanup path in DMA mode may trigger a RING_OP_STAT interrupt when +the ring is being stopped. Depending on timing between ring stop request +completion, interrupt handler removal and code execution this may lead +to a NULL pointer dereference in hci_dma_irq_handler() if it gets to run +after the io_data pointer is set to NULL in hci_dma_cleanup(). + +Prevent this my masking the ring interrupts before ring stop request. + +Signed-off-by: Jarkko Nikula +Link: https://lore.kernel.org/r/20240920144432.62370-2-jarkko.nikula@linux.intel.com +Signed-off-by: Alexandre Belloni +Signed-off-by: Sasha Levin +--- + drivers/i3c/master/mipi-i3c-hci/dma.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/i3c/master/mipi-i3c-hci/dma.c b/drivers/i3c/master/mipi-i3c-hci/dma.c +index edc3a69bfe31f..bcc0c7d4131f2 100644 +--- a/drivers/i3c/master/mipi-i3c-hci/dma.c ++++ b/drivers/i3c/master/mipi-i3c-hci/dma.c +@@ -174,10 +174,10 @@ static void hci_dma_cleanup(struct i3c_hci *hci) + for (i = 0; i < rings->total; i++) { + rh = &rings->headers[i]; + ++ rh_reg_write(INTR_SIGNAL_ENABLE, 0); + rh_reg_write(RING_CONTROL, 0); + rh_reg_write(CR_SETUP, 0); + rh_reg_write(IBI_SETUP, 0); +- rh_reg_write(INTR_SIGNAL_ENABLE, 0); + + if (rh->xfer) + dma_free_coherent(&hci->master.dev, +-- +2.43.0 + diff --git a/queue-6.6/i3c-use-i3cdev-desc-info-instead-of-calling-i3c_devi.patch b/queue-6.6/i3c-use-i3cdev-desc-info-instead-of-calling-i3c_devi.patch new file mode 100644 index 00000000000..5eb9fb21451 --- /dev/null +++ b/queue-6.6/i3c-use-i3cdev-desc-info-instead-of-calling-i3c_devi.patch @@ -0,0 +1,113 @@ +From a5fd752284d8aa3166d4b6e6310851dbdb3e3e81 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Nov 2024 21:25:39 +0800 +Subject: i3c: Use i3cdev->desc->info instead of calling i3c_device_get_info() + to avoid deadlock + +From: Defa Li + +[ Upstream commit 6cf7b65f7029914dc0cd7db86fac9ee5159008c6 ] + +A deadlock may happen since the i3c_master_register() acquires +&i3cbus->lock twice. See the log below. +Use i3cdev->desc->info instead of calling i3c_device_info() to +avoid acquiring the lock twice. + +v2: + - Modified the title and commit message + +============================================ +WARNING: possible recursive locking detected +6.11.0-mainline +-------------------------------------------- +init/1 is trying to acquire lock: +f1ffff80a6a40dc0 (&i3cbus->lock){++++}-{3:3}, at: i3c_bus_normaluse_lock + +but task is already holding lock: +f1ffff80a6a40dc0 (&i3cbus->lock){++++}-{3:3}, at: i3c_master_register + +other info that might help us debug this: + Possible unsafe locking scenario: + + CPU0 + ---- + lock(&i3cbus->lock); + lock(&i3cbus->lock); + + *** DEADLOCK *** + + May be due to missing lock nesting notation + +2 locks held by init/1: + #0: fcffff809b6798f8 (&dev->mutex){....}-{3:3}, at: __driver_attach + #1: f1ffff80a6a40dc0 (&i3cbus->lock){++++}-{3:3}, at: i3c_master_register + +stack backtrace: +CPU: 6 UID: 0 PID: 1 Comm: init +Call trace: + dump_backtrace+0xfc/0x17c + show_stack+0x18/0x28 + dump_stack_lvl+0x40/0xc0 + dump_stack+0x18/0x24 + print_deadlock_bug+0x388/0x390 + __lock_acquire+0x18bc/0x32ec + lock_acquire+0x134/0x2b0 + down_read+0x50/0x19c + i3c_bus_normaluse_lock+0x14/0x24 + i3c_device_get_info+0x24/0x58 + i3c_device_uevent+0x34/0xa4 + dev_uevent+0x310/0x384 + kobject_uevent_env+0x244/0x414 + kobject_uevent+0x14/0x20 + device_add+0x278/0x460 + device_register+0x20/0x34 + i3c_master_register_new_i3c_devs+0x78/0x154 + i3c_master_register+0x6a0/0x6d4 + mtk_i3c_master_probe+0x3b8/0x4d8 + platform_probe+0xa0/0xe0 + really_probe+0x114/0x454 + __driver_probe_device+0xa0/0x15c + driver_probe_device+0x3c/0x1ac + __driver_attach+0xc4/0x1f0 + bus_for_each_dev+0x104/0x160 + driver_attach+0x24/0x34 + bus_add_driver+0x14c/0x294 + driver_register+0x68/0x104 + __platform_driver_register+0x20/0x30 + init_module+0x20/0xfe4 + do_one_initcall+0x184/0x464 + do_init_module+0x58/0x1ec + load_module+0xefc/0x10c8 + __arm64_sys_finit_module+0x238/0x33c + invoke_syscall+0x58/0x10c + el0_svc_common+0xa8/0xdc + do_el0_svc+0x1c/0x28 + el0_svc+0x50/0xac + el0t_64_sync_handler+0x70/0xbc + el0t_64_sync+0x1a8/0x1ac + +Signed-off-by: Defa Li +Link: https://lore.kernel.org/r/20241107132549.25439-1-defa.li@mediatek.com +Signed-off-by: Alexandre Belloni +Signed-off-by: Sasha Levin +--- + drivers/i3c/master.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c +index 5d737bdbfe478..b77ddec6025d7 100644 +--- a/drivers/i3c/master.c ++++ b/drivers/i3c/master.c +@@ -280,7 +280,8 @@ static int i3c_device_uevent(const struct device *dev, struct kobj_uevent_env *e + struct i3c_device_info devinfo; + u16 manuf, part, ext; + +- i3c_device_get_info(i3cdev, &devinfo); ++ if (i3cdev->desc) ++ devinfo = i3cdev->desc->info; + manuf = I3C_PID_MANUF_ID(devinfo.pid); + part = I3C_PID_PART_ID(devinfo.pid); + ext = I3C_PID_EXTRA_INFO(devinfo.pid); +-- +2.43.0 + diff --git a/queue-6.6/iio-light-ltr501-add-lter0303-to-the-supported-devic.patch b/queue-6.6/iio-light-ltr501-add-lter0303-to-the-supported-devic.patch new file mode 100644 index 00000000000..d117c9556b4 --- /dev/null +++ b/queue-6.6/iio-light-ltr501-add-lter0303-to-the-supported-devic.patch @@ -0,0 +1,41 @@ +From 90cdc28bfe45f3be1ca9c990063e2f8c15ebf43a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 24 Oct 2024 22:05:12 +0300 +Subject: iio: light: ltr501: Add LTER0303 to the supported devices + +From: Andy Shevchenko + +[ Upstream commit c26acb09ccbef47d1fddaf0783c1392d0462122c ] + +It has been found that the (non-vendor issued) ACPI ID for Lite-On +LTR303 is present in Microsoft catalog. Add it to the list of the +supported devices. + +Link: https://www.catalog.update.microsoft.com/Search.aspx?q=lter0303 +Closes: https://lore.kernel.org/r/9cdda3e0-d56e-466f-911f-96ffd6f602c8@redhat.com +Reported-by: Hans de Goede +Reviewed-by: Hans de Goede +Signed-off-by: Andy Shevchenko +Link: https://patch.msgid.link/20241024191200.229894-24-andriy.shevchenko@linux.intel.com +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + drivers/iio/light/ltr501.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/iio/light/ltr501.c b/drivers/iio/light/ltr501.c +index 061c122fdc5e7..498cff9327132 100644 +--- a/drivers/iio/light/ltr501.c ++++ b/drivers/iio/light/ltr501.c +@@ -1612,6 +1612,8 @@ static const struct acpi_device_id ltr_acpi_match[] = { + { "LTER0501", ltr501 }, + { "LTER0559", ltr559 }, + { "LTER0301", ltr301 }, ++ /* https://www.catalog.update.microsoft.com/Search.aspx?q=lter0303 */ ++ { "LTER0303", ltr303 }, + { }, + }; + MODULE_DEVICE_TABLE(acpi, ltr_acpi_match); +-- +2.43.0 + diff --git a/queue-6.6/io_uring-tctx-work-around-xa_store-allocation-error-.patch b/queue-6.6/io_uring-tctx-work-around-xa_store-allocation-error-.patch new file mode 100644 index 00000000000..288639226d7 --- /dev/null +++ b/queue-6.6/io_uring-tctx-work-around-xa_store-allocation-error-.patch @@ -0,0 +1,62 @@ +From 03068f9d622cb9e2925a4b509f0d1401c99241ed Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Nov 2024 07:20:28 -0700 +Subject: io_uring/tctx: work around xa_store() allocation error issue + +From: Jens Axboe + +[ Upstream commit 7eb75ce7527129d7f1fee6951566af409a37a1c4 ] + +syzbot triggered the following WARN_ON: + +WARNING: CPU: 0 PID: 16 at io_uring/tctx.c:51 __io_uring_free+0xfa/0x140 io_uring/tctx.c:51 + +which is the + +WARN_ON_ONCE(!xa_empty(&tctx->xa)); + +sanity check in __io_uring_free() when a io_uring_task is going through +its final put. The syzbot test case includes injecting memory allocation +failures, and it very much looks like xa_store() can fail one of its +memory allocations and end up with ->head being non-NULL even though no +entries exist in the xarray. + +Until this issue gets sorted out, work around it by attempting to +iterate entries in our xarray, and WARN_ON_ONCE() if one is found. + +Reported-by: syzbot+cc36d44ec9f368e443d3@syzkaller.appspotmail.com +Link: https://lore.kernel.org/io-uring/673c1643.050a0220.87769.0066.GAE@google.com/ +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + io_uring/tctx.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +diff --git a/io_uring/tctx.c b/io_uring/tctx.c +index c043fe93a3f23..84f6a83857204 100644 +--- a/io_uring/tctx.c ++++ b/io_uring/tctx.c +@@ -47,8 +47,19 @@ static struct io_wq *io_init_wq_offload(struct io_ring_ctx *ctx, + void __io_uring_free(struct task_struct *tsk) + { + struct io_uring_task *tctx = tsk->io_uring; ++ struct io_tctx_node *node; ++ unsigned long index; + +- WARN_ON_ONCE(!xa_empty(&tctx->xa)); ++ /* ++ * Fault injection forcing allocation errors in the xa_store() path ++ * can lead to xa_empty() returning false, even though no actual ++ * node is stored in the xarray. Until that gets sorted out, attempt ++ * an iteration here and warn if any entries are found. ++ */ ++ xa_for_each(&tctx->xa, index, node) { ++ WARN_ON_ONCE(1); ++ break; ++ } + WARN_ON_ONCE(tctx->io_wq); + WARN_ON_ONCE(tctx->cached_refs); + +-- +2.43.0 + diff --git a/queue-6.6/jfs-add-a-check-to-prevent-array-index-out-of-bounds.patch b/queue-6.6/jfs-add-a-check-to-prevent-array-index-out-of-bounds.patch new file mode 100644 index 00000000000..c40add04e1e --- /dev/null +++ b/queue-6.6/jfs-add-a-check-to-prevent-array-index-out-of-bounds.patch @@ -0,0 +1,39 @@ +From 2a86a34f69d3203d243ede867661be6ecf378e53 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Oct 2024 01:51:38 +0530 +Subject: jfs: add a check to prevent array-index-out-of-bounds in dbAdjTree + +From: Nihar Chaithanya + +[ Upstream commit a174706ba4dad895c40b1d2277bade16dfacdcd9 ] + +When the value of lp is 0 at the beginning of the for loop, it will +become negative in the next assignment and we should bail out. + +Reported-by: syzbot+412dea214d8baa3f7483@syzkaller.appspotmail.com +Closes: https://syzkaller.appspot.com/bug?extid=412dea214d8baa3f7483 +Tested-by: syzbot+412dea214d8baa3f7483@syzkaller.appspotmail.com +Signed-off-by: Nihar Chaithanya +Signed-off-by: Dave Kleikamp +Signed-off-by: Sasha Levin +--- + fs/jfs/jfs_dmap.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/fs/jfs/jfs_dmap.c b/fs/jfs/jfs_dmap.c +index 39957361a7eed..f9009e4f9ffd8 100644 +--- a/fs/jfs/jfs_dmap.c ++++ b/fs/jfs/jfs_dmap.c +@@ -2891,6 +2891,9 @@ static void dbAdjTree(dmtree_t *tp, int leafno, int newval, bool is_ctl) + /* bubble the new value up the tree as required. + */ + for (k = 0; k < le32_to_cpu(tp->dmt_height); k++) { ++ if (lp == 0) ++ break; ++ + /* get the index of the first leaf of the 4 leaf + * group containing the specified leaf (leafno). + */ +-- +2.43.0 + diff --git a/queue-6.6/jfs-array-index-out-of-bounds-fix-in-dtreadfirst.patch b/queue-6.6/jfs-array-index-out-of-bounds-fix-in-dtreadfirst.patch new file mode 100644 index 00000000000..572b006e255 --- /dev/null +++ b/queue-6.6/jfs-array-index-out-of-bounds-fix-in-dtreadfirst.patch @@ -0,0 +1,43 @@ +From 27df7d64338e92fdbaf29f29f7eb84831013bac2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 28 Sep 2024 14:07:22 +0530 +Subject: jfs: array-index-out-of-bounds fix in dtReadFirst + +From: Ghanshyam Agrawal + +[ Upstream commit ca84a2c9be482836b86d780244f0357e5a778c46 ] + +The value of stbl can be sometimes out of bounds due +to a bad filesystem. Added a check with appopriate return +of error code in that case. + +Reported-by: syzbot+65fa06e29859e41a83f3@syzkaller.appspotmail.com +Closes: https://syzkaller.appspot.com/bug?extid=65fa06e29859e41a83f3 +Signed-off-by: Ghanshyam Agrawal +Signed-off-by: Dave Kleikamp +Signed-off-by: Sasha Levin +--- + fs/jfs/jfs_dtree.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/fs/jfs/jfs_dtree.c b/fs/jfs/jfs_dtree.c +index 5d3127ca68a42..69fd936fbdb37 100644 +--- a/fs/jfs/jfs_dtree.c ++++ b/fs/jfs/jfs_dtree.c +@@ -3086,6 +3086,13 @@ static int dtReadFirst(struct inode *ip, struct btstack * btstack) + + /* get the leftmost entry */ + stbl = DT_GETSTBL(p); ++ ++ if (stbl[0] < 0 || stbl[0] > 127) { ++ DT_PUTPAGE(mp); ++ jfs_error(ip->i_sb, "stbl[0] out of bound\n"); ++ return -EIO; ++ } ++ + xd = (pxd_t *) & p->slot[stbl[0]]; + + /* get the child page block address */ +-- +2.43.0 + diff --git a/queue-6.6/jfs-fix-array-index-out-of-bounds-in-jfs_readdir.patch b/queue-6.6/jfs-fix-array-index-out-of-bounds-in-jfs_readdir.patch new file mode 100644 index 00000000000..38e1f8b8ed9 --- /dev/null +++ b/queue-6.6/jfs-fix-array-index-out-of-bounds-in-jfs_readdir.patch @@ -0,0 +1,43 @@ +From d891ed612023c9bfd04a65ff7ceb6c30a2cb648f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 1 Oct 2024 11:35:47 +0530 +Subject: jfs: fix array-index-out-of-bounds in jfs_readdir + +From: Ghanshyam Agrawal + +[ Upstream commit 839f102efb168f02dfdd46717b7c6dddb26b015e ] + +The stbl might contain some invalid values. Added a check to +return error code in that case. + +Reported-by: syzbot+0315f8fe99120601ba88@syzkaller.appspotmail.com +Closes: https://syzkaller.appspot.com/bug?extid=0315f8fe99120601ba88 +Signed-off-by: Ghanshyam Agrawal +Signed-off-by: Dave Kleikamp +Signed-off-by: Sasha Levin +--- + fs/jfs/jfs_dtree.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/fs/jfs/jfs_dtree.c b/fs/jfs/jfs_dtree.c +index 69fd936fbdb37..8f85177f284b5 100644 +--- a/fs/jfs/jfs_dtree.c ++++ b/fs/jfs/jfs_dtree.c +@@ -2891,6 +2891,14 @@ int jfs_readdir(struct file *file, struct dir_context *ctx) + stbl = DT_GETSTBL(p); + + for (i = index; i < p->header.nextindex; i++) { ++ if (stbl[i] < 0 || stbl[i] > 127) { ++ jfs_err("JFS: Invalid stbl[%d] = %d for inode %ld, block = %lld", ++ i, stbl[i], (long)ip->i_ino, (long long)bn); ++ free_page(dirent_buf); ++ DT_PUTPAGE(mp); ++ return -EIO; ++ } ++ + d = (struct ldtentry *) & p->slot[stbl[i]]; + + if (((long) jfs_dirent + d->namlen + 1) > +-- +2.43.0 + diff --git a/queue-6.6/jfs-fix-shift-out-of-bounds-in-dbsplit.patch b/queue-6.6/jfs-fix-shift-out-of-bounds-in-dbsplit.patch new file mode 100644 index 00000000000..f1109390989 --- /dev/null +++ b/queue-6.6/jfs-fix-shift-out-of-bounds-in-dbsplit.patch @@ -0,0 +1,39 @@ +From b56245d3a3978907114aa4d9fe78bc88f668a8aa Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 30 Sep 2024 13:42:18 +0530 +Subject: jfs: fix shift-out-of-bounds in dbSplit + +From: Ghanshyam Agrawal + +[ Upstream commit a5f5e4698f8abbb25fe4959814093fb5bfa1aa9d ] + +When dmt_budmin is less than zero, it causes errors +in the later stages. Added a check to return an error beforehand +in dbAllocCtl itself. + +Reported-by: syzbot+b5ca8a249162c4b9a7d0@syzkaller.appspotmail.com +Closes: https://syzkaller.appspot.com/bug?extid=b5ca8a249162c4b9a7d0 +Signed-off-by: Ghanshyam Agrawal +Signed-off-by: Dave Kleikamp +Signed-off-by: Sasha Levin +--- + fs/jfs/jfs_dmap.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/fs/jfs/jfs_dmap.c b/fs/jfs/jfs_dmap.c +index 3ab410059dc20..39957361a7eed 100644 +--- a/fs/jfs/jfs_dmap.c ++++ b/fs/jfs/jfs_dmap.c +@@ -1820,6 +1820,9 @@ dbAllocCtl(struct bmap * bmp, s64 nblocks, int l2nb, s64 blkno, s64 * results) + return -EIO; + dp = (struct dmap *) mp->data; + ++ if (dp->tree.budmin < 0) ++ return -EIO; ++ + /* try to allocate the blocks. + */ + rc = dbAllocDmapLev(bmp, dp, (int) nblocks, l2nb, results); +-- +2.43.0 + diff --git a/queue-6.6/kcsan-turn-report_filterlist_lock-into-a-raw_spinloc.patch b/queue-6.6/kcsan-turn-report_filterlist_lock-into-a-raw_spinloc.patch new file mode 100644 index 00000000000..43930cbf955 --- /dev/null +++ b/queue-6.6/kcsan-turn-report_filterlist_lock-into-a-raw_spinloc.patch @@ -0,0 +1,212 @@ +From a6e8833fd9d2be69e78dc2ef4e9ad73cbc6cd9a4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 1 Oct 2024 16:00:45 +0200 +Subject: kcsan: Turn report_filterlist_lock into a raw_spinlock + +From: Marco Elver + +[ Upstream commit 59458fa4ddb47e7891c61b4a928d13d5f5b00aa0 ] + +Ran Xiaokai reports that with a KCSAN-enabled PREEMPT_RT kernel, we can see +splats like: + +| BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48 +| in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 0, name: swapper/1 +| preempt_count: 10002, expected: 0 +| RCU nest depth: 0, expected: 0 +| no locks held by swapper/1/0. +| irq event stamp: 156674 +| hardirqs last enabled at (156673): [] do_idle+0x1f9/0x240 +| hardirqs last disabled at (156674): [] sysvec_apic_timer_interrupt+0x14/0xc0 +| softirqs last enabled at (0): [] copy_process+0xfc7/0x4b60 +| softirqs last disabled at (0): [<0000000000000000>] 0x0 +| Preemption disabled at: +| [] paint_ptr+0x2a/0x90 +| CPU: 1 UID: 0 PID: 0 Comm: swapper/1 Not tainted 6.11.0+ #3 +| Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.0-0-ga698c8995f-prebuilt.qemu.org 04/01/2014 +| Call Trace: +| +| dump_stack_lvl+0x7e/0xc0 +| dump_stack+0x1d/0x30 +| __might_resched+0x1a2/0x270 +| rt_spin_lock+0x68/0x170 +| kcsan_skip_report_debugfs+0x43/0xe0 +| print_report+0xb5/0x590 +| kcsan_report_known_origin+0x1b1/0x1d0 +| kcsan_setup_watchpoint+0x348/0x650 +| __tsan_unaligned_write1+0x16d/0x1d0 +| hrtimer_interrupt+0x3d6/0x430 +| __sysvec_apic_timer_interrupt+0xe8/0x3a0 +| sysvec_apic_timer_interrupt+0x97/0xc0 +| + +On a detected data race, KCSAN's reporting logic checks if it should +filter the report. That list is protected by the report_filterlist_lock +*non-raw* spinlock which may sleep on RT kernels. + +Since KCSAN may report data races in any context, convert it to a +raw_spinlock. + +This requires being careful about when to allocate memory for the filter +list itself which can be done via KCSAN's debugfs interface. Concurrent +modification of the filter list via debugfs should be rare: the chosen +strategy is to optimistically pre-allocate memory before the critical +section and discard if unused. + +Link: https://lore.kernel.org/all/20240925143154.2322926-1-ranxiaokai627@163.com/ +Reported-by: Ran Xiaokai +Tested-by: Ran Xiaokai +Signed-off-by: Marco Elver +Signed-off-by: Sasha Levin +--- + kernel/kcsan/debugfs.c | 74 ++++++++++++++++++++---------------------- + 1 file changed, 36 insertions(+), 38 deletions(-) + +diff --git a/kernel/kcsan/debugfs.c b/kernel/kcsan/debugfs.c +index 1d1d1b0e42489..f4623910fb1f2 100644 +--- a/kernel/kcsan/debugfs.c ++++ b/kernel/kcsan/debugfs.c +@@ -46,14 +46,8 @@ static struct { + int used; /* number of elements used */ + bool sorted; /* if elements are sorted */ + bool whitelist; /* if list is a blacklist or whitelist */ +-} report_filterlist = { +- .addrs = NULL, +- .size = 8, /* small initial size */ +- .used = 0, +- .sorted = false, +- .whitelist = false, /* default is blacklist */ +-}; +-static DEFINE_SPINLOCK(report_filterlist_lock); ++} report_filterlist; ++static DEFINE_RAW_SPINLOCK(report_filterlist_lock); + + /* + * The microbenchmark allows benchmarking KCSAN core runtime only. To run +@@ -110,7 +104,7 @@ bool kcsan_skip_report_debugfs(unsigned long func_addr) + return false; + func_addr -= offset; /* Get function start */ + +- spin_lock_irqsave(&report_filterlist_lock, flags); ++ raw_spin_lock_irqsave(&report_filterlist_lock, flags); + if (report_filterlist.used == 0) + goto out; + +@@ -127,7 +121,7 @@ bool kcsan_skip_report_debugfs(unsigned long func_addr) + ret = !ret; + + out: +- spin_unlock_irqrestore(&report_filterlist_lock, flags); ++ raw_spin_unlock_irqrestore(&report_filterlist_lock, flags); + return ret; + } + +@@ -135,9 +129,9 @@ static void set_report_filterlist_whitelist(bool whitelist) + { + unsigned long flags; + +- spin_lock_irqsave(&report_filterlist_lock, flags); ++ raw_spin_lock_irqsave(&report_filterlist_lock, flags); + report_filterlist.whitelist = whitelist; +- spin_unlock_irqrestore(&report_filterlist_lock, flags); ++ raw_spin_unlock_irqrestore(&report_filterlist_lock, flags); + } + + /* Returns 0 on success, error-code otherwise. */ +@@ -145,6 +139,9 @@ static ssize_t insert_report_filterlist(const char *func) + { + unsigned long flags; + unsigned long addr = kallsyms_lookup_name(func); ++ unsigned long *delay_free = NULL; ++ unsigned long *new_addrs = NULL; ++ size_t new_size = 0; + ssize_t ret = 0; + + if (!addr) { +@@ -152,32 +149,33 @@ static ssize_t insert_report_filterlist(const char *func) + return -ENOENT; + } + +- spin_lock_irqsave(&report_filterlist_lock, flags); ++retry_alloc: ++ /* ++ * Check if we need an allocation, and re-validate under the lock. Since ++ * the report_filterlist_lock is a raw, cannot allocate under the lock. ++ */ ++ if (data_race(report_filterlist.used == report_filterlist.size)) { ++ new_size = (report_filterlist.size ?: 4) * 2; ++ delay_free = new_addrs = kmalloc_array(new_size, sizeof(unsigned long), GFP_KERNEL); ++ if (!new_addrs) ++ return -ENOMEM; ++ } + +- if (report_filterlist.addrs == NULL) { +- /* initial allocation */ +- report_filterlist.addrs = +- kmalloc_array(report_filterlist.size, +- sizeof(unsigned long), GFP_ATOMIC); +- if (report_filterlist.addrs == NULL) { +- ret = -ENOMEM; +- goto out; +- } +- } else if (report_filterlist.used == report_filterlist.size) { +- /* resize filterlist */ +- size_t new_size = report_filterlist.size * 2; +- unsigned long *new_addrs = +- krealloc(report_filterlist.addrs, +- new_size * sizeof(unsigned long), GFP_ATOMIC); +- +- if (new_addrs == NULL) { +- /* leave filterlist itself untouched */ +- ret = -ENOMEM; +- goto out; ++ raw_spin_lock_irqsave(&report_filterlist_lock, flags); ++ if (report_filterlist.used == report_filterlist.size) { ++ /* Check we pre-allocated enough, and retry if not. */ ++ if (report_filterlist.used >= new_size) { ++ raw_spin_unlock_irqrestore(&report_filterlist_lock, flags); ++ kfree(new_addrs); /* kfree(NULL) is safe */ ++ delay_free = new_addrs = NULL; ++ goto retry_alloc; + } + ++ if (report_filterlist.used) ++ memcpy(new_addrs, report_filterlist.addrs, report_filterlist.used * sizeof(unsigned long)); ++ delay_free = report_filterlist.addrs; /* free the old list */ ++ report_filterlist.addrs = new_addrs; /* switch to the new list */ + report_filterlist.size = new_size; +- report_filterlist.addrs = new_addrs; + } + + /* Note: deduplicating should be done in userspace. */ +@@ -185,9 +183,9 @@ static ssize_t insert_report_filterlist(const char *func) + kallsyms_lookup_name(func); + report_filterlist.sorted = false; + +-out: +- spin_unlock_irqrestore(&report_filterlist_lock, flags); ++ raw_spin_unlock_irqrestore(&report_filterlist_lock, flags); + ++ kfree(delay_free); + return ret; + } + +@@ -204,13 +202,13 @@ static int show_info(struct seq_file *file, void *v) + } + + /* show filter functions, and filter type */ +- spin_lock_irqsave(&report_filterlist_lock, flags); ++ raw_spin_lock_irqsave(&report_filterlist_lock, flags); + seq_printf(file, "\n%s functions: %s\n", + report_filterlist.whitelist ? "whitelisted" : "blacklisted", + report_filterlist.used == 0 ? "none" : ""); + for (i = 0; i < report_filterlist.used; ++i) + seq_printf(file, " %ps\n", (void *)report_filterlist.addrs[i]); +- spin_unlock_irqrestore(&report_filterlist_lock, flags); ++ raw_spin_unlock_irqrestore(&report_filterlist_lock, flags); + + return 0; + } +-- +2.43.0 + diff --git a/queue-6.6/kmsan-uninit-value-in-inode_go_dump-5.patch b/queue-6.6/kmsan-uninit-value-in-inode_go_dump-5.patch new file mode 100644 index 00000000000..9d4c1b9fcc3 --- /dev/null +++ b/queue-6.6/kmsan-uninit-value-in-inode_go_dump-5.patch @@ -0,0 +1,42 @@ +From c05d74e70d5b0b2482f5f551cf6e88a66edf2c7c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 21 Oct 2024 22:58:01 +0200 +Subject: KMSAN: uninit-value in inode_go_dump (5) + +From: Qianqiang Liu + +[ Upstream commit f9417fcfca3c5e30a0b961e7250fab92cfa5d123 ] + +When mounting of a corrupted disk image fails, the error message printed +can reference uninitialized inode fields. To prevent that from happening, +always initialize those fields. + +Reported-by: syzbot+aa0730b0a42646eb1359@syzkaller.appspotmail.com +Signed-off-by: Qianqiang Liu +Signed-off-by: Andreas Gruenbacher +Signed-off-by: Sasha Levin +--- + fs/gfs2/super.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c +index 09285dc782cf8..49684bc82dc16 100644 +--- a/fs/gfs2/super.c ++++ b/fs/gfs2/super.c +@@ -1567,11 +1567,13 @@ static struct inode *gfs2_alloc_inode(struct super_block *sb) + if (!ip) + return NULL; + ip->i_no_addr = 0; ++ ip->i_no_formal_ino = 0; + ip->i_flags = 0; + ip->i_gl = NULL; + gfs2_holder_mark_uninitialized(&ip->i_iopen_gh); + memset(&ip->i_res, 0, sizeof(ip->i_res)); + RB_CLEAR_NODE(&ip->i_res.rs_node); ++ ip->i_diskflags = 0; + ip->i_rahead = 0; + return &ip->i_inode; + } +-- +2.43.0 + diff --git a/queue-6.6/kselftest-arm64-don-t-leak-pipe-fds-in-pac.exec_sign.patch b/queue-6.6/kselftest-arm64-don-t-leak-pipe-fds-in-pac.exec_sign.patch new file mode 100644 index 00000000000..dc51129c2a1 --- /dev/null +++ b/queue-6.6/kselftest-arm64-don-t-leak-pipe-fds-in-pac.exec_sign.patch @@ -0,0 +1,39 @@ +From 73bdee5955d8d2bf2b181033519f5e07936f5591 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Nov 2024 16:18:55 +0000 +Subject: kselftest/arm64: Don't leak pipe fds in pac.exec_sign_all() + +From: Mark Brown + +[ Upstream commit 27141b690547da5650a420f26ec369ba142a9ebb ] + +The PAC exec_sign_all() test spawns some child processes, creating pipes +to be stdin and stdout for the child. It cleans up most of the file +descriptors that are created as part of this but neglects to clean up the +parent end of the child stdin and stdout. Add the missing close() calls. + +Signed-off-by: Mark Brown +Link: https://lore.kernel.org/r/20241111-arm64-pac-test-collisions-v1-1-171875f37e44@kernel.org +Signed-off-by: Catalin Marinas +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/arm64/pauth/pac.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/tools/testing/selftests/arm64/pauth/pac.c b/tools/testing/selftests/arm64/pauth/pac.c +index b743daa772f55..5a07b3958fbf2 100644 +--- a/tools/testing/selftests/arm64/pauth/pac.c ++++ b/tools/testing/selftests/arm64/pauth/pac.c +@@ -182,6 +182,9 @@ int exec_sign_all(struct signatures *signed_vals, size_t val) + return -1; + } + ++ close(new_stdin[1]); ++ close(new_stdout[0]); ++ + return 0; + } + +-- +2.43.0 + diff --git a/queue-6.6/kselftest-arm64-log-fp-stress-child-startup-errors-t.patch b/queue-6.6/kselftest-arm64-log-fp-stress-child-startup-errors-t.patch new file mode 100644 index 00000000000..3ce13279cc9 --- /dev/null +++ b/queue-6.6/kselftest-arm64-log-fp-stress-child-startup-errors-t.patch @@ -0,0 +1,71 @@ +From c2201b018ae7841b8bf7066c081f5459e6d7072e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 23 Oct 2024 00:20:45 +0100 +Subject: kselftest/arm64: Log fp-stress child startup errors to stdout + +From: Mark Brown + +[ Upstream commit dca93d29845dfed60910ba13dbfb6ae6a0e19f6d ] + +Currently if we encounter an error between fork() and exec() of a child +process we log the error to stderr. This means that the errors don't get +annotated with the child information which makes diagnostics harder and +means that if we miss the exit signal from the child we can deadlock +waiting for output from the child. Improve robustness and output quality +by logging to stdout instead. + +Signed-off-by: Mark Brown +Link: https://lore.kernel.org/r/20241023-arm64-fp-stress-exec-fail-v1-1-ee3c62932c15@kernel.org +Signed-off-by: Catalin Marinas +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/arm64/fp/fp-stress.c | 15 +++++++-------- + 1 file changed, 7 insertions(+), 8 deletions(-) + +diff --git a/tools/testing/selftests/arm64/fp/fp-stress.c b/tools/testing/selftests/arm64/fp/fp-stress.c +index dd31647b00a22..cf9d7b2e4630c 100644 +--- a/tools/testing/selftests/arm64/fp/fp-stress.c ++++ b/tools/testing/selftests/arm64/fp/fp-stress.c +@@ -79,7 +79,7 @@ static void child_start(struct child_data *child, const char *program) + */ + ret = dup2(pipefd[1], 1); + if (ret == -1) { +- fprintf(stderr, "dup2() %d\n", errno); ++ printf("dup2() %d\n", errno); + exit(EXIT_FAILURE); + } + +@@ -89,7 +89,7 @@ static void child_start(struct child_data *child, const char *program) + */ + ret = dup2(startup_pipe[0], 3); + if (ret == -1) { +- fprintf(stderr, "dup2() %d\n", errno); ++ printf("dup2() %d\n", errno); + exit(EXIT_FAILURE); + } + +@@ -107,16 +107,15 @@ static void child_start(struct child_data *child, const char *program) + */ + ret = read(3, &i, sizeof(i)); + if (ret < 0) +- fprintf(stderr, "read(startp pipe) failed: %s (%d)\n", +- strerror(errno), errno); ++ printf("read(startp pipe) failed: %s (%d)\n", ++ strerror(errno), errno); + if (ret > 0) +- fprintf(stderr, "%d bytes of data on startup pipe\n", +- ret); ++ printf("%d bytes of data on startup pipe\n", ret); + close(3); + + ret = execl(program, program, NULL); +- fprintf(stderr, "execl(%s) failed: %d (%s)\n", +- program, errno, strerror(errno)); ++ printf("execl(%s) failed: %d (%s)\n", ++ program, errno, strerror(errno)); + + exit(EXIT_FAILURE); + } else { +-- +2.43.0 + diff --git a/queue-6.6/leds-class-protect-brightness_show-with-led_cdev-led.patch b/queue-6.6/leds-class-protect-brightness_show-with-led_cdev-led.patch new file mode 100644 index 00000000000..867e5b8d497 --- /dev/null +++ b/queue-6.6/leds-class-protect-brightness_show-with-led_cdev-led.patch @@ -0,0 +1,174 @@ +From 25434192f85c54835f595c7f63a09387f5692a8f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 3 Nov 2024 21:35:27 +0530 +Subject: leds: class: Protect brightness_show() with led_cdev->led_access + mutex + +From: Mukesh Ojha + +[ Upstream commit 4ca7cd938725a4050dcd62ae9472e931d603118d ] + +There is NULL pointer issue observed if from Process A where hid device +being added which results in adding a led_cdev addition and later a +another call to access of led_cdev attribute from Process B can result +in NULL pointer issue. + +Use mutex led_cdev->led_access to protect access to led->cdev and its +attribute inside brightness_show() and max_brightness_show() and also +update the comment for mutex that it should be used to protect the led +class device fields. + + Process A Process B + + kthread+0x114 + worker_thread+0x244 + process_scheduled_works+0x248 + uhid_device_add_worker+0x24 + hid_add_device+0x120 + device_add+0x268 + bus_probe_device+0x94 + device_initial_probe+0x14 + __device_attach+0xfc + bus_for_each_drv+0x10c + __device_attach_driver+0x14c + driver_probe_device+0x3c + __driver_probe_device+0xa0 + really_probe+0x190 + hid_device_probe+0x130 + ps_probe+0x990 + ps_led_register+0x94 + devm_led_classdev_register_ext+0x58 + led_classdev_register_ext+0x1f8 + device_create_with_groups+0x48 + device_create_groups_vargs+0xc8 + device_add+0x244 + kobject_uevent+0x14 + kobject_uevent_env[jt]+0x224 + mutex_unlock[jt]+0xc4 + __mutex_unlock_slowpath+0xd4 + wake_up_q+0x70 + try_to_wake_up[jt]+0x48c + preempt_schedule_common+0x28 + __schedule+0x628 + __switch_to+0x174 + el0t_64_sync+0x1a8/0x1ac + el0t_64_sync_handler+0x68/0xbc + el0_svc+0x38/0x68 + do_el0_svc+0x1c/0x28 + el0_svc_common+0x80/0xe0 + invoke_syscall+0x58/0x114 + __arm64_sys_read+0x1c/0x2c + ksys_read+0x78/0xe8 + vfs_read+0x1e0/0x2c8 + kernfs_fop_read_iter+0x68/0x1b4 + seq_read_iter+0x158/0x4ec + kernfs_seq_show+0x44/0x54 + sysfs_kf_seq_show+0xb4/0x130 + dev_attr_show+0x38/0x74 + brightness_show+0x20/0x4c + dualshock4_led_get_brightness+0xc/0x74 + +[ 3313.874295][ T4013] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000060 +[ 3313.874301][ T4013] Mem abort info: +[ 3313.874303][ T4013] ESR = 0x0000000096000006 +[ 3313.874305][ T4013] EC = 0x25: DABT (current EL), IL = 32 bits +[ 3313.874307][ T4013] SET = 0, FnV = 0 +[ 3313.874309][ T4013] EA = 0, S1PTW = 0 +[ 3313.874311][ T4013] FSC = 0x06: level 2 translation fault +[ 3313.874313][ T4013] Data abort info: +[ 3313.874314][ T4013] ISV = 0, ISS = 0x00000006, ISS2 = 0x00000000 +[ 3313.874316][ T4013] CM = 0, WnR = 0, TnD = 0, TagAccess = 0 +[ 3313.874318][ T4013] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0 +[ 3313.874320][ T4013] user pgtable: 4k pages, 39-bit VAs, pgdp=00000008f2b0a000 +.. + +[ 3313.874332][ T4013] Dumping ftrace buffer: +[ 3313.874334][ T4013] (ftrace buffer empty) +.. +.. +[ dd3313.874639][ T4013] CPU: 6 PID: 4013 Comm: InputReader +[ 3313.874648][ T4013] pc : dualshock4_led_get_brightness+0xc/0x74 +[ 3313.874653][ T4013] lr : led_update_brightness+0x38/0x60 +[ 3313.874656][ T4013] sp : ffffffc0b910bbd0 +.. +.. +[ 3313.874685][ T4013] Call trace: +[ 3313.874687][ T4013] dualshock4_led_get_brightness+0xc/0x74 +[ 3313.874690][ T4013] brightness_show+0x20/0x4c +[ 3313.874692][ T4013] dev_attr_show+0x38/0x74 +[ 3313.874696][ T4013] sysfs_kf_seq_show+0xb4/0x130 +[ 3313.874700][ T4013] kernfs_seq_show+0x44/0x54 +[ 3313.874703][ T4013] seq_read_iter+0x158/0x4ec +[ 3313.874705][ T4013] kernfs_fop_read_iter+0x68/0x1b4 +[ 3313.874708][ T4013] vfs_read+0x1e0/0x2c8 +[ 3313.874711][ T4013] ksys_read+0x78/0xe8 +[ 3313.874714][ T4013] __arm64_sys_read+0x1c/0x2c +[ 3313.874718][ T4013] invoke_syscall+0x58/0x114 +[ 3313.874721][ T4013] el0_svc_common+0x80/0xe0 +[ 3313.874724][ T4013] do_el0_svc+0x1c/0x28 +[ 3313.874727][ T4013] el0_svc+0x38/0x68 +[ 3313.874730][ T4013] el0t_64_sync_handler+0x68/0xbc +[ 3313.874732][ T4013] el0t_64_sync+0x1a8/0x1ac + +Signed-off-by: Mukesh Ojha +Reviewed-by: Anish Kumar +Link: https://lore.kernel.org/r/20241103160527.82487-1-quic_mojha@quicinc.com +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/leds/led-class.c | 14 +++++++++++--- + include/linux/leds.h | 2 +- + 2 files changed, 12 insertions(+), 4 deletions(-) + +diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c +index c66d1bead0a4a..e7d75716632b8 100644 +--- a/drivers/leds/led-class.c ++++ b/drivers/leds/led-class.c +@@ -29,11 +29,14 @@ static ssize_t brightness_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct led_classdev *led_cdev = dev_get_drvdata(dev); ++ unsigned int brightness; + +- /* no lock needed for this */ ++ mutex_lock(&led_cdev->led_access); + led_update_brightness(led_cdev); ++ brightness = led_cdev->brightness; ++ mutex_unlock(&led_cdev->led_access); + +- return sprintf(buf, "%u\n", led_cdev->brightness); ++ return sprintf(buf, "%u\n", brightness); + } + + static ssize_t brightness_store(struct device *dev, +@@ -70,8 +73,13 @@ static ssize_t max_brightness_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct led_classdev *led_cdev = dev_get_drvdata(dev); ++ unsigned int max_brightness; ++ ++ mutex_lock(&led_cdev->led_access); ++ max_brightness = led_cdev->max_brightness; ++ mutex_unlock(&led_cdev->led_access); + +- return sprintf(buf, "%u\n", led_cdev->max_brightness); ++ return sprintf(buf, "%u\n", max_brightness); + } + static DEVICE_ATTR_RO(max_brightness); + +diff --git a/include/linux/leds.h b/include/linux/leds.h +index d3056bc6f0a1a..e91802cdc4161 100644 +--- a/include/linux/leds.h ++++ b/include/linux/leds.h +@@ -244,7 +244,7 @@ struct led_classdev { + struct kernfs_node *brightness_hw_changed_kn; + #endif + +- /* Ensures consistent access to the LED Flash Class device */ ++ /* Ensures consistent access to the LED class device */ + struct mutex led_access; + }; + +-- +2.43.0 + diff --git a/queue-6.6/loongarch-fix-sleeping-in-atomic-context-for-preempt.patch b/queue-6.6/loongarch-fix-sleeping-in-atomic-context-for-preempt.patch new file mode 100644 index 00000000000..03601642a99 --- /dev/null +++ b/queue-6.6/loongarch-fix-sleeping-in-atomic-context-for-preempt.patch @@ -0,0 +1,80 @@ +From 5e0890ce1a695f92a344c35072435677f58e9304 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Nov 2024 15:47:48 +0800 +Subject: LoongArch: Fix sleeping in atomic context for PREEMPT_RT + +From: Huacai Chen + +[ Upstream commit 88fd2b70120d52c1010257d36776876941375490 ] + +Commit bab1c299f3945ffe79 ("LoongArch: Fix sleeping in atomic context in +setup_tlb_handler()") changes the gfp flag from GFP_KERNEL to GFP_ATOMIC +for alloc_pages_node(). However, for PREEMPT_RT kernels we can still get +a "sleeping in atomic context" error: + +[ 0.372259] BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48 +[ 0.372266] in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 0, name: swapper/1 +[ 0.372268] preempt_count: 1, expected: 0 +[ 0.372270] RCU nest depth: 1, expected: 1 +[ 0.372272] 3 locks held by swapper/1/0: +[ 0.372274] #0: 900000000c9f5e60 (&pcp->lock){+.+.}-{3:3}, at: get_page_from_freelist+0x524/0x1c60 +[ 0.372294] #1: 90000000087013b8 (rcu_read_lock){....}-{1:3}, at: rt_spin_trylock+0x50/0x140 +[ 0.372305] #2: 900000047fffd388 (&zone->lock){+.+.}-{3:3}, at: __rmqueue_pcplist+0x30c/0xea0 +[ 0.372314] irq event stamp: 0 +[ 0.372316] hardirqs last enabled at (0): [<0000000000000000>] 0x0 +[ 0.372322] hardirqs last disabled at (0): [<9000000005947320>] copy_process+0x9c0/0x26e0 +[ 0.372329] softirqs last enabled at (0): [<9000000005947320>] copy_process+0x9c0/0x26e0 +[ 0.372335] softirqs last disabled at (0): [<0000000000000000>] 0x0 +[ 0.372341] CPU: 1 UID: 0 PID: 0 Comm: swapper/1 Not tainted 6.12.0-rc7+ #1891 +[ 0.372346] Hardware name: Loongson Loongson-3A5000-7A1000-1w-CRB/Loongson-LS3A5000-7A1000-1w-CRB, BIOS vUDK2018-LoongArch-V2.0.0-prebeta9 10/21/2022 +[ 0.372349] Stack : 0000000000000089 9000000005a0db9c 90000000071519c8 9000000100388000 +[ 0.372486] 900000010038b890 0000000000000000 900000010038b898 9000000007e53788 +[ 0.372492] 900000000815bcc8 900000000815bcc0 900000010038b700 0000000000000001 +[ 0.372498] 0000000000000001 4b031894b9d6b725 00000000055ec000 9000000100338fc0 +[ 0.372503] 00000000000000c4 0000000000000001 000000000000002d 0000000000000003 +[ 0.372509] 0000000000000030 0000000000000003 00000000055ec000 0000000000000003 +[ 0.372515] 900000000806d000 9000000007e53788 00000000000000b0 0000000000000004 +[ 0.372521] 0000000000000000 0000000000000000 900000000c9f5f10 0000000000000000 +[ 0.372526] 90000000076f12d8 9000000007e53788 9000000005924778 0000000000000000 +[ 0.372532] 00000000000000b0 0000000000000004 0000000000000000 0000000000070000 +[ 0.372537] ... +[ 0.372540] Call Trace: +[ 0.372542] [<9000000005924778>] show_stack+0x38/0x180 +[ 0.372548] [<90000000071519c4>] dump_stack_lvl+0x94/0xe4 +[ 0.372555] [<900000000599b880>] __might_resched+0x1a0/0x260 +[ 0.372561] [<90000000071675cc>] rt_spin_lock+0x4c/0x140 +[ 0.372565] [<9000000005cbb768>] __rmqueue_pcplist+0x308/0xea0 +[ 0.372570] [<9000000005cbed84>] get_page_from_freelist+0x564/0x1c60 +[ 0.372575] [<9000000005cc0d98>] __alloc_pages_noprof+0x218/0x1820 +[ 0.372580] [<900000000593b36c>] tlb_init+0x1ac/0x298 +[ 0.372585] [<9000000005924b74>] per_cpu_trap_init+0x114/0x140 +[ 0.372589] [<9000000005921964>] cpu_probe+0x4e4/0xa60 +[ 0.372592] [<9000000005934874>] start_secondary+0x34/0xc0 +[ 0.372599] [<900000000715615c>] smpboot_entry+0x64/0x6c + +This is because in PREEMPT_RT kernels normal spinlocks are replaced by +rt spinlocks and rt_spin_lock() will cause sleeping. Fix it by disabling +NUMA optimization completely for PREEMPT_RT kernels. + +Signed-off-by: Huacai Chen +Signed-off-by: Sasha Levin +--- + arch/loongarch/mm/tlb.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/loongarch/mm/tlb.c b/arch/loongarch/mm/tlb.c +index 56bf1dd5358aa..526310ec73c7e 100644 +--- a/arch/loongarch/mm/tlb.c ++++ b/arch/loongarch/mm/tlb.c +@@ -292,7 +292,7 @@ static void setup_tlb_handler(int cpu) + /* Avoid lockdep warning */ + rcu_cpu_starting(cpu); + +-#ifdef CONFIG_NUMA ++#if defined(CONFIG_NUMA) && !defined(CONFIG_PREEMPT_RT) + vec_sz = sizeof(exception_handlers); + + if (pcpu_handlers[cpu]) +-- +2.43.0 + diff --git a/queue-6.6/media-cx231xx-add-support-for-dexatek-usb-video-grab.patch b/queue-6.6/media-cx231xx-add-support-for-dexatek-usb-video-grab.patch new file mode 100644 index 00000000000..c8b4499095a --- /dev/null +++ b/queue-6.6/media-cx231xx-add-support-for-dexatek-usb-video-grab.patch @@ -0,0 +1,50 @@ +From 39212e9f8fed78a1cd692a569031a3c9e8c08fa1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 3 Oct 2024 19:40:40 +1000 +Subject: media: cx231xx: Add support for Dexatek USB Video Grabber 1d19:6108 + +From: Rohan Barar + +[ Upstream commit 61a830bc0ea69a05d8a4534f825c6aa618263649 ] + +Add Dexatek Technology Ltd USB Video Grabber 1d19:6108 to the cx231xx +driver. This device is sold under the name "BAUHN DVD Maker (DK8723)" by +ALDI in Australia. + +This device is similar to 1d19:6109, which is already included in cx231xx. + +Both video and audio capture function correctly after installing the +patched cx231xx driver. + +Patch Changelog +v1: + - Initial submission. +v2: + - Fix SoB + Improve subject. +v3: + - Rephrase message to not exceed 75 characters per line. + - Removed reference to external GitHub URL. + +Signed-off-by: Rohan Barar +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/usb/cx231xx/cx231xx-cards.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/media/usb/cx231xx/cx231xx-cards.c b/drivers/media/usb/cx231xx/cx231xx-cards.c +index 92efe6c1f47ba..bda729b42d05f 100644 +--- a/drivers/media/usb/cx231xx/cx231xx-cards.c ++++ b/drivers/media/usb/cx231xx/cx231xx-cards.c +@@ -994,6 +994,8 @@ const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards); + + /* table of devices that work with this driver */ + struct usb_device_id cx231xx_id_table[] = { ++ {USB_DEVICE(0x1D19, 0x6108), ++ .driver_info = CX231XX_BOARD_PV_XCAPTURE_USB}, + {USB_DEVICE(0x1D19, 0x6109), + .driver_info = CX231XX_BOARD_PV_XCAPTURE_USB}, + {USB_DEVICE(0x0572, 0x5A3C), +-- +2.43.0 + diff --git a/queue-6.6/media-uvcvideo-add-a-quirk-for-the-kaiweets-kti-w02-.patch b/queue-6.6/media-uvcvideo-add-a-quirk-for-the-kaiweets-kti-w02-.patch new file mode 100644 index 00000000000..c9bc12d7311 --- /dev/null +++ b/queue-6.6/media-uvcvideo-add-a-quirk-for-the-kaiweets-kti-w02-.patch @@ -0,0 +1,245 @@ +From bd24b9e07f8b55574976649474a2995d00847ecc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 18 Sep 2024 20:05:40 +0200 +Subject: media: uvcvideo: Add a quirk for the Kaiweets KTI-W02 infrared camera + +From: David Given + +[ Upstream commit b2ec92bb5605452d539a7aa1e42345b95acd8583 ] + +Adds a quirk to make the NXP Semiconductors 1fc9:009b chipset work. + +lsusb for the device reports: + +Bus 003 Device 011: ID 1fc9:009b NXP Semiconductors IR VIDEO +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 2.00 + bDeviceClass 239 Miscellaneous Device + bDeviceSubClass 2 [unknown] + bDeviceProtocol 1 Interface Association + bMaxPacketSize0 64 + idVendor 0x1fc9 NXP Semiconductors + idProduct 0x009b IR VIDEO + bcdDevice 1.01 + iManufacturer 1 Guide sensmart + iProduct 2 IR VIDEO + iSerial 0 + bNumConfigurations 1 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 0x00c2 + bNumInterfaces 2 + bConfigurationValue 1 + iConfiguration 0 + bmAttributes 0xc0 + Self Powered + MaxPower 100mA + Interface Association: + bLength 8 + bDescriptorType 11 + bFirstInterface 0 + bInterfaceCount 2 + bFunctionClass 14 Video + bFunctionSubClass 3 Video Interface Collection + bFunctionProtocol 0 + iFunction 3 IR Camera + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 1 + bInterfaceClass 14 Video + bInterfaceSubClass 1 Video Control + bInterfaceProtocol 0 + iInterface 0 + VideoControl Interface Descriptor: + bLength 13 + bDescriptorType 36 + bDescriptorSubtype 1 (HEADER) + bcdUVC 1.00 + wTotalLength 0x0033 + dwClockFrequency 6.000000MHz + bInCollection 1 + baInterfaceNr( 0) 1 + VideoControl Interface Descriptor: + bLength 18 + bDescriptorType 36 + bDescriptorSubtype 2 (INPUT_TERMINAL) + bTerminalID 1 + wTerminalType 0x0201 Camera Sensor + bAssocTerminal 0 + iTerminal 0 + wObjectiveFocalLengthMin 0 + wObjectiveFocalLengthMax 0 + wOcularFocalLength 0 + bControlSize 3 + bmControls 0x00000000 + VideoControl Interface Descriptor: + bLength 9 + bDescriptorType 36 + bDescriptorSubtype 3 (OUTPUT_TERMINAL) + bTerminalID 2 + wTerminalType 0x0101 USB Streaming + bAssocTerminal 0 + bSourceID 1 + iTerminal 0 + VideoControl Interface Descriptor: + bLength 11 + bDescriptorType 36 + bDescriptorSubtype 5 (PROCESSING_UNIT) + Warning: Descriptor too short + bUnitID 3 + bSourceID 1 + wMaxMultiplier 0 + bControlSize 2 + bmControls 0x00000000 + iProcessing 0 + bmVideoStandards 0x62 + NTSC - 525/60 + PAL - 525/60 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x81 EP 1 IN + bmAttributes 3 + Transfer Type Interrupt + Synch Type None + Usage Type Data + wMaxPacketSize 0x0008 1x 8 bytes + bInterval 1 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 1 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 14 Video + bInterfaceSubClass 2 Video Streaming + bInterfaceProtocol 0 + iInterface 0 + VideoStreaming Interface Descriptor: + bLength 14 + bDescriptorType 36 + bDescriptorSubtype 1 (INPUT_HEADER) + bNumFormats 1 + wTotalLength 0x0055 + bEndpointAddress 0x82 EP 2 IN + bmInfo 0 + bTerminalLink 2 + bStillCaptureMethod 2 + bTriggerSupport 0 + bTriggerUsage 0 + bControlSize 1 + bmaControls( 0) 0 + VideoStreaming Interface Descriptor: + bLength 27 + bDescriptorType 36 + bDescriptorSubtype 4 (FORMAT_UNCOMPRESSED) + bFormatIndex 1 + bNumFrameDescriptors 1 + guidFormat {e436eb7b-524f-11ce-9f53-0020af0ba770} + bBitsPerPixel 16 + bDefaultFrameIndex 1 + bAspectRatioX 0 + bAspectRatioY 0 + bmInterlaceFlags 0x00 + Interlaced stream or variable: No + Fields per frame: 2 fields + Field 1 first: No + Field pattern: Field 1 only + bCopyProtect 0 + VideoStreaming Interface Descriptor: + bLength 34 + bDescriptorType 36 + bDescriptorSubtype 5 (FRAME_UNCOMPRESSED) + bFrameIndex 1 + bmCapabilities 0x00 + Still image unsupported + wWidth 240 + wHeight 322 + dwMinBitRate 12364800 + dwMaxBitRate 30912000 + dwMaxVideoFrameBufferSize 154560 + dwDefaultFrameInterval 400000 + bFrameIntervalType 2 + dwFrameInterval( 0) 400000 + dwFrameInterval( 1) 1000000 + VideoStreaming Interface Descriptor: + bLength 10 + bDescriptorType 36 + bDescriptorSubtype 3 (STILL_IMAGE_FRAME) + bEndpointAddress 0x00 EP 0 OUT + bNumImageSizePatterns 1 + wWidth( 0) 240 + wHeight( 0) 322 + bNumCompressionPatterns 0 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 1 + bAlternateSetting 1 + bNumEndpoints 1 + bInterfaceClass 14 Video + bInterfaceSubClass 2 Video Streaming + bInterfaceProtocol 0 + iInterface 0 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x82 EP 2 IN + bmAttributes 5 + Transfer Type Isochronous + Synch Type Asynchronous + Usage Type Data + wMaxPacketSize 0x0400 1x 1024 bytes + bInterval 1 +Device Status: 0x0001 + Self Powered + +Signed-off-by: David Given +Reviewed-by: Laurent Pinchart +Reviewed-by: Ricardo Ribalda +Link: https://lore.kernel.org/r/20240918180540.10830-2-dg@cowlark.com +Signed-off-by: Laurent Pinchart +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/usb/uvc/uvc_driver.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c +index f85cbe56a679a..5a3e933df6335 100644 +--- a/drivers/media/usb/uvc/uvc_driver.c ++++ b/drivers/media/usb/uvc/uvc_driver.c +@@ -2488,6 +2488,8 @@ static const struct uvc_device_info uvc_quirk_force_y8 = { + * The Logitech cameras listed below have their interface class set to + * VENDOR_SPEC because they don't announce themselves as UVC devices, even + * though they are compliant. ++ * ++ * Sort these by vendor/product ID. + */ + static const struct usb_device_id uvc_ids[] = { + /* Quanta USB2.0 HD UVC Webcam */ +@@ -3076,6 +3078,15 @@ static const struct usb_device_id uvc_ids[] = { + .bInterfaceProtocol = 0, + .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_PROBE_MINMAX + | UVC_QUIRK_IGNORE_SELECTOR_UNIT) }, ++ /* NXP Semiconductors IR VIDEO */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x1fc9, ++ .idProduct = 0x009b, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = (kernel_ulong_t)&uvc_quirk_probe_minmax }, + /* Oculus VR Positional Tracker DK2 */ + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE + | USB_DEVICE_ID_MATCH_INT_INFO, +-- +2.43.0 + diff --git a/queue-6.6/media-uvcvideo-realsense-d421-depth-module-metadata.patch b/queue-6.6/media-uvcvideo-realsense-d421-depth-module-metadata.patch new file mode 100644 index 00000000000..99f56202279 --- /dev/null +++ b/queue-6.6/media-uvcvideo-realsense-d421-depth-module-metadata.patch @@ -0,0 +1,45 @@ +From e0ca9bce47f61f2b68f676735859dc997bfbea9d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 Aug 2024 17:27:50 +0300 +Subject: media: uvcvideo: RealSense D421 Depth module metadata + +From: Dmitry Perchanov + +[ Upstream commit c6104297c965a5ee9d4b9d0d5d9cdd224d8fd59e ] + +RealSense(R) D421 Depth module is low cost solution for 3D-stereo +vision. The module supports extended sensor metadata format D4XX. + +Signed-off-by: Dmitry Perchanov +Reviewed-by: Laurent Pinchart +Link: https://lore.kernel.org/r/d1fbfbbff5c8247a3130499985a53218c5b55c61.camel@intel.com +Signed-off-by: Laurent Pinchart +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/usb/uvc/uvc_driver.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c +index 1385cbf462d17..f85cbe56a679a 100644 +--- a/drivers/media/usb/uvc/uvc_driver.c ++++ b/drivers/media/usb/uvc/uvc_driver.c +@@ -3229,6 +3229,15 @@ static const struct usb_device_id uvc_ids[] = { + .bInterfaceSubClass = 1, + .bInterfaceProtocol = 0, + .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D421 Depth Module */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x1155, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, + /* Generic USB Video Class */ + { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, UVC_PC_PROTOCOL_UNDEFINED) }, + { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, UVC_PC_PROTOCOL_15) }, +-- +2.43.0 + diff --git a/queue-6.6/mips-loongson64-dts-really-fix-pcie-port-nodes-for-l.patch b/queue-6.6/mips-loongson64-dts-really-fix-pcie-port-nodes-for-l.patch new file mode 100644 index 00000000000..e077b78d1d6 --- /dev/null +++ b/queue-6.6/mips-loongson64-dts-really-fix-pcie-port-nodes-for-l.patch @@ -0,0 +1,268 @@ +From ab5e78db4af0d7e4105e50c4f04182a0ede1a2f9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 23 Nov 2024 11:57:37 +0800 +Subject: MIPS: Loongson64: DTS: Really fix PCIe port nodes for ls7a + +From: Xi Ruoyao + +[ Upstream commit 4fbd66d8254cedfd1218393f39d83b6c07a01917 ] + +Fix the dtc warnings: + + arch/mips/boot/dts/loongson/ls7a-pch.dtsi:68.16-416.5: Warning (interrupt_provider): /bus@10000000/pci@1a000000: '#interrupt-cells' found, but node is not an interrupt provider + arch/mips/boot/dts/loongson/ls7a-pch.dtsi:68.16-416.5: Warning (interrupt_provider): /bus@10000000/pci@1a000000: '#interrupt-cells' found, but node is not an interrupt provider + arch/mips/boot/dts/loongson/loongson64g_4core_ls7a.dtb: Warning (interrupt_map): Failed prerequisite 'interrupt_provider' + +And a runtime warning introduced in commit 045b14ca5c36 ("of: WARN on +deprecated #address-cells/#size-cells handling"): + + WARNING: CPU: 0 PID: 1 at drivers/of/base.c:106 of_bus_n_addr_cells+0x9c/0xe0 + Missing '#address-cells' in /bus@10000000/pci@1a000000/pci_bridge@9,0 + +The fix is similar to commit d89a415ff8d5 ("MIPS: Loongson64: DTS: Fix PCIe +port nodes for ls7a"), which has fixed the issue for ls2k (despite its +subject mentions ls7a). + +Signed-off-by: Xi Ruoyao +Signed-off-by: Thomas Bogendoerfer +Signed-off-by: Sasha Levin +--- + arch/mips/boot/dts/loongson/ls7a-pch.dtsi | 73 +++++++++++++++++++---- + 1 file changed, 60 insertions(+), 13 deletions(-) + +diff --git a/arch/mips/boot/dts/loongson/ls7a-pch.dtsi b/arch/mips/boot/dts/loongson/ls7a-pch.dtsi +index cce9428afc41f..ee71045883e7e 100644 +--- a/arch/mips/boot/dts/loongson/ls7a-pch.dtsi ++++ b/arch/mips/boot/dts/loongson/ls7a-pch.dtsi +@@ -70,7 +70,6 @@ + device_type = "pci"; + #address-cells = <3>; + #size-cells = <2>; +- #interrupt-cells = <2>; + msi-parent = <&msi>; + + reg = <0 0x1a000000 0 0x02000000>, +@@ -234,7 +233,7 @@ + }; + }; + +- pci_bridge@9,0 { ++ pcie@9,0 { + compatible = "pci0014,7a19.1", + "pci0014,7a19", + "pciclass060400", +@@ -244,12 +243,16 @@ + interrupts = <32 IRQ_TYPE_LEVEL_HIGH>; + interrupt-parent = <&pic>; + ++ #address-cells = <3>; ++ #size-cells = <2>; ++ device_type = "pci"; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 0>; + interrupt-map = <0 0 0 0 &pic 32 IRQ_TYPE_LEVEL_HIGH>; ++ ranges; + }; + +- pci_bridge@a,0 { ++ pcie@a,0 { + compatible = "pci0014,7a09.1", + "pci0014,7a09", + "pciclass060400", +@@ -259,12 +262,16 @@ + interrupts = <33 IRQ_TYPE_LEVEL_HIGH>; + interrupt-parent = <&pic>; + ++ #address-cells = <3>; ++ #size-cells = <2>; ++ device_type = "pci"; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 0>; + interrupt-map = <0 0 0 0 &pic 33 IRQ_TYPE_LEVEL_HIGH>; ++ ranges; + }; + +- pci_bridge@b,0 { ++ pcie@b,0 { + compatible = "pci0014,7a09.1", + "pci0014,7a09", + "pciclass060400", +@@ -274,12 +281,16 @@ + interrupts = <34 IRQ_TYPE_LEVEL_HIGH>; + interrupt-parent = <&pic>; + ++ #address-cells = <3>; ++ #size-cells = <2>; ++ device_type = "pci"; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 0>; + interrupt-map = <0 0 0 0 &pic 34 IRQ_TYPE_LEVEL_HIGH>; ++ ranges; + }; + +- pci_bridge@c,0 { ++ pcie@c,0 { + compatible = "pci0014,7a09.1", + "pci0014,7a09", + "pciclass060400", +@@ -289,12 +300,16 @@ + interrupts = <35 IRQ_TYPE_LEVEL_HIGH>; + interrupt-parent = <&pic>; + ++ #address-cells = <3>; ++ #size-cells = <2>; ++ device_type = "pci"; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 0>; + interrupt-map = <0 0 0 0 &pic 35 IRQ_TYPE_LEVEL_HIGH>; ++ ranges; + }; + +- pci_bridge@d,0 { ++ pcie@d,0 { + compatible = "pci0014,7a19.1", + "pci0014,7a19", + "pciclass060400", +@@ -304,12 +319,16 @@ + interrupts = <36 IRQ_TYPE_LEVEL_HIGH>; + interrupt-parent = <&pic>; + ++ #address-cells = <3>; ++ #size-cells = <2>; ++ device_type = "pci"; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 0>; + interrupt-map = <0 0 0 0 &pic 36 IRQ_TYPE_LEVEL_HIGH>; ++ ranges; + }; + +- pci_bridge@e,0 { ++ pcie@e,0 { + compatible = "pci0014,7a09.1", + "pci0014,7a09", + "pciclass060400", +@@ -319,12 +338,16 @@ + interrupts = <37 IRQ_TYPE_LEVEL_HIGH>; + interrupt-parent = <&pic>; + ++ #address-cells = <3>; ++ #size-cells = <2>; ++ device_type = "pci"; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 0>; + interrupt-map = <0 0 0 0 &pic 37 IRQ_TYPE_LEVEL_HIGH>; ++ ranges; + }; + +- pci_bridge@f,0 { ++ pcie@f,0 { + compatible = "pci0014,7a29.1", + "pci0014,7a29", + "pciclass060400", +@@ -334,12 +357,16 @@ + interrupts = <40 IRQ_TYPE_LEVEL_HIGH>; + interrupt-parent = <&pic>; + ++ #address-cells = <3>; ++ #size-cells = <2>; ++ device_type = "pci"; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 0>; + interrupt-map = <0 0 0 0 &pic 40 IRQ_TYPE_LEVEL_HIGH>; ++ ranges; + }; + +- pci_bridge@10,0 { ++ pcie@10,0 { + compatible = "pci0014,7a19.1", + "pci0014,7a19", + "pciclass060400", +@@ -349,12 +376,16 @@ + interrupts = <41 IRQ_TYPE_LEVEL_HIGH>; + interrupt-parent = <&pic>; + ++ #address-cells = <3>; ++ #size-cells = <2>; ++ device_type = "pci"; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 0>; + interrupt-map = <0 0 0 0 &pic 41 IRQ_TYPE_LEVEL_HIGH>; ++ ranges; + }; + +- pci_bridge@11,0 { ++ pcie@11,0 { + compatible = "pci0014,7a29.1", + "pci0014,7a29", + "pciclass060400", +@@ -364,12 +395,16 @@ + interrupts = <42 IRQ_TYPE_LEVEL_HIGH>; + interrupt-parent = <&pic>; + ++ #address-cells = <3>; ++ #size-cells = <2>; ++ device_type = "pci"; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 0>; + interrupt-map = <0 0 0 0 &pic 42 IRQ_TYPE_LEVEL_HIGH>; ++ ranges; + }; + +- pci_bridge@12,0 { ++ pcie@12,0 { + compatible = "pci0014,7a19.1", + "pci0014,7a19", + "pciclass060400", +@@ -379,12 +414,16 @@ + interrupts = <43 IRQ_TYPE_LEVEL_HIGH>; + interrupt-parent = <&pic>; + ++ #address-cells = <3>; ++ #size-cells = <2>; ++ device_type = "pci"; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 0>; + interrupt-map = <0 0 0 0 &pic 43 IRQ_TYPE_LEVEL_HIGH>; ++ ranges; + }; + +- pci_bridge@13,0 { ++ pcie@13,0 { + compatible = "pci0014,7a29.1", + "pci0014,7a29", + "pciclass060400", +@@ -394,12 +433,16 @@ + interrupts = <38 IRQ_TYPE_LEVEL_HIGH>; + interrupt-parent = <&pic>; + ++ #address-cells = <3>; ++ #size-cells = <2>; ++ device_type = "pci"; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 0>; + interrupt-map = <0 0 0 0 &pic 38 IRQ_TYPE_LEVEL_HIGH>; ++ ranges; + }; + +- pci_bridge@14,0 { ++ pcie@14,0 { + compatible = "pci0014,7a19.1", + "pci0014,7a19", + "pciclass060400", +@@ -409,9 +452,13 @@ + interrupts = <39 IRQ_TYPE_LEVEL_HIGH>; + interrupt-parent = <&pic>; + ++ #address-cells = <3>; ++ #size-cells = <2>; ++ device_type = "pci"; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 0>; + interrupt-map = <0 0 0 0 &pic 39 IRQ_TYPE_LEVEL_HIGH>; ++ ranges; + }; + }; + +-- +2.43.0 + diff --git a/queue-6.6/misc-eeprom-eeprom_93cx6-add-quirk-for-extra-read-cl.patch b/queue-6.6/misc-eeprom-eeprom_93cx6-add-quirk-for-extra-read-cl.patch new file mode 100644 index 00000000000..6887ff558d2 --- /dev/null +++ b/queue-6.6/misc-eeprom-eeprom_93cx6-add-quirk-for-extra-read-cl.patch @@ -0,0 +1,119 @@ +From df975b23fa642ae8816b77b97eabe23d3692b919 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 2 Oct 2024 11:12:33 -0400 +Subject: misc: eeprom: eeprom_93cx6: Add quirk for extra read clock cycle + +From: Parker Newman + +[ Upstream commit 7738a7ab9d12c5371ed97114ee2132d4512e9fd5 ] + +Add a quirk similar to eeprom_93xx46 to add an extra clock cycle before +reading data from the EEPROM. + +The 93Cx6 family of EEPROMs output a "dummy 0 bit" between the writing +of the op-code/address from the host to the EEPROM and the reading of +the actual data from the EEPROM. + +More info can be found on page 6 of the AT93C46 datasheet (linked below). +Similar notes are found in other 93xx6 datasheets. + +In summary the read operation for a 93Cx6 EEPROM is: +Write to EEPROM: 110[A5-A0] (9 bits) +Read from EEPROM: 0[D15-D0] (17 bits) + +Where: + 110 is the start bit and READ OpCode + [A5-A0] is the address to read from + 0 is a "dummy bit" preceding the actual data + [D15-D0] is the actual data. + +Looking at the READ timing diagrams in the 93Cx6 datasheets the dummy +bit should be clocked out on the last address bit clock cycle meaning it +should be discarded naturally. + +However, depending on the hardware configuration sometimes this dummy +bit is not discarded. This is the case with Exar PCI UARTs which require +an extra clock cycle between sending the address and reading the data. + +Datasheet: https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-5193-SEEPROM-AT93C46D-Datasheet.pdf +Reviewed-by: Andy Shevchenko +Signed-off-by: Parker Newman +Link: https://lore.kernel.org/r/0f23973efefccd2544705a0480b4ad4c2353e407.1727880931.git.pnewman@connecttech.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/misc/eeprom/eeprom_93cx6.c | 10 ++++++++++ + include/linux/eeprom_93cx6.h | 11 +++++++++++ + 2 files changed, 21 insertions(+) + +diff --git a/drivers/misc/eeprom/eeprom_93cx6.c b/drivers/misc/eeprom/eeprom_93cx6.c +index 9627294fe3e95..4c9827fe92173 100644 +--- a/drivers/misc/eeprom/eeprom_93cx6.c ++++ b/drivers/misc/eeprom/eeprom_93cx6.c +@@ -186,6 +186,11 @@ void eeprom_93cx6_read(struct eeprom_93cx6 *eeprom, const u8 word, + eeprom_93cx6_write_bits(eeprom, command, + PCI_EEPROM_WIDTH_OPCODE + eeprom->width); + ++ if (has_quirk_extra_read_cycle(eeprom)) { ++ eeprom_93cx6_pulse_high(eeprom); ++ eeprom_93cx6_pulse_low(eeprom); ++ } ++ + /* + * Read the requested 16 bits. + */ +@@ -252,6 +257,11 @@ void eeprom_93cx6_readb(struct eeprom_93cx6 *eeprom, const u8 byte, + eeprom_93cx6_write_bits(eeprom, command, + PCI_EEPROM_WIDTH_OPCODE + eeprom->width + 1); + ++ if (has_quirk_extra_read_cycle(eeprom)) { ++ eeprom_93cx6_pulse_high(eeprom); ++ eeprom_93cx6_pulse_low(eeprom); ++ } ++ + /* + * Read the requested 8 bits. + */ +diff --git a/include/linux/eeprom_93cx6.h b/include/linux/eeprom_93cx6.h +index c860c72a921d0..3a485cc0e0fa0 100644 +--- a/include/linux/eeprom_93cx6.h ++++ b/include/linux/eeprom_93cx6.h +@@ -11,6 +11,8 @@ + Supported chipsets: 93c46, 93c56 and 93c66. + */ + ++#include ++ + /* + * EEPROM operation defines. + */ +@@ -34,6 +36,7 @@ + * @register_write(struct eeprom_93cx6 *eeprom): handler to + * write to the eeprom register by using all reg_* fields. + * @width: eeprom width, should be one of the PCI_EEPROM_WIDTH_* defines ++ * @quirks: eeprom or controller quirks + * @drive_data: Set if we're driving the data line. + * @reg_data_in: register field to indicate data input + * @reg_data_out: register field to indicate data output +@@ -50,6 +53,9 @@ struct eeprom_93cx6 { + void (*register_write)(struct eeprom_93cx6 *eeprom); + + int width; ++ unsigned int quirks; ++/* Some EEPROMs require an extra clock cycle before reading */ ++#define PCI_EEPROM_QUIRK_EXTRA_READ_CYCLE BIT(0) + + char drive_data; + char reg_data_in; +@@ -71,3 +77,8 @@ extern void eeprom_93cx6_wren(struct eeprom_93cx6 *eeprom, bool enable); + + extern void eeprom_93cx6_write(struct eeprom_93cx6 *eeprom, + u8 addr, u16 data); ++ ++static inline bool has_quirk_extra_read_cycle(struct eeprom_93cx6 *eeprom) ++{ ++ return eeprom->quirks & PCI_EEPROM_QUIRK_EXTRA_READ_CYCLE; ++} +-- +2.43.0 + diff --git a/queue-6.6/mmc-core-add-sd-card-quirk-for-broken-poweroff-notif.patch b/queue-6.6/mmc-core-add-sd-card-quirk-for-broken-poweroff-notif.patch new file mode 100644 index 00000000000..138569e05fa --- /dev/null +++ b/queue-6.6/mmc-core-add-sd-card-quirk-for-broken-poweroff-notif.patch @@ -0,0 +1,114 @@ +From d674eac2e6525a1db1a937752cb5747681fe16c1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 13 Sep 2024 18:44:17 +0900 +Subject: mmc: core: Add SD card quirk for broken poweroff notification + +From: Keita Aihara + +[ Upstream commit cd068d51594d9635bf6688fc78717572b78bce6a ] + +GIGASTONE Gaming Plus microSD cards manufactured on 02/2022 report that +they support poweroff notification and cache, but they are not working +correctly. + +Flush Cache bit never gets cleared in sd_flush_cache() and Poweroff +Notification Ready bit also never gets set to 1 within 1 second from the +end of busy of CMD49 in sd_poweroff_notify(). + +This leads to I/O error and runtime PM error state. + +I observed that the same card manufactured on 01/2024 works as expected. + +This problem seems similar to the Kingston cards fixed with +commit c467c8f08185 ("mmc: Add MMC_QUIRK_BROKEN_SD_CACHE for Kingston +Canvas Go Plus from 11/2019") and should be handled using quirks. + +CID for the problematic card is here. +12345641535443002000000145016200 + +Manufacturer ID is 0x12 and defined as CID_MANFID_GIGASTONE as of now, +but would like comments on what naming is appropriate because MID list +is not public and not sure it's right. + +Signed-off-by: Keita Aihara +Link: https://lore.kernel.org/r/20240913094417.GA4191647@sony.com +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + drivers/mmc/core/card.h | 7 +++++++ + drivers/mmc/core/quirks.h | 9 +++++++++ + drivers/mmc/core/sd.c | 2 +- + include/linux/mmc/card.h | 1 + + 4 files changed, 18 insertions(+), 1 deletion(-) + +diff --git a/drivers/mmc/core/card.h b/drivers/mmc/core/card.h +index b7754a1b8d978..8476754b1b170 100644 +--- a/drivers/mmc/core/card.h ++++ b/drivers/mmc/core/card.h +@@ -82,6 +82,7 @@ struct mmc_fixup { + #define CID_MANFID_SANDISK_SD 0x3 + #define CID_MANFID_ATP 0x9 + #define CID_MANFID_TOSHIBA 0x11 ++#define CID_MANFID_GIGASTONE 0x12 + #define CID_MANFID_MICRON 0x13 + #define CID_MANFID_SAMSUNG 0x15 + #define CID_MANFID_APACER 0x27 +@@ -284,4 +285,10 @@ static inline int mmc_card_broken_cache_flush(const struct mmc_card *c) + { + return c->quirks & MMC_QUIRK_BROKEN_CACHE_FLUSH; + } ++ ++static inline int mmc_card_broken_sd_poweroff_notify(const struct mmc_card *c) ++{ ++ return c->quirks & MMC_QUIRK_BROKEN_SD_POWEROFF_NOTIFY; ++} ++ + #endif +diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h +index 92905fc46436d..89b512905be14 100644 +--- a/drivers/mmc/core/quirks.h ++++ b/drivers/mmc/core/quirks.h +@@ -25,6 +25,15 @@ static const struct mmc_fixup __maybe_unused mmc_sd_fixups[] = { + 0, -1ull, SDIO_ANY_ID, SDIO_ANY_ID, add_quirk_sd, + MMC_QUIRK_BROKEN_SD_CACHE, EXT_CSD_REV_ANY), + ++ /* ++ * GIGASTONE Gaming Plus microSD cards manufactured on 02/2022 never ++ * clear Flush Cache bit and set Poweroff Notification Ready bit. ++ */ ++ _FIXUP_EXT("ASTC", CID_MANFID_GIGASTONE, 0x3456, 2022, 2, ++ 0, -1ull, SDIO_ANY_ID, SDIO_ANY_ID, add_quirk_sd, ++ MMC_QUIRK_BROKEN_SD_CACHE | MMC_QUIRK_BROKEN_SD_POWEROFF_NOTIFY, ++ EXT_CSD_REV_ANY), ++ + END_FIXUP + }; + +diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c +index 240469a881a27..f02c3e5eb5c85 100644 +--- a/drivers/mmc/core/sd.c ++++ b/drivers/mmc/core/sd.c +@@ -1118,7 +1118,7 @@ static int sd_parse_ext_reg_power(struct mmc_card *card, u8 fno, u8 page, + card->ext_power.rev = reg_buf[0] & 0xf; + + /* Power Off Notification support at bit 4. */ +- if (reg_buf[1] & BIT(4)) ++ if ((reg_buf[1] & BIT(4)) && !mmc_card_broken_sd_poweroff_notify(card)) + card->ext_power.feature_support |= SD_EXT_POWER_OFF_NOTIFY; + + /* Power Sustenance support at bit 5. */ +diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h +index 7b12eebc5586d..afa575e362a47 100644 +--- a/include/linux/mmc/card.h ++++ b/include/linux/mmc/card.h +@@ -296,6 +296,7 @@ struct mmc_card { + #define MMC_QUIRK_BROKEN_SD_DISCARD (1<<14) /* Disable broken SD discard support */ + #define MMC_QUIRK_BROKEN_SD_CACHE (1<<15) /* Disable broken SD cache support */ + #define MMC_QUIRK_BROKEN_CACHE_FLUSH (1<<16) /* Don't flush cache until the write has occurred */ ++#define MMC_QUIRK_BROKEN_SD_POWEROFF_NOTIFY (1<<17) /* Disable broken SD poweroff notify support */ + + bool written_flag; /* Indicates eMMC has been written since power on */ + bool reenable_cmdq; /* Re-enable Command Queue */ +-- +2.43.0 + diff --git a/queue-6.6/mmc-sdhci-esdhc-imx-enable-quirks-sdhci_quirk_no_led.patch b/queue-6.6/mmc-sdhci-esdhc-imx-enable-quirks-sdhci_quirk_no_led.patch new file mode 100644 index 00000000000..550f157b7b0 --- /dev/null +++ b/queue-6.6/mmc-sdhci-esdhc-imx-enable-quirks-sdhci_quirk_no_led.patch @@ -0,0 +1,75 @@ +From 1b4ec37c9055a5fa9214f5ce00792146e243f9b1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 23 Sep 2024 14:20:16 +0800 +Subject: mmc: sdhci-esdhc-imx: enable quirks SDHCI_QUIRK_NO_LED + +From: Peng Fan + +[ Upstream commit 4dede2b76f4a760e948e1a49b1520881cb459bd3 ] + +Enable SDHCI_QUIRK_NO_LED for i.MX7ULP, i.MX8MM, i.MX8QXP and +i.MXRT1050. Even there is LCTL register bit, there is no IOMUX PAD +for it. So there is no sense to enable LED for SDHCI for these SoCs. + +Signed-off-by: Peng Fan +Reviewed-by: Haibo Chen +Acked-by: Adrian Hunter +Link: https://lore.kernel.org/r/20240923062016.1165868-1-peng.fan@oss.nxp.com +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + drivers/mmc/host/sdhci-esdhc-imx.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c +index 3b8030f3552af..e4e9b84f210b2 100644 +--- a/drivers/mmc/host/sdhci-esdhc-imx.c ++++ b/drivers/mmc/host/sdhci-esdhc-imx.c +@@ -235,6 +235,7 @@ struct esdhc_platform_data { + + struct esdhc_soc_data { + u32 flags; ++ u32 quirks; + }; + + static const struct esdhc_soc_data esdhc_imx25_data = { +@@ -306,10 +307,12 @@ static struct esdhc_soc_data usdhc_imx7ulp_data = { + | ESDHC_FLAG_HAVE_CAP1 | ESDHC_FLAG_HS200 + | ESDHC_FLAG_PMQOS | ESDHC_FLAG_HS400 + | ESDHC_FLAG_STATE_LOST_IN_LPMODE, ++ .quirks = SDHCI_QUIRK_NO_LED, + }; + static struct esdhc_soc_data usdhc_imxrt1050_data = { + .flags = ESDHC_FLAG_USDHC | ESDHC_FLAG_STD_TUNING + | ESDHC_FLAG_HAVE_CAP1 | ESDHC_FLAG_HS200, ++ .quirks = SDHCI_QUIRK_NO_LED, + }; + + static struct esdhc_soc_data usdhc_imx8qxp_data = { +@@ -318,6 +321,7 @@ static struct esdhc_soc_data usdhc_imx8qxp_data = { + | ESDHC_FLAG_HS400 | ESDHC_FLAG_HS400_ES + | ESDHC_FLAG_STATE_LOST_IN_LPMODE + | ESDHC_FLAG_CLK_RATE_LOST_IN_PM_RUNTIME, ++ .quirks = SDHCI_QUIRK_NO_LED, + }; + + static struct esdhc_soc_data usdhc_imx8mm_data = { +@@ -325,6 +329,7 @@ static struct esdhc_soc_data usdhc_imx8mm_data = { + | ESDHC_FLAG_HAVE_CAP1 | ESDHC_FLAG_HS200 + | ESDHC_FLAG_HS400 | ESDHC_FLAG_HS400_ES + | ESDHC_FLAG_STATE_LOST_IN_LPMODE, ++ .quirks = SDHCI_QUIRK_NO_LED, + }; + + struct pltfm_imx_data { +@@ -1664,6 +1669,7 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev) + + imx_data->socdata = device_get_match_data(&pdev->dev); + ++ host->quirks |= imx_data->socdata->quirks; + if (imx_data->socdata->flags & ESDHC_FLAG_PMQOS) + cpu_latency_qos_add_request(&imx_data->pm_qos_req, 0); + +-- +2.43.0 + diff --git a/queue-6.6/net-af_can-do-not-leave-a-dangling-sk-pointer-in-can.patch b/queue-6.6/net-af_can-do-not-leave-a-dangling-sk-pointer-in-can.patch new file mode 100644 index 00000000000..5d7295ca74b --- /dev/null +++ b/queue-6.6/net-af_can-do-not-leave-a-dangling-sk-pointer-in-can.patch @@ -0,0 +1,39 @@ +From 989d673b7d0eb2e441b9e7425fcb2ce8941397ca Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Oct 2024 16:38:03 +0100 +Subject: net: af_can: do not leave a dangling sk pointer in can_create() + +From: Ignat Korchagin + +[ Upstream commit 811a7ca7320c062e15d0f5b171fe6ad8592d1434 ] + +On error can_create() frees the allocated sk object, but sock_init_data() +has already attached it to the provided sock object. This will leave a +dangling sk pointer in the sock object and may cause use-after-free later. + +Signed-off-by: Ignat Korchagin +Reviewed-by: Vincent Mailhol +Reviewed-by: Kuniyuki Iwashima +Reviewed-by: Marc Kleine-Budde +Link: https://patch.msgid.link/20241014153808.51894-5-ignat@cloudflare.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/can/af_can.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/net/can/af_can.c b/net/can/af_can.c +index 7343fd487dbea..c469fc187f0c7 100644 +--- a/net/can/af_can.c ++++ b/net/can/af_can.c +@@ -171,6 +171,7 @@ static int can_create(struct net *net, struct socket *sock, int protocol, + /* release sk on errors */ + sock_orphan(sk); + sock_put(sk); ++ sock->sk = NULL; + } + + errout: +-- +2.43.0 + diff --git a/queue-6.6/net-ethernet-fs_enet-use-pa-to-format-resource_size_.patch b/queue-6.6/net-ethernet-fs_enet-use-pa-to-format-resource_size_.patch new file mode 100644 index 00000000000..8131b77b38c --- /dev/null +++ b/queue-6.6/net-ethernet-fs_enet-use-pa-to-format-resource_size_.patch @@ -0,0 +1,57 @@ +From 51349ed27f2a0a465c72024de77d9e2cf31a5a06 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Oct 2024 11:48:08 +0100 +Subject: net: ethernet: fs_enet: Use %pa to format resource_size_t + +From: Simon Horman + +[ Upstream commit 45fe45fada261e1e83fce2a07fa22835aec1cf0a ] + +The correct format string for resource_size_t is %pa which +acts on the address of the variable to be formatted [1]. + +[1] https://elixir.bootlin.com/linux/v6.11.3/source/Documentation/core-api/printk-formats.rst#L229 + +Introduced by commit 9d9326d3bc0e ("phy: Change mii_bus id field to a string") + +Flagged by gcc-14 as: + +drivers/net/ethernet/freescale/fs_enet/mii-bitbang.c: In function 'fs_mii_bitbang_init': +drivers/net/ethernet/freescale/fs_enet/mii-bitbang.c:126:46: warning: format '%x' expects argument of type 'unsigned int', but argument 4 has type 'resource_size_t' {aka 'long long unsigned int'} [-Wformat=] + 126 | snprintf(bus->id, MII_BUS_ID_SIZE, "%x", res.start); + | ~^ ~~~~~~~~~ + | | | + | | resource_size_t {aka long long unsigned int} + | unsigned int + | %llx + +No functional change intended. +Compile tested only. + +Reported-by: Geert Uytterhoeven +Closes: https://lore.kernel.org/netdev/711d7f6d-b785-7560-f4dc-c6aad2cce99@linux-m68k.org/ +Signed-off-by: Simon Horman +Reviewed-by: Daniel Machon +Link: https://patch.msgid.link/20241014-net-pa-fmt-v1-2-dcc9afb8858b@kernel.org +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/freescale/fs_enet/mii-bitbang.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/freescale/fs_enet/mii-bitbang.c b/drivers/net/ethernet/freescale/fs_enet/mii-bitbang.c +index f965a2329055e..2f4442072d059 100644 +--- a/drivers/net/ethernet/freescale/fs_enet/mii-bitbang.c ++++ b/drivers/net/ethernet/freescale/fs_enet/mii-bitbang.c +@@ -126,7 +126,7 @@ static int fs_mii_bitbang_init(struct mii_bus *bus, struct device_node *np) + * we get is an int, and the odds of multiple bitbang mdio buses + * is low enough that it's not worth going too crazy. + */ +- snprintf(bus->id, MII_BUS_ID_SIZE, "%x", res.start); ++ snprintf(bus->id, MII_BUS_ID_SIZE, "%pa", &res.start); + + data = of_get_property(np, "fsl,mdio-pin", &len); + if (!data || len != 4) +-- +2.43.0 + diff --git a/queue-6.6/net-fec_mpc52xx_phy-use-pa-to-format-resource_size_t.patch b/queue-6.6/net-fec_mpc52xx_phy-use-pa-to-format-resource_size_t.patch new file mode 100644 index 00000000000..c21f0a02012 --- /dev/null +++ b/queue-6.6/net-fec_mpc52xx_phy-use-pa-to-format-resource_size_t.patch @@ -0,0 +1,57 @@ +From b246d8515ca298420cd9e4a93047f629ab27029a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Oct 2024 11:48:07 +0100 +Subject: net: fec_mpc52xx_phy: Use %pa to format resource_size_t + +From: Simon Horman + +[ Upstream commit 020bfdc4ed94be472138c891bde4d14241cf00fd ] + +The correct format string for resource_size_t is %pa which +acts on the address of the variable to be formatted [1]. + +[1] https://elixir.bootlin.com/linux/v6.11.3/source/Documentation/core-api/printk-formats.rst#L229 + +Introduced by commit 9d9326d3bc0e ("phy: Change mii_bus id field to a string") + +Flagged by gcc-14 as: + +drivers/net/ethernet/freescale/fec_mpc52xx_phy.c: In function 'mpc52xx_fec_mdio_probe': +drivers/net/ethernet/freescale/fec_mpc52xx_phy.c:97:46: warning: format '%x' expects argument of type 'unsigned int', but argument 4 has type 'resource_size_t' {aka 'long long unsigned int'} [-Wformat=] + 97 | snprintf(bus->id, MII_BUS_ID_SIZE, "%x", res.start); + | ~^ ~~~~~~~~~ + | | | + | | resource_size_t {aka long long unsigned int} + | unsigned int + | %llx + +No functional change intended. +Compile tested only. + +Reported-by: Geert Uytterhoeven +Closes: https://lore.kernel.org/netdev/711d7f6d-b785-7560-f4dc-c6aad2cce99@linux-m68k.org/ +Signed-off-by: Simon Horman +Reviewed-by: Daniel Machon +Link: https://patch.msgid.link/20241014-net-pa-fmt-v1-1-dcc9afb8858b@kernel.org +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/freescale/fec_mpc52xx_phy.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/freescale/fec_mpc52xx_phy.c b/drivers/net/ethernet/freescale/fec_mpc52xx_phy.c +index 39689826cc8ff..ce253aac5344c 100644 +--- a/drivers/net/ethernet/freescale/fec_mpc52xx_phy.c ++++ b/drivers/net/ethernet/freescale/fec_mpc52xx_phy.c +@@ -94,7 +94,7 @@ static int mpc52xx_fec_mdio_probe(struct platform_device *of) + goto out_free; + } + +- snprintf(bus->id, MII_BUS_ID_SIZE, "%x", res.start); ++ snprintf(bus->id, MII_BUS_ID_SIZE, "%pa", &res.start); + bus->priv = priv; + + bus->parent = dev; +-- +2.43.0 + diff --git a/queue-6.6/net-ieee802154-do-not-leave-a-dangling-sk-pointer-in.patch b/queue-6.6/net-ieee802154-do-not-leave-a-dangling-sk-pointer-in.patch new file mode 100644 index 00000000000..d43038bc81d --- /dev/null +++ b/queue-6.6/net-ieee802154-do-not-leave-a-dangling-sk-pointer-in.patch @@ -0,0 +1,62 @@ +From 34d2cc8589a1bc205935461f9352082f6bfc08c8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Oct 2024 16:38:04 +0100 +Subject: net: ieee802154: do not leave a dangling sk pointer in + ieee802154_create() + +From: Ignat Korchagin + +[ Upstream commit b4fcd63f6ef79c73cafae8cf4a114def5fc3d80d ] + +sock_init_data() attaches the allocated sk object to the provided sock +object. If ieee802154_create() fails later, the allocated sk object is +freed, but the dangling pointer remains in the provided sock object, which +may allow use-after-free. + +Clear the sk pointer in the sock object on error. + +Signed-off-by: Ignat Korchagin +Reviewed-by: Miquel Raynal +Reviewed-by: Kuniyuki Iwashima +Reviewed-by: Eric Dumazet +Link: https://patch.msgid.link/20241014153808.51894-6-ignat@cloudflare.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/ieee802154/socket.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c +index 00302e8b9615b..cd4df388681e8 100644 +--- a/net/ieee802154/socket.c ++++ b/net/ieee802154/socket.c +@@ -1043,19 +1043,21 @@ static int ieee802154_create(struct net *net, struct socket *sock, + + if (sk->sk_prot->hash) { + rc = sk->sk_prot->hash(sk); +- if (rc) { +- sk_common_release(sk); +- goto out; +- } ++ if (rc) ++ goto out_sk_release; + } + + if (sk->sk_prot->init) { + rc = sk->sk_prot->init(sk); + if (rc) +- sk_common_release(sk); ++ goto out_sk_release; + } + out: + return rc; ++out_sk_release: ++ sk_common_release(sk); ++ sock->sk = NULL; ++ goto out; + } + + static const struct net_proto_family ieee802154_family_ops = { +-- +2.43.0 + diff --git a/queue-6.6/net-inet-do-not-leave-a-dangling-sk-pointer-in-inet_.patch b/queue-6.6/net-inet-do-not-leave-a-dangling-sk-pointer-in-inet_.patch new file mode 100644 index 00000000000..3dad439d00b --- /dev/null +++ b/queue-6.6/net-inet-do-not-leave-a-dangling-sk-pointer-in-inet_.patch @@ -0,0 +1,76 @@ +From ea21574b43f0712b4d8289f5922e251225b5cdf1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Oct 2024 16:38:05 +0100 +Subject: net: inet: do not leave a dangling sk pointer in inet_create() + +From: Ignat Korchagin + +[ Upstream commit 9365fa510c6f82e3aa550a09d0c5c6b44dbc78ff ] + +sock_init_data() attaches the allocated sk object to the provided sock +object. If inet_create() fails later, the sk object is freed, but the +sock object retains the dangling pointer, which may create use-after-free +later. + +Clear the sk pointer in the sock object on error. + +Signed-off-by: Ignat Korchagin +Reviewed-by: Kuniyuki Iwashima +Reviewed-by: Eric Dumazet +Link: https://patch.msgid.link/20241014153808.51894-7-ignat@cloudflare.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/ipv4/af_inet.c | 22 ++++++++++------------ + 1 file changed, 10 insertions(+), 12 deletions(-) + +diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c +index 3feff7f738a48..f336b2ddf9724 100644 +--- a/net/ipv4/af_inet.c ++++ b/net/ipv4/af_inet.c +@@ -375,32 +375,30 @@ static int inet_create(struct net *net, struct socket *sock, int protocol, + inet->inet_sport = htons(inet->inet_num); + /* Add to protocol hash chains. */ + err = sk->sk_prot->hash(sk); +- if (err) { +- sk_common_release(sk); +- goto out; +- } ++ if (err) ++ goto out_sk_release; + } + + if (sk->sk_prot->init) { + err = sk->sk_prot->init(sk); +- if (err) { +- sk_common_release(sk); +- goto out; +- } ++ if (err) ++ goto out_sk_release; + } + + if (!kern) { + err = BPF_CGROUP_RUN_PROG_INET_SOCK(sk); +- if (err) { +- sk_common_release(sk); +- goto out; +- } ++ if (err) ++ goto out_sk_release; + } + out: + return err; + out_rcu_unlock: + rcu_read_unlock(); + goto out; ++out_sk_release: ++ sk_common_release(sk); ++ sock->sk = NULL; ++ goto out; + } + + +-- +2.43.0 + diff --git a/queue-6.6/net-inet6-do-not-leave-a-dangling-sk-pointer-in-inet.patch b/queue-6.6/net-inet6-do-not-leave-a-dangling-sk-pointer-in-inet.patch new file mode 100644 index 00000000000..7eeb010f566 --- /dev/null +++ b/queue-6.6/net-inet6-do-not-leave-a-dangling-sk-pointer-in-inet.patch @@ -0,0 +1,75 @@ +From 1f1aadb503d453d6eb4e015e8b1c5baf68e3f3fb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Oct 2024 16:38:06 +0100 +Subject: net: inet6: do not leave a dangling sk pointer in inet6_create() + +From: Ignat Korchagin + +[ Upstream commit 9df99c395d0f55fb444ef39f4d6f194ca437d884 ] + +sock_init_data() attaches the allocated sk pointer to the provided sock +object. If inet6_create() fails later, the sk object is released, but the +sock object retains the dangling sk pointer, which may cause use-after-free +later. + +Clear the sock sk pointer on error. + +Signed-off-by: Ignat Korchagin +Reviewed-by: Kuniyuki Iwashima +Reviewed-by: Eric Dumazet +Link: https://patch.msgid.link/20241014153808.51894-8-ignat@cloudflare.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/ipv6/af_inet6.c | 22 ++++++++++------------ + 1 file changed, 10 insertions(+), 12 deletions(-) + +diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c +index 99843eb4d49b9..102ce1748b599 100644 +--- a/net/ipv6/af_inet6.c ++++ b/net/ipv6/af_inet6.c +@@ -250,31 +250,29 @@ static int inet6_create(struct net *net, struct socket *sock, int protocol, + */ + inet->inet_sport = htons(inet->inet_num); + err = sk->sk_prot->hash(sk); +- if (err) { +- sk_common_release(sk); +- goto out; +- } ++ if (err) ++ goto out_sk_release; + } + if (sk->sk_prot->init) { + err = sk->sk_prot->init(sk); +- if (err) { +- sk_common_release(sk); +- goto out; +- } ++ if (err) ++ goto out_sk_release; + } + + if (!kern) { + err = BPF_CGROUP_RUN_PROG_INET_SOCK(sk); +- if (err) { +- sk_common_release(sk); +- goto out; +- } ++ if (err) ++ goto out_sk_release; + } + out: + return err; + out_rcu_unlock: + rcu_read_unlock(); + goto out; ++out_sk_release: ++ sk_common_release(sk); ++ sock->sk = NULL; ++ goto out; + } + + static int __inet6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len, +-- +2.43.0 + diff --git a/queue-6.6/net-neighbor-clear-error-in-case-strict-check-is-not.patch b/queue-6.6/net-neighbor-clear-error-in-case-strict-check-is-not.patch new file mode 100644 index 00000000000..226e52aae97 --- /dev/null +++ b/queue-6.6/net-neighbor-clear-error-in-case-strict-check-is-not.patch @@ -0,0 +1,42 @@ +From 8554f88c8e382cf17189c1821b8b19ddad0e6255 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Nov 2024 16:32:21 -0800 +Subject: net/neighbor: clear error in case strict check is not set + +From: Jakub Kicinski + +[ Upstream commit 0de6a472c3b38432b2f184bd64eb70d9ea36d107 ] + +Commit 51183d233b5a ("net/neighbor: Update neigh_dump_info for strict +data checking") added strict checking. The err variable is not cleared, +so if we find no table to dump we will return the validation error even +if user did not want strict checking. + +I think the only way to hit this is to send an buggy request, and ask +for a table which doesn't exist, so there's no point treating this +as a real fix. I only noticed it because a syzbot repro depended on it +to trigger another bug. + +Reviewed-by: Simon Horman +Link: https://patch.msgid.link/20241115003221.733593-1-kuba@kernel.org +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/core/neighbour.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/net/core/neighbour.c b/net/core/neighbour.c +index 552719c3bbc3d..cb0c233e83962 100644 +--- a/net/core/neighbour.c ++++ b/net/core/neighbour.c +@@ -2875,6 +2875,7 @@ static int neigh_dump_info(struct sk_buff *skb, struct netlink_callback *cb) + err = neigh_valid_dump_req(nlh, cb->strict_check, &filter, cb->extack); + if (err < 0 && cb->strict_check) + return err; ++ err = 0; + + s_t = cb->args[0]; + +-- +2.43.0 + diff --git a/queue-6.6/net-sched-cbs-fix-integer-overflow-in-cbs_set_port_r.patch b/queue-6.6/net-sched-cbs-fix-integer-overflow-in-cbs_set_port_r.patch new file mode 100644 index 00000000000..9544ca24052 --- /dev/null +++ b/queue-6.6/net-sched-cbs-fix-integer-overflow-in-cbs_set_port_r.patch @@ -0,0 +1,40 @@ +From 5d3370789857f1808932417da1d4c3507f6a643c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 13 Oct 2024 15:45:29 +0300 +Subject: net/sched: cbs: Fix integer overflow in cbs_set_port_rate() + +From: Elena Salomatkina + +[ Upstream commit 397006ba5d918f9b74e734867e8fddbc36dc2282 ] + +The subsequent calculation of port_rate = speed * 1000 * BYTES_PER_KBIT, +where the BYTES_PER_KBIT is of type LL, may cause an overflow. +At least when speed = SPEED_20000, the expression to the left of port_rate +will be greater than INT_MAX. + +Found by Linux Verification Center (linuxtesting.org) with SVACE. + +Signed-off-by: Elena Salomatkina +Link: https://patch.msgid.link/20241013124529.1043-1-esalomatkina@ispras.ru +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/sched/sch_cbs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/sched/sch_cbs.c b/net/sched/sch_cbs.c +index cac870eb78973..0567a15d0f850 100644 +--- a/net/sched/sch_cbs.c ++++ b/net/sched/sch_cbs.c +@@ -310,7 +310,7 @@ static void cbs_set_port_rate(struct net_device *dev, struct cbs_sched_data *q) + { + struct ethtool_link_ksettings ecmd; + int speed = SPEED_10; +- int port_rate; ++ s64 port_rate; + int err; + + err = __ethtool_get_link_ksettings(dev, &ecmd); +-- +2.43.0 + diff --git a/queue-6.6/net-sfp-change-quirks-for-alcatel-lucent-g-010s-p.patch b/queue-6.6/net-sfp-change-quirks-for-alcatel-lucent-g-010s-p.patch new file mode 100644 index 00000000000..d2757226e5c --- /dev/null +++ b/queue-6.6/net-sfp-change-quirks-for-alcatel-lucent-g-010s-p.patch @@ -0,0 +1,37 @@ +From 3ae78f95a339a5a219846a831b5ccb43e16d9df4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 12 Oct 2024 01:39:17 +0800 +Subject: net: sfp: change quirks for Alcatel Lucent G-010S-P + +From: Shengyu Qu + +[ Upstream commit 90cb5f1776ba371478e2b08fbf7018c7bd781a8d ] + +Seems Alcatel Lucent G-010S-P also have the same problem that it uses +TX_FAULT pin for SOC uart. So apply sfp_fixup_ignore_tx_fault to it. + +Signed-off-by: Shengyu Qu +Link: https://patch.msgid.link/TYCPR01MB84373677E45A7BFA5A28232C98792@TYCPR01MB8437.jpnprd01.prod.outlook.com +Signed-off-by: Paolo Abeni +Signed-off-by: Sasha Levin +--- + drivers/net/phy/sfp.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c +index 4278a93b055e5..e0e4a68cda3ea 100644 +--- a/drivers/net/phy/sfp.c ++++ b/drivers/net/phy/sfp.c +@@ -441,7 +441,8 @@ static void sfp_quirk_ubnt_uf_instant(const struct sfp_eeprom_id *id, + static const struct sfp_quirk sfp_quirks[] = { + // Alcatel Lucent G-010S-P can operate at 2500base-X, but incorrectly + // report 2500MBd NRZ in their EEPROM +- SFP_QUIRK_M("ALCATELLUCENT", "G010SP", sfp_quirk_2500basex), ++ SFP_QUIRK("ALCATELLUCENT", "G010SP", sfp_quirk_2500basex, ++ sfp_fixup_ignore_tx_fault), + + // Alcatel Lucent G-010S-A can operate at 2500base-X, but report 3.2GBd + // NRZ in their EEPROM +-- +2.43.0 + diff --git a/queue-6.6/net-stmmac-programming-sequence-for-vlan-packets-wit.patch b/queue-6.6/net-stmmac-programming-sequence-for-vlan-packets-wit.patch new file mode 100644 index 00000000000..2e0f1308e91 --- /dev/null +++ b/queue-6.6/net-stmmac-programming-sequence-for-vlan-packets-wit.patch @@ -0,0 +1,116 @@ +From 3a08af08f158df127a205b68e9639205afa77999 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 16 Oct 2024 16:43:13 -0700 +Subject: net: stmmac: Programming sequence for VLAN packets with split header + +From: Abhishek Chauhan + +[ Upstream commit d10f1a4e44c3bf874701f86f8cc43490e1956acf ] + +Currently reset state configuration of split header works fine for +non-tagged packets and we see no corruption in payload of any size + +We need additional programming sequence with reset configuration to +handle VLAN tagged packets to avoid corruption in payload for packets +of size greater than 256 bytes. + +Without this change ping application complains about corruption +in payload when the size of the VLAN packet exceeds 256 bytes. + +With this change tagged and non-tagged packets of any size works fine +and there is no corruption seen. + +Current configuration which has the issue for VLAN packet +---------------------------------------------------------- + +Split happens at the position at Layer 3 header +|MAC-DA|MAC-SA|Vlan Tag|Ether type|IP header|IP data|Rest of the payload| + 2 bytes ^ + | + +With the fix we are making sure that the split happens now at +Layer 2 which is end of ethernet header and start of IP payload + +Ip traffic split +----------------- + +Bits which take care of this are SPLM and SPLOFST +SPLM = Split mode is set to Layer 2 +SPLOFST = These bits indicate the value of offset from the beginning +of Length/Type field at which header split should take place when the +appropriate SPLM is selected. Reset value is 2bytes. + +Un-tagged data (without VLAN) +|MAC-DA|MAC-SA|Ether type|IP header|IP data|Rest of the payload| + 2bytes ^ + | + +Tagged data (with VLAN) +|MAC-DA|MAC-SA|VLAN Tag|Ether type|IP header|IP data|Rest of the payload| + 2bytes ^ + | + +Non-IP traffic split such AV packet +------------------------------------ + +Bits which take care of this are +SAVE = Split AV Enable +SAVO = Split AV Offset, similar to SPLOFST but this is for AVTP +packets. + +|Preamble|MAC-DA|MAC-SA|VLAN tag|Ether type|IEEE 1722 payload|CRC| + 2bytes ^ + | + +Signed-off-by: Abhishek Chauhan +Reviewed-by: Simon Horman +Link: https://patch.msgid.link/20241016234313.3992214-1-quic_abchauha@quicinc.com +Signed-off-by: Paolo Abeni +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/stmicro/stmmac/dwmac4.h | 5 +++++ + drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c | 5 +++++ + 2 files changed, 10 insertions(+) + +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4.h b/drivers/net/ethernet/stmicro/stmmac/dwmac4.h +index d3c5306f1c41f..26cbb8f2ac2d0 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac4.h ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4.h +@@ -44,6 +44,7 @@ + #define GMAC_MDIO_DATA 0x00000204 + #define GMAC_GPIO_STATUS 0x0000020C + #define GMAC_ARP_ADDR 0x00000210 ++#define GMAC_EXT_CFG1 0x00000238 + #define GMAC_ADDR_HIGH(reg) (0x300 + reg * 8) + #define GMAC_ADDR_LOW(reg) (0x304 + reg * 8) + #define GMAC_L3L4_CTRL(reg) (0x900 + (reg) * 0x30) +@@ -284,6 +285,10 @@ enum power_event { + #define GMAC_HW_FEAT_DVLAN BIT(5) + #define GMAC_HW_FEAT_NRVF GENMASK(2, 0) + ++/* MAC extended config 1 */ ++#define GMAC_CONFIG1_SAVE_EN BIT(24) ++#define GMAC_CONFIG1_SPLM(v) FIELD_PREP(GENMASK(9, 8), v) ++ + /* GMAC GPIO Status reg */ + #define GMAC_GPO0 BIT(16) + #define GMAC_GPO1 BIT(17) +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c +index 071f128aa4907..7805a66a0bc08 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c +@@ -534,6 +534,11 @@ static void dwmac4_enable_sph(struct stmmac_priv *priv, void __iomem *ioaddr, + value |= GMAC_CONFIG_HDSMS_256; /* Segment max 256 bytes */ + writel(value, ioaddr + GMAC_EXT_CONFIG); + ++ value = readl(ioaddr + GMAC_EXT_CFG1); ++ value |= GMAC_CONFIG1_SPLM(1); /* Split mode set to L2OFST */ ++ value |= GMAC_CONFIG1_SAVE_EN; /* Enable Split AV mode */ ++ writel(value, ioaddr + GMAC_EXT_CFG1); ++ + value = readl(ioaddr + DMA_CHAN_CONTROL(dwmac4_addrs, chan)); + if (en) + value |= DMA_CONTROL_SPH; +-- +2.43.0 + diff --git a/queue-6.6/netlink-specs-add-missing-bitset-attrs-to-ethtool-sp.patch b/queue-6.6/netlink-specs-add-missing-bitset-attrs-to-ethtool-sp.patch new file mode 100644 index 00000000000..8db342eb530 --- /dev/null +++ b/queue-6.6/netlink-specs-add-missing-bitset-attrs-to-ethtool-sp.patch @@ -0,0 +1,45 @@ +From 86140e5304fe5326fd56cba9f94217525730ae0b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 18 Oct 2024 10:06:30 +0100 +Subject: netlink: specs: Add missing bitset attrs to ethtool spec + +From: Donald Hunter + +[ Upstream commit b0b3683419b45e2971b6d413c506cb818b268d35 ] + +There are a couple of attributes missing from the 'bitset' attribute-set +in the ethtool netlink spec. Add them to the spec. + +Reported-by: Kory Maincent +Closes: https://lore.kernel.org/netdev/20241017180551.1259bf5c@kmaincent-XPS-13-7390/ +Signed-off-by: Donald Hunter +Reviewed-by: Kory Maincent +Tested-by: Kory Maincent +Link: https://patch.msgid.link/20241018090630.22212-1-donald.hunter@gmail.com +Signed-off-by: Paolo Abeni +Signed-off-by: Sasha Levin +--- + Documentation/netlink/specs/ethtool.yaml | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/Documentation/netlink/specs/ethtool.yaml b/Documentation/netlink/specs/ethtool.yaml +index 837b565577ca6..3e38f69567939 100644 +--- a/Documentation/netlink/specs/ethtool.yaml ++++ b/Documentation/netlink/specs/ethtool.yaml +@@ -64,7 +64,12 @@ attribute-sets: + name: bits + type: nest + nested-attributes: bitset-bits +- ++ - ++ name: value ++ type: binary ++ - ++ name: mask ++ type: binary + - + name: string + attributes: +-- +2.43.0 + diff --git a/queue-6.6/netpoll-use-rcu_access_pointer-in-__netpoll_setup.patch b/queue-6.6/netpoll-use-rcu_access_pointer-in-__netpoll_setup.patch new file mode 100644 index 00000000000..48318f56c02 --- /dev/null +++ b/queue-6.6/netpoll-use-rcu_access_pointer-in-__netpoll_setup.patch @@ -0,0 +1,44 @@ +From cc0d0ce7566387c417e3348a02084316f7351466 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Nov 2024 03:15:17 -0800 +Subject: netpoll: Use rcu_access_pointer() in __netpoll_setup + +From: Breno Leitao + +[ Upstream commit c69c5e10adb903ae2438d4f9c16eccf43d1fcbc1 ] + +The ndev->npinfo pointer in __netpoll_setup() is RCU-protected but is being +accessed directly for a NULL check. While no RCU read lock is held in this +context, we should still use proper RCU primitives for consistency and +correctness. + +Replace the direct NULL check with rcu_access_pointer(), which is the +appropriate primitive when only checking for NULL without dereferencing +the pointer. This function provides the necessary ordering guarantees +without requiring RCU read-side protection. + +Reviewed-by: Michal Kubiak +Signed-off-by: Breno Leitao +Link: https://patch.msgid.link/20241118-netpoll_rcu-v1-1-a1888dcb4a02@debian.org +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/core/netpoll.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/core/netpoll.c b/net/core/netpoll.c +index e082139004093..1791462f1600a 100644 +--- a/net/core/netpoll.c ++++ b/net/core/netpoll.c +@@ -633,7 +633,7 @@ int __netpoll_setup(struct netpoll *np, struct net_device *ndev) + goto out; + } + +- if (!ndev->npinfo) { ++ if (!rcu_access_pointer(ndev->npinfo)) { + npinfo = kmalloc(sizeof(*npinfo), GFP_KERNEL); + if (!npinfo) { + err = -ENOMEM; +-- +2.43.0 + diff --git a/queue-6.6/nvdimm-rectify-the-illogical-code-within-nd_dax_prob.patch b/queue-6.6/nvdimm-rectify-the-illogical-code-within-nd_dax_prob.patch new file mode 100644 index 00000000000..bc8acab9644 --- /dev/null +++ b/queue-6.6/nvdimm-rectify-the-illogical-code-within-nd_dax_prob.patch @@ -0,0 +1,65 @@ +From 0877dafc626a814b27fd0ebdccc2dd1c6ceccf46 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 Nov 2024 08:55:26 +0000 +Subject: nvdimm: rectify the illogical code within nd_dax_probe() + +From: Yi Yang + +[ Upstream commit b61352101470f8b68c98af674e187cfaa7c43504 ] + +When nd_dax is NULL, nd_pfn is consequently NULL as well. Nevertheless, +it is inadvisable to perform pointer arithmetic or address-taking on a +NULL pointer. +Introduce the nd_dax_devinit() function to enhance the code's logic and +improve its readability. + +Signed-off-by: Yi Yang +Reviewed-by: Dave Jiang +Link: https://patch.msgid.link/20241108085526.527957-1-yiyang13@huawei.com +Signed-off-by: Ira Weiny +Signed-off-by: Sasha Levin +--- + drivers/nvdimm/dax_devs.c | 4 ++-- + drivers/nvdimm/nd.h | 7 +++++++ + 2 files changed, 9 insertions(+), 2 deletions(-) + +diff --git a/drivers/nvdimm/dax_devs.c b/drivers/nvdimm/dax_devs.c +index 3bd61f2457885..cfafe1fa77bab 100644 +--- a/drivers/nvdimm/dax_devs.c ++++ b/drivers/nvdimm/dax_devs.c +@@ -106,12 +106,12 @@ int nd_dax_probe(struct device *dev, struct nd_namespace_common *ndns) + + nvdimm_bus_lock(&ndns->dev); + nd_dax = nd_dax_alloc(nd_region); +- nd_pfn = &nd_dax->nd_pfn; +- dax_dev = nd_pfn_devinit(nd_pfn, ndns); ++ dax_dev = nd_dax_devinit(nd_dax, ndns); + nvdimm_bus_unlock(&ndns->dev); + if (!dax_dev) + return -ENOMEM; + pfn_sb = devm_kmalloc(dev, sizeof(*pfn_sb), GFP_KERNEL); ++ nd_pfn = &nd_dax->nd_pfn; + nd_pfn->pfn_sb = pfn_sb; + rc = nd_pfn_validate(nd_pfn, DAX_SIG); + dev_dbg(dev, "dax: %s\n", rc == 0 ? dev_name(dax_dev) : ""); +diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h +index e8b9d27dbb3c3..12774334273c1 100644 +--- a/drivers/nvdimm/nd.h ++++ b/drivers/nvdimm/nd.h +@@ -601,6 +601,13 @@ struct nd_dax *to_nd_dax(struct device *dev); + int nd_dax_probe(struct device *dev, struct nd_namespace_common *ndns); + bool is_nd_dax(const struct device *dev); + struct device *nd_dax_create(struct nd_region *nd_region); ++static inline struct device *nd_dax_devinit(struct nd_dax *nd_dax, ++ struct nd_namespace_common *ndns) ++{ ++ if (!nd_dax) ++ return NULL; ++ return nd_pfn_devinit(&nd_dax->nd_pfn, ndns); ++} + #else + static inline int nd_dax_probe(struct device *dev, + struct nd_namespace_common *ndns) +-- +2.43.0 + diff --git a/queue-6.6/pci-add-acs-quirk-for-wangxun-ff5xxx-nics.patch b/queue-6.6/pci-add-acs-quirk-for-wangxun-ff5xxx-nics.patch new file mode 100644 index 00000000000..db89619352c --- /dev/null +++ b/queue-6.6/pci-add-acs-quirk-for-wangxun-ff5xxx-nics.patch @@ -0,0 +1,63 @@ +From b94e15707c2ce56bc0ef122cc1332dc8ab56909f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Nov 2024 10:46:04 +0800 +Subject: PCI: Add ACS quirk for Wangxun FF5xxx NICs + +From: Mengyuan Lou + +[ Upstream commit aa46a3736afcb7b0793766d22479b8b99fc1b322 ] + +Wangxun FF5xxx NICs are similar to SFxxx, RP1000 and RP2000 NICs. They may +be multi-function devices, but they do not advertise an ACS capability. + +But the hardware does isolate FF5xxx functions as though it had an ACS +capability and PCI_ACS_RR and PCI_ACS_CR were set in the ACS Control +register, i.e., all peer-to-peer traffic is directed upstream instead of +being routed internally. + +Add ACS quirk for FF5xxx NICs in pci_quirk_wangxun_nic_acs() so the +functions can be in independent IOMMU groups. + +Link: https://lore.kernel.org/r/E16053DB2B80E9A5+20241115024604.30493-1-mengyuanlou@net-swift.com +Signed-off-by: Mengyuan Lou +Signed-off-by: Bjorn Helgaas +Signed-off-by: Sasha Levin +--- + drivers/pci/quirks.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c +index 54061b65a2b72..c5115ad597664 100644 +--- a/drivers/pci/quirks.c ++++ b/drivers/pci/quirks.c +@@ -4989,18 +4989,21 @@ static int pci_quirk_brcm_acs(struct pci_dev *dev, u16 acs_flags) + } + + /* +- * Wangxun 10G/1G NICs have no ACS capability, and on multi-function +- * devices, peer-to-peer transactions are not be used between the functions. +- * So add an ACS quirk for below devices to isolate functions. ++ * Wangxun 40G/25G/10G/1G NICs have no ACS capability, but on ++ * multi-function devices, the hardware isolates the functions by ++ * directing all peer-to-peer traffic upstream as though PCI_ACS_RR and ++ * PCI_ACS_CR were set. + * SFxxx 1G NICs(em). + * RP1000/RP2000 10G NICs(sp). ++ * FF5xxx 40G/25G/10G NICs(aml). + */ + static int pci_quirk_wangxun_nic_acs(struct pci_dev *dev, u16 acs_flags) + { + switch (dev->device) { +- case 0x0100 ... 0x010F: +- case 0x1001: +- case 0x2001: ++ case 0x0100 ... 0x010F: /* EM */ ++ case 0x1001: case 0x2001: /* SP */ ++ case 0x5010: case 0x5025: case 0x5040: /* AML */ ++ case 0x5110: case 0x5125: case 0x5140: /* AML */ + return pci_acs_ctrl_enabled(acs_flags, + PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF); + } +-- +2.43.0 + diff --git a/queue-6.6/pci-add-reset_subordinate-to-reset-hierarchy-below-b.patch b/queue-6.6/pci-add-reset_subordinate-to-reset-hierarchy-below-b.patch new file mode 100644 index 00000000000..80cc9f58cf0 --- /dev/null +++ b/queue-6.6/pci-add-reset_subordinate-to-reset-hierarchy-below-b.patch @@ -0,0 +1,130 @@ +From e320cbb182f686d2cbe2830f606b88b55f2a016a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 25 Oct 2024 15:27:54 -0700 +Subject: PCI: Add 'reset_subordinate' to reset hierarchy below bridge + +From: Keith Busch + +[ Upstream commit 2fa046449a82a7d0f6d9721dd83e348816038444 ] + +The "bus" and "cxl_bus" reset methods reset a device by asserting Secondary +Bus Reset on the bridge leading to the device. These only work if the +device is the only device below the bridge. + +Add a sysfs 'reset_subordinate' attribute on bridges that can assert +Secondary Bus Reset regardless of how many devices are below the bridge. + +This resets all the devices below a bridge in a single command, including +the locking and config space save/restore that reset methods normally do. + +This may be the only way to reset devices that don't support other reset +methods (ACPI, FLR, PM reset, etc). + +Link: https://lore.kernel.org/r/20241025222755.3756162-1-kbusch@meta.com +Signed-off-by: Keith Busch +[bhelgaas: commit log, add capable(CAP_SYS_ADMIN) check] +Signed-off-by: Bjorn Helgaas +Reviewed-by: Alex Williamson +Reviewed-by: Amey Narkhede +Signed-off-by: Sasha Levin +--- + Documentation/ABI/testing/sysfs-bus-pci | 11 +++++++++++ + drivers/pci/pci-sysfs.c | 26 +++++++++++++++++++++++++ + drivers/pci/pci.c | 2 +- + drivers/pci/pci.h | 1 + + 4 files changed, 39 insertions(+), 1 deletion(-) + +diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci +index ecf47559f495b..7f3e6bc3ff0ff 100644 +--- a/Documentation/ABI/testing/sysfs-bus-pci ++++ b/Documentation/ABI/testing/sysfs-bus-pci +@@ -163,6 +163,17 @@ Description: + will be present in sysfs. Writing 1 to this file + will perform reset. + ++What: /sys/bus/pci/devices/.../reset_subordinate ++Date: October 2024 ++Contact: linux-pci@vger.kernel.org ++Description: ++ This is visible only for bridge devices. If you want to reset ++ all devices attached through the subordinate bus of a specific ++ bridge device, writing 1 to this will try to do it. This will ++ affect all devices attached to the system through this bridge ++ similiar to writing 1 to their individual "reset" file, so use ++ with caution. ++ + What: /sys/bus/pci/devices/.../vpd + Date: February 2008 + Contact: Ben Hutchings +diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c +index 3317b93547167..92e8ac85f58e8 100644 +--- a/drivers/pci/pci-sysfs.c ++++ b/drivers/pci/pci-sysfs.c +@@ -517,6 +517,31 @@ static ssize_t bus_rescan_store(struct device *dev, + static struct device_attribute dev_attr_bus_rescan = __ATTR(rescan, 0200, NULL, + bus_rescan_store); + ++static ssize_t reset_subordinate_store(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ struct pci_dev *pdev = to_pci_dev(dev); ++ struct pci_bus *bus = pdev->subordinate; ++ unsigned long val; ++ ++ if (!capable(CAP_SYS_ADMIN)) ++ return -EPERM; ++ ++ if (kstrtoul(buf, 0, &val) < 0) ++ return -EINVAL; ++ ++ if (val) { ++ int ret = __pci_reset_bus(bus); ++ ++ if (ret) ++ return ret; ++ } ++ ++ return count; ++} ++static DEVICE_ATTR_WO(reset_subordinate); ++ + #if defined(CONFIG_PM) && defined(CONFIG_ACPI) + static ssize_t d3cold_allowed_store(struct device *dev, + struct device_attribute *attr, +@@ -621,6 +646,7 @@ static struct attribute *pci_dev_attrs[] = { + static struct attribute *pci_bridge_attrs[] = { + &dev_attr_subordinate_bus_number.attr, + &dev_attr_secondary_bus_number.attr, ++ &dev_attr_reset_subordinate.attr, + NULL, + }; + +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index 830877efe5059..095fa1910d36d 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -6069,7 +6069,7 @@ EXPORT_SYMBOL_GPL(pci_probe_reset_bus); + * + * Same as above except return -EAGAIN if the bus cannot be locked + */ +-static int __pci_reset_bus(struct pci_bus *bus) ++int __pci_reset_bus(struct pci_bus *bus) + { + int rc; + +diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h +index 67ec4cf2fdb4c..d69a17947ffce 100644 +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -49,6 +49,7 @@ bool pci_reset_supported(struct pci_dev *dev); + void pci_init_reset_methods(struct pci_dev *dev); + int pci_bridge_secondary_bus_reset(struct pci_dev *dev); + int pci_bus_error_reset(struct pci_dev *dev); ++int __pci_reset_bus(struct pci_bus *bus); + + struct pci_cap_saved_data { + u16 cap_nr; +-- +2.43.0 + diff --git a/queue-6.6/pci-detect-and-trust-built-in-thunderbolt-chips.patch b/queue-6.6/pci-detect-and-trust-built-in-thunderbolt-chips.patch new file mode 100644 index 00000000000..8dd9b184cbd --- /dev/null +++ b/queue-6.6/pci-detect-and-trust-built-in-thunderbolt-chips.patch @@ -0,0 +1,276 @@ +From 8b6e356de5814176aa813e84d6621a6ca32e02ee Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 10 Sep 2024 17:57:45 +0000 +Subject: PCI: Detect and trust built-in Thunderbolt chips + +From: Esther Shimanovich + +[ Upstream commit 3b96b895127b7c0aed63d82c974b46340e8466c1 ] + +Some computers with CPUs that lack Thunderbolt features use discrete +Thunderbolt chips to add Thunderbolt functionality. These Thunderbolt +chips are located within the chassis; between the Root Port labeled +ExternalFacingPort and the USB-C port. + +These Thunderbolt PCIe devices should be labeled as fixed and trusted, as +they are built into the computer. Otherwise, security policies that rely on +those flags may have unintended results, such as preventing USB-C ports +from enumerating. + +Detect the above scenario through the process of elimination. + + 1) Integrated Thunderbolt host controllers already have Thunderbolt + implemented, so anything outside their external facing Root Port is + removable and untrusted. + + Detect them using the following properties: + + - Most integrated host controllers have the "usb4-host-interface" + ACPI property, as described here: + + https://learn.microsoft.com/en-us/windows-hardware/drivers/pci/dsd-for-pcie-root-ports#mapping-native-protocols-pcie-displayport-tunneled-through-usb4-to-usb4-host-routers + + - Integrated Thunderbolt PCIe Root Ports before Alder Lake do not + have the "usb4-host-interface" ACPI property. Identify those by + their PCI IDs instead. + + 2) If a Root Port does not have integrated Thunderbolt capabilities, but + has the "ExternalFacingPort" ACPI property, that means the + manufacturer has opted to use a discrete Thunderbolt host controller + that is built into the computer. + + This host controller can be identified by virtue of being located + directly below an external-facing Root Port that lacks integrated + Thunderbolt. Label it as trusted and fixed. + + Everything downstream from it is untrusted and removable. + +The "ExternalFacingPort" ACPI property is described here: +https://learn.microsoft.com/en-us/windows-hardware/drivers/pci/dsd-for-pcie-root-ports#identifying-externally-exposed-pcie-root-ports + +Link: https://lore.kernel.org/r/20240910-trust-tbt-fix-v5-1-7a7a42a5f496@chromium.org +Suggested-by: Mika Westerberg +Signed-off-by: Esther Shimanovich +Signed-off-by: Bjorn Helgaas +Tested-by: Mika Westerberg +Tested-by: Mario Limonciello +Reviewed-by: Mika Westerberg +Reviewed-by: Mario Limonciello +Signed-off-by: Sasha Levin +--- + arch/x86/pci/acpi.c | 119 ++++++++++++++++++++++++++++++++++++++++++++ + drivers/pci/probe.c | 30 ++++++++--- + include/linux/pci.h | 6 +++ + 3 files changed, 148 insertions(+), 7 deletions(-) + +diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c +index ea2eb2ec90e2b..1e3bdefe9cb42 100644 +--- a/arch/x86/pci/acpi.c ++++ b/arch/x86/pci/acpi.c +@@ -250,6 +250,125 @@ void __init pci_acpi_crs_quirks(void) + pr_info("Please notify linux-pci@vger.kernel.org so future kernels can do this automatically\n"); + } + ++/* ++ * Check if pdev is part of a PCIe switch that is directly below the ++ * specified bridge. ++ */ ++static bool pcie_switch_directly_under(struct pci_dev *bridge, ++ struct pci_dev *pdev) ++{ ++ struct pci_dev *parent = pci_upstream_bridge(pdev); ++ ++ /* If the device doesn't have a parent, it's not under anything */ ++ if (!parent) ++ return false; ++ ++ /* ++ * If the device has a PCIe type, check if it is below the ++ * corresponding PCIe switch components (if applicable). Then check ++ * if its upstream port is directly beneath the specified bridge. ++ */ ++ switch (pci_pcie_type(pdev)) { ++ case PCI_EXP_TYPE_UPSTREAM: ++ return parent == bridge; ++ ++ case PCI_EXP_TYPE_DOWNSTREAM: ++ if (pci_pcie_type(parent) != PCI_EXP_TYPE_UPSTREAM) ++ return false; ++ parent = pci_upstream_bridge(parent); ++ return parent == bridge; ++ ++ case PCI_EXP_TYPE_ENDPOINT: ++ if (pci_pcie_type(parent) != PCI_EXP_TYPE_DOWNSTREAM) ++ return false; ++ parent = pci_upstream_bridge(parent); ++ if (!parent || pci_pcie_type(parent) != PCI_EXP_TYPE_UPSTREAM) ++ return false; ++ parent = pci_upstream_bridge(parent); ++ return parent == bridge; ++ } ++ ++ return false; ++} ++ ++static bool pcie_has_usb4_host_interface(struct pci_dev *pdev) ++{ ++ struct fwnode_handle *fwnode; ++ ++ /* ++ * For USB4, the tunneled PCIe Root or Downstream Ports are marked ++ * with the "usb4-host-interface" ACPI property, so we look for ++ * that first. This should cover most cases. ++ */ ++ fwnode = fwnode_find_reference(dev_fwnode(&pdev->dev), ++ "usb4-host-interface", 0); ++ if (!IS_ERR(fwnode)) { ++ fwnode_handle_put(fwnode); ++ return true; ++ } ++ ++ /* ++ * Any integrated Thunderbolt 3/4 PCIe Root Ports from Intel ++ * before Alder Lake do not have the "usb4-host-interface" ++ * property so we use their PCI IDs instead. All these are ++ * tunneled. This list is not expected to grow. ++ */ ++ if (pdev->vendor == PCI_VENDOR_ID_INTEL) { ++ switch (pdev->device) { ++ /* Ice Lake Thunderbolt 3 PCIe Root Ports */ ++ case 0x8a1d: ++ case 0x8a1f: ++ case 0x8a21: ++ case 0x8a23: ++ /* Tiger Lake-LP Thunderbolt 4 PCIe Root Ports */ ++ case 0x9a23: ++ case 0x9a25: ++ case 0x9a27: ++ case 0x9a29: ++ /* Tiger Lake-H Thunderbolt 4 PCIe Root Ports */ ++ case 0x9a2b: ++ case 0x9a2d: ++ case 0x9a2f: ++ case 0x9a31: ++ return true; ++ } ++ } ++ ++ return false; ++} ++ ++bool arch_pci_dev_is_removable(struct pci_dev *pdev) ++{ ++ struct pci_dev *parent, *root; ++ ++ /* pdev without a parent or Root Port is never tunneled */ ++ parent = pci_upstream_bridge(pdev); ++ if (!parent) ++ return false; ++ root = pcie_find_root_port(pdev); ++ if (!root) ++ return false; ++ ++ /* Internal PCIe devices are not tunneled */ ++ if (!root->external_facing) ++ return false; ++ ++ /* Anything directly behind a "usb4-host-interface" is tunneled */ ++ if (pcie_has_usb4_host_interface(parent)) ++ return true; ++ ++ /* ++ * Check if this is a discrete Thunderbolt/USB4 controller that is ++ * directly behind the non-USB4 PCIe Root Port marked as ++ * "ExternalFacingPort". Those are not behind a PCIe tunnel. ++ */ ++ if (pcie_switch_directly_under(root, pdev)) ++ return false; ++ ++ /* PCIe devices after the discrete chip are tunneled */ ++ return true; ++} ++ + #ifdef CONFIG_PCI_MMCONFIG + static int check_segment(u16 seg, struct device *dev, char *estr) + { +diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c +index 43159965e09e9..03b519a228403 100644 +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -1602,23 +1602,33 @@ static void set_pcie_thunderbolt(struct pci_dev *dev) + + static void set_pcie_untrusted(struct pci_dev *dev) + { +- struct pci_dev *parent; ++ struct pci_dev *parent = pci_upstream_bridge(dev); + ++ if (!parent) ++ return; + /* +- * If the upstream bridge is untrusted we treat this device ++ * If the upstream bridge is untrusted we treat this device as + * untrusted as well. + */ +- parent = pci_upstream_bridge(dev); +- if (parent && (parent->untrusted || parent->external_facing)) ++ if (parent->untrusted) { ++ dev->untrusted = true; ++ return; ++ } ++ ++ if (arch_pci_dev_is_removable(dev)) { ++ pci_dbg(dev, "marking as untrusted\n"); + dev->untrusted = true; ++ } + } + + static void pci_set_removable(struct pci_dev *dev) + { + struct pci_dev *parent = pci_upstream_bridge(dev); + ++ if (!parent) ++ return; + /* +- * We (only) consider everything downstream from an external_facing ++ * We (only) consider everything tunneled below an external_facing + * device to be removable by the user. We're mainly concerned with + * consumer platforms with user accessible thunderbolt ports that are + * vulnerable to DMA attacks, and we expect those ports to be marked by +@@ -1628,9 +1638,15 @@ static void pci_set_removable(struct pci_dev *dev) + * accessible to user / may not be removed by end user, and thus not + * exposed as "removable" to userspace. + */ +- if (parent && +- (parent->external_facing || dev_is_removable(&parent->dev))) ++ if (dev_is_removable(&parent->dev)) { ++ dev_set_removable(&dev->dev, DEVICE_REMOVABLE); ++ return; ++ } ++ ++ if (arch_pci_dev_is_removable(dev)) { ++ pci_dbg(dev, "marking as removable\n"); + dev_set_removable(&dev->dev, DEVICE_REMOVABLE); ++ } + } + + /** +diff --git a/include/linux/pci.h b/include/linux/pci.h +index 2b7e45bae9408..2d1fb935a8c86 100644 +--- a/include/linux/pci.h ++++ b/include/linux/pci.h +@@ -2577,6 +2577,12 @@ pci_host_bridge_acpi_msi_domain(struct pci_bus *bus) { return NULL; } + static inline bool pci_pr3_present(struct pci_dev *pdev) { return false; } + #endif + ++#if defined(CONFIG_X86) && defined(CONFIG_ACPI) ++bool arch_pci_dev_is_removable(struct pci_dev *pdev); ++#else ++static inline bool arch_pci_dev_is_removable(struct pci_dev *pdev) { return false; } ++#endif ++ + #ifdef CONFIG_EEH + static inline struct eeh_dev *pci_dev_to_eeh_dev(struct pci_dev *pdev) + { +-- +2.43.0 + diff --git a/queue-6.6/pci-qcom-add-support-for-ipq9574.patch b/queue-6.6/pci-qcom-add-support-for-ipq9574.patch new file mode 100644 index 00000000000..34467115bb7 --- /dev/null +++ b/queue-6.6/pci-qcom-add-support-for-ipq9574.patch @@ -0,0 +1,48 @@ +From 45aa267e2d93582d7dc395e04b2885040c5c4b89 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 1 Aug 2024 11:18:03 +0530 +Subject: PCI: qcom: Add support for IPQ9574 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: devi priya + +[ Upstream commit a63b74f2e35be3829f256922037ae5cee6bb844a ] + +Add the new IPQ9574 platform which is based on the Qcom IP rev. 1.27.0 +and Synopsys IP rev. 5.80a. + +The platform itself has four PCIe Gen3 controllers: two single-lane and +two dual-lane, all are based on Synopsys IP rev. 5.70a. As such, reuse +all the members of 'ops_2_9_0'. + +Link: https://lore.kernel.org/r/20240801054803.3015572-5-quic_srichara@quicinc.com +Co-developed-by: Anusha Rao +Signed-off-by: Anusha Rao +Signed-off-by: devi priya +Signed-off-by: Sricharan Ramabadhran +[kwilczynski: commit log] +Signed-off-by: Krzysztof Wilczyński +Reviewed-by: Dmitry Baryshkov +Reviewed-by: Manivannan Sadhasivam +Signed-off-by: Sasha Levin +--- + drivers/pci/controller/dwc/pcie-qcom.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c +index d3ca6d3493130..2427237cbe9c7 100644 +--- a/drivers/pci/controller/dwc/pcie-qcom.c ++++ b/drivers/pci/controller/dwc/pcie-qcom.c +@@ -1618,6 +1618,7 @@ static const struct of_device_id qcom_pcie_match[] = { + { .compatible = "qcom,pcie-ipq8064-v2", .data = &cfg_2_1_0 }, + { .compatible = "qcom,pcie-ipq8074", .data = &cfg_2_3_3 }, + { .compatible = "qcom,pcie-ipq8074-gen3", .data = &cfg_2_9_0 }, ++ { .compatible = "qcom,pcie-ipq9574", .data = &cfg_2_9_0 }, + { .compatible = "qcom,pcie-msm8996", .data = &cfg_2_3_2 }, + { .compatible = "qcom,pcie-qcs404", .data = &cfg_2_4_0 }, + { .compatible = "qcom,pcie-sa8540p", .data = &cfg_1_9_0 }, +-- +2.43.0 + diff --git a/queue-6.6/pci-vmd-add-did-8086-b06f-and-8086-b60b-for-intel-cl.patch b/queue-6.6/pci-vmd-add-did-8086-b06f-and-8086-b60b-for-intel-cl.patch new file mode 100644 index 00000000000..8afe6c8df71 --- /dev/null +++ b/queue-6.6/pci-vmd-add-did-8086-b06f-and-8086-b60b-for-intel-cl.patch @@ -0,0 +1,42 @@ +From 7c74b2ae8881d695756066ce92b8baee33ac6097 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 11 Oct 2024 10:56:57 -0700 +Subject: PCI: vmd: Add DID 8086:B06F and 8086:B60B for Intel client SKUs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Nirmal Patel + +[ Upstream commit b727484cace4be22be9321cc0bc9487648ba447b ] + +Add support for this VMD device which supports the bus restriction mode. +The feature that turns off vector 0 for MSI-X remapping is also enabled. + +Link: https://lore.kernel.org/r/20241011175657.249948-1-nirmal.patel@linux.intel.com +Signed-off-by: Nirmal Patel +Signed-off-by: Krzysztof Wilczyński +Reviewed-by: Manivannan Sadhasivam +Signed-off-by: Sasha Levin +--- + drivers/pci/controller/vmd.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c +index 6ac0afae0ca18..ade18991e7366 100644 +--- a/drivers/pci/controller/vmd.c ++++ b/drivers/pci/controller/vmd.c +@@ -1114,6 +1114,10 @@ static const struct pci_device_id vmd_ids[] = { + .driver_data = VMD_FEATS_CLIENT,}, + {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_VMD_9A0B), + .driver_data = VMD_FEATS_CLIENT,}, ++ {PCI_VDEVICE(INTEL, 0xb60b), ++ .driver_data = VMD_FEATS_CLIENT,}, ++ {PCI_VDEVICE(INTEL, 0xb06f), ++ .driver_data = VMD_FEATS_CLIENT,}, + {0,} + }; + MODULE_DEVICE_TABLE(pci, vmd_ids); +-- +2.43.0 + diff --git a/queue-6.6/pci-vmd-set-devices-to-d0-before-enabling-pm-l1-subs.patch b/queue-6.6/pci-vmd-set-devices-to-d0-before-enabling-pm-l1-subs.patch new file mode 100644 index 00000000000..e4b2b1c8c49 --- /dev/null +++ b/queue-6.6/pci-vmd-set-devices-to-d0-before-enabling-pm-l1-subs.patch @@ -0,0 +1,81 @@ +From 7cdb3a943a3b706efd52ed7a2c95d6f81675bbb9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 1 Oct 2024 16:34:38 +0800 +Subject: PCI: vmd: Set devices to D0 before enabling PM L1 Substates +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Jian-Hong Pan + +[ Upstream commit d66041063192497a4a97d21dbf86b79a03a7f4fb ] + +The remapped PCIe Root Port and the child device have PM L1 Substates +capability, but they are disabled originally. + +Here is a failed example on ASUS B1400CEAE: + + Capabilities: [900 v1] L1 PM Substates + L1SubCap: PCI-PM_L1.2+ PCI-PM_L1.1- ASPM_L1.2+ ASPM_L1.1- L1_PM_Substates+ + PortCommonModeRestoreTime=32us PortTPowerOnTime=10us + L1SubCtl1: PCI-PM_L1.2- PCI-PM_L1.1- ASPM_L1.2+ ASPM_L1.1- + T_CommonMode=0us LTR1.2_Threshold=101376ns + L1SubCtl2: T_PwrOn=50us + +Enable PCI-PM L1 PM Substates for devices below VMD while they are in D0 +(see PCIe r6.0, sec 5.5.4). + +Link: https://lore.kernel.org/r/20241001083438.10070-4-jhp@endlessos.org +Link: https://bugzilla.kernel.org/show_bug.cgi?id=218394 +Signed-off-by: Jian-Hong Pan +Signed-off-by: Krzysztof Wilczyński +Signed-off-by: Bjorn Helgaas +Reviewed-by: Kuppuswamy Sathyanarayanan +Signed-off-by: Sasha Levin +--- + drivers/pci/controller/vmd.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c +index ade18991e7366..992fea22fd9f8 100644 +--- a/drivers/pci/controller/vmd.c ++++ b/drivers/pci/controller/vmd.c +@@ -751,11 +751,9 @@ static int vmd_pm_enable_quirk(struct pci_dev *pdev, void *userdata) + if (!(features & VMD_FEAT_BIOS_PM_QUIRK)) + return 0; + +- pci_enable_link_state_locked(pdev, PCIE_LINK_STATE_ALL); +- + pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_LTR); + if (!pos) +- return 0; ++ goto out_state_change; + + /* + * Skip if the max snoop LTR is non-zero, indicating BIOS has set it +@@ -763,7 +761,7 @@ static int vmd_pm_enable_quirk(struct pci_dev *pdev, void *userdata) + */ + pci_read_config_dword(pdev, pos + PCI_LTR_MAX_SNOOP_LAT, <r_reg); + if (!!(ltr_reg & (PCI_LTR_VALUE_MASK | PCI_LTR_SCALE_MASK))) +- return 0; ++ goto out_state_change; + + /* + * Set the default values to the maximum required by the platform to +@@ -775,6 +773,13 @@ static int vmd_pm_enable_quirk(struct pci_dev *pdev, void *userdata) + pci_write_config_dword(pdev, pos + PCI_LTR_MAX_SNOOP_LAT, ltr_reg); + pci_info(pdev, "VMD: Default LTR value set by driver\n"); + ++out_state_change: ++ /* ++ * Ensure devices are in D0 before enabling PCI-PM L1 PM Substates, per ++ * PCIe r6.0, sec 5.5.4. ++ */ ++ pci_set_power_state_locked(pdev, PCI_D0); ++ pci_enable_link_state_locked(pdev, PCIE_LINK_STATE_ALL); + return 0; + } + +-- +2.43.0 + diff --git a/queue-6.6/perf-x86-amd-warn-only-on-new-bits-set.patch b/queue-6.6/perf-x86-amd-warn-only-on-new-bits-set.patch new file mode 100644 index 00000000000..dae0e56f41c --- /dev/null +++ b/queue-6.6/perf-x86-amd-warn-only-on-new-bits-set.patch @@ -0,0 +1,70 @@ +From dc9d071ea19f7eeafe9ea81e3c12438fb899ccce Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 1 Oct 2024 07:10:19 -0700 +Subject: perf/x86/amd: Warn only on new bits set + +From: Breno Leitao + +[ Upstream commit de20037e1b3c2f2ca97b8c12b8c7bca8abd509a7 ] + +Warning at every leaking bits can cause a flood of message, triggering +various stall-warning mechanisms to fire, including CSD locks, which +makes the machine to be unusable. + +Track the bits that are being leaked, and only warn when a new bit is +set. + +That said, this patch will help with the following issues: + +1) It will tell us which bits are being set, so, it is easy to + communicate it back to vendor, and to do a root-cause analyzes. + +2) It avoid the machine to be unusable, because, worst case + scenario, the user gets less than 60 WARNs (one per unhandled bit). + +Suggested-by: Paul E. McKenney +Signed-off-by: Breno Leitao +Signed-off-by: Peter Zijlstra (Intel) +Reviewed-by: Sandipan Das +Reviewed-by: Paul E. McKenney +Link: https://lkml.kernel.org/r/20241001141020.2620361-1-leitao@debian.org +Signed-off-by: Sasha Levin +--- + arch/x86/events/amd/core.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/arch/x86/events/amd/core.c b/arch/x86/events/amd/core.c +index 8ed10366c4a27..aa8fc2cf1bde7 100644 +--- a/arch/x86/events/amd/core.c ++++ b/arch/x86/events/amd/core.c +@@ -895,11 +895,12 @@ static int amd_pmu_handle_irq(struct pt_regs *regs) + static int amd_pmu_v2_handle_irq(struct pt_regs *regs) + { + struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events); ++ static atomic64_t status_warned = ATOMIC64_INIT(0); ++ u64 reserved, status, mask, new_bits, prev_bits; + struct perf_sample_data data; + struct hw_perf_event *hwc; + struct perf_event *event; + int handled = 0, idx; +- u64 reserved, status, mask; + bool pmu_enabled; + + /* +@@ -964,7 +965,12 @@ static int amd_pmu_v2_handle_irq(struct pt_regs *regs) + * the corresponding PMCs are expected to be inactive according to the + * active_mask + */ +- WARN_ON(status > 0); ++ if (status > 0) { ++ prev_bits = atomic64_fetch_or(status, &status_warned); ++ // A new bit was set for the very first time. ++ new_bits = status & ~prev_bits; ++ WARN(new_bits, "New overflows for inactive PMCs: %llx\n", new_bits); ++ } + + /* Clear overflow and freeze bits */ + amd_pmu_ack_global_status(~status); +-- +2.43.0 + diff --git a/queue-6.6/pinctrl-freescale-fix-compile_test-error-with-pinctr.patch b/queue-6.6/pinctrl-freescale-fix-compile_test-error-with-pinctr.patch new file mode 100644 index 00000000000..eba7cb3801a --- /dev/null +++ b/queue-6.6/pinctrl-freescale-fix-compile_test-error-with-pinctr.patch @@ -0,0 +1,40 @@ +From ab9f390abcaa9591b63a143aa06d8a2b4eedba0f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 3 Oct 2024 11:23:09 +0200 +Subject: pinctrl: freescale: fix COMPILE_TEST error with PINCTRL_IMX_SCU + +From: Esben Haabendal + +[ Upstream commit 58414a31c5713afb5449fd74a26a843d34cc62e8 ] + +When PINCTRL_IMX_SCU was selected by PINCTRL_IMX8DXL or PINCTRL_IMX8QM +combined with COMPILE_TEST on a non-arm platforms, the IMX_SCU +dependency could not be enabled. + +Reported-by: kernel test robot +Closes: https://lore.kernel.org/oe-kbuild-all/202410031439.GyTSa0kX-lkp@intel.com/ +Closes: https://lore.kernel.org/oe-kbuild-all/202410030852.q0Hukplf-lkp@intel.com/ +Signed-off-by: Esben Haabendal +Link: https://lore.kernel.org/20241003-imx-pinctrl-compile-test-fix-v1-1-145ca1948cc3@geanix.com +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/freescale/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/pinctrl/freescale/Kconfig b/drivers/pinctrl/freescale/Kconfig +index 27bdc548f3a7d..a36dae526de12 100644 +--- a/drivers/pinctrl/freescale/Kconfig ++++ b/drivers/pinctrl/freescale/Kconfig +@@ -9,7 +9,7 @@ config PINCTRL_IMX + + config PINCTRL_IMX_SCU + tristate +- depends on IMX_SCU ++ depends on IMX_SCU || COMPILE_TEST + select PINCTRL_IMX + + config PINCTRL_IMX1_CORE +-- +2.43.0 + diff --git a/queue-6.6/pinctrl-qcom-pmic-gpio-add-support-for-pm8937.patch b/queue-6.6/pinctrl-qcom-pmic-gpio-add-support-for-pm8937.patch new file mode 100644 index 00000000000..1634df3fb7d --- /dev/null +++ b/queue-6.6/pinctrl-qcom-pmic-gpio-add-support-for-pm8937.patch @@ -0,0 +1,39 @@ +From e7e2ccf0c47606e71df0bbb8be6b58ddb5130763 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 31 Oct 2024 02:19:43 +0100 +Subject: pinctrl: qcom-pmic-gpio: add support for PM8937 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Barnabás Czémán + +[ Upstream commit 89265a58ff24e3885c2c9ca722bc3aaa47018be9 ] + +PM8937 has 8 GPIO-s with holes on GPIO3, GPIO4 and GPIO6. + +Signed-off-by: Barnabás Czémán +Reviewed-by: Dmitry Baryshkov +Link: https://lore.kernel.org/20241031-msm8917-v2-2-8a075faa89b1@mainlining.org +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/qcom/pinctrl-spmi-gpio.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c +index 8acaae88b87e8..a4d0594a83265 100644 +--- a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c ++++ b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c +@@ -1226,6 +1226,8 @@ static const struct of_device_id pmic_gpio_of_match[] = { + { .compatible = "qcom,pm8550ve-gpio", .data = (void *) 8 }, + { .compatible = "qcom,pm8550vs-gpio", .data = (void *) 6 }, + { .compatible = "qcom,pm8916-gpio", .data = (void *) 4 }, ++ /* pm8937 has 8 GPIOs with holes on 3, 4 and 6 */ ++ { .compatible = "qcom,pm8937-gpio", .data = (void *) 8 }, + { .compatible = "qcom,pm8941-gpio", .data = (void *) 36 }, + /* pm8950 has 8 GPIOs with holes on 3 */ + { .compatible = "qcom,pm8950-gpio", .data = (void *) 8 }, +-- +2.43.0 + diff --git a/queue-6.6/pinctrl-qcom-spmi-mpp-add-pm8937-compatible.patch b/queue-6.6/pinctrl-qcom-spmi-mpp-add-pm8937-compatible.patch new file mode 100644 index 00000000000..da849c51b2d --- /dev/null +++ b/queue-6.6/pinctrl-qcom-spmi-mpp-add-pm8937-compatible.patch @@ -0,0 +1,39 @@ +From c3e6340bad380f9efa09d7cb071bcabfd9babfa2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 31 Oct 2024 02:19:45 +0100 +Subject: pinctrl: qcom: spmi-mpp: Add PM8937 compatible +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Barnabás Czémán + +[ Upstream commit f755261190e88f5d19fe0a3b762f0bbaff6bd438 ] + +The PM8937 provides 4 MPPs. +Add a compatible to support them. + +Reviewed-by: Dmitry Baryshkov +Signed-off-by: Barnabás Czémán +Link: https://lore.kernel.org/20241031-msm8917-v2-4-8a075faa89b1@mainlining.org +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/qcom/pinctrl-spmi-mpp.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/pinctrl/qcom/pinctrl-spmi-mpp.c b/drivers/pinctrl/qcom/pinctrl-spmi-mpp.c +index fe0393829c207..08255a87897cf 100644 +--- a/drivers/pinctrl/qcom/pinctrl-spmi-mpp.c ++++ b/drivers/pinctrl/qcom/pinctrl-spmi-mpp.c +@@ -984,6 +984,7 @@ static const struct of_device_id pmic_mpp_of_match[] = { + { .compatible = "qcom,pm8226-mpp", .data = (void *) 8 }, + { .compatible = "qcom,pm8841-mpp", .data = (void *) 4 }, + { .compatible = "qcom,pm8916-mpp", .data = (void *) 4 }, ++ { .compatible = "qcom,pm8937-mpp", .data = (void *) 4 }, + { .compatible = "qcom,pm8941-mpp", .data = (void *) 8 }, + { .compatible = "qcom,pm8950-mpp", .data = (void *) 4 }, + { .compatible = "qcom,pmi8950-mpp", .data = (void *) 4 }, +-- +2.43.0 + diff --git a/queue-6.6/pinmux-use-sequential-access-to-access-desc-pinmux-d.patch b/queue-6.6/pinmux-use-sequential-access-to-access-desc-pinmux-d.patch new file mode 100644 index 00000000000..36a6499d1fc --- /dev/null +++ b/queue-6.6/pinmux-use-sequential-access-to-access-desc-pinmux-d.patch @@ -0,0 +1,336 @@ +From 073e67284f17271081cf92a75a676042cc1b112e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 15 Oct 2024 00:59:30 +0530 +Subject: pinmux: Use sequential access to access desc->pinmux data + +From: Mukesh Ojha + +[ Upstream commit 5a3e85c3c397c781393ea5fb2f45b1f60f8a4e6e ] + +When two client of the same gpio call pinctrl_select_state() for the +same functionality, we are seeing NULL pointer issue while accessing +desc->mux_owner. + +Let's say two processes A, B executing in pin_request() for the same pin +and process A updates the desc->mux_usecount but not yet updated the +desc->mux_owner while process B see the desc->mux_usecount which got +updated by A path and further executes strcmp and while accessing +desc->mux_owner it crashes with NULL pointer. + +Serialize the access to mux related setting with a mutex lock. + + cpu0 (process A) cpu1(process B) + +pinctrl_select_state() { pinctrl_select_state() { + pin_request() { pin_request() { + ... + .... + } else { + desc->mux_usecount++; + desc->mux_usecount && strcmp(desc->mux_owner, owner)) { + + if (desc->mux_usecount > 1) + return 0; + desc->mux_owner = owner; + + } } + +Signed-off-by: Mukesh Ojha +Link: https://lore.kernel.org/20241014192930.1539673-1-quic_mojha@quicinc.com +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/core.c | 3 + + drivers/pinctrl/core.h | 1 + + drivers/pinctrl/pinmux.c | 173 ++++++++++++++++++++++----------------- + 3 files changed, 100 insertions(+), 77 deletions(-) + +diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c +index 88ee086e13763..7342148c65729 100644 +--- a/drivers/pinctrl/core.c ++++ b/drivers/pinctrl/core.c +@@ -220,6 +220,9 @@ static int pinctrl_register_one_pin(struct pinctrl_dev *pctldev, + + /* Set owner */ + pindesc->pctldev = pctldev; ++#ifdef CONFIG_PINMUX ++ mutex_init(&pindesc->mux_lock); ++#endif + + /* Copy basic pin info */ + if (pin->name) { +diff --git a/drivers/pinctrl/core.h b/drivers/pinctrl/core.h +index 530370443c191..ece4b9c71c970 100644 +--- a/drivers/pinctrl/core.h ++++ b/drivers/pinctrl/core.h +@@ -177,6 +177,7 @@ struct pin_desc { + const char *mux_owner; + const struct pinctrl_setting_mux *mux_setting; + const char *gpio_owner; ++ struct mutex mux_lock; + #endif + }; + +diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c +index 2a180a5d64a4a..97e8af88df851 100644 +--- a/drivers/pinctrl/pinmux.c ++++ b/drivers/pinctrl/pinmux.c +@@ -13,6 +13,7 @@ + #define pr_fmt(fmt) "pinmux core: " fmt + + #include ++#include + #include + #include + #include +@@ -93,6 +94,7 @@ bool pinmux_can_be_used_for_gpio(struct pinctrl_dev *pctldev, unsigned pin) + if (!desc || !ops) + return true; + ++ guard(mutex)(&desc->mux_lock); + if (ops->strict && desc->mux_usecount) + return false; + +@@ -127,29 +129,31 @@ static int pin_request(struct pinctrl_dev *pctldev, + dev_dbg(pctldev->dev, "request pin %d (%s) for %s\n", + pin, desc->name, owner); + +- if ((!gpio_range || ops->strict) && +- desc->mux_usecount && strcmp(desc->mux_owner, owner)) { +- dev_err(pctldev->dev, +- "pin %s already requested by %s; cannot claim for %s\n", +- desc->name, desc->mux_owner, owner); +- goto out; +- } ++ scoped_guard(mutex, &desc->mux_lock) { ++ if ((!gpio_range || ops->strict) && ++ desc->mux_usecount && strcmp(desc->mux_owner, owner)) { ++ dev_err(pctldev->dev, ++ "pin %s already requested by %s; cannot claim for %s\n", ++ desc->name, desc->mux_owner, owner); ++ goto out; ++ } + +- if ((gpio_range || ops->strict) && desc->gpio_owner) { +- dev_err(pctldev->dev, +- "pin %s already requested by %s; cannot claim for %s\n", +- desc->name, desc->gpio_owner, owner); +- goto out; +- } ++ if ((gpio_range || ops->strict) && desc->gpio_owner) { ++ dev_err(pctldev->dev, ++ "pin %s already requested by %s; cannot claim for %s\n", ++ desc->name, desc->gpio_owner, owner); ++ goto out; ++ } + +- if (gpio_range) { +- desc->gpio_owner = owner; +- } else { +- desc->mux_usecount++; +- if (desc->mux_usecount > 1) +- return 0; ++ if (gpio_range) { ++ desc->gpio_owner = owner; ++ } else { ++ desc->mux_usecount++; ++ if (desc->mux_usecount > 1) ++ return 0; + +- desc->mux_owner = owner; ++ desc->mux_owner = owner; ++ } + } + + /* Let each pin increase references to this module */ +@@ -180,12 +184,14 @@ static int pin_request(struct pinctrl_dev *pctldev, + + out_free_pin: + if (status) { +- if (gpio_range) { +- desc->gpio_owner = NULL; +- } else { +- desc->mux_usecount--; +- if (!desc->mux_usecount) +- desc->mux_owner = NULL; ++ scoped_guard(mutex, &desc->mux_lock) { ++ if (gpio_range) { ++ desc->gpio_owner = NULL; ++ } else { ++ desc->mux_usecount--; ++ if (!desc->mux_usecount) ++ desc->mux_owner = NULL; ++ } + } + } + out: +@@ -221,15 +227,17 @@ static const char *pin_free(struct pinctrl_dev *pctldev, int pin, + return NULL; + } + +- if (!gpio_range) { +- /* +- * A pin should not be freed more times than allocated. +- */ +- if (WARN_ON(!desc->mux_usecount)) +- return NULL; +- desc->mux_usecount--; +- if (desc->mux_usecount) +- return NULL; ++ scoped_guard(mutex, &desc->mux_lock) { ++ if (!gpio_range) { ++ /* ++ * A pin should not be freed more times than allocated. ++ */ ++ if (WARN_ON(!desc->mux_usecount)) ++ return NULL; ++ desc->mux_usecount--; ++ if (desc->mux_usecount) ++ return NULL; ++ } + } + + /* +@@ -241,13 +249,15 @@ static const char *pin_free(struct pinctrl_dev *pctldev, int pin, + else if (ops->free) + ops->free(pctldev, pin); + +- if (gpio_range) { +- owner = desc->gpio_owner; +- desc->gpio_owner = NULL; +- } else { +- owner = desc->mux_owner; +- desc->mux_owner = NULL; +- desc->mux_setting = NULL; ++ scoped_guard(mutex, &desc->mux_lock) { ++ if (gpio_range) { ++ owner = desc->gpio_owner; ++ desc->gpio_owner = NULL; ++ } else { ++ owner = desc->mux_owner; ++ desc->mux_owner = NULL; ++ desc->mux_setting = NULL; ++ } + } + + module_put(pctldev->owner); +@@ -461,7 +471,8 @@ int pinmux_enable_setting(const struct pinctrl_setting *setting) + pins[i]); + continue; + } +- desc->mux_setting = &(setting->data.mux); ++ scoped_guard(mutex, &desc->mux_lock) ++ desc->mux_setting = &(setting->data.mux); + } + + ret = ops->set_mux(pctldev, setting->data.mux.func, +@@ -475,8 +486,10 @@ int pinmux_enable_setting(const struct pinctrl_setting *setting) + err_set_mux: + for (i = 0; i < num_pins; i++) { + desc = pin_desc_get(pctldev, pins[i]); +- if (desc) +- desc->mux_setting = NULL; ++ if (desc) { ++ scoped_guard(mutex, &desc->mux_lock) ++ desc->mux_setting = NULL; ++ } + } + err_pin_request: + /* On error release all taken pins */ +@@ -495,6 +508,7 @@ void pinmux_disable_setting(const struct pinctrl_setting *setting) + unsigned num_pins = 0; + int i; + struct pin_desc *desc; ++ bool is_equal; + + if (pctlops->get_group_pins) + ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, +@@ -520,7 +534,10 @@ void pinmux_disable_setting(const struct pinctrl_setting *setting) + pins[i]); + continue; + } +- if (desc->mux_setting == &(setting->data.mux)) { ++ scoped_guard(mutex, &desc->mux_lock) ++ is_equal = (desc->mux_setting == &(setting->data.mux)); ++ ++ if (is_equal) { + pin_free(pctldev, pins[i], NULL); + } else { + const char *gname; +@@ -612,40 +629,42 @@ static int pinmux_pins_show(struct seq_file *s, void *what) + if (desc == NULL) + continue; + +- if (desc->mux_owner && +- !strcmp(desc->mux_owner, pinctrl_dev_get_name(pctldev))) +- is_hog = true; +- +- if (pmxops->strict) { +- if (desc->mux_owner) +- seq_printf(s, "pin %d (%s): device %s%s", +- pin, desc->name, desc->mux_owner, ++ scoped_guard(mutex, &desc->mux_lock) { ++ if (desc->mux_owner && ++ !strcmp(desc->mux_owner, pinctrl_dev_get_name(pctldev))) ++ is_hog = true; ++ ++ if (pmxops->strict) { ++ if (desc->mux_owner) ++ seq_printf(s, "pin %d (%s): device %s%s", ++ pin, desc->name, desc->mux_owner, ++ is_hog ? " (HOG)" : ""); ++ else if (desc->gpio_owner) ++ seq_printf(s, "pin %d (%s): GPIO %s", ++ pin, desc->name, desc->gpio_owner); ++ else ++ seq_printf(s, "pin %d (%s): UNCLAIMED", ++ pin, desc->name); ++ } else { ++ /* For non-strict controllers */ ++ seq_printf(s, "pin %d (%s): %s %s%s", pin, desc->name, ++ desc->mux_owner ? desc->mux_owner ++ : "(MUX UNCLAIMED)", ++ desc->gpio_owner ? desc->gpio_owner ++ : "(GPIO UNCLAIMED)", + is_hog ? " (HOG)" : ""); +- else if (desc->gpio_owner) +- seq_printf(s, "pin %d (%s): GPIO %s", +- pin, desc->name, desc->gpio_owner); ++ } ++ ++ /* If mux: print function+group claiming the pin */ ++ if (desc->mux_setting) ++ seq_printf(s, " function %s group %s\n", ++ pmxops->get_function_name(pctldev, ++ desc->mux_setting->func), ++ pctlops->get_group_name(pctldev, ++ desc->mux_setting->group)); + else +- seq_printf(s, "pin %d (%s): UNCLAIMED", +- pin, desc->name); +- } else { +- /* For non-strict controllers */ +- seq_printf(s, "pin %d (%s): %s %s%s", pin, desc->name, +- desc->mux_owner ? desc->mux_owner +- : "(MUX UNCLAIMED)", +- desc->gpio_owner ? desc->gpio_owner +- : "(GPIO UNCLAIMED)", +- is_hog ? " (HOG)" : ""); ++ seq_putc(s, '\n'); + } +- +- /* If mux: print function+group claiming the pin */ +- if (desc->mux_setting) +- seq_printf(s, " function %s group %s\n", +- pmxops->get_function_name(pctldev, +- desc->mux_setting->func), +- pctlops->get_group_name(pctldev, +- desc->mux_setting->group)); +- else +- seq_putc(s, '\n'); + } + + mutex_unlock(&pctldev->mutex); +-- +2.43.0 + diff --git a/queue-6.6/powerpc-prom_init-fixup-missing-powermac-size-cells.patch b/queue-6.6/powerpc-prom_init-fixup-missing-powermac-size-cells.patch new file mode 100644 index 00000000000..57997addf9e --- /dev/null +++ b/queue-6.6/powerpc-prom_init-fixup-missing-powermac-size-cells.patch @@ -0,0 +1,103 @@ +From 4e3f27f8418b3d041c2f99830c3ac9bf71614e66 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Nov 2024 13:57:10 +1100 +Subject: powerpc/prom_init: Fixup missing powermac #size-cells + +From: Michael Ellerman + +[ Upstream commit cf89c9434af122f28a3552e6f9cc5158c33ce50a ] + +On some powermacs `escc` nodes are missing `#size-cells` properties, +which is deprecated and now triggers a warning at boot since commit +045b14ca5c36 ("of: WARN on deprecated #address-cells/#size-cells +handling"). + +For example: + + Missing '#size-cells' in /pci@f2000000/mac-io@c/escc@13000 + WARNING: CPU: 0 PID: 0 at drivers/of/base.c:133 of_bus_n_size_cells+0x98/0x108 + Hardware name: PowerMac3,1 7400 0xc0209 PowerMac + ... + Call Trace: + of_bus_n_size_cells+0x98/0x108 (unreliable) + of_bus_default_count_cells+0x40/0x60 + __of_get_address+0xc8/0x21c + __of_address_to_resource+0x5c/0x228 + pmz_init_port+0x5c/0x2ec + pmz_probe.isra.0+0x144/0x1e4 + pmz_console_init+0x10/0x48 + console_init+0xcc/0x138 + start_kernel+0x5c4/0x694 + +As powermacs boot via prom_init it's possible to add the missing +properties to the device tree during boot, avoiding the warning. Note +that `escc-legacy` nodes are also missing `#size-cells` properties, but +they are skipped by the macio driver, so leave them alone. + +Depends-on: 045b14ca5c36 ("of: WARN on deprecated #address-cells/#size-cells handling") +Signed-off-by: Michael Ellerman +Reviewed-by: Rob Herring +Signed-off-by: Madhavan Srinivasan +Link: https://patch.msgid.link/20241126025710.591683-1-mpe@ellerman.id.au +Signed-off-by: Sasha Levin +--- + arch/powerpc/kernel/prom_init.c | 29 +++++++++++++++++++++++++++-- + 1 file changed, 27 insertions(+), 2 deletions(-) + +diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c +index d464ba412084d..a6090896f7497 100644 +--- a/arch/powerpc/kernel/prom_init.c ++++ b/arch/powerpc/kernel/prom_init.c +@@ -2924,7 +2924,7 @@ static void __init fixup_device_tree_chrp(void) + #endif + + #if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC) +-static void __init fixup_device_tree_pmac(void) ++static void __init fixup_device_tree_pmac64(void) + { + phandle u3, i2c, mpic; + u32 u3_rev; +@@ -2964,7 +2964,31 @@ static void __init fixup_device_tree_pmac(void) + &parent, sizeof(parent)); + } + #else +-#define fixup_device_tree_pmac() ++#define fixup_device_tree_pmac64() ++#endif ++ ++#ifdef CONFIG_PPC_PMAC ++static void __init fixup_device_tree_pmac(void) ++{ ++ __be32 val = 1; ++ char type[8]; ++ phandle node; ++ ++ // Some pmacs are missing #size-cells on escc nodes ++ for (node = 0; prom_next_node(&node); ) { ++ type[0] = '\0'; ++ prom_getprop(node, "device_type", type, sizeof(type)); ++ if (prom_strcmp(type, "escc")) ++ continue; ++ ++ if (prom_getproplen(node, "#size-cells") != PROM_ERROR) ++ continue; ++ ++ prom_setprop(node, NULL, "#size-cells", &val, sizeof(val)); ++ } ++} ++#else ++static inline void fixup_device_tree_pmac(void) { } + #endif + + #ifdef CONFIG_PPC_EFIKA +@@ -3189,6 +3213,7 @@ static void __init fixup_device_tree(void) + fixup_device_tree_maple_memory_controller(); + fixup_device_tree_chrp(); + fixup_device_tree_pmac(); ++ fixup_device_tree_pmac64(); + fixup_device_tree_efika(); + fixup_device_tree_pasemi(); + } +-- +2.43.0 + diff --git a/queue-6.6/r8169-don-t-apply-udp-padding-quirk-on-rtl8126a.patch b/queue-6.6/r8169-don-t-apply-udp-padding-quirk-on-rtl8126a.patch new file mode 100644 index 00000000000..ff1f6f14cb4 --- /dev/null +++ b/queue-6.6/r8169-don-t-apply-udp-padding-quirk-on-rtl8126a.patch @@ -0,0 +1,57 @@ +From c166fea7afcc9cf38b262ae13a82af076f4288be Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Oct 2024 07:44:23 +0200 +Subject: r8169: don't apply UDP padding quirk on RTL8126A + +From: Heiner Kallweit + +[ Upstream commit 87e26448dbda4523b73a894d96f0f788506d3795 ] + +Vendor drivers r8125/r8126 indicate that this quirk isn't needed +any longer for RTL8126A. Mimic this in r8169. + +Signed-off-by: Heiner Kallweit +Reviewed-by: Simon Horman +Link: https://patch.msgid.link/d1317187-aa81-4a69-b831-678436e4de62@gmail.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/realtek/r8169_main.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c +index 6856eb602f826..7e5258b2c4290 100644 +--- a/drivers/net/ethernet/realtek/r8169_main.c ++++ b/drivers/net/ethernet/realtek/r8169_main.c +@@ -4126,8 +4126,8 @@ static unsigned int rtl8125_quirk_udp_padto(struct rtl8169_private *tp, + { + unsigned int padto = 0, len = skb->len; + +- if (rtl_is_8125(tp) && len < 128 + RTL_MIN_PATCH_LEN && +- rtl_skb_is_udp(skb) && skb_transport_header_was_set(skb)) { ++ if (len < 128 + RTL_MIN_PATCH_LEN && rtl_skb_is_udp(skb) && ++ skb_transport_header_was_set(skb)) { + unsigned int trans_data_len = skb_tail_pointer(skb) - + skb_transport_header(skb); + +@@ -4151,9 +4151,15 @@ static unsigned int rtl8125_quirk_udp_padto(struct rtl8169_private *tp, + static unsigned int rtl_quirk_packet_padto(struct rtl8169_private *tp, + struct sk_buff *skb) + { +- unsigned int padto; ++ unsigned int padto = 0; + +- padto = rtl8125_quirk_udp_padto(tp, skb); ++ switch (tp->mac_version) { ++ case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_63: ++ padto = rtl8125_quirk_udp_padto(tp, skb); ++ break; ++ default: ++ break; ++ } + + switch (tp->mac_version) { + case RTL_GIGA_MAC_VER_34: +-- +2.43.0 + diff --git a/queue-6.6/regmap-maple-provide-lockdep-sub-class-for-maple-tre.patch b/queue-6.6/regmap-maple-provide-lockdep-sub-class-for-maple-tre.patch new file mode 100644 index 00000000000..449c05dbe29 --- /dev/null +++ b/queue-6.6/regmap-maple-provide-lockdep-sub-class-for-maple-tre.patch @@ -0,0 +1,125 @@ +From 4804eb4d9da31bed4d37776d3e2514c759967d2e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 31 Oct 2024 18:37:04 +0200 +Subject: regmap: maple: Provide lockdep (sub)class for maple tree's internal + lock + +From: Cristian Ciocaltea + +[ Upstream commit 1ed9b927e7dd8b8cff13052efe212a8ff72ec51d ] + +In some cases when using the maple tree register cache, the lockdep +validator might complain about invalid deadlocks: + +[7.131886] Possible interrupt unsafe locking scenario: + +[7.131890] CPU0 CPU1 +[7.131893] ---- ---- +[7.131896] lock(&mt->ma_lock); +[7.131904] local_irq_disable(); +[7.131907] lock(rockchip_drm_vop2:3114:(&vop2_regmap_config)->lock); +[7.131916] lock(&mt->ma_lock); +[7.131925] +[7.131928] lock(rockchip_drm_vop2:3114:(&vop2_regmap_config)->lock); +[7.131936] + *** DEADLOCK *** + +[7.131939] no locks held by swapper/0/0. +[7.131944] + the shortest dependencies between 2nd lock and 1st lock: +[7.131950] -> (&mt->ma_lock){+.+.}-{2:2} { +[7.131966] HARDIRQ-ON-W at: +[7.131973] lock_acquire+0x200/0x330 +[7.131986] _raw_spin_lock+0x50/0x70 +[7.131998] regcache_maple_write+0x68/0xe0 +[7.132010] regcache_write+0x6c/0x90 +[7.132019] _regmap_read+0x19c/0x1d0 +[7.132029] _regmap_update_bits+0xc0/0x148 +[7.132038] regmap_update_bits_base+0x6c/0xa8 +[7.132048] rk8xx_probe+0x22c/0x3d8 +[7.132057] rk8xx_spi_probe+0x74/0x88 +[7.132065] spi_probe+0xa8/0xe0 + +[...] + +[7.132675] } +[7.132678] ... key at: [] __key.0+0x0/0x10 +[7.132691] ... acquired at: +[7.132695] _raw_spin_lock+0x50/0x70 +[7.132704] regcache_maple_write+0x68/0xe0 +[7.132714] regcache_write+0x6c/0x90 +[7.132724] _regmap_read+0x19c/0x1d0 +[7.132732] _regmap_update_bits+0xc0/0x148 +[7.132741] regmap_field_update_bits_base+0x74/0xb8 +[7.132751] vop2_plane_atomic_update+0x480/0x14d8 [rockchipdrm] +[7.132820] drm_atomic_helper_commit_planes+0x1a0/0x320 [drm_kms_helper] + +[...] + +[7.135112] -> (rockchip_drm_vop2:3114:(&vop2_regmap_config)->lock){-...}-{2:2} { +[7.135130] IN-HARDIRQ-W at: +[7.135136] lock_acquire+0x200/0x330 +[7.135147] _raw_spin_lock_irqsave+0x6c/0x98 +[7.135157] regmap_lock_spinlock+0x20/0x40 +[7.135166] regmap_read+0x44/0x90 +[7.135175] vop2_isr+0x90/0x290 [rockchipdrm] +[7.135225] __handle_irq_event_percpu+0x124/0x2d0 + +In the example above, the validator seems to get the scope of +dependencies wrong, since the regmap instance used in rk8xx-spi driver +has nothing to do with the instance from vop2. + +Improve validation by sharing the regmap's lockdep class with the maple +tree's internal lock, while also providing a subclass for the latter. + +Signed-off-by: Cristian Ciocaltea +Link: https://patch.msgid.link/20241031-regmap-maple-lockdep-fix-v2-1-06a3710f3623@collabora.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/base/regmap/internal.h | 1 + + drivers/base/regmap/regcache-maple.c | 3 +++ + drivers/base/regmap/regmap.c | 1 + + 3 files changed, 5 insertions(+) + +diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h +index 9a9ea514c2d81..a29f24b15928c 100644 +--- a/drivers/base/regmap/internal.h ++++ b/drivers/base/regmap/internal.h +@@ -59,6 +59,7 @@ struct regmap { + unsigned long raw_spinlock_flags; + }; + }; ++ struct lock_class_key *lock_key; + regmap_lock lock; + regmap_unlock unlock; + void *lock_arg; /* This is passed to lock/unlock functions */ +diff --git a/drivers/base/regmap/regcache-maple.c b/drivers/base/regmap/regcache-maple.c +index 0b6c2277128b4..fb5761a5ef6ee 100644 +--- a/drivers/base/regmap/regcache-maple.c ++++ b/drivers/base/regmap/regcache-maple.c +@@ -356,6 +356,9 @@ static int regcache_maple_init(struct regmap *map) + + mt_init(mt); + ++ if (!mt_external_lock(mt) && map->lock_key) ++ lockdep_set_class_and_subclass(&mt->ma_lock, map->lock_key, 1); ++ + if (!map->num_reg_defaults) + return 0; + +diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c +index b2b26e44b8842..1db04886def61 100644 +--- a/drivers/base/regmap/regmap.c ++++ b/drivers/base/regmap/regmap.c +@@ -756,6 +756,7 @@ struct regmap *__regmap_init(struct device *dev, + lock_key, lock_name); + } + map->lock_arg = map; ++ map->lock_key = lock_key; + } + + /* +-- +2.43.0 + diff --git a/queue-6.6/rocker-fix-link-status-detection-in-rocker_carrier_i.patch b/queue-6.6/rocker-fix-link-status-detection-in-rocker_carrier_i.patch new file mode 100644 index 00000000000..9ffee6df18e --- /dev/null +++ b/queue-6.6/rocker-fix-link-status-detection-in-rocker_carrier_i.patch @@ -0,0 +1,39 @@ +From bc9f994e0ec3c356b4467d6814ef61af64bb901a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Nov 2024 18:19:46 +0300 +Subject: rocker: fix link status detection in rocker_carrier_init() + +From: Dmitry Antipov + +[ Upstream commit e64285ff41bb7a934bd815bd38f31119be62ac37 ] + +Since '1 << rocker_port->pport' may be undefined for port >= 32, +cast the left operand to 'unsigned long long' like it's done in +'rocker_port_set_enable()' above. Compile tested only. + +Found by Linux Verification Center (linuxtesting.org) with SVACE. + +Signed-off-by: Dmitry Antipov +Link: https://patch.msgid.link/20241114151946.519047-1-dmantipov@yandex.ru +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/rocker/rocker_main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/rocker/rocker_main.c b/drivers/net/ethernet/rocker/rocker_main.c +index 9e59669a93dd3..2e2826c901fcc 100644 +--- a/drivers/net/ethernet/rocker/rocker_main.c ++++ b/drivers/net/ethernet/rocker/rocker_main.c +@@ -2504,7 +2504,7 @@ static void rocker_carrier_init(const struct rocker_port *rocker_port) + u64 link_status = rocker_read64(rocker, PORT_PHYS_LINK_STATUS); + bool link_up; + +- link_up = link_status & (1 << rocker_port->pport); ++ link_up = link_status & (1ULL << rocker_port->pport); + if (link_up) + netif_carrier_on(rocker_port->dev); + else +-- +2.43.0 + diff --git a/queue-6.6/rtc-cmos-avoid-taking-rtc_lock-for-extended-period-o.patch b/queue-6.6/rtc-cmos-avoid-taking-rtc_lock-for-extended-period-o.patch new file mode 100644 index 00000000000..77447fd99df --- /dev/null +++ b/queue-6.6/rtc-cmos-avoid-taking-rtc_lock-for-extended-period-o.patch @@ -0,0 +1,95 @@ +From ff07ba1c908c90112826825a1b177b9ff642ebaf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 25 Oct 2024 13:14:57 -0700 +Subject: rtc: cmos: avoid taking rtc_lock for extended period of time +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Dmitry Torokhov + +[ Upstream commit 0a6efab33eab4e973db26d9f90c3e97a7a82e399 ] + +On my device reading entirety of /sys/devices/pnp0/00:03/cmos_nvram0/nvmem +takes about 9 msec during which time interrupts are off on the CPU that +does the read and the thread that performs the read can not be migrated +or preempted by another higher priority thread (RT or not). + +Allow readers and writers be preempted by taking and releasing rtc_lock +spinlock for each individual byte read or written rather than once per +read/write request. + +Signed-off-by: Dmitry Torokhov +Reviewed-by: Mateusz Jończyk +Link: https://lore.kernel.org/r/Zxv8QWR21AV4ztC5@google.com +Signed-off-by: Alexandre Belloni +Signed-off-by: Sasha Levin +--- + drivers/rtc/rtc-cmos.c | 31 +++++++++++++++---------------- + 1 file changed, 15 insertions(+), 16 deletions(-) + +diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c +index 35dca2accbb8d..5849d2970bba4 100644 +--- a/drivers/rtc/rtc-cmos.c ++++ b/drivers/rtc/rtc-cmos.c +@@ -645,18 +645,17 @@ static int cmos_nvram_read(void *priv, unsigned int off, void *val, + unsigned char *buf = val; + + off += NVRAM_OFFSET; +- spin_lock_irq(&rtc_lock); +- for (; count; count--, off++) { ++ for (; count; count--, off++, buf++) { ++ guard(spinlock_irq)(&rtc_lock); + if (off < 128) +- *buf++ = CMOS_READ(off); ++ *buf = CMOS_READ(off); + else if (can_bank2) +- *buf++ = cmos_read_bank2(off); ++ *buf = cmos_read_bank2(off); + else +- break; ++ return -EIO; + } +- spin_unlock_irq(&rtc_lock); + +- return count ? -EIO : 0; ++ return 0; + } + + static int cmos_nvram_write(void *priv, unsigned int off, void *val, +@@ -671,23 +670,23 @@ static int cmos_nvram_write(void *priv, unsigned int off, void *val, + * NVRAM to update, updating checksums is also part of its job. + */ + off += NVRAM_OFFSET; +- spin_lock_irq(&rtc_lock); +- for (; count; count--, off++) { ++ for (; count; count--, off++, buf++) { + /* don't trash RTC registers */ + if (off == cmos->day_alrm + || off == cmos->mon_alrm + || off == cmos->century) +- buf++; +- else if (off < 128) +- CMOS_WRITE(*buf++, off); ++ continue; ++ ++ guard(spinlock_irq)(&rtc_lock); ++ if (off < 128) ++ CMOS_WRITE(*buf, off); + else if (can_bank2) +- cmos_write_bank2(*buf++, off); ++ cmos_write_bank2(*buf, off); + else +- break; ++ return -EIO; + } +- spin_unlock_irq(&rtc_lock); + +- return count ? -EIO : 0; ++ return 0; + } + + /*----------------------------------------------------------------*/ +-- +2.43.0 + diff --git a/queue-6.6/rtla-timerlat-make-timerlat_top_cpu-_count-unsigned-.patch b/queue-6.6/rtla-timerlat-make-timerlat_top_cpu-_count-unsigned-.patch new file mode 100644 index 00000000000..02a8bbc63b4 --- /dev/null +++ b/queue-6.6/rtla-timerlat-make-timerlat_top_cpu-_count-unsigned-.patch @@ -0,0 +1,72 @@ +From 0b8030ad5be8c39c4ad0f27fa740b3140a31023b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 11 Oct 2024 14:10:14 +0200 +Subject: rtla/timerlat: Make timerlat_top_cpu->*_count unsigned long long + +From: Tomas Glozar + +[ Upstream commit 4eba4723c5254ba8251ecb7094a5078d5c300646 ] + +Most fields of struct timerlat_top_cpu are unsigned long long, but the +fields {irq,thread,user}_count are int (32-bit signed). + +This leads to overflow when tracing on a large number of CPUs for a long +enough time: +$ rtla timerlat top -a20 -c 1-127 -d 12h +... + 0 12:00:00 | IRQ Timer Latency (us) | Thread Timer Latency (us) +CPU COUNT | cur min avg max | cur min avg max + 1 #43200096 | 0 0 1 2 | 3 2 6 12 +... +127 #43200096 | 0 0 1 2 | 3 2 5 11 +ALL #119144 e4 | 0 5 4 | 2 28 16 + +The average latency should be 0-1 for IRQ and 5-6 for thread, but is +reported as 5 and 28, about 4 to 5 times more, due to the count +overflowing when summed over all CPUs: 43200096 * 127 = 5486412192, +however, 1191444898 (= 5486412192 mod MAX_INT) is reported instead, as +seen on the last line of the output, and the averages are thus ~4.6 +times higher than they should be (5486412192 / 1191444898 = ~4.6). + +Fix the issue by changing {irq,thread,user}_count fields to unsigned +long long, similarly to other fields in struct timerlat_top_cpu and to +the count variable in timerlat_top_print_sum. + +Link: https://lore.kernel.org/20241011121015.2868751-1-tglozar@redhat.com +Reported-by: Attila Fazekas +Signed-off-by: Tomas Glozar +Signed-off-by: Steven Rostedt (Google) +Signed-off-by: Sasha Levin +--- + tools/tracing/rtla/src/timerlat_top.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/tools/tracing/rtla/src/timerlat_top.c b/tools/tracing/rtla/src/timerlat_top.c +index a84f43857de14..0915092057f85 100644 +--- a/tools/tracing/rtla/src/timerlat_top.c ++++ b/tools/tracing/rtla/src/timerlat_top.c +@@ -49,9 +49,9 @@ struct timerlat_top_params { + }; + + struct timerlat_top_cpu { +- int irq_count; +- int thread_count; +- int user_count; ++ unsigned long long irq_count; ++ unsigned long long thread_count; ++ unsigned long long user_count; + + unsigned long long cur_irq; + unsigned long long min_irq; +@@ -237,7 +237,7 @@ static void timerlat_top_print(struct osnoise_tool *top, int cpu) + /* + * Unless trace is being lost, IRQ counter is always the max. + */ +- trace_seq_printf(s, "%3d #%-9d |", cpu, cpu_data->irq_count); ++ trace_seq_printf(s, "%3d #%-9llu |", cpu, cpu_data->irq_count); + + if (!cpu_data->irq_count) { + trace_seq_printf(s, "%s %s %s %s |", no_value, no_value, no_value, no_value); +-- +2.43.0 + diff --git a/queue-6.6/rtla-utils-add-idle-state-disabling-via-libcpupower.patch b/queue-6.6/rtla-utils-add-idle-state-disabling-via-libcpupower.patch new file mode 100644 index 00000000000..378cb4c3b3d --- /dev/null +++ b/queue-6.6/rtla-utils-add-idle-state-disabling-via-libcpupower.patch @@ -0,0 +1,217 @@ +From 4be9e4021b55637ef6759246788868da368e39bd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Oct 2024 16:09:11 +0200 +Subject: rtla/utils: Add idle state disabling via libcpupower + +From: Tomas Glozar + +[ Upstream commit 083d29d3784319e9e9fab3ac02683a7b26ae3480 ] + +Add functions to utils.c to disable idle states through functions of +libcpupower. This will serve as the basis for disabling idle states +per cpu when running timerlat. + +Link: https://lore.kernel.org/20241017140914.3200454-4-tglozar@redhat.com +Signed-off-by: Tomas Glozar +Signed-off-by: Steven Rostedt (Google) +Signed-off-by: Sasha Levin +--- + tools/tracing/rtla/src/utils.c | 150 +++++++++++++++++++++++++++++++++ + tools/tracing/rtla/src/utils.h | 13 +++ + 2 files changed, 163 insertions(+) + +diff --git a/tools/tracing/rtla/src/utils.c b/tools/tracing/rtla/src/utils.c +index 0735fcb827ed7..230f9fc7502dd 100644 +--- a/tools/tracing/rtla/src/utils.c ++++ b/tools/tracing/rtla/src/utils.c +@@ -4,6 +4,9 @@ + */ + + #define _GNU_SOURCE ++#ifdef HAVE_LIBCPUPOWER_SUPPORT ++#include ++#endif /* HAVE_LIBCPUPOWER_SUPPORT */ + #include + #include + #include +@@ -519,6 +522,153 @@ int set_cpu_dma_latency(int32_t latency) + return fd; + } + ++#ifdef HAVE_LIBCPUPOWER_SUPPORT ++static unsigned int **saved_cpu_idle_disable_state; ++static size_t saved_cpu_idle_disable_state_alloc_ctr; ++ ++/* ++ * save_cpu_idle_state_disable - save disable for all idle states of a cpu ++ * ++ * Saves the current disable of all idle states of a cpu, to be subsequently ++ * restored via restore_cpu_idle_disable_state. ++ * ++ * Return: idle state count on success, negative on error ++ */ ++int save_cpu_idle_disable_state(unsigned int cpu) ++{ ++ unsigned int nr_states; ++ unsigned int state; ++ int disabled; ++ int nr_cpus; ++ ++ nr_states = cpuidle_state_count(cpu); ++ ++ if (nr_states == 0) ++ return 0; ++ ++ if (saved_cpu_idle_disable_state == NULL) { ++ nr_cpus = sysconf(_SC_NPROCESSORS_CONF); ++ saved_cpu_idle_disable_state = calloc(nr_cpus, sizeof(unsigned int *)); ++ if (!saved_cpu_idle_disable_state) ++ return -1; ++ } ++ ++ saved_cpu_idle_disable_state[cpu] = calloc(nr_states, sizeof(unsigned int)); ++ if (!saved_cpu_idle_disable_state[cpu]) ++ return -1; ++ saved_cpu_idle_disable_state_alloc_ctr++; ++ ++ for (state = 0; state < nr_states; state++) { ++ disabled = cpuidle_is_state_disabled(cpu, state); ++ if (disabled < 0) ++ return disabled; ++ saved_cpu_idle_disable_state[cpu][state] = disabled; ++ } ++ ++ return nr_states; ++} ++ ++/* ++ * restore_cpu_idle_disable_state - restore disable for all idle states of a cpu ++ * ++ * Restores the current disable state of all idle states of a cpu that was ++ * previously saved by save_cpu_idle_disable_state. ++ * ++ * Return: idle state count on success, negative on error ++ */ ++int restore_cpu_idle_disable_state(unsigned int cpu) ++{ ++ unsigned int nr_states; ++ unsigned int state; ++ int disabled; ++ int result; ++ ++ nr_states = cpuidle_state_count(cpu); ++ ++ if (nr_states == 0) ++ return 0; ++ ++ if (!saved_cpu_idle_disable_state) ++ return -1; ++ ++ for (state = 0; state < nr_states; state++) { ++ if (!saved_cpu_idle_disable_state[cpu]) ++ return -1; ++ disabled = saved_cpu_idle_disable_state[cpu][state]; ++ result = cpuidle_state_disable(cpu, state, disabled); ++ if (result < 0) ++ return result; ++ } ++ ++ free(saved_cpu_idle_disable_state[cpu]); ++ saved_cpu_idle_disable_state[cpu] = NULL; ++ saved_cpu_idle_disable_state_alloc_ctr--; ++ if (saved_cpu_idle_disable_state_alloc_ctr == 0) { ++ free(saved_cpu_idle_disable_state); ++ saved_cpu_idle_disable_state = NULL; ++ } ++ ++ return nr_states; ++} ++ ++/* ++ * free_cpu_idle_disable_states - free saved idle state disable for all cpus ++ * ++ * Frees the memory used for storing cpu idle state disable for all cpus ++ * and states. ++ * ++ * Normally, the memory is freed automatically in ++ * restore_cpu_idle_disable_state; this is mostly for cleaning up after an ++ * error. ++ */ ++void free_cpu_idle_disable_states(void) ++{ ++ int cpu; ++ int nr_cpus; ++ ++ if (!saved_cpu_idle_disable_state) ++ return; ++ ++ nr_cpus = sysconf(_SC_NPROCESSORS_CONF); ++ ++ for (cpu = 0; cpu < nr_cpus; cpu++) { ++ free(saved_cpu_idle_disable_state[cpu]); ++ saved_cpu_idle_disable_state[cpu] = NULL; ++ } ++ ++ free(saved_cpu_idle_disable_state); ++ saved_cpu_idle_disable_state = NULL; ++} ++ ++/* ++ * set_deepest_cpu_idle_state - limit idle state of cpu ++ * ++ * Disables all idle states deeper than the one given in ++ * deepest_state (assuming states with higher number are deeper). ++ * ++ * This is used to reduce the exit from idle latency. Unlike ++ * set_cpu_dma_latency, it can disable idle states per cpu. ++ * ++ * Return: idle state count on success, negative on error ++ */ ++int set_deepest_cpu_idle_state(unsigned int cpu, unsigned int deepest_state) ++{ ++ unsigned int nr_states; ++ unsigned int state; ++ int result; ++ ++ nr_states = cpuidle_state_count(cpu); ++ ++ for (state = deepest_state + 1; state < nr_states; state++) { ++ result = cpuidle_state_disable(cpu, state, 1); ++ if (result < 0) ++ return result; ++ } ++ ++ return nr_states; ++} ++#endif /* HAVE_LIBCPUPOWER_SUPPORT */ ++ + #define _STR(x) #x + #define STR(x) _STR(x) + +diff --git a/tools/tracing/rtla/src/utils.h b/tools/tracing/rtla/src/utils.h +index 99c9cf81bcd02..101d4799a0090 100644 +--- a/tools/tracing/rtla/src/utils.h ++++ b/tools/tracing/rtla/src/utils.h +@@ -66,6 +66,19 @@ int set_comm_sched_attr(const char *comm_prefix, struct sched_attr *attr); + int set_comm_cgroup(const char *comm_prefix, const char *cgroup); + int set_pid_cgroup(pid_t pid, const char *cgroup); + int set_cpu_dma_latency(int32_t latency); ++#ifdef HAVE_LIBCPUPOWER_SUPPORT ++int save_cpu_idle_disable_state(unsigned int cpu); ++int restore_cpu_idle_disable_state(unsigned int cpu); ++void free_cpu_idle_disable_states(void); ++int set_deepest_cpu_idle_state(unsigned int cpu, unsigned int state); ++static inline int have_libcpupower_support(void) { return 1; } ++#else ++static inline int save_cpu_idle_disable_state(unsigned int cpu) { return -1; } ++static inline int restore_cpu_idle_disable_state(unsigned int cpu) { return -1; } ++static inline void free_cpu_idle_disable_states(void) { } ++static inline int set_deepest_cpu_idle_state(unsigned int cpu, unsigned int state) { return -1; } ++static inline int have_libcpupower_support(void) { return 0; } ++#endif /* HAVE_LIBCPUPOWER_SUPPORT */ + int auto_house_keeping(cpu_set_t *monitored_cpus); + + #define ns_to_usf(x) (((double)x/1000)) +-- +2.43.0 + diff --git a/queue-6.6/s390-cpum_sf-handle-cpu-hotplug-remove-during-sampli.patch b/queue-6.6/s390-cpum_sf-handle-cpu-hotplug-remove-during-sampli.patch new file mode 100644 index 00000000000..e22ba575ecb --- /dev/null +++ b/queue-6.6/s390-cpum_sf-handle-cpu-hotplug-remove-during-sampli.patch @@ -0,0 +1,80 @@ +From 9c5df2a1aa7b799e48734d4f72d237323e365706 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 25 Oct 2024 12:27:53 +0200 +Subject: s390/cpum_sf: Handle CPU hotplug remove during sampling + +From: Thomas Richter + +[ Upstream commit a0bd7dacbd51c632b8e2c0500b479af564afadf3 ] + +CPU hotplug remove handling triggers the following function +call sequence: + + CPUHP_AP_PERF_S390_SF_ONLINE --> s390_pmu_sf_offline_cpu() + ... + CPUHP_AP_PERF_ONLINE --> perf_event_exit_cpu() + +The s390 CPUMF sampling CPU hotplug handler invokes: + + s390_pmu_sf_offline_cpu() + +--> cpusf_pmu_setup() + +--> setup_pmc_cpu() + +--> deallocate_buffers() + +This function de-allocates all sampling data buffers (SDBs) allocated +for that CPU at event initialization. It also clears the +PMU_F_RESERVED bit. The CPU is gone and can not be sampled. + +With the event still being active on the removed CPU, the CPU event +hotplug support in kernel performance subsystem triggers the +following function calls on the removed CPU: + + perf_event_exit_cpu() + +--> perf_event_exit_cpu_context() + +--> __perf_event_exit_context() + +--> __perf_remove_from_context() + +--> event_sched_out() + +--> cpumsf_pmu_del() + +--> cpumsf_pmu_stop() + +--> hw_perf_event_update() + +to stop and remove the event. During removal of the event, the +sampling device driver tries to read out the remaining samples from +the sample data buffers (SDBs). But they have already been freed +(and may have been re-assigned). This may lead to a use after free +situation in which case the samples are most likely invalid. In the +best case the memory has not been reassigned and still contains +valid data. + +Remedy this situation and check if the CPU is still in reserved +state (bit PMU_F_RESERVED set). In this case the SDBs have not been +released an contain valid data. This is always the case when +the event is removed (and no CPU hotplug off occured). +If the PMU_F_RESERVED bit is not set, the SDB buffers are gone. + +Signed-off-by: Thomas Richter +Reviewed-by: Hendrik Brueckner +Signed-off-by: Heiko Carstens +Signed-off-by: Sasha Levin +--- + arch/s390/kernel/perf_cpum_sf.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_sf.c +index a3169193775f7..e52c89739bc9a 100644 +--- a/arch/s390/kernel/perf_cpum_sf.c ++++ b/arch/s390/kernel/perf_cpum_sf.c +@@ -1922,7 +1922,9 @@ static void cpumsf_pmu_stop(struct perf_event *event, int flags) + event->hw.state |= PERF_HES_STOPPED; + + if ((flags & PERF_EF_UPDATE) && !(event->hw.state & PERF_HES_UPTODATE)) { +- hw_perf_event_update(event, 1); ++ /* CPU hotplug off removes SDBs. No samples to extract. */ ++ if (cpuhw->flags & PMU_F_RESERVED) ++ hw_perf_event_update(event, 1); + event->hw.state |= PERF_HES_UPTODATE; + } + perf_pmu_enable(event->pmu); +-- +2.43.0 + diff --git a/queue-6.6/samples-bpf-fix-a-resource-leak.patch b/queue-6.6/samples-bpf-fix-a-resource-leak.patch new file mode 100644 index 00000000000..583e2803108 --- /dev/null +++ b/queue-6.6/samples-bpf-fix-a-resource-leak.patch @@ -0,0 +1,39 @@ +From 72f2cb65dd8ad379e955b297bbb00972b72d6893 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Oct 2024 18:41:26 -0700 +Subject: samples/bpf: Fix a resource leak + +From: Zhu Jun + +[ Upstream commit f3ef53174b23246fe9bc2bbc2542f3a3856fa1e2 ] + +The opened file should be closed in show_sockopts(), otherwise resource +leak will occur that this problem was discovered by reading code + +Signed-off-by: Zhu Jun +Signed-off-by: Andrii Nakryiko +Link: https://lore.kernel.org/bpf/20241010014126.2573-1-zhujun2@cmss.chinamobile.com +Signed-off-by: Sasha Levin +--- + samples/bpf/test_cgrp2_sock.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/samples/bpf/test_cgrp2_sock.c b/samples/bpf/test_cgrp2_sock.c +index a0811df888f45..8ca2a445ffa15 100644 +--- a/samples/bpf/test_cgrp2_sock.c ++++ b/samples/bpf/test_cgrp2_sock.c +@@ -178,8 +178,10 @@ static int show_sockopts(int family) + return 1; + } + +- if (get_bind_to_device(sd, name, sizeof(name)) < 0) ++ if (get_bind_to_device(sd, name, sizeof(name)) < 0) { ++ close(sd); + return 1; ++ } + + mark = get_somark(sd); + prio = get_priority(sd); +-- +2.43.0 + diff --git a/queue-6.6/scsi-hisi_sas-add-cond_resched-for-no-forced-preempt.patch b/queue-6.6/scsi-hisi_sas-add-cond_resched-for-no-forced-preempt.patch new file mode 100644 index 00000000000..45aba79255f --- /dev/null +++ b/queue-6.6/scsi-hisi_sas-add-cond_resched-for-no-forced-preempt.patch @@ -0,0 +1,87 @@ +From 1c45806266e20a5b5805d82bae66c09f55802855 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 8 Oct 2024 10:18:16 +0800 +Subject: scsi: hisi_sas: Add cond_resched() for no forced preemption model + +From: Yihang Li + +[ Upstream commit 2233c4a0b948211743659b24c13d6bd059fa75fc ] + +For no forced preemption model kernel, in the scenario where the +expander is connected to 12 high performance SAS SSDs, the following +call trace may occur: + +[ 214.409199][ C240] watchdog: BUG: soft lockup - CPU#240 stuck for 22s! [irq/149-hisi_sa:3211] +[ 214.568533][ C240] pstate: 60400009 (nZCv daif +PAN -UAO -TCO BTYPE=--) +[ 214.575224][ C240] pc : fput_many+0x8c/0xdc +[ 214.579480][ C240] lr : fput+0x1c/0xf0 +[ 214.583302][ C240] sp : ffff80002de2b900 +[ 214.587298][ C240] x29: ffff80002de2b900 x28: ffff1082aa412000 +[ 214.593291][ C240] x27: ffff3062a0348c08 x26: ffff80003a9f6000 +[ 214.599284][ C240] x25: ffff1062bbac5c40 x24: 0000000000001000 +[ 214.605277][ C240] x23: 000000000000000a x22: 0000000000000001 +[ 214.611270][ C240] x21: 0000000000001000 x20: 0000000000000000 +[ 214.617262][ C240] x19: ffff3062a41ae580 x18: 0000000000010000 +[ 214.623255][ C240] x17: 0000000000000001 x16: ffffdb3a6efe5fc0 +[ 214.629248][ C240] x15: ffffffffffffffff x14: 0000000003ffffff +[ 214.635241][ C240] x13: 000000000000ffff x12: 000000000000029c +[ 214.641234][ C240] x11: 0000000000000006 x10: ffff80003a9f7fd0 +[ 214.647226][ C240] x9 : ffffdb3a6f0482fc x8 : 0000000000000001 +[ 214.653219][ C240] x7 : 0000000000000002 x6 : 0000000000000080 +[ 214.659212][ C240] x5 : ffff55480ee9b000 x4 : fffffde7f94c6554 +[ 214.665205][ C240] x3 : 0000000000000002 x2 : 0000000000000020 +[ 214.671198][ C240] x1 : 0000000000000021 x0 : ffff3062a41ae5b8 +[ 214.677191][ C240] Call trace: +[ 214.680320][ C240] fput_many+0x8c/0xdc +[ 214.684230][ C240] fput+0x1c/0xf0 +[ 214.687707][ C240] aio_complete_rw+0xd8/0x1fc +[ 214.692225][ C240] blkdev_bio_end_io+0x98/0x140 +[ 214.696917][ C240] bio_endio+0x160/0x1bc +[ 214.701001][ C240] blk_update_request+0x1c8/0x3bc +[ 214.705867][ C240] scsi_end_request+0x3c/0x1f0 +[ 214.710471][ C240] scsi_io_completion+0x7c/0x1a0 +[ 214.715249][ C240] scsi_finish_command+0x104/0x140 +[ 214.720200][ C240] scsi_softirq_done+0x90/0x180 +[ 214.724892][ C240] blk_mq_complete_request+0x5c/0x70 +[ 214.730016][ C240] scsi_mq_done+0x48/0xac +[ 214.734194][ C240] sas_scsi_task_done+0xbc/0x16c [libsas] +[ 214.739758][ C240] slot_complete_v3_hw+0x260/0x760 [hisi_sas_v3_hw] +[ 214.746185][ C240] cq_thread_v3_hw+0xbc/0x190 [hisi_sas_v3_hw] +[ 214.752179][ C240] irq_thread_fn+0x34/0xa4 +[ 214.756435][ C240] irq_thread+0xc4/0x130 +[ 214.760520][ C240] kthread+0x108/0x13c +[ 214.764430][ C240] ret_from_fork+0x10/0x18 + +This is because in the hisi_sas driver, both the hardware interrupt +handler and the interrupt thread are executed on the same CPU. In the +performance test scenario, function irq_wait_for_interrupt() will always +return 0 if lots of interrupts occurs and the CPU will be continuously +consumed. As a result, the CPU cannot run the watchdog thread. When the +watchdog time exceeds the specified time, call trace occurs. + +To fix it, add cond_resched() to execute the watchdog thread. + +Signed-off-by: Yihang Li +Link: https://lore.kernel.org/r/20241008021822.2617339-8-liyihang9@huawei.com +Reviewed-by: Xiang Chen +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +index 6b97c066e6631..4054659d48f74 100644 +--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +@@ -2494,6 +2494,7 @@ static int complete_v3_hw(struct hisi_sas_cq *cq) + /* update rd_point */ + cq->rd_point = rd_point; + hisi_sas_write32(hisi_hba, COMPL_Q_0_RD_PTR + (0x14 * queue), rd_point); ++ cond_resched(); + + return completed; + } +-- +2.43.0 + diff --git a/queue-6.6/scsi-lpfc-call-lpfc_sli4_queue_unset-in-restart-and-.patch b/queue-6.6/scsi-lpfc-call-lpfc_sli4_queue_unset-in-restart-and-.patch new file mode 100644 index 00000000000..cff140d9de1 --- /dev/null +++ b/queue-6.6/scsi-lpfc-call-lpfc_sli4_queue_unset-in-restart-and-.patch @@ -0,0 +1,184 @@ +From ac64488ac6a9cc4d2696f36603dfa3419d7a6703 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 31 Oct 2024 15:32:11 -0700 +Subject: scsi: lpfc: Call lpfc_sli4_queue_unset() in restart and rmmod paths + +From: Justin Tee + +[ Upstream commit d35f7672715d1ff3e3ad9bb4ae6ac6cb484200fe ] + +During initialization, the driver allocates wq->pring in lpfc_wq_create +and lpfc_sli4_queue_unset() is the only place where kfree(wq->pring) is +called. + +There is a possible memory leak in lpfc_sli_brdrestart_s4() (restart) +and lpfc_pci_remove_one_s4() (rmmod) paths because there are no calls to +lpfc_sli4_queue_unset() to kfree() the wq->pring. + +Fix by inserting a call to lpfc_sli4_queue_unset() in +lpfc_sli_brdrestart_s4() and lpfc_sli4_hba_unset() routines. Also, add +a check for the SLI_ACTIVE flag before issuing the Q_DESTROY mailbox +command. If not set, then the mailbox command will obviously fail. In +such cases, skip issuing the mailbox command and only execute the driver +resource clean up portions of the lpfc_*q_destroy routines. + +Signed-off-by: Justin Tee +Link: https://lore.kernel.org/r/20241031223219.152342-4-justintee8345@gmail.com +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/lpfc/lpfc_init.c | 2 ++ + drivers/scsi/lpfc/lpfc_sli.c | 41 ++++++++++++++++++++++++++++++----- + 2 files changed, 38 insertions(+), 5 deletions(-) + +diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c +index 416816d74ea1c..424b39a8155cb 100644 +--- a/drivers/scsi/lpfc/lpfc_init.c ++++ b/drivers/scsi/lpfc/lpfc_init.c +@@ -13513,6 +13513,8 @@ lpfc_sli4_hba_unset(struct lpfc_hba *phba) + /* Disable FW logging to host memory */ + lpfc_ras_stop_fwlog(phba); + ++ lpfc_sli4_queue_unset(phba); ++ + /* Reset SLI4 HBA FCoE function */ + lpfc_pci_function_reset(phba); + +diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c +index 9b1ffa84a0629..4a9fa00eeb798 100644 +--- a/drivers/scsi/lpfc/lpfc_sli.c ++++ b/drivers/scsi/lpfc/lpfc_sli.c +@@ -5285,6 +5285,8 @@ lpfc_sli_brdrestart_s4(struct lpfc_hba *phba) + "0296 Restart HBA Data: x%x x%x\n", + phba->pport->port_state, psli->sli_flag); + ++ lpfc_sli4_queue_unset(phba); ++ + rc = lpfc_sli4_brdreset(phba); + if (rc) { + phba->link_state = LPFC_HBA_ERROR; +@@ -17630,6 +17632,9 @@ lpfc_eq_destroy(struct lpfc_hba *phba, struct lpfc_queue *eq) + if (!eq) + return -ENODEV; + ++ if (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE)) ++ goto list_remove; ++ + mbox = mempool_alloc(eq->phba->mbox_mem_pool, GFP_KERNEL); + if (!mbox) + return -ENOMEM; +@@ -17656,10 +17661,12 @@ lpfc_eq_destroy(struct lpfc_hba *phba, struct lpfc_queue *eq) + shdr_status, shdr_add_status, rc); + status = -ENXIO; + } ++ mempool_free(mbox, eq->phba->mbox_mem_pool); + ++list_remove: + /* Remove eq from any list */ + list_del_init(&eq->list); +- mempool_free(mbox, eq->phba->mbox_mem_pool); ++ + return status; + } + +@@ -17687,6 +17694,10 @@ lpfc_cq_destroy(struct lpfc_hba *phba, struct lpfc_queue *cq) + /* sanity check on queue memory */ + if (!cq) + return -ENODEV; ++ ++ if (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE)) ++ goto list_remove; ++ + mbox = mempool_alloc(cq->phba->mbox_mem_pool, GFP_KERNEL); + if (!mbox) + return -ENOMEM; +@@ -17712,9 +17723,11 @@ lpfc_cq_destroy(struct lpfc_hba *phba, struct lpfc_queue *cq) + shdr_status, shdr_add_status, rc); + status = -ENXIO; + } ++ mempool_free(mbox, cq->phba->mbox_mem_pool); ++ ++list_remove: + /* Remove cq from any list */ + list_del_init(&cq->list); +- mempool_free(mbox, cq->phba->mbox_mem_pool); + return status; + } + +@@ -17742,6 +17755,10 @@ lpfc_mq_destroy(struct lpfc_hba *phba, struct lpfc_queue *mq) + /* sanity check on queue memory */ + if (!mq) + return -ENODEV; ++ ++ if (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE)) ++ goto list_remove; ++ + mbox = mempool_alloc(mq->phba->mbox_mem_pool, GFP_KERNEL); + if (!mbox) + return -ENOMEM; +@@ -17767,9 +17784,11 @@ lpfc_mq_destroy(struct lpfc_hba *phba, struct lpfc_queue *mq) + shdr_status, shdr_add_status, rc); + status = -ENXIO; + } ++ mempool_free(mbox, mq->phba->mbox_mem_pool); ++ ++list_remove: + /* Remove mq from any list */ + list_del_init(&mq->list); +- mempool_free(mbox, mq->phba->mbox_mem_pool); + return status; + } + +@@ -17797,6 +17816,10 @@ lpfc_wq_destroy(struct lpfc_hba *phba, struct lpfc_queue *wq) + /* sanity check on queue memory */ + if (!wq) + return -ENODEV; ++ ++ if (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE)) ++ goto list_remove; ++ + mbox = mempool_alloc(wq->phba->mbox_mem_pool, GFP_KERNEL); + if (!mbox) + return -ENOMEM; +@@ -17821,11 +17844,13 @@ lpfc_wq_destroy(struct lpfc_hba *phba, struct lpfc_queue *wq) + shdr_status, shdr_add_status, rc); + status = -ENXIO; + } ++ mempool_free(mbox, wq->phba->mbox_mem_pool); ++ ++list_remove: + /* Remove wq from any list */ + list_del_init(&wq->list); + kfree(wq->pring); + wq->pring = NULL; +- mempool_free(mbox, wq->phba->mbox_mem_pool); + return status; + } + +@@ -17855,6 +17880,10 @@ lpfc_rq_destroy(struct lpfc_hba *phba, struct lpfc_queue *hrq, + /* sanity check on queue memory */ + if (!hrq || !drq) + return -ENODEV; ++ ++ if (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE)) ++ goto list_remove; ++ + mbox = mempool_alloc(hrq->phba->mbox_mem_pool, GFP_KERNEL); + if (!mbox) + return -ENOMEM; +@@ -17895,9 +17924,11 @@ lpfc_rq_destroy(struct lpfc_hba *phba, struct lpfc_queue *hrq, + shdr_status, shdr_add_status, rc); + status = -ENXIO; + } ++ mempool_free(mbox, hrq->phba->mbox_mem_pool); ++ ++list_remove: + list_del_init(&hrq->list); + list_del_init(&drq->list); +- mempool_free(mbox, hrq->phba->mbox_mem_pool); + return status; + } + +-- +2.43.0 + diff --git a/queue-6.6/scsi-st-add-mtiocget-and-mtload-to-ioctls-allowed-af.patch b/queue-6.6/scsi-st-add-mtiocget-and-mtload-to-ioctls-allowed-af.patch new file mode 100644 index 00000000000..4123f3f969f --- /dev/null +++ b/queue-6.6/scsi-st-add-mtiocget-and-mtload-to-ioctls-allowed-af.patch @@ -0,0 +1,90 @@ +From fcb00d5267bf5fd482cc14575de097fa65b3bf90 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 6 Nov 2024 11:57:22 +0200 +Subject: scsi: st: Add MTIOCGET and MTLOAD to ioctls allowed after device + reset +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Kai Mäkisara + +[ Upstream commit 0b120edb37dc9dd8ca82893d386922eb6b16f860 ] + +Most drives rewind the tape when the device is reset. Reading and writing +are not allowed until something is done to make the tape position match the +user's expectation (e.g., rewind the tape). Add MTIOCGET and MTLOAD to +operations allowed after reset. MTIOCGET is modified to not touch the tape +if pos_unknown is non-zero. The tape location is known after MTLOAD. + +Signed-off-by: Kai Mäkisara +Link: https://bugzilla.kernel.org/show_bug.cgi?id=219419#c14 +Link: https://lore.kernel.org/r/20241106095723.63254-3-Kai.Makisara@kolumbus.fi +Reviewed-by: John Meneghini +Tested-by: John Meneghini +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/st.c | 29 +++++++++++++++++++++-------- + 1 file changed, 21 insertions(+), 8 deletions(-) + +diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c +index 1537f4a9347f9..4e872f2559d13 100644 +--- a/drivers/scsi/st.c ++++ b/drivers/scsi/st.c +@@ -3507,6 +3507,7 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) + int i, cmd_nr, cmd_type, bt; + int retval = 0; + unsigned int blk; ++ bool cmd_mtiocget; + struct scsi_tape *STp = file->private_data; + struct st_modedef *STm; + struct st_partstat *STps; +@@ -3620,6 +3621,7 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) + */ + if (mtc.mt_op != MTREW && + mtc.mt_op != MTOFFL && ++ mtc.mt_op != MTLOAD && + mtc.mt_op != MTRETEN && + mtc.mt_op != MTERASE && + mtc.mt_op != MTSEEK && +@@ -3733,17 +3735,28 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) + goto out; + } + ++ cmd_mtiocget = cmd_type == _IOC_TYPE(MTIOCGET) && cmd_nr == _IOC_NR(MTIOCGET); ++ + if ((i = flush_buffer(STp, 0)) < 0) { +- retval = i; +- goto out; +- } +- if (STp->can_partitions && +- (i = switch_partition(STp)) < 0) { +- retval = i; +- goto out; ++ if (cmd_mtiocget && STp->pos_unknown) { ++ /* flush fails -> modify status accordingly */ ++ reset_state(STp); ++ STp->pos_unknown = 1; ++ } else { /* return error */ ++ retval = i; ++ goto out; ++ } ++ } else { /* flush_buffer succeeds */ ++ if (STp->can_partitions) { ++ i = switch_partition(STp); ++ if (i < 0) { ++ retval = i; ++ goto out; ++ } ++ } + } + +- if (cmd_type == _IOC_TYPE(MTIOCGET) && cmd_nr == _IOC_NR(MTIOCGET)) { ++ if (cmd_mtiocget) { + struct mtget mt_status; + + if (_IOC_SIZE(cmd_in) != sizeof(struct mtget)) { +-- +2.43.0 + diff --git a/queue-6.6/scsi-st-don-t-modify-unknown-block-number-in-mtiocge.patch b/queue-6.6/scsi-st-don-t-modify-unknown-block-number-in-mtiocge.patch new file mode 100644 index 00000000000..fb92171dc25 --- /dev/null +++ b/queue-6.6/scsi-st-don-t-modify-unknown-block-number-in-mtiocge.patch @@ -0,0 +1,42 @@ +From ab9245911e68e0517fb6018143d0f47b20c35fe3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 6 Nov 2024 11:57:21 +0200 +Subject: scsi: st: Don't modify unknown block number in MTIOCGET +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Kai Mäkisara + +[ Upstream commit 5bb2d6179d1a8039236237e1e94cfbda3be1ed9e ] + +Struct mtget field mt_blkno -1 means it is unknown. Don't add anything to +it. + +Signed-off-by: Kai Mäkisara +Link: https://bugzilla.kernel.org/show_bug.cgi?id=219419#c14 +Link: https://lore.kernel.org/r/20241106095723.63254-2-Kai.Makisara@kolumbus.fi +Reviewed-by: John Meneghini +Tested-by: John Meneghini +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/st.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c +index 212a402e75358..1537f4a9347f9 100644 +--- a/drivers/scsi/st.c ++++ b/drivers/scsi/st.c +@@ -3757,7 +3757,7 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) + ((STp->density << MT_ST_DENSITY_SHIFT) & MT_ST_DENSITY_MASK); + mt_status.mt_blkno = STps->drv_block; + mt_status.mt_fileno = STps->drv_file; +- if (STp->block_size != 0) { ++ if (STp->block_size != 0 && mt_status.mt_blkno >= 0) { + if (STps->rw == ST_WRITING) + mt_status.mt_blkno += + (STp->buffer)->buffer_bytes / STp->block_size; +-- +2.43.0 + diff --git a/queue-6.6/scsi-ufs-core-make-dma-mask-configuration-more-flexi.patch b/queue-6.6/scsi-ufs-core-make-dma-mask-configuration-more-flexi.patch new file mode 100644 index 00000000000..a45be51b52d --- /dev/null +++ b/queue-6.6/scsi-ufs-core-make-dma-mask-configuration-more-flexi.patch @@ -0,0 +1,119 @@ +From 4a5ac044c12ece8ef9f7f657ef5ffad3a201d196 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 18 Oct 2024 12:47:39 -0700 +Subject: scsi: ufs: core: Make DMA mask configuration more flexible + +From: Bart Van Assche + +[ Upstream commit 78bc671bd1501e2f6c571e063301a4fdc5db53b2 ] + +Replace UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS with +ufs_hba_variant_ops::set_dma_mask. Update the Renesas driver +accordingly. This patch enables supporting other configurations than +32-bit or 64-bit DMA addresses, e.g. 36-bit DMA addresses. + +Signed-off-by: Bart Van Assche +Link: https://lore.kernel.org/r/20241018194753.775074-1-bvanassche@acm.org +Reviewed-by: Avri Altman +Reviewed-by: Peter Wang +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/ufs/core/ufshcd.c | 4 ++-- + drivers/ufs/host/ufs-renesas.c | 9 ++++++++- + include/ufs/ufshcd.h | 9 +++------ + 3 files changed, 13 insertions(+), 9 deletions(-) + +diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c +index 10a34911c9a17..7d762c4edcc5d 100644 +--- a/drivers/ufs/core/ufshcd.c ++++ b/drivers/ufs/core/ufshcd.c +@@ -2265,8 +2265,6 @@ static inline int ufshcd_hba_capabilities(struct ufs_hba *hba) + int err; + + hba->capabilities = ufshcd_readl(hba, REG_CONTROLLER_CAPABILITIES); +- if (hba->quirks & UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS) +- hba->capabilities &= ~MASK_64_ADDRESSING_SUPPORT; + + /* nutrs and nutmrs are 0 based values */ + hba->nutrs = (hba->capabilities & MASK_TRANSFER_REQUESTS_SLOTS) + 1; +@@ -10240,6 +10238,8 @@ EXPORT_SYMBOL_GPL(ufshcd_dealloc_host); + */ + static int ufshcd_set_dma_mask(struct ufs_hba *hba) + { ++ if (hba->vops && hba->vops->set_dma_mask) ++ return hba->vops->set_dma_mask(hba); + if (hba->capabilities & MASK_64_ADDRESSING_SUPPORT) { + if (!dma_set_mask_and_coherent(hba->dev, DMA_BIT_MASK(64))) + return 0; +diff --git a/drivers/ufs/host/ufs-renesas.c b/drivers/ufs/host/ufs-renesas.c +index cc94970b86c93..ea3da773b1c14 100644 +--- a/drivers/ufs/host/ufs-renesas.c ++++ b/drivers/ufs/host/ufs-renesas.c +@@ -7,6 +7,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -364,14 +365,20 @@ static int ufs_renesas_init(struct ufs_hba *hba) + return -ENOMEM; + ufshcd_set_variant(hba, priv); + +- hba->quirks |= UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS | UFSHCD_QUIRK_HIBERN_FASTAUTO; ++ hba->quirks |= UFSHCD_QUIRK_HIBERN_FASTAUTO; + + return 0; + } + ++static int ufs_renesas_set_dma_mask(struct ufs_hba *hba) ++{ ++ return dma_set_mask_and_coherent(hba->dev, DMA_BIT_MASK(32)); ++} ++ + static const struct ufs_hba_variant_ops ufs_renesas_vops = { + .name = "renesas", + .init = ufs_renesas_init, ++ .set_dma_mask = ufs_renesas_set_dma_mask, + .setup_clocks = ufs_renesas_setup_clocks, + .hce_enable_notify = ufs_renesas_hce_enable_notify, + .dbg_register_dump = ufs_renesas_dbg_register_dump, +diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h +index b751969a3ebd5..f66a275bf8ccd 100644 +--- a/include/ufs/ufshcd.h ++++ b/include/ufs/ufshcd.h +@@ -295,6 +295,8 @@ struct ufs_pwr_mode_info { + * @name: variant name + * @init: called when the driver is initialized + * @exit: called to cleanup everything done in init ++ * @set_dma_mask: For setting another DMA mask than indicated by the 64AS ++ * capability bit. + * @get_ufs_hci_version: called to get UFS HCI version + * @clk_scale_notify: notifies that clks are scaled up/down + * @setup_clocks: called before touching any of the controller registers +@@ -334,6 +336,7 @@ struct ufs_hba_variant_ops { + int (*init)(struct ufs_hba *); + void (*exit)(struct ufs_hba *); + u32 (*get_ufs_hci_version)(struct ufs_hba *); ++ int (*set_dma_mask)(struct ufs_hba *); + int (*clk_scale_notify)(struct ufs_hba *, bool, + enum ufs_notify_change_status); + int (*setup_clocks)(struct ufs_hba *, bool, +@@ -615,12 +618,6 @@ enum ufshcd_quirks { + */ + UFSHCD_QUIRK_SKIP_PH_CONFIGURATION = 1 << 16, + +- /* +- * This quirk needs to be enabled if the host controller has +- * 64-bit addressing supported capability but it doesn't work. +- */ +- UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS = 1 << 17, +- + /* + * This quirk needs to be enabled if the host controller has + * auto-hibernate capability but it's FASTAUTO only. +-- +2.43.0 + diff --git a/queue-6.6/selftests-resctrl-protect-against-array-overflow-whe.patch b/queue-6.6/selftests-resctrl-protect-against-array-overflow-whe.patch new file mode 100644 index 00000000000..b1822522a16 --- /dev/null +++ b/queue-6.6/selftests-resctrl-protect-against-array-overflow-whe.patch @@ -0,0 +1,78 @@ +From b77915965f1375558b99cedd2deaebc1ad1edff0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 24 Oct 2024 14:18:42 -0700 +Subject: selftests/resctrl: Protect against array overflow when reading + strings +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Reinette Chatre + +[ Upstream commit 46058430fc5d39c114f7e1b9c6ff14c9f41bd531 ] + +resctrl selftests discover system properties via a variety of sysfs files. +The MBM and MBA tests need to discover the event and umask with which to +configure the performance event used to measure read memory bandwidth. +This is done by parsing the contents of +/sys/bus/event_source/devices/uncore_imc_/events/cas_count_read +Similarly, the resctrl selftests discover the cache size via +/sys/bus/cpu/devices/cpu/cache/index/size. + +Take care to do bounds checking when using fscanf() to read the +contents of files into a string buffer because by default fscanf() assumes +arbitrarily long strings. If the file contains more bytes than the array +can accommodate then an overflow will occur. + +Provide a maximum field width to the conversion specifier to protect +against array overflow. The maximum is one less than the array size because +string input stores a terminating null byte that is not covered by the +maximum field width. + +Signed-off-by: Reinette Chatre +Reviewed-by: Ilpo Järvinen +Signed-off-by: Shuah Khan +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/resctrl/resctrl_val.c | 4 ++-- + tools/testing/selftests/resctrl/resctrlfs.c | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/tools/testing/selftests/resctrl/resctrl_val.c b/tools/testing/selftests/resctrl/resctrl_val.c +index d77fdf356e98e..710058eb25407 100644 +--- a/tools/testing/selftests/resctrl/resctrl_val.c ++++ b/tools/testing/selftests/resctrl/resctrl_val.c +@@ -178,7 +178,7 @@ static int read_from_imc_dir(char *imc_dir, int count) + + return -1; + } +- if (fscanf(fp, "%s", cas_count_cfg) <= 0) { ++ if (fscanf(fp, "%1023s", cas_count_cfg) <= 0) { + ksft_perror("Could not get iMC cas count read"); + fclose(fp); + +@@ -196,7 +196,7 @@ static int read_from_imc_dir(char *imc_dir, int count) + + return -1; + } +- if (fscanf(fp, "%s", cas_count_cfg) <= 0) { ++ if (fscanf(fp, "%1023s", cas_count_cfg) <= 0) { + ksft_perror("Could not get iMC cas count write"); + fclose(fp); + +diff --git a/tools/testing/selftests/resctrl/resctrlfs.c b/tools/testing/selftests/resctrl/resctrlfs.c +index 71ad2b335b83f..fe3241799841b 100644 +--- a/tools/testing/selftests/resctrl/resctrlfs.c ++++ b/tools/testing/selftests/resctrl/resctrlfs.c +@@ -160,7 +160,7 @@ int get_cache_size(int cpu_no, char *cache_type, unsigned long *cache_size) + + return -1; + } +- if (fscanf(fp, "%s", cache_str) <= 0) { ++ if (fscanf(fp, "%63s", cache_str) <= 0) { + ksft_perror("Could not get cache_size"); + fclose(fp); + +-- +2.43.0 + diff --git a/queue-6.6/serial-8250_dw-add-sophgo-sg2044-quirk.patch b/queue-6.6/serial-8250_dw-add-sophgo-sg2044-quirk.patch new file mode 100644 index 00000000000..9a2a6b3cdaa --- /dev/null +++ b/queue-6.6/serial-8250_dw-add-sophgo-sg2044-quirk.patch @@ -0,0 +1,53 @@ +From 734b3a1a65ef5cd632e4d854e4e27b43924ed452 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 24 Oct 2024 14:21:03 +0800 +Subject: serial: 8250_dw: Add Sophgo SG2044 quirk +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Inochi Amaoto + +[ Upstream commit cad4dda82c7eedcfc22597267e710ccbcf39d572 ] + +SG2044 relys on an internal divisor when calculating bitrate, which +means a wrong clock for the most common bitrates. So add a quirk for +this uart device to skip the set rate call and only relys on the +internal UART divisor. + +Reviewed-by: Andy Shevchenko +Reviewed-by: Ilpo Järvinen +Signed-off-by: Inochi Amaoto +Link: https://lore.kernel.org/r/20241024062105.782330-4-inochiama@gmail.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/8250/8250_dw.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c +index 8aed33be2ebf4..eaf4a907380aa 100644 +--- a/drivers/tty/serial/8250/8250_dw.c ++++ b/drivers/tty/serial/8250/8250_dw.c +@@ -785,7 +785,7 @@ static const struct dw8250_platform_data dw8250_renesas_rzn1_data = { + .quirks = DW_UART_QUIRK_CPR_VALUE | DW_UART_QUIRK_IS_DMA_FC, + }; + +-static const struct dw8250_platform_data dw8250_starfive_jh7100_data = { ++static const struct dw8250_platform_data dw8250_skip_set_rate_data = { + .usr_reg = DW_UART_USR, + .quirks = DW_UART_QUIRK_SKIP_SET_RATE, + }; +@@ -795,7 +795,8 @@ static const struct of_device_id dw8250_of_match[] = { + { .compatible = "cavium,octeon-3860-uart", .data = &dw8250_octeon_3860_data }, + { .compatible = "marvell,armada-38x-uart", .data = &dw8250_armada_38x_data }, + { .compatible = "renesas,rzn1-uart", .data = &dw8250_renesas_rzn1_data }, +- { .compatible = "starfive,jh7100-uart", .data = &dw8250_starfive_jh7100_data }, ++ { .compatible = "sophgo,sg2044-uart", .data = &dw8250_skip_set_rate_data }, ++ { .compatible = "starfive,jh7100-uart", .data = &dw8250_skip_set_rate_data }, + { /* Sentinel */ } + }; + MODULE_DEVICE_TABLE(of, dw8250_of_match); +-- +2.43.0 + diff --git a/queue-6.6/series b/queue-6.6/series index e496765f204..b0b6a89e176 100644 --- a/queue-6.6/series +++ b/queue-6.6/series @@ -190,3 +190,138 @@ ocfs2-update-seq_file-index-in-ocfs2_dlm_seq_next.patch lib-stackinit-hide-never-taken-branch-from-compiler.patch kasan-make-report_lock-a-raw-spinlock.patch x86-mm-add-_page_noptishadow-bit-to-avoid-updating-userspace-page-tables.patch +epoll-annotate-racy-check.patch +kselftest-arm64-log-fp-stress-child-startup-errors-t.patch +s390-cpum_sf-handle-cpu-hotplug-remove-during-sampli.patch +btrfs-don-t-take-dev_replace-rwsem-on-task-already-h.patch +btrfs-avoid-unnecessary-device-path-update-for-the-s.patch +btrfs-do-not-clear-read-only-when-adding-sprout-devi.patch +kselftest-arm64-don-t-leak-pipe-fds-in-pac.exec_sign.patch +kcsan-turn-report_filterlist_lock-into-a-raw_spinloc.patch +hwmon-nct6775-add-665-ace-600m-cl-to-asus-wmi-monito.patch +acpi-x86-make-uart-skip-quirks-work-on-pci-uarts-wit.patch +perf-x86-amd-warn-only-on-new-bits-set.patch +timekeeping-always-check-for-negative-motion.patch +spi-spi-fsl-lpspi-adjust-type-of-scldiv.patch +hid-add-per-device-quirk-to-force-bind-to-hid-generi.patch +media-uvcvideo-realsense-d421-depth-module-metadata.patch +media-uvcvideo-add-a-quirk-for-the-kaiweets-kti-w02-.patch +media-cx231xx-add-support-for-dexatek-usb-video-grab.patch +mmc-core-add-sd-card-quirk-for-broken-poweroff-notif.patch +mmc-sdhci-esdhc-imx-enable-quirks-sdhci_quirk_no_led.patch +soc-imx8m-probe-the-soc-driver-as-platform-driver.patch +hid-bpf-fix-nkro-on-mistel-md770.patch +regmap-maple-provide-lockdep-sub-class-for-maple-tre.patch +selftests-resctrl-protect-against-array-overflow-whe.patch +hid-magicmouse-apple-magic-trackpad-2-usb-c-driver-s.patch +drm-vc4-hdmi-avoid-log-spam-for-audio-start-failure.patch +drm-vc4-hvs-set-axi-panic-modes-for-the-hvs.patch +drm-panel-orientation-quirks-add-quirk-for-aya-neo-2.patch +drm-panel-orientation-quirks-add-quirk-for-aya-neo-f.patch +drm-panel-orientation-quirks-add-quirk-for-aya-neo-g.patch +drm-bridge-it6505-enable-module-autoloading.patch +drm-mcde-enable-module-autoloading.patch +wifi-rtw89-check-return-value-of-ieee80211_probereq_.patch +drm-radeon-r600_cs-fix-possible-int-overflow-in-r600.patch +dlm-fix-possible-lkb_resource-null-dereference.patch +drm-display-fix-building-with-gcc-15.patch +alsa-hda-use-own-quirk-lookup-helper.patch +alsa-hda-conexant-use-the-new-codec-ssid-matching.patch +r8169-don-t-apply-udp-padding-quirk-on-rtl8126a.patch +samples-bpf-fix-a-resource-leak.patch +net-fec_mpc52xx_phy-use-pa-to-format-resource_size_t.patch +net-ethernet-fs_enet-use-pa-to-format-resource_size_.patch +net-sched-cbs-fix-integer-overflow-in-cbs_set_port_r.patch +af_packet-avoid-erroring-out-after-sock_init_data-in.patch +bluetooth-l2cap-do-not-leave-dangling-sk-pointer-on-.patch +bluetooth-rfcomm-avoid-leaving-dangling-sk-pointer-i.patch +net-af_can-do-not-leave-a-dangling-sk-pointer-in-can.patch +net-ieee802154-do-not-leave-a-dangling-sk-pointer-in.patch +net-inet-do-not-leave-a-dangling-sk-pointer-in-inet_.patch +net-inet6-do-not-leave-a-dangling-sk-pointer-in-inet.patch +wifi-ath5k-add-pci-id-for-sx76x.patch +wifi-ath5k-add-pci-id-for-arcadyan-devices.patch +fanotify-allow-reporting-errors-on-failure-to-open-f.patch +drm-panel-simple-add-microchip-ac69t88a-lvds-display.patch +net-sfp-change-quirks-for-alcatel-lucent-g-010s-p.patch +net-stmmac-programming-sequence-for-vlan-packets-wit.patch +drm-sched-memset-job-in-drm_sched_job_init.patch +drm-amdgpu-clear-rb_overflow-bit-when-enabling-inter.patch +drm-amdgpu-dereference-the-atcs-acpi-buffer.patch +netlink-specs-add-missing-bitset-attrs-to-ethtool-sp.patch +drm-amdgpu-refine-error-handling-in-amdgpu_ttm_tt_pi.patch +dma-debug-fix-a-possible-deadlock-on-radix_lock.patch +jfs-array-index-out-of-bounds-fix-in-dtreadfirst.patch +jfs-fix-shift-out-of-bounds-in-dbsplit.patch +jfs-fix-array-index-out-of-bounds-in-jfs_readdir.patch +jfs-add-a-check-to-prevent-array-index-out-of-bounds.patch +fsl-fman-validate-cell-index-value-obtained-from-dev.patch +drm-amdgpu-skip-amdgpu_device_cache_pci_state-under-.patch +virtio-net-fix-overflow-inside-virtnet_rq_alloc.patch +alsa-usb-audio-make-mic-volume-workarounds-globally-.patch +drm-amdgpu-set-the-right-amdgpu-sg-segment-limitatio.patch +wifi-ipw2x00-libipw_rx_any-fix-bad-alignment.patch +wifi-brcmfmac-fix-oops-due-to-null-pointer-dereferen.patch +bpf-call-free_htab_elem-after-htab_unlock_bucket.patch +dsa-qca8k-use-nested-lock-to-avoid-splat.patch +bluetooth-btusb-add-rtl8852be-device-0489-e123-to-de.patch +bluetooth-hci_core-fix-not-checking-skb-length-on-hc.patch +bluetooth-add-new-quirks-for-ats2851.patch +bluetooth-support-new-quirks-for-ats2851.patch +bluetooth-set-quirks-for-ats2851.patch +asoc-hdmi-codec-reorder-channel-allocation-list.patch +rocker-fix-link-status-detection-in-rocker_carrier_i.patch +net-neighbor-clear-error-in-case-strict-check-is-not.patch +netpoll-use-rcu_access_pointer-in-__netpoll_setup.patch +pinctrl-freescale-fix-compile_test-error-with-pinctr.patch +tracing-ftrace-disable-preemption-in-syscall-probe.patch +tracing-use-atomic64_inc_return-in-trace_clock_count.patch +tools-rtla-fix-collision-with-glibc-sched_attr-sched.patch +rtla-timerlat-make-timerlat_top_cpu-_count-unsigned-.patch +scsi-hisi_sas-add-cond_resched-for-no-forced-preempt.patch +rtla-utils-add-idle-state-disabling-via-libcpupower.patch +pinmux-use-sequential-access-to-access-desc-pinmux-d.patch +scsi-ufs-core-make-dma-mask-configuration-more-flexi.patch +bpf-put-bpf_link-s-program-when-link-is-safe-to-be-d.patch +scsi-lpfc-call-lpfc_sli4_queue_unset-in-restart-and-.patch +clk-qcom-rcg2-add-clk_rcg2_shared_floor_ops.patch +clk-qcom-rpmh-add-support-for-sar2130p.patch +clk-qcom-tcsrcc-sm8550-add-sar2130p-support.patch +leds-class-protect-brightness_show-with-led_cdev-led.patch +scsi-st-don-t-modify-unknown-block-number-in-mtiocge.patch +scsi-st-add-mtiocget-and-mtload-to-ioctls-allowed-af.patch +pinctrl-qcom-pmic-gpio-add-support-for-pm8937.patch +pinctrl-qcom-spmi-mpp-add-pm8937-compatible.patch +thermal-drivers-qcom-tsens-v1-add-support-for-msm893.patch +nvdimm-rectify-the-illogical-code-within-nd_dax_prob.patch +smb-client-memcpy-with-surrounding-object-base-addre.patch +verification-dot2-improve-dot-parser-robustness.patch +f2fs-fix-f2fs_bug_on-when-uninstalling-filesystem-ca.patch +kmsan-uninit-value-in-inode_go_dump-5.patch +i3c-mipi-i3c-hci-mask-ring-interrupts-before-ring-st.patch +pci-qcom-add-support-for-ipq9574.patch +pci-vmd-add-did-8086-b06f-and-8086-b60b-for-intel-cl.patch +pci-vmd-set-devices-to-d0-before-enabling-pm-l1-subs.patch +pci-detect-and-trust-built-in-thunderbolt-chips.patch +pci-add-reset_subordinate-to-reset-hierarchy-below-b.patch +pci-add-acs-quirk-for-wangxun-ff5xxx-nics.patch +i3c-use-i3cdev-desc-info-instead-of-calling-i3c_devi.patch +f2fs-print-message-if-fscorrupted-was-found-in-f2fs_.patch +f2fs-fix-to-shrink-read-extent-node-in-batches.patch +acpi-x86-add-skip-i2c-clients-quirk-for-acer-iconia-.patch +acpi-x86-clean-up-asus-entries-in-acpi_quirk_skip_dm.patch +loongarch-fix-sleeping-in-atomic-context-for-preempt.patch +fs-ntfs3-fix-case-when-unmarked-clusters-intersect-w.patch +usb-chipidea-udc-handle-usb-error-interrupt-if-ioc-n.patch +iio-light-ltr501-add-lter0303-to-the-supported-devic.patch +asoc-amd-yc-fix-internal-mic-on-redmi-g-2022.patch +drm-amdgpu-vcn-reset-fw_shared-when-vcpu-buffers-cor.patch +mips-loongson64-dts-really-fix-pcie-port-nodes-for-l.patch +asoc-amd-yc-add-quirk-for-microphone-on-lenovo-think.patch +powerpc-prom_init-fixup-missing-powermac-size-cells.patch +misc-eeprom-eeprom_93cx6-add-quirk-for-extra-read-cl.patch +rtc-cmos-avoid-taking-rtc_lock-for-extended-period-o.patch +serial-8250_dw-add-sophgo-sg2044-quirk.patch +smb-client-don-t-try-following-dfs-links-in-cifs_tre.patch +setlocalversion-work-around-git-describe-performance.patch +io_uring-tctx-work-around-xa_store-allocation-error-.patch diff --git a/queue-6.6/setlocalversion-work-around-git-describe-performance.patch b/queue-6.6/setlocalversion-work-around-git-describe-performance.patch new file mode 100644 index 00000000000..ba4caa8aa81 --- /dev/null +++ b/queue-6.6/setlocalversion-work-around-git-describe-performance.patch @@ -0,0 +1,178 @@ +From c9e8ef6713c086cbb54a65b28b8e3ae2d1dc6244 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Nov 2024 12:01:54 +0100 +Subject: setlocalversion: work around "git describe" performance + +From: Rasmus Villemoes + +[ Upstream commit 523f3dbc187a9618d4fd80c2b438e4d490705dcd ] + +Contrary to expectations, passing a single candidate tag to "git +describe" is slower than not passing any --match options. + + $ time git describe --debug + ... + traversed 10619 commits + ... + v6.12-rc5-63-g0fc810ae3ae1 + + real 0m0.169s + + $ time git describe --match=v6.12-rc5 --debug + ... + traversed 1310024 commits + v6.12-rc5-63-g0fc810ae3ae1 + + real 0m1.281s + +In fact, the --debug output shows that git traverses all or most of +history. For some repositories and/or git versions, those 1.3s are +actually 10-15 seconds. + +This has been acknowledged as a performance bug in git [1], and a fix +is on its way [2]. However, no solution is yet in git.git, and even +when one lands, it will take quite a while before it finds its way to +a release and for $random_kernel_developer to pick that up. + +So rewrite the logic to use plumbing commands. For each of the +candidate values of $tag, we ask: (1) is $tag even an annotated +tag? (2) Is it eligible to describe HEAD, i.e. an ancestor of +HEAD? (3) If so, how many commits are in $tag..HEAD? + +I have tested that this produces the same output as the current script +for ~700 random commits between v6.9..v6.10. For those 700 commits, +and in my git repo, the 'make -s kernelrelease' command is on average +~4 times faster with this patch applied (geometric mean of ratios). + +For the commit mentioned in Josh's original report [3], the +time-consuming part of setlocalversion goes from + +$ time git describe --match=v6.12-rc5 c1e939a21eb1 +v6.12-rc5-44-gc1e939a21eb1 + +real 0m1.210s + +to + +$ time git rev-list --count --left-right v6.12-rc5..c1e939a21eb1 +0 44 + +real 0m0.037s + +[1] https://lore.kernel.org/git/20241101113910.GA2301440@coredump.intra.peff.net/ +[2] https://lore.kernel.org/git/20241106192236.GC880133@coredump.intra.peff.net/ +[3] https://lore.kernel.org/lkml/309549cafdcfe50c4fceac3263220cc3d8b109b2.1730337435.git.jpoimboe@kernel.org/ + +Reported-by: Sean Christopherson +Closes: https://lore.kernel.org/lkml/ZPtlxmdIJXOe0sEy@google.com/ +Reported-by: Josh Poimboeuf +Closes: https://lore.kernel.org/lkml/309549cafdcfe50c4fceac3263220cc3d8b109b2.1730337435.git.jpoimboe@kernel.org/ +Tested-by: Josh Poimboeuf +Signed-off-by: Rasmus Villemoes +Signed-off-by: Masahiro Yamada +Signed-off-by: Sasha Levin +--- + scripts/setlocalversion | 54 +++++++++++++++++++++++++++++------------ + 1 file changed, 38 insertions(+), 16 deletions(-) + +diff --git a/scripts/setlocalversion b/scripts/setlocalversion +index 38b96c6797f40..5818465abba98 100755 +--- a/scripts/setlocalversion ++++ b/scripts/setlocalversion +@@ -30,6 +30,27 @@ if test $# -gt 0 -o ! -d "$srctree"; then + usage + fi + ++try_tag() { ++ tag="$1" ++ ++ # Is $tag an annotated tag? ++ [ "$(git cat-file -t "$tag" 2> /dev/null)" = tag ] || return 1 ++ ++ # Is it an ancestor of HEAD, and if so, how many commits are in $tag..HEAD? ++ # shellcheck disable=SC2046 # word splitting is the point here ++ set -- $(git rev-list --count --left-right "$tag"...HEAD 2> /dev/null) ++ ++ # $1 is 0 if and only if $tag is an ancestor of HEAD. Use ++ # string comparison, because $1 is empty if the 'git rev-list' ++ # command somehow failed. ++ [ "$1" = 0 ] || return 1 ++ ++ # $2 is the number of commits in the range $tag..HEAD, possibly 0. ++ count="$2" ++ ++ return 0 ++} ++ + scm_version() + { + local short=false +@@ -61,33 +82,33 @@ scm_version() + # stable kernel: 6.1.7 -> v6.1.7 + version_tag=v$(echo "${KERNELVERSION}" | sed -E 's/^([0-9]+\.[0-9]+)\.0(.*)$/\1\2/') + ++ # try_tag initializes count if the tag is usable. ++ count= ++ + # If a localversion* file exists, and the corresponding + # annotated tag exists and is an ancestor of HEAD, use + # it. This is the case in linux-next. +- tag=${file_localversion#-} +- desc= +- if [ -n "${tag}" ]; then +- desc=$(git describe --match=$tag 2>/dev/null) ++ if [ -n "${file_localversion#-}" ] ; then ++ try_tag "${file_localversion#-}" + fi + + # Otherwise, if a localversion* file exists, and the tag + # obtained by appending it to the tag derived from + # KERNELVERSION exists and is an ancestor of HEAD, use + # it. This is e.g. the case in linux-rt. +- if [ -z "${desc}" ] && [ -n "${file_localversion}" ]; then +- tag="${version_tag}${file_localversion}" +- desc=$(git describe --match=$tag 2>/dev/null) ++ if [ -z "${count}" ] && [ -n "${file_localversion}" ]; then ++ try_tag "${version_tag}${file_localversion}" + fi + + # Otherwise, default to the annotated tag derived from KERNELVERSION. +- if [ -z "${desc}" ]; then +- tag="${version_tag}" +- desc=$(git describe --match=$tag 2>/dev/null) ++ if [ -z "${count}" ]; then ++ try_tag "${version_tag}" + fi + +- # If we are at the tagged commit, we ignore it because the version is +- # well-defined. +- if [ "${tag}" != "${desc}" ]; then ++ # If we are at the tagged commit, we ignore it because the ++ # version is well-defined. If none of the attempted tags exist ++ # or were usable, $count is still empty. ++ if [ -z "${count}" ] || [ "${count}" -gt 0 ]; then + + # If only the short version is requested, don't bother + # running further git commands +@@ -95,14 +116,15 @@ scm_version() + echo "+" + return + fi ++ + # If we are past the tagged commit, we pretty print it. + # (like 6.1.0-14595-g292a089d78d3) +- if [ -n "${desc}" ]; then +- echo "${desc}" | awk -F- '{printf("-%05d", $(NF-1))}' ++ if [ -n "${count}" ]; then ++ printf "%s%05d" "-" "${count}" + fi + + # Add -g and exactly 12 hex chars. +- printf '%s%s' -g "$(echo $head | cut -c1-12)" ++ printf '%s%.12s' -g "$head" + fi + + if ${no_dirty}; then +-- +2.43.0 + diff --git a/queue-6.6/smb-client-don-t-try-following-dfs-links-in-cifs_tre.patch b/queue-6.6/smb-client-don-t-try-following-dfs-links-in-cifs_tre.patch new file mode 100644 index 00000000000..06121781a75 --- /dev/null +++ b/queue-6.6/smb-client-don-t-try-following-dfs-links-in-cifs_tre.patch @@ -0,0 +1,268 @@ +From c706bd5b8ad3ab3d101a1d9a2979f134ebf7e5ae Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Nov 2024 15:55:53 -0300 +Subject: smb: client: don't try following DFS links in cifs_tree_connect() + +From: Paulo Alcantara + +[ Upstream commit 36008fe6e3dc588e5e9ceae6e82c7f69399eb5d8 ] + +We can't properly support chasing DFS links in cifs_tree_connect() +because + + (1) We don't support creating new sessions while we're reconnecting, + which would be required for DFS interlinks. + + (2) ->is_path_accessible() can't be called from cifs_tree_connect() + as it would deadlock with smb2_reconnect(). This is required for + checking if new DFS target is a nested DFS link. + +By unconditionally trying to get an DFS referral from new DFS target +isn't correct because if the new DFS target (interlink) is an DFS +standalone namespace, then we would end up getting -ELOOP and then +potentially leaving tcon disconnected. + +Signed-off-by: Paulo Alcantara (Red Hat) +Signed-off-by: Steve French +Signed-off-by: Sasha Levin +--- + fs/smb/client/dfs.c | 188 ++++---------------------------------------- + 1 file changed, 17 insertions(+), 171 deletions(-) + +diff --git a/fs/smb/client/dfs.c b/fs/smb/client/dfs.c +index 3ec965547e3d4..bd259b04cdede 100644 +--- a/fs/smb/client/dfs.c ++++ b/fs/smb/client/dfs.c +@@ -324,49 +324,6 @@ int dfs_mount_share(struct cifs_mount_ctx *mnt_ctx, bool *isdfs) + return rc; + } + +-/* Update dfs referral path of superblock */ +-static int update_server_fullpath(struct TCP_Server_Info *server, struct cifs_sb_info *cifs_sb, +- const char *target) +-{ +- int rc = 0; +- size_t len = strlen(target); +- char *refpath, *npath; +- +- if (unlikely(len < 2 || *target != '\\')) +- return -EINVAL; +- +- if (target[1] == '\\') { +- len += 1; +- refpath = kmalloc(len, GFP_KERNEL); +- if (!refpath) +- return -ENOMEM; +- +- scnprintf(refpath, len, "%s", target); +- } else { +- len += sizeof("\\"); +- refpath = kmalloc(len, GFP_KERNEL); +- if (!refpath) +- return -ENOMEM; +- +- scnprintf(refpath, len, "\\%s", target); +- } +- +- npath = dfs_cache_canonical_path(refpath, cifs_sb->local_nls, cifs_remap(cifs_sb)); +- kfree(refpath); +- +- if (IS_ERR(npath)) { +- rc = PTR_ERR(npath); +- } else { +- mutex_lock(&server->refpath_lock); +- spin_lock(&server->srv_lock); +- kfree(server->leaf_fullpath); +- server->leaf_fullpath = npath; +- spin_unlock(&server->srv_lock); +- mutex_unlock(&server->refpath_lock); +- } +- return rc; +-} +- + static int target_share_matches_server(struct TCP_Server_Info *server, char *share, + bool *target_match) + { +@@ -391,77 +348,22 @@ static int target_share_matches_server(struct TCP_Server_Info *server, char *sha + return rc; + } + +-static void __tree_connect_ipc(const unsigned int xid, char *tree, +- struct cifs_sb_info *cifs_sb, +- struct cifs_ses *ses) +-{ +- struct TCP_Server_Info *server = ses->server; +- struct cifs_tcon *tcon = ses->tcon_ipc; +- int rc; +- +- spin_lock(&ses->ses_lock); +- spin_lock(&ses->chan_lock); +- if (cifs_chan_needs_reconnect(ses, server) || +- ses->ses_status != SES_GOOD) { +- spin_unlock(&ses->chan_lock); +- spin_unlock(&ses->ses_lock); +- cifs_server_dbg(FYI, "%s: skipping ipc reconnect due to disconnected ses\n", +- __func__); +- return; +- } +- spin_unlock(&ses->chan_lock); +- spin_unlock(&ses->ses_lock); +- +- cifs_server_lock(server); +- scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", server->hostname); +- cifs_server_unlock(server); +- +- rc = server->ops->tree_connect(xid, ses, tree, tcon, +- cifs_sb->local_nls); +- cifs_server_dbg(FYI, "%s: tree_reconnect %s: %d\n", __func__, tree, rc); +- spin_lock(&tcon->tc_lock); +- if (rc) { +- tcon->status = TID_NEED_TCON; +- } else { +- tcon->status = TID_GOOD; +- tcon->need_reconnect = false; +- } +- spin_unlock(&tcon->tc_lock); +-} +- +-static void tree_connect_ipc(const unsigned int xid, char *tree, +- struct cifs_sb_info *cifs_sb, +- struct cifs_tcon *tcon) +-{ +- struct cifs_ses *ses = tcon->ses; +- +- __tree_connect_ipc(xid, tree, cifs_sb, ses); +- __tree_connect_ipc(xid, tree, cifs_sb, CIFS_DFS_ROOT_SES(ses)); +-} +- +-static int __tree_connect_dfs_target(const unsigned int xid, struct cifs_tcon *tcon, +- struct cifs_sb_info *cifs_sb, char *tree, bool islink, +- struct dfs_cache_tgt_list *tl) ++static int tree_connect_dfs_target(const unsigned int xid, ++ struct cifs_tcon *tcon, ++ struct cifs_sb_info *cifs_sb, ++ char *tree, bool islink, ++ struct dfs_cache_tgt_list *tl) + { +- int rc; ++ const struct smb_version_operations *ops = tcon->ses->server->ops; + struct TCP_Server_Info *server = tcon->ses->server; +- const struct smb_version_operations *ops = server->ops; +- struct cifs_ses *root_ses = CIFS_DFS_ROOT_SES(tcon->ses); +- char *share = NULL, *prefix = NULL; + struct dfs_cache_tgt_iterator *tit; ++ char *share = NULL, *prefix = NULL; + bool target_match; +- +- tit = dfs_cache_get_tgt_iterator(tl); +- if (!tit) { +- rc = -ENOENT; +- goto out; +- } ++ int rc = -ENOENT; + + /* Try to tree connect to all dfs targets */ +- for (; tit; tit = dfs_cache_get_next_tgt(tl, tit)) { +- const char *target = dfs_cache_get_tgt_name(tit); +- DFS_CACHE_TGT_LIST(ntl); +- ++ for (tit = dfs_cache_get_tgt_iterator(tl); ++ tit; tit = dfs_cache_get_next_tgt(tl, tit)) { + kfree(share); + kfree(prefix); + share = prefix = NULL; +@@ -482,69 +384,16 @@ static int __tree_connect_dfs_target(const unsigned int xid, struct cifs_tcon *t + } + + dfs_cache_noreq_update_tgthint(server->leaf_fullpath + 1, tit); +- tree_connect_ipc(xid, tree, cifs_sb, tcon); +- + scnprintf(tree, MAX_TREE_SIZE, "\\%s", share); +- if (!islink) { +- rc = ops->tree_connect(xid, tcon->ses, tree, tcon, cifs_sb->local_nls); +- break; +- } +- +- /* +- * If no dfs referrals were returned from link target, then just do a TREE_CONNECT +- * to it. Otherwise, cache the dfs referral and then mark current tcp ses for +- * reconnect so either the demultiplex thread or the echo worker will reconnect to +- * newly resolved target. +- */ +- if (dfs_cache_find(xid, root_ses, cifs_sb->local_nls, cifs_remap(cifs_sb), target, +- NULL, &ntl)) { +- rc = ops->tree_connect(xid, tcon->ses, tree, tcon, cifs_sb->local_nls); +- if (rc) +- continue; +- ++ rc = ops->tree_connect(xid, tcon->ses, tree, ++ tcon, tcon->ses->local_nls); ++ if (islink && !rc && cifs_sb) + rc = cifs_update_super_prepath(cifs_sb, prefix); +- } else { +- /* Target is another dfs share */ +- rc = update_server_fullpath(server, cifs_sb, target); +- dfs_cache_free_tgts(tl); +- +- if (!rc) { +- rc = -EREMOTE; +- list_replace_init(&ntl.tl_list, &tl->tl_list); +- } else +- dfs_cache_free_tgts(&ntl); +- } + break; + } + +-out: + kfree(share); + kfree(prefix); +- +- return rc; +-} +- +-static int tree_connect_dfs_target(const unsigned int xid, struct cifs_tcon *tcon, +- struct cifs_sb_info *cifs_sb, char *tree, bool islink, +- struct dfs_cache_tgt_list *tl) +-{ +- int rc; +- int num_links = 0; +- struct TCP_Server_Info *server = tcon->ses->server; +- char *old_fullpath = server->leaf_fullpath; +- +- do { +- rc = __tree_connect_dfs_target(xid, tcon, cifs_sb, tree, islink, tl); +- if (!rc || rc != -EREMOTE) +- break; +- } while (rc = -ELOOP, ++num_links < MAX_NESTED_LINKS); +- /* +- * If we couldn't tree connect to any targets from last referral path, then +- * retry it from newly resolved dfs referral. +- */ +- if (rc && server->leaf_fullpath != old_fullpath) +- cifs_signal_cifsd_for_reconnect(server, true); +- + dfs_cache_free_tgts(tl); + return rc; + } +@@ -599,14 +448,11 @@ int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const stru + if (!IS_ERR(sb)) + cifs_sb = CIFS_SB(sb); + +- /* +- * Tree connect to last share in @tcon->tree_name whether dfs super or +- * cached dfs referral was not found. +- */ +- if (!cifs_sb || !server->leaf_fullpath || ++ /* Tree connect to last share in @tcon->tree_name if no DFS referral */ ++ if (!server->leaf_fullpath || + dfs_cache_noreq_find(server->leaf_fullpath + 1, &ref, &tl)) { +- rc = ops->tree_connect(xid, tcon->ses, tcon->tree_name, tcon, +- cifs_sb ? cifs_sb->local_nls : nlsc); ++ rc = ops->tree_connect(xid, tcon->ses, tcon->tree_name, ++ tcon, tcon->ses->local_nls); + goto out; + } + +-- +2.43.0 + diff --git a/queue-6.6/smb-client-memcpy-with-surrounding-object-base-addre.patch b/queue-6.6/smb-client-memcpy-with-surrounding-object-base-addre.patch new file mode 100644 index 00000000000..bbf20ba4351 --- /dev/null +++ b/queue-6.6/smb-client-memcpy-with-surrounding-object-base-addre.patch @@ -0,0 +1,44 @@ +From d7f8b1f22f7f5f40f4c9e3bcb1e9d900d84e3bc0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 17 Nov 2024 03:32:09 -0800 +Subject: smb: client: memcpy() with surrounding object base address + +From: Kees Cook + +[ Upstream commit f69b0187f8745a7a9584f6b13f5e792594b88b2e ] + +Like commit f1f047bd7ce0 ("smb: client: Fix -Wstringop-overflow issues"), +adjust the memcpy() destination address to be based off the surrounding +object rather than based off the 4-byte "Protocol" member. This avoids a +build-time warning when compiling under CONFIG_FORTIFY_SOURCE with GCC 15: + +In function 'fortify_memcpy_chk', + inlined from 'CIFSSMBSetPathInfo' at ../fs/smb/client/cifssmb.c:5358:2: +../include/linux/fortify-string.h:571:25: error: call to '__write_overflow_field' declared with attribute warning: detected write beyond size of field (1st parameter); maybe use struct_group()? [-Werror=attribute-warning] + 571 | __write_overflow_field(p_size_field, size); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Signed-off-by: Kees Cook +Reviewed-by: Gustavo A. R. Silva +Signed-off-by: Steve French +Signed-off-by: Sasha Levin +--- + fs/smb/client/cifssmb.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c +index 301189ee1335b..a34db419e46f7 100644 +--- a/fs/smb/client/cifssmb.c ++++ b/fs/smb/client/cifssmb.c +@@ -5364,7 +5364,7 @@ CIFSSMBSetPathInfo(const unsigned int xid, struct cifs_tcon *tcon, + param_offset = offsetof(struct smb_com_transaction2_spi_req, + InformationLevel) - 4; + offset = param_offset + params; +- data_offset = (char *) (&pSMB->hdr.Protocol) + offset; ++ data_offset = (char *)pSMB + offsetof(typeof(*pSMB), hdr.Protocol) + offset; + pSMB->ParameterOffset = cpu_to_le16(param_offset); + pSMB->DataOffset = cpu_to_le16(offset); + pSMB->SetupCount = 1; +-- +2.43.0 + diff --git a/queue-6.6/soc-imx8m-probe-the-soc-driver-as-platform-driver.patch b/queue-6.6/soc-imx8m-probe-the-soc-driver-as-platform-driver.patch new file mode 100644 index 00000000000..0b96c529c33 --- /dev/null +++ b/queue-6.6/soc-imx8m-probe-the-soc-driver-as-platform-driver.patch @@ -0,0 +1,272 @@ +From 4d53a7bde656ee5f099eaab5e105309d815fc207 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 29 Sep 2024 20:49:16 +0200 +Subject: soc: imx8m: Probe the SoC driver as platform driver + +From: Marek Vasut + +[ Upstream commit 9cc832d37799dbea950c4c8a34721b02b8b5a8ff ] + +With driver_async_probe=* on kernel command line, the following trace is +produced because on i.MX8M Plus hardware because the soc-imx8m.c driver +calls of_clk_get_by_name() which returns -EPROBE_DEFER because the clock +driver is not yet probed. This was not detected during regular testing +without driver_async_probe. + +Convert the SoC code to platform driver and instantiate a platform device +in its current device_initcall() to probe the platform driver. Rework +.soc_revision callback to always return valid error code and return SoC +revision via parameter. This way, if anything in the .soc_revision callback +return -EPROBE_DEFER, it gets propagated to .probe and the .probe will get +retried later. + +" +------------[ cut here ]------------ +WARNING: CPU: 1 PID: 1 at drivers/soc/imx/soc-imx8m.c:115 imx8mm_soc_revision+0xdc/0x180 +CPU: 1 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.11.0-next-20240924-00002-g2062bb554dea #603 +Hardware name: DH electronics i.MX8M Plus DHCOM Premium Developer Kit (3) (DT) +pstate: 20000005 (nzCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) +pc : imx8mm_soc_revision+0xdc/0x180 +lr : imx8mm_soc_revision+0xd0/0x180 +sp : ffff8000821fbcc0 +x29: ffff8000821fbce0 x28: 0000000000000000 x27: ffff800081810120 +x26: ffff8000818a9970 x25: 0000000000000006 x24: 0000000000824311 +x23: ffff8000817f42c8 x22: ffff0000df8be210 x21: fffffffffffffdfb +x20: ffff800082780000 x19: 0000000000000001 x18: ffffffffffffffff +x17: ffff800081fff418 x16: ffff8000823e1000 x15: ffff0000c03b65e8 +x14: ffff0000c00051b0 x13: ffff800082790000 x12: 0000000000000801 +x11: ffff80008278ffff x10: ffff80008209d3a6 x9 : ffff80008062e95c +x8 : ffff8000821fb9a0 x7 : 0000000000000000 x6 : 00000000000080e3 +x5 : ffff0000df8c03d8 x4 : 0000000000000000 x3 : 0000000000000000 +x2 : 0000000000000000 x1 : fffffffffffffdfb x0 : fffffffffffffdfb +Call trace: + imx8mm_soc_revision+0xdc/0x180 + imx8_soc_init+0xb0/0x1e0 + do_one_initcall+0x94/0x1a8 + kernel_init_freeable+0x240/0x2a8 + kernel_init+0x28/0x140 + ret_from_fork+0x10/0x20 +---[ end trace 0000000000000000 ]--- +SoC: i.MX8MP revision 1.1 +" + +Signed-off-by: Marek Vasut +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + drivers/soc/imx/soc-imx8m.c | 107 ++++++++++++++++++++++++++++-------- + 1 file changed, 85 insertions(+), 22 deletions(-) + +diff --git a/drivers/soc/imx/soc-imx8m.c b/drivers/soc/imx/soc-imx8m.c +index ec87d9d878f30..1ff8c7d847a9e 100644 +--- a/drivers/soc/imx/soc-imx8m.c ++++ b/drivers/soc/imx/soc-imx8m.c +@@ -30,7 +30,7 @@ + + struct imx8_soc_data { + char *name; +- u32 (*soc_revision)(void); ++ int (*soc_revision)(u32 *socrev); + }; + + static u64 soc_uid; +@@ -51,24 +51,29 @@ static u32 imx8mq_soc_revision_from_atf(void) + static inline u32 imx8mq_soc_revision_from_atf(void) { return 0; }; + #endif + +-static u32 __init imx8mq_soc_revision(void) ++static int imx8mq_soc_revision(u32 *socrev) + { + struct device_node *np; + void __iomem *ocotp_base; + u32 magic; + u32 rev; + struct clk *clk; ++ int ret; + + np = of_find_compatible_node(NULL, NULL, "fsl,imx8mq-ocotp"); + if (!np) +- return 0; ++ return -EINVAL; + + ocotp_base = of_iomap(np, 0); +- WARN_ON(!ocotp_base); ++ if (!ocotp_base) { ++ ret = -EINVAL; ++ goto err_iomap; ++ } ++ + clk = of_clk_get_by_name(np, NULL); + if (IS_ERR(clk)) { +- WARN_ON(IS_ERR(clk)); +- return 0; ++ ret = PTR_ERR(clk); ++ goto err_clk; + } + + clk_prepare_enable(clk); +@@ -88,32 +93,45 @@ static u32 __init imx8mq_soc_revision(void) + soc_uid <<= 32; + soc_uid |= readl_relaxed(ocotp_base + OCOTP_UID_LOW); + ++ *socrev = rev; ++ + clk_disable_unprepare(clk); + clk_put(clk); + iounmap(ocotp_base); + of_node_put(np); + +- return rev; ++ return 0; ++ ++err_clk: ++ iounmap(ocotp_base); ++err_iomap: ++ of_node_put(np); ++ return ret; + } + +-static void __init imx8mm_soc_uid(void) ++static int imx8mm_soc_uid(void) + { + void __iomem *ocotp_base; + struct device_node *np; + struct clk *clk; ++ int ret = 0; + u32 offset = of_machine_is_compatible("fsl,imx8mp") ? + IMX8MP_OCOTP_UID_OFFSET : 0; + + np = of_find_compatible_node(NULL, NULL, "fsl,imx8mm-ocotp"); + if (!np) +- return; ++ return -EINVAL; + + ocotp_base = of_iomap(np, 0); +- WARN_ON(!ocotp_base); ++ if (!ocotp_base) { ++ ret = -EINVAL; ++ goto err_iomap; ++ } ++ + clk = of_clk_get_by_name(np, NULL); + if (IS_ERR(clk)) { +- WARN_ON(IS_ERR(clk)); +- return; ++ ret = PTR_ERR(clk); ++ goto err_clk; + } + + clk_prepare_enable(clk); +@@ -124,31 +142,41 @@ static void __init imx8mm_soc_uid(void) + + clk_disable_unprepare(clk); + clk_put(clk); ++ ++err_clk: + iounmap(ocotp_base); ++err_iomap: + of_node_put(np); ++ ++ return ret; + } + +-static u32 __init imx8mm_soc_revision(void) ++static int imx8mm_soc_revision(u32 *socrev) + { + struct device_node *np; + void __iomem *anatop_base; +- u32 rev; ++ int ret; + + np = of_find_compatible_node(NULL, NULL, "fsl,imx8mm-anatop"); + if (!np) +- return 0; ++ return -EINVAL; + + anatop_base = of_iomap(np, 0); +- WARN_ON(!anatop_base); ++ if (!anatop_base) { ++ ret = -EINVAL; ++ goto err_iomap; ++ } + +- rev = readl_relaxed(anatop_base + ANADIG_DIGPROG_IMX8MM); ++ *socrev = readl_relaxed(anatop_base + ANADIG_DIGPROG_IMX8MM); + + iounmap(anatop_base); + of_node_put(np); + +- imx8mm_soc_uid(); ++ return imx8mm_soc_uid(); + +- return rev; ++err_iomap: ++ of_node_put(np); ++ return ret; + } + + static const struct imx8_soc_data imx8mq_soc_data = { +@@ -184,7 +212,7 @@ static __maybe_unused const struct of_device_id imx8_soc_match[] = { + kasprintf(GFP_KERNEL, "%d.%d", (soc_rev >> 4) & 0xf, soc_rev & 0xf) : \ + "unknown" + +-static int __init imx8_soc_init(void) ++static int imx8m_soc_probe(struct platform_device *pdev) + { + struct soc_device_attribute *soc_dev_attr; + struct soc_device *soc_dev; +@@ -212,8 +240,11 @@ static int __init imx8_soc_init(void) + data = id->data; + if (data) { + soc_dev_attr->soc_id = data->name; +- if (data->soc_revision) +- soc_rev = data->soc_revision(); ++ if (data->soc_revision) { ++ ret = data->soc_revision(&soc_rev); ++ if (ret) ++ goto free_soc; ++ } + } + + soc_dev_attr->revision = imx8_revision(soc_rev); +@@ -251,5 +282,37 @@ static int __init imx8_soc_init(void) + kfree(soc_dev_attr); + return ret; + } ++ ++static struct platform_driver imx8m_soc_driver = { ++ .probe = imx8m_soc_probe, ++ .driver = { ++ .name = "imx8m-soc", ++ }, ++}; ++ ++static int __init imx8_soc_init(void) ++{ ++ struct platform_device *pdev; ++ int ret; ++ ++ /* No match means this is non-i.MX8M hardware, do nothing. */ ++ if (!of_match_node(imx8_soc_match, of_root)) ++ return 0; ++ ++ ret = platform_driver_register(&imx8m_soc_driver); ++ if (ret) { ++ pr_err("Failed to register imx8m-soc platform driver: %d\n", ret); ++ return ret; ++ } ++ ++ pdev = platform_device_register_simple("imx8m-soc", -1, NULL, 0); ++ if (IS_ERR(pdev)) { ++ pr_err("Failed to register imx8m-soc platform device: %ld\n", PTR_ERR(pdev)); ++ platform_driver_unregister(&imx8m_soc_driver); ++ return PTR_ERR(pdev); ++ } ++ ++ return 0; ++} + device_initcall(imx8_soc_init); + MODULE_LICENSE("GPL"); +-- +2.43.0 + diff --git a/queue-6.6/spi-spi-fsl-lpspi-adjust-type-of-scldiv.patch b/queue-6.6/spi-spi-fsl-lpspi-adjust-type-of-scldiv.patch new file mode 100644 index 00000000000..1dffaaeca21 --- /dev/null +++ b/queue-6.6/spi-spi-fsl-lpspi-adjust-type-of-scldiv.patch @@ -0,0 +1,58 @@ +From a4d06b125a0567bc27a75bb1ea8078c841dd3a87 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 30 Sep 2024 11:30:54 +0200 +Subject: spi: spi-fsl-lpspi: Adjust type of scldiv + +From: Stefan Wahren + +[ Upstream commit fa8ecda9876ac1e7b29257aa82af1fd0695496e2 ] + +The target value of scldiv is just a byte, but its calculation in +fsl_lpspi_set_bitrate could be negative. So use an adequate type to store +the result and avoid overflows. After that this needs range check +adjustments, but this should make the code less opaque. + +Signed-off-by: Stefan Wahren +Reviewed-by: Frank Li +Link: https://patch.msgid.link/20240930093056.93418-2-wahrenst@gmx.net +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/spi/spi-fsl-lpspi.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/drivers/spi/spi-fsl-lpspi.c b/drivers/spi/spi-fsl-lpspi.c +index 514a2c5c84226..9e2541dee56e5 100644 +--- a/drivers/spi/spi-fsl-lpspi.c ++++ b/drivers/spi/spi-fsl-lpspi.c +@@ -315,9 +315,10 @@ static void fsl_lpspi_set_watermark(struct fsl_lpspi_data *fsl_lpspi) + static int fsl_lpspi_set_bitrate(struct fsl_lpspi_data *fsl_lpspi) + { + struct lpspi_config config = fsl_lpspi->config; +- unsigned int perclk_rate, scldiv, div; ++ unsigned int perclk_rate, div; + u8 prescale_max; + u8 prescale; ++ int scldiv; + + perclk_rate = clk_get_rate(fsl_lpspi->clk_per); + prescale_max = fsl_lpspi->devtype_data->prescale_max; +@@ -338,13 +339,13 @@ static int fsl_lpspi_set_bitrate(struct fsl_lpspi_data *fsl_lpspi) + + for (prescale = 0; prescale <= prescale_max; prescale++) { + scldiv = div / (1 << prescale) - 2; +- if (scldiv < 256) { ++ if (scldiv >= 0 && scldiv < 256) { + fsl_lpspi->config.prescale = prescale; + break; + } + } + +- if (scldiv >= 256) ++ if (scldiv < 0 || scldiv >= 256) + return -EINVAL; + + writel(scldiv | (scldiv << 8) | ((scldiv >> 1) << 16), +-- +2.43.0 + diff --git a/queue-6.6/thermal-drivers-qcom-tsens-v1-add-support-for-msm893.patch b/queue-6.6/thermal-drivers-qcom-tsens-v1-add-support-for-msm893.patch new file mode 100644 index 00000000000..0341a5a8263 --- /dev/null +++ b/queue-6.6/thermal-drivers-qcom-tsens-v1-add-support-for-msm893.patch @@ -0,0 +1,103 @@ +From 261f4424ffaf428bf6cea10c08256c1815bbd50b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Nov 2024 16:11:46 +0100 +Subject: thermal/drivers/qcom/tsens-v1: Add support for MSM8937 tsens +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Barnabás Czémán + +[ Upstream commit e2ffb6c3a40ee714160e35e61f0a984028b5d550 ] + +Add support for tsens v1.4 block what can be found in +MSM8937 and MSM8917. + +Reviewed-by: Dmitry Baryshkov +Signed-off-by: Barnabás Czémán +Link: https://lore.kernel.org/r/20241113-msm8917-v6-5-c348fb599fef@mainlining.org +Signed-off-by: Daniel Lezcano +Signed-off-by: Sasha Levin +--- + drivers/thermal/qcom/tsens-v1.c | 21 ++++++++++++++------- + drivers/thermal/qcom/tsens.c | 3 +++ + drivers/thermal/qcom/tsens.h | 2 +- + 3 files changed, 18 insertions(+), 8 deletions(-) + +diff --git a/drivers/thermal/qcom/tsens-v1.c b/drivers/thermal/qcom/tsens-v1.c +index dc1c4ae2d8b01..1a7874676f68e 100644 +--- a/drivers/thermal/qcom/tsens-v1.c ++++ b/drivers/thermal/qcom/tsens-v1.c +@@ -162,28 +162,35 @@ struct tsens_plat_data data_tsens_v1 = { + .fields = tsens_v1_regfields, + }; + +-static const struct tsens_ops ops_8956 = { +- .init = init_8956, ++static const struct tsens_ops ops_common = { ++ .init = init_common, + .calibrate = tsens_calibrate_common, + .get_temp = get_temp_tsens_valid, + }; + +-struct tsens_plat_data data_8956 = { ++struct tsens_plat_data data_8937 = { + .num_sensors = 11, +- .ops = &ops_8956, ++ .ops = &ops_common, + .feat = &tsens_v1_feat, + .fields = tsens_v1_regfields, + }; + +-static const struct tsens_ops ops_8976 = { +- .init = init_common, ++static const struct tsens_ops ops_8956 = { ++ .init = init_8956, + .calibrate = tsens_calibrate_common, + .get_temp = get_temp_tsens_valid, + }; + ++struct tsens_plat_data data_8956 = { ++ .num_sensors = 11, ++ .ops = &ops_8956, ++ .feat = &tsens_v1_feat, ++ .fields = tsens_v1_regfields, ++}; ++ + struct tsens_plat_data data_8976 = { + .num_sensors = 11, +- .ops = &ops_8976, ++ .ops = &ops_common, + .feat = &tsens_v1_feat, + .fields = tsens_v1_regfields, + }; +diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c +index ee22672471e81..0aff3318aa19a 100644 +--- a/drivers/thermal/qcom/tsens.c ++++ b/drivers/thermal/qcom/tsens.c +@@ -1118,6 +1118,9 @@ static const struct of_device_id tsens_table[] = { + }, { + .compatible = "qcom,msm8916-tsens", + .data = &data_8916, ++ }, { ++ .compatible = "qcom,msm8937-tsens", ++ .data = &data_8937, + }, { + .compatible = "qcom,msm8939-tsens", + .data = &data_8939, +diff --git a/drivers/thermal/qcom/tsens.h b/drivers/thermal/qcom/tsens.h +index 2805de1c68279..b94a84c94e29a 100644 +--- a/drivers/thermal/qcom/tsens.h ++++ b/drivers/thermal/qcom/tsens.h +@@ -642,7 +642,7 @@ extern struct tsens_plat_data data_8960; + extern struct tsens_plat_data data_8226, data_8909, data_8916, data_8939, data_8974, data_9607; + + /* TSENS v1 targets */ +-extern struct tsens_plat_data data_tsens_v1, data_8976, data_8956; ++extern struct tsens_plat_data data_tsens_v1, data_8937, data_8976, data_8956; + + /* TSENS v2 targets */ + extern struct tsens_plat_data data_8996, data_ipq8074, data_tsens_v2; +-- +2.43.0 + diff --git a/queue-6.6/timekeeping-always-check-for-negative-motion.patch b/queue-6.6/timekeeping-always-check-for-negative-motion.patch new file mode 100644 index 00000000000..16da8696bbc --- /dev/null +++ b/queue-6.6/timekeeping-always-check-for-negative-motion.patch @@ -0,0 +1,88 @@ +From 5617f2f08518911b013752a1f4fcb0e2524f241f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 31 Oct 2024 13:04:08 +0100 +Subject: timekeeping: Always check for negative motion + +From: Thomas Gleixner + +[ Upstream commit c163e40af9b2331b2c629fd4ec8b703ed4d4ae39 ] + +clocksource_delta() has two variants. One with a check for negative motion, +which is only selected by x86. This is a historic leftover as this function +was previously used in the time getter hot paths. + +Since 135225a363ae timekeeping_cycles_to_ns() has unconditional protection +against this as a by-product of the protection against 64bit math overflow. + +clocksource_delta() is only used in the clocksource watchdog and in +timekeeping_advance(). The extra conditional there is not hurting anyone. + +Remove the config option and unconditionally prevent negative motion of the +readout. + +Signed-off-by: Thomas Gleixner +Acked-by: John Stultz +Link: https://lore.kernel.org/all/20241031120328.599430157@linutronix.de +Signed-off-by: Sasha Levin +--- + arch/x86/Kconfig | 1 - + kernel/time/Kconfig | 5 ----- + kernel/time/timekeeping_internal.h | 7 ------- + 3 files changed, 13 deletions(-) + +diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig +index 05c82fd5d0f60..a8bff6520bd61 100644 +--- a/arch/x86/Kconfig ++++ b/arch/x86/Kconfig +@@ -136,7 +136,6 @@ config X86 + select ARCH_HAS_PARANOID_L1D_FLUSH + select BUILDTIME_TABLE_SORT + select CLKEVT_I8253 +- select CLOCKSOURCE_VALIDATE_LAST_CYCLE + select CLOCKSOURCE_WATCHDOG + # Word-size accesses may read uninitialized data past the trailing \0 + # in strings and cause false KMSAN reports. +diff --git a/kernel/time/Kconfig b/kernel/time/Kconfig +index bae8f11070bef..1f0f86e51d042 100644 +--- a/kernel/time/Kconfig ++++ b/kernel/time/Kconfig +@@ -17,11 +17,6 @@ config ARCH_CLOCKSOURCE_DATA + config ARCH_CLOCKSOURCE_INIT + bool + +-# Clocksources require validation of the clocksource against the last +-# cycle update - x86/TSC misfeature +-config CLOCKSOURCE_VALIDATE_LAST_CYCLE +- bool +- + # Timekeeping vsyscall support + config GENERIC_TIME_VSYSCALL + bool +diff --git a/kernel/time/timekeeping_internal.h b/kernel/time/timekeeping_internal.h +index 4ca2787d1642e..1d4854d5c386e 100644 +--- a/kernel/time/timekeeping_internal.h ++++ b/kernel/time/timekeeping_internal.h +@@ -15,7 +15,6 @@ extern void tk_debug_account_sleep_time(const struct timespec64 *t); + #define tk_debug_account_sleep_time(x) + #endif + +-#ifdef CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE + static inline u64 clocksource_delta(u64 now, u64 last, u64 mask) + { + u64 ret = (now - last) & mask; +@@ -26,12 +25,6 @@ static inline u64 clocksource_delta(u64 now, u64 last, u64 mask) + */ + return ret & ~(mask >> 1) ? 0 : ret; + } +-#else +-static inline u64 clocksource_delta(u64 now, u64 last, u64 mask) +-{ +- return (now - last) & mask; +-} +-#endif + + /* Semi public for serialization of non timekeeper VDSO updates. */ + extern raw_spinlock_t timekeeper_lock; +-- +2.43.0 + diff --git a/queue-6.6/tools-rtla-fix-collision-with-glibc-sched_attr-sched.patch b/queue-6.6/tools-rtla-fix-collision-with-glibc-sched_attr-sched.patch new file mode 100644 index 00000000000..1dcf11cb219 --- /dev/null +++ b/queue-6.6/tools-rtla-fix-collision-with-glibc-sched_attr-sched.patch @@ -0,0 +1,86 @@ +From 8e34ff60fa547e7359309c038847c4bd43c05c79 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Oct 2024 17:09:48 +0200 +Subject: tools/rtla: fix collision with glibc sched_attr/sched_set_attr +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Jan Stancek + +[ Upstream commit 0eecee340672c4b512f6f4a8c6add26df05d130c ] + +glibc commit 21571ca0d703 ("Linux: Add the sched_setattr +and sched_getattr functions") now also provides 'struct sched_attr' +and sched_setattr() which collide with the ones from rtla. + + In file included from src/trace.c:11: + src/utils.h:49:8: error: redefinition of ‘struct sched_attr’ + 49 | struct sched_attr { + | ^~~~~~~~~~ + In file included from /usr/include/bits/sched.h:60, + from /usr/include/sched.h:43, + from /usr/include/tracefs/tracefs.h:10, + from src/trace.c:4: + /usr/include/linux/sched/types.h:98:8: note: originally defined here + 98 | struct sched_attr { + | ^~~~~~~~~~ + +Define 'struct sched_attr' conditionally, similar to what strace did: + https://lore.kernel.org/all/20240930222913.3981407-1-raj.khem@gmail.com/ +and rename rtla's version of sched_setattr() to avoid collision. + +Link: https://lore.kernel.org/8088f66a7a57c1b209cd8ae0ae7c336a7f8c930d.1728572865.git.jstancek@redhat.com +Signed-off-by: Jan Stancek +Signed-off-by: Steven Rostedt (Google) +Signed-off-by: Sasha Levin +--- + tools/tracing/rtla/src/utils.c | 4 ++-- + tools/tracing/rtla/src/utils.h | 2 ++ + 2 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/tools/tracing/rtla/src/utils.c b/tools/tracing/rtla/src/utils.c +index 9ac71a66840c1..0735fcb827ed7 100644 +--- a/tools/tracing/rtla/src/utils.c ++++ b/tools/tracing/rtla/src/utils.c +@@ -233,7 +233,7 @@ long parse_ns_duration(char *val) + + #define SCHED_DEADLINE 6 + +-static inline int sched_setattr(pid_t pid, const struct sched_attr *attr, ++static inline int syscall_sched_setattr(pid_t pid, const struct sched_attr *attr, + unsigned int flags) { + return syscall(__NR_sched_setattr, pid, attr, flags); + } +@@ -243,7 +243,7 @@ int __set_sched_attr(int pid, struct sched_attr *attr) + int flags = 0; + int retval; + +- retval = sched_setattr(pid, attr, flags); ++ retval = syscall_sched_setattr(pid, attr, flags); + if (retval < 0) { + err_msg("Failed to set sched attributes to the pid %d: %s\n", + pid, strerror(errno)); +diff --git a/tools/tracing/rtla/src/utils.h b/tools/tracing/rtla/src/utils.h +index d44513e6c66a0..99c9cf81bcd02 100644 +--- a/tools/tracing/rtla/src/utils.h ++++ b/tools/tracing/rtla/src/utils.h +@@ -46,6 +46,7 @@ update_sum(unsigned long long *a, unsigned long long *b) + *a += *b; + } + ++#ifndef SCHED_ATTR_SIZE_VER0 + struct sched_attr { + uint32_t size; + uint32_t sched_policy; +@@ -56,6 +57,7 @@ struct sched_attr { + uint64_t sched_deadline; + uint64_t sched_period; + }; ++#endif /* SCHED_ATTR_SIZE_VER0 */ + + int parse_prio(char *arg, struct sched_attr *sched_param); + int parse_cpu_set(char *cpu_list, cpu_set_t *set); +-- +2.43.0 + diff --git a/queue-6.6/tracing-ftrace-disable-preemption-in-syscall-probe.patch b/queue-6.6/tracing-ftrace-disable-preemption-in-syscall-probe.patch new file mode 100644 index 00000000000..06ff131ba5a --- /dev/null +++ b/queue-6.6/tracing-ftrace-disable-preemption-in-syscall-probe.patch @@ -0,0 +1,145 @@ +From 8126dcd7495734e2d89016b42bc2f4818e2c60a2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 8 Oct 2024 21:07:12 -0400 +Subject: tracing/ftrace: disable preemption in syscall probe + +From: Mathieu Desnoyers + +[ Upstream commit 13d750c2c03e9861e15268574ed2c239cca9c9d5 ] + +In preparation for allowing system call enter/exit instrumentation to +handle page faults, make sure that ftrace can handle this change by +explicitly disabling preemption within the ftrace system call tracepoint +probes to respect the current expectations within ftrace ring buffer +code. + +This change does not yet allow ftrace to take page faults per se within +its probe, but allows its existing probes to adapt to the upcoming +change. + +Cc: Michael Jeanson +Cc: Masami Hiramatsu +Cc: Peter Zijlstra +Cc: Alexei Starovoitov +Cc: Yonghong Song +Cc: Paul E. McKenney +Cc: Ingo Molnar +Cc: Arnaldo Carvalho de Melo +Cc: Mark Rutland +Cc: Alexander Shishkin +Cc: Namhyung Kim +Cc: Andrii Nakryiko +Cc: bpf@vger.kernel.org +Cc: Joel Fernandes +Link: https://lore.kernel.org/20241009010718.2050182-3-mathieu.desnoyers@efficios.com +Acked-by: Masami Hiramatsu (Google) +Signed-off-by: Mathieu Desnoyers +Signed-off-by: Steven Rostedt (Google) +Signed-off-by: Sasha Levin +--- + include/trace/trace_events.h | 36 +++++++++++++++++++++++++++++++---- + kernel/trace/trace_syscalls.c | 12 ++++++++++++ + 2 files changed, 44 insertions(+), 4 deletions(-) + +diff --git a/include/trace/trace_events.h b/include/trace/trace_events.h +index c2f9cabf154d1..fa0d51cad57a8 100644 +--- a/include/trace/trace_events.h ++++ b/include/trace/trace_events.h +@@ -244,6 +244,9 @@ static struct trace_event_fields trace_event_fields_##call[] = { \ + tstruct \ + {} }; + ++#undef DECLARE_EVENT_SYSCALL_CLASS ++#define DECLARE_EVENT_SYSCALL_CLASS DECLARE_EVENT_CLASS ++ + #undef DEFINE_EVENT_PRINT + #define DEFINE_EVENT_PRINT(template, name, proto, args, print) + +@@ -374,11 +377,11 @@ static inline notrace int trace_event_get_offsets_##call( \ + + #include "stages/stage6_event_callback.h" + +-#undef DECLARE_EVENT_CLASS +-#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ +- \ ++ ++#undef __DECLARE_EVENT_CLASS ++#define __DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ + static notrace void \ +-trace_event_raw_event_##call(void *__data, proto) \ ++do_trace_event_raw_event_##call(void *__data, proto) \ + { \ + struct trace_event_file *trace_file = __data; \ + struct trace_event_data_offsets_##call __maybe_unused __data_offsets;\ +@@ -403,6 +406,29 @@ trace_event_raw_event_##call(void *__data, proto) \ + \ + trace_event_buffer_commit(&fbuffer); \ + } ++ ++#undef DECLARE_EVENT_CLASS ++#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ ++__DECLARE_EVENT_CLASS(call, PARAMS(proto), PARAMS(args), PARAMS(tstruct), \ ++ PARAMS(assign), PARAMS(print)) \ ++static notrace void \ ++trace_event_raw_event_##call(void *__data, proto) \ ++{ \ ++ do_trace_event_raw_event_##call(__data, args); \ ++} ++ ++#undef DECLARE_EVENT_SYSCALL_CLASS ++#define DECLARE_EVENT_SYSCALL_CLASS(call, proto, args, tstruct, assign, print) \ ++__DECLARE_EVENT_CLASS(call, PARAMS(proto), PARAMS(args), PARAMS(tstruct), \ ++ PARAMS(assign), PARAMS(print)) \ ++static notrace void \ ++trace_event_raw_event_##call(void *__data, proto) \ ++{ \ ++ preempt_disable_notrace(); \ ++ do_trace_event_raw_event_##call(__data, args); \ ++ preempt_enable_notrace(); \ ++} ++ + /* + * The ftrace_test_probe is compiled out, it is only here as a build time check + * to make sure that if the tracepoint handling changes, the ftrace probe will +@@ -418,6 +444,8 @@ static inline void ftrace_test_probe_##call(void) \ + + #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) + ++#undef __DECLARE_EVENT_CLASS ++ + #include "stages/stage7_class_define.h" + + #undef DECLARE_EVENT_CLASS +diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c +index de753403cdafb..9508d9022940f 100644 +--- a/kernel/trace/trace_syscalls.c ++++ b/kernel/trace/trace_syscalls.c +@@ -299,6 +299,12 @@ static void ftrace_syscall_enter(void *data, struct pt_regs *regs, long id) + int syscall_nr; + int size; + ++ /* ++ * Syscall probe called with preemption enabled, but the ring ++ * buffer and per-cpu data require preemption to be disabled. ++ */ ++ guard(preempt_notrace)(); ++ + syscall_nr = trace_get_syscall_nr(current, regs); + if (syscall_nr < 0 || syscall_nr >= NR_syscalls) + return; +@@ -338,6 +344,12 @@ static void ftrace_syscall_exit(void *data, struct pt_regs *regs, long ret) + struct trace_event_buffer fbuffer; + int syscall_nr; + ++ /* ++ * Syscall probe called with preemption enabled, but the ring ++ * buffer and per-cpu data require preemption to be disabled. ++ */ ++ guard(preempt_notrace)(); ++ + syscall_nr = trace_get_syscall_nr(current, regs); + if (syscall_nr < 0 || syscall_nr >= NR_syscalls) + return; +-- +2.43.0 + diff --git a/queue-6.6/tracing-use-atomic64_inc_return-in-trace_clock_count.patch b/queue-6.6/tracing-use-atomic64_inc_return-in-trace_clock_count.patch new file mode 100644 index 00000000000..04b0b6bc532 --- /dev/null +++ b/queue-6.6/tracing-use-atomic64_inc_return-in-trace_clock_count.patch @@ -0,0 +1,38 @@ +From 75c1fe3cbee1729a36f45728f669820b711d5703 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 7 Oct 2024 10:56:28 +0200 +Subject: tracing: Use atomic64_inc_return() in trace_clock_counter() + +From: Uros Bizjak + +[ Upstream commit eb887c4567d1b0e7684c026fe7df44afa96589e6 ] + +Use atomic64_inc_return(&ref) instead of atomic64_add_return(1, &ref) +to use optimized implementation and ease register pressure around +the primitive for targets that implement optimized variant. + +Cc: Steven Rostedt +Cc: Masami Hiramatsu +Cc: Mathieu Desnoyers +Link: https://lore.kernel.org/20241007085651.48544-1-ubizjak@gmail.com +Signed-off-by: Uros Bizjak +Signed-off-by: Steven Rostedt (Google) +Signed-off-by: Sasha Levin +--- + kernel/trace/trace_clock.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/trace/trace_clock.c b/kernel/trace/trace_clock.c +index 4702efb00ff21..4cb2ebc439be6 100644 +--- a/kernel/trace/trace_clock.c ++++ b/kernel/trace/trace_clock.c +@@ -154,5 +154,5 @@ static atomic64_t trace_counter; + */ + u64 notrace trace_clock_counter(void) + { +- return atomic64_add_return(1, &trace_counter); ++ return atomic64_inc_return(&trace_counter); + } +-- +2.43.0 + diff --git a/queue-6.6/usb-chipidea-udc-handle-usb-error-interrupt-if-ioc-n.patch b/queue-6.6/usb-chipidea-udc-handle-usb-error-interrupt-if-ioc-n.patch new file mode 100644 index 00000000000..0d2d34b6d0a --- /dev/null +++ b/queue-6.6/usb-chipidea-udc-handle-usb-error-interrupt-if-ioc-n.patch @@ -0,0 +1,44 @@ +From 431ffac3b9e930f4a62aca221f7987eb2261e21f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 26 Sep 2024 10:29:04 +0800 +Subject: usb: chipidea: udc: handle USB Error Interrupt if IOC not set + +From: Xu Yang + +[ Upstream commit 548f48b66c0c5d4b9795a55f304b7298cde2a025 ] + +As per USBSTS register description about UEI: + + When completion of a USB transaction results in an error condition, this + bit is set by the Host/Device Controller. This bit is set along with the + USBINT bit, if the TD on which the error interrupt occurred also had its + interrupt on complete (IOC) bit set. + +UI is set only when IOC set. Add checking UEI to fix miss call +isr_tr_complete_handler() when IOC have not set and transfer error happen. + +Acked-by: Peter Chen +Signed-off-by: Xu Yang +Link: https://lore.kernel.org/r/20240926022906.473319-1-xu.yang_2@nxp.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/chipidea/udc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c +index f70ceedfb468f..9f7d003e467b5 100644 +--- a/drivers/usb/chipidea/udc.c ++++ b/drivers/usb/chipidea/udc.c +@@ -2062,7 +2062,7 @@ static irqreturn_t udc_irq(struct ci_hdrc *ci) + } + } + +- if (USBi_UI & intr) ++ if ((USBi_UI | USBi_UEI) & intr) + isr_tr_complete_handler(ci); + + if ((USBi_SLI & intr) && !(ci->suspended)) { +-- +2.43.0 + diff --git a/queue-6.6/verification-dot2-improve-dot-parser-robustness.patch b/queue-6.6/verification-dot2-improve-dot-parser-robustness.patch new file mode 100644 index 00000000000..7395aceec13 --- /dev/null +++ b/queue-6.6/verification-dot2-improve-dot-parser-robustness.patch @@ -0,0 +1,99 @@ +From a2061c0b16df26de310029549f56c7ce78e738e8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Oct 2024 08:42:39 +0200 +Subject: verification/dot2: Improve dot parser robustness + +From: Gabriele Monaco + +[ Upstream commit 571f8b3f866a6d990a50fe5c89fe0ea78784d70b ] + +This patch makes the dot parser used by dot2c and dot2k slightly more +robust, namely: +* allows parsing files with the gv extension (GraphViz) +* correctly parses edges with any indentation + * used to work only with a single character (e.g. '\t') +Additionally it fixes a couple of warnings reported by pylint such as +wrong indentation and comparison to False instead of `not ...` + +Link: https://lore.kernel.org/20241017064238.41394-2-gmonaco@redhat.com +Signed-off-by: Gabriele Monaco +Signed-off-by: Steven Rostedt (Google) +Signed-off-by: Sasha Levin +--- + tools/verification/dot2/automata.py | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +diff --git a/tools/verification/dot2/automata.py b/tools/verification/dot2/automata.py +index baffeb960ff0b..bdeb98baa8b06 100644 +--- a/tools/verification/dot2/automata.py ++++ b/tools/verification/dot2/automata.py +@@ -29,11 +29,11 @@ class Automata: + + def __get_model_name(self): + basename = ntpath.basename(self.__dot_path) +- if basename.endswith(".dot") == False: ++ if not basename.endswith(".dot") and not basename.endswith(".gv"): + print("not a dot file") + raise Exception("not a dot file: %s" % self.__dot_path) + +- model_name = basename[0:-4] ++ model_name = ntpath.splitext(basename)[0] + if model_name.__len__() == 0: + raise Exception("not a dot file: %s" % self.__dot_path) + +@@ -68,9 +68,9 @@ class Automata: + def __get_cursor_begin_events(self): + cursor = 0 + while self.__dot_lines[cursor].split()[0] != "{node": +- cursor += 1 ++ cursor += 1 + while self.__dot_lines[cursor].split()[0] == "{node": +- cursor += 1 ++ cursor += 1 + # skip initial state transition + cursor += 1 + return cursor +@@ -94,11 +94,11 @@ class Automata: + initial_state = state[7:] + else: + states.append(state) +- if self.__dot_lines[cursor].__contains__("doublecircle") == True: ++ if "doublecircle" in self.__dot_lines[cursor]: + final_states.append(state) + has_final_states = True + +- if self.__dot_lines[cursor].__contains__("ellipse") == True: ++ if "ellipse" in self.__dot_lines[cursor]: + final_states.append(state) + has_final_states = True + +@@ -110,7 +110,7 @@ class Automata: + # Insert the initial state at the bein og the states + states.insert(0, initial_state) + +- if has_final_states == False: ++ if not has_final_states: + final_states.append(initial_state) + + return states, initial_state, final_states +@@ -120,7 +120,7 @@ class Automata: + cursor = self.__get_cursor_begin_events() + + events = [] +- while self.__dot_lines[cursor][1] == '"': ++ while self.__dot_lines[cursor].lstrip()[0] == '"': + # transitions have the format: + # "all_fired" -> "both_fired" [ label = "disable_irq" ]; + # ------------ event is here ------------^^^^^ +@@ -161,7 +161,7 @@ class Automata: + # and we are back! Let's fill the matrix + cursor = self.__get_cursor_begin_events() + +- while self.__dot_lines[cursor][1] == '"': ++ while self.__dot_lines[cursor].lstrip()[0] == '"': + if self.__dot_lines[cursor].split()[1] == "->": + line = self.__dot_lines[cursor].split() + origin_state = line[0].replace('"','').replace(',','_') +-- +2.43.0 + diff --git a/queue-6.6/virtio-net-fix-overflow-inside-virtnet_rq_alloc.patch b/queue-6.6/virtio-net-fix-overflow-inside-virtnet_rq_alloc.patch new file mode 100644 index 00000000000..a0e724f9136 --- /dev/null +++ b/queue-6.6/virtio-net-fix-overflow-inside-virtnet_rq_alloc.patch @@ -0,0 +1,80 @@ +From de9691cda68b320cf983fee4c632c60480eb376c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 29 Oct 2024 16:46:12 +0800 +Subject: virtio-net: fix overflow inside virtnet_rq_alloc + +From: Xuan Zhuo + +[ Upstream commit 6aacd1484468361d1d04badfe75f264fa5314864 ] + +When the frag just got a page, then may lead to regression on VM. +Specially if the sysctl net.core.high_order_alloc_disable value is 1, +then the frag always get a page when do refill. + +Which could see reliable crashes or scp failure (scp a file 100M in size +to VM). + +The issue is that the virtnet_rq_dma takes up 16 bytes at the beginning +of a new frag. When the frag size is larger than PAGE_SIZE, +everything is fine. However, if the frag is only one page and the +total size of the buffer and virtnet_rq_dma is larger than one page, an +overflow may occur. + +The commit f9dac92ba908 ("virtio_ring: enable premapped mode whatever +use_dma_api") introduced this problem. And we reverted some commits to +fix this in last linux version. Now we try to enable it and fix this +bug directly. + +Here, when the frag size is not enough, we reduce the buffer len to fix +this problem. + +Reported-by: "Si-Wei Liu" +Tested-by: Darren Kenny +Signed-off-by: Xuan Zhuo +Acked-by: Jason Wang +Signed-off-by: Paolo Abeni +Signed-off-by: Sasha Levin +--- + drivers/net/virtio_net.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c +index 426c05d5b1381..3bf394b24d971 100644 +--- a/drivers/net/virtio_net.c ++++ b/drivers/net/virtio_net.c +@@ -676,9 +676,6 @@ static void *virtnet_rq_alloc(struct receive_queue *rq, u32 size, gfp_t gfp) + void *buf, *head; + dma_addr_t addr; + +- if (unlikely(!skb_page_frag_refill(size, alloc_frag, gfp))) +- return NULL; +- + head = page_address(alloc_frag->page); + + if (rq->do_dma) { +@@ -1860,6 +1857,9 @@ static int add_recvbuf_small(struct virtnet_info *vi, struct receive_queue *rq, + len = SKB_DATA_ALIGN(len) + + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); + ++ if (unlikely(!skb_page_frag_refill(len, &rq->alloc_frag, gfp))) ++ return -ENOMEM; ++ + buf = virtnet_rq_alloc(rq, len, gfp); + if (unlikely(!buf)) + return -ENOMEM; +@@ -1962,6 +1962,12 @@ static int add_recvbuf_mergeable(struct virtnet_info *vi, + */ + len = get_mergeable_buf_len(rq, &rq->mrg_avg_pkt_len, room); + ++ if (unlikely(!skb_page_frag_refill(len + room, alloc_frag, gfp))) ++ return -ENOMEM; ++ ++ if (!alloc_frag->offset && len + room + sizeof(struct virtnet_rq_dma) > alloc_frag->size) ++ len -= sizeof(struct virtnet_rq_dma); ++ + buf = virtnet_rq_alloc(rq, len + room, gfp); + if (unlikely(!buf)) + return -ENOMEM; +-- +2.43.0 + diff --git a/queue-6.6/wifi-ath5k-add-pci-id-for-arcadyan-devices.patch b/queue-6.6/wifi-ath5k-add-pci-id-for-arcadyan-devices.patch new file mode 100644 index 00000000000..f3a06a2bb5c --- /dev/null +++ b/queue-6.6/wifi-ath5k-add-pci-id-for-arcadyan-devices.patch @@ -0,0 +1,34 @@ +From 3c38344f244354b4de92c014cfe5e7127c147db2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 30 Sep 2024 11:07:16 -0700 +Subject: wifi: ath5k: add PCI ID for Arcadyan devices + +From: Rosen Penev + +[ Upstream commit f3ced9bb90b0a287a1fa6184d16b0f104a78fa90 ] + +Arcadyan made routers with this PCI ID containing an AR2417. + +Signed-off-by: Rosen Penev +Link: https://patch.msgid.link/20240930180716.139894-3-rosenp@gmail.com +Signed-off-by: Jeff Johnson +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath5k/pci.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/net/wireless/ath/ath5k/pci.c b/drivers/net/wireless/ath/ath5k/pci.c +index 35a6a7b1047a3..f583e0f3932b8 100644 +--- a/drivers/net/wireless/ath/ath5k/pci.c ++++ b/drivers/net/wireless/ath/ath5k/pci.c +@@ -47,6 +47,7 @@ static const struct pci_device_id ath5k_pci_id_table[] = { + { PCI_VDEVICE(ATHEROS, 0x001c) }, /* PCI-E cards */ + { PCI_VDEVICE(ATHEROS, 0x001d) }, /* 2417 Nala */ + { PCI_VDEVICE(ATHEROS, 0xff16) }, /* Gigaset SX76[23] AR241[34]A */ ++ { PCI_VDEVICE(ATHEROS, 0xff1a) }, /* Arcadyan ARV45XX AR2417 */ + { PCI_VDEVICE(ATHEROS, 0xff1b) }, /* AR5BXB63 */ + { 0 } + }; +-- +2.43.0 + diff --git a/queue-6.6/wifi-ath5k-add-pci-id-for-sx76x.patch b/queue-6.6/wifi-ath5k-add-pci-id-for-sx76x.patch new file mode 100644 index 00000000000..c500c06b310 --- /dev/null +++ b/queue-6.6/wifi-ath5k-add-pci-id-for-sx76x.patch @@ -0,0 +1,34 @@ +From 2e5825e3ef28cf3e9e5b61a974d08e19a54aff5c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 30 Sep 2024 11:07:15 -0700 +Subject: wifi: ath5k: add PCI ID for SX76X + +From: Rosen Penev + +[ Upstream commit da0474012402d4729b98799d71a54c35dc5c5de3 ] + +This is in two devices made by Gigaset, SX762 and SX763. + +Signed-off-by: Rosen Penev +Link: https://patch.msgid.link/20240930180716.139894-2-rosenp@gmail.com +Signed-off-by: Jeff Johnson +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath5k/pci.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/net/wireless/ath/ath5k/pci.c b/drivers/net/wireless/ath/ath5k/pci.c +index 86b8cb975b1ac..35a6a7b1047a3 100644 +--- a/drivers/net/wireless/ath/ath5k/pci.c ++++ b/drivers/net/wireless/ath/ath5k/pci.c +@@ -46,6 +46,7 @@ static const struct pci_device_id ath5k_pci_id_table[] = { + { PCI_VDEVICE(ATHEROS, 0x001b) }, /* 5413 Eagle */ + { PCI_VDEVICE(ATHEROS, 0x001c) }, /* PCI-E cards */ + { PCI_VDEVICE(ATHEROS, 0x001d) }, /* 2417 Nala */ ++ { PCI_VDEVICE(ATHEROS, 0xff16) }, /* Gigaset SX76[23] AR241[34]A */ + { PCI_VDEVICE(ATHEROS, 0xff1b) }, /* AR5BXB63 */ + { 0 } + }; +-- +2.43.0 + diff --git a/queue-6.6/wifi-brcmfmac-fix-oops-due-to-null-pointer-dereferen.patch b/queue-6.6/wifi-brcmfmac-fix-oops-due-to-null-pointer-dereferen.patch new file mode 100644 index 00000000000..c9a14a29ab9 --- /dev/null +++ b/queue-6.6/wifi-brcmfmac-fix-oops-due-to-null-pointer-dereferen.patch @@ -0,0 +1,52 @@ +From d9c234771e809f5dfc72cd925305acf01b9a9d11 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Nov 2024 14:28:13 +0100 +Subject: wifi: brcmfmac: Fix oops due to NULL pointer dereference in + brcmf_sdiod_sglist_rw() + +From: Norbert van Bolhuis + +[ Upstream commit 857282b819cbaa0675aaab1e7542e2c0579f52d7 ] + +This patch fixes a NULL pointer dereference bug in brcmfmac that occurs +when a high 'sd_sgentry_align' value applies (e.g. 512) and a lot of queued SKBs +are sent from the pkt queue. + +The problem is the number of entries in the pre-allocated sgtable, it is +nents = max(rxglom_size, txglom_size) + max(rxglom_size, txglom_size) >> 4 + 1. +Given the default [rt]xglom_size=32 it's actually 35 which is too small. +Worst case, the pkt queue can end up with 64 SKBs. This occurs when a new SKB +is added for each original SKB if tailroom isn't enough to hold tail_pad. +At least one sg entry is needed for each SKB. So, eventually the "skb_queue_walk loop" +in brcmf_sdiod_sglist_rw may run out of sg entries. This makes sg_next return +NULL and this causes the oops. + +The patch sets nents to max(rxglom_size, txglom_size) * 2 to be able handle +the worst-case. +Btw. this requires only 64-35=29 * 16 (or 20 if CONFIG_NEED_SG_DMA_LENGTH) = 464 +additional bytes of memory. + +Signed-off-by: Norbert van Bolhuis +Signed-off-by: Kalle Valo +Link: https://patch.msgid.link/20241107132903.13513-1-nvbolhuis@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +index 00679a990e3da..7710367c319ec 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +@@ -770,7 +770,7 @@ void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev) + + nents = max_t(uint, BRCMF_DEFAULT_RXGLOM_SIZE, + sdiodev->settings->bus.sdio.txglomsz); +- nents += (nents >> 4) + 1; ++ nents *= 2; + + WARN_ON(nents > sdiodev->max_segment_count); + +-- +2.43.0 + diff --git a/queue-6.6/wifi-ipw2x00-libipw_rx_any-fix-bad-alignment.patch b/queue-6.6/wifi-ipw2x00-libipw_rx_any-fix-bad-alignment.patch new file mode 100644 index 00000000000..0150c8f9c3a --- /dev/null +++ b/queue-6.6/wifi-ipw2x00-libipw_rx_any-fix-bad-alignment.patch @@ -0,0 +1,53 @@ +From 946ac41a30c5d9b1799b05ecca249f57128e72ff Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Nov 2024 14:07:25 +0800 +Subject: wifi: ipw2x00: libipw_rx_any(): fix bad alignment + +From: Jiapeng Chong + +[ Upstream commit 4fa4f049dc0d9741b16c96bcbf0108c85368a2b9 ] + +This patch fixes incorrect code alignment. + +./drivers/net/wireless/intel/ipw2x00/libipw_rx.c:871:2-3: code aligned with following code on line 882. +./drivers/net/wireless/intel/ipw2x00/libipw_rx.c:886:2-3: code aligned with following code on line 900. + +Reported-by: Abaci Robot +Closes: https://bugzilla.openanolis.cn/show_bug.cgi?id=11381 +Signed-off-by: Jiapeng Chong +Signed-off-by: Kalle Valo +Link: https://patch.msgid.link/20241101060725.54640-1-jiapeng.chong@linux.alibaba.com +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/intel/ipw2x00/libipw_rx.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/wireless/intel/ipw2x00/libipw_rx.c b/drivers/net/wireless/intel/ipw2x00/libipw_rx.c +index 48d6870bbf4e2..9a97ab9b89ae8 100644 +--- a/drivers/net/wireless/intel/ipw2x00/libipw_rx.c ++++ b/drivers/net/wireless/intel/ipw2x00/libipw_rx.c +@@ -870,8 +870,8 @@ void libipw_rx_any(struct libipw_device *ieee, + switch (ieee->iw_mode) { + case IW_MODE_ADHOC: + /* our BSS and not from/to DS */ +- if (ether_addr_equal(hdr->addr3, ieee->bssid)) +- if ((fc & (IEEE80211_FCTL_TODS+IEEE80211_FCTL_FROMDS)) == 0) { ++ if (ether_addr_equal(hdr->addr3, ieee->bssid) && ++ ((fc & (IEEE80211_FCTL_TODS + IEEE80211_FCTL_FROMDS)) == 0)) { + /* promisc: get all */ + if (ieee->dev->flags & IFF_PROMISC) + is_packet_for_us = 1; +@@ -885,8 +885,8 @@ void libipw_rx_any(struct libipw_device *ieee, + break; + case IW_MODE_INFRA: + /* our BSS (== from our AP) and from DS */ +- if (ether_addr_equal(hdr->addr2, ieee->bssid)) +- if ((fc & (IEEE80211_FCTL_TODS+IEEE80211_FCTL_FROMDS)) == IEEE80211_FCTL_FROMDS) { ++ if (ether_addr_equal(hdr->addr2, ieee->bssid) && ++ ((fc & (IEEE80211_FCTL_TODS + IEEE80211_FCTL_FROMDS)) == IEEE80211_FCTL_FROMDS)) { + /* promisc: get all */ + if (ieee->dev->flags & IFF_PROMISC) + is_packet_for_us = 1; +-- +2.43.0 + diff --git a/queue-6.6/wifi-rtw89-check-return-value-of-ieee80211_probereq_.patch b/queue-6.6/wifi-rtw89-check-return-value-of-ieee80211_probereq_.patch new file mode 100644 index 00000000000..6fe543bda72 --- /dev/null +++ b/queue-6.6/wifi-rtw89-check-return-value-of-ieee80211_probereq_.patch @@ -0,0 +1,38 @@ +From 8d262094a051e9dabdc90549c97082ffc17ff3fe Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 19 Sep 2024 16:12:14 +0800 +Subject: wifi: rtw89: check return value of ieee80211_probereq_get() for RNR + +From: Ping-Ke Shih + +[ Upstream commit 630d5d8f2bf6b340202b6bc2c05d794bbd8e4c1c ] + +The return value of ieee80211_probereq_get() might be NULL, so check it +before using to avoid NULL pointer access. + +Addresses-Coverity-ID: 1529805 ("Dereference null return value") + +Signed-off-by: Ping-Ke Shih +Link: https://patch.msgid.link/20240919081216.28505-2-pkshih@realtek.com +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/realtek/rtw89/fw.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c +index 468cfa43ec049..a8e2efae6e526 100644 +--- a/drivers/net/wireless/realtek/rtw89/fw.c ++++ b/drivers/net/wireless/realtek/rtw89/fw.c +@@ -3662,6 +3662,9 @@ static int rtw89_update_6ghz_rnr_chan(struct rtw89_dev *rtwdev, + + skb = ieee80211_probereq_get(rtwdev->hw, rtwvif->mac_addr, + NULL, 0, req->ie_len); ++ if (!skb) ++ return -ENOMEM; ++ + skb_put_data(skb, ies->ies[NL80211_BAND_6GHZ], ies->len[NL80211_BAND_6GHZ]); + skb_put_data(skb, ies->common_ies, ies->common_ie_len); + hdr = (struct ieee80211_hdr *)skb->data; +-- +2.43.0 +