From: Joonyoung Shim <jy0922.shim@samsung.com>
To: InKi Dae <inki.dae@samsung.com>
Cc: kyungmin.park@samsung.com, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 09/13] drm/exynos: check NV12M format specific to Exynos properly
Date: Mon, 20 Aug 2012 13:52:54 +0900 [thread overview]
Message-ID: <5031C2A6.5090105@samsung.com> (raw)
In-Reply-To: <CAAQKjZOMoQanRKQ210HJNuQArbdR5JH-MTWBnA+nHFgcezqyOw@mail.gmail.com>
On 08/20/2012 11:23 AM, InKi Dae wrote:
> 2012/8/20 Joonyoung Shim <jy0922.shim@samsung.com>:
>> On 08/17/2012 06:50 PM, Inki Dae wrote:
>>> this patch adds buf_cnt variable in exynos_drm_fb structure and
>>> that means a buffer count to drm framebuffer and also adds two
>>> functions to get/set the buffer count from/to exynos_drm_fb structure.
>>> if pixel format is not DRM_FORMAT_NV12MT then it gets a buffer count
>>> to drm framebuffer refering to mode_cmd->handles and offsets.
>>> but when booted, the buffer count will always be 1 because pixel
>>> format of console framebuffer is RGB format.
>>>
>>> Signed-off-by: Inki Dae <inki.dae@samsung.com>
>>> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
>>> ---
>>> drivers/gpu/drm/exynos/exynos_drm_fb.c | 65
>>> +++++++++++++++++++++++++++-
>>> drivers/gpu/drm/exynos/exynos_drm_fb.h | 20 +++------
>>> drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 3 +
>>> drivers/gpu/drm/exynos/exynos_drm_plane.c | 2 +-
>>> 4 files changed, 73 insertions(+), 17 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c
>>> b/drivers/gpu/drm/exynos/exynos_drm_fb.c
>>> index 4ccfe43..2d1bc3a 100644
>>> --- a/drivers/gpu/drm/exynos/exynos_drm_fb.c
>>> +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c
>>> @@ -41,10 +41,12 @@
>>> * exynos specific framebuffer structure.
>>> *
>>> * @fb: drm framebuffer obejct.
>>> + * @buf_cnt: a buffer count to drm framebuffer.
>>> * @exynos_gem_obj: array of exynos specific gem object containing a gem
>>> object.
>>> */
>>> struct exynos_drm_fb {
>>> struct drm_framebuffer fb;
>>> + unsigned int buf_cnt;
>>> struct exynos_drm_gem_obj *exynos_gem_obj[MAX_FB_BUFFER];
>>> };
>>> @@ -101,6 +103,25 @@ static struct drm_framebuffer_funcs
>>> exynos_drm_fb_funcs = {
>>> .dirty = exynos_drm_fb_dirty,
>>> };
>>> +void exynos_drm_fb_set_buf_cnt(struct drm_framebuffer *fb,
>>> + unsigned int cnt)
>>> +{
>>> + struct exynos_drm_fb *exynos_fb;
>>> +
>>> + exynos_fb = to_exynos_fb(fb);
>>> +
>>> + exynos_fb->buf_cnt = cnt;
>>> +}
>>> +
>>> +unsigned int exynos_drm_fb_get_buf_cnt(struct drm_framebuffer *fb)
>>> +{
>>> + struct exynos_drm_fb *exynos_fb;
>>> +
>>> + exynos_fb = to_exynos_fb(fb);
>>> +
>>> + return exynos_fb->buf_cnt;
>>> +}
>>> +
>>> struct drm_framebuffer *
>>> exynos_drm_framebuffer_init(struct drm_device *dev,
>>> struct drm_mode_fb_cmd2 *mode_cmd,
>>> @@ -127,6 +148,43 @@ exynos_drm_framebuffer_init(struct drm_device *dev,
>>> return &exynos_fb->fb;
>>> }
>>> +static u32 exynos_drm_format_num_buffers(struct drm_mode_fb_cmd2
>>> *mode_cmd)
>>> +{
>>> + unsigned int cnt = 0;
>>> +
>>> + if (mode_cmd->pixel_format == DRM_FORMAT_NV12MT)
>>> + return 2;
>>> +
>>> + while (cnt != MAX_FB_BUFFER) {
>>> + if (!mode_cmd->handles[cnt])
>>> + break;
>>> + cnt++;
>>> + }
>>> +
>>> + /*
>>> + * check if NV12 or NV12M.
>>> + *
>>> + * NV12
>>> + * handles[0] = base1, offsets[0] = 0
>>> + * handles[1] = base1, offsets[1] = Y_size
>>> + *
>>> + * NV12M
>>> + * handles[0] = base1, offsets[0] = 0
>>> + * handles[1] = base2, offsets[1] = 0
>>> + */
>>> + if (cnt == 2) {
>>> + /*
>>> + * in case of NV12 format, offsets[1] is not 0 and
>>> + * handles[0] is same as handles[1].
>>> + */
>>> + if (mode_cmd->offsets[1] &&
>>> + mode_cmd->handles[0] == mode_cmd->handles[1])
>>> + cnt = 1;
>>> + }
>>> +
>>> + return cnt;
>>> +}
>>
>> No, please don't add specific function. There is already
>> drm_format_num_planes() function
>>
>>
> I know that, but NV12M format is specific to Exynos. for this, we
> already had a discussion and you can refer to below link,
> http://web.archiveorange.com/archive/v/hhSc5JAv767vo7fKZLPf
Yes, but this implementation is not clear, just get plane number using
drm_format_num_planes()
and check handle and offset argument when format is NV12.
>>> +
>>> static struct drm_framebuffer *
>>> exynos_user_fb_create(struct drm_device *dev, struct drm_file
>>> *file_priv,
>>> struct drm_mode_fb_cmd2 *mode_cmd)
>>> @@ -134,7 +192,6 @@ exynos_user_fb_create(struct drm_device *dev, struct
>>> drm_file *file_priv,
>>> struct drm_gem_object *obj;
>>> struct drm_framebuffer *fb;
>>> struct exynos_drm_fb *exynos_fb;
>>> - int nr;
>>> int i;
>>> DRM_DEBUG_KMS("%s\n", __FILE__);
>>> @@ -152,9 +209,11 @@ exynos_user_fb_create(struct drm_device *dev, struct
>>> drm_file *file_priv,
>>> }
>>> exynos_fb = to_exynos_fb(fb);
>>> - nr = exynos_drm_format_num_buffers(fb->pixel_format);
>>> + exynos_fb->buf_cnt = exynos_drm_format_num_buffers(mode_cmd);
>>> +
>>> + DRM_DEBUG_KMS("buf_cnt = %d\n", exynos_fb->buf_cnt);
>>> - for (i = 1; i < nr; i++) {
>>> + for (i = 1; i < exynos_fb->buf_cnt; i++) {
>>> obj = drm_gem_object_lookup(dev, file_priv,
>>> mode_cmd->handles[i]);
>>> if (!obj) {
>>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.h
>>> b/drivers/gpu/drm/exynos/exynos_drm_fb.h
>>> index 5082375..96262e5 100644
>>> --- a/drivers/gpu/drm/exynos/exynos_drm_fb.h
>>> +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.h
>>> @@ -28,19 +28,6 @@
>>> #ifndef _EXYNOS_DRM_FB_H_
>>> #define _EXYNOS_DRM_FB_H
>>> -static inline int exynos_drm_format_num_buffers(uint32_t format)
>>> -{
>>> - switch (format) {
>>> - case DRM_FORMAT_NV12:
>>> - case DRM_FORMAT_NV12MT:
>>> - return 2;
>>> - case DRM_FORMAT_YUV420:
>>> - return 3;
>>> - default:
>>> - return 1;
>>> - }
>>> -}
>>> -
>>> struct drm_framebuffer *
>>> exynos_drm_framebuffer_init(struct drm_device *dev,
>>> struct drm_mode_fb_cmd2 *mode_cmd,
>>> @@ -52,4 +39,11 @@ struct exynos_drm_gem_buf *exynos_drm_fb_buffer(struct
>>> drm_framebuffer *fb,
>>> void exynos_drm_mode_config_init(struct drm_device *dev);
>>> +/* set a buffer count to drm framebuffer. */
>>> +void exynos_drm_fb_set_buf_cnt(struct drm_framebuffer *fb,
>>> + unsigned int cnt);
>>> +
>>> +/* get a buffer count to drm framebuffer. */
>>> +unsigned int exynos_drm_fb_get_buf_cnt(struct drm_framebuffer *fb);
>>> +
>>> #endif
>>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
>>> b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
>>> index d5586cc..5b125fe 100644
>>> --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
>>> +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
>>> @@ -79,6 +79,9 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper
>>> *helper,
>>> return -EFAULT;
>>> }
>>> + /* buffer count to framebuffer always is 1 at booting time. */
>>> + exynos_drm_fb_set_buf_cnt(fb, 1);
>>> +
>>> offset = fbi->var.xoffset * (fb->bits_per_pixel >> 3);
>>> offset += fbi->var.yoffset * fb->pitches[0];
>>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_plane.c
>>> b/drivers/gpu/drm/exynos/exynos_drm_plane.c
>>> index b89829e..777e142 100644
>>> --- a/drivers/gpu/drm/exynos/exynos_drm_plane.c
>>> +++ b/drivers/gpu/drm/exynos/exynos_drm_plane.c
>>> @@ -48,7 +48,7 @@ int exynos_plane_mode_set(struct drm_plane *plane,
>>> struct drm_crtc *crtc,
>>> DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
>>> - nr = exynos_drm_format_num_buffers(fb->pixel_format);
>>> + nr = exynos_drm_fb_get_buf_cnt(fb);
>>> for (i = 0; i < nr; i++) {
>>> struct exynos_drm_gem_buf *buffer =
>>> exynos_drm_fb_buffer(fb, i);
>>>
>>
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel@lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2012-08-20 4:52 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-17 9:50 [PATCH 00/13] updated exynos-drm-fixes Inki Dae
2012-08-17 9:50 ` [PATCH 01/13] drm/exynos: added device object to subdrv's remove callback as argument Inki Dae
2012-08-17 9:50 ` [PATCH 02/13] drm/exynos: separated subdrv->probe call and encoder/connector creation Inki Dae
2012-08-20 1:11 ` Joonyoung Shim
2012-08-20 1:52 ` InKi Dae
2012-08-20 1:59 ` Joonyoung Shim
2012-08-20 4:31 ` InKi Dae
2012-08-20 4:42 ` Joonyoung Shim
2012-08-20 5:43 ` InKi Dae
2012-08-17 9:50 ` [PATCH 03/13] drm/exynos: fixed page align bug Inki Dae
2012-08-17 9:50 ` [PATCH 04/13] drm/exynos: use empty function instead of drm_helper_connector_dpms Inki Dae
2012-08-20 1:12 ` Joonyoung Shim
2012-08-20 2:50 ` InKi Dae
2012-08-17 9:50 ` [PATCH 05/13] drm/exynos: removed exynos_drm_encoder_dpms call Inki Dae
2012-08-20 1:14 ` Joonyoung Shim
2012-08-20 2:00 ` InKi Dae
2012-08-17 9:50 ` [PATCH 06/13] drm/exynos: separeated fimd_power_on into some parts Inki Dae
2012-08-17 9:50 ` [PATCH 07/13] drm/exynos: control display power at connector module Inki Dae
2012-08-17 9:50 ` [PATCH 08/13] drm/exynos: make sure that hardware overlay for fimd is disabled Inki Dae
2012-08-20 2:09 ` Joonyoung Shim
2012-08-17 9:50 ` [PATCH 09/13] drm/exynos: check NV12M format specific to Exynos properly Inki Dae
2012-08-20 1:17 ` Joonyoung Shim
2012-08-20 2:23 ` InKi Dae
2012-08-20 4:52 ` Joonyoung Shim [this message]
2012-08-20 5:11 ` InKi Dae
2012-08-20 5:15 ` InKi Dae
2012-08-20 5:22 ` Joonyoung Shim
2012-08-20 5:45 ` InKi Dae
2012-08-17 9:50 ` [PATCH 10/13] drm/exynos: update crtc to plane safely Inki Dae
2012-08-20 1:25 ` Joonyoung Shim
2012-08-17 9:50 ` [PATCH 11/13] drm/exynos: changed context name of hdmi and mixer Inki Dae
2012-08-20 1:27 ` Joonyoung Shim
2012-08-20 2:29 ` InKi Dae
2012-08-20 4:55 ` Joonyoung Shim
2012-08-20 6:17 ` InKi Dae
2012-08-20 6:36 ` Joonyoung Shim
2012-08-20 6:51 ` InKi Dae
2012-08-20 7:30 ` InKi Dae
2012-08-17 9:50 ` [PATCH 12/13] drm/exynos: fixed build warning Inki Dae
2012-08-17 9:50 ` [PATCH 13/13] drm/exynos: make sure that hardware overlay for hdmi is disabled Inki Dae
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5031C2A6.5090105@samsung.com \
--to=jy0922.shim@samsung.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=inki.dae@samsung.com \
--cc=kyungmin.park@samsung.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.