From patchwork Wed Sep 30 10:18:03 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Isaku Yamahata X-Patchwork-Id: 34528 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 40EADB7082 for ; Wed, 30 Sep 2009 20:33:59 +1000 (EST) Received: from localhost ([127.0.0.1]:33489 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MswVP-0007zJ-Pj for incoming@patchwork.ozlabs.org; Wed, 30 Sep 2009 06:33:55 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MswIU-0004fz-QS for qemu-devel@nongnu.org; Wed, 30 Sep 2009 06:20:36 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MswIL-0004Wv-01 for qemu-devel@nongnu.org; Wed, 30 Sep 2009 06:20:30 -0400 Received: from [199.232.76.173] (port=43877 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MswIK-0004WY-EK for qemu-devel@nongnu.org; Wed, 30 Sep 2009 06:20:24 -0400 Received: from mail.valinux.co.jp ([210.128.90.3]:55870) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MswII-0005pz-Uz for qemu-devel@nongnu.org; Wed, 30 Sep 2009 06:20:23 -0400 Received: from nm.local.valinux.co.jp (vagw.valinux.co.jp [210.128.90.14]) by mail.valinux.co.jp (Postfix) with ESMTP id 761DB49C23; Wed, 30 Sep 2009 19:20:17 +0900 (JST) Received: from yamahata by nm.local.valinux.co.jp with local (Exim 4.69) (envelope-from ) id 1MswGc-0003s3-Ng; Wed, 30 Sep 2009 19:18:38 +0900 From: Isaku Yamahata To: qemu-devel@nongnu.org, anthony@codemonkey.ws Date: Wed, 30 Sep 2009 19:18:03 +0900 Message-Id: <1254305917-14784-28-git-send-email-yamahata@valinux.co.jp> X-Mailer: git-send-email 1.6.0.2 In-Reply-To: <1254305917-14784-1-git-send-email-yamahata@valinux.co.jp> References: <1254305917-14784-1-git-send-email-yamahata@valinux.co.jp> X-Virus-Scanned: clamav-milter 0.95.2 at va-mail.local.valinux.co.jp X-Virus-Status: Clean X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 3) Cc: yamahata@valinux.co.jp Subject: [Qemu-devel] [PATCH 27/61] pci: clean up of pci_update_mappings() 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 This patch cleans up pci_update_mappings() making it more readable. - reduce indent level by one or two - remove duplicated logic. Signed-off-by: Isaku Yamahata --- hw/pci.c | 142 ++++++++++++++++++++++++++++++++----------------------------- 1 files changed, 74 insertions(+), 68 deletions(-) diff --git a/hw/pci.c b/hw/pci.c index beda5ef..6a28fa5 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -440,91 +440,97 @@ void pci_register_bar(PCIDevice *pci_dev, int region_num, static void pci_update_mappings(PCIDevice *d) { PCIIORegion *r; - int cmd, i; + int i; + uint16_t cmd; + uint64_t bar; + uint64_t max_addr; uint64_t last_addr, new_addr; uint32_t config_ofs; cmd = le16_to_cpu(*(uint16_t *)(d->config + PCI_COMMAND)); for(i = 0; i < PCI_NUM_REGIONS; i++) { r = &d->io_regions[i]; + if (r->size == 0) + continue; + if (i == PCI_ROM_SLOT) { config_ofs = 0x30; } else { config_ofs = 0x10 + i * 4; } - if (r->size != 0) { + + if (pci_bar_is_64bit(r)) { + bar = le64_to_cpu(*(uint64_t *)(d->config + config_ofs)); + } else { + bar = le32_to_cpu(*(uint32_t *)(d->config + config_ofs)); + } + + new_addr = PCI_BAR_UNMAPPED; + last_addr = 0; + max_addr = 0; + if (r->type & PCI_ADDRESS_SPACE_IO) { + if (cmd & PCI_COMMAND_IO) { + new_addr = bar; + } + + /* NOTE: we have only 64K ioports on PC */ + max_addr = 0x10000; + } else { + if (cmd & PCI_COMMAND_MEMORY) { + new_addr = bar; + } + + /* the ROM slot has a specific enable bit */ + if (i == PCI_ROM_SLOT && !(bar & 1)) { + new_addr = PCI_BAR_UNMAPPED; + } + + max_addr = PCI_BAR_UNMAPPED; + if (!pci_bar_is_64bit(r)) { + /* keep old behaviour + without this, PC ide doesn't work well. */ + max_addr = UINT32_MAX; + } + } + + new_addr = new_addr & ~(r->size - 1); + last_addr = new_addr + r->size - 1; + + /* NOTE: we do not support wrapping */ + /* XXX: as we cannot support really dynamic + mappings, we handle specific values as invalid + mappings. */ + if (last_addr <= new_addr || new_addr == 0 || last_addr >= max_addr) { + new_addr = PCI_BAR_UNMAPPED; + } + + if (new_addr == r->addr) { + continue; + } + + /* now do the real mapping */ + if (r->addr != PCI_BAR_UNMAPPED) { if (r->type & PCI_ADDRESS_SPACE_IO) { - if (cmd & PCI_COMMAND_IO) { - new_addr = le32_to_cpu(*(uint32_t *)(d->config + - config_ofs)); - new_addr = new_addr & ~(r->size - 1); - last_addr = new_addr + r->size - 1; - /* NOTE: we have only 64K ioports on PC */ - if (last_addr <= new_addr || new_addr == 0 || - last_addr >= 0x10000) { - new_addr = PCI_BAR_UNMAPPED; - } + int class; + /* NOTE: specific hack for IDE in PC case: + only one byte must be mapped. */ + class = d->config[0x0a] | (d->config[0x0b] << 8); + if (class == 0x0101 && r->size == 4) { + isa_unassign_ioport(r->addr + 2, 1); } else { - new_addr = PCI_BAR_UNMAPPED; + isa_unassign_ioport(r->addr, r->size); } } else { - if (cmd & PCI_COMMAND_MEMORY) { - - if (pci_bar_is_64bit(r)) { - new_addr = le64_to_cpu(*(uint64_t *)(d->config + - config_ofs)); - } else { - new_addr = le32_to_cpu(*(uint32_t *)(d->config + - config_ofs)); - } - /* the ROM slot has a specific enable bit */ - if (i == PCI_ROM_SLOT && !(new_addr & 1)) - goto no_mem_map; - new_addr = new_addr & ~(r->size - 1); - last_addr = new_addr + r->size - 1; - /* NOTE: we do not support wrapping */ - /* XXX: as we cannot support really dynamic - mappings, we handle specific values as invalid - mappings. */ - if (last_addr <= new_addr || new_addr == 0 || - last_addr == PCI_BAR_UNMAPPED || - - /* keep old behaviour - * without this, PC ide doesn't work well. */ - (!pci_bar_is_64bit(r) && last_addr >= UINT32_MAX)) { - new_addr = PCI_BAR_UNMAPPED; - } - } else { - no_mem_map: - new_addr = PCI_BAR_UNMAPPED; - } - } - /* now do the real mapping */ - if (new_addr != r->addr) { - if (r->addr != PCI_BAR_UNMAPPED) { - if (r->type & PCI_ADDRESS_SPACE_IO) { - int class; - /* NOTE: specific hack for IDE in PC case: - only one byte must be mapped. */ - class = d->config[0x0a] | (d->config[0x0b] << 8); - if (class == 0x0101 && r->size == 4) { - isa_unassign_ioport(r->addr + 2, 1); - } else { - isa_unassign_ioport(r->addr, r->size); - } - } else { - cpu_register_physical_memory(pci_to_cpu_addr(r->addr), - r->size, - IO_MEM_UNASSIGNED); - qemu_unregister_coalesced_mmio(r->addr, r->size); - } - } - r->addr = new_addr; - if (r->addr != PCI_BAR_UNMAPPED) { - r->map_func(d, i, r->addr, r->size, r->type); - } + cpu_register_physical_memory(pci_to_cpu_addr(r->addr), + r->size, + IO_MEM_UNASSIGNED); + qemu_unregister_coalesced_mmio(r->addr, r->size); } } + r->addr = new_addr; + if (r->addr != PCI_BAR_UNMAPPED) { + r->map_func(d, i, r->addr, r->size, r->type); + } } }