Home | History | Annotate | Download | only in Include
      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