stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Manuel Lauss <manuel.lauss@gmail.com>,
	Thomas Bogendoerfer <tsbogend@alpha.franken.de>,
	Sasha Levin <sashal@kernel.org>,
	linux-mips@vger.kernel.org
Subject: [PATCH AUTOSEL 5.15 19/24] MIPS: Alchemy: fix dbdma2
Date: Wed, 31 May 2023 09:43:15 -0400	[thread overview]
Message-ID: <20230531134320.3384102-19-sashal@kernel.org> (raw)
In-Reply-To: <20230531134320.3384102-1-sashal@kernel.org>

From: Manuel Lauss <manuel.lauss@gmail.com>

[ Upstream commit 2d645604f69f3a772d58ead702f9a8e84ab2b342 ]

Various fixes for the Au1200/Au1550/Au1300 DBDMA2 code:

- skip cache invalidation if chip has working coherency circuitry.
- invalidate KSEG0-portion of the (physical) data address.
- force the dma channel doorbell write out to bus immediately with
  a sync.

Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 arch/mips/alchemy/common/dbdma.c | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/arch/mips/alchemy/common/dbdma.c b/arch/mips/alchemy/common/dbdma.c
index 4ca2c28878e0f..e9ee9ab90a0c6 100644
--- a/arch/mips/alchemy/common/dbdma.c
+++ b/arch/mips/alchemy/common/dbdma.c
@@ -30,6 +30,7 @@
  *
  */
 
+#include <linux/dma-map-ops.h> /* for dma_default_coherent */
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
@@ -623,17 +624,18 @@ u32 au1xxx_dbdma_put_source(u32 chanid, dma_addr_t buf, int nbytes, u32 flags)
 		dp->dscr_cmd0 &= ~DSCR_CMD0_IE;
 
 	/*
-	 * There is an errata on the Au1200/Au1550 parts that could result
-	 * in "stale" data being DMA'ed. It has to do with the snoop logic on
-	 * the cache eviction buffer.  DMA_NONCOHERENT is on by default for
-	 * these parts. If it is fixed in the future, these dma_cache_inv will
-	 * just be nothing more than empty macros. See io.h.
+	 * There is an erratum on certain Au1200/Au1550 revisions that could
+	 * result in "stale" data being DMA'ed. It has to do with the snoop
+	 * logic on the cache eviction buffer.  dma_default_coherent is set
+	 * to false on these parts.
 	 */
-	dma_cache_wback_inv((unsigned long)buf, nbytes);
+	if (!dma_default_coherent)
+		dma_cache_wback_inv(KSEG0ADDR(buf), nbytes);
 	dp->dscr_cmd0 |= DSCR_CMD0_V;	/* Let it rip */
 	wmb(); /* drain writebuffer */
 	dma_cache_wback_inv((unsigned long)dp, sizeof(*dp));
 	ctp->chan_ptr->ddma_dbell = 0;
+	wmb(); /* force doorbell write out to dma engine */
 
 	/* Get next descriptor pointer. */
 	ctp->put_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
@@ -685,17 +687,18 @@ u32 au1xxx_dbdma_put_dest(u32 chanid, dma_addr_t buf, int nbytes, u32 flags)
 			  dp->dscr_source1, dp->dscr_dest0, dp->dscr_dest1);
 #endif
 	/*
-	 * There is an errata on the Au1200/Au1550 parts that could result in
-	 * "stale" data being DMA'ed. It has to do with the snoop logic on the
-	 * cache eviction buffer.  DMA_NONCOHERENT is on by default for these
-	 * parts. If it is fixed in the future, these dma_cache_inv will just
-	 * be nothing more than empty macros. See io.h.
+	 * There is an erratum on certain Au1200/Au1550 revisions that could
+	 * result in "stale" data being DMA'ed. It has to do with the snoop
+	 * logic on the cache eviction buffer.  dma_default_coherent is set
+	 * to false on these parts.
 	 */
-	dma_cache_inv((unsigned long)buf, nbytes);
+	if (!dma_default_coherent)
+		dma_cache_inv(KSEG0ADDR(buf), nbytes);
 	dp->dscr_cmd0 |= DSCR_CMD0_V;	/* Let it rip */
 	wmb(); /* drain writebuffer */
 	dma_cache_wback_inv((unsigned long)dp, sizeof(*dp));
 	ctp->chan_ptr->ddma_dbell = 0;
+	wmb(); /* force doorbell write out to dma engine */
 
 	/* Get next descriptor pointer. */
 	ctp->put_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
-- 
2.39.2


  parent reply	other threads:[~2023-05-31 13:47 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-31 13:42 [PATCH AUTOSEL 5.15 01/24] power: supply: ab8500: Fix external_power_changed race Sasha Levin
2023-05-31 13:42 ` [PATCH AUTOSEL 5.15 02/24] power: supply: sc27xx: " Sasha Levin
2023-05-31 13:42 ` [PATCH AUTOSEL 5.15 03/24] power: supply: bq27xxx: Use mod_delayed_work() instead of cancel() + schedule() Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 04/24] ARM: dts: vexpress: add missing cache properties Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 05/24] tools: gpio: fix debounce_period_us output of lsgpio Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 06/24] power: supply: Ratelimit no data debug output Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 07/24] platform/x86: asus-wmi: Ignore WMI events with codes 0x7B, 0xC0 Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 08/24] regulator: Fix error checking for debugfs_create_dir Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 09/24] irqchip/gic-v3: Disable pseudo NMIs on Mediatek devices w/ firmware issues Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 10/24] power: supply: Fix logic checking if system is running from battery Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 11/24] ASoC: lpass: Fix for KASAN use_after_free out of bounds Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 12/24] btrfs: scrub: try harder to mark RAID56 block groups read-only Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 13/24] btrfs: handle memory allocation failure in btrfs_csum_one_bio Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 14/24] ASoC: soc-pcm: test if a BE can be prepared Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 15/24] parisc: Improve cache flushing for PCXL in arch_sync_dma_for_cpu() Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 16/24] parisc: Flush gatt writes and adjust gatt mask in parisc_agp_mask_memory() Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 17/24] MIPS: unhide PATA_PLATFORM Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 18/24] MIPS: Restore Au1300 support Sasha Levin
2023-05-31 13:43 ` Sasha Levin [this message]
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 20/24] mips: Move initrd_start check after initrd address sanitisation Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 21/24] ASoC: dwc: move DMA init to snd_soc_dai_driver probe() Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 22/24] xen/blkfront: Only check REQ_FUA for writes Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 23/24] drm:amd:amdgpu: Fix missing buffer object unlock in failure path Sasha Levin
2023-05-31 13:43 ` [PATCH AUTOSEL 5.15 24/24] NVMe: Add MAXIO 1602 to bogus nid list Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230531134320.3384102-19-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@vger.kernel.org \
    --cc=manuel.lauss@gmail.com \
    --cc=stable@vger.kernel.org \
    --cc=tsbogend@alpha.franken.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).