On 2015년 09월 02일 05:35, Gustavo Padovan wrote: > 2015-09-01 Joonyoung Shim <jy0922.shim@xxxxxxxxxxx>: > >> This modifies exynos_drm_framebuffer_init() to be possible to support >> multiple buffers. Then it can be used by exynos_user_fb_create(). >> >> Signed-off-by: Joonyoung Shim <jy0922.shim@xxxxxxxxxxx> >> --- >> drivers/gpu/drm/exynos/exynos_drm_fb.c | 36 +++++++++++++++++-------------- >> drivers/gpu/drm/exynos/exynos_drm_fb.h | 5 ++++- >> drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 3 +-- >> 3 files changed, 25 insertions(+), 19 deletions(-) >> >> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c >> index 5cee148..8e5d3eb 100644 >> --- a/drivers/gpu/drm/exynos/exynos_drm_fb.c >> +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c >> @@ -23,7 +23,6 @@ >> #include "exynos_drm_drv.h" >> #include "exynos_drm_fb.h" >> #include "exynos_drm_fbdev.h" >> -#include "exynos_drm_gem.h" >> #include "exynos_drm_iommu.h" >> #include "exynos_drm_crtc.h" >> >> @@ -134,36 +133,41 @@ unsigned int exynos_drm_fb_get_buf_cnt(struct drm_framebuffer *fb) >> struct drm_framebuffer * >> exynos_drm_framebuffer_init(struct drm_device *dev, >> struct drm_mode_fb_cmd2 *mode_cmd, >> - struct drm_gem_object *obj) >> + struct exynos_drm_gem_obj **gem_obj, >> + int count) >> { >> struct exynos_drm_fb *exynos_fb; >> - struct exynos_drm_gem_obj *exynos_gem_obj; >> + int i; >> int ret; >> >> - exynos_gem_obj = to_exynos_gem_obj(obj); >> - >> - ret = check_fb_gem_memory_type(dev, exynos_gem_obj); >> - if (ret < 0) >> - return ERR_PTR(ret); >> - >> exynos_fb = kzalloc(sizeof(*exynos_fb), GFP_KERNEL); >> if (!exynos_fb) >> return ERR_PTR(-ENOMEM); >> >> - drm_helper_mode_fill_fb_struct(&exynos_fb->fb, mode_cmd); >> - exynos_fb->exynos_gem_obj[0] = exynos_gem_obj; >> + exynos_fb->buf_cnt = count; >> + DRM_DEBUG_KMS("buf_cnt = %d\n", exynos_fb->buf_cnt); >> >> - /* buffer count to framebuffer always is 1 at booting time. */ >> - exynos_fb->buf_cnt = 1; >> + for (i = 0; i < count; i++) { >> + ret = check_fb_gem_memory_type(dev, gem_obj[i]); >> + if (ret < 0) >> + goto err; >> + >> + exynos_fb->exynos_gem_obj[i] = gem_obj[i]; >> + } >> + >> + drm_helper_mode_fill_fb_struct(&exynos_fb->fb, mode_cmd); >> >> ret = drm_framebuffer_init(dev, &exynos_fb->fb, &exynos_drm_fb_funcs); >> - if (ret) { >> - kfree(exynos_fb); >> + if (ret < 0) { >> DRM_ERROR("failed to initialize framebuffer\n"); >> - return ERR_PTR(ret); >> + goto err; >> } >> >> return &exynos_fb->fb; >> + >> +err: >> + kfree(exynos_fb); >> + return ERR_PTR(ret); >> } >> >> static struct drm_framebuffer * >> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.h b/drivers/gpu/drm/exynos/exynos_drm_fb.h >> index 897d2cf..8900f6b 100644 >> --- a/drivers/gpu/drm/exynos/exynos_drm_fb.h >> +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.h >> @@ -14,10 +14,13 @@ >> #ifndef _EXYNOS_DRM_FB_H_ >> #define _EXYNOS_DRM_FB_H >> >> +#include "exynos_drm_gem.h" >> + >> struct drm_framebuffer * >> exynos_drm_framebuffer_init(struct drm_device *dev, >> struct drm_mode_fb_cmd2 *mode_cmd, >> - struct drm_gem_object *obj); >> + struct exynos_drm_gem_obj **gem_obj, >> + int count); >> >> /* get gem object of a drm framebuffer */ >> struct exynos_drm_gem_obj *exynos_drm_fb_gem_obj(struct drm_framebuffer *fb, >> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c >> index 133cf5f..a221f75 100644 >> --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c >> +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c >> @@ -21,7 +21,6 @@ >> #include "exynos_drm_drv.h" >> #include "exynos_drm_fb.h" >> #include "exynos_drm_fbdev.h" >> -#include "exynos_drm_gem.h" >> #include "exynos_drm_iommu.h" >> >> #define MAX_CONNECTOR 4 >> @@ -160,7 +159,7 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper, >> >> exynos_fbdev->obj = obj; >> >> - helper->fb = exynos_drm_framebuffer_init(dev, &mode_cmd, &obj->base); >> + helper->fb = exynos_drm_framebuffer_init(dev, &mode_cmd, &obj, 1); > > Do you have any use for this for multiple buffers? I don't see any patch > in this series for multiple buffers. I think we should wait for a user > of multiple buffers to apply this patch. Exynos4412 SoC has a video processor which can handle YCbCr - NV12 and NV21 - image, and the image is transferred to Digital TV through HDMI controller. NV12 and NV21 have 2 plane buffers and the video processor is controlled by Exynos drm driver. So reasonable and looks good to me. Thanks, Inki Dae > > Gustavo > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/dri-devel > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel