#define DRIVER_MINOR 1
 #define DRIVER_PATCHLEVEL 0
 
+struct virtio_gpu_object_params {
+       unsigned long size;
+};
+
 struct virtio_gpu_object {
        struct drm_gem_object gem_base;
        uint32_t hw_res_handle;
 void virtio_gpu_gem_fini(struct virtio_gpu_device *vgdev);
 int virtio_gpu_gem_create(struct drm_file *file,
                          struct drm_device *dev,
-                         uint64_t size,
+                         struct virtio_gpu_object_params *params,
                          struct drm_gem_object **obj_p,
                          uint32_t *handle_p);
 int virtio_gpu_gem_object_open(struct drm_gem_object *obj,
                               struct drm_file *file);
 void virtio_gpu_gem_object_close(struct drm_gem_object *obj,
                                 struct drm_file *file);
-struct virtio_gpu_object *virtio_gpu_alloc_object(struct drm_device *dev,
-                                                 size_t size, bool kernel,
-                                                 bool pinned);
+struct virtio_gpu_object*
+virtio_gpu_alloc_object(struct drm_device *dev,
+                       struct virtio_gpu_object_params *params);
 int virtio_gpu_mode_dumb_create(struct drm_file *file_priv,
                                struct drm_device *dev,
                                struct drm_mode_create_dumb *args);
 
 /* virtio_gpu_object */
 int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
-                            unsigned long size, bool kernel, bool pinned,
+                            struct virtio_gpu_object_params *params,
                             struct virtio_gpu_object **bo_ptr);
 void virtio_gpu_object_kunmap(struct virtio_gpu_object *bo);
 int virtio_gpu_object_kmap(struct virtio_gpu_object *bo);
 
                virtio_gpu_object_unref(&obj);
 }
 
