smp.h 3.1 KB
Newer Older
G
Glauber Costa 已提交
1 2 3
#ifndef _ASM_X86_SMP_H_
#define _ASM_X86_SMP_H_
#ifndef __ASSEMBLY__
4
#include <linux/cpumask.h>
5
#include <linux/init.h>
6
#include <asm/percpu.h>
7 8 9 10 11

extern cpumask_t cpu_callout_map;

extern int smp_num_siblings;
extern unsigned int num_processors;
G
Glauber Costa 已提交
12

13 14 15 16 17 18 19 20 21 22 23
extern u16 x86_cpu_to_apicid_init[];
extern u16 x86_bios_cpu_apicid_init[];
extern void *x86_cpu_to_apicid_early_ptr;
extern void *x86_bios_cpu_apicid_early_ptr;

DECLARE_PER_CPU(cpumask_t, cpu_sibling_map);
DECLARE_PER_CPU(cpumask_t, cpu_core_map);
DECLARE_PER_CPU(u16, cpu_llc_id);
DECLARE_PER_CPU(u16, x86_cpu_to_apicid);
DECLARE_PER_CPU(u16, x86_bios_cpu_apicid);

24 25 26 27 28
/*
 * Trampoline 80x86 program as an array.
 */
extern const unsigned char trampoline_data [];
extern const unsigned char trampoline_end  [];
G
Glauber Costa 已提交
29
extern unsigned char *trampoline_base;
30

31 32 33 34 35 36 37
/* Static state in head.S used to set up a CPU */
extern struct {
	void *sp;
	unsigned short ss;
} stack_start;


38 39 40 41 42 43 44 45 46 47 48 49 50
struct smp_ops {
	void (*smp_prepare_boot_cpu)(void);
	void (*smp_prepare_cpus)(unsigned max_cpus);
	int (*cpu_up)(unsigned cpu);
	void (*smp_cpus_done)(unsigned max_cpus);

	void (*smp_send_stop)(void);
	void (*smp_send_reschedule)(int cpu);
	int (*smp_call_function_mask)(cpumask_t mask,
				      void (*func)(void *info), void *info,
				      int wait);
};

51 52 53
/* Globals due to paravirt */
extern void set_cpu_sibling_map(int cpu);

54
#ifdef CONFIG_SMP
55 56 57
#ifndef CONFIG_PARAVIRT
#define startup_ipi_hook(phys_apicid, start_eip, start_esp) do { } while (0)
#endif
58
extern struct smp_ops smp_ops;
G
Glauber Costa 已提交
59

G
Glauber Costa 已提交
60 61 62 63 64
static inline void smp_send_stop(void)
{
	smp_ops.smp_send_stop();
}

G
Glauber Costa 已提交
65 66 67 68 69
static inline void smp_prepare_boot_cpu(void)
{
	smp_ops.smp_prepare_boot_cpu();
}

G
Glauber Costa 已提交
70 71 72 73 74
static inline void smp_prepare_cpus(unsigned int max_cpus)
{
	smp_ops.smp_prepare_cpus(max_cpus);
}

G
Glauber Costa 已提交
75 76 77 78 79
static inline void smp_cpus_done(unsigned int max_cpus)
{
	smp_ops.smp_cpus_done(max_cpus);
}

G
Glauber Costa 已提交
80 81 82 83 84
static inline int __cpu_up(unsigned int cpu)
{
	return smp_ops.cpu_up(cpu);
}

G
Glauber Costa 已提交
85 86 87 88
static inline void smp_send_reschedule(int cpu)
{
	smp_ops.smp_send_reschedule(cpu);
}
89 90 91 92 93 94 95

static inline int smp_call_function_mask(cpumask_t mask,
					 void (*func) (void *info), void *info,
					 int wait)
{
	return smp_ops.smp_call_function_mask(mask, func, info, wait);
}
G
Glauber Costa 已提交
96

G
Glauber Costa 已提交
97
void native_smp_prepare_boot_cpu(void);
G
Glauber Costa 已提交
98
void native_smp_prepare_cpus(unsigned int max_cpus);
G
Glauber Costa 已提交
99
void native_smp_cpus_done(unsigned int max_cpus);
G
Glauber Costa 已提交
100
int native_cpu_up(unsigned int cpunum);
101

102 103 104
extern int __cpu_disable(void);
extern void __cpu_die(unsigned int cpu);

105
extern unsigned disabled_cpus;
106
extern void prefill_possible_map(void);
G
Glauber Costa 已提交
107 108 109

#define SMP_TRAMPOLINE_BASE 0x6000
extern unsigned long setup_trampoline(void);
110 111

void smp_store_cpu_info(int id);
112 113 114
#define cpu_physical_id(cpu)	per_cpu(x86_cpu_to_apicid, cpu)
#else
#define cpu_physical_id(cpu)		boot_cpu_physical_apicid
115
#endif
116

117 118 119 120 121
#ifdef CONFIG_X86_32
# include "smp_32.h"
#else
# include "smp_64.h"
#endif
G
Glauber Costa 已提交
122

123 124 125 126 127 128
#ifdef CONFIG_HOTPLUG_CPU
extern void cpu_exit_clear(void);
extern void cpu_uninit(void);
extern void remove_siblinginfo(int cpu);
#endif

129 130 131
extern void smp_alloc_memory(void);
extern void lock_ipi_call_lock(void);
extern void unlock_ipi_call_lock(void);
G
Glauber Costa 已提交
132 133
#endif /* __ASSEMBLY__ */
#endif