aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c1
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h1
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c1
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h8
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c27
5 files changed, 26 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 2909b123baf5..359f6e8b9b00 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -676,6 +676,7 @@ static void i915_ring_error_state(struct seq_file *m,
676 seq_printf(m, " INSTPM: 0x%08x\n", error->instpm[ring]); 676 seq_printf(m, " INSTPM: 0x%08x\n", error->instpm[ring]);
677 seq_printf(m, " FADDR: 0x%08x\n", error->faddr[ring]); 677 seq_printf(m, " FADDR: 0x%08x\n", error->faddr[ring]);
678 if (INTEL_INFO(dev)->gen >= 6) { 678 if (INTEL_INFO(dev)->gen >= 6) {
679 seq_printf(m, " RC PSMI: 0x%08x\n", error->rc_psmi[ring]);
679 seq_printf(m, " FAULT_REG: 0x%08x\n", error->fault_reg[ring]); 680 seq_printf(m, " FAULT_REG: 0x%08x\n", error->fault_reg[ring]);
680 seq_printf(m, " SYNC_0: 0x%08x\n", 681 seq_printf(m, " SYNC_0: 0x%08x\n",
681 error->semaphore_mboxes[ring][0]); 682 error->semaphore_mboxes[ring][0]);
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 476c64c4844c..627fe35781b4 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -190,6 +190,7 @@ struct drm_i915_error_state {
190 u32 instdone[I915_NUM_RINGS]; 190 u32 instdone[I915_NUM_RINGS];
191 u32 acthd[I915_NUM_RINGS]; 191 u32 acthd[I915_NUM_RINGS];
192 u32 semaphore_mboxes[I915_NUM_RINGS][I915_NUM_RINGS - 1]; 192 u32 semaphore_mboxes[I915_NUM_RINGS][I915_NUM_RINGS - 1];
193 u32 rc_psmi[I915_NUM_RINGS]; /* sleep state */
193 /* our own tracking of ring head and tail */ 194 /* our own tracking of ring head and tail */
194 u32 cpu_ring_head[I915_NUM_RINGS]; 195 u32 cpu_ring_head[I915_NUM_RINGS];
195 u32 cpu_ring_tail[I915_NUM_RINGS]; 196 u32 cpu_ring_tail[I915_NUM_RINGS];
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 23f2ea0f0651..566f61b9e47c 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1067,6 +1067,7 @@ static void i915_record_ring_state(struct drm_device *dev,
1067 struct drm_i915_private *dev_priv = dev->dev_private; 1067 struct drm_i915_private *dev_priv = dev->dev_private;
1068 1068
1069 if (INTEL_INFO(dev)->gen >= 6) { 1069 if (INTEL_INFO(dev)->gen >= 6) {
1070 error->rc_psmi[ring->id] = I915_READ(ring->mmio_base + 0x50);
1070 error->fault_reg[ring->id] = I915_READ(RING_FAULT_REG(ring)); 1071 error->fault_reg[ring->id] = I915_READ(RING_FAULT_REG(ring));
1071 error->semaphore_mboxes[ring->id][0] 1072 error->semaphore_mboxes[ring->id][0]
1072 = I915_READ(RING_SYNC_0(ring->mmio_base)); 1073 = I915_READ(RING_SYNC_0(ring->mmio_base));
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index ac5688e8b01d..7aa6e97c2c72 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -690,10 +690,10 @@
690#define GEN6_BLITTER_FBC_NOTIFY (1<<3) 690#define GEN6_BLITTER_FBC_NOTIFY (1<<3)
691 691
692#define GEN6_BSD_SLEEP_PSMI_CONTROL 0x12050 692#define GEN6_BSD_SLEEP_PSMI_CONTROL 0x12050
693#define GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK (1 << 16) 693#define GEN6_BSD_SLEEP_MSG_DISABLE (1 << 0)
694#define GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_DISABLE (1 << 0) 694#define GEN6_BSD_SLEEP_FLUSH_DISABLE (1 << 2)
695#define GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE 0 695#define GEN6_BSD_SLEEP_INDICATOR (1 << 3)
696#define GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR (1 << 3) 696#define GEN6_BSD_GO_INDICATOR (1 << 4)
697 697
698#define GEN6_BSD_HWSTAM 0x12098 698#define GEN6_BSD_HWSTAM 0x12098
699#define GEN6_BSD_IMR 0x120a8 699#define GEN6_BSD_IMR 0x120a8
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index d42d821c64d6..ddc48590ea60 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -1270,20 +1270,31 @@ static void gen6_bsd_ring_write_tail(struct intel_ring_buffer *ring,
1270 drm_i915_private_t *dev_priv = ring->dev->dev_private; 1270 drm_i915_private_t *dev_priv = ring->dev->dev_private;
1271 1271
1272 /* Every tail move must follow the sequence below */ 1272 /* Every tail move must follow the sequence below */
1273
1274 /* Disable notification that the ring is IDLE. The GT
1275 * will then assume that it is busy and bring it out of rc6.
1276 */
1273 I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL, 1277 I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
1274 GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK | 1278 _MASKED_BIT_ENABLE(GEN6_BSD_SLEEP_MSG_DISABLE));
1275 GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_DISABLE); 1279
1276 I915_WRITE(GEN6_BSD_RNCID, 0x0); 1280 /* Clear the context id. Here be magic! */
1281 I915_WRITE64(GEN6_BSD_RNCID, 0x0);
1277 1282
1283 /* Wait for the ring not to be idle, i.e. for it to wake up. */
1278 if (wait_for((I915_READ(GEN6_BSD_SLEEP_PSMI_CONTROL) & 1284 if (wait_for((I915_READ(GEN6_BSD_SLEEP_PSMI_CONTROL) &
1279 GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR) == 0, 1285 GEN6_BSD_SLEEP_INDICATOR) == 0,
1280 50)) 1286 50))
1281 DRM_ERROR("timed out waiting for IDLE Indicator\n"); 1287 DRM_ERROR("timed out waiting for the BSD ring to wake up\n");
1282 1288
1289 /* Now that the ring is fully powered up, update the tail */
1283 I915_WRITE_TAIL(ring, value); 1290 I915_WRITE_TAIL(ring, value);
1291 POSTING_READ(RING_TAIL(ring->mmio_base));
1292
1293 /* Let the ring send IDLE messages to the GT again,
1294 * and so let it sleep to conserve power when idle.
1295 */
1284 I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL, 1296 I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
1285 GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK | 1297 _MASKED_BIT_DISABLE(GEN6_BSD_SLEEP_MSG_DISABLE));
1286 GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE);
1287} 1298}
1288 1299
1289static int gen6_ring_flush(struct intel_ring_buffer *ring, 1300static int gen6_ring_flush(struct intel_ring_buffer *ring,