diff options
author | Matthew Auld <matthew.auld@intel.com> | 2019-06-27 21:56:33 +0100 |
---|---|---|
committer | Abdiel Janulgue <abdiel.janulgue@linux.intel.com> | 2019-08-12 15:50:09 +0300 |
commit | fca95f666c14066af08bb822fcef317f3d753a63 (patch) | |
tree | e23508953fd76fc01816e0a0ef7ee7c225ee9f7c | |
parent | b6ad44798a485d48e39c9ff3ae7bbddd99eb6e78 (diff) |
HAX drm/i915/lmem: default userspace allocations to LMEMdrm-tip-lmem-aug-9
Hack patch to default all userspace allocations to LMEM. Useful for
testing purposes.
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index d8a03c5587d4..2cbfa290fe54 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -44,7 +44,9 @@ #include "gem/i915_gem_clflush.h" #include "gem/i915_gem_context.h" #include "gem/i915_gem_ioctls.h" +#include "gem/i915_gem_object_blt.h" #include "gem/i915_gem_pm.h" +#include "gem/i915_gem_lmem.h" #include "gt/intel_engine_user.h" #include "gt/intel_gt.h" #include "gt/intel_gt_pm.h" @@ -171,10 +173,45 @@ i915_gem_create(struct drm_file *file, return -EINVAL; /* Allocate the new object */ - obj = i915_gem_object_create_shmem(dev_priv, size); + if (HAS_LMEM(dev_priv)) + obj = i915_gem_object_create_lmem(dev_priv, size, 0); + else + obj = i915_gem_object_create_shmem(dev_priv, size); if (IS_ERR(obj)) return PTR_ERR(obj); + if (i915_gem_object_is_lmem(obj)) { + struct intel_context *ce = + dev_priv->engine[BCS0]->kernel_context; + + /* + * XXX: We really want to move this to get_pages(), but we + * require grabbing the BKL for the blitting operation which is + * annoying. In the pipeline is support for async get_pages() + * which should fit nicely for this. Also note that the actual + * clear should be done async(we currently do an object_wait + * which is pure garbage), we just need to take care if + * userspace opts of implicit sync for the execbuf, to avoid any + * potential info leak. + */ + + mutex_lock(&dev_priv->drm.struct_mutex); + ret = i915_gem_object_fill_blt(obj, ce, 0); + mutex_unlock(&dev_priv->drm.struct_mutex); + if (ret) { + i915_gem_object_put(obj); + return ret; + } + + i915_gem_object_lock(obj); + ret = i915_gem_object_set_to_cpu_domain(obj, false); + i915_gem_object_unlock(obj); + if (ret) { + i915_gem_object_put(obj); + return ret; + } + } + ret = drm_gem_handle_create(file, &obj->base, &handle); /* drop reference from allocate - handle holds it now */ i915_gem_object_put(obj); |