drm: Always prepare null framebuffer in transitional helper
authorGabriel Krisman Bertazi <krisman@collabora.co.uk>
Thu, 16 Feb 2017 16:44:42 +0000 (14:44 -0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Sun, 26 Feb 2017 20:57:24 +0000 (21:57 +0100)
Despite the documentation claim that cleanup_fb will match prior calls
to prepare_fb, in case of NULL framebuffers in the transitional helpers,
the code will skip the call to prepare_fb but not the corresponding
cleanup_fb call.  This asymmetry in semantics is unnecessarily surprising
for developers transitioning drivers to atomic model, specially because
the final atomic handlers don't have the issue - the prepare_fb is
always called, despite the new state framebuffer being null.

The only current user of the transitional helper that doesn't take care
of null framebuffers explicitly inside the prepare_fb hook is
atmel_hlcdc, so we take special care to make sure we don't break
anything there.

Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20170216164442.28704-1-krisman@collabora.co.uk
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
drivers/gpu/drm/drm_plane_helper.c

index bd2791c4b0027c2cf15df5c0eb0add426499b2b1..886ed5d8e3046430a5bf66bb28ae7b4ae234776f 100644 (file)
@@ -772,6 +772,9 @@ static int atmel_hlcdc_plane_prepare_fb(struct drm_plane *p,
                        drm_plane_state_to_atmel_hlcdc_plane_state(s);
        int ret;
 
+       if (!new_state->fb)
+               return 0;
+
        ret = atmel_hlcdc_layer_update_start(&plane->layer);
        if (!ret)
                state->prepared = true;
index 148688fb920a58745645cd0b57aa9d3c83aa36be..d8639e46bd2be7e61ca6b9c4cd579454f9d0658f 100644 (file)
@@ -450,8 +450,7 @@ int drm_plane_helper_commit(struct drm_plane *plane,
                        goto out;
        }
 
-       if (plane_funcs->prepare_fb && plane_state->fb &&
-           plane_state->fb != old_fb) {
+       if (plane_funcs->prepare_fb && plane_state->fb != old_fb) {
                ret = plane_funcs->prepare_fb(plane,
                                              plane_state);
                if (ret)