On Wed, May 30, 2012 at 02:32:59PM +0200, Laurent Pinchart wrote: > The SH Mobile LCD controller (LCDC) DRM driver supports the main > graphics plane in RGB and YUV formats, as well as the overlay planes (in > alpha-blending mode only). > > Only flat panel outputs using the parallel interface are supported. > Support for SYS panels, HDMI and DSI is currently not implemented. > > Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > --- [...] > +int shmob_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) > +{ > + struct drm_file *priv = filp->private_data; > + struct drm_device *dev = priv->minor->dev; > + struct drm_gem_mm *mm = dev->mm_private; > + struct shmob_drm_gem_object *sobj; > + struct drm_local_map *map; > + struct drm_gem_object *obj; > + struct drm_hash_item *hash; > + pgprot_t prot; > + int ret; > + > + if (drm_device_is_unplugged(dev)) > + return -ENODEV; > + > + mutex_lock(&dev->struct_mutex); > + > + if (drm_ht_find_item(&mm->offset_hash, vma->vm_pgoff, &hash)) { > + ret = -EINVAL; > + goto out_unlock; > + } > + > + map = drm_hash_entry(hash, struct drm_map_list, hash)->map; > + if (!map || > + ((map->flags & _DRM_RESTRICTED) && !capable(CAP_SYS_ADMIN))) { > + ret = -EPERM; > + goto out_unlock; > + } > + > + /* Check for valid size. */ > + if (map->size < vma->vm_end - vma->vm_start) { > + ret = -EINVAL; > + goto out_unlock; > + } > + > + obj = map->handle; > + if (!obj->dev->driver->gem_vm_ops) { > + ret = -EINVAL; > + goto out_unlock; > + } > + > + sobj = to_shmob_gem_object(obj); > + prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags)); > + ret = remap_pfn_range(vma, vma->vm_start, sobj->dma >> PAGE_SHIFT, > + vma->vm_end - vma->vm_start, prot); > + if (ret < 0) > + goto out_unlock; > + > + vma->vm_flags |= VM_RESERVED | VM_IO | VM_PFNMAP | VM_DONTEXPAND; > + vma->vm_ops = obj->dev->driver->gem_vm_ops; > + vma->vm_private_data = obj; > + vma->vm_page_prot = prot; > + > + /* Take a ref for this mapping of the object, so that the fault > + * handler can dereference the mmap offset's pointer to the object. > + * This reference is cleaned up by the corresponding vm_close > + * (which should happen whether the vma was created by this call, or > + * by a vm_open due to mremap or partial unmap or whatever). > + */ > + drm_gem_object_reference(obj); > + > + drm_vm_open_locked(dev, vma); > + > +out_unlock: > + mutex_unlock(&dev->struct_mutex); > + > + return ret; > +} I just noticed this function is nearly a copy of drm_gem_mmap except for the the additional remap_pfn_range here. Would it make sense to turn drm_gem_mmap into a wrapper around a drm_gem_mmap_locked, call this one from here and add the remap_pfn_range? If yes, I would do so in my cma gem helper patch. Sascha -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel