xref: /openbmc/qemu/hw/intc/loongarch_extioi_kvm.c (revision 8bf8814ab1aba0243127bcada19414dddbfe9e51)
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