linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] gpio: zynq: Implement irq_(request|release)_resources
@ 2015-10-23 13:36 Soren Brinkmann
  2015-10-27 15:53 ` Linus Walleij
  0 siblings, 1 reply; 9+ messages in thread
From: Soren Brinkmann @ 2015-10-23 13:36 UTC (permalink / raw)
  To: Linus Walleij, Alexandre Courbot
  Cc: linux-kernel, linux-gpio, Michal Simek, linux-arm-kernel,
	Soren Brinkmann, John Linn

The driver uses runtime PM to leverage low power techniques. For
use-cases using GPIO as interrupt the device needs to be in an
appropriate state.

Reported-by: John Linn <linnj@xilinx.com>
Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
Tested-by: John Linn <linnj@xilinx.com>
---
 drivers/gpio/gpio-zynq.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/drivers/gpio/gpio-zynq.c b/drivers/gpio/gpio-zynq.c
index 8abeacac5885..0d1669416112 100644
--- a/drivers/gpio/gpio-zynq.c
+++ b/drivers/gpio/gpio-zynq.c
@@ -471,6 +471,22 @@ static int zynq_gpio_set_wake(struct irq_data *data, unsigned int on)
 	return 0;
 }
 
+int zynq_gpio_irq_request_resources(struct irq_data *data)
+{
+	struct zynq_gpio *gpio = irq_data_get_irq_chip_data(data);
+	struct device *dev = gpio->chip.dev;
+
+	return pm_runtime_get_sync(dev);
+}
+
+void zynq_gpio_irq_release_resources(struct irq_data *data)
+{
+	struct zynq_gpio *gpio = irq_data_get_irq_chip_data(data);
+	struct device *dev = gpio->chip.dev;
+
+	pm_runtime_put(dev);
+}
+
 /* irq chip descriptor */
 static struct irq_chip zynq_gpio_level_irqchip = {
 	.name		= DRIVER_NAME,
@@ -480,6 +496,8 @@ static struct irq_chip zynq_gpio_level_irqchip = {
 	.irq_unmask	= zynq_gpio_irq_unmask,
 	.irq_set_type	= zynq_gpio_set_irq_type,
 	.irq_set_wake	= zynq_gpio_set_wake,
+	.irq_request_resources	= zynq_gpio_irq_request_resources,
+	.irq_release_resources	= zynq_gpio_irq_release_resources,
 	.flags		= IRQCHIP_EOI_THREADED | IRQCHIP_EOI_IF_HANDLED |
 			  IRQCHIP_MASK_ON_SUSPEND,
 };
@@ -492,6 +510,8 @@ static struct irq_chip zynq_gpio_edge_irqchip = {
 	.irq_unmask	= zynq_gpio_irq_unmask,
 	.irq_set_type	= zynq_gpio_set_irq_type,
 	.irq_set_wake	= zynq_gpio_set_wake,
+	.irq_request_resources	= zynq_gpio_irq_request_resources,
+	.irq_release_resources	= zynq_gpio_irq_release_resources,
 	.flags		= IRQCHIP_MASK_ON_SUSPEND,
 };
 
-- 
2.6.2.3.ga463a5b


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

* Re: [PATCH] gpio: zynq: Implement irq_(request|release)_resources
  2015-10-23 13:36 [PATCH] gpio: zynq: Implement irq_(request|release)_resources Soren Brinkmann
@ 2015-10-27 15:53 ` Linus Walleij
  2015-10-27 16:18   ` Grygorii Strashko
  2015-10-27 16:37   ` Lars-Peter Clausen
  0 siblings, 2 replies; 9+ messages in thread
From: Linus Walleij @ 2015-10-27 15:53 UTC (permalink / raw)
  To: Soren Brinkmann
  Cc: Alexandre Courbot, linux-kernel, linux-gpio, Michal Simek,
	linux-arm-kernel, John Linn, Grygorii Strashko

On Fri, Oct 23, 2015 at 3:36 PM, Soren Brinkmann
<soren.brinkmann@xilinx.com> wrote:

