xref: /qemu/hw/intc/loongarch_extioi_common.c (revision 6b69f778176d6d00842ec4e7ac9400af1620387a)
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