History

drm/i915: Make primary_enabled match the actual hardware state

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

Ville Syrjälä committed 12 years ago

Commit 98ec7731 parent 024a43e1 file · +15 −3Browse files

Unified · Split

drivers/gpu/drm/i915/intel_display.c+15−3
@@ -1880,7 +1880,8 @@ static void intel_enable_primary_hw_plane(struct drm_i915_private *dev_priv, · 1879 unmodified lines
18801880 /* If the pipe isn't enabled, we can't pump pixels and may hang */
18811881 assert_pipe_enabled(dev_priv, pipe);
18821882
1883− WARN(intel_crtc->primary_enabled, "Primary plane already enabled\n");
1883+ if (intel_crtc->primary_enabled)
1884+ return;
18841885
18851886 intel_crtc->primary_enabled = true;
18861887
@@ -1910,7 +1911,8 @@ static void intel_disable_primary_hw_plane(struct drm_i915_private *dev_priv, · 23 unmodified lines
19101911 int reg;
19111912 u32 val;
19121913
1913− WARN(!intel_crtc->primary_enabled, "Primary plane already disabled\n");
1914+ if (!intel_crtc->primary_enabled)
1915+ return;
19141916
19151917 intel_crtc->primary_enabled = false;
19161918
@@ -11579,6 +11581,16 @@ void i915_redisable_vga(struct drm_device *dev) · 9662 unmodified lines
1157911581 i915_redisable_vga_power_on(dev);
1158011582 }
1158111583
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+
1158211594 static void intel_modeset_readout_hw_state(struct drm_device *dev)
1158311595 {
1158411596 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
1159811610 &crtc->config);
1159911611
1160011612 crtc->base.enabled = crtc->active;
11601− crtc->primary_enabled = crtc->active;
11613+ crtc->primary_enabled = primary_get_hw_state(crtc);
1160211614
1160311615 DRM_DEBUG_KMS("[CRTC:%d] hw state readout: %s\n",
1160411616 crtc->base.base.id,

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t