"Griffis, Brad" <bgrif...@ti.com> writes:

> On Monday 11 May 2009, Narnakaje, Snehaprabha wrote:
>>> Kevin, Dave,
>>> 
>>> We checked this with the hardware team -
>>> 
>>> "The GPIO module does't seem to have the ability to enable/disable
>>> the direct/banked GPIO[0:9] at the GPIO Level (it does via the SET
>>> register, but it doesn't prevent triggering both Interrupts to the
>>> CPU). But the option to mask between the direct GPIO interrupts and
>>> the bank0 for GPIO[15:0] does exist at the ARM level.
>>
>>That's not quite clear... if SET_FALLING.BIT(5) has
>>enabled one edge and SET_RISING.BIT(1) enables another
>>edge on a different GPIO, and BANK0 is enabled in the
>>AINTC, then BANK0 can be triggered by either of those
>>two events, right?  (That's what we expect, and I've
>>seen no reason to think otherwise.  BINTEN.BIT(0) set.)
>>
>>If we then toss direct GPIO5 and GPIO1 IRQs into the
>>mix, and they're both enabled in the AINTC ... you're
>>saying both should arrive, yes?  Triggered according to
>>those RISING/FALLING settings?  Or always active-low?
>>
>>If the RISING/FALLING registers are all clear, but the
>>direct GPIO5 and GPIO1 IRQs are enabled in AINTC, are
>>you saying we still get a BANK0 interrupt?
>
> You need to setup either a rising or falling edge interrupt in order
> for an interrupt to be generated.  If you don't set either one then
> you will not generate any interrupts (bank or individual).
>
> I think the ultimate issue here is that the output of the interrupt
> generation is tied directly to both the bank interrupt and the
> individual interrupt.  That means that the gating of this interrupt is
> happening at the AINTC level.  Therefore if you have both the
> individual interrupt and the bank interrupt enabled at the AINTC level
> then you will be interrupted twice for that specific interrupt.

Yes, this is the root of the problem.  And even more to the point, I
discovered this via experimentation because it is far from clear in
the docs how this works.

> So, for example, if at the AINTC level you enable the individual
> interrupt, but disable the bank interrupt, then you would be fine
> (i.e. only one interrupt generated).  However, if some other code in
> the system turns on the bank interrupt then you will get interrupted
> twice for a given interrupt (once for the individual and once for the
> bank).
>
> You could solve this issue a few different ways.  (I have not so much
> as opened the driver so sorry that I have no idea how easy/difficult
> these approaches will be to implement.)
>
> 1.  Use only individual interrupts for GPIO[9:0] and don't let anyone
> in the system use GPIO[15:10].
>
> 2.  Use only bank interrupts for GPIO[15:0] and don't let anyone use
> the individual interrupts (GPIO[9:0]).

This is the current approach.

> 3.  Use a mix of bank interrupts and individual interrupts, but
> whenever an individual interrupt gets used you "plug" the
> corresponding bank interrupt with a NOP.
>
> The first 2 solutions work by doing the gating at the AINTC level and
> only allowing one of the interrupts to be enabled, thereby making it
> impossible to be interrupted twice.  Those solutions will be the most
> efficient from a cycle perspective.  The 3rd solution is the most
> flexible because it allows both interrupts to be enabled but will have
> wasted overhead from taking unnecessary interrupts.

As the kernel moves towards threaded interrupts, there s an increased
penalty in taking the redundant interrupt as well, so I'd like to
avoid that wherever possible.

Kevin

_______________________________________________
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to