|
@@ -346,6 +346,7 @@ static int
|
|
i915_gem_create(struct drm_file *file,
|
|
i915_gem_create(struct drm_file *file,
|
|
struct drm_device *dev,
|
|
struct drm_device *dev,
|
|
uint64_t size,
|
|
uint64_t size,
|
|
|
|
+ bool dumb,
|
|
uint32_t *handle_p)
|
|
uint32_t *handle_p)
|
|
{
|
|
{
|
|
struct drm_i915_gem_object *obj;
|
|
struct drm_i915_gem_object *obj;
|
|
@@ -361,6 +362,7 @@ i915_gem_create(struct drm_file *file,
|
|
if (obj == NULL)
|
|
if (obj == NULL)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
+ obj->base.dumb = dumb;
|
|
ret = drm_gem_handle_create(file, &obj->base, &handle);
|
|
ret = drm_gem_handle_create(file, &obj->base, &handle);
|
|
/* drop reference from allocate - handle holds it now */
|
|
/* drop reference from allocate - handle holds it now */
|
|
drm_gem_object_unreference_unlocked(&obj->base);
|
|
drm_gem_object_unreference_unlocked(&obj->base);
|
|
@@ -380,7 +382,7 @@ i915_gem_dumb_create(struct drm_file *file,
|
|
args->pitch = ALIGN(args->width * DIV_ROUND_UP(args->bpp, 8), 64);
|
|
args->pitch = ALIGN(args->width * DIV_ROUND_UP(args->bpp, 8), 64);
|
|
args->size = args->pitch * args->height;
|
|
args->size = args->pitch * args->height;
|
|
return i915_gem_create(file, dev,
|
|
return i915_gem_create(file, dev,
|
|
- args->size, &args->handle);
|
|
|
|
|
|
+ args->size, true, &args->handle);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -393,7 +395,7 @@ i915_gem_create_ioctl(struct drm_device *dev, void *data,
|
|
struct drm_i915_gem_create *args = data;
|
|
struct drm_i915_gem_create *args = data;
|
|
|
|
|
|
return i915_gem_create(file, dev,
|
|
return i915_gem_create(file, dev,
|
|
- args->size, &args->handle);
|
|
|
|
|
|
+ args->size, false, &args->handle);
|
|
}
|
|
}
|
|
|
|
|
|
static inline int
|
|
static inline int
|
|
@@ -1773,10 +1775,10 @@ static void i915_gem_object_free_mmap_offset(struct drm_i915_gem_object *obj)
|
|
drm_gem_free_mmap_offset(&obj->base);
|
|
drm_gem_free_mmap_offset(&obj->base);
|
|
}
|
|
}
|
|
|
|
|
|
-int
|
|
|
|
|
|
+static int
|
|
i915_gem_mmap_gtt(struct drm_file *file,
|
|
i915_gem_mmap_gtt(struct drm_file *file,
|
|
struct drm_device *dev,
|
|
struct drm_device *dev,
|
|
- uint32_t handle,
|
|
|
|
|
|
+ uint32_t handle, bool dumb,
|
|
uint64_t *offset)
|
|
uint64_t *offset)
|
|
{
|
|
{
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
@@ -1793,6 +1795,13 @@ i915_gem_mmap_gtt(struct drm_file *file,
|
|
goto unlock;
|
|
goto unlock;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * We don't allow dumb mmaps on objects created using another
|
|
|
|
+ * interface.
|
|
|
|
+ */
|
|
|
|
+ WARN_ONCE(dumb && !(obj->base.dumb || obj->base.import_attach),
|
|
|
|
+ "Illegal dumb map of accelerated buffer.\n");
|
|
|
|
+
|
|
if (obj->base.size > dev_priv->gtt.mappable_end) {
|
|
if (obj->base.size > dev_priv->gtt.mappable_end) {
|
|
ret = -E2BIG;
|
|
ret = -E2BIG;
|
|
goto out;
|
|
goto out;
|
|
@@ -1817,6 +1826,15 @@ unlock:
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+int
|
|
|
|
+i915_gem_dumb_map_offset(struct drm_file *file,
|
|
|
|
+ struct drm_device *dev,
|
|
|
|
+ uint32_t handle,
|
|
|
|
+ uint64_t *offset)
|
|
|
|
+{
|
|
|
|
+ return i915_gem_mmap_gtt(file, dev, handle, true, offset);
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* i915_gem_mmap_gtt_ioctl - prepare an object for GTT mmap'ing
|
|
* i915_gem_mmap_gtt_ioctl - prepare an object for GTT mmap'ing
|
|
* @dev: DRM device
|
|
* @dev: DRM device
|
|
@@ -1838,7 +1856,7 @@ i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data,
|
|
{
|
|
{
|
|
struct drm_i915_gem_mmap_gtt *args = data;
|
|
struct drm_i915_gem_mmap_gtt *args = data;
|
|
|
|
|
|
- return i915_gem_mmap_gtt(file, dev, args->handle, &args->offset);
|
|
|
|
|
|
+ return i915_gem_mmap_gtt(file, dev, args->handle, false, &args->offset);
|
|
}
|
|
}
|
|
|
|
|
|
static inline int
|
|
static inline int
|