xref: /freebsd/sys/amd64/include/smp.h (revision 477a642cee98950f11ce12c94468b0156991a8eb)
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  *
9477a642cSPeter Wemm  * $Id: smp.h,v 1.29 1997/04/26 08:11:50 peter 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 
18477a642cSPeter Wemm #include "opt_smp.h"
19477a642cSPeter Wemm #include "opt_smp_invltlb.h"	/* aiee! (for cpufunc.h!) */
20477a642cSPeter Wemm 
21477a642cSPeter Wemm #if defined(SMP) && !defined(NCPU)
22477a642cSPeter Wemm # define NCPU			2
23477a642cSPeter Wemm #endif /* SMP && NCPU */
24477a642cSPeter Wemm 
25477a642cSPeter Wemm #if defined(SMP) || defined(APIC_IO)
26477a642cSPeter Wemm 
27477a642cSPeter Wemm /* global data in mpboot.s */
28477a642cSPeter Wemm extern int			bootMP_size;
29477a642cSPeter Wemm 
30477a642cSPeter Wemm /* functions in mpboot.s */
31477a642cSPeter Wemm void	bootMP			__P((void));
32477a642cSPeter Wemm 
33477a642cSPeter Wemm /* global data in mplock.s */
34477a642cSPeter Wemm extern u_int			mp_lock;
35477a642cSPeter Wemm 
36477a642cSPeter Wemm /* functions in mplock.s */
37477a642cSPeter Wemm void	get_mplock		__P((void));
38477a642cSPeter Wemm void	rel_mplock		__P((void));
39477a642cSPeter Wemm void	expect_mplock		__P((void));
40477a642cSPeter Wemm 
41477a642cSPeter Wemm /* global data in mp_machdep.c */
42477a642cSPeter Wemm extern struct proc*		SMPcurproc[NCPU];
43477a642cSPeter Wemm extern struct pcb*		SMPcurpcb[NCPU];
44477a642cSPeter Wemm extern struct timeval		SMPruntime[NCPU];
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));
62477a642cSPeter Wemm void	mp_start		__P((void));
63477a642cSPeter Wemm void	mp_announce		__P((void));
64477a642cSPeter Wemm int	get_isa_apic_irq	__P((int));
65477a642cSPeter Wemm int	get_eisa_apic_irq	__P((int));
66477a642cSPeter Wemm int	get_pci_apic_irq	__P((int, int, int));
67477a642cSPeter Wemm int	undirect_pci_irq	__P((int));
68477a642cSPeter Wemm int	apic_bus_type		__P((int));
69477a642cSPeter Wemm int	apic_src_bus_id		__P((int, int));
70477a642cSPeter Wemm int	apic_src_bus_irq	__P((int, int));
71477a642cSPeter Wemm int	apic_int_type		__P((int, int));
72477a642cSPeter Wemm int	apic_trigger		__P((int, int));
73477a642cSPeter Wemm int	apic_polarity		__P((int, int));
74477a642cSPeter Wemm void	configure_local_apic	__P((void));
75477a642cSPeter Wemm void	init_secondary		__P((void));
76477a642cSPeter Wemm #ifdef SMP_INVLTLB
77477a642cSPeter Wemm void	ipi_invltlb		__P((void));
78477a642cSPeter Wemm void	smp_invltlb		__P((void));
79477a642cSPeter Wemm #endif
80477a642cSPeter Wemm 
81477a642cSPeter Wemm /* global data in mpapic.c */
82477a642cSPeter Wemm extern volatile u_int*		apic_base;
83477a642cSPeter Wemm 
84477a642cSPeter Wemm #if defined(MULTIPLE_IOAPICS)
85477a642cSPeter Wemm #error MULTIPLE_IOAPICSXXX
86477a642cSPeter Wemm #else
87477a642cSPeter Wemm extern volatile u_int*		io_apic_base;
88477a642cSPeter Wemm #endif /* MULTIPLE_IOAPICS */
89477a642cSPeter Wemm 
90477a642cSPeter Wemm /* functions in mpapic.c */
91477a642cSPeter Wemm void	apic_initialize		__P((int));
92477a642cSPeter Wemm int	selected_apic_ipi	__P((u_int, int, int));
93477a642cSPeter Wemm int	io_apic_setup		__P((int));
94477a642cSPeter Wemm int	ext_int_setup		__P((int, int));
95477a642cSPeter Wemm void	write_io_apic_mask24	__P((int, u_int32_t));
96477a642cSPeter Wemm 
97477a642cSPeter Wemm #if defined(READY)
98477a642cSPeter Wemm void	clr_io_apic_mask24	__P((int, u_int32_t));
99477a642cSPeter Wemm void	set_io_apic_mask24	__P((int, u_int32_t));
100477a642cSPeter Wemm #endif /* READY */
101477a642cSPeter Wemm 
102477a642cSPeter Wemm void	set_apic_timer		__P((int));
103477a642cSPeter Wemm int	read_apic_timer		__P((void));
104477a642cSPeter Wemm void	u_sleep			__P((int));
105477a642cSPeter Wemm 
106477a642cSPeter Wemm /* global data in init_smp.c */
107477a642cSPeter Wemm extern int			smp_active;
108477a642cSPeter Wemm extern int			invldebug;
109477a642cSPeter Wemm 
110477a642cSPeter Wemm /* in pmap.c FIXME: belongs in pmap.h??? */
111477a642cSPeter Wemm void	pmap_bootstrap_apics	__P((void));
112477a642cSPeter Wemm void	pmap_bootstrap2		__P((void));
113477a642cSPeter Wemm 
114477a642cSPeter Wemm #if 0
115477a642cSPeter Wemm /* chicken and egg problem... */
116477a642cSPeter Wemm static __inline unsigned
117477a642cSPeter Wemm cpunumber(void)
118477a642cSPeter Wemm {
119477a642cSPeter Wemm 	return (unsigned)ID_TO_CPU((apic_base[APIC_ID] & APIC_ID_MASK) >> 24);
120477a642cSPeter Wemm }
121477a642cSPeter Wemm #else
122477a642cSPeter Wemm /*
123477a642cSPeter Wemm  * we 'borrow' this info from apic.h
124477a642cSPeter Wemm  * this will go away soon...
125477a642cSPeter Wemm  */
126477a642cSPeter Wemm static __inline unsigned
127477a642cSPeter Wemm cpunumber(void)
128477a642cSPeter Wemm {
129477a642cSPeter Wemm 	return (unsigned)(apic_id_to_logical[(apic_base[8] & 0x0f000000) >> 24]);
130477a642cSPeter Wemm }
131477a642cSPeter Wemm #endif /* 0 */
132477a642cSPeter Wemm 
133477a642cSPeter Wemm #endif /* SMP || APIC_IO */
134477a642cSPeter Wemm #endif /* KERNEL */
135477a642cSPeter Wemm #endif /* _MACHINE_SMP_H_ */
136