lbus.c (43c6a5ec9257bc3e634dcabf4ead3be4ee7dd3d6) | lbus.c (e3d0814368d00e7985c31edf5d0cfce45972d4be) |
---|---|
1/* 2 * SPDX-License-Identifier: GPL-2.0-or-later | 1/* 2 * SPDX-License-Identifier: GPL-2.0-or-later |
3 * Copyright (C) 2023 IBM Corp. | 3 * Copyright (C) 2024 IBM Corp. |
4 * 5 * IBM Local bus where FSI slaves are connected 6 */ 7 8#include "qemu/osdep.h" 9#include "qapi/error.h" 10#include "hw/fsi/lbus.h" | 4 * 5 * IBM Local bus where FSI slaves are connected 6 */ 7 8#include "qemu/osdep.h" 9#include "qapi/error.h" 10#include "hw/fsi/lbus.h" |
11 | |
12#include "hw/qdev-properties.h" | 11#include "hw/qdev-properties.h" |
12#include "qemu/log.h" 13#include "trace.h" |
|
13 | 14 |
14static void lbus_init(Object *o) | 15#define TO_REG(offset) ((offset) >> 2) 16 17static void fsi_lbus_init(Object *o) |
15{ 16 FSILBus *lbus = FSI_LBUS(o); 17 | 18{ 19 FSILBus *lbus = FSI_LBUS(o); 20 |
18 memory_region_init(&lbus->mr, OBJECT(lbus), TYPE_FSI_LBUS, 19 FSI_LBUS_MEM_REGION_SIZE - FSI_LBUSDEV_IOMEM_START); | 21 memory_region_init(&lbus->mr, OBJECT(lbus), TYPE_FSI_LBUS, 1 * MiB); |
20} 21 | 22} 23 |
22static const TypeInfo lbus_info = { | 24static const TypeInfo fsi_lbus_info = { |
23 .name = TYPE_FSI_LBUS, 24 .parent = TYPE_BUS, | 25 .name = TYPE_FSI_LBUS, 26 .parent = TYPE_BUS, |
25 .instance_init = lbus_init, | 27 .instance_init = fsi_lbus_init, |
26 .instance_size = sizeof(FSILBus), 27}; 28 | 28 .instance_size = sizeof(FSILBus), 29}; 30 |
29static void lbus_device_class_init(ObjectClass *klass, void *data) | 31static const TypeInfo fsi_lbus_device_type_info = { 32 .name = TYPE_FSI_LBUS_DEVICE, 33 .parent = TYPE_DEVICE, 34 .instance_size = sizeof(FSILBusDevice), 35 .abstract = true, 36}; 37 38static uint64_t fsi_scratchpad_read(void *opaque, hwaddr addr, unsigned size) |
30{ | 39{ |
40 FSIScratchPad *s = SCRATCHPAD(opaque); 41 int reg = TO_REG(addr); 42 43 trace_fsi_scratchpad_read(addr, size); 44 45 if (reg >= FSI_SCRATCHPAD_NR_REGS) { 46 qemu_log_mask(LOG_GUEST_ERROR, 47 "%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "\n", 48 __func__, addr); 49 return 0; 50 } 51 52 return s->regs[reg]; 53} 54 55static void fsi_scratchpad_write(void *opaque, hwaddr addr, uint64_t data, 56 unsigned size) 57{ 58 FSIScratchPad *s = SCRATCHPAD(opaque); 59 60 trace_fsi_scratchpad_write(addr, size, data); 61 int reg = TO_REG(addr); 62 63 if (reg >= FSI_SCRATCHPAD_NR_REGS) { 64 qemu_log_mask(LOG_GUEST_ERROR, 65 "%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx "\n", 66 __func__, addr); 67 return; 68 } 69 70 s->regs[reg] = data; 71} 72 73static const struct MemoryRegionOps scratchpad_ops = { 74 .read = fsi_scratchpad_read, 75 .write = fsi_scratchpad_write, 76 .endianness = DEVICE_BIG_ENDIAN, 77}; 78 79static void fsi_scratchpad_realize(DeviceState *dev, Error **errp) 80{ 81 FSILBusDevice *ldev = FSI_LBUS_DEVICE(dev); 82 83 memory_region_init_io(&ldev->iomem, OBJECT(ldev), &scratchpad_ops, 84 ldev, TYPE_FSI_SCRATCHPAD, 0x400); 85} 86 87static void fsi_scratchpad_reset(DeviceState *dev) 88{ 89 FSIScratchPad *s = SCRATCHPAD(dev); 90 91 memset(s->regs, 0, sizeof(s->regs)); 92} 93 94static void fsi_scratchpad_class_init(ObjectClass *klass, void *data) 95{ |
|
31 DeviceClass *dc = DEVICE_CLASS(klass); 32 33 dc->bus_type = TYPE_FSI_LBUS; | 96 DeviceClass *dc = DEVICE_CLASS(klass); 97 98 dc->bus_type = TYPE_FSI_LBUS; |
99 dc->realize = fsi_scratchpad_realize; 100 device_class_set_legacy_reset(dc, fsi_scratchpad_reset); |
|
34} 35 | 101} 102 |
36static const TypeInfo lbus_device_type_info = { 37 .name = TYPE_FSI_LBUS_DEVICE, 38 .parent = TYPE_DEVICE, 39 .instance_size = sizeof(FSILBusDevice), 40 .abstract = true, 41 .class_init = lbus_device_class_init, 42 .class_size = sizeof(FSILBusDeviceClass), | 103static const TypeInfo fsi_scratchpad_info = { 104 .name = TYPE_FSI_SCRATCHPAD, 105 .parent = TYPE_FSI_LBUS_DEVICE, 106 .instance_size = sizeof(FSIScratchPad), 107 .class_init = fsi_scratchpad_class_init, |
43}; 44 | 108}; 109 |
45static void lbus_register_types(void) | 110static void fsi_lbus_register_types(void) |
46{ | 111{ |
47 type_register_static(&lbus_info); 48 type_register_static(&lbus_device_type_info); | 112 type_register_static(&fsi_lbus_info); 113 type_register_static(&fsi_lbus_device_type_info); 114 type_register_static(&fsi_scratchpad_info); |
49} 50 | 115} 116 |
51type_init(lbus_register_types); | 117type_init(fsi_lbus_register_types); |