x86: Move es7000_plat out of mpparse.c
PATCH 1/5 x86: Move es7000_plat out of mpparse.c
---
arch/x86/kernel/mpparse.c | 11 ++++++----- arch/x86/mach-es7000/es7000plat.c | 2 ++ include/asm-x86/system.h | 1 - 3 files changed, 8 insertions(+), 6 deletions(-)
arch/x86/kernel/mpparse.c +6 -5
@@ -793,15 +793,14 @@ void __init find_smp_config(void)ACPI-based MP Configuration -------------------------------------------------------------------------- */ -/* -* Keep this outside and initialized to 0, for !CONFIG_ACPI builds: -*/ -int es7000_plat; -#ifdef CONFIG_ACPI #ifdef CONFIG_X86_IO_APIC +#if defined(CONFIG_X86_ES7000 ) || defined(CONFIG_X86_GENERICARCH ) +extern int es7000_plat; +#endif +#define MP_ISA_BUS 0static struct mp_ioapic_routing mp_ioapic_routing[MAX_IO_APICS ];
@@ -928,11 +927,13 @@ void __init mp_config_acpi_legacy_irqs(void)set_bit (MP_ISA_BUS , mp_bus_not_pci);Dprintk ("Bus #%d is ISA\n" ,MP_ISA_BUS ); +#if defined(CONFIG_X86_ES7000 ) || defined(CONFIG_X86_GENERICARCH )/* * Older generations of ES7000 have no legacy identity mappings */ if (es7000_plat ==1 )return ; +#endif /* * Locate the IOAPIC that manages the ISA IRQs (0-15).
arch/x86/mach-es7000/es7000plat.c +2 -0
@@ -52,6 +52,8 @@ static struct mip_reg *host_reg;static int mip_port;static unsigned long mip_addr, host_addr; +int es7000_plat; +/* * GSI override for ES7000 platforms. */
include/asm-x86/system.h +0 -1
@@ -318,7 +318,6 @@ static inline void clflush(volatile void *__p)void disable_hlt (void );void enable_hlt (void ); -extern int es7000_plat;void cpu_idle_wait (void );extern unsigned long arch_align_stack (unsigned long sp);
PATCH 2/5 x86: complete move ACPI from mpparse.c
---
arch/x86/kernel/acpi/boot.c | 304 +++++++++++++++++++++++++++++++++++++++++++ arch/x86/kernel/mpparse.c | 299 ------------------------------------------ 2 files changed, 305 insertions(+), 298 deletions(-)
arch/x86/kernel/acpi/boot.c +304 -0
@@ -844,6 +844,310 @@ static int __init acpi_parse_madt_lapic_entries(void)#endif /* CONFIG_X86_LOCAL_APIC */ #ifdef CONFIG_X86_IO_APIC +#define MP_ISA_BUS 0 + +#if defined(CONFIG_X86_ES7000 ) || defined(CONFIG_X86_GENERICARCH ) +extern int es7000_plat; +#endif + +static struct mp_ioapic_routing mp_ioapic_routing[MAX_IO_APICS ]; + +static int mp_find_ioapic (int gsi) +{ +int i =0 ; + +/* Find the IOAPIC that manages this GSI. */ +for (i =0 ; i < nr_ioapics; i++) { +if ((gsi >= mp_ioapic_routing[i].gsi_base) + && (gsi <= mp_ioapic_routing[i].gsi_end)) +return i; + } + +printk (KERN_ERR "ERROR: Unable to locate IOAPIC for GSI %d\n" , gsi); +return -1 ; +} + +static u8 __init uniq_ioapic_id (u8 id) +{ +#ifdef CONFIG_X86_32 +if ((boot_cpu_data.x86_vendor ==X86_VENDOR_INTEL ) && + !APIC_XAPIC (apic_version[boot_cpu_physical_apicid])) +return io_apic_get_unique_id (nr_ioapics, id); +else +return id; +#else +int i; +DECLARE_BITMAP (used,256 ); +bitmap_zero (used,256 ); +for (i =0 ; i < nr_ioapics; i++) { +struct mpc_config_ioapic *ia = &mp_ioapics[i]; +__set_bit (ia->mpc_apicid, used); + } +if (!test_bit (id, used)) +return id; +return find_first_zero_bit (used,256 ); +#endif +} + +static int bad_ioapic (unsigned long address) +{ +if (nr_ioapics >=MAX_IO_APICS ) { +printk (KERN_ERR "ERROR: Max # of I/O APICs (%d) exceeded " +"(found %d)\n" ,MAX_IO_APICS , nr_ioapics); +panic ("Recompile kernel with bigger MAX_IO_APICS!\n" ); + } +if (!address) { +printk (KERN_ERR "WARNING: Bogus (zero) I/O APIC address" +" found in table, skipping!\n" ); +return 1 ; + } +return 0 ; +} + +void __init mp_register_ioapic (int id,u32 address,u32 gsi_base) +{ +int idx =0 ; + +if (bad_ioapic (address)) +return ; + + idx = nr_ioapics; + + mp_ioapics[idx].mpc_type =MP_IOAPIC ; + mp_ioapics[idx].mpc_flags =MPC_APIC_USABLE ; + mp_ioapics[idx].mpc_apicaddr = address; + +set_fixmap_nocache (FIX_IO_APIC_BASE_0 + idx, address); + mp_ioapics[idx].mpc_apicid =uniq_ioapic_id (id); +#ifdef CONFIG_X86_32 + mp_ioapics[idx].mpc_apicver =io_apic_get_version (idx); +#else + mp_ioapics[idx].mpc_apicver =0 ; +#endif +/* +* Build basic GSI lookup table to facilitate gsi->io_apic lookups +* and to prevent reprogramming of IOAPIC pins (PCI GSIs). +*/ + mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].mpc_apicid; + mp_ioapic_routing[idx].gsi_base = gsi_base; + mp_ioapic_routing[idx].gsi_end = gsi_base + +io_apic_get_redir_entries (idx); + +printk (KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " +"GSI %d-%d\n" , idx, mp_ioapics[idx].mpc_apicid, + mp_ioapics[idx].mpc_apicver, mp_ioapics[idx].mpc_apicaddr, + mp_ioapic_routing[idx].gsi_base, mp_ioapic_routing[idx].gsi_end); + + nr_ioapics++; +} + +void __init mp_override_legacy_irq (u8 bus_irq,u8 polarity,u8 trigger,u32 gsi) +{ +int ioapic =-1 ; +int pin =-1 ; + +/* +* Convert 'gsi' to 'ioapic.pin'. +*/ + ioapic =mp_find_ioapic (gsi); +if (ioapic <0 ) +return ; + pin = gsi - mp_ioapic_routing[ioapic].gsi_base; + +/* +* TBD: This check is for faulty timer entries, where the override +* erroneously sets the trigger to level, resulting in a HUGE +* increase of timer interrupts! +*/ +if ((bus_irq ==0 ) && (trigger ==3 )) + trigger =1 ; + + mp_irqs[mp_irq_entries].mpc_type =MP_INTSRC ; + mp_irqs[mp_irq_entries].mpc_irqtype = mp_INT; + mp_irqs[mp_irq_entries].mpc_irqflag = (trigger <<2 ) | polarity; + mp_irqs[mp_irq_entries].mpc_srcbus =MP_ISA_BUS ; + mp_irqs[mp_irq_entries].mpc_srcbusirq = bus_irq;/* IRQ */ + mp_irqs[mp_irq_entries].mpc_dstapic = + mp_ioapics[ioapic].mpc_apicid;/* APIC ID */ + mp_irqs[mp_irq_entries].mpc_dstirq = pin;/* INTIN# */ + +if (++mp_irq_entries ==MAX_IRQ_SOURCES ) +panic ("Max # of irq sources exceeded!!\n" ); + +} + +void __init mp_config_acpi_legacy_irqs (void ) +{ +int i =0 ; +int ioapic =-1 ; + +#if defined (CONFIG_MCA ) || defined (CONFIG_EISA ) +/* +* Fabricate the legacy ISA bus (bus #31). +*/ + mp_bus_id_to_type[MP_ISA_BUS ] =MP_BUS_ISA ; +#endif +set_bit (MP_ISA_BUS , mp_bus_not_pci); +Dprintk ("Bus #%d is ISA\n" ,MP_ISA_BUS ); + +#if defined(CONFIG_X86_ES7000 ) || defined(CONFIG_X86_GENERICARCH ) +/* +* Older generations of ES7000 have no legacy identity mappings +*/ +if (es7000_plat ==1 ) +return ; +#endif + +/* +* Locate the IOAPIC that manages the ISA IRQs (0-15). +*/ + ioapic =mp_find_ioapic (0 ); +if (ioapic <0 ) +return ; + + mp_irqs[mp_irq_entries].mpc_type =MP_INTSRC ; + mp_irqs[mp_irq_entries].mpc_irqflag =0 ;/* Conforming */ + mp_irqs[mp_irq_entries].mpc_srcbus =MP_ISA_BUS ; +#ifdef CONFIG_X86_IO_APIC + mp_irqs[mp_irq_entries].mpc_dstapic = mp_ioapics[ioapic].mpc_apicid; +#endif +/* +* Use the default configuration for the IRQs 0-15. Unless +* overridden by (MADT) interrupt source override entries. +*/ +for (i =0 ; i <16 ; i++) { +int idx; + +for (idx =0 ; idx < mp_irq_entries; idx++) { +struct mpc_config_intsrc *irq = mp_irqs + idx; + +/* Do we already have a mapping for this ISA IRQ? */ +if (irq->mpc_srcbus ==MP_ISA_BUS + && irq->mpc_srcbusirq == i) +break ; + +/* Do we already have a mapping for this IOAPIC pin */ +if ((irq->mpc_dstapic == + mp_irqs[mp_irq_entries].mpc_dstapic) && + (irq->mpc_dstirq == i)) +break ; + } + +if (idx != mp_irq_entries) { +printk (KERN_DEBUG "ACPI: IRQ%d used by override.\n" , i); +continue ;/* IRQ already used */ + } + + mp_irqs[mp_irq_entries].mpc_irqtype = mp_INT; + mp_irqs[mp_irq_entries].mpc_srcbusirq = i;/* Identity mapped */ + mp_irqs[mp_irq_entries].mpc_dstirq = i; + +if (++mp_irq_entries ==MAX_IRQ_SOURCES ) +panic ("Max # of irq sources exceeded!!\n" ); + } +} + +int mp_register_gsi (u32 gsi,int triggering,int polarity) +{ +int ioapic; +int ioapic_pin; +#ifdef CONFIG_X86_32 +#define MAX_GSI_NUM 4096 +#define IRQ_COMPRESSION_START 64 + +static int pci_irq =IRQ_COMPRESSION_START ; +/* +* Mapping between Global System Interrupts, which +* represent all possible interrupts, and IRQs +* assigned to actual devices. +*/ +static int gsi_to_irq[MAX_GSI_NUM ]; +#else + +if (acpi_irq_model !=ACPI_IRQ_MODEL_IOAPIC ) +return gsi; +#endif + +/* Don't set up the ACPI SCI because it's already set up */ +if (acpi_gbl_FADT.sci_interrupt == gsi) +return gsi; + + ioapic =mp_find_ioapic (gsi); +if (ioapic <0 ) { +printk (KERN_WARNING "No IOAPIC for GSI %u\n" , gsi); +return gsi; + } + + ioapic_pin = gsi - mp_ioapic_routing[ioapic].gsi_base; + +#ifdef CONFIG_X86_32 +if (ioapic_renumber_irq) + gsi =ioapic_renumber_irq (ioapic, gsi); +#endif + +/* +* Avoid pin reprogramming. PRTs typically include entries +* with redundant pin->gsi mappings (but unique PCI devices); +* we only program the IOAPIC on the first. +*/ +if (ioapic_pin >MP_MAX_IOAPIC_PIN ) { +printk (KERN_ERR "Invalid reference to IOAPIC pin " +"%d-%d\n" , mp_ioapic_routing[ioapic].apic_id, + ioapic_pin); +return gsi; + } +if (test_bit (ioapic_pin, mp_ioapic_routing[ioapic].pin_programmed)) { +Dprintk (KERN_DEBUG "Pin %d-%d already programmed\n" , + mp_ioapic_routing[ioapic].apic_id, ioapic_pin); +#ifdef CONFIG_X86_32 +return (gsi <IRQ_COMPRESSION_START ? gsi : gsi_to_irq[gsi]); +#else +return gsi; +#endif + } + +set_bit (ioapic_pin, mp_ioapic_routing[ioapic].pin_programmed); +#ifdef CONFIG_X86_32 +/* +* For GSI >= 64, use IRQ compression +*/ +if ((gsi >=IRQ_COMPRESSION_START ) + && (triggering ==ACPI_LEVEL_SENSITIVE )) { +/* +* For PCI devices assign IRQs in order, avoiding gaps +* due to unused I/O APIC pins. +*/ +int irq = gsi; +if (gsi <MAX_GSI_NUM ) { +/* +* Retain the VIA chipset work-around (gsi > 15), but +* avoid a problem where the 8254 timer (IRQ0) is setup +* via an override (so it's not on pin 0 of the ioapic), +* and at the same time, the pin 0 interrupt is a PCI +* type. The gsi > 15 test could cause these two pins +* to be shared as IRQ0, and they are not shareable. +* So test for this condition, and if necessary, avoid +* the pin collision. +*/ + gsi = pci_irq++; +/* +* Don't assign IRQ used by ACPI SCI +*/ +if (gsi == acpi_gbl_FADT.sci_interrupt) + gsi = pci_irq++; + gsi_to_irq[irq] = gsi; + }else { +printk (KERN_ERR "GSI %u is too high\n" , gsi); +return gsi; + } + } +#endif +io_apic_set_pci_routing (ioapic, ioapic_pin, gsi, + triggering ==ACPI_EDGE_SENSITIVE ?0 :1 , + polarity ==ACPI_ACTIVE_HIGH ?0 :1 ); +return gsi; +} +/* * Parse IOAPIC related entries in MADT * returns 0 on success, < 0 on error
arch/x86/kernel/mpparse.c +1 -298
306 lines not on this page · raw message
PATCH 3/5 x86: make mp_ioapic_routing definition local
In reply to Alexey Starikovskiy---
arch/x86/kernel/acpi/boot.c | 7 ++++++- include/asm-x86/io_apic.h | 7 ------- 2 files changed, 6 insertions(+), 8 deletions(-)
arch/x86/kernel/acpi/boot.c +6 -1
@@ -850,7 +850,12 @@ static int __init acpi_parse_madt_lapic_entries(void)extern int es7000_plat;#endif -static struct mp_ioapic_routing mp_ioapic_routing[MAX_IO_APICS ]; +static struct { +int apic_id; +int gsi_base; +int gsi_end; + DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1); +} mp_ioapic_routing[MAX_IO_APICS ];static int mp_find_ioapic (int gsi) {
include/asm-x86/io_apic.h +0 -7
@@ -112,13 +112,6 @@ extern int nr_ioapic_registers[MAX_IO_APICS];#define MP_MAX_IOAPIC_PIN 127 -struct mp_ioapic_routing { -int apic_id; -int gsi_base; -int gsi_end; - DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1); -}; -/* I/O APIC entries */ extern struct mpc_config_ioapic mp_ioapics[MAX_IO_APICS ];
PATCH 4/5 x86: make struct config_ioapic not MPspec specific
In reply to Alexey Starikovskiy---
arch/x86/kernel/acpi/boot.c | 28 +++++++++++------------ arch/x86/kernel/apic_32.c | 2 +- arch/x86/kernel/io_apic_32.c | 52 +++++++++++++++++++++--------------------- arch/x86/kernel/io_apic_64.c | 26 +++++++++++---------- arch/x86/kernel/mpparse.c | 8 +++++- include/asm-x86/io_apic.h | 10 +++++++- 6 files changed, 69 insertions(+), 57 deletions(-)
arch/x86/kernel/acpi/boot.c +14 -14
@@ -885,8 +885,8 @@ static u8 __init uniq_ioapic_id(u8 id)DECLARE_BITMAP (used,256 );bitmap_zero (used,256 );for (i =0 ; i < nr_ioapics; i++) { -struct mpc_config_ioapic *ia = &mp_ioapics[i]; -__set_bit (ia->mpc_apicid, used); +struct mp_config_ioapic *ia = &mp_ioapics[i]; +__set_bit (ia->mp_apicid, used); }if (!test_bit (id, used))return id;
@@ -918,29 +918,29 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) idx = nr_ioapics; - mp_ioapics[idx].mpc_type =MP_IOAPIC ; - mp_ioapics[idx].mpc_flags =MPC_APIC_USABLE ; - mp_ioapics[idx].mpc_apicaddr = address; + mp_ioapics[idx].mp_type =MP_IOAPIC ; + mp_ioapics[idx].mp_flags =MPC_APIC_USABLE ; + mp_ioapics[idx].mp_apicaddr = address;set_fixmap_nocache (FIX_IO_APIC_BASE_0 + idx, address); - mp_ioapics[idx].mpc_apicid =uniq_ioapic_id (id); + mp_ioapics[idx].mp_apicid =uniq_ioapic_id (id);#ifdef CONFIG_X86_32 - mp_ioapics[idx].mpc_apicver =io_apic_get_version (idx); + mp_ioapics[idx].mp_apicver =io_apic_get_version (idx);#else - mp_ioapics[idx].mpc_apicver =0 ; + mp_ioapics[idx].mp_apicver =0 ;#endif /* * Build basic GSI lookup table to facilitate gsi->io_apic lookups * and to prevent reprogramming of IOAPIC pins (PCI GSIs). */ - mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].mpc_apicid; + mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].mp_apicid; mp_ioapic_routing[idx].gsi_base = gsi_base; mp_ioapic_routing[idx].gsi_end = gsi_base +io_apic_get_redir_entries (idx); -printk (KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " -"GSI %d-%d\n" , idx, mp_ioapics[idx].mpc_apicid, - mp_ioapics[idx].mpc_apicver, mp_ioapics[idx].mpc_apicaddr, +printk (KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%lx, " +"GSI %d-%d\n" , idx, mp_ioapics[idx].mp_apicid, + mp_ioapics[idx].mp_apicver, mp_ioapics[idx].mp_apicaddr, mp_ioapic_routing[idx].gsi_base, mp_ioapic_routing[idx].gsi_end); nr_ioapics++;
@@ -973,7 +973,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) mp_irqs[mp_irq_entries].mpc_srcbus =MP_ISA_BUS ; mp_irqs[mp_irq_entries].mpc_srcbusirq = bus_irq;/* IRQ */ mp_irqs[mp_irq_entries].mpc_dstapic = - mp_ioapics[ioapic].mpc_apicid;/* APIC ID */ + mp_ioapics[ioapic].mp_apicid;/* APIC ID */ mp_irqs[mp_irq_entries].mpc_dstirq = pin;/* INTIN# */ if (++mp_irq_entries ==MAX_IRQ_SOURCES )
@@ -1014,7 +1014,7 @@ void __init mp_config_acpi_legacy_irqs(void) mp_irqs[mp_irq_entries].mpc_irqflag =0 ;/* Conforming */ mp_irqs[mp_irq_entries].mpc_srcbus =MP_ISA_BUS ;#ifdef CONFIG_X86_IO_APIC - mp_irqs[mp_irq_entries].mpc_dstapic = mp_ioapics[ioapic].mpc_apicid; + mp_irqs[mp_irq_entries].mpc_dstapic = mp_ioapics[ioapic].mp_apicid;#endif /* * Use the default configuration for the IRQs 0-15. Unless
arch/x86/kernel/apic_32.c +1 -1
@@ -1206,7 +1206,7 @@ void __init init_apic_mappings(void)for (i =0 ; i < nr_ioapics; i++) {if (smp_found_config) { - ioapic_phys = mp_ioapics[i].mpc_apicaddr; + ioapic_phys = mp_ioapics[i].mp_apicaddr;if (!ioapic_phys) {printk (KERN_ERR "WARNING: bogus zero IO-APIC "
arch/x86/kernel/io_apic_32.c +26 -26
165 lines not on this page · raw message
arch/x86/kernel/io_apic_64.c +13 -13
@@ -108,7 +108,7 @@ DEFINE_SPINLOCK(vector_lock);int nr_ioapic_registers[MAX_IO_APICS ];/* I/O APIC entries */ -struct mpc_config_ioapic mp_ioapics[MAX_IO_APICS ]; +struct mp_config_ioapic mp_ioapics[MAX_IO_APICS ];int nr_ioapics;/* MP IRQ source entries */
@@ -144,7 +144,7 @@ struct io_apic { static __attribute_const__ struct io_apic __iomem *io_apic_base(int idx) {return (void __iomem *)__fix_to_virt (FIX_IO_APIC_BASE_0 + idx) - + (mp_ioapics[idx].mpc_apicaddr & ~PAGE_MASK ); + + (mp_ioapics[idx].mp_apicaddr & ~PAGE_MASK ); }static inline unsigned int io_apic_read (unsigned int apic,unsigned int reg)
@@ -458,7 +458,7 @@ static int find_irq_entry(int apic, int pin, int type)for (i =0 ; i < mp_irq_entries; i++)if (mp_irqs[i].mpc_irqtype == type && - (mp_irqs[i].mpc_dstapic == mp_ioapics[apic].mpc_apicid || + (mp_irqs[i].mpc_dstapic == mp_ioapics[apic].mp_apicid || mp_irqs[i].mpc_dstapic ==MP_APIC_ALL ) && mp_irqs[i].mpc_dstirq == pin)return i;
@@ -500,7 +500,7 @@ static int __init find_isa_irq_apic(int irq, int type)if (i < mp_irq_entries) {int apic;for (apic =0 ; apic < nr_ioapics; apic++) { -if (mp_ioapics[apic].mpc_apicid == mp_irqs[i].mpc_dstapic) +if (mp_ioapics[apic].mp_apicid == mp_irqs[i].mpc_dstapic)return apic; } }
@@ -528,7 +528,7 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin)int lbus = mp_irqs[i].mpc_srcbus;for (apic =0 ; apic < nr_ioapics; apic++) -if (mp_ioapics[apic].mpc_apicid == mp_irqs[i].mpc_dstapic || +if (mp_ioapics[apic].mp_apicid == mp_irqs[i].mpc_dstapic || mp_irqs[i].mpc_dstapic ==MP_APIC_ALL )break ;
@@ -850,7 +850,7 @@ static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq,apic_printk (APIC_VERBOSE ,KERN_DEBUG "IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> " "IRQ %d Mode:%i Active:%i)\n" , - apic, mp_ioapics[apic].mpc_apicid, pin, cfg->vector, + apic, mp_ioapics[apic].mp_apicid, pin, cfg->vector, irq, trigger, polarity);/*
@@ -891,10 +891,10 @@ static void __init setup_IO_APIC_irqs(void) idx =find_irq_entry (apic,pin,mp_INT);if (idx ==-1 ) {if (first_notcon) { -apic_printk (APIC_VERBOSE ,KERN_DEBUG " IO-APIC (apicid-pin) %d-%d" , mp_ioapics[apic].mpc_apicid, pin); +apic_printk (APIC_VERBOSE ,KERN_DEBUG " IO-APIC (apicid-pin) %d-%d" , mp_ioapics[apic].mp_apicid, pin); first_notcon =0 ; }else -apic_printk (APIC_VERBOSE ,", %d-%d" , mp_ioapics[apic].mpc_apicid, pin); +apic_printk (APIC_VERBOSE ,", %d-%d" , mp_ioapics[apic].mp_apicid, pin);continue ; }if (!first_notcon) {
@@ -969,7 +969,7 @@ void __apicdebuginit print_IO_APIC(void)printk (KERN_DEBUG "number of MP IRQ sources: %d.\n" , mp_irq_entries);for (i =0 ; i < nr_ioapics; i++)printk (KERN_DEBUG "number of IO-APIC #%d registers: %d.\n" , - mp_ioapics[i].mpc_apicid, nr_ioapic_registers[i]); + mp_ioapics[i].mp_apicid, nr_ioapic_registers[i]);/* * We are a bit conservative about what we expect. We have to
@@ -987,7 +987,7 @@ void __apicdebuginit print_IO_APIC(void)spin_unlock_irqrestore (&ioapic_lock, flags);printk ("\n" ); -printk (KERN_DEBUG "IO APIC #%d......\n" , mp_ioapics[apic].mpc_apicid); +printk (KERN_DEBUG "IO APIC #%d......\n" , mp_ioapics[apic].mp_apicid);printk (KERN_DEBUG ".... register #00: %08X\n" , reg_00.raw);printk (KERN_DEBUG "....... : physical APIC id: %02X\n" , reg_00.bits.ID);
@@ -1845,8 +1845,8 @@ static int ioapic_resume(struct sys_device *dev)spin_lock_irqsave (&ioapic_lock, flags); reg_00.raw =io_apic_read (dev->id,0 ); -if (reg_00.bits.ID != mp_ioapics[dev->id].mpc_apicid) { - reg_00.bits.ID = mp_ioapics[dev->id].mpc_apicid; +if (reg_00.bits.ID != mp_ioapics[dev->id].mp_apicid) { + reg_00.bits.ID = mp_ioapics[dev->id].mp_apicid;io_apic_write (dev->id,0 , reg_00.raw); }spin_unlock_irqrestore (&ioapic_lock, flags);
@@ -2340,7 +2340,7 @@ void __init ioapic_init_mappings(void) ioapic_res =ioapic_setup_resources ();for (i =0 ; i < nr_ioapics; i++) {if (smp_found_config) { - ioapic_phys = mp_ioapics[i].mpc_apicaddr; + ioapic_phys = mp_ioapics[i].mp_apicaddr; }else { ioapic_phys = (unsigned long )alloc_bootmem_pages (PAGE_SIZE );
arch/x86/kernel/mpparse.c +6 -2
@@ -176,7 +176,11 @@ static void __init MP_ioapic_info(struct mpc_config_ioapic *m)if (bad_ioapic (m->mpc_apicaddr))return ; - mp_ioapics[nr_ioapics] = *m; + mp_ioapics[nr_ioapics].mp_apicaddr = m->mpc_apicaddr; + mp_ioapics[nr_ioapics].mp_apicid = m->mpc_apicid; + mp_ioapics[nr_ioapics].mp_type = m->mpc_type; + mp_ioapics[nr_ioapics].mp_apicver = m->mpc_apicver; + mp_ioapics[nr_ioapics].mp_flags = m->mpc_flags; nr_ioapics++; }
@@ -426,7 +430,7 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type) intsrc.mpc_type =MP_INTSRC ; intsrc.mpc_irqflag =0 ;/* conforming */ intsrc.mpc_srcbus =0 ; - intsrc.mpc_dstapic = mp_ioapics[0 ].mpc_apicid; + intsrc.mpc_dstapic = mp_ioapics[0 ].mp_apicid; intsrc.mpc_irqtype = mp_INT;
include/asm-x86/io_apic.h +9 -1
@@ -112,8 +112,16 @@ extern int nr_ioapic_registers[MAX_IO_APICS];#define MP_MAX_IOAPIC_PIN 127 +struct mp_config_ioapic { +unsigned long mp_apicaddr; +unsigned int mp_apicid; +unsigned char mp_type; +unsigned char mp_apicver; +unsigned char mp_flags; +}; +/* I/O APIC entries */ -extern struct mpc_config_ioapic mp_ioapics[MAX_IO_APICS ]; +extern struct mp_config_ioapic mp_ioapics[MAX_IO_APICS ];/* # of MP IRQ source entries */ extern int mp_irq_entries;
PATCH 5/5 x86: make config_irqsrc not MPspec specific
In reply to Alexey Starikovskiy---
arch/x86/kernel/acpi/boot.c | 43 ++++++++++++++-------------- arch/x86/kernel/io_apic_32.c | 64 +++++++++++++++++++++--------------------- arch/x86/kernel/io_apic_64.c | 58 +++++++++++++++++++------------------- arch/x86/kernel/mpparse.c | 8 +++++ include/asm-x86/io_apic.h | 12 +++++++- 5 files changed, 100 insertions(+), 85 deletions(-)
arch/x86/kernel/acpi/boot.c +21 -22
@@ -967,14 +967,14 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)if ((bus_irq ==0 ) && (trigger ==3 )) trigger =1 ; - mp_irqs[mp_irq_entries].mpc_type =MP_INTSRC ; - mp_irqs[mp_irq_entries].mpc_irqtype = mp_INT; - mp_irqs[mp_irq_entries].mpc_irqflag = (trigger <<2 ) | polarity; - mp_irqs[mp_irq_entries].mpc_srcbus =MP_ISA_BUS ; - mp_irqs[mp_irq_entries].mpc_srcbusirq = bus_irq;/* IRQ */ - mp_irqs[mp_irq_entries].mpc_dstapic = + mp_irqs[mp_irq_entries].mp_type =MP_INTSRC ; + mp_irqs[mp_irq_entries].mp_irqtype = mp_INT; + mp_irqs[mp_irq_entries].mp_irqflag = (trigger <<2 ) | polarity; + mp_irqs[mp_irq_entries].mp_srcbus =MP_ISA_BUS ; + mp_irqs[mp_irq_entries].mp_srcbusirq = bus_irq;/* IRQ */ + mp_irqs[mp_irq_entries].mp_dstapic = mp_ioapics[ioapic].mp_apicid;/* APIC ID */ - mp_irqs[mp_irq_entries].mpc_dstirq = pin;/* INTIN# */ + mp_irqs[mp_irq_entries].mp_dstirq = pin;/* INTIN# */ if (++mp_irq_entries ==MAX_IRQ_SOURCES )panic ("Max # of irq sources exceeded!!\n" );
@@ -1010,12 +1010,11 @@ void __init mp_config_acpi_legacy_irqs(void)if (ioapic <0 )return ; - mp_irqs[mp_irq_entries].mpc_type =MP_INTSRC ; - mp_irqs[mp_irq_entries].mpc_irqflag =0 ;/* Conforming */ - mp_irqs[mp_irq_entries].mpc_srcbus =MP_ISA_BUS ; -#ifdef CONFIG_X86_IO_APIC - mp_irqs[mp_irq_entries].mpc_dstapic = mp_ioapics[ioapic].mp_apicid; -#endif + mp_irqs[mp_irq_entries].mp_type =MP_INTSRC ; + mp_irqs[mp_irq_entries].mp_irqflag =0 ;/* Conforming */ + mp_irqs[mp_irq_entries].mp_srcbus =MP_ISA_BUS ; + mp_irqs[mp_irq_entries].mp_dstapic = mp_ioapics[ioapic].mp_apicid; +/* * Use the default configuration for the IRQs 0-15. Unless * overridden by (MADT) interrupt source override entries.
@@ -1024,17 +1023,17 @@ void __init mp_config_acpi_legacy_irqs(void)int idx;for (idx =0 ; idx < mp_irq_entries; idx++) { -struct mpc_config_intsrc *irq = mp_irqs + idx; +struct mp_config_intsrc *irq = mp_irqs + idx;/* Do we already have a mapping for this ISA IRQ? */ -if (irq->mpc_srcbus ==MP_ISA_BUS - && irq->mpc_srcbusirq == i) +if (irq->mp_srcbus ==MP_ISA_BUS + && irq->mp_srcbusirq == i)break ;/* Do we already have a mapping for this IOAPIC pin */ -if ((irq->mpc_dstapic == - mp_irqs[mp_irq_entries].mpc_dstapic) && - (irq->mpc_dstirq == i)) +if ((irq->mp_dstapic == + mp_irqs[mp_irq_entries].mp_dstapic) && + (irq->mp_dstirq == i))break ; }
@@ -1043,9 +1042,9 @@ void __init mp_config_acpi_legacy_irqs(void)continue ;/* IRQ already used */ } - mp_irqs[mp_irq_entries].mpc_irqtype = mp_INT; - mp_irqs[mp_irq_entries].mpc_srcbusirq = i;/* Identity mapped */ - mp_irqs[mp_irq_entries].mpc_dstirq = i; + mp_irqs[mp_irq_entries].mp_irqtype = mp_INT; + mp_irqs[mp_irq_entries].mp_srcbusirq = i;/* Identity mapped */ + mp_irqs[mp_irq_entries].mp_dstirq = i;if (++mp_irq_entries ==MAX_IRQ_SOURCES )panic ("Max # of irq sources exceeded!!\n" );
arch/x86/kernel/io_apic_32.c +32 -32
167 lines not on this page · raw message
arch/x86/kernel/io_apic_64.c +29 -29
149 lines not on this page · raw message
arch/x86/kernel/mpparse.c +7 -1
@@ -186,12 +186,18 @@ static void __init MP_ioapic_info(struct mpc_config_ioapic *m)static void __init MP_intsrc_info (struct mpc_config_intsrc *m) { - mp_irqs[mp_irq_entries] = *m;printk (KERN_INFO "Int: type %d, pol %d, trig %d, bus %02x," " IRQ %02x, APIC ID %x, APIC INT %02x\n" , m->mpc_irqtype, m->mpc_irqflag &3 , (m->mpc_irqflag >>2 ) &3 , m->mpc_srcbus, m->mpc_srcbusirq, m->mpc_dstapic, m->mpc_dstirq); + mp_irqs[mp_irq_entries].mp_dstapic = m->mpc_dstapic; + mp_irqs[mp_irq_entries].mp_type = m->mpc_type; + mp_irqs[mp_irq_entries].mp_irqtype = m->mpc_irqtype; + mp_irqs[mp_irq_entries].mp_irqflag = m->mpc_irqflag; + mp_irqs[mp_irq_entries].mp_srcbus = m->mpc_srcbus; + mp_irqs[mp_irq_entries].mp_srcbusirq = m->mpc_srcbusirq; + mp_irqs[mp_irq_entries].mp_dstirq = m->mpc_dstirq;if (++mp_irq_entries ==MAX_IRQ_SOURCES )panic ("Max # of irq sources exceeded!!\n" ); }
include/asm-x86/io_apic.h +11 -1
@@ -120,6 +120,16 @@ struct mp_config_ioapic {unsigned char mp_flags; }; +struct mp_config_intsrc { +unsigned int mp_dstapic; +unsigned char mp_type; +unsigned char mp_irqtype; +unsigned short mp_irqflag; +unsigned char mp_srcbus; +unsigned char mp_srcbusirq; +unsigned char mp_dstirq; +}; +/* I/O APIC entries */ extern struct mp_config_ioapic mp_ioapics[MAX_IO_APICS ];
@@ -127,7 +137,7 @@ extern struct mp_config_ioapic mp_ioapics[MAX_IO_APICS];extern int mp_irq_entries;/* MP IRQ source entries */ -extern struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES ]; +extern struct mp_config_intsrc mp_irqs[MAX_IRQ_SOURCES ];/* non-0 if default (table-less) MP configuration */ extern int mpc_default_type;
Ingo Molnar
Appliedapplied, thanks Alexey.
Ingo
Quoted 1 line · Ingo Molnar
applied, thanks Alexey.
btw., this VISWS config still fails to build on latest -tip, and i think it's due to your earlier changes:
http://redhat.com/~mingo/misc/config-Fri_May_16_14_50_15_CEST_2008.bad
you can pick up -tip via:
http://people.redhat.com/mingo/tip.git/README
check out the auto-latest branch.
Ingo
the build failure is:
arch/x86/kernel/built-in.o: In function `init_apic_mappings':
: undefined reference to boot_cpu_physical_apicid' arch/x86/kernel/built-in.o: In function init_apic_mappings':
: undefined reference to boot_cpu_physical_apicid' arch/x86/kernel/built-in.o: In function APIC_init_uniprocessor':
: undefined reference to boot_cpu_physical_apicid' arch/x86/kernel/built-in.o: In function APIC_init_uniprocessor':
: undefined reference to boot_cpu_physical_apicid' arch/x86/kernel/built-in.o: In function APIC_init_uniprocessor':
: undefined reference to phys_cpu_present_map' arch/x86/kernel/built-in.o: In function setup_local_APIC':
: undefined reference to phys_cpu_present_map' arch/x86/kernel/built-in.o: In function generic_processor_info':
: undefined reference to phys_cpu_present_map' arch/x86/kernel/built-in.o: In function generic_processor_info':
: undefined reference to num_processors' arch/x86/kernel/built-in.o: In function generic_processor_info':
: undefined reference to num_processors' arch/x86/mach-visws/built-in.o: In function find_smp_config':
: undefined reference to boot_cpu_physical_apicid' arch/x86/mach-visws/built-in.o: In function find_smp_config':
: undefined reference to `phys_cpu_present_map'
Ingo,
I seem to have lost the track of changes... Why the ifdef LOCAL_APIC was switched to MPPARSE?
Reverting it back makes the error to go away...
arch/x86/kernel/setup.c +0 -0
@@ -12,7 +12,7 @@
#include <asm/mpspec.h>
#include <asm/apicdef.h>
-#ifdef CONFIG_X86_MPPARSE
+#ifdef CONFIG_X86_LOCAL_APIC
unsigned int num_processors;
unsigned disabled_cpus __cpuinitdata;
Quoted 25 lines · Ingo Molnar
the build failure is:
arch/x86/kernel/built-in.o: In function `init_apic_mappings':
: undefined reference toboot_cpu_physical_apicid' arch/x86/kernel/built-in.o: In functioninit_apic_mappings':
: undefined reference toboot_cpu_physical_apicid' arch/x86/kernel/built-in.o: In functionAPIC_init_uniprocessor':
: undefined reference toboot_cpu_physical_apicid' arch/x86/kernel/built-in.o: In functionAPIC_init_uniprocessor':
: undefined reference toboot_cpu_physical_apicid' arch/x86/kernel/built-in.o: In functionAPIC_init_uniprocessor':
: undefined reference tophys_cpu_present_map' arch/x86/kernel/built-in.o: In functionsetup_local_APIC':
: undefined reference tophys_cpu_present_map' arch/x86/kernel/built-in.o: In functiongeneric_processor_info':
: undefined reference tophys_cpu_present_map' arch/x86/kernel/built-in.o: In functiongeneric_processor_info':
: undefined reference tonum_processors' arch/x86/kernel/built-in.o: In functiongeneric_processor_info':
: undefined reference tonum_processors' arch/x86/mach-visws/built-in.o: In functionfind_smp_config':
: undefined reference toboot_cpu_physical_apicid' arch/x86/mach-visws/built-in.o: In functionfind_smp_config':
: undefined reference to `phys_cpu_present_map'
Quoted 5 lines · Alexey Starikovskiy
Ingo,
I seem to have lost the track of changes... Why the ifdefLOCAL_APICwas switched to MPPARSE?Reverting it back makes the error to go away...
ok - this is indeed merge damage - fixed it up in latest -tip.
Ingo