2003-07-27 22:59:35

by Andrew de Quincey

[permalink] [raw]
Subject: [PATCH] ACPI patch which fixes all my IRQ problems on nforce2 -- linux-2.5.75-acpi-irqparams-final4.patch

First of all, my apologies for not sending this inline the first time. No excuses: I
should have read the LKML FAQ properly.

This is version final4 of the patch now. Improvement over version final3 is a fix
to IRQ allocation.. previously all PCI IRQs were allocated to IRQ11 on my Thinkpad.


This patch fixes all ACPI problems on the nforce2 chipset for me.

Here is the feature list:

1) Make IO-APIC use correct polarity/mode settings from ACPI.

2) Detect buggy ACPI code when setting IRQ routing -- warn the user and
attempt to fallback to non-ACPI configuration.

3) Add /proc/irq/io_apic so that the contents of the IO-APIC can be seen on a
live system.

4) Fix potential problem in pci_link.c

The current ACPI code does this:
a) Scan for all PCI Link devices
b) Allocate an IRQ to each link device.
c) Setup PCI Routing table entries.

This is error-prone. In my BIOS, there is one set of Link devices for PIC mode
and one set for APIC mode. In the AML code however, they both talk to the
*same* hardware on the board.

So by luck, the PIC-mode link devices are set up first, then the APIC ones. If
this order was reversed, the IRQs in APIC mode would be completely wrong.

This patch changes the code so that it only allocates IRQs to link devices
while setting up the PCI routing table entries, so only the PIC or APIC ones
will be set up as appropriate.

5) Boot-enabled IRQs cannot be relied upon.

Although the _CRS method in my ACPI does return the correct IRQ, this is NOT
necessarily what the hardware is set to. The patch forces every link device
IRQ to be set at least once.

This _may_ break ACPI IRQ routing on the Toshiba 5005-S504 (I hope I have
managed to support it though). Can someone check please? Quote from
pci_link.c:
* Note that we don't validate that the current IRQ (_CRS) exists
* within the possible IRQs (_PRS): we blindly assume that whatever
* IRQ a boot-enabled Link device is set to is the correct one.
* (Required to support systems such as the Toshiba 5005-S504.)


---CUT HERE---
--- linux-2.5.75.orig/arch/i386/kernel/io_apic.c 2003-07-10 21:07:34.000000000 +0100
+++ linux-2.5.75/arch/i386/kernel/io_apic.c 2003-07-27 19:18:54.000000000 +0100
@@ -1544,6 +1544,142 @@
printk(KERN_DEBUG "... PIC ELCR: %04x\n", v);
}

+int io_apic_irq_read_proc (char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ int apic, i;
+ union IO_APIC_reg_00 reg_00;
+ union IO_APIC_reg_01 reg_01;
+ union IO_APIC_reg_02 reg_02;
+ union IO_APIC_reg_03 reg_03;
+ unsigned long flags;
+ char* start_page;
+
+ start_page = page;
+ page += sprintf(page, "number of MP IRQ sources: %d.\n", mp_irq_entries);
+ for (i = 0; i < nr_ioapics; i++)
+ page += sprintf(page, "number of IO-APIC #%d registers: %d.\n",
+ mp_ioapics[i].mpc_apicid, nr_ioapic_registers[i]);
+
+ for (apic = 0; apic < nr_ioapics; apic++) {
+
+ spin_lock_irqsave(&ioapic_lock, flags);
+ reg_00.raw = io_apic_read(apic, 0);
+ reg_01.raw = io_apic_read(apic, 1);
+ if (reg_01.bits.version >= 0x10)
+ reg_02.raw = io_apic_read(apic, 2);
+ if (reg_01.bits.version >= 0x20)
+ reg_03.raw = io_apic_read(apic, 3);
+ spin_unlock_irqrestore(&ioapic_lock, flags);
+
+ page += sprintf(page, "IO APIC #%d......\n", mp_ioapics[apic].mpc_apicid);
+ page += sprintf(page, ".... register #00: %08X\n", reg_00.raw);
+ page += sprintf(page, "....... : physical APIC id: %02X\n", reg_00.bits.ID);
+ page += sprintf(page, "....... : Delivery Type: %X\n", reg_00.bits.delivery_type);
+ page += sprintf(page, "....... : LTS : %X\n", reg_00.bits.LTS);
+ if (reg_00.bits.ID >= APIC_BROADCAST_ID)
+ page += sprintf(page, "UNEXPECTED_IO_APIC\n");
+ if (reg_00.bits.__reserved_1 || reg_00.bits.__reserved_2)
+ page += sprintf(page, "UNEXPECTED_IO_APIC\n");
+
+ page += sprintf(page, ".... register #01: %08X\n", reg_01.raw);
+ page += sprintf(page, "....... : max redirection entries: %04X\n", reg_01.bits.entries);
+ if ( (reg_01.bits.entries != 0x0f) && /* older (Neptune) boards */
+ (reg_01.bits.entries != 0x17) && /* typical ISA+PCI boards */
+ (reg_01.bits.entries != 0x1b) && /* Compaq Proliant boards */
+ (reg_01.bits.entries != 0x1f) && /* dual Xeon boards */
+ (reg_01.bits.entries != 0x22) && /* bigger Xeon boards */
+ (reg_01.bits.entries != 0x2E) &&
+ (reg_01.bits.entries != 0x3F)
+ )
+ page += sprintf(page, "UNEXPECTED_IO_APIC\n");
+
+ page += sprintf(page, "....... : PRQ implemented: %X\n", reg_01.bits.PRQ);
+ page += sprintf(page, "....... : IO APIC version: %04X\n", reg_01.bits.version);
+ if ( (reg_01.bits.version != 0x01) && /* 82489DX IO-APICs */
+ (reg_01.bits.version != 0x10) && /* oldest IO-APICs */
+ (reg_01.bits.version != 0x11) && /* Pentium/Pro IO-APICs */
+ (reg_01.bits.version != 0x13) && /* Xeon IO-APICs */
+ (reg_01.bits.version != 0x20) /* Intel P64H (82806 AA) */
+ )
+ page += sprintf(page, "UNEXPECTED_IO_APIC\n");
+ if (reg_01.bits.__reserved_1 || reg_01.bits.__reserved_2)
+ page += sprintf(page, "UNEXPECTED_IO_APIC\n");
+
+ /*
+ * Some Intel chipsets with IO APIC VERSION of 0x1? don't have reg_02,
+ * but the value of reg_02 is read as the previous read register
+ * value, so ignore it if reg_02 == reg_01.
+ */
+ if (reg_01.bits.version >= 0x10 && reg_02.raw != reg_01.raw) {
+ page += sprintf(page, ".... register #02: %08X\n", reg_02.raw);
+ page += sprintf(page, "....... : arbitration: %02X\n", reg_02.bits.arbitration);
+ if (reg_02.bits.__reserved_1 || reg_02.bits.__reserved_2)
+ page += sprintf(page, "UNEXPECTED_IO_APIC\n");
+ }
+
+ /*
+ * Some Intel chipsets with IO APIC VERSION of 0x2? don't have reg_02
+ * or reg_03, but the value of reg_0[23] is read as the previous read
+ * register value, so ignore it if reg_03 == reg_0[12].
+ */
+ if (reg_01.bits.version >= 0x20 && reg_03.raw != reg_02.raw &&
+ reg_03.raw != reg_01.raw) {
+ page += sprintf(page, ".... register #03: %08X\n", reg_03.raw);
+ page += sprintf(page, "....... : Boot DT : %X\n", reg_03.bits.boot_DT);
+ if (reg_03.bits.__reserved_1)
+ page += sprintf(page, "UNEXPECTED_IO_APIC\n");
+ }
+
+ page += sprintf(page, ".... IRQ redirection table:\n");
+
+ page += sprintf(page, " NR Log Phy Mask Trig IRR Pol"
+ " Stat Dest Deli Vect: \n");
+
+ for (i = 0; i <= reg_01.bits.entries; i++) {
+ struct IO_APIC_route_entry entry;
+
+ spin_lock_irqsave(&ioapic_lock, flags);
+ *(((int *)&entry)+0) = io_apic_read(apic, 0x10+i*2);
+ *(((int *)&entry)+1) = io_apic_read(apic, 0x11+i*2);
+ spin_unlock_irqrestore(&ioapic_lock, flags);
+
+ page += sprintf(page, " %02x %03X %02X ",
+ i,
+ entry.dest.logical.logical_dest,
+ entry.dest.physical.physical_dest
+ );
+
+ page += sprintf(page, "%1d %1d %1d %1d %1d %1d %1d %02X\n",
+ entry.mask,
+ entry.trigger,
+ entry.irr,
+ entry.polarity,
+ entry.delivery_status,
+ entry.dest_mode,
+ entry.delivery_mode,
+ entry.vector
+ );
+ }
+ }
+ page += sprintf(page, "IRQ to pin mappings:\n");
+ for (i = 0; i < NR_IRQS; i++) {
+ struct irq_pin_list *entry = irq_2_pin + i;
+ if (entry->pin < 0)
+ continue;
+ page += sprintf(page, "IRQ%d ", i);
+ for (;;) {
+ page += sprintf(page, "-> %d:0x%x", entry->apic, entry->pin);
+ if (!entry->next)
+ break;
+ entry = irq_2_pin + entry->next;
+ }
+ page += sprintf(page, "\n");
+ }
+
+ return page - start_page;
+}
+
static void __init enable_IO_APIC(void)
{
union IO_APIC_reg_01 reg_01;
@@ -2313,7 +2449,7 @@
}


