From b2838fb61c3542f107014b285cbda097acae1e12 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 4 Mar 2009 15:55:11 +1000 Subject: [PATCH] pciaccess: provide a method to detect if a device is boot VGA When the linux kernel exposes this information, we can use this interface in the X server to detect whether the kernel believes the device we are looking at is the boot VGA device. Signed-off-by: Dave Airlie --- include/pciaccess.h | 2 ++ src/common_interface.c | 14 ++++++++++++++ src/linux_sysfs.c | 31 +++++++++++++++++++++++++++++++ src/pciaccess_private.h | 1 + 4 files changed, 48 insertions(+) diff --git a/include/pciaccess.h b/include/pciaccess.h index cf32876..6413ae0 100644 --- a/include/pciaccess.h +++ b/include/pciaccess.h @@ -50,6 +50,8 @@ struct pci_slot_match; extern "C" { #endif +int pci_device_is_boot_vga(struct pci_device *dev); + int pci_device_read_rom(struct pci_device *dev, void *buffer); int __deprecated pci_device_map_region(struct pci_device *dev, diff --git a/src/common_interface.c b/src/common_interface.c index 8808fdf..5dcc707 100644 --- a/src/common_interface.c +++ b/src/common_interface.c @@ -108,6 +108,20 @@ pci_device_read_rom( struct pci_device * dev, void * buffer ) return (pci_sys->methods->read_rom)( dev, buffer ); } +/** + * Probe a PCI (VGA) device to determine if its the boot VGA device + * + * \param dev Device whose VGA status to query + * \return + * Zero if not the boot VGA, 1 if the boot VGA. + */ +int +pci_device_is_boot_vga( struct pci_device * dev ) +{ + if (!pci_sys->methods->boot_vga) + return 0; + return pci_sys->methods->boot_vga( dev ); +} /** * Probe a PCI device to learn information about the device. diff --git a/src/linux_sysfs.c b/src/linux_sysfs.c index 8c3cf67..5afa7d2 100644 --- a/src/linux_sysfs.c +++ b/src/linux_sysfs.c @@ -75,6 +75,8 @@ static int pci_device_linux_sysfs_write( struct pci_device * dev, const void * data, pciaddr_t offset, pciaddr_t size, pciaddr_t * bytes_written ); +static int pci_device_linux_sysfs_boot_vga( struct pci_device * dev ); + static const struct pci_system_methods linux_sysfs_methods = { .destroy = NULL, .destroy_device = NULL, @@ -88,6 +90,7 @@ static const struct pci_system_methods linux_sysfs_methods = { .fill_capabilities = pci_fill_capabilities_generic, .enable = pci_device_linux_sysfs_enable, + .boot_vga = pci_device_linux_sysfs_boot_vga, }; #define SYS_BUS_PCI "/sys/bus/pci/devices" @@ -698,3 +701,31 @@ static void pci_device_linux_sysfs_enable(struct pci_device *dev) write( fd, "1", 1 ); close(fd); } + +static int pci_device_linux_sysfs_boot_vga(struct pci_device *dev) +{ + char name[256]; + char reply[3]; + int fd, bytes_read; + int ret = 0; + + snprintf( name, 255, "%s/%04x:%02x:%02x.%1u/boot_vga", + SYS_BUS_PCI, + dev->domain, + dev->bus, + dev->dev, + dev->func ); + + fd = open( name, O_RDWR ); + if (fd == -1) + return 0; + + bytes_read = read(fd, reply, 1); + if (bytes_read != 1) + goto out; + if (reply[0] == '1') + ret = 1; +out: + close(fd); + return ret; +} diff --git a/src/pciaccess_private.h b/src/pciaccess_private.h index bff6903..769e181 100644 --- a/src/pciaccess_private.h +++ b/src/pciaccess_private.h @@ -60,6 +60,7 @@ struct pci_system_methods { int (*fill_capabilities)( struct pci_device * dev ); void (*enable)( struct pci_device *dev ); + int (*boot_vga)( struct pci_device *dev ); }; struct pci_device_mapping { -- 2.7.4