linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1 1/3] irqdomain: Make __irq_domain_add() less OF-dependent
@ 2020-05-20 16:49 Andy Shevchenko
  2020-05-20 16:49 ` [PATCH v1 2/3] irqdomain: Get rid of special treatment for ACPI in __irq_domain_add() Andy Shevchenko
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Andy Shevchenko @ 2020-05-20 16:49 UTC (permalink / raw)
  To: Marc Zyngier, Thomas Gleixner, linux-kernel, Rafael J. Wysocki,
	linux-acpi
  Cc: Andy Shevchenko

__irq_domain_add() in some places relies on the fact that fwnode
can be only type of OF. This prevents refactoring of the code
to support other types of fwnode. Make it less OF-dependent
by switching to use fwnode directly where it makes sense.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 kernel/irq/irqdomain.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index 35b8d97c3a1d..d59a4224f920 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -132,14 +132,13 @@ struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size,
 				    const struct irq_domain_ops *ops,
 				    void *host_data)
 {
-	struct device_node *of_node = to_of_node(fwnode);
 	struct irqchip_fwid *fwid;
 	struct irq_domain *domain;
 
 	static atomic_t unknown_domains;
 
 	domain = kzalloc_node(sizeof(*domain) + (sizeof(unsigned int) * size),
-			      GFP_KERNEL, of_node_to_nid(of_node));
+			      GFP_KERNEL, of_node_to_nid(to_of_node(fwnode)));
 	if (!domain)
 		return NULL;
 
@@ -177,15 +176,15 @@ struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size,
 
 		domain->fwnode = fwnode;
 #endif
-	} else if (of_node) {
+	} else if (is_of_node(fwnode)) {
 		char *name;
 
 		/*
-		 * DT paths contain '/', which debugfs is legitimately
+		 * fwnode paths contain '/', which debugfs is legitimately
 		 * unhappy about. Replace them with ':', which does
 		 * the trick and is not as offensive as '\'...
 		 */
-		name = kasprintf(GFP_KERNEL, "%pOF", of_node);
+		name = kasprintf(GFP_KERNEL, "%pfw", fwnode);
 		if (!name) {
 			kfree(domain);
 			return NULL;
@@ -210,7 +209,7 @@ struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size,
 		domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED;
 	}
 
-	of_node_get(of_node);
+	fwnode_handle_get(fwnode);
 
 	/* Fill structure */
 	INIT_RADIX_TREE(&domain->revmap_tree, GFP_KERNEL);
@@ -259,7 +258,7 @@ void irq_domain_remove(struct irq_domain *domain)
 
 	pr_debug("Removed domain %s\n", domain->name);
 
-	of_node_put(irq_domain_get_of_node(domain));
+	fwnode_handle_put(domain->fwnode);
 	if (domain->flags & IRQ_DOMAIN_NAME_ALLOCATED)
 		kfree(domain->name);
 	kfree(domain);
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v1 2/3] irqdomain: Get rid of special treatment for ACPI in __irq_domain_add()
  2020-05-20 16:49 [PATCH v1 1/3] irqdomain: Make __irq_domain_add() less OF-dependent Andy Shevchenko
@ 2020-05-20 16:49 ` Andy Shevchenko
  2020-05-30  7:46   ` [tip: irq/core] " tip-bot2 for Andy Shevchenko
  2020-05-20 16:49 ` [PATCH v1 3/3] irqdomain: Allow software node to be correct one for IRQ domain Andy Shevchenko
  2020-05-30  7:46 ` [tip: irq/core] irqdomain: Make __irq_domain_add() less OF-dependent tip-bot2 for Andy Shevchenko
  2 siblings, 1 reply; 8+ messages in thread
From: Andy Shevchenko @ 2020-05-20 16:49 UTC (permalink / raw)
  To: Marc Zyngier, Thomas Gleixner, linux-kernel, Rafael J. Wysocki,
	linux-acpi
  Cc: Andy Shevchenko

After change __irq_domain_add() to cooperate better with fwnodes
we don't need to have special treatment for ACPI case.

Get rid of the special treatment for ACPI.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 kernel/irq/irqdomain.c | 17 +----------------
 1 file changed, 1 insertion(+), 16 deletions(-)

diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index d59a4224f920..c6204bc606a2 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -161,22 +161,7 @@ struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size,
 			domain->name = fwid->name;
 			break;
 		}
-#ifdef CONFIG_ACPI
-	} else if (is_acpi_device_node(fwnode)) {
-		struct acpi_buffer buf = {
-			.length = ACPI_ALLOCATE_BUFFER,
-		};
-		acpi_handle handle;
-
-		handle = acpi_device_handle(to_acpi_device_node(fwnode));
-		if (acpi_get_name(handle, ACPI_FULL_PATHNAME, &buf) == AE_OK) {
-			domain->name = buf.pointer;
-			domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED;
-		}
-
-		domain->fwnode = fwnode;
-#endif
-	} else if (is_of_node(fwnode)) {
+	} else if (is_of_node(fwnode) || is_acpi_device_node(fwnode)) {
 		char *name;
 
 		/*
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v1 3/3] irqdomain: Allow software node to be correct one for IRQ domain
  2020-05-20 16:49 [PATCH v1 1/3] irqdomain: Make __irq_domain_add() less OF-dependent Andy Shevchenko
  2020-05-20 16:49 ` [PATCH v1 2/3] irqdomain: Get rid of special treatment for ACPI in __irq_domain_add() Andy Shevchenko
