git: c118e4da1296 - main - pci: Add `pci_find_base_class_from()`
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 31 Jan 2025 16:03:10 UTC
The branch main has been updated by dumbbell:
URL: https://cgit.FreeBSD.org/src/commit/?id=c118e4da12969b98f52b3b6f35857c32541d7fa5
commit c118e4da12969b98f52b3b6f35857c32541d7fa5
Author: Jean-Sébastien Pédron <dumbbell@FreeBSD.org>
AuthorDate: 2024-12-22 16:23:34 +0000
Commit: Jean-Sébastien Pédron <dumbbell@FreeBSD.org>
CommitDate: 2025-01-31 16:00:47 +0000
pci: Add `pci_find_base_class_from()`
[Why]
linuxkpi needs to export `pci_get_base_class()` for DRM drivers from
Linux 6.7.
[How]
This new function searches a PCI device with the given base class and
returns it, regardless of its subclass.
The behavior is the same as `pci_find_class_from()` but the subclass is
ignored.
Reviewed by: manu
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D48745
---
sys/dev/pci/pci.c | 21 +++++++++++++++++++++
sys/dev/pci/pcivar.h | 1 +
2 files changed, 22 insertions(+)
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 30a95298a114..edebb718ec53 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -523,6 +523,27 @@ pci_find_class_from(uint8_t class, uint8_t subclass, device_t from)
return (NULL);
}
+device_t
+pci_find_base_class_from(uint8_t class, device_t from)
+{
+ struct pci_devinfo *dinfo;
+ bool found = false;
+
+ STAILQ_FOREACH(dinfo, &pci_devq, pci_links) {
+ if (from != NULL && found == false) {
+ if (from != dinfo->cfg.dev)
+ continue;
+ found = true;
+ continue;
+ }
+ if (dinfo->cfg.baseclass == class) {
+ return (dinfo->cfg.dev);
+ }
+ }
+
+ return (NULL);
+}
+
static int
pci_printf(pcicfgregs *cfg, const char *fmt, ...)
{
diff --git a/sys/dev/pci/pcivar.h b/sys/dev/pci/pcivar.h
index c2c1f055def9..1c7b772afea9 100644
--- a/sys/dev/pci/pcivar.h
+++ b/sys/dev/pci/pcivar.h
@@ -670,6 +670,7 @@ device_t pci_find_dbsf(uint32_t, uint8_t, uint8_t, uint8_t);
device_t pci_find_device(uint16_t, uint16_t);
device_t pci_find_class(uint8_t class, uint8_t subclass);
device_t pci_find_class_from(uint8_t class, uint8_t subclass, device_t devfrom);
+device_t pci_find_base_class_from(uint8_t class, device_t devfrom);
/* Can be used by drivers to manage the MSI-X table. */
int pci_pending_msix(device_t dev, u_int index);