From patchwork Thu Jul 22 22:01:37 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Blue Swirl X-Patchwork-Id: 59658 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 EDB0F100DA7 for ; Fri, 23 Jul 2010 08:16:16 +1000 (EST) Received: from localhost ([127.0.0.1]:51305 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Oc43i-0006mO-QU for incoming@patchwork.ozlabs.org; Thu, 22 Jul 2010 18:16:06 -0400 Received: from [140.186.70.92] (port=42713 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Oc3wn-00031d-IL for qemu-devel@nongnu.org; Thu, 22 Jul 2010 18:08:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1Oc3q2-0003Ih-HO for qemu-devel@nongnu.org; Thu, 22 Jul 2010 18:01:59 -0400 Received: from mail-qw0-f45.google.com ([209.85.216.45]:60998) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Oc3q2-0003Ic-EM for qemu-devel@nongnu.org; Thu, 22 Jul 2010 18:01:58 -0400 Received: by qwf6 with SMTP id 6so3334892qwf.4 for ; Thu, 22 Jul 2010 15:01:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:mime-version:received:from:date :message-id:subject:to:content-type; bh=HpQyU5eheV3u60qH8u5yWCib6IH5979Bm3kLEVMfDpU=; b=OfXVKUFt7Nrd6kIqvzNuuU4JcZFkBFtSSfvoimtnHhDZxbiAWFbb+8IU+yxse8pYCW OPT5q2XL0VWzxXMAtmp8S0rDChkhiAv6qfRklzRci1XJrm7xG/XKZq0R1Z1MecXuApPR ScG0ITqdm99c0LmFSncETMGWuTzp2A6DcrxL0= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:from:date:message-id:subject:to:content-type; b=DkjyV4GjqKchA/qMNi+lDb79Uii7s75N2KPszAtcHtk1BQ+d+u0QtzQKS0zyk5QbtK pjVJ7oOObYmQoSZfsNSZoFqcaJgxfFDbCRSttkCDrslgxhy2kSa/HIovSHxDFPVpI8ch ilUD96SzncfMdxkscbCrJ8JMzjV+Vm4FBDkb4= Received: by 10.224.29.11 with SMTP id o11mr1339095qac.184.1279836117826; Thu, 22 Jul 2010 15:01:57 -0700 (PDT) MIME-Version: 1.0 Received: by 10.229.185.146 with HTTP; Thu, 22 Jul 2010 15:01:37 -0700 (PDT) From: Blue Swirl Date: Thu, 22 Jul 2010 22:01:37 +0000 Message-ID: To: qemu-devel X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) Subject: [Qemu-devel] [PATCH 26/34] pci: add registration for MMIO manipulation functions 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 Add registration functions to manipulate MMIO mappings. Signed-off-by: Blue Swirl --- hw/pci.c | 49 +++++++++++++++++++++++++++++++++++++------------ hw/pci.h | 7 +++++++ 2 files changed, 44 insertions(+), 12 deletions(-) PCIDevice *pci_nic_init_nofail(NICInfo *nd, const char *default_model, diff --git a/hw/pci.c b/hw/pci.c index 1b20c44..3555ef3 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -47,6 +47,9 @@ struct PCIBus { PCIDevice *devices[256]; PCIDevice *parent_dev; target_phys_addr_t mem_base; + pci_register_mem_fn register_mem; + pci_unregister_mem_fn unregister_mem; + void *register_mem_opaque; QLIST_HEAD(, PCIBus) child; /* this will be replaced by qdev later */ QLIST_ENTRY(PCIBus) sibling;/* this will be replaced by qdev later */ @@ -177,6 +180,18 @@ static void pci_device_reset(PCIDevice *dev) pci_update_mappings(dev); } +static void pci_bus_default_register_mem(void *opaque, pcibus_t addr, + pcibus_t size, int mm) +{ + cpu_register_physical_memory(addr, size, mm); +} + +static void pci_bus_default_unregister_mem(void *opaque, pcibus_t addr, + pcibus_t size) +{ + cpu_register_physical_memory(addr, size, IO_MEM_UNASSIGNED); +} + static void pci_bus_reset(void *opaque) { PCIBus *bus = opaque; @@ -240,6 +255,8 @@ void pci_bus_new_inplace(PCIBus *bus, DeviceState *parent, qbus_create_inplace(&bus->qbus, &pci_bus_info, parent, name); assert(PCI_FUNC(devfn_min) == 0); bus->devfn_min = devfn_min; + bus->register_mem = pci_bus_default_register_mem; + bus->unregister_mem = pci_bus_default_unregister_mem; /* host bridge */ QLIST_INIT(&bus->child); @@ -761,10 +778,10 @@ static void pci_unregister_io_regions(PCIDevice *pci_dev) if (r->type == PCI_BASE_ADDRESS_SPACE_IO) { isa_unassign_ioport(r->addr + s->offset, s->filtered_size); } else { - cpu_register_physical_memory(pci_to_cpu_addr(pci_dev->bus, - r->addr + s->offset), - s->filtered_size, - IO_MEM_UNASSIGNED); + pci_dev->bus->unregister_mem(pci_dev->bus->register_mem_opaque, + pci_to_cpu_addr(pci_dev->bus, + r->addr + s->offset), + s->filtered_size); } } } @@ -1015,6 +1032,14 @@ static pcibus_t pci_bar_address(PCIDevice *d, return new_addr; } +void pci_bus_set_register_mem_fn(PCIBus *bus, pci_register_mem_fn regfn, + pci_unregister_mem_fn unregfn, void *opaque) +{ + bus->register_mem = regfn; + bus->unregister_mem = unregfn; + bus->register_mem_opaque = opaque; +} + static void pci_update_mappings(PCIDevice *d) { PCIIORegion *r; @@ -1066,11 +1091,11 @@ static void pci_update_mappings(PCIDevice *d) s->filtered_size); } } else { - cpu_register_physical_memory(pci_to_cpu_addr(d->bus, - r->addr + - s->offset), - s->filtered_size, - IO_MEM_UNASSIGNED); + d->bus->unregister_mem(d->bus->register_mem_opaque, + pci_to_cpu_addr(d->bus, + r->addr + + s->offset), + s->filtered_size); qemu_unregister_coalesced_mmio(r->addr + s->offset, s->filtered_size); } @@ -1092,9 +1117,9 @@ static void pci_update_mappings(PCIDevice *d) r->type); } } else { - cpu_register_physical_memory(pci_to_cpu_addr(d->bus, - new_addr), - s->filtered_size, s->ix); + d->bus->register_mem(d->bus->register_mem_opaque, + pci_to_cpu_addr(d->bus, new_addr), + s->filtered_size, s->ix); if (r->post_map_func) { r->post_map_func(d, i, pci_to_cpu_addr(d->bus, new_addr), diff --git a/hw/pci.h b/hw/pci.h index ac1836e..8c2b84c 100644 --- a/hw/pci.h +++ b/hw/pci.h @@ -228,6 +228,13 @@ PCIBus *pci_register_bus(DeviceState *parent, const char *name, void pci_bus_set_mem_base(PCIBus *bus, target_phys_addr_t base); +typedef void (*pci_register_mem_fn)(void *opaque, pcibus_t addr, pcibus_t size, + int mm); +typedef void (*pci_unregister_mem_fn)(void *opaque, pcibus_t addr, + pcibus_t size); +void pci_bus_set_register_mem_fn(PCIBus *bus, pci_register_mem_fn regfn, + pci_unregister_mem_fn unregfn, void *opaque); + PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model, const char *default_devaddr);