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 #define ARM_IOPORT_AREA _AC(0x0000000000000000, UL) 11 #define ARM_FLASH_AREA _AC(0x0000000002000000, UL) 12 #define ARM_MMIO_AREA _AC(0x0000000003000000, UL) 13 #define ARM_AXI_AREA _AC(0x0000000040000000, UL) 14 #define ARM_MEMORY_AREA _AC(0x0000000080000000, UL) 15 16 #define ARM_LOMAP_MAX_MEMORY ((1ULL << 32) - ARM_MEMORY_AREA) 17 #define ARM_HIMAP_MAX_MEMORY ((1ULL << 40) - ARM_MEMORY_AREA) 18 19 #define ARM_GIC_DIST_BASE (ARM_AXI_AREA - ARM_GIC_DIST_SIZE) 20 #define ARM_GIC_CPUI_BASE (ARM_GIC_DIST_BASE - ARM_GIC_CPUI_SIZE) 21 #define ARM_GIC_SIZE (ARM_GIC_DIST_SIZE + ARM_GIC_CPUI_SIZE) 22 #define ARM_GIC_DIST_SIZE 0x10000 23 #define ARM_GIC_CPUI_SIZE 0x20000 24 25 #define KVM_FLASH_MMIO_BASE ARM_FLASH_AREA 26 #define KVM_FLASH_MAX_SIZE (ARM_MMIO_AREA - ARM_FLASH_AREA) 27 28 #define ARM_IOPORT_SIZE (1U << 16) 29 #define ARM_VIRTIO_MMIO_SIZE (ARM_AXI_AREA - (ARM_MMIO_AREA + ARM_GIC_SIZE)) 30 #define ARM_PCI_CFG_SIZE (1ULL << 24) 31 #define ARM_PCI_MMIO_SIZE (ARM_MEMORY_AREA - \ 32 (ARM_AXI_AREA + ARM_PCI_CFG_SIZE)) 33 34 #define KVM_IOPORT_AREA ARM_IOPORT_AREA 35 #define KVM_PCI_CFG_AREA ARM_AXI_AREA 36 #define KVM_PCI_MMIO_AREA (KVM_PCI_CFG_AREA + ARM_PCI_CFG_SIZE) 37 #define KVM_VIRTIO_MMIO_AREA ARM_MMIO_AREA 38 39 #define KVM_IOEVENTFD_HAS_PIO 0 40 41 /* 42 * On a GICv3 there must be one redistributor per vCPU. 43 * The value here is the size for one, we multiply this at runtime with 44 * the number of requested vCPUs to get the actual size. 45 */ 46 #define ARM_GIC_REDIST_SIZE 0x20000 47 48 #define KVM_IRQ_OFFSET GIC_SPI_IRQ_BASE 49 50 #define KVM_VM_TYPE 0 51 52 #define VIRTIO_DEFAULT_TRANS(kvm) \ 53 ((kvm)->cfg.arch.virtio_trans_pci ? VIRTIO_PCI : VIRTIO_MMIO) 54 55 #define VIRTIO_RING_ENDIAN (VIRTIO_ENDIAN_LE | VIRTIO_ENDIAN_BE) 56 57 static inline bool arm_addr_in_ioport_region(u64 phys_addr) 58 { 59 u64 limit = KVM_IOPORT_AREA + ARM_IOPORT_SIZE; 60 return phys_addr >= KVM_IOPORT_AREA && phys_addr < limit; 61 } 62 63 struct kvm_arch { 64 /* 65 * We may have to align the guest memory for virtio, so keep the 66 * original pointers here for munmap. 67 */ 68 void *ram_alloc_start; 69 u64 ram_alloc_size; 70 71 /* 72 * Guest addresses for memory layout. 73 */ 74 u64 memory_guest_start; 75 u64 kern_guest_start; 76 u64 initrd_guest_start; 77 u64 initrd_size; 78 u64 dtb_guest_start; 79 }; 80 81 #endif /* ARM_COMMON__KVM_ARCH_H */ 82