summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Auld <matthew.auld@intel.com>2019-06-27 21:56:33 +0100
committerAbdiel Janulgue <abdiel.janulgue@linux.intel.com>2019-08-12 15:50:09 +0300
commitfca95f666c14066af08bb822fcef317f3d753a63 (patch)
treee23508953fd76fc01816e0a0ef7ee7c225ee9f7c
parentb6ad44798a485d48e39c9ff3ae7bbddd99eb6e78 (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.c39
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);