Hi Sascha, On Wednesday 30 May 2012 18:40:56 Sascha Hauer wrote: > 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. Seems you've already done so :-) I don't think locking is an issue, but as I mentioned in my review I don't know with 100% certainty what dev->struct_mutex covers. -- Regards, Laurent Pinchart _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel