[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v4 3/4] xen/arm: its: refactor ITS quirk matching


  • To: Mykola Kvach <Mykola_Kvach@xxxxxxxx>
  • From: Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
  • Date: Tue, 13 Oct 2026 02:59:05 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=epam.com; dmarc=pass action=none header.from=epam.com; dkim=pass header.d=epam.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=4mQc2r15wOLTA8zOhQs/kKQnVWeEG1CIJ/D1gPI2Kcw=; b=jSRr6yn+S6zpXvCovOwF2EFGW1mp5JSJHQ3eiCQIBkt3aCWGRvHNePCghQiq0KnfOHw4jvOl5q/oQcYjv2367COK1YJRc0uxj+8WVNKpHPi3HHJOqV6Bvx5o3NP50/MTT/mNiNPmL5dPzeiWaXHsaOgWydRiINh5lPz+BZ0z2ZRzhbGyaLW23oJYLr/NPS3+cTJx73q9nMUPTTp8KTNWFJ0HKsBa2wZUVkO37hlJk0CQlIR0V+Lum4NZ8OEwZ7UVxkELWaAaAblmzxeqWMIK4yhi9Wz7WJqYGuI/5H12vonqUGJJlK2l53e0V/7P/bfMfhynm0YTn2NtNV+LSJYATg==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=WHReWNORxjACEptDw82Gy3MH+PnU+A+4SvkphC4zF19+HMrKqbNmh3AxjgqQ9MWNWzIveFwQrDtWwYfNxHUd0bvKa7tpnoJ03Vm4BujpmpLDhPXzKZ91p+RooPcONNUJd8+OGnhDjSiraQ2ORXoJSdzIlYXMlud5gAtqSrup6b92HrXcEmMZBVMXkj4K2mUhw1buen4xH/u/EF0qj2X12BVeldiol7UPhNtiH3wYakkvim2dFUx/Z09teGhyXvOr/7saqh4V5mfZm1aGFFW/qJLo6GTlvPwzMAMC+qZ23m7DSowuFWzVAGhrYTzfx8T982g/bHkbsuiOJrZP4M5b0Q==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=epam.com header.i="@epam.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:x-ms-exchange-senderadcheck"
  • Authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=epam.com;
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>
  • Delivery-date: Tue, 13 Oct 2026 02:59:18 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Thread-index: AQHdUEUWBir3UQDjYEWvHkcwQ5Z1KA==
  • Thread-topic: [PATCH v4 3/4] xen/arm: its: refactor ITS quirk matching

Hi,

Mykola Kvach <mykola_kvach@xxxxxxxx> 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@xxxxxxxx>

Reviewed-by: Volodymyr Babchuk <volodymyr_babchuk@xxxxxxxx>


> ---
> 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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.