From: Volodymyr Babchuk <Volodymyr_Babchuk@epam.com>
To: Mykola Kvach <Mykola_Kvach@epam.com>
Cc: "xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>,
Stefano Stabellini <sstabellini@kernel.org>,
Julien Grall <julien@xen.org>,
Bertrand Marquis <bertrand.marquis@arm.com>,
Michal Orzel <michal.orzel@amd.com>
Subject: Re: [PATCH v4 3/4] xen/arm: its: refactor ITS quirk matching
Date: Tue, 13 Oct 2026 02:59:05 +0000 [thread overview]
Message-ID: <875wz6wbk6.fsf@epam.com> (raw)
In-Reply-To: <b29ddd0b36b5564c564c31f511ecddb1d681afeb.1790707009.git.mykola_kvach@epam.com> (Mykola Kvach's message of "Tue, 29 Sep 2026 22:02:12 +0300")
Hi,
Mykola Kvach <mykola_kvach@epam.com> writes:
> ITS quirks are matched only by IIDR and mask fields stored in each table
> entry. That is too coarse when the same GIC IP block appears on several
> platforms but a workaround is valid only for some of them.
>
> Replace the fixed IIDR fields with a generic match(hw_its, data)
> callback and an opaque data pointer. Add an IIDR matcher as a reusable
> building block and use it from the R-Car Gen4 matcher after checking the
> Renesas machine compatibles.
>
> This intentionally narrows the R-Car Gen4 quirk. Previously every ITS
> with IIDR 0x0201743b matched. Now it matches only a DT-discovered ITS on
> an r8a779f0 or r8a779g0 machine. ACPI-discovered ITSes and the same IIDR
> on other platforms no longer match.
>
> Keep first-match semantics explicit. Use BUG_ON() if a non-sentinel
> entry has no matcher or the IIDR matcher receives no data. A broken
> entry must stop Xen in both debug and release builds, as skipping a
> required workaround could cause a failure later. Place the matcher data
> and table in init-only read-only sections.
>
> The matched entry still supplies separate ITS and LPI flags; this patch
> only changes how the entry is selected.
>
> Signed-off-by: Mykola Kvach <mykola_kvach@epam.com>
Reviewed-by: Volodymyr Babchuk <volodymyr_babchuk@epam.com>
> ---
> Changes in v4:
> - Use BUG_ON() for missing IIDR match data or a missing match callback.
> - Keep the existing quirks variable name in gicv3_its_find_quirk().
>
> Changes in v3:
> - Document the intentional narrowing of the R-Car Gen4 match.
> - Add the non-debug NULL-data guard.
> - Put the matcher data and table in init-only read-only sections.
>
> Changes in v2:
> - Replace v1's optional platform callback plus fixed IIDR/mask fields
> with a single generic match(hw_its, data) selector.
> - Add a reusable IIDR matcher and use it after the R-Car Gen4
> machine-compatible checks.
> - Document that the R-Car Gen4 quirk remains DT-only.
> - Keep the split ITS and host LPI quirk scopes when applying the matched
> entry.
> - Document first-match ordering in the lookup path and guard against
> entries without a match callback or IIDR match data.
> ---
> xen/arch/arm/gic-v3-its.c | 64 +++++++++++++++++++++++++++++++--------
> 1 file changed, 52 insertions(+), 12 deletions(-)
>
> diff --git a/xen/arch/arm/gic-v3-its.c b/xen/arch/arm/gic-v3-its.c
> index 280ace0577..43804a6c7a 100644
> --- a/xen/arch/arm/gic-v3-its.c
> +++ b/xen/arch/arm/gic-v3-its.c
> @@ -54,8 +54,8 @@ struct its_device {
>
> struct its_quirk {
> const char *desc;
> - uint32_t iidr;
> - uint32_t mask;
> + bool (*match)(const struct host_its *hw_its, const void *data);
> + const void *data;
> uint32_t its_flags;
> /*
> * lpi_flags are ORed into the global host LPI policy and must only
> @@ -65,11 +65,49 @@ struct its_quirk {
> uint32_t lpi_flags;
> };
>
> -static const struct its_quirk its_quirks[] = {
> +struct its_quirk_match_iidr {
> + uint32_t iidr;
> + uint32_t mask;
> +};
> +
> +static bool __init gicv3_its_match_iidr(const struct host_its *hw_its,
> + const void *data)
> +{
> + const struct its_quirk_match_iidr *match;
> + uint32_t iidr;
> +
> + BUG_ON(!data);
> +
> + match = data;
> + iidr = readl_relaxed(hw_its->its_base + GITS_IIDR);
> +
> + return (iidr & match->mask) == match->iidr;
> +}
> +
> +static bool __init gicv3_its_match_quirk_gen4(const struct host_its *hw_its,
> + const void *data)
> +{
> + if ( !hw_its->dt_node )
> + return false;
> +
> + if ( !dt_machine_is_compatible("renesas,r8a779f0") &&
> + !dt_machine_is_compatible("renesas,r8a779g0") )
> + return false;
> +
> + return gicv3_its_match_iidr(hw_its, data);
> +}
> +
> +static const struct its_quirk_match_iidr rcar_gen4_iidr __initconst = {
> + /* Implementer 0x43b identifies Arm Ltd. */
> + .iidr = 0x0201743b,
> + .mask = 0xffffffffU,
> +};
> +
> +static const struct its_quirk its_quirks[] __initconstrel = {
> {
> - .desc = "R-Car Gen4",
> - .iidr = 0x0201743b,
> - .mask = 0xffffffffU,
> + .desc = "R-Car Gen4",
> + .match = gicv3_its_match_quirk_gen4,
> + .data = &rcar_gen4_iidr,
> .its_flags = GICV3_QUIRK_MEM_NC_NS | GICV3_QUIRK_MEM_32BIT_ADDR,
> .lpi_flags = GICV3_QUIRK_MEM_NC_NS | GICV3_QUIRK_MEM_32BIT_ADDR,
> },
> @@ -78,17 +116,20 @@ static const struct its_quirk its_quirks[] = {
> }
> };
>
> -static const struct its_quirk *__init gicv3_its_find_quirk(uint32_t iidr)
> +static const struct its_quirk *__init gicv3_its_find_quirk(
> + const struct host_its *hw_its)
> {
> const struct its_quirk *quirks = its_quirks;
>
> /*
> - * The first matching quirk wins. More specific quirks must be listed
> - * before broader IIDR-only entries.
> + * The first matching quirk wins. Entries that match a specific platform
> + * must be listed before broader IIDR-only entries.
> */
> for ( ; quirks->desc; quirks++ )
> {
> - if ( quirks->iidr == (quirks->mask & iidr) )
> + BUG_ON(!quirks->match);
> +
> + if ( quirks->match(hw_its, quirks->data) )
> return quirks;
> }
>
> @@ -97,8 +138,7 @@ static const struct its_quirk *__init gicv3_its_find_quirk(uint32_t iidr)
>
> static void __init gicv3_its_collect_quirks(struct host_its *hw_its)
> {
> - uint32_t iidr = readl_relaxed(hw_its->its_base + GITS_IIDR);
> - const struct its_quirk *quirk = gicv3_its_find_quirk(iidr);
> + const struct its_quirk *quirk = gicv3_its_find_quirk(hw_its);
>
> if ( quirk )
> {
--
WBR, Volodymyr
next prev parent reply other threads:[~2026-10-13 2:59 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-29 19:02 [PATCH v4 0/4] xen/arm: gicv3: defer host LPI init and split ITS/LPI quirk scopes Mykola Kvach
2026-09-29 19:02 ` [PATCH v4 1/4] xen/arm: its: initialize host LPI state before activating ITSes Mykola Kvach
2026-10-13 2:36 ` Volodymyr Babchuk
2026-09-29 19:02 ` [PATCH v4 2/4] xen/arm: its: separate ITS and host LPI quirk scopes Mykola Kvach
2026-10-13 2:52 ` Volodymyr Babchuk
2026-09-29 19:02 ` [PATCH v4 3/4] xen/arm: its: refactor ITS quirk matching Mykola Kvach
2026-10-13 2:59 ` Volodymyr Babchuk [this message]
2026-09-29 19:02 ` [PATCH v4 4/4] xen/arm: its: handle dma-noncoherent on GIC and ITS nodes Mykola Kvach
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=875wz6wbk6.fsf@epam.com \
--to=volodymyr_babchuk@epam.com \
--cc=Mykola_Kvach@epam.com \
--cc=bertrand.marquis@arm.com \
--cc=julien@xen.org \
--cc=michal.orzel@amd.com \
--cc=sstabellini@kernel.org \
--cc=xen-devel@lists.xenproject.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 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.