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 #define ARM_IOPORT_AREA _AC(0x0000000000000000, UL) 9 #define ARM_MMIO_AREA _AC(0x0000000000010000, UL) 10 #define ARM_AXI_AREA _AC(0x0000000040000000, UL) 11 #define ARM_MEMORY_AREA _AC(0x0000000080000000, UL) 12 13 #define ARM_LOMAP_MAX_MEMORY ((1ULL << 32) - ARM_MEMORY_AREA) 14 #define ARM_HIMAP_MAX_MEMORY ((1ULL << 40) - ARM_MEMORY_AREA) 15 16 #define ARM_GIC_DIST_BASE (ARM_AXI_AREA - ARM_GIC_DIST_SIZE) 17 #define ARM_GIC_CPUI_BASE (ARM_GIC_DIST_BASE - ARM_GIC_CPUI_SIZE) 18 #define ARM_GIC_SIZE (ARM_GIC_DIST_SIZE + ARM_GIC_CPUI_SIZE) 19 20 #define ARM_IOPORT_SIZE (ARM_MMIO_AREA - ARM_IOPORT_AREA) 21 #define ARM_VIRTIO_MMIO_SIZE (ARM_AXI_AREA - (ARM_MMIO_AREA + ARM_GIC_SIZE)) 22 #define ARM_PCI_MMIO_SIZE (ARM_MEMORY_AREA - ARM_AXI_AREA) 23 24 #define KVM_PCI_MMIO_AREA ARM_AXI_AREA 25 #define KVM_VIRTIO_MMIO_AREA ARM_MMIO_AREA 26 27 #define VIRTIO_DEFAULT_TRANS VIRTIO_MMIO 28 29 static inline bool arm_addr_in_ioport_region(u64 phys_addr) 30 { 31 u64 limit = ARM_IOPORT_AREA + ARM_IOPORT_SIZE; 32 return phys_addr >= ARM_IOPORT_AREA && phys_addr < limit; 33 } 34 35 static inline bool arm_addr_in_virtio_mmio_region(u64 phys_addr) 36 { 37 u64 limit = KVM_VIRTIO_MMIO_AREA + ARM_VIRTIO_MMIO_SIZE; 38 return phys_addr >= KVM_VIRTIO_MMIO_AREA && phys_addr < limit; 39 } 40 41 static inline bool arm_addr_in_pci_mmio_region(u64 phys_addr) 42 { 43 u64 limit = KVM_PCI_MMIO_AREA + ARM_PCI_MMIO_SIZE; 44 return phys_addr >= KVM_PCI_MMIO_AREA && phys_addr < limit; 45 } 46 47 struct kvm_arch { 48 /* 49 * We may have to align the guest memory for virtio, so keep the 50 * original pointers here for munmap. 51 */ 52 void *ram_alloc_start; 53 u64 ram_alloc_size; 54 55 /* 56 * Guest addresses for memory layout. 57 */ 58 u64 memory_guest_start; 59 u64 kern_guest_start; 60 u64 initrd_guest_start; 61 u64 initrd_size; 62 u64 dtb_guest_start; 63 }; 64 65 #endif /* ARM_COMMON__KVM_ARCH_H */ 66