0a122b
From 1cf1fcaf322e07354e830f2562db856ecbb1bf4c Mon Sep 17 00:00:00 2001
0a122b
Message-Id: <1cf1fcaf322e07354e830f2562db856ecbb1bf4c.1387298827.git.minovotn@redhat.com>
0a122b
In-Reply-To: <3ed0fb61a3dc912ef036d7ef450bed192090709e.1387298827.git.minovotn@redhat.com>
0a122b
References: <3ed0fb61a3dc912ef036d7ef450bed192090709e.1387298827.git.minovotn@redhat.com>
0a122b
From: "Michael S. Tsirkin" <mst@redhat.com>
0a122b
Date: Tue, 17 Dec 2013 15:17:45 +0100
0a122b
Subject: [PATCH 22/56] pc: fix regression for 64 bit PCI memory
0a122b
0a122b
RH-Author: Michael S. Tsirkin <mst@redhat.com>
0a122b
Message-id: <1387293161-4085-23-git-send-email-mst@redhat.com>
0a122b
Patchwork-id: 56328
0a122b
O-Subject: [PATCH qemu-kvm RHEL7.0 v2 22/57] pc: fix regression for 64 bit PCI memory
0a122b
Bugzilla: 1034876
0a122b
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
0a122b
RH-Acked-by: Marcel Apfelbaum <marcel.a@redhat.com>
0a122b
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
0a122b
0a122b
commit 398489018183d613306ab022653552247d93919f
0a122b
    pc: limit 64 bit hole to 2G by default
0a122b
introduced a way for management to control
0a122b
the window allocated to the 64 bit PCI hole.
0a122b
0a122b
This is useful, but existing management tools do not know how to set
0a122b
this property.  As a result, e.g. specifying a large ivshmem device with
0a122b
size > 4G is broken by default.  For example this configuration no
0a122b
longer works:
0a122b
0a122b
-device ivshmem,size=4294967296,chardev=cfoo
0a122b
-chardev socket,path=/tmp/sock,id=cfoo,server,nowait
0a122b
0a122b
Fix this by detecting that hole size was not specified
0a122b
and defaulting to the backwards-compatible value of 1 << 62.
0a122b
0a122b
Cc: qemu-stable@nongnu.org
0a122b
Cc: Igor Mammedov <imammedo@redhat.com>
0a122b
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
0a122b
(cherry picked from commit 1466cef32dd5e7ef3c6477e96d85d92302ad02e3)
0a122b
0a122b
Conflicts:
0a122b
	hw/pci-host/piix.c
0a122b
	hw/pci-host/q35.c
0a122b
---
0a122b
 include/hw/i386/pc.h | 11 ++++++++++-
0a122b
 hw/pci-host/piix.c   |  9 ++++++---
0a122b
 hw/pci-host/q35.c    |  8 +++++---
0a122b
 3 files changed, 21 insertions(+), 7 deletions(-)
0a122b
0a122b
Signed-off-by: Michal Novotny <minovotn@redhat.com>
0a122b
---
0a122b
 hw/pci-host/piix.c   |  9 ++++++---
0a122b
 hw/pci-host/q35.c    |  8 +++++---
0a122b
 include/hw/i386/pc.h | 11 ++++++++++-
0a122b
 3 files changed, 21 insertions(+), 7 deletions(-)
0a122b
0a122b
diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c
0a122b
index 0c26835..6502d1c 100644
0a122b
--- a/hw/pci-host/piix.c
0a122b
+++ b/hw/pci-host/piix.c
0a122b
@@ -319,6 +319,7 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state,
0a122b
     PCII440FXState *f;
0a122b
     unsigned i;
0a122b
     I440FXState *i440fx;
0a122b
+    uint64_t pci_hole64_size;
0a122b
 
0a122b
     dev = qdev_create(NULL, TYPE_I440FX_PCI_HOST_BRIDGE);
0a122b
     s = PCI_HOST_BRIDGE(dev);
0a122b
@@ -350,13 +351,15 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state,
0a122b
                              pci_hole_start, pci_hole_size);
0a122b
     memory_region_add_subregion(f->system_memory, pci_hole_start, &f->pci_hole);
0a122b
 
