diff -r 77dec8732cde xen/drivers/passthrough/vtd/dmar.c --- a/xen/drivers/passthrough/vtd/dmar.c Wed Apr 23 16:58:44 2008 +0100 +++ b/xen/drivers/passthrough/vtd/dmar.c Thu Apr 24 15:19:20 2008 +0100 @@ -180,7 +180,12 @@ return NULL; } -static int scope_device_count(void *start, void *end) +static u8 path_dev(u8 dev, int type) +{ + return (type == DMAR_TYPE) ? dev >> 3 : dev; +} + +static int scope_device_count(void *start, void *end, int type) { struct acpi_dev_scope *scope; u16 bus, sub_bus, sec_bus; @@ -206,7 +211,7 @@ while ( --depth > 0 ) { bus = pci_conf_read8( - bus, path->dev, path->fn, PCI_SECONDARY_BUS); + bus, path_dev(path->dev, type), path->fn, PCI_SECONDARY_BUS); path++; } @@ -214,18 +219,18 @@ { dprintk(XENLOG_INFO VTDPREFIX, "found endpoint: bdf = %x:%x:%x\n", - bus, path->dev, path->fn); + bus, path_dev(path->dev, type), path->fn); count++; } else if ( scope->dev_type == ACPI_DEV_P2PBRIDGE ) { dprintk(XENLOG_INFO VTDPREFIX, "found bridge: bdf = %x:%x:%x\n", - bus, path->dev, path->fn); + bus, path_dev(path->dev, type), path->fn); sec_bus = pci_conf_read8( - bus, path->dev, path->fn, PCI_SECONDARY_BUS); + bus, path_dev(path->dev, type), path->fn, PCI_SECONDARY_BUS); sub_bus = pci_conf_read8( - bus, path->dev, path->fn, PCI_SUBORDINATE_BUS); + bus, path_dev(path->dev, type), path->fn, PCI_SUBORDINATE_BUS); while ( sec_bus <= sub_bus ) { @@ -252,14 +257,14 @@ { dprintk(XENLOG_INFO VTDPREFIX, "found IOAPIC: bdf = %x:%x:%x\n", - bus, path->dev, path->fn); + bus, path_dev(path->dev, type), path->fn); count++; } else { dprintk(XENLOG_INFO VTDPREFIX, "found MSI HPET: bdf = %x:%x:%x\n", - bus, path->dev, path->fn); + bus, path_dev(path->dev, type), path->fn); count++; } @@ -304,7 +309,7 @@ dprintk(XENLOG_ERR VTDPREFIX, "invalid vt-d acpi entry type\n"); } - *cnt = scope_device_count(start, end); + *cnt = scope_device_count(start, end, type); if ( *cnt == 0 ) { dprintk(XENLOG_INFO VTDPREFIX, "acpi_parse_dev_scope: no device\n"); @@ -328,7 +333,7 @@ while ( --depth > 0 ) { bus = pci_conf_read8( - bus, path->dev, path->fn, PCI_SECONDARY_BUS); + bus, path_dev(path->dev, type), path->fn, PCI_SECONDARY_BUS); path++; } @@ -336,20 +341,20 @@ { dprintk(XENLOG_INFO VTDPREFIX, "found endpoint: bdf = %x:%x:%x\n", - bus, path->dev, path->fn); + bus, path_dev(path->dev, type), path->fn); pdev->bus = bus; - pdev->devfn = PCI_DEVFN(path->dev, path->fn); + pdev->devfn = PCI_DEVFN(path_dev(path->dev, type), path->fn); pdev++; } else if ( scope->dev_type == ACPI_DEV_P2PBRIDGE ) { dprintk(XENLOG_INFO VTDPREFIX, "found bridge: bus = %x dev = %x func = %x\n", - bus, path->dev, path->fn); + bus, path_dev(path->dev, type), path->fn); sec_bus = pci_conf_read8( - bus, path->dev, path->fn, PCI_SECONDARY_BUS); + bus, path_dev(path->dev, type), path->fn, PCI_SECONDARY_BUS); sub_bus = pci_conf_read8( - bus, path->dev, path->fn, PCI_SUBORDINATE_BUS); + bus, path_dev(path->dev, type), path->fn, PCI_SUBORDINATE_BUS); while ( sec_bus <= sub_bus ) { @@ -382,17 +387,17 @@ return -ENOMEM; acpi_ioapic_unit->apic_id = scope->enum_id; acpi_ioapic_unit->ioapic.bdf.bus = bus; - acpi_ioapic_unit->ioapic.bdf.dev = path->dev; + acpi_ioapic_unit->ioapic.bdf.dev = path_dev(path->dev, type); acpi_ioapic_unit->ioapic.bdf.func = path->fn; list_add(&acpi_ioapic_unit->list, &dmaru->ioapic_list); dprintk(XENLOG_INFO VTDPREFIX, "found IOAPIC: bus = %x dev = %x func = %x\n", - bus, path->dev, path->fn); + bus, path_dev(path->dev, type), path->fn); } else dprintk(XENLOG_INFO VTDPREFIX, "found MSI HPET: bus = %x dev = %x func = %x\n", - bus, path->dev, path->fn); + bus, path_dev(path->dev, type), path->fn); start += scope->length; }