aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;