-int io_apic_set_pci_routing (int ioapic, int pin, int irq)
+int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int active_high_low)
{
struct IO_APIC_route_entry entry;
unsigned long flags;
@@ -2335,19 +2471,23 @@
entry.delivery_mode = INT_DELIVERY_MODE;
entry.dest_mode = INT_DEST_MODE;
entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
- entry.mask = 1; /* Disabled (masked) */
- entry.trigger = 1; /* Level sensitive */
- entry.polarity = 1; /* Low active */
+ entry.trigger = edge_level;
+ entry.polarity = active_high_low;
+ entry.mask = 1;

add_pin_to_irq(irq, ioapic, pin);

entry.vector = assign_irq_vector(irq);

printk(KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry (%d-%d -> 0x%x -> "
- "IRQ %d)\n", ioapic,
- mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq);
+ "IRQ %d Mode:%i Active:%i)\n", ioapic,
+ mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq, edge_level, active_high_low);

+ if (edge_level) {
irq_desc[irq].handler = &ioapic_level_irq_type;
+ } else {
+ irq_desc[irq].handler = &ioapic_edge_irq_type;
+ }

set_intr_gate(entry.vector, interrupt[irq]);

--- linux-2.5.75.orig/arch/i386/kernel/mpparse.c 2003-07-10 21:06:59.000000000 +0100
+++ linux-2.5.75/arch/i386/kernel/mpparse.c 2003-07-27 19:18:54.000000000 +0100
@@ -1065,7 +1065,7 @@

ioapic_pin = irq - mp_ioapic_routing[ioapic].irq_start;

- io_apic_set_pci_routing(ioapic, ioapic_pin, irq);
+ io_apic_set_pci_routing(ioapic, ioapic_pin, irq, 1, 1); // Active low, edge triggered
}

#endif /*CONFIG_ACPI_HT_ONLY*/
@@ -1080,6 +1080,8 @@
int ioapic_pin = 0;
int irq = 0;
int idx, bit = 0;
+ int edge_level = 0;
+ int active_high_low = 0;

/*
* Parsing through the PCI Interrupt Routing Table (PRT) and program
@@ -1090,12 +1092,16 @@

/* Need to get irq for dynamic entry */
if (entry->link.handle) {
- irq = acpi_pci_link_get_irq(entry->link.handle, entry->link.index);
+ irq = acpi_pci_link_get_irq(entry->link.handle, entry->link.index, &edge_level, &active_high_low);
if (!irq)
continue;
}
- else
+ else {
+ /* Hardwired IRQ. Assume PCI standard settings */
irq = entry->link.index;
+ edge_level = 1;
+ active_high_low = 1;
+ }

/* Don't set up the ACPI SCI because it's already set up */
if (acpi_fadt.sci_int == irq)
@@ -1130,7 +1136,7 @@

mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit);

- if (!io_apic_set_pci_routing(ioapic, ioapic_pin, irq))
+ if (!io_apic_set_pci_routing(ioapic, ioapic_pin, irq, edge_level, active_high_low))
entry->irq = irq;

printk(KERN_DEBUG "%02x:%02x:%02x[%c] -> %d-%d -> IRQ %d\n",
@@ -1140,6 +1146,9 @@
entry->irq);
}

+
+
+
return;
}

--- linux-2.5.75.orig/arch/i386/kernel/irq.c 2003-07-10 21:04:50.000000000 +0100
+++ linux-2.5.75/arch/i386/kernel/irq.c 2003-07-27 19:18:54.000000000 +0100
@@ -1028,6 +1028,13 @@

unsigned long prof_cpu_mask = -1;

+#ifdef CONFIG_X86_IO_APIC
+static struct proc_dir_entry * io_apic_irq_entry;
+
+extern int io_apic_irq_read_proc (char *page, char **start, off_t off,
+ int count, int *eof, void *data);
+#endif
+
void init_irq_proc (void)
{
struct proc_dir_entry *entry;
@@ -1052,5 +1059,24 @@
*/
for (i = 0; i < NR_IRQS; i++)
register_irq_proc(i);
+
+#ifdef CONFIG_X86_IO_APIC
+ if (smp_found_config) {
+ if (!skip_ioapic_setup && nr_ioapics) {
+ struct proc_dir_entry* entry;
+
+ /* create /proc/irq/io_apic */
+ entry = create_proc_entry("io_apic", 0400, root_irq_dir);
+
+ if (entry) {
+ entry->nlink = 1;
+ entry->read_proc = io_apic_irq_read_proc;
+ }
+
+ io_apic_irq_entry = entry;
+ }
+
+ }
+#endif
}

--- linux-2.5.75.orig/drivers/acpi/pci_irq.c 2003-07-10 21:08:54.000000000 +0100
+++ linux-2.5.75/drivers/acpi/pci_irq.c 2003-07-27 19:18:54.000000000 +0100
@@ -249,7 +249,7 @@
}

if (!entry->irq && entry->link.handle) {
- entry->irq = acpi_pci_link_get_irq(entry->link.handle, entry->link.index);
+ entry->irq = acpi_pci_link_get_irq(entry->link.handle, entry->link.index, NULL, NULL);
if (!entry->irq) {
ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Invalid IRQ link routing entry\n"));
return_VALUE(0);
@@ -389,7 +389,9 @@
}

/* Make sure all link devices have a valid IRQ. */
- acpi_pci_link_check();
+ if (acpi_pci_link_check()) {
+ return_VALUE(-ENODEV);
+ }

#ifdef CONFIG_X86_IO_APIC
/* Program IOAPICs using data from PRT entries. */
--- linux-2.5.75.orig/drivers/acpi/pci_link.c 2003-07-27 19:56:49.000000000 +0100
+++ linux-2.5.75/drivers/acpi/pci_link.c 2003-07-27 22:43:55.000000000 +0100
@@ -69,6 +69,9 @@

struct acpi_pci_link_irq {
u8 active; /* Current IRQ */
+ u8 edge_level; /* All IRQs */
+ u8 active_high_low; /* All IRQs */
+ u8 setonboot;
u8 possible_count;
u8 possible[ACPI_PCI_LINK_MAX_POSSIBLE];
};
@@ -118,6 +121,8 @@
link->irq.possible[i] = p->interrupts[i];
link->irq.possible_count++;
}
+ link->irq.edge_level = p->edge_level;
+ link->irq.active_high_low = p->active_high_low;
break;
}
case ACPI_RSTYPE_EXT_IRQ:
@@ -136,6 +141,8 @@
link->irq.possible[i] = p->interrupts[i];
link->irq.possible_count++;
}
+ link->irq.edge_level = p->edge_level;
+ link->irq.active_high_low = p->active_high_low;
break;
}
default:
@@ -264,7 +271,6 @@
* IRQ a boot-enabled Link device is set to is the correct one.
* (Required to support systems such as the Toshiba 5005-S504.)
*/
-
link->irq.active = irq;

ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Link at IRQ %d \n", link->irq.active));
@@ -294,6 +300,8 @@
if (!link || !irq)
return_VALUE(-EINVAL);

+ /* We don't check irqs the first time round */
+ if (link->irq.setonboot) {
/* See if we're already at the target IRQ. */
if (irq == link->irq.active)
return_VALUE(0);
@@ -307,16 +315,18 @@
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Target IRQ %d invalid\n", irq));
return_VALUE(-EINVAL);
}
+ }

memset(&resource, 0, sizeof(resource));

- /* NOTE: PCI interrupts are always level / active_low / shared. */
+ /* NOTE: PCI interrupts are always level / active_low / shared. But not all
+ interrupts > 15 are PCI interrupts. Rely on the ACPI IRQ definition for
+ parameters */
if (irq <= 15) {
resource.res.id = ACPI_RSTYPE_IRQ;
resource.res.length = sizeof(struct acpi_resource);
- resource.res.data.irq.edge_level = ACPI_LEVEL_SENSITIVE;
- resource.res.data.irq.active_high_low = ACPI_ACTIVE_LOW;
- resource.res.data.irq.shared_exclusive = ACPI_SHARED;
+ resource.res.data.irq.edge_level = link->irq.edge_level;
+ resource.res.data.irq.active_high_low = link->irq.active_high_low;
resource.res.data.irq.number_of_interrupts = 1;
resource.res.data.irq.interrupts[0] = irq;
}
@@ -324,15 +334,15 @@
resource.res.id = ACPI_RSTYPE_EXT_IRQ;
resource.res.length = sizeof(struct acpi_resource);
resource.res.data.extended_irq.producer_consumer = ACPI_CONSUMER;
- resource.res.data.extended_irq.edge_level = ACPI_LEVEL_SENSITIVE;
- resource.res.data.extended_irq.active_high_low = ACPI_ACTIVE_LOW;
- resource.res.data.extended_irq.shared_exclusive = ACPI_SHARED;
+ resource.res.data.extended_irq.edge_level = link->irq.edge_level;
+ resource.res.data.extended_irq.active_high_low = link->irq.active_high_low;
resource.res.data.extended_irq.number_of_interrupts = 1;
resource.res.data.extended_irq.interrupts[0] = irq;
/* ignore resource_source, it's optional */
}
resource.end.id = ACPI_RSTYPE_END_TAG;

