smp.h revision 25164
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.29 1997/04/26 08:11:50 peter Exp $
10 *
11 */
12
13#ifndef _MACHINE_SMP_H_
14#define _MACHINE_SMP_H_
15
16#ifdef KERNEL
17
18#include "opt_smp.h"
19#include "opt_smp_invltlb.h"	/* aiee! (for cpufunc.h!) */
20
21#if defined(SMP) && !defined(NCPU)
22# define NCPU			2
23#endif /* SMP && NCPU */
24
25#if defined(SMP) || defined(APIC_IO)
26
27/* global data in mpboot.s */
28extern int			bootMP_size;
29
30/* functions in mpboot.s */
31void	bootMP			__P((void));
32
33/* global data in mplock.s */
34extern u_int			mp_lock;
35
36/* functions in mplock.s */
37void	get_mplock		__P((void));
38void	rel_mplock		__P((void));
39void	expect_mplock		__P((void));
40
41/* global data in mp_machdep.c */
42extern struct proc*		SMPcurproc[NCPU];
43extern struct pcb*		SMPcurpcb[NCPU];
44extern struct timeval		SMPruntime[NCPU];
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[];
59
60/* functions in mp_machdep.c */
61u_int	mp_bootaddress		__P((u_int));
62void	mp_start		__P((void));
63void	mp_announce		__P((void));
64int	get_isa_apic_irq	__P((int));
65int	get_eisa_apic_irq	__P((int));
66int	get_pci_apic_irq	__P((int, int, int));
67int	undirect_pci_irq	__P((int));
68int	apic_bus_type		__P((int));
69int	apic_src_bus_id		__P((int, int));
70int	apic_src_bus_irq	__P((int, int));
71int	apic_int_type		__P((int, int));
72int	apic_trigger		__P((int, int));
73int	apic_polarity		__P((int, int));
74void	configure_local_apic	__P((void));
75void	init_secondary		__P((void));
76#ifdef SMP_INVLTLB
77void	ipi_invltlb		__P((void));
78void	smp_invltlb		__P((void));
79#endif
80
81/* global data in mpapic.c */
82extern volatile u_int*		apic_base;
83
84#if defined(MULTIPLE_IOAPICS)
85#error MULTIPLE_IOAPICSXXX
86#else
87extern volatile u_int*		io_apic_base;
88#endif /* MULTIPLE_IOAPICS */
89
90/* functions in mpapic.c */
91void	apic_initialize		__P((int));
92int	selected_apic_ipi	__P((u_int, int, int));
93int	io_apic_setup		__P((int));
94int	ext_int_setup		__P((int, int));
95void	write_io_apic_mask24	__P((int, u_int32_t));
96
97#if defined(READY)
98void	clr_io_apic_mask24	__P((int, u_int32_t));
99void	set_io_apic_mask24	__P((int, u_int32_t));
100#endif /* READY */
101
102void	set_apic_timer		__P((int));
103int	read_apic_timer		__P((void));
104void	u_sleep			__P((int));
105
106/* global data in init_smp.c */
107extern int			smp_active;
108extern int			invldebug;
109
110/* in pmap.c FIXME: belongs in pmap.h??? */
111void	pmap_bootstrap_apics	__P((void));
112void	pmap_bootstrap2		__P((void));
113
114#if 0
115/* chicken and egg problem... */
116static __inline unsigned
117cpunumber(void)
118{
119	return (unsigned)ID_TO_CPU((apic_base[APIC_ID] & APIC_ID_MASK) >> 24);
120}
121#else
122/*
123 * we 'borrow' this info from apic.h
124 * this will go away soon...
125 */
126static __inline unsigned
127cpunumber(void)
128{
129	return (unsigned)(apic_id_to_logical[(apic_base[8] & 0x0f000000) >> 24]);
130}
131#endif /* 0 */
132
133#endif /* SMP || APIC_IO */
134#endif /* KERNEL */
135#endif /* _MACHINE_SMP_H_ */
136