diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 54 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.h | 29 |
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 | */ | ||
1332 | void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv); | ||
1333 | void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv); | ||
1334 | void __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) \ |
1330 | static inline u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ | 1343 | static 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) \ |
1342 | static inline void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val) { \ | 1362 | static 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 | */ | ||
1376 | void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv); | ||
1377 | void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv); | ||
1378 | void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv); | ||
1379 | |||
1380 | static 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 | |||
1394 | static 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 | ||
39 | struct intel_ring_buffer { | 36 | struct intel_ring_buffer { |
40 | const char *name; | 37 | const char *name; |