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)) {
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;
s->features = 0;
s->sid_split = 0;
- s->aidr = 0x1;
s->cr[0] = 0;
s->cr0ack = 0;
s->irq_ctrl = 0;
c->parent_phases.exit(obj, type);
}
- smmuv3_init_regs(s);
+ smmuv3_reset(s);
smmuv3_accel_reset(s);
}
sysbus_init_mmio(dev, &sys->iomem);
smmu_init_irq(s, dev);
+ smmuv3_init_id_regs(s);
}
static const VMStateDescription vmstate_smmuv3_queue = {