]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 6.3
authorSasha Levin <sashal@kernel.org>
Mon, 22 May 2023 11:45:29 +0000 (07:45 -0400)
committerSasha Levin <sashal@kernel.org>
Mon, 22 May 2023 11:45:29 +0000 (07:45 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
92 files changed:
queue-6.3/af_key-reject-optional-tunnel-beet-mode-templates-in.patch [new file with mode: 0644]
queue-6.3/alsa-firewire-digi00x-prevent-potential-use-after-fr.patch [new file with mode: 0644]
queue-6.3/alsa-hda-realtek-apply-hp-b-o-top-speaker-profile-to.patch [new file with mode: 0644]
queue-6.3/asoc-fsl_micfil-fix-error-handler-with-pm_runtime_en.patch [new file with mode: 0644]
queue-6.3/asoc-mediatek-mt8186-fix-use-after-free-in-driver-re.patch [new file with mode: 0644]
queue-6.3/asoc-sof-ipc3-topology-make-sure-that-only-one-cmd-i.patch [new file with mode: 0644]
queue-6.3/asoc-sof-topology-fix-logic-for-copying-tuples.patch [new file with mode: 0644]
queue-6.3/bridge-always-declare-tunnel-functions.patch [new file with mode: 0644]
queue-6.3/can-dev-fix-missing-can-xl-support-in-can_put_echo_s.patch [new file with mode: 0644]
queue-6.3/cassini-fix-a-memory-leak-in-the-error-handling-path.patch [new file with mode: 0644]
queue-6.3/cpupower-make-tsc-read-per-cpu-for-mperf-monitor.patch [new file with mode: 0644]
queue-6.3/devlink-change-per-devlink-netdev-notifier-to-static.patch [new file with mode: 0644]
queue-6.3/devlink-fix-crash-with-config_net_ns-n.patch [new file with mode: 0644]
queue-6.3/drm-exynos-fix-g2d_open-close-helper-function-defini.patch [new file with mode: 0644]
queue-6.3/drm-msm-dp-unregister-audio-driver-during-unbind.patch [new file with mode: 0644]
queue-6.3/drm-msm-dpu-allow-variable-intf_blk-size.patch [new file with mode: 0644]
queue-6.3/drm-msm-dpu-allow-variable-sspp_blk-size.patch [new file with mode: 0644]
queue-6.3/drm-msm-dpu-assign-missing-writeback-log_mask.patch [new file with mode: 0644]
queue-6.3/drm-msm-dpu-drop-smart_dma_rev-from-dpu_caps.patch [new file with mode: 0644]
queue-6.3/drm-msm-dpu-fix-pp_blk_dipher-dither-typo.patch [new file with mode: 0644]
queue-6.3/drm-msm-dpu-move-non-mdp_top-intf_intr-offsets-out-o.patch [new file with mode: 0644]
queue-6.3/drm-msm-dpu-move-ubwc-memory-configuration-to-separa.patch [new file with mode: 0644]
queue-6.3/drm-msm-dpu-populate-smartdma-features-in-hw-catalog.patch [new file with mode: 0644]
queue-6.3/drm-msm-dpu-reindent-rev_7xxx-interrupt-masks-with-t.patch [new file with mode: 0644]
queue-6.3/drm-msm-dpu-remove-duplicate-register-defines-from-i.patch [new file with mode: 0644]
queue-6.3/drm-msm-dpu-split-sm8550-catalog-entry-to-the-separa.patch [new file with mode: 0644]
queue-6.3/drm-msm-fix-submit-error-path-leaks.patch [new file with mode: 0644]
queue-6.3/dt-bindings-display-msm-dsi-controller-main-document.patch [new file with mode: 0644]
queue-6.3/erspan-get-the-proto-with-the-md-version-for-collect.patch [new file with mode: 0644]
queue-6.3/iavf-send-vlan-offloading-caps-once-after-vfr.patch [new file with mode: 0644]
queue-6.3/ice-fix-ice-vf-reset-during-iavf-initialization.patch [new file with mode: 0644]
queue-6.3/ice-fix-stats-after-pf-reset.patch [new file with mode: 0644]
queue-6.3/ice-fix-undersized-tx_flags-variable.patch [new file with mode: 0644]
queue-6.3/igb-fix-bit_shift-to-be-in-1.8-range.patch [new file with mode: 0644]
queue-6.3/media-netup_unidvb-fix-use-after-free-at-del_timer.patch [new file with mode: 0644]
queue-6.3/media-pvrusb2-fix-dvb_core-dependency.patch [new file with mode: 0644]
queue-6.3/net-bcmgenet-remove-phy_stop-from-bcmgenet_netif_sto.patch [new file with mode: 0644]
queue-6.3/net-bcmgenet-restore-phy_stop-depending-upon-suspend.patch [new file with mode: 0644]
queue-6.3/net-dsa-mv88e6xxx-fix-mv88e6393x-epc-write-command-o.patch [new file with mode: 0644]
queue-6.3/net-dsa-rzn1-a5psw-disable-learning-for-standalone-p.patch [new file with mode: 0644]
queue-6.3/net-dsa-rzn1-a5psw-enable-management-frames-for-cpu-.patch [new file with mode: 0644]
queue-6.3/net-dsa-rzn1-a5psw-fix-stp-states-handling.patch [new file with mode: 0644]
queue-6.3/net-fec-better-handle-pm_runtime_get-failing-in-.rem.patch [new file with mode: 0644]
queue-6.3/net-fec-remove-the-xdp_return_frame-when-lack-of-tx-.patch [new file with mode: 0644]
queue-6.3/net-hns3-fix-output-information-incomplete-for-dumpi.patch [new file with mode: 0644]
queue-6.3/net-hns3-fix-reset-delay-time-to-avoid-configuration.patch [new file with mode: 0644]
queue-6.3/net-hns3-fix-reset-timeout-when-enable-full-vf.patch [new file with mode: 0644]
queue-6.3/net-hns3-fix-sending-pfc-frames-after-reset-issue.patch [new file with mode: 0644]
queue-6.3/net-nsh-use-correct-mac_offset-to-unwind-gso-skb-in-.patch [new file with mode: 0644]
queue-6.3/net-pcs-xpcs-fix-c73-an-not-getting-enabled.patch [new file with mode: 0644]
queue-6.3/net-phy-dp83867-add-w-a-for-packet-errors-seen-with-.patch [new file with mode: 0644]
queue-6.3/net-selftests-fix-optstring.patch [new file with mode: 0644]
queue-6.3/net-wwan-iosm-fix-null-pointer-dereference-when-remo.patch [new file with mode: 0644]
queue-6.3/netfilter-nf_tables-fix-nft_trans-type-confusion.patch [new file with mode: 0644]
queue-6.3/netfilter-nft_set_rbtree-fix-null-deref-on-element-i.patch [new file with mode: 0644]
queue-6.3/revert-fix-xfrm-i-support-for-nested-esp-tunnels.patch [new file with mode: 0644]
queue-6.3/s390-cio-include-subchannels-without-devices-also-fo.patch [new file with mode: 0644]
queue-6.3/scsi-storvsc-don-t-pass-unused-pfns-to-hyper-v-host.patch [new file with mode: 0644]
queue-6.3/selftests-seg6-disable-dad-on-ipv6-router-cfg-for-sr.patch [new file with mode: 0644]
queue-6.3/selftets-seg6-disable-rp_filter-by-default-in-srv6_e.patch [new file with mode: 0644]
queue-6.3/serial-8250_bcm7271-balance-clk_enable-calls.patch [new file with mode: 0644]
queue-6.3/serial-8250_bcm7271-fix-leak-in-brcmuart_probe.patch [new file with mode: 0644]
queue-6.3/serial-arc_uart-fix-of_iomap-leak-in-arc_serial_prob.patch [new file with mode: 0644]
queue-6.3/series
queue-6.3/sfc-disable-rxfcs-and-rxall-features-by-default.patch [new file with mode: 0644]
queue-6.3/sunrpc-always-free-ctxt-when-freeing-deferred-reques.patch [new file with mode: 0644]
queue-6.3/sunrpc-double-free-xprt_ctxt-while-still-in-use.patch [new file with mode: 0644]
queue-6.3/sunrpc-fix-encoding-of-accepted-but-unsuccessful-rpc.patch [new file with mode: 0644]
queue-6.3/sunrpc-fix-trace_svc_register-call-site.patch [new file with mode: 0644]
queue-6.3/tcp-fix-possible-sk_priority-leak-in-tcp_v4_send_res.patch [new file with mode: 0644]
queue-6.3/tipc-add-tipc_bearer_min_mtu-to-calculate-min-mtu.patch [new file with mode: 0644]
queue-6.3/tipc-check-the-bearer-min-mtu-properly-when-setting-.patch [new file with mode: 0644]
queue-6.3/tipc-do-not-update-mtu-if-msg_max-is-too-small-in-mt.patch [new file with mode: 0644]
queue-6.3/tun-fix-memory-leak-for-detached-napi-queue.patch [new file with mode: 0644]
queue-6.3/virtio_net-fix-error-unwinding-of-xdp-initialization.patch [new file with mode: 0644]
queue-6.3/vlan-fix-a-potential-uninit-value-in-vlan_dev_hard_s.patch [new file with mode: 0644]
queue-6.3/vsock-avoid-to-close-connected-socket-after-the-time.patch [new file with mode: 0644]
queue-6.3/wifi-cfg80211-drop-entries-with-invalid-bssids-in-rn.patch [new file with mode: 0644]
queue-6.3/wifi-iwlwifi-fix-oem-s-name-in-the-ppag-approved-lis.patch [new file with mode: 0644]
queue-6.3/wifi-iwlwifi-fw-fix-dbgi-dump.patch [new file with mode: 0644]
queue-6.3/wifi-iwlwifi-mvm-don-t-trust-firmware-n_channels.patch [new file with mode: 0644]
queue-6.3/wifi-iwlwifi-mvm-fix-cancel_delayed_work_sync-deadlo.patch [new file with mode: 0644]
queue-6.3/wifi-iwlwifi-mvm-fix-oem-s-name-in-the-tas-approved-.patch [new file with mode: 0644]
queue-6.3/wifi-mac80211-abort-running-color-change-when-stoppi.patch [new file with mode: 0644]
queue-6.3/wifi-mac80211-fix-min-center-freq-offset-tracing.patch [new file with mode: 0644]
queue-6.3/wifi-mac80211-fix-puncturing-bitmap-handling-in-__ie.patch [new file with mode: 0644]
queue-6.3/wifi-mac80211-fortify-the-spinlock-against-deadlock-.patch [new file with mode: 0644]
queue-6.3/wifi-mt76-connac-fix-stats-tx_bytes-calculation.patch [new file with mode: 0644]
queue-6.3/xfrm-don-t-check-the-default-policy-if-the-policy-al.patch [new file with mode: 0644]
queue-6.3/xfrm-fix-leak-of-dev-tracker.patch [new file with mode: 0644]
queue-6.3/xfrm-reject-optional-tunnel-beet-mode-templates-in-o.patch [new file with mode: 0644]
queue-6.3/xfrm-release-all-offloaded-policy-memory.patch [new file with mode: 0644]

diff --git a/queue-6.3/af_key-reject-optional-tunnel-beet-mode-templates-in.patch b/queue-6.3/af_key-reject-optional-tunnel-beet-mode-templates-in.patch
new file mode 100644 (file)
index 0000000..e926596
--- /dev/null
@@ -0,0 +1,71 @@
+From 02eb05e83d17b6cee90ae6894f3cef5e7be7bcb1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 9 May 2023 11:00:06 +0200
+Subject: af_key: Reject optional tunnel/BEET mode templates in outbound
+ policies
+
+From: Tobias Brunner <tobias@strongswan.org>
+
+[ Upstream commit cf3128a7aca55b2eefb68281d44749c683bdc96f ]
+
+xfrm_state_find() uses `encap_family` of the current template with
+the passed local and remote addresses to find a matching state.
+If an optional tunnel or BEET mode template is skipped in a mixed-family
+scenario, there could be a mismatch causing an out-of-bounds read as
+the addresses were not replaced to match the family of the next template.
+
+While there are theoretical use cases for optional templates in outbound
+policies, the only practical one is to skip IPComp states in inbound
+policies if uncompressed packets are received that are handled by an
+implicitly created IPIP state instead.
+
+Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
+Signed-off-by: Tobias Brunner <tobias@strongswan.org>
+Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/key/af_key.c | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/net/key/af_key.c b/net/key/af_key.c
+index a815f5ab4c49a..31ab12fd720ae 100644
+--- a/net/key/af_key.c
++++ b/net/key/af_key.c
+@@ -1940,7 +1940,8 @@ static u32 gen_reqid(struct net *net)
+ }
+ static int
+-parse_ipsecrequest(struct xfrm_policy *xp, struct sadb_x_ipsecrequest *rq)
++parse_ipsecrequest(struct xfrm_policy *xp, struct sadb_x_policy *pol,
++                 struct sadb_x_ipsecrequest *rq)
+ {
+       struct net *net = xp_net(xp);
+       struct xfrm_tmpl *t = xp->xfrm_vec + xp->xfrm_nr;
+@@ -1958,9 +1959,12 @@ parse_ipsecrequest(struct xfrm_policy *xp, struct sadb_x_ipsecrequest *rq)
+       if ((mode = pfkey_mode_to_xfrm(rq->sadb_x_ipsecrequest_mode)) < 0)
+               return -EINVAL;
+       t->mode = mode;
+-      if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_USE)
++      if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_USE) {
++              if ((mode == XFRM_MODE_TUNNEL || mode == XFRM_MODE_BEET) &&
++                  pol->sadb_x_policy_dir == IPSEC_DIR_OUTBOUND)
++                      return -EINVAL;
+               t->optional = 1;
+-      else if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_UNIQUE) {
++      } else if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_UNIQUE) {
+               t->reqid = rq->sadb_x_ipsecrequest_reqid;
+               if (t->reqid > IPSEC_MANUAL_REQID_MAX)
+                       t->reqid = 0;
+@@ -2002,7 +2006,7 @@ parse_ipsecrequests(struct xfrm_policy *xp, struct sadb_x_policy *pol)
+                   rq->sadb_x_ipsecrequest_len < sizeof(*rq))
+                       return -EINVAL;
+-              if ((err = parse_ipsecrequest(xp, rq)) < 0)
++              if ((err = parse_ipsecrequest(xp, pol, rq)) < 0)
+                       return err;
+               len -= rq->sadb_x_ipsecrequest_len;
+               rq = (void*)((u8*)rq + rq->sadb_x_ipsecrequest_len);
+-- 
+2.39.2
+
diff --git a/queue-6.3/alsa-firewire-digi00x-prevent-potential-use-after-fr.patch b/queue-6.3/alsa-firewire-digi00x-prevent-potential-use-after-fr.patch
new file mode 100644 (file)
index 0000000..5cba0fc
--- /dev/null
@@ -0,0 +1,41 @@
+From bb14fcac03d1899ba7e01e90e76b3a7cc8e46a8d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 9 May 2023 12:07:11 +0300
+Subject: ALSA: firewire-digi00x: prevent potential use after free
+
+From: Dan Carpenter <dan.carpenter@linaro.org>
+
+[ Upstream commit c0e72058d5e21982e61a29de6b098f7c1f0db498 ]
+
+This code was supposed to return an error code if init_stream()
+failed, but it instead freed dg00x->rx_stream and returned success.
+This potentially leads to a use after free.
+
+Fixes: 9a08067ec318 ("ALSA: firewire-digi00x: support AMDTP domain")
+Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
+Link: https://lore.kernel.org/r/c224cbd5-d9e2-4cd4-9bcf-2138eb1d35c6@kili.mountain
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/firewire/digi00x/digi00x-stream.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/sound/firewire/digi00x/digi00x-stream.c b/sound/firewire/digi00x/digi00x-stream.c
+index a15f55b0dce37..295163bb8abb6 100644
+--- a/sound/firewire/digi00x/digi00x-stream.c
++++ b/sound/firewire/digi00x/digi00x-stream.c
+@@ -259,8 +259,10 @@ int snd_dg00x_stream_init_duplex(struct snd_dg00x *dg00x)
+               return err;
+       err = init_stream(dg00x, &dg00x->tx_stream);
+-      if (err < 0)
++      if (err < 0) {
+               destroy_stream(dg00x, &dg00x->rx_stream);
++              return err;
++      }
+       err = amdtp_domain_init(&dg00x->domain);
+       if (err < 0) {
+-- 
+2.39.2
+
diff --git a/queue-6.3/alsa-hda-realtek-apply-hp-b-o-top-speaker-profile-to.patch b/queue-6.3/alsa-hda-realtek-apply-hp-b-o-top-speaker-profile-to.patch
new file mode 100644 (file)
index 0000000..209376c
--- /dev/null
@@ -0,0 +1,39 @@
+From 19b6640d11691278bd54a216843703b4c7e9ecb6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 May 2023 12:32:21 -0500
+Subject: ALSA: hda/realtek: Apply HP B&O top speaker profile to Pavilion 15
+
+From: Ryan C. Underwood <nemesis@icequake.net>
+
+[ Upstream commit 92553ee03166ef8fa978e7683f9f4af30c9c4e6b ]
+
+The Pavilion 15 line has B&O top speakers similar to the x360 and
+applying the same profile produces good sound.  Without this, the
+sound would be tinny and underpowered without either applying
+model=alc295-hp-x360 or booting another OS first.
+
+Signed-off-by: Ryan Underwood <nemesis@icequake.net>
+Fixes: 563785edfcef ("ALSA: hda/realtek - Add quirk entry for HP Pavilion 15")
+Link: https://lore.kernel.org/r/ZF0mpcMz3ezP9KQw@icequake.net
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/pci/hda/patch_realtek.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 172ffc2c332b7..5d78d4ba1c959 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -9363,7 +9363,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+       SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
+       SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
+-      SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
++      SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC295_FIXUP_HP_X360),
+       SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
+       SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
+       SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
+-- 
+2.39.2
+
diff --git a/queue-6.3/asoc-fsl_micfil-fix-error-handler-with-pm_runtime_en.patch b/queue-6.3/asoc-fsl_micfil-fix-error-handler-with-pm_runtime_en.patch
new file mode 100644 (file)
index 0000000..f64e845
--- /dev/null
@@ -0,0 +1,70 @@
+From 962eec089d3a2e2b34381d141b347ff10b406b10 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 8 May 2023 18:16:36 +0800
+Subject: ASoC: fsl_micfil: Fix error handler with pm_runtime_enable
+
+From: Shengjiu Wang <shengjiu.wang@nxp.com>
+
+[ Upstream commit 17955aba7877a4494d8093ae5498e19469b01d57 ]
+
+There is error message when defer probe happens:
+
+fsl-micfil-dai 30ca0000.micfil: Unbalanced pm_runtime_enable!
+
+Fix the error handler with pm_runtime_enable and add
+fsl_micfil_remove() for pm_runtime_disable.
+
+Fixes: 47a70e6fc9a8 ("ASoC: Add MICFIL SoC Digital Audio Interface driver.")
+Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com
+Link: https://lore.kernel.org/r/1683540996-6136-1-git-send-email-shengjiu.wang@nxp.com
+Signed-off-by: Mark Brown <broonie@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/fsl/fsl_micfil.c | 14 +++++++++++++-
+ 1 file changed, 13 insertions(+), 1 deletion(-)
+
+diff --git a/sound/soc/fsl/fsl_micfil.c b/sound/soc/fsl/fsl_micfil.c
+index 94341e4352b3c..3f08082a55bec 100644
+--- a/sound/soc/fsl/fsl_micfil.c
++++ b/sound/soc/fsl/fsl_micfil.c
+@@ -1159,7 +1159,7 @@ static int fsl_micfil_probe(struct platform_device *pdev)
+       ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
+       if (ret) {
+               dev_err(&pdev->dev, "failed to pcm register\n");
+-              return ret;
++              goto err_pm_disable;
+       }
+       fsl_micfil_dai.capture.formats = micfil->soc->formats;
+@@ -1169,9 +1169,20 @@ static int fsl_micfil_probe(struct platform_device *pdev)
+       if (ret) {
+               dev_err(&pdev->dev, "failed to register component %s\n",
+                       fsl_micfil_component.name);
++              goto err_pm_disable;
+       }
+       return ret;
++
++err_pm_disable:
++      pm_runtime_disable(&pdev->dev);
++
++      return ret;
++}
++
++static void fsl_micfil_remove(struct platform_device *pdev)
++{
++      pm_runtime_disable(&pdev->dev);
+ }
+ static int __maybe_unused fsl_micfil_runtime_suspend(struct device *dev)
+@@ -1232,6 +1243,7 @@ static const struct dev_pm_ops fsl_micfil_pm_ops = {
+ static struct platform_driver fsl_micfil_driver = {
+       .probe = fsl_micfil_probe,
++      .remove_new = fsl_micfil_remove,
+       .driver = {
+               .name = "fsl-micfil-dai",
+               .pm = &fsl_micfil_pm_ops,
+-- 
+2.39.2
+
diff --git a/queue-6.3/asoc-mediatek-mt8186-fix-use-after-free-in-driver-re.patch b/queue-6.3/asoc-mediatek-mt8186-fix-use-after-free-in-driver-re.patch
new file mode 100644 (file)
index 0000000..85a7359
--- /dev/null
@@ -0,0 +1,170 @@
+From ed2797d5dec44590a896193f38758beb5b6b165e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 May 2023 09:25:12 -0700
+Subject: ASoC: mediatek: mt8186: Fix use-after-free in driver remove path
+
+From: Douglas Anderson <dianders@chromium.org>
+
+[ Upstream commit a93d2afd3f77a7331271a0f25c6a11003db69b3c ]
+
+When devm runs function in the "remove" path for a device it runs them
+in the reverse order. That means that if you have parts of your driver
+that aren't using devm or are using "roll your own" devm w/
+devm_add_action_or_reset() you need to keep that in mind.
+
+The mt8186 audio driver didn't quite get this right. Specifically, in
+mt8186_init_clock() it called mt8186_audsys_clk_register() and then
+went on to call a bunch of other devm function. The caller of
+mt8186_init_clock() used devm_add_action_or_reset() to call
+mt8186_deinit_clock() but, because of the intervening devm functions,
+the order was wrong.
+
+Specifically at probe time, the order was:
+1. mt8186_audsys_clk_register()
+2. afe_priv->clk = devm_kcalloc(...)
+3. afe_priv->clk[i] = devm_clk_get(...)
+
+At remove time, the order (which should have been 3, 2, 1) was:
+1. mt8186_audsys_clk_unregister()
+3. Free all of afe_priv->clk[i]
+2. Free afe_priv->clk
+
+The above seemed to be causing a use-after-free. Luckily, it's easy to
+fix this by simply using devm more correctly. Let's move the
+devm_add_action_or_reset() to the right place. In addition to fixing
+the use-after-free, code inspection shows that this fixes a leak
+(missing call to mt8186_audsys_clk_unregister()) that would have
+happened if any of the syscon_regmap_lookup_by_phandle() calls in
+mt8186_init_clock() had failed.
+
+Fixes: 55b423d5623c ("ASoC: mediatek: mt8186: support audio clock control in platform driver")
+Signed-off-by: Douglas Anderson <dianders@chromium.org
+Link: https://lore.kernel.org/r/20230511092437.1.I31cceffc8c45bb1af16eb613e197b3df92cdc19e@changeid
+Signed-off-by: Mark Brown <broonie@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/mediatek/mt8186/mt8186-afe-clk.c    |  6 ---
+ sound/soc/mediatek/mt8186/mt8186-afe-clk.h    |  1 -
+ sound/soc/mediatek/mt8186/mt8186-afe-pcm.c    |  4 --
+ sound/soc/mediatek/mt8186/mt8186-audsys-clk.c | 46 ++++++++++---------
+ sound/soc/mediatek/mt8186/mt8186-audsys-clk.h |  1 -
+ 5 files changed, 24 insertions(+), 34 deletions(-)
+
+diff --git a/sound/soc/mediatek/mt8186/mt8186-afe-clk.c b/sound/soc/mediatek/mt8186/mt8186-afe-clk.c
+index a6b4f29049bbc..539e3a023bc4e 100644
+--- a/sound/soc/mediatek/mt8186/mt8186-afe-clk.c
++++ b/sound/soc/mediatek/mt8186/mt8186-afe-clk.c
+@@ -644,9 +644,3 @@ int mt8186_init_clock(struct mtk_base_afe *afe)
+       return 0;
+ }
+-
+-void mt8186_deinit_clock(void *priv)
+-{
+-      struct mtk_base_afe *afe = priv;
+-      mt8186_audsys_clk_unregister(afe);
+-}
+diff --git a/sound/soc/mediatek/mt8186/mt8186-afe-clk.h b/sound/soc/mediatek/mt8186/mt8186-afe-clk.h
+index d5988717d8f2d..a9d59e506d9af 100644
+--- a/sound/soc/mediatek/mt8186/mt8186-afe-clk.h
++++ b/sound/soc/mediatek/mt8186/mt8186-afe-clk.h
+@@ -81,7 +81,6 @@ enum {
+ struct mtk_base_afe;
+ int mt8186_set_audio_int_bus_parent(struct mtk_base_afe *afe, int clk_id);
+ int mt8186_init_clock(struct mtk_base_afe *afe);
+-void mt8186_deinit_clock(void *priv);
+ int mt8186_afe_enable_cgs(struct mtk_base_afe *afe);
+ void mt8186_afe_disable_cgs(struct mtk_base_afe *afe);
+ int mt8186_afe_enable_clock(struct mtk_base_afe *afe);
+diff --git a/sound/soc/mediatek/mt8186/mt8186-afe-pcm.c b/sound/soc/mediatek/mt8186/mt8186-afe-pcm.c
+index 41172a82103ee..a868a04ed4e7a 100644
+--- a/sound/soc/mediatek/mt8186/mt8186-afe-pcm.c
++++ b/sound/soc/mediatek/mt8186/mt8186-afe-pcm.c
+@@ -2848,10 +2848,6 @@ static int mt8186_afe_pcm_dev_probe(struct platform_device *pdev)
+               return ret;
+       }
+-      ret = devm_add_action_or_reset(dev, mt8186_deinit_clock, (void *)afe);
+-      if (ret)
+-              return ret;
+-
+       /* init memif */
+       afe->memif_32bit_supported = 0;
+       afe->memif_size = MT8186_MEMIF_NUM;
+diff --git a/sound/soc/mediatek/mt8186/mt8186-audsys-clk.c b/sound/soc/mediatek/mt8186/mt8186-audsys-clk.c
+index 578969ca91c8e..5666be6b1bd2e 100644
+--- a/sound/soc/mediatek/mt8186/mt8186-audsys-clk.c
++++ b/sound/soc/mediatek/mt8186/mt8186-audsys-clk.c
+@@ -84,6 +84,29 @@ static const struct afe_gate aud_clks[CLK_AUD_NR_CLK] = {
+       GATE_AUD2(CLK_AUD_ETDM_OUT1_BCLK, "aud_etdm_out1_bclk", "top_audio", 24),
+ };
++static void mt8186_audsys_clk_unregister(void *data)
++{
++      struct mtk_base_afe *afe = data;
++      struct mt8186_afe_private *afe_priv = afe->platform_priv;
++      struct clk *clk;
++      struct clk_lookup *cl;
++      int i;
++
++      if (!afe_priv)
++              return;
++
++      for (i = 0; i < CLK_AUD_NR_CLK; i++) {
++              cl = afe_priv->lookup[i];
++              if (!cl)
++                      continue;
++
++              clk = cl->clk;
++              clk_unregister_gate(clk);
++
++              clkdev_drop(cl);
++      }
++}
++
+ int mt8186_audsys_clk_register(struct mtk_base_afe *afe)
+ {
+       struct mt8186_afe_private *afe_priv = afe->platform_priv;
+@@ -124,27 +147,6 @@ int mt8186_audsys_clk_register(struct mtk_base_afe *afe)
+               afe_priv->lookup[i] = cl;
+       }
+-      return 0;
++      return devm_add_action_or_reset(afe->dev, mt8186_audsys_clk_unregister, afe);
+ }
+-void mt8186_audsys_clk_unregister(struct mtk_base_afe *afe)
+-{
+-      struct mt8186_afe_private *afe_priv = afe->platform_priv;
+-      struct clk *clk;
+-      struct clk_lookup *cl;
+-      int i;
+-
+-      if (!afe_priv)
+-              return;
+-
+-      for (i = 0; i < CLK_AUD_NR_CLK; i++) {
+-              cl = afe_priv->lookup[i];
+-              if (!cl)
+-                      continue;
+-
+-              clk = cl->clk;
+-              clk_unregister_gate(clk);
+-
+-              clkdev_drop(cl);
+-      }
+-}
+diff --git a/sound/soc/mediatek/mt8186/mt8186-audsys-clk.h b/sound/soc/mediatek/mt8186/mt8186-audsys-clk.h
+index b8d6a06e11e8d..897a2914dc191 100644
+--- a/sound/soc/mediatek/mt8186/mt8186-audsys-clk.h
++++ b/sound/soc/mediatek/mt8186/mt8186-audsys-clk.h
+@@ -10,6 +10,5 @@
+ #define _MT8186_AUDSYS_CLK_H_
+ int mt8186_audsys_clk_register(struct mtk_base_afe *afe);
+-void mt8186_audsys_clk_unregister(struct mtk_base_afe *afe);
+ #endif
+-- 
+2.39.2
+
diff --git a/queue-6.3/asoc-sof-ipc3-topology-make-sure-that-only-one-cmd-i.patch b/queue-6.3/asoc-sof-ipc3-topology-make-sure-that-only-one-cmd-i.patch
new file mode 100644 (file)
index 0000000..eab4464
--- /dev/null
@@ -0,0 +1,59 @@
+From 338042a4b54366e3fe7f80c8beb29a27f8ef7c42 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 May 2023 14:03:17 +0300
+Subject: ASoC: SOF: ipc3-topology: Make sure that only one cmd is sent in
+ dai_config
+
+From: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
+
+[ Upstream commit 4708449eafe60742334606168926985798c9c9b8 ]
+
+The commands in sof_ipc_dai_config.flags are encoded as bits:
+1 (bit0) - hw_params
+2 (bit1) - hw_free
+4 (bit2) - pause
+
+These are commands, they cannot be combined as one would assume, for
+example
+3 (bit0 | bit1) is invalid.
+
+This can happen right at the second start of a stream as at the end of the
+first stream we set the hw_free command (bit1) and on the second start we
+would OR on top of it the hw_params (bit0).
+
+Fixes: b66bfc3a9810 ("ASoC: SOF: sof-audio: Fix broken early bclk feature for SSP")
+Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com
+Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com
+Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com
+Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com
+Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com
+Link: https://lore.kernel.org/r/20230512110317.5180-1-peter.ujfalusi@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/sof/ipc3-topology.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/sound/soc/sof/ipc3-topology.c b/sound/soc/sof/ipc3-topology.c
+index b1f425b39db94..ffa4c6dea752a 100644
+--- a/sound/soc/sof/ipc3-topology.c
++++ b/sound/soc/sof/ipc3-topology.c
+@@ -2111,10 +2111,13 @@ static int sof_ipc3_dai_config(struct snd_sof_dev *sdev, struct snd_sof_widget *
+        * For the case of PAUSE/HW_FREE, since there are no quirks, flags can be used as is.
+        */
+-      if (flags & SOF_DAI_CONFIG_FLAGS_HW_PARAMS)
++      if (flags & SOF_DAI_CONFIG_FLAGS_HW_PARAMS) {
++              /* Clear stale command */
++              config->flags &= ~SOF_DAI_CONFIG_FLAGS_CMD_MASK;
+               config->flags |= flags;
+-      else
++      } else {
+               config->flags = flags;
++      }
+       /* only send the IPC if the widget is set up in the DSP */
+       if (swidget->use_count > 0) {
+-- 
+2.39.2
+
diff --git a/queue-6.3/asoc-sof-topology-fix-logic-for-copying-tuples.patch b/queue-6.3/asoc-sof-topology-fix-logic-for-copying-tuples.patch
new file mode 100644 (file)
index 0000000..615c2f4
--- /dev/null
@@ -0,0 +1,49 @@
+From 16df1d990f7ad1db15f1c26cb9da8b63155dc930 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 May 2023 14:46:30 +0300
+Subject: ASoC: SOF: topology: Fix logic for copying tuples
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
+
+[ Upstream commit 41c5305cc3d827d2ea686533777a285176ae01a0 ]
+
+Topology could have more instances of the tokens being searched for than
+the number of sets that need to be copied. Stop copying token after the
+limit of number of token instances has been reached. This worked before
+only by chance as we had allocated more size for the tuples array than
+the number of actual tokens being parsed.
+
+Fixes: 7006d20e5e9d ("ASoC: SOF: Introduce IPC3 ops")
+Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com
+Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com
+Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com
+Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com
+Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com
+Link: https://lore.kernel.org/r/20230512114630.24439-1-peter.ujfalusi@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/sof/topology.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c
+index 9f3a038fe21ad..93ab58cea14f8 100644
+--- a/sound/soc/sof/topology.c
++++ b/sound/soc/sof/topology.c
+@@ -586,6 +586,10 @@ static int sof_copy_tuples(struct snd_sof_dev *sdev, struct snd_soc_tplg_vendor_
+                               if (*num_copied_tuples == tuples_size)
+                                       return 0;
+                       }
++
++                      /* stop when we've found the required token instances */
++                      if (found == num_tokens * token_instance_num)
++                              return 0;
+               }
+               /* next array */
+-- 
+2.39.2
+
diff --git a/queue-6.3/bridge-always-declare-tunnel-functions.patch b/queue-6.3/bridge-always-declare-tunnel-functions.patch
new file mode 100644 (file)
index 0000000..3a1926e
--- /dev/null
@@ -0,0 +1,61 @@
+From d8995237485cf59d344c9ce10b6230d90261948a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 16 May 2023 21:45:35 +0200
+Subject: bridge: always declare tunnel functions
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit 89dcd87ce534a3a7f267cfd58505803006f51301 ]
+
+When CONFIG_BRIDGE_VLAN_FILTERING is disabled, two functions are still
+defined but have no prototype or caller. This causes a W=1 warning for
+the missing prototypes:
+
+net/bridge/br_netlink_tunnel.c:29:6: error: no previous prototype for 'vlan_tunid_inrange' [-Werror=missing-prototypes]
+net/bridge/br_netlink_tunnel.c:199:5: error: no previous prototype for 'br_vlan_tunnel_info' [-Werror=missing-prototypes]
+
+The functions are already contitional on CONFIG_BRIDGE_VLAN_FILTERING,
+and I coulnd't easily figure out the right set of #ifdefs, so just
+move the declarations out of the #ifdef to avoid the warning,
+at a small cost in code size over a more elaborate fix.
+
+Fixes: 188c67dd1906 ("net: bridge: vlan options: add support for tunnel id dumping")
+Fixes: 569da0822808 ("net: bridge: vlan options: add support for tunnel mapping set/del")
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
+Link: https://lore.kernel.org/r/20230516194625.549249-3-arnd@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/bridge/br_private_tunnel.h | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/net/bridge/br_private_tunnel.h b/net/bridge/br_private_tunnel.h
+index 2b053289f0166..efb096025151a 100644
+--- a/net/bridge/br_private_tunnel.h
++++ b/net/bridge/br_private_tunnel.h
+@@ -27,6 +27,10 @@ int br_process_vlan_tunnel_info(const struct net_bridge *br,
+ int br_get_vlan_tunnel_info_size(struct net_bridge_vlan_group *vg);
+ int br_fill_vlan_tunnel_info(struct sk_buff *skb,
+                            struct net_bridge_vlan_group *vg);
++bool vlan_tunid_inrange(const struct net_bridge_vlan *v_curr,
++                      const struct net_bridge_vlan *v_last);
++int br_vlan_tunnel_info(const struct net_bridge_port *p, int cmd,
++                      u16 vid, u32 tun_id, bool *changed);
+ #ifdef CONFIG_BRIDGE_VLAN_FILTERING
+ /* br_vlan_tunnel.c */
+@@ -43,10 +47,6 @@ void br_handle_ingress_vlan_tunnel(struct sk_buff *skb,
+                                  struct net_bridge_vlan_group *vg);
+ int br_handle_egress_vlan_tunnel(struct sk_buff *skb,
+                                struct net_bridge_vlan *vlan);
+-bool vlan_tunid_inrange(const struct net_bridge_vlan *v_curr,
+-                      const struct net_bridge_vlan *v_last);
+-int br_vlan_tunnel_info(const struct net_bridge_port *p, int cmd,
+-                      u16 vid, u32 tun_id, bool *changed);
+ #else
+ static inline int vlan_tunnel_init(struct net_bridge_vlan_group *vg)
+ {
+-- 
+2.39.2
+
diff --git a/queue-6.3/can-dev-fix-missing-can-xl-support-in-can_put_echo_s.patch b/queue-6.3/can-dev-fix-missing-can-xl-support-in-can_put_echo_s.patch
new file mode 100644 (file)
index 0000000..566a74d
--- /dev/null
@@ -0,0 +1,39 @@
+From 816d41625000e1d22de23a539ceeffd2e8bf5392 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 6 May 2023 20:45:15 +0200
+Subject: can: dev: fix missing CAN XL support in can_put_echo_skb()
+
+From: Oliver Hartkopp <socketcan@hartkopp.net>
+
+[ Upstream commit 6bffdc38f9935bae49f980448f3f6be2dada0564 ]
+
+can_put_echo_skb() checks for the enabled IFF_ECHO flag and the
+correct ETH_P type of the given skbuff. When implementing the CAN XL
+support the new check for ETH_P_CANXL has been forgotten.
+
+Fixes: fb08cba12b52 ("can: canxl: update CAN infrastructure for CAN XL frames")
+Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
+Link: https://lore.kernel.org/all/20230506184515.39241-1-socketcan@hartkopp.net
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/can/dev/skb.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/can/dev/skb.c b/drivers/net/can/dev/skb.c
+index 241ec636e91fd..f6d05b3ef59ab 100644
+--- a/drivers/net/can/dev/skb.c
++++ b/drivers/net/can/dev/skb.c
+@@ -54,7 +54,8 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
+       /* check flag whether this packet has to be looped back */
+       if (!(dev->flags & IFF_ECHO) ||
+           (skb->protocol != htons(ETH_P_CAN) &&
+-           skb->protocol != htons(ETH_P_CANFD))) {
++           skb->protocol != htons(ETH_P_CANFD) &&
++           skb->protocol != htons(ETH_P_CANXL))) {
+               kfree_skb(skb);
+               return 0;
+       }
+-- 
+2.39.2
+
diff --git a/queue-6.3/cassini-fix-a-memory-leak-in-the-error-handling-path.patch b/queue-6.3/cassini-fix-a-memory-leak-in-the-error-handling-path.patch
new file mode 100644 (file)
index 0000000..d87defe
--- /dev/null
@@ -0,0 +1,42 @@
+From 785c6e686b09d6da1acfc61db1107d779dd2f61b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 15 May 2023 21:09:11 +0200
+Subject: cassini: Fix a memory leak in the error handling path of
+ cas_init_one()
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ Upstream commit 412cd77a2c24b191c65ea53025222418db09817c ]
+
+cas_saturn_firmware_init() allocates some memory using vmalloc(). This
+memory is freed in the .remove() function but not it the error handling
+path of the probe.
+
+Add the missing vfree() to avoid a memory leak, should an error occur.
+
+Fixes: fcaa40669cd7 ("cassini: use request_firmware")
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
+Reviewed-by: Simon Horman <simon.horman@corigine.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/sun/cassini.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/net/ethernet/sun/cassini.c b/drivers/net/ethernet/sun/cassini.c
+index 4ef05bad4613c..d61dfa250feb7 100644
+--- a/drivers/net/ethernet/sun/cassini.c
++++ b/drivers/net/ethernet/sun/cassini.c
+@@ -5077,6 +5077,8 @@ static int cas_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+               cas_shutdown(cp);
+       mutex_unlock(&cp->pm_mutex);
++      vfree(cp->fw_data);
++
+       pci_iounmap(pdev, cp->regs);
+-- 
+2.39.2
+
diff --git a/queue-6.3/cpupower-make-tsc-read-per-cpu-for-mperf-monitor.patch b/queue-6.3/cpupower-make-tsc-read-per-cpu-for-mperf-monitor.patch
new file mode 100644 (file)
index 0000000..0b96e0f
--- /dev/null
@@ -0,0 +1,159 @@
+From 425f5575729613934671702838f63f49d479aef6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 May 2023 06:25:44 +0000
+Subject: cpupower: Make TSC read per CPU for Mperf monitor
+
+From: Wyes Karny <wyes.karny@amd.com>
+
+[ Upstream commit c2adb1877b76fc81ae041e1db1a6ed2078c6746b ]
+
+System-wide TSC read could cause a drift in C0 percentage calculation.
+Because if first TSC is read and then one by one mperf is read for all
+cpus, this introduces drift between mperf reading of later CPUs and TSC
+reading.  To lower this drift read TSC per CPU and also just after mperf
+read.  This technique improves C0 percentage calculation in Mperf monitor.
+
+Before fix: (System 100% busy)
+
+              | Mperf              || RAPL        || Idle_Stats
+ PKG|CORE| CPU| C0   | Cx   | Freq  || pack | core  || POLL | C1   | C2
+   0|   0|   0| 87.15| 12.85|  2695||168659003|3970468||  0.00|  0.00| 0.00
+   0|   0| 256| 84.62| 15.38|  2695||168659003|3970468||  0.00|  0.00| 0.00
+   0|   1|   1| 87.15| 12.85|  2695||168659003|3970468||  0.00|  0.00| 0.00
+   0|   1| 257| 84.08| 15.92|  2695||168659003|3970468||  0.00|  0.00| 0.00
+   0|   2|   2| 86.61| 13.39|  2695||168659003|3970468||  0.00|  0.00| 0.00
+   0|   2| 258| 83.26| 16.74|  2695||168659003|3970468||  0.00|  0.00| 0.00
+   0|   3|   3| 86.61| 13.39|  2695||168659003|3970468||  0.00|  0.00| 0.00
+   0|   3| 259| 83.60| 16.40|  2695||168659003|3970468||  0.00|  0.00| 0.00
+   0|   4|   4| 86.33| 13.67|  2695||168659003|3970468||  0.00|  0.00| 0.00
+   0|   4| 260| 83.33| 16.67|  2695||168659003|3970468||  0.00|  0.00| 0.00
+   0|   5|   5| 86.06| 13.94|  2695||168659003|3970468||  0.00|  0.00| 0.00
+   0|   5| 261| 83.05| 16.95|  2695||168659003|3970468||  0.00|  0.00| 0.00
+   0|   6|   6| 85.51| 14.49|  2695||168659003|3970468||  0.00|  0.00| 0.00
+
+After fix: (System 100% busy)
+
+             | Mperf              || RAPL        || Idle_Stats
+ PKG|CORE| CPU| C0   | Cx   | Freq  || pack | core  || POLL | C1   | C2
+   0|   0|   0| 98.03|  1.97|  2415||163295480|3811189||  0.00|  0.00| 0.00
+   0|   0| 256| 98.50|  1.50|  2394||163295480|3811189||  0.00|  0.00| 0.00
+   0|   1|   1| 99.99|  0.01|  2401||163295480|3811189||  0.00|  0.00| 0.00
+   0|   1| 257| 99.99|  0.01|  2375||163295480|3811189||  0.00|  0.00| 0.00
+   0|   2|   2| 99.99|  0.01|  2401||163295480|3811189||  0.00|  0.00| 0.00
+   0|   2| 258|100.00|  0.00|  2401||163295480|3811189||  0.00|  0.00| 0.00
+   0|   3|   3|100.00|  0.00|  2401||163295480|3811189||  0.00|  0.00| 0.00
+   0|   3| 259| 99.99|  0.01|  2435||163295480|3811189||  0.00|  0.00| 0.00
+   0|   4|   4|100.00|  0.00|  2401||163295480|3811189||  0.00|  0.00| 0.00
+   0|   4| 260|100.00|  0.00|  2435||163295480|3811189||  0.00|  0.00| 0.00
+   0|   5|   5| 99.99|  0.01|  2401||163295480|3811189||  0.00|  0.00| 0.00
+   0|   5| 261|100.00|  0.00|  2435||163295480|3811189||  0.00|  0.00| 0.00
+   0|   6|   6|100.00|  0.00|  2401||163295480|3811189||  0.00|  0.00| 0.00
+   0|   6| 262|100.00|  0.00|  2435||163295480|3811189||  0.00|  0.00| 0.00
+
+Cc: Thomas Renninger <trenn@suse.com>
+Cc: Shuah Khan <shuah@kernel.org>
+Cc: Dominik Brodowski <linux@dominikbrodowski.net>
+
+Fixes: 7fe2f6399a84 ("cpupowerutils - cpufrequtils extended with quite some features")
+Signed-off-by: Wyes Karny <wyes.karny@amd.com>
+Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../utils/idle_monitor/mperf_monitor.c        | 31 +++++++++----------
+ 1 file changed, 14 insertions(+), 17 deletions(-)
+
+diff --git a/tools/power/cpupower/utils/idle_monitor/mperf_monitor.c b/tools/power/cpupower/utils/idle_monitor/mperf_monitor.c
+index e7d48cb563c0e..ae6af354a81db 100644
+--- a/tools/power/cpupower/utils/idle_monitor/mperf_monitor.c
++++ b/tools/power/cpupower/utils/idle_monitor/mperf_monitor.c
+@@ -70,8 +70,8 @@ static int max_freq_mode;
+  */
+ static unsigned long max_frequency;
+-static unsigned long long tsc_at_measure_start;
+-static unsigned long long tsc_at_measure_end;
++static unsigned long long *tsc_at_measure_start;
++static unsigned long long *tsc_at_measure_end;
+ static unsigned long long *mperf_previous_count;
+ static unsigned long long *aperf_previous_count;
+ static unsigned long long *mperf_current_count;
+@@ -169,7 +169,7 @@ static int mperf_get_count_percent(unsigned int id, double *percent,
+       aperf_diff = aperf_current_count[cpu] - aperf_previous_count[cpu];
+       if (max_freq_mode == MAX_FREQ_TSC_REF) {
+-              tsc_diff = tsc_at_measure_end - tsc_at_measure_start;
++              tsc_diff = tsc_at_measure_end[cpu] - tsc_at_measure_start[cpu];
+               *percent = 100.0 * mperf_diff / tsc_diff;
+               dprint("%s: TSC Ref - mperf_diff: %llu, tsc_diff: %llu\n",
+                      mperf_cstates[id].name, mperf_diff, tsc_diff);
+@@ -206,7 +206,7 @@ static int mperf_get_count_freq(unsigned int id, unsigned long long *count,
+       if (max_freq_mode == MAX_FREQ_TSC_REF) {
+               /* Calculate max_freq from TSC count */
+-              tsc_diff = tsc_at_measure_end - tsc_at_measure_start;
++              tsc_diff = tsc_at_measure_end[cpu] - tsc_at_measure_start[cpu];
+               time_diff = timespec_diff_us(time_start, time_end);
+               max_frequency = tsc_diff / time_diff;
+       }
+@@ -225,33 +225,27 @@ static int mperf_get_count_freq(unsigned int id, unsigned long long *count,
+ static int mperf_start(void)
+ {
+       int cpu;
+-      unsigned long long dbg;
+       clock_gettime(CLOCK_REALTIME, &time_start);
+-      mperf_get_tsc(&tsc_at_measure_start);
+-      for (cpu = 0; cpu < cpu_count; cpu++)
++      for (cpu = 0; cpu < cpu_count; cpu++) {
++              mperf_get_tsc(&tsc_at_measure_start[cpu]);
+               mperf_init_stats(cpu);
++      }
+-      mperf_get_tsc(&dbg);
+-      dprint("TSC diff: %llu\n", dbg - tsc_at_measure_start);
+       return 0;
+ }
+ static int mperf_stop(void)
+ {
+-      unsigned long long dbg;
+       int cpu;
+-      for (cpu = 0; cpu < cpu_count; cpu++)
++      for (cpu = 0; cpu < cpu_count; cpu++) {
+               mperf_measure_stats(cpu);
++              mperf_get_tsc(&tsc_at_measure_end[cpu]);
++      }
+-      mperf_get_tsc(&tsc_at_measure_end);
+       clock_gettime(CLOCK_REALTIME, &time_end);
+-
+-      mperf_get_tsc(&dbg);
+-      dprint("TSC diff: %llu\n", dbg - tsc_at_measure_end);
+-
+       return 0;
+ }
+@@ -353,7 +347,8 @@ struct cpuidle_monitor *mperf_register(void)
+       aperf_previous_count = calloc(cpu_count, sizeof(unsigned long long));
+       mperf_current_count = calloc(cpu_count, sizeof(unsigned long long));
+       aperf_current_count = calloc(cpu_count, sizeof(unsigned long long));
+-
++      tsc_at_measure_start = calloc(cpu_count, sizeof(unsigned long long));
++      tsc_at_measure_end = calloc(cpu_count, sizeof(unsigned long long));
+       mperf_monitor.name_len = strlen(mperf_monitor.name);
+       return &mperf_monitor;
+ }
+@@ -364,6 +359,8 @@ void mperf_unregister(void)
+       free(aperf_previous_count);
+       free(mperf_current_count);
+       free(aperf_current_count);
++      free(tsc_at_measure_start);
++      free(tsc_at_measure_end);
+       free(is_valid);
+ }
+-- 
+2.39.2
+
diff --git a/queue-6.3/devlink-change-per-devlink-netdev-notifier-to-static.patch b/queue-6.3/devlink-change-per-devlink-netdev-notifier-to-static.patch
new file mode 100644 (file)
index 0000000..38047ef
--- /dev/null
@@ -0,0 +1,146 @@
+From 787fed95fdfc55cfe8d93e11825ead09fb7be5b2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 May 2023 16:46:21 +0200
+Subject: devlink: change per-devlink netdev notifier to static one
+
+From: Jiri Pirko <jiri@nvidia.com>
+
+[ Upstream commit e93c9378e33f68b61ea9318580d841caa22fb9ea ]
+
+The commit 565b4824c39f ("devlink: change port event netdev notifier
+from per-net to global") changed original per-net notifier to be
+per-devlink instance. That fixed the issue of non-receiving events
+of netdev uninit if that moved to a different namespace.
+That worked fine in -net tree.
+
+However, later on when commit ee75f1fc44dd ("net/mlx5e: Create
+separate devlink instance for ethernet auxiliary device") and
+commit 72ed5d5624af ("net/mlx5: Suspend auxiliary devices only in
+case of PCI device suspend") were merged, a deadlock was introduced
+when removing a namespace with devlink instance with another nested
+instance.
+
+Here there is the bad flow example resulting in deadlock with mlx5:
+net_cleanup_work -> cleanup_net (takes down_read(&pernet_ops_rwsem) ->
+devlink_pernet_pre_exit() -> devlink_reload() ->
+mlx5_devlink_reload_down() -> mlx5_unload_one_devl_locked() ->
+mlx5_detach_device() -> del_adev() -> mlx5e_remove() ->
+mlx5e_destroy_devlink() -> devlink_free() ->
+unregister_netdevice_notifier() (takes down_write(&pernet_ops_rwsem)
+
+Steps to reproduce:
+$ modprobe mlx5_core
+$ ip netns add ns1
+$ devlink dev reload pci/0000:08:00.0 netns ns1
+$ ip netns del ns1
+
+Resolve this by converting the notifier from per-devlink instance to
+a static one registered during init phase and leaving it registered
+forever. Use this notifier for all devlink port instances created
+later on.
+
+Note what a tree needs this fix only in case all of the cited fixes
+commits are present.
+
+Reported-by: Moshe Shemesh <moshe@nvidia.com>
+Fixes: 565b4824c39f ("devlink: change port event netdev notifier from per-net to global")
+Fixes: ee75f1fc44dd ("net/mlx5e: Create separate devlink instance for ethernet auxiliary device")
+Fixes: 72ed5d5624af ("net/mlx5: Suspend auxiliary devices only in case of PCI device suspend")
+Signed-off-by: Jiri Pirko <jiri@nvidia.com>
+Reviewed-by: Simon Horman <simon.horman@corigine.com>
+Link: https://lore.kernel.org/r/20230510144621.932017-1-jiri@resnulli.us
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/devlink/core.c          | 16 +++++++---------
+ net/devlink/devl_internal.h |  1 -
+ net/devlink/leftover.c      |  5 ++---
+ 3 files changed, 9 insertions(+), 13 deletions(-)
+
+diff --git a/net/devlink/core.c b/net/devlink/core.c
+index 777b091ef74df..0e58eee44bdb2 100644
+--- a/net/devlink/core.c
++++ b/net/devlink/core.c
+@@ -204,11 +204,6 @@ struct devlink *devlink_alloc_ns(const struct devlink_ops *ops,
+       if (ret < 0)
+               goto err_xa_alloc;
+-      devlink->netdevice_nb.notifier_call = devlink_port_netdevice_event;
+-      ret = register_netdevice_notifier(&devlink->netdevice_nb);
+-      if (ret)
+-              goto err_register_netdevice_notifier;
+-
+       devlink->dev = dev;
+       devlink->ops = ops;
+       xa_init_flags(&devlink->ports, XA_FLAGS_ALLOC);
+@@ -233,8 +228,6 @@ struct devlink *devlink_alloc_ns(const struct devlink_ops *ops,
+       return devlink;
+-err_register_netdevice_notifier:
+-      xa_erase(&devlinks, devlink->index);
+ err_xa_alloc:
+       kfree(devlink);
+       return NULL;
+@@ -266,8 +259,6 @@ void devlink_free(struct devlink *devlink)
+       xa_destroy(&devlink->params);
+       xa_destroy(&devlink->ports);
+-      WARN_ON_ONCE(unregister_netdevice_notifier(&devlink->netdevice_nb));
+-
+       xa_erase(&devlinks, devlink->index);
+       devlink_put(devlink);
+@@ -303,6 +294,10 @@ static struct pernet_operations devlink_pernet_ops __net_initdata = {
+       .pre_exit = devlink_pernet_pre_exit,
+ };
++static struct notifier_block devlink_port_netdevice_nb __net_initdata = {
++      .notifier_call = devlink_port_netdevice_event,
++};
++
+ static int __init devlink_init(void)
+ {
+       int err;
+@@ -311,6 +306,9 @@ static int __init devlink_init(void)
+       if (err)
+               goto out;
+       err = register_pernet_subsys(&devlink_pernet_ops);
++      if (err)
++              goto out;
++      err = register_netdevice_notifier(&devlink_port_netdevice_nb);
+ out:
+       WARN_ON(err);
+diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h
+index e133f423294a2..62921b2eb0d3f 100644
+--- a/net/devlink/devl_internal.h
++++ b/net/devlink/devl_internal.h
+@@ -50,7 +50,6 @@ struct devlink {
+       u8 reload_failed:1;
+       refcount_t refcount;
+       struct rcu_work rwork;
+-      struct notifier_block netdevice_nb;
+       char priv[] __aligned(NETDEV_ALIGN);
+ };
+diff --git a/net/devlink/leftover.c b/net/devlink/leftover.c
+index dffca2f9bfa7f..cd02549680767 100644
+--- a/net/devlink/leftover.c
++++ b/net/devlink/leftover.c
+@@ -7073,10 +7073,9 @@ int devlink_port_netdevice_event(struct notifier_block *nb,
+       struct devlink_port *devlink_port = netdev->devlink_port;
+       struct devlink *devlink;
+-      devlink = container_of(nb, struct devlink, netdevice_nb);
+-
+-      if (!devlink_port || devlink_port->devlink != devlink)
++      if (!devlink_port)
+               return NOTIFY_OK;
++      devlink = devlink_port->devlink;
+       switch (event) {
+       case NETDEV_POST_INIT:
+-- 
+2.39.2
+
diff --git a/queue-6.3/devlink-fix-crash-with-config_net_ns-n.patch b/queue-6.3/devlink-fix-crash-with-config_net_ns-n.patch
new file mode 100644 (file)
index 0000000..a4e050f
--- /dev/null
@@ -0,0 +1,68 @@
+From 28173c1e4e90f4414360fd710fbf1b05ad647e38 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 15 May 2023 19:29:25 +0300
+Subject: devlink: Fix crash with CONFIG_NET_NS=n
+
+From: Ido Schimmel <idosch@nvidia.com>
+
+[ Upstream commit d6352dae0903fe8beae4c007dc320e9e9f1fed45 ]
+
+'__net_initdata' becomes a no-op with CONFIG_NET_NS=y, but when this
+option is disabled it becomes '__initdata', which means the data can be
+freed after the initialization phase. This annotation is obviously
+incorrect for the devlink net device notifier block which is still
+registered after the initialization phase [1].
+
+Fix this crash by removing the '__net_initdata' annotation.
+
+[1]
+general protection fault, probably for non-canonical address 0xcccccccccccccccc: 0000 [#1] PREEMPT SMP
+CPU: 3 PID: 117 Comm: (udev-worker) Not tainted 6.4.0-rc1-custom-gdf0acdc59b09 #64
+Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-1.fc37 04/01/2014
+RIP: 0010:notifier_call_chain+0x58/0xc0
+[...]
+Call Trace:
+ <TASK>
+ dev_set_mac_address+0x85/0x120
+ dev_set_mac_address_user+0x30/0x50
+ do_setlink+0x219/0x1270
+ rtnl_setlink+0xf7/0x1a0
+ rtnetlink_rcv_msg+0x142/0x390
+ netlink_rcv_skb+0x58/0x100
+ netlink_unicast+0x188/0x270
+ netlink_sendmsg+0x214/0x470
+ __sys_sendto+0x12f/0x1a0
+ __x64_sys_sendto+0x24/0x30
+ do_syscall_64+0x38/0x80
+ entry_SYSCALL_64_after_hwframe+0x63/0xcd
+
+Fixes: e93c9378e33f ("devlink: change per-devlink netdev notifier to static one")
+Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
+Closes: https://lore.kernel.org/netdev/600ddf9e-589a-2aa0-7b69-a438f833ca10@samsung.com/
+Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
+Signed-off-by: Ido Schimmel <idosch@nvidia.com>
+Reviewed-by: Jiri Pirko <jiri@nvidia.com>
+Reviewed-by: Simon Horman <simon.horman@corigine.com>
+Link: https://lore.kernel.org/r/20230515162925.1144416-1-idosch@nvidia.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/devlink/core.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/net/devlink/core.c b/net/devlink/core.c
+index 0e58eee44bdb2..c23ebabadc526 100644
+--- a/net/devlink/core.c
++++ b/net/devlink/core.c
+@@ -294,7 +294,7 @@ static struct pernet_operations devlink_pernet_ops __net_initdata = {
+       .pre_exit = devlink_pernet_pre_exit,
+ };
+-static struct notifier_block devlink_port_netdevice_nb __net_initdata = {
++static struct notifier_block devlink_port_netdevice_nb = {
+       .notifier_call = devlink_port_netdevice_event,
+ };
+-- 
+2.39.2
+
diff --git a/queue-6.3/drm-exynos-fix-g2d_open-close-helper-function-defini.patch b/queue-6.3/drm-exynos-fix-g2d_open-close-helper-function-defini.patch
new file mode 100644 (file)
index 0000000..f30d947
--- /dev/null
@@ -0,0 +1,48 @@
+From e7b32374d97e9f3200d359af5cf547b8048bd48a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 17 Apr 2023 23:04:11 +0200
+Subject: drm/exynos: fix g2d_open/close helper function definitions
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit 2ef0785b30bd6549ddbc124979f1b6596e065ae2 ]
+
+The empty stub functions are defined as global functions, which
+causes a warning because of missing prototypes:
+
+drivers/gpu/drm/exynos/exynos_drm_g2d.h:37:5: error: no previous prototype for 'g2d_open'
+drivers/gpu/drm/exynos/exynos_drm_g2d.h:42:5: error: no previous prototype for 'g2d_close'
+
+Mark them as 'static inline' to avoid the warning and to make
+them behave as intended.
+
+Fixes: eb4d9796fa34 ("drm/exynos: g2d: Convert to driver component API")
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
+Signed-off-by: Inki Dae <inki.dae@samsung.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/exynos/exynos_drm_g2d.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.h b/drivers/gpu/drm/exynos/exynos_drm_g2d.h
+index 74ea3c26deadc..1a5ae781b56c6 100644
+--- a/drivers/gpu/drm/exynos/exynos_drm_g2d.h
++++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.h
+@@ -34,11 +34,11 @@ static inline int exynos_g2d_exec_ioctl(struct drm_device *dev, void *data,
+       return -ENODEV;
+ }
+-int g2d_open(struct drm_device *drm_dev, struct drm_file *file)
++static inline int g2d_open(struct drm_device *drm_dev, struct drm_file *file)
+ {
+       return 0;
+ }
+-void g2d_close(struct drm_device *drm_dev, struct drm_file *file)
++static inline void g2d_close(struct drm_device *drm_dev, struct drm_file *file)
+ { }
+ #endif
+-- 
+2.39.2
+
diff --git a/queue-6.3/drm-msm-dp-unregister-audio-driver-during-unbind.patch b/queue-6.3/drm-msm-dp-unregister-audio-driver-during-unbind.patch
new file mode 100644 (file)
index 0000000..3a50ab5
--- /dev/null
@@ -0,0 +1,81 @@
+From aecadc5d6d557961a84c456ce819ba987ab23543 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 21 Apr 2023 15:56:57 +0100
+Subject: drm/msm/dp: unregister audio driver during unbind
+
+From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+
+[ Upstream commit 85c636284cb63b7740b4ae98881ace92158068d3 ]
+
+while binding the code always registers a audio driver, however there
+is no corresponding unregistration done in unbind. This leads to multiple
+redundant audio platform devices if dp_display_bind and dp_display_unbind
+happens multiple times during startup. On X13s platform this resulted in
+6 to 9 audio codec device instead of just 3 codec devices for 3 dp ports.
+
+Fix this by unregistering codecs on unbind.
+
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+Fixes: d13e36d7d222 ("drm/msm/dp: add audio support for Display Port on MSM")
+Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Patchwork: https://patchwork.freedesktop.org/patch/533324/
+Link: https://lore.kernel.org/r/20230421145657.12186-1-srinivas.kandagatla@linaro.org
+Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/msm/dp/dp_audio.c   | 12 ++++++++++++
+ drivers/gpu/drm/msm/dp/dp_audio.h   |  2 ++
+ drivers/gpu/drm/msm/dp/dp_display.c |  1 +
+ 3 files changed, 15 insertions(+)
+
+diff --git a/drivers/gpu/drm/msm/dp/dp_audio.c b/drivers/gpu/drm/msm/dp/dp_audio.c
+index 6666783e1468e..1245c7aa49df8 100644
+--- a/drivers/gpu/drm/msm/dp/dp_audio.c
++++ b/drivers/gpu/drm/msm/dp/dp_audio.c
+@@ -593,6 +593,18 @@ static struct hdmi_codec_pdata codec_data = {
+       .i2s = 1,
+ };
++void dp_unregister_audio_driver(struct device *dev, struct dp_audio *dp_audio)
++{
++      struct dp_audio_private *audio_priv;
++
++      audio_priv = container_of(dp_audio, struct dp_audio_private, dp_audio);
++
++      if (audio_priv->audio_pdev) {
++              platform_device_unregister(audio_priv->audio_pdev);
++              audio_priv->audio_pdev = NULL;
++      }
++}
++
+ int dp_register_audio_driver(struct device *dev,
+               struct dp_audio *dp_audio)
+ {
+diff --git a/drivers/gpu/drm/msm/dp/dp_audio.h b/drivers/gpu/drm/msm/dp/dp_audio.h
+index 84e5f4a5d26ba..4ab78880af829 100644
+--- a/drivers/gpu/drm/msm/dp/dp_audio.h
++++ b/drivers/gpu/drm/msm/dp/dp_audio.h
+@@ -53,6 +53,8 @@ struct dp_audio *dp_audio_get(struct platform_device *pdev,
+ int dp_register_audio_driver(struct device *dev,
+               struct dp_audio *dp_audio);
++void dp_unregister_audio_driver(struct device *dev, struct dp_audio *dp_audio);
++
+ /**
+  * dp_audio_put()
+  *
+diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
+index bde1a7ce442ff..3f9a18410c0bb 100644
+--- a/drivers/gpu/drm/msm/dp/dp_display.c
++++ b/drivers/gpu/drm/msm/dp/dp_display.c
+@@ -326,6 +326,7 @@ static void dp_display_unbind(struct device *dev, struct device *master,
+       kthread_stop(dp->ev_tsk);
+       dp_power_client_deinit(dp->power);
++      dp_unregister_audio_driver(dev, dp->audio);
+       dp_aux_unregister(dp->aux);
+       dp->drm_dev = NULL;
+       dp->aux->drm_dev = NULL;
+-- 
+2.39.2
+
diff --git a/queue-6.3/drm-msm-dpu-allow-variable-intf_blk-size.patch b/queue-6.3/drm-msm-dpu-allow-variable-intf_blk-size.patch
new file mode 100644 (file)
index 0000000..d6b5ff0
--- /dev/null
@@ -0,0 +1,178 @@
+From 8c7dbe9cac0b3fc3a9cb6bfb623b1f18582866fd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 4 Apr 2023 16:05:43 +0300
+Subject: drm/msm/dpu: Allow variable INTF_BLK size
+
+From: Konrad Dybcio <konrad.dybcio@linaro.org>
+
+[ Upstream commit 8399a5ff18dc634d3245d993ee8a906b5c6ffba3 ]
+
+These blocks are of variable length on different SoCs. Set the
+correct values where I was able to retrieve it from downstream
+DTs and leave the old defaults (0x280) otherwise.
+
+Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
+[DB: fixed some lengths, split the INTF changes away]
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Patchwork: https://patchwork.freedesktop.org/patch/530816/
+Link: https://lore.kernel.org/r/20230404130622.509628-4-dmitry.baryshkov@linaro.org
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Stable-dep-of: 701f69183d4d ("drm/msm/dpu: Fix PP_BLK_DIPHER -> DITHER typo")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c    | 96 +++++++++----------
+ 1 file changed, 48 insertions(+), 48 deletions(-)
+
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+index dafc35c954f7c..eebda1db8213a 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+@@ -1847,10 +1847,10 @@ static struct dpu_dsc_cfg sm8150_dsc[] = {
+ /*************************************************************
+  * INTF sub blocks config
+  *************************************************************/
+-#define INTF_BLK(_name, _id, _base, _type, _ctrl_id, _progfetch, _features, _reg, _underrun_bit, _vsync_bit) \
++#define INTF_BLK(_name, _id, _base, _len, _type, _ctrl_id, _progfetch, _features, _reg, _underrun_bit, _vsync_bit) \
+       {\
+       .name = _name, .id = _id, \
+-      .base = _base, .len = 0x280, \
++      .base = _base, .len = _len, \
+       .features = _features, \
+       .type = _type, \
+       .controller_id = _ctrl_id, \
+@@ -1860,85 +1860,85 @@ static struct dpu_dsc_cfg sm8150_dsc[] = {
+       }
+ static const struct dpu_intf_cfg msm8998_intf[] = {
+-      INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
+-      INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+-      INTF_BLK("intf_2", INTF_2, 0x6B000, INTF_DSI, 1, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
+-      INTF_BLK("intf_3", INTF_3, 0x6B800, INTF_HDMI, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
++      INTF_BLK("intf_0", INTF_0, 0x6A000, 0x280, INTF_DP, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
++      INTF_BLK("intf_1", INTF_1, 0x6A800, 0x280, INTF_DSI, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
++      INTF_BLK("intf_2", INTF_2, 0x6B000, 0x280, INTF_DSI, 1, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
++      INTF_BLK("intf_3", INTF_3, 0x6B800, 0x280, INTF_HDMI, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+ };
+ static const struct dpu_intf_cfg sdm845_intf[] = {
+-      INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, 0, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
+-      INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+-      INTF_BLK("intf_2", INTF_2, 0x6B000, INTF_DSI, 1, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
+-      INTF_BLK("intf_3", INTF_3, 0x6B800, INTF_DP, 1, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
++      INTF_BLK("intf_0", INTF_0, 0x6A000, 0x280, INTF_DP, 0, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
++      INTF_BLK("intf_1", INTF_1, 0x6A800, 0x280, INTF_DSI, 0, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
++      INTF_BLK("intf_2", INTF_2, 0x6B000, 0x280, INTF_DSI, 1, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
++      INTF_BLK("intf_3", INTF_3, 0x6B800, 0x280, INTF_DP, 1, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+ };
+ static const struct dpu_intf_cfg sc7180_intf[] = {
+-      INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
+-      INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
++      INTF_BLK("intf_0", INTF_0, 0x6A000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
++      INTF_BLK("intf_1", INTF_1, 0x6A800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+ };
+ static const struct dpu_intf_cfg sm8150_intf[] = {
+-      INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
+-      INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+-      INTF_BLK("intf_2", INTF_2, 0x6B000, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
+-      INTF_BLK("intf_3", INTF_3, 0x6B800, INTF_DP, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
++      INTF_BLK("intf_0", INTF_0, 0x6A000, 0x280, INTF_DP, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
++      INTF_BLK("intf_1", INTF_1, 0x6A800, 0x2bc, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
++      INTF_BLK("intf_2", INTF_2, 0x6B000, 0x2bc, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
++      INTF_BLK("intf_3", INTF_3, 0x6B800, 0x280, INTF_DP, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+ };
+ static const struct dpu_intf_cfg sc7280_intf[] = {
+-      INTF_BLK("intf_0", INTF_0, 0x34000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
+-      INTF_BLK("intf_1", INTF_1, 0x35000, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+-      INTF_BLK("intf_5", INTF_5, 0x39000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 22, 23),
++      INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
++      INTF_BLK("intf_1", INTF_1, 0x35000, 0x2c4, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
++      INTF_BLK("intf_5", INTF_5, 0x39000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 22, 23),
+ };
+ static const struct dpu_intf_cfg sm8350_intf[] = {
+-      INTF_BLK("intf_0", INTF_0, 0x34000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
+-      INTF_BLK("intf_1", INTF_1, 0x35000, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+-      INTF_BLK("intf_2", INTF_2, 0x36000, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
+-      INTF_BLK("intf_3", INTF_3, 0x37000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
++      INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
++      INTF_BLK("intf_1", INTF_1, 0x35000, 0x2c4, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
++      INTF_BLK("intf_2", INTF_2, 0x36000, 0x2c4, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
++      INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+ };
+ static const struct dpu_intf_cfg sc8180x_intf[] = {
+-      INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
+-      INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+-      INTF_BLK("intf_2", INTF_2, 0x6B000, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
++      INTF_BLK("intf_0", INTF_0, 0x6A000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
++      INTF_BLK("intf_1", INTF_1, 0x6A800, 0x2bc, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
++      INTF_BLK("intf_2", INTF_2, 0x6B000, 0x2bc, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
+       /* INTF_3 is for MST, wired to INTF_DP 0 and 1, use dummy index until this is supported */
+-      INTF_BLK("intf_3", INTF_3, 0x6B800, INTF_DP, 999, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+-      INTF_BLK("intf_4", INTF_4, 0x6C000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 20, 21),
+-      INTF_BLK("intf_5", INTF_5, 0x6C800, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 22, 23),
++      INTF_BLK("intf_3", INTF_3, 0x6B800, 0x280, INTF_DP, 999, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
++      INTF_BLK("intf_4", INTF_4, 0x6C000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 20, 21),
++      INTF_BLK("intf_5", INTF_5, 0x6C800, 0x280, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 22, 23),
+ };
+ /* TODO: INTF 3, 8 and 7 are used for MST, marked as INTF_NONE for now */
+ static const struct dpu_intf_cfg sc8280xp_intf[] = {
+-      INTF_BLK("intf_0", INTF_0, 0x34000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
+-      INTF_BLK("intf_1", INTF_1, 0x35000, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+-      INTF_BLK("intf_2", INTF_2, 0x36000, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
+-      INTF_BLK("intf_3", INTF_3, 0x37000, INTF_NONE, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+-      INTF_BLK("intf_4", INTF_4, 0x38000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 20, 21),
+-      INTF_BLK("intf_5", INTF_5, 0x39000, INTF_DP, MSM_DP_CONTROLLER_3, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 22, 23),
+-      INTF_BLK("intf_6", INTF_6, 0x3a000, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 16, 17),
+-      INTF_BLK("intf_7", INTF_7, 0x3b000, INTF_NONE, MSM_DP_CONTROLLER_2, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 18, 19),
+-      INTF_BLK("intf_8", INTF_8, 0x3c000, INTF_NONE, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 12, 13),
++      INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
++      INTF_BLK("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
++      INTF_BLK("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
++      INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
++      INTF_BLK("intf_4", INTF_4, 0x38000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 20, 21),
++      INTF_BLK("intf_5", INTF_5, 0x39000, 0x280, INTF_DP, MSM_DP_CONTROLLER_3, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 22, 23),
++      INTF_BLK("intf_6", INTF_6, 0x3a000, 0x280, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 16, 17),
++      INTF_BLK("intf_7", INTF_7, 0x3b000, 0x280, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 18, 19),
++      INTF_BLK("intf_8", INTF_8, 0x3c000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 12, 13),
+ };
+ static const struct dpu_intf_cfg qcm2290_intf[] = {
+-      INTF_BLK("intf_0", INTF_0, 0x00000, INTF_NONE, 0, 0, 0, 0, 0, 0),
+-      INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
++      INTF_BLK("intf_0", INTF_0, 0x00000, 0x280, INTF_DP, 0, 0, 0, 0, 0, 0),
++      INTF_BLK("intf_1", INTF_1, 0x6A800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+ };
+ static const struct dpu_intf_cfg sm8450_intf[] = {
+-      INTF_BLK("intf_0", INTF_0, 0x34000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
+-      INTF_BLK("intf_1", INTF_1, 0x35000, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+-      INTF_BLK("intf_2", INTF_2, 0x36000, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
+-      INTF_BLK("intf_3", INTF_3, 0x37000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
++      INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
++      INTF_BLK("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
++      INTF_BLK("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
++      INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+ };
+ static const struct dpu_intf_cfg sm8550_intf[] = {
+-      INTF_BLK("intf_0", INTF_0, 0x34000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
++      INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
+       /* TODO TE sub-blocks for intf1 & intf2 */
+-      INTF_BLK("intf_1", INTF_1, 0x35000, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+-      INTF_BLK("intf_2", INTF_2, 0x36000, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
+-      INTF_BLK("intf_3", INTF_3, 0x37000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
++      INTF_BLK("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
++      INTF_BLK("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
++      INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+ };
+ /*************************************************************
+-- 
+2.39.2
+
diff --git a/queue-6.3/drm-msm-dpu-allow-variable-sspp_blk-size.patch b/queue-6.3/drm-msm-dpu-allow-variable-sspp_blk-size.patch
new file mode 100644 (file)
index 0000000..8075def
--- /dev/null
@@ -0,0 +1,295 @@
+From dcd61510905f494d485e98d08e391c9a0689024f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 4 Apr 2023 16:05:42 +0300
+Subject: drm/msm/dpu: Allow variable SSPP_BLK size
+
+From: Konrad Dybcio <konrad.dybcio@linaro.org>
+
+[ Upstream commit 8f940ddbc4f1b6cc454d9487f9cd735310fb0cfa ]
+
+These blocks are of variable length on different SoCs. Set the
+correct values where I was able to retrieve it from downstream
+DTs and leave the old defaults (0x1c8) otherwise.
+
+Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
+[DB: fixed some of lengths, split the INTF changes away]
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Patchwork: https://patchwork.freedesktop.org/patch/530814/
+Link: https://lore.kernel.org/r/20230404130622.509628-3-dmitry.baryshkov@linaro.org
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Stable-dep-of: 701f69183d4d ("drm/msm/dpu: Fix PP_BLK_DIPHER -> DITHER typo")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c    | 146 +++++++++---------
+ 1 file changed, 73 insertions(+), 73 deletions(-)
+
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+index e7b29b118eb5a..dafc35c954f7c 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+@@ -1166,11 +1166,11 @@ static const struct dpu_sspp_sub_blks sdm845_dma_sblk_1 = _DMA_SBLK("9", 2);
+ static const struct dpu_sspp_sub_blks sdm845_dma_sblk_2 = _DMA_SBLK("10", 3);
+ static const struct dpu_sspp_sub_blks sdm845_dma_sblk_3 = _DMA_SBLK("11", 4);
+-#define SSPP_BLK(_name, _id, _base, _features, \
++#define SSPP_BLK(_name, _id, _base, _len, _features, \
+               _sblk, _xinid, _type, _clkctrl) \
+       { \
+       .name = _name, .id = _id, \
+-      .base = _base, .len = 0x1c8, \
++      .base = _base, .len = _len, \
+       .features = _features, \
+       .sblk = &_sblk, \
+       .xin_id = _xinid, \
+@@ -1179,40 +1179,40 @@ static const struct dpu_sspp_sub_blks sdm845_dma_sblk_3 = _DMA_SBLK("11", 4);
+       }
+ static const struct dpu_sspp_cfg msm8998_sspp[] = {
+-      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_MSM8998_MASK,
++      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1ac, VIG_MSM8998_MASK,
+               msm8998_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+-      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_MSM8998_MASK,
++      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x1ac, VIG_MSM8998_MASK,
+               msm8998_vig_sblk_1, 4,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
+-      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_MSM8998_MASK,
++      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x1ac, VIG_MSM8998_MASK,
+               msm8998_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2),
+-      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_MSM8998_MASK,
++      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x1ac, VIG_MSM8998_MASK,
+               msm8998_vig_sblk_3, 12,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
+-      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_MSM8998_MASK,
++      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1ac, DMA_MSM8998_MASK,
+               sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+-      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_MSM8998_MASK,
++      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1ac, DMA_MSM8998_MASK,
+               sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
+-      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_MSM8998_MASK,
++      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1ac, DMA_CURSOR_MSM8998_MASK,
+               sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2),
+-      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000,  DMA_CURSOR_MSM8998_MASK,
++      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x1ac, DMA_CURSOR_MSM8998_MASK,
+               sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3),
+ };
+ static const struct dpu_sspp_cfg sdm845_sspp[] = {
+-      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SDM845_MASK_SDMA,
++      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1c8, VIG_SDM845_MASK_SDMA,
+               sdm845_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+-      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SDM845_MASK_SDMA,
++      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x1c8, VIG_SDM845_MASK_SDMA,
+               sdm845_vig_sblk_1, 4,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
+-      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SDM845_MASK_SDMA,
++      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x1c8, VIG_SDM845_MASK_SDMA,
+               sdm845_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2),
+-      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SDM845_MASK_SDMA,
++      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x1c8, VIG_SDM845_MASK_SDMA,
+               sdm845_vig_sblk_3, 12,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
+-      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK_SDMA,
++      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1c8, DMA_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+-      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_SDM845_MASK_SDMA,
++      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1c8, DMA_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
+-      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK_SDMA,
++      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1c8, DMA_CURSOR_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2),
+-      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000,  DMA_CURSOR_SDM845_MASK_SDMA,
++      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x1c8, DMA_CURSOR_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3),
+ };
+@@ -1223,13 +1223,13 @@ static const struct dpu_sspp_sub_blks sc7280_vig_sblk_0 =
+                       _VIG_SBLK_ROT("0", 4, DPU_SSPP_SCALER_QSEED4, &dpu_rot_sc7280_cfg_v2);
+ static const struct dpu_sspp_cfg sc7180_sspp[] = {
+-      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK,
++      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK,
+               sc7180_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+-      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK,
++      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK,
+               sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+-      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_CURSOR_SDM845_MASK,
++      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_CURSOR_SDM845_MASK,
+               sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
+-      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK,
++      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK,
+               sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2),
+ };
+@@ -1237,9 +1237,9 @@ static const struct dpu_sspp_sub_blks sm6115_vig_sblk_0 =
+                               _VIG_SBLK("0", 2, DPU_SSPP_SCALER_QSEED4);
+ static const struct dpu_sspp_cfg sm6115_sspp[] = {
+-      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK,
++      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK,
+               sm6115_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+-      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK,
++      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK,
+               sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+ };
+@@ -1253,21 +1253,21 @@ static const struct dpu_sspp_sub_blks sm8250_vig_sblk_3 =
+                               _VIG_SBLK("3", 8, DPU_SSPP_SCALER_QSEED4);
+ static const struct dpu_sspp_cfg sm8250_sspp[] = {
+-      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK_SDMA,
++      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK_SDMA,
+               sm8250_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+-      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SC7180_MASK_SDMA,
++      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x1f8, VIG_SC7180_MASK_SDMA,
+               sm8250_vig_sblk_1, 4,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
+-      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SC7180_MASK_SDMA,
++      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x1f8, VIG_SC7180_MASK_SDMA,
+               sm8250_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2),
+-      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SC7180_MASK_SDMA,
++      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x1f8, VIG_SC7180_MASK_SDMA,
+               sm8250_vig_sblk_3, 12,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
+-      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK_SDMA,
++      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+-      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_SDM845_MASK_SDMA,
++      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
+-      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK_SDMA,
++      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2),
+-      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000,  DMA_CURSOR_SDM845_MASK_SDMA,
++      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x1f8, DMA_CURSOR_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3),
+ };
+@@ -1281,21 +1281,21 @@ static const struct dpu_sspp_sub_blks sm8450_vig_sblk_3 =
+                               _VIG_SBLK("3", 8, DPU_SSPP_SCALER_QSEED4);
+ static const struct dpu_sspp_cfg sm8450_sspp[] = {
+-      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK,
+-              sm8450_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+-      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SC7180_MASK,
+-              sm8450_vig_sblk_1, 4,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
+-      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SC7180_MASK,
++      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x32c, VIG_SC7180_MASK,
++              sm8450_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
++      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x32c, VIG_SC7180_MASK,
++              sm8450_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
++      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x32c, VIG_SC7180_MASK,
+               sm8450_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2),
+-      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SC7180_MASK,
+-              sm8450_vig_sblk_3, 12,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
+-      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK,
++      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x32c, VIG_SC7180_MASK,
++              sm8450_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
++      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x32c, DMA_SDM845_MASK,
+               sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+-      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_SDM845_MASK,
++      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x32c, DMA_SDM845_MASK,
+               sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
+-      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK,
++      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x32c, DMA_CURSOR_SDM845_MASK,
+               sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2),
+-      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000,  DMA_CURSOR_SDM845_MASK,
++      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x32c, DMA_CURSOR_SDM845_MASK,
+               sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3),
+ };
+@@ -1311,36 +1311,36 @@ static const struct dpu_sspp_sub_blks sm8550_dma_sblk_4 = _DMA_SBLK("12", 5);
+ static const struct dpu_sspp_sub_blks sm8550_dma_sblk_5 = _DMA_SBLK("13", 6);
+ static const struct dpu_sspp_cfg sm8550_sspp[] = {
+-      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK,
+-              sm8550_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+-      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SC7180_MASK,
+-              sm8550_vig_sblk_1, 4,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
+-      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SC7180_MASK,
++      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x344, VIG_SC7180_MASK,
++              sm8550_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
++      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x344, VIG_SC7180_MASK,
++              sm8550_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
++      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x344, VIG_SC7180_MASK,
+               sm8550_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2),
+-      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SC7180_MASK,
+-              sm8550_vig_sblk_3, 12,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
+-      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK,
++      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x344, VIG_SC7180_MASK,
++              sm8550_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
++      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x344, DMA_SDM845_MASK,
+               sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+-      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_SDM845_MASK,
++      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x344, DMA_SDM845_MASK,
+               sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
+-      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_SDM845_MASK,
++      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x344, DMA_SDM845_MASK,
+               sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2),
+-      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000,  DMA_SDM845_MASK,
++      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x344, DMA_SDM845_MASK,
+               sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3),
+-      SSPP_BLK("sspp_12", SSPP_DMA4, 0x2c000,  DMA_CURSOR_SDM845_MASK,
++      SSPP_BLK("sspp_12", SSPP_DMA4, 0x2c000, 0x344, DMA_CURSOR_SDM845_MASK,
+               sm8550_dma_sblk_4, 14, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA4),
+-      SSPP_BLK("sspp_13", SSPP_DMA5, 0x2e000,  DMA_CURSOR_SDM845_MASK,
++      SSPP_BLK("sspp_13", SSPP_DMA5, 0x2e000, 0x344, DMA_CURSOR_SDM845_MASK,
+               sm8550_dma_sblk_5, 15, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA5),
+ };
+ static const struct dpu_sspp_cfg sc7280_sspp[] = {
+-      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7280_MASK_SDMA,
++      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7280_MASK_SDMA,
+               sc7280_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+-      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK_SDMA,
++      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+-      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_CURSOR_SDM845_MASK_SDMA,
++      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_CURSOR_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
+-      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK_SDMA,
++      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2),
+ };
+@@ -1354,21 +1354,21 @@ static const struct dpu_sspp_sub_blks sc8280xp_vig_sblk_3 =
+                               _VIG_SBLK("3", 8, DPU_SSPP_SCALER_QSEED4);
+ static const struct dpu_sspp_cfg sc8280xp_sspp[] = {
+-      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK,
+-               sc8280xp_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+-      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SC7180_MASK,
+-               sc8280xp_vig_sblk_1, 4,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
+-      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SC7180_MASK,
++      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x2ac, VIG_SC7180_MASK,
++               sc8280xp_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
++      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x2ac, VIG_SC7180_MASK,
++               sc8280xp_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
++      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x2ac, VIG_SC7180_MASK,
+                sc8280xp_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2),
+-      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SC7180_MASK,
+-               sc8280xp_vig_sblk_3, 12,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
+-      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, DMA_SDM845_MASK,
++      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x2ac, VIG_SC7180_MASK,
++               sc8280xp_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
++      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x2ac, DMA_SDM845_MASK,
+                sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+-      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, DMA_SDM845_MASK,
++      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x2ac, DMA_SDM845_MASK,
+                sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
+-      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, DMA_CURSOR_SDM845_MASK,
++      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x2ac, DMA_CURSOR_SDM845_MASK,
+                sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2),
+-      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, DMA_CURSOR_SDM845_MASK,
++      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x2ac, DMA_CURSOR_SDM845_MASK,
+                sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3),
+ };
+@@ -1389,9 +1389,9 @@ static const struct dpu_sspp_sub_blks qcm2290_vig_sblk_0 = _VIG_SBLK_NOSCALE("0"
+ static const struct dpu_sspp_sub_blks qcm2290_dma_sblk_0 = _DMA_SBLK("8", 1);
+ static const struct dpu_sspp_cfg qcm2290_sspp[] = {
+-      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_QCM2290_MASK,
++      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_QCM2290_MASK,
+                qcm2290_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+-      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK,
++      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK,
+                qcm2290_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+ };
+-- 
+2.39.2
+
diff --git a/queue-6.3/drm-msm-dpu-assign-missing-writeback-log_mask.patch b/queue-6.3/drm-msm-dpu-assign-missing-writeback-log_mask.patch
new file mode 100644 (file)
index 0000000..667452f
--- /dev/null
@@ -0,0 +1,40 @@
+From 0def2c8f3e840c81b2cfdeb854889db263bd6a15 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 26 Apr 2023 01:11:09 +0200
+Subject: drm/msm/dpu: Assign missing writeback log_mask
+
+From: Marijn Suijten <marijn.suijten@somainline.org>
+
+[ Upstream commit a432fc31f03db2546a48bcf5dd69ca28ceb732bf ]
+
+The WB debug log mask ended up never being assigned, leading to writes
+to this block to never be logged even if the mask is enabled in
+dpu_hw_util_log_mask via debugfs.
+
+Fixes: 84a33d0fd921 ("drm/msm/dpu: add dpu_hw_wb abstraction for writeback blocks")
+Signed-off-by: Marijn Suijten <marijn.suijten@somainline.org>
+Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Patchwork: https://patchwork.freedesktop.org/patch/533860/
+Link: https://lore.kernel.org/r/20230418-dpu-drop-useless-for-lookup-v3-1-e8d869eea455@somainline.org
+Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
+index 2d28afdf860ef..a3e413d277175 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
+@@ -61,6 +61,7 @@ static const struct dpu_wb_cfg *_wb_offset(enum dpu_wb wb,
+       for (i = 0; i < m->wb_count; i++) {
+               if (wb == m->wb[i].id) {
+                       b->blk_addr = addr + m->wb[i].base;
++                      b->log_mask = DPU_DBG_MASK_WB;
+                       return &m->wb[i];
+               }
+       }
+-- 
+2.39.2
+
diff --git a/queue-6.3/drm-msm-dpu-drop-smart_dma_rev-from-dpu_caps.patch b/queue-6.3/drm-msm-dpu-drop-smart_dma_rev-from-dpu_caps.patch
new file mode 100644 (file)
index 0000000..38a088e
--- /dev/null
@@ -0,0 +1,156 @@
+From 494d9332897dc5a023bcf615872e4ae5ad304c01 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 16 Mar 2023 19:16:51 +0300
+Subject: drm/msm/dpu: drop smart_dma_rev from dpu_caps
+
+From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+
+[ Upstream commit dcb3f7c9042d1c1aa637b58d47bd45c00b2ac153 ]
+
+The code doesn't use dpu_caps::smart_dma_rev field. It checks if the
+corresponding feature is enabled in the SSPP features. Drop the
+smart_dma_rev field completely.
+
+Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Patchwork: https://patchwork.freedesktop.org/patch/527369/
+Link: https://lore.kernel.org/r/20230316161653.4106395-31-dmitry.baryshkov@linaro.org
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Stable-dep-of: 701f69183d4d ("drm/msm/dpu: Fix PP_BLK_DIPHER -> DITHER typo")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 13 -------------
+ drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h |  2 --
+ 2 files changed, 15 deletions(-)
+
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+index 9fe4fc95ab65f..e7b29b118eb5a 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+@@ -317,7 +317,6 @@ static const struct dpu_caps msm8998_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0x7,
+       .qseed_type = DPU_SSPP_SCALER_QSEED3,
+-      .smart_dma_rev = DPU_SSPP_SMART_DMA_V1,
+       .ubwc_version = DPU_HW_UBWC_VER_10,
+       .has_src_split = true,
+       .has_dim_layer = true,
+@@ -332,7 +331,6 @@ static const struct dpu_caps msm8998_dpu_caps = {
+ static const struct dpu_caps qcm2290_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_LINE_WIDTH,
+       .max_mixer_blendstages = 0x4,
+-      .smart_dma_rev = DPU_SSPP_SMART_DMA_V2,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+       .max_linewidth = 2160,
+@@ -343,7 +341,6 @@ static const struct dpu_caps sdm845_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0xb,
+       .qseed_type = DPU_SSPP_SCALER_QSEED3,
+-      .smart_dma_rev = DPU_SSPP_SMART_DMA_V2,
+       .ubwc_version = DPU_HW_UBWC_VER_20,
+       .has_src_split = true,
+       .has_dim_layer = true,
+@@ -359,7 +356,6 @@ static const struct dpu_caps sc7180_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0x9,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .smart_dma_rev = DPU_SSPP_SMART_DMA_V2,
+       .ubwc_version = DPU_HW_UBWC_VER_20,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+@@ -371,7 +367,6 @@ static const struct dpu_caps sm6115_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_LINE_WIDTH,
+       .max_mixer_blendstages = 0x4,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */
+       .ubwc_version = DPU_HW_UBWC_VER_10,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+@@ -383,7 +378,6 @@ static const struct dpu_caps sm8150_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0xb,
+       .qseed_type = DPU_SSPP_SCALER_QSEED3,
+-      .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */
+       .ubwc_version = DPU_HW_UBWC_VER_30,
+       .has_src_split = true,
+       .has_dim_layer = true,
+@@ -399,7 +393,6 @@ static const struct dpu_caps sc8180x_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0xb,
+       .qseed_type = DPU_SSPP_SCALER_QSEED3,
+-      .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */
+       .ubwc_version = DPU_HW_UBWC_VER_30,
+       .has_src_split = true,
+       .has_dim_layer = true,
+@@ -415,7 +408,6 @@ static const struct dpu_caps sc8280xp_dpu_caps = {
+       .max_mixer_width = 2560,
+       .max_mixer_blendstages = 11,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */
+       .ubwc_version = DPU_HW_UBWC_VER_40,
+       .has_src_split = true,
+       .has_dim_layer = true,
+@@ -429,7 +421,6 @@ static const struct dpu_caps sm8250_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0xb,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */
+       .ubwc_version = DPU_HW_UBWC_VER_40,
+       .has_src_split = true,
+       .has_dim_layer = true,
+@@ -443,7 +434,6 @@ static const struct dpu_caps sm8350_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0xb,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */
+       .ubwc_version = DPU_HW_UBWC_VER_40,
+       .has_src_split = true,
+       .has_dim_layer = true,
+@@ -457,7 +447,6 @@ static const struct dpu_caps sm8450_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0xb,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */
+       .ubwc_version = DPU_HW_UBWC_VER_40,
+       .has_src_split = true,
+       .has_dim_layer = true,
+@@ -471,7 +460,6 @@ static const struct dpu_caps sm8550_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0xb,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */
+       .ubwc_version = DPU_HW_UBWC_VER_40,
+       .has_src_split = true,
+       .has_dim_layer = true,
+@@ -485,7 +473,6 @@ static const struct dpu_caps sc7280_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0x7,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .smart_dma_rev = DPU_SSPP_SMART_DMA_V2,
+       .ubwc_version = DPU_HW_UBWC_VER_30,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
+index 2c5bafacd609c..2531aac97a779 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
+@@ -394,7 +394,6 @@ struct dpu_rotation_cfg {
+  * @max_mixer_blendstages max layer mixer blend stages or
+  *                       supported z order
+  * @qseed_type         qseed2 or qseed3 support.
+- * @smart_dma_rev      Supported version of SmartDMA feature.
+  * @ubwc_version       UBWC feature version (0x0 for not supported)
+  * @has_src_split      source split feature status
+  * @has_dim_layer      dim layer feature status
+@@ -409,7 +408,6 @@ struct dpu_caps {
+       u32 max_mixer_width;
+       u32 max_mixer_blendstages;
+       u32 qseed_type;
+-      u32 smart_dma_rev;
+       u32 ubwc_version;
+       bool has_src_split;
+       bool has_dim_layer;
+-- 
+2.39.2
+
diff --git a/queue-6.3/drm-msm-dpu-fix-pp_blk_dipher-dither-typo.patch b/queue-6.3/drm-msm-dpu-fix-pp_blk_dipher-dither-typo.patch
new file mode 100644 (file)
index 0000000..07b9d68
--- /dev/null
@@ -0,0 +1,85 @@
+From ea121d7f63ed4242f4987859dc05c9293aa6fd63 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Apr 2023 00:37:19 +0200
+Subject: drm/msm/dpu: Fix PP_BLK_DIPHER -> DITHER typo
+
+From: Marijn Suijten <marijn.suijten@somainline.org>
+
+[ Upstream commit 701f69183d4d52533fb2af0d6948b7d1b00d1a09 ]
+
+SM8550 exclusively has a DITHER sub-block inside the PINGPONG block and
+no other registers, hence the DITHER name of the macro and a
+corresponding PINGPONG block length of zero.  However, the PP_BLK_ macro
+name was typo'd to DIPHER rather than DITHER.
+
+Fixes: efcd0107727c ("drm/msm/dpu: add support for SM8550")
+Signed-off-by: Marijn Suijten <marijn.suijten@somainline.org>
+Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
+Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Patchwork: https://patchwork.freedesktop.org/patch/534214/
+Link: https://lore.kernel.org/r/20230411-dpu-intf-te-v4-5-27ce1a5ab5c6@somainline.org
+Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h   | 16 ++++++++--------
+ drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c   |  2 +-
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h
+index 29d8786257070..6b71ab0162c68 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h
++++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h
+@@ -106,28 +106,28 @@ static const struct dpu_sspp_cfg sm8550_sspp[] = {
+ };
+ static const struct dpu_pingpong_cfg sm8550_pp[] = {
+-      PP_BLK_DIPHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk,
++      PP_BLK_DITHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
+                       -1),
+-      PP_BLK_DIPHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk,
++      PP_BLK_DITHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
+                       -1),
+-      PP_BLK_DIPHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk,
++      PP_BLK_DITHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
+                       -1),
+-      PP_BLK_DIPHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk,
++      PP_BLK_DITHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
+                       -1),
+-      PP_BLK_DIPHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk,
++      PP_BLK_DITHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30),
+                       -1),
+-      PP_BLK_DIPHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk,
++      PP_BLK_DITHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31),
+                       -1),
+-      PP_BLK_DIPHER("pingpong_6", PINGPONG_6, 0x66000, MERGE_3D_3, sc7280_pp_sblk,
++      PP_BLK_DITHER("pingpong_6", PINGPONG_6, 0x66000, MERGE_3D_3, sc7280_pp_sblk,
+                       -1,
+                       -1),
+-      PP_BLK_DIPHER("pingpong_7", PINGPONG_7, 0x66400, MERGE_3D_3, sc7280_pp_sblk,
++      PP_BLK_DITHER("pingpong_7", PINGPONG_7, 0x66400, MERGE_3D_3, sc7280_pp_sblk,
+                       -1,
+                       -1),
+ };
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+index e32b8aed6342f..f7214c4401e19 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+@@ -1435,7 +1435,7 @@ static const struct dpu_pingpong_sub_blks sc7280_pp_sblk = {
+       .len = 0x20, .version = 0x20000},
+ };
+-#define PP_BLK_DIPHER(_name, _id, _base, _merge_3d, _sblk, _done, _rdptr) \
++#define PP_BLK_DITHER(_name, _id, _base, _merge_3d, _sblk, _done, _rdptr) \
+       {\
+       .name = _name, .id = _id, \
+       .base = _base, .len = 0, \
+-- 
+2.39.2
+
diff --git a/queue-6.3/drm-msm-dpu-move-non-mdp_top-intf_intr-offsets-out-o.patch b/queue-6.3/drm-msm-dpu-move-non-mdp_top-intf_intr-offsets-out-o.patch
new file mode 100644 (file)
index 0000000..178729a
--- /dev/null
@@ -0,0 +1,67 @@
+From 4830c2bd9c431b4de4866a2992c4988dc74bf66b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Apr 2023 00:37:17 +0200
+Subject: drm/msm/dpu: Move non-MDP_TOP INTF_INTR offsets out of hwio header
+
+From: Marijn Suijten <marijn.suijten@somainline.org>
+
+[ Upstream commit e9d9ce5462fecdeefec87953de71df4d025cbc72 ]
+
+These offsets do not fall under the MDP TOP block and do not fit the
+comment right above.  Move them to dpu_hw_interrupts.c next to the
+repsective MDP_INTF_x_OFF interrupt block offsets.
+
+Fixes: 25fdd5933e4c ("drm/msm: Add SDM845 DPU support")
+Signed-off-by: Marijn Suijten <marijn.suijten@somainline.org>
+Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
+Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Patchwork: https://patchwork.freedesktop.org/patch/534203/
+Link: https://lore.kernel.org/r/20230411-dpu-intf-te-v4-3-27ce1a5ab5c6@somainline.org
+Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c | 5 ++++-
+ drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h          | 3 ---
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
+index 53326f25e40ef..85c0bda3ff90e 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
+@@ -15,7 +15,7 @@
+ /*
+  * Register offsets in MDSS register file for the interrupt registers
+- * w.r.t. to the MDP base
++ * w.r.t. the MDP base
+  */
+ #define MDP_SSPP_TOP0_OFF             0x0
+ #define MDP_INTF_0_OFF                        0x6A000
+@@ -24,6 +24,9 @@
+ #define MDP_INTF_3_OFF                        0x6B800
+ #define MDP_INTF_4_OFF                        0x6C000
+ #define MDP_INTF_5_OFF                        0x6C800
++#define INTF_INTR_EN                  0x1c0
++#define INTF_INTR_STATUS              0x1c4
++#define INTF_INTR_CLEAR                       0x1c8
+ #define MDP_AD4_0_OFF                 0x7C000
+ #define MDP_AD4_1_OFF                 0x7D000
+ #define MDP_AD4_INTR_EN_OFF           0x41c
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h
+index feb9a729844a3..5acd5683d25a4 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h
+@@ -21,9 +21,6 @@
+ #define HIST_INTR_EN                    0x01c
+ #define HIST_INTR_STATUS                0x020
+ #define HIST_INTR_CLEAR                 0x024
+-#define INTF_INTR_EN                    0x1C0
+-#define INTF_INTR_STATUS                0x1C4
+-#define INTF_INTR_CLEAR                 0x1C8
+ #define SPLIT_DISPLAY_EN                0x2F4
+ #define SPLIT_DISPLAY_UPPER_PIPE_CTRL   0x2F8
+ #define DSPP_IGC_COLOR0_RAM_LUTN        0x300
+-- 
+2.39.2
+
diff --git a/queue-6.3/drm-msm-dpu-move-ubwc-memory-configuration-to-separa.patch b/queue-6.3/drm-msm-dpu-move-ubwc-memory-configuration-to-separa.patch
new file mode 100644 (file)
index 0000000..11c5475
--- /dev/null
@@ -0,0 +1,537 @@
+From cfb3541e35255ffbf732d8d6906c064564aed7c2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 4 Apr 2023 16:05:46 +0300
+Subject: drm/msm/dpu: move UBWC/memory configuration to separate struct
+
+From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+
+[ Upstream commit fbbd8cce803a2ca86ae20fe37b1642571e9dd971 ]
+
+UBWC and highest bank settings differ slightly between different DPU
+units of the same generation, while the dpu_caps and dpu_mdp_cfg are
+much more stable. To ease configuration reuse move ubwc_swizzle and
+highest_bank_bit data to separate structure.
+
+Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
+Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Patchwork: https://patchwork.freedesktop.org/patch/530820/
+Link: https://lore.kernel.org/r/20230404130622.509628-7-dmitry.baryshkov@linaro.org
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Stable-dep-of: 701f69183d4d ("drm/msm/dpu: Fix PP_BLK_DIPHER -> DITHER typo")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c    | 112 +++++++++++++-----
+ .../gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h    |  19 ++-
+ drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c   |  18 +--
+ drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h   |   4 +-
+ 4 files changed, 107 insertions(+), 46 deletions(-)
+
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+index eebda1db8213a..fa48152b7c28f 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+@@ -317,7 +317,6 @@ static const struct dpu_caps msm8998_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0x7,
+       .qseed_type = DPU_SSPP_SCALER_QSEED3,
+-      .ubwc_version = DPU_HW_UBWC_VER_10,
+       .has_src_split = true,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+@@ -341,7 +340,6 @@ static const struct dpu_caps sdm845_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0xb,
+       .qseed_type = DPU_SSPP_SCALER_QSEED3,
+-      .ubwc_version = DPU_HW_UBWC_VER_20,
+       .has_src_split = true,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+@@ -356,7 +354,6 @@ static const struct dpu_caps sc7180_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0x9,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .ubwc_version = DPU_HW_UBWC_VER_20,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+       .max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+@@ -367,7 +364,6 @@ static const struct dpu_caps sm6115_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_LINE_WIDTH,
+       .max_mixer_blendstages = 0x4,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .ubwc_version = DPU_HW_UBWC_VER_10,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+       .max_linewidth = 2160,
+@@ -378,7 +374,6 @@ static const struct dpu_caps sm8150_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0xb,
+       .qseed_type = DPU_SSPP_SCALER_QSEED3,
+-      .ubwc_version = DPU_HW_UBWC_VER_30,
+       .has_src_split = true,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+@@ -393,7 +388,6 @@ static const struct dpu_caps sc8180x_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0xb,
+       .qseed_type = DPU_SSPP_SCALER_QSEED3,
+-      .ubwc_version = DPU_HW_UBWC_VER_30,
+       .has_src_split = true,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+@@ -408,7 +402,6 @@ static const struct dpu_caps sc8280xp_dpu_caps = {
+       .max_mixer_width = 2560,
+       .max_mixer_blendstages = 11,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .ubwc_version = DPU_HW_UBWC_VER_40,
+       .has_src_split = true,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+@@ -421,7 +414,6 @@ static const struct dpu_caps sm8250_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0xb,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .ubwc_version = DPU_HW_UBWC_VER_40,
+       .has_src_split = true,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+@@ -434,7 +426,6 @@ static const struct dpu_caps sm8350_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0xb,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .ubwc_version = DPU_HW_UBWC_VER_40,
+       .has_src_split = true,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+@@ -447,7 +438,6 @@ static const struct dpu_caps sm8450_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0xb,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .ubwc_version = DPU_HW_UBWC_VER_40,
+       .has_src_split = true,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+@@ -460,7 +450,6 @@ static const struct dpu_caps sm8550_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0xb,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .ubwc_version = DPU_HW_UBWC_VER_40,
+       .has_src_split = true,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+@@ -473,19 +462,86 @@ static const struct dpu_caps sc7280_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0x7,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .ubwc_version = DPU_HW_UBWC_VER_30,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+       .max_linewidth = 2400,
+       .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE,
+ };
++static const struct dpu_ubwc_cfg msm8998_ubwc_cfg = {
++      .ubwc_version = DPU_HW_UBWC_VER_10,
++      .highest_bank_bit = 0x2,
++};
++
++static const struct dpu_ubwc_cfg qcm2290_ubwc_cfg = {
++      .highest_bank_bit = 0x2,
++};
++
++static const struct dpu_ubwc_cfg sdm845_ubwc_cfg = {
++      .ubwc_version = DPU_HW_UBWC_VER_20,
++      .highest_bank_bit = 0x2,
++};
++
++static const struct dpu_ubwc_cfg sc7180_ubwc_cfg = {
++      .ubwc_version = DPU_HW_UBWC_VER_20,
++      .highest_bank_bit = 0x3,
++};
++
++static const struct dpu_ubwc_cfg sm6115_ubwc_cfg = {
++      .ubwc_version = DPU_HW_UBWC_VER_10,
++      .highest_bank_bit = 0x1,
++      .ubwc_swizzle = 0x7,
++};
++
++static const struct dpu_ubwc_cfg sm8150_ubwc_cfg = {
++      .ubwc_version = DPU_HW_UBWC_VER_30,
++      .highest_bank_bit = 0x2,
++};
++
++static const struct dpu_ubwc_cfg sc8180x_ubwc_cfg = {
++      .ubwc_version = DPU_HW_UBWC_VER_30,
++      .highest_bank_bit = 0x3,
++};
++
++static const struct dpu_ubwc_cfg sc8280xp_ubwc_cfg = {
++      .ubwc_version = DPU_HW_UBWC_VER_40,
++      .highest_bank_bit = 2,
++      .ubwc_swizzle = 6,
++};
++
++static const struct dpu_ubwc_cfg sm8250_ubwc_cfg = {
++      .ubwc_version = DPU_HW_UBWC_VER_40,
++      .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */
++      .ubwc_swizzle = 0x6,
++};
++
++static const struct dpu_ubwc_cfg sm8350_ubwc_cfg = {
++      .ubwc_version = DPU_HW_UBWC_VER_40,
++      .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */
++};
++
++static const struct dpu_ubwc_cfg sm8450_ubwc_cfg = {
++      .ubwc_version = DPU_HW_UBWC_VER_40,
++      .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */
++      .ubwc_swizzle = 0x6,
++};
++
++static const struct dpu_ubwc_cfg sm8550_ubwc_cfg = {
++      .ubwc_version = DPU_HW_UBWC_VER_40,
++      .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */
++};
++
++static const struct dpu_ubwc_cfg sc7280_ubwc_cfg = {
++      .ubwc_version = DPU_HW_UBWC_VER_30,
++      .highest_bank_bit = 0x1,
++      .ubwc_swizzle = 0x6,
++};
++
+ static const struct dpu_mdp_cfg msm8998_mdp[] = {
+       {
+       .name = "top_0", .id = MDP_TOP,
+       .base = 0x0, .len = 0x458,
+       .features = 0,
+-      .highest_bank_bit = 0x2,
+       .clk_ctrls[DPU_CLK_CTRL_VIG0] = {
+                       .reg_off = 0x2AC, .bit_off = 0},
+       .clk_ctrls[DPU_CLK_CTRL_VIG1] = {
+@@ -514,7 +570,6 @@ static const struct dpu_mdp_cfg sdm845_mdp[] = {
+       .name = "top_0", .id = MDP_TOP,
+       .base = 0x0, .len = 0x45C,
+       .features = BIT(DPU_MDP_AUDIO_SELECT),
+-      .highest_bank_bit = 0x2,
+       .clk_ctrls[DPU_CLK_CTRL_VIG0] = {
+                       .reg_off = 0x2AC, .bit_off = 0},
+       .clk_ctrls[DPU_CLK_CTRL_VIG1] = {
+@@ -539,7 +594,6 @@ static const struct dpu_mdp_cfg sc7180_mdp[] = {
+       .name = "top_0", .id = MDP_TOP,
+       .base = 0x0, .len = 0x494,
+       .features = 0,
+-      .highest_bank_bit = 0x3,
+       .clk_ctrls[DPU_CLK_CTRL_VIG0] = {
+               .reg_off = 0x2AC, .bit_off = 0},
+       .clk_ctrls[DPU_CLK_CTRL_DMA0] = {
+@@ -558,7 +612,6 @@ static const struct dpu_mdp_cfg sc8180x_mdp[] = {
+       .name = "top_0", .id = MDP_TOP,
+       .base = 0x0, .len = 0x45C,
+       .features = BIT(DPU_MDP_AUDIO_SELECT),
+-      .highest_bank_bit = 0x3,
+       .clk_ctrls[DPU_CLK_CTRL_VIG0] = {
+                       .reg_off = 0x2AC, .bit_off = 0},
+       .clk_ctrls[DPU_CLK_CTRL_VIG1] = {
+@@ -583,8 +636,6 @@ static const struct dpu_mdp_cfg sm6115_mdp[] = {
+       .name = "top_0", .id = MDP_TOP,
+       .base = 0x0, .len = 0x494,
+       .features = 0,
+-      .highest_bank_bit = 0x1,
+-      .ubwc_swizzle = 0x7,
+       .clk_ctrls[DPU_CLK_CTRL_VIG0] = {
+               .reg_off = 0x2ac, .bit_off = 0},
+       .clk_ctrls[DPU_CLK_CTRL_DMA0] = {
+@@ -597,8 +648,6 @@ static const struct dpu_mdp_cfg sm8250_mdp[] = {
+       .name = "top_0", .id = MDP_TOP,
+       .base = 0x0, .len = 0x494,
+       .features = 0,
+-      .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */
+-      .ubwc_swizzle = 0x6,
+       .clk_ctrls[DPU_CLK_CTRL_VIG0] = {
+                       .reg_off = 0x2AC, .bit_off = 0},
+       .clk_ctrls[DPU_CLK_CTRL_VIG1] = {
+@@ -627,7 +676,6 @@ static const struct dpu_mdp_cfg sm8350_mdp[] = {
+       .name = "top_0", .id = MDP_TOP,
+       .base = 0x0, .len = 0x494,
+       .features = 0,
+-      .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */
+       .clk_ctrls[DPU_CLK_CTRL_VIG0] = {
+                       .reg_off = 0x2ac, .bit_off = 0},
+       .clk_ctrls[DPU_CLK_CTRL_VIG1] = {
+@@ -654,8 +702,6 @@ static const struct dpu_mdp_cfg sm8450_mdp[] = {
+       .name = "top_0", .id = MDP_TOP,
+       .base = 0x0, .len = 0x494,
+       .features = BIT(DPU_MDP_PERIPH_0_REMOVED),
+-      .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */
+-      .ubwc_swizzle = 0x6,
+       .clk_ctrls[DPU_CLK_CTRL_VIG0] = {
+                       .reg_off = 0x2AC, .bit_off = 0},
+       .clk_ctrls[DPU_CLK_CTRL_VIG1] = {
+@@ -681,8 +727,6 @@ static const struct dpu_mdp_cfg sc7280_mdp[] = {
+       {
+       .name = "top_0", .id = MDP_TOP,
+       .base = 0x0, .len = 0x2014,
+-      .highest_bank_bit = 0x1,
+-      .ubwc_swizzle = 0x6,
+       .clk_ctrls[DPU_CLK_CTRL_VIG0] = {
+               .reg_off = 0x2AC, .bit_off = 0},
+       .clk_ctrls[DPU_CLK_CTRL_DMA0] = {
+@@ -699,8 +743,6 @@ static const struct dpu_mdp_cfg sc8280xp_mdp[] = {
+       .name = "top_0", .id = MDP_TOP,
+       .base = 0x0, .len = 0x494,
+       .features = BIT(DPU_MDP_PERIPH_0_REMOVED),
+-      .highest_bank_bit = 2,
+-      .ubwc_swizzle = 6,
+       .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0},
+       .clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0},
+       .clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0},
+@@ -718,8 +760,6 @@ static const struct dpu_mdp_cfg sm8550_mdp[] = {
+       .name = "top_0", .id = MDP_TOP,
+       .base = 0, .len = 0x494,
+       .features = BIT(DPU_MDP_PERIPH_0_REMOVED),
+-      .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */
+-      .ubwc_swizzle = 0x6,
+       .clk_ctrls[DPU_CLK_CTRL_VIG0] = {
+                       .reg_off = 0x4330, .bit_off = 0},
+       .clk_ctrls[DPU_CLK_CTRL_VIG1] = {
+@@ -750,7 +790,6 @@ static const struct dpu_mdp_cfg qcm2290_mdp[] = {
+       .name = "top_0", .id = MDP_TOP,
+       .base = 0x0, .len = 0x494,
+       .features = 0,
+-      .highest_bank_bit = 0x2,
+       .clk_ctrls[DPU_CLK_CTRL_VIG0] = {
+               .reg_off = 0x2AC, .bit_off = 0},
+       .clk_ctrls[DPU_CLK_CTRL_DMA0] = {
+@@ -2524,6 +2563,7 @@ static const struct dpu_perf_cfg qcm2290_perf_data = {
+ static const struct dpu_mdss_cfg msm8998_dpu_cfg = {
+       .caps = &msm8998_dpu_caps,
++      .ubwc = &msm8998_ubwc_cfg,
+       .mdp_count = ARRAY_SIZE(msm8998_mdp),
+       .mdp = msm8998_mdp,
+       .ctl_count = ARRAY_SIZE(msm8998_ctl),
+@@ -2547,6 +2587,7 @@ static const struct dpu_mdss_cfg msm8998_dpu_cfg = {
+ static const struct dpu_mdss_cfg sdm845_dpu_cfg = {
+       .caps = &sdm845_dpu_caps,
++      .ubwc = &sdm845_ubwc_cfg,
+       .mdp_count = ARRAY_SIZE(sdm845_mdp),
+       .mdp = sdm845_mdp,
+       .ctl_count = ARRAY_SIZE(sdm845_ctl),
+@@ -2571,6 +2612,7 @@ static const struct dpu_mdss_cfg sdm845_dpu_cfg = {
+ static const struct dpu_mdss_cfg sc7180_dpu_cfg = {
+       .caps = &sc7180_dpu_caps,
++      .ubwc = &sc7180_ubwc_cfg,
+       .mdp_count = ARRAY_SIZE(sc7180_mdp),
+       .mdp = sc7180_mdp,
+       .ctl_count = ARRAY_SIZE(sc7180_ctl),
+@@ -2597,6 +2639,7 @@ static const struct dpu_mdss_cfg sc7180_dpu_cfg = {
+ static const struct dpu_mdss_cfg sm6115_dpu_cfg = {
+       .caps = &sm6115_dpu_caps,
++      .ubwc = &sm6115_ubwc_cfg,
+       .mdp_count = ARRAY_SIZE(sm6115_mdp),
+       .mdp = sm6115_mdp,
+       .ctl_count = ARRAY_SIZE(qcm2290_ctl),
+@@ -2619,6 +2662,7 @@ static const struct dpu_mdss_cfg sm6115_dpu_cfg = {
+ static const struct dpu_mdss_cfg sm8150_dpu_cfg = {
+       .caps = &sm8150_dpu_caps,
++      .ubwc = &sm8150_ubwc_cfg,
+       .mdp_count = ARRAY_SIZE(sdm845_mdp),
+       .mdp = sdm845_mdp,
+       .ctl_count = ARRAY_SIZE(sm8150_ctl),
+@@ -2647,6 +2691,7 @@ static const struct dpu_mdss_cfg sm8150_dpu_cfg = {
+ static const struct dpu_mdss_cfg sc8180x_dpu_cfg = {
+       .caps = &sc8180x_dpu_caps,
++      .ubwc = &sc8180x_ubwc_cfg,
+       .mdp_count = ARRAY_SIZE(sc8180x_mdp),
+       .mdp = sc8180x_mdp,
+       .ctl_count = ARRAY_SIZE(sm8150_ctl),
+@@ -2671,6 +2716,7 @@ static const struct dpu_mdss_cfg sc8180x_dpu_cfg = {
+ static const struct dpu_mdss_cfg sc8280xp_dpu_cfg = {
+       .caps = &sc8280xp_dpu_caps,
++      .ubwc = &sc8280xp_ubwc_cfg,
+       .mdp_count = ARRAY_SIZE(sc8280xp_mdp),
+       .mdp = sc8280xp_mdp,
+       .ctl_count = ARRAY_SIZE(sc8280xp_ctl),
+@@ -2697,6 +2743,7 @@ static const struct dpu_mdss_cfg sc8280xp_dpu_cfg = {
+ static const struct dpu_mdss_cfg sm8250_dpu_cfg = {
+       .caps = &sm8250_dpu_caps,
++      .ubwc = &sm8250_ubwc_cfg,
+       .mdp_count = ARRAY_SIZE(sm8250_mdp),
+       .mdp = sm8250_mdp,
+       .ctl_count = ARRAY_SIZE(sm8150_ctl),
+@@ -2727,6 +2774,7 @@ static const struct dpu_mdss_cfg sm8250_dpu_cfg = {
+ static const struct dpu_mdss_cfg sm8350_dpu_cfg = {
+       .caps = &sm8350_dpu_caps,
++      .ubwc = &sm8350_ubwc_cfg,
+       .mdp_count = ARRAY_SIZE(sm8350_mdp),
+       .mdp = sm8350_mdp,
+       .ctl_count = ARRAY_SIZE(sm8350_ctl),
+@@ -2753,6 +2801,7 @@ static const struct dpu_mdss_cfg sm8350_dpu_cfg = {
+ static const struct dpu_mdss_cfg sm8450_dpu_cfg = {
+       .caps = &sm8450_dpu_caps,
++      .ubwc = &sm8450_ubwc_cfg,
+       .mdp_count = ARRAY_SIZE(sm8450_mdp),
+       .mdp = sm8450_mdp,
+       .ctl_count = ARRAY_SIZE(sm8450_ctl),
+@@ -2779,6 +2828,7 @@ static const struct dpu_mdss_cfg sm8450_dpu_cfg = {
+ static const struct dpu_mdss_cfg sm8550_dpu_cfg = {
+       .caps = &sm8550_dpu_caps,
++      .ubwc = &sm8550_ubwc_cfg,
+       .mdp_count = ARRAY_SIZE(sm8550_mdp),
+       .mdp = sm8550_mdp,
+       .ctl_count = ARRAY_SIZE(sm8550_ctl),
+@@ -2805,6 +2855,7 @@ static const struct dpu_mdss_cfg sm8550_dpu_cfg = {
+ static const struct dpu_mdss_cfg sc7280_dpu_cfg = {
+       .caps = &sc7280_dpu_caps,
++      .ubwc = &sc7280_ubwc_cfg,
+       .mdp_count = ARRAY_SIZE(sc7280_mdp),
+       .mdp = sc7280_mdp,
+       .ctl_count = ARRAY_SIZE(sc7280_ctl),
+@@ -2827,6 +2878,7 @@ static const struct dpu_mdss_cfg sc7280_dpu_cfg = {
+ static const struct dpu_mdss_cfg qcm2290_dpu_cfg = {
+       .caps = &qcm2290_dpu_caps,
++      .ubwc = &qcm2290_ubwc_cfg,
+       .mdp_count = ARRAY_SIZE(qcm2290_mdp),
+       .mdp = qcm2290_mdp,
+       .ctl_count = ARRAY_SIZE(qcm2290_ctl),
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
+index 2531aac97a779..5f96dd8def092 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
+@@ -394,7 +394,6 @@ struct dpu_rotation_cfg {
+  * @max_mixer_blendstages max layer mixer blend stages or
+  *                       supported z order
+  * @qseed_type         qseed2 or qseed3 support.
+- * @ubwc_version       UBWC feature version (0x0 for not supported)
+  * @has_src_split      source split feature status
+  * @has_dim_layer      dim layer feature status
+  * @has_idle_pc        indicate if idle power collapse feature is supported
+@@ -408,7 +407,6 @@ struct dpu_caps {
+       u32 max_mixer_width;
+       u32 max_mixer_blendstages;
+       u32 qseed_type;
+-      u32 ubwc_version;
+       bool has_src_split;
+       bool has_dim_layer;
+       bool has_idle_pc;
+@@ -537,15 +535,24 @@ struct dpu_clk_ctrl_reg {
+  * @id:                index identifying this block
+  * @base:              register base offset to mdss
+  * @features           bit mask identifying sub-blocks/features
+- * @highest_bank_bit:  UBWC parameter
+- * @ubwc_swizzle:      ubwc default swizzle setting
+  * @clk_ctrls          clock control register definition
+  */
+ struct dpu_mdp_cfg {
+       DPU_HW_BLK_INFO;
++      struct dpu_clk_ctrl_reg clk_ctrls[DPU_CLK_CTRL_MAX];
++};
++
++/**
++ * struct dpu_ubwc_cfg - UBWC and memory configuration
++ *
++ * @ubwc_version       UBWC feature version (0x0 for not supported)
++ * @highest_bank_bit:  UBWC parameter
++ * @ubwc_swizzle:      ubwc default swizzle setting
++ */
++struct dpu_ubwc_cfg {
++      u32 ubwc_version;
+       u32 highest_bank_bit;
+       u32 ubwc_swizzle;
+-      struct dpu_clk_ctrl_reg clk_ctrls[DPU_CLK_CTRL_MAX];
+ };
+ /* struct dpu_ctl_cfg : MDP CTL instance info
+@@ -847,6 +854,8 @@ struct dpu_perf_cfg {
+ struct dpu_mdss_cfg {
+       const struct dpu_caps *caps;
++      const struct dpu_ubwc_cfg *ubwc;
++
+       u32 mdp_count;
+       const struct dpu_mdp_cfg *mdp;
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
+index 4246ab0b3beea..a82113b7d632a 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
+@@ -307,25 +307,25 @@ static void dpu_hw_sspp_setup_format(struct dpu_hw_pipe *ctx,
+               src_format |= (fmt->fetch_mode & 3) << 30; /*FRAME_FORMAT */
+               DPU_REG_WRITE(c, SSPP_FETCH_CONFIG,
+                       DPU_FETCH_CONFIG_RESET_VALUE |
+-                      ctx->mdp->highest_bank_bit << 18);
+-              switch (ctx->catalog->caps->ubwc_version) {
++                      ctx->ubwc->highest_bank_bit << 18);
++              switch (ctx->ubwc->ubwc_version) {
+               case DPU_HW_UBWC_VER_10:
+                       fast_clear = fmt->alpha_enable ? BIT(31) : 0;
+                       DPU_REG_WRITE(c, SSPP_UBWC_STATIC_CTRL,
+-                                      fast_clear | (ctx->mdp->ubwc_swizzle & 0x1) |
++                                      fast_clear | (ctx->ubwc->ubwc_swizzle & 0x1) |
+                                       BIT(8) |
+-                                      (ctx->mdp->highest_bank_bit << 4));
++                                      (ctx->ubwc->highest_bank_bit << 4));
+                       break;
+               case DPU_HW_UBWC_VER_20:
+                       fast_clear = fmt->alpha_enable ? BIT(31) : 0;
+                       DPU_REG_WRITE(c, SSPP_UBWC_STATIC_CTRL,
+-                                      fast_clear | (ctx->mdp->ubwc_swizzle) |
+-                                      (ctx->mdp->highest_bank_bit << 4));
++                                      fast_clear | (ctx->ubwc->ubwc_swizzle) |
++                                      (ctx->ubwc->highest_bank_bit << 4));
+                       break;
+               case DPU_HW_UBWC_VER_30:
+                       DPU_REG_WRITE(c, SSPP_UBWC_STATIC_CTRL,
+-                                      BIT(30) | (ctx->mdp->ubwc_swizzle) |
+-                                      (ctx->mdp->highest_bank_bit << 4));
++                                      BIT(30) | (ctx->ubwc->ubwc_swizzle) |
++                                      (ctx->ubwc->highest_bank_bit << 4));
+                       break;
+               case DPU_HW_UBWC_VER_40:
+                       DPU_REG_WRITE(c, SSPP_UBWC_STATIC_CTRL,
+@@ -804,7 +804,7 @@ struct dpu_hw_pipe *dpu_hw_sspp_init(enum dpu_sspp idx,
+       /* Assign ops */
+       hw_pipe->catalog = catalog;
+-      hw_pipe->mdp = &catalog->mdp[0];
++      hw_pipe->ubwc = catalog->ubwc;
+       hw_pipe->idx = idx;
+       hw_pipe->cap = cfg;
+       _setup_layer_ops(hw_pipe, hw_pipe->cap->features);
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
+index 0c95b7e64f6c2..cc435fa58f382 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
+@@ -351,7 +351,7 @@ struct dpu_hw_sspp_ops {
+  * @base: hardware block base structure
+  * @hw: block hardware details
+  * @catalog: back pointer to catalog
+- * @mdp: pointer to associated mdp portion of the catalog
++ * @ubwc: ubwc configuration data
+  * @idx: pipe index
+  * @cap: pointer to layer_cfg
+  * @ops: pointer to operations possible for this pipe
+@@ -360,7 +360,7 @@ struct dpu_hw_pipe {
+       struct dpu_hw_blk base;
+       struct dpu_hw_blk_reg_map hw;
+       const struct dpu_mdss_cfg *catalog;
+-      const struct dpu_mdp_cfg *mdp;
++      const struct dpu_ubwc_cfg *ubwc;
+       /* Pipe */
+       enum dpu_sspp idx;
+-- 
+2.39.2
+
diff --git a/queue-6.3/drm-msm-dpu-populate-smartdma-features-in-hw-catalog.patch b/queue-6.3/drm-msm-dpu-populate-smartdma-features-in-hw-catalog.patch
new file mode 100644 (file)
index 0000000..3636031
--- /dev/null
@@ -0,0 +1,155 @@
+From 820ddbc8c1d6dad23e558e407e7e02da83cd8791 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 16 Mar 2023 19:16:49 +0300
+Subject: drm/msm/dpu: populate SmartDMA features in hw catalog
+
+From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+
+[ Upstream commit 8b409996ebdce009777dfb17e542c06f749b02d5 ]
+
+Downstream driver uses dpu->caps->smart_dma_rev to update
+sspp->cap->features with the bit corresponding to the supported SmartDMA
+version. Upstream driver does not do this, resulting in SSPP subdriver
+not enabling setup_multirect callback. Add corresponding SmartDMA SSPP
+feature bits to dpu hw catalog.
+
+Per Abhinav's request enable the SmartDMA features only on the platforms
+where the multirect was actually verified visually (sdm845 and sm8250).
+An (untested) enablement on the rest of the platforms comes in the next
+patch.
+
+Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Patchwork: https://patchwork.freedesktop.org/patch/527362/
+Link: https://lore.kernel.org/r/20230316161653.4106395-29-dmitry.baryshkov@linaro.org
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Stable-dep-of: 701f69183d4d ("drm/msm/dpu: Fix PP_BLK_DIPHER -> DITHER typo")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c    | 55 ++++++++++++-------
+ 1 file changed, 35 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+index 497c9e1673abb..9fe4fc95ab65f 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+@@ -27,9 +27,15 @@
+ #define VIG_SDM845_MASK \
+       (VIG_MASK | BIT(DPU_SSPP_QOS_8LVL) | BIT(DPU_SSPP_SCALER_QSEED3))
++#define VIG_SDM845_MASK_SDMA \
++      (VIG_SDM845_MASK | BIT(DPU_SSPP_SMART_DMA_V2))
++
+ #define VIG_SC7180_MASK \
+       (VIG_MASK | BIT(DPU_SSPP_QOS_8LVL) | BIT(DPU_SSPP_SCALER_QSEED4))
++#define VIG_SC7180_MASK_SDMA \
++      (VIG_SC7180_MASK | BIT(DPU_SSPP_SMART_DMA_V2))
++
+ #define VIG_QCM2290_MASK (VIG_BASE_MASK | BIT(DPU_SSPP_QOS_8LVL))
+ #define DMA_MSM8998_MASK \
+@@ -40,6 +46,9 @@
+ #define VIG_SC7280_MASK \
+       (VIG_SC7180_MASK | BIT(DPU_SSPP_INLINE_ROTATION))
++#define VIG_SC7280_MASK_SDMA \
++      (VIG_SC7280_MASK | BIT(DPU_SSPP_SMART_DMA_V2))
++
+ #define DMA_SDM845_MASK \
+       (BIT(DPU_SSPP_SRC) | BIT(DPU_SSPP_QOS) | BIT(DPU_SSPP_QOS_8LVL) |\
+       BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_TS_PREFILL_REC1) |\
+@@ -48,6 +57,12 @@
+ #define DMA_CURSOR_SDM845_MASK \
+       (DMA_SDM845_MASK | BIT(DPU_SSPP_CURSOR))
++#define DMA_SDM845_MASK_SDMA \
++      (DMA_SDM845_MASK | BIT(DPU_SSPP_SMART_DMA_V2))
++
++#define DMA_CURSOR_SDM845_MASK_SDMA \
++      (DMA_CURSOR_SDM845_MASK | BIT(DPU_SSPP_SMART_DMA_V2))
++
+ #define DMA_CURSOR_MSM8998_MASK \
+       (DMA_MSM8998_MASK | BIT(DPU_SSPP_CURSOR))
+@@ -1196,21 +1211,21 @@ static const struct dpu_sspp_cfg msm8998_sspp[] = {
+ };
+ static const struct dpu_sspp_cfg sdm845_sspp[] = {
+-      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SDM845_MASK,
++      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SDM845_MASK_SDMA,
+               sdm845_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+-      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SDM845_MASK,
++      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SDM845_MASK_SDMA,
+               sdm845_vig_sblk_1, 4,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
+-      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SDM845_MASK,
++      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SDM845_MASK_SDMA,
+               sdm845_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2),
+-      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SDM845_MASK,
++      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SDM845_MASK_SDMA,
+               sdm845_vig_sblk_3, 12,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
+-      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK,
++      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+-      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_SDM845_MASK,
++      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
+-      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK,
++      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2),
+-      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000,  DMA_CURSOR_SDM845_MASK,
++      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000,  DMA_CURSOR_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3),
+ };
+@@ -1251,21 +1266,21 @@ static const struct dpu_sspp_sub_blks sm8250_vig_sblk_3 =
+                               _VIG_SBLK("3", 8, DPU_SSPP_SCALER_QSEED4);
+ static const struct dpu_sspp_cfg sm8250_sspp[] = {
+-      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK,
++      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK_SDMA,
+               sm8250_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+-      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SC7180_MASK,
++      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SC7180_MASK_SDMA,
+               sm8250_vig_sblk_1, 4,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
+-      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SC7180_MASK,
++      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SC7180_MASK_SDMA,
+               sm8250_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2),
+-      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SC7180_MASK,
++      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SC7180_MASK_SDMA,
+               sm8250_vig_sblk_3, 12,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
+-      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK,
++      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+-      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_SDM845_MASK,
++      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
+-      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK,
++      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2),
+-      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000,  DMA_CURSOR_SDM845_MASK,
++      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000,  DMA_CURSOR_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3),
+ };
+@@ -1332,13 +1347,13 @@ static const struct dpu_sspp_cfg sm8550_sspp[] = {
+ };
+ static const struct dpu_sspp_cfg sc7280_sspp[] = {
+-      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7280_MASK,
++      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7280_MASK_SDMA,
+               sc7280_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+-      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK,
++      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+-      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_CURSOR_SDM845_MASK,
++      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_CURSOR_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
+-      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK,
++      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK_SDMA,
+               sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2),
+ };
+-- 
+2.39.2
+
diff --git a/queue-6.3/drm-msm-dpu-reindent-rev_7xxx-interrupt-masks-with-t.patch b/queue-6.3/drm-msm-dpu-reindent-rev_7xxx-interrupt-masks-with-t.patch
new file mode 100644 (file)
index 0000000..2835a48
--- /dev/null
@@ -0,0 +1,58 @@
+From 60e5ca4d20c52ff2862960a1e2d04d967ed2bd4d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Apr 2023 00:37:18 +0200
+Subject: drm/msm/dpu: Reindent REV_7xxx interrupt masks with tabs
+
+From: Marijn Suijten <marijn.suijten@somainline.org>
+
+[ Upstream commit 85340c0256f9b85b47c5867e411df37d76df5858 ]
+
+Use tabs for consistency with the other interrupt register definitions,
+rather than spaces.
+
+Fixes: ed6154a136e4 ("drm/msm/disp/dpu1: add intf offsets for SC7280 target")
+Fixes: 89688e2119b2 ("drm/msm/dpu: Add more of the INTF interrupt regions")
+Fixes: 4a352c2fc15a ("drm/msm/dpu: Introduce SC8280XP")
+Signed-off-by: Marijn Suijten <marijn.suijten@somainline.org>
+Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Patchwork: https://patchwork.freedesktop.org/patch/534212/
+Link: https://lore.kernel.org/r/20230411-dpu-intf-te-v4-4-27ce1a5ab5c6@somainline.org
+Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c  | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
+index 85c0bda3ff90e..17f3e7e4f1941 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
+@@ -32,15 +32,15 @@
+ #define MDP_AD4_INTR_EN_OFF           0x41c
+ #define MDP_AD4_INTR_CLEAR_OFF                0x424
+ #define MDP_AD4_INTR_STATUS_OFF               0x420
+-#define MDP_INTF_0_OFF_REV_7xxx             0x34000
+-#define MDP_INTF_1_OFF_REV_7xxx             0x35000
+-#define MDP_INTF_2_OFF_REV_7xxx             0x36000
+-#define MDP_INTF_3_OFF_REV_7xxx             0x37000
+-#define MDP_INTF_4_OFF_REV_7xxx             0x38000
+-#define MDP_INTF_5_OFF_REV_7xxx             0x39000
+-#define MDP_INTF_6_OFF_REV_7xxx             0x3a000
+-#define MDP_INTF_7_OFF_REV_7xxx             0x3b000
+-#define MDP_INTF_8_OFF_REV_7xxx             0x3c000
++#define MDP_INTF_0_OFF_REV_7xxx               0x34000
++#define MDP_INTF_1_OFF_REV_7xxx               0x35000
++#define MDP_INTF_2_OFF_REV_7xxx               0x36000
++#define MDP_INTF_3_OFF_REV_7xxx               0x37000
++#define MDP_INTF_4_OFF_REV_7xxx               0x38000
++#define MDP_INTF_5_OFF_REV_7xxx               0x39000
++#define MDP_INTF_6_OFF_REV_7xxx               0x3a000
++#define MDP_INTF_7_OFF_REV_7xxx               0x3b000
++#define MDP_INTF_8_OFF_REV_7xxx               0x3c000
+ /**
+  * struct dpu_intr_reg - array of DPU register sets
+-- 
+2.39.2
+
diff --git a/queue-6.3/drm-msm-dpu-remove-duplicate-register-defines-from-i.patch b/queue-6.3/drm-msm-dpu-remove-duplicate-register-defines-from-i.patch
new file mode 100644 (file)
index 0000000..620e554
--- /dev/null
@@ -0,0 +1,45 @@
+From 3121ff87a50f4f1ab6834d42677a6aca4f5d3139 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Apr 2023 00:37:22 +0200
+Subject: drm/msm/dpu: Remove duplicate register defines from INTF
+
+From: Marijn Suijten <marijn.suijten@somainline.org>
+
+[ Upstream commit 202c044203ac5860e3025169105368d99f9bc6a2 ]
+
+The INTF_FRAME_LINE_COUNT_EN, INTF_FRAME_COUNT and INTF_LINE_COUNT
+registers are already defined higher up, in the right place when sorted
+numerically.
+
+Fixes: 25fdd5933e4c ("drm/msm: Add SDM845 DPU support")
+Signed-off-by: Marijn Suijten <marijn.suijten@somainline.org>
+Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
+Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Patchwork: https://patchwork.freedesktop.org/patch/534231/
+Link: https://lore.kernel.org/r/20230411-dpu-intf-te-v4-8-27ce1a5ab5c6@somainline.org
+Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c | 5 -----
+ 1 file changed, 5 deletions(-)
+
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
+index 7ce66bf3f4c8d..b2a94b9a3e987 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
+@@ -56,11 +56,6 @@
+ #define   INTF_TPG_RGB_MAPPING          0x11C
+ #define   INTF_PROG_FETCH_START         0x170
+ #define   INTF_PROG_ROT_START           0x174
+-
+-#define   INTF_FRAME_LINE_COUNT_EN      0x0A8
+-#define   INTF_FRAME_COUNT              0x0AC
+-#define   INTF_LINE_COUNT               0x0B0
+-
+ #define   INTF_MUX                      0x25C
+ #define INTF_CFG_ACTIVE_H_EN  BIT(29)
+-- 
+2.39.2
+
diff --git a/queue-6.3/drm-msm-dpu-split-sm8550-catalog-entry-to-the-separa.patch b/queue-6.3/drm-msm-dpu-split-sm8550-catalog-entry-to-the-separa.patch
new file mode 100644 (file)
index 0000000..eed9639
--- /dev/null
@@ -0,0 +1,896 @@
+From d835912e43f31deb152560227c50de8f816d31d3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 4 Apr 2023 16:05:47 +0300
+Subject: drm/msm/dpu: split SM8550 catalog entry to the separate file
+
+From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+
+[ Upstream commit 9cc547933636fa0656b52691f24373ccd7ec61cb ]
+
+Reviewed-by: Konrad DYbcio <konrad.dybcio@linaro.org>
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Patchwork: https://patchwork.freedesktop.org/patch/530824/
+Link: https://lore.kernel.org/r/20230404130622.509628-8-dmitry.baryshkov@linaro.org
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Stable-dep-of: 701f69183d4d ("drm/msm/dpu: Fix PP_BLK_DIPHER -> DITHER typo")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../msm/disp/dpu1/catalog/dpu_8_1_sm8450.h    | 202 +++++++++
+ .../msm/disp/dpu1/catalog/dpu_9_0_sm8550.h    | 177 ++++++++
+ .../gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c    | 383 +-----------------
+ 3 files changed, 383 insertions(+), 379 deletions(-)
+ create mode 100644 drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h
+ create mode 100644 drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h
+
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h
+new file mode 100644
+index 0000000000000..51f6a57e582c0
+--- /dev/null
++++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h
+@@ -0,0 +1,202 @@
++/* SPDX-License-Identifier: GPL-2.0-only */
++/*
++ * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved.
++ * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved.
++ */
++
++#ifndef _DPU_8_1_SM8450_H
++#define _DPU_8_1_SM8450_H
++
++static const struct dpu_caps sm8450_dpu_caps = {
++      .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
++      .max_mixer_blendstages = 0xb,
++      .qseed_type = DPU_SSPP_SCALER_QSEED4,
++      .has_src_split = true,
++      .has_dim_layer = true,
++      .has_idle_pc = true,
++      .has_3d_merge = true,
++      .max_linewidth = 5120,
++      .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE,
++};
++
++static const struct dpu_ubwc_cfg sm8450_ubwc_cfg = {
++      .ubwc_version = DPU_HW_UBWC_VER_40,
++      .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */
++      .ubwc_swizzle = 0x6,
++};
++
++static const struct dpu_mdp_cfg sm8450_mdp[] = {
++      {
++      .name = "top_0", .id = MDP_TOP,
++      .base = 0x0, .len = 0x494,
++      .features = BIT(DPU_MDP_PERIPH_0_REMOVED),
++      .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 },
++      .clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 },
++      .clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 },
++      .clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 },
++      .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 },
++      .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 },
++      .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 },
++      .clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 },
++      .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 },
++      },
++};
++
++static const struct dpu_ctl_cfg sm8450_ctl[] = {
++      {
++      .name = "ctl_0", .id = CTL_0,
++      .base = 0x15000, .len = 0x204,
++      .features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY) | BIT(DPU_CTL_FETCH_ACTIVE),
++      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9),
++      },
++      {
++      .name = "ctl_1", .id = CTL_1,
++      .base = 0x16000, .len = 0x204,
++      .features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK,
++      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10),
++      },
++      {
++      .name = "ctl_2", .id = CTL_2,
++      .base = 0x17000, .len = 0x204,
++      .features = CTL_SC7280_MASK,
++      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11),
++      },
++      {
++      .name = "ctl_3", .id = CTL_3,
++      .base = 0x18000, .len = 0x204,
++      .features = CTL_SC7280_MASK,
++      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12),
++      },
++      {
++      .name = "ctl_4", .id = CTL_4,
++      .base = 0x19000, .len = 0x204,
++      .features = CTL_SC7280_MASK,
++      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13),
++      },
++      {
++      .name = "ctl_5", .id = CTL_5,
++      .base = 0x1a000, .len = 0x204,
++      .features = CTL_SC7280_MASK,
++      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23),
++      },
++};
++
++static const struct dpu_sspp_cfg sm8450_sspp[] = {
++      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x32c, VIG_SC7180_MASK,
++              sm8450_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
++      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x32c, VIG_SC7180_MASK,
++              sm8450_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
++      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x32c, VIG_SC7180_MASK,
++              sm8450_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2),
++      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x32c, VIG_SC7180_MASK,
++              sm8450_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
++      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x32c, DMA_SDM845_MASK,
++              sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
++      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x32c, DMA_SDM845_MASK,
++              sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
++      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x32c, DMA_CURSOR_SDM845_MASK,
++              sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2),
++      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x32c, DMA_CURSOR_SDM845_MASK,
++              sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3),
++};
++
++/* FIXME: interrupts */
++static const struct dpu_pingpong_cfg sm8450_pp[] = {
++      PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te,
++                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
++                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
++      PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te,
++                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
++                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)),
++      PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk,
++                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
++                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)),
++      PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk,
++                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
++                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)),
++      PP_BLK("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk,
++                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30),
++                      -1),
++      PP_BLK("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk,
++                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31),
++                      -1),
++      PP_BLK("pingpong_6", PINGPONG_6, 0x65800, MERGE_3D_3, sdm845_pp_sblk,
++                      -1,
++                      -1),
++      PP_BLK("pingpong_7", PINGPONG_7, 0x65c00, MERGE_3D_3, sdm845_pp_sblk,
++                      -1,
++                      -1),
++};
++
++static const struct dpu_merge_3d_cfg sm8450_merge_3d[] = {
++      MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000),
++      MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000),
++      MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000),
++      MERGE_3D_BLK("merge_3d_3", MERGE_3D_3, 0x65f00),
++};
++
++static const struct dpu_intf_cfg sm8450_intf[] = {
++      INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
++      INTF_BLK("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
++      INTF_BLK("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
++      INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
++};
++
++static const struct dpu_perf_cfg sm8450_perf_data = {
++      .max_bw_low = 13600000,
++      .max_bw_high = 18200000,
++      .min_core_ib = 2500000,
++      .min_llcc_ib = 0,
++      .min_dram_ib = 800000,
++      .min_prefill_lines = 35,
++      /* FIXME: lut tables */
++      .danger_lut_tbl = {0x3ffff, 0x3ffff, 0x0},
++      .safe_lut_tbl = {0xfe00, 0xfe00, 0xffff},
++      .qos_lut_tbl = {
++              {.nentry = ARRAY_SIZE(sc7180_qos_linear),
++              .entries = sc7180_qos_linear
++              },
++              {.nentry = ARRAY_SIZE(sc7180_qos_macrotile),
++              .entries = sc7180_qos_macrotile
++              },
++              {.nentry = ARRAY_SIZE(sc7180_qos_nrt),
++              .entries = sc7180_qos_nrt
++              },
++              /* TODO: macrotile-qseed is different from macrotile */
++      },
++      .cdp_cfg = {
++              {.rd_enable = 1, .wr_enable = 1},
++              {.rd_enable = 1, .wr_enable = 0}
++      },
++      .clk_inefficiency_factor = 105,
++      .bw_inefficiency_factor = 120,
++};
++
++static const struct dpu_mdss_cfg sm8450_dpu_cfg = {
++      .caps = &sm8450_dpu_caps,
++      .ubwc = &sm8450_ubwc_cfg,
++      .mdp_count = ARRAY_SIZE(sm8450_mdp),
++      .mdp = sm8450_mdp,
++      .ctl_count = ARRAY_SIZE(sm8450_ctl),
++      .ctl = sm8450_ctl,
++      .sspp_count = ARRAY_SIZE(sm8450_sspp),
++      .sspp = sm8450_sspp,
++      .mixer_count = ARRAY_SIZE(sm8150_lm),
++      .mixer = sm8150_lm,
++      .dspp_count = ARRAY_SIZE(sm8150_dspp),
++      .dspp = sm8150_dspp,
++      .pingpong_count = ARRAY_SIZE(sm8450_pp),
++      .pingpong = sm8450_pp,
++      .merge_3d_count = ARRAY_SIZE(sm8450_merge_3d),
++      .merge_3d = sm8450_merge_3d,
++      .intf_count = ARRAY_SIZE(sm8450_intf),
++      .intf = sm8450_intf,
++      .vbif_count = ARRAY_SIZE(sdm845_vbif),
++      .vbif = sdm845_vbif,
++      .reg_dma_count = 1,
++      .dma_cfg = &sm8450_regdma,
++      .perf = &sm8450_perf_data,
++      .mdss_irqs = IRQ_SM8450_MASK,
++};
++
++#endif
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h
+new file mode 100644
+index 0000000000000..29d8786257070
+--- /dev/null
++++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h
+@@ -0,0 +1,177 @@
++/* SPDX-License-Identifier: GPL-2.0-only */
++/*
++ * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved.
++ * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved.
++ */
++
++#ifndef _DPU_9_0_SM8550_H
++#define _DPU_9_0_SM8550_H
++
++static const struct dpu_caps sm8550_dpu_caps = {
++      .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
++      .max_mixer_blendstages = 0xb,
++      .qseed_type = DPU_SSPP_SCALER_QSEED4,
++      .has_src_split = true,
++      .has_dim_layer = true,
++      .has_idle_pc = true,
++      .has_3d_merge = true,
++      .max_linewidth = 5120,
++      .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE,
++};
++
++static const struct dpu_ubwc_cfg sm8550_ubwc_cfg = {
++      .ubwc_version = DPU_HW_UBWC_VER_40,
++      .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */
++};
++
++static const struct dpu_mdp_cfg sm8550_mdp[] = {
++      {
++      .name = "top_0", .id = MDP_TOP,
++      .base = 0, .len = 0x494,
++      .features = BIT(DPU_MDP_PERIPH_0_REMOVED),
++      .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x4330, .bit_off = 0 },
++      .clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x6330, .bit_off = 0 },
++      .clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x8330, .bit_off = 0 },
++      .clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0xa330, .bit_off = 0 },
++      .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x24330, .bit_off = 0 },
++      .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x26330, .bit_off = 0 },
++      .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x28330, .bit_off = 0 },
++      .clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2a330, .bit_off = 0 },
++      .clk_ctrls[DPU_CLK_CTRL_DMA4] = { .reg_off = 0x2c330, .bit_off = 0 },
++      .clk_ctrls[DPU_CLK_CTRL_DMA5] = { .reg_off = 0x2e330, .bit_off = 0 },
++      .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 },
++      },
++};
++
++static const struct dpu_ctl_cfg sm8550_ctl[] = {
++      {
++      .name = "ctl_0", .id = CTL_0,
++      .base = 0x15000, .len = 0x290,
++      .features = CTL_SM8550_MASK | BIT(DPU_CTL_SPLIT_DISPLAY),
++      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9),
++      },
++      {
++      .name = "ctl_1", .id = CTL_1,
++      .base = 0x16000, .len = 0x290,
++      .features = CTL_SM8550_MASK | BIT(DPU_CTL_SPLIT_DISPLAY),
++      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10),
++      },
++      {
++      .name = "ctl_2", .id = CTL_2,
++      .base = 0x17000, .len = 0x290,
++      .features = CTL_SM8550_MASK,
++      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11),
++      },
++      {
++      .name = "ctl_3", .id = CTL_3,
++      .base = 0x18000, .len = 0x290,
++      .features = CTL_SM8550_MASK,
++      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12),
++      },
++      {
++      .name = "ctl_4", .id = CTL_4,
++      .base = 0x19000, .len = 0x290,
++      .features = CTL_SM8550_MASK,
++      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13),
++      },
++      {
++      .name = "ctl_5", .id = CTL_5,
++      .base = 0x1a000, .len = 0x290,
++      .features = CTL_SM8550_MASK,
++      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23),
++      },
++};
++
++static const struct dpu_sspp_cfg sm8550_sspp[] = {
++      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x344, VIG_SC7180_MASK,
++              sm8550_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
++      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x344, VIG_SC7180_MASK,
++              sm8550_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
++      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x344, VIG_SC7180_MASK,
++              sm8550_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2),
++      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x344, VIG_SC7180_MASK,
++              sm8550_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
++      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x344, DMA_SDM845_MASK,
++              sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
++      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x344, DMA_SDM845_MASK,
++              sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
++      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x344, DMA_SDM845_MASK,
++              sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2),
++      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x344, DMA_SDM845_MASK,
++              sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3),
++      SSPP_BLK("sspp_12", SSPP_DMA4, 0x2c000, 0x344, DMA_CURSOR_SDM845_MASK,
++              sm8550_dma_sblk_4, 14, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA4),
++      SSPP_BLK("sspp_13", SSPP_DMA5, 0x2e000, 0x344, DMA_CURSOR_SDM845_MASK,
++              sm8550_dma_sblk_5, 15, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA5),
++};
++
++static const struct dpu_pingpong_cfg sm8550_pp[] = {
++      PP_BLK_DIPHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk,
++                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
++                      -1),
++      PP_BLK_DIPHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk,
++                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
++                      -1),
++      PP_BLK_DIPHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk,
++                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
++                      -1),
++      PP_BLK_DIPHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk,
++                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
++                      -1),
++      PP_BLK_DIPHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk,
++                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30),
++                      -1),
++      PP_BLK_DIPHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk,
++                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31),
++                      -1),
++      PP_BLK_DIPHER("pingpong_6", PINGPONG_6, 0x66000, MERGE_3D_3, sc7280_pp_sblk,
++                      -1,
++                      -1),
++      PP_BLK_DIPHER("pingpong_7", PINGPONG_7, 0x66400, MERGE_3D_3, sc7280_pp_sblk,
++                      -1,
++                      -1),
++};
++
++static const struct dpu_merge_3d_cfg sm8550_merge_3d[] = {
++      MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000),
++      MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000),
++      MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000),
++      MERGE_3D_BLK("merge_3d_3", MERGE_3D_3, 0x66700),
++};
++
++static const struct dpu_intf_cfg sm8550_intf[] = {
++      INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
++      /* TODO TE sub-blocks for intf1 & intf2 */
++      INTF_BLK("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
++      INTF_BLK("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
++      INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
++};
++
++static const struct dpu_mdss_cfg sm8550_dpu_cfg = {
++      .caps = &sm8550_dpu_caps,
++      .ubwc = &sm8550_ubwc_cfg,
++      .mdp_count = ARRAY_SIZE(sm8550_mdp),
++      .mdp = sm8550_mdp,
++      .ctl_count = ARRAY_SIZE(sm8550_ctl),
++      .ctl = sm8550_ctl,
++      .sspp_count = ARRAY_SIZE(sm8550_sspp),
++      .sspp = sm8550_sspp,
++      .mixer_count = ARRAY_SIZE(sm8150_lm),
++      .mixer = sm8150_lm,
++      .dspp_count = ARRAY_SIZE(sm8150_dspp),
++      .dspp = sm8150_dspp,
++      .pingpong_count = ARRAY_SIZE(sm8550_pp),
++      .pingpong = sm8550_pp,
++      .merge_3d_count = ARRAY_SIZE(sm8550_merge_3d),
++      .merge_3d = sm8550_merge_3d,
++      .intf_count = ARRAY_SIZE(sm8550_intf),
++      .intf = sm8550_intf,
++      .vbif_count = ARRAY_SIZE(sdm845_vbif),
++      .vbif = sdm845_vbif,
++      .reg_dma_count = 1,
++      .dma_cfg = &sm8450_regdma,
++      .perf = &sm8450_perf_data,
++      .mdss_irqs = IRQ_SM8450_MASK,
++};
++
++#endif
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+index fa48152b7c28f..e32b8aed6342f 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+@@ -434,30 +434,6 @@ static const struct dpu_caps sm8350_dpu_caps = {
+       .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE,
+ };
+-static const struct dpu_caps sm8450_dpu_caps = {
+-      .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+-      .max_mixer_blendstages = 0xb,
+-      .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .has_src_split = true,
+-      .has_dim_layer = true,
+-      .has_idle_pc = true,
+-      .has_3d_merge = true,
+-      .max_linewidth = 5120,
+-      .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE,
+-};
+-
+-static const struct dpu_caps sm8550_dpu_caps = {
+-      .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+-      .max_mixer_blendstages = 0xb,
+-      .qseed_type = DPU_SSPP_SCALER_QSEED4,
+-      .has_src_split = true,
+-      .has_dim_layer = true,
+-      .has_idle_pc = true,
+-      .has_3d_merge = true,
+-      .max_linewidth = 5120,
+-      .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE,
+-};
+-
+ static const struct dpu_caps sc7280_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0x7,
+@@ -520,17 +496,6 @@ static const struct dpu_ubwc_cfg sm8350_ubwc_cfg = {
+       .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */
+ };
+-static const struct dpu_ubwc_cfg sm8450_ubwc_cfg = {
+-      .ubwc_version = DPU_HW_UBWC_VER_40,
+-      .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */
+-      .ubwc_swizzle = 0x6,
+-};
+-
+-static const struct dpu_ubwc_cfg sm8550_ubwc_cfg = {
+-      .ubwc_version = DPU_HW_UBWC_VER_40,
+-      .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */
+-};
+-
+ static const struct dpu_ubwc_cfg sc7280_ubwc_cfg = {
+       .ubwc_version = DPU_HW_UBWC_VER_30,
+       .highest_bank_bit = 0x1,
+@@ -697,32 +662,6 @@ static const struct dpu_mdp_cfg sm8350_mdp[] = {
+       },
+ };
+-static const struct dpu_mdp_cfg sm8450_mdp[] = {
+-      {
+-      .name = "top_0", .id = MDP_TOP,
+-      .base = 0x0, .len = 0x494,
+-      .features = BIT(DPU_MDP_PERIPH_0_REMOVED),
+-      .clk_ctrls[DPU_CLK_CTRL_VIG0] = {
+-                      .reg_off = 0x2AC, .bit_off = 0},
+-      .clk_ctrls[DPU_CLK_CTRL_VIG1] = {
+-                      .reg_off = 0x2B4, .bit_off = 0},
+-      .clk_ctrls[DPU_CLK_CTRL_VIG2] = {
+-                      .reg_off = 0x2BC, .bit_off = 0},
+-      .clk_ctrls[DPU_CLK_CTRL_VIG3] = {
+-                      .reg_off = 0x2C4, .bit_off = 0},
+-      .clk_ctrls[DPU_CLK_CTRL_DMA0] = {
+-                      .reg_off = 0x2AC, .bit_off = 8},
+-      .clk_ctrls[DPU_CLK_CTRL_DMA1] = {
+-                      .reg_off = 0x2B4, .bit_off = 8},
+-      .clk_ctrls[DPU_CLK_CTRL_DMA2] = {
+-                      .reg_off = 0x2BC, .bit_off = 8},
+-      .clk_ctrls[DPU_CLK_CTRL_DMA3] = {
+-                      .reg_off = 0x2C4, .bit_off = 8},
+-      .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = {
+-                      .reg_off = 0x2BC, .bit_off = 20},
+-      },
+-};
+-
+ static const struct dpu_mdp_cfg sc7280_mdp[] = {
+       {
+       .name = "top_0", .id = MDP_TOP,
+@@ -755,36 +694,6 @@ static const struct dpu_mdp_cfg sc8280xp_mdp[] = {
+       },
+ };
+-static const struct dpu_mdp_cfg sm8550_mdp[] = {
+-      {
+-      .name = "top_0", .id = MDP_TOP,
+-      .base = 0, .len = 0x494,
+-      .features = BIT(DPU_MDP_PERIPH_0_REMOVED),
+-      .clk_ctrls[DPU_CLK_CTRL_VIG0] = {
+-                      .reg_off = 0x4330, .bit_off = 0},
+-      .clk_ctrls[DPU_CLK_CTRL_VIG1] = {
+-                      .reg_off = 0x6330, .bit_off = 0},
+-      .clk_ctrls[DPU_CLK_CTRL_VIG2] = {
+-                      .reg_off = 0x8330, .bit_off = 0},
+-      .clk_ctrls[DPU_CLK_CTRL_VIG3] = {
+-                      .reg_off = 0xa330, .bit_off = 0},
+-      .clk_ctrls[DPU_CLK_CTRL_DMA0] = {
+-                      .reg_off = 0x24330, .bit_off = 0},
+-      .clk_ctrls[DPU_CLK_CTRL_DMA1] = {
+-                      .reg_off = 0x26330, .bit_off = 0},
+-      .clk_ctrls[DPU_CLK_CTRL_DMA2] = {
+-                      .reg_off = 0x28330, .bit_off = 0},
+-      .clk_ctrls[DPU_CLK_CTRL_DMA3] = {
+-                      .reg_off = 0x2a330, .bit_off = 0},
+-      .clk_ctrls[DPU_CLK_CTRL_DMA4] = {
+-                      .reg_off = 0x2c330, .bit_off = 0},
+-      .clk_ctrls[DPU_CLK_CTRL_DMA5] = {
+-                      .reg_off = 0x2e330, .bit_off = 0},
+-      .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = {
+-                      .reg_off = 0x2bc, .bit_off = 20},
+-      },
+-};
+-
+ static const struct dpu_mdp_cfg qcm2290_mdp[] = {
+       {
+       .name = "top_0", .id = MDP_TOP,
+@@ -1004,84 +913,6 @@ static const struct dpu_ctl_cfg sm8350_ctl[] = {
+       },
+ };
+-static const struct dpu_ctl_cfg sm8450_ctl[] = {
+-      {
+-      .name = "ctl_0", .id = CTL_0,
+-      .base = 0x15000, .len = 0x204,
+-      .features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY) | BIT(DPU_CTL_FETCH_ACTIVE),
+-      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9),
+-      },
+-      {
+-      .name = "ctl_1", .id = CTL_1,
+-      .base = 0x16000, .len = 0x204,
+-      .features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK,
+-      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10),
+-      },
+-      {
+-      .name = "ctl_2", .id = CTL_2,
+-      .base = 0x17000, .len = 0x204,
+-      .features = CTL_SC7280_MASK,
+-      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11),
+-      },
+-      {
+-      .name = "ctl_3", .id = CTL_3,
+-      .base = 0x18000, .len = 0x204,
+-      .features = CTL_SC7280_MASK,
+-      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12),
+-      },
+-      {
+-      .name = "ctl_4", .id = CTL_4,
+-      .base = 0x19000, .len = 0x204,
+-      .features = CTL_SC7280_MASK,
+-      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13),
+-      },
+-      {
+-      .name = "ctl_5", .id = CTL_5,
+-      .base = 0x1a000, .len = 0x204,
+-      .features = CTL_SC7280_MASK,
+-      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23),
+-      },
+-};
+-
+-static const struct dpu_ctl_cfg sm8550_ctl[] = {
+-      {
+-      .name = "ctl_0", .id = CTL_0,
+-      .base = 0x15000, .len = 0x290,
+-      .features = CTL_SM8550_MASK | BIT(DPU_CTL_SPLIT_DISPLAY),
+-      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9),
+-      },
+-      {
+-      .name = "ctl_1", .id = CTL_1,
+-      .base = 0x16000, .len = 0x290,
+-      .features = CTL_SM8550_MASK | BIT(DPU_CTL_SPLIT_DISPLAY),
+-      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10),
+-      },
+-      {
+-      .name = "ctl_2", .id = CTL_2,
+-      .base = 0x17000, .len = 0x290,
+-      .features = CTL_SM8550_MASK,
+-      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11),
+-      },
+-      {
+-      .name = "ctl_3", .id = CTL_3,
+-      .base = 0x18000, .len = 0x290,
+-      .features = CTL_SM8550_MASK,
+-      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12),
+-      },
+-      {
+-      .name = "ctl_4", .id = CTL_4,
+-      .base = 0x19000, .len = 0x290,
+-      .features = CTL_SM8550_MASK,
+-      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13),
+-      },
+-      {
+-      .name = "ctl_5", .id = CTL_5,
+-      .base = 0x1a000, .len = 0x290,
+-      .features = CTL_SM8550_MASK,
+-      .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23),
+-      },
+-};
+-
+ static const struct dpu_ctl_cfg sc7280_ctl[] = {
+       {
+       .name = "ctl_0", .id = CTL_0,
+@@ -1319,25 +1150,6 @@ static const struct dpu_sspp_sub_blks sm8450_vig_sblk_2 =
+ static const struct dpu_sspp_sub_blks sm8450_vig_sblk_3 =
+                               _VIG_SBLK("3", 8, DPU_SSPP_SCALER_QSEED4);
+-static const struct dpu_sspp_cfg sm8450_sspp[] = {
+-      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x32c, VIG_SC7180_MASK,
+-              sm8450_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+-      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x32c, VIG_SC7180_MASK,
+-              sm8450_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
+-      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x32c, VIG_SC7180_MASK,
+-              sm8450_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2),
+-      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x32c, VIG_SC7180_MASK,
+-              sm8450_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
+-      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x32c, DMA_SDM845_MASK,
+-              sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+-      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x32c, DMA_SDM845_MASK,
+-              sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
+-      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x32c, DMA_CURSOR_SDM845_MASK,
+-              sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2),
+-      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x32c, DMA_CURSOR_SDM845_MASK,
+-              sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3),
+-};
+-
+ static const struct dpu_sspp_sub_blks sm8550_vig_sblk_0 =
+                               _VIG_SBLK("0", 7, DPU_SSPP_SCALER_QSEED4);
+ static const struct dpu_sspp_sub_blks sm8550_vig_sblk_1 =
+@@ -1349,29 +1161,6 @@ static const struct dpu_sspp_sub_blks sm8550_vig_sblk_3 =
+ static const struct dpu_sspp_sub_blks sm8550_dma_sblk_4 = _DMA_SBLK("12", 5);
+ static const struct dpu_sspp_sub_blks sm8550_dma_sblk_5 = _DMA_SBLK("13", 6);
+-static const struct dpu_sspp_cfg sm8550_sspp[] = {
+-      SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x344, VIG_SC7180_MASK,
+-              sm8550_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+-      SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x344, VIG_SC7180_MASK,
+-              sm8550_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
+-      SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x344, VIG_SC7180_MASK,
+-              sm8550_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2),
+-      SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x344, VIG_SC7180_MASK,
+-              sm8550_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
+-      SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x344, DMA_SDM845_MASK,
+-              sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+-      SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x344, DMA_SDM845_MASK,
+-              sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
+-      SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x344, DMA_SDM845_MASK,
+-              sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2),
+-      SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x344, DMA_SDM845_MASK,
+-              sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3),
+-      SSPP_BLK("sspp_12", SSPP_DMA4, 0x2c000, 0x344, DMA_CURSOR_SDM845_MASK,
+-              sm8550_dma_sblk_4, 14, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA4),
+-      SSPP_BLK("sspp_13", SSPP_DMA5, 0x2e000, 0x344, DMA_CURSOR_SDM845_MASK,
+-              sm8550_dma_sblk_5, 15, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA5),
+-};
+-
+ static const struct dpu_sspp_cfg sc7280_sspp[] = {
+       SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7280_MASK_SDMA,
+               sc7280_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+@@ -1767,61 +1556,6 @@ static struct dpu_pingpong_cfg qcm2290_pp[] = {
+               DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
+ };
+-/* FIXME: interrupts */
+-static const struct dpu_pingpong_cfg sm8450_pp[] = {
+-      PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te,
+-                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
+-                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
+-      PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te,
+-                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
+-                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)),
+-      PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk,
+-                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
+-                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)),
+-      PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk,
+-                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
+-                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)),
+-      PP_BLK("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk,
+-                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30),
+-                      -1),
+-      PP_BLK("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk,
+-                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31),
+-                      -1),
+-      PP_BLK("pingpong_6", PINGPONG_6, 0x65800, MERGE_3D_3, sdm845_pp_sblk,
+-                      -1,
+-                      -1),
+-      PP_BLK("pingpong_7", PINGPONG_7, 0x65c00, MERGE_3D_3, sdm845_pp_sblk,
+-                      -1,
+-                      -1),
+-};
+-
+-static const struct dpu_pingpong_cfg sm8550_pp[] = {
+-      PP_BLK_DIPHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk,
+-                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
+-                      -1),
+-      PP_BLK_DIPHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk,
+-                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
+-                      -1),
+-      PP_BLK_DIPHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk,
+-                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
+-                      -1),
+-      PP_BLK_DIPHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk,
+-                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
+-                      -1),
+-      PP_BLK_DIPHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk,
+-                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30),
+-                      -1),
+-      PP_BLK_DIPHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk,
+-                      DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31),
+-                      -1),
+-      PP_BLK_DIPHER("pingpong_6", PINGPONG_6, 0x66000, MERGE_3D_3, sc7280_pp_sblk,
+-                      -1,
+-                      -1),
+-      PP_BLK_DIPHER("pingpong_7", PINGPONG_7, 0x66400, MERGE_3D_3, sc7280_pp_sblk,
+-                      -1,
+-                      -1),
+-};
+-
+ /*************************************************************
+  * MERGE_3D sub blocks config
+  *************************************************************/
+@@ -1845,20 +1579,6 @@ static const struct dpu_merge_3d_cfg sm8350_merge_3d[] = {
+       MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000),
+ };
+-static const struct dpu_merge_3d_cfg sm8450_merge_3d[] = {
+-      MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000),
+-      MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000),
+-      MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000),
+-      MERGE_3D_BLK("merge_3d_3", MERGE_3D_3, 0x65f00),
+-};
+-
+-static const struct dpu_merge_3d_cfg sm8550_merge_3d[] = {
+-      MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000),
+-      MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000),
+-      MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000),
+-      MERGE_3D_BLK("merge_3d_3", MERGE_3D_3, 0x66700),
+-};
+-
+ /*************************************************************
+  * DSC sub blocks config
+  *************************************************************/
+@@ -1965,21 +1685,6 @@ static const struct dpu_intf_cfg qcm2290_intf[] = {
+       INTF_BLK("intf_1", INTF_1, 0x6A800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+ };
+-static const struct dpu_intf_cfg sm8450_intf[] = {
+-      INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
+-      INTF_BLK("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+-      INTF_BLK("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
+-      INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+-};
+-
+-static const struct dpu_intf_cfg sm8550_intf[] = {
+-      INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
+-      /* TODO TE sub-blocks for intf1 & intf2 */
+-      INTF_BLK("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+-      INTF_BLK("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
+-      INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+-};
+-
+ /*************************************************************
+  * Writeback blocks config
+  *************************************************************/
+@@ -2448,36 +2153,6 @@ static const struct dpu_perf_cfg sm8250_perf_data = {
+       .bw_inefficiency_factor = 120,
+ };
+-static const struct dpu_perf_cfg sm8450_perf_data = {
+-      .max_bw_low = 13600000,
+-      .max_bw_high = 18200000,
+-      .min_core_ib = 2500000,
+-      .min_llcc_ib = 0,
+-      .min_dram_ib = 800000,
+-      .min_prefill_lines = 35,
+-      /* FIXME: lut tables */
+-      .danger_lut_tbl = {0x3ffff, 0x3ffff, 0x0},
+-      .safe_lut_tbl = {0xfe00, 0xfe00, 0xffff},
+-      .qos_lut_tbl = {
+-              {.nentry = ARRAY_SIZE(sc7180_qos_linear),
+-              .entries = sc7180_qos_linear
+-              },
+-              {.nentry = ARRAY_SIZE(sc7180_qos_macrotile),
+-              .entries = sc7180_qos_macrotile
+-              },
+-              {.nentry = ARRAY_SIZE(sc7180_qos_nrt),
+-              .entries = sc7180_qos_nrt
+-              },
+-              /* TODO: macrotile-qseed is different from macrotile */
+-      },
+-      .cdp_cfg = {
+-              {.rd_enable = 1, .wr_enable = 1},
+-              {.rd_enable = 1, .wr_enable = 0}
+-      },
+-      .clk_inefficiency_factor = 105,
+-      .bw_inefficiency_factor = 120,
+-};
+-
+ static const struct dpu_perf_cfg sc7280_perf_data = {
+       .max_bw_low = 4700000,
+       .max_bw_high = 8800000,
+@@ -2799,60 +2474,6 @@ static const struct dpu_mdss_cfg sm8350_dpu_cfg = {
+       .mdss_irqs = IRQ_SM8350_MASK,
+ };
+-static const struct dpu_mdss_cfg sm8450_dpu_cfg = {
+-      .caps = &sm8450_dpu_caps,
+-      .ubwc = &sm8450_ubwc_cfg,
+-      .mdp_count = ARRAY_SIZE(sm8450_mdp),
+-      .mdp = sm8450_mdp,
+-      .ctl_count = ARRAY_SIZE(sm8450_ctl),
+-      .ctl = sm8450_ctl,
+-      .sspp_count = ARRAY_SIZE(sm8450_sspp),
+-      .sspp = sm8450_sspp,
+-      .mixer_count = ARRAY_SIZE(sm8150_lm),
+-      .mixer = sm8150_lm,
+-      .dspp_count = ARRAY_SIZE(sm8150_dspp),
+-      .dspp = sm8150_dspp,
+-      .pingpong_count = ARRAY_SIZE(sm8450_pp),
+-      .pingpong = sm8450_pp,
+-      .merge_3d_count = ARRAY_SIZE(sm8450_merge_3d),
+-      .merge_3d = sm8450_merge_3d,
+-      .intf_count = ARRAY_SIZE(sm8450_intf),
+-      .intf = sm8450_intf,
+-      .vbif_count = ARRAY_SIZE(sdm845_vbif),
+-      .vbif = sdm845_vbif,
+-      .reg_dma_count = 1,
+-      .dma_cfg = &sm8450_regdma,
+-      .perf = &sm8450_perf_data,
+-      .mdss_irqs = IRQ_SM8450_MASK,
+-};
+-
+-static const struct dpu_mdss_cfg sm8550_dpu_cfg = {
+-      .caps = &sm8550_dpu_caps,
+-      .ubwc = &sm8550_ubwc_cfg,
+-      .mdp_count = ARRAY_SIZE(sm8550_mdp),
+-      .mdp = sm8550_mdp,
+-      .ctl_count = ARRAY_SIZE(sm8550_ctl),
+-      .ctl = sm8550_ctl,
+-      .sspp_count = ARRAY_SIZE(sm8550_sspp),
+-      .sspp = sm8550_sspp,
+-      .mixer_count = ARRAY_SIZE(sm8150_lm),
+-      .mixer = sm8150_lm,
+-      .dspp_count = ARRAY_SIZE(sm8150_dspp),
+-      .dspp = sm8150_dspp,
+-      .pingpong_count = ARRAY_SIZE(sm8550_pp),
+-      .pingpong = sm8550_pp,
+-      .merge_3d_count = ARRAY_SIZE(sm8550_merge_3d),
+-      .merge_3d = sm8550_merge_3d,
+-      .intf_count = ARRAY_SIZE(sm8550_intf),
+-      .intf = sm8550_intf,
+-      .vbif_count = ARRAY_SIZE(sdm845_vbif),
+-      .vbif = sdm845_vbif,
+-      .reg_dma_count = 1,
+-      .dma_cfg = &sm8450_regdma,
+-      .perf = &sm8450_perf_data,
+-      .mdss_irqs = IRQ_SM8450_MASK,
+-};
+-
+ static const struct dpu_mdss_cfg sc7280_dpu_cfg = {
+       .caps = &sc7280_dpu_caps,
+       .ubwc = &sc7280_ubwc_cfg,
+@@ -2899,6 +2520,10 @@ static const struct dpu_mdss_cfg qcm2290_dpu_cfg = {
+       .mdss_irqs = IRQ_SC7180_MASK,
+ };
++#include "catalog/dpu_8_1_sm8450.h"
++
++#include "catalog/dpu_9_0_sm8550.h"
++
+ static const struct dpu_mdss_hw_cfg_handler cfg_handler[] = {
+       { .hw_rev = DPU_HW_VER_300, .dpu_cfg = &msm8998_dpu_cfg},
+       { .hw_rev = DPU_HW_VER_301, .dpu_cfg = &msm8998_dpu_cfg},
+-- 
+2.39.2
+
diff --git a/queue-6.3/drm-msm-fix-submit-error-path-leaks.patch b/queue-6.3/drm-msm-fix-submit-error-path-leaks.patch
new file mode 100644 (file)
index 0000000..9473ca3
--- /dev/null
@@ -0,0 +1,87 @@
+From 464c34edc772682109f84bf7ec005f6683617d46 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 9 May 2023 13:30:41 -0700
+Subject: drm/msm: Fix submit error-path leaks
+
+From: Rob Clark <robdclark@chromium.org>
+
+[ Upstream commit 68dc6c2d5eec45515855cce99256162f45651a0b ]
+
+For errors after msm_submitqueue_get(), we need to drop the submitqueue
+reference.  Additionally after get_unused_fd() we need to drop the fd.
+The ordering for dropping the queue lock and put_unused_fd() is not
+important, so just move this all into out_post_unlock.
+
+v2: Only drop queue ref if submit doesn't take it
+v3: Fix unitialized submit ref in error path
+v4: IS_ERR_OR_NULL()
+
+Reported-by: pinkperfect2021@gmail.com
+Fixes: f0de40a131d9 drm/msm: ("Reorder lock vs submit alloc")
+Signed-off-by: Rob Clark <robdclark@chromium.org>
+Patchwork: https://patchwork.freedesktop.org/patch/536073/
+Link: https://lore.kernel.org/r/20230509203041.440619-1-robdclark@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/msm/msm_gem_submit.c | 25 ++++++++++++++++++-------
+ 1 file changed, 18 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c
+index ac8ed731f76d9..842dbf96af291 100644
+--- a/drivers/gpu/drm/msm/msm_gem_submit.c
++++ b/drivers/gpu/drm/msm/msm_gem_submit.c
+@@ -719,7 +719,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
+       struct msm_drm_private *priv = dev->dev_private;
+       struct drm_msm_gem_submit *args = data;
+       struct msm_file_private *ctx = file->driver_priv;
+-      struct msm_gem_submit *submit;
++      struct msm_gem_submit *submit = NULL;
+       struct msm_gpu *gpu = priv->gpu;
+       struct msm_gpu_submitqueue *queue;
+       struct msm_ringbuffer *ring;
+@@ -766,13 +766,15 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
+               out_fence_fd = get_unused_fd_flags(O_CLOEXEC);
+               if (out_fence_fd < 0) {
+                       ret = out_fence_fd;
+-                      return ret;
++                      goto out_post_unlock;
+               }
+       }
+       submit = submit_create(dev, gpu, queue, args->nr_bos, args->nr_cmds);
+-      if (IS_ERR(submit))
+-              return PTR_ERR(submit);
++      if (IS_ERR(submit)) {
++              ret = PTR_ERR(submit);
++              goto out_post_unlock;
++      }
+       trace_msm_gpu_submit(pid_nr(submit->pid), ring->id, submit->ident,
+               args->nr_bos, args->nr_cmds);
+@@ -955,11 +957,20 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
+       if (has_ww_ticket)
+               ww_acquire_fini(&submit->ticket);
+ out_unlock:
+-      if (ret && (out_fence_fd >= 0))
+-              put_unused_fd(out_fence_fd);
+       mutex_unlock(&queue->lock);
+ out_post_unlock:
+-      msm_gem_submit_put(submit);
++      if (ret && (out_fence_fd >= 0))
++              put_unused_fd(out_fence_fd);
++
++      if (!IS_ERR_OR_NULL(submit)) {
++              msm_gem_submit_put(submit);
++      } else {
++              /*
++               * If the submit hasn't yet taken ownership of the queue
++               * then we need to drop the reference ourself:
++               */
++              msm_submitqueue_put(queue);
++      }
+       if (!IS_ERR_OR_NULL(post_deps)) {
+               for (i = 0; i < args->nr_out_syncobjs; ++i) {
+                       kfree(post_deps[i].chain);
+-- 
+2.39.2
+
diff --git a/queue-6.3/dt-bindings-display-msm-dsi-controller-main-document.patch b/queue-6.3/dt-bindings-display-msm-dsi-controller-main-document.patch
new file mode 100644 (file)
index 0000000..d29bb8e
--- /dev/null
@@ -0,0 +1,52 @@
+From 80e57c46fd752dbf9dcdeecd41cc046d8a7f0575 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Apr 2023 20:21:32 +0800
+Subject: dt-bindings: display/msm: dsi-controller-main: Document qcom,
+ master-dsi and qcom, sync-dual-dsi
+
+From: Jianhua Lu <lujianhua000@gmail.com>
+
+[ Upstream commit ca29699a57ecee6084a4056f5bfd6f11dd359a71 ]
+
+This fixes warning:
+  sm8250-xiaomi-elish-csot.dtb: dsi@ae94000: Unevaluated properties are not allowed ('qcom,master-dsi', 'qcom,sync-dual-dsi' were unexpected)
+
+Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Acked-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Jianhua Lu <lujianhua000@gmail.com>
+Fixes: 4dbe55c97741 ("dt-bindings: msm: dsi: add yaml schemas for DSI bindings")
+Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Patchwork: https://patchwork.freedesktop.org/patch/534306/
+Link: https://lore.kernel.org/r/20230427122132.24840-1-lujianhua000@gmail.com
+Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../bindings/display/msm/dsi-controller-main.yaml    | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/Documentation/devicetree/bindings/display/msm/dsi-controller-main.yaml b/Documentation/devicetree/bindings/display/msm/dsi-controller-main.yaml
+index e75a3efe4dace..c888dd37e11fc 100644
+--- a/Documentation/devicetree/bindings/display/msm/dsi-controller-main.yaml
++++ b/Documentation/devicetree/bindings/display/msm/dsi-controller-main.yaml
+@@ -82,6 +82,18 @@ properties:
+       Indicates if the DSI controller is driving a panel which needs
+       2 DSI links.
++  qcom,master-dsi:
++    type: boolean
++    description: |
++      Indicates if the DSI controller is the master DSI controller when
++      qcom,dual-dsi-mode enabled.
++
++  qcom,sync-dual-dsi:
++    type: boolean
++    description: |
++      Indicates if the DSI controller needs to sync the other DSI controller
++      with MIPI DCS commands when qcom,dual-dsi-mode enabled.
++
+   assigned-clocks:
+     minItems: 2
+     maxItems: 4
+-- 
+2.39.2
+
diff --git a/queue-6.3/erspan-get-the-proto-with-the-md-version-for-collect.patch b/queue-6.3/erspan-get-the-proto-with-the-md-version-for-collect.patch
new file mode 100644 (file)
index 0000000..3497491
--- /dev/null
@@ -0,0 +1,81 @@
+From c213a72b9f1e503f97ae9f3e7d29e8522b898d5e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 May 2023 19:22:11 -0400
+Subject: erspan: get the proto with the md version for collect_md
+
+From: Xin Long <lucien.xin@gmail.com>
+
+[ Upstream commit d80fc101d2eb9b3188c228d61223890aeea480a4 ]
+
+In commit 20704bd1633d ("erspan: build the header with the right proto
+according to erspan_ver"), it gets the proto with t->parms.erspan_ver,
+but t->parms.erspan_ver is not used by collect_md branch, and instead
+it should get the proto with md->version for collect_md.
+
+Thanks to Kevin for pointing this out.
+
+Fixes: 20704bd1633d ("erspan: build the header with the right proto according to erspan_ver")
+Fixes: 94d7d8f29287 ("ip6_gre: add erspan v2 support")
+Reported-by: Kevin Traynor <ktraynor@redhat.com>
+Signed-off-by: Xin Long <lucien.xin@gmail.com>
+Reviewed-by: Simon Horman <simon.horman@corigine.com>
+Reviewed-by: William Tu <u9012063@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv6/ip6_gre.c | 13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c
+index a4ecfc9d25930..da80974ad23ae 100644
+--- a/net/ipv6/ip6_gre.c
++++ b/net/ipv6/ip6_gre.c
+@@ -1015,12 +1015,14 @@ static netdev_tx_t ip6erspan_tunnel_xmit(struct sk_buff *skb,
+                                           ntohl(tun_id),
+                                           ntohl(md->u.index), truncate,
+                                           false);
++                      proto = htons(ETH_P_ERSPAN);
+               } else if (md->version == 2) {
+                       erspan_build_header_v2(skb,
+                                              ntohl(tun_id),
+                                              md->u.md2.dir,
+                                              get_hwid(&md->u.md2),
+                                              truncate, false);
++                      proto = htons(ETH_P_ERSPAN2);
+               } else {
+                       goto tx_err;
+               }
+@@ -1043,24 +1045,25 @@ static netdev_tx_t ip6erspan_tunnel_xmit(struct sk_buff *skb,
+                       break;
+               }
+-              if (t->parms.erspan_ver == 1)
++              if (t->parms.erspan_ver == 1) {
+                       erspan_build_header(skb, ntohl(t->parms.o_key),
+                                           t->parms.index,
+                                           truncate, false);
+-              else if (t->parms.erspan_ver == 2)
++                      proto = htons(ETH_P_ERSPAN);
++              } else if (t->parms.erspan_ver == 2) {
+                       erspan_build_header_v2(skb, ntohl(t->parms.o_key),
+                                              t->parms.dir,
+                                              t->parms.hwid,
+                                              truncate, false);
+-              else
++                      proto = htons(ETH_P_ERSPAN2);
++              } else {
+                       goto tx_err;
++              }
+               fl6.daddr = t->parms.raddr;
+       }
+       /* Push GRE header. */
+-      proto = (t->parms.erspan_ver == 1) ? htons(ETH_P_ERSPAN)
+-                                         : htons(ETH_P_ERSPAN2);
+       gre_build_header(skb, 8, TUNNEL_SEQ, proto, 0, htonl(atomic_fetch_inc(&t->o_seqno)));
+       /* TooBig packet may have updated dst->dev's mtu */
+-- 
+2.39.2
+
diff --git a/queue-6.3/iavf-send-vlan-offloading-caps-once-after-vfr.patch b/queue-6.3/iavf-send-vlan-offloading-caps-once-after-vfr.patch
new file mode 100644 (file)
index 0000000..233bbbc
--- /dev/null
@@ -0,0 +1,65 @@
+From 07e200fc0b4e649fc587c9a477f25fe3880e3a40 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 17 Apr 2023 12:09:39 -0600
+Subject: iavf: send VLAN offloading caps once after VFR
+
+From: Ahmed Zaki <ahmed.zaki@intel.com>
+
+[ Upstream commit 7dcbdf29282fbcdb646dc785e8a57ed2c2fec8ba ]
+
+When the user disables rxvlan offloading and then changes the number of
+channels, all VLAN ports are unable to receive traffic.
+
+Changing the number of channels triggers a VFR reset. During re-init, when
+VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS is received, we do:
+1 - set the IAVF_FLAG_SETUP_NETDEV_FEATURES flag
+2 - call
+    iavf_set_vlan_offload_features(adapter, 0, netdev->features);
+
+The second step sends to the PF the __default__ features, in this case
+aq_required |= IAVF_FLAG_AQ_ENABLE_CTAG_VLAN_STRIPPING
+
+While the first step forces the watchdog task to call
+netdev_update_features() ->  iavf_set_features() ->
+iavf_set_vlan_offload_features(adapter, netdev->features, features).
+Since the user disabled the "rxvlan", this sets:
+aq_required |= IAVF_FLAG_AQ_DISABLE_CTAG_VLAN_STRIPPING
+
+When we start processing the AQ commands, both flags are enabled. Since we
+process DISABLE_XTAG first then ENABLE_XTAG, this results in the PF
+enabling the rxvlan offload. This breaks all communications on the VLAN
+net devices.
+
+Fix by removing the call to iavf_set_vlan_offload_features() (second
+step). Calling netdev_update_features() from watchdog task is enough for
+both init and reset paths.
+
+Fixes: 7598f4b40bd6 ("iavf: Move netdev_update_features() into watchdog task")
+Signed-off-by: Ahmed Zaki <ahmed.zaki@intel.com>
+Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
+Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/iavf/iavf_virtchnl.c | 5 -----
+ 1 file changed, 5 deletions(-)
+
+diff --git a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
+index 9afbbdac35903..7c0578b5457b9 100644
+--- a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
++++ b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
+@@ -2238,11 +2238,6 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter,
+               iavf_process_config(adapter);
+               adapter->flags |= IAVF_FLAG_SETUP_NETDEV_FEATURES;
+-              /* Request VLAN offload settings */
+-              if (VLAN_V2_ALLOWED(adapter))
+-                      iavf_set_vlan_offload_features(adapter, 0,
+-                                                     netdev->features);
+-
+               iavf_set_queue_vlan_tag_loc(adapter);
+               was_mac_changed = !ether_addr_equal(netdev->dev_addr,
+-- 
+2.39.2
+
diff --git a/queue-6.3/ice-fix-ice-vf-reset-during-iavf-initialization.patch b/queue-6.3/ice-fix-ice-vf-reset-during-iavf-initialization.patch
new file mode 100644 (file)
index 0000000..4b45a4b
--- /dev/null
@@ -0,0 +1,168 @@
+From 50b4f1f594522b15d73e9a8cbff22fc5f864c1bc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 18 Apr 2023 11:52:55 +0200
+Subject: ice: Fix ice VF reset during iavf initialization
+
+From: Dawid Wesierski <dawidx.wesierski@intel.com>
+
+[ Upstream commit 7255355a0636b4eff08d5e8139c77d98f151c4fc ]
+
+Fix the current implementation that causes ice_trigger_vf_reset()
+to start resetting the VF even when the VF-NIC is still initializing.
+
+When we reset NIC with ice driver it can interfere with
+iavf-vf initialization e.g. during consecutive resets induced by ice
+
+iavf                ice
+  |                  |
+  |<-----------------|
+  |            ice resets vf
+ iavf                |
+ reset               |
+ start               |
+  |<-----------------|
+  |             ice resets vf
+  |             causing iavf
+  |             initialization
+  |             error
+  |                  |
+ iavf
+ reset
+ end
+
+This leads to a series of -53 errors
+(failed to init adminq) from the IAVF.
+
+Change the state of the vf_state field to be not active when the IAVF
+is still initializing. Make sure to wait until receiving the message on
+the message box to ensure that the vf is ready and initializded.
+
+In simple terms we use the ACTIVE flag to make sure that the ice
+driver knows if the iavf is ready for another reset
+
+  iavf                  ice
+    |                    |
+    |                    |
+    |<------------- ice resets vf
+  iavf           vf_state != ACTIVE
+  reset                  |
+  start                  |
+    |                    |
+    |                    |
+  iavf                   |
+  reset-------> vf_state == ACTIVE
+  end              ice resets vf
+    |                    |
+    |                    |
+
+Fixes: c54d209c78b8 ("ice: Wait for VF to be reset/ready before configuration")
+Signed-off-by: Dawid Wesierski <dawidx.wesierski@intel.com>
+Signed-off-by: Kamil Maziarz <kamil.maziarz@intel.com>
+Acked-by: Jacob Keller <Jacob.e.keller@intel.com>
+Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/ice/ice_sriov.c    |  8 ++++----
+ drivers/net/ethernet/intel/ice/ice_vf_lib.c   | 19 +++++++++++++++++++
+ drivers/net/ethernet/intel/ice/ice_vf_lib.h   |  1 +
+ drivers/net/ethernet/intel/ice/ice_virtchnl.c |  1 +
+ 4 files changed, 25 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/ethernet/intel/ice/ice_sriov.c b/drivers/net/ethernet/intel/ice/ice_sriov.c
+index 0cc05e54a7815..d4206db7d6d54 100644
+--- a/drivers/net/ethernet/intel/ice/ice_sriov.c
++++ b/drivers/net/ethernet/intel/ice/ice_sriov.c
+@@ -1181,7 +1181,7 @@ int ice_set_vf_spoofchk(struct net_device *netdev, int vf_id, bool ena)
+       if (!vf)
+               return -EINVAL;
+-      ret = ice_check_vf_ready_for_cfg(vf);
++      ret = ice_check_vf_ready_for_reset(vf);
+       if (ret)
+               goto out_put_vf;
+@@ -1296,7 +1296,7 @@ int ice_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac)
+               goto out_put_vf;
+       }
+-      ret = ice_check_vf_ready_for_cfg(vf);
++      ret = ice_check_vf_ready_for_reset(vf);
+       if (ret)
+               goto out_put_vf;
+@@ -1350,7 +1350,7 @@ int ice_set_vf_trust(struct net_device *netdev, int vf_id, bool trusted)
+               return -EOPNOTSUPP;
+       }
+-      ret = ice_check_vf_ready_for_cfg(vf);
++      ret = ice_check_vf_ready_for_reset(vf);
+       if (ret)
+               goto out_put_vf;
+@@ -1663,7 +1663,7 @@ ice_set_vf_port_vlan(struct net_device *netdev, int vf_id, u16 vlan_id, u8 qos,
+       if (!vf)
+               return -EINVAL;
+-      ret = ice_check_vf_ready_for_cfg(vf);
++      ret = ice_check_vf_ready_for_reset(vf);
+       if (ret)
+               goto out_put_vf;
+diff --git a/drivers/net/ethernet/intel/ice/ice_vf_lib.c b/drivers/net/ethernet/intel/ice/ice_vf_lib.c
+index 0e57bd1b85fd4..59524a7c88c5f 100644
+--- a/drivers/net/ethernet/intel/ice/ice_vf_lib.c
++++ b/drivers/net/ethernet/intel/ice/ice_vf_lib.c
+@@ -185,6 +185,25 @@ int ice_check_vf_ready_for_cfg(struct ice_vf *vf)
+       return 0;
+ }
++/**
++ * ice_check_vf_ready_for_reset - check if VF is ready to be reset
++ * @vf: VF to check if it's ready to be reset
++ *
++ * The purpose of this function is to ensure that the VF is not in reset,
++ * disabled, and is both initialized and active, thus enabling us to safely
++ * initialize another reset.
++ */
++int ice_check_vf_ready_for_reset(struct ice_vf *vf)
++{
++      int ret;
++
++      ret = ice_check_vf_ready_for_cfg(vf);
++      if (!ret && !test_bit(ICE_VF_STATE_ACTIVE, vf->vf_states))
++              ret = -EAGAIN;
++
++      return ret;
++}
++
+ /**
+  * ice_trigger_vf_reset - Reset a VF on HW
+  * @vf: pointer to the VF structure
+diff --git a/drivers/net/ethernet/intel/ice/ice_vf_lib.h b/drivers/net/ethernet/intel/ice/ice_vf_lib.h
+index ef30f05b5d02e..3fc6a0a8d9554 100644
+--- a/drivers/net/ethernet/intel/ice/ice_vf_lib.h
++++ b/drivers/net/ethernet/intel/ice/ice_vf_lib.h
+@@ -215,6 +215,7 @@ u16 ice_get_num_vfs(struct ice_pf *pf);
+ struct ice_vsi *ice_get_vf_vsi(struct ice_vf *vf);
+ bool ice_is_vf_disabled(struct ice_vf *vf);
+ int ice_check_vf_ready_for_cfg(struct ice_vf *vf);
++int ice_check_vf_ready_for_reset(struct ice_vf *vf);
+ void ice_set_vf_state_dis(struct ice_vf *vf);
+ bool ice_is_any_vf_in_unicast_promisc(struct ice_pf *pf);
+ void
+diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl.c b/drivers/net/ethernet/intel/ice/ice_virtchnl.c
+index e24e3f5017ca6..d8c66baf4eb41 100644
+--- a/drivers/net/ethernet/intel/ice/ice_virtchnl.c
++++ b/drivers/net/ethernet/intel/ice/ice_virtchnl.c
+@@ -3908,6 +3908,7 @@ void ice_vc_process_vf_msg(struct ice_pf *pf, struct ice_rq_event_info *event)
+               ice_vc_notify_vf_link_state(vf);
+               break;
+       case VIRTCHNL_OP_RESET_VF:
++              clear_bit(ICE_VF_STATE_ACTIVE, vf->vf_states);
+               ops->reset_vf(vf);
+               break;
+       case VIRTCHNL_OP_ADD_ETH_ADDR:
+-- 
+2.39.2
+
diff --git a/queue-6.3/ice-fix-stats-after-pf-reset.patch b/queue-6.3/ice-fix-stats-after-pf-reset.patch
new file mode 100644 (file)
index 0000000..902f4be
--- /dev/null
@@ -0,0 +1,51 @@
+From 44d00b4becaa06b8262cf2aa82ebc231ea15f799 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 17 Apr 2023 17:44:45 -0600
+Subject: ice: Fix stats after PF reset
+
+From: Ahmed Zaki <ahmed.zaki@intel.com>
+
+[ Upstream commit ab7470bc6d8fb5f3004ccc8e4dfd49aab0f27561 ]
+
+After a core PF reset, the VFs were showing wrong Rx/Tx stats. This is a
+regression in commit 6624e780a577 ("ice: split ice_vsi_setup into smaller
+functions") caused by missing to set "stat_offsets_loaded = false" in the
+ice_vsi_rebuild() path.
+
+Fixes: 6624e780a577 ("ice: split ice_vsi_setup into smaller functions")
+Signed-off-by: Ahmed Zaki <ahmed.zaki@intel.com>
+Reviewed-by: Alexander Lobakin <aleksander.lobakin@intel.com>
+Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
+Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/ice/ice_lib.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c
+index 450317dfcca73..11ae0e41f518a 100644
+--- a/drivers/net/ethernet/intel/ice/ice_lib.c
++++ b/drivers/net/ethernet/intel/ice/ice_lib.c
+@@ -2745,6 +2745,8 @@ ice_vsi_cfg_def(struct ice_vsi *vsi, struct ice_vsi_cfg_params *params)
+                       goto unroll_vector_base;
+               ice_vsi_map_rings_to_vectors(vsi);
++              vsi->stat_offsets_loaded = false;
++
+               if (ice_is_xdp_ena_vsi(vsi)) {
+                       ret = ice_vsi_determine_xdp_res(vsi);
+                       if (ret)
+@@ -2793,6 +2795,9 @@ ice_vsi_cfg_def(struct ice_vsi *vsi, struct ice_vsi_cfg_params *params)
+               ret = ice_vsi_alloc_ring_stats(vsi);
+               if (ret)
+                       goto unroll_vector_base;
++
++              vsi->stat_offsets_loaded = false;
++
+               /* Do not exit if configuring RSS had an issue, at least
+                * receive traffic on first queue. Hence no need to capture
+                * return value
+-- 
+2.39.2
+
diff --git a/queue-6.3/ice-fix-undersized-tx_flags-variable.patch b/queue-6.3/ice-fix-undersized-tx_flags-variable.patch
new file mode 100644 (file)
index 0000000..d34dbb6
--- /dev/null
@@ -0,0 +1,112 @@
+From 73cc5fccd91bc1b11a6407292ed24ea72adcaf0d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 May 2023 08:53:19 -0700
+Subject: ice: Fix undersized tx_flags variable
+
+From: Jan Sokolowski <jan.sokolowski@intel.com>
+
+[ Upstream commit 9113302bb43cf7a6d5a414d49b29478e57451c86 ]
+
+As not all ICE_TX_FLAGS_* fit in current 16-bit limited
+tx_flags field that was introduced in the Fixes commit,
+VLAN-related information would be discarded completely.
+As such, creating a vlan and trying to run ping through
+would result in no traffic passing.
+
+Fix that by refactoring tx_flags variable into flags only and
+a separate variable that holds VLAN ID. As there is some space left,
+type variable can fit between those two. Pahole reports no size
+change to ice_tx_buf struct.
+
+Fixes: aa1d3faf71a6 ("ice: Robustify cleaning/completing XDP Tx buffers")
+Signed-off-by: Jan Sokolowski <jan.sokolowski@intel.com>
+Reviewed-by: Alexander Lobakin <aleksander.lobakin@intel.com>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/ice/ice_dcb_lib.c | 5 ++---
+ drivers/net/ethernet/intel/ice/ice_txrx.c    | 8 +++-----
+ drivers/net/ethernet/intel/ice/ice_txrx.h    | 9 +++------
+ 3 files changed, 8 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/net/ethernet/intel/ice/ice_dcb_lib.c b/drivers/net/ethernet/intel/ice/ice_dcb_lib.c
+index c6d4926f0fcf5..850db8e0e6b00 100644
+--- a/drivers/net/ethernet/intel/ice/ice_dcb_lib.c
++++ b/drivers/net/ethernet/intel/ice/ice_dcb_lib.c
+@@ -932,10 +932,9 @@ ice_tx_prepare_vlan_flags_dcb(struct ice_tx_ring *tx_ring,
+       if ((first->tx_flags & ICE_TX_FLAGS_HW_VLAN ||
+            first->tx_flags & ICE_TX_FLAGS_HW_OUTER_SINGLE_VLAN) ||
+           skb->priority != TC_PRIO_CONTROL) {
+-              first->tx_flags &= ~ICE_TX_FLAGS_VLAN_PR_M;
++              first->vid &= ~VLAN_PRIO_MASK;
+               /* Mask the lower 3 bits to set the 802.1p priority */
+-              first->tx_flags |= (skb->priority & 0x7) <<
+-                                 ICE_TX_FLAGS_VLAN_PR_S;
++              first->vid |= (skb->priority << VLAN_PRIO_SHIFT) & VLAN_PRIO_MASK;
+               /* if this is not already set it means a VLAN 0 + priority needs
+                * to be offloaded
+                */
+diff --git a/drivers/net/ethernet/intel/ice/ice_txrx.c b/drivers/net/ethernet/intel/ice/ice_txrx.c
+index 4fcf2d07eb853..059bd911c51d8 100644
+--- a/drivers/net/ethernet/intel/ice/ice_txrx.c
++++ b/drivers/net/ethernet/intel/ice/ice_txrx.c
+@@ -1664,8 +1664,7 @@ ice_tx_map(struct ice_tx_ring *tx_ring, struct ice_tx_buf *first,
+       if (first->tx_flags & ICE_TX_FLAGS_HW_VLAN) {
+               td_cmd |= (u64)ICE_TX_DESC_CMD_IL2TAG1;
+-              td_tag = (first->tx_flags & ICE_TX_FLAGS_VLAN_M) >>
+-                        ICE_TX_FLAGS_VLAN_S;
++              td_tag = first->vid;
+       }
+       dma = dma_map_single(tx_ring->dev, skb->data, size, DMA_TO_DEVICE);
+@@ -1998,7 +1997,7 @@ ice_tx_prepare_vlan_flags(struct ice_tx_ring *tx_ring, struct ice_tx_buf *first)
+        * VLAN offloads exclusively so we only care about the VLAN ID here
+        */
+       if (skb_vlan_tag_present(skb)) {
+-              first->tx_flags |= skb_vlan_tag_get(skb) << ICE_TX_FLAGS_VLAN_S;
++              first->vid = skb_vlan_tag_get(skb);
+               if (tx_ring->flags & ICE_TX_FLAGS_RING_VLAN_L2TAG2)
+                       first->tx_flags |= ICE_TX_FLAGS_HW_OUTER_SINGLE_VLAN;
+               else
+@@ -2388,8 +2387,7 @@ ice_xmit_frame_ring(struct sk_buff *skb, struct ice_tx_ring *tx_ring)
+               offload.cd_qw1 |= (u64)(ICE_TX_DESC_DTYPE_CTX |
+                                       (ICE_TX_CTX_DESC_IL2TAG2 <<
+                                       ICE_TXD_CTX_QW1_CMD_S));
+-              offload.cd_l2tag2 = (first->tx_flags & ICE_TX_FLAGS_VLAN_M) >>
+-                      ICE_TX_FLAGS_VLAN_S;
++              offload.cd_l2tag2 = first->vid;
+       }
+       /* set up TSO offload */
+diff --git a/drivers/net/ethernet/intel/ice/ice_txrx.h b/drivers/net/ethernet/intel/ice/ice_txrx.h
+index fff0efe28373a..166413fc33f48 100644
+--- a/drivers/net/ethernet/intel/ice/ice_txrx.h
++++ b/drivers/net/ethernet/intel/ice/ice_txrx.h
+@@ -127,10 +127,6 @@ static inline int ice_skb_pad(void)
+ #define ICE_TX_FLAGS_IPV6     BIT(6)
+ #define ICE_TX_FLAGS_TUNNEL   BIT(7)
+ #define ICE_TX_FLAGS_HW_OUTER_SINGLE_VLAN     BIT(8)
+-#define ICE_TX_FLAGS_VLAN_M   0xffff0000
+-#define ICE_TX_FLAGS_VLAN_PR_M        0xe0000000
+-#define ICE_TX_FLAGS_VLAN_PR_S        29
+-#define ICE_TX_FLAGS_VLAN_S   16
+ #define ICE_XDP_PASS          0
+ #define ICE_XDP_CONSUMED      BIT(0)
+@@ -182,8 +178,9 @@ struct ice_tx_buf {
+               unsigned int gso_segs;
+               unsigned int nr_frags;  /* used for mbuf XDP */
+       };
+-      u32 type:16;                    /* &ice_tx_buf_type */
+-      u32 tx_flags:16;
++      u32 tx_flags:12;
++      u32 type:4;                     /* &ice_tx_buf_type */
++      u32 vid:16;
+       DEFINE_DMA_UNMAP_LEN(len);
+       DEFINE_DMA_UNMAP_ADDR(dma);
+ };
+-- 
+2.39.2
+
diff --git a/queue-6.3/igb-fix-bit_shift-to-be-in-1.8-range.patch b/queue-6.3/igb-fix-bit_shift-to-be-in-1.8-range.patch
new file mode 100644 (file)
index 0000000..05da77f
--- /dev/null
@@ -0,0 +1,50 @@
+From 0fe60f80d2ca23167b6f222cdd964f336faa7f4c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 16 May 2023 10:41:46 -0700
+Subject: igb: fix bit_shift to be in [1..8] range
+
+From: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
+
+[ Upstream commit 60d758659f1fb49e0d5b6ac2691ede8c0958795b ]
+
+In igb_hash_mc_addr() the expression:
+        "mc_addr[4] >> 8 - bit_shift", right shifting "mc_addr[4]"
+shift by more than 7 bits always yields zero, so hash becomes not so different.
+Add initialization with bit_shift = 1 and add a loop condition to ensure
+bit_shift will be always in [1..8] range.
+
+Fixes: 9d5c824399de ("igb: PCI-Express 82575 Gigabit Ethernet driver")
+Signed-off-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
+Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/igb/e1000_mac.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/intel/igb/e1000_mac.c b/drivers/net/ethernet/intel/igb/e1000_mac.c
+index 205d577bdbbaa..caf91c6f52b4d 100644
+--- a/drivers/net/ethernet/intel/igb/e1000_mac.c
++++ b/drivers/net/ethernet/intel/igb/e1000_mac.c
+@@ -426,7 +426,7 @@ void igb_mta_set(struct e1000_hw *hw, u32 hash_value)
+ static u32 igb_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr)
+ {
+       u32 hash_value, hash_mask;
+-      u8 bit_shift = 0;
++      u8 bit_shift = 1;
+       /* Register count multiplied by bits per register */
+       hash_mask = (hw->mac.mta_reg_count * 32) - 1;
+@@ -434,7 +434,7 @@ static u32 igb_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr)
+       /* For a mc_filter_type of 0, bit_shift is the number of left-shifts
+        * where 0xFF would still fall within the hash mask.
+        */
+-      while (hash_mask >> bit_shift != 0xFF)
++      while (hash_mask >> bit_shift != 0xFF && bit_shift < 4)
+               bit_shift++;
+       /* The portion of the address that is used for the hash table
+-- 
+2.39.2
+
diff --git a/queue-6.3/media-netup_unidvb-fix-use-after-free-at-del_timer.patch b/queue-6.3/media-netup_unidvb-fix-use-after-free-at-del_timer.patch
new file mode 100644 (file)
index 0000000..7654b04
--- /dev/null
@@ -0,0 +1,49 @@
+From a19d4281a28939af4022d72f8538f6a0b2444326 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 Mar 2023 12:55:14 +0000
+Subject: media: netup_unidvb: fix use-after-free at del_timer()
+
+From: Duoming Zhou <duoming@zju.edu.cn>
+
+[ Upstream commit 0f5bb36bf9b39a2a96e730bf4455095b50713f63 ]
+
+When Universal DVB card is detaching, netup_unidvb_dma_fini()
+uses del_timer() to stop dma->timeout timer. But when timer
+handler netup_unidvb_dma_timeout() is running, del_timer()
+could not stop it. As a result, the use-after-free bug could
+happen. The process is shown below:
+
+    (cleanup routine)          |        (timer routine)
+                               | mod_timer(&dev->tx_sim_timer, ..)
+netup_unidvb_finidev()         | (wait a time)
+  netup_unidvb_dma_fini()      | netup_unidvb_dma_timeout()
+    del_timer(&dma->timeout);  |
+                               |   ndev->pci_dev->dev //USE
+
+Fix by changing del_timer() to del_timer_sync().
+
+Link: https://lore.kernel.org/linux-media/20230308125514.4208-1-duoming@zju.edu.cn
+Fixes: 52b1eaf4c59a ("[media] netup_unidvb: NetUP Universal DVB-S/S2/T/T2/C PCI-E card driver")
+Signed-off-by: Duoming Zhou <duoming@zju.edu.cn>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/media/pci/netup_unidvb/netup_unidvb_core.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/media/pci/netup_unidvb/netup_unidvb_core.c b/drivers/media/pci/netup_unidvb/netup_unidvb_core.c
+index 8287851b5ffdc..aaa1d2dedebdd 100644
+--- a/drivers/media/pci/netup_unidvb/netup_unidvb_core.c
++++ b/drivers/media/pci/netup_unidvb/netup_unidvb_core.c
+@@ -697,7 +697,7 @@ static void netup_unidvb_dma_fini(struct netup_unidvb_dev *ndev, int num)
+       netup_unidvb_dma_enable(dma, 0);
+       msleep(50);
+       cancel_work_sync(&dma->work);
+-      del_timer(&dma->timeout);
++      del_timer_sync(&dma->timeout);
+ }
+ static int netup_unidvb_dma_setup(struct netup_unidvb_dev *ndev)
+-- 
+2.39.2
+
diff --git a/queue-6.3/media-pvrusb2-fix-dvb_core-dependency.patch b/queue-6.3/media-pvrusb2-fix-dvb_core-dependency.patch
new file mode 100644 (file)
index 0000000..7d8fc54
--- /dev/null
@@ -0,0 +1,45 @@
+From 6f55f6b5c49a5eda6e4301d14e838434f22233a8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 Jan 2023 17:10:16 +0000
+Subject: media: pvrusb2: fix DVB_CORE dependency
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit 53558de2b5c4f4ee6bfcfbe34e27071c2d0073d5 ]
+
+Now that DVB_CORE can be a loadable module, pvrusb2 can run into
+a link error:
+
+ld.lld: error: undefined symbol: dvb_module_probe
+>>> referenced by pvrusb2-devattr.c
+>>>               drivers/media/usb/pvrusb2/pvrusb2-devattr.o:(pvr2_lgdt3306a_attach) in archive vmlinux.a
+ld.lld: error: undefined symbol: dvb_module_release
+>>> referenced by pvrusb2-devattr.c
+>>>               drivers/media/usb/pvrusb2/pvrusb2-devattr.o:(pvr2_dual_fe_attach) in archive vmlinux.a
+
+Refine the Kconfig dependencies to avoid this case.
+
+Link: https://lore.kernel.org/linux-media/20230117171055.2714621-1-arnd@kernel.org
+Fixes: 7655c342dbc4 ("media: Kconfig: Make DVB_CORE=m possible when MEDIA_SUPPORT=y")
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/media/usb/pvrusb2/Kconfig | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/media/usb/pvrusb2/Kconfig b/drivers/media/usb/pvrusb2/Kconfig
+index 9501b10b31aa5..0df10270dbdfc 100644
+--- a/drivers/media/usb/pvrusb2/Kconfig
++++ b/drivers/media/usb/pvrusb2/Kconfig
+@@ -37,6 +37,7 @@ config VIDEO_PVRUSB2_DVB
+       bool "pvrusb2 ATSC/DVB support"
+       default y
+       depends on VIDEO_PVRUSB2 && DVB_CORE
++      depends on VIDEO_PVRUSB2=m || DVB_CORE=y
+       select DVB_LGDT330X if MEDIA_SUBDRV_AUTOSELECT
+       select DVB_S5H1409 if MEDIA_SUBDRV_AUTOSELECT
+       select DVB_S5H1411 if MEDIA_SUBDRV_AUTOSELECT
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-bcmgenet-remove-phy_stop-from-bcmgenet_netif_sto.patch b/queue-6.3/net-bcmgenet-remove-phy_stop-from-bcmgenet_netif_sto.patch
new file mode 100644 (file)
index 0000000..f39d0ff
--- /dev/null
@@ -0,0 +1,38 @@
+From aed369b5ad9283fc686d95ce097de0f89474412b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 May 2023 16:07:27 -0700
+Subject: net: bcmgenet: Remove phy_stop() from bcmgenet_netif_stop()
+
+From: Florian Fainelli <f.fainelli@gmail.com>
+
+[ Upstream commit 93e0401e0fc0c54b0ac05b687cd135c2ac38187c ]
+
+The call to phy_stop() races with the later call to phy_disconnect(),
+resulting in concurrent phy_suspend() calls being run from different
+CPUs. The final call to phy_disconnect() ensures that the PHY is
+stopped and suspended, too.
+
+Fixes: c96e731c93ff ("net: bcmgenet: connect and disconnect from the PHY state machine")
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Stable-dep-of: 225c657945c4 ("net: bcmgenet: Restore phy_stop() depending upon suspend/close")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/broadcom/genet/bcmgenet.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+index d937daa8ee883..f28ffc31df220 100644
+--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
++++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+@@ -3465,7 +3465,6 @@ static void bcmgenet_netif_stop(struct net_device *dev)
+       /* Disable MAC transmit. TX DMA disabled must be done before this */
+       umac_enable_set(priv, CMD_TX_EN, false);
+-      phy_stop(dev->phydev);
+       bcmgenet_disable_rx_napi(priv);
+       bcmgenet_intr_disable(priv);
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-bcmgenet-restore-phy_stop-depending-upon-suspend.patch b/queue-6.3/net-bcmgenet-restore-phy_stop-depending-upon-suspend.patch
new file mode 100644 (file)
index 0000000..ca2701d
--- /dev/null
@@ -0,0 +1,71 @@
+From 6f7967c3427a1edfcca49e8ffba419c3361a828b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 May 2023 19:56:07 -0700
+Subject: net: bcmgenet: Restore phy_stop() depending upon suspend/close
+
+From: Florian Fainelli <f.fainelli@gmail.com>
+
+[ Upstream commit 225c657945c4a6307741cb3cc89467eadcc26e9b ]
+
+Removing the phy_stop() from bcmgenet_netif_stop() ended up causing
+warnings from the PHY library that phy_start() is called from the
+RUNNING state since we are no longer stopping the PHY state machine
+during bcmgenet_suspend().
+
+Restore the call to phy_stop() but make it conditional on being called
+from the close or suspend path.
+
+Fixes: c96e731c93ff ("net: bcmgenet: connect and disconnect from the PHY state machine")
+Fixes: 93e0401e0fc0 ("net: bcmgenet: Remove phy_stop() from bcmgenet_netif_stop()")
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
+Link: https://lore.kernel.org/r/20230515025608.2587012-1-f.fainelli@gmail.com
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/broadcom/genet/bcmgenet.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+index f28ffc31df220..eca0c92c0c84d 100644
+--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
++++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+@@ -3450,7 +3450,7 @@ static int bcmgenet_open(struct net_device *dev)
+       return ret;
+ }
+-static void bcmgenet_netif_stop(struct net_device *dev)
++static void bcmgenet_netif_stop(struct net_device *dev, bool stop_phy)
+ {
+       struct bcmgenet_priv *priv = netdev_priv(dev);
+@@ -3465,6 +3465,8 @@ static void bcmgenet_netif_stop(struct net_device *dev)
+       /* Disable MAC transmit. TX DMA disabled must be done before this */
+       umac_enable_set(priv, CMD_TX_EN, false);
++      if (stop_phy)
++              phy_stop(dev->phydev);
+       bcmgenet_disable_rx_napi(priv);
+       bcmgenet_intr_disable(priv);
+@@ -3485,7 +3487,7 @@ static int bcmgenet_close(struct net_device *dev)
+       netif_dbg(priv, ifdown, dev, "bcmgenet_close\n");
+-      bcmgenet_netif_stop(dev);
++      bcmgenet_netif_stop(dev, false);
+       /* Really kill the PHY state machine and disconnect from it */
+       phy_disconnect(dev->phydev);
+@@ -4303,7 +4305,7 @@ static int bcmgenet_suspend(struct device *d)
+       netif_device_detach(dev);
+-      bcmgenet_netif_stop(dev);
++      bcmgenet_netif_stop(dev, true);
+       if (!device_may_wakeup(d))
+               phy_suspend(dev->phydev);
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-dsa-mv88e6xxx-fix-mv88e6393x-epc-write-command-o.patch b/queue-6.3/net-dsa-mv88e6xxx-fix-mv88e6393x-epc-write-command-o.patch
new file mode 100644 (file)
index 0000000..fb50d06
--- /dev/null
@@ -0,0 +1,37 @@
+From 781c24c592240834e493c6915356084c6abb925d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 16 May 2023 09:38:54 +0200
+Subject: net: dsa: mv88e6xxx: Fix mv88e6393x EPC write command offset
+
+From: Marco Migliore <m.migliore@tiesse.com>
+
+[ Upstream commit 1323e0c6e1d7e103d59384c3ac50f72b17a6936c ]
+
+According to datasheet, the command opcode must be specified
+into bits [14:12] of the Extended Port Control register (EPC).
+
+Fixes: de776d0d316f ("net: dsa: mv88e6xxx: add support for mv88e6393x family")
+Signed-off-by: Marco Migliore <m.migliore@tiesse.com>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/dsa/mv88e6xxx/port.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/dsa/mv88e6xxx/port.h b/drivers/net/dsa/mv88e6xxx/port.h
+index aec9d4fd20e36..d19b6303b91f0 100644
+--- a/drivers/net/dsa/mv88e6xxx/port.h
++++ b/drivers/net/dsa/mv88e6xxx/port.h
+@@ -276,7 +276,7 @@
+ /* Offset 0x10: Extended Port Control Command */
+ #define MV88E6393X_PORT_EPC_CMD               0x10
+ #define MV88E6393X_PORT_EPC_CMD_BUSY  0x8000
+-#define MV88E6393X_PORT_EPC_CMD_WRITE 0x0300
++#define MV88E6393X_PORT_EPC_CMD_WRITE 0x3000
+ #define MV88E6393X_PORT_EPC_INDEX_PORT_ETYPE  0x02
+ /* Offset 0x11: Extended Port Control Data */
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-dsa-rzn1-a5psw-disable-learning-for-standalone-p.patch b/queue-6.3/net-dsa-rzn1-a5psw-disable-learning-for-standalone-p.patch
new file mode 100644 (file)
index 0000000..f1884dd
--- /dev/null
@@ -0,0 +1,89 @@
+From fdc2943e805447d528e9d27d754a8353dfd0f866 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 May 2023 09:27:12 +0200
+Subject: net: dsa: rzn1-a5psw: disable learning for standalone ports
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Clément Léger <clement.leger@bootlin.com>
+
+[ Upstream commit ec52b69c046a6219011af780aca155a96719637b ]
+
+When ports are in standalone mode, they should have learning disabled to
+avoid adding new entries in the MAC lookup table which might be used by
+other bridge ports to forward packets. While adding that, also make sure
+learning is enabled for CPU port.
+
+Fixes: 888cdb892b61 ("net: dsa: rzn1-a5psw: add Renesas RZ/N1 advanced 5 port switch driver")
+Signed-off-by: Clément Léger <clement.leger@bootlin.com>
+Signed-off-by: Alexis Lothoré <alexis.lothore@bootlin.com>
+Reviewed-by: Piotr Raczynski <piotr.raczynski@intel.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/dsa/rzn1_a5psw.c | 24 ++++++++++++++++--------
+ 1 file changed, 16 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/net/dsa/rzn1_a5psw.c b/drivers/net/dsa/rzn1_a5psw.c
+index e2549cb31d008..c37d2e5372302 100644
+--- a/drivers/net/dsa/rzn1_a5psw.c
++++ b/drivers/net/dsa/rzn1_a5psw.c
+@@ -340,6 +340,14 @@ static void a5psw_flooding_set_resolution(struct a5psw *a5psw, int port,
+               a5psw_reg_writel(a5psw, offsets[i], a5psw->bridged_ports);
+ }
++static void a5psw_port_set_standalone(struct a5psw *a5psw, int port,
++                                    bool standalone)
++{
++      a5psw_port_learning_set(a5psw, port, !standalone);
++      a5psw_flooding_set_resolution(a5psw, port, !standalone);
++      a5psw_port_mgmtfwd_set(a5psw, port, standalone);
++}
++
+ static int a5psw_port_bridge_join(struct dsa_switch *ds, int port,
+                                 struct dsa_bridge bridge,
+                                 bool *tx_fwd_offload,
+@@ -355,8 +363,7 @@ static int a5psw_port_bridge_join(struct dsa_switch *ds, int port,
+       }
+       a5psw->br_dev = bridge.dev;
+-      a5psw_flooding_set_resolution(a5psw, port, true);
+-      a5psw_port_mgmtfwd_set(a5psw, port, false);
++      a5psw_port_set_standalone(a5psw, port, false);
+       return 0;
+ }
+@@ -366,8 +373,7 @@ static void a5psw_port_bridge_leave(struct dsa_switch *ds, int port,
+ {
+       struct a5psw *a5psw = ds->priv;
+-      a5psw_flooding_set_resolution(a5psw, port, false);
+-      a5psw_port_mgmtfwd_set(a5psw, port, true);
++      a5psw_port_set_standalone(a5psw, port, true);
+       /* No more ports bridged */
+       if (a5psw->bridged_ports == BIT(A5PSW_CPU_PORT))
+@@ -761,13 +767,15 @@ static int a5psw_setup(struct dsa_switch *ds)
+               if (dsa_port_is_unused(dp))
+                       continue;
+-              /* Enable egress flooding for CPU port */
+-              if (dsa_port_is_cpu(dp))
++              /* Enable egress flooding and learning for CPU port */
++              if (dsa_port_is_cpu(dp)) {
+                       a5psw_flooding_set_resolution(a5psw, port, true);
++                      a5psw_port_learning_set(a5psw, port, true);
++              }
+-              /* Enable management forward only for user ports */
++              /* Enable standalone mode for user ports */
+               if (dsa_port_is_user(dp))
+-                      a5psw_port_mgmtfwd_set(a5psw, port, true);
++                      a5psw_port_set_standalone(a5psw, port, true);
+       }
+       return 0;
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-dsa-rzn1-a5psw-enable-management-frames-for-cpu-.patch b/queue-6.3/net-dsa-rzn1-a5psw-enable-management-frames-for-cpu-.patch
new file mode 100644 (file)
index 0000000..5eb11b5
--- /dev/null
@@ -0,0 +1,57 @@
+From 7d195cc6253dc564539c9ad5791f57d62290e4e1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 May 2023 09:27:10 +0200
+Subject: net: dsa: rzn1-a5psw: enable management frames for CPU port
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Clément Léger <clement.leger@bootlin.com>
+
+[ Upstream commit 9e4b45f20c5aac786c728619e5ee746bffce1798 ]
+
+Currently, management frame were discarded before reaching the CPU port due
+to a misconfiguration of the MGMT_CONFIG register. Enable them by setting
+the correct value in this register in order to correctly receive management
+frame and handle STP.
+
+Fixes: 888cdb892b61 ("net: dsa: rzn1-a5psw: add Renesas RZ/N1 advanced 5 port switch driver")
+Signed-off-by: Clément Léger <clement.leger@bootlin.com>
+Signed-off-by: Alexis Lothoré <alexis.lothore@bootlin.com>
+Reviewed-by: Piotr Raczynski <piotr.raczynski@intel.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/dsa/rzn1_a5psw.c | 2 +-
+ drivers/net/dsa/rzn1_a5psw.h | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/dsa/rzn1_a5psw.c b/drivers/net/dsa/rzn1_a5psw.c
+index 919027cf20124..8a419e2ffe2a4 100644
+--- a/drivers/net/dsa/rzn1_a5psw.c
++++ b/drivers/net/dsa/rzn1_a5psw.c
+@@ -673,7 +673,7 @@ static int a5psw_setup(struct dsa_switch *ds)
+       }
+       /* Configure management port */
+-      reg = A5PSW_CPU_PORT | A5PSW_MGMT_CFG_DISCARD;
++      reg = A5PSW_CPU_PORT | A5PSW_MGMT_CFG_ENABLE;
+       a5psw_reg_writel(a5psw, A5PSW_MGMT_CFG, reg);
+       /* Set pattern 0 to forward all frame to mgmt port */
+diff --git a/drivers/net/dsa/rzn1_a5psw.h b/drivers/net/dsa/rzn1_a5psw.h
+index c67abd49c013d..b4fbf453ff741 100644
+--- a/drivers/net/dsa/rzn1_a5psw.h
++++ b/drivers/net/dsa/rzn1_a5psw.h
+@@ -36,7 +36,7 @@
+ #define A5PSW_INPUT_LEARN_BLOCK(p)    BIT(p)
+ #define A5PSW_MGMT_CFG                        0x20
+-#define A5PSW_MGMT_CFG_DISCARD                BIT(7)
++#define A5PSW_MGMT_CFG_ENABLE         BIT(6)
+ #define A5PSW_MODE_CFG                        0x24
+ #define A5PSW_MODE_STATS_RESET                BIT(31)
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-dsa-rzn1-a5psw-fix-stp-states-handling.patch b/queue-6.3/net-dsa-rzn1-a5psw-fix-stp-states-handling.patch
new file mode 100644 (file)
index 0000000..c32c643
--- /dev/null
@@ -0,0 +1,142 @@
+From 72c94856c20c93589c91b27bb32822768ddf20da Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 May 2023 09:27:11 +0200
+Subject: net: dsa: rzn1-a5psw: fix STP states handling
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Alexis Lothoré <alexis.lothore@bootlin.com>
+
+[ Upstream commit ebe9bc50952757b4b25eaf514da7c464196c9606 ]
+
+stp_set_state() should actually allow receiving BPDU while in LEARNING
+mode which is not the case. Additionally, the BLOCKEN bit does not
+actually forbid sending forwarded frames from that port. To fix this, add
+a5psw_port_tx_enable() function which allows to disable TX. However, while
+its name suggest that TX is totally disabled, it is not and can still
+allow to send BPDUs even if disabled. This can be done by using forced
+forwarding with the switch tagging mechanism but keeping "filtering"
+disabled (which is already the case in the rzn1-a5sw tag driver). With
+these fixes, STP support is now functional.
+
+Fixes: 888cdb892b61 ("net: dsa: rzn1-a5psw: add Renesas RZ/N1 advanced 5 port switch driver")
+Signed-off-by: Clément Léger <clement.leger@bootlin.com>
+Signed-off-by: Alexis Lothoré <alexis.lothore@bootlin.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/dsa/rzn1_a5psw.c | 57 ++++++++++++++++++++++++++++++------
+ drivers/net/dsa/rzn1_a5psw.h |  1 +
+ 2 files changed, 49 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/net/dsa/rzn1_a5psw.c b/drivers/net/dsa/rzn1_a5psw.c
+index 8a419e2ffe2a4..e2549cb31d008 100644
+--- a/drivers/net/dsa/rzn1_a5psw.c
++++ b/drivers/net/dsa/rzn1_a5psw.c
+@@ -120,6 +120,22 @@ static void a5psw_port_mgmtfwd_set(struct a5psw *a5psw, int port, bool enable)
+       a5psw_port_pattern_set(a5psw, port, A5PSW_PATTERN_MGMTFWD, enable);
+ }
++static void a5psw_port_tx_enable(struct a5psw *a5psw, int port, bool enable)
++{
++      u32 mask = A5PSW_PORT_ENA_TX(port);
++      u32 reg = enable ? mask : 0;
++
++      /* Even though the port TX is disabled through TXENA bit in the
++       * PORT_ENA register, it can still send BPDUs. This depends on the tag
++       * configuration added when sending packets from the CPU port to the
++       * switch port. Indeed, when using forced forwarding without filtering,
++       * even disabled ports will be able to send packets that are tagged.
++       * This allows to implement STP support when ports are in a state where
++       * forwarding traffic should be stopped but BPDUs should still be sent.
++       */
++      a5psw_reg_rmw(a5psw, A5PSW_PORT_ENA, mask, reg);
++}
++
+ static void a5psw_port_enable_set(struct a5psw *a5psw, int port, bool enable)
+ {
+       u32 port_ena = 0;
+@@ -292,6 +308,22 @@ static int a5psw_set_ageing_time(struct dsa_switch *ds, unsigned int msecs)
+       return 0;
+ }
++static void a5psw_port_learning_set(struct a5psw *a5psw, int port, bool learn)
++{
++      u32 mask = A5PSW_INPUT_LEARN_DIS(port);
++      u32 reg = !learn ? mask : 0;
++
++      a5psw_reg_rmw(a5psw, A5PSW_INPUT_LEARN, mask, reg);
++}
++
++static void a5psw_port_rx_block_set(struct a5psw *a5psw, int port, bool block)
++{
++      u32 mask = A5PSW_INPUT_LEARN_BLOCK(port);
++      u32 reg = block ? mask : 0;
++
++      a5psw_reg_rmw(a5psw, A5PSW_INPUT_LEARN, mask, reg);
++}
++
+ static void a5psw_flooding_set_resolution(struct a5psw *a5psw, int port,
+                                         bool set)
+ {
+@@ -344,28 +376,35 @@ static void a5psw_port_bridge_leave(struct dsa_switch *ds, int port,
+ static void a5psw_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
+ {
+-      u32 mask = A5PSW_INPUT_LEARN_DIS(port) | A5PSW_INPUT_LEARN_BLOCK(port);
++      bool learning_enabled, rx_enabled, tx_enabled;
+       struct a5psw *a5psw = ds->priv;
+-      u32 reg = 0;
+       switch (state) {
+       case BR_STATE_DISABLED:
+       case BR_STATE_BLOCKING:
+-              reg |= A5PSW_INPUT_LEARN_DIS(port);
+-              reg |= A5PSW_INPUT_LEARN_BLOCK(port);
+-              break;
+       case BR_STATE_LISTENING:
+-              reg |= A5PSW_INPUT_LEARN_DIS(port);
++              rx_enabled = false;
++              tx_enabled = false;
++              learning_enabled = false;
+               break;
+       case BR_STATE_LEARNING:
+-              reg |= A5PSW_INPUT_LEARN_BLOCK(port);
++              rx_enabled = false;
++              tx_enabled = false;
++              learning_enabled = true;
+               break;
+       case BR_STATE_FORWARDING:
+-      default:
++              rx_enabled = true;
++              tx_enabled = true;
++              learning_enabled = true;
+               break;
++      default:
++              dev_err(ds->dev, "invalid STP state: %d\n", state);
++              return;
+       }
+-      a5psw_reg_rmw(a5psw, A5PSW_INPUT_LEARN, mask, reg);
++      a5psw_port_learning_set(a5psw, port, learning_enabled);
++      a5psw_port_rx_block_set(a5psw, port, !rx_enabled);
++      a5psw_port_tx_enable(a5psw, port, tx_enabled);
+ }
+ static void a5psw_port_fast_age(struct dsa_switch *ds, int port)
+diff --git a/drivers/net/dsa/rzn1_a5psw.h b/drivers/net/dsa/rzn1_a5psw.h
+index b4fbf453ff741..b869192eef3f7 100644
+--- a/drivers/net/dsa/rzn1_a5psw.h
++++ b/drivers/net/dsa/rzn1_a5psw.h
+@@ -19,6 +19,7 @@
+ #define A5PSW_PORT_OFFSET(port)               (0x400 * (port))
+ #define A5PSW_PORT_ENA                        0x8
++#define A5PSW_PORT_ENA_TX(port)               BIT(port)
+ #define A5PSW_PORT_ENA_RX_SHIFT               16
+ #define A5PSW_PORT_ENA_TX_RX(port)    (BIT((port) + A5PSW_PORT_ENA_RX_SHIFT) | \
+                                        BIT(port))
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-fec-better-handle-pm_runtime_get-failing-in-.rem.patch b/queue-6.3/net-fec-better-handle-pm_runtime_get-failing-in-.rem.patch
new file mode 100644 (file)
index 0000000..1b2fb13
--- /dev/null
@@ -0,0 +1,67 @@
+From 699a87dbcb447ccd12a0c0a0fd3d0462d90f1f4c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 May 2023 22:00:20 +0200
+Subject: net: fec: Better handle pm_runtime_get() failing in .remove()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
+
+[ Upstream commit f816b9829b19394d318e01953aa3b2721bca040d ]
+
+In the (unlikely) event that pm_runtime_get() (disguised as
+pm_runtime_resume_and_get()) fails, the remove callback returned an
+error early. The problem with this is that the driver core ignores the
+error value and continues removing the device. This results in a
+resource leak. Worse the devm allocated resources are freed and so if a
+callback of the driver is called later the register mapping is already
+gone which probably results in a crash.
+
+Fixes: a31eda65ba21 ("net: fec: fix clock count mis-match")
+Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Link: https://lore.kernel.org/r/20230510200020.1534610-1-u.kleine-koenig@pengutronix.de
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/freescale/fec_main.c | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
+index 42ec6ca3bf035..241df41d500f1 100644
+--- a/drivers/net/ethernet/freescale/fec_main.c
++++ b/drivers/net/ethernet/freescale/fec_main.c
+@@ -4478,9 +4478,11 @@ fec_drv_remove(struct platform_device *pdev)
+       struct device_node *np = pdev->dev.of_node;
+       int ret;
+-      ret = pm_runtime_resume_and_get(&pdev->dev);
++      ret = pm_runtime_get_sync(&pdev->dev);
+       if (ret < 0)
+-              return ret;
++              dev_err(&pdev->dev,
++                      "Failed to resume device in remove callback (%pe)\n",
++                      ERR_PTR(ret));
+       cancel_work_sync(&fep->tx_timeout_work);
+       fec_ptp_stop(pdev);
+@@ -4493,8 +4495,13 @@ fec_drv_remove(struct platform_device *pdev)
+               of_phy_deregister_fixed_link(np);
+       of_node_put(fep->phy_node);
+-      clk_disable_unprepare(fep->clk_ahb);
+-      clk_disable_unprepare(fep->clk_ipg);
++      /* After pm_runtime_get_sync() failed, the clks are still off, so skip
++       * disabling them again.
++       */
++      if (ret >= 0) {
++              clk_disable_unprepare(fep->clk_ahb);
++              clk_disable_unprepare(fep->clk_ipg);
++      }
+       pm_runtime_put_noidle(&pdev->dev);
+       pm_runtime_disable(&pdev->dev);
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-fec-remove-the-xdp_return_frame-when-lack-of-tx-.patch b/queue-6.3/net-fec-remove-the-xdp_return_frame-when-lack-of-tx-.patch
new file mode 100644 (file)
index 0000000..6146904
--- /dev/null
@@ -0,0 +1,37 @@
+From 04cf26e8e6dfc54aeb16f16c74443eec6b79d495 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 May 2023 08:38:43 -0500
+Subject: net: fec: remove the xdp_return_frame when lack of tx BDs
+
+From: Shenwei Wang <shenwei.wang@nxp.com>
+
+[ Upstream commit 6ead9c98cafcbc6992cf35f0ca393df2c03e3316 ]
+
+In the implementation, the sent_frame count does not increment when
+transmit errors occur. Therefore, bq_xmit_all() will take care of
+returning the XDP frames.
+
+Fixes: 26312c685ae0 ("net: fec: correct the counting of XDP sent frames")
+Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com>
+Reviewed-by: Horatiu Vultur <horatiu.vultur@microchip.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/freescale/fec_main.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
+index 241df41d500f1..577d94821b3e7 100644
+--- a/drivers/net/ethernet/freescale/fec_main.c
++++ b/drivers/net/ethernet/freescale/fec_main.c
+@@ -3798,7 +3798,6 @@ static int fec_enet_txq_xmit_frame(struct fec_enet_private *fep,
+       entries_free = fec_enet_get_free_txdesc_num(txq);
+       if (entries_free < MAX_SKB_FRAGS + 1) {
+               netdev_err(fep->netdev, "NOT enough BD for SG!\n");
+-              xdp_return_frame(frame);
+               return NETDEV_TX_BUSY;
+       }
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-hns3-fix-output-information-incomplete-for-dumpi.patch b/queue-6.3/net-hns3-fix-output-information-incomplete-for-dumpi.patch
new file mode 100644 (file)
index 0000000..da7c009
--- /dev/null
@@ -0,0 +1,54 @@
+From d5a650461bbbd95e2ae7b7175f9237b703d4bb35 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 May 2023 18:00:11 +0800
+Subject: net: hns3: fix output information incomplete for dumping tx queue
+ info with debugfs
+
+From: Jie Wang <wangjie125@huawei.com>
+
+[ Upstream commit 89f6bfb071182f05d7188c255b0e7251c3806f16 ]
+
+In function hns3_dump_tx_queue_info, The print buffer is not enough when
+the tx BD number is configured to 32760. As a result several BD
+information wouldn't be displayed.
+
+So fix it by increasing the tx queue print buffer length.
+
+Fixes: 630a6738da82 ("net: hns3: adjust string spaces of some parameters of tx bd info in debugfs")
+Signed-off-by: Jie Wang <wangjie125@huawei.com>
+Signed-off-by: Hao Lan <lanhao@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c | 2 +-
+ drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.h | 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
+index 66feb23f7b7b6..bcccd82a2620f 100644
+--- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
++++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
+@@ -130,7 +130,7 @@ static struct hns3_dbg_cmd_info hns3_dbg_cmd[] = {
+               .name = "tx_bd_queue",
+               .cmd = HNAE3_DBG_CMD_TX_BD,
+               .dentry = HNS3_DBG_DENTRY_TX_BD,
+-              .buf_len = HNS3_DBG_READ_LEN_4MB,
++              .buf_len = HNS3_DBG_READ_LEN_5MB,
+               .init = hns3_dbg_bd_file_init,
+       },
+       {
+diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.h b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.h
+index 97578eabb7d8b..4a5ef8a90a104 100644
+--- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.h
++++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.h
+@@ -10,6 +10,7 @@
+ #define HNS3_DBG_READ_LEN_128KB       0x20000
+ #define HNS3_DBG_READ_LEN_1MB 0x100000
+ #define HNS3_DBG_READ_LEN_4MB 0x400000
++#define HNS3_DBG_READ_LEN_5MB 0x500000
+ #define HNS3_DBG_WRITE_LEN    1024
+ #define HNS3_DBG_DATA_STR_LEN 32
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-hns3-fix-reset-delay-time-to-avoid-configuration.patch b/queue-6.3/net-hns3-fix-reset-delay-time-to-avoid-configuration.patch
new file mode 100644 (file)
index 0000000..ef3000d
--- /dev/null
@@ -0,0 +1,44 @@
+From 88580203dea73cf5615132a6e7e21cace9e96c19 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 May 2023 18:00:13 +0800
+Subject: net: hns3: fix reset delay time to avoid configuration timeout
+
+From: Jie Wang <wangjie125@huawei.com>
+
+[ Upstream commit 814d0c786068e858d889ada3153bff82f64223ad ]
+
+Currently the hns3 vf function reset delays 5000ms before vf rebuild
+process. In product applications, this delay is too long for application
+configurations and causes configuration timeout.
+
+According to the tests, 500ms delay is enough for reset process except PF
+FLR. So this patch modifies delay to 500ms in these scenarios.
+
+Fixes: 6988eb2a9b77 ("net: hns3: Add support to reset the enet/ring mgmt layer")
+Signed-off-by: Jie Wang <wangjie125@huawei.com>
+Signed-off-by: Hao Lan <lanhao@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
+index e84e5be8e59ed..b1b14850e958f 100644
+--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
++++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
+@@ -1436,7 +1436,10 @@ static int hclgevf_reset_wait(struct hclgevf_dev *hdev)
+        * might happen in case reset assertion was made by PF. Yes, this also
+        * means we might end up waiting bit more even for VF reset.
+        */
+-      msleep(5000);
++      if (hdev->reset_type == HNAE3_VF_FULL_RESET)
++              msleep(5000);
++      else
++              msleep(500);
+       return 0;
+ }
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-hns3-fix-reset-timeout-when-enable-full-vf.patch b/queue-6.3/net-hns3-fix-reset-timeout-when-enable-full-vf.patch
new file mode 100644 (file)
index 0000000..23d3b0b
--- /dev/null
@@ -0,0 +1,111 @@
+From 4e049415c399e05e8b302928fb2692c89bca6d34 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 May 2023 18:00:14 +0800
+Subject: net: hns3: fix reset timeout when enable full VF
+
+From: Jijie Shao <shaojijie@huawei.com>
+
+[ Upstream commit 6b45d5ff8c2c61baddd67d7510075ae121c5e704 ]
+
+The timeout of the cmdq reset command has been increased to
+resolve the reset timeout issue in the full VF scenario.
+The timeout of other cmdq commands remains unchanged.
+
+Fixes: 8d307f8e8cf1 ("net: hns3: create new set of unified hclge_comm_cmd_send APIs")
+Signed-off-by: Jijie Shao <shaojijie@huawei.com>
+Signed-off-by: Hao Lan <lanhao@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../hns3/hns3_common/hclge_comm_cmd.c         | 25 ++++++++++++++++---
+ .../hns3/hns3_common/hclge_comm_cmd.h         |  8 +++++-
+ 2 files changed, 28 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c
+index f671a63cecde4..c797d54f98caa 100644
+--- a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c
++++ b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c
+@@ -330,9 +330,25 @@ static int hclge_comm_cmd_csq_done(struct hclge_comm_hw *hw)
+       return head == hw->cmq.csq.next_to_use;
+ }
+-static void hclge_comm_wait_for_resp(struct hclge_comm_hw *hw,
++static u32 hclge_get_cmdq_tx_timeout(u16 opcode, u32 tx_timeout)
++{
++      static const struct hclge_cmdq_tx_timeout_map cmdq_tx_timeout_map[] = {
++              {HCLGE_OPC_CFG_RST_TRIGGER, HCLGE_COMM_CMDQ_TX_TIMEOUT_500MS},
++      };
++      u32 i;
++
++      for (i = 0; i < ARRAY_SIZE(cmdq_tx_timeout_map); i++)
++              if (cmdq_tx_timeout_map[i].opcode == opcode)
++                      return cmdq_tx_timeout_map[i].tx_timeout;
++
++      return tx_timeout;
++}
++
++static void hclge_comm_wait_for_resp(struct hclge_comm_hw *hw, u16 opcode,
+                                    bool *is_completed)
+ {
++      u32 cmdq_tx_timeout = hclge_get_cmdq_tx_timeout(opcode,
++                                                      hw->cmq.tx_timeout);
+       u32 timeout = 0;
+       do {
+@@ -342,7 +358,7 @@ static void hclge_comm_wait_for_resp(struct hclge_comm_hw *hw,
+               }
+               udelay(1);
+               timeout++;
+-      } while (timeout < hw->cmq.tx_timeout);
++      } while (timeout < cmdq_tx_timeout);
+ }
+ static int hclge_comm_cmd_convert_err_code(u16 desc_ret)
+@@ -406,7 +422,8 @@ static int hclge_comm_cmd_check_result(struct hclge_comm_hw *hw,
+        * if multi descriptors to be sent, use the first one to check
+        */
+       if (HCLGE_COMM_SEND_SYNC(le16_to_cpu(desc->flag)))
+-              hclge_comm_wait_for_resp(hw, &is_completed);
++              hclge_comm_wait_for_resp(hw, le16_to_cpu(desc->opcode),
++                                       &is_completed);
+       if (!is_completed)
+               ret = -EBADE;
+@@ -528,7 +545,7 @@ int hclge_comm_cmd_queue_init(struct pci_dev *pdev, struct hclge_comm_hw *hw)
+       cmdq->crq.desc_num = HCLGE_COMM_NIC_CMQ_DESC_NUM;
+       /* Setup Tx write back timeout */
+-      cmdq->tx_timeout = HCLGE_COMM_CMDQ_TX_TIMEOUT;
++      cmdq->tx_timeout = HCLGE_COMM_CMDQ_TX_TIMEOUT_DEFAULT;
+       /* Setup queue rings */
+       ret = hclge_comm_alloc_cmd_queue(hw, HCLGE_COMM_TYPE_CSQ);
+diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h
+index b1f9383b418f4..2b2928c6dccfc 100644
+--- a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h
++++ b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h
+@@ -54,7 +54,8 @@
+ #define HCLGE_COMM_NIC_SW_RST_RDY             BIT(HCLGE_COMM_NIC_SW_RST_RDY_B)
+ #define HCLGE_COMM_NIC_CMQ_DESC_NUM_S         3
+ #define HCLGE_COMM_NIC_CMQ_DESC_NUM           1024
+-#define HCLGE_COMM_CMDQ_TX_TIMEOUT            30000
++#define HCLGE_COMM_CMDQ_TX_TIMEOUT_DEFAULT    30000
++#define HCLGE_COMM_CMDQ_TX_TIMEOUT_500MS      500000
+ enum hclge_opcode_type {
+       /* Generic commands */
+@@ -357,6 +358,11 @@ struct hclge_comm_caps_bit_map {
+       u16 local_bit;
+ };
++struct hclge_cmdq_tx_timeout_map {
++      u32 opcode;
++      u32 tx_timeout;
++};
++
+ struct hclge_comm_firmware_compat_cmd {
+       __le32 compat;
+       u8 rsv[20];
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-hns3-fix-sending-pfc-frames-after-reset-issue.patch b/queue-6.3/net-hns3-fix-sending-pfc-frames-after-reset-issue.patch
new file mode 100644 (file)
index 0000000..9c78e27
--- /dev/null
@@ -0,0 +1,91 @@
+From ab730a1901f0eda33c5186ec5288327d74e52e54 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 May 2023 18:00:12 +0800
+Subject: net: hns3: fix sending pfc frames after reset issue
+
+From: Jijie Shao <shaojijie@huawei.com>
+
+[ Upstream commit f14db07064727dd3bc0906c77a6d2759c1bbb395 ]
+
+To prevent the system from abnormally sending PFC frames after an
+abnormal reset. The hns3 driver notifies the firmware to disable pfc
+before reset.
+
+Fixes: 35d93a30040c ("net: hns3: adjust the process of PF reset")
+Signed-off-by: Jijie Shao <shaojijie@huawei.com>
+Signed-off-by: Hao Lan <lanhao@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../ethernet/hisilicon/hns3/hns3pf/hclge_main.c   | 15 +++++++++------
+ .../net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c |  4 ++--
+ .../net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h |  5 +++++
+ 3 files changed, 16 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
+index 07ad5f35219e2..50e956d6c3b25 100644
+--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
+@@ -8053,12 +8053,15 @@ static void hclge_ae_stop(struct hnae3_handle *handle)
+       /* If it is not PF reset or FLR, the firmware will disable the MAC,
+        * so it only need to stop phy here.
+        */
+-      if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) &&
+-          hdev->reset_type != HNAE3_FUNC_RESET &&
+-          hdev->reset_type != HNAE3_FLR_RESET) {
+-              hclge_mac_stop_phy(hdev);
+-              hclge_update_link_status(hdev);
+-              return;
++      if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state)) {
++              hclge_pfc_pause_en_cfg(hdev, HCLGE_PFC_TX_RX_DISABLE,
++                                     HCLGE_PFC_DISABLE);
++              if (hdev->reset_type != HNAE3_FUNC_RESET &&
++                  hdev->reset_type != HNAE3_FLR_RESET) {
++                      hclge_mac_stop_phy(hdev);
++                      hclge_update_link_status(hdev);
++                      return;
++              }
+       }
+       hclge_reset_tqp(handle);
+diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
+index 4a33f65190e2b..922c0da3660c7 100644
+--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
+@@ -171,8 +171,8 @@ int hclge_mac_pause_en_cfg(struct hclge_dev *hdev, bool tx, bool rx)
+       return hclge_cmd_send(&hdev->hw, &desc, 1);
+ }
+-static int hclge_pfc_pause_en_cfg(struct hclge_dev *hdev, u8 tx_rx_bitmap,
+-                                u8 pfc_bitmap)
++int hclge_pfc_pause_en_cfg(struct hclge_dev *hdev, u8 tx_rx_bitmap,
++                         u8 pfc_bitmap)
+ {
+       struct hclge_desc desc;
+       struct hclge_pfc_en_cmd *pfc = (struct hclge_pfc_en_cmd *)desc.data;
+diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
+index 68f28a98e380b..dd6f1fd486cf2 100644
+--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
+@@ -164,6 +164,9 @@ struct hclge_bp_to_qs_map_cmd {
+       u32 rsvd1;
+ };
++#define HCLGE_PFC_DISABLE     0
++#define HCLGE_PFC_TX_RX_DISABLE       0
++
+ struct hclge_pfc_en_cmd {
+       u8 tx_rx_en_bitmap;
+       u8 pri_en_bitmap;
+@@ -235,6 +238,8 @@ void hclge_tm_schd_info_update(struct hclge_dev *hdev, u8 num_tc);
+ void hclge_tm_pfc_info_update(struct hclge_dev *hdev);
+ int hclge_tm_dwrr_cfg(struct hclge_dev *hdev);
+ int hclge_tm_init_hw(struct hclge_dev *hdev, bool init);
++int hclge_pfc_pause_en_cfg(struct hclge_dev *hdev, u8 tx_rx_bitmap,
++                         u8 pfc_bitmap);
+ int hclge_mac_pause_en_cfg(struct hclge_dev *hdev, bool tx, bool rx);
+ int hclge_pause_addr_cfg(struct hclge_dev *hdev, const u8 *mac_addr);
+ void hclge_pfc_rx_stats_get(struct hclge_dev *hdev, u64 *stats);
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-nsh-use-correct-mac_offset-to-unwind-gso-skb-in-.patch b/queue-6.3/net-nsh-use-correct-mac_offset-to-unwind-gso-skb-in-.patch
new file mode 100644 (file)
index 0000000..a0ad006
--- /dev/null
@@ -0,0 +1,101 @@
+From 6066ba11ce735426b237933447857b375facc631 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 May 2023 20:54:40 +0800
+Subject: net: nsh: Use correct mac_offset to unwind gso skb in
+ nsh_gso_segment()
+
+From: Dong Chenchen <dongchenchen2@huawei.com>
+
+[ Upstream commit c83b49383b595be50647f0c764a48c78b5f3c4f8 ]
+
+As the call trace shows, skb_panic was caused by wrong skb->mac_header
+in nsh_gso_segment():
+
+invalid opcode: 0000 [#1] PREEMPT SMP KASAN PTI
+CPU: 3 PID: 2737 Comm: syz Not tainted 6.3.0-next-20230505 #1
+RIP: 0010:skb_panic+0xda/0xe0
+call Trace:
+ skb_push+0x91/0xa0
+ nsh_gso_segment+0x4f3/0x570
+ skb_mac_gso_segment+0x19e/0x270
+ __skb_gso_segment+0x1e8/0x3c0
+ validate_xmit_skb+0x452/0x890
+ validate_xmit_skb_list+0x99/0xd0
+ sch_direct_xmit+0x294/0x7c0
+ __dev_queue_xmit+0x16f0/0x1d70
+ packet_xmit+0x185/0x210
+ packet_snd+0xc15/0x1170
+ packet_sendmsg+0x7b/0xa0
+ sock_sendmsg+0x14f/0x160
+
+The root cause is:
+nsh_gso_segment() use skb->network_header - nhoff to reset mac_header
+in skb_gso_error_unwind() if inner-layer protocol gso fails.
+However, skb->network_header may be reset by inner-layer protocol
+gso function e.g. mpls_gso_segment. skb->mac_header reset by the
+inaccurate network_header will be larger than skb headroom.
+
+nsh_gso_segment
+    nhoff = skb->network_header - skb->mac_header;
+    __skb_pull(skb,nsh_len)
+    skb_mac_gso_segment
+        mpls_gso_segment
+            skb_reset_network_header(skb);//skb->network_header+=nsh_len
+            return -EINVAL;
+    skb_gso_error_unwind
+        skb_push(skb, nsh_len);
+        skb->mac_header = skb->network_header - nhoff;
+        // skb->mac_header > skb->headroom, cause skb_push panic
+
+Use correct mac_offset to restore mac_header and get rid of nhoff.
+
+Fixes: c411ed854584 ("nsh: add GSO support")
+Reported-by: syzbot+632b5d9964208bfef8c0@syzkaller.appspotmail.com
+Suggested-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: Dong Chenchen <dongchenchen2@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/nsh/nsh.c | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+diff --git a/net/nsh/nsh.c b/net/nsh/nsh.c
+index e9ca007718b7e..0f23e5e8e03eb 100644
+--- a/net/nsh/nsh.c
++++ b/net/nsh/nsh.c
+@@ -77,13 +77,12 @@ static struct sk_buff *nsh_gso_segment(struct sk_buff *skb,
+                                      netdev_features_t features)
+ {
+       struct sk_buff *segs = ERR_PTR(-EINVAL);
++      u16 mac_offset = skb->mac_header;
+       unsigned int nsh_len, mac_len;
+       __be16 proto;
+-      int nhoff;
+       skb_reset_network_header(skb);
+-      nhoff = skb->network_header - skb->mac_header;
+       mac_len = skb->mac_len;
+       if (unlikely(!pskb_may_pull(skb, NSH_BASE_HDR_LEN)))
+@@ -108,15 +107,14 @@ static struct sk_buff *nsh_gso_segment(struct sk_buff *skb,
+       segs = skb_mac_gso_segment(skb, features);
+       if (IS_ERR_OR_NULL(segs)) {
+               skb_gso_error_unwind(skb, htons(ETH_P_NSH), nsh_len,
+-                                   skb->network_header - nhoff,
+-                                   mac_len);
++                                   mac_offset, mac_len);
+               goto out;
+       }
+       for (skb = segs; skb; skb = skb->next) {
+               skb->protocol = htons(ETH_P_NSH);
+               __skb_push(skb, nsh_len);
+-              skb_set_mac_header(skb, -nhoff);
++              skb->mac_header = mac_offset;
+               skb->network_header = skb->mac_header + mac_len;
+               skb->mac_len = mac_len;
+       }
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-pcs-xpcs-fix-c73-an-not-getting-enabled.patch b/queue-6.3/net-pcs-xpcs-fix-c73-an-not-getting-enabled.patch
new file mode 100644 (file)
index 0000000..c8c93d9
--- /dev/null
@@ -0,0 +1,46 @@
+From ac3a6ef238e3fca100424d8a22bef757f39c3721 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 16 May 2023 18:44:10 +0300
+Subject: net: pcs: xpcs: fix C73 AN not getting enabled
+
+From: Vladimir Oltean <vladimir.oltean@nxp.com>
+
+[ Upstream commit c46e78ba9a7a09da4f192dc8df15c4e8a07fb9e0 ]
+
+The XPCS expects clause 73 (copper backplane) autoneg to follow the
+ethtool autoneg bit. It actually did that until the blamed
+commit inaptly replaced state->an_enabled (coming from ethtool) with
+phylink_autoneg_inband() (coming from the device tree or struct
+phylink_config), as part of an unrelated phylink_pcs API conversion.
+
+Russell King suggests that state->an_enabled from the original code was
+just a proxy for the ethtool Autoneg bit, and that the correct way of
+restoring the functionality is to check for this bit in the advertising
+mask.
+
+Fixes: 11059740e616 ("net: pcs: xpcs: convert to phylink_pcs_ops")
+Link: https://lore.kernel.org/netdev/ZGNt2MFeRolKGFck@shell.armlinux.org.uk/
+Suggested-by: Russell King (Oracle) <linux@armlinux.org.uk>
+Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/pcs/pcs-xpcs.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/pcs/pcs-xpcs.c b/drivers/net/pcs/pcs-xpcs.c
+index 04a6853530418..2b84a46622be4 100644
+--- a/drivers/net/pcs/pcs-xpcs.c
++++ b/drivers/net/pcs/pcs-xpcs.c
+@@ -873,7 +873,7 @@ int xpcs_do_config(struct dw_xpcs *xpcs, phy_interface_t interface,
+       switch (compat->an_mode) {
+       case DW_AN_C73:
+-              if (phylink_autoneg_inband(mode)) {
++              if (test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, advertising)) {
+                       ret = xpcs_config_aneg_c73(xpcs, compat);
+                       if (ret)
+                               return ret;
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-phy-dp83867-add-w-a-for-packet-errors-seen-with-.patch b/queue-6.3/net-phy-dp83867-add-w-a-for-packet-errors-seen-with-.patch
new file mode 100644 (file)
index 0000000..17e6a09
--- /dev/null
@@ -0,0 +1,77 @@
+From 4e6d9d58153c7bb80c8c5d556bb92b527c40453d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 May 2023 18:21:39 +0530
+Subject: net: phy: dp83867: add w/a for packet errors seen with short cables
+
+From: Grygorii Strashko <grygorii.strashko@ti.com>
+
+[ Upstream commit 0b01db274028f5acd207332686ffc92ac77491ac ]
+
+Introduce the W/A for packet errors seen with short cables (<1m) between
+two DP83867 PHYs.
+
+The W/A recommended by DM requires FFE Equalizer Configuration tuning by
+writing value 0x0E81 to DSP_FFE_CFG register (0x012C), surrounded by hard
+and soft resets as follows:
+
+write_reg(0x001F, 0x8000); //hard reset
+write_reg(DSP_FFE_CFG, 0x0E81);
+write_reg(0x001F, 0x4000); //soft reset
+
+Since  DP83867 PHY DM says "Changing this register to 0x0E81, will not
+affect Long Cable performance.", enable the W/A by default.
+
+Fixes: 2a10154abcb7 ("net: phy: dp83867: Add TI dp83867 phy")
+Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
+Signed-off-by: Siddharth Vadapalli <s-vadapalli@ti.com>
+Reviewed-by: Simon Horman <simon.horman@corigine.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/dp83867.c | 22 +++++++++++++++++++++-
+ 1 file changed, 21 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/phy/dp83867.c b/drivers/net/phy/dp83867.c
+index 89cd821f1f466..9f7ff88200484 100644
+--- a/drivers/net/phy/dp83867.c
++++ b/drivers/net/phy/dp83867.c
+@@ -42,6 +42,7 @@
+ #define DP83867_STRAP_STS1    0x006E
+ #define DP83867_STRAP_STS2    0x006f
+ #define DP83867_RGMIIDCTL     0x0086
++#define DP83867_DSP_FFE_CFG   0x012c
+ #define DP83867_RXFCFG                0x0134
+ #define DP83867_RXFPMD1       0x0136
+ #define DP83867_RXFPMD2       0x0137
+@@ -910,8 +911,27 @@ static int dp83867_phy_reset(struct phy_device *phydev)
+       usleep_range(10, 20);
+-      return phy_modify(phydev, MII_DP83867_PHYCTRL,
++      err = phy_modify(phydev, MII_DP83867_PHYCTRL,
+                        DP83867_PHYCR_FORCE_LINK_GOOD, 0);
++      if (err < 0)
++              return err;
++
++      /* Configure the DSP Feedforward Equalizer Configuration register to
++       * improve short cable (< 1 meter) performance. This will not affect
++       * long cable performance.
++       */
++      err = phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_DSP_FFE_CFG,
++                          0x0e81);
++      if (err < 0)
++              return err;
++
++      err = phy_write(phydev, DP83867_CTRL, DP83867_SW_RESTART);
++      if (err < 0)
++              return err;
++
++      usleep_range(10, 20);
++
++      return 0;
+ }
+ static void dp83867_link_change_notify(struct phy_device *phydev)
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-selftests-fix-optstring.patch b/queue-6.3/net-selftests-fix-optstring.patch
new file mode 100644 (file)
index 0000000..a53135b
--- /dev/null
@@ -0,0 +1,41 @@
+From c37e10c50f9c945333b310a3b44089b9d4f95d93 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 16 May 2023 14:49:24 -0400
+Subject: net: selftests: Fix optstring
+
+From: Benjamin Poirier <bpoirier@nvidia.com>
+
+[ Upstream commit 9ba9485b87ac97fd159abdb4cbd53099bc9f01c6 ]
+
+The cited commit added a stray colon to the 'v' option. That makes the
+option work incorrectly.
+
+ex:
+tools/testing/selftests/net# ./fib_nexthops.sh -v
+(should enable verbose mode, instead it shows help text due to missing arg)
+
+Fixes: 5feba4727395 ("selftests: fib_nexthops: Make ping timeout configurable")
+Reviewed-by: Ido Schimmel <idosch@nvidia.com>
+Signed-off-by: Benjamin Poirier <bpoirier@nvidia.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/fib_nexthops.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tools/testing/selftests/net/fib_nexthops.sh b/tools/testing/selftests/net/fib_nexthops.sh
+index a47b26ab48f23..0f5e88c8f4ffe 100755
+--- a/tools/testing/selftests/net/fib_nexthops.sh
++++ b/tools/testing/selftests/net/fib_nexthops.sh
+@@ -2283,7 +2283,7 @@ EOF
+ ################################################################################
+ # main
+-while getopts :t:pP46hv:w: o
++while getopts :t:pP46hvw: o
+ do
+       case $o in
+               t) TESTS=$OPTARG;;
+-- 
+2.39.2
+
diff --git a/queue-6.3/net-wwan-iosm-fix-null-pointer-dereference-when-remo.patch b/queue-6.3/net-wwan-iosm-fix-null-pointer-dereference-when-remo.patch
new file mode 100644 (file)
index 0000000..7e4362f
--- /dev/null
@@ -0,0 +1,154 @@
+From 06b9893fea540933be86d0224be6eb1ada9633f1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 16 May 2023 21:09:46 +0530
+Subject: net: wwan: iosm: fix NULL pointer dereference when removing device
+
+From: M Chetan Kumar <m.chetan.kumar@linux.intel.com>
+
+[ Upstream commit 60829145f1e2650b31ebe6a0ec70a9725b38fa2c ]
+
+In suspend and resume cycle, the removal and rescan of device ends
+up in NULL pointer dereference.
+
+During driver initialization, if the ipc_imem_wwan_channel_init()
+fails to get the valid device capabilities it returns an error and
+further no resource (wwan struct) will be allocated. Now in this
+situation if driver removal procedure is initiated it would result
+in NULL pointer exception since unallocated wwan struct is dereferenced
+inside ipc_wwan_deinit().
+
+ipc_imem_run_state_worker() to handle the called functions return value
+and to release the resource in failure case. It also reports the link
+down event in failure cases. The user space application can handle this
+event to do a device reset for restoring the device communication.
+
+Fixes: 3670970dd8c6 ("net: iosm: shared memory IPC interface")
+Reported-by: Samuel Wein PhD <sam@samwein.com>
+Closes: https://lore.kernel.org/netdev/20230427140819.1310f4bd@kernel.org/T/
+Signed-off-by: M Chetan Kumar <m.chetan.kumar@linux.intel.com>
+Reviewed-by: Simon Horman <simon.horman@corigine.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wwan/iosm/iosm_ipc_imem.c     | 27 ++++++++++++++++++-----
+ drivers/net/wwan/iosm/iosm_ipc_imem_ops.c | 12 ++++++----
+ drivers/net/wwan/iosm/iosm_ipc_imem_ops.h |  6 +++--
+ 3 files changed, 33 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/net/wwan/iosm/iosm_ipc_imem.c b/drivers/net/wwan/iosm/iosm_ipc_imem.c
+index c066b0040a3fe..829515a601b37 100644
+--- a/drivers/net/wwan/iosm/iosm_ipc_imem.c
++++ b/drivers/net/wwan/iosm/iosm_ipc_imem.c
+@@ -565,24 +565,32 @@ static void ipc_imem_run_state_worker(struct work_struct *instance)
+       struct ipc_mux_config mux_cfg;
+       struct iosm_imem *ipc_imem;
+       u8 ctrl_chl_idx = 0;
++      int ret;
+       ipc_imem = container_of(instance, struct iosm_imem, run_state_worker);
+       if (ipc_imem->phase != IPC_P_RUN) {
+               dev_err(ipc_imem->dev,
+                       "Modem link down. Exit run state worker.");
+-              return;
++              goto err_out;
+       }
+       if (test_and_clear_bit(IOSM_DEVLINK_INIT, &ipc_imem->flag))
+               ipc_devlink_deinit(ipc_imem->ipc_devlink);
+-      if (!ipc_imem_setup_cp_mux_cap_init(ipc_imem, &mux_cfg))
+-              ipc_imem->mux = ipc_mux_init(&mux_cfg, ipc_imem);
++      ret = ipc_imem_setup_cp_mux_cap_init(ipc_imem, &mux_cfg);
++      if (ret < 0)
++              goto err_out;
++
++      ipc_imem->mux = ipc_mux_init(&mux_cfg, ipc_imem);
++      if (!ipc_imem->mux)
++              goto err_out;
++
++      ret = ipc_imem_wwan_channel_init(ipc_imem, mux_cfg.protocol);
++      if (ret < 0)
++              goto err_ipc_mux_deinit;
+-      ipc_imem_wwan_channel_init(ipc_imem, mux_cfg.protocol);
+-      if (ipc_imem->mux)
+-              ipc_imem->mux->wwan = ipc_imem->wwan;
++      ipc_imem->mux->wwan = ipc_imem->wwan;
+       while (ctrl_chl_idx < IPC_MEM_MAX_CHANNELS) {
+               if (!ipc_chnl_cfg_get(&chnl_cfg_port, ctrl_chl_idx)) {
+@@ -622,6 +630,13 @@ static void ipc_imem_run_state_worker(struct work_struct *instance)
+       /* Complete all memory stores after setting bit */
+       smp_mb__after_atomic();
++
++      return;
++
++err_ipc_mux_deinit:
++      ipc_mux_deinit(ipc_imem->mux);
++err_out:
++      ipc_uevent_send(ipc_imem->dev, UEVENT_CD_READY_LINK_DOWN);
+ }
+ static void ipc_imem_handle_irq(struct iosm_imem *ipc_imem, int irq)
+diff --git a/drivers/net/wwan/iosm/iosm_ipc_imem_ops.c b/drivers/net/wwan/iosm/iosm_ipc_imem_ops.c
+index 66b90cc4c3460..109cf89304888 100644
+--- a/drivers/net/wwan/iosm/iosm_ipc_imem_ops.c
++++ b/drivers/net/wwan/iosm/iosm_ipc_imem_ops.c
+@@ -77,8 +77,8 @@ int ipc_imem_sys_wwan_transmit(struct iosm_imem *ipc_imem,
+ }
+ /* Initialize wwan channel */
+-void ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem,
+-                              enum ipc_mux_protocol mux_type)
++int ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem,
++                             enum ipc_mux_protocol mux_type)
+ {
+       struct ipc_chnl_cfg chnl_cfg = { 0 };
+@@ -87,7 +87,7 @@ void ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem,
+       /* If modem version is invalid (0xffffffff), do not initialize WWAN. */
+       if (ipc_imem->cp_version == -1) {
+               dev_err(ipc_imem->dev, "invalid CP version");
+-              return;
++              return -EIO;
+       }
+       ipc_chnl_cfg_get(&chnl_cfg, ipc_imem->nr_of_channels);
+@@ -104,9 +104,13 @@ void ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem,
+       /* WWAN registration. */
+       ipc_imem->wwan = ipc_wwan_init(ipc_imem, ipc_imem->dev);
+-      if (!ipc_imem->wwan)
++      if (!ipc_imem->wwan) {
+               dev_err(ipc_imem->dev,
+                       "failed to register the ipc_wwan interfaces");
++              return -ENOMEM;
++      }
++
++      return 0;
+ }
+ /* Map SKB to DMA for transfer */
+diff --git a/drivers/net/wwan/iosm/iosm_ipc_imem_ops.h b/drivers/net/wwan/iosm/iosm_ipc_imem_ops.h
+index f8afb217d9e2f..026c5bd0f9992 100644
+--- a/drivers/net/wwan/iosm/iosm_ipc_imem_ops.h
++++ b/drivers/net/wwan/iosm/iosm_ipc_imem_ops.h
+@@ -91,9 +91,11 @@ int ipc_imem_sys_wwan_transmit(struct iosm_imem *ipc_imem, int if_id,
+  *                            MUX.
+  * @ipc_imem:         Pointer to iosm_imem struct.
+  * @mux_type:         Type of mux protocol.
++ *
++ * Return: 0 on success and failure value on error
+  */
+-void ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem,
+-                              enum ipc_mux_protocol mux_type);
++int ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem,
++                             enum ipc_mux_protocol mux_type);
+ /**
+  * ipc_imem_sys_devlink_open - Open a Flash/CD Channel link to CP
+-- 
+2.39.2
+
diff --git a/queue-6.3/netfilter-nf_tables-fix-nft_trans-type-confusion.patch b/queue-6.3/netfilter-nf_tables-fix-nft_trans-type-confusion.patch
new file mode 100644 (file)
index 0000000..0106a58
--- /dev/null
@@ -0,0 +1,43 @@
+From 1cc27a119cd48e9d537d1b884adf8a69e8acf918 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 May 2023 14:15:15 +0200
+Subject: netfilter: nf_tables: fix nft_trans type confusion
+
+From: Florian Westphal <fw@strlen.de>
+
+[ Upstream commit e3c361b8acd636f5fe80c02849ca175201edf10c ]
+
+nft_trans_FOO objects all share a common nft_trans base structure, but
+trailing fields depend on the real object size. Access is only safe after
+trans->msg_type check.
+
+Check for rule type first.  Found by code inspection.
+
+Fixes: 1a94e38d254b ("netfilter: nf_tables: add NFTA_RULE_ID attribute")
+Signed-off-by: Florian Westphal <fw@strlen.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/netfilter/nf_tables_api.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
+index 45f701fd86f06..ef80504c3ccd2 100644
+--- a/net/netfilter/nf_tables_api.c
++++ b/net/netfilter/nf_tables_api.c
+@@ -3802,12 +3802,10 @@ static struct nft_rule *nft_rule_lookup_byid(const struct net *net,
+       struct nft_trans *trans;
+       list_for_each_entry(trans, &nft_net->commit_list, list) {
+-              struct nft_rule *rule = nft_trans_rule(trans);
+-
+               if (trans->msg_type == NFT_MSG_NEWRULE &&
+                   trans->ctx.chain == chain &&
+                   id == nft_trans_rule_id(trans))
+-                      return rule;
++                      return nft_trans_rule(trans);
+       }
+       return ERR_PTR(-ENOENT);
+ }
+-- 
+2.39.2
+
diff --git a/queue-6.3/netfilter-nft_set_rbtree-fix-null-deref-on-element-i.patch b/queue-6.3/netfilter-nft_set_rbtree-fix-null-deref-on-element-i.patch
new file mode 100644 (file)
index 0000000..25cea83
--- /dev/null
@@ -0,0 +1,88 @@
+From 08a80c03b1cb36cd0e21dd5faecce4d2e644c09c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 May 2023 22:39:30 +0200
+Subject: netfilter: nft_set_rbtree: fix null deref on element insertion
+
+From: Florian Westphal <fw@strlen.de>
+
+[ Upstream commit 61ae320a29b0540c16931816299eb86bf2b66c08 ]
+
+There is no guarantee that rb_prev() will not return NULL in nft_rbtree_gc_elem():
+
+general protection fault, probably for non-canonical address 0xdffffc0000000003: 0000 [#1] PREEMPT SMP KASAN
+KASAN: null-ptr-deref in range [0x0000000000000018-0x000000000000001f]
+ nft_add_set_elem+0x14b0/0x2990
+  nf_tables_newsetelem+0x528/0xb30
+
+Furthermore, there is a possible use-after-free while iterating,
+'node' can be free'd so we need to cache the next value to use.
+
+Fixes: c9e6978e2725 ("netfilter: nft_set_rbtree: Switch to node list walk for overlap detection")
+Signed-off-by: Florian Westphal <fw@strlen.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/netfilter/nft_set_rbtree.c | 20 +++++++++++++-------
+ 1 file changed, 13 insertions(+), 7 deletions(-)
+
+diff --git a/net/netfilter/nft_set_rbtree.c b/net/netfilter/nft_set_rbtree.c
+index 19ea4d3c35535..2f114aa10f1a7 100644
+--- a/net/netfilter/nft_set_rbtree.c
++++ b/net/netfilter/nft_set_rbtree.c
+@@ -221,7 +221,7 @@ static int nft_rbtree_gc_elem(const struct nft_set *__set,
+ {
+       struct nft_set *set = (struct nft_set *)__set;
+       struct rb_node *prev = rb_prev(&rbe->node);
+-      struct nft_rbtree_elem *rbe_prev;
++      struct nft_rbtree_elem *rbe_prev = NULL;
+       struct nft_set_gc_batch *gcb;
+       gcb = nft_set_gc_batch_check(set, NULL, GFP_ATOMIC);
+@@ -229,17 +229,21 @@ static int nft_rbtree_gc_elem(const struct nft_set *__set,
+               return -ENOMEM;
+       /* search for expired end interval coming before this element. */
+-      do {
++      while (prev) {
+               rbe_prev = rb_entry(prev, struct nft_rbtree_elem, node);
+               if (nft_rbtree_interval_end(rbe_prev))
+                       break;
+               prev = rb_prev(prev);
+-      } while (prev != NULL);
++      }
++
++      if (rbe_prev) {
++              rb_erase(&rbe_prev->node, &priv->root);
++              atomic_dec(&set->nelems);
++      }
+-      rb_erase(&rbe_prev->node, &priv->root);
+       rb_erase(&rbe->node, &priv->root);
+-      atomic_sub(2, &set->nelems);
++      atomic_dec(&set->nelems);
+       nft_set_gc_batch_add(gcb, rbe);
+       nft_set_gc_batch_complete(gcb);
+@@ -268,7 +272,7 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set,
+                              struct nft_set_ext **ext)
+ {
+       struct nft_rbtree_elem *rbe, *rbe_le = NULL, *rbe_ge = NULL;
+-      struct rb_node *node, *parent, **p, *first = NULL;
++      struct rb_node *node, *next, *parent, **p, *first = NULL;
+       struct nft_rbtree *priv = nft_set_priv(set);
+       u8 genmask = nft_genmask_next(net);
+       int d, err;
+@@ -307,7 +311,9 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set,
+        * Values stored in the tree are in reversed order, starting from
+        * highest to lowest value.
+        */
+-      for (node = first; node != NULL; node = rb_next(node)) {
++      for (node = first; node != NULL; node = next) {
++              next = rb_next(node);
++
+               rbe = rb_entry(node, struct nft_rbtree_elem, node);
+               if (!nft_set_elem_active(&rbe->ext, genmask))
+-- 
+2.39.2
+
diff --git a/queue-6.3/revert-fix-xfrm-i-support-for-nested-esp-tunnels.patch b/queue-6.3/revert-fix-xfrm-i-support-for-nested-esp-tunnels.patch
new file mode 100644 (file)
index 0000000..5aad2ca
--- /dev/null
@@ -0,0 +1,125 @@
+From f50e104d47ab66c004a5104619ffebd2444c47f6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 25 Apr 2023 09:46:18 +0200
+Subject: Revert "Fix XFRM-I support for nested ESP tunnels"
+
+From: Martin Willi <martin@strongswan.org>
+
+[ Upstream commit 5fc46f94219d1d103ffb5f0832be9da674d85a73 ]
+
+This reverts commit b0355dbbf13c0052931dd14c38c789efed64d3de.
+
+The reverted commit clears the secpath on packets received via xfrm interfaces
+to support nested IPsec tunnels. This breaks Netfilter policy matching using
+xt_policy in the FORWARD chain, as the secpath is missing during forwarding.
+Additionally, Benedict Wong reports that it breaks Transport-in-Tunnel mode.
+
+Fix this regression by reverting the commit until we have a better approach
+for nested IPsec tunnels.
+
+Fixes: b0355dbbf13c ("Fix XFRM-I support for nested ESP tunnels")
+Link: https://lore.kernel.org/netdev/20230412085615.124791-1-martin@strongswan.org/
+Signed-off-by: Martin Willi <martin@strongswan.org>
+Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/xfrm/xfrm_interface_core.c | 54 +++-------------------------------
+ net/xfrm/xfrm_policy.c         |  3 --
+ 2 files changed, 4 insertions(+), 53 deletions(-)
+
+diff --git a/net/xfrm/xfrm_interface_core.c b/net/xfrm/xfrm_interface_core.c
+index 35279c220bd78..1f99dc4690271 100644
+--- a/net/xfrm/xfrm_interface_core.c
++++ b/net/xfrm/xfrm_interface_core.c
+@@ -310,52 +310,6 @@ static void xfrmi_scrub_packet(struct sk_buff *skb, bool xnet)
+       skb->mark = 0;
+ }
+-static int xfrmi_input(struct sk_buff *skb, int nexthdr, __be32 spi,
+-                     int encap_type, unsigned short family)
+-{
+-      struct sec_path *sp;
+-
+-      sp = skb_sec_path(skb);
+-      if (sp && (sp->len || sp->olen) &&
+-          !xfrm_policy_check(NULL, XFRM_POLICY_IN, skb, family))
+-              goto discard;
+-
+-      XFRM_SPI_SKB_CB(skb)->family = family;
+-      if (family == AF_INET) {
+-              XFRM_SPI_SKB_CB(skb)->daddroff = offsetof(struct iphdr, daddr);
+-              XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4 = NULL;
+-      } else {
+-              XFRM_SPI_SKB_CB(skb)->daddroff = offsetof(struct ipv6hdr, daddr);
+-              XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip6 = NULL;
+-      }
+-
+-      return xfrm_input(skb, nexthdr, spi, encap_type);
+-discard:
+-      kfree_skb(skb);
+-      return 0;
+-}
+-
+-static int xfrmi4_rcv(struct sk_buff *skb)
+-{
+-      return xfrmi_input(skb, ip_hdr(skb)->protocol, 0, 0, AF_INET);
+-}
+-
+-static int xfrmi6_rcv(struct sk_buff *skb)
+-{
+-      return xfrmi_input(skb, skb_network_header(skb)[IP6CB(skb)->nhoff],
+-                         0, 0, AF_INET6);
+-}
+-
+-static int xfrmi4_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
+-{
+-      return xfrmi_input(skb, nexthdr, spi, encap_type, AF_INET);
+-}
+-
+-static int xfrmi6_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
+-{
+-      return xfrmi_input(skb, nexthdr, spi, encap_type, AF_INET6);
+-}
+-
+ static int xfrmi_rcv_cb(struct sk_buff *skb, int err)
+ {
+       const struct xfrm_mode *inner_mode;
+@@ -991,8 +945,8 @@ static struct pernet_operations xfrmi_net_ops = {
+ };
+ static struct xfrm6_protocol xfrmi_esp6_protocol __read_mostly = {
+-      .handler        =       xfrmi6_rcv,
+-      .input_handler  =       xfrmi6_input,
++      .handler        =       xfrm6_rcv,
++      .input_handler  =       xfrm_input,
+       .cb_handler     =       xfrmi_rcv_cb,
+       .err_handler    =       xfrmi6_err,
+       .priority       =       10,
+@@ -1042,8 +996,8 @@ static struct xfrm6_tunnel xfrmi_ip6ip_handler __read_mostly = {
+ #endif
+ static struct xfrm4_protocol xfrmi_esp4_protocol __read_mostly = {
+-      .handler        =       xfrmi4_rcv,
+-      .input_handler  =       xfrmi4_input,
++      .handler        =       xfrm4_rcv,
++      .input_handler  =       xfrm_input,
+       .cb_handler     =       xfrmi_rcv_cb,
+       .err_handler    =       xfrmi4_err,
+       .priority       =       10,
+diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
+index 62be042f2ebcd..21a3a1cd3d6de 100644
+--- a/net/xfrm/xfrm_policy.c
++++ b/net/xfrm/xfrm_policy.c
+@@ -3739,9 +3739,6 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,
+                       goto reject;
+               }
+-              if (if_id)
+-                      secpath_reset(skb);
+-
+               xfrm_pols_put(pols, npols);
+               return 1;
+       }
+-- 
+2.39.2
+
diff --git a/queue-6.3/s390-cio-include-subchannels-without-devices-also-fo.patch b/queue-6.3/s390-cio-include-subchannels-without-devices-also-fo.patch
new file mode 100644 (file)
index 0000000..2be3182
--- /dev/null
@@ -0,0 +1,44 @@
+From 1e735ee67a63fa15a8cf4d7af8e2bd3a39718d64 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 May 2023 11:12:42 +0200
+Subject: s390/cio: include subchannels without devices also for evaluation
+
+From: Vineeth Vijayan <vneethv@linux.ibm.com>
+
+[ Upstream commit b1b0d5aec1cf9f9a900a14964f869c68688d923e ]
+
+Currently when the new channel-path is enabled, we do evaluation only
+on the subchannels with a device connected on it. This is because,
+in the past, if the device in the subchannel is not working or not
+available, we used to unregister the subchannels. But, from the 'commit
+2297791c92d0 ("s390/cio: dont unregister subchannel from child-drivers")'
+we allow subchannels with or without an active device connected
+on it. So, when we do the io_subchannel_verify, make sure that,
+we are evaluating the subchannels without any device too.
+
+Fixes: 2297791c92d0 ("s390/cio: dont unregister subchannel from child-drivers")
+Reported-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
+Signed-off-by: Vineeth Vijayan <vneethv@linux.ibm.com>
+Reviewed-by: Peter Oberparleiter <oberpar@linux.ibm.com>
+Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/s390/cio/device.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c
+index 8eb089b99cde9..d5c43e9b51289 100644
+--- a/drivers/s390/cio/device.c
++++ b/drivers/s390/cio/device.c
+@@ -1111,6 +1111,8 @@ static void io_subchannel_verify(struct subchannel *sch)
+       cdev = sch_get_cdev(sch);
+       if (cdev)
+               dev_fsm_event(cdev, DEV_EVENT_VERIFY);
++      else
++              css_schedule_eval(sch->schid);
+ }
+ static void io_subchannel_terminate_path(struct subchannel *sch, u8 mask)
+-- 
+2.39.2
+
diff --git a/queue-6.3/scsi-storvsc-don-t-pass-unused-pfns-to-hyper-v-host.patch b/queue-6.3/scsi-storvsc-don-t-pass-unused-pfns-to-hyper-v-host.patch
new file mode 100644 (file)
index 0000000..c34c271
--- /dev/null
@@ -0,0 +1,65 @@
+From e4995119fa060202f41dd6a4f831c57373630f3b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 15 May 2023 10:20:41 -0700
+Subject: scsi: storvsc: Don't pass unused PFNs to Hyper-V host
+
+From: Michael Kelley <mikelley@microsoft.com>
+
+[ Upstream commit 4e81a6cba517cb33584308a331f14f5e3fec369b ]
+
+In a SCSI request, storvsc pre-allocates space for up to
+MAX_PAGE_BUFFER_COUNT physical frame numbers to be passed to Hyper-V.  If
+the size of the I/O request requires more PFNs, a separate memory area of
+exactly the correct size is dynamically allocated.
+
+But when the pre-allocated area is used, current code always passes
+MAX_PAGE_BUFFER_COUNT PFNs to Hyper-V, even if fewer are needed.  While
+this doesn't break anything because the additional PFNs are always zero,
+more bytes than necessary are copied into the VMBus channel ring buffer.
+This takes CPU cycles and wastes space in the ring buffer. For a typical 4
+Kbyte I/O that requires only a single PFN, 248 unnecessary bytes are
+copied.
+
+Fix this by setting the payload_sz based on the actual number of PFNs
+required, not the size of the pre-allocated space.
+
+Reported-by: John Starks <jostarks@microsoft.com>
+Fixes: 8f43710543ef ("scsi: storvsc: Support PAGE_SIZE larger than 4K")
+Signed-off-by: Michael Kelley <mikelley@microsoft.com>
+Link: https://lore.kernel.org/r/1684171241-16209-1-git-send-email-mikelley@microsoft.com
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/storvsc_drv.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
+index d9ce379c4d2e8..e6bc622954cfa 100644
+--- a/drivers/scsi/storvsc_drv.c
++++ b/drivers/scsi/storvsc_drv.c
+@@ -1780,7 +1780,7 @@ static int storvsc_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scmnd)
+       length = scsi_bufflen(scmnd);
+       payload = (struct vmbus_packet_mpb_array *)&cmd_request->mpb;
+-      payload_sz = sizeof(cmd_request->mpb);
++      payload_sz = 0;
+       if (scsi_sg_count(scmnd)) {
+               unsigned long offset_in_hvpg = offset_in_hvpage(sgl->offset);
+@@ -1789,10 +1789,10 @@ static int storvsc_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scmnd)
+               unsigned long hvpfn, hvpfns_to_add;
+               int j, i = 0, sg_count;
+-              if (hvpg_count > MAX_PAGE_BUFFER_COUNT) {
++              payload_sz = (hvpg_count * sizeof(u64) +
++                            sizeof(struct vmbus_packet_mpb_array));
+-                      payload_sz = (hvpg_count * sizeof(u64) +
+-                                    sizeof(struct vmbus_packet_mpb_array));
++              if (hvpg_count > MAX_PAGE_BUFFER_COUNT) {
+                       payload = kzalloc(payload_sz, GFP_ATOMIC);
+                       if (!payload)
+                               return SCSI_MLQUEUE_DEVICE_BUSY;
+-- 
+2.39.2
+
diff --git a/queue-6.3/selftests-seg6-disable-dad-on-ipv6-router-cfg-for-sr.patch b/queue-6.3/selftests-seg6-disable-dad-on-ipv6-router-cfg-for-sr.patch
new file mode 100644 (file)
index 0000000..fef3dac
--- /dev/null
@@ -0,0 +1,56 @@
+From c53295589e88c33c1db342a2517ed009ebd8a589 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 May 2023 13:16:37 +0200
+Subject: selftests: seg6: disable DAD on IPv6 router cfg for
+ srv6_end_dt4_l3vpn_test
+
+From: Andrea Mayer <andrea.mayer@uniroma2.it>
+
+[ Upstream commit 21a933c79a33add3612808f3be4ad65dd4dc026b ]
+
+The srv6_end_dt4_l3vpn_test instantiates a virtual network consisting of
+several routers (rt-1, rt-2) and hosts.
+When the IPv6 addresses of rt-{1,2} routers are configured, the Deduplicate
+Address Detection (DAD) kicks in when enabled in the Linux distros running
+the selftests. DAD is used to check whether an IPv6 address is already
+assigned in a network. Such a mechanism consists of sending an ICMPv6 Echo
+Request and waiting for a reply.
+As the DAD process could take too long to complete, it may cause the
+failing of some tests carried out by the srv6_end_dt4_l3vpn_test script.
+
+To make the srv6_end_dt4_l3vpn_test more robust, we disable DAD on routers
+since we configure the virtual network manually and do not need any address
+deduplication mechanism at all.
+
+Fixes: 2195444e09b4 ("selftests: add selftest for the SRv6 End.DT4 behavior")
+Signed-off-by: Andrea Mayer <andrea.mayer@uniroma2.it>
+Reviewed-by: David Ahern <dsahern@kernel.org>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/srv6_end_dt4_l3vpn_test.sh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/tools/testing/selftests/net/srv6_end_dt4_l3vpn_test.sh b/tools/testing/selftests/net/srv6_end_dt4_l3vpn_test.sh
+index 1003119773e5d..37f08d582d2fe 100755
+--- a/tools/testing/selftests/net/srv6_end_dt4_l3vpn_test.sh
++++ b/tools/testing/selftests/net/srv6_end_dt4_l3vpn_test.sh
+@@ -232,10 +232,14 @@ setup_rt_networking()
+       local nsname=rt-${rt}
+       ip netns add ${nsname}
++
++      ip netns exec ${nsname} sysctl -wq net.ipv6.conf.all.accept_dad=0
++      ip netns exec ${nsname} sysctl -wq net.ipv6.conf.default.accept_dad=0
++
+       ip link set veth-rt-${rt} netns ${nsname}
+       ip -netns ${nsname} link set veth-rt-${rt} name veth0
+-      ip -netns ${nsname} addr add ${IPv6_RT_NETWORK}::${rt}/64 dev veth0
++      ip -netns ${nsname} addr add ${IPv6_RT_NETWORK}::${rt}/64 dev veth0 nodad
+       ip -netns ${nsname} link set veth0 up
+       ip -netns ${nsname} link set lo up
+-- 
+2.39.2
+
diff --git a/queue-6.3/selftets-seg6-disable-rp_filter-by-default-in-srv6_e.patch b/queue-6.3/selftets-seg6-disable-rp_filter-by-default-in-srv6_e.patch
new file mode 100644 (file)
index 0000000..f4d9928
--- /dev/null
@@ -0,0 +1,63 @@
+From 638cacf431f7265bae51e0c24c86fcd011dcdc63 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 May 2023 13:16:38 +0200
+Subject: selftets: seg6: disable rp_filter by default in
+ srv6_end_dt4_l3vpn_test
+
+From: Andrea Mayer <andrea.mayer@uniroma2.it>
+
+[ Upstream commit f97b8401e0deb46ad1e4245c21f651f64f55aaa6 ]
+
+On some distributions, the rp_filter is automatically set (=1) by
+default on a netdev basis (also on VRFs).
+In an SRv6 End.DT4 behavior, decapsulated IPv4 packets are routed using
+the table associated with the VRF bound to that tunnel. During lookup
+operations, the rp_filter can lead to packet loss when activated on the
+VRF.
+Therefore, we chose to make this selftest more robust by explicitly
+disabling the rp_filter during tests (as it is automatically set by some
+Linux distributions).
+
+Fixes: 2195444e09b4 ("selftests: add selftest for the SRv6 End.DT4 behavior")
+Reported-by: Hangbin Liu <liuhangbin@gmail.com>
+Signed-off-by: Andrea Mayer <andrea.mayer@uniroma2.it>
+Tested-by: Hangbin Liu <liuhangbin@gmail.com>
+Reviewed-by: David Ahern <dsahern@kernel.org>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../testing/selftests/net/srv6_end_dt4_l3vpn_test.sh  | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+diff --git a/tools/testing/selftests/net/srv6_end_dt4_l3vpn_test.sh b/tools/testing/selftests/net/srv6_end_dt4_l3vpn_test.sh
+index 37f08d582d2fe..f962823628119 100755
+--- a/tools/testing/selftests/net/srv6_end_dt4_l3vpn_test.sh
++++ b/tools/testing/selftests/net/srv6_end_dt4_l3vpn_test.sh
+@@ -258,6 +258,12 @@ setup_hs()
+       # set the networking for the host
+       ip netns add ${hsname}
++
++      # disable the rp_filter otherwise the kernel gets confused about how
++      # to route decap ipv4 packets.
++      ip netns exec ${rtname} sysctl -wq net.ipv4.conf.all.rp_filter=0
++      ip netns exec ${rtname} sysctl -wq net.ipv4.conf.default.rp_filter=0
++
+       ip -netns ${hsname} link add veth0 type veth peer name ${rtveth}
+       ip -netns ${hsname} link set ${rtveth} netns ${rtname}
+       ip -netns ${hsname} addr add ${IPv4_HS_NETWORK}.${hs}/24 dev veth0
+@@ -276,11 +282,6 @@ setup_hs()
+       ip netns exec ${rtname} sysctl -wq net.ipv4.conf.${rtveth}.proxy_arp=1
+-      # disable the rp_filter otherwise the kernel gets confused about how
+-      # to route decap ipv4 packets.
+-      ip netns exec ${rtname} sysctl -wq net.ipv4.conf.all.rp_filter=0
+-      ip netns exec ${rtname} sysctl -wq net.ipv4.conf.${rtveth}.rp_filter=0
+-
+       ip netns exec ${rtname} sh -c "echo 1 > /proc/sys/net/vrf/strict_mode"
+ }
+-- 
+2.39.2
+
diff --git a/queue-6.3/serial-8250_bcm7271-balance-clk_enable-calls.patch b/queue-6.3/serial-8250_bcm7271-balance-clk_enable-calls.patch
new file mode 100644 (file)
index 0000000..fd51a00
--- /dev/null
@@ -0,0 +1,58 @@
+From ae2995d7e806c6979137fd39db6e610f013ece1b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Apr 2023 11:19:15 -0700
+Subject: serial: 8250_bcm7271: balance clk_enable calls
+
+From: Doug Berger <opendmb@gmail.com>
+
+[ Upstream commit 8a3b5477256a54ae4a470dcebbcf8cdc18e4696d ]
+
+The sw_baud clock must be disabled when the device driver is not
+connected to the device. This now occurs when probe fails and
+upon remove.
+
+Fixes: 41a469482de2 ("serial: 8250: Add new 8250-core based Broadcom STB driver")
+Reported-by: XuDong Liu <m202071377@hust.edu.cn>
+Link: https://lore.kernel.org/lkml/20230424125100.4783-1-m202071377@hust.edu.cn/
+Signed-off-by: Doug Berger <opendmb@gmail.com>
+Acked-by: Florian Fainelli <f.fainelli@gmail.com>
+Link: https://lore.kernel.org/r/20230427181916.2983697-2-opendmb@gmail.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/tty/serial/8250/8250_bcm7271.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/tty/serial/8250/8250_bcm7271.c b/drivers/tty/serial/8250/8250_bcm7271.c
+index f801b1f5b46c0..90ee7bc12f77b 100644
+--- a/drivers/tty/serial/8250/8250_bcm7271.c
++++ b/drivers/tty/serial/8250/8250_bcm7271.c
+@@ -1032,7 +1032,7 @@ static int brcmuart_probe(struct platform_device *pdev)
+       if (clk_rate == 0) {
+               dev_err(dev, "clock-frequency or clk not defined\n");
+               ret = -EINVAL;
+-              goto release_dma;
++              goto err_clk_disable;
+       }
+       dev_dbg(dev, "DMA is %senabled\n", priv->dma_enabled ? "" : "not ");
+@@ -1119,6 +1119,8 @@ static int brcmuart_probe(struct platform_device *pdev)
+       serial8250_unregister_port(priv->line);
+ err:
+       brcmuart_free_bufs(dev, priv);
++err_clk_disable:
++      clk_disable_unprepare(baud_mux_clk);
+ release_dma:
+       if (priv->dma_enabled)
+               brcmuart_arbitration(priv, 0);
+@@ -1133,6 +1135,7 @@ static int brcmuart_remove(struct platform_device *pdev)
+       hrtimer_cancel(&priv->hrt);
+       serial8250_unregister_port(priv->line);
+       brcmuart_free_bufs(&pdev->dev, priv);
++      clk_disable_unprepare(priv->baud_mux_clk);
+       if (priv->dma_enabled)
+               brcmuart_arbitration(priv, 0);
+       return 0;
+-- 
+2.39.2
+
diff --git a/queue-6.3/serial-8250_bcm7271-fix-leak-in-brcmuart_probe.patch b/queue-6.3/serial-8250_bcm7271-fix-leak-in-brcmuart_probe.patch
new file mode 100644 (file)
index 0000000..0baa61b
--- /dev/null
@@ -0,0 +1,43 @@
+From f31a49c6ca8e6bd00e641612d16a5256b2747fe2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Apr 2023 11:19:16 -0700
+Subject: serial: 8250_bcm7271: fix leak in `brcmuart_probe`
+
+From: Doug Berger <opendmb@gmail.com>
+
+[ Upstream commit f264f2f6f4788dc031cef60a0cf2881902736709 ]
+
+Smatch reports:
+drivers/tty/serial/8250/8250_bcm7271.c:1120 brcmuart_probe() warn:
+'baud_mux_clk' from clk_prepare_enable() not released on lines: 1032.
+
+The issue is fixed by using a managed clock.
+
+Fixes: 41a469482de2 ("serial: 8250: Add new 8250-core based Broadcom STB driver")
+Reported-by: XuDong Liu <m202071377@hust.edu.cn>
+Link: https://lore.kernel.org/lkml/20230424125100.4783-1-m202071377@hust.edu.cn/
+Signed-off-by: Doug Berger <opendmb@gmail.com>
+Acked-by: Florian Fainelli <f.fainelli@gmail.com>
+Link: https://lore.kernel.org/r/20230427181916.2983697-3-opendmb@gmail.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/tty/serial/8250/8250_bcm7271.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/tty/serial/8250/8250_bcm7271.c b/drivers/tty/serial/8250/8250_bcm7271.c
+index 90ee7bc12f77b..af0e1c0701879 100644
+--- a/drivers/tty/serial/8250/8250_bcm7271.c
++++ b/drivers/tty/serial/8250/8250_bcm7271.c
+@@ -1012,7 +1012,7 @@ static int brcmuart_probe(struct platform_device *pdev)
+       of_property_read_u32(np, "clock-frequency", &clk_rate);
+       /* See if a Baud clock has been specified */
+-      baud_mux_clk = of_clk_get_by_name(np, "sw_baud");
++      baud_mux_clk = devm_clk_get(dev, "sw_baud");
+       if (IS_ERR(baud_mux_clk)) {
+               if (PTR_ERR(baud_mux_clk) == -EPROBE_DEFER) {
+                       ret = -EPROBE_DEFER;
+-- 
+2.39.2
+
diff --git a/queue-6.3/serial-arc_uart-fix-of_iomap-leak-in-arc_serial_prob.patch b/queue-6.3/serial-arc_uart-fix-of_iomap-leak-in-arc_serial_prob.patch
new file mode 100644 (file)
index 0000000..601abeb
--- /dev/null
@@ -0,0 +1,51 @@
+From 084e24117b809908c2338456ef62f347bd0dc609 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 28 Apr 2023 11:16:36 +0800
+Subject: serial: arc_uart: fix of_iomap leak in `arc_serial_probe`
+
+From: Ke Zhang <m202171830@hust.edu.cn>
+
+[ Upstream commit 8ab5fc55d7f65d58a3c3aeadf11bdf60267cd2bd ]
+
+Smatch reports:
+
+drivers/tty/serial/arc_uart.c:631 arc_serial_probe() warn:
+'port->membase' from of_iomap() not released on lines: 631.
+
+In arc_serial_probe(), if uart_add_one_port() fails,
+port->membase is not released, which would cause a resource leak.
+
+To fix this, I replace of_iomap with devm_platform_ioremap_resource.
+
+Fixes: 8dbe1d5e09a7 ("serial/arc: inline the probe helper")
+Signed-off-by: Ke Zhang <m202171830@hust.edu.cn>
+Reviewed-by: Dongliang Mu <dzm91@hust.edu.cn>
+Link: https://lore.kernel.org/r/20230428031636.44642-1-m202171830@hust.edu.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/tty/serial/arc_uart.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/tty/serial/arc_uart.c b/drivers/tty/serial/arc_uart.c
+index 59e25f2b66322..4b2512eef577b 100644
+--- a/drivers/tty/serial/arc_uart.c
++++ b/drivers/tty/serial/arc_uart.c
+@@ -606,10 +606,11 @@ static int arc_serial_probe(struct platform_device *pdev)
+       }
+       uart->baud = val;
+-      port->membase = of_iomap(np, 0);
+-      if (!port->membase)
++      port->membase = devm_platform_ioremap_resource(pdev, 0);
++      if (IS_ERR(port->membase)) {
+               /* No point of dev_err since UART itself is hosed here */
+-              return -ENXIO;
++              return PTR_ERR(port->membase);
++      }
+       port->irq = irq_of_parse_and_map(np, 0);
+-- 
+2.39.2
+
index 5427015521f1420bb430bddf704d4553e6f98daa..c09afbdcbc9e32cb1ce99be365e50e5d5ba0f71a 100644 (file)
@@ -195,3 +195,94 @@ mfd-intel_soc_pmic_chtwc-add-lenovo-yoga-book-x90f-t.patch
 mfd-dln2-fix-memory-leak-in-dln2_probe.patch
 mfd-intel-lpss-add-intel-meteor-lake-pch-s-lpss-pci-.patch
 parisc-replace-regular-spinlock-with-spin_trylock-on.patch
+xfrm-don-t-check-the-default-policy-if-the-policy-al.patch
+xfrm-release-all-offloaded-policy-memory.patch
+xfrm-fix-leak-of-dev-tracker.patch
+revert-fix-xfrm-i-support-for-nested-esp-tunnels.patch
+drm-msm-dp-unregister-audio-driver-during-unbind.patch
+drm-msm-dpu-assign-missing-writeback-log_mask.patch
+drm-msm-dpu-move-non-mdp_top-intf_intr-offsets-out-o.patch
+drm-msm-dpu-reindent-rev_7xxx-interrupt-masks-with-t.patch
+drm-msm-dpu-populate-smartdma-features-in-hw-catalog.patch
+drm-msm-dpu-drop-smart_dma_rev-from-dpu_caps.patch
+drm-msm-dpu-allow-variable-sspp_blk-size.patch
+drm-msm-dpu-allow-variable-intf_blk-size.patch
+drm-msm-dpu-move-ubwc-memory-configuration-to-separa.patch
+drm-msm-dpu-split-sm8550-catalog-entry-to-the-separa.patch
+drm-msm-dpu-fix-pp_blk_dipher-dither-typo.patch
+drm-msm-dpu-remove-duplicate-register-defines-from-i.patch
+dt-bindings-display-msm-dsi-controller-main-document.patch
+sunrpc-fix-encoding-of-accepted-but-unsuccessful-rpc.patch
+asoc-fsl_micfil-fix-error-handler-with-pm_runtime_en.patch
+cpupower-make-tsc-read-per-cpu-for-mperf-monitor.patch
+xfrm-reject-optional-tunnel-beet-mode-templates-in-o.patch
+af_key-reject-optional-tunnel-beet-mode-templates-in.patch
+drm-msm-fix-submit-error-path-leaks.patch
+selftests-seg6-disable-dad-on-ipv6-router-cfg-for-sr.patch
+selftets-seg6-disable-rp_filter-by-default-in-srv6_e.patch
+devlink-change-per-devlink-netdev-notifier-to-static.patch
+net-fec-better-handle-pm_runtime_get-failing-in-.rem.patch
+net-phy-dp83867-add-w-a-for-packet-errors-seen-with-.patch
+alsa-firewire-digi00x-prevent-potential-use-after-fr.patch
+wifi-mt76-connac-fix-stats-tx_bytes-calculation.patch
+alsa-hda-realtek-apply-hp-b-o-top-speaker-profile-to.patch
+ice-fix-undersized-tx_flags-variable.patch
+sfc-disable-rxfcs-and-rxall-features-by-default.patch
+vsock-avoid-to-close-connected-socket-after-the-time.patch
+tcp-fix-possible-sk_priority-leak-in-tcp_v4_send_res.patch
+media-pvrusb2-fix-dvb_core-dependency.patch
+serial-arc_uart-fix-of_iomap-leak-in-arc_serial_prob.patch
+serial-8250_bcm7271-balance-clk_enable-calls.patch
+serial-8250_bcm7271-fix-leak-in-brcmuart_probe.patch
+erspan-get-the-proto-with-the-md-version-for-collect.patch
+net-dsa-rzn1-a5psw-enable-management-frames-for-cpu-.patch
+net-dsa-rzn1-a5psw-fix-stp-states-handling.patch
+net-dsa-rzn1-a5psw-disable-learning-for-standalone-p.patch
+net-hns3-fix-output-information-incomplete-for-dumpi.patch
+net-hns3-fix-sending-pfc-frames-after-reset-issue.patch
+net-hns3-fix-reset-delay-time-to-avoid-configuration.patch
+net-hns3-fix-reset-timeout-when-enable-full-vf.patch
+media-netup_unidvb-fix-use-after-free-at-del_timer.patch
+sunrpc-double-free-xprt_ctxt-while-still-in-use.patch
+sunrpc-always-free-ctxt-when-freeing-deferred-reques.patch
+sunrpc-fix-trace_svc_register-call-site.patch
+asoc-sof-ipc3-topology-make-sure-that-only-one-cmd-i.patch
+asoc-mediatek-mt8186-fix-use-after-free-in-driver-re.patch
+asoc-sof-topology-fix-logic-for-copying-tuples.patch
+drm-exynos-fix-g2d_open-close-helper-function-defini.patch
+net-nsh-use-correct-mac_offset-to-unwind-gso-skb-in-.patch
+net-fec-remove-the-xdp_return_frame-when-lack-of-tx-.patch
+virtio_net-fix-error-unwinding-of-xdp-initialization.patch
+tipc-add-tipc_bearer_min_mtu-to-calculate-min-mtu.patch
+tipc-do-not-update-mtu-if-msg_max-is-too-small-in-mt.patch
+tipc-check-the-bearer-min-mtu-properly-when-setting-.patch
+s390-cio-include-subchannels-without-devices-also-fo.patch
+can-dev-fix-missing-can-xl-support-in-can_put_echo_s.patch
+net-bcmgenet-remove-phy_stop-from-bcmgenet_netif_sto.patch
+net-bcmgenet-restore-phy_stop-depending-upon-suspend.patch
+ice-fix-stats-after-pf-reset.patch
+ice-fix-ice-vf-reset-during-iavf-initialization.patch
+iavf-send-vlan-offloading-caps-once-after-vfr.patch
+wifi-cfg80211-drop-entries-with-invalid-bssids-in-rn.patch
+wifi-mac80211-fortify-the-spinlock-against-deadlock-.patch
+wifi-mac80211-fix-puncturing-bitmap-handling-in-__ie.patch
+wifi-mac80211-fix-min-center-freq-offset-tracing.patch
+wifi-mac80211-abort-running-color-change-when-stoppi.patch
+wifi-iwlwifi-mvm-fix-cancel_delayed_work_sync-deadlo.patch
+wifi-iwlwifi-fw-fix-dbgi-dump.patch
+wifi-iwlwifi-fix-oem-s-name-in-the-ppag-approved-lis.patch
+wifi-iwlwifi-mvm-fix-oem-s-name-in-the-tas-approved-.patch
+wifi-iwlwifi-mvm-don-t-trust-firmware-n_channels.patch
+scsi-storvsc-don-t-pass-unused-pfns-to-hyper-v-host.patch
+devlink-fix-crash-with-config_net_ns-n.patch
+tun-fix-memory-leak-for-detached-napi-queue.patch
+cassini-fix-a-memory-leak-in-the-error-handling-path.patch
+net-dsa-mv88e6xxx-fix-mv88e6393x-epc-write-command-o.patch
+igb-fix-bit_shift-to-be-in-1.8-range.patch
+vlan-fix-a-potential-uninit-value-in-vlan_dev_hard_s.patch
+net-wwan-iosm-fix-null-pointer-dereference-when-remo.patch
+net-pcs-xpcs-fix-c73-an-not-getting-enabled.patch
+net-selftests-fix-optstring.patch
+netfilter-nf_tables-fix-nft_trans-type-confusion.patch
+netfilter-nft_set_rbtree-fix-null-deref-on-element-i.patch
+bridge-always-declare-tunnel-functions.patch
diff --git a/queue-6.3/sfc-disable-rxfcs-and-rxall-features-by-default.patch b/queue-6.3/sfc-disable-rxfcs-and-rxall-features-by-default.patch
new file mode 100644 (file)
index 0000000..2edbf2d
--- /dev/null
@@ -0,0 +1,43 @@
+From d2e6abb442bac930b6489fb5f52311ec09171a2b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 May 2023 10:43:33 +0100
+Subject: sfc: disable RXFCS and RXALL features by default
+
+From: Pieter Jansen van Vuuren <pieter.jansen-van-vuuren@amd.com>
+
+[ Upstream commit 134120b066044399ef59564ff3ba66ab344cfc5b ]
+
+By default we would not want RXFCS and RXALL features enabled as they are
+mainly intended for debugging purposes. This does not stop users from
+enabling them later on as needed.
+
+Fixes: 8e57daf70671 ("sfc_ef100: RX path for EF100")
+Signed-off-by: Pieter Jansen van Vuuren <pieter.jansen-van-vuuren@amd.com>
+Co-developed-by: Edward Cree <ecree.xilinx@gmail.com>
+Signed-off-by: Edward Cree <ecree.xilinx@gmail.com>
+Reviewed-by: Martin Habets <habetsm.xilinx@gmail.com>
+Reviewed-by: Simon Horman <simon.horman@corigine.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/sfc/ef100_netdev.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/sfc/ef100_netdev.c b/drivers/net/ethernet/sfc/ef100_netdev.c
+index d916877b5a9ad..be395cd8770bc 100644
+--- a/drivers/net/ethernet/sfc/ef100_netdev.c
++++ b/drivers/net/ethernet/sfc/ef100_netdev.c
+@@ -378,7 +378,9 @@ int ef100_probe_netdev(struct efx_probe_data *probe_data)
+       efx->net_dev = net_dev;
+       SET_NETDEV_DEV(net_dev, &efx->pci_dev->dev);
+-      net_dev->features |= efx->type->offload_features;
++      /* enable all supported features except rx-fcs and rx-all */
++      net_dev->features |= efx->type->offload_features &
++                           ~(NETIF_F_RXFCS | NETIF_F_RXALL);
+       net_dev->hw_features |= efx->type->offload_features;
+       net_dev->hw_enc_features |= efx->type->offload_features;
+       net_dev->vlan_features |= NETIF_F_HW_CSUM | NETIF_F_SG |
+-- 
+2.39.2
+
diff --git a/queue-6.3/sunrpc-always-free-ctxt-when-freeing-deferred-reques.patch b/queue-6.3/sunrpc-always-free-ctxt-when-freeing-deferred-reques.patch
new file mode 100644 (file)
index 0000000..b076588
--- /dev/null
@@ -0,0 +1,267 @@
+From 047e60ab92a14c7e8cc91d944efe7d5318fdf19e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 9 May 2023 09:42:47 +1000
+Subject: SUNRPC: always free ctxt when freeing deferred request
+
+From: NeilBrown <neilb@suse.de>
+
+[ Upstream commit 948f072ada23e0a504c5e4d7d71d4c83bd0785ec ]
+
+Since the ->xprt_ctxt pointer was added to svc_deferred_req, it has not
+been sufficient to use kfree() to free a deferred request.  We may need
+to free the ctxt as well.
+
+As freeing the ctxt is all that ->xpo_release_rqst() does, we repurpose
+it to explicit do that even when the ctxt is not stored in an rqst.
+So we now have ->xpo_release_ctxt() which is given an xprt and a ctxt,
+which may have been taken either from an rqst or from a dreq.  The
+caller is now responsible for clearing that pointer after the call to
+->xpo_release_ctxt.
+
+We also clear dr->xprt_ctxt when the ctxt is moved into a new rqst when
+revisiting a deferred request.  This ensures there is only one pointer
+to the ctxt, so the risk of double freeing in future is reduced.  The
+new code in svc_xprt_release which releases both the ctxt and any
+rq_deferred depends on this.
+
+Fixes: 773f91b2cf3f ("SUNRPC: Fix NFSD's request deferral on RDMA transports")
+Signed-off-by: NeilBrown <neilb@suse.de>
+Reviewed-by: Jeff Layton <jlayton@kernel.org>
+Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/sunrpc/svc_rdma.h          |  2 +-
+ include/linux/sunrpc/svc_xprt.h          |  2 +-
+ net/sunrpc/svc_xprt.c                    | 23 +++++++++++++-----
+ net/sunrpc/svcsock.c                     | 30 +++++++++++++-----------
+ net/sunrpc/xprtrdma/svc_rdma_recvfrom.c  | 11 ++++-----
+ net/sunrpc/xprtrdma/svc_rdma_transport.c |  2 +-
+ 6 files changed, 41 insertions(+), 29 deletions(-)
+
+diff --git a/include/linux/sunrpc/svc_rdma.h b/include/linux/sunrpc/svc_rdma.h
+index 24aa159d29a7f..fbc4bd423b355 100644
+--- a/include/linux/sunrpc/svc_rdma.h
++++ b/include/linux/sunrpc/svc_rdma.h
+@@ -176,7 +176,7 @@ extern struct svc_rdma_recv_ctxt *
+ extern void svc_rdma_recv_ctxt_put(struct svcxprt_rdma *rdma,
+                                  struct svc_rdma_recv_ctxt *ctxt);
+ extern void svc_rdma_flush_recv_queues(struct svcxprt_rdma *rdma);
+-extern void svc_rdma_release_rqst(struct svc_rqst *rqstp);
++extern void svc_rdma_release_ctxt(struct svc_xprt *xprt, void *ctxt);
+ extern int svc_rdma_recvfrom(struct svc_rqst *);
+ /* svc_rdma_rw.c */
+diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h
+index 775368802762e..f725a3ac3406a 100644
+--- a/include/linux/sunrpc/svc_xprt.h
++++ b/include/linux/sunrpc/svc_xprt.h
+@@ -23,7 +23,7 @@ struct svc_xprt_ops {
+       int             (*xpo_sendto)(struct svc_rqst *);
+       int             (*xpo_result_payload)(struct svc_rqst *, unsigned int,
+                                             unsigned int);
+-      void            (*xpo_release_rqst)(struct svc_rqst *);
++      void            (*xpo_release_ctxt)(struct svc_xprt *xprt, void *ctxt);
+       void            (*xpo_detach)(struct svc_xprt *);
+       void            (*xpo_free)(struct svc_xprt *);
+       void            (*xpo_kill_temp_xprt)(struct svc_xprt *);
+diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
+index feab34db870fe..767628776dc01 100644
+--- a/net/sunrpc/svc_xprt.c
++++ b/net/sunrpc/svc_xprt.c
+@@ -532,13 +532,23 @@ void svc_reserve(struct svc_rqst *rqstp, int space)
+ }
+ EXPORT_SYMBOL_GPL(svc_reserve);
++static void free_deferred(struct svc_xprt *xprt, struct svc_deferred_req *dr)
++{
++      if (!dr)
++              return;
++
++      xprt->xpt_ops->xpo_release_ctxt(xprt, dr->xprt_ctxt);
++      kfree(dr);
++}
++
+ static void svc_xprt_release(struct svc_rqst *rqstp)
+ {
+       struct svc_xprt *xprt = rqstp->rq_xprt;
+-      xprt->xpt_ops->xpo_release_rqst(rqstp);
++      xprt->xpt_ops->xpo_release_ctxt(xprt, rqstp->rq_xprt_ctxt);
++      rqstp->rq_xprt_ctxt = NULL;
+-      kfree(rqstp->rq_deferred);
++      free_deferred(xprt, rqstp->rq_deferred);
+       rqstp->rq_deferred = NULL;
+       pagevec_release(&rqstp->rq_pvec);
+@@ -1055,7 +1065,7 @@ static void svc_delete_xprt(struct svc_xprt *xprt)
+       spin_unlock_bh(&serv->sv_lock);
+       while ((dr = svc_deferred_dequeue(xprt)) != NULL)
+-              kfree(dr);
++              free_deferred(xprt, dr);
+       call_xpt_users(xprt);
+       svc_xprt_put(xprt);
+@@ -1177,8 +1187,8 @@ static void svc_revisit(struct cache_deferred_req *dreq, int too_many)
+       if (too_many || test_bit(XPT_DEAD, &xprt->xpt_flags)) {
+               spin_unlock(&xprt->xpt_lock);
+               trace_svc_defer_drop(dr);
++              free_deferred(xprt, dr);
+               svc_xprt_put(xprt);
+-              kfree(dr);
+               return;
+       }
+       dr->xprt = NULL;
+@@ -1223,14 +1233,13 @@ static struct cache_deferred_req *svc_defer(struct cache_req *req)
+               dr->addrlen = rqstp->rq_addrlen;
+               dr->daddr = rqstp->rq_daddr;
+               dr->argslen = rqstp->rq_arg.len >> 2;
+-              dr->xprt_ctxt = rqstp->rq_xprt_ctxt;
+               /* back up head to the start of the buffer and copy */
+               skip = rqstp->rq_arg.len - rqstp->rq_arg.head[0].iov_len;
+               memcpy(dr->args, rqstp->rq_arg.head[0].iov_base - skip,
+                      dr->argslen << 2);
+       }
+-      WARN_ON_ONCE(rqstp->rq_xprt_ctxt != dr->xprt_ctxt);
++      dr->xprt_ctxt = rqstp->rq_xprt_ctxt;
+       rqstp->rq_xprt_ctxt = NULL;
+       trace_svc_defer(rqstp);
+       svc_xprt_get(rqstp->rq_xprt);
+@@ -1264,6 +1273,8 @@ static noinline int svc_deferred_recv(struct svc_rqst *rqstp)
+       rqstp->rq_daddr       = dr->daddr;
+       rqstp->rq_respages    = rqstp->rq_pages;
+       rqstp->rq_xprt_ctxt   = dr->xprt_ctxt;
++
++      dr->xprt_ctxt = NULL;
+       svc_xprt_received(rqstp->rq_xprt);
+       return dr->argslen << 2;
+ }
+diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
+index 03a4f56150865..bf2d2cdca1185 100644
+--- a/net/sunrpc/svcsock.c
++++ b/net/sunrpc/svcsock.c
+@@ -112,27 +112,27 @@ static void svc_reclassify_socket(struct socket *sock)
+ #endif
+ /**
+- * svc_tcp_release_rqst - Release transport-related resources
+- * @rqstp: request structure with resources to be released
++ * svc_tcp_release_ctxt - Release transport-related resources
++ * @xprt: the transport which owned the context
++ * @ctxt: the context from rqstp->rq_xprt_ctxt or dr->xprt_ctxt
+  *
+  */
+-static void svc_tcp_release_rqst(struct svc_rqst *rqstp)
++static void svc_tcp_release_ctxt(struct svc_xprt *xprt, void *ctxt)
+ {
+ }
+ /**
+- * svc_udp_release_rqst - Release transport-related resources
+- * @rqstp: request structure with resources to be released
++ * svc_udp_release_ctxt - Release transport-related resources
++ * @xprt: the transport which owned the context
++ * @ctxt: the context from rqstp->rq_xprt_ctxt or dr->xprt_ctxt
+  *
+  */
+-static void svc_udp_release_rqst(struct svc_rqst *rqstp)
++static void svc_udp_release_ctxt(struct svc_xprt *xprt, void *ctxt)
+ {
+-      struct sk_buff *skb = rqstp->rq_xprt_ctxt;
++      struct sk_buff *skb = ctxt;
+-      if (skb) {
+-              rqstp->rq_xprt_ctxt = NULL;
++      if (skb)
+               consume_skb(skb);
+-      }
+ }
+ union svc_pktinfo_u {
+@@ -560,7 +560,8 @@ static int svc_udp_sendto(struct svc_rqst *rqstp)
+       unsigned int sent;
+       int err;
+-      svc_udp_release_rqst(rqstp);
++      svc_udp_release_ctxt(xprt, rqstp->rq_xprt_ctxt);
++      rqstp->rq_xprt_ctxt = NULL;
+       svc_set_cmsg_data(rqstp, cmh);
+@@ -632,7 +633,7 @@ static const struct svc_xprt_ops svc_udp_ops = {
+       .xpo_recvfrom = svc_udp_recvfrom,
+       .xpo_sendto = svc_udp_sendto,
+       .xpo_result_payload = svc_sock_result_payload,
+-      .xpo_release_rqst = svc_udp_release_rqst,
++      .xpo_release_ctxt = svc_udp_release_ctxt,
+       .xpo_detach = svc_sock_detach,
+       .xpo_free = svc_sock_free,
+       .xpo_has_wspace = svc_udp_has_wspace,
+@@ -1162,7 +1163,8 @@ static int svc_tcp_sendto(struct svc_rqst *rqstp)
+       unsigned int sent;
+       int err;
+-      svc_tcp_release_rqst(rqstp);
++      svc_tcp_release_ctxt(xprt, rqstp->rq_xprt_ctxt);
++      rqstp->rq_xprt_ctxt = NULL;
+       atomic_inc(&svsk->sk_sendqlen);
+       mutex_lock(&xprt->xpt_mutex);
+@@ -1207,7 +1209,7 @@ static const struct svc_xprt_ops svc_tcp_ops = {
+       .xpo_recvfrom = svc_tcp_recvfrom,
+       .xpo_sendto = svc_tcp_sendto,
+       .xpo_result_payload = svc_sock_result_payload,
+-      .xpo_release_rqst = svc_tcp_release_rqst,
++      .xpo_release_ctxt = svc_tcp_release_ctxt,
+       .xpo_detach = svc_tcp_sock_detach,
+       .xpo_free = svc_sock_free,
+       .xpo_has_wspace = svc_tcp_has_wspace,
+diff --git a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
+index 1c658fa430633..a22fe7587fa6f 100644
+--- a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
++++ b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
+@@ -239,21 +239,20 @@ void svc_rdma_recv_ctxt_put(struct svcxprt_rdma *rdma,
+ }
+ /**
+- * svc_rdma_release_rqst - Release transport-specific per-rqst resources
+- * @rqstp: svc_rqst being released
++ * svc_rdma_release_ctxt - Release transport-specific per-rqst resources
++ * @xprt: the transport which owned the context
++ * @vctxt: the context from rqstp->rq_xprt_ctxt or dr->xprt_ctxt
+  *
+  * Ensure that the recv_ctxt is released whether or not a Reply
+  * was sent. For example, the client could close the connection,
+  * or svc_process could drop an RPC, before the Reply is sent.
+  */
+-void svc_rdma_release_rqst(struct svc_rqst *rqstp)
++void svc_rdma_release_ctxt(struct svc_xprt *xprt, void *vctxt)
+ {
+-      struct svc_rdma_recv_ctxt *ctxt = rqstp->rq_xprt_ctxt;
+-      struct svc_xprt *xprt = rqstp->rq_xprt;
++      struct svc_rdma_recv_ctxt *ctxt = vctxt;
+       struct svcxprt_rdma *rdma =
+               container_of(xprt, struct svcxprt_rdma, sc_xprt);
+-      rqstp->rq_xprt_ctxt = NULL;
+       if (ctxt)
+               svc_rdma_recv_ctxt_put(rdma, ctxt);
+ }
+diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c
+index 416b298f74ddb..ca04f7a6a085c 100644
+--- a/net/sunrpc/xprtrdma/svc_rdma_transport.c
++++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c
+@@ -80,7 +80,7 @@ static const struct svc_xprt_ops svc_rdma_ops = {
+       .xpo_recvfrom = svc_rdma_recvfrom,
+       .xpo_sendto = svc_rdma_sendto,
+       .xpo_result_payload = svc_rdma_result_payload,
+-      .xpo_release_rqst = svc_rdma_release_rqst,
++      .xpo_release_ctxt = svc_rdma_release_ctxt,
+       .xpo_detach = svc_rdma_detach,
+       .xpo_free = svc_rdma_free,
+       .xpo_has_wspace = svc_rdma_has_wspace,
+-- 
+2.39.2
+
diff --git a/queue-6.3/sunrpc-double-free-xprt_ctxt-while-still-in-use.patch b/queue-6.3/sunrpc-double-free-xprt_ctxt-while-still-in-use.patch
new file mode 100644 (file)
index 0000000..6fa95e0
--- /dev/null
@@ -0,0 +1,58 @@
+From d88b576116c7b542303ada58b5ef8482758d2783 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 9 May 2023 09:41:49 +1000
+Subject: SUNRPC: double free xprt_ctxt while still in use
+
+From: NeilBrown <neilb@suse.de>
+
+[ Upstream commit eb8d3a2c809abd73ab0a060fe971d6b9019aa3c1 ]
+
+When an RPC request is deferred, the rq_xprt_ctxt pointer is moved out
+of the svc_rqst into the svc_deferred_req.
+When the deferred request is revisited, the pointer is copied into
+the new svc_rqst - and also remains in the svc_deferred_req.
+
+In the (rare?) case that the request is deferred a second time, the old
+svc_deferred_req is reused - it still has all the correct content.
+However in that case the rq_xprt_ctxt pointer is NOT cleared so that
+when xpo_release_xprt is called, the ctxt is freed (UDP) or possible
+added to a free list (RDMA).
+When the deferred request is revisited for a second time, it will
+reference this ctxt which may be invalid, and the free the object a
+second time which is likely to oops.
+
+So change svc_defer() to *always* clear rq_xprt_ctxt, and assert that
+the value is now stored in the svc_deferred_req.
+
+Fixes: 773f91b2cf3f ("SUNRPC: Fix NFSD's request deferral on RDMA transports")
+Signed-off-by: NeilBrown <neilb@suse.de>
+Reviewed-by: Jeff Layton <jlayton@kernel.org>
+Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/sunrpc/svc_xprt.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
+index ba629297da4e2..feab34db870fe 100644
+--- a/net/sunrpc/svc_xprt.c
++++ b/net/sunrpc/svc_xprt.c
+@@ -1224,13 +1224,14 @@ static struct cache_deferred_req *svc_defer(struct cache_req *req)
+               dr->daddr = rqstp->rq_daddr;
+               dr->argslen = rqstp->rq_arg.len >> 2;
+               dr->xprt_ctxt = rqstp->rq_xprt_ctxt;
+-              rqstp->rq_xprt_ctxt = NULL;
+               /* back up head to the start of the buffer and copy */
+               skip = rqstp->rq_arg.len - rqstp->rq_arg.head[0].iov_len;
+               memcpy(dr->args, rqstp->rq_arg.head[0].iov_base - skip,
+                      dr->argslen << 2);
+       }
++      WARN_ON_ONCE(rqstp->rq_xprt_ctxt != dr->xprt_ctxt);
++      rqstp->rq_xprt_ctxt = NULL;
+       trace_svc_defer(rqstp);
+       svc_xprt_get(rqstp->rq_xprt);
+       dr->xprt = rqstp->rq_xprt;
+-- 
+2.39.2
+
diff --git a/queue-6.3/sunrpc-fix-encoding-of-accepted-but-unsuccessful-rpc.patch b/queue-6.3/sunrpc-fix-encoding-of-accepted-but-unsuccessful-rpc.patch
new file mode 100644 (file)
index 0000000..ac17168
--- /dev/null
@@ -0,0 +1,95 @@
+From fba8f742a8cee6ae219362be2f2129c2f1f506d2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 May 2023 14:59:10 -0400
+Subject: SUNRPC: Fix encoding of accepted but unsuccessful RPC replies
+
+From: Chuck Lever <chuck.lever@oracle.com>
+
+[ Upstream commit 29cd2927fb914cc53b5ba4f67d2b74695c994ba4 ]
+
+Jiri Slaby says:
+> I bisected to this ... as it breaks nfs3-only servers in 6.3.
+> I.e. /etc/nfs.conf containing:
+> [nfsd]
+> vers4=no
+>
+> The client sees:
+>  mount("10.0.2.15:/tmp", "/mnt", "nfs", 0, "vers=4.2,addr=10.0.2.15,clientad"...) = -1 EIO (Input/output error)
+>  write(2, "mount.nfs: mount system call fai"..., 45
+>  mount.nfs: mount system call failed for /mnt
+>
+> And the kernel says:
+>  nfs4_discover_server_trunking unhandled error -5. Exiting with error EIO
+
+Reported-by: Jiri Slaby <jirislaby@kernel.org>
+Link: https://bugzilla.suse.com/show_bug.cgi?id=1210995
+Fixes: 4bcf0343e8a6 ("SUNRPC: Set rq_accept_statp inside ->accept methods")
+Tested-by: Jiri Slaby <jirislaby@kernel.org>
+Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/sunrpc/svc.c | 17 +++++++++++------
+ 1 file changed, 11 insertions(+), 6 deletions(-)
+
+diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
+index fea7ce8fba14e..9874a6de1de3c 100644
+--- a/net/sunrpc/svc.c
++++ b/net/sunrpc/svc.c
+@@ -1382,7 +1382,7 @@ svc_process_common(struct svc_rqst *rqstp)
+       /* Only RPCv2 supported */
+       xdr_stream_encode_u32(xdr, RPC_VERSION);
+       xdr_stream_encode_u32(xdr, RPC_VERSION);
+-      goto sendit;
++      return 1;       /* don't wrap */
+ err_bad_auth:
+       dprintk("svc: authentication failed (%d)\n",
+@@ -1398,7 +1398,7 @@ svc_process_common(struct svc_rqst *rqstp)
+ err_bad_prog:
+       dprintk("svc: unknown program %d\n", rqstp->rq_prog);
+       serv->sv_stats->rpcbadfmt++;
+-      xdr_stream_encode_u32(xdr, RPC_PROG_UNAVAIL);
++      *rqstp->rq_accept_statp = rpc_prog_unavail;
+       goto sendit;
+ err_bad_vers:
+@@ -1406,7 +1406,12 @@ svc_process_common(struct svc_rqst *rqstp)
+                      rqstp->rq_vers, rqstp->rq_prog, progp->pg_name);
+       serv->sv_stats->rpcbadfmt++;
+-      xdr_stream_encode_u32(xdr, RPC_PROG_MISMATCH);
++      *rqstp->rq_accept_statp = rpc_prog_mismatch;
++
++      /*
++       * svc_authenticate() has already added the verifier and
++       * advanced the stream just past rq_accept_statp.
++       */
+       xdr_stream_encode_u32(xdr, process.mismatch.lovers);
+       xdr_stream_encode_u32(xdr, process.mismatch.hivers);
+       goto sendit;
+@@ -1415,19 +1420,19 @@ svc_process_common(struct svc_rqst *rqstp)
+       svc_printk(rqstp, "unknown procedure (%d)\n", rqstp->rq_proc);
+       serv->sv_stats->rpcbadfmt++;
+-      xdr_stream_encode_u32(xdr, RPC_PROC_UNAVAIL);
++      *rqstp->rq_accept_statp = rpc_proc_unavail;
+       goto sendit;
+ err_garbage_args:
+       svc_printk(rqstp, "failed to decode RPC header\n");
+       serv->sv_stats->rpcbadfmt++;
+-      xdr_stream_encode_u32(xdr, RPC_GARBAGE_ARGS);
++      *rqstp->rq_accept_statp = rpc_garbage_args;
+       goto sendit;
+ err_system_err:
+       serv->sv_stats->rpcbadfmt++;
+-      xdr_stream_encode_u32(xdr, RPC_SYSTEM_ERR);
++      *rqstp->rq_accept_statp = rpc_system_err;
+       goto sendit;
+ }
+-- 
+2.39.2
+
diff --git a/queue-6.3/sunrpc-fix-trace_svc_register-call-site.patch b/queue-6.3/sunrpc-fix-trace_svc_register-call-site.patch
new file mode 100644 (file)
index 0000000..c11908e
--- /dev/null
@@ -0,0 +1,35 @@
+From c951ce9cb8e30c6b5c1b7f11da6319d6bfe2ed35 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 May 2023 15:51:48 -0400
+Subject: SUNRPC: Fix trace_svc_register() call site
+
+From: Chuck Lever <chuck.lever@oracle.com>
+
+[ Upstream commit 07a27305938559fb35f7a46fb90a5e37728bdee6 ]
+
+The trace event recorded incorrect values for the registered family,
+protocol, and port because the arguments are in the wrong order.
+
+Fixes: b4af59328c25 ("SUNRPC: Trace server-side rpcbind registration events")
+Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/sunrpc/svc.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
+index 9874a6de1de3c..84d0b8798dfcc 100644
+--- a/net/sunrpc/svc.c
++++ b/net/sunrpc/svc.c
+@@ -1018,7 +1018,7 @@ static int __svc_register(struct net *net, const char *progname,
+ #endif
+       }
+-      trace_svc_register(progname, version, protocol, port, family, error);
++      trace_svc_register(progname, version, family, protocol, port, error);
+       return error;
+ }
+-- 
+2.39.2
+
diff --git a/queue-6.3/tcp-fix-possible-sk_priority-leak-in-tcp_v4_send_res.patch b/queue-6.3/tcp-fix-possible-sk_priority-leak-in-tcp_v4_send_res.patch
new file mode 100644 (file)
index 0000000..5d2c862
--- /dev/null
@@ -0,0 +1,62 @@
+From fd12f20ef833495c10dfd27e8ac6f71b1b284359 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 May 2023 11:47:49 +0000
+Subject: tcp: fix possible sk_priority leak in tcp_v4_send_reset()
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit 1e306ec49a1f206fd2cc89a42fac6e6f592a8cc1 ]
+
+When tcp_v4_send_reset() is called with @sk == NULL,
+we do not change ctl_sk->sk_priority, which could have been
+set from a prior invocation.
+
+Change tcp_v4_send_reset() to set sk_priority and sk_mark
+fields before calling ip_send_unicast_reply().
+
+This means tcp_v4_send_reset() and tcp_v4_send_ack()
+no longer have to clear ctl_sk->sk_mark after
+their call to ip_send_unicast_reply().
+
+Fixes: f6c0f5d209fa ("tcp: honor SO_PRIORITY in TIME_WAIT state")
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Cc: Antoine Tenart <atenart@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/tcp_ipv4.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
+index b9d55277cb858..c87958f979f0a 100644
+--- a/net/ipv4/tcp_ipv4.c
++++ b/net/ipv4/tcp_ipv4.c
+@@ -829,6 +829,9 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)
+                                  inet_twsk(sk)->tw_priority : sk->sk_priority;
+               transmit_time = tcp_transmit_time(sk);
+               xfrm_sk_clone_policy(ctl_sk, sk);
++      } else {
++              ctl_sk->sk_mark = 0;
++              ctl_sk->sk_priority = 0;
+       }
+       ip_send_unicast_reply(ctl_sk,
+                             skb, &TCP_SKB_CB(skb)->header.h4.opt,
+@@ -836,7 +839,6 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)
+                             &arg, arg.iov[0].iov_len,
+                             transmit_time);
+-      ctl_sk->sk_mark = 0;
+       xfrm_sk_free_policy(ctl_sk);
+       sock_net_set(ctl_sk, &init_net);
+       __TCP_INC_STATS(net, TCP_MIB_OUTSEGS);
+@@ -935,7 +937,6 @@ static void tcp_v4_send_ack(const struct sock *sk,
+                             &arg, arg.iov[0].iov_len,
+                             transmit_time);
+-      ctl_sk->sk_mark = 0;
+       sock_net_set(ctl_sk, &init_net);
+       __TCP_INC_STATS(net, TCP_MIB_OUTSEGS);
+       local_bh_enable();
+-- 
+2.39.2
+
diff --git a/queue-6.3/tipc-add-tipc_bearer_min_mtu-to-calculate-min-mtu.patch b/queue-6.3/tipc-add-tipc_bearer_min_mtu-to-calculate-min-mtu.patch
new file mode 100644 (file)
index 0000000..d23f846
--- /dev/null
@@ -0,0 +1,105 @@
+From fefe31ab613a73bf156ca4c9e356bad19b61c8a2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 May 2023 15:52:27 -0400
+Subject: tipc: add tipc_bearer_min_mtu to calculate min mtu
+
+From: Xin Long <lucien.xin@gmail.com>
+
+[ Upstream commit 3ae6d66b605be604644d4bb5708a7ffd9cf1abe8 ]
+
+As different media may requires different min mtu, and even the
+same media with different net family requires different min mtu,
+add tipc_bearer_min_mtu() to calculate min mtu accordingly.
+
+This API will be used to check the new mtu when doing the link
+mtu negotiation in the next patch.
+
+Signed-off-by: Xin Long <lucien.xin@gmail.com>
+Acked-by: Jon Maloy <jmaloy@redhat.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Stable-dep-of: 56077b56cd3f ("tipc: do not update mtu if msg_max is too small in mtu negotiation")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/tipc/bearer.c    | 13 +++++++++++++
+ net/tipc/bearer.h    |  3 +++
+ net/tipc/udp_media.c |  5 +++--
+ 3 files changed, 19 insertions(+), 2 deletions(-)
+
+diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
+index 35cac7733fd3a..0e9a29e1536b7 100644
+--- a/net/tipc/bearer.c
++++ b/net/tipc/bearer.c
+@@ -541,6 +541,19 @@ int tipc_bearer_mtu(struct net *net, u32 bearer_id)
+       return mtu;
+ }
++int tipc_bearer_min_mtu(struct net *net, u32 bearer_id)
++{
++      int mtu = TIPC_MIN_BEARER_MTU;
++      struct tipc_bearer *b;
++
++      rcu_read_lock();
++      b = bearer_get(net, bearer_id);
++      if (b)
++              mtu += b->encap_hlen;
++      rcu_read_unlock();
++      return mtu;
++}
++
+ /* tipc_bearer_xmit_skb - sends buffer to destination over bearer
+  */
+ void tipc_bearer_xmit_skb(struct net *net, u32 bearer_id,
+diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h
+index 490ad6e5f7a3c..bd0cc5c287ef8 100644
+--- a/net/tipc/bearer.h
++++ b/net/tipc/bearer.h
+@@ -146,6 +146,7 @@ struct tipc_media {
+  * @identity: array index of this bearer within TIPC bearer array
+  * @disc: ptr to link setup request
+  * @net_plane: network plane ('A' through 'H') currently associated with bearer
++ * @encap_hlen: encap headers length
+  * @up: bearer up flag (bit 0)
+  * @refcnt: tipc_bearer reference counter
+  *
+@@ -170,6 +171,7 @@ struct tipc_bearer {
+       u32 identity;
+       struct tipc_discoverer *disc;
+       char net_plane;
++      u16 encap_hlen;
+       unsigned long up;
+       refcount_t refcnt;
+ };
+@@ -232,6 +234,7 @@ int tipc_bearer_setup(void);
+ void tipc_bearer_cleanup(void);
+ void tipc_bearer_stop(struct net *net);
+ int tipc_bearer_mtu(struct net *net, u32 bearer_id);
++int tipc_bearer_min_mtu(struct net *net, u32 bearer_id);
+ bool tipc_bearer_bcast_support(struct net *net, u32 bearer_id);
+ void tipc_bearer_xmit_skb(struct net *net, u32 bearer_id,
+                         struct sk_buff *skb,
+diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c
+index c2bb818704c8f..0a85244fd6188 100644
+--- a/net/tipc/udp_media.c
++++ b/net/tipc/udp_media.c
+@@ -738,8 +738,8 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
+                       udp_conf.local_ip.s_addr = local.ipv4.s_addr;
+               udp_conf.use_udp_checksums = false;
+               ub->ifindex = dev->ifindex;
+-              if (tipc_mtu_bad(dev, sizeof(struct iphdr) +
+-                                    sizeof(struct udphdr))) {
++              b->encap_hlen = sizeof(struct iphdr) + sizeof(struct udphdr);
++              if (tipc_mtu_bad(dev, b->encap_hlen)) {
+                       err = -EINVAL;
+                       goto err;
+               }
+@@ -760,6 +760,7 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
+               else
+                       udp_conf.local_ip6 = local.ipv6;
+               ub->ifindex = dev->ifindex;
++              b->encap_hlen = sizeof(struct ipv6hdr) + sizeof(struct udphdr);
+               b->mtu = 1280;
+ #endif
+       } else {
+-- 
+2.39.2
+
diff --git a/queue-6.3/tipc-check-the-bearer-min-mtu-properly-when-setting-.patch b/queue-6.3/tipc-check-the-bearer-min-mtu-properly-when-setting-.patch
new file mode 100644 (file)
index 0000000..85616f8
--- /dev/null
@@ -0,0 +1,45 @@
+From 463952b9f8706109cb7b2aac03324c04e2e8c2b8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 May 2023 15:52:29 -0400
+Subject: tipc: check the bearer min mtu properly when setting it by netlink
+
+From: Xin Long <lucien.xin@gmail.com>
+
+[ Upstream commit 35a089b5d793d2bfd2cc7cfa6104545184de2ce7 ]
+
+Checking the bearer min mtu with tipc_udp_mtu_bad() only works for
+IPv4 UDP bearer, and IPv6 UDP bearer has a different value for the
+min mtu. This patch checks with encap_hlen + TIPC_MIN_BEARER_MTU
+for min mtu, which works for both IPv4 and IPv6 UDP bearer.
+
+Note that tipc_udp_mtu_bad() is still used to check media min mtu
+in __tipc_nl_media_set(), as m->mtu currently is only used by the
+IPv4 UDP bearer as its default mtu value.
+
+Fixes: 682cd3cf946b ("tipc: confgiure and apply UDP bearer MTU on running links")
+Signed-off-by: Xin Long <lucien.xin@gmail.com>
+Acked-by: Jon Maloy <jmaloy@redhat.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/tipc/bearer.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
+index 0e9a29e1536b7..53881406e2006 100644
+--- a/net/tipc/bearer.c
++++ b/net/tipc/bearer.c
+@@ -1151,8 +1151,8 @@ int __tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)
+                               return -EINVAL;
+                       }
+ #ifdef CONFIG_TIPC_MEDIA_UDP
+-                      if (tipc_udp_mtu_bad(nla_get_u32
+-                                           (props[TIPC_NLA_PROP_MTU]))) {
++                      if (nla_get_u32(props[TIPC_NLA_PROP_MTU]) <
++                          b->encap_hlen + TIPC_MIN_BEARER_MTU) {
+                               NL_SET_ERR_MSG(info->extack,
+                                              "MTU value is out-of-range");
+                               return -EINVAL;
+-- 
+2.39.2
+
diff --git a/queue-6.3/tipc-do-not-update-mtu-if-msg_max-is-too-small-in-mt.patch b/queue-6.3/tipc-do-not-update-mtu-if-msg_max-is-too-small-in-mt.patch
new file mode 100644 (file)
index 0000000..9b40e36
--- /dev/null
@@ -0,0 +1,92 @@
+From 246f062937dc1ef27d648ce808b17d990bff3832 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 May 2023 15:52:28 -0400
+Subject: tipc: do not update mtu if msg_max is too small in mtu negotiation
+
+From: Xin Long <lucien.xin@gmail.com>
+
+[ Upstream commit 56077b56cd3fb78e1c8619e29581ba25a5c55e86 ]
+
+When doing link mtu negotiation, a malicious peer may send Activate msg
+with a very small mtu, e.g. 4 in Shuang's testing, without checking for
+the minimum mtu, l->mtu will be set to 4 in tipc_link_proto_rcv(), then
+n->links[bearer_id].mtu is set to 4294967228, which is a overflow of
+'4 - INT_H_SIZE - EMSG_OVERHEAD' in tipc_link_mss().
+
+With tipc_link.mtu = 4, tipc_link_xmit() kept printing the warning:
+
+ tipc: Too large msg, purging xmit list 1 5 0 40 4!
+ tipc: Too large msg, purging xmit list 1 15 0 60 4!
+
+And with tipc_link_entry.mtu 4294967228, a huge skb was allocated in
+named_distribute(), and when purging it in tipc_link_xmit(), a crash
+was even caused:
+
+  general protection fault, probably for non-canonical address 0x2100001011000dd: 0000 [#1] PREEMPT SMP PTI
+  CPU: 0 PID: 0 Comm: swapper/0 Kdump: loaded Not tainted 6.3.0.neta #19
+  RIP: 0010:kfree_skb_list_reason+0x7e/0x1f0
+  Call Trace:
+   <IRQ>
+   skb_release_data+0xf9/0x1d0
+   kfree_skb_reason+0x40/0x100
+   tipc_link_xmit+0x57a/0x740 [tipc]
+   tipc_node_xmit+0x16c/0x5c0 [tipc]
+   tipc_named_node_up+0x27f/0x2c0 [tipc]
+   tipc_node_write_unlock+0x149/0x170 [tipc]
+   tipc_rcv+0x608/0x740 [tipc]
+   tipc_udp_recv+0xdc/0x1f0 [tipc]
+   udp_queue_rcv_one_skb+0x33e/0x620
+   udp_unicast_rcv_skb.isra.72+0x75/0x90
+   __udp4_lib_rcv+0x56d/0xc20
+   ip_protocol_deliver_rcu+0x100/0x2d0
+
+This patch fixes it by checking the new mtu against tipc_bearer_min_mtu(),
+and not updating mtu if it is too small.
+
+Fixes: ed193ece2649 ("tipc: simplify link mtu negotiation")
+Reported-by: Shuang Li <shuali@redhat.com>
+Signed-off-by: Xin Long <lucien.xin@gmail.com>
+Acked-by: Jon Maloy <jmaloy@redhat.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/tipc/link.c | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/net/tipc/link.c b/net/tipc/link.c
+index b3ce24823f503..2eff1c7949cbc 100644
+--- a/net/tipc/link.c
++++ b/net/tipc/link.c
+@@ -2200,7 +2200,7 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
+       struct tipc_msg *hdr = buf_msg(skb);
+       struct tipc_gap_ack_blks *ga = NULL;
+       bool reply = msg_probe(hdr), retransmitted = false;
+-      u32 dlen = msg_data_sz(hdr), glen = 0;
++      u32 dlen = msg_data_sz(hdr), glen = 0, msg_max;
+       u16 peers_snd_nxt =  msg_next_sent(hdr);
+       u16 peers_tol = msg_link_tolerance(hdr);
+       u16 peers_prio = msg_linkprio(hdr);
+@@ -2239,6 +2239,9 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
+       switch (mtyp) {
+       case RESET_MSG:
+       case ACTIVATE_MSG:
++              msg_max = msg_max_pkt(hdr);
++              if (msg_max < tipc_bearer_min_mtu(l->net, l->bearer_id))
++                      break;
+               /* Complete own link name with peer's interface name */
+               if_name =  strrchr(l->name, ':') + 1;
+               if (sizeof(l->name) - (if_name - l->name) <= TIPC_MAX_IF_NAME)
+@@ -2283,8 +2286,8 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
+               l->peer_session = msg_session(hdr);
+               l->in_session = true;
+               l->peer_bearer_id = msg_bearer_id(hdr);
+-              if (l->mtu > msg_max_pkt(hdr))
+-                      l->mtu = msg_max_pkt(hdr);
++              if (l->mtu > msg_max)
++                      l->mtu = msg_max;
+               break;
+       case STATE_MSG:
+-- 
+2.39.2
+
diff --git a/queue-6.3/tun-fix-memory-leak-for-detached-napi-queue.patch b/queue-6.3/tun-fix-memory-leak-for-detached-napi-queue.patch
new file mode 100644 (file)
index 0000000..dceda1f
--- /dev/null
@@ -0,0 +1,144 @@
+From 02610c4b38e2f4101c5ebbe0f83f119f9d516201 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 15 May 2023 11:42:04 -0700
+Subject: tun: Fix memory leak for detached NAPI queue.
+
+From: Kuniyuki Iwashima <kuniyu@amazon.com>
+
+[ Upstream commit 82b2bc279467c875ec36f8ef820f00997c2a4e8e ]
+
+syzkaller reported [0] memory leaks of sk and skb related to the TUN
+device with no repro, but we can reproduce it easily with:
+
+  struct ifreq ifr = {}
+  int fd_tun, fd_tmp;
+  char buf[4] = {};
+
+  fd_tun = openat(AT_FDCWD, "/dev/net/tun", O_WRONLY, 0);
+  ifr.ifr_flags = IFF_TUN | IFF_NAPI | IFF_MULTI_QUEUE;
+  ioctl(fd_tun, TUNSETIFF, &ifr);
+
+  ifr.ifr_flags = IFF_DETACH_QUEUE;
+  ioctl(fd_tun, TUNSETQUEUE, &ifr);
+
+  fd_tmp = socket(AF_PACKET, SOCK_PACKET, 0);
+  ifr.ifr_flags = IFF_UP;
+  ioctl(fd_tmp, SIOCSIFFLAGS, &ifr);
+
+  write(fd_tun, buf, sizeof(buf));
+  close(fd_tun);
+
+If we enable NAPI and multi-queue on a TUN device, we can put skb into
+tfile->sk.sk_write_queue after the queue is detached.  We should prevent
+it by checking tfile->detached before queuing skb.
+
+Note this must be done under tfile->sk.sk_write_queue.lock because write()
+and ioctl(IFF_DETACH_QUEUE) can run concurrently.  Otherwise, there would
+be a small race window:
+
+  write()                             ioctl(IFF_DETACH_QUEUE)
+  `- tun_get_user                     `- __tun_detach
+     |- if (tfile->detached)             |- tun_disable_queue
+     |  `-> false                        |  `- tfile->detached = tun
+     |                                   `- tun_queue_purge
+     |- spin_lock_bh(&queue->lock)
+     `- __skb_queue_tail(queue, skb)
+
+Another solution is to call tun_queue_purge() when closing and
+reattaching the detached queue, but it could paper over another
+problems.  Also, we do the same kind of test for IFF_NAPI_FRAGS.
+
+[0]:
+unreferenced object 0xffff88801edbc800 (size 2048):
+  comm "syz-executor.1", pid 33269, jiffies 4295743834 (age 18.756s)
+  hex dump (first 32 bytes):
+    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
+    00 00 07 40 00 00 00 00 00 00 00 00 00 00 00 00  ...@............
+  backtrace:
+    [<000000008c16ea3d>] __do_kmalloc_node mm/slab_common.c:965 [inline]
+    [<000000008c16ea3d>] __kmalloc+0x4a/0x130 mm/slab_common.c:979
+    [<000000003addde56>] kmalloc include/linux/slab.h:563 [inline]
+    [<000000003addde56>] sk_prot_alloc+0xef/0x1b0 net/core/sock.c:2035
+    [<000000003e20621f>] sk_alloc+0x36/0x2f0 net/core/sock.c:2088
+    [<0000000028e43843>] tun_chr_open+0x3d/0x190 drivers/net/tun.c:3438
+    [<000000001b0f1f28>] misc_open+0x1a6/0x1f0 drivers/char/misc.c:165
+    [<000000004376f706>] chrdev_open+0x111/0x300 fs/char_dev.c:414
+    [<00000000614d379f>] do_dentry_open+0x2f9/0x750 fs/open.c:920
+    [<000000008eb24774>] do_open fs/namei.c:3636 [inline]
+    [<000000008eb24774>] path_openat+0x143f/0x1a30 fs/namei.c:3791
+    [<00000000955077b5>] do_filp_open+0xce/0x1c0 fs/namei.c:3818
+    [<00000000b78973b0>] do_sys_openat2+0xf0/0x260 fs/open.c:1356
+    [<00000000057be699>] do_sys_open fs/open.c:1372 [inline]
+    [<00000000057be699>] __do_sys_openat fs/open.c:1388 [inline]
+    [<00000000057be699>] __se_sys_openat fs/open.c:1383 [inline]
+    [<00000000057be699>] __x64_sys_openat+0x83/0xf0 fs/open.c:1383
+    [<00000000a7d2182d>] do_syscall_x64 arch/x86/entry/common.c:50 [inline]
+    [<00000000a7d2182d>] do_syscall_64+0x3c/0x90 arch/x86/entry/common.c:80
+    [<000000004cc4e8c4>] entry_SYSCALL_64_after_hwframe+0x72/0xdc
+
+unreferenced object 0xffff88802f671700 (size 240):
+  comm "syz-executor.1", pid 33269, jiffies 4295743854 (age 18.736s)
+  hex dump (first 32 bytes):
+    68 c9 db 1e 80 88 ff ff 68 c9 db 1e 80 88 ff ff  h.......h.......
+    00 c0 7b 2f 80 88 ff ff 00 c8 db 1e 80 88 ff ff  ..{/............
+  backtrace:
+    [<00000000e9d9fdb6>] __alloc_skb+0x223/0x250 net/core/skbuff.c:644
+    [<000000002c3e4e0b>] alloc_skb include/linux/skbuff.h:1288 [inline]
+    [<000000002c3e4e0b>] alloc_skb_with_frags+0x6f/0x350 net/core/skbuff.c:6378
+    [<00000000825f98d7>] sock_alloc_send_pskb+0x3ac/0x3e0 net/core/sock.c:2729
+    [<00000000e9eb3df3>] tun_alloc_skb drivers/net/tun.c:1529 [inline]
+    [<00000000e9eb3df3>] tun_get_user+0x5e1/0x1f90 drivers/net/tun.c:1841
+    [<0000000053096912>] tun_chr_write_iter+0xac/0x120 drivers/net/tun.c:2035
+    [<00000000b9282ae0>] call_write_iter include/linux/fs.h:1868 [inline]
+    [<00000000b9282ae0>] new_sync_write fs/read_write.c:491 [inline]
+    [<00000000b9282ae0>] vfs_write+0x40f/0x530 fs/read_write.c:584
+    [<00000000524566e4>] ksys_write+0xa1/0x170 fs/read_write.c:637
+    [<00000000a7d2182d>] do_syscall_x64 arch/x86/entry/common.c:50 [inline]
+    [<00000000a7d2182d>] do_syscall_64+0x3c/0x90 arch/x86/entry/common.c:80
+    [<000000004cc4e8c4>] entry_SYSCALL_64_after_hwframe+0x72/0xdc
+
+Fixes: cde8b15f1aab ("tuntap: add ioctl to attach or detach a file form tuntap device")
+Reported-by: syzkaller <syzkaller@googlegroups.com>
+Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/tun.c | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+diff --git a/drivers/net/tun.c b/drivers/net/tun.c
+index ad653b32b2f00..44087db2a0595 100644
+--- a/drivers/net/tun.c
++++ b/drivers/net/tun.c
+@@ -1976,6 +1976,14 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
+               int queue_len;
+               spin_lock_bh(&queue->lock);
++
++              if (unlikely(tfile->detached)) {
++                      spin_unlock_bh(&queue->lock);
++                      rcu_read_unlock();
++                      err = -EBUSY;
++                      goto free_skb;
++              }
++
+               __skb_queue_tail(queue, skb);
+               queue_len = skb_queue_len(queue);
+               spin_unlock(&queue->lock);
+@@ -2511,6 +2519,13 @@ static int tun_xdp_one(struct tun_struct *tun,
+       if (tfile->napi_enabled) {
+               queue = &tfile->sk.sk_write_queue;
+               spin_lock(&queue->lock);
++
++              if (unlikely(tfile->detached)) {
++                      spin_unlock(&queue->lock);
++                      kfree_skb(skb);
++                      return -EBUSY;
++              }
++
+               __skb_queue_tail(queue, skb);
+               spin_unlock(&queue->lock);
+               ret = 1;
+-- 
+2.39.2
+
diff --git a/queue-6.3/virtio_net-fix-error-unwinding-of-xdp-initialization.patch b/queue-6.3/virtio_net-fix-error-unwinding-of-xdp-initialization.patch
new file mode 100644 (file)
index 0000000..a970ab7
--- /dev/null
@@ -0,0 +1,126 @@
+From 34dbb6ba0d2fa1c3a5743c1b6bfb6ee3da52a05e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 May 2023 11:18:12 -0400
+Subject: virtio_net: Fix error unwinding of XDP initialization
+
+From: Feng Liu <feliu@nvidia.com>
+
+[ Upstream commit 5306623a9826aa7d63b32c6a3803c798a765474d ]
+
+When initializing XDP in virtnet_open(), some rq xdp initialization
+may hit an error causing net device open failed. However, previous
+rqs have already initialized XDP and enabled NAPI, which is not the
+expected behavior. Need to roll back the previous rq initialization
+to avoid leaks in error unwinding of init code.
+
+Also extract helper functions of disable and enable queue pairs.
+Use newly introduced disable helper function in error unwinding and
+virtnet_close. Use enable helper function in virtnet_open.
+
+Fixes: 754b8a21a96d ("virtio_net: setup xdp_rxq_info")
+Signed-off-by: Feng Liu <feliu@nvidia.com>
+Reviewed-by: Jiri Pirko <jiri@nvidia.com>
+Reviewed-by: William Tu <witu@nvidia.com>
+Acked-by: Michael S. Tsirkin <mst@redhat.com>
+Acked-by: Jason Wang <jasowang@redhat.com>
+Reviewed-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
+Acked-by: Michael S. Tsirkin <mst@redhat.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/virtio_net.c | 61 +++++++++++++++++++++++++++++-----------
+ 1 file changed, 44 insertions(+), 17 deletions(-)
+
+diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
+index 744bdc8a1abd2..13ac7f1c7ae8c 100644
+--- a/drivers/net/virtio_net.c
++++ b/drivers/net/virtio_net.c
+@@ -1867,6 +1867,38 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
+       return received;
+ }
++static void virtnet_disable_queue_pair(struct virtnet_info *vi, int qp_index)
++{
++      virtnet_napi_tx_disable(&vi->sq[qp_index].napi);
++      napi_disable(&vi->rq[qp_index].napi);
++      xdp_rxq_info_unreg(&vi->rq[qp_index].xdp_rxq);
++}
++
++static int virtnet_enable_queue_pair(struct virtnet_info *vi, int qp_index)
++{
++      struct net_device *dev = vi->dev;
++      int err;
++
++      err = xdp_rxq_info_reg(&vi->rq[qp_index].xdp_rxq, dev, qp_index,
++                             vi->rq[qp_index].napi.napi_id);
++      if (err < 0)
++              return err;
++
++      err = xdp_rxq_info_reg_mem_model(&vi->rq[qp_index].xdp_rxq,
++                                       MEM_TYPE_PAGE_SHARED, NULL);
++      if (err < 0)
++              goto err_xdp_reg_mem_model;
++
++      virtnet_napi_enable(vi->rq[qp_index].vq, &vi->rq[qp_index].napi);
++      virtnet_napi_tx_enable(vi, vi->sq[qp_index].vq, &vi->sq[qp_index].napi);
++
++      return 0;
++
++err_xdp_reg_mem_model:
++      xdp_rxq_info_unreg(&vi->rq[qp_index].xdp_rxq);
++      return err;
++}
++
+ static int virtnet_open(struct net_device *dev)
+ {
+       struct virtnet_info *vi = netdev_priv(dev);
+@@ -1880,22 +1912,20 @@ static int virtnet_open(struct net_device *dev)
+                       if (!try_fill_recv(vi, &vi->rq[i], GFP_KERNEL))
+                               schedule_delayed_work(&vi->refill, 0);
+-              err = xdp_rxq_info_reg(&vi->rq[i].xdp_rxq, dev, i, vi->rq[i].napi.napi_id);
++              err = virtnet_enable_queue_pair(vi, i);
+               if (err < 0)
+-                      return err;
+-
+-              err = xdp_rxq_info_reg_mem_model(&vi->rq[i].xdp_rxq,
+-                                               MEM_TYPE_PAGE_SHARED, NULL);
+-              if (err < 0) {
+-                      xdp_rxq_info_unreg(&vi->rq[i].xdp_rxq);
+-                      return err;
+-              }
+-
+-              virtnet_napi_enable(vi->rq[i].vq, &vi->rq[i].napi);
+-              virtnet_napi_tx_enable(vi, vi->sq[i].vq, &vi->sq[i].napi);
++                      goto err_enable_qp;
+       }
+       return 0;
++
++err_enable_qp:
++      disable_delayed_refill(vi);
++      cancel_delayed_work_sync(&vi->refill);
++
++      for (i--; i >= 0; i--)
++              virtnet_disable_queue_pair(vi, i);
++      return err;
+ }
+ static int virtnet_poll_tx(struct napi_struct *napi, int budget)
+@@ -2304,11 +2334,8 @@ static int virtnet_close(struct net_device *dev)
+       /* Make sure refill_work doesn't re-enable napi! */
+       cancel_delayed_work_sync(&vi->refill);
+-      for (i = 0; i < vi->max_queue_pairs; i++) {
+-              virtnet_napi_tx_disable(&vi->sq[i].napi);
+-              napi_disable(&vi->rq[i].napi);
+-              xdp_rxq_info_unreg(&vi->rq[i].xdp_rxq);
+-      }
++      for (i = 0; i < vi->max_queue_pairs; i++)
++              virtnet_disable_queue_pair(vi, i);
+       return 0;
+ }
+-- 
+2.39.2
+
diff --git a/queue-6.3/vlan-fix-a-potential-uninit-value-in-vlan_dev_hard_s.patch b/queue-6.3/vlan-fix-a-potential-uninit-value-in-vlan_dev_hard_s.patch
new file mode 100644 (file)
index 0000000..bfb5508
--- /dev/null
@@ -0,0 +1,93 @@
+From 2f863eb60eaabeac814553fd73c2d47d08496236 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 16 May 2023 14:23:42 +0000
+Subject: vlan: fix a potential uninit-value in vlan_dev_hard_start_xmit()
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit dacab578c7c6cd06c50c89dfa36b0e0f10decd4e ]
+
+syzbot triggered the following splat [1], sending an empty message
+through pppoe_sendmsg().
+
+When VLAN_FLAG_REORDER_HDR flag is set, vlan_dev_hard_header()
+does not push extra bytes for the VLAN header, because vlan is offloaded.
+
+Unfortunately vlan_dev_hard_start_xmit() first reads veth->h_vlan_proto
+before testing (vlan->flags & VLAN_FLAG_REORDER_HDR).
+
+We need to swap the two conditions.
+
+[1]
+BUG: KMSAN: uninit-value in vlan_dev_hard_start_xmit+0x171/0x7f0 net/8021q/vlan_dev.c:111
+vlan_dev_hard_start_xmit+0x171/0x7f0 net/8021q/vlan_dev.c:111
+__netdev_start_xmit include/linux/netdevice.h:4883 [inline]
+netdev_start_xmit include/linux/netdevice.h:4897 [inline]
+xmit_one net/core/dev.c:3580 [inline]
+dev_hard_start_xmit+0x253/0xa20 net/core/dev.c:3596
+__dev_queue_xmit+0x3c7f/0x5ac0 net/core/dev.c:4246
+dev_queue_xmit include/linux/netdevice.h:3053 [inline]
+pppoe_sendmsg+0xa93/0xb80 drivers/net/ppp/pppoe.c:900
+sock_sendmsg_nosec net/socket.c:724 [inline]
+sock_sendmsg net/socket.c:747 [inline]
+____sys_sendmsg+0xa24/0xe40 net/socket.c:2501
+___sys_sendmsg+0x2a1/0x3f0 net/socket.c:2555
+__sys_sendmmsg+0x411/0xa50 net/socket.c:2641
+__do_sys_sendmmsg net/socket.c:2670 [inline]
+__se_sys_sendmmsg net/socket.c:2667 [inline]
+__x64_sys_sendmmsg+0xbc/0x120 net/socket.c:2667
+do_syscall_x64 arch/x86/entry/common.c:50 [inline]
+do_syscall_64+0x41/0xc0 arch/x86/entry/common.c:80
+entry_SYSCALL_64_after_hwframe+0x63/0xcd
+
+Uninit was created at:
+slab_post_alloc_hook+0x12d/0xb60 mm/slab.h:774
+slab_alloc_node mm/slub.c:3452 [inline]
+kmem_cache_alloc_node+0x543/0xab0 mm/slub.c:3497
+kmalloc_reserve+0x148/0x470 net/core/skbuff.c:520
+__alloc_skb+0x3a7/0x850 net/core/skbuff.c:606
+alloc_skb include/linux/skbuff.h:1277 [inline]
+sock_wmalloc+0xfe/0x1a0 net/core/sock.c:2583
+pppoe_sendmsg+0x3af/0xb80 drivers/net/ppp/pppoe.c:867
+sock_sendmsg_nosec net/socket.c:724 [inline]
+sock_sendmsg net/socket.c:747 [inline]
+____sys_sendmsg+0xa24/0xe40 net/socket.c:2501
+___sys_sendmsg+0x2a1/0x3f0 net/socket.c:2555
+__sys_sendmmsg+0x411/0xa50 net/socket.c:2641
+__do_sys_sendmmsg net/socket.c:2670 [inline]
+__se_sys_sendmmsg net/socket.c:2667 [inline]
+__x64_sys_sendmmsg+0xbc/0x120 net/socket.c:2667
+do_syscall_x64 arch/x86/entry/common.c:50 [inline]
+do_syscall_64+0x41/0xc0 arch/x86/entry/common.c:80
+entry_SYSCALL_64_after_hwframe+0x63/0xcd
+
+CPU: 0 PID: 29770 Comm: syz-executor.0 Not tainted 6.3.0-rc6-syzkaller-gc478e5b17829 #0
+Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/30/2023
+
+Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
+Reported-by: syzbot <syzkaller@googlegroups.com>
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/8021q/vlan_dev.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
+index 5920544e93e82..0fa52bcc296bf 100644
+--- a/net/8021q/vlan_dev.c
++++ b/net/8021q/vlan_dev.c
+@@ -108,8 +108,8 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
+        * NOTE: THIS ASSUMES DIX ETHERNET, SPECIFICALLY NOT SUPPORTING
+        * OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs...
+        */
+-      if (veth->h_vlan_proto != vlan->vlan_proto ||
+-          vlan->flags & VLAN_FLAG_REORDER_HDR) {
++      if (vlan->flags & VLAN_FLAG_REORDER_HDR ||
++          veth->h_vlan_proto != vlan->vlan_proto) {
+               u16 vlan_tci;
+               vlan_tci = vlan->vlan_id;
+               vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb->priority);
+-- 
+2.39.2
+
diff --git a/queue-6.3/vsock-avoid-to-close-connected-socket-after-the-time.patch b/queue-6.3/vsock-avoid-to-close-connected-socket-after-the-time.patch
new file mode 100644 (file)
index 0000000..c3f34c6
--- /dev/null
@@ -0,0 +1,54 @@
+From 3c10eb303ae1b03e6d9a8f000ebaaa5fb5677303 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 May 2023 19:34:30 +0800
+Subject: vsock: avoid to close connected socket after the timeout
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Zhuang Shengen <zhuangshengen@huawei.com>
+
+[ Upstream commit 6d4486efe9c69626cab423456169e250a5cd3af5 ]
+
+When client and server establish a connection through vsock,
+the client send a request to the server to initiate the connection,
+then start a timer to wait for the server's response. When the server's
+RESPONSE message arrives, the timer also times out and exits. The
+server's RESPONSE message is processed first, and the connection is
+established. However, the client's timer also times out, the original
+processing logic of the client is to directly set the state of this vsock
+to CLOSE and return ETIMEDOUT. It will not notify the server when the port
+is released, causing the server port remain.
+when client's vsock_connect timeout,it should check sk state is
+ESTABLISHED or not. if sk state is ESTABLISHED, it means the connection
+is established, the client should not set the sk state to CLOSE
+
+Note: I encountered this issue on kernel-4.18, which can be fixed by
+this patch. Then I checked the latest code in the community
+and found similar issue.
+
+Fixes: d021c344051a ("VSOCK: Introduce VM Sockets")
+Signed-off-by: Zhuang Shengen <zhuangshengen@huawei.com>
+Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/vmw_vsock/af_vsock.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
+index 19aea7cba26ef..5d48017482bca 100644
+--- a/net/vmw_vsock/af_vsock.c
++++ b/net/vmw_vsock/af_vsock.c
+@@ -1426,7 +1426,7 @@ static int vsock_connect(struct socket *sock, struct sockaddr *addr,
+                       vsock_transport_cancel_pkt(vsk);
+                       vsock_remove_connected(vsk);
+                       goto out_wait;
+-              } else if (timeout == 0) {
++              } else if ((sk->sk_state != TCP_ESTABLISHED) && (timeout == 0)) {
+                       err = -ETIMEDOUT;
+                       sk->sk_state = TCP_CLOSE;
+                       sock->state = SS_UNCONNECTED;
+-- 
+2.39.2
+
diff --git a/queue-6.3/wifi-cfg80211-drop-entries-with-invalid-bssids-in-rn.patch b/queue-6.3/wifi-cfg80211-drop-entries-with-invalid-bssids-in-rn.patch
new file mode 100644 (file)
index 0000000..db70a52
--- /dev/null
@@ -0,0 +1,49 @@
+From 4e5f5d0ee8d3572b6a5eb7fd7da05158beaf11fb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Apr 2023 10:32:24 +0300
+Subject: wifi: cfg80211: Drop entries with invalid BSSIDs in RNR
+
+From: Ilan Peer <ilan.peer@intel.com>
+
+[ Upstream commit 1b6b4ed01493b7ea2205ab83c49198f7d13ca9d2 ]
+
+Ignore AP information for entries that include an invalid
+BSSID in the TBTT information field, e.g., all zeros BSSIDs.
+
+Fixes: c8cb5b854b40 ("nl80211/cfg80211: support 6 GHz scanning")
+Signed-off-by: Ilan Peer <ilan.peer@intel.com>
+Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
+Link: https://lore.kernel.org/r/20230424103224.5e65d04d1448.Ic10c8577ae4a85272c407106c9d0a2ecb5372743@changeid
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/wireless/scan.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/net/wireless/scan.c b/net/wireless/scan.c
+index 790bc31cf82ea..b3829ed844f84 100644
+--- a/net/wireless/scan.c
++++ b/net/wireless/scan.c
+@@ -5,7 +5,7 @@
+  * Copyright 2008 Johannes Berg <johannes@sipsolutions.net>
+  * Copyright 2013-2014  Intel Mobile Communications GmbH
+  * Copyright 2016     Intel Deutschland GmbH
+- * Copyright (C) 2018-2022 Intel Corporation
++ * Copyright (C) 2018-2023 Intel Corporation
+  */
+ #include <linux/kernel.h>
+ #include <linux/slab.h>
+@@ -540,6 +540,10 @@ static int cfg80211_parse_ap_info(struct cfg80211_colocated_ap *entry,
+       /* skip the TBTT offset */
+       pos++;
++      /* ignore entries with invalid BSSID */
++      if (!is_valid_ether_addr(pos))
++              return -EINVAL;
++
+       memcpy(entry->bssid, pos, ETH_ALEN);
+       pos += ETH_ALEN;
+-- 
+2.39.2
+
diff --git a/queue-6.3/wifi-iwlwifi-fix-oem-s-name-in-the-ppag-approved-lis.patch b/queue-6.3/wifi-iwlwifi-fix-oem-s-name-in-the-ppag-approved-lis.patch
new file mode 100644 (file)
index 0000000..e124933
--- /dev/null
@@ -0,0 +1,37 @@
+From 2c4b96aaa32a642473de984d57d37b1fdce38cc4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 May 2023 12:15:51 +0300
+Subject: wifi: iwlwifi: fix OEM's name in the ppag approved list
+
+From: Alon Giladi <alon.giladi@intel.com>
+
+[ Upstream commit eca7296d9a671e9961834d2ace9cc0ce21fc15b3 ]
+
+Fix a spelling mistake.
+
+Fixes: e8e10a37c51c ("iwlwifi: acpi: move ppag code from mvm to fw/acpi")
+Signed-off-by: Alon Giladi <alon.giladi@intel.com>
+Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
+Link: https://lore.kernel.org/r/20230514120631.fdd07f36a8bf.I223e5fb16ab5c95d504c3fdaffd0bd70affad1c2@changeid
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wireless/intel/iwlwifi/fw/acpi.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/wireless/intel/iwlwifi/fw/acpi.c b/drivers/net/wireless/intel/iwlwifi/fw/acpi.c
+index a02e5a67b7066..585e8cd2d332d 100644
+--- a/drivers/net/wireless/intel/iwlwifi/fw/acpi.c
++++ b/drivers/net/wireless/intel/iwlwifi/fw/acpi.c
+@@ -38,7 +38,7 @@ static const struct dmi_system_id dmi_ppag_approved_list[] = {
+       },
+       { .ident = "ASUS",
+         .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTek COMPUTER INC."),
++                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+               },
+       },
+       {}
+-- 
+2.39.2
+
diff --git a/queue-6.3/wifi-iwlwifi-fw-fix-dbgi-dump.patch b/queue-6.3/wifi-iwlwifi-fw-fix-dbgi-dump.patch
new file mode 100644 (file)
index 0000000..3cdbf2a
--- /dev/null
@@ -0,0 +1,90 @@
+From 0b26e8d1e9cb4406d390860f3a0faaf2731437c1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 May 2023 12:15:48 +0300
+Subject: wifi: iwlwifi: fw: fix DBGI dump
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+[ Upstream commit d3ae69180bbd74bcbc03a2b6d10ed7eccbe98c23 ]
+
+The DBGI dump is (unsurprisingly) of type DBGI, not SRAM.
+This leads to bad register accesses because the union is
+built differently, there's no allocation ID, and thus the
+allocation ID ends up being 0x8000.
+
+Note that this was already wrong for DRAM vs. SMEM since
+they use different parts of the union, but the allocation
+ID is at the same place, so it worked.
+
+Fix all of this but set the allocation ID in a way that
+the offset calculation ends up without any offset.
+
+Fixes: 34bc27783a31 ("iwlwifi: yoyo: fix DBGI_SRAM ini dump header.")
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
+Link: https://lore.kernel.org/r/20230514120631.19a302ae4c65.I12272599f7c1930666157b9d5e7f81fe9ec4c421@changeid
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wireless/intel/iwlwifi/fw/dbg.c | 19 +++++++++++--------
+ 1 file changed, 11 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c
+index 027360e63b926..3ef0b776b7727 100644
+--- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c
++++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c
+@@ -1664,14 +1664,10 @@ static __le32 iwl_get_mon_reg(struct iwl_fw_runtime *fwrt, u32 alloc_id,
+ }
+ static void *
+-iwl_dump_ini_mon_fill_header(struct iwl_fw_runtime *fwrt,
+-                           struct iwl_dump_ini_region_data *reg_data,
++iwl_dump_ini_mon_fill_header(struct iwl_fw_runtime *fwrt, u32 alloc_id,
+                            struct iwl_fw_ini_monitor_dump *data,
+                            const struct iwl_fw_mon_regs *addrs)
+ {
+-      struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
+-      u32 alloc_id = le32_to_cpu(reg->dram_alloc_id);
+-
+       if (!iwl_trans_grab_nic_access(fwrt->trans)) {
+               IWL_ERR(fwrt, "Failed to get monitor header\n");
+               return NULL;
+@@ -1702,8 +1698,10 @@ iwl_dump_ini_mon_dram_fill_header(struct iwl_fw_runtime *fwrt,
+                                 void *data, u32 data_len)
+ {
+       struct iwl_fw_ini_monitor_dump *mon_dump = (void *)data;
++      struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
++      u32 alloc_id = le32_to_cpu(reg->dram_alloc_id);
+-      return iwl_dump_ini_mon_fill_header(fwrt, reg_data, mon_dump,
++      return iwl_dump_ini_mon_fill_header(fwrt, alloc_id, mon_dump,
+                                           &fwrt->trans->cfg->mon_dram_regs);
+ }
+@@ -1713,8 +1711,10 @@ iwl_dump_ini_mon_smem_fill_header(struct iwl_fw_runtime *fwrt,
+                                 void *data, u32 data_len)
+ {
+       struct iwl_fw_ini_monitor_dump *mon_dump = (void *)data;
++      struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
++      u32 alloc_id = le32_to_cpu(reg->internal_buffer.alloc_id);
+-      return iwl_dump_ini_mon_fill_header(fwrt, reg_data, mon_dump,
++      return iwl_dump_ini_mon_fill_header(fwrt, alloc_id, mon_dump,
+                                           &fwrt->trans->cfg->mon_smem_regs);
+ }
+@@ -1725,7 +1725,10 @@ iwl_dump_ini_mon_dbgi_fill_header(struct iwl_fw_runtime *fwrt,
+ {
+       struct iwl_fw_ini_monitor_dump *mon_dump = (void *)data;
+-      return iwl_dump_ini_mon_fill_header(fwrt, reg_data, mon_dump,
++      return iwl_dump_ini_mon_fill_header(fwrt,
++                                          /* no offset calculation later */
++                                          IWL_FW_INI_ALLOCATION_ID_DBGC1,
++                                          mon_dump,
+                                           &fwrt->trans->cfg->mon_dbgi_regs);
+ }
+-- 
+2.39.2
+
diff --git a/queue-6.3/wifi-iwlwifi-mvm-don-t-trust-firmware-n_channels.patch b/queue-6.3/wifi-iwlwifi-mvm-don-t-trust-firmware-n_channels.patch
new file mode 100644 (file)
index 0000000..82bcc6d
--- /dev/null
@@ -0,0 +1,60 @@
+From 6a4adfb8b0369c4f19eb776f58f4a727b5b0c126 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 May 2023 12:15:53 +0300
+Subject: wifi: iwlwifi: mvm: don't trust firmware n_channels
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+[ Upstream commit 682b6dc29d98e857e6ca4bbc077c7dc2899b7473 ]
+
+If the firmware sends us a corrupted MCC response with
+n_channels much larger than the command response can be,
+we might copy far too much (uninitialized) memory and
+even crash if the n_channels is large enough to make it
+run out of the one page allocated for the FW response.
+
+Fix that by checking the lengths. Doing a < comparison
+would be sufficient, but the firmware should be doing
+it correctly, so check more strictly.
+
+Fixes: dcaf9f5ecb6f ("iwlwifi: mvm: add MCC update FW API")
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
+Link: https://lore.kernel.org/r/20230514120631.d7b233139eb4.I51fd319df8e9d41881fc8450e83d78049518a79a@changeid
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wireless/intel/iwlwifi/mvm/nvm.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c b/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
+index 6d18a1fd649b9..fdf60afb0f3f2 100644
+--- a/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
++++ b/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
+@@ -445,6 +445,11 @@ iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2,
+               struct iwl_mcc_update_resp *mcc_resp = (void *)pkt->data;
+               n_channels =  __le32_to_cpu(mcc_resp->n_channels);
++              if (iwl_rx_packet_payload_len(pkt) !=
++                  struct_size(mcc_resp, channels, n_channels)) {
++                      resp_cp = ERR_PTR(-EINVAL);
++                      goto exit;
++              }
+               resp_len = sizeof(struct iwl_mcc_update_resp) +
+                          n_channels * sizeof(__le32);
+               resp_cp = kmemdup(mcc_resp, resp_len, GFP_KERNEL);
+@@ -456,6 +461,11 @@ iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2,
+               struct iwl_mcc_update_resp_v3 *mcc_resp_v3 = (void *)pkt->data;
+               n_channels =  __le32_to_cpu(mcc_resp_v3->n_channels);
++              if (iwl_rx_packet_payload_len(pkt) !=
++                  struct_size(mcc_resp_v3, channels, n_channels)) {
++                      resp_cp = ERR_PTR(-EINVAL);
++                      goto exit;
++              }
+               resp_len = sizeof(struct iwl_mcc_update_resp) +
+                          n_channels * sizeof(__le32);
+               resp_cp = kzalloc(resp_len, GFP_KERNEL);
+-- 
+2.39.2
+
diff --git a/queue-6.3/wifi-iwlwifi-mvm-fix-cancel_delayed_work_sync-deadlo.patch b/queue-6.3/wifi-iwlwifi-mvm-fix-cancel_delayed_work_sync-deadlo.patch
new file mode 100644 (file)
index 0000000..67c36da
--- /dev/null
@@ -0,0 +1,44 @@
+From 5cf13e5b77dfdb5da1c4685af95aef015b8e9b20 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 May 2023 12:15:46 +0300
+Subject: wifi: iwlwifi: mvm: fix cancel_delayed_work_sync() deadlock
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+[ Upstream commit c2d8b7f257b2398f2d866205365895e038beca12 ]
+
+Lockdep points out that we can deadlock here by calling
+cancel_delayed_work_sync() because that might be already
+running and gotten interrupted by the NAPI soft-IRQ.
+Even just calling something that can sleep is wrong in
+this context though.
+
+Luckily, it doesn't even really matter since the things
+we need to do are idempotent, so just drop the _sync().
+
+Fixes: e5d153ec54f0 ("iwlwifi: mvm: fix CSA AP side")
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
+Link: https://lore.kernel.org/r/20230514120631.b1813c823b4d.I9d20cc06d24fa40b6774d3dd95ea5e2bf8dd015b@changeid
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
+index e685113172c52..ad410b6efce73 100644
+--- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
++++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
+@@ -1967,7 +1967,7 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
+                               RCU_INIT_POINTER(mvm->csa_tx_blocked_vif, NULL);
+                               /* Unblock BCAST / MCAST station */
+                               iwl_mvm_modify_all_sta_disable_tx(mvm, mvmvif, false);
+-                              cancel_delayed_work_sync(&mvm->cs_tx_unblock_dwork);
++                              cancel_delayed_work(&mvm->cs_tx_unblock_dwork);
+                       }
+               }
+-- 
+2.39.2
+
diff --git a/queue-6.3/wifi-iwlwifi-mvm-fix-oem-s-name-in-the-tas-approved-.patch b/queue-6.3/wifi-iwlwifi-mvm-fix-oem-s-name-in-the-tas-approved-.patch
new file mode 100644 (file)
index 0000000..ab2a3cc
--- /dev/null
@@ -0,0 +1,37 @@
+From be5092697b57aceeae60744ed90ded32a8dedab0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 May 2023 12:15:52 +0300
+Subject: wifi: iwlwifi: mvm: fix OEM's name in the tas approved list
+
+From: Alon Giladi <alon.giladi@intel.com>
+
+[ Upstream commit d0246a0e49efee0f8649d0e4f2350614cdfe6565 ]
+
+Fix a spelling mistake.
+
+Fixes: 2856f623ce48 ("iwlwifi: mvm: Add list of OEMs allowed to use TAS")
+Signed-off-by: Alon Giladi <alon.giladi@intel.com>
+Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
+Link: https://lore.kernel.org/r/20230514120631.4090de6d1878.If9391ef6da78f1b2cc5eb6cb8f6965816bb7a7f5@changeid
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
+index 0c6b49fcb00d4..0ce0f228c9bdf 100644
+--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
++++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
+@@ -1076,7 +1076,7 @@ static const struct dmi_system_id dmi_tas_approved_list[] = {
+       },
+               { .ident = "LENOVO",
+         .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Lenovo"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+               },
+       },
+       { .ident = "DELL",
+-- 
+2.39.2
+
diff --git a/queue-6.3/wifi-mac80211-abort-running-color-change-when-stoppi.patch b/queue-6.3/wifi-mac80211-abort-running-color-change-when-stoppi.patch
new file mode 100644 (file)
index 0000000..0d0d549
--- /dev/null
@@ -0,0 +1,41 @@
+From 9c996886a419cd21d53657f963acbf96162ed03a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 May 2023 16:04:41 +0800
+Subject: wifi: mac80211: Abort running color change when stopping the AP
+
+From: Michael Lee <michael-cy.lee@mediatek.com>
+
+[ Upstream commit a23d7f5b2fbda114de60c4b53311e052281d7533 ]
+
+When stopping the AP, there might be a color change in progress. It
+should be deactivated here, or the driver might later finalize a color
+change on a stopped AP.
+
+Fixes: 5f9404abdf2a (mac80211: add support for BSS color change)
+Signed-off-by: Michael Lee <michael-cy.lee@mediatek.com>
+Link: https://lore.kernel.org/r/20230504080441.22958-1-michael-cy.lee@mediatek.com
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/mac80211/cfg.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
+index fb8d80ebe8bbb..5ddbe0c8cfaa1 100644
+--- a/net/mac80211/cfg.c
++++ b/net/mac80211/cfg.c
+@@ -1512,9 +1512,10 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev,
+               sdata_dereference(link->u.ap.unsol_bcast_probe_resp,
+                                 sdata);
+-      /* abort any running channel switch */
++      /* abort any running channel switch or color change */
+       mutex_lock(&local->mtx);
+       link_conf->csa_active = false;
++      link_conf->color_change_active = false;
+       if (link->csa_block_tx) {
+               ieee80211_wake_vif_queues(local, sdata,
+                                         IEEE80211_QUEUE_STOP_REASON_CSA);
+-- 
+2.39.2
+
diff --git a/queue-6.3/wifi-mac80211-fix-min-center-freq-offset-tracing.patch b/queue-6.3/wifi-mac80211-fix-min-center-freq-offset-tracing.patch
new file mode 100644 (file)
index 0000000..5d36998
--- /dev/null
@@ -0,0 +1,39 @@
+From 4c4467f05f7fc742ca7fa255d24939a853599220 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 May 2023 16:45:01 +0300
+Subject: wifi: mac80211: fix min center freq offset tracing
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+[ Upstream commit 248e4776514bf70236e6b1a54c65aa5324c8b1eb ]
+
+We need to set the correct trace variable, otherwise we're
+overwriting something else instead and the right one that
+we print later is not initialized.
+
+Fixes: b6011960f392 ("mac80211: handle channel frequency offset")
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
+Link: https://lore.kernel.org/r/20230504134511.828474-2-gregory.greenman@intel.com
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/mac80211/trace.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
+index 9f4377566c425..c85367a4757a9 100644
+--- a/net/mac80211/trace.h
++++ b/net/mac80211/trace.h
+@@ -67,7 +67,7 @@
+                       __entry->min_freq_offset = (c)->chan ? (c)->chan->freq_offset : 0;      \
+                       __entry->min_chan_width = (c)->width;                           \
+                       __entry->min_center_freq1 = (c)->center_freq1;                  \
+-                      __entry->freq1_offset = (c)->freq1_offset;                      \
++                      __entry->min_freq1_offset = (c)->freq1_offset;                  \
+                       __entry->min_center_freq2 = (c)->center_freq2;
+ #define MIN_CHANDEF_PR_FMT    " min_control:%d.%03d MHz min_width:%d min_center: %d.%03d/%d MHz"
+ #define MIN_CHANDEF_PR_ARG    __entry->min_control_freq, __entry->min_freq_offset,    \
+-- 
+2.39.2
+
diff --git a/queue-6.3/wifi-mac80211-fix-puncturing-bitmap-handling-in-__ie.patch b/queue-6.3/wifi-mac80211-fix-puncturing-bitmap-handling-in-__ie.patch
new file mode 100644 (file)
index 0000000..1daf68a
--- /dev/null
@@ -0,0 +1,52 @@
+From 2861a12602b79b42dbe5da31b5fe501f5e785bb4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Apr 2023 19:42:04 +0200
+Subject: wifi: mac80211: Fix puncturing bitmap handling in
+ __ieee80211_csa_finalize()
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ Upstream commit 13ad2b1eeacd48ec0f31f55964e6dc7dfc2c0299 ]
+
+'changed' can be OR'ed with BSS_CHANGED_EHT_PUNCTURING which is larger than
+an u32.
+So, turn 'changed' into an u64 and update ieee80211_set_after_csa_beacon()
+accordingly.
+
+In the commit in Fixes, only ieee80211_start_ap() was updated.
+
+Fixes: 2cc25e4b2a04 ("wifi: mac80211: configure puncturing bitmap")
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Reviewed-by: Simon Horman <simon.horman@corigine.com>
+Link: https://lore.kernel.org/r/e84a3f80fe536787f7a2c7180507efc36cd14f95.1682358088.git.christophe.jaillet@wanadoo.fr
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/mac80211/cfg.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
+index d3d861911ed65..fb8d80ebe8bbb 100644
+--- a/net/mac80211/cfg.c
++++ b/net/mac80211/cfg.c
+@@ -3502,7 +3502,7 @@ void ieee80211_channel_switch_disconnect(struct ieee80211_vif *vif, bool block_t
+ EXPORT_SYMBOL(ieee80211_channel_switch_disconnect);
+ static int ieee80211_set_after_csa_beacon(struct ieee80211_sub_if_data *sdata,
+-                                        u32 *changed)
++                                        u64 *changed)
+ {
+       int err;
+@@ -3545,7 +3545,7 @@ static int ieee80211_set_after_csa_beacon(struct ieee80211_sub_if_data *sdata,
+ static int __ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
+ {
+       struct ieee80211_local *local = sdata->local;
+-      u32 changed = 0;
++      u64 changed = 0;
+       int err;
+       sdata_assert_lock(sdata);
+-- 
+2.39.2
+
diff --git a/queue-6.3/wifi-mac80211-fortify-the-spinlock-against-deadlock-.patch b/queue-6.3/wifi-mac80211-fortify-the-spinlock-against-deadlock-.patch
new file mode 100644 (file)
index 0000000..6efb03d
--- /dev/null
@@ -0,0 +1,221 @@
+From 00b75722abf193d7179b1f3a4dabb389ac6173d7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 25 Apr 2023 18:40:08 +0200
+Subject: wifi: mac80211: fortify the spinlock against deadlock by interrupt
+
+From: Mirsad Goran Todorovac <mirsad.todorovac@alu.unizg.hr>
+
+[ Upstream commit ef6e1997da63ad0ac3fe33153fec9524c9ae56c9 ]
+
+In the function ieee80211_tx_dequeue() there is a particular locking
+sequence:
+
+begin:
+       spin_lock(&local->queue_stop_reason_lock);
+       q_stopped = local->queue_stop_reasons[q];
+       spin_unlock(&local->queue_stop_reason_lock);
+
+However small the chance (increased by ftracetest), an asynchronous
+interrupt can occur in between of spin_lock() and spin_unlock(),
+and the interrupt routine will attempt to lock the same
+&local->queue_stop_reason_lock again.
+
+This will cause a costly reset of the CPU and the wifi device or an
+altogether hang in the single CPU and single core scenario.
+
+The only remaining spin_lock(&local->queue_stop_reason_lock) that
+did not disable interrupts was patched, which should prevent any
+deadlocks on the same CPU/core and the same wifi device.
+
+This is the probable trace of the deadlock:
+
+kernel: ================================
+kernel: WARNING: inconsistent lock state
+kernel: 6.3.0-rc6-mt-20230401-00001-gf86822a1170f #4 Tainted: G        W
+kernel: --------------------------------
+kernel: inconsistent {IN-SOFTIRQ-W} -> {SOFTIRQ-ON-W} usage.
+kernel: kworker/5:0/25656 [HC0[0]:SC0[0]:HE1:SE1] takes:
+kernel: ffff9d6190779478 (&local->queue_stop_reason_lock){+.?.}-{2:2}, at: return_to_handler+0x0/0x40
+kernel: {IN-SOFTIRQ-W} state was registered at:
+kernel:   lock_acquire+0xc7/0x2d0
+kernel:   _raw_spin_lock+0x36/0x50
+kernel:   ieee80211_tx_dequeue+0xb4/0x1330 [mac80211]
+kernel:   iwl_mvm_mac_itxq_xmit+0xae/0x210 [iwlmvm]
+kernel:   iwl_mvm_mac_wake_tx_queue+0x2d/0xd0 [iwlmvm]
+kernel:   ieee80211_queue_skb+0x450/0x730 [mac80211]
+kernel:   __ieee80211_xmit_fast.constprop.66+0x834/0xa50 [mac80211]
+kernel:   __ieee80211_subif_start_xmit+0x217/0x530 [mac80211]
+kernel:   ieee80211_subif_start_xmit+0x60/0x580 [mac80211]
+kernel:   dev_hard_start_xmit+0xb5/0x260
+kernel:   __dev_queue_xmit+0xdbe/0x1200
+kernel:   neigh_resolve_output+0x166/0x260
+kernel:   ip_finish_output2+0x216/0xb80
+kernel:   __ip_finish_output+0x2a4/0x4d0
+kernel:   ip_finish_output+0x2d/0xd0
+kernel:   ip_output+0x82/0x2b0
+kernel:   ip_local_out+0xec/0x110
+kernel:   igmpv3_sendpack+0x5c/0x90
+kernel:   igmp_ifc_timer_expire+0x26e/0x4e0
+kernel:   call_timer_fn+0xa5/0x230
+kernel:   run_timer_softirq+0x27f/0x550
+kernel:   __do_softirq+0xb4/0x3a4
+kernel:   irq_exit_rcu+0x9b/0xc0
+kernel:   sysvec_apic_timer_interrupt+0x80/0xa0
+kernel:   asm_sysvec_apic_timer_interrupt+0x1f/0x30
+kernel:   _raw_spin_unlock_irqrestore+0x3f/0x70
+kernel:   free_to_partial_list+0x3d6/0x590
+kernel:   __slab_free+0x1b7/0x310
+kernel:   kmem_cache_free+0x52d/0x550
+kernel:   putname+0x5d/0x70
+kernel:   do_sys_openat2+0x1d7/0x310
+kernel:   do_sys_open+0x51/0x80
+kernel:   __x64_sys_openat+0x24/0x30
+kernel:   do_syscall_64+0x5c/0x90
+kernel:   entry_SYSCALL_64_after_hwframe+0x72/0xdc
+kernel: irq event stamp: 5120729
+kernel: hardirqs last  enabled at (5120729): [<ffffffff9d149936>] trace_graph_return+0xd6/0x120
+kernel: hardirqs last disabled at (5120728): [<ffffffff9d149950>] trace_graph_return+0xf0/0x120
+kernel: softirqs last  enabled at (5069900): [<ffffffff9cf65b60>] return_to_handler+0x0/0x40
+kernel: softirqs last disabled at (5067555): [<ffffffff9cf65b60>] return_to_handler+0x0/0x40
+kernel:
+        other info that might help us debug this:
+kernel:  Possible unsafe locking scenario:
+kernel:        CPU0
+kernel:        ----
+kernel:   lock(&local->queue_stop_reason_lock);
+kernel:   <Interrupt>
+kernel:     lock(&local->queue_stop_reason_lock);
+kernel:
+         *** DEADLOCK ***
+kernel: 8 locks held by kworker/5:0/25656:
+kernel:  #0: ffff9d618009d138 ((wq_completion)events_freezable){+.+.}-{0:0}, at: process_one_work+0x1ca/0x530
+kernel:  #1: ffffb1ef4637fe68 ((work_completion)(&local->restart_work)){+.+.}-{0:0}, at: process_one_work+0x1ce/0x530
+kernel:  #2: ffffffff9f166548 (rtnl_mutex){+.+.}-{3:3}, at: return_to_handler+0x0/0x40
+kernel:  #3: ffff9d6190778728 (&rdev->wiphy.mtx){+.+.}-{3:3}, at: return_to_handler+0x0/0x40
+kernel:  #4: ffff9d619077b480 (&mvm->mutex){+.+.}-{3:3}, at: return_to_handler+0x0/0x40
+kernel:  #5: ffff9d61907bacd8 (&trans_pcie->mutex){+.+.}-{3:3}, at: return_to_handler+0x0/0x40
+kernel:  #6: ffffffff9ef9cda0 (rcu_read_lock){....}-{1:2}, at: iwl_mvm_queue_state_change+0x59/0x3a0 [iwlmvm]
+kernel:  #7: ffffffff9ef9cda0 (rcu_read_lock){....}-{1:2}, at: iwl_mvm_mac_itxq_xmit+0x42/0x210 [iwlmvm]
+kernel:
+        stack backtrace:
+kernel: CPU: 5 PID: 25656 Comm: kworker/5:0 Tainted: G        W          6.3.0-rc6-mt-20230401-00001-gf86822a1170f #4
+kernel: Hardware name: LENOVO 82H8/LNVNB161216, BIOS GGCN51WW 11/16/2022
+kernel: Workqueue: events_freezable ieee80211_restart_work [mac80211]
+kernel: Call Trace:
+kernel:  <TASK>
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  dump_stack_lvl+0x5f/0xa0
+kernel:  dump_stack+0x14/0x20
+kernel:  print_usage_bug.part.46+0x208/0x2a0
+kernel:  mark_lock.part.47+0x605/0x630
+kernel:  ? sched_clock+0xd/0x20
+kernel:  ? trace_clock_local+0x14/0x30
+kernel:  ? __rb_reserve_next+0x5f/0x490
+kernel:  ? _raw_spin_lock+0x1b/0x50
+kernel:  __lock_acquire+0x464/0x1990
+kernel:  ? mark_held_locks+0x4e/0x80
+kernel:  lock_acquire+0xc7/0x2d0
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  ? ftrace_return_to_handler+0x8b/0x100
+kernel:  ? preempt_count_add+0x4/0x70
+kernel:  _raw_spin_lock+0x36/0x50
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  ieee80211_tx_dequeue+0xb4/0x1330 [mac80211]
+kernel:  ? prepare_ftrace_return+0xc5/0x190
+kernel:  ? ftrace_graph_func+0x16/0x20
+kernel:  ? 0xffffffffc02ab0b1
+kernel:  ? lock_acquire+0xc7/0x2d0
+kernel:  ? iwl_mvm_mac_itxq_xmit+0x42/0x210 [iwlmvm]
+kernel:  ? ieee80211_tx_dequeue+0x9/0x1330 [mac80211]
+kernel:  ? __rcu_read_lock+0x4/0x40
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  iwl_mvm_mac_itxq_xmit+0xae/0x210 [iwlmvm]
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  iwl_mvm_queue_state_change+0x311/0x3a0 [iwlmvm]
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  iwl_mvm_wake_sw_queue+0x17/0x20 [iwlmvm]
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  iwl_txq_gen2_unmap+0x1c9/0x1f0 [iwlwifi]
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  iwl_txq_gen2_free+0x55/0x130 [iwlwifi]
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  iwl_txq_gen2_tx_free+0x63/0x80 [iwlwifi]
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  _iwl_trans_pcie_gen2_stop_device+0x3f3/0x5b0 [iwlwifi]
+kernel:  ? _iwl_trans_pcie_gen2_stop_device+0x9/0x5b0 [iwlwifi]
+kernel:  ? mutex_lock_nested+0x4/0x30
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  iwl_trans_pcie_gen2_stop_device+0x5f/0x90 [iwlwifi]
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  iwl_mvm_stop_device+0x78/0xd0 [iwlmvm]
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  __iwl_mvm_mac_start+0x114/0x210 [iwlmvm]
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  iwl_mvm_mac_start+0x76/0x150 [iwlmvm]
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  drv_start+0x79/0x180 [mac80211]
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  ieee80211_reconfig+0x1523/0x1ce0 [mac80211]
+kernel:  ? synchronize_net+0x4/0x50
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  ieee80211_restart_work+0x108/0x170 [mac80211]
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  process_one_work+0x250/0x530
+kernel:  ? ftrace_regs_caller_end+0x66/0x66
+kernel:  worker_thread+0x48/0x3a0
+kernel:  ? __pfx_worker_thread+0x10/0x10
+kernel:  kthread+0x10f/0x140
+kernel:  ? __pfx_kthread+0x10/0x10
+kernel:  ret_from_fork+0x29/0x50
+kernel:  </TASK>
+
+Fixes: 4444bc2116ae ("wifi: mac80211: Proper mark iTXQs for resumption")
+Link: https://lore.kernel.org/all/1f58a0d1-d2b9-d851-73c3-93fcc607501c@alu.unizg.hr/
+Reported-by: Mirsad Goran Todorovac <mirsad.todorovac@alu.unizg.hr>
+Cc: Gregory Greenman <gregory.greenman@intel.com>
+Cc: Johannes Berg <johannes.berg@intel.com>
+Link: https://lore.kernel.org/all/cdc80531-f25f-6f9d-b15f-25e16130b53a@alu.unizg.hr/
+Cc: David S. Miller <davem@davemloft.net>
+Cc: Eric Dumazet <edumazet@google.com>
+Cc: Jakub Kicinski <kuba@kernel.org>
+Cc: Paolo Abeni <pabeni@redhat.com>
+Cc: Leon Romanovsky <leon@kernel.org>
+Cc: Alexander Wetzel <alexander@wetzel-home.de>
+Signed-off-by: Mirsad Goran Todorovac <mirsad.todorovac@alu.unizg.hr>
+Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
+Reviewed-by: tag, or it goes automatically?
+Link: https://lore.kernel.org/r/20230425164005.25272-1-mirsad.todorovac@alu.unizg.hr
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/mac80211/tx.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
+index 7699fb4106701..45cb8e7bcc613 100644
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -3781,6 +3781,7 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,
+       ieee80211_tx_result r;
+       struct ieee80211_vif *vif = txq->vif;
+       int q = vif->hw_queue[txq->ac];
++      unsigned long flags;
+       bool q_stopped;
+       WARN_ON_ONCE(softirq_count() == 0);
+@@ -3789,9 +3790,9 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,
+               return NULL;
+ begin:
+-      spin_lock(&local->queue_stop_reason_lock);
++      spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
+       q_stopped = local->queue_stop_reasons[q];
+-      spin_unlock(&local->queue_stop_reason_lock);
++      spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
+       if (unlikely(q_stopped)) {
+               /* mark for waking later */
+-- 
+2.39.2
+
diff --git a/queue-6.3/wifi-mt76-connac-fix-stats-tx_bytes-calculation.patch b/queue-6.3/wifi-mt76-connac-fix-stats-tx_bytes-calculation.patch
new file mode 100644 (file)
index 0000000..9e46e17
--- /dev/null
@@ -0,0 +1,51 @@
+From 5b9218969320ebb8327b6743b603b62ce681eb26 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Apr 2023 05:39:06 +0800
+Subject: wifi: mt76: connac: fix stats->tx_bytes calculation
+
+From: Ryder Lee <ryder.lee@mediatek.com>
+
+[ Upstream commit c7ab7a29ef5c0779574120d922256ce4651555d3 ]
+
+The stats->tx_bytes shall subtract retry byte from tx byte.
+
+Fixes: 43eaa3689507 ("wifi: mt76: add PPDU based TxS support for WED device")
+Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
+Signed-off-by: Kalle Valo <kvalo@kernel.org>
+Link: https://lore.kernel.org/r/b3cd45596943cf5a06b2e08e2fe732ab0b51311b.1682285873.git.ryder.lee@mediatek.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wireless/mediatek/mt76/mt76_connac2_mac.h | 2 +-
+ drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c  | 3 ++-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac2_mac.h b/drivers/net/wireless/mediatek/mt76/mt76_connac2_mac.h
+index f33171bcd3432..c3b692eac6f65 100644
+--- a/drivers/net/wireless/mediatek/mt76/mt76_connac2_mac.h
++++ b/drivers/net/wireless/mediatek/mt76/mt76_connac2_mac.h
+@@ -163,7 +163,7 @@ enum {
+ #define MT_TXS5_MPDU_TX_CNT           GENMASK(31, 23)
+ #define MT_TXS6_MPDU_FAIL_CNT         GENMASK(31, 23)
+-
++#define MT_TXS7_MPDU_RETRY_BYTE               GENMASK(22, 0)
+ #define MT_TXS7_MPDU_RETRY_CNT                GENMASK(31, 23)
+ /* RXD DW1 */
+diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
+index 82aac0a04655f..e57eade24ae56 100644
+--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
++++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
+@@ -576,7 +576,8 @@ bool mt76_connac2_mac_fill_txs(struct mt76_dev *dev, struct mt76_wcid *wcid,
+       /* PPDU based reporting */
+       if (FIELD_GET(MT_TXS0_TXS_FORMAT, txs) > 1) {
+               stats->tx_bytes +=
+-                      le32_get_bits(txs_data[5], MT_TXS5_MPDU_TX_BYTE);
++                      le32_get_bits(txs_data[5], MT_TXS5_MPDU_TX_BYTE) -
++                      le32_get_bits(txs_data[7], MT_TXS7_MPDU_RETRY_BYTE);
+               stats->tx_packets +=
+                       le32_get_bits(txs_data[5], MT_TXS5_MPDU_TX_CNT);
+               stats->tx_failed +=
+-- 
+2.39.2
+
diff --git a/queue-6.3/xfrm-don-t-check-the-default-policy-if-the-policy-al.patch b/queue-6.3/xfrm-don-t-check-the-default-policy-if-the-policy-al.patch
new file mode 100644 (file)
index 0000000..c88b9a4
--- /dev/null
@@ -0,0 +1,49 @@
+From 2b6d04791fa311d8e66ecb99cefb33f342a664cd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 4 Apr 2023 15:12:16 +0200
+Subject: xfrm: don't check the default policy if the policy allows the packet
+
+From: Sabrina Dubroca <sd@queasysnail.net>
+
+[ Upstream commit 430cac487400494c19a8b85299e979bb07b4671f ]
+
+The current code doesn't let a simple "allow" policy counteract a
+default policy blocking all incoming packets:
+
+    ip x p setdefault in block
+    ip x p a src 192.168.2.1/32 dst 192.168.2.2/32 dir in action allow
+
+At this stage, we have an allow policy (with or without transforms)
+for this packet. It doesn't matter what the default policy says, since
+the policy we looked up lets the packet through. The case of a
+blocking policy is already handled separately, so we can remove this
+check.
+
+Fixes: 2d151d39073a ("xfrm: Add possibility to set the default to block if we have no policy")
+Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
+Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/xfrm/xfrm_policy.c | 6 ------
+ 1 file changed, 6 deletions(-)
+
+diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
+index 5c61ec04b839b..62be042f2ebcd 100644
+--- a/net/xfrm/xfrm_policy.c
++++ b/net/xfrm/xfrm_policy.c
+@@ -3712,12 +3712,6 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,
+               }
+               xfrm_nr = ti;
+-              if (net->xfrm.policy_default[dir] == XFRM_USERPOLICY_BLOCK &&
+-                  !xfrm_nr) {
+-                      XFRM_INC_STATS(net, LINUX_MIB_XFRMINNOSTATES);
+-                      goto reject;
+-              }
+-
+               if (npols > 1) {
+                       xfrm_tmpl_sort(stp, tpp, xfrm_nr, family);
+                       tpp = stp;
+-- 
+2.39.2
+
diff --git a/queue-6.3/xfrm-fix-leak-of-dev-tracker.patch b/queue-6.3/xfrm-fix-leak-of-dev-tracker.patch
new file mode 100644 (file)
index 0000000..d1f6af8
--- /dev/null
@@ -0,0 +1,38 @@
+From 7218a13249eaed1ce716e8614b026465b3e55e1f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 19 Apr 2023 15:19:08 +0300
+Subject: xfrm: Fix leak of dev tracker
+
+From: Leon Romanovsky <leonro@nvidia.com>
+
+[ Upstream commit ec8f32ad9a65a8cbb465b69e154aaec9d2fe45c4 ]
+
+At the stage of direction checks, the netdev reference tracker is
+already initialized, but released with wrong *_put() call.
+
+Fixes: 919e43fad516 ("xfrm: add an interface to offload policy")
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Reviewed-by: Simon Horman <simon.horman@corigine.com>
+Reviewed-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/xfrm/xfrm_device.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/net/xfrm/xfrm_device.c b/net/xfrm/xfrm_device.c
+index 95f1436bf6a2e..e2ca50bfca24f 100644
+--- a/net/xfrm/xfrm_device.c
++++ b/net/xfrm/xfrm_device.c
+@@ -378,7 +378,7 @@ int xfrm_dev_policy_add(struct net *net, struct xfrm_policy *xp,
+               break;
+       default:
+               xdo->dev = NULL;
+-              dev_put(dev);
++              netdev_put(dev, &xdo->dev_tracker);
+               NL_SET_ERR_MSG(extack, "Unrecognized offload direction");
+               return -EINVAL;
+       }
+-- 
+2.39.2
+
diff --git a/queue-6.3/xfrm-reject-optional-tunnel-beet-mode-templates-in-o.patch b/queue-6.3/xfrm-reject-optional-tunnel-beet-mode-templates-in-o.patch
new file mode 100644 (file)
index 0000000..440e755
--- /dev/null
@@ -0,0 +1,92 @@
+From 49081db475ee0511d01931eb6c8fa37e3ff78f7a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 9 May 2023 10:59:58 +0200
+Subject: xfrm: Reject optional tunnel/BEET mode templates in outbound policies
+
+From: Tobias Brunner <tobias@strongswan.org>
+
+[ Upstream commit 3d776e31c841ba2f69895d2255a49320bec7cea6 ]
+
+xfrm_state_find() uses `encap_family` of the current template with
+the passed local and remote addresses to find a matching state.
+If an optional tunnel or BEET mode template is skipped in a mixed-family
+scenario, there could be a mismatch causing an out-of-bounds read as
+the addresses were not replaced to match the family of the next template.
+
+While there are theoretical use cases for optional templates in outbound
+policies, the only practical one is to skip IPComp states in inbound
+policies if uncompressed packets are received that are handled by an
+implicitly created IPIP state instead.
+
+Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
+Signed-off-by: Tobias Brunner <tobias@strongswan.org>
+Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/xfrm/xfrm_user.c | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
+index af8fbcbfbe691..6794b9dea27aa 100644
+--- a/net/xfrm/xfrm_user.c
++++ b/net/xfrm/xfrm_user.c
+@@ -1768,7 +1768,7 @@ static void copy_templates(struct xfrm_policy *xp, struct xfrm_user_tmpl *ut,
+ }
+ static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family,
+-                       struct netlink_ext_ack *extack)
++                       int dir, struct netlink_ext_ack *extack)
+ {
+       u16 prev_family;
+       int i;
+@@ -1794,6 +1794,10 @@ static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family,
+               switch (ut[i].mode) {
+               case XFRM_MODE_TUNNEL:
+               case XFRM_MODE_BEET:
++                      if (ut[i].optional && dir == XFRM_POLICY_OUT) {
++                              NL_SET_ERR_MSG(extack, "Mode in optional template not allowed in outbound policy");
++                              return -EINVAL;
++                      }
+                       break;
+               default:
+                       if (ut[i].family != prev_family) {
+@@ -1831,7 +1835,7 @@ static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family,
+ }
+ static int copy_from_user_tmpl(struct xfrm_policy *pol, struct nlattr **attrs,
+-                             struct netlink_ext_ack *extack)
++                             int dir, struct netlink_ext_ack *extack)
+ {
+       struct nlattr *rt = attrs[XFRMA_TMPL];
+@@ -1842,7 +1846,7 @@ static int copy_from_user_tmpl(struct xfrm_policy *pol, struct nlattr **attrs,
+               int nr = nla_len(rt) / sizeof(*utmpl);
+               int err;
+-              err = validate_tmpl(nr, utmpl, pol->family, extack);
++              err = validate_tmpl(nr, utmpl, pol->family, dir, extack);
+               if (err)
+                       return err;
+@@ -1919,7 +1923,7 @@ static struct xfrm_policy *xfrm_policy_construct(struct net *net,
+       if (err)
+               goto error;
+-      if (!(err = copy_from_user_tmpl(xp, attrs, extack)))
++      if (!(err = copy_from_user_tmpl(xp, attrs, p->dir, extack)))
+               err = copy_from_user_sec_ctx(xp, attrs);
+       if (err)
+               goto error;
+@@ -3498,7 +3502,7 @@ static struct xfrm_policy *xfrm_compile_policy(struct sock *sk, int opt,
+               return NULL;
+       nr = ((len - sizeof(*p)) / sizeof(*ut));
+-      if (validate_tmpl(nr, ut, p->sel.family, NULL))
++      if (validate_tmpl(nr, ut, p->sel.family, p->dir, NULL))
+               return NULL;
+       if (p->dir > XFRM_POLICY_OUT)
+-- 
+2.39.2
+
diff --git a/queue-6.3/xfrm-release-all-offloaded-policy-memory.patch b/queue-6.3/xfrm-release-all-offloaded-policy-memory.patch
new file mode 100644 (file)
index 0000000..fae9621
--- /dev/null
@@ -0,0 +1,60 @@
+From cf9209cde032ec21bbf4d452d7747dee01f05edb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 19 Apr 2023 15:19:07 +0300
+Subject: xfrm: release all offloaded policy memory
+
+From: Leon Romanovsky <leonro@nvidia.com>
+
+[ Upstream commit 94b95dfaa814f565d92f5a65f0ff12a483095522 ]
+
+Failure to add offloaded policy will cause to the following
+error once user will try to reload driver.
+
+Unregister_netdevice: waiting for eth3 to become free. Usage count = 2
+
+This was caused by xfrm_dev_policy_add() which increments reference
+to net_device. That reference was supposed to be decremented
+in xfrm_dev_policy_free(). However the latter wasn't called.
+
+ unregister_netdevice: waiting for eth3 to become free. Usage count = 2
+ leaked reference.
+  xfrm_dev_policy_add+0xff/0x3d0
+  xfrm_policy_construct+0x352/0x420
+  xfrm_add_policy+0x179/0x320
+  xfrm_user_rcv_msg+0x1d2/0x3d0
+  netlink_rcv_skb+0xe0/0x210
+  xfrm_netlink_rcv+0x45/0x50
+  netlink_unicast+0x346/0x490
+  netlink_sendmsg+0x3b0/0x6c0
+  sock_sendmsg+0x73/0xc0
+  sock_write_iter+0x13b/0x1f0
+  vfs_write+0x528/0x5d0
+  ksys_write+0x120/0x150
+  do_syscall_64+0x3d/0x90
+  entry_SYSCALL_64_after_hwframe+0x46/0xb0
+
+Fixes: 919e43fad516 ("xfrm: add an interface to offload policy")
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Reviewed-by: Simon Horman <simon.horman@corigine.com>
+Reviewed-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/xfrm/xfrm_user.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
+index 103af2b3e986f..af8fbcbfbe691 100644
+--- a/net/xfrm/xfrm_user.c
++++ b/net/xfrm/xfrm_user.c
+@@ -1978,6 +1978,7 @@ static int xfrm_add_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
+       if (err) {
+               xfrm_dev_policy_delete(xp);
++              xfrm_dev_policy_free(xp);
+               security_xfrm_policy_free(xp->security);
+               kfree(xp);
+               return err;
+-- 
+2.39.2
+