diff mbox

[4/9] drm/imx: ipuv3-plane: merge ipu_plane_atomic_set_base into atomic_update

Message ID 20161018160757.11595-4-p.zabel@pengutronix.de (mailing list archive)
State New, archived
Headers show

Commit Message

Philipp Zabel Oct. 18, 2016, 4:07 p.m. UTC
ipu_plane_atomic_set_base is called from ipu_plane_atomic_update in two
different places, depending on whether drm_atomic_crtc_needs_modeset is
true. Also depending on the same condition, this function does two
different things.
This patch removes the indirection by merging the relevant parts into
ipu_plane_atomic_update, making the actual code flow more obvious as a
result. Also remove the duplicate planar format comment, which is
already found in ipu_plane_atomic_check.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
---
 drivers/gpu/drm/imx/ipuv3-plane.c | 97 ++++++++++++++-------------------------
 1 file changed, 34 insertions(+), 63 deletions(-)

Comments

Ying Liu Oct. 19, 2016, 7:20 a.m. UTC | #1
On Wed, Oct 19, 2016 at 12:07 AM, Philipp Zabel <p.zabel@pengutronix.de> wrote:
> ipu_plane_atomic_set_base is called from ipu_plane_atomic_update in two
> different places, depending on whether drm_atomic_crtc_needs_modeset is
> true. Also depending on the same condition, this function does two
> different things.
> This patch removes the indirection by merging the relevant parts into
> ipu_plane_atomic_update, making the actual code flow more obvious as a
> result. Also remove the duplicate planar format comment, which is
> already found in ipu_plane_atomic_check.
>
> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>

Acked-by: Liu Ying <gnuiyl@gmail.com>

