linux/include/uapi/linux/iommu.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
   2/*
   3 * IOMMU user API definitions
   4 */
   5
   6#ifndef _UAPI_IOMMU_H
   7#define _UAPI_IOMMU_H
   8
   9#include <linux/types.h>
  10
  11#define IOMMU_FAULT_PERM_READ   (1 << 0) /* read */
  12#define IOMMU_FAULT_PERM_WRITE  (1 << 1) /* write */
  13#define IOMMU_FAULT_PERM_EXEC   (1 << 2) /* exec */
  14#define IOMMU_FAULT_PERM_PRIV   (1 << 3) /* privileged */
  15
  16/* Generic fault types, can be expanded IRQ remapping fault */
  17enum iommu_fault_type {
  18        IOMMU_FAULT_DMA_UNRECOV = 1,    /* unrecoverable fault */
  19        IOMMU_FAULT_PAGE_REQ,           /* page request fault */
  20};
  21
  22enum iommu_fault_reason {
  23        IOMMU_FAULT_REASON_UNKNOWN = 0,
  24
  25        /* Could not access the PASID table (fetch caused external abort) */
  26        IOMMU_FAULT_REASON_PASID_FETCH,
  27
  28        /* PASID entry is invalid or has configuration errors */
  29        IOMMU_FAULT_REASON_BAD_PASID_ENTRY,
  30
  31        /*
  32         * PASID is out of range (e.g. exceeds the maximum PASID
  33         * supported by the IOMMU) or disabled.
  34         */
  35        IOMMU_FAULT_REASON_PASID_INVALID,
  36
  37        /*
  38         * An external abort occurred fetching (or updating) a translation
  39         * table descriptor
  40         */
  41        IOMMU_FAULT_REASON_WALK_EABT,
  42
  43        /*
  44         * Could not access the page table entry (Bad address),
  45         * actual translation fault
  46         */
  47        IOMMU_FAULT_REASON_PTE_FETCH,
  48
  49        /* Protection flag check failed */
  50        IOMMU_FAULT_REASON_PERMISSION,
  51
  52        /* access flag check failed */
  53        IOMMU_FAULT_REASON_ACCESS,
  54
  55        /* Output address of a translation stage caused Address Size fault */
  56        IOMMU_FAULT_REASON_OOR_ADDRESS,
  57};
  58
  59/**
  60 * struct iommu_fault_unrecoverable - Unrecoverable fault data
  61 * @reason: reason of the fault, from &enum iommu_fault_reason
  62 * @flags: parameters of this fault (IOMMU_FAULT_UNRECOV_* values)
  63 * @pasid: Process Address Space ID
  64 * @perm: requested permission access using by the incoming transaction
  65 *        (IOMMU_FAULT_PERM_* values)
  66 * @addr: offending page address
  67 * @fetch_addr: address that caused a fetch abort, if any
  68 */
  69struct iommu_fault_unrecoverable {
  70        __u32   reason;
  71#define IOMMU_FAULT_UNRECOV_PASID_VALID         (1 << 0)
  72#define IOMMU_FAULT_UNRECOV_ADDR_VALID          (1 << 1)
  73#define IOMMU_FAULT_UNRECOV_FETCH_ADDR_VALID    (1 << 2)
  74        __u32   flags;
  75        __u32   pasid;
  76        __u32   perm;
  77        __u64   addr;
  78        __u64   fetch_addr;
  79};
  80
  81/**
  82 * struct iommu_fault_page_request - Page Request data
  83 * @flags: encodes whether the corresponding fields are valid and whether this
  84 *         is the last page in group (IOMMU_FAULT_PAGE_REQUEST_* values).
  85 *         When IOMMU_FAULT_PAGE_RESPONSE_NEEDS_PASID is set, the page response
  86 *         must have the same PASID value as the page request. When it is clear,
  87 *         the page response should not have a PASID.
  88 * @pasid: Process Address Space ID
  89 * @grpid: Page Request Group Index
  90 * @perm: requested page permissions (IOMMU_FAULT_PERM_* values)
  91 * @addr: page address
  92 * @private_data: device-specific private information
  93 */
  94struct iommu_fault_page_request {
  95#define IOMMU_FAULT_PAGE_REQUEST_PASID_VALID    (1 << 0)
  96#define IOMMU_FAULT_PAGE_REQUEST_LAST_PAGE      (1 << 1)
  97#define IOMMU_FAULT_PAGE_REQUEST_PRIV_DATA      (1 << 2)
  98#define IOMMU_FAULT_PAGE_RESPONSE_NEEDS_PASID   (1 << 3)
  99        __u32   flags;
 100        __u32   pasid;
 101        __u32   grpid;
 102        __u32   perm;
 103        __u64   addr;
 104        __u64   private_data[2];
 105};
 106
 107/**
 108 * struct iommu_fault - Generic fault data
 109 * @type: fault type from &enum iommu_fault_type
 110 * @padding: reserved for future use (should be zero)
 111 * @event: fault event, when @type is %IOMMU_FAULT_DMA_UNRECOV
 112 * @prm: Page Request message, when @type is %IOMMU_FAULT_PAGE_REQ
 113 * @padding2: sets the fault size to allow for future extensions
 114 */
 115struct iommu_fault {
 116        __u32   type;
 117        __u32   padding;
 118        union {
 119                struct iommu_fault_unrecoverable event;
 120                struct iommu_fault_page_request prm;
 121                __u8 padding2[56];
 122        };
 123};
 124
 125/**
 126 * enum iommu_page_response_code - Return status of fault handlers
 127 * @IOMMU_PAGE_RESP_SUCCESS: Fault has been handled and the page tables
 128 *      populated, retry the access. This is "Success" in PCI PRI.
 129 * @IOMMU_PAGE_RESP_FAILURE: General error. Drop all subsequent faults from
 130 *      this device if possible. This is "Response Failure" in PCI PRI.
 131 * @IOMMU_PAGE_RESP_INVALID: Could not handle this fault, don't retry the
 132 *      access. This is "Invalid Request" in PCI PRI.
 133 */
 134enum iommu_page_response_code {
 135        IOMMU_PAGE_RESP_SUCCESS = 0,
 136        IOMMU_PAGE_RESP_INVALID,
 137        IOMMU_PAGE_RESP_FAILURE,
 138};
 139
 140/**
 141 * struct iommu_page_response - Generic page response information
 142 * @argsz: User filled size of this data
 143 * @version: API version of this structure
 144 * @flags: encodes whether the corresponding fields are valid
 145 *         (IOMMU_FAULT_PAGE_RESPONSE_* values)
 146 * @pasid: Process Address Space ID
 147 * @grpid: Page Request Group Index
 148 * @code: response code from &enum iommu_page_response_code
 149 */
 150struct iommu_page_response {
 151        __u32   argsz;
 152#define IOMMU_PAGE_RESP_VERSION_1       1
 153        __u32   version;
 154#define IOMMU_PAGE_RESP_PASID_VALID     (1 << 0)
 155        __u32   flags;
 156        __u32   pasid;
 157        __u32   grpid;
 158        __u32   code;
 159};
 160
 161/* defines the granularity of the invalidation */
 162enum iommu_inv_granularity {
 163        IOMMU_INV_GRANU_DOMAIN, /* domain-selective invalidation */
 164        IOMMU_INV_GRANU_PASID,  /* PASID-selective invalidation */
 165        IOMMU_INV_GRANU_ADDR,   /* page-selective invalidation */
 166        IOMMU_INV_GRANU_NR,     /* number of invalidation granularities */
 167};
 168
 169/**
 170 * struct iommu_inv_addr_info - Address Selective Invalidation Structure
 171 *
 172 * @flags: indicates the granularity of the address-selective invalidation
 173 * - If the PASID bit is set, the @pasid field is populated and the invalidation
 174 *   relates to cache entries tagged with this PASID and matching the address
 175 *   range.
 176 * - If ARCHID bit is set, @archid is populated and the invalidation relates
 177 *   to cache entries tagged with this architecture specific ID and matching
 178 *   the address range.
 179 * - Both PASID and ARCHID can be set as they may tag different caches.
 180 * - If neither PASID or ARCHID is set, global addr invalidation applies.
 181 * - The LEAF flag indicates whether only the leaf PTE caching needs to be
 182 *   invalidated and other paging structure caches can be preserved.
 183 * @pasid: process address space ID
 184 * @archid: architecture-specific ID
 185 * @addr: first stage/level input address
 186 * @granule_size: page/block size of the mapping in bytes
 187 * @nb_granules: number of contiguous granules to be invalidated
 188 */
 189struct iommu_inv_addr_info {
 190#define IOMMU_INV_ADDR_FLAGS_PASID      (1 << 0)
 191#define IOMMU_INV_ADDR_FLAGS_ARCHID     (1 << 1)
 192#define IOMMU_INV_ADDR_FLAGS_LEAF       (1 << 2)
 193        __u32   flags;
 194        __u32   archid;
 195        __u64   pasid;
 196        __u64   addr;
 197        __u64   granule_size;
 198        __u64   nb_granules;
 199};
 200
 201/**
 202 * struct iommu_inv_pasid_info - PASID Selective Invalidation Structure
 203 *
 204 * @flags: indicates the granularity of the PASID-selective invalidation
 205 * - If the PASID bit is set, the @pasid field is populated and the invalidation
 206 *   relates to cache entries tagged with this PASID and matching the address
 207 *   range.
 208 * - If the ARCHID bit is set, the @archid is populated and the invalidation
 209 *   relates to cache entries tagged with this architecture specific ID and
 210 *   matching the address range.
 211 * - Both PASID and ARCHID can be set as they may tag different caches.
 212 * - At least one of PASID or ARCHID must be set.
 213 * @pasid: process address space ID
 214 * @archid: architecture-specific ID
 215 */
 216struct iommu_inv_pasid_info {
 217#define IOMMU_INV_PASID_FLAGS_PASID     (1 << 0)
 218#define IOMMU_INV_PASID_FLAGS_ARCHID    (1 << 1)
 219        __u32   flags;
 220        __u32   archid;
 221        __u64   pasid;
 222};
 223
 224/**
 225 * struct iommu_cache_invalidate_info - First level/stage invalidation
 226 *     information
 227 * @argsz: User filled size of this data
 228 * @version: API version of this structure
 229 * @cache: bitfield that allows to select which caches to invalidate
 230 * @granularity: defines the lowest granularity used for the invalidation:
 231 *     domain > PASID > addr
 232 * @padding: reserved for future use (should be zero)
 233 * @pasid_info: invalidation data when @granularity is %IOMMU_INV_GRANU_PASID
 234 * @addr_info: invalidation data when @granularity is %IOMMU_INV_GRANU_ADDR
 235 *
 236 * Not all the combinations of cache/granularity are valid:
 237 *
 238 * +--------------+---------------+---------------+---------------+
 239 * | type /       |   DEV_IOTLB   |     IOTLB     |      PASID    |
 240 * | granularity  |               |               |      cache    |
 241 * +==============+===============+===============+===============+
 242 * | DOMAIN       |       N/A     |       Y       |       Y       |
 243 * +--------------+---------------+---------------+---------------+
 244 * | PASID        |       Y       |       Y       |       Y       |
 245 * +--------------+---------------+---------------+---------------+
 246 * | ADDR         |       Y       |       Y       |       N/A     |
 247 * +--------------+---------------+---------------+---------------+
 248 *
 249 * Invalidations by %IOMMU_INV_GRANU_DOMAIN don't take any argument other than
 250 * @version and @cache.
 251 *
 252 * If multiple cache types are invalidated simultaneously, they all
 253 * must support the used granularity.
 254 */
 255struct iommu_cache_invalidate_info {
 256        __u32   argsz;
 257#define IOMMU_CACHE_INVALIDATE_INFO_VERSION_1 1
 258        __u32   version;
 259/* IOMMU paging structure cache */
 260#define IOMMU_CACHE_INV_TYPE_IOTLB      (1 << 0) /* IOMMU IOTLB */
 261#define IOMMU_CACHE_INV_TYPE_DEV_IOTLB  (1 << 1) /* Device IOTLB */
 262#define IOMMU_CACHE_INV_TYPE_PASID      (1 << 2) /* PASID cache */
 263#define IOMMU_CACHE_INV_TYPE_NR         (3)
 264        __u8    cache;
 265        __u8    granularity;
 266        __u8    padding[6];
 267        union {
 268                struct iommu_inv_pasid_info pasid_info;
 269                struct iommu_inv_addr_info addr_info;
 270        } granu;
 271};
 272
 273/**
 274 * struct iommu_gpasid_bind_data_vtd - Intel VT-d specific data on device and guest
 275 * SVA binding.
 276 *
 277 * @flags:      VT-d PASID table entry attributes
 278 * @pat:        Page attribute table data to compute effective memory type
 279 * @emt:        Extended memory type
 280 *
 281 * Only guest vIOMMU selectable and effective options are passed down to
 282 * the host IOMMU.
 283 */
 284struct iommu_gpasid_bind_data_vtd {
 285#define IOMMU_SVA_VTD_GPASID_SRE        (1 << 0) /* supervisor request */
 286#define IOMMU_SVA_VTD_GPASID_EAFE       (1 << 1) /* extended access enable */
 287#define IOMMU_SVA_VTD_GPASID_PCD        (1 << 2) /* page-level cache disable */
 288#define IOMMU_SVA_VTD_GPASID_PWT        (1 << 3) /* page-level write through */
 289#define IOMMU_SVA_VTD_GPASID_EMTE       (1 << 4) /* extended mem type enable */
 290#define IOMMU_SVA_VTD_GPASID_CD         (1 << 5) /* PASID-level cache disable */
 291#define IOMMU_SVA_VTD_GPASID_LAST       (1 << 6)
 292        __u64 flags;
 293        __u32 pat;
 294        __u32 emt;
 295};
 296
 297#define IOMMU_SVA_VTD_GPASID_MTS_MASK   (IOMMU_SVA_VTD_GPASID_CD | \
 298                                         IOMMU_SVA_VTD_GPASID_EMTE | \
 299                                         IOMMU_SVA_VTD_GPASID_PCD |  \
 300                                         IOMMU_SVA_VTD_GPASID_PWT)
 301
 302/**
 303 * struct iommu_gpasid_bind_data - Information about device and guest PASID binding
 304 * @argsz:      User filled size of this data
 305 * @version:    Version of this data structure
 306 * @format:     PASID table entry format
 307 * @flags:      Additional information on guest bind request
 308 * @gpgd:       Guest page directory base of the guest mm to bind
 309 * @hpasid:     Process address space ID used for the guest mm in host IOMMU
 310 * @gpasid:     Process address space ID used for the guest mm in guest IOMMU
 311 * @addr_width: Guest virtual address width
 312 * @padding:    Reserved for future use (should be zero)
 313 * @vtd:        Intel VT-d specific data
 314 *
 315 * Guest to host PASID mapping can be an identity or non-identity, where guest
 316 * has its own PASID space. For non-identify mapping, guest to host PASID lookup
 317 * is needed when VM programs guest PASID into an assigned device. VMM may
 318 * trap such PASID programming then request host IOMMU driver to convert guest
 319 * PASID to host PASID based on this bind data.
 320 */
 321struct iommu_gpasid_bind_data {
 322        __u32 argsz;
 323#define IOMMU_GPASID_BIND_VERSION_1     1
 324        __u32 version;
 325#define IOMMU_PASID_FORMAT_INTEL_VTD    1
 326#define IOMMU_PASID_FORMAT_LAST         2
 327        __u32 format;
 328        __u32 addr_width;
 329#define IOMMU_SVA_GPASID_VAL    (1 << 0) /* guest PASID valid */
 330        __u64 flags;
 331        __u64 gpgd;
 332        __u64 hpasid;
 333        __u64 gpasid;
 334        __u8  padding[8];
 335        /* Vendor specific data */
 336        union {
 337                struct iommu_gpasid_bind_data_vtd vtd;
 338        } vendor;
 339};
 340
 341#endif /* _UAPI_IOMMU_H */
 342