Module Name:    src
Committed By:   ryo
Date:           Wed Jul  1 07:59:16 UTC 2020

Modified Files:
        src/sys/arch/aarch64/aarch64: cpu.c cpufunc.c cpufunc_asm_armv8.S
        src/sys/arch/aarch64/include: cpu.h cpufunc.h

Log Message:
Switch the Icache sync operation to the necessary and sufficient one according 
to the CTR_EL0.DIC and CTR_EL0.IDC flags.

If CTR_EL0.DIC=1, Icache invalidation is not required.
If CTR_EL0.IDC=1, Dcache clean before Icache invalidation is not required.
CLIDR_EL1.LoC is 0, or CLIDR_EL1.LoUIS and CLIDR_EL1.LoUU are 0, Dcache clean 
is not required as well.

SEE ALSO ARMARM, "CTR_EL0 Cache Type Register", and "CLIDR_EL1 Cache Level ID 
Register"


To generate a diff of this commit:
cvs rdiff -u -r1.50 -r1.51 src/sys/arch/aarch64/aarch64/cpu.c
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/aarch64/aarch64/cpufunc.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/aarch64/aarch64/cpufunc_asm_armv8.S
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/aarch64/include/cpu.h
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/aarch64/include/cpufunc.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/aarch64/aarch64/cpu.c
diff -u src/sys/arch/aarch64/aarch64/cpu.c:1.50 src/sys/arch/aarch64/aarch64/cpu.c:1.51
--- src/sys/arch/aarch64/aarch64/cpu.c:1.50	Mon Jun 29 23:56:30 2020
+++ src/sys/arch/aarch64/aarch64/cpu.c	Wed Jul  1 07:59:16 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.c,v 1.50 2020/06/29 23:56:30 riastradh Exp $ */
+/* $NetBSD: cpu.c,v 1.51 2020/07/01 07:59:16 ryo Exp $ */
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: cpu.c,v 1.50 2020/06/29 23:56:30 riastradh Exp $");
+__KERNEL_RCSID(1, "$NetBSD: cpu.c,v 1.51 2020/07/01 07:59:16 ryo Exp $");
 
 #include "locators.h"
 #include "opt_arm_debug.h"
