All of lore.kernel.org
 help / color / mirror / Atom feed
From: Samuel Holland <samuel@sholland.org>
To: u-boot@lists.denx.de, Jagan Teki <jagan@amarulasolutions.com>,
	Andre Przywara <andre.przywara@arm.com>,
	Lukasz Majewski <lukma@denx.de>,
	Sean Anderson <seanga2@gmail.com>
Cc: Samuel Holland <samuel@sholland.org>,
	Bin Meng <bmeng.cn@gmail.com>,
	Heinrich Schuchardt <xypron.glpk@gmx.de>,
	Maxime Ripard <maxime.ripard@bootlin.com>
Subject: [PATCH 3/7] reset: sunxi: Get the reset count from the CCU descriptor
Date: Mon,  9 May 2022 00:29:33 -0500	[thread overview]
Message-ID: <20220509052937.42283-4-samuel@sholland.org> (raw)
In-Reply-To: <20220509052937.42283-1-samuel@sholland.org>

This allows all of the clock drivers to use a common bind function.

Signed-off-by: Samuel Holland <samuel@sholland.org>
---

 drivers/clk/sunxi/clk_a10.c   |  7 +------
 drivers/clk/sunxi/clk_a10s.c  |  7 +------
 drivers/clk/sunxi/clk_a23.c   |  7 +------
 drivers/clk/sunxi/clk_a31.c   |  7 +------
 drivers/clk/sunxi/clk_a31_r.c |  7 +------
 drivers/clk/sunxi/clk_a64.c   |  7 +------
 drivers/clk/sunxi/clk_a80.c   | 12 +-----------
 drivers/clk/sunxi/clk_a83t.c  |  7 +------
 drivers/clk/sunxi/clk_h3.c    |  7 +------
 drivers/clk/sunxi/clk_h6.c    |  7 +------
 drivers/clk/sunxi/clk_h616.c  |  7 +------
 drivers/clk/sunxi/clk_h6_r.c  |  7 +------
 drivers/clk/sunxi/clk_r40.c   |  7 +------
 drivers/clk/sunxi/clk_sunxi.c |  5 +++++
 drivers/clk/sunxi/clk_v3s.c   |  7 +------
 drivers/reset/reset-sunxi.c   |  6 ++----
 include/clk/sunxi.h           |  9 +++++++--
 17 files changed, 28 insertions(+), 95 deletions(-)

diff --git a/drivers/clk/sunxi/clk_a10.c b/drivers/clk/sunxi/clk_a10.c
index 6b58cffc8a..e5374f6cf0 100644
--- a/drivers/clk/sunxi/clk_a10.c
+++ b/drivers/clk/sunxi/clk_a10.c
@@ -69,11 +69,6 @@ static const struct ccu_desc a10_ccu_desc = {
 	.num_resets = ARRAY_SIZE(a10_resets),
 };
 
