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