From: Anand Sawant <sawant@ti.com>
To: Thara Gopinath <thara@ti.com>,
linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org
Cc: khilman@deeprootsystems.com, paul@pwsan.com,
Benoit Cousson <b-cousson@ti.com>,
Vishwanath Sripathy <vishwanath.bs@ti.com>,
Nishanth Menon <nm@ti.com>
Subject: RE: [PATCH v6 09/10] OMAP3: PM: Adding debug support to Voltage and Smartreflex drivers
Date: Tue, 28 Dec 2010 22:37:49 +0530 [thread overview]
Message-ID: <1b7fd98d1f8cf358cdc712da05f30a34@mail.gmail.com> (raw)
In-Reply-To: <1292864357-13939-10-git-send-email-thara@ti.com>
Thara,
Few comments on the changes in voltage layer ...
> -----Original Message-----
> From: Thara Gopinath [mailto:thara@ti.com]
> Sent: Monday, December 20, 2010 10:29 PM
> To: linux-omap@vger.kernel.org; linux-arm-
> kernel@lists.infradead.org
> Cc: khilman@deeprootsystems.com; paul@pwsan.com; b-
> cousson@ti.com; vishwanath.bs@ti.com; sawant@ti.com;
> nm@ti.com; Thara Gopinath
> Subject: [PATCH v6 09/10] OMAP3: PM: Adding debug support to
> Voltage and Smartreflex drivers
>
> This patch adds debug support to the voltage and smartreflex
> drivers.
> This means a whole bunch of voltage processor and
> smartreflex
> parameters are now visible through the pm debugfs.
> The voltage parameters can be viewed at
> /debug/voltage/vdd_<x>/<parameter>
> and the smartreflex parameters can be viewed at
> /debug/voltage/vdd_<x>/smartreflex/<parameter>
>
> Also smartreflex n-target values are now exposed out at
> /debug/voltage/vdd_<x>/smartreflex/nvalue/<voltage>
>
> The interface to access smartreflex n-target values is a
> read-write interface which means user has the flexibility
> to change the n-target values for any opp.
>
> Signed-off-by: Thara Gopinath <thara@ti.com>
> ---
> arch/arm/mach-omap2/smartreflex.c | 46
> ++++++++++++++++++++++++-
> arch/arm/mach-omap2/voltage.c | 66
> +++++++++++++++++++++++++++++++++++++
> 2 files changed, 110 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/smartreflex.c
> b/arch/arm/mach-omap2/smartreflex.c
> index eee23d0..52a05b3 100644
> --- a/arch/arm/mach-omap2/smartreflex.c
> +++ b/arch/arm/mach-omap2/smartreflex.c
> @@ -31,6 +31,7 @@
> #include "pm.h"
>
> #define SMARTREFLEX_NAME_LEN 16
> +#define NVALUE_NAME_LEN 40
> #define SR_DISABLE_TIMEOUT 200
>
> struct omap_sr {
> @@ -817,8 +818,9 @@ static int __init omap_sr_probe(struct
> platform_device *pdev)
> struct omap_sr *sr_info = kzalloc(sizeof(struct
> omap_sr), GFP_KERNEL);
> struct omap_sr_data *pdata = pdev->dev.platform_data;
> struct resource *mem, *irq;
> - struct dentry *vdd_dbg_dir, *dbg_dir;
> - int ret = 0;
> + struct dentry *vdd_dbg_dir, *dbg_dir, *nvalue_dir;
> + struct omap_volt_data *volt_data;
> + int i, ret = 0;
>
> if (!sr_info) {
> dev_err(&pdev->dev, "%s: unable to allocate
> sr_info\n",
> @@ -897,6 +899,46 @@ static int __init omap_sr_probe(struct
> platform_device *pdev)
>
> (void) debugfs_create_file("autocomp", S_IRUGO |
> S_IWUGO, dbg_dir,
> (void *)sr_info, &pm_sr_fops);
> + (void) debugfs_create_x32("errweight", S_IRUGO,
> dbg_dir,
> + &sr_info->err_weight);
> + (void) debugfs_create_x32("errmaxlimit", S_IRUGO,
> dbg_dir,
> + &sr_info->err_maxlimit);
> + (void) debugfs_create_x32("errminlimit", S_IRUGO,
> dbg_dir,
> + &sr_info->err_minlimit);
> +
> + nvalue_dir = debugfs_create_dir("nvalue", dbg_dir);
> + if (IS_ERR(nvalue_dir)) {
> + dev_err(&pdev->dev, "%s: Unable to create
> debugfs directory"
> + "for n-values\n", __func__);
> + return PTR_ERR(nvalue_dir);
> + }
> +
> + omap_voltage_get_volttable(sr_info->voltdm,
> &volt_data);
> + if (!volt_data) {
> + dev_warn(&pdev->dev, "%s: No Voltage table for
> the"
> + " corresponding vdd vdd_%s. Cannot create
> debugfs"
> + "entries for n-values\n",
> + __func__, sr_info->voltdm->name);
> + return -ENODATA;
> + }
> +
> + for (i = 0; i < sr_info->nvalue_count; i++) {
> + char *name;
> + char volt_name[32];
> +
> + name = kzalloc(NVALUE_NAME_LEN + 1, GFP_KERNEL);
> + if (!name) {
> + dev_err(&pdev->dev, "%s: Unable to
> allocate memory"
> + " for n-value directory name\n",
> __func__);
> + return -ENOMEM;
> + }
> +
> + strcpy(name, "volt_");
> + sprintf(volt_name, "%d",
> volt_data[i].volt_nominal);
> + strcat(name, volt_name);
> + (void) debugfs_create_x32(name, S_IRUGO |
> S_IWUGO, nvalue_dir,
> + &(sr_info->nvalue_table[i].nvalue));
> + }
>
> return ret;
>
> diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-
> omap2/voltage.c
> index 875667f..b27fa4f 100644
> --- a/arch/arm/mach-omap2/voltage.c
> +++ b/arch/arm/mach-omap2/voltage.c
> @@ -250,6 +250,47 @@ static void omap3_voltage_write_reg(u32
> val, u16 mod, u8 offset)
> omap2_prm_write_mod_reg(val, mod, offset);
> }
>
> +/* Voltage debugfs support */
Add comment for the function.
> +static int vp_volt_debug_get(void *data, u64 *val)
> +{
> + struct omap_vdd_info *vdd = (struct omap_vdd_info *)
> data;
> + u8 vsel;
> +
> + if (!vdd) {
> + pr_warning("Wrong paramater passed\n");
> + return -EINVAL;
> + }
> +
> + vsel = vdd->read_reg(vdd->vp_reg.prm_mod, vdd-
> >vp_offs.voltage);
> + pr_notice("curr_vsel = %x\n", vsel);
> +
> + if (!vdd->pmic_info->vsel_to_uv) {
> + pr_warning("PMIC function to convert vsel to
> voltage"
> + "in uV not registerd\n");
> + return -EINVAL;
> + }
> +
> + *val = vdd->pmic_info->vsel_to_uv(vsel);
> + return 0;
> +}
> +
Add comment for the function.
> +static int nom_volt_debug_get(void *data, u64 *val)
> +{
> + struct omap_vdd_info *vdd = (struct omap_vdd_info *)
> data;
> +
> + if (!vdd) {
> + pr_warning("Wrong paramater passed\n");
> + return -EINVAL;
> + }
> +
> + *val = omap_voltage_get_nom_volt(&vdd->voltdm);
> +
> + return 0;
> +}
> +
> +DEFINE_SIMPLE_ATTRIBUTE(vp_volt_debug_fops,
> vp_volt_debug_get, NULL, "%llu\n");
> +DEFINE_SIMPLE_ATTRIBUTE(nom_volt_debug_fops,
> nom_volt_debug_get, NULL,
> + "%llu\n");
> static void vp_latch_vsel(struct omap_vdd_info *vdd)
> {
> u32 vpconfig;
> @@ -349,7 +390,32 @@ static void __init
> vdd_debugfs_init(struct omap_vdd_info *vdd)
> pr_warning("%s: Unable to create debugfs
> directory for"
> " vdd_%s\n", __func__, vdd->voltdm.name);
> vdd->debug_dir = NULL;
> + return;
> }
> +
> + (void) debugfs_create_x16("vp_errorgain", S_IRUGO,
> vdd->debug_dir,
> + &(vdd->vp_reg.vpconfig_errorgain));
> + (void) debugfs_create_x16("vp_smpswaittimemin",
> S_IRUGO,
> + vdd->debug_dir,
> + &(vdd-
> >vp_reg.vstepmin_smpswaittimemin));
> + (void) debugfs_create_x8("vp_stepmin", S_IRUGO, vdd-
> >debug_dir,
> + &(vdd->vp_reg.vstepmin_stepmin));
> + (void) debugfs_create_x16("vp_smpswaittimemax",
> S_IRUGO,
> + vdd->debug_dir,
> + &(vdd-
> >vp_reg.vstepmax_smpswaittimemax));
> + (void) debugfs_create_x8("vp_stepmax", S_IRUGO, vdd-
> >debug_dir,
> + &(vdd->vp_reg.vstepmax_stepmax));
> + (void) debugfs_create_x8("vp_vddmax", S_IRUGO, vdd-
> >debug_dir,
> + &(vdd->vp_reg.vlimitto_vddmax));
> + (void) debugfs_create_x8("vp_vddmin", S_IRUGO, vdd-
> >debug_dir,
> + &(vdd->vp_reg.vlimitto_vddmin));
> + (void) debugfs_create_x16("vp_timeout", S_IRUGO, vdd-
> >debug_dir,
> + &(vdd->vp_reg.vlimitto_timeout));
> + (void) debugfs_create_file("curr_vp_volt", S_IRUGO,
> vdd->debug_dir,
> + (void *) vdd, &vp_volt_debug_fops);
> + (void) debugfs_create_file("curr_nominal_volt",
> S_IRUGO,
> + vdd->debug_dir, (void *) vdd,
> + &nom_volt_debug_fops);
Recommend to add support for vc cmdval & vc bypass_val.
Best Regards,
Anand Sawant
> }
>
> /* Voltage scale and accessory APIs */
> --
> 1.7.0.4
WARNING: multiple messages have this Message-ID (diff)
From: sawant@ti.com (Anand Sawant)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v6 09/10] OMAP3: PM: Adding debug support to Voltage and Smartreflex drivers
Date: Tue, 28 Dec 2010 22:37:49 +0530 [thread overview]
Message-ID: <1b7fd98d1f8cf358cdc712da05f30a34@mail.gmail.com> (raw)
In-Reply-To: <1292864357-13939-10-git-send-email-thara@ti.com>
Thara,
Few comments on the changes in voltage layer ...
> -----Original Message-----
> From: Thara Gopinath [mailto:thara at ti.com]
> Sent: Monday, December 20, 2010 10:29 PM
> To: linux-omap at vger.kernel.org; linux-arm-
> kernel at lists.infradead.org
> Cc: khilman at deeprootsystems.com; paul at pwsan.com; b-
> cousson at ti.com; vishwanath.bs at ti.com; sawant at ti.com;
> nm at ti.com; Thara Gopinath
> Subject: [PATCH v6 09/10] OMAP3: PM: Adding debug support to
> Voltage and Smartreflex drivers
>
> This patch adds debug support to the voltage and smartreflex
> drivers.
> This means a whole bunch of voltage processor and
> smartreflex
> parameters are now visible through the pm debugfs.
> The voltage parameters can be viewed at
> /debug/voltage/vdd_<x>/<parameter>
> and the smartreflex parameters can be viewed at
> /debug/voltage/vdd_<x>/smartreflex/<parameter>
>
> Also smartreflex n-target values are now exposed out at
> /debug/voltage/vdd_<x>/smartreflex/nvalue/<voltage>
>
> The interface to access smartreflex n-target values is a
> read-write interface which means user has the flexibility
> to change the n-target values for any opp.
>
> Signed-off-by: Thara Gopinath <thara@ti.com>
> ---
> arch/arm/mach-omap2/smartreflex.c | 46
> ++++++++++++++++++++++++-
> arch/arm/mach-omap2/voltage.c | 66
> +++++++++++++++++++++++++++++++++++++
> 2 files changed, 110 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/smartreflex.c
> b/arch/arm/mach-omap2/smartreflex.c
> index eee23d0..52a05b3 100644
> --- a/arch/arm/mach-omap2/smartreflex.c
> +++ b/arch/arm/mach-omap2/smartreflex.c
> @@ -31,6 +31,7 @@
> #include "pm.h"
>
> #define SMARTREFLEX_NAME_LEN 16
> +#define NVALUE_NAME_LEN 40
> #define SR_DISABLE_TIMEOUT 200
>
> struct omap_sr {
> @@ -817,8 +818,9 @@ static int __init omap_sr_probe(struct
> platform_device *pdev)
> struct omap_sr *sr_info = kzalloc(sizeof(struct
> omap_sr), GFP_KERNEL);
> struct omap_sr_data *pdata = pdev->dev.platform_data;
> struct resource *mem, *irq;
> - struct dentry *vdd_dbg_dir, *dbg_dir;
> - int ret = 0;
> + struct dentry *vdd_dbg_dir, *dbg_dir, *nvalue_dir;
> + struct omap_volt_data *volt_data;
> + int i, ret = 0;
>
> if (!sr_info) {
> dev_err(&pdev->dev, "%s: unable to allocate
> sr_info\n",
> @@ -897,6 +899,46 @@ static int __init omap_sr_probe(struct
> platform_device *pdev)
>
> (void) debugfs_create_file("autocomp", S_IRUGO |
> S_IWUGO, dbg_dir,
> (void *)sr_info, &pm_sr_fops);
> + (void) debugfs_create_x32("errweight", S_IRUGO,
> dbg_dir,
> + &sr_info->err_weight);
> + (void) debugfs_create_x32("errmaxlimit", S_IRUGO,
> dbg_dir,
> + &sr_info->err_maxlimit);
> + (void) debugfs_create_x32("errminlimit", S_IRUGO,
> dbg_dir,
> + &sr_info->err_minlimit);
> +
> + nvalue_dir = debugfs_create_dir("nvalue", dbg_dir);
> + if (IS_ERR(nvalue_dir)) {
> + dev_err(&pdev->dev, "%s: Unable to create
> debugfs directory"
> + "for n-values\n", __func__);
> + return PTR_ERR(nvalue_dir);
> + }
> +
> + omap_voltage_get_volttable(sr_info->voltdm,
> &volt_data);
> + if (!volt_data) {
> + dev_warn(&pdev->dev, "%s: No Voltage table for
> the"
> + " corresponding vdd vdd_%s. Cannot create
> debugfs"
> + "entries for n-values\n",
> + __func__, sr_info->voltdm->name);
> + return -ENODATA;
> + }
> +
> + for (i = 0; i < sr_info->nvalue_count; i++) {
> + char *name;
> + char volt_name[32];
> +
> + name = kzalloc(NVALUE_NAME_LEN + 1, GFP_KERNEL);
> + if (!name) {
> + dev_err(&pdev->dev, "%s: Unable to
> allocate memory"
> + " for n-value directory name\n",
> __func__);
> + return -ENOMEM;
> + }
> +
> + strcpy(name, "volt_");
> + sprintf(volt_name, "%d",
> volt_data[i].volt_nominal);
> + strcat(name, volt_name);
> + (void) debugfs_create_x32(name, S_IRUGO |
> S_IWUGO, nvalue_dir,
> + &(sr_info->nvalue_table[i].nvalue));
> + }
>
> return ret;
>
> diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-
> omap2/voltage.c
> index 875667f..b27fa4f 100644
> --- a/arch/arm/mach-omap2/voltage.c
> +++ b/arch/arm/mach-omap2/voltage.c
> @@ -250,6 +250,47 @@ static void omap3_voltage_write_reg(u32
> val, u16 mod, u8 offset)
> omap2_prm_write_mod_reg(val, mod, offset);
> }
>
> +/* Voltage debugfs support */
Add comment for the function.
> +static int vp_volt_debug_get(void *data, u64 *val)
> +{
> + struct omap_vdd_info *vdd = (struct omap_vdd_info *)
> data;
> + u8 vsel;
> +
> + if (!vdd) {
> + pr_warning("Wrong paramater passed\n");
> + return -EINVAL;
> + }
> +
> + vsel = vdd->read_reg(vdd->vp_reg.prm_mod, vdd-
> >vp_offs.voltage);
> + pr_notice("curr_vsel = %x\n", vsel);
> +
> + if (!vdd->pmic_info->vsel_to_uv) {
> + pr_warning("PMIC function to convert vsel to
> voltage"
> + "in uV not registerd\n");
> + return -EINVAL;
> + }
> +
> + *val = vdd->pmic_info->vsel_to_uv(vsel);
> + return 0;
> +}
> +
Add comment for the function.
> +static int nom_volt_debug_get(void *data, u64 *val)
> +{
> + struct omap_vdd_info *vdd = (struct omap_vdd_info *)
> data;
> +
> + if (!vdd) {
> + pr_warning("Wrong paramater passed\n");
> + return -EINVAL;
> + }
> +
> + *val = omap_voltage_get_nom_volt(&vdd->voltdm);
> +
> + return 0;
> +}
> +
> +DEFINE_SIMPLE_ATTRIBUTE(vp_volt_debug_fops,
> vp_volt_debug_get, NULL, "%llu\n");
> +DEFINE_SIMPLE_ATTRIBUTE(nom_volt_debug_fops,
> nom_volt_debug_get, NULL,
> + "%llu\n");
> static void vp_latch_vsel(struct omap_vdd_info *vdd)
> {
> u32 vpconfig;
> @@ -349,7 +390,32 @@ static void __init
> vdd_debugfs_init(struct omap_vdd_info *vdd)
> pr_warning("%s: Unable to create debugfs
> directory for"
> " vdd_%s\n", __func__, vdd->voltdm.name);
> vdd->debug_dir = NULL;
> + return;
> }
> +
> + (void) debugfs_create_x16("vp_errorgain", S_IRUGO,
> vdd->debug_dir,
> + &(vdd->vp_reg.vpconfig_errorgain));
> + (void) debugfs_create_x16("vp_smpswaittimemin",
> S_IRUGO,
> + vdd->debug_dir,
> + &(vdd-
> >vp_reg.vstepmin_smpswaittimemin));
> + (void) debugfs_create_x8("vp_stepmin", S_IRUGO, vdd-
> >debug_dir,
> + &(vdd->vp_reg.vstepmin_stepmin));
> + (void) debugfs_create_x16("vp_smpswaittimemax",
> S_IRUGO,
> + vdd->debug_dir,
> + &(vdd-
> >vp_reg.vstepmax_smpswaittimemax));
> + (void) debugfs_create_x8("vp_stepmax", S_IRUGO, vdd-
> >debug_dir,
> + &(vdd->vp_reg.vstepmax_stepmax));
> + (void) debugfs_create_x8("vp_vddmax", S_IRUGO, vdd-
> >debug_dir,
> + &(vdd->vp_reg.vlimitto_vddmax));
> + (void) debugfs_create_x8("vp_vddmin", S_IRUGO, vdd-
> >debug_dir,
> + &(vdd->vp_reg.vlimitto_vddmin));
> + (void) debugfs_create_x16("vp_timeout", S_IRUGO, vdd-
> >debug_dir,
> + &(vdd->vp_reg.vlimitto_timeout));
> + (void) debugfs_create_file("curr_vp_volt", S_IRUGO,
> vdd->debug_dir,
> + (void *) vdd, &vp_volt_debug_fops);
> + (void) debugfs_create_file("curr_nominal_volt",
> S_IRUGO,
> + vdd->debug_dir, (void *) vdd,
> + &nom_volt_debug_fops);
Recommend to add support for vc cmdval & vc bypass_val.
Best Regards,
Anand Sawant
> }
>
> /* Voltage scale and accessory APIs */
> --
> 1.7.0.4
next prev parent reply other threads:[~2010-12-28 17:07 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-20 16:59 [PATCH v6 00/10] OMAP: Adding Smartreflex and Voltage driver support Thara Gopinath
2010-12-20 16:59 ` Thara Gopinath
2010-12-20 16:59 ` [PATCH v6 01/10] OMAP3: PM: Adding voltage " Thara Gopinath
2010-12-20 16:59 ` Thara Gopinath
2010-12-22 22:29 ` Kevin Hilman
2010-12-22 22:29 ` Kevin Hilman
2010-12-28 16:17 ` Anand Sawant
2010-12-28 16:17 ` Anand Sawant
2010-12-20 16:59 ` [PATCH v6 02/10] OMAP: Introduce voltage domain information in the hwmod structures Thara Gopinath
2010-12-20 16:59 ` Thara Gopinath
2010-12-20 16:59 ` [PATCH v6 03/10] OMAP3: PM: Adding smartreflex driver support Thara Gopinath
2010-12-20 16:59 ` Thara Gopinath
2010-12-20 16:59 ` [PATCH v6 04/10] OMAP3: PM: Adding smartreflex device file Thara Gopinath
2010-12-20 16:59 ` Thara Gopinath
2010-12-20 16:59 ` [PATCH v6 05/10] OMAP3: PM: Adding smartreflex hwmod data Thara Gopinath
2010-12-20 16:59 ` Thara Gopinath
2010-12-20 16:59 ` [PATCH v6 06/10] OMAP3: PM: Adding smartreflex class3 driver Thara Gopinath
2010-12-20 16:59 ` Thara Gopinath
2010-12-20 16:59 ` [PATCH v6 07/10] OMAP3: PM: Adding T2 enabling of smartreflex support Thara Gopinath
2010-12-20 16:59 ` Thara Gopinath
2010-12-22 20:30 ` Kevin Hilman
2010-12-22 20:30 ` Kevin Hilman
2010-12-31 8:01 ` Gopinath, Thara
2010-12-31 8:01 ` Gopinath, Thara
2011-01-02 14:28 ` Woodruff, Richard
2011-01-02 14:28 ` Woodruff, Richard
2010-12-20 16:59 ` [PATCH v6 08/10] OMAP3: PM: Register TWL4030 pmic info with the voltage driver Thara Gopinath
2010-12-20 16:59 ` Thara Gopinath
2010-12-20 16:59 ` [PATCH v6 09/10] OMAP3: PM: Adding debug support to Voltage and Smartreflex drivers Thara Gopinath
2010-12-20 16:59 ` Thara Gopinath
2010-12-28 17:07 ` Anand Sawant [this message]
2010-12-28 17:07 ` Anand Sawant
2010-12-20 16:59 ` [PATCH v6 10/10] OMAP3: PM: Program correct init voltages for VDD1 and VDD2 Thara Gopinath
2010-12-20 16:59 ` Thara Gopinath
2010-12-21 1:05 ` [PATCH v6 00/10] OMAP: Adding Smartreflex and Voltage driver support Kevin Hilman
2010-12-21 1:05 ` Kevin Hilman
2010-12-21 2:23 ` Tony Lindgren
2010-12-21 2:23 ` Tony Lindgren
2010-12-21 3:18 ` Tony Lindgren
2010-12-21 3:18 ` Tony Lindgren
2010-12-21 16:17 ` Kevin Hilman
2010-12-21 16:17 ` Kevin Hilman
2010-12-21 18:55 ` Tony Lindgren
2010-12-21 18:55 ` Tony Lindgren
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=1b7fd98d1f8cf358cdc712da05f30a34@mail.gmail.com \
--to=sawant@ti.com \
--cc=b-cousson@ti.com \
--cc=khilman@deeprootsystems.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-omap@vger.kernel.org \
--cc=nm@ti.com \
--cc=paul@pwsan.com \
--cc=thara@ti.com \
--cc=vishwanath.bs@ti.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.