[PATCH 4/9] drm/imx: ipuv3-plane: merge ipu_plane_atomic_set_base into atomic_update
Ying Liu
gnuiyl at gmail.com
Wed Oct 19 07:20:01 UTC 2016
On Wed, Oct 19, 2016 at 12:07 AM, Philipp Zabel <p.zabel at 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 at pengutronix.de>
Acked-by: Liu Ying <gnuiyl at 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
>
More information about the dri-devel
mailing list