[PATCH v2 15/24] hw/arm/tegra241-cmdqv: map VINTF page0 MMIO region

Shameer Kolothum posted 24 patches 2 days, 18 hours ago
[PATCH v2 15/24] hw/arm/tegra241-cmdqv: map VINTF page0 MMIO region
Posted by Shameer Kolothum 2 days, 18 hours ago
From: Nicolin Chen <nicolinc@nvidia.com>

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 <nicolinc@nvidia.com>
Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com>
---
 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