Module Name: src Committed By: mlelstv Date: Fri Nov 22 05:21:19 UTC 2019
Modified Files: src/sys/arch/aarch64/aarch64: cpu.c cpufunc.c locore.S src/sys/arch/aarch64/include: cpufunc.h Log Message: Make cache operations available early. To generate a diff of this commit: cvs rdiff -u -r1.25 -r1.26 src/sys/arch/aarch64/aarch64/cpu.c cvs rdiff -u -r1.7 -r1.8 src/sys/arch/aarch64/aarch64/cpufunc.c cvs rdiff -u -r1.44 -r1.45 src/sys/arch/aarch64/aarch64/locore.S cvs rdiff -u -r1.7 -r1.8 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.25 src/sys/arch/aarch64/aarch64/cpu.c:1.26 --- src/sys/arch/aarch64/aarch64/cpu.c:1.25 Sun Oct 20 14:03:51 2019 +++ src/sys/arch/aarch64/aarch64/cpu.c Fri Nov 22 05:21:19 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.c,v 1.25 2019/10/20 14:03:51 jmcneill Exp $ */ +/* $NetBSD: cpu.c,v 1.26 2019/11/22 05:21:19 mlelstv 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.25 2019/10/20 14:03:51 jmcneill Exp $"); +__KERNEL_RCSID(1, "$NetBSD: cpu.c,v 1.26 2019/11/22 05:21:19 mlelstv Exp $"); #include "locators.h" #include "opt_arm_debug.h" @@ -102,7 +102,6 @@ cpu_attach(device_t dv, cpuid_t id) { struct cpu_info *ci; const int unit = device_unit(dv); - uint64_t mpidr; if (unit == 0) { ci = curcpu(); @@ -142,19 +141,11 @@ cpu_attach(device_t dv, cpuid_t id) #endif /* MULTIPROCESSOR */ } - mpidr = ci->ci_id.ac_mpidr; - if (mpidr & MPIDR_MT) { - ci->ci_smt_id = __SHIFTOUT(mpidr, MPIDR_AFF0); - ci->ci_core_id = __SHIFTOUT(mpidr, MPIDR_AFF1); - ci->ci_package_id = __SHIFTOUT(mpidr, MPIDR_AFF2); - } else { - ci->ci_core_id = __SHIFTOUT(mpidr, MPIDR_AFF0); - ci->ci_package_id = __SHIFTOUT(mpidr, MPIDR_AFF1); - } - ci->ci_dev = dv; dv->dv_private = ci; + aarch64_gettopology(ci, ci->ci_id.ac_mpidr); + cpu_identify(ci->ci_dev, ci); #ifdef MULTIPROCESSOR if (unit != 0) { @@ -167,7 +158,10 @@ cpu_attach(device_t dv, cpuid_t id) fpu_attach(ci); cpu_identify1(dv, ci); - aarch64_getcacheinfo(); +#if 0 + /* already done in locore */ + aarch64_getcacheinfo(unit); +#endif aarch64_printcacheinfo(dv); cpu_identify2(dv, ci); @@ -539,7 +533,7 @@ cpu_hatch(struct cpu_info *ci) fpu_attach(ci); cpu_identify1(ci->ci_dev, ci); - aarch64_getcacheinfo(); + aarch64_getcacheinfo(device_unit(ci->ci_dev)); aarch64_printcacheinfo(ci->ci_dev); cpu_identify2(ci->ci_dev, ci); Index: src/sys/arch/aarch64/aarch64/cpufunc.c diff -u src/sys/arch/aarch64/aarch64/cpufunc.c:1.7 src/sys/arch/aarch64/aarch64/cpufunc.c:1.8 --- src/sys/arch/aarch64/aarch64/cpufunc.c:1.7 Tue Oct 1 18:00:07 2019 +++ src/sys/arch/aarch64/aarch64/cpufunc.c Fri Nov 22 05:21:19 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: cpufunc.c,v 1.7 2019/10/01 18:00:07 chs Exp $ */ +/* $NetBSD: cpufunc.c,v 1.8 2019/11/22 05:21:19 mlelstv Exp $ */ /* * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org> @@ -29,7 +29,7 @@ #include "opt_multiprocessor.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.7 2019/10/01 18:00:07 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.8 2019/11/22 05:21:19 mlelstv Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -49,6 +49,7 @@ u_int aarch64_cache_prefer_mask; /* cache info per cluster. the same cluster has the same cache configuration? */ #define MAXCPUPACKAGES MAXCPUS /* maximum of ci->ci_package_id */ static struct aarch64_cache_info *aarch64_cacheinfo[MAXCPUPACKAGES]; +static struct aarch64_cache_info aarch64_cacheinfo0; static void @@ -88,27 +89,46 @@ extract_cacheunit(int level, bool insn, } void -aarch64_getcacheinfo(void) +aarch64_gettopology(struct cpu_info * const ci, uint64_t mpidr) { + + if (mpidr & MPIDR_MT) { + ci->ci_smt_id = __SHIFTOUT(mpidr, MPIDR_AFF0); + ci->ci_core_id = __SHIFTOUT(mpidr, MPIDR_AFF1); + ci->ci_package_id = __SHIFTOUT(mpidr, MPIDR_AFF2); + } else { + ci->ci_core_id = __SHIFTOUT(mpidr, MPIDR_AFF0); + ci->ci_package_id = __SHIFTOUT(mpidr, MPIDR_AFF1); + } +} + +void +aarch64_getcacheinfo(int unit) +{ + struct cpu_info * const ci = curcpu(); uint32_t clidr, ctr; int level, cachetype; - struct aarch64_cache_info *cinfo; + struct aarch64_cache_info *cinfo = NULL; if (cputype == 0) cputype = aarch64_cpuid(); /* already extract about this cluster? */ - KASSERT(curcpu()->ci_package_id < MAXCPUPACKAGES); - cinfo = aarch64_cacheinfo[curcpu()->ci_package_id]; + KASSERT(ci->ci_package_id < MAXCPUPACKAGES); + cinfo = aarch64_cacheinfo[ci->ci_package_id]; if (cinfo != NULL) { - curcpu()->ci_cacheinfo = cinfo; + ci->ci_cacheinfo = cinfo; return; } - cinfo = aarch64_cacheinfo[curcpu()->ci_package_id] = - kmem_zalloc(sizeof(struct aarch64_cache_info) * MAX_CACHE_LEVEL, - KM_SLEEP); - curcpu()->ci_cacheinfo = cinfo; + /* Need static buffer for the boot CPU */ + if (unit == 0) + cinfo = &aarch64_cacheinfo0; + else + cinfo = kmem_zalloc(sizeof(struct aarch64_cache_info) + * MAX_CACHE_LEVEL, KM_SLEEP); + aarch64_cacheinfo[ci->ci_package_id] = cinfo; + ci->ci_cacheinfo = cinfo; /* Index: src/sys/arch/aarch64/aarch64/locore.S diff -u src/sys/arch/aarch64/aarch64/locore.S:1.44 src/sys/arch/aarch64/aarch64/locore.S:1.45 --- src/sys/arch/aarch64/aarch64/locore.S:1.44 Sun Oct 20 14:03:51 2019 +++ src/sys/arch/aarch64/aarch64/locore.S Fri Nov 22 05:21:19 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.44 2019/10/20 14:03:51 jmcneill Exp $ */ +/* $NetBSD: locore.S,v 1.45 2019/11/22 05:21:19 mlelstv Exp $ */ /* * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org> @@ -38,7 +38,7 @@ #include <aarch64/hypervisor.h> #include "assym.h" -RCSID("$NetBSD: locore.S,v 1.44 2019/10/20 14:03:51 jmcneill Exp $") +RCSID("$NetBSD: locore.S,v 1.45 2019/11/22 05:21:19 mlelstv Exp $") /*#define DEBUG_LOCORE /* debug print */ @@ -180,6 +180,13 @@ vstart: msr tpidr_el1, x0 /* curcpu is cpu_info[0] */ DPRINTREG("curcpu = ", x0); + /* get cache configuration */ + mrs x0, tpidr_el1 /* curcpu */ + mrs x1, mpidr_el1 + bl aarch64_gettopology + mov x0, xzr + bl aarch64_getcacheinfo + #ifdef KASAN ADDR x0, lwp0uspace bl _C_LABEL(kasan_early_init) Index: src/sys/arch/aarch64/include/cpufunc.h diff -u src/sys/arch/aarch64/include/cpufunc.h:1.7 src/sys/arch/aarch64/include/cpufunc.h:1.8 --- src/sys/arch/aarch64/include/cpufunc.h:1.7 Fri Sep 13 18:07:30 2019 +++ src/sys/arch/aarch64/include/cpufunc.h Fri Nov 22 05:21:19 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: cpufunc.h,v 1.7 2019/09/13 18:07:30 ryo Exp $ */ +/* $NetBSD: cpufunc.h,v 1.8 2019/11/22 05:21:19 mlelstv Exp $ */ /* * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org> @@ -70,7 +70,8 @@ extern u_int aarch64_cache_prefer_mask; extern u_int cputype; /* compat arm */ int set_cpufuncs(void); -void aarch64_getcacheinfo(void); +void aarch64_gettopology(struct cpu_info *, uint64_t); +void aarch64_getcacheinfo(int); void aarch64_printcacheinfo(device_t); void aarch64_dcache_wbinv_all(void);