smp.h revision 91617
180708Sjake/*- 280708Sjake * Copyright (c) 2001 Jake Burkholder. 380708Sjake * All rights reserved. 480708Sjake * 580708Sjake * Redistribution and use in source and binary forms, with or without 680708Sjake * modification, are permitted provided that the following conditions 780708Sjake * are met: 880708Sjake * 1. Redistributions of source code must retain the above copyright 980708Sjake * notice, this list of conditions and the following disclaimer. 1080708Sjake * 2. Redistributions in binary form must reproduce the above copyright 1180708Sjake * notice, this list of conditions and the following disclaimer in the 1280708Sjake * documentation and/or other materials provided with the distribution. 1380708Sjake * 1481334Sobrien * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1580708Sjake * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1680708Sjake * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1781334Sobrien * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1880708Sjake * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1980708Sjake * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2080708Sjake * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2180708Sjake * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2280708Sjake * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2380708Sjake * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2480708Sjake * SUCH DAMAGE. 2580708Sjake * 2680708Sjake * $FreeBSD: head/sys/sparc64/include/smp.h 91617 2002-03-04 07:12:36Z jake $ 2780708Sjake */ 2880708Sjake 2980708Sjake#ifndef _MACHINE_SMP_H_ 3080708Sjake#define _MACHINE_SMP_H_ 3180708Sjake 3291617Sjake#define CPU_CLKSYNC 1 3391617Sjake#define CPU_INIT 2 3491617Sjake#define CPU_BOOTSTRAP 3 3589051Sjake 3689051Sjake#ifndef LOCORE 3789051Sjake 3891157Sjake#include <machine/intr_machdep.h> 3991617Sjake#include <machine/tte.h> 4091157Sjake 4189051Sjake#define IDR_BUSY (1<<0) 4289051Sjake#define IDR_NACK (1<<1) 4389051Sjake 4489051Sjake#define IPI_AST PIL_AST 4589051Sjake#define IPI_RENDEZVOUS PIL_RENDEZVOUS 4689051Sjake#define IPI_STOP PIL_STOP 4789051Sjake 4889051Sjake#define IPI_RETRIES 100 4989051Sjake 5089051Sjakestruct cpu_start_args { 5189051Sjake u_int csa_mid; 5289051Sjake u_int csa_state; 5391617Sjake u_long csa_tick; 5491617Sjake u_long csa_ver; 5591617Sjake struct tte csa_ttes[PCPU_PAGES]; 5689051Sjake}; 5789051Sjake 5889051Sjakestruct ipi_level_args { 5989051Sjake u_int ila_count; 6089051Sjake u_int ila_level; 6189051Sjake}; 6289051Sjake 6389051Sjakestruct ipi_tlb_args { 6489051Sjake u_int ita_count; 6589051Sjake u_long ita_tlb; 6689051Sjake u_long ita_ctx; 6789051Sjake u_long ita_start; 6889051Sjake u_long ita_end; 6989051Sjake}; 7089051Sjake#define ita_va ita_start 7189051Sjake 7289051Sjakestruct pcpu; 7389051Sjake 7489051Sjakevoid cpu_mp_bootstrap(struct pcpu *pc); 7589051Sjake 7689051Sjakevoid cpu_ipi_selected(u_int cpus, u_long d0, u_long d1, u_long d2); 7789051Sjakevoid cpu_ipi_send(u_int mid, u_long d0, u_long d1, u_long d2); 7889051Sjake 7989051Sjakevoid ipi_selected(u_int cpus, u_int ipi); 8089051Sjakevoid ipi_all(u_int ipi); 8189051Sjakevoid ipi_all_but_self(u_int ipi); 8289051Sjake 8391617Sjakevm_offset_t mp_tramp_alloc(void); 8491617Sjake 8589425Sjakeextern struct ipi_level_args ipi_level_args; 8689425Sjakeextern struct ipi_tlb_args ipi_tlb_args; 8789051Sjake 8889051Sjakeextern int mp_ncpus; 8989051Sjake 9091617Sjakeextern vm_offset_t mp_tramp; 9191617Sjakeextern char *mp_tramp_code; 9291617Sjakeextern u_long mp_tramp_code_len; 9391617Sjakeextern u_long mp_tramp_tlb_slots; 9491617Sjakeextern u_long mp_tramp_func; 9591617Sjake 9691617Sjakeextern void mp_startup(void); 9791617Sjake 9889051Sjakeextern char tl_ipi_level[]; 9989051Sjakeextern char tl_ipi_test[]; 10089051Sjakeextern char tl_ipi_tlb_context_demap[]; 10189051Sjakeextern char tl_ipi_tlb_page_demap[]; 10289051Sjakeextern char tl_ipi_tlb_range_demap[]; 10389051Sjake 10489051Sjake#ifdef SMP 10589051Sjake 10689051Sjakestatic __inline void * 10789051Sjakeipi_tlb_context_demap(u_int ctx) 10889051Sjake{ 10989051Sjake struct ipi_tlb_args *ita; 11089051Sjake 11189051Sjake if (mp_ncpus == 1) 11289051Sjake return (NULL); 11389051Sjake ita = &ipi_tlb_args; 11489051Sjake ita->ita_count = mp_ncpus; 11589051Sjake ita->ita_ctx = ctx; 11689051Sjake cpu_ipi_selected(PCPU_GET(other_cpus), 0, 11789051Sjake (u_long)tl_ipi_tlb_context_demap, (u_long)ita); 11889051Sjake return (&ita->ita_count); 11989051Sjake} 12089051Sjake 12189051Sjakestatic __inline void * 12289051Sjakeipi_tlb_page_demap(u_int tlb, u_int ctx, vm_offset_t va) 12389051Sjake{ 12489051Sjake struct ipi_tlb_args *ita; 12589051Sjake 12689051Sjake if (mp_ncpus == 1) 12789051Sjake return (NULL); 12889051Sjake ita = &ipi_tlb_args; 12989051Sjake ita->ita_count = mp_ncpus; 13089051Sjake ita->ita_tlb = tlb; 13189051Sjake ita->ita_ctx = ctx; 13289051Sjake ita->ita_va = va; 13389051Sjake cpu_ipi_selected(PCPU_GET(other_cpus), 0, 13489051Sjake (u_long)tl_ipi_tlb_page_demap, (u_long)ita); 13589051Sjake return (&ita->ita_count); 13689051Sjake} 13789051Sjake 13889051Sjakestatic __inline void * 13989051Sjakeipi_tlb_range_demap(u_int ctx, vm_offset_t start, vm_offset_t end) 14089051Sjake{ 14189051Sjake struct ipi_tlb_args *ita; 14289051Sjake 14389051Sjake if (mp_ncpus == 1) 14489051Sjake return (NULL); 14589051Sjake ita = &ipi_tlb_args; 14689051Sjake ita->ita_count = mp_ncpus; 14789051Sjake ita->ita_ctx = ctx; 14889051Sjake ita->ita_start = start; 14989051Sjake ita->ita_end = end; 15089051Sjake cpu_ipi_selected(PCPU_GET(other_cpus), 0, 15189051Sjake (u_long)tl_ipi_tlb_range_demap, (u_long)ita); 15289051Sjake return (&ita->ita_count); 15389051Sjake} 15489051Sjake 15589051Sjakestatic __inline void 15689051Sjakeipi_wait(void *cookie) 15789051Sjake{ 15889051Sjake u_int *count; 15989051Sjake 16089051Sjake if ((count = cookie) != NULL) { 16189051Sjake atomic_subtract_int(count, 1); 16289051Sjake while (*count != 0) 16391617Sjake ; 16489051Sjake } 16589051Sjake} 16689051Sjake 16789051Sjake#else 16889051Sjake 16989051Sjakestatic __inline void * 17089051Sjakeipi_tlb_context_demap(u_int ctx) 17189051Sjake{ 17289051Sjake return (NULL); 17389051Sjake} 17489051Sjake 17589051Sjakestatic __inline void * 17689051Sjakeipi_tlb_page_demap(u_int tlb, u_int ctx, vm_offset_t va) 17789051Sjake{ 17889051Sjake return (NULL); 17989051Sjake} 18089051Sjake 18189051Sjakestatic __inline void * 18289051Sjakeipi_tlb_range_demap(u_int ctx, vm_offset_t start, vm_offset_t end) 18389051Sjake{ 18489051Sjake return (NULL); 18589051Sjake} 18689051Sjake 18789051Sjakestatic __inline void 18889051Sjakeipi_wait(void *cookie) 18989051Sjake{ 19089051Sjake} 19189051Sjake 19289051Sjake#endif /* SMP */ 19389051Sjake 19489051Sjake#endif /* !LOCORE */ 19589051Sjake 19680708Sjake#endif /* !_MACHINE_SMP_H_ */ 197