[Intel-gfx] [PATCH] drm/i915/mtl: Add engine TLB invalidation
Andrzej Hajda
andrzej.hajda at intel.com
Thu Feb 23 09:08:51 UTC 2023
On 17.02.2023 19:54, Matt Roper wrote:
> MTL's primary GT can continue to use the same engine TLB invalidation
> programming as past Xe_HP-based platforms. However the media GT needs
> some special handling:
> * Invalidation registers on the media GT are singleton registers
> (unlike the primary GT where they are still MCR).
> * Since the GSC is now exposed as an engine, there's a new register to
> use for TLB invalidation. The offset is identical to the compute
> engine offset, but this is expected --- compute engines only exist on
> the primary GT while the GSC only exists on the media GT.
> * Although there's only a single GSC engine instance, it inexplicably
> uses bit 1 to request invalidations rather than bit 0.
>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at linux.intel.com>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
> Signed-off-by: Matt Roper <matthew.d.roper at intel.com>
> ---
> drivers/gpu/drm/i915/gt/intel_engine_cs.c | 52 ++++++++++++++++-------
> drivers/gpu/drm/i915/gt/intel_gt_regs.h | 1 +
> 2 files changed, 38 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> index f3a91e7f85f7..af8e158fbd84 100644
> --- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> +++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> @@ -1166,6 +1166,11 @@ static int intel_engine_init_tlb_invalidation(struct intel_engine_cs *engine)
> [COPY_ENGINE_CLASS].mcr_reg = XEHP_BLT_TLB_INV_CR,
> [COMPUTE_CLASS].mcr_reg = XEHP_COMPCTX_TLB_INV_CR,
> };
> + static const union intel_engine_tlb_inv_reg xelpmp_regs[] = {
> + [VIDEO_DECODE_CLASS].reg = GEN12_VD_TLB_INV_CR,
> + [VIDEO_ENHANCEMENT_CLASS].reg = GEN12_VE_TLB_INV_CR,
> + [OTHER_CLASS].reg = XELPMP_GSC_TLB_INV_CR,
> + };
> struct drm_i915_private *i915 = engine->i915;
> const unsigned int instance = engine->instance;
> const unsigned int class = engine->class;
> @@ -1185,19 +1190,28 @@ static int intel_engine_init_tlb_invalidation(struct intel_engine_cs *engine)
> * 12.00 -> 12.50 transition multi cast handling is required too.
> */
>
> - if (GRAPHICS_VER_FULL(i915) == IP_VER(12, 50) ||
> - GRAPHICS_VER_FULL(i915) == IP_VER(12, 55)) {
> - regs = xehp_regs;
> - num = ARRAY_SIZE(xehp_regs);
> - } else if (GRAPHICS_VER_FULL(i915) == IP_VER(12, 0) ||
> - GRAPHICS_VER_FULL(i915) == IP_VER(12, 10)) {
> - regs = gen12_regs;
> - num = ARRAY_SIZE(gen12_regs);
> - } else if (GRAPHICS_VER(i915) >= 8 && GRAPHICS_VER(i915) <= 11) {
> - regs = gen8_regs;
> - num = ARRAY_SIZE(gen8_regs);
> - } else if (GRAPHICS_VER(i915) < 8) {
> - return 0;
> + if (engine->gt->type == GT_MEDIA) {
> + if (MEDIA_VER_FULL(i915) == IP_VER(13, 0)) {
> + regs = xelpmp_regs;
> + num = ARRAY_SIZE(xelpmp_regs);
> + }
As I understand currently only GEN13 of media can have GT_MEDIA, so
fallback to gt_WARN_ONCE below is expected behavior.
> + } else {
> + if (GRAPHICS_VER_FULL(i915) == IP_VER(12, 71) ||
12.71 is not yet present in i915_pci.c, maybe they should be added
together, up to you.
> + GRAPHICS_VER_FULL(i915) == IP_VER(12, 70) > + GRAPHICS_VER_FULL(i915) == IP_VER(12, 50) ||
> + GRAPHICS_VER_FULL(i915) == IP_VER(12, 55)) {
> + regs = xehp_regs;
> + num = ARRAY_SIZE(xehp_regs);
> + } else if (GRAPHICS_VER_FULL(i915) == IP_VER(12, 0) ||
> + GRAPHICS_VER_FULL(i915) == IP_VER(12, 10)) {
> + regs = gen12_regs;
> + num = ARRAY_SIZE(gen12_regs);
> + } else if (GRAPHICS_VER(i915) >= 8 && GRAPHICS_VER(i915) <= 11) {
> + regs = gen8_regs;
> + num = ARRAY_SIZE(gen8_regs);
> + } else if (GRAPHICS_VER(i915) < 8) {
> + return 0;
> + }
> }
>
> if (gt_WARN_ONCE(engine->gt, !num,
> @@ -1212,7 +1226,14 @@ static int intel_engine_init_tlb_invalidation(struct intel_engine_cs *engine)
>
> reg = regs[class];
>
> - if (regs == gen8_regs && class == VIDEO_DECODE_CLASS && instance == 1) {
> + if (class == OTHER_CLASS) {
Maybe it would be safer:
if (regs == xelpmp_regs && class == OTHER_CLASS)
> + /*
> + * There's only a single GSC instance, but it uses register bit
> + * 1 instead of either 0 or OTHER_GSC_INSTANCE.
> + */
> + GEM_WARN_ON(instance != OTHER_GSC_INSTANCE);
> + val = 1;
> + } else if (regs == gen8_regs && class == VIDEO_DECODE_CLASS && instance == 1) {
> reg.reg = GEN8_M2TCR;
> val = 0;
> } else {
> @@ -1228,7 +1249,8 @@ static int intel_engine_init_tlb_invalidation(struct intel_engine_cs *engine)
> if (GRAPHICS_VER(i915) >= 12 &&
> (engine->class == VIDEO_DECODE_CLASS ||
> engine->class == VIDEO_ENHANCEMENT_CLASS ||
> - engine->class == COMPUTE_CLASS))
> + engine->class == COMPUTE_CLASS ||
> + engine->class == OTHER_CLASS))
This is little surprise, I would expect non-masked reg for single
instance, but it follows bspec, so OK.
Reviewed-by: Andrzej Hajda <andrzej.hajda at intel.com>
Regards
Andrzej
> engine->tlb_inv.request = _MASKED_BIT_ENABLE(val);
> else
> engine->tlb_inv.request = val;
> diff --git a/drivers/gpu/drm/i915/gt/intel_gt_regs.h b/drivers/gpu/drm/i915/gt/intel_gt_regs.h
> index 416976d396ba..423e3e9c564b 100644
> --- a/drivers/gpu/drm/i915/gt/intel_gt_regs.h
> +++ b/drivers/gpu/drm/i915/gt/intel_gt_regs.h
> @@ -1090,6 +1090,7 @@
> #define XEHP_BLT_TLB_INV_CR MCR_REG(0xcee4)
> #define GEN12_COMPCTX_TLB_INV_CR _MMIO(0xcf04)
> #define XEHP_COMPCTX_TLB_INV_CR MCR_REG(0xcf04)
> +#define XELPMP_GSC_TLB_INV_CR _MMIO(0xcf04) /* media GT only */
>
> #define XEHP_MERT_MOD_CTRL MCR_REG(0xcf28)
> #define RENDER_MOD_CTRL MCR_REG(0xcf2c)
More information about the dri-devel
mailing list