Commit 4394e964 authored by Oleksandr Andrushchenko's avatar Oleksandr Andrushchenko
Browse files

drm/xen-front: Remove CMA support



It turns out this was only needed to paper over a bug in the CMA
helpers, which was addressed in

commit 998fb1a0
Author: Liviu Dudau <Liviu.Dudau@arm.com>
Date:   Fri Nov 10 13:33:10 2017 +0000

    drm: gem_cma_helper.c: Allow importing of contiguous scatterlists with nents > 1

Without this the following pipeline didn't work:

domU:
1. xen-front allocates a non-contig buffer
2. creates grants out of it

dom0:
3. converts the grants into a dma-buf. Since they're non-contig, the
scatter-list is huge.
4. imports it into rcar-du, which requires dma-contig memory for
scanout.

-> On this given platform there's an IOMMU, so in theory this should
work. But in practice this failed, because of the huge number of sg
entries, even though the IOMMU driver mapped it all into a dma-contig
range.

With a guest-contig buffer allocated in step 1, this problem doesn't
exist. But there's technically no reason to require guest-contig
memory for xen buffer sharing using grants.

Given all that, the xen-front cma support is not needed and should be
removed.

Signed-off-by: default avatarOleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
Suggested-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Acked-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20180417074012.21311-1-andr2000@gmail.com
parent 02edfd9c
Loading
Loading
Loading
Loading
+0 −12
Original line number Diff line number Diff line
@@ -18,18 +18,6 @@ Buffers allocated by the frontend driver
.. kernel-doc:: drivers/gpu/drm/xen/xen_drm_front.h
   :doc: Buffers allocated by the frontend driver

With GEM CMA helpers
~~~~~~~~~~~~~~~~~~~~

.. kernel-doc:: drivers/gpu/drm/xen/xen_drm_front.h
   :doc: With GEM CMA helpers

Without GEM CMA helpers
~~~~~~~~~~~~~~~~~~~~~~~

.. kernel-doc:: drivers/gpu/drm/xen/xen_drm_front.h
   :doc: Without GEM CMA helpers

Buffers allocated by the backend
--------------------------------

+0 −13
Original line number Diff line number Diff line
@@ -15,16 +15,3 @@ config DRM_XEN_FRONTEND
	help
	  Choose this option if you want to enable a para-virtualized
	  frontend DRM/KMS driver for Xen guest OSes.

config DRM_XEN_FRONTEND_CMA
	bool "Use DRM CMA to allocate dumb buffers"
	depends on DRM_XEN_FRONTEND
	select DRM_KMS_CMA_HELPER
	select DRM_GEM_CMA_HELPER
	help
	  Use DRM CMA helpers to allocate display buffers.
	  This is useful for the use-cases when guest driver needs to
	  share or export buffers to other drivers which only expect
	  contiguous buffers.
	  Note: in this mode driver cannot use buffers allocated
	  by the backend.
+2 −7
Original line number Diff line number Diff line
@@ -5,12 +5,7 @@ drm_xen_front-objs := xen_drm_front.o \
		      xen_drm_front_conn.o \
		      xen_drm_front_evtchnl.o \
		      xen_drm_front_shbuf.o \
		      xen_drm_front_cfg.o

ifeq ($(CONFIG_DRM_XEN_FRONTEND_CMA),y)
	drm_xen_front-objs += xen_drm_front_gem_cma.o
else
	drm_xen_front-objs += xen_drm_front_gem.o
endif
		      xen_drm_front_cfg.o \
		      xen_drm_front_gem.o

obj-$(CONFIG_DRM_XEN_FRONTEND) += drm_xen_front.o
+10 −52
Original line number Diff line number Diff line
@@ -12,7 +12,6 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_gem.h>
#include <drm/drm_gem_cma_helper.h>

#include <linux/of_device.h>

@@ -167,10 +166,9 @@ int xen_drm_front_mode_set(struct xen_drm_front_drm_pipeline *pipeline,
	return ret;
}

