1*2f9db77eSPeter Maydell /* 2*2f9db77eSPeter Maydell * Arm M-profile RAS (Reliability, Availability and Serviceability) block 3*2f9db77eSPeter Maydell * 4*2f9db77eSPeter Maydell * Copyright (c) 2021 Linaro Limited 5*2f9db77eSPeter Maydell * 6*2f9db77eSPeter Maydell * This program is free software; you can redistribute it and/or modify 7*2f9db77eSPeter Maydell * it under the terms of the GNU General Public License version 2 or 8*2f9db77eSPeter Maydell * (at your option) any later version. 9*2f9db77eSPeter Maydell */ 10*2f9db77eSPeter Maydell 11*2f9db77eSPeter Maydell #include "qemu/osdep.h" 12*2f9db77eSPeter Maydell #include "hw/misc/armv7m_ras.h" 13*2f9db77eSPeter Maydell #include "qemu/log.h" 14*2f9db77eSPeter Maydell 15*2f9db77eSPeter Maydell static MemTxResult ras_read(void *opaque, hwaddr addr, 16*2f9db77eSPeter Maydell uint64_t *data, unsigned size, 17*2f9db77eSPeter Maydell MemTxAttrs attrs) 18*2f9db77eSPeter Maydell { 19*2f9db77eSPeter Maydell if (attrs.user) { 20*2f9db77eSPeter Maydell return MEMTX_ERROR; 21*2f9db77eSPeter Maydell } 22*2f9db77eSPeter Maydell 23*2f9db77eSPeter Maydell switch (addr) { 24*2f9db77eSPeter Maydell case 0xe10: /* ERRIIDR */ 25*2f9db77eSPeter Maydell /* architect field = Arm; product/variant/revision 0 */ 26*2f9db77eSPeter Maydell *data = 0x43b; 27*2f9db77eSPeter Maydell break; 28*2f9db77eSPeter Maydell case 0xfc8: /* ERRDEVID */ 29*2f9db77eSPeter Maydell /* Minimal RAS: we implement 0 error record indexes */ 30*2f9db77eSPeter Maydell *data = 0; 31*2f9db77eSPeter Maydell break; 32*2f9db77eSPeter Maydell default: 33*2f9db77eSPeter Maydell qemu_log_mask(LOG_UNIMP, "Read RAS register offset 0x%x\n", 34*2f9db77eSPeter Maydell (uint32_t)addr); 35*2f9db77eSPeter Maydell *data = 0; 36*2f9db77eSPeter Maydell break; 37*2f9db77eSPeter Maydell } 38*2f9db77eSPeter Maydell return MEMTX_OK; 39*2f9db77eSPeter Maydell } 40*2f9db77eSPeter Maydell 41*2f9db77eSPeter Maydell static MemTxResult ras_write(void *opaque, hwaddr addr, 42*2f9db77eSPeter Maydell uint64_t value, unsigned size, 43*2f9db77eSPeter Maydell MemTxAttrs attrs) 44*2f9db77eSPeter Maydell { 45*2f9db77eSPeter Maydell if (attrs.user) { 46*2f9db77eSPeter Maydell return MEMTX_ERROR; 47*2f9db77eSPeter Maydell } 48*2f9db77eSPeter Maydell 49*2f9db77eSPeter Maydell switch (addr) { 50*2f9db77eSPeter Maydell default: 51*2f9db77eSPeter Maydell qemu_log_mask(LOG_UNIMP, "Write to RAS register offset 0x%x\n", 52*2f9db77eSPeter Maydell (uint32_t)addr); 53*2f9db77eSPeter Maydell break; 54*2f9db77eSPeter Maydell } 55*2f9db77eSPeter Maydell return MEMTX_OK; 56*2f9db77eSPeter Maydell } 57*2f9db77eSPeter Maydell 58*2f9db77eSPeter Maydell static const MemoryRegionOps ras_ops = { 59*2f9db77eSPeter Maydell .read_with_attrs = ras_read, 60*2f9db77eSPeter Maydell .write_with_attrs = ras_write, 61*2f9db77eSPeter Maydell .endianness = DEVICE_NATIVE_ENDIAN, 62*2f9db77eSPeter Maydell }; 63*2f9db77eSPeter Maydell 64*2f9db77eSPeter Maydell 65*2f9db77eSPeter Maydell static void armv7m_ras_init(Object *obj) 66*2f9db77eSPeter Maydell { 67*2f9db77eSPeter Maydell SysBusDevice *sbd = SYS_BUS_DEVICE(obj); 68*2f9db77eSPeter Maydell ARMv7MRAS *s = ARMV7M_RAS(obj); 69*2f9db77eSPeter Maydell 70*2f9db77eSPeter Maydell memory_region_init_io(&s->iomem, obj, &ras_ops, 71*2f9db77eSPeter Maydell s, "armv7m-ras", 0x1000); 72*2f9db77eSPeter Maydell sysbus_init_mmio(sbd, &s->iomem); 73*2f9db77eSPeter Maydell } 74*2f9db77eSPeter Maydell 75*2f9db77eSPeter Maydell static void armv7m_ras_class_init(ObjectClass *klass, void *data) 76*2f9db77eSPeter Maydell { 77*2f9db77eSPeter Maydell /* This device has no state: no need for vmstate or reset */ 78*2f9db77eSPeter Maydell } 79*2f9db77eSPeter Maydell 80*2f9db77eSPeter Maydell static const TypeInfo armv7m_ras_info = { 81*2f9db77eSPeter Maydell .name = TYPE_ARMV7M_RAS, 82*2f9db77eSPeter Maydell .parent = TYPE_SYS_BUS_DEVICE, 83*2f9db77eSPeter Maydell .instance_size = sizeof(ARMv7MRAS), 84*2f9db77eSPeter Maydell .instance_init = armv7m_ras_init, 85*2f9db77eSPeter Maydell .class_init = armv7m_ras_class_init, 86*2f9db77eSPeter Maydell }; 87*2f9db77eSPeter Maydell 88*2f9db77eSPeter Maydell static void armv7m_ras_register_types(void) 89*2f9db77eSPeter Maydell { 90*2f9db77eSPeter Maydell type_register_static(&armv7m_ras_info); 91*2f9db77eSPeter Maydell } 92*2f9db77eSPeter Maydell 93*2f9db77eSPeter Maydell type_init(armv7m_ras_register_types); 94