> The driver uses runtime PM to leverage low power techniques. For
> use-cases using GPIO as interrupt the device needs to be in an
> appropriate state.
>
> Reported-by: John Linn <linnj@xilinx.com>
> Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
> Tested-by: John Linn <linnj@xilinx.com>

As pointed out by Grygorii in
commit aca82d1cbb49af34b69ecd4571a0fe48ad9247c1:

    The PM runtime API can't be used in atomic contex on -RT even if
    it's configured as irqsafe. As result, below error report can
    be seen when PM runtime API called from IRQ chip's callbacks
    irq_startup/irq_shutdown/irq_set_type, because they are
    protected by RAW spinlock:
(...)
    The IRQ chip interface defines only two callbacks which are executed in
    non-atomic contex - irq_bus_lock/irq_bus_sync_unlock, so lets move
    PM runtime calls there.

I.e. these calls are atomic context and it's just luck that it works
and this is fragile.

Can you please check if you can move it to
irq_bus_lock()/irq_sync_unlock()
like Grygorii does?

Yours,
Linus Walleij

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

* Re: [PATCH] gpio: zynq: Implement irq_(request|release)_resources
  2015-10-27 15:53 ` Linus Walleij
@ 2015-10-27 16:18   ` Grygorii Strashko
  2015-10-27 16:23     ` Linus Walleij
  2015-10-27 16:37   ` Lars-Peter Clausen
  1 sibling, 1 reply; 9+ messages in thread
From: Grygorii Strashko @ 2015-10-27 16:18 UTC (permalink / raw)
  To: Linus Walleij, Soren Brinkmann
  Cc: Alexandre Courbot, linux-kernel, linux-gpio, Michal Simek,
	linux-arm-kernel, John Linn

On 10/27/2015 05:53 PM, Linus Walleij wrote:
> On Fri, Oct 23, 2015 at 3:36 PM, Soren Brinkmann
> <soren.brinkmann@xilinx.com> wrote:
>
>> The driver uses runtime PM to leverage low power techniques. For
>> use-cases using GPIO as interrupt the device needs to be in an
>> appropriate state.
>>
>> Reported-by: John Linn <linnj@xilinx.com>
>> Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
>> Tested-by: John Linn <linnj@xilinx.com>
>
> As pointed out by Grygorii in
> commit aca82d1cbb49af34b69ecd4571a0fe48ad9247c1:
>
>      The PM runtime API can't be used in atomic contex on -RT even if
>      it's configured as irqsafe. As result, below error report can
>      be seen when PM runtime API called from IRQ chip's callbacks
>      irq_startup/irq_shutdown/irq_set_type, because they are
>      protected by RAW spinlock:
> (...)
>      The IRQ chip interface defines only two callbacks which are executed in
>      non-atomic contex - irq_bus_lock/irq_bus_sync_unlock, so lets move
>      PM runtime calls there.
>
> I.e. these calls are atomic context and it's just luck that it works
> and this is fragile.
>
> Can you please check if you can move it to
> irq_bus_lock()/irq_sync_unlock()
> like Grygorii does?
>

This patch rises the question not only about PM runtime, but also
about gpiochip_irq_reqres()/gpiochip_irq_relres().


-- 
regards,
-grygorii

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

