[PATCH 11/11] f2

Chris Wilson chris at chris-wilson.co.uk
Sun Nov 5 12:23:12 UTC 2017


---
 drivers/gpu/drm/i915/i915_drv.c        | 37 ++++++++++++++++++++++--------
 drivers/gpu/drm/i915/i915_gem.c        |  2 --
 drivers/gpu/drm/i915/i915_gem_gtt.c    | 14 ++++--------
 drivers/gpu/drm/i915/i915_gem_stolen.c |  4 ++--
 drivers/gpu/drm/i915/intel_display.c   | 12 ----------
 drivers/gpu/drm/i915/intel_pm.c        | 42 ++++++++++++++--------------------
 6 files changed, 51 insertions(+), 60 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index fe9e539b6c29..5195206de3a1 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -632,8 +632,6 @@ static void i915_gem_fini(struct drm_i915_private *dev_priv)
 	i915_gem_drain_freed_objects(dev_priv);
 
 	WARN_ON(!list_empty(&dev_priv->contexts.list));
-
-	intel_cleanup_gt_powersave(dev_priv);
 }
 
 static int i915_load_modeset_init(struct drm_device *dev)
@@ -1004,6 +1002,17 @@ static void i915_mmio_cleanup(struct drm_i915_private *dev_priv)
 	pci_iounmap(pdev, dev_priv->regs);
 }
 
+static void intel_init_czclk(struct drm_i915_private *dev_priv)
+{
+	if (!(IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)))
+		return;
+
+	dev_priv->czclk_freq = vlv_get_cck_clock_hpll(dev_priv, "czclk",
+						      CCK_CZ_CLOCK_CONTROL);
+
+	DRM_DEBUG_DRIVER("CZ clock rate: %d kHz\n", dev_priv->czclk_freq);
+}
+
 /**
  * i915_driver_init_mmio - setup device MMIO
  * @dev_priv: device private
@@ -1028,19 +1037,31 @@ static int i915_driver_init_mmio(struct drm_i915_private *dev_priv)
 		goto err_bridge;
 
 	intel_uncore_init(dev_priv);
+	intel_device_info_runtime_init(dev_priv);
+	intel_init_czclk(dev_priv);
+
+	ret = i915_ggtt_probe_hw(dev_priv);
+	if (ret)
+		goto err_uncore;
+
+	intel_init_gt_powersave(dev_priv);
 
 	intel_uc_init_mmio(dev_priv);
 
 	ret = intel_engines_init_mmio(dev_priv);
 	if (ret)
-		goto err_uncore;
+		goto err_gt;
 
 	i915_gem_init_mmio(dev_priv);
 
 	return 0;
 
+err_gt:
+	intel_cleanup_gt_powersave(dev_priv);
+	i915_ggtt_cleanup_hw(dev_priv);
 err_uncore:
 	intel_uncore_fini(dev_priv);
+	i915_mmio_cleanup(dev_priv);
 err_bridge:
 	pci_dev_put(dev_priv->bridge_dev);
 
@@ -1053,6 +1074,8 @@ static int i915_driver_init_mmio(struct drm_i915_private *dev_priv)
  */
 static void i915_driver_cleanup_mmio(struct drm_i915_private *dev_priv)
 {
+	intel_cleanup_gt_powersave(dev_priv);
+	i915_ggtt_cleanup_hw(dev_priv);
 	intel_uncore_fini(dev_priv);
 	i915_mmio_cleanup(dev_priv);
 	pci_dev_put(dev_priv->bridge_dev);
@@ -1100,14 +1123,8 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv)
 	if (i915_inject_load_failure())
 		return -ENODEV;
 
-	intel_device_info_runtime_init(dev_priv);
-
 	intel_sanitize_options(dev_priv);
 
-	ret = i915_ggtt_probe_hw(dev_priv);
-	if (ret)
-		return ret;
-
 	/* WARNING: Apparently we must kick fbdev drivers before vgacon,
 	 * otherwise the vga fbdev driver falls over. */
 	ret = i915_kick_out_firmware_fb(dev_priv);
@@ -1126,6 +1143,7 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv)
 	if (ret)
 		return ret;
 
