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