-static int a10_clk_bind(struct udevice *dev)
-{
-	return sunxi_reset_bind(dev, ARRAY_SIZE(a10_resets));
-}
-
 static const struct udevice_id a10_ccu_ids[] = {
 	{ .compatible = "allwinner,sun4i-a10-ccu",
 	  .data = (ulong)&a10_ccu_desc },
@@ -89,5 +84,5 @@ U_BOOT_DRIVER(clk_sun4i_a10) = {
 	.priv_auto	= sizeof(struct ccu_priv),
 	.ops		= &sunxi_clk_ops,
 	.probe		= sunxi_clk_probe,
-	.bind		= a10_clk_bind,
+	.bind		= sunxi_clk_bind,
 };
diff --git a/drivers/clk/sunxi/clk_a10s.c b/drivers/clk/sunxi/clk_a10s.c
index 81b146ce1e..07d518c121 100644
--- a/drivers/clk/sunxi/clk_a10s.c
+++ b/drivers/clk/sunxi/clk_a10s.c
@@ -54,11 +54,6 @@ static const struct ccu_desc a10s_ccu_desc = {
 	.num_resets = ARRAY_SIZE(a10s_resets),
 };
 
-static int a10s_clk_bind(struct udevice *dev)
-{
-	return sunxi_reset_bind(dev, ARRAY_SIZE(a10s_resets));
-}
-
 static const struct udevice_id a10s_ccu_ids[] = {
 	{ .compatible = "allwinner,sun5i-a10s-ccu",
 	  .data = (ulong)&a10s_ccu_desc },
@@ -74,5 +69,5 @@ U_BOOT_DRIVER(clk_sun5i_a10s) = {
 	.priv_auto	= sizeof(struct ccu_priv),
 	.ops		= &sunxi_clk_ops,
 	.probe		= sunxi_clk_probe,
-	.bind		= a10s_clk_bind,
+	.bind		= sunxi_clk_bind,
 };
diff --git a/drivers/clk/sunxi/clk_a23.c b/drivers/clk/sunxi/clk_a23.c
index c7c78bc7d8..9c0e5db07c 100644
--- a/drivers/clk/sunxi/clk_a23.c
+++ b/drivers/clk/sunxi/clk_a23.c
@@ -73,11 +73,6 @@ static const struct ccu_desc a23_ccu_desc = {
 	.num_resets = ARRAY_SIZE(a23_resets),
 };
 
-static int a23_clk_bind(struct udevice *dev)
-{
-	return sunxi_reset_bind(dev, ARRAY_SIZE(a23_resets));
-}
-
 static const struct udevice_id a23_clk_ids[] = {
 	{ .compatible = "allwinner,sun8i-a23-ccu",
 	  .data = (ulong)&a23_ccu_desc },
@@ -93,5 +88,5 @@ U_BOOT_DRIVER(clk_sun8i_a23) = {
 	.priv_auto	= sizeof(struct ccu_priv),
 	.ops		= &sunxi_clk_ops,
 	.probe		= sunxi_clk_probe,
-	.bind		= a23_clk_bind,
+	.bind		= sunxi_clk_bind,
 };
diff --git a/drivers/clk/sunxi/clk_a31.c b/drivers/clk/sunxi/clk_a31.c
index c8c7f4ecf5..3d0767e290 100644
--- a/drivers/clk/sunxi/clk_a31.c
+++ b/drivers/clk/sunxi/clk_a31.c
@@ -94,11 +94,6 @@ static const struct ccu_desc a31_ccu_desc = {
 	.num_resets = ARRAY_SIZE(a31_resets),
 };
 
-static int a31_clk_bind(struct udevice *dev)
-{
-	return sunxi_reset_bind(dev, ARRAY_SIZE(a31_resets));
-}
-
 static const struct udevice_id a31_clk_ids[] = {
 	{ .compatible = "allwinner,sun6i-a31-ccu",
 	  .data = (ulong)&a31_ccu_desc },
@@ -112,5 +107,5 @@ U_BOOT_DRIVER(clk_sun6i_a31) = {
 	.priv_auto	= sizeof(struct ccu_priv),
 	.ops		= &sunxi_clk_ops,
 	.probe		= sunxi_clk_probe,
-	.bind		= a31_clk_bind,
+	.bind		= sunxi_clk_bind,
 };
diff --git a/drivers/clk/sunxi/clk_a31_r.c b/drivers/clk/sunxi/clk_a31_r.c
index 7bf1c4578c..04c238204d 100644
--- a/drivers/clk/sunxi/clk_a31_r.c
+++ b/drivers/clk/sunxi/clk_a31_r.c
@@ -35,11 +35,6 @@ static const struct ccu_desc a31_r_ccu_desc = {
 	.num_resets = ARRAY_SIZE(a31_r_resets),
 };
 
-static int a31_r_clk_bind(struct udevice *dev)
-{
-	return sunxi_reset_bind(dev, ARRAY_SIZE(a31_r_resets));
-}
-
 static const struct udevice_id a31_r_clk_ids[] = {
 	{ .compatible = "allwinner,sun8i-a83t-r-ccu",
 	  .data = (ulong)&a31_r_ccu_desc },
@@ -57,5 +52,5 @@ U_BOOT_DRIVER(clk_sun6i_a31_r) = {
 	.priv_auto	= sizeof(struct ccu_priv),
 	.ops		= &sunxi_clk_ops,
 	.probe		= sunxi_clk_probe,
-	.bind		= a31_r_clk_bind,
+	.bind		= sunxi_clk_bind,
 };
diff --git a/drivers/clk/sunxi/clk_a64.c b/drivers/clk/sunxi/clk_a64.c
index 6da861ddc1..b41260cbe6 100644
--- a/drivers/clk/sunxi/clk_a64.c
+++ b/drivers/clk/sunxi/clk_a64.c
@@ -80,11 +80,6 @@ static const struct ccu_desc a64_ccu_desc = {
 	.num_resets = ARRAY_SIZE(a64_resets),
 };
 
-static int a64_clk_bind(struct udevice *dev)
-{
-	return sunxi_reset_bind(dev, ARRAY_SIZE(a64_resets));
-}
-
 static const struct udevice_id a64_ccu_ids[] = {
 	{ .compatible = "allwinner,sun50i-a64-ccu",
 	  .data = (ulong)&a64_ccu_desc },
@@ -98,5 +93,5 @@ U_BOOT_DRIVER(clk_sun50i_a64) = {
 	.priv_auto	= sizeof(struct ccu_priv),
 	.ops		= &sunxi_clk_ops,
 	.probe		= sunxi_clk_probe,
-	.bind		= a64_clk_bind,
+	.bind		= sunxi_clk_bind,
 };
diff --git a/drivers/clk/sunxi/clk_a80.c b/drivers/clk/sunxi/clk_a80.c
index 7025d3cbe6..a3ad3b7804 100644
--- a/drivers/clk/sunxi/clk_a80.c
+++ b/drivers/clk/sunxi/clk_a80.c
@@ -86,16 +86,6 @@ static const struct ccu_desc a80_mmc_clk_desc = {
 	.num_resets = ARRAY_SIZE(a80_mmc_resets),
 };
 
-static int a80_clk_bind(struct udevice *dev)
-{
-	ulong count = ARRAY_SIZE(a80_resets);
-
-	if (device_is_compatible(dev, "allwinner,sun9i-a80-mmc-config-clk"))
-		count = ARRAY_SIZE(a80_mmc_resets);
-
-	return sunxi_reset_bind(dev, count);
-}
-
 static const struct udevice_id a80_ccu_ids[] = {
 	{ .compatible = "allwinner,sun9i-a80-ccu",
 	  .data = (ulong)&a80_ccu_desc },
@@ -111,5 +101,5 @@ U_BOOT_DRIVER(clk_sun9i_a80) = {
 	.priv_auto	= sizeof(struct ccu_priv),
 	.ops		= &sunxi_clk_ops,
 	.probe		= sunxi_clk_probe,
-	.bind		= a80_clk_bind,
+	.bind		= sunxi_clk_bind,
 };
diff --git a/drivers/clk/sunxi/clk_a83t.c b/drivers/clk/sunxi/clk_a83t.c
index c50d253f84..cad5b484cf 100644
--- a/drivers/clk/sunxi/clk_a83t.c
+++ b/drivers/clk/sunxi/clk_a83t.c
@@ -77,11 +77,6 @@ static const struct ccu_desc a83t_ccu_desc = {
 	.num_resets = ARRAY_SIZE(a83t_resets),
 };
 
-static int a83t_clk_bind(struct udevice *dev)
-{
-	return sunxi_reset_bind(dev, ARRAY_SIZE(a83t_resets));
-}
-
 static const struct udevice_id a83t_clk_ids[] = {
 	{ .compatible = "allwinner,sun8i-a83t-ccu",
 	  .data = (ulong)&a83t_ccu_desc },
@@ -95,5 +90,5 @@ U_BOOT_DRIVER(clk_sun8i_a83t) = {
 	.priv_auto	= sizeof(struct ccu_priv),
 	.ops		= &sunxi_clk_ops,
 	.probe		= sunxi_clk_probe,
-	.bind		= a83t_clk_bind,
+	.bind		= sunxi_clk_bind,
 };
diff --git a/drivers/clk/sunxi/clk_h3.c b/drivers/clk/sunxi/clk_h3.c
index 22c2b236a8..3b4e9af111 100644
--- a/drivers/clk/sunxi/clk_h3.c
+++ b/drivers/clk/sunxi/clk_h3.c
@@ -93,11 +93,6 @@ static const struct ccu_desc h3_ccu_desc = {
 	.num_resets = ARRAY_SIZE(h3_resets),
 };
 
-static int h3_clk_bind(struct udevice *dev)
-{
-	return sunxi_reset_bind(dev, ARRAY_SIZE(h3_resets));
-}
-
 static const struct udevice_id h3_ccu_ids[] = {
 	{ .compatible = "allwinner,sun8i-h3-ccu",
 	  .data = (ulong)&h3_ccu_desc },
@@ -113,5 +108,5 @@ U_BOOT_DRIVER(clk_sun8i_h3) = {
 	.priv_auto	= sizeof(struct ccu_priv),
 	.ops		= &sunxi_clk_ops,
 	.probe		= sunxi_clk_probe,
-	.bind		= h3_clk_bind,
+	.bind		= sunxi_clk_bind,
 };
diff --git a/drivers/clk/sunxi/clk_h6.c b/drivers/clk/sunxi/clk_h6.c
index 6521811215..93343b090d 100644
--- a/drivers/clk/sunxi/clk_h6.c
+++ b/drivers/clk/sunxi/clk_h6.c
@@ -94,11 +94,6 @@ static const struct ccu_desc h6_ccu_desc = {
 	.num_resets = ARRAY_SIZE(h6_resets),
 };
 
-static int h6_clk_bind(struct udevice *dev)
-{
-	return sunxi_reset_bind(dev, ARRAY_SIZE(h6_resets));
-}
-
 static const struct udevice_id h6_ccu_ids[] = {
 	{ .compatible = "allwinner,sun50i-h6-ccu",
 	  .data = (ulong)&h6_ccu_desc },
@@ -112,5 +107,5 @@ U_BOOT_DRIVER(clk_sun50i_h6) = {
 	.priv_auto	= sizeof(struct ccu_priv),
 	.ops		= &sunxi_clk_ops,
 	.probe		= sunxi_clk_probe,
-	.bind		= h6_clk_bind,
+	.bind		= sunxi_clk_bind,
 };
diff --git a/drivers/clk/sunxi/clk_h616.c b/drivers/clk/sunxi/clk_h616.c
index 26f74c0fa0..e791736093 100644
--- a/drivers/clk/sunxi/clk_h616.c
+++ b/drivers/clk/sunxi/clk_h616.c
@@ -112,11 +112,6 @@ static const struct ccu_desc h616_ccu_desc = {
 	.num_resets = ARRAY_SIZE(h616_resets),
 };
 
-static int h616_clk_bind(struct udevice *dev)
-{
-	return sunxi_reset_bind(dev, ARRAY_SIZE(h616_resets));
-}
-
 static const struct udevice_id h616_ccu_ids[] = {
 	{ .compatible = "allwinner,sun50i-h616-ccu",
 	  .data = (ulong)&h616_ccu_desc },
@@ -130,5 +125,5 @@ U_BOOT_DRIVER(clk_sun50i_h616) = {
 	.priv_auto	= sizeof(struct ccu_priv),
 	.ops		= &sunxi_clk_ops,
 	.probe		= sunxi_clk_probe,
-	.bind		= h616_clk_bind,
+	.bind		= sunxi_clk_bind,
 };
diff --git a/drivers/clk/sunxi/clk_h6_r.c b/drivers/clk/sunxi/clk_h6_r.c
index fee9604551..0f5cefd687 100644
--- a/drivers/clk/sunxi/clk_h6_r.c
+++ b/drivers/clk/sunxi/clk_h6_r.c
@@ -39,11 +39,6 @@ static const struct ccu_desc h6_r_ccu_desc = {
 	.num_resets = ARRAY_SIZE(h6_r_resets),
 };
 
-static int h6_r_clk_bind(struct udevice *dev)
-{
-	return sunxi_reset_bind(dev, ARRAY_SIZE(h6_r_resets));
-}
-
 static const struct udevice_id h6_r_clk_ids[] = {
 	{ .compatible = "allwinner,sun50i-h6-r-ccu",
 	  .data = (ulong)&h6_r_ccu_desc },
@@ -59,5 +54,5 @@ U_BOOT_DRIVER(clk_sun6i_h6_r) = {
 	.priv_auto	= sizeof(struct ccu_priv),
 	.ops		= &sunxi_clk_ops,
 	.probe		= sunxi_clk_probe,
-	.bind		= h6_r_clk_bind,
+	.bind		= sunxi_clk_bind,
 };
diff --git a/drivers/clk/sunxi/clk_r40.c b/drivers/clk/sunxi/clk_r40.c
index 456a38a159..a59ac06975 100644
--- a/drivers/clk/sunxi/clk_r40.c
+++ b/drivers/clk/sunxi/clk_r40.c
@@ -104,11 +104,6 @@ static const struct ccu_desc r40_ccu_desc = {
 	.num_resets = ARRAY_SIZE(r40_resets),
 };
 
-static int r40_clk_bind(struct udevice *dev)
-{
-	return sunxi_reset_bind(dev, ARRAY_SIZE(r40_resets));
-}
-
 static const struct udevice_id r40_clk_ids[] = {
 	{ .compatible = "allwinner,sun8i-r40-ccu",
 	  .data = (ulong)&r40_ccu_desc },
@@ -122,5 +117,5 @@ U_BOOT_DRIVER(clk_sun8i_r40) = {
 	.priv_auto	= sizeof(struct ccu_priv),
 	.ops		= &sunxi_clk_ops,
 	.probe		= sunxi_clk_probe,
-	.bind		= r40_clk_bind,
+	.bind		= sunxi_clk_bind,
 };
diff --git a/drivers/clk/sunxi/clk_sunxi.c b/drivers/clk/sunxi/clk_sunxi.c
index 3108e5b66d..e1129f6ccf 100644
--- a/drivers/clk/sunxi/clk_sunxi.c
+++ b/drivers/clk/sunxi/clk_sunxi.c
@@ -64,6 +64,11 @@ struct clk_ops sunxi_clk_ops = {
 	.disable = sunxi_clk_disable,
 };
 
+int sunxi_clk_bind(struct udevice *dev)
+{
+	return sunxi_reset_bind(dev);
+}
+
 int sunxi_clk_probe(struct udevice *dev)
 {
 	struct ccu_priv *priv = dev_get_priv(dev);
diff --git a/drivers/clk/sunxi/clk_v3s.c b/drivers/clk/sunxi/clk_v3s.c
index ab21cd791b..c6a17b4535 100644
--- a/drivers/clk/sunxi/clk_v3s.c
+++ b/drivers/clk/sunxi/clk_v3s.c
@@ -54,11 +54,6 @@ static const struct ccu_desc v3s_ccu_desc = {
 	.num_resets = ARRAY_SIZE(v3s_resets),
 };
 
-static int v3s_clk_bind(struct udevice *dev)
-{
-	return sunxi_reset_bind(dev, ARRAY_SIZE(v3s_resets));
-}
-
 static const struct udevice_id v3s_clk_ids[] = {
 	{ .compatible = "allwinner,sun8i-v3s-ccu",
 	  .data = (ulong)&v3s_ccu_desc },
@@ -74,5 +69,5 @@ U_BOOT_DRIVER(clk_sun8i_v3s) = {
 	.priv_auto	= sizeof(struct ccu_priv),
 	.ops		= &sunxi_clk_ops,
 	.probe		= sunxi_clk_probe,
-	.bind		= v3s_clk_bind,
+	.bind		= sunxi_clk_bind,
 };
diff --git a/drivers/reset/reset-sunxi.c b/drivers/reset/reset-sunxi.c
index 8b95938dfe..4d02d02834 100644
--- a/drivers/reset/reset-sunxi.c
+++ b/drivers/reset/reset-sunxi.c
@@ -19,7 +19,6 @@
 
 struct sunxi_reset_priv {
 	void *base;
-	ulong count;
 	const struct ccu_desc *desc;
 };
 
@@ -35,7 +34,7 @@ static int sunxi_reset_request(struct reset_ctl *reset_ctl)
 
 	debug("%s: (RST#%ld)\n", __func__, reset_ctl->id);
 
-	if (reset_ctl->id >= priv->count)
+	if (reset_ctl->id >= priv->desc->num_resets)
 		return -EINVAL;
 
 	return 0;
@@ -99,7 +98,7 @@ static int sunxi_reset_probe(struct udevice *dev)
 	return 0;
 }
 
-int sunxi_reset_bind(struct udevice *dev, ulong count)
+int sunxi_reset_bind(struct udevice *dev)
 {
 	struct udevice *rst_dev;
 	struct sunxi_reset_priv *priv;
@@ -112,7 +111,6 @@ int sunxi_reset_bind(struct udevice *dev, ulong count)
 		return ret;
 	}
 	priv = malloc(sizeof(struct sunxi_reset_priv));
-	priv->count = count;
 	priv->desc = (const struct ccu_desc *)dev_get_driver_data(dev);
 	dev_set_priv(rst_dev, priv);
 
diff --git a/include/clk/sunxi.h b/include/clk/sunxi.h
index 5471b9c831..c798c226f5 100644
--- a/include/clk/sunxi.h
+++ b/include/clk/sunxi.h
@@ -80,6 +80,12 @@ struct ccu_priv {
 	const struct ccu_desc *desc;
 };
 
+/**
+ * sunxi_clk_bind - common sunxi clock bind
+ * @dev:	clock device
+ */
+int sunxi_clk_bind(struct udevice *dev);
+
 /**
  * sunxi_clk_probe - common sunxi clock probe
  * @dev:	clock device
@@ -92,9 +98,8 @@ extern struct clk_ops sunxi_clk_ops;
  * sunxi_reset_bind() - reset binding
  *
  * @dev:       reset device
- * @count:     reset count
  * Return: 0 success, or error value
  */
-int sunxi_reset_bind(struct udevice *dev, ulong count);
+int sunxi_reset_bind(struct udevice *dev);
 
 #endif /* _CLK_SUNXI_H */
-- 
2.35.1


  parent reply	other threads:[~2022-05-09  5:30 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-09  5:29 [PATCH 0/7] clk: sunxi: Out-of-bounds access fix and driver cleanup Samuel Holland
2022-05-09  5:29 ` [PATCH 1/7] clk: sunxi: Store the array sizes in the CCU descriptor Samuel Holland
2022-06-25 17:10   ` Andre Przywara
2022-05-09  5:29 ` [PATCH 2/7] clk: sunxi: Prevent out-of-bounds gate array access Samuel Holland
2022-06-26 10:43   ` Andre Przywara
2022-05-09  5:29 ` Samuel Holland [this message]
2022-06-26 10:51   ` [PATCH 3/7] reset: sunxi: Get the reset count from the CCU descriptor Andre Przywara
2022-05-09  5:29 ` [PATCH 4/7] clk: sunxi: Use a single driver for all variants Samuel Holland
2022-06-27  0:43   ` Andre Przywara
2022-05-09  5:29 ` [PATCH 5/7] clk: sunxi: Convert driver private data to platform data Samuel Holland
2022-06-27 19:34   ` Andre Przywara
2022-05-09  5:29 ` [PATCH 6/7] reset: " Samuel Holland
2022-06-27 19:41   ` Andre Przywara
2022-05-09  5:29 ` [PATCH 7/7] reset: sunxi: Reuse the platform data from the clock driver Samuel Holland
2022-06-27 23:45   ` Andre Przywara
2022-05-10 23:24 ` [PATCH 0/7] clk: sunxi: Out-of-bounds access fix and driver cleanup Andre Przywara
2022-05-11 15:48 ` Sean Anderson
2022-06-28  0:40 ` Andre Przywara
2022-06-28  2:45   ` Samuel Holland

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=20220509052937.42283-4-samuel@sholland.org \
    --to=samuel@sholland.org \
    --cc=andre.przywara@arm.com \
    --cc=bmeng.cn@gmail.com \
    --cc=jagan@amarulasolutions.com \
    --cc=lukma@denx.de \
    --cc=maxime.ripard@bootlin.com \
    --cc=seanga2@gmail.com \
    --cc=u-boot@lists.denx.de \
    --cc=xypron.glpk@gmx.de \
    /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.