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 * 9477a642cSPeter Wemm * $Id: smp.h,v 1.29 1997/04/26 08:11:50 peter 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 18477a642cSPeter Wemm #include "opt_smp.h" 19477a642cSPeter Wemm #include "opt_smp_invltlb.h" /* aiee! (for cpufunc.h!) */ 20477a642cSPeter Wemm 21477a642cSPeter Wemm #if defined(SMP) && !defined(NCPU) 22477a642cSPeter Wemm # define NCPU 2 23477a642cSPeter Wemm #endif /* SMP && NCPU */ 24477a642cSPeter Wemm 25477a642cSPeter Wemm #if defined(SMP) || defined(APIC_IO) 26477a642cSPeter Wemm 27477a642cSPeter Wemm /* global data in mpboot.s */ 28477a642cSPeter Wemm extern int bootMP_size; 29477a642cSPeter Wemm 30477a642cSPeter Wemm /* functions in mpboot.s */ 31477a642cSPeter Wemm void bootMP __P((void)); 32477a642cSPeter Wemm 33477a642cSPeter Wemm /* global data in mplock.s */ 34477a642cSPeter Wemm extern u_int mp_lock; 35477a642cSPeter Wemm 36477a642cSPeter Wemm /* functions in mplock.s */ 37477a642cSPeter Wemm void get_mplock __P((void)); 38477a642cSPeter Wemm void rel_mplock __P((void)); 39477a642cSPeter Wemm void expect_mplock __P((void)); 40477a642cSPeter Wemm 41477a642cSPeter Wemm /* global data in mp_machdep.c */ 42477a642cSPeter Wemm extern struct proc* SMPcurproc[NCPU]; 43477a642cSPeter Wemm extern struct pcb* SMPcurpcb[NCPU]; 44477a642cSPeter Wemm extern struct timeval SMPruntime[NCPU]; 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)); 62477a642cSPeter Wemm void mp_start __P((void)); 63477a642cSPeter Wemm void mp_announce __P((void)); 64477a642cSPeter Wemm int get_isa_apic_irq __P((int)); 65477a642cSPeter Wemm int get_eisa_apic_irq __P((int)); 66477a642cSPeter Wemm int get_pci_apic_irq __P((int, int, int)); 67477a642cSPeter Wemm int undirect_pci_irq __P((int)); 68477a642cSPeter Wemm int apic_bus_type __P((int)); 69477a642cSPeter Wemm int apic_src_bus_id __P((int, int)); 70477a642cSPeter Wemm int apic_src_bus_irq __P((int, int)); 71477a642cSPeter Wemm int apic_int_type __P((int, int)); 72477a642cSPeter Wemm int apic_trigger __P((int, int)); 73477a642cSPeter Wemm int apic_polarity __P((int, int)); 74477a642cSPeter Wemm void configure_local_apic __P((void)); 75477a642cSPeter Wemm void init_secondary __P((void)); 76477a642cSPeter Wemm #ifdef SMP_INVLTLB 77477a642cSPeter Wemm void ipi_invltlb __P((void)); 78477a642cSPeter Wemm void smp_invltlb __P((void)); 79477a642cSPeter Wemm #endif 80477a642cSPeter Wemm 81477a642cSPeter Wemm /* global data in mpapic.c */ 82477a642cSPeter Wemm extern volatile u_int* apic_base; 83477a642cSPeter Wemm 84477a642cSPeter Wemm #if defined(MULTIPLE_IOAPICS) 85477a642cSPeter Wemm #error MULTIPLE_IOAPICSXXX 86477a642cSPeter Wemm #else 87477a642cSPeter Wemm extern volatile u_int* io_apic_base; 88477a642cSPeter Wemm #endif /* MULTIPLE_IOAPICS */ 89477a642cSPeter Wemm 90477a642cSPeter Wemm /* functions in mpapic.c */ 91477a642cSPeter Wemm void apic_initialize __P((int)); 92477a642cSPeter Wemm int selected_apic_ipi __P((u_int, int, int)); 93477a642cSPeter Wemm int io_apic_setup __P((int)); 94477a642cSPeter Wemm int ext_int_setup __P((int, int)); 95477a642cSPeter Wemm void write_io_apic_mask24 __P((int, u_int32_t)); 96477a642cSPeter Wemm 97477a642cSPeter Wemm #if defined(READY) 98477a642cSPeter Wemm void clr_io_apic_mask24 __P((int, u_int32_t)); 99477a642cSPeter Wemm void set_io_apic_mask24 __P((int, u_int32_t)); 100477a642cSPeter Wemm #endif /* READY */ 101477a642cSPeter Wemm 102477a642cSPeter Wemm void set_apic_timer __P((int)); 103477a642cSPeter Wemm int read_apic_timer __P((void)); 104477a642cSPeter Wemm void u_sleep __P((int)); 105477a642cSPeter Wemm 106477a642cSPeter Wemm /* global data in init_smp.c */ 107477a642cSPeter Wemm extern int smp_active; 108477a642cSPeter Wemm extern int invldebug; 109477a642cSPeter Wemm 110477a642cSPeter Wemm /* in pmap.c FIXME: belongs in pmap.h??? */ 111477a642cSPeter Wemm void pmap_bootstrap_apics __P((void)); 112477a642cSPeter Wemm void pmap_bootstrap2 __P((void)); 113477a642cSPeter Wemm 114477a642cSPeter Wemm #if 0 115477a642cSPeter Wemm /* chicken and egg problem... */ 116477a642cSPeter Wemm static __inline unsigned 117477a642cSPeter Wemm cpunumber(void) 118477a642cSPeter Wemm { 119477a642cSPeter Wemm return (unsigned)ID_TO_CPU((apic_base[APIC_ID] & APIC_ID_MASK) >> 24); 120477a642cSPeter Wemm } 121477a642cSPeter Wemm #else 122477a642cSPeter Wemm /* 123477a642cSPeter Wemm * we 'borrow' this info from apic.h 124477a642cSPeter Wemm * this will go away soon... 125477a642cSPeter Wemm */ 126477a642cSPeter Wemm static __inline unsigned 127477a642cSPeter Wemm cpunumber(void) 128477a642cSPeter Wemm { 129477a642cSPeter Wemm return (unsigned)(apic_id_to_logical[(apic_base[8] & 0x0f000000) >> 24]); 130477a642cSPeter Wemm } 131477a642cSPeter Wemm #endif /* 0 */ 132477a642cSPeter Wemm 133477a642cSPeter Wemm #endif /* SMP || APIC_IO */ 134477a642cSPeter Wemm #endif /* KERNEL */ 135477a642cSPeter Wemm #endif /* _MACHINE_SMP_H_ */ 136