diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gpu_error.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 22 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.h | 6 |
6 files changed, 36 insertions, 13 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 7b344c5300f0..537404b9f760 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -351,12 +351,12 @@ struct drm_i915_error_state { | |||
351 | u32 ipeir; | 351 | u32 ipeir; |
352 | u32 ipehr; | 352 | u32 ipehr; |
353 | u32 instdone; | 353 | u32 instdone; |
354 | u32 acthd; | ||
355 | u32 bbstate; | 354 | u32 bbstate; |
356 | u32 instpm; | 355 | u32 instpm; |
357 | u32 instps; | 356 | u32 instps; |
358 | u32 seqno; | 357 | u32 seqno; |
359 | u64 bbaddr; | 358 | u64 bbaddr; |
359 | u64 acthd; | ||
360 | u32 fault_reg; | 360 | u32 fault_reg; |
361 | u32 faddr; | 361 | u32 faddr; |
362 | u32 rc_psmi; /* sleep state */ | 362 | u32 rc_psmi; /* sleep state */ |
@@ -2746,6 +2746,17 @@ void vlv_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine); | |||
2746 | #define I915_WRITE64(reg, val) dev_priv->uncore.funcs.mmio_writeq(dev_priv, (reg), (val), true) | 2746 | #define I915_WRITE64(reg, val) dev_priv->uncore.funcs.mmio_writeq(dev_priv, (reg), (val), true) |
2747 | #define I915_READ64(reg) dev_priv->uncore.funcs.mmio_readq(dev_priv, (reg), true) | 2747 | #define I915_READ64(reg) dev_priv->uncore.funcs.mmio_readq(dev_priv, (reg), true) |
2748 | 2748 | ||
2749 | #define I915_READ64_2x32(lower_reg, upper_reg) ({ \ | ||
2750 | u32 upper = I915_READ(upper_reg); \ | ||
2751 | u32 lower = I915_READ(lower_reg); \ | ||
2752 | u32 tmp = I915_READ(upper_reg); \ | ||
2753 | if (upper != tmp) { \ | ||
2754 | upper = tmp; \ | ||
2755 | lower = I915_READ(lower_reg); \ | ||
2756 | WARN_ON(I915_READ(upper_reg) != upper); \ | ||
2757 | } \ | ||
2758 | (u64)upper << 32 | lower; }) | ||
2759 | |||
2749 | #define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg) | 2760 | #define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg) |
2750 | #define POSTING_READ16(reg) (void)I915_READ16_NOTRACE(reg) | 2761 | #define POSTING_READ16(reg) (void)I915_READ16_NOTRACE(reg) |
2751 | 2762 | ||
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index baf1ca690dc5..ed1fac7f945c 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c | |||
@@ -247,7 +247,7 @@ static void i915_ring_error_state(struct drm_i915_error_state_buf *m, | |||
247 | err_printf(m, " TAIL: 0x%08x\n", ring->tail); | 247 | err_printf(m, " TAIL: 0x%08x\n", ring->tail); |
248 | err_printf(m, " CTL: 0x%08x\n", ring->ctl); | 248 | err_printf(m, " CTL: 0x%08x\n", ring->ctl); |
249 | err_printf(m, " HWS: 0x%08x\n", ring->hws); | 249 | err_printf(m, " HWS: 0x%08x\n", ring->hws); |
250 | err_printf(m, " ACTHD: 0x%08x\n", ring->acthd); | 250 | err_printf(m, " ACTHD: 0x%08llx\n", ring->acthd); |
251 | err_printf(m, " IPEIR: 0x%08x\n", ring->ipeir); | 251 | err_printf(m, " IPEIR: 0x%08x\n", ring->ipeir); |
252 | err_printf(m, " IPEHR: 0x%08x\n", ring->ipehr); | 252 | err_printf(m, " IPEHR: 0x%08x\n", ring->ipehr); |
253 | err_printf(m, " INSTDONE: 0x%08x\n", ring->instdone); | 253 | err_printf(m, " INSTDONE: 0x%08x\n", ring->instdone); |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index df2f3007d8c5..5e353a4af921 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -2600,7 +2600,7 @@ static void semaphore_clear_deadlocks(struct drm_i915_private *dev_priv) | |||
2600 | } | 2600 | } |
2601 | 2601 | ||
2602 | static enum intel_ring_hangcheck_action | 2602 | static enum intel_ring_hangcheck_action |
2603 | ring_stuck(struct intel_ring_buffer *ring, u32 acthd) | 2603 | ring_stuck(struct intel_ring_buffer *ring, u64 acthd) |
2604 | { | 2604 | { |
2605 | struct drm_device *dev = ring->dev; | 2605 | struct drm_device *dev = ring->dev; |
2606 | struct drm_i915_private *dev_priv = dev->dev_private; | 2606 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -2668,7 +2668,8 @@ static void i915_hangcheck_elapsed(unsigned long data) | |||
2668 | return; | 2668 | return; |
2669 | 2669 | ||
2670 | for_each_ring(ring, dev_priv, i) { | 2670 | for_each_ring(ring, dev_priv, i) { |
2671 | u32 seqno, acthd; | 2671 | u64 acthd; |
2672 | u32 seqno; | ||
2672 | bool busy = true; | 2673 | bool busy = true; |
2673 | 2674 | ||
2674 | semaphore_clear_deadlocks(dev_priv); | 2675 | semaphore_clear_deadlocks(dev_priv); |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index d90dc20077e3..9f5b18d9d885 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -706,6 +706,7 @@ enum punit_power_well { | |||
706 | #define BLT_HWS_PGA_GEN7 (0x04280) | 706 | #define BLT_HWS_PGA_GEN7 (0x04280) |
707 | #define VEBOX_HWS_PGA_GEN7 (0x04380) | 707 | #define VEBOX_HWS_PGA_GEN7 (0x04380) |
708 | #define RING_ACTHD(base) ((base)+0x74) | 708 | #define RING_ACTHD(base) ((base)+0x74) |
709 | #define RING_ACTHD_UDW(base) ((base)+0x5c) | ||
709 | #define RING_NOPID(base) ((base)+0x94) | 710 | #define RING_NOPID(base) ((base)+0x94) |
710 | #define RING_IMR(base) ((base)+0xa8) | 711 | #define RING_IMR(base) ((base)+0xa8) |
711 | #define RING_TIMESTAMP(base) ((base)+0x358) | 712 | #define RING_TIMESTAMP(base) ((base)+0x358) |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index bfb5d75cc1c5..0cba12948915 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -410,13 +410,20 @@ static void ring_write_tail(struct intel_ring_buffer *ring, | |||
410 | I915_WRITE_TAIL(ring, value); | 410 | I915_WRITE_TAIL(ring, value); |
411 | } | 411 | } |
412 | 412 | ||
413 | u32 intel_ring_get_active_head(struct intel_ring_buffer *ring) | 413 | u64 intel_ring_get_active_head(struct intel_ring_buffer *ring) |
414 | { | 414 | { |
415 | drm_i915_private_t *dev_priv = ring->dev->dev_private; | 415 | drm_i915_private_t *dev_priv = ring->dev->dev_private; |
416 | u32 acthd_reg = INTEL_INFO(ring->dev)->gen >= 4 ? | 416 | u64 acthd; |
417 | RING_ACTHD(ring->mmio_base) : ACTHD; | ||
418 | 417 | ||
419 | return I915_READ(acthd_reg); | 418 | if (INTEL_INFO(ring->dev)->gen >= 8) |
419 | acthd = I915_READ64_2x32(RING_ACTHD(ring->mmio_base), | ||
420 | RING_ACTHD_UDW(ring->mmio_base)); | ||
421 | else if (INTEL_INFO(ring->dev)->gen >= 4) | ||
422 | acthd = I915_READ(RING_ACTHD(ring->mmio_base)); | ||
423 | else | ||
424 | acthd = I915_READ(ACTHD); | ||
425 | |||
426 | return acthd; | ||
420 | } | 427 | } |
421 | 428 | ||
422 | static void ring_setup_phys_status_page(struct intel_ring_buffer *ring) | 429 | static void ring_setup_phys_status_page(struct intel_ring_buffer *ring) |
@@ -814,8 +821,11 @@ gen6_ring_get_seqno(struct intel_ring_buffer *ring, bool lazy_coherency) | |||
814 | /* Workaround to force correct ordering between irq and seqno writes on | 821 | /* Workaround to force correct ordering between irq and seqno writes on |
815 | * ivb (and maybe also on snb) by reading from a CS register (like | 822 | * ivb (and maybe also on snb) by reading from a CS register (like |
816 | * ACTHD) before reading the status page. */ | 823 | * ACTHD) before reading the status page. */ |
817 | if (!lazy_coherency) | 824 | if (!lazy_coherency) { |
818 | intel_ring_get_active_head(ring); | 825 | struct drm_i915_private *dev_priv = ring->dev->dev_private; |
826 | POSTING_READ(RING_ACTHD(ring->mmio_base)); | ||
827 | } | ||
828 | |||
819 | return intel_read_status_page(ring, I915_GEM_HWS_INDEX); | 829 | return intel_read_status_page(ring, I915_GEM_HWS_INDEX); |
820 | } | 830 | } |
821 | 831 | ||
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index f11ceb230db4..270a6a973438 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h | |||
@@ -46,11 +46,11 @@ enum intel_ring_hangcheck_action { | |||
46 | #define HANGCHECK_SCORE_RING_HUNG 31 | 46 | #define HANGCHECK_SCORE_RING_HUNG 31 |
47 | 47 | ||
48 | struct intel_ring_hangcheck { | 48 | struct intel_ring_hangcheck { |
49 | bool deadlock; | 49 | u64 acthd; |
50 | u32 seqno; | 50 | u32 seqno; |
51 | u32 acthd; | ||
52 | int score; | 51 | int score; |
53 | enum intel_ring_hangcheck_action action; | 52 | enum intel_ring_hangcheck_action action; |
53 | bool deadlock; | ||
54 | }; | 54 | }; |
55 | 55 | ||
56 | struct intel_ring_buffer { | 56 | struct intel_ring_buffer { |
@@ -292,7 +292,7 @@ int intel_init_bsd_ring_buffer(struct drm_device *dev); | |||
292 | int intel_init_blt_ring_buffer(struct drm_device *dev); | 292 | int intel_init_blt_ring_buffer(struct drm_device *dev); |
293 | int intel_init_vebox_ring_buffer(struct drm_device *dev); | 293 | int intel_init_vebox_ring_buffer(struct drm_device *dev); |
294 | 294 | ||
295 | u32 intel_ring_get_active_head(struct intel_ring_buffer *ring); | 295 | u64 intel_ring_get_active_head(struct intel_ring_buffer *ring); |
296 | void intel_ring_setup_status_page(struct intel_ring_buffer *ring); | 296 | void intel_ring_setup_status_page(struct intel_ring_buffer *ring); |
297 | 297 | ||
298 | static inline u32 intel_ring_get_tail(struct intel_ring_buffer *ring) | 298 | static inline u32 intel_ring_get_tail(struct intel_ring_buffer *ring) |