|
@@ -10,19 +10,24 @@
|
|
|
* **pacc : if a valid pci_dev is returned
|
|
|
* *pacc must be passed to pci_acc_cleanup to free it
|
|
|
*
|
|
|
- * vendor_id : the pci vendor id matching the pci device to access
|
|
|
- * dev_ids : device ids matching the pci device to access
|
|
|
+ * domain: domain
|
|
|
+ * bus: bus
|
|
|
+ * slot: slot
|
|
|
+ * func: func
|
|
|
+ * vendor: vendor
|
|
|
+ * device: device
|
|
|
+ * Pass -1 for one of the six above to match any
|
|
|
*
|
|
|
* Returns :
|
|
|
* struct pci_dev which can be used with pci_{read,write}_* functions
|
|
|
* to access the PCI config space of matching pci devices
|
|
|
*/
|
|
|
-struct pci_dev *pci_acc_init(struct pci_access **pacc, int vendor_id,
|
|
|
- int *dev_ids)
|
|
|
+struct pci_dev *pci_acc_init(struct pci_access **pacc, int domain, int bus,
|
|
|
+ int slot, int func, int vendor, int dev)
|
|
|
{
|
|
|
- struct pci_filter filter_nb_link = { -1, -1, -1, -1, vendor_id, 0};
|
|
|
+ struct pci_filter filter_nb_link = { domain, bus, slot, func,
|
|
|
+ vendor, dev };
|
|
|
struct pci_dev *device;
|
|
|
- unsigned int i;
|
|
|
|
|
|
*pacc = pci_alloc();
|
|
|
if (*pacc == NULL)
|
|
@@ -31,14 +36,20 @@ struct pci_dev *pci_acc_init(struct pci_access **pacc, int vendor_id,
|
|
|
pci_init(*pacc);
|
|
|
pci_scan_bus(*pacc);
|
|
|
|
|
|
- for (i = 0; dev_ids[i] != 0; i++) {
|
|
|
- filter_nb_link.device = dev_ids[i];
|
|
|
- for (device = (*pacc)->devices; device; device = device->next) {
|
|
|
- if (pci_filter_match(&filter_nb_link, device))
|
|
|
- return device;
|
|
|
- }
|
|
|
+ for (device = (*pacc)->devices; device; device = device->next) {
|
|
|
+ if (pci_filter_match(&filter_nb_link, device))
|
|
|
+ return device;
|
|
|
}
|
|
|
pci_cleanup(*pacc);
|
|
|
return NULL;
|
|
|
}
|
|
|
+
|
|
|
+/* Typically one wants to get a specific slot(device)/func of the root domain
|
|
|
+ and bus */
|
|
|
+struct pci_dev *pci_slot_func_init(struct pci_access **pacc, int slot,
|
|
|
+ int func)
|
|
|
+{
|
|
|
+ return pci_acc_init(pacc, 0, 0, slot, func, -1, -1);
|
|
|
+}
|
|
|
+
|
|
|
#endif /* defined(__i386__) || defined(__x86_64__) */
|