8 #include <linux/kernel.h>
14 #include <asm/fixmap.h>
19 static unsigned bigsmp_get_apic_id(
unsigned long x)
21 return (x >> 24) & 0xFF;
24 static int bigsmp_apic_id_registered(
void)
34 static unsigned long bigsmp_check_apicid_present(
int bit)
39 static int bigsmp_early_logical_apicid(
int cpu)
45 static inline unsigned long calculate_ldr(
int cpu)
47 unsigned long val,
id;
50 id =
per_cpu(x86_bios_cpu_apicid, cpu);
63 static void bigsmp_init_apic_ldr(
void)
69 val = calculate_ldr(cpu);
73 static void bigsmp_setup_apic_routing(
void)
76 "Enabling APIC mode: Physflat. Using %d I/O APICs\n",
80 static int bigsmp_cpu_present_to_apicid(
int mps_cpu)
82 if (mps_cpu < nr_cpu_ids)
83 return (
int)
per_cpu(x86_bios_cpu_apicid, mps_cpu);
91 physids_promote(0xFFL, retmap);
94 static int bigsmp_check_phys_apicid_present(
int phys_apicid)
99 static int bigsmp_phys_pkg_id(
int cpuid_apic,
int index_msb)
101 return cpuid_apic >> index_msb;
109 static void bigsmp_send_IPI_allbutself(
int vector)
114 static void bigsmp_send_IPI_all(
int vector)
116 bigsmp_send_IPI_mask(cpu_online_mask, vector);
119 static int dmi_bigsmp;
131 { hp_ht_bigsmp,
"HP ProLiant DL760 G2",
137 { hp_ht_bigsmp,
"HP ProLiant DL740",
145 static int probe_bigsmp(
void)
155 static struct apic apic_bigsmp = {
158 .probe = probe_bigsmp,
159 .acpi_madt_oem_check =
NULL,
160 .apic_id_valid = default_apic_id_valid,
161 .apic_id_registered = bigsmp_apic_id_registered,
167 .target_cpus = default_target_cpus,
170 .check_apicid_used = bigsmp_check_apicid_used,
171 .check_apicid_present = bigsmp_check_apicid_present,
173 .vector_allocation_domain = default_vector_allocation_domain,
174 .init_apic_ldr = bigsmp_init_apic_ldr,
176 .ioapic_phys_id_map = bigsmp_ioapic_phys_id_map,
177 .setup_apic_routing = bigsmp_setup_apic_routing,
178 .multi_timer_check =
NULL,
179 .cpu_present_to_apicid = bigsmp_cpu_present_to_apicid,
180 .apicid_to_cpu_present = physid_set_mask_of_physid,
181 .setup_portio_remap =
NULL,
182 .check_phys_apicid_present = bigsmp_check_phys_apicid_present,
183 .enable_apic_mode =
NULL,
184 .phys_pkg_id = bigsmp_phys_pkg_id,
185 .mps_oem_check =
NULL,
187 .get_apic_id = bigsmp_get_apic_id,
189 .apic_id_mask = 0xFF << 24,
193 .send_IPI_mask = bigsmp_send_IPI_mask,
194 .send_IPI_mask_allbutself =
NULL,
195 .send_IPI_allbutself = bigsmp_send_IPI_allbutself,
196 .send_IPI_all = bigsmp_send_IPI_all,
197 .send_IPI_self = default_send_IPI_self,
202 .wait_for_init_deassert = default_wait_for_init_deassert,
204 .smp_callin_clear_local_apic =
NULL,
205 .inquire_remote_apic = default_inquire_remote_apic,
207 .read = native_apic_mem_read,
208 .write = native_apic_mem_write,
209 .eoi_write = native_apic_mem_write,
215 .x86_32_early_logical_apicid = bigsmp_early_logical_apicid,
232 bigsmp_early_logical_apicid(cpu);
235 pr_info(
"Overriding APIC driver with %s\n", apic_bigsmp.
name);