[Intel-gfx] [PATCH 2/2] drm/i915: Use wait_for_atomic_us when waiting for gt fifo
Chris Wilson
chris at chris-wilson.co.uk
Thu Apr 6 09:12:54 UTC 2017
On Thu, Apr 06, 2017 at 11:44:19AM +0300, Mika Kuoppala wrote:
> Replace the handcrafter loop when checking for fifo slots
> with atomic wait for. This brings this wait in line with
> the other waits on register access. We also get a readable
> timeout constraint, so make it to fail after 10ms.
>
> Chris suggested that we should fail silently as the fifo debug
> handler, now attached to unclaimed mmio handling, will take care of the
> possible errors at later stage.
>
> Note that the decision to wait was changed so that we avoid
> allocating the first reserved entry. Nor do we reduce the count
> if we fail the wait, removing the possiblity to wrap the
> count if the hw fifo returned zero.
Otoh, we don't abort the write so the slot is still taken. Nor does it
update the last known fifo_count along that path.
However, we leave it set to a value that will cause us to reread the
counter on the next call, so it comes out in the wash.
>
> References: https://bugs.freedesktop.org/show_bug.cgi?id=100247
> Signed-off-by: Mika Kuoppala <mika.kuoppala at intel.com>
> ---
> drivers/gpu/drm/i915/intel_uncore.c | 30 +++++++++++++++---------------
> 1 file changed, 15 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
> index a129a73..df744a8 100644
> --- a/drivers/gpu/drm/i915/intel_uncore.c
> +++ b/drivers/gpu/drm/i915/intel_uncore.c
> @@ -29,6 +29,7 @@
> #include <linux/pm_runtime.h>
>
> #define FORCEWAKE_ACK_TIMEOUT_MS 50
> +#define GT_FIFO_TIMEOUT_MS 10
>
> #define __raw_posting_read(dev_priv__, reg__) (void)__raw_i915_read32((dev_priv__), (reg__))
>
> @@ -181,28 +182,27 @@ static inline u32 fifo_free_entries(struct drm_i915_private *dev_priv)
>
> static int __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv)
> {
> - int ret = 0;
> + u32 n;
>
> /* On VLV, FIFO will be shared by both SW and HW.
> * So, we need to read the FREE_ENTRIES everytime */
> if (IS_VALLEYVIEW(dev_priv))
> - dev_priv->uncore.fifo_count = fifo_free_entries(dev_priv);
> -
> - if (dev_priv->uncore.fifo_count < GT_FIFO_NUM_RESERVED_ENTRIES) {
> - int loop = 500;
> - u32 fifo = fifo_free_entries(dev_priv);
> -
> - while (fifo <= GT_FIFO_NUM_RESERVED_ENTRIES && loop--) {
> - udelay(10);
> - fifo = fifo_free_entries(dev_priv);
> + n = fifo_free_entries(dev_priv);
> + else
> + n = dev_priv->uncore.fifo_count;
> +
> + if (n <= GT_FIFO_NUM_RESERVED_ENTRIES) {
> + if (wait_for_atomic((n = fifo_free_entries(dev_priv)) >
> + GT_FIFO_NUM_RESERVED_ENTRIES,
> + GT_FIFO_TIMEOUT_MS)) {
> + DRM_DEBUG("GT_FIFO timeout, entries: %u, unclaimed: %d\n", n,
> + intel_uncore_unclaimed_mmio(dev_priv));
What's the connection here between unclaimed mmio and the fifo count?
i.e. what information do we glean? Espcially as this information is part
of the generic mmio framework already.
> + return -EBUSY;
> }
> - if (WARN_ON(loop < 0 && fifo <= GT_FIFO_NUM_RESERVED_ENTRIES))
> - ++ret;
> - dev_priv->uncore.fifo_count = fifo;
> }
> - dev_priv->uncore.fifo_count--;
Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
More information about the Intel-gfx
mailing list