xref: /aosp_15_r20/external/mesa3d/src/nouveau/vulkan/nvkmd/nvkmd.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2024 Collabora Ltd. and Red Hat Inc.
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #include "nvkmd.h"
7*61046927SAndroid Build Coastguard Worker #include "nouveau/nvkmd_nouveau.h"
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker void
nvkmd_mem_init(struct nvkmd_dev * dev,struct nvkmd_mem * mem,const struct nvkmd_mem_ops * ops,enum nvkmd_mem_flags flags,uint64_t size_B,uint32_t bind_align_B)12*61046927SAndroid Build Coastguard Worker nvkmd_mem_init(struct nvkmd_dev *dev,
13*61046927SAndroid Build Coastguard Worker                struct nvkmd_mem *mem,
14*61046927SAndroid Build Coastguard Worker                const struct nvkmd_mem_ops *ops,
15*61046927SAndroid Build Coastguard Worker                enum nvkmd_mem_flags flags,
16*61046927SAndroid Build Coastguard Worker                uint64_t size_B,
17*61046927SAndroid Build Coastguard Worker                uint32_t bind_align_B)
18*61046927SAndroid Build Coastguard Worker {
19*61046927SAndroid Build Coastguard Worker    *mem = (struct nvkmd_mem) {
20*61046927SAndroid Build Coastguard Worker       .ops = ops,
21*61046927SAndroid Build Coastguard Worker       .dev = dev,
22*61046927SAndroid Build Coastguard Worker       .refcnt = 1,
23*61046927SAndroid Build Coastguard Worker       .flags = flags,
24*61046927SAndroid Build Coastguard Worker       .bind_align_B = bind_align_B,
25*61046927SAndroid Build Coastguard Worker       .size_B = size_B,
26*61046927SAndroid Build Coastguard Worker    };
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker    simple_mtx_init(&mem->map_mutex, mtx_plain);
29*61046927SAndroid Build Coastguard Worker }
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker VkResult
nvkmd_try_create_pdev_for_drm(struct _drmDevice * drm_device,struct vk_object_base * log_obj,enum nvk_debug debug_flags,struct nvkmd_pdev ** pdev_out)32*61046927SAndroid Build Coastguard Worker nvkmd_try_create_pdev_for_drm(struct _drmDevice *drm_device,
33*61046927SAndroid Build Coastguard Worker                               struct vk_object_base *log_obj,
34*61046927SAndroid Build Coastguard Worker                               enum nvk_debug debug_flags,
35*61046927SAndroid Build Coastguard Worker                               struct nvkmd_pdev **pdev_out)
36*61046927SAndroid Build Coastguard Worker {
37*61046927SAndroid Build Coastguard Worker    return nvkmd_nouveau_try_create_pdev(drm_device, log_obj,
38*61046927SAndroid Build Coastguard Worker                                         debug_flags, pdev_out);
39*61046927SAndroid Build Coastguard Worker }
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker VkResult
nvkmd_dev_alloc_mapped_mem(struct nvkmd_dev * dev,struct vk_object_base * log_obj,uint64_t size_B,uint64_t align_B,enum nvkmd_mem_flags flags,enum nvkmd_mem_map_flags map_flags,struct nvkmd_mem ** mem_out)42*61046927SAndroid Build Coastguard Worker nvkmd_dev_alloc_mapped_mem(struct nvkmd_dev *dev,
43*61046927SAndroid Build Coastguard Worker                            struct vk_object_base *log_obj,
44*61046927SAndroid Build Coastguard Worker                            uint64_t size_B, uint64_t align_B,
45*61046927SAndroid Build Coastguard Worker                            enum nvkmd_mem_flags flags,
46*61046927SAndroid Build Coastguard Worker                            enum nvkmd_mem_map_flags map_flags,
47*61046927SAndroid Build Coastguard Worker                            struct nvkmd_mem **mem_out)
48*61046927SAndroid Build Coastguard Worker {
49*61046927SAndroid Build Coastguard Worker    struct nvkmd_mem *mem;
50*61046927SAndroid Build Coastguard Worker    VkResult result;
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker    result = nvkmd_dev_alloc_mem(dev, log_obj, size_B, align_B,
53*61046927SAndroid Build Coastguard Worker                                 flags | NVKMD_MEM_CAN_MAP, &mem);
54*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
55*61046927SAndroid Build Coastguard Worker       return result;
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker    assert(!(map_flags & NVKMD_MEM_MAP_FIXED));
58*61046927SAndroid Build Coastguard Worker    result = nvkmd_mem_map(mem, log_obj, map_flags, NULL, NULL);
59*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS) {
60*61046927SAndroid Build Coastguard Worker       mem->ops->free(mem);
61*61046927SAndroid Build Coastguard Worker       return result;
62*61046927SAndroid Build Coastguard Worker    }
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker    *mem_out = mem;
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
67*61046927SAndroid Build Coastguard Worker }
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK
nvkmd_dev_alloc_va(struct nvkmd_dev * dev,struct vk_object_base * log_obj,enum nvkmd_va_flags flags,uint8_t pte_kind,uint64_t size_B,uint64_t align_B,uint64_t fixed_addr,struct nvkmd_va ** va_out)70*61046927SAndroid Build Coastguard Worker nvkmd_dev_alloc_va(struct nvkmd_dev *dev,
71*61046927SAndroid Build Coastguard Worker                    struct vk_object_base *log_obj,
72*61046927SAndroid Build Coastguard Worker                    enum nvkmd_va_flags flags, uint8_t pte_kind,
73*61046927SAndroid Build Coastguard Worker                    uint64_t size_B, uint64_t align_B,
74*61046927SAndroid Build Coastguard Worker                    uint64_t fixed_addr, struct nvkmd_va **va_out)
75*61046927SAndroid Build Coastguard Worker {
76*61046927SAndroid Build Coastguard Worker    VkResult result = dev->ops->alloc_va(dev, log_obj, flags, pte_kind,
77*61046927SAndroid Build Coastguard Worker                                         size_B, align_B, fixed_addr, va_out);
78*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
79*61046927SAndroid Build Coastguard Worker       return result;
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker    if (unlikely(dev->pdev->debug_flags & NVK_DEBUG_VM)) {
82*61046927SAndroid Build Coastguard Worker       const char *sparse = (flags & NVKMD_VA_SPARSE) ? " sparse" : "";
83*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "alloc va [0x%" PRIx64 ", 0x%" PRIx64 ")%s\n",
84*61046927SAndroid Build Coastguard Worker               (*va_out)->addr, (*va_out)->addr + size_B, sparse);
85*61046927SAndroid Build Coastguard Worker    }
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
88*61046927SAndroid Build Coastguard Worker }
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker void
nvkmd_va_free(struct nvkmd_va * va)91*61046927SAndroid Build Coastguard Worker nvkmd_va_free(struct nvkmd_va *va)
92*61046927SAndroid Build Coastguard Worker {
93*61046927SAndroid Build Coastguard Worker    if (unlikely(va->dev->pdev->debug_flags & NVK_DEBUG_VM)) {
94*61046927SAndroid Build Coastguard Worker       const char *sparse = (va->flags & NVKMD_VA_SPARSE) ? " sparse" : "";
95*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "free va [0x%" PRIx64 ", 0x%" PRIx64 ")%s\n",
96*61046927SAndroid Build Coastguard Worker               va->addr, va->addr + va->size_B, sparse);
97*61046927SAndroid Build Coastguard Worker    }
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker    va->ops->free(va);
100*61046927SAndroid Build Coastguard Worker }
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker static inline void
log_va_bind_mem(struct nvkmd_va * va,uint64_t va_offset_B,struct nvkmd_mem * mem,uint64_t mem_offset_B,uint64_t range_B)103*61046927SAndroid Build Coastguard Worker log_va_bind_mem(struct nvkmd_va *va,
104*61046927SAndroid Build Coastguard Worker                 uint64_t va_offset_B,
105*61046927SAndroid Build Coastguard Worker                 struct nvkmd_mem *mem,
106*61046927SAndroid Build Coastguard Worker                 uint64_t mem_offset_B,
107*61046927SAndroid Build Coastguard Worker                 uint64_t range_B)
108*61046927SAndroid Build Coastguard Worker {
109*61046927SAndroid Build Coastguard Worker    fprintf(stderr, "bind vma mem<0x%" PRIx32 ">"
110*61046927SAndroid Build Coastguard Worker                    "[0x%" PRIx64 ", 0x%" PRIx64 ") to "
111*61046927SAndroid Build Coastguard Worker                    "[0x%" PRIx64 ", 0x%" PRIx64 ")\n",
112*61046927SAndroid Build Coastguard Worker            mem->ops->log_handle(mem),
113*61046927SAndroid Build Coastguard Worker            mem_offset_B, mem_offset_B + range_B,
114*61046927SAndroid Build Coastguard Worker            va->addr, va->addr + range_B);
115*61046927SAndroid Build Coastguard Worker }
116*61046927SAndroid Build Coastguard Worker 
117*61046927SAndroid Build Coastguard Worker static inline void
log_va_unbind(struct nvkmd_va * va,uint64_t va_offset_B,uint64_t range_B)118*61046927SAndroid Build Coastguard Worker log_va_unbind(struct nvkmd_va *va,
119*61046927SAndroid Build Coastguard Worker               uint64_t va_offset_B,
120*61046927SAndroid Build Coastguard Worker               uint64_t range_B)
121*61046927SAndroid Build Coastguard Worker {
122*61046927SAndroid Build Coastguard Worker    fprintf(stderr, "unbind vma [0x%" PRIx64 ", 0x%" PRIx64 ")\n",
123*61046927SAndroid Build Coastguard Worker            va->addr, va->addr + range_B);
124*61046927SAndroid Build Coastguard Worker }
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK
nvkmd_va_bind_mem(struct nvkmd_va * va,struct vk_object_base * log_obj,uint64_t va_offset_B,struct nvkmd_mem * mem,uint64_t mem_offset_B,uint64_t range_B)127*61046927SAndroid Build Coastguard Worker nvkmd_va_bind_mem(struct nvkmd_va *va,
128*61046927SAndroid Build Coastguard Worker                   struct vk_object_base *log_obj,
129*61046927SAndroid Build Coastguard Worker                   uint64_t va_offset_B,
130*61046927SAndroid Build Coastguard Worker                   struct nvkmd_mem *mem,
131*61046927SAndroid Build Coastguard Worker                   uint64_t mem_offset_B,
132*61046927SAndroid Build Coastguard Worker                   uint64_t range_B)
133*61046927SAndroid Build Coastguard Worker {
134*61046927SAndroid Build Coastguard Worker    assert(va_offset_B <= va->size_B);
135*61046927SAndroid Build Coastguard Worker    assert(va_offset_B + range_B <= va->size_B);
136*61046927SAndroid Build Coastguard Worker    assert(mem_offset_B <= mem->size_B);
137*61046927SAndroid Build Coastguard Worker    assert(mem_offset_B + range_B <= mem->size_B);
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker    assert(va->addr % mem->bind_align_B == 0);
140*61046927SAndroid Build Coastguard Worker    assert(va_offset_B % mem->bind_align_B == 0);
141*61046927SAndroid Build Coastguard Worker    assert(mem_offset_B % mem->bind_align_B == 0);
142*61046927SAndroid Build Coastguard Worker    assert(range_B % mem->bind_align_B == 0);
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker    if (unlikely(va->dev->pdev->debug_flags & NVK_DEBUG_VM))
145*61046927SAndroid Build Coastguard Worker       log_va_bind_mem(va, va_offset_B, mem, mem_offset_B, range_B);
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker    return va->ops->bind_mem(va, log_obj, va_offset_B,
148*61046927SAndroid Build Coastguard Worker                             mem, mem_offset_B, range_B);
149*61046927SAndroid Build Coastguard Worker }
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK
nvkmd_va_unbind(struct nvkmd_va * va,struct vk_object_base * log_obj,uint64_t va_offset_B,uint64_t range_B)152*61046927SAndroid Build Coastguard Worker nvkmd_va_unbind(struct nvkmd_va *va,
153*61046927SAndroid Build Coastguard Worker                 struct vk_object_base *log_obj,
154*61046927SAndroid Build Coastguard Worker                 uint64_t va_offset_B,
155*61046927SAndroid Build Coastguard Worker                 uint64_t range_B)
156*61046927SAndroid Build Coastguard Worker {
157*61046927SAndroid Build Coastguard Worker    assert(va_offset_B <= va->size_B);
158*61046927SAndroid Build Coastguard Worker    assert(va_offset_B + range_B <= va->size_B);
159*61046927SAndroid Build Coastguard Worker 
160*61046927SAndroid Build Coastguard Worker    if (unlikely(va->dev->pdev->debug_flags & NVK_DEBUG_VM))
161*61046927SAndroid Build Coastguard Worker       log_va_unbind(va, va_offset_B, range_B);
162*61046927SAndroid Build Coastguard Worker 
163*61046927SAndroid Build Coastguard Worker    return va->ops->unbind(va, log_obj, va_offset_B, range_B);
164*61046927SAndroid Build Coastguard Worker }
165*61046927SAndroid Build Coastguard Worker 
166*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK
nvkmd_ctx_bind(struct nvkmd_ctx * ctx,struct vk_object_base * log_obj,uint32_t bind_count,const struct nvkmd_ctx_bind * binds)167*61046927SAndroid Build Coastguard Worker nvkmd_ctx_bind(struct nvkmd_ctx *ctx,
168*61046927SAndroid Build Coastguard Worker                struct vk_object_base *log_obj,
169*61046927SAndroid Build Coastguard Worker                uint32_t bind_count,
170*61046927SAndroid Build Coastguard Worker                const struct nvkmd_ctx_bind *binds)
171*61046927SAndroid Build Coastguard Worker {
172*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < bind_count; i++) {
173*61046927SAndroid Build Coastguard Worker       assert(binds[i].va_offset_B <= binds[i].va->size_B);
174*61046927SAndroid Build Coastguard Worker       assert(binds[i].va_offset_B + binds[i].range_B <= binds[i].va->size_B);
175*61046927SAndroid Build Coastguard Worker       if (binds[i].op == NVKMD_BIND_OP_BIND) {
176*61046927SAndroid Build Coastguard Worker          assert(binds[i].mem_offset_B % binds[i].mem->bind_align_B == 0);
177*61046927SAndroid Build Coastguard Worker          assert(binds[i].mem_offset_B <= binds[i].mem->size_B);
178*61046927SAndroid Build Coastguard Worker          assert(binds[i].mem_offset_B + binds[i].range_B <=
179*61046927SAndroid Build Coastguard Worker                 binds[i].mem->size_B);
180*61046927SAndroid Build Coastguard Worker 
181*61046927SAndroid Build Coastguard Worker          assert(binds[i].va->addr % binds[i].mem->bind_align_B == 0);
182*61046927SAndroid Build Coastguard Worker          assert(binds[i].va_offset_B % binds[i].mem->bind_align_B == 0);
183*61046927SAndroid Build Coastguard Worker          assert(binds[i].mem_offset_B % binds[i].mem->bind_align_B == 0);
184*61046927SAndroid Build Coastguard Worker          assert(binds[i].range_B % binds[i].mem->bind_align_B == 0);
185*61046927SAndroid Build Coastguard Worker       } else {
186*61046927SAndroid Build Coastguard Worker          assert(binds[i].mem == NULL);
187*61046927SAndroid Build Coastguard Worker       }
188*61046927SAndroid Build Coastguard Worker    }
189*61046927SAndroid Build Coastguard Worker 
190*61046927SAndroid Build Coastguard Worker    if (unlikely(ctx->dev->pdev->debug_flags & NVK_DEBUG_VM)) {
191*61046927SAndroid Build Coastguard Worker       for (uint32_t i = 0; i < bind_count; i++) {
192*61046927SAndroid Build Coastguard Worker          if (binds[i].op == NVKMD_BIND_OP_BIND) {
193*61046927SAndroid Build Coastguard Worker             log_va_bind_mem(binds[i].va, binds[i].va_offset_B,
194*61046927SAndroid Build Coastguard Worker                             binds[i].mem, binds[i].mem_offset_B,
195*61046927SAndroid Build Coastguard Worker                             binds[i].range_B);
196*61046927SAndroid Build Coastguard Worker          } else {
197*61046927SAndroid Build Coastguard Worker             log_va_unbind(binds[i].va, binds[i].va_offset_B, binds[i].range_B);
198*61046927SAndroid Build Coastguard Worker          }
199*61046927SAndroid Build Coastguard Worker       }
200*61046927SAndroid Build Coastguard Worker    }
201*61046927SAndroid Build Coastguard Worker 
202*61046927SAndroid Build Coastguard Worker    return ctx->ops->bind(ctx, log_obj, bind_count, binds);
203*61046927SAndroid Build Coastguard Worker }
204*61046927SAndroid Build Coastguard Worker 
205*61046927SAndroid Build Coastguard Worker void
nvkmd_mem_unref(struct nvkmd_mem * mem)206*61046927SAndroid Build Coastguard Worker nvkmd_mem_unref(struct nvkmd_mem *mem)
207*61046927SAndroid Build Coastguard Worker {
208*61046927SAndroid Build Coastguard Worker    assert(p_atomic_read(&mem->refcnt) > 0);
209*61046927SAndroid Build Coastguard Worker    if (!p_atomic_dec_zero(&mem->refcnt))
210*61046927SAndroid Build Coastguard Worker       return;
211*61046927SAndroid Build Coastguard Worker 
212*61046927SAndroid Build Coastguard Worker    if (mem->client_map != NULL)
213*61046927SAndroid Build Coastguard Worker       mem->ops->unmap(mem, NVKMD_MEM_MAP_CLIENT, mem->client_map);
214*61046927SAndroid Build Coastguard Worker 
215*61046927SAndroid Build Coastguard Worker    if (mem->map != NULL)
216*61046927SAndroid Build Coastguard Worker       mem->ops->unmap(mem, 0, mem->map);
217*61046927SAndroid Build Coastguard Worker 
218*61046927SAndroid Build Coastguard Worker    mem->ops->free(mem);
219*61046927SAndroid Build Coastguard Worker }
220*61046927SAndroid Build Coastguard Worker 
221*61046927SAndroid Build Coastguard Worker VkResult
nvkmd_mem_map(struct nvkmd_mem * mem,struct vk_object_base * log_obj,enum nvkmd_mem_map_flags flags,void * fixed_addr,void ** map_out)222*61046927SAndroid Build Coastguard Worker nvkmd_mem_map(struct nvkmd_mem *mem, struct vk_object_base *log_obj,
223*61046927SAndroid Build Coastguard Worker               enum nvkmd_mem_map_flags flags, void *fixed_addr,
224*61046927SAndroid Build Coastguard Worker               void **map_out)
225*61046927SAndroid Build Coastguard Worker {
226*61046927SAndroid Build Coastguard Worker    void *map = NULL;
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker    assert((fixed_addr == NULL) == !(flags & NVKMD_MEM_MAP_FIXED));
229*61046927SAndroid Build Coastguard Worker 
230*61046927SAndroid Build Coastguard Worker    if (flags & NVKMD_MEM_MAP_CLIENT) {
231*61046927SAndroid Build Coastguard Worker       assert(mem->client_map == NULL);
232*61046927SAndroid Build Coastguard Worker 
233*61046927SAndroid Build Coastguard Worker       VkResult result = mem->ops->map(mem, log_obj, flags, fixed_addr, &map);
234*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS)
235*61046927SAndroid Build Coastguard Worker          return result;
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker       mem->client_map = map;
238*61046927SAndroid Build Coastguard Worker    } else {
239*61046927SAndroid Build Coastguard Worker       assert(!(flags & NVKMD_MEM_MAP_FIXED));
240*61046927SAndroid Build Coastguard Worker 
241*61046927SAndroid Build Coastguard Worker       simple_mtx_lock(&mem->map_mutex);
242*61046927SAndroid Build Coastguard Worker 
243*61046927SAndroid Build Coastguard Worker       assert((mem->map_cnt == 0) == (mem->map == NULL));
244*61046927SAndroid Build Coastguard Worker       mem->map_cnt++;
245*61046927SAndroid Build Coastguard Worker 
246*61046927SAndroid Build Coastguard Worker       VkResult result = VK_SUCCESS;
247*61046927SAndroid Build Coastguard Worker       if (mem->map == NULL) {
248*61046927SAndroid Build Coastguard Worker          result = mem->ops->map(mem, log_obj, flags, NULL, &map);
249*61046927SAndroid Build Coastguard Worker          if (result == VK_SUCCESS)
250*61046927SAndroid Build Coastguard Worker             mem->map = map;
251*61046927SAndroid Build Coastguard Worker       } else {
252*61046927SAndroid Build Coastguard Worker          map = mem->map;
253*61046927SAndroid Build Coastguard Worker       }
254*61046927SAndroid Build Coastguard Worker 
255*61046927SAndroid Build Coastguard Worker       simple_mtx_unlock(&mem->map_mutex);
256*61046927SAndroid Build Coastguard Worker 
257*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS)
258*61046927SAndroid Build Coastguard Worker          return result;
259*61046927SAndroid Build Coastguard Worker    }
260*61046927SAndroid Build Coastguard Worker 
261*61046927SAndroid Build Coastguard Worker    if (map_out != NULL)
262*61046927SAndroid Build Coastguard Worker       *map_out = map;
263*61046927SAndroid Build Coastguard Worker 
264*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
265*61046927SAndroid Build Coastguard Worker }
266*61046927SAndroid Build Coastguard Worker 
267*61046927SAndroid Build Coastguard Worker void
nvkmd_mem_unmap(struct nvkmd_mem * mem,enum nvkmd_mem_map_flags flags)268*61046927SAndroid Build Coastguard Worker nvkmd_mem_unmap(struct nvkmd_mem *mem, enum nvkmd_mem_map_flags flags)
269*61046927SAndroid Build Coastguard Worker {
270*61046927SAndroid Build Coastguard Worker    if (flags & NVKMD_MEM_MAP_CLIENT) {
271*61046927SAndroid Build Coastguard Worker       assert(mem->client_map != NULL);
272*61046927SAndroid Build Coastguard Worker       mem->ops->unmap(mem, flags, mem->client_map);
273*61046927SAndroid Build Coastguard Worker       mem->client_map = NULL;
274*61046927SAndroid Build Coastguard Worker    } else {
275*61046927SAndroid Build Coastguard Worker       assert(mem->map != NULL);
276*61046927SAndroid Build Coastguard Worker       simple_mtx_lock(&mem->map_mutex);
277*61046927SAndroid Build Coastguard Worker       if (--mem->map_cnt == 0) {
278*61046927SAndroid Build Coastguard Worker          mem->ops->unmap(mem, flags, mem->map);
279*61046927SAndroid Build Coastguard Worker          mem->map = NULL;
280*61046927SAndroid Build Coastguard Worker       }
281*61046927SAndroid Build Coastguard Worker       simple_mtx_unlock(&mem->map_mutex);
282*61046927SAndroid Build Coastguard Worker    }
283*61046927SAndroid Build Coastguard Worker }
284