* about cs5536 interrupt ack
@ 2007-07-11 9:36 Songmao Tian
2007-07-11 13:24 ` Maciej W. Rozycki
2007-07-11 15:22 ` Sergei Shtylyov
0 siblings, 2 replies; 13+ messages in thread
From: Songmao Tian @ 2007-07-11 9:36 UTC (permalink / raw)
To: LinuxBIOS Mailing List, marc.jones, linux-kernel, linux-mips
Hi,
I am trying to use a mips cpu the cs5536. I have some problem with
the 8259 of cs5536. The databook said,
"Control Logic
The INT output goes directly to the CPU interrupt input.
When an INT signal is activated, the CPU responds with an
Interrupt Acknowledge access that is translated to two
pulses on the INTA input of the PIC. At the first INTA pulse,
the highest priority IRR bit is loaded into the corresponding
ISR bit, and that IRR bit is reset. The second INTA pulse
instructs the PIC to present the 8-bit vector of the interrupt
handler onto the data bus."
Is it the responsibility of north bridge to reponse to intr with a PCI
Interrupt Ack cycle?
it's a problem that my northbridge didn't implement that! Fortunately we
use a fpga as a northbridge.
it seem it's no way to fix this by software, for OCW3 didn't implemnt
Poll command:(
so I guess the the process is:
1) 8259 receive a int, a bit irr got set.
2) 8259 assert intr.
3) northbrige generate a int ack cycle.
4) cs5536 translate the ack into two INTA pulse, and the reponse
northbridge with a interrupt vector.
5) then my program can get the vector from northbridge?
Is that right?
Without int ack, generic linux-mips 8259 code can't work.
Greetings,
Tian
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: about cs5536 interrupt ack
2007-07-11 9:36 about cs5536 interrupt ack Songmao Tian
@ 2007-07-11 13:24 ` Maciej W. Rozycki
2007-07-11 15:19 ` Songmao Tian
2007-07-11 15:42 ` Sergei Shtylyov
2007-07-11 15:22 ` Sergei Shtylyov
1 sibling, 2 replies; 13+ messages in thread
From: Maciej W. Rozycki @ 2007-07-11 13:24 UTC (permalink / raw)
To: Songmao Tian; +Cc: LinuxBIOS Mailing List, marc.jones, linux-kernel, linux-mips
On Wed, 11 Jul 2007, Songmao Tian wrote:
> "Control Logic
> The INT output goes directly to the CPU interrupt input.
> When an INT signal is activated, the CPU responds with an
> Interrupt Acknowledge access that is translated to two
> pulses on the INTA input of the PIC. At the first INTA pulse,
> the highest priority IRR bit is loaded into the corresponding
> ISR bit, and that IRR bit is reset. The second INTA pulse
> instructs the PIC to present the 8-bit vector of the interrupt
> handler onto the data bus."
>
> Is it the responsibility of north bridge to reponse to intr with a PCI
> Interrupt Ack cycle?
With an i386 system such a pair of INTA cycles would be generated by the
CPU itself and translated by the north bridge to a PCI Interrupt
Acknowledge cycle (see the PCI spec for a more elaborate description).
If the CPU does not generate INTA cycles, it is a common practice to let
it ask the north bridge for a PCI Interrupt Acknowledge in some other way,
typically by issuing a read cycle that returns the vector reported by the
interrupt controller.
> it's a problem that my northbridge didn't implement that! Fortunately we use a
> fpga as a northbridge.
>
> it seem it's no way to fix this by software, for OCW3 didn't implemnt Poll
> command:(
Huh? Have you managed to find an 8259A clone *that* broken? So what
does it return if you write 0xc to the address 0x20 in the I/O port space
and then read back from that location? You should complain to the
manufacturer -- they may be able to fix the problem in a later revision.
BTW, I have just found a bug (OK, a misfeature, perhaps) in
include/asm-mips/i8259.h. ;-) I'll cook a patch.
> so I guess the the process is:
> 1) 8259 receive a int, a bit irr got set.
> 2) 8259 assert intr.
> 3) northbrige generate a int ack cycle.
> 4) cs5536 translate the ack into two INTA pulse, and the reponse northbridge
> with a interrupt vector.
> 5) then my program can get the vector from northbridge?
>
> Is that right?
More or less -- 3-5 should probably be the outcome of a single read
transaction from the north bridge. I.e. you issue a read to a "magic"
location, 3-5 happen, and the data value returned is the vector presented
by the interrupt controller on the PCI bus.
> Without int ack, generic linux-mips 8259 code can't work.
You can still dispatch interrupts manually by examining the IRR register,
but having a way to ask the 8259A's prioritiser would be nice. Although
given such a lethal erratum you report I would not count on the
prioritiser to provide any useful flexibility...
Maciej
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: about cs5536 interrupt ack
2007-07-11 13:24 ` Maciej W. Rozycki
@ 2007-07-11 15:19 ` Songmao Tian
2007-07-11 15:38 ` Songmao Tian
2007-07-11 15:48 ` Maciej W. Rozycki
2007-07-11 15:42 ` Sergei Shtylyov
1 sibling, 2 replies; 13+ messages in thread
From: Songmao Tian @ 2007-07-11 15:19 UTC (permalink / raw)
To: Maciej W. Rozycki
Cc: LinuxBIOS Mailing List, marc.jones, linux-kernel, linux-mips
Before I post the mail, I think you will reply, and haha you did:),
Thanks that.
Maciej W. Rozycki wrote:
> On Wed, 11 Jul 2007, Songmao Tian wrote:
>
>
>> "Control Logic
>> The INT output goes directly to the CPU interrupt input.
>> When an INT signal is activated, the CPU responds with an
>> Interrupt Acknowledge access that is translated to two
>> pulses on the INTA input of the PIC. At the first INTA pulse,
>> the highest priority IRR bit is loaded into the corresponding
>> ISR bit, and that IRR bit is reset. The second INTA pulse
>> instructs the PIC to present the 8-bit vector of the interrupt
>> handler onto the data bus."
>>
>> Is it the responsibility of north bridge to reponse to intr with a PCI
>> Interrupt Ack cycle?
>>
>
> With an i386 system such a pair of INTA cycles would be generated by the
> CPU itself and translated by the north bridge to a PCI Interrupt
> Acknowledge cycle (see the PCI spec for a more elaborate description).
>
> If the CPU does not generate INTA cycles, it is a common practice to let
> it ask the north bridge for a PCI Interrupt Acknowledge in some other way,
> typically by issuing a read cycle that returns the vector reported by the
> interrupt controller.
>
>
>> it's a problem that my northbridge didn't implement that! Fortunately we use a
>> fpga as a northbridge.
>>
>> it seem it's no way to fix this by software, for OCW3 didn't implemnt Poll
>> command:(
>>
>
> Huh? Have you managed to find an 8259A clone *that* broken? So what
> does it return if you write 0xc to the address 0x20 in the I/O port space
> and then read back from that location? You should complain to the
>
It's the value of IRR, so guess IRR. AMD has well documented cs5536, I
appreciate that.
> manufacturer -- they may be able to fix the problem in a later revision.
>
> BTW, I have just found a bug (OK, a misfeature, perhaps) in
> include/asm-mips/i8259.h. ;-) I'll cook a patch.
>
>
>> so I guess the the process is:
>> 1) 8259 receive a int, a bit irr got set.
>> 2) 8259 assert intr.
>> 3) northbrige generate a int ack cycle.
>> 4) cs5536 translate the ack into two INTA pulse, and the reponse northbridge
>> with a interrupt vector.
>> 5) then my program can get the vector from northbridge?
>>
>> Is that right?
>>
>
> More or less -- 3-5 should probably be the outcome of a single read
> transaction from the north bridge. I.e. you issue a read to a "magic"
> location, 3-5 happen, and the data value returned is the vector presented
> by the interrupt controller on the PCI bus.
>
yeah, we can implement a register in north bridge.
>
>> Without int ack, generic linux-mips 8259 code can't work.
>>
>
> You can still dispatch interrupts manually by examining the IRR register,
> but having a way to ask the 8259A's prioritiser would be nice. Although
> given such a lethal erratum you report I would not count on the
> prioritiser to provide any useful flexibility...
>
yeah, that's a straight thought, tried but failed:(, patch followed.
> Maciej
>
>
>
diff --git a/include/asm-mips/i8259.h b/include/asm-mips/i8259.h
index e88a016..38628af 100644
--- a/include/asm-mips/i8259.h
+++ b/include/asm-mips/i8259.h
@@ -42,6 +42,37 @@ extern void enable_8259A_irq(unsigned int irq);
extern void disable_8259A_irq(unsigned int irq);
extern void init_i8259_irqs(void);
+#define CONFIG_NO_INTERRUPT_ACK
+#ifdef CONFIG_NO_INTERRUPT_ACK
+static inline int _byte_ffs(u8 word)
+{
+ int num = 0;
+ if ((word & 0xf) == 0) {
+ num += 4;
+ word >>= 4;
+ }
+ if ((word & 0x3) == 0) {
+ num += 2;
+ word >>= 2;
+ }
+ if ((word & 0x1) == 0)
+ num += 1;
+ return num;
+}
+
+static inline int read_irq(int port)
+{
+ outb(0x0A, port);
+ return _byte_ffs(inb(port));
+}
+#else
+static inline int read_irq(int port)
+{
+ /* Perform an interrupt acknowledge cycle on controller 1. */
+ outb(0x0C, port); /* prepare for poll */
+ return inb(port) & 7;
+}
+#endif
/*
* Do the traditional i8259 interrupt polling thing. This is for the few
@@ -54,18 +85,16 @@ static inline int i8259_irq(void)
spin_lock(&i8259A_lock);
- /* Perform an interrupt acknowledge cycle on controller 1. */
- outb(0x0C, PIC_MASTER_CMD); /* prepare for poll */
- irq = inb(PIC_MASTER_CMD) & 7;
+ irq = read_irq(PIC_MASTER_CMD);
+
if (irq == PIC_CASCADE_IR) {
/*
* Interrupt is cascaded so perform interrupt
* acknowledge on controller 2.
*/
- outb(0x0C, PIC_SLAVE_CMD); /* prepare for poll */
- irq = (inb(PIC_SLAVE_CMD) & 7) + 8;
- }
-
+ irq = read_irq(PIC_SLAVE_CMD) + 8;
+ }
+#ifndef CONFIG_NO_INTERRUPT_ACK
if (unlikely(irq == 7)) {
/*
* This may be a spurious interrupt.
@@ -78,7 +107,7 @@ static inline int i8259_irq(void)
if(~inb(PIC_MASTER_ISR) & 0x80)
irq = -1;
}
-
+#endif
spin_unlock(&i8259A_lock);
return likely(irq >= 0) ? irq + I8259A_IRQ_BASE : irq;
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: about cs5536 interrupt ack
2007-07-11 9:36 about cs5536 interrupt ack Songmao Tian
2007-07-11 13:24 ` Maciej W. Rozycki
@ 2007-07-11 15:22 ` Sergei Shtylyov
2007-07-11 15:31 ` Sergei Shtylyov
1 sibling, 1 reply; 13+ messages in thread
From: Sergei Shtylyov @ 2007-07-11 15:22 UTC (permalink / raw)
To: Songmao Tian; +Cc: linuxbios, marc.jones, linux-kernel, linux-mips
Songmao Tian wrote:
> Hi,
> I am trying to use a mips cpu the cs5536. I have some problem with
> the 8259 of cs5536. The databook said,
Which databook?
> "Control Logic
> The INT output goes directly to the CPU interrupt input.
> When an INT signal is activated, the CPU responds with an
> Interrupt Acknowledge access that is translated to two
> pulses on the INTA input of the PIC. At the first INTA pulse,
> the highest priority IRR bit is loaded into the corresponding
> ISR bit, and that IRR bit is reset. The second INTA pulse
> instructs the PIC to present the 8-bit vector of the interrupt
> handler onto the data bus."
> Is it the responsibility of north bridge to reponse to intr with a PCI
> Interrupt Ack cycle?
> it's a problem that my northbridge didn't implement that! Fortunately we
> use a fpga as a northbridge.
Wait, CS5536 is a nortbridge itself!
> it seem it's no way to fix this by software, for OCW3 didn't implemnt
> Poll command:(
Quite a few 8259 clones don't.
> so I guess the the process is:
> 1) 8259 receive a int, a bit irr got set.
> 2) 8259 assert intr.
> 3) northbrige generate a int ack cycle.
To what, PCI?
> 4) cs5536 translate the ack into two INTA pulse, and the reponse
Nonsense. It would only make sense to translate INTA cycles from CPU bus
to the PCI bus, not the other way around.
> northbridge with a interrupt vector.
As I said, CS5536 is northbridge in itself.
> 5) then my program can get the vector from northbridge?
It's CPU that gets the vector, your program could only do this using poll
comand which as
> Is that right?
No.
> Without int ack, generic linux-mips 8259 code can't work.
I'm compleetly lost here -- what does CS5536 has to do with MIPS?
> Greetings,
> Tian
WBR, Sergei
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: about cs5536 interrupt ack
2007-07-11 15:22 ` Sergei Shtylyov
@ 2007-07-11 15:31 ` Sergei Shtylyov
2007-07-11 15:35 ` Songmao Tian
0 siblings, 1 reply; 13+ messages in thread
From: Sergei Shtylyov @ 2007-07-11 15:31 UTC (permalink / raw)
To: Sergei Shtylyov
Cc: Songmao Tian, linuxbios, marc.jones, linux-kernel, linux-mips
Hello, I wrote:
>> it's a problem that my northbridge didn't implement that! Fortunately
>> we use a fpga as a northbridge.
> Wait, CS5536 is a nortbridge itself!
Apparently, it's only a south bridge. I must've mixed it with Geode itself.
WBR, Sergei
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: about cs5536 interrupt ack
2007-07-11 15:31 ` Sergei Shtylyov
@ 2007-07-11 15:35 ` Songmao Tian
0 siblings, 0 replies; 13+ messages in thread
From: Songmao Tian @ 2007-07-11 15:35 UTC (permalink / raw)
To: Sergei Shtylyov; +Cc: linuxbios, marc.jones, linux-kernel, linux-mips
Sergei Shtylyov wrote:
> Hello, I wrote:
>
>>> it's a problem that my northbridge didn't implement that!
>>> Fortunately we use a fpga as a northbridge.
>
>> Wait, CS5536 is a nortbridge itself!
>
> Apparently, it's only a south bridge. I must've mixed it with Geode
> itself.
>
> WBR, Sergei
>
>
that's fine:)
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: about cs5536 interrupt ack
2007-07-11 15:19 ` Songmao Tian
@ 2007-07-11 15:38 ` Songmao Tian
2007-07-11 15:48 ` Maciej W. Rozycki
1 sibling, 0 replies; 13+ messages in thread
From: Songmao Tian @ 2007-07-11 15:38 UTC (permalink / raw)
To: Songmao Tian
Cc: Maciej W. Rozycki, LinuxBIOS Mailing List, marc.jones,
linux-kernel, linux-mips
Songmao Tian wrote:
> Before I post the mail, I think you will reply, and haha you did:),
> Thanks that.
>
> Maciej W. Rozycki wrote:
>> On Wed, 11 Jul 2007, Songmao Tian wrote:
>>
>>
>>> "Control Logic
>>> The INT output goes directly to the CPU interrupt input.
>>> When an INT signal is activated, the CPU responds with an
>>> Interrupt Acknowledge access that is translated to two
>>> pulses on the INTA input of the PIC. At the first INTA pulse,
>>> the highest priority IRR bit is loaded into the corresponding
>>> ISR bit, and that IRR bit is reset. The second INTA pulse
>>> instructs the PIC to present the 8-bit vector of the interrupt
>>> handler onto the data bus."
>>>
>>> Is it the responsibility of north bridge to reponse to intr with a PCI
>>> Interrupt Ack cycle?
>>>
>>
>> With an i386 system such a pair of INTA cycles would be generated by
>> the CPU itself and translated by the north bridge to a PCI Interrupt
>> Acknowledge cycle (see the PCI spec for a more elaborate description).
>>
>> If the CPU does not generate INTA cycles, it is a common practice to
>> let it ask the north bridge for a PCI Interrupt Acknowledge in some
>> other way, typically by issuing a read cycle that returns the vector
>> reported by the interrupt controller.
>>
>>
>>> it's a problem that my northbridge didn't implement that!
>>> Fortunately we use a
>>> fpga as a northbridge.
>>>
>>> it seem it's no way to fix this by software, for OCW3 didn't
>>> implemnt Poll
>>> command:(
>>>
>>
>> Huh? Have you managed to find an 8259A clone *that* broken? So
>> what does it return if you write 0xc to the address 0x20 in the I/O
>> port space and then read back from that location? You should
>> complain to the
>
> It's the value of IRR, so guess IRR. AMD has well documented cs5536, I
> appreciate that.
>
>> manufacturer -- they may be able to fix the problem in a later revision.
>>
>> BTW, I have just found a bug (OK, a misfeature, perhaps) in
>> include/asm-mips/i8259.h. ;-) I'll cook a patch.
>>
>>
>>> so I guess the the process is:
>>> 1) 8259 receive a int, a bit irr got set.
>>> 2) 8259 assert intr.
>>> 3) northbrige generate a int ack cycle.
>>> 4) cs5536 translate the ack into two INTA pulse, and the reponse
>>> northbridge
>>> with a interrupt vector.
>>> 5) then my program can get the vector from northbridge?
>>>
>>> Is that right?
>>>
>>
>> More or less -- 3-5 should probably be the outcome of a single read
>> transaction from the north bridge. I.e. you issue a read to a
>> "magic" location, 3-5 happen, and the data value returned is the
>> vector presented by the interrupt controller on the PCI bus.
>>
> yeah, we can implement a register in north bridge.
>>
>>> Without int ack, generic linux-mips 8259 code can't work.
>>>
>>
>> You can still dispatch interrupts manually by examining the IRR
>> register, but having a way to ask the 8259A's prioritiser would be
>> nice. Although given such a lethal erratum you report I would not
>> count on the prioritiser to provide any useful flexibility...
>>
> yeah, that's a straight thought, tried but failed:(, patch followed.
>
>> Maciej
>>
>>
>>
> diff --git a/include/asm-mips/i8259.h b/include/asm-mips/i8259.h
> index e88a016..38628af 100644
> --- a/include/asm-mips/i8259.h
> +++ b/include/asm-mips/i8259.h
> @@ -42,6 +42,37 @@ extern void enable_8259A_irq(unsigned int irq);
> extern void disable_8259A_irq(unsigned int irq);
>
> extern void init_i8259_irqs(void);
> +#define CONFIG_NO_INTERRUPT_ACK
> +#ifdef CONFIG_NO_INTERRUPT_ACK
> +static inline int _byte_ffs(u8 word)
> +{
> + int num = 0;
> + if ((word & 0xf) == 0) {
> + num += 4;
> + word >>= 4;
> + }
> + if ((word & 0x3) == 0) {
> + num += 2;
> + word >>= 2;
> + }
> + if ((word & 0x1) == 0)
> + num += 1;
> + return num;
> +}
> +
> +static inline int read_irq(int port)
> +{
> + outb(0x0A, port);
> + return _byte_ffs(inb(port));
> +}
> +#else
> +static inline int read_irq(int port)
> +{
> + /* Perform an interrupt acknowledge cycle on controller 1. */
> + outb(0x0C, port); /* prepare for poll */
> + return inb(port) & 7;
> +}
> +#endif
>
> /*
> * Do the traditional i8259 interrupt polling thing. This is for the few
> @@ -54,18 +85,16 @@ static inline int i8259_irq(void)
>
> spin_lock(&i8259A_lock);
>
> - /* Perform an interrupt acknowledge cycle on controller 1. */
> - outb(0x0C, PIC_MASTER_CMD); /* prepare for poll */
> - irq = inb(PIC_MASTER_CMD) & 7;
> + irq = read_irq(PIC_MASTER_CMD);
> +
> if (irq == PIC_CASCADE_IR) {
> /*
> * Interrupt is cascaded so perform interrupt
> * acknowledge on controller 2.
> */
> - outb(0x0C, PIC_SLAVE_CMD); /* prepare for poll */
> - irq = (inb(PIC_SLAVE_CMD) & 7) + 8;
> - }
> -
> + irq = read_irq(PIC_SLAVE_CMD) + 8;
> + }
> +#ifndef CONFIG_NO_INTERRUPT_ACK
> if (unlikely(irq == 7)) {
> /*
> * This may be a spurious interrupt.
> @@ -78,7 +107,7 @@ static inline int i8259_irq(void)
> if(~inb(PIC_MASTER_ISR) & 0x80)
> irq = -1;
> }
> -
> +#endif
> spin_unlock(&i8259A_lock);
>
> return likely(irq >= 0) ? irq + I8259A_IRQ_BASE : irq;
>
>
>
after applying this patch, system hung when probing ide, seems reading
harddisk continuously, since the led is on all the time.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: about cs5536 interrupt ack
2007-07-11 13:24 ` Maciej W. Rozycki
2007-07-11 15:19 ` Songmao Tian
@ 2007-07-11 15:42 ` Sergei Shtylyov
2007-07-11 16:05 ` Maciej W. Rozycki
1 sibling, 1 reply; 13+ messages in thread
From: Sergei Shtylyov @ 2007-07-11 15:42 UTC (permalink / raw)
To: Maciej W. Rozycki
Cc: Songmao Tian, LinuxBIOS Mailing List, marc.jones, linux-kernel,
linux-mips
Hello.
Maciej W. Rozycki wrote:
>>"Control Logic
>>The INT output goes directly to the CPU interrupt input.
>>When an INT signal is activated, the CPU responds with an
>>Interrupt Acknowledge access that is translated to two
>>pulses on the INTA input of the PIC. At the first INTA pulse,
>>the highest priority IRR bit is loaded into the corresponding
>>ISR bit, and that IRR bit is reset. The second INTA pulse
>>instructs the PIC to present the 8-bit vector of the interrupt
>>handler onto the data bus."
>>Is it the responsibility of north bridge to reponse to intr with a PCI
>>Interrupt Ack cycle?
> With an i386 system such a pair of INTA cycles would be generated by the
> CPU itself and translated by the north bridge to a PCI Interrupt
> Acknowledge cycle (see the PCI spec for a more elaborate description).
> If the CPU does not generate INTA cycles, it is a common practice to let
> it ask the north bridge for a PCI Interrupt Acknowledge in some other way,
> typically by issuing a read cycle that returns the vector reported by the
> interrupt controller.
>>it's a problem that my northbridge didn't implement that! Fortunately we use a
>>fpga as a northbridge.
>>it seem it's no way to fix this by software, for OCW3 didn't implemnt Poll
>>command:(
> Huh? Have you managed to find an 8259A clone *that* broken? So what
It's not such a problem, believe me. ;-)
Some PPC boards use such clones -- you can see the comment in
arch/powerpc/sysdev/i8259.c.
> does it return if you write 0xc to the address 0x20 in the I/O port space
> and then read back from that location? You should complain to the
> manufacturer -- they may be able to fix the problem in a later revision.
Haha, here's an excerpt form CS5535 spec. update:
96. PIC does not support Polling mode
[...]
Implications: This mode is not normally used in x86 systems.
Resolution: None.
>>so I guess the the process is:
>>1) 8259 receive a int, a bit irr got set.
>>2) 8259 assert intr.
>>3) northbrige generate a int ack cycle.
>>4) cs5536 translate the ack into two INTA pulse, and the reponse northbridge
>>with a interrupt vector.
>>5) then my program can get the vector from northbridge?
>>Is that right?
Indeed, this would seem right but one step skipped -- where CPU tells
northbridge that it's accepted an interrupt (via INTA).
> More or less -- 3-5 should probably be the outcome of a single read
> transaction from the north bridge. I.e. you issue a read to a "magic"
> location, 3-5 happen, and the data value returned is the vector presented
> by the interrupt controller on the PCI bus.
Yeah, another way of doing the missed step.
>>Without int ack, generic linux-mips 8259 code can't work.
> You can still dispatch interrupts manually by examining the IRR register,
> but having a way to ask the 8259A's prioritiser would be nice. Although
> given such a lethal erratum you report I would not count on the
> prioritiser to provide any useful flexibility...
Why not? AMD just decided not to implement poll mode, that's all.
> Maciej
WBR, Sergei
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: about cs5536 interrupt ack
2007-07-11 15:19 ` Songmao Tian
2007-07-11 15:38 ` Songmao Tian
@ 2007-07-11 15:48 ` Maciej W. Rozycki
2007-07-11 16:51 ` Maciej W. Rozycki
2007-07-12 7:26 ` Songmao Tian
1 sibling, 2 replies; 13+ messages in thread
From: Maciej W. Rozycki @ 2007-07-11 15:48 UTC (permalink / raw)
To: Songmao Tian; +Cc: LinuxBIOS Mailing List, marc.jones, linux-kernel, linux-mips
On Wed, 11 Jul 2007, Songmao Tian wrote:
> > Huh? Have you managed to find an 8259A clone *that* broken? So what does
> > it return if you write 0xc to the address 0x20 in the I/O port space and
> > then read back from that location? You should complain to the
> >
>
> It's the value of IRR, so guess IRR. AMD has well documented cs5536, I
> appreciate that.
Indeed. I am surprised they have decided to drop the poll command -- it
surely does not require much logic as it mostly reuses what's used to
produce the vector anyway and it is commonly used when 8259A
implementations are interfaced to non-i386 processors. PPC is another
example.
> > More or less -- 3-5 should probably be the outcome of a single read
> > transaction from the north bridge. I.e. you issue a read to a "magic"
> > location, 3-5 happen, and the data value returned is the vector presented by
> > the interrupt controller on the PCI bus.
> >
> yeah, we can implement a register in north bridge.
Strictly speaking it would not be a register, but a "PCI INTA address
space" much like PCI memory or I/O port address spaces. Though as the
former ignores addresses driven on the bus, the space occupied does not
have to be extensive -- I would assume whatever slot size is available
with the address decoder you have implemented would do.
> > You can still dispatch interrupts manually by examining the IRR register,
> > but having a way to ask the 8259A's prioritiser would be nice. Although
> > given such a lethal erratum you report I would not count on the prioritiser
> > to provide any useful flexibility...
> >
> yeah, that's a straight thought, tried but failed:(, patch followed.
You may have to modify other functions from arch/mips/kernel/i8259.c;
yes, this makes the whole experience not as pretty as one would hope...
Maciej
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: about cs5536 interrupt ack
2007-07-11 15:42 ` Sergei Shtylyov
@ 2007-07-11 16:05 ` Maciej W. Rozycki
0 siblings, 0 replies; 13+ messages in thread
From: Maciej W. Rozycki @ 2007-07-11 16:05 UTC (permalink / raw)
To: Sergei Shtylyov
Cc: Songmao Tian, LinuxBIOS Mailing List, marc.jones, linux-kernel,
linux-mips
Hi,
> > does it return if you write 0xc to the address 0x20 in the I/O port space
> > and then read back from that location? You should complain to the
> > manufacturer -- they may be able to fix the problem in a later revision.
>
> Haha, here's an excerpt form CS5535 spec. update:
>
> 96. PIC does not support Polling mode
>
> [...]
>
> Implications: This mode is not normally used in x86 systems.
> Resolution: None.
Yes, of course:
$ grep OCW3 arch/i386/kernel/*.c
arch/i386/kernel/time.c: outb(0x0c, PIC_MASTER_OCW3);
not at all, indeed!
> > You can still dispatch interrupts manually by examining the IRR register,
> > but having a way to ask the 8259A's prioritiser would be nice. Although
> > given such a lethal erratum you report I would not count on the prioritiser
> > to provide any useful flexibility...
>
> Why not? AMD just decided not to implement poll mode, that's all.
If they have decided to skip such an "unimportant" bit of logic, they
could have skipped more, only providing support for the basic FNM
INT/INTA/EOI scheme -- the only one "architecturally" supported from the
original IBM PC on. And indeed, a brief look at the datasheed reveals
they claim to have removed the SFNM too (which IMO provides a more
reasonable nesting resolution and should be the default for setups where
nesting is used, such as the environment as set up at the bootstrap by the
PC BIOS).
Maciej
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: about cs5536 interrupt ack
2007-07-11 15:48 ` Maciej W. Rozycki
@ 2007-07-11 16:51 ` Maciej W. Rozycki
2007-07-12 7:26 ` Songmao Tian
1 sibling, 0 replies; 13+ messages in thread
From: Maciej W. Rozycki @ 2007-07-11 16:51 UTC (permalink / raw)
To: Songmao Tian; +Cc: LinuxBIOS Mailing List, marc.jones, linux-kernel, linux-mips
On Wed, 11 Jul 2007, Maciej W. Rozycki wrote:
> > > You can still dispatch interrupts manually by examining the IRR register,
> > > but having a way to ask the 8259A's prioritiser would be nice. Although
> > > given such a lethal erratum you report I would not count on the prioritiser
> > > to provide any useful flexibility...
> > >
> > yeah, that's a straight thought, tried but failed:(, patch followed.
>
> You may have to modify other functions from arch/mips/kernel/i8259.c;
> yes, this makes the whole experience not as pretty as one would hope...
BTW, have you considered skipping the whole 8259A legacy burden and using
the interrupt mapper directly? From a brief look at the datasheet I
conclude you should be able to OR all the interrupt lines to a single
8259A input (say IRQ0 for the sake of this consideration -- it does not
matter), set it to the level triggered mode, mask all the 8259A inputs but
this one and ignore the device from then on.
It would work as a "virtual wire", using the Intel's terminology, with
its INT output simply following its IR0 input. You can type:
$ grep '8259A Virtual Wire' arch/i386/kernel/io_apic.c
for a reference; ;-) you can skip the AEOI setup as in a system based on a
MIPS processor an INTA cycle will be unlikely to reach the 8259A by
accident (which may happen in the wild world of broken PCs) -- which you
have learnt the hard way by now already.
You can then dispatch interrupts based on the interrupt mapper registers
which has this nice side effect of much of the sharing having been
removed. It will not work with edge-triggered interrupts, but you do not
need that 8254 timer, do you?
Maciej
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: about cs5536 interrupt ack
2007-07-11 15:48 ` Maciej W. Rozycki
2007-07-11 16:51 ` Maciej W. Rozycki
@ 2007-07-12 7:26 ` Songmao Tian
2007-07-16 15:11 ` Maciej W. Rozycki
1 sibling, 1 reply; 13+ messages in thread
From: Songmao Tian @ 2007-07-12 7:26 UTC (permalink / raw)
To: Maciej W. Rozycki
Cc: LinuxBIOS Mailing List, marc.jones, linux-kernel, linux-mips
[-- Attachment #1: Type: text/plain, Size: 2210 bytes --]
8259 problem seems to be done with the attached patch, IDE hung seems
to be the dma setting problem.
Thanks all for your advise, comments. I have learned a lot. now I
continue to trace down the IDE problem.
Mao
Maciej W. Rozycki wrote:
> On Wed, 11 Jul 2007, Songmao Tian wrote:
>
>
>>> Huh? Have you managed to find an 8259A clone *that* broken? So what does
>>> it return if you write 0xc to the address 0x20 in the I/O port space and
>>> then read back from that location? You should complain to the
>>>
>>>
>> It's the value of IRR, so guess IRR. AMD has well documented cs5536, I
>> appreciate that.
>>
>
> Indeed. I am surprised they have decided to drop the poll command -- it
> surely does not require much logic as it mostly reuses what's used to
> produce the vector anyway and it is commonly used when 8259A
> implementations are interfaced to non-i386 processors. PPC is another
> example.
>
>
>>> More or less -- 3-5 should probably be the outcome of a single read
>>> transaction from the north bridge. I.e. you issue a read to a "magic"
>>> location, 3-5 happen, and the data value returned is the vector presented by
>>> the interrupt controller on the PCI bus.
>>>
>>>
>> yeah, we can implement a register in north bridge.
>>
>
> Strictly speaking it would not be a register, but a "PCI INTA address
> space" much like PCI memory or I/O port address spaces. Though as the
> former ignores addresses driven on the bus, the space occupied does not
> have to be extensive -- I would assume whatever slot size is available
> with the address decoder you have implemented would do.
>
>
>>> You can still dispatch interrupts manually by examining the IRR register,
>>> but having a way to ask the 8259A's prioritiser would be nice. Although
>>> given such a lethal erratum you report I would not count on the prioritiser
>>> to provide any useful flexibility...
>>>
>>>
>> yeah, that's a straight thought, tried but failed:(, patch followed.
>>
>
> You may have to modify other functions from arch/mips/kernel/i8259.c;
> yes, this makes the whole experience not as pretty as one would hope...
>
> Maciej
>
>
>
>
[-- Attachment #2: diff --]
[-- Type: text/plain, Size: 2758 bytes --]
diff --git a/arch/mips/kernel/i8259.c b/arch/mips/kernel/i8259.c
index 9c79703..fd7f4ba 100644
--- a/arch/mips/kernel/i8259.c
+++ b/arch/mips/kernel/i8259.c
@@ -47,11 +47,7 @@ static struct irq_chip i8259A_chip = {
/*
* This contains the irq mask for both 8259A irq controllers,
*/
-static unsigned int cached_irq_mask = 0xffff;
-
-#define cached_master_mask (cached_irq_mask)
-#define cached_slave_mask (cached_irq_mask >> 8)
-
+unsigned int cached_irq_mask = 0xffff;
void disable_8259A_irq(unsigned int irq)
{
unsigned int mask;
diff --git a/include/asm-mips/i8259.h b/include/asm-mips/i8259.h
index e88a016..e7dcf7b 100644
--- a/include/asm-mips/i8259.h
+++ b/include/asm-mips/i8259.h
@@ -37,11 +37,55 @@
extern spinlock_t i8259A_lock;
+extern unsigned int cached_irq_mask;
+#define cached_master_mask (cached_irq_mask)
+#define cached_slave_mask (cached_irq_mask >> 8)
+
extern void init_8259A(int auto_eoi);
extern void enable_8259A_irq(unsigned int irq);
extern void disable_8259A_irq(unsigned int irq);
extern void init_i8259_irqs(void);
+#define CONFIG_NO_INTERRUPT_ACK
+#ifdef CONFIG_NO_INTERRUPT_ACK
+static inline int _byte_ffs(u8 word)
+{
+ int num = 0;
+ if ((word & 0xf) == 0) {
+ num += 4;
+ word >>= 4;
+ }
+ if ((word & 0x3) == 0) {
+ num += 2;
+ word >>= 2;
+ }
+ if ((word & 0x1) == 0)
+ num += 1;
+ return num;
+}
+
+static inline int read_irq(int port)
+{
+ int irq;
+ outb(0x0A, port);
+ if (port == PIC_MASTER_CMD) {
+ irq = inb(port) & ~cached_master_mask;
+ } else {
+ irq = inb(port) & ~cached_slave_mask;
+ }
+ if (irq == 0)
+ return -1;
+ else
+ return _byte_ffs(irq);
+}
+#else
+static inline int read_irq(int port)
+{
+ /* Perform an interrupt acknowledge cycle on controller 1. */
+ outb(0x0C, port); /* prepare for poll */
+ return inb(port) & 7;
+}
+#endif
/*
* Do the traditional i8259 interrupt polling thing. This is for the few
@@ -54,18 +98,16 @@ static inline int i8259_irq(void)
spin_lock(&i8259A_lock);
- /* Perform an interrupt acknowledge cycle on controller 1. */
- outb(0x0C, PIC_MASTER_CMD); /* prepare for poll */
- irq = inb(PIC_MASTER_CMD) & 7;
+ irq = read_irq(PIC_MASTER_CMD);
if (irq == PIC_CASCADE_IR) {
/*
* Interrupt is cascaded so perform interrupt
* acknowledge on controller 2.
*/
- outb(0x0C, PIC_SLAVE_CMD); /* prepare for poll */
- irq = (inb(PIC_SLAVE_CMD) & 7) + 8;
- }
+ irq = read_irq(PIC_SLAVE_CMD) + 8;
+ }
+#ifndef CONFIG_NO_INTERRUPT_ACK
if (unlikely(irq == 7)) {
/*
* This may be a spurious interrupt.
@@ -78,6 +120,11 @@ static inline int i8259_irq(void)
if(~inb(PIC_MASTER_ISR) & 0x80)
irq = -1;
}
+#else
+ if (cached_irq_mask & (1 << irq)) {
+ irq = -1;
+ }
+#endif
spin_unlock(&i8259A_lock);
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: about cs5536 interrupt ack
2007-07-12 7:26 ` Songmao Tian
@ 2007-07-16 15:11 ` Maciej W. Rozycki
0 siblings, 0 replies; 13+ messages in thread
From: Maciej W. Rozycki @ 2007-07-16 15:11 UTC (permalink / raw)
To: Songmao Tian; +Cc: LinuxBIOS Mailing List, marc.jones, linux-kernel, linux-mips
On Thu, 12 Jul 2007, Songmao Tian wrote:
> 8259 problem seems to be done with the attached patch, IDE hung seems to be
> the dma setting problem.
>
> Thanks all for your advise, comments. I have learned a lot. now I continue to
> trace down the IDE problem.
I would still recommend you to investigate the option of making the 8259A
cores "transparent" and using the mapper registers to dispatch interrupts
directly -- it would make processing of interrupt requests considerably
faster and less complicated. Please note that ffs() is O(1) and actually
some two or three machine instructions on MIPS architecture processors and
the model used by the mapper is closer to the spirit of how MIPS
processors do interrupt handling. With such an approach it will also
likely be easier to integrate your changes upstream, than it would for
your changes to i8259.{c,h} needed for your unusual setup to work.
Of course as an intermediate solution during development to make the
whole thing work the complicated use of the 8259A cores may be justified.
Maciej
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2007-07-16 15:11 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-07-11 9:36 about cs5536 interrupt ack Songmao Tian
2007-07-11 13:24 ` Maciej W. Rozycki
2007-07-11 15:19 ` Songmao Tian
2007-07-11 15:38 ` Songmao Tian
2007-07-11 15:48 ` Maciej W. Rozycki
2007-07-11 16:51 ` Maciej W. Rozycki
2007-07-12 7:26 ` Songmao Tian
2007-07-16 15:11 ` Maciej W. Rozycki
2007-07-11 15:42 ` Sergei Shtylyov
2007-07-11 16:05 ` Maciej W. Rozycki
2007-07-11 15:22 ` Sergei Shtylyov
2007-07-11 15:31 ` Sergei Shtylyov
2007-07-11 15:35 ` Songmao Tian
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox