All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matthias Brugger <mbrugger@suse.com>
To: Lee Jones <lee.jones@linaro.org>
Cc: Matthias Brugger <matthias.bgg@gmail.com>,
	matthias.bgg@kernel.org, ulrich.hecht+renesas@gmail.com,
	laurent.pinchart@ideasonboard.com, ck.hu@mediatek.com,
	p.zabel@pengutronix.de, airlied@linux.ie, robh+dt@kernel.org,
	mark.rutland@arm.com, mturquette@baylibre.com,
	sboyd@codeaurora.org, davem@davemloft.net,
	gregkh@linuxfoundation.org, mchehab@kernel.org,
	rdunlap@infradead.org, sean.wang@mediatek.com,
	linux-clk@vger.kernel.org, linux@armlinux.org.uk,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-mediatek@lists.infradead.org
Subject: Re: [v3 03/10] mfd: mtk-mmsys: Add mmsys driver
Date: Thu, 5 Jul 2018 13:25:27 +0200	[thread overview]
Message-ID: <92a851a9-a12c-e773-5f43-007f4d08b7e3@suse.com> (raw)
In-Reply-To: <20180704164540.GH496@dell>



On 04/07/18 18:45, Lee Jones wrote:
> On Wed, 04 Jul 2018, Matthias Brugger wrote:
> 
>>
>>
>> On 03/07/18 09:11, Lee Jones wrote:
>>> On Mon, 25 Jun 2018, Matthias Brugger wrote:
>>>> On 30/04/18 12:18, Lee Jones wrote:
>>>>> On Fri, 27 Apr 2018, matthias.bgg@kernel.org wrote:
>>>>>
>>>>>> From: Matthias Brugger <mbrugger@suse.com>
>>>>>>
>>>>>> The MMSYS subsystem includes clocks and drm components.
>>>>>> This patch adds a MFD device to probe both drivers from the same
>>>>>> device tree compatible.
>>>>>>
>>>>>> Signed-off-by: Matthias Brugger <mbrugger@suse.com>
>>>>>> ---
>>>>>>  drivers/mfd/Kconfig     |  9 ++++++
>>>>>>  drivers/mfd/Makefile    |  2 ++
>>>>>>  drivers/mfd/mtk-mmsys.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++
>>>>>>  3 files changed, 90 insertions(+)
>>>>>>  create mode 100644 drivers/mfd/mtk-mmsys.c
>>>>>>
>>>>>> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
>>>>>> index b860eb5aa194..d23a3b9a2c58 100644
>>>>>> --- a/drivers/mfd/Kconfig
>>>>>> +++ b/drivers/mfd/Kconfig
>>>>>> @@ -378,6 +378,15 @@ config MFD_MC13XXX_I2C
>>>>>>  	help
>>>>>>  	  Select this if your MC13xxx is connected via an I2C bus.
>>>>>>  
>>>>>> +config MFD_MEDIATEK_MMSYS
>>>>>> +	tristate "Mediatek MMSYS interface"
>>>>>> +	select MFD_CORE
>>>>>> +	select REGMAP_MMIO
>>>>>> +	help
>>>>>> +	  Select this if you have a MMSYS subsystem in your SoC. The
>>>>>> +	  MMSYS subsystem has at least a clock driver part and some
>>>>>> +	  DRM components.
>>>>>> +
>>>>>>  config MFD_MXS_LRADC
>>>>>>  	tristate "Freescale i.MX23/i.MX28 LRADC"
>>>>>>  	depends on ARCH_MXS || COMPILE_TEST
>>>>>> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
>>>>>> index d9d2cf0d32ef..b96118bd68d9 100644
>>>>>> --- a/drivers/mfd/Makefile
>>>>>> +++ b/drivers/mfd/Makefile
>>>>>> @@ -98,6 +98,8 @@ obj-$(CONFIG_MFD_MC13XXX)	+= mc13xxx-core.o
>>>>>>  obj-$(CONFIG_MFD_MC13XXX_SPI)	+= mc13xxx-spi.o
>>>>>>  obj-$(CONFIG_MFD_MC13XXX_I2C)	+= mc13xxx-i2c.o
>>>>>>  
>>>>>> +obj-$(CONFIG_MFD_MEDIATEK_MMSYS) += mtk-mmsys.o
>>>>>> +
>>>>>>  obj-$(CONFIG_MFD_CORE)		+= mfd-core.o
>>>>>>  
>>>>>>  obj-$(CONFIG_EZX_PCAP)		+= ezx-pcap.o
>>>>>> diff --git a/drivers/mfd/mtk-mmsys.c b/drivers/mfd/mtk-mmsys.c
>>>>>> new file mode 100644
>>>>>> index 000000000000..c802343fb1c6
>>>>>> --- /dev/null
>>>>>> +++ b/drivers/mfd/mtk-mmsys.c
>>>>>> @@ -0,0 +1,79 @@
>>>>>> +// SPDX-License-Identifier: GPL-2.0+
>>>>>> +
>>>>>> +/*
>>>>>> + * mtk-mmsys.c -- Mediatek MMSYS multi-function driver
>>>>>> + *
>>>>>> + * Copyright (c) 2018 Matthias Brugger <matthias.bgg@gmail.com>
>>>>>> + *
>>>>>> + * Author: Matthias Brugger <matthias.bgg@gmail.com>
>>>>>> + */
>>>>>> +
>>>>>> +#include <linux/module.h>
>>>>>> +#include <linux/init.h>
>>>>>> +#include <linux/mfd/core.h>
>>>>>> +#include <linux/of.h>
>>>>>> +#include <linux/of_address.h>
>>>>>> +#include <linux/of_device.h>
>>>>>> +#include <linux/platform_device.h>
>>>>>> +#include <linux/regmap.h>
>>>>>> +
>>>>>> +enum {
>>>>>> +	MMSYS_MT2701 = 1,
>>>>>> +};
>>>>>> +
>>>>>> +static const struct mfd_cell mmsys_mt2701_devs[] = {
>>>>>> +	{ .name = "clk-mt2701-mm", },
>>>>>> +	{ .name = "drm-mt2701-mm", },
>>>>>> +};
>>>>>> +
>>>>>> +static int mmsys_probe(struct platform_device *pdev)
>>>>>> +{
>>>>>> +	const struct mfd_cell *mmsys_cells;
>>>>>> +	int nr_cells;
>>>>>> +	long id;
>>>>>> +	int ret;
>>>>>> +
>>>>>> +	id = (long) of_device_get_match_data(&pdev->dev);
>>>>>> +	if (!id) {
>>>>>> +		dev_err(&pdev->dev, "of_device_get match_data() failed\n");
>>>>>> +		return -EINVAL;
>>>>>> +	}
>>>>>> +
>>>>>> +	switch (id) {
>>>>>> +	case MMSYS_MT2701:
>>>>>> +		mmsys_cells = mmsys_mt2701_devs;
>>>>>> +		nr_cells = ARRAY_SIZE(mmsys_mt2701_devs);
>>>>>> +		break;
>>>>>> +	default:
>>>>>> +		return -ENODEV;
>>>>>> +	}
>>>>>> +
>>>>>> +	ret = devm_mfd_add_devices(&pdev->dev, 0, mmsys_cells, nr_cells,
>>>>>> +					NULL, 0, NULL);
>>>>>> +	if (ret) {
>>>>>> +		dev_err(&pdev->dev, "failed to add MFD devices %d\n", ret);
>>>>>> +		return ret;
>>>>>> +	}
>>>>>> +
>>>>>> +	return 0;
>>>>>> +};
>>>>>
>>>>> This driver is pretty pointless.  It doesn't actually do anything.
>>>>>
>>>>> I think you just want to use "simple-mfd" instead.
>>>>>
>>>>
>>>> I think the problem is, that right now we have two drivers which use the same
>>>> devicetree binding, which are clk and drm driver. With a simple-mfd we would
>>>> need two compatibles, and this would break backwards compatibility.
>>>
>>> So what functionality does this driver provide you with that you do
>>> not have currently?
>>>
>>
>> I'm not sure if I get your question. Point is, that the MMSYS implementation for
>> mt8173 is broken, as it assumes that we can probe two drivers with the
>> mediatek,mt8173-mmsys compatible. Somehow it used to work, but from what I
>> understand it was a bug. So older devicetrees use just on mt8173-mmsys
>> compatible in ther DTB.
> 
> Okay, that is what I was getting at.  Thanks for the explanation.
> 
> Do you have a datasheet I can look at?
> 

