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

drm/udl: Move udl_handle_damage() into udl_modeset.c

The only caller of udl_handle_damage() in the plane-update function
in udl_modeset.c. Move udl_handle_damage() there.

v2:
* remove udl_fb.c in a separate patch

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191210084905.5570-9-tzimmermann@suse.de

+112 -114
-3
drivers/gpu/drm/udl/udl_drv.h
··· 86 86 struct drm_gem_object *udl_driver_gem_create_object(struct drm_device *dev, 87 87 size_t size); 88 88 89 - int udl_handle_damage(struct drm_framebuffer *fb, int x, int y, 90 - int width, int height); 91 - 92 89 int udl_drop_usb(struct drm_device *dev); 93 90 94 91 #define CMD_WRITE_RAW8 "\xAF\x60" /**< 8 bit raw write command. */
-111
drivers/gpu/drm/udl/udl_fb.c
··· 9 9 */ 10 10 11 11 #include <linux/moduleparam.h> 12 - #include <linux/dma-buf.h> 13 - 14 - #include <drm/drm_fourcc.h> 15 - #include <drm/drm_gem_shmem_helper.h> 16 12 17 13 #include "udl_drv.h" 18 14 ··· 49 53 return (DLO_RG16(red, grn) << 8) + DLO_GB16(grn, blu); 50 54 } 51 55 #endif 52 - 53 - static long udl_log_cpp(unsigned int cpp) 54 - { 55 - if (WARN_ON(!is_power_of_2(cpp))) 56 - return -EINVAL; 57 - return __ffs(cpp); 58 - } 59 - 60 - static int udl_aligned_damage_clip(struct drm_rect *clip, int x, int y, 61 - int width, int height) 62 - { 63 - int x1, x2; 64 - 65 - if (WARN_ON_ONCE(x < 0) || 66 - WARN_ON_ONCE(y < 0) || 67 - WARN_ON_ONCE(width < 0) || 68 - WARN_ON_ONCE(height < 0)) 69 - return -EINVAL; 70 - 71 - x1 = ALIGN_DOWN(x, sizeof(unsigned long)); 72 - x2 = ALIGN(width + (x - x1), sizeof(unsigned long)) + x1; 73 - 74 - clip->x1 = x1; 75 - clip->y1 = y; 76 - clip->x2 = x2; 77 - clip->y2 = y + height; 78 - 79 - return 0; 80 - } 81 - 82 - int udl_handle_damage(struct drm_framebuffer *fb, int x, int y, 83 - int width, int height) 84 - { 85 - struct drm_device *dev = fb->dev; 86 - struct dma_buf_attachment *import_attach = fb->obj[0]->import_attach; 87 - int i, ret, tmp_ret; 88 - char *cmd; 89 - struct urb *urb; 90 - struct drm_rect clip; 91 - int log_bpp; 92 - void *vaddr; 93 - 94 - ret = udl_log_cpp(fb->format->cpp[0]); 95 - if (ret < 0) 96 - return ret; 97 - log_bpp = ret; 98 - 99 - ret = udl_aligned_damage_clip(&clip, x, y, width, height); 100 - if (ret) 101 - return ret; 102 - else if ((clip.x2 > fb->width) || (clip.y2 > fb->height)) 103 - return -EINVAL; 104 - 105 - if (import_attach) { 106 - ret = dma_buf_begin_cpu_access(import_attach->dmabuf, 107 - DMA_FROM_DEVICE); 108 - if (ret) 109 - return ret; 110 - } 111 - 112 - vaddr = drm_gem_shmem_vmap(fb->obj[0]); 113 - if (IS_ERR(vaddr)) { 114 - DRM_ERROR("failed to vmap fb\n"); 115 - goto out_dma_buf_end_cpu_access; 116 - } 117 - 118 - urb = udl_get_urb(dev); 119 - if (!urb) 120 - goto out_drm_gem_shmem_vunmap; 121 - cmd = urb->transfer_buffer; 122 - 123 - for (i = clip.y1; i < clip.y2; i++) { 124 - const int line_offset = fb->pitches[0] * i; 125 - const int byte_offset = line_offset + (clip.x1 << log_bpp); 126 - const int dev_byte_offset = (fb->width * i + clip.x1) << log_bpp; 127 - const int byte_width = (clip.x2 - clip.x1) << log_bpp; 128 - ret = udl_render_hline(dev, log_bpp, &urb, (char *)vaddr, 129 - &cmd, byte_offset, dev_byte_offset, 130 - byte_width); 131 - if (ret) 132 - goto out_drm_gem_shmem_vunmap; 133 - } 134 - 135 - if (cmd > (char *) urb->transfer_buffer) { 136 - /* Send partial buffer remaining before exiting */ 137 - int len; 138 - if (cmd < (char *) urb->transfer_buffer + urb->transfer_buffer_length) 139 - *cmd++ = 0xAF; 140 - len = cmd - (char *) urb->transfer_buffer; 141 - ret = udl_submit_urb(dev, urb, len); 142 - } else 143 - udl_urb_completion(urb); 144 - 145 - ret = 0; 146 - 147 - out_drm_gem_shmem_vunmap: 148 - drm_gem_shmem_vunmap(fb->obj[0], vaddr); 149 - out_dma_buf_end_cpu_access: 150 - if (import_attach) { 151 - tmp_ret = dma_buf_end_cpu_access(import_attach->dmabuf, 152 - DMA_FROM_DEVICE); 153 - if (tmp_ret && !ret) 154 - ret = tmp_ret; /* only update ret if not set yet */ 155 - } 156 - 157 - return ret; 158 - }
+112
drivers/gpu/drm/udl/udl_modeset.c
··· 9 9 10 10 */ 11 11 12 + #include <linux/dma-buf.h> 13 + 12 14 #include <drm/drm_atomic_helper.h> 13 15 #include <drm/drm_crtc_helper.h> 14 16 #include <drm/drm_damage_helper.h> 17 + #include <drm/drm_fourcc.h> 15 18 #include <drm/drm_gem_framebuffer_helper.h> 19 + #include <drm/drm_gem_shmem_helper.h> 16 20 #include <drm/drm_modeset_helper_vtables.h> 17 21 #include <drm/drm_vblank.h> 18 22 ··· 235 231 retval = udl_submit_urb(dev, urb, udl->mode_buf_len); 236 232 DRM_DEBUG("write mode info %d\n", udl->mode_buf_len); 237 233 return retval; 234 + } 235 + 236 + static long udl_log_cpp(unsigned int cpp) 237 + { 238 + if (WARN_ON(!is_power_of_2(cpp))) 239 + return -EINVAL; 240 + return __ffs(cpp); 241 + } 242 + 243 + static int udl_aligned_damage_clip(struct drm_rect *clip, int x, int y, 244 + int width, int height) 245 + { 246 + int x1, x2; 247 + 248 + if (WARN_ON_ONCE(x < 0) || 249 + WARN_ON_ONCE(y < 0) || 250 + WARN_ON_ONCE(width < 0) || 251 + WARN_ON_ONCE(height < 0)) 252 + return -EINVAL; 253 + 254 + x1 = ALIGN_DOWN(x, sizeof(unsigned long)); 255 + x2 = ALIGN(width + (x - x1), sizeof(unsigned long)) + x1; 256 + 257 + clip->x1 = x1; 258 + clip->y1 = y; 259 + clip->x2 = x2; 260 + clip->y2 = y + height; 261 + 262 + return 0; 263 + } 264 + 265 + int udl_handle_damage(struct drm_framebuffer *fb, int x, int y, 266 + int width, int height) 267 + { 268 + struct drm_device *dev = fb->dev; 269 + struct dma_buf_attachment *import_attach = fb->obj[0]->import_attach; 270 + int i, ret, tmp_ret; 271 + char *cmd; 272 + struct urb *urb; 273 + struct drm_rect clip; 274 + int log_bpp; 275 + void *vaddr; 276 + 277 + ret = udl_log_cpp(fb->format->cpp[0]); 278 + if (ret < 0) 279 + return ret; 280 + log_bpp = ret; 281 + 282 + ret = udl_aligned_damage_clip(&clip, x, y, width, height); 283 + if (ret) 284 + return ret; 285 + else if ((clip.x2 > fb->width) || (clip.y2 > fb->height)) 286 + return -EINVAL; 287 + 288 + if (import_attach) { 289 + ret = dma_buf_begin_cpu_access(import_attach->dmabuf, 290 + DMA_FROM_DEVICE); 291 + if (ret) 292 + return ret; 293 + } 294 + 295 + vaddr = drm_gem_shmem_vmap(fb->obj[0]); 296 + if (IS_ERR(vaddr)) { 297 + DRM_ERROR("failed to vmap fb\n"); 298 + goto out_dma_buf_end_cpu_access; 299 + } 300 + 301 + urb = udl_get_urb(dev); 302 + if (!urb) 303 + goto out_drm_gem_shmem_vunmap; 304 + cmd = urb->transfer_buffer; 305 + 306 + for (i = clip.y1; i < clip.y2; i++) { 307 + const int line_offset = fb->pitches[0] * i; 308 + const int byte_offset = line_offset + (clip.x1 << log_bpp); 309 + const int dev_byte_offset = (fb->width * i + clip.x1) << log_bpp; 310 + const int byte_width = (clip.x2 - clip.x1) << log_bpp; 311 + ret = udl_render_hline(dev, log_bpp, &urb, (char *)vaddr, 312 + &cmd, byte_offset, dev_byte_offset, 313 + byte_width); 314 + if (ret) 315 + goto out_drm_gem_shmem_vunmap; 316 + } 317 + 318 + if (cmd > (char *)urb->transfer_buffer) { 319 + /* Send partial buffer remaining before exiting */ 320 + int len; 321 + if (cmd < (char *)urb->transfer_buffer + urb->transfer_buffer_length) 322 + *cmd++ = 0xAF; 323 + len = cmd - (char *)urb->transfer_buffer; 324 + ret = udl_submit_urb(dev, urb, len); 325 + } else { 326 + udl_urb_completion(urb); 327 + } 328 + 329 + ret = 0; 330 + 331 + out_drm_gem_shmem_vunmap: 332 + drm_gem_shmem_vunmap(fb->obj[0], vaddr); 333 + out_dma_buf_end_cpu_access: 334 + if (import_attach) { 335 + tmp_ret = dma_buf_end_cpu_access(import_attach->dmabuf, 336 + DMA_FROM_DEVICE); 337 + if (tmp_ret && !ret) 338 + ret = tmp_ret; /* only update ret if not set yet */ 339 + } 340 + 341 + return ret; 238 342 } 239 343 240 344 /*