Skip to content

Commit db37370

Browse files
committed
Merge pull request #1268 from anholt/rpi-4.1.y-pull
rpi-4.1.y pull: vc4: kernel-side fix for X rendering lag, plus 3D testing fix
2 parents ff2d0b7 + d9233f8 commit db37370

File tree

10 files changed

+55
-37
lines changed

10 files changed

+55
-37
lines changed

drivers/gpu/drm/drm_fb_cma_helper.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ static int drm_fbdev_cma_create(struct drm_fb_helper *helper,
279279
if (!fbi) {
280280
dev_err(dev->dev, "Failed to allocate framebuffer info.\n");
281281
ret = -ENOMEM;
282-
goto err_drm_gem_cma_free_object;
282+
goto err_gem_free_object;
283283
}
284284

285285
fbdev_cma->fb = drm_fb_cma_alloc(dev, &mode_cmd, &obj, 1);
@@ -322,8 +322,8 @@ static int drm_fbdev_cma_create(struct drm_fb_helper *helper,
322322
drm_fb_cma_destroy(fb);
323323
err_framebuffer_release:
324324
framebuffer_release(fbi);
325-
err_drm_gem_cma_free_object:
326-
drm_gem_cma_free_object(&obj->base);
325+
err_gem_free_object:
326+
dev->driver->gem_free_object(&obj->base);
327327
return ret;
328328
}
329329

drivers/gpu/drm/drm_gem_cma_helper.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ struct drm_gem_cma_object *drm_gem_cma_create(struct drm_device *drm,
121121
return cma_obj;
122122

123123
error:
124-
drm_gem_cma_free_object(&cma_obj->base);
124+
drm->driver->gem_free_object(&cma_obj->base);
125125
return ERR_PTR(ret);
126126
}
127127
EXPORT_SYMBOL_GPL(drm_gem_cma_create);
@@ -171,7 +171,7 @@ drm_gem_cma_create_with_handle(struct drm_file *file_priv,
171171
return cma_obj;
172172

173173
err_handle_create:
174-
drm_gem_cma_free_object(gem_obj);
174+
drm->driver->gem_free_object(gem_obj);
175175

176176
return ERR_PTR(ret);
177177
}

drivers/gpu/drm/vc4/vc4_bo.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,10 @@ struct vc4_bo *vc4_bo_create(struct drm_device *dev, size_t unaligned_size,
213213
size_t size = roundup(unaligned_size, PAGE_SIZE);
214214
struct vc4_dev *vc4 = to_vc4_dev(dev);
215215
struct drm_gem_cma_object *cma_obj;
216-
int pass;
216+
int pass, ret;
217217

218218
if (size == 0)
219-
return NULL;
219+
return ERR_PTR(-EINVAL);
220220

221221
/* First, try to get a vc4_bo from the kernel BO cache. */
222222
if (from_cache) {
@@ -247,14 +247,17 @@ struct vc4_bo *vc4_bo_create(struct drm_device *dev, size_t unaligned_size,
247247
* unreferenced BOs to the cache, and then
248248
* free the cache.
249249
*/
250-
vc4_wait_for_seqno(dev, vc4->emit_seqno, ~0ull, true);
250+
ret = vc4_wait_for_seqno(dev, vc4->emit_seqno, ~0ull,
251+
true);
252+
if (ret)
253+
return ERR_PTR(ret);
251254
vc4_job_handle_completed(vc4);
252255
vc4_bo_cache_purge(dev);
253256
break;
254257
case 3:
255258
DRM_ERROR("Failed to allocate from CMA:\n");
256259
vc4_bo_stats_dump(vc4);
257-
return NULL;
260+
return ERR_PTR(-ENOMEM);
258261
}
259262
}
260263

@@ -276,8 +279,8 @@ int vc4_dumb_create(struct drm_file *file_priv,
276279
args->size = args->pitch * args->height;
277280

278281
bo = vc4_bo_create(dev, args->size, false);
279-
if (!bo)
280-
return -ENOMEM;
282+
if (IS_ERR(bo))
283+
return PTR_ERR(bo);
281284

282285
ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle);
283286
drm_gem_object_unreference_unlocked(&bo->base.base);
@@ -460,8 +463,8 @@ int vc4_create_bo_ioctl(struct drm_device *dev, void *data,
460463
* get zeroed, and that might leak data between users.
461464
*/
462465
bo = vc4_bo_create(dev, args->size, false);
463-
if (!bo)
464-
return -ENOMEM;
466+
if (IS_ERR(bo))
467+
return PTR_ERR(bo);
465468

466469
ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle);
467470
drm_gem_object_unreference_unlocked(&bo->base.base);
@@ -513,8 +516,8 @@ vc4_create_shader_bo_ioctl(struct drm_device *dev, void *data,
513516
}
514517

515518
bo = vc4_bo_create(dev, args->size, true);
516-
if (!bo)
517-
return -ENOMEM;
519+
if (IS_ERR(bo))
520+
return PTR_ERR(bo);
518521

519522
ret = copy_from_user(bo->base.vaddr,
520523
(void __user *)(uintptr_t)args->data,

drivers/gpu/drm/vc4/vc4_debugfs.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
static const struct drm_info_list vc4_debugfs_list[] = {
1919
{"bo_stats", vc4_bo_stats_debugfs, 0},
20+
{"gem_exec", vc4_gem_exec_debugfs, 0},
2021
{"hdmi_regs", vc4_hdmi_debugfs_regs, 0},
2122
{"hvs_regs", vc4_hvs_debugfs_regs, 0},
2223
{"crtc0_regs", vc4_crtc_debugfs_regs, 0, (void *)(uintptr_t)0},

drivers/gpu/drm/vc4/vc4_drv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,7 @@ void vc4_job_handle_completed(struct vc4_dev *vc4);
403403
int vc4_queue_seqno_cb(struct drm_device *dev,
404404
struct vc4_seqno_cb *cb, uint64_t seqno,
405405
void (*func)(struct vc4_seqno_cb *cb));
406+
int vc4_gem_exec_debugfs(struct seq_file *m, void *arg);
406407

407408
/* vc4_hdmi.c */
408409
extern struct platform_driver vc4_hdmi_driver;

drivers/gpu/drm/vc4/vc4_gem.c

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,20 @@
3131
#include "vc4_regs.h"
3232
#include "vc4_trace.h"
3333

34+
#ifdef CONFIG_DEBUG_FS
35+
int vc4_gem_exec_debugfs(struct seq_file *m, void *unused)
36+
{
37+
struct drm_info_node *node = (struct drm_info_node *)m->private;
38+
struct drm_device *dev = node->minor->dev;
39+
struct vc4_dev *vc4 = to_vc4_dev(dev);
40+
41+
seq_printf(m, "Emitted seqno: 0x%016llx\n", vc4->emit_seqno);
42+
seq_printf(m, "Finished seqno: 0x%016llx\n", vc4->finished_seqno);
43+
44+
return 0;
45+
}
46+
#endif /* CONFIG_DEBUG_FS */
47+
3448
static void
3549
vc4_queue_hangcheck(struct drm_device *dev)
3650
{
@@ -338,12 +352,7 @@ vc4_wait_for_seqno(struct drm_device *dev, uint64_t seqno, uint64_t timeout_ns,
338352
finish_wait(&vc4->job_wait_queue, &wait);
339353
trace_vc4_wait_for_seqno_end(dev, seqno);
340354

341-
if (ret && ret != -ERESTARTSYS) {
342-
DRM_ERROR("timeout waiting for render thread idle\n");
343-
return ret;
344-
}
345-
346-
return 0;
355+
return ret;
347356
}
348357

349358
static void
@@ -579,9 +588,9 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec)
579588
}
580589

581590
bo = vc4_bo_create(dev, exec_size, true);
582-
if (!bo) {
591+
if (IS_ERR(bo)) {
583592
DRM_ERROR("Couldn't allocate BO for binning\n");
584-
ret = PTR_ERR(exec->exec_bo);
593+
ret = PTR_ERR(bo);
585594
goto fail;
586595
}
587596
exec->exec_bo = &bo->base;
@@ -747,6 +756,9 @@ vc4_wait_bo_ioctl(struct drm_device *dev, void *data,
747756
struct drm_gem_object *gem_obj;
748757
struct vc4_bo *bo;
749758

759+
if (args->pad != 0)
760+
return -EINVAL;
761+
750762
gem_obj = drm_gem_object_lookup(dev, file_priv, args->handle);
751763
if (!gem_obj) {
752764
DRM_ERROR("Failed to look up GEM BO %d\n", args->handle);

drivers/gpu/drm/vc4/vc4_irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ vc4_overflow_mem_work(struct work_struct *work)
5757
struct vc4_bo *bo;
5858

5959
bo = vc4_bo_create(dev, 256 * 1024, true);
60-
if (!bo) {
60+
if (IS_ERR(bo)) {
6161
DRM_ERROR("Couldn't allocate binner overflow mem\n");
6262
return;
6363
}

drivers/gpu/drm/vc4/vc4_render_cl.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -316,20 +316,11 @@ static int vc4_create_rcl_bo(struct drm_device *dev, struct vc4_exec_info *exec,
316316
size += xtiles * ytiles * loop_body_size;
317317

318318
setup->rcl = &vc4_bo_create(dev, size, true)->base;
319-
if (!setup->rcl)
320-
return -ENOMEM;
319+
if (IS_ERR(setup->rcl))
320+
return PTR_ERR(setup->rcl);
321321
list_add_tail(&to_vc4_bo(&setup->rcl->base)->unref_head,
322322
&exec->unref_list);
323323

324-
rcl_u8(setup, VC4_PACKET_TILE_RENDERING_MODE_CONFIG);
325-
rcl_u32(setup,
326-
(setup->color_write ? (setup->color_write->paddr +
327-
args->color_write.offset) :
328-
0));
329-
rcl_u16(setup, args->width);
330-
rcl_u16(setup, args->height);
331-
rcl_u16(setup, args->color_write.bits);
332-
333324
/* The tile buffer gets cleared when the previous tile is stored. If
334325
* the clear values changed between frames, then the tile buffer has
335326
* stale clear values in it, so we have to do a store in None mode (no
@@ -349,6 +340,15 @@ static int vc4_create_rcl_bo(struct drm_device *dev, struct vc4_exec_info *exec,
349340
rcl_u32(setup, 0); /* no address, since we're in None mode */
350341
}
351342

343+
rcl_u8(setup, VC4_PACKET_TILE_RENDERING_MODE_CONFIG);
344+
rcl_u32(setup,
345+
(setup->color_write ? (setup->color_write->paddr +
346+
args->color_write.offset) :
347+
0));
348+
rcl_u16(setup, args->width);
349+
rcl_u16(setup, args->height);
350+
rcl_u16(setup, args->color_write.bits);
351+
352352
for (y = min_y_tile; y <= max_y_tile; y++) {
353353
for (x = min_x_tile; x <= max_x_tile; x++) {
354354
bool first = (x == min_x_tile && y == min_y_tile);

drivers/gpu/drm/vc4/vc4_validate.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -401,8 +401,8 @@ validate_tile_binning_config(VALIDATE_ARGS)
401401
tile_bo = vc4_bo_create(dev, exec->tile_alloc_offset + tile_alloc_size,
402402
true);
403403
exec->tile_bo = &tile_bo->base;
404-
if (!exec->tile_bo)
405-
return -ENOMEM;
404+
if (IS_ERR(exec->tile_bo))
405+
return PTR_ERR(exec->tile_bo);
406406
list_add_tail(&tile_bo->unref_head, &exec->unref_list);
407407

408408
/* tile alloc address. */

include/uapi/drm/Kbuild

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ header-y += radeon_drm.h
1414
header-y += savage_drm.h
1515
header-y += sis_drm.h
1616
header-y += tegra_drm.h
17+
header-y += vc4_drm.h
1718
header-y += via_drm.h
1819
header-y += vmwgfx_drm.h
1920
header-y += msm_drm.h

0 commit comments

Comments
 (0)