aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMahesh Kumar <mahesh1.kumar@intel.com>2018-04-26 10:25:15 -0400
committerRodrigo Vivi <rodrigo.vivi@intel.com>2018-04-27 20:11:49 -0400
commit74bd8004e475d67eb41f6795cda5efac03d010b8 (patch)
tree4015b9914570870cfcd196f39e8c847c543775c9
parent077ef1f09c2528b81366ae9a2a969ea35c475027 (diff)
drm/i915/icl: track dbuf slice-2 status
This patch adds support to start tracking status of DBUF slices. This is foundation to introduce support for enabling/disabling second DBUF slice dynamically for ICL. Changes Since V1: - use kernel type u8 over uint8_t Signed-off-by: Mahesh Kumar <mahesh1.kumar@intel.com> Reviewed-by: James Ausmus <james.ausmus@intel.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180426142517.16643-2-mahesh1.kumar@intel.com
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h1
-rw-r--r--drivers/gpu/drm/i915/intel_display.c5
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c20
-rw-r--r--drivers/gpu/drm/i915/intel_runtime_pm.c4
4 files changed, 30 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 8444ca8d5aa3..193176bcddf5 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1189,6 +1189,7 @@ struct skl_ddb_allocation {
1189 /* packed/y */ 1189 /* packed/y */
1190 struct skl_ddb_entry plane[I915_MAX_PIPES][I915_MAX_PLANES]; 1190 struct skl_ddb_entry plane[I915_MAX_PIPES][I915_MAX_PLANES];
1191 struct skl_ddb_entry uv_plane[I915_MAX_PIPES][I915_MAX_PLANES]; 1191 struct skl_ddb_entry uv_plane[I915_MAX_PIPES][I915_MAX_PLANES];
1192 u8 enabled_slices; /* GEN11 has configurable 2 slices */
1192}; 1193};
1193 1194
1194struct skl_ddb_values { 1195struct skl_ddb_values {
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index efa8822f63d1..338570e61a1f 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -11447,6 +11447,11 @@ static void verify_wm_state(struct drm_crtc *crtc,
11447 skl_ddb_get_hw_state(dev_priv, &hw_ddb); 11447 skl_ddb_get_hw_state(dev_priv, &hw_ddb);
11448 sw_ddb = &dev_priv->wm.skl_hw.ddb; 11448 sw_ddb = &dev_priv->wm.skl_hw.ddb;
11449 11449
11450 if (INTEL_GEN(dev_priv) >= 11)
11451 if (hw_ddb.enabled_slices != sw_ddb->enabled_slices)
11452 DRM_ERROR("mismatch in DBUF Slices (expected %u, got %u)\n",
11453 sw_ddb->enabled_slices,
11454 hw_ddb.enabled_slices);
11450 /* planes */ 11455 /* planes */
11451 for_each_universal_plane(dev_priv, pipe, plane) { 11456 for_each_universal_plane(dev_priv, pipe, plane) {
11452 hw_plane_wm = &hw_wm.planes[plane]; 11457 hw_plane_wm = &hw_wm.planes[plane];
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 4baab858e442..a29e6d512771 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -3567,6 +3567,23 @@ bool ilk_disable_lp_wm(struct drm_device *dev)
3567 return _ilk_disable_lp_wm(dev_priv, WM_DIRTY_LP_ALL); 3567 return _ilk_disable_lp_wm(dev_priv, WM_DIRTY_LP_ALL);
3568} 3568}
3569 3569
3570static u8 intel_enabled_dbuf_slices_num(struct drm_i915_private *dev_priv)
3571{
3572 u8 enabled_slices;
3573
3574 /* Slice 1 will always be enabled */
3575 enabled_slices = 1;
3576
3577 /* Gen prior to GEN11 have only one DBuf slice */
3578 if (INTEL_GEN(dev_priv) < 11)
3579 return enabled_slices;
3580
3581 if (I915_READ(DBUF_CTL_S2) & DBUF_POWER_STATE)
3582 enabled_slices++;
3583
3584 return enabled_slices;
3585}
3586
3570/* 3587/*
3571 * FIXME: We still don't have the proper code detect if we need to apply the WA, 3588 * FIXME: We still don't have the proper code detect if we need to apply the WA,
3572 * so assume we'll always need it in order to avoid underruns. 3589 * so assume we'll always need it in order to avoid underruns.
@@ -3870,6 +3887,8 @@ void skl_ddb_get_hw_state(struct drm_i915_private *dev_priv,
3870 3887
3871 memset(ddb, 0, sizeof(*ddb)); 3888 memset(ddb, 0, sizeof(*ddb));
3872 3889
3890 ddb->enabled_slices = intel_enabled_dbuf_slices_num(dev_priv);
3891
3873 for_each_intel_crtc(&dev_priv->drm, crtc) { 3892 for_each_intel_crtc(&dev_priv->drm, crtc) {
3874 enum intel_display_power_domain power_domain; 3893 enum intel_display_power_domain power_domain;
3875 enum plane_id plane_id; 3894 enum plane_id plane_id;
@@ -5088,6 +5107,7 @@ skl_copy_ddb_for_pipe(struct skl_ddb_values *dst,
5088 sizeof(dst->ddb.uv_plane[pipe])); 5107 sizeof(dst->ddb.uv_plane[pipe]));
5089 memcpy(dst->ddb.plane[pipe], src->ddb.plane[pipe], 5108 memcpy(dst->ddb.plane[pipe], src->ddb.plane[pipe],
5090 sizeof(dst->ddb.plane[pipe])); 5109 sizeof(dst->ddb.plane[pipe]));
5110 dst->ddb.enabled_slices = src->ddb.enabled_slices;
5091} 5111}
5092 5112
5093static void 5113static void
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index ec59992cf87a..afc6ef81ca0c 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -2656,6 +2656,8 @@ static void icl_dbuf_enable(struct drm_i915_private *dev_priv)
2656 if (!(I915_READ(DBUF_CTL_S1) & DBUF_POWER_STATE) || 2656 if (!(I915_READ(DBUF_CTL_S1) & DBUF_POWER_STATE) ||
2657 !(I915_READ(DBUF_CTL_S2) & DBUF_POWER_STATE)) 2657 !(I915_READ(DBUF_CTL_S2) & DBUF_POWER_STATE))
2658 DRM_ERROR("DBuf power enable timeout\n"); 2658 DRM_ERROR("DBuf power enable timeout\n");
2659 else
2660 dev_priv->wm.skl_hw.ddb.enabled_slices = 2;
2659} 2661}
2660 2662
2661static void icl_dbuf_disable(struct drm_i915_private *dev_priv) 2663static void icl_dbuf_disable(struct drm_i915_private *dev_priv)
@@ -2669,6 +2671,8 @@ static void icl_dbuf_disable(struct drm_i915_private *dev_priv)
2669 if ((I915_READ(DBUF_CTL_S1) & DBUF_POWER_STATE) || 2671 if ((I915_READ(DBUF_CTL_S1) & DBUF_POWER_STATE) ||
2670 (I915_READ(DBUF_CTL_S2) & DBUF_POWER_STATE)) 2672 (I915_READ(DBUF_CTL_S2) & DBUF_POWER_STATE))
2671 DRM_ERROR("DBuf power disable timeout!\n"); 2673 DRM_ERROR("DBuf power disable timeout!\n");
2674 else
2675 dev_priv->wm.skl_hw.ddb.enabled_slices = 0;
2672} 2676}
2673 2677
2674static void icl_mbus_init(struct drm_i915_private *dev_priv) 2678static void icl_mbus_init(struct drm_i915_private *dev_priv)