Skip to content

Commit 8353706

Browse files
anholtpopcornmix
authored andcommitted
drm/vc4: Synchronize validation code for v2 submission upstream.
Signed-off-by: Eric Anholt <[email protected]>
1 parent a28a42a commit 8353706

File tree

4 files changed

+135
-196
lines changed

4 files changed

+135
-196
lines changed

drivers/gpu/drm/vc4/vc4_drv.h

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -189,17 +189,6 @@ to_vc4_encoder(struct drm_encoder *encoder)
189189
#define HVS_READ(offset) readl(vc4->hvs->regs + offset)
190190
#define HVS_WRITE(offset, val) writel(val, vc4->hvs->regs + offset)
191191

192-
enum vc4_bo_mode {
193-
VC4_MODE_UNDECIDED,
194-
VC4_MODE_RENDER,
195-
VC4_MODE_SHADER,
196-
};
197-
198-
struct vc4_bo_exec_state {
199-
struct drm_gem_cma_object *bo;
200-
enum vc4_bo_mode mode;
201-
};
202-
203192
struct vc4_exec_info {
204193
/* Sequence number for this bin/render job. */
205194
uint64_t seqno;
@@ -210,7 +199,7 @@ struct vc4_exec_info {
210199
/* This is the array of BOs that were looked up at the start of exec.
211200
* Command validation will use indices into this array.
212201
*/
213-
struct vc4_bo_exec_state *bo;
202+
struct drm_gem_cma_object **bo;
214203
uint32_t bo_count;
215204

216205
/* Pointers for our position in vc4->job_list */
@@ -238,7 +227,6 @@ struct vc4_exec_info {
238227
* command lists.
239228
*/
240229
struct vc4_shader_state {
241-
uint8_t packet;
242230
uint32_t addr;
243231
/* Maximum vertex index referenced by any primitive using this
244232
* shader state.
@@ -254,6 +242,7 @@ struct vc4_exec_info {
254242
bool found_tile_binning_mode_config_packet;
255243
bool found_start_tile_binning_packet;
256244
bool found_increment_semaphore_packet;
245+
bool found_flush;
257246
uint8_t bin_tiles_x, bin_tiles_y;
258247
struct drm_gem_cma_object *tile_bo;
259248
uint32_t tile_alloc_offset;
@@ -265,6 +254,9 @@ struct vc4_exec_info {
265254
uint32_t ct0ca, ct0ea;
266255
uint32_t ct1ca, ct1ea;
267256

257+
/* Pointer to the unvalidated bin CL (if present). */
258+
void *bin_u;
259+
268260
/* Pointers to the shader recs. These paddr gets incremented as CL
269261
* packets are relocated in validate_gl_shader_state, and the vaddrs
270262
* (u and v) get incremented and size decremented as the shader recs
@@ -455,10 +447,8 @@ vc4_validate_bin_cl(struct drm_device *dev,
455447
int
456448
vc4_validate_shader_recs(struct drm_device *dev, struct vc4_exec_info *exec);
457449

458-
bool vc4_use_bo(struct vc4_exec_info *exec,
459-
uint32_t hindex,
460-
enum vc4_bo_mode mode,
461-
struct drm_gem_cma_object **obj);
450+
struct drm_gem_cma_object *vc4_use_bo(struct vc4_exec_info *exec,
451+
uint32_t hindex);
462452

463453
int vc4_get_rcl(struct drm_device *dev, struct vc4_exec_info *exec);
464454

drivers/gpu/drm/vc4/vc4_gem.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,8 @@ vc4_save_hang_state(struct drm_device *dev)
169169
}
170170

171171
for (i = 0; i < exec->bo_count; i++) {
172-
drm_gem_object_reference(&exec->bo[i].bo->base);
173-
kernel_state->bo[i] = &exec->bo[i].bo->base;
172+
drm_gem_object_reference(&exec->bo[i]->base);
173+
kernel_state->bo[i] = &exec->bo[i]->base;
174174
}
175175

176176
list_for_each_entry(bo, &exec->unref_list, unref_head) {
@@ -397,7 +397,7 @@ vc4_update_bo_seqnos(struct vc4_exec_info *exec, uint64_t seqno)
397397
unsigned i;
398398

399399
for (i = 0; i < exec->bo_count; i++) {
400-
bo = to_vc4_bo(&exec->bo[i].bo->base);
400+
bo = to_vc4_bo(&exec->bo[i]->base);
401401
bo->seqno = seqno;
402402
}
403403

@@ -467,7 +467,7 @@ vc4_cl_lookup_bos(struct drm_device *dev,
467467
return -EINVAL;
468468
}
469469

470-
exec->bo = kcalloc(exec->bo_count, sizeof(struct vc4_bo_exec_state),
470+
exec->bo = kcalloc(exec->bo_count, sizeof(struct drm_gem_cma_object *),
471471
GFP_KERNEL);
472472
if (!exec->bo) {
473473
DRM_ERROR("Failed to allocate validated BO pointers\n");
@@ -500,7 +500,7 @@ vc4_cl_lookup_bos(struct drm_device *dev,
500500
goto fail;
501501
}
502502
drm_gem_object_reference(bo);
503-
exec->bo[i].bo = (struct drm_gem_cma_object *)bo;
503+
exec->bo[i] = (struct drm_gem_cma_object *)bo;
504504
}
505505
spin_unlock(&file_priv->table_lock);
506506

@@ -591,6 +591,8 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec)
591591

592592
exec->ct0ca = exec->exec_bo->paddr + bin_offset;
593593

594+
exec->bin_u = bin;
595+
594596
exec->shader_rec_v = exec->exec_bo->vaddr + shader_rec_offset;
595597
exec->shader_rec_p = exec->exec_bo->paddr + shader_rec_offset;
596598
exec->shader_rec_size = args->shader_rec_size;
@@ -622,7 +624,7 @@ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)
622624
mutex_lock(&dev->struct_mutex);
623625
if (exec->bo) {
624626
for (i = 0; i < exec->bo_count; i++)
625-
drm_gem_object_unreference(&exec->bo[i].bo->base);
627+
drm_gem_object_unreference(&exec->bo[i]->base);
626628
kfree(exec->bo);
627629
}
628630

drivers/gpu/drm/vc4/vc4_render_cl.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,8 @@ static int vc4_rcl_surface_setup(struct vc4_exec_info *exec,
436436
if (surf->hindex == ~0)
437437
return 0;
438438

439-
if (!vc4_use_bo(exec, surf->hindex, VC4_MODE_RENDER, obj))
439+
*obj = vc4_use_bo(exec, surf->hindex);
440+
if (!*obj)
440441
return -EINVAL;
441442

442443
if (surf->flags & VC4_SUBMIT_RCL_SURFACE_READ_IS_FULL_RES) {
@@ -537,7 +538,8 @@ vc4_rcl_render_config_surface_setup(struct vc4_exec_info *exec,
537538
if (surf->hindex == ~0)
538539
return 0;
539540

540-
if (!vc4_use_bo(exec, surf->hindex, VC4_MODE_RENDER, obj))
541+
*obj = vc4_use_bo(exec, surf->hindex);
542+
if (!*obj)
541543
return -EINVAL;
542544

543545
if (tiling > VC4_TILING_FORMAT_LT) {

0 commit comments

Comments
 (0)