From: Jordan Crouse <jcrouse@codeaurora.org>
To: freedreno@lists.freedesktop.org
Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org
Subject: [PATCH 11/13] drm/msm: Shadow current pointer in the ring until command is complete
Date: Mon, 8 May 2017 14:35:07 -0600 [thread overview]
Message-ID: <1494275709-25782-12-git-send-email-jcrouse@codeaurora.org> (raw)
In-Reply-To: <1494275709-25782-1-git-send-email-jcrouse@codeaurora.org>
Add a shadow pointer to track the current command being written into
the ring. Don't commit it as 'cur' until the command is submitted.
Because 'cur' is used to construct the software copy of the wptr this
ensures that somebody peeking in on the ring doesn't assume that a
command is inflight while it is being written. This isn't a huge deal
with a single ring (though technically the hangcheck could assume
the system is prematurely busy when it isn't) but it will be rather
important for preemption where the decision to preempt is based
on a non-empty ringbuffer. Without a shadow an aggressive preemption
scheme could assume that the ringbuffer is non empty and switch to it
before the CPU is done writing the command and boom.
Even though preemption won't be supported for all targets because of
the way the code is organized it is simpler to make this generic for
all targets. The extra load for non-preemption targets should be
minimal.
Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
---
drivers/gpu/drm/msm/adreno/adreno_gpu.c | 9 +++++++--
drivers/gpu/drm/msm/msm_ringbuffer.c | 1 +
drivers/gpu/drm/msm/msm_ringbuffer.h | 12 ++++++++----
3 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
index 6b7114d..00f8436 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
@@ -79,6 +79,7 @@ int adreno_hw_init(struct msm_gpu *gpu)
}
ring->cur = ring->start;
+ ring->next = ring->start;
/* reset completed fence seqno: */
adreno_gpu->memptrs->fence[ring->id] = ring->completed_fence;
@@ -239,12 +240,15 @@ void adreno_flush(struct msm_gpu *gpu, struct msm_ringbuffer *ring)
struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
uint32_t wptr;
+ /* Copy the shadow to the actual register */
+ ring->cur = ring->next;
+
/*
* Mask wptr value that we calculate to fit in the HW range. This is
* to account for the possibility that the last command fit exactly into
* the ringbuffer and rb->next hasn't wrapped to zero yet
*/
- wptr = get_wptr(ring) % (MSM_GPU_RINGBUFFER_SZ >> 2);
+ wptr = (ring->cur - ring->start) % (MSM_GPU_RINGBUFFER_SZ >> 2);
/* ensure writes to ringbuffer have hit system memory: */
mb();
@@ -357,7 +361,8 @@ static uint32_t ring_freewords(struct msm_ringbuffer *ring)
{
struct adreno_gpu *adreno_gpu = to_adreno_gpu(ring->gpu);
uint32_t size = MSM_GPU_RINGBUFFER_SZ >> 2;
- uint32_t wptr = get_wptr(ring);
+ /* Use ring->next to calculate free size */
+ uint32_t wptr = ring->next - ring->start;
uint32_t rptr = get_rptr(adreno_gpu, ring);
return (rptr + (size - 1) - wptr) % size;
}
diff --git a/drivers/gpu/drm/msm/msm_ringbuffer.c b/drivers/gpu/drm/msm/msm_ringbuffer.c
index 10f1d948..c5b21cf 100644
--- a/drivers/gpu/drm/msm/msm_ringbuffer.c
+++ b/drivers/gpu/drm/msm/msm_ringbuffer.c
@@ -47,6 +47,7 @@ struct msm_ringbuffer *msm_ringbuffer_new(struct msm_gpu *gpu, int id)
goto fail;
}
ring->end = ring->start + (MSM_GPU_RINGBUFFER_SZ >> 2);
+ ring->next = ring->start;
ring->cur = ring->start;
INIT_LIST_HEAD(&ring->submits);
diff --git a/drivers/gpu/drm/msm/msm_ringbuffer.h b/drivers/gpu/drm/msm/msm_ringbuffer.h
index c803364..0dafe00 100644
--- a/drivers/gpu/drm/msm/msm_ringbuffer.h
+++ b/drivers/gpu/drm/msm/msm_ringbuffer.h
@@ -24,7 +24,7 @@ struct msm_ringbuffer {
struct msm_gpu *gpu;
int id;
struct drm_gem_object *bo;
- uint32_t *start, *end, *cur;
+ uint32_t *start, *end, *cur, *next;
uint64_t iova;
/* last_fence == completed_fence --> no pending work */
uint32_t last_fence;
@@ -40,9 +40,13 @@ struct msm_ringbuffer {
static inline void
OUT_RING(struct msm_ringbuffer *ring, uint32_t data)
{
- if (ring->cur == ring->end)
- ring->cur = ring->start;
- *(ring->cur++) = data;
+ /*
+ * ring->next points to the current command being written - it won't be
+ * committed as ring->cur until the flush
+ */
+ if (ring->next == ring->end)
+ ring->next = ring->start;
+ *(ring->next++) = data;
}
#endif /* __MSM_RINGBUFFER_H__ */
--
1.9.1
next prev parent reply other threads:[~2017-05-08 20:35 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-08 20:34 [PATCH 00/13] Adreno code for 4.13 Jordan Crouse
2017-05-08 20:34 ` [PATCH 01/13] drm/msm: Take the mutex before calling msm_gem_new_impl Jordan Crouse
2017-05-08 20:39 ` [Freedreno] " Rob Clark
2017-05-08 20:34 ` [PATCH 02/13] drm/msm: Fix the check for the command size Jordan Crouse
2017-05-08 20:34 ` [PATCH 03/13] drm/msm: Remove DRM_MSM_NUM_IOCTLS Jordan Crouse
2017-05-08 20:35 ` [PATCH 04/13] drm/msm: Remove idle function hook Jordan Crouse
2017-05-08 20:35 ` [PATCH 05/13] drm/msm: Add hint to DRM_IOCTL_MSM_GEM_INFO to return an object IOVA Jordan Crouse
2017-05-08 20:35 ` [PATCH 06/13] drm/msm: get an iova from the address space instead of an id Jordan Crouse
2017-05-08 20:35 ` [PATCH 07/13] drm/msm: Add a struct to pass configuration to msm_gpu_init() Jordan Crouse
2017-05-08 20:35 ` [PATCH 08/13] drm/msm: Remove memptrs->wptr Jordan Crouse
2017-05-08 20:35 ` [PATCH 09/13] drm/msm: Add drawqueues Jordan Crouse
2017-05-08 20:35 ` [PATCH 10/13] drm/msm: Support multiple ringbuffers Jordan Crouse
2017-05-25 17:25 ` Jordan Crouse
2017-05-25 17:37 ` [Freedreno] " Rob Clark
[not found] ` <1494275709-25782-11-git-send-email-jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2017-05-28 13:43 ` Rob Clark
[not found] ` <CAF6AEGtiw4yBEZyDhLrQhCFPHVPi9ukD4MkKfkT0_AvTtCeCfg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2017-05-30 16:20 ` Jordan Crouse
2017-05-30 16:34 ` [Freedreno] " Alex Deucher
2017-05-31 7:21 ` Daniel Vetter
2017-05-08 20:35 ` Jordan Crouse [this message]
[not found] ` <1494275709-25782-1-git-send-email-jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2017-05-08 20:35 ` [PATCH 12/13] drm/msm: Make the value of RB_CNTL (almost) generic Jordan Crouse
2017-05-08 20:35 ` [PATCH 13/13] drm/msm: Implement preemption for A5XX targets 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=1494275709-25782-12-git-send-email-jcrouse@codeaurora.org \
--to=jcrouse@codeaurora.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=freedreno@lists.freedesktop.org \
--cc=linux-arm-msm@vger.kernel.org \
/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;
as well as URLs for NNTP newsgroup(s).