+
 	ret = i915_ggtt_enable_hw(dev_priv);
 	if (ret) {
 		DRM_ERROR("failed to enable GGTT\n");
@@ -1213,7 +1231,6 @@ static void i915_driver_cleanup_hw(struct drm_i915_private *dev_priv)
 		pci_disable_msi(pdev);
 
 	pm_qos_remove_request(&dev_priv->pm_qos);
-	i915_ggtt_cleanup_hw(dev_priv);
 }
 
 /**
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 74f230652029..4075f7d1867f 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -5134,8 +5134,6 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
 	if (ret)
 		goto out_unlock;
 
-	intel_init_gt_powersave(dev_priv);
-
 	ret = i915_gem_init_hw(dev_priv);
 	if (ret)
 		goto out_unlock;
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 0684d5df97d9..30c9d858adab 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -3503,7 +3503,11 @@ int i915_ggtt_probe_hw(struct drm_i915_private *dev_priv)
 	if (intel_vtd_active())
 		DRM_INFO("VT-d active for gfx access\n");
 
-	return 0;
+	/*
+	 * Initialise stolen early so that we may reserve preallocated
+	 * objects for the BIOS to KMS transition.
+	 */
+	return i915_gem_init_stolen(dev_priv);
 }
 
 /**
@@ -3537,14 +3541,6 @@ int i915_ggtt_init_hw(struct drm_i915_private *dev_priv)
 
 	ggtt->mtrr = arch_phys_wc_add(ggtt->mappable_base, ggtt->mappable_end);
 
-	/*
-	 * Initialise stolen early so that we may reserve preallocated
-	 * objects for the BIOS to KMS transition.
-	 */
-	ret = i915_gem_init_stolen(dev_priv);
-	if (ret)
-		goto out_gtt_cleanup;
-
 	return 0;
 
 out_gtt_cleanup:
diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c
index 03e7abc7e043..a6f89be75195 100644
--- a/drivers/gpu/drm/i915/i915_gem_stolen.c
+++ b/drivers/gpu/drm/i915/i915_gem_stolen.c
@@ -657,8 +657,6 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv
 	if (!drm_mm_initialized(&dev_priv->mm.stolen))
 		return NULL;
 
-	lockdep_assert_held(&dev_priv->drm.struct_mutex);
-
 	DRM_DEBUG_KMS("creating preallocated stolen object: stolen_offset=%x, gtt_offset=%x, size=%x\n",
 			stolen_offset, gtt_offset, size);
 
@@ -695,6 +693,8 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv
 	if (gtt_offset == I915_GTT_OFFSET_NONE)
 		return obj;
 
+	lockdep_assert_held(&dev_priv->drm.struct_mutex);
+
 	ret = i915_gem_object_pin_pages(obj);
 	if (ret)
 		goto err;
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index de91a17c9a47..e88c65e98b4f 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -202,17 +202,6 @@ int vlv_get_cck_clock_hpll(struct drm_i915_private *dev_priv,
 				 dev_priv->hpll_freq);
 }
 
-static void intel_update_czclk(struct drm_i915_private *dev_priv)
-{
-	if (!(IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)))
-		return;
-
-	dev_priv->czclk_freq = vlv_get_cck_clock_hpll(dev_priv, "czclk",
-						      CCK_CZ_CLOCK_CONTROL);
-
-	DRM_DEBUG_DRIVER("CZ clock rate: %d kHz\n", dev_priv->czclk_freq);
-}
-
 static inline u32 /* units of 100MHz */
 intel_fdi_link_freq(struct drm_i915_private *dev_priv,
 		    const struct intel_crtc_state *pipe_config)
@@ -14542,7 +14531,6 @@ int intel_modeset_init(struct drm_device *dev)
 
 	intel_shared_dpll_init(dev);
 
-	intel_update_czclk(dev_priv);
 	intel_modeset_init_hw(dev);
 
 	if (dev_priv->max_cdclk_freq == 0)
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 3d9b0b7c4a5e..4d402ad0130d 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -7028,24 +7028,6 @@ static int valleyview_rps_min_freq(struct drm_i915_private *dev_priv)
 	return max_t(u32, val, 0xc0);
 }
 
