[PATCH] drm/i915: Reserve powerctx for chv from the stolen allocator

Chris Wilson chris at chris-wilson.co.uk
Sat Nov 4 21:00:18 UTC 2017


Ensure that we do not overwrite the cherryview power context by
reserving its range in the stolen allocator; exactly like how we handle
the same reservation for valleyview.

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h |  3 +--
 drivers/gpu/drm/i915/intel_pm.c | 50 ++++++++++++++++++-----------------------
 2 files changed, 23 insertions(+), 30 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 72bb5b51035a..d6462388c3a6 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1377,6 +1377,7 @@ struct intel_rps {
 };
 
 struct intel_rc6 {
+	struct drm_i915_gem_object *pctx;
 	bool enabled;
 };
 
@@ -2464,8 +2465,6 @@ struct drm_i915_private {
 
 	struct i915_gpu_error gpu_error;
 
-	struct drm_i915_gem_object *vlv_pctx;
-
 	/* list of fbdev register on this device */
 	struct intel_fbdev *fbdev;
 	struct work_struct fbdev_suspend_work;
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 07118c0b69d3..ad81bc16a390 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -7034,7 +7034,7 @@ static void valleyview_check_pctx(struct drm_i915_private *dev_priv)
 	unsigned long pctx_addr = I915_READ(VLV_PCBR) & ~4095;
 
 	WARN_ON(pctx_addr != dev_priv->mm.stolen_base +
-			     dev_priv->vlv_pctx->stolen->start);
+			     dev_priv->gt_pm.rc6.pctx->stolen->start);
 }
 
 
@@ -7049,21 +7049,26 @@ static void cherryview_check_pctx(struct drm_i915_private *dev_priv)
 static void cherryview_setup_pctx(struct drm_i915_private *dev_priv)
 {
 	struct i915_ggtt *ggtt = &dev_priv->ggtt;
-	unsigned long pctx_paddr, paddr;
-	u32 pcbr;
-	int pctx_size = 32*1024;
+	const int pctx_size = 32*1024;
+	u32 pcbr, addr, end;
 
 	pcbr = I915_READ(VLV_PCBR);
-	if ((pcbr >> VLV_PCBR_ADDR_SHIFT) == 0) {
+	addr = pcbr >> VLV_PCBR_ADDR_SHIFT << VLV_PCBR_ADDR_SHIFT;
+	if (addr == 0) {
 		DRM_DEBUG_DRIVER("BIOS didn't set up PCBR, fixing up\n");
-		paddr = (dev_priv->mm.stolen_base +
-			 (ggtt->stolen_size - pctx_size));
-
-		pctx_paddr = (paddr & (~4095));
-		I915_WRITE(VLV_PCBR, pctx_paddr);
+		addr = dev_priv->mm.stolen_base +
+			(ggtt->stolen_size - pctx_size);
+		I915_WRITE(VLV_PCBR, addr & -4096);
 	}
-
 	DRM_DEBUG_DRIVER("PCBR: 0x%08x\n", I915_READ(VLV_PCBR));
+
+	end = round_up(addr + pctx_size, 4096);
+	addr = round_down(addr, 4096);
+	dev_priv->gt_pm.rc6.pctx =
+		i915_gem_object_create_stolen_for_preallocated(dev_priv,
+							       addr - dev_priv->mm.stolen_base,
+							       I915_GTT_OFFSET_NONE,
+							       end - addr);
 }
 
 static void valleyview_setup_pctx(struct drm_i915_private *dev_priv)
@@ -7107,16 +7112,7 @@ static void valleyview_setup_pctx(struct drm_i915_private *dev_priv)
 
 out:
 	DRM_DEBUG_DRIVER("PCBR: 0x%08x\n", I915_READ(VLV_PCBR));
-	dev_priv->vlv_pctx = pctx;
-}
-
-static void valleyview_cleanup_pctx(struct drm_i915_private *dev_priv)
-{
-	if (WARN_ON(!dev_priv->vlv_pctx))
-		return;
-
-	i915_gem_object_put(dev_priv->vlv_pctx);
-	dev_priv->vlv_pctx = NULL;
+	dev_priv->gt_pm.rc6.pctx = pctx;
 }
 
 static void vlv_init_gpll_ref_freq(struct drm_i915_private *dev_priv)
@@ -7225,11 +7221,6 @@ static void cherryview_init_gt_powersave(struct drm_i915_private *dev_priv)
 		  "Odd GPU freq values\n");
 }
 
-static void valleyview_cleanup_gt_powersave(struct drm_i915_private *dev_priv)
-{
-	valleyview_cleanup_pctx(dev_priv);
-}
-
 static void cherryview_enable_rc6(struct drm_i915_private *dev_priv)
 {
 	struct intel_engine_cs *engine;
@@ -7949,8 +7940,11 @@ void intel_init_gt_powersave(struct drm_i915_private *dev_priv)
 
 void intel_cleanup_gt_powersave(struct drm_i915_private *dev_priv)
 {
-	if (IS_VALLEYVIEW(dev_priv))
-		valleyview_cleanup_gt_powersave(dev_priv);
+	struct drm_i915_gem_object *pctx;
+
+	pctx = fetch_and_zero(&dev_priv->gt_pm.rc6.pctx);
+	if (pctx)
+		i915_gem_object_put(pctx);
 
 	if (!i915_modparams.enable_rc6)
 		intel_runtime_pm_put(dev_priv);
-- 
2.15.0



More information about the Intel-gfx-trybot mailing list