smp.h revision 134416
1/*
2 * ----------------------------------------------------------------------------
3 * "THE BEER-WARE LICENSE" (Revision 42):
4 * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
5 * can do whatever you want with this stuff. If we meet some day, and you think
6 * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
7 * ----------------------------------------------------------------------------
8 *
9 * $FreeBSD: head/sys/sys/smp.h 134416 2004-08-28 00:49:55Z obrien $
10 */
11
12#ifndef _SYS_SMP_H_
13#define _SYS_SMP_H_
14
15#ifdef _KERNEL
16
17#ifndef LOCORE
18
19#ifdef SMP
20
21/*
22 * Topology of a NUMA or HTT system.
23 *
24 * The top level topology is an array of pointers to groups.  Each group
25 * contains a bitmask of cpus in its group or subgroups.  It may also
26 * contain a pointer to an array of child groups.
27 *
28 * The bitmasks at non leaf groups may be used by consumers who support
29 * a smaller depth than the hardware provides.
30 *
31 * The topology may be omitted by systems where all CPUs are equal.
32 */
33
34struct cpu_group {
35	cpumask_t cg_mask;		/* Mask of cpus in this group. */
36	int	cg_count;		/* Count of cpus in this group. */
37	int	cg_children;		/* Number of children groups. */
38	struct cpu_group *cg_child;	/* Optional child group. */
39};
40
41struct cpu_top {
42	int	ct_count;		/* Count of groups. */
43	struct cpu_group *ct_group;	/* Array of pointers to cpu groups. */
44};
45
46extern struct cpu_top *smp_topology;
47extern void (*cpustop_restartfunc)(void);
48extern int smp_active;
49extern int smp_cpus;
50extern volatile cpumask_t started_cpus;
51extern volatile cpumask_t stopped_cpus;
52#endif /* SMP */
53
54extern cpumask_t all_cpus;
55extern u_int mp_maxid;
56extern int mp_ncpus;
57extern volatile int smp_started;
58
59/*
60 * Macro allowing us to determine whether a CPU is absent at any given
61 * time, thus permitting us to configure sparse maps of cpuid-dependent
62 * (per-CPU) structures.
63 */
64#define	CPU_ABSENT(x_cpu)	((all_cpus & (1 << (x_cpu))) == 0)
65
66#ifdef SMP
67/*
68 * Machine dependent functions used to initialize MP support.
69 *
70 * The cpu_mp_probe() should check to see if MP support is present and return
71 * zero if it is not or non-zero if it is.  If MP support is present, then
72 * cpu_mp_start() will be called so that MP can be enabled.  This function
73 * should do things such as startup secondary processors.  It should also
74 * setup mp_ncpus, all_cpus, and smp_cpus.  It should also ensure that
75 * smp_active and smp_started are initialized at the appropriate time.
76 * Once cpu_mp_start() returns, machine independent MP startup code will be
77 * executed and a simple message will be output to the console.  Finally,
78 * cpu_mp_announce() will be called so that machine dependent messages about
79 * the MP support may be output to the console if desired.
80 *
81 * The cpu_setmaxid() function is called very early during the boot process
82 * so that the MD code may set mp_maxid to provide an upper bound on CPU IDs
83 * that other subsystems may use.  If a platform is not able to determine
84 * the exact maximum ID that early, then it may set mp_maxid to MAXCPU - 1.
85 */
86struct thread;
87
88void	cpu_mp_announce(void);
89int	cpu_mp_probe(void);
90void	cpu_mp_setmaxid(void);
91void	cpu_mp_start(void);
92
93void	forward_signal(struct thread *);
94void	forward_roundrobin(void);
95int	restart_cpus(cpumask_t);
96int	stop_cpus(cpumask_t);
97void	smp_rendezvous_action(void);
98extern	struct mtx smp_ipi_mtx;
99#endif /* SMP */
100void	smp_rendezvous(void (*)(void *),
101		       void (*)(void *),
102		       void (*)(void *),
103		       void *arg);
104#endif /* !LOCORE */
105#endif /* _KERNEL */
106#endif /* _SYS_SMP_H_ */
107