[Intel-gfx] [PATCH 12/19] drm/i915/perf: Parse 64bit report header formats correctly

Dixit, Ashutosh ashutosh.dixit at intel.com
Fri Sep 16 00:47:33 UTC 2022


On Tue, 23 Aug 2022 13:41:48 -0700, Umesh Nerlige Ramappa wrote:
>

Hi Umesh,

> @@ -740,23 +802,19 @@ static int gen8_append_oa_reports(struct i915_perf_stream *stream,
>		u8 *report = oa_buf_base + head;
>		u32 *report32 = (void *)report;
>		u32 ctx_id;
> -		u32 reason;
> +		u64 reason;
>
>		/*
>		 * The reason field includes flags identifying what
>		 * triggered this specific report (mostly timer
>		 * triggered or e.g. due to a context switch).
>		 *
> -		 * This field is never expected to be zero so we can
> -		 * check that the report isn't invalid before copying
> -		 * it to userspace...
> +		 * In MMIO triggered reports, some platforms do not set the
> +		 * reason bit in this field and it is valid to have a reason
> +		 * field of zero.
>		 */
> -		reason = ((report32[0] >> OAREPORT_REASON_SHIFT) &
> -			  (GRAPHICS_VER(stream->perf->i915) == 12 ?
> -			   OAREPORT_REASON_MASK_EXTENDED :
> -			   OAREPORT_REASON_MASK));
> -
> -		ctx_id = report32[2] & stream->specific_ctx_id_mask;
> +		reason = oa_report_reason(stream, report);
> +		ctx_id = oa_context_id(stream, report32);
>
>		/*
>		 * Squash whatever is in the CTX_ID field if it's marked as
> @@ -766,9 +824,10 @@ static int gen8_append_oa_reports(struct i915_perf_stream *stream,
>		 * Note: that we don't clear the valid_ctx_bit so userspace can
>		 * understand that the ID has been squashed by the kernel.
>		 */
> -		if (!(report32[0] & stream->perf->gen8_valid_ctx_bit) &&
> -		    GRAPHICS_VER(stream->perf->i915) <= 11)
> -			ctx_id = report32[2] = INVALID_CTX_ID;
> +		if (oa_report_ctx_invalid(stream, report)) {
> +			ctx_id = INVALID_CTX_ID;
> +			oa_context_id_squash(stream, report32);
> +		}
>
>		/*
>		 * NB: For Gen 8 the OA unit no longer supports clock gating
> @@ -812,7 +871,7 @@ static int gen8_append_oa_reports(struct i915_perf_stream *stream,
>			 */
>			if (stream->ctx &&
>			    stream->specific_ctx_id != ctx_id) {
> -				report32[2] = INVALID_CTX_ID;
> +				oa_context_id_squash(stream, report32);
>			}
>
>			ret = append_oa_sample(stream, buf, count, offset,
> @@ -824,11 +883,11 @@ static int gen8_append_oa_reports(struct i915_perf_stream *stream,
>		}
>
>		/*
> -		 * Clear out the first 2 dword as a mean to detect unlanded
> +		 * Clear out the report id and timestamp as a means to detect unlanded
>		 * reports.
>		 */
> -		report32[0] = 0;
> -		report32[1] = 0;
> +		oa_report_id_clear(stream, report32);
> +		oa_timestamp_clear(stream, report32);

Because we now have these new functions, why do we now need two pointers
report and report32 pointing to the same location? I think we can just have
a single 'void *report' which we can pass into all these functions,
correct?

With this change, this is:

Reviewed-by: Ashutosh Dixit <ashutosh.dixit at intel.com>


More information about the Intel-gfx mailing list