drm_sysfb_helper.h 6.4 KB

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