Module Name: src Committed By: ryo Date: Fri Dec 21 08:01:01 UTC 2018
Modified Files: src/sys/arch/aarch64/aarch64: cpu.c cpufunc.c cpufunc_asm_armv8.S pmap.c src/sys/arch/aarch64/include: cpu.h cpufunc.h Log Message: - add workaround for Cavium ThunderX errata 27456. - add cpufuncs table in cpu_info. each cpu clusters may have different erratum. (e.g. big.LITTLE) To generate a diff of this commit: cvs rdiff -u -r1.14 -r1.15 src/sys/arch/aarch64/aarch64/cpu.c cvs rdiff -u -r1.4 -r1.5 src/sys/arch/aarch64/aarch64/cpufunc.c cvs rdiff -u -r1.2 -r1.3 src/sys/arch/aarch64/aarch64/cpufunc_asm_armv8.S cvs rdiff -u -r1.33 -r1.34 src/sys/arch/aarch64/aarch64/pmap.c cvs rdiff -u -r1.12 -r1.13 src/sys/arch/aarch64/include/cpu.h cvs rdiff -u -r1.4 -r1.5 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.14 src/sys/arch/aarch64/aarch64/cpu.c:1.15 --- src/sys/arch/aarch64/aarch64/cpu.c:1.14 Wed Nov 28 09:16:19 2018 +++ src/sys/arch/aarch64/aarch64/cpu.c Fri Dec 21 08:01:01 2018 @@ -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 <r...@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 @@ cpu_attach(device_t dv, cpuid_t id) } #endif /* MULTIPROCESSOR */ + set_cpufuncs(); fpu_attach(ci); cpu_identify1(dv, ci); @@ -522,6 +523,7 @@ cpu_hatch(struct cpu_info *ci) mutex_enter(&cpu_hatch_lock); + set_cpufuncs(); fpu_attach(ci); cpu_identify1(ci->ci_dev, ci); Index: src/sys/arch/aarch64/aarch64/cpufunc.c diff -u src/sys/arch/aarch64/aarch64/cpufunc.c:1.4 src/sys/arch/aarch64/aarch64/cpufunc.c:1.5 --- src/sys/arch/aarch64/aarch64/cpufunc.c:1.4 Wed Aug 29 06:16:40 2018 +++ src/sys/arch/aarch64/aarch64/cpufunc.c Fri Dec 21 08:01:01 2018 @@ -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 <r...@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> @@ -404,3 +404,27 @@ aarch64_dcache_wb_all(void) } __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; +} Index: src/sys/arch/aarch64/aarch64/cpufunc_asm_armv8.S diff -u src/sys/arch/aarch64/aarch64/cpufunc_asm_armv8.S:1.2 src/sys/arch/aarch64/aarch64/cpufunc_asm_armv8.S:1.3 --- src/sys/arch/aarch64/aarch64/cpufunc_asm_armv8.S:1.2 Mon Jul 23 22:51:39 2018 +++ src/sys/arch/aarch64/aarch64/cpufunc_asm_armv8.S Fri Dec 21 08:01:01 2018 @@ -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> @@ -163,6 +164,22 @@ ENTRY(aarch64_set_ttbr0) 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) dsb ishst Index: src/sys/arch/aarch64/aarch64/pmap.c diff -u src/sys/arch/aarch64/aarch64/pmap.c:1.33 src/sys/arch/aarch64/aarch64/pmap.c:1.34 --- src/sys/arch/aarch64/aarch64/pmap.c:1.33 Thu Nov 1 20:34:49 2018 +++ src/sys/arch/aarch64/aarch64/pmap.c Fri Dec 21 08:01:01 2018 @@ -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 <r...@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 @@ pmap_activate(struct lwp *l) 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; Index: src/sys/arch/aarch64/include/cpu.h diff -u src/sys/arch/aarch64/include/cpu.h:1.12 src/sys/arch/aarch64/include/cpu.h:1.13 --- src/sys/arch/aarch64/include/cpu.h:1.12 Sat Nov 24 22:49:35 2018 +++ src/sys/arch/aarch64/include/cpu.h Fri Dec 21 08:01:01 2018 @@ -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 @@ struct clockframe { #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 cpu_info { struct aarch64_sysctl_cpu_id ci_id; struct aarch64_cache_info *ci_cacheinfo; + struct aarch64_cpufuncs ci_cpufuncs; } __aligned(COHERENCY_UNIT); Index: src/sys/arch/aarch64/include/cpufunc.h diff -u src/sys/arch/aarch64/include/cpufunc.h:1.4 src/sys/arch/aarch64/include/cpufunc.h:1.5 --- src/sys/arch/aarch64/include/cpufunc.h:1.4 Sat Dec 15 16:54:30 2018 +++ src/sys/arch/aarch64/include/cpufunc.h Fri Dec 21 08:01:01 2018 @@ -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 <r...@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_vindexsize; / 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_icache_inv_all(void); 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 */