aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2018-10-23 14:21:02 -0400
committerJoonas Lahtinen <joonas.lahtinen@linux.intel.com>2018-11-06 10:17:02 -0500
commit18354b422ce4ce1124277dfe8f4f094bae0102ad (patch)
treeacc5c2ded24356e2a1f5b5478089011e82e85cf3
parent651022382c7f8da46cb4872a545ee1da6d097d2a (diff)
drm/i915: Don't apply the 16Gb DIMM wm latency w/a to BXT/GLK
The 16Gb DIMM w/a is not applicable to BXT or GLK. Limit it to the appropriate platforms. This was especially harsh on GLK since we don't even try to read the DIMM information on that platforms, hence valid_dimm was always false and thus we always tried to apply the w/a. Furthermore the w/a pushed the level 0 latency above the level 1 latency, which doesn't really make sense. v2: Do the check when populating is_16gb_dimm (Mahesh) Cc: Mahesh Kumar <mahesh1.kumar@intel.com> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Fixes: 86b592876cb6 ("drm/i915: Implement 16GB dimm wa for latency level-0") Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20181023182102.31549-1-ville.syrjala@linux.intel.com Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Reviewed-by: Mahesh Kumar <mahesh1.sh.kumar@gmail.com> (cherry picked from commit 5d6f36b27d2764f3dc940606ee6b7ec5c669af3e) Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c15
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h1
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c3
3 files changed, 9 insertions, 10 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 44e2c0f5ec50..ffdbbac4400e 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -1175,8 +1175,6 @@ skl_dram_get_channels_info(struct drm_i915_private *dev_priv)
1175 return -EINVAL; 1175 return -EINVAL;
1176 } 1176 }
1177 1177
1178 dram_info->valid_dimm = true;
1179
1180 /* 1178 /*
1181 * If any of the channel is single rank channel, worst case output 1179 * If any of the channel is single rank channel, worst case output
1182 * will be same as if single rank memory, so consider single rank 1180 * will be same as if single rank memory, so consider single rank
@@ -1193,8 +1191,7 @@ skl_dram_get_channels_info(struct drm_i915_private *dev_priv)
1193 return -EINVAL; 1191 return -EINVAL;
1194 } 1192 }
1195 1193
1196 if (ch0.is_16gb_dimm || ch1.is_16gb_dimm) 1194 dram_info->is_16gb_dimm = ch0.is_16gb_dimm || ch1.is_16gb_dimm;
1197 dram_info->is_16gb_dimm = true;
1198 1195
1199 dev_priv->dram_info.symmetric_memory = intel_is_dram_symmetric(val_ch0, 1196 dev_priv->dram_info.symmetric_memory = intel_is_dram_symmetric(val_ch0,
1200 val_ch1, 1197 val_ch1,
@@ -1314,7 +1311,6 @@ bxt_get_dram_info(struct drm_i915_private *dev_priv)
1314 return -EINVAL; 1311 return -EINVAL;
1315 } 1312 }
1316 1313
1317 dram_info->valid_dimm = true;
1318 dram_info->valid = true; 1314 dram_info->valid = true;
1319 return 0; 1315 return 0;
1320} 1316}
@@ -1327,12 +1323,17 @@ intel_get_dram_info(struct drm_i915_private *dev_priv)
1327 int ret; 1323 int ret;
1328 1324
1329 dram_info->valid = false; 1325 dram_info->valid = false;
1330 dram_info->valid_dimm = false;
1331 dram_info->is_16gb_dimm = false;
1332 dram_info->rank = I915_DRAM_RANK_INVALID; 1326 dram_info->rank = I915_DRAM_RANK_INVALID;
1333 dram_info->bandwidth_kbps = 0; 1327 dram_info->bandwidth_kbps = 0;
1334 dram_info->num_channels = 0; 1328 dram_info->num_channels = 0;
1335 1329
1330 /*
1331 * Assume 16Gb DIMMs are present until proven otherwise.
1332 * This is only used for the level 0 watermark latency
1333 * w/a which does not apply to bxt/glk.
1334 */
1335 dram_info->is_16gb_dimm = !IS_GEN9_LP(dev_priv);
1336
1336 if (INTEL_GEN(dev_priv) < 9 || IS_GEMINILAKE(dev_priv)) 1337 if (INTEL_GEN(dev_priv) < 9 || IS_GEMINILAKE(dev_priv))
1337 return; 1338 return;
1338 1339
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 8624b4bdc242..9102571e9692 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1948,7 +1948,6 @@ struct drm_i915_private {
1948 1948
1949 struct dram_info { 1949 struct dram_info {
1950 bool valid; 1950 bool valid;
1951 bool valid_dimm;
1952 bool is_16gb_dimm; 1951 bool is_16gb_dimm;
1953 u8 num_channels; 1952 u8 num_channels;
1954 enum dram_rank { 1953 enum dram_rank {
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 1db9b8328275..245f0022bcfd 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -2881,8 +2881,7 @@ static void intel_read_wm_latency(struct drm_i915_private *dev_priv,
2881 * any underrun. If not able to get Dimm info assume 16GB dimm 2881 * any underrun. If not able to get Dimm info assume 16GB dimm
2882 * to avoid any underrun. 2882 * to avoid any underrun.
2883 */ 2883 */
2884 if (!dev_priv->dram_info.valid_dimm || 2884 if (dev_priv->dram_info.is_16gb_dimm)
2885 dev_priv->dram_info.is_16gb_dimm)
2886 wm[0] += 1; 2885 wm[0] += 1;
2887 2886
2888 } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { 2887 } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {