/usr/share/cagefs-skeleton/usr/include/linux
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ /* Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. */ #ifndef _IOMMUFD_H #define _IOMMUFD_H #include <linux/ioctl.h> #include <linux/types.h> #define IOMMUFD_TYPE (';') /** * DOC: General ioctl format * * The ioctl interface follows a general format to allow for extensibility. Each * ioctl is passed in a structure pointer as the argument providing the size of * the structure in the first u32. The kernel checks that any structure space * beyond what it understands is 0. This allows userspace to use the backward * compatible portion while consistently using the newer, larger, structures. * * ioctls use a standard meaning for common errnos: * * - ENOTTY: The IOCTL number itself is not supported at all * - E2BIG: The IOCTL number is supported, but the provided structure has * non-zero in a part the kernel does not understand. * - EOPNOTSUPP: The IOCTL number is supported, and the structure is * understood, however a known field has a value the kernel does not * understand or support. * - EINVAL: Everything about the IOCTL was understood, but a field is not * correct. * - ENOENT: An ID or IOVA provided does not exist. * - ENOMEM: Out of memory. * - EOVERFLOW: Mathematics overflowed. * * As well as additional errnos, within specific ioctls. */ enum { IOMMUFD_CMD_BASE = 0x80, IOMMUFD_CMD_DESTROY = IOMMUFD_CMD_BASE, 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, }; /** * struct iommu_destroy - ioctl(IOMMU_DESTROY) * @size: sizeof(struct iommu_destroy) * @id: iommufd object ID to destroy. Can be any destroyable object type. * * Destroy any object held within iommufd. */ struct iommu_destroy { __u32 size; __u32 id; }; #define IOMMU_DESTROY _IO(IOMMUFD_TYPE, IOMMUFD_CMD_DESTROY) /** * struct iommu_ioas_alloc - ioctl(IOMMU_IOAS_ALLOC) * @size: sizeof(struct iommu_ioas_alloc) * @flags: Must be 0 * @out_ioas_id: Output IOAS ID for the allocated object * * Allocate an IO Address Space (IOAS) which holds an IO Virtual Address (IOVA) * to memory mapping. */ struct iommu_ioas_alloc { __u32 size; __u32 flags; __u32 out_ioas_id; }; #define IOMMU_IOAS_ALLOC _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_ALLOC) /** * struct iommu_iova_range - ioctl(IOMMU_IOVA_RANGE) * @start: First IOVA * @last: Inclusive last IOVA * * An interval in IOVA space. */ struct iommu_iova_range { __aligned_u64 start; __aligned_u64 last; }; /** * struct iommu_ioas_iova_ranges - ioctl(IOMMU_IOAS_IOVA_RANGES) * @size: sizeof(struct iommu_ioas_iova_ranges) * @ioas_id: IOAS ID to read ranges from * @num_iovas: Input/Output total number of ranges in the IOAS * @__reserved: Must be 0 * @allowed_iovas: Pointer to the output array of struct iommu_iova_range * @out_iova_alignment: Minimum alignment required for mapping IOVA * * Query an IOAS for ranges of allowed IOVAs. Mapping IOVA outside these ranges * is not allowed. num_iovas will be set to the total number of iovas and * the allowed_iovas[] will be filled in as space permits. * * The allowed ranges are dependent on the HW path the DMA operation takes, and * can change during the lifetime of the IOAS. A fresh empty IOAS will have a * full range, and each attached device will narrow the ranges based on that * device's HW restrictions. Detaching a device can widen the ranges. Userspace * should query ranges after every attach/detach to know what IOVAs are valid * for mapping. * * On input num_iovas is the length of the allowed_iovas array. On output it is * the total number of iovas filled in. The ioctl will return -EMSGSIZE and set * num_iovas to the required value if num_iovas is too small. In this case the * caller should allocate a larger output array and re-issue the ioctl. * * out_iova_alignment returns the minimum IOVA alignment that can be given * to IOMMU_IOAS_MAP/COPY. IOVA's must satisfy:: * * starting_iova % out_iova_alignment == 0 * (starting_iova + length) % out_iova_alignment == 0 * * out_iova_alignment can be 1 indicating any IOVA is allowed. It cannot * be higher than the system PAGE_SIZE. */ struct iommu_ioas_iova_ranges { __u32 size; __u32 ioas_id; __u32 num_iovas; __u32 __reserved; __aligned_u64 allowed_iovas; __aligned_u64 out_iova_alignment; }; #define IOMMU_IOAS_IOVA_RANGES _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_IOVA_RANGES) /** * struct iommu_ioas_allow_iovas - ioctl(IOMMU_IOAS_ALLOW_IOVAS) * @size: sizeof(struct iommu_ioas_allow_iovas) * @ioas_id: IOAS ID to allow IOVAs from * @num_iovas: Input/Output total number of ranges in the IOAS * @__reserved: Must be 0 * @allowed_iovas: Pointer to array of struct iommu_iova_range * * Ensure a range of IOVAs are always available for allocation. If this call * succeeds then IOMMU_IOAS_IOVA_RANGES will never return a list of IOVA ranges * that are narrower than the ranges provided here. This call will fail if * IOMMU_IOAS_IOVA_RANGES is currently narrower than the given ranges. * * When an IOAS is first created the IOVA_RANGES will be maximally sized, and as * devices are attached the IOVA will narrow based on the device restrictions. * When an allowed range is specified any narrowing will be refused, ie device * attachment can fail if the device requires limiting within the allowed range. * * Automatic IOVA allocation is also impacted by this call. MAP will only * allocate within the allowed IOVAs if they are present. * * This call replaces the entire allowed list with the given list. */ struct iommu_ioas_allow_iovas { __u32 size; __u32 ioas_id; __u32 num_iovas; __u32 __reserved; __aligned_u64 allowed_iovas; }; #define IOMMU_IOAS_ALLOW_IOVAS _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_ALLOW_IOVAS) /** * enum iommufd_ioas_map_flags - Flags for map and copy * @IOMMU_IOAS_MAP_FIXED_IOVA: If clear the kernel will compute an appropriate * IOVA to place the mapping at * @IOMMU_IOAS_MAP_WRITEABLE: DMA is allowed to write to this mapping * @IOMMU_IOAS_MAP_READABLE: DMA is allowed to read from this mapping */ enum iommufd_ioas_map_flags { IOMMU_IOAS_MAP_FIXED_IOVA = 1 << 0, IOMMU_IOAS_MAP_WRITEABLE = 1 << 1, IOMMU_IOAS_MAP_READABLE = 1 << 2, }; /** * struct iommu_ioas_map - ioctl(IOMMU_IOAS_MAP) * @size: sizeof(struct iommu_ioas_map) * @flags: Combination of enum iommufd_ioas_map_flags * @ioas_id: IOAS ID to change the mapping of * @__reserved: Must be 0 * @user_va: Userspace pointer to start mapping from * @length: Number of bytes to map * @iova: IOVA the mapping was placed at. If IOMMU_IOAS_MAP_FIXED_IOVA is set * then this must be provided as input. * * Set an IOVA mapping from a user pointer. If FIXED_IOVA is specified then the * mapping will be established at iova, otherwise a suitable location based on * the reserved and allowed lists will be automatically selected and returned in * iova. * * If IOMMU_IOAS_MAP_FIXED_IOVA is specified then the iova range must currently * be unused, existing IOVA cannot be replaced. */ struct iommu_ioas_map { __u32 size; __u32 flags; __u32 ioas_id; __u32 __reserved; __aligned_u64 user_va; __aligned_u64 length; __aligned_u64 iova; }; #define IOMMU_IOAS_MAP _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_MAP) /** * struct iommu_ioas_copy - ioctl(IOMMU_IOAS_COPY) * @size: sizeof(struct iommu_ioas_copy) * @flags: Combination of enum iommufd_ioas_map_flags * @dst_ioas_id: IOAS ID to change the mapping of * @src_ioas_id: IOAS ID to copy from * @length: Number of bytes to copy and map * @dst_iova: IOVA the mapping was placed at. If IOMMU_IOAS_MAP_FIXED_IOVA is * set then this must be provided as input. * @src_iova: IOVA to start the copy * * Copy an already existing mapping from src_ioas_id and establish it in * dst_ioas_id. The src iova/length must exactly match a range used with * IOMMU_IOAS_MAP. * * This may be used to efficiently clone a subset of an IOAS to another, or as a * kind of 'cache' to speed up mapping. Copy has an efficiency advantage over * establishing equivalent new mappings, as internal resources are shared, and * the kernel will pin the user memory only once. */ struct iommu_ioas_copy { __u32 size; __u32 flags; __u32 dst_ioas_id; __u32 src_ioas_id; __aligned_u64 length; __aligned_u64 dst_iova; __aligned_u64 src_iova; }; #define IOMMU_IOAS_COPY _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_COPY) /** * struct iommu_ioas_unmap - ioctl(IOMMU_IOAS_UNMAP) * @size: sizeof(struct iommu_ioas_unmap) * @ioas_id: IOAS ID to change the mapping of * @iova: IOVA to start the unmapping at * @length: Number of bytes to unmap, and return back the bytes unmapped * * Unmap an IOVA range. The iova/length must be a superset of a previously * mapped range used with IOMMU_IOAS_MAP or IOMMU_IOAS_COPY. Splitting or * truncating ranges is not allowed. The values 0 to U64_MAX will unmap * everything. */ struct iommu_ioas_unmap { __u32 size; __u32 ioas_id; __aligned_u64 iova; __aligned_u64 length; }; #define IOMMU_IOAS_UNMAP _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_UNMAP) /** * enum iommufd_option - ioctl(IOMMU_OPTION_RLIMIT_MODE) and * ioctl(IOMMU_OPTION_HUGE_PAGES) * @IOMMU_OPTION_RLIMIT_MODE: * Change how RLIMIT_MEMLOCK accounting works. The caller must have privilege * to invoke this. Value 0 (default) is user based accouting, 1 uses process * based accounting. Global option, object_id must be 0 * @IOMMU_OPTION_HUGE_PAGES: * Value 1 (default) allows contiguous pages to be combined when generating * iommu mappings. Value 0 disables combining, everything is mapped to * PAGE_SIZE. This can be useful for benchmarking. This is a per-IOAS * option, the object_id must be the IOAS ID. */ enum iommufd_option { IOMMU_OPTION_RLIMIT_MODE = 0, IOMMU_OPTION_HUGE_PAGES = 1, }; /** * enum iommufd_option_ops - ioctl(IOMMU_OPTION_OP_SET) and * ioctl(IOMMU_OPTION_OP_GET) * @IOMMU_OPTION_OP_SET: Set the option's value * @IOMMU_OPTION_OP_GET: Get the option's value */ enum iommufd_option_ops { IOMMU_OPTION_OP_SET = 0, IOMMU_OPTION_OP_GET = 1, }; /** * struct iommu_option - iommu option multiplexer * @size: sizeof(struct iommu_option) * @option_id: One of enum iommufd_option * @op: One of enum iommufd_option_ops * @__reserved: Must be 0 * @object_id: ID of the object if required * @val64: Option value to set or value returned on get * * Change a simple option value. This multiplexor allows controlling options * on objects. IOMMU_OPTION_OP_SET will load an option and IOMMU_OPTION_OP_GET * will return the current value. */ struct iommu_option { __u32 size; __u32 option_id; __u16 op; __u16 __reserved; __u32 object_id; __aligned_u64 val64; }; #define IOMMU_OPTION _IO(IOMMUFD_TYPE, IOMMUFD_CMD_OPTION) /** * enum iommufd_vfio_ioas_op - IOMMU_VFIO_IOAS_* ioctls * @IOMMU_VFIO_IOAS_GET: Get the current compatibility IOAS * @IOMMU_VFIO_IOAS_SET: Change the current compatibility IOAS * @IOMMU_VFIO_IOAS_CLEAR: Disable VFIO compatibility */ enum iommufd_vfio_ioas_op { IOMMU_VFIO_IOAS_GET = 0, IOMMU_VFIO_IOAS_SET = 1, IOMMU_VFIO_IOAS_CLEAR = 2, }; /** * struct iommu_vfio_ioas - ioctl(IOMMU_VFIO_IOAS) * @size: sizeof(struct iommu_vfio_ioas) * @ioas_id: For IOMMU_VFIO_IOAS_SET the input IOAS ID to set * For IOMMU_VFIO_IOAS_GET will output the IOAS ID * @op: One of enum iommufd_vfio_ioas_op * @__reserved: Must be 0 * * The VFIO compatibility support uses a single ioas because VFIO APIs do not * support the ID field. Set or Get the IOAS that VFIO compatibility will use. * When VFIO_GROUP_SET_CONTAINER is used on an iommufd it will get the * compatibility ioas, either by taking what is already set, or auto creating * one. From then on VFIO will continue to use that ioas and is not effected by * this ioctl. SET or CLEAR does not destroy any auto-created IOAS. */ struct iommu_vfio_ioas { __u32 size; __u32 ioas_id; __u16 op; __u16 __reserved; }; #define IOMMU_VFIO_IOAS _IO(IOMMUFD_TYPE, IOMMUFD_CMD_VFIO_IOAS) /** * enum iommufd_hwpt_alloc_flags - Flags for HWPT allocation * @IOMMU_HWPT_ALLOC_NEST_PARENT: If set, allocate a HWPT that can serve as * 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, }; /** * enum iommu_hwpt_vtd_s1_flags - Intel VT-d stage-1 page table * entry attributes * @IOMMU_VTD_S1_SRE: Supervisor request * @IOMMU_VTD_S1_EAFE: Extended access enable * @IOMMU_VTD_S1_WPE: Write protect enable */ enum iommu_hwpt_vtd_s1_flags { IOMMU_VTD_S1_SRE = 1 << 0, IOMMU_VTD_S1_EAFE = 1 << 1, IOMMU_VTD_S1_WPE = 1 << 2, }; /** * struct iommu_hwpt_vtd_s1 - Intel VT-d stage-1 page table * info (IOMMU_HWPT_DATA_VTD_S1) * @flags: Combination of enum iommu_hwpt_vtd_s1_flags * @pgtbl_addr: The base address of the stage-1 page table. * @addr_width: The address width of the stage-1 page table * @__reserved: Must be 0 */ struct iommu_hwpt_vtd_s1 { __aligned_u64 flags; __aligned_u64 pgtbl_addr; __u32 addr_width; __u32 __reserved; }; /** * 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 */ enum iommu_hwpt_data_type { IOMMU_HWPT_DATA_NONE = 0, IOMMU_HWPT_DATA_VTD_S1 = 1, }; /** * struct iommu_hwpt_alloc - ioctl(IOMMU_HWPT_ALLOC) * @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 * @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 * underlying iommu driver's iommu_domain kernel object. * * A kernel-managed HWPT will be created with the mappings from the given * IOAS via the @pt_id. The @data_type for this allocation must be set to * 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. * * 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 * must be given. */ struct iommu_hwpt_alloc { __u32 size; __u32 flags; __u32 dev_id; __u32 pt_id; __u32 out_hwpt_id; __u32 __reserved; __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) /** * enum iommu_hw_info_vtd_flags - Flags for VT-d hw_info * @IOMMU_HW_INFO_VTD_ERRATA_772415_SPR17: If set, disallow read-only mappings * on a nested_parent domain. * https://www.intel.com/content/www/us/en/content-details/772415/content-details.html */ enum iommu_hw_info_vtd_flags { IOMMU_HW_INFO_VTD_ERRATA_772415_SPR17 = 1 << 0, }; /** * struct iommu_hw_info_vtd - Intel VT-d hardware information * * @flags: Combination of enum iommu_hw_info_vtd_flags * @__reserved: Must be 0 * * @cap_reg: Value of Intel VT-d capability register defined in VT-d spec * section 11.4.2 Capability Register. * @ecap_reg: Value of Intel VT-d capability register defined in VT-d spec * section 11.4.3 Extended Capability Register. * * User needs to understand the Intel VT-d specification to decode the * register value. */ struct iommu_hw_info_vtd { __u32 flags; __u32 __reserved; __aligned_u64 cap_reg; __aligned_u64 ecap_reg; }; /** * 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 */ enum iommu_hw_info_type { IOMMU_HW_INFO_TYPE_NONE = 0, IOMMU_HW_INFO_TYPE_INTEL_VTD = 1, }; /** * enum iommufd_hw_capabilities * @IOMMU_HW_CAP_DIRTY_TRACKING: IOMMU hardware support for dirty tracking * If available, it means the following APIs * are supported: * * IOMMU_HWPT_GET_DIRTY_BITMAP * IOMMU_HWPT_SET_DIRTY_TRACKING * */ enum iommufd_hw_capabilities { IOMMU_HW_CAP_DIRTY_TRACKING = 1 << 0, }; /** * struct iommu_hw_info - ioctl(IOMMU_GET_HW_INFO) * @size: sizeof(struct iommu_hw_info) * @flags: Must be 0 * @dev_id: The device bound to the iommufd * @data_len: Input the length of a user buffer in bytes. Output the length of * data that kernel supports * @data_uptr: User pointer to a user-space buffer used by the kernel to fill * the iommu type specific hardware information data * @out_data_type: Output the iommu hardware info type as defined in the enum * iommu_hw_info_type. * @out_capabilities: Output the generic iommu capability info type as defined * in the enum iommu_hw_capabilities. * @__reserved: Must be 0 * * Query an iommu type specific hardware information data from an iommu behind * a given device that has been bound to iommufd. This hardware info data will * be used to sync capabilities between the virtual iommu and the physical * iommu, e.g. a nested translation setup needs to check the hardware info, so * a guest stage-1 page table can be compatible with the physical iommu. * * To capture an iommu type specific hardware information data, @data_uptr and * its length @data_len must be provided. Trailing bytes will be zeroed if the * user buffer is larger than the data that kernel has. Otherwise, kernel only * fills the buffer using the given length in @data_len. If the ioctl succeeds, * @data_len will be updated to the length that kernel actually supports, * @out_data_type will be filled to decode the data filled in the buffer * pointed by @data_uptr. Input @data_len == zero is allowed. */ struct iommu_hw_info { __u32 size; __u32 flags; __u32 dev_id; __u32 data_len; __aligned_u64 data_uptr; __u32 out_data_type; __u32 __reserved; __aligned_u64 out_capabilities; }; #define IOMMU_GET_HW_INFO _IO(IOMMUFD_TYPE, IOMMUFD_CMD_GET_HW_INFO) /* * enum iommufd_hwpt_set_dirty_tracking_flags - Flags for steering dirty * tracking * @IOMMU_HWPT_DIRTY_TRACKING_ENABLE: Enable dirty tracking */ enum iommufd_hwpt_set_dirty_tracking_flags { IOMMU_HWPT_DIRTY_TRACKING_ENABLE = 1, }; /** * struct iommu_hwpt_set_dirty_tracking - ioctl(IOMMU_HWPT_SET_DIRTY_TRACKING) * @size: sizeof(struct iommu_hwpt_set_dirty_tracking) * @flags: Combination of enum iommufd_hwpt_set_dirty_tracking_flags * @hwpt_id: HW pagetable ID that represents the IOMMU domain * @__reserved: Must be 0 * * Toggle dirty tracking on an HW pagetable. */ struct iommu_hwpt_set_dirty_tracking { __u32 size; __u32 flags; __u32 hwpt_id; __u32 __reserved; }; #define IOMMU_HWPT_SET_DIRTY_TRACKING _IO(IOMMUFD_TYPE, \ IOMMUFD_CMD_HWPT_SET_DIRTY_TRACKING) /** * enum iommufd_hwpt_get_dirty_bitmap_flags - Flags for getting dirty bits * @IOMMU_HWPT_GET_DIRTY_BITMAP_NO_CLEAR: Just read the PTEs without clearing * any dirty bits metadata. This flag * can be passed in the expectation * where the next operation is an unmap * of the same IOVA range. * */ enum iommufd_hwpt_get_dirty_bitmap_flags { IOMMU_HWPT_GET_DIRTY_BITMAP_NO_CLEAR = 1, }; /** * struct iommu_hwpt_get_dirty_bitmap - ioctl(IOMMU_HWPT_GET_DIRTY_BITMAP) * @size: sizeof(struct iommu_hwpt_get_dirty_bitmap) * @hwpt_id: HW pagetable ID that represents the IOMMU domain * @flags: Combination of enum iommufd_hwpt_get_dirty_bitmap_flags * @__reserved: Must be 0 * @iova: base IOVA of the bitmap first bit * @length: IOVA range size * @page_size: page size granularity of each bit in the bitmap * @data: bitmap where to set the dirty bits. The bitmap bits each * represent a page_size which you deviate from an arbitrary iova. * * Checking a given IOVA is dirty: * * data[(iova / page_size) / 64] & (1ULL << ((iova / page_size) % 64)) * * Walk the IOMMU pagetables for a given IOVA range to return a bitmap * with the dirty IOVAs. In doing so it will also by default clear any * dirty bit metadata set in the IOPTE. */ struct iommu_hwpt_get_dirty_bitmap { __u32 size; __u32 hwpt_id; __u32 flags; __u32 __reserved; __aligned_u64 iova; __aligned_u64 length; __aligned_u64 page_size; __aligned_u64 data; }; #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 */ enum iommu_hwpt_invalidate_data_type { IOMMU_HWPT_INVALIDATE_DATA_VTD_S1 = 0, }; /** * 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_hwpt_invalidate - ioctl(IOMMU_HWPT_INVALIDATE) * @size: sizeof(struct iommu_hwpt_invalidate) * @hwpt_id: ID of a nested HWPT 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 the iommu cache for user-managed page table. Modifications on a * user-managed page table should be followed by this operation to sync cache. * 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 * @__reserved: Must be 0. * @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; __u32 __reserved; __aligned_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) #endif
.
Edit
..
Edit
a.out.h
Edit
acct.h
Edit
acrn.h
Edit
adb.h
Edit
adfs_fs.h
Edit
affs_hardblocks.h
Edit
agpgart.h
Edit
aio_abi.h
Edit
am437x-vpfe.h
Edit
android
Edit
apm_bios.h
Edit
arcfb.h
Edit
arm_sdei.h
Edit
aspeed-lpc-ctrl.h
Edit
aspeed-p2a-ctrl.h
Edit
atalk.h
Edit
atm.h
Edit
atm_eni.h
Edit
atm_he.h
Edit
atm_idt77105.h
Edit
atm_nicstar.h
Edit
atm_tcp.h
Edit
atm_zatm.h
Edit
atmapi.h
Edit
atmarp.h
Edit
atmbr2684.h
Edit
atmclip.h
Edit
atmdev.h
Edit
atmioc.h
Edit
atmlec.h
Edit
atmmpc.h
Edit
atmppp.h
Edit
atmsap.h
Edit
atmsvc.h
Edit
audit.h
Edit
auto_dev-ioctl.h
Edit
auto_fs.h
Edit
auto_fs4.h
Edit
auxvec.h
Edit
ax25.h
Edit
batadv_packet.h
Edit
batman_adv.h
Edit
baycom.h
Edit
bcm933xx_hcs.h
Edit
bfs_fs.h
Edit
binfmts.h
Edit
bits.h
Edit
blkpg.h
Edit
blktrace_api.h
Edit
blkzoned.h
Edit
bpf.h
Edit
bpf_common.h
Edit
bpf_perf_event.h
Edit
bpfilter.h
Edit
bpqether.h
Edit
bsg.h
Edit
bt-bmc.h
Edit
btf.h
Edit
btrfs.h
Edit
btrfs_tree.h
Edit
byteorder
Edit
cachefiles.h
Edit
caif
Edit
can
Edit
can.h
Edit
capability.h
Edit
capi.h
Edit
cciss_defs.h
Edit
cciss_ioctl.h
Edit
ccs.h
Edit
cdrom.h
Edit
cec-funcs.h
Edit
cec.h
Edit
cfm_bridge.h
Edit
cgroupstats.h
Edit
chio.h
Edit
cifs
Edit
close_range.h
Edit
cm4000_cs.h
Edit
cn_proc.h
Edit
coda.h
Edit
coff.h
Edit
connector.h
Edit
const.h
Edit
coresight-stm.h
Edit
cramfs_fs.h
Edit
cryptouser.h
Edit
cuda.h
Edit
cxl_mem.h
Edit
cycx_cfm.h
Edit
dcbnl.h
Edit
dccp.h
Edit
devlink.h
Edit
dlm.h
Edit
dlm_device.h
Edit
dlm_netlink.h
Edit
dlm_plock.h
Edit
dlmconstants.h
Edit
dm-ioctl.h
Edit
dm-log-userspace.h
Edit
dma-buf.h
Edit
dma-heap.h
Edit
dn.h
Edit
dns_resolver.h
Edit
dpll.h
Edit
dqblk_xfs.h
Edit
dvb
Edit
edd.h
Edit
efs_fs_sb.h
Edit
elf-em.h
Edit
elf-fdpic.h
Edit
elf.h
Edit
errno.h
Edit
errqueue.h
Edit
erspan.h
Edit
ethtool.h
Edit
ethtool_netlink.h
Edit
eventfd.h
Edit
eventpoll.h
Edit
f2fs.h
Edit
fadvise.h
Edit
falloc.h
Edit
fanotify.h
Edit
fb.h
Edit
fcntl.h
Edit
fd.h
Edit
fdreg.h
Edit
fib_rules.h
Edit
fiemap.h
Edit
filter.h
Edit
firewire-cdev.h
Edit
firewire-constants.h
Edit
fou.h
Edit
fpga-dfl.h
Edit
fs.h
Edit
fscrypt.h
Edit
fsi.h
Edit
fsl_hypervisor.h
Edit
fsl_mc.h
Edit
fsmap.h
Edit
fsverity.h
Edit
fuse.h
Edit
futex.h
Edit
gameport.h
Edit
gen_stats.h
Edit
genetlink.h
Edit
genwqe
Edit
gfs2_ondisk.h
Edit
gpio.h
Edit
gsmmux.h
Edit
gtp.h
Edit
handshake.h
Edit
hash_info.h
Edit
hdlc
Edit
hdlc.h
Edit
hdlcdrv.h
Edit
hdreg.h
Edit
hid.h
Edit
hiddev.h
Edit
hidraw.h
Edit
hpet.h
Edit
hsi
Edit
hsr_netlink.h
Edit
hw_breakpoint.h
Edit
hyperv.h
Edit
i2c-dev.h
Edit
i2c.h
Edit
i2o-dev.h
Edit
i8k.h
Edit
icmp.h
Edit
icmpv6.h
Edit
idxd.h
Edit
if.h
Edit
if_addr.h
Edit
if_addrlabel.h
Edit
if_alg.h
Edit
if_arcnet.h
Edit
if_arp.h
Edit
if_bonding.h
Edit
if_bridge.h
Edit
if_cablemodem.h
Edit
if_eql.h
Edit
if_ether.h
Edit
if_fc.h
Edit
if_fddi.h
Edit
if_hippi.h
Edit
if_infiniband.h
Edit
if_link.h
Edit
if_ltalk.h
Edit
if_macsec.h
Edit
if_packet.h
Edit
if_phonet.h
Edit
if_plip.h
Edit
if_ppp.h
Edit
if_pppol2tp.h
Edit
if_pppox.h
Edit
if_slip.h
Edit
if_team.h
Edit
if_tun.h
Edit
if_tunnel.h
Edit
if_vlan.h
Edit
if_x25.h
Edit
if_xdp.h
Edit
ife.h
Edit
igmp.h
Edit
iio
Edit
ila.h
Edit
in.h
Edit
in6.h
Edit
in_route.h
Edit
inet_diag.h
Edit
inotify.h
Edit
input-event-codes.h
Edit
input.h
Edit
io_uring.h
Edit
ioctl.h
Edit
iommufd.h
Edit
ioprio.h
Edit
ip.h
Edit
ip6_tunnel.h
Edit
ip_vs.h
Edit
ipc.h
Edit
ipmi.h
Edit
ipmi_bmc.h
Edit
ipmi_msgdefs.h
Edit
ipmi_ssif_bmc.h
Edit
ipsec.h
Edit
ipv6.h
Edit
ipv6_route.h
Edit
ipx.h
Edit
irqnr.h
Edit
isdn
Edit
iso_fs.h
Edit
isst_if.h
Edit
ivtv.h
Edit
ivtvfb.h
Edit
jffs2.h
Edit
joystick.h
Edit
kcm.h
Edit
kcmp.h
Edit
kcov.h
Edit
kd.h
Edit
kdev_t.h
Edit
kernel-page-flags.h
Edit
kernel.h
Edit
kernelcapi.h
Edit
kexec.h
Edit
keyboard.h
Edit
keyctl.h
Edit
kfd_ioctl.h
Edit
kfd_sysfs.h
Edit
kvm.h
Edit
kvm_para.h
Edit
l2tp.h
Edit
landlock.h
Edit
libc-compat.h
Edit
limits.h
Edit
lirc.h
Edit
llc.h
Edit
loadpin.h
Edit
loop.h
Edit
lp.h
Edit
lsm.h
Edit
lwtunnel.h
Edit
magic.h
Edit
major.h
Edit
map_to_7segment.h
Edit
matroxfb.h
Edit
max2175.h
Edit
mdio.h
Edit
media-bus-format.h
Edit
media.h
Edit
mei.h
Edit
mei_uuid.h
Edit
membarrier.h
Edit
memfd.h
Edit
mempolicy.h
Edit
meye.h
Edit
mii.h
Edit
minix_fs.h
Edit
misc
Edit
mman.h
Edit
mmc
Edit
mmtimer.h
Edit
module.h
Edit
mount.h
Edit
mpls.h
Edit
mpls_iptunnel.h
Edit
mptcp.h
Edit
mptcp_pm.h
Edit
mqueue.h
Edit
mroute.h
Edit
mroute6.h
Edit
mrp_bridge.h
Edit
msdos_fs.h
Edit
msg.h
Edit
mtio.h
Edit
nbd-netlink.h
Edit
nbd.h
Edit
ncsi.h
Edit
ndctl.h
Edit
neighbour.h
Edit
net.h
Edit
net_dropmon.h
Edit
net_namespace.h
Edit
net_tstamp.h
Edit
netconf.h
Edit
netdev.h
Edit
netdevice.h
Edit
netfilter
Edit
netfilter.h
Edit
netfilter_arp
Edit
netfilter_arp.h
Edit
netfilter_bridge
Edit
netfilter_bridge.h
Edit
netfilter_decnet.h
Edit
netfilter_ipv4
Edit
netfilter_ipv4.h
Edit
netfilter_ipv6
Edit
netfilter_ipv6.h
Edit
netlink.h
Edit
netlink_diag.h
Edit
netrom.h
Edit
nexthop.h
Edit
nfc.h
Edit
nfs.h
Edit
nfs2.h
Edit
nfs3.h
Edit
nfs4.h
Edit
nfs4_mount.h
Edit
nfs_fs.h
Edit
nfs_idmap.h
Edit
nfs_mount.h
Edit
nfsacl.h
Edit
nfsd
Edit
nfsd_netlink.h
Edit
nilfs2_api.h
Edit
nilfs2_ondisk.h
Edit
nitro_enclaves.h
Edit
nl80211.h
Edit
nsfs.h
Edit
nubus.h
Edit
nvme_ioctl.h
Edit
nvram.h
Edit
omap3isp.h
Edit
omapfb.h
Edit
oom.h
Edit
openat2.h
Edit
openvswitch.h
Edit
packet_diag.h
Edit
param.h
Edit
parport.h
Edit
patchkey.h
Edit
pci.h
Edit
pci_regs.h
Edit
pcitest.h
Edit
perf_event.h
Edit
personality.h
Edit
pfkeyv2.h
Edit
pfrut.h
Edit
pg.h
Edit
phantom.h
Edit
phonet.h
Edit
pidfd.h
Edit
pkt_cls.h
Edit
pkt_sched.h
Edit
pktcdvd.h
Edit
pmu.h
Edit
poll.h
Edit
posix_acl.h
Edit
posix_acl_xattr.h
Edit
posix_types.h
Edit
ppdev.h
Edit
ppp-comp.h
Edit
ppp-ioctl.h
Edit
ppp_defs.h
Edit
pps.h
Edit
pr.h
Edit
prctl.h
Edit
psample.h
Edit
psci.h
Edit
psp-dbc.h
Edit
psp-sev.h
Edit
ptp_clock.h
Edit
ptrace.h
Edit
qemu_fw_cfg.h
Edit
qnx4_fs.h
Edit
qnxtypes.h
Edit
qrtr.h
Edit
quota.h
Edit
radeonfb.h
Edit
raid
Edit
random.h
Edit
rds.h
Edit
reboot.h
Edit
reiserfs_fs.h
Edit
reiserfs_xattr.h
Edit
remoteproc_cdev.h
Edit
resource.h
Edit
rfkill.h
Edit
rio_cm_cdev.h
Edit
rio_mport_cdev.h
Edit
rkisp1-config.h
Edit
romfs_fs.h
Edit
rose.h
Edit
route.h
Edit
rpl.h
Edit
rpl_iptunnel.h
Edit
rpmsg.h
Edit
rpmsg_types.h
Edit
rseq.h
Edit
rtc.h
Edit
rtnetlink.h
Edit
rxrpc.h
Edit
scc.h
Edit
sched
Edit
sched.h
Edit
scif_ioctl.h
Edit
screen_info.h
Edit
sctp.h
Edit
seccomp.h
Edit
securebits.h
Edit
sed-opal.h
Edit
seg6.h
Edit
seg6_genl.h
Edit
seg6_hmac.h
Edit
seg6_iptunnel.h
Edit
seg6_local.h
Edit
selinux_netlink.h
Edit
sem.h
Edit
serial.h
Edit
serial_core.h
Edit
serial_reg.h
Edit
serio.h
Edit
sev-guest.h
Edit
shm.h
Edit
signal.h
Edit
signalfd.h
Edit
smc.h
Edit
smc_diag.h
Edit
smiapp.h
Edit
snmp.h
Edit
sock_diag.h
Edit
socket.h
Edit
sockios.h
Edit
sonet.h
Edit
sonypi.h
Edit
sound.h
Edit
soundcard.h
Edit
spi
Edit
stat.h
Edit
stddef.h
Edit
stm.h
Edit
string.h
Edit
sunrpc
Edit
surface_aggregator
Edit
suspend_ioctls.h
Edit
swab.h
Edit
switchtec_ioctl.h
Edit
sync_file.h
Edit
synclink.h
Edit
sysctl.h
Edit
sysinfo.h
Edit
target_core_user.h
Edit
taskstats.h
Edit
tc_act
Edit
tc_ematch
Edit
tcp.h
Edit
tcp_metrics.h
Edit
tdx-guest.h
Edit
tee.h
Edit
termios.h
Edit
thermal.h
Edit
time.h
Edit
time_types.h
Edit
timerfd.h
Edit
times.h
Edit
timex.h
Edit
tiocl.h
Edit
tipc.h
Edit
tipc_config.h
Edit
tipc_netlink.h
Edit
tipc_sockets_diag.h
Edit
tls.h
Edit
toshiba.h
Edit
tps6594_pfsm.h
Edit
tty.h
Edit
tty_flags.h
Edit
types.h
Edit
udf_fs_i.h
Edit
udmabuf.h
Edit
udp.h
Edit
uhid.h
Edit
uinput.h
Edit
uio.h
Edit
uleds.h
Edit
ultrasound.h
Edit
um_timetravel.h
Edit
un.h
Edit
unistd.h
Edit
unix_diag.h
Edit
usb
Edit
usbdevice_fs.h
Edit
usbip.h
Edit
userfaultfd.h
Edit
userio.h
Edit
utime.h
Edit
utsname.h
Edit
uuid.h
Edit
uvcvideo.h
Edit
v4l2-common.h
Edit
v4l2-controls.h
Edit
v4l2-dv-timings.h
Edit
v4l2-mediabus.h
Edit
v4l2-subdev.h
Edit
vbox_err.h
Edit
vbox_vmmdev_types.h
Edit
vboxguest.h
Edit
vdpa.h
Edit
vduse.h
Edit
version.h
Edit
veth.h
Edit
vfio.h
Edit
vfio_ccw.h
Edit
vfio_zdev.h
Edit
vhost.h
Edit
vhost_types.h
Edit
videodev2.h
Edit
virtio_9p.h
Edit
virtio_balloon.h
Edit
virtio_blk.h
Edit
virtio_bt.h
Edit
virtio_config.h
Edit
virtio_console.h
Edit
virtio_crypto.h
Edit
virtio_fs.h
Edit
virtio_gpio.h
Edit
virtio_gpu.h
Edit
virtio_i2c.h
Edit
virtio_ids.h
Edit
virtio_input.h
Edit
virtio_iommu.h
Edit
virtio_mem.h
Edit
virtio_mmio.h
Edit
virtio_net.h
Edit
virtio_pci.h
Edit
virtio_pcidev.h
Edit
virtio_pmem.h
Edit
virtio_ring.h
Edit
virtio_rng.h
Edit
virtio_scmi.h
Edit
virtio_scsi.h
Edit
virtio_snd.h
Edit
virtio_types.h
Edit
virtio_vsock.h
Edit
vm_sockets.h
Edit
vm_sockets_diag.h
Edit
vmcore.h
Edit
vsockmon.h
Edit
vt.h
Edit
vtpm_proxy.h
Edit
wait.h
Edit
watch_queue.h
Edit
watchdog.h
Edit
wireguard.h
Edit
wireless.h
Edit
wmi.h
Edit
wwan.h
Edit
x25.h
Edit
xattr.h
Edit
xdp_diag.h
Edit
xfrm.h
Edit
xilinx-v4l2-controls.h
Edit
zorro.h
Edit
zorro_ids.h
Edit