drm_gem_vram_helper.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. #ifndef DRM_GEM_VRAM_HELPER_H
  3. #define DRM_GEM_VRAM_HELPER_H
  4. #include <drm/drm_file.h>
  5. #include <drm/drm_gem.h>
  6. #include <drm/drm_gem_ttm_helper.h>
  7. #include <drm/drm_ioctl.h>
  8. #include <drm/drm_modes.h>
  9. #include <drm/ttm/ttm_bo.h>
  10. #include <drm/ttm/ttm_placement.h>
  11. #include <linux/container_of.h>
  12. #include <linux/iosys-map.h>
  13. struct drm_mode_create_dumb;
  14. struct drm_plane;
  15. struct drm_plane_state;
  16. struct filp;
  17. struct vm_area_struct;
  18. #define DRM_GEM_VRAM_PL_FLAG_SYSTEM (1 << 0)
  19. #define DRM_GEM_VRAM_PL_FLAG_VRAM (1 << 1)
  20. #define DRM_GEM_VRAM_PL_FLAG_TOPDOWN (1 << 2)
  21. /*
  22. * Buffer-object helpers
  23. */
  24. /**
  25. * struct drm_gem_vram_object - GEM object backed by VRAM
  26. * @bo: TTM buffer object
  27. * @map: Mapping information for @bo
  28. * @placement: TTM placement information. Supported placements are %TTM_PL_VRAM
  29. * and %TTM_PL_SYSTEM
  30. * @placements: TTM placement information.
  31. *
  32. * The type struct drm_gem_vram_object represents a GEM object that is
  33. * backed by VRAM. It can be used for simple framebuffer devices with
  34. * dedicated memory. The buffer object can be evicted to system memory if
  35. * video memory becomes scarce.
  36. *
  37. * GEM VRAM objects perform reference counting for pin and mapping
  38. * operations. So a buffer object that has been pinned N times with
  39. * drm_gem_vram_pin() must be unpinned N times with
  40. * drm_gem_vram_unpin(). The same applies to pairs of
  41. * drm_gem_vram_kmap() and drm_gem_vram_kunmap(), as well as pairs of
  42. * drm_gem_vram_vmap() and drm_gem_vram_vunmap().
  43. */
  44. struct drm_gem_vram_object {
  45. struct ttm_buffer_object bo;
  46. struct iosys_map map;
  47. /**
  48. * @vmap_use_count:
  49. *
  50. * Reference count on the virtual address.
  51. * The address are un-mapped when the count reaches zero.
  52. */
  53. unsigned int vmap_use_count;
  54. /* Supported placements are %TTM_PL_VRAM and %TTM_PL_SYSTEM */
  55. struct ttm_placement placement;
  56. struct ttm_place placements[2];
  57. };
  58. /**
  59. * drm_gem_vram_of_bo - Returns the container of type
  60. * &struct drm_gem_vram_object for field bo.
  61. * @bo: the VRAM buffer object
  62. * Returns: The containing GEM VRAM object
  63. */
  64. static inline struct drm_gem_vram_object *drm_gem_vram_of_bo(
  65. struct ttm_buffer_object *bo)
  66. {
  67. return container_of(bo, struct drm_gem_vram_object, bo);
  68. }
  69. /**
  70. * drm_gem_vram_of_gem - Returns the container of type
  71. * &struct drm_gem_vram_object for field gem.
  72. * @gem: the GEM object
  73. * Returns: The containing GEM VRAM object
  74. */
  75. static inline struct drm_gem_vram_object *drm_gem_vram_of_gem(
  76. struct drm_gem_object *gem)
  77. {
  78. return container_of(gem, struct drm_gem_vram_object, bo.base);
  79. }
  80. struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev,
  81. size_t size,
  82. unsigned long pg_align);
  83. void drm_gem_vram_put(struct drm_gem_vram_object *gbo);
  84. s64 drm_gem_vram_offset(struct drm_gem_vram_object *gbo);
  85. int drm_gem_vram_vmap(struct drm_gem_vram_object *gbo, struct iosys_map *map);
  86. void drm_gem_vram_vunmap(struct drm_gem_vram_object *gbo,
  87. struct iosys_map *map);
  88. int drm_gem_vram_fill_create_dumb(struct drm_file *file,
  89. struct drm_device *dev,
  90. unsigned long pg_align,
  91. unsigned long pitch_align,
  92. struct drm_mode_create_dumb *args);
  93. /*
  94. * Helpers for struct drm_driver
  95. */
  96. int drm_gem_vram_driver_dumb_create(struct drm_file *file,
  97. struct drm_device *dev,
  98. struct drm_mode_create_dumb *args);
  99. /*
  100. * Helpers for struct drm_plane_helper_funcs
  101. */
  102. int
  103. drm_gem_vram_plane_helper_prepare_fb(struct drm_plane *plane,
  104. struct drm_plane_state *new_state);
  105. void
  106. drm_gem_vram_plane_helper_cleanup_fb(struct drm_plane *plane,
  107. struct drm_plane_state *old_state);
  108. /**
  109. * DRM_GEM_VRAM_PLANE_HELPER_FUNCS - Initializes struct drm_plane_helper_funcs
  110. * for VRAM handling
  111. *
  112. * Drivers may use GEM BOs as VRAM helpers for the framebuffer memory. This
  113. * macro initializes struct drm_plane_helper_funcs to use the respective helper
  114. * functions.
  115. */
  116. #define DRM_GEM_VRAM_PLANE_HELPER_FUNCS \
  117. .prepare_fb = drm_gem_vram_plane_helper_prepare_fb, \
  118. .cleanup_fb = drm_gem_vram_plane_helper_cleanup_fb
  119. /**
  120. * define DRM_GEM_VRAM_DRIVER - default callback functions for
  121. * &struct drm_driver
  122. *
  123. * Drivers that use VRAM MM and GEM VRAM can use this macro to initialize
  124. * &struct drm_driver with default functions.
  125. */
  126. #define DRM_GEM_VRAM_DRIVER \
  127. .debugfs_init = drm_vram_mm_debugfs_init, \
  128. .dumb_create = drm_gem_vram_driver_dumb_create, \
  129. .dumb_map_offset = drm_gem_ttm_dumb_map_offset
  130. /*
  131. * VRAM memory manager
  132. */
  133. /**
  134. * struct drm_vram_mm - An instance of VRAM MM
  135. * @vram_base: Base address of the managed video memory
  136. * @vram_size: Size of the managed video memory in bytes
  137. * @bdev: The TTM BO device.
  138. *
  139. * The fields &struct drm_vram_mm.vram_base and
  140. * &struct drm_vram_mm.vrm_size are managed by VRAM MM, but are
  141. * available for public read access. Use the field
  142. * &struct drm_vram_mm.bdev to access the TTM BO device.
  143. */
  144. struct drm_vram_mm {
  145. uint64_t vram_base;
  146. size_t vram_size;
  147. struct ttm_device bdev;
  148. };
  149. /**
  150. * drm_vram_mm_of_bdev() - Returns the container of type &struct ttm_device for
  151. * field bdev.
  152. * @bdev: the TTM BO device
  153. *
  154. * Returns:
  155. * The containing instance of &struct drm_vram_mm
  156. */
  157. static inline struct drm_vram_mm *drm_vram_mm_of_bdev(
  158. struct ttm_device *bdev)
  159. {
  160. return container_of(bdev, struct drm_vram_mm, bdev);
  161. }
  162. void drm_vram_mm_debugfs_init(struct drm_minor *minor);
  163. /*
  164. * Helpers for integration with struct drm_device
  165. */
  166. int drmm_vram_helper_init(struct drm_device *dev, uint64_t vram_base,
  167. size_t vram_size);
  168. /*
  169. * Mode-config helpers
  170. */
  171. enum drm_mode_status
  172. drm_vram_helper_mode_valid(struct drm_device *dev,
  173. const struct drm_display_mode *mode);
  174. #endif