+ /* Attempt to set the resource */
status = acpi_set_current_resources(link->handle, &buffer);
if (ACPI_FAILURE(status)) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _SRS\n"));
@@ -355,11 +365,13 @@
if (result) {
return_VALUE(result);
}
+
if (link->irq.active != irq) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
"Attempt to enable at IRQ %d resulted in IRQ %d\n",
irq, link->irq.active));
link->irq.active = 0;
+ acpi_ut_evaluate_object (link->handle, "_DIS", 0, NULL);
return_VALUE(-ENODEV);
}

@@ -407,7 +419,7 @@
ACPI_FUNCTION_TRACE("acpi_pci_link_check");

/*
- * Pass #1: Update penalties to facilitate IRQ balancing.
+ * Update penalties to facilitate IRQ balancing.
*/
list_for_each(node, &acpi_link.entries) {

@@ -428,23 +440,21 @@
}
}

- /*
- * Pass #2: Enable boot-disabled Links at 'best' IRQ.
- */
- list_for_each(node, &acpi_link.entries) {
- int irq = 0;
- int i = 0;
+ return_VALUE(0);
+}

- link = list_entry(node, struct acpi_pci_link, node);
- if (!link || !link->irq.possible_count) {
- ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid link context\n"));
- continue;
- }
+static int acpi_pci_link_allocate(struct acpi_pci_link* link) {
+ int irq;
+ int i;

- if (link->irq.active)
- continue;
+ if (link->irq.setonboot)
+ return_VALUE(0);

+ if (link->irq.active) {
+ irq = link->irq.active;
+ } else {
irq = link->irq.possible[0];
+ }

/*
* Select the best IRQ. This is done in reverse to promote
@@ -455,16 +465,20 @@
irq = link->irq.possible[i];
}

- /* Enable the link device at this IRQ. */
- acpi_pci_link_set(link, irq);
-
+ /* Attempt to enable the link device at this IRQ. */
+ if (acpi_pci_link_set(link, irq)) {
+ printk(PREFIX "Unable to set IRQ for %s [%s] (likely buggy ACPI BIOS). Aborting ACPI-based IRQ routing. Try pci=noacpi or acpi=off\n",
+ acpi_device_name(link->device),
+ acpi_device_bid(link->device));
+ return_VALUE(-ENODEV);
+ } else {
acpi_irq_penalty[link->irq.active] += 100;
-
printk(PREFIX "%s [%s] enabled at IRQ %d\n",
acpi_device_name(link->device),
acpi_device_bid(link->device), link->irq.active);
}

+ link->irq.setonboot = 1;
return_VALUE(0);
}

@@ -472,7 +486,9 @@
int
acpi_pci_link_get_irq (
acpi_handle handle,
- int index)
+ int index,
+ int* edge_level,
+ int* active_high_low)
{
int result = 0;
struct acpi_device *device = NULL;
@@ -498,11 +514,17 @@
return_VALUE(0);
}

+ if (acpi_pci_link_allocate(link)) {
+ return -ENODEV;
+ }
+
if (!link->irq.active) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Link disabled\n"));
return_VALUE(0);
}

+ if (edge_level) *edge_level = link->irq.edge_level;
+ if (active_high_low) *active_high_low = link->irq.active_high_low;
return_VALUE(link->irq.active);
}

--- linux-2.5.75.orig/include/acpi/acpi_drivers.h 2003-07-10 21:12:26.000000000 +0100
+++ linux-2.5.75/include/acpi/acpi_drivers.h 2003-07-27 19:18:54.000000000 +0100
@@ -60,7 +60,7 @@
/* ACPI PCI Interrupt Link (pci_link.c) */

int acpi_pci_link_check (void);
-int acpi_pci_link_get_irq (acpi_handle handle, int index);
+int acpi_pci_link_get_irq (acpi_handle handle, int index, int* edge_level, int* active_high_low);

/* ACPI PCI Interrupt Routing (pci_irq.c) */

--- linux-2.5.75.orig/include/asm-i386/io_apic.h 2003-07-10 21:12:15.000000000 +0100
+++ linux-2.5.75/include/asm-i386/io_apic.h 2003-07-27 19:18:54.000000000 +0100
@@ -170,7 +170,7 @@
extern int io_apic_get_unique_id (int ioapic, int apic_id);
extern int io_apic_get_version (int ioapic);
extern int io_apic_get_redir_entries (int ioapic);
-extern int io_apic_set_pci_routing (int ioapic, int pin, int irq);
+extern int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int active_high_low);
#endif /*CONFIG_ACPI_BOOT*/

#else /* !CONFIG_X86_IO_APIC */
---CUT HERE---


2003-07-28 15:15:22

by Alexander Rau

[permalink] [raw]
Subject: Re: [PATCH] ACPI patch which fixes all my IRQ problems on nforce2 -- linux-2.5.75-acpi-irqparams-final4.patch

Andrew de Quincey wrote:
> This is version final4 of the patch now. Improvement over version final3 is a fix
> to IRQ allocation.. previously all PCI IRQs were allocated to IRQ11 on my Thinkpad.
>
> This _may_ break ACPI IRQ routing on the Toshiba 5005-S504 (I hope I have
> managed to support it though). Can someone check please? Quote from
> pci_link.c:
> * Note that we don't validate that the current IRQ (_CRS) exists
> * within the possible IRQs (_PRS): we blindly assume that whatever
> * IRQ a boot-enabled Link device is set to is the correct one.
> * (Required to support systems such as the Toshiba 5005-S504.)
>
>

I tried to apply the patch to 2.6.0-test2 in hope that this resolves my
oops during boottime on my thinkpad t40p.

Unfortunatly the compilation of the kernel fails with:

-----------------------------------------------------------------------------
CC drivers/acpi/pci_link.o
drivers/acpi/pci_link.c: In function `acpi_pci_link_allocate':
drivers/acpi/pci_link.c:451: `_dbg' undeclared (first use in this function)
drivers/acpi/pci_link.c:451: (Each undeclared identifier is reported
only once
drivers/acpi/pci_link.c:451: for each function it appears in.)
make[2]: *** [drivers/acpi/pci_link.o] Error 1
make[1]: *** [drivers/acpi] Error 2
make: *** [drivers] Error 2
-----------------------------------------------------------------------------

Any ideas how to port your patch to the 2.6 series ?



Regards,

Alexander Rau

2003-07-28 15:23:09

by Andrew de Quincey

[permalink] [raw]
Subject: Re: [PATCH] ACPI patch which fixes all my IRQ problems on nforce2 -- linux-2.5.75-acpi-irqparams-final4.patch

On Monday 28 July 2003 16:30, Alexander Rau wrote:
> Andrew de Quincey wrote:
> > This is version final4 of the patch now. Improvement over version final3
> > is a fix to IRQ allocation.. previously all PCI IRQs were allocated to
> > IRQ11 on my Thinkpad.
> >
> > This _may_ break ACPI IRQ routing on the Toshiba 5005-S504 (I hope I
> > have managed to support it though). Can someone check please? Quote from
> > pci_link.c:
> > * Note that we don't validate that the current IRQ (_CRS) exists
> > * within the possible IRQs (_PRS): we blindly assume that
> > whatever * IRQ a boot-enabled Link device is set to is the correct one. *
> > (Required to support systems such as the Toshiba 5005-S504.)
>
> I tried to apply the patch to 2.6.0-test2 in hope that this resolves my
> oops during boottime on my thinkpad t40p.
>
> Unfortunatly the compilation of the kernel fails with:
>
> ---------------------------------------------------------------------------
>-- CC drivers/acpi/pci_link.o
> drivers/acpi/pci_link.c: In function `acpi_pci_link_allocate':
> drivers/acpi/pci_link.c:451: `_dbg' undeclared (first use in this function)
> drivers/acpi/pci_link.c:451: (Each undeclared identifier is reported
> only once
> drivers/acpi/pci_link.c:451: for each function it appears in.)
> make[2]: *** [drivers/acpi/pci_link.o] Error 1
> make[1]: *** [drivers/acpi] Error 2
> make: *** [drivers] Error 2
> ---------------------------------------------------------------------------
>--
>
> Any ideas how to port your patch to the 2.6 series ?

Weird! I compiled it on 2.6.0-test2 last night (for a thinkpad T20), and it
was fine..... (and the thinkpad works fine too)

Send me your .config file so I can fix the patch, please.


2003-07-28 15:38:33

by Andrew de Quincey

[permalink] [raw]
Subject: [PATCH] ACPI patch which fixes all my IRQ problems on nforce2 -- linux-2.6.0-test2-acpi-irqparams-final5.patch

