|
@@ -4529,6 +4529,7 @@ static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
|
|
uint16_t ddb_allocation,
|
|
uint16_t ddb_allocation,
|
|
int level,
|
|
int level,
|
|
const struct skl_wm_params *wp,
|
|
const struct skl_wm_params *wp,
|
|
|
|
+ const struct skl_wm_level *result_prev,
|
|
struct skl_wm_level *result /* out */)
|
|
struct skl_wm_level *result /* out */)
|
|
{
|
|
{
|
|
const struct drm_plane_state *pstate = &intel_pstate->base;
|
|
const struct drm_plane_state *pstate = &intel_pstate->base;
|
|
@@ -4596,6 +4597,15 @@ static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
|
|
} else {
|
|
} else {
|
|
res_blocks++;
|
|
res_blocks++;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Make sure result blocks for higher latency levels are atleast
|
|
|
|
+ * as high as level below the current level.
|
|
|
|
+ * Assumption in DDB algorithm optimization for special cases.
|
|
|
|
+ * Also covers Display WA #1125 for RC.
|
|
|
|
+ */
|
|
|
|
+ if (result_prev->plane_res_b > res_blocks)
|
|
|
|
+ res_blocks = result_prev->plane_res_b;
|
|
}
|
|
}
|
|
|
|
|
|
if (INTEL_GEN(dev_priv) >= 11) {
|
|
if (INTEL_GEN(dev_priv) >= 11) {
|
|
@@ -4679,6 +4689,13 @@ skl_compute_wm_levels(const struct drm_i915_private *dev_priv,
|
|
for (level = 0; level <= max_level; level++) {
|
|
for (level = 0; level <= max_level; level++) {
|
|
struct skl_wm_level *result = plane_id ? &wm->uv_wm[level] :
|
|
struct skl_wm_level *result = plane_id ? &wm->uv_wm[level] :
|
|
&wm->wm[level];
|
|
&wm->wm[level];
|
|
|
|
+ struct skl_wm_level *result_prev;
|
|
|
|
+
|
|
|
|
+ if (level)
|
|
|
|
+ result_prev = plane_id ? &wm->uv_wm[level - 1] :
|
|
|
|
+ &wm->wm[level - 1];
|
|
|
|
+ else
|
|
|
|
+ result_prev = plane_id ? &wm->uv_wm[0] : &wm->wm[0];
|
|
|
|
|
|
ret = skl_compute_plane_wm(dev_priv,
|
|
ret = skl_compute_plane_wm(dev_priv,
|
|
cstate,
|
|
cstate,
|
|
@@ -4686,6 +4703,7 @@ skl_compute_wm_levels(const struct drm_i915_private *dev_priv,
|
|
ddb_blocks,
|
|
ddb_blocks,
|
|
level,
|
|
level,
|
|
wm_params,
|
|
wm_params,
|
|
|
|
+ result_prev,
|
|
result);
|
|
result);
|
|
if (ret)
|
|
if (ret)
|
|
return ret;
|
|
return ret;
|