1 /************************************************************************
2  *
3  * Copyright (c) 2013-2015 Intel Corporation.
4  *
5 * This program and the accompanying materials
6 * are licensed and made available under the terms and conditions of the BSD License
7 * which accompanies this distribution.  The full text of the license may be found at
8 * http://opensource.org/licenses/bsd-license.php
9 *
10 * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12  *
13  ************************************************************************/
14 #ifndef _MRC_H_
15 #define _MRC_H_
16 
17 #include "core_types.h"
18 
19 // define the MRC Version
20 #define MRC_VERSION 0x0112
21 
22 
23 // architectural definitions
24 #define NUM_CHANNELS   1 // number of channels
25 #define NUM_RANKS      2 // number of ranks per channel
26 #define NUM_BYTE_LANES 4 // number of byte lanes per channel
27 
28 // software limitations
29 #define MAX_CHANNELS   1
30 #define MAX_RANKS      2
31 #define MAX_BYTE_LANES 4
32 
33 // only to mock MrcWrapper
34 #define MAX_SOCKETS    1
35 #define MAX_SIDES      1
36 #define MAX_ROWS       (MAX_SIDES * MAX_SOCKETS)
37 // end
38 
39 
40 // Specify DRAM of nenory channel width
41 enum {
42   x8,   // DRAM width
43   x16,  // DRAM width & Channel Width
44   x32   // Channel Width
45 };
46 
47 // Specify DRAM speed
48 enum {
49   DDRFREQ_800,
50   DDRFREQ_1066
51 };
52 
53 // Specify DRAM type
54 enum {
55   DDR3,
56   DDR3L
57 };
58 
59 // Delay configuration for individual signals
60 // Vref setting
61 // Scrambler seed
62 typedef struct MrcTimings_s
63 {
64   uint32_t rcvn[NUM_CHANNELS][NUM_RANKS][NUM_BYTE_LANES];
65   uint32_t rdqs[NUM_CHANNELS][NUM_RANKS][NUM_BYTE_LANES];
66   uint32_t wdqs[NUM_CHANNELS][NUM_RANKS][NUM_BYTE_LANES];
67   uint32_t wdq [NUM_CHANNELS][NUM_RANKS][NUM_BYTE_LANES];
68   uint32_t vref[NUM_CHANNELS][NUM_BYTE_LANES];
69   uint32_t wctl[NUM_CHANNELS][NUM_RANKS];
70   uint32_t wcmd[NUM_CHANNELS];
71 
72   uint32_t scrambler_seed;
73   uint8_t  ddr_speed;            // need to save for the case of frequency change
74 } MrcTimings_t;
75 
76 
77 // DENSITY: 0=512Mb, 1=Gb, 2=2Gb, 3=4Gb
78 // tCL is DRAM CAS Latency in clocks.
79 // All other timings are in picoseconds.
80 // Refer to JEDEC spec (or DRAM datasheet) when changing these values.
81 typedef struct DRAMParams_s {
82   uint8_t  DENSITY;
83   uint8_t  tCL;   // CAS latency in clocks
84   uint32_t tRAS;  // ACT to PRE command period
85   uint32_t tWTR;  // Delay from start of internal write transaction to internal read command
86   uint32_t tRRD;  // ACT to ACT command period (JESD79 specific to page size 1K/2K)
87   uint32_t tFAW;  // Four activate window (JESD79 specific to page size 1K/2K)
88 } DRAMParams_t;
89 
90 
91 // Boot mode defined as bit mask (1<<n)
92 #define bmCold     1    // full training
93 #define bmFast     2    // restore timing parameters
94 #define bmS3       4    // resume from S3
95 #define bmWarm     8
96 #define bmUnknown  0
97 
98 
99 // MRC execution status
100 #define MRC_SUCCESS     0      // initialization ok
101 #define MRC_E_MEMTEST   1      // memtest failed
102 
103 
104 //
105 // Input/output/context parameters for Memory Reference Code
106 //
107 typedef struct MRCParams_s
108 {
109   //
110   // Global settings
111   //
112 
113   uint32_t boot_mode;           // bmCold, bmFast, bmWarm, bmS3
114   uint32_t uart_mmio_base;      // pcie serial port base address (force 0 to disable debug)
115 
116   uint8_t  dram_width;          // x8, x16
117   uint8_t  ddr_speed;           // DDRFREQ_800, DDRFREQ_1066
118   uint8_t  ddr_type;            // DDR3, DDR3L
119   uint8_t  ecc_enables;         // 0, 1 (memory size reduced to 7/8)
120   uint8_t  scrambling_enables;  // 0, 1
121   uint32_t rank_enables;        // 1, 3 (1'st rank has to be populated if 2'nd rank present)
122   uint32_t channel_enables;     // 1 only
123   uint32_t channel_width;       // x16 only
124   uint32_t address_mode;        // 0, 1, 2 (mode 2 forced if ecc enabled)
125 
126   // memConfig_t begin
127   uint8_t refresh_rate;         // REFRESH_RATE       : 1=1.95us, 2=3.9us, 3=7.8us, others=RESERVED
128   uint8_t sr_temp_range;        // SR_TEMP_RANGE      : 0=normal, 1=extended, others=RESERVED
129   uint8_t ron_value;            // RON_VALUE          : 0=34ohm, 1=40ohm, others=RESERVED (select MRS1.DIC driver impedance control)
130   uint8_t rtt_nom_value;        // RTT_NOM_VALUE      : 0=40ohm, 1=60ohm, 2=120ohm, others=RESERVED
131   uint8_t rd_odt_value;         // RD_ODT_VALUE       : 0=off, 1=60ohm, 2=120ohm, 3=180ohm, others=RESERVED
132   // memConfig_t end
133 
134   DRAMParams_t params;
135 
136   //
137   // Internally used
138   //
139 
140   uint32_t board_id;            // internally used for board layout (use x8 or x16 memory)
141   uint32_t hte_setup : 1;       // when set hte reconfiguration requested
142   uint32_t menu_after_mrc : 1;
143   uint32_t power_down_disable :1;
144   uint32_t tune_rcvn :1;
145 
146   uint32_t channel_size[NUM_CHANNELS];
147   uint32_t column_bits[NUM_CHANNELS];
148   uint32_t row_bits[NUM_CHANNELS];
149 
150   uint32_t mrs1;                // register content saved during training
151 
152   //
153   // Output
154   //
155 
156   uint32_t status;              // initialization result (non zero specifies error code)
157   uint32_t mem_size;            // total memory size in bytes (excludes ECC banks)
158 
159   MrcTimings_t timings;         // training results (also used on input)
160 
161 } MRCParams_t;
162 
163 // Alternative type name for consistent naming convention
164 #define MRC_PARAMS    MRCParams_t
165 
166 #endif // _MRC_H_
167