Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+25 -9
+25 -9
drivers/gpu/drm/drm_mipi_dbi.c
··· 15 15 #include <drm/drm_connector.h> 16 16 #include <drm/drm_damage_helper.h> 17 17 #include <drm/drm_drv.h> 18 - #include <drm/drm_gem_cma_helper.h> 18 + #include <drm/drm_file.h> 19 19 #include <drm/drm_format_helper.h> 20 20 #include <drm/drm_fourcc.h> 21 + #include <drm/drm_gem.h> 21 22 #include <drm/drm_gem_framebuffer_helper.h> 22 23 #include <drm/drm_mipi_dbi.h> 23 24 #include <drm/drm_modes.h> ··· 201 200 struct drm_rect *clip, bool swap) 202 201 { 203 202 struct drm_gem_object *gem = drm_gem_fb_get_obj(fb, 0); 204 - struct drm_gem_cma_object *cma_obj = to_drm_gem_cma_obj(gem); 205 - void *src = cma_obj->vaddr; 203 + struct dma_buf_map map[DRM_FORMAT_MAX_PLANES]; 204 + struct dma_buf_map data[DRM_FORMAT_MAX_PLANES]; 205 + void *src; 206 206 int ret; 207 207 208 208 ret = drm_gem_fb_begin_cpu_access(fb, DMA_FROM_DEVICE); 209 209 if (ret) 210 210 return ret; 211 + src = data[0].vaddr; /* TODO: Use mapping abstraction properly */ 212 + 213 + ret = drm_gem_fb_vmap(fb, map, data); 214 + if (ret) 215 + goto out_drm_gem_fb_end_cpu_access; 211 216 212 217 switch (fb->format->format) { 213 218 case DRM_FORMAT_RGB565: ··· 228 221 default: 229 222 drm_err_once(fb->dev, "Format is not supported: %p4cc\n", 230 223 &fb->format->format); 231 - return -EINVAL; 224 + ret = -EINVAL; 232 225 } 233 226 227 + drm_gem_fb_vunmap(fb, map); 228 + out_drm_gem_fb_end_cpu_access: 234 229 drm_gem_fb_end_cpu_access(fb, DMA_FROM_DEVICE); 235 230 236 231 return ret; ··· 258 249 259 250 static void mipi_dbi_fb_dirty(struct drm_framebuffer *fb, struct drm_rect *rect) 260 251 { 261 - struct drm_gem_object *gem = drm_gem_fb_get_obj(fb, 0); 262 - struct drm_gem_cma_object *cma_obj = to_drm_gem_cma_obj(gem); 252 + struct dma_buf_map map[DRM_FORMAT_MAX_PLANES]; 253 + struct dma_buf_map data[DRM_FORMAT_MAX_PLANES]; 263 254 struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(fb->dev); 264 255 unsigned int height = rect->y2 - rect->y1; 265 256 unsigned int width = rect->x2 - rect->x1; ··· 275 266 if (!drm_dev_enter(fb->dev, &idx)) 276 267 return; 277 268 269 + ret = drm_gem_fb_vmap(fb, map, data); 270 + if (ret) 271 + goto err_drm_dev_exit; 272 + 278 273 full = width == fb->width && height == fb->height; 279 274 280 275 DRM_DEBUG_KMS("Flushing [FB:%d] " DRM_RECT_FMT "\n", fb->base.id, DRM_RECT_ARG(rect)); ··· 290 277 if (ret) 291 278 goto err_msg; 292 279 } else { 293 - tr = cma_obj->vaddr; 280 + tr = data[0].vaddr; /* TODO: Use mapping abstraction properly */ 294 281 } 295 282 296 283 mipi_dbi_set_window_address(dbidev, rect->x1, rect->x2 - 1, rect->y1, ··· 302 289 if (ret) 303 290 drm_err_once(fb->dev, "Failed to update display %d\n", ret); 304 291 292 + drm_gem_fb_vunmap(fb, map); 293 + 294 + err_drm_dev_exit: 305 295 drm_dev_exit(idx); 306 296 } 307 297 ··· 1133 1117 1134 1118 /* 1135 1119 * Even though it's not the SPI device that does DMA (the master does), 1136 - * the dma mask is necessary for the dma_alloc_wc() in 1137 - * drm_gem_cma_create(). The dma_addr returned will be a physical 1120 + * the dma mask is necessary for the dma_alloc_wc() in the GEM code 1121 + * (e.g., drm_gem_cma_create()). The dma_addr returned will be a physical 1138 1122 * address which might be different from the bus address, but this is 1139 1123 * not a problem since the address will not be used. 1140 1124 * The virtual address is used in the transfer and the SPI core