1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Loongson extioi interrupt controller emulation 4 * Copyright (C) 2024 Loongson Technology Corporation Limited 5 */ 6 7 static void loongarch_extioi_common_realize(DeviceState *dev, Error **errp) 8 { 9 LoongArchExtIOICommonState *s = (LoongArchExtIOICommonState *)dev; 10 11 if (s->num_cpu == 0) { 12 error_setg(errp, "num-cpu must be at least 1"); 13 return; 14 } 15 } 16 17 static int loongarch_extioi_common_post_load(void *opaque, int version_id) 18 { 19 return vmstate_extioi_post_load(opaque, version_id); 20 } 21 22 static const VMStateDescription vmstate_extioi_core = { 23 .name = "extioi-core", 24 .version_id = 1, 25 .minimum_version_id = 1, 26 .fields = (const VMStateField[]) { 27 VMSTATE_UINT32_ARRAY(coreisr, ExtIOICore, EXTIOI_IRQS_GROUP_COUNT), 28 VMSTATE_END_OF_LIST() 29 } 30 }; 31 32 static const VMStateDescription vmstate_loongarch_extioi = { 33 .name = "loongarch.extioi", 34 .version_id = 3, 35 .minimum_version_id = 3, 36 .post_load = loongarch_extioi_common_post_load, 37 .fields = (const VMStateField[]) { 38 VMSTATE_UINT32_ARRAY(bounce, LoongArchExtIOICommonState, 39 EXTIOI_IRQS_GROUP_COUNT), 40 VMSTATE_UINT32_ARRAY(nodetype, LoongArchExtIOICommonState, 41 EXTIOI_IRQS_NODETYPE_COUNT / 2), 42 VMSTATE_UINT32_ARRAY(enable, LoongArchExtIOICommonState, 43 EXTIOI_IRQS / 32), 44 VMSTATE_UINT32_ARRAY(isr, LoongArchExtIOICommonState, 45 EXTIOI_IRQS / 32), 46 VMSTATE_UINT32_ARRAY(ipmap, LoongArchExtIOICommonState, 47 EXTIOI_IRQS_IPMAP_SIZE / 4), 48 VMSTATE_UINT32_ARRAY(coremap, LoongArchExtIOICommonState, 49 EXTIOI_IRQS / 4), 50 VMSTATE_STRUCT_VARRAY_POINTER_UINT32(cpu, LoongArchExtIOICommonState, 51 num_cpu, vmstate_extioi_core, ExtIOICore), 52 VMSTATE_UINT32(features, LoongArchExtIOICommonState), 53 VMSTATE_UINT32(status, LoongArchExtIOICommonState), 54 VMSTATE_END_OF_LIST() 55 } 56 }; 57 58 static const Property extioi_properties[] = { 59 DEFINE_PROP_UINT32("num-cpu", LoongArchExtIOICommonState, num_cpu, 1), 60 DEFINE_PROP_BIT("has-virtualization-extension", LoongArchExtIOICommonState, 61 features, EXTIOI_HAS_VIRT_EXTENSION, 0), 62 DEFINE_PROP_END_OF_LIST(), 63 }; 64