On Fri, Aug 26, 2016 at 12:11 AM, Noralf Trønnes noralf@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