From patchwork Fri Jun 7 12:58:14 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Andreas_F=C3=A4rber?= X-Patchwork-Id: 249716 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)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 2429A2C008F for ; Fri, 7 Jun 2013 23:13:48 +1000 (EST) Received: from localhost ([::1]:55760 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UkwMP-0003PN-9Y for incoming@patchwork.ozlabs.org; Fri, 07 Jun 2013 09:05:41 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44774) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UkwFY-00013t-5P for qemu-devel@nongnu.org; Fri, 07 Jun 2013 08:58:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UkwFQ-00085a-E3 for qemu-devel@nongnu.org; Fri, 07 Jun 2013 08:58:36 -0400 Received: from cantor2.suse.de ([195.135.220.15]:53796 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UkwFQ-00084n-0d for qemu-devel@nongnu.org; Fri, 07 Jun 2013 08:58:28 -0400 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id E07EBA555A; Fri, 7 Jun 2013 14:58:26 +0200 (CEST) From: =?UTF-8?q?Andreas=20F=C3=A4rber?= To: qemu-devel@nongnu.org Date: Fri, 7 Jun 2013 14:58:14 +0200 Message-Id: <1370609900-21998-7-git-send-email-afaerber@suse.de> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1370609900-21998-1-git-send-email-afaerber@suse.de> References: <1370609900-21998-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x X-Received-From: 195.135.220.15 Cc: =?UTF-8?q?Andreas=20F=C3=A4rber?= , anthony@codemonkey.ws Subject: [Qemu-devel] [PATCH v2 06/12] i8254: Convert PITCommonState to QOM realizefn 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 Instead of having the parent provide PITCommonClass::init, let the children override DeviceClass::realize themselves. This pushes the responsibility for saving and calling the parent's realizefn to the children. Signed-off-by: Andreas Färber --- hw/i386/kvm/i8254.c | 40 +++++++++++++++++++++++++++------------ hw/timer/i8254.c | 24 ++++++++++++++++++----- hw/timer/i8254_common.c | 8 -------- include/hw/timer/i8254_internal.h | 1 - 4 files changed, 47 insertions(+), 26 deletions(-) diff --git a/hw/i386/kvm/i8254.c b/hw/i386/kvm/i8254.c index 4ac5551..93a3669 100644 --- a/hw/i386/kvm/i8254.c +++ b/hw/i386/kvm/i8254.c @@ -33,6 +33,10 @@ #define CALIBRATION_ROUNDS 3 #define KVM_PIT(obj) OBJECT_CHECK(KVMPITState, (obj), TYPE_KVM_I8254) +#define KVM_PIT_CLASS(class) \ + OBJECT_CLASS_CHECK(KVMPITClass, (class), TYPE_KVM_I8254) +#define KVM_PIT_GET_CLASS(obj) \ + OBJECT_GET_CLASS(KVMPITClass, (obj), TYPE_KVM_I8254) typedef struct KVMPITState { PITCommonState parent_obj; @@ -42,6 +46,12 @@ typedef struct KVMPITState { int64_t kernel_clock_offset; } KVMPITState; +typedef struct KVMPITClass { + PITCommonClass parent_class; + + DeviceRealize parent_realize; +} KVMPITClass; + static int64_t abs64(int64_t v) { return v < 0 ? -v : v; @@ -237,8 +247,10 @@ static void kvm_pit_vm_state_change(void *opaque, int running, } } -static int kvm_pit_initfn(PITCommonState *pit) +static void kvm_pit_realizefn(DeviceState *dev, Error **errp) { + PITCommonState *pit = PIT_COMMON(dev); + KVMPITClass *kpc = KVM_PIT_GET_CLASS(dev); KVMPITState *s = KVM_PIT(pit); struct kvm_pit_config config = { .flags = 0, @@ -251,9 +263,9 @@ static int kvm_pit_initfn(PITCommonState *pit) ret = kvm_vm_ioctl(kvm_state, KVM_CREATE_PIT); } if (ret < 0) { - fprintf(stderr, "Create kernel PIC irqchip failed: %s\n", - strerror(ret)); - return ret; + error_setg(errp, "Create kernel PIC irqchip failed: %s", + strerror(ret)); + return; } switch (s->lost_tick_policy) { case LOST_TICK_DELAY: @@ -264,24 +276,25 @@ static int kvm_pit_initfn(PITCommonState *pit) ret = kvm_vm_ioctl(kvm_state, KVM_REINJECT_CONTROL, &control); if (ret < 0) { - fprintf(stderr, - "Can't disable in-kernel PIT reinjection: %s\n", - strerror(ret)); - return ret; + error_setg(errp, + "Can't disable in-kernel PIT reinjection: %s", + strerror(ret)); + return; } } break; default: - return -EINVAL; + error_setg(errp, "Lost tick policy not supported."); + return; } memory_region_init_reservation(&pit->ioports, "kvm-pit", 4); - qdev_init_gpio_in(&pit->dev.qdev, kvm_pit_irq_control, 1); + qdev_init_gpio_in(dev, kvm_pit_irq_control, 1); qemu_add_vm_change_state_handler(kvm_pit_vm_state_change, s); - return 0; + kpc->parent_realize(dev, errp); } static Property kvm_pit_properties[] = { @@ -293,10 +306,12 @@ static Property kvm_pit_properties[] = { static void kvm_pit_class_init(ObjectClass *klass, void *data) { + KVMPITClass *kpc = KVM_PIT_CLASS(klass); PITCommonClass *k = PIT_COMMON_CLASS(klass); DeviceClass *dc = DEVICE_CLASS(klass); - k->init = kvm_pit_initfn; + kpc->parent_realize = dc->realize; + dc->realize = kvm_pit_realizefn; k->set_channel_gate = kvm_pit_set_gate; k->get_channel_info = kvm_pit_get_channel_info; k->pre_save = kvm_pit_get; @@ -310,6 +325,7 @@ static const TypeInfo kvm_pit_info = { .parent = TYPE_PIT_COMMON, .instance_size = sizeof(KVMPITState), .class_init = kvm_pit_class_init, + .class_size = sizeof(KVMPITClass), }; static void kvm_pit_register(void) diff --git a/hw/timer/i8254.c b/hw/timer/i8254.c index efbca19..16c8dd6 100644 --- a/hw/timer/i8254.c +++ b/hw/timer/i8254.c @@ -35,6 +35,15 @@ #define RW_STATE_WORD0 3 #define RW_STATE_WORD1 4 +#define PIT_CLASS(class) OBJECT_CLASS_CHECK(PITClass, (class), TYPE_I8254) +#define PIT_GET_CLASS(obj) OBJECT_GET_CLASS(PITClass, (obj), TYPE_I8254) + +typedef struct PITClass { + PITCommonClass parent_class; + + DeviceRealize parent_realize; +} PITClass; + static void pit_irq_timer_update(PITChannelState *s, int64_t current_time); static int pit_get_count(PITChannelState *s) @@ -313,20 +322,22 @@ static void pit_post_load(PITCommonState *s) } } -static int pit_initfn(PITCommonState *pit) +static void pit_realizefn(DeviceState *dev, Error **err) { + PITCommonState *pit = PIT_COMMON(dev); + PITClass *pc = PIT_GET_CLASS(dev); PITChannelState *s; s = &pit->channels[0]; /* the timer 0 is connected to an IRQ */ s->irq_timer = qemu_new_timer_ns(vm_clock, pit_irq_timer, s); - qdev_init_gpio_out(&pit->dev.qdev, &s->irq, 1); + qdev_init_gpio_out(dev, &s->irq, 1); memory_region_init_io(&pit->ioports, &pit_ioport_ops, pit, "pit", 4); - qdev_init_gpio_in(&pit->dev.qdev, pit_irq_control, 1); + qdev_init_gpio_in(dev, pit_irq_control, 1); - return 0; + pc->parent_realize(dev, err); } static Property pit_properties[] = { @@ -336,10 +347,12 @@ static Property pit_properties[] = { static void pit_class_initfn(ObjectClass *klass, void *data) { + PITClass *pc = PIT_CLASS(klass); PITCommonClass *k = PIT_COMMON_CLASS(klass); DeviceClass *dc = DEVICE_CLASS(klass); - k->init = pit_initfn; + pc->parent_realize = dc->realize; + dc->realize = pit_realizefn; k->set_channel_gate = pit_set_channel_gate; k->get_channel_info = pit_get_channel_info_common; k->post_load = pit_post_load; @@ -352,6 +365,7 @@ static const TypeInfo pit_info = { .parent = TYPE_PIT_COMMON, .instance_size = sizeof(PITCommonState), .class_init = pit_class_initfn, + .class_size = sizeof(PITClass), }; static void pit_register_types(void) diff --git a/hw/timer/i8254_common.c b/hw/timer/i8254_common.c index 36eed80..4e5bf0b 100644 --- a/hw/timer/i8254_common.c +++ b/hw/timer/i8254_common.c @@ -170,14 +170,6 @@ static void pit_common_realize(DeviceState *dev, Error **errp) { ISADevice *isadev = ISA_DEVICE(dev); PITCommonState *pit = PIT_COMMON(dev); - PITCommonClass *c = PIT_COMMON_GET_CLASS(pit); - int ret; - - ret = c->init(pit); - if (ret < 0) { - error_setg(errp, "PIT init failed."); - return; - } isa_register_ioport(isadev, &pit->ioports, pit->iobase); diff --git a/include/hw/timer/i8254_internal.h b/include/hw/timer/i8254_internal.h index e0cff0c..61a1bfb 100644 --- a/include/hw/timer/i8254_internal.h +++ b/include/hw/timer/i8254_internal.h @@ -68,7 +68,6 @@ typedef struct PITCommonState { typedef struct PITCommonClass { ISADeviceClass parent_class; - int (*init)(PITCommonState *s); void (*set_channel_gate)(PITCommonState *s, PITChannelState *sc, int val); void (*get_channel_info)(PITCommonState *s, PITChannelState *sc, PITChannelInfo *info);