Unfortunately there is no datasheet you can get without a NDA. The only public
available information I'm aware of is for the (not upstream supported) 96board
[1]. And it's only the register description. You can find some more explanation
about the MMSYS in older threads which tried to solve the very same problem [2]

Regards,
Matthias


[1]
https://www.96boards.org/documentation/consumer/mediatekx20/additional-docs/docs/MT6797_Register_Table_Part_2.pdf
[2] http://lists.infradead.org/pipermail/linux-mediatek/2017-October/010979.html

>> I would like to keep backwards compatibility for the device tree, that's why I
>> was searching for a solution where we can probe two drivers and came up with
>> this mfd solution.
>>
>> So no new functionality, the clk driver provides the clock the drm components need.
> 

WARNING: multiple messages have this Message-ID (diff)
From: mbrugger@suse.com (Matthias Brugger)
To: linux-arm-kernel@lists.infradead.org
Subject: [v3 03/10] mfd: mtk-mmsys: Add mmsys driver
Date: Thu, 5 Jul 2018 13:25:27 +0200	[thread overview]
Message-ID: <92a851a9-a12c-e773-5f43-007f4d08b7e3@suse.com> (raw)
In-Reply-To: <20180704164540.GH496@dell>



On 04/07/18 18:45, Lee Jones wrote:
> On Wed, 04 Jul 2018, Matthias Brugger wrote:
> 
>>
>>
>> On 03/07/18 09:11, Lee Jones wrote:
>>> On Mon, 25 Jun 2018, Matthias Brugger wrote:
>>>> On 30/04/18 12:18, Lee Jones wrote:
>>>>> On Fri, 27 Apr 2018, matthias.bgg at kernel.org wrote:
>>>>>
>>>>>> From: Matthias Brugger <mbrugger@suse.com>
>>>>>>
>>>>>> The MMSYS subsystem includes clocks and drm components.
>>>>>> This patch adds a MFD device to probe both drivers from the same
>>>>>> device tree compatible.
>>>>>>
>>>>>> Signed-off-by: Matthias Brugger <mbrugger@suse.com>
>>>>>> ---
>>>>>>  drivers/mfd/Kconfig     |  9 ++++++
>>>>>>  drivers/mfd/Makefile    |  2 ++
>>>>>>  drivers/mfd/mtk-mmsys.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++
>>>>>>  3 files changed, 90 insertions(+)
>>>>>>  create mode 100644 drivers/mfd/mtk-mmsys.c
>>>>>>
>>>>>> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
>>>>>> index b860eb5aa194..d23a3b9a2c58 100644
>>>>>> --- a/drivers/mfd/Kconfig
>>>>>> +++ b/drivers/mfd/Kconfig
>>>>>> @@ -378,6 +378,15 @@ config MFD_MC13XXX_I2C
>>>>>>  	help
>>>>>>  	  Select this if your MC13xxx is connected via an I2C bus.
>>>>>>  
>>>>>> +config MFD_MEDIATEK_MMSYS
>>>>>> +	tristate "Mediatek MMSYS interface"
>>>>>> +	select MFD_CORE
>>>>>> +	select REGMAP_MMIO
>>>>>> +	help
>>>>>> +	  Select this if you have a MMSYS subsystem in your SoC. The
>>>>>> +	  MMSYS subsystem has at least a clock driver part and some
>>>>>> +	  DRM components.
>>>>>> +
>>>>>>  config MFD_MXS_LRADC
>>>>>>  	tristate "Freescale i.MX23/i.MX28 LRADC"
>>>>>>  	depends on ARCH_MXS || COMPILE_TEST
>>>>>> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
>>>>>> index d9d2cf0d32ef..b96118bd68d9 100644
>>>>>> --- a/drivers/mfd/Makefile
>>>>>> +++ b/drivers/mfd/Makefile
>>>>>> @@ -98,6 +98,8 @@ obj-$(CONFIG_MFD_MC13XXX)	+= mc13xxx-core.o
>>>>>>  obj-$(CONFIG_MFD_MC13XXX_SPI)	+= mc13xxx-spi.o
>>>>>>  obj-$(CONFIG_MFD_MC13XXX_I2C)	+= mc13xxx-i2c.o
>>>>>>  
>>>>>> +obj-$(CONFIG_MFD_MEDIATEK_MMSYS) += mtk-mmsys.o
>>>>>> +
>>>>>>  obj-$(CONFIG_MFD_CORE)		+= mfd-core.o
>>>>>>  
>>>>>>  obj-$(CONFIG_EZX_PCAP)		+= ezx-pcap.o
>>>>>> diff --git a/drivers/mfd/mtk-mmsys.c b/drivers/mfd/mtk-mmsys.c
>>>>>> new file mode 100644
>>>>>> index 000000000000..c802343fb1c6
>>>>>> --- /dev/null
>>>>>> +++ b/drivers/mfd/mtk-mmsys.c
>>>>>> @@ -0,0 +1,79 @@
>>>>>> +// SPDX-License-Identifier: GPL-2.0+
>>>>>> +
>>>>>> +/*
>>>>>> + * mtk-mmsys.c -- Mediatek MMSYS multi-function driver
>>>>>> + *
>>>>>> + * Copyright (c) 2018 Matthias Brugger <matthias.bgg@gmail.com>
>>>>>> + *
>>>>>> + * Author: Matthias Brugger <matthias.bgg@gmail.com>
>>>>>> + */
>>>>>> +
>>>>>> +#include <linux/module.h>
>>>>>> +#include <linux/init.h>
>>>>>> +#include <linux/mfd/core.h>
>>>>>> +#include <linux/of.h>
>>>>>> +#include <linux/of_address.h>
>>>>>> +#include <linux/of_device.h>
>>>>>> +#include <linux/platform_device.h>
>>>>>> +#include <linux/regmap.h>
>>>>>> +
>>>>>> +enum {
>>>>>> +	MMSYS_MT2701 = 1,
>>>>>> +};
>>>>>> +
>>>>>> +static const struct mfd_cell mmsys_mt2701_devs[] = {
>>>>>> +	{ .name = "clk-mt2701-mm", },
>>>>>> +	{ .name = "drm-mt2701-mm", },
>>>>>> +};
>>>>>> +
>>>>>> +static int mmsys_probe(struct platform_device *pdev)
>>>>>> +{
>>>>>> +	const struct mfd_cell *mmsys_cells;
>>>>>> +	int nr_cells;
>>>>>> +	long id;
>>>>>> +	int ret;
>>>>>> +
>>>>>> +	id = (long) of_device_get_match_data(&pdev->dev);
>>>>>> +	if (!id) {
>>>>>> +		dev_err(&pdev->dev, "of_device_get match_data() failed\n");
>>>>>> +		return -EINVAL;
>>>>>> +	}
>>>>>> +
>>>>>> +	switch (id) {
>>>>>> +	case MMSYS_MT2701:
>>>>>> +		mmsys_cells = mmsys_mt2701_devs;
>>>>>> +		nr_cells = ARRAY_SIZE(mmsys_mt2701_devs);
>>>>>> +		break;
>>>>>> +	default:
>>>>>> +		return -ENODEV;
>>>>>> +	}
>>>>>> +
>>>>>> +	ret = devm_mfd_add_devices(&pdev->dev, 0, mmsys_cells, nr_cells,
>>>>>> +					NULL, 0, NULL);
>>>>>> +	if (ret) {
>>>>>> +		dev_err(&pdev->dev, "failed to add MFD devices %d\n", ret);
>>>>>> +		return ret;
>>>>>> +	}
>>>>>> +
>>>>>> +	return 0;
>>>>>> +};
>>>>>
>>>>> This driver is pretty pointless.  It doesn't actually do anything.
>>>>>
>>>>> I think you just want to use "simple-mfd" instead.
>>>>>
>>>>
>>>> I think the problem is, that right now we have two drivers which use the same
>>>> devicetree binding, which are clk and drm driver. With a simple-mfd we would
>>>> need two compatibles, and this would break backwards compatibility.
>>>
>>> So what functionality does this driver provide you with that you do
>>> not have currently?
>>>
>>
>> I'm not sure if I get your question. Point is, that the MMSYS implementation for
>> mt8173 is broken, as it assumes that we can probe two drivers with the
>> mediatek,mt8173-mmsys compatible. Somehow it used to work, but from what I
>> understand it was a bug. So older devicetrees use just on mt8173-mmsys
>> compatible in ther DTB.
> 
> Okay, that is what I was getting at.  Thanks for the explanation.
> 
> Do you have a datasheet I can look at?
> 

