This was initialy done for imx6, but should work on most drivers using drm_fb_dma_helper. v8: * Replace get_scanout_buffer() logic with drm_panic_set_buffer() (Thomas Zimmermann) Signed-off-by: Jocelyn Falempe <jfalempe@xxxxxxxxxx> --- drivers/gpu/drm/drm_fb_dma_helper.c | 37 +++++++++++++++++++++++++++++ include/drm/drm_fb_dma_helper.h | 4 ++++ 2 files changed, 41 insertions(+) diff --git a/drivers/gpu/drm/drm_fb_dma_helper.c b/drivers/gpu/drm/drm_fb_dma_helper.c index 3b535ad1b07c..31ba71644e2b 100644 --- a/drivers/gpu/drm/drm_fb_dma_helper.c +++ b/drivers/gpu/drm/drm_fb_dma_helper.c @@ -15,6 +15,7 @@ #include <drm/drm_framebuffer.h> #include <drm/drm_gem_dma_helper.h> #include <drm/drm_gem_framebuffer_helper.h> +#include <drm/drm_panic.h> #include <drm/drm_plane.h> #include <linux/dma-mapping.h> #include <linux/module.h> @@ -148,3 +149,39 @@ void drm_fb_dma_sync_non_coherent(struct drm_device *drm, } } EXPORT_SYMBOL_GPL(drm_fb_dma_sync_non_coherent); + +#if defined(CONFIG_DRM_PANIC) +/** + * drm_panic_gem_set_scanout_buffer - helper around drm_panic_set_buffer() + * + * @plane: primary plane registered to drm_panic + * @fb: framebuffer attached to the plane state + * + * Update plane->panic_scanout with the new framebuffer. + */ +void drm_panic_gem_set_scanout_buffer(struct drm_plane *plane, + struct drm_framebuffer *fb) +{ + struct drm_gem_dma_object *dma_obj; + struct iosys_map map; + + if (!plane->panic_scanout) + return; + + if (fb->modifier == DRM_FORMAT_MOD_LINEAR) { + dma_obj = drm_fb_dma_get_gem_obj(fb, 0); + if (dma_obj && dma_obj->vaddr) { + iosys_map_set_vaddr(&map, dma_obj->vaddr); + drm_panic_set_buffer(plane->panic_scanout, fb, &map); + return; + } + } + drm_panic_unset_buffer(plane->panic_scanout); +} +#else +void drm_panic_gem_set_scanout_buffer(struct drm_plane *plane, + struct drm_framebuffer *fb) +{ +} +#endif +EXPORT_SYMBOL(drm_panic_gem_set_scanout_buffer); diff --git a/include/drm/drm_fb_dma_helper.h b/include/drm/drm_fb_dma_helper.h index d5e036c57801..9f9ec11343cd 100644 --- a/include/drm/drm_fb_dma_helper.h +++ b/include/drm/drm_fb_dma_helper.h @@ -7,6 +7,7 @@ struct drm_device; struct drm_framebuffer; struct drm_plane_state; +struct drm_scanout_buffer; struct drm_gem_dma_object *drm_fb_dma_get_gem_obj(struct drm_framebuffer *fb, unsigned int plane); @@ -19,5 +20,8 @@ void drm_fb_dma_sync_non_coherent(struct drm_device *drm, struct drm_plane_state *old_state, struct drm_plane_state *state); +void drm_panic_gem_set_scanout_buffer(struct drm_plane *plane, + struct drm_framebuffer *fb); + #endif -- 2.43.0