LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: guoren@kernel.org
To: anup.patel@wdc.com, atish.patra@wdc.com,
	palmerdabbelt@google.com, guoren@kernel.org,
	christoph.muellner@vrull.eu, philipp.tomsich@vrull.eu,
	hch@lst.de, liush@allwinnertech.com, wefu@redhat.com,
	lazyparser@gmail.com, drew@beagleboard.org
Cc: linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,
	taiten.peng@canonical.com, aniket.ponkshe@canonical.com,
	heinrich.schuchardt@canonical.com, gordan.markus@canonical.com,
	Guo Ren <guoren@linux.alibaba.com>
Subject: [RFC PATCH V4 5/6] riscv: errata: Support T-HEAD custom dcache ops
Date: Sat, 11 Sep 2021 17:21:38 +0800	[thread overview]
Message-ID: <20210911092139.79607-6-guoren@kernel.org> (raw)
In-Reply-To: <20210911092139.79607-1-guoren@kernel.org>

From: Guo Ren <guoren@linux.alibaba.com>

Here are the DMA sync ops needed by Allwinner D1. RISC-V CMO
extension is still in progress, and D1 is using custom CMO
instructions:

 dcache.ipa rs1 (invalidate)
 | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 |
   0000001    01010      rs1       000      00000  0001011

 dcache.cpa rs1 (clean)
 | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 |
   0000001    01001      rs1       000      00000  0001011

 dcache.cipa rs1 (clean then invalidate)
 | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 |
   0000001    01011      rs1       000      00000  0001011

 sync.s (completion barrier)
 | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 |
   0000000    11001     00000      000      00000  0001011

TODO:
 - Using alternative patch_text based on Atish's patch.

Signed-off-by: Guo Ren <guoren@linux.alibaba.com>
Signed-off-by: Liu Shaohua <liush@allwinnertech.com>
Signed-off-by: Wei Fu <wefu@redhat.com>
Cc: Atish Patra <atish.patra@wdc.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Palmer Dabbelt <palmerdabbelt@google.com>
Cc: Anup Patel <anup.patel@wdc.com>
---
 arch/riscv/errata/alternative.c      |  5 +++
 arch/riscv/errata/thead/errata.c     | 61 ++++++++++++++++++++++++++++
 arch/riscv/include/asm/alternative.h |  2 +
 3 files changed, 68 insertions(+)

diff --git a/arch/riscv/errata/alternative.c b/arch/riscv/errata/alternative.c
index b879aa546bc5..396aab1b62c2 100644
--- a/arch/riscv/errata/alternative.c
+++ b/arch/riscv/errata/alternative.c
@@ -46,6 +46,11 @@ static void __init init_alternative(void)
 	case SIFIVE_VENDOR_ID:
 		vendor_patch_func = sifive_errata_patch_func;
 		break;
+#endif
+#ifdef CONFIG_ERRATA_THEAD
+	case THEAD_VENDOR_ID:
+		vendor_patch_func = thead_errata_patch_func;
+		break;
 #endif
 	default:
 		vendor_patch_func = NULL;
diff --git a/arch/riscv/errata/thead/errata.c b/arch/riscv/errata/thead/errata.c
index 1f5c0f82bc23..9c0bf9b25be3 100644
--- a/arch/riscv/errata/thead/errata.c
+++ b/arch/riscv/errata/thead/errata.c
@@ -5,6 +5,7 @@
 #include <linux/bug.h>
 #include <asm/patch.h>
 #include <asm/alternative.h>
+#include <asm/dma-noncoherent.h>
 #include <asm/vendorid_list.h>
 #include <asm/errata_list.h>
 #include <asm/pgtable-bits.h>
@@ -45,3 +46,63 @@ void __init thead_errata_setup_vm(unsigned long archid, unsigned long impid)
 	__riscv_pbmt.mt[MT_IO]	= _PAGE_MT_IO;
 #endif
 }
