Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/mediatek: Implement mmap as GEM object function

Moving the driver-specific mmap code into a GEM object function allows
for using DRM helpers for various mmap callbacks.

The respective mediatek functions are being removed. The file_operations
structure fops is now being created by the helper macro
DEFINE_DRM_GEM_FOPS().

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>

authored by

Thomas Zimmermann and committed by
Chun-Kuang Hu
500007eb c7ef8f35

+14 -46
+2 -11
drivers/gpu/drm/mediatek/mtk_drm_drv.c
··· 300 300 component_unbind_all(drm->dev, drm); 301 301 } 302 302 303 - static const struct file_operations mtk_drm_fops = { 304 - .owner = THIS_MODULE, 305 - .open = drm_open, 306 - .release = drm_release, 307 - .unlocked_ioctl = drm_ioctl, 308 - .mmap = mtk_drm_gem_mmap, 309 - .poll = drm_poll, 310 - .read = drm_read, 311 - .compat_ioctl = drm_compat_ioctl, 312 - }; 303 + DEFINE_DRM_GEM_FOPS(mtk_drm_fops); 313 304 314 305 /* 315 306 * We need to override this because the device used to import the memory is ··· 323 332 .prime_fd_to_handle = drm_gem_prime_fd_to_handle, 324 333 .gem_prime_import = mtk_drm_gem_prime_import, 325 334 .gem_prime_import_sg_table = mtk_gem_prime_import_sg_table, 326 - .gem_prime_mmap = mtk_drm_gem_mmap_buf, 335 + .gem_prime_mmap = drm_gem_prime_mmap, 327 336 .fops = &mtk_drm_fops, 328 337 329 338 .name = DRIVER_NAME,
+12 -32
drivers/gpu/drm/mediatek/mtk_drm_gem.c
··· 14 14 #include "mtk_drm_drv.h" 15 15 #include "mtk_drm_gem.h" 16 16 17 + static int mtk_drm_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); 18 + 17 19 static const struct drm_gem_object_funcs mtk_drm_gem_object_funcs = { 18 20 .free = mtk_drm_gem_free_object, 19 21 .get_sg_table = mtk_gem_prime_get_sg_table, 20 22 .vmap = mtk_drm_gem_prime_vmap, 21 23 .vunmap = mtk_drm_gem_prime_vunmap, 24 + .mmap = mtk_drm_gem_object_mmap, 22 25 .vm_ops = &drm_gem_cma_vm_ops, 23 26 }; 24 27 ··· 149 146 struct mtk_drm_private *priv = obj->dev->dev_private; 150 147 151 148 /* 149 + * Set vm_pgoff (used as a fake buffer offset by DRM) to 0 and map the 150 + * whole buffer from the start. 151 + */ 152 + vma->vm_pgoff = 0; 153 + 154 + /* 152 155 * dma_alloc_attrs() allocated a struct page table for mtk_gem, so clear 153 156 * VM_PFNMAP flag that was set by drm_gem_mmap_obj()/drm_gem_mmap(). 154 157 */ 155 - vma->vm_flags &= ~VM_PFNMAP; 158 + vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP; 159 + vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags)); 160 + vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot); 156 161 157 162 ret = dma_mmap_attrs(priv->dma_dev, vma, mtk_gem->cookie, 158 163 mtk_gem->dma_addr, obj->size, mtk_gem->dma_attrs); ··· 168 157 drm_gem_vm_close(vma); 169 158 170 159 return ret; 171 - } 172 - 173 - int mtk_drm_gem_mmap_buf(struct drm_gem_object *obj, struct vm_area_struct *vma) 174 - { 175 - int ret; 176 - 177 - ret = drm_gem_mmap_obj(obj, obj->size, vma); 178 - if (ret) 179 - return ret; 180 - 181 - return mtk_drm_gem_object_mmap(obj, vma); 182 - } 183 - 184 - int mtk_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) 185 - { 186 - struct drm_gem_object *obj; 187 - int ret; 188 - 189 - ret = drm_gem_mmap(filp, vma); 190 - if (ret) 191 - return ret; 192 - 193 - obj = vma->vm_private_data; 194 - 195 - /* 196 - * Set vm_pgoff (used as a fake buffer offset by DRM) to 0 and map the 197 - * whole buffer from the start. 198 - */ 199 - vma->vm_pgoff = 0; 200 - 201 - return mtk_drm_gem_object_mmap(obj, vma); 202 160 } 203 161 204 162 /*
-3
drivers/gpu/drm/mediatek/mtk_drm_gem.h
··· 39 39 bool alloc_kmap); 40 40 int mtk_drm_gem_dumb_create(struct drm_file *file_priv, struct drm_device *dev, 41 41 struct drm_mode_create_dumb *args); 42 - int mtk_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma); 43 - int mtk_drm_gem_mmap_buf(struct drm_gem_object *obj, 44 - struct vm_area_struct *vma); 45 42 struct sg_table *mtk_gem_prime_get_sg_table(struct drm_gem_object *obj); 46 43 struct drm_gem_object *mtk_gem_prime_import_sg_table(struct drm_device *dev, 47 44 struct dma_buf_attachment *attach, struct sg_table *sg);