From patchwork Mon Aug 10 12:06:26 2015
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Patchwork-Submitter: Pavel Fedin
X-Patchwork-Id: 505599
Return-Path:
X-Original-To: incoming@patchwork.ozlabs.org
Delivered-To: patchwork-incoming@bilbo.ozlabs.org
Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])
(using TLSv1 with cipher AES256-SHA (256/256 bits))
(No client certificate requested)
by ozlabs.org (Postfix) with ESMTPS id 696D61401CD
for ;
Mon, 10 Aug 2015 22:08:32 +1000 (AEST)
Received: from localhost ([::1]:57992 helo=lists.gnu.org)
by lists.gnu.org with esmtp (Exim 4.71) (envelope-from
)
id 1ZOlsU-0002R4-9j
for incoming@patchwork.ozlabs.org; Mon, 10 Aug 2015 08:08:30 -0400
Received: from eggs.gnu.org ([2001:4830:134:3::10]:38985)
by lists.gnu.org with esmtp (Exim 4.71)
(envelope-from ) id 1ZOlqi-00088C-KV
for qemu-devel@nongnu.org; Mon, 10 Aug 2015 08:06:41 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
(envelope-from ) id 1ZOlqd-0007Bv-SP
for qemu-devel@nongnu.org; Mon, 10 Aug 2015 08:06:40 -0400
Received: from mailout1.w1.samsung.com ([210.118.77.11]:59312)
by eggs.gnu.org with esmtp (Exim 4.71)
(envelope-from ) id 1ZOlqd-0007Az-Md
for qemu-devel@nongnu.org; Mon, 10 Aug 2015 08:06:35 -0400
Received: from eucpsbgm1.samsung.com (unknown [203.254.199.244])
by mailout1.w1.samsung.com
(Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5
2014)) with ESMTP id <0NSV00J408AVPYA0@mailout1.w1.samsung.com> for
qemu-devel@nongnu.org; Mon, 10 Aug 2015 13:06:31 +0100 (BST)
X-AuditID: cbfec7f4-f79c56d0000012ee-cc-55c893c7d3f4
Received: from eusync1.samsung.com ( [203.254.199.211])
by eucpsbgm1.samsung.com (EUCPMTA) with SMTP id 91.F9.04846.7C398C55;
Mon, 10 Aug 2015 13:06:31 +0100 (BST)
Received: from localhost ([106.109.131.169])
by eusync1.samsung.com (Oracle Communications Messaging Server
7.0.5.31.0 64bit (built May 5 2014))
with ESMTPA id <0NSV00DZ08AV9D50@eusync1.samsung.com>; Mon,
10 Aug 2015 13:06:31 +0100 (BST)
From: Pavel Fedin
To: qemu-devel@nongnu.org
Date: Mon, 10 Aug 2015 15:06:26 +0300
Message-id:
<921907bc07635dbe258f715015d09c41512447b3.1439207299.git.p.fedin@samsung.com>
X-Mailer: git-send-email 1.9.5.msysgit.0
In-reply-to:
References:
In-reply-to:
References:
X-Brightmail-Tracker:
H4sIAAAAAAAAA+NgFlrELMWRmVeSWpSXmKPExsVy+t/xy7rHJ58INVjYZGLx4vU/Rov5W86w
Wsw584DF4njvDhaLts/f2S3uvv7M4sDmsXPWXXaPliNvWT3uXNvD5vHk2mamAJYoLpuU1JzM
stQifbsEroye3RfYCtZqVaze+J21gXG1QhcjB4eEgInEuc7QLkZOIFNM4sK99WxdjFwcQgJL
GSXe3J7EDuF8Y5Ro2tLMBlLFJqAucfrrBxYQW0RAUuJ312lmkCJmgUeMEl+3nmEGSQgLuEi8
/9zJCrKBRUBV4uveGJAwr0C0ROf246wQ2zQkFn2ZAzaTU8Bc4nfnRkYQW0jATGLz0ps4xScw
8i9gZFjFKJpamlxQnJSea6hXnJhbXJqXrpecn7uJERJyX3YwLj5mdYhRgINRiYd3xubjoUKs
iWXFlbmHGCU4mJVEeCOrT4QK8aYkVlalFuXHF5XmpBYfYpTmYFES5527632IkEB6Yklqdmpq
QWoRTJaJg1OqgdG6wLdwotyKH/tv+TnfmfX23AmOqbunNyfaORosUNatZ29eyB/hZDw3ZFXn
ksUftjXsbIy2XHbw7kUB8etv7tSfFPhjxuWxJubtCVnVXRsvzp0UJP29cSXj9YlLlr3VNtbv
z4+fVcypq+Zn9TWKr2RVSNtGoSKp5ouxE+0lN5tuaz/N43vgcpESS3FGoqEWc1FxIgCRZxd9
NQIAAA==
X-detected-operating-system: by eggs.gnu.org: Genre and OS details not
recognized.
X-Received-From: 210.118.77.11
Cc: Peter Maydell ,
Shlomo Pongratz ,
Shlomo Pongratz ,
Christoffer Dall ,
Eric Auger
Subject: [Qemu-devel] [PATCH v8 3/5] Introduce irqchip type specification
for KVM
X-BeenThere: qemu-devel@nongnu.org
X-Mailman-Version: 2.1.14
Precedence: list
List-Id:
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org
Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org
This patch introduces kernel_irqchip_type member in Machine class, which
is passed to kvm_arch_irqchip_create. Machine models which can use vGIC
now use it in order to supply correct GIC type for KVM capability
verification. The variable is defined as int in order to be
architecture-agnostic for potential future uses by other architectures.
Signed-off-by: Pavel Fedin
---
hw/arm/vexpress.c | 3 +++
hw/arm/virt.c | 3 +++
include/hw/boards.h | 1 +
include/sysemu/kvm.h | 3 ++-
kvm-all.c | 2 +-
stubs/kvm.c | 2 +-
target-arm/kvm-consts.h | 6 ++++++
target-arm/kvm.c | 13 +++++++++++--
8 files changed, 28 insertions(+), 5 deletions(-)
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index da21788..818399b 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -741,6 +741,9 @@ static void vexpress_instance_init(Object *obj)
"Set on/off to enable/disable the ARM "
"Security Extensions (TrustZone)",
NULL);
+
+ /* vexpress uses GICv2 */
+ vms->parent.kernel_irqchip_type = QEMU_GIC_TYPE_V2;
}
static void vexpress_class_init(ObjectClass *oc, void *data)
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 943e523..4d04ec0 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -944,6 +944,9 @@ static void virt_instance_init(Object *obj)
"Set on/off to enable/disable the ARM "
"Security Extensions (TrustZone)",
NULL);
+
+ /* Default GIC type is v2 */
+ vms->parent.kernel_irqchip_type = QEMU_GIC_TYPE_V2;
}
static void virt_class_init(ObjectClass *oc, void *data)
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 2aec9cb..37eb767 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -127,6 +127,7 @@ struct MachineState {
char *accel;
bool kernel_irqchip_allowed;
bool kernel_irqchip_required;
+ int kernel_irqchip_type;
int kvm_shadow_mem;
char *dtb;
char *dumpdtb;
diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
index 983e99e..8f4d485 100644
--- a/include/sysemu/kvm.h
+++ b/include/sysemu/kvm.h
@@ -434,6 +434,7 @@ void kvm_init_irq_routing(KVMState *s);
/**
* kvm_arch_irqchip_create:
* @KVMState: The KVMState pointer
+ * @type: irqchip type, architecture-specific
*
* Allow architectures to create an in-kernel irq chip themselves.
*
@@ -441,7 +442,7 @@ void kvm_init_irq_routing(KVMState *s);
* 0: irq chip was not created
* > 0: irq chip was created
*/
-int kvm_arch_irqchip_create(KVMState *s);
+int kvm_arch_irqchip_create(KVMState *s, int type);
/**
* kvm_set_one_reg - set a register value in KVM via KVM_SET_ONE_REG ioctl
diff --git a/kvm-all.c b/kvm-all.c
index 06e06f2..8df938d 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -1395,7 +1395,7 @@ static void kvm_irqchip_create(MachineState *machine, KVMState *s)
/* First probe and see if there's a arch-specific hook to create the
* in-kernel irqchip for us */
- ret = kvm_arch_irqchip_create(s);
+ ret = kvm_arch_irqchip_create(s, machine->kernel_irqchip_type);
if (ret == 0) {
ret = kvm_vm_ioctl(s, KVM_CREATE_IRQCHIP);
}
diff --git a/stubs/kvm.c b/stubs/kvm.c
index e7c60b6..a8505ff 100644
--- a/stubs/kvm.c
+++ b/stubs/kvm.c
@@ -1,7 +1,7 @@
#include "qemu-common.h"
#include "sysemu/kvm.h"
-int kvm_arch_irqchip_create(KVMState *s)
+int kvm_arch_irqchip_create(KVMState *s, int type)
{
return 0;
}
diff --git a/target-arm/kvm-consts.h b/target-arm/kvm-consts.h
index 943bf89..0bc12b7 100644
--- a/target-arm/kvm-consts.h
+++ b/target-arm/kvm-consts.h
@@ -39,6 +39,12 @@ MISMATCH_CHECK(CP_REG_SIZE_U64, KVM_REG_SIZE_U64)
MISMATCH_CHECK(CP_REG_ARM, KVM_REG_ARM)
MISMATCH_CHECK(CP_REG_ARCH_MASK, KVM_REG_ARCH_MASK)
+#define QEMU_GIC_TYPE_V2 5
+#define QEMU_GIC_TYPE_V3 7
+
+MISMATCH_CHECK(QEMU_GIC_TYPE_V2, KVM_DEV_TYPE_ARM_VGIC_V2)
+MISMATCH_CHECK(QEMU_GIC_TYPE_V3, KVM_DEV_TYPE_ARM_VGIC_V3)
+
#define QEMU_PSCI_0_1_FN_BASE 0x95c1ba5e
#define QEMU_PSCI_0_1_FN(n) (QEMU_PSCI_0_1_FN_BASE + (n))
#define QEMU_PSCI_0_1_FN_CPU_SUSPEND QEMU_PSCI_0_1_FN(0)
diff --git a/target-arm/kvm.c b/target-arm/kvm.c
index b278542..180f75f 100644
--- a/target-arm/kvm.c
+++ b/target-arm/kvm.c
@@ -583,19 +583,28 @@ void kvm_arch_init_irq_routing(KVMState *s)
{
}
-int kvm_arch_irqchip_create(KVMState *s)
+int kvm_arch_irqchip_create(KVMState *s, int type)
{
int ret;
+ /* Failure here means forgotten initialization of
+ * machine->kernel_irqchip_type in model code
+ */
+ assert(type != 0);
+
/* If we can create the VGIC using the newer device control API, we
* let the device do this when it initializes itself, otherwise we
* fall back to the old API */
- ret = kvm_create_device(s, KVM_DEV_TYPE_ARM_VGIC_V2, true);
+ ret = kvm_create_device(s, type, true);
if (ret == 0) {
return 1;
}
+ /* Fallback will create VGIC v2 */
+ if (type != KVM_DEV_TYPE_ARM_VGIC_V2) {
+ return ret;
+ }
return 0;
}