diff options
| author | Eric Anholt <eric@anholt.net> | 2011-05-06 20:12:35 -0400 |
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2011-05-13 21:12:52 -0400 |
| commit | 4593010b68247e6bed746da4e15f66f06e239e28 (patch) | |
| tree | 634258679b01be9f895478e6ed167b3af6198b20 | |
| parent | 25aebfc30bc40f01813aad7a0f62f2fda44efb8a (diff) | |
drm/i915: Update the location of the ringbuffers' HWS_PGA registers for IVB.
They have been moved from the ringbuffer groups to their own group it
looks like. Fixes GPU hangs on gnome startup.
Signed-off-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Keith Packard <keithp@keithp.com>
| -rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 27 |
2 files changed, 27 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 8f70fb65b496..f1bc0fb6a72c 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -291,6 +291,9 @@ | |||
| 291 | #define RING_MAX_IDLE(base) ((base)+0x54) | 291 | #define RING_MAX_IDLE(base) ((base)+0x54) |
| 292 | #define RING_HWS_PGA(base) ((base)+0x80) | 292 | #define RING_HWS_PGA(base) ((base)+0x80) |
| 293 | #define RING_HWS_PGA_GEN6(base) ((base)+0x2080) | 293 | #define RING_HWS_PGA_GEN6(base) ((base)+0x2080) |
| 294 | #define RENDER_HWS_PGA_GEN7 (0x04080) | ||
| 295 | #define BSD_HWS_PGA_GEN7 (0x04180) | ||
| 296 | #define BLT_HWS_PGA_GEN7 (0x04280) | ||
| 294 | #define RING_ACTHD(base) ((base)+0x74) | 297 | #define RING_ACTHD(base) ((base)+0x74) |
| 295 | #define RING_NOPID(base) ((base)+0x94) | 298 | #define RING_NOPID(base) ((base)+0x94) |
| 296 | #define RING_IMR(base) ((base)+0xa8) | 299 | #define RING_IMR(base) ((base)+0xa8) |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 12c168f0cb77..3971b5e6ad60 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
| @@ -551,10 +551,31 @@ render_ring_put_irq(struct intel_ring_buffer *ring) | |||
| 551 | 551 | ||
| 552 | void intel_ring_setup_status_page(struct intel_ring_buffer *ring) | 552 | void intel_ring_setup_status_page(struct intel_ring_buffer *ring) |
| 553 | { | 553 | { |
| 554 | struct drm_device *dev = ring->dev; | ||
| 554 | drm_i915_private_t *dev_priv = ring->dev->dev_private; | 555 | drm_i915_private_t *dev_priv = ring->dev->dev_private; |
| 555 | u32 mmio = (IS_GEN6(ring->dev) || IS_GEN7(ring->dev)) ? | 556 | u32 mmio = 0; |
| 556 | RING_HWS_PGA_GEN6(ring->mmio_base) : | 557 | |
| 557 | RING_HWS_PGA(ring->mmio_base); | 558 | /* The ring status page addresses are no longer next to the rest of |
| 559 | * the ring registers as of gen7. | ||
| 560 | */ | ||
| 561 | if (IS_GEN7(dev)) { | ||
| 562 | switch (ring->id) { | ||
| 563 | case RING_RENDER: | ||
| 564 | mmio = RENDER_HWS_PGA_GEN7; | ||
| 565 | break; | ||
| 566 | case RING_BLT: | ||
| 567 | mmio = BLT_HWS_PGA_GEN7; | ||
| 568 | break; | ||
| 569 | case RING_BSD: | ||
| 570 | mmio = BSD_HWS_PGA_GEN7; | ||
| 571 | break; | ||
| 572 | } | ||
| 573 | } else if (IS_GEN6(ring->dev)) { | ||
| 574 | mmio = RING_HWS_PGA_GEN6(ring->mmio_base); | ||
| 575 | } else { | ||
| 576 | mmio = RING_HWS_PGA(ring->mmio_base); | ||
| 577 | } | ||
| 578 | |||
| 558 | I915_WRITE(mmio, (u32)ring->status_page.gfx_addr); | 579 | I915_WRITE(mmio, (u32)ring->status_page.gfx_addr); |
| 559 | POSTING_READ(mmio); | 580 | POSTING_READ(mmio); |
| 560 | } | 581 | } |
