From: Sasha Levin Date: Mon, 26 Feb 2024 13:40:29 +0000 (-0500) Subject: Fixes for 5.15 X-Git-Tag: v4.19.308~41 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=71812808ce7601c00e58c3ef0c541230f556e843;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 5.15 Signed-off-by: Sasha Levin --- diff --git a/queue-5.15/acpi-button-add-lid-disable-dmi-quirk-for-nextbook-a.patch b/queue-5.15/acpi-button-add-lid-disable-dmi-quirk-for-nextbook-a.patch new file mode 100644 index 00000000000..8fb4b0c3949 --- /dev/null +++ b/queue-5.15/acpi-button-add-lid-disable-dmi-quirk-for-nextbook-a.patch @@ -0,0 +1,45 @@ +From e7792b394be53b8a74918ef11b26e411496322aa Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 29 Apr 2023 12:38:41 +0200 +Subject: ACPI: button: Add lid disable DMI quirk for Nextbook Ares 8A + +From: Hans de Goede + +[ Upstream commit 4fd5556608bfa9c2bf276fc115ef04288331aded ] + +The LID0 device on the Nextbook Ares 8A tablet always reports lid +closed causing userspace to suspend the device as soon as booting +is complete. + +Add a DMI quirk to disable the broken lid functionality. + +Signed-off-by: Hans de Goede +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/button.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c +index 1f9b9a4c38c7d..d8b1481141385 100644 +--- a/drivers/acpi/button.c ++++ b/drivers/acpi/button.c +@@ -77,6 +77,15 @@ static const struct dmi_system_id dmi_lid_quirks[] = { + }, + .driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_DISABLED, + }, ++ { ++ /* Nextbook Ares 8A tablet, _LID device always reports lid closed */ ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "CherryTrail"), ++ DMI_MATCH(DMI_BIOS_VERSION, "M882"), ++ }, ++ .driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_DISABLED, ++ }, + { + /* + * Lenovo Yoga 9 14ITL5, initial notification of the LID device +-- +2.43.0 + diff --git a/queue-5.15/acpi-property-let-args-be-null-in-__acpi_node_get_pr.patch b/queue-5.15/acpi-property-let-args-be-null-in-__acpi_node_get_pr.patch new file mode 100644 index 00000000000..fb351d42c86 --- /dev/null +++ b/queue-5.15/acpi-property-let-args-be-null-in-__acpi_node_get_pr.patch @@ -0,0 +1,52 @@ +From 51950d3be045230232c8de9170075b552cb3f166 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 Nov 2023 12:10:08 +0200 +Subject: acpi: property: Let args be NULL in + __acpi_node_get_property_reference + +From: Sakari Ailus + +[ Upstream commit bef52aa0f3de1b7d8c258c13b16e577361dabf3a ] + +fwnode_get_property_reference_args() may not be called with args argument +NULL on ACPI, OF already supports this. Add the missing NULL checks and +document this. + +The purpose is to be able to count the references. + +Fixes: 977d5ad39f3e ("ACPI: Convert ACPI reference args to generic fwnode reference args") +Signed-off-by: Sakari Ailus +Reviewed-by: Andy Shevchenko +Reviewed-by: Heikki Krogerus +Link: https://lore.kernel.org/r/20231109101010.1329587-2-sakari.ailus@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/acpi/property.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/acpi/property.c b/drivers/acpi/property.c +index 488915328646e..9ab7f7184343a 100644 +--- a/drivers/acpi/property.c ++++ b/drivers/acpi/property.c +@@ -639,6 +639,7 @@ acpi_fwnode_get_named_child_node(const struct fwnode_handle *fwnode, + * @index: Index of the reference to return + * @num_args: Maximum number of arguments after each reference + * @args: Location to store the returned reference with optional arguments ++ * (may be NULL) + * + * Find property with @name, verifify that it is a package containing at least + * one object reference and if so, store the ACPI device object pointer to the +@@ -697,6 +698,9 @@ int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode, + if (ret) + return ret == -ENODEV ? -EINVAL : ret; + ++ if (!args) ++ return 0; ++ + args->fwnode = acpi_fwnode_handle(device); + args->nargs = 0; + return 0; +-- +2.43.0 + diff --git a/queue-5.15/acpi-resource-add-asus-expertbook-b2502-to-asus-quir.patch b/queue-5.15/acpi-resource-add-asus-expertbook-b2502-to-asus-quir.patch new file mode 100644 index 00000000000..321e1cab8fa --- /dev/null +++ b/queue-5.15/acpi-resource-add-asus-expertbook-b2502-to-asus-quir.patch @@ -0,0 +1,47 @@ +From c8ab57122ea0741a54adb7ea1d86b60312a47b43 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 15 Dec 2022 10:44:43 +0100 +Subject: ACPI: resource: Add Asus ExpertBook B2502 to Asus quirks + +From: Hans de Goede + +[ Upstream commit 7203481fd12b1257938519efb2460ea02b9236ee ] + +The Asus ExpertBook B2502 has the same keyboard issue as Asus Vivobook +K3402ZA/K3502ZA. The kernel overrides IRQ 1 to Edge_High when it +should be Active_Low. + +This patch adds the ExpertBook B2502 model to the existing +quirk list of Asus laptops with this issue. + +Fixes: b5f9223a105d ("ACPI: resource: Skip IRQ override on Asus Vivobook S5602ZA") +Link: https://bugzilla.redhat.com/show_bug.cgi?id=2142574 +Signed-off-by: Hans de Goede +Signed-off-by: Rafael J. Wysocki +Stable-dep-of: 77c724888238 ("ACPI: resource: Skip IRQ override on Asus Expertbook B2402CBA") +Signed-off-by: Sasha Levin +--- + drivers/acpi/resource.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c +index 5f56839ed71df..a5d2a81902038 100644 +--- a/drivers/acpi/resource.c ++++ b/drivers/acpi/resource.c +@@ -435,6 +435,13 @@ static const struct dmi_system_id asus_laptop[] = { + DMI_MATCH(DMI_BOARD_NAME, "S5602ZA"), + }, + }, ++ { ++ .ident = "Asus ExpertBook B2502", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), ++ DMI_MATCH(DMI_BOARD_NAME, "B2502CBA"), ++ }, ++ }, + { } + }; + +-- +2.43.0 + diff --git a/queue-5.15/acpi-resource-add-asus-model-s5402za-to-quirks.patch b/queue-5.15/acpi-resource-add-asus-model-s5402za-to-quirks.patch new file mode 100644 index 00000000000..c7a2c5d8b98 --- /dev/null +++ b/queue-5.15/acpi-resource-add-asus-model-s5402za-to-quirks.patch @@ -0,0 +1,45 @@ +From a51d3846ddfc1d0a65432796f103b95cd002fc24 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 21 Sep 2022 10:24:22 -0700 +Subject: ACPI: resource: Add ASUS model S5402ZA to quirks + +From: Kellen Renshaw + +[ Upstream commit 6e5cbe7c4b41824e500acbb42411da692d1435f1 ] + +The Asus Vivobook S5402ZA has the same keyboard issue as Asus Vivobook +K3402ZA/K3502ZA. The kernel overrides IRQ 1 to Edge_High when it +should be Active_Low. + +This patch adds the S5402ZA model to the quirk list. + +Link: https://bugzilla.kernel.org/show_bug.cgi?id=216158 +Tested-by: Kellen Renshaw +Signed-off-by: Kellen Renshaw +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/resource.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c +index 91628fb41ef85..4d1db2def7ae4 100644 +--- a/drivers/acpi/resource.c ++++ b/drivers/acpi/resource.c +@@ -421,6 +421,13 @@ static const struct dmi_system_id asus_laptop[] = { + DMI_MATCH(DMI_BOARD_NAME, "K3502ZA"), + }, + }, ++ { ++ .ident = "Asus Vivobook S5402ZA", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), ++ DMI_MATCH(DMI_BOARD_NAME, "S5402ZA"), ++ }, ++ }, + { } + }; + +-- +2.43.0 + diff --git a/queue-5.15/acpi-resource-skip-irq-override-on-asus-expertbook-b.patch b/queue-5.15/acpi-resource-skip-irq-override-on-asus-expertbook-b.patch new file mode 100644 index 00000000000..a0d74ff6e9d --- /dev/null +++ b/queue-5.15/acpi-resource-skip-irq-override-on-asus-expertbook-b.patch @@ -0,0 +1,45 @@ +From 4e4aa29d71398eab15a3e17cb5166b1d8d5202b0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 30 Dec 2022 00:58:39 -0500 +Subject: ACPI: resource: Skip IRQ override on Asus Expertbook B2402CBA + +From: Tamim Khan + +[ Upstream commit 77c7248882385397cd7dffe9e1437f59f32ce2de ] + +Like the Asus Expertbook B2502CBA and various Asus Vivobook laptops, +the Asus Expertbook B2402CBA has an ACPI DSDT table that describes IRQ 1 +as ActiveLow while the kernel overrides it to Edge_High. This prevents the +keyboard from working. To fix this issue, add this laptop to the +skip_override_table so that the kernel does not override IRQ 1. + +Link: https://bugzilla.kernel.org/show_bug.cgi?id=216864 +Tested-by: zelenat +Signed-off-by: Tamim Khan +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/resource.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c +index a5d2a81902038..6c5873f552e5e 100644 +--- a/drivers/acpi/resource.c ++++ b/drivers/acpi/resource.c +@@ -435,6 +435,13 @@ static const struct dmi_system_id asus_laptop[] = { + DMI_MATCH(DMI_BOARD_NAME, "S5602ZA"), + }, + }, ++ { ++ .ident = "Asus ExpertBook B2402CBA", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), ++ DMI_MATCH(DMI_BOARD_NAME, "B2402CBA"), ++ }, ++ }, + { + .ident = "Asus ExpertBook B2502", + .matches = { +-- +2.43.0 + diff --git a/queue-5.15/acpi-resource-skip-irq-override-on-asus-expertbook-b.patch-25193 b/queue-5.15/acpi-resource-skip-irq-override-on-asus-expertbook-b.patch-25193 new file mode 100644 index 00000000000..4122c9f8623 --- /dev/null +++ b/queue-5.15/acpi-resource-skip-irq-override-on-asus-expertbook-b.patch-25193 @@ -0,0 +1,51 @@ +From 11506e553f88f6574027cf8c206370793da68643 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 11 Apr 2023 20:31:44 +0200 +Subject: ACPI: resource: Skip IRQ override on ASUS ExpertBook B1502CBA + +From: Paul Menzel + +[ Upstream commit 05cda427126f30ce3fc8ffd82fd6f5196398d502 ] + +Like the ASUS ExpertBook B2502CBA and various ASUS Vivobook laptops, the +ASUS ExpertBook B1502CBA has an ACPI DSDT table that describes IRQ 1 as +ActiveLow while the kernel overrides it to Edge_High. + + $ sudo dmesg | grep DMI + DMI: ASUSTeK COMPUTER INC. ASUS EXPERTBOOK B1502CBA_B1502CBA/B1502CBA, BIOS B1502CBA.300 01/18/2023 + $ grep -A 40 PS2K dsdt.dsl | grep IRQ -A 1 + IRQ (Level, ActiveLow, Exclusive, ) + {1} + +This prevents the keyboard from working. To fix this issue, add this laptop +to the skip_override_table so that the kernel does not override IRQ 1. + +Link: https://bugzilla.kernel.org/show_bug.cgi?id=217323 +Signed-off-by: Paul Menzel +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/resource.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c +index 6c5873f552e5e..a364cb07c5578 100644 +--- a/drivers/acpi/resource.c ++++ b/drivers/acpi/resource.c +@@ -435,6 +435,13 @@ static const struct dmi_system_id asus_laptop[] = { + DMI_MATCH(DMI_BOARD_NAME, "S5602ZA"), + }, + }, ++ { ++ .ident = "Asus ExpertBook B1502CBA", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), ++ DMI_MATCH(DMI_BOARD_NAME, "B1502CBA"), ++ }, ++ }, + { + .ident = "Asus ExpertBook B2402CBA", + .matches = { +-- +2.43.0 + diff --git a/queue-5.15/acpi-resource-skip-irq-override-on-asus-vivobook-s56.patch b/queue-5.15/acpi-resource-skip-irq-override-on-asus-vivobook-s56.patch new file mode 100644 index 00000000000..a0b0051e290 --- /dev/null +++ b/queue-5.15/acpi-resource-skip-irq-override-on-asus-vivobook-s56.patch @@ -0,0 +1,45 @@ +From 691f63e99e15f484939459d1b22fd4ebb81e6d17 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 14 Oct 2022 01:19:31 -0400 +Subject: ACPI: resource: Skip IRQ override on Asus Vivobook S5602ZA + +From: Tamim Khan + +[ Upstream commit b5f9223a105d9b56954ad1ca3eace4eaf26c99ed ] + +Like the Asus Vivobook K3402ZA/K3502ZA/S5402ZA Asus Vivobook S5602ZA +has an ACPI DSDT table the describes IRQ 1 as ActiveLow while the kernel +overrides it to Edge_High. This prevents the keyboard on this laptop +from working. To fix this add this laptop to the skip_override_table so +that the kernel does not override IRQ 1. + +Link: https://bugzilla.kernel.org/show_bug.cgi?id=216579 +Tested-by: Dzmitry +Signed-off-by: Tamim Khan +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/resource.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c +index 4d1db2def7ae4..5f56839ed71df 100644 +--- a/drivers/acpi/resource.c ++++ b/drivers/acpi/resource.c +@@ -428,6 +428,13 @@ static const struct dmi_system_id asus_laptop[] = { + DMI_MATCH(DMI_BOARD_NAME, "S5402ZA"), + }, + }, ++ { ++ .ident = "Asus Vivobook S5602ZA", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), ++ DMI_MATCH(DMI_BOARD_NAME, "S5602ZA"), ++ }, ++ }, + { } + }; + +-- +2.43.0 + diff --git a/queue-5.15/acpi-video-add-backlight-native-dmi-quirk-for-apple-.patch b/queue-5.15/acpi-video-add-backlight-native-dmi-quirk-for-apple-.patch new file mode 100644 index 00000000000..76cd385a8e0 --- /dev/null +++ b/queue-5.15/acpi-video-add-backlight-native-dmi-quirk-for-apple-.patch @@ -0,0 +1,44 @@ +From aaa8d427d2533d84c058631f53e7dbf0c622ce23 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 May 2023 11:23:58 +0200 +Subject: ACPI: video: Add backlight=native DMI quirk for Apple iMac11,3 + +From: Hans de Goede + +[ Upstream commit 48436f2e9834b46b47b038b605c8142a1c07bc85 ] + +Linux defaults to picking the non-working ACPI video backlight interface +on the Apple iMac11,3 . + +Add a DMI quirk to pick the working native radeon_bl0 interface instead. + +Signed-off-by: Hans de Goede +Signed-off-by: Rafael J. Wysocki +Stable-dep-of: bd5d93df86a7 ("ACPI: video: Add backlight=native DMI quirk for Lenovo ThinkPad X131e (3371 AMD version)") +Signed-off-by: Sasha Levin +--- + drivers/acpi/video_detect.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c +index 5afc42d52e49b..be923911e87c1 100644 +--- a/drivers/acpi/video_detect.c ++++ b/drivers/acpi/video_detect.c +@@ -341,6 +341,14 @@ static const struct dmi_system_id video_detect_dmi_table[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "82BK"), + }, + }, ++ { ++ .callback = video_detect_force_native, ++ /* Apple iMac11,3 */ ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), ++ DMI_MATCH(DMI_PRODUCT_NAME, "iMac11,3"), ++ }, ++ }, + { + /* https://bugzilla.redhat.com/show_bug.cgi?id=1217249 */ + .callback = video_detect_force_native, +-- +2.43.0 + diff --git a/queue-5.15/acpi-video-add-backlight-native-dmi-quirk-for-apple-.patch-17944 b/queue-5.15/acpi-video-add-backlight-native-dmi-quirk-for-apple-.patch-17944 new file mode 100644 index 00000000000..4c98e45f2f2 --- /dev/null +++ b/queue-5.15/acpi-video-add-backlight-native-dmi-quirk-for-apple-.patch-17944 @@ -0,0 +1,56 @@ +From 07e54ba1c4d2081f880954ac6fbc5c516a4801b5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 7 Aug 2023 11:44:08 +0200 +Subject: ACPI: video: Add backlight=native DMI quirk for Apple iMac12,1 and + iMac12,2 + +From: Hans de Goede + +[ Upstream commit 8cf04bb321f036dd2e523e993897e0789bd5265c ] + +Linux defaults to picking the non-working ACPI video backlight interface +on the Apple iMac12,1 and iMac12,2. + +Add a DMI quirk to pick the working native radeon_bl0 interface instead. + +Link: https://gitlab.freedesktop.org/drm/amd/-/issues/1838 +Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2753 +Signed-off-by: Hans de Goede +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/video_detect.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c +index 28e816be4753e..a5cb9e1d48bcc 100644 +--- a/drivers/acpi/video_detect.c ++++ b/drivers/acpi/video_detect.c +@@ -357,6 +357,24 @@ static const struct dmi_system_id video_detect_dmi_table[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "iMac11,3"), + }, + }, ++ { ++ /* https://gitlab.freedesktop.org/drm/amd/-/issues/1838 */ ++ .callback = video_detect_force_native, ++ /* Apple iMac12,1 */ ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), ++ DMI_MATCH(DMI_PRODUCT_NAME, "iMac12,1"), ++ }, ++ }, ++ { ++ /* https://gitlab.freedesktop.org/drm/amd/-/issues/2753 */ ++ .callback = video_detect_force_native, ++ /* Apple iMac12,2 */ ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), ++ DMI_MATCH(DMI_PRODUCT_NAME, "iMac12,2"), ++ }, ++ }, + { + /* https://bugzilla.redhat.com/show_bug.cgi?id=1217249 */ + .callback = video_detect_force_native, +-- +2.43.0 + diff --git a/queue-5.15/acpi-video-add-backlight-native-dmi-quirk-for-lenovo.patch b/queue-5.15/acpi-video-add-backlight-native-dmi-quirk-for-lenovo.patch new file mode 100644 index 00000000000..5c359688208 --- /dev/null +++ b/queue-5.15/acpi-video-add-backlight-native-dmi-quirk-for-lenovo.patch @@ -0,0 +1,44 @@ +From 0ab294e829cea44e5338f69157c7c6219ebd1b6f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 May 2023 11:23:59 +0200 +Subject: ACPI: video: Add backlight=native DMI quirk for Lenovo ThinkPad X131e + (3371 AMD version) + +From: Hans de Goede + +[ Upstream commit bd5d93df86a7ddf98a2a37e9c3751e3cb334a66c ] + +Linux defaults to picking the non-working ACPI video backlight interface +on the Lenovo ThinkPad X131e (3371 AMD version). + +Add a DMI quirk to pick the working native radeon_bl0 interface instead. + +Signed-off-by: Hans de Goede +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/video_detect.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c +index be923911e87c1..28e816be4753e 100644 +--- a/drivers/acpi/video_detect.c ++++ b/drivers/acpi/video_detect.c +@@ -341,6 +341,14 @@ static const struct dmi_system_id video_detect_dmi_table[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "82BK"), + }, + }, ++ { ++ .callback = video_detect_force_native, ++ /* Lenovo ThinkPad X131e (3371 AMD version) */ ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "3371"), ++ }, ++ }, + { + .callback = video_detect_force_native, + /* Apple iMac11,3 */ +-- +2.43.0 + diff --git a/queue-5.15/arm-dts-bcm53573-describe-on-soc-bcm53125-rev-4-swit.patch b/queue-5.15/arm-dts-bcm53573-describe-on-soc-bcm53125-rev-4-swit.patch new file mode 100644 index 00000000000..db6b8695542 --- /dev/null +++ b/queue-5.15/arm-dts-bcm53573-describe-on-soc-bcm53125-rev-4-swit.patch @@ -0,0 +1,54 @@ +From 57eed83d20d2a5d6f285334431e2b408b8b1f4e9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Sep 2021 16:10:23 +0200 +Subject: ARM: dts: BCM53573: Describe on-SoC BCM53125 rev 4 switch +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Rafał Miłecki + +[ Upstream commit 9fb90ae6cae7f8fe4fbf626945f32cd9da2c3892 ] + +BCM53573 family SoC have Ethernet switch connected to the first Ethernet +controller (accessible over MDIO). + +Signed-off-by: Rafał Miłecki +Signed-off-by: Florian Fainelli +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/bcm53573.dtsi | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/arch/arm/boot/dts/bcm53573.dtsi b/arch/arm/boot/dts/bcm53573.dtsi +index 85a23dc52423c..eed1a6147f0bf 100644 +--- a/arch/arm/boot/dts/bcm53573.dtsi ++++ b/arch/arm/boot/dts/bcm53573.dtsi +@@ -181,6 +181,24 @@ ohci_port2: port@2 { + + gmac0: ethernet@5000 { + reg = <0x5000 0x1000>; ++ ++ mdio { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ switch: switch@1e { ++ compatible = "brcm,bcm53125"; ++ reg = <0x1e>; ++ ++ status = "disabled"; ++ ++ /* ports are defined in board DTS */ ++ ports { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ }; ++ }; + }; + + gmac1: ethernet@b000 { +-- +2.43.0 + diff --git a/queue-5.15/arm-dts-bcm53573-drop-nonexistent-default-off-led-tr.patch b/queue-5.15/arm-dts-bcm53573-drop-nonexistent-default-off-led-tr.patch new file mode 100644 index 00000000000..cd006057204 --- /dev/null +++ b/queue-5.15/arm-dts-bcm53573-drop-nonexistent-default-off-led-tr.patch @@ -0,0 +1,68 @@ +From 67575443259c06492c64f54308b2460ec57d52d6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 7 Jul 2023 13:40:01 +0200 +Subject: ARM: dts: BCM53573: Drop nonexistent "default-off" LED trigger +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Rafał Miłecki + +[ Upstream commit be7e1e5b0f67c58ec4be0a54db23b6a4fa6e2116 ] + +There is no such trigger documented or implemented in Linux. It was a +copy & paste mistake. + +This fixes: +arch/arm/boot/dts/broadcom/bcm47189-luxul-xap-1440.dtb: leds: led-wlan:linux,default-trigger: 'oneOf' conditional failed, one must be fixed: + 'default-off' is not one of ['backlight', 'default-on', 'heartbeat', 'disk-activity', 'disk-read', 'disk-write', 'timer', 'pattern', 'audio-micmute', 'audio-mute', 'bluetooth-power', 'flash', 'kbd-capslock', 'mtd', 'nand-disk', 'none', 'torch', 'usb-gadget', 'usb-host', 'usbport'] + 'default-off' does not match '^cpu[0-9]*$' + 'default-off' does not match '^hci[0-9]+-power$' + 'default-off' does not match '^mmc[0-9]+$' + 'default-off' does not match '^phy[0-9]+tx$' + From schema: Documentation/devicetree/bindings/leds/leds-gpio.yaml + +Signed-off-by: Rafał Miłecki +Link: https://lore.kernel.org/r/20230707114004.2740-1-zajec5@gmail.com +Signed-off-by: Florian Fainelli +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/bcm47189-luxul-xap-1440.dts | 1 - + arch/arm/boot/dts/bcm47189-luxul-xap-810.dts | 2 -- + 2 files changed, 3 deletions(-) + +diff --git a/arch/arm/boot/dts/bcm47189-luxul-xap-1440.dts b/arch/arm/boot/dts/bcm47189-luxul-xap-1440.dts +index 00e688b45d981..5901160919dcd 100644 +--- a/arch/arm/boot/dts/bcm47189-luxul-xap-1440.dts ++++ b/arch/arm/boot/dts/bcm47189-luxul-xap-1440.dts +@@ -26,7 +26,6 @@ leds { + wlan { + label = "bcm53xx:blue:wlan"; + gpios = <&chipcommon 10 GPIO_ACTIVE_LOW>; +- linux,default-trigger = "default-off"; + }; + + system { +diff --git a/arch/arm/boot/dts/bcm47189-luxul-xap-810.dts b/arch/arm/boot/dts/bcm47189-luxul-xap-810.dts +index 78c80a5d3f4fa..8e7483272d47d 100644 +--- a/arch/arm/boot/dts/bcm47189-luxul-xap-810.dts ++++ b/arch/arm/boot/dts/bcm47189-luxul-xap-810.dts +@@ -26,7 +26,6 @@ leds { + 5ghz { + label = "bcm53xx:blue:5ghz"; + gpios = <&chipcommon 11 GPIO_ACTIVE_HIGH>; +- linux,default-trigger = "default-off"; + }; + + system { +@@ -42,7 +41,6 @@ pcie0_leds { + 2ghz { + label = "bcm53xx:blue:2ghz"; + gpios = <&pcie0_chipcommon 3 GPIO_ACTIVE_HIGH>; +- linux,default-trigger = "default-off"; + }; + }; + +-- +2.43.0 + diff --git a/queue-5.15/arm-dts-bcm53573-drop-nonexistent-usb-cells.patch b/queue-5.15/arm-dts-bcm53573-drop-nonexistent-usb-cells.patch new file mode 100644 index 00000000000..34383ffb7df --- /dev/null +++ b/queue-5.15/arm-dts-bcm53573-drop-nonexistent-usb-cells.patch @@ -0,0 +1,42 @@ +From 95ddc56513cce03992e8b7f5adb1c8f91394b606 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 7 Jul 2023 13:40:02 +0200 +Subject: ARM: dts: BCM53573: Drop nonexistent #usb-cells +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Rafał Miłecki + +[ Upstream commit 05d2c3d552b8c92fc397377d9d1112fc58e2cd59 ] + +Such property simply doesn't exist (is not documented or used anywhere). + +This fixes: +arch/arm/boot/dts/broadcom/bcm47189-luxul-xap-1440.dtb: usb@d000: Unevaluated properties are not allowed ('#usb-cells' was unexpected) + From schema: Documentation/devicetree/bindings/usb/generic-ohci.yaml + +Signed-off-by: Rafał Miłecki +Link: https://lore.kernel.org/r/20230707114004.2740-2-zajec5@gmail.com +Signed-off-by: Florian Fainelli +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/bcm53573.dtsi | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/arch/arm/boot/dts/bcm53573.dtsi b/arch/arm/boot/dts/bcm53573.dtsi +index 933b6a380c367..85a23dc52423c 100644 +--- a/arch/arm/boot/dts/bcm53573.dtsi ++++ b/arch/arm/boot/dts/bcm53573.dtsi +@@ -159,8 +159,6 @@ ehci_port2: port@2 { + }; + + ohci: usb@d000 { +- #usb-cells = <0>; +- + compatible = "generic-ohci"; + reg = <0xd000 0x1000>; + interrupt-parent = <&gic>; +-- +2.43.0 + diff --git a/queue-5.15/arm64-dts-rockchip-add-es8316-codec-for-rock-pi-4.patch b/queue-5.15/arm64-dts-rockchip-add-es8316-codec-for-rock-pi-4.patch new file mode 100644 index 00000000000..cb319393653 --- /dev/null +++ b/queue-5.15/arm64-dts-rockchip-add-es8316-codec-for-rock-pi-4.patch @@ -0,0 +1,77 @@ +From b56461e3326c044c6f84bffa6c08592e866673dd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 18 Jun 2021 20:12:55 +0200 +Subject: arm64: dts: rockchip: add ES8316 codec for ROCK Pi 4 + +From: Alex Bee + +[ Upstream commit 65bd2b8bdb3bddc37bea695789713916327e1c1f ] + +ROCK Pi 4 boards have the codec connected to i2s0 and it is accessible +via i2c1 address 0x11. +Add an audio-graph-card for it. + +Signed-off-by: Alex Bee +Link: https://lore.kernel.org/r/20210618181256.27992-5-knaerzche@gmail.com +Signed-off-by: Heiko Stuebner +Signed-off-by: Sasha Levin +--- + .../boot/dts/rockchip/rk3399-rock-pi-4.dtsi | 28 +++++++++++++++++++ + 1 file changed, 28 insertions(+) + +diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi +index 203460d46f182..0af694540c1eb 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi +@@ -36,6 +36,12 @@ sdio_pwrseq: sdio-pwrseq { + reset-gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_LOW>; + }; + ++ sound { ++ compatible = "audio-graph-card"; ++ label = "Analog"; ++ dais = <&i2s0_p0>; ++ }; ++ + vcc12v_dcin: dc-12v { + compatible = "regulator-fixed"; + regulator-name = "vcc12v_dcin"; +@@ -423,6 +429,20 @@ &i2c1 { + i2c-scl-rising-time-ns = <300>; + i2c-scl-falling-time-ns = <15>; + status = "okay"; ++ ++ es8316: codec@11 { ++ compatible = "everest,es8316"; ++ reg = <0x11>; ++ clocks = <&cru SCLK_I2S_8CH_OUT>; ++ clock-names = "mclk"; ++ #sound-dai-cells = <0>; ++ ++ port { ++ es8316_p0_0: endpoint { ++ remote-endpoint = <&i2s0_p0_0>; ++ }; ++ }; ++ }; + }; + + &i2c3 { +@@ -442,6 +462,14 @@ &i2s0 { + rockchip,capture-channels = <2>; + rockchip,playback-channels = <2>; + status = "okay"; ++ ++ i2s0_p0: port { ++ i2s0_p0_0: endpoint { ++ dai-format = "i2s"; ++ mclk-fs = <256>; ++ remote-endpoint = <&es8316_p0_0>; ++ }; ++ }; + }; + + &i2s1 { +-- +2.43.0 + diff --git a/queue-5.15/arm64-dts-rockchip-add-spdif-node-for-rock-pi-4.patch b/queue-5.15/arm64-dts-rockchip-add-spdif-node-for-rock-pi-4.patch new file mode 100644 index 00000000000..1f30c63f9e6 --- /dev/null +++ b/queue-5.15/arm64-dts-rockchip-add-spdif-node-for-rock-pi-4.patch @@ -0,0 +1,71 @@ +From de00fb997587dcfb4bbcfab25a14c03ae79cfb81 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 18 Jun 2021 20:12:56 +0200 +Subject: arm64: dts: rockchip: add SPDIF node for ROCK Pi 4 + +From: Alex Bee + +[ Upstream commit 697dd494cb1cf56acfb764214a1e4788e4d1a983 ] + +Add a SPDIF audio-graph-card to ROCK Pi 4 device tree. + +It's not enabled by default since all dma channels are used by +the (already) enabled i2s0/1/2 and the pin is muxed with GPIO4_C5 +which might be in use already. +If enabled SPDIF_TX will be available at pin #15. + +Signed-off-by: Alex Bee +Link: https://lore.kernel.org/r/20210618181256.27992-6-knaerzche@gmail.com +Signed-off-by: Heiko Stuebner +Signed-off-by: Sasha Levin +--- + .../boot/dts/rockchip/rk3399-rock-pi-4.dtsi | 26 +++++++++++++++++++ + 1 file changed, 26 insertions(+) + +diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi +index 0af694540c1eb..382bb0734cb74 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi +@@ -42,6 +42,23 @@ sound { + dais = <&i2s0_p0>; + }; + ++ sound-dit { ++ compatible = "audio-graph-card"; ++ label = "SPDIF"; ++ dais = <&spdif_p0>; ++ }; ++ ++ spdif-dit { ++ compatible = "linux,spdif-dit"; ++ #sound-dai-cells = <0>; ++ ++ port { ++ dit_p0_0: endpoint { ++ remote-endpoint = <&spdif_p0_0>; ++ }; ++ }; ++ }; ++ + vcc12v_dcin: dc-12v { + compatible = "regulator-fixed"; + regulator-name = "vcc12v_dcin"; +@@ -631,6 +648,15 @@ &sdhci { + status = "okay"; + }; + ++&spdif { ++ ++ spdif_p0: port { ++ spdif_p0_0: endpoint { ++ remote-endpoint = <&dit_p0_0>; ++ }; ++ }; ++}; ++ + &tcphy0 { + status = "okay"; + }; +-- +2.43.0 + diff --git a/queue-5.15/arm64-dts-rockchip-fix-regulator-name-on-rk3399-rock.patch b/queue-5.15/arm64-dts-rockchip-fix-regulator-name-on-rk3399-rock.patch new file mode 100644 index 00000000000..2e8caf055b1 --- /dev/null +++ b/queue-5.15/arm64-dts-rockchip-fix-regulator-name-on-rk3399-rock.patch @@ -0,0 +1,110 @@ +From eaa5bfb3ec3b5219917eeb3c0775fb588b43d920 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 9 Sep 2022 19:50:04 +0000 +Subject: arm64: dts: rockchip: fix regulator name on rk3399-rock-4 + +From: FUKAUMI Naoki + +[ Upstream commit 69448624b770aa88a71536a16900dd3cc6002919 ] + +fix regulator name + +ref: + https://dl.radxa.com/rockpi4/docs/hw/rockpi4/rockpi4_v13_sch_20181112.pdf + +Signed-off-by: FUKAUMI Naoki +Link: https://lore.kernel.org/r/20220909195006.127957-4-naoki@radxa.com +Signed-off-by: Heiko Stuebner +Signed-off-by: Sasha Levin +--- + .../boot/dts/rockchip/rk3399-rock-pi-4.dtsi | 25 ++++++++++--------- + 1 file changed, 13 insertions(+), 12 deletions(-) + +diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi +index 8b70e831aff23..203460d46f182 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi +@@ -98,24 +98,25 @@ vcc5v0_host: vcc5v0-host-regulator { + vin-supply = <&vcc5v0_sys>; + }; + +- vcc5v0_typec: vcc5v0-typec-regulator { ++ vbus_typec: vbus-typec-regulator { + compatible = "regulator-fixed"; + enable-active-high; + gpio = <&gpio1 RK_PA3 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&vcc5v0_typec_en>; +- regulator-name = "vcc5v0_typec"; ++ regulator-name = "vbus_typec"; + regulator-always-on; + vin-supply = <&vcc5v0_sys>; + }; + +- vcc_lan: vcc3v3-phy-regulator { ++ vcc3v3_lan: vcc3v3-lan-regulator { + compatible = "regulator-fixed"; +- regulator-name = "vcc_lan"; ++ regulator-name = "vcc3v3_lan"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; ++ vin-supply = <&vcc3v3_sys>; + }; + + vdd_log: vdd-log { +@@ -162,7 +163,7 @@ &gmac { + assigned-clocks = <&cru SCLK_RMII_SRC>; + assigned-clock-parents = <&clkin_gmac>; + clock_in_out = "input"; +- phy-supply = <&vcc_lan>; ++ phy-supply = <&vcc3v3_lan>; + phy-mode = "rgmii"; + pinctrl-names = "default"; + pinctrl-0 = <&rgmii_pins>; +@@ -267,8 +268,8 @@ regulator-state-mem { + }; + }; + +- vcc1v8_codec: LDO_REG1 { +- regulator-name = "vcc1v8_codec"; ++ vcca1v8_codec: LDO_REG1 { ++ regulator-name = "vcca1v8_codec"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; +@@ -278,8 +279,8 @@ regulator-state-mem { + }; + }; + +- vcc1v8_hdmi: LDO_REG2 { +- regulator-name = "vcc1v8_hdmi"; ++ vcca1v8_hdmi: LDO_REG2 { ++ regulator-name = "vcca1v8_hdmi"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; +@@ -336,8 +337,8 @@ regulator-state-mem { + }; + }; + +- vcc0v9_hdmi: LDO_REG7 { +- regulator-name = "vcc0v9_hdmi"; ++ vcca0v9_hdmi: LDO_REG7 { ++ regulator-name = "vcca0v9_hdmi"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <900000>; +@@ -456,7 +457,7 @@ &io_domains { + status = "okay"; + + bt656-supply = <&vcc_3v0>; +- audio-supply = <&vcc1v8_codec>; ++ audio-supply = <&vcca1v8_codec>; + sdmmc-supply = <&vcc_sdio>; + gpio1830-supply = <&vcc_3v0>; + }; +-- +2.43.0 + diff --git a/queue-5.15/arm64-mm-fix-va-range-sanity-check.patch b/queue-5.15/arm64-mm-fix-va-range-sanity-check.patch new file mode 100644 index 00000000000..f16671e5c21 --- /dev/null +++ b/queue-5.15/arm64-mm-fix-va-range-sanity-check.patch @@ -0,0 +1,106 @@ +From 568d6c374f85dac74a01a3d4725dd1aa153b88b8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 15 Jun 2023 11:26:28 +0100 +Subject: arm64: mm: fix VA-range sanity check + +From: Mark Rutland + +[ Upstream commit ab9b4008092c86dc12497af155a0901cc1156999 ] + +Both create_mapping_noalloc() and update_mapping_prot() sanity-check +their 'virt' parameter, but the check itself doesn't make much sense. +The condition used today appears to be a historical accident. + +The sanity-check condition: + + if ((virt >= PAGE_END) && (virt < VMALLOC_START)) { + [ ... warning here ... ] + return; + } + +... can only be true for the KASAN shadow region or the module region, +and there's no reason to exclude these specifically for creating and +updateing mappings. + +When arm64 support was first upstreamed in commit: + + c1cc1552616d0f35 ("arm64: MMU initialisation") + +... the condition was: + + if (virt < VMALLOC_START) { + [ ... warning here ... ] + return; + } + +At the time, VMALLOC_START was the lowest kernel address, and this was +checking whether 'virt' would be translated via TTBR1. + +Subsequently in commit: + + 14c127c957c1c607 ("arm64: mm: Flip kernel VA space") + +... the condition was changed to: + + if ((virt >= VA_START) && (virt < VMALLOC_START)) { + [ ... warning here ... ] + return; + } + +This appear to have been a thinko. The commit moved the linear map to +the bottom of the kernel address space, with VMALLOC_START being at the +halfway point. The old condition would warn for changes to the linear +map below this, and at the time VA_START was the end of the linear map. + +Subsequently we cleaned up the naming of VA_START in commit: + + 77ad4ce69321abbe ("arm64: memory: rename VA_START to PAGE_END") + +... keeping the erroneous condition as: + + if ((virt >= PAGE_END) && (virt < VMALLOC_START)) { + [ ... warning here ... ] + return; + } + +Correct the condition to check against the start of the TTBR1 address +space, which is currently PAGE_OFFSET. This simplifies the logic, and +more clearly matches the "outside kernel range" message in the warning. + +Signed-off-by: Mark Rutland +Cc: Russell King +Cc: Steve Capper +Cc: Will Deacon +Reviewed-by: Russell King (Oracle) +Link: https://lore.kernel.org/r/20230615102628.1052103-1-mark.rutland@arm.com +Signed-off-by: Catalin Marinas +Signed-off-by: Sasha Levin +--- + arch/arm64/mm/mmu.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c +index 6680689242df3..fc86e7465df42 100644 +--- a/arch/arm64/mm/mmu.c ++++ b/arch/arm64/mm/mmu.c +@@ -435,7 +435,7 @@ static phys_addr_t pgd_pgtable_alloc(int shift) + static void __init create_mapping_noalloc(phys_addr_t phys, unsigned long virt, + phys_addr_t size, pgprot_t prot) + { +- if ((virt >= PAGE_END) && (virt < VMALLOC_START)) { ++ if (virt < PAGE_OFFSET) { + pr_warn("BUG: not creating mapping for %pa at 0x%016lx - outside kernel range\n", + &phys, virt); + return; +@@ -462,7 +462,7 @@ void __init create_pgd_mapping(struct mm_struct *mm, phys_addr_t phys, + static void update_mapping_prot(phys_addr_t phys, unsigned long virt, + phys_addr_t size, pgprot_t prot) + { +- if ((virt >= PAGE_END) && (virt < VMALLOC_START)) { ++ if (virt < PAGE_OFFSET) { + pr_warn("BUG: not updating mapping for %pa at 0x%016lx - outside kernel range\n", + &phys, virt); + return; +-- +2.43.0 + diff --git a/queue-5.15/arm64-set-__exception_irq_entry-with-__irq_entry-as-.patch b/queue-5.15/arm64-set-__exception_irq_entry-with-__irq_entry-as-.patch new file mode 100644 index 00000000000..ded341f6066 --- /dev/null +++ b/queue-5.15/arm64-set-__exception_irq_entry-with-__irq_entry-as-.patch @@ -0,0 +1,166 @@ +From 6235d56c4d25176b8c30485192f44030bcc0a268 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 24 Apr 2023 10:04:36 +0900 +Subject: arm64: set __exception_irq_entry with __irq_entry as a default + +From: Youngmin Nam + +[ Upstream commit f6794950f0e5ba37e3bbedda4d6ab0aad7395dd3 ] + +filter_irq_stacks() is supposed to cut entries which are related irq entries +from its call stack. +And in_irqentry_text() which is called by filter_irq_stacks() +uses __irqentry_text_start/end symbol to find irq entries in callstack. + +But it doesn't work correctly as without "CONFIG_FUNCTION_GRAPH_TRACER", +arm64 kernel doesn't include gic_handle_irq which is entry point of arm64 irq +between __irqentry_text_start and __irqentry_text_end as we discussed in below link. +https://lore.kernel.org/all/CACT4Y+aReMGLYua2rCLHgFpS9io5cZC04Q8GLs-uNmrn1ezxYQ@mail.gmail.com/#t + +This problem can makes unintentional deep call stack entries especially +in KASAN enabled situation as below. + +[ 2479.383395]I[0:launcher-loader: 1719] Stack depot reached limit capacity +[ 2479.383538]I[0:launcher-loader: 1719] WARNING: CPU: 0 PID: 1719 at lib/stackdepot.c:129 __stack_depot_save+0x464/0x46c +[ 2479.385693]I[0:launcher-loader: 1719] pstate: 624000c5 (nZCv daIF +PAN -UAO +TCO -DIT -SSBS BTYPE=--) +[ 2479.385724]I[0:launcher-loader: 1719] pc : __stack_depot_save+0x464/0x46c +[ 2479.385751]I[0:launcher-loader: 1719] lr : __stack_depot_save+0x460/0x46c +[ 2479.385774]I[0:launcher-loader: 1719] sp : ffffffc0080073c0 +[ 2479.385793]I[0:launcher-loader: 1719] x29: ffffffc0080073e0 x28: ffffffd00b78a000 x27: 0000000000000000 +[ 2479.385839]I[0:launcher-loader: 1719] x26: 000000000004d1dd x25: ffffff891474f000 x24: 00000000ca64d1dd +[ 2479.385882]I[0:launcher-loader: 1719] x23: 0000000000000200 x22: 0000000000000220 x21: 0000000000000040 +[ 2479.385925]I[0:launcher-loader: 1719] x20: ffffffc008007440 x19: 0000000000000000 x18: 0000000000000000 +[ 2479.385969]I[0:launcher-loader: 1719] x17: 2065726568207475 x16: 000000000000005e x15: 2d2d2d2d2d2d2d20 +[ 2479.386013]I[0:launcher-loader: 1719] x14: 5d39313731203a72 x13: 00000000002f6b30 x12: 00000000002f6af8 +[ 2479.386057]I[0:launcher-loader: 1719] x11: 00000000ffffffff x10: ffffffb90aacf000 x9 : e8a74a6c16008800 +[ 2479.386101]I[0:launcher-loader: 1719] x8 : e8a74a6c16008800 x7 : 00000000002f6b30 x6 : 00000000002f6af8 +[ 2479.386145]I[0:launcher-loader: 1719] x5 : ffffffc0080070c8 x4 : ffffffd00b192380 x3 : ffffffd0092b313c +[ 2479.386189]I[0:launcher-loader: 1719] x2 : 0000000000000001 x1 : 0000000000000004 x0 : 0000000000000022 +[ 2479.386231]I[0:launcher-loader: 1719] Call trace: +[ 2479.386248]I[0:launcher-loader: 1719] __stack_depot_save+0x464/0x46c +[ 2479.386273]I[0:launcher-loader: 1719] kasan_save_stack+0x58/0x70 +[ 2479.386303]I[0:launcher-loader: 1719] save_stack_info+0x34/0x138 +[ 2479.386331]I[0:launcher-loader: 1719] kasan_save_free_info+0x18/0x24 +[ 2479.386358]I[0:launcher-loader: 1719] ____kasan_slab_free+0x16c/0x170 +[ 2479.386385]I[0:launcher-loader: 1719] __kasan_slab_free+0x10/0x20 +[ 2479.386410]I[0:launcher-loader: 1719] kmem_cache_free+0x238/0x53c +[ 2479.386435]I[0:launcher-loader: 1719] mempool_free_slab+0x1c/0x28 +[ 2479.386460]I[0:launcher-loader: 1719] mempool_free+0x7c/0x1a0 +[ 2479.386484]I[0:launcher-loader: 1719] bvec_free+0x34/0x80 +[ 2479.386514]I[0:launcher-loader: 1719] bio_free+0x60/0x98 +[ 2479.386540]I[0:launcher-loader: 1719] bio_put+0x50/0x21c +[ 2479.386567]I[0:launcher-loader: 1719] f2fs_write_end_io+0x4ac/0x4d0 +[ 2479.386594]I[0:launcher-loader: 1719] bio_endio+0x2dc/0x300 +[ 2479.386622]I[0:launcher-loader: 1719] __dm_io_complete+0x324/0x37c +[ 2479.386650]I[0:launcher-loader: 1719] dm_io_dec_pending+0x60/0xa4 +[ 2479.386676]I[0:launcher-loader: 1719] clone_endio+0xf8/0x2f0 +[ 2479.386700]I[0:launcher-loader: 1719] bio_endio+0x2dc/0x300 +[ 2479.386727]I[0:launcher-loader: 1719] blk_update_request+0x258/0x63c +[ 2479.386754]I[0:launcher-loader: 1719] scsi_end_request+0x50/0x304 +[ 2479.386782]I[0:launcher-loader: 1719] scsi_io_completion+0x88/0x160 +[ 2479.386808]I[0:launcher-loader: 1719] scsi_finish_command+0x17c/0x194 +[ 2479.386833]I[0:launcher-loader: 1719] scsi_complete+0xcc/0x158 +[ 2479.386859]I[0:launcher-loader: 1719] blk_mq_complete_request+0x4c/0x5c +[ 2479.386885]I[0:launcher-loader: 1719] scsi_done_internal+0xf4/0x1e0 +[ 2479.386910]I[0:launcher-loader: 1719] scsi_done+0x14/0x20 +[ 2479.386935]I[0:launcher-loader: 1719] ufshcd_compl_one_cqe+0x578/0x71c +[ 2479.386963]I[0:launcher-loader: 1719] ufshcd_mcq_poll_cqe_nolock+0xc8/0x150 +[ 2479.386991]I[0:launcher-loader: 1719] ufshcd_intr+0x868/0xc0c +[ 2479.387017]I[0:launcher-loader: 1719] __handle_irq_event_percpu+0xd0/0x348 +[ 2479.387044]I[0:launcher-loader: 1719] handle_irq_event_percpu+0x24/0x74 +[ 2479.387068]I[0:launcher-loader: 1719] handle_irq_event+0x74/0xe0 +[ 2479.387091]I[0:launcher-loader: 1719] handle_fasteoi_irq+0x174/0x240 +[ 2479.387118]I[0:launcher-loader: 1719] handle_irq_desc+0x7c/0x2c0 +[ 2479.387147]I[0:launcher-loader: 1719] generic_handle_domain_irq+0x1c/0x28 +[ 2479.387174]I[0:launcher-loader: 1719] gic_handle_irq+0x64/0x158 +[ 2479.387204]I[0:launcher-loader: 1719] call_on_irq_stack+0x2c/0x54 +[ 2479.387231]I[0:launcher-loader: 1719] do_interrupt_handler+0x70/0xa0 +[ 2479.387258]I[0:launcher-loader: 1719] el1_interrupt+0x34/0x68 +[ 2479.387283]I[0:launcher-loader: 1719] el1h_64_irq_handler+0x18/0x24 +[ 2479.387308]I[0:launcher-loader: 1719] el1h_64_irq+0x68/0x6c +[ 2479.387332]I[0:launcher-loader: 1719] blk_attempt_bio_merge+0x8/0x170 +[ 2479.387356]I[0:launcher-loader: 1719] blk_mq_attempt_bio_merge+0x78/0x98 +[ 2479.387383]I[0:launcher-loader: 1719] blk_mq_submit_bio+0x324/0xa40 +[ 2479.387409]I[0:launcher-loader: 1719] __submit_bio+0x104/0x138 +[ 2479.387436]I[0:launcher-loader: 1719] submit_bio_noacct_nocheck+0x1d0/0x4a0 +[ 2479.387462]I[0:launcher-loader: 1719] submit_bio_noacct+0x618/0x804 +[ 2479.387487]I[0:launcher-loader: 1719] submit_bio+0x164/0x180 +[ 2479.387511]I[0:launcher-loader: 1719] f2fs_submit_read_bio+0xe4/0x1c4 +[ 2479.387537]I[0:launcher-loader: 1719] f2fs_mpage_readpages+0x888/0xa4c +[ 2479.387563]I[0:launcher-loader: 1719] f2fs_readahead+0xd4/0x19c +[ 2479.387587]I[0:launcher-loader: 1719] read_pages+0xb0/0x4ac +[ 2479.387614]I[0:launcher-loader: 1719] page_cache_ra_unbounded+0x238/0x288 +[ 2479.387642]I[0:launcher-loader: 1719] do_page_cache_ra+0x60/0x6c +[ 2479.387669]I[0:launcher-loader: 1719] page_cache_ra_order+0x318/0x364 +[ 2479.387695]I[0:launcher-loader: 1719] ondemand_readahead+0x30c/0x3d8 +[ 2479.387722]I[0:launcher-loader: 1719] page_cache_sync_ra+0xb4/0xc8 +[ 2479.387749]I[0:launcher-loader: 1719] filemap_read+0x268/0xd24 +[ 2479.387777]I[0:launcher-loader: 1719] f2fs_file_read_iter+0x1a0/0x62c +[ 2479.387806]I[0:launcher-loader: 1719] vfs_read+0x258/0x34c +[ 2479.387831]I[0:launcher-loader: 1719] ksys_pread64+0x8c/0xd0 +[ 2479.387857]I[0:launcher-loader: 1719] __arm64_sys_pread64+0x48/0x54 +[ 2479.387881]I[0:launcher-loader: 1719] invoke_syscall+0x58/0x158 +[ 2479.387909]I[0:launcher-loader: 1719] el0_svc_common+0xf0/0x134 +[ 2479.387935]I[0:launcher-loader: 1719] do_el0_svc+0x44/0x114 +[ 2479.387961]I[0:launcher-loader: 1719] el0_svc+0x2c/0x80 +[ 2479.387985]I[0:launcher-loader: 1719] el0t_64_sync_handler+0x48/0x114 +[ 2479.388010]I[0:launcher-loader: 1719] el0t_64_sync+0x190/0x194 +[ 2479.388038]I[0:launcher-loader: 1719] Kernel panic - not syncing: kernel: panic_on_warn set ... + +So let's set __exception_irq_entry with __irq_entry as a default. +Applying this patch, we can see gic_hande_irq is included in Systemp.map as below. + +* Before +ffffffc008010000 T __do_softirq +ffffffc008010000 T __irqentry_text_end +ffffffc008010000 T __irqentry_text_start +ffffffc008010000 T __softirqentry_text_start +ffffffc008010000 T _stext +ffffffc00801066c T __softirqentry_text_end +ffffffc008010670 T __entry_text_start + +* After +ffffffc008010000 T __irqentry_text_start +ffffffc008010000 T _stext +ffffffc008010000 t gic_handle_irq +ffffffc00801013c t gic_handle_irq +ffffffc008010294 T __irqentry_text_end +ffffffc008010298 T __do_softirq +ffffffc008010298 T __softirqentry_text_start +ffffffc008010904 T __softirqentry_text_end +ffffffc008010908 T __entry_text_start + +Signed-off-by: Youngmin Nam +Signed-off-by: SEO HOYOUNG +Reviewed-by: Mark Rutland +Link: https://lore.kernel.org/r/20230424010436.779733-1-youngmin.nam@samsung.com +Signed-off-by: Catalin Marinas +Signed-off-by: Sasha Levin +--- + arch/arm64/include/asm/exception.h | 5 ----- + 1 file changed, 5 deletions(-) + +diff --git a/arch/arm64/include/asm/exception.h b/arch/arm64/include/asm/exception.h +index 515ebe24fd44f..fe4aa233a90ed 100644 +--- a/arch/arm64/include/asm/exception.h ++++ b/arch/arm64/include/asm/exception.h +@@ -8,16 +8,11 @@ + #define __ASM_EXCEPTION_H + + #include +-#include + #include + + #include + +-#ifdef CONFIG_FUNCTION_GRAPH_TRACER + #define __exception_irq_entry __irq_entry +-#else +-#define __exception_irq_entry __kprobes +-#endif + + static inline unsigned long disr_to_esr(u64 disr) + { +-- +2.43.0 + diff --git a/queue-5.15/bpf-address-kcsan-report-on-bpf_lru_list.patch b/queue-5.15/bpf-address-kcsan-report-on-bpf_lru_list.patch new file mode 100644 index 00000000000..2055a532b3f --- /dev/null +++ b/queue-5.15/bpf-address-kcsan-report-on-bpf_lru_list.patch @@ -0,0 +1,177 @@ +From ee4706eb6446339f077d4b8c9e9f0bfa0e561310 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 May 2023 21:37:48 -0700 +Subject: bpf: Address KCSAN report on bpf_lru_list + +From: Martin KaFai Lau + +[ Upstream commit ee9fd0ac3017c4313be91a220a9ac4c99dde7ad4 ] + +KCSAN reported a data-race when accessing node->ref. +Although node->ref does not have to be accurate, +take this chance to use a more common READ_ONCE() and WRITE_ONCE() +pattern instead of data_race(). + +There is an existing bpf_lru_node_is_ref() and bpf_lru_node_set_ref(). +This patch also adds bpf_lru_node_clear_ref() to do the +WRITE_ONCE(node->ref, 0) also. + +================================================================== +BUG: KCSAN: data-race in __bpf_lru_list_rotate / __htab_lru_percpu_map_update_elem + +write to 0xffff888137038deb of 1 bytes by task 11240 on cpu 1: +__bpf_lru_node_move kernel/bpf/bpf_lru_list.c:113 [inline] +__bpf_lru_list_rotate_active kernel/bpf/bpf_lru_list.c:149 [inline] +__bpf_lru_list_rotate+0x1bf/0x750 kernel/bpf/bpf_lru_list.c:240 +bpf_lru_list_pop_free_to_local kernel/bpf/bpf_lru_list.c:329 [inline] +bpf_common_lru_pop_free kernel/bpf/bpf_lru_list.c:447 [inline] +bpf_lru_pop_free+0x638/0xe20 kernel/bpf/bpf_lru_list.c:499 +prealloc_lru_pop kernel/bpf/hashtab.c:290 [inline] +__htab_lru_percpu_map_update_elem+0xe7/0x820 kernel/bpf/hashtab.c:1316 +bpf_percpu_hash_update+0x5e/0x90 kernel/bpf/hashtab.c:2313 +bpf_map_update_value+0x2a9/0x370 kernel/bpf/syscall.c:200 +generic_map_update_batch+0x3ae/0x4f0 kernel/bpf/syscall.c:1687 +bpf_map_do_batch+0x2d9/0x3d0 kernel/bpf/syscall.c:4534 +__sys_bpf+0x338/0x810 +__do_sys_bpf kernel/bpf/syscall.c:5096 [inline] +__se_sys_bpf kernel/bpf/syscall.c:5094 [inline] +__x64_sys_bpf+0x43/0x50 kernel/bpf/syscall.c:5094 +do_syscall_x64 arch/x86/entry/common.c:50 [inline] +do_syscall_64+0x41/0xc0 arch/x86/entry/common.c:80 +entry_SYSCALL_64_after_hwframe+0x63/0xcd + +read to 0xffff888137038deb of 1 bytes by task 11241 on cpu 0: +bpf_lru_node_set_ref kernel/bpf/bpf_lru_list.h:70 [inline] +__htab_lru_percpu_map_update_elem+0x2f1/0x820 kernel/bpf/hashtab.c:1332 +bpf_percpu_hash_update+0x5e/0x90 kernel/bpf/hashtab.c:2313 +bpf_map_update_value+0x2a9/0x370 kernel/bpf/syscall.c:200 +generic_map_update_batch+0x3ae/0x4f0 kernel/bpf/syscall.c:1687 +bpf_map_do_batch+0x2d9/0x3d0 kernel/bpf/syscall.c:4534 +__sys_bpf+0x338/0x810 +__do_sys_bpf kernel/bpf/syscall.c:5096 [inline] +__se_sys_bpf kernel/bpf/syscall.c:5094 [inline] +__x64_sys_bpf+0x43/0x50 kernel/bpf/syscall.c:5094 +do_syscall_x64 arch/x86/entry/common.c:50 [inline] +do_syscall_64+0x41/0xc0 arch/x86/entry/common.c:80 +entry_SYSCALL_64_after_hwframe+0x63/0xcd + +value changed: 0x01 -> 0x00 + +Reported by Kernel Concurrency Sanitizer on: +CPU: 0 PID: 11241 Comm: syz-executor.3 Not tainted 6.3.0-rc7-syzkaller-00136-g6a66fdd29ea1 #0 +Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/30/2023 +================================================================== + +Reported-by: syzbot+ebe648a84e8784763f82@syzkaller.appspotmail.com +Signed-off-by: Martin KaFai Lau +Acked-by: Yonghong Song +Link: https://lore.kernel.org/r/20230511043748.1384166-1-martin.lau@linux.dev +Signed-off-by: Alexei Starovoitov +Signed-off-by: Sasha Levin +--- + kernel/bpf/bpf_lru_list.c | 21 +++++++++++++-------- + kernel/bpf/bpf_lru_list.h | 7 ++----- + 2 files changed, 15 insertions(+), 13 deletions(-) + +diff --git a/kernel/bpf/bpf_lru_list.c b/kernel/bpf/bpf_lru_list.c +index d99e89f113c43..3dabdd137d102 100644 +--- a/kernel/bpf/bpf_lru_list.c ++++ b/kernel/bpf/bpf_lru_list.c +@@ -41,7 +41,12 @@ static struct list_head *local_pending_list(struct bpf_lru_locallist *loc_l) + /* bpf_lru_node helpers */ + static bool bpf_lru_node_is_ref(const struct bpf_lru_node *node) + { +- return node->ref; ++ return READ_ONCE(node->ref); ++} ++ ++static void bpf_lru_node_clear_ref(struct bpf_lru_node *node) ++{ ++ WRITE_ONCE(node->ref, 0); + } + + static void bpf_lru_list_count_inc(struct bpf_lru_list *l, +@@ -89,7 +94,7 @@ static void __bpf_lru_node_move_in(struct bpf_lru_list *l, + + bpf_lru_list_count_inc(l, tgt_type); + node->type = tgt_type; +- node->ref = 0; ++ bpf_lru_node_clear_ref(node); + list_move(&node->list, &l->lists[tgt_type]); + } + +@@ -110,7 +115,7 @@ static void __bpf_lru_node_move(struct bpf_lru_list *l, + bpf_lru_list_count_inc(l, tgt_type); + node->type = tgt_type; + } +- node->ref = 0; ++ bpf_lru_node_clear_ref(node); + + /* If the moving node is the next_inactive_rotation candidate, + * move the next_inactive_rotation pointer also. +@@ -353,7 +358,7 @@ static void __local_list_add_pending(struct bpf_lru *lru, + *(u32 *)((void *)node + lru->hash_offset) = hash; + node->cpu = cpu; + node->type = BPF_LRU_LOCAL_LIST_T_PENDING; +- node->ref = 0; ++ bpf_lru_node_clear_ref(node); + list_add(&node->list, local_pending_list(loc_l)); + } + +@@ -419,7 +424,7 @@ static struct bpf_lru_node *bpf_percpu_lru_pop_free(struct bpf_lru *lru, + if (!list_empty(free_list)) { + node = list_first_entry(free_list, struct bpf_lru_node, list); + *(u32 *)((void *)node + lru->hash_offset) = hash; +- node->ref = 0; ++ bpf_lru_node_clear_ref(node); + __bpf_lru_node_move(l, node, BPF_LRU_LIST_T_INACTIVE); + } + +@@ -522,7 +527,7 @@ static void bpf_common_lru_push_free(struct bpf_lru *lru, + } + + node->type = BPF_LRU_LOCAL_LIST_T_FREE; +- node->ref = 0; ++ bpf_lru_node_clear_ref(node); + list_move(&node->list, local_free_list(loc_l)); + + raw_spin_unlock_irqrestore(&loc_l->lock, flags); +@@ -568,7 +573,7 @@ static void bpf_common_lru_populate(struct bpf_lru *lru, void *buf, + + node = (struct bpf_lru_node *)(buf + node_offset); + node->type = BPF_LRU_LIST_T_FREE; +- node->ref = 0; ++ bpf_lru_node_clear_ref(node); + list_add(&node->list, &l->lists[BPF_LRU_LIST_T_FREE]); + buf += elem_size; + } +@@ -594,7 +599,7 @@ static void bpf_percpu_lru_populate(struct bpf_lru *lru, void *buf, + node = (struct bpf_lru_node *)(buf + node_offset); + node->cpu = cpu; + node->type = BPF_LRU_LIST_T_FREE; +- node->ref = 0; ++ bpf_lru_node_clear_ref(node); + list_add(&node->list, &l->lists[BPF_LRU_LIST_T_FREE]); + i++; + buf += elem_size; +diff --git a/kernel/bpf/bpf_lru_list.h b/kernel/bpf/bpf_lru_list.h +index 6b12f06ee18c3..9c12ee453c616 100644 +--- a/kernel/bpf/bpf_lru_list.h ++++ b/kernel/bpf/bpf_lru_list.h +@@ -63,11 +63,8 @@ struct bpf_lru { + + static inline void bpf_lru_node_set_ref(struct bpf_lru_node *node) + { +- /* ref is an approximation on access frequency. It does not +- * have to be very accurate. Hence, no protection is used. +- */ +- if (!node->ref) +- node->ref = 1; ++ if (!READ_ONCE(node->ref)) ++ WRITE_ONCE(node->ref, 1); + } + + int bpf_lru_init(struct bpf_lru *lru, bool percpu, u32 hash_offset, +-- +2.43.0 + diff --git a/queue-5.15/btrfs-add-xxhash-to-fast-checksum-implementations.patch b/queue-5.15/btrfs-add-xxhash-to-fast-checksum-implementations.patch new file mode 100644 index 00000000000..92d28c44959 --- /dev/null +++ b/queue-5.15/btrfs-add-xxhash-to-fast-checksum-implementations.patch @@ -0,0 +1,59 @@ +From 74bf049ba85604294577a84c7c9b65f8fd320b7e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 4 Apr 2023 00:06:02 +0200 +Subject: btrfs: add xxhash to fast checksum implementations + +From: David Sterba + +[ Upstream commit efcfcbc6a36195c42d98e0ee697baba36da94dc8 ] + +The implementation of XXHASH is now CPU only but still fast enough to be +considered for the synchronous checksumming, like non-generic crc32c. + +A userspace benchmark comparing it to various implementations (patched +hash-speedtest from btrfs-progs): + + Block size: 4096 + Iterations: 1000000 + Implementation: builtin + Units: CPU cycles + + NULL-NOP: cycles: 73384294, cycles/i 73 + NULL-MEMCPY: cycles: 228033868, cycles/i 228, 61664.320 MiB/s + CRC32C-ref: cycles: 24758559416, cycles/i 24758, 567.950 MiB/s + CRC32C-NI: cycles: 1194350470, cycles/i 1194, 11773.433 MiB/s + CRC32C-ADLERSW: cycles: 6150186216, cycles/i 6150, 2286.372 MiB/s + CRC32C-ADLERHW: cycles: 626979180, cycles/i 626, 22427.453 MiB/s + CRC32C-PCL: cycles: 466746732, cycles/i 466, 30126.699 MiB/s + XXHASH: cycles: 860656400, cycles/i 860, 16338.188 MiB/s + +Comparing purely software implementation (ref), current outdated +accelerated using crc32q instruction (NI), optimized implementations by +M. Adler (https://stackoverflow.com/questions/17645167/implementing-sse-4-2s-crc32c-in-software/17646775#17646775) +and the best one that was taken from kernel using the PCLMULQDQ +instruction (PCL). + +Reviewed-by: Christoph Hellwig +Signed-off-by: David Sterba +Signed-off-by: Sasha Levin +--- + fs/btrfs/disk-io.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c +index 9ae7c12668cda..c1dfde886b1e3 100644 +--- a/fs/btrfs/disk-io.c ++++ b/fs/btrfs/disk-io.c +@@ -2338,6 +2338,9 @@ static int btrfs_init_csum_hash(struct btrfs_fs_info *fs_info, u16 csum_type) + if (!strstr(crypto_shash_driver_name(csum_shash), "generic")) + set_bit(BTRFS_FS_CSUM_IMPL_FAST, &fs_info->flags); + break; ++ case BTRFS_CSUM_TYPE_XXHASH: ++ set_bit(BTRFS_FS_CSUM_IMPL_FAST, &fs_info->flags); ++ break; + default: + break; + } +-- +2.43.0 + diff --git a/queue-5.15/cifs-add-a-warning-when-the-in-flight-count-goes-neg.patch b/queue-5.15/cifs-add-a-warning-when-the-in-flight-count-goes-neg.patch new file mode 100644 index 00000000000..8945968cca2 --- /dev/null +++ b/queue-5.15/cifs-add-a-warning-when-the-in-flight-count-goes-neg.patch @@ -0,0 +1,38 @@ +From eaf067a66fa40cec64fd773d64319974da55e9eb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 9 Jun 2023 17:46:56 +0000 +Subject: cifs: add a warning when the in-flight count goes negative + +From: Shyam Prasad N + +[ Upstream commit e4645cc2f1e2d6f268bb8dcfac40997c52432aed ] + +We've seen the in-flight count go into negative with some +internal stress testing in Microsoft. + +Adding a WARN when this happens, in hope of understanding +why this happens when it happens. + +Signed-off-by: Shyam Prasad N +Reviewed-by: Bharath SM +Signed-off-by: Steve French +Signed-off-by: Sasha Levin +--- + fs/cifs/smb2ops.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c +index a8f33e8261344..b725bd3144fb7 100644 +--- a/fs/cifs/smb2ops.c ++++ b/fs/cifs/smb2ops.c +@@ -85,6 +85,7 @@ smb2_add_credits(struct TCP_Server_Info *server, + *val = 65000; /* Don't get near 64K credits, avoid srv bugs */ + pr_warn_once("server overflowed SMB3 credits\n"); + } ++ WARN_ON_ONCE(server->in_flight == 0); + server->in_flight--; + if (server->in_flight == 0 && + ((optype & CIFS_OP_MASK) != CIFS_NEG_OP) && +-- +2.43.0 + diff --git a/queue-5.15/cifs-remove-useless-parameter-is_fsctl-from-smb2_ioc.patch b/queue-5.15/cifs-remove-useless-parameter-is_fsctl-from-smb2_ioc.patch new file mode 100644 index 00000000000..02839bfd0bb --- /dev/null +++ b/queue-5.15/cifs-remove-useless-parameter-is_fsctl-from-smb2_ioc.patch @@ -0,0 +1,280 @@ +From fdb417ca74c7d56ce0820b65cfbb121a361c60df Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Aug 2022 16:08:34 -0300 +Subject: cifs: remove useless parameter 'is_fsctl' from SMB2_ioctl() + +From: Enzo Matsumiya + +[ Upstream commit 400d0ad63b190895e29f43bc75b1260111d3fd34 ] + +SMB2_ioctl() is always called with is_fsctl = true, so doesn't make any +sense to have it at all. + +Thus, always set SMB2_0_IOCTL_IS_FSCTL flag on the request. + +Also, as per MS-SMB2 3.3.5.15 "Receiving an SMB2 IOCTL Request", servers +must fail the request if the request flags is zero anyway. + +Signed-off-by: Enzo Matsumiya +Reviewed-by: Tom Talpey +Signed-off-by: Steve French +Signed-off-by: Sasha Levin +--- + fs/cifs/smb2file.c | 1 - + fs/cifs/smb2ops.c | 35 +++++++++++++---------------------- + fs/cifs/smb2pdu.c | 20 +++++++++----------- + fs/cifs/smb2proto.h | 4 ++-- + 4 files changed, 24 insertions(+), 36 deletions(-) + +diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c +index f5dcc4940b6da..9dfd2dd612c25 100644 +--- a/fs/cifs/smb2file.c ++++ b/fs/cifs/smb2file.c +@@ -61,7 +61,6 @@ smb2_open_file(const unsigned int xid, struct cifs_open_parms *oparms, + nr_ioctl_req.Reserved = 0; + rc = SMB2_ioctl(xid, oparms->tcon, fid->persistent_fid, + fid->volatile_fid, FSCTL_LMR_REQUEST_RESILIENCY, +- true /* is_fsctl */, + (char *)&nr_ioctl_req, sizeof(nr_ioctl_req), + CIFSMaxBufSize, NULL, NULL /* no return info */); + if (rc == -EOPNOTSUPP) { +diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c +index 6f09e889e74d7..a8f33e8261344 100644 +--- a/fs/cifs/smb2ops.c ++++ b/fs/cifs/smb2ops.c +@@ -647,7 +647,7 @@ SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon) + struct cifs_ses *ses = tcon->ses; + + rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID, +- FSCTL_QUERY_NETWORK_INTERFACE_INFO, true /* is_fsctl */, ++ FSCTL_QUERY_NETWORK_INTERFACE_INFO, + NULL /* no data input */, 0 /* no data input */, + CIFSMaxBufSize, (char **)&out_buf, &ret_data_len); + if (rc == -EOPNOTSUPP) { +@@ -1582,9 +1582,8 @@ SMB2_request_res_key(const unsigned int xid, struct cifs_tcon *tcon, + struct resume_key_req *res_key; + + rc = SMB2_ioctl(xid, tcon, persistent_fid, volatile_fid, +- FSCTL_SRV_REQUEST_RESUME_KEY, true /* is_fsctl */, +- NULL, 0 /* no input */, CIFSMaxBufSize, +- (char **)&res_key, &ret_data_len); ++ FSCTL_SRV_REQUEST_RESUME_KEY, NULL, 0 /* no input */, ++ CIFSMaxBufSize, (char **)&res_key, &ret_data_len); + + if (rc == -EOPNOTSUPP) { + pr_warn_once("Server share %s does not support copy range\n", tcon->treeName); +@@ -1726,7 +1725,7 @@ smb2_ioctl_query_info(const unsigned int xid, + rqst[1].rq_nvec = SMB2_IOCTL_IOV_SIZE; + + rc = SMB2_ioctl_init(tcon, server, &rqst[1], COMPOUND_FID, COMPOUND_FID, +- qi.info_type, true, buffer, qi.output_buffer_length, ++ qi.info_type, buffer, qi.output_buffer_length, + CIFSMaxBufSize - MAX_SMB2_CREATE_RESPONSE_SIZE - + MAX_SMB2_CLOSE_RESPONSE_SIZE); + free_req1_func = SMB2_ioctl_free; +@@ -1902,9 +1901,8 @@ smb2_copychunk_range(const unsigned int xid, + retbuf = NULL; + rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid, + trgtfile->fid.volatile_fid, FSCTL_SRV_COPYCHUNK_WRITE, +- true /* is_fsctl */, (char *)pcchunk, +- sizeof(struct copychunk_ioctl), CIFSMaxBufSize, +- (char **)&retbuf, &ret_data_len); ++ (char *)pcchunk, sizeof(struct copychunk_ioctl), ++ CIFSMaxBufSize, (char **)&retbuf, &ret_data_len); + if (rc == 0) { + if (ret_data_len != + sizeof(struct copychunk_ioctl_rsp)) { +@@ -2064,7 +2062,6 @@ static bool smb2_set_sparse(const unsigned int xid, struct cifs_tcon *tcon, + + rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, + cfile->fid.volatile_fid, FSCTL_SET_SPARSE, +- true /* is_fctl */, + &setsparse, 1, CIFSMaxBufSize, NULL, NULL); + if (rc) { + tcon->broken_sparse_sup = true; +@@ -2147,7 +2144,6 @@ smb2_duplicate_extents(const unsigned int xid, + rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid, + trgtfile->fid.volatile_fid, + FSCTL_DUPLICATE_EXTENTS_TO_FILE, +- true /* is_fsctl */, + (char *)&dup_ext_buf, + sizeof(struct duplicate_extents_to_file), + CIFSMaxBufSize, NULL, +@@ -2182,7 +2178,6 @@ smb3_set_integrity(const unsigned int xid, struct cifs_tcon *tcon, + return SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, + cfile->fid.volatile_fid, + FSCTL_SET_INTEGRITY_INFORMATION, +- true /* is_fsctl */, + (char *)&integr_info, + sizeof(struct fsctl_set_integrity_information_req), + CIFSMaxBufSize, NULL, +@@ -2235,7 +2230,6 @@ smb3_enum_snapshots(const unsigned int xid, struct cifs_tcon *tcon, + rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, + cfile->fid.volatile_fid, + FSCTL_SRV_ENUMERATE_SNAPSHOTS, +- true /* is_fsctl */, + NULL, 0 /* no input data */, max_response_size, + (char **)&retbuf, + &ret_data_len); +@@ -2920,7 +2914,6 @@ smb2_get_dfs_refer(const unsigned int xid, struct cifs_ses *ses, + do { + rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID, + FSCTL_DFS_GET_REFERRALS, +- true /* is_fsctl */, + (char *)dfs_req, dfs_req_size, CIFSMaxBufSize, + (char **)&dfs_rsp, &dfs_rsp_size); + if (!is_retryable_error(rc)) +@@ -3129,8 +3122,7 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon, + + rc = SMB2_ioctl_init(tcon, server, + &rqst[1], fid.persistent_fid, +- fid.volatile_fid, FSCTL_GET_REPARSE_POINT, +- true /* is_fctl */, NULL, 0, ++ fid.volatile_fid, FSCTL_GET_REPARSE_POINT, NULL, 0, + CIFSMaxBufSize - + MAX_SMB2_CREATE_RESPONSE_SIZE - + MAX_SMB2_CLOSE_RESPONSE_SIZE); +@@ -3310,8 +3302,7 @@ smb2_query_reparse_tag(const unsigned int xid, struct cifs_tcon *tcon, + + rc = SMB2_ioctl_init(tcon, server, + &rqst[1], COMPOUND_FID, +- COMPOUND_FID, FSCTL_GET_REPARSE_POINT, +- true /* is_fctl */, NULL, 0, ++ COMPOUND_FID, FSCTL_GET_REPARSE_POINT, NULL, 0, + CIFSMaxBufSize - + MAX_SMB2_CREATE_RESPONSE_SIZE - + MAX_SMB2_CLOSE_RESPONSE_SIZE); +@@ -3587,7 +3578,7 @@ static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon, + fsctl_buf.BeyondFinalZero = cpu_to_le64(offset + len); + + rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, +- cfile->fid.volatile_fid, FSCTL_SET_ZERO_DATA, true, ++ cfile->fid.volatile_fid, FSCTL_SET_ZERO_DATA, + (char *)&fsctl_buf, + sizeof(struct file_zero_data_information), + 0, NULL, NULL); +@@ -3648,7 +3639,7 @@ static long smb3_punch_hole(struct file *file, struct cifs_tcon *tcon, + + rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, + cfile->fid.volatile_fid, FSCTL_SET_ZERO_DATA, +- true /* is_fctl */, (char *)&fsctl_buf, ++ (char *)&fsctl_buf, + sizeof(struct file_zero_data_information), + CIFSMaxBufSize, NULL, NULL); + filemap_invalidate_unlock(inode->i_mapping); +@@ -3710,7 +3701,7 @@ static int smb3_simple_fallocate_range(unsigned int xid, + in_data.length = cpu_to_le64(len); + rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, + cfile->fid.volatile_fid, +- FSCTL_QUERY_ALLOCATED_RANGES, true, ++ FSCTL_QUERY_ALLOCATED_RANGES, + (char *)&in_data, sizeof(in_data), + 1024 * sizeof(struct file_allocated_range_buffer), + (char **)&out_data, &out_data_len); +@@ -4022,7 +4013,7 @@ static loff_t smb3_llseek(struct file *file, struct cifs_tcon *tcon, loff_t offs + + rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, + cfile->fid.volatile_fid, +- FSCTL_QUERY_ALLOCATED_RANGES, true, ++ FSCTL_QUERY_ALLOCATED_RANGES, + (char *)&in_data, sizeof(in_data), + sizeof(struct file_allocated_range_buffer), + (char **)&out_data, &out_data_len); +@@ -4082,7 +4073,7 @@ static int smb3_fiemap(struct cifs_tcon *tcon, + + rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, + cfile->fid.volatile_fid, +- FSCTL_QUERY_ALLOCATED_RANGES, true, ++ FSCTL_QUERY_ALLOCATED_RANGES, + (char *)&in_data, sizeof(in_data), + 1024 * sizeof(struct file_allocated_range_buffer), + (char **)&out_data, &out_data_len); +diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c +index b2b35edd6a310..61b18f802048f 100644 +--- a/fs/cifs/smb2pdu.c ++++ b/fs/cifs/smb2pdu.c +@@ -1152,7 +1152,7 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon) + } + + rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID, +- FSCTL_VALIDATE_NEGOTIATE_INFO, true /* is_fsctl */, ++ FSCTL_VALIDATE_NEGOTIATE_INFO, + (char *)pneg_inbuf, inbuflen, CIFSMaxBufSize, + (char **)&pneg_rsp, &rsplen); + if (rc == -EOPNOTSUPP) { +@@ -3013,7 +3013,7 @@ int + SMB2_ioctl_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, + struct smb_rqst *rqst, + u64 persistent_fid, u64 volatile_fid, u32 opcode, +- bool is_fsctl, char *in_data, u32 indatalen, ++ char *in_data, u32 indatalen, + __u32 max_response_size) + { + struct smb2_ioctl_req *req; +@@ -3088,10 +3088,8 @@ SMB2_ioctl_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, + req->sync_hdr.CreditCharge = + cpu_to_le16(DIV_ROUND_UP(max(indatalen, max_response_size), + SMB2_MAX_BUFFER_SIZE)); +- if (is_fsctl) +- req->Flags = cpu_to_le32(SMB2_0_IOCTL_IS_FSCTL); +- else +- req->Flags = 0; ++ /* always an FSCTL (for now) */ ++ req->Flags = cpu_to_le32(SMB2_0_IOCTL_IS_FSCTL); + + /* validate negotiate request must be signed - see MS-SMB2 3.2.5.5 */ + if (opcode == FSCTL_VALIDATE_NEGOTIATE_INFO) +@@ -3118,9 +3116,9 @@ SMB2_ioctl_free(struct smb_rqst *rqst) + */ + int + SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, +- u64 volatile_fid, u32 opcode, bool is_fsctl, +- char *in_data, u32 indatalen, u32 max_out_data_len, +- char **out_data, u32 *plen /* returned data len */) ++ u64 volatile_fid, u32 opcode, char *in_data, u32 indatalen, ++ u32 max_out_data_len, char **out_data, ++ u32 *plen /* returned data len */) + { + struct smb_rqst rqst; + struct smb2_ioctl_rsp *rsp = NULL; +@@ -3162,7 +3160,7 @@ SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, + + rc = SMB2_ioctl_init(tcon, server, + &rqst, persistent_fid, volatile_fid, opcode, +- is_fsctl, in_data, indatalen, max_out_data_len); ++ in_data, indatalen, max_out_data_len); + if (rc) + goto ioctl_exit; + +@@ -3244,7 +3242,7 @@ SMB2_set_compression(const unsigned int xid, struct cifs_tcon *tcon, + cpu_to_le16(COMPRESSION_FORMAT_DEFAULT); + + rc = SMB2_ioctl(xid, tcon, persistent_fid, volatile_fid, +- FSCTL_SET_COMPRESSION, true /* is_fsctl */, ++ FSCTL_SET_COMPRESSION, + (char *)&fsctl_input /* data input */, + 2 /* in data len */, CIFSMaxBufSize /* max out data */, + &ret_data /* out data */, NULL); +diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h +index 6c5a4d44b248a..ada1d7338f34f 100644 +--- a/fs/cifs/smb2proto.h ++++ b/fs/cifs/smb2proto.h +@@ -144,13 +144,13 @@ extern int SMB2_open_init(struct cifs_tcon *tcon, + extern void SMB2_open_free(struct smb_rqst *rqst); + extern int SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, + u64 persistent_fid, u64 volatile_fid, u32 opcode, +- bool is_fsctl, char *in_data, u32 indatalen, u32 maxoutlen, ++ char *in_data, u32 indatalen, u32 maxoutlen, + char **out_data, u32 *plen /* returned data len */); + extern int SMB2_ioctl_init(struct cifs_tcon *tcon, + struct TCP_Server_Info *server, + struct smb_rqst *rqst, + u64 persistent_fid, u64 volatile_fid, u32 opcode, +- bool is_fsctl, char *in_data, u32 indatalen, ++ char *in_data, u32 indatalen, + __u32 max_response_size); + extern void SMB2_ioctl_free(struct smb_rqst *rqst); + extern int SMB2_change_notify(const unsigned int xid, struct cifs_tcon *tcon, +-- +2.43.0 + diff --git a/queue-5.15/clk-honor-clk_ops_parent_enable-in-clk_core_is_enabl.patch b/queue-5.15/clk-honor-clk_ops_parent_enable-in-clk_core_is_enabl.patch new file mode 100644 index 00000000000..be48bb18166 --- /dev/null +++ b/queue-5.15/clk-honor-clk_ops_parent_enable-in-clk_core_is_enabl.patch @@ -0,0 +1,68 @@ +From 0b2e3ce432bc6dd1ea0f08bc1f939452a3e29623 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 3 Jan 2023 17:23:30 +0800 +Subject: clk: Honor CLK_OPS_PARENT_ENABLE in clk_core_is_enabled() + +From: Chen-Yu Tsai + +[ Upstream commit 79200d5851c8e7179f68a4a6f162d8f1bde4986f ] + +In the previous commits that added CLK_OPS_PARENT_ENABLE, support for +this flag was only added to rate change operations (rate setting and +reparent) and disabling unused subtree. It was not added to the +clock gate related operations. Any hardware driver that needs it for +these operations will either see bogus results, or worse, hang. + +This has been seen on MT8192 and MT8195, where the imp_ii2_* clk +drivers set this, but dumping debugfs clk_summary would cause it +to hang. + +Prepare parent on prepare and enable parent on enable dependencies are +already handled automatically by the core as part of its sequencing. +Whether the case for "enable parent on prepare" should be supported by +this flag or not is not clear, and thus ignored for now. + +This change solely fixes the handling of clk_core_is_enabled, i.e. +enabling the parent clock when reading the hardware state. Unfortunately +clk_core_is_enabled is called in a variety of places, sometimes with +the enable clock already held. To avoid deadlocking, the core will +ignore readouts and just return false if CLK_OPS_PARENT_ENABLE is set +but the parent isn't currently enabled. + +Fixes: fc8726a2c021 ("clk: core: support clocks which requires parents enable (part 2)") +Fixes: a4b3518d146f ("clk: core: support clocks which requires parents enable (part 1)") +Signed-off-by: Chen-Yu Tsai +Link: https://lore.kernel.org/r/20230103092330.494102-1-wenst@chromium.org +Tested-by: AngeloGioacchino Del Regno +Reviewed-by: AngeloGioacchino Del Regno +Signed-off-by: Stephen Boyd +Signed-off-by: Sasha Levin +--- + drivers/clk/clk.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c +index b37af6b27e9c6..bf9057a8fbf06 100644 +--- a/drivers/clk/clk.c ++++ b/drivers/clk/clk.c +@@ -251,6 +251,17 @@ static bool clk_core_is_enabled(struct clk_core *core) + } + } + ++ /* ++ * This could be called with the enable lock held, or from atomic ++ * context. If the parent isn't enabled already, we can't do ++ * anything here. We can also assume this clock isn't enabled. ++ */ ++ if ((core->flags & CLK_OPS_PARENT_ENABLE) && core->parent) ++ if (!clk_core_is_enabled(core->parent)) { ++ ret = false; ++ goto done; ++ } ++ + ret = core->ops->is_enabled(core->hw); + done: + if (core->rpm_enabled) +-- +2.43.0 + diff --git a/queue-5.15/clk-imx-avoid-memory-leak.patch b/queue-5.15/clk-imx-avoid-memory-leak.patch new file mode 100644 index 00000000000..7ec1d02e138 --- /dev/null +++ b/queue-5.15/clk-imx-avoid-memory-leak.patch @@ -0,0 +1,41 @@ +From bffc8d3a43222b3e798d5c141af5e077436f54f8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 4 Jan 2023 19:00:29 +0800 +Subject: clk: imx: avoid memory leak + +From: Peng Fan + +[ Upstream commit f4419db4086e8c31821da14140e81498516a3c75 ] + +In case imx_register_uart_clocks return early, the imx_uart_clocks +memory will be no freed. So execute kfree always to avoid memory leak. + +Fixes: 379c9a24cc23 ("clk: imx: Fix reparenting of UARTs not associated with stdout") +Signed-off-by: Peng Fan +Reviewed-by: Abel Vesa +Signed-off-by: Abel Vesa +Link: https://lore.kernel.org/r/20230104110032.1220721-2-peng.fan@oss.nxp.com +Signed-off-by: Sasha Levin +--- + drivers/clk/imx/clk.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/clk/imx/clk.c b/drivers/clk/imx/clk.c +index 7cc669934253a..d4cf0c7045ab2 100644 +--- a/drivers/clk/imx/clk.c ++++ b/drivers/clk/imx/clk.c +@@ -201,9 +201,10 @@ static int __init imx_clk_disable_uart(void) + clk_disable_unprepare(imx_uart_clocks[i]); + clk_put(imx_uart_clocks[i]); + } +- kfree(imx_uart_clocks); + } + ++ kfree(imx_uart_clocks); ++ + return 0; + } + late_initcall_sync(imx_clk_disable_uart); +-- +2.43.0 + diff --git a/queue-5.15/clk-imx-imx8mp-add-shared-clk-gate-for-usb-suspend-c.patch b/queue-5.15/clk-imx-imx8mp-add-shared-clk-gate-for-usb-suspend-c.patch new file mode 100644 index 00000000000..d8f28a624bf --- /dev/null +++ b/queue-5.15/clk-imx-imx8mp-add-shared-clk-gate-for-usb-suspend-c.patch @@ -0,0 +1,57 @@ +From b499fce0dd9f41db846bd0a6819b6b227735ace4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 30 Sep 2022 22:54:22 +0800 +Subject: clk: imx: imx8mp: add shared clk gate for usb suspend clk + +From: Li Jun + +[ Upstream commit ed1f4ccfe947a3e1018a3bd7325134574c7ff9b3 ] + +32K usb suspend clock gate is shared with usb_root_clk, this +shared clock gate was initially defined only for usb suspend +clock, usb suspend clk is kept on while system is active or +system sleep with usb wakeup enabled, so usb root clock is +fine with this situation; with the commit cf7f3f4fa9e5 +("clk: imx8mp: fix usb_root_clk parent"), this clock gate is +changed to be for usb root clock, but usb root clock will +be off while usb is suspended, so usb suspend clock will be +gated too, this cause some usb functionalities will not work, +so define this clock to be a shared clock gate to conform with +the real HW status. + +Fixes: 9c140d9926761 ("clk: imx: Add support for i.MX8MP clock driver") +Cc: stable@vger.kernel.org # v5.19+ +Tested-by: Alexander Stein +Signed-off-by: Li Jun +Signed-off-by: Abel Vesa +Link: https://lore.kernel.org/r/1664549663-20364-2-git-send-email-jun.li@nxp.com +Signed-off-by: Sasha Levin +--- + drivers/clk/imx/clk-imx8mp.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/clk/imx/clk-imx8mp.c b/drivers/clk/imx/clk-imx8mp.c +index 2f898c0bc867c..aeb611eaabd3b 100644 +--- a/drivers/clk/imx/clk-imx8mp.c ++++ b/drivers/clk/imx/clk-imx8mp.c +@@ -17,6 +17,7 @@ + + static u32 share_count_nand; + static u32 share_count_media; ++static u32 share_count_usb; + + static const char * const pll_ref_sels[] = { "osc_24m", "dummy", "dummy", "dummy", }; + static const char * const audio_pll1_bypass_sels[] = {"audio_pll1", "audio_pll1_ref_sel", }; +@@ -667,7 +668,8 @@ static int imx8mp_clocks_probe(struct platform_device *pdev) + hws[IMX8MP_CLK_UART2_ROOT] = imx_clk_hw_gate4("uart2_root_clk", "uart2", ccm_base + 0x44a0, 0); + hws[IMX8MP_CLK_UART3_ROOT] = imx_clk_hw_gate4("uart3_root_clk", "uart3", ccm_base + 0x44b0, 0); + hws[IMX8MP_CLK_UART4_ROOT] = imx_clk_hw_gate4("uart4_root_clk", "uart4", ccm_base + 0x44c0, 0); +- hws[IMX8MP_CLK_USB_ROOT] = imx_clk_hw_gate4("usb_root_clk", "hsio_axi", ccm_base + 0x44d0, 0); ++ hws[IMX8MP_CLK_USB_ROOT] = imx_clk_hw_gate2_shared2("usb_root_clk", "hsio_axi", ccm_base + 0x44d0, 0, &share_count_usb); ++ hws[IMX8MP_CLK_USB_SUSP] = imx_clk_hw_gate2_shared2("usb_suspend_clk", "osc_32k", ccm_base + 0x44d0, 0, &share_count_usb); + hws[IMX8MP_CLK_USB_PHY_ROOT] = imx_clk_hw_gate4("usb_phy_root_clk", "usb_phy_ref", ccm_base + 0x44f0, 0); + hws[IMX8MP_CLK_USDHC1_ROOT] = imx_clk_hw_gate4("usdhc1_root_clk", "usdhc1", ccm_base + 0x4510, 0); + hws[IMX8MP_CLK_USDHC2_ROOT] = imx_clk_hw_gate4("usdhc2_root_clk", "usdhc2", ccm_base + 0x4520, 0); +-- +2.43.0 + diff --git a/queue-5.15/clk-imx8mp-add-clkout1-2-support.patch b/queue-5.15/clk-imx8mp-add-clkout1-2-support.patch new file mode 100644 index 00000000000..0be1a4afd22 --- /dev/null +++ b/queue-5.15/clk-imx8mp-add-clkout1-2-support.patch @@ -0,0 +1,80 @@ +From 8723cc765d8ce4f40aedc294406d2a0ff59d2ccb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Apr 2022 18:21:31 +0200 +Subject: clk: imx8mp: add clkout1/2 support + +From: Lucas Stach + +[ Upstream commit 43896f56b59eeaf08687fa976257ae7083d01b41 ] + +clkout1 and clkout2 allow to supply clocks from the SoC to the board, +which is used by some board designs to provide reference clocks. + +Signed-off-by: Lucas Stach +Reviewed-by: Abel Vesa +Link: https://lore.kernel.org/r/20220427162131.3127303-1-l.stach@pengutronix.de +Signed-off-by: Abel Vesa +Stable-dep-of: 5c1f7f109094 ("dt-bindings: clocks: imx8mp: Add ID for usb suspend clock") +Signed-off-by: Sasha Levin +--- + drivers/clk/imx/clk-imx8mp.c | 14 ++++++++++++++ + include/dt-bindings/clock/imx8mp-clock.h | 9 +++++++-- + 2 files changed, 21 insertions(+), 2 deletions(-) + +diff --git a/drivers/clk/imx/clk-imx8mp.c b/drivers/clk/imx/clk-imx8mp.c +index b1c83f9809123..cdeacdc143b5c 100644 +--- a/drivers/clk/imx/clk-imx8mp.c ++++ b/drivers/clk/imx/clk-imx8mp.c +@@ -396,6 +396,11 @@ static const char * const imx8mp_sai7_sels[] = {"osc_24m", "audio_pll1_out", "au + + static const char * const imx8mp_dram_core_sels[] = {"dram_pll_out", "dram_alt_root", }; + ++static const char * const imx8mp_clkout_sels[] = {"audio_pll1_out", "audio_pll2_out", "video_pll1_out", ++ "dummy", "dummy", "gpu_pll_out", "vpu_pll_out", ++ "arm_pll_out", "sys_pll1", "sys_pll2", "sys_pll3", ++ "dummy", "dummy", "osc_24m", "dummy", "osc_32k"}; ++ + static struct clk_hw **hws; + static struct clk_hw_onecell_data *clk_hw_data; + +@@ -514,6 +519,15 @@ static int imx8mp_clocks_probe(struct platform_device *pdev) + hws[IMX8MP_SYS_PLL2_500M] = imx_clk_hw_fixed_factor("sys_pll2_500m", "sys_pll2_500m_cg", 1, 2); + hws[IMX8MP_SYS_PLL2_1000M] = imx_clk_hw_fixed_factor("sys_pll2_1000m", "sys_pll2_out", 1, 1); + ++ hws[IMX8MP_CLK_CLKOUT1_SEL] = imx_clk_hw_mux2("clkout1_sel", anatop_base + 0x128, 4, 4, ++ imx8mp_clkout_sels, ARRAY_SIZE(imx8mp_clkout_sels)); ++ hws[IMX8MP_CLK_CLKOUT1_DIV] = imx_clk_hw_divider("clkout1_div", "clkout1_sel", anatop_base + 0x128, 0, 4); ++ hws[IMX8MP_CLK_CLKOUT1] = imx_clk_hw_gate("clkout1", "clkout1_div", anatop_base + 0x128, 8); ++ hws[IMX8MP_CLK_CLKOUT2_SEL] = imx_clk_hw_mux2("clkout2_sel", anatop_base + 0x128, 20, 4, ++ imx8mp_clkout_sels, ARRAY_SIZE(imx8mp_clkout_sels)); ++ hws[IMX8MP_CLK_CLKOUT2_DIV] = imx_clk_hw_divider("clkout2_div", "clkout2_sel", anatop_base + 0x128, 16, 4); ++ hws[IMX8MP_CLK_CLKOUT2] = imx_clk_hw_gate("clkout2", "clkout2_div", anatop_base + 0x128, 24); ++ + hws[IMX8MP_CLK_A53_DIV] = imx8m_clk_hw_composite_core("arm_a53_div", imx8mp_a53_sels, ccm_base + 0x8000); + hws[IMX8MP_CLK_A53_SRC] = hws[IMX8MP_CLK_A53_DIV]; + hws[IMX8MP_CLK_A53_CG] = hws[IMX8MP_CLK_A53_DIV]; +diff --git a/include/dt-bindings/clock/imx8mp-clock.h b/include/dt-bindings/clock/imx8mp-clock.h +index 4fff3e57f460b..a02fd723168cc 100644 +--- a/include/dt-bindings/clock/imx8mp-clock.h ++++ b/include/dt-bindings/clock/imx8mp-clock.h +@@ -318,10 +318,15 @@ + #define IMX8MP_CLK_AUDIO_AXI 310 + #define IMX8MP_CLK_HSIO_AXI 311 + #define IMX8MP_CLK_MEDIA_ISP 312 +- + #define IMX8MP_CLK_MEDIA_DISP2_PIX 313 ++#define IMX8MP_CLK_CLKOUT1_SEL 314 ++#define IMX8MP_CLK_CLKOUT1_DIV 315 ++#define IMX8MP_CLK_CLKOUT1 316 ++#define IMX8MP_CLK_CLKOUT2_SEL 317 ++#define IMX8MP_CLK_CLKOUT2_DIV 318 ++#define IMX8MP_CLK_CLKOUT2 319 + +-#define IMX8MP_CLK_END 314 ++#define IMX8MP_CLK_END 320 + + #define IMX8MP_CLK_AUDIOMIX_SAI1_IPG 0 + #define IMX8MP_CLK_AUDIOMIX_SAI1_MCLK1 1 +-- +2.43.0 + diff --git a/queue-5.15/clk-imx8mp-add-disp2-pixel-clock.patch b/queue-5.15/clk-imx8mp-add-disp2-pixel-clock.patch new file mode 100644 index 00000000000..4c52f14256f --- /dev/null +++ b/queue-5.15/clk-imx8mp-add-disp2-pixel-clock.patch @@ -0,0 +1,77 @@ +From 886574b585823c11d39ee8c8059508eaeb9419ee Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 13 Mar 2022 13:39:49 +0100 +Subject: clk: imx8mp: Add DISP2 pixel clock + +From: Marek Vasut + +[ Upstream commit 39772efd98adecbd5b8c6096d465d2fcbafbde6a ] + +Add pixel clock for second LCDIFv3 interface. Both LCDIFv3 interfaces use +the same set of parent clock, so deduplicate imx8mp_media_disp1_pix_sels +into common imx8mp_media_disp_pix_sels and use it for both. + +Signed-off-by: Marek Vasut +Cc: Abel Vesa +Cc: Fabio Estevam +Cc: NXP Linux Team +Cc: Peng Fan +Cc: Shawn Guo +Reviewed-by: Abel Vesa +Link: https://lore.kernel.org/r/20220313123949.207284-1-marex@denx.de +Signed-off-by: Abel Vesa +Stable-dep-of: 5c1f7f109094 ("dt-bindings: clocks: imx8mp: Add ID for usb suspend clock") +Signed-off-by: Sasha Levin +--- + drivers/clk/imx/clk-imx8mp.c | 5 +++-- + include/dt-bindings/clock/imx8mp-clock.h | 4 +++- + 2 files changed, 6 insertions(+), 3 deletions(-) + +diff --git a/drivers/clk/imx/clk-imx8mp.c b/drivers/clk/imx/clk-imx8mp.c +index aeb611eaabd3b..b1c83f9809123 100644 +--- a/drivers/clk/imx/clk-imx8mp.c ++++ b/drivers/clk/imx/clk-imx8mp.c +@@ -355,7 +355,7 @@ static const char * const imx8mp_media_mipi_phy1_ref_sels[] = {"osc_24m", "sys_p + "clk_ext2", "audio_pll2_out", + "video_pll1_out", }; + +-static const char * const imx8mp_media_disp1_pix_sels[] = {"osc_24m", "video_pll1_out", "audio_pll2_out", ++static const char * const imx8mp_media_disp_pix_sels[] = {"osc_24m", "video_pll1_out", "audio_pll2_out", + "audio_pll1_out", "sys_pll1_800m", + "sys_pll2_1000m", "sys_pll3_out", "clk_ext4", }; + +@@ -548,6 +548,7 @@ static int imx8mp_clocks_probe(struct platform_device *pdev) + hws[IMX8MP_CLK_AHB] = imx8m_clk_hw_composite_bus_critical("ahb_root", imx8mp_ahb_sels, ccm_base + 0x9000); + hws[IMX8MP_CLK_AUDIO_AHB] = imx8m_clk_hw_composite_bus("audio_ahb", imx8mp_audio_ahb_sels, ccm_base + 0x9100); + hws[IMX8MP_CLK_MIPI_DSI_ESC_RX] = imx8m_clk_hw_composite_bus("mipi_dsi_esc_rx", imx8mp_mipi_dsi_esc_rx_sels, ccm_base + 0x9200); ++ hws[IMX8MP_CLK_MEDIA_DISP2_PIX] = imx8m_clk_hw_composite("media_disp2_pix", imx8mp_media_disp_pix_sels, ccm_base + 0x9300); + + hws[IMX8MP_CLK_IPG_ROOT] = imx_clk_hw_divider2("ipg_root", "ahb_root", ccm_base + 0x9080, 0, 1); + +@@ -609,7 +610,7 @@ static int imx8mp_clocks_probe(struct platform_device *pdev) + hws[IMX8MP_CLK_USDHC3] = imx8m_clk_hw_composite("usdhc3", imx8mp_usdhc3_sels, ccm_base + 0xbc80); + hws[IMX8MP_CLK_MEDIA_CAM1_PIX] = imx8m_clk_hw_composite("media_cam1_pix", imx8mp_media_cam1_pix_sels, ccm_base + 0xbd00); + hws[IMX8MP_CLK_MEDIA_MIPI_PHY1_REF] = imx8m_clk_hw_composite("media_mipi_phy1_ref", imx8mp_media_mipi_phy1_ref_sels, ccm_base + 0xbd80); +- hws[IMX8MP_CLK_MEDIA_DISP1_PIX] = imx8m_clk_hw_composite("media_disp1_pix", imx8mp_media_disp1_pix_sels, ccm_base + 0xbe00); ++ hws[IMX8MP_CLK_MEDIA_DISP1_PIX] = imx8m_clk_hw_composite("media_disp1_pix", imx8mp_media_disp_pix_sels, ccm_base + 0xbe00); + hws[IMX8MP_CLK_MEDIA_CAM2_PIX] = imx8m_clk_hw_composite("media_cam2_pix", imx8mp_media_cam2_pix_sels, ccm_base + 0xbe80); + hws[IMX8MP_CLK_MEDIA_LDB] = imx8m_clk_hw_composite("media_ldb", imx8mp_media_ldb_sels, ccm_base + 0xbf00); + hws[IMX8MP_CLK_MEMREPAIR] = imx8m_clk_hw_composite_critical("mem_repair", imx8mp_memrepair_sels, ccm_base + 0xbf80); +diff --git a/include/dt-bindings/clock/imx8mp-clock.h b/include/dt-bindings/clock/imx8mp-clock.h +index 43927a1b9e940..4fff3e57f460b 100644 +--- a/include/dt-bindings/clock/imx8mp-clock.h ++++ b/include/dt-bindings/clock/imx8mp-clock.h +@@ -319,7 +319,9 @@ + #define IMX8MP_CLK_HSIO_AXI 311 + #define IMX8MP_CLK_MEDIA_ISP 312 + +-#define IMX8MP_CLK_END 313 ++#define IMX8MP_CLK_MEDIA_DISP2_PIX 313 ++ ++#define IMX8MP_CLK_END 314 + + #define IMX8MP_CLK_AUDIOMIX_SAI1_IPG 0 + #define IMX8MP_CLK_AUDIOMIX_SAI1_MCLK1 1 +-- +2.43.0 + diff --git a/queue-5.15/clk-linux-clk-provider.h-fix-kernel-doc-warnings-and.patch b/queue-5.15/clk-linux-clk-provider.h-fix-kernel-doc-warnings-and.patch new file mode 100644 index 00000000000..081522fe759 --- /dev/null +++ b/queue-5.15/clk-linux-clk-provider.h-fix-kernel-doc-warnings-and.patch @@ -0,0 +1,117 @@ +From ec3ca5a2370824f434aa4c877f7bba1624865734 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 30 Sep 2023 15:14:26 -0700 +Subject: clk: linux/clk-provider.h: fix kernel-doc warnings and typos + +From: Randy Dunlap + +[ Upstream commit 84aefafe6b294041b7fa0757414c4a29c1bdeea2 ] + +Fix spelling of "Structure". + +Fix multiple kernel-doc warnings: + +clk-provider.h:269: warning: Function parameter or member 'recalc_rate' not described in 'clk_ops' +clk-provider.h:468: warning: Function parameter or member 'parent_data' not described in 'clk_hw_register_fixed_rate_with_accuracy_parent_data' +clk-provider.h:468: warning: Excess function parameter 'parent_name' description in 'clk_hw_register_fixed_rate_with_accuracy_parent_data' +clk-provider.h:482: warning: Function parameter or member 'parent_data' not described in 'clk_hw_register_fixed_rate_parent_accuracy' +clk-provider.h:482: warning: Excess function parameter 'parent_name' description in 'clk_hw_register_fixed_rate_parent_accuracy' +clk-provider.h:687: warning: Function parameter or member 'flags' not described in 'clk_divider' +clk-provider.h:1164: warning: Function parameter or member 'flags' not described in 'clk_fractional_divider' +clk-provider.h:1164: warning: Function parameter or member 'approximation' not described in 'clk_fractional_divider' +clk-provider.h:1213: warning: Function parameter or member 'flags' not described in 'clk_multiplier' + +Fixes: 9fba738a53dd ("clk: add duty cycle support") +Fixes: b2476490ef11 ("clk: introduce the common clock framework") +Fixes: 2d34f09e79c9 ("clk: fixed-rate: Add support for specifying parents via DT/pointers") +Fixes: f5290d8e4f0c ("clk: asm9260: use parent index to link the reference clock") +Fixes: 9d9f78ed9af0 ("clk: basic clock hardware types") +Fixes: e2d0e90fae82 ("clk: new basic clk type for fractional divider") +Fixes: f2e0a53271a4 ("clk: Add a basic multiplier clock") + +Signed-off-by: Randy Dunlap +Cc: Michael Turquette +Cc: Stephen Boyd +Cc: linux-clk@vger.kernel.org +Link: https://lore.kernel.org/r/20230930221428.18463-1-rdunlap@infradead.org +Signed-off-by: Stephen Boyd +Signed-off-by: Sasha Levin +--- + include/linux/clk-provider.h | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h +index 6cace09ba63d0..7d5ca15ac66ba 100644 +--- a/include/linux/clk-provider.h ++++ b/include/linux/clk-provider.h +@@ -61,7 +61,7 @@ struct clk_rate_request { + }; + + /** +- * struct clk_duty - Struture encoding the duty cycle ratio of a clock ++ * struct clk_duty - Structure encoding the duty cycle ratio of a clock + * + * @num: Numerator of the duty cycle ratio + * @den: Denominator of the duty cycle ratio +@@ -116,7 +116,7 @@ struct clk_duty { + * @restore_context: Restore the context of the clock after a restoration + * of power. + * +- * @recalc_rate Recalculate the rate of this clock, by querying hardware. The ++ * @recalc_rate: Recalculate the rate of this clock, by querying hardware. The + * parent rate is an input parameter. It is up to the caller to + * ensure that the prepare_mutex is held across this call. + * Returns the calculated rate. Optional, but recommended - if +@@ -442,7 +442,7 @@ struct clk *clk_register_fixed_rate(struct device *dev, const char *name, + * clock with the clock framework + * @dev: device that is registering this clock + * @name: name of this clock +- * @parent_name: name of clock's parent ++ * @parent_data: name of clock's parent + * @flags: framework-specific flags + * @fixed_rate: non-adjustable clock rate + * @fixed_accuracy: non-adjustable clock accuracy +@@ -457,7 +457,7 @@ struct clk *clk_register_fixed_rate(struct device *dev, const char *name, + * the clock framework + * @dev: device that is registering this clock + * @name: name of this clock +- * @parent_name: name of clock's parent ++ * @parent_data: name of clock's parent + * @flags: framework-specific flags + * @fixed_rate: non-adjustable clock rate + */ +@@ -593,7 +593,7 @@ struct clk_div_table { + * Clock with an adjustable divider affecting its output frequency. Implements + * .recalc_rate, .set_rate and .round_rate + * +- * Flags: ++ * @flags: + * CLK_DIVIDER_ONE_BASED - by default the divisor is the value read from the + * register plus one. If CLK_DIVIDER_ONE_BASED is set then the divider is + * the raw value read from the register, with the value of zero considered +@@ -1023,11 +1023,12 @@ struct clk_hw *devm_clk_hw_register_fixed_factor(struct device *dev, + * @mwidth: width of the numerator bit field + * @nshift: shift to the denominator bit field + * @nwidth: width of the denominator bit field ++ * @approximation: clk driver's callback for calculating the divider clock + * @lock: register lock + * + * Clock with adjustable fractional divider affecting its output frequency. + * +- * Flags: ++ * @flags: + * CLK_FRAC_DIVIDER_ZERO_BASED - by default the numerator and denominator + * is the value read from the register. If CLK_FRAC_DIVIDER_ZERO_BASED + * is set then the numerator and denominator are both the value read +@@ -1086,7 +1087,7 @@ void clk_hw_unregister_fractional_divider(struct clk_hw *hw); + * Clock with an adjustable multiplier affecting its output frequency. + * Implements .recalc_rate, .set_rate and .round_rate + * +- * Flags: ++ * @flags: + * CLK_MULTIPLIER_ZERO_BYPASS - By default, the multiplier is the value read + * from the register, with 0 being a valid value effectively + * zeroing the output clock rate. If CLK_MULTIPLIER_ZERO_BYPASS is +-- +2.43.0 + diff --git a/queue-5.15/clk-qcom-gcc-qcs404-disable-gpll-04-_out_aux-parents.patch b/queue-5.15/clk-qcom-gcc-qcs404-disable-gpll-04-_out_aux-parents.patch new file mode 100644 index 00000000000..a70237d66bf --- /dev/null +++ b/queue-5.15/clk-qcom-gcc-qcs404-disable-gpll-04-_out_aux-parents.patch @@ -0,0 +1,146 @@ +From 12125997ada9c3f8da74a82a56b82e359108f4f8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 Dec 2022 06:21:43 +0200 +Subject: clk: qcom: gcc-qcs404: disable gpll[04]_out_aux parents + +From: Dmitry Baryshkov + +[ Upstream commit 712c64caf31374de57aa193a9dff57172b2f6f82 ] + +On the QCS404 platform the driver for the Global Clock Controller +doens't define gpll0_out_aux and gpll4_out_aux clocks, so it's not +possible to use them as parents. Remove entries for these clocks. + +Note: backporting this patch to earlier kernels would also require a +previous patch which switches the gcc driver to use ARRAY_SIZE for +parent data arrays. + +Fixes: 652f1813c113 ("clk: qcom: gcc: Add global clock controller driver for QCS404") +Signed-off-by: Dmitry Baryshkov +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20221226042154.2666748-6-dmitry.baryshkov@linaro.org +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/gcc-qcs404.c | 16 ---------------- + 1 file changed, 16 deletions(-) + +diff --git a/drivers/clk/qcom/gcc-qcs404.c b/drivers/clk/qcom/gcc-qcs404.c +index 46d314d692505..4299fe8f19274 100644 +--- a/drivers/clk/qcom/gcc-qcs404.c ++++ b/drivers/clk/qcom/gcc-qcs404.c +@@ -25,11 +25,9 @@ enum { + P_CORE_BI_PLL_TEST_SE, + P_DSI0_PHY_PLL_OUT_BYTECLK, + P_DSI0_PHY_PLL_OUT_DSICLK, +- P_GPLL0_OUT_AUX, + P_GPLL0_OUT_MAIN, + P_GPLL1_OUT_MAIN, + P_GPLL3_OUT_MAIN, +- P_GPLL4_OUT_AUX, + P_GPLL4_OUT_MAIN, + P_GPLL6_OUT_AUX, + P_HDMI_PHY_PLL_CLK, +@@ -109,28 +107,24 @@ static const char * const gcc_parent_names_4[] = { + static const struct parent_map gcc_parent_map_5[] = { + { P_XO, 0 }, + { P_DSI0_PHY_PLL_OUT_BYTECLK, 1 }, +- { P_GPLL0_OUT_AUX, 2 }, + { P_CORE_BI_PLL_TEST_SE, 7 }, + }; + + static const char * const gcc_parent_names_5[] = { + "cxo", + "dsi0pll_byteclk_src", +- "gpll0_out_aux", + "core_bi_pll_test_se", + }; + + static const struct parent_map gcc_parent_map_6[] = { + { P_XO, 0 }, + { P_DSI0_PHY_PLL_OUT_BYTECLK, 2 }, +- { P_GPLL0_OUT_AUX, 3 }, + { P_CORE_BI_PLL_TEST_SE, 7 }, + }; + + static const char * const gcc_parent_names_6[] = { + "cxo", + "dsi0_phy_pll_out_byteclk", +- "gpll0_out_aux", + "core_bi_pll_test_se", + }; + +@@ -139,7 +133,6 @@ static const struct parent_map gcc_parent_map_7[] = { + { P_GPLL0_OUT_MAIN, 1 }, + { P_GPLL3_OUT_MAIN, 2 }, + { P_GPLL6_OUT_AUX, 3 }, +- { P_GPLL4_OUT_AUX, 4 }, + { P_CORE_BI_PLL_TEST_SE, 7 }, + }; + +@@ -148,7 +141,6 @@ static const char * const gcc_parent_names_7[] = { + "gpll0_out_main", + "gpll3_out_main", + "gpll6_out_aux", +- "gpll4_out_aux", + "core_bi_pll_test_se", + }; + +@@ -207,14 +199,12 @@ static const char * const gcc_parent_names_11[] = { + static const struct parent_map gcc_parent_map_12[] = { + { P_XO, 0 }, + { P_DSI0_PHY_PLL_OUT_DSICLK, 1 }, +- { P_GPLL0_OUT_AUX, 2 }, + { P_CORE_BI_PLL_TEST_SE, 7 }, + }; + + static const char * const gcc_parent_names_12[] = { + "cxo", + "dsi0pll_pclk_src", +- "gpll0_out_aux", + "core_bi_pll_test_se", + }; + +@@ -237,40 +227,34 @@ static const char * const gcc_parent_names_13[] = { + static const struct parent_map gcc_parent_map_14[] = { + { P_XO, 0 }, + { P_GPLL0_OUT_MAIN, 1 }, +- { P_GPLL4_OUT_AUX, 2 }, + { P_CORE_BI_PLL_TEST_SE, 7 }, + }; + + static const char * const gcc_parent_names_14[] = { + "cxo", + "gpll0_out_main", +- "gpll4_out_aux", + "core_bi_pll_test_se", + }; + + static const struct parent_map gcc_parent_map_15[] = { + { P_XO, 0 }, +- { P_GPLL0_OUT_AUX, 2 }, + { P_CORE_BI_PLL_TEST_SE, 7 }, + }; + + static const char * const gcc_parent_names_15[] = { + "cxo", +- "gpll0_out_aux", + "core_bi_pll_test_se", + }; + + static const struct parent_map gcc_parent_map_16[] = { + { P_XO, 0 }, + { P_GPLL0_OUT_MAIN, 1 }, +- { P_GPLL0_OUT_AUX, 2 }, + { P_CORE_BI_PLL_TEST_SE, 7 }, + }; + + static const char * const gcc_parent_names_16[] = { + "cxo", + "gpll0_out_main", +- "gpll0_out_aux", + "core_bi_pll_test_se", + }; + +-- +2.43.0 + diff --git a/queue-5.15/clk-qcom-gcc-qcs404-fix-names-of-the-dsi-clocks-used.patch b/queue-5.15/clk-qcom-gcc-qcs404-fix-names-of-the-dsi-clocks-used.patch new file mode 100644 index 00000000000..0e56cf364fb --- /dev/null +++ b/queue-5.15/clk-qcom-gcc-qcs404-fix-names-of-the-dsi-clocks-used.patch @@ -0,0 +1,66 @@ +From 6c62cc33f733d53d92a33ec89c5b103a11e1fbc2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 Dec 2022 06:21:44 +0200 +Subject: clk: qcom: gcc-qcs404: fix names of the DSI clocks used as parents + +From: Dmitry Baryshkov + +[ Upstream commit 47d94d30cd3dcc743241b4208b1eec7247610c84 ] + +The QCS404 uses 28nm LPM DSI PHY, which registers dsi0pll and +dsi0pllbyte clocks. Fix all DSI PHY clock names used as parents inside +the GCC driver. + +Fixes: 652f1813c113 ("clk: qcom: gcc: Add global clock controller driver for QCS404") +Reviewed-by: Konrad Dybcio +Signed-off-by: Dmitry Baryshkov +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20221226042154.2666748-7-dmitry.baryshkov@linaro.org +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/gcc-qcs404.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/clk/qcom/gcc-qcs404.c b/drivers/clk/qcom/gcc-qcs404.c +index 4299fe8f19274..a7a9884799cd3 100644 +--- a/drivers/clk/qcom/gcc-qcs404.c ++++ b/drivers/clk/qcom/gcc-qcs404.c +@@ -112,7 +112,7 @@ static const struct parent_map gcc_parent_map_5[] = { + + static const char * const gcc_parent_names_5[] = { + "cxo", +- "dsi0pll_byteclk_src", ++ "dsi0pllbyte", + "core_bi_pll_test_se", + }; + +@@ -124,7 +124,7 @@ static const struct parent_map gcc_parent_map_6[] = { + + static const char * const gcc_parent_names_6[] = { + "cxo", +- "dsi0_phy_pll_out_byteclk", ++ "dsi0pllbyte", + "core_bi_pll_test_se", + }; + +@@ -167,7 +167,7 @@ static const struct parent_map gcc_parent_map_9[] = { + static const char * const gcc_parent_names_9[] = { + "cxo", + "gpll0_out_main", +- "dsi0_phy_pll_out_dsiclk", ++ "dsi0pll", + "gpll6_out_aux", + "core_bi_pll_test_se", + }; +@@ -204,7 +204,7 @@ static const struct parent_map gcc_parent_map_12[] = { + + static const char * const gcc_parent_names_12[] = { + "cxo", +- "dsi0pll_pclk_src", ++ "dsi0pll", + "core_bi_pll_test_se", + }; + +-- +2.43.0 + diff --git a/queue-5.15/clk-qcom-gpucc-sc7180-fix-clk_dis_wait-being-program.patch b/queue-5.15/clk-qcom-gpucc-sc7180-fix-clk_dis_wait-being-program.patch new file mode 100644 index 00000000000..dcf4832c8a1 --- /dev/null +++ b/queue-5.15/clk-qcom-gpucc-sc7180-fix-clk_dis_wait-being-program.patch @@ -0,0 +1,63 @@ +From 56c4c76f6bfcd2371123f52e5ae2eafc403fe93d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 1 Feb 2023 19:23:04 +0200 +Subject: clk: qcom: gpucc-sc7180: fix clk_dis_wait being programmed for CX + GDSC + +From: Dmitry Baryshkov + +[ Upstream commit 658c82caffa042b351f5a1b6325819297a951a04 ] + +The gdsc_init() function will rewrite the CLK_DIS_WAIT field while +registering the GDSC (writing the value 0x2 by default). This will +override the setting done in the driver's probe function. + +Set cx_gdsc.clk_dis_wait_val to 8 to follow the intention of the probe +function. + +Fixes: 745ff069a49c ("clk: qcom: Add graphics clock controller driver for SC7180") +Reviewed-by: Stephen Boyd +Signed-off-by: Dmitry Baryshkov +Reviewed-by: Konrad Dybcio +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230201172305.993146-1-dmitry.baryshkov@linaro.org +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/gpucc-sc7180.c | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +diff --git a/drivers/clk/qcom/gpucc-sc7180.c b/drivers/clk/qcom/gpucc-sc7180.c +index d738251cba17d..6839b4b71a2f4 100644 +--- a/drivers/clk/qcom/gpucc-sc7180.c ++++ b/drivers/clk/qcom/gpucc-sc7180.c +@@ -21,8 +21,6 @@ + #define CX_GMU_CBCR_SLEEP_SHIFT 4 + #define CX_GMU_CBCR_WAKE_MASK 0xF + #define CX_GMU_CBCR_WAKE_SHIFT 8 +-#define CLK_DIS_WAIT_SHIFT 12 +-#define CLK_DIS_WAIT_MASK (0xf << CLK_DIS_WAIT_SHIFT) + + enum { + P_BI_TCXO, +@@ -160,6 +158,7 @@ static struct clk_branch gpu_cc_cxo_clk = { + static struct gdsc cx_gdsc = { + .gdscr = 0x106c, + .gds_hw_ctrl = 0x1540, ++ .clk_dis_wait_val = 8, + .pd = { + .name = "cx_gdsc", + }, +@@ -242,10 +241,6 @@ static int gpu_cc_sc7180_probe(struct platform_device *pdev) + value = 0xF << CX_GMU_CBCR_WAKE_SHIFT | 0xF << CX_GMU_CBCR_SLEEP_SHIFT; + regmap_update_bits(regmap, 0x1098, mask, value); + +- /* Configure clk_dis_wait for gpu_cx_gdsc */ +- regmap_update_bits(regmap, 0x106c, CLK_DIS_WAIT_MASK, +- 8 << CLK_DIS_WAIT_SHIFT); +- + return qcom_cc_really_probe(pdev, &gpu_cc_sc7180_desc, regmap); + } + +-- +2.43.0 + diff --git a/queue-5.15/clk-qcom-gpucc-sdm845-fix-clk_dis_wait-being-program.patch b/queue-5.15/clk-qcom-gpucc-sdm845-fix-clk_dis_wait-being-program.patch new file mode 100644 index 00000000000..5ef0c00a8d9 --- /dev/null +++ b/queue-5.15/clk-qcom-gpucc-sdm845-fix-clk_dis_wait-being-program.patch @@ -0,0 +1,63 @@ +From afc08f9532a87590b0a0fae191aff17b173a5345 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 1 Feb 2023 19:23:05 +0200 +Subject: clk: qcom: gpucc-sdm845: fix clk_dis_wait being programmed for CX + GDSC + +From: Dmitry Baryshkov + +[ Upstream commit cb81719e3c1165ef1bc33137dc628f750eed8ea4 ] + +The gdsc_init() function will rewrite the CLK_DIS_WAIT field while +registering the GDSC (writing the value 0x2 by default). This will +override the setting done in the driver's probe function. + +Set cx_gdsc.clk_dis_wait_val to 8 to follow the intention of the probe +function. + +Fixes: 453361cdd757 ("clk: qcom: Add graphics clock controller driver for SDM845") +Reviewed-by: Stephen Boyd +Signed-off-by: Dmitry Baryshkov +Reviewed-by: Konrad Dybcio +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230201172305.993146-2-dmitry.baryshkov@linaro.org +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/gpucc-sdm845.c | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +diff --git a/drivers/clk/qcom/gpucc-sdm845.c b/drivers/clk/qcom/gpucc-sdm845.c +index 110b54401bc6d..970d7414bdf0e 100644 +--- a/drivers/clk/qcom/gpucc-sdm845.c ++++ b/drivers/clk/qcom/gpucc-sdm845.c +@@ -22,8 +22,6 @@ + #define CX_GMU_CBCR_SLEEP_SHIFT 4 + #define CX_GMU_CBCR_WAKE_MASK 0xf + #define CX_GMU_CBCR_WAKE_SHIFT 8 +-#define CLK_DIS_WAIT_SHIFT 12 +-#define CLK_DIS_WAIT_MASK (0xf << CLK_DIS_WAIT_SHIFT) + + enum { + P_BI_TCXO, +@@ -121,6 +119,7 @@ static struct clk_branch gpu_cc_cxo_clk = { + static struct gdsc gpu_cx_gdsc = { + .gdscr = 0x106c, + .gds_hw_ctrl = 0x1540, ++ .clk_dis_wait_val = 0x8, + .pd = { + .name = "gpu_cx_gdsc", + }, +@@ -193,10 +192,6 @@ static int gpu_cc_sdm845_probe(struct platform_device *pdev) + value = 0xf << CX_GMU_CBCR_WAKE_SHIFT | 0xf << CX_GMU_CBCR_SLEEP_SHIFT; + regmap_update_bits(regmap, 0x1098, mask, value); + +- /* Configure clk_dis_wait for gpu_cx_gdsc */ +- regmap_update_bits(regmap, 0x106c, CLK_DIS_WAIT_MASK, +- 8 << CLK_DIS_WAIT_SHIFT); +- + return qcom_cc_really_probe(pdev, &gpu_cc_sdm845_desc, regmap); + } + +-- +2.43.0 + diff --git a/queue-5.15/clk-renesas-cpg-mssr-fix-use-after-free-if-cpg_mssr_.patch b/queue-5.15/clk-renesas-cpg-mssr-fix-use-after-free-if-cpg_mssr_.patch new file mode 100644 index 00000000000..1f1da1cc57a --- /dev/null +++ b/queue-5.15/clk-renesas-cpg-mssr-fix-use-after-free-if-cpg_mssr_.patch @@ -0,0 +1,50 @@ +From 40b5aec7389fc7d6c026b789e695470090bdf5ea Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 23 Dec 2022 17:40:17 +0300 +Subject: clk: renesas: cpg-mssr: Fix use after free if cpg_mssr_common_init() + failed + +From: Alexey Khoroshilov + +[ Upstream commit fbfd614aeaa2853c2c575299dfe2458db8eff67e ] + +If cpg_mssr_common_init() fails after assigning priv to global variable +cpg_mssr_priv, it deallocates priv, but cpg_mssr_priv keeps dangling +pointer that potentially can be used later. + +Found by Linux Verification Center (linuxtesting.org) with SVACE. + +Fixes: 1f7db7bbf031 ("clk: renesas: cpg-mssr: Add early clock support") +Signed-off-by: Alexey Khoroshilov +Reviewed-by: Geert Uytterhoeven +Link: https://lore.kernel.org/r/1671806417-32623-1-git-send-email-khoroshilov@ispras.ru +Signed-off-by: Geert Uytterhoeven +Signed-off-by: Sasha Levin +--- + drivers/clk/renesas/renesas-cpg-mssr.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/clk/renesas/renesas-cpg-mssr.c b/drivers/clk/renesas/renesas-cpg-mssr.c +index 21f762aa21313..ed67b90fc1b0c 100644 +--- a/drivers/clk/renesas/renesas-cpg-mssr.c ++++ b/drivers/clk/renesas/renesas-cpg-mssr.c +@@ -957,7 +957,6 @@ static int __init cpg_mssr_common_init(struct device *dev, + goto out_err; + } + +- cpg_mssr_priv = priv; + priv->num_core_clks = info->num_total_core_clks; + priv->num_mod_clks = info->num_hw_mod_clks; + priv->last_dt_core_clk = info->last_dt_core_clk; +@@ -987,6 +986,8 @@ static int __init cpg_mssr_common_init(struct device *dev, + if (error) + goto out_err; + ++ cpg_mssr_priv = priv; ++ + return 0; + + out_err: +-- +2.43.0 + diff --git a/queue-5.15/clk-renesas-cpg-mssr-remove-superfluous-check-in-res.patch b/queue-5.15/clk-renesas-cpg-mssr-remove-superfluous-check-in-res.patch new file mode 100644 index 00000000000..53f7d660c05 --- /dev/null +++ b/queue-5.15/clk-renesas-cpg-mssr-remove-superfluous-check-in-res.patch @@ -0,0 +1,40 @@ +From faa74c085bbd05d2c19bdb1f7ecc50e698ffb196 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 11 Jan 2023 09:23:34 +0100 +Subject: clk: renesas: cpg-mssr: Remove superfluous check in resume code + +From: Geert Uytterhoeven + +[ Upstream commit 1c052043c79af5f70e80e2acd4dd70904ae08666 ] + +When the code flow arrives at printing the error message in +cpg_mssr_resume_noirq(), we know for sure that we are not running on an +RZ/A Soc, as the code checked for that before. + +Fixes: ace342097768e35f ("clk: renesas: cpg-mssr: Fix STBCR suspend/resume handling") +Signed-off-by: Geert Uytterhoeven +Link: https://lore.kernel.org/r/144a3e66d748c0c17f3524ac8fa6ece5bf5b6f1e.1673425314.git.geert+renesas@glider.be +Signed-off-by: Sasha Levin +--- + drivers/clk/renesas/renesas-cpg-mssr.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/drivers/clk/renesas/renesas-cpg-mssr.c b/drivers/clk/renesas/renesas-cpg-mssr.c +index ed67b90fc1b0c..54c5d35fe2ae3 100644 +--- a/drivers/clk/renesas/renesas-cpg-mssr.c ++++ b/drivers/clk/renesas/renesas-cpg-mssr.c +@@ -911,9 +911,8 @@ static int cpg_mssr_resume_noirq(struct device *dev) + } + + if (!i) +- dev_warn(dev, "Failed to enable %s%u[0x%x]\n", +- priv->reg_layout == CLK_REG_LAYOUT_RZ_A ? +- "STB" : "SMSTP", reg, oldval & mask); ++ dev_warn(dev, "Failed to enable SMSTP%u[0x%x]\n", reg, ++ oldval & mask); + } + + return 0; +-- +2.43.0 + diff --git a/queue-5.15/debugobjects-recheck-debug_objects_enabled-before-re.patch b/queue-5.15/debugobjects-recheck-debug_objects_enabled-before-re.patch new file mode 100644 index 00000000000..d6e2b3a8472 --- /dev/null +++ b/queue-5.15/debugobjects-recheck-debug_objects_enabled-before-re.patch @@ -0,0 +1,74 @@ +From 441e5a55f0a79cda58bc3ac7cc2dc07a2b664303 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 7 Jun 2023 19:19:02 +0900 +Subject: debugobjects: Recheck debug_objects_enabled before reporting + +From: Tetsuo Handa + +[ Upstream commit 8b64d420fe2450f82848178506d3e3a0bd195539 ] + +syzbot is reporting false a positive ODEBUG message immediately after +ODEBUG was disabled due to OOM. + + [ 1062.309646][T22911] ODEBUG: Out of memory. ODEBUG disabled + [ 1062.886755][ T5171] ------------[ cut here ]------------ + [ 1062.892770][ T5171] ODEBUG: assert_init not available (active state 0) object: ffffc900056afb20 object type: timer_list hint: process_timeout+0x0/0x40 + + CPU 0 [ T5171] CPU 1 [T22911] + -------------- -------------- + debug_object_assert_init() { + if (!debug_objects_enabled) + return; + db = get_bucket(addr); + lookup_object_or_alloc() { + debug_objects_enabled = 0; + return NULL; + } + debug_objects_oom() { + pr_warn("Out of memory. ODEBUG disabled\n"); + // all buckets get emptied here, and + } + lookup_object_or_alloc(addr, db, descr, false, true) { + // this bucket is already empty. + return ERR_PTR(-ENOENT); + } + // Emits false positive warning. + debug_print_object(&o, "assert_init"); + } + +Recheck debug_object_enabled in debug_print_object() to avoid that. + +Reported-by: syzbot +Suggested-by: Thomas Gleixner +Signed-off-by: Tetsuo Handa +Signed-off-by: Thomas Gleixner +Link: https://lore.kernel.org/r/492fe2ae-5141-d548-ebd5-62f5fe2e57f7@I-love.SAKURA.ne.jp +Closes: https://syzkaller.appspot.com/bug?extid=7937ba6a50bdd00fffdf +Signed-off-by: Sasha Levin +--- + lib/debugobjects.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/lib/debugobjects.c b/lib/debugobjects.c +index 09fddc0ea6d39..3972e2123e554 100644 +--- a/lib/debugobjects.c ++++ b/lib/debugobjects.c +@@ -501,6 +501,15 @@ static void debug_print_object(struct debug_obj *obj, char *msg) + const struct debug_obj_descr *descr = obj->descr; + static int limit; + ++ /* ++ * Don't report if lookup_object_or_alloc() by the current thread ++ * failed because lookup_object_or_alloc()/debug_objects_oom() by a ++ * concurrent thread turned off debug_objects_enabled and cleared ++ * the hash buckets. ++ */ ++ if (!debug_objects_enabled) ++ return; ++ + if (limit < 5 && descr != descr_test) { + void *hint = descr->debug_hint ? + descr->debug_hint(obj->object) : NULL; +-- +2.43.0 + diff --git a/queue-5.15/devlink-report-devlink_port_type_warn-source-device.patch b/queue-5.15/devlink-report-devlink_port_type_warn-source-device.patch new file mode 100644 index 00000000000..6cbeb2fe54e --- /dev/null +++ b/queue-5.15/devlink-report-devlink_port_type_warn-source-device.patch @@ -0,0 +1,77 @@ +From aafe8363ee2e4d9a6336e0cc8e3b17897bfb7500 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 15 Jun 2023 11:54:47 +0200 +Subject: devlink: report devlink_port_type_warn source device + +From: Petr Oros + +[ Upstream commit a52305a81d6bb74b90b400dfa56455d37872fe4b ] + +devlink_port_type_warn is scheduled for port devlink and warning +when the port type is not set. But from this warning it is not easy +found out which device (driver) has no devlink port set. + +[ 3709.975552] Type was not set for devlink port. +[ 3709.975579] WARNING: CPU: 1 PID: 13092 at net/devlink/leftover.c:6775 devlink_port_type_warn+0x11/0x20 +[ 3709.993967] Modules linked in: openvswitch nf_conncount nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 nfnetlink bluetooth rpcsec_gss_krb5 auth_rpcgss nfsv4 dns_resolver nfs lockd grace fscache netfs vhost_net vhost vhost_iotlb tap tun bridge stp llc qrtr intel_rapl_msr intel_rapl_common i10nm_edac nfit libnvdimm x86_pkg_temp_thermal mlx5_ib intel_powerclamp coretemp dell_wmi ledtrig_audio sparse_keymap ipmi_ssif kvm_intel ib_uverbs rfkill ib_core video kvm iTCO_wdt acpi_ipmi intel_vsec irqbypass ipmi_si iTCO_vendor_support dcdbas ipmi_devintf mei_me ipmi_msghandler rapl mei intel_cstate isst_if_mmio isst_if_mbox_pci dell_smbios intel_uncore isst_if_common i2c_i801 dell_wmi_descriptor wmi_bmof i2c_smbus intel_pch_thermal pcspkr acpi_power_meter xfs libcrc32c sd_mod sg nvme_tcp mgag200 i2c_algo_bit nvme_fabrics drm_shmem_helper drm_kms_helper nvme syscopyarea ahci sysfillrect sysimgblt nvme_core fb_sys_fops crct10dif_pclmul libahci mlx5_core sfc crc32_pclmul nvme_common drm +[ 3709.994030] crc32c_intel mtd t10_pi mlxfw libata tg3 mdio megaraid_sas psample ghash_clmulni_intel pci_hyperv_intf wmi dm_multipath sunrpc dm_mirror dm_region_hash dm_log dm_mod be2iscsi bnx2i cnic uio cxgb4i cxgb4 tls libcxgbi libcxgb qla4xxx iscsi_boot_sysfs iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi fuse +[ 3710.108431] CPU: 1 PID: 13092 Comm: kworker/1:1 Kdump: loaded Not tainted 5.14.0-319.el9.x86_64 #1 +[ 3710.108435] Hardware name: Dell Inc. PowerEdge R750/0PJ80M, BIOS 1.8.2 09/14/2022 +[ 3710.108437] Workqueue: events devlink_port_type_warn +[ 3710.108440] RIP: 0010:devlink_port_type_warn+0x11/0x20 +[ 3710.108443] Code: 84 76 fe ff ff 48 c7 03 20 0e 1a ad 31 c0 e9 96 fd ff ff 66 0f 1f 44 00 00 0f 1f 44 00 00 48 c7 c7 18 24 4e ad e8 ef 71 62 ff <0f> 0b c3 cc cc cc cc 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 f6 87 +[ 3710.108445] RSP: 0018:ff3b6d2e8b3c7e90 EFLAGS: 00010282 +[ 3710.108447] RAX: 0000000000000000 RBX: ff366d6580127080 RCX: 0000000000000027 +[ 3710.108448] RDX: 0000000000000027 RSI: 00000000ffff86de RDI: ff366d753f41f8c8 +[ 3710.108449] RBP: ff366d658ff5a0c0 R08: ff366d753f41f8c0 R09: ff3b6d2e8b3c7e18 +[ 3710.108450] R10: 0000000000000001 R11: 0000000000000023 R12: ff366d753f430600 +[ 3710.108451] R13: ff366d753f436900 R14: 0000000000000000 R15: ff366d753f436905 +[ 3710.108452] FS: 0000000000000000(0000) GS:ff366d753f400000(0000) knlGS:0000000000000000 +[ 3710.108453] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 +[ 3710.108454] CR2: 00007f1c57bc74e0 CR3: 000000111d26a001 CR4: 0000000000773ee0 +[ 3710.108456] PKRU: 55555554 +[ 3710.108457] Call Trace: +[ 3710.108458] +[ 3710.108459] process_one_work+0x1e2/0x3b0 +[ 3710.108466] ? rescuer_thread+0x390/0x390 +[ 3710.108468] worker_thread+0x50/0x3a0 +[ 3710.108471] ? rescuer_thread+0x390/0x390 +[ 3710.108473] kthread+0xdd/0x100 +[ 3710.108477] ? kthread_complete_and_exit+0x20/0x20 +[ 3710.108479] ret_from_fork+0x1f/0x30 +[ 3710.108485] +[ 3710.108486] ---[ end trace 1b4b23cd0c65d6a0 ]--- + +After patch: +[ 402.473064] ice 0000:41:00.0: Type was not set for devlink port. +[ 402.473064] ice 0000:41:00.1: Type was not set for devlink port. + +Signed-off-by: Petr Oros +Reviewed-by: Pavan Chebbi +Reviewed-by: Jakub Kicinski +Link: https://lore.kernel.org/r/20230615095447.8259-1-poros@redhat.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/core/devlink.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/net/core/devlink.c b/net/core/devlink.c +index db76c55e1a6d7..7113ae79f5228 100644 +--- a/net/core/devlink.c ++++ b/net/core/devlink.c +@@ -9055,7 +9055,10 @@ EXPORT_SYMBOL_GPL(devlink_free); + + static void devlink_port_type_warn(struct work_struct *work) + { +- WARN(true, "Type was not set for devlink port."); ++ struct devlink_port *port = container_of(to_delayed_work(work), ++ struct devlink_port, ++ type_warn_dw); ++ dev_warn(port->devlink->dev, "Type was not set for devlink port."); + } + + static bool devlink_port_type_should_warn(struct devlink_port *devlink_port) +-- +2.43.0 + diff --git a/queue-5.15/drm-amdgpu-init-iommu-after-amdkfd-device-init.patch b/queue-5.15/drm-amdgpu-init-iommu-after-amdkfd-device-init.patch new file mode 100644 index 00000000000..9359c6fa52f --- /dev/null +++ b/queue-5.15/drm-amdgpu-init-iommu-after-amdkfd-device-init.patch @@ -0,0 +1,59 @@ +From 704cf30bc7fdbf1cf65506ef65bcdc455c9f84de Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 28 Sep 2021 15:42:35 +0800 +Subject: drm/amdgpu: init iommu after amdkfd device init + +From: Yifan Zhang + +[ Upstream commit 286826d7d976e7646b09149d9bc2899d74ff962b ] + +This patch is to fix clinfo failure in Raven/Picasso: + +Number of platforms: 1 + Platform Profile: FULL_PROFILE + Platform Version: OpenCL 2.2 AMD-APP (3364.0) + Platform Name: AMD Accelerated Parallel Processing + Platform Vendor: Advanced Micro Devices, Inc. + Platform Extensions: cl_khr_icd cl_amd_event_callback + + Platform Name: AMD Accelerated Parallel Processing Number of devices: 0 + +Signed-off-by: Yifan Zhang +Reviewed-by: James Zhu +Tested-by: James Zhu +Acked-by: Felix Kuehling +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +index 5f6c32ec674d3..222a1d9ecf163 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +@@ -2487,10 +2487,6 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev) + if (r) + goto init_failed; + +- r = amdgpu_amdkfd_resume_iommu(adev); +- if (r) +- goto init_failed; +- + r = amdgpu_device_ip_hw_init_phase1(adev); + if (r) + goto init_failed; +@@ -2529,6 +2525,10 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev) + if (!adev->gmc.xgmi.pending_reset) + amdgpu_amdkfd_device_init(adev); + ++ r = amdgpu_amdkfd_resume_iommu(adev); ++ if (r) ++ goto init_failed; ++ + amdgpu_fru_get_product_info(adev); + + init_failed: +-- +2.43.0 + diff --git a/queue-5.15/drm-i915-dg1-update-dmc_debug3-register.patch b/queue-5.15/drm-i915-dg1-update-dmc_debug3-register.patch new file mode 100644 index 00000000000..209ba221fb5 --- /dev/null +++ b/queue-5.15/drm-i915-dg1-update-dmc_debug3-register.patch @@ -0,0 +1,62 @@ +From 24ad5867ee01b3ba866e2e67bbc0a72015bab962 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 11 Feb 2022 08:29:33 +0800 +Subject: drm/i915/dg1: Update DMC_DEBUG3 register + +From: Chuansheng Liu + +[ Upstream commit b60668cb4c57a7cc451de781ae49f5e9cc375eaf ] + +Current DMC_DEBUG3(_MMIO(0x101090)) address is for TGL, +it is wrong for DG1. Just like commit 5bcc95ca382e +("drm/i915/dg1: Update DMC_DEBUG register"), correct +this issue for DG1 platform to avoid wrong register +being read. + +BSpec: 49788 + +v2: fix "not wrong" typo. (Jani) + +Reviewed-by: Matt Roper +Cc: Jani Nikula +Signed-off-by: Chuansheng Liu +Signed-off-by: Matt Roper +Link: https://patchwork.freedesktop.org/patch/msgid/20220211002933.84240-1-chuansheng.liu@intel.com +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/i915/display/intel_display_debugfs.c | 4 ++-- + drivers/gpu/drm/i915/i915_reg.h | 3 ++- + 2 files changed, 4 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c +index b136a0fc0963b..6b3e2e053f457 100644 +--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c ++++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c +@@ -571,8 +571,8 @@ static int i915_dmc_info(struct seq_file *m, void *unused) + * reg for DC3CO debugging and validation, + * but TGL DMC f/w is using DMC_DEBUG3 reg for DC3CO counter. + */ +- seq_printf(m, "DC3CO count: %d\n", +- intel_de_read(dev_priv, DMC_DEBUG3)); ++ seq_printf(m, "DC3CO count: %d\n", intel_de_read(dev_priv, IS_DGFX(dev_priv) ? ++ DG1_DMC_DEBUG3 : TGL_DMC_DEBUG3)); + } else { + dc5_reg = IS_BROXTON(dev_priv) ? BXT_DMC_DC3_DC5_COUNT : + SKL_DMC_DC3_DC5_COUNT; +diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h +index 3c70aa5229e5a..906982d6370d0 100644 +--- a/drivers/gpu/drm/i915/i915_reg.h ++++ b/drivers/gpu/drm/i915/i915_reg.h +@@ -7841,7 +7841,8 @@ enum { + #define TGL_DMC_DEBUG_DC6_COUNT _MMIO(0x101088) + #define DG1_DMC_DEBUG_DC5_COUNT _MMIO(0x134154) + +-#define DMC_DEBUG3 _MMIO(0x101090) ++#define TGL_DMC_DEBUG3 _MMIO(0x101090) ++#define DG1_DMC_DEBUG3 _MMIO(0x13415c) + + /* Display Internal Timeout Register */ + #define RM_TIMEOUT _MMIO(0x42060) +-- +2.43.0 + diff --git a/queue-5.15/dt-bindings-clocks-imx8mp-add-id-for-usb-suspend-clo.patch b/queue-5.15/dt-bindings-clocks-imx8mp-add-id-for-usb-suspend-clo.patch new file mode 100644 index 00000000000..20fd30453f2 --- /dev/null +++ b/queue-5.15/dt-bindings-clocks-imx8mp-add-id-for-usb-suspend-clo.patch @@ -0,0 +1,41 @@ +From 252b974a0ea7e7bede2cb2674399fc5450ad01f6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 30 Sep 2022 22:54:21 +0800 +Subject: dt-bindings: clocks: imx8mp: Add ID for usb suspend clock + +From: Li Jun + +[ Upstream commit 5c1f7f1090947d494c30042123e0ec846f696336 ] + +usb suspend clock has a gate shared with usb_root_clk. + +Fixes: 9c140d9926761 ("clk: imx: Add support for i.MX8MP clock driver") +Cc: stable@vger.kernel.org # v5.19+ +Acked-by: Krzysztof Kozlowski +Tested-by: Alexander Stein +Signed-off-by: Li Jun +Signed-off-by: Abel Vesa +Link: https://lore.kernel.org/r/1664549663-20364-1-git-send-email-jun.li@nxp.com +Signed-off-by: Sasha Levin +--- + include/dt-bindings/clock/imx8mp-clock.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/include/dt-bindings/clock/imx8mp-clock.h b/include/dt-bindings/clock/imx8mp-clock.h +index a02fd723168cc..5e872b01d5ab8 100644 +--- a/include/dt-bindings/clock/imx8mp-clock.h ++++ b/include/dt-bindings/clock/imx8mp-clock.h +@@ -325,8 +325,9 @@ + #define IMX8MP_CLK_CLKOUT2_SEL 317 + #define IMX8MP_CLK_CLKOUT2_DIV 318 + #define IMX8MP_CLK_CLKOUT2 319 ++#define IMX8MP_CLK_USB_SUSP 320 + +-#define IMX8MP_CLK_END 320 ++#define IMX8MP_CLK_END 321 + + #define IMX8MP_CLK_AUDIOMIX_SAI1_IPG 0 + #define IMX8MP_CLK_AUDIOMIX_SAI1_MCLK1 1 +-- +2.43.0 + diff --git a/queue-5.15/exfat-support-dynamic-allocate-bh-for-exfat_entry_se.patch b/queue-5.15/exfat-support-dynamic-allocate-bh-for-exfat_entry_se.patch new file mode 100644 index 00000000000..df6c3e75e7d --- /dev/null +++ b/queue-5.15/exfat-support-dynamic-allocate-bh-for-exfat_entry_se.patch @@ -0,0 +1,90 @@ +From 6b678324962b37e715898cf9532bc689b6c210c2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Nov 2022 13:50:22 +0800 +Subject: exfat: support dynamic allocate bh for exfat_entry_set_cache + +From: Yuezhang Mo + +[ Upstream commit a3ff29a95fde16906304455aa8c0bd84eb770258 ] + +In special cases, a file or a directory may occupied more than 19 +directory entries, pre-allocating 3 bh is not enough. Such as + - Support vendor secondary directory entry in the future. + - Since file directory entry is damaged, the SecondaryCount + field is bigger than 18. + +So this commit supports dynamic allocation of bh. + +Signed-off-by: Yuezhang Mo +Reviewed-by: Andy Wu +Reviewed-by: Aoyama Wataru +Reviewed-by: Sungjong Seo +Signed-off-by: Namjae Jeon +Signed-off-by: Sasha Levin +--- + fs/exfat/dir.c | 15 +++++++++++++++ + fs/exfat/exfat_fs.h | 5 ++++- + 2 files changed, 19 insertions(+), 1 deletion(-) + +diff --git a/fs/exfat/dir.c b/fs/exfat/dir.c +index f6dd4fc8eaf45..be7570d01ae1a 100644 +--- a/fs/exfat/dir.c ++++ b/fs/exfat/dir.c +@@ -618,6 +618,10 @@ int exfat_free_dentry_set(struct exfat_entry_set_cache *es, int sync) + bforget(es->bh[i]); + else + brelse(es->bh[i]); ++ ++ if (IS_DYNAMIC_ES(es)) ++ kfree(es->bh); ++ + kfree(es); + return err; + } +@@ -853,6 +857,7 @@ struct exfat_entry_set_cache *exfat_get_dentry_set(struct super_block *sb, + /* byte offset in sector */ + off = EXFAT_BLK_OFFSET(byte_offset, sb); + es->start_off = off; ++ es->bh = es->__bh; + + /* sector offset in cluster */ + sec = EXFAT_B_TO_BLK(byte_offset, sb); +@@ -872,6 +877,16 @@ struct exfat_entry_set_cache *exfat_get_dentry_set(struct super_block *sb, + es->num_entries = num_entries; + + num_bh = EXFAT_B_TO_BLK_ROUND_UP(off + num_entries * DENTRY_SIZE, sb); ++ if (num_bh > ARRAY_SIZE(es->__bh)) { ++ es->bh = kmalloc_array(num_bh, sizeof(*es->bh), GFP_KERNEL); ++ if (!es->bh) { ++ brelse(bh); ++ kfree(es); ++ return NULL; ++ } ++ es->bh[0] = bh; ++ } ++ + for (i = 1; i < num_bh; i++) { + /* get the next sector */ + if (exfat_is_last_sector_in_cluster(sbi, sec)) { +diff --git a/fs/exfat/exfat_fs.h b/fs/exfat/exfat_fs.h +index db538709dafa0..58816ee3162c4 100644 +--- a/fs/exfat/exfat_fs.h ++++ b/fs/exfat/exfat_fs.h +@@ -170,10 +170,13 @@ struct exfat_entry_set_cache { + bool modified; + unsigned int start_off; + int num_bh; +- struct buffer_head *bh[DIR_CACHE_SIZE]; ++ struct buffer_head *__bh[DIR_CACHE_SIZE]; ++ struct buffer_head **bh; + unsigned int num_entries; + }; + ++#define IS_DYNAMIC_ES(es) ((es)->__bh != (es)->bh) ++ + struct exfat_dir_entry { + struct exfat_chain dir; + int entry; +-- +2.43.0 + diff --git a/queue-5.15/f2fs-don-t-set-gc_failure_pin-for-background-gc.patch b/queue-5.15/f2fs-don-t-set-gc_failure_pin-for-background-gc.patch new file mode 100644 index 00000000000..275a54321a0 --- /dev/null +++ b/queue-5.15/f2fs-don-t-set-gc_failure_pin-for-background-gc.patch @@ -0,0 +1,36 @@ +From deb9c092838edb37446d8f263f28f7a0cfceabbc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 20 Mar 2022 23:11:18 +0800 +Subject: f2fs: don't set GC_FAILURE_PIN for background GC + +From: Chao Yu + +[ Upstream commit 642c0969916eaa4878cb74f36752108e590b0389 ] + +So that it can reduce the possibility that file be unpinned forcely by +foreground GC due to .i_gc_failures[GC_FAILURE_PIN] exceeds threshold. + +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/gc.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c +index 7010440cb64c8..d016504fad4b9 100644 +--- a/fs/f2fs/gc.c ++++ b/fs/f2fs/gc.c +@@ -1199,7 +1199,8 @@ static int move_data_block(struct inode *inode, block_t bidx, + } + + if (f2fs_is_pinned_file(inode)) { +- f2fs_pin_file_control(inode, true); ++ if (gc_type == FG_GC) ++ f2fs_pin_file_control(inode, true); + err = -EAGAIN; + goto out; + } +-- +2.43.0 + diff --git a/queue-5.15/f2fs-write-checkpoint-during-fg_gc.patch b/queue-5.15/f2fs-write-checkpoint-during-fg_gc.patch new file mode 100644 index 00000000000..6d6a7f568e7 --- /dev/null +++ b/queue-5.15/f2fs-write-checkpoint-during-fg_gc.patch @@ -0,0 +1,75 @@ +From cbec888db6f1c04d06395d0f9f32fb5c4de3e470 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Apr 2022 13:29:53 -0700 +Subject: f2fs: write checkpoint during FG_GC + +From: Byungki Lee + +[ Upstream commit a9163b947ae8f7af7cb8d63606cd87b9facbfe74 ] + +If there's not enough free sections each of which consistis of large segments, +we can hit no free section for upcoming section allocation. Let's reclaim some +prefree segments by writing checkpoints. + +Signed-off-by: Byungki Lee +Reviewed-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/gc.c | 38 +++++++++++++++++++++++--------------- + 1 file changed, 23 insertions(+), 15 deletions(-) + +diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c +index d016504fad4b9..2c13f308c74e3 100644 +--- a/fs/f2fs/gc.c ++++ b/fs/f2fs/gc.c +@@ -1782,23 +1782,31 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, + if (sync) + goto stop; + +- if (has_not_enough_free_secs(sbi, sec_freed, 0)) { +- if (skipped_round <= MAX_SKIP_GC_COUNT || +- skipped_round * 2 < round) { +- segno = NULL_SEGNO; +- goto gc_more; +- } ++ if (!has_not_enough_free_secs(sbi, sec_freed, 0)) ++ goto stop; + +- if (first_skipped < last_skipped && +- (last_skipped - first_skipped) > +- sbi->skipped_gc_rwsem) { +- f2fs_drop_inmem_pages_all(sbi, true); +- segno = NULL_SEGNO; +- goto gc_more; +- } +- if (gc_type == FG_GC && !is_sbi_flag_set(sbi, SBI_CP_DISABLED)) ++ if (skipped_round <= MAX_SKIP_GC_COUNT || skipped_round * 2 < round) { ++ ++ /* Write checkpoint to reclaim prefree segments */ ++ if (free_sections(sbi) < NR_CURSEG_PERSIST_TYPE && ++ prefree_segments(sbi) && ++ !is_sbi_flag_set(sbi, SBI_CP_DISABLED)) { + ret = f2fs_write_checkpoint(sbi, &cpc); +- } ++ if (ret) ++ goto stop; ++ } ++ segno = NULL_SEGNO; ++ goto gc_more; ++ } ++ if (first_skipped < last_skipped && ++ (last_skipped - first_skipped) > ++ sbi->skipped_gc_rwsem) { ++ f2fs_drop_inmem_pages_all(sbi, true); ++ segno = NULL_SEGNO; ++ goto gc_more; ++ } ++ if (gc_type == FG_GC && !is_sbi_flag_set(sbi, SBI_CP_DISABLED)) ++ ret = f2fs_write_checkpoint(sbi, &cpc); + stop: + SIT_I(sbi)->last_victim[ALLOC_NEXT] = 0; + SIT_I(sbi)->last_victim[FLUSH_DEVICE] = init_segno; +-- +2.43.0 + diff --git a/queue-5.15/igb-fix-igb_down-hung-on-surprise-removal.patch b/queue-5.15/igb-fix-igb_down-hung-on-surprise-removal.patch new file mode 100644 index 00000000000..91b85be7e4b --- /dev/null +++ b/queue-5.15/igb-fix-igb_down-hung-on-surprise-removal.patch @@ -0,0 +1,89 @@ +From 2ce1f1d27bfa7829100bccf9c0c4e0ddf66e76d9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 20 Jun 2023 10:47:32 -0700 +Subject: igb: Fix igb_down hung on surprise removal + +From: Ying Hsu + +[ Upstream commit 004d25060c78fc31f66da0fa439c544dda1ac9d5 ] + +In a setup where a Thunderbolt hub connects to Ethernet and a display +through USB Type-C, users may experience a hung task timeout when they +remove the cable between the PC and the Thunderbolt hub. +This is because the igb_down function is called multiple times when +the Thunderbolt hub is unplugged. For example, the igb_io_error_detected +triggers the first call, and the igb_remove triggers the second call. +The second call to igb_down will block at napi_synchronize. +Here's the call trace: + __schedule+0x3b0/0xddb + ? __mod_timer+0x164/0x5d3 + schedule+0x44/0xa8 + schedule_timeout+0xb2/0x2a4 + ? run_local_timers+0x4e/0x4e + msleep+0x31/0x38 + igb_down+0x12c/0x22a [igb 6615058754948bfde0bf01429257eb59f13030d4] + __igb_close+0x6f/0x9c [igb 6615058754948bfde0bf01429257eb59f13030d4] + igb_close+0x23/0x2b [igb 6615058754948bfde0bf01429257eb59f13030d4] + __dev_close_many+0x95/0xec + dev_close_many+0x6e/0x103 + unregister_netdevice_many+0x105/0x5b1 + unregister_netdevice_queue+0xc2/0x10d + unregister_netdev+0x1c/0x23 + igb_remove+0xa7/0x11c [igb 6615058754948bfde0bf01429257eb59f13030d4] + pci_device_remove+0x3f/0x9c + device_release_driver_internal+0xfe/0x1b4 + pci_stop_bus_device+0x5b/0x7f + pci_stop_bus_device+0x30/0x7f + pci_stop_bus_device+0x30/0x7f + pci_stop_and_remove_bus_device+0x12/0x19 + pciehp_unconfigure_device+0x76/0xe9 + pciehp_disable_slot+0x6e/0x131 + pciehp_handle_presence_or_link_change+0x7a/0x3f7 + pciehp_ist+0xbe/0x194 + irq_thread_fn+0x22/0x4d + ? irq_thread+0x1fd/0x1fd + irq_thread+0x17b/0x1fd + ? irq_forced_thread_fn+0x5f/0x5f + kthread+0x142/0x153 + ? __irq_get_irqchip_state+0x46/0x46 + ? kthread_associate_blkcg+0x71/0x71 + ret_from_fork+0x1f/0x30 + +In this case, igb_io_error_detected detaches the network interface +and requests a PCIE slot reset, however, the PCIE reset callback is +not being invoked and thus the Ethernet connection breaks down. +As the PCIE error in this case is a non-fatal one, requesting a +slot reset can be avoided. +This patch fixes the task hung issue and preserves Ethernet +connection by ignoring non-fatal PCIE errors. + +Signed-off-by: Ying Hsu +Tested-by: Pucha Himasekhar Reddy (A Contingent worker at Intel) +Signed-off-by: Tony Nguyen +Reviewed-by: Simon Horman +Link: https://lore.kernel.org/r/20230620174732.4145155-1-anthony.l.nguyen@intel.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/igb/igb_main.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c +index c01114cabbb09..7c42a99be5065 100644 +--- a/drivers/net/ethernet/intel/igb/igb_main.c ++++ b/drivers/net/ethernet/intel/igb/igb_main.c +@@ -9451,6 +9451,11 @@ static pci_ers_result_t igb_io_error_detected(struct pci_dev *pdev, + struct net_device *netdev = pci_get_drvdata(pdev); + struct igb_adapter *adapter = netdev_priv(netdev); + ++ if (state == pci_channel_io_normal) { ++ dev_warn(&pdev->dev, "Non-correctable non-fatal error reported.\n"); ++ return PCI_ERS_RESULT_CAN_RECOVER; ++ } ++ + netif_device_detach(netdev); + + if (state == pci_channel_io_perm_failure) +-- +2.43.0 + diff --git a/queue-5.15/input-ads7846-always-set-last-command-to-pwrdown.patch b/queue-5.15/input-ads7846-always-set-last-command-to-pwrdown.patch new file mode 100644 index 00000000000..69828238c19 --- /dev/null +++ b/queue-5.15/input-ads7846-always-set-last-command-to-pwrdown.patch @@ -0,0 +1,59 @@ +From 049a75f6cf04997f3930d42b845108bca6330aa2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 26 Jan 2023 11:52:26 +0100 +Subject: Input: ads7846 - always set last command to PWRDOWN + +From: Luca Ellero + +[ Upstream commit 13f82ca3878db8284a70ef9711d7f710a31eb562 ] + +Controllers that report pressure (e.g. ADS7846) use 5 commands and the +correct sequence is READ_X, READ_Y, READ_Z1, READ_Z2, PWRDOWN. + +Controllers that don't report pressure (e.g. ADS7845/ADS7843) use only 3 +commands and the correct sequence should be READ_X, READ_Y, PWRDOWN. But +the sequence sent was incorrect: READ_X, READ_Y, READ_Z1. + +Fix this by setting the third (and last) command to PWRDOWN. + +Fixes: ffa458c1bd9b ("spi: ads7846 driver") +Signed-off-by: Luca Ellero +Reviewed-by: Andy Shevchenko +Link: https://lore.kernel.org/r/20230126105227.47648-3-l.ellero@asem.it +Signed-off-by: Dmitry Torokhov +Signed-off-by: Sasha Levin +--- + drivers/input/touchscreen/ads7846.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c +index ef04988edf0c2..f416a4bcd72bf 100644 +--- a/drivers/input/touchscreen/ads7846.c ++++ b/drivers/input/touchscreen/ads7846.c +@@ -1074,6 +1074,9 @@ static int ads7846_setup_spi_msg(struct ads7846 *ts, + struct ads7846_buf_layout *l = &packet->l[cmd_idx]; + unsigned int max_count; + ++ if (cmd_idx == packet->cmds - 1) ++ cmd_idx = ADS7846_PWDOWN; ++ + if (ads7846_cmd_need_settle(cmd_idx)) + max_count = packet->count + packet->count_skip; + else +@@ -1110,7 +1113,12 @@ static int ads7846_setup_spi_msg(struct ads7846 *ts, + + for (cmd_idx = 0; cmd_idx < packet->cmds; cmd_idx++) { + struct ads7846_buf_layout *l = &packet->l[cmd_idx]; +- u8 cmd = ads7846_get_cmd(cmd_idx, vref); ++ u8 cmd; ++ ++ if (cmd_idx == packet->cmds - 1) ++ cmd_idx = ADS7846_PWDOWN; ++ ++ cmd = ads7846_get_cmd(cmd_idx, vref); + + for (b = 0; b < l->count; b++) + packet->tx[l->offset + b].cmd = cmd; +-- +2.43.0 + diff --git a/queue-5.15/input-ads7846-don-t-check-penirq-immediately-for-784.patch b/queue-5.15/input-ads7846-don-t-check-penirq-immediately-for-784.patch new file mode 100644 index 00000000000..fc18e16f329 --- /dev/null +++ b/queue-5.15/input-ads7846-don-t-check-penirq-immediately-for-784.patch @@ -0,0 +1,46 @@ +From 29cc791be466f52f9bd3e06cd0d43c7a4e7ccdab Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 26 Jan 2023 11:52:27 +0100 +Subject: Input: ads7846 - don't check penirq immediately for 7845 + +From: Luca Ellero + +[ Upstream commit fa9f4275b20ec7b2a8fb05c66362d10b36f9efec ] + +To discard false readings, one should use "ti,penirq-recheck-delay-usecs". +Checking get_pendown_state() at the beginning, most of the time fails +causing malfunctioning. + +Fixes: ffa458c1bd9b ("spi: ads7846 driver") +Signed-off-by: Luca Ellero +Reviewed-by: Andy Shevchenko +Link: https://lore.kernel.org/r/20230126105227.47648-4-l.ellero@asem.it +Signed-off-by: Dmitry Torokhov +Signed-off-by: Sasha Levin +--- + drivers/input/touchscreen/ads7846.c | 8 +------- + 1 file changed, 1 insertion(+), 7 deletions(-) + +diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c +index f416a4bcd72bf..1db61185f7bec 100644 +--- a/drivers/input/touchscreen/ads7846.c ++++ b/drivers/input/touchscreen/ads7846.c +@@ -851,14 +851,8 @@ static void ads7846_report_state(struct ads7846 *ts) + if (x == MAX_12BIT) + x = 0; + +- if (ts->model == 7843) { ++ if (ts->model == 7843 || ts->model == 7845) { + Rt = ts->pressure_max / 2; +- } else if (ts->model == 7845) { +- if (get_pendown_state(ts)) +- Rt = ts->pressure_max / 2; +- else +- Rt = 0; +- dev_vdbg(&ts->spi->dev, "x/y: %d/%d, PD %d\n", x, y, Rt); + } else if (likely(x && z1)) { + /* compute touch pressure resistance using equation #2 */ + Rt = z2; +-- +2.43.0 + diff --git a/queue-5.15/input-ads7846-don-t-report-pressure-for-ads7845.patch b/queue-5.15/input-ads7846-don-t-report-pressure-for-ads7845.patch new file mode 100644 index 00000000000..40c5889f9ed --- /dev/null +++ b/queue-5.15/input-ads7846-don-t-report-pressure-for-ads7845.patch @@ -0,0 +1,42 @@ +From 52eaada1883797a6a88ec296e44a78203960aba7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 26 Jan 2023 11:52:25 +0100 +Subject: Input: ads7846 - don't report pressure for ads7845 + +From: Luca Ellero + +[ Upstream commit d50584d783313c8b05b84d0b07a2142f1bde46dd ] + +ADS7845 doesn't support pressure. +Avoid the following error reported by libinput-list-devices: +"ADS7845 Touchscreen: kernel bug: device has min == max on ABS_PRESSURE". + +Fixes: ffa458c1bd9b ("spi: ads7846 driver") +Signed-off-by: Luca Ellero +Reviewed-by: Andy Shevchenko +Link: https://lore.kernel.org/r/20230126105227.47648-2-l.ellero@asem.it +Signed-off-by: Dmitry Torokhov +Signed-off-by: Sasha Levin +--- + drivers/input/touchscreen/ads7846.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c +index f113a27aeb1ef..ef04988edf0c2 100644 +--- a/drivers/input/touchscreen/ads7846.c ++++ b/drivers/input/touchscreen/ads7846.c +@@ -1323,8 +1323,9 @@ static int ads7846_probe(struct spi_device *spi) + pdata->y_min ? : 0, + pdata->y_max ? : MAX_12BIT, + 0, 0); +- input_set_abs_params(input_dev, ABS_PRESSURE, +- pdata->pressure_min, pdata->pressure_max, 0, 0); ++ if (ts->model != 7845) ++ input_set_abs_params(input_dev, ABS_PRESSURE, ++ pdata->pressure_min, pdata->pressure_max, 0, 0); + + /* + * Parse common framework properties. Must be done here to ensure the +-- +2.43.0 + diff --git a/queue-5.15/input-iqs269a-configure-device-with-a-single-block-w.patch b/queue-5.15/input-iqs269a-configure-device-with-a-single-block-w.patch new file mode 100644 index 00000000000..926fc00542c --- /dev/null +++ b/queue-5.15/input-iqs269a-configure-device-with-a-single-block-w.patch @@ -0,0 +1,315 @@ +From 330a5cfa1787909a2a6ae09537770f260bf6bf08 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 3 Jan 2023 11:59:12 -0600 +Subject: Input: iqs269a - configure device with a single block write + +From: Jeff LaBundy + +[ Upstream commit 3689abfc4e369a643d758a02fb9ad0b2403d6d6d ] + +Unless it is being done as part of servicing a soft reset interrupt, +configuring channels on-the-fly (as is the case when writing to the +ati_trigger attribute) may cause GPIO3 (which reflects the state of +touch for a selected channel) to be inadvertently asserted. + +To solve this problem, follow the vendor's recommendation and write +all channel configuration as well as the REDO_ATI register field as +part of a single block write. This ensures the device has been told +to re-calibrate itself following an I2C stop condition, after which +sensing resumes and GPIO3 may be asserted. + +Fixes: 04e49867fad1 ("Input: add support for Azoteq IQS269A") +Signed-off-by: Jeff LaBundy +Reviewed-by: Mattijs Korpershoek +Link: https://lore.kernel.org/r/Y7Rs8GyV7g0nF5Yy@nixie71 +Signed-off-by: Dmitry Torokhov +Signed-off-by: Sasha Levin +--- + drivers/input/misc/iqs269a.c | 98 ++++++++++++++---------------------- + 1 file changed, 39 insertions(+), 59 deletions(-) + +diff --git a/drivers/input/misc/iqs269a.c b/drivers/input/misc/iqs269a.c +index ea3c97c5f764f..2124d08c55b79 100644 +--- a/drivers/input/misc/iqs269a.c ++++ b/drivers/input/misc/iqs269a.c +@@ -96,8 +96,6 @@ + #define IQS269_MISC_B_TRACKING_UI_ENABLE BIT(4) + #define IQS269_MISC_B_FILT_STR_SLIDER GENMASK(1, 0) + +-#define IQS269_CHx_SETTINGS 0x8C +- + #define IQS269_CHx_ENG_A_MEAS_CAP_SIZE BIT(15) + #define IQS269_CHx_ENG_A_RX_GND_INACTIVE BIT(13) + #define IQS269_CHx_ENG_A_LOCAL_CAP_SIZE BIT(12) +@@ -245,6 +243,18 @@ struct iqs269_ver_info { + u8 padding; + } __packed; + ++struct iqs269_ch_reg { ++ u8 rx_enable; ++ u8 tx_enable; ++ __be16 engine_a; ++ __be16 engine_b; ++ __be16 ati_comp; ++ u8 thresh[3]; ++ u8 hyst; ++ u8 assoc_select; ++ u8 assoc_weight; ++} __packed; ++ + struct iqs269_sys_reg { + __be16 general; + u8 active; +@@ -266,18 +276,7 @@ struct iqs269_sys_reg { + u8 timeout_swipe; + u8 thresh_swipe; + u8 redo_ati; +-} __packed; +- +-struct iqs269_ch_reg { +- u8 rx_enable; +- u8 tx_enable; +- __be16 engine_a; +- __be16 engine_b; +- __be16 ati_comp; +- u8 thresh[3]; +- u8 hyst; +- u8 assoc_select; +- u8 assoc_weight; ++ struct iqs269_ch_reg ch_reg[IQS269_NUM_CH]; + } __packed; + + struct iqs269_flags { +@@ -292,7 +291,6 @@ struct iqs269_private { + struct regmap *regmap; + struct mutex lock; + struct iqs269_switch_desc switches[ARRAY_SIZE(iqs269_events)]; +- struct iqs269_ch_reg ch_reg[IQS269_NUM_CH]; + struct iqs269_sys_reg sys_reg; + struct input_dev *keypad; + struct input_dev *slider[IQS269_NUM_SL]; +@@ -307,6 +305,7 @@ struct iqs269_private { + static int iqs269_ati_mode_set(struct iqs269_private *iqs269, + unsigned int ch_num, unsigned int mode) + { ++ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; + u16 engine_a; + + if (ch_num >= IQS269_NUM_CH) +@@ -317,12 +316,12 @@ static int iqs269_ati_mode_set(struct iqs269_private *iqs269, + + mutex_lock(&iqs269->lock); + +- engine_a = be16_to_cpu(iqs269->ch_reg[ch_num].engine_a); ++ engine_a = be16_to_cpu(ch_reg[ch_num].engine_a); + + engine_a &= ~IQS269_CHx_ENG_A_ATI_MODE_MASK; + engine_a |= (mode << IQS269_CHx_ENG_A_ATI_MODE_SHIFT); + +- iqs269->ch_reg[ch_num].engine_a = cpu_to_be16(engine_a); ++ ch_reg[ch_num].engine_a = cpu_to_be16(engine_a); + iqs269->ati_current = false; + + mutex_unlock(&iqs269->lock); +@@ -333,13 +332,14 @@ static int iqs269_ati_mode_set(struct iqs269_private *iqs269, + static int iqs269_ati_mode_get(struct iqs269_private *iqs269, + unsigned int ch_num, unsigned int *mode) + { ++ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; + u16 engine_a; + + if (ch_num >= IQS269_NUM_CH) + return -EINVAL; + + mutex_lock(&iqs269->lock); +- engine_a = be16_to_cpu(iqs269->ch_reg[ch_num].engine_a); ++ engine_a = be16_to_cpu(ch_reg[ch_num].engine_a); + mutex_unlock(&iqs269->lock); + + engine_a &= IQS269_CHx_ENG_A_ATI_MODE_MASK; +@@ -351,6 +351,7 @@ static int iqs269_ati_mode_get(struct iqs269_private *iqs269, + static int iqs269_ati_base_set(struct iqs269_private *iqs269, + unsigned int ch_num, unsigned int base) + { ++ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; + u16 engine_b; + + if (ch_num >= IQS269_NUM_CH) +@@ -379,12 +380,12 @@ static int iqs269_ati_base_set(struct iqs269_private *iqs269, + + mutex_lock(&iqs269->lock); + +- engine_b = be16_to_cpu(iqs269->ch_reg[ch_num].engine_b); ++ engine_b = be16_to_cpu(ch_reg[ch_num].engine_b); + + engine_b &= ~IQS269_CHx_ENG_B_ATI_BASE_MASK; + engine_b |= base; + +- iqs269->ch_reg[ch_num].engine_b = cpu_to_be16(engine_b); ++ ch_reg[ch_num].engine_b = cpu_to_be16(engine_b); + iqs269->ati_current = false; + + mutex_unlock(&iqs269->lock); +@@ -395,13 +396,14 @@ static int iqs269_ati_base_set(struct iqs269_private *iqs269, + static int iqs269_ati_base_get(struct iqs269_private *iqs269, + unsigned int ch_num, unsigned int *base) + { ++ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; + u16 engine_b; + + if (ch_num >= IQS269_NUM_CH) + return -EINVAL; + + mutex_lock(&iqs269->lock); +- engine_b = be16_to_cpu(iqs269->ch_reg[ch_num].engine_b); ++ engine_b = be16_to_cpu(ch_reg[ch_num].engine_b); + mutex_unlock(&iqs269->lock); + + switch (engine_b & IQS269_CHx_ENG_B_ATI_BASE_MASK) { +@@ -429,6 +431,7 @@ static int iqs269_ati_base_get(struct iqs269_private *iqs269, + static int iqs269_ati_target_set(struct iqs269_private *iqs269, + unsigned int ch_num, unsigned int target) + { ++ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; + u16 engine_b; + + if (ch_num >= IQS269_NUM_CH) +@@ -439,12 +442,12 @@ static int iqs269_ati_target_set(struct iqs269_private *iqs269, + + mutex_lock(&iqs269->lock); + +- engine_b = be16_to_cpu(iqs269->ch_reg[ch_num].engine_b); ++ engine_b = be16_to_cpu(ch_reg[ch_num].engine_b); + + engine_b &= ~IQS269_CHx_ENG_B_ATI_TARGET_MASK; + engine_b |= target / 32; + +- iqs269->ch_reg[ch_num].engine_b = cpu_to_be16(engine_b); ++ ch_reg[ch_num].engine_b = cpu_to_be16(engine_b); + iqs269->ati_current = false; + + mutex_unlock(&iqs269->lock); +@@ -455,13 +458,14 @@ static int iqs269_ati_target_set(struct iqs269_private *iqs269, + static int iqs269_ati_target_get(struct iqs269_private *iqs269, + unsigned int ch_num, unsigned int *target) + { ++ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; + u16 engine_b; + + if (ch_num >= IQS269_NUM_CH) + return -EINVAL; + + mutex_lock(&iqs269->lock); +- engine_b = be16_to_cpu(iqs269->ch_reg[ch_num].engine_b); ++ engine_b = be16_to_cpu(ch_reg[ch_num].engine_b); + mutex_unlock(&iqs269->lock); + + *target = (engine_b & IQS269_CHx_ENG_B_ATI_TARGET_MASK) * 32; +@@ -531,13 +535,7 @@ static int iqs269_parse_chan(struct iqs269_private *iqs269, + if (fwnode_property_present(ch_node, "azoteq,slider1-select")) + iqs269->sys_reg.slider_select[1] |= BIT(reg); + +- ch_reg = &iqs269->ch_reg[reg]; +- +- error = regmap_raw_read(iqs269->regmap, +- IQS269_CHx_SETTINGS + reg * sizeof(*ch_reg) / 2, +- ch_reg, sizeof(*ch_reg)); +- if (error) +- return error; ++ ch_reg = &iqs269->sys_reg.ch_reg[reg]; + + error = iqs269_parse_mask(ch_node, "azoteq,rx-enable", + &ch_reg->rx_enable); +@@ -1042,10 +1040,8 @@ static int iqs269_parse_prop(struct iqs269_private *iqs269) + + static int iqs269_dev_init(struct iqs269_private *iqs269) + { +- struct iqs269_sys_reg *sys_reg = &iqs269->sys_reg; +- struct iqs269_ch_reg *ch_reg; + unsigned int val; +- int error, i; ++ int error; + + mutex_lock(&iqs269->lock); + +@@ -1055,27 +1051,8 @@ static int iqs269_dev_init(struct iqs269_private *iqs269) + if (error) + goto err_mutex; + +- for (i = 0; i < IQS269_NUM_CH; i++) { +- if (!(sys_reg->active & BIT(i))) +- continue; +- +- ch_reg = &iqs269->ch_reg[i]; +- +- error = regmap_raw_write(iqs269->regmap, +- IQS269_CHx_SETTINGS + i * +- sizeof(*ch_reg) / 2, ch_reg, +- sizeof(*ch_reg)); +- if (error) +- goto err_mutex; +- } +- +- /* +- * The REDO-ATI and ATI channel selection fields must be written in the +- * same block write, so every field between registers 0x80 through 0x8B +- * (inclusive) must be written as well. +- */ +- error = regmap_raw_write(iqs269->regmap, IQS269_SYS_SETTINGS, sys_reg, +- sizeof(*sys_reg)); ++ error = regmap_raw_write(iqs269->regmap, IQS269_SYS_SETTINGS, ++ &iqs269->sys_reg, sizeof(iqs269->sys_reg)); + if (error) + goto err_mutex; + +@@ -1349,6 +1326,7 @@ static ssize_t hall_bin_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct iqs269_private *iqs269 = dev_get_drvdata(dev); ++ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; + struct i2c_client *client = iqs269->client; + unsigned int val; + int error; +@@ -1363,8 +1341,8 @@ static ssize_t hall_bin_show(struct device *dev, + if (error) + return error; + +- switch (iqs269->ch_reg[IQS269_CHx_HALL_ACTIVE].rx_enable & +- iqs269->ch_reg[IQS269_CHx_HALL_INACTIVE].rx_enable) { ++ switch (ch_reg[IQS269_CHx_HALL_ACTIVE].rx_enable & ++ ch_reg[IQS269_CHx_HALL_INACTIVE].rx_enable) { + case IQS269_HALL_PAD_R: + val &= IQS269_CAL_DATA_A_HALL_BIN_R_MASK; + val >>= IQS269_CAL_DATA_A_HALL_BIN_R_SHIFT; +@@ -1444,9 +1422,10 @@ static ssize_t rx_enable_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct iqs269_private *iqs269 = dev_get_drvdata(dev); ++ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; + + return scnprintf(buf, PAGE_SIZE, "%u\n", +- iqs269->ch_reg[iqs269->ch_num].rx_enable); ++ ch_reg[iqs269->ch_num].rx_enable); + } + + static ssize_t rx_enable_store(struct device *dev, +@@ -1454,6 +1433,7 @@ static ssize_t rx_enable_store(struct device *dev, + size_t count) + { + struct iqs269_private *iqs269 = dev_get_drvdata(dev); ++ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; + unsigned int val; + int error; + +@@ -1466,7 +1446,7 @@ static ssize_t rx_enable_store(struct device *dev, + + mutex_lock(&iqs269->lock); + +- iqs269->ch_reg[iqs269->ch_num].rx_enable = val; ++ ch_reg[iqs269->ch_num].rx_enable = val; + iqs269->ati_current = false; + + mutex_unlock(&iqs269->lock); +-- +2.43.0 + diff --git a/queue-5.15/input-iqs269a-do-not-poll-during-ati.patch b/queue-5.15/input-iqs269a-do-not-poll-during-ati.patch new file mode 100644 index 00000000000..415ad939bb9 --- /dev/null +++ b/queue-5.15/input-iqs269a-do-not-poll-during-ati.patch @@ -0,0 +1,285 @@ +From 5bde09e64e35ca9aded2782b0ae49c37db1efac1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 3 Jan 2023 11:59:35 -0600 +Subject: Input: iqs269a - do not poll during ATI + +From: Jeff LaBundy + +[ Upstream commit b08134eb254db56e9ce8170d9b82f0d7a616b6f8 ] + +After initial start-up, the driver triggers ATI (calibration) with +the newly loaded register configuration in place. Next, the driver +polls a register field to ensure ATI completed in a timely fashion +and that the device is ready to sense. + +However, communicating with the device over I2C while ATI is under- +way may induce noise in the device and cause ATI to fail. As such, +the vendor recommends not to poll the device during ATI. + +To solve this problem, let the device naturally signal to the host +that ATI is complete by way of an interrupt. A completion prevents +the device from successfully probing until this happens. + +As an added benefit, initial switch states are now reported in the +interrupt handler at the same time ATI status is checked. As such, +duplicate code that reports initial switch states has been removed +from iqs269_input_init(). + +The former logic that scaled ATI timeout and filter settling delay +is not carried forward with the new implementation, as it produces +overly conservative delays at the lower clock rate. + +Rather, a single timeout that covers both clock rates is used. The +filter settling delay does not happen to be necessary and has been +removed as well. + +Fixes: 04e49867fad1 ("Input: add support for Azoteq IQS269A") +Signed-off-by: Jeff LaBundy +Reviewed-by: Mattijs Korpershoek +Link: https://lore.kernel.org/r/Y7RtB2T7AF9rYMjK@nixie71 +Signed-off-by: Dmitry Torokhov +Signed-off-by: Sasha Levin +--- + drivers/input/misc/iqs269a.c | 97 +++++++++++++++++------------------- + 1 file changed, 46 insertions(+), 51 deletions(-) + +diff --git a/drivers/input/misc/iqs269a.c b/drivers/input/misc/iqs269a.c +index ff6cbc2f5d76c..f4c3aff3895bc 100644 +--- a/drivers/input/misc/iqs269a.c ++++ b/drivers/input/misc/iqs269a.c +@@ -9,6 +9,7 @@ + * axial sliders presented by the device. + */ + ++#include + #include + #include + #include +@@ -144,10 +145,6 @@ + #define IQS269_NUM_CH 8 + #define IQS269_NUM_SL 2 + +-#define IQS269_ATI_POLL_SLEEP_US (iqs269->delay_mult * 10000) +-#define IQS269_ATI_POLL_TIMEOUT_US (iqs269->delay_mult * 500000) +-#define IQS269_ATI_STABLE_DELAY_MS (iqs269->delay_mult * 150) +- + #define iqs269_irq_wait() usleep_range(200, 250) + + enum iqs269_local_cap_size { +@@ -289,10 +286,10 @@ struct iqs269_private { + struct mutex lock; + struct iqs269_switch_desc switches[ARRAY_SIZE(iqs269_events)]; + struct iqs269_sys_reg sys_reg; ++ struct completion ati_done; + struct input_dev *keypad; + struct input_dev *slider[IQS269_NUM_SL]; + unsigned int keycode[ARRAY_SIZE(iqs269_events) * IQS269_NUM_CH]; +- unsigned int delay_mult; + unsigned int ch_num; + bool hall_enable; + bool ati_current; +@@ -973,13 +970,8 @@ static int iqs269_parse_prop(struct iqs269_private *iqs269) + + general = be16_to_cpu(sys_reg->general); + +- if (device_property_present(&client->dev, "azoteq,clk-div")) { ++ if (device_property_present(&client->dev, "azoteq,clk-div")) + general |= IQS269_SYS_SETTINGS_CLK_DIV; +- iqs269->delay_mult = 4; +- } else { +- general &= ~IQS269_SYS_SETTINGS_CLK_DIV; +- iqs269->delay_mult = 1; +- } + + /* + * Configure the device to automatically switch between normal and low- +@@ -1036,7 +1028,6 @@ static int iqs269_parse_prop(struct iqs269_private *iqs269) + + static int iqs269_dev_init(struct iqs269_private *iqs269) + { +- unsigned int val; + int error; + + mutex_lock(&iqs269->lock); +@@ -1052,14 +1043,12 @@ static int iqs269_dev_init(struct iqs269_private *iqs269) + if (error) + goto err_mutex; + +- error = regmap_read_poll_timeout(iqs269->regmap, IQS269_SYS_FLAGS, val, +- !(val & IQS269_SYS_FLAGS_IN_ATI), +- IQS269_ATI_POLL_SLEEP_US, +- IQS269_ATI_POLL_TIMEOUT_US); +- if (error) +- goto err_mutex; ++ /* ++ * The following delay gives the device time to deassert its RDY output ++ * so as to prevent an interrupt from being serviced prematurely. ++ */ ++ usleep_range(2000, 2100); + +- msleep(IQS269_ATI_STABLE_DELAY_MS); + iqs269->ati_current = true; + + err_mutex: +@@ -1071,10 +1060,8 @@ static int iqs269_dev_init(struct iqs269_private *iqs269) + static int iqs269_input_init(struct iqs269_private *iqs269) + { + struct i2c_client *client = iqs269->client; +- struct iqs269_flags flags; + unsigned int sw_code, keycode; + int error, i, j; +- u8 dir_mask, state; + + iqs269->keypad = devm_input_allocate_device(&client->dev); + if (!iqs269->keypad) +@@ -1087,23 +1074,7 @@ static int iqs269_input_init(struct iqs269_private *iqs269) + iqs269->keypad->name = "iqs269a_keypad"; + iqs269->keypad->id.bustype = BUS_I2C; + +- if (iqs269->hall_enable) { +- error = regmap_raw_read(iqs269->regmap, IQS269_SYS_FLAGS, +- &flags, sizeof(flags)); +- if (error) { +- dev_err(&client->dev, +- "Failed to read initial status: %d\n", error); +- return error; +- } +- } +- + for (i = 0; i < ARRAY_SIZE(iqs269_events); i++) { +- dir_mask = flags.states[IQS269_ST_OFFS_DIR]; +- if (!iqs269_events[i].dir_up) +- dir_mask = ~dir_mask; +- +- state = flags.states[iqs269_events[i].st_offs] & dir_mask; +- + sw_code = iqs269->switches[i].code; + + for (j = 0; j < IQS269_NUM_CH; j++) { +@@ -1116,13 +1087,9 @@ static int iqs269_input_init(struct iqs269_private *iqs269) + switch (j) { + case IQS269_CHx_HALL_ACTIVE: + if (iqs269->hall_enable && +- iqs269->switches[i].enabled) { ++ iqs269->switches[i].enabled) + input_set_capability(iqs269->keypad, + EV_SW, sw_code); +- input_report_switch(iqs269->keypad, +- sw_code, +- state & BIT(j)); +- } + fallthrough; + + case IQS269_CHx_HALL_INACTIVE: +@@ -1138,14 +1105,6 @@ static int iqs269_input_init(struct iqs269_private *iqs269) + } + } + +- input_sync(iqs269->keypad); +- +- error = input_register_device(iqs269->keypad); +- if (error) { +- dev_err(&client->dev, "Failed to register keypad: %d\n", error); +- return error; +- } +- + for (i = 0; i < IQS269_NUM_SL; i++) { + if (!iqs269->sys_reg.slider_select[i]) + continue; +@@ -1205,6 +1164,9 @@ static int iqs269_report(struct iqs269_private *iqs269) + return error; + } + ++ if (be16_to_cpu(flags.system) & IQS269_SYS_FLAGS_IN_ATI) ++ return 0; ++ + error = regmap_raw_read(iqs269->regmap, IQS269_SLIDER_X, slider_x, + sizeof(slider_x)); + if (error) { +@@ -1267,6 +1229,12 @@ static int iqs269_report(struct iqs269_private *iqs269) + + input_sync(iqs269->keypad); + ++ /* ++ * The following completion signals that ATI has finished, any initial ++ * switch states have been reported and the keypad can be registered. ++ */ ++ complete_all(&iqs269->ati_done); ++ + return 0; + } + +@@ -1298,6 +1266,9 @@ static ssize_t counts_show(struct device *dev, + if (!iqs269->ati_current || iqs269->hall_enable) + return -EPERM; + ++ if (!completion_done(&iqs269->ati_done)) ++ return -EBUSY; ++ + /* + * Unsolicited I2C communication prompts the device to assert its RDY + * pin, so disable the interrupt line until the operation is finished +@@ -1554,7 +1525,9 @@ static ssize_t ati_trigger_show(struct device *dev, + { + struct iqs269_private *iqs269 = dev_get_drvdata(dev); + +- return scnprintf(buf, PAGE_SIZE, "%u\n", iqs269->ati_current); ++ return scnprintf(buf, PAGE_SIZE, "%u\n", ++ iqs269->ati_current && ++ completion_done(&iqs269->ati_done)); + } + + static ssize_t ati_trigger_store(struct device *dev, +@@ -1574,6 +1547,7 @@ static ssize_t ati_trigger_store(struct device *dev, + return count; + + disable_irq(client->irq); ++ reinit_completion(&iqs269->ati_done); + + error = iqs269_dev_init(iqs269); + +@@ -1583,6 +1557,10 @@ static ssize_t ati_trigger_store(struct device *dev, + if (error) + return error; + ++ if (!wait_for_completion_timeout(&iqs269->ati_done, ++ msecs_to_jiffies(2000))) ++ return -ETIMEDOUT; ++ + return count; + } + +@@ -1641,6 +1619,7 @@ static int iqs269_probe(struct i2c_client *client) + } + + mutex_init(&iqs269->lock); ++ init_completion(&iqs269->ati_done); + + error = regmap_raw_read(iqs269->regmap, IQS269_VER_INFO, &ver_info, + sizeof(ver_info)); +@@ -1676,6 +1655,22 @@ static int iqs269_probe(struct i2c_client *client) + return error; + } + ++ if (!wait_for_completion_timeout(&iqs269->ati_done, ++ msecs_to_jiffies(2000))) { ++ dev_err(&client->dev, "Failed to complete ATI\n"); ++ return -ETIMEDOUT; ++ } ++ ++ /* ++ * The keypad may include one or more switches and is not registered ++ * until ATI is complete and the initial switch states are read. ++ */ ++ error = input_register_device(iqs269->keypad); ++ if (error) { ++ dev_err(&client->dev, "Failed to register keypad: %d\n", error); ++ return error; ++ } ++ + error = devm_device_add_group(&client->dev, &iqs269_attr_group); + if (error) + dev_err(&client->dev, "Failed to add attributes: %d\n", error); +-- +2.43.0 + diff --git a/queue-5.15/input-iqs269a-do-not-poll-during-suspend-or-resume.patch b/queue-5.15/input-iqs269a-do-not-poll-during-suspend-or-resume.patch new file mode 100644 index 00000000000..8340f195c0f --- /dev/null +++ b/queue-5.15/input-iqs269a-do-not-poll-during-suspend-or-resume.patch @@ -0,0 +1,219 @@ +From a61693dfb0a20328e0f7c019cfc9f371af96097c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 3 Jan 2023 11:59:21 -0600 +Subject: Input: iqs269a - do not poll during suspend or resume + +From: Jeff LaBundy + +[ Upstream commit 18ab69c8ca5678324efbeed874b707ce7b2feae1 ] + +Polling the device while it transitions from automatic to manual +power mode switching may keep the device from actually finishing +the transition. The process appears to time out depending on the +polling rate and the device's core clock frequency. + +This is ultimately unnecessary in the first place; instead it is +sufficient to write the desired mode during initialization, then +disable automatic switching at suspend. This eliminates the need +to ensure the device is prepared for a manual change and removes +the 'suspend_mode' variable. + +Similarly, polling the device while it transitions from one mode +to another under manual control may time out as well. This added +step does not appear to be necessary either, so drop it. + +Fixes: 04e49867fad1 ("Input: add support for Azoteq IQS269A") +Signed-off-by: Jeff LaBundy +Reviewed-by: Mattijs Korpershoek +Link: https://lore.kernel.org/r/Y7Rs+eEXlRw4Vq57@nixie71 +Signed-off-by: Dmitry Torokhov +Signed-off-by: Sasha Levin +--- + drivers/input/misc/iqs269a.c | 118 +++++++++-------------------------- + 1 file changed, 31 insertions(+), 87 deletions(-) + +diff --git a/drivers/input/misc/iqs269a.c b/drivers/input/misc/iqs269a.c +index 07eda05d783ef..ff6cbc2f5d76c 100644 +--- a/drivers/input/misc/iqs269a.c ++++ b/drivers/input/misc/iqs269a.c +@@ -148,9 +148,6 @@ + #define IQS269_ATI_POLL_TIMEOUT_US (iqs269->delay_mult * 500000) + #define IQS269_ATI_STABLE_DELAY_MS (iqs269->delay_mult * 150) + +-#define IQS269_PWR_MODE_POLL_SLEEP_US IQS269_ATI_POLL_SLEEP_US +-#define IQS269_PWR_MODE_POLL_TIMEOUT_US IQS269_ATI_POLL_TIMEOUT_US +- + #define iqs269_irq_wait() usleep_range(200, 250) + + enum iqs269_local_cap_size { +@@ -295,7 +292,6 @@ struct iqs269_private { + struct input_dev *keypad; + struct input_dev *slider[IQS269_NUM_SL]; + unsigned int keycode[ARRAY_SIZE(iqs269_events) * IQS269_NUM_CH]; +- unsigned int suspend_mode; + unsigned int delay_mult; + unsigned int ch_num; + bool hall_enable; +@@ -767,17 +763,6 @@ static int iqs269_parse_prop(struct iqs269_private *iqs269) + iqs269->hall_enable = device_property_present(&client->dev, + "azoteq,hall-enable"); + +- if (!device_property_read_u32(&client->dev, "azoteq,suspend-mode", +- &val)) { +- if (val > IQS269_SYS_SETTINGS_PWR_MODE_MAX) { +- dev_err(&client->dev, "Invalid suspend mode: %u\n", +- val); +- return -EINVAL; +- } +- +- iqs269->suspend_mode = val; +- } +- + error = regmap_raw_read(iqs269->regmap, IQS269_SYS_SETTINGS, sys_reg, + sizeof(*sys_reg)); + if (error) +@@ -1005,6 +990,17 @@ static int iqs269_parse_prop(struct iqs269_private *iqs269) + general &= ~IQS269_SYS_SETTINGS_DIS_AUTO; + general &= ~IQS269_SYS_SETTINGS_PWR_MODE_MASK; + ++ if (!device_property_read_u32(&client->dev, "azoteq,suspend-mode", ++ &val)) { ++ if (val > IQS269_SYS_SETTINGS_PWR_MODE_MAX) { ++ dev_err(&client->dev, "Invalid suspend mode: %u\n", ++ val); ++ return -EINVAL; ++ } ++ ++ general |= (val << IQS269_SYS_SETTINGS_PWR_MODE_SHIFT); ++ } ++ + if (!device_property_read_u32(&client->dev, "azoteq,ulp-update", + &val)) { + if (val > IQS269_SYS_SETTINGS_ULP_UPDATE_MAX) { +@@ -1687,59 +1683,30 @@ static int iqs269_probe(struct i2c_client *client) + return error; + } + ++static u16 iqs269_general_get(struct iqs269_private *iqs269) ++{ ++ u16 general = be16_to_cpu(iqs269->sys_reg.general); ++ ++ general &= ~IQS269_SYS_SETTINGS_REDO_ATI; ++ general &= ~IQS269_SYS_SETTINGS_ACK_RESET; ++ ++ return general | IQS269_SYS_SETTINGS_DIS_AUTO; ++} ++ + static int iqs269_suspend(struct device *dev) + { + struct iqs269_private *iqs269 = dev_get_drvdata(dev); + struct i2c_client *client = iqs269->client; +- unsigned int val; + int error; ++ u16 general = iqs269_general_get(iqs269); + +- if (!iqs269->suspend_mode) ++ if (!(general & IQS269_SYS_SETTINGS_PWR_MODE_MASK)) + return 0; + + disable_irq(client->irq); + +- /* +- * Automatic power mode switching must be disabled before the device is +- * forced into any particular power mode. In this case, the device will +- * transition into normal-power mode. +- */ +- error = regmap_update_bits(iqs269->regmap, IQS269_SYS_SETTINGS, +- IQS269_SYS_SETTINGS_DIS_AUTO, ~0); +- if (error) +- goto err_irq; +- +- /* +- * The following check ensures the device has completed its transition +- * into normal-power mode before a manual mode switch is performed. +- */ +- error = regmap_read_poll_timeout(iqs269->regmap, IQS269_SYS_FLAGS, val, +- !(val & IQS269_SYS_FLAGS_PWR_MODE_MASK), +- IQS269_PWR_MODE_POLL_SLEEP_US, +- IQS269_PWR_MODE_POLL_TIMEOUT_US); +- if (error) +- goto err_irq; +- +- error = regmap_update_bits(iqs269->regmap, IQS269_SYS_SETTINGS, +- IQS269_SYS_SETTINGS_PWR_MODE_MASK, +- iqs269->suspend_mode << +- IQS269_SYS_SETTINGS_PWR_MODE_SHIFT); +- if (error) +- goto err_irq; +- +- /* +- * This last check ensures the device has completed its transition into +- * the desired power mode to prevent any spurious interrupts from being +- * triggered after iqs269_suspend has already returned. +- */ +- error = regmap_read_poll_timeout(iqs269->regmap, IQS269_SYS_FLAGS, val, +- (val & IQS269_SYS_FLAGS_PWR_MODE_MASK) +- == (iqs269->suspend_mode << +- IQS269_SYS_FLAGS_PWR_MODE_SHIFT), +- IQS269_PWR_MODE_POLL_SLEEP_US, +- IQS269_PWR_MODE_POLL_TIMEOUT_US); ++ error = regmap_write(iqs269->regmap, IQS269_SYS_SETTINGS, general); + +-err_irq: + iqs269_irq_wait(); + enable_irq(client->irq); + +@@ -1750,43 +1717,20 @@ static int iqs269_resume(struct device *dev) + { + struct iqs269_private *iqs269 = dev_get_drvdata(dev); + struct i2c_client *client = iqs269->client; +- unsigned int val; + int error; ++ u16 general = iqs269_general_get(iqs269); + +- if (!iqs269->suspend_mode) ++ if (!(general & IQS269_SYS_SETTINGS_PWR_MODE_MASK)) + return 0; + + disable_irq(client->irq); + +- error = regmap_update_bits(iqs269->regmap, IQS269_SYS_SETTINGS, +- IQS269_SYS_SETTINGS_PWR_MODE_MASK, 0); +- if (error) +- goto err_irq; +- +- /* +- * This check ensures the device has returned to normal-power mode +- * before automatic power mode switching is re-enabled. +- */ +- error = regmap_read_poll_timeout(iqs269->regmap, IQS269_SYS_FLAGS, val, +- !(val & IQS269_SYS_FLAGS_PWR_MODE_MASK), +- IQS269_PWR_MODE_POLL_SLEEP_US, +- IQS269_PWR_MODE_POLL_TIMEOUT_US); +- if (error) +- goto err_irq; +- +- error = regmap_update_bits(iqs269->regmap, IQS269_SYS_SETTINGS, +- IQS269_SYS_SETTINGS_DIS_AUTO, 0); +- if (error) +- goto err_irq; +- +- /* +- * This step reports any events that may have been "swallowed" as a +- * result of polling PWR_MODE (which automatically acknowledges any +- * pending interrupts). +- */ +- error = iqs269_report(iqs269); ++ error = regmap_write(iqs269->regmap, IQS269_SYS_SETTINGS, ++ general & ~IQS269_SYS_SETTINGS_PWR_MODE_MASK); ++ if (!error) ++ error = regmap_write(iqs269->regmap, IQS269_SYS_SETTINGS, ++ general & ~IQS269_SYS_SETTINGS_DIS_AUTO); + +-err_irq: + iqs269_irq_wait(); + enable_irq(client->irq); + +-- +2.43.0 + diff --git a/queue-5.15/input-iqs269a-drop-unused-device-node-references.patch b/queue-5.15/input-iqs269a-drop-unused-device-node-references.patch new file mode 100644 index 00000000000..c60b803b343 --- /dev/null +++ b/queue-5.15/input-iqs269a-drop-unused-device-node-references.patch @@ -0,0 +1,72 @@ +From 7b7e08db622bb871634e1a9c6efb6e0873c78738 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 3 Jan 2023 11:58:31 -0600 +Subject: Input: iqs269a - drop unused device node references + +From: Jeff LaBundy + +[ Upstream commit 59bc9cb3b80abaa42643abede0d5db8477901d9c ] + +Each call to device/fwnode_get_named_child_node() must be matched +with a call to fwnode_handle_put() once the corresponding node is +no longer in use. This ensures a reference count remains balanced +in the case of dynamic device tree support. + +Currently, the driver does not call fwnode_handle_put() on nested +event nodes. This patch solves this problem by adding the missing +instances of fwnode_handle_put(). + +As part of this change, the logic which parses each channel's key +code is gently refactored in order to reduce the number of places +from which fwnode_handle_put() is called. + +Fixes: 04e49867fad1 ("Input: add support for Azoteq IQS269A") +Signed-off-by: Jeff LaBundy +Link: https://lore.kernel.org/r/Y7Rsx68k/gvDVXAt@nixie71 +Signed-off-by: Dmitry Torokhov +Signed-off-by: Sasha Levin +--- + drivers/input/misc/iqs269a.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +diff --git a/drivers/input/misc/iqs269a.c b/drivers/input/misc/iqs269a.c +index a348247d3d38f..ea3c97c5f764f 100644 +--- a/drivers/input/misc/iqs269a.c ++++ b/drivers/input/misc/iqs269a.c +@@ -694,6 +694,7 @@ static int iqs269_parse_chan(struct iqs269_private *iqs269, + dev_err(&client->dev, + "Invalid channel %u threshold: %u\n", + reg, val); ++ fwnode_handle_put(ev_node); + return -EINVAL; + } + +@@ -707,6 +708,7 @@ static int iqs269_parse_chan(struct iqs269_private *iqs269, + dev_err(&client->dev, + "Invalid channel %u hysteresis: %u\n", + reg, val); ++ fwnode_handle_put(ev_node); + return -EINVAL; + } + +@@ -721,8 +723,16 @@ static int iqs269_parse_chan(struct iqs269_private *iqs269, + } + } + +- if (fwnode_property_read_u32(ev_node, "linux,code", &val)) ++ error = fwnode_property_read_u32(ev_node, "linux,code", &val); ++ fwnode_handle_put(ev_node); ++ if (error == -EINVAL) { + continue; ++ } else if (error) { ++ dev_err(&client->dev, ++ "Failed to read channel %u code: %d\n", reg, ++ error); ++ return error; ++ } + + switch (reg) { + case IQS269_CHx_HALL_ACTIVE: +-- +2.43.0 + diff --git a/queue-5.15/input-iqs269a-increase-interrupt-handler-return-dela.patch b/queue-5.15/input-iqs269a-increase-interrupt-handler-return-dela.patch new file mode 100644 index 00000000000..be9c14c613e --- /dev/null +++ b/queue-5.15/input-iqs269a-increase-interrupt-handler-return-dela.patch @@ -0,0 +1,42 @@ +From 74300d9b8f7b3d9d31b226a6ee767db2e4fca2cc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 3 Jan 2023 11:58:59 -0600 +Subject: Input: iqs269a - increase interrupt handler return delay + +From: Jeff LaBundy + +[ Upstream commit e023cc4abde3c01b895660b0e5a8488deb36b8c1 ] + +The time the device takes to deassert its RDY output following an +I2C stop condition scales with the core clock frequency. + +To prevent level-triggered interrupts from being reasserted after +the interrupt handler returns, increase the time before returning +to account for the worst-case delay (~140 us) plus margin. + +Fixes: 04e49867fad1 ("Input: add support for Azoteq IQS269A") +Signed-off-by: Jeff LaBundy +Reviewed-by: Mattijs Korpershoek +Link: https://lore.kernel.org/r/Y7Rs484ypy4dab5G@nixie71 +Signed-off-by: Dmitry Torokhov +Signed-off-by: Sasha Levin +--- + drivers/input/misc/iqs269a.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/input/misc/iqs269a.c b/drivers/input/misc/iqs269a.c +index 2124d08c55b79..1530efd301c24 100644 +--- a/drivers/input/misc/iqs269a.c ++++ b/drivers/input/misc/iqs269a.c +@@ -151,7 +151,7 @@ + #define IQS269_PWR_MODE_POLL_SLEEP_US IQS269_ATI_POLL_SLEEP_US + #define IQS269_PWR_MODE_POLL_TIMEOUT_US IQS269_ATI_POLL_TIMEOUT_US + +-#define iqs269_irq_wait() usleep_range(100, 150) ++#define iqs269_irq_wait() usleep_range(200, 250) + + enum iqs269_local_cap_size { + IQS269_LOCAL_CAP_SIZE_0, +-- +2.43.0 + diff --git a/queue-5.15/input-iqs269a-switch-to-define_simple_dev_pm_ops-and.patch b/queue-5.15/input-iqs269a-switch-to-define_simple_dev_pm_ops-and.patch new file mode 100644 index 00000000000..b3df172ed75 --- /dev/null +++ b/queue-5.15/input-iqs269a-switch-to-define_simple_dev_pm_ops-and.patch @@ -0,0 +1,71 @@ +From fbe9dcd3e77d590cfe16a0d40ee7dcde61d8af22 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 2 Jan 2023 18:17:41 +0000 +Subject: Input: iqs269a - switch to DEFINE_SIMPLE_DEV_PM_OPS() and + pm_sleep_ptr() + +From: Jonathan Cameron + +[ Upstream commit 29eac950768a48651e2389f7d3f2ad597f6e58d1 ] + +SIMPLE_DEV_PM_OPS() is deprecated as it requires explicit protection +against unused function warnings. The new combination of pm_sleep_ptr() +and DEFINE_SIMPLE_DEV_PM_OPS() allows the compiler to see the functions, +thus suppressing the warning, but still allowing the unused code to be +removed. Thus also drop the __maybe_unused markings. + +Signed-off-by: Jonathan Cameron +Cc: Jeff LaBundy +Reviewed-by: Jeff LaBundy +Reviewed-by: Linus Walleij +Link: https://lore.kernel.org/r/20230102181842.718010-9-jic23@kernel.org +Signed-off-by: Dmitry Torokhov +Stable-dep-of: 18ab69c8ca56 ("Input: iqs269a - do not poll during suspend or resume") +Signed-off-by: Sasha Levin +--- + drivers/input/misc/iqs269a.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/input/misc/iqs269a.c b/drivers/input/misc/iqs269a.c +index 1530efd301c24..07eda05d783ef 100644 +--- a/drivers/input/misc/iqs269a.c ++++ b/drivers/input/misc/iqs269a.c +@@ -1687,7 +1687,7 @@ static int iqs269_probe(struct i2c_client *client) + return error; + } + +-static int __maybe_unused iqs269_suspend(struct device *dev) ++static int iqs269_suspend(struct device *dev) + { + struct iqs269_private *iqs269 = dev_get_drvdata(dev); + struct i2c_client *client = iqs269->client; +@@ -1746,7 +1746,7 @@ static int __maybe_unused iqs269_suspend(struct device *dev) + return error; + } + +-static int __maybe_unused iqs269_resume(struct device *dev) ++static int iqs269_resume(struct device *dev) + { + struct iqs269_private *iqs269 = dev_get_drvdata(dev); + struct i2c_client *client = iqs269->client; +@@ -1793,7 +1793,7 @@ static int __maybe_unused iqs269_resume(struct device *dev) + return error; + } + +-static SIMPLE_DEV_PM_OPS(iqs269_pm, iqs269_suspend, iqs269_resume); ++static DEFINE_SIMPLE_DEV_PM_OPS(iqs269_pm, iqs269_suspend, iqs269_resume); + + static const struct of_device_id iqs269_of_match[] = { + { .compatible = "azoteq,iqs269a" }, +@@ -1805,7 +1805,7 @@ static struct i2c_driver iqs269_i2c_driver = { + .driver = { + .name = "iqs269a", + .of_match_table = iqs269_of_match, +- .pm = &iqs269_pm, ++ .pm = pm_sleep_ptr(&iqs269_pm), + }, + .probe_new = iqs269_probe, + }; +-- +2.43.0 + diff --git a/queue-5.15/kernel-sched-remove-dl_boosted-flag-comment.patch b/queue-5.15/kernel-sched-remove-dl_boosted-flag-comment.patch new file mode 100644 index 00000000000..323d5795c37 --- /dev/null +++ b/queue-5.15/kernel-sched-remove-dl_boosted-flag-comment.patch @@ -0,0 +1,40 @@ +From eb50607f005e46dfdbb2af59099367ec64118857 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 7 Jan 2022 17:52:54 +0800 +Subject: kernel/sched: Remove dl_boosted flag comment + +From: Hui Su + +[ Upstream commit 0e3872499de1a1230cef5221607d71aa09264bd5 ] + +since commit 2279f540ea7d ("sched/deadline: Fix priority +inheritance with multiple scheduling classes"), we should not +keep it here. + +Signed-off-by: Hui Su +Signed-off-by: Peter Zijlstra (Intel) +Reviewed-by: Daniel Bristot de Oliveira +Link: https://lore.kernel.org/r/20220107095254.GA49258@localhost.localdomain +Signed-off-by: Sasha Levin +--- + include/linux/sched.h | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/include/linux/sched.h b/include/linux/sched.h +index 7bfc2b45cd99b..9b3cfe685cb45 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -608,10 +608,6 @@ struct sched_dl_entity { + * task has to wait for a replenishment to be performed at the + * next firing of dl_timer. + * +- * @dl_boosted tells if we are boosted due to DI. If so we are +- * outside bandwidth enforcement mechanism (but only until we +- * exit the critical section); +- * + * @dl_yielded tells if task gave up the CPU before consuming + * all its available runtime during the last job. + * +-- +2.43.0 + diff --git a/queue-5.15/md-fix-data-corruption-for-raid456-when-reshape-rest.patch b/queue-5.15/md-fix-data-corruption-for-raid456-when-reshape-rest.patch new file mode 100644 index 00000000000..3a6803e6c85 --- /dev/null +++ b/queue-5.15/md-fix-data-corruption-for-raid456-when-reshape-rest.patch @@ -0,0 +1,60 @@ +From c79fa4d8db67dafd453fe4a9bd78376d64824dbc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 May 2023 09:56:07 +0800 +Subject: md: fix data corruption for raid456 when reshape restart while grow + up + +From: Yu Kuai + +[ Upstream commit 873f50ece41aad5c4f788a340960c53774b5526e ] + +Currently, if reshape is interrupted, echo "reshape" to sync_action will +restart reshape from scratch, for example: + +echo frozen > sync_action +echo reshape > sync_action + +This will corrupt data before reshape_position if the array is growing, +fix the problem by continue reshape from reshape_position. + +Reported-by: Peter Neuwirth +Link: https://lore.kernel.org/linux-raid/e2f96772-bfbc-f43b-6da1-f520e5164536@online.de/ +Signed-off-by: Yu Kuai +Signed-off-by: Song Liu +Link: https://lore.kernel.org/r/20230512015610.821290-3-yukuai1@huaweicloud.com +Signed-off-by: Sasha Levin +--- + drivers/md/md.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/drivers/md/md.c b/drivers/md/md.c +index ff65e5eddfa18..a17f2f725822a 100644 +--- a/drivers/md/md.c ++++ b/drivers/md/md.c +@@ -4919,11 +4919,21 @@ action_store(struct mddev *mddev, const char *page, size_t len) + return -EINVAL; + err = mddev_lock(mddev); + if (!err) { +- if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) ++ if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) { + err = -EBUSY; +- else { ++ } else if (mddev->reshape_position == MaxSector || ++ mddev->pers->check_reshape == NULL || ++ mddev->pers->check_reshape(mddev)) { + clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); + err = mddev->pers->start_reshape(mddev); ++ } else { ++ /* ++ * If reshape is still in progress, and ++ * md_check_recovery() can continue to reshape, ++ * don't restart reshape because data can be ++ * corrupted for raid456. ++ */ ++ clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); + } + mddev_unlock(mddev); + } +-- +2.43.0 + diff --git a/queue-5.15/md-raid10-prevent-soft-lockup-while-flush-writes.patch b/queue-5.15/md-raid10-prevent-soft-lockup-while-flush-writes.patch new file mode 100644 index 00000000000..92b16443fcd --- /dev/null +++ b/queue-5.15/md-raid10-prevent-soft-lockup-while-flush-writes.patch @@ -0,0 +1,79 @@ +From 776470301835725d9b8e598726a72e238075bb5c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 29 May 2023 21:11:00 +0800 +Subject: md/raid10: prevent soft lockup while flush writes + +From: Yu Kuai + +[ Upstream commit 010444623e7f4da6b4a4dd603a7da7469981e293 ] + +Currently, there is no limit for raid1/raid10 plugged bio. While flushing +writes, raid1 has cond_resched() while raid10 doesn't, and too many +writes can cause soft lockup. + +Follow up soft lockup can be triggered easily with writeback test for +raid10 with ramdisks: + +watchdog: BUG: soft lockup - CPU#10 stuck for 27s! [md0_raid10:1293] +Call Trace: + + call_rcu+0x16/0x20 + put_object+0x41/0x80 + __delete_object+0x50/0x90 + delete_object_full+0x2b/0x40 + kmemleak_free+0x46/0xa0 + slab_free_freelist_hook.constprop.0+0xed/0x1a0 + kmem_cache_free+0xfd/0x300 + mempool_free_slab+0x1f/0x30 + mempool_free+0x3a/0x100 + bio_free+0x59/0x80 + bio_put+0xcf/0x2c0 + free_r10bio+0xbf/0xf0 + raid_end_bio_io+0x78/0xb0 + one_write_done+0x8a/0xa0 + raid10_end_write_request+0x1b4/0x430 + bio_endio+0x175/0x320 + brd_submit_bio+0x3b9/0x9b7 [brd] + __submit_bio+0x69/0xe0 + submit_bio_noacct_nocheck+0x1e6/0x5a0 + submit_bio_noacct+0x38c/0x7e0 + flush_pending_writes+0xf0/0x240 + raid10d+0xac/0x1ed0 + +Fix the problem by adding cond_resched() to raid10 like what raid1 did. + +Note that unlimited plugged bio still need to be optimized, for example, +in the case of lots of dirty pages writeback, this will take lots of +memory and io will spend a long time in plug, hence io latency is bad. + +Signed-off-by: Yu Kuai +Signed-off-by: Song Liu +Link: https://lore.kernel.org/r/20230529131106.2123367-2-yukuai1@huaweicloud.com +Signed-off-by: Sasha Levin +--- + drivers/md/raid10.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c +index 910e7db7d5736..ae84aaa1645c2 100644 +--- a/drivers/md/raid10.c ++++ b/drivers/md/raid10.c +@@ -903,6 +903,7 @@ static void flush_pending_writes(struct r10conf *conf) + else + submit_bio_noacct(bio); + bio = next; ++ cond_resched(); + } + blk_finish_plug(&plug); + } else +@@ -1116,6 +1117,7 @@ static void raid10_unplug(struct blk_plug_cb *cb, bool from_schedule) + else + submit_bio_noacct(bio); + bio = next; ++ cond_resched(); + } + kfree(plug); + } +-- +2.43.0 + diff --git a/queue-5.15/mips-smp-cps-fix-build-error-when-hotplug_cpu-not-se.patch b/queue-5.15/mips-smp-cps-fix-build-error-when-hotplug_cpu-not-se.patch new file mode 100644 index 00000000000..f3eedd43bb2 --- /dev/null +++ b/queue-5.15/mips-smp-cps-fix-build-error-when-hotplug_cpu-not-se.patch @@ -0,0 +1,54 @@ +From 7abfe02b0575ed80b286b970dd04d1be42c5bc37 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 17 Feb 2023 12:07:49 -0800 +Subject: MIPS: SMP-CPS: fix build error when HOTPLUG_CPU not set + +From: Randy Dunlap + +[ Upstream commit 6f02e39fa40f16c24e7a5c599a854c0d1682788d ] + +When MIPS_CPS=y, MIPS_CPS_PM is not set, HOTPLUG_CPU is not set, and +KEXEC=y, cps_shutdown_this_cpu() attempts to call cps_pm_enter_state(), +which is not built when MIPS_CPS_PM is not set. +Conditionally execute the else branch based on CONFIG_HOTPLUG_CPU +to remove the build error. +This build failure is from a randconfig file. + +mips-linux-ld: arch/mips/kernel/smp-cps.o: in function `$L162': +smp-cps.c:(.text.cps_kexec_nonboot_cpu+0x31c): undefined reference to `cps_pm_enter_state' + +Fixes: 1447864bee4c ("MIPS: kexec: CPS systems to halt nonboot CPUs") +Signed-off-by: Randy Dunlap +Cc: Dengcheng Zhu +Cc: Paul Burton +Cc: Thomas Bogendoerfer +Cc: linux-mips@vger.kernel.org +Cc: Sergei Shtylyov +Signed-off-by: Thomas Bogendoerfer +Signed-off-by: Sasha Levin +--- + arch/mips/kernel/smp-cps.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/arch/mips/kernel/smp-cps.c b/arch/mips/kernel/smp-cps.c +index bcd6a944b8397..f2df0cae1b4d9 100644 +--- a/arch/mips/kernel/smp-cps.c ++++ b/arch/mips/kernel/smp-cps.c +@@ -424,9 +424,11 @@ static void cps_shutdown_this_cpu(enum cpu_death death) + wmb(); + } + } else { +- pr_debug("Gating power to core %d\n", core); +- /* Power down the core */ +- cps_pm_enter_state(CPS_PM_POWER_GATED); ++ if (IS_ENABLED(CONFIG_HOTPLUG_CPU)) { ++ pr_debug("Gating power to core %d\n", core); ++ /* Power down the core */ ++ cps_pm_enter_state(CPS_PM_POWER_GATED); ++ } + } + } + +-- +2.43.0 + diff --git a/queue-5.15/mips-vpe-mt-drop-physical_memsize.patch b/queue-5.15/mips-vpe-mt-drop-physical_memsize.patch new file mode 100644 index 00000000000..e0424bbf7b6 --- /dev/null +++ b/queue-5.15/mips-vpe-mt-drop-physical_memsize.patch @@ -0,0 +1,99 @@ +From 2290c353d0ae687ceb52667cba94ca8ad60f4702 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 19 Feb 2023 15:15:25 -0800 +Subject: MIPS: vpe-mt: drop physical_memsize +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Randy Dunlap + +[ Upstream commit 91dc288f4edf0d768e46c2c6d33e0ab703403459 ] + +When neither LANTIQ nor MIPS_MALTA is set, 'physical_memsize' is not +declared. This causes the build to fail with: + +mips-linux-ld: arch/mips/kernel/vpe-mt.o: in function `vpe_run': +arch/mips/kernel/vpe-mt.c:(.text.vpe_run+0x280): undefined reference to `physical_memsize' + +LANTIQ is not using 'physical_memsize' and MIPS_MALTA's use of it is +self-contained in mti-malta/malta-dtshim.c. +Use of physical_memsize in vpe-mt.c appears to be unused, so eliminate +this loader mode completely and require VPE programs to be compiled with +DFLT_STACK_SIZE and DFLT_HEAP_SIZE defined. + +Fixes: 9050d50e2244 ("MIPS: lantiq: Set physical_memsize") +Fixes: 1a2a6d7e8816 ("MIPS: APRP: Split VPE loader into separate files.") +Signed-off-by: Randy Dunlap +Reported-by: kernel test robot +Link: https://lore.kernel.org/all/202302030625.2g3E98sY-lkp@intel.com/ +Cc: Dengcheng Zhu +Cc: John Crispin +Cc: Thomas Bogendoerfer +Cc: Philippe Mathieu-Daudé +Cc: "Steven J. Hill" +Cc: Qais Yousef +Cc: Yang Yingliang +Cc: Hauke Mehrtens +Cc: James Hogan +Cc: linux-mips@vger.kernel.org +Signed-off-by: Thomas Bogendoerfer +Signed-off-by: Sasha Levin +--- + arch/mips/include/asm/vpe.h | 1 - + arch/mips/kernel/vpe-mt.c | 7 +++---- + arch/mips/lantiq/prom.c | 6 ------ + 3 files changed, 3 insertions(+), 11 deletions(-) + +diff --git a/arch/mips/include/asm/vpe.h b/arch/mips/include/asm/vpe.h +index baa949a744cb4..ef7e078296079 100644 +--- a/arch/mips/include/asm/vpe.h ++++ b/arch/mips/include/asm/vpe.h +@@ -102,7 +102,6 @@ struct vpe_control { + struct list_head tc_list; /* Thread contexts */ + }; + +-extern unsigned long physical_memsize; + extern struct vpe_control vpecontrol; + extern const struct file_operations vpe_fops; + +diff --git a/arch/mips/kernel/vpe-mt.c b/arch/mips/kernel/vpe-mt.c +index 84a82b551ec35..223d6274f2e5b 100644 +--- a/arch/mips/kernel/vpe-mt.c ++++ b/arch/mips/kernel/vpe-mt.c +@@ -92,12 +92,11 @@ int vpe_run(struct vpe *v) + write_tc_c0_tchalt(read_tc_c0_tchalt() & ~TCHALT_H); + + /* +- * The sde-kit passes 'memsize' to __start in $a3, so set something +- * here... Or set $a3 to zero and define DFLT_STACK_SIZE and +- * DFLT_HEAP_SIZE when you compile your program ++ * We don't pass the memsize here, so VPE programs need to be ++ * compiled with DFLT_STACK_SIZE and DFLT_HEAP_SIZE defined. + */ ++ mttgpr(7, 0); + mttgpr(6, v->ntcs); +- mttgpr(7, physical_memsize); + + /* set up VPE1 */ + /* +diff --git a/arch/mips/lantiq/prom.c b/arch/mips/lantiq/prom.c +index bc9f58fcbdf94..86c743747e79a 100644 +--- a/arch/mips/lantiq/prom.c ++++ b/arch/mips/lantiq/prom.c +@@ -22,12 +22,6 @@ + DEFINE_SPINLOCK(ebu_lock); + EXPORT_SYMBOL_GPL(ebu_lock); + +-/* +- * This is needed by the VPE loader code, just set it to 0 and assume +- * that the firmware hardcodes this value to something useful. +- */ +-unsigned long physical_memsize = 0L; +- + /* + * this struct is filled by the soc specific detection code and holds + * information about the specific soc type, revision and name +-- +2.43.0 + diff --git a/queue-5.15/mmc-jz4740-use-the-new-pm-macros.patch b/queue-5.15/mmc-jz4740-use-the-new-pm-macros.patch new file mode 100644 index 00000000000..d15b277a7f5 --- /dev/null +++ b/queue-5.15/mmc-jz4740-use-the-new-pm-macros.patch @@ -0,0 +1,63 @@ +From 3e41c7e0044d19f4236098272f100350418a0097 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 Dec 2021 00:21:01 +0000 +Subject: mmc: jz4740: Use the new PM macros + +From: Paul Cercueil + +[ Upstream commit e0d64ecc621715e9c7807e952b68475c62bbf630 ] + + - Use DEFINE_SIMPLE_DEV_PM_OPS() instead of the SIMPLE_DEV_PM_OPS() + macro. This makes it possible to remove the __maybe_unused flags + on the callback functions. + + - Since we only have callbacks for suspend/resume, we can conditionally + compile the dev_pm_ops structure for when CONFIG_PM_SLEEP is enabled; + so use the pm_sleep_ptr() macro instead of pm_ptr(). + +Signed-off-by: Paul Cercueil +Acked-by: Ulf Hansson +Signed-off-by: Rafael J. Wysocki +Stable-dep-of: 18ab69c8ca56 ("Input: iqs269a - do not poll during suspend or resume") +Signed-off-by: Sasha Levin +--- + drivers/mmc/host/jz4740_mmc.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/mmc/host/jz4740_mmc.c b/drivers/mmc/host/jz4740_mmc.c +index 8586447d4b4f2..ef3fe837b49d2 100644 +--- a/drivers/mmc/host/jz4740_mmc.c ++++ b/drivers/mmc/host/jz4740_mmc.c +@@ -1133,17 +1133,17 @@ static int jz4740_mmc_remove(struct platform_device *pdev) + return 0; + } + +-static int __maybe_unused jz4740_mmc_suspend(struct device *dev) ++static int jz4740_mmc_suspend(struct device *dev) + { + return pinctrl_pm_select_sleep_state(dev); + } + +-static int __maybe_unused jz4740_mmc_resume(struct device *dev) ++static int jz4740_mmc_resume(struct device *dev) + { + return pinctrl_select_default_state(dev); + } + +-static SIMPLE_DEV_PM_OPS(jz4740_mmc_pm_ops, jz4740_mmc_suspend, ++DEFINE_SIMPLE_DEV_PM_OPS(jz4740_mmc_pm_ops, jz4740_mmc_suspend, + jz4740_mmc_resume); + + static struct platform_driver jz4740_mmc_driver = { +@@ -1153,7 +1153,7 @@ static struct platform_driver jz4740_mmc_driver = { + .name = "jz4740-mmc", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, + .of_match_table = of_match_ptr(jz4740_mmc_of_match), +- .pm = pm_ptr(&jz4740_mmc_pm_ops), ++ .pm = pm_sleep_ptr(&jz4740_mmc_pm_ops), + }, + }; + +-- +2.43.0 + diff --git a/queue-5.15/mmc-mxc-use-the-new-pm-macros.patch b/queue-5.15/mmc-mxc-use-the-new-pm-macros.patch new file mode 100644 index 00000000000..283eff0404d --- /dev/null +++ b/queue-5.15/mmc-mxc-use-the-new-pm-macros.patch @@ -0,0 +1,60 @@ +From a6f95fd4c6f845546887cba268df3eaf46b8feec Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 Dec 2021 00:21:02 +0000 +Subject: mmc: mxc: Use the new PM macros + +From: Paul Cercueil + +[ Upstream commit 2cdbd92c2d1dff07ad56c39f5857ee644bbd2c8a ] + +Use DEFINE_SIMPLE_DEV_PM_OPS() instead of the SIMPLE_DEV_PM_OPS() +macro, along with using pm_sleep_ptr() as this driver doesn't handle +runtime PM. + +This makes it possible to remove the #ifdef CONFIG_PM guard around +the suspend/resume functions. + +Signed-off-by: Paul Cercueil +Acked-by: Ulf Hansson +Signed-off-by: Rafael J. Wysocki +Stable-dep-of: 18ab69c8ca56 ("Input: iqs269a - do not poll during suspend or resume") +Signed-off-by: Sasha Levin +--- + drivers/mmc/host/mxcmmc.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c +index 97227ad717150..b5f65f39ced1c 100644 +--- a/drivers/mmc/host/mxcmmc.c ++++ b/drivers/mmc/host/mxcmmc.c +@@ -1185,7 +1185,6 @@ static int mxcmci_remove(struct platform_device *pdev) + return 0; + } + +-#ifdef CONFIG_PM_SLEEP + static int mxcmci_suspend(struct device *dev) + { + struct mmc_host *mmc = dev_get_drvdata(dev); +@@ -1212,9 +1211,8 @@ static int mxcmci_resume(struct device *dev) + + return ret; + } +-#endif + +-static SIMPLE_DEV_PM_OPS(mxcmci_pm_ops, mxcmci_suspend, mxcmci_resume); ++DEFINE_SIMPLE_DEV_PM_OPS(mxcmci_pm_ops, mxcmci_suspend, mxcmci_resume); + + static struct platform_driver mxcmci_driver = { + .probe = mxcmci_probe, +@@ -1222,7 +1220,7 @@ static struct platform_driver mxcmci_driver = { + .driver = { + .name = DRIVER_NAME, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, +- .pm = &mxcmci_pm_ops, ++ .pm = pm_sleep_ptr(&mxcmci_pm_ops), + .of_match_table = mxcmci_of_match, + } + }; +-- +2.43.0 + diff --git a/queue-5.15/mtd-rawnand-sunxi-fix-the-size-of-the-last-oob-regio.patch b/queue-5.15/mtd-rawnand-sunxi-fix-the-size-of-the-last-oob-regio.patch new file mode 100644 index 00000000000..ba316dc86c9 --- /dev/null +++ b/queue-5.15/mtd-rawnand-sunxi-fix-the-size-of-the-last-oob-regio.patch @@ -0,0 +1,37 @@ +From 17c9f717b09f7dc705a1d4506c2a158b2b0977ab Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 29 Dec 2022 12:15:24 -0600 +Subject: mtd: rawnand: sunxi: Fix the size of the last OOB region + +From: Samuel Holland + +[ Upstream commit 34569d869532b54d6e360d224a0254dcdd6a1785 ] + +The previous code assigned to the wrong structure member. + +Fixes: c66811e6d350 ("mtd: nand: sunxi: switch to mtd_ooblayout_ops") +Signed-off-by: Samuel Holland +Acked-By: Dhruva Gole +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20221229181526.53766-6-samuel@sholland.org +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/sunxi_nand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/raw/sunxi_nand.c b/drivers/mtd/nand/raw/sunxi_nand.c +index ea953e31933eb..e03dcdd8bd589 100644 +--- a/drivers/mtd/nand/raw/sunxi_nand.c ++++ b/drivers/mtd/nand/raw/sunxi_nand.c +@@ -1609,7 +1609,7 @@ static int sunxi_nand_ooblayout_free(struct mtd_info *mtd, int section, + if (section < ecc->steps) + oobregion->length = 4; + else +- oobregion->offset = mtd->oobsize - oobregion->offset; ++ oobregion->length = mtd->oobsize - oobregion->offset; + + return 0; + } +-- +2.43.0 + diff --git a/queue-5.15/nbd-add-the-maximum-limit-of-allocated-index-in-nbd_.patch b/queue-5.15/nbd-add-the-maximum-limit-of-allocated-index-in-nbd_.patch new file mode 100644 index 00000000000..de7c5adc03e --- /dev/null +++ b/queue-5.15/nbd-add-the-maximum-limit-of-allocated-index-in-nbd_.patch @@ -0,0 +1,41 @@ +From 9317d281a2033af90902fae95bd96de5b6b845e6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 5 Jun 2023 20:21:59 +0800 +Subject: nbd: Add the maximum limit of allocated index in nbd_dev_add + +From: Zhong Jinghua + +[ Upstream commit f12bc113ce904777fd6ca003b473b427782b3dde ] + +If the index allocated by idr_alloc greater than MINORMASK >> part_shift, +the device number will overflow, resulting in failure to create a block +device. + +Fix it by imiting the size of the max allocation. + +Signed-off-by: Zhong Jinghua +Reviewed-by: Christoph Hellwig +Link: https://lore.kernel.org/r/20230605122159.2134384-1-zhongjinghua@huaweicloud.com +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + drivers/block/nbd.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c +index e563aa407e888..d379a047d4273 100644 +--- a/drivers/block/nbd.c ++++ b/drivers/block/nbd.c +@@ -1715,7 +1715,8 @@ static struct nbd_device *nbd_dev_add(int index, unsigned int refs) + if (err == -ENOSPC) + err = -EEXIST; + } else { +- err = idr_alloc(&nbd_index_idr, nbd, 0, 0, GFP_KERNEL); ++ err = idr_alloc(&nbd_index_idr, nbd, 0, ++ (MINORMASK >> part_shift) + 1, GFP_KERNEL); + if (err >= 0) + index = err; + } +-- +2.43.0 + diff --git a/queue-5.15/net-ethernet-ti-add-missing-of_node_put-before-retur.patch b/queue-5.15/net-ethernet-ti-add-missing-of_node_put-before-retur.patch new file mode 100644 index 00000000000..53bf969f59d --- /dev/null +++ b/queue-5.15/net-ethernet-ti-add-missing-of_node_put-before-retur.patch @@ -0,0 +1,114 @@ +From 15c61757f25e09d23495ff8178ccba9fd741c5af Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Dec 2021 01:44:36 -0800 +Subject: net: ethernet: ti: add missing of_node_put before return + +From: Wang Qing + +[ Upstream commit be565ec71d1d59438bed0c7ed0a252a327e0b0ef ] + +Fix following coccicheck warning: +WARNING: Function "for_each_child_of_node" +should have of_node_put() before return. + +Early exits from for_each_child_of_node should decrement the +node reference counter. + +Signed-off-by: Wang Qing +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/ti/am65-cpsw-nuss.c | 29 ++++++++++++++++-------- + 1 file changed, 20 insertions(+), 9 deletions(-) + +diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c +index 1fa6f0dacd2de..f94d6d322df42 100644 +--- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c ++++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c +@@ -1856,13 +1856,14 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common) + if (ret < 0) { + dev_err(dev, "%pOF error reading port_id %d\n", + port_np, ret); +- return ret; ++ goto of_node_put; + } + + if (!port_id || port_id > common->port_num) { + dev_err(dev, "%pOF has invalid port_id %u %s\n", + port_np, port_id, port_np->name); +- return -EINVAL; ++ ret = -EINVAL; ++ goto of_node_put; + } + + port = am65_common_get_port(common, port_id); +@@ -1878,8 +1879,10 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common) + (AM65_CPSW_NU_FRAM_PORT_OFFSET * (port_id - 1)); + + port->slave.mac_sl = cpsw_sl_get("am65", dev, port->port_base); +- if (IS_ERR(port->slave.mac_sl)) +- return PTR_ERR(port->slave.mac_sl); ++ if (IS_ERR(port->slave.mac_sl)) { ++ ret = PTR_ERR(port->slave.mac_sl); ++ goto of_node_put; ++ } + + port->disabled = !of_device_is_available(port_np); + if (port->disabled) { +@@ -1892,7 +1895,7 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common) + ret = PTR_ERR(port->slave.ifphy); + dev_err(dev, "%pOF error retrieving port phy: %d\n", + port_np, ret); +- return ret; ++ goto of_node_put; + } + + port->slave.mac_only = +@@ -1901,10 +1904,12 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common) + /* get phy/link info */ + if (of_phy_is_fixed_link(port_np)) { + ret = of_phy_register_fixed_link(port_np); +- if (ret) +- return dev_err_probe(dev, ret, ++ if (ret) { ++ ret = dev_err_probe(dev, ret, + "failed to register fixed-link phy %pOF\n", + port_np); ++ goto of_node_put; ++ } + port->slave.phy_node = of_node_get(port_np); + } else { + port->slave.phy_node = +@@ -1914,14 +1919,15 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common) + if (!port->slave.phy_node) { + dev_err(dev, + "slave[%d] no phy found\n", port_id); +- return -ENODEV; ++ ret = -ENODEV; ++ goto of_node_put; + } + + ret = of_get_phy_mode(port_np, &port->slave.phy_if); + if (ret) { + dev_err(dev, "%pOF read phy-mode err %d\n", + port_np, ret); +- return ret; ++ goto of_node_put; + } + + ret = of_get_mac_address(port_np, port->slave.mac_addr); +@@ -1944,6 +1950,11 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common) + } + + return 0; ++ ++of_node_put: ++ of_node_put(port_np); ++ of_node_put(node); ++ return ret; + } + + static void am65_cpsw_pcpu_stats_free(void *data) +-- +2.43.0 + diff --git a/queue-5.15/net-sched-refactor-qdisc_graft-for-ingress-and-clsac.patch b/queue-5.15/net-sched-refactor-qdisc_graft-for-ingress-and-clsac.patch new file mode 100644 index 00000000000..c7f8992122d --- /dev/null +++ b/queue-5.15/net-sched-refactor-qdisc_graft-for-ingress-and-clsac.patch @@ -0,0 +1,72 @@ +From c0a45dd7eaf0d2d6f40c33a5f8e8d0bba12c9281 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 10 Jun 2023 20:30:15 -0700 +Subject: net/sched: Refactor qdisc_graft() for ingress and clsact Qdiscs + +From: Peilin Ye + +[ Upstream commit 2d5f6a8d7aef7852a9ecc555f88c673a1c91754f ] + +Grafting ingress and clsact Qdiscs does not need a for-loop in +qdisc_graft(). Refactor it. No functional changes intended. + +Tested-by: Pedro Tammela +Acked-by: Jamal Hadi Salim +Reviewed-by: Jamal Hadi Salim +Reviewed-by: Vlad Buslov +Signed-off-by: Peilin Ye +Signed-off-by: Paolo Abeni +Signed-off-by: Sasha Levin +--- + net/sched/sch_api.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c +index fa79dbd3601fa..7fdc2c1f87561 100644 +--- a/net/sched/sch_api.c ++++ b/net/sched/sch_api.c +@@ -1044,12 +1044,12 @@ static int qdisc_graft(struct net_device *dev, struct Qdisc *parent, + + if (parent == NULL) { + unsigned int i, num_q, ingress; ++ struct netdev_queue *dev_queue; + + ingress = 0; + num_q = dev->num_tx_queues; + if ((q && q->flags & TCQ_F_INGRESS) || + (new && new->flags & TCQ_F_INGRESS)) { +- num_q = 1; + ingress = 1; + if (!dev_ingress_queue(dev)) { + NL_SET_ERR_MSG(extack, "Device does not have an ingress queue"); +@@ -1065,18 +1065,18 @@ static int qdisc_graft(struct net_device *dev, struct Qdisc *parent, + if (new && new->ops->attach && !ingress) + goto skip; + +- for (i = 0; i < num_q; i++) { +- struct netdev_queue *dev_queue = dev_ingress_queue(dev); +- +- if (!ingress) ++ if (!ingress) { ++ for (i = 0; i < num_q; i++) { + dev_queue = netdev_get_tx_queue(dev, i); ++ old = dev_graft_qdisc(dev_queue, new); + +- old = dev_graft_qdisc(dev_queue, new); +- if (new && i > 0) +- qdisc_refcount_inc(new); +- +- if (!ingress) ++ if (new && i > 0) ++ qdisc_refcount_inc(new); + qdisc_put(old); ++ } ++ } else { ++ dev_queue = dev_ingress_queue(dev); ++ old = dev_graft_qdisc(dev_queue, new); + } + + skip: +-- +2.43.0 + diff --git a/queue-5.15/netfilter-nf_tables-add-rescheduling-points-during-l.patch b/queue-5.15/netfilter-nf_tables-add-rescheduling-points-during-l.patch new file mode 100644 index 00000000000..eaf5b212bbb --- /dev/null +++ b/queue-5.15/netfilter-nf_tables-add-rescheduling-points-during-l.patch @@ -0,0 +1,53 @@ +From e3ac677512b571f01e73a2a19c506d97927fd4e7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Jul 2022 12:44:35 +0200 +Subject: netfilter: nf_tables: add rescheduling points during loop detection + walks + +From: Florian Westphal + +[ Upstream commit 81ea010667417ef3f218dfd99b69769fe66c2b67 ] + +Add explicit rescheduling points during ruleset walk. + +Switching to a faster algorithm is possible but this is a much +smaller change, suitable for nf tree. + +Link: https://bugzilla.netfilter.org/show_bug.cgi?id=1460 +Signed-off-by: Florian Westphal +Acked-by: Pablo Neira Ayuso +Signed-off-by: Sasha Levin +--- + net/netfilter/nf_tables_api.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c +index 3ad2b22886ff0..361fbbd430ad8 100644 +--- a/net/netfilter/nf_tables_api.c ++++ b/net/netfilter/nf_tables_api.c +@@ -3442,6 +3442,8 @@ int nft_chain_validate(const struct nft_ctx *ctx, const struct nft_chain *chain) + if (err < 0) + return err; + } ++ ++ cond_resched(); + } + + return 0; +@@ -10041,9 +10043,13 @@ static int nf_tables_check_loops(const struct nft_ctx *ctx, + break; + } + } ++ ++ cond_resched(); + } + + list_for_each_entry(set, &ctx->table->sets, list) { ++ cond_resched(); ++ + if (!nft_is_active_next(ctx->net, set)) + continue; + if (!(set->flags & NFT_SET_MAP) || +-- +2.43.0 + diff --git a/queue-5.15/perf-beauty-update-copy-of-linux-socket.h-with-the-k.patch b/queue-5.15/perf-beauty-update-copy-of-linux-socket.h-with-the-k.patch new file mode 100644 index 00000000000..e3d0ad66f0b --- /dev/null +++ b/queue-5.15/perf-beauty-update-copy-of-linux-socket.h-with-the-k.patch @@ -0,0 +1,50 @@ +From dfc5eb9a62e11da54741bea3382ac934948736e6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 19 Jun 2021 10:09:08 -0300 +Subject: perf beauty: Update copy of linux/socket.h with the kernel sources + +From: Arnaldo Carvalho de Melo + +[ Upstream commit 6da2a45e15af4f706fed211f8eb57a40cc7abfc7 ] + +To pick the changes in: + + 99ce45d5e7dbde39 ("mctp: Implement extended addressing") + 55c42fa7fa331f98 ("mptcp: add MPTCP_INFO getsockopt") + +That don't result in any changes in the tables generated from that +header. + +A table generator for setsockopt is needed, probably will be done in the +5.16 cycle. + +This silences this perf build warning: + + Warning: Kernel ABI header at 'tools/perf/trace/beauty/include/linux/socket.h' differs from latest version at 'include/linux/socket.h' + diff -u tools/perf/trace/beauty/include/linux/socket.h include/linux/socket.h + +Cc: David S. Miller +Cc: Florian Westphal +Cc: Jeremy Kerr +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/trace/beauty/include/linux/socket.h | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/tools/perf/trace/beauty/include/linux/socket.h b/tools/perf/trace/beauty/include/linux/socket.h +index 041d6032a3489..8ef26d89ef495 100644 +--- a/tools/perf/trace/beauty/include/linux/socket.h ++++ b/tools/perf/trace/beauty/include/linux/socket.h +@@ -364,6 +364,8 @@ struct ucred { + #define SOL_KCM 281 + #define SOL_TLS 282 + #define SOL_XDP 283 ++#define SOL_MPTCP 284 ++#define SOL_MCTP 285 + + /* IPX options */ + #define IPX_TYPE 1 +-- +2.43.0 + diff --git a/queue-5.15/platform-x86-asus-wmi-document-the-dgpu_disable-sysf.patch b/queue-5.15/platform-x86-asus-wmi-document-the-dgpu_disable-sysf.patch new file mode 100644 index 00000000000..f209945b4fd --- /dev/null +++ b/queue-5.15/platform-x86-asus-wmi-document-the-dgpu_disable-sysf.patch @@ -0,0 +1,42 @@ +From 24c016d5f5685fb361fe42c8302f29513cac931a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 13 Aug 2022 10:25:04 +1200 +Subject: platform/x86: asus-wmi: Document the dgpu_disable sysfs attribute + +From: Luke D. Jones + +[ Upstream commit 7e64c486e807c8edfbd3a0c8e44ad7a1896dbec8 ] + +The dgpu_disable attribute was not documented, this adds the +required documentation. + +Fixes: 98829e84dc67 ("asus-wmi: Add dgpu disable method") +Signed-off-by: Luke D. Jones +Link: https://lore.kernel.org/r/20220812222509.292692-2-luke@ljones.dev +Reviewed-by: Hans de Goede +Signed-off-by: Hans de Goede +Signed-off-by: Sasha Levin +--- + Documentation/ABI/testing/sysfs-platform-asus-wmi | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/Documentation/ABI/testing/sysfs-platform-asus-wmi b/Documentation/ABI/testing/sysfs-platform-asus-wmi +index 04885738cf156..0f8f0772d6f3b 100644 +--- a/Documentation/ABI/testing/sysfs-platform-asus-wmi ++++ b/Documentation/ABI/testing/sysfs-platform-asus-wmi +@@ -57,3 +57,12 @@ Description: + * 0 - default, + * 1 - overboost, + * 2 - silent ++ ++What: /sys/devices/platform//dgpu_disable ++Date: Aug 2022 ++KernelVersion: 5.17 ++Contact: "Luke Jones" ++Description: ++ Disable discrete GPU: ++ * 0 - Enable dGPU, ++ * 1 - Disable dGPU +-- +2.43.0 + diff --git a/queue-5.15/pm-core-add-new-_pm_ops-macros-deprecate-old-ones.patch b/queue-5.15/pm-core-add-new-_pm_ops-macros-deprecate-old-ones.patch new file mode 100644 index 00000000000..10e3633c23f --- /dev/null +++ b/queue-5.15/pm-core-add-new-_pm_ops-macros-deprecate-old-ones.patch @@ -0,0 +1,197 @@ +From 49c5084be681b0527616ebf32894fd467b073cd9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 Dec 2021 00:21:00 +0000 +Subject: PM: core: Add new *_PM_OPS macros, deprecate old ones + +From: Paul Cercueil + +[ Upstream commit 1a3c7bb088266fa2db017be299f91f1c1894c857 ] + +This commit introduces the following macros: + +SYSTEM_SLEEP_PM_OPS() +LATE_SYSTEM_SLEEP_PM_OPS() +NOIRQ_SYSTEM_SLEEP_PM_OPS() +RUNTIME_PM_OPS() + +These new macros are very similar to their SET_*_PM_OPS() equivalent. +They however differ in the fact that the callbacks they set will always +be seen as referenced by the compiler. This means that the callback +functions don't need to be wrapped with a #ifdef CONFIG_PM guard, or +tagged with __maybe_unused, to prevent the compiler from complaining +about unused static symbols. The compiler will then simply evaluate at +compile time whether or not these symbols are dead code. + +The callbacks that are only useful with CONFIG_PM_SLEEP is enabled, are +now also wrapped with a new pm_sleep_ptr() macro, which is inspired from +pm_ptr(). This is needed for drivers that use different callbacks for +sleep and runtime PM, to handle the case where CONFIG_PM is set and +CONFIG_PM_SLEEP is not. + +This commit also deprecates the following macros: + +SIMPLE_DEV_PM_OPS() +UNIVERSAL_DEV_PM_OPS() + +And introduces the following macros: + +DEFINE_SIMPLE_DEV_PM_OPS() +DEFINE_UNIVERSAL_DEV_PM_OPS() + +These macros are similar to the functions they were created to replace, +with the following differences: + + - They use the new macros introduced above, and as such always + reference the provided callback functions. + + - They are not tagged with __maybe_unused. They are meant to be used + with pm_ptr() or pm_sleep_ptr() for DEFINE_UNIVERSAL_DEV_PM_OPS() + and DEFINE_SIMPLE_DEV_PM_OPS() respectively. + + - They declare the symbol static, since every driver seems to do that + anyway; and if a non-static use-case is needed an indirection pointer + could be used. + +The point of this change, is to progressively switch from a code model +where PM callbacks are all protected behind CONFIG_PM guards, to a code +model where the PM callbacks are always seen by the compiler, but +discarded if not used. + +Signed-off-by: Paul Cercueil +Reviewed-by: Jonathan Cameron +Signed-off-by: Rafael J. Wysocki +Stable-dep-of: 18ab69c8ca56 ("Input: iqs269a - do not poll during suspend or resume") +Signed-off-by: Sasha Levin +--- + include/linux/pm.h | 74 +++++++++++++++++++++++++++++++--------------- + 1 file changed, 50 insertions(+), 24 deletions(-) + +diff --git a/include/linux/pm.h b/include/linux/pm.h +index b88ac7dcf2a20..fc9691cb01b4f 100644 +--- a/include/linux/pm.h ++++ b/include/linux/pm.h +@@ -300,47 +300,59 @@ struct dev_pm_ops { + int (*runtime_idle)(struct device *dev); + }; + ++#define SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ ++ .suspend = pm_sleep_ptr(suspend_fn), \ ++ .resume = pm_sleep_ptr(resume_fn), \ ++ .freeze = pm_sleep_ptr(suspend_fn), \ ++ .thaw = pm_sleep_ptr(resume_fn), \ ++ .poweroff = pm_sleep_ptr(suspend_fn), \ ++ .restore = pm_sleep_ptr(resume_fn), ++ ++#define LATE_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ ++ .suspend_late = pm_sleep_ptr(suspend_fn), \ ++ .resume_early = pm_sleep_ptr(resume_fn), \ ++ .freeze_late = pm_sleep_ptr(suspend_fn), \ ++ .thaw_early = pm_sleep_ptr(resume_fn), \ ++ .poweroff_late = pm_sleep_ptr(suspend_fn), \ ++ .restore_early = pm_sleep_ptr(resume_fn), ++ ++#define NOIRQ_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ ++ .suspend_noirq = pm_sleep_ptr(suspend_fn), \ ++ .resume_noirq = pm_sleep_ptr(resume_fn), \ ++ .freeze_noirq = pm_sleep_ptr(suspend_fn), \ ++ .thaw_noirq = pm_sleep_ptr(resume_fn), \ ++ .poweroff_noirq = pm_sleep_ptr(suspend_fn), \ ++ .restore_noirq = pm_sleep_ptr(resume_fn), ++ ++#define RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) \ ++ .runtime_suspend = suspend_fn, \ ++ .runtime_resume = resume_fn, \ ++ .runtime_idle = idle_fn, ++ + #ifdef CONFIG_PM_SLEEP + #define SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ +- .suspend = suspend_fn, \ +- .resume = resume_fn, \ +- .freeze = suspend_fn, \ +- .thaw = resume_fn, \ +- .poweroff = suspend_fn, \ +- .restore = resume_fn, ++ SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) + #else + #define SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) + #endif + + #ifdef CONFIG_PM_SLEEP + #define SET_LATE_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ +- .suspend_late = suspend_fn, \ +- .resume_early = resume_fn, \ +- .freeze_late = suspend_fn, \ +- .thaw_early = resume_fn, \ +- .poweroff_late = suspend_fn, \ +- .restore_early = resume_fn, ++ LATE_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) + #else + #define SET_LATE_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) + #endif + + #ifdef CONFIG_PM_SLEEP + #define SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ +- .suspend_noirq = suspend_fn, \ +- .resume_noirq = resume_fn, \ +- .freeze_noirq = suspend_fn, \ +- .thaw_noirq = resume_fn, \ +- .poweroff_noirq = suspend_fn, \ +- .restore_noirq = resume_fn, ++ NOIRQ_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) + #else + #define SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) + #endif + + #ifdef CONFIG_PM + #define SET_RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) \ +- .runtime_suspend = suspend_fn, \ +- .runtime_resume = resume_fn, \ +- .runtime_idle = idle_fn, ++ RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) + #else + #define SET_RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) + #endif +@@ -349,9 +361,9 @@ struct dev_pm_ops { + * Use this if you want to use the same suspend and resume callbacks for suspend + * to RAM and hibernation. + */ +-#define SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \ +-const struct dev_pm_ops __maybe_unused name = { \ +- SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ ++#define DEFINE_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \ ++static const struct dev_pm_ops name = { \ ++ SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ + } + + /* +@@ -367,6 +379,19 @@ const struct dev_pm_ops __maybe_unused name = { \ + * .resume_early(), to the same routines as .runtime_suspend() and + * .runtime_resume(), respectively (and analogously for hibernation). + */ ++#define DEFINE_UNIVERSAL_DEV_PM_OPS(name, suspend_fn, resume_fn, idle_fn) \ ++static const struct dev_pm_ops name = { \ ++ SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ ++ RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) \ ++} ++ ++/* Deprecated. Use DEFINE_SIMPLE_DEV_PM_OPS() instead. */ ++#define SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \ ++const struct dev_pm_ops __maybe_unused name = { \ ++ SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ ++} ++ ++/* Deprecated. Use DEFINE_UNIVERSAL_DEV_PM_OPS() instead. */ + #define UNIVERSAL_DEV_PM_OPS(name, suspend_fn, resume_fn, idle_fn) \ + const struct dev_pm_ops __maybe_unused name = { \ + SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ +@@ -374,6 +399,7 @@ const struct dev_pm_ops __maybe_unused name = { \ + } + + #define pm_ptr(_ptr) PTR_IF(IS_ENABLED(CONFIG_PM), (_ptr)) ++#define pm_sleep_ptr(_ptr) PTR_IF(IS_ENABLED(CONFIG_PM_SLEEP), (_ptr)) + + /* + * PM_EVENT_ messages +-- +2.43.0 + diff --git a/queue-5.15/pm-core-redefine-pm_ptr-macro.patch b/queue-5.15/pm-core-redefine-pm_ptr-macro.patch new file mode 100644 index 00000000000..a5cde0179e8 --- /dev/null +++ b/queue-5.15/pm-core-redefine-pm_ptr-macro.patch @@ -0,0 +1,61 @@ +From 01e70b48fd5fe002909de33f2ecf2281463a7b96 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 Dec 2021 00:20:59 +0000 +Subject: PM: core: Redefine pm_ptr() macro + +From: Paul Cercueil + +[ Upstream commit c06ef740d401d0f4ab188882bf6f8d9cf0f75eaf ] + +The pm_ptr() macro was previously conditionally defined, according to +the value of the CONFIG_PM option. This meant that the pointed structure +was either referenced (if CONFIG_PM was set), or never referenced (if +CONFIG_PM was not set), causing it to be detected as unused by the +compiler. + +This worked fine, but required the __maybe_unused compiler attribute to +be used to every symbol pointed to by a pointer wrapped with pm_ptr(). + +We can do better. With this change, the pm_ptr() is now defined the +same, independently of the value of CONFIG_PM. It now uses the (?:) +ternary operator to conditionally resolve to its argument. Since the +condition is known at compile time, the compiler will then choose to +discard the unused symbols, which won't need to be tagged with +__maybe_unused anymore. + +This pm_ptr() macro is usually used with pointers to dev_pm_ops +structures created with SIMPLE_DEV_PM_OPS() or similar macros. These do +use a __maybe_unused flag, which is now useless with this change, so it +later can be removed. However in the meantime it causes no harm, and all +the drivers still compile fine with the new pm_ptr() macro. + +Signed-off-by: Paul Cercueil +Reviewed-by: Jonathan Cameron +Reviewed-by: Arnd Bergmann +Signed-off-by: Rafael J. Wysocki +Stable-dep-of: 18ab69c8ca56 ("Input: iqs269a - do not poll during suspend or resume") +Signed-off-by: Sasha Levin +--- + include/linux/pm.h | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +diff --git a/include/linux/pm.h b/include/linux/pm.h +index 1d8209c09686c..b88ac7dcf2a20 100644 +--- a/include/linux/pm.h ++++ b/include/linux/pm.h +@@ -373,11 +373,7 @@ const struct dev_pm_ops __maybe_unused name = { \ + SET_RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) \ + } + +-#ifdef CONFIG_PM +-#define pm_ptr(_ptr) (_ptr) +-#else +-#define pm_ptr(_ptr) NULL +-#endif ++#define pm_ptr(_ptr) PTR_IF(IS_ENABLED(CONFIG_PM), (_ptr)) + + /* + * PM_EVENT_ messages +-- +2.43.0 + diff --git a/queue-5.15/pm-core-remove-static-qualifier-in-define_simple_dev.patch b/queue-5.15/pm-core-remove-static-qualifier-in-define_simple_dev.patch new file mode 100644 index 00000000000..ff41f815f71 --- /dev/null +++ b/queue-5.15/pm-core-remove-static-qualifier-in-define_simple_dev.patch @@ -0,0 +1,72 @@ +From 345c3aa17f2dd15b127c501199828e964db3d7df Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 7 Jan 2022 18:17:19 +0000 +Subject: PM: core: Remove static qualifier in DEFINE_SIMPLE_DEV_PM_OPS macro + +From: Paul Cercueil + +[ Upstream commit 52cc1d7f9786d2be44a3ab9b5b48416a7618e713 ] + +Keep this macro in line with the other ones. This makes it possible to +use them in the cases where the underlying dev_pm_ops structure is +exported. + +Restore the "static" qualifier in the two drivers where the +DEFINE_SIMPLE_DEV_PM_OPS macro was used. + +Signed-off-by: Paul Cercueil +Acked-by: Jonathan Cameron +Reviewed-by: Ulf Hansson +Signed-off-by: Rafael J. Wysocki +Stable-dep-of: 18ab69c8ca56 ("Input: iqs269a - do not poll during suspend or resume") +Signed-off-by: Sasha Levin +--- + drivers/mmc/host/jz4740_mmc.c | 4 ++-- + drivers/mmc/host/mxcmmc.c | 2 +- + include/linux/pm.h | 2 +- + 3 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/mmc/host/jz4740_mmc.c b/drivers/mmc/host/jz4740_mmc.c +index ef3fe837b49d2..2254db44fb02c 100644 +--- a/drivers/mmc/host/jz4740_mmc.c ++++ b/drivers/mmc/host/jz4740_mmc.c +@@ -1143,8 +1143,8 @@ static int jz4740_mmc_resume(struct device *dev) + return pinctrl_select_default_state(dev); + } + +-DEFINE_SIMPLE_DEV_PM_OPS(jz4740_mmc_pm_ops, jz4740_mmc_suspend, +- jz4740_mmc_resume); ++static DEFINE_SIMPLE_DEV_PM_OPS(jz4740_mmc_pm_ops, jz4740_mmc_suspend, ++ jz4740_mmc_resume); + + static struct platform_driver jz4740_mmc_driver = { + .probe = jz4740_mmc_probe, +diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c +index b5f65f39ced1c..2e39b2cb1cafa 100644 +--- a/drivers/mmc/host/mxcmmc.c ++++ b/drivers/mmc/host/mxcmmc.c +@@ -1212,7 +1212,7 @@ static int mxcmci_resume(struct device *dev) + return ret; + } + +-DEFINE_SIMPLE_DEV_PM_OPS(mxcmci_pm_ops, mxcmci_suspend, mxcmci_resume); ++static DEFINE_SIMPLE_DEV_PM_OPS(mxcmci_pm_ops, mxcmci_suspend, mxcmci_resume); + + static struct platform_driver mxcmci_driver = { + .probe = mxcmci_probe, +diff --git a/include/linux/pm.h b/include/linux/pm.h +index fc9691cb01b4f..d1c19f5b1380f 100644 +--- a/include/linux/pm.h ++++ b/include/linux/pm.h +@@ -362,7 +362,7 @@ struct dev_pm_ops { + * to RAM and hibernation. + */ + #define DEFINE_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \ +-static const struct dev_pm_ops name = { \ ++const struct dev_pm_ops name = { \ + SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ + } + +-- +2.43.0 + diff --git a/queue-5.15/posix-timers-ensure-timer-id-search-loop-limit-is-va.patch b/queue-5.15/posix-timers-ensure-timer-id-search-loop-limit-is-va.patch new file mode 100644 index 00000000000..0f99dc0e8a0 --- /dev/null +++ b/queue-5.15/posix-timers-ensure-timer-id-search-loop-limit-is-va.patch @@ -0,0 +1,115 @@ +From a802395eb2076fcacd6ab81ac9e42719bde6c144 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 1 Jun 2023 20:58:47 +0200 +Subject: posix-timers: Ensure timer ID search-loop limit is valid + +From: Thomas Gleixner + +[ Upstream commit 8ce8849dd1e78dadcee0ec9acbd259d239b7069f ] + +posix_timer_add() tries to allocate a posix timer ID by starting from the +cached ID which was stored by the last successful allocation. + +This is done in a loop searching the ID space for a free slot one by +one. The loop has to terminate when the search wrapped around to the +starting point. + +But that's racy vs. establishing the starting point. That is read out +lockless, which leads to the following problem: + +CPU0 CPU1 +posix_timer_add() + start = sig->posix_timer_id; + lock(hash_lock); + ... posix_timer_add() + if (++sig->posix_timer_id < 0) + start = sig->posix_timer_id; + sig->posix_timer_id = 0; + +So CPU1 can observe a negative start value, i.e. -1, and the loop break +never happens because the condition can never be true: + + if (sig->posix_timer_id == start) + break; + +While this is unlikely to ever turn into an endless loop as the ID space is +huge (INT_MAX), the racy read of the start value caught the attention of +KCSAN and Dmitry unearthed that incorrectness. + +Rewrite it so that all id operations are under the hash lock. + +Reported-by: syzbot+5c54bd3eb218bb595aa9@syzkaller.appspotmail.com +Reported-by: Dmitry Vyukov +Signed-off-by: Thomas Gleixner +Reviewed-by: Frederic Weisbecker +Link: https://lore.kernel.org/r/87bkhzdn6g.ffs@tglx +Signed-off-by: Sasha Levin +--- + include/linux/sched/signal.h | 2 +- + kernel/time/posix-timers.c | 31 ++++++++++++++++++------------- + 2 files changed, 19 insertions(+), 14 deletions(-) + +diff --git a/include/linux/sched/signal.h b/include/linux/sched/signal.h +index 5f0e8403e8ceb..9743f7d173a0b 100644 +--- a/include/linux/sched/signal.h ++++ b/include/linux/sched/signal.h +@@ -125,7 +125,7 @@ struct signal_struct { + #ifdef CONFIG_POSIX_TIMERS + + /* POSIX.1b Interval Timers */ +- int posix_timer_id; ++ unsigned int next_posix_timer_id; + struct list_head posix_timers; + + /* ITIMER_REAL timer for the process */ +diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c +index ed3c4a9543982..2d6cf93ca370a 100644 +--- a/kernel/time/posix-timers.c ++++ b/kernel/time/posix-timers.c +@@ -140,25 +140,30 @@ static struct k_itimer *posix_timer_by_id(timer_t id) + static int posix_timer_add(struct k_itimer *timer) + { + struct signal_struct *sig = current->signal; +- int first_free_id = sig->posix_timer_id; + struct hlist_head *head; +- int ret = -ENOENT; ++ unsigned int cnt, id; + +- do { ++ /* ++ * FIXME: Replace this by a per signal struct xarray once there is ++ * a plan to handle the resulting CRIU regression gracefully. ++ */ ++ for (cnt = 0; cnt <= INT_MAX; cnt++) { + spin_lock(&hash_lock); +- head = &posix_timers_hashtable[hash(sig, sig->posix_timer_id)]; +- if (!__posix_timers_find(head, sig, sig->posix_timer_id)) { ++ id = sig->next_posix_timer_id; ++ ++ /* Write the next ID back. Clamp it to the positive space */ ++ sig->next_posix_timer_id = (id + 1) & INT_MAX; ++ ++ head = &posix_timers_hashtable[hash(sig, id)]; ++ if (!__posix_timers_find(head, sig, id)) { + hlist_add_head_rcu(&timer->t_hash, head); +- ret = sig->posix_timer_id; ++ spin_unlock(&hash_lock); ++ return id; + } +- if (++sig->posix_timer_id < 0) +- sig->posix_timer_id = 0; +- if ((sig->posix_timer_id == first_free_id) && (ret == -ENOENT)) +- /* Loop over all possible ids completed */ +- ret = -EAGAIN; + spin_unlock(&hash_lock); +- } while (ret == -ENOENT); +- return ret; ++ } ++ /* POSIX return code when no timer ID could be allocated */ ++ return -EAGAIN; + } + + static inline void unlock_timer(struct k_itimer *timr, unsigned long flags) +-- +2.43.0 + diff --git a/queue-5.15/powerpc-eeh-set-channel-state-after-notifying-the-dr.patch b/queue-5.15/powerpc-eeh-set-channel-state-after-notifying-the-dr.patch new file mode 100644 index 00000000000..7c08d1d59da --- /dev/null +++ b/queue-5.15/powerpc-eeh-set-channel-state-after-notifying-the-dr.patch @@ -0,0 +1,83 @@ +From 6fd3cfde0d31818b10f6c2b22c5f8e3fdd7eccc8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 Feb 2023 16:26:49 +0530 +Subject: powerpc/eeh: Set channel state after notifying the drivers + +From: Ganesh Goudar + +[ Upstream commit 9efcdaac36e1643a1b7f5337e6143ce142d381b1 ] + +When a PCI error is encountered 6th time in an hour we +set the channel state to perm_failure and notify the +driver about the permanent failure. + +However, after upstream commit 38ddc011478e ("powerpc/eeh: +Make permanently failed devices non-actionable"), EEH handler +stops calling any routine once the device is marked as +permanent failure. This issue can lead to fatal consequences +like kernel hang with certain PCI devices. + +Following log is observed with lpfc driver, with and without +this change, Without this change kernel hangs, If PCI error +is encountered 6 times for a device in an hour. + +Without the change + + EEH: Beginning: 'error_detected(permanent failure)' + PCI 0132:60:00.0#600000: EEH: not actionable (1,1,1) + PCI 0132:60:00.1#600000: EEH: not actionable (1,1,1) + EEH: Finished:'error_detected(permanent failure)' + +With the change + + EEH: Beginning: 'error_detected(permanent failure)' + EEH: Invoking lpfc->error_detected(permanent failure) + EEH: lpfc driver reports: 'disconnect' + EEH: Invoking lpfc->error_detected(permanent failure) + EEH: lpfc driver reports: 'disconnect' + EEH: Finished:'error_detected(permanent failure)' + +To fix the issue, set channel state to permanent failure after +notifying the drivers. + +Fixes: 38ddc011478e ("powerpc/eeh: Make permanently failed devices non-actionable") +Suggested-by: Mahesh Salgaonkar +Signed-off-by: Ganesh Goudar +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20230209105649.127707-1-ganeshgr@linux.ibm.com +Signed-off-by: Sasha Levin +--- + arch/powerpc/kernel/eeh_driver.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c +index cb3ac555c9446..665d847ef9b5a 100644 +--- a/arch/powerpc/kernel/eeh_driver.c ++++ b/arch/powerpc/kernel/eeh_driver.c +@@ -1069,10 +1069,10 @@ void eeh_handle_normal_event(struct eeh_pe *pe) + eeh_slot_error_detail(pe, EEH_LOG_PERM); + + /* Notify all devices that they're about to go down. */ +- eeh_set_channel_state(pe, pci_channel_io_perm_failure); + eeh_set_irq_state(pe, false); + eeh_pe_report("error_detected(permanent failure)", pe, + eeh_report_failure, NULL); ++ eeh_set_channel_state(pe, pci_channel_io_perm_failure); + + /* Mark the PE to be removed permanently */ + eeh_pe_state_mark(pe, EEH_PE_REMOVED); +@@ -1189,10 +1189,10 @@ void eeh_handle_special_event(void) + + /* Notify all devices to be down */ + eeh_pe_state_clear(pe, EEH_PE_PRI_BUS, true); +- eeh_set_channel_state(pe, pci_channel_io_perm_failure); + eeh_pe_report( + "error_detected(permanent failure)", pe, + eeh_report_failure, NULL); ++ eeh_set_channel_state(pe, pci_channel_io_perm_failure); + + pci_lock_rescan_remove(); + list_for_each_entry(hose, &hose_list, list_node) { +-- +2.43.0 + diff --git a/queue-5.15/powerpc-eeh-small-refactor-of-eeh_handle_normal_even.patch b/queue-5.15/powerpc-eeh-small-refactor-of-eeh_handle_normal_even.patch new file mode 100644 index 00000000000..935731aa0a0 --- /dev/null +++ b/queue-5.15/powerpc-eeh-small-refactor-of-eeh_handle_normal_even.patch @@ -0,0 +1,112 @@ +From fe1f25a020e9206906ba516b84311f7ee54e4a7f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Oct 2021 18:06:27 +1100 +Subject: powerpc/eeh: Small refactor of eeh_handle_normal_event() + +From: Daniel Axtens + +[ Upstream commit 10b34ece132ee46dc4e6459c765d180c422a09fa ] + +The control flow of eeh_handle_normal_event() is a bit tricky. + +Break out one of the error handling paths - rather than be in an else +block, we'll make it part of the regular body of the function and put a +'goto out;' in the true limb of the if. + +Signed-off-by: Daniel Axtens +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20211015070628.1331635-1-dja@axtens.net +Stable-dep-of: 9efcdaac36e1 ("powerpc/eeh: Set channel state after notifying the drivers") +Signed-off-by: Sasha Levin +--- + arch/powerpc/kernel/eeh_driver.c | 69 ++++++++++++++++---------------- + 1 file changed, 35 insertions(+), 34 deletions(-) + +diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c +index 3eff6a4888e79..cb3ac555c9446 100644 +--- a/arch/powerpc/kernel/eeh_driver.c ++++ b/arch/powerpc/kernel/eeh_driver.c +@@ -1054,45 +1054,46 @@ void eeh_handle_normal_event(struct eeh_pe *pe) + } + + pr_info("EEH: Recovery successful.\n"); +- } else { +- /* +- * About 90% of all real-life EEH failures in the field +- * are due to poorly seated PCI cards. Only 10% or so are +- * due to actual, failed cards. +- */ +- pr_err("EEH: Unable to recover from failure from PHB#%x-PE#%x.\n" +- "Please try reseating or replacing it\n", +- pe->phb->global_number, pe->addr); ++ goto out; ++ } + +- eeh_slot_error_detail(pe, EEH_LOG_PERM); ++ /* ++ * About 90% of all real-life EEH failures in the field ++ * are due to poorly seated PCI cards. Only 10% or so are ++ * due to actual, failed cards. ++ */ ++ pr_err("EEH: Unable to recover from failure from PHB#%x-PE#%x.\n" ++ "Please try reseating or replacing it\n", ++ pe->phb->global_number, pe->addr); + +- /* Notify all devices that they're about to go down. */ +- eeh_set_channel_state(pe, pci_channel_io_perm_failure); +- eeh_set_irq_state(pe, false); +- eeh_pe_report("error_detected(permanent failure)", pe, +- eeh_report_failure, NULL); ++ eeh_slot_error_detail(pe, EEH_LOG_PERM); + +- /* Mark the PE to be removed permanently */ +- eeh_pe_state_mark(pe, EEH_PE_REMOVED); ++ /* Notify all devices that they're about to go down. */ ++ eeh_set_channel_state(pe, pci_channel_io_perm_failure); ++ eeh_set_irq_state(pe, false); ++ eeh_pe_report("error_detected(permanent failure)", pe, ++ eeh_report_failure, NULL); + +- /* +- * Shut down the device drivers for good. We mark +- * all removed devices correctly to avoid access +- * the their PCI config any more. +- */ +- if (pe->type & EEH_PE_VF) { +- eeh_pe_dev_traverse(pe, eeh_rmv_device, NULL); +- eeh_pe_dev_mode_mark(pe, EEH_DEV_REMOVED); +- } else { +- eeh_pe_state_clear(pe, EEH_PE_PRI_BUS, true); +- eeh_pe_dev_mode_mark(pe, EEH_DEV_REMOVED); ++ /* Mark the PE to be removed permanently */ ++ eeh_pe_state_mark(pe, EEH_PE_REMOVED); + +- pci_lock_rescan_remove(); +- pci_hp_remove_devices(bus); +- pci_unlock_rescan_remove(); +- /* The passed PE should no longer be used */ +- return; +- } ++ /* ++ * Shut down the device drivers for good. We mark ++ * all removed devices correctly to avoid access ++ * the their PCI config any more. ++ */ ++ if (pe->type & EEH_PE_VF) { ++ eeh_pe_dev_traverse(pe, eeh_rmv_device, NULL); ++ eeh_pe_dev_mode_mark(pe, EEH_DEV_REMOVED); ++ } else { ++ eeh_pe_state_clear(pe, EEH_PE_PRI_BUS, true); ++ eeh_pe_dev_mode_mark(pe, EEH_DEV_REMOVED); ++ ++ pci_lock_rescan_remove(); ++ pci_hp_remove_devices(bus); ++ pci_unlock_rescan_remove(); ++ /* The passed PE should no longer be used */ ++ return; + } + + out: +-- +2.43.0 + diff --git a/queue-5.15/powerpc-perf-hv-24x7-add-missing-rtas-retry-status-h.patch b/queue-5.15/powerpc-perf-hv-24x7-add-missing-rtas-retry-status-h.patch new file mode 100644 index 00000000000..a3a3db4d1ae --- /dev/null +++ b/queue-5.15/powerpc-perf-hv-24x7-add-missing-rtas-retry-status-h.patch @@ -0,0 +1,94 @@ +From 00627de1cad3a553f6bc547609398976bb2d2e3c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 Feb 2023 12:41:50 -0600 +Subject: powerpc/perf/hv-24x7: add missing RTAS retry status handling + +From: Nathan Lynch + +[ Upstream commit cc4b26eab1859fa1a70711872caaf6414809973f ] + +The ibm,get-system-parameter RTAS function may return -2 or 990x, +which indicate that the caller should try again. read_24x7_sys_info() +ignores this, allowing transient failures in reporting processor +module information. + +Move the RTAS call into a coventional rtas_busy_delay()-based loop, +along with the parsing of results on success. + +Signed-off-by: Nathan Lynch +Fixes: 8ba214267382 ("powerpc/hv-24x7: Add rtas call in hv-24x7 driver to get processor details") +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20230125-b4-powerpc-rtas-queue-v3-2-26929c8cce78@linux.ibm.com +Signed-off-by: Sasha Levin +--- + arch/powerpc/perf/hv-24x7.c | 42 ++++++++++++++++--------------------- + 1 file changed, 18 insertions(+), 24 deletions(-) + +diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c +index 284ccc90fb11c..f68fa53f4b1a2 100644 +--- a/arch/powerpc/perf/hv-24x7.c ++++ b/arch/powerpc/perf/hv-24x7.c +@@ -79,9 +79,8 @@ static u32 phys_coresperchip; /* Physical cores per chip */ + */ + void read_24x7_sys_info(void) + { +- int call_status, len, ntypes; +- +- spin_lock(&rtas_data_buf_lock); ++ const s32 token = rtas_token("ibm,get-system-parameter"); ++ int call_status; + + /* + * Making system parameter: chips and sockets and cores per chip +@@ -91,32 +90,27 @@ void read_24x7_sys_info(void) + phys_chipspersocket = 1; + phys_coresperchip = 1; + +- call_status = rtas_call(rtas_token("ibm,get-system-parameter"), 3, 1, +- NULL, +- PROCESSOR_MODULE_INFO, +- __pa(rtas_data_buf), +- RTAS_DATA_BUF_SIZE); ++ do { ++ spin_lock(&rtas_data_buf_lock); ++ call_status = rtas_call(token, 3, 1, NULL, PROCESSOR_MODULE_INFO, ++ __pa(rtas_data_buf), RTAS_DATA_BUF_SIZE); ++ if (call_status == 0) { ++ int ntypes = be16_to_cpup((__be16 *)&rtas_data_buf[2]); ++ int len = be16_to_cpup((__be16 *)&rtas_data_buf[0]); ++ ++ if (len >= 8 && ntypes != 0) { ++ phys_sockets = be16_to_cpup((__be16 *)&rtas_data_buf[4]); ++ phys_chipspersocket = be16_to_cpup((__be16 *)&rtas_data_buf[6]); ++ phys_coresperchip = be16_to_cpup((__be16 *)&rtas_data_buf[8]); ++ } ++ } ++ spin_unlock(&rtas_data_buf_lock); ++ } while (rtas_busy_delay(call_status)); + + if (call_status != 0) { + pr_err("Error calling get-system-parameter %d\n", + call_status); +- } else { +- len = be16_to_cpup((__be16 *)&rtas_data_buf[0]); +- if (len < 8) +- goto out; +- +- ntypes = be16_to_cpup((__be16 *)&rtas_data_buf[2]); +- +- if (!ntypes) +- goto out; +- +- phys_sockets = be16_to_cpup((__be16 *)&rtas_data_buf[4]); +- phys_chipspersocket = be16_to_cpup((__be16 *)&rtas_data_buf[6]); +- phys_coresperchip = be16_to_cpup((__be16 *)&rtas_data_buf[8]); + } +- +-out: +- spin_unlock(&rtas_data_buf_lock); + } + + /* Domains for which more than one result element are returned for each event. */ +-- +2.43.0 + diff --git a/queue-5.15/powerpc-powernv-ioda-skip-unallocated-resources-when.patch b/queue-5.15/powerpc-powernv-ioda-skip-unallocated-resources-when.patch new file mode 100644 index 00000000000..0ed8a191c58 --- /dev/null +++ b/queue-5.15/powerpc-powernv-ioda-skip-unallocated-resources-when.patch @@ -0,0 +1,93 @@ +From eb581814042be5d4ec96041fe0d9008662cf7c76 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 Jan 2023 10:32:15 +0100 +Subject: powerpc/powernv/ioda: Skip unallocated resources when mapping to PE + +From: Frederic Barrat + +[ Upstream commit e64e71056f323a1e178dccf04d4c0f032d84436c ] + +pnv_ioda_setup_pe_res() calls opal to map a resource with a PE. However, +the code assumes the resource is allocated and it uses the resource +address to find out the segment(s) which need to be mapped to the +PE. In the unlikely case where the resource hasn't been allocated, the +computation for the segment number is garbage, which can lead to +invalid memory access and potentially a kernel crash, such as: + +[ ] pci_bus 0002:02: Configuring PE for bus +[ ] pci 0002:02 : [PE# fc] Secondary bus 0x0000000000000002..0x0000000000000002 associated with PE#fc +[ ] BUG: Kernel NULL pointer dereference on write at 0x00000000 +[ ] Faulting instruction address: 0xc00000000005eac4 +[ ] Oops: Kernel access of bad area, sig: 7 [#1] +[ ] LE PAGE_SIZE=64K MMU=Radix SMP NR_CPUS=2048 NUMA PowerNV +[ ] Modules linked in: +[ ] CPU: 12 PID: 1 Comm: swapper/20 Not tainted 5.10.50-openpower1 #2 +[ ] NIP: c00000000005eac4 LR: c00000000005ea44 CTR: 0000000030061b9c +[ ] REGS: c000200007383650 TRAP: 0300 Not tainted (5.10.50-openpower1) +[ ] MSR: 9000000000009033 CR: 44000224 XER: 20040000 +[ ] CFAR: c00000000005eaa0 DAR: 0000000000000000 DSISR: 02080000 IRQMASK: 0 +[ ] GPR00: c00000000005dd98 c0002000073838e0 c00000000185de00 c000200fff018960 +[ ] GPR04: 00000000000000fc 0000000000000003 0000000000000000 0000000000000000 +[ ] GPR08: 0000000000000000 0000000000000000 0000000000000000 9000000000001033 +[ ] GPR12: 0000000031cb0000 c000000ffffe6a80 c000000000010a58 0000000000000000 +[ ] GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 +[ ] GPR20: 0000000000000000 0000000000000000 0000000000000000 c00000000711e200 +[ ] GPR24: 0000000000000100 c000200009501120 c00020000cee2800 00000000000003ff +[ ] GPR28: c000200fff018960 0000000000000000 c000200ffcb7fd00 0000000000000000 +[ ] NIP [c00000000005eac4] pnv_ioda_setup_pe_res+0x94/0x1a0 +[ ] LR [c00000000005ea44] pnv_ioda_setup_pe_res+0x14/0x1a0 +[ ] Call Trace: +[ ] [c0002000073838e0] [c00000000005eb98] pnv_ioda_setup_pe_res+0x168/0x1a0 (unreliable) +[ ] [c000200007383970] [c00000000005dd98] pnv_pci_ioda_dma_dev_setup+0x43c/0x970 +[ ] [c000200007383a60] [c000000000032cdc] pcibios_bus_add_device+0x78/0x18c +[ ] [c000200007383aa0] [c00000000028f2bc] pci_bus_add_device+0x28/0xbc +[ ] [c000200007383b10] [c00000000028f3a0] pci_bus_add_devices+0x50/0x7c +[ ] [c000200007383b50] [c00000000028f3c4] pci_bus_add_devices+0x74/0x7c +[ ] [c000200007383b90] [c00000000028f3c4] pci_bus_add_devices+0x74/0x7c +[ ] [c000200007383bd0] [c00000000069ad0c] pcibios_init+0xf0/0x104 +[ ] [c000200007383c50] [c0000000000106d8] do_one_initcall+0x84/0x1c4 +[ ] [c000200007383d20] [c0000000006910b8] kernel_init_freeable+0x264/0x268 +[ ] [c000200007383dc0] [c000000000010a68] kernel_init+0x18/0x138 +[ ] [c000200007383e20] [c00000000000cbfc] ret_from_kernel_thread+0x5c/0x80 +[ ] Instruction dump: +[ ] 7f89e840 409d000c 7fbbf840 409c000c 38210090 4848f448 809c002c e95e0120 +[ ] 7ba91764 38a00003 57a7043e 38c00000 <7c8a492e> 5484043e e87e0018 4bff23bd + +Hitting the problem is not that easy. It was seen with a (semi-bogus) +PCI device with a class code of 0. The generic PCI framework doesn't +allocate resources in such a case. + +The patch is simply skipping resources which are still flagged with +IORESOURCE_UNSET. + +We don't have the problem with 64-bit mem resources, as the address of +the resource is checked to be within the range of the 64-bit mmio +window. See pnv_ioda_reserve_dev_m64_pe() and pnv_pci_is_m64(). + +Reported-by: Andrew Jeffery +Fixes: 23e79425fe7c ("powerpc/powernv: Simplify pnv_ioda_setup_pe_seg()") +Signed-off-by: Frederic Barrat +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20230120093215.19496-1-fbarrat@linux.ibm.com +Signed-off-by: Sasha Levin +--- + arch/powerpc/platforms/powernv/pci-ioda.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c +index 624822a810193..8cf9e9f29763c 100644 +--- a/arch/powerpc/platforms/powernv/pci-ioda.c ++++ b/arch/powerpc/platforms/powernv/pci-ioda.c +@@ -2334,7 +2334,8 @@ static void pnv_ioda_setup_pe_res(struct pnv_ioda_pe *pe, + int index; + int64_t rc; + +- if (!res || !res->flags || res->start > res->end) ++ if (!res || !res->flags || res->start > res->end || ++ res->flags & IORESOURCE_UNSET) + return; + + if (res->flags & IORESOURCE_IO) { +-- +2.43.0 + diff --git a/queue-5.15/powerpc-pseries-lpar-add-missing-rtas-retry-status-h.patch b/queue-5.15/powerpc-pseries-lpar-add-missing-rtas-retry-status-h.patch new file mode 100644 index 00000000000..48500a701c9 --- /dev/null +++ b/queue-5.15/powerpc-pseries-lpar-add-missing-rtas-retry-status-h.patch @@ -0,0 +1,67 @@ +From 396c2dd67f89a853d31b67626e382210df0c02f3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 Feb 2023 12:41:51 -0600 +Subject: powerpc/pseries/lpar: add missing RTAS retry status handling + +From: Nathan Lynch + +[ Upstream commit daa8ab59044610aa8ef2ee45a6c157b5e11635e9 ] + +The ibm,get-system-parameter RTAS function may return -2 or 990x, +which indicate that the caller should try again. + +pseries_lpar_read_hblkrm_characteristics() ignores this, making it +possible to incorrectly detect TLB block invalidation characteristics +at boot. + +Move the RTAS call into a coventional rtas_busy_delay()-based loop. + +Signed-off-by: Nathan Lynch +Fixes: 1211ee61b4a8 ("powerpc/pseries: Read TLB Block Invalidate Characteristics") +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20230125-b4-powerpc-rtas-queue-v3-3-26929c8cce78@linux.ibm.com +Signed-off-by: Sasha Levin +--- + arch/powerpc/platforms/pseries/lpar.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c +index fce0237b07155..6c196b9413553 100644 +--- a/arch/powerpc/platforms/pseries/lpar.c ++++ b/arch/powerpc/platforms/pseries/lpar.c +@@ -1434,22 +1434,22 @@ static inline void __init check_lp_set_hblkrm(unsigned int lp, + + void __init pseries_lpar_read_hblkrm_characteristics(void) + { ++ const s32 token = rtas_token("ibm,get-system-parameter"); + unsigned char local_buffer[SPLPAR_TLB_BIC_MAXLENGTH]; + int call_status, len, idx, bpsize; + + if (!firmware_has_feature(FW_FEATURE_BLOCK_REMOVE)) + return; + +- spin_lock(&rtas_data_buf_lock); +- memset(rtas_data_buf, 0, RTAS_DATA_BUF_SIZE); +- call_status = rtas_call(rtas_token("ibm,get-system-parameter"), 3, 1, +- NULL, +- SPLPAR_TLB_BIC_TOKEN, +- __pa(rtas_data_buf), +- RTAS_DATA_BUF_SIZE); +- memcpy(local_buffer, rtas_data_buf, SPLPAR_TLB_BIC_MAXLENGTH); +- local_buffer[SPLPAR_TLB_BIC_MAXLENGTH - 1] = '\0'; +- spin_unlock(&rtas_data_buf_lock); ++ do { ++ spin_lock(&rtas_data_buf_lock); ++ memset(rtas_data_buf, 0, RTAS_DATA_BUF_SIZE); ++ call_status = rtas_call(token, 3, 1, NULL, SPLPAR_TLB_BIC_TOKEN, ++ __pa(rtas_data_buf), RTAS_DATA_BUF_SIZE); ++ memcpy(local_buffer, rtas_data_buf, SPLPAR_TLB_BIC_MAXLENGTH); ++ local_buffer[SPLPAR_TLB_BIC_MAXLENGTH - 1] = '\0'; ++ spin_unlock(&rtas_data_buf_lock); ++ } while (rtas_busy_delay(call_status)); + + if (call_status != 0) { + pr_warn("%s %s Error calling get-system-parameter (0x%x)\n", +-- +2.43.0 + diff --git a/queue-5.15/powerpc-pseries-lparcfg-add-missing-rtas-retry-statu.patch b/queue-5.15/powerpc-pseries-lparcfg-add-missing-rtas-retry-statu.patch new file mode 100644 index 00000000000..05cc633df59 --- /dev/null +++ b/queue-5.15/powerpc-pseries-lparcfg-add-missing-rtas-retry-statu.patch @@ -0,0 +1,67 @@ +From 44125a8845d7b8a742d70c8c2b0b37fcb3c4a465 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 Feb 2023 12:41:52 -0600 +Subject: powerpc/pseries/lparcfg: add missing RTAS retry status handling + +From: Nathan Lynch + +[ Upstream commit 5d08633e5f6564b60f1cbe09af3af40a74d66431 ] + +The ibm,get-system-parameter RTAS function may return -2 or 990x, +which indicate that the caller should try again. + +lparcfg's parse_system_parameter_string() ignores this, making it +possible to intermittently report incorrect SPLPAR characteristics. + +Move the RTAS call into a coventional rtas_busy_delay()-based loop. + +Signed-off-by: Nathan Lynch +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20230125-b4-powerpc-rtas-queue-v3-4-26929c8cce78@linux.ibm.com +Signed-off-by: Sasha Levin +--- + arch/powerpc/platforms/pseries/lparcfg.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +diff --git a/arch/powerpc/platforms/pseries/lparcfg.c b/arch/powerpc/platforms/pseries/lparcfg.c +index 19503a8797823..a291b5a94d4da 100644 +--- a/arch/powerpc/platforms/pseries/lparcfg.c ++++ b/arch/powerpc/platforms/pseries/lparcfg.c +@@ -322,6 +322,7 @@ static void parse_mpp_x_data(struct seq_file *m) + */ + static void parse_system_parameter_string(struct seq_file *m) + { ++ const s32 token = rtas_token("ibm,get-system-parameter"); + int call_status; + + unsigned char *local_buffer = kmalloc(SPLPAR_MAXLENGTH, GFP_KERNEL); +@@ -331,16 +332,15 @@ static void parse_system_parameter_string(struct seq_file *m) + return; + } + +- spin_lock(&rtas_data_buf_lock); +- memset(rtas_data_buf, 0, SPLPAR_MAXLENGTH); +- call_status = rtas_call(rtas_token("ibm,get-system-parameter"), 3, 1, +- NULL, +- SPLPAR_CHARACTERISTICS_TOKEN, +- __pa(rtas_data_buf), +- RTAS_DATA_BUF_SIZE); +- memcpy(local_buffer, rtas_data_buf, SPLPAR_MAXLENGTH); +- local_buffer[SPLPAR_MAXLENGTH - 1] = '\0'; +- spin_unlock(&rtas_data_buf_lock); ++ do { ++ spin_lock(&rtas_data_buf_lock); ++ memset(rtas_data_buf, 0, SPLPAR_MAXLENGTH); ++ call_status = rtas_call(token, 3, 1, NULL, SPLPAR_CHARACTERISTICS_TOKEN, ++ __pa(rtas_data_buf), RTAS_DATA_BUF_SIZE); ++ memcpy(local_buffer, rtas_data_buf, SPLPAR_MAXLENGTH); ++ local_buffer[SPLPAR_MAXLENGTH - 1] = '\0'; ++ spin_unlock(&rtas_data_buf_lock); ++ } while (rtas_busy_delay(call_status)); + + if (call_status != 0) { + printk(KERN_INFO +-- +2.43.0 + diff --git a/queue-5.15/powerpc-rtas-ensure-4kb-alignment-for-rtas_data_buf.patch b/queue-5.15/powerpc-rtas-ensure-4kb-alignment-for-rtas_data_buf.patch new file mode 100644 index 00000000000..0f9ed0fe9c5 --- /dev/null +++ b/queue-5.15/powerpc-rtas-ensure-4kb-alignment-for-rtas_data_buf.patch @@ -0,0 +1,57 @@ +From 288255d4ff083a6544144418ed14bfbbfe444b33 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 Feb 2023 12:41:54 -0600 +Subject: powerpc/rtas: ensure 4KB alignment for rtas_data_buf + +From: Nathan Lynch + +[ Upstream commit 836b5b9fcc8e09cea7e8a59a070349a00e818308 ] + +Some RTAS functions that have work area parameters impose alignment +requirements on the work area passed to them by the OS. Examples +include: + +- ibm,configure-connector +- ibm,update-nodes +- ibm,update-properties + +4KB is the greatest alignment required by PAPR for such +buffers. rtas_data_buf used to have a __page_aligned attribute in the +arch/ppc64 days, but that was changed to __cacheline_aligned for +unknown reasons by commit 033ef338b6e0 ("powerpc: Merge rtas.c into +arch/powerpc/kernel"). That works out to 128-byte alignment +on ppc64, which isn't right. + +This was found by inspection and I'm not aware of any real problems +caused by this. Either current RTAS implementations don't enforce the +alignment constraints, or rtas_data_buf is always being placed at a +4KB boundary by accident (or both, perhaps). + +Use __aligned(SZ_4K) to ensure the rtas_data_buf has alignment +appropriate for all users. + +Signed-off-by: Nathan Lynch +Fixes: 033ef338b6e0 ("powerpc: Merge rtas.c into arch/powerpc/kernel") +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20230125-b4-powerpc-rtas-queue-v3-6-26929c8cce78@linux.ibm.com +Signed-off-by: Sasha Levin +--- + arch/powerpc/kernel/rtas.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c +index 4da9baa0fbe8c..d01a0ad57e38e 100644 +--- a/arch/powerpc/kernel/rtas.c ++++ b/arch/powerpc/kernel/rtas.c +@@ -70,7 +70,7 @@ EXPORT_SYMBOL(rtas); + DEFINE_SPINLOCK(rtas_data_buf_lock); + EXPORT_SYMBOL_GPL(rtas_data_buf_lock); + +-char rtas_data_buf[RTAS_DATA_BUF_SIZE] __cacheline_aligned; ++char rtas_data_buf[RTAS_DATA_BUF_SIZE] __aligned(SZ_4K); + EXPORT_SYMBOL_GPL(rtas_data_buf); + + unsigned long rtas_rmo_buf; +-- +2.43.0 + diff --git a/queue-5.15/powerpc-rtas-make-all-exports-gpl.patch b/queue-5.15/powerpc-rtas-make-all-exports-gpl.patch new file mode 100644 index 00000000000..feb581341b3 --- /dev/null +++ b/queue-5.15/powerpc-rtas-make-all-exports-gpl.patch @@ -0,0 +1,140 @@ +From ea7fadc04a8fdd56e9d1919700a2c2592c66c70f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 24 Jan 2023 08:04:46 -0600 +Subject: powerpc/rtas: make all exports GPL + +From: Nathan Lynch + +[ Upstream commit 9bce6243848dfd0ff7c2be6e8d82ab9b1e6c7858 ] + +The first symbol exports of RTAS functions and data came with the (now +removed) scanlog driver in 2003: + +https://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git/commit/?id=f92e361842d5251e50562b09664082dcbd0548bb + +At the time this was applied, EXPORT_SYMBOL_GPL() was very new, and +the exports of rtas_call() etc have remained non-GPL. As new APIs have +been added to the RTAS subsystem, their symbol exports have followed +the convention set by existing code. + +However, the historical evidence is that RTAS function exports have been +added over time only to satisfy the needs of in-kernel users, and these +clients must have fairly intimate knowledge of how the APIs work to use +them safely. No out of tree users are known, and future ones seem +unlikely. + +Arguably the default for RTAS symbols should have become +EXPORT_SYMBOL_GPL once it was available. Let's make it so now, and +exceptions can be evaluated as needed. + +Signed-off-by: Nathan Lynch +Reviewed-by: Laurent Dufour +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20230124140448.45938-3-nathanl@linux.ibm.com +Stable-dep-of: 836b5b9fcc8e ("powerpc/rtas: ensure 4KB alignment for rtas_data_buf") +Signed-off-by: Sasha Levin +--- + arch/powerpc/kernel/rtas.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c +index a4cd2484dbca2..4da9baa0fbe8c 100644 +--- a/arch/powerpc/kernel/rtas.c ++++ b/arch/powerpc/kernel/rtas.c +@@ -68,10 +68,10 @@ struct rtas_t rtas = { + EXPORT_SYMBOL(rtas); + + DEFINE_SPINLOCK(rtas_data_buf_lock); +-EXPORT_SYMBOL(rtas_data_buf_lock); ++EXPORT_SYMBOL_GPL(rtas_data_buf_lock); + + char rtas_data_buf[RTAS_DATA_BUF_SIZE] __cacheline_aligned; +-EXPORT_SYMBOL(rtas_data_buf); ++EXPORT_SYMBOL_GPL(rtas_data_buf); + + unsigned long rtas_rmo_buf; + +@@ -80,7 +80,7 @@ unsigned long rtas_rmo_buf; + * This is done like this so rtas_flash can be a module. + */ + void (*rtas_flash_term_hook)(int); +-EXPORT_SYMBOL(rtas_flash_term_hook); ++EXPORT_SYMBOL_GPL(rtas_flash_term_hook); + + /* RTAS use home made raw locking instead of spin_lock_irqsave + * because those can be called from within really nasty contexts +@@ -328,7 +328,7 @@ void rtas_progress(char *s, unsigned short hex) + + spin_unlock(&progress_lock); + } +-EXPORT_SYMBOL(rtas_progress); /* needed by rtas_flash module */ ++EXPORT_SYMBOL_GPL(rtas_progress); /* needed by rtas_flash module */ + + int rtas_token(const char *service) + { +@@ -338,7 +338,7 @@ int rtas_token(const char *service) + tokp = of_get_property(rtas.dev, service, NULL); + return tokp ? be32_to_cpu(*tokp) : RTAS_UNKNOWN_SERVICE; + } +-EXPORT_SYMBOL(rtas_token); ++EXPORT_SYMBOL_GPL(rtas_token); + + int rtas_service_present(const char *service) + { +@@ -498,7 +498,7 @@ int rtas_call(int token, int nargs, int nret, int *outputs, ...) + } + return ret; + } +-EXPORT_SYMBOL(rtas_call); ++EXPORT_SYMBOL_GPL(rtas_call); + + /* For RTAS_BUSY (-2), delay for 1 millisecond. For an extended busy status + * code of 990n, perform the hinted delay of 10^n (last digit) milliseconds. +@@ -533,7 +533,7 @@ unsigned int rtas_busy_delay(int status) + + return ms; + } +-EXPORT_SYMBOL(rtas_busy_delay); ++EXPORT_SYMBOL_GPL(rtas_busy_delay); + + static int rtas_error_rc(int rtas_rc) + { +@@ -579,7 +579,7 @@ int rtas_get_power_level(int powerdomain, int *level) + return rtas_error_rc(rc); + return rc; + } +-EXPORT_SYMBOL(rtas_get_power_level); ++EXPORT_SYMBOL_GPL(rtas_get_power_level); + + int rtas_set_power_level(int powerdomain, int level, int *setlevel) + { +@@ -597,7 +597,7 @@ int rtas_set_power_level(int powerdomain, int level, int *setlevel) + return rtas_error_rc(rc); + return rc; + } +-EXPORT_SYMBOL(rtas_set_power_level); ++EXPORT_SYMBOL_GPL(rtas_set_power_level); + + int rtas_get_sensor(int sensor, int index, int *state) + { +@@ -615,7 +615,7 @@ int rtas_get_sensor(int sensor, int index, int *state) + return rtas_error_rc(rc); + return rc; + } +-EXPORT_SYMBOL(rtas_get_sensor); ++EXPORT_SYMBOL_GPL(rtas_get_sensor); + + int rtas_get_sensor_fast(int sensor, int index, int *state) + { +@@ -676,7 +676,7 @@ int rtas_set_indicator(int indicator, int index, int new_value) + return rtas_error_rc(rc); + return rc; + } +-EXPORT_SYMBOL(rtas_set_indicator); ++EXPORT_SYMBOL_GPL(rtas_set_indicator); + + /* + * Ignoring RTAS extended delay +-- +2.43.0 + diff --git a/queue-5.15/rdma-siw-balance-the-reference-of-cep-kref-in-the-er.patch b/queue-5.15/rdma-siw-balance-the-reference-of-cep-kref-in-the-er.patch new file mode 100644 index 00000000000..5000f0b542a --- /dev/null +++ b/queue-5.15/rdma-siw-balance-the-reference-of-cep-kref-in-the-er.patch @@ -0,0 +1,50 @@ +From 47f037ed42d9e8c5e21a72c054961c1e2104cb1b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 21 Aug 2023 21:32:53 +0800 +Subject: RDMA/siw: Balance the reference of cep->kref in the error path + +From: Guoqing Jiang + +[ Upstream commit b056327bee09e6b86683d3f709a438ccd6031d72 ] + +The siw_connect can go to err in below after cep is allocated successfully: + +1. If siw_cm_alloc_work returns failure. In this case socket is not +assoicated with cep so siw_cep_put can't be called by siw_socket_disassoc. +We need to call siw_cep_put twice since cep->kref is increased once after +it was initialized. + +2. If siw_cm_queue_work can't find a work, which means siw_cep_get is not +called in siw_cm_queue_work, so cep->kref is increased twice by siw_cep_get +and when associate socket with cep after it was initialized. So we need to +call siw_cep_put three times (one in siw_socket_disassoc). + +3. siw_send_mpareqrep returns error, this scenario is similar as 2. + +So we need to remove one siw_cep_put in the error path. + +Fixes: 6c52fdc244b5 ("rdma/siw: connection management") +Signed-off-by: Guoqing Jiang +Link: https://lore.kernel.org/r/20230821133255.31111-2-guoqing.jiang@linux.dev +Acked-by: Bernard Metzler +Signed-off-by: Leon Romanovsky +Signed-off-by: Sasha Levin +--- + drivers/infiniband/sw/siw/siw_cm.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/infiniband/sw/siw/siw_cm.c b/drivers/infiniband/sw/siw/siw_cm.c +index ecd19a7408679..116f1c38384b6 100644 +--- a/drivers/infiniband/sw/siw/siw_cm.c ++++ b/drivers/infiniband/sw/siw/siw_cm.c +@@ -1504,7 +1504,6 @@ int siw_connect(struct iw_cm_id *id, struct iw_cm_conn_param *params) + + cep->cm_id = NULL; + id->rem_ref(id); +- siw_cep_put(cep); + + qp->cep = NULL; + siw_cep_put(cep); +-- +2.43.0 + diff --git a/queue-5.15/rdma-siw-correct-wrong-debug-message.patch b/queue-5.15/rdma-siw-correct-wrong-debug-message.patch new file mode 100644 index 00000000000..827e92c1d23 --- /dev/null +++ b/queue-5.15/rdma-siw-correct-wrong-debug-message.patch @@ -0,0 +1,38 @@ +From 80b3f48e9f8de42951ca870ae3fdae13958e4ed4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 21 Aug 2023 21:32:54 +0800 +Subject: RDMA/siw: Correct wrong debug message + +From: Guoqing Jiang + +[ Upstream commit bee024d20451e4ce04ea30099cad09f7f75d288b ] + +We need to print num_sle first then pbl->max_buf per the condition. +Also replace mem->pbl with pbl while at it. + +Fixes: 303ae1cdfdf7 ("rdma/siw: application interface") +Signed-off-by: Guoqing Jiang +Link: https://lore.kernel.org/r/20230821133255.31111-3-guoqing.jiang@linux.dev +Acked-by: Bernard Metzler +Signed-off-by: Leon Romanovsky +Signed-off-by: Sasha Levin +--- + drivers/infiniband/sw/siw/siw_verbs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/infiniband/sw/siw/siw_verbs.c b/drivers/infiniband/sw/siw/siw_verbs.c +index 9c7fbda9e068a..124242e387a59 100644 +--- a/drivers/infiniband/sw/siw/siw_verbs.c ++++ b/drivers/infiniband/sw/siw/siw_verbs.c +@@ -1492,7 +1492,7 @@ int siw_map_mr_sg(struct ib_mr *base_mr, struct scatterlist *sl, int num_sle, + + if (pbl->max_buf < num_sle) { + siw_dbg_mem(mem, "too many SGE's: %d > %d\n", +- mem->pbl->max_buf, num_sle); ++ num_sle, pbl->max_buf); + return -ENOMEM; + } + for_each_sg(sl, slp, num_sle, i) { +-- +2.43.0 + diff --git a/queue-5.15/risc-v-fix-funct4-definition-for-c.jalr-in-parse_asm.patch b/queue-5.15/risc-v-fix-funct4-definition-for-c.jalr-in-parse_asm.patch new file mode 100644 index 00000000000..83600ae6d81 --- /dev/null +++ b/queue-5.15/risc-v-fix-funct4-definition-for-c.jalr-in-parse_asm.patch @@ -0,0 +1,42 @@ +From 727b2258c203f1365afc607b3005b2f204e1a1d1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 23 Dec 2022 23:13:21 +0100 +Subject: RISC-V: fix funct4 definition for c.jalr in parse_asm.h + +From: Heiko Stuebner + +[ Upstream commit a3775634f6da23f5511d0282d7e792cf606e5f3b ] + +The opcode definition for c.jalr is + c.jalr c_rs1_n0 1..0=2 15..13=4 12=1 6..2=0 + +This means funct4 consisting of bit [15:12] is 1001b, so the value is 0x9. + +Fixes: edde5584c7ab ("riscv: Add SW single-step support for KDB") +Reported-by: Andrew Jones +Reviewed-by: Andrew Jones +Reviewed-by: Lad Prabhakar +Signed-off-by: Heiko Stuebner +Link: https://lore.kernel.org/r/20221223221332.4127602-2-heiko@sntech.de +Signed-off-by: Palmer Dabbelt +Signed-off-by: Sasha Levin +--- + arch/riscv/include/asm/parse_asm.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/riscv/include/asm/parse_asm.h b/arch/riscv/include/asm/parse_asm.h +index 3cd00332d70f5..ad254da85e615 100644 +--- a/arch/riscv/include/asm/parse_asm.h ++++ b/arch/riscv/include/asm/parse_asm.h +@@ -128,7 +128,7 @@ + #define FUNCT3_C_J 0xa000 + #define FUNCT3_C_JAL 0x2000 + #define FUNCT4_C_JR 0x8000 +-#define FUNCT4_C_JALR 0xf000 ++#define FUNCT4_C_JALR 0x9000 + + #define FUNCT12_SRET 0x10200000 + +-- +2.43.0 + diff --git a/queue-5.15/sched-fair-don-t-balance-task-to-its-current-running.patch b/queue-5.15/sched-fair-don-t-balance-task-to-its-current-running.patch new file mode 100644 index 00000000000..674856919a0 --- /dev/null +++ b/queue-5.15/sched-fair-don-t-balance-task-to-its-current-running.patch @@ -0,0 +1,96 @@ +From f8de57d4a3aa9ce22217c2404fcda1165645aea7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 30 May 2023 16:25:07 +0800 +Subject: sched/fair: Don't balance task to its current running CPU + +From: Yicong Yang + +[ Upstream commit 0dd37d6dd33a9c23351e6115ae8cdac7863bc7de ] + +We've run into the case that the balancer tries to balance a migration +disabled task and trigger the warning in set_task_cpu() like below: + + ------------[ cut here ]------------ + WARNING: CPU: 7 PID: 0 at kernel/sched/core.c:3115 set_task_cpu+0x188/0x240 + Modules linked in: hclgevf xt_CHECKSUM ipt_REJECT nf_reject_ipv4 <...snip> + CPU: 7 PID: 0 Comm: swapper/7 Kdump: loaded Tainted: G O 6.1.0-rc4+ #1 + Hardware name: Huawei TaiShan 2280 V2/BC82AMDC, BIOS 2280-V2 CS V5.B221.01 12/09/2021 + pstate: 604000c9 (nZCv daIF +PAN -UAO -TCO -DIT -SSBS BTYPE=--) + pc : set_task_cpu+0x188/0x240 + lr : load_balance+0x5d0/0xc60 + sp : ffff80000803bc70 + x29: ffff80000803bc70 x28: ffff004089e190e8 x27: ffff004089e19040 + x26: ffff007effcabc38 x25: 0000000000000000 x24: 0000000000000001 + x23: ffff80000803be84 x22: 000000000000000c x21: ffffb093e79e2a78 + x20: 000000000000000c x19: ffff004089e19040 x18: 0000000000000000 + x17: 0000000000001fad x16: 0000000000000030 x15: 0000000000000000 + x14: 0000000000000003 x13: 0000000000000000 x12: 0000000000000000 + x11: 0000000000000001 x10: 0000000000000400 x9 : ffffb093e4cee530 + x8 : 00000000fffffffe x7 : 0000000000ce168a x6 : 000000000000013e + x5 : 00000000ffffffe1 x4 : 0000000000000001 x3 : 0000000000000b2a + x2 : 0000000000000b2a x1 : ffffb093e6d6c510 x0 : 0000000000000001 + Call trace: + set_task_cpu+0x188/0x240 + load_balance+0x5d0/0xc60 + rebalance_domains+0x26c/0x380 + _nohz_idle_balance.isra.0+0x1e0/0x370 + run_rebalance_domains+0x6c/0x80 + __do_softirq+0x128/0x3d8 + ____do_softirq+0x18/0x24 + call_on_irq_stack+0x2c/0x38 + do_softirq_own_stack+0x24/0x3c + __irq_exit_rcu+0xcc/0xf4 + irq_exit_rcu+0x18/0x24 + el1_interrupt+0x4c/0xe4 + el1h_64_irq_handler+0x18/0x2c + el1h_64_irq+0x74/0x78 + arch_cpu_idle+0x18/0x4c + default_idle_call+0x58/0x194 + do_idle+0x244/0x2b0 + cpu_startup_entry+0x30/0x3c + secondary_start_kernel+0x14c/0x190 + __secondary_switched+0xb0/0xb4 + ---[ end trace 0000000000000000 ]--- + +Further investigation shows that the warning is superfluous, the migration +disabled task is just going to be migrated to its current running CPU. +This is because that on load balance if the dst_cpu is not allowed by the +task, we'll re-select a new_dst_cpu as a candidate. If no task can be +balanced to dst_cpu we'll try to balance the task to the new_dst_cpu +instead. In this case when the migration disabled task is not on CPU it +only allows to run on its current CPU, load balance will select its +current CPU as new_dst_cpu and later triggers the warning above. + +The new_dst_cpu is chosen from the env->dst_grpmask. Currently it +contains CPUs in sched_group_span() and if we have overlapped groups it's +possible to run into this case. This patch makes env->dst_grpmask of +group_balance_mask() which exclude any CPUs from the busiest group and +solve the issue. For balancing in a domain with no overlapped groups +the behaviour keeps same as before. + +Suggested-by: Vincent Guittot +Signed-off-by: Yicong Yang +Signed-off-by: Peter Zijlstra (Intel) +Reviewed-by: Vincent Guittot +Link: https://lore.kernel.org/r/20230530082507.10444-1-yangyicong@huawei.com +Signed-off-by: Sasha Levin +--- + kernel/sched/fair.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c +index fd8b5656641b7..b55d51b4105cd 100644 +--- a/kernel/sched/fair.c ++++ b/kernel/sched/fair.c +@@ -10177,7 +10177,7 @@ static int load_balance(int this_cpu, struct rq *this_rq, + .sd = sd, + .dst_cpu = this_cpu, + .dst_rq = this_rq, +- .dst_grpmask = sched_group_span(sd->groups), ++ .dst_grpmask = group_balance_mask(sd->groups), + .idle = idle, + .loop_break = sched_nr_migrate_break, + .cpus = cpus, +-- +2.43.0 + diff --git a/queue-5.15/selftests-net-vrf-xfrm-tests-change-authentication-a.patch b/queue-5.15/selftests-net-vrf-xfrm-tests-change-authentication-a.patch new file mode 100644 index 00000000000..1adb3f8d686 --- /dev/null +++ b/queue-5.15/selftests-net-vrf-xfrm-tests-change-authentication-a.patch @@ -0,0 +1,109 @@ +From 849316f761522aa849ef3830031a980e72bcb389 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 13 Jun 2023 09:32:21 -0300 +Subject: selftests: net: vrf-xfrm-tests: change authentication and encryption + algos + +From: Magali Lemes + +[ Upstream commit cb43c60e64ca67fcc9d23bd08f51d2ab8209d9d7 ] + +The vrf-xfrm-tests tests use the hmac(md5) and cbc(des3_ede) +algorithms for performing authentication and encryption, respectively. +This causes the tests to fail when fips=1 is set, since these algorithms +are not allowed in FIPS mode. Therefore, switch from hmac(md5) and +cbc(des3_ede) to hmac(sha1) and cbc(aes), which are FIPS compliant. + +Fixes: 3f251d741150 ("selftests: Add tests for vrf and xfrms") +Reviewed-by: David Ahern +Signed-off-by: Magali Lemes +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/net/vrf-xfrm-tests.sh | 32 +++++++++---------- + 1 file changed, 16 insertions(+), 16 deletions(-) + +diff --git a/tools/testing/selftests/net/vrf-xfrm-tests.sh b/tools/testing/selftests/net/vrf-xfrm-tests.sh +index 184da81f554ff..452638ae8aed8 100755 +--- a/tools/testing/selftests/net/vrf-xfrm-tests.sh ++++ b/tools/testing/selftests/net/vrf-xfrm-tests.sh +@@ -264,60 +264,60 @@ setup_xfrm() + ip -netns host1 xfrm state add src ${HOST1_4} dst ${HOST2_4} \ + proto esp spi ${SPI_1} reqid 0 mode tunnel \ + replay-window 4 replay-oseq 0x4 \ +- auth-trunc 'hmac(md5)' ${AUTH_1} 96 \ +- enc 'cbc(des3_ede)' ${ENC_1} \ ++ auth-trunc 'hmac(sha1)' ${AUTH_1} 96 \ ++ enc 'cbc(aes)' ${ENC_1} \ + sel src ${h1_4} dst ${h2_4} ${devarg} + + ip -netns host2 xfrm state add src ${HOST1_4} dst ${HOST2_4} \ + proto esp spi ${SPI_1} reqid 0 mode tunnel \ + replay-window 4 replay-oseq 0x4 \ +- auth-trunc 'hmac(md5)' ${AUTH_1} 96 \ +- enc 'cbc(des3_ede)' ${ENC_1} \ ++ auth-trunc 'hmac(sha1)' ${AUTH_1} 96 \ ++ enc 'cbc(aes)' ${ENC_1} \ + sel src ${h1_4} dst ${h2_4} + + + ip -netns host1 xfrm state add src ${HOST2_4} dst ${HOST1_4} \ + proto esp spi ${SPI_2} reqid 0 mode tunnel \ + replay-window 4 replay-oseq 0x4 \ +- auth-trunc 'hmac(md5)' ${AUTH_2} 96 \ +- enc 'cbc(des3_ede)' ${ENC_2} \ ++ auth-trunc 'hmac(sha1)' ${AUTH_2} 96 \ ++ enc 'cbc(aes)' ${ENC_2} \ + sel src ${h2_4} dst ${h1_4} ${devarg} + + ip -netns host2 xfrm state add src ${HOST2_4} dst ${HOST1_4} \ + proto esp spi ${SPI_2} reqid 0 mode tunnel \ + replay-window 4 replay-oseq 0x4 \ +- auth-trunc 'hmac(md5)' ${AUTH_2} 96 \ +- enc 'cbc(des3_ede)' ${ENC_2} \ ++ auth-trunc 'hmac(sha1)' ${AUTH_2} 96 \ ++ enc 'cbc(aes)' ${ENC_2} \ + sel src ${h2_4} dst ${h1_4} + + + ip -6 -netns host1 xfrm state add src ${HOST1_6} dst ${HOST2_6} \ + proto esp spi ${SPI_1} reqid 0 mode tunnel \ + replay-window 4 replay-oseq 0x4 \ +- auth-trunc 'hmac(md5)' ${AUTH_1} 96 \ +- enc 'cbc(des3_ede)' ${ENC_1} \ ++ auth-trunc 'hmac(sha1)' ${AUTH_1} 96 \ ++ enc 'cbc(aes)' ${ENC_1} \ + sel src ${h1_6} dst ${h2_6} ${devarg} + + ip -6 -netns host2 xfrm state add src ${HOST1_6} dst ${HOST2_6} \ + proto esp spi ${SPI_1} reqid 0 mode tunnel \ + replay-window 4 replay-oseq 0x4 \ +- auth-trunc 'hmac(md5)' ${AUTH_1} 96 \ +- enc 'cbc(des3_ede)' ${ENC_1} \ ++ auth-trunc 'hmac(sha1)' ${AUTH_1} 96 \ ++ enc 'cbc(aes)' ${ENC_1} \ + sel src ${h1_6} dst ${h2_6} + + + ip -6 -netns host1 xfrm state add src ${HOST2_6} dst ${HOST1_6} \ + proto esp spi ${SPI_2} reqid 0 mode tunnel \ + replay-window 4 replay-oseq 0x4 \ +- auth-trunc 'hmac(md5)' ${AUTH_2} 96 \ +- enc 'cbc(des3_ede)' ${ENC_2} \ ++ auth-trunc 'hmac(sha1)' ${AUTH_2} 96 \ ++ enc 'cbc(aes)' ${ENC_2} \ + sel src ${h2_6} dst ${h1_6} ${devarg} + + ip -6 -netns host2 xfrm state add src ${HOST2_6} dst ${HOST1_6} \ + proto esp spi ${SPI_2} reqid 0 mode tunnel \ + replay-window 4 replay-oseq 0x4 \ +- auth-trunc 'hmac(md5)' ${AUTH_2} 96 \ +- enc 'cbc(des3_ede)' ${ENC_2} \ ++ auth-trunc 'hmac(sha1)' ${AUTH_2} 96 \ ++ enc 'cbc(aes)' ${ENC_2} \ + sel src ${h2_6} dst ${h1_6} + } + +-- +2.43.0 + diff --git a/queue-5.15/serial-8250-remove-serial_rs485-sanitization-from-em.patch b/queue-5.15/serial-8250-remove-serial_rs485-sanitization-from-em.patch new file mode 100644 index 00000000000..235e0ce41ce --- /dev/null +++ b/queue-5.15/serial-8250-remove-serial_rs485-sanitization-from-em.patch @@ -0,0 +1,73 @@ +From 76b08ddc86c41dbfc913ad4fc0ab071127493a1c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 Jun 2022 13:04:33 +0300 +Subject: serial: 8250: Remove serial_rs485 sanitization from em485 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Ilpo Järvinen + +[ Upstream commit 84f2faa7852e1f55d89bb0c99b3a672b87b11f87 ] + +Serial core handles serial_rs485 sanitization. + +When em485 init fails, there are two possible paths of entry: + + 1) uart_rs485_config (init path) that fully clears port->rs485 on + error. + + 2) ioctl path with a pre-existing, valid port->rs485 unto which the + kernel falls back on error and port->rs485 should therefore be + kept untouched. The temporary rs485 struct is not returned to + userspace in case of error so its flag don't matter. + +...Thus SER_RS485_ENABLED clearing on error can/should be dropped. + +Signed-off-by: Ilpo Järvinen +Link: https://lore.kernel.org/r/20220606100433.13793-37-ilpo.jarvinen@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/8250/8250_port.c | 18 ++---------------- + 1 file changed, 2 insertions(+), 16 deletions(-) + +diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c +index 45a8f76f562e7..4fce318bc83ca 100644 +--- a/drivers/tty/serial/8250/8250_port.c ++++ b/drivers/tty/serial/8250/8250_port.c +@@ -670,13 +670,6 @@ int serial8250_em485_config(struct uart_port *port, struct serial_rs485 *rs485) + rs485->flags &= ~SER_RS485_RTS_AFTER_SEND; + } + +- /* clamp the delays to [0, 100ms] */ +- rs485->delay_rts_before_send = min(rs485->delay_rts_before_send, 100U); +- rs485->delay_rts_after_send = min(rs485->delay_rts_after_send, 100U); +- +- memset(rs485->padding, 0, sizeof(rs485->padding)); +- port->rs485 = *rs485; +- + gpiod_set_value(port->rs485_term_gpio, + rs485->flags & SER_RS485_TERMINATE_BUS); + +@@ -684,15 +677,8 @@ int serial8250_em485_config(struct uart_port *port, struct serial_rs485 *rs485) + * Both serial8250_em485_init() and serial8250_em485_destroy() + * are idempotent. + */ +- if (rs485->flags & SER_RS485_ENABLED) { +- int ret = serial8250_em485_init(up); +- +- if (ret) { +- rs485->flags &= ~SER_RS485_ENABLED; +- port->rs485.flags &= ~SER_RS485_ENABLED; +- } +- return ret; +- } ++ if (rs485->flags & SER_RS485_ENABLED) ++ return serial8250_em485_init(up); + + serial8250_em485_destroy(up); + return 0; +-- +2.43.0 + diff --git a/queue-5.15/series b/queue-5.15/series index 628cde21975..e5d9d8103b3 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -102,3 +102,99 @@ usb-gadget-ncm-avoid-dropping-datagrams-of-properly-parsed-ntbs.patch usb-roles-fix-null-pointer-issue-when-put-module-s-reference.patch usb-roles-don-t-get-set_role-when-usb_role_switch-is-unregistered.patch mptcp-fix-lockless-access-in-subflow-ulp-diag.patch +clk-imx-imx8mp-add-shared-clk-gate-for-usb-suspend-c.patch +clk-qcom-gcc-qcs404-disable-gpll-04-_out_aux-parents.patch +clk-qcom-gcc-qcs404-fix-names-of-the-dsi-clocks-used.patch +mtd-rawnand-sunxi-fix-the-size-of-the-last-oob-regio.patch +risc-v-fix-funct4-definition-for-c.jalr-in-parse_asm.patch +input-iqs269a-drop-unused-device-node-references.patch +input-iqs269a-configure-device-with-a-single-block-w.patch +input-iqs269a-increase-interrupt-handler-return-dela.patch +clk-renesas-cpg-mssr-fix-use-after-free-if-cpg_mssr_.patch +input-ads7846-don-t-report-pressure-for-ads7845.patch +clk-renesas-cpg-mssr-remove-superfluous-check-in-res.patch +clk-imx-avoid-memory-leak.patch +input-ads7846-always-set-last-command-to-pwrdown.patch +input-ads7846-don-t-check-penirq-immediately-for-784.patch +powerpc-powernv-ioda-skip-unallocated-resources-when.patch +clk-qcom-gpucc-sc7180-fix-clk_dis_wait-being-program.patch +clk-qcom-gpucc-sdm845-fix-clk_dis_wait-being-program.patch +clk-honor-clk_ops_parent_enable-in-clk_core_is_enabl.patch +powerpc-pseries-lparcfg-add-missing-rtas-retry-statu.patch +powerpc-perf-hv-24x7-add-missing-rtas-retry-status-h.patch +powerpc-pseries-lpar-add-missing-rtas-retry-status-h.patch +mips-smp-cps-fix-build-error-when-hotplug_cpu-not-se.patch +mips-vpe-mt-drop-physical_memsize.patch +vdpa-mlx5-don-t-clear-mr-struct-on-destroy-mr.patch +selftests-net-vrf-xfrm-tests-change-authentication-a.patch +arm-dts-bcm53573-drop-nonexistent-usb-cells.patch +rdma-siw-balance-the-reference-of-cep-kref-in-the-er.patch +rdma-siw-correct-wrong-debug-message.patch +clk-linux-clk-provider.h-fix-kernel-doc-warnings-and.patch +platform-x86-asus-wmi-document-the-dgpu_disable-sysf.patch +acpi-property-let-args-be-null-in-__acpi_node_get_pr.patch +arm-dts-bcm53573-drop-nonexistent-default-off-led-tr.patch +tools-headers-uapi-sync-linux-fscrypt.h-with-the-ker.patch +perf-beauty-update-copy-of-linux-socket.h-with-the-k.patch +tools-virtio-fix-build.patch +drm-amdgpu-init-iommu-after-amdkfd-device-init.patch +f2fs-don-t-set-gc_failure_pin-for-background-gc.patch +f2fs-write-checkpoint-during-fg_gc.patch +drm-i915-dg1-update-dmc_debug3-register.patch +kernel-sched-remove-dl_boosted-flag-comment.patch +cifs-remove-useless-parameter-is_fsctl-from-smb2_ioc.patch +serial-8250-remove-serial_rs485-sanitization-from-em.patch +clk-imx8mp-add-disp2-pixel-clock.patch +clk-imx8mp-add-clkout1-2-support.patch +dt-bindings-clocks-imx8mp-add-id-for-usb-suspend-clo.patch +net-ethernet-ti-add-missing-of_node_put-before-retur.patch +powerpc-rtas-make-all-exports-gpl.patch +powerpc-rtas-ensure-4kb-alignment-for-rtas_data_buf.patch +powerpc-eeh-small-refactor-of-eeh_handle_normal_even.patch +powerpc-eeh-set-channel-state-after-notifying-the-dr.patch +pm-core-redefine-pm_ptr-macro.patch +pm-core-add-new-_pm_ops-macros-deprecate-old-ones.patch +mmc-jz4740-use-the-new-pm-macros.patch +mmc-mxc-use-the-new-pm-macros.patch +pm-core-remove-static-qualifier-in-define_simple_dev.patch +input-iqs269a-switch-to-define_simple_dev_pm_ops-and.patch +input-iqs269a-do-not-poll-during-suspend-or-resume.patch +input-iqs269a-do-not-poll-during-ati.patch +net-sched-refactor-qdisc_graft-for-ingress-and-clsac.patch +netfilter-nf_tables-add-rescheduling-points-during-l.patch +debugobjects-recheck-debug_objects_enabled-before-re.patch +nbd-add-the-maximum-limit-of-allocated-index-in-nbd_.patch +md-fix-data-corruption-for-raid456-when-reshape-rest.patch +md-raid10-prevent-soft-lockup-while-flush-writes.patch +posix-timers-ensure-timer-id-search-loop-limit-is-va.patch +btrfs-add-xxhash-to-fast-checksum-implementations.patch +acpi-button-add-lid-disable-dmi-quirk-for-nextbook-a.patch +acpi-video-add-backlight-native-dmi-quirk-for-apple-.patch +acpi-video-add-backlight-native-dmi-quirk-for-lenovo.patch +arm64-set-__exception_irq_entry-with-__irq_entry-as-.patch +arm64-mm-fix-va-range-sanity-check.patch +sched-fair-don-t-balance-task-to-its-current-running.patch +wifi-ath11k-fix-registration-of-6ghz-only-phy-withou.patch +bpf-address-kcsan-report-on-bpf_lru_list.patch +devlink-report-devlink_port_type_warn-source-device.patch +wifi-wext-core-fix-wstringop-overflow-warning-in-ioc.patch +igb-fix-igb_down-hung-on-surprise-removal.patch +wifi-iwlwifi-mvm-avoid-baid-size-integer-overflow.patch +exfat-support-dynamic-allocate-bh-for-exfat_entry_se.patch +arm64-dts-rockchip-fix-regulator-name-on-rk3399-rock.patch +arm64-dts-rockchip-add-es8316-codec-for-rock-pi-4.patch +arm64-dts-rockchip-add-spdif-node-for-rock-pi-4.patch +arm-dts-bcm53573-describe-on-soc-bcm53125-rev-4-swit.patch +acpi-video-add-backlight-native-dmi-quirk-for-apple-.patch-17944 +acpi-resource-add-asus-model-s5402za-to-quirks.patch +acpi-resource-skip-irq-override-on-asus-vivobook-s56.patch +acpi-resource-add-asus-expertbook-b2502-to-asus-quir.patch +acpi-resource-skip-irq-override-on-asus-expertbook-b.patch +acpi-resource-skip-irq-override-on-asus-expertbook-b.patch-25193 +xhci-cleanup-xhci_hub_control-port-references.patch +xhci-move-port-specific-items-such-as-state-completi.patch +xhci-rename-resume_done-to-resume_timestamp.patch +xhci-clear-usb2-resume-related-variables-in-one-plac.patch +xhci-decouple-usb2-port-resume-and-get_port_status-r.patch +xhci-track-port-suspend-state-correctly-in-unsuccess.patch +cifs-add-a-warning-when-the-in-flight-count-goes-neg.patch diff --git a/queue-5.15/tools-headers-uapi-sync-linux-fscrypt.h-with-the-ker.patch b/queue-5.15/tools-headers-uapi-sync-linux-fscrypt.h-with-the-ker.patch new file mode 100644 index 00000000000..180ee8ba398 --- /dev/null +++ b/queue-5.15/tools-headers-uapi-sync-linux-fscrypt.h-with-the-ker.patch @@ -0,0 +1,54 @@ +From d5696661a7bd94a213e289a620e7ac82480fcc24 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Dec 2020 14:58:51 -0300 +Subject: tools headers UAPI: Sync linux/fscrypt.h with the kernel sources + +From: Arnaldo Carvalho de Melo + +[ Upstream commit fabe0c61d842637b722344bcd49bfb1b76e2cc68 ] + +To pick the changes from: + + 6b2a51ff03bf0c54 ("fscrypt: Add HCTR2 support for filename encryption") + +That don't result in any changes in tooling, just causes this to be +rebuilt: + + CC /tmp/build/perf-urgent/trace/beauty/sync_file_range.o + LD /tmp/build/perf-urgent/trace/beauty/perf-in.o + +addressing this perf build warning: + + Warning: Kernel ABI header at 'tools/include/uapi/linux/fscrypt.h' differs from latest version at 'include/uapi/linux/fscrypt.h' + diff -u tools/include/uapi/linux/fscrypt.h include/uapi/linux/fscrypt.h + +Cc: Adrian Hunter +Cc: Herbert Xu +Cc: Ian Rogers +Cc: Jiri Olsa +Cc: Namhyung Kim +Cc: Nathan Huckleberry +Link: https://lore.kernel.org/lkml/Yvzl8C7O1b+hf9GS@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/include/uapi/linux/fscrypt.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/tools/include/uapi/linux/fscrypt.h b/tools/include/uapi/linux/fscrypt.h +index 9f4428be3e362..a756b29afcc23 100644 +--- a/tools/include/uapi/linux/fscrypt.h ++++ b/tools/include/uapi/linux/fscrypt.h +@@ -27,7 +27,8 @@ + #define FSCRYPT_MODE_AES_128_CBC 5 + #define FSCRYPT_MODE_AES_128_CTS 6 + #define FSCRYPT_MODE_ADIANTUM 9 +-/* If adding a mode number > 9, update FSCRYPT_MODE_MAX in fscrypt_private.h */ ++#define FSCRYPT_MODE_AES_256_HCTR2 10 ++/* If adding a mode number > 10, update FSCRYPT_MODE_MAX in fscrypt_private.h */ + + /* + * Legacy policy version; ad-hoc KDF and no key verification. +-- +2.43.0 + diff --git a/queue-5.15/tools-virtio-fix-build.patch b/queue-5.15/tools-virtio-fix-build.patch new file mode 100644 index 00000000000..11c8130f16b --- /dev/null +++ b/queue-5.15/tools-virtio-fix-build.patch @@ -0,0 +1,59 @@ +From 85a1308369db6be838d77912bed894e17793d902 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Jul 2022 09:22:49 +0200 +Subject: tools/virtio: fix build +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Stefano Garzarella + +[ Upstream commit d650f830f38b19039958f3f4504ceeb2b5922da7 ] + +Fix the build caused by the following changes: +- phys_addr_t is now defined in tools/include/linux/types.h +- dev_warn_once() is used in drivers/virtio/virtio_ring.c +- linux/uio.h included by vringh.h use INT_MAX defined in limits.h + +Signed-off-by: Stefano Garzarella +Message-Id: <20220705072249.7867-1-sgarzare@redhat.com> +Signed-off-by: Michael S. Tsirkin +Acked-by: Eugenio Pérez +Signed-off-by: Peng Fan +Acked-by: Jason Wang +Signed-off-by: Sasha Levin +--- + tools/virtio/linux/kernel.h | 2 +- + tools/virtio/linux/vringh.h | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +diff --git a/tools/virtio/linux/kernel.h b/tools/virtio/linux/kernel.h +index a4beb719d2174..8b877167933d1 100644 +--- a/tools/virtio/linux/kernel.h ++++ b/tools/virtio/linux/kernel.h +@@ -30,7 +30,6 @@ + #define READ 0 + #define WRITE 1 + +-typedef unsigned long long phys_addr_t; + typedef unsigned long long dma_addr_t; + typedef size_t __kernel_size_t; + typedef unsigned int __wsum; +@@ -137,6 +136,7 @@ static inline void *krealloc_array(void *p, size_t new_n, size_t new_size, gfp_t + #endif + #define dev_err(dev, format, ...) fprintf (stderr, format, ## __VA_ARGS__) + #define dev_warn(dev, format, ...) fprintf (stderr, format, ## __VA_ARGS__) ++#define dev_warn_once(dev, format, ...) fprintf (stderr, format, ## __VA_ARGS__) + + #define min(x, y) ({ \ + typeof(x) _min1 = (x); \ +diff --git a/tools/virtio/linux/vringh.h b/tools/virtio/linux/vringh.h +index 9348957be56e4..e11c6aece7341 100644 +--- a/tools/virtio/linux/vringh.h ++++ b/tools/virtio/linux/vringh.h +@@ -1 +1,2 @@ ++#include + #include "../../../include/linux/vringh.h" +-- +2.43.0 + diff --git a/queue-5.15/vdpa-mlx5-don-t-clear-mr-struct-on-destroy-mr.patch b/queue-5.15/vdpa-mlx5-don-t-clear-mr-struct-on-destroy-mr.patch new file mode 100644 index 00000000000..9feb7c5bc65 --- /dev/null +++ b/queue-5.15/vdpa-mlx5-don-t-clear-mr-struct-on-destroy-mr.patch @@ -0,0 +1,36 @@ +From 117463e2b52c4d2eab184f057f3fe2ce3dc1a16e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 Feb 2023 14:19:56 +0200 +Subject: vdpa/mlx5: Don't clear mr struct on destroy MR + +From: Eli Cohen + +[ Upstream commit aef24311bd2d8a6d39a80c34f278b0fd1692aed3 ] + +Clearing the mr struct erases the lock owner and causes warnings to be +emitted. It is not required to clear the mr so remove the memset call. + +Fixes: 94abbccdf291 ("vdpa/mlx5: Add shared memory registration code") +Signed-off-by: Eli Cohen +Message-Id: <20230206121956.1149356-1-elic@nvidia.com> +Signed-off-by: Michael S. Tsirkin +Signed-off-by: Sasha Levin +--- + drivers/vdpa/mlx5/core/mr.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/vdpa/mlx5/core/mr.c b/drivers/vdpa/mlx5/core/mr.c +index ff010c6d0cd39..bdc7595fcb0e3 100644 +--- a/drivers/vdpa/mlx5/core/mr.c ++++ b/drivers/vdpa/mlx5/core/mr.c +@@ -505,7 +505,6 @@ void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev) + else + destroy_dma_mr(mvdev, mr); + +- memset(mr, 0, sizeof(*mr)); + mr->initialized = false; + out: + mutex_unlock(&mr->mkey_mtx); +-- +2.43.0 + diff --git a/queue-5.15/wifi-ath11k-fix-registration-of-6ghz-only-phy-withou.patch b/queue-5.15/wifi-ath11k-fix-registration-of-6ghz-only-phy-withou.patch new file mode 100644 index 00000000000..d70392679be --- /dev/null +++ b/queue-5.15/wifi-ath11k-fix-registration-of-6ghz-only-phy-withou.patch @@ -0,0 +1,71 @@ +From 3c52486edf83d014b17cd663de032950a6982a2d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 21 Apr 2023 16:54:45 +0200 +Subject: wifi: ath11k: fix registration of 6Ghz-only phy without the full + channel range + +From: Maxime Bizon + +[ Upstream commit e2ceb1de2f83aafd8003f0b72dfd4b7441e97d14 ] + +Because of what seems to be a typo, a 6Ghz-only phy for which the BDF +does not allow the 7115Mhz channel will fail to register: + + WARNING: CPU: 2 PID: 106 at net/wireless/core.c:907 wiphy_register+0x914/0x954 + Modules linked in: ath11k_pci sbsa_gwdt + CPU: 2 PID: 106 Comm: kworker/u8:5 Not tainted 6.3.0-rc7-next-20230418-00549-g1e096a17625a-dirty #9 + Hardware name: Freebox V7R Board (DT) + Workqueue: ath11k_qmi_driver_event ath11k_qmi_driver_event_work + pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) + pc : wiphy_register+0x914/0x954 + lr : ieee80211_register_hw+0x67c/0xc10 + sp : ffffff800b123aa0 + x29: ffffff800b123aa0 x28: 0000000000000000 x27: 0000000000000000 + x26: 0000000000000000 x25: 0000000000000006 x24: ffffffc008d51418 + x23: ffffffc008cb0838 x22: ffffff80176c2460 x21: 0000000000000168 + x20: ffffff80176c0000 x19: ffffff80176c03e0 x18: 0000000000000014 + x17: 00000000cbef338c x16: 00000000d2a26f21 x15: 00000000ad6bb85f + x14: 0000000000000020 x13: 0000000000000020 x12: 00000000ffffffbd + x11: 0000000000000208 x10: 00000000fffffdf7 x9 : ffffffc009394718 + x8 : ffffff80176c0528 x7 : 000000007fffffff x6 : 0000000000000006 + x5 : 0000000000000005 x4 : ffffff800b304284 x3 : ffffff800b304284 + x2 : ffffff800b304d98 x1 : 0000000000000000 x0 : 0000000000000000 + Call trace: + wiphy_register+0x914/0x954 + ieee80211_register_hw+0x67c/0xc10 + ath11k_mac_register+0x7c4/0xe10 + ath11k_core_qmi_firmware_ready+0x1f4/0x570 + ath11k_qmi_driver_event_work+0x198/0x590 + process_one_work+0x1b8/0x328 + worker_thread+0x6c/0x414 + kthread+0x100/0x104 + ret_from_fork+0x10/0x20 + ---[ end trace 0000000000000000 ]--- + ath11k_pci 0002:01:00.0: ieee80211 registration failed: -22 + ath11k_pci 0002:01:00.0: failed register the radio with mac80211: -22 + ath11k_pci 0002:01:00.0: failed to create pdev core: -22 + +Signed-off-by: Maxime Bizon +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230421145445.2612280-1-mbizon@freebox.fr +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath11k/mac.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c +index ae6e14fe03c72..c58fd836d4ade 100644 +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -6312,7 +6312,7 @@ static int ath11k_mac_setup_channels_rates(struct ath11k *ar, + } + + if (supported_bands & WMI_HOST_WLAN_5G_CAP) { +- if (reg_cap->high_5ghz_chan >= ATH11K_MAX_6G_FREQ) { ++ if (reg_cap->high_5ghz_chan >= ATH11K_MIN_6G_FREQ) { + channels = kmemdup(ath11k_6ghz_channels, + sizeof(ath11k_6ghz_channels), GFP_KERNEL); + if (!channels) { +-- +2.43.0 + diff --git a/queue-5.15/wifi-iwlwifi-mvm-avoid-baid-size-integer-overflow.patch b/queue-5.15/wifi-iwlwifi-mvm-avoid-baid-size-integer-overflow.patch new file mode 100644 index 00000000000..ca3504918b3 --- /dev/null +++ b/queue-5.15/wifi-iwlwifi-mvm-avoid-baid-size-integer-overflow.patch @@ -0,0 +1,47 @@ +From c81d3cf30c8fe83aafccc2444c4933923b8456c2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 20 Jun 2023 13:04:02 +0300 +Subject: wifi: iwlwifi: mvm: avoid baid size integer overflow + +From: Johannes Berg + +[ Upstream commit 1a528ab1da324d078ec60283c34c17848580df24 ] + +Roee reported various hard-to-debug crashes with pings in +EHT aggregation scenarios. Enabling KASAN showed that we +access the BAID allocation out of bounds, and looking at +the code a bit shows that since the reorder buffer entry +(struct iwl_mvm_reorder_buf_entry) is 128 bytes if debug +such as lockdep is enabled, then staring from an agg size +512 we overflow the size calculation, and allocate a much +smaller structure than we should, causing slab corruption +once we initialize this. + +Fix this by simply using u32 instead of u16. + +Reported-by: Roee Goldfiner +Signed-off-by: Johannes Berg +Signed-off-by: Gregory Greenman +Link: https://lore.kernel.org/r/20230620125813.f428c856030d.I2c2bb808e945adb71bc15f5b2bac2d8957ea90eb@changeid +Signed-off-by: Johannes Berg +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/intel/iwlwifi/mvm/sta.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +index 45dfee3ad8c60..2d1755598b475 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +@@ -2544,7 +2544,7 @@ int iwl_mvm_sta_rx_agg(struct iwl_mvm *mvm, struct ieee80211_sta *sta, + } + + if (iwl_mvm_has_new_rx_api(mvm) && start) { +- u16 reorder_buf_size = buf_size * sizeof(baid_data->entries[0]); ++ u32 reorder_buf_size = buf_size * sizeof(baid_data->entries[0]); + + /* sparse doesn't like the __align() so don't check */ + #ifndef __CHECKER__ +-- +2.43.0 + diff --git a/queue-5.15/wifi-wext-core-fix-wstringop-overflow-warning-in-ioc.patch b/queue-5.15/wifi-wext-core-fix-wstringop-overflow-warning-in-ioc.patch new file mode 100644 index 00000000000..c163d46d456 --- /dev/null +++ b/queue-5.15/wifi-wext-core-fix-wstringop-overflow-warning-in-ioc.patch @@ -0,0 +1,71 @@ +From 570efecbaf26db9f1f1742f1e0d6530b98bb8537 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 15 Jun 2023 12:04:07 -0600 +Subject: wifi: wext-core: Fix -Wstringop-overflow warning in + ioctl_standard_iw_point() + +From: Gustavo A. R. Silva + +[ Upstream commit 71e7552c90db2a2767f5c17c7ec72296b0d92061 ] + +-Wstringop-overflow is legitimately warning us about extra_size +pontentially being zero at some point, hence potenially ending +up _allocating_ zero bytes of memory for extra pointer and then +trying to access such object in a call to copy_from_user(). + +Fix this by adding a sanity check to ensure we never end up +trying to allocate zero bytes of data for extra pointer, before +continue executing the rest of the code in the function. + +Address the following -Wstringop-overflow warning seen when built +m68k architecture with allyesconfig configuration: + from net/wireless/wext-core.c:11: +In function '_copy_from_user', + inlined from 'copy_from_user' at include/linux/uaccess.h:183:7, + inlined from 'ioctl_standard_iw_point' at net/wireless/wext-core.c:825:7: +arch/m68k/include/asm/string.h:48:25: warning: '__builtin_memset' writing 1 or more bytes into a region of size 0 overflows the destination [-Wstringop-overflow=] + 48 | #define memset(d, c, n) __builtin_memset(d, c, n) + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +include/linux/uaccess.h:153:17: note: in expansion of macro 'memset' + 153 | memset(to + (n - res), 0, res); + | ^~~~~~ +In function 'kmalloc', + inlined from 'kzalloc' at include/linux/slab.h:694:9, + inlined from 'ioctl_standard_iw_point' at net/wireless/wext-core.c:819:10: +include/linux/slab.h:577:16: note: at offset 1 into destination object of size 0 allocated by '__kmalloc' + 577 | return __kmalloc(size, flags); + | ^~~~~~~~~~~~~~~~~~~~~~ + +This help with the ongoing efforts to globally enable +-Wstringop-overflow. + +Link: https://github.com/KSPP/linux/issues/315 +Signed-off-by: Gustavo A. R. Silva +Reviewed-by: Simon Horman +Link: https://lore.kernel.org/r/ZItSlzvIpjdjNfd8@work +Signed-off-by: Johannes Berg +Signed-off-by: Sasha Levin +--- + net/wireless/wext-core.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c +index fe8765c4075d3..8a4b85f96a13a 100644 +--- a/net/wireless/wext-core.c ++++ b/net/wireless/wext-core.c +@@ -799,6 +799,12 @@ static int ioctl_standard_iw_point(struct iw_point *iwp, unsigned int cmd, + } + } + ++ /* Sanity-check to ensure we never end up _allocating_ zero ++ * bytes of data for extra. ++ */ ++ if (extra_size <= 0) ++ return -EFAULT; ++ + /* kzalloc() ensures NULL-termination for essid_compat. */ + extra = kzalloc(extra_size, GFP_KERNEL); + if (!extra) +-- +2.43.0 + diff --git a/queue-5.15/xhci-cleanup-xhci_hub_control-port-references.patch b/queue-5.15/xhci-cleanup-xhci_hub_control-port-references.patch new file mode 100644 index 00000000000..4df727332f8 --- /dev/null +++ b/queue-5.15/xhci-cleanup-xhci_hub_control-port-references.patch @@ -0,0 +1,374 @@ +From 10cf29893a9ec5ba8d4838b0a899657cf2b5da43 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 2 Feb 2023 17:04:59 +0200 +Subject: xhci: cleanup xhci_hub_control port references + +From: Mathias Nyman + +[ Upstream commit faaae0190dcd1e230616c85bbc3b339f27ba5b81 ] + +Both port number and port structure of a port are referred to several +times when handing hub requests in xhci. + +Use more suitable data types and readable names for these. +Cleanup only, no functional changes + +Signed-off-by: Mathias Nyman +Link: https://lore.kernel.org/r/20230202150505.618915-6-mathias.nyman@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Stable-dep-of: d7cdfc319b2b ("xhci: track port suspend state correctly in unsuccessful resume cases") +Signed-off-by: Sasha Levin +--- + drivers/usb/host/xhci-hub.c | 123 ++++++++++++++++++------------------ + 1 file changed, 63 insertions(+), 60 deletions(-) + +diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c +index b9754784161d7..3526665575af2 100644 +--- a/drivers/usb/host/xhci-hub.c ++++ b/drivers/usb/host/xhci-hub.c +@@ -1194,11 +1194,14 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + u16 test_mode = 0; + struct xhci_hub *rhub; + struct xhci_port **ports; ++ struct xhci_port *port; ++ int portnum1; + + rhub = xhci_get_rhub(hcd); + ports = rhub->ports; + max_ports = rhub->num_ports; + bus_state = &rhub->bus_state; ++ portnum1 = wIndex & 0xff; + + spin_lock_irqsave(&xhci->lock, flags); + switch (typeReq) { +@@ -1232,10 +1235,12 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + spin_unlock_irqrestore(&xhci->lock, flags); + return retval; + case GetPortStatus: +- if (!wIndex || wIndex > max_ports) ++ if (!portnum1 || portnum1 > max_ports) + goto error; ++ + wIndex--; +- temp = readl(ports[wIndex]->addr); ++ port = ports[portnum1 - 1]; ++ temp = readl(port->addr); + if (temp == ~(u32)0) { + xhci_hc_died(xhci); + retval = -ENODEV; +@@ -1248,7 +1253,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + goto error; + + xhci_dbg(xhci, "Get port status %d-%d read: 0x%x, return 0x%x", +- hcd->self.busnum, wIndex + 1, temp, status); ++ hcd->self.busnum, portnum1, temp, status); + + put_unaligned(cpu_to_le32(status), (__le32 *) buf); + /* if USB 3.1 extended port status return additional 4 bytes */ +@@ -1260,7 +1265,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + retval = -EINVAL; + break; + } +- port_li = readl(ports[wIndex]->addr + PORTLI); ++ port_li = readl(port->addr + PORTLI); + status = xhci_get_ext_port_status(temp, port_li); + put_unaligned_le32(status, &buf[4]); + } +@@ -1274,11 +1279,14 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + test_mode = (wIndex & 0xff00) >> 8; + /* The MSB of wIndex is the U1/U2 timeout */ + timeout = (wIndex & 0xff00) >> 8; ++ + wIndex &= 0xff; +- if (!wIndex || wIndex > max_ports) ++ if (!portnum1 || portnum1 > max_ports) + goto error; ++ ++ port = ports[portnum1 - 1]; + wIndex--; +- temp = readl(ports[wIndex]->addr); ++ temp = readl(port->addr); + if (temp == ~(u32)0) { + xhci_hc_died(xhci); + retval = -ENODEV; +@@ -1288,11 +1296,10 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + /* FIXME: What new port features do we need to support? */ + switch (wValue) { + case USB_PORT_FEAT_SUSPEND: +- temp = readl(ports[wIndex]->addr); ++ temp = readl(port->addr); + if ((temp & PORT_PLS_MASK) != XDEV_U0) { + /* Resume the port to U0 first */ +- xhci_set_link_state(xhci, ports[wIndex], +- XDEV_U0); ++ xhci_set_link_state(xhci, port, XDEV_U0); + spin_unlock_irqrestore(&xhci->lock, flags); + msleep(10); + spin_lock_irqsave(&xhci->lock, flags); +@@ -1301,16 +1308,16 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + * a port unless the port reports that it is in the + * enabled (PED = ‘1’,PLS < ‘3’) state. + */ +- temp = readl(ports[wIndex]->addr); ++ temp = readl(port->addr); + if ((temp & PORT_PE) == 0 || (temp & PORT_RESET) + || (temp & PORT_PLS_MASK) >= XDEV_U3) { + xhci_warn(xhci, "USB core suspending port %d-%d not in U0/U1/U2\n", +- hcd->self.busnum, wIndex + 1); ++ hcd->self.busnum, portnum1); + goto error; + } + + slot_id = xhci_find_slot_id_by_port(hcd, xhci, +- wIndex + 1); ++ portnum1); + if (!slot_id) { + xhci_warn(xhci, "slot_id is zero\n"); + goto error; +@@ -1320,21 +1327,21 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + xhci_stop_device(xhci, slot_id, 1); + spin_lock_irqsave(&xhci->lock, flags); + +- xhci_set_link_state(xhci, ports[wIndex], XDEV_U3); ++ xhci_set_link_state(xhci, port, XDEV_U3); + + spin_unlock_irqrestore(&xhci->lock, flags); + msleep(10); /* wait device to enter */ + spin_lock_irqsave(&xhci->lock, flags); + +- temp = readl(ports[wIndex]->addr); ++ temp = readl(port->addr); + bus_state->suspended_ports |= 1 << wIndex; + break; + case USB_PORT_FEAT_LINK_STATE: +- temp = readl(ports[wIndex]->addr); ++ temp = readl(port->addr); + /* Disable port */ + if (link_state == USB_SS_PORT_LS_SS_DISABLED) { + xhci_dbg(xhci, "Disable port %d-%d\n", +- hcd->self.busnum, wIndex + 1); ++ hcd->self.busnum, portnum1); + temp = xhci_port_state_to_neutral(temp); + /* + * Clear all change bits, so that we get a new +@@ -1343,18 +1350,17 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + temp |= PORT_CSC | PORT_PEC | PORT_WRC | + PORT_OCC | PORT_RC | PORT_PLC | + PORT_CEC; +- writel(temp | PORT_PE, ports[wIndex]->addr); +- temp = readl(ports[wIndex]->addr); ++ writel(temp | PORT_PE, port->addr); ++ temp = readl(port->addr); + break; + } + + /* Put link in RxDetect (enable port) */ + if (link_state == USB_SS_PORT_LS_RX_DETECT) { + xhci_dbg(xhci, "Enable port %d-%d\n", +- hcd->self.busnum, wIndex + 1); +- xhci_set_link_state(xhci, ports[wIndex], +- link_state); +- temp = readl(ports[wIndex]->addr); ++ hcd->self.busnum, portnum1); ++ xhci_set_link_state(xhci, port, link_state); ++ temp = readl(port->addr); + break; + } + +@@ -1384,11 +1390,10 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + } + + xhci_dbg(xhci, "Enable compliance mode transition for port %d-%d\n", +- hcd->self.busnum, wIndex + 1); +- xhci_set_link_state(xhci, ports[wIndex], +- link_state); ++ hcd->self.busnum, portnum1); ++ xhci_set_link_state(xhci, port, link_state); + +- temp = readl(ports[wIndex]->addr); ++ temp = readl(port->addr); + break; + } + /* Port must be enabled */ +@@ -1399,8 +1404,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + /* Can't set port link state above '3' (U3) */ + if (link_state > USB_SS_PORT_LS_U3) { + xhci_warn(xhci, "Cannot set port %d-%d link state %d\n", +- hcd->self.busnum, wIndex + 1, +- link_state); ++ hcd->self.busnum, portnum1, link_state); + goto error; + } + +@@ -1425,8 +1429,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + reinit_completion(&bus_state->u3exit_done[wIndex]); + } + if (pls <= XDEV_U3) /* U1, U2, U3 */ +- xhci_set_link_state(xhci, ports[wIndex], +- USB_SS_PORT_LS_U0); ++ xhci_set_link_state(xhci, port, USB_SS_PORT_LS_U0); + if (!wait_u0) { + if (pls > XDEV_U3) + goto error; +@@ -1436,16 +1439,16 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + if (!wait_for_completion_timeout(&bus_state->u3exit_done[wIndex], + msecs_to_jiffies(500))) + xhci_dbg(xhci, "missing U0 port change event for port %d-%d\n", +- hcd->self.busnum, wIndex + 1); ++ hcd->self.busnum, portnum1); + spin_lock_irqsave(&xhci->lock, flags); +- temp = readl(ports[wIndex]->addr); ++ temp = readl(port->addr); + break; + } + + if (link_state == USB_SS_PORT_LS_U3) { + int retries = 16; + slot_id = xhci_find_slot_id_by_port(hcd, xhci, +- wIndex + 1); ++ portnum1); + if (slot_id) { + /* unlock to execute stop endpoint + * commands */ +@@ -1454,16 +1457,16 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + xhci_stop_device(xhci, slot_id, 1); + spin_lock_irqsave(&xhci->lock, flags); + } +- xhci_set_link_state(xhci, ports[wIndex], USB_SS_PORT_LS_U3); ++ xhci_set_link_state(xhci, port, USB_SS_PORT_LS_U3); + spin_unlock_irqrestore(&xhci->lock, flags); + while (retries--) { + usleep_range(4000, 8000); +- temp = readl(ports[wIndex]->addr); ++ temp = readl(port->addr); + if ((temp & PORT_PLS_MASK) == XDEV_U3) + break; + } + spin_lock_irqsave(&xhci->lock, flags); +- temp = readl(ports[wIndex]->addr); ++ temp = readl(port->addr); + bus_state->suspended_ports |= 1 << wIndex; + } + break; +@@ -1478,39 +1481,38 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + break; + case USB_PORT_FEAT_RESET: + temp = (temp | PORT_RESET); +- writel(temp, ports[wIndex]->addr); ++ writel(temp, port->addr); + +- temp = readl(ports[wIndex]->addr); ++ temp = readl(port->addr); + xhci_dbg(xhci, "set port reset, actual port %d-%d status = 0x%x\n", +- hcd->self.busnum, wIndex + 1, temp); ++ hcd->self.busnum, portnum1, temp); + break; + case USB_PORT_FEAT_REMOTE_WAKE_MASK: +- xhci_set_remote_wake_mask(xhci, ports[wIndex], +- wake_mask); +- temp = readl(ports[wIndex]->addr); ++ xhci_set_remote_wake_mask(xhci, port, wake_mask); ++ temp = readl(port->addr); + xhci_dbg(xhci, "set port remote wake mask, actual port %d-%d status = 0x%x\n", +- hcd->self.busnum, wIndex + 1, temp); ++ hcd->self.busnum, portnum1, temp); + break; + case USB_PORT_FEAT_BH_PORT_RESET: + temp |= PORT_WR; +- writel(temp, ports[wIndex]->addr); +- temp = readl(ports[wIndex]->addr); ++ writel(temp, port->addr); ++ temp = readl(port->addr); + break; + case USB_PORT_FEAT_U1_TIMEOUT: + if (hcd->speed < HCD_USB3) + goto error; +- temp = readl(ports[wIndex]->addr + PORTPMSC); ++ temp = readl(port->addr + PORTPMSC); + temp &= ~PORT_U1_TIMEOUT_MASK; + temp |= PORT_U1_TIMEOUT(timeout); +- writel(temp, ports[wIndex]->addr + PORTPMSC); ++ writel(temp, port->addr + PORTPMSC); + break; + case USB_PORT_FEAT_U2_TIMEOUT: + if (hcd->speed < HCD_USB3) + goto error; +- temp = readl(ports[wIndex]->addr + PORTPMSC); ++ temp = readl(port->addr + PORTPMSC); + temp &= ~PORT_U2_TIMEOUT_MASK; + temp |= PORT_U2_TIMEOUT(timeout); +- writel(temp, ports[wIndex]->addr + PORTPMSC); ++ writel(temp, port->addr + PORTPMSC); + break; + case USB_PORT_FEAT_TEST: + /* 4.19.6 Port Test Modes (USB2 Test Mode) */ +@@ -1526,13 +1528,16 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + goto error; + } + /* unblock any posted writes */ +- temp = readl(ports[wIndex]->addr); ++ temp = readl(port->addr); + break; + case ClearPortFeature: +- if (!wIndex || wIndex > max_ports) ++ if (!portnum1 || portnum1 > max_ports) + goto error; ++ ++ port = ports[portnum1 - 1]; ++ + wIndex--; +- temp = readl(ports[wIndex]->addr); ++ temp = readl(port->addr); + if (temp == ~(u32)0) { + xhci_hc_died(xhci); + retval = -ENODEV; +@@ -1542,7 +1547,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + temp = xhci_port_state_to_neutral(temp); + switch (wValue) { + case USB_PORT_FEAT_SUSPEND: +- temp = readl(ports[wIndex]->addr); ++ temp = readl(port->addr); + xhci_dbg(xhci, "clear USB_PORT_FEAT_SUSPEND\n"); + xhci_dbg(xhci, "PORTSC %04x\n", temp); + if (temp & PORT_RESET) +@@ -1553,20 +1558,18 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + + set_bit(wIndex, &bus_state->resuming_ports); + usb_hcd_start_port_resume(&hcd->self, wIndex); +- xhci_set_link_state(xhci, ports[wIndex], +- XDEV_RESUME); ++ xhci_set_link_state(xhci, port, XDEV_RESUME); + spin_unlock_irqrestore(&xhci->lock, flags); + msleep(USB_RESUME_TIMEOUT); + spin_lock_irqsave(&xhci->lock, flags); +- xhci_set_link_state(xhci, ports[wIndex], +- XDEV_U0); ++ xhci_set_link_state(xhci, port, XDEV_U0); + clear_bit(wIndex, &bus_state->resuming_ports); + usb_hcd_end_port_resume(&hcd->self, wIndex); + } + bus_state->port_c_suspend |= 1 << wIndex; + + slot_id = xhci_find_slot_id_by_port(hcd, xhci, +- wIndex + 1); ++ portnum1); + if (!slot_id) { + xhci_dbg(xhci, "slot_id is zero\n"); + goto error; +@@ -1584,11 +1587,11 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + case USB_PORT_FEAT_C_PORT_LINK_STATE: + case USB_PORT_FEAT_C_PORT_CONFIG_ERROR: + xhci_clear_port_change_bit(xhci, wValue, wIndex, +- ports[wIndex]->addr, temp); ++ port->addr, temp); + break; + case USB_PORT_FEAT_ENABLE: + xhci_disable_port(hcd, xhci, wIndex, +- ports[wIndex]->addr, temp); ++ port->addr, temp); + break; + case USB_PORT_FEAT_POWER: + xhci_set_port_power(xhci, hcd, wIndex, false, &flags); +-- +2.43.0 + diff --git a/queue-5.15/xhci-clear-usb2-resume-related-variables-in-one-plac.patch b/queue-5.15/xhci-clear-usb2-resume-related-variables-in-one-plac.patch new file mode 100644 index 00000000000..f459eeabf02 --- /dev/null +++ b/queue-5.15/xhci-clear-usb2-resume-related-variables-in-one-plac.patch @@ -0,0 +1,99 @@ +From 3d927765e6352753e5103d5437604a9fb090bc1d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 2 Feb 2023 17:05:04 +0200 +Subject: xhci: clear usb2 resume related variables in one place. + +From: Mathias Nyman + +[ Upstream commit 0e6275452ce26d7ff274a5c1b15ed581a26f7986 ] + +Initially resume related USB2 variables were cleared once port +successfully resumed to U0. Later code was added to clean up +stale resume variables in case of port failed to resume to U0. + +Clear the variables in one place after port is no longer resuming +or in suspended U3 state. + +Signed-off-by: Mathias Nyman +Link: https://lore.kernel.org/r/20230202150505.618915-11-mathias.nyman@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Stable-dep-of: d7cdfc319b2b ("xhci: track port suspend state correctly in unsuccessful resume cases") +Signed-off-by: Sasha Levin +--- + drivers/usb/host/xhci-hub.c | 38 ++++++++++++++++--------------------- + 1 file changed, 16 insertions(+), 22 deletions(-) + +diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c +index d3d3dadaca10b..660a7d0f79a42 100644 +--- a/drivers/usb/host/xhci-hub.c ++++ b/drivers/usb/host/xhci-hub.c +@@ -1071,7 +1071,6 @@ static void xhci_get_usb2_port_status(struct xhci_port *port, u32 *status, + struct xhci_bus_state *bus_state; + u32 link_state; + u32 portnum; +- int ret; + + bus_state = &port->rhub->bus_state; + link_state = portsc & PORT_PLS_MASK; +@@ -1087,23 +1086,30 @@ static void xhci_get_usb2_port_status(struct xhci_port *port, u32 *status, + if (link_state == XDEV_U2) + *status |= USB_PORT_STAT_L1; + if (link_state == XDEV_U0) { +- if (port->resume_timestamp) +- usb_hcd_end_port_resume(&port->rhub->hcd->self, +- portnum); +- port->resume_timestamp = 0; +- clear_bit(portnum, &bus_state->resuming_ports); + if (bus_state->suspended_ports & (1 << portnum)) { + bus_state->suspended_ports &= ~(1 << portnum); + bus_state->port_c_suspend |= 1 << portnum; + } + } + if (link_state == XDEV_RESUME) { +- ret = xhci_handle_usb2_port_link_resume(port, status, +- portsc, flags); +- if (ret) +- return; ++ xhci_handle_usb2_port_link_resume(port, status, portsc, ++ flags); + } + } ++ ++ /* ++ * Clear usb2 resume signalling variables if port is no longer suspended ++ * or resuming. Port either resumed to U0/U1/U2, disconnected, or in a ++ * error state. Resume related variables should be cleared in all those cases. ++ */ ++ if ((link_state != XDEV_U3 && ++ link_state != XDEV_RESUME) && ++ (port->resume_timestamp || ++ test_bit(portnum, &bus_state->resuming_ports))) { ++ port->resume_timestamp = 0; ++ clear_bit(portnum, &bus_state->resuming_ports); ++ usb_hcd_end_port_resume(&port->rhub->hcd->self, portnum); ++ } + } + + /* +@@ -1158,18 +1164,6 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd, + else + xhci_get_usb2_port_status(port, &status, raw_port_status, + flags); +- /* +- * Clear stale usb2 resume signalling variables in case port changed +- * state during resume signalling. For example on error +- */ +- if ((port->resume_timestamp || +- test_bit(wIndex, &bus_state->resuming_ports)) && +- (raw_port_status & PORT_PLS_MASK) != XDEV_U3 && +- (raw_port_status & PORT_PLS_MASK) != XDEV_RESUME) { +- port->resume_timestamp = 0; +- clear_bit(wIndex, &bus_state->resuming_ports); +- usb_hcd_end_port_resume(&hcd->self, wIndex); +- } + + if (bus_state->port_c_suspend & (1 << wIndex)) + status |= USB_PORT_STAT_C_SUSPEND << 16; +-- +2.43.0 + diff --git a/queue-5.15/xhci-decouple-usb2-port-resume-and-get_port_status-r.patch b/queue-5.15/xhci-decouple-usb2-port-resume-and-get_port_status-r.patch new file mode 100644 index 00000000000..9abc12309b1 --- /dev/null +++ b/queue-5.15/xhci-decouple-usb2-port-resume-and-get_port_status-r.patch @@ -0,0 +1,140 @@ +From 65d2a522ce8210d32d2c79ddcf3a77ecdfc4cfd6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 2 Feb 2023 17:05:05 +0200 +Subject: xhci: decouple usb2 port resume and get_port_status request handling + +From: Mathias Nyman + +[ Upstream commit b0425784b942fffbbdb804896197f1dbccda37c5 ] + +The get port status hub request code in xhci-hub.c will complete usb2 +port resume signalling if signalling has been going on for long enough. + +The code that completes the resume signalling, and the code that returns +the port status have gotten too intertwined, so separate them a bit. + +Signed-off-by: Mathias Nyman +Link: https://lore.kernel.org/r/20230202150505.618915-12-mathias.nyman@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Stable-dep-of: d7cdfc319b2b ("xhci: track port suspend state correctly in unsuccessful resume cases") +Signed-off-by: Sasha Levin +--- + drivers/usb/host/xhci-hub.c | 47 ++++++++++++++++++++----------------- + 1 file changed, 25 insertions(+), 22 deletions(-) + +diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c +index 660a7d0f79a42..56c600be272a6 100644 +--- a/drivers/usb/host/xhci-hub.c ++++ b/drivers/usb/host/xhci-hub.c +@@ -905,7 +905,7 @@ static void xhci_del_comp_mod_timer(struct xhci_hcd *xhci, u32 status, + } + + static int xhci_handle_usb2_port_link_resume(struct xhci_port *port, +- u32 *status, u32 portsc, ++ u32 portsc, + unsigned long *flags) + { + struct xhci_bus_state *bus_state; +@@ -920,7 +920,6 @@ static int xhci_handle_usb2_port_link_resume(struct xhci_port *port, + wIndex = port->hcd_portnum; + + if ((portsc & PORT_RESET) || !(portsc & PORT_PE)) { +- *status = 0xffffffff; + return -EINVAL; + } + /* did port event handler already start resume timing? */ +@@ -954,6 +953,8 @@ static int xhci_handle_usb2_port_link_resume(struct xhci_port *port, + + port->resume_timestamp = 0; + clear_bit(wIndex, &bus_state->resuming_ports); ++ ++ reinit_completion(&port->rexit_done); + port->rexit_active = true; + + xhci_test_and_clear_bit(xhci, port, PORT_PLC); +@@ -970,7 +971,6 @@ static int xhci_handle_usb2_port_link_resume(struct xhci_port *port, + wIndex + 1); + if (!slot_id) { + xhci_dbg(xhci, "slot_id is zero\n"); +- *status = 0xffffffff; + return -ENODEV; + } + xhci_ring_device(xhci, slot_id); +@@ -979,22 +979,19 @@ static int xhci_handle_usb2_port_link_resume(struct xhci_port *port, + + xhci_warn(xhci, "Port resume timed out, port %d-%d: 0x%x\n", + hcd->self.busnum, wIndex + 1, port_status); +- *status |= USB_PORT_STAT_SUSPEND; +- port->rexit_active = false; ++ /* ++ * keep rexit_active set if U0 transition failed so we ++ * know to report PORT_STAT_SUSPEND status back to ++ * usbcore. It will be cleared later once the port is ++ * out of RESUME/U3 state ++ */ + } + + usb_hcd_end_port_resume(&hcd->self, wIndex); + bus_state->port_c_suspend |= 1 << wIndex; + bus_state->suspended_ports &= ~(1 << wIndex); +- } else { +- /* +- * The resume has been signaling for less than +- * USB_RESUME_TIME. Report the port status as SUSPEND, +- * let the usbcore check port status again and clear +- * resume signaling later. +- */ +- *status |= USB_PORT_STAT_SUSPEND; + } ++ + return 0; + } + +@@ -1071,6 +1068,7 @@ static void xhci_get_usb2_port_status(struct xhci_port *port, u32 *status, + struct xhci_bus_state *bus_state; + u32 link_state; + u32 portnum; ++ int err; + + bus_state = &port->rhub->bus_state; + link_state = portsc & PORT_PLS_MASK; +@@ -1092,8 +1090,12 @@ static void xhci_get_usb2_port_status(struct xhci_port *port, u32 *status, + } + } + if (link_state == XDEV_RESUME) { +- xhci_handle_usb2_port_link_resume(port, status, portsc, +- flags); ++ err = xhci_handle_usb2_port_link_resume(port, portsc, ++ flags); ++ if (err < 0) ++ *status = 0xffffffff; ++ else if (port->resume_timestamp || port->rexit_active) ++ *status |= USB_PORT_STAT_SUSPEND; + } + } + +@@ -1102,13 +1104,14 @@ static void xhci_get_usb2_port_status(struct xhci_port *port, u32 *status, + * or resuming. Port either resumed to U0/U1/U2, disconnected, or in a + * error state. Resume related variables should be cleared in all those cases. + */ +- if ((link_state != XDEV_U3 && +- link_state != XDEV_RESUME) && +- (port->resume_timestamp || +- test_bit(portnum, &bus_state->resuming_ports))) { +- port->resume_timestamp = 0; +- clear_bit(portnum, &bus_state->resuming_ports); +- usb_hcd_end_port_resume(&port->rhub->hcd->self, portnum); ++ if (link_state != XDEV_U3 && link_state != XDEV_RESUME) { ++ if (port->resume_timestamp || ++ test_bit(portnum, &bus_state->resuming_ports)) { ++ port->resume_timestamp = 0; ++ clear_bit(portnum, &bus_state->resuming_ports); ++ usb_hcd_end_port_resume(&port->rhub->hcd->self, portnum); ++ } ++ port->rexit_active = 0; + } + } + +-- +2.43.0 + diff --git a/queue-5.15/xhci-move-port-specific-items-such-as-state-completi.patch b/queue-5.15/xhci-move-port-specific-items-such-as-state-completi.patch new file mode 100644 index 00000000000..b52a1b4224d --- /dev/null +++ b/queue-5.15/xhci-move-port-specific-items-such-as-state-completi.patch @@ -0,0 +1,252 @@ +From 3ac1034cc15d99b5de894f10639cb779d2c9b13e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 2 Feb 2023 17:05:01 +0200 +Subject: xhci: move port specific items such as state completions to port + structure + +From: Mathias Nyman + +[ Upstream commit 2996e9fc00c378987c18ecbafe5624581b18c0d6 ] + +Now that we have a port structure for each port it makes sense to +move per port variables, timestamps and completions there. +Get rid of storing bitfileds and arrays of port specific items per bus. + +Move +unsigned long resume_done; +insigned long rexit_ports +struct completion rexit_done; +struct completion u3exit_done; + +Rename rexit_ports to rexit_active, and remove a redundant hcd +speed check while checking if rexit_active is set. + +Signed-off-by: Mathias Nyman +Link: https://lore.kernel.org/r/20230202150505.618915-8-mathias.nyman@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Stable-dep-of: d7cdfc319b2b ("xhci: track port suspend state correctly in unsuccessful resume cases") +Signed-off-by: Sasha Levin +--- + drivers/usb/host/xhci-hub.c | 31 +++++++++++++++---------------- + drivers/usb/host/xhci-mem.c | 10 +++------- + drivers/usb/host/xhci-ring.c | 13 ++++++------- + drivers/usb/host/xhci.h | 9 ++++----- + 4 files changed, 28 insertions(+), 35 deletions(-) + +diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c +index 3526665575af2..7f0c9176b4951 100644 +--- a/drivers/usb/host/xhci-hub.c ++++ b/drivers/usb/host/xhci-hub.c +@@ -924,7 +924,7 @@ static int xhci_handle_usb2_port_link_resume(struct xhci_port *port, + return -EINVAL; + } + /* did port event handler already start resume timing? */ +- if (!bus_state->resume_done[wIndex]) { ++ if (!port->resume_done) { + /* If not, maybe we are in a host initated resume? */ + if (test_bit(wIndex, &bus_state->resuming_ports)) { + /* Host initated resume doesn't time the resume +@@ -941,28 +941,27 @@ static int xhci_handle_usb2_port_link_resume(struct xhci_port *port, + msecs_to_jiffies(USB_RESUME_TIMEOUT); + + set_bit(wIndex, &bus_state->resuming_ports); +- bus_state->resume_done[wIndex] = timeout; ++ port->resume_done = timeout; + mod_timer(&hcd->rh_timer, timeout); + usb_hcd_start_port_resume(&hcd->self, wIndex); + } + /* Has resume been signalled for USB_RESUME_TIME yet? */ +- } else if (time_after_eq(jiffies, bus_state->resume_done[wIndex])) { ++ } else if (time_after_eq(jiffies, port->resume_done)) { + int time_left; + + xhci_dbg(xhci, "resume USB2 port %d-%d\n", + hcd->self.busnum, wIndex + 1); + +- bus_state->resume_done[wIndex] = 0; ++ port->resume_done = 0; + clear_bit(wIndex, &bus_state->resuming_ports); +- +- set_bit(wIndex, &bus_state->rexit_ports); ++ port->rexit_active = true; + + xhci_test_and_clear_bit(xhci, port, PORT_PLC); + xhci_set_link_state(xhci, port, XDEV_U0); + + spin_unlock_irqrestore(&xhci->lock, *flags); + time_left = wait_for_completion_timeout( +- &bus_state->rexit_done[wIndex], ++ &port->rexit_done, + msecs_to_jiffies(XHCI_MAX_REXIT_TIMEOUT_MS)); + spin_lock_irqsave(&xhci->lock, *flags); + +@@ -981,7 +980,7 @@ static int xhci_handle_usb2_port_link_resume(struct xhci_port *port, + xhci_warn(xhci, "Port resume timed out, port %d-%d: 0x%x\n", + hcd->self.busnum, wIndex + 1, port_status); + *status |= USB_PORT_STAT_SUSPEND; +- clear_bit(wIndex, &bus_state->rexit_ports); ++ port->rexit_active = false; + } + + usb_hcd_end_port_resume(&hcd->self, wIndex); +@@ -1088,10 +1087,10 @@ static void xhci_get_usb2_port_status(struct xhci_port *port, u32 *status, + if (link_state == XDEV_U2) + *status |= USB_PORT_STAT_L1; + if (link_state == XDEV_U0) { +- if (bus_state->resume_done[portnum]) ++ if (port->resume_done) + usb_hcd_end_port_resume(&port->rhub->hcd->self, + portnum); +- bus_state->resume_done[portnum] = 0; ++ port->resume_done = 0; + clear_bit(portnum, &bus_state->resuming_ports); + if (bus_state->suspended_ports & (1 << portnum)) { + bus_state->suspended_ports &= ~(1 << portnum); +@@ -1163,11 +1162,11 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd, + * Clear stale usb2 resume signalling variables in case port changed + * state during resume signalling. For example on error + */ +- if ((bus_state->resume_done[wIndex] || ++ if ((port->resume_done || + test_bit(wIndex, &bus_state->resuming_ports)) && + (raw_port_status & PORT_PLS_MASK) != XDEV_U3 && + (raw_port_status & PORT_PLS_MASK) != XDEV_RESUME) { +- bus_state->resume_done[wIndex] = 0; ++ port->resume_done = 0; + clear_bit(wIndex, &bus_state->resuming_ports); + usb_hcd_end_port_resume(&hcd->self, wIndex); + } +@@ -1426,7 +1425,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + pls == XDEV_RESUME || + pls == XDEV_RECOVERY) { + wait_u0 = true; +- reinit_completion(&bus_state->u3exit_done[wIndex]); ++ reinit_completion(&port->u3exit_done); + } + if (pls <= XDEV_U3) /* U1, U2, U3 */ + xhci_set_link_state(xhci, port, USB_SS_PORT_LS_U0); +@@ -1436,7 +1435,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + break; + } + spin_unlock_irqrestore(&xhci->lock, flags); +- if (!wait_for_completion_timeout(&bus_state->u3exit_done[wIndex], ++ if (!wait_for_completion_timeout(&port->u3exit_done, + msecs_to_jiffies(500))) + xhci_dbg(xhci, "missing U0 port change event for port %d-%d\n", + hcd->self.busnum, portnum1); +@@ -1675,8 +1674,8 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf) + + if ((temp & mask) != 0 || + (bus_state->port_c_suspend & 1 << i) || +- (bus_state->resume_done[i] && time_after_eq( +- jiffies, bus_state->resume_done[i]))) { ++ (ports[i]->resume_done && time_after_eq( ++ jiffies, ports[i]->resume_done))) { + buf[(i + 1) / 8] |= 1 << (i + 1) % 8; + status = 1; + } +diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c +index 6444aef33cf08..f9e3aed40984b 100644 +--- a/drivers/usb/host/xhci-mem.c ++++ b/drivers/usb/host/xhci-mem.c +@@ -2318,6 +2318,9 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) + xhci->hw_ports[i].addr = &xhci->op_regs->port_status_base + + NUM_PORT_REGS * i; + xhci->hw_ports[i].hw_portnum = i; ++ ++ init_completion(&xhci->hw_ports[i].rexit_done); ++ init_completion(&xhci->hw_ports[i].u3exit_done); + } + + xhci->rh_bw = kcalloc_node(num_ports, sizeof(*xhci->rh_bw), flags, +@@ -2587,13 +2590,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) + */ + for (i = 0; i < MAX_HC_SLOTS; i++) + xhci->devs[i] = NULL; +- for (i = 0; i < USB_MAXCHILDREN; i++) { +- xhci->usb2_rhub.bus_state.resume_done[i] = 0; +- xhci->usb3_rhub.bus_state.resume_done[i] = 0; +- /* Only the USB 2.0 completions will ever be used. */ +- init_completion(&xhci->usb2_rhub.bus_state.rexit_done[i]); +- init_completion(&xhci->usb3_rhub.bus_state.u3exit_done[i]); +- } + + if (scratchpad_alloc(xhci, flags)) + goto fail; +diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c +index 945ed5f3e8588..8038dced215c7 100644 +--- a/drivers/usb/host/xhci-ring.c ++++ b/drivers/usb/host/xhci-ring.c +@@ -1987,7 +1987,7 @@ static void handle_port_status(struct xhci_hcd *xhci, + goto cleanup; + } else if (!test_bit(hcd_portnum, &bus_state->resuming_ports)) { + xhci_dbg(xhci, "resume HS port %d\n", port_id); +- bus_state->resume_done[hcd_portnum] = jiffies + ++ port->resume_done = jiffies + + msecs_to_jiffies(USB_RESUME_TIMEOUT); + set_bit(hcd_portnum, &bus_state->resuming_ports); + /* Do the rest in GetPortStatus after resume time delay. +@@ -1996,7 +1996,7 @@ static void handle_port_status(struct xhci_hcd *xhci, + */ + set_bit(HCD_FLAG_POLL_RH, &hcd->flags); + mod_timer(&hcd->rh_timer, +- bus_state->resume_done[hcd_portnum]); ++ port->resume_done); + usb_hcd_start_port_resume(&hcd->self, hcd_portnum); + bogus_port_status = true; + } +@@ -2008,7 +2008,7 @@ static void handle_port_status(struct xhci_hcd *xhci, + (portsc & PORT_PLS_MASK) == XDEV_U1 || + (portsc & PORT_PLS_MASK) == XDEV_U2)) { + xhci_dbg(xhci, "resume SS port %d finished\n", port_id); +- complete(&bus_state->u3exit_done[hcd_portnum]); ++ complete(&port->u3exit_done); + /* We've just brought the device into U0/1/2 through either the + * Resume state after a device remote wakeup, or through the + * U3Exit state after a host-initiated resume. If it's a device +@@ -2033,10 +2033,9 @@ static void handle_port_status(struct xhci_hcd *xhci, + * RExit to a disconnect state). If so, let the the driver know it's + * out of the RExit state. + */ +- if (!DEV_SUPERSPEED_ANY(portsc) && hcd->speed < HCD_USB3 && +- test_and_clear_bit(hcd_portnum, +- &bus_state->rexit_ports)) { +- complete(&bus_state->rexit_done[hcd_portnum]); ++ if (hcd->speed < HCD_USB3 && port->rexit_active) { ++ complete(&port->rexit_done); ++ port->rexit_active = false; + bogus_port_status = true; + goto cleanup; + } +diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h +index 64278cd77f988..22ffbeaa51eb6 100644 +--- a/drivers/usb/host/xhci.h ++++ b/drivers/usb/host/xhci.h +@@ -1708,13 +1708,8 @@ struct xhci_bus_state { + u32 port_c_suspend; + u32 suspended_ports; + u32 port_remote_wakeup; +- unsigned long resume_done[USB_MAXCHILDREN]; + /* which ports have started to resume */ + unsigned long resuming_ports; +- /* Which ports are waiting on RExit to U0 transition. */ +- unsigned long rexit_ports; +- struct completion rexit_done[USB_MAXCHILDREN]; +- struct completion u3exit_done[USB_MAXCHILDREN]; + }; + + +@@ -1738,6 +1733,10 @@ struct xhci_port { + struct xhci_hub *rhub; + struct xhci_port_cap *port_cap; + unsigned int lpm_incapable:1; ++ unsigned long resume_done; ++ bool rexit_active; ++ struct completion rexit_done; ++ struct completion u3exit_done; + }; + + struct xhci_hub { +-- +2.43.0 + diff --git a/queue-5.15/xhci-rename-resume_done-to-resume_timestamp.patch b/queue-5.15/xhci-rename-resume_done-to-resume_timestamp.patch new file mode 100644 index 00000000000..c9108a6871b --- /dev/null +++ b/queue-5.15/xhci-rename-resume_done-to-resume_timestamp.patch @@ -0,0 +1,134 @@ +From f646a5d44241e6fa54eb2be897bdb6306c612489 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 2 Feb 2023 17:05:03 +0200 +Subject: xhci: rename resume_done to resume_timestamp + +From: Mathias Nyman + +[ Upstream commit a909d629ae77b97b6288bc3cfe68560454bf79c6 ] + +resume_done is just a timestamp, avoid confusing it with completions +related to port state transitions that are named *_done + +Signed-off-by: Mathias Nyman +Link: https://lore.kernel.org/r/20230202150505.618915-10-mathias.nyman@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Stable-dep-of: d7cdfc319b2b ("xhci: track port suspend state correctly in unsuccessful resume cases") +Signed-off-by: Sasha Levin +--- + drivers/usb/host/xhci-hub.c | 20 ++++++++++---------- + drivers/usb/host/xhci-ring.c | 4 ++-- + drivers/usb/host/xhci.h | 2 +- + 3 files changed, 13 insertions(+), 13 deletions(-) + +diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c +index 7f0c9176b4951..d3d3dadaca10b 100644 +--- a/drivers/usb/host/xhci-hub.c ++++ b/drivers/usb/host/xhci-hub.c +@@ -924,7 +924,7 @@ static int xhci_handle_usb2_port_link_resume(struct xhci_port *port, + return -EINVAL; + } + /* did port event handler already start resume timing? */ +- if (!port->resume_done) { ++ if (!port->resume_timestamp) { + /* If not, maybe we are in a host initated resume? */ + if (test_bit(wIndex, &bus_state->resuming_ports)) { + /* Host initated resume doesn't time the resume +@@ -941,18 +941,18 @@ static int xhci_handle_usb2_port_link_resume(struct xhci_port *port, + msecs_to_jiffies(USB_RESUME_TIMEOUT); + + set_bit(wIndex, &bus_state->resuming_ports); +- port->resume_done = timeout; ++ port->resume_timestamp = timeout; + mod_timer(&hcd->rh_timer, timeout); + usb_hcd_start_port_resume(&hcd->self, wIndex); + } + /* Has resume been signalled for USB_RESUME_TIME yet? */ +- } else if (time_after_eq(jiffies, port->resume_done)) { ++ } else if (time_after_eq(jiffies, port->resume_timestamp)) { + int time_left; + + xhci_dbg(xhci, "resume USB2 port %d-%d\n", + hcd->self.busnum, wIndex + 1); + +- port->resume_done = 0; ++ port->resume_timestamp = 0; + clear_bit(wIndex, &bus_state->resuming_ports); + port->rexit_active = true; + +@@ -1087,10 +1087,10 @@ static void xhci_get_usb2_port_status(struct xhci_port *port, u32 *status, + if (link_state == XDEV_U2) + *status |= USB_PORT_STAT_L1; + if (link_state == XDEV_U0) { +- if (port->resume_done) ++ if (port->resume_timestamp) + usb_hcd_end_port_resume(&port->rhub->hcd->self, + portnum); +- port->resume_done = 0; ++ port->resume_timestamp = 0; + clear_bit(portnum, &bus_state->resuming_ports); + if (bus_state->suspended_ports & (1 << portnum)) { + bus_state->suspended_ports &= ~(1 << portnum); +@@ -1162,11 +1162,11 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd, + * Clear stale usb2 resume signalling variables in case port changed + * state during resume signalling. For example on error + */ +- if ((port->resume_done || ++ if ((port->resume_timestamp || + test_bit(wIndex, &bus_state->resuming_ports)) && + (raw_port_status & PORT_PLS_MASK) != XDEV_U3 && + (raw_port_status & PORT_PLS_MASK) != XDEV_RESUME) { +- port->resume_done = 0; ++ port->resume_timestamp = 0; + clear_bit(wIndex, &bus_state->resuming_ports); + usb_hcd_end_port_resume(&hcd->self, wIndex); + } +@@ -1674,8 +1674,8 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf) + + if ((temp & mask) != 0 || + (bus_state->port_c_suspend & 1 << i) || +- (ports[i]->resume_done && time_after_eq( +- jiffies, ports[i]->resume_done))) { ++ (ports[i]->resume_timestamp && time_after_eq( ++ jiffies, ports[i]->resume_timestamp))) { + buf[(i + 1) / 8] |= 1 << (i + 1) % 8; + status = 1; + } +diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c +index 8038dced215c7..aa12da0796d2d 100644 +--- a/drivers/usb/host/xhci-ring.c ++++ b/drivers/usb/host/xhci-ring.c +@@ -1987,7 +1987,7 @@ static void handle_port_status(struct xhci_hcd *xhci, + goto cleanup; + } else if (!test_bit(hcd_portnum, &bus_state->resuming_ports)) { + xhci_dbg(xhci, "resume HS port %d\n", port_id); +- port->resume_done = jiffies + ++ port->resume_timestamp = jiffies + + msecs_to_jiffies(USB_RESUME_TIMEOUT); + set_bit(hcd_portnum, &bus_state->resuming_ports); + /* Do the rest in GetPortStatus after resume time delay. +@@ -1996,7 +1996,7 @@ static void handle_port_status(struct xhci_hcd *xhci, + */ + set_bit(HCD_FLAG_POLL_RH, &hcd->flags); + mod_timer(&hcd->rh_timer, +- port->resume_done); ++ port->resume_timestamp); + usb_hcd_start_port_resume(&hcd->self, hcd_portnum); + bogus_port_status = true; + } +diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h +index 22ffbeaa51eb6..8ae33db1e4bcc 100644 +--- a/drivers/usb/host/xhci.h ++++ b/drivers/usb/host/xhci.h +@@ -1733,7 +1733,7 @@ struct xhci_port { + struct xhci_hub *rhub; + struct xhci_port_cap *port_cap; + unsigned int lpm_incapable:1; +- unsigned long resume_done; ++ unsigned long resume_timestamp; + bool rexit_active; + struct completion rexit_done; + struct completion u3exit_done; +-- +2.43.0 + diff --git a/queue-5.15/xhci-track-port-suspend-state-correctly-in-unsuccess.patch b/queue-5.15/xhci-track-port-suspend-state-correctly-in-unsuccess.patch new file mode 100644 index 00000000000..fa606f74b56 --- /dev/null +++ b/queue-5.15/xhci-track-port-suspend-state-correctly-in-unsuccess.patch @@ -0,0 +1,80 @@ +From 5a5834b6e35afa4e79b994e6d344b5e60353ce11 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Sep 2023 17:31:06 +0300 +Subject: xhci: track port suspend state correctly in unsuccessful resume cases + +From: Mathias Nyman + +[ Upstream commit d7cdfc319b2bcf6899ab0a05eec0958bc802a9a1 ] + +xhci-hub.c tracks suspended ports in a suspended_port bitfield. +This is checked when responding to a Get_Status(PORT) request to see if a +port in running U0 state was recently resumed, and adds the required +USB_PORT_STAT_C_SUSPEND change bit in those cases. + +The suspended_port bit was left uncleared if a device is disconnected +during suspend. The bit remained set even when a new device was connected +and enumerated. The set bit resulted in a incorrect Get_Status(PORT) +response with a bogus USB_PORT_STAT_C_SUSPEND change +bit set once the new device reached U0 link state. + +USB_PORT_STAT_C_SUSPEND change bit is only used for USB2 ports, but +xhci-hub keeps track of both USB2 and USB3 suspended ports. + +Cc: stable@vger.kernel.org +Reported-by: Wesley Cheng +Closes: https://lore.kernel.org/linux-usb/d68aa806-b26a-0e43-42fb-b8067325e967@quicinc.com/ +Fixes: 1d5810b6923c ("xhci: Rework port suspend structures for limited ports.") +Tested-by: Wesley Cheng +Signed-off-by: Mathias Nyman +Link: https://lore.kernel.org/r/20230915143108.1532163-3-mathias.nyman@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/host/xhci-hub.c | 19 ++++++++++--------- + 1 file changed, 10 insertions(+), 9 deletions(-) + +diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c +index 56c600be272a6..723201394eaa8 100644 +--- a/drivers/usb/host/xhci-hub.c ++++ b/drivers/usb/host/xhci-hub.c +@@ -1043,19 +1043,19 @@ static void xhci_get_usb3_port_status(struct xhci_port *port, u32 *status, + *status |= USB_PORT_STAT_C_CONFIG_ERROR << 16; + + /* USB3 specific wPortStatus bits */ +- if (portsc & PORT_POWER) { ++ if (portsc & PORT_POWER) + *status |= USB_SS_PORT_STAT_POWER; +- /* link state handling */ +- if (link_state == XDEV_U0) +- bus_state->suspended_ports &= ~(1 << portnum); +- } + +- /* remote wake resume signaling complete */ +- if (bus_state->port_remote_wakeup & (1 << portnum) && ++ /* no longer suspended or resuming */ ++ if (link_state != XDEV_U3 && + link_state != XDEV_RESUME && + link_state != XDEV_RECOVERY) { +- bus_state->port_remote_wakeup &= ~(1 << portnum); +- usb_hcd_end_port_resume(&hcd->self, portnum); ++ /* remote wake resume signaling complete */ ++ if (bus_state->port_remote_wakeup & (1 << portnum)) { ++ bus_state->port_remote_wakeup &= ~(1 << portnum); ++ usb_hcd_end_port_resume(&hcd->self, portnum); ++ } ++ bus_state->suspended_ports &= ~(1 << portnum); + } + + xhci_hub_report_usb3_link_state(xhci, status, portsc); +@@ -1112,6 +1112,7 @@ static void xhci_get_usb2_port_status(struct xhci_port *port, u32 *status, + usb_hcd_end_port_resume(&port->rhub->hcd->self, portnum); + } + port->rexit_active = 0; ++ bus_state->suspended_ports &= ~(1 << portnum); + } + } + +-- +2.43.0 +