xref: /freebsd/sys/i386/include/smp.h (revision 08942d46056ad4038f22c271c33bce8fb6dfb65d)
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  *
908942d46SSteve Passe  * $Id: smp.h,v 1.9 1997/05/28 18:44:11 fsmp 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 
18f258030fSSteve Passe #if defined(SMP) && !defined(APIC_IO)
19f258030fSSteve Passe # error APIC_IO required for SMP, add "options APIC_IO" to your config file.
20f258030fSSteve Passe #endif /* SMP && NCPU */
21f258030fSSteve Passe 
22477a642cSPeter Wemm #if defined(SMP) && !defined(NCPU)
23477a642cSPeter Wemm # define NCPU			2
24477a642cSPeter Wemm #endif /* SMP && NCPU */
25477a642cSPeter Wemm 
26477a642cSPeter Wemm #if defined(SMP) || defined(APIC_IO)
27477a642cSPeter Wemm 
2808942d46SSteve Passe #include <machine/apic.h>
2908942d46SSteve Passe 
30477a642cSPeter Wemm /* global data in mpboot.s */
31477a642cSPeter Wemm extern int			bootMP_size;
32477a642cSPeter Wemm 
33477a642cSPeter Wemm /* functions in mpboot.s */
34477a642cSPeter Wemm void	bootMP			__P((void));
35477a642cSPeter Wemm 
36477a642cSPeter Wemm /* global data in mplock.s */
37477a642cSPeter Wemm extern u_int			mp_lock;
38477a642cSPeter Wemm 
39477a642cSPeter Wemm /* functions in mplock.s */
40477a642cSPeter Wemm void	get_mplock		__P((void));
41477a642cSPeter Wemm void	rel_mplock		__P((void));
42dff5c18aSSteve Passe void	try_mplock		__P((void));
43477a642cSPeter Wemm 
44477a642cSPeter Wemm /* global data in mp_machdep.c */
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));
62b8d67ee0SSteve Passe int	mp_probe		__P((void));
63477a642cSPeter Wemm void	mp_start		__P((void));
64477a642cSPeter Wemm void	mp_announce		__P((void));
65477a642cSPeter Wemm int	get_isa_apic_irq	__P((int));
662479ac60SSteve Passe u_int	get_isa_apic_mask	__P((u_int));
672479ac60SSteve Passe int	undirect_isa_irq	__P((int));
68477a642cSPeter Wemm int	get_eisa_apic_irq	__P((int));
69477a642cSPeter Wemm int	get_pci_apic_irq	__P((int, int, int));
70477a642cSPeter Wemm int	undirect_pci_irq	__P((int));
71477a642cSPeter Wemm int	apic_bus_type		__P((int));
72477a642cSPeter Wemm int	apic_src_bus_id		__P((int, int));
73477a642cSPeter Wemm int	apic_src_bus_irq	__P((int, int));
74477a642cSPeter Wemm int	apic_int_type		__P((int, int));
75477a642cSPeter Wemm int	apic_trigger		__P((int, int));
76477a642cSPeter Wemm int	apic_polarity		__P((int, int));
77477a642cSPeter Wemm void	configure_local_apic	__P((void));
78477a642cSPeter Wemm void	init_secondary		__P((void));
79477a642cSPeter Wemm void	smp_invltlb		__P((void));
80477a642cSPeter Wemm 
81477a642cSPeter Wemm /* global data in mpapic.c */
82477a642cSPeter Wemm extern volatile u_int*		apic_base;
8308942d46SSteve Passe #if 1  /** XXX APIC_STRUCT */
8408942d46SSteve Passe extern volatile lapic_t*	lapic;
8508942d46SSteve Passe #endif  /** XXX APIC_STRUCT */
86477a642cSPeter Wemm 
87477a642cSPeter Wemm #if defined(MULTIPLE_IOAPICS)
88477a642cSPeter Wemm #error MULTIPLE_IOAPICSXXX
89477a642cSPeter Wemm #else
90477a642cSPeter Wemm extern volatile u_int*		io_apic_base;
9108942d46SSteve Passe #if 1  /** XXX APIC_STRUCT */
9208942d46SSteve Passe extern volatile ioapic_t*	ioapic;
9308942d46SSteve Passe #endif  /** XXX APIC_STRUCT */
94477a642cSPeter Wemm #endif /* MULTIPLE_IOAPICS */
95477a642cSPeter Wemm 
96477a642cSPeter Wemm /* functions in mpapic.c */
97477a642cSPeter Wemm void	apic_initialize		__P((int));
98a1b71271SSteve Passe int	apic_ipi		__P((int, int, int));
99477a642cSPeter Wemm int	selected_apic_ipi	__P((u_int, int, int));
100477a642cSPeter Wemm int	io_apic_setup		__P((int));
101477a642cSPeter Wemm int	ext_int_setup		__P((int, int));
102477a642cSPeter Wemm void	write_io_apic_mask24	__P((int, u_int32_t));
103477a642cSPeter Wemm 
104477a642cSPeter Wemm #if defined(READY)
105477a642cSPeter Wemm void	clr_io_apic_mask24	__P((int, u_int32_t));
106477a642cSPeter Wemm void	set_io_apic_mask24	__P((int, u_int32_t));
107477a642cSPeter Wemm #endif /* READY */
108477a642cSPeter Wemm 
109477a642cSPeter Wemm void	set_apic_timer		__P((int));
110477a642cSPeter Wemm int	read_apic_timer		__P((void));
111477a642cSPeter Wemm void	u_sleep			__P((int));
112477a642cSPeter Wemm 
113477a642cSPeter Wemm /* global data in init_smp.c */
114477a642cSPeter Wemm extern int			smp_active;
1152c5d02ffSSteve Passe extern int			invltlb_ok;
116477a642cSPeter Wemm 
117477a642cSPeter Wemm /* in pmap.c FIXME: belongs in pmap.h??? */
118477a642cSPeter Wemm void	pmap_bootstrap_apics	__P((void));
119477a642cSPeter Wemm void	pmap_bootstrap2		__P((void));
120477a642cSPeter Wemm 
121477a642cSPeter Wemm #if 0
122477a642cSPeter Wemm /* chicken and egg problem... */
123477a642cSPeter Wemm static __inline unsigned
124477a642cSPeter Wemm cpunumber(void)
125477a642cSPeter Wemm {
126477a642cSPeter Wemm 	return (unsigned)ID_TO_CPU((apic_base[APIC_ID] & APIC_ID_MASK) >> 24);
127477a642cSPeter Wemm }
128477a642cSPeter Wemm #else
129477a642cSPeter Wemm /*
130477a642cSPeter Wemm  * we 'borrow' this info from apic.h
131477a642cSPeter Wemm  * this will go away soon...
132477a642cSPeter Wemm  */
133477a642cSPeter Wemm static __inline unsigned
134477a642cSPeter Wemm cpunumber(void)
135477a642cSPeter Wemm {
13608942d46SSteve Passe #if 0
137477a642cSPeter Wemm 	return (unsigned)(apic_id_to_logical[(apic_base[8] & 0x0f000000) >> 24]);
13808942d46SSteve Passe #else
13908942d46SSteve Passe 	return (unsigned)(apic_id_to_logical[(lapic__id & 0x0f000000) >> 24]);
14008942d46SSteve Passe #endif
141477a642cSPeter Wemm }
142477a642cSPeter Wemm #endif /* 0 */
143477a642cSPeter Wemm 
144477a642cSPeter Wemm #endif /* SMP || APIC_IO */
145477a642cSPeter Wemm #endif /* KERNEL */
146477a642cSPeter Wemm #endif /* _MACHINE_SMP_H_ */
147