From patchwork Thu Jun 20 10:15:06 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hu Tao X-Patchwork-Id: 252873 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 27AB32C0096 for ; Thu, 20 Jun 2013 20:52:19 +1000 (EST) Received: from localhost ([::1]:44138 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Upc0v-0007il-MW for incoming@patchwork.ozlabs.org; Thu, 20 Jun 2013 06:22:49 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48603) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Upbva-0007IJ-OA for qemu-devel@nongnu.org; Thu, 20 Jun 2013 06:17:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UpbvX-0000hy-Hb for qemu-devel@nongnu.org; Thu, 20 Jun 2013 06:17:18 -0400 Received: from [222.73.24.84] (port=19949 helo=song.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UpbvW-0000fd-Ml for qemu-devel@nongnu.org; Thu, 20 Jun 2013 06:17:15 -0400 X-IronPort-AV: E=Sophos;i="4.87,903,1363104000"; d="scan'208";a="7614697" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 20 Jun 2013 18:13:10 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id r5KAG4O0006751 for ; Thu, 20 Jun 2013 18:16:04 +0800 Received: from G08FNSTD100614.fnst.cn.fujitsu.com ([10.167.233.156]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2013062018145864-2329251 ; Thu, 20 Jun 2013 18:14:58 +0800 From: Hu Tao To: qemu-devel@nongnu.org Date: Thu, 20 Jun 2013 18:15:06 +0800 Message-Id: <190372cb349a469ef03786585a341c5613ea8965.1371721792.git.hutao@cn.fujitsu.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: References: X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/06/20 18:14:58, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/06/20 18:14:59, Serialize complete at 2013/06/20 18:14:59 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 222.73.24.84 Subject: [Qemu-devel] [PATCH RFC 07/15] i440fx-pmc: create pci address space X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Hu Tao --- hw/i386/pc_piix.c | 33 +++++++++++++++------------------ hw/pci-host/piix.c | 16 +++++++++------- include/hw/i386/pc.h | 2 +- 3 files changed, 25 insertions(+), 26 deletions(-) diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c index 3934754..1ca705c 100644 --- a/hw/i386/pc_piix.c +++ b/hw/i386/pc_piix.c @@ -109,23 +109,6 @@ static void pc_init1(MemoryRegion *system_memory, below_4g_mem_size = ram_size; } - if (pci_enabled) { - pci_memory = g_new(MemoryRegion, 1); - memory_region_init(pci_memory, "pci", INT64_MAX); - rom_memory = pci_memory; - } else { - pci_memory = NULL; - rom_memory = system_memory; - } - - /* allocate ram and load rom/bios */ - if (!xen_enabled()) { - fw_cfg = pc_memory_init(system_memory, - kernel_filename, kernel_cmdline, initrd_filename, - below_4g_mem_size, above_4g_mem_size, - rom_memory, &ram_memory); - } - gsi_state = g_malloc0(sizeof(*gsi_state)); if (kvm_irqchip_in_kernel()) { kvm_pc_setup_irq_routing(pci_enabled); @@ -138,7 +121,7 @@ static void pc_init1(MemoryRegion *system_memory, if (pci_enabled) { pci_bus = i440fx_init(&piix3_devfn, &isa_bus, gsi, system_memory, system_io, ram_size, - pci_memory, ram_memory); + &pci_memory, ram_memory); } else { pci_bus = NULL; isa_bus = isa_bus_new(NULL, system_io); @@ -146,6 +129,20 @@ static void pc_init1(MemoryRegion *system_memory, } isa_bus_irqs(isa_bus, gsi); + if (pci_enabled) { + rom_memory = pci_memory; + } else { + rom_memory = system_memory; + } + + /* allocate ram and load rom/bios */ + if (!xen_enabled()) { + fw_cfg = pc_memory_init(system_memory, + kernel_filename, kernel_cmdline, initrd_filename, + below_4g_mem_size, above_4g_mem_size, + rom_memory, &ram_memory); + } + if (kvm_irqchip_in_kernel()) { i8259 = kvm_i8259_init(isa_bus); } else if (xen_enabled()) { diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c index 7b58d56..604a66e 100644 --- a/hw/pci-host/piix.c +++ b/hw/pci-host/piix.c @@ -105,7 +105,7 @@ struct I440FXPMCState { typedef struct I440FXState { PCIHostState parent_obj; MemoryRegion *address_space_io; - MemoryRegion *pci_address_space; + MemoryRegion pci_address_space; PIIX3State piix3; I440FXPMCState pmc; @@ -214,7 +214,7 @@ static int i440fx_realize(SysBusDevice *dev) PCIHostState *s = PCI_HOST_BRIDGE(dev); I440FXState *f = I440FX_DEVICE(dev); - s->bus = pci_bus_new(DEVICE(f), NULL, f->pci_address_space, + s->bus = pci_bus_new(DEVICE(f), NULL, &f->pci_address_space, f->address_space_io, 0, TYPE_PCI_BUS); memory_region_init_io(&s->conf_mem, &pci_host_conf_le_ops, s, @@ -227,6 +227,8 @@ static int i440fx_realize(SysBusDevice *dev) sysbus_add_io(dev, 0xcfc, &s->data_mem); sysbus_init_ioports(&s->busdev, 0xcfc, 4); + f->pmc.pci_address_space = &f->pci_address_space; + qdev_set_parent_bus(DEVICE(&f->pmc), BUS(s->bus)); qdev_init_nofail(DEVICE(&f->pmc)); @@ -240,6 +242,8 @@ static void i440fx_initfn(Object *obj) object_initialize(&f->pmc, TYPE_I440FX_PMC_DEVICE); object_property_add_child(obj, "pmc", OBJECT(&f->pmc), NULL); qdev_prop_set_uint32(DEVICE(&f->pmc), "addr", PCI_DEVFN(0, 0)); + + memory_region_init(&f->pci_address_space, "pci", INT64_MAX); } static int i440fx_pmc_initfn(PCIDevice *dev) @@ -251,7 +255,6 @@ static int i440fx_pmc_initfn(PCIDevice *dev) int i; g_assert(d->system_memory != NULL); - g_assert(d->pci_address_space != NULL); g_assert(d->ram_memory != NULL); if(d->ram_size > I440FX_PMC_PCI_HOLE) { @@ -313,7 +316,7 @@ static PCIBus *i440fx_common_init(const char *device_name, MemoryRegion *address_space_mem, MemoryRegion *address_space_io, ram_addr_t ram_size, - MemoryRegion *pci_address_space, + MemoryRegion **pci_address_space, MemoryRegion *ram_memory) { PCIHostState *s; @@ -325,12 +328,10 @@ static PCIBus *i440fx_common_init(const char *device_name, s = PCI_HOST_BRIDGE(i440fx); i440fx->address_space_io = address_space_io; - i440fx->pci_address_space = pci_address_space; f = &i440fx->pmc; f->ram_size = ram_size; f->system_memory = address_space_mem; - f->pci_address_space = pci_address_space; f->ram_memory = ram_memory; object_property_add_child(qdev_get_machine(), "i440fx", @@ -358,6 +359,7 @@ static PCIBus *i440fx_common_init(const char *device_name, *isa_bus = ISA_BUS(qdev_get_child_bus(DEVICE(piix3), "isa.0")); *piix3_devfn = piix3->dev.devfn; + *pci_address_space = &i440fx->pci_address_space; return s->bus; } @@ -367,7 +369,7 @@ PCIBus *i440fx_init(int *piix3_devfn, MemoryRegion *address_space_mem, MemoryRegion *address_space_io, ram_addr_t ram_size, - MemoryRegion *pci_memory, MemoryRegion *ram_memory) + MemoryRegion **pci_memory, MemoryRegion *ram_memory) { PCIBus *b; diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index 4c1027e..fa14c49 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -131,7 +131,7 @@ PCIBus *i440fx_init(int *piix_devfn, MemoryRegion *address_space_mem, MemoryRegion *address_space_io, ram_addr_t ram_size, - MemoryRegion *pci_memory, + MemoryRegion **pci_memory, MemoryRegion *ram_memory); /* piix4.c */