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