From d2982f2a19db0026e2a9e6e2dfae857e9e602b49 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 21 Jul 2023 09:40:19 +0200 Subject: [PATCH] 5.15-stable patches added patches: drm-amd-display-add-monitor-specific-edid-quirk.patch drm-amd-display-correct-dmub_fw_version-macro.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-swapout-move-error.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-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 --- ...play-add-monitor-specific-edid-quirk.patch | 65 ++++++++++++++ ...isplay-correct-dmub_fw_version-macro.patch | 37 ++++++++ ...d-restore-process-run-into-dead-loop.patch | 33 +++++++ ...-for-bos-that-are-always-valid-in-vm.patch | 62 +++++++++++++ ...eak-a-resource-on-swapout-move-error.patch | 40 +++++++++ ...onsider-pinned-bos-for-eviction-swap.patch | 41 +++++++++ ...ource-leak-in-svc_create_memory_pool.patch | 39 ++++++++ ...-atmel-don-t-enable-irqs-prematurely.patch | 45 ++++++++++ queue-5.15/series | 11 +++ ...tty-serial-imx-fix-rs485-rx-after-tx.patch | 89 +++++++++++++++++++ ...c24xx_serial_getclk-in-case-of-error.patch | 40 +++++++++ ...4xx_serial_getclk-when-iterating-clk.patch | 48 ++++++++++ 12 files changed, 550 insertions(+) create mode 100644 queue-5.15/drm-amd-display-add-monitor-specific-edid-quirk.patch create mode 100644 queue-5.15/drm-amd-display-correct-dmub_fw_version-macro.patch create mode 100644 queue-5.15/drm-amdgpu-avoid-restore-process-run-into-dead-loop.patch create mode 100644 queue-5.15/drm-amdgpu-fix-clearing-mappings-for-bos-that-are-always-valid-in-vm.patch create mode 100644 queue-5.15/drm-ttm-don-t-leak-a-resource-on-swapout-move-error.patch create mode 100644 queue-5.15/drm-ttm-never-consider-pinned-bos-for-eviction-swap.patch create mode 100644 queue-5.15/firmware-stratix10-svc-fix-a-potential-resource-leak-in-svc_create_memory_pool.patch create mode 100644 queue-5.15/serial-atmel-don-t-enable-irqs-prematurely.patch create mode 100644 queue-5.15/tty-serial-imx-fix-rs485-rx-after-tx.patch create mode 100644 queue-5.15/tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-in-case-of-error.patch create mode 100644 queue-5.15/tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-when-iterating-clk.patch diff --git a/queue-5.15/drm-amd-display-add-monitor-specific-edid-quirk.patch b/queue-5.15/drm-amd-display-add-monitor-specific-edid-quirk.patch new file mode 100644 index 00000000000..5995cc6a4ae --- /dev/null +++ b/queue-5.15/drm-amd-display-add-monitor-specific-edid-quirk.patch @@ -0,0 +1,65 @@ +From 613a7956deb3b1ffa2810c6d4c90ee9c3d743dbb Mon Sep 17 00:00:00 2001 +From: Aurabindo Pillai +Date: Mon, 12 Jun 2023 12:44:00 -0400 +Subject: drm/amd/display: Add monitor specific edid quirk + +From: Aurabindo Pillai + +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 +Signed-off-by: Aurabindo Pillai +Tested-by: Daniel Wheeler +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman +--- + 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 +@@ -40,6 +40,30 @@ + + #include "dm_helpers.h" + ++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 +@@ -122,6 +146,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-5.15/drm-amd-display-correct-dmub_fw_version-macro.patch b/queue-5.15/drm-amd-display-correct-dmub_fw_version-macro.patch new file mode 100644 index 00000000000..203c6c7442b --- /dev/null +++ b/queue-5.15/drm-amd-display-correct-dmub_fw_version-macro.patch @@ -0,0 +1,37 @@ +From 274d205cb59f43815542e04b42a9e6d0b9b95eff Mon Sep 17 00:00:00 2001 +From: Mario Limonciello +Date: Fri, 23 Jun 2023 10:05:19 -0500 +Subject: drm/amd/display: Correct `DMUB_FW_VERSION` macro + +From: Mario Limonciello + +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 +Cc: Marc Rossi +Cc: Hamza Mahfooz +Cc: Tsung-hua (Ryan) Lin +Reviewed-by: Leo Li +Signed-off-by: Mario Limonciello +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman +--- + 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 +@@ -445,7 +445,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-5.15/drm-amdgpu-avoid-restore-process-run-into-dead-loop.patch b/queue-5.15/drm-amdgpu-avoid-restore-process-run-into-dead-loop.patch new file mode 100644 index 00000000000..7b6fa65a1d0 --- /dev/null +++ b/queue-5.15/drm-amdgpu-avoid-restore-process-run-into-dead-loop.patch @@ -0,0 +1,33 @@ +From 8a774fe912ff09e39c2d3a3589c729330113f388 Mon Sep 17 00:00:00 2001 +From: gaba +Date: Thu, 2 Mar 2023 19:03:56 -0500 +Subject: drm/amdgpu: avoid restore process run into dead loop. + +From: gaba + +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 +Reviewed-by: Felix Kuehling +Signed-off-by: Alex Deucher +Cc: stable@vger.kernel.org +Signed-off-by: Greg Kroah-Hartman +--- + 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 +@@ -2350,6 +2350,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, NULL); + if (ret) { diff --git a/queue-5.15/drm-amdgpu-fix-clearing-mappings-for-bos-that-are-always-valid-in-vm.patch b/queue-5.15/drm-amdgpu-fix-clearing-mappings-for-bos-that-are-always-valid-in-vm.patch new file mode 100644 index 00000000000..c30d7f40dd1 --- /dev/null +++ b/queue-5.15/drm-amdgpu-fix-clearing-mappings-for-bos-that-are-always-valid-in-vm.patch @@ -0,0 +1,62 @@ +From ea2c3c08554601b051d91403a241266e1cf490a5 Mon Sep 17 00:00:00 2001 +From: Samuel Pitoiset +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 + +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 +Reviewed-by: Christian König +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman +--- + 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 +@@ -2575,18 +2575,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-5.15/drm-ttm-don-t-leak-a-resource-on-swapout-move-error.patch b/queue-5.15/drm-ttm-don-t-leak-a-resource-on-swapout-move-error.patch new file mode 100644 index 00000000000..1dc5bef78a6 --- /dev/null +++ b/queue-5.15/drm-ttm-don-t-leak-a-resource-on-swapout-move-error.patch @@ -0,0 +1,40 @@ +From a590f03d8de7c4cb7ce4916dc7f2fd10711faabe Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= +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 + +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 +Cc: "Christian König" +Cc: dri-devel@lists.freedesktop.org +Cc: # v5.14+ +Signed-off-by: Thomas Hellström +Reviewed-by: Nirmoy Das +Reviewed-by: Andi Shyti +Reviewed-by: Christian König +Link: https://patchwork.freedesktop.org/patch/msgid/20230626091450.14757-5-thomas.hellstrom@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +--- + 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 +@@ -1187,6 +1187,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-5.15/drm-ttm-never-consider-pinned-bos-for-eviction-swap.patch b/queue-5.15/drm-ttm-never-consider-pinned-bos-for-eviction-swap.patch new file mode 100644 index 00000000000..bed5ba2b9df --- /dev/null +++ b/queue-5.15/drm-ttm-never-consider-pinned-bos-for-eviction-swap.patch @@ -0,0 +1,41 @@ +From a2848d08742c8e8494675892c02c0d22acbe3cf8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= +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 + +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 +Reported-by: Pelloux-Prayer, Pierre-Eric +Tested-by: Pelloux-Prayer, Pierre-Eric +Acked-by: Alex Deucher +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 +--- + 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 +@@ -603,6 +603,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-5.15/firmware-stratix10-svc-fix-a-potential-resource-leak-in-svc_create_memory_pool.patch b/queue-5.15/firmware-stratix10-svc-fix-a-potential-resource-leak-in-svc_create_memory_pool.patch new file mode 100644 index 00000000000..9b2812dbc59 --- /dev/null +++ b/queue-5.15/firmware-stratix10-svc-fix-a-potential-resource-leak-in-svc_create_memory_pool.patch @@ -0,0 +1,39 @@ +From 1995f15590ca222f91193ed11461862b450abfd6 Mon Sep 17 00:00:00 2001 +From: Christophe JAILLET +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 + +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 +Signed-off-by: Dinh Nguyen +Message-ID: <20230613211521.16366-1-dinguyen@kernel.org> +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Greg Kroah-Hartman +--- + drivers/firmware/stratix10-svc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/firmware/stratix10-svc.c ++++ b/drivers/firmware/stratix10-svc.c +@@ -622,7 +622,7 @@ svc_create_memory_pool(struct platform_d + 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); diff --git a/queue-5.15/serial-atmel-don-t-enable-irqs-prematurely.patch b/queue-5.15/serial-atmel-don-t-enable-irqs-prematurely.patch new file mode 100644 index 00000000000..ef5da09ec7b --- /dev/null +++ b/queue-5.15/serial-atmel-don-t-enable-irqs-prematurely.patch @@ -0,0 +1,45 @@ +From 27a826837ec9a3e94cc44bd9328b8289b0fcecd7 Mon Sep 17 00:00:00 2001 +From: Dan Carpenter +Date: Mon, 19 Jun 2023 12:45:17 +0300 +Subject: serial: atmel: don't enable IRQs prematurely + +From: Dan Carpenter + +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 +Reviewed-by: Jiri Slaby +Acked-by: Richard Genoud +Link: https://lore.kernel.org/r/cb7c39a9-c004-4673-92e1-be4e34b85368@moroto.mountain +Cc: stable +Signed-off-by: Greg Kroah-Hartman +--- + 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 +@@ -873,11 +873,11 @@ static void atmel_complete_tx_dma(void * + + port->icount.tx += 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); diff --git a/queue-5.15/series b/queue-5.15/series index fa936521ca0..04bd2ef0874 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -486,3 +486,14 @@ dm-init-add-dm-mod.waitfor-to-wait-for-asynchronously-probed-block-devices.patch fs-dlm-return-positive-pid-value-for-f_getlk.patch drm-atomic-allow-vblank-enabled-self-refresh-disable.patch drm-rockchip-vop-leave-vblank-enabled-in-self-refresh.patch +drm-amdgpu-fix-clearing-mappings-for-bos-that-are-always-valid-in-vm.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-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 +firmware-stratix10-svc-fix-a-potential-resource-leak-in-svc_create_memory_pool.patch diff --git a/queue-5.15/tty-serial-imx-fix-rs485-rx-after-tx.patch b/queue-5.15/tty-serial-imx-fix-rs485-rx-after-tx.patch new file mode 100644 index 00000000000..654d5949449 --- /dev/null +++ b/queue-5.15/tty-serial-imx-fix-rs485-rx-after-tx.patch @@ -0,0 +1,89 @@ +From 639949a7031e04c59ec91614eceb9543e9120f43 Mon Sep 17 00:00:00 2001 +From: Martin Fuzzey +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 + +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 +Reviewed-by: Ilpo Järvinen +Link: https://lore.kernel.org/r/20230616104838.2729694-1-martin.fuzzey@flowbird.group +Signed-off-by: Greg Kroah-Hartman +--- + 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 +@@ -397,6 +397,16 @@ static void start_hrtimer_ms(struct hrti + hrtimer_start(hrt, ms_to_ktime(msec), HRTIMER_MODE_REL); + } + ++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) + { +@@ -418,6 +428,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 */ +@@ -1394,7 +1405,7 @@ static int imx_uart_startup(struct uart_ + int retval, i; + 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) +@@ -1499,10 +1510,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-5.15/tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-in-case-of-error.patch b/queue-5.15/tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-in-case-of-error.patch new file mode 100644 index 00000000000..41a098bd7f0 --- /dev/null +++ b/queue-5.15/tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-in-case-of-error.patch @@ -0,0 +1,40 @@ +From a9c09546e903f1068acfa38e1ee18bded7114b37 Mon Sep 17 00:00:00 2001 +From: Christophe JAILLET +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 + +commit a9c09546e903f1068acfa38e1ee18bded7114b37 upstream. + +If clk_get_rate() fails, the clk that has just been allocated needs to be +freed. + +Cc: # v3.3+ +Reviewed-by: Krzysztof Kozlowski +Reviewed-by: Andi Shyti +Fixes: 5f5a7a5578c5 ("serial: samsung: switch to clkdev based clock lookup") +Signed-off-by: Christophe JAILLET +Reviewed-by: Jiri Slaby +Message-ID: +Signed-off-by: Greg Kroah-Hartman +--- + 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 +@@ -1478,8 +1478,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-5.15/tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-when-iterating-clk.patch b/queue-5.15/tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-when-iterating-clk.patch new file mode 100644 index 00000000000..1c112153a18 --- /dev/null +++ b/queue-5.15/tty-serial-samsung_tty-fix-a-memory-leak-in-s3c24xx_serial_getclk-when-iterating-clk.patch @@ -0,0 +1,48 @@ +From 832e231cff476102e8204a9e7bddfe5c6154a375 Mon Sep 17 00:00:00 2001 +From: Christophe JAILLET +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 + +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: # v3.3+ +Reviewed-by: Krzysztof Kozlowski +Reviewed-by: Andi Shyti +Fixes: 5f5a7a5578c5 ("serial: samsung: switch to clkdev based clock lookup") +Signed-off-by: Christophe JAILLET +Reviewed-by: Jiri Slaby +Message-ID: +Signed-off-by: Greg Kroah-Hartman +--- + drivers/tty/serial/samsung_tty.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/drivers/tty/serial/samsung_tty.c ++++ b/drivers/tty/serial/samsung_tty.c +@@ -1509,10 +1509,18 @@ static unsigned int s3c24xx_serial_getcl + 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.47.3