From patchwork Thu Apr 22 21:54:45 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Igor V. Kovalenko" X-Patchwork-Id: 50761 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]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 4BB2FB7D11 for ; Fri, 23 Apr 2010 07:58:15 +1000 (EST) Received: from localhost ([127.0.0.1]:48221 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O54PU-0004lS-Ib for incoming@patchwork.ozlabs.org; Thu, 22 Apr 2010 17:58:12 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1O54MH-0003mQ-7k for qemu-devel@nongnu.org; Thu, 22 Apr 2010 17:54:53 -0400 Received: from [140.186.70.92] (port=44374 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O54ME-0003k4-73 for qemu-devel@nongnu.org; Thu, 22 Apr 2010 17:54:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1O54MC-0004ip-Bw for qemu-devel@nongnu.org; Thu, 22 Apr 2010 17:54:50 -0400 Received: from mail-bw0-f215.google.com ([209.85.218.215]:58917) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1O54MB-0004he-TC for qemu-devel@nongnu.org; Thu, 22 Apr 2010 17:54:48 -0400 Received: by mail-bw0-f215.google.com with SMTP id 7so9038609bwz.16 for ; Thu, 22 Apr 2010 14:54:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:received:subject:to:from:date :message-id:in-reply-to:references:user-agent:mime-version :content-type:content-transfer-encoding; bh=T4290OcKu29r11E2ZWqIFVTtsCUeQ+voXO7kvAv4mXg=; b=X4r4J/H12HcGIILkXwYyBfDbOSTeGv/m74jocvJ0jnFaq2m6phuucGKGa+nMNSQhRm BQdTAxC2fxnhpvc004BoPfs/rIM9tKOKNbSALupn8ca20PtE1FrP8p2lmPU6d6ajHny9 D+5dJfyf/fIDmRwvrLn2r9HY4uk6qNH158roA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=subject:to:from:date:message-id:in-reply-to:references:user-agent :mime-version:content-type:content-transfer-encoding; b=DD0ontdwX35t6NhYXdJUpz5VnyAxCIf+7Owi8d5OkGpNfxU1ZwfdqDLufnpalvaerq r4Cyd/GjamLKCLjQRUsBg8VXwYGi2JVAs/EEq8/O+/cgEnPo37M4vRrTUnEoyUNrbAxx O13SXYgNiKoZqRiBCYwR67vxnkbUGTd1/tMOY= Received: by 10.103.144.37 with SMTP id w37mr1308125mun.19.1271973286836; Thu, 22 Apr 2010 14:54:46 -0700 (PDT) Received: from skyserv ([87.255.14.75]) by mx.google.com with ESMTPS id j2sm1783383mue.23.2010.04.22.14.54.46 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 22 Apr 2010 14:54:46 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=[192.168.1.2]) by skyserv with esmtp (Exim 4.71) (envelope-from ) id 1O54M9-00053b-F4 for qemu-devel@nongnu.org; Fri, 23 Apr 2010 01:54:45 +0400 To: qemu-devel@nongnu.org From: "Igor V. Kovalenko" Date: Fri, 23 Apr 2010 01:54:45 +0400 Message-ID: <20100422215445.19357.14059.stgit@skyserv> In-Reply-To: <20100422215238.19357.13159.stgit@skyserv> References: <20100422215238.19357.13159.stgit@skyserv> User-Agent: StGit/0.15 MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) Subject: [Qemu-devel] [PATCH 1/2] cmd646: pass pci_dev as it needs it 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 From: Igor V. Kovalenko Instead of doing tricks to get the pci_dev, just pass it in the 1st place. Patch is a bit longer that reverting the pci_dev field, but it states more clearly (IMHO) what we are doing. It also fixes the bm test, now that you told me that ->unit is not always valid. Signed-off-by: Juan Quintela Signed-off-by: Igor V. Kovalenko --- hw/ide/cmd646.c | 61 +++++++++++++++++++++++++++++++++++++++-------------- hw/ide/internal.h | 1 - hw/ide/piix.c | 1 - 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/hw/ide/cmd646.c b/hw/ide/cmd646.c index 0875de4..c6ed0b7 100644 --- a/hw/ide/cmd646.c +++ b/hw/ide/cmd646.c @@ -68,15 +68,9 @@ static void ide_map(PCIDevice *pci_dev, int region_num, } } -static PCIIDEState *pci_from_bm(BMDMAState *bm) +static uint32_t bmdma_readb_common(PCIIDEState *pci_dev, BMDMAState *bm, + uint32_t addr) { - return bm->pci_dev; -} - -static uint32_t bmdma_readb(void *opaque, uint32_t addr) -{ - BMDMAState *bm = opaque; - PCIIDEState *pci_dev = pci_from_bm(bm); uint32_t val; switch(addr & 3) { @@ -90,7 +84,7 @@ static uint32_t bmdma_readb(void *opaque, uint32_t addr) val = bm->status; break; case 3: - if (bm->unit == 0) { + if (bm == &pci_dev->bmdma[0]) { val = pci_dev->dev.config[UDIDETCR0]; } else { val = pci_dev->dev.config[UDIDETCR1]; @@ -106,10 +100,25 @@ static uint32_t bmdma_readb(void *opaque, uint32_t addr) return val; } -static void bmdma_writeb(void *opaque, uint32_t addr, uint32_t val) +static uint32_t bmdma_readb_0(void *opaque, uint32_t addr) +{ + PCIIDEState *pci_dev = opaque; + BMDMAState *bm = &pci_dev->bmdma[0]; + + return bmdma_readb_common(pci_dev, bm, addr); +} + +static uint32_t bmdma_readb_1(void *opaque, uint32_t addr) +{ + PCIIDEState *pci_dev = opaque; + BMDMAState *bm = &pci_dev->bmdma[1]; + + return bmdma_readb_common(pci_dev, bm, addr); +} + +static void bmdma_writeb_common(PCIIDEState *pci_dev, BMDMAState *bm, + uint32_t addr, uint32_t val) { - BMDMAState *bm = opaque; - PCIIDEState *pci_dev = pci_from_bm(bm); #ifdef DEBUG_IDE printf("bmdma: writeb 0x%02x : 0x%02x\n", addr, val); #endif @@ -123,7 +132,7 @@ static void bmdma_writeb(void *opaque, uint32_t addr, uint32_t val) bm->status = (val & 0x60) | (bm->status & 1) | (bm->status & ~val & 0x06); break; case 3: - if (bm->unit == 0) + if (bm == &pci_dev->bmdma[0]) pci_dev->dev.config[UDIDETCR0] = val; else pci_dev->dev.config[UDIDETCR1] = val; @@ -131,6 +140,22 @@ static void bmdma_writeb(void *opaque, uint32_t addr, uint32_t val) } } +static void bmdma_writeb_0(void *opaque, uint32_t addr, uint32_t val) +{ + PCIIDEState *pci_dev = opaque; + BMDMAState *bm = &pci_dev->bmdma[0]; + + bmdma_writeb_common(pci_dev, bm, addr, val); +} + +static void bmdma_writeb_1(void *opaque, uint32_t addr, uint32_t val) +{ + PCIIDEState *pci_dev = opaque; + BMDMAState *bm = &pci_dev->bmdma[1]; + + bmdma_writeb_common(pci_dev, bm, addr, val); +} + static void bmdma_map(PCIDevice *pci_dev, int region_num, pcibus_t addr, pcibus_t size, int type) { @@ -141,13 +166,17 @@ static void bmdma_map(PCIDevice *pci_dev, int region_num, BMDMAState *bm = &d->bmdma[i]; d->bus[i].bmdma = bm; bm->bus = d->bus+i; - bm->pci_dev = d; qemu_add_vm_change_state_handler(ide_dma_restart_cb, bm); register_ioport_write(addr, 1, 1, bmdma_cmd_writeb, bm); - register_ioport_write(addr + 1, 3, 1, bmdma_writeb, bm); - register_ioport_read(addr, 4, 1, bmdma_readb, bm); + if (i == 0) { + register_ioport_write(addr + 1, 3, 1, bmdma_writeb_0, d); + register_ioport_read(addr, 4, 1, bmdma_readb_0, d); + } else { + register_ioport_write(addr + 1, 3, 1, bmdma_writeb_1, d); + register_ioport_read(addr, 4, 1, bmdma_readb_1, d); + } register_ioport_write(addr + 4, 4, 1, bmdma_addr_writeb, bm); register_ioport_read(addr + 4, 4, 1, bmdma_addr_readb, bm); diff --git a/hw/ide/internal.h b/hw/ide/internal.h index 027029e..2efc784 100644 --- a/hw/ide/internal.h +++ b/hw/ide/internal.h @@ -483,7 +483,6 @@ struct BMDMAState { uint8_t status; uint32_t addr; - struct PCIIDEState *pci_dev; IDEBus *bus; /* current transfer state */ uint32_t cur_addr; diff --git a/hw/ide/piix.c b/hw/ide/piix.c index 295a93d..4fa3851 100644 --- a/hw/ide/piix.c +++ b/hw/ide/piix.c @@ -78,7 +78,6 @@ static void bmdma_map(PCIDevice *pci_dev, int region_num, BMDMAState *bm = &d->bmdma[i]; d->bus[i].bmdma = bm; bm->bus = d->bus+i; - bm->pci_dev = d; qemu_add_vm_change_state_handler(ide_dma_restart_cb, bm); register_ioport_write(addr, 1, 1, bmdma_cmd_writeb, bm);