smp.h revision 27285
165832Snyan/*
265832Snyan * ----------------------------------------------------------------------------
365832Snyan * "THE BEER-WARE LICENSE" (Revision 42):
465832Snyan * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
565832Snyan * can do whatever you want with this stuff. If we meet some day, and you think
665832Snyan * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
765832Snyan * ----------------------------------------------------------------------------
865832Snyan *
965832Snyan * $Id: smp.h,v 1.6 1997/07/08 23:29:48 smp Exp smp $
1065832Snyan *
1165832Snyan */
1265832Snyan
1365832Snyan#ifndef _MACHINE_SMP_H_
1465832Snyan#define _MACHINE_SMP_H_
1565832Snyan
1665832Snyan#ifdef KERNEL
1765832Snyan
1865832Snyan#if defined(SMP) && !defined(APIC_IO)
1965832Snyan# error APIC_IO required for SMP, add "options APIC_IO" to your config file.
2065832Snyan#endif /* SMP && !APIC_IO */
2165832Snyan
2265832Snyan#if defined(SMP) && !defined(NCPU)
2365832Snyan# define NCPU			2
2465832Snyan#endif /* SMP && NCPU */
2565832Snyan
2665832Snyan#if defined(SMP) || defined(APIC_IO)
2765832Snyan
2865832Snyan/*
2965832Snyan * For sending values to POST displays.
3065832Snyan * XXX FIXME: where does this really belong, isa.h/isa.c perhaps?
3165832Snyan */
3267158Sphkextern int current_postcode;  /** XXX currently in mp_machdep.c */
3365832Snyan#define POSTCODE(X)	current_postcode = (X), \
3465832Snyan			outb(0x80, current_postcode)
3565832Snyan#define POSTCODE_LO(X)	current_postcode &= 0xf0, \
3665832Snyan			current_postcode |= ((X) & 0x0f), \
3765832Snyan			outb(0x80, current_postcode)
3865832Snyan#define POSTCODE_HI(X)	current_postcode &= 0x0f, \
3965832Snyan			current_postcode |= (((X) << 4) & 0xf0), \
4065832Snyan			outb(0x80, current_postcode)
4165832Snyan
4265832Snyan
4365832Snyan#include <machine/apic.h>
4465832Snyan
4565832Snyan/* global data in mpboot.s */
4665832Snyanextern int			bootMP_size;
4765832Snyan
4865832Snyan/* functions in mpboot.s */
4965832Snyanvoid	bootMP			__P((void));
5065832Snyan
5165832Snyan/* global data in mplock.s */
5265832Snyanextern u_int			mp_lock;
5365832Snyan
5465832Snyan/* functions in mplock.s */
5565832Snyanvoid	get_mplock		__P((void));
5665832Snyanvoid	rel_mplock		__P((void));
5765832Snyanvoid	try_mplock		__P((void));
5865832Snyan
5965832Snyan/* global data in apic_vector.s */
6065832Snyanextern volatile u_int		stopped_cpus;
6165832Snyanextern volatile u_int		started_cpus;
6265832Snyan
6365832Snyan/* global data in mp_machdep.c */
6465832Snyanextern int			mp_ncpus;
6565832Snyanextern int			mp_naps;
6665832Snyanextern int			mp_nbusses;
6765832Snyanextern int			mp_napics;
6865832Snyanextern int			mp_picmode;
6965832Snyanextern int			boot_cpu_id;
7065832Snyanextern vm_offset_t		cpu_apic_address;
7165832Snyanextern vm_offset_t		io_apic_address[];
7265832Snyanextern u_int32_t		cpu_apic_versions[];
7365832Snyanextern u_int32_t		io_apic_versions[];
7465832Snyanextern int			cpu_num_to_apic_id[];
7565832Snyanextern int			io_num_to_apic_id[];
7665832Snyanextern int			apic_id_to_logical[];
7765832Snyanextern u_int			all_cpus;
7865832Snyanextern u_int			SMP_prvpt[];
7965832Snyanextern u_char			SMP_ioapic[];
8065832Snyan
8165832Snyan/* functions in mp_machdep.c */
8265832Snyanu_int	mp_bootaddress		__P((u_int));
8365832Snyanint	mp_probe		__P((void));
8465832Snyanvoid	mp_start		__P((void));
8565832Snyanvoid	mp_announce		__P((void));
8665832Snyanu_int	isa_apic_mask		__P((u_int));
8765832Snyanint	isa_apic_pin		__P((int));
8865832Snyanint	pci_apic_pin		__P((int, int, int));
8965832Snyanint	undirect_isa_irq	__P((int));
9065832Snyanint	undirect_pci_irq	__P((int));
9165832Snyanint	apic_bus_type		__P((int));
9265832Snyanint	apic_src_bus_id		__P((int, int));
9365832Snyanint	apic_src_bus_irq	__P((int, int));
9465832Snyanint	apic_int_type		__P((int, int));
9565832Snyanint	apic_trigger		__P((int, int));
9665832Snyanint	apic_polarity		__P((int, int));
9765832Snyanvoid	bsp_apic_configure	__P((void));
9865832Snyanvoid	init_secondary		__P((void));
9965832Snyanvoid	smp_invltlb		__P((void));
10065832Snyanint	stop_cpus		__P((u_int));
10165832Snyanint	restart_cpus		__P((u_int));
10265832Snyan
10365832Snyan/* global data in mpapic.c */
10465832Snyanextern volatile lapic_t		lapic;
10565832Snyan
10665832Snyan#if defined(MULTIPLE_IOAPICS)
10765832Snyan#error MULTIPLE_IOAPICSXXX
10865832Snyan#else
10965832Snyanextern volatile ioapic_t	*ioapic[];
11065832Snyan#endif /* MULTIPLE_IOAPICS */
11165832Snyan
11265832Snyan/* functions in mpapic.c */
11365832Snyanvoid	apic_initialize		__P((void));
11465832Snyanint	apic_ipi		__P((int, int, int));
11565832Snyanint	selected_apic_ipi	__P((u_int, int, int));
11665832Snyanint	io_apic_setup		__P((int));
11765832Snyanint	ext_int_setup		__P((int, int));
11865832Snyanvoid	write_io_apic_mask24	__P((int, u_int32_t));
11965832Snyan
12065832Snyan#if defined(READY)
12165832Snyanvoid	clr_io_apic_mask24	__P((int, u_int32_t));
12265832Snyanvoid	set_io_apic_mask24	__P((int, u_int32_t));
12365832Snyan#endif /* READY */
12465832Snyan
12565832Snyanvoid	set_apic_timer		__P((int));
12665832Snyanint	read_apic_timer		__P((void));
12765832Snyanvoid	u_sleep			__P((int));
12865832Snyan
12965832Snyan/* global data in init_smp.c */
13065832Snyanextern int			smp_active;
13165832Snyanextern int			invltlb_ok;
13265832Snyan
13365832Snyan/* 'private' global data in locore.s */
13465832Snyanextern volatile u_int		cpuid;
13565832Snyanextern volatile u_int		cpu_lockid;
13665832Snyanextern volatile u_int		other_cpus;
13765832Snyan
13865832Snyan#endif /* SMP || APIC_IO */
13965832Snyan#endif /* KERNEL */
14065832Snyan#endif /* _MACHINE_SMP_H_ */
14165832Snyan