Dominik Brodowski | 7fe2f63 | 2011-03-30 16:30:11 +0200 | [diff] [blame] | 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 | * |
Thomas Renninger | 568a899 | 2011-10-11 15:33:50 +0200 | [diff] [blame] | 13 | * domain: domain |
| 14 | * bus: bus |
| 15 | * slot: slot |
| 16 | * func: func |
| 17 | * vendor: vendor |
| 18 | * device: device |
| 19 | * Pass -1 for one of the six above to match any |
Dominik Brodowski | 7fe2f63 | 2011-03-30 16:30:11 +0200 | [diff] [blame] | 20 | * |
| 21 | * Returns : |
| 22 | * struct pci_dev which can be used with pci_{read,write}_* functions |
| 23 | * to access the PCI config space of matching pci devices |
| 24 | */ |
Thomas Renninger | 568a899 | 2011-10-11 15:33:50 +0200 | [diff] [blame] | 25 | struct pci_dev *pci_acc_init(struct pci_access **pacc, int domain, int bus, |
| 26 | int slot, int func, int vendor, int dev) |
Dominik Brodowski | 7fe2f63 | 2011-03-30 16:30:11 +0200 | [diff] [blame] | 27 | { |
Lucas Stach | 06b230e | 2015-04-13 22:24:01 +0200 | [diff] [blame] | 28 | struct pci_filter filter_nb_link; |
Dominik Brodowski | 7fe2f63 | 2011-03-30 16:30:11 +0200 | [diff] [blame] | 29 | struct pci_dev *device; |
Dominik Brodowski | 7fe2f63 | 2011-03-30 16:30:11 +0200 | [diff] [blame] | 30 | |
| 31 | *pacc = pci_alloc(); |
| 32 | if (*pacc == NULL) |
| 33 | return NULL; |
| 34 | |
Lucas Stach | 06b230e | 2015-04-13 22:24:01 +0200 | [diff] [blame] | 35 | pci_filter_init(*pacc, &filter_nb_link); |
| 36 | filter_nb_link.domain = domain; |
| 37 | filter_nb_link.bus = bus; |
| 38 | filter_nb_link.slot = slot; |
| 39 | filter_nb_link.func = func; |
| 40 | filter_nb_link.vendor = vendor; |
| 41 | filter_nb_link.device = dev; |
| 42 | |
Dominik Brodowski | 7fe2f63 | 2011-03-30 16:30:11 +0200 | [diff] [blame] | 43 | pci_init(*pacc); |
| 44 | pci_scan_bus(*pacc); |
| 45 | |
Thomas Renninger | 568a899 | 2011-10-11 15:33:50 +0200 | [diff] [blame] | 46 | for (device = (*pacc)->devices; device; device = device->next) { |
| 47 | if (pci_filter_match(&filter_nb_link, device)) |
| 48 | return device; |
Dominik Brodowski | 7fe2f63 | 2011-03-30 16:30:11 +0200 | [diff] [blame] | 49 | } |
| 50 | pci_cleanup(*pacc); |
| 51 | return NULL; |
| 52 | } |
Thomas Renninger | 568a899 | 2011-10-11 15:33:50 +0200 | [diff] [blame] | 53 | |
| 54 | /* Typically one wants to get a specific slot(device)/func of the root domain |
| 55 | and bus */ |
| 56 | struct pci_dev *pci_slot_func_init(struct pci_access **pacc, int slot, |
| 57 | int func) |
| 58 | { |
| 59 | return pci_acc_init(pacc, 0, 0, slot, func, -1, -1); |
| 60 | } |
| 61 | |
Dominik Brodowski | 7fe2f63 | 2011-03-30 16:30:11 +0200 | [diff] [blame] | 62 | #endif /* defined(__i386__) || defined(__x86_64__) */ |