diff options
author | Rob Clark <robdclark@gmail.com> | 2016-06-01 14:17:40 -0400 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2016-07-16 10:09:08 -0400 |
commit | 6b597ce2f7c7a0f8116d753902db9aba6bc05cb0 (patch) | |
tree | 943de060a406f368d6ad48ae464e5a9ae532699c /drivers/gpu/drm/msm | |
parent | e1e9db2ca79575b8d6b4b5891194bb29c630c42d (diff) |
drm/msm: deal with arbitrary # of cmd buffers
For some optimizations coming on the userspace side, splitting larger
draw or gmem cmds into multiple cmdstream buffers, we need to support
much more than the previous small/arbitrary limit.
Signed-off-by: Rob Clark <robdclark@gmail.com>
Diffstat (limited to 'drivers/gpu/drm/msm')
-rw-r--r-- | drivers/gpu/drm/msm/adreno/adreno_gpu.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/msm_gem.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/msm_gem_submit.c | 11 |
3 files changed, 8 insertions, 18 deletions
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c index 7dfe22ea2920..f386f463278d 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c | |||
@@ -139,7 +139,7 @@ void adreno_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit, | |||
139 | struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); | 139 | struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); |
140 | struct msm_drm_private *priv = gpu->dev->dev_private; | 140 | struct msm_drm_private *priv = gpu->dev->dev_private; |
141 | struct msm_ringbuffer *ring = gpu->rb; | 141 | struct msm_ringbuffer *ring = gpu->rb; |
142 | unsigned i, ibs = 0; | 142 | unsigned i; |
143 | 143 | ||
144 | for (i = 0; i < submit->nr_cmds; i++) { | 144 | for (i = 0; i < submit->nr_cmds; i++) { |
145 | switch (submit->cmd[i].type) { | 145 | switch (submit->cmd[i].type) { |
@@ -155,18 +155,11 @@ void adreno_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit, | |||
155 | CP_INDIRECT_BUFFER_PFE : CP_INDIRECT_BUFFER_PFD, 2); | 155 | CP_INDIRECT_BUFFER_PFE : CP_INDIRECT_BUFFER_PFD, 2); |
156 | OUT_RING(ring, submit->cmd[i].iova); | 156 | OUT_RING(ring, submit->cmd[i].iova); |
157 | OUT_RING(ring, submit->cmd[i].size); | 157 | OUT_RING(ring, submit->cmd[i].size); |
158 | ibs++; | 158 | OUT_PKT2(ring); |
159 | break; | 159 | break; |
160 | } | 160 | } |
161 | } | 161 | } |
162 | 162 | ||
163 | /* on a320, at least, we seem to need to pad things out to an | ||
164 | * even number of qwords to avoid issue w/ CP hanging on wrap- | ||
165 | * around: | ||
166 | */ | ||
167 | if (ibs % 2) | ||
168 | OUT_PKT2(ring); | ||
169 | |||
170 | OUT_PKT0(ring, REG_AXXX_CP_SCRATCH_REG2, 1); | 163 | OUT_PKT0(ring, REG_AXXX_CP_SCRATCH_REG2, 1); |
171 | OUT_RING(ring, submit->fence->seqno); | 164 | OUT_RING(ring, submit->fence->seqno); |
172 | 165 | ||
diff --git a/drivers/gpu/drm/msm/msm_gem.h b/drivers/gpu/drm/msm/msm_gem.h index 7a4da819731a..b2f13cfe945e 100644 --- a/drivers/gpu/drm/msm/msm_gem.h +++ b/drivers/gpu/drm/msm/msm_gem.h | |||
@@ -93,8 +93,6 @@ static inline bool is_vunmapable(struct msm_gem_object *msm_obj) | |||
93 | return (msm_obj->vmap_count == 0) && msm_obj->vaddr; | 93 | return (msm_obj->vmap_count == 0) && msm_obj->vaddr; |
94 | } | 94 | } |
95 | 95 | ||
96 | #define MAX_CMDS 4 | ||
97 | |||
98 | /* Created per submit-ioctl, to track bo's and cmdstream bufs, etc, | 96 | /* Created per submit-ioctl, to track bo's and cmdstream bufs, etc, |
99 | * associated with the cmdstream submission for synchronization (and | 97 | * associated with the cmdstream submission for synchronization (and |
100 | * make it easier to unwind when things go wrong, etc). This only | 98 | * make it easier to unwind when things go wrong, etc). This only |
@@ -116,7 +114,7 @@ struct msm_gem_submit { | |||
116 | uint32_t size; /* in dwords */ | 114 | uint32_t size; /* in dwords */ |
117 | uint32_t iova; | 115 | uint32_t iova; |
118 | uint32_t idx; /* cmdstream buffer idx in bos[] */ | 116 | uint32_t idx; /* cmdstream buffer idx in bos[] */ |
119 | } cmd[MAX_CMDS]; | 117 | } *cmd; /* array of size nr_cmds */ |
120 | struct { | 118 | struct { |
121 | uint32_t flags; | 119 | uint32_t flags; |
122 | struct msm_gem_object *obj; | 120 | struct msm_gem_object *obj; |
diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index 736f15881b6a..9766f9ae4b7d 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c | |||
@@ -29,10 +29,11 @@ | |||
29 | #define BO_PINNED 0x2000 | 29 | #define BO_PINNED 0x2000 |
30 | 30 | ||
31 | static struct msm_gem_submit *submit_create(struct drm_device *dev, | 31 | static struct msm_gem_submit *submit_create(struct drm_device *dev, |
32 | struct msm_gpu *gpu, int nr) | 32 | struct msm_gpu *gpu, int nr_bos, int nr_cmds) |
33 | { | 33 | { |
34 | struct msm_gem_submit *submit; | 34 | struct msm_gem_submit *submit; |
35 | int sz = sizeof(*submit) + (nr * sizeof(submit->bos[0])); | 35 | int sz = sizeof(*submit) + (nr_bos * sizeof(submit->bos[0])) + |
36 | (nr_cmds * sizeof(*submit->cmd)); | ||
36 | 37 | ||
37 | submit = kmalloc(sz, GFP_TEMPORARY | __GFP_NOWARN | __GFP_NORETRY); | 38 | submit = kmalloc(sz, GFP_TEMPORARY | __GFP_NOWARN | __GFP_NORETRY); |
38 | if (!submit) | 39 | if (!submit) |
@@ -42,6 +43,7 @@ static struct msm_gem_submit *submit_create(struct drm_device *dev, | |||
42 | submit->gpu = gpu; | 43 | submit->gpu = gpu; |
43 | submit->fence = NULL; | 44 | submit->fence = NULL; |
44 | submit->pid = get_pid(task_pid(current)); | 45 | submit->pid = get_pid(task_pid(current)); |
46 | submit->cmd = (void *)&submit->bos[nr_bos]; | ||
45 | 47 | ||
46 | /* initially, until copy_from_user() and bo lookup succeeds: */ | 48 | /* initially, until copy_from_user() and bo lookup succeeds: */ |
47 | submit->nr_bos = 0; | 49 | submit->nr_bos = 0; |
@@ -371,14 +373,11 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, | |||
371 | if (args->pipe != MSM_PIPE_3D0) | 373 | if (args->pipe != MSM_PIPE_3D0) |
372 | return -EINVAL; | 374 | return -EINVAL; |
373 | 375 | ||
374 | if (args->nr_cmds > MAX_CMDS) | ||
375 | return -EINVAL; | ||
376 | |||
377 | ret = mutex_lock_interruptible(&dev->struct_mutex); | 376 | ret = mutex_lock_interruptible(&dev->struct_mutex); |
378 | if (ret) | 377 | if (ret) |
379 | return ret; | 378 | return ret; |
380 | 379 | ||
381 | submit = submit_create(dev, gpu, args->nr_bos); | 380 | submit = submit_create(dev, gpu, args->nr_bos, args->nr_cmds); |
382 | if (!submit) { | 381 | if (!submit) { |
383 | ret = -ENOMEM; | 382 | ret = -ENOMEM; |
384 | goto out_unlock; | 383 | goto out_unlock; |