Commit 488c888a authored by Daniel Vetter's avatar Daniel Vetter
Browse files

drm/vkms: Switch to shmem helpers



Inspired by a patch by Chris Wilson for vgem. Plus this gives us vmap
at the gem bo level, which we need for generic fbdev emulation.

Luckily shmem also tracks ->vaddr, so we just need to adjust the code
all over a bit to make this fit.

Also wire up handle_to_fd, dunno why that was missing.

v2:
- Drop now unused container_of #define (Melissa)
- Make sure we keep creating cached objects, this is for testing
  (Thomas)

Signed-off-by: default avatarDaniel Vetter <daniel.vetter@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
Cc: Melissa Wen <melissa.srw@gmail.com>
Cc: Haneen Mohammed <hamohammed.sa@gmail.com>
Acked-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarMelissa Wen <melissa.srw@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20201013111027.375999-1-daniel.vetter@ffwll.ch
parent 063bc37d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -287,6 +287,7 @@ config DRM_VKMS
	tristate "Virtual KMS (EXPERIMENTAL)"
	depends on DRM
	select DRM_KMS_HELPER
	select DRM_GEM_SHMEM_HELPER
	select CRC32
	default n
	help
+0 −1
Original line number Diff line number Diff line
@@ -4,7 +4,6 @@ vkms-y := \
	vkms_plane.o \
	vkms_output.o \
	vkms_crtc.o \
	vkms_gem.o \
	vkms_composer.o \
	vkms_writeback.o

+9 −8
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_gem_framebuffer_helper.h>
#include <drm/drm_gem_shmem_helper.h>
#include <drm/drm_vblank.h>

#include "vkms_drv.h"
@@ -129,15 +130,15 @@ static void compose_cursor(struct vkms_composer *cursor_composer,
			   void *vaddr_out)
{
	struct drm_gem_object *cursor_obj;
	struct vkms_gem_object *cursor_vkms_obj;
	struct drm_gem_shmem_object *cursor_shmem_obj;

	cursor_obj = drm_gem_fb_get_obj(&cursor_composer->fb, 0);
	cursor_vkms_obj = drm_gem_to_vkms_gem(cursor_obj);
	cursor_shmem_obj = to_drm_gem_shmem_obj(cursor_obj);

	if (WARN_ON(!cursor_vkms_obj->vaddr))
	if (WARN_ON(!cursor_shmem_obj->vaddr))
		return;

	blend(vaddr_out, cursor_vkms_obj->vaddr,
	blend(vaddr_out, cursor_shmem_obj->vaddr,
	      primary_composer, cursor_composer);
}

@@ -147,20 +148,20 @@ static int compose_planes(void **vaddr_out,
{
	struct drm_framebuffer *fb = &primary_composer->fb;
	struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0);
	struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(gem_obj);
	struct drm_gem_shmem_object *shmem_obj = to_drm_gem_shmem_obj(gem_obj);

	if (!*vaddr_out) {
		*vaddr_out = kzalloc(vkms_obj->gem.size, GFP_KERNEL);
		*vaddr_out = kzalloc(shmem_obj->base.size, GFP_KERNEL);
		if (!*vaddr_out) {
			DRM_ERROR("Cannot allocate memory for output frame.");
			return -ENOMEM;
		}
	}

	if (WARN_ON(!vkms_obj->vaddr))
	if (WARN_ON(!shmem_obj->vaddr))
		return -EINVAL;

	memcpy(*vaddr_out, vkms_obj->vaddr, vkms_obj->gem.size);
	memcpy(*vaddr_out, shmem_obj->vaddr, shmem_obj->base.size);

	if (cursor_composer)
		compose_cursor(cursor_composer, primary_composer, *vaddr_out);
+4 −14
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
#include <drm/drm_ioctl.h>
#include <drm/drm_managed.h>
#include <drm/drm_probe_helper.h>
#include <drm/drm_gem_shmem_helper.h>
#include <drm/drm_vblank.h>

#include "vkms_drv.h"
@@ -39,17 +40,7 @@ bool enable_cursor = true;
module_param_named(enable_cursor, enable_cursor, bool, 0444);
MODULE_PARM_DESC(enable_cursor, "Enable/Disable cursor support");

static const struct file_operations vkms_driver_fops = {
	.owner		= THIS_MODULE,
	.open		= drm_open,
	.mmap		= drm_gem_mmap,
	.unlocked_ioctl	= drm_ioctl,
	.compat_ioctl	= drm_compat_ioctl,
	.poll		= drm_poll,
	.read		= drm_read,
	.llseek		= no_llseek,
	.release	= drm_release,
};
DEFINE_DRM_GEM_FOPS(vkms_driver_fops);

static void vkms_release(struct drm_device *dev)
{
@@ -91,9 +82,8 @@ static struct drm_driver vkms_driver = {
	.driver_features	= DRIVER_MODESET | DRIVER_ATOMIC | DRIVER_GEM,
	.release		= vkms_release,
	.fops			= &vkms_driver_fops,
	.dumb_create		= vkms_dumb_create,
	.prime_fd_to_handle	= drm_gem_prime_fd_to_handle,
	.gem_prime_import_sg_table = vkms_prime_import_sg_table,
	.gem_create_object = drm_gem_shmem_create_object_cached,
	DRM_GEM_SHMEM_DRIVER_OPS,

	.name			= DRIVER_NAME,
	.desc			= DRIVER_DESC,
+0 −29
Original line number Diff line number Diff line
@@ -88,23 +88,12 @@ struct vkms_device {
	struct vkms_output output;
};

struct vkms_gem_object {
	struct drm_gem_object gem;
	struct mutex pages_lock; /* Page lock used in page fault handler */
	struct page **pages;
	unsigned int vmap_count;
	void *vaddr;
};

#define drm_crtc_to_vkms_output(target) \
	container_of(target, struct vkms_output, crtc)

#define drm_device_to_vkms_device(target) \
	container_of(target, struct vkms_device, drm)

#define drm_gem_to_vkms_gem(target)\
	container_of(target, struct vkms_gem_object, gem)

#define to_vkms_crtc_state(target)\
	container_of(target, struct vkms_crtc_state, base)

@@ -120,24 +109,6 @@ int vkms_output_init(struct vkms_device *vkmsdev, int index);
struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
				  enum drm_plane_type type, int index);

/* Gem stuff */
vm_fault_t vkms_gem_fault(struct vm_fault *vmf);

int vkms_dumb_create(struct drm_file *file, struct drm_device *dev,
		     struct drm_mode_create_dumb *args);

void vkms_gem_free_object(struct drm_gem_object *obj);

int vkms_gem_vmap(struct drm_gem_object *obj);

void vkms_gem_vunmap(struct drm_gem_object *obj);

/* Prime */
struct drm_gem_object *
vkms_prime_import_sg_table(struct drm_device *dev,
			   struct dma_buf_attachment *attach,
			   struct sg_table *sg);

/* CRC Support */
const char *const *vkms_get_crc_sources(struct drm_crtc *crtc,
					size_t *count);
Loading