All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wang Hongcheng <annie.wang@amd.com>
To: Vinod Koul <vinod.koul@intel.com>,
	Mika Westerberg <mika.westerberg@linux.intel.com>,
	Joerg Roedel <joro@8bytes.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-serial@vger.kernel.org, dmaengine@vger.kernel.org,
	iommu@lists.linux-foundation.org, Borislav Petkov <bp@alien8.de>,
	Huang Rui <ray.huang@amd.com>, Wan Zongshun <vincent.wan@amd.com>,
	Ken Xue <ken.xue@amd.com>, Tony Li <tony.li@amd.com>,
	Wang Hongcheng <annie.wang@amd.com>
Subject: [PATCH 7/9] Serial:8250: New Port Type PORT_AMD_8250
Date: Fri, 4 Dec 2015 11:24:24 +0800	[thread overview]
Message-ID: <1449199466-6081-8-git-send-email-annie.wang@amd.com> (raw)
In-Reply-To: <1449199466-6081-1-git-send-email-annie.wang@amd.com>

Set a new port type for AMD Carrizo.  Add has_pl330_dma to 8250_dw's
private data and init fcr,ier as well as dma rx size.

Signed-off-by: Wang Hongcheng <annie.wang@amd.com>
---
 drivers/acpi/acpi_apd.c             | 10 ++++++++++
 drivers/tty/serial/8250/8250_dw.c   | 16 ++++++++++++++++
 drivers/tty/serial/8250/8250_port.c |  9 +++++++++
 include/linux/serial_8250.h         |  4 ++++
 include/uapi/linux/serial_core.h    |  3 ++-
 include/uapi/linux/serial_reg.h     |  2 ++
 6 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/drivers/acpi/acpi_apd.c b/drivers/acpi/acpi_apd.c
index 906a20f..787f477 100644
--- a/drivers/acpi/acpi_apd.c
+++ b/drivers/acpi/acpi_apd.c
@@ -23,6 +23,7 @@
 #include <linux/sizes.h>
 #include <linux/amba/pl330.h>
 #include <linux/interrupt.h>
+#include <linux/serial_8250.h>
 
 #include "internal.h"
 
@@ -49,6 +50,10 @@ static struct dma_pl330_platdata amd_pl330 = {
 	.acpi_xlate_filter = apd_acpi_xlate_filter,
 };
 
+static struct plat_dw8250_data amd_dw8250 = {
+	.has_pl330_dma = 1,
+};
+
 /**
  * struct apd_device_desc - a descriptor for apd device.
  * @flags: device flags like %ACPI_APD_SYSFS, %ACPI_APD_PM;
@@ -164,6 +169,11 @@ static int acpi_apd_create_device(struct acpi_device *adev,
 		goto err_out;
 
 	if (!strncmp(pdev->name, "AMD0020", 7)) {
+		ret = platform_device_add_data(pdev, &amd_dw8250,
+					       sizeof(amd_dw8250));
+		if (ret)
+			goto err_out;
+
 		memset(&amba_quirks, 0, sizeof(amba_quirks));
 		setup_quirks(pdev, &amba_quirks);
 
diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c
index a5d319e..a5ae9b6 100644
--- a/drivers/tty/serial/8250/8250_dw.c
+++ b/drivers/tty/serial/8250/8250_dw.c
@@ -66,6 +66,8 @@ struct dw8250_data {
 
 	unsigned int		skip_autocfg:1;
 	unsigned int		uart_16550_compatible:1;
+
+	unsigned		has_pl330_dma:1;
 };
 
 #define BYT_PRV_CLK			0x800
@@ -304,6 +306,7 @@ static void dw8250_setup_port(struct uart_port *p)
 {
 	struct uart_8250_port *up = up_to_u8250p(p);
 	u32 reg;
+	struct dw8250_data *d = p->private_data;
 
 	/*
 	 * If the Component Version Register returns zero, we know that
@@ -326,6 +329,16 @@ static void dw8250_setup_port(struct uart_port *p)
 		p->flags |= UPF_FIXED_TYPE;
 		p->fifosize = DW_UART_CPR_FIFO_SIZE(reg);
 		up->capabilities = UART_CAP_FIFO;
+		if (d->has_pl330_dma) {
+			p->type = PORT_AMD_8250;
+			p->flags |= UPF_SHARE_IRQ;
+
+			up->ier |= UART_IER_PTIME | UART_IER_THRI |
+				UART_IER_RLSI | UART_IER_RDI;
+			up->fcr |= UART_FCR_R_TRIG_10 | UART_FCR_T_TRIG_11 |
+				UART_FCR_DMA_SELECT;
+			up->tx_loadsz = p->fifosize / 2;
+		}
 	}
 
 	if (reg & DW_UART_CPR_AFCE_MODE)
@@ -339,6 +352,7 @@ static int dw8250_probe(struct platform_device *pdev)
 	int irq = platform_get_irq(pdev, 0);
 	struct uart_port *p = &uart.port;
 	struct dw8250_data *data;
+	struct plat_dw8250_data *pdata = dev_get_platdata(&pdev->dev);
 	int err;
 	u32 val;
 
@@ -468,6 +482,7 @@ static int dw8250_probe(struct platform_device *pdev)
 		p->handle_irq = NULL;
 	}
 
+	data->has_pl330_dma = pdata ? pdata->has_pl330_dma : 0;
 	if (!data->skip_autocfg)
 		dw8250_setup_port(p);
 
@@ -475,6 +490,7 @@ static int dw8250_probe(struct platform_device *pdev)
 	if (p->fifosize) {
 		data->dma.rxconf.src_maxburst = p->fifosize / 4;
 		data->dma.txconf.dst_maxburst = p->fifosize / 4;
+		data->dma.rx_size = data->has_pl330_dma ? (p->fifosize / 2 + 2) : 0;
 		uart.dma = &data->dma;
 	}
 
diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
index 52d82d2..b258edc 100644
--- a/drivers/tty/serial/8250/8250_port.c
+++ b/drivers/tty/serial/8250/8250_port.c
@@ -269,6 +269,15 @@ configured less than Maximum supported fifo bytes */
 		.rxtrig_bytes	= {1, 4, 8, 14},
 		.flags		= UART_CAP_FIFO,
 	},
