[Intel-gfx] [PATCH v3 1/2] drm/i915/guc: Add error-capture init warnings when needed

John Harrison john.c.harrison at intel.com
Fri Oct 21 19:42:34 UTC 2022


On 10/19/2022 00:29, Alan Previn wrote:
> If GuC is being used and we initialized GuC-error-capture,
> we need to be warning if we don't provide an error-capture
> register list in the firmware ADS, for valid GT engines.
> A warning makes sense as this would impact debugability
> without realizing why a reglist wasn't retrieved and reported
> by GuC.
>
> However, depending on the platform, we might have certain
> engines that have a register list for engine instance error state
> but not for engine class. Thus, add a check only to warn if the
> register list was non existent vs an empty list (use the
> empty lists to skip the warning).
>
> NOTE: if a future platform were to introduce new registers
> in place of what was an empty list on existing / legacy hardware
> engines no warning is provided as the empty list is meant
> to be used intentionally. As an example, if a future hardware
> were to add blitter engine-class-registers (new) on top
> of the legacy blitter engine-instance-register (HEAD, TAIL, etc.),
> no warning is generated.
>
> Signed-off-by: Alan Previn <alan.previn.teres.alexis at intel.com>
Reviewed-by: John Harrison <John.C.Harrison at Intel.com>

> ---
>   .../gpu/drm/i915/gt/uc/intel_guc_capture.c    | 78 ++++++++++++++++---
>   1 file changed, 69 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_capture.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_capture.c
> index d5c03e7a7843..abf6e5eb711e 100644
> --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_capture.c
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_capture.c
> @@ -419,6 +419,44 @@ guc_capture_get_device_reglist(struct intel_guc *guc)
>   	return default_lists;
>   }
>   
> +static const char *
> +__stringify_type(u32 type)
> +{
> +	switch (type) {
> +	case GUC_CAPTURE_LIST_TYPE_GLOBAL:
> +		return "Global";
> +	case GUC_CAPTURE_LIST_TYPE_ENGINE_CLASS:
> +		return "Class";
> +	case GUC_CAPTURE_LIST_TYPE_ENGINE_INSTANCE:
> +		return "Instance";
> +	default:
> +		break;
> +	}
> +
> +	return "unknown";
> +}
> +
> +static const char *
> +__stringify_engclass(u32 class)
> +{
> +	switch (class) {
> +	case GUC_RENDER_CLASS:
> +		return "Render";
> +	case GUC_VIDEO_CLASS:
> +		return "Video";
> +	case GUC_VIDEOENHANCE_CLASS:
> +		return "VideoEnhance";
> +	case GUC_BLITTER_CLASS:
> +		return "Blitter";
> +	case GUC_COMPUTE_CLASS:
> +		return "Compute";
> +	default:
> +		break;
> +	}
> +
> +	return "unknown";
> +}
> +
>   static int
>   guc_capture_list_init(struct intel_guc *guc, u32 owner, u32 type, u32 classid,
>   		      struct guc_mmio_reg *ptr, u16 num_entries)
> @@ -482,23 +520,38 @@ guc_cap_list_num_regs(struct intel_guc_state_capture *gc, u32 owner, u32 type, u
>   	return num_regs;
>   }
>   
> -int
> -intel_guc_capture_getlistsize(struct intel_guc *guc, u32 owner, u32 type, u32 classid,
> -			      size_t *size)
> +static int
> +guc_capture_getlistsize(struct intel_guc *guc, u32 owner, u32 type, u32 classid,
> +			size_t *size, bool is_purpose_est)
>   {
>   	struct intel_guc_state_capture *gc = guc->capture;
> +	struct drm_i915_private *i915 = guc_to_gt(guc)->i915;
>   	struct __guc_capture_ads_cache *cache = &gc->ads_cache[owner][type][classid];
>   	int num_regs;
>   
> -	if (!gc->reglists)
> +	if (!gc->reglists) {
> +		drm_warn(&i915->drm, "GuC-capture: No reglist on this device\n");
>   		return -ENODEV;
> +	}
>   
>   	if (cache->is_valid) {
>   		*size = cache->size;
>   		return cache->status;
>   	}
>   
> +	if (!is_purpose_est && owner == GUC_CAPTURE_LIST_INDEX_PF &&
> +	    !guc_capture_get_one_list(gc->reglists, owner, type, classid)) {
> +		if (type == GUC_CAPTURE_LIST_TYPE_GLOBAL)
> +			drm_warn(&i915->drm, "Missing GuC-Err-Cap reglist Global!\n");
> +		else
> +			drm_warn(&i915->drm, "Missing GuC-Err-Cap reglist %s(%u):%s(%u)!\n",
> +				 __stringify_type(type), type,
> +				 __stringify_engclass(classid), classid);
> +		return -ENODATA;
> +	}
> +
>   	num_regs = guc_cap_list_num_regs(gc, owner, type, classid);
> +	/* intentional empty lists can exist depending on hw config */
>   	if (!num_regs)
>   		return -ENODATA;
>   
> @@ -508,6 +561,13 @@ intel_guc_capture_getlistsize(struct intel_guc *guc, u32 owner, u32 type, u32 cl
>   	return 0;
>   }
>   
> +int
> +intel_guc_capture_getlistsize(struct intel_guc *guc, u32 owner, u32 type, u32 classid,
> +			      size_t *size)
> +{
> +	return guc_capture_getlistsize(guc, owner, type, classid, size, false);
> +}
> +
>   static void guc_capture_create_prealloc_nodes(struct intel_guc *guc);
>   
>   int
> @@ -627,15 +687,15 @@ guc_capture_output_min_size_est(struct intel_guc *guc)
>   		worst_min_size += sizeof(struct guc_state_capture_group_header_t) +
>   					 (3 * sizeof(struct guc_state_capture_header_t));
>   
> -		if (!intel_guc_capture_getlistsize(guc, 0, GUC_CAPTURE_LIST_TYPE_GLOBAL, 0, &tmp))
> +		if (!guc_capture_getlistsize(guc, 0, GUC_CAPTURE_LIST_TYPE_GLOBAL, 0, &tmp, true))
>   			num_regs += tmp;
>   
> -		if (!intel_guc_capture_getlistsize(guc, 0, GUC_CAPTURE_LIST_TYPE_ENGINE_CLASS,
> -						   engine->class, &tmp)) {
> +		if (!guc_capture_getlistsize(guc, 0, GUC_CAPTURE_LIST_TYPE_ENGINE_CLASS,
> +					     engine->class, &tmp, true)) {
>   			num_regs += tmp;
>   		}
> -		if (!intel_guc_capture_getlistsize(guc, 0, GUC_CAPTURE_LIST_TYPE_ENGINE_INSTANCE,
> -						   engine->class, &tmp)) {
> +		if (!guc_capture_getlistsize(guc, 0, GUC_CAPTURE_LIST_TYPE_ENGINE_INSTANCE,
> +					     engine->class, &tmp, true)) {
>   			num_regs += tmp;
>   		}
>   	}



More information about the Intel-gfx mailing list