| .. SPDX-License-Identifier: GPL-2.0 | 
 |  | 
 | =============================================== | 
 | ARM Virtual Interrupt Translation Service (ITS) | 
 | =============================================== | 
 |  | 
 | Device types supported: | 
 |   KVM_DEV_TYPE_ARM_VGIC_ITS    ARM Interrupt Translation Service Controller | 
 |  | 
 | The ITS allows MSI(-X) interrupts to be injected into guests. This extension is | 
 | optional.  Creating a virtual ITS controller also requires a host GICv3 (see | 
 | arm-vgic-v3.txt), but does not depend on having physical ITS controllers. | 
 |  | 
 | There can be multiple ITS controllers per guest, each of them has to have | 
 | a separate, non-overlapping MMIO region. | 
 |  | 
 |  | 
 | Groups | 
 | ====== | 
 |  | 
 | KVM_DEV_ARM_VGIC_GRP_ADDR | 
 | ------------------------- | 
 |  | 
 |   Attributes: | 
 |     KVM_VGIC_ITS_ADDR_TYPE (rw, 64-bit) | 
 |       Base address in the guest physical address space of the GICv3 ITS | 
 |       control register frame. | 
 |       This address needs to be 64K aligned and the region covers 128K. | 
 |  | 
 |   Errors: | 
 |  | 
 |     =======  ================================================= | 
 |     -E2BIG   Address outside of addressable IPA range | 
 |     -EINVAL  Incorrectly aligned address | 
 |     -EEXIST  Address already configured | 
 |     -EFAULT  Invalid user pointer for attr->addr. | 
 |     -ENODEV  Incorrect attribute or the ITS is not supported. | 
 |     =======  ================================================= | 
 |  | 
 |  | 
 | KVM_DEV_ARM_VGIC_GRP_CTRL | 
 | ------------------------- | 
 |  | 
 |   Attributes: | 
 |     KVM_DEV_ARM_VGIC_CTRL_INIT | 
 |       request the initialization of the ITS, no additional parameter in | 
 |       kvm_device_attr.addr. | 
 |  | 
 |     KVM_DEV_ARM_ITS_CTRL_RESET | 
 |       reset the ITS, no additional parameter in kvm_device_attr.addr. | 
 |       See "ITS Reset State" section. | 
 |  | 
 |     KVM_DEV_ARM_ITS_SAVE_TABLES | 
 |       save the ITS table data into guest RAM, at the location provisioned | 
 |       by the guest in corresponding registers/table entries. Should userspace | 
 |       require a form of dirty tracking to identify which pages are modified | 
 |       by the saving process, it should use a bitmap even if using another | 
 |       mechanism to track the memory dirtied by the vCPUs. | 
 |  | 
 |       The layout of the tables in guest memory defines an ABI. The entries | 
 |       are laid out in little endian format as described in the last paragraph. | 
 |  | 
 |     KVM_DEV_ARM_ITS_RESTORE_TABLES | 
 |       restore the ITS tables from guest RAM to ITS internal structures. | 
 |  | 
 |       The GICV3 must be restored before the ITS and all ITS registers but | 
 |       the GITS_CTLR must be restored before restoring the ITS tables. | 
 |  | 
 |       The GITS_IIDR read-only register must also be restored before | 
 |       calling KVM_DEV_ARM_ITS_RESTORE_TABLES as the IIDR revision field | 
 |       encodes the ABI revision. | 
 |  | 
 |       The expected ordering when restoring the GICv3/ITS is described in section | 
 |       "ITS Restore Sequence". | 
 |  | 
 |   Errors: | 
 |  | 
 |     =======  ========================================================== | 
 |      -ENXIO  ITS not properly configured as required prior to setting | 
 |              this attribute | 
 |     -ENOMEM  Memory shortage when allocating ITS internal data | 
 |     -EINVAL  Inconsistent restored data | 
 |     -EFAULT  Invalid guest ram access | 
 |     -EBUSY   One or more VCPUS are running | 
 |     -EACCES  The virtual ITS is backed by a physical GICv4 ITS, and the | 
 | 	     state is not available without GICv4.1 | 
 |     =======  ========================================================== | 
 |  | 
 | KVM_DEV_ARM_VGIC_GRP_ITS_REGS | 
 | ----------------------------- | 
 |  | 
 |   Attributes: | 
 |       The attr field of kvm_device_attr encodes the offset of the | 
 |       ITS register, relative to the ITS control frame base address | 
 |       (ITS_base). | 
 |  | 
 |       kvm_device_attr.addr points to a __u64 value whatever the width | 
 |       of the addressed register (32/64 bits). 64 bit registers can only | 
 |       be accessed with full length. | 
 |  | 
 |       Writes to read-only registers are ignored by the kernel except for: | 
 |  | 
 |       - GITS_CREADR. It must be restored otherwise commands in the queue | 
 |         will be re-executed after restoring CWRITER. GITS_CREADR must be | 
 |         restored before restoring the GITS_CTLR which is likely to enable the | 
 |         ITS. Also it must be restored after GITS_CBASER since a write to | 
 |         GITS_CBASER resets GITS_CREADR. | 
 |       - GITS_IIDR. The Revision field encodes the table layout ABI revision. | 
 |         In the future we might implement direct injection of virtual LPIs. | 
 |         This will require an upgrade of the table layout and an evolution of | 
 |         the ABI. GITS_IIDR must be restored before calling | 
 |         KVM_DEV_ARM_ITS_RESTORE_TABLES. | 
 |  | 
 |       For other registers, getting or setting a register has the same | 
 |       effect as reading/writing the register on real hardware. | 
 |  | 
 |   Errors: | 
 |  | 
 |     =======  ==================================================== | 
 |     -ENXIO   Offset does not correspond to any supported register | 
 |     -EFAULT  Invalid user pointer for attr->addr | 
 |     -EINVAL  Offset is not 64-bit aligned | 
 |     -EBUSY   one or more VCPUS are running | 
 |     =======  ==================================================== | 
 |  | 
 | ITS Restore Sequence: | 
 | --------------------- | 
 |  | 
 | The following ordering must be followed when restoring the GIC and the ITS: | 
 |  | 
 | a) restore all guest memory and create vcpus | 
 | b) restore all redistributors | 
 | c) provide the ITS base address | 
 |    (KVM_DEV_ARM_VGIC_GRP_ADDR) | 
 | d) restore the ITS in the following order: | 
 |  | 
 |      1. Restore GITS_CBASER | 
 |      2. Restore all other ``GITS_`` registers, except GITS_CTLR! | 
 |      3. Load the ITS table data (KVM_DEV_ARM_ITS_RESTORE_TABLES) | 
 |      4. Restore GITS_CTLR | 
 |  | 
 | Then vcpus can be started. | 
 |  | 
 | ITS Table ABI REV0: | 
 | ------------------- | 
 |  | 
 |  Revision 0 of the ABI only supports the features of a virtual GICv3, and does | 
 |  not support a virtual GICv4 with support for direct injection of virtual | 
 |  interrupts for nested hypervisors. | 
 |  | 
 |  The device table and ITT are indexed by the DeviceID and EventID, | 
 |  respectively. The collection table is not indexed by CollectionID, and the | 
 |  entries in the collection are listed in no particular order. | 
 |  All entries are 8 bytes. | 
 |  | 
 |  Device Table Entry (DTE):: | 
 |  | 
 |    bits:     | 63| 62 ... 49 | 48 ... 5 | 4 ... 0 | | 
 |    values:   | V |   next    | ITT_addr |  Size   | | 
 |  | 
 |  where: | 
 |  | 
 |  - V indicates whether the entry is valid. If not, other fields | 
 |    are not meaningful. | 
 |  - next: equals to 0 if this entry is the last one; otherwise it | 
 |    corresponds to the DeviceID offset to the next DTE, capped by | 
 |    2^14 -1. | 
 |  - ITT_addr matches bits [51:8] of the ITT address (256 Byte aligned). | 
 |  - Size specifies the supported number of bits for the EventID, | 
 |    minus one | 
 |  | 
 |  Collection Table Entry (CTE):: | 
 |  | 
 |    bits:     | 63| 62 ..  52  | 51 ... 16 | 15  ...   0 | | 
 |    values:   | V |    RES0    |  RDBase   |    ICID     | | 
 |  | 
 |  where: | 
 |  | 
 |  - V indicates whether the entry is valid. If not, other fields are | 
 |    not meaningful. | 
 |  - RES0: reserved field with Should-Be-Zero-or-Preserved behavior. | 
 |  - RDBase is the PE number (GICR_TYPER.Processor_Number semantic), | 
 |  - ICID is the collection ID | 
 |  | 
 |  Interrupt Translation Entry (ITE):: | 
 |  | 
 |    bits:     | 63 ... 48 | 47 ... 16 | 15 ... 0 | | 
 |    values:   |    next   |   pINTID  |  ICID    | | 
 |  | 
 |  where: | 
 |  | 
 |  - next: equals to 0 if this entry is the last one; otherwise it corresponds | 
 |    to the EventID offset to the next ITE capped by 2^16 -1. | 
 |  - pINTID is the physical LPI ID; if zero, it means the entry is not valid | 
 |    and other fields are not meaningful. | 
 |  - ICID is the collection ID | 
 |  | 
 | ITS Reset State: | 
 | ---------------- | 
 |  | 
 | RESET returns the ITS to the same state that it was when first created and | 
 | initialized. When the RESET command returns, the following things are | 
 | guaranteed: | 
 |  | 
 | - The ITS is not enabled and quiescent | 
 |   GITS_CTLR.Enabled = 0 .Quiescent=1 | 
 | - There is no internally cached state | 
 | - No collection or device table are used | 
 |   GITS_BASER<n>.Valid = 0 | 
 | - GITS_CBASER = 0, GITS_CREADR = 0, GITS_CWRITER = 0 | 
 | - The ABI version is unchanged and remains the one set when the ITS | 
 |   device was first created. |