aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2013-05-24 10:59:17 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-05-31 14:53:52 -0400
commit4c4ff43a692b44c6e326f9f28208f3d78ea51f7e (patch)
tree6aaa585f7cec34c9181ed431dde9b406ab1828f7
parent64936258d7e426bee5f2392269b1b20172db9ffb (diff)
drm/i915: add "enable" argument to intel_update_sprite_watermarks
Because we want to call it from the "sprite disable" paths, since on Haswell we need to update the sprite watermarks when we disable sprites. For now, all this patch does is to add the "enable" argument and call intel_update_sprite_watermarks from inside ivb_disable_plane. This shouldn't change how the code behaves because on sandybridge_update_sprite_wm we just ignore the "!enable" case. The patches that implement Haswell watermarks will make use of the changes introduced by this patch. Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h3
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c11
-rw-r--r--drivers/gpu/drm/i915/intel_sprite.c8
4 files changed, 16 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index f6419f40df38..e09c54c73a22 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -315,7 +315,8 @@ struct drm_i915_display_funcs {
315 int (*get_fifo_size)(struct drm_device *dev, int plane); 315 int (*get_fifo_size)(struct drm_device *dev, int plane);
316 void (*update_wm)(struct drm_device *dev); 316 void (*update_wm)(struct drm_device *dev);
317 void (*update_sprite_wm)(struct drm_device *dev, int pipe, 317 void (*update_sprite_wm)(struct drm_device *dev, int pipe,
318 uint32_t sprite_width, int pixel_size); 318 uint32_t sprite_width, int pixel_size,
319 bool enable);
319 void (*modeset_global_resources)(struct drm_device *dev); 320 void (*modeset_global_resources)(struct drm_device *dev);
320 /* Returns the active state of the crtc, and if the crtc is active, 321 /* Returns the active state of the crtc, and if the crtc is active,
321 * fills out the pipe-config with the hw state. */ 322 * fills out the pipe-config with the hw state. */
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 83b4fe4b7be0..3e6e5e7b089f 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -731,7 +731,7 @@ extern void intel_ddi_init(struct drm_device *dev, enum port port);
731extern void intel_update_watermarks(struct drm_device *dev); 731extern void intel_update_watermarks(struct drm_device *dev);
732extern void intel_update_sprite_watermarks(struct drm_device *dev, int pipe, 732extern void intel_update_sprite_watermarks(struct drm_device *dev, int pipe,
733 uint32_t sprite_width, 733 uint32_t sprite_width,
734 int pixel_size); 734 int pixel_size, bool enable);
735 735
736extern unsigned long intel_gen4_compute_page_offset(int *x, int *y, 736extern unsigned long intel_gen4_compute_page_offset(int *x, int *y,
737 unsigned int tiling_mode, 737 unsigned int tiling_mode,
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index fa4c818d4b00..3515efd049dd 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -2195,7 +2195,8 @@ sandybridge_compute_sprite_srwm(struct drm_device *dev, int plane,
2195} 2195}
2196 2196
2197static void sandybridge_update_sprite_wm(struct drm_device *dev, int pipe, 2197static void sandybridge_update_sprite_wm(struct drm_device *dev, int pipe,
2198 uint32_t sprite_width, int pixel_size) 2198 uint32_t sprite_width, int pixel_size,
2199 bool enable)
2199{ 2200{
2200 struct drm_i915_private *dev_priv = dev->dev_private; 2201 struct drm_i915_private *dev_priv = dev->dev_private;
2201 int latency = SNB_READ_WM0_LATENCY() * 100; /* In unit 0.1us */ 2202 int latency = SNB_READ_WM0_LATENCY() * 100; /* In unit 0.1us */
@@ -2203,6 +2204,9 @@ static void sandybridge_update_sprite_wm(struct drm_device *dev, int pipe,
2203 int sprite_wm, reg; 2204 int sprite_wm, reg;
2204 int ret; 2205 int ret;
2205 2206
2207 if (!enable)
2208 return;
2209
2206 switch (pipe) { 2210 switch (pipe) {
2207 case 0: 2211 case 0:
2208 reg = WM0_PIPEA_ILK; 2212 reg = WM0_PIPEA_ILK;
@@ -2314,13 +2318,14 @@ void intel_update_watermarks(struct drm_device *dev)
2314} 2318}
2315 2319
2316void intel_update_sprite_watermarks(struct drm_device *dev, int pipe, 2320void intel_update_sprite_watermarks(struct drm_device *dev, int pipe,
2317 uint32_t sprite_width, int pixel_size) 2321 uint32_t sprite_width, int pixel_size,
2322 bool enable)
2318{ 2323{
2319 struct drm_i915_private *dev_priv = dev->dev_private; 2324 struct drm_i915_private *dev_priv = dev->dev_private;
2320 2325
2321 if (dev_priv->display.update_sprite_wm) 2326 if (dev_priv->display.update_sprite_wm)
2322 dev_priv->display.update_sprite_wm(dev, pipe, sprite_width, 2327 dev_priv->display.update_sprite_wm(dev, pipe, sprite_width,
2323 pixel_size); 2328 pixel_size, enable);
2324} 2329}
2325 2330
2326static struct drm_i915_gem_object * 2331static struct drm_i915_gem_object *
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
index 19b9cb961b5a..04d38d4d811a 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -114,7 +114,7 @@ vlv_update_plane(struct drm_plane *dplane, struct drm_framebuffer *fb,
114 crtc_w--; 114 crtc_w--;
115 crtc_h--; 115 crtc_h--;
116 116
117 intel_update_sprite_watermarks(dev, pipe, crtc_w, pixel_size); 117 intel_update_sprite_watermarks(dev, pipe, crtc_w, pixel_size, true);
118 118
119 I915_WRITE(SPSTRIDE(pipe, plane), fb->pitches[0]); 119 I915_WRITE(SPSTRIDE(pipe, plane), fb->pitches[0]);
120 I915_WRITE(SPPOS(pipe, plane), (crtc_y << 16) | crtc_x); 120 I915_WRITE(SPPOS(pipe, plane), (crtc_y << 16) | crtc_x);
@@ -268,7 +268,7 @@ ivb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb,
268 crtc_w--; 268 crtc_w--;
269 crtc_h--; 269 crtc_h--;
270 270
271 intel_update_sprite_watermarks(dev, pipe, crtc_w, pixel_size); 271 intel_update_sprite_watermarks(dev, pipe, crtc_w, pixel_size, true);
272 272
273 /* 273 /*
274 * IVB workaround: must disable low power watermarks for at least 274 * IVB workaround: must disable low power watermarks for at least
@@ -335,6 +335,8 @@ ivb_disable_plane(struct drm_plane *plane)
335 335
336 dev_priv->sprite_scaling_enabled &= ~(1 << pipe); 336 dev_priv->sprite_scaling_enabled &= ~(1 << pipe);
337 337
338 intel_update_sprite_watermarks(dev, pipe, 0, 0, false);
339
338 /* potentially re-enable LP watermarks */ 340 /* potentially re-enable LP watermarks */
339 if (scaling_was_enabled && !dev_priv->sprite_scaling_enabled) 341 if (scaling_was_enabled && !dev_priv->sprite_scaling_enabled)
340 intel_update_watermarks(dev); 342 intel_update_watermarks(dev);
@@ -453,7 +455,7 @@ ilk_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb,
453 crtc_w--; 455 crtc_w--;
454 crtc_h--; 456 crtc_h--;
455 457
456 intel_update_sprite_watermarks(dev, pipe, crtc_w, pixel_size); 458 intel_update_sprite_watermarks(dev, pipe, crtc_w, pixel_size, true);
457 459
458 dvsscale = 0; 460 dvsscale = 0;
459 if (IS_GEN5(dev) || crtc_w != src_w || crtc_h != src_h) 461 if (IS_GEN5(dev) || crtc_w != src_w || crtc_h != src_h)