drm: Introduce drm_framebuffer_assign()
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 25 Nov 2016 15:32:30 +0000 (15:32 +0000)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 29 Nov 2016 09:22:08 +0000 (10:22 +0100)
In a couple of places currently, and with the intent to add more, we
update a pointer to a framebuffer to hold a new fb reference (evicting
the old).

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20161125153231.13255-2-chris@chris-wilson.co.uk
drivers/gpu/drm/drm_atomic.c
include/drm/drm_framebuffer.h

index 89737e42fa83cec1ba2d878fe32910da5092ab58..19d7bcb882177795f941f7898decba22ac7cb9e9 100644 (file)
@@ -1246,18 +1246,14 @@ void
 drm_atomic_set_fb_for_plane(struct drm_plane_state *plane_state,
                            struct drm_framebuffer *fb)
 {
-       if (plane_state->fb)
-               drm_framebuffer_unreference(plane_state->fb);
-       if (fb)
-               drm_framebuffer_reference(fb);
-       plane_state->fb = fb;
-
        if (fb)
                DRM_DEBUG_ATOMIC("Set [FB:%d] for plane state %p\n",
                                 fb->base.id, plane_state);
        else
                DRM_DEBUG_ATOMIC("Set [NOFB] for plane state %p\n",
                                 plane_state);
+
+       drm_framebuffer_assign(&plane_state->fb, fb);
 }
 EXPORT_SYMBOL(drm_atomic_set_fb_for_plane);
 
index b3141a0e609b785026627b49fdffa6fb6fc2f35c..1ddfa2928802249f8c5abefb80ed71577bb04c12 100644 (file)
@@ -251,6 +251,24 @@ static inline uint32_t drm_framebuffer_read_refcount(struct drm_framebuffer *fb)
 }
 
 /**
+ * drm_framebuffer_assign - store a reference to the fb
+ * @p: location to store framebuffer
+ * @fb: new framebuffer (maybe NULL)
+ *
+ * This functions sets the location to store a reference to the framebuffer,
+ * unreferencing the framebuffer that was previously stored in that location.
+ */
+static inline void drm_framebuffer_assign(struct drm_framebuffer **p,
+                                         struct drm_framebuffer *fb)
+{
+       if (fb)
+               drm_framebuffer_reference(fb);
+       if (*p)
+               drm_framebuffer_unreference(*p);
+       *p = fb;
+}
+
+/*
  * drm_for_each_fb - iterate over all framebuffers
  * @fb: the loop cursor
  * @dev: the DRM device