Fri Dec 21 08:01:01 2018 UTC ()
- add workaround for Cavium ThunderX errata 27456.
- add cpufuncs table in cpu_info. each cpu clusters may have different erratum. (e.g. big.LITTLE)


(ryo)
diff -r1.14 -r1.15 src/sys/arch/aarch64/aarch64/cpu.c
diff -r1.4 -r1.5 src/sys/arch/aarch64/aarch64/cpufunc.c
diff -r1.2 -r1.3 src/sys/arch/aarch64/aarch64/cpufunc_asm_armv8.S
diff -r1.33 -r1.34 src/sys/arch/aarch64/aarch64/pmap.c
diff -r1.12 -r1.13 src/sys/arch/aarch64/include/cpu.h
diff -r1.4 -r1.5 src/sys/arch/aarch64/include/cpufunc.h

cvs diff -r1.14 -r1.15 src/sys/arch/aarch64/aarch64/cpu.c (expand / switch to context diff)
--- src/sys/arch/aarch64/aarch64/cpu.c 2018/11/28 09:16:19 1.14
+++ src/sys/arch/aarch64/aarch64/cpu.c 2018/12/21 08:01:01 1.15
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.c,v 1.14 2018/11/28 09:16:19 ryo Exp $ */
+/* $NetBSD: cpu.c,v 1.15 2018/12/21 08:01:01 ryo Exp $ */
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <ryo@nerv.org>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: cpu.c,v 1.14 2018/11/28 09:16:19 ryo Exp $");
+__KERNEL_RCSID(1, "$NetBSD: cpu.c,v 1.15 2018/12/21 08:01:01 ryo Exp $");
 
 #include "locators.h"
 #include "opt_arm_debug.h"
@@ -163,6 +163,7 @@
 	}
 #endif /* MULTIPROCESSOR */
 
+	set_cpufuncs();
 	fpu_attach(ci);
 
 	cpu_identify1(dv, ci);
@@ -522,6 +523,7 @@
 
 	mutex_enter(&cpu_hatch_lock);
 
+	set_cpufuncs();
 	fpu_attach(ci);
 
 	cpu_identify1(ci->ci_dev, ci);

cvs diff -r1.4 -r1.5 src/sys/arch/aarch64/aarch64/cpufunc.c (expand / switch to context diff)
--- src/sys/arch/aarch64/aarch64/cpufunc.c 2018/08/29 06:16:40 1.4
+++ src/sys/arch/aarch64/aarch64/cpufunc.c 2018/12/21 08:01:01 1.5
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpufunc.c,v 1.4 2018/08/29 06:16:40 ryo Exp $	*/
+/*	$NetBSD: cpufunc.c,v 1.5 2018/12/21 08:01:01 ryo Exp $	*/
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <ryo@nerv.org>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.4 2018/08/29 06:16:40 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.5 2018/12/21 08:01:01 ryo Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -403,4 +403,28 @@
 		ln_dcache_wb_all(level, &cinfo[level].dcache);
 	}
 	__asm __volatile ("dsb ish");
+}
+
+int
+set_cpufuncs(void)
+{
+	struct cpu_info * const ci = curcpu();
+	const uint32_t midr __unused = reg_midr_el1_read();
+
+	/* install default functions */
+	ci->ci_cpufuncs.cf_set_ttbr0 = aarch64_set_ttbr0;
+
+
+	/* install core/cluster specific functions */
+#ifdef CPU_THUNDERX
+	/* Cavium erratum 27456 */
+	if ((midr == CPU_ID_THUNDERXP1d0) ||
+	    (midr == CPU_ID_THUNDERXP1d1) ||
+	    (midr == CPU_ID_THUNDERXP2d1) ||
+	    (midr == CPU_ID_THUNDERX81XXRX)) {
+		ci->ci_cpufuncs.cf_set_ttbr0 = aarch64_set_ttbr0_thunderx;
+	}
+#endif
+
+	return 0;
 }

cvs diff -r1.2 -r1.3 src/sys/arch/aarch64/aarch64/cpufunc_asm_armv8.S (expand / switch to context diff)
--- src/sys/arch/aarch64/aarch64/cpufunc_asm_armv8.S 2018/07/23 22:51:39 1.2
+++ src/sys/arch/aarch64/aarch64/cpufunc_asm_armv8.S 2018/12/21 08:01:01 1.3
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpufunc_asm_armv8.S,v 1.2 2018/07/23 22:51:39 ryo Exp $	*/
+/*	$NetBSD: cpufunc_asm_armv8.S,v 1.3 2018/12/21 08:01:01 ryo Exp $	*/
 
 /*-
  * Copyright (c) 2014 Robin Randhawa
@@ -32,6 +32,7 @@
  * $FreeBSD: head/sys/arm64/arm64/cpufunc_asm.S 313347 2017-02-06 17:50:09Z andrew $
  */
 
