[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