Add new drm_fb_cma_setup_fence() helper function extracted from the imx-drm driver. This function checks if the plane has DMABUF attached to it and if so, sets up the fence on which the atomic helper can wait. Signed-off-by: Marek Vasut <marex@xxxxxxx> Cc: Daniel Vetter <daniel.vetter@xxxxxxxx> Cc: Lucas Stach <l.stach@xxxxxxxxxxxxxx> --- drivers/gpu/drm/drm_fb_cma_helper.c | 26 ++++++++++++++++++++++++++ include/drm/drm_fb_cma_helper.h | 3 +++ 2 files changed, 29 insertions(+) diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c index 1fd6eac..2441707 100644 --- a/drivers/gpu/drm/drm_fb_cma_helper.c +++ b/drivers/gpu/drm/drm_fb_cma_helper.c @@ -23,8 +23,10 @@ #include <drm/drm_crtc_helper.h> #include <drm/drm_gem_cma_helper.h> #include <drm/drm_fb_cma_helper.h> +#include <linux/dma-buf.h> #include <linux/dma-mapping.h> #include <linux/module.h> +#include <linux/reservation.h> #define DEFAULT_FBDEFIO_DELAY_MS 50 @@ -265,6 +267,30 @@ struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb, } EXPORT_SYMBOL_GPL(drm_fb_cma_get_gem_obj); +/** + * drm_fb_cma_setup_fence() - Set up the fence for atomic helper to wait on + * @plane: Which plane + * @state: Plane state to check + * + * If the plane fb has an dma-buf attached, fish out the exclusive + * fence for the atomic helper to wait on. + */ +void drm_fb_cma_setup_fence(struct drm_plane *plane, + struct drm_plane_state *state) +{ + struct dma_buf *dma_buf; + + if ((plane->state->fb == state->fb) || !state->fb) + return; + + dma_buf = drm_fb_cma_get_gem_obj(state->fb, 0)->base.dma_buf; + if (!dma_buf) + return; + + state->fence = reservation_object_get_excl_rcu(dma_buf->resv); +} +EXPORT_SYMBOL_GPL(drm_fb_cma_setup_fence); + #ifdef CONFIG_DEBUG_FS static void drm_fb_cma_describe(struct drm_framebuffer *fb, struct seq_file *m) { diff --git a/include/drm/drm_fb_cma_helper.h b/include/drm/drm_fb_cma_helper.h index f313211..fc122d3 100644 --- a/include/drm/drm_fb_cma_helper.h +++ b/include/drm/drm_fb_cma_helper.h @@ -41,6 +41,9 @@ struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev, struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb, unsigned int plane); +void drm_fb_cma_setup_fence(struct drm_plane *plane, + struct drm_plane_state *state); + #ifdef CONFIG_DEBUG_FS struct seq_file; -- 2.9.3 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel