# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2004/03/23 01:33:54-05:00 len.brown@intel.com 
#   [ACPI] share i386/kernel/acpi/boot.c with x86_64
# 
# include/asm-x86_64/mpspec.h
#   2004/03/23 01:32:11-05:00 len.brown@intel.com +0 -2
#   use i386/kernel/acpi/boot.c for x86_64
# 
# drivers/acpi/bus.c
#   2004/03/23 01:32:11-05:00 len.brown@intel.com +3 -10
#   use i386/kernel/acpi/boot.c for x86_64
# 
# drivers/acpi/Kconfig
#   2004/03/23 01:32:11-05:00 len.brown@intel.com +1 -0
#   no PM_TIMER on x86_64, yet
# 
# arch/x86_64/kernel/setup.c
#   2004/03/23 01:32:11-05:00 len.brown@intel.com +12 -0
#   use i386/kernel/acpi/boot.c for x86_64
# 
# arch/x86_64/kernel/mpparse.c
#   2004/03/23 01:32:11-05:00 len.brown@intel.com +0 -63
#   use i386/kernel/acpi/boot.c for x86_64
# 
# arch/x86_64/kernel/acpi/Makefile
#   2004/03/23 01:32:11-05:00 len.brown@intel.com +1 -1
#   use i386/kernel/acpi/boot.c for x86_64
# 
# arch/x86_64/kernel/Makefile
#   2004/03/23 01:32:11-05:00 len.brown@intel.com +1 -1
#   use i386/kernel/acpi/boot.c for x86_64
# 
# arch/i386/kernel/acpi/boot.c
#   2004/03/23 01:32:11-05:00 len.brown@intel.com +49 -9
#   use i386/kernel/acpi/boot.c for x86_64
# 
diff -Nru a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c
--- a/arch/i386/kernel/acpi/boot.c	Tue Mar 23 01:34:01 2004
+++ b/arch/i386/kernel/acpi/boot.c	Tue Mar 23 01:34:01 2004
@@ -35,11 +35,21 @@
 #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 @@
  */
 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 @@
 
 	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 @@
 
 
 #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 @@
 		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 @@
 	/*
  	 * 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;
diff -Nru a/arch/x86_64/kernel/Makefile b/arch/x86_64/kernel/Makefile
--- a/arch/x86_64/kernel/Makefile	Tue Mar 23 01:34:01 2004
+++ b/arch/x86_64/kernel/Makefile	Tue Mar 23 01:34:01 2004
@@ -11,7 +11,7 @@
 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
diff -Nru a/arch/x86_64/kernel/acpi/Makefile b/arch/x86_64/kernel/acpi/Makefile
--- a/arch/x86_64/kernel/acpi/Makefile	Tue Mar 23 01:34:01 2004
+++ b/arch/x86_64/kernel/acpi/Makefile	Tue Mar 23 01:34:01 2004
@@ -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
-
diff -Nru a/arch/x86_64/kernel/mpparse.c b/arch/x86_64/kernel/mpparse.c
--- a/arch/x86_64/kernel/mpparse.c	Tue Mar 23 01:34:01 2004
+++ b/arch/x86_64/kernel/mpparse.c	Tue Mar 23 01:34:01 2004
@@ -890,69 +890,6 @@
 
 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)
diff -Nru a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c
--- a/arch/x86_64/kernel/setup.c	Tue Mar 23 01:34:01 2004
+++ b/arch/x86_64/kernel/setup.c	Tue Mar 23 01:34:01 2004
@@ -68,6 +68,7 @@
 
 #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 @@
 		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) ||
diff -Nru a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
--- a/drivers/acpi/Kconfig	Tue Mar 23 01:34:01 2004
+++ b/drivers/acpi/Kconfig	Tue Mar 23 01:34:01 2004
@@ -255,6 +255,7 @@
 	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,
diff -Nru a/drivers/acpi/bus.c b/drivers/acpi/bus.c
--- a/drivers/acpi/bus.c	Tue Mar 23 01:34:01 2004
+++ b/drivers/acpi/bus.c	Tue Mar 23 01:34:01 2004
@@ -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 @@
 		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 */
diff -Nru a/include/asm-x86_64/mpspec.h b/include/asm-x86_64/mpspec.h
--- a/include/asm-x86_64/mpspec.h	Tue Mar 23 01:34:01 2004
+++ b/include/asm-x86_64/mpspec.h	Tue Mar 23 01:34:01 2004
@@ -193,8 +193,6 @@
 #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)