diff options
Diffstat (limited to 'sys/i386/include/smp.h')
-rw-r--r-- | sys/i386/include/smp.h | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/sys/i386/include/smp.h b/sys/i386/include/smp.h new file mode 100644 index 0000000..d40a933 --- /dev/null +++ b/sys/i386/include/smp.h @@ -0,0 +1,178 @@ +/* + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp + * ---------------------------------------------------------------------------- + * + * $Id: smp.h,v 1.38 1998/03/03 22:56:26 tegge Exp $ + * + */ + +#ifndef _MACHINE_SMP_H_ +#define _MACHINE_SMP_H_ + +#ifdef KERNEL + +#if defined(SMP) && !defined(APIC_IO) +# error APIC_IO required for SMP, add "options APIC_IO" to your config file. +#endif /* SMP && !APIC_IO */ + +/* Number of CPUs. */ +#if defined(SMP) && !defined(NCPU) +# define NCPU 2 +#endif /* SMP && NCPU */ + +/* Number of IO APICs. */ +#if defined(APIC_IO) && !defined(NAPIC) +# define NAPIC 1 +#endif /* SMP && NAPIC */ + + +#if defined(SMP) || defined(APIC_IO) + +#ifndef LOCORE + +/* + * For sending values to POST displays. + * XXX FIXME: where does this really belong, isa.h/isa.c perhaps? + */ +extern int current_postcode; /** XXX currently in mp_machdep.c */ +#define POSTCODE(X) current_postcode = (X), \ + outb(0x80, current_postcode) +#define POSTCODE_LO(X) current_postcode &= 0xf0, \ + current_postcode |= ((X) & 0x0f), \ + outb(0x80, current_postcode) +#define POSTCODE_HI(X) current_postcode &= 0x0f, \ + current_postcode |= (((X) << 4) & 0xf0), \ + outb(0x80, current_postcode) + + +#include <machine/apic.h> + +/* global data in mpboot.s */ +extern int bootMP_size; + +/* functions in mpboot.s */ +void bootMP __P((void)); + +/* global data in mplock.s */ +extern u_int mp_lock; +extern u_int isr_lock; +#ifdef RECURSIVE_MPINTRLOCK +extern u_int mpintr_lock; +#endif /* RECURSIVE_MPINTRLOCK */ + +/* functions in mplock.s */ +void get_mplock __P((void)); +void rel_mplock __P((void)); +int try_mplock __P((void)); +#ifdef RECURSIVE_MPINTRLOCK +void get_mpintrlock __P((void)); +void rel_mpintrlock __P((void)); +int try_mpintrlock __P((void)); +#endif /* RECURSIVE_MPINTRLOCK */ + +/* global data in apic_vector.s */ +extern volatile u_int stopped_cpus; +extern volatile u_int started_cpus; + +extern unsigned int checkstate_probed_cpus; +extern unsigned int checkstate_need_ast; + +/* functions in apic_ipl.s */ +void apic_eoi __P((void)); +u_int io_apic_read __P((int, int)); +void io_apic_write __P((int, int, u_int)); + +/* global data in mp_machdep.c */ +extern int bsp_apic_ready; +extern int mp_ncpus; +extern int mp_naps; +extern int mp_nbusses; +extern int mp_napics; +extern int mp_picmode; +extern int boot_cpu_id; +extern vm_offset_t cpu_apic_address; +extern vm_offset_t io_apic_address[]; +extern u_int32_t cpu_apic_versions[]; +extern u_int32_t io_apic_versions[]; +extern int cpu_num_to_apic_id[]; +extern int io_num_to_apic_id[]; +extern int apic_id_to_logical[]; +extern u_int all_cpus; +extern u_char SMP_ioapic[]; + +/* functions in mp_machdep.c */ +u_int mp_bootaddress __P((u_int)); +int mp_probe __P((void)); +void mp_start __P((void)); +void mp_announce __P((void)); +u_int isa_apic_mask __P((u_int)); +int isa_apic_pin __P((int)); +int pci_apic_pin __P((int, int, int)); +int undirect_isa_irq __P((int)); +int undirect_pci_irq __P((int)); +int apic_bus_type __P((int)); +int apic_src_bus_id __P((int, int)); +int apic_src_bus_irq __P((int, int)); +int apic_int_type __P((int, int)); +int apic_trigger __P((int, int)); +int apic_polarity __P((int, int)); +void bsp_apic_configure __P((void)); +void init_secondary __P((void)); +void smp_invltlb __P((void)); +int stop_cpus __P((u_int)); +int restart_cpus __P((u_int)); +#ifdef BETTER_CLOCK +void forward_statclock __P((int pscnt)); +void forward_hardclock __P((int pscnt)); +#endif /* BETTER_CLOCK */ +void forward_signal __P((struct proc *)); +#ifdef APIC_INTR_REORDER +void set_lapic_isrloc __P((int, int)); +#endif /* APIC_INTR_REORDER */ + +/* global data in mpapic.c */ +extern volatile lapic_t lapic; + +#if defined(MULTIPLE_IOAPICS) +#error MULTIPLE_IOAPICSXXX +#else +extern volatile ioapic_t *ioapic[]; +#endif /* MULTIPLE_IOAPICS */ + +/* functions in mpapic.c */ +void apic_dump __P((char*)); +void apic_initialize __P((void)); +void imen_dump __P((void)); +int apic_ipi __P((int, int, int)); +int selected_apic_ipi __P((u_int, int, int)); +int io_apic_setup __P((int)); +int ext_int_setup __P((int, int)); + +#if defined(READY) +void clr_io_apic_mask24 __P((int, u_int32_t)); +void set_io_apic_mask24 __P((int, u_int32_t)); +#endif /* READY */ + +void set_apic_timer __P((int)); +int read_apic_timer __P((void)); +void u_sleep __P((int)); + +/* global data in init_smp.c */ +extern int invltlb_ok; +extern int smp_active; +extern volatile int smp_idle_loops; + +/* 'private' global data in locore.s */ +extern volatile u_int cpuid; +extern volatile u_int cpu_lockid; +extern int inside_intr; +extern volatile u_int other_cpus; + +#endif /* !LOCORE */ +#endif /* SMP || APIC_IO */ +#endif /* KERNEL */ +#endif /* _MACHINE_SMP_H_ */ |