1 /** @file 2 Memory controller configuration. 3 4 Copyright (c) 2013-2015 Intel Corporation. 5 6 This program and the accompanying materials 7 are licensed and made available under the terms and conditions of the BSD License 8 which accompanies this distribution. The full text of the license may be found at 9 http://opensource.org/licenses/bsd-license.php 10 11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13 14 **/ 15 #ifndef __DDR_MEMORY_CONTROLLER_H__ 16 #define __DDR_MEMORY_CONTROLLER_H__ 17 18 // 19 // DDR timing data definitions. 20 // These are used to create bitmaps of valid timing configurations. 21 // 22 23 #define DUAL_CHANNEL_DDR_TIMING_DATA_FREQUENCY_UNKNOWN 0xFF 24 #define DUAL_CHANNEL_DDR_TIMING_DATA_REFRESH_RATE_UNKNOWN 0xFF 25 26 #define DUAL_CHANNEL_DDR_TIMING_DATA_TCL_20 0x01 27 #define DUAL_CHANNEL_DDR_TIMING_DATA_TCL_25 0x00 28 #define DUAL_CHANNEL_DDR_TIMING_DATA_TCL_30 0x02 29 #define DUAL_CHANNEL_DDR_TIMING_DATA_TCL_ALL 0x03 30 31 32 #define DUAL_CHANNEL_DDR_TIMING_DATA_TRCD_02 0x02 33 #define DUAL_CHANNEL_DDR_TIMING_DATA_TRCD_03 0x01 34 #define DUAL_CHANNEL_DDR_TIMING_DATA_TRCD_04 0x00 35 #define DUAL_CHANNEL_DDR_TIMING_DATA_TRCD_ALL 0x03 36 37 #define DUAL_CHANNEL_DDR_TIMING_DATA_TRP_02 0x02 38 #define DUAL_CHANNEL_DDR_TIMING_DATA_TRP_03 0x01 39 #define DUAL_CHANNEL_DDR_TIMING_DATA_TRP_04 0x00 40 #define DUAL_CHANNEL_DDR_TIMING_DATA_TRP_ALL 0x03 41 42 #define DUAL_CHANNEL_DDR_TIMING_DATA_TRAS_05 0x05 43 #define DUAL_CHANNEL_DDR_TIMING_DATA_TRAS_06 0x04 44 #define DUAL_CHANNEL_DDR_TIMING_DATA_TRAS_07 0x03 45 #define DUAL_CHANNEL_DDR_TIMING_DATA_TRAS_08 0x02 46 #define DUAL_CHANNEL_DDR_TIMING_DATA_TRAS_09 0x01 47 #define DUAL_CHANNEL_DDR_TIMING_DATA_TRAS_10 0x00 48 #define DUAL_CHANNEL_DDR_TIMING_DATA_TRAS_ALL 0x07 49 50 #define DUAL_CHANNEL_DDR_DATA_TYPE_REGISTERED 0x01 51 #define DUAL_CHANNEL_DDR_DATA_TYPE_UNREGISTERED 0x02 52 #define DUAL_CHANNEL_DDR_DATA_TYPE_BUFFERED 0x04 53 #define DUAL_CHANNEL_DDR_DATA_TYPE_UNBUFFERED 0x08 54 #define DUAL_CHANNEL_DDR_DATA_TYPE_SDR 0x10 55 #define DUAL_CHANNEL_DDR_DATA_TYPE_DDR 0x20 56 57 58 // 59 // Maximum number of SDRAM channels supported by the memory controller 60 // 61 #define MAX_CHANNELS 1 62 63 // 64 // Maximum number of DIMM sockets supported by the memory controller 65 // 66 #define MAX_SOCKETS 1 67 68 // 69 // Maximum number of sides supported per DIMM 70 // 71 #define MAX_SIDES 2 72 73 // 74 // Maximum number of "Socket Sets", where a "Socket Set is a set of matching 75 // DIMM's from the various channels 76 // 77 #define MAX_SOCKET_SETS 2 78 79 // 80 // Maximum number of rows supported by the memory controller 81 // 82 #define MAX_ROWS (MAX_SIDES * MAX_SOCKETS) 83 84 // 85 // Maximum number of memory ranges supported by the memory controller 86 // 87 #define MAX_RANGES (MAX_ROWS + 5) 88 89 // 90 // Maximum Number of Log entries 91 // 92 #define MEMORY_LOG_MAX_INDEX 16 93 94 95 typedef struct _MEMORY_LOG_ENTRY { 96 EFI_STATUS_CODE_VALUE Event; 97 EFI_STATUS_CODE_TYPE Severity; 98 UINT8 Data; 99 } MEMORY_LOG_ENTRY; 100 101 typedef struct _MEMORY_LOG { 102 UINT8 Index; 103 MEMORY_LOG_ENTRY Entry[MEMORY_LOG_MAX_INDEX]; 104 } MEMORY_LOG; 105 106 107 108 // 109 // Defined ECC types 110 // 111 #define DUAL_CHANNEL_DDR_ECC_TYPE_NONE 0x01 // No error checking 112 #define DUAL_CHANNEL_DDR_ECC_TYPE_EC 0x02 // Error checking only 113 #define DUAL_CHANNEL_DDR_ECC_TYPE_SECC 0x04 // Software Scrubbing ECC 114 #define DUAL_CHANNEL_DDR_ECC_TYPE_HECC 0x08 // Hardware Scrubbing ECC 115 #define DUAL_CHANNEL_DDR_ECC_TYPE_CKECC 0x10 // Chip Kill ECC 116 117 // 118 // Row configuration status values 119 // 120 #define DUAL_CHANNEL_DDR_ROW_CONFIG_SUCCESS 0x00 // No error 121 #define DUAL_CHANNEL_DDR_ROW_CONFIG_UNKNOWN 0x01 // Pattern mismatch, no memory 122 #define DUAL_CHANNEL_DDR_ROW_CONFIG_UNSUPPORTED 0x02 // Memory type not supported 123 #define DUAL_CHANNEL_DDR_ROW_CONFIG_ADDRESS_ERROR 0x03 // Row/Col/Bnk mismatch 124 #define DUAL_CHANNEL_DDR_ROW_CONFIG_ECC_ERROR 0x04 // Received ECC error 125 #define DUAL_CHANNEL_DDR_ROW_CONFIG_NOT_PRESENT 0x05 // Row is not present 126 #define DUAL_CHANNEL_DDR_ROW_CONFIG_DISABLED 0x06 // Row is disabled 127 128 129 // 130 // Memory range types 131 // 132 typedef enum { 133 DualChannelDdrMainMemory, 134 DualChannelDdrSmramCacheable, 135 DualChannelDdrSmramNonCacheable, 136 DualChannelDdrGraphicsMemoryCacheable, 137 DualChannelDdrGraphicsMemoryNonCacheable, 138 DualChannelDdrReservedMemory, 139 DualChannelDdrMaxMemoryRangeType 140 } DUAL_CHANNEL_DDR_MEMORY_RANGE_TYPE; 141 142 // 143 // Memory map range information 144 // 145 typedef struct { 146 EFI_PHYSICAL_ADDRESS PhysicalAddress; 147 EFI_PHYSICAL_ADDRESS CpuAddress; 148 EFI_PHYSICAL_ADDRESS RangeLength; 149 DUAL_CHANNEL_DDR_MEMORY_RANGE_TYPE Type; 150 } DUAL_CHANNEL_DDR_MEMORY_MAP_RANGE; 151 typedef struct { 152 unsigned dramType :1; /**< Type: 0 = RESERVED; 1 = DDR2 */ 153 unsigned dramWidth :1; /**< Width: 0 = x8; 1 = x16 */ 154 unsigned dramDensity :2; /**< Density: 00b = 2Gb; 01b = 1Gb; 10b = 512Mb; 11b = 256Mb */ 155 unsigned dramSpeed :1; /**< Speed Grade: 0 = RESERVED; 1 = 800MT/s;*/ 156 unsigned dramTimings :3; /**< Timings: 4-4-4, 5-5-5, 6-6-6 */ 157 unsigned dramRanks :1; /**< Ranks: 0 = Single Rank; 1 = Dual Rank */ 158 } DramGeometry; /**< DRAM Geometry Descriptor */ 159 160 typedef union _RegDRP { 161 UINT32 raw; 162 struct { 163 unsigned rank0Enabled :1; /**< Rank 0 Enable */ 164 unsigned rank0DevWidth :2; /**< DRAM Device Width (x8,x16) */ 165 unsigned rank0DevDensity :2; /**< DRAM Device Density (256Mb,512Mb,1Gb,2Gb) */ 166 unsigned reserved2 :1; 167 unsigned rank1Enabled :1; /**< Rank 1 Enable */ 168 unsigned reserved3 :5; 169 unsigned dramType :1; /**< DRAM Type (0=DDR2) */ 170 unsigned reserved4 :5; 171 unsigned reserved5 :14; 172 } field; 173 } RegDRP; /**< DRAM Rank Population and Interface Register */ 174 175 176 typedef union { 177 UINT32 raw; 178 struct { 179 unsigned dramFrequency :3; /**< DRAM Frequency (000=RESERVED,010=667,011=800) */ 180 unsigned tRP :2; /**< Precharge to Activate Delay (3,4,5,6) */ 181 unsigned reserved1 :1; 182 unsigned tRCD :2; /**< Activate to CAS Delay (3,4,5,6) */ 183 unsigned reserved2 :1; 184 unsigned tCL :2; /**< CAS Latency (3,4,5,6) */ 185 unsigned reserved3 :21; 186 } field; 187 } RegDTR0; /**< DRAM Timing Register 0 */ 188 189 typedef union { 190 UINT32 raw; 191 struct { 192 unsigned tWRRD_dly :2; /**< Additional Write to Read Delay (0,1,2,3) */ 193 unsigned reserved1 :1; 194 unsigned tRDWR_dly :2; /**< Additional Read to Write Delay (0,1,2,3) */ 195 unsigned reserved2 :1; 196 unsigned tRDRD_dr_dly :1; /**< Additional Read to Read Delay (1,2) */ 197 unsigned reserved3 :1; 198 unsigned tRD_dly :3; /**< Additional Read Data Sampling Delay (0-7) */ 199 unsigned reserved4 :1; 200 unsigned tRCVEN_halfclk_dly :4; /**< Additional RCVEN Half Clock Delay Control */ 201 unsigned reserved5 :1; 202 unsigned readDqDelay :2; /**< Read DQ Delay */ 203 unsigned reserved6 :13; 204 } field; 205 } RegDTR1; /**< DRAM Timing Register 1 */ 206 207 typedef union { 208 UINT32 raw; 209 struct { 210 unsigned ckStaticDisable :1; /**< CK/CK# Static Disable */ 211 unsigned reserved1 :3; 212 unsigned ckeStaticDisable :2; /**< CKE Static Disable */ 213 unsigned reserved2 :8; 214 unsigned refreshPeriod :2; /**< Refresh Period (disabled,128clks,3.9us,7.8us) */ 215 unsigned refreshQueueDepth :2; /**< Refresh Queue Depth (1,2,4,8) */ 216 unsigned reserved5 :13; 217 unsigned initComplete :1; /**< Initialization Complete */ 218 } field; 219 } RegDCO; 220 221 // 222 // MRC Data Structure 223 // 224 typedef struct { 225 RegDRP drp; 226 RegDTR0 dtr0; 227 RegDTR1 dtr1; 228 RegDCO dco; 229 UINT32 reg0104; 230 UINT32 reg0120; 231 UINT32 reg0121; 232 UINT32 reg0123; 233 UINT32 reg0111; 234 UINT32 reg0130; 235 UINT8 refreshPeriod; /**< Placeholder for the chosen refresh 236 * period. This value will NOT be 237 * programmed into DCO until all 238 * initialization is done. 239 */ 240 UINT8 ddr2Odt; /**< 0 = Disabled, 1 = 75 ohm, 2 = 150ohm, 3 = 50ohm */ 241 UINT8 sku; /**< Detected QuarkNcSocId SKU */ 242 UINT8 capabilities; /**< Capabilities Available on this part */ 243 UINT8 state; /**< NORMAL_BOOT, S3_RESUME */ 244 UINT32 memSize; /**< Memory size */ 245 UINT16 pmBase; /**< PM Base */ 246 UINT16 mrcVersion; /**< MRC Version */ 247 UINT32 hecbase; /**< HECBASE shifted left 16 bits */ 248 DramGeometry geometry; /**< DRAM Geometry */ 249 } MRC_DATA_STRUCTURE; /**< QuarkNcSocId Memory Parameters for MRC */ 250 251 typedef struct _EFI_MEMINIT_CONFIG_DATA { 252 MRC_DATA_STRUCTURE MrcData; 253 } EFI_MEMINIT_CONFIG_DATA; 254 255 256 257 #endif 258