-/* Check that the pctx buffer wasn't move under us. */
-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->gt_pm.rc6.pctx->stolen->start);
-}
-
-
-/* Check that the pcbr address is not empty. */
-static void cherryview_check_pctx(struct drm_i915_private *dev_priv)
-{
-	unsigned long pctx_addr = I915_READ(VLV_PCBR) & ~4095;
-
-	WARN_ON((pctx_addr >> VLV_PCBR_ADDR_SHIFT) == 0);
-}
-
 static void vlv_reserve_pctx(struct drm_i915_private *dev_priv, int pctx_size)
 {
 	struct drm_i915_gem_object *pctx;
@@ -7054,13 +7036,12 @@ static void vlv_reserve_pctx(struct drm_i915_private *dev_priv, int pctx_size)
 	pcbr = I915_READ(VLV_PCBR);
 	if (pcbr) {
 		/* BIOS set it up already, grab the pre-alloc'd space */
-		u32 start = round_down(pcbr, 4096);
-		u32 end = round_up(pcbr + pctx_size, 4096);
+		u32 offset = round_down(pcbr, 4096) - dev_priv->mm.stolen_base;
 
 		pctx = i915_gem_object_create_stolen_for_preallocated(dev_priv,
-								      start - dev_priv->mm.stolen_base,
+								      offset,
 								      I915_GTT_OFFSET_NONE,
-								      end - start);
+								      pctx_size);
 	} else {
 		DRM_DEBUG_DRIVER("BIOS didn't set up PCBR, fixing up\n");
 
@@ -7075,7 +7056,7 @@ static void vlv_reserve_pctx(struct drm_i915_private *dev_priv, int pctx_size)
 		pctx = i915_gem_object_create_stolen(dev_priv, pctx_size);
 		if (!pctx) {
 			DRM_DEBUG("not enough stolen space for PCTX, disabling\n");
-			return;
+			goto out;
 		}
 
 		I915_WRITE(VLV_PCBR,
@@ -7083,9 +7064,20 @@ static void vlv_reserve_pctx(struct drm_i915_private *dev_priv, int pctx_size)
 	}
 	DRM_DEBUG_DRIVER("PCBR: 0x%08x [0x%08x]\n", I915_READ(VLV_PCBR), pcbr);
 
+out:
+	if (!pctx)
+		DRM_ERROR("Failed to reserve memory for the power context; (PCBR: 0x%08x, size %d KiB; stolen base 0x%08x)\n", pcbr, pctx_size >> 10, (u32)dev_priv->mm.stolen_base);
 	dev_priv->gt_pm.rc6.pctx = pctx;
 }
 
+static void vlv_check_pctx(struct drm_i915_private *dev_priv)
+{
+	u32 pctx_addr = I915_READ(VLV_PCBR) & ~4095;
+
+	WARN_ON(pctx_addr - dev_priv->mm.stolen_base !=
+		dev_priv->gt_pm.rc6.pctx->stolen->start);
+}
+
 static void valleyview_setup_pctx(struct drm_i915_private *dev_priv)
 {
 	vlv_reserve_pctx(dev_priv, 24 << 10);
@@ -7216,7 +7208,7 @@ static void cherryview_enable_rc6(struct drm_i915_private *dev_priv)
 		I915_WRITE(GTFIFODBG, gtfifodbg);
 	}
 
-	cherryview_check_pctx(dev_priv);
+	vlv_check_pctx(dev_priv);
 
 	/* 1a & 1b: Get forcewake during program sequence. Although the driver
 	 * hasn't enabled a state yet where we need forcewake, BIOS may have.*/
@@ -7304,7 +7296,7 @@ static void valleyview_enable_rc6(struct drm_i915_private *dev_priv)
 	enum intel_engine_id id;
 	u32 gtfifodbg, rc6_mode = 0;
 
-	valleyview_check_pctx(dev_priv);
+	vlv_check_pctx(dev_priv);
 
 	gtfifodbg = I915_READ(GTFIFODBG);
 	if (gtfifodbg) {
-- 
2.15.0



More information about the Intel-gfx-trybot mailing list