From nobody Mon Jan 5 11:18:27 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E6395E784B3 for ; Mon, 2 Oct 2023 13:18:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237400AbjJBNSH (ORCPT ); Mon, 2 Oct 2023 09:18:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59278 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237359AbjJBNR6 (ORCPT ); Mon, 2 Oct 2023 09:17:58 -0400 Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [IPv6:2001:4b98:dc4:8::228]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 92DF6D9; Mon, 2 Oct 2023 06:17:54 -0700 (PDT) Received: by mail.gandi.net (Postfix) with ESMTPSA id 78A041BF211; Mon, 2 Oct 2023 13:17:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1696252672; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=i7v32YcvbtKkSJ6srCUo4fO3a6wW8xsgEHf4MdRd9fI=; b=Jv8P35xM3G4fXx7JgcG2Da0TXIVsgzHvLMfuRfHn/jbHcHUi4gQrgW+ety+Vpty+xxh1MF BdT9SzwYIQG/IS1beObVyXa3lSu7QvWDXJtzvfOQh6vWXzIQ5h7jYwPp+kKAdU++uXs690 LiCYnrvnYfOA8v5a7ig+jyUjnJP2xNRAuqkiTgqGxtN3aVLyO4tKcTeCyJ7upUc61a6SNx aFzHd6M2Ejd481iPcyCDwbesZLMfk7uZJF6IkgVZXsqM6cilX7dk9iwAQlGXaYyJz6Busk MNixVt1qBTx4Y9GmEwU2fgQmf6E6nLhV18WPg32126x1k0Yu4ig78JN2L4mF/Q== From: =?UTF-8?q?K=C3=B6ry=20Maincent?= To: Cai Huoqing , Manivannan Sadhasivam , Serge Semin , Vinod Koul , Gustavo Pimentel , dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Thomas Petazzoni , Gustavo Pimentel , Herve Codina , Kory Maincent Subject: [PATCH v2 1/5] dmaengine: dw-edma: Fix the ch_count hdma callback Date: Mon, 2 Oct 2023 15:17:45 +0200 Message-Id: <20231002131749.2977952-2-kory.maincent@bootlin.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231002131749.2977952-1-kory.maincent@bootlin.com> References: <20231002131749.2977952-1-kory.maincent@bootlin.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-GND-Sasl: kory.maincent@bootlin.com Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Kory Maincent The current check of ch_en enabled to know the maximum number of available hardware channels is wrong as it check the number of ch_en register set but all of them are unset at probe. This register is set at the dw_hdma_v0_core_start function which is run lately before a DMA transfer. The HDMA IP have no way to know the number of hardware channels available like the eDMA IP, then let set it to maximum channels and let the platform set the right number of channels. Fixes: e74c39573d35 ("dmaengine: dw-edma: Add support for native HDMA") Signed-off-by: Kory Maincent Acked-by: Manivannan Sadhasivam --- See the following thread mail that talk about this issue: https://lore.kernel.org/lkml/20230607095832.6d6b1a73@kmaincent-XPS-13-7390/ Changes in v2: - Add comment --- drivers/dma/dw-edma/dw-hdma-v0-core.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/drivers/dma/dw-edma/dw-hdma-v0-core.c b/drivers/dma/dw-edma/dw= -hdma-v0-core.c index 00b735a0202a..3e78d4fd3955 100644 --- a/drivers/dma/dw-edma/dw-hdma-v0-core.c +++ b/drivers/dma/dw-edma/dw-hdma-v0-core.c @@ -65,18 +65,11 @@ static void dw_hdma_v0_core_off(struct dw_edma *dw) =20 static u16 dw_hdma_v0_core_ch_count(struct dw_edma *dw, enum dw_edma_dir d= ir) { - u32 num_ch =3D 0; - int id; - - for (id =3D 0; id < HDMA_V0_MAX_NR_CH; id++) { - if (GET_CH_32(dw, id, dir, ch_en) & BIT(0)) - num_ch++; - } - - if (num_ch > HDMA_V0_MAX_NR_CH) - num_ch =3D HDMA_V0_MAX_NR_CH; - - return (u16)num_ch; + /* The HDMA IP have no way to know the number of hardware channels + * available, we set it to maximum channels and let the platform + * set the right number of channels. + */ + return HDMA_V0_MAX_NR_CH; } =20 static enum dma_status dw_hdma_v0_core_ch_status(struct dw_edma_chan *chan) --=20 2.25.1 From nobody Mon Jan 5 11:18:27 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6BF9FE7849A for ; Mon, 2 Oct 2023 13:18:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237425AbjJBNSK (ORCPT ); Mon, 2 Oct 2023 09:18:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59298 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237363AbjJBNR6 (ORCPT ); Mon, 2 Oct 2023 09:17:58 -0400 Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [217.70.183.201]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4CC57E1; Mon, 2 Oct 2023 06:17:55 -0700 (PDT) Received: by mail.gandi.net (Postfix) with ESMTPSA id C39881BF20E; Mon, 2 Oct 2023 13:17:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1696252673; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=mT/V21ZgEQ0E9DJBdo+wgQkk1YrIlUvlQ+wEJQpFcC8=; b=GQZlUx+5x7r/Gm2ThnYJtTloUB95jgjiw7izD7/slii+8QOyFTno7WCP+if7lw4QqssEX3 S1P7BAq0H1s+G+KE2j4GgdSDjP4w+ygjEHZBaf/HYkQqMTjOFVG2owVAlO0+uwKfQn46M+ wGIf9IJk2ShuWo6kQUrzYI2M5cOfmnL8LGKNd0e53D8x2/yM9Z/llDde/Y8wVpekUOSIsn izuAuPMA15qrH+g2Ea81dt2+TSqHpFN431kHsrg07s7wHM+lJZ0acSVH7hzXZ+xbks3xUA CDSfA9mqFUNBw6GQHVi/s6x4mZjjxC2xL4rNI/j35ZlniHSUg8FlFY479Q8QvA== From: =?UTF-8?q?K=C3=B6ry=20Maincent?= To: Cai Huoqing , Manivannan Sadhasivam , Serge Semin , Vinod Koul , Gustavo Pimentel , dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Thomas Petazzoni , Gustavo Pimentel , Herve Codina , Kory Maincent Subject: [PATCH v2 2/5] dmaengine: dw-edma: Typos fixes Date: Mon, 2 Oct 2023 15:17:46 +0200 Message-Id: <20231002131749.2977952-3-kory.maincent@bootlin.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231002131749.2977952-1-kory.maincent@bootlin.com> References: <20231002131749.2977952-1-kory.maincent@bootlin.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-GND-Sasl: kory.maincent@bootlin.com Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Kory Maincent Fix "HDMA_V0_REMOTEL_STOP_INT_EN" typo error. Fix "HDMA_V0_LOCAL_STOP_INT_EN" to "HDMA_V0_LOCAL_ABORT_INT_EN" as the STOP bit is already set in the same line. Fixes: e74c39573d35 ("dmaengine: dw-edma: Add support for native HDMA") Signed-off-by: Kory Maincent Reviewed-by: Serge Semin --- drivers/dma/dw-edma/dw-hdma-v0-core.c | 2 +- drivers/dma/dw-edma/dw-hdma-v0-regs.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/dma/dw-edma/dw-hdma-v0-core.c b/drivers/dma/dw-edma/dw= -hdma-v0-core.c index 3e78d4fd3955..0afafc683a9e 100644 --- a/drivers/dma/dw-edma/dw-hdma-v0-core.c +++ b/drivers/dma/dw-edma/dw-hdma-v0-core.c @@ -235,7 +235,7 @@ static void dw_hdma_v0_core_start(struct dw_edma_chunk = *chunk, bool first) /* Interrupt enable&unmask - done, abort */ tmp =3D GET_CH_32(dw, chan->dir, chan->id, int_setup) | HDMA_V0_STOP_INT_MASK | HDMA_V0_ABORT_INT_MASK | - HDMA_V0_LOCAL_STOP_INT_EN | HDMA_V0_LOCAL_STOP_INT_EN; + HDMA_V0_LOCAL_STOP_INT_EN | HDMA_V0_LOCAL_ABORT_INT_EN; SET_CH_32(dw, chan->dir, chan->id, int_setup, tmp); /* Channel control */ SET_CH_32(dw, chan->dir, chan->id, control1, HDMA_V0_LINKLIST_EN); diff --git a/drivers/dma/dw-edma/dw-hdma-v0-regs.h b/drivers/dma/dw-edma/dw= -hdma-v0-regs.h index a974abdf8aaf..eab5fd7177e5 100644 --- a/drivers/dma/dw-edma/dw-hdma-v0-regs.h +++ b/drivers/dma/dw-edma/dw-hdma-v0-regs.h @@ -15,7 +15,7 @@ #define HDMA_V0_LOCAL_ABORT_INT_EN BIT(6) #define HDMA_V0_REMOTE_ABORT_INT_EN BIT(5) #define HDMA_V0_LOCAL_STOP_INT_EN BIT(4) -#define HDMA_V0_REMOTEL_STOP_INT_EN BIT(3) +#define HDMA_V0_REMOTE_STOP_INT_EN BIT(3) #define HDMA_V0_ABORT_INT_MASK BIT(2) #define HDMA_V0_STOP_INT_MASK BIT(0) #define HDMA_V0_LINKLIST_EN BIT(0) --=20 2.25.1 From nobody Mon Jan 5 11:18:27 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 52823E7849A for ; Mon, 2 Oct 2023 13:18:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237339AbjJBNSN (ORCPT ); Mon, 2 Oct 2023 09:18:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59326 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237371AbjJBNSA (ORCPT ); Mon, 2 Oct 2023 09:18:00 -0400 Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [217.70.183.201]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AE531B0; Mon, 2 Oct 2023 06:17:56 -0700 (PDT) Received: by mail.gandi.net (Postfix) with ESMTPSA id 1B9C41BF212; Mon, 2 Oct 2023 13:17:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1696252675; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=V6qb0UV8Z2ZKESqm4bQ1W8nZg6JqpnXsb2K3oQSjwYc=; b=RybW5RZYQzCY7NtLtfl1deihG3t1AsWq3uXVglpL4oTEmVrv66uF62mj8ofOQ4ei+Tl4jf UqJ8yHfWTm1l44Ipz03M62Ol+nxaaH8S14t1HOemxwgXgaeytay0BiwEYAniM7ZMzeoZdy rAHt6s57HVUOGxzImVDgq+CRsxuOIizesbTjE5eBoPmLnGip0FKVlqvQ2u79wfCyjIZxVO 7JC0Z8tt83lgfAN0nMpBMmW5hWjc9fzEUKZ3jRG8tpVtI+UkThTaxAF62C6HXJJnsbGWbV 2iA1t0I90grWFkUxNngK1ruE14nQvzP1tN8GVCaUiOPCAsnVUnm+q35dGWerbQ== From: =?UTF-8?q?K=C3=B6ry=20Maincent?= To: Cai Huoqing , Manivannan Sadhasivam , Serge Semin , Vinod Koul , Gustavo Pimentel , dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Thomas Petazzoni , Gustavo Pimentel , Herve Codina , Kory Maincent Subject: [PATCH v2 3/5] dmaengine: dw-edma: Add HDMA remote interrupt configuration Date: Mon, 2 Oct 2023 15:17:47 +0200 Message-Id: <20231002131749.2977952-4-kory.maincent@bootlin.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231002131749.2977952-1-kory.maincent@bootlin.com> References: <20231002131749.2977952-1-kory.maincent@bootlin.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-GND-Sasl: kory.maincent@bootlin.com Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Kory Maincent Only the local interruption was configured, remote interrupt was left behind. This patch fix it by setting stop and abort remote interrupts when the DW_EDMA_CHIP_LOCAL flag is not set. Fixes: e74c39573d35 ("dmaengine: dw-edma: Add support for native HDMA") Signed-off-by: Kory Maincent Reviewed-by: Serge Semin Acked-by: Manivannan Sadhasivam --- drivers/dma/dw-edma/dw-hdma-v0-core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/dma/dw-edma/dw-hdma-v0-core.c b/drivers/dma/dw-edma/dw= -hdma-v0-core.c index 0afafc683a9e..0cce1880cfdc 100644 --- a/drivers/dma/dw-edma/dw-hdma-v0-core.c +++ b/drivers/dma/dw-edma/dw-hdma-v0-core.c @@ -236,6 +236,8 @@ static void dw_hdma_v0_core_start(struct dw_edma_chunk = *chunk, bool first) tmp =3D GET_CH_32(dw, chan->dir, chan->id, int_setup) | HDMA_V0_STOP_INT_MASK | HDMA_V0_ABORT_INT_MASK | HDMA_V0_LOCAL_STOP_INT_EN | HDMA_V0_LOCAL_ABORT_INT_EN; + if (!(dw->chip->flags & DW_EDMA_CHIP_LOCAL)) + tmp |=3D HDMA_V0_REMOTE_STOP_INT_EN | HDMA_V0_REMOTE_ABORT_INT_EN; SET_CH_32(dw, chan->dir, chan->id, int_setup, tmp); /* Channel control */ SET_CH_32(dw, chan->dir, chan->id, control1, HDMA_V0_LINKLIST_EN); --=20 2.25.1 From nobody Mon Jan 5 11:18:27 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4ECEBE7849A for ; Mon, 2 Oct 2023 13:18:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237440AbjJBNSQ (ORCPT ); Mon, 2 Oct 2023 09:18:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59364 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237381AbjJBNSB (ORCPT ); Mon, 2 Oct 2023 09:18:01 -0400 Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [217.70.183.201]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E3EF3C6; Mon, 2 Oct 2023 06:17:57 -0700 (PDT) Received: by mail.gandi.net (Postfix) with ESMTPSA id 81AED1BF205; Mon, 2 Oct 2023 13:17:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1696252676; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=F+CSUvAMd1jybDq39rbPIkUIvZut6yZ4pfXMFOmMcHw=; b=Bu7573VhSa5erKsSfwK0iaEuh1VE0npy5odZq3iNi+YU0L+E6Tg69KeevCCXPqC0VXyT0a RZp//Qp3exSV75CU9MjD1plVw64IoBSBKPfq8+lVCOj7LfG3TPAAPh/aQiZ+tHCIbmce3x IFdbf3LBwq1ba/VIlrmUAIDMgJ8WJOPLvf9+v6ZZX/oOr9BKlYLaTpNUHktd7Dyq+lgWTj xzwh835qXlf65Ccnr+nmscYy5V4gVZb0cBcj90RF+c0KbU/r9K1dWAxSbA20feyzGcDzIs rj9+RKK49RBbwx2WPqWSgYgzkCgEV8EFgOoH1Gu7HABc0jo6qrkHAD+ofj8U2Q== From: =?UTF-8?q?K=C3=B6ry=20Maincent?= To: Cai Huoqing , Manivannan Sadhasivam , Serge Semin , Vinod Koul , Gustavo Pimentel , dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Thomas Petazzoni , Gustavo Pimentel , Herve Codina , Kory Maincent Subject: [PATCH v2 4/5] dmaengine: dw-edma: HDMA: Add sync read before starting the DMA transfer in remote setup Date: Mon, 2 Oct 2023 15:17:48 +0200 Message-Id: <20231002131749.2977952-5-kory.maincent@bootlin.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231002131749.2977952-1-kory.maincent@bootlin.com> References: <20231002131749.2977952-1-kory.maincent@bootlin.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-GND-Sasl: kory.maincent@bootlin.com Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Kory Maincent The Linked list element and pointer are not stored in the same memory as the HDMA controller register. If the doorbell register is toggled before the full write of the linked list a race condition error can appears. In remote setup we can only use a readl to the memory to assured the full write has occurred. Fixes: e74c39573d35 ("dmaengine: dw-edma: Add support for native HDMA") Signed-off-by: Kory Maincent --- Changes in v2: - Move the sync read in a function. - Add commments --- drivers/dma/dw-edma/dw-hdma-v0-core.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/dma/dw-edma/dw-hdma-v0-core.c b/drivers/dma/dw-edma/dw= -hdma-v0-core.c index 0cce1880cfdc..26b5020dcc2a 100644 --- a/drivers/dma/dw-edma/dw-hdma-v0-core.c +++ b/drivers/dma/dw-edma/dw-hdma-v0-core.c @@ -221,6 +221,25 @@ static void dw_hdma_v0_core_write_chunk(struct dw_edma= _chunk *chunk) dw_hdma_v0_write_ll_link(chunk, i, control, chunk->ll_region.paddr); } =20 +/** + * dw_hdma_v0_sync_ll_data() - sync the ll data write + * @chunk: dma chunk + * + * In case of remote HDMA engine setup, the DW PCIe RP/EP internals + * configuration registers and Application memory are normally accesse + * over different buses. We need to insure ll data has been written before + * toggling the doorbell register. + */ +static void dw_hdma_v0_sync_ll_data(struct dw_edma_chunk *chunk) +{ + if (!(chunk->chan->dw->chip->flags & DW_EDMA_CHIP_LOCAL)) + /* Linux memory barriers don't cater for what's required here. + * What's required is what's here - a read of the linked + * list region. + */ + readl(chunk->ll_region.vaddr.io); +} + static void dw_hdma_v0_core_start(struct dw_edma_chunk *chunk, bool first) { struct dw_edma_chan *chan =3D chunk->chan; @@ -251,6 +270,9 @@ static void dw_hdma_v0_core_start(struct dw_edma_chunk = *chunk, bool first) /* Set consumer cycle */ SET_CH_32(dw, chan->dir, chan->id, cycle_sync, HDMA_V0_CONSUMER_CYCLE_STAT | HDMA_V0_CONSUMER_CYCLE_BIT); + + dw_hdma_v0_sync_ll_data(chunk); + /* Doorbell */ SET_CH_32(dw, chan->dir, chan->id, doorbell, HDMA_V0_DOORBELL_START); } --=20 2.25.1 From nobody Mon Jan 5 11:18:27 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E3B88E784AD for ; Mon, 2 Oct 2023 13:18:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237438AbjJBNSU (ORCPT ); Mon, 2 Oct 2023 09:18:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59438 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237399AbjJBNSD (ORCPT ); Mon, 2 Oct 2023 09:18:03 -0400 Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [IPv6:2001:4b98:dc4:8::228]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6E03FD9; Mon, 2 Oct 2023 06:17:59 -0700 (PDT) Received: by mail.gandi.net (Postfix) with ESMTPSA id CD3681BF216; Mon, 2 Oct 2023 13:17:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1696252677; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uFnqrIivznbc7iY4pOaLEZYZBXChdROSQsmwT2VMB+U=; b=BKaiwBuMn/fwnRgXKNjIC2RC1raMjrtxyygUVqr8E4DjTT5BJUYlw/QkKwl1i+8a39Pwm/ 5Lq3WOnihBFL2GG+YOCcHZde8jefLLukH24pDbGyOSM2mvfS4ZGbamse1lWt+k3gG+a4aI sU3q1Sn1YiIiKrbaSlTqWD3U+/R/n02Bfz+NB/n6VaFw62F+Nst+eKhaR74cnltoMBxfJb wBkUM5sxVmWC4Vl8P9Wu+HlrjMttDLKlgWy7zlvGVm00epzRo5IAkgAWg4/Kmza/EDRZX3 TSiHUyt2nEmra7XQKXcwCNjEnVBgaisd+8ifZ/9Ae9SUPiKN3aV9BsRf8V55LQ== From: =?UTF-8?q?K=C3=B6ry=20Maincent?= To: Cai Huoqing , Manivannan Sadhasivam , Serge Semin , Vinod Koul , Gustavo Pimentel , dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Thomas Petazzoni , Gustavo Pimentel , Herve Codina , Kory Maincent Subject: [PATCH v2 5/5] dmaengine: dw-edma: eDMA: Add sync read before starting the DMA transfer in remote setup Date: Mon, 2 Oct 2023 15:17:49 +0200 Message-Id: <20231002131749.2977952-6-kory.maincent@bootlin.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231002131749.2977952-1-kory.maincent@bootlin.com> References: <20231002131749.2977952-1-kory.maincent@bootlin.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-GND-Sasl: kory.maincent@bootlin.com Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Kory Maincent The Linked list element and pointer are not stored in the same memory as the eDMA controller register. If the doorbell register is toggled before the full write of the linked list a race condition error can appears. In remote setup we can only use a readl to the memory to assured the full write has occurred. Fixes: 7e4b8a4fbe2c ("dmaengine: Add Synopsys eDMA IP version 0 support") Signed-off-by: Kory Maincent --- drivers/dma/dw-edma/dw-edma-v0-core.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/dma/dw-edma/dw-edma-v0-core.c b/drivers/dma/dw-edma/dw= -edma-v0-core.c index b38786f0ad79..75c0b1fa9c40 100644 --- a/drivers/dma/dw-edma/dw-edma-v0-core.c +++ b/drivers/dma/dw-edma/dw-edma-v0-core.c @@ -346,6 +346,25 @@ static void dw_edma_v0_core_write_chunk(struct dw_edma= _chunk *chunk) dw_edma_v0_write_ll_link(chunk, i, control, chunk->ll_region.paddr); } =20 +/** + * dw_edma_v0_sync_ll_data() - sync the ll data write + * @chunk: dma chunk + * + * In case of remote eDMA engine setup, the DW PCIe RP/EP internals + * configuration registers and Application memory are normally accesse + * over different buses. We need to insure ll data has been written before + * toggling the doorbell register. + */ +static void dw_edma_v0_sync_ll_data(struct dw_edma_chunk *chunk) +{ + if (!(chunk->chan->dw->chip->flags & DW_EDMA_CHIP_LOCAL)) + /* Linux memory barriers don't cater for what's required here. + * What's required is what's here - a read of the linked + * list region. + */ + readl(chunk->ll_region.vaddr.io); +} + static void dw_edma_v0_core_start(struct dw_edma_chunk *chunk, bool first) { struct dw_edma_chan *chan =3D chunk->chan; @@ -412,6 +431,9 @@ static void dw_edma_v0_core_start(struct dw_edma_chunk = *chunk, bool first) SET_CH_32(dw, chan->dir, chan->id, llp.msb, upper_32_bits(chunk->ll_region.paddr)); } + + dw_edma_v0_sync_ll_data(chunk); + /* Doorbell */ SET_RW_32(dw, chan->dir, doorbell, FIELD_PREP(EDMA_V0_DOORBELL_CH_MASK, chan->id)); --=20 2.25.1