root/include/uapi/linux/iommu.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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 */
  17 enum iommu_fault_type {
  18         IOMMU_FAULT_DMA_UNRECOV = 1,    /* unrecoverable fault */
  19         IOMMU_FAULT_PAGE_REQ,           /* page request fault */
  20 };
  21 
  22 enum 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  */
  69 struct 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  */
  91 struct 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  */
 111 struct 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  */
 130 enum 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  */
 145 struct 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 */

/* [<][>][^][v][top][bottom][index][help] */