From 41fd6f0a6dd62def79e91c2170cdfd29473fb833 Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Wed, 27 Apr 2022 16:14:06 +0200 Subject: drm/format-helper: Implement drm_fb_swab() with per-line helpers Replace the inner loop of drm_fb_swab() with helper functions that swap the bytes in each pixel. This will allow to share the outer loop with other conversion helpers. Signed-off-by: Thomas Zimmermann Reviewed-by: Javier Martinez Canillas Link: https://patchwork.freedesktop.org/patch/msgid/20220427141409.22842-2-tzimmermann@suse.de --- drivers/gpu/drm/drm_format_helper.c | 60 +++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 25 deletions(-) (limited to 'drivers/gpu/drm/drm_format_helper.c') diff --git a/drivers/gpu/drm/drm_format_helper.c b/drivers/gpu/drm/drm_format_helper.c index 34b7ef443ad2..f70499344a04 100644 --- a/drivers/gpu/drm/drm_format_helper.c +++ b/drivers/gpu/drm/drm_format_helper.c @@ -100,6 +100,26 @@ void drm_fb_memcpy_toio(void __iomem *dst, unsigned int dst_pitch, const void *v } EXPORT_SYMBOL(drm_fb_memcpy_toio); +static void drm_fb_swab16_line(void *dbuf, const void *sbuf, unsigned int pixels) +{ + u16 *dbuf16 = dbuf; + const u16 *sbuf16 = sbuf; + const u16 *send16 = sbuf16 + pixels; + + while (sbuf16 < send16) + *dbuf16++ = swab16(*sbuf16++); +} + +static void drm_fb_swab32_line(void *dbuf, const void *sbuf, unsigned int pixels) +{ + u32 *dbuf32 = dbuf; + const u32 *sbuf32 = sbuf; + const u32 *send32 = sbuf32 + pixels; + + while (sbuf32 < send32) + *dbuf32++ = swab32(*sbuf32++); +} + /** * drm_fb_swab - Swap bytes into clip buffer * @dst: Destination buffer @@ -120,12 +140,11 @@ void drm_fb_swab(void *dst, unsigned int dst_pitch, const void *src, bool cached) { u8 cpp = fb->format->cpp[0]; - size_t len = drm_rect_width(clip) * cpp; - const u16 *src16; - const u32 *src32; - u16 *dst16; - u32 *dst32; - unsigned int x, y; + unsigned long linepixels = drm_rect_width(clip); + size_t len = linepixels * cpp; + const void *sbuf; + void *dbuf; + unsigned int y; void *buf = NULL; if (WARN_ON_ONCE(cpp != 2 && cpp != 4)) @@ -133,31 +152,22 @@ void drm_fb_swab(void *dst, unsigned int dst_pitch, const void *src, if (!dst_pitch) dst_pitch = len; + src += clip_offset(clip, fb->pitches[0], cpp); if (!cached) buf = kmalloc(len, GFP_KERNEL); - src += clip_offset(clip, fb->pitches[0], cpp); - for (y = clip->y1; y < clip->y2; y++) { - if (buf) { - memcpy(buf, src, len); - src16 = buf; - src32 = buf; - } else { - src16 = src; - src32 = src; - } - - dst16 = dst; - dst32 = dst; + if (buf) + sbuf = memcpy(buf, src, len); + else + sbuf = src; + dbuf = dst + clip->x1 * cpp; - for (x = clip->x1; x < clip->x2; x++) { - if (cpp == 4) - *dst32++ = swab32(*src32++); - else - *dst16++ = swab16(*src16++); - } + if (cpp == 4) + drm_fb_swab32_line(dbuf, sbuf, linepixels); + else + drm_fb_swab16_line(dbuf, sbuf, linepixels); src += fb->pitches[0]; dst += dst_pitch; -- cgit v1.2.3