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; }