x86/apic-cleanups for v2.6.38
Linus,
Please pull the latest x86-apic-cleanups-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git x86-apic-cleanups-for-linus
Thanks,
Ingo
------------------>
Feng Tang (2):
x86: Unify 3 similar ways of saving mp_irqs info
x86: Further simplify mp_irq info handling
Tejun Heo (1):
x86: apic: Cleanup and simplify setup_local_APIC()
Yinghai Lu (6):
x86, apic: Unify identical register_lapic_address() functions x86, apic: Remove early_init_lapic_mapping()
x86, apic: Use register_lapic_address() in init_apic_mapping() x86, sfi: Use register_lapic_address()
x86, x2apic: Don't map lapic addr for preenabled x2apic systems x86, ioapic: Avoid writing io_apic id if already correct
arch/x86/include/asm/apic.h | 2 +- arch/x86/include/asm/io_apic.h | 3 + arch/x86/kernel/acpi/boot.c | 48 ++--------------- arch/x86/kernel/apic/apic.c | 64 +++++++++------------- arch/x86/kernel/apic/io_apic.c | 28 +++++++++- arch/x86/kernel/mpparse.c | 114 ++++------------------------------------ arch/x86/mm/amdtopology_64.c | 1 - arch/x86/platform/mrst/mrst.c | 30 +---------- arch/x86/platform/sfi/sfi.c | 13 +---- 9 files changed, 75 insertions(+), 228 deletions(-)
arch/x86/include/asm/apic.h +1 -1
@@ -234,6 +234,7 @@ extern void init_bsp_APIC(void);extern void setup_local_APIC (void );extern void end_local_APIC_setup (void );extern void init_apic_mappings (void ); +void register_lapic_address (unsigned long address);extern void setup_boot_APIC_clock (void );extern void setup_secondary_APIC_clock (void );extern int APIC_init_uniprocessor (void );
@@ -244,7 +245,6 @@ extern int apic_force_enable(void);* On 32bit this is mach-xxx local */ #ifdef CONFIG_X86_64 -extern void early_init_lapic_mapping (void );extern int apic_is_clustered_box (void );#else static inline int apic_is_clustered_box (void )
arch/x86/include/asm/io_apic.h +3 -0
@@ -169,6 +169,7 @@ extern void mask_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries);extern int restore_IO_APIC_setup (struct IO_APIC_route_entry **ioapic_entries);extern int get_nr_irqs_gsi (void ); +extern void setup_ioapic_ids_from_mpc (void );extern void setup_ioapic_ids_from_mpc_nocheck (void );
@@ -183,6 +184,8 @@ int mp_find_ioapic_pin(int ioapic, u32 gsi);void __init mp_register_ioapic (int id,u32 address,u32 gsi_base);extern void __init pre_init_apic_IRQ0 (void ); +extern void mp_save_irq (struct mpc_intsrc *m); +#else /* !CONFIG_X86_IO_APIC */ #define io_apic_assign_pci_irqs 0
arch/x86/kernel/acpi/boot.c +5 -43
90 lines not on this page · raw message
arch/x86/kernel/apic/apic.c +26 -38
122 lines not on this page · raw message
arch/x86/kernel/apic/io_apic.c +26 -2
@@ -125,6 +125,26 @@ static int __init parse_noapic(char *str) }early_param ("noapic" , parse_noapic); +/* Will be called in mpparse/acpi/sfi codes for saving IRQ info */ +void mp_save_irq (struct mpc_intsrc *m) +{ +int i; + +apic_printk (APIC_VERBOSE ,"Int: type %d, pol %d, trig %d, bus %02x," +" IRQ %02x, APIC ID %x, APIC INT %02x\n" , + m->irqtype, m->irqflag &3 , (m->irqflag >>2 ) &3 , m->srcbus, + m->srcbusirq, m->dstapic, m->dstirq); + +for (i =0 ; i < mp_irq_entries; i++) { +if (!memcmp (&mp_irqs[i], m,sizeof (*m))) +return ; + } + +memcpy (&mp_irqs[mp_irq_entries], m,sizeof (*m)); +if (++mp_irq_entries ==MAX_IRQ_SOURCES ) +panic ("Max # of irq sources exceeded!!\n" ); +} +struct irq_pin_list {int apic, pin;struct irq_pin_list *next;
@@ -135,6 +155,7 @@ static struct irq_pin_list *alloc_irq_pin_list(int node)return kzalloc_node (sizeof (struct irq_pin_list ),GFP_KERNEL , node); } +/* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */ #ifdef CONFIG_SPARSE_IRQ static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY ];
@@ -2006,9 +2027,12 @@ void __init setup_ioapic_ids_from_mpc_nocheck(void) = mp_ioapics[apic_id].apicid;/* -* Read the right value from the MPC table and -* write it into the ID register. +* Update the ID register according to the right value +* from the MPC table if they are different. */ +if (mp_ioapics[apic_id].apicid == reg_00.bits.ID) +continue ; +apic_printk (APIC_VERBOSE ,KERN_INFO "...changing IO-APIC physical APIC ID to %d ..." , mp_ioapics[apic_id].apicid);
arch/x86/kernel/mpparse.c +11 -103
192 lines not on this page · raw message
arch/x86/mm/amdtopology_64.c +0 -1
@@ -66,7 +66,6 @@ static __init void early_get_boot_cpu_id(void)if (smp_found_config)early_get_smp_config ();#endif -early_init_lapic_mapping (); }int __init amd_get_nodes (struct bootnode *physnodes)
arch/x86/platform/mrst/mrst.c +2 -28
@@ -71,32 +71,6 @@ struct sfi_rtc_table_entry sfi_mrtc_array[SFI_MRTC_MAX];EXPORT_SYMBOL_GPL (sfi_mrtc_array);int sfi_mrtc_num; -static inline void assign_to_mp_irq (struct mpc_intsrc *m, -struct mpc_intsrc *mp_irq) -{ -memcpy (mp_irq, m,sizeof (struct mpc_intsrc )); -} - -static inline int mp_irq_cmp (struct mpc_intsrc *mp_irq, -struct mpc_intsrc *m) -{ -return memcmp (mp_irq, m,sizeof (struct mpc_intsrc )); -} - -static void save_mp_irq (struct mpc_intsrc *m) -{ -int i; - -for (i =0 ; i < mp_irq_entries; i++) { -if (!mp_irq_cmp (&mp_irqs[i], m)) -return ; - } - -assign_to_mp_irq (m, &mp_irqs[mp_irq_entries]); -if (++mp_irq_entries ==MAX_IRQ_SOURCES ) -panic ("Max # of irq sources exceeded!!\n" ); -} -/* parse all the mtimer info to a static mtimer array */ static int __init sfi_parse_mtmr (struct sfi_table_header *table) {
@@ -130,7 +104,7 @@ static int __init sfi_parse_mtmr(struct sfi_table_header *table) mp_irq.srcbusirq = pentry->irq;/* IRQ */ mp_irq.dstapic =MP_APIC_ALL ; mp_irq.dstirq = pentry->irq; -save_mp_irq (&mp_irq); +mp_save_irq (&mp_irq); }return 0 ;
@@ -200,7 +174,7 @@ int __init sfi_parse_mrtc(struct sfi_table_header *table) mp_irq.srcbusirq = pentry->irq;/* IRQ */ mp_irq.dstapic =MP_APIC_ALL ; mp_irq.dstirq = pentry->irq; -save_mp_irq (&mp_irq); +mp_save_irq (&mp_irq); }return 0 ; }
arch/x86/platform/sfi/sfi.c +1 -12
@@ -34,17 +34,6 @@#ifdef CONFIG_X86_LOCAL_APIC static unsigned long sfi_lapic_addr__initdata =APIC_DEFAULT_PHYS_BASE ; -static void __init mp_sfi_register_lapic_address (unsigned long address) -{ - mp_lapic_addr = address; - -set_fixmap_nocache (FIX_APIC_BASE , mp_lapic_addr); -if (boot_cpu_physical_apicid ==-1U ) - boot_cpu_physical_apicid =read_apic_id (); - -pr_info ("Boot CPU = %d\n" , boot_cpu_physical_apicid); -} -/* All CPUs enumerated by SFI must be present and enabled */ static void __cpuinit mp_sfi_register_lapic (u8 id) {
@@ -110,7 +99,7 @@ static int __init sfi_parse_ioapic(struct sfi_table_header *table)int __init sfi_platform_init (void ) {#ifdef CONFIG_X86_LOCAL_APIC -mp_sfi_register_lapic_address (sfi_lapic_addr); +register_lapic_address (sfi_lapic_addr);sfi_table_parse (SFI_SIG_CPUS ,NULL ,NULL , sfi_parse_cpus);#endif #ifdef CONFIG_X86_IO_APIC