drm/format-helper: Rework format-helper conversion functions
authorThomas Zimmermann <tzimmermann@suse.de>
Wed, 10 Nov 2021 10:36:57 +0000 (11:36 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Thu, 11 Nov 2021 11:06:57 +0000 (12:06 +0100)
Move destination-buffer clipping from all format-helper conversion
functions into callers. Support destination-buffer pitch. Only
distinguish between system and I/O memory, but use same logic
everywhere.

Simply harmonize the interface and semantics of the existing code.
Not all conversion helpers support all combinations of parameters.
We have to add additional features when we need them.

v2:
* fix default destination pitch in drm_fb_xrgb8888_to_gray8()
  (Noralf)

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Tested-by: Noralf Trønnes <noralf@tronnes.org>
Reviewed-by: Noralf Trønnes <noralf@tronnes.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20211110103702.374-5-tzimmermann@suse.de
drivers/gpu/drm/drm_format_helper.c
drivers/gpu/drm/drm_mipi_dbi.c
drivers/gpu/drm/gud/gud_pipe.c
drivers/gpu/drm/tiny/cirrus.c
drivers/gpu/drm/tiny/repaper.c
drivers/gpu/drm/tiny/st7586.c
include/drm/drm_format_helper.h

index c6d4e78be8e2f48d8694edb5d33efddf358efa42..b6a0822298241b93ad0c76b955fc58dec3d45c2b 100644 (file)
@@ -165,7 +165,7 @@ void drm_fb_swab(void *dst, unsigned int dst_pitch, const void *src,
 }
 EXPORT_SYMBOL(drm_fb_swab);
 
-static void drm_fb_xrgb8888_to_rgb332_line(u8 *dbuf, __le32 *sbuf, unsigned int pixels)
+static void drm_fb_xrgb8888_to_rgb332_line(u8 *dbuf, const __le32 *sbuf, unsigned int pixels)
 {
        unsigned int x;
        u32 pix;
@@ -181,23 +181,24 @@ static void drm_fb_xrgb8888_to_rgb332_line(u8 *dbuf, __le32 *sbuf, unsigned int
 /**
  * drm_fb_xrgb8888_to_rgb332 - Convert XRGB8888 to RGB332 clip buffer
  * @dst: RGB332 destination buffer
+ * @dst_pitch: Number of bytes between two consecutive scanlines within dst
  * @src: XRGB8888 source buffer
  * @fb: DRM framebuffer
  * @clip: Clip rectangle area to copy
  *
  * Drivers can use this function for RGB332 devices that don't natively support XRGB8888.
- *
- * This function does not apply clipping on dst, i.e. the destination is a small buffer
- * containing the clip rect only.
  */
-void drm_fb_xrgb8888_to_rgb332(void *dst, void *src, struct drm_framebuffer *fb,
-                              struct drm_rect *clip)
+void drm_fb_xrgb8888_to_rgb332(void *dst, unsigned int dst_pitch, const void *src,
+                              const struct drm_framebuffer *fb, const struct drm_rect *clip)
 {
        size_t width = drm_rect_width(clip);
        size_t src_len = width * sizeof(u32);
        unsigned int y;
        void *sbuf;
 
+       if (!dst_pitch)
+               dst_pitch = width;
+
        /* Use a buffer to speed up access on buffers with uncached read mapping (i.e. WC) */
        sbuf = kmalloc(src_len, GFP_KERNEL);
        if (!sbuf)
@@ -208,14 +209,14 @@ void drm_fb_xrgb8888_to_rgb332(void *dst, void *src, struct drm_framebuffer *fb,
                memcpy(sbuf, src, src_len);
                drm_fb_xrgb8888_to_rgb332_line(dst, sbuf, width);
                src += fb->pitches[0];
-               dst += width;
+               dst += dst_pitch;
        }
 
        kfree(sbuf);
 }
 EXPORT_SYMBOL(drm_fb_xrgb8888_to_rgb332);
 
-static void drm_fb_xrgb8888_to_rgb565_line(u16 *dbuf, u32 *sbuf,
+static void drm_fb_xrgb8888_to_rgb565_line(u16 *dbuf, const u32 *sbuf,
                                           unsigned int pixels,
                                           bool swab)
 {
@@ -236,6 +237,7 @@ static void drm_fb_xrgb8888_to_rgb565_line(u16 *dbuf, u32 *sbuf,
 /**
  * drm_fb_xrgb8888_to_rgb565 - Convert XRGB8888 to RGB565 clip buffer
  * @dst: RGB565 destination buffer
+ * @dst_pitch: Number of bytes between two consecutive scanlines within dst
  * @vaddr: XRGB8888 source buffer
  * @fb: DRM framebuffer
  * @clip: Clip rectangle area to copy
@@ -243,13 +245,10 @@ static void drm_fb_xrgb8888_to_rgb565_line(u16 *dbuf, u32 *sbuf,
  *
  * Drivers can use this function for RGB565 devices that don't natively
  * support XRGB8888.
- *
- * This function does not apply clipping on dst, i.e. the destination
- * is a small buffer containing the clip rect only.
  */
-void drm_fb_xrgb8888_to_rgb565(void *dst, void *vaddr,
-                              struct drm_framebuffer *fb,
-                              struct drm_rect *clip, bool swab)
+void drm_fb_xrgb8888_to_rgb565(void *dst, unsigned int dst_pitch, const void *vaddr,
+                              const struct drm_framebuffer *fb, const struct drm_rect *clip,
+                              bool swab)
 {
        size_t linepixels = clip->x2 - clip->x1;
        size_t src_len = linepixels * sizeof(u32);
@@ -257,6 +256,9 @@ void drm_fb_xrgb8888_to_rgb565(void *dst, void *vaddr,
        unsigned y, lines = clip->y2 - clip->y1;
        void *sbuf;
 
+       if (!dst_pitch)
+               dst_pitch = dst_len;
+
        /*
         * The cma memory is write-combined so reads are uncached.
         * Speed up by fetching one line at a time.
@@ -270,7 +272,7 @@ void drm_fb_xrgb8888_to_rgb565(void *dst, void *vaddr,
                memcpy(sbuf, vaddr, src_len);
                drm_fb_xrgb8888_to_rgb565_line(dst, sbuf, linepixels, swab);
                vaddr += fb->pitches[0];
-               dst += dst_len;
+               dst += dst_pitch;
        }
 
        kfree(sbuf);
@@ -278,9 +280,9 @@ void drm_fb_xrgb8888_to_rgb565(void *dst, void *vaddr,
 EXPORT_SYMBOL(drm_fb_xrgb8888_to_rgb565);
 
 /**
- * drm_fb_xrgb8888_to_rgb565_dstclip - Convert XRGB8888 to RGB565 clip buffer
+ * drm_fb_xrgb8888_to_rgb565_toio - Convert XRGB8888 to RGB565 clip buffer
  * @dst: RGB565 destination buffer (iomem)
- * @dst_pitch: destination buffer pitch
+ * @dst_pitch: Number of bytes between two consecutive scanlines within dst
  * @vaddr: XRGB8888 source buffer
  * @fb: DRM framebuffer
  * @clip: Clip rectangle area to copy
@@ -288,37 +290,36 @@ EXPORT_SYMBOL(drm_fb_xrgb8888_to_rgb565);
  *
  * Drivers can use this function for RGB565 devices that don't natively
  * support XRGB8888.
- *
- * This function applies clipping on dst, i.e. the destination is a
- * full (iomem) framebuffer but only the clip rect content is copied over.
  */
-void drm_fb_xrgb8888_to_rgb565_dstclip(void __iomem *dst, unsigned int dst_pitch,
-                                      void *vaddr, struct drm_framebuffer *fb,
-                                      struct drm_rect *clip, bool swab)
+void drm_fb_xrgb8888_to_rgb565_toio(void __iomem *dst, unsigned int dst_pitch,
+                                   const void *vaddr, const struct drm_framebuffer *fb,
+                                   const struct drm_rect *clip, bool swab)
 {
        size_t linepixels = clip->x2 - clip->x1;
        size_t dst_len = linepixels * sizeof(u16);
        unsigned y, lines = clip->y2 - clip->y1;
        void *dbuf;
 
+       if (!dst_pitch)
+               dst_pitch = dst_len;
+
        dbuf = kmalloc(dst_len, GFP_KERNEL);
        if (!dbuf)
                return;
 
        vaddr += clip_offset(clip, fb->pitches[0], sizeof(u32));
-       dst += clip_offset(clip, dst_pitch, sizeof(u16));
        for (y = 0; y < lines; y++) {
                drm_fb_xrgb8888_to_rgb565_line(dbuf, vaddr, linepixels, swab);
                memcpy_toio(dst, dbuf, dst_len);
                vaddr += fb->pitches[0];
-               dst += dst_len;
+               dst += dst_pitch;
        }
 
        kfree(dbuf);
 }
-EXPORT_SYMBOL(drm_fb_xrgb8888_to_rgb565_dstclip);
+EXPORT_SYMBOL(drm_fb_xrgb8888_to_rgb565_toio);
 
-static void drm_fb_xrgb8888_to_rgb888_line(u8 *dbuf, u32 *sbuf,
+static void drm_fb_xrgb8888_to_rgb888_line(u8 *dbuf, const u32 *sbuf,
                                           unsigned int pixels)
 {
        unsigned int x;
@@ -333,24 +334,25 @@ static void drm_fb_xrgb8888_to_rgb888_line(u8 *dbuf, u32 *sbuf,
 /**
  * drm_fb_xrgb8888_to_rgb888 - Convert XRGB8888 to RGB888 clip buffer
  * @dst: RGB888 destination buffer
+ * @dst_pitch: Number of bytes between two consecutive scanlines within dst
  * @src: XRGB8888 source buffer
  * @fb: DRM framebuffer
  * @clip: Clip rectangle area to copy
  *
  * Drivers can use this function for RGB888 devices that don't natively
  * support XRGB8888.
- *
- * This function does not apply clipping on dst, i.e. the destination
- * is a small buffer containing the clip rect only.
  */
-void drm_fb_xrgb8888_to_rgb888(void *dst, void *src, struct drm_framebuffer *fb,
-                              struct drm_rect *clip)
+void drm_fb_xrgb8888_to_rgb888(void *dst, unsigned int dst_pitch, const void *src,
+                              const struct drm_framebuffer *fb, const struct drm_rect *clip)
 {
        size_t width = drm_rect_width(clip);
        size_t src_len = width * sizeof(u32);
        unsigned int y;
        void *sbuf;
 
+       if (!dst_pitch)
+               dst_pitch = width * 3;
+
        /* Use a buffer to speed up access on buffers with uncached read mapping (i.e. WC) */
        sbuf = kmalloc(src_len, GFP_KERNEL);
        if (!sbuf)
@@ -361,7 +363,7 @@ void drm_fb_xrgb8888_to_rgb888(void *dst, void *src, struct drm_framebuffer *fb,
                memcpy(sbuf, src, src_len);
                drm_fb_xrgb8888_to_rgb888_line(dst, sbuf, width);
                src += fb->pitches[0];
-               dst += width * 3;
+               dst += dst_pitch;
        }
 
        kfree(sbuf);
@@ -369,48 +371,48 @@ void drm_fb_xrgb8888_to_rgb888(void *dst, void *src, struct drm_framebuffer *fb,
 EXPORT_SYMBOL(drm_fb_xrgb8888_to_rgb888);
 
 /**
- * drm_fb_xrgb8888_to_rgb888_dstclip - Convert XRGB8888 to RGB888 clip buffer
+ * drm_fb_xrgb8888_to_rgb888_toio - Convert XRGB8888 to RGB888 clip buffer
  * @dst: RGB565 destination buffer (iomem)
- * @dst_pitch: destination buffer pitch
+ * @dst_pitch: Number of bytes between two consecutive scanlines within dst
  * @vaddr: XRGB8888 source buffer
  * @fb: DRM framebuffer
  * @clip: Clip rectangle area to copy
  *
  * Drivers can use this function for RGB888 devices that don't natively
  * support XRGB8888.
- *
- * This function applies clipping on dst, i.e. the destination is a
- * full (iomem) framebuffer but only the clip rect content is copied over.
  */
-void drm_fb_xrgb8888_to_rgb888_dstclip(void __iomem *dst, unsigned int dst_pitch,
-                                      void *vaddr, struct drm_framebuffer *fb,
-                                      struct drm_rect *clip)
+void drm_fb_xrgb8888_to_rgb888_toio(void __iomem *dst, unsigned int dst_pitch,
+                                   const void *vaddr, const struct drm_framebuffer *fb,
+                                   const struct drm_rect *clip)
 {
        size_t linepixels = clip->x2 - clip->x1;
        size_t dst_len = linepixels * 3;
        unsigned y, lines = clip->y2 - clip->y1;
        void *dbuf;
 
+       if (!dst_pitch)
+               dst_pitch = dst_len;
+
        dbuf = kmalloc(dst_len, GFP_KERNEL);
        if (!dbuf)
                return;
 
        vaddr += clip_offset(clip, fb->pitches[0], sizeof(u32));
-       dst += clip_offset(clip, dst_pitch, sizeof(u16));
        for (y = 0; y < lines; y++) {
                drm_fb_xrgb8888_to_rgb888_line(dbuf, vaddr, linepixels);
                memcpy_toio(dst, dbuf, dst_len);
                vaddr += fb->pitches[0];
-               dst += dst_len;
+               dst += dst_pitch;
        }
 
        kfree(dbuf);
 }
-EXPORT_SYMBOL(drm_fb_xrgb8888_to_rgb888_dstclip);
+EXPORT_SYMBOL(drm_fb_xrgb8888_to_rgb888_toio);
 
 /**
  * drm_fb_xrgb8888_to_gray8 - Convert XRGB8888 to grayscale
  * @dst: 8-bit grayscale destination buffer
+ * @dst_pitch: Number of bytes between two consecutive scanlines within dst
  * @vaddr: XRGB8888 source buffer
  * @fb: DRM framebuffer
  * @clip: Clip rectangle area to copy
@@ -424,16 +426,21 @@ EXPORT_SYMBOL(drm_fb_xrgb8888_to_rgb888_dstclip);
  *
  * ITU BT.601 is used for the RGB -> luma (brightness) conversion.
  */
-void drm_fb_xrgb8888_to_gray8(u8 *dst, void *vaddr, struct drm_framebuffer *fb,
-                              struct drm_rect *clip)
+void drm_fb_xrgb8888_to_gray8(void *dst, unsigned int dst_pitch, const void *vaddr,
+                             const struct drm_framebuffer *fb, const struct drm_rect *clip)
 {
        unsigned int len = (clip->x2 - clip->x1) * sizeof(u32);
        unsigned int x, y;
        void *buf;
-       u32 *src;
+       u8 *dst8;
+       u32 *src32;
 
        if (WARN_ON(fb->format->format != DRM_FORMAT_XRGB8888))
                return;
+
+       if (!dst_pitch)
+               dst_pitch = drm_rect_width(clip);
+
        /*
         * The cma memory is write-combined so reads are uncached.
         * Speed up by fetching one line at a time.
@@ -442,20 +449,22 @@ void drm_fb_xrgb8888_to_gray8(u8 *dst, void *vaddr, struct drm_framebuffer *fb,
        if (!buf)
                return;
 
+       vaddr += clip_offset(clip, fb->pitches[0], sizeof(u32));
        for (y = clip->y1; y < clip->y2; y++) {
-               src = vaddr + (y * fb->pitches[0]);
-               src += clip->x1;
-               memcpy(buf, src, len);
-               src = buf;
+               dst8 = dst;
+               src32 = memcpy(buf, vaddr, len);
                for (x = clip->x1; x < clip->x2; x++) {
-                       u8 r = (*src & 0x00ff0000) >> 16;
-                       u8 g = (*src & 0x0000ff00) >> 8;
-                       u8 b =  *src & 0x000000ff;
+                       u8 r = (*src32 & 0x00ff0000) >> 16;
+                       u8 g = (*src32 & 0x0000ff00) >> 8;
+                       u8 b =  *src32 & 0x000000ff;
 
                        /* ITU BT.601: Y = 0.299 R + 0.587 G + 0.114 B */
-                       *dst++ = (3 * r + 6 * g + b) / 10;
-                       src++;
+                       *dst8++ = (3 * r + 6 * g + b) / 10;
+                       src32++;
                }
+
+               vaddr += fb->pitches[0];
+               dst += dst_pitch;
        }
 
        kfree(buf);
@@ -502,15 +511,15 @@ int drm_fb_blit_rect_dstclip(void __iomem *dst, unsigned int dst_pitch,
 
        } else if (dst_format == DRM_FORMAT_RGB565) {
                if (fb_format == DRM_FORMAT_XRGB8888) {
-                       drm_fb_xrgb8888_to_rgb565_dstclip(dst, dst_pitch,
-                                                         vmap, fb, clip,
-                                                         false);
+                       dst += clip_offset(clip, dst_pitch, fb->format->cpp[0]);
+                       drm_fb_xrgb8888_to_rgb565_toio(dst, dst_pitch, vmap, fb, clip,
+                                                      false);
                        return 0;
                }
        } else if (dst_format == DRM_FORMAT_RGB888) {
                if (fb_format == DRM_FORMAT_XRGB8888) {
-                       drm_fb_xrgb8888_to_rgb888_dstclip(dst, dst_pitch,
-                                                         vmap, fb, clip);
+                       dst += clip_offset(clip, dst_pitch, fb->format->cpp[0]);
+                       drm_fb_xrgb8888_to_rgb888_toio(dst, dst_pitch, vmap, fb, clip);
                        return 0;
                }
        }
index 7ce89917d76123d6a386f6f4469e8ca35c5222ce..b75403f3251aa7593c13aedc8f0caca9cdf53b4b 100644 (file)
@@ -216,7 +216,7 @@ int mipi_dbi_buf_copy(void *dst, struct drm_framebuffer *fb,
                        drm_fb_memcpy(dst, 0, src, fb, clip);
                break;
        case DRM_FORMAT_XRGB8888:
-               drm_fb_xrgb8888_to_rgb565(dst, src, fb, clip, swap);
+               drm_fb_xrgb8888_to_rgb565(dst, 0, src, fb, clip, swap);
                break;
        default:
                drm_err_once(fb->dev, "Format is not supported: %p4cc\n",
index e0b117b2559f24ac836e18790c0deb300a041e00..a150a5a4b5d462fce9ec817fe3cc1e5b11611bd4 100644 (file)
@@ -74,7 +74,7 @@ static size_t gud_xrgb8888_to_r124(u8 *dst, const struct drm_format_info *format
        if (!buf)
                return 0;
 
-       drm_fb_xrgb8888_to_gray8(buf, src, fb, rect);
+       drm_fb_xrgb8888_to_gray8(buf, 0, src, fb, rect);
        pix8 = buf;
 
        for (y = 0; y < height; y++) {
@@ -190,13 +190,13 @@ retry:
                                goto end_cpu_access;
                        }
                } else if (format->format == DRM_FORMAT_R8) {
-                       drm_fb_xrgb8888_to_gray8(buf, vaddr, fb, rect);
+                       drm_fb_xrgb8888_to_gray8(buf, 0, vaddr, fb, rect);
                } else if (format->format == DRM_FORMAT_RGB332) {
-                       drm_fb_xrgb8888_to_rgb332(buf, vaddr, fb, rect);
+                       drm_fb_xrgb8888_to_rgb332(buf, 0, vaddr, fb, rect);
                } else if (format->format == DRM_FORMAT_RGB565) {
-                       drm_fb_xrgb8888_to_rgb565(buf, vaddr, fb, rect, gud_is_big_endian());
+                       drm_fb_xrgb8888_to_rgb565(buf, 0, vaddr, fb, rect, gud_is_big_endian());
                } else if (format->format == DRM_FORMAT_RGB888) {
-                       drm_fb_xrgb8888_to_rgb888(buf, vaddr, fb, rect);
+                       drm_fb_xrgb8888_to_rgb888(buf, 0, vaddr, fb, rect);
                } else {
                        len = gud_xrgb8888_to_color(buf, format, vaddr, fb, rect);
                }
index 5344e506e8a905215d062f22e8a92e60813df275..9327001d35dd3b0a277fef3ffcfd82e223d7a74b 100644 (file)
@@ -329,14 +329,12 @@ static int cirrus_fb_blit_rect(struct drm_framebuffer *fb, const struct dma_buf_
                drm_fb_memcpy_toio(dst, fb->pitches[0], vmap, fb, rect);
 
        } else if (fb->format->cpp[0] == 4 && cirrus->cpp == 2) {
-               drm_fb_xrgb8888_to_rgb565_dstclip(cirrus->vram,
-                                                 cirrus->pitch,
-                                                 vmap, fb, rect, false);
+               dst += drm_fb_clip_offset(cirrus->pitch, fb->format, rect);
+               drm_fb_xrgb8888_to_rgb565_toio(dst, cirrus->pitch, vmap, fb, rect, false);
 
        } else if (fb->format->cpp[0] == 4 && cirrus->cpp == 3) {
-               drm_fb_xrgb8888_to_rgb888_dstclip(cirrus->vram,
-                                                 cirrus->pitch,
-                                                 vmap, fb, rect);
+               dst += drm_fb_clip_offset(cirrus->pitch, fb->format, rect);
+               drm_fb_xrgb8888_to_rgb888_toio(dst, cirrus->pitch, vmap, fb, rect);
 
        } else {
                WARN_ON_ONCE("cpp mismatch");
index 4d07b21a16e6511eb5a432823034add9e907f073..97a775c48cea7750a5ae4ab31e00ba70d5b0d0ed 100644 (file)
@@ -560,7 +560,7 @@ static int repaper_fb_dirty(struct drm_framebuffer *fb)
        if (ret)
                goto out_free;
 
-       drm_fb_xrgb8888_to_gray8(buf, cma_obj->vaddr, fb, &clip);
+       drm_fb_xrgb8888_to_gray8(buf, 0, cma_obj->vaddr, fb, &clip);
 
        drm_gem_fb_end_cpu_access(fb, DMA_FROM_DEVICE);
 
index ad0faa8723c20f1715bcc5104357567fc7e7222c..51b9b9fb3ead19895e8086e54337adf9fd020389 100644 (file)
@@ -73,7 +73,7 @@ static void st7586_xrgb8888_to_gray332(u8 *dst, void *vaddr,
        if (!buf)
                return;
 
-       drm_fb_xrgb8888_to_gray8(buf, vaddr, fb, clip);
+       drm_fb_xrgb8888_to_gray8(buf, 0, vaddr, fb, clip);
        src = buf;
 
        for (y = clip->y1; y < clip->y2; y++) {
index ddcba5abe3069b89373538314ab20aec923cf5ab..6b366f422a24a2c81042c81379ea1c40d60e108b 100644 (file)
@@ -20,21 +20,21 @@ void drm_fb_memcpy_toio(void __iomem *dst, unsigned int dst_pitch, const void *v
 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,
-                              struct drm_framebuffer *fb,
-                              struct drm_rect *clip, bool swab);
-void drm_fb_xrgb8888_to_rgb565_dstclip(void __iomem *dst, unsigned int dst_pitch,
-                                      void *vaddr, struct drm_framebuffer *fb,
-                                      struct drm_rect *clip, bool swab);
-void drm_fb_xrgb8888_to_rgb888(void *dst, void *src, struct drm_framebuffer *fb,
-                              struct drm_rect *clip);
-void drm_fb_xrgb8888_to_rgb888_dstclip(void __iomem *dst, unsigned int dst_pitch,
-                                      void *vaddr, struct drm_framebuffer *fb,
-                                      struct drm_rect *clip);
-void drm_fb_xrgb8888_to_gray8(u8 *dst, void *vaddr, struct drm_framebuffer *fb,
-                             struct drm_rect *clip);
+void drm_fb_xrgb8888_to_rgb332(void *dst, unsigned int dst_pitch, const void *vaddr,
+                              const struct drm_framebuffer *fb, const struct drm_rect *clip);
+void drm_fb_xrgb8888_to_rgb565(void *dst, unsigned int dst_pitch, const void *vaddr,
+                              const struct drm_framebuffer *fb, const struct drm_rect *clip,
+                              bool swab);
+void drm_fb_xrgb8888_to_rgb565_toio(void __iomem *dst, unsigned int dst_pitch,
+                                   const void *vaddr, const struct drm_framebuffer *fb,
+                                   const struct drm_rect *clip, bool swab);
+void drm_fb_xrgb8888_to_rgb888(void *dst, unsigned int dst_pitch, const void *src,
+                              const struct drm_framebuffer *fb, const struct drm_rect *clip);
+void drm_fb_xrgb8888_to_rgb888_toio(void __iomem *dst, unsigned int dst_pitch,
+                                   const void *vaddr, const struct drm_framebuffer *fb,
+                                   const struct drm_rect *clip);
+void drm_fb_xrgb8888_to_gray8(void *dst, unsigned int dst_pitch, const void *vaddr,
+                             const struct drm_framebuffer *fb, const struct drm_rect *clip);
 
 int drm_fb_blit_rect_dstclip(void __iomem *dst, unsigned int dst_pitch,
                             uint32_t dst_format, void *vmap,