All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/8] Enable DC states for skl
@ 2015-04-01 10:49 Animesh Manna
  2015-04-01 10:52 ` [PATCH 1/8] drm/i915/skl: Add support to load SKL CSR firmware Animesh Manna
  2015-04-10 15:10 ` [PATCH v2 0/8] Enable DC states for skl Animesh Manna
  0 siblings, 2 replies; 47+ messages in thread
From: Animesh Manna @ 2015-04-01 10:49 UTC (permalink / raw)
  To: intel-gfx; +Cc: Animesh Manna

Resending the patch series as suggested by Jani.

This patch series contains the implementation for enabling DC states for gen9 
platform, specifically for skl. Few bxt specific changes will be submitted 
seperately in a different patch series which will be extended support for bxt 
and will use major portion of the code of this patch series.

A.Sunil Kamath (3):
  drm/i915/skl: Add support to load SKL CSR firmware
  drm/i915/skl: Implement enable/disable for Display C5 sttate.
  drm/i915/skl: Implement enable/disable for Display C6 state.

Suketu Shah (5):
  drm/i915/skl: Add DC5 Trigger Sequence.
  drm/i915/skl: Assert the requirements to enter or exit DC5.
  drm/i915/skl: Add DC6 Trigger sequence.
  drm/i915/skl: Assert the requirements to enter or exit DC6.
  drm/i915/skl: Enable runtime PM

 drivers/gpu/drm/i915/Makefile           |   3 +-
 drivers/gpu/drm/i915/i915_dma.c         |  12 +-
 drivers/gpu/drm/i915/i915_drv.c         |  49 +++++
 drivers/gpu/drm/i915/i915_drv.h         | 138 +++++++++++++-
 drivers/gpu/drm/i915/i915_reg.h         |  29 +++
 drivers/gpu/drm/i915/intel_csr.c        | 310 ++++++++++++++++++++++++++++++++
 drivers/gpu/drm/i915/intel_drv.h        |   9 +
 drivers/gpu/drm/i915/intel_runtime_pm.c | 232 ++++++++++++++++++++++--
 8 files changed, 760 insertions(+), 22 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/intel_csr.c

-- 
2.0.2

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 47+ messages in thread
* [PATCH 6/8] drm/i915/skl: Add DC6 Trigger sequence.
@ 2015-04-01  7:49 Animesh Manna
  0 siblings, 0 replies; 47+ messages in thread
From: Animesh Manna @ 2015-04-01  7:49 UTC (permalink / raw)
  To: intel-gfx; +Cc: Suketu Shah, Animesh Manna

From: Suketu Shah <suketu.j.shah@intel.com>

Add triggers for DC6 as per details provided in skl_enable_dc6
and skl_disable_dc6 implementations.

Also Call POSTING_READ for every write to a register to ensure
it is written to immediately

v1: Remove POSTING_READ and intel_prepare_ddi calls as they've been added in previous patches.

v2:
1] Remove check for backlight disabled as it should be the case by that time.
2] Mark DC5 as disabled when enabling DC6.
3] Return from DC5-disabling function early if DC5 is already be disabled which can happen
   due to DC6-enabling earlier.
3] Ensure CSR firmware is loaded after resume from DC6 as corresponding memory contents won't
   be retained after runtime-suspend.
4] Ensure that CSR isn't identified as loaded before CSR-loading program is called during
   runtime-resume.

v3: Rebase to latest
Modified as per review comments from Imre and after discussion with Art:
1] DC6 should be preferably enabled when PG2 is disabled by SW as the check for PG1 being
   disabled is taken of by HW to enter DC6, and disabled when PG2 is enabled respectively.
   This helps save more power, especially in the case when display is disabled but GT is
   enabled. Accordingly, replacing DC5 trigger sequence with DC6 for SKL.
2] DC6 could be enabled from intel_runtime_suspend() function, if DC5 is already enabled.
3] Move CSR-load-status setting code from intel_runtime_suspend function to a new function.

v4:
1] Enable/disable DC6 only when toggling the power-well using a newly defined macro ENABLE_DC6.

v5:
1] Load CSR on system resume too as firmware may be lost on system suspend preventing
   enabling DC5, DC6.
2] DDI buffers shouldn't be programmed during driver-load/resume as it's already done
   during modeset initialization then and also that the encoder list is still uninitialized by
   then. Therefore, call intel_prepare_ddi function right after disabling DC6 but outside
   skl_disable_dc6 function and not during driver-load/resume.

v6:
1] Rebase to latest.
2] Move SKL_ENABLE_DC6 macro definition from intel_display.c to intel_runtime_pm.c.

