From: Marc Zyngier <maz@kernel.org>
To: Lecopzer Chen <lecopzer.chen@mediatek.com>
Cc: <linux-kernel@vger.kernel.org>,
<linux-arm-kernel@lists.infradead.org>, <tglx@linutronix.de>,
<lecopzer@gmail.com>, <yj.chiang@mediatek.com>,
Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
Julien Thierry <julien.thierry.kdev@gmail.com>
Subject: Re: [PATCH] irqchip/gic-v3: Fix IPRIORITYR can't perform byte operations in GIC-600
Date: Tue, 30 Mar 2021 11:33:13 +0100 [thread overview]
Message-ID: <87o8f1q6c6.wl-maz@kernel.org> (raw)
In-Reply-To: <20210330100619.24747-1-lecopzer.chen@mediatek.com>
[+Lorenzo, +Julien on an actual email address]
On Tue, 30 Mar 2021 11:06:19 +0100,
Lecopzer Chen <lecopzer.chen@mediatek.com> wrote:
>
> When pseudo-NMI enabled, register_nmi() set priority of specific IRQ
> by byte ops, and this doesn't work in GIC-600.
>
> We have asked ARM Support [1]:
> > Please refer to following description in
> > "2.1.2 Distributor ACE-Lite slave interface" of GIC-600 TRM for
> > the GIC600 ACE-lite slave interface supported sizes:
> > "The GIC-600 only accepts single beat accesses of the sizes for
> > each register that are shown in the Programmers model,
> > see Chapter 4 Programmer's model on page 4-102.
> > All other accesses are rejected and given either an
> > OKAY or SLVERR response that is based on the GICT_ERR0CTLR.UE bit.".
>
> Thus the register needs to be written by double word operation and
> the step will be: read 32bit, set byte and write it back.
>
> [1] https://services.arm.com/support/s/case/5003t00001L4Pba
You do realise that this link:
- is unusable for most people as it is behind a registration interface
- discloses confidential information to other people
I strongly suggest you stop posting such links.
>
> Signed-off-by: Lecopzer Chen <lecopzer.chen@mediatek.com>
> ---
> drivers/irqchip/irq-gic-v3.c | 13 ++++++++++++-
> 1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
> index eb0ee356a629..cfc5a6ad30dc 100644
> --- a/drivers/irqchip/irq-gic-v3.c
> +++ b/drivers/irqchip/irq-gic-v3.c
> @@ -440,10 +440,21 @@ static void gic_irq_set_prio(struct irq_data *d, u8 prio)
> {
> void __iomem *base = gic_dist_base(d);
> u32 offset, index;
> + u32 val, prio_offset_mask, prio_offset_shift;
>
> offset = convert_offset_index(d, GICD_IPRIORITYR, &index);
>
> - writeb_relaxed(prio, base + offset + index);
> + /*
> + * GIC-600 memory mapping register doesn't support byte opteration,
> + * thus read 32-bits from register, set bytes and wtire back to it.
> + */
> + prio_offset_shift = (index & 0x3) * 8;
> + prio_offset_mask = GENMASK(prio_offset_shift + 7, prio_offset_shift);
> + index &= ~0x3;
> + val = readl_relaxed(base + offset + index);
> + val &= ~prio_offset_mask;
> + val |= prio << prio_offset_shift;
> + writel_relaxed(val, base + offset + index);
> }
>
> static u32 gic_get_ppi_index(struct irq_data *d)
From the architecture spec:
<quote>
11.1.3 GIC memory-mapped register access
In any system, access to the following registers must be supported:
[...]
* Byte accesses to:
- GICD_IPRIORITYR<n>.
- GICD_ITARGETSR<n>.
- GICD_SPENDSGIR<n>.
- GICD_CPENDSGIR<n>.
- GICR_IPRIORITYR<n>.
</quote>
So if GIC600 doesn't follow this architectural requirement, this is a
HW erratum, and I want an actual description of the HW issue together
with an erratum number.
Lorenzo, can you please investigate on your side?
Thanks,
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
WARNING: multiple messages have this Message-ID (diff)
From: Marc Zyngier <maz@kernel.org>
To: Lecopzer Chen <lecopzer.chen@mediatek.com>
Cc: <linux-kernel@vger.kernel.org>,
<linux-arm-kernel@lists.infradead.org>, <tglx@linutronix.de>,
<lecopzer@gmail.com>, <yj.chiang@mediatek.com>,
Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
Julien Thierry <julien.thierry.kdev@gmail.com>
Subject: Re: [PATCH] irqchip/gic-v3: Fix IPRIORITYR can't perform byte operations in GIC-600
Date: Tue, 30 Mar 2021 11:33:13 +0100 [thread overview]
Message-ID: <87o8f1q6c6.wl-maz@kernel.org> (raw)
In-Reply-To: <20210330100619.24747-1-lecopzer.chen@mediatek.com>
[+Lorenzo, +Julien on an actual email address]
On Tue, 30 Mar 2021 11:06:19 +0100,
Lecopzer Chen <lecopzer.chen@mediatek.com> wrote:
>
> When pseudo-NMI enabled, register_nmi() set priority of specific IRQ
> by byte ops, and this doesn't work in GIC-600.
>
> We have asked ARM Support [1]:
> > Please refer to following description in
> > "2.1.2 Distributor ACE-Lite slave interface" of GIC-600 TRM for
> > the GIC600 ACE-lite slave interface supported sizes:
> > "The GIC-600 only accepts single beat accesses of the sizes for
> > each register that are shown in the Programmers model,
> > see Chapter 4 Programmer's model on page 4-102.
> > All other accesses are rejected and given either an
> > OKAY or SLVERR response that is based on the GICT_ERR0CTLR.UE bit.".
>
> Thus the register needs to be written by double word operation and
> the step will be: read 32bit, set byte and write it back.
>
> [1] https://services.arm.com/support/s/case/5003t00001L4Pba
You do realise that this link:
- is unusable for most people as it is behind a registration interface
- discloses confidential information to other people
I strongly suggest you stop posting such links.
>
> Signed-off-by: Lecopzer Chen <lecopzer.chen@mediatek.com>
> ---
> drivers/irqchip/irq-gic-v3.c | 13 ++++++++++++-
> 1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
> index eb0ee356a629..cfc5a6ad30dc 100644
> --- a/drivers/irqchip/irq-gic-v3.c
> +++ b/drivers/irqchip/irq-gic-v3.c
> @@ -440,10 +440,21 @@ static void gic_irq_set_prio(struct irq_data *d, u8 prio)
> {
> void __iomem *base = gic_dist_base(d);
> u32 offset, index;
> + u32 val, prio_offset_mask, prio_offset_shift;
>
> offset = convert_offset_index(d, GICD_IPRIORITYR, &index);
>
> - writeb_relaxed(prio, base + offset + index);
> + /*
> + * GIC-600 memory mapping register doesn't support byte opteration,
> + * thus read 32-bits from register, set bytes and wtire back to it.
> + */
> + prio_offset_shift = (index & 0x3) * 8;
> + prio_offset_mask = GENMASK(prio_offset_shift + 7, prio_offset_shift);
> + index &= ~0x3;
> + val = readl_relaxed(base + offset + index);
> + val &= ~prio_offset_mask;
> + val |= prio << prio_offset_shift;
> + writel_relaxed(val, base + offset + index);
> }
>
> static u32 gic_get_ppi_index(struct irq_data *d)
From the architecture spec:
<quote>
11.1.3 GIC memory-mapped register access
In any system, access to the following registers must be supported:
[...]
* Byte accesses to:
- GICD_IPRIORITYR<n>.
- GICD_ITARGETSR<n>.
- GICD_SPENDSGIR<n>.
- GICD_CPENDSGIR<n>.
- GICR_IPRIORITYR<n>.
</quote>
So if GIC600 doesn't follow this architectural requirement, this is a
HW erratum, and I want an actual description of the HW issue together
with an erratum number.
Lorenzo, can you please investigate on your side?
Thanks,
M.
--
Without deviation from the norm, progress is not possible.
next prev parent reply other threads:[~2021-03-30 10:35 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-30 10:06 [PATCH] irqchip/gic-v3: Fix IPRIORITYR can't perform byte operations in GIC-600 Lecopzer Chen
2021-03-30 10:06 ` Lecopzer Chen
2021-03-30 10:33 ` Marc Zyngier [this message]
2021-03-30 10:33 ` Marc Zyngier
2021-03-30 11:05 ` Lorenzo Pieralisi
2021-03-30 11:05 ` Lorenzo Pieralisi
2021-03-30 13:06 ` Lorenzo Pieralisi
2021-03-30 13:06 ` Lorenzo Pieralisi
2021-03-30 14:11 ` Marc Zyngier
2021-03-30 14:11 ` Marc Zyngier
2021-03-30 14:24 ` Lecopzer Chen
2021-03-30 14:24 ` Lecopzer Chen
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=87o8f1q6c6.wl-maz@kernel.org \
--to=maz@kernel.org \
--cc=julien.thierry.kdev@gmail.com \
--cc=lecopzer.chen@mediatek.com \
--cc=lecopzer@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lorenzo.pieralisi@arm.com \
--cc=tglx@linutronix.de \
--cc=yj.chiang@mediatek.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.