summaryrefslogtreecommitdiff
path: root/ReferenceCode/Chipset/SystemAgent/MemoryInit/Pei/Source/Include/MrcRmtData.h
blob: 38f1c08690fa346c10a997ff81d888594b487bc3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
/** @file
  Copies the memory related timing and configuration information into the
  Compatible BIOS data (BDAT) table.

@copyright
  Copyright (c) 2010 - 2012 Intel Corporation. All rights reserved.
  This software and associated documentation (if any) is furnished
  under a license and may only be used or copied in accordance
  with the terms of the license. Except as permitted by such
  license, no part of this software or documentation may be
  reproduced, stored in a retrieval system, or transmitted in any
  form or by any means without the express written consent of
  Intel Corporation.

  This file contains an 'Intel Peripheral Driver' and uniquely
  identified as "Intel Reference Module" and is
  licensed for Intel CPUs and chipsets under the terms of your
  license agreement with Intel or your vendor.  This file may
  be modified by the user, subject to additional terms of the
  license agreement.
**/
#ifndef _MrcRmtData_h_
#define _MrcRmtData_h_

#include "MrcTypes.h"
#include "MrcApi.h"

#define VDD_1_350             1350                      ///< VDD in millivolts
#define VDD_1_500             1500                      ///< VDD in millivolts
#define PI_STEP_BASE          2048                      ///< Magic number from spec
#define PI_STEP_INTERVAL      128                       ///< tCK is split into this amount of intervals
#define PI_STEP               ((PI_STEP_BASE) / (PI_STEP_INTERVAL))
#define VREF_STEP_BASE        100                       ///< Magic number from spec
#define TX_VREF_STEP          7800                      ///< TX Vref step in microvolts
#define TX_VREF(VDD)          (((TX_VREF_STEP) * (VREF_STEP_BASE)) / (VDD)) ///< VDD passed in is in millivolts
#define RX_VREF_STEP          8000                      ///< TX Vref step in microvolts
#define RX_VREF(VDD)          (((RX_VREF_STEP) * (VREF_STEP_BASE)) / (VDD)) ///< VDD passed in is in millivolts
#define CA_VREF_STEP          8000                      ///< TX Vref step in microvolts
#define CA_VREF(VDD)          (((CA_VREF_STEP) * (VREF_STEP_BASE)) / (VDD)) ///< VDD passed in is in millivolts
#define PRIMARY_OFFSET        0                         ///< Offset into the BDAT header version.
#define SECONDARY_OFFSET      1                         ///< Offset into the BDAT header version.
#define RMT_PRIMARY_VERSION   3                         ///< The BDAT structure that is currently supported.
#define RMT_SECONDARY_VERSION 0                         ///< The BDAT structure that is currently supported.
#define OEM_OFFSET            0                         ///< The current offset to the OEM data in the BDAT structure.
#define MAX_SPD_RMT           256                       ///< The maximum amount of data, in bytes, in an SPD structure.

#pragma pack(push, 1)

typedef struct {
  U8                          BiosDataSignature[CHAR_BITS * sizeof (U8)]; ///< "BDATHEAD"
  U32                         BiosDataStructSize;       ///< sizeof BDAT_STRUCTURE
  U16                         Crc16;                    ///< 16-bit CRC of BDAT_STRUCTURE (calculated with 0 in this field)
  U16                         Reserved;
  union {
    U32                       L;
    U16                       S[2];
  }                           Version;                  ///< Version, primary then secondary.
  U32                         OemOffset;                ///< Optional offset to OEM-defined structure
  U32                         Reserved1;
  U32                         Reserved2;
} RmtHeader;

typedef struct {
  U8                          RxDqLeft;                 ///< Units = piStep
  U8                          RxDqRight;
  U8                          TxDqLeft;
  U8                          TxDqRight;
  U8                          RxVrefLow;                ///< Units = rxVrefStep
  U8                          RxVrefHigh;
  U8                          TxVrefLow;                ///< Units = txVrefStep
  U8                          TxVrefHigh;
} RmtDqMargin;

