/** @file The definition for VTD register. It is defined in "Intel VT for Direct IO Architecture Specification". Copyright (c) 2017, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php. THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ #ifndef __VTD_REG_H__ #define __VTD_REG_H__ #pragma pack(1) // // Translation Structure Formats // #define VTD_ROOT_ENTRY_NUMBER 256 #define VTD_CONTEXT_ENTRY_NUMBER 256 typedef union { struct { UINT32 Present:1; UINT32 Reserved_1:11; UINT32 ContextTablePointerLo:20; UINT32 ContextTablePointerHi:32; UINT64 Reserved_64; } Bits; struct { UINT64 Uint64Lo; UINT64 Uint64Hi; } Uint128; } VTD_ROOT_ENTRY; typedef union { struct { UINT32 LowerPresent:1; UINT32 Reserved_1:11; UINT32 LowerContextTablePointerLo:20; UINT32 LowerContextTablePointerHi:32; UINT32 UpperPresent:1; UINT32 Reserved_65:11; UINT32 UpperContextTablePointerLo:20; UINT32 UpperContextTablePointerHi:32; } Bits; struct { UINT64 Uint64Lo; UINT64 Uint64Hi; } Uint128; } VTD_EXT_ROOT_ENTRY; typedef union { struct { UINT32 Present:1; UINT32 FaultProcessingDisable:1; UINT32 TranslationType:2; UINT32 Reserved_4:8; UINT32 SecondLevelPageTranslationPointerLo:20; UINT32 SecondLevelPageTranslationPointerHi:32; UINT32 AddressWidth:3; UINT32 Ignored_67:4; UINT32 Reserved_71:1; UINT32 DomainIdentifier:16; UINT32 Reserved_88:8; UINT32 Reserved_96:32; } Bits; struct { UINT64 Uint64Lo; UINT64 Uint64Hi; } Uint128; } VTD_CONTEXT_ENTRY; typedef union { struct { UINT32 Present:1; UINT32 FaultProcessingDisable:1; UINT32 TranslationType:3; UINT32 ExtendedMemoryType:3; UINT32 DeferredInvalidateEnable:1; UINT32 PageRequestEnable:1; UINT32 NestedTranslationEnable:1; UINT32 PASIDEnable:1; UINT32 SecondLevelPageTranslationPointerLo:20; UINT32 SecondLevelPageTranslationPointerHi:32; UINT32 AddressWidth:3; UINT32 PageGlobalEnable:1; UINT32 NoExecuteEnable:1; UINT32 WriteProtectEnable:1; UINT32 CacheDisable:1; UINT32 ExtendedMemoryTypeEnable:1; UINT32 DomainIdentifier:16; UINT32 SupervisorModeExecuteProtection:1; UINT32 ExtendedAccessedFlagEnable:1; UINT32 ExecuteRequestsEnable:1; UINT32 SecondLevelExecuteEnable:1; UINT32 Reserved_92:4; UINT32 PageAttributeTable0:3; UINT32 Reserved_Pat0:1; UINT32 PageAttributeTable1:3; UINT32 Reserved_Pat1:1; UINT32 PageAttributeTable2:3; UINT32 Reserved_Pat2:1; UINT32 PageAttributeTable3:3; UINT32 Reserved_Pat3:1; UINT32 PageAttributeTable4:3; UINT32 Reserved_Pat4:1; UINT32 PageAttributeTable5:3; UINT32 Reserved_Pat5:1; UINT32 PageAttributeTable6:3; UINT32 Reserved_Pat6:1; UINT32 PageAttributeTable7:3; UINT32 Reserved_Pat7:1; UINT32 PASIDTableSize:4; UINT32 Reserved_132:8; UINT32 PASIDTablePointerLo:20; UINT32 PASIDTablePointerHi:32; UINT32 Reserved_192:12; UINT32 PASIDStateTablePointerLo:20; UINT32 PASIDStateTablePointerHi:32; } Bits; struct { UINT64 Uint64_1; UINT64 Uint64_2; UINT64 Uint64_3; UINT64 Uint64_4; } Uint256; } VTD_EXT_CONTEXT_ENTRY; typedef union { struct { UINT32 Present:1; UINT32 Reserved_1:2; UINT32 PageLevelCacheDisable:1; UINT32 PageLevelWriteThrough:1; UINT32 Reserved_5:6; UINT32 SupervisorRequestsEnable:1; UINT32 FirstLevelPageTranslationPointerLo:20; UINT32 FirstLevelPageTranslationPointerHi:32; } Bits; UINT64 Uint64; } VTD_PASID_ENTRY; typedef union { struct { UINT32 Reserved_0:32; UINT32 ActiveReferenceCount:16; UINT32 Reserved_48:15; UINT32 DeferredInvalidate:1; } Bits; UINT64 Uint64; } VTD_PASID_STATE_ENTRY; typedef union { struct { UINT32 Present:1; UINT32 ReadWrite:1; UINT32 UserSupervisor:1; UINT32 PageLevelWriteThrough:1; UINT32 PageLevelCacheDisable:1; UINT32 Accessed:1; UINT32 Dirty:1; UINT32 PageSize:1; // It is PageAttribute:1 for 4K page entry UINT32 Global:1; UINT32 Ignored_9:1; UINT32 ExtendedAccessed:1; UINT32 Ignored_11:1; // NOTE: There is PageAttribute:1 as bit12 for 1G page entry and 2M page entry UINT32 AddressLo:20; UINT32 AddressHi:20; UINT32 Ignored_52:11; UINT32 ExecuteDisable:1; } Bits; UINT64 Uint64; } VTD_FIRST_LEVEL_PAGING_ENTRY; typedef union { struct { UINT32 Read:1; UINT32 Write:1; UINT32 Execute:1; UINT32 ExtendedMemoryType:3; UINT32 IgnorePAT:1; UINT32 PageSize:1; UINT32 Ignored_8:3; UINT32 Snoop:1; UINT32 AddressLo:20; UINT32 AddressHi:20; UINT32 Ignored_52:10; UINT32 TransientMapping:1; UINT32 Ignored_63:1; } Bits; UINT64 Uint64; } VTD_SECOND_LEVEL_PAGING_ENTRY; // // Register Descriptions // #define R_VER_REG 0x00 #define R_CAP_REG 0x08 #define B_CAP_REG_RWBF BIT4 #define R_ECAP_REG 0x10 #define R_GCMD_REG 0x18 #define B_GMCD_REG_WBF BIT27 #define B_GMCD_REG_SRTP BIT30 #define B_GMCD_REG_TE BIT31 #define R_GSTS_REG 0x1C #define B_GSTS_REG_WBF BIT27 #define B_GSTS_REG_RTPS BIT30 #define B_GSTS_REG_TE BIT31 #define R_RTADDR_REG 0x20 #define R_CCMD_REG 0x28 #define B_CCMD_REG_CIRG_MASK (BIT62|BIT61) #define V_CCMD_REG_CIRG_GLOBAL BIT61 #define V_CCMD_REG_CIRG_DOMAIN BIT62 #define V_CCMD_REG_CIRG_DEVICE (BIT62|BIT61) #define B_CCMD_REG_ICC BIT63 #define R_FSTS_REG 0x34 #define R_FECTL_REG 0x38 #define R_FEDATA_REG 0x3C #define R_FEADDR_REG 0x40 #define R_FEUADDR_REG 0x44 #define R_AFLOG_REG 0x58 #define R_IVA_REG 0x00 // + IRO #define B_IVA_REG_AM_MASK (BIT0|BIT1|BIT2|BIT3|BIT4|BIT5) #define B_IVA_REG_AM_4K 0 // 1 page #define B_IVA_REG_AM_2M 9 // 2M page #define B_IVA_REG_IH BIT6 #define R_IOTLB_REG 0x08 // + IRO #define B_IOTLB_REG_IIRG_MASK (BIT61|BIT60) #define V_IOTLB_REG_IIRG_GLOBAL BIT60 #define V_IOTLB_REG_IIRG_DOMAIN BIT61 #define V_IOTLB_REG_IIRG_PAGE (BIT61|BIT60) #define B_IOTLB_REG_IVT BIT63 #define R_FRCD_REG 0x00 // + FRO #define R_PMEN_ENABLE_REG 0x64 #define R_PMEN_LOW_BASE_REG 0x68 #define R_PMEN_LOW_LIMITE_REG 0x6C #define R_PMEN_HIGH_BASE_REG 0x70 #define R_PMEN_HIGH_LIMITE_REG 0x78 typedef union { struct { UINT8 ND:3; // Number of domains supported UINT8 AFL:1; // Advanced Fault Logging UINT8 RWBF:1; // Required Write-Buffer Flushing UINT8 PLMR:1; // Protected Low-Memory Region UINT8 PHMR:1; // Protected High-Memory Region UINT8 CM:1; // Caching Mode UINT8 SAGAW:5; // Supported Adjusted Guest Address Widths UINT8 Rsvd_13:3; UINT8 MGAW:6; // Maximum Guest Address Width UINT8 ZLR:1; // Zero Length Read UINT8 Rsvd_23:1; UINT16 FRO:10; // Fault-recording Register offset UINT16 SLLPS:4; // Second Level Large Page Support UINT16 Rsvd_38:1; UINT16 PSI:1; // Page Selective Invalidation UINT8 NFR:8; // Number of Fault-recording Registers UINT8 MAMV:6; // Maximum Address Mask Value UINT8 DWD:1; // Write Draining UINT8 DRD:1; // Read Draining UINT8 FL1GP:1; // First Level 1-GByte Page Support UINT8 Rsvd_57:2; UINT8 PI:1; // Posted Interrupts Support UINT8 Rsvd_60:4; } Bits; UINT64 Uint64; } VTD_CAP_REG; typedef union { struct { UINT8 C:1; // Page-walk Coherency UINT8 QI:1; // Queued Invalidation support UINT8 DT:1; // Device-TLB support UINT8 IR:1; // Interrupt Remapping support UINT8 EIM:1; // Extended Interrupt Mode UINT8 Rsvd_5:1; UINT8 PT:1; // Pass Through UINT8 SC:1; // Snoop Control UINT16 IRO:10; // IOTLB Register Offset UINT16 Rsvd_18:2; UINT16 MHMV:4; // Maximum Handle Mask Value UINT8 ECS:1; // Extended Context Support UINT8 MTS:1; // Memory Type Support UINT8 NEST:1; // Nested Translation Support UINT8 DIS:1; // Deferred Invalidate Support UINT8 PASID:1; // Process Address Space ID Support UINT8 PRS:1; // Page Request Support UINT8 ERS:1; // Execute Request Support UINT8 SRS:1; // Supervisor Request Support UINT32 Rsvd_32:1; UINT32 NWFS:1; // No Write Flag Support UINT32 EAFS:1; // Extended Accessed Flag Support UINT32 PSS:5; // PASID Size Supported UINT32 Rsvd_40:24; } Bits; UINT64 Uint64; } VTD_ECAP_REG; typedef union { struct { UINT32 Rsvd_0:12; UINT32 FILo:20; // FaultInfo UINT32 FIHi:32; // FaultInfo UINT32 SID:16; // Source Identifier UINT32 Rsvd_80:13; UINT32 PRIV:1; // Privilege Mode Requested UINT32 EXE:1; // Execute Permission Requested UINT32 PP:1; // PASID Present UINT32 FR:8; // Fault Reason UINT32 PV:20; // PASID Value UINT32 AT:2; // Address Type UINT32 T:1; // Type (0: Write, 1: Read) UINT32 F:1; // Fault } Bits; UINT64 Uint64[2]; } VTD_FRCD_REG; typedef union { struct { UINT8 Function:3; UINT8 Device:5; UINT8 Bus; } Bits; struct { UINT8 ContextIndex; UINT8 RootIndex; } Index; UINT16 Uint16; } VTD_SOURCE_ID; #pragma pack() #endif