From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Anthony Liguori" <aliguori@us.ibm.com>,
"Eduardo Habkost" <ehabkost@redhat.com>,
"Isaku Yamahata" <yamahata@valinux.co.jp>,
"Alex Williamson" <alex.williamson@redhat.com>,
"Igor Mammedov" <imammedo@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
=?UTF-8?q?Andreas=20F=C3=A4rber?= <afaerber@suse.de>,
"David Gibson" <david@gibson.dropbear.id.au>
Subject: [Qemu-devel] [PULL v2 02/21] pci: store PCI hole ranges in guestinfo structure
Date: Tue, 25 Jun 2013 18:42:47 +0300 [thread overview]
Message-ID: <1372174719-6564-3-git-send-email-mst@redhat.com> (raw)
In-Reply-To: <1372174719-6564-1-git-send-email-mst@redhat.com>
Will be used to pass hole ranges to guests.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
hw/i386/pc.c | 46 +++++++++++++++++++++++++++++++++++++++++++++-
hw/i386/pc_piix.c | 14 +++++++++++++-
hw/i386/pc_q35.c | 6 +++++-
hw/pci-host/q35.c | 8 ++++++++
include/hw/i386/pc.h | 19 ++++++++++++++++++-
include/hw/pci-host/q35.h | 2 ++
include/qemu/typedefs.h | 1 +
7 files changed, 92 insertions(+), 4 deletions(-)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index e0fbb86..c685ee8 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -990,6 +990,48 @@ void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge)
}
}
+typedef struct PcGuestInfoState {
+ PcGuestInfo info;
+ Notifier machine_done;
+} PcGuestInfoState;
+
+static
+void pc_guest_info_machine_done(Notifier *notifier, void *data)
+{
+ PcGuestInfoState *guest_info_state = container_of(notifier,
+ PcGuestInfoState,
+ machine_done);
+}
+
+PcGuestInfo *pc_guest_info_init(ram_addr_t below_4g_mem_size,
+ ram_addr_t above_4g_mem_size)
+{
+ PcGuestInfoState *guest_info_state = g_malloc0(sizeof *guest_info_state);
+ PcGuestInfo *guest_info = &guest_info_state->info;
+
+ guest_info->pci_info.w32.end = IO_APIC_DEFAULT_ADDRESS;
+ if (sizeof(hwaddr) == 4) {
+ guest_info->pci_info.w64.begin = 0;
+ guest_info->pci_info.w64.end = 0;
+ } else {
+ /*
+ * BIOS does not set MTRR entries for the 64 bit window, so no need to
+ * align address to power of two. Align address at 1G, this makes sure
+ * it can be exactly covered with a PAT entry even when using huge
+ * pages.
+ */
+ guest_info->pci_info.w64.begin =
+ ROUND_UP((0x1ULL << 32) + above_4g_mem_size, 0x1ULL << 30);
+ guest_info->pci_info.w64.end = guest_info->pci_info.w64.begin +
+ (0x1ULL << 62);
+ assert(guest_info->pci_info.w64.begin <= guest_info->pci_info.w64.end);
+ }
+
+ guest_info_state->machine_done.notify = pc_guest_info_machine_done;
+ qemu_add_machine_init_done_notifier(&guest_info_state->machine_done);
+ return guest_info;
+}
+
void pc_acpi_init(const char *default_dsdt)
{
char *filename;
@@ -1031,7 +1073,8 @@ FWCfgState *pc_memory_init(MemoryRegion *system_memory,
ram_addr_t below_4g_mem_size,
ram_addr_t above_4g_mem_size,
MemoryRegion *rom_memory,
- MemoryRegion **ram_memory)
+ MemoryRegion **ram_memory,
+ PcGuestInfo *guest_info)
{
int linux_boot, i;
MemoryRegion *ram, *option_rom_mr;
@@ -1083,6 +1126,7 @@ FWCfgState *pc_memory_init(MemoryRegion *system_memory,
for (i = 0; i < nb_option_roms; i++) {
rom_add_option(option_rom[i].name, option_rom[i].bootindex);
}
+ guest_info->fw_cfg = fw_cfg;
return fw_cfg;
}
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 97362f2..a70a0d9 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -90,6 +90,7 @@ static void pc_init1(MemoryRegion *system_memory,
MemoryRegion *rom_memory;
DeviceState *icc_bridge;
FWCfgState *fw_cfg = NULL;
+ PcGuestInfo *guest_info;
icc_bridge = qdev_create(NULL, TYPE_ICC_BRIDGE);
object_property_add_child(qdev_get_machine(), "icc-bridge",
@@ -119,12 +120,23 @@ static void pc_init1(MemoryRegion *system_memory,
rom_memory = system_memory;
}
+ guest_info = pc_guest_info_init(below_4g_mem_size, above_4g_mem_size);
+
+ /* Set PCI window size the way seabios has always done it. */
+ /* Power of 2 so bios can cover it with a single MTRR */
+ if (ram_size <= 0x80000000)
+ guest_info->pci_info.w32.begin = 0x80000000;
+ else if (ram_size <= 0xc0000000)
+ guest_info->pci_info.w32.begin = 0xc0000000;
+ else
+ guest_info->pci_info.w32.begin = 0xe0000000;
+
/* 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);
+ rom_memory, &ram_memory, guest_info);
}
gsi_state = g_malloc0(sizeof(*gsi_state));
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index bb0ce6a..a13acf2 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -77,6 +77,7 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
ICH9LPCState *ich9_lpc;
PCIDevice *ahci;
DeviceState *icc_bridge;
+ PcGuestInfo *guest_info;
icc_bridge = qdev_create(NULL, TYPE_ICC_BRIDGE);
object_property_add_child(qdev_get_machine(), "icc-bridge",
@@ -105,11 +106,13 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
rom_memory = get_system_memory();
}
+ guest_info = pc_guest_info_init(below_4g_mem_size, above_4g_mem_size);
+
/* allocate ram and load rom/bios */
if (!xen_enabled()) {
pc_memory_init(get_system_memory(), kernel_filename, kernel_cmdline,
initrd_filename, below_4g_mem_size, above_4g_mem_size,
- rom_memory, &ram_memory);
+ rom_memory, &ram_memory, guest_info);
}
/* irq lines */
@@ -131,6 +134,7 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
q35_host->mch.address_space_io = get_system_io();
q35_host->mch.below_4g_mem_size = below_4g_mem_size;
q35_host->mch.above_4g_mem_size = above_4g_mem_size;
+ q35_host->mch.guest_info = guest_info;
/* pci */
qdev_init_nofail(DEVICE(q35_host));
host_bus = q35_host->host.pci.bus;
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index 24df6b5..3a5cff9 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -244,6 +244,14 @@ static int mch_init(PCIDevice *d)
hwaddr pci_hole64_size;
MCHPCIState *mch = MCH_PCI_DEVICE(d);
+ /* Leave enough space for the biggest MCFG BAR */
+ /* TODO: this matches current bios behaviour, but
+ * it's not a power of two, which means an MTRR
+ * can't cover it exactly.
+ */
+ mch->guest_info->pci_info.w32.begin = MCH_HOST_BRIDGE_PCIEXBAR_DEFAULT +
+ MCH_HOST_BRIDGE_PCIEXBAR_MAX;
+
/* setup pci memory regions */
memory_region_init_alias(&mch->pci_hole, "pci-hole",
mch->pci_address_space,
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 7f04967..6cb06fe 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -9,8 +9,20 @@
#include "net/net.h"
#include "hw/i386/ioapic.h"
+#include "qemu/range.h"
+
/* PC-style peripherals (also used by other machines). */
+typedef struct PcPciInfo {
+ Range w32;
+ Range w64;
+} PcPciInfo;
+
+struct PcGuestInfo {
+ PcPciInfo pci_info;
+ FWCfgState *fw_cfg;
+};
+
/* parallel.c */
static inline bool parallel_init(ISABus *bus, int index, CharDriverState *chr)
{
@@ -85,6 +97,10 @@ void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge);
void pc_hot_add_cpu(const int64_t id, Error **errp);
void pc_acpi_init(const char *default_dsdt);
+
+PcGuestInfo *pc_guest_info_init(ram_addr_t below_4g_mem_size,
+ ram_addr_t above_4g_mem_size);
+
FWCfgState *pc_memory_init(MemoryRegion *system_memory,
const char *kernel_filename,
const char *kernel_cmdline,
@@ -92,7 +108,8 @@ FWCfgState *pc_memory_init(MemoryRegion *system_memory,
ram_addr_t below_4g_mem_size,
ram_addr_t above_4g_mem_size,
MemoryRegion *rom_memory,
- MemoryRegion **ram_memory);
+ MemoryRegion **ram_memory,
+ PcGuestInfo *guest_info);
qemu_irq *pc_allocate_cpu_irq(void);
DeviceState *pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus);
void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
diff --git a/include/hw/pci-host/q35.h b/include/hw/pci-host/q35.h
index e182c82..b083831 100644
--- a/include/hw/pci-host/q35.h
+++ b/include/hw/pci-host/q35.h
@@ -55,6 +55,7 @@ typedef struct MCHPCIState {
uint8_t smm_enabled;
ram_addr_t below_4g_mem_size;
ram_addr_t above_4g_mem_size;
+ PcGuestInfo *guest_info;
} MCHPCIState;
typedef struct Q35PCIHost {
@@ -81,6 +82,7 @@ typedef struct Q35PCIHost {
#define MCH_HOST_BRIDGE_PCIEXBAR 0x60 /* 64bit register */
#define MCH_HOST_BRIDGE_PCIEXBAR_SIZE 8 /* 64bit register */
#define MCH_HOST_BRIDGE_PCIEXBAR_DEFAULT 0xb0000000
+#define MCH_HOST_BRIDGE_PCIEXBAR_MAX (0x10000000) /* 256M */
#define MCH_HOST_BRIDGE_PCIEXBAR_ADMSK Q35_MASK(64, 35, 28)
#define MCH_HOST_BRIDGE_PCIEXBAR_128ADMSK ((uint64_t)(1 << 26))
#define MCH_HOST_BRIDGE_PCIEXBAR_64ADMSK ((uint64_t)(1 << 25))
diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
index 698fc03..ac9f8d4 100644
--- a/include/qemu/typedefs.h
+++ b/include/qemu/typedefs.h
@@ -64,5 +64,6 @@ typedef struct VirtIODevice VirtIODevice;
typedef struct QEMUSGList QEMUSGList;
typedef struct SHPCDevice SHPCDevice;
typedef struct FWCfgState FWCfgState;
+typedef struct PcGuestInfo PcGuestInfo;
#endif /* QEMU_TYPEDEFS_H */
--
MST
next prev parent reply other threads:[~2013-06-25 15:42 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-25 15:40 [Qemu-devel] [PULL v2 00/21] pci,kvm,misc enhancements Michael S. Tsirkin
2013-06-25 15:40 ` [Qemu-devel] [PULL v2 01/21] range: add Range structure Michael S. Tsirkin
2013-06-25 15:40 ` [Qemu-devel] [PULL v2 03/21] pc: pass PCI hole ranges to Guests Michael S. Tsirkin
2013-06-25 15:40 ` [Qemu-devel] [PULL v2 04/21] pc_piix: cleanup init compat handling Michael S. Tsirkin
2013-06-25 15:40 ` [Qemu-devel] [PULL v2 05/21] e1000: cleanup process_tx_desc Michael S. Tsirkin
2013-06-25 15:41 ` [Qemu-devel] [PULL v2 06/21] kvm: zero-initialize KVM_SET_GSI_ROUTING input Michael S. Tsirkin
2013-06-25 15:41 ` [Qemu-devel] [PULL v2 07/21] kvm: skip system call when msi route is unchanged Michael S. Tsirkin
2013-06-25 15:41 ` [Qemu-devel] [PULL v2 08/21] MAINTAINERS: s/Marcelo/Paolo/ Michael S. Tsirkin
2013-06-25 15:41 ` [Qemu-devel] [PULL v2 09/21] pvpanic: initialization cleanup Michael S. Tsirkin
2013-06-25 15:41 ` [Qemu-devel] [PULL v2 10/21] pvpanic: fix fwcfg for big endian hosts Michael S. Tsirkin
2013-06-25 15:41 ` [Qemu-devel] [PULL v2 11/21] pci: Cleanup configuration for pci-hotplug.c Michael S. Tsirkin
2013-06-25 15:41 ` [Qemu-devel] [PULL v2 12/21] pci: Move pci_read_devaddr to pci-hotplug-old.c Michael S. Tsirkin
2013-06-25 15:41 ` [Qemu-devel] [PULL v2 13/21] pci: Abolish pci_find_root_bus() Michael S. Tsirkin
2013-06-25 15:41 ` [Qemu-devel] [PULL v2 14/21] pci: Use helper to find device's root bus in pci_find_domain() Michael S. Tsirkin
2013-06-25 15:41 ` [Qemu-devel] [PULL v2 15/21] pci: Replace pci_find_domain() with more general pci_root_bus_path() Michael S. Tsirkin
2013-06-25 15:41 ` [Qemu-devel] [PULL v2 16/21] pci: Add root bus argument to pci_get_bus_devfn() Michael S. Tsirkin
2013-06-25 15:41 ` [Qemu-devel] [PULL v2 17/21] pci: Add root bus parameter to pci_nic_init() Michael S. Tsirkin
2013-06-25 15:41 ` [Qemu-devel] [PULL v2 18/21] pci: Simpler implementation of primary PCI bus Michael S. Tsirkin
2013-06-25 15:41 ` [Qemu-devel] [PULL v2 19/21] pci: Remove domain from PCIHostBus Michael S. Tsirkin
2013-06-25 15:41 ` [Qemu-devel] [PULL v2 20/21] pci: Fold host_buses list into PCIHostState functionality Michael S. Tsirkin
2013-06-25 15:41 ` [Qemu-devel] [PULL v2 21/21] net: add support of mac-programming over macvtap in QEMU side Michael S. Tsirkin
2013-06-28 13:45 ` Eric Blake
2013-06-25 15:42 ` Michael S. Tsirkin [this message]
2013-06-25 21:48 ` [Qemu-devel] [PULL v2 00/21] pci,kvm,misc enhancements Anthony Liguori
2013-06-28 14:06 ` Eric Blake
2013-06-28 17:26 ` Markus Armbruster
2013-06-28 17:25 ` Markus Armbruster
2013-06-28 17:44 ` Anthony Liguori
2013-07-04 8:59 ` Michael S. Tsirkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1372174719-6564-3-git-send-email-mst@redhat.com \
--to=mst@redhat.com \
--cc=afaerber@suse.de \
--cc=alex.williamson@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=david@gibson.dropbear.id.au \
--cc=ehabkost@redhat.com \
--cc=imammedo@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=yamahata@valinux.co.jp \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).