diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2013-12-05 08:51:35 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-12-17 07:17:54 -0500 |
commit | 6c8b6c288783b05733de31fb61fc8ebfa8ae0229 (patch) | |
tree | 52302ef3d166ce9f71c2fa20525b0c9b573f20be /drivers/gpu/drm/i915/intel_pm.c | |
parent | 0ba22e26fe47b2a216e5438292aeeb8e015e9d64 (diff) |
drm/i915: Disable FBC WM on ILK, and disable LP2+ when FBC is enabled
ILK has a bunch of issues with FBC. First of all, BSpec tells us that
FBC WM should never be enabled. Secondly when FBC is enabled
with FBC WM disabled, LP2+ watermarks must be disabled.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index a65d8816c1e6..3d4daa1fc3be 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -2701,7 +2701,8 @@ static void ilk_wm_merge(struct drm_device *dev, | |||
2701 | config->num_pipes_active > 1) | 2701 | config->num_pipes_active > 1) |
2702 | return; | 2702 | return; |
2703 | 2703 | ||
2704 | merged->fbc_wm_enabled = true; | 2704 | /* ILK: FBC WM must be disabled always */ |
2705 | merged->fbc_wm_enabled = INTEL_INFO(dev)->gen >= 6; | ||
2705 | 2706 | ||
2706 | /* merge each WM1+ level */ | 2707 | /* merge each WM1+ level */ |
2707 | for (level = 1; level <= max_level; level++) { | 2708 | for (level = 1; level <= max_level; level++) { |
@@ -2721,6 +2722,20 @@ static void ilk_wm_merge(struct drm_device *dev, | |||
2721 | wm->fbc_val = 0; | 2722 | wm->fbc_val = 0; |
2722 | } | 2723 | } |
2723 | } | 2724 | } |
2725 | |||
2726 | /* ILK: LP2+ must be disabled when FBC WM is disabled but FBC enabled */ | ||
2727 | /* | ||
2728 | * FIXME this is racy. FBC might get enabled later. | ||
2729 | * What we should check here is whether FBC can be | ||
2730 | * enabled sometime later. | ||
2731 | */ | ||
2732 | if (IS_GEN5(dev) && !merged->fbc_wm_enabled && intel_fbc_enabled(dev)) { | ||
2733 | for (level = 2; level <= max_level; level++) { | ||
2734 | struct intel_wm_level *wm = &merged->wm[level]; | ||
2735 | |||
2736 | wm->enable = false; | ||
2737 | } | ||
2738 | } | ||
2724 | } | 2739 | } |
2725 | 2740 | ||
2726 | static int ilk_wm_lp_to_level(int wm_lp, const struct intel_pipe_wm *pipe_wm) | 2741 | static int ilk_wm_lp_to_level(int wm_lp, const struct intel_pipe_wm *pipe_wm) |