aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_sprite.c
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2013-02-08 16:13:35 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-02-15 04:30:37 -0500
commit2c6602df1a7ff79c9e489602445a6d7eb728744e (patch)
tree553f9792187be83ec128a071751a3b9cd79c128f /drivers/gpu/drm/i915/intel_sprite.c
parent26739f12cf210cb8df35969258a1f064e8e12b63 (diff)
drm/i915: Fix sprite_scaling_enabled for multiple sprites
We have more than one sprite, so a boolean simply won't cut it. Turn sprite_scaling_enabled into a bitmask and track the state of sprite scaler for each sprite independently. Also don't re-enable LP watermarks until the sprite registers have actually been written, and thus sprite scaling has really been disabled. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_sprite.c')
-rw-r--r--drivers/gpu/drm/i915/intel_sprite.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
index f8293061d6bd..03cfd62d17e2 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -50,6 +50,7 @@ ivb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb,
50 u32 sprctl, sprscale = 0; 50 u32 sprctl, sprscale = 0;
51 unsigned long sprsurf_offset, linear_offset; 51 unsigned long sprsurf_offset, linear_offset;
52 int pixel_size = drm_format_plane_cpp(fb->pixel_format, 0); 52 int pixel_size = drm_format_plane_cpp(fb->pixel_format, 0);
53 bool scaling_was_enabled = dev_priv->sprite_scaling_enabled;
53 54
54 sprctl = I915_READ(SPRCTL(pipe)); 55 sprctl = I915_READ(SPRCTL(pipe));
55 56
@@ -103,19 +104,15 @@ ivb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb,
103 * when scaling is disabled. 104 * when scaling is disabled.
104 */ 105 */
105 if (crtc_w != src_w || crtc_h != src_h) { 106 if (crtc_w != src_w || crtc_h != src_h) {
106 if (!dev_priv->sprite_scaling_enabled) { 107 dev_priv->sprite_scaling_enabled |= 1 << pipe;
107 dev_priv->sprite_scaling_enabled = true; 108
109 if (!scaling_was_enabled) {
108 intel_update_watermarks(dev); 110 intel_update_watermarks(dev);
109 intel_wait_for_vblank(dev, pipe); 111 intel_wait_for_vblank(dev, pipe);
110 } 112 }
111 sprscale = SPRITE_SCALE_ENABLE | (src_w << 16) | src_h; 113 sprscale = SPRITE_SCALE_ENABLE | (src_w << 16) | src_h;
112 } else { 114 } else
113 if (dev_priv->sprite_scaling_enabled) { 115 dev_priv->sprite_scaling_enabled &= ~(1 << pipe);
114 dev_priv->sprite_scaling_enabled = false;
115 /* potentially re-enable LP watermarks */
116 intel_update_watermarks(dev);
117 }
118 }
119 116
120 I915_WRITE(SPRSTRIDE(pipe), fb->pitches[0]); 117 I915_WRITE(SPRSTRIDE(pipe), fb->pitches[0]);
121 I915_WRITE(SPRPOS(pipe), (crtc_y << 16) | crtc_x); 118 I915_WRITE(SPRPOS(pipe), (crtc_y << 16) | crtc_x);
@@ -141,6 +138,10 @@ ivb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb,
141 I915_WRITE(SPRCTL(pipe), sprctl); 138 I915_WRITE(SPRCTL(pipe), sprctl);
142 I915_MODIFY_DISPBASE(SPRSURF(pipe), obj->gtt_offset + sprsurf_offset); 139 I915_MODIFY_DISPBASE(SPRSURF(pipe), obj->gtt_offset + sprsurf_offset);
143 POSTING_READ(SPRSURF(pipe)); 140 POSTING_READ(SPRSURF(pipe));
141
142 /* potentially re-enable LP watermarks */
143 if (scaling_was_enabled && !dev_priv->sprite_scaling_enabled)
144 intel_update_watermarks(dev);
144} 145}
145 146
146static void 147static void
@@ -150,6 +151,7 @@ ivb_disable_plane(struct drm_plane *plane)
150 struct drm_i915_private *dev_priv = dev->dev_private; 151 struct drm_i915_private *dev_priv = dev->dev_private;
151 struct intel_plane *intel_plane = to_intel_plane(plane); 152 struct intel_plane *intel_plane = to_intel_plane(plane);
152 int pipe = intel_plane->pipe; 153 int pipe = intel_plane->pipe;
154 bool scaling_was_enabled = dev_priv->sprite_scaling_enabled;
153 155
154 I915_WRITE(SPRCTL(pipe), I915_READ(SPRCTL(pipe)) & ~SPRITE_ENABLE); 156 I915_WRITE(SPRCTL(pipe), I915_READ(SPRCTL(pipe)) & ~SPRITE_ENABLE);
155 /* Can't leave the scaler enabled... */ 157 /* Can't leave the scaler enabled... */
@@ -159,8 +161,11 @@ ivb_disable_plane(struct drm_plane *plane)
159 I915_MODIFY_DISPBASE(SPRSURF(pipe), 0); 161 I915_MODIFY_DISPBASE(SPRSURF(pipe), 0);
160 POSTING_READ(SPRSURF(pipe)); 162 POSTING_READ(SPRSURF(pipe));
161 163
162 dev_priv->sprite_scaling_enabled = false; 164 dev_priv->sprite_scaling_enabled &= ~(1 << pipe);
163 intel_update_watermarks(dev); 165
166 /* potentially re-enable LP watermarks */
167 if (scaling_was_enabled && !dev_priv->sprite_scaling_enabled)
168 intel_update_watermarks(dev);
164} 169}
165 170
166static int 171static int