typedef struct {
  U8                          RxDqLeft;                 ///< Units = piStep
  U8                          RxDqRight;
  U8                          TxDqLeft;
  U8                          TxDqRight;
  U8                          CmdLeft;
  U8                          CmdRight;
  U8                          RecvenLeft;               ///< Units = recvenStep
  U8                          RecvenRight;
  U8                          WrLevelLeft;              ///< Units = wrLevelStep
  U8                          WrLevelRight;
  U8                          RxVrefLow;                ///< Units = rxVrefStep
  U8                          RxVrefHigh;
  U8                          TxVrefLow;                ///< Units = txVrefStep
  U8                          TxVrefHigh;
  U8                          CmdVrefLow;               ///< Units = caVrefStep
  U8                          CmdVrefHigh;
} RmtRankMargin;

typedef struct {
  U16                         RecEnDelay[MAX_STROBE];
  U16                         WlDelay[MAX_STROBE];
  U8                          RxDqDelay[MAX_STROBE];
  U8                          TxDqDelay[MAX_STROBE];
  U8                          ClkDelay;
  U8                          CtlDelay;
  U8                          CmdDelay[3];
  U8                          IoLatency;
  U8                          Roundtrip;
} RmtRankTraining;

typedef union {
  U16                         ModeRegister[MAX_MR_IN_DIMM]; ///< Dimm mode registers MR0 - MR3.
#if 0
  struct {
    struct {
      U16                     BurstLength     : 2;      ///<   A1:A0 - Burst length
      U16                     CasLatency0     : 1;      ///<      A2 - CAS latency bit 0
      U16                     ReadBurstType   : 1;      ///<      A3 - Read burst type
      U16                     CasLatency      : 3;      ///<   A6:A4 - CAS latency bits 3:1
      U16                     Mode            : 1;      ///<      A7 - Test/Normal mode
      U16                     DllReset        : 1;      ///<      A8 - DLL reset
      U16                     WriteRecovery   : 3;      ///<  A11:A9 - CAS latency bits 3:1
      U16                     DllPd           : 1;      ///<     A12 - DLL control for precharge power down
      U16                                     : 3;      ///< A15:A13 - Reserved
    } Mr0;
    struct {
      U16                     DllEnable       : 1;      ///<      A0 - DLL enable
      U16                     DriverImpCtrl0  : 1;      ///<      A1 - Output driver impedance control bit 0
      U16                     RttNom0         : 1;      ///<      A2 - Odt Rtt values bit 0
      U16                     AdditiveLatency : 2;      ///<   A4:A3 - Additive latency
      U16                     DriverImpCtrl   : 1;      ///<      A5 - Output driver impedance control bit 1
      U16                     RttNom1         : 1;      ///<      A6 - Odt Rtt values bit 1
      U16                     WriteLeveling   : 1;      ///<      A7 - Write leveling enable
      U16                                     : 1;      ///<      A8 - Reserved
      U16                     RttNom2         : 1;      ///<      A9 - Odt Rtt values bit 2
      U16                                     : 1;      ///<     A10 - Reserved
      U16                     TdqsEnable      : 1;      ///<     A11 - Termination data strobe
      U16                     Qoff            : 1;      ///<     A12 - Output disable
      U16                                     : 3;      ///< A15:A13 - Reserved
    } Mr1;
    struct {
      U16                     Pasr            : 3;      ///<   A2:A0 - Partial array self refresh
      U16                     CasWrLatency    : 3;      ///<   A5:A3 - CAS write latency
      U16                     AutoSelfRefresh : 1;      ///<      A6 - Automatic self refresh
      U16                     SelfRefreshTemp : 1;      ///<      A7 - Self refresh temperature range
      U16                                     : 1;      ///<      A8 - Reserved
      U16                     RttWrite        : 2;      ///<  A10:A9 - Dynamic ODT
      U16                                     : 5;      ///< A15:A11 - Reserved
    } Mr2;
    struct {
      U16                     MprAddress      : 2;      ///<   A1:A0 - Multi-purpose register address
      U16                     MprControl      : 1;      ///<      A2 - Multi-purpose register control
      U16                                     : 13;     ///<  A15:A3 - Reserved
    } Mr3;
  } b;
#endif
} RmtRankMrs;

