]> git.hungrycats.org Git - linux/commitdiff
[ACPI] share i386/kernel/acpi/boot.c with x86_64
authorLen Brown <len.brown@intel.com>
Mon, 22 Mar 2004 20:33:54 +0000 (15:33 -0500)
committerLen Brown <lenb@dhcppc3.>
Mon, 22 Mar 2004 20:33:54 +0000 (15:33 -0500)
arch/i386/kernel/acpi/boot.c
arch/x86_64/kernel/Makefile
arch/x86_64/kernel/acpi/Makefile
arch/x86_64/kernel/mpparse.c
arch/x86_64/kernel/setup.c
drivers/acpi/Kconfig
drivers/acpi/bus.c
include/asm-x86_64/mpspec.h

index 702e85b4ea8ff3752a0935e269616aa05f0123f8..9ee56b5fd4d8d112f29cdd2516c64016374f9a83 100644 (file)
 #include <asm/irq.h>
 #include <asm/mpspec.h>
 
-#ifdef CONFIG_X86_LOCAL_APIC
+#ifdef CONFIG_X86_64
+
+static inline void  acpi_madt_oem_check(char *oem_id, char *oem_table_id) { }
+static inline void clustered_apic_check(void) { }
+static inline int ioapic_setup_disabled(void) { return 0; }
+#include <asm/proto.h>
+
+#else  /* X86 */
+
+#ifdef CONFIG_X86_LOCAL_APIC
 #include <mach_apic.h>
 #include <mach_mpparse.h>
-#include <asm/io_apic.h>
-#endif
+#endif /* CONFIG_X86_LOCAL_APIC */
+
+#endif /* X86 */
 
 #define PREFIX                 "ACPI: "
 
@@ -67,6 +77,22 @@ static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
  */
 enum acpi_irq_model_id         acpi_irq_model = ACPI_IRQ_MODEL_PIC;
 
+#ifdef CONFIG_X86_64
+
+/* rely on all ACPI tables being in the direct mapping */
+char *__acpi_map_table(unsigned long phys_addr, unsigned long size)
+{
+       if (!phys_addr || !size)
+       return NULL;
+
+       if (phys_addr < (end_pfn_map << PAGE_SHIFT))
+               return __va(phys_addr);
+
+       return NULL;
+}
+
+#else
+
 /*
  * Temporarily use the virtual area starting from FIX_IO_APIC_BASE_END,
  * to map the target physical address. The problem is that set_fixmap()
@@ -106,7 +132,7 @@ char *__acpi_map_table(unsigned long phys, unsigned long size)
 
        return ((unsigned char *) base + offset);
 }
-
+#endif
 
 #ifdef CONFIG_PCI_MMCONFIG
 static int __init acpi_parse_mcfg(unsigned long phys_addr, unsigned long size)
@@ -432,7 +458,6 @@ static int __init acpi_parse_sbf(unsigned long phys_addr, unsigned long size)
 
 
 #ifdef CONFIG_HPET_TIMER
-extern unsigned long hpet_address;
 
 static int __init acpi_parse_hpet(unsigned long phys, unsigned long size)
 {
@@ -453,16 +478,31 @@ static int __init acpi_parse_hpet(unsigned long phys, unsigned long size)
                return -1;
        }
 
-       hpet_address = hpet_tbl->addr.addrl;
-       printk(KERN_INFO PREFIX "HPET id: %#x base: %#lx\n", hpet_tbl->id,
-              hpet_address);
+#ifdef CONFIG_X86_64
+        vxtime.hpet_address = hpet_tbl->addr.addrl |
+                ((long) hpet_tbl->addr.addrh << 32);
+
+        printk(KERN_INFO PREFIX "HPET id: %#x base: %#lx\n",
+               hpet_tbl->id, vxtime.hpet_address);
+#else  /* X86 */
+       {
+               extern unsigned long hpet_address;
+
+               hpet_address = hpet_tbl->addr.addrl;
+               printk(KERN_INFO PREFIX "HPET id: %#x base: %#lx\n",
+                       hpet_tbl->id, hpet_address);
+       }
+#endif /* X86 */
+
        return 0;
 }
 #else
 #define        acpi_parse_hpet NULL
 #endif
 
