Re: [Intel-gfx] [PATCH 2/2] drm/i915/overlay: Use the ioctl parameters directly

2018-09-11 Thread Ville Syrjälä
On Thu, Sep 06, 2018 at 08:01:44PM +0100, Chris Wilson wrote:
> The user parameters to put_image are not copied back to userspace
> (DRM_IOW), and so we can modify the ioctl parameters (having already been
> copied to a temporary kernel struct) directly and use those in place,
> avoiding another temporary malloc and lots of manual copying.
> 
> Signed-off-by: Chris Wilson 
> ---
>  drivers/gpu/drm/i915/intel_overlay.c | 147 ++-
>  1 file changed, 54 insertions(+), 93 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_overlay.c 
> b/drivers/gpu/drm/i915/intel_overlay.c
> index 443dfaefd7a6..72eb7e48e8bc 100644
> --- a/drivers/gpu/drm/i915/intel_overlay.c
> +++ b/drivers/gpu/drm/i915/intel_overlay.c
> @@ -487,23 +487,6 @@ void intel_overlay_reset(struct drm_i915_private 
> *dev_priv)
>   overlay->active = false;
>  }
>  
> -struct put_image_params {
> - int format;
> - short dst_x;
> - short dst_y;
> - short dst_w;
> - short dst_h;
> - short src_w;
> - short src_scan_h;
> - short src_scan_w;
> - short src_h;
> - short stride_Y;
> - short stride_UV;
> - int offset_Y;
> - int offset_U;
> - int offset_V;
> -};
> -
>  static int packed_depth_bytes(u32 format)
>  {
>   switch (format & I915_OVERLAY_DEPTH_MASK) {
> @@ -618,25 +601,25 @@ static void update_polyphase_filter(struct 
> overlay_registers __iomem *regs)
>  
>  static bool update_scaling_factors(struct intel_overlay *overlay,
>  struct overlay_registers __iomem *regs,
> -struct put_image_params *params)
> +struct drm_intel_overlay_put_image *params)

I believe we could constify a bunch of these while at it.

Quick scan didn't find any obvious fails so
Reviewed-by: Ville Syrjälä 

>  {
>   /* fixed point with a 12 bit shift */
>   u32 xscale, yscale, xscale_UV, yscale_UV;
>  #define FP_SHIFT 12
>  #define FRACT_MASK 0xfff
>   bool scale_changed = false;
> - int uv_hscale = uv_hsubsampling(params->format);
> - int uv_vscale = uv_vsubsampling(params->format);
> + int uv_hscale = uv_hsubsampling(params->flags);
> + int uv_vscale = uv_vsubsampling(params->flags);
>  
> - if (params->dst_w > 1)
> - xscale = ((params->src_scan_w - 1) << FP_SHIFT)
> - /(params->dst_w);
> + if (params->dst_width > 1)
> + xscale = ((params->src_scan_width - 1) << FP_SHIFT) /
> + params->dst_width;
>   else
>   xscale = 1 << FP_SHIFT;
>  
> - if (params->dst_h > 1)
> - yscale = ((params->src_scan_h - 1) << FP_SHIFT)
> - /(params->dst_h);
> + if (params->dst_height > 1)
> + yscale = ((params->src_scan_height - 1) << FP_SHIFT) /
> + params->dst_height;
>   else
>   yscale = 1 << FP_SHIFT;
>  
> @@ -713,12 +696,12 @@ static void update_colorkey(struct intel_overlay 
> *overlay,
>   iowrite32(flags, >DCLRKM);
>  }
>  
> -static u32 overlay_cmd_reg(struct put_image_params *params)
> +static u32 overlay_cmd_reg(struct drm_intel_overlay_put_image *params)
>  {
>   u32 cmd = OCMD_ENABLE | OCMD_BUF_TYPE_FRAME | OCMD_BUFFER0;
>  
> - if (params->format & I915_OVERLAY_YUV_PLANAR) {
> - switch (params->format & I915_OVERLAY_DEPTH_MASK) {
> + if (params->flags & I915_OVERLAY_YUV_PLANAR) {
> + switch (params->flags & I915_OVERLAY_DEPTH_MASK) {
>   case I915_OVERLAY_YUV422:
>   cmd |= OCMD_YUV_422_PLANAR;
>   break;
> @@ -731,7 +714,7 @@ static u32 overlay_cmd_reg(struct put_image_params 
> *params)
>   break;
>   }
>   } else { /* YUV packed */
> - switch (params->format & I915_OVERLAY_DEPTH_MASK) {
> + switch (params->flags & I915_OVERLAY_DEPTH_MASK) {
>   case I915_OVERLAY_YUV422:
>   cmd |= OCMD_YUV_422_PACKED;
>   break;
> @@ -740,7 +723,7 @@ static u32 overlay_cmd_reg(struct put_image_params 
> *params)
>   break;
>   }
>  
> - switch (params->format & I915_OVERLAY_SWAP_MASK) {
> + switch (params->flags & I915_OVERLAY_SWAP_MASK) {
>   case I915_OVERLAY_NO_SWAP:
>   break;
>   case I915_OVERLAY_UV_SWAP:
> @@ -760,7 +743,7 @@ static u32 overlay_cmd_reg(struct put_image_params 
> *params)
>  
>  static int intel_overlay_do_put_image(struct intel_overlay *overlay,
> struct drm_i915_gem_object *new_bo,
> -   struct put_image_params *params)
> +   struct drm_intel_overlay_put_image 
> *params)
>  {
>   struct overlay_registers __iomem *regs = overlay->regs;
>   struct drm_i915_private *dev_priv = 

[Intel-gfx] [PATCH 2/2] drm/i915/overlay: Use the ioctl parameters directly

2018-09-06 Thread Chris Wilson
The user parameters to put_image are not copied back to userspace
(DRM_IOW), and so we can modify the ioctl parameters (having already been
copied to a temporary kernel struct) directly and use those in place,
avoiding another temporary malloc and lots of manual copying.

Signed-off-by: Chris Wilson 
---
 drivers/gpu/drm/i915/intel_overlay.c | 147 ++-
 1 file changed, 54 insertions(+), 93 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_overlay.c 
b/drivers/gpu/drm/i915/intel_overlay.c
index 443dfaefd7a6..72eb7e48e8bc 100644
--- a/drivers/gpu/drm/i915/intel_overlay.c
+++ b/drivers/gpu/drm/i915/intel_overlay.c
@@ -487,23 +487,6 @@ void intel_overlay_reset(struct drm_i915_private *dev_priv)
overlay->active = false;
 }
 
-struct put_image_params {
-   int format;
-   short dst_x;
-   short dst_y;
-   short dst_w;
-   short dst_h;
-   short src_w;
-   short src_scan_h;
-   short src_scan_w;
-   short src_h;
-   short stride_Y;
-   short stride_UV;
-   int offset_Y;
-   int offset_U;
-   int offset_V;
-};
-
 static int packed_depth_bytes(u32 format)
 {
switch (format & I915_OVERLAY_DEPTH_MASK) {
@@ -618,25 +601,25 @@ static void update_polyphase_filter(struct 
overlay_registers __iomem *regs)
 
 static bool update_scaling_factors(struct intel_overlay *overlay,
   struct overlay_registers __iomem *regs,
-  struct put_image_params *params)
+  struct drm_intel_overlay_put_image *params)
 {
/* fixed point with a 12 bit shift */
u32 xscale, yscale, xscale_UV, yscale_UV;
 #define FP_SHIFT 12
 #define FRACT_MASK 0xfff
bool scale_changed = false;
-   int uv_hscale = uv_hsubsampling(params->format);
-   int uv_vscale = uv_vsubsampling(params->format);
+   int uv_hscale = uv_hsubsampling(params->flags);
+   int uv_vscale = uv_vsubsampling(params->flags);
 
-   if (params->dst_w > 1)
-   xscale = ((params->src_scan_w - 1) << FP_SHIFT)
-   /(params->dst_w);
+   if (params->dst_width > 1)
+   xscale = ((params->src_scan_width - 1) << FP_SHIFT) /
+   params->dst_width;
else
xscale = 1 << FP_SHIFT;
 
-   if (params->dst_h > 1)
-   yscale = ((params->src_scan_h - 1) << FP_SHIFT)
-   /(params->dst_h);
+   if (params->dst_height > 1)
+   yscale = ((params->src_scan_height - 1) << FP_SHIFT) /
+   params->dst_height;
else
yscale = 1 << FP_SHIFT;
 
@@ -713,12 +696,12 @@ static void update_colorkey(struct intel_overlay *overlay,
iowrite32(flags, >DCLRKM);
 }
 
-static u32 overlay_cmd_reg(struct put_image_params *params)
+static u32 overlay_cmd_reg(struct drm_intel_overlay_put_image *params)
 {
u32 cmd = OCMD_ENABLE | OCMD_BUF_TYPE_FRAME | OCMD_BUFFER0;
 
-   if (params->format & I915_OVERLAY_YUV_PLANAR) {
-   switch (params->format & I915_OVERLAY_DEPTH_MASK) {
+   if (params->flags & I915_OVERLAY_YUV_PLANAR) {
+   switch (params->flags & I915_OVERLAY_DEPTH_MASK) {
case I915_OVERLAY_YUV422:
cmd |= OCMD_YUV_422_PLANAR;
break;
@@ -731,7 +714,7 @@ static u32 overlay_cmd_reg(struct put_image_params *params)
break;
}
} else { /* YUV packed */
-   switch (params->format & I915_OVERLAY_DEPTH_MASK) {
+   switch (params->flags & I915_OVERLAY_DEPTH_MASK) {
case I915_OVERLAY_YUV422:
cmd |= OCMD_YUV_422_PACKED;
break;
@@ -740,7 +723,7 @@ static u32 overlay_cmd_reg(struct put_image_params *params)
break;
}
 
-   switch (params->format & I915_OVERLAY_SWAP_MASK) {
+   switch (params->flags & I915_OVERLAY_SWAP_MASK) {
case I915_OVERLAY_NO_SWAP:
break;
case I915_OVERLAY_UV_SWAP:
@@ -760,7 +743,7 @@ static u32 overlay_cmd_reg(struct put_image_params *params)
 
 static int intel_overlay_do_put_image(struct intel_overlay *overlay,
  struct drm_i915_gem_object *new_bo,
- struct put_image_params *params)
+ struct drm_intel_overlay_put_image 
*params)
 {
struct overlay_registers __iomem *regs = overlay->regs;
struct drm_i915_private *dev_priv = overlay->i915;
@@ -806,35 +789,40 @@ static int intel_overlay_do_put_image(struct 
intel_overlay *overlay,
goto out_unpin;
}
 
-   iowrite32((params->dst_y << 16) | params->dst_x, >DWINPOS);
-   iowrite32((params->dst_h << 16) | params->dst_w, >DWINSZ);
+