Arun Sharma wrote:
Parsing the MPS table is working now on my machine, but interrupts are
still not getting routed. I'm probably a couple of bug fixes away from
getting acpi=off/ht to work.
People having trouble with the PCI/IOAPIC patch, could you give this
patch a try?
It works with acpi=off and acpi=ht on my machine.
-Arun
PS: PCI initialization is sensitive to the order of object files within
the Makefile. I think that's a bit fragile...
===== arch/xen/i386/Kconfig 1.21 vs edited =====
--- 1.21/linux-2.6.11-xen-sparse/arch/xen/i386/Kconfig 2005-05-03 07:27:52
-07:00
+++ edited/arch/xen/i386/Kconfig 2005-05-04 14:11:59 -07:00
@@ -961,7 +961,7 @@
config X86_FIND_SMP_CONFIG
bool
depends on X86_LOCAL_APIC || X86_VOYAGER
- default n
+ default y
config X86_MPPARSE
bool
===== arch/xen/i386/kernel/apic.c 1.1 vs edited =====
--- 1.1/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/apic.c 2005-05-03
07:27:53 -07:00
+++ edited/arch/xen/i386/kernel/apic.c 2005-05-04 18:14:58 -07:00
@@ -49,5 +49,11 @@
*/
int __init APIC_init_uniprocessor (void)
{
+#ifdef CONFIG_X86_IO_APIC
+ extern int smp_found_config;
+ if (smp_found_config)
+ /* Xen assumes IO_APIC */
+ setup_IO_APIC();
+#endif
return 0;
}
===== arch/xen/i386/kernel/io_apic.c 1.1 vs edited =====
--- 1.1/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/io_apic.c 2005-05-03
07:27:53 -07:00
+++ edited/arch/xen/i386/kernel/io_apic.c 2005-05-04 15:29:07 -07:00
@@ -108,6 +108,23 @@
}
/*
+ *
+ * IRQ's that are handled by the PIC in the MPS IOAPIC case.
+ * - IRQ2 is the cascade IRQ, and cannot be a io-apic IRQ.
+ * Linux doesn't really care, as it's not actually used
+ * for any interrupt handling anyway.
+ */
+#define PIC_IRQS (1 << PIC_CASCADE_IR)
+
+void __init setup_IO_APIC(void)
+{
+ if (acpi_ioapic)
+ io_apic_irqs = ~0; /* all IRQs go through IOAPIC */
+ else
+ io_apic_irqs = ~PIC_IRQS;
+}
+
+/*
* The common case is 1:1 IRQ<->pin mappings. Sometimes there are
* shared ISA-space IRQs, so we have to support them. We are super
* fast in the common case, and fast for shared ISA-space IRQs.
===== arch/xen/i386/kernel/mpparse.c 1.2 vs edited =====
--- 1.2/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/mpparse.c 2005-05-03
10:44:11 -07:00
+++ edited/arch/xen/i386/kernel/mpparse.c 2005-05-05 13:06:16 -07:00
@@ -429,9 +429,7 @@
{
struct mpc_config_processor *m=
(struct mpc_config_processor *)mpt;
- /* ACPI may have already provided this data */
- if (!acpi_lapic)
- MP_processor_info(m);
+ /* We ignore the processors in the MP table */
mpt += sizeof(*m);
count += sizeof(*m);
break;
@@ -482,9 +480,8 @@
++mpc_record;
}
clustered_apic_check();
- if (!num_processors)
- printk(KERN_ERR "SMP mptable: no processors registered!\n");
- return num_processors;
+ num_processors = 1; /* Doesn't really matter */
+ return 1;
}
static int __init ELCR_trigger(unsigned int irq)
@@ -690,7 +687,7 @@
* Read the physical hardware table. Anything here will
* override the defaults.
*/
- if (!smp_read_mpc((void *)mpf->mpf_physptr)) {
+ if (!smp_read_mpc((void *)isa_bus_to_virt(mpf->mpf_physptr))) {
smp_found_config = 0;
printk(KERN_ERR "BIOS bug, MP table errors
detected!...\n");
printk(KERN_ERR "... disabling SMP support. (tell your
hw vendor)\n");
@@ -726,6 +723,7 @@
static int __init smp_scan_config (unsigned long base, unsigned long length)
{
unsigned long *bp = isa_bus_to_virt(base);
+ unsigned long isa_bus_off = ((unsigned long) bp) - base;
struct intel_mp_floating *mpf;
Dprintk("Scan SMP from %p for %ld bytes.\n", bp,length);
@@ -742,8 +740,7 @@
smp_found_config = 1;
printk(KERN_INFO "found SMP MP-table at %08lx\n",
- virt_to_phys(mpf));
- reserve_bootmem(virt_to_phys(mpf), PAGE_SIZE);
+ mpf - isa_bus_off);
if (mpf->mpf_physptr) {
/*
* We cannot access to MPC table to compute
@@ -758,7 +755,6 @@
unsigned long end = max_low_pfn * PAGE_SIZE;
if (mpf->mpf_physptr + size > end)
size = end - mpf->mpf_physptr;
- reserve_bootmem(mpf->mpf_physptr, size);
}
mpf_found = mpf;
===== arch/xen/i386/kernel/setup.c 1.45 vs edited =====
--- 1.45/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/setup.c 2005-05-03
10:44:11 -07:00
+++ edited/arch/xen/i386/kernel/setup.c 2005-05-04 14:12:33 -07:00
@@ -1133,13 +1133,6 @@
*/
acpi_reserve_bootmem();
#endif
-#ifdef CONFIG_X86_FIND_SMP_CONFIG
- /*
- * Find and reserve possible boot-time SMP configuration:
- */
- find_smp_config();
-#endif
-
#ifdef CONFIG_BLK_DEV_INITRD
if (xen_start_info.mod_start) {
if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) {
@@ -1566,6 +1559,12 @@
if (efi_enabled)
efi_map_memmap();
+#ifdef CONFIG_X86_FIND_SMP_CONFIG
+ /*
+ * Find and reserve possible boot-time SMP configuration:
+ */
+ find_smp_config();
+#endif
/*
* Parse the ACPI tables for possible boot-time SMP configuration.
*/
===== arch/xen/i386/pci/Makefile 1.9 vs edited =====
--- 1.9/linux-2.6.11-xen-sparse/arch/xen/i386/pci/Makefile 2005-05-03
10:24:40 -07:00
+++ edited/arch/xen/i386/pci/Makefile 2005-05-05 13:01:01 -07:00
@@ -10,8 +10,7 @@
c-pci-y := fixup.o
c-pci-$(CONFIG_ACPI_PCI) += acpi.o
-c-pci-y += legacy.o
-pci-y += irq.o
+c-pci-y += legacy.o irq.o
c-pci-$(CONFIG_X86_VISWS) := visws.o fixup.o
pci-$(CONFIG_X86_VISWS) :=
===== arch/xen/i386/pci/irq.c 1.15 vs edited =====
--- 1.15/linux-2.6.11-xen-sparse/arch/xen/i386/pci/irq.c 2005-05-03
07:27:52 -07:00
+++ edited/arch/xen/i386/pci/irq.c 2005-05-05 13:07:25 -07:00
@@ -21,8 +21,6 @@
#include "pci.h"
-#define DBG printk
-
#define PIRQ_SIGNATURE (('$' << 0) + ('P' << 8) + ('I' << 16) + ('R' << 24))
#define PIRQ_VERSION 0x0100
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|