All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mostafa Saleh <smostafa@google.com>
To: Eric Auger <eric.auger@redhat.com>
Cc: qemu-arm@nongnu.org, peter.maydell@linaro.org,
	qemu-devel@nongnu.org, jean-philippe@linaro.org,
	alex.bennee@linaro.org, maz@kernel.org, nicolinc@nvidia.com,
	julien@xen.org, richard.henderson@linaro.org,
	marcin.juszkiewicz@linaro.org
Subject: Re: [RFC PATCH v3 10/18] hw/arm/smmu-common: Support nested translation
Date: Mon, 17 Jun 2024 14:57:55 +0000	[thread overview]
Message-ID: <ZnBO8wuegTVZZBRV@google.com> (raw)
In-Reply-To: <770312ee-8093-431a-bfdf-b01ca90945cf@redhat.com>

Hi Eric,

On Mon, May 20, 2024 at 11:48:18AM +0200, Eric Auger wrote:
> Hi Mostafa,
> 
> On 4/29/24 05:23, Mostafa Saleh wrote:
> > When nested translation is requested, do the following:
> >
> > - Translate stage-1 IPA using stage-2 to a physical address.
> stage-1 table address IPA into PA through S2 stage
> 
Will do.

> > - Translate stage-1 table walks using stage-2.
> output of S1 stage (IPA) through S2.
Will do.

> > - Combine both to create a single TLB entry using the logic
> >   introduced before.
> this applies to second only. First one is associated with an S2 TLB
> entry, right?
Yes, I will clarify that.

