On 9/26/25 5:23 AM, Tao Tang wrote:
> My apologies, resending patches 13-14/14 to fix a threading mistake from
> my previous attempt.
>
> This commit completes the initial implementation of the Secure SMMUv3
> model by making the feature user-configurable.
>
> A new boolean property, "secure-impl", is introduced to the device.
> This property defaults to false, ensuring backward compatibility for
> existing machine types that do not expect the secure programming
> interface.
>
> When "secure-impl" is set to true, the smmuv3_init_regs function now
> initializes the secure register bank (bank[SMMU_SEC_IDX_S]). Crucially,
> the S_IDR1.SECURE_IMPL bit is set according to this property,
> correctly advertising the presence of the secure functionality to the
> guest.
>
> This patch ties together all the previous refactoring work. With this
> property enabled, the banked registers, security-aware queues, and
> other secure features become active, allowing a guest to probe and
> configure the Secure SMMU.
>
> Signed-off-by: Tao Tang <[email protected]>
> ---
>  hw/arm/smmuv3.c | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
>
> diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
> index c92cc0f06a..80fbc25cf5 100644
> --- a/hw/arm/smmuv3.c
> +++ b/hw/arm/smmuv3.c
> @@ -351,6 +351,16 @@ static void smmuv3_init_regs(SMMUv3State *s)
>      s->statusr = 0;
>      s->bank[SMMU_SEC_IDX_NS].gbpa = SMMU_GBPA_RESET_VAL;
>
> +    /* Initialize Secure bank (SMMU_SEC_IDX_S) */
same comment as before, use a local pointer to the secure bank.
> +    memset(s->bank[SMMU_SEC_IDX_S].idr, 0, 
> sizeof(s->bank[SMMU_SEC_IDX_S].idr));
> +    s->bank[SMMU_SEC_IDX_S].idr[1] = 
> FIELD_DP32(s->bank[SMMU_SEC_IDX_S].idr[1],
> +                                                S_IDR1, SECURE_IMPL,
> +                                                s->secure_impl);
> +    s->bank[SMMU_SEC_IDX_S].idr[1] = FIELD_DP32(
> +        s->bank[SMMU_SEC_IDX_S].idr[1], IDR1, SIDSIZE, SMMU_IDR1_SIDSIZE);
> +    s->bank[SMMU_SEC_IDX_S].gbpa = SMMU_GBPA_RESET_VAL;
> +    s->bank[SMMU_SEC_IDX_S].cmdq.entry_size = sizeof(struct Cmd);
> +    s->bank[SMMU_SEC_IDX_S].eventq.entry_size = sizeof(struct Evt);
>  }
>
>  static int smmu_get_ste(SMMUv3State *s, dma_addr_t addr, STE *buf,
> @@ -2505,6 +2515,12 @@ static const Property smmuv3_properties[] = {
>       * Defaults to stage 1
>       */
>      DEFINE_PROP_STRING("stage", SMMUv3State, stage),
> +    /*
> +     * SECURE_IMPL field in S_IDR1 register.
> +     * Indicates whether secure state is implemented.
> +     * Defaults to false (0)
> +     */
> +    DEFINE_PROP_BOOL("secure-impl", SMMUv3State, secure_impl, false),
>  };
I would introduce the secure-impl property at the very end of the series
because at this point migration is not yet supported.
By the way the secure_impl field can be introduced in the first which
uses it. I don't think "hw/arm/smmuv3: Introduce banked registers for
SMMUv3 state" does

Thanks

Eric
>
>  static void smmuv3_instance_init(Object *obj)
> --
> 2.34.1
>


Reply via email to