Commit 38007fa9 authored by Andrzej Hajda's avatar Andrzej Hajda Committed by Nirmoy Das

drm/xe: flush gtt before signalling user fence on all engines

Tests show that user fence signalling requires kind of write barrier,
otherwise not all writes performed by the workload will be available
to userspace. It is already done for render and compute, we need it
also for the rest: video, gsc, copy.

v2: added gsc and copy engines, added fixes and r-b tags

Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/1488
Fixes: dd08ebf6 ("drm/xe: Introduce a new DRM driver for Intel GPUs")
Signed-off-by: default avatarAndrzej Hajda <andrzej.hajda@intel.com>
Reviewed-by: default avatarMatthew Brost <matthew.brost@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240522-xu_flush_vcs_before_ufence-v2-1-9ac3e9af0323@intel.comSigned-off-by: default avatarNirmoy Das <nirmoy.das@intel.com>
parent ce62827b
...@@ -234,13 +234,13 @@ static void __emit_job_gen12_simple(struct xe_sched_job *job, struct xe_lrc *lrc ...@@ -234,13 +234,13 @@ static void __emit_job_gen12_simple(struct xe_sched_job *job, struct xe_lrc *lrc
i = emit_bb_start(batch_addr, ppgtt_flag, dw, i); i = emit_bb_start(batch_addr, ppgtt_flag, dw, i);
i = emit_flush_imm_ggtt(xe_lrc_seqno_ggtt_addr(lrc), seqno, false, dw, i);
if (job->user_fence.used) if (job->user_fence.used)
i = emit_store_imm_ppgtt_posted(job->user_fence.addr, i = emit_store_imm_ppgtt_posted(job->user_fence.addr,
job->user_fence.value, job->user_fence.value,
dw, i); dw, i);
i = emit_flush_imm_ggtt(xe_lrc_seqno_ggtt_addr(lrc), seqno, false, dw, i);
i = emit_user_interrupt(dw, i); i = emit_user_interrupt(dw, i);
xe_gt_assert(gt, i <= MAX_JOB_SIZE_DW); xe_gt_assert(gt, i <= MAX_JOB_SIZE_DW);
...@@ -293,13 +293,13 @@ static void __emit_job_gen12_video(struct xe_sched_job *job, struct xe_lrc *lrc, ...@@ -293,13 +293,13 @@ static void __emit_job_gen12_video(struct xe_sched_job *job, struct xe_lrc *lrc,
i = emit_bb_start(batch_addr, ppgtt_flag, dw, i); i = emit_bb_start(batch_addr, ppgtt_flag, dw, i);
i = emit_flush_imm_ggtt(xe_lrc_seqno_ggtt_addr(lrc), seqno, false, dw, i);
if (job->user_fence.used) if (job->user_fence.used)
i = emit_store_imm_ppgtt_posted(job->user_fence.addr, i = emit_store_imm_ppgtt_posted(job->user_fence.addr,
job->user_fence.value, job->user_fence.value,
dw, i); dw, i);
i = emit_flush_imm_ggtt(xe_lrc_seqno_ggtt_addr(lrc), seqno, false, dw, i);
i = emit_user_interrupt(dw, i); i = emit_user_interrupt(dw, i);
xe_gt_assert(gt, i <= MAX_JOB_SIZE_DW); xe_gt_assert(gt, i <= MAX_JOB_SIZE_DW);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment