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