[PATCH v3] drm/exynos: add exynos drm specific fb_mmap function

2012-11-20 Thread Inki Dae
2012/11/19 Kyungmin Park 

> Hi,
>
> On 11/19/12, Prathyush K  wrote:
> > Changelog v3:
> >
> > Passing the actual buffer size instead of vm_size to dma_mmap_attrs.
> >
> > Changelog v2:
> >
> > Extracting the private data from fb_info structure to obtain the exynos
> > gem buffer structure. Now, dma address is obtained from the exynos gem
> > buffer structure and not from smem_start. Also calling dma_mmap_attrs
> > (instead of dma_mmap_writecombine) with the same attributes used
> > during allocation.
> >
> > Changelog v1:
> >
> > This patch adds a exynos drm specific implementation of fb_mmap
> > which supports mapping a non-contiguous buffer to user space.
> >
> > This new function does not assume that the frame buffer is contiguous
> > and calls dma_mmap_writecombine for mapping the buffer to user space.
> > dma_mmap_writecombine will be able to map a contiguous buffer as well
> > as non-contig buffer depending on whether an IOMMU mapping is created
> > for drm or not.
> >
> > Signed-off-by: Prathyush K 
> > ---
> >  drivers/gpu/drm/exynos/exynos_drm_fbdev.c |   30
> > +
> >  1 files changed, 30 insertions(+), 0 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> > b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> > index 67eb6ba..a6f8cc2 100644
> > --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> > +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> > @@ -46,8 +46,38 @@ struct exynos_drm_fbdev {
> >   struct exynos_drm_gem_obj   *exynos_gem_obj;
> >  };
> >
> > +static int exynos_drm_fb_mmap(struct fb_info *info,
> > + struct vm_area_struct *vma)
> > +{
> > + struct drm_fb_helper *helper = info->par;
> > + struct exynos_drm_fbdev *exynos_fbd = to_exynos_fbdev(helper);
> > + struct exynos_drm_gem_obj *exynos_gem_obj =
> exynos_fbd->exynos_gem_obj;
> > + struct exynos_drm_gem_buf *buffer = exynos_gem_obj->buffer;
> > + unsigned long vm_size;
> > + int ret;
> > +
> > + DRM_DEBUG_KMS("%s\n", __func__);
> > +
> > + vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP;
> How do you sure VM_MIXEDMAP is not required?
>

With iommu, VM_MIXEDMAP flag would be set internally.


> > +
> > + vm_size = vma->vm_end - vma->vm_start;
> > +
> > + if (vm_size > buffer->size)
> > + return -EINVAL;
> does it really happended?
>
>
vm_size is decided by user-mmap request so size to the vma area should be
checked.

Applied.

Thanks,
Inki Dae



> Thank you,
> Kyungmin Park
> > +
> > + ret = dma_mmap_attrs(helper->dev->dev, vma, buffer->kvaddr,
> > + buffer->dma_addr, buffer->size, &buffer->dma_attrs);
> > + if (ret < 0) {
> > + DRM_ERROR("failed to mmap.\n");
> > + return ret;
> > + }
> > +
> > + return 0;
> > +}
> > +
> >  static struct fb_ops exynos_drm_fb_ops = {
> >   .owner  = THIS_MODULE,
> > + .fb_mmap= exynos_drm_fb_mmap,
> >   .fb_fillrect= cfb_fillrect,
> >   .fb_copyarea= cfb_copyarea,
> >   .fb_imageblit   = cfb_imageblit,
> > --
> > 1.7.0.4
> >
> > ___
> > dri-devel mailing list
> > dri-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/dri-devel
> >
> ___
> 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: 



[PATCH v3] drm/exynos: add exynos drm specific fb_mmap function

2012-11-19 Thread Kyungmin Park
Hi,

On 11/19/12, Prathyush K  wrote:
> Changelog v3:
>
> Passing the actual buffer size instead of vm_size to dma_mmap_attrs.
>
> Changelog v2:
>
> Extracting the private data from fb_info structure to obtain the exynos
> gem buffer structure. Now, dma address is obtained from the exynos gem
> buffer structure and not from smem_start. Also calling dma_mmap_attrs
> (instead of dma_mmap_writecombine) with the same attributes used
> during allocation.
>
> Changelog v1:
>
> This patch adds a exynos drm specific implementation of fb_mmap
> which supports mapping a non-contiguous buffer to user space.
>
> This new function does not assume that the frame buffer is contiguous
> and calls dma_mmap_writecombine for mapping the buffer to user space.
> dma_mmap_writecombine will be able to map a contiguous buffer as well
> as non-contig buffer depending on whether an IOMMU mapping is created
> for drm or not.
>
> Signed-off-by: Prathyush K 
> ---
>  drivers/gpu/drm/exynos/exynos_drm_fbdev.c |   30
> +
>  1 files changed, 30 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> index 67eb6ba..a6f8cc2 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> @@ -46,8 +46,38 @@ struct exynos_drm_fbdev {
>   struct exynos_drm_gem_obj   *exynos_gem_obj;
>  };
>
> +static int exynos_drm_fb_mmap(struct fb_info *info,
> + struct vm_area_struct *vma)
> +{
> + struct drm_fb_helper *helper = info->par;
> + struct exynos_drm_fbdev *exynos_fbd = to_exynos_fbdev(helper);
> + struct exynos_drm_gem_obj *exynos_gem_obj = exynos_fbd->exynos_gem_obj;
> + struct exynos_drm_gem_buf *buffer = exynos_gem_obj->buffer;
> + unsigned long vm_size;
> + int ret;
> +
> + DRM_DEBUG_KMS("%s\n", __func__);
> +
> + vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP;
How do you sure VM_MIXEDMAP is not required?
> +
> + vm_size = vma->vm_end - vma->vm_start;
> +
> + if (vm_size > buffer->size)
> + return -EINVAL;
does it really happended?

Thank you,
Kyungmin Park
> +
> + ret = dma_mmap_attrs(helper->dev->dev, vma, buffer->kvaddr,
> + buffer->dma_addr, buffer->size, &buffer->dma_attrs);
> + if (ret < 0) {
> + DRM_ERROR("failed to mmap.\n");
> + return ret;
> + }
> +
> + return 0;
> +}
> +
>  static struct fb_ops exynos_drm_fb_ops = {
>   .owner  = THIS_MODULE,
> + .fb_mmap= exynos_drm_fb_mmap,
>   .fb_fillrect= cfb_fillrect,
>   .fb_copyarea= cfb_copyarea,
>   .fb_imageblit   = cfb_imageblit,
> --
> 1.7.0.4
>
> ___
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>


Re: [PATCH v3] drm/exynos: add exynos drm specific fb_mmap function

2012-11-19 Thread Inki Dae
2012/11/19 Kyungmin Park 

> Hi,
>
> On 11/19/12, Prathyush K  wrote:
> > Changelog v3:
> >
> > Passing the actual buffer size instead of vm_size to dma_mmap_attrs.
> >
> > Changelog v2:
> >
> > Extracting the private data from fb_info structure to obtain the exynos
> > gem buffer structure. Now, dma address is obtained from the exynos gem
> > buffer structure and not from smem_start. Also calling dma_mmap_attrs
> > (instead of dma_mmap_writecombine) with the same attributes used
> > during allocation.
> >
> > Changelog v1:
> >
> > This patch adds a exynos drm specific implementation of fb_mmap
> > which supports mapping a non-contiguous buffer to user space.
> >
> > This new function does not assume that the frame buffer is contiguous
> > and calls dma_mmap_writecombine for mapping the buffer to user space.
> > dma_mmap_writecombine will be able to map a contiguous buffer as well
> > as non-contig buffer depending on whether an IOMMU mapping is created
> > for drm or not.
> >
> > Signed-off-by: Prathyush K 
> > ---
> >  drivers/gpu/drm/exynos/exynos_drm_fbdev.c |   30
> > +
> >  1 files changed, 30 insertions(+), 0 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> > b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> > index 67eb6ba..a6f8cc2 100644
> > --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> > +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> > @@ -46,8 +46,38 @@ struct exynos_drm_fbdev {
> >   struct exynos_drm_gem_obj   *exynos_gem_obj;
> >  };
> >
> > +static int exynos_drm_fb_mmap(struct fb_info *info,
> > + struct vm_area_struct *vma)
> > +{
> > + struct drm_fb_helper *helper = info->par;
> > + struct exynos_drm_fbdev *exynos_fbd = to_exynos_fbdev(helper);
> > + struct exynos_drm_gem_obj *exynos_gem_obj =
> exynos_fbd->exynos_gem_obj;
> > + struct exynos_drm_gem_buf *buffer = exynos_gem_obj->buffer;
> > + unsigned long vm_size;
> > + int ret;
> > +
> > + DRM_DEBUG_KMS("%s\n", __func__);
> > +
> > + vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP;
> How do you sure VM_MIXEDMAP is not required?
>

With iommu, VM_MIXEDMAP flag would be set internally.


> > +
> > + vm_size = vma->vm_end - vma->vm_start;
> > +
> > + if (vm_size > buffer->size)
> > + return -EINVAL;
> does it really happended?
>
>
vm_size is decided by user-mmap request so size to the vma area should be
checked.

Applied.

Thanks,
Inki Dae



> Thank you,
> Kyungmin Park
> > +
> > + ret = dma_mmap_attrs(helper->dev->dev, vma, buffer->kvaddr,
> > + buffer->dma_addr, buffer->size, &buffer->dma_attrs);
> > + if (ret < 0) {
> > + DRM_ERROR("failed to mmap.\n");
> > + return ret;
> > + }
> > +
> > + return 0;
> > +}
> > +
> >  static struct fb_ops exynos_drm_fb_ops = {
> >   .owner  = THIS_MODULE,
> > + .fb_mmap= exynos_drm_fb_mmap,
> >   .fb_fillrect= cfb_fillrect,
> >   .fb_copyarea= cfb_copyarea,
> >   .fb_imageblit   = cfb_imageblit,
> > --
> > 1.7.0.4
> >
> > ___
> > dri-devel mailing list
> > dri-devel@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/dri-devel
> >
> ___
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3] drm/exynos: add exynos drm specific fb_mmap function

2012-11-19 Thread Prathyush K
Changelog v3:

Passing the actual buffer size instead of vm_size to dma_mmap_attrs.

Changelog v2:

Extracting the private data from fb_info structure to obtain the exynos
gem buffer structure. Now, dma address is obtained from the exynos gem
buffer structure and not from smem_start. Also calling dma_mmap_attrs
(instead of dma_mmap_writecombine) with the same attributes used
during allocation.

Changelog v1:

This patch adds a exynos drm specific implementation of fb_mmap
which supports mapping a non-contiguous buffer to user space.

This new function does not assume that the frame buffer is contiguous
and calls dma_mmap_writecombine for mapping the buffer to user space.
dma_mmap_writecombine will be able to map a contiguous buffer as well
as non-contig buffer depending on whether an IOMMU mapping is created
for drm or not.

Signed-off-by: Prathyush K 
---
 drivers/gpu/drm/exynos/exynos_drm_fbdev.c |   30 +
 1 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c 
b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
index 67eb6ba..a6f8cc2 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
@@ -46,8 +46,38 @@ struct exynos_drm_fbdev {
struct exynos_drm_gem_obj   *exynos_gem_obj;
 };

+static int exynos_drm_fb_mmap(struct fb_info *info,
+   struct vm_area_struct *vma)
+{
+   struct drm_fb_helper *helper = info->par;
+   struct exynos_drm_fbdev *exynos_fbd = to_exynos_fbdev(helper);
+   struct exynos_drm_gem_obj *exynos_gem_obj = exynos_fbd->exynos_gem_obj;
+   struct exynos_drm_gem_buf *buffer = exynos_gem_obj->buffer;
+   unsigned long vm_size;
+   int ret;
+
+   DRM_DEBUG_KMS("%s\n", __func__);
+
+   vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP;
+
+   vm_size = vma->vm_end - vma->vm_start;
+
+   if (vm_size > buffer->size)
+   return -EINVAL;
+
+   ret = dma_mmap_attrs(helper->dev->dev, vma, buffer->kvaddr,
+   buffer->dma_addr, buffer->size, &buffer->dma_attrs);
+   if (ret < 0) {
+   DRM_ERROR("failed to mmap.\n");
+   return ret;
+   }
+
+   return 0;
+}
+
 static struct fb_ops exynos_drm_fb_ops = {
.owner  = THIS_MODULE,
+   .fb_mmap= exynos_drm_fb_mmap,
.fb_fillrect= cfb_fillrect,
.fb_copyarea= cfb_copyarea,
.fb_imageblit   = cfb_imageblit,
-- 
1.7.0.4



Re: [PATCH v3] drm/exynos: add exynos drm specific fb_mmap function

2012-11-19 Thread Kyungmin Park
Hi,

On 11/19/12, Prathyush K  wrote:
> Changelog v3:
>
> Passing the actual buffer size instead of vm_size to dma_mmap_attrs.
>
> Changelog v2:
>
> Extracting the private data from fb_info structure to obtain the exynos
> gem buffer structure. Now, dma address is obtained from the exynos gem
> buffer structure and not from smem_start. Also calling dma_mmap_attrs
> (instead of dma_mmap_writecombine) with the same attributes used
> during allocation.
>
> Changelog v1:
>
> This patch adds a exynos drm specific implementation of fb_mmap
> which supports mapping a non-contiguous buffer to user space.
>
> This new function does not assume that the frame buffer is contiguous
> and calls dma_mmap_writecombine for mapping the buffer to user space.
> dma_mmap_writecombine will be able to map a contiguous buffer as well
> as non-contig buffer depending on whether an IOMMU mapping is created
> for drm or not.
>
> Signed-off-by: Prathyush K 
> ---
>  drivers/gpu/drm/exynos/exynos_drm_fbdev.c |   30
> +
>  1 files changed, 30 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> index 67eb6ba..a6f8cc2 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> @@ -46,8 +46,38 @@ struct exynos_drm_fbdev {
>   struct exynos_drm_gem_obj   *exynos_gem_obj;
>  };
>
> +static int exynos_drm_fb_mmap(struct fb_info *info,
> + struct vm_area_struct *vma)
> +{
> + struct drm_fb_helper *helper = info->par;
> + struct exynos_drm_fbdev *exynos_fbd = to_exynos_fbdev(helper);
> + struct exynos_drm_gem_obj *exynos_gem_obj = exynos_fbd->exynos_gem_obj;
> + struct exynos_drm_gem_buf *buffer = exynos_gem_obj->buffer;
> + unsigned long vm_size;
> + int ret;
> +
> + DRM_DEBUG_KMS("%s\n", __func__);
> +
> + vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP;
How do you sure VM_MIXEDMAP is not required?
> +
> + vm_size = vma->vm_end - vma->vm_start;
> +
> + if (vm_size > buffer->size)
> + return -EINVAL;
does it really happended?

Thank you,
Kyungmin Park
> +
> + ret = dma_mmap_attrs(helper->dev->dev, vma, buffer->kvaddr,
> + buffer->dma_addr, buffer->size, &buffer->dma_attrs);
> + if (ret < 0) {
> + DRM_ERROR("failed to mmap.\n");
> + return ret;
> + }
> +
> + return 0;
> +}
> +
>  static struct fb_ops exynos_drm_fb_ops = {
>   .owner  = THIS_MODULE,
> + .fb_mmap= exynos_drm_fb_mmap,
>   .fb_fillrect= cfb_fillrect,
>   .fb_copyarea= cfb_copyarea,
>   .fb_imageblit   = cfb_imageblit,
> --
> 1.7.0.4
>
> ___
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3] drm/exynos: add exynos drm specific fb_mmap function

2012-11-19 Thread Prathyush K
Changelog v3:

Passing the actual buffer size instead of vm_size to dma_mmap_attrs.

Changelog v2:

Extracting the private data from fb_info structure to obtain the exynos
gem buffer structure. Now, dma address is obtained from the exynos gem
buffer structure and not from smem_start. Also calling dma_mmap_attrs
(instead of dma_mmap_writecombine) with the same attributes used
during allocation.

Changelog v1:

This patch adds a exynos drm specific implementation of fb_mmap
which supports mapping a non-contiguous buffer to user space.

This new function does not assume that the frame buffer is contiguous
and calls dma_mmap_writecombine for mapping the buffer to user space.
dma_mmap_writecombine will be able to map a contiguous buffer as well
as non-contig buffer depending on whether an IOMMU mapping is created
for drm or not.

Signed-off-by: Prathyush K 
---
 drivers/gpu/drm/exynos/exynos_drm_fbdev.c |   30 +
 1 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c 
b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
index 67eb6ba..a6f8cc2 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
@@ -46,8 +46,38 @@ struct exynos_drm_fbdev {
struct exynos_drm_gem_obj   *exynos_gem_obj;
 };
 
+static int exynos_drm_fb_mmap(struct fb_info *info,
+   struct vm_area_struct *vma)
+{
+   struct drm_fb_helper *helper = info->par;
+   struct exynos_drm_fbdev *exynos_fbd = to_exynos_fbdev(helper);
+   struct exynos_drm_gem_obj *exynos_gem_obj = exynos_fbd->exynos_gem_obj;
+   struct exynos_drm_gem_buf *buffer = exynos_gem_obj->buffer;
+   unsigned long vm_size;
+   int ret;
+
+   DRM_DEBUG_KMS("%s\n", __func__);
+
+   vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP;
+
+   vm_size = vma->vm_end - vma->vm_start;
+
+   if (vm_size > buffer->size)
+   return -EINVAL;
+
+   ret = dma_mmap_attrs(helper->dev->dev, vma, buffer->kvaddr,
+   buffer->dma_addr, buffer->size, &buffer->dma_attrs);
+   if (ret < 0) {
+   DRM_ERROR("failed to mmap.\n");
+   return ret;
+   }
+
+   return 0;
+}
+
 static struct fb_ops exynos_drm_fb_ops = {
.owner  = THIS_MODULE,
+   .fb_mmap= exynos_drm_fb_mmap,
.fb_fillrect= cfb_fillrect,
.fb_copyarea= cfb_copyarea,
.fb_imageblit   = cfb_imageblit,
-- 
1.7.0.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel