[PATCH v4 3/5] drm: add SimpleDRM driver
Daniel Vetter
daniel at ffwll.ch
Fri Aug 26 14:40:46 UTC 2016
On Fri, Aug 26, 2016 at 12:11 AM, Noralf Trønnes <noralf at tronnes.org> wrote:
> I'm really walking in the dark here. I have deleted drm_driver.gem_vm_ops
> and used this function:
>
> int sdrm_drm_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_object *obj = NULL;
> struct drm_vma_offset_node *node;
> int ret;
>
> drm_vma_offset_lock_lookup(dev->vma_offset_manager);
> node = drm_vma_offset_exact_lookup_locked(dev->vma_offset_manager,
> vma->vm_pgoff,
> vma_pages(vma));
> if (likely(node)) {
> obj = container_of(node, struct drm_gem_object, vma_node);
> /*
> * When the object is being freed, after it hits 0-refcnt it
> * proceeds to tear down the object. In the process it will
> * attempt to remove the VMA offset and so acquire this
> * mgr->vm_lock. Therefore if we find an object with a 0-refcnt
> * that matches our range, we know it is in the process of being
> * destroyed and will be freed as soon as we release the lock -
> * so we have to check for the 0-refcnted object and treat it as
> * invalid.
> */
> if (!kref_get_unless_zero(&obj->refcount))
> obj = NULL;
> }
> drm_vma_offset_unlock_lookup(dev->vma_offset_manager);
>
> if (!obj)
> return -EINVAL;
>
> if (!drm_vma_node_is_allowed(node, filp)) {
> drm_gem_object_unreference_unlocked(obj);
> return -EACCES;
> }
>
> /* redirect to shmem mmap */
> vma->vm_file = obj->filp;
> vma->vm_pgoff = 0;
>
> ret = obj->filp->f_op->mmap(obj->filp, vma);
>
> drm_gem_object_unreference_unlocked(obj);
>
> return ret;
> }
Yup, this looks good.
> But that works only partly. Using modetest I get a picture, but fbdev
> doesn't return.
> Turning on drm debug the two variants are identical up to
> DRM_IOCTL_MODE_DESTROY_DUMB.
>
> The shmem mmap version:
> [identical]
> [ 74.939660] [drm:drm_ioctl] pid=721, dev=0xe200, auth=1,
> DRM_IOCTL_MODE_DESTROY_DUMB
> And nothing more
Hm, what does your fbdev support code now look like? fbdev doesn't do
paging, so for that you still need the get_pages(); vmap; thing at
setup time, and then when you tear down the fbdev stuff a vunmap();
and put_pages();
And of course the dirty stuff all needs to be wired up, but since it
works for modeset I think we can assume it's in good shape.
-Daniel
> Whereas the working one gives me this:
> [identical]
> [ 70.373029] [drm:drm_ioctl] pid=721, dev=0xe200, auth=1,
> DRM_IOCTL_MODE_DESTROY_DUMB
> [ 70.393401] [drm:drm_release] open_count = 1
> [ 70.393429] [drm:drm_release] pid = 721, device = 0xe200, open_count = 1
> [ 70.393468] [drm:drm_lastclose]
> [ 70.393501] [drm:drm_atomic_state_init] Allocated atomic state dad61e00
> [ 70.393521] [drm:drm_atomic_get_plane_state] Added [PLANE:24:plane-0]
> dad61e40 state to dad61e00
> [ 70.393543] [drm:drm_atomic_get_crtc_state] Added [CRTC:25:crtc-0]
> dad73a00 state to dad61e00
> [ 70.393588] [drm:drm_atomic_set_mode_for_crtc] Set [MODE:1824x984] for
> CRTC state dad73a00
> [ 70.393604] [drm:drm_atomic_set_crtc_for_plane] Link plane state dad61e40
> to [CRTC:25:crtc-0]
> [ 70.393619] [drm:drm_mode_object_reference] OBJ ID: 29 (1)
> [ 70.393629] [drm:drm_atomic_set_fb_for_plane] Set [FB:29] for plane state
> dad61e40
> [ 70.393643] [drm:drm_atomic_add_affected_connectors] Adding all current
> connectors for [CRTC:25:crtc-0] to dad61e00
> [ 70.393662] [drm:drm_mode_object_reference] OBJ ID: 23 (2)
> [ 70.393674] [drm:drm_atomic_get_connector_state] Added [CONNECTOR:23]
> dad613c0 state to dad61e00
> [ 70.393835] [drm:drm_mode_object_reference] OBJ ID: 23 (3)
> [ 70.393848] [drm:drm_atomic_set_crtc_for_connector] Link connector state
> dad613c0 to [CRTC:25:crtc-0]
> [ 70.393859] [drm:drm_atomic_check_only] checking dad61e00
> [ 70.393873] [drm:drm_atomic_helper_check_modeset] [CRTC:25:crtc-0] mode
> changed
> [ 70.393881] [drm:drm_atomic_helper_check_modeset] [CRTC:25:crtc-0] enable
> changed
> [ 70.403886] [drm:update_connector_routing] Updating routing for
> [CONNECTOR:23:Virtual-1]
> [ 70.403916] [drm:update_connector_routing] [CONNECTOR:23:Virtual-1] using
> [ENCODER:26:None-26] on [CRTC:25:crtc-0]
> [ 70.403926] [drm:drm_atomic_helper_check_modeset] [CRTC:25:crtc-0] active
> changed
> [ 70.403956] [drm:drm_atomic_helper_check_modeset] [CRTC:25:crtc-0] needs
> all connectors, enable: y, active: y
> [ 70.403972] [drm:drm_atomic_add_affected_connectors] Adding all current
> connectors for [CRTC:25:crtc-0] to dad61e00
> [ 70.404006] [drm:drm_atomic_commit] commiting dad61e00
> [ 70.404043] [drm:crtc_set_mode] modeset on [ENCODER:26:None-26]
> [ 70.422427] [drm:drm_atomic_helper_commit_modeset_enables] enabling
> [CRTC:25:crtc-0]
> [ 70.422465] [drm:drm_atomic_helper_commit_modeset_enables] enabling
> [ENCODER:26:None-26]
> [ 70.422490] [drm:drm_atomic_state_default_clear] Clearing atomic state
> dad61e00
> [ 70.422504] [drm:drm_mode_object_unreference] OBJ ID: 23 (4)
> [ 70.422519] [drm:drm_atomic_state_free] Freeing atomic state dad61e00
> [ 70.422532] [drm:drm_mode_object_reference] OBJ ID: 29 (2)
> [ 70.422546] [drm:drm_lastclose] driver lastclose completed
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
More information about the dri-devel
mailing list