Skip to content

VT-d

include/drivers/iommu/vt_d.h View source View on GitHub
struct vtd_regs (33 fields) source
§ uint32_t version

Version

NOTE

offsets and sizes in kernel/drivers/iommu/vt_d/layout.c

§ 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

struct vtd_unit (14 fields) source
§ struct vtd_regs cc_mem_io *regs
§ uint64_t cap
§ uint64_t ecap
§ uint16_t segment
§ uint32_t domain_count
§ uint8_t *domain_bitmap
§ struct spinlock domain_bitmap_lock
§ uint64_t *root_table
§ paddr_t root_table_phys
§ void *iq_base
§ paddr_t iq_phys
§ uint32_t iq_head
§ uint32_t iq_tail
§ uint32_t iq_size
struct vtd_domain (3 fields) source
§ uint16_t domain_id
§ uint64_t *sl_pgd
§ uint64_t sl_pgd_phys
struct vtd_root_entry (2 fields) source
§ uint64_t lo
§ uint64_t hi

must be zero

struct vtd_context_entry (2 fields) source
§ uint64_t lo
§ uint64_t hi
struct vtd_inv_desc (2 fields) source
§ uint64_t lo
§ uint64_t hi
struct iommu * vtd_unit_create(
    uint64_t base_phys,
    uint16_t segment,
    uint8_t size_field
)
source
uint32_t vtd_cap_domain_count(uint64_t cap)
source

ND encoding to actual domain count

