From: andre.przywara@arm.com (Andre Przywara) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH v3 09/10] arm: add support for supplying GICv3 redistributor addresses Date: Wed, 17 Jun 2015 12:22:00 +0100 [thread overview] Message-ID: <1434540121-21283-10-git-send-email-andre.przywara@arm.com> (raw) In-Reply-To: <1434540121-21283-1-git-send-email-andre.przywara@arm.com> Instead of the GIC virtual CPU interface an emulated GICv3 needs to have accesses to its emulated redistributors trapped in the guest. Add code to tell the kernel about the mapping if a GICv3 emulation was requested by the user. This contains some defines which are not (yet) in the (32 bit) header files to allow compilation for ARM. Signed-off-by: Andre Przywara <andre.przywara@arm.com> --- arm/gic.c | 36 +++++++++++++++++++++++++++++++++++- arm/include/arm-common/gic.h | 3 ++- arm/include/arm-common/kvm-arch.h | 7 +++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/arm/gic.c b/arm/gic.c index b6c5868..efe4b42 100644 --- a/arm/gic.c +++ b/arm/gic.c @@ -9,7 +9,18 @@ #include <linux/kernel.h> #include <linux/kvm.h> +/* Those names are not defined for ARM (yet) */ +#ifndef KVM_VGIC_V3_ADDR_TYPE_DIST +#define KVM_VGIC_V3_ADDR_TYPE_DIST 2 +#endif + +#ifndef KVM_VGIC_V3_ADDR_TYPE_REDIST +#define KVM_VGIC_V3_ADDR_TYPE_REDIST 3 +#endif + static int gic_fd = -1; +static u64 gic_redists_base; +static u64 gic_redists_size; static int gic__create_device(struct kvm *kvm, enum irqchip_type type) { @@ -28,12 +39,21 @@ static int gic__create_device(struct kvm *kvm, enum irqchip_type type) .group = KVM_DEV_ARM_VGIC_GRP_ADDR, .addr = (u64)(unsigned long)&dist_addr, }; + struct kvm_device_attr redist_attr = { + .group = KVM_DEV_ARM_VGIC_GRP_ADDR, + .attr = KVM_VGIC_V3_ADDR_TYPE_REDIST, + .addr = (u64)(unsigned long)&gic_redists_base, + }; switch (type) { case IRQCHIP_GICV2: gic_device.type = KVM_DEV_TYPE_ARM_VGIC_V2; dist_attr.attr = KVM_VGIC_V2_ADDR_TYPE_DIST; break; + case IRQCHIP_GICV3: + gic_device.type = KVM_DEV_TYPE_ARM_VGIC_V3; + dist_attr.attr = KVM_VGIC_V3_ADDR_TYPE_DIST; + break; } err = ioctl(kvm->vm_fd, KVM_CREATE_DEVICE, &gic_device); @@ -46,6 +66,9 @@ static int gic__create_device(struct kvm *kvm, enum irqchip_type type) case IRQCHIP_GICV2: err = ioctl(gic_fd, KVM_SET_DEVICE_ATTR, &cpu_if_attr); break; + case IRQCHIP_GICV3: + err = ioctl(gic_fd, KVM_SET_DEVICE_ATTR, &redist_attr); + break; } if (err) goto out_err; @@ -97,6 +120,10 @@ int gic__create(struct kvm *kvm, enum irqchip_type type) switch (type) { case IRQCHIP_GICV2: break; + case IRQCHIP_GICV3: + gic_redists_size = kvm->cfg.nrcpus * ARM_GIC_REDIST_SIZE; + gic_redists_base = ARM_GIC_DIST_BASE - gic_redists_size; + break; default: return -ENODEV; } @@ -156,12 +183,19 @@ void gic__generate_fdt_nodes(void *fdt, u32 phandle, enum irqchip_type type) const char *compatible; u64 reg_prop[] = { cpu_to_fdt64(ARM_GIC_DIST_BASE), cpu_to_fdt64(ARM_GIC_DIST_SIZE), - cpu_to_fdt64(ARM_GIC_CPUI_BASE), cpu_to_fdt64(ARM_GIC_CPUI_SIZE), + 0, 0, /* to be filled */ }; switch (type) { case IRQCHIP_GICV2: compatible = "arm,cortex-a15-gic"; + reg_prop[2] = cpu_to_fdt64(ARM_GIC_CPUI_BASE); + reg_prop[3] = cpu_to_fdt64(ARM_GIC_CPUI_SIZE); + break; + case IRQCHIP_GICV3: + compatible = "arm,gic-v3"; + reg_prop[2] = cpu_to_fdt64(gic_redists_base); + reg_prop[3] = cpu_to_fdt64(gic_redists_size); break; default: return; diff --git a/arm/include/arm-common/gic.h b/arm/include/arm-common/gic.h index 2ed76fa..403d93b 100644 --- a/arm/include/arm-common/gic.h +++ b/arm/include/arm-common/gic.h @@ -22,7 +22,8 @@ #define GIC_MAX_IRQ 255 enum irqchip_type { - IRQCHIP_GICV2 + IRQCHIP_GICV2, + IRQCHIP_GICV3 }; struct kvm; diff --git a/arm/include/arm-common/kvm-arch.h b/arm/include/arm-common/kvm-arch.h index 90d6733..0f5fb7f 100644 --- a/arm/include/arm-common/kvm-arch.h +++ b/arm/include/arm-common/kvm-arch.h @@ -30,6 +30,13 @@ #define KVM_PCI_MMIO_AREA (KVM_PCI_CFG_AREA + ARM_PCI_CFG_SIZE) #define KVM_VIRTIO_MMIO_AREA ARM_MMIO_AREA +/* + * On a GICv3 there must be one redistributor per vCPU. + * The value here is the size for one, we multiply this at runtime with + * the number of requested vCPUs to get the actual size. + */ +#define ARM_GIC_REDIST_SIZE 0x20000 + #define KVM_IRQ_OFFSET GIC_SPI_IRQ_BASE #define KVM_VM_TYPE 0 -- 2.3.5
WARNING: multiple messages have this Message-ID (diff)
From: Andre Przywara <andre.przywara@arm.com> To: will.deacon@arm.com, marc.zyngier@arm.com Cc: penberg@kernel.org, kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH v3 09/10] arm: add support for supplying GICv3 redistributor addresses Date: Wed, 17 Jun 2015 12:22:00 +0100 [thread overview] Message-ID: <1434540121-21283-10-git-send-email-andre.przywara@arm.com> (raw) In-Reply-To: <1434540121-21283-1-git-send-email-andre.przywara@arm.com> Instead of the GIC virtual CPU interface an emulated GICv3 needs to have accesses to its emulated redistributors trapped in the guest. Add code to tell the kernel about the mapping if a GICv3 emulation was requested by the user. This contains some defines which are not (yet) in the (32 bit) header files to allow compilation for ARM. Signed-off-by: Andre Przywara <andre.przywara@arm.com> --- arm/gic.c | 36 +++++++++++++++++++++++++++++++++++- arm/include/arm-common/gic.h | 3 ++- arm/include/arm-common/kvm-arch.h | 7 +++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/arm/gic.c b/arm/gic.c index b6c5868..efe4b42 100644 --- a/arm/gic.c +++ b/arm/gic.c @@ -9,7 +9,18 @@ #include <linux/kernel.h> #include <linux/kvm.h> +/* Those names are not defined for ARM (yet) */ +#ifndef KVM_VGIC_V3_ADDR_TYPE_DIST +#define KVM_VGIC_V3_ADDR_TYPE_DIST 2 +#endif + +#ifndef KVM_VGIC_V3_ADDR_TYPE_REDIST +#define KVM_VGIC_V3_ADDR_TYPE_REDIST 3 +#endif + static int gic_fd = -1; +static u64 gic_redists_base; +static u64 gic_redists_size; static int gic__create_device(struct kvm *kvm, enum irqchip_type type) { @@ -28,12 +39,21 @@ static int gic__create_device(struct kvm *kvm, enum irqchip_type type) .group = KVM_DEV_ARM_VGIC_GRP_ADDR, .addr = (u64)(unsigned long)&dist_addr, }; + struct kvm_device_attr redist_attr = { + .group = KVM_DEV_ARM_VGIC_GRP_ADDR, + .attr = KVM_VGIC_V3_ADDR_TYPE_REDIST, + .addr = (u64)(unsigned long)&gic_redists_base, + }; switch (type) { case IRQCHIP_GICV2: gic_device.type = KVM_DEV_TYPE_ARM_VGIC_V2; dist_attr.attr = KVM_VGIC_V2_ADDR_TYPE_DIST; break; + case IRQCHIP_GICV3: + gic_device.type = KVM_DEV_TYPE_ARM_VGIC_V3; + dist_attr.attr = KVM_VGIC_V3_ADDR_TYPE_DIST; + break; } err = ioctl(kvm->vm_fd, KVM_CREATE_DEVICE, &gic_device); @@ -46,6 +66,9 @@ static int gic__create_device(struct kvm *kvm, enum irqchip_type type) case IRQCHIP_GICV2: err = ioctl(gic_fd, KVM_SET_DEVICE_ATTR, &cpu_if_attr); break; + case IRQCHIP_GICV3: + err = ioctl(gic_fd, KVM_SET_DEVICE_ATTR, &redist_attr); + break; } if (err) goto out_err; @@ -97,6 +120,10 @@ int gic__create(struct kvm *kvm, enum irqchip_type type) switch (type) { case IRQCHIP_GICV2: break; + case IRQCHIP_GICV3: + gic_redists_size = kvm->cfg.nrcpus * ARM_GIC_REDIST_SIZE; + gic_redists_base = ARM_GIC_DIST_BASE - gic_redists_size; + break; default: return -ENODEV; } @@ -156,12 +183,19 @@ void gic__generate_fdt_nodes(void *fdt, u32 phandle, enum irqchip_type type) const char *compatible; u64 reg_prop[] = { cpu_to_fdt64(ARM_GIC_DIST_BASE), cpu_to_fdt64(ARM_GIC_DIST_SIZE), - cpu_to_fdt64(ARM_GIC_CPUI_BASE), cpu_to_fdt64(ARM_GIC_CPUI_SIZE), + 0, 0, /* to be filled */ }; switch (type) { case IRQCHIP_GICV2: compatible = "arm,cortex-a15-gic"; + reg_prop[2] = cpu_to_fdt64(ARM_GIC_CPUI_BASE); + reg_prop[3] = cpu_to_fdt64(ARM_GIC_CPUI_SIZE); + break; + case IRQCHIP_GICV3: + compatible = "arm,gic-v3"; + reg_prop[2] = cpu_to_fdt64(gic_redists_base); + reg_prop[3] = cpu_to_fdt64(gic_redists_size); break; default: return; diff --git a/arm/include/arm-common/gic.h b/arm/include/arm-common/gic.h index 2ed76fa..403d93b 100644 --- a/arm/include/arm-common/gic.h +++ b/arm/include/arm-common/gic.h @@ -22,7 +22,8 @@ #define GIC_MAX_IRQ 255 enum irqchip_type { - IRQCHIP_GICV2 + IRQCHIP_GICV2, + IRQCHIP_GICV3 }; struct kvm; diff --git a/arm/include/arm-common/kvm-arch.h b/arm/include/arm-common/kvm-arch.h index 90d6733..0f5fb7f 100644 --- a/arm/include/arm-common/kvm-arch.h +++ b/arm/include/arm-common/kvm-arch.h @@ -30,6 +30,13 @@ #define KVM_PCI_MMIO_AREA (KVM_PCI_CFG_AREA + ARM_PCI_CFG_SIZE) #define KVM_VIRTIO_MMIO_AREA ARM_MMIO_AREA +/* + * On a GICv3 there must be one redistributor per vCPU. + * The value here is the size for one, we multiply this at runtime with + * the number of requested vCPUs to get the actual size. + */ +#define ARM_GIC_REDIST_SIZE 0x20000 + #define KVM_IRQ_OFFSET GIC_SPI_IRQ_BASE #define KVM_VM_TYPE 0 -- 2.3.5
next prev parent reply other threads:[~2015-06-17 11:22 UTC|newest] Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-06-17 11:21 [PATCH v3 00/10] kvmtool: arm64: GICv3 guest support Andre Przywara 2015-06-17 11:21 ` Andre Przywara 2015-06-17 11:21 ` [PATCH v3 01/10] AArch64: Reserve two 64k pages for GIC CPU interface Andre Przywara 2015-06-17 11:21 ` Andre Przywara 2015-06-17 11:21 ` [PATCH v3 02/10] AArch{32, 64}: use KVM_CREATE_DEVICE & co to instanciate the GIC Andre Przywara 2015-06-17 11:21 ` Andre Przywara 2015-06-17 11:21 ` [PATCH v3 03/10] irq: add irq__get_nr_allocated_lines Andre Przywara 2015-06-17 11:21 ` Andre Przywara 2015-06-17 11:21 ` [PATCH v3 04/10] AArch{32, 64}: dynamically configure the number of GIC interrupts Andre Przywara 2015-06-17 11:21 ` Andre Przywara 2015-06-17 11:21 ` [PATCH v3 05/10] arm: finish VGIC initialisation explicitly Andre Przywara 2015-06-17 11:21 ` Andre Przywara 2015-06-17 11:21 ` [PATCH v3 06/10] arm: simplify MMIO dispatching Andre Przywara 2015-06-17 11:21 ` Andre Przywara 2015-06-17 12:48 ` Marc Zyngier 2015-06-17 12:48 ` Marc Zyngier 2015-06-17 13:49 ` Andre Przywara 2015-06-17 13:49 ` Andre Przywara 2015-06-17 14:06 ` Marc Zyngier 2015-06-17 14:06 ` Marc Zyngier 2015-06-24 13:30 ` Andre Przywara 2015-06-24 13:30 ` Andre Przywara 2015-06-24 17:56 ` Will Deacon 2015-06-24 17:56 ` Will Deacon 2015-06-17 11:21 ` [PATCH v3 07/10] limit number of VCPUs on demand Andre Przywara 2015-06-17 11:21 ` Andre Przywara 2015-06-17 12:53 ` Marc Zyngier 2015-06-17 12:53 ` Marc Zyngier 2015-06-17 13:14 ` Andre Przywara 2015-06-17 13:14 ` Andre Przywara 2015-06-17 11:21 ` [PATCH v3 08/10] arm: prepare for instantiating different IRQ chip devices Andre Przywara 2015-06-17 11:21 ` Andre Przywara 2015-06-17 13:06 ` Marc Zyngier 2015-06-17 13:06 ` Marc Zyngier 2015-06-17 11:22 ` Andre Przywara [this message] 2015-06-17 11:22 ` [PATCH v3 09/10] arm: add support for supplying GICv3 redistributor addresses Andre Przywara 2015-06-17 13:09 ` Marc Zyngier 2015-06-17 13:09 ` Marc Zyngier 2015-06-17 11:22 ` [PATCH v3 10/10] arm: use new irqchip parameter to create different vGIC types Andre Przywara 2015-06-17 11:22 ` Andre Przywara 2015-06-17 13:16 ` Marc Zyngier 2015-06-17 13:16 ` Marc Zyngier
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1434540121-21283-10-git-send-email-andre.przywara@arm.com \ --to=andre.przywara@arm.com \ --cc=linux-arm-kernel@lists.infradead.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.