[Intel-xe] [RFC PATCH v3 1/3] drm/xe: Introduce function pointers in xe_gt.c with local structure
Ohad Sharabi
osharabi at habana.ai
Tue May 9 06:16:10 UTC 2023
On 20/03/2023 10:12, Francois Dugast wrote:
> A local structure of function pointers is used as a minimal
> hardware abstraction layer to split between common and platform
> specific code. This structure is initialized once with the
> functions matching the platform, then it is used in the common
> code with no need for switch or if/else to detect the platform.
> For now only the function setup_private_ppat() is refactored.
>
> Signed-off-by: Francois Dugast <francois.dugast at intel.com>
> ---
> drivers/gpu/drm/xe/xe_device_types.h | 1 +
> drivers/gpu/drm/xe/xe_gt.c | 49 ++++++++++++++++++++++++----
> 2 files changed, 44 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
> index 4c65598652e8..7d72fb3ff08d 100644
> --- a/drivers/gpu/drm/xe/xe_device_types.h
> +++ b/drivers/gpu/drm/xe/xe_device_types.h
> @@ -313,6 +313,7 @@ struct xe_device {
> u32 lvds_channel_mode;
> } params;
> #endif
> + const struct xe_gt_platform_funcs *gt_funcs;
> };
>
> /**
> diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c
> index daa433d0f2f5..718cd18b6421 100644
> --- a/drivers/gpu/drm/xe/xe_gt.c
> +++ b/drivers/gpu/drm/xe/xe_gt.c
> @@ -42,6 +42,26 @@
> #include "xe_wa.h"
> #include "xe_wopcm.h"
>
> +struct xe_gt_platform_funcs {
> + void (*setup_private_ppat)(struct xe_gt *gt);
> +};
> +
> +static void mtl_setup_private_ppat(struct xe_gt *gt);
> +static void pvc_setup_private_ppat(struct xe_gt *gt);
> +static void tgl_setup_private_ppat(struct xe_gt *gt);
> +
> +static const struct xe_gt_platform_funcs mtl_funcs = {
> + .setup_private_ppat = mtl_setup_private_ppat,
> +};
> +
> +static const struct xe_gt_platform_funcs pvc_funcs = {
> + .setup_private_ppat = pvc_setup_private_ppat,
> +};
> +
> +static const struct xe_gt_platform_funcs tgl_funcs = {
> + .setup_private_ppat = tgl_setup_private_ppat,
> +};
> +
> struct xe_gt *xe_find_full_gt(struct xe_gt *gt)
> {
> struct xe_gt *search;
> @@ -161,12 +181,8 @@ static void setup_private_ppat(struct xe_gt *gt)
> {
> struct xe_device *xe = gt_to_xe(gt);
>
> - if (xe->info.platform == XE_METEORLAKE)
> - mtl_setup_private_ppat(gt);
> - else if (xe->info.platform == XE_PVC)
> - pvc_setup_private_ppat(gt);
> - else
> - tgl_setup_private_ppat(gt);
> + if (xe->gt_funcs->setup_private_ppat)
> + xe->gt_funcs->setup_private_ppat(gt);
> }
>
> static int gt_ttm_mgr_init(struct xe_gt *gt)
> @@ -380,6 +396,27 @@ int xe_gt_record_default_lrcs(struct xe_gt *gt)
> int xe_gt_init_early(struct xe_gt *gt)
> {
> int err;
> + struct xe_device *xe = gt_to_xe(gt);
> +
> + switch (xe->info.platform) {
> + case XE_METEORLAKE:
> + xe->gt_funcs = &mtl_funcs;
> + break;
> + case XE_PVC:
> + xe->gt_funcs = &pvc_funcs;
> + break;
> + case XE_ROCKETLAKE:
> + case XE_DG1:
> + case XE_DG2:
> + case XE_ALDERLAKE_S:
> + case XE_ALDERLAKE_P:
> + case XE_TIGERLAKE:
> + xe->gt_funcs = &tgl_funcs;
> + break;
> + default:
> + DRM_ERROR("Unsupported platform\n");
> + break;
> + }
Won't initializing the function pointer here would do it per number of
tiles (but over-writing the same pointer)?
Maybe consider moving all FP init to the very beginning of
xe_device_probe (sort of sw_init)? We may need some future functions at
an early stage.
In Addition, if I understood correctly, this switch-case would be
present for each FP group.
Do you think it's possible to get this info directly from the descriptor
(the driver data in pci_device_id)?
>
> xe_force_wake_init_gt(gt, gt_to_fw(gt));
>
Thanks,
Ohad
More information about the Intel-xe
mailing list