#define vtd_log(lvl, fmt, ...)
source
Expansion
#define vtd_log(lvl, fmt, ...) \
    log(LOG_SITE(vtd), LOG_HANDLE(vtd), lvl, fmt, ##__VA_ARGS__)
#define vtd_err(fmt, ...)
source
Expansion
#define vtd_err(fmt, ...) vtd_log(LOG_ERROR, fmt, ##__VA_ARGS__)
#define vtd_warn(fmt, ...)
source
Expansion
#define vtd_warn(fmt, ...) vtd_log(LOG_WARN, fmt, ##__VA_ARGS__)
#define vtd_info(fmt, ...)
source
Expansion
#define vtd_info(fmt, ...) vtd_log(LOG_INFO, fmt, ##__VA_ARGS__)
#define vtd_debug(fmt, ...)
source
Expansion
#define vtd_debug(fmt, ...) vtd_log(LOG_DEBUG, fmt, ##__VA_ARGS__)
#define vtd_trace(fmt, ...)
source
Expansion
#define vtd_trace(fmt, ...) vtd_log(LOG_TRACE, fmt, ##__VA_ARGS__)
#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) \
                            */
#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 */
#define CAP_PROTECTED_LOW_MEMORY(cap)
source
Expansion
#define CAP_PROTECTED_LOW_MEMORY(cap) \
    BIT_RANGE((cap), 5, 5) /* PLMR   - Protected Low-Memory Region */
#define CAP_PROTECTED_HIGH_MEMORY(cap)
source
Expansion
#define CAP_PROTECTED_HIGH_MEMORY(cap) \
    BIT_RANGE((cap), 6, 6) /* PHMR   - Protected High-Memory Region */
#define CAP_CACHING_MODE(cap)
source

CM

Expansion
#define CAP_CACHING_MODE(cap) BIT_RANGE((cap), 7, 7) /* CM */
#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 */
#define CAP_MAX_ADDR_WIDTH(cap)
source
Expansion
#define CAP_MAX_ADDR_WIDTH(cap) \
    BIT_RANGE((cap), 16, 21) /* MGAW   - Maximum Guest Address Width */
#define CAP_ZERO_LENGTH_READ(cap)
source

ZLR

Expansion
#define CAP_ZERO_LENGTH_READ(cap) BIT_RANGE((cap), 22, 22) /* ZLR */
#define CAP_FAULT_RECORD_OFFSET(cap)
source
Expansion
#define CAP_FAULT_RECORD_OFFSET(cap) \
    BIT_RANGE((cap), 24, 33) /* FRO    - Fault-Recording Register Offset */
#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 */
#define CAP_PAGE_SELECTIVE_INVALIDATION(cap)
source
Expansion
#define CAP_PAGE_SELECTIVE_INVALIDATION(cap) \
    BIT_RANGE((cap), 39, 39) /* PSI \
                              */
#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 \
                              */
#define CAP_MAX_ADDR_MASK_VALUE(cap)
source

MAMV

Expansion
#define CAP_MAX_ADDR_MASK_VALUE(cap) BIT_RANGE((cap), 48, 53)  /* MAMV */
#define CAP_WRITE_DRAINING(cap)
source

DWD

Expansion
#define CAP_WRITE_DRAINING(cap) BIT_RANGE((cap), 54, 54)       /* DWD */
#define CAP_READ_DRAINING(cap)
source

DRD

Expansion
#define CAP_READ_DRAINING(cap) BIT_RANGE((cap), 55, 55)        /* DRD */
#define CAP_FIRST_LEVEL_1GB_PAGE(cap)
source

FL1GP

Expansion
#define CAP_FIRST_LEVEL_1GB_PAGE(cap) BIT_RANGE((cap), 56, 56) /* FL1GP */
#define CAP_POSTED_INTERRUPTS(cap)
source

PI

Expansion
#define CAP_POSTED_INTERRUPTS(cap) BIT_RANGE((cap), 59, 59)    /* PI */
#define CAP_FIRST_STAGE_5LEVEL_PAGING(cap)
source
Expansion
#define CAP_FIRST_STAGE_5LEVEL_PAGING(cap) \
    BIT_RANGE((cap), 60, 60) /* FL5LP / FS5LP */
#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 */
#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 */
#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 */
#define ECAP_QUEUED_INVALIDATION(ecap)
source

QI

Expansion
#define ECAP_QUEUED_INVALIDATION(ecap) BIT_RANGE((ecap), 1, 1)     /* QI */
#define ECAP_DEVICE_TLB(ecap)
source

DT

Expansion
#define ECAP_DEVICE_TLB(ecap) BIT_RANGE((ecap), 2, 2)              /* DT */
#define ECAP_INTERRUPT_REMAPPING(ecap)
source

IR

Expansion
#define ECAP_INTERRUPT_REMAPPING(ecap) BIT_RANGE((ecap), 3, 3)     /* IR */
#define ECAP_EXTENDED_INTERRUPT_MODE(ecap)
source

EIM

Expansion
#define ECAP_EXTENDED_INTERRUPT_MODE(ecap) BIT_RANGE((ecap), 4, 4) /* EIM */
#define ECAP_PASS_THROUGH(ecap)
source

PT

Expansion
#define ECAP_PASS_THROUGH(ecap) BIT_RANGE((ecap), 6, 6)            /* PT */
#define ECAP_SNOOP_CONTROL(ecap)
source

SC

Expansion
#define ECAP_SNOOP_CONTROL(ecap) BIT_RANGE((ecap), 7, 7)           /* SC */
#define ECAP_IOTLB_REGISTER_OFFSET(ecap)
source

IRO

Expansion
#define ECAP_IOTLB_REGISTER_OFFSET(ecap) BIT_RANGE((ecap), 8, 17)  /* IRO */
#define ECAP_MAX_HANDLE_MASK_VALUE(ecap)
source

MHMV

Expansion
#define ECAP_MAX_HANDLE_MASK_VALUE(ecap) BIT_RANGE((ecap), 20, 23) /* MHMV */
#define ECAP_MEMORY_TYPE_SUPPORT(ecap)
source

MTS

Expansion
#define ECAP_MEMORY_TYPE_SUPPORT(ecap) BIT_RANGE((ecap), 25, 25)   /* MTS */
#define ECAP_NESTED_TRANSLATION(ecap)
source

NEST

Expansion
#define ECAP_NESTED_TRANSLATION(ecap) BIT_RANGE((ecap), 26, 26)    /* NEST */
#define ECAP_PAGE_REQUEST_SUPPORT(arg)
source

PRS

Expansion
#define ECAP_PAGE_REQUEST_SUPPORT(arg) BIT_TEST((arg), 29)         /* PRS */
#define ECAP_EXECUTE_REQUEST_SUPPORT(arg)
source

ERS

Expansion
#define ECAP_EXECUTE_REQUEST_SUPPORT(arg) BIT_TEST((arg), 30)      /* ERS */
#define ECAP_SUPERVISOR_REQUEST_SUPPORT(arg)
source

SRS

Expansion
#define ECAP_SUPERVISOR_REQUEST_SUPPORT(arg) BIT_TEST((arg), 31)   /* SRS */
#define ECAP_NO_WRITE_FLAG_SUPPORT(arg)
source

NWFS

Expansion
#define ECAP_NO_WRITE_FLAG_SUPPORT(arg) BIT_TEST((arg), 33)        /* NWFS */
#define ECAP_EXTENDED_ACCESSED_FLAG_SUPPORT(arg)
source
Expansion
#define ECAP_EXTENDED_ACCESSED_FLAG_SUPPORT(arg) \
    BIT_TEST((arg), 34) /* EAFS \
                         */
#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 */
#define ECAP_PASID_SUPPORT(arg)
source

PASID

Expansion
#define ECAP_PASID_SUPPORT(arg) BIT_TEST((arg), 40) /* PASID */
#define ECAP_DEVICE_TLB_INVAL_THROTTLE(arg)
source
Expansion
#define ECAP_DEVICE_TLB_INVAL_THROTTLE(arg) \
    BIT_TEST((arg), 41)                                          /* DIT \
                                                                  */
#define ECAP_PAGE_REQUEST_DRAIN_SUPPORT(arg)
source

PDS

Expansion
#define ECAP_PAGE_REQUEST_DRAIN_SUPPORT(arg) BIT_TEST((arg), 42) /* PDS */
#define ECAP_SCALABLE_MODE_TRANSLATION_SUPPORT(arg)
source
Expansion
#define ECAP_SCALABLE_MODE_TRANSLATION_SUPPORT(arg) \
    BIT_TEST((arg), 43)                                       /* SMTS */
#define ECAP_VIRTUAL_COMMAND_SUPPORT(arg)
source

VCS

Expansion
#define ECAP_VIRTUAL_COMMAND_SUPPORT(arg) BIT_TEST((arg), 44) /* VCS */
#define ECAP_SECOND_STAGE_ACCESSED_DIRTY_SUPPORT(arg)
source
Expansion
#define ECAP_SECOND_STAGE_ACCESSED_DIRTY_SUPPORT(arg) \
    BIT_TEST((arg), 45) /* SSADS */
#define ECAP_SECOND_STAGE_TRANSLATION_SUPPORT(arg)
source
Expansion
#define ECAP_SECOND_STAGE_TRANSLATION_SUPPORT(arg) \
    BIT_TEST((arg), 46) /* SSTS */
#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 */
#define ECAP_RID_PASID_SUPPORT(arg)
source
Expansion
#define ECAP_RID_PASID_SUPPORT(arg) \
    BIT_TEST((arg), 49) /* RPS - Requester-ID/PASID */
#define ECAP_PERFORMANCE_MONITORING_SUPPORT(arg)
source

PMS

Expansion
#define ECAP_PERFORMANCE_MONITORING_SUPPORT(arg) BIT_TEST((arg), 51) /* PMS */
#define ECAP_ABORT_DMA_MODE_SUPPORT(arg)
source

ADMS

Expansion
#define ECAP_ABORT_DMA_MODE_SUPPORT(arg) BIT_TEST((arg), 52)         /* ADMS */
#define ECAP_RID_PRIV_SUPPORT(arg)
source
Expansion
#define ECAP_RID_PRIV_SUPPORT(arg) \
    BIT_TEST((arg), 53) /* RPRIVS - Requester-ID Privilege */
#define ECAP_STOP_MARKER_SUPPORT(arg)
source

SMS

Expansion
#define ECAP_STOP_MARKER_SUPPORT(arg) BIT_TEST((arg), 58) /* SMS */
#define ADDR_WIDTH_39BIT BIT(1)
source

Bit positions in CAP_SUPPORTED_ADDR_WIDTHS (CAP.SAGAW) Each bit indicates a supported guest address width / page-table depth.

3-level page table

#define ADDR_WIDTH_48BIT BIT(2)
source

4-level page table

#define ADDR_WIDTH_57BIT BIT(3)
source

5-level page table

#define GCMD_TRANSLATION_ENABLE BIT(31)
source

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

#define GCMD_SET_ROOT_TABLE_PTR BIT(30)
source

SRTP - Set Root Table Pointer

#define GCMD_WRITE_BUFFER_FLUSH BIT(27)
source

WBF

#define GCMD_QUEUED_INVAL_ENABLE BIT(26)
source

QIE

#define GCMD_INTERRUPT_REMAP_ENABLE BIT(25)
source

IRE

#define GCMD_SET_INTR_REMAP_TABLE_PTR
source
Expansion
#define GCMD_SET_INTR_REMAP_TABLE_PTR \
    BIT(24) /* SIRTP  - Set Interrupt Remap Table Pointer */
#define GCMD_COMPAT_FORMAT_INTERRUPT
source
Expansion
#define GCMD_COMPAT_FORMAT_INTERRUPT \
    BIT(23) /* CFI    - Compatibility Format Interrupt */
#define GSTS_TRANSLATION_ENABLED BIT(31)
source

TES

#define GSTS_ROOT_TABLE_PTR_SET BIT(30)
source

RTPS

#define GSTS_WRITE_BUFFER_FLUSH_STATUS BIT(27)
source

WBFS

#define GSTS_QUEUED_INVAL_ENABLED BIT(26)
source

QIES

#define GSTS_INTERRUPT_REMAP_ENABLED BIT(25)
source

IRES

#define GSTS_INTR_REMAP_TABLE_PTR_SET BIT(24)
source

IRTPS

#define GSTS_COMPAT_FORMAT_INTERRUPT_STATUS BIT(23)
source

CFIS

#define RTADDR_TRANSLATION_MODE_LEGACY (0ULL << 10)
source

RTADDR - Root Table Address Register (64-bit, offset 0x020) TTM = Translation Table Mode (bits 10-11).

#define RTADDR_TRANSLATION_MODE_SCALABLE BIT(10)
source
#define FSTS_PRIMARY_FAULT_OVERFLOW BIT(0)
source

FSTS - Fault Status Register (32-bit, offset 0x034)

PFO

#define FSTS_PRIMARY_PENDING_FAULT BIT(1)
source

PPF

#define FSTS_ADVANCED_FAULT_OVERFLOW BIT(2)
source

AFO

#define FSTS_ADVANCED_PENDING_FAULT BIT(3)
source

APF

#define FSTS_INVAL_QUEUE_ERROR BIT(4)
source

IQE

#define FSTS_INVAL_COMPLETION_ERROR BIT(5)
source

ICE

#define FSTS_INVAL_TIMEOUT_ERROR BIT(6)
source

ITE

#define FSTS_PAGE_REQUEST_OVERFLOW BIT(7)
source

PRO

#define FSTS_FAULT_RECORD_INDEX(s)
source

FRI

Expansion
#define FSTS_FAULT_RECORD_INDEX(s) BIT_RANGE((s), 8, 15) /* FRI */
#define ROOT_ENTRY_PRESENT BIT(0)
source

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).

