• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef NOUVEAU_BO
2 #define NOUVEAU_BO 1
3 
4 #include "nouveau_private.h"
5 
6 #include "nouveau_device.h"
7 
8 #ifdef __cplusplus
9 #include <atomic>
10 using std::atomic_uint_fast32_t;
11 #else
12 #include <stdatomic.h>
13 #endif
14 
15 #include <sys/mman.h>
16 
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20 
21 enum nouveau_ws_bo_flags {
22    /* vram or gart depending on GPU */
23    NOUVEAU_WS_BO_LOCAL = 0 << 0,
24    NOUVEAU_WS_BO_GART  = 1 << 0,
25    NOUVEAU_WS_BO_MAP   = 1 << 1,
26    NOUVEAU_WS_BO_NO_SHARE = 1 << 2,
27 };
28 
29 enum nouveau_ws_bo_map_flags {
30    NOUVEAU_WS_BO_RD   = 1 << 0,
31    NOUVEAU_WS_BO_WR   = 1 << 1,
32    NOUVEAU_WS_BO_RDWR = NOUVEAU_WS_BO_RD | NOUVEAU_WS_BO_WR,
33 };
34 
35 struct nouveau_ws_bo {
36    uint64_t size;
37    uint64_t offset;
38    uint64_t align;
39    uint64_t map_handle;
40    struct nouveau_ws_device *dev;
41    uint32_t handle;
42    enum nouveau_ws_bo_flags flags;
43    atomic_uint_fast32_t refcnt;
44 };
45 
46 uint64_t nouveau_ws_alloc_vma(struct nouveau_ws_device *dev,
47                               uint64_t addr, uint64_t size, uint64_t align,
48                               bool bda, bool sparse);
49 
50 void nouveau_ws_free_vma(struct nouveau_ws_device *dev,
51                          uint64_t offset, uint64_t size,
52                          bool bda, bool sparse);
53 
54 void nouveau_ws_bo_bind_vma(struct nouveau_ws_device *dev,
55                             struct nouveau_ws_bo *bo,
56                             uint64_t addr,
57                             uint64_t range,
58                             uint64_t bo_offset,
59                             uint32_t pte_kind);
60 void nouveau_ws_bo_unbind_vma(struct nouveau_ws_device *dev,
61                               uint64_t offset, uint64_t range);
62 
63 struct nouveau_ws_bo *nouveau_ws_bo_new(struct nouveau_ws_device *,
64                                         uint64_t size, uint64_t align,
65                                         enum nouveau_ws_bo_flags);
66 struct nouveau_ws_bo *nouveau_ws_bo_new_mapped(struct nouveau_ws_device *,
67                                                uint64_t size, uint64_t align,
68                                                enum nouveau_ws_bo_flags,
69                                                enum nouveau_ws_bo_map_flags map_flags,
70                                                void **map_out);
71 struct nouveau_ws_bo *nouveau_ws_bo_from_dma_buf(struct nouveau_ws_device *,
72                                                  int fd);
73 void nouveau_ws_bo_destroy(struct nouveau_ws_bo *);
74 void *nouveau_ws_bo_map(struct nouveau_ws_bo *,
75                         enum nouveau_ws_bo_map_flags,
76                         void *fixed_addr);
77 bool nouveau_ws_bo_wait(struct nouveau_ws_bo *, enum nouveau_ws_bo_map_flags flags);
78 int nouveau_ws_bo_dma_buf(struct nouveau_ws_bo *, int *fd);
79 
80 static inline void
nouveau_ws_bo_ref(struct nouveau_ws_bo * bo)81 nouveau_ws_bo_ref(struct nouveau_ws_bo *bo)
82 {
83    bo->refcnt++;
84 }
85 
86 static inline void
nouveau_ws_bo_unmap(struct nouveau_ws_bo * bo,void * ptr)87 nouveau_ws_bo_unmap(struct nouveau_ws_bo *bo, void *ptr)
88 {
89    munmap(ptr, bo->size);
90 }
91 
92 static inline int
nouveau_ws_bo_overmap(struct nouveau_ws_bo * bo,void * ptr)93 nouveau_ws_bo_overmap(struct nouveau_ws_bo *bo, void *ptr)
94 {
95    void *map = mmap(ptr, bo->size, PROT_NONE,
96                     MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
97    return map == MAP_FAILED ? -1 : 0;
98 }
99 
100 #ifdef __cplusplus
101 }
102 #endif
103 
104 #endif
105