diff --git a/drivers/gpu/drm/xe/tests/xe_pci.c b/drivers/gpu/drm/xe/tests/xe_pci.c index 643bddb35214..cc65ac5657b3 100644 --- a/drivers/gpu/drm/xe/tests/xe_pci.c +++ b/drivers/gpu/drm/xe/tests/xe_pci.c @@ -8,6 +8,7 @@ #include "tests/xe_test.h" #include +#include struct kunit_test_data { int ndevs; @@ -60,3 +61,49 @@ int xe_call_for_each_device(xe_device_fn xe_fn) return ret; } + +int xe_pci_fake_device_init(struct xe_device *xe, enum xe_platform platform, + enum xe_subplatform subplatform) +{ + const struct pci_device_id *ent = pciidlist; + const struct xe_device_desc *desc; + const struct xe_subplatform_desc *subplatform_desc; + + if (platform == XE_TEST_PLATFORM_ANY) { + desc = (const void *)ent->driver_data; + subplatform_desc = NULL; + goto done; + } + + for (ent = pciidlist; ent->device; ent++) { + desc = (const void *)ent->driver_data; + if (desc->platform == platform) + break; + } + + if (!ent->device) + return -ENODEV; + + if (subplatform == XE_TEST_SUBPLATFORM_ANY) { + subplatform_desc = desc->subplatforms; + goto done; + } + + for (subplatform_desc = desc->subplatforms; + subplatform_desc && subplatform_desc->subplatform; + subplatform_desc++) + if (subplatform_desc->subplatform == subplatform) + break; + + if (subplatform == XE_SUBPLATFORM_NONE && subplatform_desc) + return -ENODEV; + + if (subplatform != XE_SUBPLATFORM_NONE && !subplatform_desc) + return -ENODEV; + +done: + xe_info_init(xe, desc, subplatform_desc); + + return 0; +} +EXPORT_SYMBOL_IF_KUNIT(xe_pci_fake_device_init); diff --git a/drivers/gpu/drm/xe/tests/xe_pci_test.h b/drivers/gpu/drm/xe/tests/xe_pci_test.h index de65d8c9ccb5..43294e8c62bb 100644 --- a/drivers/gpu/drm/xe/tests/xe_pci_test.h +++ b/drivers/gpu/drm/xe/tests/xe_pci_test.h @@ -6,10 +6,26 @@ #ifndef _XE_PCI_TEST_H_ #define _XE_PCI_TEST_H_ +#include "xe_platform_types.h" + struct xe_device; +/* + * Some defines just for clarity: these mean the test doesn't care about what + * platform it will get since it doesn't depend on any platform-specific bits + */ +#define XE_TEST_PLATFORM_ANY XE_PLATFORM_UNINITIALIZED +#define XE_TEST_SUBPLATFORM_ANY XE_SUBPLATFORM_UNINITIALIZED + typedef int (*xe_device_fn)(struct xe_device *); int xe_call_for_each_device(xe_device_fn xe_fn); +int xe_pci_fake_device_init(struct xe_device *xe, enum xe_platform platform, + enum xe_subplatform subplatform); + +#define xe_pci_fake_device_init_any(xe__) \ + xe_pci_fake_device_init(xe__, XE_TEST_PLATFORM_ANY, \ + XE_TEST_SUBPLATFORM_ANY) + #endif diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c index c567436afcdc..f6050a17c950 100644 --- a/drivers/gpu/drm/xe/xe_pci.c +++ b/drivers/gpu/drm/xe/xe_pci.c @@ -423,7 +423,7 @@ static void xe_pci_remove(struct pci_dev *pdev) static int xe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { - const struct xe_device_desc *desc = (void *)ent->driver_data; + const struct xe_device_desc *desc = (const void *)ent->driver_data; const struct xe_subplatform_desc *subplatform_desc; struct xe_device *xe; int err;