]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 5.16
authorSasha Levin <sashal@kernel.org>
Mon, 21 Feb 2022 04:50:48 +0000 (23:50 -0500)
committerSasha Levin <sashal@kernel.org>
Mon, 21 Feb 2022 04:50:48 +0000 (23:50 -0500)
Signed-off-by: Sasha Levin <sashal@kernel.org>
61 files changed:
queue-5.16/acpi-pm-revert-only-mark-ec-gpe-for-wakeup-on-intel-.patch [new file with mode: 0644]
queue-5.16/acpi-pm-revert-only-mark-ec-gpe-for-wakeup-on-intel-.patch-12858 [new file with mode: 0644]
queue-5.16/arm-omap2-adjust-the-location-of-put_device-call-in-.patch [new file with mode: 0644]
queue-5.16/arm-omap2-adjust-the-location-of-put_device-call-in-.patch-19990 [new file with mode: 0644]
queue-5.16/arm-omap2-hwmod-add-of_node_put-before-break.patch [new file with mode: 0644]
queue-5.16/arm-omap2-hwmod-add-of_node_put-before-break.patch-3525 [new file with mode: 0644]
queue-5.16/arm64-dts-meson-g12-add-atf-bl32-reserved-memory-reg.patch [new file with mode: 0644]
queue-5.16/arm64-dts-meson-g12-add-atf-bl32-reserved-memory-reg.patch-17942 [new file with mode: 0644]
queue-5.16/arm64-dts-meson-g12-drop-bl32-region-from-sei510-sei.patch [new file with mode: 0644]
queue-5.16/arm64-dts-meson-g12-drop-bl32-region-from-sei510-sei.patch-23288 [new file with mode: 0644]
queue-5.16/arm64-dts-meson-gx-add-atf-bl32-reserved-memory-regi.patch [new file with mode: 0644]
queue-5.16/arm64-dts-meson-gx-add-atf-bl32-reserved-memory-regi.patch-77 [new file with mode: 0644]
queue-5.16/ata-libata-core-disable-trim-on-m88v29.patch [new file with mode: 0644]
queue-5.16/ata-libata-core-disable-trim-on-m88v29.patch-950 [new file with mode: 0644]
queue-5.16/display-amd-decrease-message-verbosity-about-waterma.patch [new file with mode: 0644]
queue-5.16/display-amd-decrease-message-verbosity-about-waterma.patch-30627 [new file with mode: 0644]
queue-5.16/drm-amd-display-cap-pflip-irqs-per-max-otg-number.patch [new file with mode: 0644]
queue-5.16/drm-amd-display-cap-pflip-irqs-per-max-otg-number.patch-15402 [new file with mode: 0644]
queue-5.16/drm-amd-display-fix-yellow-carp-wm-clamping.patch [new file with mode: 0644]
queue-5.16/drm-amd-display-fix-yellow-carp-wm-clamping.patch-13188 [new file with mode: 0644]
queue-5.16/drm-amdgpu-add-utcl2_harvest-to-gc-10.3.1.patch [new file with mode: 0644]
queue-5.16/drm-amdgpu-add-utcl2_harvest-to-gc-10.3.1.patch-26710 [new file with mode: 0644]
queue-5.16/drm-rockchip-dw_hdmi-do-not-leave-clock-enabled-in-e.patch [new file with mode: 0644]
queue-5.16/drm-rockchip-dw_hdmi-do-not-leave-clock-enabled-in-e.patch-5904 [new file with mode: 0644]
queue-5.16/irqchip-sifive-plic-add-missing-thead-c900-plic-matc.patch [new file with mode: 0644]
queue-5.16/irqchip-sifive-plic-add-missing-thead-c900-plic-matc.patch-13627 [new file with mode: 0644]
queue-5.16/kconfig-fix-failing-to-generate-auto.conf.patch [new file with mode: 0644]
queue-5.16/kconfig-fix-failing-to-generate-auto.conf.patch-1326 [new file with mode: 0644]
queue-5.16/kconfig-let-shell-return-enough-output-for-deep-path.patch [new file with mode: 0644]
queue-5.16/kconfig-let-shell-return-enough-output-for-deep-path.patch-18292 [new file with mode: 0644]
queue-5.16/ksmbd-don-t-align-last-entry-offset-in-smb2-query-di.patch [new file with mode: 0644]
queue-5.16/ksmbd-don-t-align-last-entry-offset-in-smb2-query-di.patch-29174 [new file with mode: 0644]
queue-5.16/ksmbd-fix-same-uniqueid-for-dot-and-dotdot-entries.patch [new file with mode: 0644]
queue-5.16/ksmbd-fix-same-uniqueid-for-dot-and-dotdot-entries.patch-21194 [new file with mode: 0644]
queue-5.16/mm-io_uring-allow-oom-killer-from-io_uring_setup.patch [new file with mode: 0644]
queue-5.16/mm-io_uring-allow-oom-killer-from-io_uring_setup.patch-11403 [new file with mode: 0644]
queue-5.16/net-macb-align-the-dma-and-coherent-dma-masks.patch [new file with mode: 0644]
queue-5.16/net-macb-align-the-dma-and-coherent-dma-masks.patch-4703 [new file with mode: 0644]
queue-5.16/net-usb-qmi_wwan-add-support-for-dell-dw5829e.patch [new file with mode: 0644]
queue-5.16/net-usb-qmi_wwan-add-support-for-dell-dw5829e.patch-32663 [new file with mode: 0644]
queue-5.16/netfilter-conntrack-don-t-refresh-sctp-entries-in-cl.patch [new file with mode: 0644]
queue-5.16/netfilter-conntrack-don-t-refresh-sctp-entries-in-cl.patch-18476 [new file with mode: 0644]
queue-5.16/phy-phy-mtk-tphy-fix-duplicated-argument-in-phy-mtk-.patch [new file with mode: 0644]
queue-5.16/phy-phy-mtk-tphy-fix-duplicated-argument-in-phy-mtk-.patch-25558 [new file with mode: 0644]
queue-5.16/phy-usb-leave-some-clocks-running-during-suspend.patch [new file with mode: 0644]
queue-5.16/phy-usb-leave-some-clocks-running-during-suspend.patch-21382 [new file with mode: 0644]
queue-5.16/pidfd-fix-test-failure-due-to-stack-overflow-on-some.patch [new file with mode: 0644]
queue-5.16/pidfd-fix-test-failure-due-to-stack-overflow-on-some.patch-3045 [new file with mode: 0644]
queue-5.16/selftests-fixup-build-warnings-in-pidfd-clone3-tests.patch [new file with mode: 0644]
queue-5.16/selftests-fixup-build-warnings-in-pidfd-clone3-tests.patch-2103 [new file with mode: 0644]
queue-5.16/series
queue-5.16/soc-aspeed-lpc-ctrl-block-error-printing-on-probe-de.patch [new file with mode: 0644]
queue-5.16/soc-aspeed-lpc-ctrl-block-error-printing-on-probe-de.patch-13796 [new file with mode: 0644]
queue-5.16/staging-vc04_services-fix-rcu-dereference-check.patch [new file with mode: 0644]
queue-5.16/staging-vc04_services-fix-rcu-dereference-check.patch-11599 [new file with mode: 0644]
queue-5.16/tracing-fix-tp_printk-option-related-with-tp_printk_.patch [new file with mode: 0644]
queue-5.16/tracing-fix-tp_printk-option-related-with-tp_printk_.patch-20573 [new file with mode: 0644]
queue-5.16/x86-bug-merge-annotate_reachable-into-_bug_flags-asm.patch [new file with mode: 0644]
queue-5.16/x86-bug-merge-annotate_reachable-into-_bug_flags-asm.patch-9101 [new file with mode: 0644]
queue-5.16/xprtrdma-fix-pointer-derefs-in-error-cases-of-rpcrdm.patch [new file with mode: 0644]
queue-5.16/xprtrdma-fix-pointer-derefs-in-error-cases-of-rpcrdm.patch-22828 [new file with mode: 0644]

