* [RFC 0/1] hw/ipmi: add an aspeed IPMI iBT device model
@ 2021-09-28 22:39 Titus Rwantare
2021-09-28 22:39 ` [RFC 1/1] hw/ipmi: add an aspeed ipmi " Titus Rwantare
2021-09-29 6:24 ` [RFC 0/1] hw/ipmi: add an aspeed IPMI " Cédric Le Goater
0 siblings, 2 replies; 4+ messages in thread
From: Titus Rwantare @ 2021-09-28 22:39 UTC (permalink / raw)
To: clg
Cc: qemu-arm, qemu-devel, f4bug, andrew, wuhaotsh, minyard, Titus Rwantare
This patch follows the Handing IPMI for emulating BMC patch set by Hao Wu.
Building on top of the work in [PATCH] hw/misc: Add an iBT device model posted
by Cédric Le Goater, this iBT model works as a backend to ipmi-host-extern.
Needed to run:
- [PATCH 4/8] hw/ipmi: Refactor IPMI interface, Hao Wu
- [PATCH 5/8] hw/ipmi: Take out common from ipmi_bmc_extern.c, Hao Wu
- [PATCH 6/8] hw/ipmi: Move handle_command to IPMICoreClass, Hao Wu
- [PATCH 7/8] hw/ipmi: Add an IPMI external host device, Hao Wu
Host commandline
-chardev socket,id=ipmichr1,host=localhost,port=9999,reconnect=10 \
-device ipmi-bmc-extern,chardev=ipmichr1,id=bmc0 \
-device isa-ipmi-bt,bmc=bmc0,irq=10 -nodefaults
BMC commandline
-chardev socket,id=ipmichr1,host=localhost,port=9999,server=on,wait=off \
-device "ipmi-host-extern,chardev=ipmichr1,responder=/machine/soc/ibt"
Currently, IRQs are not functional, but it is able to connect.
The following printout is from the host:
[ 6.869742] ipmi_si IPI0001:00: IPMI message handler: Found new BMC (man_id:
0x002b79, prod_id: 0x0000, dev_id: 0x00)
[ 12.393281] ipmi_si IPI0001:00: IPMI bt interface initialized
This patch is an RFC because of the missing IRQs and the need for other patches
to get merged.
Thank you all.
Titus Rwantare (1):
hw/ipmi: add an aspeed ipmi iBT device model
hw/ipmi/ipmi_extern.h | 1 +
include/hw/arm/aspeed_soc.h | 2 +
include/hw/ipmi/aspeed_ibt.h | 77 +++++++++
hw/arm/aspeed_ast2600.c | 12 ++
hw/arm/aspeed_soc.c | 12 ++
hw/ipmi/aspeed_ibt.c | 311 +++++++++++++++++++++++++++++++++++
hw/ipmi/meson.build | 1 +
hw/ipmi/trace-events | 7 +
8 files changed, 423 insertions(+)
create mode 100644 include/hw/ipmi/aspeed_ibt.h
create mode 100644 hw/ipmi/aspeed_ibt.c
--
2.33.0.800.g4c38ced690-goog
^ permalink raw reply [flat|nested] 4+ messages in thread
* [RFC 1/1] hw/ipmi: add an aspeed ipmi iBT device model
2021-09-28 22:39 [RFC 0/1] hw/ipmi: add an aspeed IPMI iBT device model Titus Rwantare
@ 2021-09-28 22:39 ` Titus Rwantare
2021-09-29 6:24 ` [RFC 0/1] hw/ipmi: add an aspeed IPMI " Cédric Le Goater
1 sibling, 0 replies; 4+ messages in thread
From: Titus Rwantare @ 2021-09-28 22:39 UTC (permalink / raw)
To: clg
Cc: qemu-arm, qemu-devel, f4bug, andrew, wuhaotsh, minyard, Titus Rwantare
Modifies [PATCH] hw/misc: Add an iBT device model
posted by Cédric Le Goater, to use IPMIInterface.
Signed-off-by: Titus Rwantare <titusr@google.com>
---
hw/ipmi/ipmi_extern.h | 1 +
include/hw/arm/aspeed_soc.h | 2 +
include/hw/ipmi/aspeed_ibt.h | 77 +++++++++
hw/arm/aspeed_ast2600.c | 12 ++
hw/arm/aspeed_soc.c | 12 ++
hw/ipmi/aspeed_ibt.c | 311 +++++++++++++++++++++++++++++++++++
hw/ipmi/meson.build | 1 +
hw/ipmi/trace-events | 7 +
8 files changed, 423 insertions(+)
create mode 100644 include/hw/ipmi/aspeed_ibt.h
create mode 100644 hw/ipmi/aspeed_ibt.c
diff --git a/hw/ipmi/ipmi_extern.h b/hw/ipmi/ipmi_extern.h
index e4aa80a0f6..40157ab0b3 100644
--- a/hw/ipmi/ipmi_extern.h
+++ b/hw/ipmi/ipmi_extern.h
@@ -27,6 +27,7 @@
#include "qemu/osdep.h"
#include "hw/ipmi/ipmi.h"
+#include "chardev/char-fe.h"
#define VM_MSG_CHAR 0xA0 /* Marks end of message */
#define VM_CMD_CHAR 0xA1 /* Marks end of a command */
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
index 87d76c9259..f650ff83ae 100644
--- a/include/hw/arm/aspeed_soc.h
+++ b/include/hw/arm/aspeed_soc.h
@@ -30,6 +30,7 @@
#include "hw/usb/hcd-ehci.h"
#include "qom/object.h"
#include "hw/misc/aspeed_lpc.h"
+#include "hw/ipmi/aspeed_ibt.h"
#define ASPEED_SPIS_NUM 2
#define ASPEED_EHCIS_NUM 2
@@ -65,6 +66,7 @@ struct AspeedSoCState {
AspeedSDHCIState sdhci;
AspeedSDHCIState emmc;
AspeedLPCState lpc;
+ AspeedIBTState ibt;
uint32_t uart_default;
};
diff --git a/include/hw/ipmi/aspeed_ibt.h b/include/hw/ipmi/aspeed_ibt.h
new file mode 100644
index 0000000000..d90cc103d4
--- /dev/null
+++ b/include/hw/ipmi/aspeed_ibt.h
@@ -0,0 +1,77 @@
+/*
+ * ASPEED iBT Device
+ *
+ * Copyright (c) 2016-2021 Cédric Le Goater, IBM Corporation.
+ * Copyright 2021 Google LLC
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef ASPEED_IBT_H
+#define ASPEED_IBT_H
+
+#include "hw/ipmi/ipmi.h"
+#include "hw/sysbus.h"
+
+#define TYPE_ASPEED_IBT "aspeed.ibt"
+#define ASPEED_IBT(obj) OBJECT_CHECK(AspeedIBTState, (obj), TYPE_ASPEED_IBT)
+
+#define ASPEED_IBT_NR_REGS 7
+
+#define ASPEED_IBT_BUFFER_SIZE 64
+
+#define ASPEED_IBT_IO_REGION_SIZE 0x1C
+
+#define TO_REG(o) (o >> 2)
+
+/* from linux/char/ipmi/bt-bmc. */
+#define BT_CR0 0x0
+#define BT_CR0_IO_BASE 16
+#define BT_CR0_IRQ 12
+#define BT_CR0_EN_CLR_SLV_RDP 0x8
+#define BT_CR0_EN_CLR_SLV_WRP 0x4
+#define BT_CR0_ENABLE_IBT 0x1
+#define BT_CR1 0x4
+#define BT_CR1_IRQ_H2B 0x01
+#define BT_CR1_IRQ_HBUSY 0x40
+#define BT_CR2 0x8
+#define BT_CR2_IRQ_H2B 0x01
+#define BT_CR2_IRQ_HBUSY 0x40
+#define BT_CR3 0xc
+#define BT_CTRL 0x10
+#define BT_CTRL_B_BUSY BIT(7) /* BMC is busy */
+#define BT_CTRL_H_BUSY BIT(6) /* Host is busy */
+#define BT_CTRL_OEM0 BIT(5)
+#define BT_CTRL_SMS_ATN BIT(4) /* SMS/EVT Attention */
+#define BT_CTRL_B2H_ATN BIT(3) /* BMC to Host Attention */
+#define BT_CTRL_H2B_ATN BIT(2) /* Host to BMC Attention */
+#define BT_CTRL_CLR_RD_PTR BIT(1) /* Clear Read Ptr */
+#define BT_CTRL_CLR_WR_PTR BIT(0) /* Clear Write Ptr */
+#define BT_BMC2HOST 0x14
+#define BT_HOST2BMC 0x14
+#define BT_INTMASK 0x18
+#define BT_INTMASK_BMC_HWRST BIT(7)
+#define BT_INTMASK_B2H_IRQ BIT(1)
+#define BT_INTMASK_B2H_IRQEN BIT(0)
+
+typedef struct AspeedIBTState {
+ SysBusDevice parent;
+
+ IPMICore *handler;
+
+ uint8_t msg_id;
+ uint8_t recv_msg[ASPEED_IBT_BUFFER_SIZE];
+ uint8_t recv_msg_len;
+ int recv_msg_index;
+
+ uint8_t send_msg[ASPEED_IBT_BUFFER_SIZE];
+ uint8_t send_msg_len;
+
+ MemoryRegion iomem;
+ qemu_irq irq;
+
+ uint32_t regs[ASPEED_IBT_NR_REGS];
+} AspeedIBTState;
+
+
+#endif /* ASPEED_IBT_H */
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
index 9d70e8e060..f40fa69a53 100644
--- a/hw/arm/aspeed_ast2600.c
+++ b/hw/arm/aspeed_ast2600.c
@@ -216,6 +216,8 @@ static void aspeed_soc_ast2600_init(Object *obj)
snprintf(typename, sizeof(typename), "aspeed.hace-%s", socname);
object_initialize_child(obj, "hace", &s->hace, typename);
+
+ object_initialize_child(obj, "ibt", &s->ibt, TYPE_ASPEED_IBT);
}
/*
@@ -507,6 +509,16 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
sysbus_mmio_map(SYS_BUS_DEVICE(&s->hace), 0, sc->memmap[ASPEED_DEV_HACE]);
sysbus_connect_irq(SYS_BUS_DEVICE(&s->hace), 0,
aspeed_soc_get_irq(s, ASPEED_DEV_HACE));
+
+ /* iBT */
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->ibt), errp)) {
+ return;
+ }
+ memory_region_add_subregion(&s->lpc.iomem,
+ sc->memmap[ASPEED_DEV_IBT] - sc->memmap[ASPEED_DEV_LPC],
+ &s->ibt.iomem);
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->ibt), 0,
+ aspeed_soc_get_irq(s, ASPEED_DEV_IBT));
}
static void aspeed_soc_ast2600_class_init(ObjectClass *oc, void *data)
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
index ed84502e23..13543d37c5 100644
--- a/hw/arm/aspeed_soc.c
+++ b/hw/arm/aspeed_soc.c
@@ -216,6 +216,8 @@ static void aspeed_soc_init(Object *obj)
snprintf(typename, sizeof(typename), "aspeed.hace-%s", socname);
object_initialize_child(obj, "hace", &s->hace, typename);
+
+ object_initialize_child(obj, "ibt", &s->ibt, TYPE_ASPEED_IBT);
}
static void aspeed_soc_realize(DeviceState *dev, Error **errp)
@@ -426,6 +428,16 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_4,
qdev_get_gpio_in(DEVICE(&s->lpc), aspeed_lpc_kcs_4));
+ /* iBT */
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->ibt), errp)) {
+ return;
+ }
+ memory_region_add_subregion(&s->lpc.iomem,
+ sc->memmap[ASPEED_DEV_IBT] - sc->memmap[ASPEED_DEV_LPC],
+ &s->ibt.iomem);
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_ibt,
+ qdev_get_gpio_in(DEVICE(&s->lpc), aspeed_lpc_ibt));
+
/* HACE */
object_property_set_link(OBJECT(&s->hace), "dram", OBJECT(s->dram_mr),
&error_abort);
diff --git a/hw/ipmi/aspeed_ibt.c b/hw/ipmi/aspeed_ibt.c
new file mode 100644
index 0000000000..94503da1b0
--- /dev/null
+++ b/hw/ipmi/aspeed_ibt.c
@@ -0,0 +1,311 @@
+/*
+ * ASPEED iBT Device
+ *
+ * Copyright (c) 2016-2021 Cédric Le Goater, IBM Corporation.
+ * Copyright 2021 Google LLC
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "hw/irq.h"
+#include "hw/qdev-properties.h"
+#include "hw/qdev-properties-system.h"
+#include "hw/ipmi/aspeed_ibt.h"
+#include "hw/ipmi/ipmi_extern.h"
+#include "hw/sysbus.h"
+#include "migration/vmstate.h"
+#include "qapi/error.h"
+#include "qemu/bitops.h"
+#include "qemu/error-report.h"
+#include "qemu/log.h"
+#include "sysemu/qtest.h"
+#include "sysemu/sysemu.h"
+#include "trace.h"
+
+static void aspeed_ibt_dump_msg(const char *func, unsigned char *msg,
+ unsigned int len)
+{
+ if (trace_event_get_state_backends(TRACE_ASPEED_IBT_CHR_DUMP_MSG)) {
+ int size = len * 3 + 1;
+ char tmp[size];
+ int i, n = 0;
+
+ for (i = 0; i < len; i++) {
+ n += snprintf(tmp + n, size - n, "%02x:", msg[i]);
+ }
+ tmp[size - 1] = 0;
+
+ trace_aspeed_ibt_chr_dump_msg(func, tmp, len);
+ }
+}
+
+/* convert and send IPMI message from BMC to remote host */
+static void aspeed_ibt_b2h_write(AspeedIBTState *ibt)
+{
+ IPMICoreClass *hk = IPMI_CORE_GET_CLASS(ibt->handler);
+
+ aspeed_ibt_dump_msg(__func__, ibt->send_msg, ibt->send_msg_len);
+ /* separate seq from raw contents */
+ ibt->msg_id = ibt->send_msg[2];
+ ibt->send_msg[2] = ibt->send_msg[1];
+ /* length and seq not included in vm message */
+ hk->handle_command(ibt->handler, ibt->send_msg + 2,
+ ibt->send_msg_len - 2, MAX_IPMI_MSG_SIZE,
+ ibt->msg_id);
+}
+
+
+/* BMC firmware writing to memory region */
+static void aspeed_ibt_write(void *opaque, hwaddr offset, uint64_t data,
+ uint32_t size)
+{
+ AspeedIBTState *ibt = ASPEED_IBT(opaque);
+
+ trace_aspeed_ibt_write(offset, data);
+ switch (offset) {
+ case BT_CTRL:
+ /* CLR_WR_PTR: cleared before a message is written */
+ if (data & BT_CTRL_CLR_WR_PTR) {
+ memset(ibt->send_msg, 0, sizeof(ibt->send_msg));
+ ibt->send_msg_len = 0;
+ trace_aspeed_ibt_event("CLR_WR_PTR");
+ }
+
+ /* CLR_RD_PTR: cleared before a message is read */
+ else if (data & BT_CTRL_CLR_RD_PTR) {
+ ibt->recv_msg_index = -1;
+ trace_aspeed_ibt_event("CLR_RD_PTR");
+ }
+
+ /*
+ * H2B_ATN: raised by host to end message, cleared by BMC
+ * before reading message
+ */
+ else if (data & BT_CTRL_H2B_ATN) {
+ ibt->regs[TO_REG(BT_CTRL)] &= ~BT_CTRL_H2B_ATN;
+ trace_aspeed_ibt_event("H2B_ATN");
+ }
+
+ /* B_BUSY: raised and cleared by BMC when message is read */
+ else if (data & BT_CTRL_B_BUSY) {
+ ibt->regs[TO_REG(BT_CTRL)] ^= BT_CTRL_B_BUSY;
+ trace_aspeed_ibt_event("B_BUSY");
+ }
+
+ /*
+ * B2H_ATN: raised by BMC and cleared by host
+ *
+ * Also simulate the host busy bit which is set while the host
+ * is reading the message from the BMC
+ */
+ else if (data & BT_CTRL_B2H_ATN) {
+ trace_aspeed_ibt_event("B2H_ATN");
+ ibt->regs[TO_REG(BT_CTRL)] |= (BT_CTRL_B2H_ATN | BT_CTRL_H_BUSY);
+
+ aspeed_ibt_b2h_write(ibt);
+
+ ibt->regs[TO_REG(BT_CTRL)] &= ~(BT_CTRL_B2H_ATN | BT_CTRL_H_BUSY);
+ }
+
+ /* Anything else is unexpected */
+ else {
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: unexpected CTRL setting\n",
+ __func__);
+ }
+
+ /* Message was read by BMC. we can reset the receive state */
+ if (!(ibt->regs[TO_REG(BT_CTRL)] & BT_CTRL_B_BUSY)) {
+ trace_aspeed_ibt_event("B_BUSY cleared");
+ ibt->recv_msg_len = 0;
+ }
+ break;
+
+ case BT_BMC2HOST:
+ if (ibt->send_msg_len < sizeof(ibt->send_msg)) {
+ trace_aspeed_ibt_event("BMC2HOST");
+ ibt->send_msg[ibt->send_msg_len++] = data & 0xff;
+ }
+ break;
+
+ case BT_CR0: /* TODO: iBT config */
+ case BT_CR1: /* interrupt enable */
+ case BT_CR3: /* unused */
+ case BT_INTMASK:
+ ibt->regs[TO_REG(offset)] = (uint32_t) data;
+ break;
+
+ case BT_CR2: /* interrupt status. writing 1 clears. */
+ ibt->regs[TO_REG(offset)] ^= (uint32_t) data;
+ qemu_irq_lower(ibt->irq);
+ break;
+
+ default:
+ qemu_log_mask(LOG_UNIMP, "%s: not implemented 0x%" HWADDR_PRIx "\n",
+ __func__, offset);
+ break;
+ }
+}
+
+/* BMC firmware reading from memory region */
+static uint64_t aspeed_ibt_read(void *opaque, hwaddr offset, unsigned size)
+{
+ AspeedIBTState *ibt = ASPEED_IBT(opaque);
+ uint64_t val = 0;
+
+ switch (offset) {
+ case BT_HOST2BMC: /* shares offset with B2H */
+ trace_aspeed_ibt_event("HOST2BMC");
+ /*
+ * The IPMI BT interface requires the first byte to be the
+ * length of the message
+ */
+ if (ibt->recv_msg_index == -1) {
+ val = ibt->recv_msg_len;
+ ibt->recv_msg_index++;
+ } else if (ibt->recv_msg_index < ibt->recv_msg_len) {
+ val = ibt->recv_msg[ibt->recv_msg_index++];
+ }
+ break;
+
+ case BT_CR0:
+ case BT_CR1:
+ case BT_CR2:
+ case BT_CR3:
+ case BT_CTRL:
+ case BT_INTMASK:
+ val = ibt->regs[TO_REG(offset)];
+ break;
+
+ default:
+ qemu_log_mask(LOG_UNIMP, "%s: not implemented 0x%" HWADDR_PRIx "\n",
+ __func__, offset);
+ return 0;
+ }
+
+ trace_aspeed_ibt_read(offset, val);
+ return val;
+}
+
+/* send a request from a host to the BMC core */
+static void aspeed_ibt_handle_msg(IPMIInterface *ii, uint8_t msg_id,
+ unsigned char *req, unsigned int req_len)
+{
+ AspeedIBTState *ibt = ASPEED_IBT(ii);
+
+ if (req_len == 0) {
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: zero length request", __func__);
+ return;
+ }
+
+ if (req_len > ASPEED_IBT_BUFFER_SIZE - 1) {
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: request of %d bytes is too long",
+ __func__, req_len);
+ req_len = ASPEED_IBT_BUFFER_SIZE - 1;
+ }
+
+ /* include length and reuse msg_id as seq in message */
+ ibt->recv_msg[0] = req[0];
+ ibt->recv_msg[1] = msg_id;
+ memcpy(ibt->recv_msg + 2, req + 1, req_len - 1);
+ ibt->recv_msg_len = req_len + 1;
+
+
+ ibt->regs[TO_REG(BT_CTRL)] |= BT_CTRL_H2B_ATN;
+ aspeed_ibt_dump_msg(__func__, ibt->recv_msg, ibt->recv_msg_len);
+
+}
+
+static void *aspeed_ibt_backend_data(IPMIInterface *ii)
+{
+ return ii;
+}
+
+static void aspeed_ibt_set_ipmi_handler(IPMIInterface *ii, IPMICore *h)
+{
+ AspeedIBTState *ibt = ASPEED_IBT(ii);
+ ibt->handler = h;
+}
+
+static const MemoryRegionOps aspeed_ibt_ops = {
+ .read = aspeed_ibt_read,
+ .write = aspeed_ibt_write,
+ .endianness = DEVICE_LITTLE_ENDIAN,
+ .valid = {
+ .min_access_size = 1,
+ .max_access_size = 4,
+ },
+};
+
+static void aspeed_ibt_enter_reset(Object *obj, ResetType type)
+{
+ AspeedIBTState *ibt = ASPEED_IBT(obj);
+
+ memset(ibt->regs, 0, sizeof(ibt->regs));
+
+ memset(ibt->recv_msg, 0, sizeof(ibt->recv_msg));
+ ibt->recv_msg_len = 0;
+ ibt->recv_msg_index = -1;
+
+ memset(ibt->send_msg, 0, sizeof(ibt->send_msg));
+ ibt->send_msg_len = 0;
+}
+
+
+static void aspeed_ibt_realize(DeviceState *dev, Error **errp)
+{
+ AspeedIBTState *ibt = ASPEED_IBT(dev);
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
+ IPMIInterface *ii = IPMI_INTERFACE(dev);
+
+ sysbus_init_irq(sbd, &ibt->irq);
+ memory_region_init_io(&ibt->iomem, OBJECT(ibt), &aspeed_ibt_ops, ibt,
+ TYPE_ASPEED_IBT, ASPEED_IBT_IO_REGION_SIZE);
+ sysbus_init_mmio(sbd, &ibt->iomem);
+
+
+ if (ibt->handler) {
+ ibt->handler->intf = ii;
+ }
+}
+
+static const VMStateDescription vmstate_aspeed_ibt = {
+ .name = TYPE_ASPEED_IBT,
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .fields = (VMStateField[]) {
+ VMSTATE_UINT32_ARRAY(regs, AspeedIBTState, ASPEED_IBT_NR_REGS),
+ VMSTATE_END_OF_LIST()
+ }
+};
+
+static void aspeed_ibt_class_init(ObjectClass *klass, void *data)
+{
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
+ DeviceClass *dc = DEVICE_CLASS(klass);
+ IPMIInterfaceClass *iic = IPMI_INTERFACE_CLASS(klass);
+
+ dc->desc = "ASPEED IPMI BT Host Controller";
+ dc->vmsd = &vmstate_aspeed_ibt;
+ dc->realize = aspeed_ibt_realize;
+ rc->phases.enter = aspeed_ibt_enter_reset;
+
+ iic->handle_msg = aspeed_ibt_handle_msg;
+ iic->get_backend_data = aspeed_ibt_backend_data;
+ iic->set_ipmi_handler = aspeed_ibt_set_ipmi_handler;
+}
+
+static const TypeInfo aspeed_ibt_info[] = {
+ {
+ .name = TYPE_ASPEED_IBT,
+ .parent = TYPE_SYS_BUS_DEVICE,
+ .instance_size = sizeof(AspeedIBTState),
+ .class_init = aspeed_ibt_class_init,
+ .interfaces = (InterfaceInfo[]) {
+ { TYPE_IPMI_INTERFACE },
+ { },
+ },
+ },
+};
+
+DEFINE_TYPES(aspeed_ibt_info);
diff --git a/hw/ipmi/meson.build b/hw/ipmi/meson.build
index 3d8b030ba5..7e7bced38e 100644
--- a/hw/ipmi/meson.build
+++ b/hw/ipmi/meson.build
@@ -9,5 +9,6 @@ ipmi_ss.add(when: 'CONFIG_PCI_IPMI_BT', if_true: files('pci_ipmi_bt.c'))
ipmi_ss.add(when: 'CONFIG_IPMI_SSIF', if_true: files('smbus_ipmi.c'))
ipmi_ss.add(when: 'CONFIG_IPMI_HOST', if_true: files('ipmi_host_extern.c'))
ipmi_ss.add(when: 'CONFIG_NPCM7XX', if_true: files('npcm7xx_kcs.c'))
+ipmi_ss.add(when: 'CONFIG_IPMI_HOST', if_true: files('aspeed_ibt.c'))
softmmu_ss.add_all(when: 'CONFIG_IPMI', if_true: ipmi_ss)
diff --git a/hw/ipmi/trace-events b/hw/ipmi/trace-events
index 66d40bccbc..efbedfdd62 100644
--- a/hw/ipmi/trace-events
+++ b/hw/ipmi/trace-events
@@ -6,3 +6,10 @@ npcm7xx_kcs_write(const char *id, int channel, int reg, uint8_t value) " %s chan
npcm7xx_kcs_handle_event(const char *id, uint8_t status) " %s: %" PRIu8
npcm7xx_kcs_host_read_byte(const char *id, uint8_t value) " %s: value 0x%02" PRIx8
npcm7xx_kcs_host_write_byte(const char *id, uint8_t value) " %s: value 0x%02" PRIx8
+
+# aspeed_ibt.c
+aspeed_ibt_chr_dump_msg(const char *func, const char *buf, uint32_t len) "%s: %s #%d bytes"
+aspeed_ibt_chr_event(bool connected) "connected:%d"
+aspeed_ibt_read(uint64_t offset, uint64_t value) "offset:0x%" PRIx64 " value:0x%" PRIx64
+aspeed_ibt_write(uint64_t offset, uint64_t value) "offset:0x%" PRIx64 " value:0x%" PRIx64
+aspeed_ibt_event(const char* event) "%s"
--
2.33.0.800.g4c38ced690-goog
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [RFC 0/1] hw/ipmi: add an aspeed IPMI iBT device model
2021-09-28 22:39 [RFC 0/1] hw/ipmi: add an aspeed IPMI iBT device model Titus Rwantare
2021-09-28 22:39 ` [RFC 1/1] hw/ipmi: add an aspeed ipmi " Titus Rwantare
@ 2021-09-29 6:24 ` Cédric Le Goater
2021-09-29 21:27 ` Titus Rwantare
1 sibling, 1 reply; 4+ messages in thread
From: Cédric Le Goater @ 2021-09-29 6:24 UTC (permalink / raw)
To: Titus Rwantare; +Cc: minyard, andrew, qemu-devel, f4bug, wuhaotsh, qemu-arm
Hello Titus,
On 9/29/21 00:39, Titus Rwantare wrote:
> This patch follows the Handing IPMI for emulating BMC patch set by Hao Wu.
> Building on top of the work in [PATCH] hw/misc: Add an iBT device model posted
> by Cédric Le Goater, this iBT model works as a backend to ipmi-host-extern.
Could you please resend with my patch which is still available here :
https://github.com/legoater/qemu/commit/c6b679690f32534e8992d96752d90d2c4aa48130
or here :
http://patchwork.ozlabs.org/project/qemu-devel/patch/20210407171637.777743-20-clg@kaod.org/
and in another patch, the modifications you made on top of mine. That
will help understand where the problem could be.
You can modify patches but you need to keep the original author name,
commit log, signed-off-by to certify its origin. Then list the changes
you have made and add your signed-off-by.
The patch you sent seems to be mostly mine and I don't see any of the
above.
Here is some more info in the kernel documentation :
https://www.kernel.org/doc/html/v4.12/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin
I don't think we have the same kind of documentation in QEMU but it's
the same process.
> Needed to run:
> - [PATCH 4/8] hw/ipmi: Refactor IPMI interface, Hao Wu
> - [PATCH 5/8] hw/ipmi: Take out common from ipmi_bmc_extern.c, Hao Wu
> - [PATCH 6/8] hw/ipmi: Move handle_command to IPMICoreClass, Hao Wu
> - [PATCH 7/8] hw/ipmi: Add an IPMI external host device, Hao Wu
I have no idea what these patches do and where they are. They seem to
modify the core IPMI framework and it is important to understand the
overall changes. Please include them in the patchset first since they
are initial requirements.
> Host commandline
> -chardev socket,id=ipmichr1,host=localhost,port=9999,reconnect=10 \
> -device ipmi-bmc-extern,chardev=ipmichr1,id=bmc0 \
> -device isa-ipmi-bt,bmc=bmc0,irq=10 -nodefaults
>
> BMC commandline
> -chardev socket,id=ipmichr1,host=localhost,port=9999,server=on,wait=off \
> -device "ipmi-host-extern,chardev=ipmichr1,responder=/machine/soc/ibt"
Could we have the full command lines also ?
> Currently, IRQs are not functional, but it is able to connect.
> The following printout is from the host:
>
> [ 6.869742] ipmi_si IPI0001:00: IPMI message handler: Found new BMC (man_id:
> 0x002b79, prod_id: 0x0000, dev_id: 0x00)
> [ 12.393281] ipmi_si IPI0001:00: IPMI bt interface initialized
>
> This patch is an RFC because of the missing IRQs and the need for other patches
> to get merged.
We will need the whole project to start reviewing.
Thanks,
C.
>
> Thank you all.
>
> Titus Rwantare (1):
> hw/ipmi: add an aspeed ipmi iBT device model
>
> hw/ipmi/ipmi_extern.h | 1 +
> include/hw/arm/aspeed_soc.h | 2 +
> include/hw/ipmi/aspeed_ibt.h | 77 +++++++++
> hw/arm/aspeed_ast2600.c | 12 ++
> hw/arm/aspeed_soc.c | 12 ++
> hw/ipmi/aspeed_ibt.c | 311 +++++++++++++++++++++++++++++++++++
> hw/ipmi/meson.build | 1 +
> hw/ipmi/trace-events | 7 +
> 8 files changed, 423 insertions(+)
> create mode 100644 include/hw/ipmi/aspeed_ibt.h
> create mode 100644 hw/ipmi/aspeed_ibt.c
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [RFC 0/1] hw/ipmi: add an aspeed IPMI iBT device model
2021-09-29 6:24 ` [RFC 0/1] hw/ipmi: add an aspeed IPMI " Cédric Le Goater
@ 2021-09-29 21:27 ` Titus Rwantare
0 siblings, 0 replies; 4+ messages in thread
From: Titus Rwantare @ 2021-09-29 21:27 UTC (permalink / raw)
To: Cédric Le Goater
Cc: qemu-arm, qemu-devel, f4bug, andrew, wuhaotsh, minyard
On Tue, 28 Sept 2021 at 23:24, Cédric Le Goater <clg@kaod.org> wrote:
>
> Hello Titus,
>
> On 9/29/21 00:39, Titus Rwantare wrote:
> > This patch follows the Handing IPMI for emulating BMC patch set by Hao Wu.
> > Building on top of the work in [PATCH] hw/misc: Add an iBT device model posted
> > by Cédric Le Goater, this iBT model works as a backend to ipmi-host-extern.
>
> Could you please resend with my patch which is still available here :
>
> https://github.com/legoater/qemu/commit/c6b679690f32534e8992d96752d90d2c4aa48130
>
> or here :
>
> http://patchwork.ozlabs.org/project/qemu-devel/patch/20210407171637.777743-20-clg@kaod.org/
>
> and in another patch, the modifications you made on top of mine. That
> will help understand where the problem could be.
>
> You can modify patches but you need to keep the original author name,
> commit log, signed-off-by to certify its origin. Then list the changes
> you have made and add your signed-off-by.
>
> The patch you sent seems to be mostly mine and I don't see any of the
> above.
>
> Here is some more info in the kernel documentation :
>
> https://www.kernel.org/doc/html/v4.12/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin
>
> I don't think we have the same kind of documentation in QEMU but it's
> the same process.
Thanks, I'm still learning.
>
> > Needed to run:
> > - [PATCH 4/8] hw/ipmi: Refactor IPMI interface, Hao Wu
> > - [PATCH 5/8] hw/ipmi: Take out common from ipmi_bmc_extern.c, Hao Wu
> > - [PATCH 6/8] hw/ipmi: Move handle_command to IPMICoreClass, Hao Wu
> > - [PATCH 7/8] hw/ipmi: Add an IPMI external host device, Hao Wu
>
> I have no idea what these patches do and where they are. They seem to
> modify the core IPMI framework and it is important to understand the
> overall changes. Please include them in the patchset first since they
> are initial requirements.
>
I've pushed everything here: https://github.com/Rwantare/qemu/tree/aspeed-ibt
The other patches are out for review and will likely change before merging
> > Host commandline
> > -chardev socket,id=ipmichr1,host=localhost,port=9999,reconnect=10 \
> > -device ipmi-bmc-extern,chardev=ipmichr1,id=bmc0 \
> > -device isa-ipmi-bt,bmc=bmc0,irq=10 -nodefaults
> >
> > BMC commandline
> > -chardev socket,id=ipmichr1,host=localhost,port=9999,server=on,wait=off \
> > -device "ipmi-host-extern,chardev=ipmichr1,responder=/machine/soc/ibt"
>
> Could we have the full command lines also ?
>
Sure, there's not much else there, one of the bmc firmwares I'm testing with
is a quanta-q71l-bmc which should build from OpenBMC.
Host:
qemu-system-x86_64 \
-nographic -m 4G \
-kernel arch/x86/boot/bzImage -append "console=ttyS0 earlyprintk=ttyS0" \
-serial /dev/tty -monitor /dev/pts/9 -initrd u-root.cpio \
-chardev socket,id=ipmichr0,host=localhost,port=9999,reconnect=10 \
-device ipmi-bmc-extern,chardev=ipmichr0,id=bmc0 \
-device isa-ipmi-bt,bmc=bmc0,irq=10 -nodefaults
BMC:
qemu-system-arm \
-machine quanta-q71l-bmc \
-nographic \
-drive file=path/to/openbmc/image,if=mtd,bus=0,unit=0,snapshot=on \
-chardev socket,id=ipmichr1,host=localhost,port=9999,server=on,wait=off \
-device "ipmi-host-extern,chardev=ipmichr1,responder=/machine/soc/ibt"
>
> > Currently, IRQs are not functional, but it is able to connect.
> > The following printout is from the host:
> >
> > [ 6.869742] ipmi_si IPI0001:00: IPMI message handler: Found new BMC (man_id:
> > 0x002b79, prod_id: 0x0000, dev_id: 0x00)
> > [ 12.393281] ipmi_si IPI0001:00: IPMI bt interface initialized
> >
> > This patch is an RFC because of the missing IRQs and the need for other patches
> > to get merged.
>
> We will need the whole project to start reviewing.
>
> Thanks,
>
> C.
Noted, I think I should be able to send the BT commits from
https://github.com/Rwantare/qemu/tree/aspeed-ibt
after the others are reviewed and merged.
For now, the irq setup is my point of confusion.
Thanks,
-Titus
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-09-29 21:29 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-28 22:39 [RFC 0/1] hw/ipmi: add an aspeed IPMI iBT device model Titus Rwantare
2021-09-28 22:39 ` [RFC 1/1] hw/ipmi: add an aspeed ipmi " Titus Rwantare
2021-09-29 6:24 ` [RFC 0/1] hw/ipmi: add an aspeed IPMI " Cédric Le Goater
2021-09-29 21:27 ` Titus Rwantare
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.