On Thursday 10 August 2006 15:36, Andi Kleen wrote:

> PIC mode is an outdated way to drive the APICs that was used on 
> some early MP boards. It is not supported in the ACPI model.
> 
> It is unlikely to be ever configured by any x86-64 system
> 
> Remove it thus.

Is there any reason we can't entirely remove MPS from x86_64?
(asside from the routines that ACPI uses)

-Len

> Signed-off-by: Andi Kleen <[EMAIL PROTECTED]>
> 
> ---
>  arch/x86_64/kernel/apic.c    |   92 
> +++++++++++++------------------------------
>  arch/x86_64/kernel/mpparse.c |    8 ---
>  arch/x86_64/kernel/smpboot.c |    1 
>  include/asm-x86_64/mpspec.h  |    1 
>  include/asm-x86_64/smp.h     |    1 
>  5 files changed, 29 insertions(+), 74 deletions(-)
> 
> Index: linux/arch/x86_64/kernel/apic.c
> ===================================================================
> --- linux.orig/arch/x86_64/kernel/apic.c
> +++ linux/arch/x86_64/kernel/apic.c
> @@ -136,72 +136,40 @@ void clear_local_APIC(void)
>       apic_read(APIC_ESR);
>  }
>  
> -void __init connect_bsp_APIC(void)
> -{
> -     if (pic_mode) {
> -             /*
> -              * Do not trust the local APIC being empty at bootup.
> -              */
> -             clear_local_APIC();
> -             /*
> -              * PIC mode, enable APIC mode in the IMCR, i.e.
> -              * connect BSP's local APIC to INT and NMI lines.
> -              */
> -             apic_printk(APIC_VERBOSE, "leaving PIC mode, enabling APIC 
> mode.\n");
> -             outb(0x70, 0x22);
> -             outb(0x01, 0x23);
> -     }
> -}
> -
>  void disconnect_bsp_APIC(int virt_wire_setup)
>  {
> -     if (pic_mode) {
> -             /*
> -              * Put the board back into PIC mode (has an effect
> -              * only on certain older boards).  Note that APIC
> -              * interrupts, including IPIs, won't work beyond
> -              * this point!  The only exception are INIT IPIs.
> -              */
> -             apic_printk(APIC_QUIET, "disabling APIC mode, entering PIC 
> mode.\n");
> -             outb(0x70, 0x22);
> -             outb(0x00, 0x23);
> -     }
> -     else {
> -             /* Go back to Virtual Wire compatibility mode */
> -             unsigned long value;
> -
> -             /* For the spurious interrupt use vector F, and enable it */
> -             value = apic_read(APIC_SPIV);
> -             value &= ~APIC_VECTOR_MASK;
> -             value |= APIC_SPIV_APIC_ENABLED;
> -             value |= 0xf;
> -             apic_write(APIC_SPIV, value);
> -
> -             if (!virt_wire_setup) {
> -                     /* For LVT0 make it edge triggered, active high, 
> external and enabled */
> -                     value = apic_read(APIC_LVT0);
> -                     value &= ~(APIC_MODE_MASK | APIC_SEND_PENDING |
> -                             APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR |
> -                             APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED );
> -                     value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
> -                     value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_EXTINT);
> -                     apic_write(APIC_LVT0, value);
> -             }
> -             else {
> -                     /* Disable LVT0 */
> -                     apic_write(APIC_LVT0, APIC_LVT_MASKED);
> -             }
> +     /* Go back to Virtual Wire compatibility mode */
> +     unsigned long value;
>  
> -             /* For LVT1 make it edge triggered, active high, nmi and 
> enabled */
> -             value = apic_read(APIC_LVT1);
> -             value &= ~(
> -                     APIC_MODE_MASK | APIC_SEND_PENDING |
> +     /* For the spurious interrupt use vector F, and enable it */
> +     value = apic_read(APIC_SPIV);
> +     value &= ~APIC_VECTOR_MASK;
> +     value |= APIC_SPIV_APIC_ENABLED;
> +     value |= 0xf;
> +     apic_write(APIC_SPIV, value);
> +
> +     if (!virt_wire_setup) {
> +             /* For LVT0 make it edge triggered, active high, external and 
> enabled */
> +             value = apic_read(APIC_LVT0);
> +             value &= ~(APIC_MODE_MASK | APIC_SEND_PENDING |
>                       APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR |
> -                     APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED);
> +                     APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED );
>               value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
> -             value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_NMI);
> -             apic_write(APIC_LVT1, value);
> +             value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_EXTINT);
> +             apic_write(APIC_LVT0, value);
> +     } else {
> +             /* Disable LVT0 */
> +             apic_write(APIC_LVT0, APIC_LVT_MASKED);
>       }
> +
> +     /* For LVT1 make it edge triggered, active high, nmi and enabled */
> +     value = apic_read(APIC_LVT1);
> +     value &= ~(APIC_MODE_MASK | APIC_SEND_PENDING |
> +                     APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR |
> +                     APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED);
> +     value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
> +     value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_NMI);
> +     apic_write(APIC_LVT1, value);
>  }
>  
>  void disable_local_APIC(void)
> @@ -418,7 +386,7 @@ void __cpuinit setup_local_APIC (void)
>        * TODO: set up through-local-APIC from through-I/O-APIC? --macro
>        */
>       value = apic_read(APIC_LVT0) & APIC_LVT_MASKED;
> -     if (!smp_processor_id() && (pic_mode || !value)) {
> +     if (!smp_processor_id() && !value) {
>               value = APIC_DM_EXTINT;
>               apic_printk(APIC_VERBOSE, "enabled ExtINT on CPU#%d\n", 
> smp_processor_id());
>       } else {
> @@ -1096,8 +1064,6 @@ int __init APIC_init_uniprocessor (void)
>  
>       verify_local_APIC();
>  
> -     connect_bsp_APIC();
> -
>       phys_cpu_present_map = physid_mask_of_physid(boot_cpu_id);
>       apic_write(APIC_ID, SET_APIC_ID(boot_cpu_id));
>  
> Index: linux/arch/x86_64/kernel/mpparse.c
> ===================================================================
> --- linux.orig/arch/x86_64/kernel/mpparse.c
> +++ linux/arch/x86_64/kernel/mpparse.c
> @@ -56,7 +56,6 @@ struct mpc_config_intsrc mp_irqs[MAX_IRQ
>  int mp_irq_entries;
>  
>  int nr_ioapics;
> -int pic_mode;
>  unsigned long mp_lapic_addr = 0;
>  
>  
> @@ -514,13 +513,6 @@ void __init get_smp_config (void)
>               printk(KERN_INFO "Using ACPI for processor (LAPIC) 
> configuration information\n");
>  
>       printk("Intel MultiProcessor Specification v1.%d\n", 
> mpf->mpf_specification);
> -     if (mpf->mpf_feature2 & (1<<7)) {
> -             printk(KERN_INFO "    IMCR and PIC compatibility mode.\n");
> -             pic_mode = 1;
> -     } else {
> -             printk(KERN_INFO "    Virtual Wire compatibility mode.\n");
> -             pic_mode = 0;
> -     }
>  
>       /*
>        * Now see if we need to read further.
> Index: linux/include/asm-x86_64/mpspec.h
> ===================================================================
> --- linux.orig/include/asm-x86_64/mpspec.h
> +++ linux/include/asm-x86_64/mpspec.h
> @@ -178,7 +178,6 @@ extern int mp_irq_entries;
>  extern struct mpc_config_intsrc mp_irqs [MAX_IRQ_SOURCES];
>  extern int mpc_default_type;
>  extern unsigned long mp_lapic_addr;
> -extern int pic_mode;
>  
>  #ifdef CONFIG_ACPI
>  extern void mp_register_lapic (u8 id, u8 enabled);
> Index: linux/include/asm-x86_64/smp.h
> ===================================================================
> --- linux.orig/include/asm-x86_64/smp.h
> +++ linux/include/asm-x86_64/smp.h
> @@ -33,7 +33,6 @@ extern cpumask_t cpu_initialized;
>   
>  extern void smp_alloc_memory(void);
>  extern volatile unsigned long smp_invalidate_needed;
> -extern int pic_mode;
>  extern void lock_ipi_call_lock(void);
>  extern void unlock_ipi_call_lock(void);
>  extern int smp_num_siblings;
> Index: linux/arch/x86_64/kernel/smpboot.c
> ===================================================================
> --- linux.orig/arch/x86_64/kernel/smpboot.c
> +++ linux/arch/x86_64/kernel/smpboot.c
> @@ -1090,7 +1090,6 @@ void __init smp_prepare_cpus(unsigned in
>       /*
>        * Switch from PIC to APIC mode.
>        */
> -     connect_bsp_APIC();
>       setup_local_APIC();
>  
>       if (GET_APIC_ID(apic_read(APIC_ID)) != boot_cpu_id) {
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [EMAIL PROTECTED]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
> 
-
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to