+	[PORT_AMD_8250] = {
+		.name		= "AMD_8250",
+		.fifo_size	= 256,
+		.tx_loadsz	= 128,
+		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
+				UART_FCR_T_TRIG_11 | UART_FCR_DMA_SELECT,
+		.rxtrig_bytes	= {1, 4, 8},
+		.flags		= UART_CAP_FIFO,
+	},
 };
 
 /* Uart divisor latch read */
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h
index faa0e03..4652783 100644
--- a/include/linux/serial_8250.h
+++ b/include/linux/serial_8250.h
@@ -42,6 +42,10 @@ struct plat_serial8250_port {
 	void		(*handle_break)(struct uart_port *);
 };
 
+struct plat_dw8250_data {
+	unsigned has_pl330_dma:1;
+};
+
 /*
  * Allocate 8250 platform device IDs.  Nothing is implied by
  * the numbering here, except for the legacy entry being -1.
diff --git a/include/uapi/linux/serial_core.h b/include/uapi/linux/serial_core.h
index 93ba148..6a06651 100644
--- a/include/uapi/linux/serial_core.h
+++ b/include/uapi/linux/serial_core.h
@@ -56,7 +56,8 @@
 #define PORT_ALTR_16550_F128 28 /* Altera 16550 UART with 128 FIFOs */
 #define PORT_RT2880	29	/* Ralink RT2880 internal UART */
 #define PORT_16550A_FSL64 30	/* Freescale 16550 UART with 64 FIFOs */
-#define PORT_MAX_8250	30	/* max port ID */
+#define PORT_AMD_8250  31
+#define PORT_MAX_8250	32	/* max port ID */
 
 /*
  * ARM specific type numbers.  These are not currently guaranteed
diff --git a/include/uapi/linux/serial_reg.h b/include/uapi/linux/serial_reg.h
index 1e5ac4e7..13e8294 100644
--- a/include/uapi/linux/serial_reg.h
+++ b/include/uapi/linux/serial_reg.h
@@ -25,6 +25,8 @@
 #define UART_IER_RLSI		0x04 /* Enable receiver line status interrupt */
 #define UART_IER_THRI		0x02 /* Enable Transmitter holding register int. */
 #define UART_IER_RDI		0x01 /* Enable receiver data interrupt */
+/* Enable Programmable Transmitter holding register int. */
+#define UART_IER_PTIME          0x80
 /*
  * Sleep mode for ST16650 and TI16750.  For the ST16650, EFR[4]=1
  */
-- 
1.9.1


WARNING: multiple messages have this Message-ID (diff)
From: Wang Hongcheng <annie.wang@amd.com>
To: Vinod Koul <vinod.koul@intel.com>,
	Mika Westerberg <mika.westerberg@linux.intel.com>,
	Joerg Roedel <joro@8bytes.org>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: <linux-acpi@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<linux-serial@vger.kernel.org>, <dmaengine@vger.kernel.org>,
	<iommu@lists.linux-foundation.org>,
	Borislav Petkov <bp@alien8.de>, Huang Rui <ray.huang@amd.com>,
	Wan Zongshun <vincent.wan@amd.com>, Ken Xue <ken.xue@amd.com>,
	Tony Li <tony.li@amd.com>, Wang Hongcheng <annie.wang@amd.com>
