[PATCH] drm/exynos: move finish page flip to a common place

Inki Dae inki.dae at samsung.com
Sun Jan 6 21:01:18 PST 2013


Applied.

Thanks,
Inki Dae

2013/1/3 Rahul Sharma <rahul.sharma at samsung.com>:
> This patch implements the exynos_drm_crtc_finish_pageflip in
> exynos_drm_crtc.c. This avoids the duplication of same code
> in mixer, fimd and vidi.
>
> Signed-off-by: Rahul Sharma <rahul.sharma at samsung.com>
> Signed-off-by: Stephane Marchesin <marcheu at chromium.org>
> ---
> This patch is based on branch "exynos-drm-next" at
> http://git.kernel.org/?p=linux/kernel/git/daeinki/drm-exynos.git
>
>  drivers/gpu/drm/exynos/exynos_drm_crtc.c | 30 +++++++++++++++++++++++++++++
>  drivers/gpu/drm/exynos/exynos_drm_crtc.h |  1 +
>  drivers/gpu/drm/exynos/exynos_drm_fimd.c | 30 +----------------------------
>  drivers/gpu/drm/exynos/exynos_drm_vidi.c | 30 +----------------------------
>  drivers/gpu/drm/exynos/exynos_mixer.c    | 33 +++-----------------------------
>  5 files changed, 36 insertions(+), 88 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> index d59a03a..e8894bc 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> @@ -393,3 +393,33 @@ void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc)
>         exynos_drm_fn_encoder(private->crtc[crtc], &crtc,
>                         exynos_drm_disable_vblank);
>  }
> +
> +void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int crtc)
> +{
> +       struct exynos_drm_private *dev_priv = dev->dev_private;
> +       struct drm_pending_vblank_event *e, *t;
> +       struct timeval now;
> +       unsigned long flags;
> +
> +       DRM_DEBUG_KMS("%s\n", __FILE__);
> +
> +       spin_lock_irqsave(&dev->event_lock, flags);
> +
> +       list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
> +                       base.link) {
> +               /* if event's pipe isn't same as crtc then ignore it. */
> +               if (crtc != e->pipe)
> +                       continue;
> +
> +               do_gettimeofday(&now);
> +               e->event.sequence = 0;
> +               e->event.tv_sec = now.tv_sec;
> +               e->event.tv_usec = now.tv_usec;
> +
> +               list_move_tail(&e->base.link, &e->base.file_priv->event_list);
> +               wake_up_interruptible(&e->base.file_priv->event_wait);
> +               drm_vblank_put(dev, crtc);
> +       }
> +
> +       spin_unlock_irqrestore(&dev->event_lock, flags);
> +}
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.h b/drivers/gpu/drm/exynos/exynos_drm_crtc.h
> index 8ac3969..3e197e6 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.h
> +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.h
> @@ -18,5 +18,6 @@
>  int exynos_drm_crtc_create(struct drm_device *dev, unsigned int nr);
>  int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int crtc);
>  void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc);
> +void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int crtc);
>
>  #endif
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> index bf0d9ba..6dda825 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> @@ -663,34 +663,6 @@ static struct exynos_drm_manager fimd_manager = {
>         .display_ops    = &fimd_display_ops,
>  };
>
> -static void fimd_finish_pageflip(struct drm_device *drm_dev, int crtc)
> -{
> -       struct exynos_drm_private *dev_priv = drm_dev->dev_private;
> -       struct drm_pending_vblank_event *e, *t;
> -       struct timeval now;
> -       unsigned long flags;
> -
> -       spin_lock_irqsave(&drm_dev->event_lock, flags);
> -
> -       list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
> -                       base.link) {
> -               /* if event's pipe isn't same as crtc then ignore it. */
> -               if (crtc != e->pipe)
> -                       continue;
> -
> -               do_gettimeofday(&now);
> -               e->event.sequence = 0;
> -               e->event.tv_sec = now.tv_sec;
> -               e->event.tv_usec = now.tv_usec;
> -
> -               list_move_tail(&e->base.link, &e->base.file_priv->event_list);
> -               wake_up_interruptible(&e->base.file_priv->event_wait);
> -               drm_vblank_put(drm_dev, crtc);
> -       }
> -
> -       spin_unlock_irqrestore(&drm_dev->event_lock, flags);
> -}
> -
>  static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
>  {
>         struct fimd_context *ctx = (struct fimd_context *)dev_id;
> @@ -710,7 +682,7 @@ static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
>                 goto out;
>
>         drm_handle_vblank(drm_dev, manager->pipe);
> -       fimd_finish_pageflip(drm_dev, manager->pipe);
> +       exynos_drm_crtc_finish_pageflip(drm_dev, manager->pipe);
>
>         /* set wait vsync event to zero and wake up queue. */
>         if (atomic_read(&ctx->wait_vsync_event)) {
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
> index 3260035..b192308 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
> @@ -379,34 +379,6 @@ static struct exynos_drm_manager vidi_manager = {
>         .display_ops    = &vidi_display_ops,
>  };
>
> -static void vidi_finish_pageflip(struct drm_device *drm_dev, int crtc)
> -{
> -       struct exynos_drm_private *dev_priv = drm_dev->dev_private;
> -       struct drm_pending_vblank_event *e, *t;
> -       struct timeval now;
> -       unsigned long flags;
> -
> -       spin_lock_irqsave(&drm_dev->event_lock, flags);
> -
> -       list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
> -                       base.link) {
> -               /* if event's pipe isn't same as crtc then ignore it. */
> -               if (crtc != e->pipe)
> -                       continue;
> -
> -               do_gettimeofday(&now);
> -               e->event.sequence = 0;
> -               e->event.tv_sec = now.tv_sec;
> -               e->event.tv_usec = now.tv_usec;
> -
> -               list_move_tail(&e->base.link, &e->base.file_priv->event_list);
> -               wake_up_interruptible(&e->base.file_priv->event_wait);
> -               drm_vblank_put(drm_dev, crtc);
> -       }
> -
> -       spin_unlock_irqrestore(&drm_dev->event_lock, flags);
> -}
> -
>  static void vidi_fake_vblank_handler(struct work_struct *work)
>  {
>         struct vidi_context *ctx = container_of(work, struct vidi_context,
> @@ -431,7 +403,7 @@ static void vidi_fake_vblank_handler(struct work_struct *work)
>
>         mutex_unlock(&ctx->lock);
>
> -       vidi_finish_pageflip(subdrv->drm_dev, manager->pipe);
> +       exynos_drm_crtc_finish_pageflip(subdrv->drm_dev, manager->pipe);
>  }
>
>  static int vidi_subdrv_probe(struct drm_device *drm_dev, struct device *dev)
> diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c
> index 21db895..e9dbf79 100644
> --- a/drivers/gpu/drm/exynos/exynos_mixer.c
> +++ b/drivers/gpu/drm/exynos/exynos_mixer.c
> @@ -35,6 +35,7 @@
>  #include <drm/exynos_drm.h>
>
>  #include "exynos_drm_drv.h"
> +#include "exynos_drm_crtc.h"
>  #include "exynos_drm_hdmi.h"
>  #include "exynos_drm_iommu.h"
>
> @@ -949,35 +950,6 @@ static struct exynos_mixer_ops mixer_ops = {
>         .win_disable            = mixer_win_disable,
>  };
>
> -/* for pageflip event */
> -static void mixer_finish_pageflip(struct drm_device *drm_dev, int crtc)
> -{
> -       struct exynos_drm_private *dev_priv = drm_dev->dev_private;
> -       struct drm_pending_vblank_event *e, *t;
> -       struct timeval now;
> -       unsigned long flags;
> -
> -       spin_lock_irqsave(&drm_dev->event_lock, flags);
> -
> -       list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
> -                       base.link) {
> -               /* if event's pipe isn't same as crtc then ignore it. */
> -               if (crtc != e->pipe)
> -                       continue;
> -
> -               do_gettimeofday(&now);
> -               e->event.sequence = 0;
> -               e->event.tv_sec = now.tv_sec;
> -               e->event.tv_usec = now.tv_usec;
> -
> -               list_move_tail(&e->base.link, &e->base.file_priv->event_list);
> -               wake_up_interruptible(&e->base.file_priv->event_wait);
> -               drm_vblank_put(drm_dev, crtc);
> -       }
> -
> -       spin_unlock_irqrestore(&drm_dev->event_lock, flags);
> -}
> -
>  static irqreturn_t mixer_irq_handler(int irq, void *arg)
>  {
>         struct exynos_drm_hdmi_context *drm_hdmi_ctx = arg;
> @@ -1006,7 +978,8 @@ static irqreturn_t mixer_irq_handler(int irq, void *arg)
>                 }
>
>                 drm_handle_vblank(drm_hdmi_ctx->drm_dev, ctx->pipe);
> -               mixer_finish_pageflip(drm_hdmi_ctx->drm_dev, ctx->pipe);
> +               exynos_drm_crtc_finish_pageflip(drm_hdmi_ctx->drm_dev,
> +                               ctx->pipe);
>
>                 /* set wait vsync event to zero and wake up queue. */
>                 if (atomic_read(&ctx->wait_vsync_event)) {
> --
> 1.8.0
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list