Lines Matching refs:bo

32 	struct qxl_bo *bo;
35 bo = to_qxl_bo(tbo);
36 qdev = to_qxl(bo->tbo.base.dev);
38 qxl_surface_evict(qdev, bo, false);
39 WARN_ON_ONCE(bo->map_count > 0);
41 list_del_init(&bo->list);
43 drm_gem_object_release(&bo->tbo.base);
44 kfree(bo);
47 bool qxl_ttm_bo_is_qxl_bo(struct ttm_buffer_object *bo)
49 if (bo->destroy == &qxl_ttm_bo_destroy)
111 struct qxl_bo *bo;
120 bo = kzalloc(sizeof(struct qxl_bo), GFP_KERNEL);
121 if (bo == NULL)
124 r = drm_gem_object_init(&qdev->ddev, &bo->tbo.base, size);
126 kfree(bo);
129 bo->tbo.base.funcs = &qxl_object_funcs;
130 bo->type = domain;
131 bo->pin_count = pinned ? 1 : 0;
132 bo->surface_id = 0;
133 INIT_LIST_HEAD(&bo->list);
136 bo->surf = *surf;
138 qxl_ttm_placement_from_domain(bo, domain, pinned);
140 bo->tbo.priority = priority;
141 r = ttm_bo_init(&qdev->mman.bdev, &bo->tbo, size, type,
142 &bo->placement, 0, !kernel, size,
151 *bo_ptr = bo;
155 int qxl_bo_kmap(struct qxl_bo *bo, void **ptr)
160 if (bo->kptr) {
162 *ptr = bo->kptr;
163 bo->map_count++;
166 r = ttm_bo_kmap(&bo->tbo, 0, bo->tbo.num_pages, &bo->kmap);
169 bo->kptr = ttm_kmap_obj_virtual(&bo->kmap, &is_iomem);
171 *ptr = bo->kptr;
172 bo->map_count = 1;
177 struct qxl_bo *bo, int page_offset)
184 if (bo->tbo.mem.mem_type == TTM_PL_VRAM)
186 else if (bo->tbo.mem.mem_type == TTM_PL_PRIV)
191 offset = bo->tbo.mem.start << PAGE_SHIFT;
194 if (bo->kptr) {
195 rptr = bo->kptr + (page_offset * PAGE_SIZE);
199 ret = qxl_bo_kmap(bo, &rptr);
207 void qxl_bo_kunmap(struct qxl_bo *bo)
209 if (bo->kptr == NULL)
211 bo->map_count--;
212 if (bo->map_count > 0)
214 bo->kptr = NULL;
215 ttm_bo_kunmap(&bo->kmap);
219 struct qxl_bo *bo, void *pmap)
221 if ((bo->tbo.mem.mem_type != TTM_PL_VRAM) &&
222 (bo->tbo.mem.mem_type != TTM_PL_PRIV))
228 qxl_bo_kunmap(bo);
231 void qxl_bo_unref(struct qxl_bo **bo)
233 if ((*bo) == NULL)
236 drm_gem_object_put(&(*bo)->tbo.base);
237 *bo = NULL;
240 struct qxl_bo *qxl_bo_ref(struct qxl_bo *bo)
242 drm_gem_object_get(&bo->tbo.base);
243 return bo;
246 static int __qxl_bo_pin(struct qxl_bo *bo)
249 struct drm_device *ddev = bo->tbo.base.dev;
252 if (bo->pin_count) {
253 bo->pin_count++;
256 qxl_ttm_placement_from_domain(bo, bo->type, true);
257 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
259 bo->pin_count = 1;
262 dev_err(ddev->dev, "%p pin failed\n", bo);
266 static int __qxl_bo_unpin(struct qxl_bo *bo)
269 struct drm_device *ddev = bo->tbo.base.dev;
272 if (!bo->pin_count) {
273 dev_warn(ddev->dev, "%p unpin not necessary\n", bo);
276 bo->pin_count--;
277 if (bo->pin_count)
279 for (i = 0; i < bo->placement.num_placement; i++)
280 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
281 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
283 dev_err(ddev->dev, "%p validate failed for unpin\n", bo);
292 int qxl_bo_pin(struct qxl_bo *bo)
296 r = qxl_bo_reserve(bo);
300 r = __qxl_bo_pin(bo);
301 qxl_bo_unreserve(bo);
310 int qxl_bo_unpin(struct qxl_bo *bo)
314 r = qxl_bo_reserve(bo);
318 r = __qxl_bo_unpin(bo);
319 qxl_bo_unreserve(bo);
325 struct qxl_bo *bo, *n;
330 list_for_each_entry_safe(bo, n, &qdev->gem.objects, list) {
332 &bo->tbo.base, bo, (unsigned long)bo->tbo.base.size,
333 *((unsigned long *)&bo->tbo.base.refcount));
335 list_del_init(&bo->list);
337 /* this should unref the ttm bo */
338 drm_gem_object_put(&bo->tbo.base);
352 int qxl_bo_check_id(struct qxl_device *qdev, struct qxl_bo *bo)
356 if (bo->type == QXL_GEM_DOMAIN_SURFACE && bo->surface_id == 0) {
358 ret = qxl_surface_id_alloc(qdev, bo);
362 ret = qxl_hw_surface_alloc(qdev, bo);