Subject: [PATCH 7/9] Serial:8250: New Port Type PORT_AMD_8250
Date: Fri, 4 Dec 2015 11:24:24 +0800	[thread overview]
Message-ID: <1449199466-6081-8-git-send-email-annie.wang@amd.com> (raw)
In-Reply-To: <1449199466-6081-1-git-send-email-annie.wang@amd.com>

Set a new port type for AMD Carrizo.  Add has_pl330_dma to 8250_dw's
private data and init fcr,ier as well as dma rx size.

Signed-off-by: Wang Hongcheng <annie.wang@amd.com>
---
 drivers/acpi/acpi_apd.c             | 10 ++++++++++
 drivers/tty/serial/8250/8250_dw.c   | 16 ++++++++++++++++
 drivers/tty/serial/8250/8250_port.c |  9 +++++++++
 include/linux/serial_8250.h         |  4 ++++
 include/uapi/linux/serial_core.h    |  3 ++-
 include/uapi/linux/serial_reg.h     |  2 ++
 6 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/drivers/acpi/acpi_apd.c b/drivers/acpi/acpi_apd.c
index 906a20f..787f477 100644
--- a/drivers/acpi/acpi_apd.c
+++ b/drivers/acpi/acpi_apd.c
@@ -23,6 +23,7 @@
 #include <linux/sizes.h>
 #include <linux/amba/pl330.h>
 #include <linux/interrupt.h>
+#include <linux/serial_8250.h>
 
 #include "internal.h"
 
@@ -49,6 +50,10 @@ static struct dma_pl330_platdata amd_pl330 = {
 	.acpi_xlate_filter = apd_acpi_xlate_filter,
 };
 
+static struct plat_dw8250_data amd_dw8250 = {
+	.has_pl330_dma = 1,
+};
+
 /**
  * struct apd_device_desc - a descriptor for apd device.
  * @flags: device flags like %ACPI_APD_SYSFS, %ACPI_APD_PM;
@@ -164,6 +169,11 @@ static int acpi_apd_create_device(struct acpi_device *adev,
 		goto err_out;
 
 	if (!strncmp(pdev->name, "AMD0020", 7)) {
+		ret = platform_device_add_data(pdev, &amd_dw8250,
+					       sizeof(amd_dw8250));
+		if (ret)
+			goto err_out;
+
 		memset(&amba_quirks, 0, sizeof(amba_quirks));
 		setup_quirks(pdev, &amba_quirks);
 
diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c
index a5d319e..a5ae9b6 100644
--- a/drivers/tty/serial/8250/8250_dw.c
+++ b/drivers/tty/serial/8250/8250_dw.c
@@ -66,6 +66,8 @@ struct dw8250_data {
 
 	unsigned int		skip_autocfg:1;
 	unsigned int		uart_16550_compatible:1;
+
+	unsigned		has_pl330_dma:1;
 };
 
 #define BYT_PRV_CLK			0x800
@@ -304,6 +306,7 @@ static void dw8250_setup_port(struct uart_port *p)
 {
 	struct uart_8250_port *up = up_to_u8250p(p);
 	u32 reg;
+	struct dw8250_data *d = p->private_data;
 
 	/*
 	 * If the Component Version Register returns zero, we know that
@@ -326,6 +329,16 @@ static void dw8250_setup_port(struct uart_port *p)
 		p->flags |= UPF_FIXED_TYPE;
 		p->fifosize = DW_UART_CPR_FIFO_SIZE(reg);
 		up->capabilities = UART_CAP_FIFO;
+		if (d->has_pl330_dma) {
+			p->type = PORT_AMD_8250;
+			p->flags |= UPF_SHARE_IRQ;
+
+			up->ier |= UART_IER_PTIME | UART_IER_THRI |
+				UART_IER_RLSI | UART_IER_RDI;
+			up->fcr |= UART_FCR_R_TRIG_10 | UART_FCR_T_TRIG_11 |
+				UART_FCR_DMA_SELECT;
+			up->tx_loadsz = p->fifosize / 2;
+		}
 	}
 
 	if (reg & DW_UART_CPR_AFCE_MODE)
@@ -339,6 +352,7 @@ static int dw8250_probe(struct platform_device *pdev)
 	int irq = platform_get_irq(pdev, 0);
 	struct uart_port *p = &uart.port;
 	struct dw8250_data *data;
+	struct plat_dw8250_data *pdata = dev_get_platdata(&pdev->dev);
 	int err;
 	u32 val;
 
@@ -468,6 +482,7 @@ static int dw8250_probe(struct platform_device *pdev)
 		p->handle_irq = NULL;
 	}
 
+	data->has_pl330_dma = pdata ? pdata->has_pl330_dma : 0;
 	if (!data->skip_autocfg)
 		dw8250_setup_port(p);
 
@@ -475,6 +490,7 @@ static int dw8250_probe(struct platform_device *pdev)
 	if (p->fifosize) {
 		data->dma.rxconf.src_maxburst = p->fifosize / 4;
 		data->dma.txconf.dst_maxburst = p->fifosize / 4;
+		data->dma.rx_size = data->has_pl330_dma ? (p->fifosize / 2 + 2) : 0;
 		uart.dma = &data->dma;
 	}
 
diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
index 52d82d2..b258edc 100644
--- a/drivers/tty/serial/8250/8250_port.c
+++ b/drivers/tty/serial/8250/8250_port.c
@@ -269,6 +269,15 @@ configured less than Maximum supported fifo bytes */
 		.rxtrig_bytes	= {1, 4, 8, 14},
 		.flags		= UART_CAP_FIFO,
 	},
