diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/sparc64/include/smp.h | 44 | ||||
-rw-r--r-- | sys/sparc64/sparc64/genassym.c | 6 | ||||
-rw-r--r-- | sys/sparc64/sparc64/mp_machdep.c | 38 |
3 files changed, 58 insertions, 30 deletions
diff --git a/sys/sparc64/include/smp.h b/sys/sparc64/include/smp.h index 23076effe63c..8eb5636c9396 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 09867e8c8242..8073b692e83b 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 0fcd6e60e5d5..3f372ca1ba94 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); -} |