#define ROOT_ENTRY_CONTEXT_TABLE_PTR_SHIFT 12
source
#define ROOT_ENTRY_CONTEXT_TABLE_PTR_MASK (~0xFFFULL)
source
#define ROOT_ENTRY_SET_CONTEXT_TABLE_PTR(phys)
source
#define CTX_ENTRY_PRESENT BIT(0)
source

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

#define CTX_ENTRY_FAULT_PROCESSING_DISABLE BIT(1)
source
#define CTX_ENTRY_TRANSLATION_TYPE_SHIFT 2
source
#define CTX_ENTRY_TRANSLATION_TYPE_UNTRANSLATED (0ULL << 2)
source
#define CTX_ENTRY_TRANSLATION_TYPE_PASSTHROUGH (2ULL << 2)
source
#define CTX_ENTRY_SL_PTR_SHIFT 12
source
#define CTX_ENTRY_SL_PTR_MASK (~0xFFFULL)
source
#define CTX_ENTRY_ADDR_WIDTH_SHIFT 0
source
#define CTX_ENTRY_ADDR_WIDTH_39BIT 1
source
#define CTX_ENTRY_ADDR_WIDTH_48BIT 2
source
#define CTX_ENTRY_ADDR_WIDTH_57BIT 3
source
#define CTX_ENTRY_DOMAIN_ID_SHIFT 8
source
#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)
#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))
#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)
#define CTX_ENTRY_DOMAIN_ID(hi)
source
Expansion
#define CTX_ENTRY_DOMAIN_ID(hi) BIT_RANGE((hi), 8, 23)
#define CTX_ENTRY_ADDR_WIDTH(hi)
source
Expansion
#define CTX_ENTRY_ADDR_WIDTH(hi) BIT_RANGE((hi), 0, 2)
#define SL_PTE_READ BIT(0)
source

