Lines Matching refs:bo
62 struct panfrost_bo *bo; in panfrost_bo_alloc() local
79 bo = pan_lookup_bo(dev, create_bo.handle); in panfrost_bo_alloc()
80 assert(!memcmp(bo, &((struct panfrost_bo){}), sizeof(*bo))); in panfrost_bo_alloc()
82 bo->size = create_bo.size; in panfrost_bo_alloc()
83 bo->ptr.gpu = create_bo.offset; in panfrost_bo_alloc()
84 bo->gem_handle = create_bo.handle; in panfrost_bo_alloc()
85 bo->flags = flags; in panfrost_bo_alloc()
86 bo->dev = dev; in panfrost_bo_alloc()
87 return bo; in panfrost_bo_alloc()
91 panfrost_bo_free(struct panfrost_bo *bo) in panfrost_bo_free() argument
93 struct drm_gem_close gem_close = { .handle = bo->gem_handle }; in panfrost_bo_free()
96 ret = drmIoctl(bo->dev->fd, DRM_IOCTL_GEM_CLOSE, &gem_close); in panfrost_bo_free()
103 memset(bo, 0, sizeof(*bo)); in panfrost_bo_free()
112 panfrost_bo_wait(struct panfrost_bo *bo, int64_t timeout_ns, bool wait_readers) in panfrost_bo_wait() argument
115 .handle = bo->gem_handle, in panfrost_bo_wait()
123 if (!(bo->flags & PAN_BO_SHARED)) { in panfrost_bo_wait()
125 if (!bo->gpu_access) in panfrost_bo_wait()
131 if (!wait_readers && !(bo->gpu_access & PAN_BO_ACCESS_WRITE)) in panfrost_bo_wait()
138 ret = drmIoctl(bo->dev->fd, DRM_IOCTL_PANFROST_WAIT_BO, &req); in panfrost_bo_wait()
143 bo->gpu_access = 0; in panfrost_bo_wait()
195 struct panfrost_bo *bo = NULL; in panfrost_bo_cache_fetch() local
223 bo = entry; in panfrost_bo_cache_fetch()
228 return bo; in panfrost_bo_cache_fetch()
260 panfrost_bo_cache_put(struct panfrost_bo *bo) in panfrost_bo_cache_put() argument
262 struct panfrost_device *dev = bo->dev; in panfrost_bo_cache_put()
264 if (bo->flags & PAN_BO_SHARED) in panfrost_bo_cache_put()
268 struct list_head *bucket = pan_bucket(dev, MAX2(bo->size, 4096)); in panfrost_bo_cache_put()
272 madv.handle = bo->gem_handle; in panfrost_bo_cache_put()
279 list_addtail(&bo->bucket_link, bucket); in panfrost_bo_cache_put()
282 list_addtail(&bo->lru_link, &dev->bo_cache.lru); in panfrost_bo_cache_put()
284 bo->last_used = time.tv_sec; in panfrost_bo_cache_put()
320 panfrost_bo_mmap(struct panfrost_bo *bo) in panfrost_bo_mmap() argument
322 struct drm_panfrost_mmap_bo mmap_bo = { .handle = bo->gem_handle }; in panfrost_bo_mmap()
325 if (bo->ptr.cpu) in panfrost_bo_mmap()
328 ret = drmIoctl(bo->dev->fd, DRM_IOCTL_PANFROST_MMAP_BO, &mmap_bo); in panfrost_bo_mmap()
334 bo->ptr.cpu = os_mmap(NULL, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, in panfrost_bo_mmap()
335 bo->dev->fd, mmap_bo.offset); in panfrost_bo_mmap()
336 if (bo->ptr.cpu == MAP_FAILED) { in panfrost_bo_mmap()
337 fprintf(stderr, "mmap failed: %p %m\n", bo->ptr.cpu); in panfrost_bo_mmap()
343 panfrost_bo_munmap(struct panfrost_bo *bo) in panfrost_bo_munmap() argument
345 if (!bo->ptr.cpu) in panfrost_bo_munmap()
348 if (os_munmap((void *) (uintptr_t)bo->ptr.cpu, bo->size)) { in panfrost_bo_munmap()
353 bo->ptr.cpu = NULL; in panfrost_bo_munmap()
360 struct panfrost_bo *bo; in panfrost_bo_create() local
379 bo = panfrost_bo_cache_fetch(dev, size, flags, true); in panfrost_bo_create()
380 if (!bo) in panfrost_bo_create()
381 bo = panfrost_bo_alloc(dev, size, flags); in panfrost_bo_create()
382 if (!bo) in panfrost_bo_create()
383 bo = panfrost_bo_cache_fetch(dev, size, flags, false); in panfrost_bo_create()
385 if (!bo) in panfrost_bo_create()
388 assert(bo); in panfrost_bo_create()
395 panfrost_bo_mmap(bo); in panfrost_bo_create()
397 p_atomic_set(&bo->refcnt, 1); in panfrost_bo_create()
401 pandecode_inject_mmap(bo->ptr.gpu, NULL, bo->size, NULL); in panfrost_bo_create()
403 pandecode_inject_mmap(bo->ptr.gpu, bo->ptr.cpu, bo->size, NULL); in panfrost_bo_create()
406 return bo; in panfrost_bo_create()
410 panfrost_bo_reference(struct panfrost_bo *bo) in panfrost_bo_reference() argument
412 if (bo) { in panfrost_bo_reference()
413 ASSERTED int count = p_atomic_inc_return(&bo->refcnt); in panfrost_bo_reference()
419 panfrost_bo_unreference(struct panfrost_bo *bo) in panfrost_bo_unreference() argument
421 if (!bo) in panfrost_bo_unreference()
425 if (p_atomic_dec_return(&bo->refcnt)) in panfrost_bo_unreference()
428 struct panfrost_device *dev = bo->dev; in panfrost_bo_unreference()
435 if (p_atomic_read(&bo->refcnt) == 0) { in panfrost_bo_unreference()
437 panfrost_bo_munmap(bo); in panfrost_bo_unreference()
440 pandecode_inject_free(bo->ptr.gpu, bo->size); in panfrost_bo_unreference()
445 if (!panfrost_bo_cache_put(bo)) in panfrost_bo_unreference()
446 panfrost_bo_free(bo); in panfrost_bo_unreference()
455 struct panfrost_bo *bo; in panfrost_bo_import() local
464 bo = pan_lookup_bo(dev, gem_handle); in panfrost_bo_import()
466 if (!bo->dev) { in panfrost_bo_import()
471 bo->dev = dev; in panfrost_bo_import()
472 bo->ptr.gpu = (mali_ptr) get_bo_offset.offset; in panfrost_bo_import()
473 bo->size = lseek(fd, 0, SEEK_END); in panfrost_bo_import()
474 bo->flags = PAN_BO_SHARED; in panfrost_bo_import()
475 bo->gem_handle = gem_handle; in panfrost_bo_import()
476 assert(bo->size > 0); in panfrost_bo_import()
477 p_atomic_set(&bo->refcnt, 1); in panfrost_bo_import()
479 panfrost_bo_mmap(bo); in panfrost_bo_import()
491 if (p_atomic_read(&bo->refcnt) == 0) in panfrost_bo_import()
492 p_atomic_set(&bo->refcnt, 1); in panfrost_bo_import()
494 panfrost_bo_reference(bo); in panfrost_bo_import()
495 assert(bo->ptr.cpu); in panfrost_bo_import()
499 return bo; in panfrost_bo_import()
503 panfrost_bo_export(struct panfrost_bo *bo) in panfrost_bo_export() argument
506 .handle = bo->gem_handle, in panfrost_bo_export()
510 int ret = drmIoctl(bo->dev->fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args); in panfrost_bo_export()
514 bo->flags |= PAN_BO_SHARED; in panfrost_bo_export()