Code: Select all
static ACPI_STATUS pciWalkCallback(ACPI_HANDLE object, UINT32 nestingLevel, void *context, void **returnvalue)
{
ACPI_DEVICE_INFO *info;
ACPI_STATUS status = AcpiGetObjectInfo(object, &info);
if (status != AE_OK)
{
panic("AcpiGetObjectInfo failed");
};
if (info->Flags & ACPI_PCI_ROOT_BRIDGE)
{
foundRootBridge = 1;
ACPI_BUFFER prtbuf;
prtbuf.Length = ACPI_ALLOCATE_BUFFER;
prtbuf.Pointer = NULL;
status = AcpiGetIrqRoutingTable(object, &prtbuf);
if (status != AE_OK)
{
panic("AcpiGetIrqRoutingTable failed");
};
char *scan = (char*) prtbuf.Pointer;
while (1)
{
ACPI_PCI_ROUTING_TABLE *table = (ACPI_PCI_ROUTING_TABLE*) scan;
if (table->Length == 0)
{
break;
};
uint8_t slot = (uint8_t) (table->Address >> 16);
if (table->Source == 0)
{
// static assignment
pciMapInterruptFromGSI(0, slot, table->Pin+1, table->SourceIndex);
}
else
{
// get the PCI Link Object
ACPI_HANDLE linkObject;
status = AcpiGetHandle(object, table->Source, &linkObject);
if (status != AE_OK)
{
panic("AcpiGetHandle failed for '%s'", table->Source);
};
// get the IRQ it is using
ACPI_BUFFER resbuf;
resbuf.Length = ACPI_ALLOCATE_BUFFER;
resbuf.Pointer = NULL;
status = AcpiGetCurrentResources(linkObject, &resbuf);
if (status != AE_OK)
{
panic("AcpiGetCurrentResources failed for '%s'", table->Source);
};
char *rscan = (char*) resbuf.Pointer;
int devIRQ = -1;
while (1)
{
ACPI_RESOURCE *res = (ACPI_RESOURCE*) rscan;
if (res->Type == ACPI_RESOURCE_TYPE_END_TAG)
{
break;
};
if (res->Type == ACPI_RESOURCE_TYPE_IRQ)
{
devIRQ = res->Data.Irq.Interrupts[table->SourceIndex];
break;
};
rscan += res->Length;
};
kfree(resbuf.Pointer);
if (devIRQ == -1)
{
panic("failed to derive IRQ for device %d from '%s'", (int)slot, table->Source);
};
kprintf("DEVICE %d intpin INT%c# -> IRQ %d (from '%s')\n", (int) slot, 'A'+table->Pin, devIRQ, table->Source);
};
scan += table->Length;
};
kfree(prtbuf.Pointer);
panic("end of tables");
};
ACPI_FREE(info);
return AE_OK;
};
Code: Select all
00001032696i[P2ISA ] PCI IRQ routing: PIRQA# set to 0x0b
00001032715i[P2ISA ] PCI IRQ routing: PIRQB# set to 0x09
00001032734i[P2ISA ] PCI IRQ routing: PIRQC# set to 0x0b
00001032753i[P2ISA ] PCI IRQ routing: PIRQD# set to 0x09
Code: Select all
DEVICE 0 intpin INTA# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 0 intpin INTB# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 0 intpin INTC# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 0 intpin INTD# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 1 intpin INTA# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 1 intpin INTB# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 1 intpin INTC# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 1 intpin INTD# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 2 intpin INTA# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 2 intpin INTB# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 2 intpin INTC# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 2 intpin INTD# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 3 intpin INTA# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 3 intpin INTB# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 3 intpin INTC# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 3 intpin INTD# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 4 intpin INTA# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 4 intpin INTB# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 4 intpin INTC# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 4 intpin INTD# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 5 intpin INTA# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 5 intpin INTB# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 5 intpin INTC# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 5 intpin INTD# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 6 intpin INTA# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 6 intpin INTB# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 6 intpin INTC# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 6 intpin INTD# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 7 intpin INTA# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 7 intpin INTB# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 7 intpin INTC# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 7 intpin INTD# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 8 intpin INTA# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 8 intpin INTB# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 8 intpin INTC# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 8 intpin INTD# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 9 intpin INTA# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 9 intpin INTB# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 9 intpin INTC# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 9 intpin INTD# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 10 intpin INTA# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 10 intpin INTB# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 10 intpin INTC# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 10 intpin INTD# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 11 intpin INTA# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 11 intpin INTB# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 11 intpin INTC# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 11 intpin INTD# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 12 intpin INTA# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 12 intpin INTB# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 12 intpin INTC# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 12 intpin INTD# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 13 intpin INTA# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 13 intpin INTB# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 13 intpin INTC# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 13 intpin INTD# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 14 intpin INTA# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 14 intpin INTB# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 14 intpin INTC# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 14 intpin INTD# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 15 intpin INTA# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 15 intpin INTB# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 15 intpin INTC# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 15 intpin INTD# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 16 intpin INTA# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 16 intpin INTB# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 16 intpin INTC# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 16 intpin INTD# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 17 intpin INTA# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 17 intpin INTB# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 17 intpin INTC# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 17 intpin INTD# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 18 intpin INTA# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 18 intpin INTB# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 18 intpin INTC# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 18 intpin INTD# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 19 intpin INTA# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 19 intpin INTB# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 19 intpin INTC# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 19 intpin INTD# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 20 intpin INTA# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 20 intpin INTB# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 20 intpin INTC# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 20 intpin INTD# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 21 intpin INTA# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 21 intpin INTB# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 21 intpin INTC# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 21 intpin INTD# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 22 intpin INTA# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 22 intpin INTB# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 22 intpin INTC# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 22 intpin INTD# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 23 intpin INTA# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 23 intpin INTB# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 23 intpin INTC# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 23 intpin INTD# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 24 intpin INTA# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 24 intpin INTB# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 24 intpin INTC# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 24 intpin INTD# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 25 intpin INTA# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 25 intpin INTB# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 25 intpin INTC# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 25 intpin INTD# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 26 intpin INTA# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 26 intpin INTB# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 26 intpin INTC# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 26 intpin INTD# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 27 intpin INTA# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 27 intpin INTB# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 27 intpin INTC# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 27 intpin INTD# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 28 intpin INTA# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 28 intpin INTB# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 28 intpin INTC# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 28 intpin INTD# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 29 intpin INTA# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 29 intpin INTB# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 29 intpin INTC# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 29 intpin INTD# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 30 intpin INTA# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 30 intpin INTB# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 30 intpin INTC# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 30 intpin INTD# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 31 intpin INTA# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 31 intpin INTB# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 31 intpin INTC# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 31 intpin INTD# -> IRQ 11 (from '\_SB_.LNKB')
Is this some subtle bug I'm not noticing or does your OS show the same thing?
Thanks.

