b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame^] | 1 | // SPDX-License-Identifier: GPL-2.0 |
| 2 | #if defined(__i386__) || defined(__x86_64__) |
| 3 | |
| 4 | #include <helpers/helpers.h> |
| 5 | |
| 6 | /* |
| 7 | * pci_acc_init |
| 8 | * |
| 9 | * PCI access helper function depending on libpci |
| 10 | * |
| 11 | * **pacc : if a valid pci_dev is returned |
| 12 | * *pacc must be passed to pci_acc_cleanup to free it |
| 13 | * |
| 14 | * domain: domain |
| 15 | * bus: bus |
| 16 | * slot: slot |
| 17 | * func: func |
| 18 | * vendor: vendor |
| 19 | * device: device |
| 20 | * Pass -1 for one of the six above to match any |
| 21 | * |
| 22 | * Returns : |
| 23 | * struct pci_dev which can be used with pci_{read,write}_* functions |
| 24 | * to access the PCI config space of matching pci devices |
| 25 | */ |
| 26 | struct pci_dev *pci_acc_init(struct pci_access **pacc, int domain, int bus, |
| 27 | int slot, int func, int vendor, int dev) |
| 28 | { |
| 29 | struct pci_filter filter_nb_link; |
| 30 | struct pci_dev *device; |
| 31 | |
| 32 | *pacc = pci_alloc(); |
| 33 | if (*pacc == NULL) |
| 34 | return NULL; |
| 35 | |
| 36 | pci_filter_init(*pacc, &filter_nb_link); |
| 37 | filter_nb_link.domain = domain; |
| 38 | filter_nb_link.bus = bus; |
| 39 | filter_nb_link.slot = slot; |
| 40 | filter_nb_link.func = func; |
| 41 | filter_nb_link.vendor = vendor; |
| 42 | filter_nb_link.device = dev; |
| 43 | |
| 44 | pci_init(*pacc); |
| 45 | pci_scan_bus(*pacc); |
| 46 | |
| 47 | for (device = (*pacc)->devices; device; device = device->next) { |
| 48 | if (pci_filter_match(&filter_nb_link, device)) |
| 49 | return device; |
| 50 | } |
| 51 | pci_cleanup(*pacc); |
| 52 | return NULL; |
| 53 | } |
| 54 | |
| 55 | /* Typically one wants to get a specific slot(device)/func of the root domain |
| 56 | and bus */ |
| 57 | struct pci_dev *pci_slot_func_init(struct pci_access **pacc, int slot, |
| 58 | int func) |
| 59 | { |
| 60 | return pci_acc_init(pacc, 0, 0, slot, func, -1, -1); |
| 61 | } |
| 62 | |
| 63 | #endif /* defined(__i386__) || defined(__x86_64__) */ |