[Intel-xe] [PATCH] drm/xe: Add stepping support for GMD_ID platforms

Balasubramani Vivekanandan balasubramani.vivekanandan at intel.com
Wed May 24 07:07:10 UTC 2023


On 23.05.2023 16:40, Matt Roper wrote:
> For platforms with GMD_ID registers, the IP stepping should be
> determined from the 'revid' field of those registers rather than from
> the PCI revid.
> 
> The hardware teams have indicated that they plan to keep the revid =>
> stepping mapping consistent across all GMD_ID platforms, with major
> steppings (A0, B0, C0, etc.) having revids that are multiples of 4, and
> minor steppings (A1, A2, A3, etc.) taking the intermediate values.  For
> now we'll trust that hardware follows through on this plan; if they have
> to change direction in the future (e.g., they wind up needing something
> like an "A4" that doesn't fit this scheme), we can add a GMD_ID-based
> lookup table when the time comes.
> 
> Signed-off-by: Matt Roper <matthew.d.roper at intel.com>
> ---
>  drivers/gpu/drm/xe/regs/xe_gt_regs.h |  2 +-
>  drivers/gpu/drm/xe/xe_pci.c          | 20 +++++++++----
>  drivers/gpu/drm/xe/xe_step.c         | 45 +++++++++++++++++++++++++++-
>  drivers/gpu/drm/xe/xe_step.h         |  5 +++-
>  drivers/gpu/drm/xe/xe_step_types.h   | 13 ++++----
>  5 files changed, 70 insertions(+), 15 deletions(-)

Reviewed-by: Balasubramani Vivekanandan <balasubramani.vivekanandan at intel.com>

> 
> diff --git a/drivers/gpu/drm/xe/regs/xe_gt_regs.h b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
> index 4d87f1fe010d..e64e5c0733d6 100644
> --- a/drivers/gpu/drm/xe/regs/xe_gt_regs.h
> +++ b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
> @@ -24,7 +24,7 @@
>  #define GMD_ID					XE_REG(0xd8c)
>  #define   GMD_ID_ARCH_MASK			REG_GENMASK(31, 22)
>  #define   GMD_ID_RELEASE_MASK			REG_GENMASK(21, 14)
> -#define   GMD_ID_STEP				REG_GENMASK(5, 0)
> +#define   GMD_ID_REVID				REG_GENMASK(5, 0)
>  
>  #define FORCEWAKE_ACK_GT_MTL			XE_REG(0xdfc)
>  
> diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
> index 2d0d50dcd396..0a8c4a707d05 100644
> --- a/drivers/gpu/drm/xe/xe_pci.c
> +++ b/drivers/gpu/drm/xe/xe_pci.c
> @@ -459,11 +459,14 @@ static void handle_pre_gmdid(struct xe_device *xe,
>  static void handle_gmdid(struct xe_device *xe,
>  			 const struct xe_device_desc *desc,
>  			 const struct xe_graphics_desc **graphics,
> -			 const struct xe_media_desc **media)
> +			 const struct xe_media_desc **media,
> +			 u32 *graphics_revid,
> +			 u32 *media_revid)
>  {
>  	u32 ver;
>  
>  	ver = peek_gmdid(xe, GMD_ID.addr);
> +	*graphics_revid = REG_FIELD_GET(GMD_ID_REVID, ver);
>  	for (int i = 0; i < ARRAY_SIZE(graphics_ip_map); i++) {
>  		if (ver == graphics_ip_map[i].ver) {
>  			xe->info.graphics_verx100 = ver;
> @@ -479,6 +482,7 @@ static void handle_gmdid(struct xe_device *xe,
>  	}
>  
>  	ver = peek_gmdid(xe, GMD_ID.addr + 0x380000);
> +	*media_revid = REG_FIELD_GET(GMD_ID_REVID, ver);
>  	for (int i = 0; i < ARRAY_SIZE(media_ip_map); i++) {
>  		if (ver == media_ip_map[i].ver) {
>  			xe->info.media_verx100 = ver;
> @@ -501,6 +505,7 @@ static int xe_info_init(struct xe_device *xe,
>  {
>  	const struct xe_graphics_desc *graphics_desc = NULL;
>  	const struct xe_media_desc *media_desc = NULL;
> +	u32 graphics_gmdid_revid = 0, media_gmdid_revid = 0;
>  	struct xe_gt *gt;
>  	u8 id;
>  
> @@ -510,10 +515,16 @@ static int xe_info_init(struct xe_device *xe,
>  	 * ever be set at this point for platforms before GMD_ID. In that case
>  	 * the IP descriptions and versions are simply derived from that.
>  	 */
> -	if (desc->graphics)
> +	if (desc->graphics) {
>  		handle_pre_gmdid(xe, desc, &graphics_desc, &media_desc);
> -	else
> -		handle_gmdid(xe, desc, &graphics_desc, &media_desc);
> +		xe->info.step = xe_step_pre_gmdid_get(xe);
> +	} else {
> +		handle_gmdid(xe, desc, &graphics_desc, &media_desc,
> +			     &graphics_gmdid_revid, &media_gmdid_revid);
> +		xe->info.step = xe_step_gmdid_get(xe,
> +						  graphics_gmdid_revid,
> +						  media_gmdid_revid);
> +	}
>  
>  	/*
>  	 * If we couldn't detect the graphics IP, that's considered a fatal
> @@ -557,7 +568,6 @@ static int xe_info_init(struct xe_device *xe,
>  
>  	xe->info.subplatform = subplatform_desc ?
>  		subplatform_desc->subplatform : XE_SUBPLATFORM_NONE;
> -	xe->info.step = xe_step_get(xe);
>  
>  	for (id = 0; id < xe->info.tile_count; ++id) {
>  		gt = xe->gt + id;
> diff --git a/drivers/gpu/drm/xe/xe_step.c b/drivers/gpu/drm/xe/xe_step.c
> index a443d9bd7bbb..1baf79ba02ad 100644
> --- a/drivers/gpu/drm/xe/xe_step.c
> +++ b/drivers/gpu/drm/xe/xe_step.c
> @@ -107,7 +107,14 @@ static const int pvc_basedie_subids[] = {
>  
>  __diag_pop();
>  
> -struct xe_step_info xe_step_get(struct xe_device *xe)
> +/**
> + * xe_step_pre_gmdid_get - Determine IP steppings from PCI revid
> + * @xe: Xe device
> + *
> + * Convert the PCI revid into proper IP steppings.  This should only be
> + * used on platforms that do not have GMD_ID support.
> + */
> +struct xe_step_info xe_step_pre_gmdid_get(struct xe_device *xe)
>  {
>  	const struct xe_step_info *revids = NULL;
>  	struct xe_step_info step = {};
> @@ -198,6 +205,42 @@ struct xe_step_info xe_step_get(struct xe_device *xe)
>  	return step;
>  }
>  
> +/**
> + * xe_step_gmdid_get - Determine IP steppings from GMD_ID revid fields
> + * @xe: Xe device
> + * @graphics_gmdid_revid: value of graphics GMD_ID register's revid field
> + * @media_gmdid_revid: value of media GMD_ID register's revid field
> + *
> + * Convert the revid fields of the GMD_ID registers into proper IP steppings.
> + *
> + * GMD_ID revid values are currently expected to have consistent meanings on
> + * all platforms:  major steppings (A0, B0, etc.) are 4 apart, with minor
> + * steppings (A1, A2, etc.) taking the values in between.
> + */
> +struct xe_step_info xe_step_gmdid_get(struct xe_device *xe,
> +				      u32 graphics_gmdid_revid,
> +				      u32 media_gmdid_revid)
> +{
> +	struct xe_step_info step = {
> +		.graphics = STEP_A0 + graphics_gmdid_revid,
> +		.media = STEP_A0 + media_gmdid_revid,
> +	};
> +
> +	if (step.graphics >= STEP_FUTURE) {
> +		step.graphics = STEP_FUTURE;
> +		drm_dbg(&xe->drm, "Graphics GMD_ID revid value %d treated as future stepping\n",
> +			graphics_gmdid_revid);
> +	}
> +
> +	if (step.media >= STEP_FUTURE) {
> +		step.media = STEP_FUTURE;
> +		drm_dbg(&xe->drm, "Media GMD_ID revid value %d treated as future stepping\n",
> +			graphics_gmdid_revid);
> +	}
> +
> +	return step;
> +}
> +
>  #define STEP_NAME_CASE(name)	\
>  	case STEP_##name:	\
>  		return #name;
> diff --git a/drivers/gpu/drm/xe/xe_step.h b/drivers/gpu/drm/xe/xe_step.h
> index 0c596c8579fb..a384b640f2af 100644
> --- a/drivers/gpu/drm/xe/xe_step.h
> +++ b/drivers/gpu/drm/xe/xe_step.h
> @@ -12,7 +12,10 @@
>  
>  struct xe_device;
>  
> -struct xe_step_info xe_step_get(struct xe_device *xe);
> +struct xe_step_info xe_step_pre_gmdid_get(struct xe_device *xe);
> +struct xe_step_info xe_step_gmdid_get(struct xe_device *xe,
> +				      u32 graphics_gmdid_revid,
> +				      u32 media_gmdid_revid);
>  const char *xe_step_name(enum xe_step step);
>  
>  #endif
> diff --git a/drivers/gpu/drm/xe/xe_step_types.h b/drivers/gpu/drm/xe/xe_step_types.h
> index b7859f9647ca..ccc9b4795e95 100644
> --- a/drivers/gpu/drm/xe/xe_step_types.h
> +++ b/drivers/gpu/drm/xe/xe_step_types.h
> @@ -21,21 +21,20 @@ struct xe_step_info {
>  	func(A0)			\
>  	func(A1)			\
>  	func(A2)			\
> +	func(A3)			\
>  	func(B0)			\
>  	func(B1)			\
>  	func(B2)			\
>  	func(B3)			\
>  	func(C0)			\
>  	func(C1)			\
> +	func(C2)			\
> +	func(C3)			\
>  	func(D0)			\
>  	func(D1)			\
> -	func(E0)			\
> -	func(F0)			\
> -	func(G0)			\
> -	func(H0)			\
> -	func(I0)			\
> -	func(I1)			\
> -	func(J0)
> +	func(D2)			\
> +	func(D3)			\
> +	func(E0)
>  
>  /*
>   * Symbolic steppings that do not match the hardware. These are valid both as gt
> -- 
> 2.40.1
> 


More information about the Intel-xe mailing list