[Intel-xe] [PATCH v2 4/7] drm/xe: Generalize fake device creation
Matt Roper
matthew.d.roper at intel.com
Mon Apr 3 22:58:11 UTC 2023
On Sat, Apr 01, 2023 at 01:51:48AM -0700, Lucas De Marchi wrote:
> Instead of requiring tests to initialize a fake device an keep it in
> sync with xe_pci.c when it's platform-dependent, export a function from
> xe_pci.c to be used and piggy back on the device info creation. For
> simpler tests that don't need any specific platform and just need a fake
> xe device to pass around, xe_pci_fake_device_init_any() can be used.
>
> Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
Reviewed-by: Matt Roper <matthew.d.roper at intel.com>
We'll need to make some updates to the fake device init once GMD_ID
support lands (since the platform won't be directly hooked up to all the
graphics/media feature flags at that point). But no need to worry about
that right now.
Matt
> ---
> drivers/gpu/drm/xe/tests/xe_pci.c | 47 ++++++++++++++++++++++++++
> drivers/gpu/drm/xe/tests/xe_pci_test.h | 16 +++++++++
> drivers/gpu/drm/xe/xe_pci.c | 2 +-
> 3 files changed, 64 insertions(+), 1 deletion(-)
>
> 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 <kunit/test.h>
> +#include <kunit/visibility.h>
>
> 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 302f7f588da1..21ae5e6f8fe5 100644
> --- a/drivers/gpu/drm/xe/xe_pci.c
> +++ b/drivers/gpu/drm/xe/xe_pci.c
> @@ -429,7 +429,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;
> --
> 2.39.0
>
--
Matt Roper
Graphics Software Engineer
Linux GPU Platform Enablement
Intel Corporation
More information about the Intel-xe
mailing list