Looping in Marc Zyngier,

sorry for top posting but he needs a copy of the whole nice
mail.

Yours,
Linus Walleij

On Thu, Jan 12, 2017 at 11:35 PM, David Daney <dda...@caviumnetworks.com> wrote:
> Hi Thomas,
>
> I am trying to figure out how to handle this situation:
>
>                   handle_level_irq()
>                   +---------------+                 handle_fasteoi_irq()
>                   | PCIe hosted   |                 +-----------+ +-----+
>  --level_gpio---->| GPIO to MSI-X |--MSI_message--+>| gicv3-ITS |---> | CPU
> |
>                   | widget        |               | +-----------+ +-----+
>                   +---------------+               |
>                                                   |
>           +-------------------+                   |
>           | other PCIe device |---MSI_message-----+
>           +-------------------+
>
>
> The question is how to structure the interrupt handling.  My initial
> attempt was a chaining arrangement where the GPIO driver does
> request_irq() for the appropriate MSI-X vector, and the handler calls
> back into the irq system like this:
>
>
> static irqreturn_t thunderx_gpio_chain_handler(int irq, void *dev)
> {
>         struct thunderx_irqdev *irqdev = dev;
>         int chained_irq;
>         int ret;
>
>         chained_irq = irq_find_mapping(irqdev->gpio->chip.irqdomain,
>                                        irqdev->line);
>         if (!chained_irq)
>                 return IRQ_NONE;
>
>         ret = generic_handle_irq(chained_irq);
>
>         return ret ? IRQ_NONE : IRQ_HANDLED;
> }
>
> Thus getting the proper GPIO irq_chip functions called to manage the
> level triggering semantics.
>
> The drawbacks of this approach are that there are then two irqs
> associated with the GPIO line (the base MSI-X and the chained GPIO),
> also there can be up to 80-100 of these widgets, so potentially we can
> consume twice that many irq numbers.
>
> It was suggested by Linus Walleij that using an irq domain hierarchy
> might be a better idea.  However, I cannot figure out how this might
> work.  The gicv3-ITS needs to use handle_fasteoi_irq(), and we need
> handle_level_irq() for the GPIO-level lines.  Getting the proper
> irq_chip functions called in a hierarchical configuration doesn't seem
> doable given the heterogeneous flow handlers.
>
> Can you think of a better way of structuring this than chaining from the
> MSI-X handler as I outlined above?
>
> Thanks in advance for any insight,
> David Daney

Reply via email to