Thread (18 messages) 18 messages, 4 authors, 2017-07-02

Re: [RFC] gpio: about the need to manage irq mapping dynamically.

From: Marc Zyngier <hidden>
Date: 2017-06-29 16:53:20
Also in: linux-amlogic, lkml

On 29/06/17 15:57, Jerome Brunet wrote:
On Thu, 2017-06-29 at 16:14 +0200, Linus Walleij wrote:
quoted
On Tue, Jun 27, 2017 at 8:25 PM, Jerome Brunet [off-list ref] wrote:
quoted
At the time Linus strongly rejected the idea of calling  irq_create_mapping
(or
any sleeping functions) in gpio_to_irq: please see the reply from Oct 26,
2016
(sorry for quoting such an old discussion but this is really the starting
point)

* Me: There is really a *lot* of gpio drivers which use irq_create_mapping
in
the to_irq callback, are these all wrong ?
* Linus: Yes they are all wrong. They should all be using
irq_find_mapping().

* Me: If this should not be used, what should we all do instead ?
* Linus: Call irq_create_mapping() in some other place.

gpio_prepare_irq is a proposition for this 'other place'.
There is a misunderstanding here.

I wrote (at the time):
quoted
Yes, but you want to call irq_create_mapping() in slowpath (irq setup)
and irq_find_mapping() in fastpath (irq handler). Else the first IRQ
may result in unwelcomed surprises.
This does not mean that irq_create_mapping() cannot be called
in irq context because I think it can.

What it means is that I think that is suboptimal from a performance
point of view if called from gpio_to_irq(), because nominally, at this
point, the mapping should already exist, since the GPIO and IRQ
frameworks are orthogonal.
Agreed. It should. In such case, irq_create_mapping is just a call to
irq_find_mapping which is fine. If, for whatever reason this is not the case,
this is going to call sleeping function in irq context. It should not happen but
it is not entirely impossible ...
quoted
But that may not apply to the case with many-to-few interrupt
mappings... so I think I was in some 1-to-1-mapping context
when I wrote this. Sorry :(

So I changed my mind, it is fine for this type of driver to call
irq_create_mapping() in gpio_to_irq(). Preferably with some comment
around the call.
What about disposing of the mapping ? there still is no counter part function to
gpio_to_irq. It seems weird to leave them lying around, don't you think ?

Here is a real use we will be having a meson:
* MMC driver load and call gpio_to_irq on its cd pin
  This is going to create a mapping 
* MMC driver request an irq with IRQ_EDGE_BOTH trigger (which we don't/can't
  support at the moment). request_irq fails.
* MMC defaults to polling the GPIO

Remember that we have only 8 possibles mappings. Now there is one (useless)
mapping lying around which can't get rid of.
Which should be dropped by a dispose_mapping() call in the MMC driver
(or ideally some gpio-specific wrapper around this function).
If there is more drivers doing this sort of tricks, we are going to exhaust the
ressource pretty quickly.
We can fix those drivers as we go. It's not like there's a huge variety
of potential HW on this particular platform of yours.

Thanks,

	M.
-- 
Jazz is not dead. It just smells funny...
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help