static int be_dbuf_create_int(struct xen_drm_front_info *front_info,
int xen_drm_front_dbuf_create(struct xen_drm_front_info *front_info,
			      u64 dbuf_cookie, u32 width, u32 height,
			      u32 bpp, u64 size, struct page **pages,
			      struct sg_table *sgt)
			      u32 bpp, u64 size, struct page **pages)
{
	struct xen_drm_front_evtchnl *evtchnl;
	struct xen_drm_front_shbuf *shbuf;
@@ -187,7 +185,6 @@ static int be_dbuf_create_int(struct xen_drm_front_info *front_info,
	buf_cfg.xb_dev = front_info->xb_dev;
	buf_cfg.pages = pages;
	buf_cfg.size = size;
	buf_cfg.sgt = sgt;
	buf_cfg.be_alloc = front_info->cfg.be_alloc;

	shbuf = xen_drm_front_shbuf_alloc(&buf_cfg);
@@ -237,22 +234,6 @@ fail:
	return ret;
}

int xen_drm_front_dbuf_create_from_sgt(struct xen_drm_front_info *front_info,
				       u64 dbuf_cookie, u32 width, u32 height,
				       u32 bpp, u64 size, struct sg_table *sgt)
{
	return be_dbuf_create_int(front_info, dbuf_cookie, width, height,
				  bpp, size, NULL, sgt);
}

int xen_drm_front_dbuf_create_from_pages(struct xen_drm_front_info *front_info,
					 u64 dbuf_cookie, u32 width, u32 height,
					 u32 bpp, u64 size, struct page **pages)
{
	return be_dbuf_create_int(front_info, dbuf_cookie, width, height,
				  bpp, size, pages, NULL);
}

static int xen_drm_front_dbuf_destroy(struct xen_drm_front_info *front_info,
				      u64 dbuf_cookie)
{
@@ -434,24 +415,11 @@ static int xen_drm_drv_dumb_create(struct drm_file *filp,
		goto fail;
	}

	/*
	 * In case of CONFIG_DRM_XEN_FRONTEND_CMA gem_obj is constructed
	 * via DRM CMA helpers and doesn't have ->pages allocated
	 * (xendrm_gem_get_pages will return NULL), but instead can provide
	 * sg table
	 */
	if (xen_drm_front_gem_get_pages(obj))
		ret = xen_drm_front_dbuf_create_from_pages(drm_info->front_info,
	ret = xen_drm_front_dbuf_create(drm_info->front_info,
					xen_drm_front_dbuf_to_cookie(obj),
					args->width, args->height, args->bpp,
					args->size,
					xen_drm_front_gem_get_pages(obj));
	else
		ret = xen_drm_front_dbuf_create_from_sgt(drm_info->front_info,
				xen_drm_front_dbuf_to_cookie(obj),
				args->width, args->height, args->bpp,
				args->size,
				xen_drm_front_gem_get_sg_table(obj));
	if (ret)
		goto fail_backend;

@@ -523,11 +491,7 @@ static const struct file_operations xen_drm_dev_fops = {
	.poll           = drm_poll,
	.read           = drm_read,
	.llseek         = no_llseek,
#ifdef CONFIG_DRM_XEN_FRONTEND_CMA
	.mmap           = drm_gem_cma_mmap,
#else
	.mmap           = xen_drm_front_gem_mmap,
#endif
};

static const struct vm_operations_struct xen_drm_drv_vm_ops = {
@@ -547,6 +511,9 @@ static struct drm_driver xen_drm_driver = {
	.gem_prime_export          = drm_gem_prime_export,
	.gem_prime_import_sg_table = xen_drm_front_gem_import_sg_table,
	.gem_prime_get_sg_table    = xen_drm_front_gem_get_sg_table,
	.gem_prime_vmap            = xen_drm_front_gem_prime_vmap,
	.gem_prime_vunmap          = xen_drm_front_gem_prime_vunmap,
	.gem_prime_mmap            = xen_drm_front_gem_prime_mmap,
	.dumb_create               = xen_drm_drv_dumb_create,
	.fops                      = &xen_drm_dev_fops,
	.name                      = "xendrm-du",
@@ -555,15 +522,6 @@ static struct drm_driver xen_drm_driver = {
	.major                     = 1,
	.minor                     = 0,

#ifdef CONFIG_DRM_XEN_FRONTEND_CMA
	.gem_prime_vmap            = drm_gem_cma_prime_vmap,
	.gem_prime_vunmap          = drm_gem_cma_prime_vunmap,
	.gem_prime_mmap            = drm_gem_cma_prime_mmap,
#else
	.gem_prime_vmap            = xen_drm_front_gem_prime_vmap,
	.gem_prime_vunmap          = xen_drm_front_gem_prime_vunmap,
	.gem_prime_mmap            = xen_drm_front_gem_prime_mmap,
#endif
};

static int xen_drm_drv_init(struct xen_drm_front_info *front_info)
+6 −36
Original line number Diff line number Diff line
@@ -23,40 +23,14 @@
 *
 * Depending on the requirements for the para-virtualized environment, namely
 * requirements dictated by the accompanying DRM/(v)GPU drivers running in both
 * host and guest environments, number of operating modes of para-virtualized
 * display driver are supported:
 *
 * - display buffers can be allocated by either frontend driver or backend
 * - display buffers can be allocated to be contiguous in memory or not
 *
 * Note! Frontend driver itself has no dependency on contiguous memory for
 * its operation.
 * host and guest environments, display buffers can be allocated by either
 * frontend driver or backend.
 */

/**
 * DOC: Buffers allocated by the frontend driver
 *
 * The below modes of operation are configured at compile-time via
 * frontend driver's kernel configuration:
 */

/**
 * DOC: With GEM CMA helpers
 *
 * This use-case is useful when used with accompanying DRM/vGPU driver in
 * guest domain which was designed to only work with contiguous buffers,
 * e.g. DRM driver based on GEM CMA helpers: such drivers can only import
 * contiguous PRIME buffers, thus requiring frontend driver to provide
 * such. In order to implement this mode of operation para-virtualized
 * frontend driver can be configured to use GEM CMA helpers.
 */

/**
 * DOC: Without GEM CMA helpers
 *
 * If accompanying drivers can cope with non-contiguous memory then, to
 * lower pressure on CMA subsystem of the kernel, driver can allocate
 * buffers from system memory.
 * In this mode of operation driver allocates buffers from system memory.
 *
 * Note! If used with accompanying DRM/(v)GPU drivers this mode of operation
 * may require IOMMU support on the platform, so accompanying DRM/vGPU
@@ -164,11 +138,7 @@ int xen_drm_front_mode_set(struct xen_drm_front_drm_pipeline *pipeline,
			   u32 x, u32 y, u32 width, u32 height,
			   u32 bpp, u64 fb_cookie);

int xen_drm_front_dbuf_create_from_sgt(struct xen_drm_front_info *front_info,
				       u64 dbuf_cookie, u32 width, u32 height,
				       u32 bpp, u64 size, struct sg_table *sgt);

int xen_drm_front_dbuf_create_from_pages(struct xen_drm_front_info *front_info,
int xen_drm_front_dbuf_create(struct xen_drm_front_info *front_info,
			      u64 dbuf_cookie, u32 width, u32 height,
			      u32 bpp, u64 size, struct page **pages);

Loading