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 7 #include "qemu/osdep.h" 8 #include "qapi/error.h" 9 #include "hw/intc/loongarch_pic_common.h" 10 #include "hw/qdev-properties.h" 11 #include "migration/vmstate.h" 12 13 static void loongarch_pic_common_realize(DeviceState *dev, Error **errp) 14 { 15 LoongArchPICCommonState *s = LOONGARCH_PIC_COMMON(dev); 16 17 if (!s->irq_num || s->irq_num > VIRT_PCH_PIC_IRQ_NUM) { 18 error_setg(errp, "Invalid 'pic_irq_num'"); 19 return; 20 } 21 } 22 23 static const Property loongarch_pic_common_properties[] = { 24 DEFINE_PROP_UINT32("pch_pic_irq_num", LoongArchPICCommonState, irq_num, 0), 25 DEFINE_PROP_END_OF_LIST(), 26 }; 27 28 static const VMStateDescription vmstate_loongarch_pic_common = { 29 .name = "loongarch_pch_pic", 30 .version_id = 1, 31 .minimum_version_id = 1, 32 .fields = (const VMStateField[]) { 33 VMSTATE_UINT64(int_mask, LoongArchPICCommonState), 34 VMSTATE_UINT64(htmsi_en, LoongArchPICCommonState), 35 VMSTATE_UINT64(intedge, LoongArchPICCommonState), 36 VMSTATE_UINT64(intclr, LoongArchPICCommonState), 37 VMSTATE_UINT64(auto_crtl0, LoongArchPICCommonState), 38 VMSTATE_UINT64(auto_crtl1, LoongArchPICCommonState), 39 VMSTATE_UINT8_ARRAY(route_entry, LoongArchPICCommonState, 64), 40 VMSTATE_UINT8_ARRAY(htmsi_vector, LoongArchPICCommonState, 64), 41 VMSTATE_UINT64(last_intirr, LoongArchPICCommonState), 42 VMSTATE_UINT64(intirr, LoongArchPICCommonState), 43 VMSTATE_UINT64(intisr, LoongArchPICCommonState), 44 VMSTATE_UINT64(int_polarity, LoongArchPICCommonState), 45 VMSTATE_END_OF_LIST() 46 } 47 }; 48 49 static void loongarch_pic_common_class_init(ObjectClass *klass, void *data) 50 { 51 DeviceClass *dc = DEVICE_CLASS(klass); 52 LoongArchPICCommonClass *lpcc = LOONGARCH_PIC_COMMON_CLASS(klass); 53 54 device_class_set_parent_realize(dc, loongarch_pic_common_realize, 55 &lpcc->parent_realize); 56 device_class_set_props(dc, loongarch_pic_common_properties); 57 dc->vmsd = &vmstate_loongarch_pic_common; 58 } 59 60 static const TypeInfo loongarch_pic_common_types[] = { 61 { 62 .name = TYPE_LOONGARCH_PIC_COMMON, 63 .parent = TYPE_SYS_BUS_DEVICE, 64 .instance_size = sizeof(LoongArchPICCommonState), 65 .class_size = sizeof(LoongArchPICCommonClass), 66 .class_init = loongarch_pic_common_class_init, 67 .abstract = true, 68 } 69 }; 70 71 DEFINE_TYPES(loongarch_pic_common_types) 72