OSDN Git Service

linux: add pci_device_enable entrypoint and sysfs support for it
authorDave Airlie <airlied@redhat.com>
Wed, 21 May 2008 06:10:24 +0000 (16:10 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 21 May 2008 06:10:24 +0000 (16:10 +1000)
include/pciaccess.h
src/common_interface.c
src/linux_sysfs.c
src/pciaccess_private.h

index de8b4b3..cf32876 100644 (file)
@@ -110,6 +110,8 @@ const char *pci_device_get_subdevice_name(const struct pci_device *dev);
 const char *pci_device_get_vendor_name(const struct pci_device *dev);
 const char *pci_device_get_subvendor_name(const struct pci_device *dev);
 
+void pci_device_enable(struct pci_device *dev);
+
 int pci_device_cfg_read    (struct pci_device *dev, void *data,
     pciaddr_t offset, pciaddr_t size, pciaddr_t *bytes_read);
 int pci_device_cfg_read_u8 (struct pci_device *dev, uint8_t  *data,
index aee2754..663ab44 100644 (file)
@@ -604,3 +604,14 @@ pci_device_cfg_write_bits( struct pci_device * dev, uint32_t mask,
 
     return err;
 }
+
+void
+pci_device_enable(struct pci_device *dev)
+{
+    if (dev == NULL) {
+       return;
+    }
+
+    if (pci_sys->methods->enable)
+       pci_sys->methods->enable(dev);
+}
index 78584d6..5fa0ea1 100644 (file)
@@ -55,6 +55,8 @@
 #include "pciaccess_private.h"
 #include "linux_devmem.h"
 
+static void pci_device_linux_sysfs_enable(struct pci_device *dev);
+
 static int pci_device_linux_sysfs_read_rom( struct pci_device * dev,
     void * buffer );
 
@@ -84,7 +86,8 @@ static const struct pci_system_methods linux_sysfs_methods = {
     .read = pci_device_linux_sysfs_read,
     .write = pci_device_linux_sysfs_write,
 
-    .fill_capabilities = pci_fill_capabilities_generic
+    .fill_capabilities = pci_fill_capabilities_generic,
+    .enable = pci_device_linux_sysfs_enable,
 };
 
 #define SYS_BUS_PCI "/sys/bus/pci/devices"
@@ -622,3 +625,23 @@ pci_device_linux_sysfs_unmap_range(struct pci_device *dev,
 
     return err;
 }
+
+static void pci_device_linux_sysfs_enable(struct pci_device *dev)
+{
+    char name[256];
+    int fd;
+
+    snprintf( name, 255, "%s/%04x:%02x:%02x.%1u/enable",
+             SYS_BUS_PCI,
+             dev->domain,
+             dev->bus,
+             dev->dev,
+             dev->func );
+    
+    fd = open( name, O_RDWR );
+    if (fd == -1)
+       return;
+
+    write( fd, "1", 1 );
+    close(fd);
+}
index 494f577..6048af1 100644 (file)
@@ -59,6 +59,7 @@ struct pci_system_methods {
                pciaddr_t size, pciaddr_t * bytes_written );
 
     int (*fill_capabilities)( struct pci_device * dev );
+    void (*enable)( struct pci_device *dev );
 };
 
 struct pci_device_mapping {