v7:
1) Refactored the code for removing the warning got from checkpatch.
2) After adding dmc ver 1.0 support rebased on top of nightly. (Animesh)

Issue: VIZ-2819
Signed-off-by: A.Sunil Kamath <sunil.kamath@intel.com>
Signed-off-by: Suketu Shah <suketu.j.shah@intel.com>
Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
Signed-off-by: Animesh Manna <animesh.manna@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.c         | 29 ++++++++++
 drivers/gpu/drm/i915/i915_drv.h         |  1 +
 drivers/gpu/drm/i915/intel_runtime_pm.c | 98 +++++++++++++++++----------------
 3 files changed, 81 insertions(+), 47 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 489caa6..352c7702 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -795,6 +795,8 @@ static int i915_drm_resume_early(struct drm_device *dev)
 
 	if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
 		hsw_disable_pc8(dev_priv);
+	else if (IS_SKYLAKE(dev_priv))
+		ret = skl_resume_prepare(dev_priv);
 
 	intel_uncore_sanitize(dev);
 	intel_power_domains_init_hw(dev_priv);
@@ -1009,6 +1011,19 @@ static int i915_pm_resume(struct device *dev)
 	return i915_drm_resume(drm_dev);
 }
 
+static int skl_suspend_complete(struct drm_i915_private *dev_priv)
+{
+	/* Enabling DC6 is not a hard requirement to enter runtime D3 */
+
+	/*
+	 * This is to ensure that CSR isn't identified as loaded before
+	 * CSR-loading program is called during runtime-resume.
+	 */
+	intel_csr_load_status_set(dev_priv, false);
+
+	return 0;
+}
+
 static int hsw_suspend_complete(struct drm_i915_private *dev_priv)
 {
 	hsw_enable_pc8(dev_priv);
@@ -1016,6 +1031,16 @@ static int hsw_suspend_complete(struct drm_i915_private *dev_priv)
 	return 0;
 }
 
+int skl_resume_prepare(struct drm_i915_private *dev_priv)
+{
+	struct drm_device *dev = dev_priv->dev;
+
+	if (!intel_csr_load_status_get(dev_priv))
+		intel_csr_load_program(dev);
+
+	return 0;
+}
+
 /*
  * Save all Gunit registers that may be lost after a D3 and a subsequent
  * S0i[R123] transition. The list of registers needing a save/restore is
@@ -1484,6 +1509,8 @@ static int intel_runtime_resume(struct device *device)
 
 	if (IS_GEN6(dev_priv))
 		intel_init_pch_refclk(dev);
+	else if (IS_SKYLAKE(dev))
+		ret = skl_resume_prepare(dev_priv);
 	else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
 		hsw_disable_pc8(dev_priv);
 	else if (IS_VALLEYVIEW(dev_priv))
@@ -1516,6 +1543,8 @@ static int intel_suspend_complete(struct drm_i915_private *dev_priv)
 	struct drm_device *dev = dev_priv->dev;
 	int ret;
 
+	if (IS_SKYLAKE(dev))
+		ret = skl_suspend_complete(dev_priv);
 	if (IS_HASWELL(dev) || IS_BROADWELL(dev))
 		ret = hsw_suspend_complete(dev_priv);
 	else if (IS_VALLEYVIEW(dev))
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 3320fb4..5dd8d61 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2642,6 +2642,7 @@ extern void i915_update_gfx_val(struct drm_i915_private *dev_priv);
 int vlv_force_gfx_clock(struct drm_i915_private *dev_priv, bool on);
 void intel_hpd_cancel_work(struct drm_i915_private *dev_priv);
 void i915_firmware_load_error_print(const char *fw_path, int err);
+int skl_resume_prepare(struct drm_i915_private *dev_priv);
 
 /* i915_irq.c */
 void i915_queue_hangcheck(struct drm_device *dev);
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index dae65e0..cc94503 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -49,7 +49,8 @@
  * present for a given platform.
  */
 
-#define GEN9_ENABLE_DC5(dev) (IS_SKYLAKE(dev))
+#define GEN9_ENABLE_DC5(dev) 0
+#define SKL_ENABLE_DC6(dev) IS_SKYLAKE(dev)
 
 #define for_each_power_well(i, power_well, domain_mask, power_domains)	\
 	for (i = 0;							\
@@ -373,7 +374,7 @@ static void assert_can_disable_dc5(struct drm_i915_private *dev_priv)
 
 	WARN(!pg2_enabled, "PG2 not enabled to disable DC5.\n");
 	WARN(dev_priv->pm.suspended,
-		"Disabling of DC5 while platform is runtime-suspended should never happen.\n");
+		"Platform is runtime-suspended, should not disable DC5.\n");
 }
 
 static void gen9_enable_dc5(struct drm_i915_private *dev_priv)
