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