public inbox for linux-acpi@vger.kernel.org
 help / color / mirror / Atom feed
* [patch 0/2] PNPACPI: fix IRQ encoding problems
@ 2008-05-27 22:49 Bjorn Helgaas
  2008-05-27 22:49 ` [patch 1/2] PNPACPI: fix IRQ flag decoding Bjorn Helgaas
  2008-05-27 22:49 ` [patch 2/2] PNPACPI: fix shareable IRQ encode/decode Bjorn Helgaas
  0 siblings, 2 replies; 8+ messages in thread
From: Bjorn Helgaas @ 2008-05-27 22:49 UTC (permalink / raw)
  To: Len Brown
  Cc: linux-acpi, Adam Belay, Adam M Belay, Li Shaohua, Matthieu Castet,
	Thomas Renninger, Rene Herman, Andrew Morton, Tom Jaeger

These patches fix some IRQ encoding problems in PNPACPI.  I
don't have reports of people hitting these specific problems,
but they could easily cause hard-to-debug suspend/resume failures
or failures when enabling devices left disabled by the BIOS.

I think these changes should go into 2.6.26.

Bjorn
-- 

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

* [patch 1/2] PNPACPI: fix IRQ flag decoding
  2008-05-27 22:49 [patch 0/2] PNPACPI: fix IRQ encoding problems Bjorn Helgaas
@ 2008-05-27 22:49 ` Bjorn Helgaas
  2008-05-28 20:53   ` Rene Herman
  2008-05-27 22:49 ` [patch 2/2] PNPACPI: fix shareable IRQ encode/decode Bjorn Helgaas
  1 sibling, 1 reply; 8+ messages in thread
From: Bjorn Helgaas @ 2008-05-27 22:49 UTC (permalink / raw)
  To: Len Brown
  Cc: linux-acpi, Adam Belay, Adam M Belay, Li Shaohua, Matthieu Castet,
	Thomas Renninger, Rene Herman, Andrew Morton, Tom Jaeger

[-- Attachment #1: pnpacpi-fix-decode-irq --]
[-- Type: text/plain, Size: 2644 bytes --]

When decoding IRQ trigger mode and polarity, it is not enough
to mask by IORESOURCE_BITS because there are now additional
bits defined.  For example, if IORESOURCE_IRQ_SHAREABLE
was set, we failed to set *triggering and *polarity at all.

I can't point to a failure that this patch fixes, but
bugs in this area have caused problems when resuming after
suspend, for example:
    http://bugzilla.kernel.org/show_bug.cgi?id=6316
    http://bugzilla.kernel.org/show_bug.cgi?id=9487
    https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.22/+bug/152187

This is based on a patch by Tom Jaeger <ThJaeger@gmail.com>:
    http://bugzilla.kernel.org/show_bug.cgi?id=9487#c32

Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>

Index: work11/drivers/pnp/pnpacpi/rsparser.c
===================================================================
--- work11.orig/drivers/pnp/pnpacpi/rsparser.c	2008-05-27 15:50:04.000000000 -0600
+++ work11/drivers/pnp/pnpacpi/rsparser.c	2008-05-27 15:53:21.000000000 -0600
@@ -56,9 +56,11 @@ static int irq_flags(int triggering, int
 	return flags;
 }
 
-static void decode_irq_flags(int flag, int *triggering, int *polarity)
+static void decode_irq_flags(struct pnp_dev *dev, int flags, int *triggering,
+			     int *polarity)
 {
-	switch (flag) {
+	switch (flags & (IORESOURCE_IRQ_LOWLEVEL | IORESOURCE_IRQ_HIGHLEVEL |
+			 IORESOURCE_IRQ_LOWEDGE  | IORESOURCE_IRQ_HIGHEDGE)) {
 	case IORESOURCE_IRQ_LOWLEVEL:
 		*triggering = ACPI_LEVEL_SENSITIVE;
 		*polarity = ACPI_ACTIVE_LOW;
@@ -75,6 +77,12 @@ static void decode_irq_flags(int flag, i
 		*triggering = ACPI_EDGE_SENSITIVE;
 		*polarity = ACPI_ACTIVE_HIGH;
 		break;
+	default:
+		dev_err(&dev->dev, "can't encode invalid IRQ mode %#x\n",
+			flags);
+		*triggering = ACPI_EDGE_SENSITIVE;
+		*polarity = ACPI_ACTIVE_HIGH;
+		break;
 	}
 }
 
@@ -793,7 +801,7 @@ static void pnpacpi_encode_irq(struct pn
 	struct acpi_resource_irq *irq = &resource->data.irq;
 	int triggering, polarity;
 
-	decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering, &polarity);
+	decode_irq_flags(dev, p->flags, &triggering, &polarity);
 	irq->triggering = triggering;
 	irq->polarity = polarity;
 	if (triggering == ACPI_EDGE_SENSITIVE)
@@ -818,7 +826,7 @@ static void pnpacpi_encode_ext_irq(struc
 	struct acpi_resource_extended_irq *extended_irq = &resource->data.extended_irq;
 	int triggering, polarity;
 
-	decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering, &polarity);
+	decode_irq_flags(dev, p->flags, &triggering, &polarity);
 	extended_irq->producer_consumer = ACPI_CONSUMER;
 	extended_irq->triggering = triggering;
 	extended_irq->polarity = polarity;

-- 

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

* [patch 2/2] PNPACPI: fix shareable IRQ encode/decode
  2008-05-27 22:49 [patch 0/2] PNPACPI: fix IRQ encoding problems Bjorn Helgaas
  2008-05-27 22:49 ` [patch 1/2] PNPACPI: fix IRQ flag decoding Bjorn Helgaas
