Skip to content

Commit 97b492f

Browse files
committed
drm/i915/dg1: add support for the master unit interrupt
DG1 has master unit interrupt register which is used to indicate the correct source of interrupt. v2: fix coding style on register definition Cc: Radhakrishna Sripada <[email protected]> Cc: Daniele Spurio Ceraolo <[email protected]> Cc: Matt Roper <[email protected]> Signed-off-by: Lucas De Marchi <[email protected]> Reviewed-by: José Roberto de Souza <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent fd38cdb commit 97b492f

File tree

3 files changed

+61
-3
lines changed

3 files changed

+61
-3
lines changed

drivers/gpu/drm/i915/i915_debugfs.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,10 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
495495
seq_printf(m, "PCU interrupt enable:\t%08x\n",
496496
I915_READ(GEN8_PCU_IER));
497497
} else if (INTEL_GEN(dev_priv) >= 11) {
498+
if (HAS_MASTER_UNIT_IRQ(dev_priv))
499+
seq_printf(m, "Master Unit Interrupt Control: %08x\n",
500+
I915_READ(DG1_MSTR_UNIT_INTR));
501+
498502
seq_printf(m, "Master Interrupt Control: %08x\n",
499503
I915_READ(GEN11_GFX_MSTR_IRQ));
500504

drivers/gpu/drm/i915/i915_irq.c

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2584,6 +2584,46 @@ static irqreturn_t gen11_irq_handler(int irq, void *arg)
25842584
gen11_master_intr_enable);
25852585
}
25862586

2587+
static u32 dg1_master_intr_disable_and_ack(void __iomem * const regs)
2588+
{
2589+
u32 val;
2590+
2591+
/* First disable interrupts */
2592+
raw_reg_write(regs, DG1_MSTR_UNIT_INTR, 0);
2593+
2594+
/* Get the indication levels and ack the master unit */
2595+
val = raw_reg_read(regs, DG1_MSTR_UNIT_INTR);
2596+
if (unlikely(!val))
2597+
return 0;
2598+
2599+
raw_reg_write(regs, DG1_MSTR_UNIT_INTR, val);
2600+
2601+
/*
2602+
* Now with master disabled, get a sample of level indications
2603+
* for this interrupt and ack them right away - we keep GEN11_MASTER_IRQ
2604+
* out as this bit doesn't exist anymore for DG1
2605+
*/
2606+
val = raw_reg_read(regs, GEN11_GFX_MSTR_IRQ) & ~GEN11_MASTER_IRQ;
2607+
if (unlikely(!val))
2608+
return 0;
2609+
2610+
raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, val);
2611+
2612+
return val;
2613+
}
2614+
2615+
static inline void dg1_master_intr_enable(void __iomem * const regs)
2616+
{
2617+
raw_reg_write(regs, DG1_MSTR_UNIT_INTR, DG1_MSTR_IRQ);
2618+
}
2619+
2620+
static irqreturn_t dg1_irq_handler(int irq, void *arg)
2621+
{
2622+
return __gen11_irq_handler(arg,
2623+
dg1_master_intr_disable_and_ack,
2624+
dg1_master_intr_enable);
2625+
}
2626+
25872627
/* Called from drm generic code, passed 'crtc' which
25882628
* we use as a pipe index
25892629
*/
@@ -2920,7 +2960,10 @@ static void gen11_irq_reset(struct drm_i915_private *dev_priv)
29202960
{
29212961
struct intel_uncore *uncore = &dev_priv->uncore;
29222962

2923-
gen11_master_intr_disable(dev_priv->uncore.regs);
2963+
if (HAS_MASTER_UNIT_IRQ(dev_priv))
2964+
dg1_master_intr_disable_and_ack(dev_priv->uncore.regs);
2965+
else
2966+
gen11_master_intr_disable(dev_priv->uncore.regs);
29242967

29252968
gen11_gt_irq_reset(&dev_priv->gt);
29262969
gen11_display_irq_reset(dev_priv);
@@ -3517,8 +3560,13 @@ static void gen11_irq_postinstall(struct drm_i915_private *dev_priv)
35173560

35183561
I915_WRITE(GEN11_DISPLAY_INT_CTL, GEN11_DISPLAY_IRQ_ENABLE);
35193562

3520-
gen11_master_intr_enable(uncore->regs);
3521-
POSTING_READ(GEN11_GFX_MSTR_IRQ);
3563+
if (HAS_MASTER_UNIT_IRQ(dev_priv)) {
3564+
dg1_master_intr_enable(uncore->regs);
3565+
POSTING_READ(DG1_MSTR_UNIT_INTR);
3566+
} else {
3567+
gen11_master_intr_enable(uncore->regs);
3568+
POSTING_READ(GEN11_GFX_MSTR_IRQ);
3569+
}
35223570
}
35233571

35243572
static void cherryview_irq_postinstall(struct drm_i915_private *dev_priv)
@@ -4043,6 +4091,8 @@ static irq_handler_t intel_irq_handler(struct drm_i915_private *dev_priv)
40434091
else
40444092
return i8xx_irq_handler;
40454093
} else {
4094+
if (HAS_MASTER_UNIT_IRQ(dev_priv))
4095+
return dg1_irq_handler;
40464096
if (INTEL_GEN(dev_priv) >= 11)
40474097
return gen11_irq_handler;
40484098
else if (INTEL_GEN(dev_priv) >= 8)

drivers/gpu/drm/i915/i915_reg.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7733,6 +7733,10 @@ enum {
77337733
#define GEN11_GT_DW1_IRQ (1 << 1)
77347734
#define GEN11_GT_DW0_IRQ (1 << 0)
77357735

7736+
#define DG1_MSTR_UNIT_INTR _MMIO(0x190008)
7737+
#define DG1_MSTR_IRQ REG_BIT(31)
7738+
#define DG1_MSTR_UNIT(u) REG_BIT(u)
7739+
77367740
#define GEN11_DISPLAY_INT_CTL _MMIO(0x44200)
77377741
#define GEN11_DISPLAY_IRQ_ENABLE (1 << 31)
77387742
#define GEN11_AUDIO_CODEC_IRQ (1 << 24)

0 commit comments

Comments
 (0)