typedef struct {
  U8                          RankEnabled;              ///< 0 = Rank disabled
  U8                          RankMarginEnabled;        ///< 0 = Rank margin disabled
  U8                          DqMarginEnabled;          ///< 0 = Dq margin disabled
  RmtRankMargin               RankMargin;               ///< Rank margin data
  RmtDqMargin                 DqMargin[MAX_DQ];         ///< Array of Dq margin data per rank
  RmtRankTraining             RankTraining;             ///< Rank training settings
  RmtRankMrs                  RankMRS;                  ///< Rank MRS settings
} RmtRankList;

typedef struct {
  U8                          SpdValid[MAX_SPD_RMT / (CHAR_BITS * sizeof (U8))]; ///< Each valid bit maps to SPD byte
  U8                          SpdData[MAX_SPD_RMT];     ///< Array of raw SPD data bytes
} RmtSpd;

typedef struct {
  U8                          DimmEnabled;              ///< 0 = DIMM disabled
  RmtRankList                 RankList[MAX_RANK_IN_DIMM]; ///< Array of ranks per DIMM
  RmtSpd                      SpdBytes;                 ///< SPD data per DIMM
} RmtDimmList;

typedef struct {
  U8                          ChannelEnabled;           ///< 0 = Channel disabled
  U8                          NumDimmSlot;              ///< Number of slots per channel on the board
  RmtDimmList                 DimmList[MAX_DIMMS_IN_CHANNEL]; ///< Array of DIMMs per channel
} RmtChannelList;

typedef struct {
  U8                          ControllerEnabled;        ///< 0 = MC disabled
  U16                         ControllerDeviceId;       ///< MC device Id
  U8                          ControllerRevisionId;     ///< MC revision Id
  U16                         MemoryFrequency;          ///< Memory frequency in units of MHz / 10
                                                        ///< e.g. ddrFreq = 13333 for tCK = 1.5 ns
  U16                         MemoryVoltage;            ///< Memory Vdd in units of mV
                                                        ///< e.g. ddrVoltage = 1350 for Vdd = 1.35 V
  U8                          PiStep;                   ///< Step unit = piStep * tCK / 2048
                                                        ///< e.g. piStep = 16 for step = 11.7 ps (1/128 tCK)
  U16                         RxVrefStep;               ///< Step unit = rxVrefStep * Vdd / 100
                                                        ///< e.g. rxVrefStep = 520 for step = 7.02 mV
  U16                         TxVrefStep;               ///< Step unit = txVrefStep * Vdd / 100
  U16                         CaVrefStep;               ///< Step unit = caVrefStep * Vdd / 100
  U8                          RecvenStep;               ///< Step unit = recvenStep * tCK / 2048
  U8                          WrLevelStep;              ///< Step unit = wrLevelStep * tCK / 2048
  RmtChannelList              ChannelList[MAX_CHANNEL]; ///< Array of channels per memory controller
} RmtControllerList;

typedef struct {
  union {
    U32                       l;                        ///< MRC version: Major.Minor.Revision.Build
    struct {
      U8                      Build;                    ///< MRC version: Build
      U8                      Revision;                 ///< MRC version: Revision
      U8                      Minor;                    ///< MRC version: Minor
      U8                      Major;                    ///< MRC version: Major
    } c;
  }                           RefCodeRevision;          ///< Major.Minor.Revision.Build
  U8                          MaxController;            ///< Max controllers per system, e.g. 1
  U8                          MaxChannel;               ///< Max channels per memory controller, e.g. 2
  U8                          MaxDimm;                  ///< Max DIMM per channel, e.g. 2
  U8                          MaxRankDimm;              ///< Max ranks per DIMM, e.g. 2
  U8                          MaxStrobe;                ///< Number of Dqs used by the rank, e.g. 18
  U8                          MaxDq;                    ///< Number of Dq bits used by the rank, e.g. 72
  U32                         MarginLoopCount;          ///< Units of cache line
  RmtControllerList           ControllerList[MAX_CONTROLLERS]; ///< Array of memory controllers per system
} RmtSystem;

typedef struct RmtStruct {
  RmtHeader                   RmtHeader;
  RmtSystem                   RmtSystem;
} RmtData;

#pragma pack (pop)

#endif //_MrcRmtData_h_