smp.h revision 25548
1142403Snectar/* 2102644Snectar * ---------------------------------------------------------------------------- 355682Smarkm * "THE BEER-WARE LICENSE" (Revision 42): 4142403Snectar * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you 5142403Snectar * can do whatever you want with this stuff. If we meet some day, and you think 655682Smarkm * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 755682Smarkm * ---------------------------------------------------------------------------- 855682Smarkm * 955682Smarkm * $Id: smp.h,v 1.7 1997/05/06 21:29:57 fsmp Exp $ 1055682Smarkm * 1155682Smarkm */ 1255682Smarkm 1355682Smarkm#ifndef _MACHINE_SMP_H_ 1455682Smarkm#define _MACHINE_SMP_H_ 1590926Snectar 1690926Snectar#ifdef KERNEL 1790926Snectar 1890926Snectar#if defined(SMP) && !defined(APIC_IO) 19102644Snectar# error APIC_IO required for SMP, add "options APIC_IO" to your config file. 2090926Snectar#endif /* SMP && NCPU */ 21127808Snectar 2255682Smarkm#if defined(SMP) && !defined(NCPU) 2355682Smarkm# define NCPU 2 2455682Smarkm#endif /* SMP && NCPU */ 2555682Smarkm 2655682Smarkm#if defined(SMP) || defined(APIC_IO) 2755682Smarkm 2855682Smarkm/* global data in mpboot.s */ 29102644Snectarextern int bootMP_size; 3055682Smarkm 31102644Snectar/* functions in mpboot.s */ 32102644Snectarvoid bootMP __P((void)); 33127808Snectar 3490926Snectar/* global data in mplock.s */ 35127808Snectarextern u_int mp_lock; 3655682Smarkm 3755682Smarkm/* functions in mplock.s */ 3855682Smarkmvoid get_mplock __P((void)); 3955682Smarkmvoid rel_mplock __P((void)); 4055682Smarkmvoid try_mplock __P((void)); 4155682Smarkm 4255682Smarkm/* global data in mp_machdep.c */ 43142403Snectarextern int mp_ncpus; 44142403Snectarextern int mp_naps; 45142403Snectarextern int mp_nbusses; 46142403Snectarextern int mp_napics; 47142403Snectarextern int mp_picmode; 48142403Snectarextern int mpenabled; 49142403Snectarextern int boot_cpu_id; 50142403Snectarextern vm_offset_t cpu_apic_address; 51142403Snectarextern vm_offset_t io_apic_address[]; 52142403Snectarextern u_int32_t cpu_apic_versions[]; 53142403Snectarextern u_int32_t io_apic_versions[]; 54142403Snectarextern int cpu_num_to_apic_id[]; 55142403Snectarextern int io_num_to_apic_id[]; 56142403Snectarextern int apic_id_to_logical[]; 57142403Snectar 58142403Snectar/* functions in mp_machdep.c */ 59142403Snectaru_int mp_bootaddress __P((u_int)); 60142403Snectarvoid mp_start __P((void)); 61142403Snectarvoid mp_announce __P((void)); 62142403Snectarint get_isa_apic_irq __P((int)); 63142403Snectaru_int get_isa_apic_mask __P((u_int)); 64142403Snectarint undirect_isa_irq __P((int)); 65142403Snectarint get_eisa_apic_irq __P((int)); 66142403Snectarint get_pci_apic_irq __P((int, int, int)); 67142403Snectarint undirect_pci_irq __P((int)); 68142403Snectarint apic_bus_type __P((int)); 69142403Snectarint apic_src_bus_id __P((int, int)); 70142403Snectarint apic_src_bus_irq __P((int, int)); 71142403Snectarint apic_int_type __P((int, int)); 72142403Snectarint apic_trigger __P((int, int)); 73142403Snectarint apic_polarity __P((int, int)); 74142403Snectarvoid configure_local_apic __P((void)); 75142403Snectarvoid init_secondary __P((void)); 76142403Snectarvoid smp_invltlb __P((void)); 77142403Snectar 78142403Snectar/* global data in mpapic.c */ 79142403Snectarextern volatile u_int* apic_base; 80142403Snectar 81142403Snectar#if defined(MULTIPLE_IOAPICS) 82142403Snectar#error MULTIPLE_IOAPICSXXX 83142403Snectar#else 84142403Snectarextern volatile u_int* io_apic_base; 85142403Snectar#endif /* MULTIPLE_IOAPICS */ 86142403Snectar 87142403Snectar/* functions in mpapic.c */ 88142403Snectarvoid apic_initialize __P((int)); 89142403Snectarint apic_ipi __P((int, int, int)); 90142403Snectarint selected_apic_ipi __P((u_int, int, int)); 91142403Snectarint io_apic_setup __P((int)); 92142403Snectarint ext_int_setup __P((int, int)); 93142403Snectarvoid write_io_apic_mask24 __P((int, u_int32_t)); 94142403Snectar 95142403Snectar#if defined(READY) 96142403Snectarvoid clr_io_apic_mask24 __P((int, u_int32_t)); 97142403Snectarvoid set_io_apic_mask24 __P((int, u_int32_t)); 98142403Snectar#endif /* READY */ 99142403Snectar 100142403Snectarvoid set_apic_timer __P((int)); 101142403Snectarint read_apic_timer __P((void)); 102142403Snectarvoid u_sleep __P((int)); 103142403Snectar 104142403Snectar/* global data in init_smp.c */ 105142403Snectarextern int smp_active; 106127808Snectarextern int invltlb_ok; 107127808Snectar 108127808Snectar/* in pmap.c FIXME: belongs in pmap.h??? */ 109127808Snectarvoid pmap_bootstrap_apics __P((void)); 110127808Snectarvoid pmap_bootstrap2 __P((void)); 11155682Smarkm 112127808Snectar#if 0 113127808Snectar/* chicken and egg problem... */ 11472445Sassarstatic __inline unsigned 115127808Snectarcpunumber(void) 116127808Snectar{ 117127808Snectar return (unsigned)ID_TO_CPU((apic_base[APIC_ID] & APIC_ID_MASK) >> 24); 118127808Snectar} 11955682Smarkm#else 12055682Smarkm/* 12155682Smarkm * we 'borrow' this info from apic.h 12255682Smarkm * this will go away soon... 123127808Snectar */ 124127808Snectarstatic __inline unsigned 12555682Smarkmcpunumber(void) 126127808Snectar{ 12790926Snectar return (unsigned)(apic_id_to_logical[(apic_base[8] & 0x0f000000) >> 24]); 12872445Sassar} 129127808Snectar#endif /* 0 */ 130127808Snectar 131127808Snectar#endif /* SMP || APIC_IO */ 132127808Snectar#endif /* KERNEL */ 133127808Snectar#endif /* _MACHINE_SMP_H_ */ 13455682Smarkm