summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvisa <visa@openbsd.org>2016-12-11 07:57:14 +0000
committervisa <visa@openbsd.org>2016-12-11 07:57:14 +0000
commit3485d23076f0b9e23e2009515ce5a5b175bf38f4 (patch)
tree5aad546fc9b599edc0299c74242dc9d319d2cea9
parentMerge one sentence and the references from dsa(3) to DSA_new(3) and (diff)
downloadwireguard-openbsd-3485d23076f0b9e23e2009515ce5a5b175bf38f4.tar.xz
wireguard-openbsd-3485d23076f0b9e23e2009515ce5a5b175bf38f4.zip
Determine the available CPUs.
-rw-r--r--sys/arch/loongson/include/autoconf.h6
-rw-r--r--sys/arch/loongson/loongson/generic3a_machdep.c11
-rw-r--r--sys/arch/loongson/loongson/loongson3_intr.c4
-rw-r--r--sys/arch/loongson/loongson/machdep.c47
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