From: Thomas Zimmermann <tzimmermann@suse.de>
To: airlied@linux.ie, daniel@ffwll.ch,
maarten.lankhorst@linux.intel.com, mripard@kernel.org,
sean@poorly.run, b.zolnierkie@samsung.com, ajax@redhat.com,
ville.syrjala@linux.intel.com, malat@debian.org,
michel@daenzer.net
Cc: gregkh@linuxfoundation.org, linux-fbdev@vger.kernel.org,
Thomas Zimmermann <tzimmermann@suse.de>,
dri-devel@lists.freedesktop.org, corbet@lwn.net
Subject: [PATCH v2 05/15] drm/fbconv: Add DRM <-> fbdev pixel-format conversion
Date: Mon, 14 Oct 2019 16:04:06 +0200 [thread overview]
Message-ID: <20191014140416.28517-6-tzimmermann@suse.de> (raw)
In-Reply-To: <20191014140416.28517-1-tzimmermann@suse.de>
DRM uses FOURCC constants to describe pixel formats, fbdev uses a
per-component bitfield structure. The functions in this patch convert
between the two.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
drivers/gpu/drm/drm_fbconv_helper.c | 435 ++++++++++++++++++++++++++++
include/drm/drm_fbconv_helper.h | 23 ++
2 files changed, 458 insertions(+)
create mode 100644 include/drm/drm_fbconv_helper.h
diff --git a/drivers/gpu/drm/drm_fbconv_helper.c b/drivers/gpu/drm/drm_fbconv_helper.c
index 0cb46d2c98c3..af45358a156a 100644
--- a/drivers/gpu/drm/drm_fbconv_helper.c
+++ b/drivers/gpu/drm/drm_fbconv_helper.c
@@ -1 +1,436 @@
// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include <asm/byteorder.h>
+
+#include <linux/fb.h>
+
+#include <drm/drm_fbconv_helper.h>
+
+/*
+ * Format conversion helpers
+ */
+
+static bool is_c8(const struct fb_var_screeninfo *fb_var)
+{
+ return fb_var->bits_per_pixel == 8;
+}
+
+static bool is_rgb565(const struct fb_var_screeninfo *fb_var)
+{
+ return (fb_var->bits_per_pixel == 16) &&
+ (fb_var->red.offset == 11) &&
+ (fb_var->red.length == 5) &&
+ (fb_var->green.offset == 5) &&
+ (fb_var->green.length == 6) &&
+ (fb_var->blue.offset == 0) &&
+ (fb_var->blue.length == 5);
+}
+
+static bool is_bgr565(const struct fb_var_screeninfo *fb_var)
+{
+ return (fb_var->bits_per_pixel == 16) &&
+ (fb_var->red.offset == 0) &&
+ (fb_var->red.length == 5) &&
+ (fb_var->green.offset == 5) &&
+ (fb_var->green.length == 6) &&
+ (fb_var->blue.offset == 11) &&
+ (fb_var->blue.length == 5);
+}
+
+static bool is_rgb888(const struct fb_var_screeninfo *fb_var)
+{
+ return (fb_var->bits_per_pixel == 24) &&
+ (fb_var->red.offset == 16) &&
+ (fb_var->red.length == 8) &&
+ (fb_var->green.offset == 8) &&
+ (fb_var->green.length == 8) &&
+ (fb_var->blue.offset == 0) &&
+ (fb_var->blue.length == 8);
+}
+
+static bool is_bgr888(const struct fb_var_screeninfo *fb_var)
+{
+ return (fb_var->bits_per_pixel == 24) &&
+ (fb_var->red.offset == 0) &&
+ (fb_var->red.length == 8) &&
+ (fb_var->green.offset == 8) &&
+ (fb_var->green.length == 8) &&
+ (fb_var->blue.offset == 16) &&
+ (fb_var->blue.length == 8);
+}
+
+static bool is_xrgb8888(const struct fb_var_screeninfo *fb_var)
+{
+ return (fb_var->bits_per_pixel == 32) &&
+ (fb_var->red.offset == 16) &&
+ (fb_var->red.length == 8) &&
+ (fb_var->green.offset == 8) &&
+ (fb_var->green.length == 8) &&
+ (fb_var->blue.offset == 0) &&
+ (fb_var->blue.length == 8) &&
+ (fb_var->transp.length == 0);
+}
+
+static bool is_xbgr8888(const struct fb_var_screeninfo *fb_var)
+{
+ return (fb_var->bits_per_pixel == 32) &&
+ (fb_var->red.offset == 0) &&
+ (fb_var->red.length == 8) &&
+ (fb_var->green.offset == 8) &&
+ (fb_var->green.length == 8) &&
+ (fb_var->blue.offset == 16) &&
+ (fb_var->blue.length == 8) &&
+ (fb_var->transp.length == 0);
+}
+
+static bool is_rgbx8888(const struct fb_var_screeninfo *fb_var)
+{
+ return (fb_var->bits_per_pixel == 32) &&
+ (fb_var->red.offset == 24) &&
+ (fb_var->red.length == 8) &&
+ (fb_var->green.offset == 16) &&
+ (fb_var->green.length == 8) &&
+ (fb_var->blue.offset == 8) &&
+ (fb_var->blue.length == 8) &&
+ (fb_var->transp.length == 0);
+}
+
+static bool is_bgrx8888(const struct fb_var_screeninfo *fb_var)
+{
+ return (fb_var->bits_per_pixel == 32) &&
+ (fb_var->red.offset == 8) &&
+ (fb_var->red.length == 8) &&
+ (fb_var->green.offset == 16) &&
+ (fb_var->green.length == 8) &&
+ (fb_var->blue.offset == 24) &&
+ (fb_var->blue.length == 8) &&
+ (fb_var->transp.length == 0);
+}
+
+static bool is_argb8888(const struct fb_var_screeninfo *fb_var)
+{
+ return (fb_var->bits_per_pixel == 32) &&
+ (fb_var->red.offset == 16) &&
+ (fb_var->red.length == 8) &&
+ (fb_var->green.offset == 8) &&
+ (fb_var->green.length == 8) &&
+ (fb_var->blue.offset == 0) &&
+ (fb_var->blue.length == 8) &&
+ (fb_var->transp.offset == 24) &&
+ (fb_var->transp.length == 8);
+}
+
+static bool is_abgr8888(const struct fb_var_screeninfo *fb_var)
+{
+ return (fb_var->bits_per_pixel == 32) &&
+ (fb_var->red.offset == 0) &&
+ (fb_var->red.length == 8) &&
+ (fb_var->green.offset == 8) &&
+ (fb_var->green.length == 8) &&
+ (fb_var->blue.offset == 16) &&
+ (fb_var->blue.length == 8) &&
+ (fb_var->transp.offset == 24) &&
+ (fb_var->transp.length == 8);
+}
+
+static bool is_rgba8888(const struct fb_var_screeninfo *fb_var)
+{
+ return (fb_var->bits_per_pixel == 32) &&
+ (fb_var->red.offset == 24) &&
+ (fb_var->red.length == 8) &&
+ (fb_var->green.offset == 16) &&
+ (fb_var->green.length == 8) &&
+ (fb_var->blue.offset == 8) &&
+ (fb_var->blue.length == 8) &&
+ (fb_var->transp.offset == 0) &&
+ (fb_var->transp.length == 8);
+}
+
+static bool is_bgra8888(const struct fb_var_screeninfo *fb_var)
+{
+ return (fb_var->bits_per_pixel == 32) &&
+ (fb_var->red.offset == 8) &&
+ (fb_var->red.length == 8) &&
+ (fb_var->green.offset == 16) &&
+ (fb_var->green.length == 8) &&
+ (fb_var->blue.offset == 24) &&
+ (fb_var->blue.length == 8) &&
+ (fb_var->transp.offset == 0) &&
+ (fb_var->transp.length == 8);
+}
+
+struct format_map {
+ bool (*is_format)(const struct fb_var_screeninfo *fb_var);
+ uint32_t format;
+};
+
+/**
+ * drm_fbconv_format_of_fb_var_screeninfo - Returns a DRM_FORMAT constant
+ * from an fb_var_screeninfo structure
+ * @fb_info: the fb_var_screeninfo structure
+ * Returns:
+ * A DRM_FORMAT constant on success, or
+ * DRM_FORMAT_INVALID otherwise.
+ */
+uint32_t
+drm_fbconv_format_of_fb_var_screeninfo(const struct fb_var_screeninfo *fb_var)
+{
+ static const struct format_map map[] = {
+ { is_c8, DRM_FORMAT_C8 }, /* 256-color palette */
+ { is_rgb565, DRM_FORMAT_RGB565 },
+ { is_bgr565, DRM_FORMAT_BGR565 },
+ { is_rgb888, DRM_FORMAT_RGB888 },
+ { is_bgr888, DRM_FORMAT_BGR888 },
+ { is_xrgb8888, DRM_FORMAT_XRGB8888 },
+ { is_xbgr8888, DRM_FORMAT_XBGR8888 },
+ { is_rgbx8888, DRM_FORMAT_RGBX8888 },
+ { is_bgrx8888, DRM_FORMAT_BGRX8888 },
+ { is_argb8888, DRM_FORMAT_ARGB8888 },
+ { is_abgr8888, DRM_FORMAT_ABGR8888 },
+ { is_rgba8888, DRM_FORMAT_RGBA8888 },
+ { is_bgra8888, DRM_FORMAT_BGRA8888 }
+ };
+
+ size_t i;
+
+ if (fb_var->bits_per_pixel < 8)
+ goto err; /* at least 8-bit color required */
+ if (fb_var->grayscale == 1)
+ goto err; /* grayscale output is not supported */
+
+ for (i = 0; i < ARRAY_SIZE(map); ++i) {
+ if (map[i].is_format(fb_var))
+ return map[i].format;
+ }
+
+err:
+ return DRM_FORMAT_INVALID;
+}
+EXPORT_SYMBOL(drm_fbconv_format_of_fb_var_screeninfo);
+
+/**
+ * drm_fbconv_format_of_fb_info - Returns a DRM_FORMAT constant from
+ * an fb_info structure
+ * @fb_info: the fb_info structure
+ * Returns:
+ * A DRM_FORMAT constant on success, or
+ * DRM_FORMAT_INVALID otherwise.
+ */
+uint32_t drm_fbconv_format_of_fb_info(const struct fb_info *fb_info)
+{
+ if (fb_info->fix.type != FB_TYPE_PACKED_PIXELS)
+ return DRM_FORMAT_INVALID; /* no multi-plane formats */
+
+ return drm_fbconv_format_of_fb_var_screeninfo(&fb_info->var);
+}
+EXPORT_SYMBOL(drm_fbconv_format_of_fb_info);
+
+static void set_fb_bitfield(struct fb_bitfield *bits, __u32 offset,
+ __u32 length)
+{
+ bits->offset = offset;
+ bits->length = length;
+ bits->msb_right = 0;
+}
+
+static void set_c8(struct fb_var_screeninfo *fb_var)
+{
+ fb_var->bits_per_pixel = 8;
+ fb_var->grayscale = 0;
+ set_fb_bitfield(&fb_var->red, 0, 8);
+ set_fb_bitfield(&fb_var->green, 0, 8);
+ set_fb_bitfield(&fb_var->blue, 0, 8);
+ set_fb_bitfield(&fb_var->transp, 0, 0);
+ fb_var->nonstd = 0;
+}
+
+static void set_rgb565(struct fb_var_screeninfo *fb_var)
+{
+ fb_var->bits_per_pixel = 16;
+ fb_var->grayscale = 0;
+ set_fb_bitfield(&fb_var->red, 11, 5);
+ set_fb_bitfield(&fb_var->green, 5, 6);
+ set_fb_bitfield(&fb_var->blue, 0, 5);
+ set_fb_bitfield(&fb_var->transp, 0, 0);
+ fb_var->nonstd = 0;
+}
+
+static void set_bgr565(struct fb_var_screeninfo *fb_var)
+{
+ fb_var->bits_per_pixel = 16;
+ fb_var->grayscale = 0;
+ set_fb_bitfield(&fb_var->red, 0, 5);
+ set_fb_bitfield(&fb_var->green, 5, 6);
+ set_fb_bitfield(&fb_var->blue, 11, 5);
+ set_fb_bitfield(&fb_var->transp, 0, 0);
+ fb_var->nonstd = 0;
+}
+
+static void set_rgb888(struct fb_var_screeninfo *fb_var)
+{
+ fb_var->bits_per_pixel = 24;
+ fb_var->grayscale = 0;
+ set_fb_bitfield(&fb_var->red, 16, 8);
+ set_fb_bitfield(&fb_var->green, 8, 8);
+ set_fb_bitfield(&fb_var->blue, 0, 8);
+ set_fb_bitfield(&fb_var->transp, 0, 0);
+ fb_var->nonstd = 0;
+}
+
+static void set_bgr888(struct fb_var_screeninfo *fb_var)
+{
+ fb_var->bits_per_pixel = 24;
+ fb_var->grayscale = 0;
+ set_fb_bitfield(&fb_var->red, 0, 8);
+ set_fb_bitfield(&fb_var->green, 8, 8);
+ set_fb_bitfield(&fb_var->blue, 16, 8);
+ set_fb_bitfield(&fb_var->transp, 0, 0);
+ fb_var->nonstd = 0;
+}
+
+static void set_xrgb8888(struct fb_var_screeninfo *fb_var)
+{
+ fb_var->bits_per_pixel = 32;
+ fb_var->grayscale = 0;
+ set_fb_bitfield(&fb_var->red, 16, 8);
+ set_fb_bitfield(&fb_var->green, 8, 8);
+ set_fb_bitfield(&fb_var->blue, 0, 8);
+ set_fb_bitfield(&fb_var->transp, 24, 0);
+ fb_var->nonstd = 0;
+}
+
+static void set_xbgr8888(struct fb_var_screeninfo *fb_var)
+{
+ fb_var->bits_per_pixel = 32;
+ fb_var->grayscale = 0;
+ set_fb_bitfield(&fb_var->red, 0, 8);
+ set_fb_bitfield(&fb_var->green, 8, 8);
+ set_fb_bitfield(&fb_var->blue, 16, 8);
+ set_fb_bitfield(&fb_var->transp, 24, 0);
+ fb_var->nonstd = 0;
+}
+
+static void set_rgbx8888(struct fb_var_screeninfo *fb_var)
+{
+ fb_var->bits_per_pixel = 32;
+ fb_var->grayscale = 0;
+ set_fb_bitfield(&fb_var->red, 24, 8);
+ set_fb_bitfield(&fb_var->green, 16, 8);
+ set_fb_bitfield(&fb_var->blue, 8, 8);
+ set_fb_bitfield(&fb_var->transp, 0, 0);
+ fb_var->nonstd = 0;
+}
+
+static void set_bgrx8888(struct fb_var_screeninfo *fb_var)
+{
+ fb_var->bits_per_pixel = 32;
+ fb_var->grayscale = 0;
+ set_fb_bitfield(&fb_var->red, 8, 8);
+ set_fb_bitfield(&fb_var->green, 16, 8);
+ set_fb_bitfield(&fb_var->blue, 24, 8);
+ set_fb_bitfield(&fb_var->transp, 0, 0);
+ fb_var->nonstd = 0;
+}
+
+static void set_argb8888(struct fb_var_screeninfo *fb_var)
+{
+ fb_var->bits_per_pixel = 32;
+ fb_var->grayscale = 0;
+ set_fb_bitfield(&fb_var->red, 16, 8);
+ set_fb_bitfield(&fb_var->green, 8, 8);
+ set_fb_bitfield(&fb_var->blue, 0, 8);
+ set_fb_bitfield(&fb_var->transp, 24, 8);
+ fb_var->nonstd = 0;
+}
+
+static void set_abgr8888(struct fb_var_screeninfo *fb_var)
+{
+ fb_var->bits_per_pixel = 32;
+ fb_var->grayscale = 0;
+ set_fb_bitfield(&fb_var->red, 0, 8);
+ set_fb_bitfield(&fb_var->green, 8, 8);
+ set_fb_bitfield(&fb_var->blue, 16, 8);
+ set_fb_bitfield(&fb_var->transp, 24, 8);
+ fb_var->nonstd = 0;
+}
+
+static void set_rgba8888(struct fb_var_screeninfo *fb_var)
+{
+ fb_var->bits_per_pixel = 32;
+ fb_var->grayscale = 0;
+ set_fb_bitfield(&fb_var->red, 24, 8);
+ set_fb_bitfield(&fb_var->green, 16, 8);
+ set_fb_bitfield(&fb_var->blue, 8, 8);
+ set_fb_bitfield(&fb_var->transp, 0, 8);
+ fb_var->nonstd = 0;
+}
+
+static void set_bgra8888(struct fb_var_screeninfo *fb_var)
+{
+ fb_var->bits_per_pixel = 32;
+ fb_var->grayscale = 0;
+ set_fb_bitfield(&fb_var->red, 8, 8);
+ set_fb_bitfield(&fb_var->green, 16, 8);
+ set_fb_bitfield(&fb_var->blue, 24, 8);
+ set_fb_bitfield(&fb_var->transp, 0, 8);
+ fb_var->nonstd = 0;
+}
+
+/**
+ * drm_fbconv_update_fb_var_screen_info_from_format - sets the pixel format
+ * of a fb_var_screeninfo structure from a DRM_FORMAT constant
+ * @fb_var: the fb_var_screeninfo structure to update
+ * @format: a DRM_FORMAT constant
+ * Returns:
+ * 0 on success, or
+ * a negative error code otherwise.
+ */
+int drm_fbconv_update_fb_var_screeninfo_from_format(
+ struct fb_var_screeninfo *fb_var, uint32_t format)
+{
+ switch (format) {
+ case DRM_FORMAT_C8:
+ set_c8(fb_var);
+ break;
+ case DRM_FORMAT_RGB565:
+ set_rgb565(fb_var);
+ break;
+ case DRM_FORMAT_BGR565:
+ set_bgr565(fb_var);
+ break;
+ case DRM_FORMAT_RGB888:
+ set_rgb888(fb_var);
+ break;
+ case DRM_FORMAT_BGR888:
+ set_bgr888(fb_var);
+ break;
+ case DRM_FORMAT_XRGB8888:
+ set_xrgb8888(fb_var);
+ break;
+ case DRM_FORMAT_XBGR8888:
+ set_xbgr8888(fb_var);
+ break;
+ case DRM_FORMAT_RGBX8888:
+ set_rgbx8888(fb_var);
+ break;
+ case DRM_FORMAT_BGRX8888:
+ set_bgrx8888(fb_var);
+ break;
+ case DRM_FORMAT_ARGB8888:
+ set_argb8888(fb_var);
+ break;
+ case DRM_FORMAT_ABGR8888:
+ set_abgr8888(fb_var);
+ break;
+ case DRM_FORMAT_RGBA8888:
+ set_rgba8888(fb_var);
+ break;
+ case DRM_FORMAT_BGRA8888:
+ set_bgra8888(fb_var);
+ break;
+ default:
+ return -EINVAL;
+ }
+ return 0;
+}
+EXPORT_SYMBOL(drm_fbconv_update_fb_var_screeninfo_from_format);
diff --git a/include/drm/drm_fbconv_helper.h b/include/drm/drm_fbconv_helper.h
new file mode 100644
index 000000000000..6b2ed12b579a
--- /dev/null
+++ b/include/drm/drm_fbconv_helper.h
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#ifndef DRM_FBCONV_HELPER_H
+#define DRM_FBCONV_HELPER_H
+
+#include <drm/drm_fourcc.h>
+
+struct fb_info;
+struct fb_var_screeninfo;
+
+/*
+ * Format conversion helpers
+ */
+
+uint32_t
+drm_fbconv_format_of_fb_var_screeninfo(const struct fb_var_screeninfo *fb_var);
+
+uint32_t drm_fbconv_format_of_fb_info(const struct fb_info *fb_info);
+
+int drm_fbconv_update_fb_var_screeninfo_from_format(
+ struct fb_var_screeninfo *fb_var, uint32_t format);
+
+#endif
--
2.23.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2019-10-14 14:04 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-14 14:04 [PATCH v2 00/15] DRM fbconv helpers for converting fbdev drivers Thomas Zimmermann
2019-10-14 14:04 ` [PATCH v2 01/15] fbdev: Export fb_check_foreignness() Thomas Zimmermann
2019-10-14 14:04 ` [PATCH v2 02/15] fbdev: Export FBPIXMAPSIZE Thomas Zimmermann
2019-10-14 14:04 ` [PATCH v2 03/15] drm/simple-kms-helper: Add mode_fixup() to simple display pipe Thomas Zimmermann
2019-10-14 14:04 ` [PATCH v2 04/15] drm: Add fbconv helper module Thomas Zimmermann
2019-10-14 14:04 ` Thomas Zimmermann [this message]
2019-10-14 20:30 ` [PATCH v2 05/15] drm/fbconv: Add DRM <-> fbdev pixel-format conversion Sam Ravnborg
2019-10-15 5:48 ` Thomas Zimmermann
2019-10-14 14:04 ` [PATCH v2 06/15] drm/fbconv: Add mode conversion DRM <-> fbdev Thomas Zimmermann
2019-10-14 14:04 ` [PATCH v2 07/15] drm/fbconv: Add modesetting infrastructure Thomas Zimmermann
2019-10-14 14:04 ` [PATCH v2 08/15] drm/fbconv: Add plane-state check and update Thomas Zimmermann
2019-10-15 8:30 ` kbuild test robot
2019-10-15 17:28 ` kbuild test robot
2019-10-14 14:04 ` [PATCH v2 09/15] drm/fbconv: Mode-setting pipeline enable / disable Thomas Zimmermann
2022-05-28 20:17 ` Geert Uytterhoeven
2022-05-30 7:47 ` Thomas Zimmermann
2022-05-30 8:34 ` Geert Uytterhoeven
2022-07-01 20:01 ` Geert Uytterhoeven
2019-10-14 14:04 ` [PATCH v2 10/15] drm/fbconv: Reimplement several fbdev interfaces Thomas Zimmermann
2019-10-14 14:04 ` [PATCH v2 11/15] drm/fbconv: Add helpers for init and cleanup of fb_info structures Thomas Zimmermann
2019-10-14 14:04 ` [PATCH v2 12/15] drm/fbconv: Add helper documentation Thomas Zimmermann
2019-10-15 8:40 ` kbuild test robot
2019-10-14 14:04 ` [PATCH v2 13/15] staging: Add mgakms driver Thomas Zimmermann
2019-10-14 14:04 ` [PATCH v2 14/15] staging/mgakms: Import matroxfb driver source code Thomas Zimmermann
2019-10-15 11:48 ` Ville Syrjälä
2019-10-15 12:46 ` Thomas Zimmermann
2019-10-14 14:04 ` [PATCH v2 15/15] staging/mgakms: Update matroxfb driver code for DRM Thomas Zimmermann
2019-10-17 16:04 ` kbuild test robot
2019-10-17 16:19 ` kbuild test robot
2019-10-14 20:36 ` [PATCH v2 00/15] DRM fbconv helpers for converting fbdev drivers Sam Ravnborg
2019-10-15 6:11 ` Thomas Zimmermann
2019-10-15 14:33 ` Daniel Vetter
2019-10-15 17:28 ` Thomas Zimmermann
2019-10-15 17:48 ` Daniel Vetter
2019-10-15 18:05 ` Greg KH
2019-10-15 18:13 ` Ville Syrjälä
2019-10-15 18:28 ` Ville Syrjälä
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191014140416.28517-6-tzimmermann@suse.de \
--to=tzimmermann@suse.de \
--cc=airlied@linux.ie \
--cc=ajax@redhat.com \
--cc=b.zolnierkie@samsung.com \
--cc=corbet@lwn.net \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=gregkh@linuxfoundation.org \
--cc=linux-fbdev@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=malat@debian.org \
--cc=michel@daenzer.net \
--cc=mripard@kernel.org \
--cc=sean@poorly.run \
--cc=ville.syrjala@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox