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