aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMahesh Kumar <mahesh1.kumar@intel.com>2018-04-08 23:41:06 -0400
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2018-04-09 07:37:38 -0400
commit8b2b53ce94e808ef9340add94c4c50b9e5267413 (patch)
tree7c2d3fadcb0838a7bab0cc3ef3c206e1749d58e4
parent62027b7736d038309e93e6d5d25a9a72390821cb (diff)
drm/i915/skl+: make sure higher latency level has higher wm value
DDB allocation optimization algorithm requires/assumes ddb allocation for any memory C-state level DDB value to be as high as level below the current level. Render decompression requires level WM to be as high as wm level-0. This patch fulfils both the requirements. v2: Changed plane_num to plane_id in skl_compute_wm_levels v3: Addressed review comments from Shashank Sharma Changed the commit message "statement can be more clear, "DDB value to be as high as level below " what is level below ?" v4: Added reviewed by tag from Shashank Sharma v5: Added reviewed by from Juha-Pekka Heikkila v6: Rebased the series Reviewed-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com> Reviewed-by: Shashank Sharma <shashank.sharma@intel.com> Signed-off-by: Mahesh Kumar <mahesh1.kumar@intel.com> Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/1523245273-30264-8-git-send-email-vidya.srinivas@intel.com
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 06352c9e9ef6..707843012dff 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -4529,6 +4529,7 @@ static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
4529 uint16_t ddb_allocation, 4529 uint16_t ddb_allocation,
4530 int level, 4530 int level,
4531 const struct skl_wm_params *wp, 4531 const struct skl_wm_params *wp,
4532 const struct skl_wm_level *result_prev,
4532 struct skl_wm_level *result /* out */) 4533 struct skl_wm_level *result /* out */)
4533{ 4534{
4534 const struct drm_plane_state *pstate = &intel_pstate->base; 4535 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,
4596 } else { 4597 } else {
4597 res_blocks++; 4598 res_blocks++;
4598 } 4599 }
4600
4601 /*
4602 * Make sure result blocks for higher latency levels are atleast
4603 * as high as level below the current level.
4604 * Assumption in DDB algorithm optimization for special cases.
4605 * Also covers Display WA #1125 for RC.
4606 */
4607 if (result_prev->plane_res_b > res_blocks)
4608 res_blocks = result_prev->plane_res_b;
4599 } 4609 }
4600 4610
4601 if (INTEL_GEN(dev_priv) >= 11) { 4611 if (INTEL_GEN(dev_priv) >= 11) {
@@ -4679,6 +4689,13 @@ skl_compute_wm_levels(const struct drm_i915_private *dev_priv,
4679 for (level = 0; level <= max_level; level++) { 4689 for (level = 0; level <= max_level; level++) {
4680 struct skl_wm_level *result = plane_id ? &wm->uv_wm[level] : 4690 struct skl_wm_level *result = plane_id ? &wm->uv_wm[level] :
4681 &wm->wm[level]; 4691 &wm->wm[level];
4692 struct skl_wm_level *result_prev;
4693
4694 if (level)
4695 result_prev = plane_id ? &wm->uv_wm[level - 1] :
4696 &wm->wm[level - 1];
4697 else
4698 result_prev = plane_id ? &wm->uv_wm[0] : &wm->wm[0];
4682 4699
4683 ret = skl_compute_plane_wm(dev_priv, 4700 ret = skl_compute_plane_wm(dev_priv,
4684 cstate, 4701 cstate,
@@ -4686,6 +4703,7 @@ skl_compute_wm_levels(const struct drm_i915_private *dev_priv,
4686 ddb_blocks, 4703 ddb_blocks,
4687 level, 4704 level,
4688 wm_params, 4705 wm_params,
4706 result_prev,
4689 result); 4707 result);
4690 if (ret) 4708 if (ret)
4691 return ret; 4709 return ret;