From: Jordan Crouse <jcrouse@codeaurora.org>
To: Rob Clark <robdclark@gmail.com>
Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org
Subject: Re: [PATCH 3/7] drm/msm: spin helper
Date: Mon, 10 Mar 2014 14:27:25 -0600 [thread overview]
Message-ID: <531E202D.9070701@codeaurora.org> (raw)
In-Reply-To: <1394470062-27442-4-git-send-email-robdclark@gmail.com>
On 03/10/2014 10:47 AM, Rob Clark wrote:
> Helper macro to simplify places where we need to poll with timeout
> waiting for gpu.
>
> Signed-off-by: Rob Clark <robdclark@gmail.com>
Acked-by: Jordan Crouse <jcrouse@codeaurora.org>
> ---
> drivers/gpu/drm/msm/adreno/a3xx_gpu.c | 14 +++--------
> drivers/gpu/drm/msm/adreno/adreno_gpu.c | 41 ++++++++++++---------------------
> drivers/gpu/drm/msm/adreno/adreno_gpu.h | 15 +++++++++++-
> 3 files changed, 32 insertions(+), 38 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c
> index 8b6fb84..59ed762 100644
> --- a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c
> +++ b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c
> @@ -326,21 +326,13 @@ static void a3xx_destroy(struct msm_gpu *gpu)
>
> static void a3xx_idle(struct msm_gpu *gpu)
> {
> - unsigned long t;
> -
> /* wait for ringbuffer to drain: */
> adreno_idle(gpu);
>
> - t = jiffies + ADRENO_IDLE_TIMEOUT;
> -
> /* then wait for GPU to finish: */
> - do {
> - uint32_t rbbm_status = gpu_read(gpu, REG_A3XX_RBBM_STATUS);
> - if (!(rbbm_status & A3XX_RBBM_STATUS_GPU_BUSY))
> - return;
> - } while(time_before(jiffies, t));
> -
> - DRM_ERROR("timeout waiting for %s to idle!\n", gpu->name);
> + if (spin_until(!(gpu_read(gpu, REG_A3XX_RBBM_STATUS) &
> + A3XX_RBBM_STATUS_GPU_BUSY)))
> + DRM_ERROR("%s: timeout waiting for GPU to idle!\n", gpu->name);
>
> /* TODO maybe we need to reset GPU here to recover from hang? */
> }
> diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
> index cf6eb97..7a11563 100644
> --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
> +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
> @@ -225,19 +225,11 @@ void adreno_flush(struct msm_gpu *gpu)
> void adreno_idle(struct msm_gpu *gpu)
> {
> struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
> - uint32_t rptr, wptr = get_wptr(gpu->rb);
> - unsigned long t;
> -
> - t = jiffies + ADRENO_IDLE_TIMEOUT;
> -
> - /* then wait for CP to drain ringbuffer: */
> - do {
> - rptr = adreno_gpu->memptrs->rptr;
> - if (rptr == wptr)
> - return;
> - } while(time_before(jiffies, t));
> + uint32_t wptr = get_wptr(gpu->rb);
>
> - DRM_ERROR("%s: timeout waiting to drain ringbuffer!\n", gpu->name);
> + /* wait for CP to drain ringbuffer: */
> + if (spin_until(adreno_gpu->memptrs->rptr == wptr))
> + DRM_ERROR("%s: timeout waiting to drain ringbuffer!\n", gpu->name);
>
> /* TODO maybe we need to reset GPU here to recover from hang? */
> }
> @@ -278,22 +270,19 @@ void adreno_dump(struct msm_gpu *gpu)
>
> }
>
> -void adreno_wait_ring(struct msm_gpu *gpu, uint32_t ndwords)
> +static uint32_t ring_freewords(struct msm_gpu *gpu)
> {
> struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
> - uint32_t freedwords;
> - unsigned long t = jiffies + ADRENO_IDLE_TIMEOUT;
> - do {
> - uint32_t size = gpu->rb->size / 4;
> - uint32_t wptr = get_wptr(gpu->rb);
> - uint32_t rptr = adreno_gpu->memptrs->rptr;
> - freedwords = (rptr + (size - 1) - wptr) % size;
> -
> - if (time_after(jiffies, t)) {
> - DRM_ERROR("%s: timeout waiting for ringbuffer space\n", gpu->name);
> - break;
> - }
> - } while(freedwords < ndwords);
> + uint32_t size = gpu->rb->size / 4;
> + uint32_t wptr = get_wptr(gpu->rb);
> + uint32_t rptr = adreno_gpu->memptrs->rptr;
> + return (rptr + (size - 1) - wptr) % size;
> +}
> +
> +void adreno_wait_ring(struct msm_gpu *gpu, uint32_t ndwords)
> +{
> + if (spin_until(ring_freewords(gpu) >= ndwords))
> + DRM_ERROR("%s: timeout waiting for ringbuffer space\n", gpu->name);
> }
>
> static const char *iommu_ports[] = {
> diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.h b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
> index e16200d..63c36ce 100644
> --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h
> +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
> @@ -76,7 +76,20 @@ struct adreno_platform_config {
> #endif
> };
>
> -#define ADRENO_IDLE_TIMEOUT (20 * 1000)
> +#define ADRENO_IDLE_TIMEOUT msecs_to_jiffies(1000)
> +
> +#define spin_until(X) ({ \
> + int __ret = -ETIMEDOUT; \
> + unsigned long __t = jiffies + ADRENO_IDLE_TIMEOUT; \
> + do { \
> + if (X) { \
> + __ret = 0; \
> + break; \
> + } \
> + } while (time_before(jiffies, __t)); \
> + __ret; \
> +})
> +
>
> static inline bool adreno_is_a3xx(struct adreno_gpu *gpu)
> {
>
--
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
next prev parent reply other threads:[~2014-03-10 20:27 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-10 16:47 [PATCH 0/7] drm/msm: what's in store for 3.15 Rob Clark
2014-03-10 16:47 ` [PATCH 1/7] drm/msm: hdmi audio support Rob Clark
2014-03-10 16:47 ` [PATCH 2/7] drm/msm: add hang_debug module param Rob Clark
2014-03-10 20:17 ` Jordan Crouse
2014-03-10 20:27 ` Rob Clark
2014-03-10 16:47 ` [PATCH 3/7] drm/msm: spin helper Rob Clark
2014-03-10 20:27 ` Jordan Crouse [this message]
2014-03-10 16:47 ` [PATCH 4/7] drm/msm: crank down gpu when inactive Rob Clark
2014-03-10 20:24 ` Jordan Crouse
2014-03-10 20:39 ` Rob Clark
2014-03-10 16:47 ` [PATCH 5/7] drm/msm: add chip-id param Rob Clark
2014-03-10 20:20 ` Jordan Crouse
2014-03-10 16:47 ` [PATCH 6/7] drm/msm: use componentised device support Rob Clark
2014-03-10 16:47 ` [PATCH 7/7] drm/msm: validate flags, etc Rob Clark
2014-03-10 20:22 ` Jordan Crouse
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=531E202D.9070701@codeaurora.org \
--to=jcrouse@codeaurora.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=robdclark@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox