Lines Matching defs:obj

22 static dma_addr_t physaddr(struct drm_gem_object *obj)
24 struct msm_gem_object *msm_obj = to_msm_bo(obj);
25 struct msm_drm_private *priv = obj->dev->dev_private;
30 static bool use_pages(struct drm_gem_object *obj)
32 struct msm_gem_object *msm_obj = to_msm_bo(obj);
64 static void update_lru_active(struct drm_gem_object *obj)
66 struct msm_drm_private *priv = obj->dev->dev_private;
67 struct msm_gem_object *msm_obj = to_msm_bo(obj);
72 drm_gem_lru_move_tail_locked(&priv->lru.pinned, obj);
74 drm_gem_lru_move_tail_locked(&priv->lru.willneed, obj);
78 drm_gem_lru_move_tail_locked(&priv->lru.dontneed, obj);
82 static void update_lru_locked(struct drm_gem_object *obj)
84 struct msm_drm_private *priv = obj->dev->dev_private;
85 struct msm_gem_object *msm_obj = to_msm_bo(obj);
92 drm_gem_lru_move_tail_locked(&priv->lru.unbacked, obj);
94 update_lru_active(obj);
98 static void update_lru(struct drm_gem_object *obj)
100 struct msm_drm_private *priv = obj->dev->dev_private;
103 update_lru_locked(obj);
108 static struct page **get_pages_vram(struct drm_gem_object *obj, int npages)
110 struct msm_gem_object *msm_obj = to_msm_bo(obj);
111 struct msm_drm_private *priv = obj->dev->dev_private;
128 paddr = physaddr(obj);
137 static struct page **get_pages(struct drm_gem_object *obj)
139 struct msm_gem_object *msm_obj = to_msm_bo(obj);
141 msm_gem_assert_locked(obj);
144 struct drm_device *dev = obj->dev;
146 int npages = obj->size >> PAGE_SHIFT;
148 if (use_pages(obj))
149 p = drm_gem_get_pages(obj);
151 p = get_pages_vram(obj, npages);
161 msm_obj->sgt = drm_prime_pages_to_sg(obj->dev, p, npages);
176 update_lru(obj);
182 static void put_pages_vram(struct drm_gem_object *obj)
184 struct msm_gem_object *msm_obj = to_msm_bo(obj);
185 struct msm_drm_private *priv = obj->dev->dev_private;
194 static void put_pages(struct drm_gem_object *obj)
196 struct msm_gem_object *msm_obj = to_msm_bo(obj);
212 if (use_pages(obj))
213 drm_gem_put_pages(obj, msm_obj->pages, true, false);
215 put_pages_vram(obj);
218 update_lru(obj);
222 static struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj,
225 struct msm_gem_object *msm_obj = to_msm_bo(obj);
227 msm_gem_assert_locked(obj);
230 DRM_DEV_ERROR(obj->dev->dev, "Invalid madv state: %u vs %u\n",
235 return get_pages(obj);
241 void msm_gem_pin_obj_locked(struct drm_gem_object *obj)
243 struct msm_drm_private *priv = obj->dev->dev_private;
245 msm_gem_assert_locked(obj);
247 to_msm_bo(obj)->pin_count++;
248 drm_gem_lru_move_tail_locked(&priv->lru.pinned, obj);
251 static void pin_obj_locked(struct drm_gem_object *obj)
253 struct msm_drm_private *priv = obj->dev->dev_private;
256 msm_gem_pin_obj_locked(obj);
260 struct page **msm_gem_pin_pages(struct drm_gem_object *obj)
264 msm_gem_lock(obj);
265 p = msm_gem_pin_pages_locked(obj, MSM_MADV_WILLNEED);
267 pin_obj_locked(obj);
268 msm_gem_unlock(obj);
273 void msm_gem_unpin_pages(struct drm_gem_object *obj)
275 msm_gem_lock(obj);
276 msm_gem_unpin_locked(obj);
277 msm_gem_unlock(obj);
290 struct drm_gem_object *obj = vma->vm_private_data;
291 struct msm_gem_object *msm_obj = to_msm_bo(obj);
300 * a reference on obj. So, we dont need to hold one here.
302 err = msm_gem_lock_interruptible(obj);
309 msm_gem_unlock(obj);
314 pages = get_pages(obj);
331 msm_gem_unlock(obj);
337 static uint64_t mmap_offset(struct drm_gem_object *obj)
339 struct drm_device *dev = obj->dev;
342 msm_gem_assert_locked(obj);
345 ret = drm_gem_create_mmap_offset(obj);
352 return drm_vma_node_offset_addr(&obj->vma_node);
355 uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj)
359 msm_gem_lock(obj);
360 offset = mmap_offset(obj);
361 msm_gem_unlock(obj);
365 static struct msm_gem_vma *add_vma(struct drm_gem_object *obj,
368 struct msm_gem_object *msm_obj = to_msm_bo(obj);
371 msm_gem_assert_locked(obj);
382 static struct msm_gem_vma *lookup_vma(struct drm_gem_object *obj,
385 struct msm_gem_object *msm_obj = to_msm_bo(obj);
388 msm_gem_assert_locked(obj);
414 put_iova_spaces(struct drm_gem_object *obj, bool close)
416 struct msm_gem_object *msm_obj = to_msm_bo(obj);
419 msm_gem_assert_locked(obj);
432 put_iova_vmas(struct drm_gem_object *obj)
434 struct msm_gem_object *msm_obj = to_msm_bo(obj);
437 msm_gem_assert_locked(obj);
444 static struct msm_gem_vma *get_vma_locked(struct drm_gem_object *obj,
450 msm_gem_assert_locked(obj);
452 vma = lookup_vma(obj, aspace);
457 vma = add_vma(obj, aspace);
461 ret = msm_gem_vma_init(vma, obj->size,
469 GEM_WARN_ON((vma->iova + obj->size) > range_end);
475 int msm_gem_pin_vma_locked(struct drm_gem_object *obj, struct msm_gem_vma *vma)
477 struct msm_gem_object *msm_obj = to_msm_bo(obj);
490 msm_gem_assert_locked(obj);
492 pages = msm_gem_pin_pages_locked(obj, MSM_MADV_WILLNEED);
496 return msm_gem_vma_map(vma, prot, msm_obj->sgt, obj->size);
499 void msm_gem_unpin_locked(struct drm_gem_object *obj)
501 struct msm_drm_private *priv = obj->dev->dev_private;
502 struct msm_gem_object *msm_obj = to_msm_bo(obj);
504 msm_gem_assert_locked(obj);
509 update_lru_locked(obj);
514 * to hold the obj lock by only depending on things that a protected by
519 void msm_gem_unpin_active(struct drm_gem_object *obj)
521 struct msm_gem_object *msm_obj = to_msm_bo(obj);
525 update_lru_active(obj);
528 struct msm_gem_vma *msm_gem_get_vma_locked(struct drm_gem_object *obj,
531 return get_vma_locked(obj, aspace, 0, U64_MAX);
534 static int get_and_pin_iova_range_locked(struct drm_gem_object *obj,
541 msm_gem_assert_locked(obj);
543 vma = get_vma_locked(obj, aspace, range_start, range_end);
547 ret = msm_gem_pin_vma_locked(obj, vma);
550 pin_obj_locked(obj);
560 int msm_gem_get_and_pin_iova_range(struct drm_gem_object *obj,
566 msm_gem_lock(obj);
567 ret = get_and_pin_iova_range_locked(obj, aspace, iova, range_start, range_end);
568 msm_gem_unlock(obj);
574 int msm_gem_get_and_pin_iova(struct drm_gem_object *obj,
577 return msm_gem_get_and_pin_iova_range(obj, aspace, iova, 0, U64_MAX);
584 int msm_gem_get_iova(struct drm_gem_object *obj,
590 msm_gem_lock(obj);
591 vma = get_vma_locked(obj, aspace, 0, U64_MAX);
597 msm_gem_unlock(obj);
602 static int clear_iova(struct drm_gem_object *obj,
605 struct msm_gem_vma *vma = lookup_vma(obj, aspace);
624 int msm_gem_set_iova(struct drm_gem_object *obj,
629 msm_gem_lock(obj);
631 ret = clear_iova(obj, aspace);
634 vma = get_vma_locked(obj, aspace, iova, iova + obj->size);
638 clear_iova(obj, aspace);
642 msm_gem_unlock(obj);
652 void msm_gem_unpin_iova(struct drm_gem_object *obj,
657 msm_gem_lock(obj);
658 vma = lookup_vma(obj, aspace);
660 msm_gem_unpin_locked(obj);
662 msm_gem_unlock(obj);
677 struct drm_gem_object *obj;
681 obj = drm_gem_object_lookup(file, handle);
682 if (obj == NULL) {
687 *offset = msm_gem_mmap_offset(obj);
689 drm_gem_object_put(obj);
695 static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)
697 struct msm_gem_object *msm_obj = to_msm_bo(obj);
701 msm_gem_assert_locked(obj);
703 if (obj->import_attach)
706 pages = msm_gem_pin_pages_locked(obj, madv);
710 pin_obj_locked(obj);
721 msm_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT,
733 msm_gem_unpin_locked(obj);
737 void *msm_gem_get_vaddr_locked(struct drm_gem_object *obj)
739 return get_vaddr(obj, MSM_MADV_WILLNEED);
742 void *msm_gem_get_vaddr(struct drm_gem_object *obj)
746 msm_gem_lock(obj);
747 ret = msm_gem_get_vaddr_locked(obj);
748 msm_gem_unlock(obj);
759 void *msm_gem_get_vaddr_active(struct drm_gem_object *obj)
761 return get_vaddr(obj, __MSM_MADV_PURGED);
764 void msm_gem_put_vaddr_locked(struct drm_gem_object *obj)
766 struct msm_gem_object *msm_obj = to_msm_bo(obj);
768 msm_gem_assert_locked(obj);
772 msm_gem_unpin_locked(obj);
775 void msm_gem_put_vaddr(struct drm_gem_object *obj)
777 msm_gem_lock(obj);
778 msm_gem_put_vaddr_locked(obj);
779 msm_gem_unlock(obj);
785 int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv)
787 struct msm_drm_private *priv = obj->dev->dev_private;
788 struct msm_gem_object *msm_obj = to_msm_bo(obj);
790 msm_gem_lock(obj);
799 /* If the obj is inactive, we might need to move it
802 update_lru_locked(obj);
806 msm_gem_unlock(obj);
811 void msm_gem_purge(struct drm_gem_object *obj)
813 struct drm_device *dev = obj->dev;
814 struct msm_drm_private *priv = obj->dev->dev_private;
815 struct msm_gem_object *msm_obj = to_msm_bo(obj);
817 msm_gem_assert_locked(obj);
821 put_iova_spaces(obj, true);
823 msm_gem_vunmap(obj);
825 drm_vma_node_unmap(&obj->vma_node, dev->anon_inode->i_mapping);
827 put_pages(obj);
829 put_iova_vmas(obj);
836 drm_gem_free_mmap_offset(obj);
843 shmem_truncate_range(file_inode(obj->filp), 0, (loff_t)-1);
845 invalidate_mapping_pages(file_inode(obj->filp)->i_mapping,
852 void msm_gem_evict(struct drm_gem_object *obj)
854 struct drm_device *dev = obj->dev;
855 struct msm_gem_object *msm_obj = to_msm_bo(obj);
857 msm_gem_assert_locked(obj);
861 put_iova_spaces(obj, false);
863 drm_vma_node_unmap(&obj->vma_node, dev->anon_inode->i_mapping);
865 put_pages(obj);
868 void msm_gem_vunmap(struct drm_gem_object *obj)
870 struct msm_gem_object *msm_obj = to_msm_bo(obj);
872 msm_gem_assert_locked(obj);
881 bool msm_gem_active(struct drm_gem_object *obj)
883 msm_gem_assert_locked(obj);
885 if (to_msm_bo(obj)->pin_count)
888 return !dma_resv_test_signaled(obj->resv, dma_resv_usage_rw(true));
891 int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout)
899 dma_resv_set_deadline(obj->resv, dma_resv_usage_rw(write),
903 ret = dma_resv_wait_timeout(obj->resv, dma_resv_usage_rw(write),
915 int msm_gem_cpu_fini(struct drm_gem_object *obj)
922 void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m,
925 struct msm_gem_object *msm_obj = to_msm_bo(obj);
926 struct dma_resv *robj = obj->resv;
928 uint64_t off = drm_vma_node_start(&obj->vma_node);
931 msm_gem_lock(obj);
934 stats->all.size += obj->size;
936 if (msm_gem_active(obj)) {
938 stats->active.size += obj->size;
943 stats->resident.size += obj->size;
949 stats->purged.size += obj->size;
954 stats->purgeable.size += obj->size;
964 msm_obj->flags, msm_gem_active(obj) ? 'A' : 'I',
965 obj->name, kref_read(&obj->refcount),
968 seq_printf(m, " %08zu %9s %-32s\n", obj->size, madv, msm_obj->name);
1001 msm_gem_unlock(obj);
1011 struct drm_gem_object *obj = &msm_obj->base;
1013 msm_gem_describe(obj, m, &stats);
1030 static void msm_gem_free_object(struct drm_gem_object *obj)
1032 struct msm_gem_object *msm_obj = to_msm_bo(obj);
1033 struct drm_device *dev = obj->dev;
1040 put_iova_spaces(obj, true);
1042 if (obj->import_attach) {
1050 put_iova_vmas(obj);
1052 drm_prime_gem_destroy(obj, msm_obj->sgt);
1054 msm_gem_vunmap(obj);
1055 put_pages(obj);
1056 put_iova_vmas(obj);
1059 drm_gem_object_release(obj);
1064 static int msm_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
1066 struct msm_gem_object *msm_obj = to_msm_bo(obj);
1079 struct drm_gem_object *obj;
1082 obj = msm_gem_new(dev, size, flags);
1084 if (IS_ERR(obj))
1085 return PTR_ERR(obj);
1088 msm_gem_object_set_name(obj, "%s", name);
1090 ret = drm_gem_handle_create(file, obj, handle);
1093 drm_gem_object_put(obj);
1098 static enum drm_gem_object_status msm_gem_status(struct drm_gem_object *obj)
1100 struct msm_gem_object *msm_obj = to_msm_bo(obj);
1132 struct drm_gem_object **obj)
1161 *obj = &msm_obj->base;
1162 (*obj)->funcs = &msm_gem_object_funcs;
1171 struct drm_gem_object *obj = NULL;
1191 ret = msm_gem_new_impl(dev, size, flags, &obj);
1195 msm_obj = to_msm_bo(obj);
1201 drm_gem_private_object_init(dev, obj, size);
1203 msm_gem_lock(obj);
1205 vma = add_vma(obj, NULL);
1206 msm_gem_unlock(obj);
1212 to_msm_bo(obj)->vram_node = &vma->node;
1214 msm_gem_lock(obj);
1215 pages = get_pages(obj);
1216 msm_gem_unlock(obj);
1222 vma->iova = physaddr(obj);
1224 ret = drm_gem_object_init(dev, obj, size);
1233 mapping_set_gfp_mask(obj->filp->f_mapping, GFP_HIGHUSER);
1236 drm_gem_lru_move_tail(&priv->lru.unbacked, obj);
1242 ret = drm_gem_create_mmap_offset(obj);
1246 return obj;
1249 drm_gem_object_put(obj);
1258 struct drm_gem_object *obj;
1270 ret = msm_gem_new_impl(dev, size, MSM_BO_WC, &obj);
1274 drm_gem_private_object_init(dev, obj, size);
1278 msm_obj = to_msm_bo(obj);
1279 msm_gem_lock(obj);
1283 msm_gem_unlock(obj);
1290 msm_gem_unlock(obj);
1294 msm_gem_unlock(obj);
1296 drm_gem_lru_move_tail(&priv->lru.pinned, obj);
1302 ret = drm_gem_create_mmap_offset(obj);
1306 return obj;
1309 drm_gem_object_put(obj);
1318 struct drm_gem_object *obj = msm_gem_new(dev, size, flags);
1321 if (IS_ERR(obj))
1322 return ERR_CAST(obj);
1325 ret = msm_gem_get_and_pin_iova(obj, aspace, iova);
1330 vaddr = msm_gem_get_vaddr(obj);
1332 msm_gem_unpin_iova(obj, aspace);
1338 *bo = obj;
1342 drm_gem_object_put(obj);