diff --git a/queue-5.16/acpi-pm-revert-only-mark-ec-gpe-for-wakeup-on-intel-.patch b/queue-5.16/acpi-pm-revert-only-mark-ec-gpe-for-wakeup-on-intel-.patch
new file mode 100644 (file)
index 0000000..f71f902
--- /dev/null
@@ -0,0 +1,89 @@
+From 046c6862b0a9da3e59513369c890b418912e6975 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <mario.limonciello@amd.com>
+
+[ 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 <mario.limonciello@amd.com>
+Tested-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/acpi-pm-revert-only-mark-ec-gpe-for-wakeup-on-intel-.patch-12858 b/queue-5.16/acpi-pm-revert-only-mark-ec-gpe-for-wakeup-on-intel-.patch-12858
new file mode 100644 (file)
index 0000000..f71f902
--- /dev/null
@@ -0,0 +1,89 @@
+From 046c6862b0a9da3e59513369c890b418912e6975 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <mario.limonciello@amd.com>
+
+[ 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 <mario.limonciello@amd.com>
+Tested-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/arm-omap2-adjust-the-location-of-put_device-call-in-.patch b/queue-5.16/arm-omap2-adjust-the-location-of-put_device-call-in-.patch
new file mode 100644 (file)
index 0000000..ae21365
--- /dev/null
@@ -0,0 +1,43 @@
+From 2b9833f49eddfff752f859136e82ba2caefb5a74 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <ye.guojin@zte.com.cn>
+
+[ 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 <zealci@zte.com.cn>
+Signed-off-by: Ye Guojin <ye.guojin@zte.com.cn>
+Signed-off-by: Tony Lindgren <tony@atomide.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/arm-omap2-adjust-the-location-of-put_device-call-in-.patch-19990 b/queue-5.16/arm-omap2-adjust-the-location-of-put_device-call-in-.patch-19990
new file mode 100644 (file)
index 0000000..ae21365
--- /dev/null
@@ -0,0 +1,43 @@
+From 2b9833f49eddfff752f859136e82ba2caefb5a74 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <ye.guojin@zte.com.cn>
+
+[ 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 <zealci@zte.com.cn>
+Signed-off-by: Ye Guojin <ye.guojin@zte.com.cn>
+Signed-off-by: Tony Lindgren <tony@atomide.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/arm-omap2-hwmod-add-of_node_put-before-break.patch b/queue-5.16/arm-omap2-hwmod-add-of_node_put-before-break.patch
new file mode 100644 (file)
index 0000000..e564b54
--- /dev/null
@@ -0,0 +1,42 @@
+From 8a5bad6d22c3eab41d8056f8ece5d91c77e2256e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 Oct 2021 04:57:19 -0400
+Subject: ARM: OMAP2+: hwmod: Add of_node_put() before break
+
+From: Wan Jiabing <wanjiabing@vivo.com>
+
+[ 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 <wanjiabing@vivo.com>
+Signed-off-by: Tony Lindgren <tony@atomide.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 ccb0e3732c0dc..31d1a21f60416 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.16/arm-omap2-hwmod-add-of_node_put-before-break.patch-3525 b/queue-5.16/arm-omap2-hwmod-add-of_node_put-before-break.patch-3525
new file mode 100644 (file)
index 0000000..e564b54
--- /dev/null
@@ -0,0 +1,42 @@
+From 8a5bad6d22c3eab41d8056f8ece5d91c77e2256e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 Oct 2021 04:57:19 -0400
+Subject: ARM: OMAP2+: hwmod: Add of_node_put() before break
+
+From: Wan Jiabing <wanjiabing@vivo.com>
+
+[ 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 <wanjiabing@vivo.com>
+Signed-off-by: Tony Lindgren <tony@atomide.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 ccb0e3732c0dc..31d1a21f60416 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.16/arm64-dts-meson-g12-add-atf-bl32-reserved-memory-reg.patch b/queue-5.16/arm64-dts-meson-g12-add-atf-bl32-reserved-memory-reg.patch
new file mode 100644 (file)
index 0000000..e038681
--- /dev/null
@@ -0,0 +1,42 @@
+From 4befb25eb856f7904f8e930113c13c477e1eacbd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 26 Jan 2022 04:49:53 +0000
+Subject: arm64: dts: meson-g12: add ATF BL32 reserved-memory region
+
+From: Christian Hewitt <christianshewitt@gmail.com>
+
+[ 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 <christianshewitt@gmail.com>
+Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
+Reviewed-by: Kevin Hilman <khilman@baylibre.com>
+Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
+Link: https://lore.kernel.org/r/20220126044954.19069-3-christianshewitt@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/arm64-dts-meson-g12-add-atf-bl32-reserved-memory-reg.patch-17942 b/queue-5.16/arm64-dts-meson-g12-add-atf-bl32-reserved-memory-reg.patch-17942
new file mode 100644 (file)
index 0000000..e038681
--- /dev/null
@@ -0,0 +1,42 @@
+From 4befb25eb856f7904f8e930113c13c477e1eacbd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 26 Jan 2022 04:49:53 +0000
+Subject: arm64: dts: meson-g12: add ATF BL32 reserved-memory region
+
+From: Christian Hewitt <christianshewitt@gmail.com>
+
+[ 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 <christianshewitt@gmail.com>
+Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
+Reviewed-by: Kevin Hilman <khilman@baylibre.com>
+Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
+Link: https://lore.kernel.org/r/20220126044954.19069-3-christianshewitt@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/arm64-dts-meson-g12-drop-bl32-region-from-sei510-sei.patch b/queue-5.16/arm64-dts-meson-g12-drop-bl32-region-from-sei510-sei.patch
new file mode 100644 (file)
index 0000000..0f1e1b2
--- /dev/null
@@ -0,0 +1,64 @@
+From 1d062ff7de51c26c35fbfdf955f58822a6801bb7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 26 Jan 2022 04:49:54 +0000
+Subject: arm64: dts: meson-g12: drop BL32 region from SEI510/SEI610
+
+From: Christian Hewitt <christianshewitt@gmail.com>
+
+[ 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 <christianshewitt@gmail.com>
+Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
+Reviewed-by: Kevin Hilman <khilman@baylibre.com>
+Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
+Link: https://lore.kernel.org/r/20220126044954.19069-4-christianshewitt@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/arm64-dts-meson-g12-drop-bl32-region-from-sei510-sei.patch-23288 b/queue-5.16/arm64-dts-meson-g12-drop-bl32-region-from-sei510-sei.patch-23288
new file mode 100644 (file)
index 0000000..0f1e1b2
--- /dev/null
@@ -0,0 +1,64 @@
+From 1d062ff7de51c26c35fbfdf955f58822a6801bb7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 26 Jan 2022 04:49:54 +0000
+Subject: arm64: dts: meson-g12: drop BL32 region from SEI510/SEI610
+
+From: Christian Hewitt <christianshewitt@gmail.com>
+
+[ 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 <christianshewitt@gmail.com>
+Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
+Reviewed-by: Kevin Hilman <khilman@baylibre.com>
+Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
+Link: https://lore.kernel.org/r/20220126044954.19069-4-christianshewitt@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/arm64-dts-meson-gx-add-atf-bl32-reserved-memory-regi.patch b/queue-5.16/arm64-dts-meson-gx-add-atf-bl32-reserved-memory-regi.patch
new file mode 100644 (file)
index 0000000..1a2d4a1
--- /dev/null
@@ -0,0 +1,43 @@
+From 41e612f5b6f05eb41849bd43f712cc7142eb9f46 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 26 Jan 2022 04:49:52 +0000
+Subject: arm64: dts: meson-gx: add ATF BL32 reserved-memory region
+
+From: Christian Hewitt <christianshewitt@gmail.com>
+
+[ 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 <kszaquitto@gmail.com>
+Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
+Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
+Reviewed-by: Kevin Hilman <khilman@baylibre.com>
+Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
+Link: https://lore.kernel.org/r/20220126044954.19069-2-christianshewitt@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/arm64-dts-meson-gx-add-atf-bl32-reserved-memory-regi.patch-77 b/queue-5.16/arm64-dts-meson-gx-add-atf-bl32-reserved-memory-regi.patch-77
new file mode 100644 (file)
index 0000000..1a2d4a1
--- /dev/null
@@ -0,0 +1,43 @@
+From 41e612f5b6f05eb41849bd43f712cc7142eb9f46 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 26 Jan 2022 04:49:52 +0000
+Subject: arm64: dts: meson-gx: add ATF BL32 reserved-memory region
+
+From: Christian Hewitt <christianshewitt@gmail.com>
+
+[ 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 <kszaquitto@gmail.com>
+Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
+Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
+Reviewed-by: Kevin Hilman <khilman@baylibre.com>
+Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
+Link: https://lore.kernel.org/r/20220126044954.19069-2-christianshewitt@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/ata-libata-core-disable-trim-on-m88v29.patch b/queue-5.16/ata-libata-core-disable-trim-on-m88v29.patch
new file mode 100644 (file)
index 0000000..898ed0a
--- /dev/null
@@ -0,0 +1,43 @@
+From 2fa76369e9f4d041150587036b9d52bea360ae69 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <zboszor@gmail.com>
+
+[ 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 <zboszor@gmail.com>
+Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 94bc5dbb31e1e..63666ee9de175 100644
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -4079,6 +4079,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.16/ata-libata-core-disable-trim-on-m88v29.patch-950 b/queue-5.16/ata-libata-core-disable-trim-on-m88v29.patch-950
new file mode 100644 (file)
index 0000000..898ed0a
--- /dev/null
@@ -0,0 +1,43 @@
+From 2fa76369e9f4d041150587036b9d52bea360ae69 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <zboszor@gmail.com>
+
+[ 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 <zboszor@gmail.com>
+Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 94bc5dbb31e1e..63666ee9de175 100644
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -4079,6 +4079,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.16/display-amd-decrease-message-verbosity-about-waterma.patch b/queue-5.16/display-amd-decrease-message-verbosity-about-waterma.patch
new file mode 100644 (file)
index 0000000..8f01df3
--- /dev/null
@@ -0,0 +1,43 @@
+From f354b7fa344ce4440c39e1b742be1559b10336e9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 25 Jan 2022 15:49:47 -0600
+Subject: display/amd: decrease message verbosity about watermarks table
+ failure
+
+From: Mario Limonciello <mario.limonciello@amd.com>
+
+[ 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 <harry.wentland@amd.com>
+Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/display-amd-decrease-message-verbosity-about-waterma.patch-30627 b/queue-5.16/display-amd-decrease-message-verbosity-about-waterma.patch-30627
new file mode 100644 (file)
index 0000000..8f01df3
--- /dev/null
@@ -0,0 +1,43 @@
+From f354b7fa344ce4440c39e1b742be1559b10336e9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 25 Jan 2022 15:49:47 -0600
+Subject: display/amd: decrease message verbosity about watermarks table
+ failure
+
+From: Mario Limonciello <mario.limonciello@amd.com>
+
+[ 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 <harry.wentland@amd.com>
+Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/drm-amd-display-cap-pflip-irqs-per-max-otg-number.patch b/queue-5.16/drm-amd-display-cap-pflip-irqs-per-max-otg-number.patch
new file mode 100644 (file)
index 0000000..80af76e
--- /dev/null
@@ -0,0 +1,76 @@
+From 498bb371f6462b7ffa48ad2cacd86425852fe093 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 2 Feb 2022 14:30:09 -0500
+Subject: drm/amd/display: Cap pflip irqs per max otg number
+
+From: Roman Li <Roman.Li@amd.com>
+
+[ 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 <Roman.Li@amd.com>
+Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 efcb25ef1809a..0117b00b4ed83 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+@@ -3629,7 +3629,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 f0fbd8ad56229..e890e063cde31 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
+@@ -1237,6 +1237,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 618e7989176fc..14864763a1881 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc.h
++++ b/drivers/gpu/drm/amd/display/dc/dc.h
+@@ -190,6 +190,7 @@ struct dc_caps {
+ #endif
+       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.16/drm-amd-display-cap-pflip-irqs-per-max-otg-number.patch-15402 b/queue-5.16/drm-amd-display-cap-pflip-irqs-per-max-otg-number.patch-15402
new file mode 100644 (file)
index 0000000..80af76e
--- /dev/null
@@ -0,0 +1,76 @@
+From 498bb371f6462b7ffa48ad2cacd86425852fe093 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 2 Feb 2022 14:30:09 -0500
+Subject: drm/amd/display: Cap pflip irqs per max otg number
+
+From: Roman Li <Roman.Li@amd.com>
+
+[ 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 <Roman.Li@amd.com>
+Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 efcb25ef1809a..0117b00b4ed83 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+@@ -3629,7 +3629,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 f0fbd8ad56229..e890e063cde31 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
+@@ -1237,6 +1237,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 618e7989176fc..14864763a1881 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc.h
++++ b/drivers/gpu/drm/amd/display/dc/dc.h
+@@ -190,6 +190,7 @@ struct dc_caps {
+ #endif
+       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.16/drm-amd-display-fix-yellow-carp-wm-clamping.patch b/queue-5.16/drm-amd-display-fix-yellow-carp-wm-clamping.patch
new file mode 100644 (file)
index 0000000..8a10740
--- /dev/null
@@ -0,0 +1,293 @@
+From 7b1b422e2302968ed901084cfea2ee3d4067a256 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Jan 2022 11:55:49 -0500
+Subject: drm/amd/display: fix yellow carp wm clamping
+
+From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+
+[ Upstream commit 60fdf98a774eee244a4e00c34a9e7729b61d0f44 ]
+
+Fix clamping to match register field size
+
+Reviewed-by: Charlene Liu <Charlene.Liu@amd.com>
+Acked-by: Jasdeep Dhillon <jdhillon@amd.com>
+Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../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.16/drm-amd-display-fix-yellow-carp-wm-clamping.patch-13188 b/queue-5.16/drm-amd-display-fix-yellow-carp-wm-clamping.patch-13188
new file mode 100644 (file)
index 0000000..8a10740
--- /dev/null
@@ -0,0 +1,293 @@
+From 7b1b422e2302968ed901084cfea2ee3d4067a256 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Jan 2022 11:55:49 -0500
+Subject: drm/amd/display: fix yellow carp wm clamping
+
+From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+
+[ Upstream commit 60fdf98a774eee244a4e00c34a9e7729b61d0f44 ]
+
+Fix clamping to match register field size
+
+Reviewed-by: Charlene Liu <Charlene.Liu@amd.com>
+Acked-by: Jasdeep Dhillon <jdhillon@amd.com>
+Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../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.16/drm-amdgpu-add-utcl2_harvest-to-gc-10.3.1.patch b/queue-5.16/drm-amdgpu-add-utcl2_harvest-to-gc-10.3.1.patch
new file mode 100644 (file)
index 0000000..04ccfc6
--- /dev/null
@@ -0,0 +1,47 @@
+From a6bc80db0d4f6d0c8cb3703c44c5118e01e5294a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 29 Jan 2022 09:21:31 +0800
+Subject: drm/amdgpu: add utcl2_harvest to gc 10.3.1
+
+From: Aaron Liu <aaron.liu@amd.com>
+
+[ Upstream commit a072312f43c33ea02ad88bff3375f650684a6f24 ]
+
+Confirmed with hardware team, there is harvesting for gc 10.3.1.
+
+Signed-off-by: Aaron Liu <aaron.liu@amd.com>
+Reviewed-by: Huang Rui <ray.huang@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c
+index b4eddf6e98a6a..ff738e9725ee8 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c
++++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c
+@@ -543,7 +543,9 @@ static void gfxhub_v2_1_utcl2_harvest(struct amdgpu_device *adev)
+               adev->gfx.config.max_sh_per_se *
+               adev->gfx.config.max_shader_engines);
+-      if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 3)) {
++      switch (adev->ip_versions[GC_HWIP][0]) {
++      case IP_VERSION(10, 3, 1):
++      case IP_VERSION(10, 3, 3):
+               /* Get SA disabled bitmap from eFuse setting */
+               efuse_setting = RREG32_SOC15(GC, 0, mmCC_GC_SA_UNIT_DISABLE);
+               efuse_setting &= CC_GC_SA_UNIT_DISABLE__SA_DISABLE_MASK;
+@@ -566,6 +568,9 @@ static void gfxhub_v2_1_utcl2_harvest(struct amdgpu_device *adev)
+               disabled_sa = tmp;
+               WREG32_SOC15(GC, 0, mmGCUTCL2_HARVEST_BYPASS_GROUPS_YELLOW_CARP, disabled_sa);
++              break;
++      default:
++              break;
+       }
+ }
+-- 
+2.34.1
+
diff --git a/queue-5.16/drm-amdgpu-add-utcl2_harvest-to-gc-10.3.1.patch-26710 b/queue-5.16/drm-amdgpu-add-utcl2_harvest-to-gc-10.3.1.patch-26710
new file mode 100644 (file)
index 0000000..04ccfc6
--- /dev/null
@@ -0,0 +1,47 @@
+From a6bc80db0d4f6d0c8cb3703c44c5118e01e5294a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 29 Jan 2022 09:21:31 +0800
+Subject: drm/amdgpu: add utcl2_harvest to gc 10.3.1
+
+From: Aaron Liu <aaron.liu@amd.com>
+
+[ Upstream commit a072312f43c33ea02ad88bff3375f650684a6f24 ]
+
+Confirmed with hardware team, there is harvesting for gc 10.3.1.
+
+Signed-off-by: Aaron Liu <aaron.liu@amd.com>
+Reviewed-by: Huang Rui <ray.huang@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c
+index b4eddf6e98a6a..ff738e9725ee8 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c
++++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c
+@@ -543,7 +543,9 @@ static void gfxhub_v2_1_utcl2_harvest(struct amdgpu_device *adev)
+               adev->gfx.config.max_sh_per_se *
+               adev->gfx.config.max_shader_engines);
+-      if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 3)) {
++      switch (adev->ip_versions[GC_HWIP][0]) {
++      case IP_VERSION(10, 3, 1):
++      case IP_VERSION(10, 3, 3):
+               /* Get SA disabled bitmap from eFuse setting */
+               efuse_setting = RREG32_SOC15(GC, 0, mmCC_GC_SA_UNIT_DISABLE);
+               efuse_setting &= CC_GC_SA_UNIT_DISABLE__SA_DISABLE_MASK;
+@@ -566,6 +568,9 @@ static void gfxhub_v2_1_utcl2_harvest(struct amdgpu_device *adev)
+               disabled_sa = tmp;
+               WREG32_SOC15(GC, 0, mmGCUTCL2_HARVEST_BYPASS_GROUPS_YELLOW_CARP, disabled_sa);
++              break;
++      default:
++              break;
+       }
+ }
+-- 
+2.34.1
+
diff --git a/queue-5.16/drm-rockchip-dw_hdmi-do-not-leave-clock-enabled-in-e.patch b/queue-5.16/drm-rockchip-dw_hdmi-do-not-leave-clock-enabled-in-e.patch
new file mode 100644 (file)
index 0000000..904e274
--- /dev/null
@@ -0,0 +1,56 @@
+From 4cc0a4681c544ed70c7e1f248e87ed7be060cec2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <s.hauer@pengutronix.de>
+
+[ 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 <s.hauer@pengutronix.de>
+Signed-off-by: Heiko Stuebner <heiko@sntech.de>
+Link: https://patchwork.freedesktop.org/patch/msgid/20220126145549.617165-3-s.hauer@pengutronix.de
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/drm-rockchip-dw_hdmi-do-not-leave-clock-enabled-in-e.patch-5904 b/queue-5.16/drm-rockchip-dw_hdmi-do-not-leave-clock-enabled-in-e.patch-5904
new file mode 100644 (file)
index 0000000..904e274
--- /dev/null
@@ -0,0 +1,56 @@
+From 4cc0a4681c544ed70c7e1f248e87ed7be060cec2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <s.hauer@pengutronix.de>
+
+[ 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 <s.hauer@pengutronix.de>
+Signed-off-by: Heiko Stuebner <heiko@sntech.de>
+Link: https://patchwork.freedesktop.org/patch/msgid/20220126145549.617165-3-s.hauer@pengutronix.de
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/irqchip-sifive-plic-add-missing-thead-c900-plic-matc.patch b/queue-5.16/irqchip-sifive-plic-add-missing-thead-c900-plic-matc.patch
new file mode 100644 (file)
index 0000000..ceecc6b
--- /dev/null
@@ -0,0 +1,49 @@
+From 3b83881672550b0e567fba70502ebf0cee2c2375 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 30 Jan 2022 21:56:34 +0800
+Subject: irqchip/sifive-plic: Add missing thead,c900-plic match string
+
+From: Guo Ren <guoren@linux.alibaba.com>
+
+[ 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 <guoren@linux.alibaba.com>
+Cc: Anup Patel <anup@brainfault.org>
+Cc: Marc Zyngier <maz@kernel.org>
+Cc: Palmer Dabbelt <palmer@dabbelt.com>
+Cc: Samuel Holland <samuel@sholland.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Tested-by: Samuel Holland <samuel@sholland.org>
+Signed-off-by: Marc Zyngier <maz@kernel.org>
+Link: https://lore.kernel.org/r/20220130135634.1213301-3-guoren@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/irqchip-sifive-plic-add-missing-thead-c900-plic-matc.patch-13627 b/queue-5.16/irqchip-sifive-plic-add-missing-thead-c900-plic-matc.patch-13627
new file mode 100644 (file)
index 0000000..ceecc6b
--- /dev/null
@@ -0,0 +1,49 @@
+From 3b83881672550b0e567fba70502ebf0cee2c2375 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 30 Jan 2022 21:56:34 +0800
+Subject: irqchip/sifive-plic: Add missing thead,c900-plic match string
+
+From: Guo Ren <guoren@linux.alibaba.com>
+
+[ 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 <guoren@linux.alibaba.com>
+Cc: Anup Patel <anup@brainfault.org>
+Cc: Marc Zyngier <maz@kernel.org>
+Cc: Palmer Dabbelt <palmer@dabbelt.com>
+Cc: Samuel Holland <samuel@sholland.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Tested-by: Samuel Holland <samuel@sholland.org>
+Signed-off-by: Marc Zyngier <maz@kernel.org>
+Link: https://lore.kernel.org/r/20220130135634.1213301-3-guoren@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/kconfig-fix-failing-to-generate-auto.conf.patch b/queue-5.16/kconfig-fix-failing-to-generate-auto.conf.patch
new file mode 100644 (file)
index 0000000..0c28f46
--- /dev/null
@@ -0,0 +1,52 @@
+From 6207d6ff477414add5af63b8fd1a277099a50fdf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 11 Feb 2022 17:27:36 +0800
+Subject: kconfig: fix failing to generate auto.conf
+
+From: Jing Leng <jleng@ambarella.com>
+
+[ 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 <jleng@ambarella.com>
+Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 00284c03da4d3..027f4c28dc320 100644
+--- a/scripts/kconfig/confdata.c
++++ b/scripts/kconfig/confdata.c
+@@ -992,14 +992,19 @@ static int conf_write_autoconf_cmd(const char *autoconf_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.16/kconfig-fix-failing-to-generate-auto.conf.patch-1326 b/queue-5.16/kconfig-fix-failing-to-generate-auto.conf.patch-1326
new file mode 100644 (file)
index 0000000..0c28f46
--- /dev/null
@@ -0,0 +1,52 @@
+From 6207d6ff477414add5af63b8fd1a277099a50fdf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 11 Feb 2022 17:27:36 +0800
+Subject: kconfig: fix failing to generate auto.conf
+
+From: Jing Leng <jleng@ambarella.com>
+
+[ 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 <jleng@ambarella.com>
+Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 00284c03da4d3..027f4c28dc320 100644
+--- a/scripts/kconfig/confdata.c
++++ b/scripts/kconfig/confdata.c
+@@ -992,14 +992,19 @@ static int conf_write_autoconf_cmd(const char *autoconf_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.16/kconfig-let-shell-return-enough-output-for-deep-path.patch b/queue-5.16/kconfig-let-shell-return-enough-output-for-deep-path.patch
new file mode 100644 (file)
index 0000000..ecf7f62
--- /dev/null
@@ -0,0 +1,43 @@
+From 3c6282ed0945fa3c3190d6a804e47183360e7c70 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 28 Jan 2022 16:01:28 -0600
+Subject: kconfig: let 'shell' return enough output for deep path names
+
+From: Brenda Streiff <brenda.streiff@ni.com>
+
+[ 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 <brenda.streiff@ni.com>
+Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/kconfig-let-shell-return-enough-output-for-deep-path.patch-18292 b/queue-5.16/kconfig-let-shell-return-enough-output-for-deep-path.patch-18292
new file mode 100644 (file)
index 0000000..ecf7f62
--- /dev/null
@@ -0,0 +1,43 @@
+From 3c6282ed0945fa3c3190d6a804e47183360e7c70 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 28 Jan 2022 16:01:28 -0600
+Subject: kconfig: let 'shell' return enough output for deep path names
+
+From: Brenda Streiff <brenda.streiff@ni.com>
+
+[ 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 <brenda.streiff@ni.com>
+Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/ksmbd-don-t-align-last-entry-offset-in-smb2-query-di.patch b/queue-5.16/ksmbd-don-t-align-last-entry-offset-in-smb2-query-di.patch
new file mode 100644 (file)
index 0000000..473c3b9
--- /dev/null
@@ -0,0 +1,61 @@
+From 9cf37104f4309cd7e35331d1c72b5c9a95d25a9b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 30 Jan 2022 18:31:01 +0900
+Subject: ksmbd: don't align last entry offset in smb2 query directory
+
+From: Namjae Jeon <linkinjeon@kernel.org>
+
+[ 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 <linkinjeon@kernel.org>
+Signed-off-by: Steve French <stfrench@microsoft.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 1ff1e52f398fc..cbbbccdc5a0a5 100644
+--- a/fs/ksmbd/smb2pdu.c
++++ b/fs/ksmbd/smb2pdu.c
+@@ -3423,9 +3423,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;
+@@ -3977,6 +3977,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 adf94a4f22fa6..8c37aaf936ab1 100644
+--- a/fs/ksmbd/vfs.h
++++ b/fs/ksmbd/vfs.h
+@@ -47,6 +47,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.16/ksmbd-don-t-align-last-entry-offset-in-smb2-query-di.patch-29174 b/queue-5.16/ksmbd-don-t-align-last-entry-offset-in-smb2-query-di.patch-29174
new file mode 100644 (file)
index 0000000..473c3b9
--- /dev/null
@@ -0,0 +1,61 @@
+From 9cf37104f4309cd7e35331d1c72b5c9a95d25a9b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 30 Jan 2022 18:31:01 +0900
+Subject: ksmbd: don't align last entry offset in smb2 query directory
+
+From: Namjae Jeon <linkinjeon@kernel.org>
+
+[ 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 <linkinjeon@kernel.org>
+Signed-off-by: Steve French <stfrench@microsoft.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 1ff1e52f398fc..cbbbccdc5a0a5 100644
+--- a/fs/ksmbd/smb2pdu.c
++++ b/fs/ksmbd/smb2pdu.c
+@@ -3423,9 +3423,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;
+@@ -3977,6 +3977,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 adf94a4f22fa6..8c37aaf936ab1 100644
+--- a/fs/ksmbd/vfs.h
++++ b/fs/ksmbd/vfs.h
+@@ -47,6 +47,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.16/ksmbd-fix-same-uniqueid-for-dot-and-dotdot-entries.patch b/queue-5.16/ksmbd-fix-same-uniqueid-for-dot-and-dotdot-entries.patch
new file mode 100644 (file)
index 0000000..2c14a17
--- /dev/null
@@ -0,0 +1,54 @@
+From ffca0b8b0b0be4438711ad691f31330e7c837e9b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 30 Jan 2022 18:28:56 +0900
+Subject: ksmbd: fix same UniqueId for dot and dotdot entries
+
+From: Namjae Jeon <linkinjeon@kernel.org>
+
+[ 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 <linkinjeon@kernel.org>
+Signed-off-by: Steve French <stfrench@microsoft.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 ef7f42b0290a8..9a7e211dbf4f4 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.16/ksmbd-fix-same-uniqueid-for-dot-and-dotdot-entries.patch-21194 b/queue-5.16/ksmbd-fix-same-uniqueid-for-dot-and-dotdot-entries.patch-21194
new file mode 100644 (file)
index 0000000..2c14a17
--- /dev/null
@@ -0,0 +1,54 @@
+From ffca0b8b0b0be4438711ad691f31330e7c837e9b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 30 Jan 2022 18:28:56 +0900
+Subject: ksmbd: fix same UniqueId for dot and dotdot entries
+
+From: Namjae Jeon <linkinjeon@kernel.org>
+
+[ 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 <linkinjeon@kernel.org>
+Signed-off-by: Steve French <stfrench@microsoft.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 ef7f42b0290a8..9a7e211dbf4f4 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.16/mm-io_uring-allow-oom-killer-from-io_uring_setup.patch b/queue-5.16/mm-io_uring-allow-oom-killer-from-io_uring_setup.patch
new file mode 100644 (file)
index 0000000..84d6947
--- /dev/null
@@ -0,0 +1,45 @@
+From 9e8785938dda58176e7af4cf5a9488c24b8649c9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Jan 2022 21:17:36 -0800
+Subject: mm: io_uring: allow oom-killer from io_uring_setup
+
+From: Shakeel Butt <shakeelb@google.com>
+
+[ 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 <shakeelb@google.com>
+Link: https://lore.kernel.org/r/20220125051736.2981459-1-shakeelb@google.com
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 698db7fb62e06..a92f276f21d9c 100644
+--- a/fs/io_uring.c
++++ b/fs/io_uring.c
+@@ -8872,10 +8872,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.16/mm-io_uring-allow-oom-killer-from-io_uring_setup.patch-11403 b/queue-5.16/mm-io_uring-allow-oom-killer-from-io_uring_setup.patch-11403
new file mode 100644 (file)
index 0000000..84d6947
--- /dev/null
@@ -0,0 +1,45 @@
+From 9e8785938dda58176e7af4cf5a9488c24b8649c9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Jan 2022 21:17:36 -0800
+Subject: mm: io_uring: allow oom-killer from io_uring_setup
+
+From: Shakeel Butt <shakeelb@google.com>
+
+[ 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 <shakeelb@google.com>
+Link: https://lore.kernel.org/r/20220125051736.2981459-1-shakeelb@google.com
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 698db7fb62e06..a92f276f21d9c 100644
+--- a/fs/io_uring.c
++++ b/fs/io_uring.c
+@@ -8872,10 +8872,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.16/net-macb-align-the-dma-and-coherent-dma-masks.patch b/queue-5.16/net-macb-align-the-dma-and-coherent-dma-masks.patch
new file mode 100644 (file)
index 0000000..80dfb4c
--- /dev/null
@@ -0,0 +1,51 @@
+From f765373a9a4fe0646cf9a6dbf2c88d5b2ba40acc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 9 Feb 2022 15:13:25 +0530
+Subject: net: macb: Align the dma and coherent dma masks
+
+From: Marc St-Amand <mstamand@ciena.com>
+
+[ 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 <mstamand@ciena.com>
+Signed-off-by: Harini Katakam <harini.katakam@xilinx.com>
+Acked-by: Nicolas Ferre <nicolas.ferre@microchip.com>
+Tested-by: Conor Dooley <conor.dooley@microchip.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 ffce528aa00e4..aac1b27bfc7bf 100644
+--- a/drivers/net/ethernet/cadence/macb_main.c
++++ b/drivers/net/ethernet/cadence/macb_main.c
+@@ -4749,7 +4749,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.16/net-macb-align-the-dma-and-coherent-dma-masks.patch-4703 b/queue-5.16/net-macb-align-the-dma-and-coherent-dma-masks.patch-4703
new file mode 100644 (file)
index 0000000..80dfb4c
--- /dev/null
@@ -0,0 +1,51 @@
+From f765373a9a4fe0646cf9a6dbf2c88d5b2ba40acc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 9 Feb 2022 15:13:25 +0530
+Subject: net: macb: Align the dma and coherent dma masks
+
+From: Marc St-Amand <mstamand@ciena.com>
+
+[ 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 <mstamand@ciena.com>
+Signed-off-by: Harini Katakam <harini.katakam@xilinx.com>
+Acked-by: Nicolas Ferre <nicolas.ferre@microchip.com>
+Tested-by: Conor Dooley <conor.dooley@microchip.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 ffce528aa00e4..aac1b27bfc7bf 100644
+--- a/drivers/net/ethernet/cadence/macb_main.c
++++ b/drivers/net/ethernet/cadence/macb_main.c
+@@ -4749,7 +4749,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.16/net-usb-qmi_wwan-add-support-for-dell-dw5829e.patch b/queue-5.16/net-usb-qmi_wwan-add-support-for-dell-dw5829e.patch
new file mode 100644 (file)
index 0000000..534be5c
--- /dev/null
@@ -0,0 +1,70 @@
+From 3f85bd6eb126103632e15241fb6a8d2b554b2b10 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <slark_xiao@163.com>
+
+[ 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 <slark_xiao@163.com>
+Acked-by: Bjørn Mork <bjorn@mork.no>
+Link: https://lore.kernel.org/r/20220209024717.8564-1-slark_xiao@163.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 f510e82194705..2f2abc42cecea 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -1399,6 +1399,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.16/net-usb-qmi_wwan-add-support-for-dell-dw5829e.patch-32663 b/queue-5.16/net-usb-qmi_wwan-add-support-for-dell-dw5829e.patch-32663
new file mode 100644 (file)
index 0000000..534be5c
--- /dev/null
@@ -0,0 +1,70 @@
+From 3f85bd6eb126103632e15241fb6a8d2b554b2b10 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <slark_xiao@163.com>
+
+[ 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 <slark_xiao@163.com>
+Acked-by: Bjørn Mork <bjorn@mork.no>
+Link: https://lore.kernel.org/r/20220209024717.8564-1-slark_xiao@163.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 f510e82194705..2f2abc42cecea 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -1399,6 +1399,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.16/netfilter-conntrack-don-t-refresh-sctp-entries-in-cl.patch b/queue-5.16/netfilter-conntrack-don-t-refresh-sctp-entries-in-cl.patch
new file mode 100644 (file)
index 0000000..33a22a2
--- /dev/null
@@ -0,0 +1,55 @@
+From ad06dac9865ae39e15c4b3bc3d0e13e20023f9f3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 28 Jan 2022 13:13:32 +0100
+Subject: netfilter: conntrack: don't refresh sctp entries in closed state
+
+From: Florian Westphal <fw@strlen.de>
+
+[ 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 <vivek.thrivikraman@est.tech>
+Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=1579
+Signed-off-by: Florian Westphal <fw@strlen.de>
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/netfilter-conntrack-don-t-refresh-sctp-entries-in-cl.patch-18476 b/queue-5.16/netfilter-conntrack-don-t-refresh-sctp-entries-in-cl.patch-18476
new file mode 100644 (file)
index 0000000..33a22a2
--- /dev/null
@@ -0,0 +1,55 @@
+From ad06dac9865ae39e15c4b3bc3d0e13e20023f9f3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 28 Jan 2022 13:13:32 +0100
+Subject: netfilter: conntrack: don't refresh sctp entries in closed state
+
+From: Florian Westphal <fw@strlen.de>
+
+[ 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 <vivek.thrivikraman@est.tech>
+Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=1579
+Signed-off-by: Florian Westphal <fw@strlen.de>
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/phy-phy-mtk-tphy-fix-duplicated-argument-in-phy-mtk-.patch b/queue-5.16/phy-phy-mtk-tphy-fix-duplicated-argument-in-phy-mtk-.patch
new file mode 100644 (file)
index 0000000..778d970
--- /dev/null
@@ -0,0 +1,40 @@
+From bf8880b3bcfe1c728b4c51e33c6d966f0727f40e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 7 Jan 2022 10:50:50 +0800
+Subject: phy: phy-mtk-tphy: Fix duplicated argument in phy-mtk-tphy
+
+From: Wan Jiabing <wanjiabing@vivo.com>
+
+[ 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 <wanjiabing@vivo.com>
+Acked-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
+Link: https://lore.kernel.org/r/20220107025050.787720-1-wanjiabing@vivo.com
+Signed-off-by: Vinod Koul <vkoul@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/phy-phy-mtk-tphy-fix-duplicated-argument-in-phy-mtk-.patch-25558 b/queue-5.16/phy-phy-mtk-tphy-fix-duplicated-argument-in-phy-mtk-.patch-25558
new file mode 100644 (file)
index 0000000..778d970
--- /dev/null
@@ -0,0 +1,40 @@
+From bf8880b3bcfe1c728b4c51e33c6d966f0727f40e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 7 Jan 2022 10:50:50 +0800
+Subject: phy: phy-mtk-tphy: Fix duplicated argument in phy-mtk-tphy
+
+From: Wan Jiabing <wanjiabing@vivo.com>
+
+[ 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 <wanjiabing@vivo.com>
+Acked-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
+Link: https://lore.kernel.org/r/20220107025050.787720-1-wanjiabing@vivo.com
+Signed-off-by: Vinod Koul <vkoul@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/phy-usb-leave-some-clocks-running-during-suspend.patch b/queue-5.16/phy-usb-leave-some-clocks-running-during-suspend.patch
new file mode 100644 (file)
index 0000000..7dccbbb
--- /dev/null
@@ -0,0 +1,135 @@
+From 82b2900ec8996cd651f5b444423eb218a53fc186 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 1 Dec 2021 13:06:51 -0500
+Subject: phy: usb: Leave some clocks running during suspend
+
+From: Al Cooper <alcooperx@gmail.com>
+
+[ 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 <alcooperx@gmail.com>
+Acked-by: Florian Fainelli <f.fainelli@gmail.com>
+Link: https://lore.kernel.org/r/20211201180653.35097-2-alcooperx@gmail.com
+Signed-off-by: Vinod Koul <vkoul@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <linux/soc/brcmstb/brcmstb.h>
+ #include <dt-bindings/phy/phy.h>
+ #include <linux/mfd/syscon.h>
++#include <linux/suspend.h>
+ #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.16/phy-usb-leave-some-clocks-running-during-suspend.patch-21382 b/queue-5.16/phy-usb-leave-some-clocks-running-during-suspend.patch-21382
new file mode 100644 (file)
index 0000000..7dccbbb
--- /dev/null
@@ -0,0 +1,135 @@
+From 82b2900ec8996cd651f5b444423eb218a53fc186 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 1 Dec 2021 13:06:51 -0500
+Subject: phy: usb: Leave some clocks running during suspend
+
+From: Al Cooper <alcooperx@gmail.com>
+
+[ 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 <alcooperx@gmail.com>
+Acked-by: Florian Fainelli <f.fainelli@gmail.com>
+Link: https://lore.kernel.org/r/20211201180653.35097-2-alcooperx@gmail.com
+Signed-off-by: Vinod Koul <vkoul@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <linux/soc/brcmstb/brcmstb.h>
+ #include <dt-bindings/phy/phy.h>
+ #include <linux/mfd/syscon.h>
++#include <linux/suspend.h>
+ #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.16/pidfd-fix-test-failure-due-to-stack-overflow-on-some.patch b/queue-5.16/pidfd-fix-test-failure-due-to-stack-overflow-on-some.patch
new file mode 100644 (file)
index 0000000..39a3503
--- /dev/null
@@ -0,0 +1,148 @@
+From ed7009f08f9612ed8a2522ac9c7f8e1080cd5644 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Jan 2022 13:29:51 -0800
+Subject: pidfd: fix test failure due to stack overflow on some arches
+
+From: Axel Rasmussen <axelrasmussen@google.com>
+
+[ 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 <axelrasmussen@google.com>
+Acked-by: Christian Brauner <brauner@kernel.org>
+Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <string.h>
+ #include <syscall.h>
+ #include <sys/wait.h>
++#include <sys/mman.h>
+ #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.16/pidfd-fix-test-failure-due-to-stack-overflow-on-some.patch-3045 b/queue-5.16/pidfd-fix-test-failure-due-to-stack-overflow-on-some.patch-3045
new file mode 100644 (file)
index 0000000..39a3503
--- /dev/null
@@ -0,0 +1,148 @@
+From ed7009f08f9612ed8a2522ac9c7f8e1080cd5644 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Jan 2022 13:29:51 -0800
+Subject: pidfd: fix test failure due to stack overflow on some arches
+
+From: Axel Rasmussen <axelrasmussen@google.com>
+
+[ 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 <axelrasmussen@google.com>
+Acked-by: Christian Brauner <brauner@kernel.org>
+Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <string.h>
+ #include <syscall.h>
+ #include <sys/wait.h>
++#include <sys/mman.h>
+ #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.16/selftests-fixup-build-warnings-in-pidfd-clone3-tests.patch b/queue-5.16/selftests-fixup-build-warnings-in-pidfd-clone3-tests.patch
new file mode 100644 (file)
index 0000000..f3b0622
--- /dev/null
@@ -0,0 +1,105 @@
+From e24b19429a02047169cb6e117fddf28d6648fb69 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Jan 2022 14:11:15 -0800
+Subject: selftests: fixup build warnings in pidfd / clone3 tests
+
+From: Axel Rasmussen <axelrasmussen@google.com>
+
+[ 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 <axelrasmussen@google.com>
+Acked-by: Christian Brauner <brauner@kernel.org>
+Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/selftests-fixup-build-warnings-in-pidfd-clone3-tests.patch-2103 b/queue-5.16/selftests-fixup-build-warnings-in-pidfd-clone3-tests.patch-2103
new file mode 100644 (file)
index 0000000..f3b0622
--- /dev/null
@@ -0,0 +1,105 @@
+From e24b19429a02047169cb6e117fddf28d6648fb69 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Jan 2022 14:11:15 -0800
+Subject: selftests: fixup build warnings in pidfd / clone3 tests
+
+From: Axel Rasmussen <axelrasmussen@google.com>
+
+[ 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 <axelrasmussen@google.com>
+Acked-by: Christian Brauner <brauner@kernel.org>
+Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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
+
index 36398adc8231c61ec1f4d2adce3853eb86b0b2eb..6eeac51a01008255461f6674b076b4651f41158e 100644 (file)
@@ -173,3 +173,63 @@ drivers-hv-vmbus-fix-memory-leak-in-vmbus_add_channe.patch
 kvm-x86-pmu-refactoring-find_arch_event-to-pmc_perf_.patch
 kvm-x86-pmu-don-t-truncate-the-perfevtseln-msr-when-.patch
 kvm-x86-pmu-use-amd64_raw_event_mask-for-perf_type_r.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-amdgpu-add-utcl2_harvest-to-gc-10.3.1.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-3525
+arm-omap2-adjust-the-location-of-put_device-call-in-.patch-19990
+phy-usb-leave-some-clocks-running-during-suspend.patch-21382
+staging-vc04_services-fix-rcu-dereference-check.patch-11599
+phy-phy-mtk-tphy-fix-duplicated-argument-in-phy-mtk-.patch-25558
+irqchip-sifive-plic-add-missing-thead-c900-plic-matc.patch-13627
+x86-bug-merge-annotate_reachable-into-_bug_flags-asm.patch-9101
+netfilter-conntrack-don-t-refresh-sctp-entries-in-cl.patch-18476
+ksmbd-fix-same-uniqueid-for-dot-and-dotdot-entries.patch-21194
+ksmbd-don-t-align-last-entry-offset-in-smb2-query-di.patch-29174
+arm64-dts-meson-gx-add-atf-bl32-reserved-memory-regi.patch-77
+arm64-dts-meson-g12-add-atf-bl32-reserved-memory-reg.patch-17942
+arm64-dts-meson-g12-drop-bl32-region-from-sei510-sei.patch-23288
+pidfd-fix-test-failure-due-to-stack-overflow-on-some.patch-3045
+selftests-fixup-build-warnings-in-pidfd-clone3-tests.patch-2103
+mm-io_uring-allow-oom-killer-from-io_uring_setup.patch-11403
+acpi-pm-revert-only-mark-ec-gpe-for-wakeup-on-intel-.patch-12858
+kconfig-let-shell-return-enough-output-for-deep-path.patch-18292
+ata-libata-core-disable-trim-on-m88v29.patch-950
+soc-aspeed-lpc-ctrl-block-error-printing-on-probe-de.patch-13796
+xprtrdma-fix-pointer-derefs-in-error-cases-of-rpcrdm.patch-22828
+drm-rockchip-dw_hdmi-do-not-leave-clock-enabled-in-e.patch-5904
+tracing-fix-tp_printk-option-related-with-tp_printk_.patch-20573
+display-amd-decrease-message-verbosity-about-waterma.patch-30627
+drm-amdgpu-add-utcl2_harvest-to-gc-10.3.1.patch-26710
+drm-amd-display-cap-pflip-irqs-per-max-otg-number.patch-15402
+drm-amd-display-fix-yellow-carp-wm-clamping.patch-13188
+net-usb-qmi_wwan-add-support-for-dell-dw5829e.patch-32663
+net-macb-align-the-dma-and-coherent-dma-masks.patch-4703
+kconfig-fix-failing-to-generate-auto.conf.patch-1326
diff --git a/queue-5.16/soc-aspeed-lpc-ctrl-block-error-printing-on-probe-de.patch b/queue-5.16/soc-aspeed-lpc-ctrl-block-error-printing-on-probe-de.patch
new file mode 100644 (file)
index 0000000..91f0213
--- /dev/null
@@ -0,0 +1,46 @@
+From 09f21e72eb674c77f1e8b94596e03141a83b0277 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <jae.hyun.yoo@linux.intel.com>
+
+[ 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 <jae.hyun.yoo@linux.intel.com>
+Signed-off-by: Joel Stanley <joel@jms.id.au>
+Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
+Reviewed-by: Iwona Winiarska <iwona.winiarska@intel.com>
+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 <arnd@arndb.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/soc-aspeed-lpc-ctrl-block-error-printing-on-probe-de.patch-13796 b/queue-5.16/soc-aspeed-lpc-ctrl-block-error-printing-on-probe-de.patch-13796
new file mode 100644 (file)
index 0000000..91f0213
--- /dev/null
@@ -0,0 +1,46 @@
+From 09f21e72eb674c77f1e8b94596e03141a83b0277 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <jae.hyun.yoo@linux.intel.com>
+
+[ 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 <jae.hyun.yoo@linux.intel.com>
+Signed-off-by: Joel Stanley <joel@jms.id.au>
+Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
+Reviewed-by: Iwona Winiarska <iwona.winiarska@intel.com>
+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 <arnd@arndb.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/staging-vc04_services-fix-rcu-dereference-check.patch b/queue-5.16/staging-vc04_services-fix-rcu-dereference-check.patch
new file mode 100644 (file)
index 0000000..c483d11
--- /dev/null
@@ -0,0 +1,119 @@
+From d574fb45b96d7b1604065444f4b7e2686adf9920 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 31 Dec 2021 20:54:03 +0100
+Subject: staging: vc04_services: Fix RCU dereference check
+
+From: Padmanabha Srinivasaiah <treasure4paddy@gmail.com>
+
+[ 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 <stefan.wahren@i2se.com>
+Signed-off-by: Padmanabha Srinivasaiah <treasure4paddy@gmail.com>
+Link: https://lore.kernel.org/r/20211231195406.5479-1-treasure4paddy@gmail.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../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 c650a32bcedff..b9505bb51f45c 100644
+--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
++++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
+@@ -1058,15 +1058,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",
+@@ -1097,6 +1109,7 @@ service_callback(enum vchiq_reason reason, struct vchiq_header *header,
+                                                       bulk_userdata);
+                               if (status != VCHIQ_SUCCESS) {
+                                       DEBUG_TRACE(SERVICE_CALLBACK_LINE);
++                                      vchiq_service_put(service);
+                                       return status;
+                               }
+                       }
+@@ -1105,10 +1118,12 @@ service_callback(enum vchiq_reason reason, struct vchiq_header *header,
+                       if (wait_for_completion_interruptible(&user_service->remove_event)) {
+                               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);
+@@ -1137,6 +1152,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.16/staging-vc04_services-fix-rcu-dereference-check.patch-11599 b/queue-5.16/staging-vc04_services-fix-rcu-dereference-check.patch-11599
new file mode 100644 (file)
index 0000000..c483d11
--- /dev/null
@@ -0,0 +1,119 @@
+From d574fb45b96d7b1604065444f4b7e2686adf9920 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 31 Dec 2021 20:54:03 +0100
+Subject: staging: vc04_services: Fix RCU dereference check
+
+From: Padmanabha Srinivasaiah <treasure4paddy@gmail.com>
+
+[ 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 <stefan.wahren@i2se.com>
+Signed-off-by: Padmanabha Srinivasaiah <treasure4paddy@gmail.com>
+Link: https://lore.kernel.org/r/20211231195406.5479-1-treasure4paddy@gmail.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../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 c650a32bcedff..b9505bb51f45c 100644
+--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
++++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
+@@ -1058,15 +1058,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",
+@@ -1097,6 +1109,7 @@ service_callback(enum vchiq_reason reason, struct vchiq_header *header,
+                                                       bulk_userdata);
+                               if (status != VCHIQ_SUCCESS) {
+                                       DEBUG_TRACE(SERVICE_CALLBACK_LINE);
++                                      vchiq_service_put(service);
+                                       return status;
+                               }
+                       }
+@@ -1105,10 +1118,12 @@ service_callback(enum vchiq_reason reason, struct vchiq_header *header,
+                       if (wait_for_completion_interruptible(&user_service->remove_event)) {
+                               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);
+@@ -1137,6 +1152,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.16/tracing-fix-tp_printk-option-related-with-tp_printk_.patch b/queue-5.16/tracing-fix-tp_printk-option-related-with-tp_printk_.patch
new file mode 100644 (file)
index 0000000..63aa508
--- /dev/null
@@ -0,0 +1,49 @@
+From 6f21d692d2e7a80810b2c6e40a97bb8284b1df76 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <js.yoo.5b@gmail.com>
+
+[ 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 <jsyoo5b@gmail.com>
+[ Fixed up change log and added space after if condition ]
+Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/trace/trace.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
+index ae9f9e4af9314..bb15059020445 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.16/tracing-fix-tp_printk-option-related-with-tp_printk_.patch-20573 b/queue-5.16/tracing-fix-tp_printk-option-related-with-tp_printk_.patch-20573
new file mode 100644 (file)
index 0000000..63aa508
--- /dev/null
@@ -0,0 +1,49 @@
+From 6f21d692d2e7a80810b2c6e40a97bb8284b1df76 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <js.yoo.5b@gmail.com>
+
+[ 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 <jsyoo5b@gmail.com>
+[ Fixed up change log and added space after if condition ]
+Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/trace/trace.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
+index ae9f9e4af9314..bb15059020445 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.16/x86-bug-merge-annotate_reachable-into-_bug_flags-asm.patch b/queue-5.16/x86-bug-merge-annotate_reachable-into-_bug_flags-asm.patch
new file mode 100644 (file)
index 0000000..928b23c
--- /dev/null
@@ -0,0 +1,181 @@
+From fb039a2e262006f33a23083afc2e2547dcf6c4e2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 2 Feb 2022 12:55:53 -0800
+Subject: x86/bug: Merge annotate_reachable() into _BUG_FLAGS() asm
+
+From: Nick Desaulniers <ndesaulniers@google.com>
+
+[ 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 <ndesaulniers@google.com>
+Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
+Link: https://lore.kernel.org/r/20220202205557.2260694-1-ndesaulniers@google.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/x86-bug-merge-annotate_reachable-into-_bug_flags-asm.patch-9101 b/queue-5.16/x86-bug-merge-annotate_reachable-into-_bug_flags-asm.patch-9101
new file mode 100644 (file)
index 0000000..928b23c
--- /dev/null
@@ -0,0 +1,181 @@
+From fb039a2e262006f33a23083afc2e2547dcf6c4e2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 2 Feb 2022 12:55:53 -0800
+Subject: x86/bug: Merge annotate_reachable() into _BUG_FLAGS() asm
+
+From: Nick Desaulniers <ndesaulniers@google.com>
+
+[ 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 <ndesaulniers@google.com>
+Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
+Link: https://lore.kernel.org/r/20220202205557.2260694-1-ndesaulniers@google.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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.16/xprtrdma-fix-pointer-derefs-in-error-cases-of-rpcrdm.patch b/queue-5.16/xprtrdma-fix-pointer-derefs-in-error-cases-of-rpcrdm.patch
new file mode 100644 (file)
index 0000000..318fe84
--- /dev/null
@@ -0,0 +1,52 @@
+From 8186536fe7a11a692631416d0bbfff206ec38900 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 25 Jan 2022 22:06:46 +0200
+Subject: xprtrdma: fix pointer derefs in error cases of rpcrdma_ep_create
+
+From: Dan Aloni <dan.aloni@vastdata.com>
+
+[ 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 <dan.aloni@vastdata.com>
+Acked-by: Chuck Lever <chuck.lever@oracle.com>
+Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 3d3673ba9e1e5..2a2e1514ac79a 100644
+--- a/net/sunrpc/xprtrdma/verbs.c
++++ b/net/sunrpc/xprtrdma/verbs.c
+@@ -436,6 +436,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;
+       }
+@@ -444,6 +445,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;
+@@ -482,6 +484,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.16/xprtrdma-fix-pointer-derefs-in-error-cases-of-rpcrdm.patch-22828 b/queue-5.16/xprtrdma-fix-pointer-derefs-in-error-cases-of-rpcrdm.patch-22828
new file mode 100644 (file)
index 0000000..318fe84
--- /dev/null
@@ -0,0 +1,52 @@
+From 8186536fe7a11a692631416d0bbfff206ec38900 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 25 Jan 2022 22:06:46 +0200
+Subject: xprtrdma: fix pointer derefs in error cases of rpcrdma_ep_create
+
+From: Dan Aloni <dan.aloni@vastdata.com>
+
+[ 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 <dan.aloni@vastdata.com>
+Acked-by: Chuck Lever <chuck.lever@oracle.com>
+Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 3d3673ba9e1e5..2a2e1514ac79a 100644
+--- a/net/sunrpc/xprtrdma/verbs.c
++++ b/net/sunrpc/xprtrdma/verbs.c
+@@ -436,6 +436,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;
+       }
+@@ -444,6 +445,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;
+@@ -482,6 +484,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
+