@@ -438,8 +439,6 @@ static void skl_disable_dc6(struct drm_i915_private *dev_priv)
 	val &= ~DC_STATE_EN_UPTO_DC6;
 	I915_WRITE(DC_STATE_EN, val);
 	POSTING_READ(DC_STATE_EN);
-
-	intel_prepare_ddi(dev);
 }
 
 static void skl_set_power_well(struct drm_i915_private *dev_priv,
@@ -483,55 +482,60 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv,
 	state_mask = SKL_POWER_WELL_STATE(power_well->data);
 	is_enabled = tmp & state_mask;
 
-	if (enable) {
-		if (!enable_requested) {
-			WARN((tmp & state_mask) &&
-				!I915_READ(HSW_PWR_WELL_BIOS), "Invalid for \
-				 power well status to be enabled, unless done \
-				 by the BIOS, when request is to disable!\n");
-			if (GEN9_ENABLE_DC5(dev) &&
-				power_well->data == SKL_DISP_PW_2)
-				gen9_disable_dc5(dev_priv);
-			I915_WRITE(HSW_PWR_WELL_DRIVER, tmp | req_mask);
+	if (enable && (!enable_requested)) {
+		WARN(is_enabled && !I915_READ(HSW_PWR_WELL_BIOS),
+		"Invalid for power well status to be enabled, unless done by \
+		the BIOS, when request is to disable!\n");
+		if (SKL_ENABLE_DC6(dev) && power_well->data == SKL_DISP_PW_2) {
+			skl_disable_dc6(dev_priv);
+			/*
+			 * DDI buffer programming unnecessary during driver
+			 * load/resumeas it's already done during modeset
+			 * initialization then. It's also invalid here as
+			 * encoder list is still uninitialized.
+			 */
+			if (!dev_priv->power_domains.initializing)
+				intel_prepare_ddi(dev);
 		}
-
-		if (!is_enabled) {
-			DRM_DEBUG_KMS("Enabling %s\n", power_well->name);
-			if (wait_for((I915_READ(HSW_PWR_WELL_DRIVER) &
-				state_mask), 1))
-				DRM_ERROR("%s enable timeout\n",
-					power_well->name);
+		if (GEN9_ENABLE_DC5(dev) && power_well->data == SKL_DISP_PW_2)
+			gen9_disable_dc5(dev_priv);
+		I915_WRITE(HSW_PWR_WELL_DRIVER, tmp | req_mask);
+	}
+	if (enable && (!is_enabled)) {
+		DRM_DEBUG_KMS("Enabling %s\n", power_well->name);
+		if (wait_for((I915_READ(HSW_PWR_WELL_DRIVER) & state_mask), 1))
+			DRM_ERROR("%s enable timeout\n", power_well->name);
 			check_fuse_status = true;
-		}
-	} else {
-		if (enable_requested) {
-			I915_WRITE(HSW_PWR_WELL_DRIVER,	tmp & ~req_mask);
-			POSTING_READ(HSW_PWR_WELL_DRIVER);
-			DRM_DEBUG_KMS("Disabling %s\n", power_well->name);
-
-			if (GEN9_ENABLE_DC5(dev) &&
-				power_well->data == SKL_DISP_PW_2) {
-				if (!dev_priv->csr.failed) {
-					/*
-					* TODO: wait for a completion event or
-					* similar here instead of busy
-					* waiting using wait_for function.
-					*/
-					if (wait_for(
-						intel_csr_load_status_get(
-							dev_priv), 1000))
-						DRM_ERROR("Timed out waiting \
-							for CSR to be loaded!");
-					else
-						gen9_enable_dc5(dev_priv);
-				} else {
-					DRM_ERROR("Cannot enable DC5 as CSR \
-							failed to load!");
-				}
+	}
+	if ((!enable) && enable_requested) {
+		I915_WRITE(HSW_PWR_WELL_DRIVER,	tmp & ~req_mask);
+		POSTING_READ(HSW_PWR_WELL_DRIVER);
+		DRM_DEBUG_KMS("Disabling %s\n", power_well->name);
+
+		if ((GEN9_ENABLE_DC5(dev) || SKL_ENABLE_DC6(dev)) &&
+			power_well->data == SKL_DISP_PW_2) {
+			if (dev_priv->csr.failed) {
+				DRM_ERROR("CSR loading failed, not entering %s",
+				SKL_ENABLE_DC6(dev) ? "DC6" : "DC5");
+				goto exit;
+			}
+			/*
+			 * TODO: wait for a completion event or similar here
+			 * instead of busy waiting using wait_for function.
+			 */
+			if (wait_for(intel_csr_load_status_get(dev_priv),
+								1000)) {
+				DRM_ERROR("Timed out for CSR loading!");
+				goto exit;
 			}
+			if (SKL_ENABLE_DC6(dev))
+				skl_enable_dc6(dev_priv);
+			else
+				gen9_enable_dc5(dev_priv);
 		}
 	}
 
+exit:
 	if (check_fuse_status) {
 		if (power_well->data == SKL_DISP_PW_1) {
 			if (wait_for((I915_READ(SKL_FUSE_STATUS) &
-- 
2.0.2

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 47+ messages in thread

end of thread, other threads:[~2015-04-14 17:19 UTC | newest]

Thread overview: 47+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-04-01 10:49 [PATCH 0/8] Enable DC states for skl Animesh Manna
2015-04-01 10:52 ` [PATCH 1/8] drm/i915/skl: Add support to load SKL CSR firmware Animesh Manna
2015-04-01 10:52   ` [PATCH 2/8] drm/i915/skl: Implement enable/disable for Display C5 sttate Animesh Manna
2015-04-02 15:58     ` Imre Deak
2015-04-13 13:17       ` Damien Lespiau
2015-04-13 13:51         ` Imre Deak
2015-04-14 11:50           ` Daniel Vetter
2015-04-01 10:52   ` [PATCH 3/8] drm/i915/skl: Add DC5 Trigger Sequence Animesh Manna
2015-04-02 19:33     ` Imre Deak
2015-04-10 15:11       ` [PATCH v2 " Animesh Manna
2015-04-13 10:26         ` [PATCH v3 " Animesh Manna
2015-04-13 11:33           ` Imre Deak
2015-04-13 17:41             ` Damien Lespiau
2015-04-13 15:25           ` Damien Lespiau
2015-04-13 17:49           ` Damien Lespiau
2015-04-01 10:52   ` [PATCH 4/8] drm/i915/skl: Assert the requirements to enter or exit DC5 Animesh Manna
2015-04-02 20:17     ` Imre Deak
2015-04-10 15:11       ` [PATCH v2 " Animesh Manna
2015-04-13 12:46         ` Imre Deak
2015-04-01 10:52   ` [PATCH 5/8] drm/i915/skl: Implement enable/disable for Display C6 state Animesh Manna
2015-04-02 20:20     ` Imre Deak
2015-04-01 10:52   ` [PATCH 6/8] drm/i915/skl: Add DC6 Trigger sequence Animesh Manna
2015-04-02 20:42     ` Imre Deak
2015-04-10 15:11       ` [PATCH v2 " Animesh Manna
2015-04-13 12:50         ` Imre Deak
2015-04-01 10:52   ` [PATCH 7/8] drm/i915/skl: Assert the requirements to enter or exit DC6 Animesh Manna
2015-04-02 20:49     ` Imre Deak
2015-04-10 15:12       ` [PATCH v2 " Animesh Manna
2015-04-01 10:52   ` [PATCH 8/8] drm/i915/skl: Enable runtime PM Animesh Manna
2015-04-02 20:49     ` Imre Deak
2015-04-02 15:21   ` [PATCH 1/8] drm/i915/skl: Add support to load SKL CSR firmware Imre Deak
2015-04-10 15:11     ` [PATCH v2 " Animesh Manna
2015-04-13 10:24       ` [PATCH v3 " Animesh Manna
2015-04-13 11:03         ` Imre Deak
2015-04-13 13:07           ` Animesh Manna
2015-04-13 12:37             ` Imre Deak
2015-04-13 16:34         ` Damien Lespiau
2015-04-13 16:52           ` Imre Deak
2015-04-13 17:02             ` Damien Lespiau
2015-04-13 17:15               ` Imre Deak
2015-04-13 17:22                 ` Damien Lespiau
2015-04-14  9:16                   ` Animesh Manna
2015-04-14 10:07                     ` Damien Lespiau
     [not found]           ` <20804_1428943986_552BF472_20804_13643_1_1428943974.12269.9.camel@ideak-mobl>
2015-04-13 19:00             ` ns2501 DVO - success at last Thomas Richter
2015-04-14 17:21               ` Daniel Vetter
2015-04-10 15:10 ` [PATCH v2 0/8] Enable DC states for skl Animesh Manna
  -- strict thread matches above, loose matches on Subject: below --
2015-04-01  7:49 [PATCH 6/8] drm/i915/skl: Add DC6 Trigger sequence Animesh Manna

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.