[Intel-gfx] [RFC 09/13] drm/i915: Watchdog timer support functions
Daniel Vetter
daniel at ffwll.ch
Mon Dec 16 19:18:22 CET 2013
On Mon, Dec 16, 2013 at 04:03:24PM +0000, Lister, Ian wrote:
> From f49cbb9fd7131e49414a15c9041195d089411973 Mon Sep 17 00:00:00 2001
> Message-Id: <f49cbb9fd7131e49414a15c9041195d089411973.1387201899.git.ian.lister at intel.com>
> In-Reply-To: <cover.1387201899.git.ian.lister at intel.com>
> References: <cover.1387201899.git.ian.lister at intel.com>
> From: ian-lister <ian.lister at intel.com>
> Date: Tue, 10 Dec 2013 16:37:12 +0000
> Subject: [RFC 09/13] drm/i915: Watchdog timer support functions
>
> This is part of a series of patches to enable watchdog support.
> This patch adds the i915_ring_start_watchdog/i915_ring_stop_watchdog
> functions. These functions can be used to insert the timer start/stop
> commands onto the ring to surround a section of commands that need
> to be protected by watchdog timeout.
>
> The i915_ring_watchdog_supported function can be used to query which
> rings have the required hardware for watchdog support.
>
> Signed-off-by: ian-lister <ian.lister at intel.com>
One small comment at the bottom (I'm a bit lazy today with sniping).
-Daniel
> ---
> drivers/gpu/drm/i915/i915_reg.h | 2 +
> drivers/gpu/drm/i915/intel_ringbuffer.c | 84 +++++++++++++++++++++++++++++++++
> drivers/gpu/drm/i915/intel_ringbuffer.h | 6 +++
> 3 files changed, 92 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index e896bca..a0bbf82 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -735,6 +735,8 @@
> #define RING_SYNC_2(base) ((base)+0x48)
> #define RING_MI_MODE(base) ((base)+0x9c)
> #define RING_UHPTR(base) ((base)+0x134)
> +#define RING_CNTR(base) ((base)+0x178)
> +#define RING_THRESH(base) ((base)+0x17c)
> #define GEN6_RVSYNC (RING_SYNC_0(RENDER_RING_BASE))
> #define GEN6_RBSYNC (RING_SYNC_1(RENDER_RING_BASE))
> #define GEN6_RVESYNC (RING_SYNC_2(RENDER_RING_BASE))
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
> index 42e9ee6..2a0091d 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
> @@ -2597,3 +2597,87 @@ intel_ring_invalidate_all_caches(struct intel_ring_buffer *ring)
> ring->gpu_caches_dirty = false;
> return 0;
> }
> +
> +int
> +intel_ring_watchdog_supported(struct intel_ring_buffer *ring)
> +{
> + /* Return 1 if the ring supports watchdog reset, otherwise 0 */
> + if (ring) {
> + switch (ring->id) {
> + case RCS:
> + case VCS:
> + return 1;
> + default:
> + return 0;
> + }
> + }
> +
> + return 0;
> +}
> +
> +int
> +intel_ring_start_watchdog(struct intel_ring_buffer *ring)
> +{
> + int ret;
> +
> + ret = intel_ring_begin(ring, 10);
> + if (ret)
> + return ret;
> +
> + /* i915_reg.h includes a warning to place a MI_NOOP
> + * before an MI_LOAD_REGISTER_IMM */
> + intel_ring_emit(ring, MI_NOOP);
> + intel_ring_emit(ring, MI_NOOP);
> +
> + /* Set counter period */
> + intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
> + intel_ring_emit(ring, RING_THRESH(ring->mmio_base));
> + intel_ring_emit(ring, ring->hangcheck.watchdog_threshold);
> + intel_ring_emit(ring, MI_NOOP);
> +
> + /* Start counter */
> + intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
> + intel_ring_emit(ring, RING_CNTR(ring->mmio_base));
> + intel_ring_emit(ring, WATCHDOG_ENABLE);
> + intel_ring_emit(ring, MI_NOOP);
> + intel_ring_advance(ring);
> +
> + return 0;
> +}
> +
> +
> +int
> +intel_ring_stop_watchdog(struct intel_ring_buffer *ring)
> +{
> + int ret;
> +
> + ret = intel_ring_begin(ring, 6);
> + if (ret)
> + return ret;
> +
> + /* i915_reg.h includes a warning to place a MI_NOOP
> + * before an MI_LOAD_REGISTER_IMM*/
> + intel_ring_emit(ring, MI_NOOP);
> + intel_ring_emit(ring, MI_NOOP);
> +
> + intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
> + intel_ring_emit(ring, RING_CNTR(ring->mmio_base));
> +
> + switch (ring->id) {
> + default:
> + case RCS:
> + intel_ring_emit(ring, RCS_WATCHDOG_DISABLE);
> + break;
> + case VCS:
> + intel_ring_emit(ring, VCS_WATCHDOG_DISABLE);
> + break;
> + }
> +
> + intel_ring_emit(ring, MI_NOOP);
> +
> + intel_ring_advance(ring);
> +
> + return 0;
> +}
> +
> +
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> index c3d6cbb..91c10b7 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> @@ -18,6 +18,9 @@ struct intel_hw_status_page {
> struct drm_i915_gem_object *obj;
> };
>
> +#define WATCHDOG_ENABLE 0
> +#define RCS_WATCHDOG_DISABLE 1
> +#define VCS_WATCHDOG_DISABLE 0xFFFFFFFF
Register value #defines (which these seem to be) usually get stuffed into
i915_reg.h, next to the relevant register #define
>
> /* These values must match the requirements of the ring save/restore functions
> * which will vary for each chip*/
> @@ -322,5 +325,8 @@ int intel_ring_save(struct intel_ring_buffer *ring,
> u32 flags);
> int intel_ring_restore(struct intel_ring_buffer *ring);
>
> +int intel_ring_watchdog_supported(struct intel_ring_buffer *ring);
> +int intel_ring_start_watchdog(struct intel_ring_buffer *ring);
> +int intel_ring_stop_watchdog(struct intel_ring_buffer *ring);
>
> #endif /* _INTEL_RINGBUFFER_H_ */
> --
> 1.8.5.1
>
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
More information about the Intel-gfx
mailing list