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@ideasonboard.com
[...]
+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