mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-28 16:52:18 +00:00
PCI: Add pci_get_base_class() helper
There is no function to get all PCI devices in a system by matching against the base class code only, ignoring the sub-class code and the programming interface. Add pci_get_base_class() to suit the need. For example, if a driver wants to process all PCI display devices in a system, it can do so like this: pdev = NULL; while ((pdev = pci_get_base_class(PCI_BASE_CLASS_DISPLAY, pdev))) { do_something_for_pci_display_device(pdev); } Link: https://lore.kernel.org/r/20230825062714.6325-2-sui.jingfeng@linux.dev Signed-off-by: Sui Jingfeng <suijingfeng@loongson.cn> [bhelgaas: reword commit log] Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
0bb80ecc33
commit
d427da2323
@ -363,6 +363,37 @@ struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from)
|
||||
}
|
||||
EXPORT_SYMBOL(pci_get_class);
|
||||
|
||||
/**
|
||||
* pci_get_base_class - searching for a PCI device by matching against the base class code only
|
||||
* @class: search for a PCI device with this base class code
|
||||
* @from: Previous PCI device found in search, or %NULL for new search.
|
||||
*
|
||||
* Iterates through the list of known PCI devices. If a PCI device is found
|
||||
* with a matching base class code, the reference count to the device is
|
||||
* incremented. See pci_match_one_device() to figure out how does this works.
|
||||
* A new search is initiated by passing %NULL as the @from argument.
|
||||
* Otherwise if @from is not %NULL, searches continue from next device on the
|
||||
* global list. The reference count for @from is always decremented if it is
|
||||
* not %NULL.
|
||||
*
|
||||
* Returns:
|
||||
* A pointer to a matched PCI device, %NULL Otherwise.
|
||||
*/
|
||||
struct pci_dev *pci_get_base_class(unsigned int class, struct pci_dev *from)
|
||||
{
|
||||
struct pci_device_id id = {
|
||||
.vendor = PCI_ANY_ID,
|
||||
.device = PCI_ANY_ID,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.class_mask = 0xFF0000,
|
||||
.class = class << 16,
|
||||
};
|
||||
|
||||
return pci_get_dev_by_id(&id, from);
|
||||
}
|
||||
EXPORT_SYMBOL(pci_get_base_class);
|
||||
|
||||
/**
|
||||
* pci_dev_present - Returns 1 if device matching the device list is present, 0 if not.
|
||||
* @ids: A pointer to a null terminated list of struct pci_device_id structures
|
||||
|
@ -1181,6 +1181,8 @@ struct pci_dev *pci_get_slot(struct pci_bus *bus, unsigned int devfn);
|
||||
struct pci_dev *pci_get_domain_bus_and_slot(int domain, unsigned int bus,
|
||||
unsigned int devfn);
|
||||
struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from);
|
||||
struct pci_dev *pci_get_base_class(unsigned int class, struct pci_dev *from);
|
||||
|
||||
int pci_dev_present(const struct pci_device_id *ids);
|
||||
|
||||
int pci_bus_read_config_byte(struct pci_bus *bus, unsigned int devfn,
|
||||
@ -1924,6 +1926,9 @@ static inline struct pci_dev *pci_get_class(unsigned int class,
|
||||
struct pci_dev *from)
|
||||
{ return NULL; }
|
||||
|
||||
static inline struct pci_dev *pci_get_base_class(unsigned int class,
|
||||
struct pci_dev *from)
|
||||
{ return NULL; }
|
||||
|
||||
static inline int pci_dev_present(const struct pci_device_id *ids)
|
||||
{ return 0; }
|
||||
|
Loading…
Reference in New Issue
Block a user