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