From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:53923) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RqYbA-0005Xi-Fw for qemu-devel@nongnu.org; Thu, 26 Jan 2012 18:19:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RqYb8-0000Gt-Vp for qemu-devel@nongnu.org; Thu, 26 Jan 2012 18:19:20 -0500 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Fri, 27 Jan 2012 00:17:02 +0100 Message-Id: <1327619823-9491-1-git-send-email-afaerber@suse.de> In-Reply-To: <1327433600-7403-2-git-send-email-aliguori@us.ibm.com> References: <1327433600-7403-2-git-send-email-aliguori@us.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH] macio: Convert to qdev List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Anthony Liguori , Alexander Graf , Laurent Vivier , qemu-ppc@nongnu.org, Avi Kivity , =?UTF-8?q?Andreas=20F=C3=A4rber?= , Richard Henderson From: Anthony Liguori Signed-off-by: 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=C3=A4rber Cc: Alexander Graf --- Anthony, I've extended and tested your patch, please consider using this= version. (In that case feel free to move your Signed-off-by down.) Alex, please ack. We could inline macio_init() and get rid of is_oldworl= d but would have to move MacIOState into ppc_mac.h then. hw/macio.c | 114 +++++++++++++++++++++++++++++++++++++----------= ----- hw/ppc_mac.h | 8 ++-- hw/ppc_newworld.c | 2 +- hw/ppc_oldworld.c | 2 +- 4 files changed, 87 insertions(+), 39 deletions(-) diff --git a/hw/macio.c b/hw/macio.c index cc6ae40..3fb49fb 100644 --- a/hw/macio.c +++ b/hw/macio.c @@ -27,9 +27,8 @@ #include "pci.h" #include "escc.h" =20 -typedef struct macio_state_t macio_state_t; -struct macio_state_t { - int is_oldworld; +typedef struct MacIOState { + PCIDevice parent; MemoryRegion bar; MemoryRegion *pic_mem; MemoryRegion *dbdma_mem; @@ -38,23 +37,14 @@ struct macio_state_t { void *nvram; int nb_ide; MemoryRegion *ide_mem[4]; -}; +} MacIOState; =20 -static void macio_bar_setup(macio_state_t *macio_state) +static void macio_bar_setup(MacIOState *macio_state) { int i; MemoryRegion *bar =3D &macio_state->bar; =20 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_m= em); - } else { - /* OpenPIC */ - memory_region_add_subregion(bar, 0x40000, macio_state->pic_m= em); - } - } if (macio_state->dbdma_mem) { memory_region_add_subregion(bar, 0x08000, macio_state->dbdma_mem= ); } @@ -70,25 +60,82 @@ static void macio_bar_setup(macio_state_t *macio_stat= e) macio_state->ide_mem[i]); } } - if (macio_state->nvram !=3D NULL) + if (macio_state->nvram !=3D NULL) { macio_nvram_setup_bar(macio_state->nvram, bar, 0x60000); + } +} + +static void macio_common_init(MacIOState *macio_state) +{ + PCIDevice *d =3D &macio_state->parent; + + d->config[PCI_INTERRUPT_PIN] =3D 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 =3D DO_UPCAST(MacIOState, parent, d); + + macio_common_init(s); + + if (s->pic_mem !=3D NULL) { + /* Heathrow PIC */ + memory_region_add_subregion(&s->bar, 0x00000, s->pic_mem); + } + return 0; } =20 -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) +static int macio_newworld_initfn(PCIDevice *d) +{ + MacIOState *s =3D DO_UPCAST(MacIOState, parent, d); + + macio_common_init(s); + + if (s->pic_mem !=3D NULL) { + /* OpenPIC */ + memory_region_add_subregion(&s->bar, 0x40000, s->pic_mem); + } + return 0; +} + +static PCIDeviceInfo macio_oldworld_info =3D { + .qdev.name =3D "macio-oldworld", + .qdev.size =3D sizeof(MacIOState), + .qdev.no_user =3D 1, + .no_hotplug =3D 1, + .init =3D macio_oldworld_initfn, + .vendor_id =3D PCI_VENDOR_ID_APPLE, + .device_id =3D PCI_DEVICE_ID_APPLE_343S1201, + .class_id =3D PCI_CLASS_OTHERS << 8, +}; + +static PCIDeviceInfo macio_newworld_info =3D { + .qdev.name =3D "macio-newworld", + .qdev.size =3D sizeof(MacIOState), + .qdev.no_user =3D 1, + .no_hotplug =3D 1, + .init =3D macio_newworld_initfn, + .vendor_id =3D PCI_VENDOR_ID_APPLE, + .device_id =3D PCI_DEVICE_ID_APPLE_UNI_N_KEYL, + .class_id =3D PCI_CLASS_OTHERS << 8, +}; + +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; - macio_state_t *macio_state; + MacIOState *macio_state; int i; =20 - d =3D pci_register_device(bus, "macio", - sizeof(PCIDevice) + sizeof(macio_state_t), - -1, NULL, NULL); - macio_state =3D (macio_state_t *)(d + 1); - macio_state->is_oldworld =3D is_oldworld; + d =3D pci_create(bus, -1, is_oldworld ? "macio-oldworld" : "macio-ne= wworld"); + + macio_state =3D DO_UPCAST(MacIOState, parent, d); macio_state->pic_mem =3D pic_mem; macio_state->dbdma_mem =3D dbdma_mem; macio_state->cuda_mem =3D cuda_mem; @@ -104,12 +151,13 @@ void macio_init (PCIBus *bus, int device_id, int is= _oldworld, /* Note: this code is strongly inspirated from the corresponding cod= e in PearPC */ =20 - pci_config_set_vendor_id(d->config, PCI_VENDOR_ID_APPLE); - pci_config_set_device_id(d->config, device_id); - pci_config_set_class(d->config, PCI_CLASS_OTHERS << 8); - - d->config[0x3d] =3D 0x01; // interrupt on pin 1 + qdev_init_nofail(&d->qdev); +} =20 - 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); =20 /* 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_m= em); =20 /* Heathrow PIC */ qemu_irq *heathrow_pic_init(MemoryRegion **pmem, diff --git a/hw/ppc_newworld.c b/hw/ppc_newworld.c index a746c9c..83c09fa 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); =20 - 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); =20 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 =3D macio_nvram_init(0x2000, 4); pmac_format_nvram_partition(nvr, 0x2000); =20 - 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); =20 if (usb_enabled) { --=20 1.7.7