All of lore.kernel.org
 help / color / mirror / Atom feed
From: Robin Murphy <robin.murphy@arm.com>
To: Sebastian Reichel <sebastian.reichel@collabora.com>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	Daniel Lezcano <daniel.lezcano@linaro.org>,
	Zhang Rui <rui.zhang@intel.com>,
	Lukasz Luba <lukasz.luba@arm.com>,
	Heiko Stuebner <heiko@sntech.de>
Cc: linux-pm@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org,
	kernel@collabora.com
Subject: Re: [PATCH] thermal: rockchip: shut up GRF warning
Date: Tue, 19 Aug 2025 13:42:42 +0100	[thread overview]
Message-ID: <2c7301cd-9c86-47fd-8b79-05f3e1a89e47@arm.com> (raw)
In-Reply-To: <20250818-thermal-rockchip-grf-warning-v1-1-134152c97097@kernel.org>

On 18/08/2025 6:26 pm, Sebastian Reichel wrote:
> Most of the recent Rockchip devices do not have a GRF associated
> with the tsadc IP. Let's avoid printing a warning on those devices.
> 
> Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
> ---
>   drivers/thermal/rockchip_thermal.c | 53 +++++++++++++++++++++++++++++++++-----
>   1 file changed, 46 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/thermal/rockchip_thermal.c b/drivers/thermal/rockchip_thermal.c
> index 3beff9b6fac3abe8948b56132b618ff1bed57217..1e8091cebd6673ab39fa0c4dee835c68aeb7e8b5 100644
> --- a/drivers/thermal/rockchip_thermal.c
> +++ b/drivers/thermal/rockchip_thermal.c
> @@ -50,6 +50,18 @@ enum adc_sort_mode {
>   	ADC_INCREMENT,
>   };
>   
> +/*
> + * The GRF availability depends on the specific SoC
> + * GRF_NONE: the SoC does not have a GRF associated with the tsadc
> + * GRF_OPTIONAL: the SoC has a GRF, but the driver can work without it
> + * GRF_MANDATORY: the SoC has a GRF and it is required for proper operation
> + */
> +enum tsadc_grf_mode {
> +	GRF_NONE,
> +	GRF_OPTIONAL,
> +	GRF_MANDATORY,
> +};
> +
>   #include "thermal_hwmon.h"
>   
>   /**
> @@ -97,6 +109,9 @@ struct rockchip_tsadc_chip {
>   	enum tshut_mode tshut_mode;
>   	enum tshut_polarity tshut_polarity;
>   
> +	/* GRF availability */
> +	enum tsadc_grf_mode grf_mode;
> +
>   	/* Chip-wide methods */
>   	void (*initialize)(struct regmap *grf,
>   			   void __iomem *reg, enum tshut_polarity p);
> @@ -1099,6 +1114,8 @@ static const struct rockchip_tsadc_chip px30_tsadc_data = {
>   	.chn_offset = 0,
>   	.chn_num = 2, /* 2 channels for tsadc */
>   
> +	.grf_mode = GRF_MANDATORY,
> +
>   	.tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
>   	.tshut_temp = 95000,
>   
> @@ -1123,6 +1140,8 @@ static const struct rockchip_tsadc_chip rv1108_tsadc_data = {
>   	.chn_offset = 0,
>   	.chn_num = 1, /* one channel for tsadc */
>   
> +	.grf_mode = GRF_NONE,
> +
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1148,6 +1167,8 @@ static const struct rockchip_tsadc_chip rk3228_tsadc_data = {
>   	.chn_offset = 0,
>   	.chn_num = 1, /* one channel for tsadc */
>   
> +	.grf_mode = GRF_NONE,
> +
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1173,6 +1194,8 @@ static const struct rockchip_tsadc_chip rk3288_tsadc_data = {
>   	.chn_offset = 1,
>   	.chn_num = 2, /* two channels for tsadc */
>   
> +	.grf_mode = GRF_NONE,
> +
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1198,6 +1221,8 @@ static const struct rockchip_tsadc_chip rk3328_tsadc_data = {
>   	.chn_offset = 0,
>   	.chn_num = 1, /* one channels for tsadc */
>   
> +	.grf_mode = GRF_NONE,
> +
>   	.tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
>   	.tshut_temp = 95000,
>   
> @@ -1222,6 +1247,8 @@ static const struct rockchip_tsadc_chip rk3366_tsadc_data = {
>   	.chn_offset = 0,
>   	.chn_num = 2, /* two channels for tsadc */
>   
> +	.grf_mode = GRF_OPTIONAL,
> +
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1247,6 +1274,8 @@ static const struct rockchip_tsadc_chip rk3368_tsadc_data = {
>   	.chn_offset = 0,
>   	.chn_num = 2, /* two channels for tsadc */
>   
> +	.grf_mode = GRF_NONE,
> +
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1272,6 +1301,8 @@ static const struct rockchip_tsadc_chip rk3399_tsadc_data = {
>   	.chn_offset = 0,
>   	.chn_num = 2, /* two channels for tsadc */
>   
> +	.grf_mode = GRF_OPTIONAL,
> +
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1297,6 +1328,8 @@ static const struct rockchip_tsadc_chip rk3568_tsadc_data = {
>   	.chn_offset = 0,
>   	.chn_num = 2, /* two channels for tsadc */
>   
> +	.grf_mode = GRF_OPTIONAL,
> +
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1321,6 +1354,7 @@ static const struct rockchip_tsadc_chip rk3576_tsadc_data = {
>   	/* top, big_core, little_core, ddr, npu, gpu */
>   	.chn_offset = 0,
>   	.chn_num = 6, /* six channels for tsadc */
> +	.grf_mode = GRF_NONE,
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1345,6 +1379,7 @@ static const struct rockchip_tsadc_chip rk3588_tsadc_data = {
>   	/* top, big_core0, big_core1, little_core, center, gpu, npu */
>   	.chn_offset = 0,
>   	.chn_num = 7, /* seven channels for tsadc */
> +	.grf_mode = GRF_NONE,
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1572,7 +1607,7 @@ static int rockchip_configure_from_dt(struct device *dev,
>   				      struct device_node *np,
>   				      struct rockchip_thermal_data *thermal)
>   {
> -	u32 shut_temp, tshut_mode, tshut_polarity;
> +	u32 shut_temp, tshut_mode, tshut_polarity, ret;
>   
>   	if (of_property_read_u32(np, "rockchip,hw-tshut-temp", &shut_temp)) {
>   		dev_warn(dev,
> @@ -1621,12 +1656,16 @@ static int rockchip_configure_from_dt(struct device *dev,
>   		return -EINVAL;
>   	}
>   
> -	/* The tsadc wont to handle the error in here since some SoCs didn't
> -	 * need this property.
> -	 */
> -	thermal->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
> -	if (IS_ERR(thermal->grf))
> -		dev_warn(dev, "Missing rockchip,grf property\n");
> +	if (thermal->chip->grf_mode != GRF_NONE) {
> +		thermal->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
> +		if (IS_ERR(thermal->grf)) {
> +			ret = PTR_ERR(thermal->grf);
> +			if (thermal->chip->grf_mode == GRF_OPTIONAL)
> +				dev_warn(dev, "Missing rockchip,grf property\n");
> +			else
> +				return dev_err_probe(dev, ret, "Missing rockchip,grf property\n");
> +		}
> +	}

Nit: Does the lookup itself need to be made conditional? I think I'd
also agree that the "optional" mode seems suspect, so potentially it
could be a whole lot simpler, e.g.:

	thermal->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
	if (IS_ERR(thermal->grf) && thermal->chip->grf_required)
		return dev_err_probe(dev, PTR_ERR(thermal->grf),
				     "Missing rockchip,grf property\n");

Thanks,
Robin.

>   
>   	rockchip_get_trim_configuration(dev, np, thermal);
>   
> 
> ---
> base-commit: c17b750b3ad9f45f2b6f7e6f7f4679844244f0b9
> change-id: 20250818-thermal-rockchip-grf-warning-05f7f56286a2
> 
> Best regards,


WARNING: multiple messages have this Message-ID (diff)
From: Robin Murphy <robin.murphy@arm.com>
To: Sebastian Reichel <sebastian.reichel@collabora.com>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	Daniel Lezcano <daniel.lezcano@linaro.org>,
	Zhang Rui <rui.zhang@intel.com>,
	Lukasz Luba <lukasz.luba@arm.com>,
	Heiko Stuebner <heiko@sntech.de>
Cc: linux-pm@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org,
	kernel@collabora.com
Subject: Re: [PATCH] thermal: rockchip: shut up GRF warning
Date: Tue, 19 Aug 2025 13:42:42 +0100	[thread overview]
Message-ID: <2c7301cd-9c86-47fd-8b79-05f3e1a89e47@arm.com> (raw)
In-Reply-To: <20250818-thermal-rockchip-grf-warning-v1-1-134152c97097@kernel.org>

On 18/08/2025 6:26 pm, Sebastian Reichel wrote:
> Most of the recent Rockchip devices do not have a GRF associated
> with the tsadc IP. Let's avoid printing a warning on those devices.
> 
> Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
> ---
>   drivers/thermal/rockchip_thermal.c | 53 +++++++++++++++++++++++++++++++++-----
>   1 file changed, 46 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/thermal/rockchip_thermal.c b/drivers/thermal/rockchip_thermal.c
> index 3beff9b6fac3abe8948b56132b618ff1bed57217..1e8091cebd6673ab39fa0c4dee835c68aeb7e8b5 100644
> --- a/drivers/thermal/rockchip_thermal.c
> +++ b/drivers/thermal/rockchip_thermal.c
> @@ -50,6 +50,18 @@ enum adc_sort_mode {
>   	ADC_INCREMENT,
>   };
>   
> +/*
> + * The GRF availability depends on the specific SoC
> + * GRF_NONE: the SoC does not have a GRF associated with the tsadc
> + * GRF_OPTIONAL: the SoC has a GRF, but the driver can work without it
> + * GRF_MANDATORY: the SoC has a GRF and it is required for proper operation
> + */
> +enum tsadc_grf_mode {
> +	GRF_NONE,
> +	GRF_OPTIONAL,
> +	GRF_MANDATORY,
> +};
> +
>   #include "thermal_hwmon.h"
>   
>   /**
> @@ -97,6 +109,9 @@ struct rockchip_tsadc_chip {
>   	enum tshut_mode tshut_mode;
>   	enum tshut_polarity tshut_polarity;
>   
> +	/* GRF availability */
> +	enum tsadc_grf_mode grf_mode;
> +
>   	/* Chip-wide methods */
>   	void (*initialize)(struct regmap *grf,
>   			   void __iomem *reg, enum tshut_polarity p);
> @@ -1099,6 +1114,8 @@ static const struct rockchip_tsadc_chip px30_tsadc_data = {
>   	.chn_offset = 0,
>   	.chn_num = 2, /* 2 channels for tsadc */
>   
> +	.grf_mode = GRF_MANDATORY,
> +
>   	.tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
>   	.tshut_temp = 95000,
>   
> @@ -1123,6 +1140,8 @@ static const struct rockchip_tsadc_chip rv1108_tsadc_data = {
>   	.chn_offset = 0,
>   	.chn_num = 1, /* one channel for tsadc */
>   
> +	.grf_mode = GRF_NONE,
> +
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1148,6 +1167,8 @@ static const struct rockchip_tsadc_chip rk3228_tsadc_data = {
>   	.chn_offset = 0,
>   	.chn_num = 1, /* one channel for tsadc */
>   
> +	.grf_mode = GRF_NONE,
> +
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1173,6 +1194,8 @@ static const struct rockchip_tsadc_chip rk3288_tsadc_data = {
>   	.chn_offset = 1,
>   	.chn_num = 2, /* two channels for tsadc */
>   
> +	.grf_mode = GRF_NONE,
> +
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1198,6 +1221,8 @@ static const struct rockchip_tsadc_chip rk3328_tsadc_data = {
>   	.chn_offset = 0,
>   	.chn_num = 1, /* one channels for tsadc */
>   
> +	.grf_mode = GRF_NONE,
> +
>   	.tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
>   	.tshut_temp = 95000,
>   
> @@ -1222,6 +1247,8 @@ static const struct rockchip_tsadc_chip rk3366_tsadc_data = {
>   	.chn_offset = 0,
>   	.chn_num = 2, /* two channels for tsadc */
>   
> +	.grf_mode = GRF_OPTIONAL,
> +
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1247,6 +1274,8 @@ static const struct rockchip_tsadc_chip rk3368_tsadc_data = {
>   	.chn_offset = 0,
>   	.chn_num = 2, /* two channels for tsadc */
>   
> +	.grf_mode = GRF_NONE,
> +
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1272,6 +1301,8 @@ static const struct rockchip_tsadc_chip rk3399_tsadc_data = {
>   	.chn_offset = 0,
>   	.chn_num = 2, /* two channels for tsadc */
>   
> +	.grf_mode = GRF_OPTIONAL,
> +
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1297,6 +1328,8 @@ static const struct rockchip_tsadc_chip rk3568_tsadc_data = {
>   	.chn_offset = 0,
>   	.chn_num = 2, /* two channels for tsadc */
>   
> +	.grf_mode = GRF_OPTIONAL,
> +
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1321,6 +1354,7 @@ static const struct rockchip_tsadc_chip rk3576_tsadc_data = {
>   	/* top, big_core, little_core, ddr, npu, gpu */
>   	.chn_offset = 0,
>   	.chn_num = 6, /* six channels for tsadc */
> +	.grf_mode = GRF_NONE,
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1345,6 +1379,7 @@ static const struct rockchip_tsadc_chip rk3588_tsadc_data = {
>   	/* top, big_core0, big_core1, little_core, center, gpu, npu */
>   	.chn_offset = 0,
>   	.chn_num = 7, /* seven channels for tsadc */
> +	.grf_mode = GRF_NONE,
>   	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
>   	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
>   	.tshut_temp = 95000,
> @@ -1572,7 +1607,7 @@ static int rockchip_configure_from_dt(struct device *dev,
>   				      struct device_node *np,
>   				      struct rockchip_thermal_data *thermal)
>   {
> -	u32 shut_temp, tshut_mode, tshut_polarity;
> +	u32 shut_temp, tshut_mode, tshut_polarity, ret;
>   
>   	if (of_property_read_u32(np, "rockchip,hw-tshut-temp", &shut_temp)) {
>   		dev_warn(dev,
> @@ -1621,12 +1656,16 @@ static int rockchip_configure_from_dt(struct device *dev,
>   		return -EINVAL;
>   	}
>   
> -	/* The tsadc wont to handle the error in here since some SoCs didn't
> -	 * need this property.
> -	 */
> -	thermal->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
> -	if (IS_ERR(thermal->grf))
> -		dev_warn(dev, "Missing rockchip,grf property\n");
> +	if (thermal->chip->grf_mode != GRF_NONE) {
> +		thermal->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
> +		if (IS_ERR(thermal->grf)) {
> +			ret = PTR_ERR(thermal->grf);
> +			if (thermal->chip->grf_mode == GRF_OPTIONAL)
> +				dev_warn(dev, "Missing rockchip,grf property\n");
> +			else
> +				return dev_err_probe(dev, ret, "Missing rockchip,grf property\n");
> +		}
> +	}

Nit: Does the lookup itself need to be made conditional? I think I'd
also agree that the "optional" mode seems suspect, so potentially it
could be a whole lot simpler, e.g.:

	thermal->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
	if (IS_ERR(thermal->grf) && thermal->chip->grf_required)
		return dev_err_probe(dev, PTR_ERR(thermal->grf),
				     "Missing rockchip,grf property\n");

Thanks,
Robin.

>   
>   	rockchip_get_trim_configuration(dev, np, thermal);
>   
> 
> ---
> base-commit: c17b750b3ad9f45f2b6f7e6f7f4679844244f0b9
> change-id: 20250818-thermal-rockchip-grf-warning-05f7f56286a2
> 
> Best regards,


_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip

  parent reply	other threads:[~2025-08-19 12:42 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-18 17:26 [PATCH] thermal: rockchip: shut up GRF warning Sebastian Reichel
2025-08-18 17:26 ` Sebastian Reichel
2025-08-18 18:44 ` Heiko Stübner
2025-08-18 18:44   ` Heiko Stübner
2025-08-18 19:23   ` Sebastian Reichel
2025-08-18 19:23     ` Sebastian Reichel
2025-08-18 19:47     ` Heiko Stübner
2025-08-18 19:47       ` Heiko Stübner
2025-08-19 10:19 ` kernel test robot
2025-08-19 10:19   ` kernel test robot
2025-08-19 12:42 ` Robin Murphy [this message]
2025-08-19 12:42   ` Robin Murphy
2025-08-19 13:56   ` Sebastian Reichel
2025-08-19 13:56     ` Sebastian Reichel
2025-08-19 14:13     ` Heiko Stübner
2025-08-19 14:13       ` Heiko Stübner
2025-08-20 14:23 ` Diederik de Haas
2025-08-20 14:23   ` Diederik de Haas

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=2c7301cd-9c86-47fd-8b79-05f3e1a89e47@arm.com \
    --to=robin.murphy@arm.com \
    --cc=daniel.lezcano@linaro.org \
    --cc=heiko@sntech.de \
    --cc=kernel@collabora.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=lukasz.luba@arm.com \
    --cc=rafael@kernel.org \
    --cc=rui.zhang@intel.com \
    --cc=sebastian.reichel@collabora.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.