]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/xe: flush gtt before signalling user fence on all engines
authorAndrzej Hajda <andrzej.hajda@intel.com>
Wed, 22 May 2024 07:27:27 +0000 (09:27 +0200)
committerNirmoy Das <nirmoy.das@intel.com>
Tue, 28 May 2024 12:36:05 +0000 (14:36 +0200)
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: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel GPUs")
Signed-off-by: Andrzej Hajda <andrzej.hajda@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240522-xu_flush_vcs_before_ufence-v2-1-9ac3e9af0323@intel.com
Signed-off-by: Nirmoy Das <nirmoy.das@intel.com>
drivers/gpu/drm/xe/xe_ring_ops.c

index f75756e7a87bc84bd406b86f95557a29323a4189..550c3eafbc1da9e7859f4b9f97239c1aab5eee63 100644 (file)
@@ -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_flush_imm_ggtt(xe_lrc_seqno_ggtt_addr(lrc), seqno, false, dw, i);
+
        if (job->user_fence.used)
                i = emit_store_imm_ppgtt_posted(job->user_fence.addr,
                                                job->user_fence.value,
                                                dw, i);
 
-       i = emit_flush_imm_ggtt(xe_lrc_seqno_ggtt_addr(lrc), seqno, false, dw, i);
-
        i = emit_user_interrupt(dw, i);
 
        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,
 
        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)
                i = emit_store_imm_ppgtt_posted(job->user_fence.addr,
                                                job->user_fence.value,
                                                dw, i);
 
-       i = emit_flush_imm_ggtt(xe_lrc_seqno_ggtt_addr(lrc), seqno, false, dw, i);
-
        i = emit_user_interrupt(dw, i);
 
        xe_gt_assert(gt, i <= MAX_JOB_SIZE_DW);