[PATCH 4/9] drm/xe: Add batch buffer addresses to devcoredump

Rodrigo Vivi rodrigo.vivi at intel.com
Mon Jan 22 20:13:34 UTC 2024


On Mon, Jan 22, 2024 at 09:04:40AM -0800, José Roberto de Souza wrote:
> Those addresses are necessary to Mesa tools knows where in VM are the
> batch buffers to parse and print instructions that are human readable.
> 
> Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
> Cc: Maarten Lankhorst <dev at lankhorst.se>
> Signed-off-by: José Roberto de Souza <jose.souza at intel.com>

Reviewed-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

> ---
>  drivers/gpu/drm/xe/xe_devcoredump.c       |  5 +++
>  drivers/gpu/drm/xe/xe_devcoredump_types.h |  3 ++
>  drivers/gpu/drm/xe/xe_sched_job.c         | 38 +++++++++++++++++++++++
>  drivers/gpu/drm/xe/xe_sched_job.h         |  5 +++
>  drivers/gpu/drm/xe/xe_sched_job_types.h   |  5 +++
>  5 files changed, 56 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_devcoredump.c b/drivers/gpu/drm/xe/xe_devcoredump.c
> index 0f23ecc74b162..a0e3732440ab5 100644
> --- a/drivers/gpu/drm/xe/xe_devcoredump.c
> +++ b/drivers/gpu/drm/xe/xe_devcoredump.c
> @@ -94,6 +94,9 @@ static ssize_t xe_devcoredump_read(char *buffer, loff_t offset,
>  	xe_guc_ct_snapshot_print(coredump->snapshot.ct, &p);
>  	xe_guc_exec_queue_snapshot_print(coredump->snapshot.ge, &p);
>  
> +	drm_printf(&p, "\n**** Job ****\n");
> +	xe_sched_job_snapshot_print(coredump->snapshot.job, &p);
> +
>  	drm_printf(&p, "\n**** HW Engines ****\n");
>  	for (i = 0; i < XE_NUM_HW_ENGINES; i++)
>  		if (coredump->snapshot.hwe[i])
> @@ -114,6 +117,7 @@ static void xe_devcoredump_free(void *data)
>  
>  	xe_guc_ct_snapshot_free(coredump->snapshot.ct);
>  	xe_guc_exec_queue_snapshot_free(coredump->snapshot.ge);
> +	xe_sched_job_snapshot_free(coredump->snapshot.job);
>  	for (i = 0; i < XE_NUM_HW_ENGINES; i++)
>  		if (coredump->snapshot.hwe[i])
>  			xe_hw_engine_snapshot_free(coredump->snapshot.hwe[i]);
> @@ -153,6 +157,7 @@ static void devcoredump_snapshot(struct xe_devcoredump *coredump,
>  
>  	coredump->snapshot.ct = xe_guc_ct_snapshot_capture(&guc->ct, true);
>  	coredump->snapshot.ge = xe_guc_exec_queue_snapshot_capture(job);
> +	coredump->snapshot.job = xe_sched_job_snapshot_capture(job);
>  
>  	for_each_hw_engine(hwe, q->gt, id) {
>  		if (hwe->class != q->hwe->class ||
> diff --git a/drivers/gpu/drm/xe/xe_devcoredump_types.h b/drivers/gpu/drm/xe/xe_devcoredump_types.h
> index 7fdad9c3d3dde..9a12959ed6b14 100644
> --- a/drivers/gpu/drm/xe/xe_devcoredump_types.h
> +++ b/drivers/gpu/drm/xe/xe_devcoredump_types.h
> @@ -31,8 +31,11 @@ struct xe_devcoredump_snapshot {
>  	struct xe_guc_ct_snapshot *ct;
>  	/** @ge: Guc Engine snapshot */
>  	struct xe_guc_submit_exec_queue_snapshot *ge;
> +
>  	/** @hwe: HW Engine snapshot array */
>  	struct xe_hw_engine_snapshot *hwe[XE_NUM_HW_ENGINES];
> +	/** @job: Snapshot of job state */
> +	struct xe_sched_job_snapshot *job;
>  };
>  
>  /**
> diff --git a/drivers/gpu/drm/xe/xe_sched_job.c b/drivers/gpu/drm/xe/xe_sched_job.c
> index 01106a1156ad8..cde1407867db6 100644
> --- a/drivers/gpu/drm/xe/xe_sched_job.c
> +++ b/drivers/gpu/drm/xe/xe_sched_job.c
> @@ -278,3 +278,41 @@ int xe_sched_job_last_fence_add_dep(struct xe_sched_job *job, struct xe_vm *vm)
>  
>  	return drm_sched_job_add_dependency(&job->drm, fence);
>  }
> +
> +struct xe_sched_job_snapshot *
> +xe_sched_job_snapshot_capture(struct xe_sched_job *job)
> +{
> +	struct xe_exec_queue *q = job->q;
> +	struct xe_device *xe = q->gt->tile->xe;
> +	struct xe_sched_job_snapshot *snapshot;
> +	size_t len = sizeof(*snapshot) + (sizeof(u64) * q->width);
> +	u16 i;
> +
> +	snapshot = kzalloc(len, GFP_ATOMIC);
> +	if (!snapshot)
> +		return NULL;
> +
> +	snapshot->batch_addr_len = q->width;
> +	for (i = 0; i < q->width; i++)
> +		snapshot->batch_addr[i] = xe_device_uncanonicalize_addr(xe, job->batch_addr[i]);
> +
> +	return snapshot;
> +}
> +
> +void xe_sched_job_snapshot_free(struct xe_sched_job_snapshot *snapshot)
> +{
> +	kfree(snapshot);
> +}
> +
> +void
> +xe_sched_job_snapshot_print(struct xe_sched_job_snapshot *snapshot,
> +			    struct drm_printer *p)
> +{
> +	u16 i;
> +
> +	if (!snapshot)
> +		return;
> +
> +	for (i = 0; i < snapshot->batch_addr_len; i++)
> +		drm_printf(p, "batch_addr[%u]: 0x%016llx\n", i, snapshot->batch_addr[i]);
> +}
> diff --git a/drivers/gpu/drm/xe/xe_sched_job.h b/drivers/gpu/drm/xe/xe_sched_job.h
> index 34f475ba7f502..f1a660648cf00 100644
> --- a/drivers/gpu/drm/xe/xe_sched_job.h
> +++ b/drivers/gpu/drm/xe/xe_sched_job.h
> @@ -8,6 +8,7 @@
>  
>  #include "xe_sched_job_types.h"
>  
> +struct drm_printer;
>  struct xe_vm;
>  
>  #define XE_SCHED_HANG_LIMIT 1
> @@ -77,4 +78,8 @@ xe_sched_job_add_migrate_flush(struct xe_sched_job *job, u32 flags)
>  
>  bool xe_sched_job_is_migration(struct xe_exec_queue *q);
>  
> +struct xe_sched_job_snapshot *xe_sched_job_snapshot_capture(struct xe_sched_job *job);
> +void xe_sched_job_snapshot_free(struct xe_sched_job_snapshot *snapshot);
> +void xe_sched_job_snapshot_print(struct xe_sched_job_snapshot *snapshot, struct drm_printer *p);
> +
>  #endif
> diff --git a/drivers/gpu/drm/xe/xe_sched_job_types.h b/drivers/gpu/drm/xe/xe_sched_job_types.h
> index 71213ba9735bc..377dc6b806eb8 100644
> --- a/drivers/gpu/drm/xe/xe_sched_job_types.h
> +++ b/drivers/gpu/drm/xe/xe_sched_job_types.h
> @@ -43,4 +43,9 @@ struct xe_sched_job {
>  	u64 batch_addr[];
>  };
>  
> +struct xe_sched_job_snapshot {
> +	u16 batch_addr_len;
> +	u64 batch_addr[];
> +};
> +
>  #endif
> -- 
> 2.43.0
> 


More information about the Intel-xe mailing list