+#include "opt_cputypes.h"
 #include "opt_multiprocessor.h"
 #include <aarch64/asm.h>
 
@@ -162,6 +163,22 @@
 	isb
 	ret
 END(aarch64_set_ttbr0)
+
+#ifdef CPU_THUNDERX
+/*
+ * Cavium erratum 27456
+ * void aarch64_set_ttbr0_thunderx(uint64_t ttbr0)
+ */
+ENTRY(aarch64_set_ttbr0_thunderx)
+	dsb	ish
+	msr	ttbr0_el1, x0
+	isb
+	ic	iallu
+	dsb	nsh
+	isb
+	ret
+END(aarch64_set_ttbr0_thunderx)
+#endif /* CPU_THUNDERX */
 
 /* void aarch64_tlbi_all(void) */
 ENTRY(aarch64_tlbi_all)

cvs diff -r1.33 -r1.34 src/sys/arch/aarch64/aarch64/pmap.c (expand / switch to context diff)
--- src/sys/arch/aarch64/aarch64/pmap.c 2018/11/01 20:34:49 1.33
+++ src/sys/arch/aarch64/aarch64/pmap.c 2018/12/21 08:01:01 1.34
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.33 2018/11/01 20:34:49 maxv Exp $	*/
+/*	$NetBSD: pmap.c,v 1.34 2018/12/21 08:01:01 ryo Exp $	*/
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <ryo@nerv.org>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.33 2018/11/01 20:34:49 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.34 2018/12/21 08:01:01 ryo Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_ddb.h"
@@ -1206,7 +1206,7 @@
 		pm->pm_asid = l->l_proc->p_pid;
 
 	ttbr0 = ((uint64_t)pm->pm_asid << 48) | pm->pm_l0table_pa;
-	aarch64_set_ttbr0(ttbr0);
+	cpu_set_ttbr0(ttbr0);
 
 	pm->pm_activated = true;
 

cvs diff -r1.12 -r1.13 src/sys/arch/aarch64/include/cpu.h (expand / switch to context diff)
--- src/sys/arch/aarch64/include/cpu.h 2018/11/24 22:49:35 1.12
+++ src/sys/arch/aarch64/include/cpu.h 2018/12/21 08:01:01 1.13
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.12 2018/11/24 22:49:35 skrll Exp $ */
+/* $NetBSD: cpu.h,v 1.13 2018/12/21 08:01:01 ryo Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -64,6 +64,10 @@
 #include <sys/device_if.h>
 #include <sys/intr.h>
 
+struct aarch64_cpufuncs {
+	void (*cf_set_ttbr0)(uint64_t);
+};
+
 struct cpu_info {
 	struct cpu_data ci_data;
 	device_t ci_dev;
@@ -98,6 +102,7 @@
 	struct aarch64_sysctl_cpu_id ci_id;
 
 	struct aarch64_cache_info *ci_cacheinfo;
+	struct aarch64_cpufuncs ci_cpufuncs;
 
 } __aligned(COHERENCY_UNIT);
 

cvs diff -r1.4 -r1.5 src/sys/arch/aarch64/include/cpufunc.h (expand / switch to context diff)
--- src/sys/arch/aarch64/include/cpufunc.h 2018/12/15 16:54:30 1.4
+++ src/sys/arch/aarch64/include/cpufunc.h 2018/12/21 08:01:01 1.5
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpufunc.h,v 1.4 2018/12/15 16:54:30 alnsn Exp $	*/
+/*	$NetBSD: cpufunc.h,v 1.5 2018/12/21 08:01:01 ryo Exp $	*/
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <ryo@nerv.org>
@@ -34,12 +34,6 @@
 #include <arm/armreg.h>
 #include <sys/device_if.h>
 
-static inline int
-set_cpufuncs(void)
-{
-	return 0;
-}
-
 struct aarch64_cache_unit {
 	u_int cache_type;
 #define CACHE_TYPE_UNKNOWN	0
@@ -75,6 +69,7 @@
 extern u_int aarch64_cache_prefer_mask;
 extern u_int cputype;			/* compat arm */
 
+int set_cpufuncs(void);
 void aarch64_getcacheinfo(void);
 void aarch64_printcacheinfo(device_t);
 
@@ -95,7 +90,9 @@
 void aarch64_drain_writebuf(void);
 
 /* tlb op in cpufunc_asm_armv8.S */
+#define cpu_set_ttbr0(t)		curcpu()->ci_cpufuncs.cf_set_ttbr0((t))
 void aarch64_set_ttbr0(uint64_t);
+void aarch64_set_ttbr0_thunderx(uint64_t);
 void aarch64_tlbi_all(void);			/* all ASID, all VA */
 void aarch64_tlbi_by_asid(int);			/*  an ASID, all VA */
 void aarch64_tlbi_by_va(vaddr_t);		/* all ASID, a VA */