1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2 3#ifndef __DRM_GEM_ATOMIC_HELPER_H__ 4#define __DRM_GEM_ATOMIC_HELPER_H__ 5 6#include <linux/iosys-map.h> 7 8#include <drm/drm_fourcc.h> 9#include <drm/drm_plane.h> 10 11struct drm_simple_display_pipe; 12 13/* 14 * Plane Helpers 15 */ 16 17int drm_gem_plane_helper_prepare_fb(struct drm_plane *plane, struct drm_plane_state *state); 18 19/* 20 * Helpers for planes with shadow buffers 21 */ 22 23/** 24 * DRM_SHADOW_PLANE_MAX_WIDTH - Maximum width of a plane's shadow buffer in pixels 25 * 26 * For drivers with shadow planes, the maximum width of the framebuffer is 27 * usually independent from hardware limitations. Drivers can initialize struct 28 * drm_mode_config.max_width from DRM_SHADOW_PLANE_MAX_WIDTH. 29 */ 30#define DRM_SHADOW_PLANE_MAX_WIDTH (4096u) 31 32/** 33 * DRM_SHADOW_PLANE_MAX_HEIGHT - Maximum height of a plane's shadow buffer in scanlines 34 * 35 * For drivers with shadow planes, the maximum height of the framebuffer is 36 * usually independent from hardware limitations. Drivers can initialize struct 37 * drm_mode_config.max_height from DRM_SHADOW_PLANE_MAX_HEIGHT. 38 */ 39#define DRM_SHADOW_PLANE_MAX_HEIGHT (4096u) 40 41/** 42 * struct drm_shadow_plane_state - plane state for planes with shadow buffers 43 * 44 * For planes that use a shadow buffer, struct drm_shadow_plane_state 45 * provides the regular plane state plus mappings of the shadow buffer 46 * into kernel address space. 47 */ 48struct drm_shadow_plane_state { 49 /** @base: plane state */ 50 struct drm_plane_state base; 51 52 /* Transitional state - do not export or duplicate */ 53 54 /** 55 * @map: Mappings of the plane's framebuffer BOs in to kernel address space 56 * 57 * The memory mappings stored in map should be established in the plane's 58 * prepare_fb callback and removed in the cleanup_fb callback. 59 */ 60 struct iosys_map map[DRM_FORMAT_MAX_PLANES]; 61 62 /** 63 * @data: Address of each framebuffer BO's data 64 * 65 * The address of the data stored in each mapping. This is different 66 * for framebuffers with non-zero offset fields. 67 */ 68 struct iosys_map data[DRM_FORMAT_MAX_PLANES]; 69}; 70 71/** 72 * to_drm_shadow_plane_state - upcasts from struct drm_plane_state 73 * @state: the plane state 74 */ 75static inline struct drm_shadow_plane_state * 76to_drm_shadow_plane_state(struct drm_plane_state *state) 77{ 78 return container_of(state, struct drm_shadow_plane_state, base); 79} 80 81void __drm_gem_duplicate_shadow_plane_state(struct drm_plane *plane, 82 struct drm_shadow_plane_state *new_shadow_plane_state); 83void __drm_gem_destroy_shadow_plane_state(struct drm_shadow_plane_state *shadow_plane_state); 84void __drm_gem_reset_shadow_plane(struct drm_plane *plane, 85 struct drm_shadow_plane_state *shadow_plane_state); 86 87void drm_gem_reset_shadow_plane(struct drm_plane *plane); 88struct drm_plane_state *drm_gem_duplicate_shadow_plane_state(struct drm_plane *plane); 89void drm_gem_destroy_shadow_plane_state(struct drm_plane *plane, 90 struct drm_plane_state *plane_state); 91 92/** 93 * DRM_GEM_SHADOW_PLANE_FUNCS - 94 * Initializes struct drm_plane_funcs for shadow-buffered planes 95 * 96 * Drivers may use GEM BOs as shadow buffers over the framebuffer memory. This 97 * macro initializes struct drm_plane_funcs to use the rsp helper functions. 98 */ 99#define DRM_GEM_SHADOW_PLANE_FUNCS \ 100 .reset = drm_gem_reset_shadow_plane, \ 101 .atomic_duplicate_state = drm_gem_duplicate_shadow_plane_state, \ 102 .atomic_destroy_state = drm_gem_destroy_shadow_plane_state 103 104int drm_gem_begin_shadow_fb_access(struct drm_plane *plane, struct drm_plane_state *plane_state); 105void drm_gem_end_shadow_fb_access(struct drm_plane *plane, struct drm_plane_state *plane_state); 106 107/** 108 * DRM_GEM_SHADOW_PLANE_HELPER_FUNCS - 109 * Initializes struct drm_plane_helper_funcs for shadow-buffered planes 110 * 111 * Drivers may use GEM BOs as shadow buffers over the framebuffer memory. This 112 * macro initializes struct drm_plane_helper_funcs to use the rsp helper 113 * functions. 114 */ 115#define DRM_GEM_SHADOW_PLANE_HELPER_FUNCS \ 116 .begin_fb_access = drm_gem_begin_shadow_fb_access, \ 117 .end_fb_access = drm_gem_end_shadow_fb_access 118 119int drm_gem_simple_kms_begin_shadow_fb_access(struct drm_simple_display_pipe *pipe, 120 struct drm_plane_state *plane_state); 121void drm_gem_simple_kms_end_shadow_fb_access(struct drm_simple_display_pipe *pipe, 122 struct drm_plane_state *plane_state); 123void drm_gem_simple_kms_reset_shadow_plane(struct drm_simple_display_pipe *pipe); 124struct drm_plane_state * 125drm_gem_simple_kms_duplicate_shadow_plane_state(struct drm_simple_display_pipe *pipe); 126void drm_gem_simple_kms_destroy_shadow_plane_state(struct drm_simple_display_pipe *pipe, 127 struct drm_plane_state *plane_state); 128 129/** 130 * DRM_GEM_SIMPLE_DISPLAY_PIPE_SHADOW_PLANE_FUNCS - 131 * Initializes struct drm_simple_display_pipe_funcs for shadow-buffered planes 132 * 133 * Drivers may use GEM BOs as shadow buffers over the framebuffer memory. This 134 * macro initializes struct drm_simple_display_pipe_funcs to use the rsp helper 135 * functions. 136 */ 137#define DRM_GEM_SIMPLE_DISPLAY_PIPE_SHADOW_PLANE_FUNCS \ 138 .begin_fb_access = drm_gem_simple_kms_begin_shadow_fb_access, \ 139 .end_fb_access = drm_gem_simple_kms_end_shadow_fb_access, \ 140 .reset_plane = drm_gem_simple_kms_reset_shadow_plane, \ 141 .duplicate_plane_state = drm_gem_simple_kms_duplicate_shadow_plane_state, \ 142 .destroy_plane_state = drm_gem_simple_kms_destroy_shadow_plane_state 143 144#endif /* __DRM_GEM_ATOMIC_HELPER_H__ */ 145