On Monday 28 July 2003 16:30, Alexander Rau wrote:
> Andrew de Quincey wrote:
> > This is version final4 of the patch now. Improvement over version final3
> > is a fix to IRQ allocation.. previously all PCI IRQs were allocated to
> > IRQ11 on my Thinkpad.
> >
> > This _may_ break ACPI IRQ routing on the Toshiba 5005-S504 (I hope I
> > have managed to support it though). Can someone check please? Quote from
> > pci_link.c:
> > * Note that we don't validate that the current IRQ (_CRS) exists
> > * within the possible IRQs (_PRS): we blindly assume that
> > whatever * IRQ a boot-enabled Link device is set to is the correct one. *
> > (Required to support systems such as the Toshiba 5005-S504.)
>
> I tried to apply the patch to 2.6.0-test2 in hope that this resolves my
> oops during boottime on my thinkpad t40p.
>
> Unfortunatly the compilation of the kernel fails with:

Ah, hi, found the problem... you must be compiling with ACPI debug on. Thanks for pointing it out. New patch attached

---CUT HERE---
--- linux-2.6.0-test2.orig/arch/i386/kernel/io_apic.c 2003-07-27 18:00:21.000000000 +0100
+++ linux-2.6.0-test2/arch/i386/kernel/io_apic.c 2003-07-27 22:24:11.000000000 +0100
@@ -1559,6 +1559,142 @@
printk(KERN_DEBUG "... PIC ELCR: %04x\n", v);
}

+int io_apic_irq_read_proc (char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ int apic, i;
+ union IO_APIC_reg_00 reg_00;
+ union IO_APIC_reg_01 reg_01;
+ union IO_APIC_reg_02 reg_02;
+ union IO_APIC_reg_03 reg_03;
+ unsigned long flags;
+ char* start_page;
+
+ start_page = page;
+ page += sprintf(page, "number of MP IRQ sources: %d.\n", mp_irq_entries);
+ for (i = 0; i < nr_ioapics; i++)
+ page += sprintf(page, "number of IO-APIC #%d registers: %d.\n",
+ mp_ioapics[i].mpc_apicid, nr_ioapic_registers[i]);
+
+ for (apic = 0; apic < nr_ioapics; apic++) {
+
+ spin_lock_irqsave(&ioapic_lock, flags);
+ reg_00.raw = io_apic_read(apic, 0);
+ reg_01.raw = io_apic_read(apic, 1);
+ if (reg_01.bits.version >= 0x10)
+ reg_02.raw = io_apic_read(apic, 2);
+ if (reg_01.bits.version >= 0x20)
+ reg_03.raw = io_apic_read(apic, 3);
+ spin_unlock_irqrestore(&ioapic_lock, flags);
+
+ page += sprintf(page, "IO APIC #%d......\n", mp_ioapics[apic].mpc_apicid);
+ page += sprintf(page, ".... register #00: %08X\n", reg_00.raw);
+ page += sprintf(page, "....... : physical APIC id: %02X\n", reg_00.bits.ID);
+ page += sprintf(page, "....... : Delivery Type: %X\n", reg_00.bits.delivery_type);
+ page += sprintf(page, "....... : LTS : %X\n", reg_00.bits.LTS);
+ if (reg_00.bits.ID >= APIC_BROADCAST_ID)
+ page += sprintf(page, "UNEXPECTED_IO_APIC\n");
+ if (reg_00.bits.__reserved_1 || reg_00.bits.__reserved_2)
+ page += sprintf(page, "UNEXPECTED_IO_APIC\n");
+
+ page += sprintf(page, ".... register #01: %08X\n", reg_01.raw);
+ page += sprintf(page, "....... : max redirection entries: %04X\n", reg_01.bits.entries);
+ if ( (reg_01.bits.entries != 0x0f) && /* older (Neptune) boards */
+ (reg_01.bits.entries != 0x17) && /* typical ISA+PCI boards */
+ (reg_01.bits.entries != 0x1b) && /* Compaq Proliant boards */
+ (reg_01.bits.entries != 0x1f) && /* dual Xeon boards */
+ (reg_01.bits.entries != 0x22) && /* bigger Xeon boards */
+ (reg_01.bits.entries != 0x2E) &&
+ (reg_01.bits.entries != 0x3F)
+ )
+ page += sprintf(page, "UNEXPECTED_IO_APIC\n");
+
+ page += sprintf(page, "....... : PRQ implemented: %X\n", reg_01.bits.PRQ);
+ page += sprintf(page, "....... : IO APIC version: %04X\n", reg_01.bits.version);
+ if ( (reg_01.bits.version != 0x01) && /* 82489DX IO-APICs */
+ (reg_01.bits.version != 0x10) && /* oldest IO-APICs */
+ (reg_01.bits.version != 0x11) && /* Pentium/Pro IO-APICs */
+ (reg_01.bits.version != 0x13) && /* Xeon IO-APICs */
+ (reg_01.bits.version != 0x20) /* Intel P64H (82806 AA) */
+ )
+ page += sprintf(page, "UNEXPECTED_IO_APIC\n");
+ if (reg_01.bits.__reserved_1 || reg_01.bits.__reserved_2)
+ page += sprintf(page, "UNEXPECTED_IO_APIC\n");
+
+ /*
+ * Some Intel chipsets with IO APIC VERSION of 0x1? don't have reg_02,
+ * but the value of reg_02 is read as the previous read register
+ * value, so ignore it if reg_02 == reg_01.
+ */
+ if (reg_01.bits.version >= 0x10 && reg_02.raw != reg_01.raw) {
+ page += sprintf(page, ".... register #02: %08X\n", reg_02.raw);
+ page += sprintf(page, "....... : arbitration: %02X\n", reg_02.bits.arbitration);
+ if (reg_02.bits.__reserved_1 || reg_02.bits.__reserved_2)
+ page += sprintf(page, "UNEXPECTED_IO_APIC\n");
+ }
+
+ /*
+ * Some Intel chipsets with IO APIC VERSION of 0x2? don't have reg_02
+ * or reg_03, but the value of reg_0[23] is read as the previous read
+ * register value, so ignore it if reg_03 == reg_0[12].
+ */
+ if (reg_01.bits.version >= 0x20 && reg_03.raw != reg_02.raw &&
+ reg_03.raw != reg_01.raw) {
+ page += sprintf(page, ".... register #03: %08X\n", reg_03.raw);
+ page += sprintf(page, "....... : Boot DT : %X\n", reg_03.bits.boot_DT);
+ if (reg_03.bits.__reserved_1)
+ page += sprintf(page, "UNEXPECTED_IO_APIC\n");
+ }
+
+ page += sprintf(page, ".... IRQ redirection table:\n");
+
+ page += sprintf(page, " NR Log Phy Mask Trig IRR Pol"
+ " Stat Dest Deli Vect: \n");
+
+ for (i = 0; i <= reg_01.bits.entries; i++) {
+ struct IO_APIC_route_entry entry;
+
+ spin_lock_irqsave(&ioapic_lock, flags);
+ *(((int *)&entry)+0) = io_apic_read(apic, 0x10+i*2);
+ *(((int *)&entry)+1) = io_apic_read(apic, 0x11+i*2);
+ spin_unlock_irqrestore(&ioapic_lock, flags);
+
+ page += sprintf(page, " %02x %03X %02X ",
+ i,
+ entry.dest.logical.logical_dest,
+ entry.dest.physical.physical_dest
+ );
+
+ page += sprintf(page, "%1d %1d %1d %1d %1d %1d %1d %02X\n",
+ entry.mask,
+ entry.trigger,
+ entry.irr,
+ entry.polarity,
+ entry.delivery_status,
+ entry.dest_mode,
+ entry.delivery_mode,
+ entry.vector
+ );
+ }
+ }
+ page += sprintf(page, "IRQ to pin mappings:\n");
+ for (i = 0; i < NR_IRQS; i++) {
+ struct irq_pin_list *entry = irq_2_pin + i;
+ if (entry->pin < 0)
+ continue;
+ page += sprintf(page, "IRQ%d ", i);
+ for (;;) {
+ page += sprintf(page, "-> %d:0x%x", entry->apic, entry->pin);
+ if (!entry->next)
+ break;
+ entry = irq_2_pin + entry->next;
+ }
+ page += sprintf(page, "\n");
+ }
+
+ return page - start_page;
+}
+
static void __init enable_IO_APIC(void)
{
union IO_APIC_reg_01 reg_01;
@@ -2328,7 +2464,7 @@
}


-int io_apic_set_pci_routing (int ioapic, int pin, int irq)
+int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int active_high_low)
{
struct IO_APIC_route_entry entry;
unsigned long flags;
@@ -2350,19 +2486,23 @@
entry.delivery_mode = INT_DELIVERY_MODE;
entry.dest_mode = INT_DEST_MODE;
entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
- entry.mask = 1; /* Disabled (masked) */
- entry.trigger = 1; /* Level sensitive */
- entry.polarity = 1; /* Low active */
+ entry.trigger = edge_level;
+ entry.polarity = active_high_low;
+ entry.mask = 1;

add_pin_to_irq(irq, ioapic, pin);

entry.vector = assign_irq_vector(irq);

printk(KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry (%d-%d -> 0x%x -> "
- "IRQ %d)\n", ioapic,
- mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq);
+ "IRQ %d Mode:%i Active:%i)\n", ioapic,
+ mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq, edge_level, active_high_low);

+ if (edge_level) {
irq_desc[irq].handler = &ioapic_level_irq_type;
+ } else {
+ irq_desc[irq].handler = &ioapic_edge_irq_type;
+ }

set_intr_gate(entry.vector, interrupt[irq]);

--- linux-2.6.0-test2.orig/arch/i386/kernel/mpparse.c 2003-07-27 17:59:51.000000000 +0100
+++ linux-2.6.0-test2/arch/i386/kernel/mpparse.c 2003-07-27 22:24:11.000000000 +0100
@@ -1065,7 +1065,7 @@

ioapic_pin = irq - mp_ioapic_routing[ioapic].irq_start;

- io_apic_set_pci_routing(ioapic, ioapic_pin, irq);
+ io_apic_set_pci_routing(ioapic, ioapic_pin, irq, 1, 1); // Active low, edge triggered
}

