armv7m_ras.c 2.3 KB

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