···234234extern void setup_local_APIC(void);235235extern void end_local_APIC_setup(void);236236extern void init_apic_mappings(void);237237+void register_lapic_address(unsigned long address);237238extern void setup_boot_APIC_clock(void);238239extern void setup_secondary_APIC_clock(void);239240extern int APIC_init_uniprocessor(void);···245244 * On 32bit this is mach-xxx local246245 */247246#ifdef CONFIG_X86_64248248-extern void early_init_lapic_mapping(void);249247extern int apic_is_clustered_box(void);250248#else251249static inline int apic_is_clustered_box(void)
···852852 * returns 0 on success, < 0 on error853853 */854854855855-static void __init acpi_register_lapic_address(unsigned long address)856856-{857857- mp_lapic_addr = address;858858-859859- set_fixmap_nocache(FIX_APIC_BASE, address);860860- if (boot_cpu_physical_apicid == -1U) {861861- boot_cpu_physical_apicid = read_apic_id();862862- apic_version[boot_cpu_physical_apicid] =863863- GET_APIC_VERSION(apic_read(APIC_LVR));864864- }865865-}866866-867855static int __init early_acpi_parse_madt_lapic_addr_ovr(void)868856{869857 int count;···873885 return count;874886 }875887876876- acpi_register_lapic_address(acpi_lapic_addr);888888+ register_lapic_address(acpi_lapic_addr);877889878890 return count;879891}···900912 return count;901913 }902914903903- acpi_register_lapic_address(acpi_lapic_addr);915915+ register_lapic_address(acpi_lapic_addr);904916905917 count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_SAPIC,906918 acpi_parse_sapic, MAX_LOCAL_APIC);···942954extern int es7000_plat;943955#endif944956945945-static void assign_to_mp_irq(struct mpc_intsrc *m,946946- struct mpc_intsrc *mp_irq)947947-{948948- memcpy(mp_irq, m, sizeof(struct mpc_intsrc));949949-}950950-951951-static int mp_irq_cmp(struct mpc_intsrc *mp_irq,952952- struct mpc_intsrc *m)953953-{954954- return memcmp(mp_irq, m, sizeof(struct mpc_intsrc));955955-}956956-957957-static void save_mp_irq(struct mpc_intsrc *m)958958-{959959- int i;960960-961961- for (i = 0; i < mp_irq_entries; i++) {962962- if (!mp_irq_cmp(&mp_irqs[i], m))963963- return;964964- }965965-966966- assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);967967- if (++mp_irq_entries == MAX_IRQ_SOURCES)968968- panic("Max # of irq sources exceeded!!\n");969969-}970970-971957void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)972958{973959 int ioapic;···9721010 mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */9731011 mp_irq.dstirq = pin; /* INTIN# */9741012975975- save_mp_irq(&mp_irq);10131013+ mp_save_irq(&mp_irq);97610149771015 isa_irq_to_gsi[bus_irq] = gsi;9781016}···10471085 mp_irq.srcbusirq = i; /* Identity mapped */10481086 mp_irq.dstirq = pin;1049108710501050- save_mp_irq(&mp_irq);10881088+ mp_save_irq(&mp_irq);10511089 }10521090}10531091···10841122 mp_irq.dstapic = mp_ioapics[ioapic].apicid;10851123 mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi);1086112410871087- save_mp_irq(&mp_irq);11251125+ mp_save_irq(&mp_irq);10881126#endif10891127 return 0;10901128}
+26-38
arch/x86/kernel/apic/apic.c
···11911191 oldvalue, value);11921192}1193119311941194-11951194/**11961195 * setup_local_APIC - setup the local APIC11961196+ *11971197+ * Used to setup local APIC while initializing BSP or bringin up APs.11981198+ * Always called with preemption disabled.11971199 */11981200void __cpuinit setup_local_APIC(void)11991201{12021202+ int cpu = smp_processor_id();12001203 unsigned int value, queued;12011204 int i, j, acked = 0;12021205 unsigned long long tsc = 0, ntsc;···12231220 }12241221#endif12251222 perf_events_lapic_init();12261226-12271227- preempt_disable();1228122312291224 /*12301225 * Double-check whether this APIC is really registered.···13391338 * TODO: set up through-local-APIC from through-I/O-APIC? --macro13401339 */13411340 value = apic_read(APIC_LVT0) & APIC_LVT_MASKED;13421342- if (!smp_processor_id() && (pic_mode || !value)) {13411341+ if (!cpu && (pic_mode || !value)) {13431342 value = APIC_DM_EXTINT;13441344- apic_printk(APIC_VERBOSE, "enabled ExtINT on CPU#%d\n",13451345- smp_processor_id());13431343+ apic_printk(APIC_VERBOSE, "enabled ExtINT on CPU#%d\n", cpu);13461344 } else {13471345 value = APIC_DM_EXTINT | APIC_LVT_MASKED;13481348- apic_printk(APIC_VERBOSE, "masked ExtINT on CPU#%d\n",13491349- smp_processor_id());13461346+ apic_printk(APIC_VERBOSE, "masked ExtINT on CPU#%d\n", cpu);13501347 }13511348 apic_write(APIC_LVT0, value);1352134913531350 /*13541351 * only the BP should see the LINT1 NMI signal, obviously.13551352 */13561356- if (!smp_processor_id())13531353+ if (!cpu)13571354 value = APIC_DM_NMI;13581355 else13591356 value = APIC_DM_NMI | APIC_LVT_MASKED;···13591360 value |= APIC_LVT_LEVEL_TRIGGER;13601361 apic_write(APIC_LVT1, value);1361136213621362- preempt_enable();13631363-13641363#ifdef CONFIG_X86_MCE_INTEL13651364 /* Recheck CMCI information after local APIC is up on CPU #0 */13661366- if (smp_processor_id() == 0)13651365+ if (!cpu)13671366 cmci_recheck();13681367#endif13691368}···16301633}16311634#endif1632163516331633-#ifdef CONFIG_X86_6416341634-void __init early_init_lapic_mapping(void)16351635-{16361636- /*16371637- * If no local APIC can be found then go out16381638- * : it means there is no mpatable and MADT16391639- */16401640- if (!smp_found_config)16411641- return;16421642-16431643- set_fixmap_nocache(FIX_APIC_BASE, mp_lapic_addr);16441644- apic_printk(APIC_VERBOSE, "mapped APIC to %16lx (%16lx)\n",16451645- APIC_BASE, mp_lapic_addr);16461646-16471647- /*16481648- * Fetch the APIC ID of the BSP in case we have a16491649- * default configuration (or the MP table is broken).16501650- */16511651- boot_cpu_physical_apicid = read_apic_id();16521652-}16531653-#endif16541654-16551636/**16561637 * init_apic_mappings - initialize APIC mappings16571638 */···16551680 * acpi_register_lapic_address()16561681 */16571682 if (!acpi_lapic && !smp_found_config)16581658- set_fixmap_nocache(FIX_APIC_BASE, apic_phys);16591659-16601660- apic_printk(APIC_VERBOSE, "mapped APIC to %08lx (%08lx)\n",16611661- APIC_BASE, apic_phys);16831683+ register_lapic_address(apic_phys);16621684 }1663168516641686 /*···16731701 * and disable smp mode16741702 */16751703 apic_version[new_apicid] =17041704+ GET_APIC_VERSION(apic_read(APIC_LVR));17051705+ }17061706+}17071707+17081708+void __init register_lapic_address(unsigned long address)17091709+{17101710+ mp_lapic_addr = address;17111711+17121712+ if (!x2apic_mode) {17131713+ set_fixmap_nocache(FIX_APIC_BASE, address);17141714+ apic_printk(APIC_VERBOSE, "mapped APIC to %16lx (%16lx)\n",17151715+ APIC_BASE, mp_lapic_addr);17161716+ }17171717+ if (boot_cpu_physical_apicid == -1U) {17181718+ boot_cpu_physical_apicid = read_apic_id();17191719+ apic_version[boot_cpu_physical_apicid] =16761720 GET_APIC_VERSION(apic_read(APIC_LVR));16771721 }16781722}
+26-2
arch/x86/kernel/apic/io_apic.c
···125125}126126early_param("noapic", parse_noapic);127127128128+/* Will be called in mpparse/acpi/sfi codes for saving IRQ info */129129+void mp_save_irq(struct mpc_intsrc *m)130130+{131131+ int i;132132+133133+ apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x,"134134+ " IRQ %02x, APIC ID %x, APIC INT %02x\n",135135+ m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus,136136+ m->srcbusirq, m->dstapic, m->dstirq);137137+138138+ for (i = 0; i < mp_irq_entries; i++) {139139+ if (!memcmp(&mp_irqs[i], m, sizeof(*m)))140140+ return;141141+ }142142+143143+ memcpy(&mp_irqs[mp_irq_entries], m, sizeof(*m));144144+ if (++mp_irq_entries == MAX_IRQ_SOURCES)145145+ panic("Max # of irq sources exceeded!!\n");146146+}147147+128148struct irq_pin_list {129149 int apic, pin;130150 struct irq_pin_list *next;···154134{155135 return kzalloc_node(sizeof(struct irq_pin_list), GFP_KERNEL, node);156136}137137+157138158139/* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */159140#ifdef CONFIG_SPARSE_IRQ···20272006 = mp_ioapics[apic_id].apicid;2028200720292008 /*20302030- * Read the right value from the MPC table and20312031- * write it into the ID register.20092009+ * Update the ID register according to the right value20102010+ * from the MPC table if they are different.20322011 */20122012+ if (mp_ioapics[apic_id].apicid == reg_00.bits.ID)20132013+ continue;20142014+20332015 apic_printk(APIC_VERBOSE, KERN_INFO20342016 "...changing IO-APIC physical APIC ID to %d ...",20352017 mp_ioapics[apic_id].apicid);
+11-103
arch/x86/kernel/mpparse.c
···118118119119static void __init MP_ioapic_info(struct mpc_ioapic *m)120120{121121- if (!(m->flags & MPC_APIC_USABLE))122122- return;123123-124124- printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n",125125- m->apicid, m->apicver, m->apicaddr);126126-127127- mp_register_ioapic(m->apicid, m->apicaddr, gsi_top);128128-}129129-130130-static void print_MP_intsrc_info(struct mpc_intsrc *m)131131-{132132- apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x,"133133- " IRQ %02x, APIC ID %x, APIC INT %02x\n",134134- m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus,135135- m->srcbusirq, m->dstapic, m->dstirq);121121+ if (m->flags & MPC_APIC_USABLE)122122+ mp_register_ioapic(m->apicid, m->apicaddr, gsi_top);136123}137124138125static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq)···131144 mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq);132145}133146134134-static void __init assign_to_mp_irq(struct mpc_intsrc *m,135135- struct mpc_intsrc *mp_irq)136136-{137137- mp_irq->dstapic = m->dstapic;138138- mp_irq->type = m->type;139139- mp_irq->irqtype = m->irqtype;140140- mp_irq->irqflag = m->irqflag;141141- mp_irq->srcbus = m->srcbus;142142- mp_irq->srcbusirq = m->srcbusirq;143143- mp_irq->dstirq = m->dstirq;144144-}145145-146146-static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq,147147- struct mpc_intsrc *m)148148-{149149- m->dstapic = mp_irq->dstapic;150150- m->type = mp_irq->type;151151- m->irqtype = mp_irq->irqtype;152152- m->irqflag = mp_irq->irqflag;153153- m->srcbus = mp_irq->srcbus;154154- m->srcbusirq = mp_irq->srcbusirq;155155- m->dstirq = mp_irq->dstirq;156156-}157157-158158-static int __init mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,159159- struct mpc_intsrc *m)160160-{161161- if (mp_irq->dstapic != m->dstapic)162162- return 1;163163- if (mp_irq->type != m->type)164164- return 2;165165- if (mp_irq->irqtype != m->irqtype)166166- return 3;167167- if (mp_irq->irqflag != m->irqflag)168168- return 4;169169- if (mp_irq->srcbus != m->srcbus)170170- return 5;171171- if (mp_irq->srcbusirq != m->srcbusirq)172172- return 6;173173- if (mp_irq->dstirq != m->dstirq)174174- return 7;175175-176176- return 0;177177-}178178-179179-static void __init MP_intsrc_info(struct mpc_intsrc *m)180180-{181181- int i;182182-183183- print_MP_intsrc_info(m);184184-185185- for (i = 0; i < mp_irq_entries; i++) {186186- if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m))187187- return;188188- }189189-190190- assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);191191- if (++mp_irq_entries == MAX_IRQ_SOURCES)192192- panic("Max # of irq sources exceeded!!\n");193193-}194147#else /* CONFIG_X86_IO_APIC */195148static inline void __init MP_bus_info(struct mpc_bus *m) {}196149static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {}197197-static inline void __init MP_intsrc_info(struct mpc_intsrc *m) {}198150#endif /* CONFIG_X86_IO_APIC */199199-200151201152static void __init MP_lintsrc_info(struct mpc_lintsrc *m)202153{···147222/*148223 * Read/parse the MPC149224 */150150-151225static int __init smp_check_mpc(struct mpc_table *mpc, char *oem, char *str)152226{153227···199275200276void __init default_smp_read_mpc_oem(struct mpc_table *mpc) { }201277202202-static void __init smp_register_lapic_address(unsigned long address)203203-{204204- mp_lapic_addr = address;205205-206206- set_fixmap_nocache(FIX_APIC_BASE, address);207207- if (boot_cpu_physical_apicid == -1U) {208208- boot_cpu_physical_apicid = read_apic_id();209209- apic_version[boot_cpu_physical_apicid] =210210- GET_APIC_VERSION(apic_read(APIC_LVR));211211- }212212-}213213-214278static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)215279{216280 char str[16];···213301#ifdef CONFIG_X86_32214302 generic_mps_oem_check(mpc, oem, str);215303#endif216216- /* save the local APIC address, it might be non-default */304304+ /* Initialize the lapic mapping */217305 if (!acpi_lapic)218218- mp_lapic_addr = mpc->lapic;306306+ register_lapic_address(mpc->lapic);219307220308 if (early)221309 return 1;222222-223223- /* Initialize the lapic mapping */224224- if (!acpi_lapic)225225- smp_register_lapic_address(mpc->lapic);226310227311 if (mpc->oemptr)228312 x86_init.mpparse.smp_read_mpc_oem(mpc);···245337 skip_entry(&mpt, &count, sizeof(struct mpc_ioapic));246338 break;247339 case MP_INTSRC:248248- MP_intsrc_info((struct mpc_intsrc *)mpt);340340+ mp_save_irq((struct mpc_intsrc *)mpt);249341 skip_entry(&mpt, &count, sizeof(struct mpc_intsrc));250342 break;251343 case MP_LINTSRC:···337429338430 intsrc.srcbusirq = i;339431 intsrc.dstirq = i ? i : 2; /* IRQ0 to INTIN2 */340340- MP_intsrc_info(&intsrc);432432+ mp_save_irq(&intsrc);341433 }342434343435 intsrc.irqtype = mp_ExtINT;344436 intsrc.srcbusirq = 0;345437 intsrc.dstirq = 0; /* 8259A to INTIN0 */346346- MP_intsrc_info(&intsrc);438438+ mp_save_irq(&intsrc);347439}348440349441···692784 int i;693785694786 apic_printk(APIC_VERBOSE, "OLD ");695695- print_MP_intsrc_info(m);787787+ print_mp_irq_info(m);696788697789 i = get_MP_intsrc_index(m);698790 if (i > 0) {699699- assign_to_mpc_intsrc(&mp_irqs[i], m);791791+ memcpy(m, &mp_irqs[i], sizeof(*m));700792 apic_printk(APIC_VERBOSE, "NEW ");701793 print_mp_irq_info(&mp_irqs[i]);702794 return;···783875 if (nr_m_spare > 0) {784876 apic_printk(APIC_VERBOSE, "*NEW* found\n");785877 nr_m_spare--;786786- assign_to_mpc_intsrc(&mp_irqs[i], m_spare[nr_m_spare]);878878+ memcpy(m_spare[nr_m_spare], &mp_irqs[i], sizeof(mp_irqs[i]));787879 m_spare[nr_m_spare] = NULL;788880 } else {789881 struct mpc_intsrc *m = (struct mpc_intsrc *)mpt;790882 count += sizeof(struct mpc_intsrc);791883 if (check_slot(mpc_new_phys, mpc_new_length, count) < 0)792884 goto out;793793- assign_to_mpc_intsrc(&mp_irqs[i], m);885885+ memcpy(m, &mp_irqs[i], sizeof(*m));794886 mpc->length = count;795887 mpt += sizeof(struct mpc_intsrc);796888 }
-1
arch/x86/mm/amdtopology_64.c
···6666 if (smp_found_config)6767 early_get_smp_config();6868#endif6969- early_init_lapic_mapping();7069}71707271int __init amd_get_nodes(struct bootnode *physnodes)
+2-28
arch/x86/platform/mrst/mrst.c
···7171EXPORT_SYMBOL_GPL(sfi_mrtc_array);7272int sfi_mrtc_num;73737474-static inline void assign_to_mp_irq(struct mpc_intsrc *m,7575- struct mpc_intsrc *mp_irq)7676-{7777- memcpy(mp_irq, m, sizeof(struct mpc_intsrc));7878-}7979-8080-static inline int mp_irq_cmp(struct mpc_intsrc *mp_irq,8181- struct mpc_intsrc *m)8282-{8383- return memcmp(mp_irq, m, sizeof(struct mpc_intsrc));8484-}8585-8686-static void save_mp_irq(struct mpc_intsrc *m)8787-{8888- int i;8989-9090- for (i = 0; i < mp_irq_entries; i++) {9191- if (!mp_irq_cmp(&mp_irqs[i], m))9292- return;9393- }9494-9595- assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);9696- if (++mp_irq_entries == MAX_IRQ_SOURCES)9797- panic("Max # of irq sources exceeded!!\n");9898-}9999-10074/* parse all the mtimer info to a static mtimer array */10175static int __init sfi_parse_mtmr(struct sfi_table_header *table)10276{···104130 mp_irq.srcbusirq = pentry->irq; /* IRQ */105131 mp_irq.dstapic = MP_APIC_ALL;106132 mp_irq.dstirq = pentry->irq;107107- save_mp_irq(&mp_irq);133133+ mp_save_irq(&mp_irq);108134 }109135110136 return 0;···174200 mp_irq.srcbusirq = pentry->irq; /* IRQ */175201 mp_irq.dstapic = MP_APIC_ALL;176202 mp_irq.dstirq = pentry->irq;177177- save_mp_irq(&mp_irq);203203+ mp_save_irq(&mp_irq);178204 }179205 return 0;180206}
+1-12
arch/x86/platform/sfi/sfi.c
···3434#ifdef CONFIG_X86_LOCAL_APIC3535static unsigned long sfi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;36363737-static void __init mp_sfi_register_lapic_address(unsigned long address)3838-{3939- mp_lapic_addr = address;4040-4141- set_fixmap_nocache(FIX_APIC_BASE, mp_lapic_addr);4242- if (boot_cpu_physical_apicid == -1U)4343- boot_cpu_physical_apicid = read_apic_id();4444-4545- pr_info("Boot CPU = %d\n", boot_cpu_physical_apicid);4646-}4747-4837/* All CPUs enumerated by SFI must be present and enabled */4938static void __cpuinit mp_sfi_register_lapic(u8 id)5039{···99110int __init sfi_platform_init(void)100111{101112#ifdef CONFIG_X86_LOCAL_APIC102102- mp_sfi_register_lapic_address(sfi_lapic_addr);113113+ register_lapic_address(sfi_lapic_addr);103114 sfi_table_parse(SFI_SIG_CPUS, NULL, NULL, sfi_parse_cpus);104115#endif105116#ifdef CONFIG_X86_IO_APIC