xref: /dragonfly/sys/platform/pc64/include/smp.h (revision a44023cd)
146d4e165SJordan Gordeev /*
2b6871f55SYonghong Yan  * ----------------------------------------------------------------------------
3b6871f55SYonghong Yan  * "THE BEER-WARE LICENSE" (Revision 42):
4b6871f55SYonghong Yan  * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
5b6871f55SYonghong Yan  * can do whatever you want with this stuff. If we meet some day, and you think
6b6871f55SYonghong Yan  * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
7b6871f55SYonghong Yan  * ----------------------------------------------------------------------------
8b6871f55SYonghong Yan  *
946d4e165SJordan Gordeev  * $FreeBSD: src/sys/i386/include/smp.h,v 1.50.2.5 2001/02/13 22:32:45 tegge Exp $
10b6871f55SYonghong Yan  */
11b6871f55SYonghong Yan 
12b6871f55SYonghong Yan #ifndef _MACHINE_SMP_H_
13b6871f55SYonghong Yan #define _MACHINE_SMP_H_
14b6871f55SYonghong Yan 
15b6871f55SYonghong Yan #ifdef _KERNEL
16b6871f55SYonghong Yan 
176e738e4eSSimon Schubert #ifndef LOCORE
186e738e4eSSimon Schubert 
196e738e4eSSimon Schubert /* XXX wrong header */
2020a6d9dbSMatthew Dillon void	initializecpu(int cpu);
216e738e4eSSimon Schubert 
226e738e4eSSimon Schubert #endif	/* LOCORE */
236e738e4eSSimon Schubert 
24b6871f55SYonghong Yan #ifndef LOCORE
25b6871f55SYonghong Yan 
2646d4e165SJordan Gordeev /*
2746d4e165SJordan Gordeev  * For sending values to POST displays.
2846d4e165SJordan Gordeev  * XXX FIXME: where does this really belong, isa.h/isa.c perhaps?
2946d4e165SJordan Gordeev  */
3046d4e165SJordan Gordeev extern int current_postcode;  /** XXX currently in mp_machdep.c */
3146d4e165SJordan Gordeev #define POSTCODE(X)	current_postcode = (X), \
3246d4e165SJordan Gordeev 			outb(0x80, current_postcode)
3346d4e165SJordan Gordeev #define POSTCODE_LO(X)	current_postcode &= 0xf0, \
3446d4e165SJordan Gordeev 			current_postcode |= ((X) & 0x0f), \
3546d4e165SJordan Gordeev 			outb(0x80, current_postcode)
3646d4e165SJordan Gordeev #define POSTCODE_HI(X)	current_postcode &= 0x0f, \
3746d4e165SJordan Gordeev 			current_postcode |= (((X) << 4) & 0xf0), \
3846d4e165SJordan Gordeev 			outb(0x80, current_postcode)
3946d4e165SJordan Gordeev 
4046d4e165SJordan Gordeev 
4146d4e165SJordan Gordeev #include <machine_base/apic/apicreg.h>
42b6871f55SYonghong Yan #include <machine/pcb.h>
43b6871f55SYonghong Yan 
44b6871f55SYonghong Yan /* global symbols in mpboot.S */
45b6871f55SYonghong Yan extern char			mptramp_start[];
46b6871f55SYonghong Yan extern char			mptramp_end[];
47b6871f55SYonghong Yan extern u_int32_t		mptramp_pagetables;
48b6871f55SYonghong Yan 
4946d4e165SJordan Gordeev /* functions in mpboot.s */
5046d4e165SJordan Gordeev void	bootMP			(void);
51b6871f55SYonghong Yan 
5246d4e165SJordan Gordeev /* global data in apic_vector.s */
53da23a592SMatthew Dillon extern volatile cpumask_t	stopped_cpus;
54da23a592SMatthew Dillon extern volatile cpumask_t	started_cpus;
5546d4e165SJordan Gordeev 
5646d4e165SJordan Gordeev extern void (*cpustop_restartfunc) (void);
5746d4e165SJordan Gordeev 
5846d4e165SJordan Gordeev extern struct pcb		stoppcbs[];
59b6871f55SYonghong Yan 
60b6871f55SYonghong Yan /* functions in mp_machdep.c */
61b6871f55SYonghong Yan u_int	mp_bootaddress		(u_int);
6246d4e165SJordan Gordeev void	mp_start		(void);
6346d4e165SJordan Gordeev void	mp_announce		(void);
6446d4e165SJordan Gordeev void	init_secondary		(void);
65da23a592SMatthew Dillon int	stop_cpus		(cpumask_t);
6646d4e165SJordan Gordeev void	ap_init			(void);
67da23a592SMatthew Dillon int	restart_cpus		(cpumask_t);
6846d4e165SJordan Gordeev 
6946d4e165SJordan Gordeev void	cpu_send_ipiq		(int);
7046d4e165SJordan Gordeev int	cpu_send_ipiq_passive	(int);
7146d4e165SJordan Gordeev 
7246d4e165SJordan Gordeev /* global data in init_smp.c */
7346d4e165SJordan Gordeev extern cpumask_t		smp_active_mask;
74b6871f55SYonghong Yan 
75f77c018aSMihai Carabas /* Detect CPU topology bits */
76f77c018aSMihai Carabas void detect_cpu_topology(void);
77f77c018aSMihai Carabas 
780e9325d3SMihai Carabas /* Fix AMD CPU topology related to compute units */
790e9325d3SMihai Carabas int fix_amd_topology(void);
800e9325d3SMihai Carabas 
81f77c018aSMihai Carabas /* Interface functions for IDs calculation */
82f77c018aSMihai Carabas int get_chip_ID(int cpuid);
83*c7f9edd8SMatthew Dillon int get_chip_ID_from_APICID(int apicid);
84f77c018aSMihai Carabas int get_core_number_within_chip(int cpuid);
85f77c018aSMihai Carabas int get_logical_CPU_number_within_core(int cpuid);
86f77c018aSMihai Carabas 
87f77c018aSMihai Carabas #include <machine_base/apic/lapic.h>
88f77c018aSMihai Carabas static __inline
get_apicid_from_cpuid(int cpuid)89f77c018aSMihai Carabas int get_apicid_from_cpuid(int cpuid) {
90f77c018aSMihai Carabas 	return CPUID_TO_APICID(cpuid);
91f77c018aSMihai Carabas }
92f77c018aSMihai Carabas static __inline
get_cpuid_from_apicid(int apicid)93f77c018aSMihai Carabas int get_cpuid_from_apicid(int apicid) {
94f77c018aSMihai Carabas 	return APICID_TO_CPUID(apicid);
95f77c018aSMihai Carabas }
96f77c018aSMihai Carabas 
97b6871f55SYonghong Yan #endif /* !LOCORE */
98b6871f55SYonghong Yan 
99b6871f55SYonghong Yan #endif /* _KERNEL */
100b6871f55SYonghong Yan #endif /* _MACHINE_SMP_H_ */
101