> ---
>  drivers/gpu/drm/imx/ipuv3-plane.c | 97 ++++++++++++++-------------------------
>  1 file changed, 34 insertions(+), 63 deletions(-)
>
> diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c
> index f217444..70fd55d 100644
> --- a/drivers/gpu/drm/imx/ipuv3-plane.c
> +++ b/drivers/gpu/drm/imx/ipuv3-plane.c
> @@ -103,62 +103,6 @@ drm_plane_state_to_vbo(struct drm_plane_state *state)
>                (state->src_x >> 16) / 2 - eba;
>  }
>
> -static void ipu_plane_atomic_set_base(struct ipu_plane *ipu_plane)
> -{
> -       struct drm_plane *plane = &ipu_plane->base;
> -       struct drm_plane_state *state = plane->state;
> -       struct drm_crtc_state *crtc_state = state->crtc->state;
> -       struct drm_framebuffer *fb = state->fb;
> -       unsigned long eba, ubo, vbo;
> -       int active;
> -
> -       eba = drm_plane_state_to_eba(state);
> -
> -       switch (fb->pixel_format) {
> -       case DRM_FORMAT_YUV420:
> -       case DRM_FORMAT_YVU420:
> -               if (!drm_atomic_crtc_needs_modeset(crtc_state))
> -                       break;
> -
> -               /*
> -                * Multiplanar formats have to meet the following restrictions:
> -                * - The (up to) three plane addresses are EBA, EBA+UBO, EBA+VBO
> -                * - EBA, UBO and VBO are a multiple of 8
> -                * - UBO and VBO are unsigned and not larger than 0xfffff8
> -                * - Only EBA may be changed while scanout is active
> -                * - The strides of U and V planes must be identical.
> -                */
> -               ubo = drm_plane_state_to_ubo(state);
> -               vbo = drm_plane_state_to_vbo(state);
> -
> -               if (fb->pixel_format == DRM_FORMAT_YUV420)
> -                       ipu_cpmem_set_yuv_planar_full(ipu_plane->ipu_ch,
> -                                                     fb->pitches[1], ubo, vbo);
> -               else
> -                       ipu_cpmem_set_yuv_planar_full(ipu_plane->ipu_ch,
> -                                                     fb->pitches[1], vbo, ubo);
> -
> -               dev_dbg(ipu_plane->base.dev->dev,
> -                       "phy = %lu %lu %lu, x = %d, y = %d", eba, ubo, vbo,
> -                       state->src_x >> 16, state->src_y >> 16);
> -               break;
> -       default:
> -               dev_dbg(ipu_plane->base.dev->dev, "phys = %lu, x = %d, y = %d",
> -                       eba, state->src_x >> 16, state->src_y >> 16);
> -
> -               break;
> -       }
> -
> -       if (!drm_atomic_crtc_needs_modeset(crtc_state)) {
> -               active = ipu_idmac_get_current_buffer(ipu_plane->ipu_ch);
> -               ipu_cpmem_set_buffer(ipu_plane->ipu_ch, !active, eba);
> -               ipu_idmac_select_buffer(ipu_plane->ipu_ch, !active);
> -       } else {
> -               ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 0, eba);
> -               ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 1, eba);
> -       }
> -}
> -
>  void ipu_plane_put_resources(struct ipu_plane *ipu_plane)
>  {
>         if (!IS_ERR_OR_NULL(ipu_plane->dp))
> @@ -394,15 +338,19 @@ static void ipu_plane_atomic_update(struct drm_plane *plane,
>  {
>         struct ipu_plane *ipu_plane = to_ipu_plane(plane);
>         struct drm_plane_state *state = plane->state;
> +       struct drm_crtc_state *crtc_state = state->crtc->state;
> +       struct drm_framebuffer *fb = state->fb;
> +       unsigned long eba, ubo, vbo;
>         enum ipu_color_space ics;
> +       int active;
>
> -       if (old_state->fb) {
> -               struct drm_crtc_state *crtc_state = state->crtc->state;
> +       eba = drm_plane_state_to_eba(state);
>
> -               if (!drm_atomic_crtc_needs_modeset(crtc_state)) {
> -                       ipu_plane_atomic_set_base(ipu_plane);
> -                       return;
> -               }
> +       if (old_state->fb && !drm_atomic_crtc_needs_modeset(crtc_state)) {
> +               active = ipu_idmac_get_current_buffer(ipu_plane->ipu_ch);
> +               ipu_cpmem_set_buffer(ipu_plane->ipu_ch, !active, eba);
> +               ipu_idmac_select_buffer(ipu_plane->ipu_ch, !active);
> +               return;
>         }
>
>         switch (ipu_plane->dp_flow) {
> @@ -446,7 +394,30 @@ static void ipu_plane_atomic_update(struct drm_plane *plane,
>         ipu_cpmem_set_high_priority(ipu_plane->ipu_ch);
>         ipu_idmac_set_double_buffer(ipu_plane->ipu_ch, 1);
>         ipu_cpmem_set_stride(ipu_plane->ipu_ch, state->fb->pitches[0]);
> -       ipu_plane_atomic_set_base(ipu_plane);
> +       switch (fb->pixel_format) {
> +       case DRM_FORMAT_YUV420:
> +       case DRM_FORMAT_YVU420:
> +               ubo = drm_plane_state_to_ubo(state);
> +               vbo = drm_plane_state_to_vbo(state);
> +
> +               if (fb->pixel_format == DRM_FORMAT_YUV420)
> +                       ipu_cpmem_set_yuv_planar_full(ipu_plane->ipu_ch,
> +                                                     fb->pitches[1], ubo, vbo);
> +               else
> +                       ipu_cpmem_set_yuv_planar_full(ipu_plane->ipu_ch,
> +                                                     fb->pitches[1], vbo, ubo);
> +
> +               dev_dbg(ipu_plane->base.dev->dev,
> +                       "phy = %lu %lu %lu, x = %d, y = %d", eba, ubo, vbo,
> +                       state->src_x >> 16, state->src_y >> 16);
> +               break;
> +       default:
> +               dev_dbg(ipu_plane->base.dev->dev, "phys = %lu, x = %d, y = %d",
> +                       eba, state->src_x >> 16, state->src_y >> 16);
> +               break;
> +       }
> +       ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 0, eba);
> +       ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 1, eba);
>         ipu_plane_enable(ipu_plane);
>  }
>
> --
> 2.9.3
>
diff mbox

Patch

diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c
index f217444..70fd55d 100644
--- a/drivers/gpu/drm/imx/ipuv3-plane.c
+++ b/drivers/gpu/drm/imx/ipuv3-plane.c
@@ -103,62 +103,6 @@  drm_plane_state_to_vbo(struct drm_plane_state *state)
 	       (state->src_x >> 16) / 2 - eba;
 }
 
-static void ipu_plane_atomic_set_base(struct ipu_plane *ipu_plane)
-{
-	struct drm_plane *plane = &ipu_plane->base;
-	struct drm_plane_state *state = plane->state;
-	struct drm_crtc_state *crtc_state = state->crtc->state;
-	struct drm_framebuffer *fb = state->fb;
-	unsigned long eba, ubo, vbo;
-	int active;
-
-	eba = drm_plane_state_to_eba(state);
-
-	switch (fb->pixel_format) {
-	case DRM_FORMAT_YUV420:
-	case DRM_FORMAT_YVU420:
-		if (!drm_atomic_crtc_needs_modeset(crtc_state))
-			break;
-
-		/*
-		 * Multiplanar formats have to meet the following restrictions:
-		 * - The (up to) three plane addresses are EBA, EBA+UBO, EBA+VBO
-		 * - EBA, UBO and VBO are a multiple of 8
-		 * - UBO and VBO are unsigned and not larger than 0xfffff8
-		 * - Only EBA may be changed while scanout is active
-		 * - The strides of U and V planes must be identical.
-		 */
-		ubo = drm_plane_state_to_ubo(state);
-		vbo = drm_plane_state_to_vbo(state);
-
-		if (fb->pixel_format == DRM_FORMAT_YUV420)
-			ipu_cpmem_set_yuv_planar_full(ipu_plane->ipu_ch,
-						      fb->pitches[1], ubo, vbo);
-		else
-			ipu_cpmem_set_yuv_planar_full(ipu_plane->ipu_ch,
-						      fb->pitches[1], vbo, ubo);
-
-		dev_dbg(ipu_plane->base.dev->dev,
-			"phy = %lu %lu %lu, x = %d, y = %d", eba, ubo, vbo,
-			state->src_x >> 16, state->src_y >> 16);
-		break;
-	default:
-		dev_dbg(ipu_plane->base.dev->dev, "phys = %lu, x = %d, y = %d",
-			eba, state->src_x >> 16, state->src_y >> 16);
-
-		break;
-	}
-
-	if (!drm_atomic_crtc_needs_modeset(crtc_state)) {
-		active = ipu_idmac_get_current_buffer(ipu_plane->ipu_ch);
-		ipu_cpmem_set_buffer(ipu_plane->ipu_ch, !active, eba);
-		ipu_idmac_select_buffer(ipu_plane->ipu_ch, !active);
-	} else {
-		ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 0, eba);
-		ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 1, eba);
-	}
-}
-
 void ipu_plane_put_resources(struct ipu_plane *ipu_plane)
 {
 	if (!IS_ERR_OR_NULL(ipu_plane->dp))
@@ -394,15 +338,19 @@  static void ipu_plane_atomic_update(struct drm_plane *plane,
 {
 	struct ipu_plane *ipu_plane = to_ipu_plane(plane);
 	struct drm_plane_state *state = plane->state;
+	struct drm_crtc_state *crtc_state = state->crtc->state;
+	struct drm_framebuffer *fb = state->fb;
+	unsigned long eba, ubo, vbo;
 	enum ipu_color_space ics;
+	int active;
 
-	if (old_state->fb) {
-		struct drm_crtc_state *crtc_state = state->crtc->state;
+	eba = drm_plane_state_to_eba(state);
 
-		if (!drm_atomic_crtc_needs_modeset(crtc_state)) {
-			ipu_plane_atomic_set_base(ipu_plane);
-			return;
-		}
+	if (old_state->fb && !drm_atomic_crtc_needs_modeset(crtc_state)) {
+		active = ipu_idmac_get_current_buffer(ipu_plane->ipu_ch);
+		ipu_cpmem_set_buffer(ipu_plane->ipu_ch, !active, eba);
+		ipu_idmac_select_buffer(ipu_plane->ipu_ch, !active);
+		return;
 	}
 
 	switch (ipu_plane->dp_flow) {
@@ -446,7 +394,30 @@  static void ipu_plane_atomic_update(struct drm_plane *plane,
 	ipu_cpmem_set_high_priority(ipu_plane->ipu_ch);
 	ipu_idmac_set_double_buffer(ipu_plane->ipu_ch, 1);
 	ipu_cpmem_set_stride(ipu_plane->ipu_ch, state->fb->pitches[0]);
-	ipu_plane_atomic_set_base(ipu_plane);
+	switch (fb->pixel_format) {
+	case DRM_FORMAT_YUV420:
+	case DRM_FORMAT_YVU420:
+		ubo = drm_plane_state_to_ubo(state);
+		vbo = drm_plane_state_to_vbo(state);
+
+		if (fb->pixel_format == DRM_FORMAT_YUV420)
+			ipu_cpmem_set_yuv_planar_full(ipu_plane->ipu_ch,
+						      fb->pitches[1], ubo, vbo);
+		else
+			ipu_cpmem_set_yuv_planar_full(ipu_plane->ipu_ch,
+						      fb->pitches[1], vbo, ubo);
+
+		dev_dbg(ipu_plane->base.dev->dev,
+			"phy = %lu %lu %lu, x = %d, y = %d", eba, ubo, vbo,
+			state->src_x >> 16, state->src_y >> 16);
+		break;
+	default:
+		dev_dbg(ipu_plane->base.dev->dev, "phys = %lu, x = %d, y = %d",
+			eba, state->src_x >> 16, state->src_y >> 16);
+		break;
+	}
+	ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 0, eba);
+	ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 1, eba);
 	ipu_plane_enable(ipu_plane);
 }