@@ -789,8 +789,10 @@ int
i915_gem_userptr_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
{
struct drm_i915_private *dev_priv = dev->dev_private;
+ struct drm_i915_file_private *file_priv = file->driver_priv;
struct drm_i915_gem_userptr *args = data;
struct drm_i915_gem_object *obj;
+ struct intel_context *ctx;
int ret;
u32 handle;
@@ -801,8 +803,14 @@ i915_gem_userptr_ioctl(struct drm_device *dev, void *data, struct drm_file *file
if (offset_in_page(args->user_ptr | args->user_size))
return -EINVAL;
- if (args->user_size > dev_priv->gtt.base.total)
- return -E2BIG;
+ ctx = i915_gem_context_get(file_priv, DEFAULT_CONTEXT_HANDLE);
+ if (ctx->ppgtt) {
+ if (args->user_size > ctx->ppgtt->base.total)
+ return -E2BIG;
+ } else {
+ if (args->user_size > dev_priv->gtt.base.total)
+ return -E2BIG;
+ }
if (!access_ok(args->flags & I915_USERPTR_READ_ONLY ? VERIFY_READ : VERIFY_WRITE,
(char __user *)(unsigned long)args->user_ptr, args->user_size))
GTT is only 32b and its max value is 4GB. In order to allow objects bigger than 4GB in 48b PPGTT, i915_gem_userptr_ioctl needs to check against max 48b range (1ULL << 48). Whenever possible, read the PPGTT's total instead of the GTT one, this will be accurate in 32 and 48 bit modes. v2: Use the default ctx to infer the ppgtt max size (Akash). Cc: Akash Goel <akash.goel@intel.com> Signed-off-by: Michel Thierry <michel.thierry@intel.com> --- drivers/gpu/drm/i915/i915_gem_userptr.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)