smp.h revision 25164
1/* 2 * ---------------------------------------------------------------------------- 3 * "THE BEER-WARE LICENSE" (Revision 42): 4 * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you 5 * can do whatever you want with this stuff. If we meet some day, and you think 6 * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 7 * ---------------------------------------------------------------------------- 8 * 9 * $Id: smp.h,v 1.29 1997/04/26 08:11:50 peter Exp $ 10 * 11 */ 12 13#ifndef _MACHINE_SMP_H_ 14#define _MACHINE_SMP_H_ 15 16#ifdef KERNEL 17 18#include "opt_smp.h" 19#include "opt_smp_invltlb.h" /* aiee! (for cpufunc.h!) */ 20 21#if defined(SMP) && !defined(NCPU) 22# define NCPU 2 23#endif /* SMP && NCPU */ 24 25#if defined(SMP) || defined(APIC_IO) 26 27/* global data in mpboot.s */ 28extern int bootMP_size; 29 30/* functions in mpboot.s */ 31void bootMP __P((void)); 32 33/* global data in mplock.s */ 34extern u_int mp_lock; 35 36/* functions in mplock.s */ 37void get_mplock __P((void)); 38void rel_mplock __P((void)); 39void expect_mplock __P((void)); 40 41/* global data in mp_machdep.c */ 42extern struct proc* SMPcurproc[NCPU]; 43extern struct pcb* SMPcurpcb[NCPU]; 44extern struct timeval SMPruntime[NCPU]; 45extern int mp_ncpus; 46extern int mp_naps; 47extern int mp_nbusses; 48extern int mp_napics; 49extern int mp_picmode; 50extern int mpenabled; 51extern int boot_cpu_id; 52extern vm_offset_t cpu_apic_address; 53extern vm_offset_t io_apic_address[]; 54extern u_int32_t cpu_apic_versions[]; 55extern u_int32_t io_apic_versions[]; 56extern int cpu_num_to_apic_id[]; 57extern int io_num_to_apic_id[]; 58extern int apic_id_to_logical[]; 59 60/* functions in mp_machdep.c */ 61u_int mp_bootaddress __P((u_int)); 62void mp_start __P((void)); 63void mp_announce __P((void)); 64int get_isa_apic_irq __P((int)); 65int get_eisa_apic_irq __P((int)); 66int get_pci_apic_irq __P((int, int, int)); 67int undirect_pci_irq __P((int)); 68int apic_bus_type __P((int)); 69int apic_src_bus_id __P((int, int)); 70int apic_src_bus_irq __P((int, int)); 71int apic_int_type __P((int, int)); 72int apic_trigger __P((int, int)); 73int apic_polarity __P((int, int)); 74void configure_local_apic __P((void)); 75void init_secondary __P((void)); 76#ifdef SMP_INVLTLB 77void ipi_invltlb __P((void)); 78void smp_invltlb __P((void)); 79#endif 80 81/* global data in mpapic.c */ 82extern volatile u_int* apic_base; 83 84#if defined(MULTIPLE_IOAPICS) 85#error MULTIPLE_IOAPICSXXX 86#else 87extern volatile u_int* io_apic_base; 88#endif /* MULTIPLE_IOAPICS */ 89 90/* functions in mpapic.c */ 91void apic_initialize __P((int)); 92int selected_apic_ipi __P((u_int, int, int)); 93int io_apic_setup __P((int)); 94int ext_int_setup __P((int, int)); 95void write_io_apic_mask24 __P((int, u_int32_t)); 96 97#if defined(READY) 98void clr_io_apic_mask24 __P((int, u_int32_t)); 99void set_io_apic_mask24 __P((int, u_int32_t)); 100#endif /* READY */ 101 102void set_apic_timer __P((int)); 103int read_apic_timer __P((void)); 104void u_sleep __P((int)); 105 106/* global data in init_smp.c */ 107extern int smp_active; 108extern int invldebug; 109 110/* in pmap.c FIXME: belongs in pmap.h??? */ 111void pmap_bootstrap_apics __P((void)); 112void pmap_bootstrap2 __P((void)); 113 114#if 0 115/* chicken and egg problem... */ 116static __inline unsigned 117cpunumber(void) 118{ 119 return (unsigned)ID_TO_CPU((apic_base[APIC_ID] & APIC_ID_MASK) >> 24); 120} 121#else 122/* 123 * we 'borrow' this info from apic.h 124 * this will go away soon... 125 */ 126static __inline unsigned 127cpunumber(void) 128{ 129 return (unsigned)(apic_id_to_logical[(apic_base[8] & 0x0f000000) >> 24]); 130} 131#endif /* 0 */ 132 133#endif /* SMP || APIC_IO */ 134#endif /* KERNEL */ 135#endif /* _MACHINE_SMP_H_ */ 136