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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





2012/11/19 Kyungmin Park <kmpark@xxxxxxxxxxxxx>
Hi,

On 11/19/12, Prathyush K <prathyush.k@xxxxxxxxxxx> 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 <prathyush.k@xxxxxxxxxxx>
> ---
>  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@xxxxxxxxxxxxxxxxxxxxx
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>
_______________________________________________
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

[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux