PPC IRQ routing tutorial (was Re: Bugs in the PPC/shared interrupt code + dec21140)
gregory.menke at gsfc.nasa.gov
gregory.menke at gsfc.nasa.gov
Sun Feb 23 20:31:59 UTC 2003
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?
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