From: Marek Vasut <marek.vasut@mailbox.org>
To: Koichiro Den <den@valinux.co.jp>,
Manivannan Sadhasivam <mani@kernel.org>,
Bjorn Helgaas <bhelgaas@google.com>
Cc: "Philipp Zabel" <p.zabel@pengutronix.de>,
"Frank Li" <Frank.Li@nxp.com>,
"Niklas Cassel" <cassel@kernel.org>,
"Wilfred Mallawa" <wilfred.mallawa@wdc.com>,
"Serge Semin" <fancer.lancer@gmail.com>,
linux-pci@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
"Geert Uytterhoeven" <geert+renesas@glider.be>,
"Yoshihiro Shimoda" <yoshihiro.shimoda.uh@renesas.com>,
"Shawn Lin" <Shawn.lin@rock-chips.com>,
"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
"Krzysztof Wilczyński" <kwilczynski@kernel.org>,
"Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Magnus Damm" <magnus.damm@gmail.com>,
"Jingoo Han" <jingoohan1@gmail.com>
Subject: Re: [PATCH v5 13/17] PCI: rcar-gen4: Route Root Port AER to a virtual Root Port IRQ
Date: Wed, 21 Oct 2026 02:19:46 +0200 [thread overview]
Message-ID: <33e7f153-9dde-4bf7-8ab4-d128b256239a@mailbox.org> (raw)
In-Reply-To: <20261020031049.969895-14-den@valinux.co.jp>
On 10/20/26 5:10 AM, Koichiro Den wrote:
> On R-Car Gen4 SoCs, the APP block exposes the Root Port interrupt
> signals in PCIEINTSTS0 and routes them to platform IRQs: AER to
> intreq_pcim_lperr, and PME and bandwidth notifications to
> intreq_pcim_sub. On an R-Car S4 with GIC ITS, a link retrain set
> LnkSta.LBMS and latched PCIEINTSTS0[23] (cfg_bw_mgt_msi), but the Root
> Port's MSI never fired while endpoint MSIs worked fine. With iMSI-RX the
> Root Port MSI capabilities are already hidden, but its INTx maps to
> intreq_pcim_sub. Note that even before this driver took over the IRQ
> with rcar_gen4_pcie_msi_irq_handler, the port service was unable to
> request it, as the DWC core used that IRQ for its chained MSI handler.
> In either case, iMSI-RX or an external MSI controller, Root Port
> interrupts are not delivered to the port services.
>
> Hide the Root Port MSI/MSI-X capabilities so the port services use
> INTx regardless of the MSI controller. Do this in the R-Car host setup,
> which also runs on reset and resume. Use a virtual IRQ to deliver
> notifications from separate platform IRQs to the standard handlers.
> Route AER from the optional "aer" interrupt. DTs without it remain
> supported, but Root Port AER stays unavailable.
>
> The APP block may still receive MSI-form notifications because hiding
> the Root Port's MSI capabilities does not clear MSICAP0.MSIE. Handle
> these alongside the INTx-form level signals. Clear the MSI-form latch
> before the AER handler clears Root Error Status, so a late APP clear
> does not erase a new notification.
>
> Check for reset requests before dispatch: on S4, DBI accesses from
> the port services can hang the host immediately after link down.
>
> The next patch also feeds PME and bandwidth notifications from "msi"
> into this IRQ, so both parents may dispatch concurrently.
> handle_level_irq() calls irq_ack() before checking whether it can run
> the handlers. Keep the APP latches set while the IRQ is in progress or
> disabled, so the level parents can retry through the reset checks.
> This avoids losing notifications without a raw lock around port
> services that take regular spinlocks.
>
> Signed-off-by: Koichiro Den <den@valinux.co.jp>
> ---
> Changes since v4:
> - Hide the Root Port MSI/MSI-X capabilities in host_setup() instead of
> adding a no_rp_msi flag to the DWC core. (Shawn)
> https://lore.kernel.org/r/bi3rvyqpdu4iq6pfyrqvx7eplyim6gmg2ijal67mpateobmtlq@gec7zewfm76r/
> I did not carry Marek's Reviewed-by tag over due to the change.
Bjorn/Manivannan, can you please have a look at this patch and the MSI
handling, to be sure this is OK ?
(no further comments from me below this point)
Thank you !
> drivers/pci/controller/dwc/pcie-rcar-gen4.c | 213 +++++++++++++++++++-
> 1 file changed, 210 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/pci/controller/dwc/pcie-rcar-gen4.c b/drivers/pci/controller/dwc/pcie-rcar-gen4.c
> index 50d4b74e63b0..b0440f2c5329 100644
> --- a/drivers/pci/controller/dwc/pcie-rcar-gen4.c
> +++ b/drivers/pci/controller/dwc/pcie-rcar-gen4.c
> @@ -14,10 +14,12 @@
> #include <linux/io.h>
> #include <linux/iopoll.h>
> #include <linux/irqchip/arm-gic-v3.h>
> +#include <linux/irqdomain.h>
> #include <linux/module.h>
> #include <linux/of.h>
> #include <linux/of_address.h>
> #include <linux/of_irq.h>
> +#include <linux/of_pci.h>
> #include <linux/pci.h>
> #include <linux/phy/phy.h>
> #include <linux/platform_device.h>
> @@ -59,6 +61,11 @@
> #define SMLH_LINK_UP BIT(7)
> #define RDLH_LINK_UP BIT(6)
>
> +/* Root Port notifications routed to intreq_pcim_lperr ("aer") */
> +#define AER_RC_ERR_MSI BIT(29)
> +#define AER_RC_ERR_INT BIT(27)
> +#define RP_AER_MASK (AER_RC_ERR_MSI | AER_RC_ERR_INT)
> +
> /* PCIe DMA Interrupt Status Enable */
> #define PCIEDMAINTSTSEN 0x0314
> #define PCIEDMAINTSTSEN_INIT GENMASK(15, 0)
> @@ -68,6 +75,7 @@
>
> /* PCIe Interrupt Status 0 Clear */
> #define PCIEINTSTS0CLR 0x0340
> +#define RP_LATCHED_MASK AER_RC_ERR_MSI
>
> /* Port Logic Registers 89 */
> #define PRTLGC89 0x0b70
> @@ -133,6 +141,12 @@ struct rcar_gen4_pcie {
> struct work_struct link_down_work;
> /* Allow Root Port event handling after enumeration and until teardown. */
> bool rp_events_armed;
> + /* Virtual Root Port INTx shared by the port services */
> + struct irq_domain *rp_irq_domain;
> + unsigned int rp_irq;
> + bool rp_irq_enabled;
> + /* intreq_pcim_lperr ("aer"): Root Port AER notifications, optional */
> + int aer_irq;
> /*
> * The controller needs reinitializing; the APP interrupt sources
> * stay masked until a reset succeeds.
> @@ -565,7 +579,7 @@ static void rcar_gen4_pcie_app_irq_sync_locked(struct rcar_gen4_pcie *rcar)
> lockdep_assert_held(&rcar->app_lock);
>
> val = readl(rcar->base + PCIEINTSTS0EN);
> - val &= ~MSI_CTRL_INT;
> + val &= ~(MSI_CTRL_INT | RP_AER_MASK);
> /*
> * Note that rcar->rp_events_armed is not checked here because device
> * removal may still need iMSI-RX interrupts after Root Port events have
> @@ -573,6 +587,8 @@ static void rcar_gen4_pcie_app_irq_sync_locked(struct rcar_gen4_pcie *rcar)
> */
> if (!rcar->reinit_pending && pp->use_imsi_rx && pci_msi_enabled())
> val |= MSI_CTRL_INT;
> + if (rp_events && rcar->rp_irq_enabled && rcar->aer_irq > 0)
> + val |= RP_AER_MASK;
> writel(val, rcar->base + PCIEINTSTS0EN);
>
> val = readl(rcar->base + PCIERSTSTSEN);
> @@ -675,6 +691,15 @@ static bool rcar_gen4_pcie_handle_link_down(struct rcar_gen4_pcie *rcar)
> return rcar->reinit_pending;
> }
>
> +static void rcar_gen4_pcie_rp_irq_dispatch(struct rcar_gen4_pcie *rcar)
> +{
> + /* Recheck reset requests after the parent's status read. */
> + if (rcar_gen4_pcie_handle_link_down(rcar))
> + return;
> +
> + generic_handle_domain_irq(rcar->rp_irq_domain, 0);
> +}
> +
> static void rcar_gen4_pcie_link_down_work(struct work_struct *work)
> {
> struct rcar_gen4_pcie *rcar =
> @@ -769,6 +794,162 @@ static void rcar_gen4_pcie_rp_events_disarm(struct rcar_gen4_pcie *rcar)
> cancel_work_sync(&rcar->link_down_work);
> }
>
> +static void rcar_gen4_pcie_rp_irq_mask(struct irq_data *d)
> +{
> + struct rcar_gen4_pcie *rcar = irq_data_get_irq_chip_data(d);
> +
> + guard(raw_spinlock_irqsave)(&rcar->app_lock);
> + rcar->rp_irq_enabled = false;
> + rcar_gen4_pcie_app_irq_sync_locked(rcar);
> +}
> +
> +static void rcar_gen4_pcie_rp_irq_unmask(struct irq_data *d)
> +{
> + struct rcar_gen4_pcie *rcar = irq_data_get_irq_chip_data(d);
> +
> + guard(raw_spinlock_irqsave)(&rcar->app_lock);
> + rcar->rp_irq_enabled = true;
> + rcar_gen4_pcie_app_irq_sync_locked(rcar);
> +}
> +
> +static void rcar_gen4_pcie_rp_irq_ack(struct irq_data *d)
> +{
> + struct rcar_gen4_pcie *rcar = irq_data_get_irq_chip_data(d);
> +
> + /*
> + * handle_level_irq() may skip the handlers after calling irq_ack().
> + * Keep notifications latched if the IRQ is disabled or in progress,
> + * so they raise a parent IRQ again after unmasking. The descriptor
> + * lock serializes this check with IRQD_IRQ_INPROGRESS.
> + */
> + if (irqd_irq_disabled(d) || irqd_irq_inprogress(d))
> + return;
> +
> + /* Clear APP latches before the service clears Root Error Status. */
> + writel(RP_LATCHED_MASK, rcar->base + PCIEINTSTS0CLR);
> +}
> +
> +static const struct irq_chip rcar_gen4_pcie_rp_irq_chip = {
> + .name = "rcar-gen4-rp",
> + .irq_mask = rcar_gen4_pcie_rp_irq_mask,
> + .irq_unmask = rcar_gen4_pcie_rp_irq_unmask,
> + .irq_ack = rcar_gen4_pcie_rp_irq_ack,
> +};
> +
> +static int rcar_gen4_pcie_rp_irq_map(struct irq_domain *domain,
> + unsigned int irq, irq_hw_number_t hwirq)
> +{
> + irq_set_chip_and_handler(irq, &rcar_gen4_pcie_rp_irq_chip,
> + handle_level_irq);
> + irq_set_chip_data(irq, domain->host_data);
> + irq_set_status_flags(irq, IRQ_LEVEL);
> + irq_set_noprobe(irq);
> +
> + return 0;
> +}
> +
> +static const struct irq_domain_ops rcar_gen4_pcie_rp_irq_domain_ops = {
> + .map = rcar_gen4_pcie_rp_irq_map,
> +};
> +
> +static irqreturn_t rcar_gen4_pcie_aer_irq_handler(int irq, void *data)
> +{
> + struct rcar_gen4_pcie *rcar = data;
> + u32 status;
> +
> + /* The line also fires on link down; reset requests come first. */
> + if (rcar_gen4_pcie_handle_link_down(rcar))
> + return IRQ_HANDLED;
> +
> + status = readl(rcar->base + PCIEINTSTS0) &
> + readl(rcar->base + PCIEINTSTS0EN);
> + if (!(status & RP_AER_MASK))
> + return IRQ_NONE;
> +
> + rcar_gen4_pcie_rp_irq_dispatch(rcar);
> +
> + return IRQ_HANDLED;
> +}
> +
> +static int rcar_gen4_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
> +{
> + struct pci_host_bridge *bridge = pci_find_host_bridge(dev->bus);
> + struct rcar_gen4_pcie *rcar = dev_get_drvdata(bridge->dev.parent);
> +
> + /* Downstream devices use standard OF INTx mapping */
> + if (!pci_is_root_bus(dev->bus))
> + return of_irq_parse_and_map_pci(dev, slot, pin);
> +
> + /* Root Port uses the virtual IRQ (always INTA) */
> + return rcar->rp_irq;
> +}
> +
> +static int rcar_gen4_pcie_rp_irq_init(struct rcar_gen4_pcie *rcar)
> +{
> + struct device *dev = rcar->dw.dev;
> + struct fwnode_handle *fwnode;
> + int irq, ret;
> +
> + irq = platform_get_irq_byname_optional(rcar->pdev, "aer");
> + if (irq == -ENXIO)
> + irq = 0; /* old DT: Root Port AER stays unavailable */
> + else if (irq < 0)
> + return dev_err_probe(dev, irq, "Failed to get AER IRQ\n");
> +
> + fwnode = irq_domain_alloc_named_fwnode(dev_name(dev));
> + if (!fwnode)
> + return -ENOMEM;
> +
> + rcar->rp_irq_domain = irq_domain_create_linear(fwnode, 1,
> + &rcar_gen4_pcie_rp_irq_domain_ops,
> + rcar);
> + if (!rcar->rp_irq_domain) {
> + ret = -ENOMEM;
> + goto err_free_fwnode;
> + }
> +
> + rcar->rp_irq = irq_create_mapping(rcar->rp_irq_domain, 0);
> + if (!rcar->rp_irq) {
> + ret = -ENOMEM;
> + goto err_remove_domain;
> + }
> +
> + if (irq) {
> + /*
> + * Dispatch the child IRQ in hard IRQ context, including on
> + * PREEMPT_RT. Enable it together with the "msi" parent IRQ.
> + */
> + ret = devm_request_irq(dev, irq, rcar_gen4_pcie_aer_irq_handler,
> + IRQF_NO_THREAD | IRQF_NO_AUTOEN,
> + "rcar-gen4-pcie-aer", rcar);
> + if (ret) {
> + dev_err_probe(dev, ret, "Failed to request AER IRQ\n");
> + goto err_dispose_mapping;
> + }
> + rcar->aer_irq = irq;
> + }
> +
> + return 0;
> +
> +err_dispose_mapping:
> + irq_dispose_mapping(rcar->rp_irq);
> +err_remove_domain:
> + irq_domain_remove(rcar->rp_irq_domain);
> +err_free_fwnode:
> + irq_domain_free_fwnode(fwnode);
> +
> + return ret;
> +}
> +
> +static void rcar_gen4_pcie_rp_irq_deinit(struct rcar_gen4_pcie *rcar)
> +{
> + struct fwnode_handle *fwnode = rcar->rp_irq_domain->fwnode;
> +
> + irq_dispose_mapping(rcar->rp_irq);
> + irq_domain_remove(rcar->rp_irq_domain);
> + irq_domain_free_fwnode(fwnode);
> +}
> +
> static int rcar_gen4_pcie_enable_device(struct pci_host_bridge *bridge,
> struct pci_dev *dev)
> {
> @@ -854,6 +1035,13 @@ static int rcar_gen4_pcie_host_setup(struct dw_pcie_rp *pp)
> if (ret)
> return ret;
>
> + /*
> + * Root Port MSIs are not delivered. Hide the MSI/MSI-X capabilities
> + * so port services use the virtual INTx IRQ.
> + */
> + dw_pcie_remove_capability(dw, PCI_CAP_ID_MSI);
> + dw_pcie_remove_capability(dw, PCI_CAP_ID_MSIX);
> +
> msleep(PCIE_T_PVPERL_MS); /* pe_rst requires 100msec delay */
> rcar_gen4_pcie_host_perst_assert(pp, false);
>
> @@ -869,6 +1057,8 @@ static void rcar_gen4_pcie_quiesce_irqs(struct rcar_gen4_pcie *rcar)
>
> /* The MSI status lives in DBI; keep the handler away during the reset. */
> disable_irq(rcar->msi_irq);
> + if (rcar->aer_irq > 0)
> + disable_irq(rcar->aer_irq);
> }
>
> static void rcar_gen4_pcie_resume_irqs(struct rcar_gen4_pcie *rcar,
> @@ -879,6 +1069,8 @@ static void rcar_gen4_pcie_resume_irqs(struct rcar_gen4_pcie *rcar,
> rcar_gen4_pcie_app_irq_sync_locked(rcar);
> }
>
> + if (rcar->aer_irq > 0)
> + enable_irq(rcar->aer_irq);
> enable_irq(rcar->msi_irq);
> }
>
> @@ -945,6 +1137,8 @@ static int rcar_gen4_pcie_host_init(struct dw_pcie_rp *pp)
> if (pp->bridge) {
> pp->bridge->enable_device = rcar_gen4_pcie_enable_device;
> pp->bridge->reset_root_port = rcar_gen4_pcie_reset_root_port;
> + /* Route Root Port INTx to the virtual IRQ. */
> + pp->bridge->map_irq = rcar_gen4_pcie_map_irq;
> }
>
> rcar_gen4_pcie_host_perst_assert(pp, true);
> @@ -1003,10 +1197,14 @@ static int rcar_gen4_add_dw_pcie_rp(struct rcar_gen4_pcie *rcar)
> raw_spin_lock_init(&rcar->app_lock);
> INIT_WORK(&rcar->link_down_work, rcar_gen4_pcie_link_down_work);
>
> - ret = rcar_gen4_pcie_msi_irq_init(rcar);
> + ret = rcar_gen4_pcie_rp_irq_init(rcar);
> if (ret)
> return ret;
>
> + ret = rcar_gen4_pcie_msi_irq_init(rcar);
> + if (ret)
> + goto err_rp_irq_deinit;
> +
> pp->num_vectors = MAX_MSI_IRQS;
> /* Reserve an iATU window for the generic PME_Turn_Off implementation. */
> pp->use_atu_msg = true;
> @@ -1018,7 +1216,15 @@ static int rcar_gen4_add_dw_pcie_rp(struct rcar_gen4_pcie *rcar)
> pp->msi_irq[0] = -ENODEV;
> pp->ops = &rcar_gen4_pcie_host_ops;
>
> - return dw_pcie_host_init(pp);
> + ret = dw_pcie_host_init(pp);
> + if (ret)
> + goto err_rp_irq_deinit;
> +
> + return 0;
> +
> +err_rp_irq_deinit:
> + rcar_gen4_pcie_rp_irq_deinit(rcar);
> + return ret;
> }
>
> static void rcar_gen4_remove_dw_pcie_rp(struct rcar_gen4_pcie *rcar)
> @@ -1026,6 +1232,7 @@ static void rcar_gen4_remove_dw_pcie_rp(struct rcar_gen4_pcie *rcar)
> /* Cancel recovery work before removing the PCI bus */
> rcar_gen4_pcie_rp_events_disarm(rcar);
> dw_pcie_host_deinit(&rcar->dw.pp);
> + rcar_gen4_pcie_rp_irq_deinit(rcar);
> }
>
> /* Endpoint mode */
--
Best regards,
Marek Vasut
next prev parent reply other threads:[~2026-10-21 2:21 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-20 3:10 [PATCH v5 00/17] PCI: rcar-gen4: Recover from link down and route Root Port interrupts Koichiro Den
2026-10-20 3:10 ` [PATCH v5 01/17] PCI: dwc: Add Renesas to the RAS DES VSEC list Koichiro Den
2026-10-20 3:10 ` [PATCH v5 02/17] PCI: dwc: Factor out the PORT_LINK_DEBUG1 link-up check Koichiro Den
2026-10-20 3:10 ` [PATCH v5 03/17] PCI: rcar-gen4: Check live link status in link_up() Koichiro Den
2026-10-20 3:10 ` [PATCH v5 04/17] dt-bindings: PCI: rcar-gen4: Add optional "aer" interrupt for R-Car Gen4 SoCs Koichiro Den
2026-10-20 12:45 ` Marek Vasut
2026-10-20 3:10 ` [PATCH v5 05/17] PCI: dwc: Export dw_handle_msi_irq() Koichiro Den
2026-10-20 3:10 ` [PATCH v5 06/17] PCI: rcar-gen4: Move deinitialization helpers before SoC initialization Koichiro Den
2026-10-20 3:10 ` [PATCH v5 07/17] PCI: rcar-gen4: Assert resets when Gen5 SoC PHY initialization fails Koichiro Den
2026-10-20 3:10 ` [PATCH v5 08/17] PCI: rcar-gen4: Separate hardware setup from resource acquisition Koichiro Den
2026-10-20 3:10 ` [PATCH v5 09/17] PCI: rcar-gen4: Add Root Port reset support Koichiro Den
2026-10-20 3:10 ` [PATCH v5 10/17] PCI: dwc: Free the MSI domain after the host .deinit() callback Koichiro Den
2026-10-20 3:54 ` Shawn Lin
2026-10-20 6:41 ` Koichiro Den
2026-10-20 7:00 ` Shawn Lin
2026-10-20 7:21 ` Koichiro Den
2026-10-20 11:47 ` Geert Uytterhoeven
2026-10-20 13:45 ` Koichiro Den
2026-10-20 3:10 ` [PATCH v5 11/17] PCI: rcar-gen4: Take over the iMSI-RX interrupt Koichiro Den
2026-10-20 3:10 ` [PATCH v5 12/17] PCI: rcar-gen4: Recover the Root Port on link down Koichiro Den
2026-10-20 3:10 ` [PATCH v5 13/17] PCI: rcar-gen4: Route Root Port AER to a virtual Root Port IRQ Koichiro Den
2026-10-21 0:19 ` Marek Vasut [this message]
2026-10-20 3:10 ` [PATCH v5 14/17] PCI: rcar-gen4: Route Root Port PME and bandwidth notifications Koichiro Den
2026-10-20 3:10 ` [PATCH v5 15/17] arm64: dts: renesas: r8a779f0: Describe the PCIe AER interrupts Koichiro Den
2026-10-20 3:10 ` [PATCH v5 16/17] arm64: dts: renesas: r8a779g0: " Koichiro Den
2026-10-20 3:10 ` [PATCH v5 17/17] arm64: dts: renesas: r8a779h0: Describe the PCIe AER interrupt Koichiro Den
2026-10-20 8:03 ` [PATCH v5 00/17] PCI: rcar-gen4: Recover from link down and route Root Port interrupts Geert Uytterhoeven
2026-10-20 8:45 ` Koichiro Den
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=33e7f153-9dde-4bf7-8ab4-d128b256239a@mailbox.org \
--to=marek.vasut@mailbox.org \
--cc=Frank.Li@nxp.com \
--cc=Shawn.lin@rock-chips.com \
--cc=bhelgaas@google.com \
--cc=cassel@kernel.org \
--cc=conor+dt@kernel.org \
--cc=den@valinux.co.jp \
--cc=devicetree@vger.kernel.org \
--cc=fancer.lancer@gmail.com \
--cc=geert+renesas@glider.be \
--cc=jingoohan1@gmail.com \
--cc=krzk+dt@kernel.org \
--cc=kwilczynski@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=lpieralisi@kernel.org \
--cc=magnus.damm@gmail.com \
--cc=mani@kernel.org \
--cc=p.zabel@pengutronix.de \
--cc=robh@kernel.org \
--cc=wilfred.mallawa@wdc.com \
--cc=yoshihiro.shimoda.uh@renesas.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®