7b46b6169a
This control will be used by the H_INT_SYNC hcall from QEMU to flush event notifications on the XIVE IC owning the source. Signed-off-by: Cédric Le Goater <clg@kaod.org> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
103 lines
3.5 KiB
Plaintext
103 lines
3.5 KiB
Plaintext
POWER9 eXternal Interrupt Virtualization Engine (XIVE Gen1)
|
|
==========================================================
|
|
|
|
Device types supported:
|
|
KVM_DEV_TYPE_XIVE POWER9 XIVE Interrupt Controller generation 1
|
|
|
|
This device acts as a VM interrupt controller. It provides the KVM
|
|
interface to configure the interrupt sources of a VM in the underlying
|
|
POWER9 XIVE interrupt controller.
|
|
|
|
Only one XIVE instance may be instantiated. A guest XIVE device
|
|
requires a POWER9 host and the guest OS should have support for the
|
|
XIVE native exploitation interrupt mode. If not, it should run using
|
|
the legacy interrupt mode, referred as XICS (POWER7/8).
|
|
|
|
* Groups:
|
|
|
|
1. KVM_DEV_XIVE_GRP_CTRL
|
|
Provides global controls on the device
|
|
Attributes:
|
|
1.1 KVM_DEV_XIVE_RESET (write only)
|
|
Resets the interrupt controller configuration for sources and event
|
|
queues. To be used by kexec and kdump.
|
|
Errors: none
|
|
|
|
2. KVM_DEV_XIVE_GRP_SOURCE (write only)
|
|
Initializes a new source in the XIVE device and mask it.
|
|
Attributes:
|
|
Interrupt source number (64-bit)
|
|
The kvm_device_attr.addr points to a __u64 value:
|
|
bits: | 63 .... 2 | 1 | 0
|
|
values: | unused | level | type
|
|
- type: 0:MSI 1:LSI
|
|
- level: assertion level in case of an LSI.
|
|
Errors:
|
|
-E2BIG: Interrupt source number is out of range
|
|
-ENOMEM: Could not create a new source block
|
|
-EFAULT: Invalid user pointer for attr->addr.
|
|
-ENXIO: Could not allocate underlying HW interrupt
|
|
|
|
3. KVM_DEV_XIVE_GRP_SOURCE_CONFIG (write only)
|
|
Configures source targeting
|
|
Attributes:
|
|
Interrupt source number (64-bit)
|
|
The kvm_device_attr.addr points to a __u64 value:
|
|
bits: | 63 .... 33 | 32 | 31 .. 3 | 2 .. 0
|
|
values: | eisn | mask | server | priority
|
|
- priority: 0-7 interrupt priority level
|
|
- server: CPU number chosen to handle the interrupt
|
|
- mask: mask flag (unused)
|
|
- eisn: Effective Interrupt Source Number
|
|
Errors:
|
|
-ENOENT: Unknown source number
|
|
-EINVAL: Not initialized source number
|
|
-EINVAL: Invalid priority
|
|
-EINVAL: Invalid CPU number.
|
|
-EFAULT: Invalid user pointer for attr->addr.
|
|
-ENXIO: CPU event queues not configured or configuration of the
|
|
underlying HW interrupt failed
|
|
-EBUSY: No CPU available to serve interrupt
|
|
|
|
4. KVM_DEV_XIVE_GRP_EQ_CONFIG (read-write)
|
|
Configures an event queue of a CPU
|
|
Attributes:
|
|
EQ descriptor identifier (64-bit)
|
|
The EQ descriptor identifier is a tuple (server, priority) :
|
|
bits: | 63 .... 32 | 31 .. 3 | 2 .. 0
|
|
values: | unused | server | priority
|
|
The kvm_device_attr.addr points to :
|
|
struct kvm_ppc_xive_eq {
|
|
__u32 flags;
|
|
__u32 qshift;
|
|
__u64 qaddr;
|
|
__u32 qtoggle;
|
|
__u32 qindex;
|
|
__u8 pad[40];
|
|
};
|
|
- flags: queue flags
|
|
KVM_XIVE_EQ_ALWAYS_NOTIFY (required)
|
|
forces notification without using the coalescing mechanism
|
|
provided by the XIVE END ESBs.
|
|
- qshift: queue size (power of 2)
|
|
- qaddr: real address of queue
|
|
- qtoggle: current queue toggle bit
|
|
- qindex: current queue index
|
|
- pad: reserved for future use
|
|
Errors:
|
|
-ENOENT: Invalid CPU number
|
|
-EINVAL: Invalid priority
|
|
-EINVAL: Invalid flags
|
|
-EINVAL: Invalid queue size
|
|
-EINVAL: Invalid queue address
|
|
-EFAULT: Invalid user pointer for attr->addr.
|
|
-EIO: Configuration of the underlying HW failed
|
|
|
|
5. KVM_DEV_XIVE_GRP_SOURCE_SYNC (write only)
|
|
Synchronize the source to flush event notifications
|
|
Attributes:
|
|
Interrupt source number (64-bit)
|
|
Errors:
|
|
-ENOENT: Unknown source number
|
|
-EINVAL: Not initialized source number
|