#endif /*CONFIG_ACPI_HT_ONLY*/
@@ -1080,6 +1080,8 @@
int ioapic_pin = 0;
int irq = 0;
int idx, bit = 0;
+ int edge_level = 0;
+ int active_high_low = 0;

/*
* Parsing through the PCI Interrupt Routing Table (PRT) and program
@@ -1090,12 +1092,16 @@

/* Need to get irq for dynamic entry */
if (entry->link.handle) {
- irq = acpi_pci_link_get_irq(entry->link.handle, entry->link.index);
+ irq = acpi_pci_link_get_irq(entry->link.handle, entry->link.index, &edge_level, &active_high_low);
if (!irq)
continue;
}
- else
+ else {
+ /* Hardwired IRQ. Assume PCI standard settings */
irq = entry->link.index;
+ edge_level = 1;
+ active_high_low = 1;
+ }

/* Don't set up the ACPI SCI because it's already set up */
if (acpi_fadt.sci_int == irq)
@@ -1130,7 +1136,7 @@

mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit);

- if (!io_apic_set_pci_routing(ioapic, ioapic_pin, irq))
+ if (!io_apic_set_pci_routing(ioapic, ioapic_pin, irq, edge_level, active_high_low))
entry->irq = irq;

printk(KERN_DEBUG "%02x:%02x:%02x[%c] -> %d-%d -> IRQ %d\n",
@@ -1140,6 +1146,9 @@
entry->irq);
}

+
+
+
return;
}

--- linux-2.6.0-test2.orig/arch/i386/kernel/irq.c 2003-07-27 17:57:11.000000000 +0100
+++ linux-2.6.0-test2/arch/i386/kernel/irq.c 2003-07-27 22:24:11.000000000 +0100
@@ -1028,6 +1028,13 @@

unsigned long prof_cpu_mask = -1;

+#ifdef CONFIG_X86_IO_APIC
+static struct proc_dir_entry * io_apic_irq_entry;
+
+extern int io_apic_irq_read_proc (char *page, char **start, off_t off,
+ int count, int *eof, void *data);
+#endif
+
void init_irq_proc (void)
{
struct proc_dir_entry *entry;
@@ -1052,5 +1059,24 @@
*/
for (i = 0; i < NR_IRQS; i++)
register_irq_proc(i);
+
+#ifdef CONFIG_X86_IO_APIC
+ if (smp_found_config) {
+ if (!skip_ioapic_setup && nr_ioapics) {
+ struct proc_dir_entry* entry;
+
+ /* create /proc/irq/io_apic */
+ entry = create_proc_entry("io_apic", 0400, root_irq_dir);
+
+ if (entry) {
+ entry->nlink = 1;
+ entry->read_proc = io_apic_irq_read_proc;
+ }
+
+ io_apic_irq_entry = entry;
+ }
+
+ }
+#endif
}

--- linux-2.6.0-test2.orig/drivers/acpi/pci_irq.c 2003-07-27 18:01:22.000000000 +0100
+++ linux-2.6.0-test2/drivers/acpi/pci_irq.c 2003-07-27 22:24:11.000000000 +0100
@@ -249,7 +249,7 @@
}

if (!entry->irq && entry->link.handle) {
- entry->irq = acpi_pci_link_get_irq(entry->link.handle, entry->link.index);
+ entry->irq = acpi_pci_link_get_irq(entry->link.handle, entry->link.index, NULL, NULL);
if (!entry->irq) {
ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Invalid IRQ link routing entry\n"));
return_VALUE(0);
@@ -389,7 +389,9 @@
}

/* Make sure all link devices have a valid IRQ. */
- acpi_pci_link_check();
+ if (acpi_pci_link_check()) {
+ return_VALUE(-ENODEV);
+ }

#ifdef CONFIG_X86_IO_APIC
/* Program IOAPICs using data from PRT entries. */
--- linux-2.6.0-test2.orig/drivers/acpi/pci_link.c 2003-07-27 17:57:17.000000000 +0100
+++ linux-2.6.0-test2/drivers/acpi/pci_link.c 2003-07-28 17:42:07.000000000 +0100
@@ -69,6 +69,9 @@

struct acpi_pci_link_irq {
u8 active; /* Current IRQ */
+ u8 edge_level; /* All IRQs */
+ u8 active_high_low; /* All IRQs */
+ u8 setonboot;
u8 possible_count;
u8 possible[ACPI_PCI_LINK_MAX_POSSIBLE];
};
@@ -118,6 +121,8 @@
link->irq.possible[i] = p->interrupts[i];
link->irq.possible_count++;
}
+ link->irq.edge_level = p->edge_level;
+ link->irq.active_high_low = p->active_high_low;
break;
}
case ACPI_RSTYPE_EXT_IRQ:
@@ -136,6 +141,8 @@
link->irq.possible[i] = p->interrupts[i];
link->irq.possible_count++;
}
+ link->irq.edge_level = p->edge_level;
+ link->irq.active_high_low = p->active_high_low;
break;
}
default:
@@ -264,7 +271,6 @@
* IRQ a boot-enabled Link device is set to is the correct one.
* (Required to support systems such as the Toshiba 5005-S504.)
*/
-
link->irq.active = irq;

ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Link at IRQ %d \n", link->irq.active));
@@ -294,6 +300,8 @@
if (!link || !irq)
return_VALUE(-EINVAL);

+ /* We don't check irqs the first time round */
+ if (link->irq.setonboot) {
/* See if we're already at the target IRQ. */
if (irq == link->irq.active)
return_VALUE(0);
@@ -307,16 +315,18 @@
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Target IRQ %d invalid\n", irq));
return_VALUE(-EINVAL);
}
+ }

memset(&resource, 0, sizeof(resource));

- /* NOTE: PCI interrupts are always level / active_low / shared. */
+ /* NOTE: PCI interrupts are always level / active_low / shared. But not all
+ interrupts > 15 are PCI interrupts. Rely on the ACPI IRQ definition for
+ parameters */
if (irq <= 15) {
resource.res.id = ACPI_RSTYPE_IRQ;
resource.res.length = sizeof(struct acpi_resource);
- resource.res.data.irq.edge_level = ACPI_LEVEL_SENSITIVE;
- resource.res.data.irq.active_high_low = ACPI_ACTIVE_LOW;
- resource.res.data.irq.shared_exclusive = ACPI_SHARED;
+ resource.res.data.irq.edge_level = link->irq.edge_level;
+ resource.res.data.irq.active_high_low = link->irq.active_high_low;
resource.res.data.irq.number_of_interrupts = 1;
resource.res.data.irq.interrupts[0] = irq;
}
@@ -324,15 +334,15 @@
resource.res.id = ACPI_RSTYPE_EXT_IRQ;
resource.res.length = sizeof(struct acpi_resource);
resource.res.data.extended_irq.producer_consumer = ACPI_CONSUMER;
- resource.res.data.extended_irq.edge_level = ACPI_LEVEL_SENSITIVE;
- resource.res.data.extended_irq.active_high_low = ACPI_ACTIVE_LOW;
- resource.res.data.extended_irq.shared_exclusive = ACPI_SHARED;
+ resource.res.data.extended_irq.edge_level = link->irq.edge_level;
+ resource.res.data.extended_irq.active_high_low = link->irq.active_high_low;
resource.res.data.extended_irq.number_of_interrupts = 1;
resource.res.data.extended_irq.interrupts[0] = irq;
/* ignore resource_source, it's optional */
}
resource.end.id = ACPI_RSTYPE_END_TAG;

+ /* Attempt to set the resource */
status = acpi_set_current_resources(link->handle, &buffer);
if (ACPI_FAILURE(status)) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _SRS\n"));
@@ -355,11 +365,13 @@
if (result) {
return_VALUE(result);
}
+
if (link->irq.active != irq) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
"Attempt to enable at IRQ %d resulted in IRQ %d\n",
irq, link->irq.active));
link->irq.active = 0;
+ acpi_ut_evaluate_object (link->handle, "_DIS", 0, NULL);
return_VALUE(-ENODEV);
}

@@ -407,7 +419,7 @@
ACPI_FUNCTION_TRACE("acpi_pci_link_check");

/*
- * Pass #1: Update penalties to facilitate IRQ balancing.
+ * Update penalties to facilitate IRQ balancing.
*/
list_for_each(node, &acpi_link.entries) {

@@ -428,23 +440,23 @@
}
}

