amdxdna_gem.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2024, Advanced Micro Devices, Inc.
  4. */
  5. #ifndef _AMDXDNA_GEM_H_
  6. #define _AMDXDNA_GEM_H_
  7. #include <linux/hmm.h>
  8. #include "amdxdna_pci_drv.h"
  9. struct amdxdna_umap {
  10. struct vm_area_struct *vma;
  11. struct mmu_interval_notifier notifier;
  12. struct hmm_range range;
  13. struct work_struct hmm_unreg_work;
  14. struct amdxdna_gem_obj *abo;
  15. struct list_head node;
  16. struct kref refcnt;
  17. bool invalid;
  18. bool unmapped;
  19. };
  20. struct amdxdna_mem {
  21. u64 userptr;
  22. void *kva;
  23. u64 dev_addr;
  24. size_t size;
  25. struct page **pages;
  26. u32 nr_pages;
  27. struct list_head umap_list;
  28. bool map_invalid;
  29. };
  30. struct amdxdna_gem_obj {
  31. struct drm_gem_shmem_object base;
  32. struct amdxdna_client *client;
  33. u8 type;
  34. bool pinned;
  35. struct mutex lock; /* Protects: pinned */
  36. struct amdxdna_mem mem;
  37. /* Below members is uninitialized when needed */
  38. struct drm_mm mm; /* For AMDXDNA_BO_DEV_HEAP */
  39. struct drm_mm_node mm_node; /* For AMDXDNA_BO_DEV */
  40. u32 assigned_hwctx;
  41. struct dma_buf *dma_buf;
  42. struct dma_buf_attachment *attach;
  43. };
  44. #define to_gobj(obj) (&(obj)->base.base)
  45. #define is_import_bo(obj) ((obj)->attach)
  46. static inline struct amdxdna_gem_obj *to_xdna_obj(struct drm_gem_object *gobj)
  47. {
  48. return container_of(gobj, struct amdxdna_gem_obj, base.base);
  49. }
  50. struct amdxdna_gem_obj *amdxdna_gem_get_obj(struct amdxdna_client *client,
  51. u32 bo_hdl, u8 bo_type);
  52. static inline void amdxdna_gem_put_obj(struct amdxdna_gem_obj *abo)
  53. {
  54. drm_gem_object_put(to_gobj(abo));
  55. }
  56. static inline u64 amdxdna_dev_bo_offset(struct amdxdna_gem_obj *abo)
  57. {
  58. return abo->mem.dev_addr - abo->client->dev_heap->mem.dev_addr;
  59. }
  60. void amdxdna_umap_put(struct amdxdna_umap *mapp);
  61. struct drm_gem_object *
  62. amdxdna_gem_create_object_cb(struct drm_device *dev, size_t size);
  63. struct drm_gem_object *
  64. amdxdna_gem_prime_import(struct drm_device *dev, struct dma_buf *dma_buf);
  65. struct amdxdna_gem_obj *
  66. amdxdna_drm_alloc_dev_bo(struct drm_device *dev,
  67. struct amdxdna_drm_create_bo *args,
  68. struct drm_file *filp);
  69. int amdxdna_gem_pin_nolock(struct amdxdna_gem_obj *abo);
  70. int amdxdna_gem_pin(struct amdxdna_gem_obj *abo);
  71. void amdxdna_gem_unpin(struct amdxdna_gem_obj *abo);
  72. int amdxdna_drm_create_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *filp);
  73. int amdxdna_drm_get_bo_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp);
  74. int amdxdna_drm_sync_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *filp);
  75. #endif /* _AMDXDNA_GEM_H_ */