aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamien Lespiau <damien.lespiau@intel.com>2015-02-05 14:35:13 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-02-13 17:28:06 -0500
commit42a7b088127f7725b6d445d7d9e1e1855988a157 (patch)
treef75f692828b61e35ef4428190e586537156236aa
parentfb9981aa675eb7b398849915364916fd98833cfa (diff)
drm/i915: Make sure the primary plane is enabled before reading out the fb state
We don't want to end up in a state where we track that the pipe has its primary plane enabled when primary plane registers are programmed with values that look possible but the plane actually disabled. Refuse to read out the fb state when the primary plane isn't enabled. Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Suggested-by: Matt Roper <matthew.d.roper@intel.com> Signed-off-by: Damien Lespiau <damien.lespiau@intel.com> Reviewed-by: Matt Roper <matthew.d.roper@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_display.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 074f204fdc35..3fe95982be93 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -6613,6 +6613,10 @@ i9xx_get_initial_plane_config(struct intel_crtc *crtc,
6613 struct drm_framebuffer *fb; 6613 struct drm_framebuffer *fb;
6614 struct intel_framebuffer *intel_fb; 6614 struct intel_framebuffer *intel_fb;
6615 6615
6616 val = I915_READ(DSPCNTR(plane));
6617 if (!(val & DISPLAY_PLANE_ENABLE))
6618 return;
6619
6616 intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL); 6620 intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
6617 if (!intel_fb) { 6621 if (!intel_fb) {
6618 DRM_DEBUG_KMS("failed to alloc fb\n"); 6622 DRM_DEBUG_KMS("failed to alloc fb\n");
@@ -6621,8 +6625,6 @@ i9xx_get_initial_plane_config(struct intel_crtc *crtc,
6621 6625
6622 fb = &intel_fb->base; 6626 fb = &intel_fb->base;
6623 6627
6624 val = I915_READ(DSPCNTR(plane));
6625
6626 if (INTEL_INFO(dev)->gen >= 4) 6628 if (INTEL_INFO(dev)->gen >= 4)
6627 if (val & DISPPLANE_TILED) 6629 if (val & DISPPLANE_TILED)
6628 plane_config->tiling = I915_TILING_X; 6630 plane_config->tiling = I915_TILING_X;
@@ -7654,6 +7656,9 @@ skylake_get_initial_plane_config(struct intel_crtc *crtc,
7654 fb = &intel_fb->base; 7656 fb = &intel_fb->base;
7655 7657
7656 val = I915_READ(PLANE_CTL(pipe, 0)); 7658 val = I915_READ(PLANE_CTL(pipe, 0));
7659 if (!(val & PLANE_CTL_ENABLE))
7660 goto error;
7661
7657 if (val & PLANE_CTL_TILED_MASK) 7662 if (val & PLANE_CTL_TILED_MASK)
7658 plane_config->tiling = I915_TILING_X; 7663 plane_config->tiling = I915_TILING_X;
7659 7664
@@ -7741,6 +7746,10 @@ ironlake_get_initial_plane_config(struct intel_crtc *crtc,
7741 struct drm_framebuffer *fb; 7746 struct drm_framebuffer *fb;
7742 struct intel_framebuffer *intel_fb; 7747 struct intel_framebuffer *intel_fb;
7743 7748
7749 val = I915_READ(DSPCNTR(pipe));
7750 if (!(val & DISPLAY_PLANE_ENABLE))
7751 return;
7752
7744 intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL); 7753 intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
7745 if (!intel_fb) { 7754 if (!intel_fb) {
7746 DRM_DEBUG_KMS("failed to alloc fb\n"); 7755 DRM_DEBUG_KMS("failed to alloc fb\n");
@@ -7749,8 +7758,6 @@ ironlake_get_initial_plane_config(struct intel_crtc *crtc,
7749 7758
7750 fb = &intel_fb->base; 7759 fb = &intel_fb->base;
7751 7760
7752 val = I915_READ(DSPCNTR(pipe));
7753
7754 if (INTEL_INFO(dev)->gen >= 4) 7761 if (INTEL_INFO(dev)->gen >= 4)
7755 if (val & DISPPLANE_TILED) 7762 if (val & DISPPLANE_TILED)
7756 plane_config->tiling = I915_TILING_X; 7763 plane_config->tiling = I915_TILING_X;