aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Clark2015-07-21 11:11:36 -0500
committerRob Clark2015-08-17 09:10:34 -0500
commit2fa58ef8f43b41a6d12396ff637f09860665072f (patch)
treeb86486d7e0a8f309586789eb6732bff6fb477016 /freedreno/msm/msm_ringbuffer.c
parent2a34176123b1dbf55d129248a431afb185e6a37c (diff)
downloadexternal-libdrm-2fa58ef8f43b41a6d12396ff637f09860665072f.tar.gz
external-libdrm-2fa58ef8f43b41a6d12396ff637f09860665072f.tar.xz
external-libdrm-2fa58ef8f43b41a6d12396ff637f09860665072f.zip
freedreno/msm: reorg ringbuffer struct
Group the parts related to building out submit ioctl into their own sub-struct. Split out from next commit since it is just boring churn. Signed-off-by: Rob Clark <robclark@freedesktop.org>
Diffstat (limited to 'freedreno/msm/msm_ringbuffer.c')
-rw-r--r--freedreno/msm/msm_ringbuffer.c83
1 files changed, 44 insertions, 39 deletions
diff --git a/freedreno/msm/msm_ringbuffer.c b/freedreno/msm/msm_ringbuffer.c
index 6ee85bdd..2798c3fd 100644
--- a/freedreno/msm/msm_ringbuffer.c
+++ b/freedreno/msm/msm_ringbuffer.c
@@ -41,19 +41,24 @@ struct msm_ringbuffer {
41 41
42 struct list_head submit_list; 42 struct list_head submit_list;
43 43
44 /* bo's table: */ 44 /* submit ioctl related tables: */
45 struct drm_msm_gem_submit_bo *bos; 45 struct {
46 uint32_t nr_bos, max_bos; 46 /* bo's table: */
47 47 struct drm_msm_gem_submit_bo *bos;
48 /* cmd's table: */ 48 uint32_t nr_bos, max_bos;
49 struct drm_msm_gem_submit_cmd *cmds; 49
50 uint32_t nr_cmds, max_cmds; 50 /* cmd's table: */
51 struct drm_msm_gem_submit_cmd *cmds;
52 uint32_t nr_cmds, max_cmds;
53
54 /* reloc's table: */
55 struct drm_msm_gem_submit_reloc *relocs;
56 uint32_t nr_relocs, max_relocs;
57 } submit;
58
59 /* should have matching entries in submit.cmds: */
51 struct fd_ringbuffer **rings; 60 struct fd_ringbuffer **rings;
52 uint32_t nr_rings, max_rings; 61 uint32_t nr_rings, max_rings;
53
54 /* reloc's table: */
55 struct drm_msm_gem_submit_reloc *relocs;
56 uint32_t nr_relocs, max_relocs;
57}; 62};
58 63
59static void *grow(void *ptr, uint32_t nr, uint32_t *max, uint32_t sz) 64static void *grow(void *ptr, uint32_t nr, uint32_t *max, uint32_t sz)
@@ -87,10 +92,10 @@ static uint32_t bo2idx(struct fd_ringbuffer *ring, struct fd_bo *bo, uint32_t fl
87 uint32_t idx; 92 uint32_t idx;
88 if (!msm_bo->indexp1[id]) { 93 if (!msm_bo->indexp1[id]) {
89 struct list_head *list = &msm_bo->list[id]; 94 struct list_head *list = &msm_bo->list[id];
90 idx = APPEND(msm_ring, bos); 95 idx = APPEND(&msm_ring->submit, bos);
91 msm_ring->bos[idx].flags = 0; 96 msm_ring->submit.bos[idx].flags = 0;
92 msm_ring->bos[idx].handle = bo->handle; 97 msm_ring->submit.bos[idx].handle = bo->handle;
93 msm_ring->bos[idx].presumed = msm_bo->presumed; 98 msm_ring->submit.bos[idx].presumed = msm_bo->presumed;
94 msm_bo->indexp1[id] = idx + 1; 99 msm_bo->indexp1[id] = idx + 1;
95 100
96 assert(LIST_IS_EMPTY(list)); 101 assert(LIST_IS_EMPTY(list));
@@ -100,9 +105,9 @@ static uint32_t bo2idx(struct fd_ringbuffer *ring, struct fd_bo *bo, uint32_t fl
100 idx = msm_bo->indexp1[id] - 1; 105 idx = msm_bo->indexp1[id] - 1;
101 } 106 }
102 if (flags & FD_RELOC_READ) 107 if (flags & FD_RELOC_READ)
103 msm_ring->bos[idx].flags |= MSM_SUBMIT_BO_READ; 108 msm_ring->submit.bos[idx].flags |= MSM_SUBMIT_BO_READ;
104 if (flags & FD_RELOC_WRITE) 109 if (flags & FD_RELOC_WRITE)
105 msm_ring->bos[idx].flags |= MSM_SUBMIT_BO_WRITE; 110 msm_ring->submit.bos[idx].flags |= MSM_SUBMIT_BO_WRITE;
106 return idx; 111 return idx;
107} 112}
108 113
@@ -110,7 +115,7 @@ static int check_cmd_bo(struct fd_ringbuffer *ring,
110 struct drm_msm_gem_submit_cmd *cmd, struct fd_bo *bo) 115 struct drm_msm_gem_submit_cmd *cmd, struct fd_bo *bo)
111{ 116{
112 struct msm_ringbuffer *msm_ring = to_msm_ringbuffer(ring); 117 struct msm_ringbuffer *msm_ring = to_msm_ringbuffer(ring);
113 return msm_ring->bos[cmd->submit_idx].handle == bo->handle; 118 return msm_ring->submit.bos[cmd->submit_idx].handle == bo->handle;
114} 119}
115 120
116static uint32_t offset_bytes(void *end, void *start) 121static uint32_t offset_bytes(void *end, void *start)
@@ -127,8 +132,8 @@ static struct drm_msm_gem_submit_cmd * get_cmd(struct fd_ringbuffer *ring,
127 uint32_t i; 132 uint32_t i;
128 133
129 /* figure out if we already have a cmd buf: */ 134 /* figure out if we already have a cmd buf: */
130 for (i = 0; i < msm_ring->nr_cmds; i++) { 135 for (i = 0; i < msm_ring->submit.nr_cmds; i++) {
131 cmd = &msm_ring->cmds[i]; 136 cmd = &msm_ring->submit.cmds[i];
132 if ((cmd->submit_offset == submit_offset) && 137 if ((cmd->submit_offset == submit_offset) &&
133 (cmd->size == size) && 138 (cmd->size == size) &&
134 (cmd->type == type) && 139 (cmd->type == type) &&
@@ -139,10 +144,10 @@ static struct drm_msm_gem_submit_cmd * get_cmd(struct fd_ringbuffer *ring,
139 144
140 /* create cmd buf if not: */ 145 /* create cmd buf if not: */
141 if (!cmd) { 146 if (!cmd) {
142 uint32_t idx = APPEND(msm_ring, cmds); 147 uint32_t idx = APPEND(&msm_ring->submit, cmds);
143 APPEND(msm_ring, rings); 148 APPEND(msm_ring, rings);
144 msm_ring->rings[idx] = target_ring; 149 msm_ring->rings[idx] = target_ring;
145 cmd = &msm_ring->cmds[idx]; 150 cmd = &msm_ring->submit.cmds[idx];
146 cmd->type = type; 151 cmd->type = type;
147 cmd->submit_idx = bo2idx(ring, target_bo, FD_RELOC_READ); 152 cmd->submit_idx = bo2idx(ring, target_bo, FD_RELOC_READ);
148 cmd->submit_offset = submit_offset; 153 cmd->submit_offset = submit_offset;
@@ -165,8 +170,8 @@ static uint32_t find_next_reloc_idx(struct msm_ringbuffer *msm_ring,
165 uint32_t i; 170 uint32_t i;
166 171
167 /* a binary search would be more clever.. */ 172 /* a binary search would be more clever.. */
168 for (i = start; i < msm_ring->nr_relocs; i++) { 173 for (i = start; i < msm_ring->submit.nr_relocs; i++) {
169 struct drm_msm_gem_submit_reloc *reloc = &msm_ring->relocs[i]; 174 struct drm_msm_gem_submit_reloc *reloc = &msm_ring->submit.relocs[i];
170 if (reloc->submit_offset >= offset) 175 if (reloc->submit_offset >= offset)
171 return i; 176 return i;
172 } 177 }
@@ -180,14 +185,14 @@ static void flush_reset(struct fd_ringbuffer *ring)
180 unsigned i; 185 unsigned i;
181 186
182 /* for each of the cmd buffers, clear their reloc's: */ 187 /* for each of the cmd buffers, clear their reloc's: */
183 for (i = 0; i < msm_ring->nr_cmds; i++) { 188 for (i = 0; i < msm_ring->submit.nr_cmds; i++) {
184 struct msm_ringbuffer *target_ring = to_msm_ringbuffer(msm_ring->rings[i]); 189 struct msm_ringbuffer *target_ring = to_msm_ringbuffer(msm_ring->rings[i]);
185 target_ring->nr_relocs = 0; 190 target_ring->submit.nr_relocs = 0;
186 } 191 }
187 192
188 msm_ring->nr_relocs = 0; 193 msm_ring->submit.nr_relocs = 0;
189 msm_ring->nr_cmds = 0; 194 msm_ring->submit.nr_cmds = 0;
190 msm_ring->nr_bos = 0; 195 msm_ring->submit.nr_bos = 0;
191} 196}
192 197
193static int msm_ringbuffer_flush(struct fd_ringbuffer *ring, uint32_t *last_start) 198static int msm_ringbuffer_flush(struct fd_ringbuffer *ring, uint32_t *last_start)
@@ -207,18 +212,18 @@ static int msm_ringbuffer_flush(struct fd_ringbuffer *ring, uint32_t *last_start
207 get_cmd(ring, ring, ring_bo, submit_offset, size, MSM_SUBMIT_CMD_BUF); 212 get_cmd(ring, ring, ring_bo, submit_offset, size, MSM_SUBMIT_CMD_BUF);
208 213
209 /* needs to be after get_cmd() as that could create bos/cmds table: */ 214 /* needs to be after get_cmd() as that could create bos/cmds table: */
210 req.bos = VOID2U64(msm_ring->bos), 215 req.bos = VOID2U64(msm_ring->submit.bos),
211 req.nr_bos = msm_ring->nr_bos; 216 req.nr_bos = msm_ring->submit.nr_bos;
212 req.cmds = VOID2U64(msm_ring->cmds), 217 req.cmds = VOID2U64(msm_ring->submit.cmds),
213 req.nr_cmds = msm_ring->nr_cmds; 218 req.nr_cmds = msm_ring->submit.nr_cmds;
214 219
215 /* for each of the cmd's fix up their reloc's: */ 220 /* for each of the cmd's fix up their reloc's: */
216 for (i = 0; i < msm_ring->nr_cmds; i++) { 221 for (i = 0; i < msm_ring->submit.nr_cmds; i++) {
217 struct drm_msm_gem_submit_cmd *cmd = &msm_ring->cmds[i]; 222 struct drm_msm_gem_submit_cmd *cmd = &msm_ring->submit.cmds[i];
218 struct msm_ringbuffer *target_ring = to_msm_ringbuffer(msm_ring->rings[i]); 223 struct msm_ringbuffer *target_ring = to_msm_ringbuffer(msm_ring->rings[i]);
219 uint32_t a = find_next_reloc_idx(target_ring, 0, cmd->submit_offset); 224 uint32_t a = find_next_reloc_idx(target_ring, 0, cmd->submit_offset);
220 uint32_t b = find_next_reloc_idx(target_ring, a, cmd->submit_offset + cmd->size); 225 uint32_t b = find_next_reloc_idx(target_ring, a, cmd->submit_offset + cmd->size);
221 cmd->relocs = VOID2U64(&target_ring->relocs[a]); 226 cmd->relocs = VOID2U64(&target_ring->submit.relocs[a]);
222 cmd->nr_relocs = (b > a) ? b - a : 0; 227 cmd->nr_relocs = (b > a) ? b - a : 0;
223 } 228 }
224 229
@@ -230,7 +235,7 @@ static int msm_ringbuffer_flush(struct fd_ringbuffer *ring, uint32_t *last_start
230 ERROR_MSG("submit failed: %d (%s)", ret, strerror(errno)); 235 ERROR_MSG("submit failed: %d (%s)", ret, strerror(errno));
231 } else { 236 } else {
232 /* update timestamp on all rings associated with submit: */ 237 /* update timestamp on all rings associated with submit: */
233 for (i = 0; i < msm_ring->nr_cmds; i++) { 238 for (i = 0; i < msm_ring->submit.nr_cmds; i++) {
234 struct fd_ringbuffer *target_ring = msm_ring->rings[i]; 239 struct fd_ringbuffer *target_ring = msm_ring->rings[i];
235 if (!ret) 240 if (!ret)
236 target_ring->last_timestamp = req.fence; 241 target_ring->last_timestamp = req.fence;
@@ -261,10 +266,10 @@ static void msm_ringbuffer_emit_reloc(struct fd_ringbuffer *ring,
261 struct fd_ringbuffer *parent = ring->parent ? ring->parent : ring; 266 struct fd_ringbuffer *parent = ring->parent ? ring->parent : ring;
262 struct msm_bo *msm_bo = to_msm_bo(r->bo); 267 struct msm_bo *msm_bo = to_msm_bo(r->bo);
263 struct drm_msm_gem_submit_reloc *reloc; 268 struct drm_msm_gem_submit_reloc *reloc;
264 uint32_t idx = APPEND(msm_ring, relocs); 269 uint32_t idx = APPEND(&msm_ring->submit, relocs);
265 uint32_t addr; 270 uint32_t addr;
266 271
267 reloc = &msm_ring->relocs[idx]; 272 reloc = &msm_ring->submit.relocs[idx];
268 273
269 reloc->reloc_idx = bo2idx(parent, r->bo, r->flags); 274 reloc->reloc_idx = bo2idx(parent, r->bo, r->flags);
270 reloc->reloc_offset = r->offset; 275 reloc->reloc_offset = r->offset;