]>
git.proxmox.com Git - mirror_edk2.git/blob - QuarkSocPkg/QuarkNorthCluster/MemoryInit/Pei/prememinit.c
1 /************************************************************************
3 * Copyright (c) 2013-2015 Intel Corporation.
5 * SPDX-License-Identifier: BSD-2-Clause-Patent
7 ************************************************************************/
10 #include "memory_options.h"
12 #include "meminit_utils.h"
13 #include "prememinit.h"
16 // Read character from serial console
19 extern uint32_t DpfPrintMask
;
21 // Adjust configuration parameters before initialisation
24 MRCParams_t
*mrc_params
)
26 const DRAMParams_t
*dram_params
;
29 uint32_t dram_cfg_index
;
40 DPF(D_INFO
, "- c - continue\n");
41 DPF(D_INFO
, "- f - boot mode [%d]\n", mrc_params
->boot_mode
);
42 DPF(D_INFO
, "- r - rank enable [%d]\n", mrc_params
->rank_enables
);
43 DPF(D_INFO
, "- e - ecc switch [%d]\n", mrc_params
->ecc_enables
);
44 DPF(D_INFO
, "- b - scrambling switch [%d]\n", mrc_params
->scrambling_enables
);
45 DPF(D_INFO
, "- a - adr mode [%d]\n", mrc_params
->address_mode
);
46 DPF(D_INFO
, "- m - menu after mrc [%d]\n", mrc_params
->menu_after_mrc
);
47 DPF(D_INFO
, "- t - tune to rcvn [%d]\n", mrc_params
->tune_rcvn
);
48 DPF(D_INFO
, "- o - odt switch [%d]\n", mrc_params
->rd_odt_value
);
49 DPF(D_INFO
, "- d - dram density [%d]\n", mrc_params
->params
.DENSITY
);
50 DPF(D_INFO
, "- p - power down disable [%d]\n", mrc_params
->power_down_disable
);
51 DPF(D_INFO
, "- l - log switch 0x%x\n", DpfPrintMask
);
57 mrc_params
->boot_mode
>>= 1;
58 if(mrc_params
->boot_mode
== bmUnknown
)
60 mrc_params
->boot_mode
= bmWarm
;
62 DPF(D_INFO
, "Boot mode %d\n", mrc_params
->boot_mode
);
66 mrc_params
->power_down_disable
^= 1;
67 DPF(D_INFO
, "Power down disable %d\n", mrc_params
->power_down_disable
);
71 mrc_params
->rank_enables
^= 2;
72 DPF(D_INFO
, "Rank enable %d\n", mrc_params
->rank_enables
);
76 mrc_params
->ecc_enables
^= 1;
77 DPF(D_INFO
, "Ecc enable %d\n", mrc_params
->ecc_enables
);
81 mrc_params
->scrambling_enables
^= 1;
82 DPF(D_INFO
, "Scrambler enable %d\n", mrc_params
->scrambling_enables
);
86 mrc_params
->address_mode
= (mrc_params
->address_mode
+ 1) % 3;
87 DPF(D_INFO
, "Adr mode %d\n", mrc_params
->address_mode
);
91 mrc_params
->menu_after_mrc
^= 1;
92 DPF(D_INFO
, "Menu after mrc %d\n", mrc_params
->menu_after_mrc
);
96 mrc_params
->tune_rcvn
^= 1;
97 DPF(D_INFO
, "Tune to rcvn %d\n", mrc_params
->tune_rcvn
);
101 mrc_params
->rd_odt_value
= (mrc_params
->rd_odt_value
+ 1) % 4;
102 DPF(D_INFO
, "Rd_odt_value %d\n", mrc_params
->rd_odt_value
);
106 mrc_params
->params
.DENSITY
= (mrc_params
->params
.DENSITY
+ 1) % 4;
107 DPF(D_INFO
, "Dram density %d\n", mrc_params
->params
.DENSITY
);
111 DpfPrintMask
^= 0x30;
112 DPF(D_INFO
, "Log mask %x\n", DpfPrintMask
);
125 // initially expect success
126 mrc_params
->status
= MRC_SUCCESS
;
128 // todo!!! Setup board layout (must be reviewed as is selecting static timings)
129 // 0 == R0 (DDR3 x16), 1 == R1 (DDR3 x16), 2 == DV (DDR3 x8), 3 == SV (DDR3 x8)
130 if (mrc_params
->dram_width
== x8
)
132 mrc_params
->board_id
= 2; // select x8 layout
136 mrc_params
->board_id
= 0; // select x16 layout
139 // initially no memory
140 mrc_params
->mem_size
= 0;
143 // begin of channel settings
144 dram_width
= mrc_params
->dram_width
;
145 dram_params
= &mrc_params
->params
;
148 // Determine Column & Row Bits:
150 // 11 for 8Gbx8, else 10
151 mrc_params
->column_bits
[channel_i
] = ((dram_params
[dram_cfg_index
].DENSITY
== 4) && (dram_width
== x8
)) ? (11) : (10);
154 // 512Mbx16=12 512Mbx8=13
155 // 1Gbx16=13 1Gbx8=14
156 // 2Gbx16=14 2Gbx8=15
157 // 4Gbx16=15 4Gbx8=16
158 // 8Gbx16=16 8Gbx8=16
159 mrc_params
->row_bits
[channel_i
] = 12 + (dram_params
[dram_cfg_index
].DENSITY
)
160 + (((dram_params
[dram_cfg_index
].DENSITY
< 4) && (dram_width
== x8
)) ? (1) : (0));
162 // Determine Per Channel Memory Size:
163 // (For 2 RANKs, multiply by 2)
164 // (For 16 bit data bus, divide by 2)
165 // DENSITY WIDTH MEM_AVAILABLE
166 // 512Mb x16 0x008000000 ( 128MB)
167 // 512Mb x8 0x010000000 ( 256MB)
168 // 1Gb x16 0x010000000 ( 256MB)
169 // 1Gb x8 0x020000000 ( 512MB)
170 // 2Gb x16 0x020000000 ( 512MB)
171 // 2Gb x8 0x040000000 (1024MB)
172 // 4Gb x16 0x040000000 (1024MB)
173 // 4Gb x8 0x080000000 (2048MB)
174 mrc_params
->channel_size
[channel_i
] = (1 << dram_params
[dram_cfg_index
].DENSITY
);
175 mrc_params
->channel_size
[channel_i
] *= ((dram_width
== x8
) ? (2) : (1));
176 mrc_params
->channel_size
[channel_i
] *= (mrc_params
->rank_enables
== 0x3) ? (2) : (1);
177 mrc_params
->channel_size
[channel_i
] *= (mrc_params
->channel_width
== x16
) ? (1) : (2);
179 // Determine memory size (convert number of 64MB/512Mb units)
180 mrc_params
->mem_size
+= mrc_params
->channel_size
[channel_i
] << 26;
182 // end of channel settings