162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#ifndef __DRM_GEM_ATOMIC_HELPER_H__ 462306a36Sopenharmony_ci#define __DRM_GEM_ATOMIC_HELPER_H__ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/iosys-map.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <drm/drm_fourcc.h> 962306a36Sopenharmony_ci#include <drm/drm_plane.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cistruct drm_simple_display_pipe; 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* 1462306a36Sopenharmony_ci * Plane Helpers 1562306a36Sopenharmony_ci */ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ciint drm_gem_plane_helper_prepare_fb(struct drm_plane *plane, struct drm_plane_state *state); 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* 2062306a36Sopenharmony_ci * Helpers for planes with shadow buffers 2162306a36Sopenharmony_ci */ 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci/** 2462306a36Sopenharmony_ci * DRM_SHADOW_PLANE_MAX_WIDTH - Maximum width of a plane's shadow buffer in pixels 2562306a36Sopenharmony_ci * 2662306a36Sopenharmony_ci * For drivers with shadow planes, the maximum width of the framebuffer is 2762306a36Sopenharmony_ci * usually independent from hardware limitations. Drivers can initialize struct 2862306a36Sopenharmony_ci * drm_mode_config.max_width from DRM_SHADOW_PLANE_MAX_WIDTH. 2962306a36Sopenharmony_ci */ 3062306a36Sopenharmony_ci#define DRM_SHADOW_PLANE_MAX_WIDTH (4096u) 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/** 3362306a36Sopenharmony_ci * DRM_SHADOW_PLANE_MAX_HEIGHT - Maximum height of a plane's shadow buffer in scanlines 3462306a36Sopenharmony_ci * 3562306a36Sopenharmony_ci * For drivers with shadow planes, the maximum height of the framebuffer is 3662306a36Sopenharmony_ci * usually independent from hardware limitations. Drivers can initialize struct 3762306a36Sopenharmony_ci * drm_mode_config.max_height from DRM_SHADOW_PLANE_MAX_HEIGHT. 3862306a36Sopenharmony_ci */ 3962306a36Sopenharmony_ci#define DRM_SHADOW_PLANE_MAX_HEIGHT (4096u) 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci/** 4262306a36Sopenharmony_ci * struct drm_shadow_plane_state - plane state for planes with shadow buffers 4362306a36Sopenharmony_ci * 4462306a36Sopenharmony_ci * For planes that use a shadow buffer, struct drm_shadow_plane_state 4562306a36Sopenharmony_ci * provides the regular plane state plus mappings of the shadow buffer 4662306a36Sopenharmony_ci * into kernel address space. 4762306a36Sopenharmony_ci */ 4862306a36Sopenharmony_cistruct drm_shadow_plane_state { 4962306a36Sopenharmony_ci /** @base: plane state */ 5062306a36Sopenharmony_ci struct drm_plane_state base; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci /* Transitional state - do not export or duplicate */ 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci /** 5562306a36Sopenharmony_ci * @map: Mappings of the plane's framebuffer BOs in to kernel address space 5662306a36Sopenharmony_ci * 5762306a36Sopenharmony_ci * The memory mappings stored in map should be established in the plane's 5862306a36Sopenharmony_ci * prepare_fb callback and removed in the cleanup_fb callback. 5962306a36Sopenharmony_ci */ 6062306a36Sopenharmony_ci struct iosys_map map[DRM_FORMAT_MAX_PLANES]; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci /** 6362306a36Sopenharmony_ci * @data: Address of each framebuffer BO's data 6462306a36Sopenharmony_ci * 6562306a36Sopenharmony_ci * The address of the data stored in each mapping. This is different 6662306a36Sopenharmony_ci * for framebuffers with non-zero offset fields. 6762306a36Sopenharmony_ci */ 6862306a36Sopenharmony_ci struct iosys_map data[DRM_FORMAT_MAX_PLANES]; 6962306a36Sopenharmony_ci}; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/** 7262306a36Sopenharmony_ci * to_drm_shadow_plane_state - upcasts from struct drm_plane_state 7362306a36Sopenharmony_ci * @state: the plane state 7462306a36Sopenharmony_ci */ 7562306a36Sopenharmony_cistatic inline struct drm_shadow_plane_state * 7662306a36Sopenharmony_cito_drm_shadow_plane_state(struct drm_plane_state *state) 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci return container_of(state, struct drm_shadow_plane_state, base); 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_civoid __drm_gem_duplicate_shadow_plane_state(struct drm_plane *plane, 8262306a36Sopenharmony_ci struct drm_shadow_plane_state *new_shadow_plane_state); 8362306a36Sopenharmony_civoid __drm_gem_destroy_shadow_plane_state(struct drm_shadow_plane_state *shadow_plane_state); 8462306a36Sopenharmony_civoid __drm_gem_reset_shadow_plane(struct drm_plane *plane, 8562306a36Sopenharmony_ci struct drm_shadow_plane_state *shadow_plane_state); 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_civoid drm_gem_reset_shadow_plane(struct drm_plane *plane); 8862306a36Sopenharmony_cistruct drm_plane_state *drm_gem_duplicate_shadow_plane_state(struct drm_plane *plane); 8962306a36Sopenharmony_civoid drm_gem_destroy_shadow_plane_state(struct drm_plane *plane, 9062306a36Sopenharmony_ci struct drm_plane_state *plane_state); 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci/** 9362306a36Sopenharmony_ci * DRM_GEM_SHADOW_PLANE_FUNCS - 9462306a36Sopenharmony_ci * Initializes struct drm_plane_funcs for shadow-buffered planes 9562306a36Sopenharmony_ci * 9662306a36Sopenharmony_ci * Drivers may use GEM BOs as shadow buffers over the framebuffer memory. This 9762306a36Sopenharmony_ci * macro initializes struct drm_plane_funcs to use the rsp helper functions. 9862306a36Sopenharmony_ci */ 9962306a36Sopenharmony_ci#define DRM_GEM_SHADOW_PLANE_FUNCS \ 10062306a36Sopenharmony_ci .reset = drm_gem_reset_shadow_plane, \ 10162306a36Sopenharmony_ci .atomic_duplicate_state = drm_gem_duplicate_shadow_plane_state, \ 10262306a36Sopenharmony_ci .atomic_destroy_state = drm_gem_destroy_shadow_plane_state 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ciint drm_gem_begin_shadow_fb_access(struct drm_plane *plane, struct drm_plane_state *plane_state); 10562306a36Sopenharmony_civoid drm_gem_end_shadow_fb_access(struct drm_plane *plane, struct drm_plane_state *plane_state); 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci/** 10862306a36Sopenharmony_ci * DRM_GEM_SHADOW_PLANE_HELPER_FUNCS - 10962306a36Sopenharmony_ci * Initializes struct drm_plane_helper_funcs for shadow-buffered planes 11062306a36Sopenharmony_ci * 11162306a36Sopenharmony_ci * Drivers may use GEM BOs as shadow buffers over the framebuffer memory. This 11262306a36Sopenharmony_ci * macro initializes struct drm_plane_helper_funcs to use the rsp helper 11362306a36Sopenharmony_ci * functions. 11462306a36Sopenharmony_ci */ 11562306a36Sopenharmony_ci#define DRM_GEM_SHADOW_PLANE_HELPER_FUNCS \ 11662306a36Sopenharmony_ci .begin_fb_access = drm_gem_begin_shadow_fb_access, \ 11762306a36Sopenharmony_ci .end_fb_access = drm_gem_end_shadow_fb_access 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ciint drm_gem_simple_kms_begin_shadow_fb_access(struct drm_simple_display_pipe *pipe, 12062306a36Sopenharmony_ci struct drm_plane_state *plane_state); 12162306a36Sopenharmony_civoid drm_gem_simple_kms_end_shadow_fb_access(struct drm_simple_display_pipe *pipe, 12262306a36Sopenharmony_ci struct drm_plane_state *plane_state); 12362306a36Sopenharmony_civoid drm_gem_simple_kms_reset_shadow_plane(struct drm_simple_display_pipe *pipe); 12462306a36Sopenharmony_cistruct drm_plane_state * 12562306a36Sopenharmony_cidrm_gem_simple_kms_duplicate_shadow_plane_state(struct drm_simple_display_pipe *pipe); 12662306a36Sopenharmony_civoid drm_gem_simple_kms_destroy_shadow_plane_state(struct drm_simple_display_pipe *pipe, 12762306a36Sopenharmony_ci struct drm_plane_state *plane_state); 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci/** 13062306a36Sopenharmony_ci * DRM_GEM_SIMPLE_DISPLAY_PIPE_SHADOW_PLANE_FUNCS - 13162306a36Sopenharmony_ci * Initializes struct drm_simple_display_pipe_funcs for shadow-buffered planes 13262306a36Sopenharmony_ci * 13362306a36Sopenharmony_ci * Drivers may use GEM BOs as shadow buffers over the framebuffer memory. This 13462306a36Sopenharmony_ci * macro initializes struct drm_simple_display_pipe_funcs to use the rsp helper 13562306a36Sopenharmony_ci * functions. 13662306a36Sopenharmony_ci */ 13762306a36Sopenharmony_ci#define DRM_GEM_SIMPLE_DISPLAY_PIPE_SHADOW_PLANE_FUNCS \ 13862306a36Sopenharmony_ci .begin_fb_access = drm_gem_simple_kms_begin_shadow_fb_access, \ 13962306a36Sopenharmony_ci .end_fb_access = drm_gem_simple_kms_end_shadow_fb_access, \ 14062306a36Sopenharmony_ci .reset_plane = drm_gem_simple_kms_reset_shadow_plane, \ 14162306a36Sopenharmony_ci .duplicate_plane_state = drm_gem_simple_kms_duplicate_shadow_plane_state, \ 14262306a36Sopenharmony_ci .destroy_plane_state = drm_gem_simple_kms_destroy_shadow_plane_state 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci#endif /* __DRM_GEM_ATOMIC_HELPER_H__ */ 145