xref: /kvmtool/arm/include/arm-common/kvm-arch.h (revision f01cc778bd652174f76b437cc8c1be1f3fdac10a)
1 #ifndef ARM_COMMON__KVM_ARCH_H
2 #define ARM_COMMON__KVM_ARCH_H
3 
4 #include <stdbool.h>
5 #include <linux/const.h>
6 #include <linux/types.h>
7 
8 #include "arm-common/gic.h"
9 
10 /*
11  * The memory map used for ARM guests (not to scale):
12  *
13  * 0      64K  16M     32M     48M            1GB       2GB
14  * +-------+----+-------+-------+--------+-----+---------+---......
15  * |  PCI  |////| plat  |       |        |     |         |
16  * |  I/O  |////| MMIO  | Flash | virtio | GIC |   PCI   |  DRAM
17  * | space |////|       |       |  MMIO  |     |  (AXI)  |
18  * |       |////|       |       |        |     |         |
19  * +-------+----+-------+-------+--------+-----+---------+---......
20  */
21 
22 #define ARM_IOPORT_AREA		_AC(0x0000000000000000, UL)
23 #define ARM_MMIO_AREA		_AC(0x0000000001000000, UL)
24 #define ARM_AXI_AREA		_AC(0x0000000040000000, UL)
25 #define ARM_MEMORY_AREA		_AC(0x0000000080000000, UL)
26 
27 #define KVM_IOPORT_AREA		ARM_IOPORT_AREA
28 #define ARM_IOPORT_SIZE		(1U << 16)
29 
30 
31 #define KVM_FLASH_MMIO_BASE	(ARM_MMIO_AREA + 0x1000000)
32 #define KVM_FLASH_MAX_SIZE	0x1000000
33 
34 #define KVM_VIRTIO_MMIO_AREA	(KVM_FLASH_MMIO_BASE + KVM_FLASH_MAX_SIZE)
35 #define ARM_VIRTIO_MMIO_SIZE	(ARM_AXI_AREA - \
36 				(KVM_VIRTIO_MMIO_AREA + ARM_GIC_SIZE))
37 
38 #define ARM_GIC_DIST_BASE	(ARM_AXI_AREA - ARM_GIC_DIST_SIZE)
39 #define ARM_GIC_CPUI_BASE	(ARM_GIC_DIST_BASE - ARM_GIC_CPUI_SIZE)
40 #define ARM_GIC_SIZE		(ARM_GIC_DIST_SIZE + ARM_GIC_CPUI_SIZE)
41 #define ARM_GIC_DIST_SIZE	0x10000
42 #define ARM_GIC_CPUI_SIZE	0x20000
43 
44 
45 #define KVM_PCI_CFG_AREA	ARM_AXI_AREA
46 #define ARM_PCI_CFG_SIZE	(1ULL << 24)
47 #define KVM_PCI_MMIO_AREA	(KVM_PCI_CFG_AREA + ARM_PCI_CFG_SIZE)
48 #define ARM_PCI_MMIO_SIZE	(ARM_MEMORY_AREA - \
49 				(ARM_AXI_AREA + ARM_PCI_CFG_SIZE))
50 
51 
52 #define ARM_LOMAP_MAX_MEMORY	((1ULL << 32) - ARM_MEMORY_AREA)
53 #define ARM_HIMAP_MAX_MEMORY	((1ULL << 40) - ARM_MEMORY_AREA)
54 
55 
56 #define KVM_IOEVENTFD_HAS_PIO	0
57 
58 /*
59  * On a GICv3 there must be one redistributor per vCPU.
60  * The value here is the size for one, we multiply this at runtime with
61  * the number of requested vCPUs to get the actual size.
62  */
63 #define ARM_GIC_REDIST_SIZE	0x20000
64 
65 #define KVM_IRQ_OFFSET		GIC_SPI_IRQ_BASE
66 
67 #define KVM_VM_TYPE		0
68 
69 #define VIRTIO_DEFAULT_TRANS(kvm)	\
70 	((kvm)->cfg.arch.virtio_trans_pci ? VIRTIO_PCI : VIRTIO_MMIO)
71 
72 #define VIRTIO_RING_ENDIAN	(VIRTIO_ENDIAN_LE | VIRTIO_ENDIAN_BE)
73 
74 static inline bool arm_addr_in_ioport_region(u64 phys_addr)
75 {
76 	u64 limit = KVM_IOPORT_AREA + ARM_IOPORT_SIZE;
77 	return phys_addr >= KVM_IOPORT_AREA && phys_addr < limit;
78 }
79 
80 struct kvm_arch {
81 	/*
82 	 * We may have to align the guest memory for virtio, so keep the
83 	 * original pointers here for munmap.
84 	 */
85 	void	*ram_alloc_start;
86 	u64	ram_alloc_size;
87 
88 	/*
89 	 * Guest addresses for memory layout.
90 	 */
91 	u64	memory_guest_start;
92 	u64	kern_guest_start;
93 	u64	initrd_guest_start;
94 	u64	initrd_size;
95 	u64	dtb_guest_start;
96 };
97 
98 #endif /* ARM_COMMON__KVM_ARCH_H */
99