Re: [Intel-gfx] [PATCH 2/2] drm/i915/overlay: Use the ioctl parameters directly
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
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); +