[Intel-gfx] [PATCH v5 5/5] drm/tinydrm: Switch from CMA to shmem buffers

Noralf Trønnes noralf at tronnes.org
Fri Oct 26 22:38:00 UTC 2018


Den 17.10.2018 15.04, skrev Noralf Trønnes:
> This move makes tinydrm useful for more drivers. tinydrm doesn't need
> continuous memory, but at the time it was convenient to use the CMA
> library. The spi core can do dma on is_vmalloc() addresses making this
> possible.
>
> Cc: David Lechner <david at lechnology.com>
> Signed-off-by: Noralf Trønnes <noralf at tronnes.org>
> Acked-by: David Lechner <david at lechnology.com>
> Tested-by: David Lechner <david at lechnology.com>
> ---

David,
FYI This series is scratched.
See the shmem helper patch thread for details.

Noralf.

>   drivers/gpu/drm/tinydrm/Kconfig                |  2 +-
>   drivers/gpu/drm/tinydrm/core/tinydrm-core.c    | 92 +++++++-------------------
>   drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c |  5 ++
>   drivers/gpu/drm/tinydrm/ili9225.c              | 14 ++--
>   drivers/gpu/drm/tinydrm/ili9341.c              |  6 +-
>   drivers/gpu/drm/tinydrm/mi0283qt.c             |  6 +-
>   drivers/gpu/drm/tinydrm/mipi-dbi.c             | 38 ++++-------
>   drivers/gpu/drm/tinydrm/repaper.c              | 24 +++----
>   drivers/gpu/drm/tinydrm/st7586.c               | 15 +++--
>   drivers/gpu/drm/tinydrm/st7735r.c              |  6 +-
>   include/drm/tinydrm/tinydrm.h                  | 36 +++-------
>   11 files changed, 91 insertions(+), 153 deletions(-)
>
> diff --git a/drivers/gpu/drm/tinydrm/Kconfig b/drivers/gpu/drm/tinydrm/Kconfig
> index 16f4b5c91f1b..aa0cabba5ace 100644
> --- a/drivers/gpu/drm/tinydrm/Kconfig
> +++ b/drivers/gpu/drm/tinydrm/Kconfig
> @@ -2,7 +2,7 @@ menuconfig DRM_TINYDRM
>   	tristate "Support for simple displays"
>   	depends on DRM
>   	select DRM_KMS_HELPER
> -	select DRM_KMS_CMA_HELPER
> +	select DRM_GEM_SHMEM_HELPER
>   	help
>   	  Choose this option if you have a tinydrm supported display.
>   	  If M is selected the module will be called tinydrm.
> diff --git a/drivers/gpu/drm/tinydrm/core/tinydrm-core.c b/drivers/gpu/drm/tinydrm/core/tinydrm-core.c
> index 255341ee4eb9..38ba361d1af2 100644
> --- a/drivers/gpu/drm/tinydrm/core/tinydrm-core.c
> +++ b/drivers/gpu/drm/tinydrm/core/tinydrm-core.c
> @@ -12,6 +12,7 @@
>   #include <drm/drm_crtc_helper.h>
>   #include <drm/drm_fb_helper.h>
>   #include <drm/drm_gem_framebuffer_helper.h>
> +#include <drm/drm_gem_shmem_helper.h>
>   #include <drm/tinydrm/tinydrm.h>
>   #include <linux/device.h>
>   #include <linux/dma-buf.h>
> @@ -23,7 +24,7 @@
>    *
>    * It is based on &drm_simple_display_pipe coupled with a &drm_connector which
>    * has only one fixed &drm_display_mode. The framebuffers are backed by the
> - * cma helper and have support for framebuffer flushing (dirty).
> + * shmem buffers and have support for framebuffer flushing (dirty).
>    * fbdev support is also included.
>    *
>    */
> @@ -37,84 +38,41 @@
>    */
>   
>   /**
> - * tinydrm_gem_cma_prime_import_sg_table - Produce a CMA GEM object from
> - *     another driver's scatter/gather table of pinned pages
> - * @drm: DRM device to import into
> - * @attach: DMA-BUF attachment
> - * @sgt: Scatter/gather table of pinned pages
> + * tinydrm_fb_destroy - Destroy framebuffer
> + * @fb: Framebuffer
>    *
> - * This function imports a scatter/gather table exported via DMA-BUF by
> - * another driver using drm_gem_cma_prime_import_sg_table(). It sets the
> - * kernel virtual address on the CMA object. Drivers should use this as their
> - * &drm_driver->gem_prime_import_sg_table callback if they need the virtual
> - * address. tinydrm_gem_cma_free_object() should be used in combination with
> - * this function.
> - *
> - * Returns:
> - * A pointer to a newly created GEM object or an ERR_PTR-encoded negative
> - * error code on failure.
> + * This function unmaps the virtual address on the backing buffer and destroys the framebuffer.
> + * Drivers should use this as their &drm_framebuffer_funcs->destroy callback.
>    */
> -struct drm_gem_object *
> -tinydrm_gem_cma_prime_import_sg_table(struct drm_device *drm,
> -				      struct dma_buf_attachment *attach,
> -				      struct sg_table *sgt)
> +void tinydrm_fb_destroy(struct drm_framebuffer *fb)
>   {
> -	struct drm_gem_cma_object *cma_obj;
> -	struct drm_gem_object *obj;
> -	void *vaddr;
> +	struct drm_gem_object *gem = drm_gem_fb_get_obj(fb, 0);
> +	struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(gem);
>   
> -	vaddr = dma_buf_vmap(attach->dmabuf);
> -	if (!vaddr) {
> -		DRM_ERROR("Failed to vmap PRIME buffer\n");
> -		return ERR_PTR(-ENOMEM);
> -	}
> -
> -	obj = drm_gem_cma_prime_import_sg_table(drm, attach, sgt);
> -	if (IS_ERR(obj)) {
> -		dma_buf_vunmap(attach->dmabuf, vaddr);
> -		return obj;
> -	}
> -
> -	cma_obj = to_drm_gem_cma_obj(obj);
> -	cma_obj->vaddr = vaddr;
> -
> -	return obj;
> +	drm_gem_vunmap(gem, shmem->vaddr);
> +	drm_gem_fb_destroy(fb);
>   }
> -EXPORT_SYMBOL(tinydrm_gem_cma_prime_import_sg_table);
> -
> -/**
> - * tinydrm_gem_cma_free_object - Free resources associated with a CMA GEM
> - *                               object
> - * @gem_obj: GEM object to free
> - *
> - * This function frees the backing memory of the CMA GEM object, cleans up the
> - * GEM object state and frees the memory used to store the object itself using
> - * drm_gem_cma_free_object(). It also handles PRIME buffers which has the kernel
> - * virtual address set by tinydrm_gem_cma_prime_import_sg_table(). Drivers
> - * can use this as their &drm_driver->gem_free_object_unlocked callback.
> - */
> -void tinydrm_gem_cma_free_object(struct drm_gem_object *gem_obj)
> -{
> -	if (gem_obj->import_attach) {
> -		struct drm_gem_cma_object *cma_obj;
> -
> -		cma_obj = to_drm_gem_cma_obj(gem_obj);
> -		dma_buf_vunmap(gem_obj->import_attach->dmabuf, cma_obj->vaddr);
> -		cma_obj->vaddr = NULL;
> -	}
> -
> -	drm_gem_cma_free_object(gem_obj);
> -}
> -EXPORT_SYMBOL_GPL(tinydrm_gem_cma_free_object);
> +EXPORT_SYMBOL(tinydrm_fb_destroy);
>   
>   static struct drm_framebuffer *
>   tinydrm_fb_create(struct drm_device *drm, struct drm_file *file_priv,
>   		  const struct drm_mode_fb_cmd2 *mode_cmd)
>   {
>   	struct tinydrm_device *tdev = drm->dev_private;
> +	struct drm_framebuffer *fb;
> +	void *vaddr;
>   
> -	return drm_gem_fb_create_with_funcs(drm, file_priv, mode_cmd,
> -					    tdev->fb_funcs);
> +	fb = drm_gem_fb_create_with_funcs(drm, file_priv, mode_cmd, tdev->fb_funcs);
> +	if (IS_ERR(fb))
> +		return fb;
> +
> +	vaddr = drm_gem_vmap(drm_gem_fb_get_obj(fb, 0));
> +	if (IS_ERR(vaddr)) {
> +		drm_gem_fb_destroy(fb);
> +		return ERR_CAST(vaddr);
> +	}
> +
> +	return fb;
>   }
>   
>   static const struct drm_mode_config_funcs tinydrm_mode_config_funcs = {
> diff --git a/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c b/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c
> index dcd390163a4a..f9d35acff23d 100644
> --- a/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c
> +++ b/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c
> @@ -9,12 +9,17 @@
>   
>   #include <linux/backlight.h>
>   #include <linux/dma-buf.h>
> +#include <linux/module.h>
>   #include <linux/pm.h>
>   #include <linux/spi/spi.h>
>   #include <linux/swab.h>
>   
> +#include <drm/drm_device.h>
> +#include <drm/drm_drv.h>
> +#include <drm/drm_fourcc.h>
>   #include <drm/tinydrm/tinydrm.h>
>   #include <drm/tinydrm/tinydrm-helpers.h>
> +#include <drm/drm_print.h>
>   
>   static unsigned int spi_max;
>   module_param(spi_max, uint, 0400);
> diff --git a/drivers/gpu/drm/tinydrm/ili9225.c b/drivers/gpu/drm/tinydrm/ili9225.c
> index 455fefe012f5..c24d6e4c834b 100644
> --- a/drivers/gpu/drm/tinydrm/ili9225.c
> +++ b/drivers/gpu/drm/tinydrm/ili9225.c
> @@ -20,8 +20,11 @@
>   #include <linux/spi/spi.h>
>   #include <video/mipi_display.h>
>   
> +#include <drm/drm_drv.h>
>   #include <drm/drm_fb_helper.h>
> +#include <drm/drm_fourcc.h>
>   #include <drm/drm_gem_framebuffer_helper.h>
> +#include <drm/drm_gem_shmem_helper.h>
>   #include <drm/tinydrm/mipi-dbi.h>
>   #include <drm/tinydrm/tinydrm-helpers.h>
>   
> @@ -77,7 +80,8 @@ static int ili9225_fb_dirty(struct drm_framebuffer *fb,
>   			    unsigned int color, struct drm_clip_rect *clips,
>   			    unsigned int num_clips)
>   {
> -	struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
> +	struct drm_gem_object *gem = drm_gem_fb_get_obj(fb, 0);
> +	struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(gem);
>   	struct tinydrm_device *tdev = fb->dev->dev_private;
>   	struct mipi_dbi *mipi = mipi_dbi_from_tinydrm(tdev);
>   	bool swap = mipi->swap_bytes;
> @@ -104,7 +108,7 @@ static int ili9225_fb_dirty(struct drm_framebuffer *fb,
>   		if (ret)
>   			return ret;
>   	} else {
> -		tr = cma_obj->vaddr;
> +		tr = shmem->vaddr;
>   	}
>   
>   	switch (mipi->rotation) {
> @@ -157,7 +161,7 @@ static int ili9225_fb_dirty(struct drm_framebuffer *fb,
>   }
>   
>   static const struct drm_framebuffer_funcs ili9225_fb_funcs = {
> -	.destroy	= drm_gem_fb_destroy,
> +	.destroy	= tinydrm_fb_destroy,
>   	.create_handle	= drm_gem_fb_create_handle,
>   	.dirty		= tinydrm_fb_dirty,
>   };
> @@ -361,13 +365,13 @@ static const struct drm_display_mode ili9225_mode = {
>   	TINYDRM_MODE(176, 220, 35, 44),
>   };
>   
> -DEFINE_DRM_GEM_CMA_FOPS(ili9225_fops);
> +DEFINE_DRM_GEM_SHMEM_FOPS(ili9225_fops);
>   
>   static struct drm_driver ili9225_driver = {
>   	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
>   				  DRIVER_ATOMIC,
>   	.fops			= &ili9225_fops,
> -	TINYDRM_GEM_DRIVER_OPS,
> +	DRM_GEM_SHMEM_DRIVER_OPS,
>   	.name			= "ili9225",
>   	.desc			= "Ilitek ILI9225",
>   	.date			= "20171106",
> diff --git a/drivers/gpu/drm/tinydrm/ili9341.c b/drivers/gpu/drm/tinydrm/ili9341.c
> index 6701037749a7..7a80f8e6d6f3 100644
> --- a/drivers/gpu/drm/tinydrm/ili9341.c
> +++ b/drivers/gpu/drm/tinydrm/ili9341.c
> @@ -15,8 +15,10 @@
>   #include <linux/property.h>
>   #include <linux/spi/spi.h>
>   
> +#include <drm/drm_drv.h>
>   #include <drm/drm_fb_helper.h>
>   #include <drm/drm_gem_framebuffer_helper.h>
> +#include <drm/drm_gem_shmem_helper.h>
>   #include <drm/drm_modeset_helper.h>
>   #include <drm/tinydrm/mipi-dbi.h>
>   #include <drm/tinydrm/tinydrm-helpers.h>
> @@ -139,12 +141,12 @@ static const struct drm_display_mode yx240qv29_mode = {
>   	TINYDRM_MODE(240, 320, 37, 49),
>   };
>   
> -DEFINE_DRM_GEM_CMA_FOPS(ili9341_fops);
> +DEFINE_DRM_GEM_SHMEM_FOPS(ili9341_fops);
>   
>   static struct drm_driver ili9341_driver = {
>   	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_ATOMIC,
>   	.fops			= &ili9341_fops,
> -	TINYDRM_GEM_DRIVER_OPS,
> +	DRM_GEM_SHMEM_DRIVER_OPS,
>   	.debugfs_init		= mipi_dbi_debugfs_init,
>   	.name			= "ili9341",
>   	.desc			= "Ilitek ILI9341",
> diff --git a/drivers/gpu/drm/tinydrm/mi0283qt.c b/drivers/gpu/drm/tinydrm/mi0283qt.c
> index d7bb4c5e6657..b5837a6b3633 100644
> --- a/drivers/gpu/drm/tinydrm/mi0283qt.c
> +++ b/drivers/gpu/drm/tinydrm/mi0283qt.c
> @@ -17,9 +17,11 @@
>   #include <linux/regulator/consumer.h>
>   #include <linux/spi/spi.h>
>   
> +#include <drm/drm_drv.h>
>   #include <drm/drm_fb_helper.h>
>   #include <drm/drm_modeset_helper.h>
>   #include <drm/drm_gem_framebuffer_helper.h>
> +#include <drm/drm_gem_shmem_helper.h>
>   #include <drm/tinydrm/mipi-dbi.h>
>   #include <drm/tinydrm/tinydrm-helpers.h>
>   #include <video/mipi_display.h>
> @@ -147,13 +149,13 @@ static const struct drm_display_mode mi0283qt_mode = {
>   	TINYDRM_MODE(320, 240, 58, 43),
>   };
>   
> -DEFINE_DRM_GEM_CMA_FOPS(mi0283qt_fops);
> +DEFINE_DRM_GEM_SHMEM_FOPS(mi0283qt_fops);
>   
>   static struct drm_driver mi0283qt_driver = {
>   	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
>   				  DRIVER_ATOMIC,
>   	.fops			= &mi0283qt_fops,
> -	TINYDRM_GEM_DRIVER_OPS,
> +	DRM_GEM_SHMEM_DRIVER_OPS,
>   	.debugfs_init		= mipi_dbi_debugfs_init,
>   	.name			= "mi0283qt",
>   	.desc			= "Multi-Inno MI0283QT",
> diff --git a/drivers/gpu/drm/tinydrm/mipi-dbi.c b/drivers/gpu/drm/tinydrm/mipi-dbi.c
> index cb3441e51d5f..e0f59177c2ef 100644
> --- a/drivers/gpu/drm/tinydrm/mipi-dbi.c
> +++ b/drivers/gpu/drm/tinydrm/mipi-dbi.c
> @@ -9,10 +9,15 @@
>    * (at your option) any later version.
>    */
>   
> +#include <drm/drm_device.h>
> +#include <drm/drm_drv.h>
> +#include <drm/drm_fourcc.h>
>   #include <drm/drm_gem_framebuffer_helper.h>
> +#include <drm/drm_gem_shmem_helper.h>
>   #include <drm/tinydrm/mipi-dbi.h>
>   #include <drm/tinydrm/tinydrm-helpers.h>
>   #include <linux/debugfs.h>
> +#include <linux/delay.h>
>   #include <linux/dma-buf.h>
>   #include <linux/gpio/consumer.h>
>   #include <linux/module.h>
> @@ -167,10 +172,11 @@ EXPORT_SYMBOL(mipi_dbi_command_buf);
>   int mipi_dbi_buf_copy(void *dst, struct drm_framebuffer *fb,
>   		      struct drm_clip_rect *clip, bool swap)
>   {
> -	struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
> -	struct dma_buf_attachment *import_attach = cma_obj->base.import_attach;
> +	struct drm_gem_object *gem = drm_gem_fb_get_obj(fb, 0);
> +	struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(gem);
> +	struct dma_buf_attachment *import_attach = gem->import_attach;
>   	struct drm_format_name_buf format_name;
> -	void *src = cma_obj->vaddr;
> +	void *src = shmem->vaddr;
>   	int ret = 0;
>   
>   	if (import_attach) {
> @@ -210,7 +216,8 @@ static int mipi_dbi_fb_dirty(struct drm_framebuffer *fb,
>   			     struct drm_clip_rect *clips,
>   			     unsigned int num_clips)
>   {
> -	struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
> +	struct drm_gem_object *gem = drm_gem_fb_get_obj(fb, 0);
> +	struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(gem);
>   	struct tinydrm_device *tdev = fb->dev->dev_private;
>   	struct mipi_dbi *mipi = mipi_dbi_from_tinydrm(tdev);
>   	bool swap = mipi->swap_bytes;
> @@ -235,7 +242,7 @@ static int mipi_dbi_fb_dirty(struct drm_framebuffer *fb,
>   		if (ret)
>   			return ret;
>   	} else {
> -		tr = cma_obj->vaddr;
> +		tr = shmem->vaddr;
>   	}
>   
>   	mipi_dbi_command(mipi, MIPI_DCS_SET_COLUMN_ADDRESS,
> @@ -252,7 +259,7 @@ static int mipi_dbi_fb_dirty(struct drm_framebuffer *fb,
>   }
>   
>   static const struct drm_framebuffer_funcs mipi_dbi_fb_funcs = {
> -	.destroy	= drm_gem_fb_destroy,
> +	.destroy	= tinydrm_fb_destroy,
>   	.create_handle	= drm_gem_fb_create_handle,
>   	.dirty		= tinydrm_fb_dirty,
>   };
> @@ -882,31 +889,12 @@ int mipi_dbi_spi_init(struct spi_device *spi, struct mipi_dbi *mipi,
>   {
>   	size_t tx_size = tinydrm_spi_max_transfer_size(spi, 0);
>   	struct device *dev = &spi->dev;
> -	int ret;
>   
>   	if (tx_size < 16) {
>   		DRM_ERROR("SPI transmit buffer too small: %zu\n", tx_size);
>   		return -EINVAL;
>   	}
>   
> -	/*
> -	 * Even though it's not the SPI device that does DMA (the master does),
> -	 * the dma mask is necessary for the dma_alloc_wc() in
> -	 * drm_gem_cma_create(). The dma_addr returned will be a physical
> -	 * adddress which might be different from the bus address, but this is
> -	 * not a problem since the address will not be used.
> -	 * The virtual address is used in the transfer and the SPI core
> -	 * re-maps it on the SPI master device using the DMA streaming API
> -	 * (spi_map_buf()).
> -	 */
> -	if (!dev->coherent_dma_mask) {
> -		ret = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32));
> -		if (ret) {
> -			dev_warn(dev, "Failed to set dma mask %d\n", ret);
> -			return ret;
> -		}
> -	}
> -
>   	mipi->spi = spi;
>   	mipi->read_commands = mipi_dbi_dcs_read_commands;
>   
> diff --git a/drivers/gpu/drm/tinydrm/repaper.c b/drivers/gpu/drm/tinydrm/repaper.c
> index 50a1d4216ce7..82d8c6bf0c91 100644
> --- a/drivers/gpu/drm/tinydrm/repaper.c
> +++ b/drivers/gpu/drm/tinydrm/repaper.c
> @@ -26,7 +26,9 @@
>   #include <linux/spi/spi.h>
>   #include <linux/thermal.h>
>   
> +#include <drm/drm_drv.h>
>   #include <drm/drm_gem_framebuffer_helper.h>
> +#include <drm/drm_gem_shmem_helper.h>
>   #include <drm/tinydrm/tinydrm.h>
>   #include <drm/tinydrm/tinydrm-helpers.h>
>   
> @@ -526,8 +528,9 @@ static int repaper_fb_dirty(struct drm_framebuffer *fb,
>   			    struct drm_clip_rect *clips,
>   			    unsigned int num_clips)
>   {
> -	struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
> -	struct dma_buf_attachment *import_attach = cma_obj->base.import_attach;
> +	struct drm_gem_object *gem = drm_gem_fb_get_obj(fb, 0);
> +	struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(gem);
> +	struct dma_buf_attachment *import_attach = gem->import_attach;
>   	struct tinydrm_device *tdev = fb->dev->dev_private;
>   	struct repaper_epd *epd = epd_from_tinydrm(tdev);
>   	struct drm_clip_rect clip;
> @@ -559,7 +562,7 @@ static int repaper_fb_dirty(struct drm_framebuffer *fb,
>   			goto out_free;
>   	}
>   
> -	tinydrm_xrgb8888_to_gray8(buf, cma_obj->vaddr, fb, &clip);
> +	tinydrm_xrgb8888_to_gray8(buf, shmem->vaddr, fb, &clip);
>   
>   	if (import_attach) {
>   		ret = dma_buf_end_cpu_access(import_attach->dmabuf,
> @@ -624,7 +627,7 @@ static int repaper_fb_dirty(struct drm_framebuffer *fb,
>   }
>   
>   static const struct drm_framebuffer_funcs repaper_fb_funcs = {
> -	.destroy	= drm_gem_fb_destroy,
> +	.destroy	= tinydrm_fb_destroy,
>   	.create_handle	= drm_gem_fb_create_handle,
>   	.dirty		= tinydrm_fb_dirty,
>   };
> @@ -876,13 +879,13 @@ static const struct drm_display_mode repaper_e2271cs021_mode = {
>   static const u8 repaper_e2271cs021_cs[] = { 0x00, 0x00, 0x00, 0x7f,
>   					    0xff, 0xfe, 0x00, 0x00 };
>   
> -DEFINE_DRM_GEM_CMA_FOPS(repaper_fops);
> +DEFINE_DRM_GEM_SHMEM_FOPS(repaper_fops);
>   
>   static struct drm_driver repaper_driver = {
>   	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
>   				  DRIVER_ATOMIC,
>   	.fops			= &repaper_fops,
> -	TINYDRM_GEM_DRIVER_OPS,
> +	DRM_GEM_SHMEM_DRIVER_OPS,
>   	.name			= "repaper",
>   	.desc			= "Pervasive Displays RePaper e-ink panels",
>   	.date			= "20170405",
> @@ -929,15 +932,6 @@ static int repaper_probe(struct spi_device *spi)
>   		model = spi_id->driver_data;
>   	}
>   
> -	/* The SPI device is used to allocate dma memory */
> -	if (!dev->coherent_dma_mask) {
> -		ret = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32));
> -		if (ret) {
> -			dev_warn(dev, "Failed to set dma mask %d\n", ret);
> -			return ret;
> -		}
> -	}
> -
>   	epd = devm_kzalloc(dev, sizeof(*epd), GFP_KERNEL);
>   	if (!epd)
>   		return -ENOMEM;
> diff --git a/drivers/gpu/drm/tinydrm/st7586.c b/drivers/gpu/drm/tinydrm/st7586.c
> index 2fcbc3067d71..340c9be2613b 100644
> --- a/drivers/gpu/drm/tinydrm/st7586.c
> +++ b/drivers/gpu/drm/tinydrm/st7586.c
> @@ -17,8 +17,10 @@
>   #include <linux/spi/spi.h>
>   #include <video/mipi_display.h>
>   
> +#include <drm/drm_drv.h>
>   #include <drm/drm_fb_helper.h>
>   #include <drm/drm_gem_framebuffer_helper.h>
> +#include <drm/drm_gem_shmem_helper.h>
>   #include <drm/tinydrm/mipi-dbi.h>
>   #include <drm/tinydrm/tinydrm-helpers.h>
>   
> @@ -88,9 +90,10 @@ static void st7586_xrgb8888_to_gray332(u8 *dst, void *vaddr,
>   static int st7586_buf_copy(void *dst, struct drm_framebuffer *fb,
>   			   struct drm_clip_rect *clip)
>   {
> -	struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
> -	struct dma_buf_attachment *import_attach = cma_obj->base.import_attach;
> -	void *src = cma_obj->vaddr;
> +	struct drm_gem_object *gem = drm_gem_fb_get_obj(fb, 0);
> +	struct dma_buf_attachment *import_attach = gem->import_attach;
> +	struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(gem);
> +	void *src = shmem->vaddr;
>   	int ret = 0;
>   
>   	if (import_attach) {
> @@ -156,7 +159,7 @@ static int st7586_fb_dirty(struct drm_framebuffer *fb,
>   }
>   
>   static const struct drm_framebuffer_funcs st7586_fb_funcs = {
> -	.destroy	= drm_gem_fb_destroy,
> +	.destroy	= tinydrm_fb_destroy,
>   	.create_handle	= drm_gem_fb_create_handle,
>   	.dirty		= tinydrm_fb_dirty,
>   };
> @@ -297,13 +300,13 @@ static const struct drm_display_mode st7586_mode = {
>   	TINYDRM_MODE(178, 128, 37, 27),
>   };
>   
> -DEFINE_DRM_GEM_CMA_FOPS(st7586_fops);
> +DEFINE_DRM_GEM_SHMEM_FOPS(st7586_fops);
>   
>   static struct drm_driver st7586_driver = {
>   	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
>   				  DRIVER_ATOMIC,
>   	.fops			= &st7586_fops,
> -	TINYDRM_GEM_DRIVER_OPS,
> +	DRM_GEM_SHMEM_DRIVER_OPS,
>   	.debugfs_init		= mipi_dbi_debugfs_init,
>   	.name			= "st7586",
>   	.desc			= "Sitronix ST7586",
> diff --git a/drivers/gpu/drm/tinydrm/st7735r.c b/drivers/gpu/drm/tinydrm/st7735r.c
> index 3081bc57c116..1108088a1a03 100644
> --- a/drivers/gpu/drm/tinydrm/st7735r.c
> +++ b/drivers/gpu/drm/tinydrm/st7735r.c
> @@ -14,8 +14,10 @@
>   #include <linux/spi/spi.h>
>   #include <video/mipi_display.h>
>   
> +#include <drm/drm_drv.h>
>   #include <drm/drm_fb_helper.h>
>   #include <drm/drm_gem_framebuffer_helper.h>
> +#include <drm/drm_gem_shmem_helper.h>
>   #include <drm/tinydrm/mipi-dbi.h>
>   #include <drm/tinydrm/tinydrm-helpers.h>
>   
> @@ -113,13 +115,13 @@ static const struct drm_display_mode jd_t18003_t01_mode = {
>   	TINYDRM_MODE(128, 160, 28, 35),
>   };
>   
> -DEFINE_DRM_GEM_CMA_FOPS(st7735r_fops);
> +DEFINE_DRM_GEM_SHMEM_FOPS(st7735r_fops);
>   
>   static struct drm_driver st7735r_driver = {
>   	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
>   				  DRIVER_ATOMIC,
>   	.fops			= &st7735r_fops,
> -	TINYDRM_GEM_DRIVER_OPS,
> +	DRM_GEM_SHMEM_DRIVER_OPS,
>   	.debugfs_init		= mipi_dbi_debugfs_init,
>   	.name			= "st7735r",
>   	.desc			= "Sitronix ST7735R",
> diff --git a/include/drm/tinydrm/tinydrm.h b/include/drm/tinydrm/tinydrm.h
> index fe9827d0ca8a..e2cb254125c5 100644
> --- a/include/drm/tinydrm/tinydrm.h
> +++ b/include/drm/tinydrm/tinydrm.h
> @@ -10,10 +10,15 @@
>   #ifndef __LINUX_TINYDRM_H
>   #define __LINUX_TINYDRM_H
>   
> -#include <drm/drm_gem_cma_helper.h>
> -#include <drm/drm_fb_cma_helper.h>
> +#include <linux/mutex.h>
>   #include <drm/drm_simple_kms_helper.h>
>   
> +struct drm_driver;
> +struct drm_framebuffer;
> +struct drm_file;
> +struct drm_clip_rect;
> +struct drm_framebuffer_funcs;
> +
>   /**
>    * struct tinydrm_device - tinydrm device
>    */
> @@ -53,27 +58,6 @@ pipe_to_tinydrm(struct drm_simple_display_pipe *pipe)
>   	return container_of(pipe, struct tinydrm_device, pipe);
>   }
>   
> -/**
> - * TINYDRM_GEM_DRIVER_OPS - default tinydrm gem operations
> - *
> - * This macro provides a shortcut for setting the tinydrm GEM operations in
> - * the &drm_driver structure.
> - */
> -#define TINYDRM_GEM_DRIVER_OPS \
> -	.gem_free_object_unlocked = tinydrm_gem_cma_free_object, \
> -	.gem_print_info		= drm_gem_cma_print_info, \
> -	.gem_vm_ops		= &drm_gem_cma_vm_ops, \
> -	.prime_handle_to_fd	= drm_gem_prime_handle_to_fd, \
> -	.prime_fd_to_handle	= drm_gem_prime_fd_to_handle, \
> -	.gem_prime_import	= drm_gem_prime_import, \
> -	.gem_prime_export	= drm_gem_prime_export, \
> -	.gem_prime_get_sg_table	= drm_gem_cma_prime_get_sg_table, \
> -	.gem_prime_import_sg_table = tinydrm_gem_cma_prime_import_sg_table, \
> -	.gem_prime_vmap		= drm_gem_cma_prime_vmap, \
> -	.gem_prime_vunmap	= drm_gem_cma_prime_vunmap, \
> -	.gem_prime_mmap		= drm_gem_cma_prime_mmap, \
> -	.dumb_create		= drm_gem_cma_dumb_create
> -
>   /**
>    * TINYDRM_MODE - tinydrm display mode
>    * @hd: Horizontal resolution, width
> @@ -97,11 +81,7 @@ pipe_to_tinydrm(struct drm_simple_display_pipe *pipe)
>   	.type = DRM_MODE_TYPE_DRIVER, \
>   	.clock = 1 /* pass validation */
>   
> -void tinydrm_gem_cma_free_object(struct drm_gem_object *gem_obj);
> -struct drm_gem_object *
> -tinydrm_gem_cma_prime_import_sg_table(struct drm_device *drm,
> -				      struct dma_buf_attachment *attach,
> -				      struct sg_table *sgt);
> +void tinydrm_fb_destroy(struct drm_framebuffer *fb);
>   int devm_tinydrm_init(struct device *parent, struct tinydrm_device *tdev,
>   		      const struct drm_framebuffer_funcs *fb_funcs,
>   		      struct drm_driver *driver);



More information about the Intel-gfx mailing list