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