Files
QEMU-S5L8950X/hw/intc/loongarch_dintc_kvm.c
Yaya48 cf256aa081 Import QEMU upstream snapshot d2e570c
Upstream: https://gitlab.com/qemu-project/qemu.git

Upstream-Commit: d2e570cc0f97b936902a5b1b86b73c0f5998b475
2026-08-31 02:15:30 +02:00

49 lines
1.5 KiB
C

/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* LoongArch DINTC interrupt kvm support
*
* Copyright (C) 2025 Loongson Technology Corporation Limited
*/
#include "qemu/osdep.h"
#include "hw/intc/loongarch_dintc.h"
#include "linux/kvm.h"
#include "qapi/error.h"
#include "system/kvm.h"
void kvm_dintc_realize(DeviceState *dev, Error **errp)
{
LoongArchDINTCState *lds = LOONGARCH_DINTC(dev);
int ret;
ret = kvm_create_device(kvm_state, KVM_DEV_TYPE_LOONGARCH_DMSINTC, false);
if (ret < 0) {
fprintf(stderr, "create KVM_DEV_TYPE_LOONGARCH_AVEC failed: %s\n",
strerror(-ret));
abort();
}
lds->dev_fd = ret;
/* init dintc config */
lds->msg_addr_base = VIRT_DINTC_BASE;
lds->msg_addr_size = VIRT_DINTC_SIZE;
ret = kvm_device_access(lds->dev_fd, KVM_DEV_LOONGARCH_DMSINTC_GRP_CTRL,
KVM_DEV_LOONGARCH_DMSINTC_MSG_ADDR_BASE,
&lds->msg_addr_base, true, NULL);
if (ret < 0) {
fprintf(stderr, "KVM_DEV_LOONGARCH_DINTC_MSG_ADDR_BASE failed: %s\n",
strerror(ret));
abort();
}
ret = kvm_device_access(lds->dev_fd, KVM_DEV_LOONGARCH_DMSINTC_GRP_CTRL,
KVM_DEV_LOONGARCH_DMSINTC_MSG_ADDR_SIZE,
&lds->msg_addr_size, true, NULL);
if (ret < 0) {
fprintf(stderr, "KVM_DEV_LOONGARCH_DINTC_MSG_ADDR_SIZE failed: %s\n",
strerror(ret));
abort();
}
}