linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: Lee Jones <lee@kernel.org>
To: Hector Martin <marcan@marcan.st>
Cc: Russell King <rmk+kernel@armlinux.org.uk>,
	Arnd Bergmann <arnd@arndb.de>,
	Linus Walleij <linus.walleij@linaro.org>,
	Alyssa Rosenzweig <alyssa@rosenzweig.io>,
	asahi@lists.linux.dev, Bartosz Golaszewski <brgl@bgdev.pl>,
	linux-arm-kernel@lists.infradead.org, linux-gpio@vger.kernel.org,
	Sven Peter <sven@svenpeter.dev>
Subject: Re: [PATCH 4/6] platform/apple: Add new Apple Mac SMC driver
Date: Thu, 8 Sep 2022 13:31:50 +0100	[thread overview]
Message-ID: <YxngtlhRLTVBw+iW@google.com> (raw)
In-Reply-To: <45ed0a37-60ac-3a06-92d1-6b30e18261ff@marcan.st>

On Thu, 08 Sep 2022, Hector Martin wrote:

> On 08/09/2022 19.58, Lee Jones wrote:
> > On Thu, 01 Sep 2022, Russell King wrote:
> > 
> >> From: Hector Martin <marcan@marcan.st>
> >>
> >> This driver implements support for the SMC (System Management
> >> Controller) in Apple Macs. In contrast to the existing applesmc driver,
> >> it uses pluggable backends that allow it to support different SMC
> >> implementations, and uses the MFD subsystem to expose the core SMC
> >> functionality so that specific features (gpio, hwmon, battery, etc.) can
> >> be implemented by separate drivers in their respective downstream
> >> subsystems.
> >>
> >> The initial RTKit backend adds support for Apple Silicon Macs (M1 et
> >> al). We hope a backend for T2 Macs will be written in the future
> >> (since those are not supported by applesmc), and eventually an x86
> >> backend would allow us to fully deprecate applesmc in favor of this
> >> driver.
> >>
> >> Signed-off-by: Hector Martin <marcan@marcan.st>
> >> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
> >> ---
> >>  drivers/platform/Kconfig           |   2 +
> >>  drivers/platform/Makefile          |   1 +
> >>  drivers/platform/apple/Kconfig     |  49 ++++
> >>  drivers/platform/apple/Makefile    |  11 +
> >>  drivers/platform/apple/smc.h       |  28 ++
> >>  drivers/platform/apple/smc_core.c  | 249 ++++++++++++++++
> >>  drivers/platform/apple/smc_rtkit.c | 451 +++++++++++++++++++++++++++++
> >>  include/linux/mfd/macsmc.h         |  86 ++++++
> >>  8 files changed, 877 insertions(+)
> >>  create mode 100644 drivers/platform/apple/Kconfig
> >>  create mode 100644 drivers/platform/apple/Makefile
> >>  create mode 100644 drivers/platform/apple/smc.h
> >>  create mode 100644 drivers/platform/apple/smc_core.c
> >>  create mode 100644 drivers/platform/apple/smc_rtkit.c
> >>  create mode 100644 include/linux/mfd/macsmc.h
> >>
> >> diff --git a/drivers/platform/Kconfig b/drivers/platform/Kconfig
> >> index b437847b6237..5f8b9bcdb830 100644
> >> --- a/drivers/platform/Kconfig
> >> +++ b/drivers/platform/Kconfig
> >> @@ -13,4 +13,6 @@ source "drivers/platform/olpc/Kconfig"
> >>  
> >>  source "drivers/platform/surface/Kconfig"
> >>  
> >> +source "drivers/platform/apple/Kconfig"
> >> +
> >>  source "drivers/platform/x86/Kconfig"
> >> diff --git a/drivers/platform/Makefile b/drivers/platform/Makefile
> >> index 4de08ef4ec9d..3e5d5039a28c 100644
> >> --- a/drivers/platform/Makefile
> >> +++ b/drivers/platform/Makefile
> >> @@ -10,3 +10,4 @@ obj-$(CONFIG_OLPC_EC)		+= olpc/
> >>  obj-$(CONFIG_GOLDFISH)		+= goldfish/
> >>  obj-$(CONFIG_CHROME_PLATFORMS)	+= chrome/
> >>  obj-$(CONFIG_SURFACE_PLATFORMS)	+= surface/
> >> +obj-$(CONFIG_APPLE_PLATFORMS)	+= apple/
> >> diff --git a/drivers/platform/apple/Kconfig b/drivers/platform/apple/Kconfig
> >> new file mode 100644
> >> index 000000000000..42525aa9fbbe
> >> --- /dev/null
> >> +++ b/drivers/platform/apple/Kconfig
> >> @@ -0,0 +1,49 @@
> >> +# SPDX-License-Identifier: GPL-2.0
> >> +#
> >> +# Apple Platform-Specific Drivers
> >> +#
> >> +
> >> +menuconfig APPLE_PLATFORMS
> >> +	bool "Apple Mac Platform-Specific Device Drivers"
> >> +	default y
> >> +	help
> >> +	  Say Y here to get to see options for platform-specific device drivers
> >> +	  for Apple devices. This option alone does not add any kernel code.
> >> +
> >> +	  If you say N, all options in this submenu will be skipped and disabled.
> >> +
> >> +if APPLE_PLATFORMS
> >> +
> >> +config APPLE_SMC
> >> +	tristate "Apple SMC Driver"
> >> +	depends on ARCH_APPLE || COMPILE_TEST
> >> +	default ARCH_APPLE
> >> +	select MFD_CORE
> >> +	help
> >> +	  Build support for the Apple System Management Controller present in
> >> +	  Apple Macs. This driver currently supports the SMC in Apple Silicon
> >> +	  Macs. For x86 Macs, see the applesmc driver (SENSORS_APPLESMC).
> >> +
> >> +	  Say Y here if you have an Apple Silicon Mac.
> >> +
> >> +	  To compile this driver as a module, choose M here: the module will
> >> +	  be called macsmc.
> >> +
> >> +if APPLE_SMC
> >> +
> >> +config APPLE_SMC_RTKIT
> >> +	tristate "RTKit (Apple Silicon) backend"
> >> +	depends on ARCH_APPLE || COMPILE_TEST
> >> +	depends on APPLE_RTKIT
> >> +	default ARCH_APPLE
> >> +	help
> >> +	  Build support for SMC communications via the RTKit backend. This is
> >> +	  required for Apple Silicon Macs.
> >> +
> >> +	  Say Y here if you have an Apple Silicon Mac.
> >> +
> >> +	  To compile this driver as a module, choose M here: the module will
> >> +	  be called macsmc-rtkit.
> >> +
> >> +endif
> >> +endif
> >> diff --git a/drivers/platform/apple/Makefile b/drivers/platform/apple/Makefile
> >> new file mode 100644
> >> index 000000000000..79fac195398b
> >> --- /dev/null
> >> +++ b/drivers/platform/apple/Makefile
> >> @@ -0,0 +1,11 @@
> >> +# SPDX-License-Identifier: GPL-2.0
> >> +#
> >> +# Makefile for linux/drivers/platform/apple
> >> +# Apple Platform-Specific Drivers
> >> +#
> >> +
> >> +macsmc-y				+= smc_core.o
> >> +macsmc-rtkit-y				+= smc_rtkit.o
> >> +
> >> +obj-$(CONFIG_APPLE_SMC)			+= macsmc.o
> >> +obj-$(CONFIG_APPLE_SMC_RTKIT)		+= macsmc-rtkit.o
> >> diff --git a/drivers/platform/apple/smc.h b/drivers/platform/apple/smc.h
> >> new file mode 100644
> >> index 000000000000..8ae51887b2c5
> >> --- /dev/null
> >> +++ b/drivers/platform/apple/smc.h
> >> @@ -0,0 +1,28 @@
> >> +// SPDX-License-Identifier: GPL-2.0-only OR MIT
> >> +/*
> >> + * Apple SMC internal core definitions
> >> + * Copyright (C) The Asahi Linux Contributors
> >> + */
> >> +
> >> +#ifndef _SMC_H
> >> +#define _SMC_H
> >> +
> >> +#include <linux/mfd/macsmc.h>
> >> +
> >> +struct apple_smc_backend_ops {
> >> +	int (*read_key)(void *cookie, smc_key key, void *buf, size_t size);
> >> +	int (*write_key)(void *cookie, smc_key key, void *buf, size_t size);
> >> +	int (*write_key_atomic)(void *cookie, smc_key key, void *buf, size_t size);
> >> +	int (*rw_key)(void *cookie, smc_key key, void *wbuf, size_t wsize,
> >> +		      void *rbuf, size_t rsize);
> >> +	int (*get_key_by_index)(void *cookie, int index, smc_key *key);
> >> +	int (*get_key_info)(void *cookie, smc_key key, struct apple_smc_key_info *info);
> >> +};
> >> +
> >> +struct apple_smc *apple_smc_probe(struct device *dev, const struct apple_smc_backend_ops *ops,
> >> +				  void *cookie);
> >> +void *apple_smc_get_cookie(struct apple_smc *smc);
> >> +int apple_smc_remove(struct apple_smc *smc);
> >> +void apple_smc_event_received(struct apple_smc *smc, uint32_t event);
> >> +
> >> +#endif
> >> diff --git a/drivers/platform/apple/smc_core.c b/drivers/platform/apple/smc_core.c
> >> new file mode 100644
> >> index 000000000000..daf029cd072f
> >> --- /dev/null
> >> +++ b/drivers/platform/apple/smc_core.c
> >> @@ -0,0 +1,249 @@
> >> +// SPDX-License-Identifier: GPL-2.0-only OR MIT
> >> +/*
> >> + * Apple SMC core framework
> >> + * Copyright The Asahi Linux Contributors
> >> + */
> >> +
> >> +#include <linux/device.h>
> >> +#include <linux/mfd/core.h>
> > 
> > Please refrain from using the MFD API outside of drivers/mfd.
> > 
> > If you need an MFD driver, please separate it out.
> > 
> > If not, please replace it with the platform_*() API instead.
> 
> There is precedent for MFD devices under platform/:
> 
> drivers/platform/x86/intel/int3472/tps68470.c
> 
> As well as other examples in the tree:
> 
> drivers/firmware/xilinx/zynqmp.c
> drivers/iio/common/ssp_sensors/ssp_dev.c
> drivers/misc/cardreader/alcor_pci.c
> drivers/misc/cardreader/rtsx_pcr.c
> drivers/misc/cardreader/rtsx_usb.c
> drivers/soc/samsung/exynos-pmu.c
> drivers/staging/nvec/nvec.c

