summaryrefslogtreecommitdiffstats
path: root/sys/mips
diff options
context:
space:
mode:
authorjmallett <jmallett@FreeBSD.org>2011-02-12 02:08:24 +0000
committerjmallett <jmallett@FreeBSD.org>2011-02-12 02:08:24 +0000
commit43ee1f2df30c3b8c4c3bbf22918455c6e0032535 (patch)
tree7cb42a62b2992d416a5721dfcfe9f64c3c4a94d6 /sys/mips
parentf74b693166215a41e29f1932c91ef7c921e662a7 (diff)
downloadFreeBSD-src-43ee1f2df30c3b8c4c3bbf22918455c6e0032535.zip
FreeBSD-src-43ee1f2df30c3b8c4c3bbf22918455c6e0032535.tar.gz
Allow the platform code to return a bitmask of running cores rather than just
a number of cores, this allows for a sparse set of CPUs. Implement support for sparse core masks on Octeon. XXX jeff@ suggests that all_cpus should include cores that are offline or running other applications/OSes, so the platform API should be further extended to allow us to set all_cpus to include all cores that are physically-present as opposed to only those that are running FreeBSD. Submitted by: Bhanu Prakash (with modifications) Reviewed by: jchandra Glanced at by: kib, jeff, jhb
Diffstat (limited to 'sys/mips')
-rw-r--r--sys/mips/cavium/octeon_mp.c6
-rw-r--r--sys/mips/include/hwfunc.h4
-rw-r--r--sys/mips/mips/mp_machdep.c30
-rw-r--r--sys/mips/rmi/xlr_machdep.c6
-rw-r--r--sys/mips/sibyte/sb_scd.c6
5 files changed, 30 insertions, 22 deletions
diff --git a/sys/mips/cavium/octeon_mp.c b/sys/mips/cavium/octeon_mp.c
index 09d65de..78eafa6 100644
--- a/sys/mips/cavium/octeon_mp.c
+++ b/sys/mips/cavium/octeon_mp.c
@@ -102,10 +102,10 @@ platform_init_ap(int cpuid)
mips_wbflush();
}
-int
-platform_num_processors(void)
+cpumask_t
+platform_cpu_mask(void)
{
- return (bitcount32(octeon_bootinfo->core_mask));
+ return (octeon_bootinfo->core_mask);
}
struct cpu_group *
diff --git a/sys/mips/include/hwfunc.h b/sys/mips/include/hwfunc.h
index fd89953..683aedb 100644
--- a/sys/mips/include/hwfunc.h
+++ b/sys/mips/include/hwfunc.h
@@ -89,9 +89,9 @@ void platform_ipi_clear(void);
extern int platform_processor_id(void);
/*
- * Return the number of processors available on this platform.
+ * Return the cpumask of available processors.
*/
-extern int platform_num_processors(void);
+extern cpumask_t platform_cpu_mask(void);
/*
* Return the topology of processors on this platform
diff --git a/sys/mips/mips/mp_machdep.c b/sys/mips/mips/mp_machdep.c
index 1203573..e945736 100644
--- a/sys/mips/mips/mp_machdep.c
+++ b/sys/mips/mips/mp_machdep.c
@@ -200,12 +200,14 @@ start_ap(int cpuid)
void
cpu_mp_setmaxid(void)
{
+ cpumask_t cpumask;
- mp_ncpus = platform_num_processors();
+ cpumask = platform_cpu_mask();
+ mp_ncpus = bitcount32(cpumask);
if (mp_ncpus <= 0)
mp_ncpus = 1;
- mp_maxid = min(mp_ncpus, MAXCPU) - 1;
+ mp_maxid = min(fls(cpumask), MAXCPU) - 1;
}
void
@@ -231,24 +233,30 @@ void
cpu_mp_start(void)
{
int error, cpuid;
+ cpumask_t cpumask;
mtx_init(&ap_boot_mtx, "ap boot", NULL, MTX_SPIN);
- all_cpus = 1; /* BSP */
- for (cpuid = 1; cpuid < platform_num_processors(); ++cpuid) {
+ all_cpus = 0;
+ cpumask = platform_cpu_mask();
+
+ while (cpumask != 0) {
+ cpuid = ffs(cpumask) - 1;
+ cpumask &= ~(1 << cpuid);
+
if (cpuid >= MAXCPU) {
printf("cpu_mp_start: ignoring AP #%d.\n", cpuid);
continue;
}
- if ((error = start_ap(cpuid)) != 0) {
- printf("AP #%d failed to start: %d\n", cpuid, error);
- continue;
+ if (cpuid != platform_processor_id()) {
+ if ((error = start_ap(cpuid)) != 0) {
+ printf("AP #%d failed to start: %d\n", cpuid, error);
+ continue;
+ }
+ if (bootverbose)
+ printf("AP #%d started!\n", cpuid);
}
-
- if (bootverbose)
- printf("AP #%d started!\n", cpuid);
-
all_cpus |= 1 << cpuid;
}
diff --git a/sys/mips/rmi/xlr_machdep.c b/sys/mips/rmi/xlr_machdep.c
index 71dae0f..4a1734a 100644
--- a/sys/mips/rmi/xlr_machdep.c
+++ b/sys/mips/rmi/xlr_machdep.c
@@ -614,11 +614,11 @@ platform_processor_id(void)
return (xlr_hwtid_to_cpuid[xlr_cpu_id()]);
}
-int
-platform_num_processors(void)
+cpumask_t
+platform_cpu_mask(void)
{
- return (xlr_ncores * xlr_threads_per_core);
+ return (~0U >> (32 - (xlr_ncores * xlr_threads_per_core)));
}
struct cpu_group *
diff --git a/sys/mips/sibyte/sb_scd.c b/sys/mips/sibyte/sb_scd.c
index f0c7295..e5ac23c 100644
--- a/sys/mips/sibyte/sb_scd.c
+++ b/sys/mips/sibyte/sb_scd.c
@@ -242,11 +242,11 @@ sb_clear_mailbox(int cpu, uint64_t val)
sb_store64(regaddr, val);
}
-int
-platform_num_processors(void)
+cpumask_t
+platform_cpu_mask(void)
{
- return (SYSREV_NUM_PROCESSORS(sb_read_sysrev()));
+ return (~0U >> (32 - SYSREV_NUM_PROCESSORS(sb_read_sysrev())));
}
#endif /* SMP */
OpenPOWER on IntegriCloud