smp.h revision 26812
1/*
2 * ----------------------------------------------------------------------------
3 * "THE BEER-WARE LICENSE" (Revision 42):
4 * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
5 * can do whatever you want with this stuff. If we meet some day, and you think
6 * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
7 * ----------------------------------------------------------------------------
8 *
9 * $Id: smp.h,v 1.10 1997/05/29 05:57:43 fsmp Exp $
10 *
11 */
12
13#ifndef _MACHINE_SMP_H_
14#define _MACHINE_SMP_H_
15
16#ifdef KERNEL
17
18#if defined(SMP) && !defined(APIC_IO)
19# error APIC_IO required for SMP, add "options APIC_IO" to your config file.
20#endif /* SMP && NCPU */
21
22#if defined(SMP) && !defined(NCPU)
23# define NCPU			2
24#endif /* SMP && NCPU */
25
26#if defined(SMP) || defined(APIC_IO)
27
28#include <machine/apic.h>
29
30/* global data in mpboot.s */
31extern int			bootMP_size;
32
33/* functions in mpboot.s */
34void	bootMP			__P((void));
35
36/* global data in mplock.s */
37extern u_int			mp_lock;
38
39/* functions in mplock.s */
40void	get_mplock		__P((void));
41void	rel_mplock		__P((void));
42void	try_mplock		__P((void));
43
44/* global data in mp_machdep.c */
45extern int			mp_ncpus;
46extern int			mp_naps;
47extern int			mp_nbusses;
48extern int			mp_napics;
49extern int			mp_picmode;
50extern int			mpenabled;
51extern int			boot_cpu_id;
52extern vm_offset_t		cpu_apic_address;
53extern vm_offset_t		io_apic_address[];
54extern u_int32_t		cpu_apic_versions[];
55extern u_int32_t		io_apic_versions[];
56extern int			cpu_num_to_apic_id[];
57extern int			io_num_to_apic_id[];
58extern int			apic_id_to_logical[];
59extern u_int			SMP_prvpt[];
60extern u_char			SMP_ioapic[];
61
62/* functions in mp_machdep.c */
63u_int	mp_bootaddress		__P((u_int));
64int	mp_probe		__P((void));
65void	mp_start		__P((void));
66void	mp_announce		__P((void));
67int	get_isa_apic_irq	__P((int));
68u_int	get_isa_apic_mask	__P((u_int));
69int	undirect_isa_irq	__P((int));
70int	get_eisa_apic_irq	__P((int));
71int	get_pci_apic_irq	__P((int, int, int));
72int	undirect_pci_irq	__P((int));
73int	apic_bus_type		__P((int));
74int	apic_src_bus_id		__P((int, int));
75int	apic_src_bus_irq	__P((int, int));
76int	apic_int_type		__P((int, int));
77int	apic_trigger		__P((int, int));
78int	apic_polarity		__P((int, int));
79void	configure_local_apic	__P((void));
80void	init_secondary		__P((void));
81void	smp_invltlb		__P((void));
82
83/* global data in mpapic.c */
84extern volatile lapic_t		lapic;
85
86#if defined(MULTIPLE_IOAPICS)
87#error MULTIPLE_IOAPICSXXX
88#else
89extern volatile ioapic_t	*ioapic[];
90#endif /* MULTIPLE_IOAPICS */
91
92/* functions in mpapic.c */
93void	apic_initialize		__P((int));
94int	apic_ipi		__P((int, int, int));
95int	selected_apic_ipi	__P((u_int, int, int));
96int	io_apic_setup		__P((int));
97int	ext_int_setup		__P((int, int));
98void	write_io_apic_mask24	__P((int, u_int32_t));
99
100#if defined(READY)
101void	clr_io_apic_mask24	__P((int, u_int32_t));
102void	set_io_apic_mask24	__P((int, u_int32_t));
103#endif /* READY */
104
105void	set_apic_timer		__P((int));
106int	read_apic_timer		__P((void));
107void	u_sleep			__P((int));
108
109/* global data in init_smp.c */
110extern int			smp_active;
111extern int			invltlb_ok;
112
113extern volatile u_int		cpuid;
114extern volatile u_int		cpu_lockid;
115
116#endif /* SMP || APIC_IO */
117#endif /* KERNEL */
118#endif /* _MACHINE_SMP_H_ */
119