* 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 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 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: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
* 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: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 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
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