From: Sasha Levin Date: Mon, 21 Feb 2022 04:50:48 +0000 (-0500) Subject: Fixes for 5.15 X-Git-Tag: v4.9.303~26^2~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5809ae3297f5490d988094c58e247239a6354fb3;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 5.15 Signed-off-by: Sasha Levin --- diff --git a/queue-5.15/acpi-pm-revert-only-mark-ec-gpe-for-wakeup-on-intel-.patch b/queue-5.15/acpi-pm-revert-only-mark-ec-gpe-for-wakeup-on-intel-.patch new file mode 100644 index 00000000000..cffc2536fe0 --- /dev/null +++ b/queue-5.15/acpi-pm-revert-only-mark-ec-gpe-for-wakeup-on-intel-.patch @@ -0,0 +1,89 @@ +From a402d8f3d120e2dd27fc238ad40d9f14a9c2127f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 28 Jan 2022 14:35:03 -0600 +Subject: ACPI: PM: Revert "Only mark EC GPE for wakeup on Intel systems" + +From: Mario Limonciello + +[ Upstream commit d6ebb17ccc7b37872a32bc25b4a21f1e5af8c7e3 ] + +Testing on various upcoming OEM systems shows commit 7b167c4cb48e ("ACPI: +PM: Only mark EC GPE for wakeup on Intel systems") was short +sighted and the symptoms were indicative of other problems. Some OEMs +do have the dedicated GPIOs for the power button but also rely upon +an interrupt to the EC SCI to let the lid work. + +The original commit showed spurious activity on Lenovo systems: + * On both Lenovo T14 and P14s the keyboard wakeup doesn't work, and + sometimes the power button event doesn't work. + +This was confirmed on my end at that time. + +However further development in the kernel showed that the issue was +actually the IRQ for the GPIO controller was also shared with the EC SCI. +This was actually fixed by commit 2d54067fcd23 ("pinctrl: amd: Fix +wakeups when IRQ is shared with SCI"). + +The original commit also showed problems with AC adapter: + * On HP 635 G7 detaching or attaching AC during suspend will cause + the system not to wakeup + * On Asus vivobook to prevent detaching AC causing resume problems + * On Lenovo 14ARE05 to prevent detaching AC causing resume problems + * On HP ENVY x360 to prevent detaching AC causing resume problems + +Detaching AC adapter causing problems appears to have been a problem +because the EC SCI went off to notify the OS of the power adapter change +but the SCI was ignored and there was no other way to wake up this system +since GPIO controller wasn't properly enabled. The wakeups were fixed by +enabling the GPIO controller in commit acd47b9f28e5 ("pinctrl: amd: Handle +wake-up interrupt"). + +I've confirmed on a variety of OEM notebooks with the following test + + 1) echo 1 | sudo tee /sys/power/pm_debug_messages + 2) sudo systemctl suspend + 3) unplug AC adapter, make sure system is still asleep + 4) wake system from lid (which is provided by ACPI SCI on some of them) + 5) dmesg + a) see the EC GPE dispatched, timekeeping for X seconds (matching ~time + until AC adapter plug out) + b) see timekeeping for Y seconds until woke (matching ~time from AC + adapter until lid event) + 6) Look at /sys/kernel/debug/amd_pmc/s0ix_stats + "Time (in us) in S0i3" = X + Y - firmware processing time + +Signed-off-by: Mario Limonciello +Tested-by: Kai-Heng Feng +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/x86/s2idle.c | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c +index 1c48358b43ba3..e0185e841b2a3 100644 +--- a/drivers/acpi/x86/s2idle.c ++++ b/drivers/acpi/x86/s2idle.c +@@ -424,15 +424,11 @@ static int lps0_device_attach(struct acpi_device *adev, + mem_sleep_current = PM_SUSPEND_TO_IDLE; + + /* +- * Some Intel based LPS0 systems, like ASUS Zenbook UX430UNR/i7-8550U don't +- * use intel-hid or intel-vbtn but require the EC GPE to be enabled while +- * suspended for certain wakeup devices to work, so mark it as wakeup-capable. +- * +- * Only enable on !AMD as enabling this universally causes problems for a number +- * of AMD based systems. ++ * Some LPS0 systems, like ASUS Zenbook UX430UNR/i7-8550U, require the ++ * EC GPE to be enabled while suspended for certain wakeup devices to ++ * work, so mark it as wakeup-capable. + */ +- if (!acpi_s2idle_vendor_amd()) +- acpi_ec_mark_gpe_for_wake(); ++ acpi_ec_mark_gpe_for_wake(); + + return 0; + } +-- +2.34.1 + diff --git a/queue-5.15/acpi-pm-revert-only-mark-ec-gpe-for-wakeup-on-intel-.patch-2827 b/queue-5.15/acpi-pm-revert-only-mark-ec-gpe-for-wakeup-on-intel-.patch-2827 new file mode 100644 index 00000000000..cffc2536fe0 --- /dev/null +++ b/queue-5.15/acpi-pm-revert-only-mark-ec-gpe-for-wakeup-on-intel-.patch-2827 @@ -0,0 +1,89 @@ +From a402d8f3d120e2dd27fc238ad40d9f14a9c2127f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 28 Jan 2022 14:35:03 -0600 +Subject: ACPI: PM: Revert "Only mark EC GPE for wakeup on Intel systems" + +From: Mario Limonciello + +[ Upstream commit d6ebb17ccc7b37872a32bc25b4a21f1e5af8c7e3 ] + +Testing on various upcoming OEM systems shows commit 7b167c4cb48e ("ACPI: +PM: Only mark EC GPE for wakeup on Intel systems") was short +sighted and the symptoms were indicative of other problems. Some OEMs +do have the dedicated GPIOs for the power button but also rely upon +an interrupt to the EC SCI to let the lid work. + +The original commit showed spurious activity on Lenovo systems: + * On both Lenovo T14 and P14s the keyboard wakeup doesn't work, and + sometimes the power button event doesn't work. + +This was confirmed on my end at that time. + +However further development in the kernel showed that the issue was +actually the IRQ for the GPIO controller was also shared with the EC SCI. +This was actually fixed by commit 2d54067fcd23 ("pinctrl: amd: Fix +wakeups when IRQ is shared with SCI"). + +The original commit also showed problems with AC adapter: + * On HP 635 G7 detaching or attaching AC during suspend will cause + the system not to wakeup + * On Asus vivobook to prevent detaching AC causing resume problems + * On Lenovo 14ARE05 to prevent detaching AC causing resume problems + * On HP ENVY x360 to prevent detaching AC causing resume problems + +Detaching AC adapter causing problems appears to have been a problem +because the EC SCI went off to notify the OS of the power adapter change +but the SCI was ignored and there was no other way to wake up this system +since GPIO controller wasn't properly enabled. The wakeups were fixed by +enabling the GPIO controller in commit acd47b9f28e5 ("pinctrl: amd: Handle +wake-up interrupt"). + +I've confirmed on a variety of OEM notebooks with the following test + + 1) echo 1 | sudo tee /sys/power/pm_debug_messages + 2) sudo systemctl suspend + 3) unplug AC adapter, make sure system is still asleep + 4) wake system from lid (which is provided by ACPI SCI on some of them) + 5) dmesg + a) see the EC GPE dispatched, timekeeping for X seconds (matching ~time + until AC adapter plug out) + b) see timekeeping for Y seconds until woke (matching ~time from AC + adapter until lid event) + 6) Look at /sys/kernel/debug/amd_pmc/s0ix_stats + "Time (in us) in S0i3" = X + Y - firmware processing time + +Signed-off-by: Mario Limonciello +Tested-by: Kai-Heng Feng +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/x86/s2idle.c | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c +index 1c48358b43ba3..e0185e841b2a3 100644 +--- a/drivers/acpi/x86/s2idle.c ++++ b/drivers/acpi/x86/s2idle.c +@@ -424,15 +424,11 @@ static int lps0_device_attach(struct acpi_device *adev, + mem_sleep_current = PM_SUSPEND_TO_IDLE; + + /* +- * Some Intel based LPS0 systems, like ASUS Zenbook UX430UNR/i7-8550U don't +- * use intel-hid or intel-vbtn but require the EC GPE to be enabled while +- * suspended for certain wakeup devices to work, so mark it as wakeup-capable. +- * +- * Only enable on !AMD as enabling this universally causes problems for a number +- * of AMD based systems. ++ * Some LPS0 systems, like ASUS Zenbook UX430UNR/i7-8550U, require the ++ * EC GPE to be enabled while suspended for certain wakeup devices to ++ * work, so mark it as wakeup-capable. + */ +- if (!acpi_s2idle_vendor_amd()) +- acpi_ec_mark_gpe_for_wake(); ++ acpi_ec_mark_gpe_for_wake(); + + return 0; + } +-- +2.34.1 + diff --git a/queue-5.15/arm-omap2-adjust-the-location-of-put_device-call-in-.patch b/queue-5.15/arm-omap2-adjust-the-location-of-put_device-call-in-.patch new file mode 100644 index 00000000000..42889bfb0aa --- /dev/null +++ b/queue-5.15/arm-omap2-adjust-the-location-of-put_device-call-in-.patch @@ -0,0 +1,43 @@ +From a43d7f46b8ba789facaf6207b1802cce4b64432c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Nov 2021 06:27:26 +0000 +Subject: ARM: OMAP2+: adjust the location of put_device() call in + omapdss_init_of + +From: Ye Guojin + +[ Upstream commit 34596ba380b03d181e24efd50e2f21045bde3696 ] + +This was found by coccicheck: +./arch/arm/mach-omap2/display.c, 272, 1-7, ERROR missing put_device; +call of_find_device_by_node on line 258, but without a corresponding +object release within this function. + +Move the put_device() call before the if judgment. + +Reported-by: Zeal Robot +Signed-off-by: Ye Guojin +Signed-off-by: Tony Lindgren +Signed-off-by: Sasha Levin +--- + arch/arm/mach-omap2/display.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c +index 6daaa645ae5d9..21413a9b7b6c6 100644 +--- a/arch/arm/mach-omap2/display.c ++++ b/arch/arm/mach-omap2/display.c +@@ -263,9 +263,9 @@ static int __init omapdss_init_of(void) + } + + r = of_platform_populate(node, NULL, NULL, &pdev->dev); ++ put_device(&pdev->dev); + if (r) { + pr_err("Unable to populate DSS submodule devices\n"); +- put_device(&pdev->dev); + return r; + } + +-- +2.34.1 + diff --git a/queue-5.15/arm-omap2-adjust-the-location-of-put_device-call-in-.patch-12804 b/queue-5.15/arm-omap2-adjust-the-location-of-put_device-call-in-.patch-12804 new file mode 100644 index 00000000000..42889bfb0aa --- /dev/null +++ b/queue-5.15/arm-omap2-adjust-the-location-of-put_device-call-in-.patch-12804 @@ -0,0 +1,43 @@ +From a43d7f46b8ba789facaf6207b1802cce4b64432c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Nov 2021 06:27:26 +0000 +Subject: ARM: OMAP2+: adjust the location of put_device() call in + omapdss_init_of + +From: Ye Guojin + +[ Upstream commit 34596ba380b03d181e24efd50e2f21045bde3696 ] + +This was found by coccicheck: +./arch/arm/mach-omap2/display.c, 272, 1-7, ERROR missing put_device; +call of_find_device_by_node on line 258, but without a corresponding +object release within this function. + +Move the put_device() call before the if judgment. + +Reported-by: Zeal Robot +Signed-off-by: Ye Guojin +Signed-off-by: Tony Lindgren +Signed-off-by: Sasha Levin +--- + arch/arm/mach-omap2/display.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c +index 6daaa645ae5d9..21413a9b7b6c6 100644 +--- a/arch/arm/mach-omap2/display.c ++++ b/arch/arm/mach-omap2/display.c +@@ -263,9 +263,9 @@ static int __init omapdss_init_of(void) + } + + r = of_platform_populate(node, NULL, NULL, &pdev->dev); ++ put_device(&pdev->dev); + if (r) { + pr_err("Unable to populate DSS submodule devices\n"); +- put_device(&pdev->dev); + return r; + } + +-- +2.34.1 + diff --git a/queue-5.15/arm-omap2-hwmod-add-of_node_put-before-break.patch b/queue-5.15/arm-omap2-hwmod-add-of_node_put-before-break.patch new file mode 100644 index 00000000000..7b9b51de060 --- /dev/null +++ b/queue-5.15/arm-omap2-hwmod-add-of_node_put-before-break.patch @@ -0,0 +1,42 @@ +From 86a1706ea103e03694c4459bc91caac3cfff3c83 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Oct 2021 04:57:19 -0400 +Subject: ARM: OMAP2+: hwmod: Add of_node_put() before break + +From: Wan Jiabing + +[ Upstream commit 80c469a0a03763f814715f3d12b6f3964c7423e8 ] + +Fix following coccicheck warning: +./arch/arm/mach-omap2/omap_hwmod.c:753:1-23: WARNING: Function +for_each_matching_node should have of_node_put() before break + +Early exits from for_each_matching_node should decrement the +node reference counter. + +Signed-off-by: Wan Jiabing +Signed-off-by: Tony Lindgren +Signed-off-by: Sasha Levin +--- + arch/arm/mach-omap2/omap_hwmod.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c +index 0c2936c7a3799..a5e9cffcac10c 100644 +--- a/arch/arm/mach-omap2/omap_hwmod.c ++++ b/arch/arm/mach-omap2/omap_hwmod.c +@@ -752,8 +752,10 @@ static int __init _init_clkctrl_providers(void) + + for_each_matching_node(np, ti_clkctrl_match_table) { + ret = _setup_clkctrl_provider(np); +- if (ret) ++ if (ret) { ++ of_node_put(np); + break; ++ } + } + + return ret; +-- +2.34.1 + diff --git a/queue-5.15/arm-omap2-hwmod-add-of_node_put-before-break.patch-18156 b/queue-5.15/arm-omap2-hwmod-add-of_node_put-before-break.patch-18156 new file mode 100644 index 00000000000..7b9b51de060 --- /dev/null +++ b/queue-5.15/arm-omap2-hwmod-add-of_node_put-before-break.patch-18156 @@ -0,0 +1,42 @@ +From 86a1706ea103e03694c4459bc91caac3cfff3c83 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Oct 2021 04:57:19 -0400 +Subject: ARM: OMAP2+: hwmod: Add of_node_put() before break + +From: Wan Jiabing + +[ Upstream commit 80c469a0a03763f814715f3d12b6f3964c7423e8 ] + +Fix following coccicheck warning: +./arch/arm/mach-omap2/omap_hwmod.c:753:1-23: WARNING: Function +for_each_matching_node should have of_node_put() before break + +Early exits from for_each_matching_node should decrement the +node reference counter. + +Signed-off-by: Wan Jiabing +Signed-off-by: Tony Lindgren +Signed-off-by: Sasha Levin +--- + arch/arm/mach-omap2/omap_hwmod.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c +index 0c2936c7a3799..a5e9cffcac10c 100644 +--- a/arch/arm/mach-omap2/omap_hwmod.c ++++ b/arch/arm/mach-omap2/omap_hwmod.c +@@ -752,8 +752,10 @@ static int __init _init_clkctrl_providers(void) + + for_each_matching_node(np, ti_clkctrl_match_table) { + ret = _setup_clkctrl_provider(np); +- if (ret) ++ if (ret) { ++ of_node_put(np); + break; ++ } + } + + return ret; +-- +2.34.1 + diff --git a/queue-5.15/arm64-dts-meson-g12-add-atf-bl32-reserved-memory-reg.patch b/queue-5.15/arm64-dts-meson-g12-add-atf-bl32-reserved-memory-reg.patch new file mode 100644 index 00000000000..bceb80b9008 --- /dev/null +++ b/queue-5.15/arm64-dts-meson-g12-add-atf-bl32-reserved-memory-reg.patch @@ -0,0 +1,42 @@ +From c5424fe6ea3483a0171b64d46090b0cdf79c3852 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 26 Jan 2022 04:49:53 +0000 +Subject: arm64: dts: meson-g12: add ATF BL32 reserved-memory region + +From: Christian Hewitt + +[ Upstream commit 08982a1b3aa2611c9c711d24825c9002d28536f4 ] + +Add an additional reserved memory region for the BL32 trusted firmware +present in many devices that boot from Amlogic vendor u-boot. + +Signed-off-by: Christian Hewitt +Reviewed-by: Neil Armstrong +Reviewed-by: Kevin Hilman +Signed-off-by: Neil Armstrong +Link: https://lore.kernel.org/r/20220126044954.19069-3-christianshewitt@gmail.com +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +index 428449d98c0ae..a3a1ea0f21340 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +@@ -107,6 +107,12 @@ secmon_reserved: secmon@5000000 { + no-map; + }; + ++ /* 32 MiB reserved for ARM Trusted Firmware (BL32) */ ++ secmon_reserved_bl32: secmon@5300000 { ++ reg = <0x0 0x05300000 0x0 0x2000000>; ++ no-map; ++ }; ++ + linux,cma { + compatible = "shared-dma-pool"; + reusable; +-- +2.34.1 + diff --git a/queue-5.15/arm64-dts-meson-g12-add-atf-bl32-reserved-memory-reg.patch-20974 b/queue-5.15/arm64-dts-meson-g12-add-atf-bl32-reserved-memory-reg.patch-20974 new file mode 100644 index 00000000000..bceb80b9008 --- /dev/null +++ b/queue-5.15/arm64-dts-meson-g12-add-atf-bl32-reserved-memory-reg.patch-20974 @@ -0,0 +1,42 @@ +From c5424fe6ea3483a0171b64d46090b0cdf79c3852 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 26 Jan 2022 04:49:53 +0000 +Subject: arm64: dts: meson-g12: add ATF BL32 reserved-memory region + +From: Christian Hewitt + +[ Upstream commit 08982a1b3aa2611c9c711d24825c9002d28536f4 ] + +Add an additional reserved memory region for the BL32 trusted firmware +present in many devices that boot from Amlogic vendor u-boot. + +Signed-off-by: Christian Hewitt +Reviewed-by: Neil Armstrong +Reviewed-by: Kevin Hilman +Signed-off-by: Neil Armstrong +Link: https://lore.kernel.org/r/20220126044954.19069-3-christianshewitt@gmail.com +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +index 428449d98c0ae..a3a1ea0f21340 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +@@ -107,6 +107,12 @@ secmon_reserved: secmon@5000000 { + no-map; + }; + ++ /* 32 MiB reserved for ARM Trusted Firmware (BL32) */ ++ secmon_reserved_bl32: secmon@5300000 { ++ reg = <0x0 0x05300000 0x0 0x2000000>; ++ no-map; ++ }; ++ + linux,cma { + compatible = "shared-dma-pool"; + reusable; +-- +2.34.1 + diff --git a/queue-5.15/arm64-dts-meson-g12-drop-bl32-region-from-sei510-sei.patch b/queue-5.15/arm64-dts-meson-g12-drop-bl32-region-from-sei510-sei.patch new file mode 100644 index 00000000000..477c2256f4f --- /dev/null +++ b/queue-5.15/arm64-dts-meson-g12-drop-bl32-region-from-sei510-sei.patch @@ -0,0 +1,64 @@ +From 02ee3bd0fb95ba5923b76d1c4192dfc867f92d75 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 26 Jan 2022 04:49:54 +0000 +Subject: arm64: dts: meson-g12: drop BL32 region from SEI510/SEI610 + +From: Christian Hewitt + +[ Upstream commit f26573e2bc9dfd551a0d5c6971f18cc546543312 ] + +The BL32/TEE reserved-memory region is now inherited from the common +family dtsi (meson-g12-common) so we can drop it from board files. + +Signed-off-by: Christian Hewitt +Reviewed-by: Neil Armstrong +Reviewed-by: Kevin Hilman +Signed-off-by: Neil Armstrong +Link: https://lore.kernel.org/r/20220126044954.19069-4-christianshewitt@gmail.com +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts | 8 -------- + arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts | 8 -------- + 2 files changed, 16 deletions(-) + +diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts +index d8838dde0f0f4..4fb31c2ba31c4 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts +@@ -157,14 +157,6 @@ vddio_ao1v8: regulator-vddio_ao1v8 { + regulator-always-on; + }; + +- reserved-memory { +- /* TEE Reserved Memory */ +- bl32_reserved: bl32@5000000 { +- reg = <0x0 0x05300000 0x0 0x2000000>; +- no-map; +- }; +- }; +- + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; +diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts +index 427475846fc70..a5d79f2f7c196 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts +@@ -203,14 +203,6 @@ vddio_ao1v8: regulator-vddio_ao1v8 { + regulator-always-on; + }; + +- reserved-memory { +- /* TEE Reserved Memory */ +- bl32_reserved: bl32@5000000 { +- reg = <0x0 0x05300000 0x0 0x2000000>; +- no-map; +- }; +- }; +- + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; +-- +2.34.1 + diff --git a/queue-5.15/arm64-dts-meson-g12-drop-bl32-region-from-sei510-sei.patch-32121 b/queue-5.15/arm64-dts-meson-g12-drop-bl32-region-from-sei510-sei.patch-32121 new file mode 100644 index 00000000000..477c2256f4f --- /dev/null +++ b/queue-5.15/arm64-dts-meson-g12-drop-bl32-region-from-sei510-sei.patch-32121 @@ -0,0 +1,64 @@ +From 02ee3bd0fb95ba5923b76d1c4192dfc867f92d75 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 26 Jan 2022 04:49:54 +0000 +Subject: arm64: dts: meson-g12: drop BL32 region from SEI510/SEI610 + +From: Christian Hewitt + +[ Upstream commit f26573e2bc9dfd551a0d5c6971f18cc546543312 ] + +The BL32/TEE reserved-memory region is now inherited from the common +family dtsi (meson-g12-common) so we can drop it from board files. + +Signed-off-by: Christian Hewitt +Reviewed-by: Neil Armstrong +Reviewed-by: Kevin Hilman +Signed-off-by: Neil Armstrong +Link: https://lore.kernel.org/r/20220126044954.19069-4-christianshewitt@gmail.com +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts | 8 -------- + arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts | 8 -------- + 2 files changed, 16 deletions(-) + +diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts +index d8838dde0f0f4..4fb31c2ba31c4 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts +@@ -157,14 +157,6 @@ vddio_ao1v8: regulator-vddio_ao1v8 { + regulator-always-on; + }; + +- reserved-memory { +- /* TEE Reserved Memory */ +- bl32_reserved: bl32@5000000 { +- reg = <0x0 0x05300000 0x0 0x2000000>; +- no-map; +- }; +- }; +- + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; +diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts +index 427475846fc70..a5d79f2f7c196 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts +@@ -203,14 +203,6 @@ vddio_ao1v8: regulator-vddio_ao1v8 { + regulator-always-on; + }; + +- reserved-memory { +- /* TEE Reserved Memory */ +- bl32_reserved: bl32@5000000 { +- reg = <0x0 0x05300000 0x0 0x2000000>; +- no-map; +- }; +- }; +- + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; +-- +2.34.1 + diff --git a/queue-5.15/arm64-dts-meson-gx-add-atf-bl32-reserved-memory-regi.patch b/queue-5.15/arm64-dts-meson-gx-add-atf-bl32-reserved-memory-regi.patch new file mode 100644 index 00000000000..ae75227f83b --- /dev/null +++ b/queue-5.15/arm64-dts-meson-gx-add-atf-bl32-reserved-memory-regi.patch @@ -0,0 +1,43 @@ +From 70a7a4bc0dd897c2d271ca4f38bd6505d47cf754 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 26 Jan 2022 04:49:52 +0000 +Subject: arm64: dts: meson-gx: add ATF BL32 reserved-memory region + +From: Christian Hewitt + +[ Upstream commit 76577c9137456febb05b0e17d244113196a98968 ] + +Add an additional reserved memory region for the BL32 trusted firmware +present in many devices that boot from Amlogic vendor u-boot. + +Suggested-by: Mateusz Krzak +Signed-off-by: Christian Hewitt +Reviewed-by: Neil Armstrong +Reviewed-by: Kevin Hilman +Signed-off-by: Neil Armstrong +Link: https://lore.kernel.org/r/20220126044954.19069-2-christianshewitt@gmail.com +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi +index 6b457b2c30a4b..aa14ea017a613 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi +@@ -49,6 +49,12 @@ secmon_reserved_alt: secmon@5000000 { + no-map; + }; + ++ /* 32 MiB reserved for ARM Trusted Firmware (BL32) */ ++ secmon_reserved_bl32: secmon@5300000 { ++ reg = <0x0 0x05300000 0x0 0x2000000>; ++ no-map; ++ }; ++ + linux,cma { + compatible = "shared-dma-pool"; + reusable; +-- +2.34.1 + diff --git a/queue-5.15/arm64-dts-meson-gx-add-atf-bl32-reserved-memory-regi.patch-6949 b/queue-5.15/arm64-dts-meson-gx-add-atf-bl32-reserved-memory-regi.patch-6949 new file mode 100644 index 00000000000..ae75227f83b --- /dev/null +++ b/queue-5.15/arm64-dts-meson-gx-add-atf-bl32-reserved-memory-regi.patch-6949 @@ -0,0 +1,43 @@ +From 70a7a4bc0dd897c2d271ca4f38bd6505d47cf754 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 26 Jan 2022 04:49:52 +0000 +Subject: arm64: dts: meson-gx: add ATF BL32 reserved-memory region + +From: Christian Hewitt + +[ Upstream commit 76577c9137456febb05b0e17d244113196a98968 ] + +Add an additional reserved memory region for the BL32 trusted firmware +present in many devices that boot from Amlogic vendor u-boot. + +Suggested-by: Mateusz Krzak +Signed-off-by: Christian Hewitt +Reviewed-by: Neil Armstrong +Reviewed-by: Kevin Hilman +Signed-off-by: Neil Armstrong +Link: https://lore.kernel.org/r/20220126044954.19069-2-christianshewitt@gmail.com +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi +index 6b457b2c30a4b..aa14ea017a613 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi +@@ -49,6 +49,12 @@ secmon_reserved_alt: secmon@5000000 { + no-map; + }; + ++ /* 32 MiB reserved for ARM Trusted Firmware (BL32) */ ++ secmon_reserved_bl32: secmon@5300000 { ++ reg = <0x0 0x05300000 0x0 0x2000000>; ++ no-map; ++ }; ++ + linux,cma { + compatible = "shared-dma-pool"; + reusable; +-- +2.34.1 + diff --git a/queue-5.15/ata-libata-core-disable-trim-on-m88v29.patch b/queue-5.15/ata-libata-core-disable-trim-on-m88v29.patch new file mode 100644 index 00000000000..07c85dadb48 --- /dev/null +++ b/queue-5.15/ata-libata-core-disable-trim-on-m88v29.patch @@ -0,0 +1,43 @@ +From 173cf3e85c0dc01dd0d37fc5e00605e39b1debd8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 4 Feb 2022 13:57:50 +0100 +Subject: ata: libata-core: Disable TRIM on M88V29 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Zoltán Böszörményi + +[ Upstream commit c8ea23d5fa59f28302d4e3370c75d9c308e64410 ] + +This device is a CF card, or possibly an SSD in CF form factor. +It supports NCQ and high speed DMA. + +While it also advertises TRIM support, I/O errors are reported +when the discard mount option fstrim is used. TRIM also fails +when disabling NCQ and not just as an NCQ command. + +TRIM must be disabled for this device. + +Signed-off-by: Zoltán Böszörményi +Signed-off-by: Damien Le Moal +Signed-off-by: Sasha Levin +--- + drivers/ata/libata-core.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c +index 4d848cfc406fe..24b67d78cb83d 100644 +--- a/drivers/ata/libata-core.c ++++ b/drivers/ata/libata-core.c +@@ -4014,6 +4014,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { + + /* devices that don't properly handle TRIM commands */ + { "SuperSSpeed S238*", NULL, ATA_HORKAGE_NOTRIM, }, ++ { "M88V29*", NULL, ATA_HORKAGE_NOTRIM, }, + + /* + * As defined, the DRAT (Deterministic Read After Trim) and RZAT +-- +2.34.1 + diff --git a/queue-5.15/ata-libata-core-disable-trim-on-m88v29.patch-8199 b/queue-5.15/ata-libata-core-disable-trim-on-m88v29.patch-8199 new file mode 100644 index 00000000000..07c85dadb48 --- /dev/null +++ b/queue-5.15/ata-libata-core-disable-trim-on-m88v29.patch-8199 @@ -0,0 +1,43 @@ +From 173cf3e85c0dc01dd0d37fc5e00605e39b1debd8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 4 Feb 2022 13:57:50 +0100 +Subject: ata: libata-core: Disable TRIM on M88V29 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Zoltán Böszörményi + +[ Upstream commit c8ea23d5fa59f28302d4e3370c75d9c308e64410 ] + +This device is a CF card, or possibly an SSD in CF form factor. +It supports NCQ and high speed DMA. + +While it also advertises TRIM support, I/O errors are reported +when the discard mount option fstrim is used. TRIM also fails +when disabling NCQ and not just as an NCQ command. + +TRIM must be disabled for this device. + +Signed-off-by: Zoltán Böszörményi +Signed-off-by: Damien Le Moal +Signed-off-by: Sasha Levin +--- + drivers/ata/libata-core.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c +index 4d848cfc406fe..24b67d78cb83d 100644 +--- a/drivers/ata/libata-core.c ++++ b/drivers/ata/libata-core.c +@@ -4014,6 +4014,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { + + /* devices that don't properly handle TRIM commands */ + { "SuperSSpeed S238*", NULL, ATA_HORKAGE_NOTRIM, }, ++ { "M88V29*", NULL, ATA_HORKAGE_NOTRIM, }, + + /* + * As defined, the DRAT (Deterministic Read After Trim) and RZAT +-- +2.34.1 + diff --git a/queue-5.15/display-amd-decrease-message-verbosity-about-waterma.patch b/queue-5.15/display-amd-decrease-message-verbosity-about-waterma.patch new file mode 100644 index 00000000000..d5490399922 --- /dev/null +++ b/queue-5.15/display-amd-decrease-message-verbosity-about-waterma.patch @@ -0,0 +1,43 @@ +From 862cd951ba1818871b05f9c40ee5812502b01396 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 25 Jan 2022 15:49:47 -0600 +Subject: display/amd: decrease message verbosity about watermarks table + failure + +From: Mario Limonciello + +[ Upstream commit 03ad3093c7c069d6ab4403730009ebafeea9ee37 ] + +A number of BIOS versions have a problem with the watermarks table not +being configured properly. This manifests as a very scary looking warning +during resume from s0i3. This should be harmless in most cases and is well +understood, so decrease the assertion to a clearer warning about the problem. + +Reviewed-by: Harry Wentland +Signed-off-by: Mario Limonciello +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c +index 162ae71861247..21d2cbc3cbb20 100644 +--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c ++++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c +@@ -120,7 +120,11 @@ int dcn31_smu_send_msg_with_param( + result = dcn31_smu_wait_for_response(clk_mgr, 10, 200000); + + if (result == VBIOSSMC_Result_Failed) { +- ASSERT(0); ++ if (msg_id == VBIOSSMC_MSG_TransferTableDram2Smu && ++ param == TABLE_WATERMARKS) ++ DC_LOG_WARNING("Watermarks table not configured properly by SMU"); ++ else ++ ASSERT(0); + REG_WRITE(MP1_SMN_C2PMSG_91, VBIOSSMC_Result_OK); + return -1; + } +-- +2.34.1 + diff --git a/queue-5.15/display-amd-decrease-message-verbosity-about-waterma.patch-22723 b/queue-5.15/display-amd-decrease-message-verbosity-about-waterma.patch-22723 new file mode 100644 index 00000000000..d5490399922 --- /dev/null +++ b/queue-5.15/display-amd-decrease-message-verbosity-about-waterma.patch-22723 @@ -0,0 +1,43 @@ +From 862cd951ba1818871b05f9c40ee5812502b01396 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 25 Jan 2022 15:49:47 -0600 +Subject: display/amd: decrease message verbosity about watermarks table + failure + +From: Mario Limonciello + +[ Upstream commit 03ad3093c7c069d6ab4403730009ebafeea9ee37 ] + +A number of BIOS versions have a problem with the watermarks table not +being configured properly. This manifests as a very scary looking warning +during resume from s0i3. This should be harmless in most cases and is well +understood, so decrease the assertion to a clearer warning about the problem. + +Reviewed-by: Harry Wentland +Signed-off-by: Mario Limonciello +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c +index 162ae71861247..21d2cbc3cbb20 100644 +--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c ++++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c +@@ -120,7 +120,11 @@ int dcn31_smu_send_msg_with_param( + result = dcn31_smu_wait_for_response(clk_mgr, 10, 200000); + + if (result == VBIOSSMC_Result_Failed) { +- ASSERT(0); ++ if (msg_id == VBIOSSMC_MSG_TransferTableDram2Smu && ++ param == TABLE_WATERMARKS) ++ DC_LOG_WARNING("Watermarks table not configured properly by SMU"); ++ else ++ ASSERT(0); + REG_WRITE(MP1_SMN_C2PMSG_91, VBIOSSMC_Result_OK); + return -1; + } +-- +2.34.1 + diff --git a/queue-5.15/drm-amd-display-cap-pflip-irqs-per-max-otg-number.patch b/queue-5.15/drm-amd-display-cap-pflip-irqs-per-max-otg-number.patch new file mode 100644 index 00000000000..7de2951cbb6 --- /dev/null +++ b/queue-5.15/drm-amd-display-cap-pflip-irqs-per-max-otg-number.patch @@ -0,0 +1,76 @@ +From 85bf2d8a7751252e1e9fdb6418195a00166bbca2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 2 Feb 2022 14:30:09 -0500 +Subject: drm/amd/display: Cap pflip irqs per max otg number + +From: Roman Li + +[ Upstream commit 328e34a5ad227399391891d454043e5d73e598d2 ] + +[Why] +pflip interrupt order are mapped 1 to 1 to otg id. +e.g. if irq_src=26 corresponds to otg0 then 27->otg1, 28->otg2... + +Linux DM registers pflip interrupts per number of crtcs. +In fused pipe case crtc numbers can be less than otg id. + +e.g. if one pipe out of 3(otg#0-2) is fused adev->mode_info.num_crtc=2 +so DM only registers irq_src 26,27. +This is a bug since if pipe#2 remains unfused DM never gets +otg2 pflip interrupt (irq_src=28) +That may results in gfx failure due to pflip timeout. + +[How] +Register pflip interrupts per max num of otg instead of num_crtc + +Signed-off-by: Roman Li +Reviewed-by: Nicholas Kazlauskas +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +- + drivers/gpu/drm/amd/display/dc/core/dc.c | 2 ++ + drivers/gpu/drm/amd/display/dc/dc.h | 1 + + 3 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +index 16556ae892d4a..5ae9b8133d6da 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -3230,7 +3230,7 @@ static int dcn10_register_irq_handlers(struct amdgpu_device *adev) + + /* Use GRPH_PFLIP interrupt */ + for (i = DCN_1_0__SRCID__HUBP0_FLIP_INTERRUPT; +- i <= DCN_1_0__SRCID__HUBP0_FLIP_INTERRUPT + adev->mode_info.num_crtc - 1; ++ i <= DCN_1_0__SRCID__HUBP0_FLIP_INTERRUPT + dc->caps.max_otg_num - 1; + i++) { + r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_DCE, i, &adev->pageflip_irq); + if (r) { +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c +index 1860ccc3f4f2c..4fae73478840c 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c +@@ -1118,6 +1118,8 @@ struct dc *dc_create(const struct dc_init_data *init_params) + + dc->caps.max_dp_protocol_version = DP_VERSION_1_4; + ++ dc->caps.max_otg_num = dc->res_pool->res_cap->num_timing_generator; ++ + if (dc->res_pool->dmcu != NULL) + dc->versions.dmcu_version = dc->res_pool->dmcu->dmcu_version; + } +diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h +index 3ab52d9a82cf6..e0f58fab5e8ed 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc.h ++++ b/drivers/gpu/drm/amd/display/dc/dc.h +@@ -185,6 +185,7 @@ struct dc_caps { + struct dc_color_caps color; + bool vbios_lttpr_aware; + bool vbios_lttpr_enable; ++ uint32_t max_otg_num; + }; + + struct dc_bug_wa { +-- +2.34.1 + diff --git a/queue-5.15/drm-amd-display-cap-pflip-irqs-per-max-otg-number.patch-25032 b/queue-5.15/drm-amd-display-cap-pflip-irqs-per-max-otg-number.patch-25032 new file mode 100644 index 00000000000..7de2951cbb6 --- /dev/null +++ b/queue-5.15/drm-amd-display-cap-pflip-irqs-per-max-otg-number.patch-25032 @@ -0,0 +1,76 @@ +From 85bf2d8a7751252e1e9fdb6418195a00166bbca2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 2 Feb 2022 14:30:09 -0500 +Subject: drm/amd/display: Cap pflip irqs per max otg number + +From: Roman Li + +[ Upstream commit 328e34a5ad227399391891d454043e5d73e598d2 ] + +[Why] +pflip interrupt order are mapped 1 to 1 to otg id. +e.g. if irq_src=26 corresponds to otg0 then 27->otg1, 28->otg2... + +Linux DM registers pflip interrupts per number of crtcs. +In fused pipe case crtc numbers can be less than otg id. + +e.g. if one pipe out of 3(otg#0-2) is fused adev->mode_info.num_crtc=2 +so DM only registers irq_src 26,27. +This is a bug since if pipe#2 remains unfused DM never gets +otg2 pflip interrupt (irq_src=28) +That may results in gfx failure due to pflip timeout. + +[How] +Register pflip interrupts per max num of otg instead of num_crtc + +Signed-off-by: Roman Li +Reviewed-by: Nicholas Kazlauskas +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +- + drivers/gpu/drm/amd/display/dc/core/dc.c | 2 ++ + drivers/gpu/drm/amd/display/dc/dc.h | 1 + + 3 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +index 16556ae892d4a..5ae9b8133d6da 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -3230,7 +3230,7 @@ static int dcn10_register_irq_handlers(struct amdgpu_device *adev) + + /* Use GRPH_PFLIP interrupt */ + for (i = DCN_1_0__SRCID__HUBP0_FLIP_INTERRUPT; +- i <= DCN_1_0__SRCID__HUBP0_FLIP_INTERRUPT + adev->mode_info.num_crtc - 1; ++ i <= DCN_1_0__SRCID__HUBP0_FLIP_INTERRUPT + dc->caps.max_otg_num - 1; + i++) { + r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_DCE, i, &adev->pageflip_irq); + if (r) { +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c +index 1860ccc3f4f2c..4fae73478840c 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c +@@ -1118,6 +1118,8 @@ struct dc *dc_create(const struct dc_init_data *init_params) + + dc->caps.max_dp_protocol_version = DP_VERSION_1_4; + ++ dc->caps.max_otg_num = dc->res_pool->res_cap->num_timing_generator; ++ + if (dc->res_pool->dmcu != NULL) + dc->versions.dmcu_version = dc->res_pool->dmcu->dmcu_version; + } +diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h +index 3ab52d9a82cf6..e0f58fab5e8ed 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc.h ++++ b/drivers/gpu/drm/amd/display/dc/dc.h +@@ -185,6 +185,7 @@ struct dc_caps { + struct dc_color_caps color; + bool vbios_lttpr_aware; + bool vbios_lttpr_enable; ++ uint32_t max_otg_num; + }; + + struct dc_bug_wa { +-- +2.34.1 + diff --git a/queue-5.15/drm-amd-display-fix-yellow-carp-wm-clamping.patch b/queue-5.15/drm-amd-display-fix-yellow-carp-wm-clamping.patch new file mode 100644 index 00000000000..ae45812395b --- /dev/null +++ b/queue-5.15/drm-amd-display-fix-yellow-carp-wm-clamping.patch @@ -0,0 +1,293 @@ +From 915a3e845bc7d16a8162211564131f0d64e67736 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 27 Jan 2022 11:55:49 -0500 +Subject: drm/amd/display: fix yellow carp wm clamping + +From: Dmytro Laktyushkin + +[ Upstream commit 60fdf98a774eee244a4e00c34a9e7729b61d0f44 ] + +Fix clamping to match register field size + +Reviewed-by: Charlene Liu +Acked-by: Jasdeep Dhillon +Signed-off-by: Dmytro Laktyushkin +Tested-by: Daniel Wheeler +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + .../drm/amd/display/dc/dcn31/dcn31_hubbub.c | 61 ++++++++++--------- + 1 file changed, 32 insertions(+), 29 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubbub.c b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubbub.c +index 90c73a1cb9861..5e3bcaf12cac4 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubbub.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubbub.c +@@ -138,8 +138,11 @@ static uint32_t convert_and_clamp( + ret_val = wm_ns * refclk_mhz; + ret_val /= 1000; + +- if (ret_val > clamp_value) ++ if (ret_val > clamp_value) { ++ /* clamping WMs is abnormal, unexpected and may lead to underflow*/ ++ ASSERT(0); + ret_val = clamp_value; ++ } + + return ret_val; + } +@@ -159,7 +162,7 @@ static bool hubbub31_program_urgent_watermarks( + if (safe_to_lower || watermarks->a.urgent_ns > hubbub2->watermarks.a.urgent_ns) { + hubbub2->watermarks.a.urgent_ns = watermarks->a.urgent_ns; + prog_wm_value = convert_and_clamp(watermarks->a.urgent_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0x3fff); + REG_SET(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, 0, + DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, prog_wm_value); + +@@ -193,7 +196,7 @@ static bool hubbub31_program_urgent_watermarks( + if (safe_to_lower || watermarks->a.urgent_latency_ns > hubbub2->watermarks.a.urgent_latency_ns) { + hubbub2->watermarks.a.urgent_latency_ns = watermarks->a.urgent_latency_ns; + prog_wm_value = convert_and_clamp(watermarks->a.urgent_latency_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0x3fff); + REG_SET(DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_A, 0, + DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_A, prog_wm_value); + } else if (watermarks->a.urgent_latency_ns < hubbub2->watermarks.a.urgent_latency_ns) +@@ -203,7 +206,7 @@ static bool hubbub31_program_urgent_watermarks( + if (safe_to_lower || watermarks->b.urgent_ns > hubbub2->watermarks.b.urgent_ns) { + hubbub2->watermarks.b.urgent_ns = watermarks->b.urgent_ns; + prog_wm_value = convert_and_clamp(watermarks->b.urgent_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0x3fff); + REG_SET(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B, 0, + DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B, prog_wm_value); + +@@ -237,7 +240,7 @@ static bool hubbub31_program_urgent_watermarks( + if (safe_to_lower || watermarks->b.urgent_latency_ns > hubbub2->watermarks.b.urgent_latency_ns) { + hubbub2->watermarks.b.urgent_latency_ns = watermarks->b.urgent_latency_ns; + prog_wm_value = convert_and_clamp(watermarks->b.urgent_latency_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0x3fff); + REG_SET(DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_B, 0, + DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_B, prog_wm_value); + } else if (watermarks->b.urgent_latency_ns < hubbub2->watermarks.b.urgent_latency_ns) +@@ -247,7 +250,7 @@ static bool hubbub31_program_urgent_watermarks( + if (safe_to_lower || watermarks->c.urgent_ns > hubbub2->watermarks.c.urgent_ns) { + hubbub2->watermarks.c.urgent_ns = watermarks->c.urgent_ns; + prog_wm_value = convert_and_clamp(watermarks->c.urgent_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0x3fff); + REG_SET(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C, 0, + DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C, prog_wm_value); + +@@ -281,7 +284,7 @@ static bool hubbub31_program_urgent_watermarks( + if (safe_to_lower || watermarks->c.urgent_latency_ns > hubbub2->watermarks.c.urgent_latency_ns) { + hubbub2->watermarks.c.urgent_latency_ns = watermarks->c.urgent_latency_ns; + prog_wm_value = convert_and_clamp(watermarks->c.urgent_latency_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0x3fff); + REG_SET(DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_C, 0, + DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_C, prog_wm_value); + } else if (watermarks->c.urgent_latency_ns < hubbub2->watermarks.c.urgent_latency_ns) +@@ -291,7 +294,7 @@ static bool hubbub31_program_urgent_watermarks( + if (safe_to_lower || watermarks->d.urgent_ns > hubbub2->watermarks.d.urgent_ns) { + hubbub2->watermarks.d.urgent_ns = watermarks->d.urgent_ns; + prog_wm_value = convert_and_clamp(watermarks->d.urgent_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0x3fff); + REG_SET(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D, 0, + DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D, prog_wm_value); + +@@ -325,7 +328,7 @@ static bool hubbub31_program_urgent_watermarks( + if (safe_to_lower || watermarks->d.urgent_latency_ns > hubbub2->watermarks.d.urgent_latency_ns) { + hubbub2->watermarks.d.urgent_latency_ns = watermarks->d.urgent_latency_ns; + prog_wm_value = convert_and_clamp(watermarks->d.urgent_latency_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0x3fff); + REG_SET(DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_D, 0, + DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_D, prog_wm_value); + } else if (watermarks->d.urgent_latency_ns < hubbub2->watermarks.d.urgent_latency_ns) +@@ -351,7 +354,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns; + prog_wm_value = convert_and_clamp( + watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A, 0, + DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_A calculated =%d\n" +@@ -367,7 +370,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->a.cstate_pstate.cstate_exit_ns; + prog_wm_value = convert_and_clamp( + watermarks->a.cstate_pstate.cstate_exit_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A, 0, + DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_A calculated =%d\n" +@@ -383,7 +386,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->a.cstate_pstate.cstate_enter_plus_exit_z8_ns; + prog_wm_value = convert_and_clamp( + watermarks->a.cstate_pstate.cstate_enter_plus_exit_z8_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_Z8_A, 0, + DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_Z8_A, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_Z8_A calculated =%d\n" +@@ -399,7 +402,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->a.cstate_pstate.cstate_exit_z8_ns; + prog_wm_value = convert_and_clamp( + watermarks->a.cstate_pstate.cstate_exit_z8_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_Z8_A, 0, + DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_Z8_A, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_Z8_A calculated =%d\n" +@@ -416,7 +419,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns; + prog_wm_value = convert_and_clamp( + watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B, 0, + DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_B calculated =%d\n" +@@ -432,7 +435,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->b.cstate_pstate.cstate_exit_ns; + prog_wm_value = convert_and_clamp( + watermarks->b.cstate_pstate.cstate_exit_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B, 0, + DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_B calculated =%d\n" +@@ -448,7 +451,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->b.cstate_pstate.cstate_enter_plus_exit_z8_ns; + prog_wm_value = convert_and_clamp( + watermarks->b.cstate_pstate.cstate_enter_plus_exit_z8_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_Z8_B, 0, + DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_Z8_B, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_Z8_B calculated =%d\n" +@@ -464,7 +467,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->b.cstate_pstate.cstate_exit_z8_ns; + prog_wm_value = convert_and_clamp( + watermarks->b.cstate_pstate.cstate_exit_z8_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_Z8_B, 0, + DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_Z8_B, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_Z8_B calculated =%d\n" +@@ -481,7 +484,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns; + prog_wm_value = convert_and_clamp( + watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C, 0, + DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_C calculated =%d\n" +@@ -497,7 +500,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->c.cstate_pstate.cstate_exit_ns; + prog_wm_value = convert_and_clamp( + watermarks->c.cstate_pstate.cstate_exit_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C, 0, + DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_C calculated =%d\n" +@@ -513,7 +516,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->c.cstate_pstate.cstate_enter_plus_exit_z8_ns; + prog_wm_value = convert_and_clamp( + watermarks->c.cstate_pstate.cstate_enter_plus_exit_z8_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_Z8_C, 0, + DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_Z8_C, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_Z8_C calculated =%d\n" +@@ -529,7 +532,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->c.cstate_pstate.cstate_exit_z8_ns; + prog_wm_value = convert_and_clamp( + watermarks->c.cstate_pstate.cstate_exit_z8_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_Z8_C, 0, + DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_Z8_C, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_Z8_C calculated =%d\n" +@@ -546,7 +549,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns; + prog_wm_value = convert_and_clamp( + watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D, 0, + DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_D calculated =%d\n" +@@ -562,7 +565,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->d.cstate_pstate.cstate_exit_ns; + prog_wm_value = convert_and_clamp( + watermarks->d.cstate_pstate.cstate_exit_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D, 0, + DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_D calculated =%d\n" +@@ -578,7 +581,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->d.cstate_pstate.cstate_enter_plus_exit_z8_ns; + prog_wm_value = convert_and_clamp( + watermarks->d.cstate_pstate.cstate_enter_plus_exit_z8_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_Z8_D, 0, + DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_Z8_D, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_Z8_D calculated =%d\n" +@@ -594,7 +597,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->d.cstate_pstate.cstate_exit_z8_ns; + prog_wm_value = convert_and_clamp( + watermarks->d.cstate_pstate.cstate_exit_z8_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_Z8_D, 0, + DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_Z8_D, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_Z8_D calculated =%d\n" +@@ -625,7 +628,7 @@ static bool hubbub31_program_pstate_watermarks( + watermarks->a.cstate_pstate.pstate_change_ns; + prog_wm_value = convert_and_clamp( + watermarks->a.cstate_pstate.pstate_change_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A, 0, + DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_A calculated =%d\n" +@@ -642,7 +645,7 @@ static bool hubbub31_program_pstate_watermarks( + watermarks->b.cstate_pstate.pstate_change_ns; + prog_wm_value = convert_and_clamp( + watermarks->b.cstate_pstate.pstate_change_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B, 0, + DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_B calculated =%d\n" +@@ -659,7 +662,7 @@ static bool hubbub31_program_pstate_watermarks( + watermarks->c.cstate_pstate.pstate_change_ns; + prog_wm_value = convert_and_clamp( + watermarks->c.cstate_pstate.pstate_change_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C, 0, + DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_C calculated =%d\n" +@@ -676,7 +679,7 @@ static bool hubbub31_program_pstate_watermarks( + watermarks->d.cstate_pstate.pstate_change_ns; + prog_wm_value = convert_and_clamp( + watermarks->d.cstate_pstate.pstate_change_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D, 0, + DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_D calculated =%d\n" +-- +2.34.1 + diff --git a/queue-5.15/drm-amd-display-fix-yellow-carp-wm-clamping.patch-770 b/queue-5.15/drm-amd-display-fix-yellow-carp-wm-clamping.patch-770 new file mode 100644 index 00000000000..ae45812395b --- /dev/null +++ b/queue-5.15/drm-amd-display-fix-yellow-carp-wm-clamping.patch-770 @@ -0,0 +1,293 @@ +From 915a3e845bc7d16a8162211564131f0d64e67736 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 27 Jan 2022 11:55:49 -0500 +Subject: drm/amd/display: fix yellow carp wm clamping + +From: Dmytro Laktyushkin + +[ Upstream commit 60fdf98a774eee244a4e00c34a9e7729b61d0f44 ] + +Fix clamping to match register field size + +Reviewed-by: Charlene Liu +Acked-by: Jasdeep Dhillon +Signed-off-by: Dmytro Laktyushkin +Tested-by: Daniel Wheeler +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + .../drm/amd/display/dc/dcn31/dcn31_hubbub.c | 61 ++++++++++--------- + 1 file changed, 32 insertions(+), 29 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubbub.c b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubbub.c +index 90c73a1cb9861..5e3bcaf12cac4 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubbub.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubbub.c +@@ -138,8 +138,11 @@ static uint32_t convert_and_clamp( + ret_val = wm_ns * refclk_mhz; + ret_val /= 1000; + +- if (ret_val > clamp_value) ++ if (ret_val > clamp_value) { ++ /* clamping WMs is abnormal, unexpected and may lead to underflow*/ ++ ASSERT(0); + ret_val = clamp_value; ++ } + + return ret_val; + } +@@ -159,7 +162,7 @@ static bool hubbub31_program_urgent_watermarks( + if (safe_to_lower || watermarks->a.urgent_ns > hubbub2->watermarks.a.urgent_ns) { + hubbub2->watermarks.a.urgent_ns = watermarks->a.urgent_ns; + prog_wm_value = convert_and_clamp(watermarks->a.urgent_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0x3fff); + REG_SET(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, 0, + DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, prog_wm_value); + +@@ -193,7 +196,7 @@ static bool hubbub31_program_urgent_watermarks( + if (safe_to_lower || watermarks->a.urgent_latency_ns > hubbub2->watermarks.a.urgent_latency_ns) { + hubbub2->watermarks.a.urgent_latency_ns = watermarks->a.urgent_latency_ns; + prog_wm_value = convert_and_clamp(watermarks->a.urgent_latency_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0x3fff); + REG_SET(DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_A, 0, + DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_A, prog_wm_value); + } else if (watermarks->a.urgent_latency_ns < hubbub2->watermarks.a.urgent_latency_ns) +@@ -203,7 +206,7 @@ static bool hubbub31_program_urgent_watermarks( + if (safe_to_lower || watermarks->b.urgent_ns > hubbub2->watermarks.b.urgent_ns) { + hubbub2->watermarks.b.urgent_ns = watermarks->b.urgent_ns; + prog_wm_value = convert_and_clamp(watermarks->b.urgent_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0x3fff); + REG_SET(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B, 0, + DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B, prog_wm_value); + +@@ -237,7 +240,7 @@ static bool hubbub31_program_urgent_watermarks( + if (safe_to_lower || watermarks->b.urgent_latency_ns > hubbub2->watermarks.b.urgent_latency_ns) { + hubbub2->watermarks.b.urgent_latency_ns = watermarks->b.urgent_latency_ns; + prog_wm_value = convert_and_clamp(watermarks->b.urgent_latency_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0x3fff); + REG_SET(DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_B, 0, + DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_B, prog_wm_value); + } else if (watermarks->b.urgent_latency_ns < hubbub2->watermarks.b.urgent_latency_ns) +@@ -247,7 +250,7 @@ static bool hubbub31_program_urgent_watermarks( + if (safe_to_lower || watermarks->c.urgent_ns > hubbub2->watermarks.c.urgent_ns) { + hubbub2->watermarks.c.urgent_ns = watermarks->c.urgent_ns; + prog_wm_value = convert_and_clamp(watermarks->c.urgent_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0x3fff); + REG_SET(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C, 0, + DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C, prog_wm_value); + +@@ -281,7 +284,7 @@ static bool hubbub31_program_urgent_watermarks( + if (safe_to_lower || watermarks->c.urgent_latency_ns > hubbub2->watermarks.c.urgent_latency_ns) { + hubbub2->watermarks.c.urgent_latency_ns = watermarks->c.urgent_latency_ns; + prog_wm_value = convert_and_clamp(watermarks->c.urgent_latency_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0x3fff); + REG_SET(DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_C, 0, + DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_C, prog_wm_value); + } else if (watermarks->c.urgent_latency_ns < hubbub2->watermarks.c.urgent_latency_ns) +@@ -291,7 +294,7 @@ static bool hubbub31_program_urgent_watermarks( + if (safe_to_lower || watermarks->d.urgent_ns > hubbub2->watermarks.d.urgent_ns) { + hubbub2->watermarks.d.urgent_ns = watermarks->d.urgent_ns; + prog_wm_value = convert_and_clamp(watermarks->d.urgent_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0x3fff); + REG_SET(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D, 0, + DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D, prog_wm_value); + +@@ -325,7 +328,7 @@ static bool hubbub31_program_urgent_watermarks( + if (safe_to_lower || watermarks->d.urgent_latency_ns > hubbub2->watermarks.d.urgent_latency_ns) { + hubbub2->watermarks.d.urgent_latency_ns = watermarks->d.urgent_latency_ns; + prog_wm_value = convert_and_clamp(watermarks->d.urgent_latency_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0x3fff); + REG_SET(DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_D, 0, + DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_D, prog_wm_value); + } else if (watermarks->d.urgent_latency_ns < hubbub2->watermarks.d.urgent_latency_ns) +@@ -351,7 +354,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns; + prog_wm_value = convert_and_clamp( + watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A, 0, + DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_A calculated =%d\n" +@@ -367,7 +370,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->a.cstate_pstate.cstate_exit_ns; + prog_wm_value = convert_and_clamp( + watermarks->a.cstate_pstate.cstate_exit_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A, 0, + DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_A calculated =%d\n" +@@ -383,7 +386,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->a.cstate_pstate.cstate_enter_plus_exit_z8_ns; + prog_wm_value = convert_and_clamp( + watermarks->a.cstate_pstate.cstate_enter_plus_exit_z8_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_Z8_A, 0, + DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_Z8_A, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_Z8_A calculated =%d\n" +@@ -399,7 +402,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->a.cstate_pstate.cstate_exit_z8_ns; + prog_wm_value = convert_and_clamp( + watermarks->a.cstate_pstate.cstate_exit_z8_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_Z8_A, 0, + DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_Z8_A, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_Z8_A calculated =%d\n" +@@ -416,7 +419,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns; + prog_wm_value = convert_and_clamp( + watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B, 0, + DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_B calculated =%d\n" +@@ -432,7 +435,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->b.cstate_pstate.cstate_exit_ns; + prog_wm_value = convert_and_clamp( + watermarks->b.cstate_pstate.cstate_exit_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B, 0, + DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_B calculated =%d\n" +@@ -448,7 +451,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->b.cstate_pstate.cstate_enter_plus_exit_z8_ns; + prog_wm_value = convert_and_clamp( + watermarks->b.cstate_pstate.cstate_enter_plus_exit_z8_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_Z8_B, 0, + DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_Z8_B, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_Z8_B calculated =%d\n" +@@ -464,7 +467,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->b.cstate_pstate.cstate_exit_z8_ns; + prog_wm_value = convert_and_clamp( + watermarks->b.cstate_pstate.cstate_exit_z8_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_Z8_B, 0, + DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_Z8_B, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_Z8_B calculated =%d\n" +@@ -481,7 +484,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns; + prog_wm_value = convert_and_clamp( + watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C, 0, + DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_C calculated =%d\n" +@@ -497,7 +500,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->c.cstate_pstate.cstate_exit_ns; + prog_wm_value = convert_and_clamp( + watermarks->c.cstate_pstate.cstate_exit_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C, 0, + DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_C calculated =%d\n" +@@ -513,7 +516,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->c.cstate_pstate.cstate_enter_plus_exit_z8_ns; + prog_wm_value = convert_and_clamp( + watermarks->c.cstate_pstate.cstate_enter_plus_exit_z8_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_Z8_C, 0, + DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_Z8_C, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_Z8_C calculated =%d\n" +@@ -529,7 +532,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->c.cstate_pstate.cstate_exit_z8_ns; + prog_wm_value = convert_and_clamp( + watermarks->c.cstate_pstate.cstate_exit_z8_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_Z8_C, 0, + DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_Z8_C, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_Z8_C calculated =%d\n" +@@ -546,7 +549,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns; + prog_wm_value = convert_and_clamp( + watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D, 0, + DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_D calculated =%d\n" +@@ -562,7 +565,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->d.cstate_pstate.cstate_exit_ns; + prog_wm_value = convert_and_clamp( + watermarks->d.cstate_pstate.cstate_exit_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D, 0, + DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_D calculated =%d\n" +@@ -578,7 +581,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->d.cstate_pstate.cstate_enter_plus_exit_z8_ns; + prog_wm_value = convert_and_clamp( + watermarks->d.cstate_pstate.cstate_enter_plus_exit_z8_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_Z8_D, 0, + DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_Z8_D, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_Z8_D calculated =%d\n" +@@ -594,7 +597,7 @@ static bool hubbub31_program_stutter_watermarks( + watermarks->d.cstate_pstate.cstate_exit_z8_ns; + prog_wm_value = convert_and_clamp( + watermarks->d.cstate_pstate.cstate_exit_z8_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_Z8_D, 0, + DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_Z8_D, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_Z8_D calculated =%d\n" +@@ -625,7 +628,7 @@ static bool hubbub31_program_pstate_watermarks( + watermarks->a.cstate_pstate.pstate_change_ns; + prog_wm_value = convert_and_clamp( + watermarks->a.cstate_pstate.pstate_change_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A, 0, + DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_A calculated =%d\n" +@@ -642,7 +645,7 @@ static bool hubbub31_program_pstate_watermarks( + watermarks->b.cstate_pstate.pstate_change_ns; + prog_wm_value = convert_and_clamp( + watermarks->b.cstate_pstate.pstate_change_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B, 0, + DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_B calculated =%d\n" +@@ -659,7 +662,7 @@ static bool hubbub31_program_pstate_watermarks( + watermarks->c.cstate_pstate.pstate_change_ns; + prog_wm_value = convert_and_clamp( + watermarks->c.cstate_pstate.pstate_change_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C, 0, + DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_C calculated =%d\n" +@@ -676,7 +679,7 @@ static bool hubbub31_program_pstate_watermarks( + watermarks->d.cstate_pstate.pstate_change_ns; + prog_wm_value = convert_and_clamp( + watermarks->d.cstate_pstate.pstate_change_ns, +- refclk_mhz, 0x1fffff); ++ refclk_mhz, 0xffff); + REG_SET(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D, 0, + DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D, prog_wm_value); + DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_D calculated =%d\n" +-- +2.34.1 + diff --git a/queue-5.15/drm-rockchip-dw_hdmi-do-not-leave-clock-enabled-in-e.patch b/queue-5.15/drm-rockchip-dw_hdmi-do-not-leave-clock-enabled-in-e.patch new file mode 100644 index 00000000000..863055b73cd --- /dev/null +++ b/queue-5.15/drm-rockchip-dw_hdmi-do-not-leave-clock-enabled-in-e.patch @@ -0,0 +1,56 @@ +From e4dd9e0661a4f34f06b28beac60cd2ca6bccc0a1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 26 Jan 2022 15:55:24 +0100 +Subject: drm/rockchip: dw_hdmi: Do not leave clock enabled in error case + +From: Sascha Hauer + +[ Upstream commit c0cfbb122275da1b726481de5a8cffeb24e6322b ] + +The driver returns an error when devm_phy_optional_get() fails leaving +the previously enabled clock turned on. Change order and enable the +clock only after the phy has been acquired. + +Signed-off-by: Sascha Hauer +Signed-off-by: Heiko Stuebner +Link: https://patchwork.freedesktop.org/patch/msgid/20220126145549.617165-3-s.hauer@pengutronix.de +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +index 830bdd5e9b7ce..8677c82716784 100644 +--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c ++++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +@@ -529,13 +529,6 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, + return ret; + } + +- ret = clk_prepare_enable(hdmi->vpll_clk); +- if (ret) { +- DRM_DEV_ERROR(hdmi->dev, "Failed to enable HDMI vpll: %d\n", +- ret); +- return ret; +- } +- + hdmi->phy = devm_phy_optional_get(dev, "hdmi"); + if (IS_ERR(hdmi->phy)) { + ret = PTR_ERR(hdmi->phy); +@@ -544,6 +537,13 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, + return ret; + } + ++ ret = clk_prepare_enable(hdmi->vpll_clk); ++ if (ret) { ++ DRM_DEV_ERROR(hdmi->dev, "Failed to enable HDMI vpll: %d\n", ++ ret); ++ return ret; ++ } ++ + drm_encoder_helper_add(encoder, &dw_hdmi_rockchip_encoder_helper_funcs); + drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS); + +-- +2.34.1 + diff --git a/queue-5.15/drm-rockchip-dw_hdmi-do-not-leave-clock-enabled-in-e.patch-32194 b/queue-5.15/drm-rockchip-dw_hdmi-do-not-leave-clock-enabled-in-e.patch-32194 new file mode 100644 index 00000000000..863055b73cd --- /dev/null +++ b/queue-5.15/drm-rockchip-dw_hdmi-do-not-leave-clock-enabled-in-e.patch-32194 @@ -0,0 +1,56 @@ +From e4dd9e0661a4f34f06b28beac60cd2ca6bccc0a1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 26 Jan 2022 15:55:24 +0100 +Subject: drm/rockchip: dw_hdmi: Do not leave clock enabled in error case + +From: Sascha Hauer + +[ Upstream commit c0cfbb122275da1b726481de5a8cffeb24e6322b ] + +The driver returns an error when devm_phy_optional_get() fails leaving +the previously enabled clock turned on. Change order and enable the +clock only after the phy has been acquired. + +Signed-off-by: Sascha Hauer +Signed-off-by: Heiko Stuebner +Link: https://patchwork.freedesktop.org/patch/msgid/20220126145549.617165-3-s.hauer@pengutronix.de +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +index 830bdd5e9b7ce..8677c82716784 100644 +--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c ++++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +@@ -529,13 +529,6 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, + return ret; + } + +- ret = clk_prepare_enable(hdmi->vpll_clk); +- if (ret) { +- DRM_DEV_ERROR(hdmi->dev, "Failed to enable HDMI vpll: %d\n", +- ret); +- return ret; +- } +- + hdmi->phy = devm_phy_optional_get(dev, "hdmi"); + if (IS_ERR(hdmi->phy)) { + ret = PTR_ERR(hdmi->phy); +@@ -544,6 +537,13 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, + return ret; + } + ++ ret = clk_prepare_enable(hdmi->vpll_clk); ++ if (ret) { ++ DRM_DEV_ERROR(hdmi->dev, "Failed to enable HDMI vpll: %d\n", ++ ret); ++ return ret; ++ } ++ + drm_encoder_helper_add(encoder, &dw_hdmi_rockchip_encoder_helper_funcs); + drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS); + +-- +2.34.1 + diff --git a/queue-5.15/irqchip-sifive-plic-add-missing-thead-c900-plic-matc.patch b/queue-5.15/irqchip-sifive-plic-add-missing-thead-c900-plic-matc.patch new file mode 100644 index 00000000000..c6bec883e5c --- /dev/null +++ b/queue-5.15/irqchip-sifive-plic-add-missing-thead-c900-plic-matc.patch @@ -0,0 +1,49 @@ +From f759f0d86d570b917651c247d4e0e871cedc2ba5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 30 Jan 2022 21:56:34 +0800 +Subject: irqchip/sifive-plic: Add missing thead,c900-plic match string + +From: Guo Ren + +[ Upstream commit 1d4df649cbb4b26d19bea38ecff4b65b10a1bbca ] + +The thead,c900-plic has been used in opensbi to distinguish +PLIC [1]. Although PLICs have the same behaviors in Linux, +they are different hardware with some custom initializing in +firmware(opensbi). + +Qute opensbi patch commit-msg by Samuel: + + The T-HEAD PLIC implementation requires setting a delegation bit + to allow access from S-mode. Now that the T-HEAD PLIC has its own + compatible string, set this bit automatically from the PLIC driver, + instead of reaching into the PLIC's MMIO space from another driver. + +[1]: https://github.com/riscv-software-src/opensbi/commit/78c2b19218bd62653b9fb31623a42ced45f38ea6 + +Signed-off-by: Guo Ren +Cc: Anup Patel +Cc: Marc Zyngier +Cc: Palmer Dabbelt +Cc: Samuel Holland +Cc: Thomas Gleixner +Tested-by: Samuel Holland +Signed-off-by: Marc Zyngier +Link: https://lore.kernel.org/r/20220130135634.1213301-3-guoren@kernel.org +Signed-off-by: Sasha Levin +--- + drivers/irqchip/irq-sifive-plic.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c +index 259065d271ef0..09cc98266d30f 100644 +--- a/drivers/irqchip/irq-sifive-plic.c ++++ b/drivers/irqchip/irq-sifive-plic.c +@@ -398,3 +398,4 @@ static int __init plic_init(struct device_node *node, + + IRQCHIP_DECLARE(sifive_plic, "sifive,plic-1.0.0", plic_init); + IRQCHIP_DECLARE(riscv_plic0, "riscv,plic0", plic_init); /* for legacy systems */ ++IRQCHIP_DECLARE(thead_c900_plic, "thead,c900-plic", plic_init); /* for firmware driver */ +-- +2.34.1 + diff --git a/queue-5.15/irqchip-sifive-plic-add-missing-thead-c900-plic-matc.patch-28588 b/queue-5.15/irqchip-sifive-plic-add-missing-thead-c900-plic-matc.patch-28588 new file mode 100644 index 00000000000..c6bec883e5c --- /dev/null +++ b/queue-5.15/irqchip-sifive-plic-add-missing-thead-c900-plic-matc.patch-28588 @@ -0,0 +1,49 @@ +From f759f0d86d570b917651c247d4e0e871cedc2ba5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 30 Jan 2022 21:56:34 +0800 +Subject: irqchip/sifive-plic: Add missing thead,c900-plic match string + +From: Guo Ren + +[ Upstream commit 1d4df649cbb4b26d19bea38ecff4b65b10a1bbca ] + +The thead,c900-plic has been used in opensbi to distinguish +PLIC [1]. Although PLICs have the same behaviors in Linux, +they are different hardware with some custom initializing in +firmware(opensbi). + +Qute opensbi patch commit-msg by Samuel: + + The T-HEAD PLIC implementation requires setting a delegation bit + to allow access from S-mode. Now that the T-HEAD PLIC has its own + compatible string, set this bit automatically from the PLIC driver, + instead of reaching into the PLIC's MMIO space from another driver. + +[1]: https://github.com/riscv-software-src/opensbi/commit/78c2b19218bd62653b9fb31623a42ced45f38ea6 + +Signed-off-by: Guo Ren +Cc: Anup Patel +Cc: Marc Zyngier +Cc: Palmer Dabbelt +Cc: Samuel Holland +Cc: Thomas Gleixner +Tested-by: Samuel Holland +Signed-off-by: Marc Zyngier +Link: https://lore.kernel.org/r/20220130135634.1213301-3-guoren@kernel.org +Signed-off-by: Sasha Levin +--- + drivers/irqchip/irq-sifive-plic.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c +index 259065d271ef0..09cc98266d30f 100644 +--- a/drivers/irqchip/irq-sifive-plic.c ++++ b/drivers/irqchip/irq-sifive-plic.c +@@ -398,3 +398,4 @@ static int __init plic_init(struct device_node *node, + + IRQCHIP_DECLARE(sifive_plic, "sifive,plic-1.0.0", plic_init); + IRQCHIP_DECLARE(riscv_plic0, "riscv,plic0", plic_init); /* for legacy systems */ ++IRQCHIP_DECLARE(thead_c900_plic, "thead,c900-plic", plic_init); /* for firmware driver */ +-- +2.34.1 + diff --git a/queue-5.15/kconfig-fix-failing-to-generate-auto.conf.patch b/queue-5.15/kconfig-fix-failing-to-generate-auto.conf.patch new file mode 100644 index 00000000000..10c78376c47 --- /dev/null +++ b/queue-5.15/kconfig-fix-failing-to-generate-auto.conf.patch @@ -0,0 +1,52 @@ +From 99fd0dbf63f5557c162711c14305b901087efbe4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 11 Feb 2022 17:27:36 +0800 +Subject: kconfig: fix failing to generate auto.conf + +From: Jing Leng + +[ Upstream commit 1b9e740a81f91ae338b29ed70455719804957b80 ] + +When the KCONFIG_AUTOCONFIG is specified (e.g. export \ +KCONFIG_AUTOCONFIG=output/config/auto.conf), the directory of +include/config/ will not be created, so kconfig can't create deps +files in it and auto.conf can't be generated. + +Signed-off-by: Jing Leng +Signed-off-by: Masahiro Yamada +Signed-off-by: Sasha Levin +--- + scripts/kconfig/confdata.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c +index cf72680cd7692..4a828bca071e8 100644 +--- a/scripts/kconfig/confdata.c ++++ b/scripts/kconfig/confdata.c +@@ -983,14 +983,19 @@ static int conf_write_dep(const char *name) + + static int conf_touch_deps(void) + { +- const char *name; ++ const char *name, *tmp; + struct symbol *sym; + int res, i; + +- strcpy(depfile_path, "include/config/"); +- depfile_prefix_len = strlen(depfile_path); +- + name = conf_get_autoconfig_name(); ++ tmp = strrchr(name, '/'); ++ depfile_prefix_len = tmp ? tmp - name + 1 : 0; ++ if (depfile_prefix_len + 1 > sizeof(depfile_path)) ++ return -1; ++ ++ strncpy(depfile_path, name, depfile_prefix_len); ++ depfile_path[depfile_prefix_len] = 0; ++ + conf_read_simple(name, S_DEF_AUTO); + sym_calc_value(modules_sym); + +-- +2.34.1 + diff --git a/queue-5.15/kconfig-fix-failing-to-generate-auto.conf.patch-10122 b/queue-5.15/kconfig-fix-failing-to-generate-auto.conf.patch-10122 new file mode 100644 index 00000000000..10c78376c47 --- /dev/null +++ b/queue-5.15/kconfig-fix-failing-to-generate-auto.conf.patch-10122 @@ -0,0 +1,52 @@ +From 99fd0dbf63f5557c162711c14305b901087efbe4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 11 Feb 2022 17:27:36 +0800 +Subject: kconfig: fix failing to generate auto.conf + +From: Jing Leng + +[ Upstream commit 1b9e740a81f91ae338b29ed70455719804957b80 ] + +When the KCONFIG_AUTOCONFIG is specified (e.g. export \ +KCONFIG_AUTOCONFIG=output/config/auto.conf), the directory of +include/config/ will not be created, so kconfig can't create deps +files in it and auto.conf can't be generated. + +Signed-off-by: Jing Leng +Signed-off-by: Masahiro Yamada +Signed-off-by: Sasha Levin +--- + scripts/kconfig/confdata.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c +index cf72680cd7692..4a828bca071e8 100644 +--- a/scripts/kconfig/confdata.c ++++ b/scripts/kconfig/confdata.c +@@ -983,14 +983,19 @@ static int conf_write_dep(const char *name) + + static int conf_touch_deps(void) + { +- const char *name; ++ const char *name, *tmp; + struct symbol *sym; + int res, i; + +- strcpy(depfile_path, "include/config/"); +- depfile_prefix_len = strlen(depfile_path); +- + name = conf_get_autoconfig_name(); ++ tmp = strrchr(name, '/'); ++ depfile_prefix_len = tmp ? tmp - name + 1 : 0; ++ if (depfile_prefix_len + 1 > sizeof(depfile_path)) ++ return -1; ++ ++ strncpy(depfile_path, name, depfile_prefix_len); ++ depfile_path[depfile_prefix_len] = 0; ++ + conf_read_simple(name, S_DEF_AUTO); + sym_calc_value(modules_sym); + +-- +2.34.1 + diff --git a/queue-5.15/kconfig-let-shell-return-enough-output-for-deep-path.patch b/queue-5.15/kconfig-let-shell-return-enough-output-for-deep-path.patch new file mode 100644 index 00000000000..57ad63a7583 --- /dev/null +++ b/queue-5.15/kconfig-let-shell-return-enough-output-for-deep-path.patch @@ -0,0 +1,43 @@ +From dd44d6ad2828601ada540c0fe887cb3996700633 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 28 Jan 2022 16:01:28 -0600 +Subject: kconfig: let 'shell' return enough output for deep path names + +From: Brenda Streiff + +[ Upstream commit 8a4c5b2a6d8ea079fa36034e8167de87ab6f8880 ] + +The 'shell' built-in only returns the first 256 bytes of the command's +output. In some cases, 'shell' is used to return a path; by bumping up +the buffer size to 4096 this lets us capture up to PATH_MAX. + +The specific case where I ran into this was due to commit 1e860048c53e +("gcc-plugins: simplify GCC plugin-dev capability test"). After this +change, we now use `$(shell,$(CC) -print-file-name=plugin)` to return +a path; if the gcc path is particularly long, then the path ends up +truncated at the 256 byte mark, which makes the HAVE_GCC_PLUGINS +depends test always fail. + +Signed-off-by: Brenda Streiff +Signed-off-by: Masahiro Yamada +Signed-off-by: Sasha Levin +--- + scripts/kconfig/preprocess.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/scripts/kconfig/preprocess.c b/scripts/kconfig/preprocess.c +index 0590f86df6e40..748da578b418c 100644 +--- a/scripts/kconfig/preprocess.c ++++ b/scripts/kconfig/preprocess.c +@@ -141,7 +141,7 @@ static char *do_lineno(int argc, char *argv[]) + static char *do_shell(int argc, char *argv[]) + { + FILE *p; +- char buf[256]; ++ char buf[4096]; + char *cmd; + size_t nread; + int i; +-- +2.34.1 + diff --git a/queue-5.15/kconfig-let-shell-return-enough-output-for-deep-path.patch-7959 b/queue-5.15/kconfig-let-shell-return-enough-output-for-deep-path.patch-7959 new file mode 100644 index 00000000000..57ad63a7583 --- /dev/null +++ b/queue-5.15/kconfig-let-shell-return-enough-output-for-deep-path.patch-7959 @@ -0,0 +1,43 @@ +From dd44d6ad2828601ada540c0fe887cb3996700633 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 28 Jan 2022 16:01:28 -0600 +Subject: kconfig: let 'shell' return enough output for deep path names + +From: Brenda Streiff + +[ Upstream commit 8a4c5b2a6d8ea079fa36034e8167de87ab6f8880 ] + +The 'shell' built-in only returns the first 256 bytes of the command's +output. In some cases, 'shell' is used to return a path; by bumping up +the buffer size to 4096 this lets us capture up to PATH_MAX. + +The specific case where I ran into this was due to commit 1e860048c53e +("gcc-plugins: simplify GCC plugin-dev capability test"). After this +change, we now use `$(shell,$(CC) -print-file-name=plugin)` to return +a path; if the gcc path is particularly long, then the path ends up +truncated at the 256 byte mark, which makes the HAVE_GCC_PLUGINS +depends test always fail. + +Signed-off-by: Brenda Streiff +Signed-off-by: Masahiro Yamada +Signed-off-by: Sasha Levin +--- + scripts/kconfig/preprocess.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/scripts/kconfig/preprocess.c b/scripts/kconfig/preprocess.c +index 0590f86df6e40..748da578b418c 100644 +--- a/scripts/kconfig/preprocess.c ++++ b/scripts/kconfig/preprocess.c +@@ -141,7 +141,7 @@ static char *do_lineno(int argc, char *argv[]) + static char *do_shell(int argc, char *argv[]) + { + FILE *p; +- char buf[256]; ++ char buf[4096]; + char *cmd; + size_t nread; + int i; +-- +2.34.1 + diff --git a/queue-5.15/ksmbd-don-t-align-last-entry-offset-in-smb2-query-di.patch b/queue-5.15/ksmbd-don-t-align-last-entry-offset-in-smb2-query-di.patch new file mode 100644 index 00000000000..fbe3f41bb81 --- /dev/null +++ b/queue-5.15/ksmbd-don-t-align-last-entry-offset-in-smb2-query-di.patch @@ -0,0 +1,61 @@ +From 2e890949b1d9a114ee0ffe6eb01e72632d884f88 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 30 Jan 2022 18:31:01 +0900 +Subject: ksmbd: don't align last entry offset in smb2 query directory + +From: Namjae Jeon + +[ Upstream commit 04e260948a160d3b7d622bf4c8a96fa4577c09bd ] + +When checking smb2 query directory packets from other servers, +OutputBufferLength is different with ksmbd. Other servers add an unaligned +next offset to OutputBufferLength for the last entry. + +Signed-off-by: Namjae Jeon +Signed-off-by: Steve French +Signed-off-by: Sasha Levin +--- + fs/ksmbd/smb2pdu.c | 7 ++++--- + fs/ksmbd/vfs.h | 1 + + 2 files changed, 5 insertions(+), 3 deletions(-) + +diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c +index 70685cbbec8c0..192d8308afc27 100644 +--- a/fs/ksmbd/smb2pdu.c ++++ b/fs/ksmbd/smb2pdu.c +@@ -3422,9 +3422,9 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level, + goto free_conv_name; + } + +- struct_sz = readdir_info_level_struct_sz(info_level); +- next_entry_offset = ALIGN(struct_sz - 1 + conv_len, +- KSMBD_DIR_INFO_ALIGNMENT); ++ struct_sz = readdir_info_level_struct_sz(info_level) - 1 + conv_len; ++ next_entry_offset = ALIGN(struct_sz, KSMBD_DIR_INFO_ALIGNMENT); ++ d_info->last_entry_off_align = next_entry_offset - struct_sz; + + if (next_entry_offset > d_info->out_buf_len) { + d_info->out_buf_len = 0; +@@ -3976,6 +3976,7 @@ int smb2_query_dir(struct ksmbd_work *work) + ((struct file_directory_info *) + ((char *)rsp->Buffer + d_info.last_entry_offset)) + ->NextEntryOffset = 0; ++ d_info.data_count -= d_info.last_entry_off_align; + + rsp->StructureSize = cpu_to_le16(9); + rsp->OutputBufferOffset = cpu_to_le16(72); +diff --git a/fs/ksmbd/vfs.h b/fs/ksmbd/vfs.h +index b0d5b8feb4a36..432c947731779 100644 +--- a/fs/ksmbd/vfs.h ++++ b/fs/ksmbd/vfs.h +@@ -86,6 +86,7 @@ struct ksmbd_dir_info { + int last_entry_offset; + bool hide_dot_file; + int flags; ++ int last_entry_off_align; + }; + + struct ksmbd_readdir_data { +-- +2.34.1 + diff --git a/queue-5.15/ksmbd-don-t-align-last-entry-offset-in-smb2-query-di.patch-16657 b/queue-5.15/ksmbd-don-t-align-last-entry-offset-in-smb2-query-di.patch-16657 new file mode 100644 index 00000000000..fbe3f41bb81 --- /dev/null +++ b/queue-5.15/ksmbd-don-t-align-last-entry-offset-in-smb2-query-di.patch-16657 @@ -0,0 +1,61 @@ +From 2e890949b1d9a114ee0ffe6eb01e72632d884f88 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 30 Jan 2022 18:31:01 +0900 +Subject: ksmbd: don't align last entry offset in smb2 query directory + +From: Namjae Jeon + +[ Upstream commit 04e260948a160d3b7d622bf4c8a96fa4577c09bd ] + +When checking smb2 query directory packets from other servers, +OutputBufferLength is different with ksmbd. Other servers add an unaligned +next offset to OutputBufferLength for the last entry. + +Signed-off-by: Namjae Jeon +Signed-off-by: Steve French +Signed-off-by: Sasha Levin +--- + fs/ksmbd/smb2pdu.c | 7 ++++--- + fs/ksmbd/vfs.h | 1 + + 2 files changed, 5 insertions(+), 3 deletions(-) + +diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c +index 70685cbbec8c0..192d8308afc27 100644 +--- a/fs/ksmbd/smb2pdu.c ++++ b/fs/ksmbd/smb2pdu.c +@@ -3422,9 +3422,9 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level, + goto free_conv_name; + } + +- struct_sz = readdir_info_level_struct_sz(info_level); +- next_entry_offset = ALIGN(struct_sz - 1 + conv_len, +- KSMBD_DIR_INFO_ALIGNMENT); ++ struct_sz = readdir_info_level_struct_sz(info_level) - 1 + conv_len; ++ next_entry_offset = ALIGN(struct_sz, KSMBD_DIR_INFO_ALIGNMENT); ++ d_info->last_entry_off_align = next_entry_offset - struct_sz; + + if (next_entry_offset > d_info->out_buf_len) { + d_info->out_buf_len = 0; +@@ -3976,6 +3976,7 @@ int smb2_query_dir(struct ksmbd_work *work) + ((struct file_directory_info *) + ((char *)rsp->Buffer + d_info.last_entry_offset)) + ->NextEntryOffset = 0; ++ d_info.data_count -= d_info.last_entry_off_align; + + rsp->StructureSize = cpu_to_le16(9); + rsp->OutputBufferOffset = cpu_to_le16(72); +diff --git a/fs/ksmbd/vfs.h b/fs/ksmbd/vfs.h +index b0d5b8feb4a36..432c947731779 100644 +--- a/fs/ksmbd/vfs.h ++++ b/fs/ksmbd/vfs.h +@@ -86,6 +86,7 @@ struct ksmbd_dir_info { + int last_entry_offset; + bool hide_dot_file; + int flags; ++ int last_entry_off_align; + }; + + struct ksmbd_readdir_data { +-- +2.34.1 + diff --git a/queue-5.15/ksmbd-fix-same-uniqueid-for-dot-and-dotdot-entries.patch b/queue-5.15/ksmbd-fix-same-uniqueid-for-dot-and-dotdot-entries.patch new file mode 100644 index 00000000000..51ed5a503da --- /dev/null +++ b/queue-5.15/ksmbd-fix-same-uniqueid-for-dot-and-dotdot-entries.patch @@ -0,0 +1,54 @@ +From 60e3fe1f9a3d9d1d9cf1760087d25ac7d1c23f08 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 30 Jan 2022 18:28:56 +0900 +Subject: ksmbd: fix same UniqueId for dot and dotdot entries + +From: Namjae Jeon + +[ Upstream commit 97550c7478a2da93e348d8c3075d92cddd473a78 ] + +ksmbd sets the inode number to UniqueId. However, the same UniqueId for +dot and dotdot entry is set to the inode number of the parent inode. +This patch set them using the current inode and parent inode. + +Signed-off-by: Namjae Jeon +Signed-off-by: Steve French +Signed-off-by: Sasha Levin +--- + fs/ksmbd/smb_common.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/fs/ksmbd/smb_common.c b/fs/ksmbd/smb_common.c +index 707490ab1f4c4..f2e7e3a654b34 100644 +--- a/fs/ksmbd/smb_common.c ++++ b/fs/ksmbd/smb_common.c +@@ -308,14 +308,17 @@ int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work, int info_level, + for (i = 0; i < 2; i++) { + struct kstat kstat; + struct ksmbd_kstat ksmbd_kstat; ++ struct dentry *dentry; + + if (!dir->dot_dotdot[i]) { /* fill dot entry info */ + if (i == 0) { + d_info->name = "."; + d_info->name_len = 1; ++ dentry = dir->filp->f_path.dentry; + } else { + d_info->name = ".."; + d_info->name_len = 2; ++ dentry = dir->filp->f_path.dentry->d_parent; + } + + if (!match_pattern(d_info->name, d_info->name_len, +@@ -327,7 +330,7 @@ int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work, int info_level, + ksmbd_kstat.kstat = &kstat; + ksmbd_vfs_fill_dentry_attrs(work, + user_ns, +- dir->filp->f_path.dentry->d_parent, ++ dentry, + &ksmbd_kstat); + rc = fn(conn, info_level, d_info, &ksmbd_kstat); + if (rc) +-- +2.34.1 + diff --git a/queue-5.15/ksmbd-fix-same-uniqueid-for-dot-and-dotdot-entries.patch-6367 b/queue-5.15/ksmbd-fix-same-uniqueid-for-dot-and-dotdot-entries.patch-6367 new file mode 100644 index 00000000000..51ed5a503da --- /dev/null +++ b/queue-5.15/ksmbd-fix-same-uniqueid-for-dot-and-dotdot-entries.patch-6367 @@ -0,0 +1,54 @@ +From 60e3fe1f9a3d9d1d9cf1760087d25ac7d1c23f08 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 30 Jan 2022 18:28:56 +0900 +Subject: ksmbd: fix same UniqueId for dot and dotdot entries + +From: Namjae Jeon + +[ Upstream commit 97550c7478a2da93e348d8c3075d92cddd473a78 ] + +ksmbd sets the inode number to UniqueId. However, the same UniqueId for +dot and dotdot entry is set to the inode number of the parent inode. +This patch set them using the current inode and parent inode. + +Signed-off-by: Namjae Jeon +Signed-off-by: Steve French +Signed-off-by: Sasha Levin +--- + fs/ksmbd/smb_common.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/fs/ksmbd/smb_common.c b/fs/ksmbd/smb_common.c +index 707490ab1f4c4..f2e7e3a654b34 100644 +--- a/fs/ksmbd/smb_common.c ++++ b/fs/ksmbd/smb_common.c +@@ -308,14 +308,17 @@ int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work, int info_level, + for (i = 0; i < 2; i++) { + struct kstat kstat; + struct ksmbd_kstat ksmbd_kstat; ++ struct dentry *dentry; + + if (!dir->dot_dotdot[i]) { /* fill dot entry info */ + if (i == 0) { + d_info->name = "."; + d_info->name_len = 1; ++ dentry = dir->filp->f_path.dentry; + } else { + d_info->name = ".."; + d_info->name_len = 2; ++ dentry = dir->filp->f_path.dentry->d_parent; + } + + if (!match_pattern(d_info->name, d_info->name_len, +@@ -327,7 +330,7 @@ int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work, int info_level, + ksmbd_kstat.kstat = &kstat; + ksmbd_vfs_fill_dentry_attrs(work, + user_ns, +- dir->filp->f_path.dentry->d_parent, ++ dentry, + &ksmbd_kstat); + rc = fn(conn, info_level, d_info, &ksmbd_kstat); + if (rc) +-- +2.34.1 + diff --git a/queue-5.15/mm-io_uring-allow-oom-killer-from-io_uring_setup.patch b/queue-5.15/mm-io_uring-allow-oom-killer-from-io_uring_setup.patch new file mode 100644 index 00000000000..d3c2dd69956 --- /dev/null +++ b/queue-5.15/mm-io_uring-allow-oom-killer-from-io_uring_setup.patch @@ -0,0 +1,45 @@ +From 11c1c155d3ea13ad53e4437c65805737dccbf065 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 24 Jan 2022 21:17:36 -0800 +Subject: mm: io_uring: allow oom-killer from io_uring_setup + +From: Shakeel Butt + +[ Upstream commit 0a3f1e0beacf6cc8ae5f846b0641c1df476e83d6 ] + +On an overcommitted system which is running multiple workloads of +varying priorities, it is preferred to trigger an oom-killer to kill a +low priority workload than to let the high priority workload receiving +ENOMEMs. On our memory overcommitted systems, we are seeing a lot of +ENOMEMs instead of oom-kills because io_uring_setup callchain is using +__GFP_NORETRY gfp flag which avoids the oom-killer. Let's remove it and +allow the oom-killer to kill a lower priority job. + +Signed-off-by: Shakeel Butt +Link: https://lore.kernel.org/r/20220125051736.2981459-1-shakeelb@google.com +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + fs/io_uring.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/fs/io_uring.c b/fs/io_uring.c +index 993913c585fbf..21fc8ce9405d3 100644 +--- a/fs/io_uring.c ++++ b/fs/io_uring.c +@@ -8820,10 +8820,9 @@ static void io_mem_free(void *ptr) + + static void *io_mem_alloc(size_t size) + { +- gfp_t gfp_flags = GFP_KERNEL | __GFP_ZERO | __GFP_NOWARN | __GFP_COMP | +- __GFP_NORETRY | __GFP_ACCOUNT; ++ gfp_t gfp = GFP_KERNEL_ACCOUNT | __GFP_ZERO | __GFP_NOWARN | __GFP_COMP; + +- return (void *) __get_free_pages(gfp_flags, get_order(size)); ++ return (void *) __get_free_pages(gfp, get_order(size)); + } + + static unsigned long rings_size(unsigned sq_entries, unsigned cq_entries, +-- +2.34.1 + diff --git a/queue-5.15/mm-io_uring-allow-oom-killer-from-io_uring_setup.patch-29651 b/queue-5.15/mm-io_uring-allow-oom-killer-from-io_uring_setup.patch-29651 new file mode 100644 index 00000000000..d3c2dd69956 --- /dev/null +++ b/queue-5.15/mm-io_uring-allow-oom-killer-from-io_uring_setup.patch-29651 @@ -0,0 +1,45 @@ +From 11c1c155d3ea13ad53e4437c65805737dccbf065 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 24 Jan 2022 21:17:36 -0800 +Subject: mm: io_uring: allow oom-killer from io_uring_setup + +From: Shakeel Butt + +[ Upstream commit 0a3f1e0beacf6cc8ae5f846b0641c1df476e83d6 ] + +On an overcommitted system which is running multiple workloads of +varying priorities, it is preferred to trigger an oom-killer to kill a +low priority workload than to let the high priority workload receiving +ENOMEMs. On our memory overcommitted systems, we are seeing a lot of +ENOMEMs instead of oom-kills because io_uring_setup callchain is using +__GFP_NORETRY gfp flag which avoids the oom-killer. Let's remove it and +allow the oom-killer to kill a lower priority job. + +Signed-off-by: Shakeel Butt +Link: https://lore.kernel.org/r/20220125051736.2981459-1-shakeelb@google.com +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + fs/io_uring.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/fs/io_uring.c b/fs/io_uring.c +index 993913c585fbf..21fc8ce9405d3 100644 +--- a/fs/io_uring.c ++++ b/fs/io_uring.c +@@ -8820,10 +8820,9 @@ static void io_mem_free(void *ptr) + + static void *io_mem_alloc(size_t size) + { +- gfp_t gfp_flags = GFP_KERNEL | __GFP_ZERO | __GFP_NOWARN | __GFP_COMP | +- __GFP_NORETRY | __GFP_ACCOUNT; ++ gfp_t gfp = GFP_KERNEL_ACCOUNT | __GFP_ZERO | __GFP_NOWARN | __GFP_COMP; + +- return (void *) __get_free_pages(gfp_flags, get_order(size)); ++ return (void *) __get_free_pages(gfp, get_order(size)); + } + + static unsigned long rings_size(unsigned sq_entries, unsigned cq_entries, +-- +2.34.1 + diff --git a/queue-5.15/net-macb-align-the-dma-and-coherent-dma-masks.patch b/queue-5.15/net-macb-align-the-dma-and-coherent-dma-masks.patch new file mode 100644 index 00000000000..87c634e4bae --- /dev/null +++ b/queue-5.15/net-macb-align-the-dma-and-coherent-dma-masks.patch @@ -0,0 +1,51 @@ +From 59867b04c33a8a42d5e92ce048bf81c236473648 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Feb 2022 15:13:25 +0530 +Subject: net: macb: Align the dma and coherent dma masks + +From: Marc St-Amand + +[ Upstream commit 37f7860602b5b2d99fc7465f6407f403f5941988 ] + +Single page and coherent memory blocks can use different DMA masks +when the macb accesses physical memory directly. The kernel is clever +enough to allocate pages that fit into the requested address width. + +When using the ARM SMMU, the DMA mask must be the same for single +pages and big coherent memory blocks. Otherwise the translation +tables turn into one big mess. + + [ 74.959909] macb ff0e0000.ethernet eth0: DMA bus error: HRESP not OK + [ 74.959989] arm-smmu fd800000.smmu: Unhandled context fault: fsr=0x402, iova=0x3165687460, fsynr=0x20001, cbfrsynra=0x877, cb=1 + [ 75.173939] macb ff0e0000.ethernet eth0: DMA bus error: HRESP not OK + [ 75.173955] arm-smmu fd800000.smmu: Unhandled context fault: fsr=0x402, iova=0x3165687460, fsynr=0x20001, cbfrsynra=0x877, cb=1 + +Since using the same DMA mask does not hurt direct 1:1 physical +memory mappings, this commit always aligns DMA and coherent masks. + +Signed-off-by: Marc St-Amand +Signed-off-by: Harini Katakam +Acked-by: Nicolas Ferre +Tested-by: Conor Dooley +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/cadence/macb_main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c +index d13fb1d318215..d71c11a6282ec 100644 +--- a/drivers/net/ethernet/cadence/macb_main.c ++++ b/drivers/net/ethernet/cadence/macb_main.c +@@ -4739,7 +4739,7 @@ static int macb_probe(struct platform_device *pdev) + + #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT + if (GEM_BFEXT(DAW64, gem_readl(bp, DCFG6))) { +- dma_set_mask(&pdev->dev, DMA_BIT_MASK(44)); ++ dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(44)); + bp->hw_dma_cap |= HW_DMA_CAP_64B; + } + #endif +-- +2.34.1 + diff --git a/queue-5.15/net-macb-align-the-dma-and-coherent-dma-masks.patch-20972 b/queue-5.15/net-macb-align-the-dma-and-coherent-dma-masks.patch-20972 new file mode 100644 index 00000000000..87c634e4bae --- /dev/null +++ b/queue-5.15/net-macb-align-the-dma-and-coherent-dma-masks.patch-20972 @@ -0,0 +1,51 @@ +From 59867b04c33a8a42d5e92ce048bf81c236473648 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Feb 2022 15:13:25 +0530 +Subject: net: macb: Align the dma and coherent dma masks + +From: Marc St-Amand + +[ Upstream commit 37f7860602b5b2d99fc7465f6407f403f5941988 ] + +Single page and coherent memory blocks can use different DMA masks +when the macb accesses physical memory directly. The kernel is clever +enough to allocate pages that fit into the requested address width. + +When using the ARM SMMU, the DMA mask must be the same for single +pages and big coherent memory blocks. Otherwise the translation +tables turn into one big mess. + + [ 74.959909] macb ff0e0000.ethernet eth0: DMA bus error: HRESP not OK + [ 74.959989] arm-smmu fd800000.smmu: Unhandled context fault: fsr=0x402, iova=0x3165687460, fsynr=0x20001, cbfrsynra=0x877, cb=1 + [ 75.173939] macb ff0e0000.ethernet eth0: DMA bus error: HRESP not OK + [ 75.173955] arm-smmu fd800000.smmu: Unhandled context fault: fsr=0x402, iova=0x3165687460, fsynr=0x20001, cbfrsynra=0x877, cb=1 + +Since using the same DMA mask does not hurt direct 1:1 physical +memory mappings, this commit always aligns DMA and coherent masks. + +Signed-off-by: Marc St-Amand +Signed-off-by: Harini Katakam +Acked-by: Nicolas Ferre +Tested-by: Conor Dooley +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/cadence/macb_main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c +index d13fb1d318215..d71c11a6282ec 100644 +--- a/drivers/net/ethernet/cadence/macb_main.c ++++ b/drivers/net/ethernet/cadence/macb_main.c +@@ -4739,7 +4739,7 @@ static int macb_probe(struct platform_device *pdev) + + #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT + if (GEM_BFEXT(DAW64, gem_readl(bp, DCFG6))) { +- dma_set_mask(&pdev->dev, DMA_BIT_MASK(44)); ++ dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(44)); + bp->hw_dma_cap |= HW_DMA_CAP_64B; + } + #endif +-- +2.34.1 + diff --git a/queue-5.15/net-usb-qmi_wwan-add-support-for-dell-dw5829e.patch b/queue-5.15/net-usb-qmi_wwan-add-support-for-dell-dw5829e.patch new file mode 100644 index 00000000000..648e2460f77 --- /dev/null +++ b/queue-5.15/net-usb-qmi_wwan-add-support-for-dell-dw5829e.patch @@ -0,0 +1,70 @@ +From 31fac11451e1980637cb9ee01d88bc30bdf257f8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Feb 2022 10:47:17 +0800 +Subject: net: usb: qmi_wwan: Add support for Dell DW5829e +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Slark Xiao + +[ Upstream commit 8ecbb179286cbc91810c16caeb3396e06305cd0c ] + +Dell DW5829e same as DW5821e except the CAT level. +DW5821e supports CAT16 but DW5829e supports CAT9. +Also, DW5829e includes normal and eSIM type. +Please see below test evidence: + +T: Bus=04 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 5 Spd=5000 MxCh= 0 +D: Ver= 3.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS= 9 #Cfgs= 1 +P: Vendor=413c ProdID=81e6 Rev=03.18 +S: Manufacturer=Dell Inc. +S: Product=DW5829e Snapdragon X20 LTE +S: SerialNumber=0123456789ABCDEF +C: #Ifs= 6 Cfg#= 1 Atr=a0 MxPwr=896mA +I: If#=0x0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan +I: If#=0x1 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid +I: If#=0x2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option +I: If#=0x3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option +I: If#=0x4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option +I: If#=0x5 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option + +T: Bus=04 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 7 Spd=5000 MxCh= 0 +D: Ver= 3.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS= 9 #Cfgs= 1 +P: Vendor=413c ProdID=81e4 Rev=03.18 +S: Manufacturer=Dell Inc. +S: Product=DW5829e-eSIM Snapdragon X20 LTE +S: SerialNumber=0123456789ABCDEF +C: #Ifs= 6 Cfg#= 1 Atr=a0 MxPwr=896mA +I: If#=0x0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan +I: If#=0x1 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid +I: If#=0x2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option +I: If#=0x3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option +I: If#=0x4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option +I: If#=0x5 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option + +Signed-off-by: Slark Xiao +Acked-by: Bjørn Mork +Link: https://lore.kernel.org/r/20220209024717.8564-1-slark_xiao@163.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/usb/qmi_wwan.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c +index 33ada2c59952e..0c7f02ca6822b 100644 +--- a/drivers/net/usb/qmi_wwan.c ++++ b/drivers/net/usb/qmi_wwan.c +@@ -1395,6 +1395,8 @@ static const struct usb_device_id products[] = { + {QMI_FIXED_INTF(0x413c, 0x81d7, 0)}, /* Dell Wireless 5821e */ + {QMI_FIXED_INTF(0x413c, 0x81d7, 1)}, /* Dell Wireless 5821e preproduction config */ + {QMI_FIXED_INTF(0x413c, 0x81e0, 0)}, /* Dell Wireless 5821e with eSIM support*/ ++ {QMI_FIXED_INTF(0x413c, 0x81e4, 0)}, /* Dell Wireless 5829e with eSIM support*/ ++ {QMI_FIXED_INTF(0x413c, 0x81e6, 0)}, /* Dell Wireless 5829e */ + {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ + {QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */ + {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */ +-- +2.34.1 + diff --git a/queue-5.15/net-usb-qmi_wwan-add-support-for-dell-dw5829e.patch-9978 b/queue-5.15/net-usb-qmi_wwan-add-support-for-dell-dw5829e.patch-9978 new file mode 100644 index 00000000000..648e2460f77 --- /dev/null +++ b/queue-5.15/net-usb-qmi_wwan-add-support-for-dell-dw5829e.patch-9978 @@ -0,0 +1,70 @@ +From 31fac11451e1980637cb9ee01d88bc30bdf257f8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Feb 2022 10:47:17 +0800 +Subject: net: usb: qmi_wwan: Add support for Dell DW5829e +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Slark Xiao + +[ Upstream commit 8ecbb179286cbc91810c16caeb3396e06305cd0c ] + +Dell DW5829e same as DW5821e except the CAT level. +DW5821e supports CAT16 but DW5829e supports CAT9. +Also, DW5829e includes normal and eSIM type. +Please see below test evidence: + +T: Bus=04 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 5 Spd=5000 MxCh= 0 +D: Ver= 3.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS= 9 #Cfgs= 1 +P: Vendor=413c ProdID=81e6 Rev=03.18 +S: Manufacturer=Dell Inc. +S: Product=DW5829e Snapdragon X20 LTE +S: SerialNumber=0123456789ABCDEF +C: #Ifs= 6 Cfg#= 1 Atr=a0 MxPwr=896mA +I: If#=0x0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan +I: If#=0x1 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid +I: If#=0x2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option +I: If#=0x3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option +I: If#=0x4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option +I: If#=0x5 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option + +T: Bus=04 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 7 Spd=5000 MxCh= 0 +D: Ver= 3.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS= 9 #Cfgs= 1 +P: Vendor=413c ProdID=81e4 Rev=03.18 +S: Manufacturer=Dell Inc. +S: Product=DW5829e-eSIM Snapdragon X20 LTE +S: SerialNumber=0123456789ABCDEF +C: #Ifs= 6 Cfg#= 1 Atr=a0 MxPwr=896mA +I: If#=0x0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan +I: If#=0x1 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid +I: If#=0x2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option +I: If#=0x3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option +I: If#=0x4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option +I: If#=0x5 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option + +Signed-off-by: Slark Xiao +Acked-by: Bjørn Mork +Link: https://lore.kernel.org/r/20220209024717.8564-1-slark_xiao@163.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/usb/qmi_wwan.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c +index 33ada2c59952e..0c7f02ca6822b 100644 +--- a/drivers/net/usb/qmi_wwan.c ++++ b/drivers/net/usb/qmi_wwan.c +@@ -1395,6 +1395,8 @@ static const struct usb_device_id products[] = { + {QMI_FIXED_INTF(0x413c, 0x81d7, 0)}, /* Dell Wireless 5821e */ + {QMI_FIXED_INTF(0x413c, 0x81d7, 1)}, /* Dell Wireless 5821e preproduction config */ + {QMI_FIXED_INTF(0x413c, 0x81e0, 0)}, /* Dell Wireless 5821e with eSIM support*/ ++ {QMI_FIXED_INTF(0x413c, 0x81e4, 0)}, /* Dell Wireless 5829e with eSIM support*/ ++ {QMI_FIXED_INTF(0x413c, 0x81e6, 0)}, /* Dell Wireless 5829e */ + {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ + {QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */ + {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */ +-- +2.34.1 + diff --git a/queue-5.15/netfilter-conntrack-don-t-refresh-sctp-entries-in-cl.patch b/queue-5.15/netfilter-conntrack-don-t-refresh-sctp-entries-in-cl.patch new file mode 100644 index 00000000000..c21bcd0bbb0 --- /dev/null +++ b/queue-5.15/netfilter-conntrack-don-t-refresh-sctp-entries-in-cl.patch @@ -0,0 +1,55 @@ +From ed1db8fb3fbaf198ee1b42e450fa4c6495d3fc56 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 28 Jan 2022 13:13:32 +0100 +Subject: netfilter: conntrack: don't refresh sctp entries in closed state + +From: Florian Westphal + +[ Upstream commit 77b337196a9d87f3d6bb9b07c0436ecafbffda1e ] + +Vivek Thrivikraman reported: + An SCTP server application which is accessed continuously by client + application. + When the session disconnects the client retries to establish a connection. + After restart of SCTP server application the session is not established + because of stale conntrack entry with connection state CLOSED as below. + + (removing this entry manually established new connection): + + sctp 9 CLOSED src=10.141.189.233 [..] [ASSURED] + +Just skip timeout update of closed entries, we don't want them to +stay around forever. + +Reported-and-tested-by: Vivek Thrivikraman +Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=1579 +Signed-off-by: Florian Westphal +Signed-off-by: Pablo Neira Ayuso +Signed-off-by: Sasha Levin +--- + net/netfilter/nf_conntrack_proto_sctp.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c +index 2394238d01c91..5a936334b517a 100644 +--- a/net/netfilter/nf_conntrack_proto_sctp.c ++++ b/net/netfilter/nf_conntrack_proto_sctp.c +@@ -489,6 +489,15 @@ int nf_conntrack_sctp_packet(struct nf_conn *ct, + pr_debug("Setting vtag %x for dir %d\n", + ih->init_tag, !dir); + ct->proto.sctp.vtag[!dir] = ih->init_tag; ++ ++ /* don't renew timeout on init retransmit so ++ * port reuse by client or NAT middlebox cannot ++ * keep entry alive indefinitely (incl. nat info). ++ */ ++ if (new_state == SCTP_CONNTRACK_CLOSED && ++ old_state == SCTP_CONNTRACK_CLOSED && ++ nf_ct_is_confirmed(ct)) ++ ignore = true; + } + + ct->proto.sctp.state = new_state; +-- +2.34.1 + diff --git a/queue-5.15/netfilter-conntrack-don-t-refresh-sctp-entries-in-cl.patch-5972 b/queue-5.15/netfilter-conntrack-don-t-refresh-sctp-entries-in-cl.patch-5972 new file mode 100644 index 00000000000..c21bcd0bbb0 --- /dev/null +++ b/queue-5.15/netfilter-conntrack-don-t-refresh-sctp-entries-in-cl.patch-5972 @@ -0,0 +1,55 @@ +From ed1db8fb3fbaf198ee1b42e450fa4c6495d3fc56 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 28 Jan 2022 13:13:32 +0100 +Subject: netfilter: conntrack: don't refresh sctp entries in closed state + +From: Florian Westphal + +[ Upstream commit 77b337196a9d87f3d6bb9b07c0436ecafbffda1e ] + +Vivek Thrivikraman reported: + An SCTP server application which is accessed continuously by client + application. + When the session disconnects the client retries to establish a connection. + After restart of SCTP server application the session is not established + because of stale conntrack entry with connection state CLOSED as below. + + (removing this entry manually established new connection): + + sctp 9 CLOSED src=10.141.189.233 [..] [ASSURED] + +Just skip timeout update of closed entries, we don't want them to +stay around forever. + +Reported-and-tested-by: Vivek Thrivikraman +Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=1579 +Signed-off-by: Florian Westphal +Signed-off-by: Pablo Neira Ayuso +Signed-off-by: Sasha Levin +--- + net/netfilter/nf_conntrack_proto_sctp.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c +index 2394238d01c91..5a936334b517a 100644 +--- a/net/netfilter/nf_conntrack_proto_sctp.c ++++ b/net/netfilter/nf_conntrack_proto_sctp.c +@@ -489,6 +489,15 @@ int nf_conntrack_sctp_packet(struct nf_conn *ct, + pr_debug("Setting vtag %x for dir %d\n", + ih->init_tag, !dir); + ct->proto.sctp.vtag[!dir] = ih->init_tag; ++ ++ /* don't renew timeout on init retransmit so ++ * port reuse by client or NAT middlebox cannot ++ * keep entry alive indefinitely (incl. nat info). ++ */ ++ if (new_state == SCTP_CONNTRACK_CLOSED && ++ old_state == SCTP_CONNTRACK_CLOSED && ++ nf_ct_is_confirmed(ct)) ++ ignore = true; + } + + ct->proto.sctp.state = new_state; +-- +2.34.1 + diff --git a/queue-5.15/phy-phy-mtk-tphy-fix-duplicated-argument-in-phy-mtk-.patch b/queue-5.15/phy-phy-mtk-tphy-fix-duplicated-argument-in-phy-mtk-.patch new file mode 100644 index 00000000000..33be916be08 --- /dev/null +++ b/queue-5.15/phy-phy-mtk-tphy-fix-duplicated-argument-in-phy-mtk-.patch @@ -0,0 +1,40 @@ +From d841a305e69213cd9828708df717d3bee875554c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 7 Jan 2022 10:50:50 +0800 +Subject: phy: phy-mtk-tphy: Fix duplicated argument in phy-mtk-tphy + +From: Wan Jiabing + +[ Upstream commit 46e994717807f4b935c44d81dde9dd8bcd9a4f5d ] + +Fix following coccicheck warning: +./drivers/phy/mediatek/phy-mtk-tphy.c:994:6-29: duplicated argument +to && or || + +The efuse_rx_imp is duplicate. Here should be efuse_tx_imp. + +Signed-off-by: Wan Jiabing +Acked-by: Chunfeng Yun +Link: https://lore.kernel.org/r/20220107025050.787720-1-wanjiabing@vivo.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/phy/mediatek/phy-mtk-tphy.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/phy/mediatek/phy-mtk-tphy.c b/drivers/phy/mediatek/phy-mtk-tphy.c +index 98a942c607a67..db39b0c4649a2 100644 +--- a/drivers/phy/mediatek/phy-mtk-tphy.c ++++ b/drivers/phy/mediatek/phy-mtk-tphy.c +@@ -1125,7 +1125,7 @@ static int phy_efuse_get(struct mtk_tphy *tphy, struct mtk_phy_instance *instanc + /* no efuse, ignore it */ + if (!instance->efuse_intr && + !instance->efuse_rx_imp && +- !instance->efuse_rx_imp) { ++ !instance->efuse_tx_imp) { + dev_warn(dev, "no u3 intr efuse, but dts enable it\n"); + instance->efuse_sw_en = 0; + break; +-- +2.34.1 + diff --git a/queue-5.15/phy-phy-mtk-tphy-fix-duplicated-argument-in-phy-mtk-.patch-20193 b/queue-5.15/phy-phy-mtk-tphy-fix-duplicated-argument-in-phy-mtk-.patch-20193 new file mode 100644 index 00000000000..33be916be08 --- /dev/null +++ b/queue-5.15/phy-phy-mtk-tphy-fix-duplicated-argument-in-phy-mtk-.patch-20193 @@ -0,0 +1,40 @@ +From d841a305e69213cd9828708df717d3bee875554c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 7 Jan 2022 10:50:50 +0800 +Subject: phy: phy-mtk-tphy: Fix duplicated argument in phy-mtk-tphy + +From: Wan Jiabing + +[ Upstream commit 46e994717807f4b935c44d81dde9dd8bcd9a4f5d ] + +Fix following coccicheck warning: +./drivers/phy/mediatek/phy-mtk-tphy.c:994:6-29: duplicated argument +to && or || + +The efuse_rx_imp is duplicate. Here should be efuse_tx_imp. + +Signed-off-by: Wan Jiabing +Acked-by: Chunfeng Yun +Link: https://lore.kernel.org/r/20220107025050.787720-1-wanjiabing@vivo.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/phy/mediatek/phy-mtk-tphy.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/phy/mediatek/phy-mtk-tphy.c b/drivers/phy/mediatek/phy-mtk-tphy.c +index 98a942c607a67..db39b0c4649a2 100644 +--- a/drivers/phy/mediatek/phy-mtk-tphy.c ++++ b/drivers/phy/mediatek/phy-mtk-tphy.c +@@ -1125,7 +1125,7 @@ static int phy_efuse_get(struct mtk_tphy *tphy, struct mtk_phy_instance *instanc + /* no efuse, ignore it */ + if (!instance->efuse_intr && + !instance->efuse_rx_imp && +- !instance->efuse_rx_imp) { ++ !instance->efuse_tx_imp) { + dev_warn(dev, "no u3 intr efuse, but dts enable it\n"); + instance->efuse_sw_en = 0; + break; +-- +2.34.1 + diff --git a/queue-5.15/phy-usb-leave-some-clocks-running-during-suspend.patch b/queue-5.15/phy-usb-leave-some-clocks-running-during-suspend.patch new file mode 100644 index 00000000000..ad06608da89 --- /dev/null +++ b/queue-5.15/phy-usb-leave-some-clocks-running-during-suspend.patch @@ -0,0 +1,135 @@ +From 8944e7670b7b3a56cbf4cc86c872f2d4969af207 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 1 Dec 2021 13:06:51 -0500 +Subject: phy: usb: Leave some clocks running during suspend + +From: Al Cooper + +[ Upstream commit 42fed57046fc74586d7058bd51a1c10ac9c690cb ] + +The PHY client driver does a phy_exit() call on suspend or rmmod and +the PHY driver needs to know the difference because some clocks need +to be kept running for suspend but can be shutdown on unbind/rmmod +(or if there are no PHY clients at all). + +The fix is to use a PM notifier so the driver can tell if a PHY +client is calling exit() because of a system suspend or a driver +unbind/rmmod. + +Signed-off-by: Al Cooper +Acked-by: Florian Fainelli +Link: https://lore.kernel.org/r/20211201180653.35097-2-alcooperx@gmail.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/phy/broadcom/phy-brcm-usb.c | 38 +++++++++++++++++++++++++++++ + 1 file changed, 38 insertions(+) + +diff --git a/drivers/phy/broadcom/phy-brcm-usb.c b/drivers/phy/broadcom/phy-brcm-usb.c +index 116fb23aebd99..0f1deb6e0eabf 100644 +--- a/drivers/phy/broadcom/phy-brcm-usb.c ++++ b/drivers/phy/broadcom/phy-brcm-usb.c +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + + #include "phy-brcm-usb-init.h" + +@@ -70,12 +71,35 @@ struct brcm_usb_phy_data { + int init_count; + int wake_irq; + struct brcm_usb_phy phys[BRCM_USB_PHY_ID_MAX]; ++ struct notifier_block pm_notifier; ++ bool pm_active; + }; + + static s8 *node_reg_names[BRCM_REGS_MAX] = { + "crtl", "xhci_ec", "xhci_gbl", "usb_phy", "usb_mdio", "bdc_ec" + }; + ++static int brcm_pm_notifier(struct notifier_block *notifier, ++ unsigned long pm_event, ++ void *unused) ++{ ++ struct brcm_usb_phy_data *priv = ++ container_of(notifier, struct brcm_usb_phy_data, pm_notifier); ++ ++ switch (pm_event) { ++ case PM_HIBERNATION_PREPARE: ++ case PM_SUSPEND_PREPARE: ++ priv->pm_active = true; ++ break; ++ case PM_POST_RESTORE: ++ case PM_POST_HIBERNATION: ++ case PM_POST_SUSPEND: ++ priv->pm_active = false; ++ break; ++ } ++ return NOTIFY_DONE; ++} ++ + static irqreturn_t brcm_usb_phy_wake_isr(int irq, void *dev_id) + { + struct phy *gphy = dev_id; +@@ -91,6 +115,9 @@ static int brcm_usb_phy_init(struct phy *gphy) + struct brcm_usb_phy_data *priv = + container_of(phy, struct brcm_usb_phy_data, phys[phy->id]); + ++ if (priv->pm_active) ++ return 0; ++ + /* + * Use a lock to make sure a second caller waits until + * the base phy is inited before using it. +@@ -120,6 +147,9 @@ static int brcm_usb_phy_exit(struct phy *gphy) + struct brcm_usb_phy_data *priv = + container_of(phy, struct brcm_usb_phy_data, phys[phy->id]); + ++ if (priv->pm_active) ++ return 0; ++ + dev_dbg(&gphy->dev, "EXIT\n"); + if (phy->id == BRCM_USB_PHY_2_0) + brcm_usb_uninit_eohci(&priv->ini); +@@ -488,6 +518,9 @@ static int brcm_usb_phy_probe(struct platform_device *pdev) + if (err) + return err; + ++ priv->pm_notifier.notifier_call = brcm_pm_notifier; ++ register_pm_notifier(&priv->pm_notifier); ++ + mutex_init(&priv->mutex); + + /* make sure invert settings are correct */ +@@ -528,7 +561,10 @@ static int brcm_usb_phy_probe(struct platform_device *pdev) + + static int brcm_usb_phy_remove(struct platform_device *pdev) + { ++ struct brcm_usb_phy_data *priv = dev_get_drvdata(&pdev->dev); ++ + sysfs_remove_group(&pdev->dev.kobj, &brcm_usb_phy_group); ++ unregister_pm_notifier(&priv->pm_notifier); + + return 0; + } +@@ -539,6 +575,7 @@ static int brcm_usb_phy_suspend(struct device *dev) + struct brcm_usb_phy_data *priv = dev_get_drvdata(dev); + + if (priv->init_count) { ++ dev_dbg(dev, "SUSPEND\n"); + priv->ini.wake_enabled = device_may_wakeup(dev); + if (priv->phys[BRCM_USB_PHY_3_0].inited) + brcm_usb_uninit_xhci(&priv->ini); +@@ -578,6 +615,7 @@ static int brcm_usb_phy_resume(struct device *dev) + * Uninitialize anything that wasn't previously initialized. + */ + if (priv->init_count) { ++ dev_dbg(dev, "RESUME\n"); + if (priv->wake_irq >= 0) + disable_irq_wake(priv->wake_irq); + brcm_usb_init_common(&priv->ini); +-- +2.34.1 + diff --git a/queue-5.15/phy-usb-leave-some-clocks-running-during-suspend.patch-29258 b/queue-5.15/phy-usb-leave-some-clocks-running-during-suspend.patch-29258 new file mode 100644 index 00000000000..ad06608da89 --- /dev/null +++ b/queue-5.15/phy-usb-leave-some-clocks-running-during-suspend.patch-29258 @@ -0,0 +1,135 @@ +From 8944e7670b7b3a56cbf4cc86c872f2d4969af207 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 1 Dec 2021 13:06:51 -0500 +Subject: phy: usb: Leave some clocks running during suspend + +From: Al Cooper + +[ Upstream commit 42fed57046fc74586d7058bd51a1c10ac9c690cb ] + +The PHY client driver does a phy_exit() call on suspend or rmmod and +the PHY driver needs to know the difference because some clocks need +to be kept running for suspend but can be shutdown on unbind/rmmod +(or if there are no PHY clients at all). + +The fix is to use a PM notifier so the driver can tell if a PHY +client is calling exit() because of a system suspend or a driver +unbind/rmmod. + +Signed-off-by: Al Cooper +Acked-by: Florian Fainelli +Link: https://lore.kernel.org/r/20211201180653.35097-2-alcooperx@gmail.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/phy/broadcom/phy-brcm-usb.c | 38 +++++++++++++++++++++++++++++ + 1 file changed, 38 insertions(+) + +diff --git a/drivers/phy/broadcom/phy-brcm-usb.c b/drivers/phy/broadcom/phy-brcm-usb.c +index 116fb23aebd99..0f1deb6e0eabf 100644 +--- a/drivers/phy/broadcom/phy-brcm-usb.c ++++ b/drivers/phy/broadcom/phy-brcm-usb.c +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + + #include "phy-brcm-usb-init.h" + +@@ -70,12 +71,35 @@ struct brcm_usb_phy_data { + int init_count; + int wake_irq; + struct brcm_usb_phy phys[BRCM_USB_PHY_ID_MAX]; ++ struct notifier_block pm_notifier; ++ bool pm_active; + }; + + static s8 *node_reg_names[BRCM_REGS_MAX] = { + "crtl", "xhci_ec", "xhci_gbl", "usb_phy", "usb_mdio", "bdc_ec" + }; + ++static int brcm_pm_notifier(struct notifier_block *notifier, ++ unsigned long pm_event, ++ void *unused) ++{ ++ struct brcm_usb_phy_data *priv = ++ container_of(notifier, struct brcm_usb_phy_data, pm_notifier); ++ ++ switch (pm_event) { ++ case PM_HIBERNATION_PREPARE: ++ case PM_SUSPEND_PREPARE: ++ priv->pm_active = true; ++ break; ++ case PM_POST_RESTORE: ++ case PM_POST_HIBERNATION: ++ case PM_POST_SUSPEND: ++ priv->pm_active = false; ++ break; ++ } ++ return NOTIFY_DONE; ++} ++ + static irqreturn_t brcm_usb_phy_wake_isr(int irq, void *dev_id) + { + struct phy *gphy = dev_id; +@@ -91,6 +115,9 @@ static int brcm_usb_phy_init(struct phy *gphy) + struct brcm_usb_phy_data *priv = + container_of(phy, struct brcm_usb_phy_data, phys[phy->id]); + ++ if (priv->pm_active) ++ return 0; ++ + /* + * Use a lock to make sure a second caller waits until + * the base phy is inited before using it. +@@ -120,6 +147,9 @@ static int brcm_usb_phy_exit(struct phy *gphy) + struct brcm_usb_phy_data *priv = + container_of(phy, struct brcm_usb_phy_data, phys[phy->id]); + ++ if (priv->pm_active) ++ return 0; ++ + dev_dbg(&gphy->dev, "EXIT\n"); + if (phy->id == BRCM_USB_PHY_2_0) + brcm_usb_uninit_eohci(&priv->ini); +@@ -488,6 +518,9 @@ static int brcm_usb_phy_probe(struct platform_device *pdev) + if (err) + return err; + ++ priv->pm_notifier.notifier_call = brcm_pm_notifier; ++ register_pm_notifier(&priv->pm_notifier); ++ + mutex_init(&priv->mutex); + + /* make sure invert settings are correct */ +@@ -528,7 +561,10 @@ static int brcm_usb_phy_probe(struct platform_device *pdev) + + static int brcm_usb_phy_remove(struct platform_device *pdev) + { ++ struct brcm_usb_phy_data *priv = dev_get_drvdata(&pdev->dev); ++ + sysfs_remove_group(&pdev->dev.kobj, &brcm_usb_phy_group); ++ unregister_pm_notifier(&priv->pm_notifier); + + return 0; + } +@@ -539,6 +575,7 @@ static int brcm_usb_phy_suspend(struct device *dev) + struct brcm_usb_phy_data *priv = dev_get_drvdata(dev); + + if (priv->init_count) { ++ dev_dbg(dev, "SUSPEND\n"); + priv->ini.wake_enabled = device_may_wakeup(dev); + if (priv->phys[BRCM_USB_PHY_3_0].inited) + brcm_usb_uninit_xhci(&priv->ini); +@@ -578,6 +615,7 @@ static int brcm_usb_phy_resume(struct device *dev) + * Uninitialize anything that wasn't previously initialized. + */ + if (priv->init_count) { ++ dev_dbg(dev, "RESUME\n"); + if (priv->wake_irq >= 0) + disable_irq_wake(priv->wake_irq); + brcm_usb_init_common(&priv->ini); +-- +2.34.1 + diff --git a/queue-5.15/pidfd-fix-test-failure-due-to-stack-overflow-on-some.patch b/queue-5.15/pidfd-fix-test-failure-due-to-stack-overflow-on-some.patch new file mode 100644 index 00000000000..f4554028fd0 --- /dev/null +++ b/queue-5.15/pidfd-fix-test-failure-due-to-stack-overflow-on-some.patch @@ -0,0 +1,148 @@ +From fb277d0fcce3d1fc57e2eb23b6c47e8a33ed41bc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 27 Jan 2022 13:29:51 -0800 +Subject: pidfd: fix test failure due to stack overflow on some arches + +From: Axel Rasmussen + +[ Upstream commit 4cbd93c3c110447adc66cb67c08af21f939ae2d7 ] + +When running the pidfd_fdinfo_test on arm64, it fails for me. After some +digging, the reason is that the child exits due to SIGBUS, because it +overflows the 1024 byte stack we've reserved for it. + +To fix the issue, increase the stack size to 8192 bytes (this number is +somewhat arbitrary, and was arrived at through experimentation -- I kept +doubling until the failure no longer occurred). + +Also, let's make the issue easier to debug. wait_for_pid() returns an +ambiguous value: it may return -1 in all of these cases: + +1. waitpid() itself returned -1 +2. waitpid() returned success, but we found !WIFEXITED(status). +3. The child process exited, but it did so with a -1 exit code. + +There's no way for the caller to tell the difference. So, at least log +which occurred, so the test runner can debug things. + +While debugging this, I found that we had !WIFEXITED(), because the +child exited due to a signal. This seems like a reasonably common case, +so also print out whether or not we have WIFSIGNALED(), and the +associated WTERMSIG() (if any). This lets us see the SIGBUS I'm fixing +clearly when it occurs. + +Finally, I'm suspicious of allocating the child's stack on our stack. +man clone(2) suggests that the correct way to do this is with mmap(), +and in particular by setting MAP_STACK. So, switch to doing it that way +instead. + +Signed-off-by: Axel Rasmussen +Acked-by: Christian Brauner +Signed-off-by: Shuah Khan +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/pidfd/pidfd.h | 13 ++++++++--- + .../selftests/pidfd/pidfd_fdinfo_test.c | 22 +++++++++++++++---- + 2 files changed, 28 insertions(+), 7 deletions(-) + +diff --git a/tools/testing/selftests/pidfd/pidfd.h b/tools/testing/selftests/pidfd/pidfd.h +index 01f8d3c0cf2cb..6922d6417e1cf 100644 +--- a/tools/testing/selftests/pidfd/pidfd.h ++++ b/tools/testing/selftests/pidfd/pidfd.h +@@ -68,7 +68,7 @@ + #define PIDFD_SKIP 3 + #define PIDFD_XFAIL 4 + +-int wait_for_pid(pid_t pid) ++static inline int wait_for_pid(pid_t pid) + { + int status, ret; + +@@ -78,13 +78,20 @@ int wait_for_pid(pid_t pid) + if (errno == EINTR) + goto again; + ++ ksft_print_msg("waitpid returned -1, errno=%d\n", errno); + return -1; + } + +- if (!WIFEXITED(status)) ++ if (!WIFEXITED(status)) { ++ ksft_print_msg( ++ "waitpid !WIFEXITED, WIFSIGNALED=%d, WTERMSIG=%d\n", ++ WIFSIGNALED(status), WTERMSIG(status)); + return -1; ++ } + +- return WEXITSTATUS(status); ++ ret = WEXITSTATUS(status); ++ ksft_print_msg("waitpid WEXITSTATUS=%d\n", ret); ++ return ret; + } + + static inline int sys_pidfd_open(pid_t pid, unsigned int flags) +diff --git a/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c b/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c +index 22558524f71c3..3fd8e903118f5 100644 +--- a/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c ++++ b/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c +@@ -12,6 +12,7 @@ + #include + #include + #include ++#include + + #include "pidfd.h" + #include "../kselftest.h" +@@ -80,7 +81,10 @@ static inline int error_check(struct error *err, const char *test_name) + return err->code; + } + ++#define CHILD_STACK_SIZE 8192 ++ + struct child { ++ char *stack; + pid_t pid; + int fd; + }; +@@ -89,17 +93,22 @@ static struct child clone_newns(int (*fn)(void *), void *args, + struct error *err) + { + static int flags = CLONE_PIDFD | CLONE_NEWPID | CLONE_NEWNS | SIGCHLD; +- size_t stack_size = 1024; +- char *stack[1024] = { 0 }; + struct child ret; + + if (!(flags & CLONE_NEWUSER) && geteuid() != 0) + flags |= CLONE_NEWUSER; + ++ ret.stack = mmap(NULL, CHILD_STACK_SIZE, PROT_READ | PROT_WRITE, ++ MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0); ++ if (ret.stack == MAP_FAILED) { ++ error_set(err, -1, "mmap of stack failed (errno %d)", errno); ++ return ret; ++ } ++ + #ifdef __ia64__ +- ret.pid = __clone2(fn, stack, stack_size, flags, args, &ret.fd); ++ ret.pid = __clone2(fn, ret.stack, CHILD_STACK_SIZE, flags, args, &ret.fd); + #else +- ret.pid = clone(fn, stack + stack_size, flags, args, &ret.fd); ++ ret.pid = clone(fn, ret.stack + CHILD_STACK_SIZE, flags, args, &ret.fd); + #endif + + if (ret.pid < 0) { +@@ -129,6 +138,11 @@ static inline int child_join(struct child *child, struct error *err) + else if (r > 0) + error_set(err, r, "child %d reported: %d", child->pid, r); + ++ if (munmap(child->stack, CHILD_STACK_SIZE)) { ++ error_set(err, -1, "munmap of child stack failed (errno %d)", errno); ++ r = -1; ++ } ++ + return r; + } + +-- +2.34.1 + diff --git a/queue-5.15/pidfd-fix-test-failure-due-to-stack-overflow-on-some.patch-16233 b/queue-5.15/pidfd-fix-test-failure-due-to-stack-overflow-on-some.patch-16233 new file mode 100644 index 00000000000..f4554028fd0 --- /dev/null +++ b/queue-5.15/pidfd-fix-test-failure-due-to-stack-overflow-on-some.patch-16233 @@ -0,0 +1,148 @@ +From fb277d0fcce3d1fc57e2eb23b6c47e8a33ed41bc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 27 Jan 2022 13:29:51 -0800 +Subject: pidfd: fix test failure due to stack overflow on some arches + +From: Axel Rasmussen + +[ Upstream commit 4cbd93c3c110447adc66cb67c08af21f939ae2d7 ] + +When running the pidfd_fdinfo_test on arm64, it fails for me. After some +digging, the reason is that the child exits due to SIGBUS, because it +overflows the 1024 byte stack we've reserved for it. + +To fix the issue, increase the stack size to 8192 bytes (this number is +somewhat arbitrary, and was arrived at through experimentation -- I kept +doubling until the failure no longer occurred). + +Also, let's make the issue easier to debug. wait_for_pid() returns an +ambiguous value: it may return -1 in all of these cases: + +1. waitpid() itself returned -1 +2. waitpid() returned success, but we found !WIFEXITED(status). +3. The child process exited, but it did so with a -1 exit code. + +There's no way for the caller to tell the difference. So, at least log +which occurred, so the test runner can debug things. + +While debugging this, I found that we had !WIFEXITED(), because the +child exited due to a signal. This seems like a reasonably common case, +so also print out whether or not we have WIFSIGNALED(), and the +associated WTERMSIG() (if any). This lets us see the SIGBUS I'm fixing +clearly when it occurs. + +Finally, I'm suspicious of allocating the child's stack on our stack. +man clone(2) suggests that the correct way to do this is with mmap(), +and in particular by setting MAP_STACK. So, switch to doing it that way +instead. + +Signed-off-by: Axel Rasmussen +Acked-by: Christian Brauner +Signed-off-by: Shuah Khan +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/pidfd/pidfd.h | 13 ++++++++--- + .../selftests/pidfd/pidfd_fdinfo_test.c | 22 +++++++++++++++---- + 2 files changed, 28 insertions(+), 7 deletions(-) + +diff --git a/tools/testing/selftests/pidfd/pidfd.h b/tools/testing/selftests/pidfd/pidfd.h +index 01f8d3c0cf2cb..6922d6417e1cf 100644 +--- a/tools/testing/selftests/pidfd/pidfd.h ++++ b/tools/testing/selftests/pidfd/pidfd.h +@@ -68,7 +68,7 @@ + #define PIDFD_SKIP 3 + #define PIDFD_XFAIL 4 + +-int wait_for_pid(pid_t pid) ++static inline int wait_for_pid(pid_t pid) + { + int status, ret; + +@@ -78,13 +78,20 @@ int wait_for_pid(pid_t pid) + if (errno == EINTR) + goto again; + ++ ksft_print_msg("waitpid returned -1, errno=%d\n", errno); + return -1; + } + +- if (!WIFEXITED(status)) ++ if (!WIFEXITED(status)) { ++ ksft_print_msg( ++ "waitpid !WIFEXITED, WIFSIGNALED=%d, WTERMSIG=%d\n", ++ WIFSIGNALED(status), WTERMSIG(status)); + return -1; ++ } + +- return WEXITSTATUS(status); ++ ret = WEXITSTATUS(status); ++ ksft_print_msg("waitpid WEXITSTATUS=%d\n", ret); ++ return ret; + } + + static inline int sys_pidfd_open(pid_t pid, unsigned int flags) +diff --git a/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c b/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c +index 22558524f71c3..3fd8e903118f5 100644 +--- a/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c ++++ b/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c +@@ -12,6 +12,7 @@ + #include + #include + #include ++#include + + #include "pidfd.h" + #include "../kselftest.h" +@@ -80,7 +81,10 @@ static inline int error_check(struct error *err, const char *test_name) + return err->code; + } + ++#define CHILD_STACK_SIZE 8192 ++ + struct child { ++ char *stack; + pid_t pid; + int fd; + }; +@@ -89,17 +93,22 @@ static struct child clone_newns(int (*fn)(void *), void *args, + struct error *err) + { + static int flags = CLONE_PIDFD | CLONE_NEWPID | CLONE_NEWNS | SIGCHLD; +- size_t stack_size = 1024; +- char *stack[1024] = { 0 }; + struct child ret; + + if (!(flags & CLONE_NEWUSER) && geteuid() != 0) + flags |= CLONE_NEWUSER; + ++ ret.stack = mmap(NULL, CHILD_STACK_SIZE, PROT_READ | PROT_WRITE, ++ MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0); ++ if (ret.stack == MAP_FAILED) { ++ error_set(err, -1, "mmap of stack failed (errno %d)", errno); ++ return ret; ++ } ++ + #ifdef __ia64__ +- ret.pid = __clone2(fn, stack, stack_size, flags, args, &ret.fd); ++ ret.pid = __clone2(fn, ret.stack, CHILD_STACK_SIZE, flags, args, &ret.fd); + #else +- ret.pid = clone(fn, stack + stack_size, flags, args, &ret.fd); ++ ret.pid = clone(fn, ret.stack + CHILD_STACK_SIZE, flags, args, &ret.fd); + #endif + + if (ret.pid < 0) { +@@ -129,6 +138,11 @@ static inline int child_join(struct child *child, struct error *err) + else if (r > 0) + error_set(err, r, "child %d reported: %d", child->pid, r); + ++ if (munmap(child->stack, CHILD_STACK_SIZE)) { ++ error_set(err, -1, "munmap of child stack failed (errno %d)", errno); ++ r = -1; ++ } ++ + return r; + } + +-- +2.34.1 + diff --git a/queue-5.15/selftests-fixup-build-warnings-in-pidfd-clone3-tests.patch b/queue-5.15/selftests-fixup-build-warnings-in-pidfd-clone3-tests.patch new file mode 100644 index 00000000000..b0ea17ea74a --- /dev/null +++ b/queue-5.15/selftests-fixup-build-warnings-in-pidfd-clone3-tests.patch @@ -0,0 +1,105 @@ +From e642d017776b5b8bfb5b7b4d8dc32dd47f807baf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 27 Jan 2022 14:11:15 -0800 +Subject: selftests: fixup build warnings in pidfd / clone3 tests + +From: Axel Rasmussen + +[ Upstream commit e2aa5e650b07693477dff554053605976789fd68 ] + +These are some trivial fixups, which were needed to build the tests with +clang and -Werror. The following issues are fixed: + +- Remove various unused variables. +- In child_poll_leader_exit_test, clang isn't smart enough to realize + syscall(SYS_exit, 0) won't return, so it complains we never return + from a non-void function. Add an extra exit(0) to appease it. +- In test_pidfd_poll_leader_exit, ret may be branched on despite being + uninitialized, if we have !use_waitpid. Initialize it to zero to get + the right behavior in that case. + +Signed-off-by: Axel Rasmussen +Acked-by: Christian Brauner +Signed-off-by: Shuah Khan +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/clone3/clone3.c | 2 -- + tools/testing/selftests/pidfd/pidfd_test.c | 6 +++--- + tools/testing/selftests/pidfd/pidfd_wait.c | 5 ++--- + 3 files changed, 5 insertions(+), 8 deletions(-) + +diff --git a/tools/testing/selftests/clone3/clone3.c b/tools/testing/selftests/clone3/clone3.c +index 076cf4325f783..cd4582129c7d6 100644 +--- a/tools/testing/selftests/clone3/clone3.c ++++ b/tools/testing/selftests/clone3/clone3.c +@@ -126,8 +126,6 @@ static void test_clone3(uint64_t flags, size_t size, int expected, + + int main(int argc, char *argv[]) + { +- pid_t pid; +- + uid_t uid = getuid(); + + ksft_print_header(); +diff --git a/tools/testing/selftests/pidfd/pidfd_test.c b/tools/testing/selftests/pidfd/pidfd_test.c +index 529eb700ac26a..9a2d64901d591 100644 +--- a/tools/testing/selftests/pidfd/pidfd_test.c ++++ b/tools/testing/selftests/pidfd/pidfd_test.c +@@ -441,7 +441,6 @@ static void test_pidfd_poll_exec(int use_waitpid) + { + int pid, pidfd = 0; + int status, ret; +- pthread_t t1; + time_t prog_start = time(NULL); + const char *test_name = "pidfd_poll check for premature notification on child thread exec"; + +@@ -500,13 +499,14 @@ static int child_poll_leader_exit_test(void *args) + */ + *child_exit_secs = time(NULL); + syscall(SYS_exit, 0); ++ /* Never reached, but appeases compiler thinking we should return. */ ++ exit(0); + } + + static void test_pidfd_poll_leader_exit(int use_waitpid) + { + int pid, pidfd = 0; +- int status, ret; +- time_t prog_start = time(NULL); ++ int status, ret = 0; + const char *test_name = "pidfd_poll check for premature notification on non-empty" + "group leader exit"; + +diff --git a/tools/testing/selftests/pidfd/pidfd_wait.c b/tools/testing/selftests/pidfd/pidfd_wait.c +index be2943f072f60..17999e082aa71 100644 +--- a/tools/testing/selftests/pidfd/pidfd_wait.c ++++ b/tools/testing/selftests/pidfd/pidfd_wait.c +@@ -39,7 +39,7 @@ static int sys_waitid(int which, pid_t pid, siginfo_t *info, int options, + + TEST(wait_simple) + { +- int pidfd = -1, status = 0; ++ int pidfd = -1; + pid_t parent_tid = -1; + struct clone_args args = { + .parent_tid = ptr_to_u64(&parent_tid), +@@ -47,7 +47,6 @@ TEST(wait_simple) + .flags = CLONE_PIDFD | CLONE_PARENT_SETTID, + .exit_signal = SIGCHLD, + }; +- int ret; + pid_t pid; + siginfo_t info = { + .si_signo = 0, +@@ -88,7 +87,7 @@ TEST(wait_simple) + + TEST(wait_states) + { +- int pidfd = -1, status = 0; ++ int pidfd = -1; + pid_t parent_tid = -1; + struct clone_args args = { + .parent_tid = ptr_to_u64(&parent_tid), +-- +2.34.1 + diff --git a/queue-5.15/selftests-fixup-build-warnings-in-pidfd-clone3-tests.patch-8577 b/queue-5.15/selftests-fixup-build-warnings-in-pidfd-clone3-tests.patch-8577 new file mode 100644 index 00000000000..b0ea17ea74a --- /dev/null +++ b/queue-5.15/selftests-fixup-build-warnings-in-pidfd-clone3-tests.patch-8577 @@ -0,0 +1,105 @@ +From e642d017776b5b8bfb5b7b4d8dc32dd47f807baf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 27 Jan 2022 14:11:15 -0800 +Subject: selftests: fixup build warnings in pidfd / clone3 tests + +From: Axel Rasmussen + +[ Upstream commit e2aa5e650b07693477dff554053605976789fd68 ] + +These are some trivial fixups, which were needed to build the tests with +clang and -Werror. The following issues are fixed: + +- Remove various unused variables. +- In child_poll_leader_exit_test, clang isn't smart enough to realize + syscall(SYS_exit, 0) won't return, so it complains we never return + from a non-void function. Add an extra exit(0) to appease it. +- In test_pidfd_poll_leader_exit, ret may be branched on despite being + uninitialized, if we have !use_waitpid. Initialize it to zero to get + the right behavior in that case. + +Signed-off-by: Axel Rasmussen +Acked-by: Christian Brauner +Signed-off-by: Shuah Khan +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/clone3/clone3.c | 2 -- + tools/testing/selftests/pidfd/pidfd_test.c | 6 +++--- + tools/testing/selftests/pidfd/pidfd_wait.c | 5 ++--- + 3 files changed, 5 insertions(+), 8 deletions(-) + +diff --git a/tools/testing/selftests/clone3/clone3.c b/tools/testing/selftests/clone3/clone3.c +index 076cf4325f783..cd4582129c7d6 100644 +--- a/tools/testing/selftests/clone3/clone3.c ++++ b/tools/testing/selftests/clone3/clone3.c +@@ -126,8 +126,6 @@ static void test_clone3(uint64_t flags, size_t size, int expected, + + int main(int argc, char *argv[]) + { +- pid_t pid; +- + uid_t uid = getuid(); + + ksft_print_header(); +diff --git a/tools/testing/selftests/pidfd/pidfd_test.c b/tools/testing/selftests/pidfd/pidfd_test.c +index 529eb700ac26a..9a2d64901d591 100644 +--- a/tools/testing/selftests/pidfd/pidfd_test.c ++++ b/tools/testing/selftests/pidfd/pidfd_test.c +@@ -441,7 +441,6 @@ static void test_pidfd_poll_exec(int use_waitpid) + { + int pid, pidfd = 0; + int status, ret; +- pthread_t t1; + time_t prog_start = time(NULL); + const char *test_name = "pidfd_poll check for premature notification on child thread exec"; + +@@ -500,13 +499,14 @@ static int child_poll_leader_exit_test(void *args) + */ + *child_exit_secs = time(NULL); + syscall(SYS_exit, 0); ++ /* Never reached, but appeases compiler thinking we should return. */ ++ exit(0); + } + + static void test_pidfd_poll_leader_exit(int use_waitpid) + { + int pid, pidfd = 0; +- int status, ret; +- time_t prog_start = time(NULL); ++ int status, ret = 0; + const char *test_name = "pidfd_poll check for premature notification on non-empty" + "group leader exit"; + +diff --git a/tools/testing/selftests/pidfd/pidfd_wait.c b/tools/testing/selftests/pidfd/pidfd_wait.c +index be2943f072f60..17999e082aa71 100644 +--- a/tools/testing/selftests/pidfd/pidfd_wait.c ++++ b/tools/testing/selftests/pidfd/pidfd_wait.c +@@ -39,7 +39,7 @@ static int sys_waitid(int which, pid_t pid, siginfo_t *info, int options, + + TEST(wait_simple) + { +- int pidfd = -1, status = 0; ++ int pidfd = -1; + pid_t parent_tid = -1; + struct clone_args args = { + .parent_tid = ptr_to_u64(&parent_tid), +@@ -47,7 +47,6 @@ TEST(wait_simple) + .flags = CLONE_PIDFD | CLONE_PARENT_SETTID, + .exit_signal = SIGCHLD, + }; +- int ret; + pid_t pid; + siginfo_t info = { + .si_signo = 0, +@@ -88,7 +87,7 @@ TEST(wait_simple) + + TEST(wait_states) + { +- int pidfd = -1, status = 0; ++ int pidfd = -1; + pid_t parent_tid = -1; + struct clone_args args = { + .parent_tid = ptr_to_u64(&parent_tid), +-- +2.34.1 + diff --git a/queue-5.15/series b/queue-5.15/series index 5b84073d115..5bcec06c837 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -145,3 +145,61 @@ nfs-do-not-report-writeback-errors-in-nfs_getattr.patch nvme-prepare-for-pairing-quiescing-and-unquiescing.patch block-fix-surprise-removal-for-drivers-calling-blk_s.patch block-wbt-fix-negative-inflight-counter-when-remove-.patch +arm-omap2-hwmod-add-of_node_put-before-break.patch +arm-omap2-adjust-the-location-of-put_device-call-in-.patch +phy-usb-leave-some-clocks-running-during-suspend.patch +staging-vc04_services-fix-rcu-dereference-check.patch +phy-phy-mtk-tphy-fix-duplicated-argument-in-phy-mtk-.patch +irqchip-sifive-plic-add-missing-thead-c900-plic-matc.patch +x86-bug-merge-annotate_reachable-into-_bug_flags-asm.patch +netfilter-conntrack-don-t-refresh-sctp-entries-in-cl.patch +ksmbd-fix-same-uniqueid-for-dot-and-dotdot-entries.patch +ksmbd-don-t-align-last-entry-offset-in-smb2-query-di.patch +arm64-dts-meson-gx-add-atf-bl32-reserved-memory-regi.patch +arm64-dts-meson-g12-add-atf-bl32-reserved-memory-reg.patch +arm64-dts-meson-g12-drop-bl32-region-from-sei510-sei.patch +pidfd-fix-test-failure-due-to-stack-overflow-on-some.patch +selftests-fixup-build-warnings-in-pidfd-clone3-tests.patch +mm-io_uring-allow-oom-killer-from-io_uring_setup.patch +acpi-pm-revert-only-mark-ec-gpe-for-wakeup-on-intel-.patch +kconfig-let-shell-return-enough-output-for-deep-path.patch +ata-libata-core-disable-trim-on-m88v29.patch +soc-aspeed-lpc-ctrl-block-error-printing-on-probe-de.patch +xprtrdma-fix-pointer-derefs-in-error-cases-of-rpcrdm.patch +drm-rockchip-dw_hdmi-do-not-leave-clock-enabled-in-e.patch +tracing-fix-tp_printk-option-related-with-tp_printk_.patch +display-amd-decrease-message-verbosity-about-waterma.patch +drm-amd-display-cap-pflip-irqs-per-max-otg-number.patch +drm-amd-display-fix-yellow-carp-wm-clamping.patch +net-usb-qmi_wwan-add-support-for-dell-dw5829e.patch +net-macb-align-the-dma-and-coherent-dma-masks.patch +kconfig-fix-failing-to-generate-auto.conf.patch +arm-omap2-hwmod-add-of_node_put-before-break.patch-18156 +arm-omap2-adjust-the-location-of-put_device-call-in-.patch-12804 +phy-usb-leave-some-clocks-running-during-suspend.patch-29258 +staging-vc04_services-fix-rcu-dereference-check.patch-14323 +phy-phy-mtk-tphy-fix-duplicated-argument-in-phy-mtk-.patch-20193 +irqchip-sifive-plic-add-missing-thead-c900-plic-matc.patch-28588 +x86-bug-merge-annotate_reachable-into-_bug_flags-asm.patch-21372 +netfilter-conntrack-don-t-refresh-sctp-entries-in-cl.patch-5972 +ksmbd-fix-same-uniqueid-for-dot-and-dotdot-entries.patch-6367 +ksmbd-don-t-align-last-entry-offset-in-smb2-query-di.patch-16657 +arm64-dts-meson-gx-add-atf-bl32-reserved-memory-regi.patch-6949 +arm64-dts-meson-g12-add-atf-bl32-reserved-memory-reg.patch-20974 +arm64-dts-meson-g12-drop-bl32-region-from-sei510-sei.patch-32121 +pidfd-fix-test-failure-due-to-stack-overflow-on-some.patch-16233 +selftests-fixup-build-warnings-in-pidfd-clone3-tests.patch-8577 +mm-io_uring-allow-oom-killer-from-io_uring_setup.patch-29651 +acpi-pm-revert-only-mark-ec-gpe-for-wakeup-on-intel-.patch-2827 +kconfig-let-shell-return-enough-output-for-deep-path.patch-7959 +ata-libata-core-disable-trim-on-m88v29.patch-8199 +soc-aspeed-lpc-ctrl-block-error-printing-on-probe-de.patch-79 +xprtrdma-fix-pointer-derefs-in-error-cases-of-rpcrdm.patch-19086 +drm-rockchip-dw_hdmi-do-not-leave-clock-enabled-in-e.patch-32194 +tracing-fix-tp_printk-option-related-with-tp_printk_.patch-27788 +display-amd-decrease-message-verbosity-about-waterma.patch-22723 +drm-amd-display-cap-pflip-irqs-per-max-otg-number.patch-25032 +drm-amd-display-fix-yellow-carp-wm-clamping.patch-770 +net-usb-qmi_wwan-add-support-for-dell-dw5829e.patch-9978 +net-macb-align-the-dma-and-coherent-dma-masks.patch-20972 +kconfig-fix-failing-to-generate-auto.conf.patch-10122 diff --git a/queue-5.15/soc-aspeed-lpc-ctrl-block-error-printing-on-probe-de.patch b/queue-5.15/soc-aspeed-lpc-ctrl-block-error-printing-on-probe-de.patch new file mode 100644 index 00000000000..b03c5828eb1 --- /dev/null +++ b/queue-5.15/soc-aspeed-lpc-ctrl-block-error-printing-on-probe-de.patch @@ -0,0 +1,46 @@ +From da8976501fbec69dc20315b5994e190278003f31 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 1 Feb 2022 17:31:18 +1030 +Subject: soc: aspeed: lpc-ctrl: Block error printing on probe defer cases + +From: Jae Hyun Yoo + +[ Upstream commit 301a5d3ad2432d7829f59432ca0a93a6defbb9a1 ] + +Add a checking code when it gets -EPROBE_DEFER while getting a clock +resource. In this case, it doesn't need to print out an error message +because the probing will be re-visited. + +Signed-off-by: Jae Hyun Yoo +Signed-off-by: Joel Stanley +Reviewed-by: Andrew Jeffery +Reviewed-by: Iwona Winiarska +Link: https://lore.kernel.org/r/20211104173709.222912-1-jae.hyun.yoo@intel.com +Link: https://lore.kernel.org/r/20220201070118.196372-1-joel@jms.id.au' +Signed-off-by: Arnd Bergmann +Signed-off-by: Sasha Levin +--- + drivers/soc/aspeed/aspeed-lpc-ctrl.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/drivers/soc/aspeed/aspeed-lpc-ctrl.c b/drivers/soc/aspeed/aspeed-lpc-ctrl.c +index 72771e018c42e..258894ed234b3 100644 +--- a/drivers/soc/aspeed/aspeed-lpc-ctrl.c ++++ b/drivers/soc/aspeed/aspeed-lpc-ctrl.c +@@ -306,10 +306,9 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev) + } + + lpc_ctrl->clk = devm_clk_get(dev, NULL); +- if (IS_ERR(lpc_ctrl->clk)) { +- dev_err(dev, "couldn't get clock\n"); +- return PTR_ERR(lpc_ctrl->clk); +- } ++ if (IS_ERR(lpc_ctrl->clk)) ++ return dev_err_probe(dev, PTR_ERR(lpc_ctrl->clk), ++ "couldn't get clock\n"); + rc = clk_prepare_enable(lpc_ctrl->clk); + if (rc) { + dev_err(dev, "couldn't enable clock\n"); +-- +2.34.1 + diff --git a/queue-5.15/soc-aspeed-lpc-ctrl-block-error-printing-on-probe-de.patch-79 b/queue-5.15/soc-aspeed-lpc-ctrl-block-error-printing-on-probe-de.patch-79 new file mode 100644 index 00000000000..b03c5828eb1 --- /dev/null +++ b/queue-5.15/soc-aspeed-lpc-ctrl-block-error-printing-on-probe-de.patch-79 @@ -0,0 +1,46 @@ +From da8976501fbec69dc20315b5994e190278003f31 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 1 Feb 2022 17:31:18 +1030 +Subject: soc: aspeed: lpc-ctrl: Block error printing on probe defer cases + +From: Jae Hyun Yoo + +[ Upstream commit 301a5d3ad2432d7829f59432ca0a93a6defbb9a1 ] + +Add a checking code when it gets -EPROBE_DEFER while getting a clock +resource. In this case, it doesn't need to print out an error message +because the probing will be re-visited. + +Signed-off-by: Jae Hyun Yoo +Signed-off-by: Joel Stanley +Reviewed-by: Andrew Jeffery +Reviewed-by: Iwona Winiarska +Link: https://lore.kernel.org/r/20211104173709.222912-1-jae.hyun.yoo@intel.com +Link: https://lore.kernel.org/r/20220201070118.196372-1-joel@jms.id.au' +Signed-off-by: Arnd Bergmann +Signed-off-by: Sasha Levin +--- + drivers/soc/aspeed/aspeed-lpc-ctrl.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/drivers/soc/aspeed/aspeed-lpc-ctrl.c b/drivers/soc/aspeed/aspeed-lpc-ctrl.c +index 72771e018c42e..258894ed234b3 100644 +--- a/drivers/soc/aspeed/aspeed-lpc-ctrl.c ++++ b/drivers/soc/aspeed/aspeed-lpc-ctrl.c +@@ -306,10 +306,9 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev) + } + + lpc_ctrl->clk = devm_clk_get(dev, NULL); +- if (IS_ERR(lpc_ctrl->clk)) { +- dev_err(dev, "couldn't get clock\n"); +- return PTR_ERR(lpc_ctrl->clk); +- } ++ if (IS_ERR(lpc_ctrl->clk)) ++ return dev_err_probe(dev, PTR_ERR(lpc_ctrl->clk), ++ "couldn't get clock\n"); + rc = clk_prepare_enable(lpc_ctrl->clk); + if (rc) { + dev_err(dev, "couldn't enable clock\n"); +-- +2.34.1 + diff --git a/queue-5.15/staging-vc04_services-fix-rcu-dereference-check.patch b/queue-5.15/staging-vc04_services-fix-rcu-dereference-check.patch new file mode 100644 index 00000000000..62abc0b1e3c --- /dev/null +++ b/queue-5.15/staging-vc04_services-fix-rcu-dereference-check.patch @@ -0,0 +1,120 @@ +From dd7901e3f4a3e48fd0ab0ce0a57c0073404fa9e5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 31 Dec 2021 20:54:03 +0100 +Subject: staging: vc04_services: Fix RCU dereference check + +From: Padmanabha Srinivasaiah + +[ Upstream commit 0cea730cac824edf78ffd3302938ed5fe2b9d50d ] + +In service_callback path RCU dereferenced pointer struct vchiq_service +need to be accessed inside rcu read-critical section. + +Also userdata/user_service part of vchiq_service is accessed around +different synchronization mechanism, getting an extra reference to a +pointer keeps sematics simpler and avoids prolonged graceperiod. + +Accessing vchiq_service with rcu_read_[lock/unlock] fixes below issue. + +[ 32.201659] ============================= +[ 32.201664] WARNING: suspicious RCU usage +[ 32.201670] 5.15.11-rt24-v8+ #3 Not tainted +[ 32.201680] ----------------------------- +[ 32.201685] drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h:529 suspicious rcu_dereference_check() usage! +[ 32.201695] +[ 32.201695] other info that might help us debug this: +[ 32.201695] +[ 32.201700] +[ 32.201700] rcu_scheduler_active = 2, debug_locks = 1 +[ 32.201708] no locks held by vchiq-slot/0/98. +[ 32.201715] +[ 32.201715] stack backtrace: +[ 32.201723] CPU: 1 PID: 98 Comm: vchiq-slot/0 Not tainted 5.15.11-rt24-v8+ #3 +[ 32.201733] Hardware name: Raspberry Pi 4 Model B Rev 1.4 (DT) +[ 32.201739] Call trace: +[ 32.201742] dump_backtrace+0x0/0x1b8 +[ 32.201772] show_stack+0x20/0x30 +[ 32.201784] dump_stack_lvl+0x8c/0xb8 +[ 32.201799] dump_stack+0x18/0x34 +[ 32.201808] lockdep_rcu_suspicious+0xe4/0xf8 +[ 32.201817] service_callback+0x124/0x400 +[ 32.201830] slot_handler_func+0xf60/0x1e20 +[ 32.201839] kthread+0x19c/0x1a8 +[ 32.201849] ret_from_fork+0x10/0x20 + +Tested-by: Stefan Wahren +Signed-off-by: Padmanabha Srinivasaiah +Link: https://lore.kernel.org/r/20211231195406.5479-1-treasure4paddy@gmail.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + .../interface/vchiq_arm/vchiq_arm.c | 20 +++++++++++++++++-- + 1 file changed, 18 insertions(+), 2 deletions(-) + +diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +index 967f10b9582a8..ea9a53bdb4174 100644 +--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c ++++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +@@ -1033,15 +1033,27 @@ service_callback(enum vchiq_reason reason, struct vchiq_header *header, + + DEBUG_TRACE(SERVICE_CALLBACK_LINE); + ++ rcu_read_lock(); + service = handle_to_service(handle); +- if (WARN_ON(!service)) ++ if (WARN_ON(!service)) { ++ rcu_read_unlock(); + return VCHIQ_SUCCESS; ++ } + + user_service = (struct user_service *)service->base.userdata; + instance = user_service->instance; + +- if (!instance || instance->closing) ++ if (!instance || instance->closing) { ++ rcu_read_unlock(); + return VCHIQ_SUCCESS; ++ } ++ ++ /* ++ * As hopping around different synchronization mechanism, ++ * taking an extra reference results in simpler implementation. ++ */ ++ vchiq_service_get(service); ++ rcu_read_unlock(); + + vchiq_log_trace(vchiq_arm_log_level, + "%s - service %lx(%d,%p), reason %d, header %lx, instance %lx, bulk_userdata %lx", +@@ -1074,6 +1086,7 @@ service_callback(enum vchiq_reason reason, struct vchiq_header *header, + NULL, user_service, bulk_userdata); + if (status != VCHIQ_SUCCESS) { + DEBUG_TRACE(SERVICE_CALLBACK_LINE); ++ vchiq_service_put(service); + return status; + } + } +@@ -1084,11 +1097,13 @@ service_callback(enum vchiq_reason reason, struct vchiq_header *header, + vchiq_log_info(vchiq_arm_log_level, + "%s interrupted", __func__); + DEBUG_TRACE(SERVICE_CALLBACK_LINE); ++ vchiq_service_put(service); + return VCHIQ_RETRY; + } else if (instance->closing) { + vchiq_log_info(vchiq_arm_log_level, + "%s closing", __func__); + DEBUG_TRACE(SERVICE_CALLBACK_LINE); ++ vchiq_service_put(service); + return VCHIQ_ERROR; + } + DEBUG_TRACE(SERVICE_CALLBACK_LINE); +@@ -1117,6 +1132,7 @@ service_callback(enum vchiq_reason reason, struct vchiq_header *header, + header = NULL; + } + DEBUG_TRACE(SERVICE_CALLBACK_LINE); ++ vchiq_service_put(service); + + if (skip_completion) + return VCHIQ_SUCCESS; +-- +2.34.1 + diff --git a/queue-5.15/staging-vc04_services-fix-rcu-dereference-check.patch-14323 b/queue-5.15/staging-vc04_services-fix-rcu-dereference-check.patch-14323 new file mode 100644 index 00000000000..62abc0b1e3c --- /dev/null +++ b/queue-5.15/staging-vc04_services-fix-rcu-dereference-check.patch-14323 @@ -0,0 +1,120 @@ +From dd7901e3f4a3e48fd0ab0ce0a57c0073404fa9e5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 31 Dec 2021 20:54:03 +0100 +Subject: staging: vc04_services: Fix RCU dereference check + +From: Padmanabha Srinivasaiah + +[ Upstream commit 0cea730cac824edf78ffd3302938ed5fe2b9d50d ] + +In service_callback path RCU dereferenced pointer struct vchiq_service +need to be accessed inside rcu read-critical section. + +Also userdata/user_service part of vchiq_service is accessed around +different synchronization mechanism, getting an extra reference to a +pointer keeps sematics simpler and avoids prolonged graceperiod. + +Accessing vchiq_service with rcu_read_[lock/unlock] fixes below issue. + +[ 32.201659] ============================= +[ 32.201664] WARNING: suspicious RCU usage +[ 32.201670] 5.15.11-rt24-v8+ #3 Not tainted +[ 32.201680] ----------------------------- +[ 32.201685] drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h:529 suspicious rcu_dereference_check() usage! +[ 32.201695] +[ 32.201695] other info that might help us debug this: +[ 32.201695] +[ 32.201700] +[ 32.201700] rcu_scheduler_active = 2, debug_locks = 1 +[ 32.201708] no locks held by vchiq-slot/0/98. +[ 32.201715] +[ 32.201715] stack backtrace: +[ 32.201723] CPU: 1 PID: 98 Comm: vchiq-slot/0 Not tainted 5.15.11-rt24-v8+ #3 +[ 32.201733] Hardware name: Raspberry Pi 4 Model B Rev 1.4 (DT) +[ 32.201739] Call trace: +[ 32.201742] dump_backtrace+0x0/0x1b8 +[ 32.201772] show_stack+0x20/0x30 +[ 32.201784] dump_stack_lvl+0x8c/0xb8 +[ 32.201799] dump_stack+0x18/0x34 +[ 32.201808] lockdep_rcu_suspicious+0xe4/0xf8 +[ 32.201817] service_callback+0x124/0x400 +[ 32.201830] slot_handler_func+0xf60/0x1e20 +[ 32.201839] kthread+0x19c/0x1a8 +[ 32.201849] ret_from_fork+0x10/0x20 + +Tested-by: Stefan Wahren +Signed-off-by: Padmanabha Srinivasaiah +Link: https://lore.kernel.org/r/20211231195406.5479-1-treasure4paddy@gmail.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + .../interface/vchiq_arm/vchiq_arm.c | 20 +++++++++++++++++-- + 1 file changed, 18 insertions(+), 2 deletions(-) + +diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +index 967f10b9582a8..ea9a53bdb4174 100644 +--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c ++++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +@@ -1033,15 +1033,27 @@ service_callback(enum vchiq_reason reason, struct vchiq_header *header, + + DEBUG_TRACE(SERVICE_CALLBACK_LINE); + ++ rcu_read_lock(); + service = handle_to_service(handle); +- if (WARN_ON(!service)) ++ if (WARN_ON(!service)) { ++ rcu_read_unlock(); + return VCHIQ_SUCCESS; ++ } + + user_service = (struct user_service *)service->base.userdata; + instance = user_service->instance; + +- if (!instance || instance->closing) ++ if (!instance || instance->closing) { ++ rcu_read_unlock(); + return VCHIQ_SUCCESS; ++ } ++ ++ /* ++ * As hopping around different synchronization mechanism, ++ * taking an extra reference results in simpler implementation. ++ */ ++ vchiq_service_get(service); ++ rcu_read_unlock(); + + vchiq_log_trace(vchiq_arm_log_level, + "%s - service %lx(%d,%p), reason %d, header %lx, instance %lx, bulk_userdata %lx", +@@ -1074,6 +1086,7 @@ service_callback(enum vchiq_reason reason, struct vchiq_header *header, + NULL, user_service, bulk_userdata); + if (status != VCHIQ_SUCCESS) { + DEBUG_TRACE(SERVICE_CALLBACK_LINE); ++ vchiq_service_put(service); + return status; + } + } +@@ -1084,11 +1097,13 @@ service_callback(enum vchiq_reason reason, struct vchiq_header *header, + vchiq_log_info(vchiq_arm_log_level, + "%s interrupted", __func__); + DEBUG_TRACE(SERVICE_CALLBACK_LINE); ++ vchiq_service_put(service); + return VCHIQ_RETRY; + } else if (instance->closing) { + vchiq_log_info(vchiq_arm_log_level, + "%s closing", __func__); + DEBUG_TRACE(SERVICE_CALLBACK_LINE); ++ vchiq_service_put(service); + return VCHIQ_ERROR; + } + DEBUG_TRACE(SERVICE_CALLBACK_LINE); +@@ -1117,6 +1132,7 @@ service_callback(enum vchiq_reason reason, struct vchiq_header *header, + header = NULL; + } + DEBUG_TRACE(SERVICE_CALLBACK_LINE); ++ vchiq_service_put(service); + + if (skip_completion) + return VCHIQ_SUCCESS; +-- +2.34.1 + diff --git a/queue-5.15/tracing-fix-tp_printk-option-related-with-tp_printk_.patch b/queue-5.15/tracing-fix-tp_printk-option-related-with-tp_printk_.patch new file mode 100644 index 00000000000..fd5b6d3c949 --- /dev/null +++ b/queue-5.15/tracing-fix-tp_printk-option-related-with-tp_printk_.patch @@ -0,0 +1,49 @@ +From d3336766c0441220aaebac7277e39ec6f05f2888 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Feb 2022 04:54:22 +0900 +Subject: tracing: Fix tp_printk option related with tp_printk_stop_on_boot + +From: JaeSang Yoo + +[ Upstream commit 3203ce39ac0b2a57a84382ec184c7d4a0bede175 ] + +The kernel parameter "tp_printk_stop_on_boot" starts with "tp_printk" which is +the same as another kernel parameter "tp_printk". If "tp_printk" setup is +called before the "tp_printk_stop_on_boot", it will override the latter +and keep it from being set. + +This is similar to other kernel parameter issues, such as: + Commit 745a600cf1a6 ("um: console: Ignore console= option") +or init/do_mounts.c:45 (setup function of "ro" kernel param) + +Fix it by checking for a "_" right after the "tp_printk" and if that +exists do not process the parameter. + +Link: https://lkml.kernel.org/r/20220208195421.969326-1-jsyoo5b@gmail.com + +Signed-off-by: JaeSang Yoo +[ Fixed up change log and added space after if condition ] +Signed-off-by: Steven Rostedt (Google) +Signed-off-by: Sasha Levin +--- + kernel/trace/trace.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c +index 51a87a67e2abe..618c20ce2479d 100644 +--- a/kernel/trace/trace.c ++++ b/kernel/trace/trace.c +@@ -252,6 +252,10 @@ __setup("trace_clock=", set_trace_boot_clock); + + static int __init set_tracepoint_printk(char *str) + { ++ /* Ignore the "tp_printk_stop_on_boot" param */ ++ if (*str == '_') ++ return 0; ++ + if ((strcmp(str, "=0") != 0 && strcmp(str, "=off") != 0)) + tracepoint_printk = 1; + return 1; +-- +2.34.1 + diff --git a/queue-5.15/tracing-fix-tp_printk-option-related-with-tp_printk_.patch-27788 b/queue-5.15/tracing-fix-tp_printk-option-related-with-tp_printk_.patch-27788 new file mode 100644 index 00000000000..fd5b6d3c949 --- /dev/null +++ b/queue-5.15/tracing-fix-tp_printk-option-related-with-tp_printk_.patch-27788 @@ -0,0 +1,49 @@ +From d3336766c0441220aaebac7277e39ec6f05f2888 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Feb 2022 04:54:22 +0900 +Subject: tracing: Fix tp_printk option related with tp_printk_stop_on_boot + +From: JaeSang Yoo + +[ Upstream commit 3203ce39ac0b2a57a84382ec184c7d4a0bede175 ] + +The kernel parameter "tp_printk_stop_on_boot" starts with "tp_printk" which is +the same as another kernel parameter "tp_printk". If "tp_printk" setup is +called before the "tp_printk_stop_on_boot", it will override the latter +and keep it from being set. + +This is similar to other kernel parameter issues, such as: + Commit 745a600cf1a6 ("um: console: Ignore console= option") +or init/do_mounts.c:45 (setup function of "ro" kernel param) + +Fix it by checking for a "_" right after the "tp_printk" and if that +exists do not process the parameter. + +Link: https://lkml.kernel.org/r/20220208195421.969326-1-jsyoo5b@gmail.com + +Signed-off-by: JaeSang Yoo +[ Fixed up change log and added space after if condition ] +Signed-off-by: Steven Rostedt (Google) +Signed-off-by: Sasha Levin +--- + kernel/trace/trace.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c +index 51a87a67e2abe..618c20ce2479d 100644 +--- a/kernel/trace/trace.c ++++ b/kernel/trace/trace.c +@@ -252,6 +252,10 @@ __setup("trace_clock=", set_trace_boot_clock); + + static int __init set_tracepoint_printk(char *str) + { ++ /* Ignore the "tp_printk_stop_on_boot" param */ ++ if (*str == '_') ++ return 0; ++ + if ((strcmp(str, "=0") != 0 && strcmp(str, "=off") != 0)) + tracepoint_printk = 1; + return 1; +-- +2.34.1 + diff --git a/queue-5.15/x86-bug-merge-annotate_reachable-into-_bug_flags-asm.patch b/queue-5.15/x86-bug-merge-annotate_reachable-into-_bug_flags-asm.patch new file mode 100644 index 00000000000..30476379855 --- /dev/null +++ b/queue-5.15/x86-bug-merge-annotate_reachable-into-_bug_flags-asm.patch @@ -0,0 +1,181 @@ +From 3c9ec63a0b584c3873d35954db9f5c7f4c03582e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 2 Feb 2022 12:55:53 -0800 +Subject: x86/bug: Merge annotate_reachable() into _BUG_FLAGS() asm + +From: Nick Desaulniers + +[ Upstream commit bfb1a7c91fb7758273b4a8d735313d9cc388b502 ] + +In __WARN_FLAGS(), we had two asm statements (abbreviated): + + asm volatile("ud2"); + asm volatile(".pushsection .discard.reachable"); + +These pair of statements are used to trigger an exception, but then help +objtool understand that for warnings, control flow will be restored +immediately afterwards. + +The problem is that volatile is not a compiler barrier. GCC explicitly +documents this: + +> Note that the compiler can move even volatile asm instructions +> relative to other code, including across jump instructions. + +Also, no clobbers are specified to prevent instructions from subsequent +statements from being scheduled by compiler before the second asm +statement. This can lead to instructions from subsequent statements +being emitted by the compiler before the second asm statement. + +Providing a scheduling model such as via -march= options enables the +compiler to better schedule instructions with known latencies to hide +latencies from data hazards compared to inline asm statements in which +latencies are not estimated. + +If an instruction gets scheduled by the compiler between the two asm +statements, then objtool will think that it is not reachable, producing +a warning. + +To prevent instructions from being scheduled in between the two asm +statements, merge them. + +Also remove an unnecessary unreachable() asm annotation from BUG() in +favor of __builtin_unreachable(). objtool is able to track that the ud2 +from BUG() terminates control flow within the function. + +Link: https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Volatile +Link: https://github.com/ClangBuiltLinux/linux/issues/1483 +Signed-off-by: Nick Desaulniers +Signed-off-by: Josh Poimboeuf +Link: https://lore.kernel.org/r/20220202205557.2260694-1-ndesaulniers@google.com +Signed-off-by: Sasha Levin +--- + arch/x86/include/asm/bug.h | 20 +++++++++++--------- + include/linux/compiler.h | 21 +++++---------------- + 2 files changed, 16 insertions(+), 25 deletions(-) + +diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h +index 84b87538a15de..bab883c0b6fee 100644 +--- a/arch/x86/include/asm/bug.h ++++ b/arch/x86/include/asm/bug.h +@@ -22,7 +22,7 @@ + + #ifdef CONFIG_DEBUG_BUGVERBOSE + +-#define _BUG_FLAGS(ins, flags) \ ++#define _BUG_FLAGS(ins, flags, extra) \ + do { \ + asm_inline volatile("1:\t" ins "\n" \ + ".pushsection __bug_table,\"aw\"\n" \ +@@ -31,7 +31,8 @@ do { \ + "\t.word %c1" "\t# bug_entry::line\n" \ + "\t.word %c2" "\t# bug_entry::flags\n" \ + "\t.org 2b+%c3\n" \ +- ".popsection" \ ++ ".popsection\n" \ ++ extra \ + : : "i" (__FILE__), "i" (__LINE__), \ + "i" (flags), \ + "i" (sizeof(struct bug_entry))); \ +@@ -39,14 +40,15 @@ do { \ + + #else /* !CONFIG_DEBUG_BUGVERBOSE */ + +-#define _BUG_FLAGS(ins, flags) \ ++#define _BUG_FLAGS(ins, flags, extra) \ + do { \ + asm_inline volatile("1:\t" ins "\n" \ + ".pushsection __bug_table,\"aw\"\n" \ + "2:\t" __BUG_REL(1b) "\t# bug_entry::bug_addr\n" \ + "\t.word %c0" "\t# bug_entry::flags\n" \ + "\t.org 2b+%c1\n" \ +- ".popsection" \ ++ ".popsection\n" \ ++ extra \ + : : "i" (flags), \ + "i" (sizeof(struct bug_entry))); \ + } while (0) +@@ -55,7 +57,7 @@ do { \ + + #else + +-#define _BUG_FLAGS(ins, flags) asm volatile(ins) ++#define _BUG_FLAGS(ins, flags, extra) asm volatile(ins) + + #endif /* CONFIG_GENERIC_BUG */ + +@@ -63,8 +65,8 @@ do { \ + #define BUG() \ + do { \ + instrumentation_begin(); \ +- _BUG_FLAGS(ASM_UD2, 0); \ +- unreachable(); \ ++ _BUG_FLAGS(ASM_UD2, 0, ""); \ ++ __builtin_unreachable(); \ + } while (0) + + /* +@@ -75,9 +77,9 @@ do { \ + */ + #define __WARN_FLAGS(flags) \ + do { \ ++ __auto_type f = BUGFLAG_WARNING|(flags); \ + instrumentation_begin(); \ +- _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags)); \ +- annotate_reachable(); \ ++ _BUG_FLAGS(ASM_UD2, f, ASM_REACHABLE); \ + instrumentation_end(); \ + } while (0) + +diff --git a/include/linux/compiler.h b/include/linux/compiler.h +index 429dcebe2b992..0f7fd205ab7ea 100644 +--- a/include/linux/compiler.h ++++ b/include/linux/compiler.h +@@ -117,14 +117,6 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val, + */ + #define __stringify_label(n) #n + +-#define __annotate_reachable(c) ({ \ +- asm volatile(__stringify_label(c) ":\n\t" \ +- ".pushsection .discard.reachable\n\t" \ +- ".long " __stringify_label(c) "b - .\n\t" \ +- ".popsection\n\t" : : "i" (c)); \ +-}) +-#define annotate_reachable() __annotate_reachable(__COUNTER__) +- + #define __annotate_unreachable(c) ({ \ + asm volatile(__stringify_label(c) ":\n\t" \ + ".pushsection .discard.unreachable\n\t" \ +@@ -133,24 +125,21 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val, + }) + #define annotate_unreachable() __annotate_unreachable(__COUNTER__) + +-#define ASM_UNREACHABLE \ +- "999:\n\t" \ +- ".pushsection .discard.unreachable\n\t" \ +- ".long 999b - .\n\t" \ ++#define ASM_REACHABLE \ ++ "998:\n\t" \ ++ ".pushsection .discard.reachable\n\t" \ ++ ".long 998b - .\n\t" \ + ".popsection\n\t" + + /* Annotate a C jump table to allow objtool to follow the code flow */ + #define __annotate_jump_table __section(".rodata..c_jump_table") + + #else +-#define annotate_reachable() + #define annotate_unreachable() ++# define ASM_REACHABLE + #define __annotate_jump_table + #endif + +-#ifndef ASM_UNREACHABLE +-# define ASM_UNREACHABLE +-#endif + #ifndef unreachable + # define unreachable() do { \ + annotate_unreachable(); \ +-- +2.34.1 + diff --git a/queue-5.15/x86-bug-merge-annotate_reachable-into-_bug_flags-asm.patch-21372 b/queue-5.15/x86-bug-merge-annotate_reachable-into-_bug_flags-asm.patch-21372 new file mode 100644 index 00000000000..30476379855 --- /dev/null +++ b/queue-5.15/x86-bug-merge-annotate_reachable-into-_bug_flags-asm.patch-21372 @@ -0,0 +1,181 @@ +From 3c9ec63a0b584c3873d35954db9f5c7f4c03582e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 2 Feb 2022 12:55:53 -0800 +Subject: x86/bug: Merge annotate_reachable() into _BUG_FLAGS() asm + +From: Nick Desaulniers + +[ Upstream commit bfb1a7c91fb7758273b4a8d735313d9cc388b502 ] + +In __WARN_FLAGS(), we had two asm statements (abbreviated): + + asm volatile("ud2"); + asm volatile(".pushsection .discard.reachable"); + +These pair of statements are used to trigger an exception, but then help +objtool understand that for warnings, control flow will be restored +immediately afterwards. + +The problem is that volatile is not a compiler barrier. GCC explicitly +documents this: + +> Note that the compiler can move even volatile asm instructions +> relative to other code, including across jump instructions. + +Also, no clobbers are specified to prevent instructions from subsequent +statements from being scheduled by compiler before the second asm +statement. This can lead to instructions from subsequent statements +being emitted by the compiler before the second asm statement. + +Providing a scheduling model such as via -march= options enables the +compiler to better schedule instructions with known latencies to hide +latencies from data hazards compared to inline asm statements in which +latencies are not estimated. + +If an instruction gets scheduled by the compiler between the two asm +statements, then objtool will think that it is not reachable, producing +a warning. + +To prevent instructions from being scheduled in between the two asm +statements, merge them. + +Also remove an unnecessary unreachable() asm annotation from BUG() in +favor of __builtin_unreachable(). objtool is able to track that the ud2 +from BUG() terminates control flow within the function. + +Link: https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Volatile +Link: https://github.com/ClangBuiltLinux/linux/issues/1483 +Signed-off-by: Nick Desaulniers +Signed-off-by: Josh Poimboeuf +Link: https://lore.kernel.org/r/20220202205557.2260694-1-ndesaulniers@google.com +Signed-off-by: Sasha Levin +--- + arch/x86/include/asm/bug.h | 20 +++++++++++--------- + include/linux/compiler.h | 21 +++++---------------- + 2 files changed, 16 insertions(+), 25 deletions(-) + +diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h +index 84b87538a15de..bab883c0b6fee 100644 +--- a/arch/x86/include/asm/bug.h ++++ b/arch/x86/include/asm/bug.h +@@ -22,7 +22,7 @@ + + #ifdef CONFIG_DEBUG_BUGVERBOSE + +-#define _BUG_FLAGS(ins, flags) \ ++#define _BUG_FLAGS(ins, flags, extra) \ + do { \ + asm_inline volatile("1:\t" ins "\n" \ + ".pushsection __bug_table,\"aw\"\n" \ +@@ -31,7 +31,8 @@ do { \ + "\t.word %c1" "\t# bug_entry::line\n" \ + "\t.word %c2" "\t# bug_entry::flags\n" \ + "\t.org 2b+%c3\n" \ +- ".popsection" \ ++ ".popsection\n" \ ++ extra \ + : : "i" (__FILE__), "i" (__LINE__), \ + "i" (flags), \ + "i" (sizeof(struct bug_entry))); \ +@@ -39,14 +40,15 @@ do { \ + + #else /* !CONFIG_DEBUG_BUGVERBOSE */ + +-#define _BUG_FLAGS(ins, flags) \ ++#define _BUG_FLAGS(ins, flags, extra) \ + do { \ + asm_inline volatile("1:\t" ins "\n" \ + ".pushsection __bug_table,\"aw\"\n" \ + "2:\t" __BUG_REL(1b) "\t# bug_entry::bug_addr\n" \ + "\t.word %c0" "\t# bug_entry::flags\n" \ + "\t.org 2b+%c1\n" \ +- ".popsection" \ ++ ".popsection\n" \ ++ extra \ + : : "i" (flags), \ + "i" (sizeof(struct bug_entry))); \ + } while (0) +@@ -55,7 +57,7 @@ do { \ + + #else + +-#define _BUG_FLAGS(ins, flags) asm volatile(ins) ++#define _BUG_FLAGS(ins, flags, extra) asm volatile(ins) + + #endif /* CONFIG_GENERIC_BUG */ + +@@ -63,8 +65,8 @@ do { \ + #define BUG() \ + do { \ + instrumentation_begin(); \ +- _BUG_FLAGS(ASM_UD2, 0); \ +- unreachable(); \ ++ _BUG_FLAGS(ASM_UD2, 0, ""); \ ++ __builtin_unreachable(); \ + } while (0) + + /* +@@ -75,9 +77,9 @@ do { \ + */ + #define __WARN_FLAGS(flags) \ + do { \ ++ __auto_type f = BUGFLAG_WARNING|(flags); \ + instrumentation_begin(); \ +- _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags)); \ +- annotate_reachable(); \ ++ _BUG_FLAGS(ASM_UD2, f, ASM_REACHABLE); \ + instrumentation_end(); \ + } while (0) + +diff --git a/include/linux/compiler.h b/include/linux/compiler.h +index 429dcebe2b992..0f7fd205ab7ea 100644 +--- a/include/linux/compiler.h ++++ b/include/linux/compiler.h +@@ -117,14 +117,6 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val, + */ + #define __stringify_label(n) #n + +-#define __annotate_reachable(c) ({ \ +- asm volatile(__stringify_label(c) ":\n\t" \ +- ".pushsection .discard.reachable\n\t" \ +- ".long " __stringify_label(c) "b - .\n\t" \ +- ".popsection\n\t" : : "i" (c)); \ +-}) +-#define annotate_reachable() __annotate_reachable(__COUNTER__) +- + #define __annotate_unreachable(c) ({ \ + asm volatile(__stringify_label(c) ":\n\t" \ + ".pushsection .discard.unreachable\n\t" \ +@@ -133,24 +125,21 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val, + }) + #define annotate_unreachable() __annotate_unreachable(__COUNTER__) + +-#define ASM_UNREACHABLE \ +- "999:\n\t" \ +- ".pushsection .discard.unreachable\n\t" \ +- ".long 999b - .\n\t" \ ++#define ASM_REACHABLE \ ++ "998:\n\t" \ ++ ".pushsection .discard.reachable\n\t" \ ++ ".long 998b - .\n\t" \ + ".popsection\n\t" + + /* Annotate a C jump table to allow objtool to follow the code flow */ + #define __annotate_jump_table __section(".rodata..c_jump_table") + + #else +-#define annotate_reachable() + #define annotate_unreachable() ++# define ASM_REACHABLE + #define __annotate_jump_table + #endif + +-#ifndef ASM_UNREACHABLE +-# define ASM_UNREACHABLE +-#endif + #ifndef unreachable + # define unreachable() do { \ + annotate_unreachable(); \ +-- +2.34.1 + diff --git a/queue-5.15/xprtrdma-fix-pointer-derefs-in-error-cases-of-rpcrdm.patch b/queue-5.15/xprtrdma-fix-pointer-derefs-in-error-cases-of-rpcrdm.patch new file mode 100644 index 00000000000..64f7f4d717a --- /dev/null +++ b/queue-5.15/xprtrdma-fix-pointer-derefs-in-error-cases-of-rpcrdm.patch @@ -0,0 +1,52 @@ +From fddf3e1dca5e60484195a2832b3083cfde88c2e8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 25 Jan 2022 22:06:46 +0200 +Subject: xprtrdma: fix pointer derefs in error cases of rpcrdma_ep_create + +From: Dan Aloni + +[ Upstream commit a9c10b5b3b67b3750a10c8b089b2e05f5e176e33 ] + +If there are failures then we must not leave the non-NULL pointers with +the error value, otherwise `rpcrdma_ep_destroy` gets confused and tries +free them, resulting in an Oops. + +Signed-off-by: Dan Aloni +Acked-by: Chuck Lever +Signed-off-by: Anna Schumaker +Signed-off-by: Sasha Levin +--- + net/sunrpc/xprtrdma/verbs.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c +index aaec3c9be8db6..1295f9ab839fd 100644 +--- a/net/sunrpc/xprtrdma/verbs.c ++++ b/net/sunrpc/xprtrdma/verbs.c +@@ -438,6 +438,7 @@ static int rpcrdma_ep_create(struct rpcrdma_xprt *r_xprt) + IB_POLL_WORKQUEUE); + if (IS_ERR(ep->re_attr.send_cq)) { + rc = PTR_ERR(ep->re_attr.send_cq); ++ ep->re_attr.send_cq = NULL; + goto out_destroy; + } + +@@ -446,6 +447,7 @@ static int rpcrdma_ep_create(struct rpcrdma_xprt *r_xprt) + IB_POLL_WORKQUEUE); + if (IS_ERR(ep->re_attr.recv_cq)) { + rc = PTR_ERR(ep->re_attr.recv_cq); ++ ep->re_attr.recv_cq = NULL; + goto out_destroy; + } + ep->re_receive_count = 0; +@@ -484,6 +486,7 @@ static int rpcrdma_ep_create(struct rpcrdma_xprt *r_xprt) + ep->re_pd = ib_alloc_pd(device, 0); + if (IS_ERR(ep->re_pd)) { + rc = PTR_ERR(ep->re_pd); ++ ep->re_pd = NULL; + goto out_destroy; + } + +-- +2.34.1 + diff --git a/queue-5.15/xprtrdma-fix-pointer-derefs-in-error-cases-of-rpcrdm.patch-19086 b/queue-5.15/xprtrdma-fix-pointer-derefs-in-error-cases-of-rpcrdm.patch-19086 new file mode 100644 index 00000000000..64f7f4d717a --- /dev/null +++ b/queue-5.15/xprtrdma-fix-pointer-derefs-in-error-cases-of-rpcrdm.patch-19086 @@ -0,0 +1,52 @@ +From fddf3e1dca5e60484195a2832b3083cfde88c2e8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 25 Jan 2022 22:06:46 +0200 +Subject: xprtrdma: fix pointer derefs in error cases of rpcrdma_ep_create + +From: Dan Aloni + +[ Upstream commit a9c10b5b3b67b3750a10c8b089b2e05f5e176e33 ] + +If there are failures then we must not leave the non-NULL pointers with +the error value, otherwise `rpcrdma_ep_destroy` gets confused and tries +free them, resulting in an Oops. + +Signed-off-by: Dan Aloni +Acked-by: Chuck Lever +Signed-off-by: Anna Schumaker +Signed-off-by: Sasha Levin +--- + net/sunrpc/xprtrdma/verbs.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c +index aaec3c9be8db6..1295f9ab839fd 100644 +--- a/net/sunrpc/xprtrdma/verbs.c ++++ b/net/sunrpc/xprtrdma/verbs.c +@@ -438,6 +438,7 @@ static int rpcrdma_ep_create(struct rpcrdma_xprt *r_xprt) + IB_POLL_WORKQUEUE); + if (IS_ERR(ep->re_attr.send_cq)) { + rc = PTR_ERR(ep->re_attr.send_cq); ++ ep->re_attr.send_cq = NULL; + goto out_destroy; + } + +@@ -446,6 +447,7 @@ static int rpcrdma_ep_create(struct rpcrdma_xprt *r_xprt) + IB_POLL_WORKQUEUE); + if (IS_ERR(ep->re_attr.recv_cq)) { + rc = PTR_ERR(ep->re_attr.recv_cq); ++ ep->re_attr.recv_cq = NULL; + goto out_destroy; + } + ep->re_receive_count = 0; +@@ -484,6 +486,7 @@ static int rpcrdma_ep_create(struct rpcrdma_xprt *r_xprt) + ep->re_pd = ib_alloc_pd(device, 0); + if (IS_ERR(ep->re_pd)) { + rc = PTR_ERR(ep->re_pd); ++ ep->re_pd = NULL; + goto out_destroy; + } + +-- +2.34.1 +