drm_gem_ttm_helper.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. #include <linux/export.h>
  3. #include <linux/module.h>
  4. #include <drm/drm_gem_ttm_helper.h>
  5. #include <drm/drm_print.h>
  6. #include <drm/ttm/ttm_placement.h>
  7. #include <drm/ttm/ttm_tt.h>
  8. /**
  9. * DOC: overview
  10. *
  11. * This library provides helper functions for gem objects backed by
  12. * ttm.
  13. */
  14. /**
  15. * drm_gem_ttm_print_info() - Print &ttm_buffer_object info for debugfs
  16. * @p: DRM printer
  17. * @indent: Tab indentation level
  18. * @gem: GEM object
  19. *
  20. * This function can be used as &drm_gem_object_funcs.print_info
  21. * callback.
  22. */
  23. void drm_gem_ttm_print_info(struct drm_printer *p, unsigned int indent,
  24. const struct drm_gem_object *gem)
  25. {
  26. static const char * const plname[] = {
  27. [ TTM_PL_SYSTEM ] = "system",
  28. [ TTM_PL_TT ] = "tt",
  29. [ TTM_PL_VRAM ] = "vram",
  30. [ TTM_PL_PRIV ] = "priv",
  31. [ 16 ] = "cached",
  32. [ 17 ] = "uncached",
  33. [ 18 ] = "wc",
  34. [ 19 ] = "contig",
  35. [ 21 ] = "pinned", /* NO_EVICT */
  36. [ 22 ] = "topdown",
  37. };
  38. const struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem);
  39. drm_printf_indent(p, indent, "placement=");
  40. drm_print_bits(p, bo->resource->placement, plname, ARRAY_SIZE(plname));
  41. drm_printf(p, "\n");
  42. if (bo->resource->bus.is_iomem)
  43. drm_printf_indent(p, indent, "bus.offset=%lx\n",
  44. (unsigned long)bo->resource->bus.offset);
  45. }
  46. EXPORT_SYMBOL(drm_gem_ttm_print_info);
  47. /**
  48. * drm_gem_ttm_vmap() - vmap &ttm_buffer_object
  49. * @gem: GEM object.
  50. * @map: [out] returns the dma-buf mapping.
  51. *
  52. * Maps a GEM object with ttm_bo_vmap(). This function can be used as
  53. * &drm_gem_object_funcs.vmap callback.
  54. *
  55. * Returns:
  56. * 0 on success, or a negative errno code otherwise.
  57. */
  58. int drm_gem_ttm_vmap(struct drm_gem_object *gem,
  59. struct iosys_map *map)
  60. {
  61. struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem);
  62. return ttm_bo_vmap(bo, map);
  63. }
  64. EXPORT_SYMBOL(drm_gem_ttm_vmap);
  65. /**
  66. * drm_gem_ttm_vunmap() - vunmap &ttm_buffer_object
  67. * @gem: GEM object.
  68. * @map: dma-buf mapping.
  69. *
  70. * Unmaps a GEM object with ttm_bo_vunmap(). This function can be used as
  71. * &drm_gem_object_funcs.vmap callback.
  72. */
  73. void drm_gem_ttm_vunmap(struct drm_gem_object *gem,
  74. struct iosys_map *map)
  75. {
  76. struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem);
  77. ttm_bo_vunmap(bo, map);
  78. }
  79. EXPORT_SYMBOL(drm_gem_ttm_vunmap);
  80. /**
  81. * drm_gem_ttm_mmap() - mmap &ttm_buffer_object
  82. * @gem: GEM object.
  83. * @vma: vm area.
  84. *
  85. * This function can be used as &drm_gem_object_funcs.mmap
  86. * callback.
  87. */
  88. int drm_gem_ttm_mmap(struct drm_gem_object *gem,
  89. struct vm_area_struct *vma)
  90. {
  91. struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem);
  92. int ret;
  93. ret = ttm_bo_mmap_obj(vma, bo);
  94. if (ret < 0)
  95. return ret;
  96. /*
  97. * ttm has its own object refcounting, so drop gem reference
  98. * to avoid double accounting counting.
  99. */
  100. drm_gem_object_put(gem);
  101. return 0;
  102. }
  103. EXPORT_SYMBOL(drm_gem_ttm_mmap);
  104. /**
  105. * drm_gem_ttm_dumb_map_offset() - Implements struct &drm_driver.dumb_map_offset
  106. * @file: DRM file pointer.
  107. * @dev: DRM device.
  108. * @handle: GEM handle
  109. * @offset: Returns the mapping's memory offset on success
  110. *
  111. * Provides an implementation of struct &drm_driver.dumb_map_offset for
  112. * TTM-based GEM drivers. TTM allocates the offset internally and
  113. * drm_gem_ttm_dumb_map_offset() returns it for dumb-buffer implementations.
  114. *
  115. * See struct &drm_driver.dumb_map_offset.
  116. *
  117. * Returns:
  118. * 0 on success, or a negative errno code otherwise.
  119. */
  120. int drm_gem_ttm_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
  121. uint32_t handle, uint64_t *offset)
  122. {
  123. struct drm_gem_object *gem;
  124. gem = drm_gem_object_lookup(file, handle);
  125. if (!gem)
  126. return -ENOENT;
  127. *offset = drm_vma_node_offset_addr(&gem->vma_node);
  128. drm_gem_object_put(gem);
  129. return 0;
  130. }
  131. EXPORT_SYMBOL(drm_gem_ttm_dumb_map_offset);
  132. MODULE_DESCRIPTION("DRM gem ttm helpers");
  133. MODULE_LICENSE("GPL");