aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2018-02-15 02:37:12 -0500
committerChris Wilson <chris@chris-wilson.co.uk>2018-02-19 10:38:58 -0500
commitf0fd96f546fb9e726ff66b1e53b115ada61ebc35 (patch)
tree2c581c486195237c748a367125fda897cfe82475 /drivers
parentacb79148dc69217c3aa5773a4e87b73d62d2f2a1 (diff)
drm/i915: Track GT interrupt handling using the master iir
Keep the master iir and use it to reduce the number of reads and writes to the GT iir array, i.e. only the bits marked as set by the master iir are valid inside GT iir array and will be handled during the interrupt. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Ville Syrjala <ville.syrjala@linux.intel.com> Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180215073713.26985-1-chris@chris-wilson.co.uk
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c51
1 files changed, 31 insertions, 20 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 7617826b7705..c7f6b719e86d 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1416,6 +1416,14 @@ gen8_cs_irq_handler(struct intel_engine_cs *engine, u32 iir, int test_shift)
1416static void gen8_gt_irq_ack(struct drm_i915_private *dev_priv, 1416static void gen8_gt_irq_ack(struct drm_i915_private *dev_priv,
1417 u32 master_ctl, u32 gt_iir[4]) 1417 u32 master_ctl, u32 gt_iir[4])
1418{ 1418{
1419#define GEN8_GT_IRQS (GEN8_GT_RCS_IRQ | \
1420 GEN8_GT_BCS_IRQ | \
1421 GEN8_GT_VCS1_IRQ | \
1422 GEN8_GT_VCS2_IRQ | \
1423 GEN8_GT_VECS_IRQ | \
1424 GEN8_GT_PM_IRQ | \
1425 GEN8_GT_GUC_IRQ)
1426
1419 if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) { 1427 if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) {
1420 gt_iir[0] = I915_READ_FW(GEN8_GT_IIR(0)); 1428 gt_iir[0] = I915_READ_FW(GEN8_GT_IIR(0));
1421 if (gt_iir[0]) 1429 if (gt_iir[0])
@@ -1446,31 +1454,34 @@ static void gen8_gt_irq_ack(struct drm_i915_private *dev_priv,
1446} 1454}
1447 1455
1448static void gen8_gt_irq_handler(struct drm_i915_private *dev_priv, 1456static void gen8_gt_irq_handler(struct drm_i915_private *dev_priv,
1449 u32 gt_iir[4]) 1457 u32 master_ctl, u32 gt_iir[4])
1450{ 1458{
1451 if (gt_iir[0]) { 1459 if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) {
1452 gen8_cs_irq_handler(dev_priv->engine[RCS], 1460 gen8_cs_irq_handler(dev_priv->engine[RCS],
1453 gt_iir[0], GEN8_RCS_IRQ_SHIFT); 1461 gt_iir[0], GEN8_RCS_IRQ_SHIFT);
1454 gen8_cs_irq_handler(dev_priv->engine[BCS], 1462 gen8_cs_irq_handler(dev_priv->engine[BCS],
1455 gt_iir[0], GEN8_BCS_IRQ_SHIFT); 1463 gt_iir[0], GEN8_BCS_IRQ_SHIFT);
1456 } 1464 }
1457 1465
1458 if (gt_iir[1]) { 1466 if (master_ctl & (GEN8_GT_VCS1_IRQ | GEN8_GT_VCS2_IRQ)) {
1459 gen8_cs_irq_handler(dev_priv->engine[VCS], 1467 gen8_cs_irq_handler(dev_priv->engine[VCS],
1460 gt_iir[1], GEN8_VCS1_IRQ_SHIFT); 1468 gt_iir[1], GEN8_VCS1_IRQ_SHIFT);
1461 gen8_cs_irq_handler(dev_priv->engine[VCS2], 1469 gen8_cs_irq_handler(dev_priv->engine[VCS2],
1462 gt_iir[1], GEN8_VCS2_IRQ_SHIFT); 1470 gt_iir[1], GEN8_VCS2_IRQ_SHIFT);
1463 } 1471 }
1464 1472
1465 if (gt_iir[3]) 1473 if (master_ctl & GEN8_GT_VECS_IRQ) {
1466 gen8_cs_irq_handler(dev_priv->engine[VECS], 1474 gen8_cs_irq_handler(dev_priv->engine[VECS],
1467 gt_iir[3], GEN8_VECS_IRQ_SHIFT); 1475 gt_iir[3], GEN8_VECS_IRQ_SHIFT);
1476 }
1468 1477
1469 if (gt_iir[2] & dev_priv->pm_rps_events) 1478 if (master_ctl & (GEN8_GT_PM_IRQ | GEN8_GT_GUC_IRQ)) {
1470 gen6_rps_irq_handler(dev_priv, gt_iir[2]); 1479 if (gt_iir[2] & dev_priv->pm_rps_events)
1480 gen6_rps_irq_handler(dev_priv, gt_iir[2]);
1471 1481
1472 if (gt_iir[2] & dev_priv->pm_guc_events) 1482 if (gt_iir[2] & dev_priv->pm_guc_events)
1473 gen9_guc_irq_handler(dev_priv, gt_iir[2]); 1483 gen9_guc_irq_handler(dev_priv, gt_iir[2]);
1484 }
1474} 1485}
1475 1486
1476static bool bxt_port_hotplug_long_detect(enum port port, u32 val) 1487static bool bxt_port_hotplug_long_detect(enum port port, u32 val)
@@ -2085,9 +2096,9 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
2085 2096
2086 do { 2097 do {
2087 u32 master_ctl, iir; 2098 u32 master_ctl, iir;
2088 u32 gt_iir[4] = {};
2089 u32 pipe_stats[I915_MAX_PIPES] = {}; 2099 u32 pipe_stats[I915_MAX_PIPES] = {};
2090 u32 hotplug_status = 0; 2100 u32 hotplug_status = 0;
2101 u32 gt_iir[4];
2091 u32 ier = 0; 2102 u32 ier = 0;
2092 2103
2093 master_ctl = I915_READ(GEN8_MASTER_IRQ) & ~GEN8_MASTER_IRQ_CONTROL; 2104 master_ctl = I915_READ(GEN8_MASTER_IRQ) & ~GEN8_MASTER_IRQ_CONTROL;
@@ -2140,7 +2151,7 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
2140 I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL); 2151 I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
2141 POSTING_READ(GEN8_MASTER_IRQ); 2152 POSTING_READ(GEN8_MASTER_IRQ);
2142 2153
2143 gen8_gt_irq_handler(dev_priv, gt_iir); 2154 gen8_gt_irq_handler(dev_priv, master_ctl, gt_iir);
2144 2155
2145 if (hotplug_status) 2156 if (hotplug_status)
2146 i9xx_hpd_irq_handler(dev_priv, hotplug_status); 2157 i9xx_hpd_irq_handler(dev_priv, hotplug_status);
@@ -2675,10 +2686,9 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
2675 2686
2676static irqreturn_t gen8_irq_handler(int irq, void *arg) 2687static irqreturn_t gen8_irq_handler(int irq, void *arg)
2677{ 2688{
2678 struct drm_device *dev = arg; 2689 struct drm_i915_private *dev_priv = to_i915(arg);
2679 struct drm_i915_private *dev_priv = to_i915(dev);
2680 u32 master_ctl; 2690 u32 master_ctl;
2681 u32 gt_iir[4] = {}; 2691 u32 gt_iir[4];
2682 2692
2683 if (!intel_irqs_enabled(dev_priv)) 2693 if (!intel_irqs_enabled(dev_priv))
2684 return IRQ_NONE; 2694 return IRQ_NONE;
@@ -2690,18 +2700,19 @@ static irqreturn_t gen8_irq_handler(int irq, void *arg)
2690 2700
2691 I915_WRITE_FW(GEN8_MASTER_IRQ, 0); 2701 I915_WRITE_FW(GEN8_MASTER_IRQ, 0);
2692 2702
2693 /* IRQs are synced during runtime_suspend, we don't require a wakeref */
2694 disable_rpm_wakeref_asserts(dev_priv);
2695
2696 /* Find, clear, then process each source of interrupt */ 2703 /* Find, clear, then process each source of interrupt */
2697 gen8_gt_irq_ack(dev_priv, master_ctl, gt_iir); 2704 gen8_gt_irq_ack(dev_priv, master_ctl, gt_iir);
2698 gen8_gt_irq_handler(dev_priv, gt_iir); 2705
2699 gen8_de_irq_handler(dev_priv, master_ctl); 2706 /* IRQs are synced during runtime_suspend, we don't require a wakeref */
2707 if (master_ctl & ~GEN8_GT_IRQS) {
2708 disable_rpm_wakeref_asserts(dev_priv);
2709 gen8_de_irq_handler(dev_priv, master_ctl);
2710 enable_rpm_wakeref_asserts(dev_priv);
2711 }
2700 2712
2701 I915_WRITE_FW(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL); 2713 I915_WRITE_FW(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
2702 POSTING_READ_FW(GEN8_MASTER_IRQ);
2703 2714
2704 enable_rpm_wakeref_asserts(dev_priv); 2715 gen8_gt_irq_handler(dev_priv, master_ctl, gt_iir);
2705 2716
2706 return IRQ_HANDLED; 2717 return IRQ_HANDLED;
2707} 2718}