| .. _riscv-aia: |
| |
| RISC-V AIA support for RISC-V machines |
| ====================================== |
| |
| AIA (Advanced Interrupt Architecture) support is implemented in the ``virt`` |
| RISC-V machine for TCG and KVM accelerators. |
| |
| The support consists of two main modes: |
| |
| - *aia=aplic*: adds one or more APLIC (Advanced Platform Level Interrupt Controller) devices |
| - *aia=aplic-imsic*: adds one or more APLIC device and an IMSIC (Incoming MSI Controller) device for each CPU |
| |
| From an user standpoint, these modes will behave the same regardless of the accelerator |
| used. From a developer standpoint the accelerator settings will change what it being |
| emulated in userspace versus what is being emulated by an in-kernel irqchip. |
| |
| When running TCG, all controllers are emulated in userspace, including machine mode |
| (m-mode) APLIC and IMSIC (when applicable). |
| |
| When running KVM: |
| |
| - no m-mode is provided, so there is no m-mode APLIC or IMSIC emulation regardless of |
| the AIA mode chosen |
| - with "aia=aplic", s-mode APLIC will be emulated by userspace |
| - with "aia=aplic-imsic" there are two possibilities. If no additional KVM option |
| is provided there will be no APLIC or IMSIC emulation in userspace, and the virtual |
| machine will use the provided in-kernel APLIC and IMSIC controllers. If the user |
| chooses to use the irqchip in split mode via "-accel kvm,kernel-irqchip=split", |
| s-mode APLIC will be emulated while using the s-mode IMSIC from the irqchip |
| |
| The following table summarizes how the AIA and accelerator options defines what |
| we will emulate in userspace: |
| |
| |
| .. list-table:: How AIA and accel options changes controller emulation |
| :widths: 25 25 25 25 25 25 25 |
| :header-rows: 1 |
| |
| * - Accel |
| - Accel props |
| - AIA type |
| - APLIC m-mode |
| - IMSIC m-mode |
| - APLIC s-mode |
| - IMSIC s-mode |
| * - tcg |
| - --- |
| - aplic |
| - emul |
| - n/a |
| - emul |
| - n/a |
| * - tcg |
| - --- |
| - aplic-imsic |
| - emul |
| - emul |
| - emul |
| - emul |
| * - kvm |
| - --- |
| - aplic |
| - n/a |
| - n/a |
| - emul |
| - n/a |
| * - kvm |
| - none |
| - aplic-imsic |
| - n/a |
| - n/a |
| - in-kernel |
| - in-kernel |
| * - kvm |
| - irqchip=split |
| - aplic-imsic |
| - n/a |
| - n/a |
| - emul |
| - in-kernel |
| |
| |
| KVM accel option 'riscv-aia' |
| ---------------------------- |
| |
| The KVM accelerator property 'riscv-aia' interacts with the "aia=aplic-imsic" |
| to determine how the host KVM module will provide the in-kernel IMSIC s-mode |
| controller. The 'kernel-irqchip' setting has no impact in 'riscv-aia' given |
| that any available 'kernel-irqchip' setting will always have an in-kernel |
| IMSIC s-mode. 'riscv-aia' has no impact in APLIC m-mode/s-mode and |
| IMSIC m-mode settings. |
| |
| |
| .. list-table:: How 'riscv-aia' changes in-kernel IMSIC s-mode provisioning |
| :widths: 25 25 25 25 |
| :header-rows: 1 |
| |
| * - Accel |
| - KVM riscv-aia |
| - AIA type |
| - IMSIC s-mode |
| * - kvm |
| - none |
| - aplic-imsic |
| - in-kernel, default to 'auto' |
| * - kvm |
| - auto |
| - aplic-imsic |
| - in-kernel, hwaccel if available, emul otherwise |
| * - kvm |
| - hwaccel |
| - aplic-imsic |
| - in-kernel, use IMSIC controller from guest hardware |
| * - kvm |
| - emul |
| - aplic-imsic |
| - in-kernel, IMSIC is emulated by KVM |