static int rockchip_drm_fb_mmap(struct fb_info *info, struct vm_area_struct *vma) { struct drm_fb_helper *helper = info->par; struct rockchip_drm_fbdev *rockchip_fbd = to_rockchip_fbdev(helper); struct rockchip_drm_gem_obj *rockchip_gem_obj = rockchip_fbd->rockchip_gem_obj; struct rockchip_drm_gem_buf *buffer = rockchip_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->pages, buffer->dma_addr, buffer->size, &buffer->dma_attrs); if (ret < 0) { DRM_ERROR("failed to mmap.\n"); return ret; } return 0; }
int mtk_drm_gem_mmap_buf(struct drm_gem_object *obj, struct vm_area_struct *vma) { struct mtk_drm_gem_obj *mtk_gem = to_mtk_gem_obj(obj); struct drm_device *drm = obj->dev; unsigned long vm_size; vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP; vm_size = vma->vm_end - vma->vm_start; if (vm_size > obj->size) return -EINVAL; return dma_mmap_attrs(drm->dev, vma, mtk_gem->kvaddr, mtk_gem->dma_addr, obj->size, &mtk_gem->dma_attrs); }
static int rockchip_drm_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) { int ret; struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj); struct drm_device *drm = obj->dev; /* * dma_alloc_attrs() allocated a struct page table for rk_obj, so clear * VM_PFNMAP flag that was set by drm_gem_mmap_obj()/drm_gem_mmap(). */ vma->vm_flags &= ~VM_PFNMAP; ret = dma_mmap_attrs(drm->dev, vma, rk_obj->kvaddr, rk_obj->dma_addr, obj->size, &rk_obj->dma_attrs); if (ret) drm_gem_vm_close(vma); return ret; }