PPC IRQ routing tutorial (was Re: Bugs in the PPC/shared interrupt code + dec21140)
till
strauman at slac.stanford.edu
Sun Feb 23 20:02:42 UTC 2003
gregory.menke at gsfc.nasa.gov wrote:
>till writes:
> > gregory.menke at gsfc.nasa.gov wrote:
> > -- snip --
> >
> > >
> > >
> > >It seems that RTEMS simply uses the default content of the
> > >PCI_INTERRUPT_LINE register, blindly using it as the vector. It would
> > >be useful to include something in the revised irq api to provide some
> > >means of allocating vectors rather than simply picking arbitrary ones.
> > >Would traversing the vector list to find unused entries be enough?
> > >
> > >
> > >
> > > >
> > > >
> > > > > --> fix to this would require the dec21140 driver to
> > > > > a) add the correct PIC_IRQ_LOWEST_OFFSET to the
> > > > > PCI_INTERRUPT_LINE
> > > > > b) bootloader would have to do some fixup on the
> > > > > PCI_INTERRUPT_LINE register to replace the
> > > > > ISA interrupt lines with the OpenPIC ones.
> > > > > --> submitted as PR#361
> > > > >
> > > > > Interesting
> > > >
> > >
> > >I'm completely overhauling the dec21140 driver right now to put it
> > >into line with the existing vectoring api
> > >
> > What do you mean by 'the existing vectoring api'?
>
>Properly honoring the "ison" function in conjunction with hardware
>initialization as suggested by the comments and the irq management
>functions- so no new functions as such, instead I'm changing the
>existing code around to fit how the bsp wants to work with the irqs.
>
>
> > Before you completely overhaul the dec21140 driver, _please_ make sure you
> > understand what's going on. Note the difference between an interrupt LINE
> > and an interrupt VECTOR: (the explanation is slightly geared towards the
> > PowerPC architecture example)
>
>I'm developing an understanding of the issue. The significant issue
>in changing around the driver is getting the vectoring straight- and
>thats what I'm working on now. I've been suspecting a mismatch betwen
>the INTERRUPT_LINE and vector and have been reading thru the code to
>work things out- your comments below are a big help.
>
>Thanks for the long explaination below, I'm archiving it. I'm aware
>of several of the issues you raise, but I appreciate the clarification
>on the others. I am somewhat confused about the distinction between
>the PCI_INTERRUPT_LINE and PCI_INTERRUPT_PIN. From your text below,
>it sounds like the INTERRUPT_LINE is acting more like something
>hardware related than a vector- whereas from reading the PCI spec, I
>interpreted the INTERRUPT_PIN in be that role. Could you comment on
>how they're different?
>
I believe (not being a real PCI expert) that the INTERRUPT_PIN is set by
the card/device
to one of INTA..INTD. Using that information, the firmware (knowing the
IRQ routing on
the 'motherboard') can then correctly set the INTERRUPT_LINE value.
Note the interrupt routing: chip (on a card) -> PIN (inta..intd on the
PCI bus) -> LINE (at PIC
on the motherboard). The card knows the first mapping (PIN) and stores
it in the PIN
register. The firmware knows the PIN->LINE mapping and can set the LINE
register.
But, as I said, I'm not an expert and perhaps someone else has to
correct this
information.
-- Till
BTW: I just googled this, which makes me believe I'm right :-)
http://www.cse.cuhk.edu.hk/~cslui/CSC3150/TLK/node84.html
>
>
>Thanks,
>
>Gregm
>
>
> >
> > - an interrupt LINE is a a hardware resource used by the interrupter
> > ("device")
> > to signal an event (IRQ) to the CPU. You can think of the interrupt
> > line as of
> > a 'wire', usually it is one wire amongst others on a bus.
> > Many computers provide more interupt lines than the CPU itself has. They
> > usually incorporate PICs (interrupt controllers) to manage and multiplex
> > multiple interrupt lines into a single output who is connected to the CPU
> > (or even a cascaded PIC).
> >
> > E.g. the PowerPC has one 'external exception (EE)' input pin which is
> > used to
> > interrupt the CPU. An 'OpenPIC' interrupt controller is connected to
> > EE. The
> > OpenPIC has sixteen 'external interrupt' inputs. On some platforms,
> > one of
> > these inputs is used to cascade a second, legacy ISA PIC (which usually
> > itself is a cascade of two PICs)
> >
> > - An interrupt VECTOR is a software resource, a mere 'number' generated
> > by the interrupter and read by the CPU during an interrupt
> > acknowledge cycle.
> > (Originally, the term 'vector' was introduced on hardware which supports
> > reading the vector during an interrupt acknowledge cycle and directly
> > branch to
> > a vector-specific ISR)
> > This is useful to distinguish amongst different interrupters. Here
> > are two
> > examples:
> >
> > a) VME: The VME bus supports 7 interrupt lines (AKA 'levels') AND
> > reading
> > a vector from the bus as part of the IACK (interrupt
> > acknowledge) cycle.
> > A VME device 'knows' its vector number (hardcoded or
> > programmed into
> > a device register during setup by the driver) and puts it on
> > the bus during
> > IACK. --> The CPU, upon reception of an interrupt on one of the
> > 7 levels
> > does IACK and identifies the interrupter based on the vector.
> >
> > b) PowerPC/PCI/OpenPIC. The PCI bus has 4 interrupt lines (INTA..INTD)
> > and NO concept of an interrupt vector. If several devices share
> > a PCI
> > interrupt line, software has to query all devices to identify
> > the interrupter.
> > The OpenPIC, as already mentioned, has 16 interrupt input pins.
> > It also
> > supports 'vectors' in hardware. This means that each of the 16
> > inputs
> > can be associated with a number (vector) which is produced by the
> > OpenPIC as a result of an interupt acknowledge command. It's simply
> > a fast way of identifying the currently active input pin (with
> > the highest priority).
> > Hence, in this case, the vector is not generated by the
> > interrupting device
> > but by the OpenPIC itself.
> >
> > After this lengthy introduction, I hope it becomes clear that
> >
> > 1) OpenPIC 'vectors' are (transparently) handled by the BSP. They are used
> > internally to identify the interrupting pin on the OpenPIC (the
> > vectors happen
> > to be identical to the OpenPIC interrupt line number + 16, i.e. the
> > interrupt
> > "NAME").
> >
> > 2) The motorola Powerpc boards have ~32 interrupt lines. 15 ISA interrupts
> > and 15 OpenPIC interrupts. (the ~ is due to the fact that some
> > lines are
> > used for cascading the PICs and are not usable by devices). The
> > interrupt
> > 'NAME' is a number defined by the BSP's IRQ API. Names are an alias
> > for interrupt lines starting with the ISA interrupts. E.g. the 2nd
> > input of the
> > OpenPIC has 'name' 17, the 5th ISA interrupt has the 'name' 4
> > (I start numbering pins with 1, names start with 0 - unusable lines
> > [cascade] still happen to have a 'name').
> >
> > 3) RTEMS has NO WAY of knowing how interrupt wires/lines are routed.
> > The board designer decided to which OpenPIC input he/her wanted to
> > connect the DEC21140 device. Likewise for PMC/PCI interrupts
> > INTA..INTD.
> > These four are connected to four different OpenPIC interrupt lines only
> > known to the board designer (and the BSP developer).
> >
> > 4) Usually, the OpenPIC is used for PCI interrupts. Firmware should set
> > the PCI INTERRUPT_LINE config register to the correct line used by
> > the respective device on the particular board. Hence, it makes sense
> > for a driver to use that information. When using the
> > BSP_install_rtems_irq_handler() API, it needs to be translated into
> > an irq NAME, however (by adding BSP_PCI_INTERRUPT_LOWEST_OFFSET).
> > Makes sense, doesn't it? Read a PCI_INTERRUPT_LINE, but the
> > API requires a 'name' --> conversion necessary.
> >
> > 5) Unfortunately: motorola/ppc boards connect a couple of devices to
> > _multiple_
> > interrupt lines (i.e. ISA _and_ OpenPIC inputs) and for legacy
> > reasons set the PCI_INTERRUPT_LINE register to the ISA line.
> > Since the RTEMS driver (if it wasn't buggy) assumes the DEC21140
> > to be a PCI device and hence hooked to the OpenPIC, it uses the
> > wrong name. Note that if the PCI API was unified across x86/ppc,
> > ISR installation could well be identical (since the BSPs share the
> > IRQ API).
> >
> > It has been suggested that the BSP simply define 'symbolic names' for
> > interrupts which should then be used by the driver. The driver would then
> > not use PCI_INTERRUPT_LINE but a symbolic constant such as
> > BSP_IRQ_NAME_DEC21140. Since the BSP developer knows the physical
> > interrupt routing, this sounds like a good solution, doesn't it?
> >
> > NO, IT DOESN'T. It's OK for non-PCI on-board devices, but for PCI it is BAD.
> > (It is one of the reasons why PCI was invented).
> > Imagine, you want to support multiple instances or PMC cards. How are you
> > going to know what slot it will be plugged into? You will have to pass
> > something like BSP_IRQ_PCIINTA to driver initialization. And recompile.
> > What if the PMC module is swapped into another slot after a couple of
> > months? Oh - forgot to modify the application (now using BSP_IRQ_PCIINTB)
> > and recompile.
> >
> > IMO, the only solution to this is having fixup code in the BSP startup on
> > boards with buggy/incomplete PCI initialization firmware.
> >
> > Sorry for the long message
> >
> > -- Till
> >
> > > and to support multipleu
> > >units. Right now the built-in dec21140 still works (whew...), and the
> > >2nd unit is addressing OK but having interrupt problems. I'll give
> > >the above a try.
> > >
> > >I REALLY wish somebody would tell me where to go to find and/or submit
> > >PRs. www.rtems.com has been inaccessible to me all weekend.
> > >
> > >Gregm
> > >
> > >
> >
> >
> >
> >
> >
>
More information about the users
mailing list