* Re: [PATCH] gpio: zynq: Implement irq_(request|release)_resources
  2015-10-27 16:18   ` Grygorii Strashko
@ 2015-10-27 16:23     ` Linus Walleij
  2015-10-27 17:54       ` Grygorii Strashko
  0 siblings, 1 reply; 9+ messages in thread
From: Linus Walleij @ 2015-10-27 16:23 UTC (permalink / raw)
  To: Grygorii Strashko
  Cc: Soren Brinkmann, Alexandre Courbot, linux-kernel, linux-gpio,
	Michal Simek, linux-arm-kernel, John Linn

On Tue, Oct 27, 2015 at 5:18 PM, Grygorii Strashko
<grygorii.strashko@ti.com> wrote:
> On 10/27/2015 05:53 PM, Linus Walleij wrote:
>>
>> On Fri, Oct 23, 2015 at 3:36 PM, Soren Brinkmann
>> <soren.brinkmann@xilinx.com> wrote:
>>
>>> The driver uses runtime PM to leverage low power techniques. For
>>> use-cases using GPIO as interrupt the device needs to be in an
>>> appropriate state.
>>>
>>> Reported-by: John Linn <linnj@xilinx.com>
>>> Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
>>> Tested-by: John Linn <linnj@xilinx.com>
>>
>>
>> As pointed out by Grygorii in
>> commit aca82d1cbb49af34b69ecd4571a0fe48ad9247c1:
>>
>>      The PM runtime API can't be used in atomic contex on -RT even if
>>      it's configured as irqsafe. As result, below error report can
>>      be seen when PM runtime API called from IRQ chip's callbacks
>>      irq_startup/irq_shutdown/irq_set_type, because they are
>>      protected by RAW spinlock:
>> (...)
>>      The IRQ chip interface defines only two callbacks which are executed
>> in
>>      non-atomic contex - irq_bus_lock/irq_bus_sync_unlock, so lets move
>>      PM runtime calls there.
>>
>> I.e. these calls are atomic context and it's just luck that it works
>> and this is fragile.
>>
>> Can you please check if you can move it to
>> irq_bus_lock()/irq_sync_unlock()
>> like Grygorii does?
>>
>
> This patch rises the question not only about PM runtime, but also
> about gpiochip_irq_reqres()/gpiochip_irq_relres().

Do you mean that these functions contain calls to non-atomic
functions?

I mainly reacted to this because it was pm_* calls, that you
mentioned explicitly in your patch.

Yours,
Linus Walleij

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

* Re: [PATCH] gpio: zynq: Implement irq_(request|release)_resources
  2015-10-27 15:53 ` Linus Walleij
  2015-10-27 16:18   ` Grygorii Strashko
@ 2015-10-27 16:37   ` Lars-Peter Clausen
  2015-10-29 16:47     ` Sören Brinkmann
  2015-10-30 10:05     ` Thomas Gleixner
  1 sibling, 2 replies; 9+ messages in thread
From: Lars-Peter Clausen @ 2015-10-27 16:37 UTC (permalink / raw)
  To: Linus Walleij, Soren Brinkmann
  Cc: Alexandre Courbot, linux-kernel, linux-gpio, Michal Simek,
	linux-arm-kernel, John Linn, Grygorii Strashko, Thomas Gleixner

On 10/27/2015 04:53 PM, Linus Walleij wrote:
> On Fri, Oct 23, 2015 at 3:36 PM, Soren Brinkmann
> <soren.brinkmann@xilinx.com> wrote:
> 
>> The driver uses runtime PM to leverage low power techniques. For
>> use-cases using GPIO as interrupt the device needs to be in an
>> appropriate state.
>>
>> Reported-by: John Linn <linnj@xilinx.com>
>> Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
>> Tested-by: John Linn <linnj@xilinx.com>
> 
> As pointed out by Grygorii in
> commit aca82d1cbb49af34b69ecd4571a0fe48ad9247c1:
> 
>     The PM runtime API can't be used in atomic contex on -RT even if
>     it's configured as irqsafe. As result, below error report can
>     be seen when PM runtime API called from IRQ chip's callbacks
>     irq_startup/irq_shutdown/irq_set_type, because they are
>     protected by RAW spinlock:
> (...)
>     The IRQ chip interface defines only two callbacks which are executed in
>     non-atomic contex - irq_bus_lock/irq_bus_sync_unlock, so lets move
>     PM runtime calls there.
> 
> I.e. these calls are atomic context and it's just luck that it works
> and this is fragile.
> 
> Can you please check if you can move it to
> irq_bus_lock()/irq_sync_unlock()
> like Grygorii does?

