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

drm/format-helper: Remove optional byte-swap from line convertion

Implement per-pixel byte swapping in a separate conversion helper
for the single function that requires it. Select the correct helper
for each conversion.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220427141409.22842-3-tzimmermann@suse.de

+24 -8
+24 -8
drivers/gpu/drm/drm_format_helper.c
··· 229 229 EXPORT_SYMBOL(drm_fb_xrgb8888_to_rgb332); 230 230 231 231 static void drm_fb_xrgb8888_to_rgb565_line(u16 *dbuf, const u32 *sbuf, 232 - unsigned int pixels, 233 - bool swab) 232 + unsigned int pixels) 234 233 { 235 234 unsigned int x; 236 235 u16 val16; ··· 238 239 val16 = ((sbuf[x] & 0x00F80000) >> 8) | 239 240 ((sbuf[x] & 0x0000FC00) >> 5) | 240 241 ((sbuf[x] & 0x000000F8) >> 3); 241 - if (swab) 242 - dbuf[x] = swab16(val16); 243 - else 244 - dbuf[x] = val16; 242 + dbuf[x] = val16; 243 + } 244 + } 245 + 246 + static void drm_fb_xrgb8888_to_rgb565_swab_line(u16 *dbuf, const u32 *sbuf, 247 + unsigned int pixels) 248 + { 249 + unsigned int x; 250 + u16 val16; 251 + 252 + for (x = 0; x < pixels; x++) { 253 + val16 = ((sbuf[x] & 0x00F80000) >> 8) | 254 + ((sbuf[x] & 0x0000FC00) >> 5) | 255 + ((sbuf[x] & 0x000000F8) >> 3); 256 + dbuf[x] = swab16(val16); 245 257 } 246 258 } 247 259 ··· 292 282 vaddr += clip_offset(clip, fb->pitches[0], sizeof(u32)); 293 283 for (y = 0; y < lines; y++) { 294 284 memcpy(sbuf, vaddr, src_len); 295 - drm_fb_xrgb8888_to_rgb565_line(dst, sbuf, linepixels, swab); 285 + if (swab) 286 + drm_fb_xrgb8888_to_rgb565_swab_line(dst, sbuf, linepixels); 287 + else 288 + drm_fb_xrgb8888_to_rgb565_line(dst, sbuf, linepixels); 296 289 vaddr += fb->pitches[0]; 297 290 dst += dst_pitch; 298 291 } ··· 334 321 335 322 vaddr += clip_offset(clip, fb->pitches[0], sizeof(u32)); 336 323 for (y = 0; y < lines; y++) { 337 - drm_fb_xrgb8888_to_rgb565_line(dbuf, vaddr, linepixels, swab); 324 + if (swab) 325 + drm_fb_xrgb8888_to_rgb565_swab_line(dbuf, vaddr, linepixels); 326 + else 327 + drm_fb_xrgb8888_to_rgb565_line(dbuf, vaddr, linepixels); 338 328 memcpy_toio(dst, dbuf, dst_len); 339 329 vaddr += fb->pitches[0]; 340 330 dst += dst_pitch;