[PATCH 1/2] drm/i915: prevent GGTT pinning during nogem display init
Matthew Auld
matthew.auld at intel.com
Wed Nov 25 12:23:33 UTC 2020
Signed-off-by: Matthew Auld <matthew.auld at intel.com>
---
drivers/gpu/drm/i915/display/intel_dsb.c | 8 ++++++++
drivers/gpu/drm/i915/gt/intel_ggtt.c | 6 ++++++
drivers/gpu/drm/i915/gt/intel_gtt.h | 2 ++
drivers/gpu/drm/i915/i915_gem.c | 2 ++
4 files changed, 18 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_dsb.c b/drivers/gpu/drm/i915/display/intel_dsb.c
index 566fa72427b3..6dc62dd7ec66 100644
--- a/drivers/gpu/drm/i915/display/intel_dsb.c
+++ b/drivers/gpu/drm/i915/display/intel_dsb.c
@@ -270,6 +270,14 @@ void intel_dsb_prepare(struct intel_crtc_state *crtc_state)
if (!HAS_DSB(i915))
return;
+ /*
+ * Can be called from the _nogem init path, at which point it is unsafe
+ * to try to pin stuff in the GGTT, before we have finished all of the
+ * GGTT init related work.
+ */
+ if (!i915_ggtt_initialized(&i915->ggtt))
+ return;
+
dsb = kmalloc(sizeof(*dsb), GFP_KERNEL);
if (!dsb) {
drm_err(&i915->drm, "DSB object creation failed\n");
diff --git a/drivers/gpu/drm/i915/gt/intel_ggtt.c b/drivers/gpu/drm/i915/gt/intel_ggtt.c
index cf94525be2c1..71992be043f6 100644
--- a/drivers/gpu/drm/i915/gt/intel_ggtt.c
+++ b/drivers/gpu/drm/i915/gt/intel_ggtt.c
@@ -660,6 +660,11 @@ static void fini_aliasing_ppgtt(struct i915_ggtt *ggtt)
ggtt->vm.vma_ops.unbind_vma = ggtt_unbind_vma;
}
+bool i915_ggtt_initialized(struct i915_ggtt *ggtt)
+{
+ return ggtt->initialized;
+}
+
int i915_init_ggtt(struct drm_i915_private *i915)
{
int ret;
@@ -674,6 +679,7 @@ int i915_init_ggtt(struct drm_i915_private *i915)
cleanup_init_ggtt(&i915->ggtt);
}
+ i915->ggtt.initialized = true;
return 0;
}
diff --git a/drivers/gpu/drm/i915/gt/intel_gtt.h b/drivers/gpu/drm/i915/gt/intel_gtt.h
index 8a33940a71f3..0851932b0f3e 100644
--- a/drivers/gpu/drm/i915/gt/intel_gtt.h
+++ b/drivers/gpu/drm/i915/gt/intel_gtt.h
@@ -309,6 +309,7 @@ struct i915_ggtt {
/** PPGTT used for aliasing the PPGTT with the GTT */
struct i915_ppgtt *alias;
+ bool initialized; /* post i915_init_ggtt */
bool do_idle_maps;
int mtrr;
@@ -488,6 +489,7 @@ int i915_ggtt_enable_hw(struct drm_i915_private *i915);
void i915_ggtt_enable_guc(struct i915_ggtt *ggtt);
void i915_ggtt_disable_guc(struct i915_ggtt *ggtt);
int i915_init_ggtt(struct drm_i915_private *i915);
+bool i915_ggtt_initialized(struct i915_ggtt *ggtt);
void i915_ggtt_driver_release(struct drm_i915_private *i915);
static inline bool i915_ggtt_has_aperture(const struct i915_ggtt *ggtt)
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 58276694c848..dffd5c6612bd 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -952,6 +952,8 @@ i915_gem_object_ggtt_pin_ww(struct drm_i915_gem_object *obj,
struct i915_vma *vma;
int ret;
+ GEM_BUG_ON(!i915_ggtt_initialized(ggtt));
+
if (flags & PIN_MAPPABLE &&
(!view || view->type == I915_GGTT_VIEW_NORMAL)) {
/*
--
2.26.2
More information about the Intel-gfx-trybot
mailing list