[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