Lines Matching refs:bo
63 struct panfrost_bo *bo;
80 bo = pan_lookup_bo(dev, create_bo.handle);
81 assert(!memcmp(bo, &((struct panfrost_bo){}), sizeof(*bo)));
83 bo->size = create_bo.size;
84 bo->ptr.gpu = create_bo.offset;
85 bo->gem_handle = create_bo.handle;
86 bo->flags = flags;
87 bo->dev = dev;
88 bo->label = label;
89 return bo;
93 panfrost_bo_free(struct panfrost_bo *bo)
95 struct drm_gem_close gem_close = { .handle = bo->gem_handle };
98 ret = drmIoctl(bo->dev->fd, DRM_IOCTL_GEM_CLOSE, &gem_close);
105 memset(bo, 0, sizeof(*bo));
114 panfrost_bo_wait(struct panfrost_bo *bo, int64_t timeout_ns, bool wait_readers)
117 .handle = bo->gem_handle,
125 if (!(bo->flags & PAN_BO_SHARED)) {
127 if (!bo->gpu_access)
133 if (!wait_readers && !(bo->gpu_access & PAN_BO_ACCESS_WRITE))
140 ret = drmIoctl(bo->dev->fd, DRM_IOCTL_PANFROST_WAIT_BO, &req);
145 bo->gpu_access = 0;
193 struct panfrost_bo *bo = NULL;
223 bo = entry;
224 bo->label = label;
229 return bo;
261 panfrost_bo_cache_put(struct panfrost_bo *bo)
263 struct panfrost_device *dev = bo->dev;
265 if (bo->flags & PAN_BO_SHARED || dev->debug & PAN_DBG_NO_CACHE)
271 struct list_head *bucket = pan_bucket(dev, MAX2(bo->size, 4096));
275 madv.handle = bo->gem_handle;
282 list_addtail(&bo->bucket_link, bucket);
285 list_addtail(&bo->lru_link, &dev->bo_cache.lru);
287 bo->last_used = time.tv_sec;
295 bo->label = "Unused (BO cache)";
327 panfrost_bo_mmap(struct panfrost_bo *bo)
329 struct drm_panfrost_mmap_bo mmap_bo = { .handle = bo->gem_handle };
332 if (bo->ptr.cpu)
335 ret = drmIoctl(bo->dev->fd, DRM_IOCTL_PANFROST_MMAP_BO, &mmap_bo);
341 bo->ptr.cpu = os_mmap(NULL, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED,
342 bo->dev->fd, mmap_bo.offset);
343 if (bo->ptr.cpu == MAP_FAILED) {
344 bo->ptr.cpu = NULL;
347 bo->ptr.cpu, (long long)bo->size, bo->dev->fd,
353 panfrost_bo_munmap(struct panfrost_bo *bo)
355 if (!bo->ptr.cpu)
358 if (os_munmap((void *) (uintptr_t)bo->ptr.cpu, bo->size)) {
363 bo->ptr.cpu = NULL;
370 struct panfrost_bo *bo;
389 bo = panfrost_bo_cache_fetch(dev, size, flags, label, true);
390 if (!bo)
391 bo = panfrost_bo_alloc(dev, size, flags, label);
392 if (!bo)
393 bo = panfrost_bo_cache_fetch(dev, size, flags, label, false);
395 assert(bo);
397 if (!bo) {
407 panfrost_bo_mmap(bo);
409 p_atomic_set(&bo->refcnt, 1);
413 pandecode_inject_mmap(bo->ptr.gpu, NULL, bo->size, NULL);
415 pandecode_inject_mmap(bo->ptr.gpu, bo->ptr.cpu, bo->size, NULL);
418 return bo;
422 panfrost_bo_reference(struct panfrost_bo *bo)
424 if (bo) {
425 ASSERTED int count = p_atomic_inc_return(&bo->refcnt);
431 panfrost_bo_unreference(struct panfrost_bo *bo)
433 if (!bo)
437 if (p_atomic_dec_return(&bo->refcnt))
440 struct panfrost_device *dev = bo->dev;
447 if (p_atomic_read(&bo->refcnt) == 0) {
449 panfrost_bo_munmap(bo);
452 pandecode_inject_free(bo->ptr.gpu, bo->size);
457 if (!panfrost_bo_cache_put(bo))
458 panfrost_bo_free(bo);
467 struct panfrost_bo *bo;
476 bo = pan_lookup_bo(dev, gem_handle);
478 if (!bo->dev) {
483 bo->dev = dev;
484 bo->ptr.gpu = (mali_ptr) get_bo_offset.offset;
485 bo->size = lseek(fd, 0, SEEK_END);
490 if ((bo->size == 0) || (bo->size == (size_t)-1)) {
494 bo->flags = PAN_BO_SHARED;
495 bo->gem_handle = gem_handle;
496 p_atomic_set(&bo->refcnt, 1);
498 /* bo->refcnt == 0 can happen if the BO
508 if (p_atomic_read(&bo->refcnt) == 0)
509 p_atomic_set(&bo->refcnt, 1);
511 panfrost_bo_reference(bo);
515 return bo;
519 panfrost_bo_export(struct panfrost_bo *bo)
522 .handle = bo->gem_handle,
526 int ret = drmIoctl(bo->dev->fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args);
530 bo->flags |= PAN_BO_SHARED;