Merge branch 'x86/apic' into irq/numa
Merge reason: both topics modify the APIC code but were able to do it in parallel so far. An upcoming patch generates a conflict so merge them to avoid the conflict. Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
@@ -395,7 +395,7 @@ static void __setup_APIC_LVTT(unsigned int clocks, int oneshot, int irqen)
|
||||
|
||||
static void setup_APIC_eilvt(u8 lvt_off, u8 vector, u8 msg_type, u8 mask)
|
||||
{
|
||||
unsigned long reg = (lvt_off << 4) + APIC_EILVT0;
|
||||
unsigned long reg = (lvt_off << 4) + APIC_EILVTn(0);
|
||||
unsigned int v = (mask << 16) | (msg_type << 8) | vector;
|
||||
|
||||
apic_write(reg, v);
|
||||
@@ -1456,7 +1456,6 @@ static int __init detect_init_APIC(void)
|
||||
}
|
||||
|
||||
mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
|
||||
boot_cpu_physical_apicid = 0;
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
@@ -1570,6 +1569,8 @@ void __init early_init_lapic_mapping(void)
|
||||
*/
|
||||
void __init init_apic_mappings(void)
|
||||
{
|
||||
unsigned int new_apicid;
|
||||
|
||||
if (x2apic_mode) {
|
||||
boot_cpu_physical_apicid = read_apic_id();
|
||||
return;
|
||||
@@ -1586,21 +1587,32 @@ void __init init_apic_mappings(void)
|
||||
} else
|
||||
apic_phys = mp_lapic_addr;
|
||||
|
||||
set_fixmap_nocache(FIX_APIC_BASE, apic_phys);
|
||||
/*
|
||||
* acpi lapic path already maps that address in
|
||||
* acpi_register_lapic_address()
|
||||
*/
|
||||
if (!acpi_lapic)
|
||||
set_fixmap_nocache(FIX_APIC_BASE, apic_phys);
|
||||
|
||||
apic_printk(APIC_VERBOSE, "mapped APIC to %08lx (%08lx)\n",
|
||||
APIC_BASE, apic_phys);
|
||||
APIC_BASE, apic_phys);
|
||||
|
||||
/* lets check if we may NOP'ify apic operations */
|
||||
if (!cpu_has_apic) {
|
||||
pr_info("APIC: disable apic facility\n");
|
||||
apic_disable();
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fetch the APIC ID of the BSP in case we have a
|
||||
* default configuration (or the MP table is broken).
|
||||
*/
|
||||
if (boot_cpu_physical_apicid == -1U)
|
||||
boot_cpu_physical_apicid = read_apic_id();
|
||||
|
||||
/* lets check if we may to NOP'ify apic operations */
|
||||
if (!cpu_has_apic) {
|
||||
pr_info("APIC: disable apic facility\n");
|
||||
apic_disable();
|
||||
new_apicid = read_apic_id();
|
||||
if (boot_cpu_physical_apicid != new_apicid) {
|
||||
boot_cpu_physical_apicid = new_apicid;
|
||||
apic_version[new_apicid] =
|
||||
GET_APIC_VERSION(apic_read(APIC_LVR));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2191,7 +2203,7 @@ static int __cpuinit set_multi(const struct dmi_system_id *d)
|
||||
{
|
||||
if (multi)
|
||||
return 0;
|
||||
printk(KERN_INFO "APIC: %s detected, Multi Chassis\n", d->ident);
|
||||
pr_info("APIC: %s detected, Multi Chassis\n", d->ident);
|
||||
multi = 1;
|
||||
return 0;
|
||||
}
|
||||
|
@@ -235,7 +235,7 @@ static int physflat_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
|
||||
* regardless of how many processors are present (x86_64 ES7000
|
||||
* is an example).
|
||||
*/
|
||||
if (acpi_gbl_FADT.header.revision > FADT2_REVISION_ID &&
|
||||
if (acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID &&
|
||||
(acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL)) {
|
||||
printk(KERN_DEBUG "system APIC only can use physical flat");
|
||||
return 1;
|
||||
|
@@ -1730,7 +1730,7 @@ __apicdebuginit(void) print_APIC_bitfield(int base)
|
||||
|
||||
__apicdebuginit(void) print_local_APIC(void *dummy)
|
||||
{
|
||||
unsigned int v, ver, maxlvt;
|
||||
unsigned int i, v, ver, maxlvt;
|
||||
u64 icr;
|
||||
|
||||
if (apic_verbosity == APIC_QUIET)
|
||||
@@ -1818,6 +1818,18 @@ __apicdebuginit(void) print_local_APIC(void *dummy)
|
||||
printk(KERN_DEBUG "... APIC TMCCT: %08x\n", v);
|
||||
v = apic_read(APIC_TDCR);
|
||||
printk(KERN_DEBUG "... APIC TDCR: %08x\n", v);
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_EXTAPIC)) {
|
||||
v = apic_read(APIC_EFEAT);
|
||||
maxlvt = (v >> 16) & 0xff;
|
||||
printk(KERN_DEBUG "... APIC EFEAT: %08x\n", v);
|
||||
v = apic_read(APIC_ECTRL);
|
||||
printk(KERN_DEBUG "... APIC ECTRL: %08x\n", v);
|
||||
for (i = 0; i < maxlvt; i++) {
|
||||
v = apic_read(APIC_EILVTn(i));
|
||||
printk(KERN_DEBUG "... APIC EILVT%d: %08x\n", i, v);
|
||||
}
|
||||
}
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
@@ -3742,6 +3754,8 @@ int arch_enable_uv_irq(char *irq_name, unsigned int irq, int cpu, int mmr_blade,
|
||||
unsigned long flags;
|
||||
int err;
|
||||
|
||||
BUILD_BUG_ON(sizeof(struct uv_IO_APIC_route_entry) != sizeof(unsigned long));
|
||||
|
||||
cfg = irq_cfg(irq);
|
||||
|
||||
err = assign_irq_vector(irq, cfg, eligible_cpu);
|
||||
@@ -3755,15 +3769,13 @@ int arch_enable_uv_irq(char *irq_name, unsigned int irq, int cpu, int mmr_blade,
|
||||
|
||||
mmr_value = 0;
|
||||
entry = (struct uv_IO_APIC_route_entry *)&mmr_value;
|
||||
BUG_ON(sizeof(struct uv_IO_APIC_route_entry) != sizeof(unsigned long));
|
||||
|
||||
entry->vector = cfg->vector;
|
||||
entry->delivery_mode = apic->irq_delivery_mode;
|
||||
entry->dest_mode = apic->irq_dest_mode;
|
||||
entry->polarity = 0;
|
||||
entry->trigger = 0;
|
||||
entry->mask = 0;
|
||||
entry->dest = apic->cpu_mask_to_apicid(eligible_cpu);
|
||||
entry->vector = cfg->vector;
|
||||
entry->delivery_mode = apic->irq_delivery_mode;
|
||||
entry->dest_mode = apic->irq_dest_mode;
|
||||
entry->polarity = 0;
|
||||
entry->trigger = 0;
|
||||
entry->mask = 0;
|
||||
entry->dest = apic->cpu_mask_to_apicid(eligible_cpu);
|
||||
|
||||
mmr_pnode = uv_blade_to_pnode(mmr_blade);
|
||||
uv_write_global_mmr64(mmr_pnode, mmr_offset, mmr_value);
|
||||
@@ -3781,10 +3793,10 @@ void arch_disable_uv_irq(int mmr_blade, unsigned long mmr_offset)
|
||||
struct uv_IO_APIC_route_entry *entry;
|
||||
int mmr_pnode;
|
||||
|
||||
BUILD_BUG_ON(sizeof(struct uv_IO_APIC_route_entry) != sizeof(unsigned long));
|
||||
|
||||
mmr_value = 0;
|
||||
entry = (struct uv_IO_APIC_route_entry *)&mmr_value;
|
||||
BUG_ON(sizeof(struct uv_IO_APIC_route_entry) != sizeof(unsigned long));
|
||||
|
||||
entry->mask = 1;
|
||||
|
||||
mmr_pnode = uv_blade_to_pnode(mmr_blade);
|
||||
|
@@ -583,15 +583,18 @@ void __init uv_system_init(void)
|
||||
|
||||
bytes = sizeof(struct uv_blade_info) * uv_num_possible_blades();
|
||||
uv_blade_info = kmalloc(bytes, GFP_KERNEL);
|
||||
BUG_ON(!uv_blade_info);
|
||||
|
||||
get_lowmem_redirect(&lowmem_redir_base, &lowmem_redir_size);
|
||||
|
||||
bytes = sizeof(uv_node_to_blade[0]) * num_possible_nodes();
|
||||
uv_node_to_blade = kmalloc(bytes, GFP_KERNEL);
|
||||
BUG_ON(!uv_node_to_blade);
|
||||
memset(uv_node_to_blade, 255, bytes);
|
||||
|
||||
bytes = sizeof(uv_cpu_to_blade[0]) * num_possible_cpus();
|
||||
uv_cpu_to_blade = kmalloc(bytes, GFP_KERNEL);
|
||||
BUG_ON(!uv_cpu_to_blade);
|
||||
memset(uv_cpu_to_blade, 255, bytes);
|
||||
|
||||
blade = 0;
|
||||
|
Reference in New Issue
Block a user