Commit 4c4ff43a authored by Paulo Zanoni's avatar Paulo Zanoni Committed by Daniel Vetter

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: default avatarPaulo Zanoni <paulo.r.zanoni@intel.com>
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 64936258
...@@ -315,7 +315,8 @@ struct drm_i915_display_funcs { ...@@ -315,7 +315,8 @@ struct drm_i915_display_funcs {
int (*get_fifo_size)(struct drm_device *dev, int plane); int (*get_fifo_size)(struct drm_device *dev, int plane);
void (*update_wm)(struct drm_device *dev); void (*update_wm)(struct drm_device *dev);
void (*update_sprite_wm)(struct drm_device *dev, int pipe, void (*update_sprite_wm)(struct drm_device *dev, int pipe,
uint32_t sprite_width, int pixel_size); uint32_t sprite_width, int pixel_size,
bool enable);
void (*modeset_global_resources)(struct drm_device *dev); void (*modeset_global_resources)(struct drm_device *dev);
/* Returns the active state of the crtc, and if the crtc is active, /* Returns the active state of the crtc, and if the crtc is active,
* fills out the pipe-config with the hw state. */ * fills out the pipe-config with the hw state. */
......
...@@ -731,7 +731,7 @@ extern void intel_ddi_init(struct drm_device *dev, enum port port); ...@@ -731,7 +731,7 @@ extern void intel_ddi_init(struct drm_device *dev, enum port port);
extern void intel_update_watermarks(struct drm_device *dev); extern void intel_update_watermarks(struct drm_device *dev);
extern void intel_update_sprite_watermarks(struct drm_device *dev, int pipe, extern void intel_update_sprite_watermarks(struct drm_device *dev, int pipe,
uint32_t sprite_width, uint32_t sprite_width,
int pixel_size); int pixel_size, bool enable);
extern unsigned long intel_gen4_compute_page_offset(int *x, int *y, extern unsigned long intel_gen4_compute_page_offset(int *x, int *y,
unsigned int tiling_mode, unsigned int tiling_mode,
......
...@@ -2195,7 +2195,8 @@ sandybridge_compute_sprite_srwm(struct drm_device *dev, int plane, ...@@ -2195,7 +2195,8 @@ sandybridge_compute_sprite_srwm(struct drm_device *dev, int plane,
} }
static void sandybridge_update_sprite_wm(struct drm_device *dev, int pipe, static void sandybridge_update_sprite_wm(struct drm_device *dev, int pipe,
uint32_t sprite_width, int pixel_size) uint32_t sprite_width, int pixel_size,
bool enable)
{ {
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
int latency = SNB_READ_WM0_LATENCY() * 100; /* In unit 0.1us */ 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,6 +2204,9 @@ static void sandybridge_update_sprite_wm(struct drm_device *dev, int pipe,
int sprite_wm, reg; int sprite_wm, reg;
int ret; int ret;
if (!enable)
return;
switch (pipe) { switch (pipe) {
case 0: case 0:
reg = WM0_PIPEA_ILK; reg = WM0_PIPEA_ILK;
...@@ -2314,13 +2318,14 @@ void intel_update_watermarks(struct drm_device *dev) ...@@ -2314,13 +2318,14 @@ void intel_update_watermarks(struct drm_device *dev)
} }
void intel_update_sprite_watermarks(struct drm_device *dev, int pipe, void intel_update_sprite_watermarks(struct drm_device *dev, int pipe,
uint32_t sprite_width, int pixel_size) uint32_t sprite_width, int pixel_size,
bool enable)
{ {
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
if (dev_priv->display.update_sprite_wm) if (dev_priv->display.update_sprite_wm)
dev_priv->display.update_sprite_wm(dev, pipe, sprite_width, dev_priv->display.update_sprite_wm(dev, pipe, sprite_width,
pixel_size); pixel_size, enable);
} }
static struct drm_i915_gem_object * static struct drm_i915_gem_object *
......
...@@ -114,7 +114,7 @@ vlv_update_plane(struct drm_plane *dplane, struct drm_framebuffer *fb, ...@@ -114,7 +114,7 @@ vlv_update_plane(struct drm_plane *dplane, struct drm_framebuffer *fb,
crtc_w--; crtc_w--;
crtc_h--; crtc_h--;
intel_update_sprite_watermarks(dev, pipe, crtc_w, pixel_size); intel_update_sprite_watermarks(dev, pipe, crtc_w, pixel_size, true);
I915_WRITE(SPSTRIDE(pipe, plane), fb->pitches[0]); I915_WRITE(SPSTRIDE(pipe, plane), fb->pitches[0]);
I915_WRITE(SPPOS(pipe, plane), (crtc_y << 16) | crtc_x); 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,7 +268,7 @@ ivb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb,
crtc_w--; crtc_w--;
crtc_h--; crtc_h--;
intel_update_sprite_watermarks(dev, pipe, crtc_w, pixel_size); intel_update_sprite_watermarks(dev, pipe, crtc_w, pixel_size, true);
/* /*
* IVB workaround: must disable low power watermarks for at least * IVB workaround: must disable low power watermarks for at least
...@@ -335,6 +335,8 @@ ivb_disable_plane(struct drm_plane *plane) ...@@ -335,6 +335,8 @@ ivb_disable_plane(struct drm_plane *plane)
dev_priv->sprite_scaling_enabled &= ~(1 << pipe); dev_priv->sprite_scaling_enabled &= ~(1 << pipe);
intel_update_sprite_watermarks(dev, pipe, 0, 0, false);
/* potentially re-enable LP watermarks */ /* potentially re-enable LP watermarks */
if (scaling_was_enabled && !dev_priv->sprite_scaling_enabled) if (scaling_was_enabled && !dev_priv->sprite_scaling_enabled)
intel_update_watermarks(dev); intel_update_watermarks(dev);
...@@ -453,7 +455,7 @@ ilk_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb, ...@@ -453,7 +455,7 @@ ilk_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb,
crtc_w--; crtc_w--;
crtc_h--; crtc_h--;
intel_update_sprite_watermarks(dev, pipe, crtc_w, pixel_size); intel_update_sprite_watermarks(dev, pipe, crtc_w, pixel_size, true);
dvsscale = 0; dvsscale = 0;
if (IS_GEN5(dev) || crtc_w != src_w || crtc_h != src_h) if (IS_GEN5(dev) || crtc_w != src_w || crtc_h != src_h)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment