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