Skip to content

Commit f159b1b

Browse files
committed
drm/gem: Share code between drm_gem_fb_{begin,end}_cpu_access()
The error-recovery code in drm_gem_fb_begin() is of the same pattern as drm_gem_fb_end(). Implement both of them using an internal helper. No functional changes. v2: * print additional information in error message (Javier) * fix commit description (Javier) Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> Tested-by: Noralf Trønnes <noralf@tronnes.org> Acked-by: Christian König <christian.koenig@amd.com> Link: https://patchwork.freedesktop.org/patch/msgid/20220517113327.26919-2-tzimmermann@suse.de
1 parent c193a00 commit f159b1b

1 file changed

Lines changed: 27 additions & 36 deletions

File tree

drivers/gpu/drm/drm_gem_framebuffer_helper.c

Lines changed: 27 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,28 @@ void drm_gem_fb_vunmap(struct drm_framebuffer *fb,
403403
}
404404
EXPORT_SYMBOL(drm_gem_fb_vunmap);
405405

406+
static void __drm_gem_fb_end_cpu_access(struct drm_framebuffer *fb, enum dma_data_direction dir,
407+
unsigned int num_planes)
408+
{
409+
struct dma_buf_attachment *import_attach;
410+
struct drm_gem_object *obj;
411+
int ret;
412+
413+
while (num_planes) {
414+
--num_planes;
415+
obj = drm_gem_fb_get_obj(fb, num_planes);
416+
if (!obj)
417+
continue;
418+
import_attach = obj->import_attach;
419+
if (!import_attach)
420+
continue;
421+
ret = dma_buf_end_cpu_access(import_attach->dmabuf, dir);
422+
if (ret)
423+
drm_err(fb->dev, "dma_buf_end_cpu_access(%u, %d) failed: %d\n",
424+
ret, num_planes, dir);
425+
}
426+
}
427+
406428
/**
407429
* drm_gem_fb_begin_cpu_access - prepares GEM buffer objects for CPU access
408430
* @fb: the framebuffer
@@ -422,7 +444,7 @@ int drm_gem_fb_begin_cpu_access(struct drm_framebuffer *fb, enum dma_data_direct
422444
struct dma_buf_attachment *import_attach;
423445
struct drm_gem_object *obj;
424446
size_t i;
425-
int ret, ret2;
447+
int ret;
426448

427449
for (i = 0; i < ARRAY_SIZE(fb->obj); ++i) {
428450
obj = drm_gem_fb_get_obj(fb, i);
@@ -433,28 +455,13 @@ int drm_gem_fb_begin_cpu_access(struct drm_framebuffer *fb, enum dma_data_direct
433455
continue;
434456
ret = dma_buf_begin_cpu_access(import_attach->dmabuf, dir);
435457
if (ret)
436-
goto err_dma_buf_end_cpu_access;
458+
goto err___drm_gem_fb_end_cpu_access;
437459
}
438460

439461
return 0;
440462

441-
err_dma_buf_end_cpu_access:
442-
while (i) {
443-
--i;
444-
obj = drm_gem_fb_get_obj(fb, i);
445-
if (!obj)
446-
continue;
447-
import_attach = obj->import_attach;
448-
if (!import_attach)
449-
continue;
450-
ret2 = dma_buf_end_cpu_access(import_attach->dmabuf, dir);
451-
if (ret2) {
452-
drm_err(fb->dev,
453-
"dma_buf_end_cpu_access() failed during error handling: %d\n",
454-
ret2);
455-
}
456-
}
457-
463+
err___drm_gem_fb_end_cpu_access:
464+
__drm_gem_fb_end_cpu_access(fb, dir, i);
458465
return ret;
459466
}
460467
EXPORT_SYMBOL(drm_gem_fb_begin_cpu_access);
@@ -472,23 +479,7 @@ EXPORT_SYMBOL(drm_gem_fb_begin_cpu_access);
472479
*/
473480
void drm_gem_fb_end_cpu_access(struct drm_framebuffer *fb, enum dma_data_direction dir)
474481
{
475-
size_t i = ARRAY_SIZE(fb->obj);
476-
struct dma_buf_attachment *import_attach;
477-
struct drm_gem_object *obj;
478-
int ret;
479-
480-
while (i) {
481-
--i;
482-
obj = drm_gem_fb_get_obj(fb, i);
483-
if (!obj)
484-
continue;
485-
import_attach = obj->import_attach;
486-
if (!import_attach)
487-
continue;
488-
ret = dma_buf_end_cpu_access(import_attach->dmabuf, dir);
489-
if (ret)
490-
drm_err(fb->dev, "dma_buf_end_cpu_access() failed: %d\n", ret);
491-
}
482+
__drm_gem_fb_end_cpu_access(fb, dir, ARRAY_SIZE(fb->obj));
492483
}
493484
EXPORT_SYMBOL(drm_gem_fb_end_cpu_access);
494485

0 commit comments

Comments
 (0)