That only powers up the chip when the chip is accessed. For proper IRQ
operation the chip needs to be powered up though as long as the IRQ is
enabled. request_irq() and free_irq() must always be called from sleepable
context. The thing is just that request_resource/release_resource are called
from within a raw spinlock, which is necessary since otherwise you can't
guarantee that they are only called once for shared interrupts.

It might make sense to add a separate set of callbacks to the irq_chip
struct that are called from the sleepable sections of
request_irq()/free_irq() which are meant for power management purposes and
which wont have the guarantee that they are only called once for shared IRQs
(but are still balanced).

Thomas, do you have any thoughts on this?

- Lars


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

* Re: [PATCH] gpio: zynq: Implement irq_(request|release)_resources
  2015-10-27 16:23     ` Linus Walleij
@ 2015-10-27 17:54       ` Grygorii Strashko
  2015-10-28 15:20         ` Linus Walleij
  0 siblings, 1 reply; 9+ messages in thread
From: Grygorii Strashko @ 2015-10-27 17:54 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Soren Brinkmann, Alexandre Courbot, linux-kernel, linux-gpio,
	Michal Simek, linux-arm-kernel, John Linn

On 10/27/2015 06:23 PM, Linus Walleij wrote:
> On Tue, Oct 27, 2015 at 5:18 PM, Grygorii Strashko
> <grygorii.strashko@ti.com> wrote:
>> On 10/27/2015 05:53 PM, Linus Walleij wrote:
>>>
>>> On Fri, Oct 23, 2015 at 3:36 PM, Soren Brinkmann
>>> <soren.brinkmann@xilinx.com> wrote:
>>>
>>>> The driver uses runtime PM to leverage low power techniques. For
>>>> use-cases using GPIO as interrupt the device needs to be in an
>>>> appropriate state.
>>>>
>>>> Reported-by: John Linn <linnj@xilinx.com>
>>>> Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
>>>> Tested-by: John Linn <linnj@xilinx.com>
>>>
>>>
>>> As pointed out by Grygorii in
>>> commit aca82d1cbb49af34b69ecd4571a0fe48ad9247c1:
>>>
>>>       The PM runtime API can't be used in atomic contex on -RT even if
>>>       it's configured as irqsafe. As result, below error report can
>>>       be seen when PM runtime API called from IRQ chip's callbacks
>>>       irq_startup/irq_shutdown/irq_set_type, because they are
>>>       protected by RAW spinlock:
>>> (...)
>>>       The IRQ chip interface defines only two callbacks which are executed
>>> in
>>>       non-atomic contex - irq_bus_lock/irq_bus_sync_unlock, so lets move
>>>       PM runtime calls there.
>>>
>>> I.e. these calls are atomic context and it's just luck that it works
>>> and this is fragile.
>>>
>>> Can you please check if you can move it to
>>> irq_bus_lock()/irq_sync_unlock()
>>> like Grygorii does?
>>>
>>
>> This patch rises the question not only about PM runtime, but also
>> about gpiochip_irq_reqres()/gpiochip_irq_relres().
> 
> Do you mean that these functions contain calls to non-atomic
> functions?
> 

Oh. No, I have to be more specific :(
if GPIOx driver defines custom .irq_(request|release)_resources() callbacks
they will *overwrite* standard GPIOirqchip callbacks.
(commit: 8b67a1f "gpio: don't override irq_*_resources() callbacks")

As result, such GPIOx driver should *re-implement* the same functionality in
its .irq_(request|release)_resources() callbacks as implemented in
gpiochip_irq_reqres()/gpiochip_irq_relres().

> I mainly reacted to this because it was pm_* calls, that you
> mentioned explicitly in your patch.
> 
-- 
regards,
-grygorii

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

* Re: [PATCH] gpio: zynq: Implement irq_(request|release)_resources
  2015-10-27 17:54       ` Grygorii Strashko
