515 lines
19 KiB
Diff
515 lines
19 KiB
Diff
|
|
From ac715e361fdb6d92169b3b3f5964405c816a13ac Mon Sep 17 00:00:00 2001
|
||
|
|
From: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||
|
|
Date: Tue, 14 Jan 2025 10:29:24 +0000
|
||
|
|
Subject: [PATCH] Update iommufd.h header for vSVA
|
||
|
|
|
||
|
|
This is based on Linaro UADK branch:
|
||
|
|
https://github.com/Linaro/linux-kernel-uadk/tree/6.12-wip-10.26
|
||
|
|
|
||
|
|
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||
|
|
---
|
||
|
|
linux-headers/linux/iommufd.h | 394 ++++++++++++++++++++++++++++++++--
|
||
|
|
1 file changed, 371 insertions(+), 23 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/linux-headers/linux/iommufd.h b/linux-headers/linux/iommufd.h
|
||
|
|
index 806d98d09c..41559c6064 100644
|
||
|
|
--- a/linux-headers/linux/iommufd.h
|
||
|
|
+++ b/linux-headers/linux/iommufd.h
|
||
|
|
@@ -37,18 +37,22 @@
|
||
|
|
enum {
|
||
|
|
IOMMUFD_CMD_BASE = 0x80,
|
||
|
|
IOMMUFD_CMD_DESTROY = IOMMUFD_CMD_BASE,
|
||
|
|
- IOMMUFD_CMD_IOAS_ALLOC,
|
||
|
|
- IOMMUFD_CMD_IOAS_ALLOW_IOVAS,
|
||
|
|
- IOMMUFD_CMD_IOAS_COPY,
|
||
|
|
- IOMMUFD_CMD_IOAS_IOVA_RANGES,
|
||
|
|
- IOMMUFD_CMD_IOAS_MAP,
|
||
|
|
- IOMMUFD_CMD_IOAS_UNMAP,
|
||
|
|
- IOMMUFD_CMD_OPTION,
|
||
|
|
- IOMMUFD_CMD_VFIO_IOAS,
|
||
|
|
- IOMMUFD_CMD_HWPT_ALLOC,
|
||
|
|
- IOMMUFD_CMD_GET_HW_INFO,
|
||
|
|
- IOMMUFD_CMD_HWPT_SET_DIRTY_TRACKING,
|
||
|
|
- IOMMUFD_CMD_HWPT_GET_DIRTY_BITMAP,
|
||
|
|
+ IOMMUFD_CMD_IOAS_ALLOC = 0x81,
|
||
|
|
+ IOMMUFD_CMD_IOAS_ALLOW_IOVAS = 0x82,
|
||
|
|
+ IOMMUFD_CMD_IOAS_COPY = 0x83,
|
||
|
|
+ IOMMUFD_CMD_IOAS_IOVA_RANGES = 0x84,
|
||
|
|
+ IOMMUFD_CMD_IOAS_MAP = 0x85,
|
||
|
|
+ IOMMUFD_CMD_IOAS_UNMAP = 0x86,
|
||
|
|
+ IOMMUFD_CMD_OPTION = 0x87,
|
||
|
|
+ IOMMUFD_CMD_VFIO_IOAS = 0x88,
|
||
|
|
+ IOMMUFD_CMD_HWPT_ALLOC = 0x89,
|
||
|
|
+ IOMMUFD_CMD_GET_HW_INFO = 0x8a,
|
||
|
|
+ IOMMUFD_CMD_HWPT_SET_DIRTY_TRACKING = 0x8b,
|
||
|
|
+ IOMMUFD_CMD_HWPT_GET_DIRTY_BITMAP = 0x8c,
|
||
|
|
+ IOMMUFD_CMD_HWPT_INVALIDATE = 0x8d,
|
||
|
|
+ IOMMUFD_CMD_FAULT_QUEUE_ALLOC = 0x8e,
|
||
|
|
+ IOMMUFD_CMD_VIOMMU_ALLOC = 0x8f,
|
||
|
|
+ IOMMUFD_CMD_VDEVICE_ALLOC = 0x90,
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
@@ -355,10 +359,13 @@ struct iommu_vfio_ioas {
|
||
|
|
* the parent HWPT in a nesting configuration.
|
||
|
|
* @IOMMU_HWPT_ALLOC_DIRTY_TRACKING: Dirty tracking support for device IOMMU is
|
||
|
|
* enforced on device attachment
|
||
|
|
+ * @IOMMU_HWPT_FAULT_ID_VALID: The fault_id field of hwpt allocation data is
|
||
|
|
+ * valid.
|
||
|
|
*/
|
||
|
|
enum iommufd_hwpt_alloc_flags {
|
||
|
|
IOMMU_HWPT_ALLOC_NEST_PARENT = 1 << 0,
|
||
|
|
IOMMU_HWPT_ALLOC_DIRTY_TRACKING = 1 << 1,
|
||
|
|
+ IOMMU_HWPT_FAULT_ID_VALID = 1 << 2,
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
@@ -389,14 +396,34 @@ struct iommu_hwpt_vtd_s1 {
|
||
|
|
__u32 __reserved;
|
||
|
|
};
|
||
|
|
|
||
|
|
+/**
|
||
|
|
+ * struct iommu_hwpt_arm_smmuv3 - ARM SMMUv3 Context Descriptor Table info
|
||
|
|
+ * (IOMMU_HWPT_DATA_ARM_SMMUV3)
|
||
|
|
+ *
|
||
|
|
+ * @ste: The first two double words of the user space Stream Table Entry for
|
||
|
|
+ * a user stage-1 Context Descriptor Table. Must be little-endian.
|
||
|
|
+ * Allowed fields: (Refer to "5.2 Stream Table Entry" in SMMUv3 HW Spec)
|
||
|
|
+ * - word-0: V, Cfg, S1Fmt, S1ContextPtr, S1CDMax
|
||
|
|
+ * - word-1: EATS, S1DSS, S1CIR, S1COR, S1CSH, S1STALLD
|
||
|
|
+ *
|
||
|
|
+ * -EIO will be returned if @ste is not legal or contains any non-allowed field.
|
||
|
|
+ * Cfg can be used to select a S1, Bypass or Abort configuration. A Bypass
|
||
|
|
+ * nested domain will translate the same as the nesting parent.
|
||
|
|
+ */
|
||
|
|
+struct iommu_hwpt_arm_smmuv3 {
|
||
|
|
+ __aligned_le64 ste[2];
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
/**
|
||
|
|
* enum iommu_hwpt_data_type - IOMMU HWPT Data Type
|
||
|
|
* @IOMMU_HWPT_DATA_NONE: no data
|
||
|
|
* @IOMMU_HWPT_DATA_VTD_S1: Intel VT-d stage-1 page table
|
||
|
|
+ * @IOMMU_HWPT_DATA_ARM_SMMUV3: ARM SMMUv3 Context Descriptor Table
|
||
|
|
*/
|
||
|
|
enum iommu_hwpt_data_type {
|
||
|
|
- IOMMU_HWPT_DATA_NONE,
|
||
|
|
- IOMMU_HWPT_DATA_VTD_S1,
|
||
|
|
+ IOMMU_HWPT_DATA_NONE = 0,
|
||
|
|
+ IOMMU_HWPT_DATA_VTD_S1 = 1,
|
||
|
|
+ IOMMU_HWPT_DATA_ARM_SMMUV3 = 2,
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
@@ -404,12 +431,15 @@ enum iommu_hwpt_data_type {
|
||
|
|
* @size: sizeof(struct iommu_hwpt_alloc)
|
||
|
|
* @flags: Combination of enum iommufd_hwpt_alloc_flags
|
||
|
|
* @dev_id: The device to allocate this HWPT for
|
||
|
|
- * @pt_id: The IOAS or HWPT to connect this HWPT to
|
||
|
|
+ * @pt_id: The IOAS or HWPT or vIOMMU to connect this HWPT to
|
||
|
|
* @out_hwpt_id: The ID of the new HWPT
|
||
|
|
* @__reserved: Must be 0
|
||
|
|
* @data_type: One of enum iommu_hwpt_data_type
|
||
|
|
* @data_len: Length of the type specific data
|
||
|
|
* @data_uptr: User pointer to the type specific data
|
||
|
|
+ * @fault_id: The ID of IOMMUFD_FAULT object. Valid only if flags field of
|
||
|
|
+ * IOMMU_HWPT_FAULT_ID_VALID is set.
|
||
|
|
+ * @__reserved2: Padding to 64-bit alignment. Must be 0.
|
||
|
|
*
|
||
|
|
* Explicitly allocate a hardware page table object. This is the same object
|
||
|
|
* type that is returned by iommufd_device_attach() and represents the
|
||
|
|
@@ -420,11 +450,13 @@ enum iommu_hwpt_data_type {
|
||
|
|
* IOMMU_HWPT_DATA_NONE. The HWPT can be allocated as a parent HWPT for a
|
||
|
|
* nesting configuration by passing IOMMU_HWPT_ALLOC_NEST_PARENT via @flags.
|
||
|
|
*
|
||
|
|
- * A user-managed nested HWPT will be created from a given parent HWPT via
|
||
|
|
- * @pt_id, in which the parent HWPT must be allocated previously via the
|
||
|
|
- * same ioctl from a given IOAS (@pt_id). In this case, the @data_type
|
||
|
|
- * must be set to a pre-defined type corresponding to an I/O page table
|
||
|
|
- * type supported by the underlying IOMMU hardware.
|
||
|
|
+ * A user-managed nested HWPT will be created from a given vIOMMU (wrapping a
|
||
|
|
+ * parent HWPT) or a parent HWPT via @pt_id, in which the parent HWPT must be
|
||
|
|
+ * allocated previously via the same ioctl from a given IOAS (@pt_id). In this
|
||
|
|
+ * case, the @data_type must be set to a pre-defined type corresponding to an
|
||
|
|
+ * I/O page table type supported by the underlying IOMMU hardware. The device
|
||
|
|
+ * via @dev_id and the vIOMMU via @pt_id must be associated to the same IOMMU
|
||
|
|
+ * instance.
|
||
|
|
*
|
||
|
|
* If the @data_type is set to IOMMU_HWPT_DATA_NONE, @data_len and
|
||
|
|
* @data_uptr should be zero. Otherwise, both @data_len and @data_uptr
|
||
|
|
@@ -440,6 +472,8 @@ struct iommu_hwpt_alloc {
|
||
|
|
__u32 data_type;
|
||
|
|
__u32 data_len;
|
||
|
|
__aligned_u64 data_uptr;
|
||
|
|
+ __u32 fault_id;
|
||
|
|
+ __u32 __reserved2;
|
||
|
|
};
|
||
|
|
#define IOMMU_HWPT_ALLOC _IO(IOMMUFD_TYPE, IOMMUFD_CMD_HWPT_ALLOC)
|
||
|
|
|
||
|
|
@@ -474,15 +508,50 @@ struct iommu_hw_info_vtd {
|
||
|
|
__aligned_u64 ecap_reg;
|
||
|
|
};
|
||
|
|
|
||
|
|
+/**
|
||
|
|
+ * struct iommu_hw_info_arm_smmuv3 - ARM SMMUv3 hardware information
|
||
|
|
+ * (IOMMU_HW_INFO_TYPE_ARM_SMMUV3)
|
||
|
|
+ *
|
||
|
|
+ * @flags: Must be set to 0
|
||
|
|
+ * @__reserved: Must be 0
|
||
|
|
+ * @idr: Implemented features for ARM SMMU Non-secure programming interface
|
||
|
|
+ * @iidr: Information about the implementation and implementer of ARM SMMU,
|
||
|
|
+ * and architecture version supported
|
||
|
|
+ * @aidr: ARM SMMU architecture version
|
||
|
|
+ *
|
||
|
|
+ * For the details of @idr, @iidr and @aidr, please refer to the chapters
|
||
|
|
+ * from 6.3.1 to 6.3.6 in the SMMUv3 Spec.
|
||
|
|
+ *
|
||
|
|
+ * User space should read the underlying ARM SMMUv3 hardware information for
|
||
|
|
+ * the list of supported features.
|
||
|
|
+ *
|
||
|
|
+ * Note that these values reflect the raw HW capability, without any insight if
|
||
|
|
+ * any required kernel driver support is present. Bits may be set indicating the
|
||
|
|
+ * HW has functionality that is lacking kernel software support, such as BTM. If
|
||
|
|
+ * a VMM is using this information to construct emulated copies of these
|
||
|
|
+ * registers it should only forward bits that it knows it can support.
|
||
|
|
+ *
|
||
|
|
+ * In future, presence of required kernel support will be indicated in flags.
|
||
|
|
+ */
|
||
|
|
+struct iommu_hw_info_arm_smmuv3 {
|
||
|
|
+ __u32 flags;
|
||
|
|
+ __u32 __reserved;
|
||
|
|
+ __u32 idr[6];
|
||
|
|
+ __u32 iidr;
|
||
|
|
+ __u32 aidr;
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
/**
|
||
|
|
* enum iommu_hw_info_type - IOMMU Hardware Info Types
|
||
|
|
* @IOMMU_HW_INFO_TYPE_NONE: Used by the drivers that do not report hardware
|
||
|
|
* info
|
||
|
|
* @IOMMU_HW_INFO_TYPE_INTEL_VTD: Intel VT-d iommu info type
|
||
|
|
+ * @IOMMU_HW_INFO_TYPE_ARM_SMMUV3: ARM SMMUv3 iommu info type
|
||
|
|
*/
|
||
|
|
enum iommu_hw_info_type {
|
||
|
|
- IOMMU_HW_INFO_TYPE_NONE,
|
||
|
|
- IOMMU_HW_INFO_TYPE_INTEL_VTD,
|
||
|
|
+ IOMMU_HW_INFO_TYPE_NONE = 0,
|
||
|
|
+ IOMMU_HW_INFO_TYPE_INTEL_VTD = 1,
|
||
|
|
+ IOMMU_HW_INFO_TYPE_ARM_SMMUV3 = 2,
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
@@ -494,9 +563,17 @@ enum iommu_hw_info_type {
|
||
|
|
* IOMMU_HWPT_GET_DIRTY_BITMAP
|
||
|
|
* IOMMU_HWPT_SET_DIRTY_TRACKING
|
||
|
|
*
|
||
|
|
+ * @IOMMU_HW_CAP_PASID_EXEC: Execute Permission Supported, user ignores it
|
||
|
|
+ * when the struct iommu_hw_info::out_max_pasid_log2
|
||
|
|
+ * is zero.
|
||
|
|
+ * @IOMMU_HW_CAP_PASID_PRIV: Privileged Mode Supported, user ignores it
|
||
|
|
+ * when the struct iommu_hw_info::out_max_pasid_log2
|
||
|
|
+ * is zero.
|
||
|
|
*/
|
||
|
|
enum iommufd_hw_capabilities {
|
||
|
|
IOMMU_HW_CAP_DIRTY_TRACKING = 1 << 0,
|
||
|
|
+ IOMMU_HW_CAP_PCI_PASID_EXEC = 1 << 1,
|
||
|
|
+ IOMMU_HW_CAP_PCI_PASID_PRIV = 1 << 2,
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
@@ -512,6 +589,9 @@ enum iommufd_hw_capabilities {
|
||
|
|
* iommu_hw_info_type.
|
||
|
|
* @out_capabilities: Output the generic iommu capability info type as defined
|
||
|
|
* in the enum iommu_hw_capabilities.
|
||
|
|
+ * @out_max_pasid_log2: Output the width of PASIDs. 0 means no PASID support.
|
||
|
|
+ * PCI devices turn to out_capabilities to check if the
|
||
|
|
+ * specific capabilities is supported or not.
|
||
|
|
* @__reserved: Must be 0
|
||
|
|
*
|
||
|
|
* Query an iommu type specific hardware information data from an iommu behind
|
||
|
|
@@ -535,7 +615,8 @@ struct iommu_hw_info {
|
||
|
|
__u32 data_len;
|
||
|
|
__aligned_u64 data_uptr;
|
||
|
|
__u32 out_data_type;
|
||
|
|
- __u32 __reserved;
|
||
|
|
+ __u8 out_max_pasid_log2;
|
||
|
|
+ __u8 __reserved[3];
|
||
|
|
__aligned_u64 out_capabilities;
|
||
|
|
};
|
||
|
|
#define IOMMU_GET_HW_INFO _IO(IOMMUFD_TYPE, IOMMUFD_CMD_GET_HW_INFO)
|
||
|
|
@@ -613,4 +694,271 @@ struct iommu_hwpt_get_dirty_bitmap {
|
||
|
|
#define IOMMU_HWPT_GET_DIRTY_BITMAP _IO(IOMMUFD_TYPE, \
|
||
|
|
IOMMUFD_CMD_HWPT_GET_DIRTY_BITMAP)
|
||
|
|
|
||
|
|
+/**
|
||
|
|
+ * enum iommu_hwpt_invalidate_data_type - IOMMU HWPT Cache Invalidation
|
||
|
|
+ * Data Type
|
||
|
|
+ * @IOMMU_HWPT_INVALIDATE_DATA_VTD_S1: Invalidation data for VTD_S1
|
||
|
|
+ * @IOMMU_VIOMMU_INVALIDATE_DATA_ARM_SMMUV3: Invalidation data for ARM SMMUv3
|
||
|
|
+ */
|
||
|
|
+enum iommu_hwpt_invalidate_data_type {
|
||
|
|
+ IOMMU_HWPT_INVALIDATE_DATA_VTD_S1 = 0,
|
||
|
|
+ IOMMU_VIOMMU_INVALIDATE_DATA_ARM_SMMUV3 = 1,
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
+/**
|
||
|
|
+ * enum iommu_hwpt_vtd_s1_invalidate_flags - Flags for Intel VT-d
|
||
|
|
+ * stage-1 cache invalidation
|
||
|
|
+ * @IOMMU_VTD_INV_FLAGS_LEAF: Indicates whether the invalidation applies
|
||
|
|
+ * to all-levels page structure cache or just
|
||
|
|
+ * the leaf PTE cache.
|
||
|
|
+ */
|
||
|
|
+enum iommu_hwpt_vtd_s1_invalidate_flags {
|
||
|
|
+ IOMMU_VTD_INV_FLAGS_LEAF = 1 << 0,
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
+/**
|
||
|
|
+ * struct iommu_hwpt_vtd_s1_invalidate - Intel VT-d cache invalidation
|
||
|
|
+ * (IOMMU_HWPT_INVALIDATE_DATA_VTD_S1)
|
||
|
|
+ * @addr: The start address of the range to be invalidated. It needs to
|
||
|
|
+ * be 4KB aligned.
|
||
|
|
+ * @npages: Number of contiguous 4K pages to be invalidated.
|
||
|
|
+ * @flags: Combination of enum iommu_hwpt_vtd_s1_invalidate_flags
|
||
|
|
+ * @__reserved: Must be 0
|
||
|
|
+ *
|
||
|
|
+ * The Intel VT-d specific invalidation data for user-managed stage-1 cache
|
||
|
|
+ * invalidation in nested translation. Userspace uses this structure to
|
||
|
|
+ * tell the impacted cache scope after modifying the stage-1 page table.
|
||
|
|
+ *
|
||
|
|
+ * Invalidating all the caches related to the page table by setting @addr
|
||
|
|
+ * to be 0 and @npages to be U64_MAX.
|
||
|
|
+ *
|
||
|
|
+ * The device TLB will be invalidated automatically if ATS is enabled.
|
||
|
|
+ */
|
||
|
|
+struct iommu_hwpt_vtd_s1_invalidate {
|
||
|
|
+ __aligned_u64 addr;
|
||
|
|
+ __aligned_u64 npages;
|
||
|
|
+ __u32 flags;
|
||
|
|
+ __u32 __reserved;
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
+/**
|
||
|
|
+ * struct iommu_viommu_arm_smmuv3_invalidate - ARM SMMUv3 cahce invalidation
|
||
|
|
+ * (IOMMU_VIOMMU_INVALIDATE_DATA_ARM_SMMUV3)
|
||
|
|
+ * @cmd: 128-bit cache invalidation command that runs in SMMU CMDQ.
|
||
|
|
+ * Must be little-endian.
|
||
|
|
+ *
|
||
|
|
+ * Supported command list only when passing in a vIOMMU via @hwpt_id:
|
||
|
|
+ * CMDQ_OP_TLBI_NSNH_ALL
|
||
|
|
+ * CMDQ_OP_TLBI_NH_VA
|
||
|
|
+ * CMDQ_OP_TLBI_NH_VAA
|
||
|
|
+ * CMDQ_OP_TLBI_NH_ALL
|
||
|
|
+ * CMDQ_OP_TLBI_NH_ASID
|
||
|
|
+ * CMDQ_OP_ATC_INV
|
||
|
|
+ * CMDQ_OP_CFGI_CD
|
||
|
|
+ * CMDQ_OP_CFGI_CD_ALL
|
||
|
|
+ *
|
||
|
|
+ * -EIO will be returned if the command is not supported.
|
||
|
|
+ */
|
||
|
|
+struct iommu_viommu_arm_smmuv3_invalidate {
|
||
|
|
+ __aligned_le64 cmd[2];
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
+/**
|
||
|
|
+ * struct iommu_hwpt_invalidate - ioctl(IOMMU_HWPT_INVALIDATE)
|
||
|
|
+ * @size: sizeof(struct iommu_hwpt_invalidate)
|
||
|
|
+ * @hwpt_id: ID of a nested HWPT or a vIOMMU, for cache invalidation
|
||
|
|
+ * @data_uptr: User pointer to an array of driver-specific cache invalidation
|
||
|
|
+ * data.
|
||
|
|
+ * @data_type: One of enum iommu_hwpt_invalidate_data_type, defining the data
|
||
|
|
+ * type of all the entries in the invalidation request array. It
|
||
|
|
+ * should be a type supported by the hwpt pointed by @hwpt_id.
|
||
|
|
+ * @entry_len: Length (in bytes) of a request entry in the request array
|
||
|
|
+ * @entry_num: Input the number of cache invalidation requests in the array.
|
||
|
|
+ * Output the number of requests successfully handled by kernel.
|
||
|
|
+ * @__reserved: Must be 0.
|
||
|
|
+ *
|
||
|
|
+ * Invalidate iommu cache for user-managed page table or vIOMMU. Modifications
|
||
|
|
+ * on a user-managed page table should be followed by this operation, if a HWPT
|
||
|
|
+ * is passed in via @hwpt_id. Other caches, such as device cache or descriptor
|
||
|
|
+ * cache can be flushed if a vIOMMU is passed in via the @hwpt_id field.
|
||
|
|
+ *
|
||
|
|
+ * Each ioctl can support one or more cache invalidation requests in the array
|
||
|
|
+ * that has a total size of @entry_len * @entry_num.
|
||
|
|
+ *
|
||
|
|
+ * An empty invalidation request array by setting @entry_num==0 is allowed, and
|
||
|
|
+ * @entry_len and @data_uptr would be ignored in this case. This can be used to
|
||
|
|
+ * check if the given @data_type is supported or not by kernel.
|
||
|
|
+ */
|
||
|
|
+struct iommu_hwpt_invalidate {
|
||
|
|
+ __u32 size;
|
||
|
|
+ __u32 hwpt_id;
|
||
|
|
+ __aligned_u64 data_uptr;
|
||
|
|
+ __u32 data_type;
|
||
|
|
+ __u32 entry_len;
|
||
|
|
+ __u32 entry_num;
|
||
|
|
+ __u32 __reserved;
|
||
|
|
+};
|
||
|
|
+#define IOMMU_HWPT_INVALIDATE _IO(IOMMUFD_TYPE, IOMMUFD_CMD_HWPT_INVALIDATE)
|
||
|
|
+
|
||
|
|
+/**
|
||
|
|
+ * enum iommu_hwpt_pgfault_flags - flags for struct iommu_hwpt_pgfault
|
||
|
|
+ * @IOMMU_PGFAULT_FLAGS_PASID_VALID: The pasid field of the fault data is
|
||
|
|
+ * valid.
|
||
|
|
+ * @IOMMU_PGFAULT_FLAGS_LAST_PAGE: It's the last fault of a fault group.
|
||
|
|
+ */
|
||
|
|
+enum iommu_hwpt_pgfault_flags {
|
||
|
|
+ IOMMU_PGFAULT_FLAGS_PASID_VALID = (1 << 0),
|
||
|
|
+ IOMMU_PGFAULT_FLAGS_LAST_PAGE = (1 << 1),
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
+/**
|
||
|
|
+ * enum iommu_hwpt_pgfault_perm - perm bits for struct iommu_hwpt_pgfault
|
||
|
|
+ * @IOMMU_PGFAULT_PERM_READ: request for read permission
|
||
|
|
+ * @IOMMU_PGFAULT_PERM_WRITE: request for write permission
|
||
|
|
+ * @IOMMU_PGFAULT_PERM_EXEC: (PCIE 10.4.1) request with a PASID that has the
|
||
|
|
+ * Execute Requested bit set in PASID TLP Prefix.
|
||
|
|
+ * @IOMMU_PGFAULT_PERM_PRIV: (PCIE 10.4.1) request with a PASID that has the
|
||
|
|
+ * Privileged Mode Requested bit set in PASID TLP
|
||
|
|
+ * Prefix.
|
||
|
|
+ */
|
||
|
|
+enum iommu_hwpt_pgfault_perm {
|
||
|
|
+ IOMMU_PGFAULT_PERM_READ = (1 << 0),
|
||
|
|
+ IOMMU_PGFAULT_PERM_WRITE = (1 << 1),
|
||
|
|
+ IOMMU_PGFAULT_PERM_EXEC = (1 << 2),
|
||
|
|
+ IOMMU_PGFAULT_PERM_PRIV = (1 << 3),
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
+/**
|
||
|
|
+ * struct iommu_hwpt_pgfault - iommu page fault data
|
||
|
|
+ * @flags: Combination of enum iommu_hwpt_pgfault_flags
|
||
|
|
+ * @dev_id: id of the originated device
|
||
|
|
+ * @pasid: Process Address Space ID
|
||
|
|
+ * @grpid: Page Request Group Index
|
||
|
|
+ * @perm: Combination of enum iommu_hwpt_pgfault_perm
|
||
|
|
+ * @addr: Fault address
|
||
|
|
+ * @length: a hint of how much data the requestor is expecting to fetch. For
|
||
|
|
+ * example, if the PRI initiator knows it is going to do a 10MB
|
||
|
|
+ * transfer, it could fill in 10MB and the OS could pre-fault in
|
||
|
|
+ * 10MB of IOVA. It's default to 0 if there's no such hint.
|
||
|
|
+ * @cookie: kernel-managed cookie identifying a group of fault messages. The
|
||
|
|
+ * cookie number encoded in the last page fault of the group should
|
||
|
|
+ * be echoed back in the response message.
|
||
|
|
+ */
|
||
|
|
+struct iommu_hwpt_pgfault {
|
||
|
|
+ __u32 flags;
|
||
|
|
+ __u32 dev_id;
|
||
|
|
+ __u32 pasid;
|
||
|
|
+ __u32 grpid;
|
||
|
|
+ __u32 perm;
|
||
|
|
+ __u64 addr;
|
||
|
|
+ __u32 length;
|
||
|
|
+ __u32 cookie;
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
+/**
|
||
|
|
+ * enum iommufd_page_response_code - Return status of fault handlers
|
||
|
|
+ * @IOMMUFD_PAGE_RESP_SUCCESS: Fault has been handled and the page tables
|
||
|
|
+ * populated, retry the access. This is the
|
||
|
|
+ * "Success" defined in PCI 10.4.2.1.
|
||
|
|
+ * @IOMMUFD_PAGE_RESP_INVALID: Could not handle this fault, don't retry the
|
||
|
|
+ * access. This is the "Invalid Request" in PCI
|
||
|
|
+ * 10.4.2.1.
|
||
|
|
+ */
|
||
|
|
+enum iommufd_page_response_code {
|
||
|
|
+ IOMMUFD_PAGE_RESP_SUCCESS = 0,
|
||
|
|
+ IOMMUFD_PAGE_RESP_INVALID = 1,
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
+/**
|
||
|
|
+ * struct iommu_hwpt_page_response - IOMMU page fault response
|
||
|
|
+ * @cookie: The kernel-managed cookie reported in the fault message.
|
||
|
|
+ * @code: One of response code in enum iommufd_page_response_code.
|
||
|
|
+ */
|
||
|
|
+struct iommu_hwpt_page_response {
|
||
|
|
+ __u32 cookie;
|
||
|
|
+ __u32 code;
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
+/**
|
||
|
|
+ * struct iommu_fault_alloc - ioctl(IOMMU_FAULT_QUEUE_ALLOC)
|
||
|
|
+ * @size: sizeof(struct iommu_fault_alloc)
|
||
|
|
+ * @flags: Must be 0
|
||
|
|
+ * @out_fault_id: The ID of the new FAULT
|
||
|
|
+ * @out_fault_fd: The fd of the new FAULT
|
||
|
|
+ *
|
||
|
|
+ * Explicitly allocate a fault handling object.
|
||
|
|
+ */
|
||
|
|
+struct iommu_fault_alloc {
|
||
|
|
+ __u32 size;
|
||
|
|
+ __u32 flags;
|
||
|
|
+ __u32 out_fault_id;
|
||
|
|
+ __u32 out_fault_fd;
|
||
|
|
+};
|
||
|
|
+#define IOMMU_FAULT_QUEUE_ALLOC _IO(IOMMUFD_TYPE, IOMMUFD_CMD_FAULT_QUEUE_ALLOC)
|
||
|
|
+
|
||
|
|
+/**
|
||
|
|
+ * enum iommu_viommu_type - Virtual IOMMU Type
|
||
|
|
+ * @IOMMU_VIOMMU_TYPE_DEFAULT: Reserved for future use
|
||
|
|
+ * @IOMMU_VIOMMU_TYPE_ARM_SMMUV3: ARM SMMUv3 driver specific type
|
||
|
|
+ */
|
||
|
|
+enum iommu_viommu_type {
|
||
|
|
+ IOMMU_VIOMMU_TYPE_DEFAULT = 0,
|
||
|
|
+ IOMMU_VIOMMU_TYPE_ARM_SMMUV3 = 1,
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
+/**
|
||
|
|
+ * struct iommu_viommu_alloc - ioctl(IOMMU_VIOMMU_ALLOC)
|
||
|
|
+ * @size: sizeof(struct iommu_viommu_alloc)
|
||
|
|
+ * @flags: Must be 0
|
||
|
|
+ * @type: Type of the virtual IOMMU. Must be defined in enum iommu_viommu_type
|
||
|
|
+ * @dev_id: The device's physical IOMMU will be used to back the virtual IOMMU
|
||
|
|
+ * @hwpt_id: ID of a nesting parent HWPT to associate to
|
||
|
|
+ * @out_viommu_id: Output virtual IOMMU ID for the allocated object
|
||
|
|
+ *
|
||
|
|
+ * Allocate a virtual IOMMU object, representing the underlying physical IOMMU's
|
||
|
|
+ * virtualization support that is a security-isolated slice of the real IOMMU HW
|
||
|
|
+ * that is unique to a specific VM. Operations global to the IOMMU are connected
|
||
|
|
+ * to the vIOMMU, such as:
|
||
|
|
+ * - Security namespace for guest owned ID, e.g. guest-controlled cache tags
|
||
|
|
+ * - Access to a sharable nesting parent pagetable across physical IOMMUs
|
||
|
|
+ * - Non-affiliated event reporting (e.g. an invalidation queue error)
|
||
|
|
+ * - Virtualization of various platforms IDs, e.g. RIDs and others
|
||
|
|
+ * - Delivery of paravirtualized invalidation
|
||
|
|
+ * - Direct assigned invalidation queues
|
||
|
|
+ * - Direct assigned interrupts
|
||
|
|
+ */
|
||
|
|
+struct iommu_viommu_alloc {
|
||
|
|
+ __u32 size;
|
||
|
|
+ __u32 flags;
|
||
|
|
+ __u32 type;
|
||
|
|
+ __u32 dev_id;
|
||
|
|
+ __u32 hwpt_id;
|
||
|
|
+ __u32 out_viommu_id;
|
||
|
|
+};
|
||
|
|
+#define IOMMU_VIOMMU_ALLOC _IO(IOMMUFD_TYPE, IOMMUFD_CMD_VIOMMU_ALLOC)
|
||
|
|
+
|
||
|
|
+/**
|
||
|
|
+ * struct iommu_vdevice_alloc - ioctl(IOMMU_VDEVICE_ALLOC)
|
||
|
|
+ * @size: sizeof(struct iommu_vdevice_alloc)
|
||
|
|
+ * @viommu_id: vIOMMU ID to associate with the virtual device
|
||
|
|
+ * @dev_id: The pyhsical device to allocate a virtual instance on the vIOMMU
|
||
|
|
+ * @__reserved: Must be 0
|
||
|
|
+ * @virt_id: Virtual device ID per vIOMMU, e.g. vSID of ARM SMMUv3, vDeviceID
|
||
|
|
+ * of AMD IOMMU, and vID of a nested Intel VT-d to a Context Table.
|
||
|
|
+ * @out_vdevice_id: Output virtual instance ID for the allocated object
|
||
|
|
+ * @__reserved2: Must be 0
|
||
|
|
+ *
|
||
|
|
+ * Allocate a virtual device instance (for a physical device) against a vIOMMU.
|
||
|
|
+ * This instance holds the device's information (related to its vIOMMU) in a VM.
|
||
|
|
+ */
|
||
|
|
+struct iommu_vdevice_alloc {
|
||
|
|
+ __u32 size;
|
||
|
|
+ __u32 viommu_id;
|
||
|
|
+ __u32 dev_id;
|
||
|
|
+ __u32 __reserved;
|
||
|
|
+ __aligned_u64 virt_id;
|
||
|
|
+ __u32 out_vdevice_id;
|
||
|
|
+ __u32 __reserved2;
|
||
|
|
+};
|
||
|
|
+#define IOMMU_VDEVICE_ALLOC _IO(IOMMUFD_TYPE, IOMMUFD_CMD_VDEVICE_ALLOC)
|
||
|
|
#endif
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|