diff options
author | Dave Airlie <airlied@gmail.com> | 2013-02-22 14:48:45 +1000 |
---|---|---|
committer | Dave Airlie <airlied@gmail.com> | 2013-02-22 14:54:24 +1000 |
commit | e766c4e79a118d55fc7a221ba2c212e48e6727f3 (patch) | |
tree | 8d78990c1f5f734e33f4b63bace7bb015b9ff5f8 | |
parent | 8316917394ee8c5b6db70123122dbe6a8b61689a (diff) |
cleanup more code
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_cmd.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_ioctl.c | 75 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_ttm.c | 65 |
3 files changed, 32 insertions, 122 deletions
diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c index a8fe97cde11f..d12fc8484f22 100644 --- a/drivers/gpu/drm/qxl/qxl_cmd.c +++ b/drivers/gpu/drm/qxl/qxl_cmd.c @@ -210,7 +210,6 @@ int qxl_garbage_collect(struct qxl_device *qdev) int i = 0; int ret; union qxl_release_info *info; - void *ptr; while (qxl_ring_pop(qdev->release_ring, &id)) { QXL_INFO(qdev, "popped %lld\n", id); @@ -221,8 +220,8 @@ int qxl_garbage_collect(struct qxl_device *qdev) ret = qxl_release_reserve(qdev, release, false); if (ret) { - qxl_io_log(qdev, "failed to reserve release on garbage collect %d\n", id); - DRM_ERROR("failed to reserve release %d\n", id); + qxl_io_log(qdev, "failed to reserve release on garbage collect %lld\n", id); + DRM_ERROR("failed to reserve release %lld\n", id); } info = qxl_release_map(qdev, release); @@ -474,7 +473,6 @@ again: goto again; if (handle >= qdev->rom->n_surfaces) { - int res; count++; spin_lock(&qdev->surf_id_idr_lock); idr_remove(&qdev->surf_id_idr, handle); @@ -505,7 +503,6 @@ int qxl_hw_surface_alloc(struct qxl_device *qdev, { struct qxl_surface_cmd *cmd; struct qxl_release *release; - void *ptr; int ret; if (surf->hw_surf_alloc) @@ -561,7 +558,6 @@ int qxl_hw_surface_dealloc(struct qxl_device *qdev, struct qxl_surface_cmd *cmd; struct qxl_release *release; int ret; - void *ptr; int id; if (!surf->hw_surf_alloc) @@ -675,7 +671,7 @@ static int qxl_reap_surface_id(struct qxl_device *qdev, int max_to_reap) int i, ret; bool stall = false; int start = 0; - int max = qdev->rom->n_surfaces; + mutex_lock(&qdev->surf_evict_mutex); again: @@ -699,12 +695,8 @@ again: { struct qxl_bo *bo = (struct qxl_bo *)objptr; - printk("reaping %d %p %d %d %d %d\n", surfid, objptr, bo->surface_id, stall, bo->hw_surf_alloc, atomic_read(&bo->tbo.kref.refcount)); - qxl_io_log(qdev, "reaping %d %p %d %d %d %d %d\n", surfid, objptr, bo->surface_id, stall, bo->hw_surf_alloc, atomic_read(&bo->tbo.kref.refcount), qdev->last_alloced_surf_id); - if (!bo->hw_surf_alloc) continue; - } ret = qxl_reap_surf(qdev, objptr, stall); diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c index bf66a8006791..97c29a573cf6 100644 --- a/drivers/gpu/drm/qxl/qxl_ioctl.c +++ b/drivers/gpu/drm/qxl/qxl_ioctl.c @@ -36,32 +36,25 @@ int qxl_alloc_ioctl(struct drm_device *dev, void *data, struct qxl_device *qdev = dev->dev_private; struct drm_qxl_alloc *qxl_alloc = data; int ret; - /* - * TODO: actually take note of the drm_qxl_alloc->type flag, except for - * the primary - * surface creation (i.e. use the surfaces bar) - */ + struct qxl_bo *qobj; + uint32_t handle; + u32 domain = QXL_GEM_DOMAIN_VRAM; if (qxl_alloc->size == 0) { DRM_ERROR("invalid size %d\n", qxl_alloc->size); return -EINVAL; } - { - struct qxl_bo *qobj; - uint32_t handle; - u32 domain = QXL_GEM_DOMAIN_VRAM; - ret = qxl_gem_object_create_with_handle(qdev, file_priv, - domain, - qxl_alloc->size, - NULL, - &qobj, &handle); - if (ret) { - DRM_ERROR("%s: failed to create gem ret=%d\n", - __func__, ret); - return -ENOMEM; - } - qxl_alloc->handle = handle; + ret = qxl_gem_object_create_with_handle(qdev, file_priv, + domain, + qxl_alloc->size, + NULL, + &qobj, &handle); + if (ret) { + DRM_ERROR("%s: failed to create gem ret=%d\n", + __func__, ret); + return -ENOMEM; } + qxl_alloc->handle = handle; return 0; } @@ -172,16 +165,10 @@ int qxl_execbuffer_ioctl(struct drm_device *dev, void *data, break; case QXL_CMD_SURFACE: case QXL_CMD_CURSOR: - DRM_ERROR("Only draw commands in execbuffers\n"); + default: + DRM_DEBUG("Only draw commands in execbuffers\n"); return -EINVAL; break; - default: - qxl_io_log(qdev, - "%s: bad command %d not in {%d, %d, %d}\n", - __func__, user_cmd.type, - QXL_CMD_DRAW, QXL_CMD_SURFACE, - QXL_CMD_CURSOR); - return -EFAULT; } if (user_cmd.command_size > PAGE_SIZE - sizeof(union qxl_release_info)) @@ -196,12 +183,9 @@ int qxl_execbuffer_ioctl(struct drm_device *dev, void *data, if (ret) return ret; + /* TODO copy slow path code from i915 */ fb_cmd = qxl_bo_kmap_atomic_page(qdev, cmd_bo, (release->release_offset & PAGE_SIZE)); unwritten = __copy_from_user_inatomic_nocache(fb_cmd + sizeof(union qxl_release_info) + (release->release_offset & ~PAGE_SIZE), (void *)(unsigned long)user_cmd.command, user_cmd.command_size); -// if (DRM_COPY_FROM_USER(fb_cmd + sizeof(union qxl_release_info), -// (void *)user_cmd.command, -// user_cmd.command_size)) -// return -EFAULT; qxl_bo_kunmap_atomic_page(qdev, cmd_bo, fb_cmd); if (unwritten) { DRM_ERROR("got unwritten %d\n", unwritten); @@ -209,35 +193,26 @@ int qxl_execbuffer_ioctl(struct drm_device *dev, void *data, qxl_release_free(qdev, release); return -EFAULT; } -#if 0 - qxl_io_log(qdev, "%s: type %d, size %d, #relocs %d\n", - __func__, user_cmd.type, - user_cmd.command_size, user_cmd.relocs_num); -#endif + for (i = 0 ; i < user_cmd.relocs_num; ++i) { if (DRM_COPY_FROM_USER(&reloc, &((struct drm_qxl_reloc *)user_cmd.relocs)[i], sizeof(reloc))) { - DRM_ERROR("Got failed copy\n"); qxl_bo_list_unreserve(&reloc_list, true); qxl_release_unreserve(qdev, release); qxl_release_free(qdev, release); return -EFAULT; } -#if 0 - qxl_io_log(qdev, "%s: r#%d: %d+%d->%d+%d\n", - __func__, i, reloc.src_handle, - reloc.src_offset, reloc.dst_handle, - reloc.dst_offset); -#endif + /* add the bos to the list of bos to validate - need to validate first then process relocs? */ if (reloc.dst_handle) { reloc_dst_bo = qxlhw_handle_to_bo(qdev, file_priv, reloc.dst_handle, &reloc_list); if (!reloc_dst_bo) { - DRM_ERROR("no reloc dst bo fail\n"); + qxl_bo_list_unreserve(&reloc_list, true); qxl_release_unreserve(qdev, release); + qxl_release_free(qdev, release); return -EINVAL; } reloc_dst_offset = 0; @@ -252,7 +227,6 @@ int qxl_execbuffer_ioctl(struct drm_device *dev, void *data, qxlhw_handle_to_bo(qdev, file_priv, reloc.src_handle, &reloc_list); if (!reloc_src_bo) { - DRM_ERROR("no reloc src bo fail %d\n", reloc.src_handle); if (reloc_dst_bo != cmd_bo) drm_gem_object_unreference_unlocked(&reloc_dst_bo->gem_base); qxl_bo_list_unreserve(&reloc_list, true); @@ -277,15 +251,11 @@ int qxl_execbuffer_ioctl(struct drm_device *dev, void *data, drm_gem_object_unreference_unlocked(&reloc_src_bo->gem_base); } - if (reloc_dst_bo != cmd_bo) { - // qxl_release_add_res(qdev, release, qxl_bo_ref(reloc_dst_bo)); + if (reloc_dst_bo != cmd_bo) drm_gem_object_unreference_unlocked(&reloc_dst_bo->gem_base); - } } qxl_fence_releaseable(qdev, release); - /* TODO: multiple commands in a single push (introduce new - * QXLCommandBunch ?) */ ret = qxl_push_command_ring_release(qdev, release, user_cmd.type, true); if (ret == -ERESTARTSYS) { qxl_release_unreserve(qdev, release); @@ -299,9 +269,6 @@ int qxl_execbuffer_ioctl(struct drm_device *dev, void *data, return 0; } -/* TODO: this should be defined in ram or rom */ -#define NUM_SURFACES 1024 - int qxl_update_area_ioctl(struct drm_device *dev, void *data, struct drm_file *file) { diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c index 8ad689544373..622ecafcbad9 100644 --- a/drivers/gpu/drm/qxl/qxl_ttm.c +++ b/drivers/gpu/drm/qxl/qxl_ttm.c @@ -376,10 +376,8 @@ retry: if (sc == 0) { if (bo->type == QXL_GEM_DOMAIN_SURFACE) qxl_update_surface(qfence->qdev, bo); - } //else if (sc == 1) - // qxl_io_flush_surfaces(qfence->qdev); + } else if (sc >= 1) { - printk("notifying oom from sync obj wait\n"); qxl_io_notify_oom(qfence->qdev); } @@ -399,13 +397,11 @@ retry: } if (qfence->num_active_releases) { - int i; bool have_drawable_releases = false; void **slot; struct radix_tree_iter iter; int release_id; - qxl_io_log(qfence->qdev, "sync obj %d still has outstanding releases %d %d %d %d %d\n", sc, bo->surface_id, bo->is_primary, bo->pin_count, bo->gem_base.size, qfence->num_active_releases); radix_tree_for_each_slot(slot, &qfence->tree, &iter, 0) { struct qxl_release *release; @@ -413,64 +409,21 @@ retry: release = qxl_release_from_id_locked(qfence->qdev, release_id); if (release == NULL) continue; - qxl_io_log(qfence->qdev, "release %d is %d\n", release_id, release->type); - - if (release->type == QXL_RELEASE_SURFACE_CMD) { - struct qxl_surface_cmd *scmd; - int ret; - bool reserved = true; - - ret = qxl_release_reserve(qfence->qdev, release, false); - if (ret) { - qxl_io_log(qfence->qdev, "failed to reserve bo for id %d\n", release_id); - continue; - } - - scmd = (struct qxl_surface_cmd *)qxl_release_map(qfence->qdev, release); - - qxl_io_log(qfence->qdev, "surf %d %d\n", scmd->surface_id, scmd->type); - if (scmd->type == 0) - qxl_io_log(qfence->qdev, "CREATE %llx %d %d %d %d\n", scmd->u.surface_create.data, scmd->u.surface_create.width, scmd->u.surface_create.height, scmd->u.surface_create.stride); - qxl_release_unmap(qfence->qdev, release, &scmd->release_info); - if (reserved) - qxl_release_unreserve(qfence->qdev, release); - } - - if (release->type != QXL_RELEASE_DRAWABLE) - continue; - - have_drawable_releases = true; - { - struct qxl_drawable *draw; - int ret; - struct qxl_bo *bo; - bo = release->bos[0]; - ret = qxl_release_reserve(qfence->qdev, release, false); - if (ret) { - qxl_io_log(qfence->qdev, "failed to reserve bo for id %d\n", release_id); - continue; - } - - draw = (struct qxl_drawable *)qxl_release_map(qfence->qdev, release); - - qxl_io_log(qfence->qdev, "draw %d %d\n", draw->surface_id, draw->type); - if (draw->type == 3) - qxl_io_log(qfence->qdev, "COPY %llx %d %d %d %d\n", draw->u.copy.src_bitmap, draw->u.copy.src_area.top, draw->u.copy.src_area.bottom, draw->u.copy.src_area.left, draw->u.copy.src_area.right); - qxl_release_unmap(qfence->qdev, release, &draw->release_info); - qxl_release_unreserve(qfence->qdev, release); - } - + + if (release->type == QXL_RELEASE_DRAWABLE) + have_drawable_releases = true; } - WARN(1, "sync obj %d still has outstanding releases %d %d %d %d %d\n", sc, bo->surface_id, bo->is_primary, bo->pin_count, bo->gem_base.size, qfence->num_active_releases); qxl_queue_garbage_collect(qfence->qdev, true); if (have_drawable_releases || sc < 4) { if (sc > 2) /* back off */ usleep_range(500, 1000); - if (have_drawable_releases && sc > 300) + if (have_drawable_releases && sc > 300) { + WARN(1, "sync obj %d still has outstanding releases %d %d %d %ld %d\n", sc, bo->surface_id, bo->is_primary, bo->pin_count, (unsigned long)bo->gem_base.size, qfence->num_active_releases); return -EBUSY; + } goto retry; } } @@ -494,9 +447,7 @@ static void *qxl_sync_obj_ref(void *sync_obj) static bool qxl_sync_obj_signaled(void *sync_obj) { struct qxl_fence *qfence = (struct qxl_fence *)sync_obj; - bool ret; - ret = qfence->num_active_releases == 0; - return ret; + return (qfence->num_active_releases == 0); } static void qxl_bo_move_notify(struct ttm_buffer_object *bo, |