From patchwork Sat Feb 12 22:44:08 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Blue Swirl X-Patchwork-Id: 82953 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) by ozlabs.org (Postfix) with ESMTP id 19937B711E for ; Sun, 13 Feb 2011 09:57:38 +1100 (EST) Received: from localhost ([127.0.0.1]:45260 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PoOJu-0003PK-SG for incoming@patchwork.ozlabs.org; Sat, 12 Feb 2011 17:52:03 -0500 Received: from [140.186.70.92] (port=38690 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PoOCq-0007l6-9M for qemu-devel@nongnu.org; Sat, 12 Feb 2011 17:45:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PoOCc-0000Rq-7o for qemu-devel@nongnu.org; Sat, 12 Feb 2011 17:44:31 -0500 Received: from mail-vw0-f45.google.com ([209.85.212.45]:50340) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PoOCb-0000Rm-U7 for qemu-devel@nongnu.org; Sat, 12 Feb 2011 17:44:30 -0500 Received: by vws12 with SMTP id 12so2378214vws.4 for ; Sat, 12 Feb 2011 14:44:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:from:date:message-id:subject:to :content-type; bh=Xmt6CSUig3/lqiqhLC1yQTrKFwOysA8GicVN38pkgiE=; b=r6LaGR95GjU03D9/BUMpoB6PDUcvvjrQOFVQdyJi13iQt+xzUpYo+Y2q3mY7psujGI f7yXkzIv+VE0ZyzsGDZjD5fDGsKNe90AR3O18doIDHuEo+gGbbTlPpFWJUO0eGk9kqOX 8JADGfwGgPwiLQCy30gh3OZPlETXvnVh1zqRA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:from:date:message-id:subject:to:content-type; b=L0zJtRQIdVT+a54Mj00FI9WWAxC5LjV/+6pjN0FsNV/ZfLjxdBoI153Liu0nNIkPiF OZPBm8To5/QiUlcUDbATjRO8Ax9qy9sK+0fiUi+SogJHdqaf2ElBSOKFRzvGnIsw6ojd QhWYrtOwPznz/RShtgV88+hXubyRB5OOSDbeE= Received: by 10.220.191.199 with SMTP id dn7mr2664594vcb.239.1297550669304; Sat, 12 Feb 2011 14:44:29 -0800 (PST) MIME-Version: 1.0 Received: by 10.220.186.7 with HTTP; Sat, 12 Feb 2011 14:44:08 -0800 (PST) From: Blue Swirl Date: Sun, 13 Feb 2011 00:44:08 +0200 Message-ID: To: qemu-devel X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 209.85.212.45 Subject: [Qemu-devel] [PATCH 09/10] fdc: refactor device creation X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Turn fdc_init_isa into an inline function. Get floppy geometry directly from the drives. Don't expose FDCtrl. Signed-off-by: Blue Swirl --- hw/fdc.c | 37 ++++++------------------------------- hw/fdc.h | 24 +++++++++++++++++------- hw/pc.c | 31 +++++++++++++++++++------------ hw/pc.h | 3 +-- hw/pc_piix.c | 5 ++--- 5 files changed, 45 insertions(+), 55 deletions(-) diff --git a/hw/fdc.c b/hw/fdc.c index c130cba..9f4779c 100644 --- a/hw/fdc.c +++ b/hw/fdc.c @@ -201,6 +201,8 @@ static void fd_revalidate(FDrive *drv) /********************************************************/ /* Intel 82078 floppy disk controller emulation */ +typedef struct FDCtrl FDCtrl; + static void fdctrl_reset(FDCtrl *fdctrl, int do_irq); static void fdctrl_reset_fifo(FDCtrl *fdctrl); static int fdctrl_transfer_handler (void *opaque, int nchan, @@ -626,12 +628,6 @@ static void fdctrl_handle_tc(void *opaque, int irq, int level) } } -/* XXX: may change if moved to bdrv */ -FDriveType fdctrl_get_drive_type(FDCtrl *fdctrl, int drive_num) -{ - return fdctrl->drives[drive_num].drive; -} - /* Change IRQ state */ static void fdctrl_reset_irq(FDCtrl *fdctrl) { @@ -1775,23 +1771,8 @@ static int fdctrl_connect_drives(FDCtrl *fdctrl) return 0; } -FDCtrl *fdctrl_init_isa(DriveInfo **fds) -{ - ISADevice *dev; - - dev = isa_create("isa-fdc"); - if (fds[0]) { - qdev_prop_set_drive_nofail(&dev->qdev, "driveA", fds[0]->bdrv); - } - if (fds[1]) { - qdev_prop_set_drive_nofail(&dev->qdev, "driveB", fds[1]->bdrv); - } - qdev_init_nofail(&dev->qdev); - return &(DO_UPCAST(FDCtrlISABus, busdev, dev)->state); -} - -FDCtrl *fdctrl_init_sysbus(qemu_irq irq, int dma_chann, - target_phys_addr_t mmio_base, DriveInfo **fds) +void fdctrl_init_sysbus(qemu_irq irq, int dma_chann, + target_phys_addr_t mmio_base, DriveInfo **fds) { FDCtrl *fdctrl; DeviceState *dev; @@ -1810,16 +1791,13 @@ FDCtrl *fdctrl_init_sysbus(qemu_irq irq, int dma_chann, qdev_init_nofail(dev); sysbus_connect_irq(&sys->busdev, 0, irq); sysbus_mmio_map(&sys->busdev, 0, mmio_base); - - return fdctrl; } -FDCtrl *sun4m_fdctrl_init(qemu_irq irq, target_phys_addr_t io_base, - DriveInfo **fds, qemu_irq *fdc_tc) +void sun4m_fdctrl_init(qemu_irq irq, target_phys_addr_t io_base, + DriveInfo **fds, qemu_irq *fdc_tc) { DeviceState *dev; FDCtrlSysBus *sys; - FDCtrl *fdctrl; dev = qdev_create(NULL, "SUNW,fdtwo"); if (fds[0]) { @@ -1827,12 +1805,9 @@ FDCtrl *sun4m_fdctrl_init(qemu_irq irq, target_phys_addr_t io_base, } qdev_init_nofail(dev); sys = DO_UPCAST(FDCtrlSysBus, busdev.qdev, dev); - fdctrl = &sys->state; sysbus_connect_irq(&sys->busdev, 0, irq); sysbus_mmio_map(&sys->busdev, 0, io_base); *fdc_tc = qdev_get_gpio_in(dev, 0); - - return fdctrl; } static int fdctrl_init_common(FDCtrl *fdctrl) diff --git a/hw/fdc.h b/hw/fdc.h index 30ac970..3b2fb3b 100644 --- a/hw/fdc.h +++ b/hw/fdc.h @@ -1,18 +1,28 @@ #ifndef HW_FDC_H #define HW_FDC_H +#include "isa.h" #include "blockdev.h" /* fdc.c */ #define MAX_FD 2 -typedef struct FDCtrl FDCtrl; +static inline void fdctrl_init_isa(DriveInfo **fds) +{ + ISADevice *dev; -FDCtrl *fdctrl_init_isa(DriveInfo **fds); -FDCtrl *fdctrl_init_sysbus(qemu_irq irq, int dma_chann, - target_phys_addr_t mmio_base, DriveInfo **fds); -FDCtrl *sun4m_fdctrl_init(qemu_irq irq, target_phys_addr_t io_base, - DriveInfo **fds, qemu_irq *fdc_tc); -FDriveType fdctrl_get_drive_type(FDCtrl *fdctrl, int drive_num); + dev = isa_create("isa-fdc"); + if (fds[0]) { + qdev_prop_set_drive_nofail(&dev->qdev, "driveA", fds[0]->bdrv); + } + if (fds[1]) { + qdev_prop_set_drive_nofail(&dev->qdev, "driveB", fds[1]->bdrv); + } + qdev_init_nofail(&dev->qdev); +} +void fdctrl_init_sysbus(qemu_irq irq, int dma_chann, + target_phys_addr_t mmio_base, DriveInfo **fds); +void sun4m_fdctrl_init(qemu_irq irq, target_phys_addr_t io_base, + DriveInfo **fds, qemu_irq *fdc_tc); #endif diff --git a/hw/pc.c b/hw/pc.c index 4e4e2eb..36641b3 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -334,10 +334,11 @@ static void pc_cmos_init_late(void *opaque) void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size, const char *boot_device, BusState *idebus0, BusState *idebus1, - FDCtrl *floppy_controller, ISADevice *s) + ISADevice *s) { - int val, nb; - FDriveType fd0, fd1; + int val, nb, nb_heads, max_track, last_sect, i; + FDriveType fd_type[2]; + DriveInfo *fd[2]; static pc_cmos_init_late_arg arg; /* various important CMOS locations needed by PC/Bochs bios */ @@ -379,19 +380,26 @@ void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size, } /* floppy type */ - - fd0 = fdctrl_get_drive_type(floppy_controller, 0); - fd1 = fdctrl_get_drive_type(floppy_controller, 1); - - val = (cmos_get_fd_drive_type(fd0) << 4) | cmos_get_fd_drive_type(fd1); + for (i = 0; i < 2; i++) { + fd[i] = drive_get(IF_FLOPPY, 0, i); + if (fd[i]) { + bdrv_get_floppy_geometry_hint(fd[i]->bdrv, &nb_heads, &max_track, + &last_sect, FDRIVE_DRV_NONE, + &fd_type[i]); + } else { + fd_type[i] = FDRIVE_DRV_NONE; + } + } + val = (cmos_get_fd_drive_type(fd_type[0]) << 4) | + cmos_get_fd_drive_type(fd_type[1]); rtc_set_memory(s, 0x10, val); val = 0; nb = 0; - if (fd0 < FDRIVE_DRV_NONE) { + if (fd_type[0] < FDRIVE_DRV_NONE) { nb++; } - if (fd1 < FDRIVE_DRV_NONE) { + if (fd_type[1] < FDRIVE_DRV_NONE) { nb++; } switch (nb) { @@ -1092,7 +1100,6 @@ static void cpu_request_exit(void *opaque, int irq, int level) } void pc_basic_device_init(qemu_irq *isa_irq, - FDCtrl **floppy_controller, ISADevice **rtc_state) { int i; @@ -1153,7 +1160,7 @@ void pc_basic_device_init(qemu_irq *isa_irq, for(i = 0; i < MAX_FD; i++) { fd[i] = drive_get(IF_FLOPPY, 0, i); } - *floppy_controller = fdctrl_init_isa(fd); + fdctrl_init_isa(fd); } void pc_pci_device_init(PCIBus *pci_bus) diff --git a/hw/pc.h b/hw/pc.h index 89b43ea..64a3a22 100644 --- a/hw/pc.h +++ b/hw/pc.h @@ -129,13 +129,12 @@ void pc_memory_init(ram_addr_t ram_size, qemu_irq *pc_allocate_cpu_irq(void); void pc_vga_init(PCIBus *pci_bus); void pc_basic_device_init(qemu_irq *isa_irq, - FDCtrl **floppy_controller, ISADevice **rtc_state); void pc_init_ne2k_isa(NICInfo *nd); void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size, const char *boot_device, BusState *ide0, BusState *ide1, - FDCtrl *floppy_controller, ISADevice *s); + ISADevice *s); void pc_pci_device_init(PCIBus *pci_bus); typedef void (*cpu_set_smm_t)(int smm, void *arg); diff --git a/hw/pc_piix.c b/hw/pc_piix.c index d0bd0cd..1ec893c 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -80,7 +80,6 @@ static void pc_init1(ram_addr_t ram_size, qemu_irq *smi_irq; IsaIrqState *isa_irq_state; DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; - FDCtrl *floppy_controller; BusState *idebus[MAX_IDE_BUS]; ISADevice *rtc_state; @@ -113,7 +112,7 @@ static void pc_init1(ram_addr_t ram_size, pc_vga_init(pci_enabled? pci_bus: NULL); /* init basic PC hardware */ - pc_basic_device_init(isa_irq, &floppy_controller, &rtc_state); + pc_basic_device_init(isa_irq, &rtc_state); for(i = 0; i < nb_nics; i++) { NICInfo *nd = &nd_table[i]; @@ -150,7 +149,7 @@ static void pc_init1(ram_addr_t ram_size, audio_init(isa_irq, pci_enabled ? pci_bus : NULL); pc_cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device, - idebus[0], idebus[1], floppy_controller, rtc_state); + idebus[0], idebus[1], rtc_state); if (pci_enabled && usb_enabled) { usb_uhci_piix3_init(pci_bus, piix3_devfn + 2);