1 #if defined(__i386__) || defined(__x86_64__)
2 
3 #include <helpers/helpers.h>
4 
5 /*
6  * pci_acc_init
7  *
8  * PCI access helper function depending on libpci
9  *
10  * **pacc : if a valid pci_dev is returned
11  *         *pacc must be passed to pci_acc_cleanup to free it
12  *
13  * vendor_id : the pci vendor id matching the pci device to access
14  * dev_ids :   device ids matching the pci device to access
15  *
16  * Returns :
17  * struct pci_dev which can be used with pci_{read,write}_* functions
18  *                to access the PCI config space of matching pci devices
19  */
20 struct pci_dev *pci_acc_init(struct pci_access **pacc, int vendor_id,
21 				    int *dev_ids)
22 {
23 	struct pci_filter filter_nb_link = { -1, -1, -1, -1, vendor_id, 0};
24 	struct pci_dev *device;
25 	unsigned int i;
26 
27 	*pacc = pci_alloc();
28 	if (*pacc == NULL)
29 		return NULL;
30 
31 	pci_init(*pacc);
32 	pci_scan_bus(*pacc);
33 
34 	for (i = 0; dev_ids[i] != 0; i++) {
35 		filter_nb_link.device = dev_ids[i];
36 		for (device = (*pacc)->devices; device; device = device->next) {
37 			if (pci_filter_match(&filter_nb_link, device))
38 				return device;
39 		}
40 	}
41 	pci_cleanup(*pacc);
42 	return NULL;
43 }
44 #endif /* defined(__i386__) || defined(__x86_64__) */
45