Factor out ID register init into smmuv3_init_id_regs() and call it from realize(). This ensures ID registers are initialized early for use in the accelerated SMMUv3 path and will be utilized in subsequent patch.
Other registers remain initialized in smmuv3_reset(). Signed-off-by: Shameer Kolothum <[email protected]> --- hw/arm/smmuv3.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c index 15173ddc9c..fae545f35c 100644 --- a/hw/arm/smmuv3.c +++ b/hw/arm/smmuv3.c @@ -258,7 +258,12 @@ void smmuv3_record_event(SMMUv3State *s, SMMUEventInfo *info) info->recorded = true; } -static void smmuv3_init_regs(SMMUv3State *s) +/* + * Called during realize(), as the ID registers will be accessed early in the + * SMMUv3 accel path for feature compatibility checks. The remaining registers + * are initialized later in smmuv3_reset(). + */ +static void smmuv3_init_id_regs(SMMUv3State *s) { /* Based on sys property, the stages supported in smmu will be advertised.*/ if (s->stage && !strcmp("2", s->stage)) { @@ -298,7 +303,11 @@ static void smmuv3_init_regs(SMMUv3State *s) s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN4K, 1); s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN16K, 1); s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN64K, 1); + s->aidr = 0x1; +} +static void smmuv3_reset(SMMUv3State *s) +{ s->cmdq.base = deposit64(s->cmdq.base, 0, 5, SMMU_CMDQS); s->cmdq.prod = 0; s->cmdq.cons = 0; @@ -310,7 +319,6 @@ static void smmuv3_init_regs(SMMUv3State *s) s->features = 0; s->sid_split = 0; - s->aidr = 0x1; s->cr[0] = 0; s->cr0ack = 0; s->irq_ctrl = 0; @@ -1915,7 +1923,7 @@ static void smmu_reset_exit(Object *obj, ResetType type) c->parent_phases.exit(obj, type); } - smmuv3_init_regs(s); + smmuv3_reset(s); smmuv3_accel_reset(s); } @@ -1947,6 +1955,7 @@ static void smmu_realize(DeviceState *d, Error **errp) sysbus_init_mmio(dev, &sys->iomem); smmu_init_irq(s, dev); + smmuv3_init_id_regs(s); } static const VMStateDescription vmstate_smmuv3_queue = { -- 2.43.0