@ 2020-05-20 16:49 ` Andy Shevchenko
  2020-05-21  8:59   ` Marc Zyngier
  2020-05-30  7:46   ` [tip: irq/core] irqdomain: Allow software nodes for IRQ domain creation tip-bot2 for Andy Shevchenko
  2020-05-30  7:46 ` [tip: irq/core] irqdomain: Make __irq_domain_add() less OF-dependent tip-bot2 for Andy Shevchenko
  2 siblings, 2 replies; 8+ messages in thread
From: Andy Shevchenko @ 2020-05-20 16:49 UTC (permalink / raw)
  To: Marc Zyngier, Thomas Gleixner, linux-kernel, Rafael J. Wysocki,
	linux-acpi
  Cc: Andy Shevchenko

In some cases we might need to have an IRQ domain created out of software node.
One of such cases is DesignWare GPIO driver when it's instantiated from
half-baked ACPI table (alas, we can't fix it for devices which are few years
on market) and thus using software nodes to quirk this up. But the driver
is using IRQ domains based on per GPIO port firmware nodes, which are in
the above case software ones. This brings a warning message to be printed

  [   73.957183] irq: Invalid fwnode type for irqdomain

and creates an unknown IRQ domain.

When we allow software node to be correct one for IRQ domain we will
get rid of the warning message and nice domain name at the same time:

  % ls -1 /sys/kernel/debug/irq/domains/
  ...
  intel-quark-dw-apb-gpio:portA

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 kernel/irq/irqdomain.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index c6204bc606a2..e4ebc5398ef5 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -161,7 +161,8 @@ struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size,
 			domain->name = fwid->name;
 			break;
 		}
