aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2018-02-19 05:09:26 -0500
committerChris Wilson <chris@chris-wilson.co.uk>2018-02-19 10:38:59 -0500
commit2e4a5b25886cde308d3fc896fd584c844bde92a2 (patch)
treea38d1e5c58dc477e68ce49bcad1ba6d6d0063ef6
parentf0fd96f546fb9e726ff66b1e53b115ada61ebc35 (diff)
drm/i915: Prune gen8_gt_irq_handler
The compiler is not automatically caching the i915->regs address inside a register and emitting a load for every mmio access. For simple functions like gen8_gt_irq_handler that are already using the raw accessors, we can open-code them for substantial savings: add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-83 (-83) Function old new delta gen8_gt_irq_handler 290 266 -24 gen8_gt_irq_ack 181 122 -59 Total: Before=954637, After=954554, chg -0.01% v2: Add raw_reg_read/raw_reg_write. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180219100926.16554-1-chris@chris-wilson.co.uk
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c58
-rw-r--r--drivers/gpu/drm/i915/intel_uncore.h5
2 files changed, 33 insertions, 30 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index c7f6b719e86d..17de6cef2a30 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1413,9 +1413,11 @@ gen8_cs_irq_handler(struct intel_engine_cs *engine, u32 iir, int test_shift)
1413 tasklet_hi_schedule(&execlists->tasklet); 1413 tasklet_hi_schedule(&execlists->tasklet);
1414} 1414}
1415 1415
1416static void gen8_gt_irq_ack(struct drm_i915_private *dev_priv, 1416static void gen8_gt_irq_ack(struct drm_i915_private *i915,
1417 u32 master_ctl, u32 gt_iir[4]) 1417 u32 master_ctl, u32 gt_iir[4])
1418{ 1418{
1419 void __iomem * const regs = i915->regs;
1420
1419#define GEN8_GT_IRQS (GEN8_GT_RCS_IRQ | \ 1421#define GEN8_GT_IRQS (GEN8_GT_RCS_IRQ | \
1420 GEN8_GT_BCS_IRQ | \ 1422 GEN8_GT_BCS_IRQ | \
1421 GEN8_GT_VCS1_IRQ | \ 1423 GEN8_GT_VCS1_IRQ | \
@@ -1425,62 +1427,58 @@ static void gen8_gt_irq_ack(struct drm_i915_private *dev_priv,
1425 GEN8_GT_GUC_IRQ) 1427 GEN8_GT_GUC_IRQ)
1426 1428
1427 if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) { 1429 if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) {
1428 gt_iir[0] = I915_READ_FW(GEN8_GT_IIR(0)); 1430 gt_iir[0] = raw_reg_read(regs, GEN8_GT_IIR(0));
1429 if (gt_iir[0]) 1431 if (likely(gt_iir[0]))
1430 I915_WRITE_FW(GEN8_GT_IIR(0), gt_iir[0]); 1432 raw_reg_write(regs, GEN8_GT_IIR(0), gt_iir[0]);
1431 } 1433 }
1432 1434
1433 if (master_ctl & (GEN8_GT_VCS1_IRQ | GEN8_GT_VCS2_IRQ)) { 1435 if (master_ctl & (GEN8_GT_VCS1_IRQ | GEN8_GT_VCS2_IRQ)) {
1434 gt_iir[1] = I915_READ_FW(GEN8_GT_IIR(1)); 1436 gt_iir[1] = raw_reg_read(regs, GEN8_GT_IIR(1));
1435 if (gt_iir[1]) 1437 if (likely(gt_iir[1]))
1436 I915_WRITE_FW(GEN8_GT_IIR(1), gt_iir[1]); 1438 raw_reg_write(regs, GEN8_GT_IIR(1), gt_iir[1]);
1437 } 1439 }
1438 1440
1439 if (master_ctl & GEN8_GT_VECS_IRQ) { 1441 if (master_ctl & (GEN8_GT_PM_IRQ | GEN8_GT_GUC_IRQ)) {
1440 gt_iir[3] = I915_READ_FW(GEN8_GT_IIR(3)); 1442 gt_iir[2] = raw_reg_read(regs, GEN8_GT_IIR(2));
1441 if (gt_iir[3]) 1443 if (likely(gt_iir[2] & (i915->pm_rps_events |
1442 I915_WRITE_FW(GEN8_GT_IIR(3), gt_iir[3]); 1444 i915->pm_guc_events)))
1445 raw_reg_write(regs, GEN8_GT_IIR(2),
1446 gt_iir[2] & (i915->pm_rps_events |
1447 i915->pm_guc_events));
1443 } 1448 }
1444 1449
1445 if (master_ctl & (GEN8_GT_PM_IRQ | GEN8_GT_GUC_IRQ)) { 1450 if (master_ctl & GEN8_GT_VECS_IRQ) {
1446 gt_iir[2] = I915_READ_FW(GEN8_GT_IIR(2)); 1451 gt_iir[3] = raw_reg_read(regs, GEN8_GT_IIR(3));
1447 if (gt_iir[2] & (dev_priv->pm_rps_events | 1452 if (likely(gt_iir[3]))
1448 dev_priv->pm_guc_events)) { 1453 raw_reg_write(regs, GEN8_GT_IIR(3), gt_iir[3]);
1449 I915_WRITE_FW(GEN8_GT_IIR(2),
1450 gt_iir[2] & (dev_priv->pm_rps_events |
1451 dev_priv->pm_guc_events));
1452 }
1453 } 1454 }
1454} 1455}
1455 1456
1456static void gen8_gt_irq_handler(struct drm_i915_private *dev_priv, 1457static void gen8_gt_irq_handler(struct drm_i915_private *i915,
1457 u32 master_ctl, u32 gt_iir[4]) 1458 u32 master_ctl, u32 gt_iir[4])
1458{ 1459{
1459 if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) { 1460 if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) {
1460 gen8_cs_irq_handler(dev_priv->engine[RCS], 1461 gen8_cs_irq_handler(i915->engine[RCS],
1461 gt_iir[0], GEN8_RCS_IRQ_SHIFT); 1462 gt_iir[0], GEN8_RCS_IRQ_SHIFT);
1462 gen8_cs_irq_handler(dev_priv->engine[BCS], 1463 gen8_cs_irq_handler(i915->engine[BCS],
1463 gt_iir[0], GEN8_BCS_IRQ_SHIFT); 1464 gt_iir[0], GEN8_BCS_IRQ_SHIFT);
1464 } 1465 }
1465 1466
1466 if (master_ctl & (GEN8_GT_VCS1_IRQ | GEN8_GT_VCS2_IRQ)) { 1467 if (master_ctl & (GEN8_GT_VCS1_IRQ | GEN8_GT_VCS2_IRQ)) {
1467 gen8_cs_irq_handler(dev_priv->engine[VCS], 1468 gen8_cs_irq_handler(i915->engine[VCS],
1468 gt_iir[1], GEN8_VCS1_IRQ_SHIFT); 1469 gt_iir[1], GEN8_VCS1_IRQ_SHIFT);
1469 gen8_cs_irq_handler(dev_priv->engine[VCS2], 1470 gen8_cs_irq_handler(i915->engine[VCS2],
1470 gt_iir[1], GEN8_VCS2_IRQ_SHIFT); 1471 gt_iir[1], GEN8_VCS2_IRQ_SHIFT);
1471 } 1472 }
1472 1473
1473 if (master_ctl & GEN8_GT_VECS_IRQ) { 1474 if (master_ctl & GEN8_GT_VECS_IRQ) {
1474 gen8_cs_irq_handler(dev_priv->engine[VECS], 1475 gen8_cs_irq_handler(i915->engine[VECS],
1475 gt_iir[3], GEN8_VECS_IRQ_SHIFT); 1476 gt_iir[3], GEN8_VECS_IRQ_SHIFT);
1476 } 1477 }
1477 1478
1478 if (master_ctl & (GEN8_GT_PM_IRQ | GEN8_GT_GUC_IRQ)) { 1479 if (master_ctl & (GEN8_GT_PM_IRQ | GEN8_GT_GUC_IRQ)) {
1479 if (gt_iir[2] & dev_priv->pm_rps_events) 1480 gen6_rps_irq_handler(i915, gt_iir[2]);
1480 gen6_rps_irq_handler(dev_priv, gt_iir[2]); 1481 gen9_guc_irq_handler(i915, gt_iir[2]);
1481
1482 if (gt_iir[2] & dev_priv->pm_guc_events)
1483 gen9_guc_irq_handler(dev_priv, gt_iir[2]);
1484 } 1482 }
1485} 1483}
1486 1484
diff --git a/drivers/gpu/drm/i915/intel_uncore.h b/drivers/gpu/drm/i915/intel_uncore.h
index 9ce079b5dd0d..6e6b3675d0a0 100644
--- a/drivers/gpu/drm/i915/intel_uncore.h
+++ b/drivers/gpu/drm/i915/intel_uncore.h
@@ -186,4 +186,9 @@ int intel_wait_for_register_fw(struct drm_i915_private *dev_priv,
186 2, timeout_ms, NULL); 186 2, timeout_ms, NULL);
187} 187}
188 188
189#define raw_reg_read(base, reg) \
190 readl(base + i915_mmio_reg_offset(reg))
191#define raw_reg_write(base, reg, value) \
192 writel(value, base + i915_mmio_reg_offset(reg))
193
189#endif /* !__INTEL_UNCORE_H__ */ 194#endif /* !__INTEL_UNCORE_H__ */