]> git.proxmox.com Git - mirror_edk2.git/blame - QuarkSocPkg/QuarkNorthCluster/MemoryInit/Pei/prememinit.c
QuarkSocPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / QuarkSocPkg / QuarkNorthCluster / MemoryInit / Pei / prememinit.c
CommitLineData
9b6bbcdb
MK
1/************************************************************************\r
2 *\r
3 * Copyright (c) 2013-2015 Intel Corporation.\r
4 *\r
c9f231d0 5* SPDX-License-Identifier: BSD-2-Clause-Patent\r
9b6bbcdb
MK
6 *\r
7 ************************************************************************/\r
8\r
9#include "mrc.h"\r
10#include "memory_options.h"\r
11\r
12#include "meminit_utils.h"\r
13#include "prememinit.h"\r
14#include "io.h"\r
15\r
16// Read character from serial console\r
17uint8_t mgetc(void);\r
18\r
19extern uint32_t DpfPrintMask;\r
20\r
21// Adjust configuration parameters before initialisation\r
22// sequence.\r
23void PreMemInit(\r
24 MRCParams_t *mrc_params)\r
25{\r
26 const DRAMParams_t *dram_params;\r
27\r
28 uint8_t dram_width;\r
29 uint32_t dram_cfg_index;\r
30 uint32_t channel_i;\r
31\r
32 ENTERFN();\r
33\r
34#ifdef MRC_SV\r
35 {\r
36 uint8_t ch;\r
37\r
38 myloop:\r
39\r
40 DPF(D_INFO, "- c - continue\n");\r
41 DPF(D_INFO, "- f - boot mode [%d]\n", mrc_params->boot_mode);\r
42 DPF(D_INFO, "- r - rank enable [%d]\n", mrc_params->rank_enables);\r
43 DPF(D_INFO, "- e - ecc switch [%d]\n", mrc_params->ecc_enables);\r
44 DPF(D_INFO, "- b - scrambling switch [%d]\n", mrc_params->scrambling_enables);\r
45 DPF(D_INFO, "- a - adr mode [%d]\n", mrc_params->address_mode);\r
46 DPF(D_INFO, "- m - menu after mrc [%d]\n", mrc_params->menu_after_mrc);\r
47 DPF(D_INFO, "- t - tune to rcvn [%d]\n", mrc_params->tune_rcvn);\r
48 DPF(D_INFO, "- o - odt switch [%d]\n", mrc_params->rd_odt_value);\r
49 DPF(D_INFO, "- d - dram density [%d]\n", mrc_params->params.DENSITY);\r
50 DPF(D_INFO, "- p - power down disable [%d]\n", mrc_params->power_down_disable);\r
51 DPF(D_INFO, "- l - log switch 0x%x\n", DpfPrintMask);\r
52 ch = mgetc();\r
53\r
54 switch (ch)\r
55 {\r
56 case 'f':\r
57 mrc_params->boot_mode >>= 1;\r
58 if(mrc_params->boot_mode == bmUnknown)\r
59 {\r
60 mrc_params->boot_mode = bmWarm;\r
61 }\r
62 DPF(D_INFO, "Boot mode %d\n", mrc_params->boot_mode);\r
63 break;\r
64\r
65 case 'p':\r
66 mrc_params->power_down_disable ^= 1;\r
67 DPF(D_INFO, "Power down disable %d\n", mrc_params->power_down_disable);\r
68 break;\r
69\r
70 case 'r':\r
71 mrc_params->rank_enables ^= 2;\r
72 DPF(D_INFO, "Rank enable %d\n", mrc_params->rank_enables);\r
73 break;\r
74\r
75 case 'e':\r
76 mrc_params->ecc_enables ^= 1;\r
77 DPF(D_INFO, "Ecc enable %d\n", mrc_params->ecc_enables);\r
78 break;\r
79\r
80 case 'b':\r
81 mrc_params->scrambling_enables ^= 1;\r
82 DPF(D_INFO, "Scrambler enable %d\n", mrc_params->scrambling_enables);\r
83 break;\r
84\r
85 case 'a':\r
86 mrc_params->address_mode = (mrc_params->address_mode + 1) % 3;\r
87 DPF(D_INFO, "Adr mode %d\n", mrc_params->address_mode);\r
88 break;\r
89\r
90 case 'm':\r
91 mrc_params->menu_after_mrc ^= 1;\r
92 DPF(D_INFO, "Menu after mrc %d\n", mrc_params->menu_after_mrc);\r
93 break;\r
94\r
95 case 't':\r
96 mrc_params->tune_rcvn ^= 1;\r
97 DPF(D_INFO, "Tune to rcvn %d\n", mrc_params->tune_rcvn);\r
98 break;\r
99\r
100 case 'o':\r
101 mrc_params->rd_odt_value = (mrc_params->rd_odt_value + 1) % 4;\r
102 DPF(D_INFO, "Rd_odt_value %d\n", mrc_params->rd_odt_value);\r
103 break;\r
104\r
105 case 'd':\r
106 mrc_params->params.DENSITY = (mrc_params->params.DENSITY + 1) % 4;\r
107 DPF(D_INFO, "Dram density %d\n", mrc_params->params.DENSITY);\r
108 break;\r
109\r
110 case 'l':\r
111 DpfPrintMask ^= 0x30;\r
112 DPF(D_INFO, "Log mask %x\n", DpfPrintMask);\r
113 break;\r
114\r
115 default:\r
116 break;\r
117 }\r
118\r
119 if (ch != 'c')\r
120 goto myloop;\r
121\r
122 }\r
123#endif\r
124\r
125 // initially expect success\r
126 mrc_params->status = MRC_SUCCESS;\r
127\r
128 // todo!!! Setup board layout (must be reviewed as is selecting static timings)\r
129 // 0 == R0 (DDR3 x16), 1 == R1 (DDR3 x16), 2 == DV (DDR3 x8), 3 == SV (DDR3 x8)\r
130 if (mrc_params->dram_width == x8)\r
131 {\r
132 mrc_params->board_id = 2; // select x8 layout\r
133 }\r
134 else\r
135 {\r
136 mrc_params->board_id = 0; // select x16 layout\r
137 }\r
138\r
139 // initially no memory\r
140 mrc_params->mem_size = 0;\r
141 channel_i = 0;\r
142\r
143 // begin of channel settings\r
144 dram_width = mrc_params->dram_width;\r
145 dram_params = &mrc_params->params;\r
146 dram_cfg_index = 0;\r
147\r
148 // Determine Column & Row Bits:\r
149 // Column:\r
150 // 11 for 8Gbx8, else 10\r
151 mrc_params->column_bits[channel_i] = ((dram_params[dram_cfg_index].DENSITY == 4) && (dram_width == x8)) ? (11) : (10);\r
152\r
153 // Row:\r
154 // 512Mbx16=12 512Mbx8=13\r
155 // 1Gbx16=13 1Gbx8=14\r
156 // 2Gbx16=14 2Gbx8=15\r
157 // 4Gbx16=15 4Gbx8=16\r
158 // 8Gbx16=16 8Gbx8=16\r
159 mrc_params->row_bits[channel_i] = 12 + (dram_params[dram_cfg_index].DENSITY)\r
160 + (((dram_params[dram_cfg_index].DENSITY < 4) && (dram_width == x8)) ? (1) : (0));\r
161\r
162 // Determine Per Channel Memory Size:\r
163 // (For 2 RANKs, multiply by 2)\r
164 // (For 16 bit data bus, divide by 2)\r
165 // DENSITY WIDTH MEM_AVAILABLE\r
166 // 512Mb x16 0x008000000 ( 128MB)\r
167 // 512Mb x8 0x010000000 ( 256MB)\r
168 // 1Gb x16 0x010000000 ( 256MB)\r
169 // 1Gb x8 0x020000000 ( 512MB)\r
170 // 2Gb x16 0x020000000 ( 512MB)\r
171 // 2Gb x8 0x040000000 (1024MB)\r
172 // 4Gb x16 0x040000000 (1024MB)\r
173 // 4Gb x8 0x080000000 (2048MB)\r
174 mrc_params->channel_size[channel_i] = (1 << dram_params[dram_cfg_index].DENSITY);\r
175 mrc_params->channel_size[channel_i] *= ((dram_width == x8) ? (2) : (1));\r
176 mrc_params->channel_size[channel_i] *= (mrc_params->rank_enables == 0x3) ? (2) : (1);\r
177 mrc_params->channel_size[channel_i] *= (mrc_params->channel_width == x16) ? (1) : (2);\r
178\r
179 // Determine memory size (convert number of 64MB/512Mb units)\r
180 mrc_params->mem_size += mrc_params->channel_size[channel_i] << 26;\r
181\r
182 // end of channel settings\r
183\r
184 LEAVEFN();\r
185 return;\r
186}\r
187\r