I'm aware of the previous offences.

They each slipped-in before I could catch them.  Ideally I'd like to
reverse the act.  However, finding time for such low-priority
activities has proved challenging.

I only noticed *this* occurrence due to the MFD header file.

> Since it's a driver for a platform-specific firmware service, I thought
> it made more sense in platform/ than mfd/. It's using the MFD API
> because the firmware exposes multiple subsystems, and this maps very
> nicely to the MFD model - NIHing that scaffolding would require a whole
> bunch of custom matching/device creation code.

I'm also aware of the convenience value of {ab}using the MFD API.

> But it's not exactly your
> typical MFD device (it's not even a separate chip, it's part of the main
> SoC), so I'm not sure if it really belongs in mfd/ from an
> organizational standpoint?

There is a strong argument for all SoCs to be classed as (massive)
MFDs.  However seeing as they represent more of a whole platform,
rather than an add-on chip, we have had the sense to represent them
differently.  Some such submissions I have made explicit requests to be
moved form drivers/mfd *into* drivers/platform in the past.

Most SoCs are solely represented in DT, omitting the requirement for
subsequent device registration.  Have you considered this?  If so, why
does this not suit your use-case?

The long and the short of it is; if you wish to treat this device, or
at least a section of it, as a type of MFD, then please draft that
part of it as an MFD driver, residing in drivers/mfd.  If it's "not
really an MFD", then find another way to represent the conglomeration
please.