@ 2008-05-27 22:49 ` Bjorn Helgaas
  2008-05-28 20:58   ` Rene Herman
  1 sibling, 1 reply; 8+ messages in thread
From: Bjorn Helgaas @ 2008-05-27 22:49 UTC (permalink / raw)
  To: Len Brown
  Cc: linux-acpi, Adam Belay, Adam M Belay, Li Shaohua, Matthieu Castet,
	Thomas Renninger, Rene Herman, Andrew Morton, Tom Jaeger

[-- Attachment #1: pnpacpi-encode-irq --]
[-- Type: text/plain, Size: 2742 bytes --]

When we encode IRQ resources, we should use the "shareable"
flag we got from _PRS rather than guessing based on the
IRQ trigger mode.

This is based on a patch by Tom Jaeger <ThJaeger@gmail.com>:
    http://bugzilla.kernel.org/show_bug.cgi?id=9487#c32

Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>

Index: work11/drivers/pnp/pnpacpi/rsparser.c
===================================================================
--- work11.orig/drivers/pnp/pnpacpi/rsparser.c	2008-05-27 15:53:21.000000000 -0600
+++ work11/drivers/pnp/pnpacpi/rsparser.c	2008-05-27 15:58:29.000000000 -0600
@@ -50,14 +50,14 @@ static int irq_flags(int triggering, int
 			flags = IORESOURCE_IRQ_HIGHEDGE;
 	}
 
-	if (shareable)
+	if (shareable == ACPI_SHARED)
 		flags |= IORESOURCE_IRQ_SHAREABLE;
 
 	return flags;
 }
 
 static void decode_irq_flags(struct pnp_dev *dev, int flags, int *triggering,
-			     int *polarity)
+			     int *polarity, int *shareable)
 {
 	switch (flags & (IORESOURCE_IRQ_LOWLEVEL | IORESOURCE_IRQ_HIGHLEVEL |
 			 IORESOURCE_IRQ_LOWEDGE  | IORESOURCE_IRQ_HIGHEDGE)) {
@@ -84,6 +84,11 @@ static void decode_irq_flags(struct pnp_
 		*polarity = ACPI_ACTIVE_HIGH;
 		break;
 	}
+
+	if (flags & IORESOURCE_IRQ_SHAREABLE)
+		*shareable = ACPI_SHARED;
+	else
+		*shareable = ACPI_EXCLUSIVE;
 }
 
 static void pnpacpi_parse_allocated_irqresource(struct pnp_dev *dev,
@@ -799,15 +804,12 @@ static void pnpacpi_encode_irq(struct pn
 			       struct resource *p)
 {
 	struct acpi_resource_irq *irq = &resource->data.irq;
-	int triggering, polarity;
+	int triggering, polarity, shareable;
 
-	decode_irq_flags(dev, p->flags, &triggering, &polarity);
+	decode_irq_flags(dev, p->flags, &triggering, &polarity, &shareable);
 	irq->triggering = triggering;
 	irq->polarity = polarity;
-	if (triggering == ACPI_EDGE_SENSITIVE)
-		irq->sharable = ACPI_EXCLUSIVE;
-	else
-		irq->sharable = ACPI_SHARED;
+	irq->sharable = shareable;
 	irq->interrupt_count = 1;
 	irq->interrupts[0] = p->start;
 
@@ -824,16 +826,13 @@ static void pnpacpi_encode_ext_irq(struc
 				   struct resource *p)
 {
 	struct acpi_resource_extended_irq *extended_irq = &resource->data.extended_irq;
-	int triggering, polarity;
+	int triggering, polarity, shareable;
 
-	decode_irq_flags(dev, p->flags, &triggering, &polarity);
+	decode_irq_flags(dev, p->flags, &triggering, &polarity, &shareable);
 	extended_irq->producer_consumer = ACPI_CONSUMER;
 	extended_irq->triggering = triggering;
 	extended_irq->polarity = polarity;
-	if (triggering == ACPI_EDGE_SENSITIVE)
-		extended_irq->sharable = ACPI_EXCLUSIVE;
-	else
-		extended_irq->sharable = ACPI_SHARED;
+	extended_irq->sharable = shareable;
 	extended_irq->interrupt_count = 1;
 	extended_irq->interrupts[0] = p->start;
 

-- 

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

* Re: [patch 1/2] PNPACPI: fix IRQ flag decoding
  2008-05-27 22:49 ` [patch 1/2] PNPACPI: fix IRQ flag decoding Bjorn Helgaas
@ 2008-05-28 20:53   ` Rene Herman
  0 siblings, 0 replies; 8+ messages in thread
From: Rene Herman @ 2008-05-28 20:53 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: Len Brown, linux-acpi, Adam Belay, Adam M Belay, Li Shaohua,
	Matthieu Castet, Thomas Renninger, Andrew Morton, Tom Jaeger

[-- Attachment #1: Type: text/plain, Size: 355 bytes --]

On 28-05-08 00:49, Bjorn Helgaas wrote:

> When decoding IRQ trigger mode and polarity, it is not enough to mask
> by IORESOURCE_BITS because there are now additional bits defined.
> For example, if IORESOURCE_IRQ_SHAREABLE was set, we failed to set
> *triggering and *polarity at all.

Ack. This would also imply the attached is a comment fix...

Rene.


[-- Attachment #2: pnp-non-isa-specific-ioresource_bits.diff --]
[-- Type: text/plain, Size: 1285 bytes --]

diff --git a/include/linux/ioport.h b/include/linux/ioport.h
index d5d40a9..c6801bf 100644
--- a/include/linux/ioport.h
+++ b/include/linux/ioport.h
@@ -53,14 +53,14 @@ struct resource_list {
 #define IORESOURCE_AUTO		0x40000000
 #define IORESOURCE_BUSY		0x80000000	/* Driver has marked this resource busy */
 
-/* ISA PnP IRQ specific bits (IORESOURCE_BITS) */
+/* PnP IRQ specific bits (IORESOURCE_BITS) */
 #define IORESOURCE_IRQ_HIGHEDGE		(1<<0)
 #define IORESOURCE_IRQ_LOWEDGE		(1<<1)
 #define IORESOURCE_IRQ_HIGHLEVEL	(1<<2)
 #define IORESOURCE_IRQ_LOWLEVEL		(1<<3)
 #define IORESOURCE_IRQ_SHAREABLE	(1<<4)
 
-/* ISA PnP DMA specific bits (IORESOURCE_BITS) */
+/* PnP DMA specific bits (IORESOURCE_BITS) */
 #define IORESOURCE_DMA_TYPE_MASK	(3<<0)
 #define IORESOURCE_DMA_8BIT		(0<<0)
 #define IORESOURCE_DMA_8AND16BIT	(1<<0)
@@ -76,7 +76,7 @@ struct resource_list {
 #define IORESOURCE_DMA_TYPEB		(2<<6)
 #define IORESOURCE_DMA_TYPEF		(3<<6)
 
-/* ISA PnP memory I/O specific bits (IORESOURCE_BITS) */
+/* PnP memory I/O specific bits (IORESOURCE_BITS) */
 #define IORESOURCE_MEM_WRITEABLE	(1<<0)	/* dup: IORESOURCE_READONLY */
 #define IORESOURCE_MEM_CACHEABLE	(1<<1)	/* dup: IORESOURCE_CACHEABLE */
 #define IORESOURCE_MEM_RANGELENGTH	(1<<2)	/* dup: IORESOURCE_RANGELENGTH */

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

* Re: [patch 2/2] PNPACPI: fix shareable IRQ encode/decode
  2008-05-27 22:49 ` [patch 2/2] PNPACPI: fix shareable IRQ encode/decode Bjorn Helgaas
@ 2008-05-28 20:58   ` Rene Herman
  2008-05-28 22:05     ` Bjorn Helgaas
  0 siblings, 1 reply; 8+ messages in thread
From: Rene Herman @ 2008-05-28 20:58 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: Len Brown, linux-acpi, Adam Belay, Adam M Belay, Li Shaohua,
	Matthieu Castet, Thomas Renninger, Andrew Morton, Tom Jaeger

On 28-05-08 00:49, Bjorn Helgaas wrote:

> When we encode IRQ resources, we should use the "shareable"
> flag we got from _PRS rather than guessing based on the
> IRQ trigger mode.
> 
> This is based on a patch by Tom Jaeger <ThJaeger@gmail.com>:
>     http://bugzilla.kernel.org/show_bug.cgi?id=9487#c32
> 
> Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>

Not-commented-on-by: Rene Herman <rene.herman@gmail.com>

Makes sense patchwise but one would expect that it wasn't that way to 
start with due to perhaps some/many/most BIOSen not encoding the flag 
correctly in _PRS. Don't know ACPI though...

Rene.

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

* Re: [patch 2/2] PNPACPI: fix shareable IRQ encode/decode
  2008-05-28 20:58   ` Rene Herman
@ 2008-05-28 22:05     ` Bjorn Helgaas
  2008-05-28 23:14       ` Rene Herman
  0 siblings, 1 reply; 8+ messages in thread
From: Bjorn Helgaas @ 2008-05-28 22:05 UTC (permalink / raw)
  To: Rene Herman
  Cc: Len Brown, linux-acpi, Adam Belay, Adam M Belay, Li Shaohua,
	Matthieu Castet, Thomas Renninger, Andrew Morton, Tom Jaeger

On Wednesday 28 May 2008 02:58:47 pm Rene Herman wrote:
> On 28-05-08 00:49, Bjorn Helgaas wrote:
> 
> > When we encode IRQ resources, we should use the "shareable"
> > flag we got from _PRS rather than guessing based on the
> > IRQ trigger mode.
> > 
> > This is based on a patch by Tom Jaeger <ThJaeger@gmail.com>:
> >     http://bugzilla.kernel.org/show_bug.cgi?id=9487#c32
> > 
> > Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
> 
> Not-commented-on-by: Rene Herman <rene.herman@gmail.com>
> 
> Makes sense patchwise but one would expect that it wasn't that way to 
> start with due to perhaps some/many/most BIOSen not encoding the flag 
> correctly in _PRS. Don't know ACPI though...

I added IORESOURCE_IRQ_SHAREABLE recently:
  http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=c32928c579d88acd43981b59e86900da65f40762

and I just didn't notice these places at the time.  If I had,
I would have made this change then.  It's possible we could
trip over a BIOS issue, but I don't *think* that's why it's
been this way in the past.

Bjorn

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

* Re: [patch 2/2] PNPACPI: fix shareable IRQ encode/decode
  2008-05-28 22:05     ` Bjorn Helgaas
@ 2008-05-28 23:14       ` Rene Herman
  2008-05-29 14:41         ` Bjorn Helgaas
  0 siblings, 1 reply; 8+ messages in thread
From: Rene Herman @ 2008-05-28 23:14 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: Len Brown, linux-acpi, Adam Belay, Adam M Belay, Li Shaohua,
	Matthieu Castet, Thomas Renninger, Andrew Morton, Tom Jaeger

On 29-05-08 00:05, Bjorn Helgaas wrote:

> On Wednesday 28 May 2008 02:58:47 pm Rene Herman wrote:
>> On 28-05-08 00:49, Bjorn Helgaas wrote:
>>
>>> When we encode IRQ resources, we should use the "shareable"
>>> flag we got from _PRS rather than guessing based on the
>>> IRQ trigger mode.
>>>
>>> This is based on a patch by Tom Jaeger <ThJaeger@gmail.com>:
>>>     http://bugzilla.kernel.org/show_bug.cgi?id=9487#c32
>>>
>>> Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
>> Not-commented-on-by: Rene Herman <rene.herman@gmail.com>
>>
>> Makes sense patchwise but one would expect that it wasn't that way to 
>> start with due to perhaps some/many/most BIOSen not encoding the flag 
>> correctly in _PRS. Don't know ACPI though...
> 
> I added IORESOURCE_IRQ_SHAREABLE recently:
>   http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=c32928c579d88acd43981b59e86900da65f40762
> 
> and I just didn't notice these places at the time.  If I had,
> I would have made this change then.  It's possible we could
> trip over a BIOS issue, but I don't *think* that's why it's
> been this way in the past.

Ah, I see. Was likely just a matter of originally not having a place to 
stash it then (by the way, time flies; "recently" is almost two years 
ago...)

Rene.

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

* Re: [patch 2/2] PNPACPI: fix shareable IRQ encode/decode
  2008-05-28 23:14       ` Rene Herman
@ 2008-05-29 14:41         ` Bjorn Helgaas
  0 siblings, 0 replies; 8+ messages in thread
From: Bjorn Helgaas @ 2008-05-29 14:41 UTC (permalink / raw)
  To: Rene Herman
  Cc: Len Brown, linux-acpi, Adam Belay, Adam M Belay, Li Shaohua,
	Matthieu Castet, Thomas Renninger, Andrew Morton, Tom Jaeger

On Wednesday 28 May 2008 05:14:49 pm Rene Herman wrote:
> On 29-05-08 00:05, Bjorn Helgaas wrote:
> 
> > On Wednesday 28 May 2008 02:58:47 pm Rene Herman wrote:
> >> On 28-05-08 00:49, Bjorn Helgaas wrote:
> >>
> >>> When we encode IRQ resources, we should use the "shareable"
> >>> flag we got from _PRS rather than guessing based on the
> >>> IRQ trigger mode.
> >>>
> >>> This is based on a patch by Tom Jaeger <ThJaeger@gmail.com>:
> >>>     http://bugzilla.kernel.org/show_bug.cgi?id=9487#c32
> >>>
> >>> Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
> >> Not-commented-on-by: Rene Herman <rene.herman@gmail.com>
> >>
> >> Makes sense patchwise but one would expect that it wasn't that way to 
> >> start with due to perhaps some/many/most BIOSen not encoding the flag 
> >> correctly in _PRS. Don't know ACPI though...
> > 
> > I added IORESOURCE_IRQ_SHAREABLE recently:
> >   http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=c32928c579d88acd43981b59e86900da65f40762
> > 
> > and I just didn't notice these places at the time.  If I had,
> > I would have made this change then.  It's possible we could
> > trip over a BIOS issue, but I don't *think* that's why it's
> > been this way in the past.
> 
> Ah, I see. Was likely just a matter of originally not having a place to 
> stash it then (by the way, time flies; "recently" is almost two years 
> ago...)

Yep.  Time does fly when you're having fun :-)


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

end of thread, other threads:[~2008-05-29 14:41 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-05-27 22:49 [patch 0/2] PNPACPI: fix IRQ encoding problems Bjorn Helgaas
2008-05-27 22:49 ` [patch 1/2] PNPACPI: fix IRQ flag decoding Bjorn Helgaas
2008-05-28 20:53   ` Rene Herman
2008-05-27 22:49 ` [patch 2/2] PNPACPI: fix shareable IRQ encode/decode Bjorn Helgaas
2008-05-28 20:58   ` Rene Herman
2008-05-28 22:05     ` Bjorn Helgaas
2008-05-28 23:14       ` Rene Herman
2008-05-29 14:41         ` Bjorn Helgaas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox