drm_gem_ttm_helper.c 3.8 KB

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