The BIOS can enable a pipe but leave the primary plane disabled. This coflicts with out current idea of primary_enabled. Read the actual hardware plane state and set primary_enabled appropriately. We currently assume that primary_enabled is always true when we're about to disable a crtc. That needs to change now as the plane may not be enabled. So replace the relevant WARNs with early returns in intel_{enable,disable}_primary_hw_plane(). Fixes the following warning [ 3.831602] WARNING: CPU: 0 PID: 1112 at linux/drivers/gpu/drm/i915/intel_display.c:1918 intel_disable_primary_hw_plane+0xe4/0xf0 [i915]() which got introduced here by me: commit e9e39655c0c30cddc3f8c09a757678a24dd36737 Author: Ville Syrjälä <ville.syrjala@linux.intel.com> Date: Mon Apr 28 15:53:25 2014 +0300 drm/i915: Remove useless checks from primary enable/disable
Unified · Split
| @@ -1880,7 +1880,8 @@ static void intel_enable_primary_hw_plane(struct drm_i915_private *dev_priv, · 1879 unmodified lines | ||
| 1880 | 1880 | /* If the pipe isn't enabled, we can't pump pixels and may hang */ |
| 1881 | 1881 | assert_pipe_enabled(dev_priv, pipe); |
| 1882 | 1882 | |
| 1883 | − WARN(intel_crtc->primary_enabled, "Primary plane already enabled\n"); | |
| 1883 | + if (intel_crtc->primary_enabled) | |
| 1884 | + return; | |
| 1884 | 1885 | |
| 1885 | 1886 | intel_crtc->primary_enabled = true; |
| 1886 | 1887 | |
| @@ -1910,7 +1911,8 @@ static void intel_disable_primary_hw_plane(struct drm_i915_private *dev_priv, · 23 unmodified lines | ||
| 1910 | 1911 | int reg; |
| 1911 | 1912 | u32 val; |
| 1912 | 1913 | |
| 1913 | − WARN(!intel_crtc->primary_enabled, "Primary plane already disabled\n"); | |
| 1914 | + if (!intel_crtc->primary_enabled) | |
| 1915 | + return; | |
| 1914 | 1916 | |
| 1915 | 1917 | intel_crtc->primary_enabled = false; |
| 1916 | 1918 | |
| @@ -11579,6 +11581,16 @@ void i915_redisable_vga(struct drm_device *dev) · 9662 unmodified lines | ||
| 11579 | 11581 | i915_redisable_vga_power_on(dev); |
| 11580 | 11582 | } |
| 11581 | 11583 | |
| 11584 | +static bool primary_get_hw_state(struct intel_crtc *crtc) | |
| 11585 | +{ | |
| 11586 | + struct drm_i915_private *dev_priv = crtc->base.dev->dev_private; | |
| 11587 | + | |
| 11588 | + if (!crtc->active) | |
| 11589 | + return false; | |
| 11590 | + | |
| 11591 | + return I915_READ(DSPCNTR(crtc->plane)) & DISPLAY_PLANE_ENABLE; | |
| 11592 | +} | |
| 11593 | + | |
| 11582 | 11594 | static void intel_modeset_readout_hw_state(struct drm_device *dev) |
| 11583 | 11595 | { |
| 11584 | 11596 | struct drm_i915_private *dev_priv = dev->dev_private; |
| @@ -11598,7 +11610,7 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev) · 13 unmodified lines | ||
| 11598 | 11610 | &crtc->config); |
| 11599 | 11611 | |
| 11600 | 11612 | crtc->base.enabled = crtc->active; |
| 11601 | − crtc->primary_enabled = crtc->active; | |
| 11613 | + crtc->primary_enabled = primary_get_hw_state(crtc); | |
| 11602 | 11614 | |
| 11603 | 11615 | DRM_DEBUG_KMS("[CRTC:%d] hw state readout: %s\n", |
| 11604 | 11616 | crtc->base.base.id, |