@@ -1875,6 +1875,13 @@ struct drm_i915_gem_object {
} userptr;
};
+ /* to handle resizing of gem object */
+ struct i915_gem_resize {
+ uint32_t stop;
+ uint32_t base_size;
+ struct page *scratch_page;
+ } gem_resize;
+
/** Object userdata */
uint32_t userdata;
};
@@ -311,10 +311,36 @@ int
i915_gem_create_ioctl(struct drm_device *dev, void *data,
struct drm_file *file)
{
+ int ret;
+ int total_page_count;
+ struct drm_i915_gem_object *obj;
struct drm_i915_gem_create *args = data;
- return i915_gem_create(file, dev,
+ ret = i915_gem_create(file, dev,
args->size, &args->handle);
+
+ if (ret)
+ return ret;
+
+ /*
+ * TODO: args->pad is filled with garbage
+ * Need a better method to identify that its a resizeable object,
+ * use a magic number temporarily
+ */
+ if (args->pad != 0x12345678)
+ return ret;
+
+ obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
+ if (&obj->base == NULL) {
+ printk(KERN_ERR "%s(), object not found\n", __func__);
+ return -ENOENT;
+ }
+ total_page_count = obj->base.size / PAGE_SIZE;
+ obj->gem_resize.base_size = 0;
+ obj->gem_resize.stop = total_page_count;
+ obj->gem_resize.scratch_page = NULL;
+
+ return 0;
}
static inline int
@@ -521,6 +521,13 @@ struct drm_i915_gem_create {
*/
__u32 handle;
__u32 pad;
+ /**
+ * When an object needs to be resized this denotes the size for
+ * which backing storage is created initially
+ * eg in case of mipmaps, size of level0
+ * object is resized later to allocate for higher levels
+ */
+ __u64 base_size;
};
struct drm_i915_gem_pread {