Second-Level Page-Table Entry (PTE).

#define SL_PTE_WRITE BIT(1)
source
#define SL_PTE_PRESENT (SL_PTE_READ | SL_PTE_WRITE)
source
#define SL_PTE_EXECUTE BIT(2)
source
#define SL_PTE_MEMORY_TYPE_SHIFT 3
source

EMT - Extended Memory Type

#define SL_PTE_MEMORY_TYPE_WRITE_BACK (6ULL << 3)
source

WB

#define SL_PTE_MEMORY_TYPE_UNCACHEABLE (0ULL << 3)
source

UC

#define SL_PTE_IGNORE_PAT BIT(6)
source

IPAT - Ignore Page Attribute Table

#define SL_PTE_LARGE_PAGE BIT(7)
source

PS - Page Size

#define SL_PTE_SNOOP BIT(11)
source

SNP

#define SL_PTE_ADDR_MASK (~0xFFFULL & (BIT(52) - 1))
source
#define SL_PTE_ADDR(pte)
source
Expansion
#define SL_PTE_ADDR(pte) ((pte) & SL_PTE_ADDR_MASK)
#define SL_PTE_MEMORY_TYPE(pte)
source
Expansion
#define SL_PTE_MEMORY_TYPE(pte) BIT_RANGE((pte), 3, 5)
#define SL_PTE_IS_LARGE(pte)
source
Expansion
#define SL_PTE_IS_LARGE(pte) BIT_RANGE((pte), 7, 7)
#define SL_TABLE_ENTRY(phys)
source
Expansion
#define SL_TABLE_ENTRY(phys) (((phys) & SL_PTE_ADDR_MASK) | SL_PTE_PRESENT)
#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))
#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)
#define SL_PDPT_INDEX(iova)
source
Expansion
#define SL_PDPT_INDEX(iova) (((iova) >> 30) & 0x1FF)
#define SL_PD_INDEX(iova)
source
Expansion
#define SL_PD_INDEX(iova) (((iova) >> 21) & 0x1FF)
#define SL_PT_INDEX(iova)
source
Expansion
#define SL_PT_INDEX(iova) (((iova) >> 12) & 0x1FF)
#define SL_PAGE_OFFSET(iova)
source
Expansion
#define SL_PAGE_OFFSET(iova) ((iova) & 0xFFF)
#define SL_ENTRY_COUNT 512
source
#define IQA_SIZE_SHIFT 0
source

