From: Andre Przywara <andre.przywara@arm.com>
To: Will Deacon <will.deacon@arm.com>
Cc: kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org
Subject: [PATCH kvmtool 6/6] arm: Auto-detect guest GIC type
Date: Fri, 25 Jan 2019 18:08:01 +0000 [thread overview]
Message-ID: <20190125180801.209910-7-andre.przywara@arm.com> (raw)
In-Reply-To: <20190125180801.209910-1-andre.przywara@arm.com>
At the moment kvmtool always tries to instantiate a virtual GICv2 for
the guest, and fails with some scary error message if that doesn't work.
The user has then to manually specify "--irqchip=gicv3", which is not
really obvious.
With the advent of more GICv3-only machines, let's try to be more
clever and implement some auto-detection of the GIC type needed:
- We try GICv3 first. On GICv3-only hosts this will be the only working
option, so we don't loose anything. On GICv2-backwards compatible GICv3
machines GICv3 is probably the better choice these days.
- If that fails, we try GICv2.
- If that fails, we ran out out options and bail out.
We deduce the choice between "ITS vs. pure GICv3" and "GICv2m vs. GICv2" by
the presence of PCI devices, they would be the only MSI users anyway.
This algorithm is in effect is there is no explicit --irqchip parameter
on the command line. We still allow the GIC type to be set explicitly.
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
---
arm/gic.c | 25 +++++++++++++++++++++++++
arm/include/arm-common/gic.h | 1 +
2 files changed, 26 insertions(+)
diff --git a/arm/gic.c b/arm/gic.c
index abcbcc09..e6b66047 100644
--- a/arm/gic.c
+++ b/arm/gic.c
@@ -182,6 +182,8 @@ static int gic__create_device(struct kvm *kvm, enum irqchip_type type)
gic_device.type = KVM_DEV_TYPE_ARM_VGIC_V3;
dist_attr.attr = KVM_VGIC_V3_ADDR_TYPE_DIST;
break;
+ case IRQCHIP_AUTO:
+ return -ENODEV;
}
err = ioctl(kvm->vm_fd, KVM_CREATE_DEVICE, &gic_device);
@@ -199,6 +201,8 @@ static int gic__create_device(struct kvm *kvm, enum irqchip_type type)
case IRQCHIP_GICV3:
err = ioctl(gic_fd, KVM_SET_DEVICE_ATTR, &redist_attr);
break;
+ case IRQCHIP_AUTO:
+ return -ENODEV;
}
if (err)
goto out_err;
@@ -249,9 +253,30 @@ static int gic__create_irqchip(struct kvm *kvm)
int gic__create(struct kvm *kvm, enum irqchip_type type)
{
+ enum irqchip_type try;
+ bool needs_msis;
int err;
switch (type) {
+ case IRQCHIP_AUTO:
+ needs_msis = kvm->cfg.arch.virtio_trans_pci;
+ if (needs_msis)
+ try = IRQCHIP_GICV3_ITS;
+ else
+ try = IRQCHIP_GICV3;
+ err = gic__create(kvm, try);
+ if (!err) {
+ kvm->cfg.arch.irqchip = try;
+ return 0;
+ }
+ if (needs_msis)
+ try = IRQCHIP_GICV2M;
+ else
+ try = IRQCHIP_GICV2;
+ err = gic__create(kvm, try);
+ if (!err)
+ kvm->cfg.arch.irqchip = try;
+ return err;
case IRQCHIP_GICV2M:
gic_msi_size = KVM_VGIC_V2M_SIZE;
gic_msi_base = ARM_GIC_CPUI_BASE - gic_msi_size;
diff --git a/arm/include/arm-common/gic.h b/arm/include/arm-common/gic.h
index 1125d601..ec9cf31a 100644
--- a/arm/include/arm-common/gic.h
+++ b/arm/include/arm-common/gic.h
@@ -24,6 +24,7 @@
#define KVM_VGIC_V2M_SIZE 0x1000
enum irqchip_type {
+ IRQCHIP_AUTO,
IRQCHIP_GICV2,
IRQCHIP_GICV2M,
IRQCHIP_GICV3,
--
2.17.1
next prev parent reply other threads:[~2019-01-25 18:08 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-25 18:07 [PATCH kvmtool 0/6] Various convenience fixes Andre Przywara
2019-01-25 18:07 ` [PATCH kvmtool 1/6] arm: turn pr_info() into pr_debug() messages Andre Przywara
2019-01-25 18:07 ` [PATCH kvmtool 2/6] arm: fdt: add stdout-path to /chosen node Andre Przywara
2019-01-30 18:20 ` Will Deacon
2019-01-31 14:57 ` Andre Przywara
2019-02-01 6:26 ` Will Deacon
2019-02-01 11:03 ` Andre Przywara
2019-01-25 18:07 ` [PATCH kvmtool 3/6] Makefile: support -s switch Andre Przywara
2019-01-30 18:20 ` Will Deacon
2019-01-31 13:48 ` Andre Przywara
2019-01-25 18:07 ` [PATCH kvmtool 4/6] Makefile: Remove echoing of kvmtools version file Andre Przywara
2019-01-30 18:20 ` Will Deacon
2019-01-31 18:36 ` Andre Przywara
2019-01-25 18:08 ` [PATCH kvmtool 5/6] arm: pmu: Improve PMU error reporting Andre Przywara
2019-01-25 18:08 ` Andre Przywara [this message]
2019-01-30 18:20 ` [PATCH kvmtool 6/6] arm: Auto-detect guest GIC type Will Deacon
2019-01-31 18:46 ` Andre Przywara
2019-01-30 18:20 ` [PATCH kvmtool 0/6] Various convenience fixes Will Deacon
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=20190125180801.209910-7-andre.przywara@arm.com \
--to=andre.przywara@arm.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=will.deacon@arm.com \
/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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox