aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorBen Widawsky <ben@bwidawsk.net>2011-04-25 14:22:22 -0400
committerKeith Packard <keithp@keithp.com>2011-05-10 16:56:45 -0400
commitb7287d8054d219b3009f7ca82edf24f89fd363e5 (patch)
tree95f92a64acbeafd1846d3378551c69f3e7ea150f /drivers
parent2c7111dbaec72b01c804afb8ad77c6c7523986fd (diff)
drm/i915: proper use of forcewake
Moved the macros around to properly do reads and writes for the given GPU. This is to address special requirements for gen6 (SNB) reads and writes. Registers in the range 0-0x40000 on gen6 platforms require special handling. Instead of relying on the callers to pick the registers correctly, move the logic into the read and write functions. Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h54
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.h29
2 files changed, 37 insertions, 46 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 4b862f366904..083644ef8f31 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1325,10 +1325,30 @@ extern void intel_display_print_error_state(struct seq_file *m,
1325 LOCK_TEST_WITH_RETURN(dev, file); \ 1325 LOCK_TEST_WITH_RETURN(dev, file); \
1326} while (0) 1326} while (0)
1327 1327
1328/* On SNB platform, before reading ring registers forcewake bit
1329 * must be set to prevent GT core from power down and stale values being
1330 * returned.
1331 */
1332void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv);
1333void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv);
1334void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv);
1335
1336/* We give fast paths for the really cool registers */
1337#define NEEDS_FORCE_WAKE(dev_priv, reg) \
1338 (((dev_priv)->info->gen >= 6) && \
1339 ((reg) < 0x40000) && \
1340 ((reg) != FORCEWAKE))
1328 1341
1329#define __i915_read(x, y) \ 1342#define __i915_read(x, y) \
1330static inline u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ 1343static inline u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \
1331 u##x val = read##y(dev_priv->regs + reg); \ 1344 u##x val = 0; \
1345 if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \
1346 __gen6_gt_force_wake_get(dev_priv); \
1347 val = read##y(dev_priv->regs + reg); \
1348 __gen6_gt_force_wake_put(dev_priv); \
1349 } else { \
1350 val = read##y(dev_priv->regs + reg); \
1351 } \
1332 trace_i915_reg_rw(false, reg, val, sizeof(val)); \ 1352 trace_i915_reg_rw(false, reg, val, sizeof(val)); \
1333 return val; \ 1353 return val; \
1334} 1354}
@@ -1341,6 +1361,9 @@ __i915_read(64, q)
1341#define __i915_write(x, y) \ 1361#define __i915_write(x, y) \
1342static inline void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val) { \ 1362static inline void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val) { \
1343 trace_i915_reg_rw(true, reg, val, sizeof(val)); \ 1363 trace_i915_reg_rw(true, reg, val, sizeof(val)); \
1364 if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \
1365 __gen6_gt_wait_for_fifo(dev_priv); \
1366 } \
1344 write##y(val, dev_priv->regs + reg); \ 1367 write##y(val, dev_priv->regs + reg); \
1345} 1368}
1346__i915_write(8, b) 1369__i915_write(8, b)
@@ -1369,33 +1392,4 @@ __i915_write(64, q)
1369#define POSTING_READ16(reg) (void)I915_READ16_NOTRACE(reg) 1392#define POSTING_READ16(reg) (void)I915_READ16_NOTRACE(reg)
1370 1393
1371 1394
1372/* On SNB platform, before reading ring registers forcewake bit
1373 * must be set to prevent GT core from power down and stale values being
1374 * returned.
1375 */
1376void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv);
1377void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv);
1378void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv);
1379
1380static inline u32 i915_gt_read(struct drm_i915_private *dev_priv, u32 reg)
1381{
1382 u32 val;
1383
1384 if (dev_priv->info->gen >= 6) {
1385 __gen6_gt_force_wake_get(dev_priv);
1386 val = I915_READ(reg);
1387 __gen6_gt_force_wake_put(dev_priv);
1388 } else
1389 val = I915_READ(reg);
1390
1391 return val;
1392}
1393
1394static inline void i915_gt_write(struct drm_i915_private *dev_priv,
1395 u32 reg, u32 val)
1396{
1397 if (dev_priv->info->gen >= 6)
1398 __gen6_gt_wait_for_fifo(dev_priv);
1399 I915_WRITE(reg, val);
1400}
1401#endif 1395#endif
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 16cb125eb117..c0e0ee63fbf4 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -14,27 +14,24 @@ struct intel_hw_status_page {
14 struct drm_i915_gem_object *obj; 14 struct drm_i915_gem_object *obj;
15}; 15};
16 16
17#define I915_RING_READ(reg) i915_gt_read(dev_priv, reg) 17#define I915_READ_TAIL(ring) I915_READ(RING_TAIL((ring)->mmio_base))
18#define I915_RING_WRITE(reg, val) i915_gt_write(dev_priv, reg, val) 18#define I915_WRITE_TAIL(ring, val) I915_WRITE(RING_TAIL((ring)->mmio_base), val)
19 19
20#define I915_READ_TAIL(ring) I915_RING_READ(RING_TAIL((ring)->mmio_base)) 20#define I915_READ_START(ring) I915_READ(RING_START((ring)->mmio_base))
21#define I915_WRITE_TAIL(ring, val) I915_RING_WRITE(RING_TAIL((ring)->mmio_base), val) 21#define I915_WRITE_START(ring, val) I915_WRITE(RING_START((ring)->mmio_base), val)
22 22
23#define I915_READ_START(ring) I915_RING_READ(RING_START((ring)->mmio_base)) 23#define I915_READ_HEAD(ring) I915_READ(RING_HEAD((ring)->mmio_base))
24#define I915_WRITE_START(ring, val) I915_RING_WRITE(RING_START((ring)->mmio_base), val) 24#define I915_WRITE_HEAD(ring, val) I915_WRITE(RING_HEAD((ring)->mmio_base), val)
25 25
26#define I915_READ_HEAD(ring) I915_RING_READ(RING_HEAD((ring)->mmio_base)) 26#define I915_READ_CTL(ring) I915_READ(RING_CTL((ring)->mmio_base))
27#define I915_WRITE_HEAD(ring, val) I915_RING_WRITE(RING_HEAD((ring)->mmio_base), val) 27#define I915_WRITE_CTL(ring, val) I915_WRITE(RING_CTL((ring)->mmio_base), val)
28 28
29#define I915_READ_CTL(ring) I915_RING_READ(RING_CTL((ring)->mmio_base)) 29#define I915_READ_IMR(ring) I915_READ(RING_IMR((ring)->mmio_base))
30#define I915_WRITE_CTL(ring, val) I915_RING_WRITE(RING_CTL((ring)->mmio_base), val) 30#define I915_WRITE_IMR(ring, val) I915_WRITE(RING_IMR((ring)->mmio_base), val)
31 31
32#define I915_READ_IMR(ring) I915_RING_READ(RING_IMR((ring)->mmio_base)) 32#define I915_READ_NOPID(ring) I915_READ(RING_NOPID((ring)->mmio_base))
33#define I915_WRITE_IMR(ring, val) I915_RING_WRITE(RING_IMR((ring)->mmio_base), val) 33#define I915_READ_SYNC_0(ring) I915_READ(RING_SYNC_0((ring)->mmio_base))
34 34#define I915_READ_SYNC_1(ring) I915_READ(RING_SYNC_1((ring)->mmio_base))
35#define I915_READ_NOPID(ring) I915_RING_READ(RING_NOPID((ring)->mmio_base))
36#define I915_READ_SYNC_0(ring) I915_RING_READ(RING_SYNC_0((ring)->mmio_base))
37#define I915_READ_SYNC_1(ring) I915_RING_READ(RING_SYNC_1((ring)->mmio_base))
38 35
39struct intel_ring_buffer { 36struct intel_ring_buffer {
40 const char *name; 37 const char *name;