IQA - Invalidation Queue Address Register, and queue layout Intel VT-d spec 6.5

#define IQA_SIZE_256_ENTRIES 0
source
#define IQA_SIZE_512_ENTRIES 1
source
#define IQA_SIZE_1K_ENTRIES 2
source
#define IQA_SIZE_2K_ENTRIES 3
source
#define IQA_SIZE_4K_ENTRIES 4
source
#define IQA_SIZE_8K_ENTRIES 5
source
#define IQA_SIZE_16K_ENTRIES 6
source
#define IQA_SIZE_32K_ENTRIES 7
source
#define IQA_ADDR_MASK (~0xFFFULL)
source
#define IQA_REG_BUILD(phys, size_enc)
source
Expansion
#define IQA_REG_BUILD(phys, size_enc) (((phys) & IQA_ADDR_MASK) | (size_enc))
#define IQA_SIZE(iqa)
source
Expansion
#define IQA_SIZE(iqa) BIT_RANGE((iqa), 0, 2)
#define INVAL_QUEUE_ENTRY_SIZE 16
source
#define INVAL_QUEUE_TAIL_SHIFT 4
source
#define INVAL_DESC_TYPE_CONTEXT_CACHE 0x1
source

Invalidation descriptor type codes (low 4 bits of descriptor.lo)

#define INVAL_DESC_TYPE_IOTLB
source
Expansion
#define INVAL_DESC_TYPE_IOTLB \
    0x2 /* I/O Translation Lookaside Buffer \
         */
