smp.h revision 27285
165832Snyan/* 265832Snyan * ---------------------------------------------------------------------------- 365832Snyan * "THE BEER-WARE LICENSE" (Revision 42): 465832Snyan * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you 565832Snyan * can do whatever you want with this stuff. If we meet some day, and you think 665832Snyan * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 765832Snyan * ---------------------------------------------------------------------------- 865832Snyan * 965832Snyan * $Id: smp.h,v 1.6 1997/07/08 23:29:48 smp Exp smp $ 1065832Snyan * 1165832Snyan */ 1265832Snyan 1365832Snyan#ifndef _MACHINE_SMP_H_ 1465832Snyan#define _MACHINE_SMP_H_ 1565832Snyan 1665832Snyan#ifdef KERNEL 1765832Snyan 1865832Snyan#if defined(SMP) && !defined(APIC_IO) 1965832Snyan# error APIC_IO required for SMP, add "options APIC_IO" to your config file. 2065832Snyan#endif /* SMP && !APIC_IO */ 2165832Snyan 2265832Snyan#if defined(SMP) && !defined(NCPU) 2365832Snyan# define NCPU 2 2465832Snyan#endif /* SMP && NCPU */ 2565832Snyan 2665832Snyan#if defined(SMP) || defined(APIC_IO) 2765832Snyan 2865832Snyan/* 2965832Snyan * For sending values to POST displays. 3065832Snyan * XXX FIXME: where does this really belong, isa.h/isa.c perhaps? 3165832Snyan */ 3267158Sphkextern int current_postcode; /** XXX currently in mp_machdep.c */ 3365832Snyan#define POSTCODE(X) current_postcode = (X), \ 3465832Snyan outb(0x80, current_postcode) 3565832Snyan#define POSTCODE_LO(X) current_postcode &= 0xf0, \ 3665832Snyan current_postcode |= ((X) & 0x0f), \ 3765832Snyan outb(0x80, current_postcode) 3865832Snyan#define POSTCODE_HI(X) current_postcode &= 0x0f, \ 3965832Snyan current_postcode |= (((X) << 4) & 0xf0), \ 4065832Snyan outb(0x80, current_postcode) 4165832Snyan 4265832Snyan 4365832Snyan#include <machine/apic.h> 4465832Snyan 4565832Snyan/* global data in mpboot.s */ 4665832Snyanextern int bootMP_size; 4765832Snyan 4865832Snyan/* functions in mpboot.s */ 4965832Snyanvoid bootMP __P((void)); 5065832Snyan 5165832Snyan/* global data in mplock.s */ 5265832Snyanextern u_int mp_lock; 5365832Snyan 5465832Snyan/* functions in mplock.s */ 5565832Snyanvoid get_mplock __P((void)); 5665832Snyanvoid rel_mplock __P((void)); 5765832Snyanvoid try_mplock __P((void)); 5865832Snyan 5965832Snyan/* global data in apic_vector.s */ 6065832Snyanextern volatile u_int stopped_cpus; 6165832Snyanextern volatile u_int started_cpus; 6265832Snyan 6365832Snyan/* global data in mp_machdep.c */ 6465832Snyanextern int mp_ncpus; 6565832Snyanextern int mp_naps; 6665832Snyanextern int mp_nbusses; 6765832Snyanextern int mp_napics; 6865832Snyanextern int mp_picmode; 6965832Snyanextern int boot_cpu_id; 7065832Snyanextern vm_offset_t cpu_apic_address; 7165832Snyanextern vm_offset_t io_apic_address[]; 7265832Snyanextern u_int32_t cpu_apic_versions[]; 7365832Snyanextern u_int32_t io_apic_versions[]; 7465832Snyanextern int cpu_num_to_apic_id[]; 7565832Snyanextern int io_num_to_apic_id[]; 7665832Snyanextern int apic_id_to_logical[]; 7765832Snyanextern u_int all_cpus; 7865832Snyanextern u_int SMP_prvpt[]; 7965832Snyanextern u_char SMP_ioapic[]; 8065832Snyan 8165832Snyan/* functions in mp_machdep.c */ 8265832Snyanu_int mp_bootaddress __P((u_int)); 8365832Snyanint mp_probe __P((void)); 8465832Snyanvoid mp_start __P((void)); 8565832Snyanvoid mp_announce __P((void)); 8665832Snyanu_int isa_apic_mask __P((u_int)); 8765832Snyanint isa_apic_pin __P((int)); 8865832Snyanint pci_apic_pin __P((int, int, int)); 8965832Snyanint undirect_isa_irq __P((int)); 9065832Snyanint undirect_pci_irq __P((int)); 9165832Snyanint apic_bus_type __P((int)); 9265832Snyanint apic_src_bus_id __P((int, int)); 9365832Snyanint apic_src_bus_irq __P((int, int)); 9465832Snyanint apic_int_type __P((int, int)); 9565832Snyanint apic_trigger __P((int, int)); 9665832Snyanint apic_polarity __P((int, int)); 9765832Snyanvoid bsp_apic_configure __P((void)); 9865832Snyanvoid init_secondary __P((void)); 9965832Snyanvoid smp_invltlb __P((void)); 10065832Snyanint stop_cpus __P((u_int)); 10165832Snyanint restart_cpus __P((u_int)); 10265832Snyan 10365832Snyan/* global data in mpapic.c */ 10465832Snyanextern volatile lapic_t lapic; 10565832Snyan 10665832Snyan#if defined(MULTIPLE_IOAPICS) 10765832Snyan#error MULTIPLE_IOAPICSXXX 10865832Snyan#else 10965832Snyanextern volatile ioapic_t *ioapic[]; 11065832Snyan#endif /* MULTIPLE_IOAPICS */ 11165832Snyan 11265832Snyan/* functions in mpapic.c */ 11365832Snyanvoid apic_initialize __P((void)); 11465832Snyanint apic_ipi __P((int, int, int)); 11565832Snyanint selected_apic_ipi __P((u_int, int, int)); 11665832Snyanint io_apic_setup __P((int)); 11765832Snyanint ext_int_setup __P((int, int)); 11865832Snyanvoid write_io_apic_mask24 __P((int, u_int32_t)); 11965832Snyan 12065832Snyan#if defined(READY) 12165832Snyanvoid clr_io_apic_mask24 __P((int, u_int32_t)); 12265832Snyanvoid set_io_apic_mask24 __P((int, u_int32_t)); 12365832Snyan#endif /* READY */ 12465832Snyan 12565832Snyanvoid set_apic_timer __P((int)); 12665832Snyanint read_apic_timer __P((void)); 12765832Snyanvoid u_sleep __P((int)); 12865832Snyan 12965832Snyan/* global data in init_smp.c */ 13065832Snyanextern int smp_active; 13165832Snyanextern int invltlb_ok; 13265832Snyan 13365832Snyan/* 'private' global data in locore.s */ 13465832Snyanextern volatile u_int cpuid; 13565832Snyanextern volatile u_int cpu_lockid; 13665832Snyanextern volatile u_int other_cpus; 13765832Snyan 13865832Snyan#endif /* SMP || APIC_IO */ 13965832Snyan#endif /* KERNEL */ 14065832Snyan#endif /* _MACHINE_SMP_H_ */ 14165832Snyan