Lines Matching refs:bo
36 static void set_name(struct etna_bo *bo, uint32_t name) in set_name() argument
40 bo->name = name; in set_name()
42 _mesa_hash_table_insert(bo->dev->name_table, &bo->name, bo); in set_name()
45 int etna_bo_is_idle(struct etna_bo *bo) in etna_bo_is_idle() argument
47 return etna_bo_cpu_prep(bo, in etna_bo_is_idle()
54 static void _etna_bo_free(struct etna_bo *bo) in _etna_bo_free() argument
56 DEBUG_BO("Del bo:", bo); in _etna_bo_free()
57 VG_BO_FREE(bo); in _etna_bo_free()
61 if (bo->va) in _etna_bo_free()
62 util_vma_heap_free(&bo->dev->address_space, bo->va, bo->size); in _etna_bo_free()
64 if (bo->map) in _etna_bo_free()
65 os_munmap(bo->map, bo->size); in _etna_bo_free()
67 if (bo->handle) { in _etna_bo_free()
69 .handle = bo->handle, in _etna_bo_free()
72 if (bo->name) in _etna_bo_free()
73 _mesa_hash_table_remove_key(bo->dev->name_table, &bo->name); in _etna_bo_free()
75 _mesa_hash_table_remove_key(bo->dev->handle_table, &bo->handle); in _etna_bo_free()
76 drmIoctl(bo->dev->fd, DRM_IOCTL_GEM_CLOSE, &req); in _etna_bo_free()
79 free(bo); in _etna_bo_free()
86 list_for_each_entry_safe(struct etna_bo, bo, &dev->zombie_list, list) { in etna_bo_kill_zombies()
87 VG_BO_OBTAIN(bo); in etna_bo_kill_zombies()
88 list_del(&bo->list); in etna_bo_kill_zombies()
89 _etna_bo_free(bo); in etna_bo_kill_zombies()
98 list_for_each_entry_safe(struct etna_bo, bo, &dev->zombie_list, list) { in etna_bo_cleanup_zombies()
102 if (!etna_bo_is_idle(bo)) in etna_bo_cleanup_zombies()
105 VG_BO_OBTAIN(bo); in etna_bo_cleanup_zombies()
106 list_del(&bo->list); in etna_bo_cleanup_zombies()
107 _etna_bo_free(bo); in etna_bo_cleanup_zombies()
111 void etna_bo_free(struct etna_bo *bo) { in etna_bo_free() argument
112 struct etna_device *dev = bo->dev; in etna_bo_free()
120 VG_BO_RELEASE(bo); in etna_bo_free()
121 list_addtail(&bo->list, &dev->zombie_list); in etna_bo_free()
123 _etna_bo_free(bo); in etna_bo_free()
130 struct etna_bo *bo = NULL; in lookup_bo() local
139 bo = etna_bo_ref(entry->data); in lookup_bo()
142 if (list_is_linked(&bo->list)) { in lookup_bo()
143 VG_BO_OBTAIN(bo); in lookup_bo()
144 etna_device_ref(bo->dev); in lookup_bo()
145 list_delinit(&bo->list); in lookup_bo()
149 return bo; in lookup_bo()
156 struct etna_bo *bo = calloc(sizeof(*bo), 1); in bo_from_handle() local
160 if (!bo) { in bo_from_handle()
170 bo->dev = etna_device_ref(dev); in bo_from_handle()
171 bo->size = size; in bo_from_handle()
172 bo->handle = handle; in bo_from_handle()
173 bo->flags = flags; in bo_from_handle()
174 p_atomic_set(&bo->refcnt, 1); in bo_from_handle()
175 list_inithead(&bo->list); in bo_from_handle()
177 _mesa_hash_table_insert(dev->handle_table, &bo->handle, bo); in bo_from_handle()
180 bo->va = util_vma_heap_alloc(&dev->address_space, bo->size, 4096); in bo_from_handle()
182 return bo; in bo_from_handle()
189 struct etna_bo *bo; in etna_bo_new() local
195 bo = etna_bo_cache_alloc(&dev->bo_cache, &size, flags); in etna_bo_new()
196 if (bo) in etna_bo_new()
197 return bo; in etna_bo_new()
206 bo = bo_from_handle(dev, size, req.handle, flags); in etna_bo_new()
207 bo->reuse = 1; in etna_bo_new()
210 DEBUG_BO("New bo:", bo); in etna_bo_new()
211 VG_BO_ALLOC(bo); in etna_bo_new()
213 return bo; in etna_bo_new()
216 struct etna_bo *etna_bo_ref(struct etna_bo *bo) in etna_bo_ref() argument
218 p_atomic_inc(&bo->refcnt); in etna_bo_ref()
220 return bo; in etna_bo_ref()
227 struct etna_bo *bo; in etna_bo_from_name() local
235 bo = lookup_bo(dev->name_table, name); in etna_bo_from_name()
236 if (bo) in etna_bo_from_name()
244 bo = lookup_bo(dev->handle_table, req.handle); in etna_bo_from_name()
245 if (bo) in etna_bo_from_name()
248 bo = bo_from_handle(dev, req.size, req.handle, 0); in etna_bo_from_name()
249 if (bo) { in etna_bo_from_name()
250 set_name(bo, name); in etna_bo_from_name()
251 DEBUG_BO("New from name:", bo); in etna_bo_from_name()
252 VG_BO_ALLOC(bo); in etna_bo_from_name()
258 return bo; in etna_bo_from_name()
267 struct etna_bo *bo; in etna_bo_from_dmabuf() local
283 bo = lookup_bo(dev->handle_table, handle); in etna_bo_from_dmabuf()
284 if (bo) in etna_bo_from_dmabuf()
291 bo = bo_from_handle(dev, size, handle, 0); in etna_bo_from_dmabuf()
293 DEBUG_BO("New from dmabuf:", bo); in etna_bo_from_dmabuf()
294 VG_BO_ALLOC(bo); in etna_bo_from_dmabuf()
299 return bo; in etna_bo_from_dmabuf()
303 void etna_bo_del(struct etna_bo *bo) in etna_bo_del() argument
305 if (!bo) in etna_bo_del()
308 struct etna_device *dev = bo->dev; in etna_bo_del()
316 if (!p_atomic_dec_zero(&bo->refcnt)) in etna_bo_del()
319 if (bo->reuse && (etna_bo_cache_free(&dev->bo_cache, bo) == 0)) in etna_bo_del()
322 etna_bo_free(bo); in etna_bo_del()
329 int etna_bo_get_name(struct etna_bo *bo, uint32_t *name) in etna_bo_get_name() argument
331 if (!bo->name) { in etna_bo_get_name()
333 .handle = bo->handle, in etna_bo_get_name()
337 ret = drmIoctl(bo->dev->fd, DRM_IOCTL_GEM_FLINK, &req); in etna_bo_get_name()
343 set_name(bo, req.name); in etna_bo_get_name()
345 bo->reuse = 0; in etna_bo_get_name()
348 *name = bo->name; in etna_bo_get_name()
353 uint32_t etna_bo_handle(struct etna_bo *bo) in etna_bo_handle() argument
355 return bo->handle; in etna_bo_handle()
361 int etna_bo_dmabuf(struct etna_bo *bo) in etna_bo_dmabuf() argument
365 ret = drmPrimeHandleToFD(bo->dev->fd, bo->handle, DRM_CLOEXEC, in etna_bo_dmabuf()
372 bo->reuse = 0; in etna_bo_dmabuf()
377 uint32_t etna_bo_size(struct etna_bo *bo) in etna_bo_size() argument
379 return bo->size; in etna_bo_size()
382 uint32_t etna_bo_gpu_va(struct etna_bo *bo) in etna_bo_gpu_va() argument
384 return bo->va; in etna_bo_gpu_va()
387 void *etna_bo_map(struct etna_bo *bo) in etna_bo_map() argument
389 if (!bo->map) { in etna_bo_map()
393 .handle = bo->handle, in etna_bo_map()
396 ret = drmCommandWriteRead(bo->dev->fd, DRM_ETNAVIV_GEM_INFO, in etna_bo_map()
401 map = os_mmap(0, bo->size, PROT_READ | PROT_WRITE, in etna_bo_map()
402 MAP_SHARED, bo->dev->fd, req.offset); in etna_bo_map()
408 if (p_atomic_cmpxchg(&bo->map, NULL, map)) in etna_bo_map()
409 munmap(map, bo->size); in etna_bo_map()
412 return bo->map; in etna_bo_map()
415 int etna_bo_cpu_prep(struct etna_bo *bo, uint32_t op) in etna_bo_cpu_prep() argument
418 .handle = bo->handle, in etna_bo_cpu_prep()
424 return drmCommandWrite(bo->dev->fd, DRM_ETNAVIV_GEM_CPU_PREP, in etna_bo_cpu_prep()
428 void etna_bo_cpu_fini(struct etna_bo *bo) in etna_bo_cpu_fini() argument
431 .handle = bo->handle, in etna_bo_cpu_fini()
434 drmCommandWrite(bo->dev->fd, DRM_ETNAVIV_GEM_CPU_FINI, in etna_bo_cpu_fini()