#define INVAL_DESC_TYPE_DEVICE_IOTLB 0x3
source
#define INVAL_DESC_TYPE_INTERRUPT_ENTRY_CACHE 0x4
source

IEC

#define INVAL_DESC_TYPE_WAIT 0x5
source
#define INVAL_DESC_TYPE(lo)
source
Expansion
#define INVAL_DESC_TYPE(lo) BIT_RANGE((lo), 0, 3)
#define INVAL_DESC_GRANULARITY(lo)
source
Expansion
#define INVAL_DESC_GRANULARITY(lo) BIT_RANGE((lo), 4, 5)

Context-cache invalidation descriptor

#define CTX_INVAL_GRANULARITY_GLOBAL BIT(4)
source
#define CTX_INVAL_GRANULARITY_DOMAIN (2ULL << 4)
source
#define CTX_INVAL_GRANULARITY_DEVICE (3ULL << 4)
source
#define CTX_INVAL_DOMAIN_ID_SHIFT 48
source
#define CTX_INVAL_DESC_GLOBAL
source
#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

#define IOTLB_INVAL_GRANULARITY_GLOBAL BIT(4)
source
#define IOTLB_INVAL_GRANULARITY_DOMAIN (2ULL << 4)
source
#define IOTLB_INVAL_GRANULARITY_PAGE (3ULL << 4)
source
#define IOTLB_INVAL_DRAIN_READS BIT(7)
source

DR

#define IOTLB_INVAL_DRAIN_WRITES BIT(6)
source

DW

#define IOTLB_INVAL_DOMAIN_ID_SHIFT 32
source
#define IOTLB_INVAL_IOVA_SHIFT 12
source
#define IOTLB_INVAL_ADDR_MASK_FIELD_MASK
source
Expansion
#define IOTLB_INVAL_ADDR_MASK_FIELD_MASK \
    0x3FULL /* AM (Address Mask) field width */
#define IOTLB_INVAL_HINT
source
Expansion
#define IOTLB_INVAL_HINT \
    BIT(6) /* IH (in hi dword): non-leaf entries unchanged */
#define IOTLB_INVAL_DOMAIN_ID(lo)
source
Expansion
#define IOTLB_INVAL_DOMAIN_ID(lo) BIT_RANGE((lo), 32, 47)
#define IOTLB_INVAL_GRANULARITY(lo)
source
Expansion
#define IOTLB_INVAL_GRANULARITY(lo) BIT_RANGE((lo), 4, 5)
#define IOTLB_REG_OFFSET(ecap)
source
Expansion
#define IOTLB_REG_OFFSET(ecap) ((ECAP_IOTLB_REGISTER_OFFSET(ecap) << 4) + 8)
#define IVA_REG_OFFSET(ecap)
source
Expansion
#define IVA_REG_OFFSET(ecap) ((ECAP_IOTLB_REGISTER_OFFSET(ecap) << 4) + 0)
#define IOTLB_INVAL_DESC_GLOBAL
source
#define IOTLB_INVAL_DESC_DOMAIN(did)
source
#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)})
#define IOTLB_REG_INVALIDATE BIT(63)
source

IVT - triggers invalidation

#define IOTLB_REG_DRAIN_READS BIT(49)
source

DR

#define IOTLB_REG_DRAIN_WRITES BIT(48)
source

DW

#define IOTLB_REG_GLOBAL BIT(60)
source

IIRG = 01

#define IOTLB_REG_DOMAIN (2ULL << 60)
source

IIRG = 10

#define IOTLB_REG_PAGE (3ULL << 60)
source

IIRG = 11

#define IOTLB_REG_DOMAIN_ID_SHIFT 32
source
#define IVA_REG_ADDR_MASK (~0xFFFULL)
source
#define IVA_REG_HINT BIT(6)
source

IH

#define IVA_REG_AM_SHIFT 0
source

address mask

#define WAIT_DESC_INTERRUPT_FLAG BIT(4)
source

Wait descriptor

IF

#define WAIT_DESC_STATUS_WRITE BIT(5)
source

SW

#define WAIT_DESC_FENCE BIT(6)
source

FN

#define WAIT_DESC_DATA_SHIFT 32
source
#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)})