1477a642cSPeter Wemm /* 2477a642cSPeter Wemm * ---------------------------------------------------------------------------- 3477a642cSPeter Wemm * "THE BEER-WARE LICENSE" (Revision 42): 4477a642cSPeter Wemm * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you 5477a642cSPeter Wemm * can do whatever you want with this stuff. If we meet some day, and you think 6477a642cSPeter Wemm * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 7477a642cSPeter Wemm * ---------------------------------------------------------------------------- 8477a642cSPeter Wemm * 908942d46SSteve Passe * $Id: smp.h,v 1.9 1997/05/28 18:44:11 fsmp Exp $ 10477a642cSPeter Wemm * 11477a642cSPeter Wemm */ 12477a642cSPeter Wemm 13477a642cSPeter Wemm #ifndef _MACHINE_SMP_H_ 14477a642cSPeter Wemm #define _MACHINE_SMP_H_ 15477a642cSPeter Wemm 16477a642cSPeter Wemm #ifdef KERNEL 17477a642cSPeter Wemm 18f258030fSSteve Passe #if defined(SMP) && !defined(APIC_IO) 19f258030fSSteve Passe # error APIC_IO required for SMP, add "options APIC_IO" to your config file. 20f258030fSSteve Passe #endif /* SMP && NCPU */ 21f258030fSSteve Passe 22477a642cSPeter Wemm #if defined(SMP) && !defined(NCPU) 23477a642cSPeter Wemm # define NCPU 2 24477a642cSPeter Wemm #endif /* SMP && NCPU */ 25477a642cSPeter Wemm 26477a642cSPeter Wemm #if defined(SMP) || defined(APIC_IO) 27477a642cSPeter Wemm 2808942d46SSteve Passe #include <machine/apic.h> 2908942d46SSteve Passe 30477a642cSPeter Wemm /* global data in mpboot.s */ 31477a642cSPeter Wemm extern int bootMP_size; 32477a642cSPeter Wemm 33477a642cSPeter Wemm /* functions in mpboot.s */ 34477a642cSPeter Wemm void bootMP __P((void)); 35477a642cSPeter Wemm 36477a642cSPeter Wemm /* global data in mplock.s */ 37477a642cSPeter Wemm extern u_int mp_lock; 38477a642cSPeter Wemm 39477a642cSPeter Wemm /* functions in mplock.s */ 40477a642cSPeter Wemm void get_mplock __P((void)); 41477a642cSPeter Wemm void rel_mplock __P((void)); 42dff5c18aSSteve Passe void try_mplock __P((void)); 43477a642cSPeter Wemm 44477a642cSPeter Wemm /* global data in mp_machdep.c */ 45477a642cSPeter Wemm extern int mp_ncpus; 46477a642cSPeter Wemm extern int mp_naps; 47477a642cSPeter Wemm extern int mp_nbusses; 48477a642cSPeter Wemm extern int mp_napics; 49477a642cSPeter Wemm extern int mp_picmode; 50477a642cSPeter Wemm extern int mpenabled; 51477a642cSPeter Wemm extern int boot_cpu_id; 52477a642cSPeter Wemm extern vm_offset_t cpu_apic_address; 53477a642cSPeter Wemm extern vm_offset_t io_apic_address[]; 54477a642cSPeter Wemm extern u_int32_t cpu_apic_versions[]; 55477a642cSPeter Wemm extern u_int32_t io_apic_versions[]; 56477a642cSPeter Wemm extern int cpu_num_to_apic_id[]; 57477a642cSPeter Wemm extern int io_num_to_apic_id[]; 58477a642cSPeter Wemm extern int apic_id_to_logical[]; 59477a642cSPeter Wemm 60477a642cSPeter Wemm /* functions in mp_machdep.c */ 61477a642cSPeter Wemm u_int mp_bootaddress __P((u_int)); 62b8d67ee0SSteve Passe int mp_probe __P((void)); 63477a642cSPeter Wemm void mp_start __P((void)); 64477a642cSPeter Wemm void mp_announce __P((void)); 65477a642cSPeter Wemm int get_isa_apic_irq __P((int)); 662479ac60SSteve Passe u_int get_isa_apic_mask __P((u_int)); 672479ac60SSteve Passe int undirect_isa_irq __P((int)); 68477a642cSPeter Wemm int get_eisa_apic_irq __P((int)); 69477a642cSPeter Wemm int get_pci_apic_irq __P((int, int, int)); 70477a642cSPeter Wemm int undirect_pci_irq __P((int)); 71477a642cSPeter Wemm int apic_bus_type __P((int)); 72477a642cSPeter Wemm int apic_src_bus_id __P((int, int)); 73477a642cSPeter Wemm int apic_src_bus_irq __P((int, int)); 74477a642cSPeter Wemm int apic_int_type __P((int, int)); 75477a642cSPeter Wemm int apic_trigger __P((int, int)); 76477a642cSPeter Wemm int apic_polarity __P((int, int)); 77477a642cSPeter Wemm void configure_local_apic __P((void)); 78477a642cSPeter Wemm void init_secondary __P((void)); 79477a642cSPeter Wemm void smp_invltlb __P((void)); 80477a642cSPeter Wemm 81477a642cSPeter Wemm /* global data in mpapic.c */ 82477a642cSPeter Wemm extern volatile u_int* apic_base; 8308942d46SSteve Passe #if 1 /** XXX APIC_STRUCT */ 8408942d46SSteve Passe extern volatile lapic_t* lapic; 8508942d46SSteve Passe #endif /** XXX APIC_STRUCT */ 86477a642cSPeter Wemm 87477a642cSPeter Wemm #if defined(MULTIPLE_IOAPICS) 88477a642cSPeter Wemm #error MULTIPLE_IOAPICSXXX 89477a642cSPeter Wemm #else 90477a642cSPeter Wemm extern volatile u_int* io_apic_base; 9108942d46SSteve Passe #if 1 /** XXX APIC_STRUCT */ 9208942d46SSteve Passe extern volatile ioapic_t* ioapic; 9308942d46SSteve Passe #endif /** XXX APIC_STRUCT */ 94477a642cSPeter Wemm #endif /* MULTIPLE_IOAPICS */ 95477a642cSPeter Wemm 96477a642cSPeter Wemm /* functions in mpapic.c */ 97477a642cSPeter Wemm void apic_initialize __P((int)); 98a1b71271SSteve Passe int apic_ipi __P((int, int, int)); 99477a642cSPeter Wemm int selected_apic_ipi __P((u_int, int, int)); 100477a642cSPeter Wemm int io_apic_setup __P((int)); 101477a642cSPeter Wemm int ext_int_setup __P((int, int)); 102477a642cSPeter Wemm void write_io_apic_mask24 __P((int, u_int32_t)); 103477a642cSPeter Wemm 104477a642cSPeter Wemm #if defined(READY) 105477a642cSPeter Wemm void clr_io_apic_mask24 __P((int, u_int32_t)); 106477a642cSPeter Wemm void set_io_apic_mask24 __P((int, u_int32_t)); 107477a642cSPeter Wemm #endif /* READY */ 108477a642cSPeter Wemm 109477a642cSPeter Wemm void set_apic_timer __P((int)); 110477a642cSPeter Wemm int read_apic_timer __P((void)); 111477a642cSPeter Wemm void u_sleep __P((int)); 112477a642cSPeter Wemm 113477a642cSPeter Wemm /* global data in init_smp.c */ 114477a642cSPeter Wemm extern int smp_active; 1152c5d02ffSSteve Passe extern int invltlb_ok; 116477a642cSPeter Wemm 117477a642cSPeter Wemm /* in pmap.c FIXME: belongs in pmap.h??? */ 118477a642cSPeter Wemm void pmap_bootstrap_apics __P((void)); 119477a642cSPeter Wemm void pmap_bootstrap2 __P((void)); 120477a642cSPeter Wemm 121477a642cSPeter Wemm #if 0 122477a642cSPeter Wemm /* chicken and egg problem... */ 123477a642cSPeter Wemm static __inline unsigned 124477a642cSPeter Wemm cpunumber(void) 125477a642cSPeter Wemm { 126477a642cSPeter Wemm return (unsigned)ID_TO_CPU((apic_base[APIC_ID] & APIC_ID_MASK) >> 24); 127477a642cSPeter Wemm } 128477a642cSPeter Wemm #else 129477a642cSPeter Wemm /* 130477a642cSPeter Wemm * we 'borrow' this info from apic.h 131477a642cSPeter Wemm * this will go away soon... 132477a642cSPeter Wemm */ 133477a642cSPeter Wemm static __inline unsigned 134477a642cSPeter Wemm cpunumber(void) 135477a642cSPeter Wemm { 13608942d46SSteve Passe #if 0 137477a642cSPeter Wemm return (unsigned)(apic_id_to_logical[(apic_base[8] & 0x0f000000) >> 24]); 13808942d46SSteve Passe #else 13908942d46SSteve Passe return (unsigned)(apic_id_to_logical[(lapic__id & 0x0f000000) >> 24]); 14008942d46SSteve Passe #endif 141477a642cSPeter Wemm } 142477a642cSPeter Wemm #endif /* 0 */ 143477a642cSPeter Wemm 144477a642cSPeter Wemm #endif /* SMP || APIC_IO */ 145477a642cSPeter Wemm #endif /* KERNEL */ 146477a642cSPeter Wemm #endif /* _MACHINE_SMP_H_ */ 147