From: Alexander Stein <alexander.stein@ew.tq-group.com>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>,
Michael Riesch <michael.riesch@wolfvision.net>,
Sakari Ailus <sakari.ailus@linux.intel.com>,
Gerald Loacker <gerald.loacker@wolfvision.net>,
linux-media@vger.kernel.org
Subject: Re: [PATCH 3/3] media: i2c: imx415: Add more supported modes
Date: Tue, 05 Dec 2023 12:12:57 +0100 [thread overview]
Message-ID: <12337827.O9o76ZdvQC@steina-w> (raw)
In-Reply-To: <20231205104509.GB17394@pendragon.ideasonboard.com>
Hi Laurent,
Am Dienstag, 5. Dezember 2023, 11:45:09 CET schrieb Laurent Pinchart:
> Hi Alexander,
>
> Thank you for the patch.
>
> On Tue, Dec 05, 2023 at 10:05:57AM +0100, Alexander Stein wrote:
> > These modes are listed in section "All-pixel mode" of the datasheet
> > IMX415-AAQR-C (Rev. E19504, 2019/05/21).
> > hmax_pix and pixel_rate are taken from the comment above the mode list.
> >
> > Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
> > ---
> >
> > drivers/media/i2c/imx415.c | 362 +++++++++++++++++++++++++++++++++++++
> > 1 file changed, 362 insertions(+)
> >
> > diff --git a/drivers/media/i2c/imx415.c b/drivers/media/i2c/imx415.c
> > index a222b9134aa2..48b8ae6d790d 100644
> > --- a/drivers/media/i2c/imx415.c
> > +++ b/drivers/media/i2c/imx415.c
> > @@ -445,6 +445,38 @@ static const struct imx415_clk_params
> > imx415_clk_params[] = {>
> > },
> >
> > };
> >
> > +/* all-pixel 2-lane 594 Mbps 10 Hz mode */
> > +static const struct cci_reg_sequence imx415_mode_2_594[] = {
> > + { IMX415_VMAX, 0x08CA },
> > + { IMX415_HMAX, 0x0CE4 },
> > + { IMX415_LANEMODE, IMX415_LANEMODE_2 },
> > + { IMX415_TCLKPOST, 0x0067 },
> > + { IMX415_TCLKPREPARE, 0x0027 },
> > + { IMX415_TCLKTRAIL, 0x0027 },
> > + { IMX415_TCLKZERO, 0x00B7 },
> > + { IMX415_THSPREPARE, 0x002F },
> > + { IMX415_THSZERO, 0x004F },
> > + { IMX415_THSTRAIL, 0x002F },
> > + { IMX415_THSEXIT, 0x0047 },
> > + { IMX415_TLPX, 0x0027 },
> > +};
> > +
> > +/* all-pixel 2-lane 891 Mbps 15 Hz mode */
> > +static const struct cci_reg_sequence imx415_mode_2_891[] = {
> > + { IMX415_VMAX, 0x08CA },
> > + { IMX415_HMAX, 0x0898 },
> > + { IMX415_LANEMODE, IMX415_LANEMODE_2 },
> > + { IMX415_TCLKPOST, 0x007F },
> > + { IMX415_TCLKPREPARE, 0x0037 },
> > + { IMX415_TCLKTRAIL, 0x0037 },
> > + { IMX415_TCLKZERO, 0x00F7 },
> > + { IMX415_THSPREPARE, 0x003F },
> > + { IMX415_THSZERO, 0x006F },
> > + { IMX415_THSTRAIL, 0x003F },
> > + { IMX415_THSEXIT, 0x005F },
> > + { IMX415_TLPX, 0x002F },
> > +};
> > +
> >
> > /* all-pixel 2-lane 720 Mbps 15.74 Hz mode */
> > static const struct cci_reg_sequence imx415_mode_2_720[] = {
> >
> > { IMX415_VMAX, 0x08CA },
> >
> > @@ -461,6 +493,38 @@ static const struct cci_reg_sequence
> > imx415_mode_2_720[] = {>
> > { IMX415_TLPX, 0x0027 },
> >
> > };
> >
> > +/* all-pixel 2-lane 1782 Mbps 30 Hz mode */
> > +static const struct cci_reg_sequence imx415_mode_2_1782[] = {
> > + { IMX415_VMAX, 0x08CA },
> > + { IMX415_HMAX, 0x044C },
> > + { IMX415_LANEMODE, IMX415_LANEMODE_2 },
> > + { IMX415_TCLKPOST, 0x00B7 },
> > + { IMX415_TCLKPREPARE, 0x0067 },
> > + { IMX415_TCLKTRAIL, 0x006F },
> > + { IMX415_TCLKZERO, 0x01DF },
> > + { IMX415_THSPREPARE, 0x006F },
> > + { IMX415_THSZERO, 0x00CF },
> > + { IMX415_THSTRAIL, 0x006F },
> > + { IMX415_THSEXIT, 0x00B7 },
> > + { IMX415_TLPX, 0x005F },
> > +};
> > +
> > +/* all-pixel 2-lane 2079 Mbps 30 Hz mode */
> > +static const struct cci_reg_sequence imx415_mode_2_2079[] = {
> > + { IMX415_VMAX, 0x08CA },
> > + { IMX415_HMAX, 0x044C },
> > + { IMX415_LANEMODE, IMX415_LANEMODE_2 },
> > + { IMX415_TCLKPOST, 0x00D7 },
> > + { IMX415_TCLKPREPARE, 0x007F },
> > + { IMX415_TCLKTRAIL, 0x007F },
> > + { IMX415_TCLKZERO, 0x0237 },
> > + { IMX415_THSPREPARE, 0x0087 },
> > + { IMX415_THSZERO, 0x00EF },
> > + { IMX415_THSTRAIL, 0x0087 },
> > + { IMX415_THSEXIT, 0x00DF },
> > + { IMX415_TLPX, 0x006F },
> > +};
> > +
> >
> > /* all-pixel 2-lane 1440 Mbps 30.01 Hz mode */
> > static const struct cci_reg_sequence imx415_mode_2_1440[] = {
> >
> > { IMX415_VMAX, 0x08CA },
> >
> > @@ -477,6 +541,70 @@ static const struct cci_reg_sequence
> > imx415_mode_2_1440[] = {>
> > { IMX415_TLPX, 0x004F },
> >
> > };
> >
> > +/* all-pixel 4-lane 594 Mbps 20 Hz mode */
> > +static const struct cci_reg_sequence imx415_mode_4_594_20fps[] = {
> > + { IMX415_VMAX, 0x08CA },
> > + { IMX415_HMAX, 0x0672 },
> > + { IMX415_LANEMODE, IMX415_LANEMODE_4 },
> > + { IMX415_TCLKPOST, 0x0067 },
> > + { IMX415_TCLKPREPARE, 0x0027 },
> > + { IMX415_TCLKTRAIL, 0x0027 },
> > + { IMX415_TCLKZERO, 0x00B7 },
> > + { IMX415_THSPREPARE, 0x002F },
> > + { IMX415_THSZERO, 0x004F },
> > + { IMX415_THSTRAIL, 0x002F },
> > + { IMX415_THSEXIT, 0x0047 },
> > + { IMX415_TLPX, 0x0027 },
> > +};
> > +
> > +/* all-pixel 4-lane 594 Mbps 25 Hz mode */
> > +static const struct cci_reg_sequence imx415_mode_4_594_25fps[] = {
> > + { IMX415_VMAX, 0x08CA },
> > + { IMX415_HMAX, 0x0528 },
> > + { IMX415_LANEMODE, IMX415_LANEMODE_4 },
> > + { IMX415_TCLKPOST, 0x0067 },
> > + { IMX415_TCLKPREPARE, 0x0027 },
> > + { IMX415_TCLKTRAIL, 0x0027 },
> > + { IMX415_TCLKZERO, 0x00B7 },
> > + { IMX415_THSPREPARE, 0x002F },
> > + { IMX415_THSZERO, 0x004F },
> > + { IMX415_THSTRAIL, 0x002F },
> > + { IMX415_THSEXIT, 0x0047 },
> > + { IMX415_TLPX, 0x0027 },
> > +};
> > +
> > +/* all-pixel 4-lane 720 Mbps 25 Hz mode */
> > +static const struct cci_reg_sequence imx415_mode_4_720_25fps[] = {
> > + { IMX415_VMAX, 0x08CA },
> > + { IMX415_HMAX, 0x0500 },
> > + { IMX415_LANEMODE, IMX415_LANEMODE_4 },
> > + { IMX415_TCLKPOST, 0x006F },
> > + { IMX415_TCLKPREPARE, 0x002F },
> > + { IMX415_TCLKTRAIL, 0x002F },
> > + { IMX415_TCLKZERO, 0x00BF },
> > + { IMX415_THSPREPARE, 0x002F },
> > + { IMX415_THSZERO, 0x0057 },
> > + { IMX415_THSTRAIL, 0x002F },
> > + { IMX415_THSEXIT, 0x004F },
> > + { IMX415_TLPX, 0x0027 },
> > +};
> > +
> > +/* all-pixel 4-lane 720 Mbps 30.01 Hz mode */
> > +static const struct cci_reg_sequence imx415_mode_4_720_30fps[] = {
> > + { IMX415_VMAX, 0x08CA },
> > + { IMX415_HMAX, 0x042A },
> > + { IMX415_LANEMODE, IMX415_LANEMODE_4 },
> > + { IMX415_TCLKPOST, 0x006F },
> > + { IMX415_TCLKPREPARE, 0x002F },
> > + { IMX415_TCLKTRAIL, 0x002F },
> > + { IMX415_TCLKZERO, 0x00BF },
> > + { IMX415_THSPREPARE, 0x002F },
> > + { IMX415_THSZERO, 0x0057 },
> > + { IMX415_THSTRAIL, 0x002F },
> > + { IMX415_THSEXIT, 0x004F },
> > + { IMX415_TLPX, 0x0027 },
> > +};
> > +
> >
> > /* all-pixel 4-lane 891 Mbps 30 Hz mode */
> > static const struct cci_reg_sequence imx415_mode_4_891[] = {
> >
> > { IMX415_VMAX, 0x08CA },
> >
> > @@ -493,6 +621,102 @@ static const struct cci_reg_sequence
> > imx415_mode_4_891[] = {>
> > { IMX415_TLPX, 0x002F },
> >
> > };
> >
> > +/* all-pixel 4-lane 1440 Mbps 30.01 Hz mode */
> > +static const struct cci_reg_sequence imx415_mode_4_1440_30fps[] = {
> > + { IMX415_VMAX, 0x08CA },
> > + { IMX415_HMAX, 0x042A },
> > + { IMX415_LANEMODE, IMX415_LANEMODE_4 },
> > + { IMX415_TCLKPOST, 0x009F },
> > + { IMX415_TCLKPREPARE, 0x0057 },
> > + { IMX415_TCLKTRAIL, 0x0057 },
> > + { IMX415_TCLKZERO, 0x0187 },
> > + { IMX415_THSPREPARE, 0x005F },
> > + { IMX415_THSZERO, 0x00A7 },
> > + { IMX415_THSTRAIL, 0x005F },
> > + { IMX415_THSEXIT, 0x0097 },
> > + { IMX415_TLPX, 0x004F },
> > +};
> > +
> > +/* all-pixel 4-lane 1440 Mbps 60.03 Hz mode */
> > +static const struct cci_reg_sequence imx415_mode_4_1440_60fps[] = {
> > + { IMX415_VMAX, 0x08CA },
> > + { IMX415_HMAX, 0x0215 },
> > + { IMX415_LANEMODE, IMX415_LANEMODE_4 },
> > + { IMX415_TCLKPOST, 0x009F },
> > + { IMX415_TCLKPREPARE, 0x0057 },
> > + { IMX415_TCLKTRAIL, 0x0057 },
> > + { IMX415_TCLKZERO, 0x0187 },
> > + { IMX415_THSPREPARE, 0x005F },
> > + { IMX415_THSZERO, 0x00A7 },
> > + { IMX415_THSTRAIL, 0x005F },
> > + { IMX415_THSEXIT, 0x0097 },
> > + { IMX415_TLPX, 0x004F },
> > +};
> > +
> > +/* all-pixel 4-lane 1485 Mbps 60 Hz mode */
> > +static const struct cci_reg_sequence imx415_mode_4_1485[] = {
> > + { IMX415_VMAX, 0x08CA },
> > + { IMX415_HMAX, 0x0226 },
> > + { IMX415_LANEMODE, IMX415_LANEMODE_4 },
> > + { IMX415_TCLKPOST, 0x00A7 },
> > + { IMX415_TCLKPREPARE, 0x0057 },
> > + { IMX415_TCLKTRAIL, 0x005F },
> > + { IMX415_TCLKZERO, 0x0197 },
> > + { IMX415_THSPREPARE, 0x005F },
> > + { IMX415_THSZERO, 0x00AF },
> > + { IMX415_THSTRAIL, 0x005F },
> > + { IMX415_THSEXIT, 0x009F },
> > + { IMX415_TLPX, 0x004F },
> > +};
> > +
> > +/* all-pixel 4-lane 1782 Mbps 60 Hz mode */
> > +static const struct cci_reg_sequence imx415_mode_4_1782[] = {
> > + { IMX415_VMAX, 0x08CA },
> > + { IMX415_HMAX, 0x0226 },
> > + { IMX415_LANEMODE, IMX415_LANEMODE_4 },
> > + { IMX415_TCLKPOST, 0x00B7 },
> > + { IMX415_TCLKPREPARE, 0x0067 },
> > + { IMX415_TCLKTRAIL, 0x006F },
> > + { IMX415_TCLKZERO, 0x01DF },
> > + { IMX415_THSPREPARE, 0x006F },
> > + { IMX415_THSZERO, 0x00CF },
> > + { IMX415_THSTRAIL, 0x006F },
> > + { IMX415_THSEXIT, 0x00B7 },
> > + { IMX415_TLPX, 0x005F },
> > +};
> > +
> > +/* all-pixel 4-lane 2079 Mbps 60 Hz mode */
> > +static const struct cci_reg_sequence imx415_mode_4_2079[] = {
> > + { IMX415_VMAX, 0x08CA },
> > + { IMX415_HMAX, 0x0226 },
> > + { IMX415_LANEMODE, IMX415_LANEMODE_4 },
> > + { IMX415_TCLKPOST, 0x00D7 },
> > + { IMX415_TCLKPREPARE, 0x007F },
> > + { IMX415_TCLKTRAIL, 0x007F },
> > + { IMX415_TCLKZERO, 0x0237 },
> > + { IMX415_THSPREPARE, 0x0087 },
> > + { IMX415_THSZERO, 0x00EF },
> > + { IMX415_THSTRAIL, 0x0087 },
> > + { IMX415_THSEXIT, 0x00DF },
> > + { IMX415_TLPX, 0x006F },
> > +};
> > +
> > +/* all-pixel 4-lane 2376 Mbps 60 Hz mode */
> > +static const struct cci_reg_sequence imx415_mode_4_2376[] = {
> > + { IMX415_VMAX, 0x08CA },
> > + { IMX415_HMAX, 0x016E },
> > + { IMX415_LANEMODE, IMX415_LANEMODE_4 },
> > + { IMX415_TCLKPOST, 0x00E7 },
> > + { IMX415_TCLKPREPARE, 0x008F },
> > + { IMX415_TCLKTRAIL, 0x008F },
> > + { IMX415_TCLKZERO, 0x027F },
> > + { IMX415_THSPREPARE, 0x0097 },
> > + { IMX415_THSZERO, 0x010F },
> > + { IMX415_THSTRAIL, 0x0097 },
> > + { IMX415_THSEXIT, 0x00F7 },
> > + { IMX415_TLPX, 0x007F },
> > +};
> > +
> >
> > struct imx415_mode_reg_list {
> >
> > u32 num_of_regs;
> > const struct cci_reg_sequence *regs;
> >
> > @@ -536,6 +760,26 @@ struct imx415_mode {
> >
> > /* mode configs */
> > static const struct imx415_mode supported_modes[] = {
> >
> > + {
> > + .lane_rate = 594000000,
> > + .lanes = 2,
> > + .hmax_pix = 4400,
> > + .pixel_rate = 99000000,
> > + .reg_list = {
> > + .num_of_regs = ARRAY_SIZE(imx415_mode_2_594),
> > + .regs = imx415_mode_2_594,
> > + },
> > + },
> > + {
> > + .lane_rate = 891000000,
> > + .lanes = 2,
> > + .hmax_pix = 4400,
> > + .pixel_rate = 148500000,
> > + .reg_list = {
> > + .num_of_regs = ARRAY_SIZE(imx415_mode_2_891),
> > + .regs = imx415_mode_2_891,
> > + },
> > + },
> >
> > {
> >
> > .lane_rate = 720000000,
> > .lanes = 2,
> >
> > @@ -547,6 +791,24 @@ static const struct imx415_mode supported_modes[] = {
> >
> > },
> >
> > },
> > {
> >
> > + .lane_rate = 1782000000,
> > + .lanes = 2,
> > + .hmax_pix = 4400,
> > + .pixel_rate = 297000000,
> > + .reg_list = {
> > + .num_of_regs = ARRAY_SIZE(imx415_mode_2_1782),
> > + .regs = imx415_mode_2_1782,
> > + },
> > + }, {
> > + .lane_rate = 2079000000,
> > + .lanes = 2,
> > + .hmax_pix = 4400,
> > + .pixel_rate = 304615385,
> > + .reg_list = {
> > + .num_of_regs = ARRAY_SIZE(imx415_mode_2_2079),
> > + .regs = imx415_mode_2_2079,
> > + },
> > + }, {
> >
> > .lane_rate = 1440000000,
> > .lanes = 2,
> > .hmax_pix = 4510,
> >
> > @@ -556,6 +818,46 @@ static const struct imx415_mode supported_modes[] = {
> >
> > .regs = imx415_mode_2_1440,
> >
> > },
> >
> > },
> >
> > + {
> > + .lane_rate = 594000000,
> > + .lanes = 4,
> > + .hmax_pix = 5500,
> > + .pixel_rate = 247500000,
> > + .reg_list = {
> > + .num_of_regs =
ARRAY_SIZE(imx415_mode_4_594_20fps),
> > + .regs = imx415_mode_4_594_20fps,
> > + },
> > + },
> > + {
> > + .lane_rate = 594000000,
> > + .lanes = 4,
>
> The mode is selected from the number of data lanes and the lane rate.
> They're the same as the previous entry, so this entry will never be
> selected. Same below.
I noticed that as well. The datasheet lists different FPS for the same link
frequency / lane combination, only HMAX being different. Right now HMAX/VMAX
is fixed, so is FPS.
I am aware there is no way to select between these modes, but I added them for
completeness.
Best regards
Alexander
>
> > + .hmax_pix = 4400,
> > + .pixel_rate = 247500000,
> > + .reg_list = {
> > + .num_of_regs =
ARRAY_SIZE(imx415_mode_4_594_25fps),
> > + .regs = imx415_mode_4_594_25fps,
> > + },
> > + },
> > + {
> > + .lane_rate = 720000000,
> > + .lanes = 4,
> > + .hmax_pix = 4400,
> > + .pixel_rate = 247500000,
> > + .reg_list = {
> > + .num_of_regs =
ARRAY_SIZE(imx415_mode_4_720_25fps),
> > + .regs = imx415_mode_4_720_25fps,
> > + },
> > + },
> > + {
> > + .lane_rate = 720000000,
> > + .lanes = 4,
> > + .hmax_pix = 4510,
> > + .pixel_rate = 304615385,
> > + .reg_list = {
> > + .num_of_regs =
ARRAY_SIZE(imx415_mode_4_720_30fps),
> > + .regs = imx415_mode_4_720_30fps,
> > + },
> > + },
> >
> > {
> >
> > .lane_rate = 891000000,
> > .lanes = 4,
> >
> > @@ -566,6 +868,66 @@ static const struct imx415_mode supported_modes[] = {
> >
> > .regs = imx415_mode_4_891,
> >
> > },
> >
> > },
> >
> > + {
> > + .lane_rate = 1440000000,
> > + .lanes = 4,
> > + .hmax_pix = 4510,
> > + .pixel_rate = 304615385,
> > + .reg_list = {
> > + .num_of_regs =
ARRAY_SIZE(imx415_mode_4_1440_30fps),
> > + .regs = imx415_mode_4_1440_30fps,
> > + },
> > + },
> > + {
> > + .lane_rate = 1440000000,
> > + .lanes = 4,
> > + .hmax_pix = 4510,
> > + .pixel_rate = 609230769,
> > + .reg_list = {
> > + .num_of_regs =
ARRAY_SIZE(imx415_mode_4_1440_60fps),
> > + .regs = imx415_mode_4_1440_60fps,
> > + },
> > + },
> > + {
> > + .lane_rate = 1485000000,
> > + .lanes = 4,
> > + .hmax_pix = 4400,
> > + .pixel_rate = 594000000,
> > + .reg_list = {
> > + .num_of_regs = ARRAY_SIZE(imx415_mode_4_1485),
> > + .regs = imx415_mode_4_1485,
> > + },
> > + },
> > + {
> > + .lane_rate = 1782000000,
> > + .lanes = 4,
> > + .hmax_pix = 4400,
> > + .pixel_rate = 594000000,
> > + .reg_list = {
> > + .num_of_regs = ARRAY_SIZE(imx415_mode_4_1782),
> > + .regs = imx415_mode_4_1782,
> > + },
> > + },
> > + {
> > + .lane_rate = 2079000000,
> > + .lanes = 4,
> > + .hmax_pix = 4400,
> > + .pixel_rate = 594000000,
> > + .reg_list = {
> > + .num_of_regs = ARRAY_SIZE(imx415_mode_4_2079),
> > + .regs = imx415_mode_4_2079,
> > + },
> > + },
> > + {
> > + .lane_rate = 12376000000,
> > + .lanes = 4,
> > + .hmax_pix = 4392,
> > + .pixel_rate = 891000000,
> > + .reg_list = {
> > + .num_of_regs = ARRAY_SIZE(imx415_mode_4_2376),
> > + .regs = imx415_mode_4_2376,
> > + },
> > + },
> >
> > };
> >
> > static const char *const imx415_test_pattern_menu[] = {
--
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
http://www.tq-group.com/
next prev parent reply other threads:[~2023-12-05 11:12 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-05 9:05 [PATCH 0/3] media: imx415: Add more modes Alexander Stein
2023-12-05 9:05 ` [PATCH 1/3] media: i2c: imx415: Convert to new CCI register access helpers Alexander Stein
2023-12-05 19:24 ` kernel test robot
2023-12-07 19:30 ` kernel test robot
2023-12-07 21:02 ` Sakari Ailus
2023-12-05 9:05 ` [PATCH 2/3] media: i2c: imx415: Add more clock configurations Alexander Stein
2023-12-12 11:37 ` Sakari Ailus
2023-12-12 12:18 ` Alexander Stein
2023-12-12 12:45 ` Sakari Ailus
2023-12-05 9:05 ` [PATCH 3/3] media: i2c: imx415: Add more supported modes Alexander Stein
2023-12-05 10:45 ` Laurent Pinchart
2023-12-05 11:12 ` Alexander Stein [this message]
2023-12-05 14:47 ` Gerald Loacker
2023-12-05 14:54 ` Laurent Pinchart
2023-12-06 7:38 ` Alexander Stein
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=12337827.O9o76ZdvQC@steina-w \
--to=alexander.stein@ew.tq-group.com \
--cc=gerald.loacker@wolfvision.net \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=michael.riesch@wolfvision.net \
--cc=sakari.ailus@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.