From: Nicolin Chen <[email protected]> VINTF page0 is guest accessible and backed by host memory, so it can be mapped directly instead of being trapped and emulated. Map the VINTF0 page0 MMIO region lazily on first vCMDQ setup.
Signed-off-by: Nicolin Chen <[email protected]> Signed-off-by: Shameer Kolothum <[email protected]> --- hw/arm/tegra241-cmdqv.c | 21 +++++++++++++++++++++ hw/arm/tegra241-cmdqv.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/hw/arm/tegra241-cmdqv.c b/hw/arm/tegra241-cmdqv.c index 57f47a4997..153fd70edb 100644 --- a/hw/arm/tegra241-cmdqv.c +++ b/hw/arm/tegra241-cmdqv.c @@ -170,6 +170,26 @@ static uint64_t tegra241_cmdqv_read(void *opaque, hwaddr offset, unsigned size) } } +static void tegra241_cmdqv_map_vintf_page0(Tegra241CMDQV *cmdqv) +{ + char *name; + + if (cmdqv->vintf_page0_mapped) { + return; + } + + name = g_strdup_printf("%s vintf-page0", + memory_region_name(&cmdqv->mmio_cmdqv)); + memory_region_init_ram_device_ptr(&cmdqv->mmio_vintf_page0, + memory_region_owner(&cmdqv->mmio_cmdqv), + name, VINTF_REG_PAGE_SIZE, + cmdqv->vintf_page0); + memory_region_add_subregion_overlap(&cmdqv->mmio_cmdqv, 0x30000, + &cmdqv->mmio_vintf_page0, 1); + g_free(name); + cmdqv->vintf_page0_mapped = true; +} + static bool tegra241_cmdqv_setup_vcmdq(Tegra241CMDQV *cmdqv, int index, Error **errp) { @@ -206,6 +226,7 @@ static bool tegra241_cmdqv_setup_vcmdq(Tegra241CMDQV *cmdqv, int index, hw_queue->viommu = viommu; cmdqv->vcmdq[index] = hw_queue; + tegra241_cmdqv_map_vintf_page0(cmdqv); return true; } diff --git a/hw/arm/tegra241-cmdqv.h b/hw/arm/tegra241-cmdqv.h index 2f4a8ab35f..b92c34e1d7 100644 --- a/hw/arm/tegra241-cmdqv.h +++ b/hw/arm/tegra241-cmdqv.h @@ -31,6 +31,8 @@ typedef struct Tegra241CMDQV { MemoryRegion mmio_cmdqv; qemu_irq irq; void *vintf_page0; + MemoryRegion mmio_vintf_page0; + bool vintf_page0_mapped; IOMMUFDHWqueue *vcmdq[128]; /* Register Cache */ -- 2.43.0
