
On 08/12/2011 07:14 PM, Roopa Prabhu wrote:
- get_physical_function(sysfs_path, d); - get_virtual_functions(sysfs_path, d); + if (!pciGetPhysicalFunction(sysfs_path,&d->pci_dev.physical_function)) + d->pci_dev.flags |= VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION; + + if (!pciGetVirtualFunctions(sysfs_path,&d->pci_dev.virtual_functions, +&d->pci_dev.num_virtual_functions) || + d->pci_dev.num_virtual_functions> 0) + d->pci_dev.flags |= VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION;
VIR_FREE(sysfs_path);
[...]
diff --git a/src/util/pci.h b/src/util/pci.h index a351baf..367881e 100644 --- a/src/util/pci.h +++ b/src/util/pci.h @@ -27,6 +27,13 @@ typedef struct _pciDevice pciDevice; typedef struct _pciDeviceList pciDeviceList;
+struct pci_config_address { + unsigned int domain; + unsigned int bus; + unsigned int slot; + unsigned int function; +}; + pciDevice *pciGetDevice (unsigned domain, unsigned bus, unsigned slot, @@ -74,4 +81,22 @@ int pciDeviceIsAssignable(pciDevice *dev, int strict_acs_check); int pciWaitForDeviceCleanup(pciDevice *dev, const char *matcher);
+#ifdef __linux__ + +# define pciGetPhysicalFunction(s,a) pciGetPhysicalFunctionLinux(s,a) +int pciGetPhysicalFunctionLinux(const char *sysfs_path, + struct pci_config_address **phys_fn); + +# define pciGetVirtualFunctions(s,a,n) pciGetVirtualFunctionsLinux(s,a,n) +int pciGetVirtualFunctionsLinux(const char *sysfs_path, + struct pci_config_address ***virtual_functions, + unsigned int *num_virtual_functions); + +#else /* __linux__ */ + +# define pciGetPhysicalFunction(s,a) +# define pciGetVirtualFunctions(s,a,n) + I don't think these #defines will produce compilable code if they are used above. You'll probably have to implement functions for them.
Stefan
+#endif + #endif /* __VIR_PCI_H__ */