1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 3 #ifndef DRM_SYSFB_HELPER_H 4 #define DRM_SYSFB_HELPER_H 5 6 #include <linux/container_of.h> 7 #include <linux/iosys-map.h> 8 9 #include <drm/drm_crtc.h> 10 #include <drm/drm_device.h> 11 #include <drm/drm_modes.h> 12 13 struct drm_format_info; 14 struct drm_scanout_buffer; 15 16 /* 17 * Input parsing 18 */ 19 20 int drm_sysfb_get_validated_int(struct drm_device *dev, const char *name, 21 u64 value, u32 max); 22 int drm_sysfb_get_validated_int0(struct drm_device *dev, const char *name, 23 u64 value, u32 max); 24 25 /* 26 * Display modes 27 */ 28 29 struct drm_display_mode drm_sysfb_mode(unsigned int width, 30 unsigned int height, 31 unsigned int width_mm, 32 unsigned int height_mm); 33 34 /* 35 * Device 36 */ 37 38 struct drm_sysfb_device { 39 struct drm_device dev; 40 41 const u8 *edid; /* can be NULL */ 42 43 /* hardware settings */ 44 struct drm_display_mode fb_mode; 45 const struct drm_format_info *fb_format; 46 unsigned int fb_pitch; 47 unsigned int fb_gamma_lut_size; 48 49 /* hardware-framebuffer kernel address */ 50 struct iosys_map fb_addr; 51 }; 52 53 static inline struct drm_sysfb_device *to_drm_sysfb_device(struct drm_device *dev) 54 { 55 return container_of(dev, struct drm_sysfb_device, dev); 56 } 57 58 /* 59 * Plane 60 */ 61 62 int drm_sysfb_plane_helper_atomic_check(struct drm_plane *plane, 63 struct drm_atomic_state *new_state); 64 void drm_sysfb_plane_helper_atomic_update(struct drm_plane *plane, 65 struct drm_atomic_state *state); 66 void drm_sysfb_plane_helper_atomic_disable(struct drm_plane *plane, 67 struct drm_atomic_state *state); 68 int drm_sysfb_plane_helper_get_scanout_buffer(struct drm_plane *plane, 69 struct drm_scanout_buffer *sb); 70 71 #define DRM_SYSFB_PLANE_NFORMATS(_num_native) \ 72 ((_num_native) + 1) 73 74 #define DRM_SYSFB_PLANE_FORMAT_MODIFIERS \ 75 DRM_FORMAT_MOD_LINEAR, \ 76 DRM_FORMAT_MOD_INVALID 77 78 #define DRM_SYSFB_PLANE_HELPER_FUNCS \ 79 DRM_GEM_SHADOW_PLANE_HELPER_FUNCS, \ 80 .atomic_check = drm_sysfb_plane_helper_atomic_check, \ 81 .atomic_update = drm_sysfb_plane_helper_atomic_update, \ 82 .atomic_disable = drm_sysfb_plane_helper_atomic_disable, \ 83 .get_scanout_buffer = drm_sysfb_plane_helper_get_scanout_buffer 84 85 #define DRM_SYSFB_PLANE_FUNCS \ 86 .update_plane = drm_atomic_helper_update_plane, \ 87 .disable_plane = drm_atomic_helper_disable_plane, \ 88 DRM_GEM_SHADOW_PLANE_FUNCS 89 90 /* 91 * CRTC 92 */ 93 94 struct drm_sysfb_crtc_state { 95 struct drm_crtc_state base; 96 97 /* Primary-plane format; required for color mgmt. */ 98 const struct drm_format_info *format; 99 }; 100 101 static inline struct drm_sysfb_crtc_state * 102 to_drm_sysfb_crtc_state(struct drm_crtc_state *base) 103 { 104 return container_of(base, struct drm_sysfb_crtc_state, base); 105 } 106 107 enum drm_mode_status drm_sysfb_crtc_helper_mode_valid(struct drm_crtc *crtc, 108 const struct drm_display_mode *mode); 109 int drm_sysfb_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *new_state); 110 111 #define DRM_SYSFB_CRTC_HELPER_FUNCS \ 112 .mode_valid = drm_sysfb_crtc_helper_mode_valid, \ 113 .atomic_check = drm_sysfb_crtc_helper_atomic_check 114 115 void drm_sysfb_crtc_reset(struct drm_crtc *crtc); 116 struct drm_crtc_state *drm_sysfb_crtc_atomic_duplicate_state(struct drm_crtc *crtc); 117 void drm_sysfb_crtc_atomic_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *crtc_state); 118 119 #define DRM_SYSFB_CRTC_FUNCS \ 120 .reset = drm_sysfb_crtc_reset, \ 121 .set_config = drm_atomic_helper_set_config, \ 122 .page_flip = drm_atomic_helper_page_flip, \ 123 .atomic_duplicate_state = drm_sysfb_crtc_atomic_duplicate_state, \ 124 .atomic_destroy_state = drm_sysfb_crtc_atomic_destroy_state 125 126 /* 127 * Connector 128 */ 129 130 int drm_sysfb_connector_helper_get_modes(struct drm_connector *connector); 131 132 #define DRM_SYSFB_CONNECTOR_HELPER_FUNCS \ 133 .get_modes = drm_sysfb_connector_helper_get_modes 134 135 #define DRM_SYSFB_CONNECTOR_FUNCS \ 136 .reset = drm_atomic_helper_connector_reset, \ 137 .fill_modes = drm_helper_probe_single_connector_modes, \ 138 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, \ 139 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state 140 141 /* 142 * Mode config 143 */ 144 145 #define DRM_SYSFB_MODE_CONFIG_FUNCS \ 146 .fb_create = drm_gem_fb_create_with_dirty, \ 147 .atomic_check = drm_atomic_helper_check, \ 148 .atomic_commit = drm_atomic_helper_commit 149 150 #endif 151