From patchwork Fri Jan 27 21:09:39 2012 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: 138330 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 3ADD81007D2 for ; Sat, 28 Jan 2012 08:12:12 +1100 (EST) Received: from localhost ([::1]:56220 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rqt5Z-0006hx-TL for incoming@patchwork.ozlabs.org; Fri, 27 Jan 2012 16:12:05 -0500 Received: from eggs.gnu.org ([140.186.70.92]:40268) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rqt5S-0006aY-KV for qemu-devel@nongnu.org; Fri, 27 Jan 2012 16:11:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Rqt5Q-0005eW-NO for qemu-devel@nongnu.org; Fri, 27 Jan 2012 16:11:58 -0500 Received: from cantor2.suse.de ([195.135.220.15]:60035 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rqt5Q-0005eP-6B; Fri, 27 Jan 2012 16:11:56 -0500 Received: from relay1.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id AC7758FE2D; Fri, 27 Jan 2012 22:11:54 +0100 (CET) From: =?UTF-8?q?Andreas=20F=C3=A4rber?= To: qemu-devel@nongnu.org Date: Fri, 27 Jan 2012 22:09:39 +0100 Message-Id: <1327698580-8107-1-git-send-email-afaerber@suse.de> X-Mailer: git-send-email 1.7.7 MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4-2.6 X-Received-From: 195.135.220.15 Cc: Anthony Liguori , Alexander Graf , Laurent Vivier , qemu-ppc@nongnu.org, Avi Kivity , =?UTF-8?q?Andreas=20F=C3=A4rber?= , Richard Henderson Subject: [Qemu-devel] [PATCH v2] macio: Improve shallow, half-hearted qdev'ification 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 From: Anthony Liguori Split macio into two PCIDevices with declarative device ID, macio-oldworld and macio-newworld. Drop is_oldworld state in favor of two separate init functions and deferred creation. Signed-off-by: Andreas Färber Cc: Alexander Graf --- v1 -> v2: * Patch was ignored for QOM second series: Rebase onto Anthony's older version. hw/macio.c | 106 +++++++++++++++++++++++++++++++++++------------------ hw/ppc_mac.h | 8 ++-- hw/ppc_newworld.c | 2 +- hw/ppc_oldworld.c | 2 +- 4 files changed, 76 insertions(+), 42 deletions(-) diff --git a/hw/macio.c b/hw/macio.c index ae9db08..8e2a1f8 100644 --- a/hw/macio.c +++ b/hw/macio.c @@ -27,10 +27,8 @@ #include "pci.h" #include "escc.h" -typedef struct MacIOState -{ +typedef struct MacIOState { PCIDevice parent; - int is_oldworld; MemoryRegion bar; MemoryRegion *pic_mem; MemoryRegion *dbdma_mem; @@ -47,15 +45,6 @@ static void macio_bar_setup(MacIOState *macio_state) MemoryRegion *bar = &macio_state->bar; memory_region_init(bar, "macio", 0x80000); - if (macio_state->pic_mem) { - if (macio_state->is_oldworld) { - /* Heathrow PIC */ - memory_region_add_subregion(bar, 0x00000, macio_state->pic_mem); - } else { - /* OpenPIC */ - memory_region_add_subregion(bar, 0x40000, macio_state->pic_mem); - } - } if (macio_state->dbdma_mem) { memory_region_add_subregion(bar, 0x08000, macio_state->dbdma_mem); } @@ -71,52 +60,92 @@ static void macio_bar_setup(MacIOState *macio_state) macio_state->ide_mem[i]); } } - if (macio_state->nvram != NULL) + if (macio_state->nvram != NULL) { macio_nvram_setup_bar(macio_state->nvram, bar, 0x60000); + } +} + +static void macio_common_init(MacIOState *macio_state) +{ + PCIDevice *d = &macio_state->parent; + + d->config[PCI_INTERRUPT_PIN] = 0x01; /* interrupt on pin 1 */ + + macio_bar_setup(macio_state); + pci_register_bar(d, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &macio_state->bar); +} + +static int macio_oldworld_initfn(PCIDevice *d) +{ + MacIOState *s = DO_UPCAST(MacIOState, parent, d); + + macio_common_init(s); + + if (s->pic_mem != NULL) { + /* Heathrow PIC */ + memory_region_add_subregion(&s->bar, 0x00000, s->pic_mem); + } + return 0; } -static int macio_initfn(PCIDevice *d) +static int macio_newworld_initfn(PCIDevice *d) { - d->config[0x3d] = 0x01; // interrupt on pin 1 + MacIOState *s = DO_UPCAST(MacIOState, parent, d); + + macio_common_init(s); + + if (s->pic_mem != NULL) { + /* OpenPIC */ + memory_region_add_subregion(&s->bar, 0x40000, s->pic_mem); + } return 0; } -static void macio_class_init(ObjectClass *klass, void *data) +static void macio_oldworld_class_init(ObjectClass *klass, void *data) { PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); - k->init = macio_initfn; + k->init = macio_oldworld_initfn; k->vendor_id = PCI_VENDOR_ID_APPLE; + k->device_id = PCI_DEVICE_ID_APPLE_343S1201; k->class_id = PCI_CLASS_OTHERS << 8; } -static DeviceInfo macio_info = { - .name = "macio", - .size = sizeof(MacIOState), - .class_init = macio_class_init, -}; - -static void macio_register(void) +static void macio_newworld_class_init(ObjectClass *klass, void *data) { - pci_qdev_register(&macio_info); + PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); + + k->init = macio_newworld_initfn; + k->vendor_id = PCI_VENDOR_ID_APPLE; + k->device_id = PCI_DEVICE_ID_APPLE_UNI_N_KEYL; + k->class_id = PCI_CLASS_OTHERS << 8; } -device_init(macio_register); +static DeviceInfo macio_oldworld_info = { + .name = "macio-oldworld", + .size = sizeof(MacIOState), + .class_init = macio_oldworld_class_init, +}; + +static DeviceInfo macio_newworld_info = { + .name = "macio-newworld", + .size = sizeof(MacIOState), + .class_init = macio_newworld_class_init, +}; -void macio_init (PCIBus *bus, int device_id, int is_oldworld, - MemoryRegion *pic_mem, MemoryRegion *dbdma_mem, - MemoryRegion *cuda_mem, void *nvram, - int nb_ide, MemoryRegion **ide_mem, - MemoryRegion *escc_mem) +void macio_init(PCIBus *bus, bool is_oldworld, + MemoryRegion *pic_mem, MemoryRegion *dbdma_mem, + MemoryRegion *cuda_mem, void *nvram, + int nb_ide, MemoryRegion **ide_mem, + MemoryRegion *escc_mem) { PCIDevice *d; MacIOState *macio_state; int i; - d = pci_create_simple(bus, -1, "macio"); + d = pci_create(bus, -1, is_oldworld ? "macio-oldworld" : "macio-newworld"); macio_state = DO_UPCAST(MacIOState, parent, d); - macio_state->is_oldworld = is_oldworld; macio_state->pic_mem = pic_mem; macio_state->dbdma_mem = dbdma_mem; macio_state->cuda_mem = cuda_mem; @@ -132,8 +161,13 @@ void macio_init (PCIBus *bus, int device_id, int is_oldworld, /* Note: this code is strongly inspirated from the corresponding code in PearPC */ - pci_config_set_device_id(d->config, device_id); + qdev_init_nofail(&d->qdev); +} - macio_bar_setup(macio_state); - pci_register_bar(d, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &macio_state->bar); +static void macio_register(void) +{ + pci_qdev_register(&macio_oldworld_info); + pci_qdev_register(&macio_newworld_info); } + +device_init(macio_register) diff --git a/hw/ppc_mac.h b/hw/ppc_mac.h index af75e45..c165096 100644 --- a/hw/ppc_mac.h +++ b/hw/ppc_mac.h @@ -45,10 +45,10 @@ void cuda_init (MemoryRegion **cuda_mem, qemu_irq irq); /* MacIO */ -void macio_init (PCIBus *bus, int device_id, int is_oldworld, - MemoryRegion *pic_mem, MemoryRegion *dbdma_mem, - MemoryRegion *cuda_mem, void *nvram, - int nb_ide, MemoryRegion **ide_mem, MemoryRegion *escc_mem); +void macio_init(PCIBus *bus, bool is_oldworld, + MemoryRegion *pic_mem, MemoryRegion *dbdma_mem, + MemoryRegion *cuda_mem, void *nvram, + int nb_ide, MemoryRegion **ide_mem, MemoryRegion *escc_mem); /* Heathrow PIC */ qemu_irq *heathrow_pic_init(MemoryRegion **pmem, diff --git a/hw/ppc_newworld.c b/hw/ppc_newworld.c index 506187b..b7a5553 100644 --- a/hw/ppc_newworld.c +++ b/hw/ppc_newworld.c @@ -348,7 +348,7 @@ static void ppc_core99_init (ram_addr_t ram_size, adb_kbd_init(&adb_bus); adb_mouse_init(&adb_bus); - macio_init(pci_bus, PCI_DEVICE_ID_APPLE_UNI_N_KEYL, 0, pic_mem, + macio_init(pci_bus, false, pic_mem, dbdma_mem, cuda_mem, NULL, 3, ide_mem, escc_bar); if (usb_enabled) { diff --git a/hw/ppc_oldworld.c b/hw/ppc_oldworld.c index 9295a34..7a74b61 100644 --- a/hw/ppc_oldworld.c +++ b/hw/ppc_oldworld.c @@ -274,7 +274,7 @@ static void ppc_heathrow_init (ram_addr_t ram_size, nvr = macio_nvram_init(0x2000, 4); pmac_format_nvram_partition(nvr, 0x2000); - macio_init(pci_bus, PCI_DEVICE_ID_APPLE_343S1201, 1, pic_mem, + macio_init(pci_bus, true, pic_mem, dbdma_mem, cuda_mem, nvr, 2, ide_mem, escc_bar); if (usb_enabled) {