[PATCH 44/51] drm/i915: Split sprite update_plane() into calc+commit phases

2012-10-25 Thread ville.syrj...@linux.intel.com
From: Ville Syrj?l? 

Separate the part that calculates the register values from the part that
writes the registers. This will be useful in the atomic page flip code.
Also move the watermark magic into a prepare function that can be
performed outside the critical parts of the atomic page flip code.

Signed-off-by: Ville Syrj?l? 
---
 drivers/gpu/drm/i915/intel_drv.h|5 +
 drivers/gpu/drm/i915/intel_sprite.c |  398 ++-
 2 files changed, 259 insertions(+), 144 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 1389eeb..6ab8f65 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -252,6 +252,11 @@ struct intel_plane {
   struct drm_intel_sprite_colorkey *key);
void (*get_colorkey)(struct drm_plane *plane,
 struct drm_intel_sprite_colorkey *key);
+   void (*calc)(struct drm_plane *plane, struct drm_framebuffer *fb,
+const struct intel_plane_coords *clip);
+   void (*prepare)(struct drm_plane *plane);
+   void (*commit)(struct drm_plane *plane);
+   struct intel_plane_regs regs;
 };

 struct intel_watermark_params {
diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
b/drivers/gpu/drm/i915/intel_sprite.c
index fee6f17..06d62e70 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -187,14 +187,12 @@ int intel_check_plane(const struct drm_plane *plane,
 }

 static void
-ivb_update_plane(struct drm_plane *plane,
-struct drm_framebuffer *fb,
-const struct intel_plane_coords *coords)
+ivb_calc_plane(struct drm_plane *plane,
+  struct drm_framebuffer *fb,
+  const struct intel_plane_coords *coords)
 {
-   struct drm_device *dev = plane->dev;
-   struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_plane *intel_plane = to_intel_plane(plane);
-   const struct drm_i915_gem_object *obj = to_intel_framebuffer(fb)->obj;
+   const struct drm_i915_gem_object *obj;
int crtc_x = coords->crtc_x;
int crtc_y = coords->crtc_y;
unsigned int crtc_w = coords->crtc_w;
@@ -203,47 +201,55 @@ ivb_update_plane(struct drm_plane *plane,
uint32_t y = coords->src_y;
uint32_t src_w = coords->src_w;
uint32_t src_h = coords->src_h;
-   int pipe = intel_plane->pipe;
-   u32 sprctl, sprscale = 0;
-   int pixel_size = drm_format_plane_cpp(fb->pixel_format, 0);
+   int pixel_size;
+   struct intel_plane_regs *regs = _plane->regs;
+
+   if (!coords->visible) {
+   regs->cntr &= ~SPRITE_ENABLE;
+   /* Disable the scaler */
+   regs->scale = 0;
+   return;
+   }

-   sprctl = I915_READ(SPRCTL(pipe));
+   obj = to_intel_framebuffer(fb)->obj;
+   pixel_size = drm_format_plane_cpp(fb->pixel_format, 0);

/* Mask out pixel format bits in case we change it */
-   sprctl &= ~SPRITE_PIXFORMAT_MASK;
-   sprctl &= ~SPRITE_RGB_ORDER_RGBX;
-   sprctl &= ~SPRITE_YUV_BYTE_ORDER_MASK;
-   sprctl &= ~SPRITE_TILED;
+   regs->cntr &= ~(SPRITE_PIXFORMAT_MASK |
+   SPRITE_RGB_ORDER_RGBX |
+   SPRITE_YUV_BYTE_ORDER_MASK |
+   SPRITE_TILED |
+   SPRITE_ENABLE);

switch (fb->pixel_format) {
case DRM_FORMAT_XBGR:
-   sprctl |= SPRITE_FORMAT_RGBX888 | SPRITE_RGB_ORDER_RGBX;
+   regs->cntr |= SPRITE_FORMAT_RGBX888 | SPRITE_RGB_ORDER_RGBX;
break;
case DRM_FORMAT_XRGB:
-   sprctl |= SPRITE_FORMAT_RGBX888;
+   regs->cntr |= SPRITE_FORMAT_RGBX888;
break;
case DRM_FORMAT_YUYV:
-   sprctl |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_YUYV;
+   regs->cntr |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_YUYV;
break;
case DRM_FORMAT_YVYU:
-   sprctl |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_YVYU;
+   regs->cntr |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_YVYU;
break;
case DRM_FORMAT_UYVY:
-   sprctl |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_UYVY;
+   regs->cntr |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_UYVY;
break;
case DRM_FORMAT_VYUY:
-   sprctl |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_VYUY;
+   regs->cntr |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_VYUY;
break;
default:
BUG();
}

if (obj->tiling_mode != I915_TILING_NONE)
-   sprctl |= SPRITE_TILED;
+   regs->cntr |= SPRITE_TILED;

/* must disable */
-   sprctl |= SPRITE_TRICKLE_FEED_DISABLE;
-   sprctl |= SPRITE_ENABLE;
+   regs->cntr |= 

[PATCH 44/51] drm/i915: Split sprite update_plane() into calc+commit phases

2012-10-25 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

Separate the part that calculates the register values from the part that
writes the registers. This will be useful in the atomic page flip code.
Also move the watermark magic into a prepare function that can be
performed outside the critical parts of the atomic page flip code.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_drv.h|5 +
 drivers/gpu/drm/i915/intel_sprite.c |  398 ++-
 2 files changed, 259 insertions(+), 144 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 1389eeb..6ab8f65 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -252,6 +252,11 @@ struct intel_plane {
   struct drm_intel_sprite_colorkey *key);
void (*get_colorkey)(struct drm_plane *plane,
 struct drm_intel_sprite_colorkey *key);
+   void (*calc)(struct drm_plane *plane, struct drm_framebuffer *fb,
+const struct intel_plane_coords *clip);
+   void (*prepare)(struct drm_plane *plane);
+   void (*commit)(struct drm_plane *plane);
+   struct intel_plane_regs regs;
 };
 
 struct intel_watermark_params {
diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
b/drivers/gpu/drm/i915/intel_sprite.c
index fee6f17..06d62e70 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -187,14 +187,12 @@ int intel_check_plane(const struct drm_plane *plane,
 }
 
 static void
-ivb_update_plane(struct drm_plane *plane,
-struct drm_framebuffer *fb,
-const struct intel_plane_coords *coords)
+ivb_calc_plane(struct drm_plane *plane,
+  struct drm_framebuffer *fb,
+  const struct intel_plane_coords *coords)
 {
-   struct drm_device *dev = plane-dev;
-   struct drm_i915_private *dev_priv = dev-dev_private;
struct intel_plane *intel_plane = to_intel_plane(plane);
-   const struct drm_i915_gem_object *obj = to_intel_framebuffer(fb)-obj;
+   const struct drm_i915_gem_object *obj;
int crtc_x = coords-crtc_x;
int crtc_y = coords-crtc_y;
unsigned int crtc_w = coords-crtc_w;
@@ -203,47 +201,55 @@ ivb_update_plane(struct drm_plane *plane,
uint32_t y = coords-src_y;
uint32_t src_w = coords-src_w;
uint32_t src_h = coords-src_h;
-   int pipe = intel_plane-pipe;
-   u32 sprctl, sprscale = 0;
-   int pixel_size = drm_format_plane_cpp(fb-pixel_format, 0);
+   int pixel_size;
+   struct intel_plane_regs *regs = intel_plane-regs;
+
+   if (!coords-visible) {
+   regs-cntr = ~SPRITE_ENABLE;
+   /* Disable the scaler */
+   regs-scale = 0;
+   return;
+   }
 
-   sprctl = I915_READ(SPRCTL(pipe));
+   obj = to_intel_framebuffer(fb)-obj;
+   pixel_size = drm_format_plane_cpp(fb-pixel_format, 0);
 
/* Mask out pixel format bits in case we change it */
-   sprctl = ~SPRITE_PIXFORMAT_MASK;
-   sprctl = ~SPRITE_RGB_ORDER_RGBX;
-   sprctl = ~SPRITE_YUV_BYTE_ORDER_MASK;
-   sprctl = ~SPRITE_TILED;
+   regs-cntr = ~(SPRITE_PIXFORMAT_MASK |
+   SPRITE_RGB_ORDER_RGBX |
+   SPRITE_YUV_BYTE_ORDER_MASK |
+   SPRITE_TILED |
+   SPRITE_ENABLE);
 
switch (fb-pixel_format) {
case DRM_FORMAT_XBGR:
-   sprctl |= SPRITE_FORMAT_RGBX888 | SPRITE_RGB_ORDER_RGBX;
+   regs-cntr |= SPRITE_FORMAT_RGBX888 | SPRITE_RGB_ORDER_RGBX;
break;
case DRM_FORMAT_XRGB:
-   sprctl |= SPRITE_FORMAT_RGBX888;
+   regs-cntr |= SPRITE_FORMAT_RGBX888;
break;
case DRM_FORMAT_YUYV:
-   sprctl |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_YUYV;
+   regs-cntr |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_YUYV;
break;
case DRM_FORMAT_YVYU:
-   sprctl |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_YVYU;
+   regs-cntr |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_YVYU;
break;
case DRM_FORMAT_UYVY:
-   sprctl |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_UYVY;
+   regs-cntr |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_UYVY;
break;
case DRM_FORMAT_VYUY:
-   sprctl |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_VYUY;
+   regs-cntr |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_VYUY;
break;
default:
BUG();
}
 
if (obj-tiling_mode != I915_TILING_NONE)
-   sprctl |= SPRITE_TILED;
+   regs-cntr |= SPRITE_TILED;
 
/* must disable */
-   sprctl |= SPRITE_TRICKLE_FEED_DISABLE;
-   sprctl |= SPRITE_ENABLE;
+