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