/* return holding the reference to this object */ static struct qxl_bo *qxlhw_handle_to_bo(struct qxl_device *qdev, struct drm_file *file_priv, uint64_t handle, struct qxl_release *release) { struct drm_gem_object *gobj; struct qxl_bo *qobj; int ret; gobj = drm_gem_object_lookup(qdev->ddev, file_priv, handle); if (!gobj) return NULL; qobj = gem_to_qxl_bo(gobj); ret = qxl_release_list_add(release, qobj); if (ret) return NULL; return qobj; }
/* return holding the reference to this object */ static int qxlhw_handle_to_bo(struct drm_file *file_priv, uint64_t handle, struct qxl_release *release, struct qxl_bo **qbo_p) { struct drm_gem_object *gobj; struct qxl_bo *qobj; int ret; gobj = drm_gem_object_lookup(file_priv, handle); if (!gobj) return -EINVAL; qobj = gem_to_qxl_bo(gobj); ret = qxl_release_list_add(release, qobj); drm_gem_object_unreference_unlocked(gobj); if (ret) return ret; *qbo_p = qobj; return 0; }
int qxl_alloc_bo_reserved(struct qxl_device *qdev, struct qxl_release *release, unsigned long size, struct qxl_bo **_bo) { struct qxl_bo *bo; int ret; ret = qxl_bo_create(qdev, size, false /* not kernel - device */, false, QXL_GEM_DOMAIN_VRAM, NULL, &bo); if (ret) { DRM_ERROR("failed to allocate VRAM BO\n"); return ret; } ret = qxl_release_list_add(release, bo); if (ret) goto out_unref; *_bo = bo; return 0; out_unref: qxl_bo_unref(&bo); return ret; }