* [Qemu-devel] [PATCH v2 0/5] Add IPMI firmware tables
@ 2016-05-11 16:38 minyard
2016-05-11 16:38 ` [Qemu-devel] [PATCH v2 1/5] pc: Postpone SMBIOS table installation to post machine init minyard
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: minyard @ 2016-05-11 16:38 UTC (permalink / raw)
To: Igor Mammedov, Michael S . Tsirkin, Paolo Bonzini, qemu-devel,
minyard
Now that 2.6 is out, re-post these patches. No changes since the
previous release.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v2 1/5] pc: Postpone SMBIOS table installation to post machine init
2016-05-11 16:38 [Qemu-devel] [PATCH v2 0/5] Add IPMI firmware tables minyard
@ 2016-05-11 16:38 ` minyard
2016-05-11 16:38 ` [Qemu-devel] [PATCH v2 2/5] smbios: Move table build tools into an include file minyard
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: minyard @ 2016-05-11 16:38 UTC (permalink / raw)
To: Igor Mammedov, Michael S . Tsirkin, Paolo Bonzini, qemu-devel,
minyard
Cc: Corey Minyard
From: Corey Minyard <cminyard@mvista.com>
This is the same place that the ACPI SSDT table gets added, so that
devices can add themselves to the SMBIOS table.
Signed-off-by: Corey Minyard <cminyard@mvista.com>
---
hw/i386/pc.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 99437e0..5e78ef4 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -764,8 +764,6 @@ static FWCfgState *bochs_bios_init(AddressSpace *as, PCMachineState *pcms)
acpi_tables, acpi_tables_len);
fw_cfg_add_i32(fw_cfg, FW_CFG_IRQ0_OVERRIDE, kvm_allows_irq0_override());
- pc_build_smbios(fw_cfg);
-
fw_cfg_add_bytes(fw_cfg, FW_CFG_E820_TABLE,
&e820_reserve, sizeof(e820_reserve));
fw_cfg_add_file(fw_cfg, "etc/e820", e820_table,
@@ -1161,6 +1159,7 @@ void pc_machine_done(Notifier *notifier, void *data)
{
PCMachineState *pcms = container_of(notifier,
PCMachineState, machine_done);
+ FWCfgState *fw_cfg = pcms->fw_cfg;
PCIBus *bus = pcms->bus;
if (bus) {
@@ -1172,15 +1171,17 @@ void pc_machine_done(Notifier *notifier, void *data)
extra_hosts++;
}
}
- if (extra_hosts && pcms->fw_cfg) {
+ if (extra_hosts && fw_cfg) {
uint64_t *val = g_malloc(sizeof(*val));
*val = cpu_to_le64(extra_hosts);
- fw_cfg_add_file(pcms->fw_cfg,
- "etc/extra-pci-roots", val, sizeof(*val));
+ fw_cfg_add_file(fw_cfg, "etc/extra-pci-roots", val, sizeof(*val));
}
}
acpi_setup();
+ if (fw_cfg) {
+ pc_build_smbios(fw_cfg);
+ }
}
void pc_guest_info_init(PCMachineState *pcms)
--
2.7.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v2 2/5] smbios: Move table build tools into an include file.
2016-05-11 16:38 [Qemu-devel] [PATCH v2 0/5] Add IPMI firmware tables minyard
2016-05-11 16:38 ` [Qemu-devel] [PATCH v2 1/5] pc: Postpone SMBIOS table installation to post machine init minyard
@ 2016-05-11 16:38 ` minyard
2016-05-11 16:38 ` [Qemu-devel] [PATCH v2 3/5] ipmi: Add SMBIOS table entry minyard
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: minyard @ 2016-05-11 16:38 UTC (permalink / raw)
To: Igor Mammedov, Michael S . Tsirkin, Paolo Bonzini, qemu-devel,
minyard
Cc: Corey Minyard
From: Corey Minyard <cminyard@mvista.com>
This will let things in other files (like IPMI) build SMBIOS tables.
Signed-off-by: Corey Minyard <cminyard@mvista.com>
---
hw/smbios/smbios.c | 70 ++++---------------------------------------
hw/smbios/smbios_build.h | 77 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 83 insertions(+), 64 deletions(-)
create mode 100644 hw/smbios/smbios_build.h
diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
index cb8a111..5dc3e43 100644
--- a/hw/smbios/smbios.c
+++ b/hw/smbios/smbios.c
@@ -24,6 +24,7 @@
#include "hw/smbios/smbios.h"
#include "hw/loader.h"
#include "exec/cpu-common.h"
+#include "smbios_build.h"
/* legacy structures and constants for <= 2.0 machines */
struct smbios_header {
@@ -53,10 +54,10 @@ static bool smbios_uuid_encoded = true;
/* end: legacy structures & constants for <= 2.0 machines */
-static uint8_t *smbios_tables;
-static size_t smbios_tables_len;
-static unsigned smbios_table_max;
-static unsigned smbios_table_cnt;
+uint8_t *smbios_tables;
+size_t smbios_tables_len;
+unsigned smbios_table_max;
+unsigned smbios_table_cnt;
static SmbiosEntryPointType smbios_ep_type = SMBIOS_ENTRY_POINT_21;
static SmbiosEntryPoint ep;
@@ -429,7 +430,7 @@ uint8_t *smbios_get_table_legacy(size_t *length)
/* end: legacy setup functions for <= 2.0 machines */
-static bool smbios_skip_table(uint8_t type, bool required_table)
+bool smbios_skip_table(uint8_t type, bool required_table)
{
if (test_bit(type, have_binfile_bitmap)) {
return true; /* user provided their own binary blob(s) */
@@ -443,65 +444,6 @@ static bool smbios_skip_table(uint8_t type, bool required_table)
return true;
}
-#define SMBIOS_BUILD_TABLE_PRE(tbl_type, tbl_handle, tbl_required) \
- struct smbios_type_##tbl_type *t; \
- size_t t_off; /* table offset into smbios_tables */ \
- int str_index = 0; \
- do { \
- /* should we skip building this table ? */ \
- if (smbios_skip_table(tbl_type, tbl_required)) { \
- return; \
- } \
- \
- /* use offset of table t within smbios_tables */ \
- /* (pointer must be updated after each realloc) */ \
- t_off = smbios_tables_len; \
- smbios_tables_len += sizeof(*t); \
- smbios_tables = g_realloc(smbios_tables, smbios_tables_len); \
- t = (struct smbios_type_##tbl_type *)(smbios_tables + t_off); \
- \
- t->header.type = tbl_type; \
- t->header.length = sizeof(*t); \
- t->header.handle = cpu_to_le16(tbl_handle); \
- } while (0)
-
-#define SMBIOS_TABLE_SET_STR(tbl_type, field, value) \
- do { \
- int len = (value != NULL) ? strlen(value) + 1 : 0; \
- if (len > 1) { \
- smbios_tables = g_realloc(smbios_tables, \
- smbios_tables_len + len); \
- memcpy(smbios_tables + smbios_tables_len, value, len); \
- smbios_tables_len += len; \
- /* update pointer post-realloc */ \
- t = (struct smbios_type_##tbl_type *)(smbios_tables + t_off); \
- t->field = ++str_index; \
- } else { \
- t->field = 0; \
- } \
- } while (0)
-
-#define SMBIOS_BUILD_TABLE_POST \
- do { \
- size_t term_cnt, t_size; \
- \
- /* add '\0' terminator (add two if no strings defined) */ \
- term_cnt = (str_index == 0) ? 2 : 1; \
- smbios_tables = g_realloc(smbios_tables, \
- smbios_tables_len + term_cnt); \
- memset(smbios_tables + smbios_tables_len, 0, term_cnt); \
- smbios_tables_len += term_cnt; \
- \
- /* update smbios max. element size */ \
- t_size = smbios_tables_len - t_off; \
- if (t_size > smbios_table_max) { \
- smbios_table_max = t_size; \
- } \
- \
- /* update smbios element count */ \
- smbios_table_cnt++; \
- } while (0)
-
static void smbios_build_type_0_table(void)
{
SMBIOS_BUILD_TABLE_PRE(0, 0x000, false); /* optional, leave up to BIOS */
diff --git a/hw/smbios/smbios_build.h b/hw/smbios/smbios_build.h
new file mode 100644
index 0000000..2257721
--- /dev/null
+++ b/hw/smbios/smbios_build.h
@@ -0,0 +1,77 @@
+/*
+ * SMBIOS Support
+ *
+ * Copyright (C) 2009 Hewlett-Packard Development Company, L.P.
+ * Copyright (C) 2013 Red Hat, Inc.
+ */
+
+#ifndef QEMU_SMBIOS_BUILD_H
+#define QEMU_SMBIOS_BUILD_H
+
+bool smbios_skip_table(uint8_t type, bool required_table);
+
+extern uint8_t *smbios_tables;
+extern size_t smbios_tables_len;
+extern unsigned smbios_table_max;
+extern unsigned smbios_table_cnt;
+
+#define SMBIOS_BUILD_TABLE_PRE(tbl_type, tbl_handle, tbl_required) \
+ struct smbios_type_##tbl_type *t; \
+ size_t t_off; /* table offset into smbios_tables */ \
+ int str_index = 0; \
+ do { \
+ /* should we skip building this table ? */ \
+ if (smbios_skip_table(tbl_type, tbl_required)) { \
+ return; \
+ } \
+ \
+ /* use offset of table t within smbios_tables */ \
+ /* (pointer must be updated after each realloc) */ \
+ t_off = smbios_tables_len; \
+ smbios_tables_len += sizeof(*t); \
+ smbios_tables = g_realloc(smbios_tables, smbios_tables_len); \
+ t = (struct smbios_type_##tbl_type *)(smbios_tables + t_off); \
+ \
+ t->header.type = tbl_type; \
+ t->header.length = sizeof(*t); \
+ t->header.handle = cpu_to_le16(tbl_handle); \
+ } while (0)
+
+#define SMBIOS_TABLE_SET_STR(tbl_type, field, value) \
+ do { \
+ int len = (value != NULL) ? strlen(value) + 1 : 0; \
+ if (len > 1) { \
+ smbios_tables = g_realloc(smbios_tables, \
+ smbios_tables_len + len); \
+ memcpy(smbios_tables + smbios_tables_len, value, len); \
+ smbios_tables_len += len; \
+ /* update pointer post-realloc */ \
+ t = (struct smbios_type_##tbl_type *)(smbios_tables + t_off); \
+ t->field = ++str_index; \
+ } else { \
+ t->field = 0; \
+ } \
+ } while (0)
+
+#define SMBIOS_BUILD_TABLE_POST \
+ do { \
+ size_t term_cnt, t_size; \
+ \
+ /* add '\0' terminator (add two if no strings defined) */ \
+ term_cnt = (str_index == 0) ? 2 : 1; \
+ smbios_tables = g_realloc(smbios_tables, \
+ smbios_tables_len + term_cnt); \
+ memset(smbios_tables + smbios_tables_len, 0, term_cnt); \
+ smbios_tables_len += term_cnt; \
+ \
+ /* update smbios max. element size */ \
+ t_size = smbios_tables_len - t_off; \
+ if (t_size > smbios_table_max) { \
+ smbios_table_max = t_size; \
+ } \
+ \
+ /* update smbios element count */ \
+ smbios_table_cnt++; \
+ } while (0)
+
+#endif /* QEMU_SMBIOS_BUILD_H */
--
2.7.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v2 3/5] ipmi: Add SMBIOS table entry
2016-05-11 16:38 [Qemu-devel] [PATCH v2 0/5] Add IPMI firmware tables minyard
2016-05-11 16:38 ` [Qemu-devel] [PATCH v2 1/5] pc: Postpone SMBIOS table installation to post machine init minyard
2016-05-11 16:38 ` [Qemu-devel] [PATCH v2 2/5] smbios: Move table build tools into an include file minyard
@ 2016-05-11 16:38 ` minyard
2016-05-11 16:38 ` [Qemu-devel] [PATCH v2 4/5] acpi: Add IPMI table entries minyard
2016-05-11 16:38 ` [Qemu-devel] [PATCH v2 5/5] bios: Add tests for the IPMI ACPI and SMBIOS entries minyard
4 siblings, 0 replies; 6+ messages in thread
From: minyard @ 2016-05-11 16:38 UTC (permalink / raw)
To: Igor Mammedov, Michael S . Tsirkin, Paolo Bonzini, qemu-devel,
minyard
Cc: Corey Minyard
From: Corey Minyard <cminyard@mvista.com>
Add an IPMI table entry to the SMBIOS.
Signed-off-by: Corey Minyard <cminyard@mvista.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
---
default-configs/i386-softmmu.mak | 1 +
default-configs/x86_64-softmmu.mak | 1 +
hw/smbios/Makefile.objs | 2 +
hw/smbios/ipmi.c | 76 ++++++++++++++++++++++++++++++++++++++
hw/smbios/noipmi.c | 14 +++++++
hw/smbios/smbios.c | 2 +
include/hw/smbios/ipmi.h | 15 ++++++++
7 files changed, 111 insertions(+)
create mode 100644 hw/smbios/ipmi.c
create mode 100644 hw/smbios/noipmi.c
create mode 100644 include/hw/smbios/ipmi.h
diff --git a/default-configs/i386-softmmu.mak b/default-configs/i386-softmmu.mak
index b177e52..c94431d 100644
--- a/default-configs/i386-softmmu.mak
+++ b/default-configs/i386-softmmu.mak
@@ -20,6 +20,7 @@ CONFIG_I8254=y
CONFIG_PCSPK=y
CONFIG_PCKBD=y
CONFIG_FDC=y
+CONFIG_SMBIOS=y
CONFIG_ACPI=y
CONFIG_ACPI_X86=y
CONFIG_ACPI_X86_ICH=y
diff --git a/default-configs/x86_64-softmmu.mak b/default-configs/x86_64-softmmu.mak
index 6e3b312..256294d 100644
--- a/default-configs/x86_64-softmmu.mak
+++ b/default-configs/x86_64-softmmu.mak
@@ -20,6 +20,7 @@ CONFIG_I8254=y
CONFIG_PCSPK=y
CONFIG_PCKBD=y
CONFIG_FDC=y
+CONFIG_SMBIOS=y
CONFIG_ACPI=y
CONFIG_ACPI_X86=y
CONFIG_ACPI_X86_ICH=y
diff --git a/hw/smbios/Makefile.objs b/hw/smbios/Makefile.objs
index f69a92f..5578f51 100644
--- a/hw/smbios/Makefile.objs
+++ b/hw/smbios/Makefile.objs
@@ -1 +1,3 @@
common-obj-$(CONFIG_SMBIOS) += smbios.o
+common-obj-$(call land,$(CONFIG_SMBIOS),$(CONFIG_IPMI)) += ipmi.o
+common-obj-$(call land,$(CONFIG_SMBIOS),$(call lnot,$(CONFIG_IPMI))) += noipmi.o
diff --git a/hw/smbios/ipmi.c b/hw/smbios/ipmi.c
new file mode 100644
index 0000000..b4b6151
--- /dev/null
+++ b/hw/smbios/ipmi.c
@@ -0,0 +1,76 @@
+/*
+ * IPMI SMBIOS firmware handling
+ *
+ * Copyright (c) 2015 Corey Minyard, MontaVista Software, LLC
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include "hw/ipmi/ipmi.h"
+#include "hw/smbios/ipmi.h"
+#include "hw/smbios/smbios.h"
+#include "qemu/error-report.h"
+#include "smbios_build.h"
+
+/* SMBIOS type 38 - IPMI */
+struct smbios_type_38 {
+ struct smbios_structure_header header;
+ uint8_t interface_type;
+ uint8_t ipmi_spec_revision;
+ uint8_t i2c_slave_address;
+ uint8_t nv_storage_device_address;
+ uint64_t base_address;
+ uint8_t base_address_modifier;
+ uint8_t interrupt_number;
+} QEMU_PACKED;
+
+static void ipmi_encode_one_smbios(IPMIFwInfo *info)
+{
+ uint64_t baseaddr = info->base_address;
+ SMBIOS_BUILD_TABLE_PRE(38, 0x3000, true);
+
+ t->interface_type = info->interface_type;
+ t->ipmi_spec_revision = ((info->ipmi_spec_major_revision << 4)
+ | info->ipmi_spec_minor_revision);
+ t->i2c_slave_address = info->i2c_slave_address;
+ t->nv_storage_device_address = 0;
+
+ /* or 1 to set it to I/O space */
+ switch (info->memspace) {
+ case IPMI_MEMSPACE_IO: baseaddr |= 1; break;
+ case IPMI_MEMSPACE_MEM32: break;
+ case IPMI_MEMSPACE_MEM64: break;
+ case IPMI_MEMSPACE_SMBUS: baseaddr <<= 1; break;
+ }
+
+ t->base_address = cpu_to_le64(baseaddr);
+
+ t->base_address_modifier = 0;
+ if (info->irq_type == IPMI_LEVEL_IRQ) {
+ t->base_address_modifier |= 1;
+ }
+ switch (info->register_spacing) {
+ case 1: break;
+ case 4: t->base_address_modifier |= 1 << 6; break;
+ case 16: t->base_address_modifier |= 2 << 6; break;
+ default:
+ error_report("IPMI register spacing %d is not compatible with"
+ " SMBIOS, ignoring this entry.", info->register_spacing);
+ return;
+ }
+ t->interrupt_number = info->interrupt_number;
+
+ SMBIOS_BUILD_TABLE_POST;
+}
+
+void smbios_build_type_38_table(void)
+{
+ IPMIFwInfo *info = ipmi_first_fwinfo();
+
+ while (info) {
+ ipmi_encode_one_smbios(info);
+ info = ipmi_next_fwinfo(info);
+ }
+}
diff --git a/hw/smbios/noipmi.c b/hw/smbios/noipmi.c
new file mode 100644
index 0000000..ad669a4
--- /dev/null
+++ b/hw/smbios/noipmi.c
@@ -0,0 +1,14 @@
+/*
+ * IPMI SMBIOS firmware handling
+ *
+ * Copyright (c) 2015 Corey Minyard, MontaVista Software, LLC
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "hw/smbios/ipmi.h"
+
+void smbios_build_type_38_table(void)
+{
+}
diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
index 5dc3e43..74c7102 100644
--- a/hw/smbios/smbios.c
+++ b/hw/smbios/smbios.c
@@ -25,6 +25,7 @@
#include "hw/loader.h"
#include "exec/cpu-common.h"
#include "smbios_build.h"
+#include "hw/smbios/ipmi.h"
/* legacy structures and constants for <= 2.0 machines */
struct smbios_header {
@@ -848,6 +849,7 @@ void smbios_get_tables(const struct smbios_phys_mem_area *mem_array,
}
smbios_build_type_32_table();
+ smbios_build_type_38_table();
smbios_build_type_127_table();
smbios_validate_table();
diff --git a/include/hw/smbios/ipmi.h b/include/hw/smbios/ipmi.h
new file mode 100644
index 0000000..fd53c96
--- /dev/null
+++ b/include/hw/smbios/ipmi.h
@@ -0,0 +1,15 @@
+/*
+ * IPMI SMBIOS firmware handling
+ *
+ * Copyright (c) 2015 Corey Minyard, MontaVista Software, LLC
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#ifndef QEMU_SMBIOS_IPMI_H
+#define QEMU_SMBIOS_IPMI_H
+
+void smbios_build_type_38_table(void);
+
+#endif /* QEMU_SMBIOS_IPMI_H */
--
2.7.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v2 4/5] acpi: Add IPMI table entries
2016-05-11 16:38 [Qemu-devel] [PATCH v2 0/5] Add IPMI firmware tables minyard
` (2 preceding siblings ...)
2016-05-11 16:38 ` [Qemu-devel] [PATCH v2 3/5] ipmi: Add SMBIOS table entry minyard
@ 2016-05-11 16:38 ` minyard
2016-05-11 16:38 ` [Qemu-devel] [PATCH v2 5/5] bios: Add tests for the IPMI ACPI and SMBIOS entries minyard
4 siblings, 0 replies; 6+ messages in thread
From: minyard @ 2016-05-11 16:38 UTC (permalink / raw)
To: Igor Mammedov, Michael S . Tsirkin, Paolo Bonzini, qemu-devel,
minyard
Cc: Corey Minyard
From: Corey Minyard <cminyard@mvista.com>
Use the new ACPI table construction tools to create an ACPI
entry for IPMI. This adds a function called from build_dsdt
to add an DSDT entry for IPMI if IPMI is compiled in and has
registered firmware. It also adds a dummy function if IPMI
is not compiled in.
This conforms to section "C3-2 Locating IPMI System Interfaces in
ACPI Name Space" in the IPMI 2.0 specification.
Signed-off-by: Corey Minyard <cminyard@mvista.com>
---
hw/acpi/Makefile.objs | 2 +
hw/acpi/ipmi.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++++
hw/acpi/noipmi.c | 14 ++++++
hw/i386/acpi-build.c | 4 ++
include/hw/acpi/ipmi.h | 17 +++++++
5 files changed, 154 insertions(+)
create mode 100644 hw/acpi/ipmi.c
create mode 100644 hw/acpi/noipmi.c
create mode 100644 include/hw/acpi/ipmi.h
diff --git a/hw/acpi/Makefile.objs b/hw/acpi/Makefile.objs
index faee86c..b8d5c84 100644
--- a/hw/acpi/Makefile.objs
+++ b/hw/acpi/Makefile.objs
@@ -6,3 +6,5 @@ obj-$(CONFIG_ACPI_NVDIMM) += nvdimm.o
common-obj-$(CONFIG_ACPI) += acpi_interface.o
common-obj-$(CONFIG_ACPI) += bios-linker-loader.o
common-obj-$(CONFIG_ACPI) += aml-build.o
+common-obj-$(call land,$(CONFIG_ACPI),$(CONFIG_IPMI)) += ipmi.o
+common-obj-$(call land,$(CONFIG_ACPI),$(call lnot,$(CONFIG_IPMI))) += noipmi.o
diff --git a/hw/acpi/ipmi.c b/hw/acpi/ipmi.c
new file mode 100644
index 0000000..731f4ad
--- /dev/null
+++ b/hw/acpi/ipmi.c
@@ -0,0 +1,117 @@
+/*
+ * IPMI ACPI firmware handling
+ *
+ * Copyright (c) 2015 Corey Minyard, MontaVista Software, LLC
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include "hw/ipmi/ipmi.h"
+#include "hw/acpi/aml-build.h"
+#include "hw/acpi/acpi.h"
+#include "hw/acpi/ipmi.h"
+
+static Aml *aml_ipmi_crs(IPMIFwInfo *info)
+{
+ Aml *crs = aml_resource_template();
+ uint8_t regspacing = info->register_spacing;
+
+ /*
+ * The base address is fixed and cannot change. That may be different
+ * if someone does PCI, but we aren't there yet.
+ */
+ switch (info->memspace) {
+ case IPMI_MEMSPACE_IO:
+ aml_append(crs, aml_io(AML_DECODE16, info->base_address,
+ info->base_address + info->register_length - 1,
+ regspacing, info->register_length));
+ break;
+ case IPMI_MEMSPACE_MEM32:
+ aml_append(crs,
+ aml_dword_memory(AML_POS_DECODE,
+ AML_MIN_FIXED, AML_MAX_FIXED,
+ AML_NON_CACHEABLE, AML_READ_WRITE,
+ 0xffffffff,
+ info->base_address,
+ info->base_address + info->register_length - 1,
+ regspacing, info->register_length));
+ break;
+ case IPMI_MEMSPACE_MEM64:
+ aml_append(crs,
+ aml_qword_memory(AML_POS_DECODE,
+ AML_MIN_FIXED, AML_MAX_FIXED,
+ AML_NON_CACHEABLE, AML_READ_WRITE,
+ 0xffffffffffffffffULL,
+ info->base_address,
+ info->base_address + info->register_length - 1,
+ regspacing, info->register_length));
+ break;
+ case IPMI_MEMSPACE_SMBUS:
+ aml_append(crs, aml_return(aml_int(info->base_address)));
+ break;
+ default:
+ abort();
+ }
+
+ if (info->interrupt_number) {
+ aml_append(crs, aml_irq_no_flags(info->interrupt_number));
+ }
+
+ return crs;
+}
+
+static void
+ipmi_encode_one_acpi(Aml *table, IPMIFwInfo *info)
+{
+ Aml *scope, *dev, *method;
+ uint16_t version = ((info->ipmi_spec_major_revision << 8)
+ | (info->ipmi_spec_minor_revision << 4));
+
+ /*
+ * The ACPI parent is a little bit of a pain. It could be in
+ * different places depending on the device. It could be an SMBus,
+ * it could be ISA, it could be PCI, etc. Only the device really
+ * knows, so it has to pass it in.
+ */
+ if (!info->acpi_parent) {
+ ipmi_debug("device %s not compatible with ACPI, no parent given.",
+ info->interface_name);
+ return;
+ }
+
+ scope = aml_scope("%s", info->acpi_parent);
+
+ dev = aml_device("MI0");
+ aml_append(dev, aml_name_decl("_HID", aml_eisaid("IPI0001")));
+ aml_append(dev, aml_name_decl("_STR", aml_string("ipmi_%s",
+ info->interface_name)));
+ aml_append(dev, aml_name_decl("_UID", aml_int(info->uuid)));
+ aml_append(dev, aml_name_decl("_CRS", aml_ipmi_crs(info)));
+
+ /*
+ * The spec seems to require these to be methods. All the examples
+ * show them this way and it doesn't seem to work if they are not.
+ */
+ method = aml_method("_IFT", 0, AML_NOTSERIALIZED);
+ aml_append(method, aml_return(aml_int(info->interface_type)));
+ aml_append(dev, method);
+ method = aml_method("_SRV", 0, AML_NOTSERIALIZED);
+ aml_append(method, aml_return(aml_int(version)));
+ aml_append(dev, method);
+
+ aml_append(scope, dev);
+
+ aml_append(table, scope);
+}
+
+void acpi_add_ipmi(Aml *table)
+{
+ IPMIFwInfo *info = ipmi_first_fwinfo();
+
+ while (info) {
+ ipmi_encode_one_acpi(table, info);
+ info = ipmi_next_fwinfo(info);
+ }
+}
diff --git a/hw/acpi/noipmi.c b/hw/acpi/noipmi.c
new file mode 100644
index 0000000..4aae336
--- /dev/null
+++ b/hw/acpi/noipmi.c
@@ -0,0 +1,14 @@
+/*
+ * IPMI ACPI firmware handling
+ *
+ * Copyright (c) 2015 Corey Minyard, MontaVista Software, LLC
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "hw/acpi/ipmi.h"
+
+void acpi_add_ipmi(Aml *ssdt)
+{
+}
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 6477003..2294e7b 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -59,6 +59,8 @@
#include "qapi/qmp/qint.h"
#include "qom/qom-qobject.h"
+#include "hw/acpi/ipmi.h"
+
/* These are used to size the ACPI tables for -M pc-i440fx-1.7 and
* -M pc-i440fx-2.0. Even if the actual amount of AML generated grows
* a little bit, there should be plenty of free space since the DSDT
@@ -2364,6 +2366,8 @@ build_dsdt(GArray *table_data, GArray *linker,
aml_append(dsdt, sb_scope);
}
+ acpi_add_ipmi(dsdt);
+
/* copy AML table into ACPI tables blob and patch header there */
g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
build_header(linker, table_data,
diff --git a/include/hw/acpi/ipmi.h b/include/hw/acpi/ipmi.h
new file mode 100644
index 0000000..4f11a28
--- /dev/null
+++ b/include/hw/acpi/ipmi.h
@@ -0,0 +1,17 @@
+/*
+ * QEMU IPMI ACPI handling
+ *
+ * Copyright (c) 2015 Corey Minyard <cminyard@mvista.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+#ifndef HW_ACPI_IPMI_H
+#define HW_ACPI_IPMI_H
+
+#include "qemu/osdep.h"
+#include "hw/acpi/aml-build.h"
+
+void acpi_add_ipmi(Aml *ssdt);
+
+#endif /* HW_ACPI_IPMI_H */
--
2.7.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v2 5/5] bios: Add tests for the IPMI ACPI and SMBIOS entries
2016-05-11 16:38 [Qemu-devel] [PATCH v2 0/5] Add IPMI firmware tables minyard
` (3 preceding siblings ...)
2016-05-11 16:38 ` [Qemu-devel] [PATCH v2 4/5] acpi: Add IPMI table entries minyard
@ 2016-05-11 16:38 ` minyard
4 siblings, 0 replies; 6+ messages in thread
From: minyard @ 2016-05-11 16:38 UTC (permalink / raw)
To: Igor Mammedov, Michael S . Tsirkin, Paolo Bonzini, qemu-devel,
minyard
Cc: Corey Minyard
From: Corey Minyard <cminyard@mvista.com>
Signed-off-by: Corey Minyard <cminyard@mvista.com>
---
tests/acpi-test-data/pc/DSDT.ipmikcs | Bin 0 -> 5683 bytes
tests/acpi-test-data/q35/DSDT.ipmibt | Bin 0 -> 8456 bytes
tests/bios-tables-test.c | 58 ++++++++++++++++++++++++++++++++---
3 files changed, 54 insertions(+), 4 deletions(-)
create mode 100644 tests/acpi-test-data/pc/DSDT.ipmikcs
create mode 100644 tests/acpi-test-data/q35/DSDT.ipmibt
diff --git a/tests/acpi-test-data/pc/DSDT.ipmikcs b/tests/acpi-test-data/pc/DSDT.ipmikcs
new file mode 100644
index 0000000000000000000000000000000000000000..280aeb3059eb9220108b9a2b7f0ac07819023b06
GIT binary patch
literal 5683
zcmb7IUvC@75ud#yrQ?#6j?!6{?Kmc6J8sh2<{w*j(4r7|M~Req)R{-QF3#v3B^jmL
zq&_Gy5Jd<eGpOw3EoEJ_Z?wy|0`^B}AN!b(kbZ>}jr|mL=8j9Tat?3_@OEeBw==W5
zGqZbV*hZ^32f+STUel{~wtU;t4dgKZpgy%~Ep`W-J)^whvZNGa&ckHT$46Pweqxl@
zSJ<CB-k&`0<3}EA`>^p$eX`N^KY#3P0D&HC_?%NmU2yHP>vT_9dM&58)tZqiea&UX
zEg4Nv-1VBlR8t8t6{TubS^~rngkp4~YPC#A0et;^5@OCnmFU@9m4=bEnueRz7G1kl
z0-rdZPptN*9#_47>Z_gyJui81Fo6ElSG_j;v7Lf{{U<(v0iRY}y=iAMd}=>|Ge+eQ
z1K0ue{3Y^++;zGqtlRlw;A=_-hOSuoqAmeHP?zFkFg;eYOKyn6g(cjToGx*Xqr30?
z>Jn+8kpR`pFj==M4F=ai)=Sip^)fc9e&(_)43jped$HNlQE9kjNn9-Qcb*?xVLtev
zN(;bN*fwl~G_eCt_u7rJF@npomIzj5G|^z72OcmSwFO()E=V|Er+dL%TOSRao;^BH
z;qe7f30P8=4SlqUlS7YA@%a_@t^BPFu@&}Geu)dUumtbL0^RxLx>XXJy=>HGvMTU6
zU*kE(UvP<^$NvmJ#Si!g{5w9)6~$dPDw*S4qc9x*Nk}-|pVzI{$k!NX^WoOhl6w6K
z-0lH9jg984^7IP(ME*opl!d*(pGr($GxK6m<1CCop@udjO3f?zl?=*)8mL(&HH9N;
zxHQs(I~u7+dL^MA1@)*^<uHi$EZuIgBs}K|hBy&A#^8DuA4b;Mvn#8Zipq0}s3Z}3
zIagUlLAhZzSyBxJMCj$lx|wxYxvt*;?YyN|Rwd^wQ3nTphlKtPy9YGfxj^gzs0~b^
zva8<U6!x0IU8~swe@5E#d}u!_C!VzVp8si^OR(YZZnrmp%dpv3dz%PKVA|9hHw@V7
zpX+V1ex}#vu@T#bt*7Y`RYFjvx5=dur#$4yBaRMR{%1QITm?*Ac)SJR@3zt2<1GgM
z)?=>?584CId3f%!Ox{wiP_{9vc{8WrBTtV4J&KApTf2#?+E48Ay$&XQV!)HyV(q5h
zOdz0{%S`d)7ZZ>Of^7%BBp#3Bv(`^O>EN6@)E^Mr>DDK4ni$MsLZ+~QP<c{tt?bMk
zpZ#JA5^@})l;b~%{~ge#!yF_h$UQCN8Z{d}qdwmYIMbBXFd&x#`nYR1ZT4j+^a86{
zvqt=(_3{zx7{709JwIkWA6U<$f8*Bk+7DaLJ6)6Jt{<_^rT@cxVa$9XFkd)gz7S!)
zFf?x*HIE0x8_&KtX1*AhFCH;pj4)qxx@$3<y?xYtEHp1dh)xmQa#41Z+C;F~S~6T?
zaur#$yQ-O@bknZtmRVwWXzJElqXV9wNpb}g)Puja-+4?47c?^X9#SzFw6&AEg&}=7
zsvq~T;60TGpmE)zWMAO_)K(|Zo(>p5wtE-PXCJ(0%kd}PBeFFd>_NNFcRfA{pKh>?
zrzvFL#gkJ8%JL0{8NTp`UVGEu3>@^J&oRFnt>s^O?5Ps8Tz=rGjf;m>tXsNhR;_TS
z(pJODm2!*WF`qW?et3U-C)>IIvH!t?UuU=PesurA_U7G>K${J+q@U=SMx%)p9Fx>x
zW>CIL6Q-><;82G1aL$tK;NaQMo_I9E_e{G|@6YzkTEk{$;GfTkcskeDdS=tS6>_<Z
zY^1h5<~bKg$$)7W%_c49p<4eh9S9UAduGLUna`&M+S5w&CT2`RxFE2K*<8GmDe~Nx
zKL)_7!ja$i2jNe!hvWfP92&@{(Aj#}oxyH3?7ma42=05>9dhT)((NJkBzCL5*(_IS
z5OwOL2s`yE4WLe)lx!25Iy9DuKun|i+7sfDe4A(%Ff##@eLUh&uTHXh-<a$X8*s|S
zLgoyA>(TM?DbrMGnl!~=dc^|gsNTgnVRs704!d*ckn59W68of_gg*I6qTvqFuu*sM
zigwPlZkz1r2KdNz54Y(@=9=A#y#~5xu2pXNzd@lMs?-+D%4!ae$1tMAc4C;|2^&Jx
zO4?nqDnat6OS)Cd<uIf%lk2%0Xz#m~TppaWcMdOa;YmBju=GaDxiH2cgr?%i0^A8x
z2UAr$fs7*Dxf~O>KuRQv{=n9i(B##y89Hz+q^^g}`(aZGn{wFbVPk|%C2W>Ktz?F#
zgKIh6EX$MpcaPH`;YFMFj~;kae3g2YVhZwE7}hUQ{3<n~)4^{4dprg>?mZoU^phZv
zh`XF}aPar<L&-nBqZ_3j!=(*xlt-!s@yBWez9F<qJQ?1B)10rcZ(e-!g2hP5YRsxy
z&2WSMx8&gcAX|N{-n_00p2Ksd;f3toJ6NpjqB}DYW9T&YuedWx3@@p8{Y2_2NoWG<
zPY;*R>0Vm?g}xj*aI<2rV}uk4eZ*rmuEtpkt(1O$hxXX%-iTeID~#2wj1Ct*5nL<M
zy0!jhuD^g6EQ`y4*NNc%_=0DhhpB*|+P|bapBHrtV>S3`Dc3BuU_d7iAVDuqNZ2jV
z(k`X~L!z<@9W6ukUBZgrfqfc&PoaZjMrQQ7HWtf4wGZm{*xuk3h{HTNRki4L3Y^b7
z56=)GQ<ch6&B8~WdUfn!@}k$L2~dJ19@Jf|3Rum9;!Ss7=i#w%Jl6Uw<uN{NJ*!Pn
z!IxC?KCPruMk$6w($3}ZHG$qSo$h;fen?>KN}%D+<PAJ#s8bM~B6XbZyLSFM4z$-B
z!*^61B7-&)tPNeI$pDE7S|GIq#hU<{LMXnGL_mesxPZo^phck-BO%l}5eXGqCk1pe
z3VKCo#W$=_s}cznS`z}Ah=N`fTDgGoNT|??NgO(mjDju-ttkObMM8zvw1B3gpx1=f
zDFK~|gbJ;A#}9p-j)GnnT2%p6BcVcTMnE%B(D#Mb83CP%gbJ;*0y-N7EeWj{`Qfy*
zNT|?yOhAuCLCZqxoPf?nLWS1j0(v|Ostc|20y-ZF6<SXS=!qz(A+(+p(36o+q4ku2
zo{EB2gx0qN^sPv!(0W=xPe(zQh1RzP^zBHf(0WEd&-@TntDZ7$HCj?XwcEiLjeV+h
z_X0vi0;^d_WQh=xB_yySg_1oYNRr;|B=I}fzKvyNNJ&JEWHF?$I1FWE>*`2G#xTW)
zGP1Tfl94$~)S-;*T_f4_ZU?I?p2+()CY+%0Oh)=pjwkcJjj1E#_$Gz)p<E>zlR(I`
z0evW6A{xV4$oB&JP#(+}15?QHFxj{DF*(f|Lu@3cc^hMLnmGo`NS-BnOumFPZu>~S
zM>NW{GjxZ<kAC#^hPDvTx^*_}7+hA@;$ug0`1P<JGiww<^tIxh1mKqfyVXqJ^FO@j
n{&w>tyq?gf*ReDES?aGTCgBUL;?|b&hQKtAFRQm;kOb+!4tZ%z
literal 0
HcmV?d00001
diff --git a/tests/acpi-test-data/q35/DSDT.ipmibt b/tests/acpi-test-data/q35/DSDT.ipmibt
new file mode 100644
index 0000000000000000000000000000000000000000..6704538dee7dcfade6a1dc74eda5b8b832d7c6a2
GIT binary patch
literal 8456
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
literal 0
HcmV?d00001
diff --git a/tests/bios-tables-test.c b/tests/bios-tables-test.c
index 0352814..3b7689e 100644
--- a/tests/bios-tables-test.c
+++ b/tests/bios-tables-test.c
@@ -50,6 +50,8 @@ typedef struct {
GArray *tables;
uint32_t smbios_ep_addr;
struct smbios_21_entry_point smbios_ep_table;
+ uint8_t *required_struct_types;
+ int required_struct_types_len;
} test_data;
#define ACPI_READ_FIELD(field, addr) \
@@ -335,7 +337,7 @@ static void test_acpi_tables(test_data *data)
for (i = 0; i < tables_nr; i++) {
AcpiSdtTable ssdt_table;
- memset(&ssdt_table, 0 , sizeof(ssdt_table));
+ memset(&ssdt_table, 0, sizeof(ssdt_table));
uint32_t addr = data->rsdt_tables_addr[i + 1]; /* fadt is first */
test_dst_table(&ssdt_table, addr);
g_array_append_val(data->tables, ssdt_table);
@@ -654,7 +656,6 @@ static void test_smbios_structs(test_data *data)
uint32_t addr = ep_table->structure_table_address;
int i, len, max_len = 0;
uint8_t type, prv, crt;
- uint8_t required_struct_types[] = {0, 1, 3, 4, 16, 17, 19, 32, 127};
/* walk the smbios tables */
for (i = 0; i < ep_table->number_of_structures; i++) {
@@ -694,8 +695,8 @@ static void test_smbios_structs(test_data *data)
g_assert_cmpuint(ep_table->max_structure_size, ==, max_len);
/* required struct types must all be present */
- for (i = 0; i < ARRAY_SIZE(required_struct_types); i++) {
- g_assert(test_bit(required_struct_types[i], struct_bitmap));
+ for (i = 0; i < data->required_struct_types_len; i++) {
+ g_assert(test_bit(data->required_struct_types[i], struct_bitmap));
}
}
@@ -735,6 +736,9 @@ static void test_acpi_one(const char *params, test_data *data)
g_free(args);
}
+static uint8_t base_required_struct_types[] =
+ {0, 1, 3, 4, 16, 17, 19, 32, 127};
+
static void test_acpi_piix4_tcg(void)
{
test_data data;
@@ -744,6 +748,8 @@ static void test_acpi_piix4_tcg(void)
*/
memset(&data, 0, sizeof(data));
data.machine = MACHINE_PC;
+ data.required_struct_types = base_required_struct_types;
+ data.required_struct_types_len = ARRAY_SIZE(base_required_struct_types);
test_acpi_one("-machine accel=tcg", &data);
free_test_data(&data);
}
@@ -755,6 +761,8 @@ static void test_acpi_piix4_tcg_bridge(void)
memset(&data, 0, sizeof(data));
data.machine = MACHINE_PC;
data.variant = ".bridge";
+ data.required_struct_types = base_required_struct_types;
+ data.required_struct_types_len = ARRAY_SIZE(base_required_struct_types);
test_acpi_one("-machine accel=tcg -device pci-bridge,chassis_nr=1", &data);
free_test_data(&data);
}
@@ -765,6 +773,8 @@ static void test_acpi_q35_tcg(void)
memset(&data, 0, sizeof(data));
data.machine = MACHINE_Q35;
+ data.required_struct_types = base_required_struct_types;
+ data.required_struct_types_len = ARRAY_SIZE(base_required_struct_types);
test_acpi_one("-machine q35,accel=tcg", &data);
free_test_data(&data);
}
@@ -776,11 +786,49 @@ static void test_acpi_q35_tcg_bridge(void)
memset(&data, 0, sizeof(data));
data.machine = MACHINE_Q35;
data.variant = ".bridge";
+ data.required_struct_types = base_required_struct_types;
+ data.required_struct_types_len = ARRAY_SIZE(base_required_struct_types);
test_acpi_one("-machine q35,accel=tcg -device pci-bridge,chassis_nr=1",
&data);
free_test_data(&data);
}
+static uint8_t ipmi_required_struct_types[] =
+ {0, 1, 3, 4, 16, 17, 19, 32, 38, 127};
+
+static void test_acpi_q35_tcg_ipmi(void)
+{
+ test_data data;
+
+ memset(&data, 0, sizeof(data));
+ data.machine = MACHINE_Q35;
+ data.variant = ".ipmibt";
+ data.required_struct_types = ipmi_required_struct_types;
+ data.required_struct_types_len = ARRAY_SIZE(ipmi_required_struct_types);
+ test_acpi_one("-machine q35,accel=tcg -device ipmi-bmc-sim,id=bmc0"
+ " -device isa-ipmi-bt,bmc=bmc0",
+ &data);
+ free_test_data(&data);
+}
+
+static void test_acpi_piix4_tcg_ipmi(void)
+{
+ test_data data;
+
+ /* Supplying -machine accel argument overrides the default (qtest).
+ * This is to make guest actually run.
+ */
+ memset(&data, 0, sizeof(data));
+ data.machine = MACHINE_PC;
+ data.variant = ".ipmikcs";
+ data.required_struct_types = ipmi_required_struct_types;
+ data.required_struct_types_len = ARRAY_SIZE(ipmi_required_struct_types);
+ test_acpi_one("-machine accel=tcg -device ipmi-bmc-sim,id=bmc0"
+ " -device isa-ipmi-kcs,irq=0,bmc=bmc0",
+ &data);
+ free_test_data(&data);
+}
+
int main(int argc, char *argv[])
{
const char *arch = qtest_get_arch();
@@ -797,6 +845,8 @@ int main(int argc, char *argv[])
qtest_add_func("acpi/piix4/tcg/bridge", test_acpi_piix4_tcg_bridge);
qtest_add_func("acpi/q35/tcg", test_acpi_q35_tcg);
qtest_add_func("acpi/q35/tcg/bridge", test_acpi_q35_tcg_bridge);
+ qtest_add_func("acpi/piix4/tcg/ipmi", test_acpi_piix4_tcg_ipmi);
+ qtest_add_func("acpi/q35/tcg/ipmi", test_acpi_q35_tcg_ipmi);
}
ret = g_test_run();
boot_sector_cleanup(disk);
--
2.7.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2016-05-11 16:39 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-05-11 16:38 [Qemu-devel] [PATCH v2 0/5] Add IPMI firmware tables minyard
2016-05-11 16:38 ` [Qemu-devel] [PATCH v2 1/5] pc: Postpone SMBIOS table installation to post machine init minyard
2016-05-11 16:38 ` [Qemu-devel] [PATCH v2 2/5] smbios: Move table build tools into an include file minyard
2016-05-11 16:38 ` [Qemu-devel] [PATCH v2 3/5] ipmi: Add SMBIOS table entry minyard
2016-05-11 16:38 ` [Qemu-devel] [PATCH v2 4/5] acpi: Add IPMI table entries minyard
2016-05-11 16:38 ` [Qemu-devel] [PATCH v2 5/5] bios: Add tests for the IPMI ACPI and SMBIOS entries minyard
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).