+
+#ifdef CONFIG_RISCV_DMA_NONCOHERENT
+/*
+ * dcache.ipa rs1 (invalidate)
+ * | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 |
+ *   0000001    01010      rs1       000      00000  0001011
+ *
+ * dcache.cpa rs1 (clean)
+ * | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 |
+ *   0000001    01001      rs1       000      00000  0001011
+ *
+ * dcache.cipa rs1 (clean then invalidate)
+ * | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 |
+ *   0000001    01011      rs1       000      00000  0001011
+ *
+ * sync.s
+ * | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 |
+ *   0000000    11001     00000      000      00000  0001011
+ */
+#define DCACHE_IPA_A0	".long 0x02a5000b"
+#define DCACHE_CPA_A0	".long 0x0295000b"
+#define DCACHE_CIPA_A0	".long 0x02b5000b"
+
+#define SYNC_S		".long 0x0190000b"
+
+#define CACHE_OP_RANGE(OP, start, size) \
+	register unsigned long i asm("a0") = start & ~(L1_CACHE_BYTES - 1); \
+	for (; i < ALIGN(start + size, L1_CACHE_BYTES); i += L1_CACHE_BYTES) \
+		__asm__ __volatile__(OP); \
+	 __asm__ __volatile__(SYNC_S);
+
+static void c900_cache_invalidate(phys_addr_t start, size_t size)
+{
+	CACHE_OP_RANGE(DCACHE_IPA_A0, start, size);
+}
+
+static void c900_cache_clean(phys_addr_t start, size_t size)
+{
+	CACHE_OP_RANGE(DCACHE_CPA_A0, start, size);
+}
+
+static void c900_cache_flush(phys_addr_t start, size_t size)
+{
+	CACHE_OP_RANGE(DCACHE_CIPA_A0, start, size);
+}
+
+static struct riscv_dma_cache_sync c900_dma_cache_sync = {
+	.cache_invalidate = c900_cache_invalidate,
+	.cache_clean = c900_cache_clean,
+	.cache_flush = c900_cache_flush,
+};
+#endif
+
+void __init thead_errata_patch_func(struct alt_entry *begin, struct alt_entry *end,
+				     unsigned long archid, unsigned long impid)
+{
+#ifdef CONFIG_RISCV_DMA_NONCOHERENT
+	riscv_dma_cache_sync_set(&c900_dma_cache_sync);
+#endif
+}
diff --git a/arch/riscv/include/asm/alternative.h b/arch/riscv/include/asm/alternative.h
index 3605894081a8..a519671fa7d1 100644
--- a/arch/riscv/include/asm/alternative.h
+++ b/arch/riscv/include/asm/alternative.h
@@ -35,6 +35,8 @@ struct errata_checkfunc_id {
 
 void sifive_errata_patch_func(struct alt_entry *begin, struct alt_entry *end,
 			      unsigned long archid, unsigned long impid);
+void thead_errata_patch_func(struct alt_entry *begin, struct alt_entry *end,
+			      unsigned long archid, unsigned long impid);
 
 void thead_errata_setup_vm(unsigned long archid, unsigned long impid);
 #endif
-- 
2.25.1


  parent reply	other threads:[~2021-09-11  9:22 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-11  9:21 [RFC PATCH V4 0/6] riscv: Add PBMT & DMA for D1 bringup guoren
2021-09-11  9:21 ` [RFC PATCH V4 1/6] riscv: pgtable: Add custom protection_map init guoren
2021-09-15  7:45   ` Christoph Hellwig
2021-09-15 23:52     ` Guo Ren
2021-09-11  9:21 ` [RFC PATCH V4 2/6] riscv: errata: pgtable: Add custom Svpbmt supported for Allwinner D1 guoren
2021-09-15  7:47   ` Christoph Hellwig
2021-09-16  0:48     ` Guo Ren
2021-09-16  7:31   ` Atish Patra
2021-09-11  9:21 ` [RFC PATCH V4 3/6] RISC-V: Support a new config option for non-coherent DMA guoren
2021-09-15  7:48   ` Christoph Hellwig
2021-09-16  1:20     ` Guo Ren
2021-09-16  4:39       ` Atish Patra
2021-09-16  6:09         ` Guo Ren
2021-09-11  9:21 ` [RFC PATCH V4 4/6] RISC-V: Implement arch_sync_dma* functions guoren
2021-09-15  7:50   ` Christoph Hellwig
2021-09-16  1:32     ` Guo Ren
2021-09-16  4:24       ` Anup Patel
2021-09-16  4:42         ` Atish Patra
2021-09-11  9:21 ` guoren [this message]
2021-09-11  9:21 ` [RFC PATCH V4 6/6] riscv: soc: Add Allwinner SoC kconfig option guoren
2021-09-13  8:45   ` Maxime Ripard
2021-09-13  9:20     ` Guo Ren
2021-09-13 18:48       ` Randy Dunlap
2021-09-14  2:34         ` Guo Ren
2021-09-14  3:06           ` Randy Dunlap
2021-09-14  5:16             ` Anup Patel
2021-09-14  5:20               ` Randy Dunlap
2021-09-14  9:29           ` Arnd Bergmann
2021-09-14 10:07             ` Krzysztof Kozlowski
2021-09-14 10:13               ` Maxime Ripard
2021-09-14 12:09                 ` Krzysztof Kozlowski
2021-09-14 13:02                   ` Arnd Bergmann
2021-09-16  6:37             ` Guo Ren
2021-09-14  3:49     ` Heinrich Schuchardt
2021-09-14  5:16       ` Samuel Holland
2021-09-14  6:30         ` Heinrich Schuchardt
2021-09-14  7:20       ` Maxime Ripard
2021-09-14  9:26     ` Ben Dooks

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=20210911092139.79607-6-guoren@kernel.org \
    --to=guoren@kernel.org \
    --cc=aniket.ponkshe@canonical.com \
    --cc=anup.patel@wdc.com \
    --cc=atish.patra@wdc.com \
    --cc=christoph.muellner@vrull.eu \
    --cc=drew@beagleboard.org \
    --cc=gordan.markus@canonical.com \
    --cc=guoren@linux.alibaba.com \
    --cc=hch@lst.de \
    --cc=heinrich.schuchardt@canonical.com \
    --cc=lazyparser@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=liush@allwinnertech.com \
    --cc=palmerdabbelt@google.com \
    --cc=philipp.tomsich@vrull.eu \
    --cc=taiten.peng@canonical.com \
    --cc=wefu@redhat.com \
    --subject='Re: [RFC PATCH V4 5/6] riscv: errata: Support T-HEAD custom dcache ops' \
    /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

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).