summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/sparc64/include/smp.h44
-rw-r--r--sys/sparc64/sparc64/genassym.c6
-rw-r--r--sys/sparc64/sparc64/mp_machdep.c38
3 files changed, 58 insertions, 30 deletions
diff --git a/sys/sparc64/include/smp.h b/sys/sparc64/include/smp.h
index 23076ef..8eb5636 100644
--- a/sys/sparc64/include/smp.h
+++ b/sys/sparc64/include/smp.h
@@ -29,6 +29,8 @@
#ifndef _MACHINE_SMP_H_
#define _MACHINE_SMP_H_
+#ifdef SMP
+
#define CPU_TICKSYNC 1
#define CPU_STICKSYNC 2
#define CPU_INIT 3
@@ -91,10 +93,6 @@ void cpu_mp_shutdown(void);
typedef void cpu_ipi_selected_t(u_int, u_long, u_long, u_long);
extern cpu_ipi_selected_t *cpu_ipi_selected;
-void ipi_selected(u_int cpus, u_int ipi);
-void ipi_all(u_int ipi);
-void ipi_all_but_self(u_int ipi);
-
void mp_init(void);
extern struct mtx ipi_mtx;
@@ -117,7 +115,19 @@ extern char tl_ipi_tlb_context_demap[];
extern char tl_ipi_tlb_page_demap[];
extern char tl_ipi_tlb_range_demap[];
-#ifdef SMP
+static __inline void
+ipi_all_but_self(u_int ipi)
+{
+
+ cpu_ipi_selected(PCPU_GET(other_cpus), 0, (u_long)tl_ipi_level, ipi);
+}
+
+static __inline void
+ipi_selected(u_int cpus, u_int ipi)
+{
+
+ cpu_ipi_selected(cpus, 0, (u_long)tl_ipi_level, ipi);
+}
#if defined(_MACHINE_PMAP_H_) && defined(_SYS_MUTEX_H_)
@@ -224,8 +234,12 @@ ipi_wait(void *cookie)
#endif /* _MACHINE_PMAP_H_ && _SYS_MUTEX_H_ */
+#endif /* !LOCORE */
+
#else
+#ifndef LOCORE
+
static __inline void *
ipi_dcache_page_inval(void *func, vm_paddr_t pa)
{
@@ -267,8 +281,26 @@ ipi_wait(void *cookie)
}
-#endif /* SMP */
+static __inline void
+tl_ipi_cheetah_dcache_page_inval(void)
+{
+
+}
+
+static __inline void
+tl_ipi_spitfire_dcache_page_inval(void)
+{
+
+}
+
+static __inline void
+tl_ipi_spitfire_icache_page_inval(void)
+{
+
+}
#endif /* !LOCORE */
+#endif /* SMP */
+
#endif /* !_MACHINE_SMP_H_ */
diff --git a/sys/sparc64/sparc64/genassym.c b/sys/sparc64/sparc64/genassym.c
index 09867e8..8073b69 100644
--- a/sys/sparc64/sparc64/genassym.c
+++ b/sys/sparc64/sparc64/genassym.c
@@ -83,6 +83,7 @@ ASSYM(PAGE_SHIFT_4M, PAGE_SHIFT_4M);
ASSYM(PAGE_SIZE, PAGE_SIZE);
ASSYM(PAGE_SIZE_4M, PAGE_SIZE_4M);
+#ifdef SMP
ASSYM(CSA_PCPU, offsetof(struct cpu_start_args, csa_pcpu));
ASSYM(CSA_STATE, offsetof(struct cpu_start_args, csa_state));
#ifdef SUN4U
@@ -95,6 +96,7 @@ ASSYM(CSA_VER, offsetof(struct cpu_start_args, csa_ver));
#ifdef SUN4V
ASSYM(CSA_CPUID, offsetof(struct cpu_start_args, csa_cpuid));
#endif
+#endif
#ifdef SUN4U
ASSYM(DC_SIZE, offsetof(struct cacheinfo, dc_size));
@@ -103,7 +105,9 @@ ASSYM(IC_SIZE, offsetof(struct cacheinfo, ic_size));
ASSYM(IC_LINESIZE, offsetof(struct cacheinfo, ic_linesize));
#endif
+#ifdef SMP
ASSYM(ICA_PA, offsetof(struct ipi_cache_args, ica_pa));
+#endif
ASSYM(KTR_SIZEOF, sizeof(struct ktr_entry));
ASSYM(KTR_LINE, offsetof(struct ktr_entry, ktr_line));
@@ -210,11 +214,13 @@ ASSYM(IR_ARG, offsetof(struct intr_request, ir_arg));
ASSYM(IR_PRI, offsetof(struct intr_request, ir_pri));
ASSYM(IR_VEC, offsetof(struct intr_request, ir_vec));
+#ifdef SMP
ASSYM(ITA_MASK, offsetof(struct ipi_tlb_args, ita_mask));
ASSYM(ITA_PMAP, offsetof(struct ipi_tlb_args, ita_pmap));
ASSYM(ITA_START, offsetof(struct ipi_tlb_args, ita_start));
ASSYM(ITA_END, offsetof(struct ipi_tlb_args, ita_end));
ASSYM(ITA_VA, offsetof(struct ipi_tlb_args, ita_va));
+#endif
ASSYM(IV_FUNC, offsetof(struct intr_vector, iv_func));
ASSYM(IV_ARG, offsetof(struct intr_vector, iv_arg));
diff --git a/sys/sparc64/sparc64/mp_machdep.c b/sys/sparc64/sparc64/mp_machdep.c
index 0fcd6e6..3f372ca 100644
--- a/sys/sparc64/sparc64/mp_machdep.c
+++ b/sys/sparc64/sparc64/mp_machdep.c
@@ -92,6 +92,9 @@ __FBSDID("$FreeBSD$");
#include <machine/tte.h>
#include <machine/ver.h>
+#define SUNW_STARTCPU "SUNW,start-cpu"
+#define SUNW_STOPSELF "SUNW,stop-self"
+
static ih_func_t cpu_ipi_ast;
static ih_func_t cpu_ipi_preempt;
static ih_func_t cpu_ipi_stop;
@@ -113,6 +116,7 @@ cpu_ipi_selected_t *cpu_ipi_selected;
static vm_offset_t mp_tramp;
static u_int cpuid_to_mid[MAXCPU];
+static int has_stopself;
static int isjbus;
static volatile u_int shutdown_cpus;
@@ -210,7 +214,7 @@ sun4u_startcpu(phandle_t cpu, void *func, u_long arg)
cell_t func;
cell_t arg;
} args = {
- (cell_t)"SUNW,start-cpu",
+ (cell_t)SUNW_STARTCPU,
3,
};
@@ -231,7 +235,7 @@ sun4u_stopself(void)
cell_t nargs;
cell_t nreturns;
} args = {
- (cell_t)"SUNW,stop-self",
+ (cell_t)SUNW_STOPSELF,
};
openfirmware_exit(&args);
@@ -256,6 +260,9 @@ cpu_mp_start(void)
mtx_init(&ipi_mtx, "ipi", NULL, MTX_SPIN);
+ if (OF_test(SUNW_STOPSELF) == 0)
+ has_stopself = 1;
+
intr_setup(PIL_AST, cpu_ipi_ast, -1, NULL, NULL);
intr_setup(PIL_RENDEZVOUS, (ih_func_t *)smp_rendezvous_action,
-1, NULL, NULL);
@@ -448,7 +455,11 @@ cpu_ipi_stop(struct trapframe *tf)
while ((started_cpus & PCPU_GET(cpumask)) == 0) {
if ((shutdown_cpus & PCPU_GET(cpumask)) != 0) {
atomic_clear_int(&shutdown_cpus, PCPU_GET(cpumask));
- sun4u_stopself();
+ if (has_stopself != 0)
+ sun4u_stopself();
+ (void)intr_disable();
+ for (;;)
+ ;
}
}
atomic_clear_rel_int(&started_cpus, PCPU_GET(cpumask));
@@ -595,24 +606,3 @@ cheetah_ipi_selected(u_int cpus, u_long d0, u_long d1, u_long d2)
else
panic("%s: couldn't send IPI", __func__);
}
-
-void
-ipi_selected(u_int cpus, u_int ipi)
-{
-
- cpu_ipi_selected(cpus, 0, (u_long)tl_ipi_level, ipi);
-}
-
-void
-ipi_all(u_int ipi)
-{
-
- panic("%s", __func__);
-}
-
-void
-ipi_all_but_self(u_int ipi)
-{
-
- cpu_ipi_selected(PCPU_GET(other_cpus), 0, (u_long)tl_ipi_level, ipi);
-}
OpenPOWER on IntegriCloud