[PATCH 36/38] bsw-irq2
Chris Wilson
chris at chris-wilson.co.uk
Wed Sep 13 13:02:39 UTC 2017
---
drivers/gpu/drm/i915/i915_irq.c | 59 ++++++++++++++++-------------------------
1 file changed, 23 insertions(+), 36 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index d58fa40e922e..67e7d78eb659 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1331,37 +1331,22 @@ static void gen8_gt_irq_ack(struct drm_i915_private *dev_priv,
{
if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) {
gt_iir[0] = I915_READ_FW(GEN8_GT_IIR(0));
- if (likely(gt_iir[0]))
- I915_WRITE_FW(GEN8_GT_IIR(0), gt_iir[0]);
- else
- DRM_ERROR("The master control interrupt lied (GT0)!\n");
+ I915_WRITE_FW(GEN8_GT_IIR(0), gt_iir[0]);
}
if (master_ctl & (GEN8_GT_VCS1_IRQ | GEN8_GT_VCS2_IRQ)) {
gt_iir[1] = I915_READ_FW(GEN8_GT_IIR(1));
- if (likely(gt_iir[1]))
- I915_WRITE_FW(GEN8_GT_IIR(1), gt_iir[1]);
- else
- DRM_ERROR("The master control interrupt lied (GT1)!\n");
+ I915_WRITE_FW(GEN8_GT_IIR(1), gt_iir[1]);
}
if (master_ctl & GEN8_GT_VECS_IRQ) {
gt_iir[3] = I915_READ_FW(GEN8_GT_IIR(3));
- if (likely(gt_iir[3]))
- I915_WRITE_FW(GEN8_GT_IIR(3), gt_iir[3]);
- else
- DRM_ERROR("The master control interrupt lied (GT3)!\n");
+ I915_WRITE_FW(GEN8_GT_IIR(3), gt_iir[3]);
}
if (master_ctl & (GEN8_GT_PM_IRQ | GEN8_GT_GUC_IRQ)) {
gt_iir[2] = I915_READ_FW(GEN8_GT_IIR(2));
- if (likely(gt_iir[2] & (dev_priv->pm_rps_events |
- dev_priv->pm_guc_events)))
- I915_WRITE_FW(GEN8_GT_IIR(2),
- gt_iir[2] & (dev_priv->pm_rps_events |
- dev_priv->pm_guc_events));
- else
- DRM_ERROR("The master control interrupt lied (PM)!\n");
+ I915_WRITE_FW(GEN8_GT_IIR(2), gt_iir[2]);
}
}
@@ -1745,8 +1730,10 @@ static bool valleyview_pipestat_irq_ack(struct drm_i915_private *dev_priv,
if (iir & iir_bit)
mask |= dev_priv->pipestat_irq_mask[pipe];
- if (!mask)
+ if (!mask) {
+ pipe_stats[pipe] = 0;
continue;
+ }
reg = PIPESTAT(pipe);
mask |= PIPESTAT_INT_ENABLE_MASK;
@@ -1841,7 +1828,7 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
do {
u32 iir, gt_iir, pm_iir;
- u32 pipe_stats[I915_MAX_PIPES] = {};
+ u32 pipe_stats[I915_MAX_PIPES];
u32 hotplug_status = 0;
u32 ier = 0;
@@ -1928,20 +1915,11 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
do {
u32 master_ctl, iir;
- u32 gt_iir[4] = {};
- u32 pipe_stats[I915_MAX_PIPES] = {};
+ u32 gt_iir[4];
+ u32 pipe_stats[I915_MAX_PIPES];
u32 hotplug_status = 0;
- u32 ier = 0;
bool has_pipe_stats = false;
- master_ctl = I915_READ(GEN8_MASTER_IRQ) & ~GEN8_MASTER_IRQ_CONTROL;
- iir = I915_READ(VLV_IIR);
-
- if (master_ctl == 0 && iir == 0)
- break;
-
- ret = IRQ_HANDLED;
-
/*
* Theory on interrupt generation, based on empirical evidence:
*
@@ -1955,9 +1933,20 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
* don't end up clearing all the VLV_IIR and GEN8_MASTER_IRQ_CONTROL
* bits this time around.
*/
- I915_WRITE(GEN8_MASTER_IRQ, 0);
+ master_ctl = I915_READ(GEN8_MASTER_IRQ);
+ if (master_ctl & ~GEN8_MASTER_IRQ_CONTROL) {
+ I915_WRITE(GEN8_MASTER_IRQ, 0);
+
+ gen8_gt_irq_ack(dev_priv, master_ctl, gt_iir);
+
+ I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
+ ret = IRQ_HANDLED;
+ }
+ iir = I915_READ(VLV_IIR);
if (iir) {
+ u32 ier;
+
ier = I915_READ(VLV_IER);
I915_WRITE(VLV_IER, 0);
@@ -1980,11 +1969,9 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
*/
I915_WRITE(VLV_IIR, iir);
I915_WRITE(VLV_IER, ier);
+ ret = IRQ_HANDLED;
}
- gen8_gt_irq_ack(dev_priv, master_ctl, gt_iir);
- I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
-
gen8_gt_irq_handler(dev_priv, master_ctl, gt_iir);
if (hotplug_status)
--
2.14.1
More information about the Intel-gfx-trybot
mailing list