Lines Matching refs:bo
134 struct vc4_bo *bo = to_vc4_bo(gem_obj); in vc4_bo_set_label() local
144 vc4->bo_labels[bo->label].num_allocated--; in vc4_bo_set_label()
145 vc4->bo_labels[bo->label].size_allocated -= gem_obj->size; in vc4_bo_set_label()
147 if (vc4->bo_labels[bo->label].num_allocated == 0 && in vc4_bo_set_label()
148 is_user_label(bo->label)) { in vc4_bo_set_label()
154 kfree(vc4->bo_labels[bo->label].name); in vc4_bo_set_label()
155 vc4->bo_labels[bo->label].name = NULL; in vc4_bo_set_label()
158 bo->label = label; in vc4_bo_set_label()
166 static void vc4_bo_destroy(struct vc4_bo *bo) in vc4_bo_destroy() argument
168 struct drm_gem_object *obj = &bo->base.base; in vc4_bo_destroy()
175 if (bo->validated_shader) { in vc4_bo_destroy()
176 kfree(bo->validated_shader->uniform_addr_offsets); in vc4_bo_destroy()
177 kfree(bo->validated_shader->texture_samples); in vc4_bo_destroy()
178 kfree(bo->validated_shader); in vc4_bo_destroy()
179 bo->validated_shader = NULL; in vc4_bo_destroy()
182 mutex_destroy(&bo->madv_lock); in vc4_bo_destroy()
183 drm_gem_dma_free(&bo->base); in vc4_bo_destroy()
186 static void vc4_bo_remove_from_cache(struct vc4_bo *bo) in vc4_bo_remove_from_cache() argument
188 struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev); in vc4_bo_remove_from_cache()
191 list_del(&bo->unref_head); in vc4_bo_remove_from_cache()
192 list_del(&bo->size_head); in vc4_bo_remove_from_cache()
242 struct vc4_bo *bo = list_last_entry(&vc4->bo_cache.time_list, in vc4_bo_cache_purge() local
244 vc4_bo_remove_from_cache(bo); in vc4_bo_cache_purge()
245 vc4_bo_destroy(bo); in vc4_bo_cache_purge()
250 void vc4_bo_add_to_purgeable_pool(struct vc4_bo *bo) in vc4_bo_add_to_purgeable_pool() argument
252 struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev); in vc4_bo_add_to_purgeable_pool()
258 list_add_tail(&bo->size_head, &vc4->purgeable.list); in vc4_bo_add_to_purgeable_pool()
260 vc4->purgeable.size += bo->base.base.size; in vc4_bo_add_to_purgeable_pool()
264 static void vc4_bo_remove_from_purgeable_pool_locked(struct vc4_bo *bo) in vc4_bo_remove_from_purgeable_pool_locked() argument
266 struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev); in vc4_bo_remove_from_purgeable_pool_locked()
283 list_del_init(&bo->size_head); in vc4_bo_remove_from_purgeable_pool_locked()
285 vc4->purgeable.size -= bo->base.base.size; in vc4_bo_remove_from_purgeable_pool_locked()
288 void vc4_bo_remove_from_purgeable_pool(struct vc4_bo *bo) in vc4_bo_remove_from_purgeable_pool() argument
290 struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev); in vc4_bo_remove_from_purgeable_pool()
293 vc4_bo_remove_from_purgeable_pool_locked(bo); in vc4_bo_remove_from_purgeable_pool()
299 struct vc4_bo *bo = to_vc4_bo(obj); in vc4_bo_purge() local
302 WARN_ON(!mutex_is_locked(&bo->madv_lock)); in vc4_bo_purge()
303 WARN_ON(bo->madv != VC4_MADV_DONTNEED); in vc4_bo_purge()
307 dma_free_wc(dev->dev, obj->size, bo->base.vaddr, bo->base.dma_addr); in vc4_bo_purge()
308 bo->base.vaddr = NULL; in vc4_bo_purge()
309 bo->madv = __VC4_MADV_PURGED; in vc4_bo_purge()
318 struct vc4_bo *bo = list_first_entry(&vc4->purgeable.list, in vc4_bo_userspace_cache_purge() local
320 struct drm_gem_object *obj = &bo->base.base; in vc4_bo_userspace_cache_purge()
323 vc4_bo_remove_from_purgeable_pool_locked(bo); in vc4_bo_userspace_cache_purge()
331 mutex_lock(&bo->madv_lock); in vc4_bo_userspace_cache_purge()
342 if (bo->madv == VC4_MADV_DONTNEED && in vc4_bo_userspace_cache_purge()
343 list_empty(&bo->size_head) && in vc4_bo_userspace_cache_purge()
344 !refcount_read(&bo->usecnt)) { in vc4_bo_userspace_cache_purge()
345 purged_size = bo->base.base.size; in vc4_bo_userspace_cache_purge()
348 mutex_unlock(&bo->madv_lock); in vc4_bo_userspace_cache_purge()
365 struct vc4_bo *bo = NULL; in vc4_bo_get_from_cache() local
374 bo = list_first_entry(&vc4->bo_cache.size_list[page_index], in vc4_bo_get_from_cache()
376 vc4_bo_remove_from_cache(bo); in vc4_bo_get_from_cache()
377 kref_init(&bo->base.base.refcount); in vc4_bo_get_from_cache()
380 if (bo) in vc4_bo_get_from_cache()
381 vc4_bo_set_label(&bo->base.base, type); in vc4_bo_get_from_cache()
383 return bo; in vc4_bo_get_from_cache()
397 struct vc4_bo *bo; in vc4_create_object() local
402 bo = kzalloc(sizeof(*bo), GFP_KERNEL); in vc4_create_object()
403 if (!bo) in vc4_create_object()
406 bo->madv = VC4_MADV_WILLNEED; in vc4_create_object()
407 refcount_set(&bo->usecnt, 0); in vc4_create_object()
409 mutex_init(&bo->madv_lock); in vc4_create_object()
412 bo->label = VC4_BO_TYPE_KERNEL; in vc4_create_object()
417 bo->base.base.funcs = &vc4_gem_object_funcs; in vc4_create_object()
419 return &bo->base.base; in vc4_create_object()
428 struct vc4_bo *bo; in vc4_bo_create() local
437 bo = vc4_bo_get_from_cache(dev, size, type); in vc4_bo_create()
438 if (bo) { in vc4_bo_create()
440 memset(bo->base.vaddr, 0, bo->base.base.size); in vc4_bo_create()
441 return bo; in vc4_bo_create()
476 bo = to_vc4_bo(&dma_obj->base); in vc4_bo_create()
482 bo->madv = __VC4_MADV_NOTSUPP; in vc4_bo_create()
488 return bo; in vc4_bo_create()
496 struct vc4_bo *bo = NULL; in vc4_bo_dumb_create() local
506 bo = vc4_bo_create(dev, args->size, false, VC4_BO_TYPE_DUMB); in vc4_bo_dumb_create()
507 if (IS_ERR(bo)) in vc4_bo_dumb_create()
508 return PTR_ERR(bo); in vc4_bo_dumb_create()
510 bo->madv = VC4_MADV_WILLNEED; in vc4_bo_dumb_create()
512 ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle); in vc4_bo_dumb_create()
513 drm_gem_object_put(&bo->base.base); in vc4_bo_dumb_create()
526 struct vc4_bo *bo = list_last_entry(&vc4->bo_cache.time_list, in vc4_bo_cache_free_old() local
528 if (time_before(expire_time, bo->free_time)) { in vc4_bo_cache_free_old()
535 vc4_bo_remove_from_cache(bo); in vc4_bo_cache_free_old()
536 vc4_bo_destroy(bo); in vc4_bo_cache_free_old()
547 struct vc4_bo *bo = to_vc4_bo(gem_bo); in vc4_free_object() local
551 mutex_lock(&bo->madv_lock); in vc4_free_object()
552 if (bo->madv == VC4_MADV_DONTNEED && !refcount_read(&bo->usecnt)) in vc4_free_object()
553 vc4_bo_remove_from_purgeable_pool(bo); in vc4_free_object()
554 mutex_unlock(&bo->madv_lock); in vc4_free_object()
560 vc4_bo_destroy(bo); in vc4_free_object()
566 vc4_bo_destroy(bo); in vc4_free_object()
574 if (!bo->base.vaddr) { in vc4_free_object()
575 vc4_bo_destroy(bo); in vc4_free_object()
581 vc4_bo_destroy(bo); in vc4_free_object()
585 if (bo->validated_shader) { in vc4_free_object()
586 kfree(bo->validated_shader->uniform_addr_offsets); in vc4_free_object()
587 kfree(bo->validated_shader->texture_samples); in vc4_free_object()
588 kfree(bo->validated_shader); in vc4_free_object()
589 bo->validated_shader = NULL; in vc4_free_object()
593 bo->madv = __VC4_MADV_NOTSUPP; in vc4_free_object()
594 refcount_set(&bo->usecnt, 0); in vc4_free_object()
596 bo->t_format = false; in vc4_free_object()
597 bo->free_time = jiffies; in vc4_free_object()
598 list_add(&bo->size_head, cache_list); in vc4_free_object()
599 list_add(&bo->unref_head, &vc4->bo_cache.time_list); in vc4_free_object()
601 vc4_bo_set_label(&bo->base.base, VC4_BO_TYPE_KERNEL_CACHE); in vc4_free_object()
620 int vc4_bo_inc_usecnt(struct vc4_bo *bo) in vc4_bo_inc_usecnt() argument
622 struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev); in vc4_bo_inc_usecnt()
631 if (refcount_inc_not_zero(&bo->usecnt)) in vc4_bo_inc_usecnt()
634 mutex_lock(&bo->madv_lock); in vc4_bo_inc_usecnt()
635 switch (bo->madv) { in vc4_bo_inc_usecnt()
637 if (!refcount_inc_not_zero(&bo->usecnt)) in vc4_bo_inc_usecnt()
638 refcount_set(&bo->usecnt, 1); in vc4_bo_inc_usecnt()
655 mutex_unlock(&bo->madv_lock); in vc4_bo_inc_usecnt()
660 void vc4_bo_dec_usecnt(struct vc4_bo *bo) in vc4_bo_dec_usecnt() argument
662 struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev); in vc4_bo_dec_usecnt()
670 if (refcount_dec_not_one(&bo->usecnt)) in vc4_bo_dec_usecnt()
673 mutex_lock(&bo->madv_lock); in vc4_bo_dec_usecnt()
674 if (refcount_dec_and_test(&bo->usecnt) && in vc4_bo_dec_usecnt()
675 bo->madv == VC4_MADV_DONTNEED) in vc4_bo_dec_usecnt()
676 vc4_bo_add_to_purgeable_pool(bo); in vc4_bo_dec_usecnt()
677 mutex_unlock(&bo->madv_lock); in vc4_bo_dec_usecnt()
689 struct vc4_bo *bo = to_vc4_bo(obj); in vc4_prime_export() local
693 if (bo->validated_shader) { in vc4_prime_export()
703 ret = vc4_bo_inc_usecnt(bo); in vc4_prime_export()
711 vc4_bo_dec_usecnt(bo); in vc4_prime_export()
720 struct vc4_bo *bo = to_vc4_bo(obj); in vc4_fault() local
725 mutex_lock(&bo->madv_lock); in vc4_fault()
726 WARN_ON(bo->madv != __VC4_MADV_PURGED); in vc4_fault()
727 mutex_unlock(&bo->madv_lock); in vc4_fault()
734 struct vc4_bo *bo = to_vc4_bo(obj); in vc4_gem_object_mmap() local
736 if (bo->validated_shader && (vma->vm_flags & VM_WRITE)) { in vc4_gem_object_mmap()
741 if (bo->madv != VC4_MADV_WILLNEED) { in vc4_gem_object_mmap()
743 bo->madv == VC4_MADV_DONTNEED ? in vc4_gem_object_mmap()
748 return drm_gem_dma_mmap(&bo->base, vma); in vc4_gem_object_mmap()
783 struct vc4_bo *bo = NULL; in vc4_create_bo_ioctl() local
797 bo = vc4_bo_create(dev, args->size, false, VC4_BO_TYPE_V3D); in vc4_create_bo_ioctl()
798 if (IS_ERR(bo)) in vc4_create_bo_ioctl()
799 return PTR_ERR(bo); in vc4_create_bo_ioctl()
801 bo->madv = VC4_MADV_WILLNEED; in vc4_create_bo_ioctl()
803 ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle); in vc4_create_bo_ioctl()
804 drm_gem_object_put(&bo->base.base); in vc4_create_bo_ioctl()
839 struct vc4_bo *bo = NULL; in vc4_create_shader_bo_ioctl() local
865 bo = vc4_bo_create(dev, args->size, true, VC4_BO_TYPE_V3D_SHADER); in vc4_create_shader_bo_ioctl()
866 if (IS_ERR(bo)) in vc4_create_shader_bo_ioctl()
867 return PTR_ERR(bo); in vc4_create_shader_bo_ioctl()
869 bo->madv = VC4_MADV_WILLNEED; in vc4_create_shader_bo_ioctl()
871 if (copy_from_user(bo->base.vaddr, in vc4_create_shader_bo_ioctl()
880 memset(bo->base.vaddr + args->size, 0, in vc4_create_shader_bo_ioctl()
881 bo->base.base.size - args->size); in vc4_create_shader_bo_ioctl()
883 bo->validated_shader = vc4_validate_shader(&bo->base); in vc4_create_shader_bo_ioctl()
884 if (!bo->validated_shader) { in vc4_create_shader_bo_ioctl()
892 ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle); in vc4_create_shader_bo_ioctl()
895 drm_gem_object_put(&bo->base.base); in vc4_create_shader_bo_ioctl()
918 struct vc4_bo *bo; in vc4_set_tiling_ioctl() local
943 bo = to_vc4_bo(gem_obj); in vc4_set_tiling_ioctl()
944 bo->t_format = t_format; in vc4_set_tiling_ioctl()
965 struct vc4_bo *bo; in vc4_get_tiling_ioctl() local
978 bo = to_vc4_bo(gem_obj); in vc4_get_tiling_ioctl()
980 if (bo->t_format) in vc4_get_tiling_ioctl()