1b5626f6fSThomas Zimmermann /* SPDX-License-Identifier: GPL-2.0-only */ 2b5626f6fSThomas Zimmermann 3b5626f6fSThomas Zimmermann #ifndef DRM_SYSFB_HELPER_H 4b5626f6fSThomas Zimmermann #define DRM_SYSFB_HELPER_H 5b5626f6fSThomas Zimmermann 6b5626f6fSThomas Zimmermann #include <linux/container_of.h> 7b5626f6fSThomas Zimmermann #include <linux/iosys-map.h> 8b5626f6fSThomas Zimmermann 968ab3253SThomas Zimmermann #include <drm/drm_crtc.h> 10b5626f6fSThomas Zimmermann #include <drm/drm_device.h> 11b5626f6fSThomas Zimmermann #include <drm/drm_modes.h> 12b5626f6fSThomas Zimmermann 13b5626f6fSThomas Zimmermann struct drm_format_info; 14*314c45e3SThomas Zimmermann struct drm_scanout_buffer; 15*314c45e3SThomas Zimmermann 16*314c45e3SThomas Zimmermann /* 17*314c45e3SThomas Zimmermann * Display modes 18*314c45e3SThomas Zimmermann */ 19b5626f6fSThomas Zimmermann 20333376e9SThomas Zimmermann struct drm_display_mode drm_sysfb_mode(unsigned int width, 21333376e9SThomas Zimmermann unsigned int height, 22333376e9SThomas Zimmermann unsigned int width_mm, 23333376e9SThomas Zimmermann unsigned int height_mm); 24333376e9SThomas Zimmermann 25b5626f6fSThomas Zimmermann /* 26b5626f6fSThomas Zimmermann * Device 27b5626f6fSThomas Zimmermann */ 28b5626f6fSThomas Zimmermann 29b5626f6fSThomas Zimmermann struct drm_sysfb_device { 30b5626f6fSThomas Zimmermann struct drm_device dev; 31b5626f6fSThomas Zimmermann 32e7f435b3SThomas Zimmermann const u8 *edid; /* can be NULL */ 33e7f435b3SThomas Zimmermann 34b5626f6fSThomas Zimmermann /* hardware settings */ 35b5626f6fSThomas Zimmermann struct drm_display_mode fb_mode; 36b5626f6fSThomas Zimmermann const struct drm_format_info *fb_format; 37b5626f6fSThomas Zimmermann unsigned int fb_pitch; 38ea86aba4SThomas Zimmermann unsigned int fb_gamma_lut_size; 39b5626f6fSThomas Zimmermann 40b5626f6fSThomas Zimmermann /* hardware-framebuffer kernel address */ 41b5626f6fSThomas Zimmermann struct iosys_map fb_addr; 42b5626f6fSThomas Zimmermann }; 43b5626f6fSThomas Zimmermann 44b5626f6fSThomas Zimmermann static inline struct drm_sysfb_device *to_drm_sysfb_device(struct drm_device *dev) 45b5626f6fSThomas Zimmermann { 46b5626f6fSThomas Zimmermann return container_of(dev, struct drm_sysfb_device, dev); 47b5626f6fSThomas Zimmermann } 48b5626f6fSThomas Zimmermann 49559d105fSThomas Zimmermann /* 50177dfbdbSThomas Zimmermann * Plane 51177dfbdbSThomas Zimmermann */ 52177dfbdbSThomas Zimmermann 53177dfbdbSThomas Zimmermann int drm_sysfb_plane_helper_atomic_check(struct drm_plane *plane, 54177dfbdbSThomas Zimmermann struct drm_atomic_state *new_state); 55177dfbdbSThomas Zimmermann void drm_sysfb_plane_helper_atomic_update(struct drm_plane *plane, 56177dfbdbSThomas Zimmermann struct drm_atomic_state *state); 57177dfbdbSThomas Zimmermann void drm_sysfb_plane_helper_atomic_disable(struct drm_plane *plane, 58177dfbdbSThomas Zimmermann struct drm_atomic_state *state); 59177dfbdbSThomas Zimmermann int drm_sysfb_plane_helper_get_scanout_buffer(struct drm_plane *plane, 60177dfbdbSThomas Zimmermann struct drm_scanout_buffer *sb); 61177dfbdbSThomas Zimmermann 62177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_NFORMATS(_num_native) \ 63177dfbdbSThomas Zimmermann ((_num_native) + 1) 64177dfbdbSThomas Zimmermann 65177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_FORMAT_MODIFIERS \ 66177dfbdbSThomas Zimmermann DRM_FORMAT_MOD_LINEAR, \ 67177dfbdbSThomas Zimmermann DRM_FORMAT_MOD_INVALID 68177dfbdbSThomas Zimmermann 69177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_HELPER_FUNCS \ 70177dfbdbSThomas Zimmermann DRM_GEM_SHADOW_PLANE_HELPER_FUNCS, \ 71177dfbdbSThomas Zimmermann .atomic_check = drm_sysfb_plane_helper_atomic_check, \ 72177dfbdbSThomas Zimmermann .atomic_update = drm_sysfb_plane_helper_atomic_update, \ 73177dfbdbSThomas Zimmermann .atomic_disable = drm_sysfb_plane_helper_atomic_disable, \ 74177dfbdbSThomas Zimmermann .get_scanout_buffer = drm_sysfb_plane_helper_get_scanout_buffer 75177dfbdbSThomas Zimmermann 76177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_FUNCS \ 77177dfbdbSThomas Zimmermann .update_plane = drm_atomic_helper_update_plane, \ 78177dfbdbSThomas Zimmermann .disable_plane = drm_atomic_helper_disable_plane, \ 79177dfbdbSThomas Zimmermann DRM_GEM_SHADOW_PLANE_FUNCS 80177dfbdbSThomas Zimmermann 81177dfbdbSThomas Zimmermann /* 8268ab3253SThomas Zimmermann * CRTC 8368ab3253SThomas Zimmermann */ 8468ab3253SThomas Zimmermann 8568ab3253SThomas Zimmermann struct drm_sysfb_crtc_state { 8668ab3253SThomas Zimmermann struct drm_crtc_state base; 8768ab3253SThomas Zimmermann 8868ab3253SThomas Zimmermann /* Primary-plane format; required for color mgmt. */ 8968ab3253SThomas Zimmermann const struct drm_format_info *format; 9068ab3253SThomas Zimmermann }; 9168ab3253SThomas Zimmermann 9268ab3253SThomas Zimmermann static inline struct drm_sysfb_crtc_state * 9368ab3253SThomas Zimmermann to_drm_sysfb_crtc_state(struct drm_crtc_state *base) 9468ab3253SThomas Zimmermann { 9568ab3253SThomas Zimmermann return container_of(base, struct drm_sysfb_crtc_state, base); 9668ab3253SThomas Zimmermann } 9768ab3253SThomas Zimmermann 98ea86aba4SThomas Zimmermann enum drm_mode_status drm_sysfb_crtc_helper_mode_valid(struct drm_crtc *crtc, 99ea86aba4SThomas Zimmermann const struct drm_display_mode *mode); 100ea86aba4SThomas Zimmermann int drm_sysfb_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *new_state); 101ea86aba4SThomas Zimmermann 102ea86aba4SThomas Zimmermann #define DRM_SYSFB_CRTC_HELPER_FUNCS \ 103ea86aba4SThomas Zimmermann .mode_valid = drm_sysfb_crtc_helper_mode_valid, \ 104ea86aba4SThomas Zimmermann .atomic_check = drm_sysfb_crtc_helper_atomic_check 105ea86aba4SThomas Zimmermann 10668ab3253SThomas Zimmermann void drm_sysfb_crtc_reset(struct drm_crtc *crtc); 10768ab3253SThomas Zimmermann struct drm_crtc_state *drm_sysfb_crtc_atomic_duplicate_state(struct drm_crtc *crtc); 10868ab3253SThomas Zimmermann void drm_sysfb_crtc_atomic_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *crtc_state); 10968ab3253SThomas Zimmermann 11068ab3253SThomas Zimmermann #define DRM_SYSFB_CRTC_FUNCS \ 11168ab3253SThomas Zimmermann .reset = drm_sysfb_crtc_reset, \ 11268ab3253SThomas Zimmermann .set_config = drm_atomic_helper_set_config, \ 11368ab3253SThomas Zimmermann .page_flip = drm_atomic_helper_page_flip, \ 11468ab3253SThomas Zimmermann .atomic_duplicate_state = drm_sysfb_crtc_atomic_duplicate_state, \ 11568ab3253SThomas Zimmermann .atomic_destroy_state = drm_sysfb_crtc_atomic_destroy_state 11668ab3253SThomas Zimmermann 11768ab3253SThomas Zimmermann /* 11801e48e52SThomas Zimmermann * Connector 11901e48e52SThomas Zimmermann */ 12001e48e52SThomas Zimmermann 12101e48e52SThomas Zimmermann int drm_sysfb_connector_helper_get_modes(struct drm_connector *connector); 12201e48e52SThomas Zimmermann 12301e48e52SThomas Zimmermann #define DRM_SYSFB_CONNECTOR_HELPER_FUNCS \ 12401e48e52SThomas Zimmermann .get_modes = drm_sysfb_connector_helper_get_modes 12501e48e52SThomas Zimmermann 12601e48e52SThomas Zimmermann #define DRM_SYSFB_CONNECTOR_FUNCS \ 12701e48e52SThomas Zimmermann .reset = drm_atomic_helper_connector_reset, \ 12801e48e52SThomas Zimmermann .fill_modes = drm_helper_probe_single_connector_modes, \ 12901e48e52SThomas Zimmermann .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, \ 13001e48e52SThomas Zimmermann .atomic_destroy_state = drm_atomic_helper_connector_destroy_state 13101e48e52SThomas Zimmermann 13201e48e52SThomas Zimmermann /* 133559d105fSThomas Zimmermann * Mode config 134559d105fSThomas Zimmermann */ 135559d105fSThomas Zimmermann 136559d105fSThomas Zimmermann #define DRM_SYSFB_MODE_CONFIG_FUNCS \ 137559d105fSThomas Zimmermann .fb_create = drm_gem_fb_create_with_dirty, \ 138559d105fSThomas Zimmermann .atomic_check = drm_atomic_helper_check, \ 139559d105fSThomas Zimmermann .atomic_commit = drm_atomic_helper_commit 140559d105fSThomas Zimmermann 141b5626f6fSThomas Zimmermann #endif 142