Commit 41fd6f0a authored by Thomas Zimmermann's avatar Thomas Zimmermann
Browse files

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: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarJavier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220427141409.22842-2-tzimmermann@suse.de
parent 1bb533b6
Loading
Loading
Loading
Loading
+35 −25
Original line number Diff line number Diff line
@@ -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++);
			drm_fb_swab32_line(dbuf, sbuf, linepixels);
		else
				*dst16++ = swab16(*src16++);
		}
			drm_fb_swab16_line(dbuf, sbuf, linepixels);

		src += fb->pitches[0];
		dst += dst_pitch;