Message ID | 1425313176-2182-1-git-send-email-damien.lespiau@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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>
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 --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);
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(-)