]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Jul 2023 07:40:41 +0000 (09:40 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Jul 2023 07:40:41 +0000 (09:40 +0200)
added patches:
drm-amd-align-smu11-smu_msg_overridepcieparameters-implementation-with-smu13.patch
drm-amd-disable-psr-su-on-parade-0803-tcon.patch
drm-amd-display-add-a-null-pointer-check.patch
drm-amd-display-add-monitor-specific-edid-quirk.patch
drm-amd-display-correct-dmub_fw_version-macro.patch
drm-amd-display-disable-seamless-boot-if-force_odm_combine-is-enabled.patch
drm-amd-display-edp-do-not-add-non-edid-timings.patch
drm-amd-display-fix-128b132b-link-loss-handling.patch
drm-amd-display-fix-in-secure-display-context-creation.patch
drm-amd-display-fix-seamless-odm-transitions.patch
drm-amd-display-limit-dcn32-8-channel-or-less-parts-to-dpm1-for-fpo.patch
drm-amd-display-remove-phantom-pipe-check-when-calculating-k1-and-k2.patch
drm-amd-pm-fix-smu-i2c-data-read-risk.patch
drm-amdgpu-avoid-restore-process-run-into-dead-loop.patch
drm-amdgpu-fix-clearing-mappings-for-bos-that-are-always-valid-in-vm.patch
drm-ttm-don-t-leak-a-resource-on-eviction-error.patch
drm-ttm-don-t-leak-a-resource-on-swapout-move-error.patch
drm-ttm-fix-bulk_move-corruption-when-adding-a-entry.patch
drm-ttm-never-consider-pinned-bos-for-eviction-swap.patch
firmware-stratix10-svc-fix-a-potential-resource-leak-in-svc_create_memory_pool.patch
serial-atmel-don-t-enable-irqs-prematurely.patch
tty-fix-hang-on-tty-device-with-no_room-set.patch
tty-serial-imx-fix-rs485-rx-after-tx.patch
tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-in-case-of-error.patch
tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-when-iterating-clk.patch

26 files changed:
queue-6.4/drm-amd-align-smu11-smu_msg_overridepcieparameters-implementation-with-smu13.patch [new file with mode: 0644]
queue-6.4/drm-amd-disable-psr-su-on-parade-0803-tcon.patch [new file with mode: 0644]
queue-6.4/drm-amd-display-add-a-null-pointer-check.patch [new file with mode: 0644]
queue-6.4/drm-amd-display-add-monitor-specific-edid-quirk.patch [new file with mode: 0644]
queue-6.4/drm-amd-display-correct-dmub_fw_version-macro.patch [new file with mode: 0644]
queue-6.4/drm-amd-display-disable-seamless-boot-if-force_odm_combine-is-enabled.patch [new file with mode: 0644]
queue-6.4/drm-amd-display-edp-do-not-add-non-edid-timings.patch [new file with mode: 0644]
queue-6.4/drm-amd-display-fix-128b132b-link-loss-handling.patch [new file with mode: 0644]
queue-6.4/drm-amd-display-fix-in-secure-display-context-creation.patch [new file with mode: 0644]
queue-6.4/drm-amd-display-fix-seamless-odm-transitions.patch [new file with mode: 0644]
queue-6.4/drm-amd-display-limit-dcn32-8-channel-or-less-parts-to-dpm1-for-fpo.patch [new file with mode: 0644]
queue-6.4/drm-amd-display-remove-phantom-pipe-check-when-calculating-k1-and-k2.patch [new file with mode: 0644]
queue-6.4/drm-amd-pm-fix-smu-i2c-data-read-risk.patch [new file with mode: 0644]
queue-6.4/drm-amdgpu-avoid-restore-process-run-into-dead-loop.patch [new file with mode: 0644]
queue-6.4/drm-amdgpu-fix-clearing-mappings-for-bos-that-are-always-valid-in-vm.patch [new file with mode: 0644]
queue-6.4/drm-ttm-don-t-leak-a-resource-on-eviction-error.patch [new file with mode: 0644]
queue-6.4/drm-ttm-don-t-leak-a-resource-on-swapout-move-error.patch [new file with mode: 0644]
queue-6.4/drm-ttm-fix-bulk_move-corruption-when-adding-a-entry.patch [new file with mode: 0644]
queue-6.4/drm-ttm-never-consider-pinned-bos-for-eviction-swap.patch [new file with mode: 0644]
queue-6.4/firmware-stratix10-svc-fix-a-potential-resource-leak-in-svc_create_memory_pool.patch [new file with mode: 0644]
queue-6.4/serial-atmel-don-t-enable-irqs-prematurely.patch [new file with mode: 0644]
queue-6.4/series
queue-6.4/tty-fix-hang-on-tty-device-with-no_room-set.patch [new file with mode: 0644]
queue-6.4/tty-serial-imx-fix-rs485-rx-after-tx.patch [new file with mode: 0644]
queue-6.4/tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-in-case-of-error.patch [new file with mode: 0644]
queue-6.4/tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-when-iterating-clk.patch [new file with mode: 0644]

diff --git a/queue-6.4/drm-amd-align-smu11-smu_msg_overridepcieparameters-implementation-with-smu13.patch b/queue-6.4/drm-amd-align-smu11-smu_msg_overridepcieparameters-implementation-with-smu13.patch
new file mode 100644 (file)
index 0000000..79e3772
--- /dev/null
@@ -0,0 +1,137 @@
+From e701156ccc6c7a5f104a968dda74cd6434178712 Mon Sep 17 00:00:00 2001
+From: Mario Limonciello <mario.limonciello@amd.com>
+Date: Fri, 7 Jul 2023 21:26:09 -0500
+Subject: drm/amd: Align SMU11 SMU_MSG_OverridePcieParameters implementation with SMU13
+
+From: Mario Limonciello <mario.limonciello@amd.com>
+
+commit e701156ccc6c7a5f104a968dda74cd6434178712 upstream.
+
+SMU13 overrides dynamic PCIe lane width and dynamic speed by when on
+certain hosts. commit 38e4ced80479 ("drm/amd/pm: conditionally disable
+pcie lane switching for some sienna_cichlid SKUs") worked around this
+issue by setting up certain SKUs to set up certain limits, but the same
+fundamental problem with those hosts affects all SMU11 implmentations
+as well, so align the SMU11 and SMU13 driver handling.
+
+Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
+Reviewed-by: Evan Quan <evan.quan@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Cc: stable@vger.kernel.org # 6.1.x
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c |   93 +++-------------
+ 1 file changed, 20 insertions(+), 73 deletions(-)
+
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+@@ -2077,89 +2077,36 @@ static int sienna_cichlid_display_disabl
+       return ret;
+ }
+-static void sienna_cichlid_get_override_pcie_settings(struct smu_context *smu,
+-                                                    uint32_t *gen_speed_override,
+-                                                    uint32_t *lane_width_override)
+-{
+-      struct amdgpu_device *adev = smu->adev;
+-
+-      *gen_speed_override = 0xff;
+-      *lane_width_override = 0xff;
+-
+-      switch (adev->pdev->device) {
+-      case 0x73A0:
+-      case 0x73A1:
+-      case 0x73A2:
+-      case 0x73A3:
+-      case 0x73AB:
+-      case 0x73AE:
+-              /* Bit 7:0: PCIE lane width, 1 to 7 corresponds is x1 to x32 */
+-              *lane_width_override = 6;
+-              break;
+-      case 0x73E0:
+-      case 0x73E1:
+-      case 0x73E3:
+-              *lane_width_override = 4;
+-              break;
+-      case 0x7420:
+-      case 0x7421:
+-      case 0x7422:
+-      case 0x7423:
+-      case 0x7424:
+-              *lane_width_override = 3;
+-              break;
+-      default:
+-              break;
+-      }
+-}
+-
+-#define MAX(a, b)     ((a) > (b) ? (a) : (b))
+-
+ static int sienna_cichlid_update_pcie_parameters(struct smu_context *smu,
+                                        uint32_t pcie_gen_cap,
+                                        uint32_t pcie_width_cap)
+ {
+       struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
+       struct smu_11_0_pcie_table *pcie_table = &dpm_context->dpm_tables.pcie_table;
+-      uint32_t gen_speed_override, lane_width_override;
+-      uint8_t *table_member1, *table_member2;
+-      uint32_t min_gen_speed, max_gen_speed;
+-      uint32_t min_lane_width, max_lane_width;
+-      uint32_t smu_pcie_arg;
++      u32 smu_pcie_arg;
+       int ret, i;
+-      GET_PPTABLE_MEMBER(PcieGenSpeed, &table_member1);
+-      GET_PPTABLE_MEMBER(PcieLaneCount, &table_member2);
+-
+-      sienna_cichlid_get_override_pcie_settings(smu,
+-                                                &gen_speed_override,
+-                                                &lane_width_override);
+-
+-      /* PCIE gen speed override */
+-      if (gen_speed_override != 0xff) {
+-              min_gen_speed = MIN(pcie_gen_cap, gen_speed_override);
+-              max_gen_speed = MIN(pcie_gen_cap, gen_speed_override);
+-      } else {
+-              min_gen_speed = MAX(0, table_member1[0]);
+-              max_gen_speed = MIN(pcie_gen_cap, table_member1[1]);
+-              min_gen_speed = min_gen_speed > max_gen_speed ?
+-                              max_gen_speed : min_gen_speed;
+-      }
+-      pcie_table->pcie_gen[0] = min_gen_speed;
+-      pcie_table->pcie_gen[1] = max_gen_speed;
+-
+-      /* PCIE lane width override */
+-      if (lane_width_override != 0xff) {
+-              min_lane_width = MIN(pcie_width_cap, lane_width_override);
+-              max_lane_width = MIN(pcie_width_cap, lane_width_override);
++      /* PCIE gen speed and lane width override */
++      if (!amdgpu_device_pcie_dynamic_switching_supported()) {
++              if (pcie_table->pcie_gen[NUM_LINK_LEVELS - 1] < pcie_gen_cap)
++                      pcie_gen_cap = pcie_table->pcie_gen[NUM_LINK_LEVELS - 1];
++
++              if (pcie_table->pcie_lane[NUM_LINK_LEVELS - 1] < pcie_width_cap)
++                      pcie_width_cap = pcie_table->pcie_lane[NUM_LINK_LEVELS - 1];
++
++              /* Force all levels to use the same settings */
++              for (i = 0; i < NUM_LINK_LEVELS; i++) {
++                      pcie_table->pcie_gen[i] = pcie_gen_cap;
++                      pcie_table->pcie_lane[i] = pcie_width_cap;
++              }
+       } else {
+-              min_lane_width = MAX(1, table_member2[0]);
+-              max_lane_width = MIN(pcie_width_cap, table_member2[1]);
+-              min_lane_width = min_lane_width > max_lane_width ?
+-                               max_lane_width : min_lane_width;
++              for (i = 0; i < NUM_LINK_LEVELS; i++) {
++                      if (pcie_table->pcie_gen[i] > pcie_gen_cap)
++                              pcie_table->pcie_gen[i] = pcie_gen_cap;
++                      if (pcie_table->pcie_lane[i] > pcie_width_cap)
++                              pcie_table->pcie_lane[i] = pcie_width_cap;
++              }
+       }
+-      pcie_table->pcie_lane[0] = min_lane_width;
+-      pcie_table->pcie_lane[1] = max_lane_width;
+       for (i = 0; i < NUM_LINK_LEVELS; i++) {
+               smu_pcie_arg = (i << 16 |
diff --git a/queue-6.4/drm-amd-disable-psr-su-on-parade-0803-tcon.patch b/queue-6.4/drm-amd-disable-psr-su-on-parade-0803-tcon.patch
new file mode 100644 (file)
index 0000000..cc7254b
--- /dev/null
@@ -0,0 +1,41 @@
+From 072030b1783056b5de8b0fac5303a5e9dbc6cfde Mon Sep 17 00:00:00 2001
+From: Mario Limonciello <mario.limonciello@amd.com>
+Date: Mon, 19 Jun 2023 15:04:24 -0500
+Subject: drm/amd: Disable PSR-SU on Parade 0803 TCON
+
+From: Mario Limonciello <mario.limonciello@amd.com>
+
+commit 072030b1783056b5de8b0fac5303a5e9dbc6cfde upstream.
+
+A number of users have reported that there are random hangs occurring
+caused by PSR-SU specifically on panels that contain the parade 0803
+TCON.  Users have been able to work around the issue by disabling PSR
+entirely.
+
+To avoid these hangs, disable PSR-SU when this TCON is found.
+
+Cc: stable@vger.kernel.org
+Cc: Sean Wang <sean.ns.wang@amd.com>
+Cc: Marc Rossi <Marc.Rossi@amd.com>
+Cc: Hamza Mahfooz <Hamza.Mahfooz@amd.com>
+Suggested-by: Tsung-hua (Ryan) Lin <Tsung-hua.Lin@amd.com>
+Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2443
+Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
+Reviewed-by: Hamza Mahfooz <hamza.mahfooz@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/amd/display/modules/power/power_helpers.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/gpu/drm/amd/display/modules/power/power_helpers.c
++++ b/drivers/gpu/drm/amd/display/modules/power/power_helpers.c
+@@ -818,6 +818,8 @@ bool is_psr_su_specific_panel(struct dc_
+                               ((dpcd_caps->sink_dev_id_str[1] == 0x08 && dpcd_caps->sink_dev_id_str[0] == 0x08) ||
+                               (dpcd_caps->sink_dev_id_str[1] == 0x08 && dpcd_caps->sink_dev_id_str[0] == 0x07)))
+                               isPSRSUSupported = false;
++                      else if (dpcd_caps->sink_dev_id_str[1] == 0x08 && dpcd_caps->sink_dev_id_str[0] == 0x03)
++                              isPSRSUSupported = false;
+                       else if (dpcd_caps->psr_info.force_psrsu_cap == 0x1)
+                               isPSRSUSupported = true;
+               }
diff --git a/queue-6.4/drm-amd-display-add-a-null-pointer-check.patch b/queue-6.4/drm-amd-display-add-a-null-pointer-check.patch
new file mode 100644 (file)
index 0000000..c77e4ee
--- /dev/null
@@ -0,0 +1,44 @@
+From 0f48a4b83610cb0e4e0bc487800ab69f51b4aca6 Mon Sep 17 00:00:00 2001
+From: Sung-huai Wang <danny.wang@amd.com>
+Date: Tue, 6 Jun 2023 14:28:38 +0800
+Subject: drm/amd/display: add a NULL pointer check
+
+From: Sung-huai Wang <danny.wang@amd.com>
+
+commit 0f48a4b83610cb0e4e0bc487800ab69f51b4aca6 upstream.
+
+[Why & How]
+
+We have to check if stream is properly initialized before calling
+find_matching_pll(), otherwise we might end up trying to deferecence a
+NULL pointer.
+
+Cc: stable@vger.kernel.org # 6.1+
+Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
+Acked-by: Hamza Mahfooz <hamza.mahfooz@amd.com>
+Signed-off-by: Sung-huai Wang <danny.wang@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c |   10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+--- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
+@@ -970,10 +970,12 @@ enum dc_status resource_map_phy_clock_re
+               || dc_is_virtual_signal(pipe_ctx->stream->signal))
+               pipe_ctx->clock_source =
+                               dc->res_pool->dp_clock_source;
+-      else
+-              pipe_ctx->clock_source = find_matching_pll(
+-                      &context->res_ctx, dc->res_pool,
+-                      stream);
++      else {
++              if (stream && stream->link && stream->link->link_enc)
++                      pipe_ctx->clock_source = find_matching_pll(
++                              &context->res_ctx, dc->res_pool,
++                              stream);
++      }
+       if (pipe_ctx->clock_source == NULL)
+               return DC_NO_CLOCK_SOURCE_RESOURCE;
diff --git a/queue-6.4/drm-amd-display-add-monitor-specific-edid-quirk.patch b/queue-6.4/drm-amd-display-add-monitor-specific-edid-quirk.patch
new file mode 100644 (file)
index 0000000..b99ae52
--- /dev/null
@@ -0,0 +1,65 @@
+From 613a7956deb3b1ffa2810c6d4c90ee9c3d743dbb Mon Sep 17 00:00:00 2001
+From: Aurabindo Pillai <aurabindo.pillai@amd.com>
+Date: Mon, 12 Jun 2023 12:44:00 -0400
+Subject: drm/amd/display: Add monitor specific edid quirk
+
+From: Aurabindo Pillai <aurabindo.pillai@amd.com>
+
+commit 613a7956deb3b1ffa2810c6d4c90ee9c3d743dbb upstream.
+
+Disable FAMS on a Samsung Odyssey G9 monitor. Experiments show that this
+monitor does not work well under some use cases, and is likely
+implementation specific bug on the monitor's firmware.
+
+Cc: stable@vger.kernel.org
+Reviewed-by: Rodrigo Siqueira <rodrigo.siqueira@amd.com>
+Signed-off-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
+Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c |   26 ++++++++++++++
+ 1 file changed, 26 insertions(+)
+
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
+@@ -47,6 +47,30 @@
+ /* MST Dock */
+ static const uint8_t SYNAPTICS_DEVICE_ID[] = "SYNA";
++static u32 edid_extract_panel_id(struct edid *edid)
++{
++      return (u32)edid->mfg_id[0] << 24   |
++             (u32)edid->mfg_id[1] << 16   |
++             (u32)EDID_PRODUCT_ID(edid);
++}
++
++static void apply_edid_quirks(struct edid *edid, struct dc_edid_caps *edid_caps)
++{
++      uint32_t panel_id = edid_extract_panel_id(edid);
++
++      switch (panel_id) {
++      /* Workaround for some monitors which does not work well with FAMS */
++      case drm_edid_encode_panel_id('S', 'A', 'M', 0x0E5E):
++      case drm_edid_encode_panel_id('S', 'A', 'M', 0x7053):
++      case drm_edid_encode_panel_id('S', 'A', 'M', 0x71AC):
++              DRM_DEBUG_DRIVER("Disabling FAMS on monitor with panel id %X\n", panel_id);
++              edid_caps->panel_patch.disable_fams = true;
++              break;
++      default:
++              return;
++      }
++}
++
+ /* dm_helpers_parse_edid_caps
+  *
+  * Parse edid caps
+@@ -118,6 +142,8 @@ enum dc_edid_status dm_helpers_parse_edi
+       else
+               edid_caps->speaker_flags = DEFAULT_SPEAKER_LOCATION;
++      apply_edid_quirks(edid_buf, edid_caps);
++
+       kfree(sads);
+       kfree(sadb);
diff --git a/queue-6.4/drm-amd-display-correct-dmub_fw_version-macro.patch b/queue-6.4/drm-amd-display-correct-dmub_fw_version-macro.patch
new file mode 100644 (file)
index 0000000..54435b8
--- /dev/null
@@ -0,0 +1,37 @@
+From 274d205cb59f43815542e04b42a9e6d0b9b95eff Mon Sep 17 00:00:00 2001
+From: Mario Limonciello <mario.limonciello@amd.com>
+Date: Fri, 23 Jun 2023 10:05:19 -0500
+Subject: drm/amd/display: Correct `DMUB_FW_VERSION` macro
+
+From: Mario Limonciello <mario.limonciello@amd.com>
+
+commit 274d205cb59f43815542e04b42a9e6d0b9b95eff upstream.
+
+The `DMUB_FW_VERSION` macro has a mistake in that the revision field
+is off by one byte. The last byte is typically used for other purposes
+and not a revision.
+
+Cc: stable@vger.kernel.org
+Cc: Sean Wang <sean.ns.wang@amd.com>
+Cc: Marc Rossi <Marc.Rossi@amd.com>
+Cc: Hamza Mahfooz <Hamza.Mahfooz@amd.com>
+Cc: Tsung-hua (Ryan) Lin <Tsung-hua.Lin@amd.com>
+Reviewed-by: Leo Li <sunpeng.li@amd.com>
+Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/amd/display/dmub/dmub_srv.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/amd/display/dmub/dmub_srv.h
++++ b/drivers/gpu/drm/amd/display/dmub/dmub_srv.h
+@@ -490,7 +490,7 @@ struct dmub_notification {
+  * of a firmware to know if feature or functionality is supported or present.
+  */
+ #define DMUB_FW_VERSION(major, minor, revision) \
+-      ((((major) & 0xFF) << 24) | (((minor) & 0xFF) << 16) | ((revision) & 0xFFFF))
++      ((((major) & 0xFF) << 24) | (((minor) & 0xFF) << 16) | (((revision) & 0xFF) << 8))
+ /**
+  * dmub_srv_create() - creates the DMUB service.
diff --git a/queue-6.4/drm-amd-display-disable-seamless-boot-if-force_odm_combine-is-enabled.patch b/queue-6.4/drm-amd-display-disable-seamless-boot-if-force_odm_combine-is-enabled.patch
new file mode 100644 (file)
index 0000000..c3f8e43
--- /dev/null
@@ -0,0 +1,35 @@
+From 26518b39181876064850209ecdab48c0ee5924b1 Mon Sep 17 00:00:00 2001
+From: Leo Chen <sancchen@amd.com>
+Date: Thu, 8 Jun 2023 16:37:38 -0400
+Subject: drm/amd/display: disable seamless boot if force_odm_combine is enabled
+
+From: Leo Chen <sancchen@amd.com>
+
+commit 26518b39181876064850209ecdab48c0ee5924b1 upstream.
+
+[Why & How]
+Having seamless boot on while forcing debug option ODM combine 2 to 1
+will cause some corruptions because of some missing programmings.
+
+Cc: stable@vger.kernel.org # 6.1+
+Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
+Acked-by: Hamza Mahfooz <hamza.mahfooz@amd.com>
+Signed-off-by: Leo Chen <sancchen@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc.c |    3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
+@@ -1602,6 +1602,9 @@ bool dc_validate_boot_timing(const struc
+               return false;
+       }
++      if (dc->debug.force_odm_combine)
++              return false;
++
+       /* Check for enabled DIG to identify enabled display */
+       if (!link->link_enc->funcs->is_dig_enabled(link->link_enc))
+               return false;
diff --git a/queue-6.4/drm-amd-display-edp-do-not-add-non-edid-timings.patch b/queue-6.4/drm-amd-display-edp-do-not-add-non-edid-timings.patch
new file mode 100644 (file)
index 0000000..98c512d
--- /dev/null
@@ -0,0 +1,45 @@
+From 7a0e005c7957931689a327b2a4e7333a19f13f95 Mon Sep 17 00:00:00 2001
+From: Hersen Wu <hersenxs.wu@amd.com>
+Date: Thu, 25 May 2023 08:37:40 -0400
+Subject: drm/amd/display: edp do not add non-edid timings
+
+From: Hersen Wu <hersenxs.wu@amd.com>
+
+commit 7a0e005c7957931689a327b2a4e7333a19f13f95 upstream.
+
+[Why] most edp support only timings from edid. applying
+non-edid timings, especially those timings out of edp
+bandwidth, may damage edp.
+
+[How] do not add non-edid timings for edp.
+
+Cc: Mario Limonciello <mario.limonciello@amd.com>
+Cc: Alex Deucher <alexander.deucher@amd.com>
+Cc: stable@vger.kernel.org
+Acked-by: Stylon Wang <stylon.wang@amd.com>
+Signed-off-by: Hersen Wu <hersenxs.wu@amd.com>
+Reviewed-by: Roman Li <roman.li@amd.com>
+Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |    8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+@@ -7192,7 +7192,13 @@ static int amdgpu_dm_connector_get_modes
+                               drm_add_modes_noedid(connector, 1920, 1080);
+       } else {
+               amdgpu_dm_connector_ddc_get_modes(connector, edid);
+-              amdgpu_dm_connector_add_common_modes(encoder, connector);
++              /* most eDP supports only timings from its edid,
++               * usually only detailed timings are available
++               * from eDP edid. timings which are not from edid
++               * may damage eDP
++               */
++              if (connector->connector_type != DRM_MODE_CONNECTOR_eDP)
++                      amdgpu_dm_connector_add_common_modes(encoder, connector);
+               amdgpu_dm_connector_add_freesync_modes(connector, edid);
+       }
+       amdgpu_dm_fbc_init(connector);
diff --git a/queue-6.4/drm-amd-display-fix-128b132b-link-loss-handling.patch b/queue-6.4/drm-amd-display-fix-128b132b-link-loss-handling.patch
new file mode 100644 (file)
index 0000000..e6eab65
--- /dev/null
@@ -0,0 +1,52 @@
+From ed83fe2abcace898fdec5c2ba0455703178ac9a3 Mon Sep 17 00:00:00 2001
+From: Ilya Bakoulin <ilya.bakoulin@amd.com>
+Date: Wed, 7 Jun 2023 16:49:45 -0400
+Subject: drm/amd/display: Fix 128b132b link loss handling
+
+From: Ilya Bakoulin <ilya.bakoulin@amd.com>
+
+commit ed83fe2abcace898fdec5c2ba0455703178ac9a3 upstream.
+
+[Why]
+We don't check 128b132b-specific bits in LANE_ALIGN_STATUS_UPDATED DPCD
+registers when parsing link loss status, which can cause us to miss a
+link loss notification from some sinks.
+
+[How]
+Add a 128b132b-specific status bit check.
+
+Cc: stable@vger.kernel.org # 6.3+
+Reviewed-by: Wenjing Liu <wenjing.liu@amd.com>
+Acked-by: Hamza Mahfooz <hamza.mahfooz@amd.com>
+Signed-off-by: Ilya Bakoulin <ilya.bakoulin@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ .../display/dc/link/protocols/link_dp_irq_handler.c   | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_irq_handler.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_irq_handler.c
+index ba95facc4ee8..b1b11eb0f9bb 100644
+--- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_irq_handler.c
++++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_irq_handler.c
+@@ -82,8 +82,15 @@ bool dp_parse_link_loss_status(
+       }
+       /* Check interlane align.*/
+-      if (sink_status_changed ||
+-              !hpd_irq_dpcd_data->bytes.lane_status_updated.bits.INTERLANE_ALIGN_DONE) {
++      if (link_dp_get_encoding_format(&link->cur_link_settings) == DP_128b_132b_ENCODING &&
++                      (!hpd_irq_dpcd_data->bytes.lane_status_updated.bits.EQ_INTERLANE_ALIGN_DONE_128b_132b ||
++                       !hpd_irq_dpcd_data->bytes.lane_status_updated.bits.CDS_INTERLANE_ALIGN_DONE_128b_132b)) {
++              sink_status_changed = true;
++      } else if (!hpd_irq_dpcd_data->bytes.lane_status_updated.bits.INTERLANE_ALIGN_DONE) {
++              sink_status_changed = true;
++      }
++
++      if (sink_status_changed) {
+               DC_LOG_HW_HPD_IRQ("%s: Link Status changed.\n", __func__);
+-- 
+2.41.0
+
diff --git a/queue-6.4/drm-amd-display-fix-in-secure-display-context-creation.patch b/queue-6.4/drm-amd-display-fix-in-secure-display-context-creation.patch
new file mode 100644 (file)
index 0000000..da8ec6e
--- /dev/null
@@ -0,0 +1,64 @@
+From f477c7b5ec3e4ef87606671b340abf3bdb0cccff Mon Sep 17 00:00:00 2001
+From: Alan Liu <HaoPing.Liu@amd.com>
+Date: Mon, 10 Apr 2023 11:35:44 +0800
+Subject: drm/amd/display: Fix in secure display context creation
+
+From: Alan Liu <HaoPing.Liu@amd.com>
+
+commit f477c7b5ec3e4ef87606671b340abf3bdb0cccff upstream.
+
+[Why & How]
+We need to store CRTC information in secure_display_ctx, so postpone
+the call to amdgpu_dm_crtc_secure_display_create_contexts() until we
+initialize all CRTCs.
+
+Cc: stable@vger.kernel.org
+Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
+Reviewed-by: Wayne Lin <Wayne.Lin@amd.com>
+Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
+Signed-off-by: Alan Liu <HaoPing.Liu@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c     |   11 +++++------
+ drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.h |    2 +-
+ 2 files changed, 6 insertions(+), 7 deletions(-)
+
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+@@ -1776,12 +1776,6 @@ static int amdgpu_dm_init(struct amdgpu_
+               dc_init_callbacks(adev->dm.dc, &init_params);
+       }
+-#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)
+-      adev->dm.secure_display_ctxs = amdgpu_dm_crtc_secure_display_create_contexts(adev);
+-      if (!adev->dm.secure_display_ctxs) {
+-              DRM_ERROR("amdgpu: failed to initialize secure_display_ctxs.\n");
+-      }
+-#endif
+       if (dc_is_dmub_outbox_supported(adev->dm.dc)) {
+               init_completion(&adev->dm.dmub_aux_transfer_done);
+               adev->dm.dmub_notify = kzalloc(sizeof(struct dmub_notification), GFP_KERNEL);
+@@ -1840,6 +1834,11 @@ static int amdgpu_dm_init(struct amdgpu_
+               goto error;
+       }
++#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)
++      adev->dm.secure_display_ctxs = amdgpu_dm_crtc_secure_display_create_contexts(adev);
++      if (!adev->dm.secure_display_ctxs)
++              DRM_ERROR("amdgpu: failed to initialize secure display contexts.\n");
++#endif
+       DRM_DEBUG_DRIVER("KMS initialized.\n");
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.h
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.h
+@@ -100,7 +100,7 @@ struct secure_display_context *amdgpu_dm
+ #else
+ #define amdgpu_dm_crc_window_is_activated(x)
+ #define amdgpu_dm_crtc_handle_crc_window_irq(x)
+-#define amdgpu_dm_crtc_secure_display_create_contexts()
++#define amdgpu_dm_crtc_secure_display_create_contexts(x)
+ #endif
+ #endif /* AMD_DAL_DEV_AMDGPU_DM_AMDGPU_DM_CRC_H_ */
diff --git a/queue-6.4/drm-amd-display-fix-seamless-odm-transitions.patch b/queue-6.4/drm-amd-display-fix-seamless-odm-transitions.patch
new file mode 100644 (file)
index 0000000..79fe5bf
--- /dev/null
@@ -0,0 +1,66 @@
+From 75c2b7ed080d7421157c03064be82275364136e7 Mon Sep 17 00:00:00 2001
+From: Dmytro Laktyushkin <dmytro.laktyushkin@amd.com>
+Date: Tue, 18 Apr 2023 10:11:56 -0400
+Subject: drm/amd/display: fix seamless odm transitions
+
+From: Dmytro Laktyushkin <dmytro.laktyushkin@amd.com>
+
+commit 75c2b7ed080d7421157c03064be82275364136e7 upstream.
+
+Add missing programming and function pointers
+
+Cc: Mario Limonciello <mario.limonciello@amd.com>
+Cc: Alex Deucher <alexander.deucher@amd.com>
+Cc: stable@vger.kernel.org
+Acked-by: Stylon Wang <stylon.wang@amd.com>
+Signed-off-by: Dmytro Laktyushkin <dmytro.laktyushkin@amd.com>
+Reviewed-by: Charlene Liu <Charlene.Liu@amd.com>
+Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c |   11 +++++++++++
+ drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.c  |    2 +-
+ drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.h  |    1 +
+ 3 files changed, 13 insertions(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
+@@ -1732,6 +1732,17 @@ static void dcn20_program_pipe(
+               if (hws->funcs.setup_vupdate_interrupt)
+                       hws->funcs.setup_vupdate_interrupt(dc, pipe_ctx);
++
++              if (hws->funcs.calculate_dccg_k1_k2_values && dc->res_pool->dccg->funcs->set_pixel_rate_div) {
++                      unsigned int k1_div, k2_div;
++
++                      hws->funcs.calculate_dccg_k1_k2_values(pipe_ctx, &k1_div, &k2_div);
++
++                      dc->res_pool->dccg->funcs->set_pixel_rate_div(
++                              dc->res_pool->dccg,
++                              pipe_ctx->stream_res.tg->inst,
++                              k1_div, k2_div);
++              }
+       }
+       if (pipe_ctx->update_flags.bits.odm)
+--- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.c
+@@ -98,7 +98,7 @@ static void optc32_set_odm_combine(struc
+       optc1->opp_count = opp_cnt;
+ }
+-static void optc32_set_h_timing_div_manual_mode(struct timing_generator *optc, bool manual_mode)
++void optc32_set_h_timing_div_manual_mode(struct timing_generator *optc, bool manual_mode)
+ {
+       struct optc *optc1 = DCN10TG_FROM_TG(optc);
+--- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.h
++++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.h
+@@ -179,5 +179,6 @@
+       SF(OTG0_OTG_DRR_CONTROL, OTG_V_TOTAL_LAST_USED_BY_DRR, mask_sh)
+ void dcn32_timing_generator_init(struct optc *optc1);
++void optc32_set_h_timing_div_manual_mode(struct timing_generator *optc, bool manual_mode);
+ #endif /* __DC_OPTC_DCN32_H__ */
diff --git a/queue-6.4/drm-amd-display-limit-dcn32-8-channel-or-less-parts-to-dpm1-for-fpo.patch b/queue-6.4/drm-amd-display-limit-dcn32-8-channel-or-less-parts-to-dpm1-for-fpo.patch
new file mode 100644 (file)
index 0000000..f1c95b6
--- /dev/null
@@ -0,0 +1,70 @@
+From ee7be8f3de1ccc9665281fe996f9b6d45191ec1a Mon Sep 17 00:00:00 2001
+From: Alvin Lee <Alvin.Lee2@amd.com>
+Date: Mon, 10 Apr 2023 14:37:27 -0400
+Subject: drm/amd/display: Limit DCN32 8 channel or less parts to DPM1 for FPO
+
+From: Alvin Lee <Alvin.Lee2@amd.com>
+
+commit ee7be8f3de1ccc9665281fe996f9b6d45191ec1a upstream.
+
+- Due to hardware related QoS issues, we need to limit certain
+  SKUs with less memory channels to DPM1 and above.
+- At DPM0 + workload running, the urgent return latency can
+  exceed 15us (the expected maximum is 4us) which results in underflow
+
+Cc: stable@vger.kernel.org
+Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
+Reviewed-by: Saaem Rizvi <SyedSaaem.Rizvi@amd.com>
+Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
+Signed-off-by: Alvin Lee <Alvin.Lee2@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c |    2 ++
+ drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c  |   15 +++++++++++++++
+ drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.h  |    2 ++
+ 3 files changed, 19 insertions(+)
+
+--- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
+@@ -1888,6 +1888,8 @@ bool dcn32_validate_bandwidth(struct dc
+       dc->res_pool->funcs->calculate_wm_and_dlg(dc, context, pipes, pipe_cnt, vlevel);
++      dcn32_override_min_req_memclk(dc, context);
++
+       BW_VAL_TRACE_END_WATERMARKS();
+       goto validate_out;
+--- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c
++++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c
+@@ -2882,3 +2882,18 @@ void dcn32_set_clock_limits(const struct
+       dc_assert_fp_enabled();
+       dcn3_2_soc.clock_limits[0].dcfclk_mhz = 1200.0;
+ }
++
++void dcn32_override_min_req_memclk(struct dc *dc, struct dc_state *context)
++{
++      // WA: restrict FPO and SubVP to use first non-strobe mode (DCN32 BW issue)
++      if ((context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching || dcn32_subvp_in_use(dc, context)) &&
++                      dc->dml.soc.num_chans <= 8) {
++              int num_mclk_levels = dc->clk_mgr->bw_params->clk_table.num_entries_per_clk.num_memclk_levels;
++
++              if (context->bw_ctx.dml.vba.DRAMSpeed <= dc->clk_mgr->bw_params->clk_table.entries[0].memclk_mhz * 16 &&
++                              num_mclk_levels > 1) {
++                      context->bw_ctx.dml.vba.DRAMSpeed = dc->clk_mgr->bw_params->clk_table.entries[1].memclk_mhz * 16;
++                      context->bw_ctx.bw.dcn.clk.dramclk_khz = context->bw_ctx.dml.vba.DRAMSpeed * 1000 / 16;
++              }
++      }
++}
+--- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.h
++++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.h
+@@ -80,6 +80,8 @@ void dcn32_assign_fpo_vactive_candidate(
+ bool dcn32_find_vactive_pipe(struct dc *dc, const struct dc_state *context, uint32_t vactive_margin_req);
++void dcn32_override_min_req_memclk(struct dc *dc, struct dc_state *context);
++
+ void dcn32_set_clock_limits(const struct _vcs_dpi_soc_bounding_box_st *soc_bb);
+ #endif
diff --git a/queue-6.4/drm-amd-display-remove-phantom-pipe-check-when-calculating-k1-and-k2.patch b/queue-6.4/drm-amd-display-remove-phantom-pipe-check-when-calculating-k1-and-k2.patch
new file mode 100644 (file)
index 0000000..c85f31c
--- /dev/null
@@ -0,0 +1,40 @@
+From 1966bbfdfe476d271b338336254854c5edd5a907 Mon Sep 17 00:00:00 2001
+From: Austin Zheng <austin.zheng@amd.com>
+Date: Thu, 15 Jun 2023 16:41:08 -0400
+Subject: drm/amd/display: Remove Phantom Pipe Check When Calculating K1 and K2
+
+From: Austin Zheng <austin.zheng@amd.com>
+
+commit 1966bbfdfe476d271b338336254854c5edd5a907 upstream.
+
+[Why]
+K1 and K2 not being setting properly when subVP is active.
+
+[How]
+Have phantom pipes use the same programing as the main pipes without
+checking the paired stream
+
+Cc: stable@vger.kernel.org
+Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
+Reviewed-by: Alvin Lee <alvin.lee2@amd.com>
+Acked-by: Rodrigo Siqueira <rodrigo.siqueira@amd.com>
+Signed-off-by: Austin Zheng <austin.zheng@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hwseq.c |    4 ----
+ 1 file changed, 4 deletions(-)
+
+--- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hwseq.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hwseq.c
+@@ -1125,10 +1125,6 @@ unsigned int dcn32_calculate_dccg_k1_k2_
+       unsigned int odm_combine_factor = 0;
+       bool two_pix_per_container = false;
+-      // For phantom pipes, use the same programming as the main pipes
+-      if (pipe_ctx->stream->mall_stream_config.type == SUBVP_PHANTOM) {
+-              stream = pipe_ctx->stream->mall_stream_config.paired_stream;
+-      }
+       two_pix_per_container = optc2_is_two_pixels_per_containter(&stream->timing);
+       odm_combine_factor = get_odm_config(pipe_ctx, NULL);
diff --git a/queue-6.4/drm-amd-pm-fix-smu-i2c-data-read-risk.patch b/queue-6.4/drm-amd-pm-fix-smu-i2c-data-read-risk.patch
new file mode 100644 (file)
index 0000000..eb62edc
--- /dev/null
@@ -0,0 +1,137 @@
+From d934e537c14bfe1227ced6341472571f354383e8 Mon Sep 17 00:00:00 2001
+From: Yang Wang <kevinyang.wang@amd.com>
+Date: Tue, 20 Jun 2023 17:05:25 +0800
+Subject: drm/amd/pm: fix smu i2c data read risk
+
+From: Yang Wang <kevinyang.wang@amd.com>
+
+commit d934e537c14bfe1227ced6341472571f354383e8 upstream.
+
+the smu driver_table is used for all types of smu
+tables data transcation (e.g: PPtable, Metrics, i2c, Ecc..).
+
+it is necessary to hold this lock to avoiding data tampering
+during the i2c read operation.
+
+Signed-off-by: Yang Wang <kevinyang.wang@amd.com>
+Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Cc: stable@vger.kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c       |    2 +-
+ drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c         |    2 +-
+ drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c |    2 +-
+ drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c      |    2 +-
+ drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c    |    2 +-
+ drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c    |    2 +-
+ 6 files changed, 6 insertions(+), 6 deletions(-)
+
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c
+@@ -2113,7 +2113,6 @@ static int arcturus_i2c_xfer(struct i2c_
+       }
+       mutex_lock(&adev->pm.mutex);
+       r = smu_cmn_update_table(smu, SMU_TABLE_I2C_COMMANDS, 0, req, true);
+-      mutex_unlock(&adev->pm.mutex);
+       if (r)
+               goto fail;
+@@ -2130,6 +2129,7 @@ static int arcturus_i2c_xfer(struct i2c_
+       }
+       r = num_msgs;
+ fail:
++      mutex_unlock(&adev->pm.mutex);
+       kfree(req);
+       return r;
+ }
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
+@@ -3021,7 +3021,6 @@ static int navi10_i2c_xfer(struct i2c_ad
+       }
+       mutex_lock(&adev->pm.mutex);
+       r = smu_cmn_update_table(smu, SMU_TABLE_I2C_COMMANDS, 0, req, true);
+-      mutex_unlock(&adev->pm.mutex);
+       if (r)
+               goto fail;
+@@ -3038,6 +3037,7 @@ static int navi10_i2c_xfer(struct i2c_ad
+       }
+       r = num_msgs;
+ fail:
++      mutex_unlock(&adev->pm.mutex);
+       kfree(req);
+       return r;
+ }
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+@@ -3789,7 +3789,6 @@ static int sienna_cichlid_i2c_xfer(struc
+       }
+       mutex_lock(&adev->pm.mutex);
+       r = smu_cmn_update_table(smu, SMU_TABLE_I2C_COMMANDS, 0, req, true);
+-      mutex_unlock(&adev->pm.mutex);
+       if (r)
+               goto fail;
+@@ -3806,6 +3805,7 @@ static int sienna_cichlid_i2c_xfer(struc
+       }
+       r = num_msgs;
+ fail:
++      mutex_unlock(&adev->pm.mutex);
+       kfree(req);
+       return r;
+ }
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c
+@@ -1525,7 +1525,6 @@ static int aldebaran_i2c_xfer(struct i2c
+       }
+       mutex_lock(&adev->pm.mutex);
+       r = smu_cmn_update_table(smu, SMU_TABLE_I2C_COMMANDS, 0, req, true);
+-      mutex_unlock(&adev->pm.mutex);
+       if (r)
+               goto fail;
+@@ -1542,6 +1541,7 @@ static int aldebaran_i2c_xfer(struct i2c
+       }
+       r = num_msgs;
+ fail:
++      mutex_unlock(&adev->pm.mutex);
+       kfree(req);
+       return r;
+ }
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
+@@ -1838,7 +1838,6 @@ static int smu_v13_0_0_i2c_xfer(struct i
+       }
+       mutex_lock(&adev->pm.mutex);
+       r = smu_cmn_update_table(smu, SMU_TABLE_I2C_COMMANDS, 0, req, true);
+-      mutex_unlock(&adev->pm.mutex);
+       if (r)
+               goto fail;
+@@ -1855,6 +1854,7 @@ static int smu_v13_0_0_i2c_xfer(struct i
+       }
+       r = num_msgs;
+ fail:
++      mutex_unlock(&adev->pm.mutex);
+       kfree(req);
+       return r;
+ }
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
+@@ -1639,7 +1639,6 @@ static int smu_v13_0_6_i2c_xfer(struct i
+       }
+       mutex_lock(&adev->pm.mutex);
+       r = smu_v13_0_6_request_i2c_xfer(smu, req);
+-      mutex_unlock(&adev->pm.mutex);
+       if (r)
+               goto fail;
+@@ -1656,6 +1655,7 @@ static int smu_v13_0_6_i2c_xfer(struct i
+       }
+       r = num_msgs;
+ fail:
++      mutex_unlock(&adev->pm.mutex);
+       kfree(req);
+       return r;
+ }
diff --git a/queue-6.4/drm-amdgpu-avoid-restore-process-run-into-dead-loop.patch b/queue-6.4/drm-amdgpu-avoid-restore-process-run-into-dead-loop.patch
new file mode 100644 (file)
index 0000000..4088950
--- /dev/null
@@ -0,0 +1,33 @@
+From 8a774fe912ff09e39c2d3a3589c729330113f388 Mon Sep 17 00:00:00 2001
+From: gaba <gaba@amd.com>
+Date: Thu, 2 Mar 2023 19:03:56 -0500
+Subject: drm/amdgpu: avoid restore process run into dead loop.
+
+From: gaba <gaba@amd.com>
+
+commit 8a774fe912ff09e39c2d3a3589c729330113f388 upstream.
+
+In restore process worker, pinned BO cause update PTE fail, then
+the function re-schedule the restore_work. This will generate dead loop.
+
+Signed-off-by: gaba <gaba@amd.com>
+Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Cc: stable@vger.kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c |    3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+@@ -2792,6 +2792,9 @@ int amdgpu_amdkfd_gpuvm_restore_process_
+                       if (!attachment->is_mapped)
+                               continue;
++                      if (attachment->bo_va->base.bo->tbo.pin_count)
++                              continue;
++
+                       kfd_mem_dmaunmap_attachment(mem, attachment);
+                       ret = update_gpuvm_pte(mem, attachment, &sync_obj);
+                       if (ret) {
diff --git a/queue-6.4/drm-amdgpu-fix-clearing-mappings-for-bos-that-are-always-valid-in-vm.patch b/queue-6.4/drm-amdgpu-fix-clearing-mappings-for-bos-that-are-always-valid-in-vm.patch
new file mode 100644 (file)
index 0000000..3980d8e
--- /dev/null
@@ -0,0 +1,62 @@
+From ea2c3c08554601b051d91403a241266e1cf490a5 Mon Sep 17 00:00:00 2001
+From: Samuel Pitoiset <samuel.pitoiset@gmail.com>
+Date: Fri, 16 Jun 2023 15:14:07 +0200
+Subject: drm/amdgpu: fix clearing mappings for BOs that are always valid in VM
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Samuel Pitoiset <samuel.pitoiset@gmail.com>
+
+commit ea2c3c08554601b051d91403a241266e1cf490a5 upstream.
+
+Per VM BOs must be marked as moved or otherwise their ranges are not
+updated on use which might be necessary when the replace operation
+splits mappings.
+
+This fixes random GPU hangs when replacing sparse mappings from the
+userspace, while OP_MAP/OP_UNMAP works fine because always valid BOs
+are correctly handled there.
+
+Cc: stable@vger.kernel.org
+Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
+Reviewed-by: Christian König <christian.koenig@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c |   12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+@@ -1683,18 +1683,30 @@ int amdgpu_vm_bo_clear_mappings(struct a
+       /* Insert partial mapping before the range */
+       if (!list_empty(&before->list)) {
++              struct amdgpu_bo *bo = before->bo_va->base.bo;
++
+               amdgpu_vm_it_insert(before, &vm->va);
+               if (before->flags & AMDGPU_PTE_PRT)
+                       amdgpu_vm_prt_get(adev);
++
++              if (bo && bo->tbo.base.resv == vm->root.bo->tbo.base.resv &&
++                  !before->bo_va->base.moved)
++                      amdgpu_vm_bo_moved(&before->bo_va->base);
+       } else {
+               kfree(before);
+       }
+       /* Insert partial mapping after the range */
+       if (!list_empty(&after->list)) {
++              struct amdgpu_bo *bo = after->bo_va->base.bo;
++
+               amdgpu_vm_it_insert(after, &vm->va);
+               if (after->flags & AMDGPU_PTE_PRT)
+                       amdgpu_vm_prt_get(adev);
++
++              if (bo && bo->tbo.base.resv == vm->root.bo->tbo.base.resv &&
++                  !after->bo_va->base.moved)
++                      amdgpu_vm_bo_moved(&after->bo_va->base);
+       } else {
+               kfree(after);
+       }
diff --git a/queue-6.4/drm-ttm-don-t-leak-a-resource-on-eviction-error.patch b/queue-6.4/drm-ttm-don-t-leak-a-resource-on-eviction-error.patch
new file mode 100644 (file)
index 0000000..d7df8ef
--- /dev/null
@@ -0,0 +1,67 @@
+From e8188c461ee015ba0b9ab2fc82dbd5ebca5a5532 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= <thomas.hellstrom@linux.intel.com>
+Date: Mon, 26 Jun 2023 11:14:49 +0200
+Subject: drm/ttm: Don't leak a resource on eviction error
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Thomas Hellström <thomas.hellstrom@linux.intel.com>
+
+commit e8188c461ee015ba0b9ab2fc82dbd5ebca5a5532 upstream.
+
+On eviction errors other than -EMULTIHOP we were leaking a resource.
+Fix.
+
+v2:
+- Avoid yet another goto (Andi Shyti)
+
+Fixes: 403797925768 ("drm/ttm: Fix multihop assert on eviction.")
+Cc: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
+Cc: Christian König <christian.koenig@amd.com>
+Cc: Christian Koenig <christian.koenig@amd.com>
+Cc: Huang Rui <ray.huang@amd.com>
+Cc: dri-devel@lists.freedesktop.org
+Cc: <stable@vger.kernel.org> # v5.15+
+Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
+Reviewed-by: Nirmoy Das <nirmoy.das@intel.com> #v1
+Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
+Reviewed-by: Christian König <christian.koenig@amd.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20230626091450.14757-4-thomas.hellstrom@linux.intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/ttm/ttm_bo.c |   22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+--- a/drivers/gpu/drm/ttm/ttm_bo.c
++++ b/drivers/gpu/drm/ttm/ttm_bo.c
+@@ -458,18 +458,18 @@ static int ttm_bo_evict(struct ttm_buffe
+               goto out;
+       }
+-bounce:
+-      ret = ttm_bo_handle_move_mem(bo, evict_mem, true, ctx, &hop);
+-      if (ret == -EMULTIHOP) {
++      do {
++              ret = ttm_bo_handle_move_mem(bo, evict_mem, true, ctx, &hop);
++              if (ret != -EMULTIHOP)
++                      break;
++
+               ret = ttm_bo_bounce_temp_buffer(bo, &evict_mem, ctx, &hop);
+-              if (ret) {
+-                      if (ret != -ERESTARTSYS && ret != -EINTR)
+-                              pr_err("Buffer eviction failed\n");
+-                      ttm_resource_free(bo, &evict_mem);
+-                      goto out;
+-              }
+-              /* try and move to final place now. */
+-              goto bounce;
++      } while (!ret);
++
++      if (ret) {
++              ttm_resource_free(bo, &evict_mem);
++              if (ret != -ERESTARTSYS && ret != -EINTR)
++                      pr_err("Buffer eviction failed\n");
+       }
+ out:
+       return ret;
diff --git a/queue-6.4/drm-ttm-don-t-leak-a-resource-on-swapout-move-error.patch b/queue-6.4/drm-ttm-don-t-leak-a-resource-on-swapout-move-error.patch
new file mode 100644 (file)
index 0000000..99b7a42
--- /dev/null
@@ -0,0 +1,40 @@
+From a590f03d8de7c4cb7ce4916dc7f2fd10711faabe Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= <thomas.hellstrom@linux.intel.com>
+Date: Mon, 26 Jun 2023 11:14:50 +0200
+Subject: drm/ttm: Don't leak a resource on swapout move error
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Thomas Hellström <thomas.hellstrom@linux.intel.com>
+
+commit a590f03d8de7c4cb7ce4916dc7f2fd10711faabe upstream.
+
+If moving the bo to system for swapout failed, we were leaking
+a resource. Fix.
+
+Fixes: bfa3357ef9ab ("drm/ttm: allocate resource object instead of embedding it v2")
+Cc: Christian König <christian.koenig@amd.com>
+Cc: "Christian König" <ckoenig.leichtzumerken@gmail.com>
+Cc: dri-devel@lists.freedesktop.org
+Cc: <stable@vger.kernel.org> # v5.14+
+Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
+Reviewed-by: Nirmoy Das <nirmoy.das@intel.com>
+Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
+Reviewed-by: Christian König <christian.koenig@amd.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20230626091450.14757-5-thomas.hellstrom@linux.intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/ttm/ttm_bo.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/gpu/drm/ttm/ttm_bo.c
++++ b/drivers/gpu/drm/ttm/ttm_bo.c
+@@ -1167,6 +1167,7 @@ int ttm_bo_swapout(struct ttm_buffer_obj
+               ret = ttm_bo_handle_move_mem(bo, evict_mem, true, &ctx, &hop);
+               if (unlikely(ret != 0)) {
+                       WARN(ret == -EMULTIHOP, "Unexpected multihop in swaput - likely driver bug.\n");
++                      ttm_resource_free(bo, &evict_mem);
+                       goto out;
+               }
+       }
diff --git a/queue-6.4/drm-ttm-fix-bulk_move-corruption-when-adding-a-entry.patch b/queue-6.4/drm-ttm-fix-bulk_move-corruption-when-adding-a-entry.patch
new file mode 100644 (file)
index 0000000..766cff7
--- /dev/null
@@ -0,0 +1,49 @@
+From 4481913607e58196c48a4fef5e6f45350684ec3c Mon Sep 17 00:00:00 2001
+From: Yunxiang Li <Yunxiang.Li@amd.com>
+Date: Thu, 22 Jun 2023 10:18:03 -0400
+Subject: drm/ttm: fix bulk_move corruption when adding a entry
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Yunxiang Li <Yunxiang.Li@amd.com>
+
+commit 4481913607e58196c48a4fef5e6f45350684ec3c upstream.
+
+When the resource is the first in the bulk_move range, adding it again
+(thus moving it to the tail) will corrupt the list since the first
+pointer is not moved. This eventually lead to null pointer deref in
+ttm_lru_bulk_move_del()
+
+Fixes: fee2ede15542 ("drm/ttm: rework bulk move handling v5")
+Signed-off-by: Yunxiang Li <Yunxiang.Li@amd.com>
+Reviewed-by: Christian König <christian.koenig@amd.com>
+CC: stable@vger.kernel.org
+Link: https://patchwork.freedesktop.org/patch/msgid/20230622141902.28718-3-Yunxiang.Li@amd.com
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/ttm/ttm_resource.c |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/ttm/ttm_resource.c
++++ b/drivers/gpu/drm/ttm/ttm_resource.c
+@@ -86,6 +86,8 @@ static void ttm_lru_bulk_move_pos_tail(s
+                                      struct ttm_resource *res)
+ {
+       if (pos->last != res) {
++              if (pos->first == res)
++                      pos->first = list_next_entry(res, lru);
+               list_move(&res->lru, &pos->last->lru);
+               pos->last = res;
+       }
+@@ -111,7 +113,8 @@ static void ttm_lru_bulk_move_del(struct
+ {
+       struct ttm_lru_bulk_move_pos *pos = ttm_lru_bulk_move_pos(bulk, res);
+-      if (unlikely(pos->first == res && pos->last == res)) {
++      if (unlikely(WARN_ON(!pos->first || !pos->last) ||
++                   pos->first == res && pos->last == res)) {
+               pos->first = NULL;
+               pos->last = NULL;
+       } else if (pos->first == res) {
diff --git a/queue-6.4/drm-ttm-never-consider-pinned-bos-for-eviction-swap.patch b/queue-6.4/drm-ttm-never-consider-pinned-bos-for-eviction-swap.patch
new file mode 100644 (file)
index 0000000..a7f008a
--- /dev/null
@@ -0,0 +1,41 @@
+From a2848d08742c8e8494675892c02c0d22acbe3cf8 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Fri, 7 Jul 2023 11:25:00 +0200
+Subject: drm/ttm: never consider pinned BOs for eviction&swap
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Christian König <christian.koenig@amd.com>
+
+commit a2848d08742c8e8494675892c02c0d22acbe3cf8 upstream.
+
+There is a small window where we have already incremented the pin count
+but not yet moved the bo from the lru to the pinned list.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reported-by: Pelloux-Prayer, Pierre-Eric <Pierre-eric.Pelloux-prayer@amd.com>
+Tested-by: Pelloux-Prayer, Pierre-Eric <Pierre-eric.Pelloux-prayer@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+Cc: stable@vger.kernel.org
+Link: https://patchwork.freedesktop.org/patch/msgid/20230707120826.3701-1-christian.koenig@amd.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/ttm/ttm_bo.c |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+--- a/drivers/gpu/drm/ttm/ttm_bo.c
++++ b/drivers/gpu/drm/ttm/ttm_bo.c
+@@ -517,6 +517,12 @@ static bool ttm_bo_evict_swapout_allowab
+ {
+       bool ret = false;
++      if (bo->pin_count) {
++              *locked = false;
++              *busy = false;
++              return false;
++      }
++
+       if (bo->base.resv == ctx->resv) {
+               dma_resv_assert_held(bo->base.resv);
+               if (ctx->allow_res_evict)
diff --git a/queue-6.4/firmware-stratix10-svc-fix-a-potential-resource-leak-in-svc_create_memory_pool.patch b/queue-6.4/firmware-stratix10-svc-fix-a-potential-resource-leak-in-svc_create_memory_pool.patch
new file mode 100644 (file)
index 0000000..9b0d59b
--- /dev/null
@@ -0,0 +1,44 @@
+From 1995f15590ca222f91193ed11461862b450abfd6 Mon Sep 17 00:00:00 2001
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Date: Tue, 13 Jun 2023 16:15:21 -0500
+Subject: firmware: stratix10-svc: Fix a potential resource leak in svc_create_memory_pool()
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+commit 1995f15590ca222f91193ed11461862b450abfd6 upstream.
+
+svc_create_memory_pool() is only called from stratix10_svc_drv_probe().
+Most of resources in the probe are managed, but not this memremap() call.
+
+There is also no memunmap() call in the file.
+
+So switch to devm_memremap() to avoid a resource leak.
+
+Cc: stable@vger.kernel.org
+Fixes: 7ca5ce896524 ("firmware: add Intel Stratix10 service layer driver")
+Link: https://lore.kernel.org/all/783e9dfbba34e28505c9efa8bba41f97fd0fa1dc.1686109400.git.christophe.jaillet@wanadoo.fr/
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
+Message-ID: <20230613211521.16366-1-dinguyen@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/firmware/stratix10-svc.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/firmware/stratix10-svc.c b/drivers/firmware/stratix10-svc.c
+index 80f4e2d14e04..2d674126160f 100644
+--- a/drivers/firmware/stratix10-svc.c
++++ b/drivers/firmware/stratix10-svc.c
+@@ -755,7 +755,7 @@ svc_create_memory_pool(struct platform_device *pdev,
+       end = rounddown(sh_memory->addr + sh_memory->size, PAGE_SIZE);
+       paddr = begin;
+       size = end - begin;
+-      va = memremap(paddr, size, MEMREMAP_WC);
++      va = devm_memremap(dev, paddr, size, MEMREMAP_WC);
+       if (!va) {
+               dev_err(dev, "fail to remap shared memory\n");
+               return ERR_PTR(-EINVAL);
+-- 
+2.41.0
+
diff --git a/queue-6.4/serial-atmel-don-t-enable-irqs-prematurely.patch b/queue-6.4/serial-atmel-don-t-enable-irqs-prematurely.patch
new file mode 100644 (file)
index 0000000..eafd76b
--- /dev/null
@@ -0,0 +1,45 @@
+From 27a826837ec9a3e94cc44bd9328b8289b0fcecd7 Mon Sep 17 00:00:00 2001
+From: Dan Carpenter <dan.carpenter@linaro.org>
+Date: Mon, 19 Jun 2023 12:45:17 +0300
+Subject: serial: atmel: don't enable IRQs prematurely
+
+From: Dan Carpenter <dan.carpenter@linaro.org>
+
+commit 27a826837ec9a3e94cc44bd9328b8289b0fcecd7 upstream.
+
+The atmel_complete_tx_dma() function disables IRQs at the start
+of the function by calling spin_lock_irqsave(&port->lock, flags);
+There is no need to disable them a second time using the
+spin_lock_irq() function and, in fact, doing so is a bug because
+it will enable IRQs prematurely when we call spin_unlock_irq().
+
+Just use spin_lock/unlock() instead without disabling or enabling
+IRQs.
+
+Fixes: 08f738be88bb ("serial: at91: add tx dma support")
+Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
+Reviewed-by: Jiri Slaby <jirislaby@kernel.org>
+Acked-by: Richard Genoud <richard.genoud@gmail.com>
+Link: https://lore.kernel.org/r/cb7c39a9-c004-4673-92e1-be4e34b85368@moroto.mountain
+Cc: stable <stable@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/tty/serial/atmel_serial.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/tty/serial/atmel_serial.c
++++ b/drivers/tty/serial/atmel_serial.c
+@@ -868,11 +868,11 @@ static void atmel_complete_tx_dma(void *
+               dmaengine_terminate_all(chan);
+       uart_xmit_advance(port, atmel_port->tx_len);
+-      spin_lock_irq(&atmel_port->lock_tx);
++      spin_lock(&atmel_port->lock_tx);
+       async_tx_ack(atmel_port->desc_tx);
+       atmel_port->cookie_tx = -EINVAL;
+       atmel_port->desc_tx = NULL;
+-      spin_unlock_irq(&atmel_port->lock_tx);
++      spin_unlock(&atmel_port->lock_tx);
+       if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
+               uart_write_wakeup(port);
index 3453d2cd0153e8eb74e3f6e14cc0afa1983560b6..4af1fc51da5734143bd04c6e7c987fadd4120e77 100644 (file)
@@ -194,3 +194,28 @@ scsi-lpfc-fix-double-free-in-lpfc_cmpl_els_logo_acc-caused-by-lpfc_nlp_not_used.
 drm-atomic-allow-vblank-enabled-self-refresh-disable.patch
 drm-rockchip-vop-leave-vblank-enabled-in-self-refresh.patch
 drm-dp_mst-clear-msg_rdy-flag-before-sending-new-message.patch
+drm-amd-display-limit-dcn32-8-channel-or-less-parts-to-dpm1-for-fpo.patch
+drm-amd-display-fix-in-secure-display-context-creation.patch
+drm-amd-display-fix-seamless-odm-transitions.patch
+drm-amd-display-edp-do-not-add-non-edid-timings.patch
+drm-amd-display-remove-phantom-pipe-check-when-calculating-k1-and-k2.patch
+drm-amd-display-disable-seamless-boot-if-force_odm_combine-is-enabled.patch
+drm-amdgpu-fix-clearing-mappings-for-bos-that-are-always-valid-in-vm.patch
+drm-amd-disable-psr-su-on-parade-0803-tcon.patch
+drm-amd-align-smu11-smu_msg_overridepcieparameters-implementation-with-smu13.patch
+drm-amd-display-add-a-null-pointer-check.patch
+drm-amd-display-fix-128b132b-link-loss-handling.patch
+drm-amd-display-correct-dmub_fw_version-macro.patch
+drm-amd-display-add-monitor-specific-edid-quirk.patch
+drm-amdgpu-avoid-restore-process-run-into-dead-loop.patch
+drm-amd-pm-fix-smu-i2c-data-read-risk.patch
+drm-ttm-fix-bulk_move-corruption-when-adding-a-entry.patch
+drm-ttm-don-t-leak-a-resource-on-eviction-error.patch
+drm-ttm-don-t-leak-a-resource-on-swapout-move-error.patch
+drm-ttm-never-consider-pinned-bos-for-eviction-swap.patch
+serial-atmel-don-t-enable-irqs-prematurely.patch
+tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-in-case-of-error.patch
+tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-when-iterating-clk.patch
+tty-serial-imx-fix-rs485-rx-after-tx.patch
+tty-fix-hang-on-tty-device-with-no_room-set.patch
+firmware-stratix10-svc-fix-a-potential-resource-leak-in-svc_create_memory_pool.patch
diff --git a/queue-6.4/tty-fix-hang-on-tty-device-with-no_room-set.patch b/queue-6.4/tty-fix-hang-on-tty-device-with-no_room-set.patch
new file mode 100644 (file)
index 0000000..6900a4d
--- /dev/null
@@ -0,0 +1,110 @@
+From 4903fde8047a28299d1fc79c1a0dcc255e928f12 Mon Sep 17 00:00:00 2001
+From: Hui Li <caelli@tencent.com>
+Date: Thu, 6 Apr 2023 10:44:50 +0800
+Subject: tty: fix hang on tty device with no_room set
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Hui Li <caelli@tencent.com>
+
+commit 4903fde8047a28299d1fc79c1a0dcc255e928f12 upstream.
+
+It is possible to hang pty devices in this case, the reader was
+blocking at epoll on master side, the writer was sleeping at
+wait_woken inside n_tty_write on slave side, and the write buffer
+on tty_port was full, we found that the reader and writer would
+never be woken again and blocked forever.
+
+The problem was caused by a race between reader and kworker:
+n_tty_read(reader):  n_tty_receive_buf_common(kworker):
+copy_from_read_buf()|
+                    |room = N_TTY_BUF_SIZE - (ldata->read_head - tail)
+                    |room <= 0
+n_tty_kick_worker() |
+                    |ldata->no_room = true
+
+After writing to slave device, writer wakes up kworker to flush
+data on tty_port to reader, and the kworker finds that reader
+has no room to store data so room <= 0 is met. At this moment,
+reader consumes all the data on reader buffer and calls
+n_tty_kick_worker to check ldata->no_room which is false and
+reader quits reading. Then kworker sets ldata->no_room=true
+and quits too.
+
+If write buffer is not full, writer will wake kworker to flush data
+again after following writes, but if write buffer is full and writer
+goes to sleep, kworker will never be woken again and tty device is
+blocked.
+
+This problem can be solved with a check for read buffer size inside
+n_tty_receive_buf_common, if read buffer is empty and ldata->no_room
+is true, a call to n_tty_kick_worker is necessary to keep flushing
+data to reader.
+
+Cc: <stable@vger.kernel.org>
+Fixes: 42458f41d08f ("n_tty: Ensure reader restarts worker for next reader")
+Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Hui Li <caelli@tencent.com>
+Message-ID: <1680749090-14106-1-git-send-email-caelli@tencent.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/tty/n_tty.c |   25 +++++++++++++++++++++----
+ 1 file changed, 21 insertions(+), 4 deletions(-)
+
+--- a/drivers/tty/n_tty.c
++++ b/drivers/tty/n_tty.c
+@@ -203,8 +203,8 @@ static void n_tty_kick_worker(struct tty
+       struct n_tty_data *ldata = tty->disc_data;
+       /* Did the input worker stop? Restart it */
+-      if (unlikely(ldata->no_room)) {
+-              ldata->no_room = 0;
++      if (unlikely(READ_ONCE(ldata->no_room))) {
++              WRITE_ONCE(ldata->no_room, 0);
+               WARN_RATELIMIT(tty->port->itty == NULL,
+                               "scheduling with invalid itty\n");
+@@ -1697,7 +1697,7 @@ n_tty_receive_buf_common(struct tty_stru
+                       if (overflow && room < 0)
+                               ldata->read_head--;
+                       room = overflow;
+-                      ldata->no_room = flow && !room;
++                      WRITE_ONCE(ldata->no_room, flow && !room);
+               } else
+                       overflow = 0;
+@@ -1728,6 +1728,17 @@ n_tty_receive_buf_common(struct tty_stru
+       } else
+               n_tty_check_throttle(tty);
++      if (unlikely(ldata->no_room)) {
++              /*
++               * Barrier here is to ensure to read the latest read_tail in
++               * chars_in_buffer() and to make sure that read_tail is not loaded
++               * before ldata->no_room is set.
++               */
++              smp_mb();
++              if (!chars_in_buffer(tty))
++                      n_tty_kick_worker(tty);
++      }
++
+       up_read(&tty->termios_rwsem);
+       return rcvd;
+@@ -2281,8 +2292,14 @@ more_to_be_read:
+               if (time)
+                       timeout = time;
+       }
+-      if (old_tail != ldata->read_tail)
++      if (old_tail != ldata->read_tail) {
++              /*
++               * Make sure no_room is not read in n_tty_kick_worker()
++               * before setting ldata->read_tail in copy_from_read_buf().
++               */
++              smp_mb();
+               n_tty_kick_worker(tty);
++      }
+       up_read(&tty->termios_rwsem);
+       remove_wait_queue(&tty->read_wait, &wait);
diff --git a/queue-6.4/tty-serial-imx-fix-rs485-rx-after-tx.patch b/queue-6.4/tty-serial-imx-fix-rs485-rx-after-tx.patch
new file mode 100644 (file)
index 0000000..7d7e676
--- /dev/null
@@ -0,0 +1,89 @@
+From 639949a7031e04c59ec91614eceb9543e9120f43 Mon Sep 17 00:00:00 2001
+From: Martin Fuzzey <martin.fuzzey@flowbird.group>
+Date: Fri, 16 Jun 2023 12:47:23 +0200
+Subject: tty: serial: imx: fix rs485 rx after tx
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Martin Fuzzey <martin.fuzzey@flowbird.group>
+
+commit 639949a7031e04c59ec91614eceb9543e9120f43 upstream.
+
+Since commit 79d0224f6bf2 ("tty: serial: imx: Handle RS485 DE signal
+active high") RS485 reception no longer works after a transmission.
+
+The following scenario shows the problem:
+       1) Open a port in RS485 mode
+       2) Receive data from remote (OK)
+       3) Transmit data to remote (OK)
+       4) Receive data from remote (Nothing received)
+
+In RS485 mode, imx_uart_start_tx() calls imx_uart_stop_rx() and, when the
+transmission is complete, imx_uart_stop_tx() calls imx_uart_start_rx().
+
+Since the above commit imx_uart_stop_rx() now sets the loopback bit but
+imx_uart_start_rx() does not clear it causing the hardware to remain in
+loopback mode and not receive external data.
+
+Fix this by moving the existing loopback disable code to a helper function
+and calling it from imx_uart_start_rx() too.
+
+Fixes: 79d0224f6bf2 ("tty: serial: imx: Handle RS485 DE signal active high")
+Cc: stable@vger.kernel.org
+Signed-off-by: Martin Fuzzey <martin.fuzzey@flowbird.group>
+Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Link: https://lore.kernel.org/r/20230616104838.2729694-1-martin.fuzzey@flowbird.group
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/tty/serial/imx.c |   18 +++++++++++++-----
+ 1 file changed, 13 insertions(+), 5 deletions(-)
+
+--- a/drivers/tty/serial/imx.c
++++ b/drivers/tty/serial/imx.c
+@@ -369,6 +369,16 @@ static void imx_uart_soft_reset(struct i
+       sport->idle_counter = 0;
+ }
++static void imx_uart_disable_loopback_rs485(struct imx_port *sport)
++{
++      unsigned int uts;
++
++      /* See SER_RS485_ENABLED/UTS_LOOP comment in imx_uart_probe() */
++      uts = imx_uart_readl(sport, imx_uart_uts_reg(sport));
++      uts &= ~UTS_LOOP;
++      imx_uart_writel(sport, uts, imx_uart_uts_reg(sport));
++}
++
+ /* called with port.lock taken and irqs off */
+ static void imx_uart_start_rx(struct uart_port *port)
+ {
+@@ -390,6 +400,7 @@ static void imx_uart_start_rx(struct uar
+       /* Write UCR2 first as it includes RXEN */
+       imx_uart_writel(sport, ucr2, UCR2);
+       imx_uart_writel(sport, ucr1, UCR1);
++      imx_uart_disable_loopback_rs485(sport);
+ }
+ /* called with port.lock taken and irqs off */
+@@ -1422,7 +1433,7 @@ static int imx_uart_startup(struct uart_
+       int retval;
+       unsigned long flags;
+       int dma_is_inited = 0;
+-      u32 ucr1, ucr2, ucr3, ucr4, uts;
++      u32 ucr1, ucr2, ucr3, ucr4;
+       retval = clk_prepare_enable(sport->clk_per);
+       if (retval)
+@@ -1521,10 +1532,7 @@ static int imx_uart_startup(struct uart_
+               imx_uart_writel(sport, ucr2, UCR2);
+       }
+-      /* See SER_RS485_ENABLED/UTS_LOOP comment in imx_uart_probe() */
+-      uts = imx_uart_readl(sport, imx_uart_uts_reg(sport));
+-      uts &= ~UTS_LOOP;
+-      imx_uart_writel(sport, uts, imx_uart_uts_reg(sport));
++      imx_uart_disable_loopback_rs485(sport);
+       spin_unlock_irqrestore(&sport->port.lock, flags);
diff --git a/queue-6.4/tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-in-case-of-error.patch b/queue-6.4/tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-in-case-of-error.patch
new file mode 100644 (file)
index 0000000..9c73658
--- /dev/null
@@ -0,0 +1,40 @@
+From a9c09546e903f1068acfa38e1ee18bded7114b37 Mon Sep 17 00:00:00 2001
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Date: Sat, 10 Jun 2023 17:59:25 +0200
+Subject: tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+commit a9c09546e903f1068acfa38e1ee18bded7114b37 upstream.
+
+If clk_get_rate() fails, the clk that has just been allocated needs to be
+freed.
+
+Cc: <stable@vger.kernel.org> # v3.3+
+Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
+Fixes: 5f5a7a5578c5 ("serial: samsung: switch to clkdev based clock lookup")
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Reviewed-by: Jiri Slaby <jirislaby@kernel.org>
+Message-ID: <e4baf6039368f52e5a5453982ddcb9a330fc689e.1686412569.git.christophe.jaillet@wanadoo.fr>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/tty/serial/samsung_tty.c |    6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+--- a/drivers/tty/serial/samsung_tty.c
++++ b/drivers/tty/serial/samsung_tty.c
+@@ -1459,8 +1459,12 @@ static unsigned int s3c24xx_serial_getcl
+                       continue;
+               rate = clk_get_rate(clk);
+-              if (!rate)
++              if (!rate) {
++                      dev_err(ourport->port.dev,
++                              "Failed to get clock rate for %s.\n", clkname);
++                      clk_put(clk);
+                       continue;
++              }
+               if (ourport->info->has_divslot) {
+                       unsigned long div = rate / req_baud;
diff --git a/queue-6.4/tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-when-iterating-clk.patch b/queue-6.4/tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-when-iterating-clk.patch
new file mode 100644 (file)
index 0000000..08c6e43
--- /dev/null
@@ -0,0 +1,54 @@
+From 832e231cff476102e8204a9e7bddfe5c6154a375 Mon Sep 17 00:00:00 2001
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Date: Sat, 10 Jun 2023 17:59:26 +0200
+Subject: tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+commit 832e231cff476102e8204a9e7bddfe5c6154a375 upstream.
+
+When the best clk is searched, we iterate over all possible clk.
+
+If we find a better match, the previous one, if any, needs to be freed.
+If a better match has already been found, we still need to free the new
+one, otherwise it leaks.
+
+Cc: <stable@vger.kernel.org> # v3.3+
+Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
+Fixes: 5f5a7a5578c5 ("serial: samsung: switch to clkdev based clock lookup")
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Reviewed-by: Jiri Slaby <jirislaby@kernel.org>
+Message-ID: <cf3e0053d2fc7391b2d906a86cd01a5ef15fb9dc.1686412569.git.christophe.jaillet@wanadoo.fr>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/tty/serial/samsung_tty.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/drivers/tty/serial/samsung_tty.c b/drivers/tty/serial/samsung_tty.c
+index a92a23e1964e..0b37019820b4 100644
+--- a/drivers/tty/serial/samsung_tty.c
++++ b/drivers/tty/serial/samsung_tty.c
+@@ -1490,10 +1490,18 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
+                       calc_deviation = -calc_deviation;
+               if (calc_deviation < deviation) {
++                      /*
++                       * If we find a better clk, release the previous one, if
++                       * any.
++                       */
++                      if (!IS_ERR(*best_clk))
++                              clk_put(*best_clk);
+                       *best_clk = clk;
+                       best_quot = quot;
+                       *clk_num = cnt;
+                       deviation = calc_deviation;
++              } else {
++                      clk_put(clk);
+               }
+       }
+-- 
+2.41.0
+