hw/arm/smmuv3: Add knob to choose translation stage and enable stage-2
As everything is in place, we can use a new system property to advertise which stage is supported and remove bad_ste from STE stage2 config. The property added arm-smmuv3.stage can have 3 values: - "1": Stage-1 only is advertised. - "2": Stage-2 only is advertised. If not passed or an unsupported value is passed, it will default to stage-1. Advertise VMID16. Don't try to decode CD, if stage-2 is configured. Reviewed-by: Eric Auger <eric.auger@redhat.com> Signed-off-by: Mostafa Saleh <smostafa@google.com> Tested-by: Eric Auger <eric.auger@redhat.com> Tested-by: Jean-Philippe Brucker <jean-philippe@linaro.org> Message-id: 20230516203327.2051088-11-smostafa@google.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
32bd7baec2
commit
8cefcc3b71
@ -21,6 +21,7 @@
|
||||
#include "hw/irq.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/qdev-core.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "cpu.h"
|
||||
@ -241,14 +242,17 @@ void smmuv3_record_event(SMMUv3State *s, SMMUEventInfo *info)
|
||||
|
||||
static void smmuv3_init_regs(SMMUv3State *s)
|
||||
{
|
||||
/**
|
||||
* IDR0: stage1 only, AArch64 only, coherent access, 16b ASID,
|
||||
* multi-level stream table
|
||||
*/
|
||||
s->idr[0] = FIELD_DP32(s->idr[0], IDR0, S1P, 1); /* stage 1 supported */
|
||||
/* Based on sys property, the stages supported in smmu will be advertised.*/
|
||||
if (s->stage && !strcmp("2", s->stage)) {
|
||||
s->idr[0] = FIELD_DP32(s->idr[0], IDR0, S2P, 1);
|
||||
} else {
|
||||
s->idr[0] = FIELD_DP32(s->idr[0], IDR0, S1P, 1);
|
||||
}
|
||||
|
||||
s->idr[0] = FIELD_DP32(s->idr[0], IDR0, TTF, 2); /* AArch64 PTW only */
|
||||
s->idr[0] = FIELD_DP32(s->idr[0], IDR0, COHACC, 1); /* IO coherent */
|
||||
s->idr[0] = FIELD_DP32(s->idr[0], IDR0, ASID16, 1); /* 16-bit ASID */
|
||||
s->idr[0] = FIELD_DP32(s->idr[0], IDR0, VMID16, 1); /* 16-bit VMID */
|
||||
s->idr[0] = FIELD_DP32(s->idr[0], IDR0, TTENDIAN, 2); /* little endian */
|
||||
s->idr[0] = FIELD_DP32(s->idr[0], IDR0, STALL_MODEL, 1); /* No stall */
|
||||
/* terminated transaction will always be aborted/error returned */
|
||||
@ -452,10 +456,6 @@ static int decode_ste_s2_cfg(SMMUTransCfg *cfg, STE *ste)
|
||||
goto bad_ste;
|
||||
}
|
||||
|
||||
/* This is still here as stage 2 has not been fully enabled yet. */
|
||||
qemu_log_mask(LOG_UNIMP, "SMMUv3 does not support stage 2 yet\n");
|
||||
goto bad_ste;
|
||||
|
||||
return 0;
|
||||
|
||||
bad_ste:
|
||||
@ -734,7 +734,7 @@ static int smmuv3_decode_config(IOMMUMemoryRegion *mr, SMMUTransCfg *cfg,
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (cfg->aborted || cfg->bypassed) {
|
||||
if (cfg->aborted || cfg->bypassed || (cfg->stage == 2)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1805,6 +1805,17 @@ static const VMStateDescription vmstate_smmuv3 = {
|
||||
}
|
||||
};
|
||||
|
||||
static Property smmuv3_properties[] = {
|
||||
/*
|
||||
* Stages of translation advertised.
|
||||
* "1": Stage 1
|
||||
* "2": Stage 2
|
||||
* Defaults to stage 1
|
||||
*/
|
||||
DEFINE_PROP_STRING("stage", SMMUv3State, stage),
|
||||
DEFINE_PROP_END_OF_LIST()
|
||||
};
|
||||
|
||||
static void smmuv3_instance_init(Object *obj)
|
||||
{
|
||||
/* Nothing much to do here as of now */
|
||||
@ -1821,6 +1832,7 @@ static void smmuv3_class_init(ObjectClass *klass, void *data)
|
||||
&c->parent_phases);
|
||||
c->parent_realize = dc->realize;
|
||||
dc->realize = smmu_realize;
|
||||
device_class_set_props(dc, smmuv3_properties);
|
||||
}
|
||||
|
||||
static int smmuv3_notify_flag_changed(IOMMUMemoryRegion *iommu,
|
||||
|
@ -62,6 +62,7 @@ struct SMMUv3State {
|
||||
|
||||
qemu_irq irq[4];
|
||||
QemuMutex mutex;
|
||||
char *stage;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
|
Loading…
x
Reference in New Issue
Block a user