aboutsummaryrefslogtreecommitdiff
path: root/hw/fsi
diff options
context:
space:
mode:
authorNinad Palsule <ninad@linux.ibm.com>2024-01-26 04:49:47 -0600
committerCédric Le Goater <clg@kaod.org>2024-02-01 08:13:30 +0100
commitca782334cb821a84d701133a6421516d264cf0d3 (patch)
tree536e07ce4586d24e3bafde516666c08a5c8f7458 /hw/fsi
parent99f0c046f46dae7a7ede7d298de429c3596e76e6 (diff)
downloadqemu-ca782334cb821a84d701133a6421516d264cf0d3.zip
qemu-ca782334cb821a84d701133a6421516d264cf0d3.tar.gz
qemu-ca782334cb821a84d701133a6421516d264cf0d3.tar.bz2
hw/fsi: Introduce IBM's scratchpad device
This is a part of patchset where IBM's Flexible Service Interface is introduced. The scratchpad provides a set of non-functional registers. The firmware is free to use them, hardware does not support any special management support. The scratchpad registers can be read or written from LBUS slave. The scratch pad is managed under FSI CFAM state. Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Signed-off-by: Ninad Palsule <ninad@linux.ibm.com> Reviewed-by: Cédric Le Goater <clg@kaod.org> [ clg: - moved object FSIScratchPad under FSICFAMState - moved FSIScratchPad code under cfam.c ] Signed-off-by: Cédric Le Goater <clg@kaod.org>
Diffstat (limited to 'hw/fsi')
-rw-r--r--hw/fsi/lbus.c78
-rw-r--r--hw/fsi/trace-events2
2 files changed, 78 insertions, 2 deletions
diff --git a/hw/fsi/lbus.c b/hw/fsi/lbus.c
index 44d2319..20495f4 100644
--- a/hw/fsi/lbus.c
+++ b/hw/fsi/lbus.c
@@ -8,11 +8,12 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
#include "hw/fsi/lbus.h"
-
#include "hw/qdev-properties.h"
-
+#include "qemu/log.h"
#include "trace.h"
+#define TO_REG(offset) ((offset) >> 2)
+
static void fsi_lbus_init(Object *o)
{
FSILBus *lbus = FSI_LBUS(o);
@@ -34,10 +35,83 @@ static const TypeInfo fsi_lbus_device_type_info = {
.abstract = true,
};
+static uint64_t fsi_scratchpad_read(void *opaque, hwaddr addr, unsigned size)
+{
+ FSIScratchPad *s = SCRATCHPAD(opaque);
+ int reg = TO_REG(addr);
+
+ trace_fsi_scratchpad_read(addr, size);
+
+ if (reg >= FSI_SCRATCHPAD_NR_REGS) {
+ qemu_log_mask(LOG_GUEST_ERROR,
+ "%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "\n",
+ __func__, addr);
+ return 0;
+ }
+
+ return s->regs[reg];
+}
+
+static void fsi_scratchpad_write(void *opaque, hwaddr addr, uint64_t data,
+ unsigned size)
+{
+ FSIScratchPad *s = SCRATCHPAD(opaque);
+
+ trace_fsi_scratchpad_write(addr, size, data);
+ int reg = TO_REG(addr);
+
+ if (reg >= FSI_SCRATCHPAD_NR_REGS) {
+ qemu_log_mask(LOG_GUEST_ERROR,
+ "%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx "\n",
+ __func__, addr);
+ return;
+ }
+
+ s->regs[reg] = data;
+}
+
+static const struct MemoryRegionOps scratchpad_ops = {
+ .read = fsi_scratchpad_read,
+ .write = fsi_scratchpad_write,
+ .endianness = DEVICE_BIG_ENDIAN,
+};
+
+static void fsi_scratchpad_realize(DeviceState *dev, Error **errp)
+{
+ FSILBusDevice *ldev = FSI_LBUS_DEVICE(dev);
+
+ memory_region_init_io(&ldev->iomem, OBJECT(ldev), &scratchpad_ops,
+ ldev, TYPE_FSI_SCRATCHPAD, 0x400);
+}
+
+static void fsi_scratchpad_reset(DeviceState *dev)
+{
+ FSIScratchPad *s = SCRATCHPAD(dev);
+
+ memset(s->regs, 0, sizeof(s->regs));
+}
+
+static void fsi_scratchpad_class_init(ObjectClass *klass, void *data)
+{
+ DeviceClass *dc = DEVICE_CLASS(klass);
+
+ dc->bus_type = TYPE_FSI_LBUS;
+ dc->realize = fsi_scratchpad_realize;
+ dc->reset = fsi_scratchpad_reset;
+}
+
+static const TypeInfo fsi_scratchpad_info = {
+ .name = TYPE_FSI_SCRATCHPAD,
+ .parent = TYPE_FSI_LBUS_DEVICE,
+ .instance_size = sizeof(FSIScratchPad),
+ .class_init = fsi_scratchpad_class_init,
+};
+
static void fsi_lbus_register_types(void)
{
type_register_static(&fsi_lbus_info);
type_register_static(&fsi_lbus_device_type_info);
+ type_register_static(&fsi_scratchpad_info);
}
type_init(fsi_lbus_register_types);
diff --git a/hw/fsi/trace-events b/hw/fsi/trace-events
index e69de29..c5753e2 100644
--- a/hw/fsi/trace-events
+++ b/hw/fsi/trace-events
@@ -0,0 +1,2 @@
+fsi_scratchpad_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
+fsi_scratchpad_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64