[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 08/17] hw/fsi: Introduce IBM's scratchpad device
From: |
Cédric Le Goater |
Subject: |
[PULL 08/17] hw/fsi: Introduce IBM's scratchpad device |
Date: |
Fri, 26 Jan 2024 14:32:07 +0100 |
From: Ninad Palsule <ninad@linux.ibm.com>
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>
---
include/hw/fsi/lbus.h | 11 ++++++
hw/fsi/lbus.c | 78 +++++++++++++++++++++++++++++++++++++++++--
hw/fsi/trace-events | 2 ++
3 files changed, 89 insertions(+), 2 deletions(-)
diff --git a/include/hw/fsi/lbus.h b/include/hw/fsi/lbus.h
index e8a22e22a8fa..558268c013f5 100644
--- a/include/hw/fsi/lbus.h
+++ b/include/hw/fsi/lbus.h
@@ -29,4 +29,15 @@ typedef struct FSILBus {
MemoryRegion mr;
} FSILBus;
+#define TYPE_FSI_SCRATCHPAD "fsi.scratchpad"
+#define SCRATCHPAD(obj) OBJECT_CHECK(FSIScratchPad, (obj), TYPE_FSI_SCRATCHPAD)
+
+#define FSI_SCRATCHPAD_NR_REGS 4
+
+typedef struct FSIScratchPad {
+ FSILBusDevice parent;
+
+ uint32_t regs[FSI_SCRATCHPAD_NR_REGS];
+} FSIScratchPad;
+
#endif /* FSI_LBUS_H */
diff --git a/hw/fsi/lbus.c b/hw/fsi/lbus.c
index 44d2319087a8..20495f42fd99 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 e69de29bb2d1..c5753e27910a 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
--
2.43.0
- [PULL 00/17] aspeed queue, Cédric Le Goater, 2024/01/26
- [PULL 01/17] tests/avocado/machine_aspeed.py: Update buildroot images to 2023.11, Cédric Le Goater, 2024/01/26
- [PULL 02/17] hw/arm/aspeed: Remove dead code, Cédric Le Goater, 2024/01/26
- [PULL 04/17] hw/arm/aspeed: Init CPU defaults in a common helper, Cédric Le Goater, 2024/01/26
- [PULL 05/17] hw/arm/aspeed: Introduce aspeed_soc_cpu_type() helper, Cédric Le Goater, 2024/01/26
- [PULL 06/17] hw/arm/aspeed: Check for CPU types in machine_run_board_init(), Cédric Le Goater, 2024/01/26
- [PULL 03/17] hw/arm/aspeed: Set default CPU count using aspeed_soc_num_cpus(), Cédric Le Goater, 2024/01/26
- [PULL 07/17] hw/fsi: Introduce IBM's Local bus, Cédric Le Goater, 2024/01/26
- [PULL 08/17] hw/fsi: Introduce IBM's scratchpad device,
Cédric Le Goater <=
- [PULL 09/17] hw/fsi: Introduce IBM's FSI Bus, Cédric Le Goater, 2024/01/26
- [PULL 10/17] hw/fsi: Introduce IBM's fsi-slave model, Cédric Le Goater, 2024/01/26
- [PULL 12/17] hw/fsi: Introduce IBM's FSI master, Cédric Le Goater, 2024/01/26
- [PULL 11/17] hw/fsi: Introduce IBM's cfam, Cédric Le Goater, 2024/01/26
- [PULL 13/17] hw/fsi: Aspeed APB2OPB & On-chip peripheral bus, Cédric Le Goater, 2024/01/26
- [PULL 14/17] hw/arm: Hook up FSI module in AST2600, Cédric Le Goater, 2024/01/26
- [PULL 15/17] hw/fsi: Added qtest, Cédric Le Goater, 2024/01/26
- [PULL 16/17] hw/fsi: Added FSI documentation, Cédric Le Goater, 2024/01/26
- [PULL 17/17] hw/fsi: Update MAINTAINER list, Cédric Le Goater, 2024/01/26
- Re: [PULL 00/17] aspeed queue, Peter Maydell, 2024/01/26