mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 23:33:54 -06:00
hw/riscv/virt.c, riscv-iommu-sys.c: add MSIx support
MSIx support is added in the RISC-V IOMMU platform device by including the required MSIx facilities to alow software to properly setup the MSIx subsystem. We took inspiration of what is being done in the riscv-iommu-pci device, mainly msix_init() and msix_notify(), while keeping in mind that riscv-iommu-sys isn't a true PCI device and we don't need to copy/paste all the contents of these MSIx functions. Two extra MSI MemoryRegions were added: 'msix-table' and 'msix-pba'. They are used to manage r/w of the MSI table and Pending Bit Array (PBA) respectively. Both are subregions of the main IOMMU memory region, iommu->regs_mr, initialized during riscv_iommu_realize(), and each one has their own handlers for MSIx reads and writes. This is the expected memory map when using this device in the 'virt' machine: 0000000003010000-0000000003010fff (prio 0, i/o): riscv-iommu-regs 0000000003010300-000000000301034f (prio 0, i/o): msix-table 0000000003010400-0000000003010407 (prio 0, i/o): msix-pba We're now able to set IGS to RISCV_IOMMU_CAP_IGS_BOTH, and userspace is free to decide which interrupt model to use. Enabling MSIx support for this device in the 'virt' machine requires adding 'msi-parent' in the iommu-sys DT. Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Acked-by: Alistair Francis <alistair.francis@wdc.com> Message-ID: <20241106133407.604587-6-dbarboza@ventanamicro.com> [ Changes by AF: - Used PRIx64 in trace ] Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
2c12de1460
commit
01c1caa9d1
3 changed files with 119 additions and 5 deletions
|
@ -1043,6 +1043,7 @@ static void create_fdt_virtio_iommu(RISCVVirtState *s, uint16_t bdf)
|
|||
}
|
||||
|
||||
static void create_fdt_iommu_sys(RISCVVirtState *s, uint32_t irq_chip,
|
||||
uint32_t msi_phandle,
|
||||
uint32_t *iommu_sys_phandle)
|
||||
{
|
||||
const char comp[] = "riscv,iommu";
|
||||
|
@ -1077,6 +1078,8 @@ static void create_fdt_iommu_sys(RISCVVirtState *s, uint32_t irq_chip,
|
|||
iommu_irq_map[2], FDT_IRQ_TYPE_EDGE_LOW,
|
||||
iommu_irq_map[3], FDT_IRQ_TYPE_EDGE_LOW);
|
||||
|
||||
qemu_fdt_setprop_cell(fdt, iommu_node, "msi-parent", msi_phandle);
|
||||
|
||||
*iommu_sys_phandle = iommu_phandle;
|
||||
}
|
||||
|
||||
|
@ -1117,7 +1120,8 @@ static void finalize_fdt(RISCVVirtState *s)
|
|||
create_fdt_virtio(s, virt_memmap, irq_virtio_phandle);
|
||||
|
||||
if (virt_is_iommu_sys_enabled(s)) {
|
||||
create_fdt_iommu_sys(s, irq_mmio_phandle, &iommu_sys_phandle);
|
||||
create_fdt_iommu_sys(s, irq_mmio_phandle, msi_pcie_phandle,
|
||||
&iommu_sys_phandle);
|
||||
}
|
||||
create_fdt_pcie(s, virt_memmap, irq_pcie_phandle, msi_pcie_phandle,
|
||||
iommu_sys_phandle);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue