From: Suman Anna <s-anna@ti.com>
To: Markus Mayer <markus.mayer@linaro.org>
Cc: Tony Lindgren <tony@atomide.com>,
Jassi Brar <jaswinder.singh@linaro.org>,
Dave Gerlach <d-gerlach@ti.com>, Pavel Machek <pavel@ucw.cz>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
linux-omap@vger.kernel.org,
Device Tree List <devicetree@vger.kernel.org>,
ARM Kernel List <linux-arm-kernel@lists.infradead.org>,
Jassi Brar <jassisinghbrar@gmail.com>,
Rob Herring <robh+dt@kernel.org>
Subject: Re: [PATCHv2 2/5] mailbox/omap: add support for parsing dt devices
Date: Wed, 16 Jul 2014 16:11:51 -0500 [thread overview]
Message-ID: <53C6EA97.9030400@ti.com> (raw)
In-Reply-To: <CAPdLdqmA5HkRe9xLOUybOQQzpkmqX8Ot4aH9ZA7B_s3Zp90tPw@mail.gmail.com>
Hi Markus,
On 07/16/2014 03:50 PM, Markus Mayer wrote:
> If I may nit-pick here for a minute...
>
> On 11 July 2014 15:04, Suman Anna <s-anna@ti.com> wrote:
>> Logic has been added to the OMAP2+ mailbox code to parse the
>> mailbox dt nodes and construct the different sub-mailboxes
>> associated with the instance. The DT representation of the
>> sub-mailbox devices is different from legacy platform data
>> representation to allow flexibility of interrupt configuration
>> between Tx and Rx fifos (to also possibly allow simplex devices
>> in the future). The DT representation gathers similar information
>> that was being passed previously through the platform data, except
>> for the number of fifos, interrupts and interrupt type information,
>> which are gathered through driver compatible match data.
>>
>> The non-DT support has to be maintained for now to not break
>> OMAP3 legacy boot, and the legacy-style code will be cleaned
>> up once OMAP3 is also converted to DT-boot only.
>>
>> Cc: Jassi Brar <jassisinghbrar@gmail.com>
>> Cc: Rob Herring <robh+dt@kernel.org>
>> Signed-off-by: Suman Anna <s-anna@ti.com>
>> ---
>> drivers/mailbox/omap-mailbox.c | 156 ++++++++++++++++++++++++++++++++++-------
>> 1 file changed, 132 insertions(+), 24 deletions(-)
>>
>> diff --git a/drivers/mailbox/omap-mailbox.c b/drivers/mailbox/omap-mailbox.c
>
> [...]
>
>> static int omap_mbox_probe(struct platform_device *pdev)
>> {
>> struct resource *mem;
>> int ret;
>> struct omap_mbox **list, *mbox, *mboxblk;
>> struct omap_mbox_pdata *pdata = pdev->dev.platform_data;
>> - struct omap_mbox_dev_info *info;
>> + struct omap_mbox_dev_info *info = NULL;
>> + struct omap_mbox_fifo_info *finfo, *finfoblk;
>> struct omap_mbox_device *mdev;
>> struct omap_mbox_fifo *fifo;
>> - u32 intr_type;
>> + struct device_node *node = pdev->dev.of_node;
>> + struct device_node *child;
>> + const struct of_device_id *match;
>> + u32 intr_type, info_count;
>> + u32 num_users, num_fifos;
>> + u32 tmp[3];
>> u32 l;
>> int i;
>>
>> - if (!pdata || !pdata->info_cnt || !pdata->info) {
>> + if (!node && (!pdata || !pdata->info_cnt || !pdata->info)) {
>> pr_err("%s: platform not supported\n", __func__);
>> return -ENODEV;
>> }
>>
>> + if (node) {
>
> I noticed here you are using
>
> if (node)
> /* DT stuff goes here */
> else
> /* non-DT stuff goes here */
>
> but below the logic is reversed.
>
>> + match = of_match_device(omap_mailbox_of_match, &pdev->dev);
>> + if (!match)
>> + return -ENODEV;
>> + intr_type = (u32)match->data;
>> +
>> + if (of_property_read_u32(node, "ti,mbox-num-users",
>> + &num_users))
>> + return -ENODEV;
>> +
>> + if (of_property_read_u32(node, "ti,mbox-num-fifos",
>> + &num_fifos))
>> + return -ENODEV;
>> +
>> + info_count = of_get_available_child_count(node);
>> + if (!info_count) {
>> + dev_err(&pdev->dev, "no available mbox devices found\n");
>> + return -ENODEV;
>> + }
>> + } else { /* non-DT device creation */
>> + info_count = pdata->info_cnt;
>> + info = pdata->info;
>> + intr_type = pdata->intr_type;
>> + num_users = pdata->num_users;
>> + num_fifos = pdata->num_fifos;
>> + }
>> +
>> + finfoblk = devm_kzalloc(&pdev->dev, info_count * sizeof(*finfoblk),
>> + GFP_KERNEL);
>> + if (!finfoblk)
>> + return -ENOMEM;
>> +
>> + finfo = finfoblk;
>> + child = NULL;
>> + for (i = 0; i < info_count; i++, finfo++) {
>> + if (!node) {
>
> Here it's
> if (!node)
> /* non-DT stuff */
> else
> /* DT stuff */
>
> I think the "if (node) ..." version is a bit cleaner. Besides it's
> nice if code is consistent. Do you mind changing the if statement here
> so it matches the logic used above?
No, not at all, I will fix this up in the next version. I have to revise
the framework adaptation patches anyway (remove tidspbridge changes as
that driver is getting deleted and add a missing of_node_put).
Do you prefer that I split up this series between DT conversion and
framework adaptation or good with posting all the patches together? If
latter, I will refresh it once the v9 version of the framework comes out.
regards
Suman
>
>> + finfo->tx_id = info->tx_id;
>> + finfo->rx_id = info->rx_id;
>> + finfo->tx_usr = info->usr_id;
>> + finfo->tx_irq = info->irq_id;
>> + finfo->rx_usr = info->usr_id;
>> + finfo->rx_irq = info->irq_id;
>> + finfo->name = info->name;
>> + info++;
>> + } else {
>> + child = of_get_next_available_child(node, child);
>> + ret = of_property_read_u32_array(child, "ti,mbox-tx",
>> + tmp, ARRAY_SIZE(tmp));
>> + if (ret)
>> + return ret;
>> + finfo->tx_id = tmp[0];
>> + finfo->tx_irq = tmp[1];
>> + finfo->tx_usr = tmp[2];
>> +
>> + ret = of_property_read_u32_array(child, "ti,mbox-rx",
>> + tmp, ARRAY_SIZE(tmp));
>> + if (ret)
>> + return ret;
>> + finfo->rx_id = tmp[0];
>> + finfo->rx_irq = tmp[1];
>> + finfo->rx_usr = tmp[2];
>> +
>> + finfo->name = child->name;
>> + }
>> + if (finfo->tx_id >= num_fifos || finfo->rx_id >= num_fifos ||
>> + finfo->tx_usr >= num_users || finfo->rx_usr >= num_users)
>> + return -EINVAL;
>> + }
>> +
WARNING: multiple messages have this Message-ID (diff)
From: s-anna@ti.com (Suman Anna)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCHv2 2/5] mailbox/omap: add support for parsing dt devices
Date: Wed, 16 Jul 2014 16:11:51 -0500 [thread overview]
Message-ID: <53C6EA97.9030400@ti.com> (raw)
In-Reply-To: <CAPdLdqmA5HkRe9xLOUybOQQzpkmqX8Ot4aH9ZA7B_s3Zp90tPw@mail.gmail.com>
Hi Markus,
On 07/16/2014 03:50 PM, Markus Mayer wrote:
> If I may nit-pick here for a minute...
>
> On 11 July 2014 15:04, Suman Anna <s-anna@ti.com> wrote:
>> Logic has been added to the OMAP2+ mailbox code to parse the
>> mailbox dt nodes and construct the different sub-mailboxes
>> associated with the instance. The DT representation of the
>> sub-mailbox devices is different from legacy platform data
>> representation to allow flexibility of interrupt configuration
>> between Tx and Rx fifos (to also possibly allow simplex devices
>> in the future). The DT representation gathers similar information
>> that was being passed previously through the platform data, except
>> for the number of fifos, interrupts and interrupt type information,
>> which are gathered through driver compatible match data.
>>
>> The non-DT support has to be maintained for now to not break
>> OMAP3 legacy boot, and the legacy-style code will be cleaned
>> up once OMAP3 is also converted to DT-boot only.
>>
>> Cc: Jassi Brar <jassisinghbrar@gmail.com>
>> Cc: Rob Herring <robh+dt@kernel.org>
>> Signed-off-by: Suman Anna <s-anna@ti.com>
>> ---
>> drivers/mailbox/omap-mailbox.c | 156 ++++++++++++++++++++++++++++++++++-------
>> 1 file changed, 132 insertions(+), 24 deletions(-)
>>
>> diff --git a/drivers/mailbox/omap-mailbox.c b/drivers/mailbox/omap-mailbox.c
>
> [...]
>
>> static int omap_mbox_probe(struct platform_device *pdev)
>> {
>> struct resource *mem;
>> int ret;
>> struct omap_mbox **list, *mbox, *mboxblk;
>> struct omap_mbox_pdata *pdata = pdev->dev.platform_data;
>> - struct omap_mbox_dev_info *info;
>> + struct omap_mbox_dev_info *info = NULL;
>> + struct omap_mbox_fifo_info *finfo, *finfoblk;
>> struct omap_mbox_device *mdev;
>> struct omap_mbox_fifo *fifo;
>> - u32 intr_type;
>> + struct device_node *node = pdev->dev.of_node;
>> + struct device_node *child;
>> + const struct of_device_id *match;
>> + u32 intr_type, info_count;
>> + u32 num_users, num_fifos;
>> + u32 tmp[3];
>> u32 l;
>> int i;
>>
>> - if (!pdata || !pdata->info_cnt || !pdata->info) {
>> + if (!node && (!pdata || !pdata->info_cnt || !pdata->info)) {
>> pr_err("%s: platform not supported\n", __func__);
>> return -ENODEV;
>> }
>>
>> + if (node) {
>
> I noticed here you are using
>
> if (node)
> /* DT stuff goes here */
> else
> /* non-DT stuff goes here */
>
> but below the logic is reversed.
>
>> + match = of_match_device(omap_mailbox_of_match, &pdev->dev);
>> + if (!match)
>> + return -ENODEV;
>> + intr_type = (u32)match->data;
>> +
>> + if (of_property_read_u32(node, "ti,mbox-num-users",
>> + &num_users))
>> + return -ENODEV;
>> +
>> + if (of_property_read_u32(node, "ti,mbox-num-fifos",
>> + &num_fifos))
>> + return -ENODEV;
>> +
>> + info_count = of_get_available_child_count(node);
>> + if (!info_count) {
>> + dev_err(&pdev->dev, "no available mbox devices found\n");
>> + return -ENODEV;
>> + }
>> + } else { /* non-DT device creation */
>> + info_count = pdata->info_cnt;
>> + info = pdata->info;
>> + intr_type = pdata->intr_type;
>> + num_users = pdata->num_users;
>> + num_fifos = pdata->num_fifos;
>> + }
>> +
>> + finfoblk = devm_kzalloc(&pdev->dev, info_count * sizeof(*finfoblk),
>> + GFP_KERNEL);
>> + if (!finfoblk)
>> + return -ENOMEM;
>> +
>> + finfo = finfoblk;
>> + child = NULL;
>> + for (i = 0; i < info_count; i++, finfo++) {
>> + if (!node) {
>
> Here it's
> if (!node)
> /* non-DT stuff */
> else
> /* DT stuff */
>
> I think the "if (node) ..." version is a bit cleaner. Besides it's
> nice if code is consistent. Do you mind changing the if statement here
> so it matches the logic used above?
No, not at all, I will fix this up in the next version. I have to revise
the framework adaptation patches anyway (remove tidspbridge changes as
that driver is getting deleted and add a missing of_node_put).
Do you prefer that I split up this series between DT conversion and
framework adaptation or good with posting all the patches together? If
latter, I will refresh it once the v9 version of the framework comes out.
regards
Suman
>
>> + finfo->tx_id = info->tx_id;
>> + finfo->rx_id = info->rx_id;
>> + finfo->tx_usr = info->usr_id;
>> + finfo->tx_irq = info->irq_id;
>> + finfo->rx_usr = info->usr_id;
>> + finfo->rx_irq = info->irq_id;
>> + finfo->name = info->name;
>> + info++;
>> + } else {
>> + child = of_get_next_available_child(node, child);
>> + ret = of_property_read_u32_array(child, "ti,mbox-tx",
>> + tmp, ARRAY_SIZE(tmp));
>> + if (ret)
>> + return ret;
>> + finfo->tx_id = tmp[0];
>> + finfo->tx_irq = tmp[1];
>> + finfo->tx_usr = tmp[2];
>> +
>> + ret = of_property_read_u32_array(child, "ti,mbox-rx",
>> + tmp, ARRAY_SIZE(tmp));
>> + if (ret)
>> + return ret;
>> + finfo->rx_id = tmp[0];
>> + finfo->rx_irq = tmp[1];
>> + finfo->rx_usr = tmp[2];
>> +
>> + finfo->name = child->name;
>> + }
>> + if (finfo->tx_id >= num_fifos || finfo->rx_id >= num_fifos ||
>> + finfo->tx_usr >= num_users || finfo->rx_usr >= num_users)
>> + return -EINVAL;
>> + }
>> +
WARNING: multiple messages have this Message-ID (diff)
From: Suman Anna <s-anna@ti.com>
To: Markus Mayer <markus.mayer@linaro.org>
Cc: Tony Lindgren <tony@atomide.com>,
Jassi Brar <jaswinder.singh@linaro.org>,
Dave Gerlach <d-gerlach@ti.com>, Pavel Machek <pavel@ucw.cz>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
<linux-omap@vger.kernel.org>,
Device Tree List <devicetree@vger.kernel.org>,
ARM Kernel List <linux-arm-kernel@lists.infradead.org>,
Jassi Brar <jassisinghbrar@gmail.com>,
Rob Herring <robh+dt@kernel.org>
Subject: Re: [PATCHv2 2/5] mailbox/omap: add support for parsing dt devices
Date: Wed, 16 Jul 2014 16:11:51 -0500 [thread overview]
Message-ID: <53C6EA97.9030400@ti.com> (raw)
In-Reply-To: <CAPdLdqmA5HkRe9xLOUybOQQzpkmqX8Ot4aH9ZA7B_s3Zp90tPw@mail.gmail.com>
Hi Markus,
On 07/16/2014 03:50 PM, Markus Mayer wrote:
> If I may nit-pick here for a minute...
>
> On 11 July 2014 15:04, Suman Anna <s-anna@ti.com> wrote:
>> Logic has been added to the OMAP2+ mailbox code to parse the
>> mailbox dt nodes and construct the different sub-mailboxes
>> associated with the instance. The DT representation of the
>> sub-mailbox devices is different from legacy platform data
>> representation to allow flexibility of interrupt configuration
>> between Tx and Rx fifos (to also possibly allow simplex devices
>> in the future). The DT representation gathers similar information
>> that was being passed previously through the platform data, except
>> for the number of fifos, interrupts and interrupt type information,
>> which are gathered through driver compatible match data.
>>
>> The non-DT support has to be maintained for now to not break
>> OMAP3 legacy boot, and the legacy-style code will be cleaned
>> up once OMAP3 is also converted to DT-boot only.
>>
>> Cc: Jassi Brar <jassisinghbrar@gmail.com>
>> Cc: Rob Herring <robh+dt@kernel.org>
>> Signed-off-by: Suman Anna <s-anna@ti.com>
>> ---
>> drivers/mailbox/omap-mailbox.c | 156 ++++++++++++++++++++++++++++++++++-------
>> 1 file changed, 132 insertions(+), 24 deletions(-)
>>
>> diff --git a/drivers/mailbox/omap-mailbox.c b/drivers/mailbox/omap-mailbox.c
>
> [...]
>
>> static int omap_mbox_probe(struct platform_device *pdev)
>> {
>> struct resource *mem;
>> int ret;
>> struct omap_mbox **list, *mbox, *mboxblk;
>> struct omap_mbox_pdata *pdata = pdev->dev.platform_data;
>> - struct omap_mbox_dev_info *info;
>> + struct omap_mbox_dev_info *info = NULL;
>> + struct omap_mbox_fifo_info *finfo, *finfoblk;
>> struct omap_mbox_device *mdev;
>> struct omap_mbox_fifo *fifo;
>> - u32 intr_type;
>> + struct device_node *node = pdev->dev.of_node;
>> + struct device_node *child;
>> + const struct of_device_id *match;
>> + u32 intr_type, info_count;
>> + u32 num_users, num_fifos;
>> + u32 tmp[3];
>> u32 l;
>> int i;
>>
>> - if (!pdata || !pdata->info_cnt || !pdata->info) {
>> + if (!node && (!pdata || !pdata->info_cnt || !pdata->info)) {
>> pr_err("%s: platform not supported\n", __func__);
>> return -ENODEV;
>> }
>>
>> + if (node) {
>
> I noticed here you are using
>
> if (node)
> /* DT stuff goes here */
> else
> /* non-DT stuff goes here */
>
> but below the logic is reversed.
>
>> + match = of_match_device(omap_mailbox_of_match, &pdev->dev);
>> + if (!match)
>> + return -ENODEV;
>> + intr_type = (u32)match->data;
>> +
>> + if (of_property_read_u32(node, "ti,mbox-num-users",
>> + &num_users))
>> + return -ENODEV;
>> +
>> + if (of_property_read_u32(node, "ti,mbox-num-fifos",
>> + &num_fifos))
>> + return -ENODEV;
>> +
>> + info_count = of_get_available_child_count(node);
>> + if (!info_count) {
>> + dev_err(&pdev->dev, "no available mbox devices found\n");
>> + return -ENODEV;
>> + }
>> + } else { /* non-DT device creation */
>> + info_count = pdata->info_cnt;
>> + info = pdata->info;
>> + intr_type = pdata->intr_type;
>> + num_users = pdata->num_users;
>> + num_fifos = pdata->num_fifos;
>> + }
>> +
>> + finfoblk = devm_kzalloc(&pdev->dev, info_count * sizeof(*finfoblk),
>> + GFP_KERNEL);
>> + if (!finfoblk)
>> + return -ENOMEM;
>> +
>> + finfo = finfoblk;
>> + child = NULL;
>> + for (i = 0; i < info_count; i++, finfo++) {
>> + if (!node) {
>
> Here it's
> if (!node)
> /* non-DT stuff */
> else
> /* DT stuff */
>
> I think the "if (node) ..." version is a bit cleaner. Besides it's
> nice if code is consistent. Do you mind changing the if statement here
> so it matches the logic used above?
No, not at all, I will fix this up in the next version. I have to revise
the framework adaptation patches anyway (remove tidspbridge changes as
that driver is getting deleted and add a missing of_node_put).
Do you prefer that I split up this series between DT conversion and
framework adaptation or good with posting all the patches together? If
latter, I will refresh it once the v9 version of the framework comes out.
regards
Suman
>
>> + finfo->tx_id = info->tx_id;
>> + finfo->rx_id = info->rx_id;
>> + finfo->tx_usr = info->usr_id;
>> + finfo->tx_irq = info->irq_id;
>> + finfo->rx_usr = info->usr_id;
>> + finfo->rx_irq = info->irq_id;
>> + finfo->name = info->name;
>> + info++;
>> + } else {
>> + child = of_get_next_available_child(node, child);
>> + ret = of_property_read_u32_array(child, "ti,mbox-tx",
>> + tmp, ARRAY_SIZE(tmp));
>> + if (ret)
>> + return ret;
>> + finfo->tx_id = tmp[0];
>> + finfo->tx_irq = tmp[1];
>> + finfo->tx_usr = tmp[2];
>> +
>> + ret = of_property_read_u32_array(child, "ti,mbox-rx",
>> + tmp, ARRAY_SIZE(tmp));
>> + if (ret)
>> + return ret;
>> + finfo->rx_id = tmp[0];
>> + finfo->rx_irq = tmp[1];
>> + finfo->rx_usr = tmp[2];
>> +
>> + finfo->name = child->name;
>> + }
>> + if (finfo->tx_id >= num_fifos || finfo->rx_id >= num_fifos ||
>> + finfo->tx_usr >= num_users || finfo->rx_usr >= num_users)
>> + return -EINVAL;
>> + }
>> +
next prev parent reply other threads:[~2014-07-16 21:12 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-11 22:04 [PATCHv2 0/5] OMAP Mailbox framework adoption & DT support Suman Anna
2014-07-11 22:04 ` Suman Anna
2014-07-11 22:04 ` Suman Anna
2014-07-11 22:04 ` [PATCHv2 1/5] Documentation: dt: add omap mailbox bindings Suman Anna
2014-07-11 22:04 ` Suman Anna
2014-07-11 22:04 ` Suman Anna
2014-07-11 22:04 ` [PATCHv2 2/5] mailbox/omap: add support for parsing dt devices Suman Anna
2014-07-11 22:04 ` Suman Anna
2014-07-11 22:04 ` Suman Anna
2014-07-12 22:16 ` Pavel Machek
2014-07-12 22:16 ` Pavel Machek
2014-07-16 20:50 ` Markus Mayer
2014-07-16 20:50 ` Markus Mayer
2014-07-16 21:11 ` Suman Anna [this message]
2014-07-16 21:11 ` Suman Anna
2014-07-16 21:11 ` Suman Anna
2014-07-11 22:04 ` [PATCHv2 3/5] ARM: dts: OMAP2+: Add sub mailboxes device node information Suman Anna
2014-07-11 22:04 ` Suman Anna
2014-07-11 22:04 ` Suman Anna
2014-07-11 22:04 ` [PATCHv2 4/5] mailbox/omap: adapt to the new mailbox framework Suman Anna
2014-07-11 22:04 ` Suman Anna
2014-07-11 22:04 ` Suman Anna
2014-07-11 22:04 ` [PATCHv2 5/5] ARM: dts: OMAP2+: Add #mbox-cells property to all mailbox nodes Suman Anna
2014-07-11 22:04 ` Suman Anna
[not found] ` <1405116252-53612-1-git-send-email-s-anna-l0cyMroinI0@public.gmane.org>
2014-07-11 23:15 ` [PATCHv2 0/5] OMAP Mailbox framework adoption & DT support Markus Mayer
2014-07-11 23:15 ` Markus Mayer
2014-07-11 23:15 ` Markus Mayer
[not found] ` <CAPdLdq=ZnPBQiGVbKOk8G5soP=uPYpT7mEjigpR=W1Hc4btV3g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-07-14 15:58 ` Suman Anna
2014-07-14 15:58 ` Suman Anna
2014-07-14 15:58 ` Suman Anna
2014-07-14 21:18 ` Markus Mayer
2014-07-14 21:18 ` Markus Mayer
2014-07-14 21:53 ` Suman Anna
2014-07-14 21:53 ` Suman Anna
2014-07-14 21:53 ` Suman Anna
-- strict thread matches above, loose matches on Subject: below --
2013-07-22 21:26 [PATCHv2 2/5] mailbox/omap: add support for parsing dt devices Suman Anna
2013-07-22 21:26 ` Suman Anna
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=53C6EA97.9030400@ti.com \
--to=s-anna@ti.com \
--cc=d-gerlach@ti.com \
--cc=devicetree@vger.kernel.org \
--cc=jassisinghbrar@gmail.com \
--cc=jaswinder.singh@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=markus.mayer@linaro.org \
--cc=pavel@ucw.cz \
--cc=robh+dt@kernel.org \
--cc=tony@atomide.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.