diff options
author | 2016-12-11 07:57:14 +0000 | |
---|---|---|
committer | 2016-12-11 07:57:14 +0000 | |
commit | 3485d23076f0b9e23e2009515ce5a5b175bf38f4 (patch) | |
tree | 5aad546fc9b599edc0299c74242dc9d319d2cea9 | |
parent | Merge one sentence and the references from dsa(3) to DSA_new(3) and (diff) | |
download | wireguard-openbsd-3485d23076f0b9e23e2009515ce5a5b175bf38f4.tar.xz wireguard-openbsd-3485d23076f0b9e23e2009515ce5a5b175bf38f4.zip |
Determine the available CPUs.
-rw-r--r-- | sys/arch/loongson/include/autoconf.h | 6 | ||||
-rw-r--r-- | sys/arch/loongson/loongson/generic3a_machdep.c | 11 | ||||
-rw-r--r-- | sys/arch/loongson/loongson/loongson3_intr.c | 4 | ||||
-rw-r--r-- | sys/arch/loongson/loongson/machdep.c | 47 |
4 files changed, 60 insertions, 8 deletions
diff --git a/sys/arch/loongson/include/autoconf.h b/sys/arch/loongson/include/autoconf.h index 964d6c762de..c7d20447921 100644 --- a/sys/arch/loongson/include/autoconf.h +++ b/sys/arch/loongson/include/autoconf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: autoconf.h,v 1.12 2016/11/05 05:28:39 visa Exp $ */ +/* $OpenBSD: autoconf.h,v 1.13 2016/12/11 07:57:14 visa Exp $ */ /* * Copyright (c) 2001-2003 Opsycon AB (www.opsycon.se / www.opsycon.com) @@ -76,8 +76,12 @@ struct platform { int (*resume)(void); }; +#define LOONGSON_MAXCPUS 16 + extern const struct platform *sys_platform; +extern uint loongson_cpumask; extern uint loongson_ver; +extern int nnodes; struct mainbus_attach_args { const char *maa_name; diff --git a/sys/arch/loongson/loongson/generic3a_machdep.c b/sys/arch/loongson/loongson/generic3a_machdep.c index 0348f5f3d4e..d6cb1b01afd 100644 --- a/sys/arch/loongson/loongson/generic3a_machdep.c +++ b/sys/arch/loongson/loongson/generic3a_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: generic3a_machdep.c,v 1.2 2016/11/18 17:02:14 visa Exp $ */ +/* $OpenBSD: generic3a_machdep.c,v 1.3 2016/12/11 07:57:14 visa Exp $ */ /* * Copyright (c) 2009, 2010, 2012 Miodrag Vallat. @@ -135,6 +135,15 @@ void generic3a_setup(void) { const struct pmon_env_reset *resetenv = pmon_get_env_reset(); + uint32_t boot_cpuid = loongson3_get_cpuid(); + + /* Override the mask if it misses the boot CPU. */ + if (!ISSET(loongson_cpumask, 1u << boot_cpuid)) { + loongson_cpumask = 1u << boot_cpuid; + ncpusfound = 1; + } + + nnodes = LS3_NODEID(fls(loongson_cpumask) - 1) + 1; if (resetenv != NULL) { generic3a_reboot_entry = resetenv->warm_boot; diff --git a/sys/arch/loongson/loongson/loongson3_intr.c b/sys/arch/loongson/loongson/loongson3_intr.c index e92a7d4b2a8..41815c6ec3c 100644 --- a/sys/arch/loongson/loongson/loongson3_intr.c +++ b/sys/arch/loongson/loongson/loongson3_intr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: loongson3_intr.c,v 1.2 2016/12/03 05:52:58 visa Exp $ */ +/* $OpenBSD: loongson3_intr.c,v 1.3 2016/12/11 07:57:14 visa Exp $ */ /* * Copyright (c) 2016 Visa Hankala @@ -35,8 +35,6 @@ uint32_t loongson3_ht_intr(uint32_t, struct trapframe *); uint32_t loongson3_intr(uint32_t, struct trapframe *); void loongson3_splx(int); -extern int nnodes; - const struct pic *loongson3_ht_pic; paddr_t loongson3_ht_cfg_base; diff --git a/sys/arch/loongson/loongson/machdep.c b/sys/arch/loongson/loongson/machdep.c index 0f65dd05e95..55fd7183960 100644 --- a/sys/arch/loongson/loongson/machdep.c +++ b/sys/arch/loongson/loongson/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.68 2016/11/17 14:41:21 visa Exp $ */ +/* $OpenBSD: machdep.c,v 1.69 2016/12/11 07:57:14 visa Exp $ */ /* * Copyright (c) 2009, 2010, 2014 Miodrag Vallat. @@ -119,6 +119,7 @@ struct user *proc0paddr; const struct platform *sys_platform; struct cpu_hwinfo bootcpu_hwinfo; +uint loongson_cpumask = 1; uint loongson_ver; /* Pointers to the start and end of the symbol table. */ @@ -343,12 +344,35 @@ loongson_identify(const char *version, int envtype) int loongson_efi_setup(void) { + const struct pmon_env_cpu *cpuenv; const struct pmon_env_mem *mem; const struct pmon_env_mem_entry *entry; paddr_t fp, lp; - uint32_t i, seg = 0; + uint32_t i, ncpus, seg = 0; - bootcpu_hwinfo.clock = pmon_get_env_cpu()->speed; + cpuenv = pmon_get_env_cpu(); + bootcpu_hwinfo.clock = cpuenv->speed; + + /* + * Get available CPUs. + */ + + ncpus = cpuenv->ncpus; + if (ncpus > LOONGSON_MAXCPUS) + ncpus = LOONGSON_MAXCPUS; + + loongson_cpumask = (1u << ncpus) - 1; + loongson_cpumask &= ~(uint)cpuenv->reserved_cores; + + ncpusfound = 0; + for (i = 0; i < ncpus; i++) { + if (ISSET(loongson_cpumask, 1u << i)) + ncpusfound++; + } + + /* + * Get free memory segments. + */ mem = pmon_get_env_mem(); physmem = 0; @@ -397,6 +421,23 @@ loongson_envp_setup(void) bootcpu_hwinfo.clock = cpuspeed; /* + * Guess the available CPUs. + */ + + switch (loongson_ver) { +#ifdef CPU_LOONGSON3 + case 0x3a: + loongson_cpumask = 0x0f; + ncpusfound = 4; + break; + case 0x3b: + loongson_cpumask = 0xff; + ncpusfound = 8; + break; +#endif + } + + /* * Figure out memory information. * PMON reports it in two chunks, the memory under the 256MB * CKSEG limit, and memory above that limit. We need to do the |