loongarch_pic_common.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * QEMU Loongson 7A1000 I/O interrupt controller.
  4. * Copyright (C) 2024 Loongson Technology Corporation Limited
  5. */
  6. #include "qemu/osdep.h"
  7. #include "qapi/error.h"
  8. #include "hw/intc/loongarch_pic_common.h"
  9. #include "hw/qdev-properties.h"
  10. #include "migration/vmstate.h"
  11. static int loongarch_pic_pre_save(void *opaque)
  12. {
  13. LoongArchPICCommonState *s = (LoongArchPICCommonState *)opaque;
  14. LoongArchPICCommonClass *lpcc = LOONGARCH_PIC_COMMON_GET_CLASS(s);
  15. if (lpcc->pre_save) {
  16. return lpcc->pre_save(s);
  17. }
  18. return 0;
  19. }
  20. static int loongarch_pic_post_load(void *opaque, int version_id)
  21. {
  22. LoongArchPICCommonState *s = (LoongArchPICCommonState *)opaque;
  23. LoongArchPICCommonClass *lpcc = LOONGARCH_PIC_COMMON_GET_CLASS(s);
  24. if (lpcc->post_load) {
  25. return lpcc->post_load(s, version_id);
  26. }
  27. return 0;
  28. }
  29. static void loongarch_pic_common_realize(DeviceState *dev, Error **errp)
  30. {
  31. LoongArchPICCommonState *s = LOONGARCH_PIC_COMMON(dev);
  32. if (!s->irq_num || s->irq_num > VIRT_PCH_PIC_IRQ_NUM) {
  33. error_setg(errp, "Invalid 'pic_irq_num'");
  34. return;
  35. }
  36. }
  37. static const Property loongarch_pic_common_properties[] = {
  38. DEFINE_PROP_UINT32("pch_pic_irq_num", LoongArchPICCommonState, irq_num, 0),
  39. };
  40. static const VMStateDescription vmstate_loongarch_pic_common = {
  41. .name = "loongarch_pch_pic",
  42. .version_id = 1,
  43. .minimum_version_id = 1,
  44. .pre_save = loongarch_pic_pre_save,
  45. .post_load = loongarch_pic_post_load,
  46. .fields = (const VMStateField[]) {
  47. VMSTATE_UINT64(int_mask, LoongArchPICCommonState),
  48. VMSTATE_UINT64(htmsi_en, LoongArchPICCommonState),
  49. VMSTATE_UINT64(intedge, LoongArchPICCommonState),
  50. VMSTATE_UINT64(intclr, LoongArchPICCommonState),
  51. VMSTATE_UINT64(auto_crtl0, LoongArchPICCommonState),
  52. VMSTATE_UINT64(auto_crtl1, LoongArchPICCommonState),
  53. VMSTATE_UINT8_ARRAY(route_entry, LoongArchPICCommonState, 64),
  54. VMSTATE_UINT8_ARRAY(htmsi_vector, LoongArchPICCommonState, 64),
  55. VMSTATE_UINT64(last_intirr, LoongArchPICCommonState),
  56. VMSTATE_UINT64(intirr, LoongArchPICCommonState),
  57. VMSTATE_UINT64(intisr, LoongArchPICCommonState),
  58. VMSTATE_UINT64(int_polarity, LoongArchPICCommonState),
  59. VMSTATE_END_OF_LIST()
  60. }
  61. };
  62. static void loongarch_pic_common_class_init(ObjectClass *klass, void *data)
  63. {
  64. DeviceClass *dc = DEVICE_CLASS(klass);
  65. LoongArchPICCommonClass *lpcc = LOONGARCH_PIC_COMMON_CLASS(klass);
  66. device_class_set_parent_realize(dc, loongarch_pic_common_realize,
  67. &lpcc->parent_realize);
  68. device_class_set_props(dc, loongarch_pic_common_properties);
  69. dc->vmsd = &vmstate_loongarch_pic_common;
  70. }
  71. static const TypeInfo loongarch_pic_common_types[] = {
  72. {
  73. .name = TYPE_LOONGARCH_PIC_COMMON,
  74. .parent = TYPE_SYS_BUS_DEVICE,
  75. .instance_size = sizeof(LoongArchPICCommonState),
  76. .class_size = sizeof(LoongArchPICCommonClass),
  77. .class_init = loongarch_pic_common_class_init,
  78. .abstract = true,
  79. }
  80. };
  81. DEFINE_TYPES(loongarch_pic_common_types)