From: Egbert Eich Date: Wed Feb 10 15:55:51 2016 +0100 Subject: [PATCH]pci/primary: Fix up primary PCI device detection for the platfrom bus Patch-mainline: to be upstreamed Git-commit: 85d81d3ec321572aea31d34a87632442687a54f5 References: boo#835975 Signed-off-by: Egbert Eich The detection wheter a device is the primary PCI device currently relies on libciaccess. This checks of the PCI device is a VGA boot device. On some systems however, the primary card is not flagged like that - this it is not discovered. The subsequent PCI probing has a fallback heuristic designed for this situation. This however causes the primary device to be flagged as a PCI bus device, not a 'platform bus' device. To fix this, we check in the subsequent xf86platformPrimary() wheter the primary device is flagged as a PCI bus device. If this is the case and the same device is in the list of the 'platform bus' devices, we reflag it as such. This fixes the detection of the primary device on older iMacs. Signed-off-by: Egbert Eich --- hw/xfree86/common/xf86platformBus.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c index 8b3a862..efa6d1a 100644 --- a/hw/xfree86/common/xf86platformBus.c +++ b/hw/xfree86/common/xf86platformBus.c @@ -622,6 +622,35 @@ void xf86platformPrimary(void) xf86Msg(X_NONE, "\tfalling back to %s\n", primaryBus.id.plat->attribs->syspath); } + } else if (xf86_num_platform_devices > 0 && primaryBus.type == BUS_PCI) { + /* + * FIXUP: platform_find_pci_info() may not always find the primary + * platform device. If a primary device is a platform device but was + * identified as PCI device, let's fix this up here. + */ + int i; + + for (i = 0; i < xf86_num_platform_devices; i++) { + char *busid = xf86_platform_odev_attributes(i)->busid; + int domain, bus, dev, func; + int ret; + + if (strncmp(busid, "pci:", 4) != 0) + continue; + + ret = sscanf(busid, "pci:%04x:%02x:%02x.%u", + &domain, &bus, &dev, &func); + if (ret != 4) + continue; + + if (domain == primaryBus.id.pci->domain && + bus == primaryBus.id.pci->bus && + dev == primaryBus.id.pci->dev && + func == primaryBus.id.pci->func) { + primaryBus.id.plat = &xf86_platform_devices[i]; + primaryBus.type = BUS_PLATFORM; + } + } } } #endif