[PATCH] KVM: aia: skip silicon ID cap in EMUL mode
From: Jun Sun
Date: Tue Jun 09 2026 - 14:42:00 EST
EMUL mode uses swfile MRIF in software, not the silicon vsfile, so
the per-vsfile ID limit (kvm_riscv_aia_max_ids) shouldn't gate
the maximum IDs userspace can request. Allow up to KVM_DEV_RISCV_AIA_IDS_MAX
in EMUL mode; HWACCEL/AUTO still enforce the silicon cap.
---
arch/riscv/kvm/aia_device.c | 23 +++++++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/arch/riscv/kvm/aia_device.c b/arch/riscv/kvm/aia_device.c
index b195a93add1c..575f860e1dad 100644
--- a/arch/riscv/kvm/aia_device.c
+++ b/arch/riscv/kvm/aia_device.c
@@ -82,8 +82,16 @@ static int aia_config(struct kvm *kvm, unsigned long type,
if ((*nr < KVM_DEV_RISCV_AIA_IDS_MIN) ||
(*nr >= KVM_DEV_RISCV_AIA_IDS_MAX) ||
((*nr & KVM_DEV_RISCV_AIA_IDS_MIN) !=
- KVM_DEV_RISCV_AIA_IDS_MIN) ||
- (kvm_riscv_aia_max_ids <= *nr))
+ KVM_DEV_RISCV_AIA_IDS_MIN))
+ return -EINVAL;
+ /*
+ * kvm_riscv_aia_max_ids reflects the per-vsfile
+ * silicon limit, which only applies in HWACCEL
+ * mode. EMUL uses swfile, and AUTO is reconciled
+ * later during init, so neither gates here.
+ */
+ if (aia->mode == KVM_DEV_RISCV_AIA_MODE_HWACCEL &&
+ kvm_riscv_aia_max_ids <= *nr)
return -EINVAL;
aia->nr_ids = *nr;
} else
@@ -91,8 +99,15 @@ static int aia_config(struct kvm *kvm, unsigned long type,
break;
case KVM_DEV_RISCV_AIA_CONFIG_SRCS:
if (write) {
- if ((*nr >= KVM_DEV_RISCV_AIA_SRCS_MAX) ||
- (*nr >= kvm_riscv_aia_max_ids))
+ if (*nr >= KVM_DEV_RISCV_AIA_SRCS_MAX)
+ return -EINVAL;
+ /*
+ * Same rationale as CONFIG_IDS: the silicon
+ * per-vsfile cap only applies in HWACCEL mode.
+ * EMUL uses swfile; AUTO is reconciled at init.
+ */
+ if (aia->mode == KVM_DEV_RISCV_AIA_MODE_HWACCEL &&
+ *nr >= kvm_riscv_aia_max_ids)
return -EINVAL;
aia->nr_sources = *nr;
} else
--
2.34.1