+#ifdef CONFIG_X86_PM_TIMER
 extern u32 pmtmr_ioport;
+#endif
 
 static int __init acpi_parse_fadt(unsigned long phys, unsigned long size)
 {
@@ -589,7 +629,7 @@ acpi_parse_madt_ioapic_entries(void)
        /*
         * if "noapic" boot option, don't look for IO-APICs
         */
-       if (ioapic_setup_disabled()) {
+       if (skip_ioapic_setup) {
                printk(KERN_INFO PREFIX "Skipping IOAPIC probe "
                        "due to 'noapic' option.\n");
                return -ENODEV;
index dfda7ff646186590dd1f3eff6e045769b4868eb9..e3cb555035edfe07d9afd5f88418d76d45c2db30 100644 (file)
@@ -11,7 +11,7 @@ obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \
 obj-y += mce.o
 
 obj-$(CONFIG_MTRR)             += ../../i386/kernel/cpu/mtrr/
-obj-$(CONFIG_ACPI)             += acpi/
+obj-$(CONFIG_ACPI_BOOT)                += acpi/
 obj-$(CONFIG_X86_MSR)          += msr.o
 obj-$(CONFIG_MICROCODE)                += microcode.o
 obj-$(CONFIG_X86_CPUID)                += cpuid.o
index 2cf76a941847f022c6a5cfc1f22b416e466c7f87..d2c2ee5f9a88fdcb42a5b00f1bbda0b5da7b82a5 100644 (file)
@@ -1,3 +1,3 @@
 obj-$(CONFIG_ACPI_BOOT)                := boot.o
+boot-$(CONFIG_ACPI_BOOT)       := ../../../i386/kernel/acpi/boot.o
 obj-$(CONFIG_ACPI_SLEEP)       += sleep.o wakeup.o
-
index 05f12015619293a866c4da5e385e9dde79d4e249..541b5b7544153b8da466dbde017928640d5b7d3c 100644 (file)
@@ -890,69 +890,6 @@ void __init mp_config_acpi_legacy_irqs (void)
 
 extern FADT_DESCRIPTOR acpi_fadt;
 
-void __init mp_config_ioapic_for_sci(int irq)
-{
-       int ioapic;
-       int ioapic_pin;
-       struct acpi_table_madt *madt;
-       struct acpi_table_int_src_ovr *entry = NULL;
-       acpi_interrupt_flags flags;
-       void *madt_end;
-       acpi_status status;
-
-       /*
-        * Ensure that if there is an interrupt source override entry
-        * for the ACPI SCI, we leave it as is. Unfortunately this involves
-        * walking the MADT again.
-        */
-       status = acpi_get_firmware_table("APIC", 1, ACPI_LOGICAL_ADDRESSING,
-               (struct acpi_table_header **) &madt);
-       if (ACPI_SUCCESS(status)) {
-               madt_end = (void *) (unsigned long)madt + madt->header.length;
-
-               entry = (struct acpi_table_int_src_ovr *)
-                ((unsigned long) madt + sizeof(struct acpi_table_madt));
-
-               while ((void *) entry < madt_end) {
-                       if (entry->header.type == ACPI_MADT_INT_SRC_OVR &&
-                           acpi_fadt.sci_int == entry->bus_irq)
-                               goto found;
-                       
-                       entry = (struct acpi_table_int_src_ovr *)
-                               ((unsigned long) entry + entry->header.length);
-               }
-       }
-       /*
-        * Although the ACPI spec says that the SCI should be level/low
-        * don't reprogram it unless there is an explicit MADT OVR entry
-        * instructing us to do so -- otherwise we break Tyan boards which
-        * have the SCI wired edge/high but no MADT OVR.
-        */
-       return;
-
-found:
-       /*
-        * See the note at the end of ACPI 2.0b section
-        * 5.2.10.8 for what this is about.
-        */
-       flags = entry->flags;
-       acpi_fadt.sci_int = entry->global_irq;
-       irq = entry->global_irq;
-
-       ioapic = mp_find_ioapic(irq);
-
-       ioapic_pin = irq - mp_ioapic_routing[ioapic].irq_start;
-
-       /*
-        * MPS INTI flags:
-        *  trigger: 0=default, 1=edge, 3=level
-        *  polarity: 0=default, 1=high, 3=low
-        * Per ACPI spec, default for SCI means level/low.
-        */
-       io_apic_set_pci_routing(ioapic, ioapic_pin, irq, 
-               (flags.trigger == 1 ? 0 : 1), (flags.polarity == 1 ? 0 : 1));
-}
-
 #ifdef CONFIG_ACPI_PCI
 
 void __init mp_parse_prt (void)
index f60dda76deec6d82df5b0a8560791c1010a4a93d..71ca817d6ed8d964313b3ae88d4e48421e388449 100644 (file)
@@ -68,6 +68,7 @@ int acpi_disabled = 0;
 
 #ifdef CONFIG_ACPI_BOOT
 extern int __initdata acpi_ht;
+extern acpi_interrupt_flags    acpi_sci_flags;
 /* int __initdata acpi_force = 0; */
 #endif
 
@@ -229,6 +230,17 @@ static __init void parse_cmdline_early (char ** cmdline_p)
                if (!memcmp(from, "acpi=ht", 7)) { 
                        acpi_ht = 1; 
                }
+                else if (!memcmp(from, "pci=noacpi", 10)) 
+                        acpi_noirq_set();
+
+               else if (!memcmp(from, "acpi_sci=edge", 13))
+                       acpi_sci_flags.trigger =  1;
+               else if (!memcmp(from, "acpi_sci=level", 14))
+                       acpi_sci_flags.trigger = 3;
+               else if (!memcmp(from, "acpi_sci=high", 13))
+                       acpi_sci_flags.polarity = 1;
+               else if (!memcmp(from, "acpi_sci=low", 12))
+                       acpi_sci_flags.polarity = 3;
 #endif
 
                if (!memcmp(from, "nolapic", 7) ||
index 2f73841b2df5f58d901761687c7e38a3bcde623e..1a537e08ec85e79238b258603b0621959a8d2892 100644 (file)
@@ -255,6 +255,7 @@ config X86_PM_TIMER
        bool "Power Management Timer Support"
        depends on X86 && ACPI
        depends on ACPI_BOOT && EXPERIMENTAL
+       depends on !X86_64
        default n
        help
          The Power Management Timer is available on all ACPI-capable,
index 59ed56f5d529d012282b62ba93ddd571c1bf27ab..0b1e442c88cd2985d4387a82188f185f13c36242 100644 (file)
@@ -39,9 +39,7 @@
 #define _COMPONENT             ACPI_BUS_COMPONENT
 ACPI_MODULE_NAME               ("acpi_bus")
 
-#ifdef CONFIG_X86_64
-extern void __init acpi_pic_sci_set_trigger(unsigned int irq);
-#elif  defined(CONFIG_X86)
+#ifdef CONFIG_X86
 extern void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger);
 #endif
 
@@ -613,13 +611,8 @@ acpi_bus_init (void)
                printk(KERN_ERR PREFIX "Unable to get the FADT\n");
                goto error1;
        }
-#ifdef CONFIG_X86_64
-       /* Ensure the SCI is set to level-triggered, active-low */
-       if (acpi_ioapic)
-               mp_config_ioapic_for_sci(acpi_fadt.sci_int);
-       else
-               acpi_pic_sci_set_trigger(acpi_fadt.sci_int);
-#elif defined(CONFIG_X86)
+
+#ifdef CONFIG_X86
        if (!acpi_ioapic) {
                extern acpi_interrupt_flags acpi_sci_flags;
                /* Set PIC-mode SCI trigger type */
index 02245540c2f3b6911b755ae6f59b1863c5f6fb6f..bd1412dcdcc0092232507e47dbf31c699f769bb9 100644 (file)
@@ -193,8 +193,6 @@ extern void mp_parse_prt (void);
 #endif /*CONFIG_X86_IO_APIC*/
 #endif
 
-extern void mp_config_ioapic_for_sci(int irq);
-
 extern int using_apic_timer;
 
 #define PHYSID_ARRAY_SIZE      BITS_TO_LONGS(MAX_APICS)