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 9e8c08688SThomas Zimmermann #include <video/pixel_format.h> 10e8c08688SThomas Zimmermann 1168ab3253SThomas Zimmermann #include <drm/drm_crtc.h> 12b5626f6fSThomas Zimmermann #include <drm/drm_device.h> 13b5626f6fSThomas Zimmermann #include <drm/drm_modes.h> 14b5626f6fSThomas Zimmermann 15b5626f6fSThomas Zimmermann struct drm_format_info; 16314c45e3SThomas Zimmermann struct drm_scanout_buffer; 17e8c08688SThomas Zimmermann struct screen_info; 18e8c08688SThomas Zimmermann 19e8c08688SThomas Zimmermann /* 20e8c08688SThomas Zimmermann * Input parsing 21e8c08688SThomas Zimmermann */ 22e8c08688SThomas Zimmermann 23e8c08688SThomas Zimmermann struct drm_sysfb_format { 24e8c08688SThomas Zimmermann struct pixel_format pixel; 25e8c08688SThomas Zimmermann u32 fourcc; 26e8c08688SThomas Zimmermann }; 27e8c08688SThomas Zimmermann 28e8c08688SThomas Zimmermann int drm_sysfb_get_validated_int(struct drm_device *dev, const char *name, 29e8c08688SThomas Zimmermann u64 value, u32 max); 30e8c08688SThomas Zimmermann int drm_sysfb_get_validated_int0(struct drm_device *dev, const char *name, 31e8c08688SThomas Zimmermann u64 value, u32 max); 32e8c08688SThomas Zimmermann 33e8c08688SThomas Zimmermann #if defined(CONFIG_SCREEN_INFO) 34e8c08688SThomas Zimmermann int drm_sysfb_get_width_si(struct drm_device *dev, const struct screen_info *si); 35e8c08688SThomas Zimmermann int drm_sysfb_get_height_si(struct drm_device *dev, const struct screen_info *si); 36e8c08688SThomas Zimmermann struct resource *drm_sysfb_get_memory_si(struct drm_device *dev, 37e8c08688SThomas Zimmermann const struct screen_info *si, 38e8c08688SThomas Zimmermann struct resource *res); 39e8c08688SThomas Zimmermann int drm_sysfb_get_stride_si(struct drm_device *dev, const struct screen_info *si, 40e8c08688SThomas Zimmermann const struct drm_format_info *format, 41e8c08688SThomas Zimmermann unsigned int width, unsigned int height, u64 size); 42e8c08688SThomas Zimmermann u64 drm_sysfb_get_visible_size_si(struct drm_device *dev, const struct screen_info *si, 43e8c08688SThomas Zimmermann unsigned int height, unsigned int stride, u64 size); 44e8c08688SThomas Zimmermann const struct drm_format_info *drm_sysfb_get_format_si(struct drm_device *dev, 45e8c08688SThomas Zimmermann const struct drm_sysfb_format *formats, 46e8c08688SThomas Zimmermann size_t nformats, 47e8c08688SThomas Zimmermann const struct screen_info *si); 48e8c08688SThomas Zimmermann #endif 49314c45e3SThomas Zimmermann 50314c45e3SThomas Zimmermann /* 516046b49bSThomas Zimmermann * Input parsing 526046b49bSThomas Zimmermann */ 536046b49bSThomas Zimmermann 546046b49bSThomas Zimmermann int drm_sysfb_get_validated_int(struct drm_device *dev, const char *name, 556046b49bSThomas Zimmermann u64 value, u32 max); 566046b49bSThomas Zimmermann int drm_sysfb_get_validated_int0(struct drm_device *dev, const char *name, 576046b49bSThomas Zimmermann u64 value, u32 max); 586046b49bSThomas Zimmermann 596046b49bSThomas Zimmermann /* 60314c45e3SThomas Zimmermann * Display modes 61314c45e3SThomas Zimmermann */ 62b5626f6fSThomas Zimmermann 63333376e9SThomas Zimmermann struct drm_display_mode drm_sysfb_mode(unsigned int width, 64333376e9SThomas Zimmermann unsigned int height, 65333376e9SThomas Zimmermann unsigned int width_mm, 66333376e9SThomas Zimmermann unsigned int height_mm); 67333376e9SThomas Zimmermann 68b5626f6fSThomas Zimmermann /* 69b5626f6fSThomas Zimmermann * Device 70b5626f6fSThomas Zimmermann */ 71b5626f6fSThomas Zimmermann 72b5626f6fSThomas Zimmermann struct drm_sysfb_device { 73b5626f6fSThomas Zimmermann struct drm_device dev; 74b5626f6fSThomas Zimmermann 75e7f435b3SThomas Zimmermann const u8 *edid; /* can be NULL */ 76e7f435b3SThomas Zimmermann 77b5626f6fSThomas Zimmermann /* hardware settings */ 78b5626f6fSThomas Zimmermann struct drm_display_mode fb_mode; 79b5626f6fSThomas Zimmermann const struct drm_format_info *fb_format; 80b5626f6fSThomas Zimmermann unsigned int fb_pitch; 81ea86aba4SThomas Zimmermann unsigned int fb_gamma_lut_size; 82b5626f6fSThomas Zimmermann 83b5626f6fSThomas Zimmermann /* hardware-framebuffer kernel address */ 84b5626f6fSThomas Zimmermann struct iosys_map fb_addr; 85b5626f6fSThomas Zimmermann }; 86b5626f6fSThomas Zimmermann 87b5626f6fSThomas Zimmermann static inline struct drm_sysfb_device *to_drm_sysfb_device(struct drm_device *dev) 88b5626f6fSThomas Zimmermann { 89b5626f6fSThomas Zimmermann return container_of(dev, struct drm_sysfb_device, dev); 90b5626f6fSThomas Zimmermann } 91b5626f6fSThomas Zimmermann 92559d105fSThomas Zimmermann /* 93177dfbdbSThomas Zimmermann * Plane 94177dfbdbSThomas Zimmermann */ 95177dfbdbSThomas Zimmermann 96*1a45ef02SThomas Zimmermann size_t drm_sysfb_build_fourcc_list(struct drm_device *dev, 97*1a45ef02SThomas Zimmermann const u32 *native_fourccs, size_t native_nfourccs, 98*1a45ef02SThomas Zimmermann u32 *fourccs_out, size_t nfourccs_out); 99*1a45ef02SThomas Zimmermann 100177dfbdbSThomas Zimmermann int drm_sysfb_plane_helper_atomic_check(struct drm_plane *plane, 101177dfbdbSThomas Zimmermann struct drm_atomic_state *new_state); 102177dfbdbSThomas Zimmermann void drm_sysfb_plane_helper_atomic_update(struct drm_plane *plane, 103177dfbdbSThomas Zimmermann struct drm_atomic_state *state); 104177dfbdbSThomas Zimmermann void drm_sysfb_plane_helper_atomic_disable(struct drm_plane *plane, 105177dfbdbSThomas Zimmermann struct drm_atomic_state *state); 106177dfbdbSThomas Zimmermann int drm_sysfb_plane_helper_get_scanout_buffer(struct drm_plane *plane, 107177dfbdbSThomas Zimmermann struct drm_scanout_buffer *sb); 108177dfbdbSThomas Zimmermann 109177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_NFORMATS(_num_native) \ 110177dfbdbSThomas Zimmermann ((_num_native) + 1) 111177dfbdbSThomas Zimmermann 112177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_FORMAT_MODIFIERS \ 113177dfbdbSThomas Zimmermann DRM_FORMAT_MOD_LINEAR, \ 114177dfbdbSThomas Zimmermann DRM_FORMAT_MOD_INVALID 115177dfbdbSThomas Zimmermann 116177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_HELPER_FUNCS \ 117177dfbdbSThomas Zimmermann DRM_GEM_SHADOW_PLANE_HELPER_FUNCS, \ 118177dfbdbSThomas Zimmermann .atomic_check = drm_sysfb_plane_helper_atomic_check, \ 119177dfbdbSThomas Zimmermann .atomic_update = drm_sysfb_plane_helper_atomic_update, \ 120177dfbdbSThomas Zimmermann .atomic_disable = drm_sysfb_plane_helper_atomic_disable, \ 121177dfbdbSThomas Zimmermann .get_scanout_buffer = drm_sysfb_plane_helper_get_scanout_buffer 122177dfbdbSThomas Zimmermann 123177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_FUNCS \ 124177dfbdbSThomas Zimmermann .update_plane = drm_atomic_helper_update_plane, \ 125177dfbdbSThomas Zimmermann .disable_plane = drm_atomic_helper_disable_plane, \ 126177dfbdbSThomas Zimmermann DRM_GEM_SHADOW_PLANE_FUNCS 127177dfbdbSThomas Zimmermann 128177dfbdbSThomas Zimmermann /* 12968ab3253SThomas Zimmermann * CRTC 13068ab3253SThomas Zimmermann */ 13168ab3253SThomas Zimmermann 13268ab3253SThomas Zimmermann struct drm_sysfb_crtc_state { 13368ab3253SThomas Zimmermann struct drm_crtc_state base; 13468ab3253SThomas Zimmermann 13568ab3253SThomas Zimmermann /* Primary-plane format; required for color mgmt. */ 13668ab3253SThomas Zimmermann const struct drm_format_info *format; 13768ab3253SThomas Zimmermann }; 13868ab3253SThomas Zimmermann 13968ab3253SThomas Zimmermann static inline struct drm_sysfb_crtc_state * 14068ab3253SThomas Zimmermann to_drm_sysfb_crtc_state(struct drm_crtc_state *base) 14168ab3253SThomas Zimmermann { 14268ab3253SThomas Zimmermann return container_of(base, struct drm_sysfb_crtc_state, base); 14368ab3253SThomas Zimmermann } 14468ab3253SThomas Zimmermann 145ea86aba4SThomas Zimmermann enum drm_mode_status drm_sysfb_crtc_helper_mode_valid(struct drm_crtc *crtc, 146ea86aba4SThomas Zimmermann const struct drm_display_mode *mode); 147ea86aba4SThomas Zimmermann int drm_sysfb_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *new_state); 148ea86aba4SThomas Zimmermann 149ea86aba4SThomas Zimmermann #define DRM_SYSFB_CRTC_HELPER_FUNCS \ 150ea86aba4SThomas Zimmermann .mode_valid = drm_sysfb_crtc_helper_mode_valid, \ 151ea86aba4SThomas Zimmermann .atomic_check = drm_sysfb_crtc_helper_atomic_check 152ea86aba4SThomas Zimmermann 15368ab3253SThomas Zimmermann void drm_sysfb_crtc_reset(struct drm_crtc *crtc); 15468ab3253SThomas Zimmermann struct drm_crtc_state *drm_sysfb_crtc_atomic_duplicate_state(struct drm_crtc *crtc); 15568ab3253SThomas Zimmermann void drm_sysfb_crtc_atomic_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *crtc_state); 15668ab3253SThomas Zimmermann 15768ab3253SThomas Zimmermann #define DRM_SYSFB_CRTC_FUNCS \ 15868ab3253SThomas Zimmermann .reset = drm_sysfb_crtc_reset, \ 15968ab3253SThomas Zimmermann .set_config = drm_atomic_helper_set_config, \ 16068ab3253SThomas Zimmermann .page_flip = drm_atomic_helper_page_flip, \ 16168ab3253SThomas Zimmermann .atomic_duplicate_state = drm_sysfb_crtc_atomic_duplicate_state, \ 16268ab3253SThomas Zimmermann .atomic_destroy_state = drm_sysfb_crtc_atomic_destroy_state 16368ab3253SThomas Zimmermann 16468ab3253SThomas Zimmermann /* 16501e48e52SThomas Zimmermann * Connector 16601e48e52SThomas Zimmermann */ 16701e48e52SThomas Zimmermann 16801e48e52SThomas Zimmermann int drm_sysfb_connector_helper_get_modes(struct drm_connector *connector); 16901e48e52SThomas Zimmermann 17001e48e52SThomas Zimmermann #define DRM_SYSFB_CONNECTOR_HELPER_FUNCS \ 17101e48e52SThomas Zimmermann .get_modes = drm_sysfb_connector_helper_get_modes 17201e48e52SThomas Zimmermann 17301e48e52SThomas Zimmermann #define DRM_SYSFB_CONNECTOR_FUNCS \ 17401e48e52SThomas Zimmermann .reset = drm_atomic_helper_connector_reset, \ 17501e48e52SThomas Zimmermann .fill_modes = drm_helper_probe_single_connector_modes, \ 17601e48e52SThomas Zimmermann .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, \ 17701e48e52SThomas Zimmermann .atomic_destroy_state = drm_atomic_helper_connector_destroy_state 17801e48e52SThomas Zimmermann 17901e48e52SThomas Zimmermann /* 180559d105fSThomas Zimmermann * Mode config 181559d105fSThomas Zimmermann */ 182559d105fSThomas Zimmermann 183559d105fSThomas Zimmermann #define DRM_SYSFB_MODE_CONFIG_FUNCS \ 184559d105fSThomas Zimmermann .fb_create = drm_gem_fb_create_with_dirty, \ 185559d105fSThomas Zimmermann .atomic_check = drm_atomic_helper_check, \ 186559d105fSThomas Zimmermann .atomic_commit = drm_atomic_helper_commit 187559d105fSThomas Zimmermann 188b5626f6fSThomas Zimmermann #endif 189