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