diff options
Diffstat (limited to 'arch/i386/kernel/mpparse.c')
| -rw-r--r-- | arch/i386/kernel/mpparse.c | 38 |
1 files changed, 14 insertions, 24 deletions
diff --git a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c index 5d0b9a8fc43d..15949fd08109 100644 --- a/arch/i386/kernel/mpparse.c +++ b/arch/i386/kernel/mpparse.c | |||
| @@ -122,8 +122,8 @@ static int MP_valid_apicid(int apicid, int version) | |||
| 122 | 122 | ||
| 123 | static void __init MP_processor_info (struct mpc_config_processor *m) | 123 | static void __init MP_processor_info (struct mpc_config_processor *m) |
| 124 | { | 124 | { |
| 125 | int ver, apicid, cpu, found_bsp = 0; | 125 | int ver, apicid; |
| 126 | physid_mask_t tmp; | 126 | physid_mask_t phys_cpu; |
| 127 | 127 | ||
| 128 | if (!(m->mpc_cpuflag & CPU_ENABLED)) | 128 | if (!(m->mpc_cpuflag & CPU_ENABLED)) |
| 129 | return; | 129 | return; |
| @@ -181,7 +181,6 @@ static void __init MP_processor_info (struct mpc_config_processor *m) | |||
| 181 | if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) { | 181 | if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) { |
| 182 | Dprintk(" Bootup CPU\n"); | 182 | Dprintk(" Bootup CPU\n"); |
| 183 | boot_cpu_physical_apicid = m->mpc_apicid; | 183 | boot_cpu_physical_apicid = m->mpc_apicid; |
| 184 | found_bsp = 1; | ||
| 185 | } | 184 | } |
| 186 | 185 | ||
| 187 | if (num_processors >= NR_CPUS) { | 186 | if (num_processors >= NR_CPUS) { |
| @@ -195,29 +194,26 @@ static void __init MP_processor_info (struct mpc_config_processor *m) | |||
| 195 | " Processor ignored.\n", maxcpus); | 194 | " Processor ignored.\n", maxcpus); |
| 196 | return; | 195 | return; |
| 197 | } | 196 | } |
| 198 | num_processors++; | ||
| 199 | ver = m->mpc_apicver; | 197 | ver = m->mpc_apicver; |
| 200 | 198 | ||
| 201 | if (!MP_valid_apicid(apicid, ver)) { | 199 | if (!MP_valid_apicid(apicid, ver)) { |
| 202 | printk(KERN_WARNING "Processor #%d INVALID. (Max ID: %d).\n", | 200 | printk(KERN_WARNING "Processor #%d INVALID. (Max ID: %d).\n", |
| 203 | m->mpc_apicid, MAX_APICS); | 201 | m->mpc_apicid, MAX_APICS); |
| 204 | --num_processors; | ||
| 205 | return; | 202 | return; |
| 206 | } | 203 | } |
| 207 | 204 | ||
| 208 | if (found_bsp) | 205 | cpu_set(num_processors, cpu_possible_map); |
| 209 | cpu = 0; | 206 | num_processors++; |
| 210 | else | 207 | phys_cpu = apicid_to_cpu_present(apicid); |
| 211 | cpu = num_processors - 1; | 208 | physids_or(phys_cpu_present_map, phys_cpu_present_map, phys_cpu); |
| 212 | cpu_set(cpu, cpu_possible_map); | 209 | |
| 213 | tmp = apicid_to_cpu_present(apicid); | ||
| 214 | physids_or(phys_cpu_present_map, phys_cpu_present_map, tmp); | ||
| 215 | |||
| 216 | /* | 210 | /* |
| 217 | * Validate version | 211 | * Validate version |
| 218 | */ | 212 | */ |
| 219 | if (ver == 0x0) { | 213 | if (ver == 0x0) { |
| 220 | printk(KERN_WARNING "BIOS bug, APIC version is 0 for CPU#%d! fixing up to 0x10. (tell your hw vendor)\n", m->mpc_apicid); | 214 | printk(KERN_WARNING "BIOS bug, APIC version is 0 for CPU#%d! " |
| 215 | "fixing up to 0x10. (tell your hw vendor)\n", | ||
| 216 | m->mpc_apicid); | ||
| 221 | ver = 0x10; | 217 | ver = 0x10; |
| 222 | } | 218 | } |
| 223 | apic_version[m->mpc_apicid] = ver; | 219 | apic_version[m->mpc_apicid] = ver; |
| @@ -668,8 +664,6 @@ void __init get_smp_config (void) | |||
| 668 | struct intel_mp_floating *mpf = mpf_found; | 664 | struct intel_mp_floating *mpf = mpf_found; |
| 669 | 665 | ||
| 670 | /* | 666 | /* |
| 671 | * ACPI may be used to obtain the entire SMP configuration or just to | ||
| 672 | * enumerate/configure processors (CONFIG_ACPI_BOOT). Note that | ||
| 673 | * ACPI supports both logical (e.g. Hyper-Threading) and physical | 667 | * ACPI supports both logical (e.g. Hyper-Threading) and physical |
| 674 | * processors, where MPS only supports physical. | 668 | * processors, where MPS only supports physical. |
| 675 | */ | 669 | */ |
| @@ -825,7 +819,7 @@ void __init find_smp_config (void) | |||
| 825 | ACPI-based MP Configuration | 819 | ACPI-based MP Configuration |
| 826 | -------------------------------------------------------------------------- */ | 820 | -------------------------------------------------------------------------- */ |
| 827 | 821 | ||
| 828 | #ifdef CONFIG_ACPI_BOOT | 822 | #ifdef CONFIG_ACPI |
| 829 | 823 | ||
| 830 | void __init mp_register_lapic_address ( | 824 | void __init mp_register_lapic_address ( |
| 831 | u64 address) | 825 | u64 address) |
| @@ -871,7 +865,7 @@ void __init mp_register_lapic ( | |||
| 871 | MP_processor_info(&processor); | 865 | MP_processor_info(&processor); |
| 872 | } | 866 | } |
| 873 | 867 | ||
| 874 | #if defined(CONFIG_X86_IO_APIC) && (defined(CONFIG_ACPI_INTERPRETER) || defined(CONFIG_ACPI_BOOT)) | 868 | #ifdef CONFIG_X86_IO_APIC |
| 875 | 869 | ||
| 876 | #define MP_ISA_BUS 0 | 870 | #define MP_ISA_BUS 0 |
| 877 | #define MP_MAX_IOAPIC_PIN 127 | 871 | #define MP_MAX_IOAPIC_PIN 127 |
| @@ -1086,11 +1080,9 @@ int mp_register_gsi (u32 gsi, int edge_level, int active_high_low) | |||
| 1086 | */ | 1080 | */ |
| 1087 | static int gsi_to_irq[MAX_GSI_NUM]; | 1081 | static int gsi_to_irq[MAX_GSI_NUM]; |
| 1088 | 1082 | ||
| 1089 | #ifdef CONFIG_ACPI_BUS | ||
| 1090 | /* Don't set up the ACPI SCI because it's already set up */ | 1083 | /* Don't set up the ACPI SCI because it's already set up */ |
| 1091 | if (acpi_fadt.sci_int == gsi) | 1084 | if (acpi_fadt.sci_int == gsi) |
| 1092 | return gsi; | 1085 | return gsi; |
| 1093 | #endif | ||
| 1094 | 1086 | ||
| 1095 | ioapic = mp_find_ioapic(gsi); | 1087 | ioapic = mp_find_ioapic(gsi); |
| 1096 | if (ioapic < 0) { | 1088 | if (ioapic < 0) { |
| @@ -1133,13 +1125,11 @@ int mp_register_gsi (u32 gsi, int edge_level, int active_high_low) | |||
| 1133 | if (gsi < MAX_GSI_NUM) { | 1125 | if (gsi < MAX_GSI_NUM) { |
| 1134 | if (gsi > 15) | 1126 | if (gsi > 15) |
| 1135 | gsi = pci_irq++; | 1127 | gsi = pci_irq++; |
| 1136 | #ifdef CONFIG_ACPI_BUS | ||
| 1137 | /* | 1128 | /* |
| 1138 | * Don't assign IRQ used by ACPI SCI | 1129 | * Don't assign IRQ used by ACPI SCI |
| 1139 | */ | 1130 | */ |
| 1140 | if (gsi == acpi_fadt.sci_int) | 1131 | if (gsi == acpi_fadt.sci_int) |
| 1141 | gsi = pci_irq++; | 1132 | gsi = pci_irq++; |
| 1142 | #endif | ||
| 1143 | gsi_to_irq[irq] = gsi; | 1133 | gsi_to_irq[irq] = gsi; |
| 1144 | } else { | 1134 | } else { |
| 1145 | printk(KERN_ERR "GSI %u is too high\n", gsi); | 1135 | printk(KERN_ERR "GSI %u is too high\n", gsi); |
| @@ -1153,5 +1143,5 @@ int mp_register_gsi (u32 gsi, int edge_level, int active_high_low) | |||
| 1153 | return gsi; | 1143 | return gsi; |
| 1154 | } | 1144 | } |
| 1155 | 1145 | ||
| 1156 | #endif /*CONFIG_X86_IO_APIC && (CONFIG_ACPI_INTERPRETER || CONFIG_ACPI_BOOT)*/ | 1146 | #endif /* CONFIG_X86_IO_APIC */ |
| 1157 | #endif /*CONFIG_ACPI_BOOT*/ | 1147 | #endif /* CONFIG_ACPI */ |
