master
c 48 lines 1.47 KB
Raw
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3 * LoongArch DINTC interrupt kvm support
4 *
5 * Copyright (C) 2025 Loongson Technology Corporation Limited
6 */
7
8 #include "qemu/osdep.h"
9 #include "hw/intc/loongarch_dintc.h"
10 #include "linux/kvm.h"
11 #include "qapi/error.h"
12 #include "system/kvm.h"
13
14 void kvm_dintc_realize(DeviceState *dev, Error **errp)
15 {
16 LoongArchDINTCState *lds = LOONGARCH_DINTC(dev);
17 int ret;
18
19 ret = kvm_create_device(kvm_state, KVM_DEV_TYPE_LOONGARCH_DMSINTC, false);
20 if (ret < 0) {
21 fprintf(stderr, "create KVM_DEV_TYPE_LOONGARCH_AVEC failed: %s\n",
22 strerror(-ret));
23 abort();
24 }
25 lds->dev_fd = ret;
26
27 /* init dintc config */
28 lds->msg_addr_base = VIRT_DINTC_BASE;
29 lds->msg_addr_size = VIRT_DINTC_SIZE;
30
31 ret = kvm_device_access(lds->dev_fd, KVM_DEV_LOONGARCH_DMSINTC_GRP_CTRL,
32 KVM_DEV_LOONGARCH_DMSINTC_MSG_ADDR_BASE,
33 &lds->msg_addr_base, true, NULL);
34 if (ret < 0) {
35 fprintf(stderr, "KVM_DEV_LOONGARCH_DINTC_MSG_ADDR_BASE failed: %s\n",
36 strerror(ret));
37 abort();
38 }
39
40 ret = kvm_device_access(lds->dev_fd, KVM_DEV_LOONGARCH_DMSINTC_GRP_CTRL,
41 KVM_DEV_LOONGARCH_DMSINTC_MSG_ADDR_SIZE,
42 &lds->msg_addr_size, true, NULL);
43 if (ret < 0) {
44 fprintf(stderr, "KVM_DEV_LOONGARCH_DINTC_MSG_ADDR_SIZE failed: %s\n",
45 strerror(ret));
46 abort();
47 }
48 }