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 * @pasid: Process Address Space ID
  86 * @grpid: Page Request Group Index
  87 * @perm: requested page permissions (IOMMU_FAULT_PERM_* values)
  88 * @addr: page address
  89 * @private_data: device-specific private information
  90 */
  91struct iommu_fault_page_request {
  92#define IOMMU_FAULT_PAGE_REQUEST_PASID_VALID    (1 << 0)
  93#define IOMMU_FAULT_PAGE_REQUEST_LAST_PAGE      (1 << 1)
  94#define IOMMU_FAULT_PAGE_REQUEST_PRIV_DATA      (1 << 2)
  95        __u32   flags;
  96        __u32   pasid;
  97        __u32   grpid;
  98        __u32   perm;
  99        __u64   addr;
 100        __u64   private_data[2];
 101};
 102
 103/**
 104 * struct iommu_fault - Generic fault data
 105 * @type: fault type from &enum iommu_fault_type
 106 * @padding: reserved for future use (should be zero)
 107 * @event: fault event, when @type is %IOMMU_FAULT_DMA_UNRECOV
 108 * @prm: Page Request message, when @type is %IOMMU_FAULT_PAGE_REQ
 109 * @padding2: sets the fault size to allow for future extensions
 110 */
 111struct iommu_fault {
 112        __u32   type;
 113        __u32   padding;
 114        union {
 115                struct iommu_fault_unrecoverable event;
 116                struct iommu_fault_page_request prm;
 117                __u8 padding2[56];
 118        };
 119};
 120
 121/**
 122 * enum iommu_page_response_code - Return status of fault handlers
 123 * @IOMMU_PAGE_RESP_SUCCESS: Fault has been handled and the page tables
 124 *      populated, retry the access. This is "Success" in PCI PRI.
 125 * @IOMMU_PAGE_RESP_FAILURE: General error. Drop all subsequent faults from
 126 *      this device if possible. This is "Response Failure" in PCI PRI.
 127 * @IOMMU_PAGE_RESP_INVALID: Could not handle this fault, don't retry the
 128 *      access. This is "Invalid Request" in PCI PRI.
 129 */
 130enum iommu_page_response_code {
 131        IOMMU_PAGE_RESP_SUCCESS = 0,
 132        IOMMU_PAGE_RESP_INVALID,
 133        IOMMU_PAGE_RESP_FAILURE,
 134};
 135
 136/**
 137 * struct iommu_page_response - Generic page response information
 138 * @version: API version of this structure
 139 * @flags: encodes whether the corresponding fields are valid
 140 *         (IOMMU_FAULT_PAGE_RESPONSE_* values)
 141 * @pasid: Process Address Space ID
 142 * @grpid: Page Request Group Index
 143 * @code: response code from &enum iommu_page_response_code
 144 */
 145struct iommu_page_response {
 146#define IOMMU_PAGE_RESP_VERSION_1       1
 147        __u32   version;
 148#define IOMMU_PAGE_RESP_PASID_VALID     (1 << 0)
 149        __u32   flags;
 150        __u32   pasid;
 151        __u32   grpid;
 152        __u32   code;
 153};
 154
 155#endif /* _UAPI_IOMMU_H */
 156