+	[PORT_AMD_8250] = {
+		.name		= "AMD_8250",
+		.fifo_size	= 256,
+		.tx_loadsz	= 128,
+		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
+				UART_FCR_T_TRIG_11 | UART_FCR_DMA_SELECT,
+		.rxtrig_bytes	= {1, 4, 8},
+		.flags		= UART_CAP_FIFO,
+	},
 };
 
 /* Uart divisor latch read */
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h
index faa0e03..4652783 100644
--- a/include/linux/serial_8250.h
+++ b/include/linux/serial_8250.h
@@ -42,6 +42,10 @@ struct plat_serial8250_port {
 	void		(*handle_break)(struct uart_port *);
 };
 
+struct plat_dw8250_data {
+	unsigned has_pl330_dma:1;
+};
+
 /*
  * Allocate 8250 platform device IDs.  Nothing is implied by
  * the numbering here, except for the legacy entry being -1.
diff --git a/include/uapi/linux/serial_core.h b/include/uapi/linux/serial_core.h
index 93ba148..6a06651 100644
--- a/include/uapi/linux/serial_core.h
+++ b/include/uapi/linux/serial_core.h
@@ -56,7 +56,8 @@
 #define PORT_ALTR_16550_F128 28 /* Altera 16550 UART with 128 FIFOs */
 #define PORT_RT2880	29	/* Ralink RT2880 internal UART */
 #define PORT_16550A_FSL64 30	/* Freescale 16550 UART with 64 FIFOs */
-#define PORT_MAX_8250	30	/* max port ID */
+#define PORT_AMD_8250  31
+#define PORT_MAX_8250	32	/* max port ID */
 
 /*
  * ARM specific type numbers.  These are not currently guaranteed
diff --git a/include/uapi/linux/serial_reg.h b/include/uapi/linux/serial_reg.h
index 1e5ac4e7..13e8294 100644
--- a/include/uapi/linux/serial_reg.h
+++ b/include/uapi/linux/serial_reg.h
@@ -25,6 +25,8 @@
 #define UART_IER_RLSI		0x04 /* Enable receiver line status interrupt */
 #define UART_IER_THRI		0x02 /* Enable Transmitter holding register int. */
 #define UART_IER_RDI		0x01 /* Enable receiver data interrupt */
+/* Enable Programmable Transmitter holding register int. */
+#define UART_IER_PTIME          0x80
 /*
  * Sleep mode for ST16650 and TI16750.  For the ST16650, EFR[4]=1
  */
