lsdc_ttm.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * Copyright (C) 2023 Loongson Technology Corporation Limited
  4. */
  5. #ifndef __LSDC_TTM_H__
  6. #define __LSDC_TTM_H__
  7. #include <linux/container_of.h>
  8. #include <linux/iosys-map.h>
  9. #include <linux/list.h>
  10. #include <drm/drm_gem.h>
  11. #include <drm/ttm/ttm_bo.h>
  12. #include <drm/ttm/ttm_placement.h>
  13. #include <drm/ttm/ttm_range_manager.h>
  14. #include <drm/ttm/ttm_tt.h>
  15. #define LSDC_GEM_DOMAIN_SYSTEM 0x1
  16. #define LSDC_GEM_DOMAIN_GTT 0x2
  17. #define LSDC_GEM_DOMAIN_VRAM 0x4
  18. struct lsdc_bo {
  19. struct ttm_buffer_object tbo;
  20. /* Protected by gem.mutex */
  21. struct list_head list;
  22. struct iosys_map map;
  23. unsigned int vmap_count;
  24. /* cross device driver sharing reference count */
  25. unsigned int sharing_count;
  26. struct ttm_bo_kmap_obj kmap;
  27. void *kptr;
  28. bool is_iomem;
  29. size_t size;
  30. u32 initial_domain;
  31. struct ttm_placement placement;
  32. struct ttm_place placements[4];
  33. };
  34. static inline struct ttm_buffer_object *to_ttm_bo(struct drm_gem_object *gem)
  35. {
  36. return container_of(gem, struct ttm_buffer_object, base);
  37. }
  38. static inline struct lsdc_bo *to_lsdc_bo(struct ttm_buffer_object *tbo)
  39. {
  40. return container_of(tbo, struct lsdc_bo, tbo);
  41. }
  42. static inline struct lsdc_bo *gem_to_lsdc_bo(struct drm_gem_object *gem)
  43. {
  44. return container_of(gem, struct lsdc_bo, tbo.base);
  45. }
  46. const char *lsdc_mem_type_to_str(uint32_t mem_type);
  47. const char *lsdc_domain_to_str(u32 domain);
  48. struct lsdc_bo *lsdc_bo_create(struct drm_device *ddev,
  49. u32 domain,
  50. size_t size,
  51. bool kernel,
  52. struct sg_table *sg,
  53. struct dma_resv *resv);
  54. struct lsdc_bo *lsdc_bo_create_kernel_pinned(struct drm_device *ddev,
  55. u32 domain,
  56. size_t size);
  57. void lsdc_bo_free_kernel_pinned(struct lsdc_bo *lbo);
  58. int lsdc_bo_reserve(struct lsdc_bo *lbo);
  59. void lsdc_bo_unreserve(struct lsdc_bo *lbo);
  60. int lsdc_bo_pin(struct lsdc_bo *lbo, u32 domain, u64 *gpu_addr);
  61. void lsdc_bo_unpin(struct lsdc_bo *lbo);
  62. void lsdc_bo_ref(struct lsdc_bo *lbo);
  63. void lsdc_bo_unref(struct lsdc_bo *lbo);
  64. u64 lsdc_bo_gpu_offset(struct lsdc_bo *lbo);
  65. size_t lsdc_bo_size(struct lsdc_bo *lbo);
  66. int lsdc_bo_kmap(struct lsdc_bo *lbo);
  67. void lsdc_bo_kunmap(struct lsdc_bo *lbo);
  68. void lsdc_bo_clear(struct lsdc_bo *lbo);
  69. int lsdc_bo_evict_vram(struct drm_device *ddev);
  70. int lsdc_ttm_init(struct lsdc_device *ldev);
  71. void lsdc_ttm_debugfs_init(struct lsdc_device *ldev);
  72. #endif