From: kiran.padwal@smartplayin.com
To: "Ganesan, Aravind" <aravindg@codeaurora.org>
Cc: freedreno@lists.freedesktop.org, Rob Clark <robdclark@gmail.com>,
dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org,
Jordan Crouse <jcrouse@codeaurora.org>,
rishib@quicinc.com
Subject: RE: [PATCH] drm/msm: Don't split an IB at the end of ring buffer.
Date: Tue, 18 Nov 2014 02:39:13 -0500 (EST) [thread overview]
Message-ID: <1416296353.90437022@apps.rackspace.com> (raw)
In-Reply-To: <5452F4F5.6000705@codeaurora.org>
Hi Ganesan,
On Thursday, October 30, 2014 10:33pm, "Ganesan, Aravind" <aravindg@codeaurora.org> said:
> Splitting the command sequence for an IB1 submission at the end of
> the ring buffer can hang the GPU. To fix this, if there isn't
> enough contiguous space at the end to fit the full command sequence,
> insert NOPs at the end, and write the sequence at the start, as space
> becomes available.
>
> Signed-off-by: Aravind Ganesan <aravindg@codeaurora.org>
> ---
> Resend in patch-set format and with dri-devel@lists.freedesktop.org on
> the CC.
> drivers/gpu/drm/msm/adreno/adreno_gpu.c | 45
> ++++++++++++++++++++++++++++++---
> drivers/gpu/drm/msm/adreno/adreno_gpu.h | 8 +++---
> 2 files changed, 46 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
> b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
> index 1fe7c8d..51901df 100644
> --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
> +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
> @@ -281,10 +281,49 @@ static uint32_t ring_freewords(struct msm_gpu *gpu)
> return (rptr + (size - 1) - wptr) % size;
> }
>
> -void adreno_wait_ring(struct msm_gpu *gpu, uint32_t ndwords)
> +void adreno_wait_ring_contiguous(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);
> + struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
> + uint32_t size = gpu->rb->size/4;
> + uint32_t wptr;
> + uint32_t rptr;
> +
> + /* Wait for free space and then check if they are contiguous */
> + if(spin_until(ring_freewords(gpu)>= ndwords)){
There are some checkpatch errors,
ERROR: spaces required around that '>=' (ctx:VxW)
#42: FILE: drivers/gpu/drm/msm/adreno/adreno_gpu.c:293:
+ if(spin_until(ring_freewords(gpu)>= ndwords)){
^
ERROR: space required before the open brace '{'
#42: FILE: drivers/gpu/drm/msm/adreno/adreno_gpu.c:293:
+ if(spin_until(ring_freewords(gpu)>= ndwords)){
ERROR: space required before the open parenthesis '('
#42: FILE: drivers/gpu/drm/msm/adreno/adreno_gpu.c:293:
+ if(spin_until(ring_freewords(gpu)>= ndwords)){
> + DRM_ERROR("%s: timeout waiting for ringbuffer space\n",
> + gpu->name);
> + return;
> + }
> +
> + wptr = get_wptr(gpu->rb);
> + rptr = adreno_gpu->memptrs->rptr;
> +
> + /* We have enough space in the ring for ndwords. Three conditions
> + * indicates we have contigous space:
> + * (1) wptr can be equal to size, ring has wrapped and wptr is 0
> + * (see OUT_RING), meaning we have enough space.
> + * (2) We have enough space in the ring, wptr < rptr indicates
> + * enough contiguous space
> + * (3) wptr + ndwords < size - 1 implies enough space in the ring.
> + */
> + if((wptr == size) || (wptr < rptr) || (wptr + ndwords < size - 1))
ERROR: space required before the open parenthesis '('
#59: FILE: drivers/gpu/drm/msm/adreno/adreno_gpu.c:310:
+ if((wptr == size) || (wptr < rptr) || (wptr + ndwords < size - 1))
> + return;
> +
> + /* Fill the end of ring with no-ops
> + * */
> + OUT_RING(gpu->rb, CP_TYPE3_PKT | (((size - wptr - 1) - 1) << 16) |
> + ((CP_NOP & 0xFF) << 8));
> + gpu->rb->cur = gpu->rb->start;
> +
> + /* We have reset cur pointer to start. If ring_freewords returns
> + * greater than ndwords, then we have contigous space.
> + * */
> + if(spin_until(ring_freewords(gpu)>= ndwords)){
ERROR: spaces required around that '>=' (ctx:VxW)
#71: FILE: drivers/gpu/drm/msm/adreno/adreno_gpu.c:322:
+ if(spin_until(ring_freewords(gpu)>= ndwords)){
^
ERROR: space required before the open brace '{'
#71: FILE: drivers/gpu/drm/msm/adreno/adreno_gpu.c:322:
+ if(spin_until(ring_freewords(gpu)>= ndwords)){
ERROR: space required before the open parenthesis '('
#71: FILE: drivers/gpu/drm/msm/adreno/adreno_gpu.c:322:
+ if(spin_until(ring_freewords(gpu)>= ndwords)){
> + DRM_ERROR("%s: timeout waiting for ringbuffer space\n",
> + gpu->name);
> + return;
> + }
> }
>
> 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 3fa06b3..47ba8f5 100644
> --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h
> +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
> @@ -247,7 +247,7 @@ void adreno_idle(struct msm_gpu *gpu);
> void adreno_show(struct msm_gpu *gpu, struct seq_file *m);
> #endif
> void adreno_dump(struct msm_gpu *gpu);
> -void adreno_wait_ring(struct msm_gpu *gpu, uint32_t ndwords);
> +void adreno_wait_ring_contiguous(struct msm_gpu *gpu, uint32_t ndwords);
>
> int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
> struct adreno_gpu *gpu, const struct adreno_gpu_funcs *funcs);
> @@ -259,7 +259,7 @@ void adreno_gpu_cleanup(struct adreno_gpu *gpu);
> static inline void
> OUT_PKT0(struct msm_ringbuffer *ring, uint16_t regindx, uint16_t cnt)
> {
> - adreno_wait_ring(ring->gpu, cnt+1);
> + adreno_wait_ring_contiguous(ring->gpu, cnt+1);
> OUT_RING(ring, CP_TYPE0_PKT | ((cnt-1) << 16) | (regindx & 0x7FFF));
> }
>
> @@ -267,14 +267,14 @@ OUT_PKT0(struct msm_ringbuffer *ring, uint16_t
> regindx, uint16_t cnt)
ERROR: patch seems to be corrupt (line wrapped?)
#103: FILE: drivers/gpu/drm/msm/adreno/adreno_gpu.h:266:
regindx, uint16_t cnt)
Thanks,
--Kiran
> static inline void
> OUT_PKT2(struct msm_ringbuffer *ring)
> {
> - adreno_wait_ring(ring->gpu, 1);
> + adreno_wait_ring_contiguous(ring->gpu, 1);
> OUT_RING(ring, CP_TYPE2_PKT);
> }
>
> static inline void
> OUT_PKT3(struct msm_ringbuffer *ring, uint8_t opcode, uint16_t cnt)
> {
> - adreno_wait_ring(ring->gpu, cnt+1);
> + adreno_wait_ring_contiguous(ring->gpu, cnt+1);
> OUT_RING(ring, CP_TYPE3_PKT | ((cnt-1) << 16) | ((opcode & 0xFF) << 8));
> }
>
> --
> 1.8.5.2
>
> --
> Qualcomm Innovation Center, Inc.
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> a Linux Foundation Collaborative Project
> --
> To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
prev parent reply other threads:[~2014-11-18 7:39 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-31 2:33 [PATCH] drm/msm: Don't split an IB at the end of ring buffer Ganesan, Aravind
2014-11-18 7:39 ` kiran.padwal [this message]
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=1416296353.90437022@apps.rackspace.com \
--to=kiran.padwal@smartplayin.com \
--cc=aravindg@codeaurora.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=freedreno@lists.freedesktop.org \
--cc=jcrouse@codeaurora.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=rishib@quicinc.com \
--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