Unfortunately there is no datasheet you can get without a NDA. The only public
available information I'm aware of is for the (not upstream supported) 96board
[1]. And it's only the register description. You can find some more explanation
about the MMSYS in older threads which tried to solve the very same problem [2]

Regards,
Matthias


[1]
https://www.96boards.org/documentation/consumer/mediatekx20/additional-docs/docs/MT6797_Register_Table_Part_2.pdf
[2] http://lists.infradead.org/pipermail/linux-mediatek/2017-October/010979.html

>> I would like to keep backwards compatibility for the device tree, that's why I
>> was searching for a solution where we can probe two drivers and came up with
>> this mfd solution.
>>
>> So no new functionality, the clk driver provides the clock the drm components need.
> 

  reply	other threads:[~2018-07-05 11:25 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-27  9:23 [v3 00/10] arm/arm64: mediatek: Fix mmsys device probing matthias.bgg
2018-04-27  9:23 ` matthias.bgg at kernel.org
2018-04-27  9:23 ` matthias.bgg
2018-04-27  9:23 ` [v3 01/10] dt-bindings: mediatek: mmsys: Add support for mfd matthias.bgg
2018-04-27  9:23   ` matthias.bgg at kernel.org
2018-04-27  9:23   ` matthias.bgg
2018-04-30 10:30   ` Lee Jones
2018-04-30 10:30     ` Lee Jones
2018-04-30 10:30     ` Lee Jones
2018-06-25 15:39     ` Matthias Brugger
2018-06-25 15:39       ` Matthias Brugger
2018-06-26 18:32       ` Rob Herring
2018-06-26 18:32         ` Rob Herring
2018-06-26 18:32         ` Rob Herring
2018-06-26 18:32         ` Rob Herring
2018-07-03  7:04       ` Lee Jones
2018-07-03  7:04         ` Lee Jones
2018-07-03  7:04         ` Lee Jones
2018-04-27  9:23 ` [v3 02/10] drm/mediatek: Use regmap for register access matthias.bgg
2018-04-27  9:23   ` matthias.bgg at kernel.org
2018-04-27  9:23   ` matthias.bgg
2018-04-27  9:23 ` [v3 03/10] mfd: mtk-mmsys: Add mmsys driver matthias.bgg
2018-04-27  9:23   ` matthias.bgg at kernel.org
2018-04-27  9:23   ` matthias.bgg
2018-04-30 10:18   ` Lee Jones
2018-04-30 10:18     ` Lee Jones
2018-04-30 10:18     ` Lee Jones
2018-05-24  2:52     ` Sean Wang
2018-05-24  2:52       ` Sean Wang
2018-05-24  2:52       ` Sean Wang
2018-06-25 15:33     ` Matthias Brugger
2018-06-25 15:33       ` Matthias Brugger
2018-07-03  7:11       ` Lee Jones
2018-07-03  7:11         ` Lee Jones
2018-07-03  7:11         ` Lee Jones
2018-07-04 16:17         ` Matthias Brugger
2018-07-04 16:17           ` Matthias Brugger
2018-07-04 16:45           ` Lee Jones
2018-07-04 16:45             ` Lee Jones
2018-07-04 16:45             ` Lee Jones
2018-07-05 11:25             ` Matthias Brugger [this message]
2018-07-05 11:25               ` Matthias Brugger
2018-07-05 12:22               ` Lee Jones
2018-07-05 12:22                 ` Lee Jones
2018-07-05 12:22                 ` Lee Jones
2018-07-06 13:18                 ` Matthias Brugger
2018-07-06 13:18                   ` Matthias Brugger
2018-07-04 16:52           ` Chen-Yu Tsai
2018-07-04 16:52             ` Chen-Yu Tsai
2018-07-04 16:52             ` Chen-Yu Tsai
2018-07-04 16:52             ` Chen-Yu Tsai
2018-04-27  9:23 ` [v3 04/10] drm/mediatek: mt2701: switch to mfd probing matthias.bgg
2018-04-27  9:23   ` matthias.bgg at kernel.org
2018-04-27  9:23   ` matthias.bgg
2018-04-30 10:42   ` CK Hu
2018-04-30 10:42     ` CK Hu
2018-04-30 10:42     ` CK Hu
2018-04-27  9:23 ` [v3 05/10] clk: mediatek: mt2701-mm: switch to mfd device matthias.bgg
2018-04-27  9:23   ` matthias.bgg at kernel.org
2018-04-27  9:23   ` matthias.bgg
2018-04-27  9:23 ` [v3 06/10] mfd: mtk-mmsys: Add mt8173 nodes matthias.bgg
2018-04-27  9:23   ` matthias.bgg at kernel.org
2018-04-27  9:23   ` matthias.bgg
2018-04-27  9:23 ` [v3 07/10] drm/mediatek: Add mfd support for mt8173 matthias.bgg
2018-04-27  9:23   ` matthias.bgg at kernel.org
2018-04-27  9:24 ` [v3 08/10] clk: mediatek: mt8173-mm: switch to mfd device matthias.bgg
2018-04-27  9:24   ` matthias.bgg at kernel.org
2018-04-27  9:24   ` matthias.bgg
2018-04-27  9:24 ` [v3 09/10] drm: mediatek: Omit warning on probe defers matthias.bgg
2018-04-27  9:24   ` matthias.bgg at kernel.org
2018-04-27  9:24   ` matthias.bgg
2018-04-30 10:58   ` CK Hu
2018-04-30 10:58     ` CK Hu
2018-04-30 10:58     ` CK Hu
2018-04-27  9:24 ` [v3 10/10] MAINTAINERS: update Mediatek Soc entry matthias.bgg
2018-04-27  9:24   ` matthias.bgg at kernel.org

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=92a851a9-a12c-e773-5f43-007f4d08b7e3@suse.com \
    --to=mbrugger@suse.com \
    --cc=airlied@linux.ie \
    --cc=ck.hu@mediatek.com \
    --cc=davem@davemloft.net \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=lee.jones@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux@armlinux.org.uk \
    --cc=mark.rutland@arm.com \
    --cc=matthias.bgg@gmail.com \
    --cc=matthias.bgg@kernel.org \
    --cc=mchehab@kernel.org \
    --cc=mturquette@baylibre.com \
    --cc=p.zabel@pengutronix.de \
    --cc=rdunlap@infradead.org \
    --cc=robh+dt@kernel.org \
    --cc=sboyd@codeaurora.org \
    --cc=sean.wang@mediatek.com \
    --cc=ulrich.hecht+renesas@gmail.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.