drm/exynos: make overlay data to be updated to valid hw
Inki Dae
inki.dae at samsung.com
Tue May 28 06:44:39 PDT 2013
2013/5/28 Inki Dae <inki.dae at samsung.com>
> This patch makes sure that overlay data are updated
> to real hardware enabled when framebuffer is released.
> For this, this patch checks if crtc and encoder are
> valid or not, and then makes it waiting for signal
> synchroniztion to only valid encoder.
>
> Signed-off-by: Inki Dae <inki.dae at samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>
> ---
> drivers/gpu/drm/exynos/exynos_drm_encoder.c | 9 ++++++---
> drivers/gpu/drm/exynos/exynos_drm_encoder.h | 2 +-
> drivers/gpu/drm/exynos/exynos_drm_fb.c | 13 +++++++++++--
> 3 files changed, 18 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c
> b/drivers/gpu/drm/exynos/exynos_drm_encoder.c
> index c63721f..9a6e3fd 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c
> @@ -220,18 +220,21 @@ static void exynos_drm_encoder_commit(struct
> drm_encoder *encoder)
> exynos_encoder->dpms = DRM_MODE_DPMS_ON;
> }
>
> -void exynos_drm_encoder_complete_scanout(struct drm_framebuffer *fb)
> +void exynos_drm_encoder_complete_scanout(struct drm_crtc *crtc)
> {
> struct exynos_drm_encoder *exynos_encoder;
> struct exynos_drm_manager_ops *ops;
> - struct drm_device *dev = fb->dev;
> + struct drm_device *dev = crtc->dev;
> struct drm_encoder *encoder;
>
> /*
> * make sure that overlay data are updated to real hardware
> - * for all encoders.
> + * for valid encoders.
> */
> list_for_each_entry(encoder, &dev->mode_config.encoder_list, head)
> {
> + if (encoder->crtc != crtc)
> + continue;
> +
> exynos_encoder = to_exynos_encoder(encoder);
> ops = exynos_encoder->manager->ops;
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.h
> b/drivers/gpu/drm/exynos/exynos_drm_encoder.h
> index 89e2fb0..e8dee1c 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.h
> +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.h
> @@ -32,6 +32,6 @@ void exynos_drm_encoder_plane_mode_set(struct
> drm_encoder *encoder, void *data);
> void exynos_drm_encoder_plane_commit(struct drm_encoder *encoder, void
> *data);
> void exynos_drm_encoder_plane_enable(struct drm_encoder *encoder, void
> *data);
> void exynos_drm_encoder_plane_disable(struct drm_encoder *encoder, void
> *data);
> -void exynos_drm_encoder_complete_scanout(struct drm_framebuffer *fb);
> +void exynos_drm_encoder_complete_scanout(struct drm_crtc *crtc);
>
> #endif
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c
> b/drivers/gpu/drm/exynos/exynos_drm_fb.c
> index 0e04f4e..1fc7ae6 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fb.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c
> @@ -68,12 +68,21 @@ static int check_fb_gem_memory_type(struct drm_device
> *drm_dev,
> static void exynos_drm_fb_destroy(struct drm_framebuffer *fb)
> {
> struct exynos_drm_fb *exynos_fb = to_exynos_fb(fb);
> + struct drm_device *dev = fb->dev;
> + struct drm_crtc *crtc;
> unsigned int i;
>
> DRM_DEBUG_KMS("%s\n", __FILE__);
>
> - /* make sure that overlay data are updated before relesing fb. */
> - exynos_drm_encoder_complete_scanout(fb);
> + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
> + if (crtc->fb == fb) {
>
Sorry, crtc->fb could be new fb so in this case, this condition will always
be failed. This patch will be posted again after fixed.
Thanks,
Inki Dae
+ /*
> + * make sure that overlay data are updated before
> + * relesing fb.
> + */
> + exynos_drm_encoder_complete_scanout(crtc);
> + }
> + }
>
> drm_framebuffer_cleanup(fb);
>
> --
> 1.7.5.4
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/dri-devel/attachments/20130528/b5949fc2/attachment.html>
More information about the dri-devel
mailing list