-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Device faults detected by IOMMU can be reported outside the IOMMU subsystem for further processing. This patch introduces a generic device fault data structure. The fault can be either an unrecoverable fault or a page request, also referred to as a recoverable fault. We only care about non internal faults that are likely to be reported to an external subsystem. Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Signed-off-by: Liu, Yi L <yi.l.liu@linux.intel.com> Signed-off-by: Ashok Raj <ashok.raj@intel.com> Signed-off-by: Eric Auger <eric.auger@redhat.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
- Loading branch information
Jacob Pan
authored and
Joerg Roedel
committed
Jun 12, 2019
1 parent
ec6bc2e
commit 4e32348
Showing
2 changed files
with
157 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ | ||
/* | ||
* IOMMU user API definitions | ||
*/ | ||
|
||
#ifndef _UAPI_IOMMU_H | ||
#define _UAPI_IOMMU_H | ||
|
||
#include <linux/types.h> | ||
|
||
#define IOMMU_FAULT_PERM_READ (1 << 0) /* read */ | ||
#define IOMMU_FAULT_PERM_WRITE (1 << 1) /* write */ | ||
#define IOMMU_FAULT_PERM_EXEC (1 << 2) /* exec */ | ||
#define IOMMU_FAULT_PERM_PRIV (1 << 3) /* privileged */ | ||
|
||
/* Generic fault types, can be expanded IRQ remapping fault */ | ||
enum iommu_fault_type { | ||
IOMMU_FAULT_DMA_UNRECOV = 1, /* unrecoverable fault */ | ||
IOMMU_FAULT_PAGE_REQ, /* page request fault */ | ||
}; | ||
|
||
enum iommu_fault_reason { | ||
IOMMU_FAULT_REASON_UNKNOWN = 0, | ||
|
||
/* Could not access the PASID table (fetch caused external abort) */ | ||
IOMMU_FAULT_REASON_PASID_FETCH, | ||
|
||
/* PASID entry is invalid or has configuration errors */ | ||
IOMMU_FAULT_REASON_BAD_PASID_ENTRY, | ||
|
||
/* | ||
* PASID is out of range (e.g. exceeds the maximum PASID | ||
* supported by the IOMMU) or disabled. | ||
*/ | ||
IOMMU_FAULT_REASON_PASID_INVALID, | ||
|
||
/* | ||
* An external abort occurred fetching (or updating) a translation | ||
* table descriptor | ||
*/ | ||
IOMMU_FAULT_REASON_WALK_EABT, | ||
|
||
/* | ||
* Could not access the page table entry (Bad address), | ||
* actual translation fault | ||
*/ | ||
IOMMU_FAULT_REASON_PTE_FETCH, | ||
|
||
/* Protection flag check failed */ | ||
IOMMU_FAULT_REASON_PERMISSION, | ||
|
||
/* access flag check failed */ | ||
IOMMU_FAULT_REASON_ACCESS, | ||
|
||
/* Output address of a translation stage caused Address Size fault */ | ||
IOMMU_FAULT_REASON_OOR_ADDRESS, | ||
}; | ||
|
||
/** | ||
* struct iommu_fault_unrecoverable - Unrecoverable fault data | ||
* @reason: reason of the fault, from &enum iommu_fault_reason | ||
* @flags: parameters of this fault (IOMMU_FAULT_UNRECOV_* values) | ||
* @pasid: Process Address Space ID | ||
* @perm: requested permission access using by the incoming transaction | ||
* (IOMMU_FAULT_PERM_* values) | ||
* @addr: offending page address | ||
* @fetch_addr: address that caused a fetch abort, if any | ||
*/ | ||
struct iommu_fault_unrecoverable { | ||
__u32 reason; | ||
#define IOMMU_FAULT_UNRECOV_PASID_VALID (1 << 0) | ||
#define IOMMU_FAULT_UNRECOV_ADDR_VALID (1 << 1) | ||
#define IOMMU_FAULT_UNRECOV_FETCH_ADDR_VALID (1 << 2) | ||
__u32 flags; | ||
__u32 pasid; | ||
__u32 perm; | ||
__u64 addr; | ||
__u64 fetch_addr; | ||
}; | ||
|
||
/** | ||
* struct iommu_fault_page_request - Page Request data | ||
* @flags: encodes whether the corresponding fields are valid and whether this | ||
* is the last page in group (IOMMU_FAULT_PAGE_REQUEST_* values) | ||
* @pasid: Process Address Space ID | ||
* @grpid: Page Request Group Index | ||
* @perm: requested page permissions (IOMMU_FAULT_PERM_* values) | ||
* @addr: page address | ||
* @private_data: device-specific private information | ||
*/ | ||
struct iommu_fault_page_request { | ||
#define IOMMU_FAULT_PAGE_REQUEST_PASID_VALID (1 << 0) | ||
#define IOMMU_FAULT_PAGE_REQUEST_LAST_PAGE (1 << 1) | ||
#define IOMMU_FAULT_PAGE_REQUEST_PRIV_DATA (1 << 2) | ||
__u32 flags; | ||
__u32 pasid; | ||
__u32 grpid; | ||
__u32 perm; | ||
__u64 addr; | ||
__u64 private_data[2]; | ||
}; | ||
|
||
/** | ||
* struct iommu_fault - Generic fault data | ||
* @type: fault type from &enum iommu_fault_type | ||
* @padding: reserved for future use (should be zero) | ||
* @event: fault event, when @type is %IOMMU_FAULT_DMA_UNRECOV | ||
* @prm: Page Request message, when @type is %IOMMU_FAULT_PAGE_REQ | ||
*/ | ||
struct iommu_fault { | ||
__u32 type; | ||
__u32 padding; | ||
union { | ||
struct iommu_fault_unrecoverable event; | ||
struct iommu_fault_page_request prm; | ||
}; | ||
}; | ||
#endif /* _UAPI_IOMMU_H */ |