apic.h 5.1 KB
Newer Older
Y
Yinghai Lu 已提交
1 2
#ifndef __ASM_ES7000_APIC_H
#define __ASM_ES7000_APIC_H
L
Linus Torvalds 已提交
3

4
#define xapic_phys_to_log_apicid(cpu) per_cpu(x86_bios_cpu_apicid, cpu)
L
Linus Torvalds 已提交
5 6 7 8 9 10 11
#define esr_disable (1)

static inline int apic_id_registered(void)
{
	        return (1);
}

12
static inline cpumask_t target_cpus_cluster(void)
Y
Yinghai Lu 已提交
13
{
L
Linus Torvalds 已提交
14
	return CPU_MASK_ALL;
15 16 17 18
}

static inline cpumask_t target_cpus(void)
{
L
Linus Torvalds 已提交
19 20 21
	return cpumask_of_cpu(smp_processor_id());
}

22 23 24 25 26
#define APIC_DFR_VALUE_CLUSTER		(APIC_DFR_CLUSTER)
#define INT_DELIVERY_MODE_CLUSTER	(dest_LowestPrio)
#define INT_DEST_MODE_CLUSTER		(1) /* logical delivery broadcast to all procs */
#define NO_BALANCE_IRQ_CLUSTER		(1)

L
Linus Torvalds 已提交
27 28 29
#define APIC_DFR_VALUE		(APIC_DFR_FLAT)
#define INT_DELIVERY_MODE	(dest_Fixed)
#define INT_DEST_MODE		(0)    /* phys delivery to target procs */
Y
Yinghai Lu 已提交
30
#define NO_BALANCE_IRQ		(0)
L
Linus Torvalds 已提交
31 32 33 34
#undef  APIC_DEST_LOGICAL
#define APIC_DEST_LOGICAL	0x0

static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
Y
Yinghai Lu 已提交
35
{
L
Linus Torvalds 已提交
36
	return 0;
Y
Yinghai Lu 已提交
37 38
}
static inline unsigned long check_apicid_present(int bit)
L
Linus Torvalds 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
{
	return physid_isset(bit, phys_cpu_present_map);
}

#define apicid_cluster(apicid) (apicid & 0xF0)

static inline unsigned long calculate_ldr(int cpu)
{
	unsigned long id;
	id = xapic_phys_to_log_apicid(cpu);
	return (SET_APIC_LOGICAL_ID(id));
}

/*
 * 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...
 */
59 60 61 62 63 64 65 66 67 68
static inline void init_apic_ldr_cluster(void)
{
	unsigned long val;
	int cpu = smp_processor_id();

	apic_write(APIC_DFR, APIC_DFR_VALUE_CLUSTER);
	val = calculate_ldr(cpu);
	apic_write(APIC_LDR, val);
}

L
Linus Torvalds 已提交
69 70 71 72 73
static inline void init_apic_ldr(void)
{
	unsigned long val;
	int cpu = smp_processor_id();

74
	apic_write(APIC_DFR, APIC_DFR_VALUE);
L
Linus Torvalds 已提交
75
	val = calculate_ldr(cpu);
76
	apic_write(APIC_LDR, val);
L
Linus Torvalds 已提交
77 78 79
}

extern int apic_version [MAX_APICS];
80
static inline void setup_apic_routing(void)
L
Linus Torvalds 已提交
81
{
82
	int apic = per_cpu(x86_bios_cpu_apicid, smp_processor_id());
L
Linus Torvalds 已提交
83
	printk("Enabling APIC mode:  %s.  Using %d I/O APICs, target cpus %lx\n",
Y
Yinghai Lu 已提交
84
		(apic_version[apic] == 0x14) ?
85
		"Physical Cluster" : "Logical Cluster", nr_ioapics, cpus_addr(target_cpus())[0]);
L
Linus Torvalds 已提交
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
}

static inline int multi_timer_check(int apic, int irq)
{
	return 0;
}

static inline int apicid_to_node(int logical_apicid)
{
	return 0;
}


