aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeng Fan2024-01-26 18:29:38 +0800
committerTom Rini2024-03-01 18:34:08 -0500
commit15f832a7dc1082f0fff87e07b3752fe8c324ee48 (patch)
tree419a4c9c7e5a9ab56f7dfbaa2f789ab313fef02a
parentc95e948870bdfc606946174facd9ea359ce84e58 (diff)
xen: xenguest_arm64: map all VIRTIO MMIO region
When run `virtio scan` on i.MX95, there is abort when accessing virtio mmio region. The issue is the mmio region is not mapped. So let's map all virtio mmio regions. Signed-off-by: Peng Fan <peng.fan@nxp.com>
-rw-r--r--board/xen/xenguest_arm64/xenguest_arm64.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/board/xen/xenguest_arm64/xenguest_arm64.c b/board/xen/xenguest_arm64/xenguest_arm64.c
index 244070a242d..1d2946f4fde 100644
--- a/board/xen/xenguest_arm64/xenguest_arm64.c
+++ b/board/xen/xenguest_arm64/xenguest_arm64.c
@@ -31,6 +31,9 @@
DECLARE_GLOBAL_DATA_PTR;
+#define GUEST_VIRTIO_MMIO_BASE 0x2000000
+#define GUEST_VIRTIO_MMIO_SIZE 0x100000
+
int board_init(void)
{
return 0;
@@ -212,6 +215,15 @@ static int setup_mem_map(void)
PTE_BLOCK_INNER_SHARE);
i++;
+ if (CONFIG_IS_ENABLED(VIRTIO_MMIO)) {
+ xen_mem_map[i].virt = GUEST_VIRTIO_MMIO_BASE;
+ xen_mem_map[i].phys = GUEST_VIRTIO_MMIO_BASE;
+ xen_mem_map[i].size = GUEST_VIRTIO_MMIO_SIZE;
+ xen_mem_map[i].attrs = (PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+ PTE_BLOCK_NON_SHARE);
+ i++;
+ }
+
mem = get_next_memory_node(blob, -1);
if (mem < 0) {
printf("%s: Missing /memory node\n", __func__);
@@ -219,6 +231,11 @@ static int setup_mem_map(void)
}
for (; i < MAX_MEM_MAP_REGIONS; i++) {
+ if (CONFIG_IS_ENABLED(VIRTIO_MMIO)) {
+ ret = fdt_node_check_compatible(blob, mem, "virtio,mmio");
+ if (!ret)
+ continue;
+ }
ret = fdt_get_resource(blob, mem, "reg", reg++, &res);
if (ret == -FDT_ERR_NOTFOUND) {
reg = 0;