-	} else if (is_of_node(fwnode) || is_acpi_device_node(fwnode)) {
+	} else if (is_of_node(fwnode) || is_acpi_device_node(fwnode) ||
+		   is_software_node(fwnode)) {
 		char *name;
 
 		/*
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v1 3/3] irqdomain: Allow software node to be correct one for IRQ domain
  2020-05-20 16:49 ` [PATCH v1 3/3] irqdomain: Allow software node to be correct one for IRQ domain Andy Shevchenko
@ 2020-05-21  8:59   ` Marc Zyngier
  2020-05-21  9:43     ` Andy Shevchenko
  2020-05-30  7:46   ` [tip: irq/core] irqdomain: Allow software nodes for IRQ domain creation tip-bot2 for Andy Shevchenko
  1 sibling, 1 reply; 8+ messages in thread
From: Marc Zyngier @ 2020-05-21  8:59 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Thomas Gleixner, linux-kernel, Rafael J. Wysocki, linux-acpi

Hi Andy,

On 2020-05-20 17:49, Andy Shevchenko wrote:
> In some cases we might need to have an IRQ domain created out of 
> software node.
> One of such cases is DesignWare GPIO driver when it's instantiated from
> half-baked ACPI table (alas, we can't fix it for devices which are few 
> years
> on market) and thus using software nodes to quirk this up. But the 
> driver
> is using IRQ domains based on per GPIO port firmware nodes, which are 
> in
> the above case software ones. This brings a warning message to be 
> printed
> 
>   [   73.957183] irq: Invalid fwnode type for irqdomain
> 
> and creates an unknown IRQ domain.
> 
> When we allow software node to be correct one for IRQ domain we will
> get rid of the warning message and nice domain name at the same time:
> 
>   % ls -1 /sys/kernel/debug/irq/domains/
>   ...
>   intel-quark-dw-apb-gpio:portA
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
>  kernel/irq/irqdomain.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
> index c6204bc606a2..e4ebc5398ef5 100644
> --- a/kernel/irq/irqdomain.c
> +++ b/kernel/irq/irqdomain.c
> @@ -161,7 +161,8 @@ struct irq_domain *__irq_domain_add(struct
> fwnode_handle *fwnode, int size,
>  			domain->name = fwid->name;
>  			break;
>  		}
> -	} else if (is_of_node(fwnode) || is_acpi_device_node(fwnode)) {
> +	} else if (is_of_node(fwnode) || is_acpi_device_node(fwnode) ||
> +		   is_software_node(fwnode)) {
>  		char *name;
> 
>  		/*

Thanks for this. I've applied it to irqchip-next. In the future,
please consider adding a cover letter describing the overall
goal of the series.

Cheers,

         M.
-- 
Jazz is not dead. It just smells funny...

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v1 3/3] irqdomain: Allow software node to be correct one for IRQ domain
  2020-05-21  8:59   ` Marc Zyngier
@ 2020-05-21  9:43     ` Andy Shevchenko
  0 siblings, 0 replies; 8+ messages in thread
From: Andy Shevchenko @ 2020-05-21  9:43 UTC (permalink / raw)
  To: Marc Zyngier; +Cc: Thomas Gleixner, linux-kernel, Rafael J. Wysocki, linux-acpi

On Thu, May 21, 2020 at 09:59:57AM +0100, Marc Zyngier wrote:
> On 2020-05-20 17:49, Andy Shevchenko wrote:

> Thanks for this. I've applied it to irqchip-next.

Thank you, Marc!

> In the future,
> please consider adding a cover letter describing the overall
> goal of the series.

I will keep in mind and follow.

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 8+ messages in thread

* [tip: irq/core] irqdomain: Get rid of special treatment for ACPI in __irq_domain_add()
  2020-05-20 16:49 ` [PATCH v1 2/3] irqdomain: Get rid of special treatment for ACPI in __irq_domain_add() Andy Shevchenko
@ 2020-05-30  7:46   ` tip-bot2 for Andy Shevchenko
  0 siblings, 0 replies; 8+ messages in thread
From: tip-bot2 for Andy Shevchenko @ 2020-05-30  7:46 UTC (permalink / raw)
  To: linux-tip-commits; +Cc: Andy Shevchenko, Marc Zyngier, x86, LKML

The following commit has been merged into the irq/core branch of tip:

Commit-ID:     87526603c89256e18ad2c23821fdaf376b072fc8
Gitweb:        https://git.kernel.org/tip/87526603c89256e18ad2c23821fdaf376b072fc8
Author:        Andy Shevchenko <andriy.shevchenko@linux.intel.com>
AuthorDate:    Wed, 20 May 2020 19:49:26 +03:00
Committer:     Marc Zyngier <maz@kernel.org>
CommitterDate: Thu, 21 May 2020 10:51:50 +01:00

irqdomain: Get rid of special treatment for ACPI in __irq_domain_add()

Now that __irq_domain_add() is able to better deals with generic
fwnodes, there is no need to special-case ACPI anymore.

Get rid of the special treatment for ACPI.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20200520164927.39090-2-andriy.shevchenko@linux.intel.com
---
 kernel/irq/irqdomain.c | 17 +----------------
 1 file changed, 1 insertion(+), 16 deletions(-)

diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index 7649f38..5d14d91 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -161,22 +161,7 @@ struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size,
 			domain->name = fwid->name;
 			break;
 		}
-#ifdef CONFIG_ACPI
-	} else if (is_acpi_device_node(fwnode)) {
-		struct acpi_buffer buf = {
-			.length = ACPI_ALLOCATE_BUFFER,
-		};
-		acpi_handle handle;
-
-		handle = acpi_device_handle(to_acpi_device_node(fwnode));
-		if (acpi_get_name(handle, ACPI_FULL_PATHNAME, &buf) == AE_OK) {
-			domain->name = buf.pointer;
-			domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED;
-		}
-
-		domain->fwnode = fwnode;
-#endif
-	} else if (is_of_node(fwnode)) {
+	} else if (is_of_node(fwnode) || is_acpi_device_node(fwnode)) {
 		char *name;
 
 		/*

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [tip: irq/core] irqdomain: Allow software nodes for IRQ domain creation
  2020-05-20 16:49 ` [PATCH v1 3/3] irqdomain: Allow software node to be correct one for IRQ domain Andy Shevchenko
  2020-05-21  8:59   ` Marc Zyngier
@ 2020-05-30  7:46   ` tip-bot2 for Andy Shevchenko
  1 sibling, 0 replies; 8+ messages in thread
From: tip-bot2 for Andy Shevchenko @ 2020-05-30  7:46 UTC (permalink / raw)
  To: linux-tip-commits; +Cc: Andy Shevchenko, Marc Zyngier, x86, LKML

The following commit has been merged into the irq/core branch of tip:

Commit-ID:     9ed78b05f998050784ae863bd5ba4aea2e2141ed
Gitweb:        https://git.kernel.org/tip/9ed78b05f998050784ae863bd5ba4aea2e2141ed
Author:        Andy Shevchenko <andriy.shevchenko@linux.intel.com>
AuthorDate:    Wed, 20 May 2020 19:49:27 +03:00
Committer:     Marc Zyngier <maz@kernel.org>
CommitterDate: Thu, 21 May 2020 10:53:17 +01:00

irqdomain: Allow software nodes for IRQ domain creation

In some cases we need to have an IRQ domain created out of software node.

One of such cases is DesignWare GPIO driver when it's instantiated from
half-baked ACPI table (alas, we can't fix it for devices which are few years
on market) and thus using software nodes to quirk this. But the driver
is using IRQ domains based on per GPIO port firmware nodes, which are in
the above case software ones. This brings a warning message to be printed

  [   73.957183] irq: Invalid fwnode type for irqdomain

and creates an anonymous IRQ domain without a debugfs entry.

Allowing software nodes to be valid for IRQ domains rids us of the warning
and debugs gets correctly populated.

  % ls -1 /sys/kernel/debug/irq/domains/
  ...
  intel-quark-dw-apb-gpio:portA

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
[maz: refactored commit message]
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20200520164927.39090-3-andriy.shevchenko@linux.intel.com
---
 kernel/irq/irqdomain.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index 5d14d91..a4c2c91 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -161,7 +161,8 @@ struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size,
 			domain->name = fwid->name;
 			break;
 		}
-	} else if (is_of_node(fwnode) || is_acpi_device_node(fwnode)) {
+	} else if (is_of_node(fwnode) || is_acpi_device_node(fwnode) ||
+		   is_software_node(fwnode)) {
 		char *name;
 
 		/*

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [tip: irq/core] irqdomain: Make __irq_domain_add() less OF-dependent
  2020-05-20 16:49 [PATCH v1 1/3] irqdomain: Make __irq_domain_add() less OF-dependent Andy Shevchenko
  2020-05-20 16:49 ` [PATCH v1 2/3] irqdomain: Get rid of special treatment for ACPI in __irq_domain_add() Andy Shevchenko
  2020-05-20 16:49 ` [PATCH v1 3/3] irqdomain: Allow software node to be correct one for IRQ domain Andy Shevchenko
@ 2020-05-30  7:46 ` tip-bot2 for Andy Shevchenko
  2 siblings, 0 replies; 8+ messages in thread
From: tip-bot2 for Andy Shevchenko @ 2020-05-30  7:46 UTC (permalink / raw)
  To: linux-tip-commits; +Cc: Andy Shevchenko, Marc Zyngier, x86, LKML

The following commit has been merged into the irq/core branch of tip:

Commit-ID:     181e9d4efaf6aa8d1e7d510aeb7114c0f276fad7
Gitweb:        https://git.kernel.org/tip/181e9d4efaf6aa8d1e7d510aeb7114c0f276fad7
Author:        Andy Shevchenko <andriy.shevchenko@linux.intel.com>
AuthorDate:    Wed, 20 May 2020 19:49:25 +03:00
Committer:     Marc Zyngier <maz@kernel.org>
CommitterDate: Thu, 21 May 2020 10:50:30 +01:00

irqdomain: Make __irq_domain_add() less OF-dependent

__irq_domain_add() relies in some places on the fact that the fwnode
can be only of type OF. This prevents refactoring of the code to support
other types of fwnode. Make it less OF-dependent by switching it
to use the fwnode directly where it makes sense.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20200520164927.39090-1-andriy.shevchenko@linux.intel.com
---
 kernel/irq/irqdomain.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index e2aa128..7649f38 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -132,14 +132,13 @@ struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size,
 				    const struct irq_domain_ops *ops,
 				    void *host_data)
 {
-	struct device_node *of_node = to_of_node(fwnode);
 	struct irqchip_fwid *fwid;
 	struct irq_domain *domain;
 
 	static atomic_t unknown_domains;
 
 	domain = kzalloc_node(sizeof(*domain) + (sizeof(unsigned int) * size),
-			      GFP_KERNEL, of_node_to_nid(of_node));
+			      GFP_KERNEL, of_node_to_nid(to_of_node(fwnode)));
 	if (!domain)
 		return NULL;
 
@@ -177,15 +176,15 @@ struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size,
 
 		domain->fwnode = fwnode;
 #endif
-	} else if (of_node) {
+	} else if (is_of_node(fwnode)) {
 		char *name;
 
 		/*
-		 * DT paths contain '/', which debugfs is legitimately
+		 * fwnode paths contain '/', which debugfs is legitimately
 		 * unhappy about. Replace them with ':', which does
 		 * the trick and is not as offensive as '\'...
 		 */
-		name = kasprintf(GFP_KERNEL, "%pOF", of_node);
+		name = kasprintf(GFP_KERNEL, "%pfw", fwnode);
 		if (!name) {
 			kfree(domain);
 			return NULL;
@@ -210,7 +209,7 @@ struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size,
 		domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED;
 	}
 
-	of_node_get(of_node);
+	fwnode_handle_get(fwnode);
 
 	/* Fill structure */
 	INIT_RADIX_TREE(&domain->revmap_tree, GFP_KERNEL);
@@ -259,7 +258,7 @@ void irq_domain_remove(struct irq_domain *domain)
 
 	pr_debug("Removed domain %s\n", domain->name);
 
-	of_node_put(irq_domain_get_of_node(domain));
+	fwnode_handle_put(domain->fwnode);
 	if (domain->flags & IRQ_DOMAIN_NAME_ALLOCATED)
 		kfree(domain->name);
 	kfree(domain);

^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-05-30  7:47 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-20 16:49 [PATCH v1 1/3] irqdomain: Make __irq_domain_add() less OF-dependent Andy Shevchenko
2020-05-20 16:49 ` [PATCH v1 2/3] irqdomain: Get rid of special treatment for ACPI in __irq_domain_add() Andy Shevchenko
2020-05-30  7:46   ` [tip: irq/core] " tip-bot2 for Andy Shevchenko
2020-05-20 16:49 ` [PATCH v1 3/3] irqdomain: Allow software node to be correct one for IRQ domain Andy Shevchenko
2020-05-21  8:59   ` Marc Zyngier
2020-05-21  9:43     ` Andy Shevchenko
2020-05-30  7:46   ` [tip: irq/core] irqdomain: Allow software nodes for IRQ domain creation tip-bot2 for Andy Shevchenko
2020-05-30  7:46 ` [tip: irq/core] irqdomain: Make __irq_domain_add() less OF-dependent tip-bot2 for Andy Shevchenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).