> >
> > For stage-1 table translation, the spec (ARM IHI 0070 F.b) says in:
> >     7.3.12 F_WALK_EABT:
> >         Translation of an IPA for Stage 1 descriptor fetch:
> > 	S2 == 1 (stage 2), CLASS == T
> > So, F_WALK_EABT is used which propagtes to CLASS == TT.
> >
> > smmu_ptw() has a new argument SMMUState which include the TLB as
> > stage-1 table address can be cached in there.
> >
> > Also in smmu_ptw() a separate path used for nesting to simplify the
> > code, although some logic can be combined.
> >
> > Signed-off-by: Mostafa Saleh <smostafa@google.com>
> > ---
> >  hw/arm/smmu-common.c         | 67 ++++++++++++++++++++++++++++++------
> >  include/hw/arm/smmu-common.h |  2 +-
> >  2 files changed, 58 insertions(+), 11 deletions(-)
> >
> > diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
> > index c67af3bc6d..d48ec08947 100644
> > --- a/hw/arm/smmu-common.c
> > +++ b/hw/arm/smmu-common.c
> > @@ -306,6 +306,32 @@ SMMUTransTableInfo *select_tt(SMMUTransCfg *cfg, dma_addr_t iova)
> >      return NULL;
> >  }
> >  
> > +/* Translate stage-1 table address using stage-2 page table. */
> > +static inline int translate_table_s1(dma_addr_t *table_addr, SMMUTransCfg *cfg,
> > +                                     SMMUPTWEventInfo *info, SMMUState *bs)
> would suggest translate_table_addr_ipa().
Wil do.
> > +{
> > +    dma_addr_t addr = *table_addr;
> > +    SMMUTLBEntry *cached_entry;
> > +    int asid;
> > +
> > +    asid = cfg->asid;
> > +    cfg->stage = SMMU_STAGE_2;
> > +    cfg->asid = -1;
> > +    cached_entry = smmu_translate(bs, cfg, addr, IOMMU_RO, info);
> so this is going to be cached as an S2 entry. Maybe worth adding a comment.

This is part of the IPA space and it is translated using a stage-2 page table,
so it would be cached as an S2, I will add a comment quoting the spec.

Thanks,
Mostafa
> > +    cfg->asid = asid;
> > +    cfg->stage = SMMU_NESTED;
> > +
> > +    if (cached_entry) {
> > +        *table_addr = CACHED_ENTRY_TO_ADDR(cached_entry, addr);
> > +        return 0;
> > +    }
> > +
> > +    info->stage = SMMU_STAGE_2;
> > +    info->type = SMMU_PTW_ERR_WALK_EABT;
> > +    info->addr = addr;
> > +    return -EINVAL;
> > +}
> > +
> >  /**
> >   * smmu_ptw_64_s1 - VMSAv8-64 Walk of the page tables for a given IOVA
> >   * @cfg: translation config
> > @@ -321,7 +347,8 @@ SMMUTransTableInfo *select_tt(SMMUTransCfg *cfg, dma_addr_t iova)
> >   */
> >  static int smmu_ptw_64_s1(SMMUTransCfg *cfg,
> >                            dma_addr_t iova, IOMMUAccessFlags perm,
> > -                          SMMUTLBEntry *tlbe, SMMUPTWEventInfo *info)
> > +                          SMMUTLBEntry *tlbe, SMMUPTWEventInfo *info,
> > +                          SMMUState *bs)
> >  {
> >      dma_addr_t baseaddr, indexmask;
> >      SMMUStage stage = cfg->stage;
> > @@ -369,6 +396,11 @@ static int smmu_ptw_64_s1(SMMUTransCfg *cfg,
> >                  goto error;
> >              }
> >              baseaddr = get_table_pte_address(pte, granule_sz);
> > +            if (cfg->stage == SMMU_NESTED) {
> > +                if (translate_table_s1(&baseaddr, cfg, info, bs)) {
> > +                    goto error;
> > +                }
> > +            }
> >              level++;
> >              continue;
> >          } else if (is_page_pte(pte, level)) {
> > @@ -551,10 +583,8 @@ error:
> >  }
> >  
> >  /* combine 2 TLB entries and return in tlbe in nested config. */
> > -static void __attribute__((unused)) combine_tlb(SMMUTLBEntry *tlbe,
> > -                                                SMMUTLBEntry *tlbe_s2,
> > -                                                dma_addr_t iova,
> > -                                                SMMUTransCfg *cfg)
> > +static void combine_tlb(SMMUTLBEntry *tlbe, SMMUTLBEntry *tlbe_s2,
> > +                        dma_addr_t iova, SMMUTransCfg *cfg)
> >  {
> >      if (tlbe_s2->entry.addr_mask < tlbe->entry.addr_mask) {
> >          tlbe->entry.addr_mask = tlbe_s2->entry.addr_mask;
> > @@ -579,14 +609,19 @@ static void __attribute__((unused)) combine_tlb(SMMUTLBEntry *tlbe,
> >   * @perm: tentative access type
> >   * @tlbe: returned entry
> >   * @info: ptw event handle
> > + * @bs: smmu state which includes TLB instance
> >   *
> >   * return 0 on success
> >   */
> >  int smmu_ptw(SMMUTransCfg *cfg, dma_addr_t iova, IOMMUAccessFlags perm,
> > -             SMMUTLBEntry *tlbe, SMMUPTWEventInfo *info)
> > +             SMMUTLBEntry *tlbe, SMMUPTWEventInfo *info, SMMUState *bs)
> >  {
> > +    int ret;
> > +    SMMUTLBEntry tlbe_s2;
> > +    dma_addr_t ipa;
> > +
> >      if (cfg->stage == SMMU_STAGE_1) {
> > -        return smmu_ptw_64_s1(cfg, iova, perm, tlbe, info);
> > +        return smmu_ptw_64_s1(cfg, iova, perm, tlbe, info, bs);
> >      } else if (cfg->stage == SMMU_STAGE_2) {
> >          /*
> >           * If bypassing stage 1(or unimplemented), the input address is passed
> > @@ -600,11 +635,23 @@ int smmu_ptw(SMMUTransCfg *cfg, dma_addr_t iova, IOMMUAccessFlags perm,
> >              tlbe->entry.perm = IOMMU_NONE;
> >              return -EINVAL;
> >          }
> > -
> spurious line change
> >          return smmu_ptw_64_s2(cfg, iova, perm, tlbe, info);
> >      }
> >  
> > -    g_assert_not_reached();
> > +    /* SMMU_NESTED. */
> > +    ret = smmu_ptw_64_s1(cfg, iova, perm, tlbe, info, bs);
> > +    if (ret) {
> > +        return ret;
> > +    }
> > +
> > +    ipa = CACHED_ENTRY_TO_ADDR(tlbe, iova);
> > +    ret = smmu_ptw_64_s2(cfg, ipa, perm, &tlbe_s2, info);
> > +    if (ret) {
> > +        return ret;
> > +    }
> > +
> > +    combine_tlb(tlbe, &tlbe_s2, iova, cfg);
> > +    return 0;
> >  }
> >  
> >  SMMUTLBEntry *smmu_translate(SMMUState *bs, SMMUTransCfg *cfg, dma_addr_t addr,
> > @@ -660,7 +707,7 @@ SMMUTLBEntry *smmu_translate(SMMUState *bs, SMMUTransCfg *cfg, dma_addr_t addr,
> >      }
> >  
> >      cached_entry = g_new0(SMMUTLBEntry, 1);
> > -    status = smmu_ptw(cfg, aligned_addr, flag, cached_entry, info);
> > +    status = smmu_ptw(cfg, aligned_addr, flag, cached_entry, info, bs);
> >      if (status) {
> >              g_free(cached_entry);
> >              return NULL;
> > diff --git a/include/hw/arm/smmu-common.h b/include/hw/arm/smmu-common.h
> > index 1db566d451..cf0fd3ec74 100644
> > --- a/include/hw/arm/smmu-common.h
> > +++ b/include/hw/arm/smmu-common.h
> > @@ -185,7 +185,7 @@ static inline uint16_t smmu_get_sid(SMMUDevice *sdev)
> >   * pair, according to @cfg translation config
> >   */
> >  int smmu_ptw(SMMUTransCfg *cfg, dma_addr_t iova, IOMMUAccessFlags perm,
> > -             SMMUTLBEntry *tlbe, SMMUPTWEventInfo *info);
> > +             SMMUTLBEntry *tlbe, SMMUPTWEventInfo *info, SMMUState *bs);
> >  
> >  
> >  /*
> Thanks
> 
> Eric
> 

  reply	other threads:[~2024-06-17 14:58 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-29  3:23 [RFC PATCH v3 00/18] SMMUv3 nested translation support Mostafa Saleh
2024-04-29  3:23 ` [RFC PATCH v3 01/18] hw/arm/smmu-common: Add missing size check for stage-1 Mostafa Saleh
2024-05-13 11:30   ` Eric Auger
2024-04-29  3:23 ` [RFC PATCH v3 02/18] hw/arm/smmu: Fix IPA for stage-2 events Mostafa Saleh
2024-05-13 11:47   ` Eric Auger
2024-05-16 14:43     ` Mostafa Saleh
2024-04-29  3:23 ` [RFC PATCH v3 03/18] hw/arm/smmuv3: Fix encoding of CLASS in events Mostafa Saleh
2024-05-15 12:27   ` Eric Auger
2024-05-16 14:50     ` Mostafa Saleh
2024-04-29  3:23 ` [RFC PATCH v3 04/18] hw/arm/smmu: Use enum for SMMU stage Mostafa Saleh
2024-05-15 20:25   ` Alex Bennée
2024-04-29  3:23 ` [RFC PATCH v3 05/18] hw/arm/smmu: Split smmuv3_translate() Mostafa Saleh
2024-04-29  3:23 ` [RFC PATCH v3 06/18] hw/arm/smmu: Consolidate ASID and VMID types Mostafa Saleh
2024-05-15 12:41   ` Eric Auger
2024-06-17 14:55     ` Mostafa Saleh
2024-04-29  3:23 ` [RFC PATCH v3 07/18] hw/arm/smmuv3: Translate CD and TT using stage-2 table Mostafa Saleh
2024-05-15 13:15   ` Eric Auger
2024-05-16 16:11     ` Mostafa Saleh
2024-04-29  3:23 ` [RFC PATCH v3 08/18] hw/arm/smmu-common: Add support for nested TLB Mostafa Saleh
2024-05-15 13:48   ` Eric Auger
2024-05-16 15:20     ` Mostafa Saleh
2024-05-20  8:20       ` Eric Auger
2024-05-22 12:44         ` Mostafa Saleh
2024-06-17 14:56           ` Mostafa Saleh
2024-04-29  3:23 ` [RFC PATCH v3 09/18] hw/arm/smmu-common: Rework TLB lookup for nesting Mostafa Saleh
2024-05-15 13:54   ` Eric Auger
2024-05-16 15:30     ` Mostafa Saleh
2024-05-20  8:27   ` Eric Auger
2024-05-22 12:47     ` Mostafa Saleh
2024-04-29  3:23 ` [RFC PATCH v3 10/18] hw/arm/smmu-common: Support nested translation Mostafa Saleh
2024-05-20  9:48   ` Eric Auger
2024-06-17 14:57     ` Mostafa Saleh [this message]
2024-04-29  3:23 ` [RFC PATCH v3 11/18] hw/arm/smmu: Support nesting in smmuv3_range_inval() Mostafa Saleh
2024-04-29  3:23 ` [RFC PATCH v3 12/18] hw/arm/smmu: Support nesting in the rest of commands Mostafa Saleh
2024-05-20 10:24   ` Eric Auger
2024-06-17 14:58     ` Mostafa Saleh
2024-04-29  3:23 ` [RFC PATCH v3 13/18] hw/arm/smmuv3: Support nested SMMUs in smmuv3_notify_iova() Mostafa Saleh
2024-05-20 10:37   ` Eric Auger
2024-06-17 15:02     ` Mostafa Saleh
2024-04-29  3:23 ` [RFC PATCH v3 14/18] hw/arm/smmuv3: Support and advertise nesting Mostafa Saleh
2024-05-20 13:16   ` Eric Auger
2024-06-17 15:03     ` Mostafa Saleh
2024-04-29  3:23 ` [RFC PATCH v3 15/18] hw/arm/smmuv3: Advertise S2FWB Mostafa Saleh
2024-05-20 13:30   ` Eric Auger
2024-06-17 15:04     ` Mostafa Saleh
2024-04-29  3:24 ` [RFC PATCH v3 16/18] hw/arm/smmu: Refactor SMMU OAS Mostafa Saleh
2024-05-20 13:59   ` Eric Auger
2024-04-29  3:24 ` [RFC PATCH v3 17/18] hw/arm/smmuv3: Add property for OAS Mostafa Saleh
2024-05-21  9:32   ` Eric Auger
2024-06-27 11:50     ` Mostafa Saleh
2024-04-29  3:24 ` [RFC PATCH v3 18/18] hw/arm/virt: Set SMMU OAS based on CPU PARANGE Mostafa Saleh
2024-05-21  9:43   ` Eric Auger
2024-05-24 17:22   ` Julien Grall
2024-06-27 11:44     ` Mostafa Saleh
2024-05-13 13:57 ` [RFC PATCH v3 00/18] SMMUv3 nested translation support Julien Grall
2024-05-21  9:47 ` Eric Auger
2024-05-27 16:12   ` Mostafa Saleh

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=ZnBO8wuegTVZZBRV@google.com \
    --to=smostafa@google.com \
    --cc=alex.bennee@linaro.org \
    --cc=eric.auger@redhat.com \
    --cc=jean-philippe@linaro.org \
    --cc=julien@xen.org \
    --cc=marcin.juszkiewicz@linaro.org \
    --cc=maz@kernel.org \
    --cc=nicolinc@nvidia.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.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.