Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/power/cpupower/utils/helpers/pci.c
26299 views
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__) */
64
65