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