From: Volodymyr Babchuk <Volodymyr_Babchuk@epam.com>
To: Mykola Kvach <xakep.amatop@gmail.com>
Cc: "xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>,
Mykola Kvach <Mykola_Kvach@epam.com>,
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 2/4] xen/arm: its: add platform match callback for ITS quirks
Date: Tue, 31 Mar 2026 00:26:14 +0000 [thread overview]
Message-ID: <87a4vovo7u.fsf@epam.com> (raw)
In-Reply-To: <CAGeoDV_1Zzh8pxBe=Mf7Yu1OXfNhzH7aFpsT+ktM62DwK-ropg@mail.gmail.com> (Mykola Kvach's message of "Wed, 25 Mar 2026 18:34:04 +0200")
Hi Mykola,
Mykola Kvach <xakep.amatop@gmail.com> writes:
> Hi Volodymyr,
>
> Thank you for the review.
>
> On Wed, Mar 25, 2026 at 4:45 PM Volodymyr Babchuk
> <Volodymyr_Babchuk@epam.com> wrote:
>>
>> Hi Mykola,
>>
>> Mykola Kvach <xakep.amatop@gmail.com> writes:
>>
>> > From: Mykola Kvach <mykola_kvach@epam.com>
>> >
>> > Extend ITS quirk lookup with an optional match callback so that
>> > platforms sharing the same IIDR can still be distinguished.
>> >
>> > Use the board compatible string to positively identify Renesas R-Car
>> > Gen4 before applying ITS workaround flags, preventing false matches
>> > on other SoCs that happen to use the same GIC IP block.
>> >
>> > Signed-off-by: Mykola Kvach <mykola_kvach@epam.com>
>> > ---
>> > xen/arch/arm/gic-v3-its.c | 22 +++++++++++++++++++---
>> > 1 file changed, 19 insertions(+), 3 deletions(-)
>> >
>> > diff --git a/xen/arch/arm/gic-v3-its.c b/xen/arch/arm/gic-v3-its.c
>> > index 00524b43a3..c40629731f 100644
>> > --- a/xen/arch/arm/gic-v3-its.c
>> > +++ b/xen/arch/arm/gic-v3-its.c
>> > @@ -57,6 +57,7 @@ struct its_device {
>> > */
>> > struct its_quirk {
>> > const char *desc;
>> > + bool (*match)(const struct host_its *hw_its);
>>
>> If you are introducing match predicate, then why do you need...
>>
>> > uint32_t iidr;
>> > uint32_t mask;
>> > uint32_t flags;
>>
>> these? You can use a predicate function to match against iidr
>
> The rationale for keeping iidr/mask while adding match() is to keep
> the quirk table declarative and easy to read. The match() callback is
> meant only as an optional refinement for ambiguous cases where IIDR
> alone is not sufficient to identify the platform.
>
> In this design, iidr/mask remains the primary match key. If matching
> were made entirely callback-based, the standard IIDR comparison would
> have to move into callback code as well. That would make quirk entries
> more open-coded and less data-driven, while the current split keeps the
> common case simple and structured.
>
> This is also close to what Linux does: IIDR-based matching remains the
> generic declarative mechanism, and platform-specific checks such as
> compatible strings are added only where needed.
>
> That said, I agree that the callbacks introduced in this series are all
> doing roughly the same kind of platform identification. A reasonable
> follow-up cleanup would be to model this more generically, for example
> by adding an optional compatible string list to struct its_quirk, and
> reserving match() for cases that cannot be expressed through static
> data.
>
> So the intent here was to keep the table clean, with matching logic
> effectively being:
>
> quirk_match = IIDR match && (no extra match rule || extra match passes)
>
> If you prefer, I can rework this either into a fully callback-based
> scheme, or introduce generic compatible-string matching in this series
> and drop the match() callback for now.
Well, I don't think that introducing "compatible" string matching will
do any good. Actually, I think that it will introduce more problems.
What you can do, is to introduce an additional data:
struct its_quirk {
const char *desc;
bool (*match)(const struct host_its *hw_its, void *priv);
void *priv;
uint32_t flags;
};
struct its_iidr_match {
uint32_t iidr;
uint32_t mask;
};
static bool iidr_match(const struct host_its *hw_its, void *priv);
static bool platform_compatbile_match(const struct host_its *hw_its, void *priv);
static struct its_quirk quirks[] = {
{.match = iidr_match,
.priv = &(struct its_iidr_match) {.iidr = 0xaaaa, .mask = 0xbbbb}},
{.match = platform_compatbile_match,
.priv = "renesas,r8a779g0"},
};
Something like that. In this way you can use either a generic predicate
function or implement your own for more complex cases.
>
>>
>> > @@ -64,11 +65,24 @@ struct its_quirk {
>> >
>> > static uint32_t __ro_after_init its_quirk_flags;
>> >
>> > +static bool gicv3_its_match_quirk_gen4(const struct host_its *hw_its)
>> > +{
>> > + if ( !hw_its->dt_node )
>> > + return false;
>> > +
>> > + if ( !dt_machine_is_compatible("renesas,r8a779f0") &&
>> > + !dt_machine_is_compatible("renesas,r8a779g0") )
>> > + return false;
>> > +
>> > + return true;
>> > +}
>> > +
>> > static const struct its_quirk its_quirks[] = {
>> > {
>> > .desc = "R-Car Gen4",
>> > .iidr = 0x0201743b,
>> > .mask = 0xffffffffU,
>> > + .match = gicv3_its_match_quirk_gen4,
>> > .flags = HOST_ITS_WORKAROUND_NC_NS |
>> > HOST_ITS_WORKAROUND_32BIT_ADDR,
>> > },
>> > @@ -77,7 +91,8 @@ static const struct its_quirk its_quirks[] = {
>> > }
>> > };
>> >
>> > -static const struct its_quirk *gicv3_its_find_quirk(uint32_t iidr)
>> > +static const struct its_quirk *gicv3_its_find_quirk(
>> > + const struct host_its *hw_its, uint32_t iidr)
>> > {
>> > const struct its_quirk *quirk = its_quirks;
>> >
>> > @@ -86,7 +101,8 @@ static const struct its_quirk *gicv3_its_find_quirk(uint32_t iidr)
>> > if ( quirk->iidr != (quirk->mask & iidr) )
>> > continue;
>> >
>> > - return quirk;
>> > + if ( !quirk->match || quirk->match(hw_its) )
>> > + return quirk;
>
> Also, while reviewing gicv3_its_find_quirk() I realized that the
> current first-match semantics may not scale well. Since the table
> supports partial IIDR masks, we could have a broad entry covering
> an entire GIC family alongside a narrower entry for a specific
> platform. With first-match, only one of them would ever apply, so
> their flags could never be combined. The same issue applies to the
> match() callback: if an entry with match() is checked first and
> fails, the loop does continue, but if it succeeds, all subsequent
> entries for the same IIDR -- whether with different masks or different
> match() predicates -- are skipped entirely.
>
> If others agree, I will switch to accumulating flags from all
> matching entries in v2.
I don't think that there is a good use case for this right now, so
personally I'd skip flags accumulation. Just write a comment that code
stops and first match, so more specific quirks should go first.
--
WBR, Volodymyr
next prev parent reply other threads:[~2026-03-31 0:26 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-25 10:38 [PATCH 0/4] xen/arm: ITS quirk handling fixes and board-specific matches Mykola Kvach
2026-03-25 10:38 ` [PATCH 1/4] xen/arm: its: collect quirk flags and honor dma-noncoherent Mykola Kvach
2026-03-25 14:42 ` Volodymyr Babchuk
2026-03-25 15:47 ` Mykola Kvach
2026-03-30 23:44 ` Volodymyr Babchuk
2026-04-28 18:42 ` Oleksandr Tyshchenko
2026-05-04 5:42 ` Mykola Kvach
2026-03-25 10:38 ` [PATCH 2/4] xen/arm: its: add platform match callback for ITS quirks Mykola Kvach
2026-03-25 14:45 ` Volodymyr Babchuk
2026-03-25 16:34 ` Mykola Kvach
2026-03-31 0:26 ` Volodymyr Babchuk [this message]
2026-03-31 8:15 ` Mykola Kvach
2026-04-02 16:50 ` Volodymyr Babchuk
2026-03-25 10:38 ` [PATCH 3/4] xen/arm: its: add Orange Pi 5 ITS quirk Mykola Kvach
2026-03-25 10:38 ` [PATCH 4/4] xen/arm: its: pre-initialize ITS quirks before LPI setup Mykola Kvach
2026-04-02 17:02 ` Volodymyr Babchuk
2026-04-28 16:31 ` Oleksandr Tyshchenko
2026-05-04 6:33 ` Mykola Kvach
2026-04-28 12:25 ` Ping: Re: [PATCH 0/4] xen/arm: ITS quirk handling fixes and board-specific matches 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=87a4vovo7u.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=xakep.amatop@gmail.com \
--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.