[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