diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2018-02-19 05:09:26 -0500 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2018-02-19 10:38:59 -0500 |
commit | 2e4a5b25886cde308d3fc896fd584c844bde92a2 (patch) | |
tree | a38d1e5c58dc477e68ce49bcad1ba6d6d0063ef6 | |
parent | f0fd96f546fb9e726ff66b1e53b115ada61ebc35 (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.c | 58 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_uncore.h | 5 |
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 | ||
1416 | static void gen8_gt_irq_ack(struct drm_i915_private *dev_priv, | 1416 | static 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 | ||
1456 | static void gen8_gt_irq_handler(struct drm_i915_private *dev_priv, | 1457 | static 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__ */ |