[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 02/23] xen/arm: smmuv3: Add support for stage-1 and nested stage translation
- To: Milan Djokic <milan_djokic@xxxxxxxx>
- From: Luca Fancellu <Luca.Fancellu@xxxxxxx>
- Date: Fri, 10 Apr 2026 09:49:44 +0000
- Accept-language: en-GB, en-US
- Arc-authentication-results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 4.158.2.129) smtp.rcpttodomain=epam.com smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=arm.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com])
- Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
- Arc-message-signature: i=2; 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=vVgyjBTtCX07ZpKFHLpzvdKbsO7kkUaRqgnNl2EMaXY=; b=F3gQ7r07xl0x04BclqLOvLSO4oIXK3TFb9VqWY7v15lsmze2hRLWlOU993qG/xdBXI9Cfiib6RhOv+HrfLLIV1fJdGHdVh3bBzwyGxuLagkXQiJyoF2taj1U3AFNs17PRcnf7+2LDgrIIKnhMmo0yRpsgQ3vRKbr8haVdeIccbXQZ2zelckrQmpPSzHkGAVL+sChDWrv28FhbSpVjrPDg6ZyOdWlxTgUBFBSf9y9hqhDT7+fujSkddL1HmstxvHuQPPXkaFU0hioXGq7vuH5nb39wSMiLcQ4Q3NXw3LGgkfyprp+oJBdQXBEPPvazYqZOHfj3a47NUf1WCye0eLuww==
- 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=vVgyjBTtCX07ZpKFHLpzvdKbsO7kkUaRqgnNl2EMaXY=; b=bxA2mPPLmogw7Cpz66iOaf7ojBj3uoQLZ2nmNQ25sLlOQTbr3P3S0CUNC9IlKJsOwux9WT/rfBqD//ks9cDzAxLh/i4VFc3izQ0q6uIlQUA6w+XOS6nu+ueTuxEVEVfteMRZrETT597oCqkvBmykghhplBmFYCA+xXOqxNeg7Y0gLBm/jmLPxysWCUTl4jR0qcsLv+d3Xq88uWiFb/Tf0HN2u//zN0+smKwVgJKcjpKIwSdqaALSvgiy6Ktb3q7oQA2+iABC/k2nD4/A7K2zW2CiG1lm3UBA+OCUWEN6rq4y7JnaWb1yAajkGDCXqI3TS3a7hVtKx6fdMwa/9UL8KA==
- Arc-seal: i=2; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=pass; b=wWe67Ae4MJVZQDKJ0aeEMXtm8Hk6mvbMsK0hUwKxEuqtQxxx1BDQUfm6Rl0/uHFquAHekPQ2xNONOPq29k5rhCnH7daOiyliqo9zPp/+Fa5SSOwZkO4UhNDVD4oNoJa6yqDe9XzpS/wOFdahyf3enmf9cVgnLmFt9nW9PWXwJfyRNLgEl2rZRKJ33cSRPHl2Z0/whAGzeOw/2HpnoLQqBU3OcK66/ZEHejcaUbzvhdvOxZw139hnAs+XoeT1GrhwJY9nQB6fTNptmRoveQ/MmXy4/iUswhxBE16Zb7LDzcbKiZjKuJkIAkKkD59vogyLjV7JmKBXTiGypsQJzkHabQ==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=wnD7LxKTGAAyKaShcN57+W8wfjdLDtKOoUjH7HAenWRKA9RbJbRUMaVQ09JHZuXaMbfXLYX4UBFhKxvDVXXRGS5rBTlPG7RjUx4ne4WiN1w/h5AJipZ8Io7AVyI21MONDr2mlT1UcBcRSA+1LpGc+dPM00oJn/wKACpN9XNvzaUemwsxNK+ClCQihBfrB5/f3iMKrKcHam9Adzvp7tvyDacR7GnNcoA23+GhMf59R2tGSHXL+mondXVWMAQyn/rjoSz1N0/VVQe2Z/vJhagcqkud0Dy0IXhjKPcK+i5pq3sl9xqB4YgK9LKHeinDbMk57ixXKoZXW+XBtk5NF8IGEg==
- Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=arm.com header.i="@arm.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"; dkim=pass header.s=selector1 header.d=arm.com header.i="@arm.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
- Authentication-results-original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
- Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Rahul Singh <Rahul.Singh@xxxxxxx>, Bertrand Marquis <Bertrand.Marquis@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
- Delivery-date: Fri, 10 Apr 2026 09:51:03 +0000
- List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
- Nodisclaimer: true
- Thread-index: AQHcyM9b450W5XzxrEi9kyX2pw4Gzg==
- Thread-topic: [PATCH v3 02/23] xen/arm: smmuv3: Add support for stage-1 and nested stage translation
Hi Milan,
> @@ -740,7 +766,33 @@ static void arm_smmu_write_strtab_ent(struct
> arm_smmu_master *master, u32 sid,
> return;
> }
>
> + if (ste_live) {
> + /* First invalidate the live STE */
> + dst[0] = cpu_to_le64(STRTAB_STE_0_CFG_ABORT);
> + arm_smmu_sync_ste_for_sid(smmu, sid);
> + }
> +
> + if (s1_cfg) {
> + BUG_ON(s1_live);
I think this is wrong, if a guest issues another s1 update on the same sid,
this will crash Xen, I think
that we’ve already invalidated the live status so this one should be removed
> + dst[1] = cpu_to_le64(
> + FIELD_PREP(STRTAB_STE_1_S1DSS, STRTAB_STE_1_S1DSS_SSID0) |
> + FIELD_PREP(STRTAB_STE_1_S1CIR, STRTAB_STE_1_S1C_CACHE_WBRA) |
> + FIELD_PREP(STRTAB_STE_1_S1COR, STRTAB_STE_1_S1C_CACHE_WBRA) |
> + FIELD_PREP(STRTAB_STE_1_S1CSH, ARM_SMMU_SH_ISH) |
> + FIELD_PREP(STRTAB_STE_1_STRW, STRTAB_STE_1_STRW_NSEL1));
> +
> + if (smmu->features & ARM_SMMU_FEAT_STALLS &&
> + !(smmu->features & ARM_SMMU_FEAT_STALL_FORCE))
> + dst[1] |= cpu_to_le64(STRTAB_STE_1_S1STALLD);
> +
> + val |= (s1_cfg->s1ctxptr & STRTAB_STE_0_S1CTXPTR_MASK) |
> + FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_S1_TRANS) |
> + FIELD_PREP(STRTAB_STE_0_S1CDMAX, s1_cfg->s1cdmax) |
> + FIELD_PREP(STRTAB_STE_0_S1FMT, s1_cfg->s1fmt);
> + }
> +
> if (s2_cfg) {
> + u64 vttbr = s2_cfg->vttbr & STRTAB_STE_3_S2TTB_MASK;
> u64 strtab =
> FIELD_PREP(STRTAB_STE_2_S2VMID, s2_cfg->vmid) |
> FIELD_PREP(STRTAB_STE_2_VTCR, s2_cfg->vtcr) |
> @@ -750,12 +802,19 @@ static void arm_smmu_write_strtab_ent(struct
> arm_smmu_master *master, u32 sid,
> STRTAB_STE_2_S2PTW | STRTAB_STE_2_S2AA64 |
> STRTAB_STE_2_S2R;
>
> - BUG_ON(ste_live);
> + if (s2_live) {
> + u64 s2ttb = le64_to_cpu(dst[3]) & STRTAB_STE_3_S2TTB_MASK;
> + BUG_ON(s2ttb != vttbr);
> + }
> +
> dst[2] = cpu_to_le64(strtab);
>
> - dst[3] = cpu_to_le64(s2_cfg->vttbr & STRTAB_STE_3_S2TTB_MASK);
> + dst[3] = cpu_to_le64(vttbr);
>
> val |= FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_S2_TRANS);
> + } else {
> + dst[2] = 0;
> + dst[3] = 0;
> }
>
> if (master->ats_enabled)
> @@ -1254,6 +1313,15 @@ static int arm_smmu_domain_finalise(struct
> iommu_domain *domain,
> {
> int ret;
> struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
> + struct arm_smmu_device *smmu = smmu_domain->smmu;
> +
> + if (smmu_domain->stage == ARM_SMMU_DOMAIN_NESTED &&
> + (!(smmu->features & ARM_SMMU_FEAT_TRANS_S1) ||
> + !(smmu->features & ARM_SMMU_FEAT_TRANS_S2))) {
> + dev_info(smmu_domain->smmu->dev,
> + "does not implement two stages\n");
> + return -EINVAL;
> + }
>
> /* Restrict the stage to what we can actually support */
> smmu_domain->stage = ARM_SMMU_DOMAIN_S2;
Here we set stage 2 as default, but in arm_smmu_device_hw_probe() we’ve
deleted the check for S2 required, so if we have an HW with only S1 the probe
will
succeed but we will wrongly set here S2, so I would keep ...
> @@ -2353,11 +2421,14 @@ static int arm_smmu_device_hw_probe(struct
> arm_smmu_device *smmu)
> break;
> }
>
> + if (reg & IDR0_S1P)
> + smmu->features |= ARM_SMMU_FEAT_TRANS_S1;
> +
> if (reg & IDR0_S2P)
> smmu->features |= ARM_SMMU_FEAT_TRANS_S2;
>
> - if (!(reg & IDR0_S2P)) {
> - dev_err(smmu->dev, "no stage-2 translation support!\n");
this change, rearranged in the way that is sensible with the new logic.
> + if (!(reg & (IDR0_S1P | IDR0_S2P))) {
> + dev_err(smmu->dev, "no translation support!\n");
> return -ENXIO;
> }
>
|