-struct virtio_gpu_object *virtio_gpu_alloc_object(struct drm_device *dev,
-                                                 size_t size, bool kernel,
-                                                 bool pinned)
+struct virtio_gpu_object*
+virtio_gpu_alloc_object(struct drm_device *dev,
+                       struct virtio_gpu_object_params *params)
 {
        struct virtio_gpu_device *vgdev = dev->dev_private;
        struct virtio_gpu_object *obj;
        int ret;
 
-       ret = virtio_gpu_object_create(vgdev, size, kernel, pinned, &obj);
+       ret = virtio_gpu_object_create(vgdev, params, &obj);
        if (ret)
                return ERR_PTR(ret);
 
 
 int virtio_gpu_gem_create(struct drm_file *file,
                          struct drm_device *dev,
-                         uint64_t size,
+                         struct virtio_gpu_object_params *params,
                          struct drm_gem_object **obj_p,
                          uint32_t *handle_p)
 {
        int ret;
        u32 handle;
 
-       obj = virtio_gpu_alloc_object(dev, size, false, false);
+       obj = virtio_gpu_alloc_object(dev, params);
        if (IS_ERR(obj))
                return PTR_ERR(obj);
 
        struct virtio_gpu_device *vgdev = dev->dev_private;
        struct drm_gem_object *gobj;
        struct virtio_gpu_object *obj;
+       struct virtio_gpu_object_params params = { 0 };
        int ret;
        uint32_t pitch;
        uint32_t format;
        args->size = pitch * args->height;
        args->size = ALIGN(args->size, PAGE_SIZE);
 
-       ret = virtio_gpu_gem_create(file_priv, dev, args->size, &gobj,
+       params.size = args->size;
+       ret = virtio_gpu_gem_create(file_priv, dev, ¶ms, &gobj,
                                    &args->handle);
        if (ret)
                goto fail;
 
        struct virtio_gpu_object *qobj;
        struct drm_gem_object *obj;
        uint32_t handle = 0;
-       uint32_t size;
        struct list_head validate_list;
        struct ttm_validate_buffer mainbuf;
        struct virtio_gpu_fence *fence = NULL;
        struct ww_acquire_ctx ticket;
        struct virtio_gpu_resource_create_3d rc_3d;
+       struct virtio_gpu_object_params params = { 0 };
 
        if (vgdev->has_virgl_3d == false) {
                if (rc->depth > 1)
        INIT_LIST_HEAD(&validate_list);
        memset(&mainbuf, 0, sizeof(struct ttm_validate_buffer));
 
-       size = rc->size;
+       params.size = rc->size;
 
        /* allocate a single page size object */
-       if (size == 0)
-               size = PAGE_SIZE;
+       if (params.size == 0)
+               params.size = PAGE_SIZE;
 
-       qobj = virtio_gpu_alloc_object(dev, size, false, false);
+       qobj = virtio_gpu_alloc_object(dev, ¶ms);
        if (IS_ERR(qobj))
                return PTR_ERR(qobj);
        obj = &qobj->gem_base;
 
        kfree(bo);
 }
 
-static void virtio_gpu_init_ttm_placement(struct virtio_gpu_object *vgbo,
-                                         bool pinned)
+static void virtio_gpu_init_ttm_placement(struct virtio_gpu_object *vgbo)
 {
        u32 c = 1;
-       u32 pflag = pinned ? TTM_PL_FLAG_NO_EVICT : 0;
 
        vgbo->placement.placement = &vgbo->placement_code;
        vgbo->placement.busy_placement = &vgbo->placement_code;
        vgbo->placement_code.fpfn = 0;
        vgbo->placement_code.lpfn = 0;
        vgbo->placement_code.flags =
-               TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT | pflag;
+               TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT |
+               TTM_PL_FLAG_NO_EVICT;
        vgbo->placement.num_placement = c;
        vgbo->placement.num_busy_placement = c;
 
 }
 
 int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
-                            unsigned long size, bool kernel, bool pinned,
+                            struct virtio_gpu_object_params *params,
                             struct virtio_gpu_object **bo_ptr)
 {
        struct virtio_gpu_object *bo;
-       enum ttm_bo_type type;
        size_t acc_size;
        int ret;
 
-       if (kernel)
-               type = ttm_bo_type_kernel;
-       else
-               type = ttm_bo_type_device;
        *bo_ptr = NULL;
 
-       acc_size = ttm_bo_dma_acc_size(&vgdev->mman.bdev, size,
+       acc_size = ttm_bo_dma_acc_size(&vgdev->mman.bdev, params->size,
                                       sizeof(struct virtio_gpu_object));
 
        bo = kzalloc(sizeof(struct virtio_gpu_object), GFP_KERNEL);
                kfree(bo);
                return ret;
        }
-       size = roundup(size, PAGE_SIZE);
-       ret = drm_gem_object_init(vgdev->ddev, &bo->gem_base, size);
+       params->size = roundup(params->size, PAGE_SIZE);
+       ret = drm_gem_object_init(vgdev->ddev, &bo->gem_base, params->size);
        if (ret != 0) {
                virtio_gpu_resource_id_put(vgdev, bo->hw_res_handle);
                kfree(bo);
                return ret;
        }
        bo->dumb = false;
-       virtio_gpu_init_ttm_placement(bo, pinned);
+       virtio_gpu_init_ttm_placement(bo);
 
-       ret = ttm_bo_init(&vgdev->mman.bdev, &bo->tbo, size, type,
-                         &bo->placement, 0, !kernel, acc_size,
-                         NULL, NULL, &virtio_gpu_ttm_bo_destroy);
+       ret = ttm_bo_init(&vgdev->mman.bdev, &bo->tbo, params->size,
+                         ttm_bo_type_device, &bo->placement, 0,
+                         true, acc_size, NULL, NULL,
+                         &virtio_gpu_ttm_bo_destroy);
        /* ttm_bo_init failure will call the destroy */
        if (ret != 0)
                return ret;