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