@@ -239,7 +239,7 @@ cpu_identify(device_t self, struct cpu_i
 static void
 cpu_identify1(device_t self, struct cpu_info *ci)
 {
-	uint64_t ctr, sctlr;	/* for cache */
+	uint64_t ctr, clidr, sctlr;	/* for cache */
 
 	/* SCTLR - System Control Register */
 	sctlr = reg_sctlr_el1_read();
@@ -277,14 +277,21 @@ cpu_identify1(device_t self, struct cpu_
 	 * CTR - Cache Type Register
 	 */
 	ctr = reg_ctr_el0_read();
+	clidr = reg_clidr_el1_read();
 	aprint_verbose_dev(self, "Cache Writeback Granule %" PRIu64 "B,"
 	    " Exclusives Reservation Granule %" PRIu64 "B\n",
 	    __SHIFTOUT(ctr, CTR_EL0_CWG_LINE) * 4,
 	    __SHIFTOUT(ctr, CTR_EL0_ERG_LINE) * 4);
 
-	aprint_verbose_dev(self, "Dcache line %ld, Icache line %ld\n",
+	aprint_verbose_dev(self, "Dcache line %ld, Icache line %ld"
+	    ", DIC=%lu, IDC=%lu, LoUU=%lu, LoC=%lu, LoUIS=%lu\n",
 	    sizeof(int) << __SHIFTOUT(ctr, CTR_EL0_DMIN_LINE),
-	    sizeof(int) << __SHIFTOUT(ctr, CTR_EL0_IMIN_LINE));
+	    sizeof(int) << __SHIFTOUT(ctr, CTR_EL0_IMIN_LINE),
+	    __SHIFTOUT(ctr, CTR_EL0_DIC),
+	    __SHIFTOUT(ctr, CTR_EL0_IDC),
+	    __SHIFTOUT(clidr, CLIDR_LOUU),
+	    __SHIFTOUT(clidr, CLIDR_LOC),
+	    __SHIFTOUT(clidr, CLIDR_LOUIS));
 }
 
 

Index: src/sys/arch/aarch64/aarch64/cpufunc.c
diff -u src/sys/arch/aarch64/aarch64/cpufunc.c:1.20 src/sys/arch/aarch64/aarch64/cpufunc.c:1.21
--- src/sys/arch/aarch64/aarch64/cpufunc.c:1.20	Mon May 25 05:13:16 2020
+++ src/sys/arch/aarch64/aarch64/cpufunc.c	Wed Jul  1 07:59:16 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpufunc.c,v 1.20 2020/05/25 05:13:16 ryo Exp $	*/
+/*	$NetBSD: cpufunc.c,v 1.21 2020/07/01 07:59:16 ryo Exp $	*/
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org>
@@ -30,7 +30,7 @@
 #include "opt_multiprocessor.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.20 2020/05/25 05:13:16 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.21 2020/07/01 07:59:16 ryo Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -426,13 +426,31 @@ int
 set_cpufuncs(void)
 {
 	struct cpu_info * const ci = curcpu();
+	const uint64_t ctr = reg_ctr_el0_read();
+	const uint64_t clidr = reg_clidr_el1_read();
 	const uint32_t midr __unused = reg_midr_el1_read();
 
 	/* install default functions */
 	ci->ci_cpufuncs.cf_set_ttbr0 = aarch64_set_ttbr0;
+	ci->ci_cpufuncs.cf_icache_sync_range = aarch64_icache_sync_range;
 
+	/*
+	 * install core/cluster specific functions
+	 */
+
+	/* Icache sync op */
+	if (__SHIFTOUT(ctr, CTR_EL0_DIC) == 1) {
+		/* Icache invalidation to the PoU is not required */
+		ci->ci_cpufuncs.cf_icache_sync_range =
+		    aarch64_icache_barrier_range;
+	} else if (__SHIFTOUT(ctr, CTR_EL0_IDC) == 1 ||
+	    __SHIFTOUT(clidr, CLIDR_LOC) == 0 ||
+	    (__SHIFTOUT(clidr, CLIDR_LOUIS) == 0 && __SHIFTOUT(clidr, CLIDR_LOUU) == 0)) {
+		/* Dcache clean to the PoU is not required for Icache */
+		ci->ci_cpufuncs.cf_icache_sync_range =
+		    aarch64_icache_inv_range;
+	}
 
-	/* install core/cluster specific functions */
 #ifdef CPU_THUNDERX
 	/* Cavium erratum 27456 */
 	if ((midr == CPU_ID_THUNDERXP1d0) ||

Index: src/sys/arch/aarch64/aarch64/cpufunc_asm_armv8.S
diff -u src/sys/arch/aarch64/aarch64/cpufunc_asm_armv8.S:1.5 src/sys/arch/aarch64/aarch64/cpufunc_asm_armv8.S:1.6
--- src/sys/arch/aarch64/aarch64/cpufunc_asm_armv8.S:1.5	Mon Jun  1 08:59:00 2020
+++ src/sys/arch/aarch64/aarch64/cpufunc_asm_armv8.S	Wed Jul  1 07:59:16 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpufunc_asm_armv8.S,v 1.5 2020/06/01 08:59:00 ryo Exp $	*/
+/*	$NetBSD: cpufunc_asm_armv8.S,v 1.6 2020/07/01 07:59:16 ryo Exp $	*/
 
 /*-
  * Copyright (c) 2014 Robin Randhawa
@@ -135,6 +135,23 @@ ENTRY(aarch64_icache_sync_range)
 END(aarch64_icache_sync_range)
 
 /*
+ * void aarch64_icache_inv_range(vaddr_t, vsize_t)
+ */
+ENTRY(aarch64_icache_inv_range)
+	cache_handle_range	icop = ivau
+	ret
+END(aarch64_icache_inv_range)
+
+/*
+ * void aarch64_icache_barrier_range(vaddr_t, vsize_t)
+ */
+ENTRY(aarch64_icache_barrier_range)
+	dsb	ishst
+	isb
+	ret
+END(aarch64_icache_barrier_range)
+
+/*
  * void aarch64_icache_inv_all(void)
  */
 ENTRY(aarch64_icache_inv_all)

Index: src/sys/arch/aarch64/include/cpu.h
diff -u src/sys/arch/aarch64/include/cpu.h:1.23 src/sys/arch/aarch64/include/cpu.h:1.24
--- src/sys/arch/aarch64/include/cpu.h:1.23	Mon Jun 29 23:22:27 2020
+++ src/sys/arch/aarch64/include/cpu.h	Wed Jul  1 07:59:16 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.23 2020/06/29 23:22:27 riastradh Exp $ */
+/* $NetBSD: cpu.h,v 1.24 2020/07/01 07:59:16 ryo Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -68,6 +68,7 @@ struct clockframe {
 
 struct aarch64_cpufuncs {
 	void (*cf_set_ttbr0)(uint64_t);
+	void (*cf_icache_sync_range)(vaddr_t, vsize_t);
 };
 
 struct cpu_info {

Index: src/sys/arch/aarch64/include/cpufunc.h
diff -u src/sys/arch/aarch64/include/cpufunc.h:1.15 src/sys/arch/aarch64/include/cpufunc.h:1.16
--- src/sys/arch/aarch64/include/cpufunc.h:1.15	Mon May 25 05:13:16 2020
+++ src/sys/arch/aarch64/include/cpufunc.h	Wed Jul  1 07:59:16 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpufunc.h,v 1.15 2020/05/25 05:13:16 ryo Exp $	*/
+/*	$NetBSD: cpufunc.h,v 1.16 2020/07/01 07:59:16 ryo Exp $	*/
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org>
@@ -80,6 +80,8 @@ void aarch64_icache_inv_all(void);
 void aarch64_nullop(void);
 uint32_t aarch64_cpuid(void);
 void aarch64_icache_sync_range(vaddr_t, vsize_t);
+void aarch64_icache_inv_range(vaddr_t, vsize_t);
+void aarch64_icache_barrier_range(vaddr_t, vsize_t);
 void aarch64_idcache_wbinv_range(vaddr_t, vsize_t);
 void aarch64_dcache_wbinv_range(vaddr_t, vsize_t);
 void aarch64_dcache_inv_range(vaddr_t, vsize_t);
@@ -117,7 +119,8 @@ void aarch64_tlbi_by_asid_va_ll(int, vad
 #define cpu_dcache_inv_range(v,s)	aarch64_dcache_inv_range((v),(s))
 #define cpu_dcache_wb_range(v,s)	aarch64_dcache_wb_range((v),(s))
 #define cpu_idcache_wbinv_range(v,s)	aarch64_idcache_wbinv_range((v),(s))
-#define cpu_icache_sync_range(v,s)	aarch64_icache_sync_range((v),(s))
+#define cpu_icache_sync_range(v,s)	\
+	curcpu()->ci_cpufuncs.cf_icache_sync_range((v),(s))
 
 #define cpu_sdcache_wbinv_range(v,p,s)	((void)0)
 #define cpu_sdcache_inv_range(v,p,s)	((void)0)

Reply via email to