linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: "Lad, Prabhakar" <prabhakar.csengg@gmail.com>
To: Marc Zyngier <maz@kernel.org>
Cc: Geert Uytterhoeven <geert+renesas@glider.be>,
	linux-riscv@lists.infradead.org,
	 LAK <linux-arm-kernel@lists.infradead.org>
Subject: Re: [QUERY]: Acknowledgment of edge triggered interrupts
Date: Sat, 7 May 2022 06:31:25 +0100	[thread overview]
Message-ID: <CA+V-a8s7NP6+VV3dCnRUpW3pY8+5CwPoNde0F7227WOLrGGvmQ@mail.gmail.com> (raw)
In-Reply-To: <87o80a7t2z.wl-maz@kernel.org>

Hi Marc,

On Fri, May 6, 2022 at 1:18 PM Marc Zyngier <maz@kernel.org> wrote:
>
> On Fri, 06 May 2022 12:24:34 +0100,
> "Lad, Prabhakar" <prabhakar.csengg@gmail.com> wrote:
> >
> > Hi Marc,
> >
> > Sorry for the late reply.
> >
> > On Mon, May 2, 2022 at 10:44 AM Marc Zyngier <maz@kernel.org> wrote:
> > >
> > > On Sat, 30 Apr 2022 19:41:24 +0100,
> > > "Lad, Prabhakar" <prabhakar.csengg@gmail.com> wrote:
> > > >
> > > > Hi Marc,
> > > >
> > > > I am currently working on the irq-sifive-plic.c driver. The
> > > > irq-sifive-plic.c driver is currently implemented as a chained domain.
> > > > On our SoC which uses this block for EDGE interrupts we need to first
> > > > acknowledge the interrupt before handling it.
> > >
> > > Isn't that what the CLAIM register does on the PLIC? AFAICT, this
> > > interrupt controller is able to implement the whole flow, irrespective
> > > of the trigger mechanism.
> > >
> > Yes, the CLAIM register is used to ACK interrupts.
> >
> > > The spec strongly hints at that, see [1] ("Interrupt gateways"), and
> > > the uniform handling that results of it. In a way, this is strikingly
> > > similar to what the original ARM GIC does.
> > >
> > The ARM GIC allows the next interrupts to be pending, that is it can
> > stock interrupts (pending interrupt counter).
>
> Well, if you consider a single bit a counter, yes.
>
> >
> > > [1] https://github.com/riscv/riscv-plic-spec/blob/master/riscv-plic.adoc
> > >
> > > >
> > > > I came across a similar situation on a different driver (patch [0])
> > > > but it isn't a chained handler.
> > > >
> > > > What approach should be taken for chained IRQ domains to handle such cases?
> > >
> > > I don't think there is anything to change. At least, as long as the
> > > Interrupt Gateway is doing its job correctly. How this gateway is
> > > configured is unfortunately out of the scope of the architecture, it
> > > seems, and I'd expect your HW to have some sort of knobs for the
> > > trigger type to be configured. This would be dealt with in a separate
> > > stacked driver.
> > >
> > Renesas RZ/Five Soc has a AX45MP AndesCore which has NCEPLIC100.
> > Quoting from https://github.com/riscv/riscv-plic-spec/blob/master/riscv-plic.adoc#interrupt-gateways
> >
> > "If the global interrupt source was edge-triggered, the gateway will
> > convert the first matching signal edge into an interrupt request.
> > Depending on the design of the device and the interrupt handler, in
> > between sending an interrupt request and receiving notice of its
> > handler’s completion, the gateway might either ignore additional
> > matching edges or increment a counter of pending interrupts. In either
> > case, the next interrupt request will not be forwarded to the PLIC
> > core until the previous completion message has been received"
> >
> > Andes NCEPLIC100 ignores the next interrupt edge until the previous
> > completion message has been received and to top it the gateway doesn't
> > have a pending interrupt counter. So the only workaround for handling
> > edge interrupts is to first acknowledge it and then run the handler as
> > shown in the attached image.
>
> Huh. I see what you mean. The problem isn't the Ack, but the EOI. You
> need to ensure completion of the interrupt before it is handled so
> that you avoid losing bits. This is precisely what a read of CLAIM
> should have guaranteed. Who came up with this insane piece of crap?
> Really, some people shouldn't be left designing interrupt controllers.
>
Can't comment on it ;)

> I'm afraid you'll have to use a separate flow for edge interrupts,
> probably using the fasteoi_ack flow, and perform the *write* to
> COMPLETE/CLAIM in the irq_ack() callback.
>
Thanks for the pointer, I'll spin out an RFC after implementing this.

> Is this a feature of this PLIC implementation? Or is that common to
> all PLICs?
>
I think it's a feature of this PLIC implementation and not common to all PLIC's.

Cheers,
Prabhakar

>         M.
>
> --
> Without deviation from the norm, progress is not possible.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

      reply	other threads:[~2022-05-07  5:33 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-30 18:41 [QUERY]: Acknowledgment of edge triggered interrupts Lad, Prabhakar
2022-05-02  9:44 ` Marc Zyngier
2022-05-06 11:24   ` Lad, Prabhakar
2022-05-06 12:18     ` Marc Zyngier
2022-05-07  5:31       ` Lad, Prabhakar [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CA+V-a8s7NP6+VV3dCnRUpW3pY8+5CwPoNde0F7227WOLrGGvmQ@mail.gmail.com \
    --to=prabhakar.csengg@gmail.com \
    --cc=geert+renesas@glider.be \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=maz@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).