vITS support
cover vITS support
This series introduces support for in-kernel GICv3 ITS emulation. It is based on kernel API which is not released yet, therefore i post it as an RFC. However, if respective maintainers think this is appropriate, infrastructure-related parts of this set (patch N1 and parts of patch N4) can be applied right now, in order to simplify future addition.
Kernel patches which implement this functionality are:
- [PATCH v2 00/15] KVM: arm64: GICv3 ITS emulation
http://www.spinics.net/lists/arm-kernel/msg430724.html
- [PATCH v3 0/7] KVM: arm/arm64: gsi routing support
http://www.spinics.net/lists/kvm/msg119567.html
Pavel Fedin (6):
kvm: Make KVM_CAP_SIGNAL_MSI globally available hw/intc: Implement ITS base class
Add vGICv3 ITS definitions
kvm: Implement passing device ID to MSI routing functions
kvm_arm: Implement support for ITS emulation by KVM arm/virt: Add ITS to the virt board
hw/arm/virt.c | 47 ++++++++++++++--- hw/i386/kvm/pci-assign.c | 9 ++-- hw/intc/Makefile.objs | 2 + hw/intc/arm_gicv3_its_common.c | 96 ++++++++++++++++++++++++++++++++++ hw/intc/arm_gicv3_its_kvm.c | 88 +++++++++++++++++++++++++++++++ hw/vfio/pci.c | 11 ++-- hw/virtio/virtio-pci.c | 5 +- include/hw/intc/arm_gicv3_its_common.h | 63 ++++++++++++++++++++++ include/sysemu/kvm.h | 15 +++++- kvm-all.c | 27 ++++++---- kvm-stub.c | 5 +- linux-headers/asm-arm64/kvm.h | 1 + linux-headers/linux/kvm.h | 9 +++- target-arm/kvm_arm.h | 10 ++++ target-arm/machine.c | 16 ++++++ 15 files changed, 372 insertions(+), 32 deletions(-) create mode 100644 hw/intc/arm_gicv3_its_common.c create mode 100644 hw/intc/arm_gicv3_its_kvm.c create mode 100644 include/hw/intc/arm_gicv3_its_common.h
Signature · 1 line
2.4.4
RFC PATCH 1/6 kvm: Make KVM_CAP_SIGNAL_MSI globally available
This capability is useful to determine whether we can use KVM ITS emulation on ARM
--- include/sysemu/kvm.h | 9 +++++++++ kvm-all.c | 10 +++++----- 2 files changed, 14 insertions(+), 5 deletions(-)
include/sysemu/kvm.h +9 -0
@@ -52,6 +52,7 @@ extern bool kvm_msi_via_irqfd_allowed;extern bool kvm_gsi_routing_allowed;extern bool kvm_gsi_direct_mapping;extern bool kvm_readonly_mem_allowed; +extern bool kvm_direct_msi_allowed;#if definedCONFIG_KVM || !definedNEED_CPU_H #define kvm_enabled () (kvm_allowed)
@@ -145,6 +146,13 @@ extern bool kvm_readonly_mem_allowed;*/ #define kvm_readonly_mem_enabled () (kvm_readonly_mem_allowed) +/** +* kvm_direct_msi_enabled: +* +* Returns: true if KVM allows direct MSI injection. +*/ +#define kvm_direct_msi_enabled () (kvm_direct_msi_allowed) +#else #define kvm_enabled () (0)#define kvm_irqchip_in_kernel () (false)
@@ -157,6 +165,7 @@ extern bool kvm_readonly_mem_allowed;#define kvm_gsi_routing_allowed () (false)#define kvm_gsi_direct_mapping () (false)#define kvm_readonly_mem_enabled () (false) +#define kvm_direct_msi_enabled () (false)#endif struct kvm_run ;
kvm-all.c +5 -5
@@ -93,7 +93,6 @@ struct KVMStateuint32_t *used_gsi_bitmap;unsigned int gsi_count; QTAILQ_HEAD(msi_hashtab, KVMMSIRoute) msi_hashtab[KVM_MSI_HASHTAB_SIZE]; -bool direct_msi;#endif KVMMemoryListener memory_listener; };
@@ -111,6 +110,7 @@ bool kvm_gsi_direct_mapping;bool kvm_allowed;bool kvm_readonly_mem_allowed;bool kvm_vm_attributes_allowed; +bool kvm_direct_msi_allowed;static const KVMCapabilityInfo kvm_required_capabilites[] = {KVM_CAP_INFO (USER_MEMORY ),
@@ -979,7 +979,7 @@ void kvm_init_irq_routing(KVMState *s) s->irq_routes =g_malloc0 (sizeof (*s->irq_routes)); s->nr_allocated_irq_routes =0 ; -if (!s->direct_msi) { +if (!kvm_direct_msi_allowed) {for (i =0 ; i <KVM_MSI_HASHTAB_SIZE ; i++) {QTAILQ_INIT (&s->msi_hashtab[i]); }
@@ -1113,7 +1113,7 @@ static int kvm_irqchip_get_virq(KVMState *s)* number can succeed even though a new route entry cannot be added. * When this happens, flush dynamic MSI entries to free IRQ route entries. */ -if (!s->direct_msi && s->irq_routes->nr == s->gsi_count) { +if (!kvm_direct_msi_allowed && s->irq_routes->nr == s->gsi_count) {kvm_flush_dynamic_msi_routes (s); }
@@ -1150,7 +1150,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg)struct kvm_msi msi;KVMMSIRoute *route; -if (s->direct_msi) { +if (kvm_direct_msi_allowed) { msi.address_lo = (uint32_t )msg.address; msi.address_hi = msg.address >>32 ; msi.data =le32_to_cpu (msg.data);
@@ -1598,7 +1598,7 @@ static int kvm_init(MachineState *ms)#endif #ifdef KVM_CAP_IRQ_ROUTING - s->direct_msi = (kvm_check_extension (s,KVM_CAP_SIGNAL_MSI ) >0 ); + kvm_direct_msi_allowed = (kvm_check_extension (s,KVM_CAP_SIGNAL_MSI ) >0 );#endif s->intx_set_mask =kvm_check_extension (s,KVM_CAP_PCI_2_3 );
Signature · 1 line
2.4.4
RFC PATCH 3/6 Add vGICv3 ITS definitions
In reply to Pavel FedinThis temporary patch adds kernel API definitions. Use proper header update procedure after these features are released.
--- linux-headers/asm-arm64/kvm.h | 1 + linux-headers/linux/kvm.h | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-)
linux-headers/asm-arm64/kvm.h +1 -0
@@ -81,6 +81,7 @@ struct kvm_regs {/* Supported VGICv3 address types */ #define KVM_VGIC_V3_ADDR_TYPE_DIST 2#define KVM_VGIC_V3_ADDR_TYPE_REDIST 3 +#define KVM_VGIC_V3_ADDR_TYPE_ITS 4#define KVM_VGIC_V3_DIST_SIZE SZ_64K#define KVM_VGIC_V3_REDIST_SIZE (2 * SZ_64K)
linux-headers/linux/kvm.h +7 -2
@@ -831,7 +831,10 @@ struct kvm_irq_routing_msi {__u32 address_lo;__u32 address_hi;__u32 data; -__u32 pad; +union { +__u32 pad; +__u32 devid; + }; };struct kvm_irq_routing_s390_adapter {
@@ -970,12 +973,14 @@ struct kvm_one_reg {__u64 addr; }; +#define KVM_MSI_VALID_DEVID (1U << 0)struct kvm_msi {__u32 address_lo;__u32 address_hi;__u32 data;__u32 flags; -__u8 pad[16 ]; +__u32 devid; +__u8 pad[12 ]; };struct kvm_arm_device_addr {
Signature · 1 line
2.4.4
RFC PATCH 4/6 kvm: Implement passing device ID to MSI routing functions
In reply to Pavel FedinRouting add/update functions now take additional PCIDevice pointer. Also, in order to provide backwards compatibility with older kernels, a new kvm_msi_flags global variable is provided, and machines, wishing to use new MSI features, must set appropriates flags in it.
--- hw/i386/kvm/pci-assign.c | 9 +++++---- hw/vfio/pci.c | 11 ++++++----- hw/virtio/virtio-pci.c | 5 +++-- include/sysemu/kvm.h | 6 ++++-- kvm-all.c | 17 +++++++++++++---- kvm-stub.c | 5 +++-- 6 files changed, 34 insertions(+), 19 deletions(-)
hw/i386/kvm/pci-assign.c +5 -4
@@ -980,7 +980,7 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev)MSIMessage msg =msi_get_message (pci_dev,0 );int virq; - virq =kvm_irqchip_add_msi_route (kvm_state, msg); + virq =kvm_irqchip_add_msi_route (kvm_state, msg, pci_dev);if (virq <0 ) {perror ("assigned_dev_update_msi: kvm_irqchip_add_msi_route" );return ;
@@ -1018,7 +1018,7 @@ static void assigned_dev_update_msi_msg(PCIDevice *pci_dev) }kvm_irqchip_update_msi_route (kvm_state, assigned_dev->msi_virq[0 ], -msi_get_message (pci_dev,0 )); +msi_get_message (pci_dev,0 ), pci_dev); }static bool assigned_dev_msix_masked (MSIXTableEntry *entry)
@@ -1084,7 +1084,7 @@ static int assigned_dev_update_msix_mmio(PCIDevice *pci_dev) msg.address = entry->addr_lo | ((uint64_t )entry->addr_hi <<32 ); msg.data = entry->data; - r =kvm_irqchip_add_msi_route (kvm_state, msg); + r =kvm_irqchip_add_msi_route (kvm_state, msg, pci_dev);if (r <0 ) {return r; }
@@ -1603,7 +1603,8 @@ static void assigned_dev_msix_mmio_write(void *opaque, hwaddr addr, msg.data = entry->data; ret =kvm_irqchip_update_msi_route (kvm_state, - adev->msi_virq[i], msg); + adev->msi_virq[i], msg, + pci_dev);if (ret) {error_report ("Error updating irq routing entry (%d)" , ret); }
hw/vfio/pci.c +6 -5
@@ -424,7 +424,7 @@ static void vfio_add_kvm_msi_virq(VFIOPCIDevice *vdev, VFIOMSIVector *vector,return ; } - virq =kvm_irqchip_add_msi_route (kvm_state, *msg); + virq =kvm_irqchip_add_msi_route (kvm_state, *msg, &vdev->pdev);if (virq <0 ) {event_notifier_cleanup (&vector->kvm_interrupt);return ;
@@ -449,9 +449,10 @@ static void vfio_remove_kvm_msi_virq(VFIOMSIVector *vector)event_notifier_cleanup (&vector->kvm_interrupt); } -static void vfio_update_kvm_msi_virq (VFIOMSIVector *vector,MSIMessage msg) +static void vfio_update_kvm_msi_virq (VFIOMSIVector *vector,MSIMessage msg, +PCIDevice *pdev) { -kvm_irqchip_update_msi_route (kvm_state, vector->virq, msg); +kvm_irqchip_update_msi_route (kvm_state, vector->virq, msg, pdev); } static int vfio_msix_vector_do_use(PCIDevice *pdev, unsigned int nr,
@@ -486,7 +487,7 @@ static int vfio_msix_vector_do_use(PCIDevice *pdev, unsigned int nr,if (!msg) {vfio_remove_kvm_msi_virq (vector); }else { -vfio_update_kvm_msi_virq (vector, *msg); +vfio_update_kvm_msi_virq (vector, *msg, pdev); } }else {vfio_add_kvm_msi_virq (vdev, vector, msg, true);
@@ -760,7 +761,7 @@ static void vfio_update_msi(VFIOPCIDevice *vdev) } msg =msi_get_message (&vdev->pdev, i); -vfio_update_kvm_msi_virq (vector, msg); +vfio_update_kvm_msi_virq (vector, msg, &vdev->pdev); } }
hw/virtio/virtio-pci.c +3 -2
@@ -590,7 +590,7 @@ static int kvm_virtio_pci_vq_vector_use(VirtIOPCIProxy *proxy,int ret;if (irqfd->users ==0 ) { - ret =kvm_irqchip_add_msi_route (kvm_state, msg); + ret =kvm_irqchip_add_msi_route (kvm_state, msg, &proxy->pci_dev);if (ret <0 ) {return ret; }
@@ -726,7 +726,8 @@ static int virtio_pci_vq_vector_unmask(VirtIOPCIProxy *proxy,if (proxy->vector_irqfd) { irqfd = &proxy->vector_irqfd[vector];if (irqfd->msg.data != msg.data || irqfd->msg.address != msg.address) { - ret =kvm_irqchip_update_msi_route (kvm_state, irqfd->virq, msg); + ret =kvm_irqchip_update_msi_route (kvm_state, irqfd->virq, msg, + &proxy->pci_dev);if (ret <0 ) {return ret; }
include/sysemu/kvm.h +4 -2
@@ -53,6 +53,7 @@ extern bool kvm_gsi_routing_allowed;extern bool kvm_gsi_direct_mapping;extern bool kvm_readonly_mem_allowed;extern bool kvm_direct_msi_allowed; +extern uint32_t kvm_msi_flags;#if definedCONFIG_KVM || !definedNEED_CPU_H #define kvm_enabled () (kvm_allowed)
@@ -447,8 +448,9 @@ static inline void cpu_clean_state(CPUState *cpu) } } -int kvm_irqchip_add_msi_route (KVMState *s,MSIMessage msg); -int kvm_irqchip_update_msi_route (KVMState *s,int virq,MSIMessage msg); +int kvm_irqchip_add_msi_route (KVMState *s,MSIMessage msg,PCIDevice *dev); +int kvm_irqchip_update_msi_route (KVMState *s,int virq,MSIMessage msg, +PCIDevice *dev);void kvm_irqchip_release_virq (KVMState *s,int virq);int kvm_irqchip_add_adapter_route (KVMState *s,AdapterInfo *adapter);
kvm-all.c +13 -4
@@ -111,6 +111,7 @@ bool kvm_allowed;bool kvm_readonly_mem_allowed;bool kvm_vm_attributes_allowed;bool kvm_direct_msi_allowed; +uint32_t kvm_msi_flags;static const KVMCapabilityInfo kvm_required_capabilites[] = {KVM_CAP_INFO (USER_MEMORY ),
@@ -1189,7 +1190,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg)return kvm_set_irq (s, route->kroute.gsi,1 ); } -int kvm_irqchip_add_msi_route (KVMState *s,MSIMessage msg) +int kvm_irqchip_add_msi_route (KVMState *s,MSIMessage msg,PCIDevice *dev) {struct kvm_irq_routing_entry kroute = {};int virq;
@@ -1209,10 +1210,14 @@ int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) kroute.gsi = virq; kroute.type =KVM_IRQ_ROUTING_MSI ; - kroute.flags =0 ; kroute.u.msi.address_lo = (uint32_t )msg.address; kroute.u.msi.address_hi = msg.address >>32 ; kroute.u.msi.data =le32_to_cpu (msg.data); + kroute.flags = kvm_msi_flags; +if (kroute.flags &KVM_MSI_VALID_DEVID ) { + kroute.u.msi.devid = (pci_bus_num (dev->bus) <<8 ) | dev->devfn; + } +if (kvm_arch_fixup_msi_route (&kroute, msg.address, msg.data)) {kvm_irqchip_release_virq (s, virq);return -EINVAL ;
@@ -1224,7 +1229,8 @@ int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg)return virq; } -int kvm_irqchip_update_msi_route (KVMState *s,int virq,MSIMessage msg) +int kvm_irqchip_update_msi_route (KVMState *s,int virq,MSIMessage msg, +PCIDevice *dev) {struct kvm_irq_routing_entry kroute = {};
@@ -1238,10 +1244,13 @@ int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg) kroute.gsi = virq; kroute.type =KVM_IRQ_ROUTING_MSI ; - kroute.flags =0 ; kroute.u.msi.address_lo = (uint32_t )msg.address; kroute.u.msi.address_hi = msg.address >>32 ; kroute.u.msi.data =le32_to_cpu (msg.data); + kroute.flags = kvm_msi_flags; +if (kroute.flags &KVM_MSI_VALID_DEVID ) { + kroute.u.msi.devid = (pci_bus_num (dev->bus) <<8 ) | dev->devfn; + }if (kvm_arch_fixup_msi_route (&kroute, msg.address, msg.data)) {return -EINVAL ; }
kvm-stub.c +3 -2
@@ -115,7 +115,7 @@ int kvm_on_sigbus(int code, void *addr) }#ifndef CONFIG_USER_ONLY -int kvm_irqchip_add_msi_route (KVMState *s,MSIMessage msg) +int kvm_irqchip_add_msi_route (KVMState *s,MSIMessage msg,PCIDevice *dev) {return -ENOSYS ; }
@@ -128,7 +128,8 @@ void kvm_irqchip_release_virq(KVMState *s, int virq) { } -int kvm_irqchip_update_msi_route (KVMState *s,int virq,MSIMessage msg) +int kvm_irqchip_update_msi_route (KVMState *s,int virq,MSIMessage msg, +PCIDevice *dev) {return -ENOSYS ; }
Signature · 1 line
2.4.4
RFC PATCH 5/6 kvm_arm: Implement support for ITS emulation by KVM
In reply to Pavel FedinThis patch relies on new kernel API which is not released yet.
--- hw/intc/Makefile.objs | 1 + hw/intc/arm_gicv3_its_kvm.c | 88 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 hw/intc/arm_gicv3_its_kvm.c
hw/intc/Makefile.objs +1 -0
@@ -19,6 +19,7 @@ common-obj-$(CONFIG_OPENPIC) += openpic.o obj-$(CONFIG_APIC) += apic.o apic_common.o obj-$(CONFIG_ARM_GIC_KVM) += arm_gic_kvm.o obj-$(call land,$(CONFIG_ARM_GIC_KVM),$(TARGET_AARCH64)) += arm_gicv3_kvm.o +obj-$(call land,$(CONFIG_ARM_GIC_KVM),$(TARGET_AARCH64)) += arm_gicv3_its_kvm.o obj-$(CONFIG_STELLARIS) += armv7m_nvic.o obj-$(CONFIG_EXYNOS4) += exynos4210_gic.o exynos4210_combiner.o obj-$(CONFIG_GRLIB) += grlib_irqmp.o
hw/intc/arm_gicv3_its_kvm.c new file +88 -0
88 lines not on this page · raw message
Signature · 1 line
2.4.4
RFC PATCH 2/6 hw/intc: Implement ITS base class
In reply to Pavel FedinThis is the basic skeleton for both KVM and software-emulated ITS. Currently it is mostly a placeholder, however in future it is going to contain device state necessary for live migration
--- hw/intc/Makefile.objs | 1 + hw/intc/arm_gicv3_its_common.c | 96 ++++++++++++++++++++++++++++++++++ include/hw/intc/arm_gicv3_its_common.h | 63 ++++++++++++++++++++++ target-arm/kvm_arm.h | 10 ++++ target-arm/machine.c | 16 ++++++ 5 files changed, 186 insertions(+) create mode 100644 hw/intc/arm_gicv3_its_common.c create mode 100644 include/hw/intc/arm_gicv3_its_common.h
hw/intc/Makefile.objs +1 -0
@@ -13,6 +13,7 @@ common-obj-$(CONFIG_ARM_GIC) += arm_gic_common.o common-obj-$(CONFIG_ARM_GIC) += arm_gic.o common-obj-$(CONFIG_ARM_GIC) += arm_gicv2m.o common-obj-$(CONFIG_ARM_GIC) += arm_gicv3_common.o +common-obj-$(CONFIG_ARM_GIC) += arm_gicv3_its_common.o common-obj-$(CONFIG_OPENPIC) += openpic.o obj-$(CONFIG_APIC) += apic.o apic_common.o
hw/intc/arm_gicv3_its_common.c new file +96 -0
96 lines not on this page · raw message
include/hw/intc/arm_gicv3_its_common.h new file +63 -0
63 lines not on this page · raw message
target-arm/kvm_arm.h +10 -0
@@ -215,4 +215,14 @@ static inline const char *gic_class_name(void)*/ const char *gicv3_class_name (void ); +/** +* its_class_name +* +* Return name of ITS class to use depending on whether KVM acceleration is +* in use, or NULL if the chosen implementation is not available. +* +* Returns: class name to use or NULL +*/ +const char *its_class_name (void ); +#endif
target-arm/machine.c +16 -0
@@ -346,3 +346,19 @@ const char *gicv3_class_name(void)exit (1 ); } + +const char *its_class_name (void ) +{ +if (kvm_irqchip_in_kernel ()) { +#ifdef TARGET_AARCH64 +/* KVM implementation requires this capability */ +if (kvm_direct_msi_enabled ()) { +return "arm-its-kvm" ; + } +#endif +return NULL ; + }else { +/* Software emulation is not implemented yet */ +return NULL ; + } +}
Signature · 1 line
2.4.4
RFC PATCH 6/6 arm/virt: Add ITS to the virt board
In reply to Pavel FedinIf supported by the configuration, ITS will be added automatically.
This patch also renames v2m_phandle to msi_phandle because it's now used by both MSI implementations.
--- hw/arm/virt.c | 47 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-)
hw/arm/virt.c +41 -6
@@ -70,7 +70,7 @@ typedef struct VirtBoardInfo {int fdt_size;uint32_t clock_phandle;uint32_t gic_phandle; -uint32_t v2m_phandle; +uint32_t msi_phandle; } VirtBoardInfo; typedef struct {
@@ -351,9 +351,22 @@ static void fdt_add_cpu_nodes(const VirtBoardInfo *vbi) } } +static void fdt_add_its_gic_node (VirtBoardInfo *vbi) +{ + vbi->msi_phandle =qemu_fdt_alloc_phandle (vbi->fdt); +qemu_fdt_add_subnode (vbi->fdt,"/intc/its" ); +qemu_fdt_setprop_string (vbi->fdt,"/intc/its" ,"compatible" , +"arm,gic-v3-its" ); +qemu_fdt_setprop (vbi->fdt,"/intc/its" ,"msi-controller" ,NULL ,0 ); +qemu_fdt_setprop_sized_cells (vbi->fdt,"/intc/its" ,"reg" , +2 , vbi->memmap[VIRT_GIC_ITS ].base, +2 , vbi->memmap[VIRT_GIC_ITS ].size); +qemu_fdt_setprop_cell (vbi->fdt,"/intc/its" ,"phandle" , vbi->msi_phandle); +} +static void fdt_add_v2m_gic_node (VirtBoardInfo *vbi) { - vbi->v2m_phandle =qemu_fdt_alloc_phandle (vbi->fdt); + vbi->msi_phandle =qemu_fdt_alloc_phandle (vbi->fdt);qemu_fdt_add_subnode (vbi->fdt,"/intc/v2m" );qemu_fdt_setprop_string (vbi->fdt,"/intc/v2m" ,"compatible" ,"arm,gic-v2m-frame" );
@@ -361,7 +374,7 @@ static void fdt_add_v2m_gic_node(VirtBoardInfo *vbi)qemu_fdt_setprop_sized_cells (vbi->fdt,"/intc/v2m" ,"reg" ,2 , vbi->memmap[VIRT_GIC_V2M ].base,2 , vbi->memmap[VIRT_GIC_V2M ].size); -qemu_fdt_setprop_cell (vbi->fdt,"/intc/v2m" ,"phandle" , vbi->v2m_phandle); +qemu_fdt_setprop_cell (vbi->fdt,"/intc/v2m" ,"phandle" , vbi->msi_phandle); }static void fdt_add_gic_node (VirtBoardInfo *vbi,int type)
@@ -397,6 +410,26 @@ static void fdt_add_gic_node(VirtBoardInfo *vbi, int type)qemu_fdt_setprop_cell (vbi->fdt,"/intc" ,"phandle" , vbi->gic_phandle); } +static void create_its (VirtBoardInfo *vbi,DeviceState *gicdev) +{ +const char *itsclass =its_class_name (); +DeviceState *dev; + +if (!itsclass) { +/* Do nothing if not supported */ +return ; + } + + dev =qdev_create (NULL , itsclass); + +object_property_set_link (OBJECT (dev),OBJECT (gicdev),"parent-gicv3" , + &error_abort); +qdev_init_nofail (dev); +sysbus_mmio_map (SYS_BUS_DEVICE (dev),0 , vbi->memmap[VIRT_GIC_ITS ].base); + +fdt_add_its_gic_node (vbi); +} +static void create_v2m (VirtBoardInfo *vbi,qemu_irq *pic) {int i;
@@ -480,7 +513,9 @@ static void create_gic(VirtBoardInfo *vbi, qemu_irq *pic, int type, bool secure)fdt_add_gic_node (vbi, type); -if (type ==2 ) { +if (type ==3 ) { +create_its (vbi, gicdev); + }else {create_v2m (vbi, pic); } }
@@ -799,9 +834,9 @@ static void create_pcie(const VirtBoardInfo *vbi, qemu_irq *pic,qemu_fdt_setprop_cells (vbi->fdt, nodename,"bus-range" ,0 , nr_pcie_buses -1 ); -if (vbi->v2m_phandle) { +if (vbi->msi_phandle) {qemu_fdt_setprop_cells (vbi->fdt, nodename,"msi-parent" , - vbi->v2m_phandle); + vbi->msi_phandle); } qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg",
Signature · 1 line
2.4.4