-- 
1.9.1


  parent reply	other threads:[~2015-12-04  3:41 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-04  3:24 [PATCH 0/9] 8250: AMD Carrizo UART PL300 DMA enablement Wang Hongcheng
2015-12-04  3:24 ` Wang Hongcheng
2015-12-04  3:24 ` [PATCH 1/9] ACPI: Add support for AMBA bus type Wang Hongcheng
2015-12-04  3:24   ` Wang Hongcheng
2015-12-04  8:50   ` Mika Westerberg
2015-12-04  9:17     ` Huang Rui
2015-12-04  9:17       ` Huang Rui
2015-12-04  9:42       ` Hanjun Guo
2015-12-04  9:42         ` Hanjun Guo
2015-12-04  9:59         ` G Gregory
2015-12-04 10:20           ` Huang Rui
2015-12-04 10:20             ` Huang Rui
2015-12-04 10:23             ` G Gregory
2015-12-04  3:24 ` [PATCH 2/9] 8250/Kconfig: add config option CONFIG_SERIAL_8250_AMD Wang Hongcheng
2015-12-04  3:24   ` Wang Hongcheng
2015-12-04 11:11   ` Borislav Petkov
2015-12-04  3:24 ` [PATCH 3/9] ACPI: add struct acpi_amba_quirk for AMD pl330 specific device config Wang Hongcheng
2015-12-04  3:24   ` Wang Hongcheng
     [not found]   ` <1449199466-6081-4-git-send-email-annie.wang-5C7GfCeVMHo@public.gmane.org>
2015-12-04 12:56     ` kbuild test robot
2015-12-04 12:56       ` kbuild test robot
2015-12-04 13:16   ` Graeme Gregory
2015-12-11  6:57     ` Wang, Annie
     [not found]       ` <BLUPR12MB04339648B98F07977B6FA61F81EA0-7LeqcoF/hwrdEWIfrEWxYwdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2015-12-11  9:31         ` Vinod Koul
2015-12-11  9:31           ` Vinod Koul
2015-12-04  3:24 ` [PATCH 4/9] dmaengine: pl330: add new items for pl330 private data Wang Hongcheng
2015-12-04  3:24   ` Wang Hongcheng
2015-12-10  4:09   ` Vinod Koul
2015-12-10  6:38     ` Wang, Annie
     [not found]       ` <BLUPR12MB0433B81BB0AEB2D84505B55881E90-7LeqcoF/hwrdEWIfrEWxYwdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2015-12-11  9:29         ` Vinod Koul
2015-12-11  9:29           ` Vinod Koul
2015-12-11 13:56           ` Andy Shevchenko
2015-12-04  3:24 ` [PATCH 5/9] dmaengine: pl330: provide ACPI dmaengine interface Wang Hongcheng
2015-12-04  3:24   ` Wang Hongcheng
     [not found]   ` <1449199466-6081-6-git-send-email-annie.wang-5C7GfCeVMHo@public.gmane.org>
2015-12-13  2:21     ` Andy Shevchenko
2015-12-13  2:21       ` Andy Shevchenko
2015-12-04  3:24 ` [PATCH 6/9] dmaengine:pl330: set segment_boundary_mask = 0cffffffff Wang Hongcheng
2015-12-04  3:24   ` Wang Hongcheng
2015-12-04 14:59   ` Robin Murphy
2015-12-04  3:24 ` Wang Hongcheng [this message]
2015-12-04  3:24   ` [PATCH 7/9] Serial:8250: New Port Type PORT_AMD_8250 Wang Hongcheng
     [not found]   ` <1449199466-6081-8-git-send-email-annie.wang-5C7GfCeVMHo@public.gmane.org>
2015-12-13  2:30     ` Andy Shevchenko
2015-12-13  2:30       ` Andy Shevchenko
2015-12-04  3:24 ` [PATCH 8/9] Documentation: Add ivrs_acpihid kernel parameter description Wang Hongcheng
2015-12-04  3:24   ` Wang Hongcheng
     [not found]   ` <1449199466-6081-9-git-send-email-annie.wang-5C7GfCeVMHo@public.gmane.org>
2015-12-04 12:21     ` Borislav Petkov
2015-12-04 12:21       ` Borislav Petkov
2015-12-04 13:19       ` Wan, Vincent
2015-12-04 13:19         ` Wan, Vincent
2015-12-04 14:38         ` Borislav Petkov
2015-12-04  3:24 ` [PATCH 9/9] iommu/amd: Add ACPI HID named devices IOMMU driver support Wang Hongcheng
2015-12-04  3:24   ` Wang Hongcheng
2015-12-13  2:32 ` [PATCH 0/9] 8250: AMD Carrizo UART PL300 DMA enablement Andy Shevchenko

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=1449199466-6081-8-git-send-email-annie.wang@amd.com \
    --to=annie.wang@amd.com \
    --cc=bp@alien8.de \
    --cc=dmaengine@vger.kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=iommu@lists.linux-foundation.org \
    --cc=joro@8bytes.org \
    --cc=ken.xue@amd.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-serial@vger.kernel.org \
    --cc=mika.westerberg@linux.intel.com \
    --cc=ray.huang@amd.com \
    --cc=rjw@rjwysocki.net \
    --cc=tony.li@amd.com \
    --cc=vincent.wan@amd.com \
    --cc=vinod.koul@intel.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.