If the MFD route is the best, then you can register each of the
devices, including the *-core from drivers/mfd.  Grep for "cross-ec"
as a relatively recently good example.

-- 
Lee Jones [李琼斯]

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2022-09-08 12:33 UTC|newest]

Thread overview: 171+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-01 13:54 [PATCH 0/6] Add Apple Mac System Management Controller GPIOs Russell King (Oracle)
2022-09-01 13:54 ` [PATCH 1/6] dt-bindings: mfd: add binding for Apple Mac System Management Controller Russell King (Oracle)
2022-09-01 15:06   ` Krzysztof Kozlowski
2022-09-01 15:12     ` Russell King (Oracle)
2022-09-01 15:15       ` Krzysztof Kozlowski
2022-09-01 15:24         ` Russell King (Oracle)
2022-09-01 15:45           ` Krzysztof Kozlowski
2022-09-01 15:56             ` Russell King (Oracle)
2022-09-01 16:25               ` Krzysztof Kozlowski
2022-09-01 16:47                 ` Russell King (Oracle)
2022-09-01 22:33                   ` Rob Herring
2022-09-02 15:06                     ` Mark Kettenis
2022-09-02 17:28                       ` Rob Herring
2022-09-05 10:24                         ` Russell King (Oracle)
2022-09-06  9:04                         ` Russell King (Oracle)
2022-09-06  9:31                           ` Mark Kettenis
2022-09-06 11:22                             ` Linus Walleij
2022-09-06 11:36                               ` Hector Martin
2022-09-06 11:57                                 ` Linus Walleij
2022-09-06 13:28                                   ` Hector Martin
2022-09-06 13:43                                     ` Russell King (Oracle)
2022-09-06 13:53                                       ` Hector Martin
2022-09-06 14:25                                         ` Mark Kettenis
2022-09-06 14:54                                           ` Russell King (Oracle)
2022-09-06 15:38                                             ` Mark Kettenis
2022-09-06 15:55                                             ` Rob Herring
2022-09-06 13:46                                     ` Linus Walleij
2022-09-06 15:34                                 ` Rob Herring
2022-09-06 16:10                           ` Rob Herring
2022-09-06 17:00                             ` Hector Martin
2022-09-06 17:35                               ` Rob Herring
2022-09-06 17:40                                 ` Sven Peter
2022-09-06 18:38                                 ` Hector Martin
2022-09-07  9:39                                   ` Mark Kettenis
2022-09-01 22:26               ` Rob Herring
2022-09-02 14:49                 ` Mark Kettenis
2022-09-02 17:04                   ` Rob Herring
2022-09-01 19:14   ` Rob Herring
2022-09-01 13:54 ` [PATCH 2/6] dt-bindings: gpio: add binding for the GPIO block for Apple Mac SMC Russell King (Oracle)
2022-09-01 15:11   ` Krzysztof Kozlowski
2022-09-01 15:14     ` Russell King (Oracle)
2022-09-01 13:54 ` [PATCH 3/6] soc: apple: rtkit: Add apple_rtkit_poll Russell King
2022-09-01 17:00   ` Sven Peter
2022-09-01 17:25   ` Eric Curtin
2022-09-01 13:54 ` [PATCH 4/6] platform/apple: Add new Apple Mac SMC driver Russell King
2022-09-01 17:50   ` Sven Peter
2022-09-05 10:55     ` Russell King (Oracle)
2022-09-05 16:53       ` Hector Martin
2022-09-01 19:26   ` Andy Shevchenko
2022-09-02  6:45     ` Sven Peter
2022-09-05 14:45     ` Hector Martin
2022-09-05 15:00       ` Andy Shevchenko
2022-09-08 10:58   ` Lee Jones
2022-09-08 11:28     ` Hector Martin
2022-09-08 12:31       ` Lee Jones [this message]
2022-09-08 12:58         ` Hector Martin
2022-09-08 13:29           ` Linus Walleij
2022-09-08 13:36           ` Lee Jones
2022-09-08 13:58             ` Hector Martin
2022-09-09  7:50               ` Lee Jones
2022-09-12 10:03                 ` Russell King (Oracle)
2022-09-12 10:55                   ` Lee Jones
2022-10-28 15:36                     ` Russell King (Oracle)
2022-10-31  8:46                       ` Lee Jones
2022-10-31  9:03                         ` Hector Martin
2022-10-31  9:44                         ` Russell King (Oracle)
2022-10-31 17:24                           ` Lee Jones
2022-10-31 19:47                             ` Russell King (Oracle)
2022-11-01  9:59                               ` Lee Jones
2022-10-29  6:40                 ` Hector Martin
2022-10-31  8:48                   ` Lee Jones
2022-10-31  8:58                     ` Hector Martin
2022-10-31  9:29                       ` Lee Jones
2022-10-31  9:44                         ` Hector Martin
2022-10-31 17:23                           ` Lee Jones
2022-10-31 19:34                             ` Russell King (Oracle)
2022-11-02 13:12                               ` Lee Jones
2022-11-02 15:54                                 ` Russell King (Oracle)
2022-09-01 13:54 ` [PATCH 5/6] gpio: Add new gpio-macsmc driver for Apple Macs Russell King
2022-09-01 18:55   ` Andy Shevchenko
2022-09-01 21:51     ` Martin Povišer
2022-09-02  6:31       ` Andy Shevchenko
     [not found]         ` <3B649A66-8116-432D-B88A-B5CE493EF930@cutebit.org>
     [not found]           ` <CAHp75VeB3_sZ2vsSxMSsLeJSkyemDh9iOPHXJCN1mhodA13LNQ@mail.gmail.com>
2022-09-02 11:12             ` Martin Povišer
2022-09-02 13:33               ` Andy Shevchenko
2022-09-02 13:36                 ` Andy Shevchenko
2022-09-02 13:37                 ` Martin Povišer
2022-09-02 14:41                   ` Andy Shevchenko
2022-09-02 14:45                   ` Russell King (Oracle)
2022-09-02 10:05     ` Russell King (Oracle)
2022-09-02 10:37       ` Andy Shevchenko
2022-09-02 11:32         ` Russell King (Oracle)
2022-09-02 13:39           ` Andy Shevchenko
2022-09-02 14:46             ` Russell King (Oracle)
2022-09-02 14:53               ` Andy Shevchenko
2022-09-02 15:34                 ` Russell King (Oracle)
2022-09-02 15:43                   ` Andy Shevchenko
2022-09-05 10:20                     ` Russell King (Oracle)
2022-09-05 10:32                       ` Andy Shevchenko
2022-09-05 13:10                         ` Russell King (Oracle)
2022-09-05 13:16                           ` Andy Shevchenko
2022-09-05 14:01                             ` Russell King (Oracle)
2022-09-05 14:02                               ` Russell King (Oracle)
2022-09-05 14:42                                 ` Andy Shevchenko
2022-09-05 14:53                                   ` Russell King (Oracle)
2022-09-05 14:50                               ` Andy Shevchenko
2022-09-05 15:52                               ` Hector Martin
2022-09-05 15:56                                 ` Russell King (Oracle)
2022-09-05 15:32                             ` Russell King (Oracle)
2022-09-05 15:44                               ` Martin Povišer
2022-09-05 15:58                                 ` Hector Martin
2022-09-05 16:13                                   ` Russell King (Oracle)
2022-09-05 19:10                                     ` Linus Walleij
2022-09-06  6:51                                       ` Hector Martin
2022-09-05 15:47                             ` Hector Martin
2022-09-05 15:39                       ` Hector Martin
2022-09-05 15:16       ` Hector Martin
2022-09-05 15:04     ` Hector Martin
2022-09-02  9:42   ` Linus Walleij
2022-09-01 13:54 ` [PATCH 6/6] gpio: macsmc: Add IRQ support Russell King
2022-09-01 18:03   ` Andy Shevchenko
2022-09-05 11:54     ` Russell King (Oracle)
     [not found]       ` <CAHp75VeDGCp8J6wnmCqGpV++vs2Zur9Mfp71Dk8dVXcuHFnCrQ@mail.gmail.com>
2022-09-05 13:21         ` Andy Shevchenko
2022-09-02 13:21   ` Linus Walleij
2022-09-05 12:47     ` Russell King (Oracle)
2022-09-05 13:19       ` Fwd: " Andy Shevchenko
2022-09-05 21:43         ` Russell King (Oracle)
2022-09-05 13:27       ` Linus Walleij
2022-09-06  7:00     ` Hector Martin
2022-09-06  7:47       ` Russell King (Oracle)
2022-09-06  8:00         ` Hector Martin
2022-09-01 15:12 ` [PATCH 0/6] Add Apple Mac System Management Controller GPIOs Krzysztof Kozlowski
2022-10-27 15:35 ` Russell King (Oracle)
2022-11-08 16:32 ` [PATCH v3 0/7] " Russell King (Oracle)
2022-11-08 16:33   ` [PATCH v3 1/7] mfd: Add core Apple Mac SMC driver Russell King
2022-11-14  9:52     ` Lee Jones
2022-11-14 10:35     ` Andy Shevchenko
2022-11-08 16:33   ` [PATCH v3 2/7] lib/vsprintf: Add support for generic FOURCCs by extending %p4cc Russell King
2022-11-14 15:34     ` Petr Mladek
2022-11-14 15:46       ` Andy Shevchenko
2022-11-14 16:18         ` Petr Mladek
2022-11-14 16:15       ` Russell King (Oracle)
2022-11-14 16:46         ` Russell King (Oracle)
2022-11-22 12:43         ` Petr Mladek
2022-11-22 14:49     ` Petr Mladek
2022-11-08 16:33   ` [PATCH v3 3/7] dt-bindings: mfd: add binding for Apple Mac System Management Controller Russell King (Oracle)
2022-11-08 20:42     ` Linus Walleij
2022-11-08 20:55     ` Krzysztof Kozlowski
2022-11-08 22:22       ` Russell King (Oracle)
2022-11-09  8:35         ` Krzysztof Kozlowski
2022-11-09 22:17         ` Rob Herring
2022-11-10 11:35           ` Hector Martin
2022-11-10 11:48           ` Russell King (Oracle)
2022-11-10 14:00             ` Krzysztof Kozlowski
2022-11-10 14:14               ` Russell King (Oracle)
2022-11-10 14:21                 ` Krzysztof Kozlowski
2022-11-10 14:23                   ` Russell King (Oracle)
2022-11-10 14:36                     ` Krzysztof Kozlowski
2022-11-10 14:43                       ` Russell King (Oracle)
2022-11-14 10:05           ` Lee Jones
2022-11-08 22:30     ` Rob Herring
2022-11-08 16:33   ` [PATCH v3 4/7] platform/apple: Add new Apple Mac SMC driver Russell King
2022-11-08 16:33   ` [PATCH v3 5/7] arm64: dts: apple: Add SMC node to t8103 devicetrees Russell King
2022-11-08 16:33   ` [PATCH v3 6/7] dt-bindings: gpio: add binding for the GPIO block for Apple Mac SMC Russell King (Oracle)
2022-11-08 20:56     ` Krzysztof Kozlowski
2022-11-08 22:09       ` Russell King (Oracle)
2022-11-09  7:31         ` Hector Martin
2022-11-09  8:36         ` Krzysztof Kozlowski
2022-11-09  9:12           ` Russell King (Oracle)
2022-11-09  9:19             ` Krzysztof Kozlowski
2022-11-08 22:30     ` Rob Herring
2022-11-08 16:33   ` [PATCH v3 7/7] gpio: Add new gpio-macsmc driver for Apple Macs Russell King

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=YxngtlhRLTVBw+iW@google.com \
    --to=lee@kernel.org \
    --cc=alyssa@rosenzweig.io \
    --cc=arnd@arndb.de \
    --cc=asahi@lists.linux.dev \
    --cc=brgl@bgdev.pl \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=marcan@marcan.st \
    --cc=rmk+kernel@armlinux.org.uk \
    --cc=sven@svenpeter.dev \
    /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;
as well as URLs for NNTP newsgroup(s).