- /*
- * Pass #2: Enable boot-disabled Links at 'best' IRQ.
- */
- list_for_each(node, &acpi_link.entries) {
- int irq = 0;
- int i = 0;
+ return_VALUE(0);
+}

- link = list_entry(node, struct acpi_pci_link, node);
- if (!link || !link->irq.possible_count) {
- ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid link context\n"));
- continue;
- }
+static int acpi_pci_link_allocate(struct acpi_pci_link* link) {
+ int irq;
+ int i;

- if (link->irq.active)
- continue;
+ ACPI_FUNCTION_TRACE("acpi_pci_link_allocate");

+ if (link->irq.setonboot)
+ return_VALUE(0);
+
+ if (link->irq.active) {
+ irq = link->irq.active;
+ } else {
irq = link->irq.possible[0];
+ }

/*
* Select the best IRQ. This is done in reverse to promote
@@ -455,16 +467,20 @@
irq = link->irq.possible[i];
}

- /* Enable the link device at this IRQ. */
- acpi_pci_link_set(link, irq);
-
+ /* Attempt to enable the link device at this IRQ. */
+ if (acpi_pci_link_set(link, irq)) {
+ printk(PREFIX "Unable to set IRQ for %s [%s] (likely buggy ACPI BIOS). Aborting ACPI-based IRQ routing. Try pci=noacpi or acpi=off\n",
+ acpi_device_name(link->device),
+ acpi_device_bid(link->device));
+ return_VALUE(-ENODEV);
+ } else {
acpi_irq_penalty[link->irq.active] += 100;
-
printk(PREFIX "%s [%s] enabled at IRQ %d\n",
acpi_device_name(link->device),
acpi_device_bid(link->device), link->irq.active);
}

+ link->irq.setonboot = 1;
return_VALUE(0);
}

@@ -472,7 +488,9 @@
int
acpi_pci_link_get_irq (
acpi_handle handle,
- int index)
+ int index,
+ int* edge_level,
+ int* active_high_low)
{
int result = 0;
struct acpi_device *device = NULL;
@@ -498,11 +516,17 @@
return_VALUE(0);
}

+ if (acpi_pci_link_allocate(link)) {
+ return -ENODEV;
+ }
+
if (!link->irq.active) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Link disabled\n"));
return_VALUE(0);
}

+ if (edge_level) *edge_level = link->irq.edge_level;
+ if (active_high_low) *active_high_low = link->irq.active_high_low;
return_VALUE(link->irq.active);
}

--- linux-2.6.0-test2.orig/include/acpi/acpi_drivers.h 2003-07-27 18:06:07.000000000 +0100
+++ linux-2.6.0-test2/include/acpi/acpi_drivers.h 2003-07-27 22:24:11.000000000 +0100
@@ -60,7 +60,7 @@
/* ACPI PCI Interrupt Link (pci_link.c) */

int acpi_pci_link_check (void);
-int acpi_pci_link_get_irq (acpi_handle handle, int index);
+int acpi_pci_link_get_irq (acpi_handle handle, int index, int* edge_level, int* active_high_low);

/* ACPI PCI Interrupt Routing (pci_irq.c) */

--- linux-2.6.0-test2.orig/include/asm-i386/io_apic.h 2003-07-27 18:04:51.000000000 +0100
+++ linux-2.6.0-test2/include/asm-i386/io_apic.h 2003-07-27 22:24:11.000000000 +0100
@@ -170,7 +170,7 @@
extern int io_apic_get_unique_id (int ioapic, int apic_id);
extern int io_apic_get_version (int ioapic);
extern int io_apic_get_redir_entries (int ioapic);
-extern int io_apic_set_pci_routing (int ioapic, int pin, int irq);
+extern int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int active_high_low);
#endif /*CONFIG_ACPI_BOOT*/

#else /* !CONFIG_X86_IO_APIC */
---CUT HERE---


2003-07-28 15:29:43

by Scott Lockwood

[permalink] [raw]
Subject: Compile error with 2.6.0-test2 config attached

Kernel compiled with 'make bzlilo && make modules modules_install'. Config
attached.

if [ -r System.map ]; then /sbin/depmod -ae -F System.map 2.6.0-test2; fi
depmod: *** Unresolved symbols in
/lib/modules/2.6.0-test2/kernel/drivers/block/cryptoloop.ko
depmod: loop_register_transfer
depmod: loop_unregister_transfer
depmod: *** Unresolved symbols in
/lib/modules/2.6.0-test2/kernel/sound/oss/ac97_plugin_ad1980.ko
depmod: ac97_unregister_driver
depmod: ac97_register_driver
depmod: *** Unresolved symbols in
/lib/modules/2.6.0-test2/kernel/sound/oss/ad1889.ko
depmod: ac97_probe_codec
depmod: ac97_alloc_codec
depmod: ac97_read_proc
depmod: ac97_release_codec
depmod: *** Unresolved symbols in
/lib/modules/2.6.0-test2/kernel/sound/oss/ali5455.ko
depmod: ac97_probe_codec
depmod: ac97_alloc_codec
depmod: ac97_set_dac_rate
depmod: ac97_set_adc_rate
depmod: ac97_release_codec
depmod: *** Unresolved symbols in
/lib/modules/2.6.0-test2/kernel/sound/oss/forte.ko
depmod: ac97_probe_codec
depmod: ac97_alloc_codec
depmod: ac97_read_proc
depmod: ac97_release_codec

--

/"\ / For information and quotes, email us at
\ / ASCII RIBBON CAMPAIGN / [email protected]
X AGAINST HTML MAIL / http://www.lrsehosting.com/
/ \ AND POSTINGS / [email protected]
-------------------------------------------------------------------------


Attachments:
.config (25.07 kB)

2003-07-28 16:09:46

by Alexander Rau

[permalink] [raw]
Subject: Re: [PATCH] ACPI patch which fixes all my IRQ problems on nforce2 -- linux-2.5.75-acpi-irqparams-final4.patch

Andrew de Quincey wrote:
> On Monday 28 July 2003 16:53, you wrote:
>
>>Andrew de Quincey wrote:
>>
>>>Weird! I compiled it on 2.6.0-test2 last night (for a thinkpad T20), and
>>>it was fine..... (and the thinkpad works fine too)
>>>
>>>Send me your .config file so I can fix the patch, please.
>>>
>>Hope this solved the problems on my T40p too :)
>
>
> Ta, lemme know how it goes.
>
>

Sorry, there's still a kernel oops during bootup. I'll provide a kernel
trace when I'm back at home.

Regards, Al


2003-07-28 20:03:48

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH] ACPI patch which fixes all my IRQ problems on nforce2 -- linux-2.5.75-acpi-irqparams-final4.patch

Andrew de Quincey <[email protected]> wrote:
>
> > ---------------------------------------------------------------------------
> >-- CC drivers/acpi/pci_link.o
> > drivers/acpi/pci_link.c: In function `acpi_pci_link_allocate':
> > drivers/acpi/pci_link.c:451: `_dbg' undeclared (first use in this function)
> > drivers/acpi/pci_link.c:451: (Each undeclared identifier is reported
> > only once
> > drivers/acpi/pci_link.c:451: for each function it appears in.)
> > make[2]: *** [drivers/acpi/pci_link.o] Error 1
> > make[1]: *** [drivers/acpi] Error 2
> > make: *** [drivers] Error 2
> > ---------------------------------------------------------------------------
> >--
> >
> > Any ideas how to port your patch to the 2.6 series ?
>
> Weird! I compiled it on 2.6.0-test2 last night (for a thinkpad T20), and it
> was fine..... (and the thinkpad works fine too)

I fixed this in test2-mm1: it needs a

ACPI_FUNCTION_TRACE("acpi_pci_link_allocate");

at the start of that function.

I made a bunch of other changes to that patch - mainly whitespace fixups.
It is at

ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.0-test2/2.6.0-test2-mm1/broken-out/nforce2-acpi-fixes.patch

I'm thinking that perhaps io_apic_irq_read_proc() and print_IO_APIC()
should be consolidated.

2003-07-28 20:28:45

by Andrew de Quincey

[permalink] [raw]
Subject: Re: [PATCH] ACPI patch which fixes all my IRQ problems on nforce2 -- linux-2.5.75-acpi-irqparams-final4.patch


> I fixed this in test2-mm1: it needs a
>
> ACPI_FUNCTION_TRACE("acpi_pci_link_allocate");
>
> at the start of that function.
>
> I made a bunch of other changes to that patch - mainly whitespace fixups.
> It is at
>
> ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.0-test2/2
>.6.0-test2-mm1/broken-out/nforce2-acpi-fixes.patch

Great, thanks.

> I'm thinking that perhaps io_apic_irq_read_proc() and print_IO_APIC()
> should be consolidated.

I agree. I was going to fix that problem in a later patch; this one is already
changing a little too much in one go for my liking.

2003-07-28 21:01:57

by Alexander Rau

[permalink] [raw]
Subject: Re: [PATCH] ACPI patch which fixes all my IRQ problems on nforce2 -- linux-2.5.75-acpi-irqparams-final4.patch

