Advertisement
MagicAndre1981

NVDIMM Firmware Interface Table Windows 10 WDK (Build 10586)

Nov 8th, 2015
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Win10 10586 has support for NVDIMM Firmware Interface Table ACPI table:
  2.  
  3. C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\km\acpitabl.h
  4.  
  5. //
  6. // NFIT ACPI table (ACPI 6.0 section 5.2.25)
  7. //
  8.  
  9. #define NFIT_TABLE_SIGNATURE 0x5449464e // 'NFIT'
  10.  
  11. typedef struct _NFIT_TABLE {
  12.     DESCRIPTION_HEADER Header;
  13.  
  14.     ULONG Reserved;
  15.     UCHAR Structures[ANYSIZE_ARRAY];
  16. } NFIT_TABLE, *PNFIT_TABLE;
  17.  
  18. //
  19. // NFIT Structure common header
  20. //
  21.  
  22. typedef struct _NFIT_STRUCT_HEADER {
  23.     USHORT Type;
  24.     USHORT Length;
  25. } NFIT_STRUCT_HEADER, *PNFIT_STRUCT_HEADER;
  26.  
  27. //
  28. // NFIT Structure Types
  29. //
  30.  
  31. typedef enum _NFIT_STRUCTURE_TYPE {
  32.     NfitSystemPhysicalAddressRange          = 0,
  33.     NfitMemoryDeviceToSystemAddressRangeMap = 1,
  34.     NfitInterleave                          = 2,
  35.     NfitSmbiosManagementInformation         = 3,
  36.     NfitNvdimmControlRegion                 = 4,
  37.     NfitNvdimmBlockDataWindowRegion         = 5,
  38.     NfitFlushHintAddress                    = 6,
  39.     NfitMaximum
  40. } NFIT_STRUCTURE_TYPE, *PNFIT_STRUCTURE_TYPE;
  41.  
  42. #include <guiddef.h>
  43.  
  44. //
  45. // System Physical Address Range Types (GUIDs)
  46. //
  47.  
  48. DEFINE_GUID( /* 7305944F-FDDA-44E3-B16C3F22D252E5D0 */
  49.     NFitSpaRangeVolatileMemory,
  50.     0x7305944F,
  51.     0xFDDA,
  52.     0x44E3,
  53.     0xB1, 0x6C, 0x3F, 0x22, 0xD2, 0x52, 0xE5, 0xD0);
  54.  
  55. DEFINE_GUID( /* 66F0D379-B4F3-4074-AC430D3318B78CDB */
  56.     NFitSpaRangeByteAddressablePersistentMemory,
  57.     0x66F0D379,
  58.     0xB4F3,
  59.     0x4074,
  60.     0xAC, 0x43, 0x0D, 0x33, 0x18, 0xB7, 0x8C, 0xDB);
  61.  
  62. DEFINE_GUID( /* 92F701F6-13B4-405D-910B299367E8234C */
  63.     NFitSpaRangeNvdimmControlRegion,
  64.     0x92F701F6,
  65.     0x13B4,
  66.     0x405D,
  67.     0x91, 0x0B, 0x29, 0x93, 0x67, 0xE8, 0x23, 0x4C);
  68.  
  69. DEFINE_GUID( /* 91AF0530-5D86-470E-A6B00A2DB9408249 */
  70.     NFitSpaRangeNvdimmBlockDataWindow,
  71.     0x91AF0530,
  72.     0x5D86,
  73.     0x470E,
  74.     0xA6, 0xB0, 0x0A, 0x2D, 0xB9, 0x40, 0x82, 0x49);
  75.  
  76. DEFINE_GUID( /* 77AB535A-45FC-624B-5560F7B281D1F96E */
  77.     NFitSpaRangeVolatileVirtualDisk,
  78.     0x77AB535A,
  79.     0x45FC,
  80.     0x624B,
  81.     0x55, 0x60, 0xF7, 0xB2, 0x81, 0xD1, 0xF9, 0x6E);
  82.  
  83. DEFINE_GUID( /* 3D5ABD30-4175-87CE-6D64D2ADE523C4BB */
  84.     NFitSpaRangeVolatileVirtualCD,
  85.     0x3D5ABD30,
  86.     0x4175,
  87.     0x87CE,
  88.     0x6D, 0x64, 0xD2, 0xAD, 0xE5, 0x23, 0xC4, 0xBB);
  89.  
  90. DEFINE_GUID( /* 5CEA02C9-4D07-69D3-269F4496FBE096F9 */
  91.     NFitSpaRangePersistentVirtualDisk,
  92.     0x5CEA02C9,
  93.     0x4D07,
  94.     0x69D3,
  95.     0x26, 0x9F, 0x44, 0x96, 0xFB, 0xE0, 0x96, 0xF9);
  96.  
  97. DEFINE_GUID( /* 08018188-42CD-BB48-100F5387D53DED3D */
  98.     NFitSpaRangePersistentVirtualCD,
  99.     0x08018188,
  100.     0x42CD,
  101.     0xBB48,
  102.     0x10, 0x0F, 0x53, 0x87, 0xD5, 0x3D, 0xED, 0x3D);
  103.  
  104. //
  105. // System Physical Address Range Flags
  106. //
  107.  
  108. typedef enum _NFIT_SPA_RANGE_FLAG {
  109.     NfitSpaRangeFlagManagementOnlyControlRegion = 0x0001,
  110.     NfitSpaRangeFlagProximityDomainValid        = 0x0002,
  111. } NFIT_SPA_RANGE_FLAG, *PNFIT_SPA_RANGE_FLAG;
  112.  
  113. #define NFIT_VALID_SPA_RANGE_FLAGS \
  114.     (NfitSpaRangeFlagManagementOnlyControlRegion | \
  115.      NfitSpaRangeFlagProximityDomainValid)
  116. //
  117. // System Physical Address Range Memory Mapping Attributes (defined in UEFI)
  118. //
  119.  
  120. typedef enum _NFIT_SPA_RANGE_MEMORY_MAP_ATTRIBUTES {
  121.     NfitSpaRangeAttributeUC             = 0x00000001,
  122.     NfitSpaRangeAttributeWC             = 0x00000002,
  123.     NfitSpaRangeAttributeWT             = 0x00000004,
  124.     NfitSpaRangeAttributeWB             = 0x00000008,
  125.     NfitSpaRangeAttributeUCE            = 0x00000010,
  126.     NfitSpaRangeAttributeWP             = 0x00001000,
  127.     NfitSpaRangeAttributeRP             = 0x00002000,
  128.     NfitSpaRangeAttributeXP             = 0x00004000,
  129.     NfitSpaRangeAttributeNV             = 0x00008000,
  130.     NfitSpaRangeAttributeMoreReliable   = 0x00010000
  131. } NFIT_SPA_RANGE_MEMORY_MAP_ATTRIBUTES, *PNFIT_SPA_RANGE_MEMORY_MAP_ATTRIBUTES;
  132.  
  133. #define NFIT_VALID_SPA_RANGE_MEMORY_MAP_ATTRIBUTES \
  134.     (NfitSpaRangeAttributeUC |          \
  135.      NfitSpaRangeAttributeWC |          \
  136.      NfitSpaRangeAttributeWT |          \
  137.      NfitSpaRangeAttributeWB |          \
  138.      NfitSpaRangeAttributeUCE |         \
  139.      NfitSpaRangeAttributeWP |          \
  140.      NfitSpaRangeAttributeRP |          \
  141.      NfitSpaRangeAttributeXP |          \
  142.      NfitSpaRangeAttributeNV |          \
  143.      NfitSpaRangeAttributeMoreReliable)
  144.  
  145. //
  146. // NFIT System Physical Address Range Structure
  147. //
  148.  
  149. typedef struct _NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE {
  150.     NFIT_STRUCT_HEADER Header;
  151.     USHORT SPARangeIndex;
  152.     USHORT Flags;
  153.     ULONG Reserved;
  154.     ULONG ProximityDomain;
  155.     GUID AddressRangeType;
  156.     ULONG64 SPARangeBase;
  157.     ULONG64 SPARangeLength;
  158.     ULONG64 AddressRangeMappingAttribute;
  159. } NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE, *PNFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE;
  160.  
  161. #if _MSC_VER >= 1200
  162. #pragma warning(push)
  163. #endif
  164.  
  165. #pragma warning(disable: 4214) // nonstandard extension used : bit field types other than int
  166.  
  167. typedef struct _NFIT_DEVICE_HANDLE {
  168.     union {
  169.         struct {
  170.             ULONG    DIMMNumber:4;
  171.             ULONG    MemoryChannelNumber:4;
  172.             ULONG    MemoryControllerId:4;
  173.             ULONG    SocketId:4;
  174.             ULONG    NodeControllerId:12;
  175.             ULONG    Reserved:4;
  176.         } NfitHandle;
  177.  
  178.         ULONG AsUlong;
  179.     } u;
  180. } NFIT_DEVICE_HANDLE, *PNFIT_DEVICE_HANDLE;
  181.  
  182. #if _MSC_VER >= 1200
  183. #pragma warning(pop)
  184. #endif
  185.  
  186. //
  187. // Memory Device State Flags
  188. //
  189.  
  190. typedef enum _NFIT_DEVICE_STATE_FLAG {
  191.     NfitDeviceStateFlagSaveFail             = 0x0001,
  192.     NfitDeviceStateFlagRestoreFail          = 0x0002,
  193.     NfitDeviceStateFlagPlatformFlushFail    = 0x0004,
  194.     NfitDeviceStateFlagNotArm               = 0x0008,
  195.     NfitDeviceStateFlagHealthEvent          = 0x0010,
  196.     NfitDeviceStateFlagNotifyEnabled        = 0x0020,
  197. } NFIT_DEVICE_STATE_FLAG, *PNFIT_DEVICE_STATE_FLAG;
  198.  
  199. #define NFIT_VALID_DEVICE_STATE_FLAGS \
  200.     (NfitDeviceStateFlagSaveFail |          \
  201.      NfitDeviceStateFlagRestoreFail |       \
  202.      NfitDeviceStateFlagPlatformFlushFail | \
  203.      NfitDeviceStateFlagNotArm |            \
  204.      NfitDeviceStateFlagHealthEvent |       \
  205.      NfitDeviceStateFlagNotifyEnabled)
  206.  
  207. //
  208. // NFIT Memory Device to System Physical Address Range Mapping Structure
  209. //
  210.  
  211. typedef struct _NFIT_MEMORY_DEVICE_TO_SPA_RANGE_MAPPING {
  212.     NFIT_STRUCT_HEADER Header;
  213.     NFIT_DEVICE_HANDLE NfitHandle;
  214.     USHORT MemoryDevicePhysicalId;
  215.     USHORT MemoryDeviceRegionId;
  216.     USHORT SpaRangeIndex;
  217.     USHORT NVDIMMControlRegionIndex;
  218.     ULONG64 MemoryDeviceRegionSize;
  219.     ULONG64 RegionOffset;
  220.     ULONG64 MemoryDpaRegionBase;
  221.     USHORT InterleaveIndex;
  222.     USHORT InterleaveWays;
  223.     USHORT MemoryDeviceStateFlags;
  224.     USHORT Reserved;
  225. } NFIT_MEMORY_DEVICE_TO_SPA_RANGE_MAPPING, *PNFIT_MEMORY_DEVICE_TO_SPA_RANGE_MAPPING;
  226.  
  227. //
  228. // NFIT Interleave Structure
  229. //
  230.  
  231. typedef struct _NFIT_INTERLEAVE {
  232.     NFIT_STRUCT_HEADER Header;
  233.     USHORT InterleaveIndex;
  234.     USHORT Reserved;
  235.     ULONG LinesDescribed;
  236.     ULONG LineSize;
  237.     ULONG LineOffsets[ANYSIZE_ARRAY];
  238. } NFIT_INTERLEAVE, *PNFIT_INTERLEAVE;
  239.  
  240. //
  241. // NFIT SMBIOS Management Information Structure
  242. //
  243.  
  244. typedef struct _NFIT_SMBIOS_MANAGEMENT_INFO {
  245.     NFIT_STRUCT_HEADER Header;
  246.     ULONG Reserved;
  247.     UCHAR Data[ANYSIZE_ARRAY];
  248. } NFIT_SMBIOS_MANAGEMENT_INFO, *PNFIT_SMBIOS_MANAGEMENT_INFO;
  249.  
  250. //
  251. // NVDIMM Control Region Flags
  252. //
  253.  
  254. typedef enum _NFIT_CONTROL_REGION_FLAG {
  255.     NfitControlRegionFlagBufferBlockDataWindow  = 0x0001
  256. } NFIT_CONTROL_REGION_FLAG, *PNFIT_CONTROL_REGION_FLAG;
  257.  
  258. #define NFIT_VALID_CONTROL_REGION_FLAGS \
  259.     (NfitControlRegionFlagBufferBlockDataWindow)
  260.  
  261. //
  262. // NFIT Control Region Structure
  263. //
  264.  
  265. typedef struct _NFIT_NVDIMM_CONTROL_REGION {
  266.     NFIT_STRUCT_HEADER Header;
  267.     USHORT NvdimmControlRegionIndex;
  268.     USHORT VendorId;
  269.     USHORT DeviceId;
  270.     USHORT RevisionId;
  271.     USHORT SubsystemVendorId;
  272.     USHORT SubsystemDeviceId;
  273.     USHORT SubsystemRevisionId;
  274.     UCHAR Reserved[6];
  275.     ULONG SerialNumber;
  276.     USHORT RegionFormatInterfaceCode;
  277.     USHORT BCWCount;
  278.     ULONG64 BCWSize;
  279.     ULONG64 BCWCommandRegisterOffset;
  280.     ULONG64 BCWCommandRegisterSize;
  281.     ULONG64 BCWStatusRegisterOffset;
  282.     ULONG64 BCWStatusRegisterSize;
  283.     USHORT NvdimmControlRegionFlag;
  284.     UCHAR Reserved1[6];
  285. } NFIT_NVDIMM_CONTROL_REGION, *PNFIT_NVDIMM_CONTROL_REGION;
  286.  
  287. #define NVDIMM_CONTROL_REGION_BASE_SIZE        (FIELD_OFFSET(NFIT_NVDIMM_CONTROL_REGION, BCWSize))
  288. #define NVDIMM_CONTROL_REGION_EXTENDED_SIZE    (sizeof(NFIT_NVDIMM_CONTROL_REGION))
  289.  
  290. //
  291. // NFIT Block Data Window Region Structure
  292. //
  293.  
  294. typedef struct _NFIT_BLOCK_DATA_WINDOW_REGION {
  295.     NFIT_STRUCT_HEADER Header;
  296.     USHORT NvdimmControlRegionIndex;
  297.     USHORT BlockDataWindowCount;
  298.     ULONG64 BlockDataWindowOffset;
  299.     ULONG64 BlockDataWindowSize;
  300.     ULONG64 BlockAccessibleCapacity;
  301.     ULONG64 FirstAccessibleBlockAddress;
  302. } NFIT_BLOCK_DATA_WINDOW_REGION, *PNFIT_BLOCK_DATA_WINDOW_REGION;
  303.  
  304. //
  305. // NFIT Flush Hint Address Structure
  306. //
  307.  
  308. typedef struct _NFIT_FLUSH_HINT_ADDRESS {
  309.     NFIT_STRUCT_HEADER Header;
  310.     NFIT_DEVICE_HANDLE NfitHandle;
  311.     USHORT FlushHintAddressCount;
  312.     UCHAR Reserved[6];
  313.     ULONG64 FlushHintAddress[ANYSIZE_ARRAY];
  314. } NFIT_FLUSH_HINT_ADDRESS, *PNFIT_FLUSH_HINT_ADDRESS;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement