Lines Matching refs:bo
130 struct vc4_bo *bo = to_vc4_bo(gem_obj); in vc4_bo_set_label() local
140 vc4->bo_labels[bo->label].num_allocated--; in vc4_bo_set_label()
141 vc4->bo_labels[bo->label].size_allocated -= gem_obj->size; in vc4_bo_set_label()
143 if (vc4->bo_labels[bo->label].num_allocated == 0 && in vc4_bo_set_label()
144 is_user_label(bo->label)) { in vc4_bo_set_label()
150 kfree(vc4->bo_labels[bo->label].name); in vc4_bo_set_label()
151 vc4->bo_labels[bo->label].name = NULL; in vc4_bo_set_label()
154 bo->label = label; in vc4_bo_set_label()
162 static void vc4_bo_destroy(struct vc4_bo *bo) in vc4_bo_destroy() argument
164 struct drm_gem_object *obj = &bo->base.base; in vc4_bo_destroy()
171 if (bo->validated_shader) { in vc4_bo_destroy()
172 kfree(bo->validated_shader->uniform_addr_offsets); in vc4_bo_destroy()
173 kfree(bo->validated_shader->texture_samples); in vc4_bo_destroy()
174 kfree(bo->validated_shader); in vc4_bo_destroy()
175 bo->validated_shader = NULL; in vc4_bo_destroy()
181 static void vc4_bo_remove_from_cache(struct vc4_bo *bo) in vc4_bo_remove_from_cache() argument
183 struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev); in vc4_bo_remove_from_cache()
186 list_del(&bo->unref_head); in vc4_bo_remove_from_cache()
187 list_del(&bo->size_head); in vc4_bo_remove_from_cache()
237 struct vc4_bo *bo = list_last_entry(&vc4->bo_cache.time_list, in vc4_bo_cache_purge() local
239 vc4_bo_remove_from_cache(bo); in vc4_bo_cache_purge()
240 vc4_bo_destroy(bo); in vc4_bo_cache_purge()
245 void vc4_bo_add_to_purgeable_pool(struct vc4_bo *bo) in vc4_bo_add_to_purgeable_pool() argument
247 struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev); in vc4_bo_add_to_purgeable_pool()
250 list_add_tail(&bo->size_head, &vc4->purgeable.list); in vc4_bo_add_to_purgeable_pool()
252 vc4->purgeable.size += bo->base.base.size; in vc4_bo_add_to_purgeable_pool()
256 static void vc4_bo_remove_from_purgeable_pool_locked(struct vc4_bo *bo) in vc4_bo_remove_from_purgeable_pool_locked() argument
258 struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev); in vc4_bo_remove_from_purgeable_pool_locked()
272 list_del_init(&bo->size_head); in vc4_bo_remove_from_purgeable_pool_locked()
274 vc4->purgeable.size -= bo->base.base.size; in vc4_bo_remove_from_purgeable_pool_locked()
277 void vc4_bo_remove_from_purgeable_pool(struct vc4_bo *bo) in vc4_bo_remove_from_purgeable_pool() argument
279 struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev); in vc4_bo_remove_from_purgeable_pool()
282 vc4_bo_remove_from_purgeable_pool_locked(bo); in vc4_bo_remove_from_purgeable_pool()
288 struct vc4_bo *bo = to_vc4_bo(obj); in vc4_bo_purge() local
291 WARN_ON(!mutex_is_locked(&bo->madv_lock)); in vc4_bo_purge()
292 WARN_ON(bo->madv != VC4_MADV_DONTNEED); in vc4_bo_purge()
296 dma_free_wc(dev->dev, obj->size, bo->base.vaddr, bo->base.paddr); in vc4_bo_purge()
297 bo->base.vaddr = NULL; in vc4_bo_purge()
298 bo->madv = __VC4_MADV_PURGED; in vc4_bo_purge()
307 struct vc4_bo *bo = list_first_entry(&vc4->purgeable.list, in vc4_bo_userspace_cache_purge() local
309 struct drm_gem_object *obj = &bo->base.base; in vc4_bo_userspace_cache_purge()
312 vc4_bo_remove_from_purgeable_pool_locked(bo); in vc4_bo_userspace_cache_purge()
320 mutex_lock(&bo->madv_lock); in vc4_bo_userspace_cache_purge()
331 if (bo->madv == VC4_MADV_DONTNEED && in vc4_bo_userspace_cache_purge()
332 list_empty(&bo->size_head) && in vc4_bo_userspace_cache_purge()
333 !refcount_read(&bo->usecnt)) { in vc4_bo_userspace_cache_purge()
334 purged_size = bo->base.base.size; in vc4_bo_userspace_cache_purge()
337 mutex_unlock(&bo->madv_lock); in vc4_bo_userspace_cache_purge()
354 struct vc4_bo *bo = NULL; in vc4_bo_get_from_cache() local
365 bo = list_first_entry(&vc4->bo_cache.size_list[page_index], in vc4_bo_get_from_cache()
367 vc4_bo_remove_from_cache(bo); in vc4_bo_get_from_cache()
368 kref_init(&bo->base.base.refcount); in vc4_bo_get_from_cache()
371 if (bo) in vc4_bo_get_from_cache()
372 vc4_bo_set_label(&bo->base.base, type); in vc4_bo_get_from_cache()
374 return bo; in vc4_bo_get_from_cache()
388 struct vc4_bo *bo; in vc4_create_object() local
390 bo = kzalloc(sizeof(*bo), GFP_KERNEL); in vc4_create_object()
391 if (!bo) in vc4_create_object()
394 bo->madv = VC4_MADV_WILLNEED; in vc4_create_object()
395 refcount_set(&bo->usecnt, 0); in vc4_create_object()
396 mutex_init(&bo->madv_lock); in vc4_create_object()
398 bo->label = VC4_BO_TYPE_KERNEL; in vc4_create_object()
403 return &bo->base.base; in vc4_create_object()
412 struct vc4_bo *bo; in vc4_bo_create() local
418 bo = vc4_bo_get_from_cache(dev, size, type); in vc4_bo_create()
419 if (bo) { in vc4_bo_create()
421 memset(bo->base.vaddr, 0, bo->base.base.size); in vc4_bo_create()
422 return bo; in vc4_bo_create()
457 bo = to_vc4_bo(&cma_obj->base); in vc4_bo_create()
463 bo->madv = __VC4_MADV_NOTSUPP; in vc4_bo_create()
469 return bo; in vc4_bo_create()
477 struct vc4_bo *bo = NULL; in vc4_dumb_create() local
486 bo = vc4_bo_create(dev, args->size, false, VC4_BO_TYPE_DUMB); in vc4_dumb_create()
487 if (IS_ERR(bo)) in vc4_dumb_create()
488 return PTR_ERR(bo); in vc4_dumb_create()
490 bo->madv = VC4_MADV_WILLNEED; in vc4_dumb_create()
492 ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle); in vc4_dumb_create()
493 drm_gem_object_put(&bo->base.base); in vc4_dumb_create()
506 struct vc4_bo *bo = list_last_entry(&vc4->bo_cache.time_list, in vc4_bo_cache_free_old() local
508 if (time_before(expire_time, bo->free_time)) { in vc4_bo_cache_free_old()
515 vc4_bo_remove_from_cache(bo); in vc4_bo_cache_free_old()
516 vc4_bo_destroy(bo); in vc4_bo_cache_free_old()
527 struct vc4_bo *bo = to_vc4_bo(gem_bo); in vc4_free_object() local
531 mutex_lock(&bo->madv_lock); in vc4_free_object()
532 if (bo->madv == VC4_MADV_DONTNEED && !refcount_read(&bo->usecnt)) in vc4_free_object()
533 vc4_bo_remove_from_purgeable_pool(bo); in vc4_free_object()
534 mutex_unlock(&bo->madv_lock); in vc4_free_object()
540 vc4_bo_destroy(bo); in vc4_free_object()
546 vc4_bo_destroy(bo); in vc4_free_object()
554 if (!bo->base.vaddr) { in vc4_free_object()
555 vc4_bo_destroy(bo); in vc4_free_object()
561 vc4_bo_destroy(bo); in vc4_free_object()
565 if (bo->validated_shader) { in vc4_free_object()
566 kfree(bo->validated_shader->uniform_addr_offsets); in vc4_free_object()
567 kfree(bo->validated_shader->texture_samples); in vc4_free_object()
568 kfree(bo->validated_shader); in vc4_free_object()
569 bo->validated_shader = NULL; in vc4_free_object()
573 bo->madv = __VC4_MADV_NOTSUPP; in vc4_free_object()
574 refcount_set(&bo->usecnt, 0); in vc4_free_object()
576 bo->t_format = false; in vc4_free_object()
577 bo->free_time = jiffies; in vc4_free_object()
578 list_add(&bo->size_head, cache_list); in vc4_free_object()
579 list_add(&bo->unref_head, &vc4->bo_cache.time_list); in vc4_free_object()
581 vc4_bo_set_label(&bo->base.base, VC4_BO_TYPE_KERNEL_CACHE); in vc4_free_object()
600 int vc4_bo_inc_usecnt(struct vc4_bo *bo) in vc4_bo_inc_usecnt() argument
607 if (refcount_inc_not_zero(&bo->usecnt)) in vc4_bo_inc_usecnt()
610 mutex_lock(&bo->madv_lock); in vc4_bo_inc_usecnt()
611 switch (bo->madv) { in vc4_bo_inc_usecnt()
613 if (!refcount_inc_not_zero(&bo->usecnt)) in vc4_bo_inc_usecnt()
614 refcount_set(&bo->usecnt, 1); in vc4_bo_inc_usecnt()
631 mutex_unlock(&bo->madv_lock); in vc4_bo_inc_usecnt()
636 void vc4_bo_dec_usecnt(struct vc4_bo *bo) in vc4_bo_dec_usecnt() argument
641 if (refcount_dec_not_one(&bo->usecnt)) in vc4_bo_dec_usecnt()
644 mutex_lock(&bo->madv_lock); in vc4_bo_dec_usecnt()
645 if (refcount_dec_and_test(&bo->usecnt) && in vc4_bo_dec_usecnt()
646 bo->madv == VC4_MADV_DONTNEED) in vc4_bo_dec_usecnt()
647 vc4_bo_add_to_purgeable_pool(bo); in vc4_bo_dec_usecnt()
648 mutex_unlock(&bo->madv_lock); in vc4_bo_dec_usecnt()
660 struct vc4_bo *bo = to_vc4_bo(obj); in vc4_prime_export() local
664 if (bo->validated_shader) { in vc4_prime_export()
674 ret = vc4_bo_inc_usecnt(bo); in vc4_prime_export()
682 vc4_bo_dec_usecnt(bo); in vc4_prime_export()
691 struct vc4_bo *bo = to_vc4_bo(obj); in vc4_fault() local
696 mutex_lock(&bo->madv_lock); in vc4_fault()
697 WARN_ON(bo->madv != __VC4_MADV_PURGED); in vc4_fault()
698 mutex_unlock(&bo->madv_lock); in vc4_fault()
707 struct vc4_bo *bo; in vc4_mmap() local
715 bo = to_vc4_bo(gem_obj); in vc4_mmap()
717 if (bo->validated_shader && (vma->vm_flags & VM_WRITE)) { in vc4_mmap()
722 if (bo->madv != VC4_MADV_WILLNEED) { in vc4_mmap()
724 bo->madv == VC4_MADV_DONTNEED ? in vc4_mmap()
748 ret = dma_mmap_wc(bo->base.base.dev->dev, vma, bo->base.vaddr, in vc4_mmap()
749 bo->base.paddr, vma->vm_end - vma->vm_start); in vc4_mmap()
760 struct vc4_bo *bo = to_vc4_bo(obj); in vc4_prime_mmap() local
762 if (bo->validated_shader && (vma->vm_flags & VM_WRITE)) { in vc4_prime_mmap()
772 struct vc4_bo *bo = to_vc4_bo(obj); in vc4_prime_vmap() local
774 if (bo->validated_shader) { in vc4_prime_vmap()
819 struct vc4_bo *bo = NULL; in vc4_create_bo_ioctl() local
830 bo = vc4_bo_create(dev, args->size, false, VC4_BO_TYPE_V3D); in vc4_create_bo_ioctl()
831 if (IS_ERR(bo)) in vc4_create_bo_ioctl()
832 return PTR_ERR(bo); in vc4_create_bo_ioctl()
834 bo->madv = VC4_MADV_WILLNEED; in vc4_create_bo_ioctl()
836 ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle); in vc4_create_bo_ioctl()
837 drm_gem_object_put(&bo->base.base); in vc4_create_bo_ioctl()
868 struct vc4_bo *bo = NULL; in vc4_create_shader_bo_ioctl() local
891 bo = vc4_bo_create(dev, args->size, true, VC4_BO_TYPE_V3D_SHADER); in vc4_create_shader_bo_ioctl()
892 if (IS_ERR(bo)) in vc4_create_shader_bo_ioctl()
893 return PTR_ERR(bo); in vc4_create_shader_bo_ioctl()
895 bo->madv = VC4_MADV_WILLNEED; in vc4_create_shader_bo_ioctl()
897 if (copy_from_user(bo->base.vaddr, in vc4_create_shader_bo_ioctl()
906 memset(bo->base.vaddr + args->size, 0, in vc4_create_shader_bo_ioctl()
907 bo->base.base.size - args->size); in vc4_create_shader_bo_ioctl()
909 bo->validated_shader = vc4_validate_shader(&bo->base); in vc4_create_shader_bo_ioctl()
910 if (!bo->validated_shader) { in vc4_create_shader_bo_ioctl()
918 ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle); in vc4_create_shader_bo_ioctl()
921 drm_gem_object_put(&bo->base.base); in vc4_create_shader_bo_ioctl()
943 struct vc4_bo *bo; in vc4_set_tiling_ioctl() local
965 bo = to_vc4_bo(gem_obj); in vc4_set_tiling_ioctl()
966 bo->t_format = t_format; in vc4_set_tiling_ioctl()
986 struct vc4_bo *bo; in vc4_get_tiling_ioctl() local
996 bo = to_vc4_bo(gem_obj); in vc4_get_tiling_ioctl()
998 if (bo->t_format) in vc4_get_tiling_ioctl()