Store and instance of struct drm_xfrm_buf in struct ofdrm_device and keep the allocated memory allocated across display updates. Avoid possibly reallocating temporary memory on each display update. Unloading the DRM device also releases the xfrm buffer. Signed-off-by: Thomas Zimmermann <tzimmermann@xxxxxxx> --- drivers/gpu/drm/tiny/ofdrm.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/tiny/ofdrm.c b/drivers/gpu/drm/tiny/ofdrm.c index 1add55c872670..08e4b04e0590e 100644 --- a/drivers/gpu/drm/tiny/ofdrm.c +++ b/drivers/gpu/drm/tiny/ofdrm.c @@ -301,6 +301,7 @@ struct ofdrm_device { struct drm_display_mode mode; const struct drm_format_info *format; unsigned int pitch; + struct drm_xfrm_buf xfrm; /* colormap */ void __iomem *cmap_base; @@ -796,7 +797,6 @@ static void ofdrm_primary_plane_helper_atomic_update(struct drm_plane *plane, struct drm_framebuffer *fb = plane_state->fb; unsigned int dst_pitch = odev->pitch; const struct drm_format_info *dst_format = odev->format; - struct drm_xfrm_buf xfrm = DRM_XFRM_BUF_INIT; struct drm_atomic_helper_damage_iter iter; struct drm_rect damage; int ret, idx; @@ -818,13 +818,12 @@ static void ofdrm_primary_plane_helper_atomic_update(struct drm_plane *plane, iosys_map_incr(&dst, drm_fb_clip_offset(dst_pitch, dst_format, &dst_clip)); drm_fb_blit(&dst, &dst_pitch, dst_format->format, shadow_plane_state->data, fb, - &damage, &xfrm); + &damage, &odev->xfrm); } drm_dev_exit(idx); out_drm_gem_fb_end_cpu_access: drm_gem_fb_end_cpu_access(fb, DMA_FROM_DEVICE); - drm_xfrm_buf_release(&xfrm); } static void ofdrm_primary_plane_helper_atomic_disable(struct drm_plane *plane, @@ -1248,6 +1247,10 @@ static struct ofdrm_device *ofdrm_device_create(struct drm_driver *drv, drm_dbg(dev, "framebuffer format=%p4cc, size=%dx%d, linebytes=%d byte\n", &format->format, width, height, linebytes); + ret = drmm_xfrm_buf_init(dev, &odev->xfrm); + if (ret) + return ERR_PTR(ret); + /* * Mode-setting pipeline */ -- 2.42.0