diff options
author | David S. Miller <davem@davemloft.net> | 2018-11-24 20:01:43 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-11-24 20:01:43 -0500 |
commit | b1bf78bfb2e4c9ffa03ccdbc60d89a2f7c5fd82c (patch) | |
tree | fcd93c3f54a72ca6a6ee97f015efebe6d80a3271 /drivers/gpu/drm/i915/intel_pm.c | |
parent | aea0a897af9e44c258e8ab9296fad417f1bc063a (diff) | |
parent | d146194f31c96f9b260c5a1cf1592d2e7f82a2e2 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 245f0022bcfd..3fe358db1276 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -2493,6 +2493,9 @@ static uint32_t ilk_compute_pri_wm(const struct intel_crtc_state *cstate, | |||
2493 | uint32_t method1, method2; | 2493 | uint32_t method1, method2; |
2494 | int cpp; | 2494 | int cpp; |
2495 | 2495 | ||
2496 | if (mem_value == 0) | ||
2497 | return U32_MAX; | ||
2498 | |||
2496 | if (!intel_wm_plane_visible(cstate, pstate)) | 2499 | if (!intel_wm_plane_visible(cstate, pstate)) |
2497 | return 0; | 2500 | return 0; |
2498 | 2501 | ||
@@ -2522,6 +2525,9 @@ static uint32_t ilk_compute_spr_wm(const struct intel_crtc_state *cstate, | |||
2522 | uint32_t method1, method2; | 2525 | uint32_t method1, method2; |
2523 | int cpp; | 2526 | int cpp; |
2524 | 2527 | ||
2528 | if (mem_value == 0) | ||
2529 | return U32_MAX; | ||
2530 | |||
2525 | if (!intel_wm_plane_visible(cstate, pstate)) | 2531 | if (!intel_wm_plane_visible(cstate, pstate)) |
2526 | return 0; | 2532 | return 0; |
2527 | 2533 | ||
@@ -2545,6 +2551,9 @@ static uint32_t ilk_compute_cur_wm(const struct intel_crtc_state *cstate, | |||
2545 | { | 2551 | { |
2546 | int cpp; | 2552 | int cpp; |
2547 | 2553 | ||
2554 | if (mem_value == 0) | ||
2555 | return U32_MAX; | ||
2556 | |||
2548 | if (!intel_wm_plane_visible(cstate, pstate)) | 2557 | if (!intel_wm_plane_visible(cstate, pstate)) |
2549 | return 0; | 2558 | return 0; |
2550 | 2559 | ||
@@ -3008,6 +3017,34 @@ static void snb_wm_latency_quirk(struct drm_i915_private *dev_priv) | |||
3008 | intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency); | 3017 | intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency); |
3009 | } | 3018 | } |
3010 | 3019 | ||
3020 | static void snb_wm_lp3_irq_quirk(struct drm_i915_private *dev_priv) | ||
3021 | { | ||
3022 | /* | ||
3023 | * On some SNB machines (Thinkpad X220 Tablet at least) | ||
3024 | * LP3 usage can cause vblank interrupts to be lost. | ||
3025 | * The DEIIR bit will go high but it looks like the CPU | ||
3026 | * never gets interrupted. | ||
3027 | * | ||
3028 | * It's not clear whether other interrupt source could | ||
3029 | * be affected or if this is somehow limited to vblank | ||
3030 | * interrupts only. To play it safe we disable LP3 | ||
3031 | * watermarks entirely. | ||
3032 | */ | ||
3033 | if (dev_priv->wm.pri_latency[3] == 0 && | ||
3034 | dev_priv->wm.spr_latency[3] == 0 && | ||
3035 | dev_priv->wm.cur_latency[3] == 0) | ||
3036 | return; | ||
3037 | |||
3038 | dev_priv->wm.pri_latency[3] = 0; | ||
3039 | dev_priv->wm.spr_latency[3] = 0; | ||
3040 | dev_priv->wm.cur_latency[3] = 0; | ||
3041 | |||
3042 | DRM_DEBUG_KMS("LP3 watermarks disabled due to potential for lost interrupts\n"); | ||
3043 | intel_print_wm_latency(dev_priv, "Primary", dev_priv->wm.pri_latency); | ||
3044 | intel_print_wm_latency(dev_priv, "Sprite", dev_priv->wm.spr_latency); | ||
3045 | intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency); | ||
3046 | } | ||
3047 | |||
3011 | static void ilk_setup_wm_latency(struct drm_i915_private *dev_priv) | 3048 | static void ilk_setup_wm_latency(struct drm_i915_private *dev_priv) |
3012 | { | 3049 | { |
3013 | intel_read_wm_latency(dev_priv, dev_priv->wm.pri_latency); | 3050 | intel_read_wm_latency(dev_priv, dev_priv->wm.pri_latency); |
@@ -3024,8 +3061,10 @@ static void ilk_setup_wm_latency(struct drm_i915_private *dev_priv) | |||
3024 | intel_print_wm_latency(dev_priv, "Sprite", dev_priv->wm.spr_latency); | 3061 | intel_print_wm_latency(dev_priv, "Sprite", dev_priv->wm.spr_latency); |
3025 | intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency); | 3062 | intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency); |
3026 | 3063 | ||
3027 | if (IS_GEN6(dev_priv)) | 3064 | if (IS_GEN6(dev_priv)) { |
3028 | snb_wm_latency_quirk(dev_priv); | 3065 | snb_wm_latency_quirk(dev_priv); |
3066 | snb_wm_lp3_irq_quirk(dev_priv); | ||
3067 | } | ||
3029 | } | 3068 | } |
3030 | 3069 | ||
3031 | static void skl_setup_wm_latency(struct drm_i915_private *dev_priv) | 3070 | static void skl_setup_wm_latency(struct drm_i915_private *dev_priv) |