Commit 5f8b2531 authored by Rodrigo Vivi's avatar Rodrigo Vivi Committed by Jani Nikula

drm/i915/skl: Update DDI buffer translation programming.

SKL-Y can now use the same programming for all VccIO values after an
adjustment to I_boost.  SKL-U DP table adjustments.

1. Remove SKL Y 0.95V from "SKL H and S" columns in all tables. The
   other SKL Y column removes the "0.85V VccIO" so it now applies to all
   voltages.

2. DP table changes SKL U 400mV+0db dword 0 value from 2016h to 201Bh.

3. DP table changes SKL U 600mv+0db dword 0 value from 2016h to 201Bh.

4. DP table increases I_boost to level 3 for SKL Y 400mv+9.5db.

v2: Fix compilation warnings as pointed by Paulo.

Reference: Graphics Spec Change r97962
Cc: Arthur Runyan <arthur.j.runyan@intel.com>
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: default avatarPaulo Zanoni <paulo.r.zanoni@intel.com>
[Jani: reformatted commit message for shorter lines.]
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent e2d6cf7f
...@@ -128,7 +128,7 @@ static const struct ddi_buf_trans bdw_ddi_translations_hdmi[] = { ...@@ -128,7 +128,7 @@ static const struct ddi_buf_trans bdw_ddi_translations_hdmi[] = {
{ 0x80FFFFFF, 0x001B0002, 0x0 },/* 9: 1000 1000 0 */ { 0x80FFFFFF, 0x001B0002, 0x0 },/* 9: 1000 1000 0 */
}; };
/* Skylake H, S, and Skylake Y with 0.95V VccIO */ /* Skylake H and S */
static const struct ddi_buf_trans skl_ddi_translations_dp[] = { static const struct ddi_buf_trans skl_ddi_translations_dp[] = {
{ 0x00002016, 0x000000A0, 0x0 }, { 0x00002016, 0x000000A0, 0x0 },
{ 0x00005012, 0x0000009B, 0x0 }, { 0x00005012, 0x0000009B, 0x0 },
...@@ -143,23 +143,23 @@ static const struct ddi_buf_trans skl_ddi_translations_dp[] = { ...@@ -143,23 +143,23 @@ static const struct ddi_buf_trans skl_ddi_translations_dp[] = {
/* Skylake U */ /* Skylake U */
static const struct ddi_buf_trans skl_u_ddi_translations_dp[] = { static const struct ddi_buf_trans skl_u_ddi_translations_dp[] = {
{ 0x00002016, 0x000000A2, 0x0 }, { 0x0000201B, 0x000000A2, 0x0 },
{ 0x00005012, 0x00000088, 0x0 }, { 0x00005012, 0x00000088, 0x0 },
{ 0x00007011, 0x00000087, 0x0 }, { 0x00007011, 0x00000087, 0x0 },
{ 0x80009010, 0x000000C7, 0x1 }, /* Uses I_boost */ { 0x80009010, 0x000000C7, 0x1 }, /* Uses I_boost level 0x1 */
{ 0x00002016, 0x0000009D, 0x0 }, { 0x0000201B, 0x0000009D, 0x0 },
{ 0x00005012, 0x000000C7, 0x0 }, { 0x00005012, 0x000000C7, 0x0 },
{ 0x00007011, 0x000000C7, 0x0 }, { 0x00007011, 0x000000C7, 0x0 },
{ 0x00002016, 0x00000088, 0x0 }, { 0x00002016, 0x00000088, 0x0 },
{ 0x00005012, 0x000000C7, 0x0 }, { 0x00005012, 0x000000C7, 0x0 },
}; };
/* Skylake Y with 0.85V VccIO */ /* Skylake Y */
static const struct ddi_buf_trans skl_y_085v_ddi_translations_dp[] = { static const struct ddi_buf_trans skl_y_ddi_translations_dp[] = {
{ 0x00000018, 0x000000A2, 0x0 }, { 0x00000018, 0x000000A2, 0x0 },
{ 0x00005012, 0x00000088, 0x0 }, { 0x00005012, 0x00000088, 0x0 },
{ 0x00007011, 0x00000087, 0x0 }, { 0x00007011, 0x00000087, 0x0 },
{ 0x80009010, 0x000000C7, 0x1 }, /* Uses I_boost */ { 0x80009010, 0x000000C7, 0x3 }, /* Uses I_boost level 0x3 */
{ 0x00000018, 0x0000009D, 0x0 }, { 0x00000018, 0x0000009D, 0x0 },
{ 0x00005012, 0x000000C7, 0x0 }, { 0x00005012, 0x000000C7, 0x0 },
{ 0x00007011, 0x000000C7, 0x0 }, { 0x00007011, 0x000000C7, 0x0 },
...@@ -168,7 +168,7 @@ static const struct ddi_buf_trans skl_y_085v_ddi_translations_dp[] = { ...@@ -168,7 +168,7 @@ static const struct ddi_buf_trans skl_y_085v_ddi_translations_dp[] = {
}; };
/* /*
* Skylake H and S, and Skylake Y with 0.95V VccIO * Skylake H and S
* eDP 1.4 low vswing translation parameters * eDP 1.4 low vswing translation parameters
*/ */
static const struct ddi_buf_trans skl_ddi_translations_edp[] = { static const struct ddi_buf_trans skl_ddi_translations_edp[] = {
...@@ -202,10 +202,10 @@ static const struct ddi_buf_trans skl_u_ddi_translations_edp[] = { ...@@ -202,10 +202,10 @@ static const struct ddi_buf_trans skl_u_ddi_translations_edp[] = {
}; };
/* /*
* Skylake Y with 0.95V VccIO * Skylake Y
* eDP 1.4 low vswing translation parameters * eDP 1.4 low vswing translation parameters
*/ */
static const struct ddi_buf_trans skl_y_085v_ddi_translations_edp[] = { static const struct ddi_buf_trans skl_y_ddi_translations_edp[] = {
{ 0x00000018, 0x000000A8, 0x0 }, { 0x00000018, 0x000000A8, 0x0 },
{ 0x00004013, 0x000000AB, 0x0 }, { 0x00004013, 0x000000AB, 0x0 },
{ 0x00007011, 0x000000A4, 0x0 }, { 0x00007011, 0x000000A4, 0x0 },
...@@ -218,7 +218,7 @@ static const struct ddi_buf_trans skl_y_085v_ddi_translations_edp[] = { ...@@ -218,7 +218,7 @@ static const struct ddi_buf_trans skl_y_085v_ddi_translations_edp[] = {
{ 0x00000018, 0x0000008A, 0x0 }, { 0x00000018, 0x0000008A, 0x0 },
}; };
/* Skylake H, S and U, and Skylake Y with 0.95V VccIO */ /* Skylake U, H and S */
static const struct ddi_buf_trans skl_ddi_translations_hdmi[] = { static const struct ddi_buf_trans skl_ddi_translations_hdmi[] = {
{ 0x00000018, 0x000000AC, 0x0 }, { 0x00000018, 0x000000AC, 0x0 },
{ 0x00005012, 0x0000009D, 0x0 }, { 0x00005012, 0x0000009D, 0x0 },
...@@ -233,8 +233,8 @@ static const struct ddi_buf_trans skl_ddi_translations_hdmi[] = { ...@@ -233,8 +233,8 @@ static const struct ddi_buf_trans skl_ddi_translations_hdmi[] = {
{ 0x00000018, 0x000000C7, 0x0 }, { 0x00000018, 0x000000C7, 0x0 },
}; };
/* Skylake Y with 0.85V VccIO */ /* Skylake Y */
static const struct ddi_buf_trans skl_y_085v_ddi_translations_hdmi[] = { static const struct ddi_buf_trans skl_y_ddi_translations_hdmi[] = {
{ 0x00000018, 0x000000A1, 0x0 }, { 0x00000018, 0x000000A1, 0x0 },
{ 0x00005012, 0x000000DF, 0x0 }, { 0x00005012, 0x000000DF, 0x0 },
{ 0x00007011, 0x00000084, 0x0 }, { 0x00007011, 0x00000084, 0x0 },
...@@ -244,7 +244,7 @@ static const struct ddi_buf_trans skl_y_085v_ddi_translations_hdmi[] = { ...@@ -244,7 +244,7 @@ static const struct ddi_buf_trans skl_y_085v_ddi_translations_hdmi[] = {
{ 0x00006013, 0x000000C7, 0x0 }, { 0x00006013, 0x000000C7, 0x0 },
{ 0x00000018, 0x0000008A, 0x0 }, { 0x00000018, 0x0000008A, 0x0 },
{ 0x00003015, 0x000000C7, 0x0 }, /* Default */ { 0x00003015, 0x000000C7, 0x0 }, /* Default */
{ 0x80003015, 0x000000C7, 0x7 }, /* Uses I_boost */ { 0x80003015, 0x000000C7, 0x7 }, /* Uses I_boost level 0x7 */
{ 0x00000018, 0x000000C7, 0x0 }, { 0x00000018, 0x000000C7, 0x0 },
}; };
...@@ -335,19 +335,11 @@ intel_dig_port_supports_hdmi(const struct intel_digital_port *intel_dig_port) ...@@ -335,19 +335,11 @@ intel_dig_port_supports_hdmi(const struct intel_digital_port *intel_dig_port)
static const struct ddi_buf_trans *skl_get_buf_trans_dp(struct drm_device *dev, static const struct ddi_buf_trans *skl_get_buf_trans_dp(struct drm_device *dev,
int *n_entries) int *n_entries)
{ {
struct drm_i915_private *dev_priv = dev->dev_private;
const struct ddi_buf_trans *ddi_translations; const struct ddi_buf_trans *ddi_translations;
static int is_095v = -1;
if (is_095v == -1) {
u32 spr1 = I915_READ(UAIMI_SPR1);
is_095v = spr1 & SKL_VCCIO_MASK;
}
if (IS_SKL_ULX(dev) && !is_095v) { if (IS_SKL_ULX(dev)) {
ddi_translations = skl_y_085v_ddi_translations_dp; ddi_translations = skl_y_ddi_translations_dp;
*n_entries = ARRAY_SIZE(skl_y_085v_ddi_translations_dp); *n_entries = ARRAY_SIZE(skl_y_ddi_translations_dp);
} else if (IS_SKL_ULT(dev)) { } else if (IS_SKL_ULT(dev)) {
ddi_translations = skl_u_ddi_translations_dp; ddi_translations = skl_u_ddi_translations_dp;
*n_entries = ARRAY_SIZE(skl_u_ddi_translations_dp); *n_entries = ARRAY_SIZE(skl_u_ddi_translations_dp);
...@@ -364,23 +356,14 @@ static const struct ddi_buf_trans *skl_get_buf_trans_edp(struct drm_device *dev, ...@@ -364,23 +356,14 @@ static const struct ddi_buf_trans *skl_get_buf_trans_edp(struct drm_device *dev,
{ {
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
const struct ddi_buf_trans *ddi_translations; const struct ddi_buf_trans *ddi_translations;
static int is_095v = -1;
if (is_095v == -1) {
u32 spr1 = I915_READ(UAIMI_SPR1);
is_095v = spr1 & SKL_VCCIO_MASK; if (IS_SKL_ULX(dev)) {
}
if (IS_SKL_ULX(dev) && !is_095v) {
if (dev_priv->edp_low_vswing) { if (dev_priv->edp_low_vswing) {
ddi_translations = skl_y_085v_ddi_translations_edp; ddi_translations = skl_y_ddi_translations_edp;
*n_entries = *n_entries = ARRAY_SIZE(skl_y_ddi_translations_edp);
ARRAY_SIZE(skl_y_085v_ddi_translations_edp);
} else { } else {
ddi_translations = skl_y_085v_ddi_translations_dp; ddi_translations = skl_y_ddi_translations_dp;
*n_entries = *n_entries = ARRAY_SIZE(skl_y_ddi_translations_dp);
ARRAY_SIZE(skl_y_085v_ddi_translations_dp);
} }
} else if (IS_SKL_ULT(dev)) { } else if (IS_SKL_ULT(dev)) {
if (dev_priv->edp_low_vswing) { if (dev_priv->edp_low_vswing) {
...@@ -407,19 +390,11 @@ static const struct ddi_buf_trans * ...@@ -407,19 +390,11 @@ static const struct ddi_buf_trans *
skl_get_buf_trans_hdmi(struct drm_device *dev, skl_get_buf_trans_hdmi(struct drm_device *dev,
int *n_entries) int *n_entries)
{ {
struct drm_i915_private *dev_priv = dev->dev_private;
const struct ddi_buf_trans *ddi_translations; const struct ddi_buf_trans *ddi_translations;
static int is_095v = -1;
if (is_095v == -1) {
u32 spr1 = I915_READ(UAIMI_SPR1);
is_095v = spr1 & SKL_VCCIO_MASK;
}
if (IS_SKL_ULX(dev) && !is_095v) { if (IS_SKL_ULX(dev)) {
ddi_translations = skl_y_085v_ddi_translations_hdmi; ddi_translations = skl_y_ddi_translations_hdmi;
*n_entries = ARRAY_SIZE(skl_y_085v_ddi_translations_hdmi); *n_entries = ARRAY_SIZE(skl_y_ddi_translations_hdmi);
} else { } else {
ddi_translations = skl_ddi_translations_hdmi; ddi_translations = skl_ddi_translations_hdmi;
*n_entries = ARRAY_SIZE(skl_ddi_translations_hdmi); *n_entries = ARRAY_SIZE(skl_ddi_translations_hdmi);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment