/* Enable translation debug interface */
s->cap = RISCV_IOMMU_CAP_DBG;
- /* Report QEMU target physical address space limits */
- s->cap = set_field(s->cap, RISCV_IOMMU_CAP_PAS,
- TARGET_PHYS_ADDR_SPACE_BITS);
-
/* TODO: method to report supported PID bits */
s->pid_bits = 8; /* restricted to size of MemTxAttrs.pid */
s->cap |= RISCV_IOMMU_CAP_PD8;
{
RISCVIOMMUState *s = RISCV_IOMMU(dev);
+ /* Report QEMU target physical address space limits. */
+ s->cap = set_field(s->cap, RISCV_IOMMU_CAP_PAS, s->pas_bits);
+
s->cap |= s->version & RISCV_IOMMU_CAP_VERSION;
if (s->enable_msi) {
s->cap |= RISCV_IOMMU_CAP_MSI_FLAT | RISCV_IOMMU_CAP_MSI_MRIF;
static const Property riscv_iommu_properties[] = {
DEFINE_PROP_UINT32("version", RISCVIOMMUState, version,
RISCV_IOMMU_SPEC_DOT_VER),
+ DEFINE_PROP_UINT32("pas-bits", RISCVIOMMUState, pas_bits, 0),
DEFINE_PROP_UINT32("bus", RISCVIOMMUState, bus, 0x0),
DEFINE_PROP_UINT32("ioatc-limit", RISCVIOMMUState, iot_limit,
LIMIT_CACHE_IOT),
/*< public >*/
uint32_t version; /* Reported interface version number */
uint32_t pid_bits; /* process identifier width */
+ uint32_t pas_bits; /* physical address bits */
uint32_t bus; /* PCI bus mapping for non-root endpoints */
uint64_t cap; /* IOMMU supported capabilities */
object_property_set_link(OBJECT(iommu_sys), "irqchip",
OBJECT(mmio_irqchip),
&error_fatal);
+ /*
+ * For riscv64 use a physical address size of 56 bits (44 bit PPN),
+ * and for riscv32 use 34 bits (22 bit PPN).
+ */
+ object_property_set_uint(OBJECT(iommu_sys), "pas-bits",
+ riscv_is_32bit(&s->soc[0]) ? 34 : 56,
+ &error_fatal);
sysbus_realize_and_unref(SYS_BUS_DEVICE(iommu_sys), &error_fatal);
}