0a122b
+    pci_hole64_size = pci_host_get_hole64_size(i440fx->pci_hole64_size);
0a122b
+
0a122b
     pc_init_pci64_hole(&i440fx->pci_info, 0x100000000ULL + above_4g_mem_size,
0a122b
-                       i440fx->pci_hole64_size);
0a122b
+                       pci_hole64_size);
0a122b
     memory_region_init_alias(&f->pci_hole_64bit, "pci-hole64",
0a122b
                              f->pci_address_space,
0a122b
                              i440fx->pci_info.w64.begin,
0a122b
-                             i440fx->pci_hole64_size);
0a122b
-    if (i440fx->pci_hole64_size) {
0a122b
+                             pci_hole64_size);
0a122b
+    if (pci_hole64_size) {
0a122b
         memory_region_add_subregion(f->system_memory,
0a122b
                                     i440fx->pci_info.w64.begin,
0a122b
                                     &f->pci_hole_64bit);
0a122b
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
0a122b
index 943e55f..05779b8 100644
0a122b
--- a/hw/pci-host/q35.c
0a122b
+++ b/hw/pci-host/q35.c
0a122b
@@ -325,6 +325,7 @@ static int mch_init(PCIDevice *d)
0a122b
 {
0a122b
     int i;
0a122b
     MCHPCIState *mch = MCH_PCI_DEVICE(d);
0a122b
+    uint64_t pci_hole64_size;
0a122b
 
0a122b
     /* setup pci memory regions */
0a122b
     memory_region_init_alias(&mch->pci_hole, "pci-hole",
0a122b
@@ -334,13 +335,14 @@ static int mch_init(PCIDevice *d)
0a122b
     memory_region_add_subregion(mch->system_memory, mch->below_4g_mem_size,
0a122b
                                 &mch->pci_hole);
0a122b
 
0a122b
+    pci_hole64_size = pci_host_get_hole64_size(mch->pci_hole64_size);
0a122b
     pc_init_pci64_hole(&mch->pci_info, 0x100000000ULL + mch->above_4g_mem_size,
0a122b
-                       mch->pci_hole64_size);
0a122b
+                       pci_hole64_size);
0a122b
     memory_region_init_alias(&mch->pci_hole_64bit, "pci-hole64",
0a122b
                              mch->pci_address_space,
0a122b
                              mch->pci_info.w64.begin,
0a122b
-                             mch->pci_hole64_size);
0a122b
-    if (mch->pci_hole64_size) {
0a122b
+                             pci_hole64_size);
0a122b
+    if (pci_hole64_size) {
0a122b
         memory_region_add_subregion(mch->system_memory,
0a122b
                                     mch->pci_info.w64.begin,
0a122b
                                     &mch->pci_hole_64bit);
0a122b
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
0a122b
index fe21bc3..abaaf93 100644
0a122b
--- a/include/hw/i386/pc.h
0a122b
+++ b/include/hw/i386/pc.h
0a122b
@@ -105,7 +105,16 @@ PcGuestInfo *pc_guest_info_init(ram_addr_t below_4g_mem_size,
0a122b
 #define PCI_HOST_PROP_PCI_HOLE64_START "pci-hole64-start"
0a122b
 #define PCI_HOST_PROP_PCI_HOLE64_END   "pci-hole64-end"
0a122b
 #define PCI_HOST_PROP_PCI_HOLE64_SIZE  "pci-hole64-size"
0a122b
-#define DEFAULT_PCI_HOLE64_SIZE (1ULL << 31)
0a122b
+#define DEFAULT_PCI_HOLE64_SIZE (~0x0ULL)
0a122b
+
0a122b
+static inline uint64_t pci_host_get_hole64_size(uint64_t pci_hole64_size)
0a122b
+{
0a122b
+    if (pci_hole64_size == DEFAULT_PCI_HOLE64_SIZE) {
0a122b
+        return 1ULL << 62;
0a122b
+    } else {
0a122b
+        return pci_hole64_size;
0a122b
+    }
0a122b
+}
0a122b
 
0a122b
 void pc_init_pci64_hole(PcPciInfo *pci_info, uint64_t pci_hole64_start,
0a122b
                         uint64_t pci_hole64_size);
0a122b
-- 
0a122b
1.7.11.7
0a122b