[PATCH] DDX/PCI: Check harder for primary PCI device
Mark Kettenis
mark.kettenis at xs4all.nl
Wed Aug 14 10:50:50 PDT 2013
> From: Egbert Eich <eich at freedesktop.org>
> Date: Wed, 14 Aug 2013 18:17:02 +0200
>
> Primary PCI devices are identified by checking for an 'PCIINFOCLASSES'
> device which is VGA and has access to the memory bars enabled.
> If there should be more than one device for which this is true
> redo the check and also check if IO resoures are also enabled,
> if this still doesn't turn up a unique result also check for
> the presence of a BIOS rom.
Assuming this is a patch carried by SuSE, I'm a little bit surprised
this is needed. These days the primary VGA device should be detected
by libpciaccess through the pci_device_is_boot_vga() call, and I
believe the detection code in xf86pciBus.c should only be hit if that
method isn't implemented in libpciaccess. But for Linux
pci_device_is_boot_vga() is implemented.
> Signed-off-by: Egbert Eich <eich at freedesktop.org>
> ---
> hw/xfree86/common/xf86pciBus.c | 47 +++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 44 insertions(+), 3 deletions(-)
>
> diff --git a/hw/xfree86/common/xf86pciBus.c b/hw/xfree86/common/xf86pciBus.c
> index 258988a..2303f90 100644
> --- a/hw/xfree86/common/xf86pciBus.c
> +++ b/hw/xfree86/common/xf86pciBus.c
> @@ -134,9 +134,50 @@ xf86PciProbe(void)
> primaryBus.id.pci = info;
> }
> else {
> - xf86Msg(X_NOTICE,
> - "More than one possible primary device found\n");
> - primaryBus.type ^= (BusType) (-1);
> + /*
> + * Ok, we found more than one possible primary device
> + * with this heuristic. Now also check if IO is enabled.
> + */
> + int j;
> +
> + primaryBus.type = BUS_NONE;
> + for (j = 0; j < num; j++) {
> + info = xf86PciVideoInfo[j];
> + pci_device_cfg_read_u16(info, & command, 4);
> +
> + if ((command & PCI_CMD_MEM_ENABLE)
> + && (command & PCI_CMD_IO_ENABLE)
> + && (IS_VGA(info->device_class))) {
> + if (primaryBus.type == BUS_NONE) {
> + primaryBus.type = BUS_PCI;
> + primaryBus.id.pci = info;
> + } else {
> + primaryBus.type = BUS_NONE;
> + for (j = 0; j < num; j++) {
> + info = xf86PciVideoInfo[j];
> + pci_device_cfg_read_u16(info, &command, 4);
> +
> + if ((command & PCI_CMD_MEM_ENABLE)
> + && (command & PCI_CMD_IO_ENABLE)
> + && (IS_VGA(info->device_class))
> + && info->rom_size) {
> + if (primaryBus.type == BUS_NONE) {
> + primaryBus.type = BUS_PCI;
> + primaryBus.id.pci = info;
> + } else {
> + xf86Msg(X_NOTICE,
> + "More than one possible "
> + "primary device found\n");
> + primaryBus.type ^= (BusType)(-1);
> + break;
> + }
> + }
> + }
> + break;
> + }
> + }
> + }
> + break;
> }
> }
> }
> --
> 1.8.1.4
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list