On Wed, Jul 21, 2021 at 07:16:06PM +0300, Yishai Hadas wrote:
From: Max Gurtovoy <mgurtovoy@nvidia.com>
The new flag field is be used to allow PCI drivers to signal the core code
during driver matching and when generating the modules.alias information.
...
quoted hunk ↗ jump to hunk
@@ -152,10 +152,27 @@ static const struct pci_device_id *pci_match_device(struct pci_driver *drv,
}
spin_unlock(&drv->dynids.lock);
- if (!found_id)
- found_id = pci_match_id(drv->id_table, dev);
+ if (found_id)
+ return found_id;
+
+ ids = drv->id_table;
+ while ((found_id = pci_match_id(ids, dev))) {
+ /*
+ * The match table is split based on driver_override. Check the
+ * flags as well so that any matching PCI_ID_F_DRIVER_OVERRIDE
+ * entry is returned.
+ */
+ if ((found_id->flags & PCI_ID_F_VFIO_DRIVER_OVERRIDE) &&
+ !dev->driver_override)
+ ids = found_id + 1;
+ else
+ break;
+ }
- /* driver_override will always match, send a dummy id */
+ /*
+ * if no static match, driver_override will always match, send a dummy
+ * id.
+ */
if (!found_id && dev->driver_override)
found_id = &pci_device_id_any;
Possibly more readable:
while ((found_id = pci_match_id(ids, dev))) {
/*
* PCI_ID_F_VFIO_DRIVER_OVERRIDE entries only match when
* driver_override matches this driver.
*/
if (found_id->flags & PCI_ID_F_VFIO_DRIVER_OVERRIDE) {
if (dev->driver_override)
return found_id;
else
ids = found_id + 1;
} else {
return found_id;
}
}
/* Driver_override will always match; send a dummy ID */
if (dev->driver_override)
return &pci_device_id_any;
return NULL;