@ 2015-10-28 15:20         ` Linus Walleij
  0 siblings, 0 replies; 9+ messages in thread
From: Linus Walleij @ 2015-10-28 15:20 UTC (permalink / raw)
  To: Grygorii Strashko
  Cc: Soren Brinkmann, Alexandre Courbot, linux-kernel, linux-gpio,
	Michal Simek, linux-arm-kernel, John Linn

On Tue, Oct 27, 2015 at 6:54 PM, Grygorii Strashko
<grygorii.strashko@ti.com> wrote:
> [Me]
>> Do you mean that these functions contain calls to non-atomic
>> functions?
>>
>
> Oh. No, I have to be more specific :(
> if GPIOx driver defines custom .irq_(request|release)_resources() callbacks
> they will *overwrite* standard GPIOirqchip callbacks.
> (commit: 8b67a1f "gpio: don't override irq_*_resources() callbacks")
>
> As result, such GPIOx driver should *re-implement* the same functionality in
> its .irq_(request|release)_resources() callbacks as implemented in
> gpiochip_irq_reqres()/gpiochip_irq_relres().

Yes that goes for all drivers not using gpiochip_add_irqchip().
Not everyone uses that ... and for those supplying their own
implementations of these functions.

Yours,
Linus Walleij

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

* Re: [PATCH] gpio: zynq: Implement irq_(request|release)_resources
  2015-10-27 16:37   ` Lars-Peter Clausen
@ 2015-10-29 16:47     ` Sören Brinkmann
  2015-10-30 10:05     ` Thomas Gleixner
  1 sibling, 0 replies; 9+ messages in thread
From: Sören Brinkmann @ 2015-10-29 16:47 UTC (permalink / raw)
  To: Lars-Peter Clausen
  Cc: Linus Walleij, Alexandre Courbot, linux-kernel, linux-gpio,
	Michal Simek, linux-arm-kernel, John Linn, Grygorii Strashko,
	Thomas Gleixner

On Tue, 2015-10-27 at 05:37PM +0100, Lars-Peter Clausen wrote:
> On 10/27/2015 04:53 PM, Linus Walleij wrote:
> > On Fri, Oct 23, 2015 at 3:36 PM, Soren Brinkmann
> > <soren.brinkmann@xilinx.com> wrote:
> > 
> >> The driver uses runtime PM to leverage low power techniques. For
> >> use-cases using GPIO as interrupt the device needs to be in an
> >> appropriate state.
> >>
> >> Reported-by: John Linn <linnj@xilinx.com>
> >> Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
> >> Tested-by: John Linn <linnj@xilinx.com>
> > 
> > As pointed out by Grygorii in
> > commit aca82d1cbb49af34b69ecd4571a0fe48ad9247c1:
> > 
> >     The PM runtime API can't be used in atomic contex on -RT even if
> >     it's configured as irqsafe. As result, below error report can
> >     be seen when PM runtime API called from IRQ chip's callbacks
> >     irq_startup/irq_shutdown/irq_set_type, because they are
> >     protected by RAW spinlock:
> > (...)
> >     The IRQ chip interface defines only two callbacks which are executed in
> >     non-atomic contex - irq_bus_lock/irq_bus_sync_unlock, so lets move
> >     PM runtime calls there.
> > 
> > I.e. these calls are atomic context and it's just luck that it works
> > and this is fragile.
> > 
> > Can you please check if you can move it to
> > irq_bus_lock()/irq_sync_unlock()
> > like Grygorii does?
> 
> That only powers up the chip when the chip is accessed. For proper IRQ
> operation the chip needs to be powered up though as long as the IRQ is
> enabled. request_irq() and free_irq() must always be called from sleepable
> context. The thing is just that request_resource/release_resource are called
> from within a raw spinlock, which is necessary since otherwise you can't
> guarantee that they are only called once for shared interrupts.
> 
> It might make sense to add a separate set of callbacks to the irq_chip
> struct that are called from the sleepable sections of
> request_irq()/free_irq() which are meant for power management purposes and
> which wont have the guarantee that they are only called once for shared IRQs
> (but are still balanced).

