diff options
author | Mahesh Kumar <mahesh1.kumar@intel.com> | 2018-04-26 10:25:15 -0400 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2018-04-27 20:11:49 -0400 |
commit | 74bd8004e475d67eb41f6795cda5efac03d010b8 (patch) | |
tree | 4015b9914570870cfcd196f39e8c847c543775c9 | |
parent | 077ef1f09c2528b81366ae9a2a969ea35c475027 (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.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_runtime_pm.c | 4 |
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 | ||
1194 | struct skl_ddb_values { | 1195 | struct 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 | ||
3570 | static 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 | ||
5093 | static void | 5113 | static 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 | ||
2661 | static void icl_dbuf_disable(struct drm_i915_private *dev_priv) | 2663 | static 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 | ||
2674 | static void icl_mbus_init(struct drm_i915_private *dev_priv) | 2678 | static void icl_mbus_init(struct drm_i915_private *dev_priv) |