1 // SPDX-License-Identifier: MIT
3 * Copyright © 2014 Intel Corporation
6 #include "gem/i915_gem_lmem.h"
8 #include "gen8_engine_cs.h"
10 #include "i915_perf.h"
12 #include "intel_context.h"
13 #include "intel_engine.h"
14 #include "intel_engine_regs.h"
15 #include "intel_gpu_commands.h"
17 #include "intel_gt_regs.h"
18 #include "intel_lrc.h"
19 #include "intel_lrc_reg.h"
20 #include "intel_ring.h"
21 #include "shmem_utils.h"
24 * The per-platform tables are u8-encoded in @data. Decode @data and set the
25 * addresses' offset and commands in @regs. The following encoding is used
26 * for each byte. There are 2 steps: decoding commands and decoding addresses.
29 * [7]: create NOPs - number of NOPs are set in lower bits
30 * [6]: When creating MI_LOAD_REGISTER_IMM command, allow to set
32 * [5:0]: Number of NOPs or registers to set values to in case of
33 * MI_LOAD_REGISTER_IMM
35 * Addresses: these are decoded after a MI_LOAD_REGISTER_IMM command by "count"
36 * number of registers. They are set by using the REG/REG16 macros: the former
37 * is used for offsets smaller than 0x200 while the latter is for values bigger
38 * than that. Those macros already set all the bits documented below correctly:
40 * [7]: When a register offset needs more than 6 bits, use additional bytes, to
41 * follow, for the lower bits
42 * [6:0]: Register offset, without considering the engine base.
44 * This function only tweaks the commands and register offsets. Values are not
47 static void set_offsets(u32 *regs,
49 const struct intel_engine_cs *engine,
51 #define NOP(x) (BIT(7) | (x))
52 #define LRI(count, flags) ((flags) << 6 | (count) | BUILD_BUG_ON_ZERO(count >= BIT(6)))
54 #define REG(x) (((x) >> 2) | BUILD_BUG_ON_ZERO(x >= 0x200))
56 (((x) >> 9) | BIT(7) | BUILD_BUG_ON_ZERO(x >= 0x10000)), \
60 const u32 base = engine->mmio_base;
65 if (*data & BIT(7)) { /* skip */
66 count = *data++ & ~BIT(7);
75 *regs = MI_LOAD_REGISTER_IMM(count);
77 *regs |= MI_LRI_FORCE_POSTED;
78 if (GRAPHICS_VER(engine->i915) >= 11)
79 *regs |= MI_LRI_LRM_CS_MMIO;
90 offset |= v & ~BIT(7);
93 regs[0] = base + (offset << 2);
99 /* Close the batch; used mainly by live_lrc_layout() */
100 *regs = MI_BATCH_BUFFER_END;
101 if (GRAPHICS_VER(engine->i915) >= 11)
106 static const u8 gen8_xcs_offsets[] = {
141 static const u8 gen9_xcs_offsets[] = {
225 static const u8 gen12_xcs_offsets[] = {
257 static const u8 dg2_xcs_offsets[] = {
291 static const u8 gen8_rcs_offsets[] = {
328 static const u8 gen9_rcs_offsets[] = {
412 static const u8 gen11_rcs_offsets[] = {
453 static const u8 gen12_rcs_offsets[] = {
549 static const u8 dg2_rcs_offsets[] = {
592 static const u8 mtl_rcs_offsets[] = {
641 static const u8 *reg_offsets(const struct intel_engine_cs *engine)
644 * The gen12+ lists only have the registers we program in the basic
645 * default state. We rely on the context image using relative
646 * addressing to automatic fixup the register state between the
647 * physical engines for virtual engine.
649 GEM_BUG_ON(GRAPHICS_VER(engine->i915) >= 12 &&
650 !intel_engine_has_relative_mmio(engine));
652 if (engine->flags & I915_ENGINE_HAS_RCS_REG_STATE) {
653 if (GRAPHICS_VER_FULL(engine->i915) >= IP_VER(12, 70))
654 return mtl_rcs_offsets;
655 else if (GRAPHICS_VER_FULL(engine->i915) >= IP_VER(12, 55))
656 return dg2_rcs_offsets;
657 else if (GRAPHICS_VER(engine->i915) >= 12)
658 return gen12_rcs_offsets;
659 else if (GRAPHICS_VER(engine->i915) >= 11)
660 return gen11_rcs_offsets;
661 else if (GRAPHICS_VER(engine->i915) >= 9)
662 return gen9_rcs_offsets;
664 return gen8_rcs_offsets;
666 if (GRAPHICS_VER_FULL(engine->i915) >= IP_VER(12, 55))
667 return dg2_xcs_offsets;
668 else if (GRAPHICS_VER(engine->i915) >= 12)
669 return gen12_xcs_offsets;
670 else if (GRAPHICS_VER(engine->i915) >= 9)
671 return gen9_xcs_offsets;
673 return gen8_xcs_offsets;
677 static int lrc_ring_mi_mode(const struct intel_engine_cs *engine)
679 if (GRAPHICS_VER_FULL(engine->i915) >= IP_VER(12, 55))
681 else if (GRAPHICS_VER(engine->i915) >= 12)
683 else if (GRAPHICS_VER(engine->i915) >= 9)
685 else if (engine->class == RENDER_CLASS)
691 static int lrc_ring_bb_offset(const struct intel_engine_cs *engine)
693 if (GRAPHICS_VER_FULL(engine->i915) >= IP_VER(12, 55))
695 else if (GRAPHICS_VER(engine->i915) >= 12)
697 else if (GRAPHICS_VER(engine->i915) >= 9)
699 else if (GRAPHICS_VER(engine->i915) >= 8 &&
700 engine->class == RENDER_CLASS)
706 static int lrc_ring_gpr0(const struct intel_engine_cs *engine)
708 if (GRAPHICS_VER_FULL(engine->i915) >= IP_VER(12, 55))
710 else if (GRAPHICS_VER(engine->i915) >= 12)
712 else if (GRAPHICS_VER(engine->i915) >= 9)
714 else if (engine->class == RENDER_CLASS)
720 static int lrc_ring_wa_bb_per_ctx(const struct intel_engine_cs *engine)
722 if (GRAPHICS_VER(engine->i915) >= 12)
724 else if (GRAPHICS_VER(engine->i915) >= 9 || engine->class == RENDER_CLASS)
730 static int lrc_ring_indirect_ptr(const struct intel_engine_cs *engine)
734 x = lrc_ring_wa_bb_per_ctx(engine);
741 static int lrc_ring_indirect_offset(const struct intel_engine_cs *engine)
745 x = lrc_ring_indirect_ptr(engine);
752 static int lrc_ring_cmd_buf_cctl(const struct intel_engine_cs *engine)
755 if (GRAPHICS_VER_FULL(engine->i915) >= IP_VER(12, 55))
757 * Note that the CSFE context has a dummy slot for CMD_BUF_CCTL
758 * simply to match the RCS context image layout.
761 else if (engine->class != RENDER_CLASS)
763 else if (GRAPHICS_VER(engine->i915) >= 12)
765 else if (GRAPHICS_VER(engine->i915) >= 11)
772 lrc_ring_indirect_offset_default(const struct intel_engine_cs *engine)
774 if (GRAPHICS_VER(engine->i915) >= 12)
775 return GEN12_CTX_RCS_INDIRECT_CTX_OFFSET_DEFAULT;
776 else if (GRAPHICS_VER(engine->i915) >= 11)
777 return GEN11_CTX_RCS_INDIRECT_CTX_OFFSET_DEFAULT;
778 else if (GRAPHICS_VER(engine->i915) >= 9)
779 return GEN9_CTX_RCS_INDIRECT_CTX_OFFSET_DEFAULT;
780 else if (GRAPHICS_VER(engine->i915) >= 8)
781 return GEN8_CTX_RCS_INDIRECT_CTX_OFFSET_DEFAULT;
783 GEM_BUG_ON(GRAPHICS_VER(engine->i915) < 8);
789 lrc_setup_bb_per_ctx(u32 *regs,
790 const struct intel_engine_cs *engine,
791 u32 ctx_bb_ggtt_addr)
793 GEM_BUG_ON(lrc_ring_wa_bb_per_ctx(engine) == -1);
794 regs[lrc_ring_wa_bb_per_ctx(engine) + 1] =
801 lrc_setup_indirect_ctx(u32 *regs,
802 const struct intel_engine_cs *engine,
803 u32 ctx_bb_ggtt_addr,
807 GEM_BUG_ON(!IS_ALIGNED(size, CACHELINE_BYTES));
808 GEM_BUG_ON(lrc_ring_indirect_ptr(engine) == -1);
809 regs[lrc_ring_indirect_ptr(engine) + 1] =
810 ctx_bb_ggtt_addr | (size / CACHELINE_BYTES);
812 GEM_BUG_ON(lrc_ring_indirect_offset(engine) == -1);
813 regs[lrc_ring_indirect_offset(engine) + 1] =
814 lrc_ring_indirect_offset_default(engine) << 6;
817 static bool ctx_needs_runalone(const struct intel_context *ce)
819 struct i915_gem_context *gem_ctx;
820 bool ctx_is_protected = false;
823 * Wa_14019159160 - Case 2.
824 * On some platforms, protected contexts require setting
825 * the LRC run-alone bit or else the encryption/decryption will not happen.
826 * NOTE: Case 2 only applies to PXP use-case of said workaround.
828 if (GRAPHICS_VER_FULL(ce->engine->i915) >= IP_VER(12, 70) &&
829 (ce->engine->class == COMPUTE_CLASS || ce->engine->class == RENDER_CLASS)) {
831 gem_ctx = rcu_dereference(ce->gem_context);
833 ctx_is_protected = gem_ctx->uses_protected_content;
837 return ctx_is_protected;
840 static void init_common_regs(u32 * const regs,
841 const struct intel_context *ce,
842 const struct intel_engine_cs *engine,
848 ctl = _MASKED_BIT_ENABLE(CTX_CTRL_INHIBIT_SYN_CTX_SWITCH);
849 ctl |= _MASKED_BIT_DISABLE(CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT);
851 ctl |= CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT;
852 if (GRAPHICS_VER(engine->i915) < 11)
853 ctl |= _MASKED_BIT_DISABLE(CTX_CTRL_ENGINE_CTX_SAVE_INHIBIT |
854 CTX_CTRL_RS_CTX_ENABLE);
855 /* Wa_14019159160 - Case 2.*/
856 if (ctx_needs_runalone(ce))
857 ctl |= _MASKED_BIT_ENABLE(GEN12_CTX_CTRL_RUNALONE_MODE);
858 regs[CTX_CONTEXT_CONTROL] = ctl;
860 regs[CTX_TIMESTAMP] = ce->stats.runtime.last;
862 loc = lrc_ring_bb_offset(engine);
867 static void init_wa_bb_regs(u32 * const regs,
868 const struct intel_engine_cs *engine)
870 const struct i915_ctx_workarounds * const wa_ctx = &engine->wa_ctx;
872 if (wa_ctx->per_ctx.size) {
873 const u32 ggtt_offset = i915_ggtt_offset(wa_ctx->vma);
875 GEM_BUG_ON(lrc_ring_wa_bb_per_ctx(engine) == -1);
876 regs[lrc_ring_wa_bb_per_ctx(engine) + 1] =
877 (ggtt_offset + wa_ctx->per_ctx.offset) | 0x01;
880 if (wa_ctx->indirect_ctx.size) {
881 lrc_setup_indirect_ctx(regs, engine,
882 i915_ggtt_offset(wa_ctx->vma) +
883 wa_ctx->indirect_ctx.offset,
884 wa_ctx->indirect_ctx.size);
888 static void init_ppgtt_regs(u32 *regs, const struct i915_ppgtt *ppgtt)
890 if (i915_vm_is_4lvl(&ppgtt->vm)) {
891 /* 64b PPGTT (48bit canonical)
892 * PDP0_DESCRIPTOR contains the base address to PML4 and
893 * other PDP Descriptors are ignored.
895 ASSIGN_CTX_PML4(ppgtt, regs);
897 ASSIGN_CTX_PDP(ppgtt, regs, 3);
898 ASSIGN_CTX_PDP(ppgtt, regs, 2);
899 ASSIGN_CTX_PDP(ppgtt, regs, 1);
900 ASSIGN_CTX_PDP(ppgtt, regs, 0);
904 static struct i915_ppgtt *vm_alias(struct i915_address_space *vm)
906 if (i915_is_ggtt(vm))
907 return i915_vm_to_ggtt(vm)->alias;
909 return i915_vm_to_ppgtt(vm);
912 static void __reset_stop_ring(u32 *regs, const struct intel_engine_cs *engine)
916 x = lrc_ring_mi_mode(engine);
918 regs[x + 1] &= ~STOP_RING;
919 regs[x + 1] |= STOP_RING << 16;
923 static void __lrc_init_regs(u32 *regs,
924 const struct intel_context *ce,
925 const struct intel_engine_cs *engine,
929 * A context is actually a big batch buffer with several
930 * MI_LOAD_REGISTER_IMM commands followed by (reg, value) pairs. The
931 * values we are setting here are only for the first context restore:
932 * on a subsequent save, the GPU will recreate this batchbuffer with new
933 * values (including all the missing MI_LOAD_REGISTER_IMM commands that
934 * we are not initializing here).
936 * Must keep consistent with virtual_update_register_offsets().
940 memset(regs, 0, PAGE_SIZE);
942 set_offsets(regs, reg_offsets(engine), engine, inhibit);
944 init_common_regs(regs, ce, engine, inhibit);
945 init_ppgtt_regs(regs, vm_alias(ce->vm));
947 init_wa_bb_regs(regs, engine);
949 __reset_stop_ring(regs, engine);
952 void lrc_init_regs(const struct intel_context *ce,
953 const struct intel_engine_cs *engine,
956 __lrc_init_regs(ce->lrc_reg_state, ce, engine, inhibit);
959 void lrc_reset_regs(const struct intel_context *ce,
960 const struct intel_engine_cs *engine)
962 __reset_stop_ring(ce->lrc_reg_state, engine);
966 set_redzone(void *vaddr, const struct intel_engine_cs *engine)
968 if (!IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM))
971 vaddr += engine->context_size;
973 memset(vaddr, CONTEXT_REDZONE, I915_GTT_PAGE_SIZE);
977 check_redzone(const void *vaddr, const struct intel_engine_cs *engine)
979 if (!IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM))
982 vaddr += engine->context_size;
984 if (memchr_inv(vaddr, CONTEXT_REDZONE, I915_GTT_PAGE_SIZE))
985 drm_err_once(&engine->i915->drm,
986 "%s context redzone overwritten!\n",
990 static u32 context_wa_bb_offset(const struct intel_context *ce)
992 return PAGE_SIZE * ce->wa_bb_page;
996 * per_ctx below determines which WABB section is used.
997 * When true, the function returns the location of the
998 * PER_CTX_BB. When false, the function returns the
999 * location of the INDIRECT_CTX.
1001 static u32 *context_wabb(const struct intel_context *ce, bool per_ctx)
1005 GEM_BUG_ON(!ce->wa_bb_page);
1007 ptr = ce->lrc_reg_state;
1008 ptr -= LRC_STATE_OFFSET; /* back to start of context image */
1009 ptr += context_wa_bb_offset(ce);
1010 ptr += per_ctx ? PAGE_SIZE : 0;
1015 void lrc_init_state(struct intel_context *ce,
1016 struct intel_engine_cs *engine,
1019 bool inhibit = true;
1021 set_redzone(state, engine);
1023 if (ce->default_state) {
1024 shmem_read(ce->default_state, 0, state, engine->context_size);
1025 __set_bit(CONTEXT_VALID_BIT, &ce->flags);
1029 /* Clear the ppHWSP (inc. per-context counters) */
1030 memset(state, 0, PAGE_SIZE);
1032 /* Clear the indirect wa and storage */
1034 memset(state + context_wa_bb_offset(ce), 0, PAGE_SIZE);
1037 * The second page of the context object contains some registers which
1038 * must be set up prior to the first execution.
1040 __lrc_init_regs(state + LRC_STATE_OFFSET, ce, engine, inhibit);
1043 u32 lrc_indirect_bb(const struct intel_context *ce)
1045 return i915_ggtt_offset(ce->state) + context_wa_bb_offset(ce);
1048 static u32 *setup_predicate_disable_wa(const struct intel_context *ce, u32 *cs)
1050 /* If predication is active, this will be noop'ed */
1051 *cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT | (4 - 2);
1052 *cs++ = lrc_indirect_bb(ce) + DG2_PREDICATE_RESULT_WA;
1054 *cs++ = 0; /* No predication */
1056 /* predicated end, only terminates if SET_PREDICATE_RESULT:0 is clear */
1057 *cs++ = MI_BATCH_BUFFER_END | BIT(15);
1058 *cs++ = MI_SET_PREDICATE | MI_SET_PREDICATE_DISABLE;
1060 /* Instructions are no longer predicated (disabled), we can proceed */
1061 *cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT | (4 - 2);
1062 *cs++ = lrc_indirect_bb(ce) + DG2_PREDICATE_RESULT_WA;
1064 *cs++ = 1; /* enable predication before the next BB */
1066 *cs++ = MI_BATCH_BUFFER_END;
1067 GEM_BUG_ON(offset_in_page(cs) > DG2_PREDICATE_RESULT_WA);
1072 static struct i915_vma *
1073 __lrc_alloc_state(struct intel_context *ce, struct intel_engine_cs *engine)
1075 struct drm_i915_gem_object *obj;
1076 struct i915_vma *vma;
1079 context_size = round_up(engine->context_size, I915_GTT_PAGE_SIZE);
1081 if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM))
1082 context_size += I915_GTT_PAGE_SIZE; /* for redzone */
1084 if (GRAPHICS_VER(engine->i915) >= 12) {
1085 ce->wa_bb_page = context_size / PAGE_SIZE;
1086 /* INDIRECT_CTX and PER_CTX_BB need separate pages. */
1087 context_size += PAGE_SIZE * 2;
1090 if (intel_context_is_parent(ce) && intel_engine_uses_guc(engine)) {
1091 ce->parallel.guc.parent_page = context_size / PAGE_SIZE;
1092 context_size += PARENT_SCRATCH_SIZE;
1095 obj = i915_gem_object_create_lmem(engine->i915, context_size,
1096 I915_BO_ALLOC_PM_VOLATILE);
1098 obj = i915_gem_object_create_shmem(engine->i915, context_size);
1100 return ERR_CAST(obj);
1103 * Wa_22016122933: For Media version 13.0, all Media GT shared
1104 * memory needs to be mapped as WC on CPU side and UC (PAT
1105 * index 2) on GPU side.
1107 if (intel_gt_needs_wa_22016122933(engine->gt))
1108 i915_gem_object_set_cache_coherency(obj, I915_CACHE_NONE);
1111 vma = i915_vma_instance(obj, &engine->gt->ggtt->vm, NULL);
1113 i915_gem_object_put(obj);
1120 static struct intel_timeline *
1121 pinned_timeline(struct intel_context *ce, struct intel_engine_cs *engine)
1123 struct intel_timeline *tl = fetch_and_zero(&ce->timeline);
1125 return intel_timeline_create_from_engine(engine, page_unmask_bits(tl));
1128 int lrc_alloc(struct intel_context *ce, struct intel_engine_cs *engine)
1130 struct intel_ring *ring;
1131 struct i915_vma *vma;
1134 GEM_BUG_ON(ce->state);
1136 if (!intel_context_has_own_state(ce))
1137 ce->default_state = engine->default_state;
1139 vma = __lrc_alloc_state(ce, engine);
1141 return PTR_ERR(vma);
1143 ring = intel_engine_create_ring(engine, ce->ring_size);
1145 err = PTR_ERR(ring);
1149 if (!page_mask_bits(ce->timeline)) {
1150 struct intel_timeline *tl;
1153 * Use the static global HWSP for the kernel context, and
1154 * a dynamically allocated cacheline for everyone else.
1156 if (unlikely(ce->timeline))
1157 tl = pinned_timeline(ce, engine);
1159 tl = intel_timeline_create(engine->gt);
1174 intel_ring_put(ring);
1180 void lrc_reset(struct intel_context *ce)
1182 GEM_BUG_ON(!intel_context_is_pinned(ce));
1184 intel_ring_reset(ce->ring, ce->ring->emit);
1186 /* Scrub away the garbage */
1187 lrc_init_regs(ce, ce->engine, true);
1188 ce->lrc.lrca = lrc_update_regs(ce, ce->engine, ce->ring->tail);
1192 lrc_pre_pin(struct intel_context *ce,
1193 struct intel_engine_cs *engine,
1194 struct i915_gem_ww_ctx *ww,
1197 GEM_BUG_ON(!ce->state);
1198 GEM_BUG_ON(!i915_vma_is_pinned(ce->state));
1200 *vaddr = i915_gem_object_pin_map(ce->state->obj,
1201 intel_gt_coherent_map_type(ce->engine->gt,
1206 return PTR_ERR_OR_ZERO(*vaddr);
1210 lrc_pin(struct intel_context *ce,
1211 struct intel_engine_cs *engine,
1214 ce->lrc_reg_state = vaddr + LRC_STATE_OFFSET;
1216 if (!__test_and_set_bit(CONTEXT_INIT_BIT, &ce->flags))
1217 lrc_init_state(ce, engine, vaddr);
1219 ce->lrc.lrca = lrc_update_regs(ce, engine, ce->ring->tail);
1223 void lrc_unpin(struct intel_context *ce)
1225 if (unlikely(ce->parallel.last_rq)) {
1226 i915_request_put(ce->parallel.last_rq);
1227 ce->parallel.last_rq = NULL;
1229 check_redzone((void *)ce->lrc_reg_state - LRC_STATE_OFFSET,
1233 void lrc_post_unpin(struct intel_context *ce)
1235 i915_gem_object_unpin_map(ce->state->obj);
1238 void lrc_fini(struct intel_context *ce)
1243 intel_ring_put(fetch_and_zero(&ce->ring));
1244 i915_vma_put(fetch_and_zero(&ce->state));
1247 void lrc_destroy(struct kref *kref)
1249 struct intel_context *ce = container_of(kref, typeof(*ce), ref);
1251 GEM_BUG_ON(!i915_active_is_idle(&ce->active));
1252 GEM_BUG_ON(intel_context_is_pinned(ce));
1256 intel_context_fini(ce);
1257 intel_context_free(ce);
1261 gen12_emit_timestamp_wa(const struct intel_context *ce, u32 *cs)
1263 *cs++ = MI_LOAD_REGISTER_MEM_GEN8 |
1264 MI_SRM_LRM_GLOBAL_GTT |
1266 *cs++ = i915_mmio_reg_offset(GEN8_RING_CS_GPR(0, 0));
1267 *cs++ = i915_ggtt_offset(ce->state) + LRC_STATE_OFFSET +
1268 CTX_TIMESTAMP * sizeof(u32);
1271 *cs++ = MI_LOAD_REGISTER_REG |
1272 MI_LRR_SOURCE_CS_MMIO |
1274 *cs++ = i915_mmio_reg_offset(GEN8_RING_CS_GPR(0, 0));
1275 *cs++ = i915_mmio_reg_offset(RING_CTX_TIMESTAMP(0));
1277 *cs++ = MI_LOAD_REGISTER_REG |
1278 MI_LRR_SOURCE_CS_MMIO |
1280 *cs++ = i915_mmio_reg_offset(GEN8_RING_CS_GPR(0, 0));
1281 *cs++ = i915_mmio_reg_offset(RING_CTX_TIMESTAMP(0));
1287 gen12_emit_restore_scratch(const struct intel_context *ce, u32 *cs)
1289 GEM_BUG_ON(lrc_ring_gpr0(ce->engine) == -1);
1291 *cs++ = MI_LOAD_REGISTER_MEM_GEN8 |
1292 MI_SRM_LRM_GLOBAL_GTT |
1294 *cs++ = i915_mmio_reg_offset(GEN8_RING_CS_GPR(0, 0));
1295 *cs++ = i915_ggtt_offset(ce->state) + LRC_STATE_OFFSET +
1296 (lrc_ring_gpr0(ce->engine) + 1) * sizeof(u32);
1303 gen12_emit_cmd_buf_wa(const struct intel_context *ce, u32 *cs)
1305 GEM_BUG_ON(lrc_ring_cmd_buf_cctl(ce->engine) == -1);
1307 *cs++ = MI_LOAD_REGISTER_MEM_GEN8 |
1308 MI_SRM_LRM_GLOBAL_GTT |
1310 *cs++ = i915_mmio_reg_offset(GEN8_RING_CS_GPR(0, 0));
1311 *cs++ = i915_ggtt_offset(ce->state) + LRC_STATE_OFFSET +
1312 (lrc_ring_cmd_buf_cctl(ce->engine) + 1) * sizeof(u32);
1315 *cs++ = MI_LOAD_REGISTER_REG |
1316 MI_LRR_SOURCE_CS_MMIO |
1318 *cs++ = i915_mmio_reg_offset(GEN8_RING_CS_GPR(0, 0));
1319 *cs++ = i915_mmio_reg_offset(RING_CMD_BUF_CCTL(0));
1325 * The bspec's tuning guide asks us to program a vertical watermark value of
1326 * 0x3FF. However this register is not saved/restored properly by the
1327 * hardware, so we're required to apply the desired value via INDIRECT_CTX
1328 * batch buffer to ensure the value takes effect properly. All other bits
1329 * in this register should remain at 0 (the hardware default).
1332 dg2_emit_draw_watermark_setting(u32 *cs)
1334 *cs++ = MI_LOAD_REGISTER_IMM(1);
1335 *cs++ = i915_mmio_reg_offset(DRAW_WATERMARK);
1336 *cs++ = REG_FIELD_PREP(VERT_WM_VAL, 0x3FF);
1342 gen12_invalidate_state_cache(u32 *cs)
1344 *cs++ = MI_LOAD_REGISTER_IMM(1);
1345 *cs++ = i915_mmio_reg_offset(GEN12_CS_DEBUG_MODE2);
1346 *cs++ = _MASKED_BIT_ENABLE(INSTRUCTION_STATE_CACHE_INVALIDATE);
1351 gen12_emit_indirect_ctx_rcs(const struct intel_context *ce, u32 *cs)
1353 cs = gen12_emit_timestamp_wa(ce, cs);
1354 cs = gen12_emit_cmd_buf_wa(ce, cs);
1355 cs = gen12_emit_restore_scratch(ce, cs);
1357 /* Wa_16013000631:dg2 */
1358 if (IS_DG2_G11(ce->engine->i915))
1359 cs = gen8_emit_pipe_control(cs, PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE, 0);
1361 cs = gen12_emit_aux_table_inv(ce->engine, cs);
1363 /* Wa_18022495364 */
1364 if (IS_GFX_GT_IP_RANGE(ce->engine->gt, IP_VER(12, 0), IP_VER(12, 10)))
1365 cs = gen12_invalidate_state_cache(cs);
1367 /* Wa_16014892111 */
1368 if (IS_GFX_GT_IP_STEP(ce->engine->gt, IP_VER(12, 70), STEP_A0, STEP_B0) ||
1369 IS_GFX_GT_IP_STEP(ce->engine->gt, IP_VER(12, 71), STEP_A0, STEP_B0) ||
1370 IS_DG2(ce->engine->i915))
1371 cs = dg2_emit_draw_watermark_setting(cs);
1377 gen12_emit_indirect_ctx_xcs(const struct intel_context *ce, u32 *cs)
1379 cs = gen12_emit_timestamp_wa(ce, cs);
1380 cs = gen12_emit_restore_scratch(ce, cs);
1382 /* Wa_16013000631:dg2 */
1383 if (IS_DG2_G11(ce->engine->i915))
1384 if (ce->engine->class == COMPUTE_CLASS)
1385 cs = gen8_emit_pipe_control(cs,
1386 PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE,
1389 return gen12_emit_aux_table_inv(ce->engine, cs);
1392 static u32 *xehp_emit_fastcolor_blt_wabb(const struct intel_context *ce, u32 *cs)
1394 struct intel_gt *gt = ce->engine->gt;
1395 int mocs = gt->mocs.uc_index << 1;
1398 * Wa_16018031267 / Wa_16018063123 requires that SW forces the
1399 * main copy engine arbitration into round robin mode. We
1400 * additionally need to submit the following WABB blt command
1401 * to produce 4 subblits with each subblit generating 0 byte
1402 * write requests as WABB:
1406 * BG1 -> 0000003F (Dest pitch)
1407 * BG2 -> 00000000 (X1, Y1) = (0, 0)
1408 * BG3 -> 00040001 (X2, Y2) = (1, 4)
1411 * BG6-12 -> 00000000
1412 * BG13 -> 20004004 (Surf. Width= 2,Surf. Height = 5 )
1413 * BG14 -> 00000010 (Qpitch = 4)
1416 *cs++ = XY_FAST_COLOR_BLT_CMD | (16 - 2);
1417 *cs++ = FIELD_PREP(XY_FAST_COLOR_BLT_MOCS_MASK, mocs) | 0x3f;
1419 *cs++ = 4 << 16 | 1;
1420 *cs++ = lower_32_bits(i915_vma_offset(ce->vm->rsvd.vma));
1421 *cs++ = upper_32_bits(i915_vma_offset(ce->vm->rsvd.vma));
1437 xehp_emit_per_ctx_bb(const struct intel_context *ce, u32 *cs)
1439 /* Wa_16018031267, Wa_16018063123 */
1440 if (NEEDS_FASTCOLOR_BLT_WABB(ce->engine))
1441 cs = xehp_emit_fastcolor_blt_wabb(ce, cs);
1447 setup_per_ctx_bb(const struct intel_context *ce,
1448 const struct intel_engine_cs *engine,
1449 u32 *(*emit)(const struct intel_context *, u32 *))
1451 /* Place PER_CTX_BB on next page after INDIRECT_CTX */
1452 u32 * const start = context_wabb(ce, true);
1455 cs = emit(ce, start);
1457 /* PER_CTX_BB must manually terminate */
1458 *cs++ = MI_BATCH_BUFFER_END;
1460 GEM_BUG_ON(cs - start > I915_GTT_PAGE_SIZE / sizeof(*cs));
1461 lrc_setup_bb_per_ctx(ce->lrc_reg_state, engine,
1462 lrc_indirect_bb(ce) + PAGE_SIZE);
1466 setup_indirect_ctx_bb(const struct intel_context *ce,
1467 const struct intel_engine_cs *engine,
1468 u32 *(*emit)(const struct intel_context *, u32 *))
1470 u32 * const start = context_wabb(ce, false);
1473 cs = emit(ce, start);
1474 GEM_BUG_ON(cs - start > I915_GTT_PAGE_SIZE / sizeof(*cs));
1475 while ((unsigned long)cs % CACHELINE_BYTES)
1478 GEM_BUG_ON(cs - start > DG2_PREDICATE_RESULT_BB / sizeof(*start));
1479 setup_predicate_disable_wa(ce, start + DG2_PREDICATE_RESULT_BB / sizeof(*start));
1481 lrc_setup_indirect_ctx(ce->lrc_reg_state, engine,
1482 lrc_indirect_bb(ce),
1483 (cs - start) * sizeof(*cs));
1487 * The context descriptor encodes various attributes of a context,
1488 * including its GTT address and some flags. Because it's fairly
1489 * expensive to calculate, we'll just do it once and cache the result,
1490 * which remains valid until the context is unpinned.
1492 * This is what a descriptor looks like, from LSB to MSB::
1494 * bits 0-11: flags, GEN8_CTX_* (cached in ctx->desc_template)
1495 * bits 12-31: LRCA, GTT address of (the HWSP of) this context
1496 * bits 32-52: ctx ID, a globally unique tag (highest bit used by GuC)
1497 * bits 53-54: mbz, reserved for use by hardware
1498 * bits 55-63: group ID, currently unused and set to 0
1500 * Starting from Gen11, the upper dword of the descriptor has a new format:
1502 * bits 32-36: reserved
1503 * bits 37-47: SW context ID
1504 * bits 48:53: engine instance
1505 * bit 54: mbz, reserved for use by hardware
1506 * bits 55-60: SW counter
1507 * bits 61-63: engine class
1509 * On Xe_HP, the upper dword of the descriptor has a new format:
1511 * bits 32-37: virtual function number
1512 * bit 38: mbz, reserved for use by hardware
1513 * bits 39-54: SW context ID
1514 * bits 55-57: reserved
1515 * bits 58-63: SW counter
1517 * engine info, SW context ID and SW counter need to form a unique number
1518 * (Context ID) per lrc.
1520 static u32 lrc_descriptor(const struct intel_context *ce)
1524 desc = INTEL_LEGACY_32B_CONTEXT;
1525 if (i915_vm_is_4lvl(ce->vm))
1526 desc = INTEL_LEGACY_64B_CONTEXT;
1527 desc <<= GEN8_CTX_ADDRESSING_MODE_SHIFT;
1529 desc |= GEN8_CTX_VALID | GEN8_CTX_PRIVILEGE;
1530 if (GRAPHICS_VER(ce->vm->i915) == 8)
1531 desc |= GEN8_CTX_L3LLC_COHERENT;
1533 return i915_ggtt_offset(ce->state) | desc;
1536 u32 lrc_update_regs(const struct intel_context *ce,
1537 const struct intel_engine_cs *engine,
1540 struct intel_ring *ring = ce->ring;
1541 u32 *regs = ce->lrc_reg_state;
1543 GEM_BUG_ON(!intel_ring_offset_valid(ring, head));
1544 GEM_BUG_ON(!intel_ring_offset_valid(ring, ring->tail));
1546 regs[CTX_RING_START] = i915_ggtt_offset(ring->vma);
1547 regs[CTX_RING_HEAD] = head;
1548 regs[CTX_RING_TAIL] = ring->tail;
1549 regs[CTX_RING_CTL] = RING_CTL_SIZE(ring->size) | RING_VALID;
1552 if (engine->class == RENDER_CLASS) {
1553 regs[CTX_R_PWR_CLK_STATE] =
1554 intel_sseu_make_rpcs(engine->gt, &ce->sseu);
1556 i915_oa_init_reg_state(ce, engine);
1559 if (ce->wa_bb_page) {
1560 u32 *(*fn)(const struct intel_context *ce, u32 *cs);
1562 fn = gen12_emit_indirect_ctx_xcs;
1563 if (ce->engine->class == RENDER_CLASS)
1564 fn = gen12_emit_indirect_ctx_rcs;
1566 /* Mutually exclusive wrt to global indirect bb */
1567 GEM_BUG_ON(engine->wa_ctx.indirect_ctx.size);
1568 setup_indirect_ctx_bb(ce, engine, fn);
1569 setup_per_ctx_bb(ce, engine, xehp_emit_per_ctx_bb);
1572 return lrc_descriptor(ce) | CTX_DESC_FORCE_RESTORE;
1575 void lrc_update_offsets(struct intel_context *ce,
1576 struct intel_engine_cs *engine)
1578 set_offsets(ce->lrc_reg_state, reg_offsets(engine), engine, false);
1581 void lrc_check_regs(const struct intel_context *ce,
1582 const struct intel_engine_cs *engine,
1585 const struct intel_ring *ring = ce->ring;
1586 u32 *regs = ce->lrc_reg_state;
1590 if (regs[CTX_RING_START] != i915_ggtt_offset(ring->vma)) {
1591 pr_err("%s: context submitted with incorrect RING_START [%08x], expected %08x\n",
1593 regs[CTX_RING_START],
1594 i915_ggtt_offset(ring->vma));
1595 regs[CTX_RING_START] = i915_ggtt_offset(ring->vma);
1599 if ((regs[CTX_RING_CTL] & ~(RING_WAIT | RING_WAIT_SEMAPHORE)) !=
1600 (RING_CTL_SIZE(ring->size) | RING_VALID)) {
1601 pr_err("%s: context submitted with incorrect RING_CTL [%08x], expected %08x\n",
1604 (u32)(RING_CTL_SIZE(ring->size) | RING_VALID));
1605 regs[CTX_RING_CTL] = RING_CTL_SIZE(ring->size) | RING_VALID;
1609 x = lrc_ring_mi_mode(engine);
1610 if (x != -1 && regs[x + 1] & (regs[x + 1] >> 16) & STOP_RING) {
1611 pr_err("%s: context submitted with STOP_RING [%08x] in RING_MI_MODE\n",
1612 engine->name, regs[x + 1]);
1613 regs[x + 1] &= ~STOP_RING;
1614 regs[x + 1] |= STOP_RING << 16;
1618 WARN_ONCE(!valid, "Invalid lrc state found %s submission\n", when);
1622 * In this WA we need to set GEN8_L3SQCREG4[21:21] and reset it after
1623 * PIPE_CONTROL instruction. This is required for the flush to happen correctly
1624 * but there is a slight complication as this is applied in WA batch where the
1625 * values are only initialized once so we cannot take register value at the
1626 * beginning and reuse it further; hence we save its value to memory, upload a
1627 * constant value with bit21 set and then we restore it back with the saved value.
1628 * To simplify the WA, a constant value is formed by using the default value
1629 * of this register. This shouldn't be a problem because we are only modifying
1630 * it for a short period and this batch in non-premptible. We can ofcourse
1631 * use additional instructions that read the actual value of the register
1632 * at that time and set our bit of interest but it makes the WA complicated.
1634 * This WA is also required for Gen9 so extracting as a function avoids
1638 gen8_emit_flush_coherentl3_wa(struct intel_engine_cs *engine, u32 *batch)
1640 /* NB no one else is allowed to scribble over scratch + 256! */
1641 *batch++ = MI_STORE_REGISTER_MEM_GEN8 | MI_SRM_LRM_GLOBAL_GTT;
1642 *batch++ = i915_mmio_reg_offset(GEN8_L3SQCREG4);
1643 *batch++ = intel_gt_scratch_offset(engine->gt,
1644 INTEL_GT_SCRATCH_FIELD_COHERENTL3_WA);
1647 *batch++ = MI_LOAD_REGISTER_IMM(1);
1648 *batch++ = i915_mmio_reg_offset(GEN8_L3SQCREG4);
1649 *batch++ = 0x40400000 | GEN8_LQSC_FLUSH_COHERENT_LINES;
1651 batch = gen8_emit_pipe_control(batch,
1652 PIPE_CONTROL_CS_STALL |
1653 PIPE_CONTROL_DC_FLUSH_ENABLE,
1656 *batch++ = MI_LOAD_REGISTER_MEM_GEN8 | MI_SRM_LRM_GLOBAL_GTT;
1657 *batch++ = i915_mmio_reg_offset(GEN8_L3SQCREG4);
1658 *batch++ = intel_gt_scratch_offset(engine->gt,
1659 INTEL_GT_SCRATCH_FIELD_COHERENTL3_WA);
1666 * Typically we only have one indirect_ctx and per_ctx batch buffer which are
1667 * initialized at the beginning and shared across all contexts but this field
1668 * helps us to have multiple batches at different offsets and select them based
1669 * on a criteria. At the moment this batch always start at the beginning of the page
1670 * and at this point we don't have multiple wa_ctx batch buffers.
1672 * The number of WA applied are not known at the beginning; we use this field
1673 * to return the no of DWORDS written.
1675 * It is to be noted that this batch does not contain MI_BATCH_BUFFER_END
1676 * so it adds NOOPs as padding to make it cacheline aligned.
1677 * MI_BATCH_BUFFER_END will be added to perctx batch and both of them together
1678 * makes a complete batch buffer.
1680 static u32 *gen8_init_indirectctx_bb(struct intel_engine_cs *engine, u32 *batch)
1682 /* WaDisableCtxRestoreArbitration:bdw,chv */
1683 *batch++ = MI_ARB_ON_OFF | MI_ARB_DISABLE;
1685 /* WaFlushCoherentL3CacheLinesAtContextSwitch:bdw */
1686 if (IS_BROADWELL(engine->i915))
1687 batch = gen8_emit_flush_coherentl3_wa(engine, batch);
1689 /* WaClearSlmSpaceAtContextSwitch:bdw,chv */
1690 /* Actual scratch location is at 128 bytes offset */
1691 batch = gen8_emit_pipe_control(batch,
1692 PIPE_CONTROL_FLUSH_L3 |
1693 PIPE_CONTROL_STORE_DATA_INDEX |
1694 PIPE_CONTROL_CS_STALL |
1695 PIPE_CONTROL_QW_WRITE,
1696 LRC_PPHWSP_SCRATCH_ADDR);
1698 *batch++ = MI_ARB_ON_OFF | MI_ARB_ENABLE;
1700 /* Pad to end of cacheline */
1701 while ((unsigned long)batch % CACHELINE_BYTES)
1705 * MI_BATCH_BUFFER_END is not required in Indirect ctx BB because
1706 * execution depends on the length specified in terms of cache lines
1707 * in the register CTX_RCS_INDIRECT_CTX
1718 static u32 *emit_lri(u32 *batch, const struct lri *lri, unsigned int count)
1720 GEM_BUG_ON(!count || count > 63);
1722 *batch++ = MI_LOAD_REGISTER_IMM(count);
1724 *batch++ = i915_mmio_reg_offset(lri->reg);
1725 *batch++ = lri->value;
1726 } while (lri++, --count);
1732 static u32 *gen9_init_indirectctx_bb(struct intel_engine_cs *engine, u32 *batch)
1734 static const struct lri lri[] = {
1735 /* WaDisableGatherAtSetShaderCommonSlice:skl,bxt,kbl,glk */
1737 COMMON_SLICE_CHICKEN2,
1738 __MASKED_FIELD(GEN9_DISABLE_GATHER_AT_SET_SHADER_COMMON_SLICE,
1745 __MASKED_FIELD(FF_SLICE_CHICKEN_CL_PROVOKING_VERTEX_FIX,
1746 FF_SLICE_CHICKEN_CL_PROVOKING_VERTEX_FIX),
1752 __MASKED_FIELD(_3D_CHICKEN_SF_PROVOKING_VERTEX_FIX,
1753 _3D_CHICKEN_SF_PROVOKING_VERTEX_FIX),
1757 *batch++ = MI_ARB_ON_OFF | MI_ARB_DISABLE;
1759 /* WaFlushCoherentL3CacheLinesAtContextSwitch:skl,bxt,glk */
1760 batch = gen8_emit_flush_coherentl3_wa(engine, batch);
1762 /* WaClearSlmSpaceAtContextSwitch:skl,bxt,kbl,glk,cfl */
1763 batch = gen8_emit_pipe_control(batch,
1764 PIPE_CONTROL_FLUSH_L3 |
1765 PIPE_CONTROL_STORE_DATA_INDEX |
1766 PIPE_CONTROL_CS_STALL |
1767 PIPE_CONTROL_QW_WRITE,
1768 LRC_PPHWSP_SCRATCH_ADDR);
1770 batch = emit_lri(batch, lri, ARRAY_SIZE(lri));
1772 /* WaMediaPoolStateCmdInWABB:bxt,glk */
1773 if (HAS_POOLED_EU(engine->i915)) {
1775 * EU pool configuration is setup along with golden context
1776 * during context initialization. This value depends on
1777 * device type (2x6 or 3x6) and needs to be updated based
1778 * on which subslice is disabled especially for 2x6
1779 * devices, however it is safe to load default
1780 * configuration of 3x6 device instead of masking off
1781 * corresponding bits because HW ignores bits of a disabled
1782 * subslice and drops down to appropriate config. Please
1783 * see render_state_setup() in i915_gem_render_state.c for
1784 * possible configurations, to avoid duplication they are
1785 * not shown here again.
1787 *batch++ = GEN9_MEDIA_POOL_STATE;
1788 *batch++ = GEN9_MEDIA_POOL_ENABLE;
1789 *batch++ = 0x00777000;
1795 *batch++ = MI_ARB_ON_OFF | MI_ARB_ENABLE;
1797 /* Pad to end of cacheline */
1798 while ((unsigned long)batch % CACHELINE_BYTES)
1804 #define CTX_WA_BB_SIZE (PAGE_SIZE)
1806 static int lrc_create_wa_ctx(struct intel_engine_cs *engine)
1808 struct drm_i915_gem_object *obj;
1809 struct i915_vma *vma;
1812 obj = i915_gem_object_create_shmem(engine->i915, CTX_WA_BB_SIZE);
1814 return PTR_ERR(obj);
1816 vma = i915_vma_instance(obj, &engine->gt->ggtt->vm, NULL);
1822 engine->wa_ctx.vma = vma;
1826 i915_gem_object_put(obj);
1830 void lrc_fini_wa_ctx(struct intel_engine_cs *engine)
1832 i915_vma_unpin_and_release(&engine->wa_ctx.vma, 0);
1835 typedef u32 *(*wa_bb_func_t)(struct intel_engine_cs *engine, u32 *batch);
1837 void lrc_init_wa_ctx(struct intel_engine_cs *engine)
1839 struct i915_ctx_workarounds *wa_ctx = &engine->wa_ctx;
1840 struct i915_wa_ctx_bb *wa_bb[] = {
1841 &wa_ctx->indirect_ctx, &wa_ctx->per_ctx
1843 wa_bb_func_t wa_bb_fn[ARRAY_SIZE(wa_bb)];
1844 struct i915_gem_ww_ctx ww;
1845 void *batch, *batch_ptr;
1849 if (GRAPHICS_VER(engine->i915) >= 11 ||
1850 !(engine->flags & I915_ENGINE_HAS_RCS_REG_STATE))
1853 if (GRAPHICS_VER(engine->i915) == 9) {
1854 wa_bb_fn[0] = gen9_init_indirectctx_bb;
1856 } else if (GRAPHICS_VER(engine->i915) == 8) {
1857 wa_bb_fn[0] = gen8_init_indirectctx_bb;
1861 err = lrc_create_wa_ctx(engine);
1864 * We continue even if we fail to initialize WA batch
1865 * because we only expect rare glitches but nothing
1866 * critical to prevent us from using GPU
1868 drm_err(&engine->i915->drm,
1869 "Ignoring context switch w/a allocation error:%d\n",
1874 if (!engine->wa_ctx.vma)
1877 i915_gem_ww_ctx_init(&ww, true);
1879 err = i915_gem_object_lock(wa_ctx->vma->obj, &ww);
1881 err = i915_ggtt_pin(wa_ctx->vma, &ww, 0, PIN_HIGH);
1885 batch = i915_gem_object_pin_map(wa_ctx->vma->obj, I915_MAP_WB);
1886 if (IS_ERR(batch)) {
1887 err = PTR_ERR(batch);
1892 * Emit the two workaround batch buffers, recording the offset from the
1893 * start of the workaround batch buffer object for each and their
1897 for (i = 0; i < ARRAY_SIZE(wa_bb_fn); i++) {
1898 wa_bb[i]->offset = batch_ptr - batch;
1899 if (GEM_DEBUG_WARN_ON(!IS_ALIGNED(wa_bb[i]->offset,
1900 CACHELINE_BYTES))) {
1905 batch_ptr = wa_bb_fn[i](engine, batch_ptr);
1906 wa_bb[i]->size = batch_ptr - (batch + wa_bb[i]->offset);
1908 GEM_BUG_ON(batch_ptr - batch > CTX_WA_BB_SIZE);
1910 __i915_gem_object_flush_map(wa_ctx->vma->obj, 0, batch_ptr - batch);
1911 __i915_gem_object_release_map(wa_ctx->vma->obj);
1913 /* Verify that we can handle failure to setup the wa_ctx */
1915 err = i915_inject_probe_error(engine->i915, -ENODEV);
1919 i915_vma_unpin(wa_ctx->vma);
1921 if (err == -EDEADLK) {
1922 err = i915_gem_ww_ctx_backoff(&ww);
1926 i915_gem_ww_ctx_fini(&ww);
1929 i915_vma_put(engine->wa_ctx.vma);
1931 /* Clear all flags to prevent further use */
1932 memset(wa_ctx, 0, sizeof(*wa_ctx));
1936 static void st_runtime_underflow(struct intel_context_stats *stats, s32 dt)
1938 #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
1939 stats->runtime.num_underflow++;
1940 stats->runtime.max_underflow =
1941 max_t(u32, stats->runtime.max_underflow, -dt);
1945 static u32 lrc_get_runtime(const struct intel_context *ce)
1948 * We can use either ppHWSP[16] which is recorded before the context
1949 * switch (and so excludes the cost of context switches) or use the
1950 * value from the context image itself, which is saved/restored earlier
1951 * and so includes the cost of the save.
1953 return READ_ONCE(ce->lrc_reg_state[CTX_TIMESTAMP]);
1956 void lrc_update_runtime(struct intel_context *ce)
1958 struct intel_context_stats *stats = &ce->stats;
1962 old = stats->runtime.last;
1963 stats->runtime.last = lrc_get_runtime(ce);
1964 dt = stats->runtime.last - old;
1968 if (unlikely(dt < 0)) {
1969 CE_TRACE(ce, "runtime underflow: last=%u, new=%u, delta=%d\n",
1970 old, stats->runtime.last, dt);
1971 st_runtime_underflow(stats, dt);
1975 ewma_runtime_add(&stats->runtime.avg, dt);
1976 stats->runtime.total += dt;
1979 #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
1980 #include "selftest_lrc.c"