diff mbox

[v2] drm/i915/skl: Only use the 800mV+2bB HDMI translation entry

Message ID 1425313176-2182-1-git-send-email-damien.lespiau@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Lespiau, Damien March 2, 2015, 4:19 p.m. UTC
This translation entry was updated after electrical validation by the hw
team. The other entries are removed from existence as they aren't
validated and because the sole use of a certain type of level shifter
for SKL products is anticipated.

v2: Remove all the other entries and force the use of the 800mv+2dB
    config (Sonika)

Suggested-by: Sonika Jindal <sonika.jindal@intel.com>
Cc: Sonika Jindal <sonika.jindal@intel.com>
Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
---
 drivers/gpu/drm/i915/intel_ddi.c | 30 ++++++++++++++----------------
 1 file changed, 14 insertions(+), 16 deletions(-)

Comments

sonika.jindal@intel.com March 3, 2015, 5:01 a.m. UTC | #1
On 3/2/2015 9:49 PM, Damien Lespiau wrote:
> This translation entry was updated after electrical validation by the hw
> team. The other entries are removed from existence as they aren't
> validated and because the sole use of a certain type of level shifter
> for SKL products is anticipated.
>
> v2: Remove all the other entries and force the use of the 800mv+2dB
>      config (Sonika)
>
> Suggested-by: Sonika Jindal <sonika.jindal@intel.com>
> Cc: Sonika Jindal <sonika.jindal@intel.com>
> Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
> ---
>   drivers/gpu/drm/i915/intel_ddi.c | 30 ++++++++++++++----------------
>   1 file changed, 14 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
> index 985d531..834820b 100644
> --- a/drivers/gpu/drm/i915/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/intel_ddi.c
> @@ -156,16 +156,7 @@ static const struct ddi_buf_trans skl_ddi_translations_edp[] = {
>
>   static const struct ddi_buf_trans skl_ddi_translations_hdmi[] = {
>   					/* Idx	NT mV   T mV    db  */
> -	{ 0x00000018, 0x000000a0 },	/* 0:	400	400	0   */
> -	{ 0x00004014, 0x00000098 },	/* 1:	400	600	3.5 */
> -	{ 0x00006012, 0x00000088 },	/* 2:	400	800	6   */
> -	{ 0x00000018, 0x0000003c },	/* 3:	450	450	0   */
> -	{ 0x00000018, 0x00000098 },	/* 4:	600	600	0   */
> -	{ 0x00003015, 0x00000088 },	/* 5:	600	800	2.5 */
> -	{ 0x00005013, 0x00000080 },	/* 6:	600	1000	4.5 */
> -	{ 0x00000018, 0x00000088 },	/* 7:	800	800	0   */
> -	{ 0x00000096, 0x00000080 },	/* 8:	800	1000	2   */
> -	{ 0x00000018, 0x00000080 },	/* 9:	1200	1200	0   */
> +	{ 0x00004014, 0x00000087 },	/* 0:	800	1000	2   */
>   };
>
>   enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder)
> @@ -202,7 +193,7 @@ static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
>   {
>   	struct drm_i915_private *dev_priv = dev->dev_private;
>   	u32 reg;
> -	int i, n_hdmi_entries, n_dp_entries, n_edp_entries, hdmi_800mV_0dB,
> +	int i, n_hdmi_entries, n_dp_entries, n_edp_entries, hdmi_default_entry,
>   	    size;
>   	int hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift;
>   	const struct ddi_buf_trans *ddi_translations_fdi;
> @@ -223,9 +214,16 @@ static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
>   			n_edp_entries = ARRAY_SIZE(skl_ddi_translations_dp);
>   		}
>
> +		/*
> +		 * On SKL, the recommendation from the hw team is to always use
> +		 * a certain type of level shifter (and thus the corresponding
> +		 * 800mV+2dB entry). Given that's the only validated entry, we
> +		 * override what is in the VBT, at least until further notice.
> +		 */
> +		hdmi_level = 0;
>   		ddi_translations_hdmi = skl_ddi_translations_hdmi;
>   		n_hdmi_entries = ARRAY_SIZE(skl_ddi_translations_hdmi);
> -		hdmi_800mV_0dB = 7;
> +		hdmi_default_entry = 0;
>   	} else if (IS_BROADWELL(dev)) {
>   		ddi_translations_fdi = bdw_ddi_translations_fdi;
>   		ddi_translations_dp = bdw_ddi_translations_dp;
> @@ -234,7 +232,7 @@ static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
>   		n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
>   		n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
>   		n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
> -		hdmi_800mV_0dB = 7;
> +		hdmi_default_entry = 7;
>   	} else if (IS_HASWELL(dev)) {
>   		ddi_translations_fdi = hsw_ddi_translations_fdi;
>   		ddi_translations_dp = hsw_ddi_translations_dp;
> @@ -242,7 +240,7 @@ static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
>   		ddi_translations_hdmi = hsw_ddi_translations_hdmi;
>   		n_dp_entries = n_edp_entries = ARRAY_SIZE(hsw_ddi_translations_dp);
>   		n_hdmi_entries = ARRAY_SIZE(hsw_ddi_translations_hdmi);
> -		hdmi_800mV_0dB = 6;
> +		hdmi_default_entry = 6;
>   	} else {
>   		WARN(1, "ddi translation table missing\n");
>   		ddi_translations_edp = bdw_ddi_translations_dp;
> @@ -252,7 +250,7 @@ static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
>   		n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
>   		n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
>   		n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
> -		hdmi_800mV_0dB = 7;
> +		hdmi_default_entry = 7;
>   	}
>
>   	switch (port) {
> @@ -295,7 +293,7 @@ static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
>   	/* Choose a good default if VBT is badly populated */
>   	if (hdmi_level == HDMI_LEVEL_SHIFT_UNKNOWN ||
>   	    hdmi_level >= n_hdmi_entries)
> -		hdmi_level = hdmi_800mV_0dB;
> +		hdmi_level = hdmi_default_entry;
>
>   	/* Entry 9 is for HDMI: */
>   	I915_WRITE(reg, ddi_translations_hdmi[hdmi_level].trans1);
>
Reviewed-by: Sonika Jindal <sonika.jindal@intel.com>
Shuang He March 3, 2015, 5:16 p.m. UTC | #2
Tested-By: PRC QA PRTS (Patch Regression Test System Contact: shuang.he@intel.com)
Task id: 5870
-------------------------------------Summary-------------------------------------
Platform          Delta          drm-intel-nightly          Series Applied
PNV                 -5              278/278              273/278
ILK                                  308/308              308/308
SNB                                  284/284              284/284
IVB                 -1              380/380              379/380
BYT                                  294/294              294/294
HSW                                  387/387              387/387
BDW                 -1              316/316              315/316
-------------------------------------Detailed-------------------------------------
Platform  Test                                drm-intel-nightly          Series Applied
 PNV  igt_gem_userptr_blits_coherency-sync      CRASH(4)PASS(7)      CRASH(2)
 PNV  igt_gem_userptr_blits_coherency-unsync      NO_RESULT(1)CRASH(3)PASS(5)      CRASH(2)
 PNV  igt_gen3_render_linear_blits      FAIL(3)PASS(7)      FAIL(2)
 PNV  igt_gen3_render_mixed_blits      FAIL(3)PASS(9)      FAIL(2)
 PNV  igt_gem_fence_thrash_bo-write-verify-threaded-none      FAIL(2)CRASH(2)PASS(3)      CRASH(2)
 IVB  igt_gem_storedw_batches_loop_normal      DMESG_WARN(1)PASS(2)      DMESG_WARN(1)PASS(1)
*BDW  igt_gem_gtt_hog      PASS(13)      DMESG_WARN(1)PASS(1)
Note: You need to pay more attention to line start with '*'
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 985d531..834820b 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -156,16 +156,7 @@  static const struct ddi_buf_trans skl_ddi_translations_edp[] = {
 
 static const struct ddi_buf_trans skl_ddi_translations_hdmi[] = {
 					/* Idx	NT mV   T mV    db  */
-	{ 0x00000018, 0x000000a0 },	/* 0:	400	400	0   */
-	{ 0x00004014, 0x00000098 },	/* 1:	400	600	3.5 */
-	{ 0x00006012, 0x00000088 },	/* 2:	400	800	6   */
-	{ 0x00000018, 0x0000003c },	/* 3:	450	450	0   */
-	{ 0x00000018, 0x00000098 },	/* 4:	600	600	0   */
-	{ 0x00003015, 0x00000088 },	/* 5:	600	800	2.5 */
-	{ 0x00005013, 0x00000080 },	/* 6:	600	1000	4.5 */
-	{ 0x00000018, 0x00000088 },	/* 7:	800	800	0   */
-	{ 0x00000096, 0x00000080 },	/* 8:	800	1000	2   */
-	{ 0x00000018, 0x00000080 },	/* 9:	1200	1200	0   */
+	{ 0x00004014, 0x00000087 },	/* 0:	800	1000	2   */
 };
 
 enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder)
@@ -202,7 +193,7 @@  static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
 {
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	u32 reg;
-	int i, n_hdmi_entries, n_dp_entries, n_edp_entries, hdmi_800mV_0dB,
+	int i, n_hdmi_entries, n_dp_entries, n_edp_entries, hdmi_default_entry,
 	    size;
 	int hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift;
 	const struct ddi_buf_trans *ddi_translations_fdi;
@@ -223,9 +214,16 @@  static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
 			n_edp_entries = ARRAY_SIZE(skl_ddi_translations_dp);
 		}
 
+		/*
+		 * On SKL, the recommendation from the hw team is to always use
+		 * a certain type of level shifter (and thus the corresponding
+		 * 800mV+2dB entry). Given that's the only validated entry, we
+		 * override what is in the VBT, at least until further notice.
+		 */
+		hdmi_level = 0;
 		ddi_translations_hdmi = skl_ddi_translations_hdmi;
 		n_hdmi_entries = ARRAY_SIZE(skl_ddi_translations_hdmi);
-		hdmi_800mV_0dB = 7;
+		hdmi_default_entry = 0;
 	} else if (IS_BROADWELL(dev)) {
 		ddi_translations_fdi = bdw_ddi_translations_fdi;
 		ddi_translations_dp = bdw_ddi_translations_dp;
@@ -234,7 +232,7 @@  static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
 		n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
 		n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
 		n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
-		hdmi_800mV_0dB = 7;
+		hdmi_default_entry = 7;
 	} else if (IS_HASWELL(dev)) {
 		ddi_translations_fdi = hsw_ddi_translations_fdi;
 		ddi_translations_dp = hsw_ddi_translations_dp;
@@ -242,7 +240,7 @@  static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
 		ddi_translations_hdmi = hsw_ddi_translations_hdmi;
 		n_dp_entries = n_edp_entries = ARRAY_SIZE(hsw_ddi_translations_dp);
 		n_hdmi_entries = ARRAY_SIZE(hsw_ddi_translations_hdmi);
-		hdmi_800mV_0dB = 6;
+		hdmi_default_entry = 6;
 	} else {
 		WARN(1, "ddi translation table missing\n");
 		ddi_translations_edp = bdw_ddi_translations_dp;
@@ -252,7 +250,7 @@  static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
 		n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
 		n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
 		n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
-		hdmi_800mV_0dB = 7;
+		hdmi_default_entry = 7;
 	}
 
 	switch (port) {
@@ -295,7 +293,7 @@  static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
 	/* Choose a good default if VBT is badly populated */
 	if (hdmi_level == HDMI_LEVEL_SHIFT_UNKNOWN ||
 	    hdmi_level >= n_hdmi_entries)
-		hdmi_level = hdmi_800mV_0dB;
+		hdmi_level = hdmi_default_entry;
 
 	/* Entry 9 is for HDMI: */
 	I915_WRITE(reg, ddi_translations_hdmi[hdmi_level].trans1);