Alexander Rau wrote:
> Andrew de Quincey wrote:
>
>> On Monday 28 July 2003 16:53, you wrote:
>>
>>> Andrew de Quincey wrote:
>>>
>>>> Weird! I compiled it on 2.6.0-test2 last night (for a thinkpad T20),
>>>> and
>>>> it was fine..... (and the thinkpad works fine too)
>>>>
>>>> Send me your .config file so I can fix the patch, please.
>>>>
>>> Hope this solved the problems on my T40p too :)
>>
>>
>>
>> Ta, lemme know how it goes.
>>
>>
>
> Sorry, there's still a kernel oops during bootup. I'll provide a kernel
> trace when I'm back at home.
>
> Regards, Al
>

I tried to dump the kernel messages onto my printer. Unfortunatly it
doesn't print anything, only with acpi=off.

This is somehow unconventional, but here's a link for a screenshot of
the trace. Sorry, one screen is missing but the messages were too fast
for my camera :) I can still recognize a lots of ......... on the
missing screen.

http://w3studi.informatik.uni-stuttgart.de/~rauar/IMG_1120.JPG


Here's the kernel output with acpi=off.

--------------------------------------------------------------------------


Linux version 2.6.0-test2 (root@aphrodite) (gcc version 3.2.3 20030422
(Gentoo Linux 1.4 3.2.3-r1, propolice)) #1 SMP Mon Jul 28 18:17:12 CEST 2003
Video mode to be used for restore is f07
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 000000000009f000 (usable)
BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000d2000 - 00000000000d4000 (reserved)
BIOS-e820: 00000000000dc000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 000000001ff60000 (usable)
BIOS-e820: 000000001ff60000 - 000000001ff79000 (ACPI data)
BIOS-e820: 000000001ff79000 - 000000001ff7b000 (ACPI NVS)
BIOS-e820: 000000001ff80000 - 0000000020000000 (reserved)
BIOS-e820: 00000000ff800000 - 0000000100000000 (reserved)
511MB LOWMEM available.
On node 0 totalpages: 130912
DMA zone: 4096 pages, LIFO batch:1
Normal zone: 126816 pages, LIFO batch:16
HighMem zone: 0 pages, LIFO batch:1
IBM machine detected. Enabling interrupts during APM calls.
IBM machine detected. Disabling SMBus accesses.
Building zonelist for node : 0
Kernel command line: root=/dev/hda3 acpi=off
video=radeonfb:1400x1050x24@60 vga=0x00567
Local APIC disabled by BIOS -- reenabling.
Found and enabled local APIC!
Initializing CPU#0
PID hash table entries: 2048 (order 11: 16384 bytes)
Detected 598.191 MHz processor.
Console: colour VGA+ 80x60
Calibrating delay loop... 1179.64 BogoMIPS
Memory: 512716k/523648k available (2500k kernel code, 10184k reserved,
1040k data, 172k init, 0k highmem)
Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
-> /dev
-> /dev/console
-> /root
CPU: L1 I cache: 32K, L1 D cache: 32K
CPU: L2 cache: 1024K
CPU: After generic, caps: a7e9fbbf 00000000 00000000 00000040
Intel machine check architecture supported.
Intel machine check reporting enabled on CPU#0.
Enabling fast FPU save and restore... done.
Enabling unmasked SIMD FPU exception support... done.
Checking 'hlt' instruction... OK.
POSIX conformance testing by UNIFIX
CPU0: Intel(R) Pentium(R) M processor 1600MHz stepping 05
per-CPU timeslice cutoff: 2925.79 usecs.
task migration cache decay timeout: 3 msecs.
SMP motherboard not detected.
enabled ExtINT on CPU#0
ESR value before enabling vector: 00000000
ESR value after enabling vector: 00000000
Using local APIC timer interrupts.
calibrating APIC timer ...
..... CPU clock speed is 597.0993 MHz.
..... host bus clock speed is 99.0665 MHz.
Starting migration thread for cpu 0
CPUS done 32
Initializing RT netlink socket
PCI: PCI BIOS revision 2.10 entry at 0xfd906, last bus=8
PCI: Using configuration type 1
mtrr: v2.0 (20020519)
BIO: pool of 256 setup, 14Kb (56 bytes/bio)
biovec pool[0]: 1 bvecs: 256 entries (12 bytes)
biovec pool[1]: 4 bvecs: 256 entries (48 bytes)
biovec pool[2]: 16 bvecs: 256 entries (192 bytes)
biovec pool[3]: 64 bvecs: 256 entries (768 bytes)
biovec pool[4]: 128 bvecs: 256 entries (1536 bytes)
biovec pool[5]: 256 bvecs: 256 entries (3072 bytes)
ACPI: Subsystem revision 20030714
ACPI: Disabled via command line (acpi=off)
Linux Plug and Play Support v0.96 (c) Adam Belay
Linux Kernel Card Services 3.1.22
options: [pci] [cardbus] [pm]
drivers/usb/core/usb.c: registered new driver usbfs
drivers/usb/core/usb.c: registered new driver hub
ACPI: ACPI tables contain no PCI IRQ routing entries
PCI: Invalid ACPI-PCI IRQ routing table
PCI: Probing PCI hardware
PCI: Probing PCI hardware (bus 00)
PCI: Ignoring BAR0-3 of IDE controller 0000:00:1f.1
Transparent bridge - Intel Corp. 82801BAM/CAM PCI Bri
PCI: Discovered primary peer bus 09 [IRQ]
PCI: Using IRQ router PIIX [8086/24cc] at 0000:00:1f.0
PCI: IRQ 0 for device 0000:00:1f.1 doesn't match PIRQ mask - try
pci=usepirqmask
PCI: Found IRQ 11 for device 0000:00:1f.1
PCI: Sharing IRQ 11 with 0000:00:1d.2
PCI: Sharing IRQ 11 with 0000:02:02.0
pty: 256 Unix98 ptys configured
SBF: Simple Boot Flag extension found and enabled.
SBF: Setting boot flags 0x1
Enabling SEP on CPU 0
Journalled Block Device driver loaded
devfs: v1.22 (20021013) Richard Gooch ([email protected])
devfs: boot_options: 0x1
NTFS driver 2.1.4 [Flags: R/O].
udf: registering filesystem
request_module: failed /sbin/modprobe -- parport_lowlevel. error = -16
lp: driver loaded but no devices found
Linux agpgart interface v0.100 (c) Dave Jones
agpgart: Detected an Intel 855PM Chipset.
agpgart: Maximum main memory to use for agp memory: 439M
agpgart: AGP aperture is 256M @ 0xd0000000
[drm] Initialized radeon 1.9.0 20020828 on minor 0
Serial: 8250/16550 driver $Revision: 1.90 $ IRQ sharing disabled
PCI: Found IRQ 5 for device 0000:00:1f.6
PCI: Sharing IRQ 5 with 0000:00:1f.3
PCI: Sharing IRQ 5 with 0000:00:1f.5
PCI: Sharing IRQ 5 with 0000:02:00.1
parport0: PC-style at 0x3bc [PCSPP,TRISTATE]
parport0: cpp_daisy: aa5500ff(98)
parport0: assign_addrs: aa5500ff(98)
parport0: Printer, Hewlett-Packard hp LaserJet 1300
lp0: using parport0 (polling).
lp0: console ready
Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx
ICH4: IDE controller at PCI slot 0000:00:1f.1
PCI: Enabling device 0000:00:1f.1 (0005 -> 0007)
PCI: Found IRQ 11 for device 0000:00:1f.1
PCI: Sharing IRQ 11 with 0000:00:1d.2
PCI: Sharing IRQ 11 with 0000:02:02.0
ICH4: chipset revision 1
ICH4: not 100% native mode: will probe irqs later
ide0: BM-DMA at 0x1860-0x1867, BIOS settings: hda:DMA, hdb:pio
ide1: BM-DMA at 0x1868-0x186f, BIOS settings: hdc:DMA, hdd:pio
hda: IC25N040ATCS05-0, ATA DISK drive
Using anticipatory scheduling elevator
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
hdc: UJDA745 DVD/CDRW, ATAPI CD/DVD-ROM drive
ide1 at 0x170-0x177,0x376 on irq 15
hda: max request size: 128KiB
hda: host protected area => 1
hda: setmax LBA 78140160, native 73004018
hda: 73004018 sectors (37378 MB) w/7898KiB Cache, CHS=72424/16/63, UDMA(100)
/dev/ide/host0/bus0/target0/lun0: p1 p2 p3 p4
hdc: ATAPI 24X DVD-ROM CD-R/RW drive, 2048kB Cache, UDMA(33)
Uniform CD-ROM driver Revision: 3.12
PCI: Found IRQ 11 for device 0000:00:1d.7
PCI: Setting latency timer of device 0000:00:1d.7 to 64
ehci_hcd 0000:00:1d.7: Intel Corp. 82801DB USB EHCI Con
ehci_hcd 0000:00:1d.7: irq 11, pci mem e084a000
ehci_hcd 0000:00:1d.7: new USB bus registered, assigned bus number 1
ehci_hcd 0000:00:1d.7: enabled 64bit PCI DMA
PCI: cache line size of 32 is not supported by device 0000:00:1d.7
ehci_hcd 0000:00:1d.7: USB 2.0 enabled, EHCI 1.00, driver 2003-Jun-13
hub 1-0:0: USB hub found
hub 1-0:0: 6 ports detected
drivers/usb/host/uhci-hcd.c: USB Universal Host Controller Interface
driver v2.1
PCI: Found IRQ 11 for device 0000:00:1d.0
PCI: Sharing IRQ 11 with 0000:01:00.0
PCI: Sharing IRQ 11 with 0000:02:00.0
PCI: Sharing IRQ 11 with 0000:02:01.0
PCI: Setting latency timer of device 0000:00:1d.0 to 64
uhci-hcd 0000:00:1d.0: Intel Corp. 82801DB USB (Hub #1)
uhci-hcd 0000:00:1d.0: irq 11, io base 00001800
uhci-hcd 0000:00:1d.0: new USB bus registered, assigned bus number 2
hub 2-0:0: USB hub found
hub 2-0:0: 2 ports detected
PCI: Found IRQ 11 for device 0000:00:1d.1
PCI: Setting latency timer of device 0000:00:1d.1 to 64
uhci-hcd 0000:00:1d.1: Intel Corp. 82801DB USB (Hub #2)
uhci-hcd 0000:00:1d.1: irq 11, io base 00001820
uhci-hcd 0000:00:1d.1: new USB bus registered, assigned bus number 3
hub 3-0:0: USB hub found
hub 3-0:0: 2 ports detected
PCI: Found IRQ 11 for device 0000:00:1d.2
PCI: Sharing IRQ 11 with 0000:00:1f.1
PCI: Sharing IRQ 11 with 0000:02:02.0
PCI: Setting latency timer of device 0000:00:1d.2 to 64
uhci-hcd 0000:00:1d.2: Intel Corp. 82801DB USB (Hub #3)
uhci-hcd 0000:00:1d.2: irq 11, io base 00001840
uhci-hcd 0000:00:1d.2: new USB bus registered, assigned bus number 4
hub 4-0:0: USB hub found
hub 4-0:0: 2 ports detected
mice: PS/2 mouse device common for all mice
input: PS/2 Generic Mouse on isa0060/serio1
serio: i8042 AUX port at 0x60,0x64 irq 12
input: AT Set 2 keyboard on isa0060/serio0
serio: i8042 KBD port at 0x60,0x64 irq 1
Advanced Linux Sound Architecture Driver Version 0.9.4 (Mon Jun 09
12:01:18 2003 UTC).
request_module: failed /sbin/modprobe -- snd-card-0. error = -16
PCI: Found IRQ 5 for device 0000:00:1f.5
PCI: Sharing IRQ 5 with 0000:00:1f.3
PCI: Sharing IRQ 5 with 0000:00:1f.6
PCI: Sharing IRQ 5 with 0000:02:00.1
PCI: Setting latency timer of device 0000:00:1f.5 to 64
hub 1-0:0: debounce: port 3: delay 100ms stable 4 status 0x501
hub 3-0:0: debounce: port 1: delay 100ms stable 4 status 0x301
hub 3-0:0: new USB device on port 1, assigned address 2
intel8x0: clocking to 48000
ALSA device list:
#0: Intel 82801DB-ICH4 at 0xc0000c00, irq 5
NET4: Linux TCP/IP 1.0 for NET4.0
IP: routing cache hash table of 4096 buckets, 32Kbytes
TCP: Hash tables configured (established 32768 bind 32768)
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
BIOS EDD facility v0.09 2003-Jan-22, 1 devices found
kjournald starting. Commit interval 5 seconds
EXT3-fs: mounted filesystem with ordered data mode.
VFS: Mounted root (ext3 filesystem) readonly.
Mounted devfs on /dev
Freeing unused kernel memory: 172k freed
Adding 506512k swap on /dev/hda2. Priority:-1 extents:1
EXT3 FS on hda3, internal journal
Intel(R) PRO/1000 Network Driver - version 5.1.13-k2
Copyright (c) 1999-2003 Intel Corporation.
PCI: Found IRQ 11 for device 0000:02:01.0
PCI: Sharing IRQ 11 with 0000:00:1d.0
PCI: Sharing IRQ 11 with 0000:01:00.0
PCI: Sharing IRQ 11 with 0000:02:00.0
eth0: Intel(R) PRO/1000 Network Connection
PCI: Found IRQ 11 for device 0000:02:00.0
PCI: Sharing IRQ 11 with 0000:00:1d.0
PCI: Sharing IRQ 11 with 0000:01:00.0
PCI: Sharing IRQ 11 with 0000:02:01.0
ti113x: Routing card interrupts to PCI
Yenta IRQ list 0000, PCI irq11
Socket status: 30000011
PCI: Found IRQ 5 for device 0000:02:00.1
PCI: Sharing IRQ 5 with 0000:00:1f.3
PCI: Sharing IRQ 5 with 0000:00:1f.5
PCI: Sharing IRQ 5 with 0000:00:1f.6
ti113x: Routing card interrupts to PCI
Yenta IRQ list 0000, PCI irq5
Socket status: 30000006
kjournald starting. Commit interval 5 seconds
EXT3 FS on hda4, internal journal
EXT3-fs: mounted filesystem with ordered data mode.
Real Time Clock Driver v1.11
cs: IO port probe 0x0c00-0x0cff: clean.
cs: IO port probe 0x0800-0x08ff: clean.
cs: IO port probe 0x0100-0x04ff: excluding 0x3c0-0x3df 0x4d0-0x4d7
cs: IO port probe 0x0a00-0x0aff: clean.
cs: memory probe 0xa0000000-0xa0ffffff: clean.
orinoco.c 0.13e (David Gibson <[email protected]> and others)
orinoco_cs.c 0.13e (David Gibson <[email protected]> and others)
eth1: Station identity 001f:0001:0008:0048
eth1: Looks like a Lucent/Agere firmware version 8.72
eth1: Ad-hoc demo mode supported
eth1: IEEE standard IBSS ad-hoc mode supported
eth1: WEP supported, 104-bit key
eth1: MAC address 00:02:2D:42:CD:E7
eth1: Station name "HERMES I"
eth1: ready
eth1: index 0x01: Vcc 5.0, irq 11, io 0x0100-0x013f
agpgart: Found an AGP 2.0 compliant device at 0000:00:00.0.
agpgart: Putting AGP V2 device at 0000:00:00.0 into 4x mode
agpgart: Putting AGP V2 device at 0000:01:00.0 into 4x mode
[drm] Loading R200 Microcode
PCI: Found IRQ 11 for device 0000:01:00.0
PCI: Sharing IRQ 11 with 0000:00:1d.0
PCI: Sharing IRQ 11 with 0000:02:00.0
PCI: Sharing IRQ 11 with 0000:02:01.0
eth1: New link status: Connected (0001)
hub 1-0:0: debounce: port 4: delay 100ms stable 4 status 0x501
hub 3-0:0: debounce: port 2: delay 100ms stable 4 status 0x101
hub 3-0:0: new USB device on port 2, assigned address 3

2003-07-28 21:16:24

by Andrew de Quincey

[permalink] [raw]
Subject: Re: [PATCH] ACPI patch which fixes all my IRQ problems on nforce2 -- linux-2.5.75-acpi-irqparams-final4.patch


> > Sorry, there's still a kernel oops during bootup. I'll provide a kernel
> > trace when I'm back at home.
> >
> > Regards, Al
>
> I tried to dump the kernel messages onto my printer. Unfortunatly it
> doesn't print anything, only with acpi=off.
>
> This is somehow unconventional, but here's a link for a screenshot of
> the trace. Sorry, one screen is missing but the messages were too fast
> for my camera :) I can still recognize a lots of ......... on the
> missing screen.
>
> http://w3studi.informatik.uni-stuttgart.de/~rauar/IMG_1120.JPG

Thats obviously either a bug in the ACPI parser, or a bug in the AML code of
your BIOS. Can you send a copy of your /proc/acpi/dsdt.

Oh er, as you can't boot it with ACPI, use
http://people.freebsd.org/~takawata/pacpidump.tar.gz to dump it in non-ACPI
mode..

2003-07-29 08:48:33

by Thomas Schlichter

[permalink] [raw]
Subject: Re: [PATCH] ACPI patch which fixes all my IRQ problems on nforce2 -- linux-2.5.75-acpi-irqparams-final4.patch

CPU0
0: 360844 IO-APIC-edge timer
1: 722 IO-APIC-edge i8042
2: 0 XT-PIC cascade
4: 11 IO-APIC-edge serial
5: 0 IO-APIC-edge uhci-hcd
8: 2 IO-APIC-edge rtc
9: 0 IO-APIC-edge acpi
10: 0 IO-APIC-edge uhci-hcd
11: 0 IO-APIC-edge uhci-hcd, ehci_hcd
12: 6901 IO-APIC-edge i8042
14: 30820 IO-APIC-edge ide0
15: 11 IO-APIC-edge ide1
16: 17959 IO-APIC-level nvidia
17: 302 IO-APIC-level eth0
18: 4 IO-APIC-level bttv0
19: 7082 IO-APIC-level EMU10K1
NMI: 0
LOC: 360737
ERR: 0
MIS: 0


Attachments:
(No filename) (1.45 kB)
my_dsdt (15.77 kB)
good_irq_routing_without_acpi (589.00 B)
bad_irq_routing_with_acpi (732.00 B)
Download all attachments