VT-d
include/drivers/iommu/vt_d.h View source View on GitHubStructs
Section titled “Structs”vtd_regs
Section titled “vtd_regs” struct vtd_regs (33 fields) source
uint32_t _res0 uint64_t capabilities Capability
uint64_t extended_capabilities Extended Capability
uint32_t global_command Global Command
uint32_t global_status Global Status
uint64_t root_table_addr Root Table Address
uint64_t context_command Context Command
uint32_t _res1 uint32_t fault_status Fault Status
uint32_t fault_event_control Fault Event Control
uint32_t fault_event_data Fault Event Data
uint32_t fault_event_addr Fault Event Address
uint32_t fault_event_addr_upper Fault Event Upper Address
uint64_t _res2[2] uint64_t advanced_fault_log Advanced Fault Log
uint32_t _res3 uint32_t protected_memory_enable Protected Memory Enable
uint32_t protected_low_mem_base Protected Low Mem Base
uint32_t protected_low_mem_limit Protected Low Mem Limit
uint64_t protected_high_mem_base Protected High Mem Base
uint64_t protected_high_mem_limit Protected High Mem Limit
uint64_t invalidation_queue_head Invalidation Queue Head
uint64_t invalidation_queue_tail Invalidation Queue Tail
uint64_t invalidation_queue_addr Invalidation Queue Addr
uint32_t _res4 uint32_t invalidation_comp_status Invalidation Completion Status
uint32_t invalidation_event_ctrl Invalidation Event Control
uint32_t invalidation_event_data Invalidation Event Data
uint32_t invalidation_event_addr Invalidation Event Address
uint32_t invalidation_event_addr_upper Invalidation Event Upper Addr
uint64_t invalidation_queue_error_record IQ Error Record
uint64_t interrupt_remapping_table_addr IR Table Address
vtd_unit
Section titled “vtd_unit” struct vtd_unit (14 fields) source
vtd_domain
Section titled “vtd_domain”vtd_root_entry
Section titled “vtd_root_entry”vtd_context_entry
Section titled “vtd_context_entry”vtd_inv_desc
Section titled “vtd_inv_desc”Functions
Section titled “Functions”vtd_unit_create
Section titled “vtd_unit_create”vtd_cap_domain_count
Section titled “vtd_cap_domain_count”uint32_t vtd_cap_domain_count(uint64_t cap) source ND encoding to actual domain count
Macros
Section titled “Macros”vtd_log
Section titled “vtd_log”#define vtd_log(lvl, fmt, ...) source Expansion
#define vtd_log(lvl, fmt, ...) \
log(LOG_SITE(vtd), LOG_HANDLE(vtd), lvl, fmt, ##__VA_ARGS__) vtd_err
Section titled “vtd_err”#define vtd_err(fmt, ...) source vtd_warn
Section titled “vtd_warn”#define vtd_warn(fmt, ...) source vtd_info
Section titled “vtd_info”#define vtd_info(fmt, ...) source vtd_debug
Section titled “vtd_debug”#define vtd_debug(fmt, ...) source vtd_trace
Section titled “vtd_trace”#define vtd_trace(fmt, ...) source CAP_NUM_DOMAINS
Section titled “CAP_NUM_DOMAINS”#define CAP_NUM_DOMAINS(cap) source CAP - Capability Register (64-bit, offset 0x008) Intel VT-d spec 11.4.2
Expansion
#define CAP_NUM_DOMAINS(cap) \
BIT_RANGE((cap), 0, 2) /* ND - Number of Domains supported (encoded) \
*/ CAP_REQUIRES_WRITE_BUF_FLUSH
Section titled “CAP_REQUIRES_WRITE_BUF_FLUSH”#define CAP_REQUIRES_WRITE_BUF_FLUSH(cap) source Expansion
#define CAP_REQUIRES_WRITE_BUF_FLUSH(cap) \
BIT_RANGE((cap), 4, 4) /* RWBF - Required Write-Buffer Flushing */ CAP_PROTECTED_LOW_MEMORY
Section titled “CAP_PROTECTED_LOW_MEMORY”#define CAP_PROTECTED_LOW_MEMORY(cap) source Expansion
#define CAP_PROTECTED_LOW_MEMORY(cap) \
BIT_RANGE((cap), 5, 5) /* PLMR - Protected Low-Memory Region */ CAP_PROTECTED_HIGH_MEMORY
Section titled “CAP_PROTECTED_HIGH_MEMORY”#define CAP_PROTECTED_HIGH_MEMORY(cap) source Expansion
#define CAP_PROTECTED_HIGH_MEMORY(cap) \
BIT_RANGE((cap), 6, 6) /* PHMR - Protected High-Memory Region */ CAP_CACHING_MODE
Section titled “CAP_CACHING_MODE”#define CAP_CACHING_MODE(cap) source CM
Expansion
#define CAP_CACHING_MODE(cap) BIT_RANGE((cap), 7, 7) /* CM */ CAP_SUPPORTED_ADDR_WIDTHS
Section titled “CAP_SUPPORTED_ADDR_WIDTHS”#define CAP_SUPPORTED_ADDR_WIDTHS(cap) source Expansion
#define CAP_SUPPORTED_ADDR_WIDTHS(cap) \
BIT_RANGE((cap), 8, \
12) /* SAGAW - Supported Adjusted Guest Address Widths */ CAP_MAX_ADDR_WIDTH
Section titled “CAP_MAX_ADDR_WIDTH”#define CAP_MAX_ADDR_WIDTH(cap) source Expansion
#define CAP_MAX_ADDR_WIDTH(cap) \
BIT_RANGE((cap), 16, 21) /* MGAW - Maximum Guest Address Width */ CAP_ZERO_LENGTH_READ
Section titled “CAP_ZERO_LENGTH_READ”#define CAP_ZERO_LENGTH_READ(cap) source ZLR
Expansion
#define CAP_ZERO_LENGTH_READ(cap) BIT_RANGE((cap), 22, 22) /* ZLR */ CAP_FAULT_RECORD_OFFSET
Section titled “CAP_FAULT_RECORD_OFFSET”#define CAP_FAULT_RECORD_OFFSET(cap) source Expansion
#define CAP_FAULT_RECORD_OFFSET(cap) \
BIT_RANGE((cap), 24, 33) /* FRO - Fault-Recording Register Offset */ CAP_LARGE_PAGE_SUPPORT
Section titled “CAP_LARGE_PAGE_SUPPORT”#define CAP_LARGE_PAGE_SUPPORT(cap) source Expansion
#define CAP_LARGE_PAGE_SUPPORT(cap) \
BIT_RANGE((cap), 34, 37) /* SLLPS - Second-Level Large Page Support */ CAP_PAGE_SELECTIVE_INVALIDATION
Section titled “CAP_PAGE_SELECTIVE_INVALIDATION”#define CAP_PAGE_SELECTIVE_INVALIDATION(cap) source Expansion
#define CAP_PAGE_SELECTIVE_INVALIDATION(cap) \
BIT_RANGE((cap), 39, 39) /* PSI \
*/ CAP_NUM_FAULT_RECORDS
Section titled “CAP_NUM_FAULT_RECORDS”#define CAP_NUM_FAULT_RECORDS(cap) source Expansion
#define CAP_NUM_FAULT_RECORDS(cap) \
BIT_RANGE((cap), 40, 47) /* NFR - Number of Fault-Recording Registers \
*/ CAP_MAX_ADDR_MASK_VALUE
Section titled “CAP_MAX_ADDR_MASK_VALUE”#define CAP_MAX_ADDR_MASK_VALUE(cap) source MAMV
Expansion
#define CAP_MAX_ADDR_MASK_VALUE(cap) BIT_RANGE((cap), 48, 53) /* MAMV */ CAP_WRITE_DRAINING
Section titled “CAP_WRITE_DRAINING”#define CAP_WRITE_DRAINING(cap) source DWD
Expansion
#define CAP_WRITE_DRAINING(cap) BIT_RANGE((cap), 54, 54) /* DWD */ CAP_READ_DRAINING
Section titled “CAP_READ_DRAINING”#define CAP_READ_DRAINING(cap) source DRD
Expansion
#define CAP_READ_DRAINING(cap) BIT_RANGE((cap), 55, 55) /* DRD */ CAP_FIRST_LEVEL_1GB_PAGE
Section titled “CAP_FIRST_LEVEL_1GB_PAGE”#define CAP_FIRST_LEVEL_1GB_PAGE(cap) source FL1GP
Expansion
#define CAP_FIRST_LEVEL_1GB_PAGE(cap) BIT_RANGE((cap), 56, 56) /* FL1GP */ CAP_POSTED_INTERRUPTS
Section titled “CAP_POSTED_INTERRUPTS”#define CAP_POSTED_INTERRUPTS(cap) source PI
Expansion
#define CAP_POSTED_INTERRUPTS(cap) BIT_RANGE((cap), 59, 59) /* PI */ CAP_FIRST_STAGE_5LEVEL_PAGING
Section titled “CAP_FIRST_STAGE_5LEVEL_PAGING”#define CAP_FIRST_STAGE_5LEVEL_PAGING(cap) source Expansion
#define CAP_FIRST_STAGE_5LEVEL_PAGING(cap) \
BIT_RANGE((cap), 60, 60) /* FL5LP / FS5LP */ CAP_ENHANCED_COMMAND_SUPPORT
Section titled “CAP_ENHANCED_COMMAND_SUPPORT”#define CAP_ENHANCED_COMMAND_SUPPORT(cap) source ECMDS
Expansion
#define CAP_ENHANCED_COMMAND_SUPPORT(cap) BIT_RANGE((cap), 61, 61) /* ECMDS */ CAP_ENHANCED_SET_INTR_REMAP_TABLE_PTR_SUPPORT
Section titled “CAP_ENHANCED_SET_INTR_REMAP_TABLE_PTR_SUPPORT”#define CAP_ENHANCED_SET_INTR_REMAP_TABLE_PTR_SUPPORT(cap) source Expansion
#define CAP_ENHANCED_SET_INTR_REMAP_TABLE_PTR_SUPPORT(cap) \
BIT_RANGE( \
(cap), 62, \
62) /* ESIRTPS - Enhanced Set Interrupt Remap Table Pointer Support */ CAP_ENHANCED_SET_ROOT_TABLE_PTR_SUPPORT
Section titled “CAP_ENHANCED_SET_ROOT_TABLE_PTR_SUPPORT”#define CAP_ENHANCED_SET_ROOT_TABLE_PTR_SUPPORT(cap) source Expansion
#define CAP_ENHANCED_SET_ROOT_TABLE_PTR_SUPPORT(cap) \
BIT_RANGE((cap), 63, \
63) /* ESRTPS - Enhanced Set Root Table Pointer Support */ ECAP_COHERENCY
Section titled “ECAP_COHERENCY”#define ECAP_COHERENCY(ecap) source ECAP - Extended Capability Register (64-bit, offset 0x010) Intel VT-d spec 11.4.3
C
Expansion
#define ECAP_COHERENCY(ecap) BIT_RANGE((ecap), 0, 0) /* C */ ECAP_QUEUED_INVALIDATION
Section titled “ECAP_QUEUED_INVALIDATION”#define ECAP_QUEUED_INVALIDATION(ecap) source QI
Expansion
#define ECAP_QUEUED_INVALIDATION(ecap) BIT_RANGE((ecap), 1, 1) /* QI */ ECAP_DEVICE_TLB
Section titled “ECAP_DEVICE_TLB”#define ECAP_DEVICE_TLB(ecap) source DT
Expansion
#define ECAP_DEVICE_TLB(ecap) BIT_RANGE((ecap), 2, 2) /* DT */ ECAP_INTERRUPT_REMAPPING
Section titled “ECAP_INTERRUPT_REMAPPING”#define ECAP_INTERRUPT_REMAPPING(ecap) source IR
Expansion
#define ECAP_INTERRUPT_REMAPPING(ecap) BIT_RANGE((ecap), 3, 3) /* IR */ ECAP_EXTENDED_INTERRUPT_MODE
Section titled “ECAP_EXTENDED_INTERRUPT_MODE”#define ECAP_EXTENDED_INTERRUPT_MODE(ecap) source EIM
Expansion
#define ECAP_EXTENDED_INTERRUPT_MODE(ecap) BIT_RANGE((ecap), 4, 4) /* EIM */ ECAP_PASS_THROUGH
Section titled “ECAP_PASS_THROUGH”#define ECAP_PASS_THROUGH(ecap) source PT
Expansion
#define ECAP_PASS_THROUGH(ecap) BIT_RANGE((ecap), 6, 6) /* PT */ ECAP_SNOOP_CONTROL
Section titled “ECAP_SNOOP_CONTROL”#define ECAP_SNOOP_CONTROL(ecap) source SC
Expansion
#define ECAP_SNOOP_CONTROL(ecap) BIT_RANGE((ecap), 7, 7) /* SC */ ECAP_IOTLB_REGISTER_OFFSET
Section titled “ECAP_IOTLB_REGISTER_OFFSET”#define ECAP_IOTLB_REGISTER_OFFSET(ecap) source IRO
Expansion
#define ECAP_IOTLB_REGISTER_OFFSET(ecap) BIT_RANGE((ecap), 8, 17) /* IRO */ ECAP_MAX_HANDLE_MASK_VALUE
Section titled “ECAP_MAX_HANDLE_MASK_VALUE”#define ECAP_MAX_HANDLE_MASK_VALUE(ecap) source MHMV
Expansion
#define ECAP_MAX_HANDLE_MASK_VALUE(ecap) BIT_RANGE((ecap), 20, 23) /* MHMV */ ECAP_MEMORY_TYPE_SUPPORT
Section titled “ECAP_MEMORY_TYPE_SUPPORT”#define ECAP_MEMORY_TYPE_SUPPORT(ecap) source MTS
Expansion
#define ECAP_MEMORY_TYPE_SUPPORT(ecap) BIT_RANGE((ecap), 25, 25) /* MTS */ ECAP_NESTED_TRANSLATION
Section titled “ECAP_NESTED_TRANSLATION”#define ECAP_NESTED_TRANSLATION(ecap) source NEST
Expansion
#define ECAP_NESTED_TRANSLATION(ecap) BIT_RANGE((ecap), 26, 26) /* NEST */ ECAP_PAGE_REQUEST_SUPPORT
Section titled “ECAP_PAGE_REQUEST_SUPPORT”#define ECAP_PAGE_REQUEST_SUPPORT(arg) source PRS
Expansion
#define ECAP_PAGE_REQUEST_SUPPORT(arg) BIT_TEST((arg), 29) /* PRS */ ECAP_EXECUTE_REQUEST_SUPPORT
Section titled “ECAP_EXECUTE_REQUEST_SUPPORT”#define ECAP_EXECUTE_REQUEST_SUPPORT(arg) source ERS
Expansion
#define ECAP_EXECUTE_REQUEST_SUPPORT(arg) BIT_TEST((arg), 30) /* ERS */ ECAP_SUPERVISOR_REQUEST_SUPPORT
Section titled “ECAP_SUPERVISOR_REQUEST_SUPPORT”#define ECAP_SUPERVISOR_REQUEST_SUPPORT(arg) source SRS
Expansion
#define ECAP_SUPERVISOR_REQUEST_SUPPORT(arg) BIT_TEST((arg), 31) /* SRS */ ECAP_NO_WRITE_FLAG_SUPPORT
Section titled “ECAP_NO_WRITE_FLAG_SUPPORT”#define ECAP_NO_WRITE_FLAG_SUPPORT(arg) source NWFS
Expansion
#define ECAP_NO_WRITE_FLAG_SUPPORT(arg) BIT_TEST((arg), 33) /* NWFS */ ECAP_EXTENDED_ACCESSED_FLAG_SUPPORT
Section titled “ECAP_EXTENDED_ACCESSED_FLAG_SUPPORT”#define ECAP_EXTENDED_ACCESSED_FLAG_SUPPORT(arg) source Expansion
#define ECAP_EXTENDED_ACCESSED_FLAG_SUPPORT(arg) \
BIT_TEST((arg), 34) /* EAFS \
*/ ECAP_PASID_SIZE_SUPPORTED
Section titled “ECAP_PASID_SIZE_SUPPORTED”#define ECAP_PASID_SIZE_SUPPORTED(arg) source Expansion
#define ECAP_PASID_SIZE_SUPPORTED(arg) \
BIT_RANGE((arg), 35, 39) /* PSS - Process Address Space ID size */ ECAP_PASID_SUPPORT
Section titled “ECAP_PASID_SUPPORT”#define ECAP_PASID_SUPPORT(arg) source PASID
Expansion
#define ECAP_PASID_SUPPORT(arg) BIT_TEST((arg), 40) /* PASID */ ECAP_DEVICE_TLB_INVAL_THROTTLE
Section titled “ECAP_DEVICE_TLB_INVAL_THROTTLE”#define ECAP_DEVICE_TLB_INVAL_THROTTLE(arg) source Expansion
#define ECAP_DEVICE_TLB_INVAL_THROTTLE(arg) \
BIT_TEST((arg), 41) /* DIT \
*/ ECAP_PAGE_REQUEST_DRAIN_SUPPORT
Section titled “ECAP_PAGE_REQUEST_DRAIN_SUPPORT”#define ECAP_PAGE_REQUEST_DRAIN_SUPPORT(arg) source PDS
Expansion
#define ECAP_PAGE_REQUEST_DRAIN_SUPPORT(arg) BIT_TEST((arg), 42) /* PDS */ ECAP_SCALABLE_MODE_TRANSLATION_SUPPORT
Section titled “ECAP_SCALABLE_MODE_TRANSLATION_SUPPORT”#define ECAP_SCALABLE_MODE_TRANSLATION_SUPPORT(arg) source Expansion
#define ECAP_SCALABLE_MODE_TRANSLATION_SUPPORT(arg) \
BIT_TEST((arg), 43) /* SMTS */ ECAP_VIRTUAL_COMMAND_SUPPORT
Section titled “ECAP_VIRTUAL_COMMAND_SUPPORT”#define ECAP_VIRTUAL_COMMAND_SUPPORT(arg) source VCS
Expansion
#define ECAP_VIRTUAL_COMMAND_SUPPORT(arg) BIT_TEST((arg), 44) /* VCS */ ECAP_SECOND_STAGE_ACCESSED_DIRTY_SUPPORT
Section titled “ECAP_SECOND_STAGE_ACCESSED_DIRTY_SUPPORT”#define ECAP_SECOND_STAGE_ACCESSED_DIRTY_SUPPORT(arg) source Expansion
#define ECAP_SECOND_STAGE_ACCESSED_DIRTY_SUPPORT(arg) \
BIT_TEST((arg), 45) /* SSADS */ ECAP_SECOND_STAGE_TRANSLATION_SUPPORT
Section titled “ECAP_SECOND_STAGE_TRANSLATION_SUPPORT”#define ECAP_SECOND_STAGE_TRANSLATION_SUPPORT(arg) source Expansion
#define ECAP_SECOND_STAGE_TRANSLATION_SUPPORT(arg) \
BIT_TEST((arg), 46) /* SSTS */ ECAP_FIRST_STAGE_TRANSLATION_SUPPORT
Section titled “ECAP_FIRST_STAGE_TRANSLATION_SUPPORT”#define ECAP_FIRST_STAGE_TRANSLATION_SUPPORT(arg) source Expansion
#define ECAP_FIRST_STAGE_TRANSLATION_SUPPORT(arg) \
BIT_TEST((arg), 47) /* FSTS (do not confuse with Fault Status register) */ ECAP_SCALABLE_MODE_PAGE_WALK_COHERENCY_SUPPORT
Section titled “ECAP_SCALABLE_MODE_PAGE_WALK_COHERENCY_SUPPORT”#define ECAP_SCALABLE_MODE_PAGE_WALK_COHERENCY_SUPPORT(arg) source Expansion
#define ECAP_SCALABLE_MODE_PAGE_WALK_COHERENCY_SUPPORT(arg) \
BIT_TEST((arg), 48) /* SMPWCS */ ECAP_RID_PASID_SUPPORT
Section titled “ECAP_RID_PASID_SUPPORT”#define ECAP_RID_PASID_SUPPORT(arg) source Expansion
#define ECAP_RID_PASID_SUPPORT(arg) \
BIT_TEST((arg), 49) /* RPS - Requester-ID/PASID */ ECAP_PERFORMANCE_MONITORING_SUPPORT
Section titled “ECAP_PERFORMANCE_MONITORING_SUPPORT”#define ECAP_PERFORMANCE_MONITORING_SUPPORT(arg) source PMS
Expansion
#define ECAP_PERFORMANCE_MONITORING_SUPPORT(arg) BIT_TEST((arg), 51) /* PMS */ ECAP_ABORT_DMA_MODE_SUPPORT
Section titled “ECAP_ABORT_DMA_MODE_SUPPORT”#define ECAP_ABORT_DMA_MODE_SUPPORT(arg) source ADMS
Expansion
#define ECAP_ABORT_DMA_MODE_SUPPORT(arg) BIT_TEST((arg), 52) /* ADMS */ ECAP_RID_PRIV_SUPPORT
Section titled “ECAP_RID_PRIV_SUPPORT”#define ECAP_RID_PRIV_SUPPORT(arg) source Expansion
#define ECAP_RID_PRIV_SUPPORT(arg) \
BIT_TEST((arg), 53) /* RPRIVS - Requester-ID Privilege */ ECAP_STOP_MARKER_SUPPORT
Section titled “ECAP_STOP_MARKER_SUPPORT”#define ECAP_STOP_MARKER_SUPPORT(arg) source SMS
Expansion
#define ECAP_STOP_MARKER_SUPPORT(arg) BIT_TEST((arg), 58) /* SMS */ ADDR_WIDTH_39BIT
Section titled “ADDR_WIDTH_39BIT”Bit positions in CAP_SUPPORTED_ADDR_WIDTHS (CAP.SAGAW) Each bit indicates a supported guest address width / page-table depth.
3-level page table
ADDR_WIDTH_48BIT
Section titled “ADDR_WIDTH_48BIT”ADDR_WIDTH_57BIT
Section titled “ADDR_WIDTH_57BIT”GCMD_TRANSLATION_ENABLE
Section titled “GCMD_TRANSLATION_ENABLE”GCMD - Global Command Register (32-bit, offset 0x018) GSTS - Global Status Register (32-bit, offset 0x01C) Intel VT-d spec 11.4.4, 11.4.5
TE
GCMD_SET_ROOT_TABLE_PTR
Section titled “GCMD_SET_ROOT_TABLE_PTR”GCMD_WRITE_BUFFER_FLUSH
Section titled “GCMD_WRITE_BUFFER_FLUSH”GCMD_QUEUED_INVAL_ENABLE
Section titled “GCMD_QUEUED_INVAL_ENABLE”GCMD_INTERRUPT_REMAP_ENABLE
Section titled “GCMD_INTERRUPT_REMAP_ENABLE”GCMD_SET_INTR_REMAP_TABLE_PTR
Section titled “GCMD_SET_INTR_REMAP_TABLE_PTR”#define GCMD_SET_INTR_REMAP_TABLE_PTR source Expansion
#define GCMD_SET_INTR_REMAP_TABLE_PTR \
BIT(24) /* SIRTP - Set Interrupt Remap Table Pointer */ GCMD_COMPAT_FORMAT_INTERRUPT
Section titled “GCMD_COMPAT_FORMAT_INTERRUPT”#define GCMD_COMPAT_FORMAT_INTERRUPT source Expansion
#define GCMD_COMPAT_FORMAT_INTERRUPT \
BIT(23) /* CFI - Compatibility Format Interrupt */ GSTS_TRANSLATION_ENABLED
Section titled “GSTS_TRANSLATION_ENABLED”GSTS_ROOT_TABLE_PTR_SET
Section titled “GSTS_ROOT_TABLE_PTR_SET”GSTS_WRITE_BUFFER_FLUSH_STATUS
Section titled “GSTS_WRITE_BUFFER_FLUSH_STATUS”GSTS_QUEUED_INVAL_ENABLED
Section titled “GSTS_QUEUED_INVAL_ENABLED”GSTS_INTERRUPT_REMAP_ENABLED
Section titled “GSTS_INTERRUPT_REMAP_ENABLED”GSTS_INTR_REMAP_TABLE_PTR_SET
Section titled “GSTS_INTR_REMAP_TABLE_PTR_SET”GSTS_COMPAT_FORMAT_INTERRUPT_STATUS
Section titled “GSTS_COMPAT_FORMAT_INTERRUPT_STATUS”RTADDR_TRANSLATION_MODE_LEGACY
Section titled “RTADDR_TRANSLATION_MODE_LEGACY”#define RTADDR_TRANSLATION_MODE_LEGACY (0ULL << 10) source RTADDR - Root Table Address Register (64-bit, offset 0x020) TTM = Translation Table Mode (bits 10-11).
RTADDR_TRANSLATION_MODE_SCALABLE
Section titled “RTADDR_TRANSLATION_MODE_SCALABLE”FSTS_PRIMARY_FAULT_OVERFLOW
Section titled “FSTS_PRIMARY_FAULT_OVERFLOW”FSTS - Fault Status Register (32-bit, offset 0x034)
PFO
FSTS_PRIMARY_PENDING_FAULT
Section titled “FSTS_PRIMARY_PENDING_FAULT”FSTS_ADVANCED_FAULT_OVERFLOW
Section titled “FSTS_ADVANCED_FAULT_OVERFLOW”FSTS_ADVANCED_PENDING_FAULT
Section titled “FSTS_ADVANCED_PENDING_FAULT”FSTS_INVAL_QUEUE_ERROR
Section titled “FSTS_INVAL_QUEUE_ERROR”FSTS_INVAL_COMPLETION_ERROR
Section titled “FSTS_INVAL_COMPLETION_ERROR”FSTS_INVAL_TIMEOUT_ERROR
Section titled “FSTS_INVAL_TIMEOUT_ERROR”FSTS_PAGE_REQUEST_OVERFLOW
Section titled “FSTS_PAGE_REQUEST_OVERFLOW”FSTS_FAULT_RECORD_INDEX
Section titled “FSTS_FAULT_RECORD_INDEX”#define FSTS_FAULT_RECORD_INDEX(s) source FRI
Expansion
#define FSTS_FAULT_RECORD_INDEX(s) BIT_RANGE((s), 8, 15) /* FRI */ ROOT_ENTRY_PRESENT
Section titled “ROOT_ENTRY_PRESENT”Root Entry (128-bit / two 64-bit words) - Intel VT-d spec 9.1 CTP = Context-Table Pointer (bits 12-63 of the lo word).
ROOT_ENTRY_CONTEXT_TABLE_PTR_SHIFT
Section titled “ROOT_ENTRY_CONTEXT_TABLE_PTR_SHIFT”#define ROOT_ENTRY_CONTEXT_TABLE_PTR_SHIFT 12 source ROOT_ENTRY_CONTEXT_TABLE_PTR_MASK
Section titled “ROOT_ENTRY_CONTEXT_TABLE_PTR_MASK”#define ROOT_ENTRY_CONTEXT_TABLE_PTR_MASK (~0xFFFULL) source ROOT_ENTRY_SET_CONTEXT_TABLE_PTR
Section titled “ROOT_ENTRY_SET_CONTEXT_TABLE_PTR”#define ROOT_ENTRY_SET_CONTEXT_TABLE_PTR(phys) source Expansion
#define ROOT_ENTRY_SET_CONTEXT_TABLE_PTR(phys) \
(((phys) & ROOT_ENTRY_CONTEXT_TABLE_PTR_MASK) | ROOT_ENTRY_PRESENT) CTX_ENTRY_PRESENT
Section titled “CTX_ENTRY_PRESENT”Context Entry (128-bit / two 64-bit words) - Intel VT-d spec 9.3 Field acronyms used as suffixes: FPD - Fault Processing Disable TT - Translation Type SLPTPTR - Second-Level Page-Table Pointer AW - Address Width DID - Domain Identifier
CTX_ENTRY_FAULT_PROCESSING_DISABLE
Section titled “CTX_ENTRY_FAULT_PROCESSING_DISABLE”CTX_ENTRY_TRANSLATION_TYPE_SHIFT
Section titled “CTX_ENTRY_TRANSLATION_TYPE_SHIFT”#define CTX_ENTRY_TRANSLATION_TYPE_SHIFT 2 source CTX_ENTRY_TRANSLATION_TYPE_UNTRANSLATED
Section titled “CTX_ENTRY_TRANSLATION_TYPE_UNTRANSLATED”#define CTX_ENTRY_TRANSLATION_TYPE_UNTRANSLATED (0ULL << 2) source CTX_ENTRY_TRANSLATION_TYPE_PASSTHROUGH
Section titled “CTX_ENTRY_TRANSLATION_TYPE_PASSTHROUGH”#define CTX_ENTRY_TRANSLATION_TYPE_PASSTHROUGH (2ULL << 2) source CTX_ENTRY_SL_PTR_SHIFT
Section titled “CTX_ENTRY_SL_PTR_SHIFT”#define CTX_ENTRY_SL_PTR_SHIFT 12 source CTX_ENTRY_SL_PTR_MASK
Section titled “CTX_ENTRY_SL_PTR_MASK”#define CTX_ENTRY_SL_PTR_MASK (~0xFFFULL) source CTX_ENTRY_ADDR_WIDTH_SHIFT
Section titled “CTX_ENTRY_ADDR_WIDTH_SHIFT”#define CTX_ENTRY_ADDR_WIDTH_SHIFT 0 source CTX_ENTRY_ADDR_WIDTH_39BIT
Section titled “CTX_ENTRY_ADDR_WIDTH_39BIT”#define CTX_ENTRY_ADDR_WIDTH_39BIT 1 source CTX_ENTRY_ADDR_WIDTH_48BIT
Section titled “CTX_ENTRY_ADDR_WIDTH_48BIT”#define CTX_ENTRY_ADDR_WIDTH_48BIT 2 source CTX_ENTRY_ADDR_WIDTH_57BIT
Section titled “CTX_ENTRY_ADDR_WIDTH_57BIT”#define CTX_ENTRY_ADDR_WIDTH_57BIT 3 source CTX_ENTRY_DOMAIN_ID_SHIFT
Section titled “CTX_ENTRY_DOMAIN_ID_SHIFT”#define CTX_ENTRY_DOMAIN_ID_SHIFT 8 source CTX_ENTRY_SET_LO
Section titled “CTX_ENTRY_SET_LO”#define CTX_ENTRY_SET_LO(slptptr, tt) source Expansion
#define CTX_ENTRY_SET_LO(slptptr, tt) \
(((slptptr) & CTX_ENTRY_SL_PTR_MASK) | (tt) | CTX_ENTRY_PRESENT) CTX_ENTRY_SET_HI
Section titled “CTX_ENTRY_SET_HI”#define CTX_ENTRY_SET_HI(domain_id, aw) source Expansion
#define CTX_ENTRY_SET_HI(domain_id, aw) \
(((uint64_t) (domain_id) << CTX_ENTRY_DOMAIN_ID_SHIFT) | (aw)) CTX_ENTRY_TRANSLATION_TYPE
Section titled “CTX_ENTRY_TRANSLATION_TYPE”#define CTX_ENTRY_TRANSLATION_TYPE(lo) source Extract fields from a context entry
Expansion
#define CTX_ENTRY_TRANSLATION_TYPE(lo) BIT_RANGE((lo), 2, 3) CTX_ENTRY_DOMAIN_ID
Section titled “CTX_ENTRY_DOMAIN_ID”#define CTX_ENTRY_DOMAIN_ID(hi) source Expansion
#define CTX_ENTRY_DOMAIN_ID(hi) BIT_RANGE((hi), 8, 23) CTX_ENTRY_ADDR_WIDTH
Section titled “CTX_ENTRY_ADDR_WIDTH”#define CTX_ENTRY_ADDR_WIDTH(hi) source Expansion
#define CTX_ENTRY_ADDR_WIDTH(hi) BIT_RANGE((hi), 0, 2) SL_PTE_READ
Section titled “SL_PTE_READ”SL_PTE_WRITE
Section titled “SL_PTE_WRITE”SL_PTE_PRESENT
Section titled “SL_PTE_PRESENT”#define SL_PTE_PRESENT (SL_PTE_READ | SL_PTE_WRITE) source SL_PTE_EXECUTE
Section titled “SL_PTE_EXECUTE”SL_PTE_MEMORY_TYPE_SHIFT
Section titled “SL_PTE_MEMORY_TYPE_SHIFT”#define SL_PTE_MEMORY_TYPE_SHIFT 3 source EMT - Extended Memory Type
SL_PTE_MEMORY_TYPE_WRITE_BACK
Section titled “SL_PTE_MEMORY_TYPE_WRITE_BACK”#define SL_PTE_MEMORY_TYPE_WRITE_BACK (6ULL << 3) source WB
SL_PTE_MEMORY_TYPE_UNCACHEABLE
Section titled “SL_PTE_MEMORY_TYPE_UNCACHEABLE”#define SL_PTE_MEMORY_TYPE_UNCACHEABLE (0ULL << 3) source UC
SL_PTE_IGNORE_PAT
Section titled “SL_PTE_IGNORE_PAT”SL_PTE_LARGE_PAGE
Section titled “SL_PTE_LARGE_PAGE”SL_PTE_SNOOP
Section titled “SL_PTE_SNOOP”SL_PTE_ADDR_MASK
Section titled “SL_PTE_ADDR_MASK”SL_PTE_ADDR
Section titled “SL_PTE_ADDR”#define SL_PTE_ADDR(pte) source Expansion
#define SL_PTE_ADDR(pte) ((pte) & SL_PTE_ADDR_MASK) SL_PTE_MEMORY_TYPE
Section titled “SL_PTE_MEMORY_TYPE”#define SL_PTE_MEMORY_TYPE(pte) source Expansion
#define SL_PTE_MEMORY_TYPE(pte) BIT_RANGE((pte), 3, 5) SL_PTE_IS_LARGE
Section titled “SL_PTE_IS_LARGE”#define SL_PTE_IS_LARGE(pte) source Expansion
#define SL_PTE_IS_LARGE(pte) BIT_RANGE((pte), 7, 7) SL_TABLE_ENTRY
Section titled “SL_TABLE_ENTRY”#define SL_TABLE_ENTRY(phys) source Expansion
#define SL_TABLE_ENTRY(phys) (((phys) & SL_PTE_ADDR_MASK) | SL_PTE_PRESENT) SL_PAGE_ENTRY
Section titled “SL_PAGE_ENTRY”#define SL_PAGE_ENTRY(phys, perm) source Expansion
#define SL_PAGE_ENTRY(phys, perm) \
(((phys) & SL_PTE_ADDR_MASK) | SL_PTE_MEMORY_TYPE_WRITE_BACK | \
SL_PTE_IGNORE_PAT | ((perm) & 0x3)) SL_PML4_INDEX
Section titled “SL_PML4_INDEX”#define SL_PML4_INDEX(iova) source IOVA index helpers, identical breakdown to x86-64 VA. PML4 / PDPT / PD / PT are the standard x86-64 page-table levels.
Expansion
#define SL_PML4_INDEX(iova) (((iova) >> 39) & 0x1FF) SL_PDPT_INDEX
Section titled “SL_PDPT_INDEX”#define SL_PDPT_INDEX(iova) source Expansion
#define SL_PDPT_INDEX(iova) (((iova) >> 30) & 0x1FF) SL_PD_INDEX
Section titled “SL_PD_INDEX”#define SL_PD_INDEX(iova) source Expansion
#define SL_PD_INDEX(iova) (((iova) >> 21) & 0x1FF) SL_PT_INDEX
Section titled “SL_PT_INDEX”#define SL_PT_INDEX(iova) source Expansion
#define SL_PT_INDEX(iova) (((iova) >> 12) & 0x1FF) SL_PAGE_OFFSET
Section titled “SL_PAGE_OFFSET”#define SL_PAGE_OFFSET(iova) source Expansion
#define SL_PAGE_OFFSET(iova) ((iova) & 0xFFF) SL_ENTRY_COUNT
Section titled “SL_ENTRY_COUNT”#define SL_ENTRY_COUNT 512 source IQA_SIZE_SHIFT
Section titled “IQA_SIZE_SHIFT”#define IQA_SIZE_SHIFT 0 source IQA - Invalidation Queue Address Register, and queue layout Intel VT-d spec 6.5
IQA_SIZE_256_ENTRIES
Section titled “IQA_SIZE_256_ENTRIES”#define IQA_SIZE_256_ENTRIES 0 source IQA_SIZE_512_ENTRIES
Section titled “IQA_SIZE_512_ENTRIES”#define IQA_SIZE_512_ENTRIES 1 source IQA_SIZE_1K_ENTRIES
Section titled “IQA_SIZE_1K_ENTRIES”#define IQA_SIZE_1K_ENTRIES 2 source IQA_SIZE_2K_ENTRIES
Section titled “IQA_SIZE_2K_ENTRIES”#define IQA_SIZE_2K_ENTRIES 3 source IQA_SIZE_4K_ENTRIES
Section titled “IQA_SIZE_4K_ENTRIES”#define IQA_SIZE_4K_ENTRIES 4 source IQA_SIZE_8K_ENTRIES
Section titled “IQA_SIZE_8K_ENTRIES”#define IQA_SIZE_8K_ENTRIES 5 source IQA_SIZE_16K_ENTRIES
Section titled “IQA_SIZE_16K_ENTRIES”#define IQA_SIZE_16K_ENTRIES 6 source IQA_SIZE_32K_ENTRIES
Section titled “IQA_SIZE_32K_ENTRIES”#define IQA_SIZE_32K_ENTRIES 7 source IQA_ADDR_MASK
Section titled “IQA_ADDR_MASK”#define IQA_ADDR_MASK (~0xFFFULL) source IQA_REG_BUILD
Section titled “IQA_REG_BUILD”#define IQA_REG_BUILD(phys, size_enc) source Expansion
#define IQA_REG_BUILD(phys, size_enc) (((phys) & IQA_ADDR_MASK) | (size_enc)) IQA_SIZE
Section titled “IQA_SIZE”INVAL_QUEUE_ENTRY_SIZE
Section titled “INVAL_QUEUE_ENTRY_SIZE”#define INVAL_QUEUE_ENTRY_SIZE 16 source INVAL_QUEUE_TAIL_SHIFT
Section titled “INVAL_QUEUE_TAIL_SHIFT”#define INVAL_QUEUE_TAIL_SHIFT 4 source INVAL_DESC_TYPE_CONTEXT_CACHE
Section titled “INVAL_DESC_TYPE_CONTEXT_CACHE”#define INVAL_DESC_TYPE_CONTEXT_CACHE 0x1 source Invalidation descriptor type codes (low 4 bits of descriptor.lo)
INVAL_DESC_TYPE_IOTLB
Section titled “INVAL_DESC_TYPE_IOTLB”#define INVAL_DESC_TYPE_IOTLB source Expansion
#define INVAL_DESC_TYPE_IOTLB \
0x2 /* I/O Translation Lookaside Buffer \
*/ INVAL_DESC_TYPE_DEVICE_IOTLB
Section titled “INVAL_DESC_TYPE_DEVICE_IOTLB”#define INVAL_DESC_TYPE_DEVICE_IOTLB 0x3 source INVAL_DESC_TYPE_INTERRUPT_ENTRY_CACHE
Section titled “INVAL_DESC_TYPE_INTERRUPT_ENTRY_CACHE”#define INVAL_DESC_TYPE_INTERRUPT_ENTRY_CACHE 0x4 source IEC
INVAL_DESC_TYPE_WAIT
Section titled “INVAL_DESC_TYPE_WAIT”#define INVAL_DESC_TYPE_WAIT 0x5 source INVAL_DESC_TYPE
Section titled “INVAL_DESC_TYPE”#define INVAL_DESC_TYPE(lo) source Expansion
#define INVAL_DESC_TYPE(lo) BIT_RANGE((lo), 0, 3) INVAL_DESC_GRANULARITY
Section titled “INVAL_DESC_GRANULARITY”#define INVAL_DESC_GRANULARITY(lo) source Expansion
#define INVAL_DESC_GRANULARITY(lo) BIT_RANGE((lo), 4, 5) Context-cache invalidation descriptor
CTX_INVAL_GRANULARITY_GLOBAL
Section titled “CTX_INVAL_GRANULARITY_GLOBAL”CTX_INVAL_GRANULARITY_DOMAIN
Section titled “CTX_INVAL_GRANULARITY_DOMAIN”#define CTX_INVAL_GRANULARITY_DOMAIN (2ULL << 4) source CTX_INVAL_GRANULARITY_DEVICE
Section titled “CTX_INVAL_GRANULARITY_DEVICE”#define CTX_INVAL_GRANULARITY_DEVICE (3ULL << 4) source CTX_INVAL_DOMAIN_ID_SHIFT
Section titled “CTX_INVAL_DOMAIN_ID_SHIFT”#define CTX_INVAL_DOMAIN_ID_SHIFT 48 source CTX_INVAL_DESC_GLOBAL
Section titled “CTX_INVAL_DESC_GLOBAL”#define CTX_INVAL_DESC_GLOBAL source Expansion
#define CTX_INVAL_DESC_GLOBAL \
((struct vtd_inv_desc) {.lo = INVAL_DESC_TYPE_CONTEXT_CACHE | \
CTX_INVAL_GRANULARITY_GLOBAL, \
.hi = 0}) CTX_INVAL_DESC_DOMAIN
Section titled “CTX_INVAL_DESC_DOMAIN”#define CTX_INVAL_DESC_DOMAIN(did) source Expansion
#define CTX_INVAL_DESC_DOMAIN(did) \
((struct vtd_inv_desc) { \
.lo = INVAL_DESC_TYPE_CONTEXT_CACHE | CTX_INVAL_GRANULARITY_DOMAIN | \
((uint64_t) (did) << CTX_INVAL_DOMAIN_ID_SHIFT), \
.hi = 0}) IOTLB invalidation descriptor
IOTLB_INVAL_GRANULARITY_GLOBAL
Section titled “IOTLB_INVAL_GRANULARITY_GLOBAL”IOTLB_INVAL_GRANULARITY_DOMAIN
Section titled “IOTLB_INVAL_GRANULARITY_DOMAIN”#define IOTLB_INVAL_GRANULARITY_DOMAIN (2ULL << 4) source IOTLB_INVAL_GRANULARITY_PAGE
Section titled “IOTLB_INVAL_GRANULARITY_PAGE”#define IOTLB_INVAL_GRANULARITY_PAGE (3ULL << 4) source IOTLB_INVAL_DRAIN_READS
Section titled “IOTLB_INVAL_DRAIN_READS”IOTLB_INVAL_DRAIN_WRITES
Section titled “IOTLB_INVAL_DRAIN_WRITES”IOTLB_INVAL_DOMAIN_ID_SHIFT
Section titled “IOTLB_INVAL_DOMAIN_ID_SHIFT”#define IOTLB_INVAL_DOMAIN_ID_SHIFT 32 source IOTLB_INVAL_IOVA_SHIFT
Section titled “IOTLB_INVAL_IOVA_SHIFT”#define IOTLB_INVAL_IOVA_SHIFT 12 source IOTLB_INVAL_ADDR_MASK_FIELD_MASK
Section titled “IOTLB_INVAL_ADDR_MASK_FIELD_MASK”#define IOTLB_INVAL_ADDR_MASK_FIELD_MASK source Expansion
#define IOTLB_INVAL_ADDR_MASK_FIELD_MASK \
0x3FULL /* AM (Address Mask) field width */ IOTLB_INVAL_HINT
Section titled “IOTLB_INVAL_HINT”#define IOTLB_INVAL_HINT source Expansion
#define IOTLB_INVAL_HINT \
BIT(6) /* IH (in hi dword): non-leaf entries unchanged */ IOTLB_INVAL_DOMAIN_ID
Section titled “IOTLB_INVAL_DOMAIN_ID”#define IOTLB_INVAL_DOMAIN_ID(lo) source Expansion
#define IOTLB_INVAL_DOMAIN_ID(lo) BIT_RANGE((lo), 32, 47) IOTLB_INVAL_GRANULARITY
Section titled “IOTLB_INVAL_GRANULARITY”#define IOTLB_INVAL_GRANULARITY(lo) source Expansion
#define IOTLB_INVAL_GRANULARITY(lo) BIT_RANGE((lo), 4, 5) IOTLB_REG_OFFSET
Section titled “IOTLB_REG_OFFSET”#define IOTLB_REG_OFFSET(ecap) source Expansion
#define IOTLB_REG_OFFSET(ecap) ((ECAP_IOTLB_REGISTER_OFFSET(ecap) << 4) + 8) IVA_REG_OFFSET
Section titled “IVA_REG_OFFSET”#define IVA_REG_OFFSET(ecap) source Expansion
#define IVA_REG_OFFSET(ecap) ((ECAP_IOTLB_REGISTER_OFFSET(ecap) << 4) + 0) IOTLB_INVAL_DESC_GLOBAL
Section titled “IOTLB_INVAL_DESC_GLOBAL”#define IOTLB_INVAL_DESC_GLOBAL source Expansion
#define IOTLB_INVAL_DESC_GLOBAL \
((struct vtd_inv_desc) { \
.lo = INVAL_DESC_TYPE_IOTLB | IOTLB_INVAL_GRANULARITY_GLOBAL | \
IOTLB_INVAL_DRAIN_READS | IOTLB_INVAL_DRAIN_WRITES, \
.hi = 0}) IOTLB_INVAL_DESC_DOMAIN
Section titled “IOTLB_INVAL_DESC_DOMAIN”#define IOTLB_INVAL_DESC_DOMAIN(did) source Expansion
#define IOTLB_INVAL_DESC_DOMAIN(did) \
((struct vtd_inv_desc) { \
.lo = INVAL_DESC_TYPE_IOTLB | IOTLB_INVAL_GRANULARITY_DOMAIN | \
IOTLB_INVAL_DRAIN_READS | IOTLB_INVAL_DRAIN_WRITES | \
((uint64_t) (did) << IOTLB_INVAL_DOMAIN_ID_SHIFT), \
.hi = 0}) IOTLB_INVAL_DESC_PAGE
Section titled “IOTLB_INVAL_DESC_PAGE”#define IOTLB_INVAL_DESC_PAGE(did, iova, am) source Expansion
#define IOTLB_INVAL_DESC_PAGE(did, iova, am) \
((struct vtd_inv_desc) { \
.lo = INVAL_DESC_TYPE_IOTLB | IOTLB_INVAL_GRANULARITY_PAGE | \
IOTLB_INVAL_DRAIN_READS | IOTLB_INVAL_DRAIN_WRITES | \
((uint64_t) (did) << IOTLB_INVAL_DOMAIN_ID_SHIFT), \
.hi = \
((iova) & ~0xFFFULL) | ((am) & IOTLB_INVAL_ADDR_MASK_FIELD_MASK)}) IOTLB_REG_INVALIDATE
Section titled “IOTLB_REG_INVALIDATE”IOTLB_REG_DRAIN_READS
Section titled “IOTLB_REG_DRAIN_READS”IOTLB_REG_DRAIN_WRITES
Section titled “IOTLB_REG_DRAIN_WRITES”IOTLB_REG_GLOBAL
Section titled “IOTLB_REG_GLOBAL”IOTLB_REG_DOMAIN
Section titled “IOTLB_REG_DOMAIN”#define IOTLB_REG_DOMAIN (2ULL << 60) source IIRG = 10
IOTLB_REG_PAGE
Section titled “IOTLB_REG_PAGE”#define IOTLB_REG_PAGE (3ULL << 60) source IIRG = 11
IOTLB_REG_DOMAIN_ID_SHIFT
Section titled “IOTLB_REG_DOMAIN_ID_SHIFT”#define IOTLB_REG_DOMAIN_ID_SHIFT 32 source IVA_REG_ADDR_MASK
Section titled “IVA_REG_ADDR_MASK”#define IVA_REG_ADDR_MASK (~0xFFFULL) source IVA_REG_HINT
Section titled “IVA_REG_HINT”IVA_REG_AM_SHIFT
Section titled “IVA_REG_AM_SHIFT”#define IVA_REG_AM_SHIFT 0 source address mask
WAIT_DESC_INTERRUPT_FLAG
Section titled “WAIT_DESC_INTERRUPT_FLAG”WAIT_DESC_STATUS_WRITE
Section titled “WAIT_DESC_STATUS_WRITE”WAIT_DESC_FENCE
Section titled “WAIT_DESC_FENCE”WAIT_DESC_DATA_SHIFT
Section titled “WAIT_DESC_DATA_SHIFT”#define WAIT_DESC_DATA_SHIFT 32 source WAIT_DESC
Section titled “WAIT_DESC”#define WAIT_DESC(status_phys, status_data) source Expansion
#define WAIT_DESC(status_phys, status_data) \
((struct vtd_inv_desc) { \
.lo = INVAL_DESC_TYPE_WAIT | WAIT_DESC_STATUS_WRITE | \
WAIT_DESC_FENCE | \
((uint64_t) (status_data) << WAIT_DESC_DATA_SHIFT), \
.hi = (status_phys)})