diff options
author | Peng Fan <peng.fan@nxp.com> | 2024-01-26 18:29:38 +0800 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2024-03-01 18:34:08 -0500 |
commit | 15f832a7dc1082f0fff87e07b3752fe8c324ee48 (patch) | |
tree | 419a4c9c7e5a9ab56f7dfbaa2f789ab313fef02a /board/xen | |
parent | c95e948870bdfc606946174facd9ea359ce84e58 (diff) | |
download | u-boot-15f832a7dc1082f0fff87e07b3752fe8c324ee48.tar.gz u-boot-15f832a7dc1082f0fff87e07b3752fe8c324ee48.tar.bz2 u-boot-15f832a7dc1082f0fff87e07b3752fe8c324ee48.zip |
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>
Diffstat (limited to 'board/xen')
-rw-r--r-- | board/xen/xenguest_arm64/xenguest_arm64.c | 17 |
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 244070a242..1d2946f4fd 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; |