From 361356b08003f5e3c606e16eeb6a17fe02ff2726 Mon Sep 17 00:00:00 2001 From: Moritz Fischer Date: Mon, 8 Mar 2021 12:02:33 -0800 Subject: Add pci_device_disable() function This implements a pci_device_disable() function, currently only for the linux_sysfs() backend. This mirrors the implementation for pci_device_enable() Signed-off-by: Moritz Fischer --- include/pciaccess.h | 1 + src/common_interface.c | 10 ++++++++++ src/linux_sysfs.c | 15 +++++++++++++-- src/pciaccess_private.h | 1 + 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/include/pciaccess.h b/include/pciaccess.h index 3865fe1..829e04c 100644 --- a/include/pciaccess.h +++ b/include/pciaccess.h @@ -143,6 +143,7 @@ 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); +void pci_device_disable(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); diff --git a/src/common_interface.c b/src/common_interface.c index a4439b6..6dbaa6b 100644 --- a/src/common_interface.c +++ b/src/common_interface.c @@ -676,6 +676,16 @@ pci_device_enable(struct pci_device *dev) pci_sys->methods->enable(dev); } +void +pci_device_disable(struct pci_device *dev) +{ + if (dev == NULL) + return; + + if (pci_sys->methods->disable) + pci_sys->methods->disable(dev); +} + /** * Map the legacy memory space for the PCI domain containing \c dev. * diff --git a/src/linux_sysfs.c b/src/linux_sysfs.c index 1b4051b..d62f48c 100644 --- a/src/linux_sysfs.c +++ b/src/linux_sysfs.c @@ -742,7 +742,7 @@ pci_device_linux_sysfs_unmap_range(struct pci_device *dev, return err; } -static void pci_device_linux_sysfs_enable(struct pci_device *dev) +static void pci_device_linux_sysfs_set_enable(struct pci_device *dev, int enable) { char name[256]; int fd; @@ -758,10 +758,20 @@ static void pci_device_linux_sysfs_enable(struct pci_device *dev) if (fd == -1) return; - write( fd, "1", 1 ); + write( fd, enable ? "1" : "0" , 1 ); close(fd); } +static void pci_device_linux_sysfs_enable(struct pci_device *dev) +{ + return pci_device_linux_sysfs_set_enable(dev, 1); +} + +static void pci_device_linux_sysfs_disable(struct pci_device *dev) +{ + return pci_device_linux_sysfs_set_enable(dev, 0); +} + static int pci_device_linux_sysfs_boot_vga(struct pci_device *dev) { char name[256]; @@ -1042,6 +1052,7 @@ static const struct pci_system_methods linux_sysfs_methods = { .fill_capabilities = pci_fill_capabilities_generic, .enable = pci_device_linux_sysfs_enable, + .disable = pci_device_linux_sysfs_disable, .boot_vga = pci_device_linux_sysfs_boot_vga, .has_kernel_driver = pci_device_linux_sysfs_has_kernel_driver, diff --git a/src/pciaccess_private.h b/src/pciaccess_private.h index d3b68d4..be5d15d 100644 --- a/src/pciaccess_private.h +++ b/src/pciaccess_private.h @@ -76,6 +76,7 @@ struct pci_system_methods { int (*fill_capabilities)( struct pci_device * dev ); void (*enable)( struct pci_device *dev ); + void (*disable)( struct pci_device *dev ); int (*boot_vga)( struct pci_device *dev ); int (*has_kernel_driver)( struct pci_device *dev ); struct pci_io_handle *(*open_device_io)( struct pci_io_handle *handle, -- cgit v1.2.1