diff options
Diffstat (limited to 'arch/x86/kernel/mpparse_32.c')
-rw-r--r-- | arch/x86/kernel/mpparse_32.c | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/arch/x86/kernel/mpparse_32.c b/arch/x86/kernel/mpparse_32.c index 7a05a7f6099a..67009cdd5eca 100644 --- a/arch/x86/kernel/mpparse_32.c +++ b/arch/x86/kernel/mpparse_32.c | |||
@@ -68,7 +68,7 @@ unsigned int def_to_bigsmp = 0; | |||
68 | /* Processor that is doing the boot up */ | 68 | /* Processor that is doing the boot up */ |
69 | unsigned int boot_cpu_physical_apicid = -1U; | 69 | unsigned int boot_cpu_physical_apicid = -1U; |
70 | /* Internal processor count */ | 70 | /* Internal processor count */ |
71 | unsigned int __cpuinitdata num_processors; | 71 | unsigned int num_processors; |
72 | 72 | ||
73 | /* Bitmask of physically existing CPUs */ | 73 | /* Bitmask of physically existing CPUs */ |
74 | physid_mask_t phys_cpu_present_map; | 74 | physid_mask_t phys_cpu_present_map; |
@@ -258,7 +258,7 @@ static void __init MP_ioapic_info (struct mpc_config_ioapic *m) | |||
258 | if (!(m->mpc_flags & MPC_APIC_USABLE)) | 258 | if (!(m->mpc_flags & MPC_APIC_USABLE)) |
259 | return; | 259 | return; |
260 | 260 | ||
261 | printk(KERN_INFO "I/O APIC #%d Version %d at 0x%lX.\n", | 261 | printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n", |
262 | m->mpc_apicid, m->mpc_apicver, m->mpc_apicaddr); | 262 | m->mpc_apicid, m->mpc_apicver, m->mpc_apicaddr); |
263 | if (nr_ioapics >= MAX_IO_APICS) { | 263 | if (nr_ioapics >= MAX_IO_APICS) { |
264 | printk(KERN_CRIT "Max # of I/O APICs (%d) exceeded (found %d).\n", | 264 | printk(KERN_CRIT "Max # of I/O APICs (%d) exceeded (found %d).\n", |
@@ -405,9 +405,9 @@ static int __init smp_read_mpc(struct mp_config_table *mpc) | |||
405 | 405 | ||
406 | mps_oem_check(mpc, oem, str); | 406 | mps_oem_check(mpc, oem, str); |
407 | 407 | ||
408 | printk("APIC at: 0x%lX\n",mpc->mpc_lapic); | 408 | printk("APIC at: 0x%X\n", mpc->mpc_lapic); |
409 | 409 | ||
410 | /* | 410 | /* |
411 | * Save the local APIC address (it might be non-default) -- but only | 411 | * Save the local APIC address (it might be non-default) -- but only |
412 | * if we're not using ACPI. | 412 | * if we're not using ACPI. |
413 | */ | 413 | */ |
@@ -721,7 +721,7 @@ static int __init smp_scan_config (unsigned long base, unsigned long length) | |||
721 | unsigned long *bp = phys_to_virt(base); | 721 | unsigned long *bp = phys_to_virt(base); |
722 | struct intel_mp_floating *mpf; | 722 | struct intel_mp_floating *mpf; |
723 | 723 | ||
724 | Dprintk("Scan SMP from %p for %ld bytes.\n", bp,length); | 724 | printk(KERN_INFO "Scan SMP from %p for %ld bytes.\n", bp,length); |
725 | if (sizeof(*mpf) != 16) | 725 | if (sizeof(*mpf) != 16) |
726 | printk("Error: MPF size\n"); | 726 | printk("Error: MPF size\n"); |
727 | 727 | ||
@@ -734,8 +734,8 @@ static int __init smp_scan_config (unsigned long base, unsigned long length) | |||
734 | || (mpf->mpf_specification == 4)) ) { | 734 | || (mpf->mpf_specification == 4)) ) { |
735 | 735 | ||
736 | smp_found_config = 1; | 736 | smp_found_config = 1; |
737 | printk(KERN_INFO "found SMP MP-table at %08lx\n", | 737 | printk(KERN_INFO "found SMP MP-table at [%p] %08lx\n", |
738 | virt_to_phys(mpf)); | 738 | mpf, virt_to_phys(mpf)); |
739 | reserve_bootmem(virt_to_phys(mpf), PAGE_SIZE); | 739 | reserve_bootmem(virt_to_phys(mpf), PAGE_SIZE); |
740 | if (mpf->mpf_physptr) { | 740 | if (mpf->mpf_physptr) { |
741 | /* | 741 | /* |
@@ -918,14 +918,14 @@ void __init mp_register_ioapic(u8 id, u32 address, u32 gsi_base) | |||
918 | */ | 918 | */ |
919 | mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].mpc_apicid; | 919 | mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].mpc_apicid; |
920 | mp_ioapic_routing[idx].gsi_base = gsi_base; | 920 | mp_ioapic_routing[idx].gsi_base = gsi_base; |
921 | mp_ioapic_routing[idx].gsi_end = gsi_base + | 921 | mp_ioapic_routing[idx].gsi_end = gsi_base + |
922 | io_apic_get_redir_entries(idx); | 922 | io_apic_get_redir_entries(idx); |
923 | 923 | ||
924 | printk("IOAPIC[%d]: apic_id %d, version %d, address 0x%lx, " | 924 | printk("IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " |
925 | "GSI %d-%d\n", idx, mp_ioapics[idx].mpc_apicid, | 925 | "GSI %d-%d\n", idx, mp_ioapics[idx].mpc_apicid, |
926 | mp_ioapics[idx].mpc_apicver, mp_ioapics[idx].mpc_apicaddr, | 926 | mp_ioapics[idx].mpc_apicver, mp_ioapics[idx].mpc_apicaddr, |
927 | mp_ioapic_routing[idx].gsi_base, | 927 | mp_ioapic_routing[idx].gsi_base, |
928 | mp_ioapic_routing[idx].gsi_end); | 928 | mp_ioapic_routing[idx].gsi_end); |
929 | } | 929 | } |
930 | 930 | ||
931 | void __init | 931 | void __init |
@@ -1041,15 +1041,16 @@ void __init mp_config_acpi_legacy_irqs (void) | |||
1041 | } | 1041 | } |
1042 | 1042 | ||
1043 | #define MAX_GSI_NUM 4096 | 1043 | #define MAX_GSI_NUM 4096 |
1044 | #define IRQ_COMPRESSION_START 64 | ||
1044 | 1045 | ||
1045 | int mp_register_gsi(u32 gsi, int triggering, int polarity) | 1046 | int mp_register_gsi(u32 gsi, int triggering, int polarity) |
1046 | { | 1047 | { |
1047 | int ioapic = -1; | 1048 | int ioapic = -1; |
1048 | int ioapic_pin = 0; | 1049 | int ioapic_pin = 0; |
1049 | int idx, bit = 0; | 1050 | int idx, bit = 0; |
1050 | static int pci_irq = 16; | 1051 | static int pci_irq = IRQ_COMPRESSION_START; |
1051 | /* | 1052 | /* |
1052 | * Mapping between Global System Interrups, which | 1053 | * Mapping between Global System Interrupts, which |
1053 | * represent all possible interrupts, and IRQs | 1054 | * represent all possible interrupts, and IRQs |
1054 | * assigned to actual devices. | 1055 | * assigned to actual devices. |
1055 | */ | 1056 | */ |
@@ -1086,12 +1087,16 @@ int mp_register_gsi(u32 gsi, int triggering, int polarity) | |||
1086 | if ((1<<bit) & mp_ioapic_routing[ioapic].pin_programmed[idx]) { | 1087 | if ((1<<bit) & mp_ioapic_routing[ioapic].pin_programmed[idx]) { |
1087 | Dprintk(KERN_DEBUG "Pin %d-%d already programmed\n", | 1088 | Dprintk(KERN_DEBUG "Pin %d-%d already programmed\n", |
1088 | mp_ioapic_routing[ioapic].apic_id, ioapic_pin); | 1089 | mp_ioapic_routing[ioapic].apic_id, ioapic_pin); |
1089 | return gsi_to_irq[gsi]; | 1090 | return (gsi < IRQ_COMPRESSION_START ? gsi : gsi_to_irq[gsi]); |
1090 | } | 1091 | } |
1091 | 1092 | ||
1092 | mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit); | 1093 | mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit); |
1093 | 1094 | ||
1094 | if (triggering == ACPI_LEVEL_SENSITIVE) { | 1095 | /* |
1096 | * For GSI >= 64, use IRQ compression | ||
1097 | */ | ||
1098 | if ((gsi >= IRQ_COMPRESSION_START) | ||
1099 | && (triggering == ACPI_LEVEL_SENSITIVE)) { | ||
1095 | /* | 1100 | /* |
1096 | * For PCI devices assign IRQs in order, avoiding gaps | 1101 | * For PCI devices assign IRQs in order, avoiding gaps |
1097 | * due to unused I/O APIC pins. | 1102 | * due to unused I/O APIC pins. |