Let me try to summarize what I've heard so far:
 - reqres/relres are called from atomic context, hence must not sleep
 - pm_runtime API must not be used from atomic context, even when the
   implementation of the callbacks does not sleep
 - when overriding regres/relres, a driver must re-implement the default
   behavior the core provides
 - bus lock/unlock is not sufficient for this case because it doesn't
   keep the device on as long as an IRQ is expected
 - a new pair of gpiochip ops might be helpful

Does that summarize the current situation correctly? If so, I'd tend to
agree with Lars that we might need another pair of callbacks in the
gpiochip struct.

	Thanks,
	Sören

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

* Re: [PATCH] gpio: zynq: Implement irq_(request|release)_resources
  2015-10-27 16:37   ` Lars-Peter Clausen
  2015-10-29 16:47     ` Sören Brinkmann
@ 2015-10-30 10:05     ` Thomas Gleixner
  1 sibling, 0 replies; 9+ messages in thread
From: Thomas Gleixner @ 2015-10-30 10:05 UTC (permalink / raw)
  To: Lars-Peter Clausen
  Cc: Linus Walleij, Soren Brinkmann, Alexandre Courbot, linux-kernel,
	linux-gpio, Michal Simek, linux-arm-kernel, John Linn,
	Grygorii Strashko

On Tue, 27 Oct 2015, Lars-Peter Clausen wrote:
> On 10/27/2015 04:53 PM, Linus Walleij wrote:
> > On Fri, Oct 23, 2015 at 3:36 PM, Soren Brinkmann
> > <soren.brinkmann@xilinx.com> wrote:
> > 
> >> The driver uses runtime PM to leverage low power techniques. For
> >> use-cases using GPIO as interrupt the device needs to be in an
> >> appropriate state.
> >>
> >> Reported-by: John Linn <linnj@xilinx.com>
> >> Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
> >> Tested-by: John Linn <linnj@xilinx.com>
> > 
> > As pointed out by Grygorii in
> > commit aca82d1cbb49af34b69ecd4571a0fe48ad9247c1:
> > 
> >     The PM runtime API can't be used in atomic contex on -RT even if
> >     it's configured as irqsafe. As result, below error report can
> >     be seen when PM runtime API called from IRQ chip's callbacks
> >     irq_startup/irq_shutdown/irq_set_type, because they are
> >     protected by RAW spinlock:
> > (...)
> >     The IRQ chip interface defines only two callbacks which are executed in
> >     non-atomic contex - irq_bus_lock/irq_bus_sync_unlock, so lets move
> >     PM runtime calls there.
> > 
> > I.e. these calls are atomic context and it's just luck that it works
> > and this is fragile.
> > 
> > Can you please check if you can move it to
> > irq_bus_lock()/irq_sync_unlock()
> > like Grygorii does?
> 
> That only powers up the chip when the chip is accessed. For proper IRQ
> operation the chip needs to be powered up though as long as the IRQ is
> enabled. request_irq() and free_irq() must always be called from sleepable
> context. The thing is just that request_resource/release_resource are called
> from within a raw spinlock, which is necessary since otherwise you can't
> guarantee that they are only called once for shared interrupts.
> 
> It might make sense to add a separate set of callbacks to the irq_chip
> struct that are called from the sleepable sections of
> request_irq()/free_irq() which are meant for power management purposes and
> which wont have the guarantee that they are only called once for shared IRQs
> (but are still balanced).
> 
> Thomas, do you have any thoughts on this?

If you want to keep the chip powered as long as an interrupt is
enabled, then having a irq chip callback might be the proper solution.

Thanks,

	tglx



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

end of thread, other threads:[~2015-10-30 10:05 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-23 13:36 [PATCH] gpio: zynq: Implement irq_(request|release)_resources Soren Brinkmann
2015-10-27 15:53 ` Linus Walleij
2015-10-27 16:18   ` Grygorii Strashko
2015-10-27 16:23     ` Linus Walleij
2015-10-27 17:54       ` Grygorii Strashko
2015-10-28 15:20         ` Linus Walleij
2015-10-27 16:37   ` Lars-Peter Clausen
2015-10-29 16:47     ` Sören Brinkmann
2015-10-30 10:05     ` Thomas Gleixner

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).