|
|
9ae3a8 |
From 364834e660cd4143e69126b2fb9a640c3ee9b9c1 Mon Sep 17 00:00:00 2001
|
|
|
9ae3a8 |
Message-Id: <364834e660cd4143e69126b2fb9a640c3ee9b9c1.1387298827.git.minovotn@redhat.com>
|
|
|
9ae3a8 |
In-Reply-To: <3ed0fb61a3dc912ef036d7ef450bed192090709e.1387298827.git.minovotn@redhat.com>
|
|
|
9ae3a8 |
References: <3ed0fb61a3dc912ef036d7ef450bed192090709e.1387298827.git.minovotn@redhat.com>
|
|
|
9ae3a8 |
From: "Michael S. Tsirkin" <mst@redhat.com>
|
|
|
9ae3a8 |
Date: Tue, 17 Dec 2013 15:18:49 +0100
|
|
|
9ae3a8 |
Subject: [PATCH 41/56] piix: APIs for pc guest info
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
RH-Author: Michael S. Tsirkin <mst@redhat.com>
|
|
|
9ae3a8 |
Message-id: <1387293161-4085-42-git-send-email-mst@redhat.com>
|
|
|
9ae3a8 |
Patchwork-id: 56347
|
|
|
9ae3a8 |
O-Subject: [PATCH qemu-kvm RHEL7.0 v2 41/57] piix: APIs for pc guest info
|
|
|
9ae3a8 |
Bugzilla: 1034876
|
|
|
9ae3a8 |
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
|
|
|
9ae3a8 |
RH-Acked-by: Marcel Apfelbaum <marcel.a@redhat.com>
|
|
|
9ae3a8 |
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
This adds APIs that will be used to fill in guest acpi tables.
|
|
|
9ae3a8 |
Some required information is still lacking in QOM, so we
|
|
|
9ae3a8 |
fall back on lookups by type and returning explicit types.
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
|
|
|
9ae3a8 |
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
|
|
|
9ae3a8 |
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
|
|
|
9ae3a8 |
Tested-by: Igor Mammedov <imammedo@redhat.com>
|
|
|
9ae3a8 |
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
|
|
9ae3a8 |
(cherry picked from commit 277e9340e6a1b0a0e8e988d2f0ac82b18b695c0b)
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Conflicts:
|
|
|
9ae3a8 |
hw/acpi/piix4.c
|
|
|
9ae3a8 |
---
|
|
|
9ae3a8 |
include/hw/acpi/piix4.h | 8 ++++++++
|
|
|
9ae3a8 |
include/hw/i386/pc.h | 1 +
|
|
|
9ae3a8 |
hw/acpi/piix4.c | 45 ++++++++++++++++++++++++++++++++++++++++-----
|
|
|
9ae3a8 |
hw/pci-host/piix.c | 8 ++++++++
|
|
|
9ae3a8 |
4 files changed, 57 insertions(+), 5 deletions(-)
|
|
|
9ae3a8 |
create mode 100644 include/hw/acpi/piix4.h
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Signed-off-by: Michal Novotny <minovotn@redhat.com>
|
|
|
9ae3a8 |
---
|
|
|
9ae3a8 |
hw/acpi/piix4.c | 45 ++++++++++++++++++++++++++++++++++++++++-----
|
|
|
9ae3a8 |
hw/pci-host/piix.c | 8 ++++++++
|
|
|
9ae3a8 |
include/hw/acpi/piix4.h | 8 ++++++++
|
|
|
9ae3a8 |
include/hw/i386/pc.h | 1 +
|
|
|
9ae3a8 |
4 files changed, 57 insertions(+), 5 deletions(-)
|
|
|
9ae3a8 |
create mode 100644 include/hw/acpi/piix4.h
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
|
|
|
9ae3a8 |
index 18b1300..6ebabe6 100644
|
|
|
9ae3a8 |
--- a/hw/acpi/piix4.c
|
|
|
9ae3a8 |
+++ b/hw/acpi/piix4.c
|
|
|
9ae3a8 |
@@ -29,6 +29,7 @@
|
|
|
9ae3a8 |
#include "exec/ioport.h"
|
|
|
9ae3a8 |
#include "hw/nvram/fw_cfg.h"
|
|
|
9ae3a8 |
#include "exec/address-spaces.h"
|
|
|
9ae3a8 |
+#include "hw/acpi/piix4.h"
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
//#define DEBUG
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
@@ -67,6 +68,8 @@ typedef struct PIIX4PMState {
|
|
|
9ae3a8 |
PCIDevice dev;
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
MemoryRegion io;
|
|
|
9ae3a8 |
+ uint32_t io_base;
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
MemoryRegion io_gpe;
|
|
|
9ae3a8 |
MemoryRegion io_pci;
|
|
|
9ae3a8 |
MemoryRegion io_cpu;
|
|
|
9ae3a8 |
@@ -143,14 +146,12 @@ static void apm_ctrl_changed(uint32_t val, void *arg)
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
static void pm_io_space_update(PIIX4PMState *s)
|
|
|
9ae3a8 |
{
|
|
|
9ae3a8 |
- uint32_t pm_io_base;
|
|
|
9ae3a8 |
-
|
|
|
9ae3a8 |
- pm_io_base = le32_to_cpu(*(uint32_t *)(s->dev.config + 0x40));
|
|
|
9ae3a8 |
- pm_io_base &= 0xffc0;
|
|
|
9ae3a8 |
+ s->io_base = le32_to_cpu(*(uint32_t *)(s->dev.config + 0x40));
|
|
|
9ae3a8 |
+ s->io_base &= 0xffc0;
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
memory_region_transaction_begin();
|
|
|
9ae3a8 |
memory_region_set_enabled(&s->io, s->dev.config[0x80] & 1);
|
|
|
9ae3a8 |
- memory_region_set_address(&s->io, pm_io_base);
|
|
|
9ae3a8 |
+ memory_region_set_address(&s->io, s->io_base);
|
|
|
9ae3a8 |
memory_region_transaction_commit();
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
@@ -393,6 +394,28 @@ static void piix4_pm_machine_ready(Notifier *n, void *opaque)
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
+static void piix4_pm_add_propeties(PIIX4PMState *s)
|
|
|
9ae3a8 |
+{
|
|
|
9ae3a8 |
+ static const uint8_t acpi_enable_cmd = ACPI_ENABLE;
|
|
|
9ae3a8 |
+ static const uint8_t acpi_disable_cmd = ACPI_DISABLE;
|
|
|
9ae3a8 |
+ static const uint32_t gpe0_blk = GPE_BASE;
|
|
|
9ae3a8 |
+ static const uint32_t gpe0_blk_len = GPE_LEN;
|
|
|
9ae3a8 |
+ static const uint16_t sci_int = 9;
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
+ object_property_add_uint8_ptr(OBJECT(s), ACPI_PM_PROP_ACPI_ENABLE_CMD,
|
|
|
9ae3a8 |
+ &acpi_enable_cmd, NULL);
|
|
|
9ae3a8 |
+ object_property_add_uint8_ptr(OBJECT(s), ACPI_PM_PROP_ACPI_DISABLE_CMD,
|
|
|
9ae3a8 |
+ &acpi_disable_cmd, NULL);
|
|
|
9ae3a8 |
+ object_property_add_uint32_ptr(OBJECT(s), ACPI_PM_PROP_GPE0_BLK,
|
|
|
9ae3a8 |
+ &gpe0_blk, NULL);
|
|
|
9ae3a8 |
+ object_property_add_uint32_ptr(OBJECT(s), ACPI_PM_PROP_GPE0_BLK_LEN,
|
|
|
9ae3a8 |
+ &gpe0_blk_len, NULL);
|
|
|
9ae3a8 |
+ object_property_add_uint16_ptr(OBJECT(s), ACPI_PM_PROP_SCI_INT,
|
|
|
9ae3a8 |
+ &sci_int, NULL);
|
|
|
9ae3a8 |
+ object_property_add_uint32_ptr(OBJECT(s), ACPI_PM_PROP_PM_IO_BASE,
|
|
|
9ae3a8 |
+ &s->io_base, NULL);
|
|
|
9ae3a8 |
+}
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
static int piix4_pm_initfn(PCIDevice *dev)
|
|
|
9ae3a8 |
{
|
|
|
9ae3a8 |
PIIX4PMState *s = DO_UPCAST(PIIX4PMState, dev, dev);
|
|
|
9ae3a8 |
@@ -442,9 +465,21 @@ static int piix4_pm_initfn(PCIDevice *dev)
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
piix4_acpi_system_hot_add_init(pci_address_space_io(dev), dev->bus, s);
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
+ piix4_pm_add_propeties(s);
|
|
|
9ae3a8 |
return 0;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
+Object *piix4_pm_find(void)
|
|
|
9ae3a8 |
+{
|
|
|
9ae3a8 |
+ bool ambig;
|
|
|
9ae3a8 |
+ Object *o = object_resolve_path_type("", "PIIX4_PM", &ambig);
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
+ if (ambig || !o) {
|
|
|
9ae3a8 |
+ return NULL;
|
|
|
9ae3a8 |
+ }
|
|
|
9ae3a8 |
+ return o;
|
|
|
9ae3a8 |
+}
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
|
|
|
9ae3a8 |
qemu_irq sci_irq, qemu_irq smi_irq,
|
|
|
9ae3a8 |
int kvm_enabled, FWCfgState *fw_cfg)
|
|
|
9ae3a8 |
diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c
|
|
|
9ae3a8 |
index 6502d1c..9284c8d 100644
|
|
|
9ae3a8 |
--- a/hw/pci-host/piix.c
|
|
|
9ae3a8 |
+++ b/hw/pci-host/piix.c
|
|
|
9ae3a8 |
@@ -408,6 +408,14 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state,
|
|
|
9ae3a8 |
return b;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
+PCIBus *find_i440fx(void)
|
|
|
9ae3a8 |
+{
|
|
|
9ae3a8 |
+ PCIHostState *s = OBJECT_CHECK(PCIHostState,
|
|
|
9ae3a8 |
+ object_resolve_path("/machine/i440fx", NULL),
|
|
|
9ae3a8 |
+ TYPE_PCI_HOST_BRIDGE);
|
|
|
9ae3a8 |
+ return s ? s->bus : NULL;
|
|
|
9ae3a8 |
+}
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
/* PIIX3 PCI to ISA bridge */
|
|
|
9ae3a8 |
static void piix3_set_irq_pic(PIIX3State *piix3, int pic_irq)
|
|
|
9ae3a8 |
{
|
|
|
9ae3a8 |
diff --git a/include/hw/acpi/piix4.h b/include/hw/acpi/piix4.h
|
|
|
9ae3a8 |
new file mode 100644
|
|
|
9ae3a8 |
index 0000000..65e6fd7
|
|
|
9ae3a8 |
--- /dev/null
|
|
|
9ae3a8 |
+++ b/include/hw/acpi/piix4.h
|
|
|
9ae3a8 |
@@ -0,0 +1,8 @@
|
|
|
9ae3a8 |
+#ifndef HW_ACPI_PIIX4_H
|
|
|
9ae3a8 |
+#define HW_ACPI_PIIX4_H
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
+#include "qemu/typedefs.h"
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
+Object *piix4_pm_find(void);
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
+#endif
|
|
|
9ae3a8 |
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
|
|
|
9ae3a8 |
index 5011c87..d78e45b 100644
|
|
|
9ae3a8 |
--- a/include/hw/i386/pc.h
|
|
|
9ae3a8 |
+++ b/include/hw/i386/pc.h
|
|
|
9ae3a8 |
@@ -191,6 +191,7 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix_devfn,
|
|
|
9ae3a8 |
MemoryRegion *pci_memory,
|
|
|
9ae3a8 |
MemoryRegion *ram_memory);
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
+PCIBus *find_i440fx(void);
|
|
|
9ae3a8 |
/* piix4.c */
|
|
|
9ae3a8 |
extern PCIDevice *piix4_dev;
|
|
|
9ae3a8 |
int piix4_init(PCIBus *bus, ISABus **isa_bus, int devfn);
|
|
|
9ae3a8 |
--
|
|
|
9ae3a8 |
1.7.11.7
|
|
|
9ae3a8 |
|