static inline int cpu_present_to_apicid(int mps_cpu)
{
	if (!mps_cpu)
		return boot_cpu_physical_apicid;
	else if (mps_cpu < NR_CPUS)
104
		return (int) per_cpu(x86_bios_cpu_apicid, mps_cpu);
L
Linus Torvalds 已提交
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
	else
		return BAD_APICID;
}

static inline physid_mask_t apicid_to_cpu_present(int phys_apicid)
{
	static int id = 0;
	physid_mask_t mask;
	mask = physid_mask_of_physid(id);
	++id;
	return mask;
}

extern u8 cpu_2_logical_apicid[];
/* Mapping from cpu number to logical apicid */
static inline int cpu_to_logical_apicid(int cpu)
{
122
#ifdef CONFIG_SMP
L
Linus Torvalds 已提交
123 124 125
       if (cpu >= NR_CPUS)
	       return BAD_APICID;
       return (int)cpu_2_logical_apicid[cpu];
126 127 128
#else
	return logical_smp_processor_id();
#endif
L
Linus Torvalds 已提交
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
}

static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
{
	/* For clustered we don't have a good way to do this yet - hack */
	return physids_promote(0xff);
}


static inline void setup_portio_remap(void)
{
}

extern unsigned int boot_cpu_physical_apicid;
static inline int check_phys_apicid_present(int cpu_physical_apicid)
{
145
	boot_cpu_physical_apicid = read_apic_id();
L
Linus Torvalds 已提交
146 147 148
	return (1);
}

149
static inline unsigned int cpu_mask_to_apicid_cluster(cpumask_t cpumask)
L
Linus Torvalds 已提交
150 151 152 153
{
	int num_bits_set;
	int cpus_found = 0;
	int cpu;
Y
Yinghai Lu 已提交
154
	int apicid;
L
Linus Torvalds 已提交
155 156 157 158 159

	num_bits_set = cpus_weight(cpumask);
	/* Return id to all */
	if (num_bits_set == NR_CPUS)
		return 0xFF;
Y
Yinghai Lu 已提交
160 161 162
	/*
	 * The cpus in the mask must all be on the apic cluster.  If are not
	 * on the same apicid cluster return default value of TARGET_CPUS.
L
Linus Torvalds 已提交
163 164 165 166 167 168
	 */
	cpu = first_cpu(cpumask);
	apicid = cpu_to_logical_apicid(cpu);
	while (cpus_found < num_bits_set) {
		if (cpu_isset(cpu, cpumask)) {
			int new_apicid = cpu_to_logical_apicid(cpu);
Y
Yinghai Lu 已提交
169
			if (apicid_cluster(apicid) !=
L
Linus Torvalds 已提交
170
					apicid_cluster(new_apicid)){
171
				printk ("%s: Not a valid mask!\n", __func__);
L
Linus Torvalds 已提交
172
				return 0xFF;
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
			}
			apicid = new_apicid;
			cpus_found++;
		}
		cpu++;
	}
	return apicid;
}

static inline unsigned int cpu_mask_to_apicid(cpumask_t cpumask)
{
	int num_bits_set;
	int cpus_found = 0;
	int cpu;
	int apicid;

	num_bits_set = cpus_weight(cpumask);
	/* Return id to all */
	if (num_bits_set == NR_CPUS)
		return cpu_to_logical_apicid(0);
	/*
	 * The cpus in the mask must all be on the apic cluster.  If are not
	 * on the same apicid cluster return default value of TARGET_CPUS.
	 */
	cpu = first_cpu(cpumask);
	apicid = cpu_to_logical_apicid(cpu);
	while (cpus_found < num_bits_set) {
		if (cpu_isset(cpu, cpumask)) {
			int new_apicid = cpu_to_logical_apicid(cpu);
			if (apicid_cluster(apicid) !=
					apicid_cluster(new_apicid)){
				printk ("%s: Not a valid mask!\n", __func__);
L
Linus Torvalds 已提交
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
				return cpu_to_logical_apicid(0);
			}
			apicid = new_apicid;
			cpus_found++;
		}
		cpu++;
	}
	return apicid;
}

static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
{
	return cpuid_apic >> index_msb;
}

Y
Yinghai Lu 已提交
220
#endif /* __ASM_ES7000_APIC_H */