drm/i915/mtl: Resize noa_wait BO size to save restore GPR regs
On MTL, gt->scratch was using stolen lmem. An MI_SRM to stolen lmem caused a hang that was attributed to saving and restoring the GPR registers used for noa_wait. Add an additional page in noa_wait BO to save/restore GPR registers for the noa_wait logic. Signed-off-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com> Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: John Harrison <John.C.Harrison@Intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20221212220902.1819159-2-umesh.nerlige.ramappa@intel.com
This commit is contained in:
committed by
John Harrison
parent
44da203206
commit
a4b6e74c88
@ -304,12 +304,6 @@ enum intel_gt_scratch_field {
|
||||
|
||||
/* 8 bytes */
|
||||
INTEL_GT_SCRATCH_FIELD_COHERENTL3_WA = 256,
|
||||
|
||||
/* 6 * 8 bytes */
|
||||
INTEL_GT_SCRATCH_FIELD_PERF_CS_GPR = 2048,
|
||||
|
||||
/* 4 bytes */
|
||||
INTEL_GT_SCRATCH_FIELD_PERF_PREDICATE_RESULT_1 = 2096,
|
||||
};
|
||||
|
||||
#endif /* __INTEL_GT_TYPES_H__ */
|
||||
|
@ -1845,8 +1845,7 @@ static u32 *save_restore_register(struct i915_perf_stream *stream, u32 *cs,
|
||||
for (d = 0; d < dword_count; d++) {
|
||||
*cs++ = cmd;
|
||||
*cs++ = i915_mmio_reg_offset(reg) + 4 * d;
|
||||
*cs++ = intel_gt_scratch_offset(stream->engine->gt,
|
||||
offset) + 4 * d;
|
||||
*cs++ = i915_ggtt_offset(stream->noa_wait) + offset + 4 * d;
|
||||
*cs++ = 0;
|
||||
}
|
||||
|
||||
@ -1879,7 +1878,13 @@ static int alloc_noa_wait(struct i915_perf_stream *stream)
|
||||
MI_PREDICATE_RESULT_2_ENGINE(base) :
|
||||
MI_PREDICATE_RESULT_1(RENDER_RING_BASE);
|
||||
|
||||
bo = i915_gem_object_create_internal(i915, 4096);
|
||||
/*
|
||||
* gt->scratch was being used to save/restore the GPR registers, but on
|
||||
* MTL the scratch uses stolen lmem. An MI_SRM to this memory region
|
||||
* causes an engine hang. Instead allocate an additional page here to
|
||||
* save/restore GPR registers
|
||||
*/
|
||||
bo = i915_gem_object_create_internal(i915, 8192);
|
||||
if (IS_ERR(bo)) {
|
||||
drm_err(&i915->drm,
|
||||
"Failed to allocate NOA wait batchbuffer\n");
|
||||
@ -1913,14 +1918,19 @@ retry:
|
||||
goto err_unpin;
|
||||
}
|
||||
|
||||
stream->noa_wait = vma;
|
||||
|
||||
#define GPR_SAVE_OFFSET 4096
|
||||
#define PREDICATE_SAVE_OFFSET 4160
|
||||
|
||||
/* Save registers. */
|
||||
for (i = 0; i < N_CS_GPR; i++)
|
||||
cs = save_restore_register(
|
||||
stream, cs, true /* save */, CS_GPR(i),
|
||||
INTEL_GT_SCRATCH_FIELD_PERF_CS_GPR + 8 * i, 2);
|
||||
GPR_SAVE_OFFSET + 8 * i, 2);
|
||||
cs = save_restore_register(
|
||||
stream, cs, true /* save */, mi_predicate_result,
|
||||
INTEL_GT_SCRATCH_FIELD_PERF_PREDICATE_RESULT_1, 1);
|
||||
PREDICATE_SAVE_OFFSET, 1);
|
||||
|
||||
/* First timestamp snapshot location. */
|
||||
ts0 = cs;
|
||||
@ -2036,10 +2046,10 @@ retry:
|
||||
for (i = 0; i < N_CS_GPR; i++)
|
||||
cs = save_restore_register(
|
||||
stream, cs, false /* restore */, CS_GPR(i),
|
||||
INTEL_GT_SCRATCH_FIELD_PERF_CS_GPR + 8 * i, 2);
|
||||
GPR_SAVE_OFFSET + 8 * i, 2);
|
||||
cs = save_restore_register(
|
||||
stream, cs, false /* restore */, mi_predicate_result,
|
||||
INTEL_GT_SCRATCH_FIELD_PERF_PREDICATE_RESULT_1, 1);
|
||||
PREDICATE_SAVE_OFFSET, 1);
|
||||
|
||||
/* And return to the ring. */
|
||||
*cs++ = MI_BATCH_BUFFER_END;
|
||||
@ -2049,7 +2059,6 @@ retry:
|
||||
i915_gem_object_flush_map(bo);
|
||||
__i915_gem_object_release_map(bo);
|
||||
|
||||
stream->noa_wait = vma;
|
||||
goto out_ww;
|
||||
|
||||
err_unpin:
|
||||
|
Reference in New Issue
Block a user