mach_apic.h 3.6 KB
Newer Older
1 2
#ifndef _ASM_X86_MACH_DEFAULT_MACH_APIC_H
#define _ASM_X86_MACH_DEFAULT_MACH_APIC_H
L
Linus Torvalds 已提交
3

4 5
#ifdef CONFIG_X86_LOCAL_APIC

L
Linus Torvalds 已提交
6 7 8 9 10
#include <mach_apicdef.h>
#include <asm/smp.h>

#define APIC_DFR_VALUE	(APIC_DFR_FLAT)

11
static inline const struct cpumask *default_target_cpus(void)
L
Linus Torvalds 已提交
12 13
{ 
#ifdef CONFIG_SMP
14
	return cpu_online_mask;
L
Linus Torvalds 已提交
15
#else
16
	return cpumask_of(0);
L
Linus Torvalds 已提交
17 18 19
#endif
} 

20 21
#ifdef CONFIG_X86_64
#include <asm/genapic.h>
I
Ingo Molnar 已提交
22 23
#define cpu_mask_to_apicid (apic->cpu_mask_to_apicid)
#define cpu_mask_to_apicid_and (apic->cpu_mask_to_apicid_and)
24
#define read_apic_id()  (apic->get_apic_id(apic_read(APIC_ID)))
I
Ingo Molnar 已提交
25 26
#define send_IPI_self (apic->send_IPI_self)
#define wakeup_secondary_cpu (apic->wakeup_cpu)
27
extern void default_setup_apic_routing(void);
28
#else
29
#define wakeup_secondary_cpu wakeup_secondary_cpu_via_init
L
Linus Torvalds 已提交
30 31 32 33 34 35 36
/*
 * Set up the logical destination ID.
 *
 * Intel recommends to set DFR, LDR and TPR before enabling
 * an APIC.  See e.g. "AP-388 82489DX User's Manual" (Intel
 * document number 292116).  So here it goes...
 */
37
static inline void default_init_apic_ldr(void)
L
Linus Torvalds 已提交
38 39 40
{
	unsigned long val;

41
	apic_write(APIC_DFR, APIC_DFR_VALUE);
L
Linus Torvalds 已提交
42 43
	val = apic_read(APIC_LDR) & ~APIC_LDR_MASK;
	val |= SET_APIC_LOGICAL_ID(1UL << smp_processor_id());
44
	apic_write(APIC_LDR, val);
L
Linus Torvalds 已提交
45 46
}

47
static inline int default_apic_id_registered(void)
L
Linus Torvalds 已提交
48
{
49
	return physid_isset(read_apic_id(), phys_cpu_present_map);
50 51
}

52
static inline unsigned int cpu_mask_to_apicid(const struct cpumask *cpumask)
53
{
54
	return cpumask_bits(cpumask)[0];
55 56
}

57 58
static inline unsigned int cpu_mask_to_apicid_and(const struct cpumask *cpumask,
						  const struct cpumask *andmask)
M
Mike Travis 已提交
59
{
60 61
	unsigned long mask1 = cpumask_bits(cpumask)[0];
	unsigned long mask2 = cpumask_bits(andmask)[0];
62
	unsigned long mask3 = cpumask_bits(cpu_online_mask)[0];
M
Mike Travis 已提交
63

64
	return (unsigned int)(mask1 & mask2 & mask3);
M
Mike Travis 已提交
65 66
}

67
static inline int default_phys_pkg_id(int cpuid_apic, int index_msb)
68 69
{
	return cpuid_apic >> index_msb;
L
Linus Torvalds 已提交
70 71
}

72
static inline void default_setup_apic_routing(void)
L
Linus Torvalds 已提交
73
{
74
#ifdef CONFIG_X86_IO_APIC
L
Linus Torvalds 已提交
75 76
	printk("Enabling APIC mode:  %s.  Using %d I/O APICs\n",
					"Flat", nr_ioapics);
77
#endif
L
Linus Torvalds 已提交
78 79
}

80
static inline int default_apicid_to_node(int logical_apicid)
L
Linus Torvalds 已提交
81
{
82 83 84
#ifdef CONFIG_SMP
	return apicid_2_node[hard_smp_processor_id()];
#else
L
Linus Torvalds 已提交
85
	return 0;
86
#endif
L
Linus Torvalds 已提交
87
}
88

89
#endif
L
Linus Torvalds 已提交
90

91
static inline unsigned long default_check_apicid_used(physid_mask_t bitmap, int apicid)
92 93 94 95
{
	return physid_isset(apicid, bitmap);
}

96
static inline unsigned long default_check_apicid_present(int bit)
97 98 99 100
{
	return physid_isset(bit, phys_cpu_present_map);
}

101
static inline physid_mask_t default_ioapic_phys_id_map(physid_mask_t phys_map)
102 103 104 105
{
	return phys_map;
}

L
Linus Torvalds 已提交
106
/* Mapping from cpu number to logical apicid */
107
static inline int default_cpu_to_logical_apicid(int cpu)
L
Linus Torvalds 已提交
108 109 110 111
{
	return 1 << cpu;
}

112
static inline int __default_cpu_present_to_apicid(int mps_cpu)
L
Linus Torvalds 已提交
113
{
114
	if (mps_cpu < nr_cpu_ids && cpu_present(mps_cpu))
115
		return (int)per_cpu(x86_bios_cpu_apicid, mps_cpu);
L
Linus Torvalds 已提交
116 117 118 119
	else
		return BAD_APICID;
}

120 121 122 123 124 125
static inline int
__default_check_phys_apicid_present(int boot_cpu_physical_apicid)
{
	return physid_isset(boot_cpu_physical_apicid, phys_cpu_present_map);
}

126 127 128 129 130
#ifdef CONFIG_X86_32
static inline int default_cpu_present_to_apicid(int mps_cpu)
{
	return __default_cpu_present_to_apicid(mps_cpu);
}
131 132 133 134 135 136

static inline int
default_check_phys_apicid_present(int boot_cpu_physical_apicid)
{
	return __default_check_phys_apicid_present(boot_cpu_physical_apicid);
}
137 138
#else
extern int default_cpu_present_to_apicid(int mps_cpu);
139
extern int default_check_phys_apicid_present(int boot_cpu_physical_apicid);
140 141
#endif

142
static inline physid_mask_t default_apicid_to_cpu_present(int phys_apicid)
L
Linus Torvalds 已提交
143 144 145 146
{
	return physid_mask_of_physid(phys_apicid);
}

147
#endif /* CONFIG_X86_LOCAL_APIC */
148
#endif /* _ASM_X86_MACH_DEFAULT_MACH_APIC_H */