diff options
Diffstat (limited to 'arch/x86/kernel/acpi/boot.c')
| -rw-r--r-- | arch/x86/kernel/acpi/boot.c | 191 |
1 files changed, 96 insertions, 95 deletions
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index d37593c2f43..956c1dee6fb 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -42,10 +42,6 @@ | |||
| 42 | #include <asm/mpspec.h> | 42 | #include <asm/mpspec.h> |
| 43 | #include <asm/smp.h> | 43 | #include <asm/smp.h> |
| 44 | 44 | ||
| 45 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 46 | # include <mach_apic.h> | ||
| 47 | #endif | ||
| 48 | |||
| 49 | static int __initdata acpi_force = 0; | 45 | static int __initdata acpi_force = 0; |
| 50 | u32 acpi_rsdt_forced; | 46 | u32 acpi_rsdt_forced; |
| 51 | #ifdef CONFIG_ACPI | 47 | #ifdef CONFIG_ACPI |
| @@ -56,16 +52,7 @@ int acpi_disabled = 1; | |||
| 56 | EXPORT_SYMBOL(acpi_disabled); | 52 | EXPORT_SYMBOL(acpi_disabled); |
| 57 | 53 | ||
| 58 | #ifdef CONFIG_X86_64 | 54 | #ifdef CONFIG_X86_64 |
| 59 | 55 | # include <asm/proto.h> | |
| 60 | #include <asm/proto.h> | ||
| 61 | |||
| 62 | #else /* X86 */ | ||
| 63 | |||
| 64 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 65 | #include <mach_apic.h> | ||
| 66 | #include <mach_mpparse.h> | ||
| 67 | #endif /* CONFIG_X86_LOCAL_APIC */ | ||
| 68 | |||
| 69 | #endif /* X86 */ | 56 | #endif /* X86 */ |
| 70 | 57 | ||
| 71 | #define BAD_MADT_ENTRY(entry, end) ( \ | 58 | #define BAD_MADT_ENTRY(entry, end) ( \ |
| @@ -121,35 +108,18 @@ enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_PIC; | |||
| 121 | */ | 108 | */ |
| 122 | char *__init __acpi_map_table(unsigned long phys, unsigned long size) | 109 | char *__init __acpi_map_table(unsigned long phys, unsigned long size) |
| 123 | { | 110 | { |
| 124 | unsigned long base, offset, mapped_size; | ||
| 125 | int idx; | ||
| 126 | 111 | ||
| 127 | if (!phys || !size) | 112 | if (!phys || !size) |
| 128 | return NULL; | 113 | return NULL; |
| 129 | 114 | ||
| 130 | if (phys+size <= (max_low_pfn_mapped << PAGE_SHIFT)) | 115 | return early_ioremap(phys, size); |
| 131 | return __va(phys); | 116 | } |
| 132 | 117 | void __init __acpi_unmap_table(char *map, unsigned long size) | |
| 133 | offset = phys & (PAGE_SIZE - 1); | 118 | { |
| 134 | mapped_size = PAGE_SIZE - offset; | 119 | if (!map || !size) |
| 135 | clear_fixmap(FIX_ACPI_END); | 120 | return; |
| 136 | set_fixmap(FIX_ACPI_END, phys); | ||
| 137 | base = fix_to_virt(FIX_ACPI_END); | ||
| 138 | |||
| 139 | /* | ||
| 140 | * Most cases can be covered by the below. | ||
| 141 | */ | ||
| 142 | idx = FIX_ACPI_END; | ||
| 143 | while (mapped_size < size) { | ||
| 144 | if (--idx < FIX_ACPI_BEGIN) | ||
| 145 | return NULL; /* cannot handle this */ | ||
| 146 | phys += PAGE_SIZE; | ||
| 147 | clear_fixmap(idx); | ||
| 148 | set_fixmap(idx, phys); | ||
| 149 | mapped_size += PAGE_SIZE; | ||
| 150 | } | ||
| 151 | 121 | ||
| 152 | return ((unsigned char *)base + offset); | 122 | early_iounmap(map, size); |
| 153 | } | 123 | } |
| 154 | 124 | ||
| 155 | #ifdef CONFIG_PCI_MMCONFIG | 125 | #ifdef CONFIG_PCI_MMCONFIG |
| @@ -239,7 +209,8 @@ static int __init acpi_parse_madt(struct acpi_table_header *table) | |||
| 239 | madt->address); | 209 | madt->address); |
| 240 | } | 210 | } |
| 241 | 211 | ||
| 242 | acpi_madt_oem_check(madt->header.oem_id, madt->header.oem_table_id); | 212 | default_acpi_madt_oem_check(madt->header.oem_id, |
| 213 | madt->header.oem_table_id); | ||
| 243 | 214 | ||
| 244 | return 0; | 215 | return 0; |
| 245 | } | 216 | } |
| @@ -884,7 +855,7 @@ static struct { | |||
| 884 | DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1); | 855 | DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1); |
| 885 | } mp_ioapic_routing[MAX_IO_APICS]; | 856 | } mp_ioapic_routing[MAX_IO_APICS]; |
| 886 | 857 | ||
| 887 | static int mp_find_ioapic(int gsi) | 858 | int mp_find_ioapic(int gsi) |
| 888 | { | 859 | { |
| 889 | int i = 0; | 860 | int i = 0; |
| 890 | 861 | ||
| @@ -899,6 +870,16 @@ static int mp_find_ioapic(int gsi) | |||
| 899 | return -1; | 870 | return -1; |
| 900 | } | 871 | } |
| 901 | 872 | ||
| 873 | int mp_find_ioapic_pin(int ioapic, int gsi) | ||
| 874 | { | ||
| 875 | if (WARN_ON(ioapic == -1)) | ||
| 876 | return -1; | ||
| 877 | if (WARN_ON(gsi > mp_ioapic_routing[ioapic].gsi_end)) | ||
| 878 | return -1; | ||
| 879 | |||
| 880 | return gsi - mp_ioapic_routing[ioapic].gsi_base; | ||
| 881 | } | ||
| 882 | |||
| 902 | static u8 __init uniq_ioapic_id(u8 id) | 883 | static u8 __init uniq_ioapic_id(u8 id) |
| 903 | { | 884 | { |
| 904 | #ifdef CONFIG_X86_32 | 885 | #ifdef CONFIG_X86_32 |
| @@ -912,8 +893,8 @@ static u8 __init uniq_ioapic_id(u8 id) | |||
| 912 | DECLARE_BITMAP(used, 256); | 893 | DECLARE_BITMAP(used, 256); |
| 913 | bitmap_zero(used, 256); | 894 | bitmap_zero(used, 256); |
| 914 | for (i = 0; i < nr_ioapics; i++) { | 895 | for (i = 0; i < nr_ioapics; i++) { |
| 915 | struct mp_config_ioapic *ia = &mp_ioapics[i]; | 896 | struct mpc_ioapic *ia = &mp_ioapics[i]; |
| 916 | __set_bit(ia->mp_apicid, used); | 897 | __set_bit(ia->apicid, used); |
| 917 | } | 898 | } |
| 918 | if (!test_bit(id, used)) | 899 | if (!test_bit(id, used)) |
| 919 | return id; | 900 | return id; |
| @@ -945,47 +926,70 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) | |||
| 945 | 926 | ||
| 946 | idx = nr_ioapics; | 927 | idx = nr_ioapics; |
| 947 | 928 | ||
| 948 | mp_ioapics[idx].mp_type = MP_IOAPIC; | 929 | mp_ioapics[idx].type = MP_IOAPIC; |
| 949 | mp_ioapics[idx].mp_flags = MPC_APIC_USABLE; | 930 | mp_ioapics[idx].flags = MPC_APIC_USABLE; |
| 950 | mp_ioapics[idx].mp_apicaddr = address; | 931 | mp_ioapics[idx].apicaddr = address; |
| 951 | 932 | ||
| 952 | set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); | 933 | set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); |
| 953 | mp_ioapics[idx].mp_apicid = uniq_ioapic_id(id); | 934 | mp_ioapics[idx].apicid = uniq_ioapic_id(id); |
| 954 | #ifdef CONFIG_X86_32 | 935 | #ifdef CONFIG_X86_32 |
| 955 | mp_ioapics[idx].mp_apicver = io_apic_get_version(idx); | 936 | mp_ioapics[idx].apicver = io_apic_get_version(idx); |
| 956 | #else | 937 | #else |
| 957 | mp_ioapics[idx].mp_apicver = 0; | 938 | mp_ioapics[idx].apicver = 0; |
| 958 | #endif | 939 | #endif |
| 959 | /* | 940 | /* |
| 960 | * Build basic GSI lookup table to facilitate gsi->io_apic lookups | 941 | * Build basic GSI lookup table to facilitate gsi->io_apic lookups |
| 961 | * and to prevent reprogramming of IOAPIC pins (PCI GSIs). | 942 | * and to prevent reprogramming of IOAPIC pins (PCI GSIs). |
| 962 | */ | 943 | */ |
| 963 | mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].mp_apicid; | 944 | mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].apicid; |
| 964 | mp_ioapic_routing[idx].gsi_base = gsi_base; | 945 | mp_ioapic_routing[idx].gsi_base = gsi_base; |
| 965 | mp_ioapic_routing[idx].gsi_end = gsi_base + | 946 | mp_ioapic_routing[idx].gsi_end = gsi_base + |
| 966 | io_apic_get_redir_entries(idx); | 947 | io_apic_get_redir_entries(idx); |
| 967 | 948 | ||
| 968 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%lx, " | 949 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " |
| 969 | "GSI %d-%d\n", idx, mp_ioapics[idx].mp_apicid, | 950 | "GSI %d-%d\n", idx, mp_ioapics[idx].apicid, |
| 970 | mp_ioapics[idx].mp_apicver, mp_ioapics[idx].mp_apicaddr, | 951 | mp_ioapics[idx].apicver, mp_ioapics[idx].apicaddr, |
| 971 | mp_ioapic_routing[idx].gsi_base, mp_ioapic_routing[idx].gsi_end); | 952 | mp_ioapic_routing[idx].gsi_base, mp_ioapic_routing[idx].gsi_end); |
| 972 | 953 | ||
| 973 | nr_ioapics++; | 954 | nr_ioapics++; |
| 974 | } | 955 | } |
| 975 | 956 | ||
| 976 | static void assign_to_mp_irq(struct mp_config_intsrc *m, | 957 | int __init acpi_probe_gsi(void) |
| 977 | struct mp_config_intsrc *mp_irq) | ||
| 978 | { | 958 | { |
| 979 | memcpy(mp_irq, m, sizeof(struct mp_config_intsrc)); | 959 | int idx; |
| 960 | int gsi; | ||
| 961 | int max_gsi = 0; | ||
| 962 | |||
| 963 | if (acpi_disabled) | ||
| 964 | return 0; | ||
| 965 | |||
| 966 | if (!acpi_ioapic) | ||
| 967 | return 0; | ||
| 968 | |||
| 969 | max_gsi = 0; | ||
| 970 | for (idx = 0; idx < nr_ioapics; idx++) { | ||
| 971 | gsi = mp_ioapic_routing[idx].gsi_end; | ||
| 972 | |||
| 973 | if (gsi > max_gsi) | ||
| 974 | max_gsi = gsi; | ||
| 975 | } | ||
| 976 | |||
| 977 | return max_gsi + 1; | ||
| 980 | } | 978 | } |
| 981 | 979 | ||
| 982 | static int mp_irq_cmp(struct mp_config_intsrc *mp_irq, | 980 | static void assign_to_mp_irq(struct mpc_intsrc *m, |
| 983 | struct mp_config_intsrc *m) | 981 | struct mpc_intsrc *mp_irq) |
| 984 | { | 982 | { |
| 985 | return memcmp(mp_irq, m, sizeof(struct mp_config_intsrc)); | 983 | memcpy(mp_irq, m, sizeof(struct mpc_intsrc)); |
| 986 | } | 984 | } |
| 987 | 985 | ||
| 988 | static void save_mp_irq(struct mp_config_intsrc *m) | 986 | static int mp_irq_cmp(struct mpc_intsrc *mp_irq, |
| 987 | struct mpc_intsrc *m) | ||
| 988 | { | ||
| 989 | return memcmp(mp_irq, m, sizeof(struct mpc_intsrc)); | ||
| 990 | } | ||
| 991 | |||
| 992 | static void save_mp_irq(struct mpc_intsrc *m) | ||
| 989 | { | 993 | { |
| 990 | int i; | 994 | int i; |
| 991 | 995 | ||
| @@ -1003,7 +1007,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) | |||
| 1003 | { | 1007 | { |
| 1004 | int ioapic; | 1008 | int ioapic; |
| 1005 | int pin; | 1009 | int pin; |
| 1006 | struct mp_config_intsrc mp_irq; | 1010 | struct mpc_intsrc mp_irq; |
| 1007 | 1011 | ||
| 1008 | /* | 1012 | /* |
| 1009 | * Convert 'gsi' to 'ioapic.pin'. | 1013 | * Convert 'gsi' to 'ioapic.pin'. |
| @@ -1011,7 +1015,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) | |||
| 1011 | ioapic = mp_find_ioapic(gsi); | 1015 | ioapic = mp_find_ioapic(gsi); |
| 1012 | if (ioapic < 0) | 1016 | if (ioapic < 0) |
| 1013 | return; | 1017 | return; |
| 1014 | pin = gsi - mp_ioapic_routing[ioapic].gsi_base; | 1018 | pin = mp_find_ioapic_pin(ioapic, gsi); |
| 1015 | 1019 | ||
| 1016 | /* | 1020 | /* |
| 1017 | * TBD: This check is for faulty timer entries, where the override | 1021 | * TBD: This check is for faulty timer entries, where the override |
| @@ -1021,13 +1025,13 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) | |||
| 1021 | if ((bus_irq == 0) && (trigger == 3)) | 1025 | if ((bus_irq == 0) && (trigger == 3)) |
| 1022 | trigger = 1; | 1026 | trigger = 1; |
| 1023 | 1027 | ||
| 1024 | mp_irq.mp_type = MP_INTSRC; | 1028 | mp_irq.type = MP_INTSRC; |
| 1025 | mp_irq.mp_irqtype = mp_INT; | 1029 | mp_irq.irqtype = mp_INT; |
| 1026 | mp_irq.mp_irqflag = (trigger << 2) | polarity; | 1030 | mp_irq.irqflag = (trigger << 2) | polarity; |
| 1027 | mp_irq.mp_srcbus = MP_ISA_BUS; | 1031 | mp_irq.srcbus = MP_ISA_BUS; |
| 1028 | mp_irq.mp_srcbusirq = bus_irq; /* IRQ */ | 1032 | mp_irq.srcbusirq = bus_irq; /* IRQ */ |
| 1029 | mp_irq.mp_dstapic = mp_ioapics[ioapic].mp_apicid; /* APIC ID */ | 1033 | mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */ |
| 1030 | mp_irq.mp_dstirq = pin; /* INTIN# */ | 1034 | mp_irq.dstirq = pin; /* INTIN# */ |
| 1031 | 1035 | ||
| 1032 | save_mp_irq(&mp_irq); | 1036 | save_mp_irq(&mp_irq); |
| 1033 | } | 1037 | } |
| @@ -1037,7 +1041,7 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
| 1037 | int i; | 1041 | int i; |
| 1038 | int ioapic; | 1042 | int ioapic; |
| 1039 | unsigned int dstapic; | 1043 | unsigned int dstapic; |
| 1040 | struct mp_config_intsrc mp_irq; | 1044 | struct mpc_intsrc mp_irq; |
| 1041 | 1045 | ||
| 1042 | #if defined (CONFIG_MCA) || defined (CONFIG_EISA) | 1046 | #if defined (CONFIG_MCA) || defined (CONFIG_EISA) |
| 1043 | /* | 1047 | /* |
| @@ -1062,7 +1066,7 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
| 1062 | ioapic = mp_find_ioapic(0); | 1066 | ioapic = mp_find_ioapic(0); |
| 1063 | if (ioapic < 0) | 1067 | if (ioapic < 0) |
| 1064 | return; | 1068 | return; |
| 1065 | dstapic = mp_ioapics[ioapic].mp_apicid; | 1069 | dstapic = mp_ioapics[ioapic].apicid; |
| 1066 | 1070 | ||
| 1067 | /* | 1071 | /* |
| 1068 | * Use the default configuration for the IRQs 0-15. Unless | 1072 | * Use the default configuration for the IRQs 0-15. Unless |
| @@ -1072,16 +1076,14 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
| 1072 | int idx; | 1076 | int idx; |
| 1073 | 1077 | ||
| 1074 | for (idx = 0; idx < mp_irq_entries; idx++) { | 1078 | for (idx = 0; idx < mp_irq_entries; idx++) { |
| 1075 | struct mp_config_intsrc *irq = mp_irqs + idx; | 1079 | struct mpc_intsrc *irq = mp_irqs + idx; |
| 1076 | 1080 | ||
| 1077 | /* Do we already have a mapping for this ISA IRQ? */ | 1081 | /* Do we already have a mapping for this ISA IRQ? */ |
| 1078 | if (irq->mp_srcbus == MP_ISA_BUS | 1082 | if (irq->srcbus == MP_ISA_BUS && irq->srcbusirq == i) |
| 1079 | && irq->mp_srcbusirq == i) | ||
| 1080 | break; | 1083 | break; |
| 1081 | 1084 | ||
| 1082 | /* Do we already have a mapping for this IOAPIC pin */ | 1085 | /* Do we already have a mapping for this IOAPIC pin */ |
| 1083 | if (irq->mp_dstapic == dstapic && | 1086 | if (irq->dstapic == dstapic && irq->dstirq == i) |
| 1084 | irq->mp_dstirq == i) | ||
| 1085 | break; | 1087 | break; |
| 1086 | } | 1088 | } |
| 1087 | 1089 | ||
| @@ -1090,13 +1092,13 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
| 1090 | continue; /* IRQ already used */ | 1092 | continue; /* IRQ already used */ |
| 1091 | } | 1093 | } |
| 1092 | 1094 | ||
| 1093 | mp_irq.mp_type = MP_INTSRC; | 1095 | mp_irq.type = MP_INTSRC; |
| 1094 | mp_irq.mp_irqflag = 0; /* Conforming */ | 1096 | mp_irq.irqflag = 0; /* Conforming */ |
| 1095 | mp_irq.mp_srcbus = MP_ISA_BUS; | 1097 | mp_irq.srcbus = MP_ISA_BUS; |
| 1096 | mp_irq.mp_dstapic = dstapic; | 1098 | mp_irq.dstapic = dstapic; |
| 1097 | mp_irq.mp_irqtype = mp_INT; | 1099 | mp_irq.irqtype = mp_INT; |
| 1098 | mp_irq.mp_srcbusirq = i; /* Identity mapped */ | 1100 | mp_irq.srcbusirq = i; /* Identity mapped */ |
| 1099 | mp_irq.mp_dstirq = i; | 1101 | mp_irq.dstirq = i; |
| 1100 | 1102 | ||
| 1101 | save_mp_irq(&mp_irq); | 1103 | save_mp_irq(&mp_irq); |
| 1102 | } | 1104 | } |
| @@ -1133,7 +1135,7 @@ int mp_register_gsi(u32 gsi, int triggering, int polarity) | |||
| 1133 | return gsi; | 1135 | return gsi; |
| 1134 | } | 1136 | } |
| 1135 | 1137 | ||
| 1136 | ioapic_pin = gsi - mp_ioapic_routing[ioapic].gsi_base; | 1138 | ioapic_pin = mp_find_ioapic_pin(ioapic, gsi); |
| 1137 | 1139 | ||
| 1138 | #ifdef CONFIG_X86_32 | 1140 | #ifdef CONFIG_X86_32 |
| 1139 | if (ioapic_renumber_irq) | 1141 | if (ioapic_renumber_irq) |
| @@ -1207,22 +1209,22 @@ int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin, | |||
| 1207 | u32 gsi, int triggering, int polarity) | 1209 | u32 gsi, int triggering, int polarity) |
| 1208 | { | 1210 | { |
| 1209 | #ifdef CONFIG_X86_MPPARSE | 1211 | #ifdef CONFIG_X86_MPPARSE |
| 1210 | struct mp_config_intsrc mp_irq; | 1212 | struct mpc_intsrc mp_irq; |
| 1211 | int ioapic; | 1213 | int ioapic; |
| 1212 | 1214 | ||
| 1213 | if (!acpi_ioapic) | 1215 | if (!acpi_ioapic) |
| 1214 | return 0; | 1216 | return 0; |
| 1215 | 1217 | ||
| 1216 | /* print the entry should happen on mptable identically */ | 1218 | /* print the entry should happen on mptable identically */ |
| 1217 | mp_irq.mp_type = MP_INTSRC; | 1219 | mp_irq.type = MP_INTSRC; |
| 1218 | mp_irq.mp_irqtype = mp_INT; | 1220 | mp_irq.irqtype = mp_INT; |
| 1219 | mp_irq.mp_irqflag = (triggering == ACPI_EDGE_SENSITIVE ? 4 : 0x0c) | | 1221 | mp_irq.irqflag = (triggering == ACPI_EDGE_SENSITIVE ? 4 : 0x0c) | |
| 1220 | (polarity == ACPI_ACTIVE_HIGH ? 1 : 3); | 1222 | (polarity == ACPI_ACTIVE_HIGH ? 1 : 3); |
| 1221 | mp_irq.mp_srcbus = number; | 1223 | mp_irq.srcbus = number; |
| 1222 | mp_irq.mp_srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3); | 1224 | mp_irq.srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3); |
| 1223 | ioapic = mp_find_ioapic(gsi); | 1225 | ioapic = mp_find_ioapic(gsi); |
| 1224 | mp_irq.mp_dstapic = mp_ioapic_routing[ioapic].apic_id; | 1226 | mp_irq.dstapic = mp_ioapic_routing[ioapic].apic_id; |
| 1225 | mp_irq.mp_dstirq = gsi - mp_ioapic_routing[ioapic].gsi_base; | 1227 | mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi); |
| 1226 | 1228 | ||
| 1227 | save_mp_irq(&mp_irq); | 1229 | save_mp_irq(&mp_irq); |
| 1228 | #endif | 1230 | #endif |
| @@ -1349,7 +1351,7 @@ static void __init acpi_process_madt(void) | |||
| 1349 | if (!error) { | 1351 | if (!error) { |
| 1350 | acpi_lapic = 1; | 1352 | acpi_lapic = 1; |
| 1351 | 1353 | ||
| 1352 | #ifdef CONFIG_X86_GENERICARCH | 1354 | #ifdef CONFIG_X86_BIGSMP |
| 1353 | generic_bigsmp_probe(); | 1355 | generic_bigsmp_probe(); |
| 1354 | #endif | 1356 | #endif |
| 1355 | /* | 1357 | /* |
| @@ -1361,9 +1363,8 @@ static void __init acpi_process_madt(void) | |||
| 1361 | acpi_ioapic = 1; | 1363 | acpi_ioapic = 1; |
| 1362 | 1364 | ||
| 1363 | smp_found_config = 1; | 1365 | smp_found_config = 1; |
| 1364 | #ifdef CONFIG_X86_32 | 1366 | if (apic->setup_apic_routing) |
| 1365 | setup_apic_routing(); | 1367 | apic->setup_apic_routing(); |
| 1366 | #endif | ||
| 1367 | } | 1368 | } |
| 1368 | } | 1369 | } |
| 1369 | if (error == -EINVAL) { | 1370 | if (error == -EINVAL) { |
