1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * LoongArch EXTIOI interrupt kvm support 4 * 5 * Copyright (C) 2025 Loongson Technology Corporation Limited 6 */ 7 8 #include "qemu/osdep.h" 9 #include "qemu/typedefs.h" 10 #include "hw/intc/loongarch_extioi.h" 11 #include "linux/kvm.h" 12 #include "qapi/error.h" 13 #include "system/kvm.h" 14 15 void kvm_extioi_realize(DeviceState *dev, Error **errp) 16 { 17 LoongArchExtIOICommonState *lecs = LOONGARCH_EXTIOI_COMMON(dev); 18 LoongArchExtIOIState *les = LOONGARCH_EXTIOI(dev); 19 int ret; 20 21 ret = kvm_create_device(kvm_state, KVM_DEV_TYPE_LOONGARCH_EIOINTC, false); 22 if (ret < 0) { 23 fprintf(stderr, "create KVM_LOONGARCH_EIOINTC failed: %s\n", 24 strerror(-ret)); 25 abort(); 26 } 27 28 les->dev_fd = ret; 29 ret = kvm_device_access(les->dev_fd, KVM_DEV_LOONGARCH_EXTIOI_GRP_CTRL, 30 KVM_DEV_LOONGARCH_EXTIOI_CTRL_INIT_NUM_CPU, 31 &lecs->num_cpu, true, NULL); 32 if (ret < 0) { 33 fprintf(stderr, "KVM_LOONGARCH_EXTIOI_INIT_NUM_CPU failed: %s\n", 34 strerror(-ret)); 35 abort(); 36 } 37 38 ret = kvm_device_access(les->dev_fd, KVM_DEV_LOONGARCH_EXTIOI_GRP_CTRL, 39 KVM_DEV_LOONGARCH_EXTIOI_CTRL_INIT_FEATURE, 40 &lecs->features, true, NULL); 41 if (ret < 0) { 42 fprintf(stderr, "KVM_LOONGARCH_EXTIOI_INIT_FEATURE failed: %s\n", 43 strerror(-ret)); 44 abort(); 45 } 46 } 47