Hi, On Mon, Nov 1, 2021, at 10:15 AM, Thomas Zimmermann wrote: > Add destination-buffer pitch as argument to drm_fb_swab(). Done for > consistency with the rest of the interface. > > v2: > * update documentation (Noralf) > > Signed-off-by: Thomas Zimmermann <tzimmermann@xxxxxxx> > Tested-by: Noralf Trønnes <noralf@xxxxxxxxxxx> > Reviewed-by: Noralf Trønnes <noralf@xxxxxxxxxxx> > --- > drivers/gpu/drm/drm_format_helper.c | 21 ++++++++++++++++----- > drivers/gpu/drm/drm_mipi_dbi.c | 2 +- > drivers/gpu/drm/gud/gud_pipe.c | 2 +- > include/drm/drm_format_helper.h | 5 +++-- > 4 files changed, 21 insertions(+), 9 deletions(-) > > diff --git a/drivers/gpu/drm/drm_format_helper.c > b/drivers/gpu/drm/drm_format_helper.c > index fac37c697d8b..dac355320287 100644 > --- a/drivers/gpu/drm/drm_format_helper.c > +++ b/drivers/gpu/drm/drm_format_helper.c > @@ -101,6 +101,7 @@ EXPORT_SYMBOL(drm_fb_memcpy_toio); > /** > * drm_fb_swab - Swap bytes into clip buffer > * @dst: Destination buffer > + * @dst_pitch: Number of bytes between two consecutive scanlines > within dst > * @src: Source buffer > * @fb: DRM framebuffer > * @clip: Clip rectangle area to copy > @@ -110,21 +111,27 @@ EXPORT_SYMBOL(drm_fb_memcpy_toio); > * time to speed up slow uncached reads. > * > * This function does not apply clipping on dst, i.e. the destination > - * is a small buffer containing the clip rect only. > + * is at the top-left corner. > */ > -void drm_fb_swab(void *dst, void *src, struct drm_framebuffer *fb, > - struct drm_rect *clip, bool cached) > +void drm_fb_swab(void *dst, unsigned int dst_pitch, const void *src, > + const struct drm_framebuffer *fb, const struct drm_rect *clip, > + bool cached) > { > u8 cpp = fb->format->cpp[0]; > size_t len = drm_rect_width(clip) * cpp; > - u16 *src16, *dst16 = dst; > - u32 *src32, *dst32 = dst; > + const u16 *src16; > + const u32 *src32; > + u16 *dst16; > + u32 *dst32; > unsigned int x, y; > void *buf = NULL; > > if (WARN_ON_ONCE(cpp != 2 && cpp != 4)) > return; > > + if (!dst_pitch) > + dst_pitch = len; > + > if (!cached) > buf = kmalloc(len, GFP_KERNEL); > > @@ -140,6 +147,9 @@ void drm_fb_swab(void *dst, void *src, struct > drm_framebuffer *fb, > src32 = src; > } > > + dst16 = dst; > + dst32 = dst; > + > for (x = clip->x1; x < clip->x2; x++) { > if (cpp == 4) > *dst32++ = swab32(*src32++); > @@ -148,6 +158,7 @@ void drm_fb_swab(void *dst, void *src, struct > drm_framebuffer *fb, > } > > src += fb->pitches[0]; > + dst += dst_pitch; > } > > kfree(buf); > diff --git a/drivers/gpu/drm/drm_mipi_dbi.c > b/drivers/gpu/drm/drm_mipi_dbi.c > index c09df8b06c7a..7ce89917d761 100644 > --- a/drivers/gpu/drm/drm_mipi_dbi.c > +++ b/drivers/gpu/drm/drm_mipi_dbi.c > @@ -211,7 +211,7 @@ int mipi_dbi_buf_copy(void *dst, struct > drm_framebuffer *fb, > switch (fb->format->format) { > case DRM_FORMAT_RGB565: > if (swap) > - drm_fb_swab(dst, src, fb, clip, !gem->import_attach); > + drm_fb_swab(dst, 0, src, fb, clip, !gem->import_attach); > else > drm_fb_memcpy(dst, 0, src, fb, clip); > break; > diff --git a/drivers/gpu/drm/gud/gud_pipe.c > b/drivers/gpu/drm/gud/gud_pipe.c > index a92112ffd37a..e0b117b2559f 100644 > --- a/drivers/gpu/drm/gud/gud_pipe.c > +++ b/drivers/gpu/drm/gud/gud_pipe.c > @@ -201,7 +201,7 @@ static int gud_prep_flush(struct gud_device *gdrm, > struct drm_framebuffer *fb, > len = gud_xrgb8888_to_color(buf, format, vaddr, fb, rect); > } > } else if (gud_is_big_endian() && format->cpp[0] > 1) { > - drm_fb_swab(buf, vaddr, fb, rect, !import_attach); > + drm_fb_swab(buf, 0, vaddr, fb, rect, !import_attach); > } else if (compression && !import_attach && pitch == fb->pitches[0]) { > /* can compress directly from the framebuffer */ > buf = vaddr + rect->y1 * pitch; > diff --git a/include/drm/drm_format_helper.h > b/include/drm/drm_format_helper.h > index 1fc3ba7b6060..ddcba5abe306 100644 > --- a/include/drm/drm_format_helper.h > +++ b/include/drm/drm_format_helper.h > @@ -17,8 +17,9 @@ void drm_fb_memcpy(void *dst, unsigned int dst_pitch, > const void *vaddr, > const struct drm_framebuffer *fb, const struct drm_rect *clip); > void drm_fb_memcpy_toio(void __iomem *dst, unsigned int dst_pitch, > const void *vaddr, > const struct drm_framebuffer *fb, const struct drm_rect *clip); > -void drm_fb_swab(void *dst, void *src, struct drm_framebuffer *fb, > - struct drm_rect *clip, bool cached); > +void drm_fb_swab(void *dst, unsigned int dst_pitch, const void *src, > + const struct drm_framebuffer *fb, const struct drm_rect *clip, > + bool cached); > void drm_fb_xrgb8888_to_rgb332(void *dst, void *vaddr, struct > drm_framebuffer *fb, > struct drm_rect *clip); > void drm_fb_xrgb8888_to_rgb565(void *dst, void *vaddr, > -- > 2.33.1 Applying this fails for me (tested against 5.14 and 5.15 trees). Example: patching file include/drm/drm_format_helper.h Hunk #1 FAILED at 17. -- thanks, Amanoel