drm/mipi-dbi: Remove dependency on GEM CMA helper library
The MIPI DBI helpers access struct drm_gem_cma_object.vaddr in a few places. Replace all instances with the correct generic GEM functions. Use drm_gem_fb_vmap() for mapping a framebuffer's GEM objects and drm_gem_fb_vunmap() for unmapping them. This removes the dependency on CMA helpers within MIPI DBI. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: https://patchwork.freedesktop.org/patch/msgid/20211106193509.17472-2-tzimmermann@suse.de
This commit is contained in:
Родитель
e580ea25c0
Коммит
c47160d8ed
|
@ -15,9 +15,10 @@
|
|||
#include <drm/drm_connector.h>
|
||||
#include <drm/drm_damage_helper.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_gem_cma_helper.h>
|
||||
#include <drm/drm_file.h>
|
||||
#include <drm/drm_format_helper.h>
|
||||
#include <drm/drm_fourcc.h>
|
||||
#include <drm/drm_gem.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drm_mipi_dbi.h>
|
||||
#include <drm/drm_modes.h>
|
||||
|
@ -200,13 +201,19 @@ int mipi_dbi_buf_copy(void *dst, struct drm_framebuffer *fb,
|
|||
struct drm_rect *clip, bool swap)
|
||||
{
|
||||
struct drm_gem_object *gem = drm_gem_fb_get_obj(fb, 0);
|
||||
struct drm_gem_cma_object *cma_obj = to_drm_gem_cma_obj(gem);
|
||||
void *src = cma_obj->vaddr;
|
||||
struct dma_buf_map map[DRM_FORMAT_MAX_PLANES];
|
||||
struct dma_buf_map data[DRM_FORMAT_MAX_PLANES];
|
||||
void *src;
|
||||
int ret;
|
||||
|
||||
ret = drm_gem_fb_begin_cpu_access(fb, DMA_FROM_DEVICE);
|
||||
if (ret)
|
||||
return ret;
|
||||
src = data[0].vaddr; /* TODO: Use mapping abstraction properly */
|
||||
|
||||
ret = drm_gem_fb_vmap(fb, map, data);
|
||||
if (ret)
|
||||
goto out_drm_gem_fb_end_cpu_access;
|
||||
|
||||
switch (fb->format->format) {
|
||||
case DRM_FORMAT_RGB565:
|
||||
|
@ -221,9 +228,11 @@ int mipi_dbi_buf_copy(void *dst, struct drm_framebuffer *fb,
|
|||
default:
|
||||
drm_err_once(fb->dev, "Format is not supported: %p4cc\n",
|
||||
&fb->format->format);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
drm_gem_fb_vunmap(fb, map);
|
||||
out_drm_gem_fb_end_cpu_access:
|
||||
drm_gem_fb_end_cpu_access(fb, DMA_FROM_DEVICE);
|
||||
|
||||
return ret;
|
||||
|
@ -249,8 +258,8 @@ static void mipi_dbi_set_window_address(struct mipi_dbi_dev *dbidev,
|
|||
|
||||
static void mipi_dbi_fb_dirty(struct drm_framebuffer *fb, struct drm_rect *rect)
|
||||
{
|
||||
struct drm_gem_object *gem = drm_gem_fb_get_obj(fb, 0);
|
||||
struct drm_gem_cma_object *cma_obj = to_drm_gem_cma_obj(gem);
|
||||
struct dma_buf_map map[DRM_FORMAT_MAX_PLANES];
|
||||
struct dma_buf_map data[DRM_FORMAT_MAX_PLANES];
|
||||
struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(fb->dev);
|
||||
unsigned int height = rect->y2 - rect->y1;
|
||||
unsigned int width = rect->x2 - rect->x1;
|
||||
|
@ -266,6 +275,10 @@ static void mipi_dbi_fb_dirty(struct drm_framebuffer *fb, struct drm_rect *rect)
|
|||
if (!drm_dev_enter(fb->dev, &idx))
|
||||
return;
|
||||
|
||||
ret = drm_gem_fb_vmap(fb, map, data);
|
||||
if (ret)
|
||||
goto err_drm_dev_exit;
|
||||
|
||||
full = width == fb->width && height == fb->height;
|
||||
|
||||
DRM_DEBUG_KMS("Flushing [FB:%d] " DRM_RECT_FMT "\n", fb->base.id, DRM_RECT_ARG(rect));
|
||||
|
@ -277,7 +290,7 @@ static void mipi_dbi_fb_dirty(struct drm_framebuffer *fb, struct drm_rect *rect)
|
|||
if (ret)
|
||||
goto err_msg;
|
||||
} else {
|
||||
tr = cma_obj->vaddr;
|
||||
tr = data[0].vaddr; /* TODO: Use mapping abstraction properly */
|
||||
}
|
||||
|
||||
mipi_dbi_set_window_address(dbidev, rect->x1, rect->x2 - 1, rect->y1,
|
||||
|
@ -289,6 +302,9 @@ err_msg:
|
|||
if (ret)
|
||||
drm_err_once(fb->dev, "Failed to update display %d\n", ret);
|
||||
|
||||
drm_gem_fb_vunmap(fb, map);
|
||||
|
||||
err_drm_dev_exit:
|
||||
drm_dev_exit(idx);
|
||||
}
|
||||
|
||||
|
@ -1117,8 +1133,8 @@ int mipi_dbi_spi_init(struct spi_device *spi, struct mipi_dbi *dbi,
|
|||
|
||||
/*
|
||||
* 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
|
||||
* the dma mask is necessary for the dma_alloc_wc() in the GEM code
|
||||
* (e.g., drm_gem_cma_create()). The dma_addr returned will be a physical
|
||||
* address 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
|
||||
|
|
Загрузка…
Ссылка в новой задаче