Home | History | Annotate | Download | only in qxl

Lines Matching defs:bo

37 	struct qxl_bo *bo;
40 bo = to_qxl_bo(tbo);
41 qdev = (struct qxl_device *)bo->tbo.base.dev->dev_private;
43 qxl_surface_evict(qdev, bo, false);
44 WARN_ON_ONCE(bo->map_count > 0);
46 list_del_init(&bo->list);
48 drm_gem_object_release(&bo->tbo.base);
49 kfree(bo);
52 bool qxl_ttm_bo_is_qxl_bo(struct ttm_buffer_object *bo)
54 if (bo->destroy == &qxl_ttm_bo_destroy)
108 struct qxl_bo *bo;
117 bo = kzalloc(sizeof(struct qxl_bo), GFP_KERNEL);
118 if (bo == NULL)
121 r = drm_gem_object_init(&qdev->ddev, &bo->tbo.base, size);
123 kfree(bo);
126 bo->tbo.base.funcs = &qxl_object_funcs;
127 bo->type = domain;
128 bo->pin_count = pinned ? 1 : 0;
129 bo->surface_id = 0;
130 INIT_LIST_HEAD(&bo->list);
133 bo->surf = *surf;
135 qxl_ttm_placement_from_domain(bo, domain, pinned);
137 r = ttm_bo_init(&qdev->mman.bdev, &bo->tbo, size, type,
138 &bo->placement, 0, !kernel, size,
147 *bo_ptr = bo;
151 int qxl_bo_kmap(struct qxl_bo *bo, void **ptr)
156 if (bo->kptr) {
158 *ptr = bo->kptr;
159 bo->map_count++;
162 r = ttm_bo_kmap(&bo->tbo, 0, bo->tbo.num_pages, &bo->kmap);
165 bo->kptr = ttm_kmap_obj_virtual(&bo->kmap, &is_iomem);
167 *ptr = bo->kptr;
168 bo->map_count = 1;
173 struct qxl_bo *bo, int page_offset)
179 if (bo->tbo.mem.mem_type == TTM_PL_VRAM)
181 else if (bo->tbo.mem.mem_type == TTM_PL_PRIV)
186 ret = qxl_ttm_io_mem_reserve(bo->tbo.bdev, &bo->tbo.mem);
188 return io_mapping_map_atomic_wc(map, bo->tbo.mem.bus.offset + page_offset);
190 if (bo->kptr) {
191 rptr = bo->kptr + (page_offset * PAGE_SIZE);
195 ret = qxl_bo_kmap(bo, &rptr);
203 void qxl_bo_kunmap(struct qxl_bo *bo)
205 if (bo->kptr == NULL)
207 bo->map_count--;
208 if (bo->map_count > 0)
210 bo->kptr = NULL;
211 ttm_bo_kunmap(&bo->kmap);
215 struct qxl_bo *bo, void *pmap)
217 if ((bo->tbo.mem.mem_type != TTM_PL_VRAM) &&
218 (bo->tbo.mem.mem_type != TTM_PL_PRIV))
224 qxl_bo_kunmap(bo);
227 void qxl_bo_unref(struct qxl_bo **bo)
229 if ((*bo) == NULL)
232 drm_gem_object_put_unlocked(&(*bo)->tbo.base);
233 *bo = NULL;
236 struct qxl_bo *qxl_bo_ref(struct qxl_bo *bo)
238 drm_gem_object_get(&bo->tbo.base);
239 return bo;
242 static int __qxl_bo_pin(struct qxl_bo *bo)
245 struct drm_device *ddev = bo->tbo.base.dev;
248 if (bo->pin_count) {
249 bo->pin_count++;
252 qxl_ttm_placement_from_domain(bo, bo->type, true);
253 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
255 bo->pin_count = 1;
258 dev_err(ddev->dev, "%p pin failed\n", bo);
262 static int __qxl_bo_unpin(struct qxl_bo *bo)
265 struct drm_device *ddev = bo->tbo.base.dev;
268 if (!bo->pin_count) {
269 dev_warn(ddev->dev, "%p unpin not necessary\n", bo);
272 bo->pin_count--;
273 if (bo->pin_count)
275 for (i = 0; i < bo->placement.num_placement; i++)
276 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
277 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
279 dev_err(ddev->dev, "%p validate failed for unpin\n", bo);
284 * Reserve the BO before pinning the object. If the BO was reserved
288 int qxl_bo_pin(struct qxl_bo *bo)
292 r = qxl_bo_reserve(bo, false);
296 r = __qxl_bo_pin(bo);
297 qxl_bo_unreserve(bo);
302 * Reserve the BO before pinning the object. If the BO was reserved
306 int qxl_bo_unpin(struct qxl_bo *bo)
310 r = qxl_bo_reserve(bo, false);
314 r = __qxl_bo_unpin(bo);
315 qxl_bo_unreserve(bo);
321 struct qxl_bo *bo, *n;
326 list_for_each_entry_safe(bo, n, &qdev->gem.objects, list) {
328 &bo->tbo.base, bo, (unsigned long)bo->tbo.base.size,
329 *((unsigned long *)&bo->tbo.base.refcount));
331 list_del_init(&bo->list);
333 /* this should unref the ttm bo */
334 drm_gem_object_put_unlocked(&bo->tbo.base);
348 int qxl_bo_check_id(struct qxl_device *qdev, struct qxl_bo *bo)
352 if (bo->type == QXL_GEM_DOMAIN_SURFACE && bo->surface_id == 0) {
354 ret = qxl_surface_id_alloc(qdev, bo);
358 ret = qxl_hw_surface_alloc(qdev, bo);