1 /** @file
2   Copies the memory related timing and configuration information into the
3   Compatible BIOS data (BDAT) table.
4 
5   Copyright (c) 2019 Intel Corporation. All rights reserved. <BR>
6 
7   SPDX-License-Identifier: BSD-2-Clause-Patent
8 **/
9 
10 #ifndef _MrcRmtData_h_
11 #define _MrcRmtData_h_
12 
13 #include "MrcTypes.h"
14 
15 #define VDD_1_350             1350                      ///< VDD in millivolts
16 #define VDD_1_500             1500                      ///< VDD in millivolts
17 #define PI_STEP_BASE          2048                      ///< Magic number from spec
18 #define PI_STEP_INTERVAL      128                       ///< tCK is split into this amount of intervals
19 #define PI_STEP               ((PI_STEP_BASE) / (PI_STEP_INTERVAL))
20 #define VREF_STEP_BASE        100                       ///< Magic number from spec
21 #define TX_VREF_STEP          7800                      ///< TX Vref step in microvolts
22 #define TX_VREF(VDD)          (((TX_VREF_STEP) * (VREF_STEP_BASE)) / (VDD)) ///< VDD passed in is in millivolts
23 #define RX_VREF_STEP          8000                      ///< TX Vref step in microvolts
24 #define RX_VREF(VDD)          (((RX_VREF_STEP) * (VREF_STEP_BASE)) / (VDD)) ///< VDD passed in is in millivolts
25 #define CA_VREF_STEP          8000                      ///< TX Vref step in microvolts
26 #define CA_VREF(VDD)          (((CA_VREF_STEP) * (VREF_STEP_BASE)) / (VDD)) ///< VDD passed in is in millivolts
27 
28 #define MAX_SPD_RMT           512                       ///< The maximum amount of data, in bytes, in an SPD structure.
29 #define RMT_PRIMARY_VERSION   4                         ///< The BDAT structure that is currently supported.
30 #define RMT_SECONDARY_VERSION 0                         ///< The BDAT structure that is currently supported.
31 #define MAX_MODE_REGISTER     7                         ///< Number of mode registers
32 #define MAX_DRAM_DEVICE       9                         ///< Maximum number of memory devices
33 #define MAX_2D_EYE_TYPE       2                         ///< Maximum number of supported Margin 2D Eye Types
34 #define MAX_2D_EYE_OFFSETS    7                         ///< Number of 2D Eye Offsets
35 
36 //
37 // Warning: Bdat4.h has its own copy of this #define
38 // make sure to change it in both places
39 //
40 #define MAX_SCHEMA_LIST_LENGTH (10)
41 
42 
43 #ifdef BDAT_SUPPORT
44 /*
45   BSSA result Memory Schema GUID
46   {8F4E928-0F5F-46D4-8410-479FDA279DB6}
47 */
48 extern EFI_GUID gSsaBiosResultsGuid;
49 /*
50   RMT Results Metadata GUID
51   {02CB1552-D659-4232-B51F-CAB1E11FCA87}
52 */
53 extern EFI_GUID gRmtResultMetadataGuid;
54 /*
55   RMT Results Columns GUID
56   {0E60A1EB-331F-42A1-9DE7-453E84761154}
57 */
58 extern EFI_GUID gRmtResultColumnsGuid;
59 
60 /*
61 Margin2D Results Metadata GUID
62 {48265582-8E49-4AC7-AA06-E1B9A74C9716}
63 */
64 extern EFI_GUID gMargin2DResultMetadataGuid;
65 /*
66 Margin2D Results Columns GUID
67 {91A449EC-8A4A-4736-AD71-A3F6F6D752D9}
68 */
69 extern EFI_GUID gMargin2DResultColumnsGuid;
70 
71 #endif
72 /*
73  GUID for Schema List HOB
74  This is private GUID used by MemoryInit internally.
75  {3047C2AC-5E8E-4C55-A1CB-EAAD0A88861B}
76 */
77 extern EFI_GUID gMrcSchemaListHobGuid;
78 
79 #pragma pack(push, 1)
80 
81 
82 ///
83 /// SSA results buffer header.
84 ///
85 typedef struct {
86   UINT32  Revision;
87   BOOLEAN TransferMode;
88   struct {
89     UINT32   Reserved;
90     UINT32   MetadataSize;
91     EFI_GUID MetadataType;
92   } MdBlock;
93   struct {
94     UINT32   Reserved;
95     EFI_GUID ResultType;
96     UINT32   ResultElementSize;
97     INT32    ResultCapacity;
98     INT32    ResultElementCount;
99   } RsBlock;
100 } RESULTS_DATA_HDR;
101 
102 // start auto-generated by the BSSA CCK sourced from the result xml files.
103 typedef enum {
104   DisableScrambler = 0,
105   EnableScrambler = 1,
106   DontTouchScrambler = 2,
107   SCRAMBLER_OVERRIDE_MODE_DELIM = MRC_INT32_MAX
108 } SCRAMBLER_OVERRIDE_MODE;
109 
110 typedef struct _RMT_RESULT_METADATA {
111   BOOLEAN EnableCtlAllMargin;
112   UINT16 SinglesBurstLength;
113   UINT32 SinglesLoopCount;
114   UINT16 TurnaroundsBurstLength;
115   UINT32 TurnaroundsLoopCount;
116   SCRAMBLER_OVERRIDE_MODE ScramblerOverrideMode;
117   UINT8 PiStepUnit[2];
118   UINT16 RxVrefStepUnit[2];
119   UINT16 TxVrefStepUnit[2][2];
120   UINT16 CmdVrefStepUnit[2][2];
121   UINT8 MajorVer;
122   UINT8 MinorVer;
123   UINT8 RevVer;
124   UINT32 BuildVer;
125   UINT16 ResultEleCount;
126 } RMT_RESULT_METADATA;
127 
128 
129 typedef struct _RMT_RESULT_ROW_HEADER {
130   UINT32 ResultType : 5;
131   UINT32 Socket : 3;
132   UINT32 Controller : 2;
133   UINT32 Channel : 3;
134   UINT32 DimmA : 1;
135   UINT32 RankA : 3;
136   UINT32 DimmB : 1;
137   UINT32 RankB : 3;
138   UINT32 Lane : 8;
139   UINT32 IoLevel : 1;
140   UINT32 Reserved : 2;
141 } RMT_RESULT_ROW_HEADER;
142 
143 typedef struct _RMT_RESULT_COLUMNS {
144   RMT_RESULT_ROW_HEADER Header;
145   UINT8 Margin[4][2];
146 } RMT_RESULT_COLUMNS;
147 
148 // end of auto-generated by the BSSA CCK sourced from the result xml files.
149 
150 typedef struct _BASE_RMT_RESULT {
151   RESULTS_DATA_HDR              ResultsHeader;
152   RMT_RESULT_METADATA           Metadata;
153   RMT_RESULT_COLUMNS            Rows[1];
154 } BASE_RMT_RESULT;
155 
156 
157 typedef struct {
158   UINT32                      Data1;
159   UINT16                      Data2;
160   UINT16                      Data3;
161   UINT8                       Data4[8];
162 } BDAT_EFI_GUID;
163 
164 typedef struct {
165   UINT16  HobType;
166   UINT16  HobLength;
167   UINT32  Reserved;
168 } BDAT_HOB_GENERIC_HEADER;
169 
170 typedef struct {
171   BDAT_HOB_GENERIC_HEADER  Header;
172   BDAT_EFI_GUID            Name;
173   ///
174   /// Guid specific data goes here
175   ///
176 } BDAT_HOB_GUID_TYPE;
177 
178 typedef struct {
179   BDAT_EFI_GUID               SchemaId;                         ///< The GUID uniquely identifies the format of the data contained within the structure.
180   UINT32                      DataSize;                         ///< The total size of the memory block, including both the header as well as the schema specific data.
181   UINT16                      Crc16;                            ///< Crc16 is computed in the same manner as the field in the BDAT_HEADER_STRUCTURE.
182 } MRC_BDAT_SCHEMA_HEADER_STRUCTURE;
183 
184 typedef struct {
185   MRC_BDAT_SCHEMA_HEADER_STRUCTURE SchemaHeader;                ///< The schema header.
186   BASE_RMT_RESULT          RMT_RESULTS_WITH_META_COLUMNS;
187 } BDAT_MEMORY_DATA_STRUCTURE;
188 
189 typedef struct {
190   BDAT_HOB_GUID_TYPE          HobGuidType;
191   BDAT_MEMORY_DATA_STRUCTURE  MemorySchema;
192 } BDAT_MEMORY_DATA_HOB;
193 
194 #pragma pack (pop)
195 
196 typedef struct {
197   BDAT_HOB_GUID_TYPE          HobGuidType;
198   UINT16                      SchemaHobCount;
199   UINT16                      Reserved;
200   BDAT_EFI_GUID               SchemaHobGuids[MAX_SCHEMA_LIST_LENGTH];
201 } MRC_BDAT_SCHEMA_LIST_HOB;
202 
203 #endif //_MrcRmtData_h_
204