Re: [PATCH v6] arm pl011 serial: support multi-irq request

From: Russell King (Oracle)
Date: Mon Aug 16 2021 - 06:34:54 EST


On Fri, Aug 13, 2021 at 03:37:16PM +0100, Robin Murphy wrote:
> > +static int pl011_allocate_multi_irqs(struct uart_amba_port *uap)
> > +{
> > + int ret = 0;
> > + int i;
> > + unsigned int virq;
> > + struct amba_device *amba_dev = container_of(uap->port.dev, struct amba_device, dev);
> > +
> > + pl011_write(uap->im, uap, REG_IMSC);
> > +
> > + for (i = 0; i < AMBA_NR_IRQS; i++) {
>
> It's not clear where these extra IRQs are expected to come from given that
> the DT binding explicitly defines only one :/

The DT binding (and driver) was written assuming that people wouldn't
use the individual interrupts - but I guess someone decided it was a
good idea to have a bazillion interrupt signals going to your interrupt
controller from something as simple as a UART (which is permitted by
the PL011 TRM.) It's only taken about 20 years for this to happen, so
I think we should think we're lucky this hasn't come up before! :D

> > + virq = amba_dev->irq[i];
> > + if (virq == 0)
> > + break;
> > +
> > + ret = request_irq(virq, pl011_int, IRQF_SHARED, dev_name(&amba_dev->dev), uap);
>
> Note that using dev_name() here technically breaks user ABI - scripts
> looking in /proc for an irq named "uart-pl011" will no longer find it.
>
> Furthermore, the "dev" cookie passed to request_irq is supposed to be
> globally unique, which "uap" isn't once you start registering it multiple
> times.

There's no difference there.

First, the "private" used with request_irq() only has to be globally
unique for the interrupt number being requested. Secondly, there is
no way for two UARTs to share the same "uap" structure, and finally
there is a 1:1 model between "uap" and "dev". So, I don't see a problem
as far as whether we use "uap" or "dev" here.

> If firmware did describe all the individual PL011 IRQ outputs on a
> system where they are muxed to the same physical IRQ anyway, you'd end up
> registering ambiguous IRQ actions here. Of course in practice you might
> still get away with that, but it is technically wrong.

Yes. This would also make a total nonsense of using multiple interrupt
lines.

The whole point of using multiple interrupt lines from the UART is so
the interrupt demultiplexing can be handled at the interrupt controller
and their priorities can be decided there. If we adopt a software
structure where we effectively register our "merged" interrupt handler
for all these signals, then there is absolutely no benefit to using
multiple interrupt signals, since that will override any priority, and
we will still have the extra overhead of decoding which interrupt fired
at the UART level.

--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!