aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/msm/msm_submitqueue.c
diff options
context:
space:
mode:
authorJordan Crouse <jcrouse@codeaurora.org>2017-10-20 13:06:57 -0400
committerRob Clark <robdclark@gmail.com>2017-10-28 11:01:36 -0400
commitf97decac5f4c2d862e5b848694e3ffb29fc8acdd (patch)
tree1967285c12465308cd47769a43326db9506ca0d8 /drivers/gpu/drm/msm/msm_submitqueue.c
parentcd414f3d931687eb1ebeb87533d85537e315f195 (diff)
drm/msm: Support multiple ringbuffers
Add the infrastructure to support the idea of multiple ringbuffers. Assign each ringbuffer an id and use that as an index for the various ring specific operations. The biggest delta is to support legacy fences. Each fence gets its own sequence number but the legacy functions expect to use a unique integer. To handle this we return a unique identifier for each submission but map it to a specific ring/sequence under the covers. Newer users use a dma_fence pointer anyway so they don't care about the actual sequence ID or ring. The actual mechanics for multiple ringbuffers are very target specific so this code just allows for the possibility but still only defines one ringbuffer for each target family. Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org> Signed-off-by: Rob Clark <robdclark@gmail.com>
Diffstat (limited to 'drivers/gpu/drm/msm/msm_submitqueue.c')
-rw-r--r--drivers/gpu/drm/msm/msm_submitqueue.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/drivers/gpu/drm/msm/msm_submitqueue.c b/drivers/gpu/drm/msm/msm_submitqueue.c
index 593c3b5f44cd..5115f75b5b7f 100644
--- a/drivers/gpu/drm/msm/msm_submitqueue.c
+++ b/drivers/gpu/drm/msm/msm_submitqueue.c
@@ -60,9 +60,10 @@ void msm_submitqueue_close(struct msm_file_private *ctx)
60 msm_submitqueue_put(entry); 60 msm_submitqueue_put(entry);
61} 61}
62 62
63int msm_submitqueue_create(struct msm_file_private *ctx, u32 prio, u32 flags, 63int msm_submitqueue_create(struct drm_device *drm, struct msm_file_private *ctx,
64 u32 *id) 64 u32 prio, u32 flags, u32 *id)
65{ 65{
66 struct msm_drm_private *priv = drm->dev_private;
66 struct msm_gpu_submitqueue *queue; 67 struct msm_gpu_submitqueue *queue;
67 68
68 if (!ctx) 69 if (!ctx)
@@ -75,7 +76,13 @@ int msm_submitqueue_create(struct msm_file_private *ctx, u32 prio, u32 flags,
75 76
76 kref_init(&queue->ref); 77 kref_init(&queue->ref);
77 queue->flags = flags; 78 queue->flags = flags;
78 queue->prio = prio; 79
80 if (priv->gpu) {
81 if (prio >= priv->gpu->nr_rings)
82 return -EINVAL;
83
84 queue->prio = prio;
85 }
79 86
80 write_lock(&ctx->queuelock); 87 write_lock(&ctx->queuelock);
81 88
@@ -91,16 +98,26 @@ int msm_submitqueue_create(struct msm_file_private *ctx, u32 prio, u32 flags,
91 return 0; 98 return 0;
92} 99}
93 100
94int msm_submitqueue_init(struct msm_file_private *ctx) 101int msm_submitqueue_init(struct drm_device *drm, struct msm_file_private *ctx)
95{ 102{
103 struct msm_drm_private *priv = drm->dev_private;
104 int default_prio;
105
96 if (!ctx) 106 if (!ctx)
97 return 0; 107 return 0;
98 108
109 /*
110 * Select priority 2 as the "default priority" unless nr_rings is less
111 * than 2 and then pick the lowest pirority
112 */
113 default_prio = priv->gpu ?
114 clamp_t(uint32_t, 2, 0, priv->gpu->nr_rings - 1) : 0;
115
99 INIT_LIST_HEAD(&ctx->submitqueues); 116 INIT_LIST_HEAD(&ctx->submitqueues);
100 117
101 rwlock_init(&ctx->queuelock); 118 rwlock_init(&ctx->queuelock);
102 119
103 return msm_submitqueue_create(ctx, 2, 0, NULL); 120 return msm_submitqueue_create(drm, ctx, default_prio, 0, NULL);
104} 121}
105 122
106int msm_submitqueue_remove(struct msm_file_private *ctx, u32 id) 123int msm_submitqueue_remove(struct msm_file_private *ctx, u32 id)