smp.h revision 99862
125164Speter/*
225164Speter * ----------------------------------------------------------------------------
325164Speter * "THE BEER-WARE LICENSE" (Revision 42):
425164Speter * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
525164Speter * can do whatever you want with this stuff. If we meet some day, and you think
625164Speter * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
725164Speter * ----------------------------------------------------------------------------
825164Speter *
950477Speter * $FreeBSD: head/sys/i386/include/smp.h 99862 2002-07-12 07:56:11Z peter $
1025164Speter *
1125164Speter */
1225164Speter
1325164Speter#ifndef _MACHINE_SMP_H_
1425164Speter#define _MACHINE_SMP_H_
1525164Speter
1655205Speter#ifdef _KERNEL
1725164Speter
1865932Sphk#if defined(SMP) && defined(I386_CPU) && !defined(COMPILING_LINT)
1965557Sjasone#error SMP not supported with I386_CPU
2065557Sjasone#endif
2125517Sfsmp#if defined(SMP) && !defined(APIC_IO)
2225517Sfsmp# error APIC_IO required for SMP, add "options APIC_IO" to your config file.
2327002Sfsmp#endif /* SMP && !APIC_IO */
2425517Sfsmp
2525164Speter#if defined(SMP) || defined(APIC_IO)
2625164Speter
2727728Sfsmp#ifndef LOCORE
2827728Sfsmp
2927002Sfsmp/*
3027002Sfsmp * For sending values to POST displays.
3127252Sfsmp * XXX FIXME: where does this really belong, isa.h/isa.c perhaps?
3227002Sfsmp */
3327252Sfsmpextern int current_postcode;  /** XXX currently in mp_machdep.c */
3427252Sfsmp#define POSTCODE(X)	current_postcode = (X), \
3527252Sfsmp			outb(0x80, current_postcode)
3627252Sfsmp#define POSTCODE_LO(X)	current_postcode &= 0xf0, \
3727252Sfsmp			current_postcode |= ((X) & 0x0f), \
3827252Sfsmp			outb(0x80, current_postcode)
3927252Sfsmp#define POSTCODE_HI(X)	current_postcode &= 0x0f, \
4027252Sfsmp			current_postcode |= (((X) << 4) & 0xf0), \
4127252Sfsmp			outb(0x80, current_postcode)
4227002Sfsmp
4327252Sfsmp
4476078Sjhb#include <sys/bus.h>	/* XXX */
4526269Sfsmp#include <machine/apic.h>
4676078Sjhb#include <machine/frame.h>
4776078Sjhb#include <i386/isa/icu.h>
4876078Sjhb#include <i386/isa/intr_machdep.h>
4926269Sfsmp
5076078Sjhb/*
5176078Sjhb * Interprocessor interrupts for SMP.
5276078Sjhb */
5376078Sjhb#define	IPI_INVLTLB		XINVLTLB_OFFSET
5499862Speter#define	IPI_INVLPG		XINVLPG_OFFSET
5599862Speter#define	IPI_INVLRNG		XINVLRNG_OFFSET
5676078Sjhb#define	IPI_RENDEZVOUS		XRENDEZVOUS_OFFSET
5776078Sjhb#define	IPI_AST			XCPUAST_OFFSET
5876078Sjhb#define	IPI_STOP		XCPUSTOP_OFFSET
5976078Sjhb#define	IPI_HARDCLOCK		XHARDCLOCK_OFFSET
6076078Sjhb#define	IPI_STATCLOCK		XSTATCLOCK_OFFSET
6176078Sjhb
6225164Speter/* global data in mpboot.s */
6325164Speterextern int			bootMP_size;
6425164Speter
6525164Speter/* functions in mpboot.s */
6693018Sbdevoid	bootMP(void);
6725164Speter
6825164Speter/* global data in mp_machdep.c */
6928669Sfsmpextern int			bsp_apic_ready;
7025164Speterextern int			mp_naps;
7125164Speterextern int			mp_nbusses;
7225164Speterextern int			mp_napics;
7325164Speterextern int			mp_picmode;
7425164Speterextern int			boot_cpu_id;
7525164Speterextern vm_offset_t		cpu_apic_address;
7625164Speterextern vm_offset_t		io_apic_address[];
7725164Speterextern u_int32_t		cpu_apic_versions[];
7866277Spsextern u_int32_t		*io_apic_versions;
7925164Speterextern int			cpu_num_to_apic_id[];
8025164Speterextern int			io_num_to_apic_id[];
8125164Speterextern int			apic_id_to_logical[];
8269578Speter#define APIC_INTMAPSIZE 32
8338888Steggestruct apic_intmapinfo {
8438888Stegge  	int ioapic;
8538888Stegge	int int_pin;
8638888Stegge	volatile void *apic_address;
8738888Stegge	int redirindex;
8838888Stegge};
8938888Steggeextern struct apic_intmapinfo	int_to_apicintpin[];
9036135Steggeextern struct pcb		stoppcbs[];
9125164Speter
9225164Speter/* functions in mp_machdep.c */
9393018Sbdevoid	i386_mp_probe(void);
9493018Sbdeu_int	mp_bootaddress(u_int);
9593018Sbdeu_int	isa_apic_mask(u_int);
9693018Sbdeint	isa_apic_irq(int);
9793018Sbdeint	pci_apic_irq(int, int, int);
9893018Sbdeint	apic_irq(int, int);
9993018Sbdeint	next_apic_irq(int);
10093018Sbdeint	undirect_isa_irq(int);
10193018Sbdeint	undirect_pci_irq(int);
10293018Sbdeint	apic_bus_type(int);
10393018Sbdeint	apic_src_bus_id(int, int);
10493018Sbdeint	apic_src_bus_irq(int, int);
10593018Sbdeint	apic_int_type(int, int);
10693018Sbdeint	apic_trigger(int, int);
10793018Sbdeint	apic_polarity(int, int);
10893018Sbdevoid	assign_apic_irq(int apic, int intpin, int irq);
10993018Sbdevoid	revoke_apic_irq(int irq);
11093018Sbdevoid	bsp_apic_configure(void);
11193018Sbdevoid	init_secondary(void);
11293018Sbdevoid	forward_statclock(void);
11393018Sbdevoid	forwarded_statclock(struct trapframe frame);
11493018Sbdevoid	forward_hardclock(void);
11593018Sbdevoid	forwarded_hardclock(struct trapframe frame);
11693018Sbdevoid	ipi_selected(u_int cpus, u_int ipi);
11793018Sbdevoid	ipi_all(u_int ipi);
11893018Sbdevoid	ipi_all_but_self(u_int ipi);
11993018Sbdevoid	ipi_self(u_int ipi);
12034021Stegge#ifdef	APIC_INTR_REORDER
12193018Sbdevoid	set_lapic_isrloc(int, int);
12234021Stegge#endif /* APIC_INTR_REORDER */
12399862Spetervoid	smp_invlpg(vm_offset_t addr);
12499862Spetervoid	smp_masked_invlpg(u_int mask, vm_offset_t addr);
12599862Spetervoid	smp_invlpg_range(vm_offset_t startva, vm_offset_t endva);
12699862Spetervoid	smp_masked_invlpg_range(u_int mask, vm_offset_t startva,
12799862Speter	    vm_offset_t endva);
12899862Spetervoid	smp_invltlb(void);
12999862Spetervoid	smp_masked_invltlb(u_int mask);
13025164Speter
13125164Speter/* global data in mpapic.c */
13226812Speterextern volatile lapic_t		lapic;
13366277Spsextern volatile ioapic_t	**ioapic;
13425164Speter
13525164Speter/* functions in mpapic.c */
13693018Sbdevoid	apic_dump(char*);
13793018Sbdevoid	apic_initialize(void);
13893018Sbdevoid	imen_dump(void);
13993018Sbdeint	apic_ipi(int, int, int);
14093018Sbdeint	selected_apic_ipi(u_int, int, int);
14193018Sbdeint	io_apic_setup(int);
14293018Sbdevoid	io_apic_setup_intpin(int, int);
14393018Sbdevoid	io_apic_set_id(int, int);
14493018Sbdeint	io_apic_get_id(int);
14593018Sbdeint	ext_int_setup(int, int);
14625164Speter
14793018Sbdevoid	set_apic_timer(int);
14893018Sbdeint	read_apic_timer(void);
14993018Sbdevoid	u_sleep(int);
15093018Sbdeu_int	io_apic_read(int, int);
15193018Sbdevoid	io_apic_write(int, int, u_int);
15225164Speter
15327728Sfsmp#endif /* !LOCORE */
15465557Sjasone#endif /* SMP && !APIC_IO */
15558755Sdillon
15655205Speter#endif /* _KERNEL */
15725164Speter#endif /* _MACHINE_SMP_H_ */
158