Commit 51aec8bf authored by Matt Roper's avatar Matt Roper Committed by Joonas Lahtinen

drm/i915/mtl: Hook up interrupts for standalone media

Top-level handling of standalone media interrupts will be processed as
part of the primary GT's interrupt handler (since primary and media GTs
share an MMIO space, unlike remote tile setups).  When we get down to
the point of handling engine interrupts, we need to take care to lookup
VCS and VECS engines in the media GT rather than the primary.

There are also a couple of additional "other" instance bits that
correspond to the media GT's GuC and media GT's power management
interrupts; we need to direct those to the media GT instance as well.

Bspec: 45605
Cc: Anusha Srivatsa <anusha.srivatsa@intel.com>
Signed-off-by: default avatarMatt Roper <matthew.d.roper@intel.com>
Reviewed-by: default avatarDaniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220906234934.3655440-15-matthew.d.roper@intel.comSigned-off-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
parent 03d2c54d
...@@ -59,11 +59,17 @@ static void ...@@ -59,11 +59,17 @@ static void
gen11_other_irq_handler(struct intel_gt *gt, const u8 instance, gen11_other_irq_handler(struct intel_gt *gt, const u8 instance,
const u16 iir) const u16 iir)
{ {
struct intel_gt *media_gt = gt->i915->media_gt;
if (instance == OTHER_GUC_INSTANCE) if (instance == OTHER_GUC_INSTANCE)
return guc_irq_handler(&gt->uc.guc, iir); return guc_irq_handler(&gt->uc.guc, iir);
if (instance == OTHER_MEDIA_GUC_INSTANCE && media_gt)
return guc_irq_handler(&media_gt->uc.guc, iir);
if (instance == OTHER_GTPM_INSTANCE) if (instance == OTHER_GTPM_INSTANCE)
return gen11_rps_irq_handler(&gt->rps, iir); return gen11_rps_irq_handler(&gt->rps, iir);
if (instance == OTHER_MEDIA_GTPM_INSTANCE && media_gt)
return gen11_rps_irq_handler(&media_gt->rps, iir);
if (instance == OTHER_KCR_INSTANCE) if (instance == OTHER_KCR_INSTANCE)
return intel_pxp_irq_handler(&gt->pxp, iir); return intel_pxp_irq_handler(&gt->pxp, iir);
...@@ -81,6 +87,18 @@ gen11_engine_irq_handler(struct intel_gt *gt, const u8 class, ...@@ -81,6 +87,18 @@ gen11_engine_irq_handler(struct intel_gt *gt, const u8 class,
{ {
struct intel_engine_cs *engine; struct intel_engine_cs *engine;
/*
* Platforms with standalone media have their media engines in another
* GT.
*/
if (MEDIA_VER(gt->i915) >= 13 &&
(class == VIDEO_DECODE_CLASS || class == VIDEO_ENHANCEMENT_CLASS)) {
if (!gt->i915->media_gt)
goto err;
gt = gt->i915->media_gt;
}
if (instance <= MAX_ENGINE_INSTANCE) if (instance <= MAX_ENGINE_INSTANCE)
engine = gt->engine_class[class][instance]; engine = gt->engine_class[class][instance];
else else
...@@ -89,6 +107,7 @@ gen11_engine_irq_handler(struct intel_gt *gt, const u8 class, ...@@ -89,6 +107,7 @@ gen11_engine_irq_handler(struct intel_gt *gt, const u8 class,
if (likely(engine)) if (likely(engine))
return intel_engine_cs_irq(engine, iir); return intel_engine_cs_irq(engine, iir);
err:
WARN_ONCE(1, "unhandled engine interrupt class=0x%x, instance=0x%x\n", WARN_ONCE(1, "unhandled engine interrupt class=0x%x, instance=0x%x\n",
class, instance); class, instance);
} }
......
...@@ -1554,6 +1554,8 @@ ...@@ -1554,6 +1554,8 @@
#define OTHER_GTPM_INSTANCE 1 #define OTHER_GTPM_INSTANCE 1
#define OTHER_KCR_INSTANCE 4 #define OTHER_KCR_INSTANCE 4
#define OTHER_GSC_INSTANCE 6 #define OTHER_GSC_INSTANCE 6
#define OTHER_MEDIA_GUC_INSTANCE 16
#define OTHER_MEDIA_GTPM_INSTANCE 17
#define GEN11_IIR_REG_SELECTOR(x) _MMIO(0x190070 + ((x) * 4)) #define GEN11_IIR_REG_SELECTOR(x) _MMIO(0x190070 + ((x) * 4))
......
...@@ -36,5 +36,12 @@ int intel_sa_mediagt_setup(struct intel_gt *gt, phys_addr_t phys_addr, ...@@ -36,5 +36,12 @@ int intel_sa_mediagt_setup(struct intel_gt *gt, phys_addr_t phys_addr,
gt->uncore = uncore; gt->uncore = uncore;
gt->phys_addr = phys_addr; gt->phys_addr = phys_addr;
/*
* For current platforms we can assume there's only a single
* media GT and cache it for quick lookup.
*/
drm_WARN_ON(&i915->drm, i915->media_gt);
i915->media_gt = gt;
return 0; return 0;
} }
...@@ -780,6 +780,9 @@ struct drm_i915_private { ...@@ -780,6 +780,9 @@ struct drm_i915_private {
struct kobject *sysfs_gt; struct kobject *sysfs_gt;
/* Quick lookup of media GT (current platforms only have one) */
struct intel_gt *media_gt;
struct { struct {
struct i915_gem_contexts { struct i915_gem_contexts {
spinlock_t lock; /* locks list */ spinlock_t lock; /* locks list */
......
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