/* * Accelerated irqchip abstraction * * Copyright Microsoft, Corp. 2025 * * Authors: Ziqiao Zhou * Magnus Kulke * * SPDX-License-Identifier: GPL-2.0-or-later */ #include "qemu/osdep.h" #include "hw/pci/msi.h" #include "system/kvm.h" #include "system/mshv.h" #include "system/accel-irq.h" int accel_irqchip_add_msi_route(KVMRouteChange *c, int vector, PCIDevice *dev) { #ifdef CONFIG_MSHV_IS_POSSIBLE if (mshv_msi_via_irqfd_enabled()) { return mshv_irqchip_add_msi_route(vector, dev); } #endif if (kvm_enabled()) { return kvm_irqchip_add_msi_route(c, vector, dev); } return -ENOSYS; } int accel_irqchip_update_msi_route(int vector, MSIMessage msg, PCIDevice *dev) { #ifdef CONFIG_MSHV_IS_POSSIBLE if (mshv_msi_via_irqfd_enabled()) { return mshv_irqchip_update_msi_route(vector, msg, dev); } #endif if (kvm_enabled()) { return kvm_irqchip_update_msi_route(kvm_state, vector, msg, dev); } return -ENOSYS; } void accel_irqchip_commit_route_changes(KVMRouteChange *c) { #ifdef CONFIG_MSHV_IS_POSSIBLE if (mshv_msi_via_irqfd_enabled()) { mshv_irqchip_commit_routes(); } #endif if (kvm_enabled()) { kvm_irqchip_commit_route_changes(c); } } void accel_irqchip_commit_routes(void) { #ifdef CONFIG_MSHV_IS_POSSIBLE if (mshv_msi_via_irqfd_enabled()) { mshv_irqchip_commit_routes(); } #endif if (kvm_enabled()) { kvm_irqchip_commit_routes(kvm_state); } } void accel_irqchip_release_virq(int virq) { #ifdef CONFIG_MSHV_IS_POSSIBLE if (mshv_msi_via_irqfd_enabled()) { mshv_irqchip_release_virq(virq); } #endif if (kvm_enabled()) { kvm_irqchip_release_virq(kvm_state, virq); } } int accel_irqchip_add_irqfd_notifier_gsi(EventNotifier *n, EventNotifier *rn, int virq) { #ifdef CONFIG_MSHV_IS_POSSIBLE if (mshv_msi_via_irqfd_enabled()) { return mshv_irqchip_add_irqfd_notifier_gsi(n, rn, virq); } #endif if (kvm_enabled()) { return kvm_irqchip_add_irqfd_notifier_gsi(kvm_state, n, rn, virq); } return -ENOSYS; } int accel_irqchip_remove_irqfd_notifier_gsi(EventNotifier *n, int virq) { #ifdef CONFIG_MSHV_IS_POSSIBLE if (mshv_msi_via_irqfd_enabled()) { return mshv_irqchip_remove_irqfd_notifier_gsi(n, virq); } #endif if (kvm_enabled()) { return kvm_irqchip_remove_irqfd_notifier_gsi(kvm_state, n, virq); } return -ENOSYS; }