Den 02.09.2016 10:22, skrev David Herrmann:
The SimpleDRM driver binds to simple-framebuffer devices and provides a
DRM/KMS API. It provides only a single CRTC+encoder+connector combination
plus one initial mode.
Userspace can create dumb-buffers which can be blit into the real
framebuffer similar to UDL. No access to the real framebuffer is allowed
(compared to earlier version of this driver) to avoid security issues.
Furthermore, this way we can support arbitrary modes as long as we have a
conversion-helper.
Signed-off-by: David Herrmann <dh.herrmann@xxxxxxxxx>
---
[...]
diff --git a/drivers/gpu/drm/simpledrm/simpledrm_drv.c b/drivers/gpu/drm/simpledrm/simpledrm_drv.c
[...]
+static int sdrm_fop_mmap(struct file *file, struct vm_area_struct *vma)
+{
+ struct drm_file *dfile = file->private_data;
+ struct drm_device *dev = dfile->minor->dev;
+ struct drm_gem_object *obj = NULL;
+ struct drm_vma_offset_node *node;
+ int r;
+
+ 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);
+ 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, dfile)) {
I get:
drivers/gpu/drm/simpledrm/simpledrm_drv.c:320:2: warning: passing
argument 2 of ‘drm_vma_node_is_allowed’ from incompatible pointer type
[enabled by default]
dfile -> file
+ drm_gem_object_unreference_unlocked(obj);
+ return -EACCES;
+ }
+
+ if (vma->vm_file)
+ fput(vma->vm_file);
+ vma->vm_file = get_file(obj->filp);
+ vma->vm_pgoff = 0;
+
+ r = obj->filp->f_op->mmap(obj->filp, vma);
+ drm_gem_object_unreference_unlocked(obj);
+ return r;
+}
[...]
diff --git a/drivers/gpu/drm/simpledrm/simpledrm_kms.c b/drivers/gpu/drm/simpledrm/simpledrm_kms.c
[...]
+static void sdrm_crtc_send_vblank_event(struct drm_crtc *crtc)
+{
+ if (crtc->state && crtc->state->event) {
+ spin_lock_irq(&crtc->dev->event_lock);
+ drm_crtc_send_vblank_event(crtc, crtc->state->event);
+ spin_unlock_irq(&crtc->dev->event_lock);
+ crtc->state->event = NULL;
+ }
+}
+
+void sdrm_display_pipe_update(struct drm_simple_display_pipe *pipe,
+ struct drm_plane_state *plane_state)
+{
+ struct drm_framebuffer *dfb = pipe->plane.state->fb;
+ struct sdrm_fb *fb;
+
+ sdrm_crtc_send_vblank_event(&pipe->crtc);
+
+ if (dfb) {
+ fb = container_of(dfb, struct sdrm_fb, base);
+ pipe->plane.fb = dfb;
+ sdrm_dirty(fb, 0, 0, dfb->width, dfb->height);
+ }
+}
+
+static void sdrm_display_pipe_enable(struct drm_simple_display_pipe *pipe,
+ struct drm_crtc_state *crtc_state)
+{
+ sdrm_crtc_send_vblank_event(&pipe->crtc);
+}
+
+static void sdrm_display_pipe_disable(struct drm_simple_display_pipe *pipe)
+{
+ sdrm_crtc_send_vblank_event(&pipe->crtc);
+}
+
+static const struct drm_simple_display_pipe_funcs sdrm_pipe_funcs = {
+ .update = sdrm_display_pipe_update,
+ .enable = sdrm_display_pipe_enable,
+ .disable = sdrm_display_pipe_disable,
+};
The enable and disable callbacks can be removed.
This commit in drm-misc fixed the flip done timeout:
drm/simple-helpers: Always add planes to the state update
Noralf.
_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/dri-devel