blob: 448dfb9e059e2935b8c64752893a21411d104d9f [file] [log] [blame]
Bo Lv72d0e902023-01-02 14:27:34 +00001// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
2/*
3 * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
4 */
5
6#include <common.h>
7#include <command.h>
8#include <linux/delay.h>
9#include <cpu_func.h>
10
11#define USE_FOR_UBOOT_2018
12//#define USE_FOR_UBOOT_2015
13#define GET_CHIP_ID
14
15#ifdef USE_FOR_UBOOT_2018
16#define DISABLE_ENV
17#define USE_FOR_UBOOT_2018
18#include <amlogic/cpu_id.h>
19#endif
20#ifdef USE_FOR_UBOOT_2015
21#include <asm/cpu_id.h>
22#endif
23
24#define ENABLE_OLD_EXTRA_TEST_CMD 1
25#define ENABLE_G12_PHY_TEST_CMD 1
26
27
28uint32_t do_read_c2_ddr_bdlr_steps(void);
29
30struct ddr_base_address_table {
31 char soc_family_name[16];
32 unsigned int chip_id;
33 unsigned int preg_sticky_reg0;
34 unsigned int ddr_phy_base_address;
35 unsigned int ddr_pctl_timing_base_address;
36 unsigned int ddr_pctl_timing_end_address;
37 unsigned int ddr_dmc_sticky0;
38 unsigned int sys_watchdog_base_address;
39 unsigned int sys_watchdog_enable_value;
40 unsigned int ddr_pll_base_address;
41 unsigned int ee_timer_base_address;
42 unsigned int ee_pwm_base_address;
43 unsigned int ddr_dmc_apd_address;
44 unsigned int ddr_dmc_asr_address;
45 unsigned int ddr_boot_reason_address;
46 unsigned int ddr_dmc_lpdd4_retraining_address;
47 unsigned int ddr_dmc_refresh_ctrl_address;
48
49 unsigned int ddr_dmc_sticky0_1;
50 unsigned int ddr_phy_base_address_1;
51 unsigned int ddr_pctl_timing_base_address_1;
52 unsigned int ddr_pctl_timing_end_address_1;
53 unsigned int ddr_dmc_apd_address_1;
54 unsigned int ddr_dmc_asr_address_1;
55 unsigned int ddr_dmc_lpdd4_retraining_address_1;
56 unsigned int ddr_dmc_refresh_ctrl_address_1;
57};
58typedef struct ddr_base_address_table ddr_base_address_table_t;
59
60#define DDR_MESON_CPU_MAJOR_ID_GXBB 0x1F
61#define DDR_MESON_CPU_MAJOR_ID_GXTVBB 0x20
62#define DDR_MESON_CPU_MAJOR_ID_GXLBB 0x21
63#define DDR_MESON_CPU_MAJOR_ID_GXM 0x22
64#define DDR_MESON_CPU_MAJOR_ID_TXL 0x23
65#define DDR_MESON_CPU_MAJOR_ID_TXLX 0x24
66#define DDR_MESON_CPU_MAJOR_ID_AXG 0x25
67#define DDR_MESON_CPU_MAJOR_ID_GXLX 0x26
68#define DDR_MESON_CPU_MAJOR_ID_TXHD 0x27
69#define DDR_MESON_CPU_MAJOR_ID_G12A 0x28
70#define DDR_MESON_CPU_MAJOR_ID_G12B 0x29
71
72#define DDR_MESON_CPU_MAJOR_ID_SM1 0x2B
73
74#define DDR_MESON_CPU_MAJOR_ID_A1 0x2C
75
76#define DDR_MESON_CPU_MAJOR_ID_TL1 0x2E
77#define DDR_MESON_CPU_MAJOR_ID_TM2 0x2F
78#define DDR_MESON_CPU_MAJOR_ID_C1 0x30
79#define DDR_MESON_CPU_MAJOR_ID_SC2 0x32
80#define DDR_MESON_CPU_MAJOR_ID_C2 0x33
81#define DDR_MESON_CPU_MAJOR_ID_T5 0x34
82#define DDR_MESON_CPU_MAJOR_ID_T5D 0x35
83#define DDR_MESON_CPU_MAJOR_ID_T7 0x36
84#define DDR_MESON_CPU_MAJOR_ID_S4 0x37
85#define DDR_MESON_CPU_MAJOR_ID_T3 0x38
86#define DDR_MESON_CPU_MAJOR_ID_P1 0x39
87#define DDR_MESON_CPU_MAJOR_ID_S4D 0x3a
88#define DDR_MESON_CPU_MAJOR_ID_A5 0x3c
89#define DDR_MESON_CPU_MAJOR_ID_T5W 0x3b
90#define DDR_MESON_CPU_MAJOR_ID_C3 0x3d
91#define MESON_CPU_VERSION_LVL_MAJOR 0
92#define MESON_CPU_VERSION_LVL_MINOR 1
93#define MESON_CPU_VERSION_LVL_PACK 2
94#define MESON_CPU_VERSION_LVL_MISC 3
95#define MESON_CPU_VERSION_LVL_MAX MESON_CPU_VERSION_LVL_MISC
96
97#define CHIP_ID_MASK 0xff
98char global_chip_id[12] = { 0 };
99
100#define MESON_CPU_CHIP_ID_SIZE 12 //4 //12byte
101int ddr_get_chip_id(void)
102{
103 int soc_family_id = 0;
104
105 soc_family_id = get_cpu_id().family_id;
106 printf("\nsoc_family_id==0x%08x", soc_family_id);
107
108 unsigned char chipid[16];
109#ifdef GET_CHIP_ID
110 get_chip_id(chipid, 16);
111#endif
112 int count = 0;
113
114 for (count = 0; count < 16; count++)
115 if (count > 3)
116 global_chip_id[16 - 1 - count] = chipid[count];
117
118 return soc_family_id;
119}
120
121char CMD_VER[] = "Ver_14";
122ddr_base_address_table_t __ddr_base_address_table[] =
123{
124 //g12a
125 {
126 .soc_family_name = "G12A",
127 .chip_id = DDR_MESON_CPU_MAJOR_ID_G12A,
128 .preg_sticky_reg0 = (0xff634400 + (0x070 << 2)), //PREG_STICKY_G12A_REG0
129 .ddr_phy_base_address = 0xfe000000,
130 .ddr_pctl_timing_base_address = ((0x0000 << 2) + 0xff638400),
131 .ddr_pctl_timing_end_address = ((0x00bb << 2) + 0xff638400),
132 .ddr_dmc_sticky0 = 0xff638800,
133 .sys_watchdog_base_address = ((0x3c34 << 2) + 0xffd00000),
134 .ddr_pll_base_address = ((0x0000 << 2) + 0xff638c00),
135 .ee_timer_base_address = ((0x3c62 << 2) + 0xffd00000),
136 .ee_pwm_base_address = (0xff807000 + (0x001 << 2)),
137 .ddr_dmc_apd_address = ((0x008c << 2) + 0xff638400),
138 .ddr_dmc_asr_address = ((0x008d << 2) + 0xff638400),
139 .ddr_boot_reason_address = (0xff800000 + (0x08f << 2)), //AO_SEC_SD_CFG15
140 .ddr_dmc_lpdd4_retraining_address = ((0x0097 << 2) + 0xff638400),
141 },
142 //g12b
143 {
144 .soc_family_name = "G12B",
145 .chip_id = DDR_MESON_CPU_MAJOR_ID_G12B,
146 .preg_sticky_reg0 = (0xff634400 + (0x070 << 2)), //PREG_STICKY_G12A_REG0
147 .ddr_phy_base_address = 0xfe000000,
148 .ddr_pctl_timing_base_address = ((0x0000 << 2) + 0xff638400),
149 .ddr_pctl_timing_end_address = ((0x00bb << 2) + 0xff638400),
150 .ddr_dmc_sticky0 = 0xff638800,
151 .sys_watchdog_base_address = ((0x3c34 << 2) + 0xffd00000),
152 .ddr_pll_base_address = ((0x0000 << 2) + 0xff638c00),
153 .ee_timer_base_address = ((0x3c62 << 2) + 0xffd00000),
154 .ee_pwm_base_address = (0xff807000 + (0x001 << 2)),
155 .ddr_dmc_apd_address = ((0x008c << 2) + 0xff638400),
156 .ddr_dmc_asr_address = ((0x008d << 2) + 0xff638400),
157 .ddr_boot_reason_address = (0xff800000 + (0x08f << 2)), //AO_SEC_SD_CFG15
158 .ddr_dmc_lpdd4_retraining_address = ((0x0097 << 2) + 0xff638400),
159 },
160 //tl1
161 {
162 .soc_family_name = "TL1",
163 .chip_id = DDR_MESON_CPU_MAJOR_ID_TL1,
164 .preg_sticky_reg0 = (0xff634400 + (0x070 << 2)), //PREG_STICKY_G12A_REG0
165 .ddr_phy_base_address = 0xfe000000,
166 .ddr_pctl_timing_base_address = ((0x0000 << 2) + 0xff638400),
167 .ddr_pctl_timing_end_address = ((0x00bb << 2) + 0xff638400),
168 .ddr_dmc_sticky0 = 0xff638800,
169 .sys_watchdog_base_address = ((0x3c34 << 2) + 0xffd00000),
170 .ddr_pll_base_address = ((0x0000 << 2) + 0xff638c00),
171 .ee_timer_base_address = ((0x3c62 << 2) + 0xffd00000),
172 .ee_pwm_base_address = (0xff807000 + (0x001 << 2)),
173 .ddr_dmc_apd_address = ((0x008c << 2) + 0xff638400),
174 .ddr_dmc_asr_address = ((0x008d << 2) + 0xff638400),
175 .ddr_boot_reason_address = (0xff800000 + (0x08f << 2)), //AO_SEC_SD_CFG15
176 .ddr_dmc_lpdd4_retraining_address = ((0x0097 << 2) + 0xff638400),
177 },
178 //sm1
179 {
180 .soc_family_name = "SM1",
181 .chip_id = DDR_MESON_CPU_MAJOR_ID_SM1,
182 .preg_sticky_reg0 = (0xff634400 + (0x070 << 2)), //PREG_STICKY_G12A_REG0
183 .ddr_phy_base_address = 0xfe000000,
184 .ddr_pctl_timing_base_address = ((0x0000 << 2) + 0xff638400),
185 .ddr_pctl_timing_end_address = ((0x00bb << 2) + 0xff638400),
186 .ddr_dmc_sticky0 = 0xff638800,
187 .sys_watchdog_base_address = ((0x3c34 << 2) + 0xffd00000),
188 .ddr_pll_base_address = ((0x0000 << 2) + 0xff638c00),
189 .ee_timer_base_address = ((0x3c62 << 2) + 0xffd00000),
190 .ee_pwm_base_address = (0xff807000 + (0x001 << 2)),
191 .ddr_dmc_apd_address = ((0x008c << 2) + 0xff638400),
192 .ddr_dmc_asr_address = ((0x008d << 2) + 0xff638400),
193 .ddr_boot_reason_address = (0xff800000 + (0x08f << 2)), //AO_SEC_SD_CFG15
194 .ddr_dmc_lpdd4_retraining_address = ((0x0097 << 2) + 0xff638400),
195 },
196 //tm2
197 {
198 .soc_family_name = "TM2",
199 .chip_id = DDR_MESON_CPU_MAJOR_ID_TM2,
200 .preg_sticky_reg0 = (0xff634400 + (0x070 << 2)), //PREG_STICKY_G12A_REG0
201 .ddr_phy_base_address = 0xfe000000,
202 .ddr_pctl_timing_base_address = ((0x0000 << 2) + 0xff638400),
203 .ddr_pctl_timing_end_address = ((0x00bb << 2) + 0xff638400),
204 .ddr_dmc_sticky0 = 0xff638800,
205 .sys_watchdog_base_address = ((0x3c34 << 2) + 0xffd00000),
206 .ddr_pll_base_address = ((0x0000 << 2) + 0xff638c00),
207 .ee_timer_base_address = ((0x3c62 << 2) + 0xffd00000),
208 .ee_pwm_base_address = (0xff807000 + (0x001 << 2)),
209 .ddr_dmc_apd_address = ((0x008c << 2) + 0xff638400),
210 .ddr_dmc_asr_address = ((0x008d << 2) + 0xff638400),
211 .ddr_boot_reason_address = (0xff800000 + (0x08f << 2)), //AO_SEC_SD_CFG15
212 .ddr_dmc_lpdd4_retraining_address = ((0x0097 << 2) + 0xff638400),
213 },
214 //a1
215 {
216 .soc_family_name = "A1",
217 .chip_id = DDR_MESON_CPU_MAJOR_ID_A1,
218 .preg_sticky_reg0 = 0xfffff400, //use sram A1,((0x00b0 << 2) + 0xfe005800),//SYSCTRL_STICKY_REG0
219 .ddr_phy_base_address = 0xfc000000,
220 .ddr_pctl_timing_base_address = ((0x0000 << 2) + 0xfd020400),
221 .ddr_pctl_timing_end_address = ((0x00bb << 2) + 0xfd020400),
222 .ddr_dmc_sticky0 = 0xfd020800,
223 .ddr_dmc_apd_address = ((0x008c << 2) + 0xfd020400),
224 .ddr_dmc_asr_address = ((0x008d << 2) + 0xfd020400),
225 .sys_watchdog_base_address = 0, //((0x0040 << 2) + 0xfe000000),
226 .sys_watchdog_enable_value = 0x03c401ff,
227 .ddr_boot_reason_address = ((0x00e1 << 2) + 0xfe005800), //SYSCTRL_SEC_STICKY_REG1
228 .ee_timer_base_address = ((0x0041 << 2) + 0xfe005800),
229 },
230 //c1
231 {
232 .soc_family_name = "C1",
233 .chip_id = DDR_MESON_CPU_MAJOR_ID_C1,
234 .preg_sticky_reg0 = 0xfffff400, //use sram A1,((0x00b0 << 2) + 0xfe005800),//SYSCTRL_STICKY_REG0
235 .ddr_phy_base_address = 0xfd000000,
236 .ddr_pctl_timing_base_address = ((0x0000 << 2) + 0xfe024400),
237 .ddr_pctl_timing_end_address = ((0x00bb << 2) + 0xfe024400),
238 .ddr_dmc_sticky0 = ((0x0000 << 2) + 0xfe024800),
239 .ddr_pll_base_address = ((0x0000 << 2) + 0xfe024c00),
240 .ddr_dmc_apd_address = ((0x008c << 2) + 0xfe024400),
241 .ddr_dmc_asr_address = ((0x008d << 2) + 0xfe024400),
242 .sys_watchdog_base_address = 0, //((0x0040 << 2) + 0xfe000000),
243 .sys_watchdog_enable_value = 0x03c401ff,
244 .ddr_boot_reason_address = ((0x00e1 << 2) + 0xfe005800), //SYSCTRL_SEC_STICKY_REG1
245 .ee_timer_base_address = ((0x0041 << 2) + 0xfe005800),
246 },
247 //c2
248 {
249 .soc_family_name = "C2",
250 .chip_id = DDR_MESON_CPU_MAJOR_ID_C2,
251 .preg_sticky_reg0 = ((0x0000 << 2) + 0xfe024800), //use sram A1,((0x00b0 << 2) + 0xfe005800),//SYSCTRL_STICKY_REG0
252 .ddr_phy_base_address = 0xfd000000,
253 .ddr_pctl_timing_base_address = ((0x0000 << 2) + 0xfe024400),
254 .ddr_pctl_timing_end_address = ((0x00bb << 2) + 0xfe024400),
255 .ddr_dmc_sticky0 = ((0x0000 << 2) + 0xfe024800),
256 .ddr_pll_base_address = ((0x0000 << 2) + 0xfe024c00),
257 .ddr_dmc_apd_address = ((0x008c << 2) + 0xfe024400),
258 .ddr_dmc_asr_address = ((0x008d << 2) + 0xfe024400),
259 .sys_watchdog_base_address = 0, //((0x0040 << 2) + 0xfe000000),
260 .sys_watchdog_enable_value = 0x03c401ff,
261 .ddr_boot_reason_address = ((0x00e1 << 2) + 0xfe005800), //SYSCTRL_SEC_STICKY_REG1
262 .ddr_dmc_lpdd4_retraining_address = ((0x0097 << 2) + 0xfe024400),
263 .ddr_dmc_refresh_ctrl_address = ((0x0092 << 2) + 0xfe024400), //DMC_DRAM_REFR_CTRL
264 .ee_timer_base_address = ((0x0041 << 2) + 0xfe005800),
265 },
266 //sc2
267 {
268 .soc_family_name = "SC2",
269 .chip_id = DDR_MESON_CPU_MAJOR_ID_SC2,
270 .preg_sticky_reg0 = ((0x0000 << 2) + 0xfe036800), //
271 .ddr_phy_base_address = 0xfc000000,
272 .ddr_pctl_timing_base_address = ((0x0000 << 2) + 0xfe036400),
273 .ddr_pctl_timing_end_address = ((0x00bb << 2) + 0xfe036400),
274 .ddr_dmc_sticky0 = 0xfe036800,
275 .sys_watchdog_base_address = ((0x3c34 << 2) + 0xffd00000), //sc2 can not find
276 .ddr_pll_base_address = ((0x0000 << 2) + 0xfe036c00),
277 .ee_timer_base_address = ((0x003b << 2) + 0xfe010000), //sc2 can not find
278 .ee_pwm_base_address = ((0x0001 << 2) + 0xfe05e000), //PWMGH_PWM_B
279 .ddr_dmc_apd_address = ((0x008c << 2) + 0xfe036400),
280 .ddr_dmc_asr_address = ((0x008d << 2) + 0xfe036400),
281 //.ddr_boot_reason_address = ((0x00e1 << 2) + 0xfe010000),
282 //SYSCTRL_SEC_STICKY_REG1,20210204,0xfe010384,zhiguang confirm
283 },
284 //T5
285 {
286 .soc_family_name = "T5",
287 .chip_id = DDR_MESON_CPU_MAJOR_ID_T5,
288 .preg_sticky_reg0 = ((0x0000 << 2) + 0xff638800),
289 .ddr_phy_base_address = 0xfe000000,
290 .ddr_pctl_timing_base_address = ((0x0000 << 2) + 0xff638400),
291 .ddr_pctl_timing_end_address = ((0x00bb << 2) + 0xff638400),
292 .ddr_dmc_sticky0 = ((0x0000 << 2) + 0xff638800),
293 //AM_DDR_PLL_CNTL0
294 .ddr_pll_base_address = ((0x0000 << 2) + 0xff638c00),
295 //#define SEC_AO_RTI_STATUS_REG3
296 .ddr_boot_reason_address = (0xff800000 + (0x003 << 2)),
297 //.ddr_dmc_lpdd4_retraining_address = ((0x0097 << 2) + 0xfe024400),
298
299 .sys_watchdog_base_address = 0,
300 .sys_watchdog_enable_value = 0x03c401ff,
301 //#define P_EE_TIMER_E (volatile uint32_t *)0xffd0f188
302 .ee_timer_base_address = 0xffd0f188,
303 //AO_PWM_PWM_B
304 .ee_pwm_base_address = ((0x001 << 2) + 0xff807000),
305 .ddr_dmc_apd_address = ((0x008c << 2) + 0xff638400),
306 .ddr_dmc_asr_address = ((0x008d << 2) + 0xff638400),
307 //DMC_DRAM_REFR_CTRL ((0x0092 << 2) + 0xff638400)
308 .ddr_dmc_refresh_ctrl_address = ((0x0092 << 2) + 0xff638400),
309 },
310 //T5D
311 {
312 .soc_family_name = "T5D",
313 .chip_id = DDR_MESON_CPU_MAJOR_ID_T5D,
314 .preg_sticky_reg0 = ((0x0000 << 2) + 0xff638800),
315 .ddr_phy_base_address = 0xfe000000,
316 .ddr_pctl_timing_base_address = ((0x0000 << 2) + 0xff638400),
317 .ddr_pctl_timing_end_address = ((0x00bb << 2) + 0xff638400),
318 .ddr_dmc_sticky0 = ((0x0000 << 2) + 0xff638800),
319 //AM_DDR_PLL_CNTL0
320 .ddr_pll_base_address = ((0x0000 << 2) + 0xff638c00),
321 //#define SEC_AO_RTI_STATUS_REG3
322 .ddr_boot_reason_address = (0xff800000 + (0x003 << 2)),
323 //.ddr_dmc_lpdd4_retraining_address = ((0x0097 << 2) + 0xfe024400),
324
325 .sys_watchdog_base_address = 0,
326 .sys_watchdog_enable_value = 0x03c401ff,
327 //#define P_EE_TIMER_E (volatile uint32_t *)0xffd0f188
328 .ee_timer_base_address = 0xffd0f188,
329 //AO_PWM_PWM_B
330 .ee_pwm_base_address = ((0x001 << 2) + 0xff807000),
331 .ddr_dmc_apd_address = ((0x008c << 2) + 0xff638400),
332 .ddr_dmc_asr_address = ((0x008d << 2) + 0xff638400),
333 //DMC_DRAM_REFR_CTRL ((0x0092 << 2) + 0xff638400)
334 .ddr_dmc_refresh_ctrl_address = ((0x0092 << 2) + 0xff638400),
335 },
336 //T7
337 {
338 .soc_family_name = "T7",
339 .chip_id = DDR_MESON_CPU_MAJOR_ID_T7,
340 .preg_sticky_reg0 = ((0x0000 << 2) + 0xfe036800), //
341 .ddr_phy_base_address = 0xfc000000,
342 .ddr_pctl_timing_base_address = ((0x0000 << 2) + 0xfe036400),
343 .ddr_pctl_timing_end_address = ((0x00bb << 2) + 0xfe036400),
344 .ddr_dmc_sticky0 = ((0x200 << 2) + 0xfe036000),
345 .sys_watchdog_base_address = ((0x3c34 << 2) + 0xffd00000), //sc2 can not find
346 .ddr_pll_base_address = ((0x0000 << 2) + 0xfe036c00),
347 .ee_timer_base_address = ((0x003b << 2) + 0xfe010000), //sc2 can not find
348 .ee_pwm_base_address = ((0x0001 << 2) + 0xfe05e000), //PWMGH_PWM_B
349 .ddr_dmc_apd_address = ((0x018c << 2) + 0xfe036000),
350 .ddr_dmc_asr_address = ((0x018d << 2) + 0xfe036000),
351 //.ddr_boot_reason_address = ((0x00c1 << 2) + 0xfe010000),
352 //SYSCTRL_SEC_STATUS_REG1,20210204,0xfe010304,zhiguang confirm
353
354 .ddr_dmc_lpdd4_retraining_address = ((0x0197 << 2) + 0xfe036000),
355 .ddr_dmc_refresh_ctrl_address = ((0x0192 << 2) + 0xfe036000),
356
357 .ddr_dmc_sticky0_1 = ((0x200 << 2) + 0xfe034000),
358 .ddr_dmc_refresh_ctrl_address_1 = ((0x0192 << 2) + 0xfe036000),
359 .ddr_phy_base_address_1 = 0xfb000000,
360 .ddr_pctl_timing_base_address_1 = ((0x0000 << 2) + 0xfe034400),
361 .ddr_pctl_timing_end_address_1 = ((0x00bb << 2) + 0xfe034400),
362 .ddr_dmc_apd_address_1 = ((0x018c << 2) + 0xfe034000),
363 .ddr_dmc_asr_address_1 = ((0x018d << 2) + 0xfe034000),
364 .ddr_dmc_lpdd4_retraining_address_1 = ((0x0197 << 2) + 0xfe034000),
365 .ddr_dmc_refresh_ctrl_address_1 = ((0x0192 << 2) + 0xfe034000),
366 },
367 //S4
368 {
369 .soc_family_name = "S4",
370 .chip_id = DDR_MESON_CPU_MAJOR_ID_S4,
371 .preg_sticky_reg0 = ((0x0000 << 2) + 0xfe036800),
372 .ddr_phy_base_address = 0xfc000000,
373 .ddr_pctl_timing_base_address = ((0x0000 << 2) + 0xfe036400), //DMC_DRAM_TRFC
374 .ddr_pctl_timing_end_address = ((0x00bb << 2) + 0xfe036400), //DMC_DRAM_DFI
375 .ddr_dmc_sticky0 = ((0x0000 << 2) + 0xfe036800),
376 .ddr_pll_base_address = ((0x0000 << 2) + 0xfe036c00), //AM_DDR_PLL_CNTL0//
377 //.ddr_boot_reason_address = ((0x00e1 << 2) + 0xfe010000),
378 //SYSCTRL_SEC_STICKY_REG1,20210204,0xfe010384,zhiguang confirm
379 //.ddr_dmc_lpdd4_retraining_address = ((0x0097 << 2) + 0xfe024400),
380
381 .sys_watchdog_base_address = 0,
382 .sys_watchdog_enable_value = 0x03c401ff,
383 .ee_timer_base_address = ((0x003b << 2) + 0xfe010000), //SYSCTRL_TIMERE ((0x003b << 2) + 0xfe010000)
384 .ee_pwm_base_address = ((0x001 << 2) + 0xff807000), //AO_PWM_PWM_B
385 .ddr_dmc_apd_address = ((0x008c << 2) + 0xfe036400), //DMC_DRAM_APD_CTRL
386 .ddr_dmc_asr_address = ((0x008d << 2) + 0xfe036400), //DMC_DRAM_ASR_CTRL
387 .ddr_dmc_refresh_ctrl_address = ((0x0092 << 2) + 0xfe036400), // DMC_DRAM_REFR_CTRL ((0x0092 << 2) + 0xff638400)
388 },
389 //T3
390 {
391 .soc_family_name = "T3",
392 .chip_id = DDR_MESON_CPU_MAJOR_ID_T3,
393 .preg_sticky_reg0 = ((0x0000 << 2) + 0xfe036800),
394 .ddr_phy_base_address = 0xfc000000,
395 .ddr_pctl_timing_base_address = ((0x0000 << 2) + 0xfe036400), //DMC_DRAM_TRFC
396 .ddr_pctl_timing_end_address = ((0x00bb << 2) + 0xfe036400), //DMC_DRAM_DFI
397 .ddr_dmc_sticky0 = ((0x0000 << 2) + 0xfe036800),
398 .ddr_pll_base_address = ((0x0000 << 2) + 0xfe0a0000), //AM_DDR_PLL_CNTL0//
399 //.ddr_boot_reason_address = ((0x00e1 << 2) + 0xfe010000),
400 //SYSCTRL_SEC_STICKY_REG1,20210204,0xfe010384,zhiguang confirm
401 //.ddr_dmc_lpdd4_retraining_address = ((0x0097 << 2) + 0xfe024400),
402
403 .sys_watchdog_base_address = 0,
404 .sys_watchdog_enable_value = 0x03c401ff,
405 .ee_timer_base_address = ((0x003b << 2) + 0xfe010000), //SYSCTRL_TIMERE ((0x003b << 2) + 0xfe010000)
406 .ee_pwm_base_address = ((0x001 << 2) + 0xff807000), //AO_PWM_PWM_B
407 .ddr_dmc_apd_address = ((0x008c << 2) + 0xfe036400), //DMC_DRAM_APD_CTRL
408 .ddr_dmc_asr_address = ((0x008d << 2) + 0xfe036400), //DMC_DRAM_ASR_CTRL
409 .ddr_dmc_refresh_ctrl_address = ((0x0092 << 2) + 0xfe036400), // DMC_DRAM_REFR_CTRL ((0x0092 << 2) + 0xff638400)
410
411 .ddr_dmc_sticky0_1 = ((0x200 << 2) + 0xfe034000),
412 .ddr_dmc_refresh_ctrl_address_1 = ((0x0192 << 2) + 0xfe036000),
413 .ddr_phy_base_address_1 = 0xfb000000,
414 .ddr_pctl_timing_base_address_1 = ((0x0000 << 2) + 0xfe034400),
415 .ddr_pctl_timing_end_address_1 = ((0x00bb << 2) + 0xfe034400),
416 .ddr_dmc_apd_address_1 = ((0x018c << 2) + 0xfe034000),
417 .ddr_dmc_asr_address_1 = ((0x018d << 2) + 0xfe034000),
418 .ddr_dmc_lpdd4_retraining_address_1 = ((0x0197 << 2) + 0xfe034000),
419 .ddr_dmc_refresh_ctrl_address_1 = ((0x0192 << 2) + 0xfe034000),
420 },
421 //P1
422 {
423 .soc_family_name = "P1",
424 .chip_id = MESON_CPU_MAJOR_ID_P1,
425 .preg_sticky_reg0 = ((0x0000 << 2) + 0xfe036800),
426 .ddr_phy_base_address = 0xfc000000,
427 .ddr_pctl_timing_base_address = ((0x0000 << 2) + 0xfe036400), //DMC_DRAM_TRFC
428 .ddr_pctl_timing_end_address = ((0x00bb << 2) + 0xfe036400), //DMC_DRAM_DFI
429 .ddr_dmc_sticky0 = ((0x0000 << 2) + 0xfe036800),
430 .ddr_pll_base_address = ((0x0000 << 2) + 0xfe0a0000), //AM_DDR_PLL_CNTL0//
431 //.ddr_boot_reason_address = ((0x00e1 << 2) + 0xfe010000), //SYSCTRL_SEC_STICKY_REG1,20210204,0xfe010384, confirm
432 //.ddr_dmc_lpdd4_retraining_address = ((0x0097 << 2) + 0xfe024400),
433
434 .sys_watchdog_base_address = 0,
435 .sys_watchdog_enable_value = 0x03c401ff,
436 .ee_timer_base_address = ((0x003b << 2) + 0xfe010000), //SYSCTRL_TIMERE ((0x003b << 2) + 0xfe010000)
437 .ee_pwm_base_address = ((0x001 << 2) + 0xff807000), //AO_PWM_PWM_B
438 .ddr_dmc_apd_address = ((0x008c << 2) + 0xfe036400), //DMC_DRAM_APD_CTRL
439 .ddr_dmc_asr_address = ((0x008d << 2) + 0xfe036400), //DMC_DRAM_ASR_CTRL
440 .ddr_dmc_refresh_ctrl_address = ((0x0092 << 2) + 0xfe036400), // DMC_DRAM_REFR_CTRL ((0x0092 << 2) + 0xff638400)
441
442 .ddr_dmc_sticky0_1 = ((0x200 << 2) + 0xfe034000),
443 .ddr_dmc_refresh_ctrl_address_1 = ((0x0192 << 2) + 0xfe036000),
444 .ddr_phy_base_address_1 = 0xfb000000,
445 .ddr_pctl_timing_base_address_1 = ((0x0000 << 2) + 0xfe034400),
446 .ddr_pctl_timing_end_address_1 = ((0x00bb << 2) + 0xfe034400),
447 .ddr_dmc_apd_address_1 = ((0x018c << 2) + 0xfe034000),
448 .ddr_dmc_asr_address_1 = ((0x018d << 2) + 0xfe034000),
449 .ddr_dmc_lpdd4_retraining_address_1 = ((0x0197 << 2) + 0xfe034000),
450 .ddr_dmc_refresh_ctrl_address_1 = ((0x0192 << 2) + 0xfe034000),
451 },
452 // force id use id mask
453 {
454 .soc_family_name = "UNKNOWN",
455 .chip_id = CHIP_ID_MASK,
456 .preg_sticky_reg0 = (0xff634400 + (0x070 << 2)), //PREG_STICKY_G12A_REG0
457 .ddr_phy_base_address = 0xfe000000,
458 .ddr_pctl_timing_base_address = ((0x0000 << 2) + 0xff638400),
459 .ddr_pctl_timing_end_address = ((0x00bb << 2) + 0xff638400),
460 .ddr_dmc_sticky0 = 0xff638800,
461 .sys_watchdog_base_address = ((0x3c34 << 2) + 0xffd00000),
462 .ddr_pll_base_address = ((0x0000 << 2) + 0xff638c00),
463 .ee_timer_base_address = ((0x3c62 << 2) + 0xffd00000),
464 .ee_pwm_base_address = (0xff807000 + (0x001 << 2)),
465 .ddr_dmc_apd_address = ((0x008c << 2) + 0xff638400),
466 .ddr_dmc_asr_address = ((0x008d << 2) + 0xff638400),
467 .ddr_boot_reason_address = (0xff800000 + (0x08f << 2)), //AO_SEC_SD_CFG15
468 .ddr_dmc_lpdd4_retraining_address = ((0x0097 << 2) + 0xff638400),
469 },
470};
471
472ddr_base_address_table_t *p_ddr_base = { 0 };
473unsigned int phy_base_add[2] = { 0, 0, };
474unsigned int ddr_dmc_sticky[2] = { 0, 0, };
475unsigned int ddr_dmc_apd_address[2] = { 0, 0, };
476unsigned int ddr_dmc_asr_address[2] = { 0, 0, };
477unsigned int dmc_retraining_ctrl_address[2] = { 0, 0, };
478unsigned int dmc_ddr_config_channel_id = 0;
479//#ifdef CONFIG_ENV_IS_NOWHERE
480#ifdef DISABLE_ENV
481int setenv(const char *varname, const char *varvalue)
482{
483 return 1;
484}
485
486char *getenv(const char *name)
487{
488 return NULL;
489}
490
491#endif
492
493#define DWC_AC_PINMUX_TOTAL 28
494#define DWC_DFI_PINMUX_TOTAL 26
495
496#define DDR_STICKY_MAGIC_NUMBER 0x20180000
497#define DDR_CHIP_ID 0x30
498#define DDR_STICKY_SOURCE_DMC_STICKY 0x1
499#define DDR_STICKY_SOURCE_SRAM 0x2
500
501#define DDR_STICKY_OVERRIDE_CONFIG_MESSAGE_CMD 0x1 //override config
502#define DDR_STICKY_SPECIAL_FUNCTION_CMD 0x2 //special test such as shift some bdlr or parameter or interleave test
503
504#define DDR_INIT_CONFIG_STICKY_MESSAGE_SRAM_ADDRESS 0x00040000
505#define DDR_INIT_CONFIG_GLOBAL_MESSAGE_SRAM_ADDRESS 0x00050000
506#define CONFIG_DDR_TYPE_DDR3 0
507#define CONFIG_DDR_TYPE_DDR4 1
508#define CONFIG_DDR_TYPE_LPDDR4 2
509#define CONFIG_DDR_TYPE_LPDDR3 3
510#define CONFIG_DDR_TYPE_LPDDR2 4
511#define CONFIG_DDR_TYPE_AUTO 0xf
512#define CONFIG_DDR_TYPE_AUTO_LIMIT CONFIG_DDR_TYPE_DDR4
513
514#define CONFIG_DDR0_16BIT_CH0 0x1
515#define CONFIG_DDR0_16BIT_RANK01_CH0 0x4
516#define CONFIG_DDR0_32BIT_RANK0_CH0 0x2
517#define CONFIG_DDR0_32BIT_RANK01_CH01 0x3
518#define CONFIG_DDR0_32BIT_16BIT_RANK0_CH0 0x5
519#define CONFIG_DDR0_32BIT_16BIT_RANK01_CH0 0x6
520#define CONFIG_DDR0_32BIT_RANK01_CH0 0x7
521#define CONFIG_DDR0_32BIT_RANK0_CH01 0x8
522#define DDR_PRINT_DISABLE 0
523#define DDR_PRINT_ENABLE 1
524
525typedef struct board_common_setting {
526 unsigned int timming_magic;
527 unsigned short timming_max_valid_configs;
528 unsigned short timming_struct_version;
529 unsigned short timming_struct_org_size;
530 unsigned short timming_struct_real_size;
531 unsigned char fast_boot[4]; // 0 fastboot enable 1 window test margin 2 auto offset after window test 3 auto window test enable
532 unsigned int ddr_func;
533 unsigned char board_id;
534 unsigned char DramType;
535 unsigned char dram_rank_config;
536 unsigned char DisabledDbyte;
537 unsigned int dram_cs0_base_add;
538 unsigned int dram_cs1_base_add;
539 unsigned short dram_cs0_size_MB; //dram_ch0_size_MB T3
540 unsigned short dram_cs1_size_MB; //dram_ch1_size_MB T3
541 unsigned char dram_x4x8x16_mode;
542 unsigned char Is2Ttiming;
543 unsigned char log_level;
544 unsigned char ddr_rdbi_wr_enable;
545 unsigned int pll_ssc_mode;
546 unsigned short org_tdqs2dq;
547 unsigned char reserve1_test_function[2];
548 unsigned int ddr_dmc_remap[5];
549 unsigned char ac_pinmux[35];
550 unsigned char ddr_dqs_swap;
551 unsigned char ddr_dq_remap[36];
552 unsigned int ddr_vddee_setting[4]; //add,default-value,default-voltage,step
553}__attribute__ ((packed)) board_common_setting_t;
554
555typedef struct board_SI_setting_ps {
556 unsigned short DRAMFreq;
557 unsigned char PllBypassEn;
558 unsigned char training_SequenceCtrl;
559 unsigned short ddr_odt_config;
560 unsigned char clk_drv_ohm;
561 unsigned char cs_drv_ohm;
562 unsigned char ac_drv_ohm;
563 unsigned char soc_data_drv_ohm_p;
564 unsigned char soc_data_drv_ohm_n;
565 unsigned char soc_data_odt_ohm_p;
566 unsigned char soc_data_odt_ohm_n;
567 unsigned char dram_data_drv_ohm;
568 unsigned char dram_data_odt_ohm;
569 unsigned char dram_data_wr_odt_ohm;
570 unsigned char dram_ac_odt_ohm;
571 unsigned char dram_data_drv_pull_up_calibration_ohm;
572 unsigned char lpddr4_dram_vout_voltage_range_setting;
573 unsigned char dfe_offset;
574 unsigned short vref_ac_permil; //phy
575 unsigned short vref_soc_data_permil; //soc
576 unsigned short vref_dram_data_permil;
577 unsigned short max_core_timmming_frequency;
578 unsigned short training_phase_parameter[2];
579 unsigned short ac_trace_delay_org[36];
580}__attribute__ ((packed)) board_SI_setting_ps_t;
581
582typedef struct board_phase_setting_ps {
583 unsigned short ac_trace_delay[36];
584 unsigned short write_dqs_delay[8];
585 unsigned short write_dq_bit_delay[72];
586 unsigned short read_dqs_gate_delay[8];
587 unsigned char read_dqs_delay[8];
588 unsigned char read_dq_bit_delay[72];
589 unsigned char soc_bit_vref[44];
590 unsigned char dram_bit_vref[36];
591 unsigned char reserve_training_parameter[16]; //0-7 write dqs offset,8-15 read dqs offset,MSB bit 7 use 0 mean right offset
592 unsigned char soc_bit_vref_dac1[44];
593}__attribute__ ((packed)) board_phase_setting_ps_t;
594
595typedef struct ddr_set_c2 {
596 board_common_setting_t cfg_board_common_setting;
597 board_SI_setting_ps_t cfg_board_SI_setting_ps[2];
598 board_phase_setting_ps_t cfg_ddr_training_delay_ps[2];
599}__attribute__ ((packed)) ddr_set_t_c2;
600
601static uint32_t ddr_rd_8_16bit_on_32reg(uint32_t base_addr, uint32_t size, uint32_t offset_index)
602{
603 uint32_t read_value = 0;
604 uint32_t addr_t = 0;
605 uint32_t offset = 0;
606
607 if (size == 8) {
608 offset = ((offset_index % 4) << 3);
609 addr_t = (base_addr + ((offset_index >> 2) << 2));
610 read_value = (*(volatile uint32_t *)((unsigned long)(addr_t)));
611 read_value = (read_value >> offset) & 0xff;
612 }
613 if (size == 16) {
614 offset = ((offset_index % 2) << 4);
615 addr_t = (base_addr + ((offset_index >> 1) << 2));
616 read_value = (*(volatile uint32_t *)((unsigned long)(addr_t)));
617 read_value = (read_value >> offset) & 0xffff;
618 }
619 return read_value;
620}
621
622static uint32_t ddr_wr_8_16bit_on_32reg(uint32_t base_addr, uint32_t size, uint32_t offset_index, uint32_t value)
623{
624 uint32_t read_value = 0;
625 uint32_t write_value = 0;
626 uint32_t addr_t = 0;
627 uint32_t offset = 0;
628
629 if (size == 8) {
630 offset = ((offset_index % 4) << 3);
631 addr_t = (base_addr + ((offset_index >> 2) << 2));
632 read_value = (*(volatile uint32_t *)((unsigned long)(addr_t)));
633 write_value = (value << offset) | (read_value & (~(0xff << offset)));
634 }
635 if (size == 16) {
636 offset = ((offset_index % 2) << 4);
637 addr_t = (base_addr + ((offset_index >> 1) << 2));
638 read_value = (*(volatile uint32_t *)((unsigned long)(addr_t)));
639 write_value = (value << offset) | (read_value & (~(0xffff << offset)));
640 }
641 *(volatile uint32_t *)((unsigned long)(addr_t)) = write_value;
642 return write_value;
643}
644
645uint32_t ddr_min(uint32_t a, uint32_t b)
646{
647 uint32_t min = a;
648
649 if (a < b)
650 min = a;
651 else
652 min = b;
653 return min;
654}
655
656uint32_t ddr_max(uint32_t a, uint32_t b)
657{
658 uint32_t max = a;
659
660 if (a < b)
661 max = b;
662 else
663 max = a;
664 return max;
665}
666
667typedef struct training_delay_set_ps {
668 unsigned char ac_trace_delay[10];
669 unsigned char ac_trace_delay_rev[2];
670 unsigned char read_dqs_delay[16];
671 unsigned char read_dq_bit_delay[72];
672 unsigned short write_dqs_delay[16];
673 unsigned short write_dq_bit_delay[72];
674 unsigned short read_dqs_gate_delay[16];
675 unsigned char soc_bit_vref[36];
676 unsigned char dram_bit_vref[32];
677 unsigned char rever1; //read_dqs read_dq,write_dqs, write_dq
678 unsigned char dfi_mrl;
679 unsigned char dfi_hwtmrl;
680 unsigned char ARdPtrInitVal;
681 unsigned short csr_vrefinglobal;
682 unsigned short csr_dqsrcvcntrl[4];
683 unsigned short csr_pptdqscntinvtrntg0[4];
684 unsigned short csr_pptdqscntinvtrntg1[4];
685 unsigned short csr_seq0bgpr[9];
686 unsigned short csr_dllgainctl;
687 unsigned short csr_dlllockpara;
688}__attribute__ ((packed)) training_delay_set_ps_t;
689
690typedef struct ddr_phy_common_extra_set {
691 unsigned short csr_pllctrl3;
692 unsigned short csr_pptctlstatic[4];
693 unsigned short csr_trainingincdecdtsmen[4];
694 unsigned short csr_tsmbyte0[4];
695 unsigned short csr_hwtcamode;
696 unsigned short csr_hwtlpcsena;
697 unsigned short csr_hwtlpcsenb;
698 unsigned short csr_acsmctrl13;
699 unsigned short csr_acsmctrl23;
700 unsigned char csr_soc_vref_dac1_dfe[36];
701}__attribute__ ((packed)) ddr_phy_common_extra_set_t;
702
703typedef struct retraining_set {
704 unsigned short csr_pllctrl3;
705 unsigned short csr_pptctlstatic[4];
706 unsigned short csr_trainingincdecdtsmen[4];
707 unsigned short csr_tsmbyte0[4];
708 unsigned short csr_vrefinglobal;
709 unsigned short csr_dqsrcvcntrl[4];
710 unsigned short csr_pptdqscntinvtrntg0[4];
711 unsigned short csr_pptdqscntinvtrntg1[4];
712 unsigned short csr_seq0bgpr[9];
713 unsigned short csr_dllgainctl;
714 unsigned short csr_dlllockpara;
715 unsigned short csr_hwtcamode;
716 unsigned short csr_hwtlpcsena;
717 unsigned short csr_hwtlpcsenb;
718 unsigned short csr_acsmctrl13;
719 unsigned short csr_acsmctrl23;
720 unsigned char csr_soc_vref_dac1_dfe[36];
721}retraining_set_t;
722
723typedef struct ddr_set {
724 unsigned int magic;
725 unsigned char fast_boot[4]; // 0 fastboot enable 1 window test margin 2 auto offset after window test 3 auto window test
726 unsigned int ddr_func;
727 unsigned char board_id;
728 //board id reserve,,do not modify
729 unsigned char version;
730 // firmware reserve version,,do not modify
731 unsigned char DramType;
732 //support DramType should confirm with amlogic
733 //#define CONFIG_DDR_TYPE_DDR3 0
734 //#define CONFIG_DDR_TYPE_DDR4 1
735 //#define CONFIG_DDR_TYPE_LPDDR4 2
736 //#define CONFIG_DDR_TYPE_LPDDR3 3
737 //#define CONFIG_DDR_TYPE_LPDDR2 4
738 unsigned char DisabledDbyte;
739 //use for dram bus 16bit or 32bit,if use 16bit mode ,should disable bit 2,3
740 //bit 0 ---use byte 0 ,1 disable byte 0,
741 //bit 1 ---use byte 1 ,1 disable byte 1,
742 //bit 2 ---use byte 2 ,1 disable byte 2,
743 //bit 3 ---use byte 3 ,1 disable byte 3,
744 unsigned char Is2Ttiming;
745 //ddr3/ddr3 use 2t timing,now only support 2t timming
746 unsigned char HdtCtrl;
747 //training information control,do not modify
748 unsigned char dram_rank_config;
749 //support Dram connection type should confirm with amlogic
750 //#define CONFIG_DDR0_16BIT_CH0 0x1 //dram total bus width 16bit only use cs0
751 //#define CONFIG_DDR0_16BIT_RANK01_CH0 0x4 //dram total bus width 16bit use cs0 cs1
752 //#define CONFIG_DDR0_32BIT_RANK0_CH0 0x2 //dram total bus width 32bit use cs0
753 //#define CONFIG_DDR0_32BIT_RANK01_CH01 0x3
754 //only for lpddr4,dram total bus width 32bit use channel a cs0 cs1 channel b cs0 cs1
755 //#define CONFIG_DDR0_32BIT_16BIT_RANK0_CH0 0x5 //dram total bus width 32bit only use cs0,but high address use 16bit mode
756 //#define CONFIG_DDR0_32BIT_16BIT_RANK01_CH0 0x6 //dram total bus width 32bit use cs0 cs1,but cs1 use 16bit mode ,current phy not support reserve
757 //#define CONFIG_DDR0_32BIT_RANK01_CH0 0x7 //dram total bus width 32bit use cs0 cs1
758 //#define CONFIG_DDR0_32BIT_RANK0_CH01 0x8
759 //only for lpddr4,dram total bus width 32bit use channel a cs0 channel b cs0
760
761 /* rsv_char0. update for diagnose type define */
762 unsigned char diagnose;
763
764 unsigned short soc_data_drv_ohm_ps1;
765 unsigned short dram_data_drv_ohm_ps1;
766 unsigned short soc_data_odt_ohm_ps1;
767 unsigned short dram_data_odt_ohm_ps1;
768 unsigned short dram_data_wr_odt_ohm_ps1;
769 //system reserve,do not modify
770 unsigned short dmem_load_size;
771 //system reserve,do not modify
772 unsigned int ddr_base_addr;
773 //system reserve,do not modify
774 unsigned int ddr_start_offset;
775 //system reserve,do not modify
776
777 unsigned short dram_cs0_size_MB;
778 //config cs0 dram size ,like 1G DRAM ,setting 1024
779 unsigned short dram_cs1_size_MB;
780 //config cs1 dram size,like 512M DRAM ,setting 512
781 /* align8 */
782
783 unsigned short training_SequenceCtrl[2];
784 //system reserve,do not modify
785 unsigned char phy_odt_config_rank[2];
786 //unsigned char rever1;
787 //unsigned char rever2;
788 unsigned short rank1_ca_vref_permil;
789 //training odt config ,only use for training
790 // [0]Odt pattern for accesses targeting rank 0. [3:0] is used for write ODT [7:4] is used for read ODT
791 // [1]Odt pattern for accesses targeting rank 1. [3:0] is used for write ODT [7:4] is used for read ODT
792 unsigned int dfi_odt_config;
793//normal go status od config,use for normal status
794//bit 12. rank1 ODT default. default value for ODT[1] pins if there's no read/write activity.
795//bit 11. rank1 ODT write sel. enable ODT[1] if there's write occurred in rank1.
796//bit 10. rank1 ODT write nsel. enable ODT[1] if there's write occurred in rank0.
797//bit 9. rank1 odt read sel. enable ODT[1] if there's read occurred in rank1.
798//bit 8. rank1 odt read nsel. enable ODT[1] if there's read occurred in rank0.
799//bit 4. rank0 ODT default. default value for ODT[0] pins if there's no read/write activity.
800//bit 3. rank0 ODT write sel. enable ODT[0] if there's write occurred in rank0.
801//bit 2. rank0 ODT write nsel. enable ODT[0] if there's write occurred in rank1.
802//bit 1. rank0 odt read sel. enable ODT[0] if there's read occurred in rank0.
803//bit 0. rank0 odt read nsel. enable ODT[0] if there's read occurred in rank1.
804 unsigned short DRAMFreq[4];
805 //config dram frequency,use DRAMFreq[0],other reserve
806 unsigned char PllBypassEn;
807 //system reserve,do not modify
808 unsigned char ddr_rdbi_wr_enable;
809 //system reserve,do not modify
810 unsigned char ddr_rfc_type;
811 //config dram rfc type,according dram type,also can use same dram type max config
812 //#define DDR_RFC_TYPE_DDR3_512Mbx1 0
813 //#define DDR_RFC_TYPE_DDR3_512Mbx2 1
814 //#define DDR_RFC_TYPE_DDR3_512Mbx4 2
815 //#define DDR_RFC_TYPE_DDR3_512Mbx8 3
816 //#define DDR_RFC_TYPE_DDR3_512Mbx16 4
817 //#define DDR_RFC_TYPE_DDR4_2Gbx1 5
818 //#define DDR_RFC_TYPE_DDR4_2Gbx2 6
819 //#define DDR_RFC_TYPE_DDR4_2Gbx4 7
820 //#define DDR_RFC_TYPE_DDR4_2Gbx8 8
821 //#define DDR_RFC_TYPE_LPDDR4_2Gbx1 9
822 //#define DDR_RFC_TYPE_LPDDR4_3Gbx1 10
823 //#define DDR_RFC_TYPE_LPDDR4_4Gbx1 11
824 unsigned char enable_lpddr4x_mode;
825 //system reserve,do not modify
826 /* align8 */
827
828 unsigned int pll_ssc_mode;
829 /* pll ssc config:
830 *
831 * pll_ssc_mode = (1<<20) | (1<<8) | ([strength] << 4) | [mode],
832 * ppm = strength * 500
833 * mode: 0=center, 1=up, 2=down
834 *
835 * eg:
836 * 1. config 1000ppm center ss. then mode=0, strength=2
837 * .pll_ssc_mode = (1<<20) | (1<<8) | (2 << 4) | 0,
838 * 2. config 3000ppm down ss. then mode=2, strength=6
839 * .pll_ssc_mode = (1<<20) | (1<<8) | (6 << 4) | 2,
840 */
841 unsigned short clk_drv_ohm;
842 //config soc clk pin signal driver strength ,select 20,30,40,60ohm
843 unsigned short cs_drv_ohm;
844 //config soc cs0 cs1 pin signal driver strength ,select 20,30,40,60ohm
845 unsigned short ac_drv_ohm;
846 //config soc normal address command pin driver strength ,select 20,30,40,60ohm
847 unsigned short soc_data_drv_ohm_p;
848 //config soc data pin pull up driver strength,select 0,28,30,32,34,37,40,43,48,53,60,68,80,96,120ohm
849 unsigned short soc_data_drv_ohm_n;
850 //config soc data pin pull down driver strength,select 0,28,30,32,34,37,40,43,48,53,60,68,80,96,120ohm
851 unsigned short soc_data_odt_ohm_p;
852 //config soc data pin odt pull up strength,select 0,28,30,32,34,37,40,43,48,53,60,68,80,96,120ohm
853 unsigned short soc_data_odt_ohm_n;
854 //config soc data pin odt pull down strength,select 0,28,30,32,34,37,40,43,48,53,60,68,80,96,120ohm
855 unsigned short dram_data_drv_ohm;
856 //config dram data pin pull up pull down driver strength,ddr3 select 34,40ohm,ddr4 select 34,48ohm,lpddr4 select 40,48,60,80,120,240ohm
857 unsigned short dram_data_odt_ohm;
858 //config dram data pin odt pull up down strength,ddr3 select 40,60,120ohm,ddr4 select 34,40,48,60,120,240ohm,lpddr4 select 40,48,60,80,120,240ohm
859 unsigned short dram_ac_odt_ohm;
860 //config dram ac pin odt pull up down strength,use for lpddr4, select 40,48,60,80,120,240ohm
861 unsigned short soc_clk_slew_rate;
862 //system reserve,do not modify
863 unsigned short soc_cs_slew_rate;
864 //system reserve,do not modify
865 unsigned short soc_ac_slew_rate;
866 //system reserve,do not modify
867 unsigned short soc_data_slew_rate;
868 //system reserve,do not modify
869 unsigned short vref_output_permil; //phy
870 //setting same with vref_dram_permil
871 unsigned short vref_receiver_permil; //soc
872 //soc init SOC receiver vref ,config like 500 means 0.5VDDQ,take care ,please follow SI
873 unsigned short vref_dram_permil;
874 //soc init DRAM receiver vref ,config like 500 means 0.5VDDQ,take care ,please follow SI
875 unsigned short max_core_timmming_frequency;
876 //use for limited ddr speed core timmming parameter,for some old dram maybe have no over speed register
877 /* align8 */
878
879 unsigned char ac_trace_delay[10];
880 unsigned char lpddr4_dram_vout_voltage_1_3_2_5_setting;
881 unsigned char lpddr4_x8_mode;
882 unsigned char slt_test_function[2]; //[0] slt test function enable,bit 0 enable 4 frequency scan,bit 1 enable force delay line offset ,bit 7 enable skip training function
883 //[1],slt test parameter ,use for force delay line offset
884 //system reserve,do not modify
885 unsigned short tdqs2dq;
886 unsigned char dram_data_wr_odt_ohm;
887 unsigned char bitTimeControl_2d;
888 //system reserve,do not modify
889 /* align8 */
890 unsigned char char_rev1;
891 unsigned char char_rev2;
892 unsigned int ddr_dmc_remap[5];
893 unsigned int dram_rtt_nom_wr_park[2];
894 //system reserve,do not modify
895 /* align8 */
896 unsigned char ddr_lpddr34_ca_remap[4];
897 ////use for lpddr3 /lpddr4 ca training data byte lane remap
898 unsigned char ddr_lpddr34_dq_remap[32];
899 ////use for lpddr3 /lpddr4 ca pinmux remap
900 unsigned char ac_pinmux[DWC_AC_PINMUX_TOTAL];
901 //use for lpddr3 /lpddr4 ca pinmux remap
902 unsigned char dfi_pinmux[DWC_DFI_PINMUX_TOTAL];
903 unsigned char char_rev3;
904 unsigned char char_rev4;
905 ddr_phy_common_extra_set_t cfg_ddr_phy_common_extra_set_t;
906 training_delay_set_ps_t cfg_ddr_training_delay_ps[2];
907}ddr_set_t;
908
909ddr_set_t p_ddr_set_t;
910
911
912typedef struct ddr_set_t7 {
913 unsigned int magic;
914 unsigned char fast_boot[4]; // 0 fastboot enable 1 window test margin 2 auto offset after window test 3 auto window test
915 //unsigned int rsv_int0;
916 unsigned int ddr_func;
917 unsigned char board_id;
918 //board id reserve,,do not modify
919 unsigned char version;
920 // firmware reserve version,,do not modify
921 unsigned char DramType;
922 //support DramType should confirm with amlogic
923 //#define CONFIG_DDR_TYPE_DDR3 0
924 //#define CONFIG_DDR_TYPE_DDR4 1
925 //#define CONFIG_DDR_TYPE_LPDDR4 2
926 //#define CONFIG_DDR_TYPE_LPDDR3 3
927 //#define CONFIG_DDR_TYPE_LPDDR2 4
928 //#define CONFIG_DDR_TYPE_LPDDR4x 5
929 unsigned char DisabledDbyte[2]; //ch0 and ch1
930 //use for dram bus 16bit or 32bit,if use 16bit mode ,should disable bit 2,3
931 //bit 0 ---cs0 use byte 0 ,1 disable byte 0,
932 //bit 1 ---cs0 use byte 1 ,1 disable byte 1,
933 //bit 2 ---cs0 use byte 2 ,1 disable byte 2,
934 //bit 3 ---cs0 use byte 3 ,1 disable byte 3,
935 //bit 4 ---cs1 use byte 0 ,1 disable byte 0,
936 //bit 5 ---cs1 use byte 1 ,1 disable byte 1,
937 //bit 6 ---cs1 use byte 2 ,1 disable byte 2,
938 //bit 7 ---cs1 use byte 3 ,1 disable byte 3,
939 unsigned char Is2Ttiming;
940 //ddr3/ddr3 use 2t timing,now only support 2t timming
941 unsigned char HdtCtrl;
942 //training information control,do not modify
943 unsigned char dram_rank_config;
944 //support Dram connection type should confirm with amlogic
945 //#define CONFIG_DDR0_16BIT_CH0 0x1 //dram total bus width 16bit only use cs0
946 //#define CONFIG_DDR0_16BIT_RANK01_CH0 0x4 //dram total bus width 16bit use cs0 cs1
947 //#define CONFIG_DDR0_32BIT_RANK0_CH0 0x2 //dram total bus width 32bit use cs0
948 //only for lpddr4,dram total bus width 32bit use channel a cs0 cs1 channel b cs0 cs1
949 //#define CONFIG_DDR0_32BIT_RANK01_CH01 0x3
950 //dram total bus width 32bit only use cs0,but high address use 16bit mode
951 //#define CONFIG_DDR0_32BIT_16BIT_RANK0_CH0 0x5
952 //dram total bus width 32bit use cs0 cs1,
953 //but cs1 use 16bit mode ,current phy not support reserve
954 //#define CONFIG_DDR0_32BIT_16BIT_RANK01_CH0 0x6
955 //dram total bus width 32bit use cs0 cs1
956 //#define CONFIG_DDR0_32BIT_RANK01_CH0 0x7
957 //only for lpddr4,dram total bus width 32bit use channel a cs0 channel b cs0
958 //#define CONFIG_DDR0_32BIT_RANK0_CH01 0x8
959
960 /* rsv_char0. update for diagnose type define */
961 //unsigned char diagnose;
962
963 unsigned short soc_data_drv_ohm_ps1;
964 unsigned short dram_data_drv_ohm_ps1;
965 unsigned short soc_data_odt_ohm_ps1;
966 unsigned short dram_data_odt_ohm_ps1;
967 unsigned short dram_data_wr_odt_ohm_ps1;
968#if 0
969 /* imem/dmem define */
970 unsigned int imem_load_addr;
971 //system reserve,do not modify
972 unsigned int dmem_load_addr;
973 //system reserve,do not modify
974 unsigned short imem_load_size;
975#endif
976 //system reserve,do not modify
977 unsigned short soc_data_drv_ohm_ffe; //dmem_load_size;
978 //system reserve,do not modify
979 unsigned int ddr_base_addr;
980 //system reserve,do not modify
981 unsigned int ddr_start_offset;
982 //system reserve,do not modify
983
984 unsigned short dram_ch0_size_MB;
985 //config cs0 dram size ,like 1G DRAM ,setting 1024
986 unsigned short dram_ch1_size_MB;
987 //config cs1 dram size,like 512M DRAM ,setting 512
988 /* align8 */
989
990 unsigned short training_SequenceCtrl[2];
991 //system reserve,do not modify
992 unsigned char phy_odt_config_rank[2];
993 //unsigned char reserve1;
994 //unsigned char reserve2;
995 unsigned short rank1_ca_vref_permil;
996 //training odt config ,only use for training
997 // [0]Odt pattern for accesses targeting rank 0. [3:0] is used for write ODT [7:4] is used for read ODT
998 // [1]Odt pattern for accesses targeting rank 1. [3:0] is used for write ODT [7:4] is used for read ODT
999 unsigned int dfi_odt_config;
1000//normal go status od config,use for normal status
1001//bit 12. rank1 ODT default. default value for ODT[1] pins if there's no read/write activity.
1002//bit 11. rank1 ODT write sel. enable ODT[1] if there's write occurred in rank1.
1003//bit 10. rank1 ODT write nsel. enable ODT[1] if there's write occurred in rank0.
1004//bit 9. rank1 odt read sel. enable ODT[1] if there's read occurred in rank1.
1005//bit 8. rank1 odt read nsel. enable ODT[1] if there's read occurred in rank0.
1006//bit 4. rank0 ODT default. default value for ODT[0] pins if there's no read/write activity.
1007//bit 3. rank0 ODT write sel. enable ODT[0] if there's write occurred in rank0.
1008//bit 2. rank0 ODT write nsel. enable ODT[0] if there's write occurred in rank1.
1009//bit 1. rank0 odt read sel. enable ODT[0] if there's read occurred in rank0.
1010//bit 0. rank0 odt read nsel. enable ODT[0] if there's read occurred in rank1.
1011 unsigned short DRAMFreq[4];
1012 //config dram frequency,use DRAMFreq[0],other reserve
1013 unsigned char PllBypassEn;
1014 //system reserve,do not modify
1015 unsigned char ddr_rdbi_wr_enable;
1016 //system reserve,do not modify
1017 unsigned char ddr_rfc_type;
1018 //config dram rfc type,according dram type,also can use same dram type max config
1019 //#define DDR_RFC_TYPE_DDR3_512Mbx1 0
1020 //#define DDR_RFC_TYPE_DDR3_512Mbx2 1
1021 //#define DDR_RFC_TYPE_DDR3_512Mbx4 2
1022 //#define DDR_RFC_TYPE_DDR3_512Mbx8 3
1023 //#define DDR_RFC_TYPE_DDR3_512Mbx16 4
1024 //#define DDR_RFC_TYPE_DDR4_2Gbx1 5
1025 //#define DDR_RFC_TYPE_DDR4_2Gbx2 6
1026 //#define DDR_RFC_TYPE_DDR4_2Gbx4 7
1027 //#define DDR_RFC_TYPE_DDR4_2Gbx8 8
1028 //#define DDR_RFC_TYPE_LPDDR4_2Gbx1 9
1029 //#define DDR_RFC_TYPE_LPDDR4_3Gbx1 10
1030 //#define DDR_RFC_TYPE_LPDDR4_4Gbx1 11
1031 unsigned char enable_lpddr4x_mode;
1032 //system reserve,do not modify
1033 /* align8 */
1034
1035 unsigned int pll_ssc_mode;
1036 //
1037 /* pll ssc config:
1038 *
1039 * pll_ssc_mode = (1<<20) | (1<<8) | ([strength] << 4) | [mode],
1040 * ppm = strength * 500
1041 * mode: 0=center, 1=up, 2=down
1042 *
1043 * eg:
1044 * 1. config 1000ppm center ss. then mode=0, strength=2
1045 * .pll_ssc_mode = (1<<20) | (1<<8) | (2 << 4) | 0,
1046 * 2. config 3000ppm down ss. then mode=2, strength=6
1047 * .pll_ssc_mode = (1<<20) | (1<<8) | (6 << 4) | 2,
1048 */
1049 unsigned short clk_drv_ohm;
1050 //config soc clk pin signal driver strength ,select 20,30,40,60ohm
1051 unsigned short cs_drv_ohm;
1052 //config soc cs0 cs1 pin signal driver strength ,select 20,30,40,60ohm
1053 unsigned short ac_drv_ohm;
1054 //config soc normal address command pin driver strength ,select 20,30,40,60ohm
1055 unsigned short soc_data_drv_ohm_p;
1056 //config soc data pin pull up driver strength,select 0,28,30,32,34,37,40,43,48,53,60,68,80,96,120ohm
1057 unsigned short soc_data_drv_ohm_n;
1058 //config soc data pin pull down driver strength,select 0,28,30,32,34,37,40,43,48,53,60,68,80,96,120ohm
1059 unsigned short soc_data_odt_ohm_p;
1060 //config soc data pin odt pull up strength,select 0,28,30,32,34,37,40,43,48,53,60,68,80,96,120ohm
1061 unsigned short soc_data_odt_ohm_n;
1062 //config soc data pin odt pull down strength,select 0,28,30,32,34,37,40,43,48,53,60,68,80,96,120ohm
1063 unsigned short dram_data_drv_ohm;
1064 //config dram data pin pull up pull down driver strength,ddr3 select 34,40ohm,ddr4 select 34,48ohm,lpddr4 select 40,48,60,80,120,240ohm
1065 unsigned short dram_data_odt_ohm;
1066 //config dram data pin odt pull up down strength,ddr3 select 40,60,120ohm,ddr4 select 34,40,48,60,120,240ohm,lpddr4 select 40,48,60,80,120,240ohm
1067 unsigned short dram_ac_odt_ohm;
1068 //config dram ac pin odt pull up down strength,use for lpddr4, select 40,48,60,80,120,240ohm
1069 unsigned short soc_clk_slew_rate;
1070 //system reserve,do not modify
1071 unsigned short soc_cs_slew_rate;
1072 //system reserve,do not modify
1073 unsigned short soc_ac_slew_rate;
1074 //system reserve,do not modify
1075 unsigned short soc_data_slew_rate;
1076 //system reserve,do not modify
1077 unsigned short vref_output_permil; //phy
1078 //setting same with vref_dram_permil
1079 unsigned short vref_receiver_permil; //soc
1080 //soc init SOC receiver vref ,config like 500 means 0.5VDDQ,take care ,please follow SI
1081 unsigned short vref_dram_permil;
1082 //soc init DRAM receiver vref ,config like 500 means 0.5VDDQ,take care ,please follow SI
1083 unsigned short max_core_timmming_frequency;
1084 //use for limited ddr speed core timmming parameter,for some old dram maybe have no over speed register
1085 /* align8 */
1086
1087 unsigned char ac_trace_delay[10];
1088 unsigned char lpddr4_dram_vout_voltage_1_3_2_5_setting;
1089 //use for lpddr4 read vout voltage setting 0 --->2/5VDDQ ,1--->1/3VDDQ
1090 unsigned char lpddr4_x8_mode;
1091 unsigned char slt_test_function[2]; //[0] slt test function enable,bit 0 enable 4 frequency scan,bit 1 enable force delay line offset ,bit 7 enable skip training function
1092 //[1],slt test parameter ,use for force delay line offset
1093 //system reserve,do not modify
1094 unsigned short tdqs2dq;
1095 unsigned char dram_data_wr_odt_ohm;
1096 unsigned char bitTimeControl_2d;
1097 //system reserve,do not modify
1098 /* align8 */
1099 unsigned char char_rev1;
1100 unsigned char training_offset; //char_rev2;
1101 unsigned int ddr_dmc_remap[5];
1102 unsigned int dram_rtt_nom_wr_park[2];
1103 //system reserve,do not modify
1104 /* align8 */
1105 unsigned char ddr_lpddr34_ca_remap[4];
1106 ////use for lpddr3 /lpddr4 ca training data byte lane remap
1107 unsigned char ddr_lpddr34_dq_remap[32];
1108 ////use for lpddr3 /lpddr4 ca pinmux remap
1109 unsigned char ac_pinmux[DWC_AC_PINMUX_TOTAL];
1110 //use for lpddr3 /lpddr4 ca pinmux remap
1111 unsigned char dfi_pinmux[DWC_DFI_PINMUX_TOTAL];
1112 unsigned char char_rev3;
1113 unsigned char char_rev4;
1114 ddr_phy_common_extra_set_t cfg_ddr_phy_common_extra_set_t;
1115 training_delay_set_ps_t cfg_ddr_training_delay_ps[2];
1116
1117 //override read bit delay
1118}ddr_set_t7;
1119
1120ddr_set_t7 p_ddr_set_t7;
1121
1122#ifndef _SHA256_H_DDR
1123#define _SHA256_H_DDR
1124
1125#define SHA256_SUM_LEN 32
1126#define SHA256_DER_LEN 19
1127
1128/* Reset watchdog each time we process this many bytes */
1129#define CHUNKSZ_SHA256 (64 * 1024)
1130
1131typedef struct {
1132 uint32_t total[2];
1133 uint32_t state[8];
1134 uint8_t buffer[64];
1135} sha256_context_ddr;
1136
1137const uint8_t sha256_der_prefix_ddr[SHA256_DER_LEN] =
1138{
1139 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
1140 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
1141 0x00, 0x04, 0x20
1142};
1143
1144/*
1145 * 32-bit integer manipulation macros (big endian)
1146 */
1147#ifndef GET_UINT32_BE
1148#define GET_UINT32_BE(n, b, i) { \
1149 (n) = ((unsigned long)(b)[(i)] << 24) \
1150 | ((unsigned long)(b)[(i) + 1] << 16) \
1151 | ((unsigned long)(b)[(i) + 2] << 8) \
1152 | ((unsigned long)(b)[(i) + 3]); \
1153}
1154#endif
1155#ifndef PUT_UINT32_BE
1156#define PUT_UINT32_BE(n, b, i) { \
1157 (b)[(i)] = (unsigned char)((n) >> 24); \
1158 (b)[(i) + 1] = (unsigned char)((n) >> 16); \
1159 (b)[(i) + 2] = (unsigned char)((n) >> 8); \
1160 (b)[(i) + 3] = (unsigned char)((n)); \
1161}
1162#endif
1163
1164void sha256_starts_internal(sha256_context_ddr *ctx)
1165{
1166 ctx->total[0] = 0;
1167 ctx->total[1] = 0;
1168
1169 ctx->state[0] = 0x6A09E667;
1170 ctx->state[1] = 0xBB67AE85;
1171 ctx->state[2] = 0x3C6EF372;
1172 ctx->state[3] = 0xA54FF53A;
1173 ctx->state[4] = 0x510E527F;
1174 ctx->state[5] = 0x9B05688C;
1175 ctx->state[6] = 0x1F83D9AB;
1176 ctx->state[7] = 0x5BE0CD19;
1177}
1178
1179static void sha256_process_internal(sha256_context_ddr *ctx, const uint8_t data[64])
1180{
1181 uint32_t temp1, temp2;
1182 uint32_t W[64];
1183 uint32_t A, B, C, D, E, F, G, H;
1184
1185 GET_UINT32_BE(W[0], data, 0);
1186 GET_UINT32_BE(W[1], data, 4);
1187 GET_UINT32_BE(W[2], data, 8);
1188 GET_UINT32_BE(W[3], data, 12);
1189 GET_UINT32_BE(W[4], data, 16);
1190 GET_UINT32_BE(W[5], data, 20);
1191 GET_UINT32_BE(W[6], data, 24);
1192 GET_UINT32_BE(W[7], data, 28);
1193 GET_UINT32_BE(W[8], data, 32);
1194 GET_UINT32_BE(W[9], data, 36);
1195 GET_UINT32_BE(W[10], data, 40);
1196 GET_UINT32_BE(W[11], data, 44);
1197 GET_UINT32_BE(W[12], data, 48);
1198 GET_UINT32_BE(W[13], data, 52);
1199 GET_UINT32_BE(W[14], data, 56);
1200 GET_UINT32_BE(W[15], data, 60);
1201
1202#define SHR(x, n) ((x & 0xFFFFFFFF) >> n)
1203#define ROTR(x, n) (SHR(x, n) | (x << (32 - n)))
1204
1205#define S0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3))
1206#define S1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10))
1207
1208#define S2(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22))
1209#define S3(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))
1210
1211#define F0(x, y, z) ((x & y) | (z & (x | y)))
1212#define F1(x, y, z) (z ^ (x & (y ^ z)))
1213
1214#define R(t) \
1215 ( \
1216 W[t] = S1(W[t - 2]) + W[t - 7] + \
1217 S0(W[t - 15]) + W[t - 16] \
1218 )
1219
1220#define P(a, b, c, d, e, f, g, h, x, K) { \
1221 temp1 = h + S3(e) + F1(e, f, g) + K + x; \
1222 temp2 = S2(a) + F0(a, b, c); \
1223 d += temp1; h = temp1 + temp2; \
1224}
1225
1226 A = ctx->state[0];
1227 B = ctx->state[1];
1228 C = ctx->state[2];
1229 D = ctx->state[3];
1230 E = ctx->state[4];
1231 F = ctx->state[5];
1232 G = ctx->state[6];
1233 H = ctx->state[7];
1234
1235 P(A, B, C, D, E, F, G, H, W[0], 0x428A2F98);
1236 P(H, A, B, C, D, E, F, G, W[1], 0x71374491);
1237 P(G, H, A, B, C, D, E, F, W[2], 0xB5C0FBCF);
1238 P(F, G, H, A, B, C, D, E, W[3], 0xE9B5DBA5);
1239 P(E, F, G, H, A, B, C, D, W[4], 0x3956C25B);
1240 P(D, E, F, G, H, A, B, C, W[5], 0x59F111F1);
1241 P(C, D, E, F, G, H, A, B, W[6], 0x923F82A4);
1242 P(B, C, D, E, F, G, H, A, W[7], 0xAB1C5ED5);
1243 P(A, B, C, D, E, F, G, H, W[8], 0xD807AA98);
1244 P(H, A, B, C, D, E, F, G, W[9], 0x12835B01);
1245 P(G, H, A, B, C, D, E, F, W[10], 0x243185BE);
1246 P(F, G, H, A, B, C, D, E, W[11], 0x550C7DC3);
1247 P(E, F, G, H, A, B, C, D, W[12], 0x72BE5D74);
1248 P(D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE);
1249 P(C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7);
1250 P(B, C, D, E, F, G, H, A, W[15], 0xC19BF174);
1251 P(A, B, C, D, E, F, G, H, R(16), 0xE49B69C1);
1252 P(H, A, B, C, D, E, F, G, R(17), 0xEFBE4786);
1253 P(G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6);
1254 P(F, G, H, A, B, C, D, E, R(19), 0x240CA1CC);
1255 P(E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F);
1256 P(D, E, F, G, H, A, B, C, R(21), 0x4A7484AA);
1257 P(C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC);
1258 P(B, C, D, E, F, G, H, A, R(23), 0x76F988DA);
1259 P(A, B, C, D, E, F, G, H, R(24), 0x983E5152);
1260 P(H, A, B, C, D, E, F, G, R(25), 0xA831C66D);
1261 P(G, H, A, B, C, D, E, F, R(26), 0xB00327C8);
1262 P(F, G, H, A, B, C, D, E, R(27), 0xBF597FC7);
1263 P(E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3);
1264 P(D, E, F, G, H, A, B, C, R(29), 0xD5A79147);
1265 P(C, D, E, F, G, H, A, B, R(30), 0x06CA6351);
1266 P(B, C, D, E, F, G, H, A, R(31), 0x14292967);
1267 P(A, B, C, D, E, F, G, H, R(32), 0x27B70A85);
1268 P(H, A, B, C, D, E, F, G, R(33), 0x2E1B2138);
1269 P(G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC);
1270 P(F, G, H, A, B, C, D, E, R(35), 0x53380D13);
1271 P(E, F, G, H, A, B, C, D, R(36), 0x650A7354);
1272 P(D, E, F, G, H, A, B, C, R(37), 0x766A0ABB);
1273 P(C, D, E, F, G, H, A, B, R(38), 0x81C2C92E);
1274 P(B, C, D, E, F, G, H, A, R(39), 0x92722C85);
1275 P(A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1);
1276 P(H, A, B, C, D, E, F, G, R(41), 0xA81A664B);
1277 P(G, H, A, B, C, D, E, F, R(42), 0xC24B8B70);
1278 P(F, G, H, A, B, C, D, E, R(43), 0xC76C51A3);
1279 P(E, F, G, H, A, B, C, D, R(44), 0xD192E819);
1280 P(D, E, F, G, H, A, B, C, R(45), 0xD6990624);
1281 P(C, D, E, F, G, H, A, B, R(46), 0xF40E3585);
1282 P(B, C, D, E, F, G, H, A, R(47), 0x106AA070);
1283 P(A, B, C, D, E, F, G, H, R(48), 0x19A4C116);
1284 P(H, A, B, C, D, E, F, G, R(49), 0x1E376C08);
1285 P(G, H, A, B, C, D, E, F, R(50), 0x2748774C);
1286 P(F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5);
1287 P(E, F, G, H, A, B, C, D, R(52), 0x391C0CB3);
1288 P(D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A);
1289 P(C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F);
1290 P(B, C, D, E, F, G, H, A, R(55), 0x682E6FF3);
1291 P(A, B, C, D, E, F, G, H, R(56), 0x748F82EE);
1292 P(H, A, B, C, D, E, F, G, R(57), 0x78A5636F);
1293 P(G, H, A, B, C, D, E, F, R(58), 0x84C87814);
1294 P(F, G, H, A, B, C, D, E, R(59), 0x8CC70208);
1295 P(E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA);
1296 P(D, E, F, G, H, A, B, C, R(61), 0xA4506CEB);
1297 P(C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7);
1298 P(B, C, D, E, F, G, H, A, R(63), 0xC67178F2);
1299
1300 ctx->state[0] += A;
1301 ctx->state[1] += B;
1302 ctx->state[2] += C;
1303 ctx->state[3] += D;
1304 ctx->state[4] += E;
1305 ctx->state[5] += F;
1306 ctx->state[6] += G;
1307 ctx->state[7] += H;
1308}
1309
1310void sha256_update_internal(sha256_context_ddr *ctx, const uint8_t *input, uint32_t length)
1311{
1312 uint32_t left, fill;
1313
1314 if (!length)
1315 return;
1316
1317 left = ctx->total[0] & 0x3F;
1318 fill = 64 - left;
1319
1320 ctx->total[0] += length;
1321 ctx->total[0] &= 0xFFFFFFFF;
1322
1323 if (ctx->total[0] < length)
1324 ctx->total[1]++;
1325
1326 if (left && length >= fill) {
1327 memcpy((void *)(ctx->buffer + left), (void *)input, fill);
1328 sha256_process_internal(ctx, ctx->buffer);
1329 length -= fill;
1330 input += fill;
1331 left = 0;
1332 }
1333
1334 while (length >= 64) {
1335 sha256_process_internal(ctx, input);
1336 length -= 64;
1337 input += 64;
1338 }
1339
1340 if (length)
1341 memcpy((void *)(ctx->buffer + left), (void *)input, length);
1342}
1343
1344static uint8_t sha256_padding[64] =
1345{
1346 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1347 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1348 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1349 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1350};
1351
1352void sha256_finish_internal(sha256_context_ddr *ctx, uint8_t digest[32])
1353{
1354 uint32_t last, padn;
1355 uint32_t high, low;
1356 uint8_t msglen[8];
1357
1358 high = ((ctx->total[0] >> 29)
1359 | (ctx->total[1] << 3));
1360 low = (ctx->total[0] << 3);
1361
1362 PUT_UINT32_BE(high, msglen, 0);
1363 PUT_UINT32_BE(low, msglen, 4);
1364
1365 last = ctx->total[0] & 0x3F;
1366 padn = (last < 56) ? (56 - last) : (120 - last);
1367
1368 sha256_update_internal(ctx, sha256_padding, padn);
1369 sha256_update_internal(ctx, msglen, 8);
1370
1371 PUT_UINT32_BE(ctx->state[0], digest, 0);
1372 PUT_UINT32_BE(ctx->state[1], digest, 4);
1373 PUT_UINT32_BE(ctx->state[2], digest, 8);
1374 PUT_UINT32_BE(ctx->state[3], digest, 12);
1375 PUT_UINT32_BE(ctx->state[4], digest, 16);
1376 PUT_UINT32_BE(ctx->state[5], digest, 20);
1377 PUT_UINT32_BE(ctx->state[6], digest, 24);
1378 PUT_UINT32_BE(ctx->state[7], digest, 28);
1379}
1380
1381/*
1382 * Output = SHA-256( input buffer ). Trigger the watchdog every 'chunk_sz'
1383 * bytes of input processed.
1384 */
1385void sha256_csum_wd_internal(const unsigned char *input, unsigned int ilen,
1386 unsigned char *output, unsigned int chunk_sz)
1387{
1388 sha256_context_ddr ctx;
1389
1390 sha256_starts_internal(&ctx);
1391 sha256_update_internal(&ctx, input, ilen);
1392 sha256_finish_internal(&ctx, output);
1393}
1394#endif
1395
1396typedef struct ddr_sha_s {
1397 unsigned char sha2[SHA256_SUM_LEN];
1398 ddr_set_t ddrs;
1399 unsigned char sha_chip_id[MESON_CPU_CHIP_ID_SIZE];
1400}ddr_sha_t;
1401
1402ddr_sha_t ddr_sha = { { 0 } };
1403ddr_set_t *ddr_set_t_p_array = &ddr_sha.ddrs;
1404
1405typedef struct ddr_sha_s_c2 {
1406 unsigned char sha2[SHA256_SUM_LEN];
1407 ddr_set_t_c2 ddrs;
1408 unsigned char sha_chip_id[MESON_CPU_CHIP_ID_SIZE];
1409}ddr_sha_t_c2;
1410
1411ddr_sha_t_c2 ddr_sha_c2 = { { 0 } };
1412ddr_set_t_c2 *ddr_set_t_p_array_c2 = &ddr_sha_c2.ddrs;
1413ddr_set_t_c2 *ddr_set_t_p = NULL;
1414
1415int check_base_address(void)
1416{
1417 ddr_set_t_p = (ddr_set_t_c2 *)(ddr_set_t_p_array_c2);
1418 unsigned int table_max = (sizeof(__ddr_base_address_table)) / (sizeof(ddr_base_address_table_t));
1419 unsigned int table_index = 0;
1420 char chip_id = 0;
1421 chip_id = ddr_get_chip_id();
1422 p_ddr_base = (ddr_base_address_table_t *)(&__ddr_base_address_table);
1423
1424 printf("\ntable_max=%08x,p_ddr_base_add=%08x,chip_id=%08x", table_max, (unsigned int)(unsigned long)p_ddr_base, chip_id);
1425 if (chip_id == 0)
1426 chip_id = CHIP_ID_MASK;
1427 if (chip_id) {
1428 if (chip_id == DDR_MESON_CPU_MAJOR_ID_S4D ||
1429 chip_id == DDR_MESON_CPU_MAJOR_ID_A5 ||
1430 chip_id == DDR_MESON_CPU_MAJOR_ID_C3)
1431 chip_id = DDR_MESON_CPU_MAJOR_ID_S4;
1432 for (table_index = 0; table_index < table_max; table_index++) {
1433 printf("\ntable_index=%08x,p_ddr_base_add=%08x,(p_ddr_base->chip_id==%08x",
1434 table_index, (unsigned int)(unsigned long)p_ddr_base, (p_ddr_base->chip_id));
1435 if ((p_ddr_base->chip_id == chip_id) && (chip_id < CHIP_ID_MASK)) {
1436 printf("\nfind match chip id=0x%08x ,%s", chip_id, p_ddr_base->soc_family_name);
1437 break;
1438 } else {
1439 printf("\nno find match chip id=0x%08x, ,%s will use default value", chip_id, p_ddr_base->soc_family_name);
1440 }
1441 p_ddr_base = (p_ddr_base + 1);
1442 }
1443 }
1444
1445 int count = 0;
1446 for (count = 0; count < 12; count++)
1447 ddr_sha.sha_chip_id[count] = global_chip_id[count];
1448
1449 if (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T7 ||
1450 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T3) {
1451 phy_base_add[0] = p_ddr_base->ddr_phy_base_address;
1452 phy_base_add[1] = p_ddr_base->ddr_phy_base_address_1;
1453 ddr_dmc_sticky[0] = p_ddr_base->ddr_dmc_sticky0;
1454 ddr_dmc_sticky[1] = p_ddr_base->ddr_dmc_sticky0_1;
1455 ddr_dmc_apd_address[0] = p_ddr_base->ddr_dmc_apd_address;
1456 ddr_dmc_apd_address[1] = p_ddr_base->ddr_dmc_apd_address_1;
1457 ddr_dmc_asr_address[0] = p_ddr_base->ddr_dmc_asr_address;
1458 ddr_dmc_asr_address[1] = p_ddr_base->ddr_dmc_asr_address_1;
1459 dmc_retraining_ctrl_address[0] = p_ddr_base->ddr_dmc_lpdd4_retraining_address;
1460 dmc_retraining_ctrl_address[1] = p_ddr_base->ddr_dmc_lpdd4_retraining_address_1;
1461 }
1462 return (unsigned int)(unsigned long)(p_ddr_base);
1463}
1464
1465void dmc_change_channel(uint32_t ch)
1466{
1467 dmc_ddr_config_channel_id = ch;
1468 //dmc_ddr_config_channel_id=0;
1469 p_ddr_base->ddr_phy_base_address = phy_base_add[dmc_ddr_config_channel_id];
1470 p_ddr_base->ddr_dmc_sticky0 = ddr_dmc_sticky[dmc_ddr_config_channel_id];
1471 p_ddr_base->ddr_dmc_lpdd4_retraining_address = dmc_retraining_ctrl_address[dmc_ddr_config_channel_id];
1472 p_ddr_base->ddr_dmc_apd_address = ddr_dmc_apd_address[dmc_ddr_config_channel_id];
1473 p_ddr_base->ddr_dmc_asr_address = ddr_dmc_asr_address[dmc_ddr_config_channel_id];
1474}
1475
1476char *itoa_ddr_test(int num, char *str, int radix)
1477{
1478 printf("\nitoa_ddr_test 1\n");
1479 char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
1480 unsigned unum;
1481 char temp;
1482 int i = 0, j, k;
1483
1484 if (radix == 10 && num < 0) {
1485 unum = (unsigned)-num;
1486 str[i++] = '-';
1487 } else {
1488 unum = (unsigned)num;
1489 }
1490
1491 printf("\nitoa_ddr_test 2\n");
1492 printf("\nunum=0x%08x\n", unum);
1493 printf("\nunum2=0x%08x\n", (unum % (unsigned)radix));
1494 printf("\nradix=0x%08x\n", radix);
1495 str[0] = index[0];
1496 printf("\nitoa_ddr_test 22\n");
1497 unum /= radix;
1498 printf("\nitoa_ddr_test 23\n");
1499 do {
1500 str[i++] = index[unum % (unsigned)radix];
1501 unum /= radix;
1502 } while (unum);
1503 printf("\nitoa_ddr_test 3\n");
1504 str[i] = '\0';
1505
1506 if (str[0] == '-')
1507 k = 1;
1508 else
1509 k = 0;
1510 printf("\nitoa_ddr_test 4\n");
1511 for (j = k; j <= (i - 1) / 2; j++) {
1512 temp = str[j];
1513 str[j] = str[i - 1 + k - j];
1514 str[i - 1 + k - j] = temp;
1515 }
1516 return str;
1517}
1518
1519int TOLOWER(int ch)
1520{
1521 if ((unsigned int)(ch - 'A') < 26u)
1522 ch += 'a' - 'A';
1523 return ch;
1524}
1525
1526int isxdigit(int ch)
1527{
1528 return (unsigned int)(ch - '0') < 10u
1529 || (unsigned int)((ch | 0x20) - 'a') < 6u;
1530}
1531
1532int isdigit(int ch)
1533{
1534 return (unsigned int)(ch - '0') < 10u;
1535}
1536
1537unsigned int simple_guess_base(const char *cp)
1538{
1539 if (cp[0] == '0') {
1540 if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2]))
1541 return 16;
1542 else
1543 return 10;
1544 } else {
1545 return 10;
1546 }
1547}
1548
1549unsigned int simple_strtoull_ddr(const char *cp, char **endp, unsigned int base)
1550{
1551 unsigned int result = 0;
1552
1553 if (cp == NULL) //jiaxing add 20170616
1554 return 0;
1555 if (!base)
1556 base = simple_guess_base(cp);
1557 if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')
1558 cp += 2;
1559 if (base == 10)
1560 while ((*cp) == '0')
1561 cp++;
1562 while (isxdigit(*cp)) {
1563 unsigned int value;
1564 value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;
1565 if (value >= base)
1566 break;
1567 result = result * base + value;
1568 cp++;
1569 }
1570 if (endp)
1571 *endp = (char *)cp;
1572 return result;
1573}
1574
1575unsigned int env_to_a_num(const char *env_name)
1576{
1577 char *str_buf = NULL;
1578 char buf[48];
1579
1580 str_buf = (char *)(&buf);
1581 memset(str_buf, 0, sizeof(buf));
1582 printf("sizeof(str_buf)==%d\n", (unsigned int)(sizeof(buf)));
1583 str_buf = getenv(env_name);
1584 unsigned int a_num = 0;
1585 char *endp;
1586
1587 if (!str_buf)
1588 return 0;
1589
1590 printf("str==%s\n", str_buf);
1591
1592 a_num = simple_strtoull_ddr(str_buf, &endp, 0);
1593 printf("%s==0x%08x\n", str_buf, a_num);
1594
1595 return a_num;
1596}
1597
1598unsigned int a_num_to_env(const char *env_name, unsigned int *a_num)
1599{
1600 char *str_buf = NULL;
1601 char buf[1024];
1602
1603 str_buf = (char *)(&buf);
1604 memset(str_buf, 0, sizeof(buf));
1605 printf("sizeof(str_buf)==%d\n", (unsigned int)(sizeof(buf)));
1606 str_buf = getenv(env_name);
1607
1608 if (!str_buf)
1609 return 0;
1610
1611 printf("str==%s\n", str_buf);
1612
1613 sprintf(buf, "0x%08x", *a_num);
1614
1615 printf("%s==0x%08x", buf, *a_num);
1616 setenv(env_name, buf);
1617
1618 run_command("save", 0);
1619 return 1;
1620}
1621
1622unsigned int env_to_num(const char *env_name, unsigned int *num_arry)
1623{
1624 char *str_buf = NULL;
1625 char buf[1024];
1626 unsigned int str_to_numarry[48];
1627
1628 str_buf = (char *)(&buf);
1629 memset(str_buf, 0, sizeof(buf));
1630 printf("sizeof(str_buf)==%d\n", (unsigned int)(sizeof(buf)));
1631 str_buf = getenv(env_name);
1632
1633 if (!str_buf)
1634 return 0;
1635
1636 char *str[48];
1637 char *endp;
1638 int i;
1639 for (i = 0; i < 48; i++)
1640 str_to_numarry[i] = 0;
1641 printf("str==%s\n", str_buf);
1642 for (i = 0; i < 48; i++) {
1643 str[i] = strsep(&str_buf, ";");
1644 if (str[i] == NULL)
1645 break;
1646 str_to_numarry[i] = simple_strtoull_ddr(str[i], &endp, 0);
1647 }
1648 for (i = 0; i < 48; i++) {
1649 printf("str_to_numarry[%d]==%d\n", i, str_to_numarry[i]);
1650 num_arry[i] = str_to_numarry[i];
1651 }
1652 return 1;
1653}
1654
1655unsigned int num_to_env(const char *env_name, unsigned int *num_arry)
1656{
1657 char *str_buf = NULL;
1658 char buf[512];
1659 char buf_f[512];
1660 int i;
1661
1662 str_buf = (char *)(&buf);
1663 memset(str_buf, 0, sizeof(buf));
1664 printf("sizeof(str_buf)==%d\n", (unsigned int)(sizeof(buf)));
1665 str_buf = getenv(env_name);
1666
1667 if (!str_buf)
1668 return 0;
1669
1670 printf("str==%s\n", str_buf);
1671
1672
1673 sprintf(buf, "0x%08x", num_arry[0]);
1674 for (i = 1; i < 48; i++) {
1675 sprintf(buf_f, "%s;0x%08x", buf, num_arry[i]);
1676 printf("%d %d\n", i, num_arry[i]);
1677 }
1678 printf("%s", buf_f);
1679 setenv(env_name, buf_f);
1680
1681 run_command("save", 0);
1682 return 1;
1683}
1684
1685#define TDATA32F 0xffffffff
1686#define TDATA32A 0xaaaaaaaa
1687#define TDATA325 0x55555555
1688
1689#define DMC_STICKY_MAGIC_0 0x12345678
1690#define DMC_STICKY_MAGIC_1 0xabcdbead
1691#define DMC_STICKY_UBOOT_WINDOW_MAGIC_1 0x22
1692#define DMC_STICKY_AUTO_TEST_CMD_INDEX_MAGIC_1 0x33
1693
1694unsigned int dmc_sticky[64];
1695unsigned int sticky_reg_base_add = 0;
1696
1697unsigned int global_boot_times = 0;
1698unsigned int watchdog_time_s = 20;
1699unsigned int global_ddr_clk = 1;
1700unsigned int bdlr_100step = 0;
1701unsigned int ui_1_32_100step = 0;
1702unsigned int error_count = 0;
1703unsigned int error_outof_count_flag = 0;
1704unsigned int copy_test_flag = 0;
1705unsigned int training_pattern_flag = 0;
1706unsigned int test_start_addr = 0x1080000;
1707
1708unsigned int dq_lcd_bdl_value_aclcdlr_org_a;
1709unsigned int dq_lcd_bdl_value_bdlr0_org_a;
1710unsigned int dq_lcd_bdl_value_aclcdlr_min_a;
1711unsigned int dq_lcd_bdl_value_bdlr0_min_a;
1712unsigned int dq_lcd_bdl_value_aclcdlr_max_a;
1713unsigned int dq_lcd_bdl_value_bdlr0_max_a;
1714unsigned int dq_lcd_bdl_value_aclcdlr_status_a;
1715unsigned int dq_lcd_bdl_value_bdlr0_status_a;
1716
1717unsigned int dq_lcd_bdl_value_aclcdlr_org_b;
1718unsigned int dq_lcd_bdl_value_bdlr0_org_b;
1719unsigned int dq_lcd_bdl_value_aclcdlr_min_b;
1720unsigned int dq_lcd_bdl_value_bdlr0_min_b;
1721unsigned int dq_lcd_bdl_value_aclcdlr_max_b;
1722unsigned int dq_lcd_bdl_value_bdlr0_max_b;
1723
1724unsigned int dq_lcd_bdl_value_wdq_org_a[4];
1725unsigned int dq_lcd_bdl_value_rdqs_org_a[4];
1726unsigned int dq_lcd_bdl_value_wdq_min_a[4];
1727unsigned int dq_lcd_bdl_value_wdq_max_a[4];
1728unsigned int dq_lcd_bdl_value_rdqs_min_a[4];
1729unsigned int dq_lcd_bdl_value_rdqs_max_a[4];
1730unsigned int dq_lcd_bdl_value_wdq_status_a[4];
1731unsigned int dq_lcd_bdl_value_rdqs_status_a[4];
1732
1733unsigned int dq_lcd_bdl_value_wdq_org_b[4];
1734unsigned int dq_lcd_bdl_value_rdqs_org_b[4];
1735unsigned int dq_lcd_bdl_value_wdq_min_b[4];
1736unsigned int dq_lcd_bdl_value_wdq_max_b[4];
1737unsigned int dq_lcd_bdl_value_rdqs_min_b[4];
1738unsigned int dq_lcd_bdl_value_rdqs_max_b[4];
1739unsigned int dq_lcd_bdl_value_wdq_status_b[4];
1740unsigned int dq_lcd_bdl_value_rdqs_status_b[4];
1741unsigned int acbdlr0_9_reg_org[10];
1742unsigned int acbdlr0_9_reg_setup_max[40];
1743unsigned int acbdlr0_9_reg_hold_max[40];
1744unsigned int acbdlr0_9_reg_setup_time[40];
1745unsigned int acbdlr0_9_reg_hold_time[40];
1746unsigned int data_bdlr0_5_reg_org[28]; //4//4lane
1747unsigned int bdlr0_9_reg_setup_max[24 * 4]; //4//4 lane 96 bdlr
1748unsigned int bdlr0_9_reg_hold_max[24 * 4];
1749unsigned int bdlr0_9_reg_setup_time[24 * 4];
1750unsigned int bdlr0_9_reg_hold_time[24 * 4];
1751
1752unsigned int pre_fetch_enable = 0;
1753
1754#define readl(addr) (unsigned int)(*((volatile unsigned int *)((unsigned long)(unsigned int)addr))) //rd_reg(addr)
1755#define writel(data, addr) (*((volatile unsigned int *)((unsigned long)(unsigned int)addr))) = (data) //wr_reg(addr, data)
1756
1757#define wr_reg(addr, data) (*((volatile unsigned int *)((unsigned long)(unsigned int)addr))) = (data) //wr_reg(addr, data)
1758#define rd_reg(addr) (unsigned int)(*((volatile unsigned int *)((unsigned long)(unsigned int)addr))) //rd_reg(addr)
1759
1760#ifndef CONFIG_CHIP
1761#define CHIP_OLD 0
1762#define CHIP_TXLX 1
1763#define CHIP_A113 2
1764#define CHIP_G12 3
1765#define CONFIG_CHIP CHIP_G12 // CHIP_OLD//
1766#endif
1767
1768#define P_DDR_PHY_DEFAULT 0
1769#define P_DDR_PHY_GX_BABY 1
1770#define P_DDR_PHY_GX_TV_BABY 2
1771#define P_DDR_PHY_905X 3
1772
1773#define P_DDR_PHY_G12 4
1774#define CONFIG_DDR_PHY P_DDR_PHY_G12
1775
1776#define PATTERN_USE_DDR_DES
1777#define USE_64BIT_POINTER
1778#ifdef USE_64BIT_POINTER
1779#define p_convter_int(a) (unsigned int)(unsigned long)(a)
1780#define int_convter_p(a) (unsigned long)(a)
1781
1782#else
1783#define p_convter_int(a) (unsigned int)(a)
1784#define int_convter_p(a) (unsigned int)(a)
1785#endif
1786
1787#ifdef PATTERN_USE_DDR_DES
1788#define des_pattern(a, b, c, d) (des[a] ^ pattern_ ## b[c][d])
1789#define des_inv_pattern(a, b, c, d) (des[a] ^ (~(pattern_ ## b[c][d])))
1790#define des_xor_pattern(a, b) (a ^ b)
1791#else
1792#define des_pattern(a, b, c, d) (des[a] & 0) + pattern_ ## b[c][d]
1793#define des_inv_pattern(a, b, c, d) (des[a] & 0) + ~(pattern_ ## b[c][d])
1794#define des_xor_pattern(a, b) (a & 0 + b)
1795#endif
1796
1797#define DDR_LCDLR_CK_USE_FAST_PATTERN
1798#if (CONFIG_DDR_PHY > P_DDR_PHY_DEFAULT)
1799#define DDR_PREFETCH_CACHE
1800#endif
1801#ifdef DDR_PREFETCH_CACHE
1802#define ddr_pld_cache(P) asm ("prfm PLDL1KEEP, [%0, #376]" ::"r" (P))
1803#else
1804#define ddr_pld_cache(P)
1805#endif
1806
1807#define DDR_TEST_START_ADDR 0x1080000 // 0x10000000 //CONFIG_SYS_MEMTEST_START
1808#define DDR_TEST_SIZE 0x2000000
1809
1810#if (CONFIG_CHIP >= CHIP_TXLX)
1811
1812#endif
1813
1814#define get_us_time() (rd_reg(p_ddr_base->ee_timer_base_address)) // (readl(P_ISA_TIMERE))
1815
1816#define ACX_MAX 0x80
1817
1818//OVERRIDE_OPTION
1819#define DMC_TEST_WINDOW_INDEX_ATXDLY 1
1820#define DMC_TEST_WINDOW_INDEX_TXDQSDLY 2
1821#define DMC_TEST_WINDOW_INDEX_RXCLKDLY 3
1822#define DMC_TEST_WINDOW_INDEX_TXDQDLY 4
1823#define DMC_TEST_WINDOW_INDEX_RXPBDLY 5
1824#define DMC_TEST_WINDOW_INDEX_RXENDLY 6
1825#define DMC_TEST_WINDOW_INDEX_RXPBDLY_2 7
1826#define DMC_TEST_WINDOW_INDEX_DFIMRL 8
1827#define DMC_TEST_WINDOW_INDEX_VREF 9
1828#define DMC_TEST_WINDOW_INDEX_RETRAINING 10
1829#define DMC_TEST_WINDOW_INDEX_EXTERA_COMMON 11
1830#define DMC_TEST_WINDOW_INDEX_EXTERA_PS 12
1831
1832#define DMC_TEST_WINDOW_INDEX_RXCLKDLY_DAC1 12
1833#define DMC_TEST_WINDOW_INDEX_RXPBDLY_DAC1 13
1834#define DMC_TEST_WINDOW_INDEX_RXPBDLY_2_DAC1 14
1835
1836#define DMC_TEST_WINDOW_INDEX_EE_VOLTAGE 0x11
1837#define DMC_TEST_WINDOW_INDEX_SOC_VREF 0x12
1838#define DMC_TEST_WINDOW_INDEX_SOC_VREF_DAC1 0x13
1839#define DMC_TEST_WINDOW_INDEX_DRAM_VREF 0x14
1840
1841#define DMC_TEST_WINDOW_INDEX_DDR3_WRITE_VREF_RANG0 0x21
1842#define DMC_TEST_WINDOW_INDEX_DDR3_WRITE_VREF_RANG1 0x22
1843#define DMC_TEST_WINDOW_INDEX_DDR3_READ_VREF_RANG0 0x23
1844#define DMC_TEST_WINDOW_INDEX_DDR3_READ_VREF_RANG1 0x24
1845
1846#define DMC_TEST_WINDOW_INDEX_DDR4_WRITE_VREF_RANG0 0x31
1847#define DMC_TEST_WINDOW_INDEX_DDR4_WRITE_VREF_RANG1 0x32
1848#define DMC_TEST_WINDOW_INDEX_DDR4_READ_VREF_RANG0 0x33
1849#define DMC_TEST_WINDOW_INDEX_DDR4_READ_VREF_RANG1 0x34
1850
1851#define DMC_TEST_WINDOW_INDEX_LPDDR4_WRITE_VREF_RANG0 0x41
1852#define DMC_TEST_WINDOW_INDEX_LPDDR4_WRITE_VREF_RANG1 0x42
1853#define DMC_TEST_WINDOW_INDEX_LPDDR4_READ_VREF_RANG0 0x43
1854#define DMC_TEST_WINDOW_INDEX_LPDDR4_READ_VREF_RANG1 0x44
1855
1856#define DMC_TEST_WINDOW_INDEX_LPDDR3_WRITE_VREF_RANG0 0x51
1857#define DMC_TEST_WINDOW_INDEX_LPDDR3_WRITE_VREF_RANG1 0x52
1858#define DMC_TEST_WINDOW_INDEX_LPDDR3_READ_VREF_RANG0 0x53
1859#define DMC_TEST_WINDOW_INDEX_LPDDR3_READ_VREF_RANG1 0x54
1860
1861unsigned int dwc_ddrphy_apb_wr(unsigned int addr, unsigned int dat)
1862{
1863 *(volatile uint16_t *)(int_convter_p(((addr) << 1) + (p_ddr_base->ddr_phy_base_address))) = ((uint16_t)dat);
1864 return 1;
1865}
1866
1867unsigned int dwc_ddrphy_apb_rd(unsigned int addr)
1868{
1869 return *(volatile uint16_t *)(int_convter_p(((addr) << 1) + (p_ddr_base->ddr_phy_base_address)));
1870}
1871
1872void ddr_udelay(unsigned int us)
1873{
1874 unsigned int t0 = (rd_reg((p_ddr_base->ee_timer_base_address)));
1875
1876 while ((rd_reg(((p_ddr_base->ee_timer_base_address)))) - t0 <= us) {
1877 }
1878}
1879
1880void ddr_udelay_dummy(volatile unsigned int us)
1881{
1882 if ((p_ddr_base->ee_timer_base_address)) {
1883 ddr_udelay(us);
1884 } else {
1885 if (us == 0)
1886 us = 10000;
1887
1888 while (us--) {
1889 }
1890 }
1891}
1892#define DDR_PARAMETER_SOURCE_FROM_DMC_STICKY 1
1893#define DDR_PARAMETER_SOURCE_FROM_UBOOT_ENV 2
1894#define DDR_PARAMETER_SOURCE_FROM_UBOOT_IDME 3
1895#define DDR_PARAMETER_SOURCE_FROM_ORG_STICKY 4
1896
1897#define DDR_PARAMETER_READ 1
1898#define DDR_PARAMETER_WRITE 2
1899#define DDR_PARAMETER_LEFT 1
1900#define DDR_PARAMETER_RIGHT 2
1901
1902#define REGISTER_READ 1
1903#define REGISTER_WRITE 0
1904
1905typedef struct ddr_test_struct {
1906 unsigned int ddr_data_source;
1907 unsigned int ddr_data_test_size;
1908 unsigned int ddr_address_test_size;
1909 unsigned int ddr_test_watchdog_times_s;
1910 unsigned int ddr_test_lane_disable;
1911
1912 unsigned int ddr_test_window_flag[8];
1913 unsigned int ddr_test_window_data[100];
1914}ddr_test_struct_t;
1915ddr_test_struct_t *g_ddr_test_struct;
1916
1917unsigned int read_write_window_test_parameter(unsigned int source_index, unsigned int parameter_index, unsigned int parameter_value, unsigned int read_write_flag)
1918{
1919 if (source_index == DDR_PARAMETER_SOURCE_FROM_DMC_STICKY) {
1920 sticky_reg_base_add = (((p_ddr_base->ddr_dmc_sticky0)) & 0xffff);
1921
1922 if (read_write_flag == DDR_PARAMETER_WRITE)
1923 wr_reg((sticky_reg_base_add + (parameter_index << 2)), parameter_value);
1924 if (read_write_flag == DDR_PARAMETER_READ)
1925 parameter_value = rd_reg((sticky_reg_base_add + (parameter_index << 2)));
1926 }
1927
1928 if (source_index == DDR_PARAMETER_SOURCE_FROM_UBOOT_ENV) {
1929 char *pre_env_name = "ddr_test_data_num";
1930 char *env_name = "ddr_test_data_num_0000";
1931 char *str_buf = NULL;
1932 char *temp_s = NULL;
1933 char *endp = NULL;
1934 char buf[1024];
1935 str_buf = (char *)(&buf);
1936 memset(str_buf, 0, sizeof(buf));
1937 sprintf(env_name, "%s_%04d", pre_env_name, parameter_index);
1938 sprintf(buf, "0x%08x", parameter_value);
1939
1940 if (read_write_flag == DDR_PARAMETER_WRITE) {
1941 setenv(env_name, buf);
1942 run_command("save", 0);
1943 }
1944 if (read_write_flag == DDR_PARAMETER_READ) {
1945 temp_s = getenv(env_name);
1946 if (temp_s)
1947 parameter_value = simple_strtoull_ddr(temp_s, &endp, 0);
1948 else
1949 parameter_value = 0;
1950 }
1951 }
1952
1953 if (source_index == DDR_PARAMETER_SOURCE_FROM_ORG_STICKY) {
1954 sticky_reg_base_add = ((p_ddr_base->preg_sticky_reg0));
1955
1956 if (read_write_flag == DDR_PARAMETER_WRITE)
1957 wr_reg((sticky_reg_base_add + (parameter_index << 2)), parameter_value);
1958 if (read_write_flag == DDR_PARAMETER_READ)
1959 parameter_value = rd_reg((sticky_reg_base_add + (parameter_index << 2)));
1960 }
1961 return parameter_value;
1962}
1963
1964unsigned int read_write_window_test_flag(unsigned int source_index, unsigned int parameter_index, unsigned int parameter_value, unsigned int read_write_flag)
1965{
1966 if (source_index == DDR_PARAMETER_SOURCE_FROM_ORG_STICKY) {
1967 sticky_reg_base_add = p_ddr_base->preg_sticky_reg0;
1968
1969 if (read_write_flag == DDR_PARAMETER_WRITE)
1970 wr_reg((sticky_reg_base_add + (parameter_index << 2)), parameter_value);
1971 if (read_write_flag == DDR_PARAMETER_READ)
1972 parameter_value = rd_reg((sticky_reg_base_add + (parameter_index << 2)));
1973 }
1974
1975 if (source_index == DDR_PARAMETER_SOURCE_FROM_DMC_STICKY) {
1976 sticky_reg_base_add = (((p_ddr_base->ddr_dmc_sticky0)) & 0xffff);
1977
1978 if (read_write_flag == DDR_PARAMETER_WRITE)
1979 wr_reg((sticky_reg_base_add + (parameter_index << 2)), parameter_value);
1980 if (read_write_flag == DDR_PARAMETER_READ)
1981 parameter_value = rd_reg((sticky_reg_base_add + (parameter_index << 2)));
1982 }
1983
1984 if (source_index == DDR_PARAMETER_SOURCE_FROM_UBOOT_ENV) {
1985 char *pre_env_name = "ddr_test_data_num";
1986 char *env_name = "ddr_test_data_num_0000";
1987 char *str_buf = NULL;
1988 char *temp_s = NULL;
1989 char *endp = NULL;
1990 char buf[1024];
1991 str_buf = (char *)(&buf);
1992 memset(str_buf, 0, sizeof(buf));
1993 sprintf(env_name, "%s_%04d", pre_env_name, parameter_index);
1994 sprintf(buf, "0x%08x", parameter_value);
1995
1996 if (read_write_flag == DDR_PARAMETER_WRITE) {
1997 setenv(env_name, buf);
1998 run_command("save", 0);
1999 }
2000 if (read_write_flag == DDR_PARAMETER_READ) {
2001 temp_s = getenv(env_name);
2002 if (temp_s)
2003 parameter_value = simple_strtoull_ddr(temp_s, &endp, 0);
2004 else
2005 parameter_value = 0;
2006 }
2007 }
2008
2009 return parameter_value;
2010}
2011
2012void ddr_test_watchdog_init(uint32_t msec)
2013{
2014 // src: 24MHz
2015 // div: 24000 for 1ms
2016 // reset ao-22 and ee-21
2017 *(volatile uint32_t *)(unsigned long)(p_ddr_base->sys_watchdog_base_address) = (1 << 24) | (1 << 25) | (1 << 22) | (1 << 21) | (24000 - 1);
2018
2019 // set timeout
2020 *(volatile uint32_t *)(unsigned long)(p_ddr_base->sys_watchdog_base_address + 8) = msec;
2021 *(volatile uint32_t *)(unsigned long)(p_ddr_base->sys_watchdog_base_address + 12) = 0;
2022
2023 // enable
2024 *(volatile uint32_t *)(unsigned long)(p_ddr_base->sys_watchdog_base_address) |= (1 << 18);
2025}
2026
2027void ddr_test_watchdog_clear(void)
2028{
2029 *(volatile uint32_t *)(unsigned long)(p_ddr_base->sys_watchdog_base_address + 12) = 0;
2030}
2031
2032void ddr_test_watchdog_disable(void)
2033{
2034 // turn off internal counter and disable
2035 *(volatile uint32_t *)(unsigned long)(p_ddr_base->sys_watchdog_base_address) &= ~((1 << 18) | (1 << 25));
2036}
2037
2038void ddr_test_watchdog_enable(uint32_t sec)
2039{
2040 // src: 24MHz
2041 // div: 24000 for 1ms
2042 // reset ao-22 and ee-21
2043#if (CONFIG_DDR_PHY > P_DDR_PHY_DEFAULT)
2044 *(volatile uint32_t *)(unsigned long)(p_ddr_base->sys_watchdog_base_address) = (1 << 24) | (1 << 25) | (1 << 23) | (1 << 21) | (240000 - 1); //10ms
2045 if (sec * 100 > 0xffff)
2046 *(volatile uint32_t *)(unsigned long)(p_ddr_base->sys_watchdog_base_address + 8) = 0xffff;
2047 else
2048 *(volatile uint32_t *)(unsigned long)(p_ddr_base->sys_watchdog_base_address + 8) = sec * 100; //max 655s
2049 *(volatile uint32_t *)(unsigned long)(p_ddr_base->sys_watchdog_base_address + 12) = 0;
2050
2051 // enable
2052 *(volatile uint32_t *)(unsigned long)(p_ddr_base->sys_watchdog_base_address) = (*(volatile uint32_t *)(unsigned long)(p_ddr_base->sys_watchdog_base_address)) | (1 << 18);
2053#endif
2054 printf("\nP_WATCHDOG_ENABLE\n");
2055}
2056
2057void ddr_test_watchdog_reset_system(void)
2058{
2059 int i;
2060
2061 if (p_ddr_base->sys_watchdog_enable_value == 0) {
2062 p_ddr_base->sys_watchdog_enable_value = 0x3 | (1 << 21) // sys reset en
2063 | (1 << 23) // interrupt en
2064 | (1 << 24) // clk en
2065 | (1 << 25) // clk div en
2066 | (1 << 26); // sys reset now
2067 }
2068 writel(0, (p_ddr_base->sys_watchdog_base_address + 12));
2069 while (1) {
2070 writel(p_ddr_base->sys_watchdog_enable_value
2071 , (p_ddr_base->sys_watchdog_base_address));
2072 writel(0, (p_ddr_base->sys_watchdog_base_address + 12));
2073 writel((p_ddr_base->sys_watchdog_enable_value) | (1 << 18),
2074 (p_ddr_base->sys_watchdog_base_address)); // watchdog en
2075 for (i = 0; i < 100; i++)
2076 readl((p_ddr_base->sys_watchdog_base_address)); /*Deceive gcc for waiting some cycles */
2077 }
2078}
2079
2080static void ddr_write(void *buff, unsigned int m_length)
2081{
2082 unsigned int *p;
2083 unsigned int i, j, n;
2084 unsigned int m_len = m_length;
2085
2086 p = (unsigned int *)buff;
2087
2088 while (m_len) {
2089 for (j = 0; j < 32; j++) {
2090 if (m_len >= 128)
2091 n = 32;
2092 else
2093 n = m_len >> 2;
2094
2095 for (i = 0; i < n; i++) {
2096#ifdef DDR_PREFETCH_CACHE
2097 ddr_pld_cache(p);
2098#endif
2099 switch (i) {
2100 case 0:
2101 case 9:
2102 case 14:
2103 case 25:
2104 case 30:
2105 *(p + i) = TDATA32F;
2106 break;
2107 case 1:
2108 case 6:
2109 case 8:
2110 case 17:
2111 case 22:
2112 *(p + i) = 0;
2113 break;
2114 case 16:
2115 case 23:
2116 case 31:
2117 *(p + i) = TDATA32A;
2118 break;
2119 case 7:
2120 case 15:
2121 case 24:
2122 *(p + i) = TDATA325;
2123 break;
2124 case 2:
2125 case 4:
2126 case 10:
2127 case 12:
2128 case 19:
2129 case 21:
2130 case 27:
2131 case 29:
2132 *(p + i) = 1 << j;
2133 break;
2134 case 3:
2135 case 5:
2136 case 11:
2137 case 13:
2138 case 18:
2139 case 20:
2140 case 26:
2141 case 28:
2142 *(p + i) = ~(1 << j);
2143 break;
2144 }
2145 }
2146
2147 if (m_len > 128) {
2148 m_len -= 128;
2149 p += 32;
2150 } else {
2151 p += (m_len >> 2);
2152 m_len = 0;
2153 break;
2154 }
2155 }
2156 }
2157}
2158
2159static void ddr_read(void *buff, unsigned int m_length)
2160{
2161 unsigned int *p;
2162 unsigned int i, j, n;
2163 unsigned int m_len = m_length;
2164
2165 p = (unsigned int *)buff;
2166
2167 while (m_len) {
2168 for (j = 0; j < 32; j++) {
2169 if (m_len >= 128)
2170 n = 32;
2171 else
2172 n = m_len >> 2;
2173
2174 for (i = 0; i < n; i++) {
2175#ifdef DDR_PREFETCH_CACHE
2176 ddr_pld_cache(p);
2177#endif
2178 if ((error_outof_count_flag) && (error_count)) {
2179 printf("Error data out of count");
2180 m_len = 0;
2181 break;
2182 }
2183 switch (i) {
2184 case 0:
2185 case 9:
2186 case 14:
2187 case 25:
2188 case 30:
2189 if (*(p + i) != TDATA32F) {
2190 error_count++;
2191 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), TDATA32F);
2192 }
2193 break;
2194 case 1:
2195 case 6:
2196 case 8:
2197 case 17:
2198 case 22:
2199 if (*(p + i) != 0) {
2200 error_count++;
2201 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0);
2202 }
2203 break;
2204 case 16:
2205 case 23:
2206 case 31:
2207 if (*(p + i) != TDATA32A) {
2208 error_count++;
2209 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), TDATA32A);
2210 }
2211 break;
2212 case 7:
2213 case 15:
2214 case 24:
2215 if (*(p + i) != TDATA325) {
2216 error_count++;
2217 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), TDATA325);
2218 }
2219 break;
2220 case 2:
2221 case 4:
2222 case 10:
2223 case 12:
2224 case 19:
2225 case 21:
2226 case 27:
2227 case 29:
2228 if (*(p + i) != 1 << j) {
2229 error_count++;
2230 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 1 << j);
2231 }
2232 break;
2233 case 3:
2234 case 5:
2235 case 11:
2236 case 13:
2237 case 18:
2238 case 20:
2239 case 26:
2240 case 28:
2241 if (*(p + i) != ~(1 << j)) {
2242 error_count++;
2243 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~(1 << j));
2244 }
2245 break;
2246 }
2247 }
2248
2249 if (m_len > 128) {
2250 m_len -= 128;
2251 p += 32;
2252 } else {
2253 p += (m_len >> 2);
2254 m_len = 0;
2255 break;
2256 }
2257 }
2258 }
2259}
2260
2261static void ddr_write4(void *buff, unsigned int m_length)
2262{
2263 unsigned int *p;
2264 unsigned int i, j, n;
2265 unsigned int m_len = m_length;
2266
2267 p = (unsigned int *)buff;
2268
2269 while (m_len) {
2270 for (j = 0; j < 32; j++) {
2271 if (m_len >= 128)
2272 n = 32;
2273 else
2274 n = m_len >> 2;
2275
2276 for (i = 0; i < n; i++) {
2277#ifdef DDR_PREFETCH_CACHE
2278 ddr_pld_cache(p);
2279#endif
2280 switch (i) {
2281 case 0:
2282 case 1:
2283 case 2:
2284 case 3:
2285 *(p + i) = 0xff00ff00;
2286 break;
2287 case 4:
2288 case 5:
2289 case 6:
2290 case 7:
2291 *(p + i) = ~0xff00ff00;
2292 break;
2293 case 8:
2294 case 9:
2295 case 10:
2296 case 11:
2297 *(p + i) = 0xaa55aa55;
2298 break;
2299 case 12:
2300 case 13:
2301 case 14:
2302 case 15:
2303 *(p + i) = ~0xaa55aa55;
2304 break;
2305 case 16:
2306 case 17:
2307 case 18:
2308 case 19:
2309
2310 case 24:
2311 case 25:
2312 case 26:
2313 case 27:
2314 *(p + i) = 1 << j;
2315 break;
2316 case 20:
2317 case 21:
2318 case 22:
2319 case 23:
2320 case 28:
2321 case 29:
2322 case 30:
2323 case 31:
2324 *(p + i) = ~(1 << j);
2325 break;
2326 }
2327 }
2328
2329 if (m_len > 128) {
2330 m_len -= 128;
2331 p += 32;
2332 } else {
2333 p += (m_len >> 2);
2334 m_len = 0;
2335 break;
2336 }
2337 }
2338 }
2339}
2340
2341static void ddr_read4(void *buff, unsigned int m_length)
2342{
2343 unsigned int *p;
2344 unsigned int i, j, n;
2345 unsigned int m_len = m_length;
2346
2347 p = (unsigned int *)buff;
2348
2349 while (m_len) {
2350 for (j = 0; j < 32; j++) {
2351 if (m_len >= 128)
2352 n = 32;
2353 else
2354 n = m_len >> 2;
2355
2356 for (i = 0; i < n; i++) {
2357#ifdef DDR_PREFETCH_CACHE
2358 ddr_pld_cache(p);
2359#endif
2360 if ((error_outof_count_flag) && (error_count)) {
2361 printf("Error data out of count");
2362 m_len = 0;
2363 break;
2364 }
2365 switch (i) {
2366 case 0:
2367 case 1:
2368 case 2:
2369 case 3:
2370 if (*(p + i) != 0xff00ff00) {
2371 error_count++;
2372 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), TDATA32F);
2373 }
2374 break;
2375 case 4:
2376 case 5:
2377 case 6:
2378 case 7:
2379 if (*(p + i) != ~0xff00ff00) {
2380 error_count++;
2381 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), TDATA32F);
2382 }
2383 break;
2384 case 8:
2385 case 9:
2386 case 10:
2387 case 11:
2388 if (*(p + i) != 0xaa55aa55) {
2389 error_count++;
2390 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), TDATA32F);
2391 }
2392 break;
2393 case 12:
2394 case 13:
2395 case 14:
2396 case 15:
2397 if (*(p + i) != ~0xaa55aa55) {
2398 error_count++;
2399 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), TDATA32F);
2400 }
2401 break;
2402 case 16:
2403 case 17:
2404 case 18:
2405 case 19:
2406
2407 case 24:
2408 case 25:
2409 case 26:
2410 case 27:
2411 if (*(p + i) != (1 << j)) {
2412 error_count++;
2413 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), TDATA32F);
2414 }
2415 break;
2416 case 20:
2417 case 21:
2418 case 22:
2419 case 23:
2420 case 28:
2421 case 29:
2422 case 30:
2423 case 31:
2424 if (*(p + i) != ~(1 << j)) {
2425 error_count++;
2426 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), TDATA32F);
2427 }
2428 break;
2429 }
2430 }
2431
2432 if (m_len > 128) {
2433 m_len -= 128;
2434 p += 32;
2435 } else {
2436 p += (m_len >> 2);
2437 m_len = 0;
2438 break;
2439 }
2440 }
2441 }
2442}
2443
2444static void ddr_read_full(void *buff, unsigned int m_length, unsigned int start_pattern,
2445 unsigned int pattern_offset)
2446{
2447 unsigned int *p;
2448 unsigned int i = 0;
2449 unsigned int m_len = m_length & 0xfffffffc;
2450
2451 p = (unsigned int *)buff;
2452 while (m_len) {
2453 m_len = m_len - 4;
2454
2455#ifdef DDR_PREFETCH_CACHE
2456 ddr_pld_cache(p + i);
2457#endif
2458 if ((error_outof_count_flag) && (error_count)) {
2459 printf("Error data out of count");
2460 m_len = 0;
2461 break;
2462 }
2463 if ((*(p + i)) != (start_pattern + pattern_offset * i)) {
2464 error_count++;
2465 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i),
2466 (start_pattern + pattern_offset * i));
2467 }
2468 //break;
2469 i++;
2470 }
2471}
2472
2473static void ddr_write_full(void *buff, unsigned int m_length, unsigned int start_pattern,
2474 unsigned int pattern_offset)
2475{
2476 unsigned int *p;
2477 unsigned int i = 0;
2478 unsigned int m_len = m_length & 0xfffffffc;
2479
2480 p = (unsigned int *)buff;
2481 while (m_len) {
2482 m_len = m_len - 4;
2483 *(p + i) = start_pattern + pattern_offset * i;
2484 i++;
2485 }
2486}
2487
2488static void ddr_test_copy(void *addr_dest, void *addr_src, unsigned int memcpy_size)
2489{
2490 unsigned int *p_dest;
2491 unsigned int *p_src;
2492
2493 unsigned int m_len = memcpy_size;
2494
2495 p_dest = (unsigned int *)addr_dest;
2496 p_src = (unsigned int *)addr_src;
2497 m_len = m_len / 4; //assume it's multiple of 4
2498 while (m_len--) {
2499 ddr_pld_cache(p_src); //#define ddr_pld_cache(P) asm ("prfm PLDL1KEEP, [%0, #376]"::"r" (P))
2500 *p_dest++ = *p_src++;
2501 *p_dest++ = *p_src++;
2502 *p_dest++ = *p_src++;
2503 *p_dest++ = *p_src++;
2504 }
2505}
2506
2507int do_ddr_test_copy(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
2508{
2509 check_base_address();
2510 char *endp = NULL;
2511 unsigned long loop = 1;
2512 unsigned int print_flag = 1;
2513 unsigned int src_addr = DDR_TEST_START_ADDR;
2514 unsigned int dec_addr = DDR_TEST_START_ADDR + 0x8000000;
2515 unsigned int test_size = DDR_TEST_SIZE;
2516
2517
2518 print_flag = 1;
2519
2520 printf("\nargc== 0x%08x\n", argc);
2521 int i;
2522 for (i = 0; i < argc; i++)
2523 printf("\nargv[%d]=%s\n", i, argv[i]);
2524
2525 if (argc == 1) {
2526 src_addr = DDR_TEST_START_ADDR;
2527 loop = 1;
2528 }
2529
2530 if (argc > 2)
2531 if (*argv[2] == 0)
2532 src_addr = DDR_TEST_START_ADDR;
2533
2534 if (argc > 3) {
2535 src_addr = simple_strtoull_ddr(argv[1], &endp, 16);
2536 dec_addr = simple_strtoull_ddr(argv[2], &endp, 16);
2537 test_size = simple_strtoull_ddr(argv[3], &endp, 16);
2538 loop = 1;
2539 if (*argv[3] == 0 || *endp != 0)
2540 test_size = DDR_TEST_SIZE;
2541 }
2542 if (test_size < 0x1000)
2543 test_size = DDR_TEST_SIZE;
2544 if (argc > 4) {
2545 loop = simple_strtoull_ddr(argv[4], &endp, 16);
2546 if (*argv[4] == 0 || *endp != 0)
2547 loop = 1;
2548 }
2549 if (argc > 5) {
2550 print_flag = simple_strtoull_ddr(argv[5], &endp, 16);
2551 if (*argv[5] == 0 || *endp != 0)
2552 print_flag = 1;
2553 }
2554
2555 unsigned long time_start, time_end, test_loops;
2556 test_loops = loop;
2557 unsigned long size_count = 0;
2558 size_count = loop * test_size;
2559 time_start = get_us_time(); //us
2560
2561 do {
2562 ddr_test_copy((void *)(int_convter_p(dec_addr)), (void *)(int_convter_p(src_addr)), test_size);
2563 if (print_flag) {
2564 printf("\nloop==0x%08x", (unsigned int)loop);
2565 printf("\n \n");
2566 }
2567 } while (--loop);
2568 time_end = get_us_time(); //us
2569 printf("\ncopy %d times use %dus\n \n", (unsigned int)test_loops, (unsigned int)(time_end - time_start));
2570
2571 printf("\nddr copy bandwidth==%d MBYTE/S \n \n", (unsigned int)(size_count / (time_end - time_start)));
2572 printf("\rEnd ddr test. \n");
2573
2574 unsigned int m_len = 0, counter = 0;
2575 unsigned int *p_dest;
2576 p_dest = (void *)(int_convter_p(dec_addr));
2577 m_len = test_size / 4; //assume it's multiple of 4
2578 counter = (unsigned int)test_loops;
2579 size_count = counter * test_size;
2580 time_start = get_us_time(); //us
2581 do {
2582 loop = 1;
2583 m_len = test_size / 4;
2584 while (m_len--) {
2585 ddr_pld_cache(p_dest);
2586 *p_dest++ = 0x12345678;
2587 *p_dest++ = 0x12345678;
2588 *p_dest++ = 0x12345678;
2589 *p_dest++ = 0x12345678;
2590 }
2591 } while (--counter);
2592 time_end = get_us_time(); //us
2593 printf("\nwrite %d bytes use %dus\n \n", (unsigned int)test_size, (unsigned int)(time_end - time_start));
2594
2595 printf("\nddr write bandwidth==%d MBYTE/S \n \n", (unsigned int)(size_count / (time_end - time_start)));
2596
2597 unsigned int *p_src;
2598 p_src = (void *)(int_convter_p(src_addr));
2599 m_len = test_size / 4; //assume it's multiple of 4
2600 unsigned int temp0 = 0;
2601 counter = (unsigned int)test_loops;
2602 size_count = counter * test_size;
2603
2604 time_start = get_us_time(); //us
2605 do {
2606 loop = 1;
2607 m_len = test_size / 4;
2608 while (m_len--) {
2609#ifdef DDR_PREFETCH_CACHE
2610 __asm__ __volatile__ ("prfm PLDL1KEEP, [%0, #376]" ::"r" (p_src));
2611#endif
2612 p_src++;
2613 temp0 = (*p_src);
2614 m_len--;
2615 m_len--;
2616 m_len--;
2617 m_len--;
2618 m_len--;
2619 m_len--;
2620 m_len--;
2621 }
2622 } while (--counter);
2623 *p_dest++ = temp0;
2624 *p_dest++ = *p_src;
2625 *p_dest++ = *p_src;
2626 *p_dest++ = *p_src;
2627 time_end = get_us_time(); //us
2628
2629 printf("\nread %d Kbytes use %dus\n \n", (unsigned int)(size_count / 1000), (unsigned int)(time_end - time_start));
2630 printf("\nddr read bandwidth==%d MBYTE/S \n \n", (unsigned int)(size_count / (time_end - time_start)));
2631
2632 return 0;
2633}
2634
2635U_BOOT_CMD(
2636 ddr_test_copy, 7, 1, do_ddr_test_copy,
2637 "ddr_test_copy function",
2638 "ddr_test_copy 0x08000000 0x10000000 0x02000000 1 0 ? \n"
2639 );
2640
2641
2642#define DDR_PATTERN_LOOP_1 32
2643#define DDR_PATTERN_LOOP_2 64
2644#define DDR_PATTERN_LOOP_3 96
2645
2646static void ddr_write_pattern4_cross_talk_p(void *buff, unsigned int m_length)
2647{
2648 unsigned int *p;
2649 unsigned int i, n;
2650 unsigned int m_len = m_length;
2651
2652 p = (unsigned int *)buff;
2653
2654 while (m_len) {
2655 {
2656 if (m_len >= 128 * 4)
2657 n = 32 * 4;
2658 else
2659 n = m_len >> 2;
2660
2661 for (i = 0; i < n; i++) {
2662#ifdef DDR_PREFETCH_CACHE
2663 ddr_pld_cache(p);
2664#endif
2665 switch (i) {
2666 case 0:
2667 case 1:
2668 case 2:
2669 case 3:
2670 case 8:
2671 case 9:
2672 case 10:
2673 case 11:
2674 case 16:
2675 case 17:
2676 case 18:
2677 case 19:
2678 case 24:
2679 case 25:
2680 case 26:
2681 case 27:
2682 *(p + i) = TDATA32F;
2683 break;
2684 case 4:
2685 case 5:
2686 case 6:
2687 case 7:
2688 case 12:
2689 case 13:
2690 case 14:
2691 case 15:
2692 case 20:
2693 case 21:
2694 case 22:
2695 case 23:
2696 case 28:
2697 case 29:
2698 case 30:
2699 case 31:
2700 *(p + i) = 0;
2701 break;
2702 case DDR_PATTERN_LOOP_1 + 0:
2703 case DDR_PATTERN_LOOP_1 + 1:
2704 case DDR_PATTERN_LOOP_1 + 2:
2705 case DDR_PATTERN_LOOP_1 + 3:
2706 case DDR_PATTERN_LOOP_1 + 8:
2707 case DDR_PATTERN_LOOP_1 + 9:
2708 case DDR_PATTERN_LOOP_1 + 10:
2709 case DDR_PATTERN_LOOP_1 + 11:
2710 case DDR_PATTERN_LOOP_1 + 16:
2711 case DDR_PATTERN_LOOP_1 + 17:
2712 case DDR_PATTERN_LOOP_1 + 18:
2713 case DDR_PATTERN_LOOP_1 + 19:
2714 case DDR_PATTERN_LOOP_1 + 24:
2715 case DDR_PATTERN_LOOP_1 + 25:
2716 case DDR_PATTERN_LOOP_1 + 26:
2717 case DDR_PATTERN_LOOP_1 + 27:
2718 *(p + i) = TDATA32A;
2719 break;
2720 case DDR_PATTERN_LOOP_1 + 4:
2721 case DDR_PATTERN_LOOP_1 + 5:
2722 case DDR_PATTERN_LOOP_1 + 6:
2723 case DDR_PATTERN_LOOP_1 + 7:
2724 case DDR_PATTERN_LOOP_1 + 12:
2725 case DDR_PATTERN_LOOP_1 + 13:
2726 case DDR_PATTERN_LOOP_1 + 14:
2727 case DDR_PATTERN_LOOP_1 + 15:
2728 case DDR_PATTERN_LOOP_1 + 20:
2729 case DDR_PATTERN_LOOP_1 + 21:
2730 case DDR_PATTERN_LOOP_1 + 22:
2731 case DDR_PATTERN_LOOP_1 + 23:
2732 case DDR_PATTERN_LOOP_1 + 28:
2733 case DDR_PATTERN_LOOP_1 + 29:
2734 case DDR_PATTERN_LOOP_1 + 30:
2735 case DDR_PATTERN_LOOP_1 + 31:
2736 *(p + i) = TDATA325;
2737 break;
2738 case DDR_PATTERN_LOOP_2 + 0:
2739 case DDR_PATTERN_LOOP_2 + 1:
2740 case DDR_PATTERN_LOOP_2 + 2:
2741 case DDR_PATTERN_LOOP_2 + 3:
2742 *(p + i) = 0xfe01fe01;
2743 break;
2744 case DDR_PATTERN_LOOP_2 + 4:
2745 case DDR_PATTERN_LOOP_2 + 5:
2746 case DDR_PATTERN_LOOP_2 + 6:
2747 case DDR_PATTERN_LOOP_2 + 7:
2748 *(p + i) = 0xfd02fd02;
2749 break;
2750 case DDR_PATTERN_LOOP_2 + 8:
2751 case DDR_PATTERN_LOOP_2 + 9:
2752 case DDR_PATTERN_LOOP_2 + 10:
2753 case DDR_PATTERN_LOOP_2 + 11:
2754 *(p + i) = 0xfb04fb04;
2755 break;
2756 case DDR_PATTERN_LOOP_2 + 12:
2757 case DDR_PATTERN_LOOP_2 + 13:
2758 case DDR_PATTERN_LOOP_2 + 14:
2759 case DDR_PATTERN_LOOP_2 + 15:
2760 *(p + i) = 0xf708f708;
2761 break;
2762 case DDR_PATTERN_LOOP_2 + 16:
2763 case DDR_PATTERN_LOOP_2 + 17:
2764 case DDR_PATTERN_LOOP_2 + 18:
2765 case DDR_PATTERN_LOOP_2 + 19:
2766 *(p + i) = 0xef10ef10;
2767 break;
2768 case DDR_PATTERN_LOOP_2 + 20:
2769 case DDR_PATTERN_LOOP_2 + 21:
2770 case DDR_PATTERN_LOOP_2 + 22:
2771 case DDR_PATTERN_LOOP_2 + 23:
2772 *(p + i) = 0xdf20df20;
2773 break;
2774 case DDR_PATTERN_LOOP_2 + 24:
2775 case DDR_PATTERN_LOOP_2 + 25:
2776 case DDR_PATTERN_LOOP_2 + 26:
2777 case DDR_PATTERN_LOOP_2 + 27:
2778 *(p + i) = 0xbf40bf40;
2779 break;
2780 case DDR_PATTERN_LOOP_2 + 28:
2781 case DDR_PATTERN_LOOP_2 + 29:
2782 case DDR_PATTERN_LOOP_2 + 30:
2783 case DDR_PATTERN_LOOP_2 + 31:
2784 *(p + i) = 0x7f807f80;
2785 break;
2786 case DDR_PATTERN_LOOP_3 + 0:
2787 case DDR_PATTERN_LOOP_3 + 1:
2788 case DDR_PATTERN_LOOP_3 + 2:
2789 case DDR_PATTERN_LOOP_3 + 3:
2790 *(p + i) = 0x00000100;
2791 break;
2792 case DDR_PATTERN_LOOP_3 + 4:
2793 case DDR_PATTERN_LOOP_3 + 5:
2794 case DDR_PATTERN_LOOP_3 + 6:
2795 case DDR_PATTERN_LOOP_3 + 7:
2796 *(p + i) = 0x00000200;
2797 break;
2798 case DDR_PATTERN_LOOP_3 + 8:
2799 case DDR_PATTERN_LOOP_3 + 9:
2800 case DDR_PATTERN_LOOP_3 + 10:
2801 case DDR_PATTERN_LOOP_3 + 11:
2802 *(p + i) = 0x00000400;
2803 break;
2804 case DDR_PATTERN_LOOP_3 + 12:
2805 case DDR_PATTERN_LOOP_3 + 13:
2806 case DDR_PATTERN_LOOP_3 + 14:
2807 case DDR_PATTERN_LOOP_3 + 15:
2808 *(p + i) = 0x00000800;
2809 break;
2810 case DDR_PATTERN_LOOP_3 + 16:
2811 case DDR_PATTERN_LOOP_3 + 17:
2812 case DDR_PATTERN_LOOP_3 + 18:
2813 case DDR_PATTERN_LOOP_3 + 19:
2814 *(p + i) = 0x00001000;
2815 break;
2816 case DDR_PATTERN_LOOP_3 + 20:
2817 case DDR_PATTERN_LOOP_3 + 21:
2818 case DDR_PATTERN_LOOP_3 + 22:
2819 case DDR_PATTERN_LOOP_3 + 23:
2820 *(p + i) = 0x00002000;
2821 break;
2822 case DDR_PATTERN_LOOP_3 + 24:
2823 case DDR_PATTERN_LOOP_3 + 25:
2824 case DDR_PATTERN_LOOP_3 + 26:
2825 case DDR_PATTERN_LOOP_3 + 27:
2826 *(p + i) = 0x00004000;
2827 break;
2828 case DDR_PATTERN_LOOP_3 + 28:
2829 case DDR_PATTERN_LOOP_3 + 29:
2830 case DDR_PATTERN_LOOP_3 + 30:
2831 case DDR_PATTERN_LOOP_3 + 31:
2832 *(p + i) = 0x00008000;
2833 break;
2834 }
2835 }
2836
2837 if (m_len > (128 * 4)) {
2838 m_len -= (128 * 4);
2839 p += 32 * 4;
2840 } else {
2841 p += (m_len >> 2);
2842 m_len = 0;
2843 break;
2844 }
2845 }
2846 }
2847}
2848
2849static void ddr_write_pattern4_cross_talk_p2(void *buff, unsigned int m_length)
2850{
2851 unsigned int *p;
2852 unsigned int i, n;
2853 unsigned int m_len = m_length;
2854
2855 p = (unsigned int *)buff;
2856
2857 while (m_len) {
2858 {
2859 if (m_len >= 128 * 4)
2860 n = 32 * 4;
2861 else
2862 n = m_len >> 2;
2863
2864 for (i = 0; i < n; i++) {
2865#ifdef DDR_PREFETCH_CACHE
2866 ddr_pld_cache(p);
2867#endif
2868
2869 switch (i) {
2870 case 0:
2871 case DDR_PATTERN_LOOP_1 + 1:
2872 case DDR_PATTERN_LOOP_2 + 2:
2873 case DDR_PATTERN_LOOP_3 + 3:
2874 *(p + i) = 0xfe01fe01;
2875 break;
2876 case 4:
2877 case DDR_PATTERN_LOOP_1 + 5:
2878 case DDR_PATTERN_LOOP_2 + 6:
2879 case DDR_PATTERN_LOOP_3 + 7:
2880 *(p + i) = 0xfd02fd02;
2881 break;
2882
2883 case 8:
2884 case DDR_PATTERN_LOOP_1 + 9:
2885 case DDR_PATTERN_LOOP_2 + 10:
2886 case DDR_PATTERN_LOOP_3 + 11:
2887 *(p + i) = 0xfb04fb04;
2888 break;
2889
2890 case 12:
2891 case DDR_PATTERN_LOOP_1 + 13:
2892 case DDR_PATTERN_LOOP_2 + 14:
2893 case DDR_PATTERN_LOOP_3 + 15:
2894 *(p + i) = 0xf708f708;
2895 break;
2896
2897 case 16:
2898 case DDR_PATTERN_LOOP_1 + 17:
2899 case DDR_PATTERN_LOOP_2 + 18:
2900 case DDR_PATTERN_LOOP_3 + 19:
2901 *(p + i) = 0xef10ef10;
2902 break;
2903
2904 case 20:
2905 case DDR_PATTERN_LOOP_1 + 21:
2906 case DDR_PATTERN_LOOP_2 + 22:
2907 case DDR_PATTERN_LOOP_3 + 23:
2908 *(p + i) = 0xdf20df20;
2909 break;
2910
2911 case 24:
2912 case DDR_PATTERN_LOOP_1 + 25:
2913 case DDR_PATTERN_LOOP_2 + 26:
2914 case DDR_PATTERN_LOOP_3 + 27:
2915 *(p + i) = 0xbf40bf40;
2916 break;
2917
2918 case 28:
2919 case DDR_PATTERN_LOOP_1 + 29:
2920 case DDR_PATTERN_LOOP_2 + 30:
2921 case DDR_PATTERN_LOOP_3 + 31:
2922 *(p + i) = 0x7f807f80;
2923 break;
2924
2925
2926 default:
2927
2928 *(p + i) = 0xff00ff00;
2929 break;
2930
2931 break;
2932 }
2933 }
2934
2935 if (m_len > (128 * 4)) {
2936 m_len -= (128 * 4);
2937 p += 32 * 4;
2938 } else {
2939 p += (m_len >> 2);
2940 m_len = 0;
2941 break;
2942 }
2943 }
2944 }
2945}
2946
2947static void ddr_read_pattern4_cross_talk_p(void *buff, unsigned int m_length)
2948{
2949 unsigned int *p;
2950 unsigned int i, n;
2951 unsigned int m_len = m_length;
2952
2953 p = (unsigned int *)buff;
2954
2955 while (m_len) {
2956 {
2957 if (m_len >= 128 * 4)
2958 n = 32 * 4;
2959 else
2960 n = m_len >> 2;
2961
2962 for (i = 0; i < n; i++) {
2963#ifdef DDR_PREFETCH_CACHE
2964 ddr_pld_cache(p);
2965#endif
2966 if ((error_outof_count_flag) && (error_count)) {
2967 printf("Error data out of count");
2968 m_len = 0;
2969 break;
2970 }
2971
2972 switch (i) {
2973 case 0:
2974 case 1:
2975 case 2:
2976 case 3:
2977 case 8:
2978 case 9:
2979 case 10:
2980 case 11:
2981 case 16:
2982 case 17:
2983 case 18:
2984 case 19:
2985 case 24:
2986 case 25:
2987 case 26:
2988 case 27:
2989 if (*(p + i) != TDATA32F) {
2990 error_count++;
2991 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), TDATA32F);
2992 break;
2993 }
2994 break;
2995 case 4:
2996 case 5:
2997 case 6:
2998 case 7:
2999 case 12:
3000 case 13:
3001 case 14:
3002 case 15:
3003 case 20:
3004 case 21:
3005 case 22:
3006 case 23:
3007 case 28:
3008 case 29:
3009 case 30:
3010 case 31:
3011 if (*(p + i) != 0) {
3012 error_count++;
3013 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0);
3014 break;
3015 }
3016 break;
3017 case DDR_PATTERN_LOOP_1 + 0:
3018 case DDR_PATTERN_LOOP_1 + 1:
3019 case DDR_PATTERN_LOOP_1 + 2:
3020 case DDR_PATTERN_LOOP_1 + 3:
3021 case DDR_PATTERN_LOOP_1 + 8:
3022 case DDR_PATTERN_LOOP_1 + 9:
3023 case DDR_PATTERN_LOOP_1 + 10:
3024 case DDR_PATTERN_LOOP_1 + 11:
3025 case DDR_PATTERN_LOOP_1 + 16:
3026 case DDR_PATTERN_LOOP_1 + 17:
3027 case DDR_PATTERN_LOOP_1 + 18:
3028 case DDR_PATTERN_LOOP_1 + 19:
3029 case DDR_PATTERN_LOOP_1 + 24:
3030 case DDR_PATTERN_LOOP_1 + 25:
3031 case DDR_PATTERN_LOOP_1 + 26:
3032 case DDR_PATTERN_LOOP_1 + 27:
3033 if (*(p + i) != TDATA32A) {
3034 error_count++;
3035 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), TDATA32A);
3036 break;
3037 }
3038 break;
3039 case DDR_PATTERN_LOOP_1 + 4:
3040 case DDR_PATTERN_LOOP_1 + 5:
3041 case DDR_PATTERN_LOOP_1 + 6:
3042 case DDR_PATTERN_LOOP_1 + 7:
3043 case DDR_PATTERN_LOOP_1 + 12:
3044 case DDR_PATTERN_LOOP_1 + 13:
3045 case DDR_PATTERN_LOOP_1 + 14:
3046 case DDR_PATTERN_LOOP_1 + 15:
3047 case DDR_PATTERN_LOOP_1 + 20:
3048 case DDR_PATTERN_LOOP_1 + 21:
3049 case DDR_PATTERN_LOOP_1 + 22:
3050 case DDR_PATTERN_LOOP_1 + 23:
3051 case DDR_PATTERN_LOOP_1 + 28:
3052 case DDR_PATTERN_LOOP_1 + 29:
3053 case DDR_PATTERN_LOOP_1 + 30:
3054 case DDR_PATTERN_LOOP_1 + 31:
3055 if (*(p + i) != TDATA325) {
3056 error_count++;
3057 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), TDATA325);
3058 break;
3059 }
3060 break;
3061 case DDR_PATTERN_LOOP_2 + 0:
3062 case DDR_PATTERN_LOOP_2 + 1:
3063 case DDR_PATTERN_LOOP_2 + 2:
3064 case DDR_PATTERN_LOOP_2 + 3:
3065 if (*(p + i) != 0xfe01fe01) {
3066 error_count++;
3067 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xfe01fe01);
3068 break;
3069 }
3070 break;
3071 case DDR_PATTERN_LOOP_2 + 4:
3072 case DDR_PATTERN_LOOP_2 + 5:
3073 case DDR_PATTERN_LOOP_2 + 6:
3074 case DDR_PATTERN_LOOP_2 + 7:
3075 if (*(p + i) != 0xfd02fd02) {
3076 error_count++;
3077 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xfd02fd02);
3078 break;
3079 }
3080 break;
3081 case DDR_PATTERN_LOOP_2 + 8:
3082 case DDR_PATTERN_LOOP_2 + 9:
3083 case DDR_PATTERN_LOOP_2 + 10:
3084 case DDR_PATTERN_LOOP_2 + 11:
3085 if (*(p + i) != 0xfb04fb04) {
3086 error_count++;
3087 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xfb04fb04);
3088 break;
3089 }
3090 break;
3091 case DDR_PATTERN_LOOP_2 + 12:
3092 case DDR_PATTERN_LOOP_2 + 13:
3093 case DDR_PATTERN_LOOP_2 + 14:
3094 case DDR_PATTERN_LOOP_2 + 15:
3095 if (*(p + i) != 0xf708f708) {
3096 error_count++;
3097 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xf708f708);
3098 break;
3099 }
3100 break;
3101 case DDR_PATTERN_LOOP_2 + 16:
3102 case DDR_PATTERN_LOOP_2 + 17:
3103 case DDR_PATTERN_LOOP_2 + 18:
3104 case DDR_PATTERN_LOOP_2 + 19:
3105 if (*(p + i) != 0xef10ef10) {
3106 error_count++;
3107 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xef10ef10);
3108 break;
3109 }
3110 break;
3111 case DDR_PATTERN_LOOP_2 + 20:
3112 case DDR_PATTERN_LOOP_2 + 21:
3113 case DDR_PATTERN_LOOP_2 + 22:
3114 case DDR_PATTERN_LOOP_2 + 23:
3115 if (*(p + i) != 0xdf20df20) {
3116 error_count++;
3117 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xdf20df20);
3118 break;
3119 }
3120 break;
3121 case DDR_PATTERN_LOOP_2 + 24:
3122 case DDR_PATTERN_LOOP_2 + 25:
3123 case DDR_PATTERN_LOOP_2 + 26:
3124 case DDR_PATTERN_LOOP_2 + 27:
3125 if (*(p + i) != 0xbf40bf40) {
3126 error_count++;
3127 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xbf40bf40);
3128 break;
3129 }
3130 break;
3131 case DDR_PATTERN_LOOP_2 + 28:
3132 case DDR_PATTERN_LOOP_2 + 29:
3133 case DDR_PATTERN_LOOP_2 + 30:
3134 case DDR_PATTERN_LOOP_2 + 31:
3135 if (*(p + i) != 0x7f807f80) {
3136 error_count++;
3137 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0x7f807f80);
3138 break;
3139 }
3140 break;
3141 case DDR_PATTERN_LOOP_3 + 0:
3142 case DDR_PATTERN_LOOP_3 + 1:
3143 case DDR_PATTERN_LOOP_3 + 2:
3144 case DDR_PATTERN_LOOP_3 + 3:
3145 if (*(p + i) != 0x00000100) {
3146 error_count++;
3147 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0x00000100);
3148 break;
3149 }
3150 break;
3151 case DDR_PATTERN_LOOP_3 + 4:
3152 case DDR_PATTERN_LOOP_3 + 5:
3153 case DDR_PATTERN_LOOP_3 + 6:
3154 case DDR_PATTERN_LOOP_3 + 7:
3155 if (*(p + i) != 0x00000200) {
3156 error_count++;
3157 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0x00000200);
3158 break;
3159 }
3160 break;
3161 case DDR_PATTERN_LOOP_3 + 8:
3162 case DDR_PATTERN_LOOP_3 + 9:
3163 case DDR_PATTERN_LOOP_3 + 10:
3164 case DDR_PATTERN_LOOP_3 + 11:
3165 if (*(p + i) != 0x00000400) {
3166 error_count++;
3167 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0x00000400);
3168 break;
3169 }
3170 break;
3171 case DDR_PATTERN_LOOP_3 + 12:
3172 case DDR_PATTERN_LOOP_3 + 13:
3173 case DDR_PATTERN_LOOP_3 + 14:
3174 case DDR_PATTERN_LOOP_3 + 15:
3175 if (*(p + i) != 0x00000800) {
3176 error_count++;
3177 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0x00000800);
3178 break;
3179 }
3180 break;
3181 case DDR_PATTERN_LOOP_3 + 16:
3182 case DDR_PATTERN_LOOP_3 + 17:
3183 case DDR_PATTERN_LOOP_3 + 18:
3184 case DDR_PATTERN_LOOP_3 + 19:
3185 if (*(p + i) != 0x00001000) {
3186 error_count++;
3187 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0x00001000);
3188 break;
3189 }
3190 break;
3191 case DDR_PATTERN_LOOP_3 + 20:
3192 case DDR_PATTERN_LOOP_3 + 21:
3193 case DDR_PATTERN_LOOP_3 + 22:
3194 case DDR_PATTERN_LOOP_3 + 23:
3195 if (*(p + i) != 0x00002000) {
3196 error_count++;
3197 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0x00002000);
3198 }
3199 break;
3200 case DDR_PATTERN_LOOP_3 + 24:
3201 case DDR_PATTERN_LOOP_3 + 25:
3202 case DDR_PATTERN_LOOP_3 + 26:
3203 case DDR_PATTERN_LOOP_3 + 27:
3204 if (*(p + i) != 0x00004000) {
3205 error_count++;
3206 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0x00004000);
3207 break;
3208 }
3209 break;
3210 case DDR_PATTERN_LOOP_3 + 28:
3211 case DDR_PATTERN_LOOP_3 + 29:
3212 case DDR_PATTERN_LOOP_3 + 30:
3213 case DDR_PATTERN_LOOP_3 + 31:
3214 if (*(p + i) != 0x00008000) {
3215 error_count++;
3216 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0x00008000);
3217 break;
3218 }
3219 break;
3220 }
3221 }
3222
3223 if (m_len > 128 * 4) {
3224 m_len -= 128 * 4;
3225 p += 32 * 4;
3226 } else {
3227 p += (m_len >> 2);
3228 m_len = 0;
3229 break;
3230 }
3231 }
3232 }
3233}
3234
3235static void ddr_read_pattern4_cross_talk_p2(void *buff, unsigned int m_length)
3236{
3237 unsigned int *p;
3238 unsigned int i, n;
3239 unsigned int m_len = m_length;
3240
3241 p = (unsigned int *)buff;
3242
3243 while (m_len) {
3244 {
3245 if (m_len >= 128 * 4)
3246 n = 32 * 4;
3247 else
3248 n = m_len >> 2;
3249
3250 for (i = 0; i < n; i++) {
3251#ifdef DDR_PREFETCH_CACHE
3252 ddr_pld_cache(p);
3253#endif
3254 if ((error_outof_count_flag) && (error_count)) {
3255 printf("Error data out of count");
3256 m_len = 0;
3257 break;
3258 }
3259
3260 switch (i) {
3261 case 0:
3262 case DDR_PATTERN_LOOP_1 + 1:
3263 case DDR_PATTERN_LOOP_2 + 2:
3264 case DDR_PATTERN_LOOP_3 + 3:
3265 if (*(p + i) != 0xfe01fe01) {
3266 error_count++;
3267 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xfe01fe01);
3268 break;
3269 }
3270 break;
3271 case 4:
3272 case DDR_PATTERN_LOOP_1 + 5:
3273 case DDR_PATTERN_LOOP_2 + 6:
3274 case DDR_PATTERN_LOOP_3 + 7:
3275 if (*(p + i) != 0xfd02fd02) {
3276 error_count++;
3277 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xfd02fd02);
3278 break;
3279 }
3280 break;
3281
3282 case 8:
3283 case DDR_PATTERN_LOOP_1 + 9:
3284 case DDR_PATTERN_LOOP_2 + 10:
3285 case DDR_PATTERN_LOOP_3 + 11:
3286 if (*(p + i) != 0xfb04fb04) {
3287 error_count++;
3288 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xfb04fb04);
3289 break;
3290 }
3291 break;
3292
3293 case 12:
3294 case DDR_PATTERN_LOOP_1 + 13:
3295 case DDR_PATTERN_LOOP_2 + 14:
3296 case DDR_PATTERN_LOOP_3 + 15:
3297 if (*(p + i) != 0xf708f708) {
3298 error_count++;
3299 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xf708f708);
3300 break;
3301 }
3302 break;
3303
3304 case 16:
3305 case DDR_PATTERN_LOOP_1 + 17:
3306 case DDR_PATTERN_LOOP_2 + 18:
3307 case DDR_PATTERN_LOOP_3 + 19:
3308 if (*(p + i) != 0xef10ef10) {
3309 error_count++;
3310 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xef10ef10);
3311 break;
3312 }
3313 break;
3314
3315 case 20:
3316 case DDR_PATTERN_LOOP_1 + 21:
3317 case DDR_PATTERN_LOOP_2 + 22:
3318 case DDR_PATTERN_LOOP_3 + 23:
3319 if (*(p + i) != 0xdf20df20) {
3320 error_count++;
3321 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xdf20df20);
3322 break;
3323 }
3324 break;
3325
3326 case 24:
3327 case DDR_PATTERN_LOOP_1 + 25:
3328 case DDR_PATTERN_LOOP_2 + 26:
3329 case DDR_PATTERN_LOOP_3 + 27:
3330 if (*(p + i) != 0xbf40bf40) {
3331 error_count++;
3332 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xbf40bf40);
3333 break;
3334 }
3335 break;
3336 case 28:
3337 case DDR_PATTERN_LOOP_1 + 29:
3338 case DDR_PATTERN_LOOP_2 + 30:
3339 case DDR_PATTERN_LOOP_3 + 31:
3340 if (*(p + i) != 0x7f807f80) {
3341 error_count++;
3342 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0x7f807f80);
3343 break;
3344 }
3345 break;
3346
3347
3348 default:
3349 if (*(p + i) != 0xff00ff00) {
3350 error_count++;
3351 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xff00ff00);
3352 break;
3353 }
3354 break;
3355
3356 break;
3357 }
3358 }
3359
3360 if (m_len > 128 * 4) {
3361 m_len -= 128 * 4;
3362 p += 32 * 4;
3363 } else {
3364 p += (m_len >> 2);
3365 m_len = 0;
3366 break;
3367 }
3368 }
3369 }
3370}
3371
3372static void ddr_write_pattern4_cross_talk_n(void *buff, unsigned int m_length)
3373{
3374 unsigned int *p;
3375 unsigned int i, n;
3376 unsigned int m_len = m_length;
3377
3378 p = (unsigned int *)buff;
3379
3380 while (m_len) {
3381 {
3382 if (m_len >= 128 * 4)
3383 n = 32 * 4;
3384 else
3385 n = m_len >> 2;
3386
3387 for (i = 0; i < n; i++) {
3388#ifdef DDR_PREFETCH_CACHE
3389 ddr_pld_cache(p);
3390#endif
3391 switch (i) {
3392 case 0:
3393 case 1:
3394 case 2:
3395 case 3:
3396 case 8:
3397 case 9:
3398 case 10:
3399 case 11:
3400 case 16:
3401 case 17:
3402 case 18:
3403 case 19:
3404 case 24:
3405 case 25:
3406 case 26:
3407 case 27:
3408 *(p + i) = ~TDATA32F;
3409 break;
3410 case 4:
3411 case 5:
3412 case 6:
3413 case 7:
3414 case 12:
3415 case 13:
3416 case 14:
3417 case 15:
3418 case 20:
3419 case 21:
3420 case 22:
3421 case 23:
3422 case 28:
3423 case 29:
3424 case 30:
3425 case 31:
3426 *(p + i) = ~0;
3427 break;
3428 case DDR_PATTERN_LOOP_1 + 0:
3429 case DDR_PATTERN_LOOP_1 + 1:
3430 case DDR_PATTERN_LOOP_1 + 2:
3431 case DDR_PATTERN_LOOP_1 + 3:
3432 case DDR_PATTERN_LOOP_1 + 8:
3433 case DDR_PATTERN_LOOP_1 + 9:
3434 case DDR_PATTERN_LOOP_1 + 10:
3435 case DDR_PATTERN_LOOP_1 + 11:
3436 case DDR_PATTERN_LOOP_1 + 16:
3437 case DDR_PATTERN_LOOP_1 + 17:
3438 case DDR_PATTERN_LOOP_1 + 18:
3439 case DDR_PATTERN_LOOP_1 + 19:
3440 case DDR_PATTERN_LOOP_1 + 24:
3441 case DDR_PATTERN_LOOP_1 + 25:
3442 case DDR_PATTERN_LOOP_1 + 26:
3443 case DDR_PATTERN_LOOP_1 + 27:
3444 *(p + i) = ~TDATA32A;
3445 break;
3446 case DDR_PATTERN_LOOP_1 + 4:
3447 case DDR_PATTERN_LOOP_1 + 5:
3448 case DDR_PATTERN_LOOP_1 + 6:
3449 case DDR_PATTERN_LOOP_1 + 7:
3450 case DDR_PATTERN_LOOP_1 + 12:
3451 case DDR_PATTERN_LOOP_1 + 13:
3452 case DDR_PATTERN_LOOP_1 + 14:
3453 case DDR_PATTERN_LOOP_1 + 15:
3454 case DDR_PATTERN_LOOP_1 + 20:
3455 case DDR_PATTERN_LOOP_1 + 21:
3456 case DDR_PATTERN_LOOP_1 + 22:
3457 case DDR_PATTERN_LOOP_1 + 23:
3458 case DDR_PATTERN_LOOP_1 + 28:
3459 case DDR_PATTERN_LOOP_1 + 29:
3460 case DDR_PATTERN_LOOP_1 + 30:
3461 case DDR_PATTERN_LOOP_1 + 31:
3462 *(p + i) = ~TDATA325;
3463 break;
3464 case DDR_PATTERN_LOOP_2 + 0:
3465 case DDR_PATTERN_LOOP_2 + 1:
3466 case DDR_PATTERN_LOOP_2 + 2:
3467 case DDR_PATTERN_LOOP_2 + 3:
3468 *(p + i) = ~0xfe01fe01;
3469 break;
3470 case DDR_PATTERN_LOOP_2 + 4:
3471 case DDR_PATTERN_LOOP_2 + 5:
3472 case DDR_PATTERN_LOOP_2 + 6:
3473 case DDR_PATTERN_LOOP_2 + 7:
3474 *(p + i) = ~0xfd02fd02;
3475 break;
3476 case DDR_PATTERN_LOOP_2 + 8:
3477 case DDR_PATTERN_LOOP_2 + 9:
3478 case DDR_PATTERN_LOOP_2 + 10:
3479 case DDR_PATTERN_LOOP_2 + 11:
3480 *(p + i) = ~0xfb04fb04;
3481 break;
3482 case DDR_PATTERN_LOOP_2 + 12:
3483 case DDR_PATTERN_LOOP_2 + 13:
3484 case DDR_PATTERN_LOOP_2 + 14:
3485 case DDR_PATTERN_LOOP_2 + 15:
3486 *(p + i) = ~0xf708f708;
3487 break;
3488 case DDR_PATTERN_LOOP_2 + 16:
3489 case DDR_PATTERN_LOOP_2 + 17:
3490 case DDR_PATTERN_LOOP_2 + 18:
3491 case DDR_PATTERN_LOOP_2 + 19:
3492 *(p + i) = ~0xef10ef10;
3493 break;
3494 case DDR_PATTERN_LOOP_2 + 20:
3495 case DDR_PATTERN_LOOP_2 + 21:
3496 case DDR_PATTERN_LOOP_2 + 22:
3497 case DDR_PATTERN_LOOP_2 + 23:
3498 *(p + i) = ~0xdf20df20;
3499 break;
3500 case DDR_PATTERN_LOOP_2 + 24:
3501 case DDR_PATTERN_LOOP_2 + 25:
3502 case DDR_PATTERN_LOOP_2 + 26:
3503 case DDR_PATTERN_LOOP_2 + 27:
3504 *(p + i) = ~0xbf40bf40;
3505 break;
3506 case DDR_PATTERN_LOOP_2 + 28:
3507 case DDR_PATTERN_LOOP_2 + 29:
3508 case DDR_PATTERN_LOOP_2 + 30:
3509 case DDR_PATTERN_LOOP_2 + 31:
3510 *(p + i) = ~0x7f807f80;
3511 break;
3512 case DDR_PATTERN_LOOP_3 + 0:
3513 case DDR_PATTERN_LOOP_3 + 1:
3514 case DDR_PATTERN_LOOP_3 + 2:
3515 case DDR_PATTERN_LOOP_3 + 3:
3516 *(p + i) = ~0x00000100;
3517 break;
3518 case DDR_PATTERN_LOOP_3 + 4:
3519 case DDR_PATTERN_LOOP_3 + 5:
3520 case DDR_PATTERN_LOOP_3 + 6:
3521 case DDR_PATTERN_LOOP_3 + 7:
3522 *(p + i) = ~0x00000200;
3523 break;
3524 case DDR_PATTERN_LOOP_3 + 8:
3525 case DDR_PATTERN_LOOP_3 + 9:
3526 case DDR_PATTERN_LOOP_3 + 10:
3527 case DDR_PATTERN_LOOP_3 + 11:
3528 *(p + i) = ~0x00000400;
3529 break;
3530 case DDR_PATTERN_LOOP_3 + 12:
3531 case DDR_PATTERN_LOOP_3 + 13:
3532 case DDR_PATTERN_LOOP_3 + 14:
3533 case DDR_PATTERN_LOOP_3 + 15:
3534 *(p + i) = ~0x00000800;
3535 break;
3536 case DDR_PATTERN_LOOP_3 + 16:
3537 case DDR_PATTERN_LOOP_3 + 17:
3538 case DDR_PATTERN_LOOP_3 + 18:
3539 case DDR_PATTERN_LOOP_3 + 19:
3540 *(p + i) = ~0x00001000;
3541 break;
3542 case DDR_PATTERN_LOOP_3 + 20:
3543 case DDR_PATTERN_LOOP_3 + 21:
3544 case DDR_PATTERN_LOOP_3 + 22:
3545 case DDR_PATTERN_LOOP_3 + 23:
3546 *(p + i) = ~0x00002000;
3547 break;
3548 case DDR_PATTERN_LOOP_3 + 24:
3549 case DDR_PATTERN_LOOP_3 + 25:
3550 case DDR_PATTERN_LOOP_3 + 26:
3551 case DDR_PATTERN_LOOP_3 + 27:
3552 *(p + i) = ~0x00004000;
3553 break;
3554 case DDR_PATTERN_LOOP_3 + 28:
3555 case DDR_PATTERN_LOOP_3 + 29:
3556 case DDR_PATTERN_LOOP_3 + 30:
3557 case DDR_PATTERN_LOOP_3 + 31:
3558 *(p + i) = ~0x00008000;
3559 break;
3560 }
3561 }
3562
3563 if (m_len > (128 * 4)) {
3564 m_len -= (128 * 4);
3565 p += 32 * 4;
3566 } else {
3567 p += (m_len >> 2);
3568 m_len = 0;
3569 break;
3570 }
3571 }
3572 }
3573}
3574
3575static void ddr_write_pattern4_cross_talk_n2(void *buff, unsigned int m_length)
3576{
3577 unsigned int *p;
3578 unsigned int i, n;
3579 unsigned int m_len = m_length;
3580
3581 p = (unsigned int *)buff;
3582
3583 while (m_len) {
3584 {
3585 if (m_len >= 128 * 4)
3586 n = 32 * 4;
3587 else
3588 n = m_len >> 2;
3589
3590 for (i = 0; i < n; i++) {
3591#ifdef DDR_PREFETCH_CACHE
3592 ddr_pld_cache(p);
3593#endif
3594
3595 switch (i) {
3596 case 0:
3597 case DDR_PATTERN_LOOP_1 + 1:
3598 case DDR_PATTERN_LOOP_2 + 2:
3599 case DDR_PATTERN_LOOP_3 + 3:
3600 *(p + i) = ~0xfe01fe01;
3601 break;
3602 case 4:
3603 case DDR_PATTERN_LOOP_1 + 5:
3604 case DDR_PATTERN_LOOP_2 + 6:
3605 case DDR_PATTERN_LOOP_3 + 7:
3606 *(p + i) = ~0xfd02fd02;
3607 break;
3608
3609 case 8:
3610 case DDR_PATTERN_LOOP_1 + 9:
3611 case DDR_PATTERN_LOOP_2 + 10:
3612 case DDR_PATTERN_LOOP_3 + 11:
3613 *(p + i) = ~0xfb04fb04;
3614 break;
3615
3616 case 12:
3617 case DDR_PATTERN_LOOP_1 + 13:
3618 case DDR_PATTERN_LOOP_2 + 14:
3619 case DDR_PATTERN_LOOP_3 + 15:
3620 *(p + i) = ~0xf708f708;
3621 break;
3622
3623 case 16:
3624 case DDR_PATTERN_LOOP_1 + 17:
3625 case DDR_PATTERN_LOOP_2 + 18:
3626 case DDR_PATTERN_LOOP_3 + 19:
3627 *(p + i) = ~0xef10ef10;
3628 break;
3629
3630 case 20:
3631 case DDR_PATTERN_LOOP_1 + 21:
3632 case DDR_PATTERN_LOOP_2 + 22:
3633 case DDR_PATTERN_LOOP_3 + 23:
3634 *(p + i) = ~0xdf20df20;
3635 break;
3636
3637 case 24:
3638 case DDR_PATTERN_LOOP_1 + 25:
3639 case DDR_PATTERN_LOOP_2 + 26:
3640 case DDR_PATTERN_LOOP_3 + 27:
3641 *(p + i) = ~0xbf40bf40;
3642 break;
3643 case 28:
3644 case DDR_PATTERN_LOOP_1 + 29:
3645 case DDR_PATTERN_LOOP_2 + 30:
3646 case DDR_PATTERN_LOOP_3 + 31:
3647 *(p + i) = ~0x7f807f80;
3648 break;
3649
3650
3651 default:
3652
3653 *(p + i) = ~0xff00ff00;
3654 break;
3655
3656 break;
3657 }
3658 }
3659
3660 if (m_len > (128 * 4)) {
3661 m_len -= (128 * 4);
3662 p += 32 * 4;
3663 } else {
3664 p += (m_len >> 2);
3665 m_len = 0;
3666 break;
3667 }
3668 }
3669 }
3670}
3671
3672static void ddr_read_pattern4_cross_talk_n(void *buff, unsigned int m_length)
3673{
3674 unsigned int *p;
3675 unsigned int i, n;
3676 unsigned int m_len = m_length;
3677
3678 p = (unsigned int *)buff;
3679
3680 while (m_len) {
3681 {
3682 if (m_len >= 128 * 4)
3683 n = 32 * 4;
3684 else
3685 n = m_len >> 2;
3686
3687 for (i = 0; i < n; i++) {
3688#ifdef DDR_PREFETCH_CACHE
3689 ddr_pld_cache(p);
3690#endif
3691 if ((error_outof_count_flag) && (error_count)) {
3692 printf("Error data out of count");
3693 m_len = 0;
3694 break;
3695 }
3696 switch (i) {
3697 case 0:
3698 case 1:
3699 case 2:
3700 case 3:
3701 case 8:
3702 case 9:
3703 case 10:
3704 case 11:
3705 case 16:
3706 case 17:
3707 case 18:
3708 case 19:
3709 case 24:
3710 case 25:
3711 case 26:
3712 case 27:
3713 if (*(p + i) != ~TDATA32F) {
3714 error_count++;
3715 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~TDATA32F);
3716 break;
3717 }
3718 break;
3719 case 4:
3720 case 5:
3721 case 6:
3722 case 7:
3723 case 12:
3724 case 13:
3725 case 14:
3726 case 15:
3727 case 20:
3728 case 21:
3729 case 22:
3730 case 23:
3731 case 28:
3732 case 29:
3733 case 30:
3734 case 31:
3735 if (*(p + i) != ~0) {
3736 error_count++;
3737 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0);
3738 }
3739 break;
3740 case DDR_PATTERN_LOOP_1 + 0:
3741 case DDR_PATTERN_LOOP_1 + 1:
3742 case DDR_PATTERN_LOOP_1 + 2:
3743 case DDR_PATTERN_LOOP_1 + 3:
3744 case DDR_PATTERN_LOOP_1 + 8:
3745 case DDR_PATTERN_LOOP_1 + 9:
3746 case DDR_PATTERN_LOOP_1 + 10:
3747 case DDR_PATTERN_LOOP_1 + 11:
3748 case DDR_PATTERN_LOOP_1 + 16:
3749 case DDR_PATTERN_LOOP_1 + 17:
3750 case DDR_PATTERN_LOOP_1 + 18:
3751 case DDR_PATTERN_LOOP_1 + 19:
3752 case DDR_PATTERN_LOOP_1 + 24:
3753 case DDR_PATTERN_LOOP_1 + 25:
3754 case DDR_PATTERN_LOOP_1 + 26:
3755 case DDR_PATTERN_LOOP_1 + 27:
3756 if (*(p + i) != ~TDATA32A) {
3757 error_count++;
3758 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~TDATA32A);
3759 }
3760 break;
3761 case DDR_PATTERN_LOOP_1 + 4:
3762 case DDR_PATTERN_LOOP_1 + 5:
3763 case DDR_PATTERN_LOOP_1 + 6:
3764 case DDR_PATTERN_LOOP_1 + 7:
3765 case DDR_PATTERN_LOOP_1 + 12:
3766 case DDR_PATTERN_LOOP_1 + 13:
3767 case DDR_PATTERN_LOOP_1 + 14:
3768 case DDR_PATTERN_LOOP_1 + 15:
3769 case DDR_PATTERN_LOOP_1 + 20:
3770 case DDR_PATTERN_LOOP_1 + 21:
3771 case DDR_PATTERN_LOOP_1 + 22:
3772 case DDR_PATTERN_LOOP_1 + 23:
3773 case DDR_PATTERN_LOOP_1 + 28:
3774 case DDR_PATTERN_LOOP_1 + 29:
3775 case DDR_PATTERN_LOOP_1 + 30:
3776 case DDR_PATTERN_LOOP_1 + 31:
3777 if (*(p + i) != ~TDATA325) {
3778 error_count++;
3779 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~TDATA325);
3780 }
3781 break;
3782 case DDR_PATTERN_LOOP_2 + 0:
3783 case DDR_PATTERN_LOOP_2 + 1:
3784 case DDR_PATTERN_LOOP_2 + 2:
3785 case DDR_PATTERN_LOOP_2 + 3:
3786 if (*(p + i) != ~0xfe01fe01) {
3787 error_count++;
3788 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xfe01fe01);
3789 }
3790 break;
3791 case DDR_PATTERN_LOOP_2 + 4:
3792 case DDR_PATTERN_LOOP_2 + 5:
3793 case DDR_PATTERN_LOOP_2 + 6:
3794 case DDR_PATTERN_LOOP_2 + 7:
3795 if (*(p + i) != ~0xfd02fd02) {
3796 error_count++;
3797 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xfd02fd02);
3798 }
3799 break;
3800
3801 case DDR_PATTERN_LOOP_2 + 8:
3802 case DDR_PATTERN_LOOP_2 + 9:
3803 case DDR_PATTERN_LOOP_2 + 10:
3804 case DDR_PATTERN_LOOP_2 + 11:
3805 if (*(p + i) != ~0xfb04fb04) {
3806 error_count++;
3807 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xfb04fb04);
3808 }
3809 break;
3810 case DDR_PATTERN_LOOP_2 + 12:
3811 case DDR_PATTERN_LOOP_2 + 13:
3812 case DDR_PATTERN_LOOP_2 + 14:
3813 case DDR_PATTERN_LOOP_2 + 15:
3814 if (*(p + i) != ~0xf708f708) {
3815 error_count++;
3816 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xf708f708);
3817 }
3818 break;
3819 case DDR_PATTERN_LOOP_2 + 16:
3820 case DDR_PATTERN_LOOP_2 + 17:
3821 case DDR_PATTERN_LOOP_2 + 18:
3822 case DDR_PATTERN_LOOP_2 + 19:
3823 if (*(p + i) != ~0xef10ef10) {
3824 error_count++;
3825 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xef10ef10);
3826 }
3827 break;
3828 case DDR_PATTERN_LOOP_2 + 20:
3829 case DDR_PATTERN_LOOP_2 + 21:
3830 case DDR_PATTERN_LOOP_2 + 22:
3831 case DDR_PATTERN_LOOP_2 + 23:
3832 if (*(p + i) != ~0xdf20df20) {
3833 error_count++;
3834 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xdf20df20);
3835 }
3836 break;
3837 case DDR_PATTERN_LOOP_2 + 24:
3838 case DDR_PATTERN_LOOP_2 + 25:
3839 case DDR_PATTERN_LOOP_2 + 26:
3840 case DDR_PATTERN_LOOP_2 + 27:
3841 if (*(p + i) != ~0xbf40bf40) {
3842 error_count++;
3843 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xbf40bf40);
3844 }
3845 break;
3846 case DDR_PATTERN_LOOP_2 + 28:
3847 case DDR_PATTERN_LOOP_2 + 29:
3848 case DDR_PATTERN_LOOP_2 + 30:
3849 case DDR_PATTERN_LOOP_2 + 31:
3850 if (*(p + i) != ~0x7f807f80) {
3851 error_count++;
3852 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0x7f807f80);
3853 }
3854 break;
3855 break;
3856 case DDR_PATTERN_LOOP_3 + 0:
3857 case DDR_PATTERN_LOOP_3 + 1:
3858 case DDR_PATTERN_LOOP_3 + 2:
3859 case DDR_PATTERN_LOOP_3 + 3:
3860 if (*(p + i) != ~0x00000100) {
3861 error_count++;
3862 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0x00000100);
3863 }
3864 break;
3865 case DDR_PATTERN_LOOP_3 + 4:
3866 case DDR_PATTERN_LOOP_3 + 5:
3867 case DDR_PATTERN_LOOP_3 + 6:
3868 case DDR_PATTERN_LOOP_3 + 7:
3869 if (*(p + i) != ~0x00000200) {
3870 error_count++;
3871 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0x00000200);
3872 }
3873 break;
3874 case DDR_PATTERN_LOOP_3 + 8:
3875 case DDR_PATTERN_LOOP_3 + 9:
3876 case DDR_PATTERN_LOOP_3 + 10:
3877 case DDR_PATTERN_LOOP_3 + 11:
3878 if (*(p + i) != ~0x00000400) {
3879 error_count++;
3880 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0x00000400);
3881 }
3882 break;
3883 case DDR_PATTERN_LOOP_3 + 12:
3884 case DDR_PATTERN_LOOP_3 + 13:
3885 case DDR_PATTERN_LOOP_3 + 14:
3886 case DDR_PATTERN_LOOP_3 + 15:
3887 if (*(p + i) != ~0x00000800) {
3888 error_count++;
3889 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0x00000800);
3890 }
3891 break;
3892 case DDR_PATTERN_LOOP_3 + 16:
3893 case DDR_PATTERN_LOOP_3 + 17:
3894 case DDR_PATTERN_LOOP_3 + 18:
3895 case DDR_PATTERN_LOOP_3 + 19:
3896 if (*(p + i) != ~0x00001000) {
3897 error_count++;
3898 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0x00001000);
3899 }
3900 break;
3901 case DDR_PATTERN_LOOP_3 + 20:
3902 case DDR_PATTERN_LOOP_3 + 21:
3903 case DDR_PATTERN_LOOP_3 + 22:
3904 case DDR_PATTERN_LOOP_3 + 23:
3905 if (*(p + i) != ~0x00002000) {
3906 error_count++;
3907 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0x00002000);
3908 }
3909 break;
3910 case DDR_PATTERN_LOOP_3 + 24:
3911 case DDR_PATTERN_LOOP_3 + 25:
3912 case DDR_PATTERN_LOOP_3 + 26:
3913 case DDR_PATTERN_LOOP_3 + 27:
3914 if (*(p + i) != ~0x00004000) {
3915 error_count++;
3916 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0x00004000);
3917 }
3918 break;
3919 case DDR_PATTERN_LOOP_3 + 28:
3920 case DDR_PATTERN_LOOP_3 + 29:
3921 case DDR_PATTERN_LOOP_3 + 30:
3922 case DDR_PATTERN_LOOP_3 + 31:
3923 if (*(p + i) != ~0x00008000) {
3924 error_count++;
3925 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0x00008000);
3926 }
3927 break;
3928 }
3929 }
3930
3931 if (m_len > 128 * 4) {
3932 m_len -= 128 * 4;
3933 p += 32 * 4;
3934 } else {
3935 p += (m_len >> 2);
3936 m_len = 0;
3937 break;
3938 }
3939 }
3940 }
3941}
3942
3943static void ddr_read_pattern4_cross_talk_n2(void *buff, unsigned int m_length)
3944{
3945 unsigned int *p;
3946 unsigned int i, n;
3947 unsigned int m_len = m_length;
3948
3949 p = (unsigned int *)buff;
3950
3951 while (m_len) {
3952 {
3953 if (m_len >= 128 * 4)
3954 n = 32 * 4;
3955 else
3956 n = m_len >> 2;
3957
3958 for (i = 0; i < n; i++) {
3959#ifdef DDR_PREFETCH_CACHE
3960 ddr_pld_cache(p);
3961#endif
3962 if ((error_outof_count_flag) && (error_count)) {
3963 printf("Error data out of count");
3964 m_len = 0;
3965 break;
3966 }
3967
3968 switch (i) {
3969 case 0:
3970 case DDR_PATTERN_LOOP_1 + 1:
3971 case DDR_PATTERN_LOOP_2 + 2:
3972 case DDR_PATTERN_LOOP_3 + 3:
3973 if (*(p + i) != ~0xfe01fe01) {
3974 error_count++;
3975 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xfe01fe01);
3976 break;
3977 }
3978 break;
3979 case 4:
3980 case DDR_PATTERN_LOOP_1 + 5:
3981 case DDR_PATTERN_LOOP_2 + 6:
3982 case DDR_PATTERN_LOOP_3 + 7:
3983 if (*(p + i) != ~0xfd02fd02) {
3984 error_count++;
3985 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xfd02fd02);
3986 break;
3987 }
3988 break;
3989
3990 case 8:
3991 case DDR_PATTERN_LOOP_1 + 9:
3992 case DDR_PATTERN_LOOP_2 + 10:
3993 case DDR_PATTERN_LOOP_3 + 11:
3994 if (*(p + i) != ~0xfb04fb04) {
3995 error_count++;
3996 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xfb04fb04);
3997 break;
3998 }
3999 break;
4000
4001 case 12:
4002 case DDR_PATTERN_LOOP_1 + 13:
4003 case DDR_PATTERN_LOOP_2 + 14:
4004 case DDR_PATTERN_LOOP_3 + 15:
4005 if (*(p + i) != ~0xf708f708) {
4006 error_count++;
4007 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xf708f708);
4008 break;
4009 }
4010 break;
4011
4012 case 16:
4013 case DDR_PATTERN_LOOP_1 + 17:
4014 case DDR_PATTERN_LOOP_2 + 18:
4015 case DDR_PATTERN_LOOP_3 + 19:
4016 if (*(p + i) != ~0xef10ef10) {
4017 error_count++;
4018 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xef10ef10);
4019 break;
4020 }
4021 break;
4022
4023 case 20:
4024 case DDR_PATTERN_LOOP_1 + 21:
4025 case DDR_PATTERN_LOOP_2 + 22:
4026 case DDR_PATTERN_LOOP_3 + 23:
4027 if (*(p + i) != ~0xdf20df20) {
4028 error_count++;
4029 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xdf20df20);
4030 break;
4031 }
4032 break;
4033
4034 case 24:
4035 case DDR_PATTERN_LOOP_1 + 25:
4036 case DDR_PATTERN_LOOP_2 + 26:
4037 case DDR_PATTERN_LOOP_3 + 27:
4038 if (*(p + i) != ~0xbf40bf40) {
4039 error_count++;
4040 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xbf40bf40);
4041 break;
4042 }
4043 break;
4044 case 28:
4045 case DDR_PATTERN_LOOP_1 + 29:
4046 case DDR_PATTERN_LOOP_2 + 30:
4047 case DDR_PATTERN_LOOP_3 + 31:
4048 if (*(p + i) != ~0x7f807f80) {
4049 error_count++;
4050 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0x7f807f80);
4051 break;
4052 }
4053 break;
4054
4055
4056 default:
4057 if (*(p + i) != ~0xff00ff00) {
4058 error_count++;
4059 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xff00ff00);
4060 break;
4061 }
4062 break;
4063
4064 break;
4065 }
4066 }
4067
4068 if (m_len > 128 * 4) {
4069 m_len -= 128 * 4;
4070 p += 32 * 4;
4071 } else {
4072 p += (m_len >> 2);
4073 m_len = 0;
4074 break;
4075 }
4076 }
4077 }
4078}
4079
4080static void ddr_write_pattern4_no_cross_talk(void *buff, unsigned int m_length)
4081{
4082 unsigned int *p;
4083 unsigned int i, n;
4084 unsigned int m_len = m_length;
4085
4086 p = (unsigned int *)buff;
4087
4088 while (m_len) {
4089 {
4090 if (m_len >= 128 * 4)
4091 n = 32 * 4;
4092 else
4093 n = m_len >> 2;
4094
4095 for (i = 0; i < n; i++) {
4096#ifdef DDR_PREFETCH_CACHE
4097 ddr_pld_cache(p);
4098#endif
4099 switch (i) {
4100 case 0:
4101 case 1:
4102 case 2:
4103 case 3:
4104 *(p + i) = 0xff00ff00;
4105 break;
4106 case 4:
4107 case 5:
4108 case 6:
4109 case 7:
4110 *(p + i) = 0xffff0000;
4111 break;
4112
4113 case 8:
4114 case 9:
4115 case 10:
4116 case 11:
4117 *(p + i) = 0xff000000;
4118 break;
4119 case 12:
4120 case 13:
4121 case 14:
4122 case 15:
4123 *(p + i) = 0xff00ffff;
4124 break;
4125
4126 case 16:
4127 case 17:
4128 case 18:
4129 case 19:
4130 *(p + i) = 0xff00ffff;
4131 break;
4132 case 20:
4133 case 21:
4134 case 22:
4135 case 23:
4136 *(p + i) = 0xff0000ff;
4137 break;
4138 case 24:
4139 case 25:
4140 case 26:
4141 case 27:
4142 *(p + i) = 0xffff0000;
4143 break;
4144
4145 case 28:
4146 case 29:
4147 case 30:
4148 case 31:
4149 *(p + i) = 0x00ff00ff;
4150 break;
4151 case DDR_PATTERN_LOOP_1 + 0:
4152 case DDR_PATTERN_LOOP_1 + 1:
4153 case DDR_PATTERN_LOOP_1 + 2:
4154 case DDR_PATTERN_LOOP_1 + 3:
4155 *(p + i) = ~0xff00ff00;
4156 break;
4157 case DDR_PATTERN_LOOP_1 + 4:
4158 case DDR_PATTERN_LOOP_1 + 5:
4159 case DDR_PATTERN_LOOP_1 + 6:
4160 case DDR_PATTERN_LOOP_1 + 7:
4161 *(p + i) = ~0xffff0000;
4162 break;
4163 case DDR_PATTERN_LOOP_1 + 8:
4164 case DDR_PATTERN_LOOP_1 + 9:
4165 case DDR_PATTERN_LOOP_1 + 10:
4166 case DDR_PATTERN_LOOP_1 + 11:
4167 *(p + i) = ~0xff000000;
4168 break;
4169 case DDR_PATTERN_LOOP_1 + 12:
4170 case DDR_PATTERN_LOOP_1 + 13:
4171 case DDR_PATTERN_LOOP_1 + 14:
4172 case DDR_PATTERN_LOOP_1 + 15:
4173 *(p + i) = ~0xff00ffff;
4174 break;
4175 case DDR_PATTERN_LOOP_1 + 16:
4176 case DDR_PATTERN_LOOP_1 + 17:
4177 case DDR_PATTERN_LOOP_1 + 18:
4178 case DDR_PATTERN_LOOP_1 + 19:
4179 *(p + i) = ~0xff00ffff;
4180 break;
4181 case DDR_PATTERN_LOOP_1 + 20:
4182 case DDR_PATTERN_LOOP_1 + 21:
4183 case DDR_PATTERN_LOOP_1 + 22:
4184 case DDR_PATTERN_LOOP_1 + 23:
4185 *(p + i) = ~0xff00ffff;
4186 break;
4187 case DDR_PATTERN_LOOP_1 + 24:
4188 case DDR_PATTERN_LOOP_1 + 25:
4189 case DDR_PATTERN_LOOP_1 + 26:
4190 case DDR_PATTERN_LOOP_1 + 27:
4191 *(p + i) = ~0xffff0000;
4192 break;
4193 case DDR_PATTERN_LOOP_1 + 28:
4194 case DDR_PATTERN_LOOP_1 + 29:
4195 case DDR_PATTERN_LOOP_1 + 30:
4196 case DDR_PATTERN_LOOP_1 + 31:
4197 *(p + i) = ~0x00ff00ff;
4198 break;
4199
4200 case DDR_PATTERN_LOOP_2 + 0:
4201 case DDR_PATTERN_LOOP_2 + 1:
4202 case DDR_PATTERN_LOOP_2 + 2:
4203 case DDR_PATTERN_LOOP_2 + 3:
4204 *(p + i) = 0x00ff0000;
4205 break;
4206 case DDR_PATTERN_LOOP_2 + 4:
4207 case DDR_PATTERN_LOOP_2 + 5:
4208 case DDR_PATTERN_LOOP_2 + 6:
4209 case DDR_PATTERN_LOOP_2 + 7:
4210 *(p + i) = 0xff000000;
4211 break;
4212 case DDR_PATTERN_LOOP_2 + 8:
4213 case DDR_PATTERN_LOOP_2 + 9:
4214 case DDR_PATTERN_LOOP_2 + 10:
4215 case DDR_PATTERN_LOOP_2 + 11:
4216 *(p + i) = 0x0000ffff;
4217 break;
4218 case DDR_PATTERN_LOOP_2 + 12:
4219 case DDR_PATTERN_LOOP_2 + 13:
4220 case DDR_PATTERN_LOOP_2 + 14:
4221 case DDR_PATTERN_LOOP_2 + 15:
4222 *(p + i) = 0x000000ff;
4223 break;
4224 case DDR_PATTERN_LOOP_2 + 16:
4225 case DDR_PATTERN_LOOP_2 + 17:
4226 case DDR_PATTERN_LOOP_2 + 18:
4227 case DDR_PATTERN_LOOP_2 + 19:
4228 *(p + i) = 0x00ff00ff;
4229 break;
4230 case DDR_PATTERN_LOOP_2 + 20:
4231 case DDR_PATTERN_LOOP_2 + 21:
4232 case DDR_PATTERN_LOOP_2 + 22:
4233 case DDR_PATTERN_LOOP_2 + 23:
4234 *(p + i) = 0xff00ff00;
4235 break;
4236 case DDR_PATTERN_LOOP_2 + 24:
4237 case DDR_PATTERN_LOOP_2 + 25:
4238 case DDR_PATTERN_LOOP_2 + 26:
4239 case DDR_PATTERN_LOOP_2 + 27:
4240 *(p + i) = 0xff00ffff;
4241 break;
4242 case DDR_PATTERN_LOOP_2 + 28:
4243 case DDR_PATTERN_LOOP_2 + 29:
4244 case DDR_PATTERN_LOOP_2 + 30:
4245 case DDR_PATTERN_LOOP_2 + 31:
4246 *(p + i) = 0xff00ff00;
4247 break;
4248 case DDR_PATTERN_LOOP_3 + 0:
4249 case DDR_PATTERN_LOOP_3 + 1:
4250 case DDR_PATTERN_LOOP_3 + 2:
4251 case DDR_PATTERN_LOOP_3 + 3:
4252 *(p + i) = ~0x00ff0000;
4253 break;
4254 case DDR_PATTERN_LOOP_3 + 4:
4255 case DDR_PATTERN_LOOP_3 + 5:
4256 case DDR_PATTERN_LOOP_3 + 6:
4257 case DDR_PATTERN_LOOP_3 + 7:
4258 *(p + i) = ~0xff000000;
4259 break;
4260 case DDR_PATTERN_LOOP_3 + 8:
4261 case DDR_PATTERN_LOOP_3 + 9:
4262 case DDR_PATTERN_LOOP_3 + 10:
4263 case DDR_PATTERN_LOOP_3 + 11:
4264 *(p + i) = ~0x0000ffff;
4265 break;
4266 case DDR_PATTERN_LOOP_3 + 12:
4267 case DDR_PATTERN_LOOP_3 + 13:
4268 case DDR_PATTERN_LOOP_3 + 14:
4269 case DDR_PATTERN_LOOP_3 + 15:
4270 *(p + i) = ~0x000000ff;
4271 break;
4272 case DDR_PATTERN_LOOP_3 + 16:
4273 case DDR_PATTERN_LOOP_3 + 17:
4274 case DDR_PATTERN_LOOP_3 + 18:
4275 case DDR_PATTERN_LOOP_3 + 19:
4276 *(p + i) = ~0x00ff00ff;
4277 break;
4278 case DDR_PATTERN_LOOP_3 + 20:
4279 case DDR_PATTERN_LOOP_3 + 21:
4280 case DDR_PATTERN_LOOP_3 + 22:
4281 case DDR_PATTERN_LOOP_3 + 23:
4282 *(p + i) = ~0xff00ff00;
4283 break;
4284 case DDR_PATTERN_LOOP_3 + 24:
4285 case DDR_PATTERN_LOOP_3 + 25:
4286 case DDR_PATTERN_LOOP_3 + 26:
4287 case DDR_PATTERN_LOOP_3 + 27:
4288 *(p + i) = ~0xff00ffff;
4289 break;
4290 case DDR_PATTERN_LOOP_3 + 28:
4291 case DDR_PATTERN_LOOP_3 + 29:
4292 case DDR_PATTERN_LOOP_3 + 30:
4293 case DDR_PATTERN_LOOP_3 + 31:
4294 *(p + i) = ~0xff00ff00;
4295 break;
4296 }
4297 }
4298
4299 if (m_len > (128 * 4)) {
4300 m_len -= (128 * 4);
4301 p += 32 * 4;
4302 } else {
4303 p += (m_len >> 2);
4304 m_len = 0;
4305 break;
4306 }
4307 }
4308 }
4309}
4310
4311static void ddr_read_pattern4_no_cross_talk(void *buff, unsigned int m_length)
4312{
4313 unsigned int *p;
4314 unsigned int i, n;
4315 unsigned int m_len = m_length;
4316
4317 p = (unsigned int *)buff;
4318 while (m_len) {
4319 {
4320 if (m_len >= 128 * 4)
4321 n = 32 * 4;
4322 else
4323 n = m_len >> 2;
4324
4325 for (i = 0; i < n; i++) {
4326#ifdef DDR_PREFETCH_CACHE
4327 ddr_pld_cache(p);
4328#endif
4329 if ((error_outof_count_flag) && (error_count)) {
4330 printf("Error data out of count");
4331 m_len = 0;
4332 break;
4333 }
4334 switch (i) {
4335 case 0:
4336 case 1:
4337 case 2:
4338 case 3:
4339 if (*(p + i) != 0xff00ff00) {
4340 error_count++;
4341 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xff00ff00);
4342 }
4343 break;
4344 case 4:
4345 case 5:
4346 case 6:
4347 case 7:
4348 if (*(p + i) != 0xffff0000) {
4349 error_count++;
4350 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xffff0000);
4351 }
4352 break;
4353
4354 case 8:
4355 case 9:
4356 case 10:
4357 case 11:
4358 if (*(p + i) != 0xff000000) {
4359 error_count++;
4360 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xff000000);
4361 }
4362 break;
4363 case 12:
4364 case 13:
4365 case 14:
4366 case 15:
4367 if (*(p + i) != 0xff00ffff) {
4368 error_count++;
4369 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xff00ffff);
4370 }
4371 break;
4372
4373 case 16:
4374 case 17:
4375 case 18:
4376 case 19:
4377 if (*(p + i) != 0xff00ffff) {
4378 error_count++;
4379 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xff00ffff);
4380 }
4381 break;
4382 case 20:
4383 case 21:
4384 case 22:
4385 case 23:
4386 if (*(p + i) != 0xff0000ff) {
4387 error_count++;
4388 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xff0000ff);
4389 }
4390 break;
4391 case 24:
4392 case 25:
4393 case 26:
4394 case 27:
4395 if (*(p + i) != 0xffff0000) {
4396 error_count++;
4397 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xffff0000);
4398 }
4399 break;
4400
4401 case 28:
4402 case 29:
4403 case 30:
4404 case 31:
4405 if (*(p + i) != 0x00ff00ff) {
4406 error_count++;
4407 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0x00ff00ff);
4408 }
4409 break;
4410 case DDR_PATTERN_LOOP_1 + 0:
4411 case DDR_PATTERN_LOOP_1 + 1:
4412 case DDR_PATTERN_LOOP_1 + 2:
4413 case DDR_PATTERN_LOOP_1 + 3:
4414 if (*(p + i) != ~0xff00ff00) {
4415 error_count++;
4416 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xff00ff00);
4417 }
4418 break;
4419 case DDR_PATTERN_LOOP_1 + 4:
4420 case DDR_PATTERN_LOOP_1 + 5:
4421 case DDR_PATTERN_LOOP_1 + 6:
4422 case DDR_PATTERN_LOOP_1 + 7:
4423 if (*(p + i) != ~0xffff0000) {
4424 error_count++;
4425 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xffff0000);
4426 }
4427 break;
4428 case DDR_PATTERN_LOOP_1 + 8:
4429 case DDR_PATTERN_LOOP_1 + 9:
4430 case DDR_PATTERN_LOOP_1 + 10:
4431 case DDR_PATTERN_LOOP_1 + 11:
4432 if (*(p + i) != ~0xff000000) {
4433 error_count++;
4434 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xff000000);
4435 }
4436 break;
4437 case DDR_PATTERN_LOOP_1 + 12:
4438 case DDR_PATTERN_LOOP_1 + 13:
4439 case DDR_PATTERN_LOOP_1 + 14:
4440 case DDR_PATTERN_LOOP_1 + 15:
4441 if (*(p + i) != ~0xff00ffff) {
4442 error_count++;
4443 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xff00ffff);
4444 }
4445 break;
4446 case DDR_PATTERN_LOOP_1 + 16:
4447 case DDR_PATTERN_LOOP_1 + 17:
4448 case DDR_PATTERN_LOOP_1 + 18:
4449 case DDR_PATTERN_LOOP_1 + 19:
4450 if (*(p + i) != ~0xff00ffff) {
4451 error_count++;
4452 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xff00ffff);
4453 }
4454 break;
4455 case DDR_PATTERN_LOOP_1 + 20:
4456 case DDR_PATTERN_LOOP_1 + 21:
4457 case DDR_PATTERN_LOOP_1 + 22:
4458 case DDR_PATTERN_LOOP_1 + 23:
4459 if (*(p + i) != ~0xff00ffff) {
4460 error_count++;
4461 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xff00ffff);
4462 }
4463 break;
4464 case DDR_PATTERN_LOOP_1 + 24:
4465 case DDR_PATTERN_LOOP_1 + 25:
4466 case DDR_PATTERN_LOOP_1 + 26:
4467 case DDR_PATTERN_LOOP_1 + 27:
4468 if (*(p + i) != ~0xffff0000) {
4469 error_count++;
4470 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xffff0000);
4471 }
4472 break;
4473 case DDR_PATTERN_LOOP_1 + 28:
4474 case DDR_PATTERN_LOOP_1 + 29:
4475 case DDR_PATTERN_LOOP_1 + 30:
4476 case DDR_PATTERN_LOOP_1 + 31:
4477 if (*(p + i) != ~0x00ff00ff) {
4478 error_count++;
4479 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0x00ff00ff);
4480 }
4481 break;
4482 case DDR_PATTERN_LOOP_2 + 0:
4483 case DDR_PATTERN_LOOP_2 + 1:
4484 case DDR_PATTERN_LOOP_2 + 2:
4485 case DDR_PATTERN_LOOP_2 + 3:
4486 if (*(p + i) != 0x00ff0000) {
4487 error_count++;
4488 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0x00ff0000);
4489 }
4490 break;
4491 case DDR_PATTERN_LOOP_2 + 4:
4492 case DDR_PATTERN_LOOP_2 + 5:
4493 case DDR_PATTERN_LOOP_2 + 6:
4494 case DDR_PATTERN_LOOP_2 + 7:
4495 if (*(p + i) != 0xff000000) {
4496 error_count++;
4497 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xff000000);
4498 }
4499 break;
4500 case DDR_PATTERN_LOOP_2 + 8:
4501 case DDR_PATTERN_LOOP_2 + 9:
4502 case DDR_PATTERN_LOOP_2 + 10:
4503 case DDR_PATTERN_LOOP_2 + 11:
4504 if (*(p + i) != 0x0000ffff) {
4505 error_count++;
4506 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0x0000ffff);
4507 }
4508 break;
4509 case DDR_PATTERN_LOOP_2 + 12:
4510 case DDR_PATTERN_LOOP_2 + 13:
4511 case DDR_PATTERN_LOOP_2 + 14:
4512 case DDR_PATTERN_LOOP_2 + 15:
4513 if (*(p + i) != 0x000000ff) {
4514 error_count++;
4515 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0x000000ff);
4516 }
4517 break;
4518 case DDR_PATTERN_LOOP_2 + 16:
4519 case DDR_PATTERN_LOOP_2 + 17:
4520 case DDR_PATTERN_LOOP_2 + 18:
4521 case DDR_PATTERN_LOOP_2 + 19:
4522 if (*(p + i) != 0x00ff00ff) {
4523 error_count++;
4524 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0x00ff00ff);
4525 }
4526 break;
4527 case DDR_PATTERN_LOOP_2 + 20:
4528 case DDR_PATTERN_LOOP_2 + 21:
4529 case DDR_PATTERN_LOOP_2 + 22:
4530 case DDR_PATTERN_LOOP_2 + 23:
4531 if (*(p + i) != 0xff00ff00) {
4532 error_count++;
4533 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xff00ff00);
4534 }
4535 break;
4536 case DDR_PATTERN_LOOP_2 + 24:
4537 case DDR_PATTERN_LOOP_2 + 25:
4538 case DDR_PATTERN_LOOP_2 + 26:
4539 case DDR_PATTERN_LOOP_2 + 27:
4540 if (*(p + i) != 0xff00ffff) {
4541 error_count++;
4542 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xff00ffff);
4543 }
4544 break;
4545 case DDR_PATTERN_LOOP_2 + 28:
4546 case DDR_PATTERN_LOOP_2 + 29:
4547 case DDR_PATTERN_LOOP_2 + 30:
4548 case DDR_PATTERN_LOOP_2 + 31:
4549 if (*(p + i) != 0xff00ff00) {
4550 error_count++;
4551 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), 0xff00ff00);
4552 }
4553 break;
4554 case DDR_PATTERN_LOOP_3 + 0:
4555 case DDR_PATTERN_LOOP_3 + 1:
4556 case DDR_PATTERN_LOOP_3 + 2:
4557 case DDR_PATTERN_LOOP_3 + 3:
4558 if (*(p + i) != ~0x00ff0000) {
4559 error_count++;
4560 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0x00ff0000);
4561 }
4562 break;
4563 case DDR_PATTERN_LOOP_3 + 4:
4564 case DDR_PATTERN_LOOP_3 + 5:
4565 case DDR_PATTERN_LOOP_3 + 6:
4566 case DDR_PATTERN_LOOP_3 + 7:
4567 if (*(p + i) != ~0xff000000) {
4568 error_count++;
4569 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xff000000);
4570 }
4571 break;
4572 case DDR_PATTERN_LOOP_3 + 8:
4573 case DDR_PATTERN_LOOP_3 + 9:
4574 case DDR_PATTERN_LOOP_3 + 10:
4575 case DDR_PATTERN_LOOP_3 + 11:
4576 if (*(p + i) != ~0x0000ffff) {
4577 error_count++;
4578 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0x0000ffff);
4579 }
4580 break;
4581 case DDR_PATTERN_LOOP_3 + 12:
4582 case DDR_PATTERN_LOOP_3 + 13:
4583 case DDR_PATTERN_LOOP_3 + 14:
4584 case DDR_PATTERN_LOOP_3 + 15:
4585 if (*(p + i) != ~0x000000ff) {
4586 error_count++;
4587 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0x000000ff);
4588 }
4589 break;
4590 case DDR_PATTERN_LOOP_3 + 16:
4591 case DDR_PATTERN_LOOP_3 + 17:
4592 case DDR_PATTERN_LOOP_3 + 18:
4593 case DDR_PATTERN_LOOP_3 + 19:
4594 if (*(p + i) != ~0x00ff00ff) {
4595 error_count++;
4596 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0x00ff00ff);
4597 }
4598 break;
4599 case DDR_PATTERN_LOOP_3 + 20:
4600 case DDR_PATTERN_LOOP_3 + 21:
4601 case DDR_PATTERN_LOOP_3 + 22:
4602 case DDR_PATTERN_LOOP_3 + 23:
4603 if (*(p + i) != ~0xff00ff00) {
4604 error_count++;
4605 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xff00ff00);
4606 }
4607 break;
4608 case DDR_PATTERN_LOOP_3 + 24:
4609 case DDR_PATTERN_LOOP_3 + 25:
4610 case DDR_PATTERN_LOOP_3 + 26:
4611 case DDR_PATTERN_LOOP_3 + 27:
4612 if (*(p + i) != ~0xff00ffff) {
4613 error_count++;
4614 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xff00ffff);
4615 }
4616 break;
4617 case DDR_PATTERN_LOOP_3 + 28:
4618 case DDR_PATTERN_LOOP_3 + 29:
4619 case DDR_PATTERN_LOOP_3 + 30:
4620 case DDR_PATTERN_LOOP_3 + 31:
4621 if (*(p + i) != ~0xff00ff00) {
4622 error_count++;
4623 printf("Error data [0x%08x] at offset 0x%08x[0x%08x]\n", *(p + i), p_convter_int(p + i), ~0xff00ff00);
4624 }
4625 break;
4626 }
4627 }
4628
4629 if (m_len > (128 * 4)) {
4630 m_len -= (128 * 4);
4631 p += 32 * 4;
4632 } else {
4633 p += (m_len >> 2);
4634 m_len = 0;
4635 break;
4636 }
4637 }
4638 }
4639}
4640
4641int do_ddr_test(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
4642{
4643 char *endp;
4644 unsigned int loop = 1;
4645 unsigned int lflag = 0;
4646 unsigned int start_addr = DDR_TEST_START_ADDR;
4647 unsigned int test_size = DDR_TEST_SIZE;
4648 unsigned int simple_pattern_flag = 1;
4649 unsigned int cross_talk_pattern_flag = 1;
4650 unsigned int old_pattern_flag = 1;
4651 unsigned int print_flag = 1;
4652
4653 print_flag = 1;
4654 error_outof_count_flag = 0;
4655 error_count = 0;
4656 printf("\nargc== 0x%08x\n", argc);
4657 int i;
4658 for (i = 0; i < argc; i++)
4659 printf("\nargv[%d]=%s\n", i, argv[i]);
4660 if (!argc)
4661 goto DDR_TEST_START;
4662 if (argc > 1) {
4663 if (strcmp(argv[1], "l") == 0) {
4664 lflag = 1;
4665 } else if (strcmp(argv[1], "h") == 0) {
4666 goto usage;
4667 } else {
4668 loop = simple_strtoull_ddr(argv[1], &endp, 10);
4669 if (*argv[1] == 0 || *endp != 0)
4670 loop = 1;
4671 }
4672 }
4673 if (argc == 1) {
4674 start_addr = DDR_TEST_START_ADDR;
4675 loop = 1;
4676 }
4677 if (argc > 2) {
4678 start_addr = simple_strtoull_ddr(argv[2], &endp, 16);
4679 if (*argv[2] == 0 || *endp != 0)
4680 start_addr = DDR_TEST_START_ADDR;
4681 }
4682 if (argc > 3) {
4683 test_size = simple_strtoull_ddr(argv[3], &endp, 16);
4684 if (*argv[3] == 0 || *endp != 0)
4685 test_size = DDR_TEST_SIZE;
4686 }
4687 if (test_size < 0x1000)
4688 test_size = DDR_TEST_SIZE;
4689
4690 old_pattern_flag = 1;
4691 simple_pattern_flag = 1;
4692 cross_talk_pattern_flag = 1;
4693 if (argc == 2) {
4694 if ((strcmp(argv[1], "s") == 0)) {
4695 simple_pattern_flag = 1;
4696 old_pattern_flag = 0;
4697 cross_talk_pattern_flag = 0;
4698 } else if ((strcmp(argv[1], "c") == 0)) {
4699 simple_pattern_flag = 0;
4700 old_pattern_flag = 0;
4701 cross_talk_pattern_flag = 1;
4702 } else if ((strcmp(argv[1], "e") == 0)) {
4703 error_outof_count_flag = 1;
4704 }
4705 }
4706 if (argc > 2) {
4707 if ((strcmp(argv[1], "n") == 0) || (strcmp(argv[2], "n") == 0))
4708 print_flag = 0;
4709 if ((strcmp(argv[1], "p") == 0) || (strcmp(argv[2], "p") == 0))
4710 copy_test_flag = 1;
4711 if ((strcmp(argv[1], "s") == 0) || (strcmp(argv[2], "s") == 0)) {
4712 simple_pattern_flag = 1;
4713 old_pattern_flag = 0;
4714 cross_talk_pattern_flag = 0;
4715 } else if ((strcmp(argv[1], "c") == 0) || (strcmp(argv[2], "c") == 0)) {
4716 simple_pattern_flag = 0;
4717 old_pattern_flag = 0;
4718 cross_talk_pattern_flag = 1;
4719 } else if ((strcmp(argv[1], "e") == 0) || (strcmp(argv[2], "e") == 0)) {
4720 error_outof_count_flag = 1;
4721 }
4722 }
4723 if (argc > 3) {
4724 if ((strcmp(argv[1], "p") == 0) || (strcmp(argv[2], "p") == 0) || (strcmp(argv[3], "p") == 0))
4725 copy_test_flag = 1;
4726 if ((strcmp(argv[1], "n") == 0) || (strcmp(argv[2], "n") == 0) || (strcmp(argv[3], "n") == 0))
4727 print_flag = 0;
4728 if ((strcmp(argv[1], "s") == 0) || (strcmp(argv[2], "s") == 0) || (strcmp(argv[3], "s") == 0)) {
4729 simple_pattern_flag = 1;
4730 old_pattern_flag = 0;
4731 cross_talk_pattern_flag = 0;
4732 }
4733 if ((strcmp(argv[1], "c") == 0) || (strcmp(argv[2], "c") == 0) || (strcmp(argv[3], "c") == 0)) {
4734 simple_pattern_flag = 0;
4735 old_pattern_flag = 0;
4736 cross_talk_pattern_flag = 1;
4737 }
4738 if ((strcmp(argv[1], "e") == 0) || (strcmp(argv[2], "e") == 0) || (strcmp(argv[3], "e") == 0))
4739 error_outof_count_flag = 1;
4740 }
4741
4742DDR_TEST_START:
4743
4744 do {
4745 if (lflag)
4746 loop = 888;
4747
4748 if (old_pattern_flag == 1) {
4749 {
4750 if (print_flag)
4751 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + test_size);
4752 ddr_write((void *)(int_convter_p(start_addr)), test_size);
4753 if (print_flag) {
4754 printf("\nEnd write. ");
4755 printf("\nStart 1st reading... ");
4756 }
4757 ddr_read((void *)(int_convter_p(start_addr)), test_size);
4758 if (print_flag) {
4759 printf("\nEnd 1st read. ");
4760 printf("\nStart 2nd reading... ");
4761 }
4762 ddr_read((void *)(int_convter_p(start_addr)), test_size);
4763 if (print_flag) {
4764 printf("\nEnd 2nd read. ");
4765 printf("\nStart 3rd reading... ");
4766 }
4767 ddr_read((void *)(int_convter_p(start_addr)), test_size);
4768 if (print_flag)
4769 printf("\nEnd 3rd read. \n");
4770
4771 if (copy_test_flag) {
4772 if (print_flag)
4773 printf("\n copy_test_flag = 1,start copy test. \n");
4774 ddr_test_copy((void *)(int_convter_p(start_addr + test_size / 2)), (void *)(int_convter_p(start_addr)), test_size / 2);
4775 ddr_read((void *)(int_convter_p(start_addr + test_size / 2)), test_size / 2);
4776 ddr_read((void *)(int_convter_p(start_addr + test_size / 2)), test_size / 2);
4777 }
4778 }
4779 {
4780 if (print_flag) {
4781 printf("\nStart *4 normal pattern. ");
4782 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + test_size);
4783 }
4784 ddr_write4((void *)(int_convter_p(start_addr)), test_size);
4785 if (print_flag) {
4786 printf("\nEnd write. ");
4787 printf("\nStart 1st reading... ");
4788 }
4789 ddr_read4((void *)(int_convter_p(start_addr)), test_size);
4790 if (print_flag) {
4791 printf("\nEnd 1st read. ");
4792 printf("\nStart 2nd reading... ");
4793 }
4794 ddr_read4((void *)(int_convter_p(start_addr)), test_size);
4795 if (print_flag) {
4796 printf("\nEnd 2nd read. ");
4797 printf("\nStart 3rd reading... ");
4798 }
4799 ddr_read4((void *)(int_convter_p(start_addr)), test_size);
4800 if (print_flag)
4801 printf("\rEnd 3rd read. \n");
4802 if (copy_test_flag) {
4803 ddr_test_copy((void *)(int_convter_p(start_addr + test_size / 2)), (void *)(int_convter_p(start_addr)), test_size / 2);
4804 ddr_read4((void *)(int_convter_p(start_addr + test_size / 2)), test_size / 2);
4805 ddr_read4((void *)(int_convter_p(start_addr + test_size / 2)), test_size / 2);
4806 }
4807 }
4808 }
4809
4810 if (simple_pattern_flag == 1) {
4811 if (print_flag) {
4812 printf("\nStart *4 no cross talk pattern. ");
4813 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + test_size);
4814 }
4815 ddr_write_pattern4_no_cross_talk((void *)(int_convter_p(start_addr)), test_size);
4816 if (print_flag) {
4817 printf("\rEnd write. ");
4818 printf("\rStart 1st reading... ");
4819 }
4820 ddr_read_pattern4_no_cross_talk((void *)(int_convter_p(start_addr)), test_size);
4821 if (print_flag) {
4822 printf("\rEnd 1st read. ");
4823 printf("\rStart 2nd reading... ");
4824 }
4825 ddr_read_pattern4_no_cross_talk((void *)(int_convter_p(start_addr)), test_size);
4826 if (print_flag) {
4827 printf("\rEnd 2nd read. ");
4828 printf("\rStart 3rd reading... ");
4829 }
4830 ddr_read_pattern4_no_cross_talk((void *)(int_convter_p(start_addr)), test_size);
4831 if (print_flag)
4832 printf("\rEnd 3rd read. \n");
4833
4834 if (copy_test_flag) {
4835 ddr_test_copy((void *)(int_convter_p(start_addr + test_size / 2)), (void *)(int_convter_p(start_addr)), test_size / 2);
4836 ddr_read_pattern4_no_cross_talk((void *)(int_convter_p(start_addr + test_size / 2)), test_size / 2);
4837 ddr_read_pattern4_no_cross_talk((void *)(int_convter_p(start_addr + test_size / 2)), test_size / 2);
4838 }
4839 }
4840
4841 if (cross_talk_pattern_flag == 1) {
4842 if (print_flag) {
4843 printf("\nStart *4 cross talk pattern p. ");
4844 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + test_size);
4845 }
4846 ddr_write_pattern4_cross_talk_p((void *)(int_convter_p(start_addr)), test_size);
4847 if (print_flag) {
4848 printf("\rEnd write. ");
4849 printf("\rStart 1st reading... ");
4850 }
4851 ddr_read_pattern4_cross_talk_p((void *)(int_convter_p(start_addr)), test_size);
4852 if (print_flag) {
4853 printf("\rEnd 1st read. ");
4854 printf("\rStart 2nd reading... ");
4855 }
4856 ddr_read_pattern4_cross_talk_p((void *)(int_convter_p(start_addr)), test_size);
4857 if (print_flag) {
4858 printf("\rEnd 2nd read. ");
4859 printf("\rStart 3rd reading... ");
4860 }
4861 ddr_read_pattern4_cross_talk_p((void *)(int_convter_p(start_addr)), test_size);
4862 if (print_flag) {
4863 printf("\rEnd 3rd read. \n");
4864
4865 printf("\nStart *4 cross talk pattern n. ");
4866 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + test_size);
4867 }
4868 ddr_write_pattern4_cross_talk_n((void *)(int_convter_p(start_addr)), test_size);
4869 if (print_flag) {
4870 printf("\rEnd write. ");
4871 printf("\rStart 1st reading... ");
4872 }
4873 ddr_read_pattern4_cross_talk_n((void *)(int_convter_p(start_addr)), test_size);
4874 if (print_flag) {
4875 printf("\rEnd 1st read. ");
4876 printf("\rStart 2nd reading... ");
4877 }
4878 ddr_read_pattern4_cross_talk_n((void *)(int_convter_p(start_addr)), test_size);
4879 if (print_flag) {
4880 printf("\rEnd 2nd read. ");
4881 printf("\rStart 3rd reading... ");
4882 }
4883 ddr_read_pattern4_cross_talk_n((void *)(int_convter_p(start_addr)), test_size);
4884 if (print_flag) {
4885 printf("\rEnd 3rd read. \n");
4886
4887 ///*
4888 printf("\nStart *4 cross talk pattern p2. ");
4889 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + test_size);
4890 }
4891 ddr_write_pattern4_cross_talk_p2((void *)(int_convter_p(start_addr)), test_size);
4892 if (print_flag) {
4893 printf("\rEnd write. ");
4894 printf("\rStart 1st reading... ");
4895 }
4896 ddr_read_pattern4_cross_talk_p2((void *)(int_convter_p(start_addr)), test_size);
4897 if (print_flag) {
4898 printf("\rEnd 1st read. ");
4899 printf("\rStart 2nd reading... ");
4900 }
4901 ddr_read_pattern4_cross_talk_p2((void *)(int_convter_p(start_addr)), test_size);
4902 if (print_flag) {
4903 printf("\rEnd 2nd read. ");
4904 printf("\rStart 3rd reading... ");
4905 }
4906 ddr_read_pattern4_cross_talk_p2((void *)(int_convter_p(start_addr)), test_size);
4907 if (print_flag) {
4908 printf("\rEnd 3rd read. \n");
4909
4910 printf("\nStart *4 cross talk pattern n2. ");
4911 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + test_size);
4912 }
4913 ddr_write_pattern4_cross_talk_n2((void *)(int_convter_p(start_addr)), test_size);
4914 if (print_flag) {
4915 printf("\rEnd write. ");
4916 printf("\rStart 1st reading... ");
4917 }
4918 ddr_read_pattern4_cross_talk_n2((void *)(int_convter_p(start_addr)), test_size);
4919 if (print_flag) {
4920 printf("\rEnd 1st read. ");
4921 printf("\rStart 2nd reading... ");
4922 }
4923 ddr_read_pattern4_cross_talk_n2((void *)(int_convter_p(start_addr)), test_size);
4924 if (print_flag) {
4925 printf("\rEnd 2nd read. ");
4926 printf("\rStart 3rd reading... ");
4927 }
4928 ddr_read_pattern4_cross_talk_n2((void *)(int_convter_p(start_addr)), test_size);
4929 if (print_flag)
4930 printf("\rEnd 3rd read. \n");
4931
4932 if (copy_test_flag) {
4933 ddr_test_copy((void *)(int_convter_p(start_addr + test_size / 2)), (void *)(int_convter_p(start_addr)), test_size / 2);
4934 ddr_read_pattern4_cross_talk_n2((void *)(int_convter_p(start_addr + test_size / 2)), test_size / 2);
4935 ddr_read_pattern4_cross_talk_n2((void *)(int_convter_p(start_addr + test_size / 2)), test_size / 2);
4936 }
4937 }
4938
4939 if (print_flag)
4940 printf("\nError count==0x%08x", error_count);
4941 } while (--loop);
4942
4943 printf("\rEnd ddr test. \n");
4944
4945 return 0;
4946
4947usage:
4948 cmd_usage(cmdtp);
4949 return 1;
4950}
4951
4952U_BOOT_CMD(
4953 ddrtest, 5, 1, do_ddr_test,
4954 "DDR test function",
4955 "ddrtest [LOOP] [ADDR].Default address is 0x8d000000\n"
4956 );
4957
4958int do_ddr_special_test(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
4959{
4960 char *endp;
4961 unsigned int loop = 1;
4962 unsigned int lflag = 0;
4963 unsigned int start_addr = DDR_TEST_START_ADDR;
4964 unsigned int test_addr = DDR_TEST_START_ADDR;
4965 unsigned int test_size = DDR_TEST_SIZE;
4966 unsigned int write_times = 1;
4967 unsigned int read_times = 3;
4968
4969 unsigned int print_flag = 1;
4970
4971 print_flag = 1;
4972 error_outof_count_flag = 0;
4973 error_count = 0;
4974 printf("\nargc== 0x%08x\n", argc);
4975 int i;
4976 for (i = 0; i < argc; i++)
4977 printf("\nargv[%d]=%s\n", i, argv[i]);
4978
4979 if (strcmp(argv[1], "l") == 0) {
4980 lflag = 1;
4981 } else if (strcmp(argv[1], "h") == 0) {
4982 //goto usage;
4983 } else {
4984 loop = simple_strtoull_ddr(argv[1], &endp, 10);
4985 if (*argv[1] == 0 || *endp != 0)
4986 loop = 1;
4987 }
4988
4989 if (argc == 1) {
4990 start_addr = DDR_TEST_START_ADDR;
4991 loop = 1;
4992 }
4993 if (argc > 2) {
4994 start_addr = simple_strtoull_ddr(argv[2], &endp, 16);
4995 if (*argv[2] == 0 || *endp != 0)
4996 start_addr = DDR_TEST_START_ADDR;
4997 }
4998 if (argc > 3) {
4999 test_size = simple_strtoull_ddr(argv[3], &endp, 16);
5000 if (*argv[3] == 0 || *endp != 0)
5001 test_size = DDR_TEST_SIZE;
5002 }
5003 if (test_size < 0x1000)
5004 test_size = DDR_TEST_SIZE;
5005 if (argc > 4) {
5006 write_times = simple_strtoull_ddr(argv[4], &endp, 16);
5007 if (*argv[4] == 0 || *endp != 0)
5008 write_times = 0;
5009 }
5010 if (argc > 5) {
5011 read_times = simple_strtoull_ddr(argv[5], &endp, 16);
5012 if (*argv[5] == 0 || *endp != 0)
5013 read_times = 0;
5014 }
5015 unsigned int base_pattern = 1;
5016 unsigned int inc_flag = 1;
5017 if (argc > 6) {
5018 base_pattern = simple_strtoull_ddr(argv[6], &endp, 16);
5019 if (*argv[6] == 0 || *endp != 0)
5020 base_pattern = 0;
5021 }
5022 if (argc > 7) {
5023 inc_flag = simple_strtoull_ddr(argv[7], &endp, 16);
5024 if (*argv[7] == 0 || *endp != 0)
5025 inc_flag = 0;
5026 }
5027
5028
5029 unsigned int count = 1;
5030 unsigned int test_val = 1;
5031
5032 do {
5033 if (lflag)
5034 loop = 888;
5035
5036 if (1) {
5037 for (i = 0; i < write_times; ) {
5038 i++;
5039 printf("\nwrite_times==0x%08x \n", ((unsigned int)i));
5040 test_addr = start_addr;
5041 test_val = base_pattern;
5042 count = (test_size >> 2);
5043 do {
5044 writel(test_val, (unsigned long)test_addr);
5045 test_addr = test_addr + 4;
5046 if (inc_flag)
5047 test_val = test_val + 1;
5048 } while (count--);
5049 }
5050
5051 for (i = 0; i < read_times; ) {
5052 i++;
5053 printf("\nread_times==0x%08x \n", ((unsigned int)i));
5054 test_addr = start_addr;
5055 test_val = base_pattern;
5056 count = (test_size >> 2);
5057
5058 do {
5059 if (test_val != (readl((unsigned long)test_addr)))
5060
5061 printf("\nadd==0x%08x,pattern==0x%08x,read==0x%08x \n", ((unsigned int)test_addr), ((unsigned int)test_val), (readl((unsigned int)test_addr)));
5062 test_addr = test_addr + 4;
5063 if (inc_flag)
5064 test_val = test_val + 1;
5065 } while (count--);
5066 }
5067 }
5068
5069
5070
5071 if (print_flag)
5072 printf("\nError count==0x%08x", error_count);
5073 } while (--loop);
5074
5075 printf("\rEnd ddr test. \n");
5076
5077 return 0;
5078
5079//usage:
5080 //cmd_usage(cmdtp);
5081 //return 1;
5082}
5083U_BOOT_CMD(
5084 ddr_spec_test, 8, 1, do_ddr_special_test,
5085 "DDR test function",
5086 "ddrtest [LOOP] [ADDR] [size] [write_times] [read times] [pattern] [inc].ddr_spec_test 1 0x1080000 0x200000 1 3 1 1 \n"
5087 );
5088
5089int ddr_test_s_cross_talk_pattern(int ddr_test_size)
5090{
5091#define TEST_OFFSET 0 //0X40000000
5092 unsigned int start_addr = test_start_addr;
5093
5094 error_outof_count_flag = 1;
5095
5096 error_count = 0;
5097
5098#if (CONFIG_DDR_PHY == P_DDR_PHY_905X)
5099 training_pattern_flag = 0;
5100#endif
5101 if (training_pattern_flag) {
5102#if (CONFIG_DDR_PHY == P_DDR_PHY_GX_BABY)
5103 ddr_test_gx_training_pattern(ddr_test_size);
5104#endif
5105 if (error_count)
5106 return 1;
5107 else
5108 return 0;
5109 } else {
5110#if (CONFIG_DDR_PHY == P_DDR_PHY_GX_BABY)
5111 ddr_test_gx_training_pattern(ddr_test_size);
5112#endif
5113 }
5114
5115 {
5116 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + ddr_test_size);
5117 ddr_write((void *)(int_convter_p(start_addr)), ddr_test_size);
5118 printf("\nEnd write. ");
5119 printf("\nStart 1st reading... ");
5120 ddr_read((void *)(int_convter_p(start_addr)), ddr_test_size);
5121 printf("\nEnd 1st read. ");
5122 printf("\nStart 2nd reading... ");
5123 ddr_read((void *)(int_convter_p(start_addr)), ddr_test_size);
5124 if (error_count)
5125 return error_count;
5126 printf("\nStart writing pattern4 at 0x%08x - 0x%08x...", start_addr, start_addr + ddr_test_size);
5127 ddr_write4((void *)(int_convter_p(start_addr)), ddr_test_size);
5128 printf("\nEnd write. ");
5129 printf("\nStart 1st reading... ");
5130 ddr_read4((void *)(int_convter_p(start_addr)), ddr_test_size);
5131 printf("\nEnd 1st read. ");
5132 printf("\nStart 2nd reading... ");
5133 ddr_read4((void *)(int_convter_p(start_addr)), ddr_test_size);
5134
5135 if (error_count)
5136 return error_count;
5137 printf("\nStart *4 no cross talk pattern. ");
5138 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + ddr_test_size);
5139 ddr_write_pattern4_no_cross_talk((void *)(int_convter_p(start_addr)), ddr_test_size);
5140 printf("\nEnd write. ");
5141 printf("\nStart 1st reading... ");
5142 ddr_read_pattern4_no_cross_talk((void *)(int_convter_p(start_addr)), ddr_test_size);
5143 printf("\nEnd 1st read. ");
5144 printf("\nStart 2nd reading... ");
5145 ddr_read_pattern4_no_cross_talk((void *)(int_convter_p(start_addr)), ddr_test_size);
5146 }
5147
5148 if (error_count)
5149 return error_count;
5150 {
5151 printf("\nStart *4 cross talk pattern p. ");
5152 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + ddr_test_size);
5153 ddr_write_pattern4_cross_talk_p((void *)(int_convter_p(start_addr)), ddr_test_size);
5154 printf("\rEnd write. ");
5155 printf("\rStart 1st reading... ");
5156 ddr_read_pattern4_cross_talk_p((void *)(int_convter_p(start_addr)), ddr_test_size);
5157 printf("\rEnd 1st read. ");
5158 printf("\rStart 2nd reading... ");
5159 ddr_read_pattern4_cross_talk_p((void *)(int_convter_p(start_addr)), ddr_test_size);
5160 printf("\rEnd 2nd read. ");
5161
5162 if (error_count)
5163 return error_count;
5164 printf("\nStart *4 cross talk pattern n. ");
5165 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + ddr_test_size);
5166 ddr_write_pattern4_cross_talk_n((void *)(int_convter_p(start_addr)), ddr_test_size);
5167 printf("\rEnd write. ");
5168 printf("\rStart 1st reading... ");
5169 ddr_read_pattern4_cross_talk_n((void *)(int_convter_p(start_addr)), ddr_test_size);
5170 printf("\rEnd 1st read. ");
5171 printf("\rStart 2nd reading... ");
5172 ddr_read_pattern4_cross_talk_n((void *)(int_convter_p(start_addr)), ddr_test_size);
5173 printf("\rEnd 2nd read. ");
5174 }
5175 if (error_count)
5176 return error_count;
5177 {
5178 printf("\nStart *4 cross talk pattern p2. ");
5179 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + ddr_test_size);
5180 ddr_write_pattern4_cross_talk_p2((void *)(int_convter_p(start_addr)), ddr_test_size);
5181 printf("\rEnd write. ");
5182 printf("\rStart 1st reading... ");
5183 ddr_read_pattern4_cross_talk_p2((void *)(int_convter_p(start_addr)), ddr_test_size);
5184 printf("\rEnd 1st read. ");
5185 printf("\rStart 2nd reading... ");
5186 ddr_read_pattern4_cross_talk_p2((void *)(int_convter_p(start_addr)), ddr_test_size);
5187 printf("\rEnd 2nd read. ");
5188
5189 if (error_count)
5190 return error_count;
5191 printf("\nStart *4 cross talk pattern n. ");
5192 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + ddr_test_size);
5193 ddr_write_pattern4_cross_talk_n2((void *)(int_convter_p(start_addr)), ddr_test_size);
5194 printf("\rEnd write. ");
5195 printf("\rStart 1st reading... ");
5196 ddr_read_pattern4_cross_talk_n2((void *)(int_convter_p(start_addr)), ddr_test_size);
5197 printf("\rEnd 1st read. ");
5198 printf("\rStart 2nd reading... ");
5199 ddr_read_pattern4_cross_talk_n2((void *)(int_convter_p(start_addr)), ddr_test_size);
5200 printf("\rEnd 2nd read. ");
5201
5202 if (copy_test_flag) {
5203 if (error_count)
5204 return error_count;
5205 printf("\n start copy test ... ");
5206 ddr_test_copy((void *)(int_convter_p(start_addr + ddr_test_size / 2)), (void *)(int_convter_p(start_addr)), ddr_test_size / 2);
5207 ddr_read_pattern4_cross_talk_n2((void *)(int_convter_p(start_addr + ddr_test_size / 2)), ddr_test_size / 2);
5208 ddr_read_pattern4_cross_talk_n2((void *)(int_convter_p(start_addr + ddr_test_size / 2)), ddr_test_size / 2);
5209 }
5210 }
5211
5212 if (error_count)
5213 return 1;
5214 else
5215 return 0;
5216}
5217
5218int ddr_test_s_cross_talk_pattern_quick_retrun(int ddr_test_size)
5219{
5220 error_outof_count_flag = 1;
5221#define TEST_OFFSET 0 //0X40000000
5222 unsigned int start_addr = test_start_addr;
5223
5224 error_outof_count_flag = 1;
5225
5226 error_count = 0;
5227
5228#if (CONFIG_DDR_PHY == P_DDR_PHY_905X)
5229 training_pattern_flag = 0;
5230#endif
5231 if (training_pattern_flag) {
5232#if (CONFIG_DDR_PHY == P_DDR_PHY_GX_BABY)
5233 ddr_test_gx_training_pattern(ddr_test_size);
5234#endif
5235 if (error_count)
5236 return 1;
5237 else
5238 return 0;
5239 } else {
5240#if (CONFIG_DDR_PHY == P_DDR_PHY_GX_BABY)
5241 ddr_test_gx_training_pattern(ddr_test_size);
5242#endif
5243 }
5244
5245 {
5246 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + ddr_test_size);
5247 ddr_write((void *)(int_convter_p(start_addr)), ddr_test_size);
5248 printf("\nEnd write. ");
5249 printf("\nStart 1st reading... ");
5250 ddr_read((void *)(int_convter_p(start_addr)), ddr_test_size);
5251 printf("\nEnd 1st read. ");
5252 printf("\nStart 2nd reading... ");
5253 ddr_read((void *)(int_convter_p(start_addr)), ddr_test_size);
5254
5255 printf("\nStart writing pattern4 at 0x%08x - 0x%08x...", start_addr, start_addr + ddr_test_size);
5256 ddr_write4((void *)(int_convter_p(start_addr)), ddr_test_size);
5257 printf("\nEnd write. ");
5258 printf("\nStart 1st reading... ");
5259 ddr_read4((void *)(int_convter_p(start_addr)), ddr_test_size);
5260 printf("\nEnd 1st read. ");
5261 printf("\nStart 2nd reading... ");
5262 ddr_read4((void *)(int_convter_p(start_addr)), ddr_test_size);
5263
5264 printf("\nStart *4 no cross talk pattern. ");
5265 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + ddr_test_size);
5266 ddr_write_pattern4_no_cross_talk((void *)(int_convter_p(start_addr)), ddr_test_size);
5267 printf("\nEnd write. ");
5268 printf("\nStart 1st reading... ");
5269 ddr_read_pattern4_no_cross_talk((void *)(int_convter_p(start_addr)), ddr_test_size);
5270 printf("\nEnd 1st read. ");
5271 printf("\nStart 2nd reading... ");
5272 ddr_read_pattern4_no_cross_talk((void *)(int_convter_p(start_addr)), ddr_test_size);
5273 }
5274 {
5275 printf("\nStart *4 cross talk pattern p. ");
5276 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + ddr_test_size);
5277 ddr_write_pattern4_cross_talk_p((void *)(int_convter_p(start_addr)), ddr_test_size);
5278 printf("\rEnd write. ");
5279 printf("\rStart 1st reading... ");
5280 ddr_read_pattern4_cross_talk_p((void *)(int_convter_p(start_addr)), ddr_test_size);
5281 printf("\rEnd 1st read. ");
5282 printf("\rStart 2nd reading... ");
5283 ddr_read_pattern4_cross_talk_p((void *)(int_convter_p(start_addr)), ddr_test_size);
5284 printf("\rEnd 2nd read. ");
5285
5286 printf("\nStart *4 cross talk pattern n. ");
5287 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + ddr_test_size);
5288 ddr_write_pattern4_cross_talk_n((void *)(int_convter_p(start_addr)), ddr_test_size);
5289 printf("\rEnd write. ");
5290 printf("\rStart 1st reading... ");
5291 ddr_read_pattern4_cross_talk_n((void *)(int_convter_p(start_addr)), ddr_test_size);
5292 printf("\rEnd 1st read. ");
5293 printf("\rStart 2nd reading... ");
5294 ddr_read_pattern4_cross_talk_n((void *)(int_convter_p(start_addr)), ddr_test_size);
5295 printf("\rEnd 2nd read. ");
5296 }
5297
5298 {
5299 printf("\nStart *4 cross talk pattern p2. ");
5300 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + ddr_test_size);
5301 ddr_write_pattern4_cross_talk_p2((void *)(int_convter_p(start_addr)), ddr_test_size);
5302 printf("\rEnd write. ");
5303 printf("\rStart 1st reading... ");
5304 ddr_read_pattern4_cross_talk_p2((void *)(int_convter_p(start_addr)), ddr_test_size);
5305 printf("\rEnd 1st read. ");
5306 printf("\rStart 2nd reading... ");
5307 ddr_read_pattern4_cross_talk_p2((void *)(int_convter_p(start_addr)), ddr_test_size);
5308 printf("\rEnd 2nd read. ");
5309
5310 printf("\nStart *4 cross talk pattern n. ");
5311 printf("\nStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + ddr_test_size);
5312 ddr_write_pattern4_cross_talk_n2((void *)(int_convter_p(start_addr)), ddr_test_size);
5313 printf("\rEnd write. ");
5314 printf("\rStart 1st reading... ");
5315 ddr_read_pattern4_cross_talk_n2((void *)(int_convter_p(start_addr)), ddr_test_size);
5316 printf("\rEnd 1st read. ");
5317 printf("\rStart 2nd reading... ");
5318 ddr_read_pattern4_cross_talk_n2((void *)(int_convter_p(start_addr)), ddr_test_size);
5319 printf("\rEnd 2nd read. ");
5320 if (copy_test_flag) {
5321 printf("\n start copy test ... ");
5322 ddr_test_copy((void *)(int_convter_p(start_addr + ddr_test_size / 2)), (void *)(int_convter_p(start_addr)), ddr_test_size / 2);
5323 ddr_read_pattern4_cross_talk_n2((void *)(int_convter_p(start_addr + ddr_test_size / 2)), ddr_test_size / 2);
5324 ddr_read_pattern4_cross_talk_n2((void *)(int_convter_p(start_addr + ddr_test_size / 2)), ddr_test_size / 2);
5325 }
5326 }
5327
5328 if (error_count)
5329 return 1;
5330 else
5331 return 0;
5332}
5333
5334int do_ddr2pll_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
5335{
5336#if (CONFIG_DDR_PHY >= P_DDR_PHY_G12)
5337 extern int do_ddr2pll_g12_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]);
5338 do_ddr2pll_g12_cmd(cmdtp, flag, argc, argv);
5339 return 1;
5340#endif
5341}
5342
5343int do_ddr_uboot_new_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
5344{
5345 //ddr_test_cmd 0x36 0x20180030 0x1 cmd_offset cmd_value value_size reset_enable
5346#define DDR_STICKY_OVERRIDE_CONFIG_MESSAGE_CMD 0x1 //override config
5347#define DDR_STICKY_SPECIAL_FUNCTION_CMD 0x2 //special test such as shift some bdlr or parameter or interleave test
5348
5349 uint32_t magic_chipid = 0; //rd_reg(P_PREG_STICKY_REG0);
5350 uint32_t sticky_cmd = 0; //rd_reg(P_PREG_STICKY_REG1);
5351 uint32_t cmd_offset = 0;
5352 uint32_t cmd_value = 0;
5353 uint32_t reset_enable = 0;
5354 uint32_t value_size = 4;
5355 char *endp;
5356 uint32_t read_value = 0;
5357 //bit 0 trigger effect reset.
5358 if ((magic_chipid) != ((DDR_STICKY_MAGIC_NUMBER + DDR_CHIP_ID) & 0xffff0000))
5359 //magic number not match
5360 printf("sticky0 magic not match\n");
5361
5362 printf("\nargc== 0x%08x\n", argc);
5363 int i;
5364 for (i = 0; i < argc; i++)
5365 printf("\nargv[%d]=%s\n", i, argv[i]);
5366
5367 if (argc < 2)
5368 goto usage;
5369
5370 magic_chipid = simple_strtoull_ddr(argv[1], &endp, 0);
5371 if (*argv[1] == 0 || *endp != 0) {
5372 printf("Error: Wrong format parament!\n");
5373 return 1;
5374 }
5375 if (argc > 2) {
5376 sticky_cmd = simple_strtoull_ddr(argv[2], &endp, 0);
5377 if (*argv[2] == 0 || *endp != 0)
5378 sticky_cmd = 0;
5379 }
5380
5381 if (argc > 3) {
5382 cmd_offset = simple_strtoull_ddr(argv[3], &endp, 0);
5383 if (*argv[3] == 0 || *endp != 0)
5384 cmd_offset = 0;
5385 }
5386 if (argc > 4) {
5387 cmd_value = simple_strtoull_ddr(argv[4], &endp, 0);
5388 if (*argv[4] == 0 || *endp != 0)
5389 cmd_value = 0;
5390 }
5391 if (argc > 5) {
5392 value_size = simple_strtoull_ddr(argv[5], &endp, 0);
5393 if (*argv[5] == 0 || *endp != 0)
5394 value_size = 4;
5395 }
5396 if (argc > 6) {
5397 reset_enable = simple_strtoull_ddr(argv[6], &endp, 0);
5398 if (*argv[6] == 0 || *endp != 0)
5399 reset_enable = 0;
5400 }
5401 printf("cmd_offset[0x%08x}==cmd_value [0x%08x]\n", cmd_offset, cmd_value);
5402 writel((magic_chipid & 0xffff0000) | (rd_reg((p_ddr_base->preg_sticky_reg0))), (p_ddr_base->preg_sticky_reg0));
5403 writel(sticky_cmd, (p_ddr_base->preg_sticky_reg0 + 4));
5404
5405
5406 if (value_size) {
5407 read_value = rd_reg((p_ddr_base->ddr_dmc_sticky0) + ((cmd_offset / 4) << 2));
5408 if (value_size == 1)
5409 wr_reg(((p_ddr_base->ddr_dmc_sticky0) + ((cmd_offset / 4) << 2)), ((cmd_value << ((cmd_offset % 4) * 8)) | (read_value & (~(0xff << ((cmd_offset % 4) * 8))))));
5410 if (value_size == 2)
5411 wr_reg(((p_ddr_base->ddr_dmc_sticky0) + ((cmd_offset / 4) << 2)), ((cmd_value << ((cmd_offset % 4) * 8)) | (read_value & (~(0xffff << ((cmd_offset % 4) * 8))))));
5412 if (value_size == 4)
5413 wr_reg(((p_ddr_base->ddr_dmc_sticky0) + ((cmd_offset / 4) << 2)), cmd_value);
5414
5415 printf("DMC_STICKY_0_ offset[0x%08x}== [0x%08x]\n", cmd_offset, readl(((p_ddr_base->ddr_dmc_sticky0) + ((cmd_offset / 4) << 2))));
5416 }
5417
5418 printf("(p_ddr_base->preg_sticky_reg0)== [0x%08x]\n", readl((p_ddr_base->preg_sticky_reg0)));
5419
5420 if (reset_enable) {
5421 ddr_test_watchdog_reset_system();
5422
5423 while (1) {
5424 }
5425 }
5426 return 0;
5427
5428usage:
5429 cmd_usage(cmdtp);
5430
5431 return 1;
5432}
5433
5434unsigned int do_test_address_bus(volatile unsigned int *baseAddress, unsigned int nBytes)
5435{
5436 unsigned int addressMask = (nBytes / sizeof(unsigned int) - 1);
5437 unsigned int offset;
5438 unsigned int testOffset;
5439
5440 unsigned int pattern = (unsigned int)0xAAAAAAAA;
5441 unsigned int antipattern = (unsigned int)0x55555555;
5442
5443 unsigned int data1, data2;
5444
5445 unsigned int ret = 0;
5446
5447 /*
5448 * Write the default pattern at each of the power-of-two offsets.
5449 */
5450 for (offset = 1; (offset & addressMask) != 0; offset <<= 1)
5451 baseAddress[offset] = pattern;
5452
5453 /*
5454 * Check for address bits stuck high.
5455 */
5456 testOffset = 0;
5457 baseAddress[testOffset] = antipattern;
5458
5459 for (offset = 1; (offset & addressMask) != 0; offset <<= 1) {
5460 data1 = baseAddress[offset];
5461 data2 = baseAddress[offset];
5462 if (data1 != data2) {
5463 printf(" memTestAddressBus - read twice different[offset]: 0x%8x-0x%8x\n", data1, data2);
5464 ret = 1;
5465 }
5466 if (data1 != pattern) {
5467 printf(" memTestAddressBus - write[0x%8x]: 0x%8x, read[0x%8x]: 0x%8x\n", \
5468 offset, pattern, offset, data1);
5469 ret = 1;
5470 }
5471 }
5472
5473 baseAddress[testOffset] = pattern;
5474
5475 /*
5476 * Check for address bits stuck low or shorted.
5477 */
5478 for (testOffset = 1; (testOffset & addressMask) != 0; testOffset <<= 1) {
5479 baseAddress[testOffset] = antipattern;
5480
5481 if (baseAddress[0] != pattern) {
5482 printf(" memTestAddressBus2 - write baseAddress[0x%8x]: 0x%8x, read baseAddress[0]: 0x%8x\n", \
5483 testOffset, antipattern, baseAddress[0]);
5484 ret = 1;
5485 }
5486
5487 for (offset = 1; (offset & addressMask) != 0; offset <<= 1) {
5488 data1 = baseAddress[offset];
5489 if ((data1 != pattern) && (offset != testOffset)) {
5490 printf(" memTestAddressBus3 - write baseAddress[0x%8x]: 0x%8x, read baseAddress[0x%8x]: 0x%8x\n", \
5491 testOffset, antipattern, testOffset, data1);
5492 ret = 1;
5493 }
5494 }
5495
5496 baseAddress[testOffset] = pattern;
5497 }
5498
5499 for (offset = 0x1; (offset <= addressMask); offset++) {
5500 if (((~offset) <= addressMask)) {
5501 baseAddress[offset] = pattern;
5502 baseAddress[(~offset)] = antipattern;
5503 }
5504 }
5505
5506 for (offset = 0x1; (offset <= addressMask); offset++) {
5507 if (((~offset) <= addressMask)) {
5508 if (baseAddress[offset] != pattern) {
5509 printf(" memTestAddressBus4 - write baseAddress[0x%8x]: 0x%8x, read baseAddress[0x%8x]: 0x%8x\n", \
5510 offset, pattern, offset, baseAddress[offset]);
5511
5512 ret = 1;
5513 break;
5514 }
5515
5516 if (baseAddress[(~offset)] != antipattern) {
5517 printf(" memTestAddressBus5 - write baseAddress[0x%8x]: 0x%8x, read baseAddress[0x%8x]: 0x%8x\n", \
5518 ((~offset)), antipattern, ((~offset)), baseAddress[((~offset))]);
5519 ret = 1;
5520 break;
5521 }
5522 }
5523 }
5524
5525 if (ret)
5526 return ret;
5527
5528 for (offset = 0x1; (offset <= addressMask); offset++) {
5529 {
5530 pattern = ((offset << 2) - offset);
5531 baseAddress[offset] = pattern;
5532 }
5533 }
5534
5535 for (offset = 0x1; (offset <= addressMask); offset++) {
5536 {
5537 pattern = ((offset << 2) - offset);
5538 if (baseAddress[offset] != pattern) {
5539 printf(" memTestAddressBus6 - write baseAddress[0x%8x]: 0x%8x, read baseAddress[0x%8x]: 0x%8x\n", \
5540 offset, pattern, offset, baseAddress[offset]);
5541 ret = 1;
5542 break;
5543 }
5544 }
5545 }
5546
5547 if (ret)
5548 return ret;
5549
5550 for (offset = 0x1; (offset <= addressMask); offset++) {
5551 {
5552 pattern = ~((offset << 2) - offset);
5553 baseAddress[offset] = pattern;
5554 }
5555 }
5556
5557 for (offset = 0x1; (offset <= addressMask); offset++) {
5558 {
5559 pattern = ~((offset << 2) - offset);
5560 if (baseAddress[offset] != pattern) {
5561 printf(" memTestAddressBus7 - write baseAddress[0x%8x]: 0x%8x, read baseAddress[0x%8x]: 0x%8x\n", \
5562 offset, pattern, offset, baseAddress[offset]);
5563 ret = 1;
5564 break;
5565 }
5566 }
5567 }
5568
5569
5570 return ret;
5571} /* memTestAddressBus() */
5572
5573int ddr_test_s_add_cross_talk_pattern(int ddr_test_size)
5574{
5575 unsigned int start_addr = test_start_addr;
5576
5577 error_outof_count_flag = 1;
5578 error_count = 0;
5579 printf("\rStart writing at 0x%08x - 0x%08x...", start_addr, start_addr + ddr_test_size);
5580 ddr_write((void *)(int_convter_p(start_addr)), ddr_test_size);
5581 printf("\rEnd write. ");
5582 printf("\nStart 1st reading... ");
5583 ddr_read((void *)(int_convter_p(start_addr)), ddr_test_size);
5584 printf("\rEnd 1st read. ");
5585 printf("\rStart 2nd reading... ");
5586 ddr_read((void *)(int_convter_p(start_addr)), ddr_test_size);
5587 ddr_write_full((void *)(int_convter_p(start_addr)), ddr_test_size, 0x0, 0x3);
5588 printf("\rEnd write. ");
5589 printf("\rStart 1st reading... ");
5590 ddr_read_full((void *)(int_convter_p(start_addr)), ddr_test_size, 0, 3);
5591 printf("\rEnd 1st read. ");
5592 printf("\rStart 2nd reading... ");
5593 ddr_read_full((void *)(int_convter_p(start_addr)), ddr_test_size, 0, 3);
5594
5595 printf("\rStart writing add pattern ");
5596 if (do_test_address_bus((void *)(int_convter_p(start_addr)), ddr_test_size))
5597 error_count++;
5598
5599 if (error_count)
5600 return 1;
5601 else
5602 return 0;
5603}
5604
5605int pll_convert_to_ddr_clk_g12a(unsigned int ddr_pll)
5606{
5607 unsigned int ddr_clk = 0;
5608 unsigned int od_div = 0xfff;
5609
5610 ddr_pll = ddr_pll & 0xfffff;
5611 if (((ddr_pll >> 16) & 7) == 0)
5612 od_div = 2;
5613 if (((ddr_pll >> 16) & 7) == 1)
5614 od_div = 3;
5615
5616 if (((ddr_pll >> 16) & 7) == 2)
5617 od_div = 4;
5618
5619 if (((ddr_pll >> 16) & 7) == 3)
5620 od_div = 6;
5621
5622 if (((ddr_pll >> 16) & 7) == 4)
5623 od_div = 8;
5624
5625 if (((ddr_pll >> 10) & 0x1f))
5626 ddr_clk = 2 * ((((24 * ((ddr_pll >> 0) & 0x1ff)) / ((ddr_pll >> 10) & 0x1f)) >> ((((ddr_pll >> 19) & 0x1) == 1) ? (2) : (1)))) / od_div;
5627
5628 return ddr_clk;
5629}
5630
5631int ddr_clk_convert_to_pll_g12a(unsigned int ddr_clk, unsigned char pll_bypass_en)
5632{
5633 uint32_t ddr_pll_vco_ctrl = 0;
5634 uint32_t ddr_pll_vco_m = 0;
5635 uint32_t ddr_pll_vco_n = 0;
5636 uint32_t ddr_pll_vco_ctrl_od = 0;
5637 uint32_t ddr_pll_vco_ctrl_od1 = 0;
5638
5639 ddr_pll_vco_n = 1;
5640 if (pll_bypass_en == 0) {
5641 if ((ddr_clk >= 4800 / 4)) {
5642 ddr_pll_vco_ctrl_od = 1;
5643 ddr_pll_vco_ctrl_od1 = 0x2; //0
5644 ddr_pll_vco_m = (ddr_clk * 3) / 24; //6
5645 } else if ((ddr_clk > 4800 / 6)) {
5646 ddr_pll_vco_ctrl_od = 2;
5647 ddr_pll_vco_ctrl_od1 = 0x2; //0
5648 ddr_pll_vco_m = (ddr_clk * 4) / 24; //8
5649 } else if ((ddr_clk > 4800 / 8)) {
5650 ddr_pll_vco_ctrl_od = 3;
5651 ddr_pll_vco_ctrl_od1 = 0x2; //0
5652 ddr_pll_vco_m = (ddr_clk * 6) / 24; //12
5653 } else if ((ddr_clk > 4800 / 12)) {
5654 ddr_pll_vco_ctrl_od = 4;
5655 ddr_pll_vco_ctrl_od1 = 0x2; //0
5656 ddr_pll_vco_m = (ddr_clk * 8) / 24; //16
5657 } else if ((ddr_clk > 360)) {
5658 ddr_pll_vco_ctrl_od = 3;
5659 ddr_pll_vco_ctrl_od1 = 0x3; //0
5660 ddr_pll_vco_m = (ddr_clk * 12) / 24;
5661 } else {
5662 ddr_pll_vco_ctrl_od = 4;
5663 ddr_pll_vco_ctrl_od1 = 0x3; //0
5664 ddr_pll_vco_m = (ddr_clk * 16) / 24;
5665 }
5666 }
5667#if 0
5668 if (pll_bypass_en == 1) {
5669 ddr_pll_vco_ctrl_od1 = 0x3; //0
5670 if ((ddr_clk >= 800)) {
5671 ddr_pll_vco_ctrl_od = 0;
5672 ddr_pll_vco_m = (ddr_clk * 4) / 24;
5673 } else if ((ddr_clk < 4800 / 6)) {
5674 ddr_pll_vco_ctrl_od = 1;
5675 ddr_pll_vco_m = (ddr_clk * 2 * 3) / 24;
5676 } else if ((ddr_clk < 4800 / 8)) {
5677 ddr_pll_vco_ctrl_od = 2;
5678 ddr_pll_vco_m = (ddr_clk * 2 * 4) / 24;
5679 } else if ((ddr_clk < 4800 / 12)) {
5680 ddr_pll_vco_ctrl_od = 3;
5681 ddr_pll_vco_m = (ddr_clk * 2 * 6) / 24;
5682 } else if ((ddr_clk < 4800 / 16)) {
5683 ddr_pll_vco_ctrl_od = 4;
5684 ddr_pll_vco_m = (ddr_clk * 2 * 8) / 24;
5685 }
5686 }
5687#endif
5688 ddr_pll_vco_ctrl = ddr_pll_vco_m | (ddr_pll_vco_n << 10) | (ddr_pll_vco_ctrl_od << 16) | (ddr_pll_vco_ctrl_od1 << 19);
5689 return ddr_pll_vco_ctrl;
5690}
5691
5692int pll_convert_to_ddr_clk(unsigned int ddr_pll)
5693{
5694 unsigned int ddr_clk = 0;
5695
5696 ddr_pll = ddr_pll & 0xfffff;
5697
5698#if (CONFIG_DDR_PHY >= P_DDR_PHY_G12)
5699 ddr_clk = pll_convert_to_ddr_clk_g12a(ddr_pll);
5700 return ddr_clk;
5701#else
5702#if (CONFIG_DDR_PHY == P_DDR_PHY_905X)
5703 if (((ddr_pll >> 16) & 0x1f))
5704
5705 ddr_clk = 2 * ((((24 * ((ddr_pll >> 4) & 0x1ff)) / ((ddr_pll >> 16) & 0x1f)) >> ((((ddr_pll >> 0) & 0x3) == 3) ? (2) : (((ddr_pll >> 0) & 0x3)))) >> ((((ddr_pll >> 2) & 0x3) == 3) ? (2) : (((ddr_pll >> 2) & 0x3))));
5706
5707#else
5708 if ((ddr_pll >> 9) & 0x1f)
5709 ddr_clk = 2 * (((24 * (ddr_pll & 0x1ff)) / ((ddr_pll >> 9) & 0x1f)) >> ((ddr_pll >> 16) & 0x3));
5710
5711#endif
5712 return ddr_clk;
5713#endif
5714#if (CONFIG_DDR_PHY == P_DDR_PHY_DEFAULT)
5715 if ((ddr_pll >> 9) & 0x1f)
5716 ddr_clk = 2 * ((24 * (ddr_pll & 0x1ff)) / ((ddr_pll >> 9) & 0x1f)) >> ((ddr_pll >> 16) & 0x3);
5717 return ddr_clk;
5718#endif
5719
5720 //return ddr_clk;
5721}
5722
5723int ddr_clk_convert_to_pll(unsigned int ddr_clk)
5724{
5725 unsigned int ddr_pll = 0x10221;
5726
5727#if (CONFIG_DDR_PHY >= P_DDR_PHY_G12)
5728 ddr_pll = ddr_clk_convert_to_pll_g12a(ddr_clk, 0);
5729 return ddr_pll;
5730#else
5731
5732 /* set ddr pll reg */
5733 if ((ddr_clk >= 40) && (ddr_clk < 750))
5734 ddr_pll = (2 << 16) | (1 << 9) | ((((ddr_clk / 6) * 6) / 12) << 0);
5735 else if ((ddr_clk >= 750) && (ddr_clk < 2000))
5736 ddr_pll = (1 << 16) | (1 << 9) | ((((ddr_clk / 12) * 12) / 24) << 0);
5737 return ddr_pll;
5738#endif
5739#if (CONFIG_DDR_PHY == P_DDR_PHY_905X)
5740 ddr_pll = 0x00104c5;
5741 /* set ddr pll reg */
5742 /*
5743 * if ((ddr_clk >= 40) && (ddr_clk < 750)) {
5744 * // OD N M
5745 * ddr_pll= (2 << 2) | (1 << 16) | ((((ddr_clk/6)*6)/12) << 4);
5746 * }
5747 * else if((ddr_clk >= 750) && (ddr_clk < 2000)) {
5748 * // OD N M
5749 * ddr_pll= (1 << 2) | (1 << 16) | ((((ddr_clk/12)*12)/24) << 4);
5750 * }
5751 */
5752 if ((ddr_clk < 200))
5753 // OD1 OD N M
5754 ddr_pll = (2 << 0) | (3 << 2) | (1 << 16) | ((((ddr_clk * 6) / 6) / 3) << 4);
5755 else if ((ddr_clk >= 200) && (ddr_clk < 400))
5756 // OD1 OD N M
5757 ddr_pll = (2 << 0) | (1 << 2) | (1 << 16) | ((((ddr_clk * 6) / 6) / 6) << 4);
5758 else if ((ddr_clk >= 400) && (ddr_clk < 800))
5759 // OD1 OD N M
5760 ddr_pll = (1 << 0) | (1 << 2) | (1 << 16) | ((((ddr_clk * 12) / 12) / 12) << 4);
5761 else if ((ddr_clk >= 800) && (ddr_clk < 2000))
5762 // OD1 OD N M
5763 ddr_pll = (0 << 0) | (1 << 2) | (1 << 16) | ((((ddr_clk * 12) / 12) / 24) << 4);
5764 return ddr_pll;
5765
5766#endif
5767
5768#if (CONFIG_DDR_PHY == P_DDR_PHY_DEFAULT)
5769 {
5770 if ((ddr_clk < 750))
5771 // OD N M
5772 ddr_pll = (2 << 16) | (1 << 9) | (((ddr_clk / 24) * 2) << 0);
5773 else if ((ddr_clk >= 750))
5774 // OD N M
5775 ddr_pll = (1 << 16) | (1 << 9) | ((ddr_clk / 24) << 0);
5776 }
5777 return ddr_pll;
5778#endif
5779
5780 //return ddr_pll;
5781}
5782
5783int get_ddr_clk(void)
5784{
5785 unsigned int ddr_clk = 10;
5786 unsigned int ddr_pll = 0;
5787
5788 if (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_G12A ||
5789 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_G12B ||
5790 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_TL1 ||
5791 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_SM1 ||
5792 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_TM2 ||
5793 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_C1 ||
5794 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_SC2 ||
5795 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T7) {
5796 ddr_pll = rd_reg(p_ddr_base->ddr_pll_base_address);
5797 ddr_pll = ddr_pll & 0xfffff;
5798 ddr_clk = pll_convert_to_ddr_clk_g12a(ddr_pll);
5799 } else if (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_A1) {
5800 ddr_clk = 768;
5801 } else if (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_C2 ||
5802 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T5 ||
5803 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T5D ||
5804 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_S4 ||
5805 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T5W ||
5806 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T3) {
5807 uint32_t stick_store_sticky_f0_reg_base_t =
5808 (p_ddr_base->ddr_phy_base_address + 0x0128);
5809 ddr_clk = rd_reg(stick_store_sticky_f0_reg_base_t);
5810 } else {
5811 ddr_clk = 10;
5812 }
5813 return ddr_clk;
5814}
5815
5816void ddr_memcpy(void *dst, const void *src, uint32_t len)
5817{
5818 len = (len >> 3);
5819 const long long *s = src;
5820 long long *d = dst;
5821#ifdef TEST_L1_CACHE
5822 void *bound = (void *)src + 16 * 1024; //debug for test L1 cache ,if only read write small aread
5823#endif
5824 if (pre_fetch_enable) {
5825 while (len) {
5826 //for best test efficiency not inclued much more code in the while loop
5827 ddr_pld_cache(s);
5828 ///1 times len==33554432 copy time==18192 us 1.2g bandwidth 3688M/S
5829 // 4times len==33554432 copy time==11844 us 1.2g bandwidth 5666M/S
5830 // 8times len==33554432 copy time==11844 us 1.2g bandwidth 5666M/S
5831 *d++ = *s++;
5832 *d++ = *s++;
5833 *d++ = *s++;
5834 *d++ = *s++;
5835 len = len - 4;
5836#ifdef TEST_L1_CACHE
5837 if ((void *)s >= bound) {
5838 s = src;
5839 d = dst;
5840 }
5841#endif
5842 }
5843 } else {
5844 while (len) { //for best test efficiency not inclued much more code in the while loop
5845 ///1 times len==33554432 copy time==18192 us 1.2g bandwidth 3688M/S
5846 // 4times len==33554432 copy time==11844 us 1.2g bandwidth 5666M/S
5847 // 8times len==33554432 copy time==11844 us 1.2g bandwidth 5666M/S
5848 *d++ = *s++;
5849 *d++ = *s++;
5850 *d++ = *s++;
5851 *d++ = *s++;
5852 len = len - 4;
5853#ifdef TEST_L1_CACHE
5854 if ((void *)s >= bound) {
5855 s = src;
5856 d = dst;
5857 }
5858#endif
5859 }
5860 }
5861}
5862
5863#define PATTERN_MATRIX_X (3 + 32 + 16 + 17) //68*32==2176 ///2.2k -0x880-1 loop
5864#define PATTERN_MATRIX_Y (32)
5865#define PATTERN_MATRIX_LOOP_SIZE ((PATTERN_MATRIX_X)*(PATTERN_MATRIX_Y) * 4)
5866
5867unsigned int cpu_ddr_test_init_pattern_generater(unsigned int add_offset)
5868{
5869 unsigned int pattern_select = 0;
5870 unsigned int pattern_value = 0;
5871 uint32_t martix_x_select = 0;
5872 uint32_t martix_y_select = 0;
5873 unsigned int pattern_value_temp_16 = 0;
5874
5875 {
5876 {
5877 pattern_select = ((add_offset) % ((PATTERN_MATRIX_Y)*(PATTERN_MATRIX_X)));
5878 martix_x_select = pattern_select / (PATTERN_MATRIX_Y);
5879 martix_y_select = pattern_select % (PATTERN_MATRIX_Y);
5880 {
5881 if (martix_x_select == 0)
5882 pattern_value = 0xaaaa5555; //for 16 bit bus pattern
5883
5884 if (martix_x_select == 1)
5885 pattern_value = 0x0000ffff; //for 16 bit bus pattern
5886
5887 if (martix_x_select == 2)
5888 pattern_value = 0;
5889
5890 if ((martix_x_select > 2) && (martix_x_select < (3 + 32)))
5891 pattern_value = 1 << (martix_x_select - 3);
5892 if ((martix_x_select > (2 + 32)) && (martix_x_select < (3 + 32 + 16))) { //for 16 bit bus pattern
5893 pattern_value_temp_16 = (1 << (martix_x_select - 3 - 32));
5894 pattern_value = pattern_value_temp_16 | ((~pattern_value_temp_16) << 16);
5895 }
5896 if ((martix_x_select > (2 + 32 + 16)) && (martix_x_select < (3 + 32 + 16 + 17))) { //for dbi bus pattern 17 group
5897 pattern_value_temp_16 = (0x0f0f + 0xf0f * (martix_x_select - 3 - 32 - 16));
5898 pattern_value = pattern_value_temp_16 | ((~pattern_value_temp_16) << 16);
5899 }
5900 }
5901 if (martix_y_select % 2)
5902 pattern_value = ~pattern_value;
5903 }
5904 }
5905 return pattern_value;
5906}
5907
5908void cpu_ddr_test_init_pattern_area(unsigned int test_init_start, unsigned int test_size, unsigned int parttern_frequency_setting)
5909{
5910 if (parttern_frequency_setting == 0)
5911 parttern_frequency_setting = 1; //for different frequency pattern
5912 test_size = (test_size > ((PATTERN_MATRIX_LOOP_SIZE)*(parttern_frequency_setting))) ? test_size : ((PATTERN_MATRIX_LOOP_SIZE)*(parttern_frequency_setting));
5913 unsigned int write_add = test_init_start;
5914 unsigned int size_loop = 0;
5915 unsigned int size_loop_max = 0;
5916 for (; (size_loop < ((PATTERN_MATRIX_LOOP_SIZE)*(parttern_frequency_setting))); ) {
5917 {
5918 write_add = (uint32_t)(size_loop + test_init_start);
5919 wr_reg((unsigned long)write_add, cpu_ddr_test_init_pattern_generater((size_loop >> 2) / parttern_frequency_setting));
5920 size_loop = size_loop + 4;
5921 }
5922 }
5923 size_loop = 1;
5924 size_loop_max = ((test_size / (((PATTERN_MATRIX_LOOP_SIZE)*(parttern_frequency_setting)))) + 1);
5925 for (; (size_loop < size_loop_max); ) {
5926 ddr_memcpy((void *)(uint64_t)(test_init_start + ((PATTERN_MATRIX_LOOP_SIZE)*((uint64_t)parttern_frequency_setting)) * (size_loop)), (void *)(uint64_t)test_init_start, (uint32_t)((PATTERN_MATRIX_LOOP_SIZE)*(parttern_frequency_setting)));
5927 size_loop++;
5928 }
5929}
5930
5931unsigned int cpu_ddr_test(unsigned test_init_start, unsigned int start_add, unsigned int test_size, unsigned int test_data_bit_enable, unsigned int parttern_frequency_setting)
5932{
5933 unsigned int src_add = test_init_start;
5934 unsigned int pattern_value = 0;
5935 unsigned int size_loop = 0;
5936 unsigned int ddr_test_error = 0;
5937 unsigned int read_add = 0;
5938 unsigned int read_value = 0;
5939
5940 test_size = (test_size > 0x2000) ? (test_size) : (0x2000);
5941 uint32_t ddr_test_start_time_us = get_us_time(); // check cost time
5942 ddr_memcpy((void *)(uint64_t)start_add, (void *)(uint64_t)src_add, test_size);
5943 uint32_t ddr_test_end_time_us = get_us_time(); // check cost time
5944 printf("\ncpu_ddr_test_test_copy_bandwidth==%d Mbyte/s\n", (1 * test_size * 2) / (ddr_test_end_time_us - ddr_test_start_time_us));
5945
5946 for (; size_loop < (test_size); ) {
5947 read_add = (uint32_t)(size_loop + start_add);
5948 read_value = (rd_reg((unsigned long)read_add));
5949 pattern_value = (cpu_ddr_test_init_pattern_generater((size_loop >> 2) / parttern_frequency_setting));
5950 if (((test_data_bit_enable) & read_value) != ((test_data_bit_enable) & pattern_value)) {
5951 printf("error data enable %08x read_value %08x pattern_value %08x", test_data_bit_enable, read_value, pattern_value);
5952 ddr_test_error++;
5953 return ddr_test_error;
5954 }
5955 size_loop = size_loop + (1 << 2); // use big step will fast test ,but lose accuracy.
5956 }
5957 return ddr_test_error;
5958}
5959
5960int do_cpu_ddr_test(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
5961{
5962 check_base_address();
5963 int i = 0;
5964 printf("\nargc== 0x%08x\n", argc);
5965 for (i = 0; i < argc; i++)
5966 printf("\nargv[%d]=%s\n", i, argv[i]);
5967 unsigned int init_start_add = 0;
5968 unsigned int test_add = 0;
5969 unsigned int test_size = 0;
5970 unsigned int test_data_bit_enable = 0;
5971 unsigned int test_loops = 0;
5972 unsigned int test_loop = 0;
5973 unsigned int test_errors = 0;
5974 unsigned int parttern_frequency_setting = 1;
5975 char *endp;
5976 if (argc == 1) {
5977 printf("\nplease read help\n");
5978 } else {
5979 if (argc >= 2)
5980 init_start_add = simple_strtoull_ddr(argv[1], &endp, 0);
5981
5982 if (argc >= 3)
5983 test_add = simple_strtoull_ddr(argv[2], &endp, 0);
5984 if (argc >= 4)
5985 test_size = simple_strtoull_ddr(argv[3], &endp, 0);
5986 if (argc >= 5)
5987 test_data_bit_enable = simple_strtoull_ddr(argv[4], &endp, 0);
5988 if (argc >= 6) {
5989 test_loops = simple_strtoull_ddr(argv[5], &endp, 0);
5990 if (test_loops == 0)
5991 test_loops = 1;
5992 }
5993 if (argc >= 7) {
5994 parttern_frequency_setting = simple_strtoull_ddr(argv[6], &endp, 0);
5995 if (parttern_frequency_setting == 0)
5996 parttern_frequency_setting = 1;
5997 }
5998 if (argc >= 8)
5999 pre_fetch_enable = simple_strtoull_ddr(argv[7], &endp, 0);
6000 }
6001 uint32_t ddr_test_start_time_us = get_us_time(); // check cost time
6002 cpu_ddr_test_init_pattern_area(init_start_add, test_size, parttern_frequency_setting);
6003 for (test_loop = 0; test_loop < test_loops; ) {
6004 test_errors = test_errors + cpu_ddr_test(init_start_add, test_add, test_size, test_data_bit_enable, parttern_frequency_setting);
6005 test_loop++;
6006 printf("\ncpu_ddr_test_test_times==%d test_errors==%d", test_loop, test_errors);
6007 }
6008 uint32_t ddr_test_end_time_us = get_us_time(); // check cost time
6009 printf("\ncpu_ddr_test_test_and compare_bandwidth==%d Mbyte/s\n", (test_loops * test_size * 2) / (ddr_test_end_time_us - ddr_test_start_time_us));
6010 return test_errors;
6011}
6012
6013U_BOOT_CMD(
6014 ddr_cpu_test, 30, 1, do_cpu_ddr_test,
6015 "ddr_test_cmd cmd arg1 arg2 arg3...",
6016 "ddr_test_cmd cmd arg1 arg2 arg3... \n dcache off ? \n"
6017 );
6018
6019int do_ddr_test_write_read(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
6020{
6021 {
6022 printf("\nEnter do_ddr_test_ddr_write_read_current\n");
6023 int i = 0;
6024 printf("\nargc== 0x%08x\n", argc);
6025 for (i = 0; i < argc; i++)
6026 printf("\nargv[%d]=%s\n", i, argv[i]);
6027
6028 char *endp;
6029
6030 unsigned int pattern_id = 1;
6031 unsigned int pattern[4] = { 0 };
6032 unsigned int write_read = 0;
6033 unsigned int read_pattern[4] = { 0 };
6034 unsigned int loop = 1;
6035 unsigned int start_addr = DDR_TEST_START_ADDR;
6036 unsigned int test_size = DDR_TEST_SIZE;
6037 unsigned int copy_offset = DDR_TEST_SIZE;
6038 unsigned int no_show_info = 0;
6039 unsigned int us_delay_counter = 0;
6040
6041
6042 if (argc == 1) {
6043 printf("\nplease read help\n");
6044 } else {
6045 if (argc >= 2)
6046 write_read = simple_strtoull_ddr(argv[1], &endp, 0);
6047 if (argc >= 3)
6048 pattern_id = simple_strtoull_ddr(argv[2], &endp, 0);
6049 if (argc >= 4)
6050 loop = simple_strtoull_ddr(argv[3], &endp, 0);
6051 if (argc >= 5)
6052 start_addr = simple_strtoull_ddr(argv[4], &endp, 0);
6053 if (argc >= 6)
6054 test_size = simple_strtoull_ddr(argv[5], &endp, 0);
6055 if (argc >= 7)
6056 no_show_info = simple_strtoull_ddr(argv[6], &endp, 0);
6057 if (argc >= 8)
6058 us_delay_counter = simple_strtoull_ddr(argv[7], &endp, 0);
6059 }
6060 printf("\nwrite_read== 0x%08d\n", write_read);
6061 printf("\npattern_id== 0x%08d\n", pattern_id);
6062 printf("\nloop== 0x%08d\n", loop);
6063 printf("\nstart_addr== 0x%08x\n", start_addr);
6064 printf("\ntest_size== 0x%08x\n", test_size);
6065 printf("\nus_delay_counter== %d\n", us_delay_counter);
6066 copy_offset = test_size;
6067
6068 unsigned int *p;
6069 unsigned int j;
6070
6071 p = (unsigned int *)(int_convter_p(start_addr));
6072
6073 if (pattern_id == 0) {
6074 pattern[0] = 0;
6075 pattern[1] = 0;
6076 pattern[2] = 0;
6077 pattern[3] = 0;
6078 }
6079 if (pattern_id == 1) {
6080 pattern[0] = 0xffffffff;
6081 pattern[1] = 0xffffffff;
6082 pattern[2] = 0xffffffff;
6083 pattern[3] = 0xffffffff;
6084 }
6085
6086 do {
6087 if (write_read == 0) {
6088 if (!no_show_info)
6089 printf("\nloop:0x%08x:Start writing at 0x%08x - 0x%08x...", loop, start_addr, start_addr + test_size);
6090 for (j = 0; j < test_size / 4; ) {
6091 *(p + j) = (pattern[0]);
6092 *(p + j + 1) = (pattern[1]);
6093 *(p + j + 2) = (pattern[2]);
6094 *(p + j + 3) = (pattern[3]);
6095 j = j + 4;
6096 }
6097 }
6098 if (write_read == 1) {
6099 if (!no_show_info)
6100 printf("\nloop:0x%08x:Start reading at 0x%08x - 0x%08x...", loop, start_addr, start_addr + test_size);
6101 for (j = 0; j < test_size / 4; ) {
6102 read_pattern[0] = *(p + j);
6103 read_pattern[1] = *(p + j + 1);
6104 read_pattern[2] = *(p + j + 2);
6105 read_pattern[3] = *(p + j + 3);
6106 j = j + 4;
6107 }
6108
6109 if (loop == 1) {
6110 if (!no_show_info) {
6111 printf(" \nloop:0x%08x:Start reading read_pattern[0] 0x%08x, pattern[1] 0x%08x,pattern[2] 0x%08x,pattern[3] 0x%08x",
6112 loop, read_pattern[0], read_pattern[1], read_pattern[2], read_pattern[3]
6113 );
6114 }
6115 }
6116 }
6117 if (write_read == 2) {
6118 if (!no_show_info)
6119 printf("\nloop:0x%08x:Start copying at 0x%08x - 0x%08x...", loop, start_addr, start_addr + test_size);
6120 for (j = 0; j < test_size / 4; ) {
6121 *(p + j + copy_offset / 4) = *(p + j);
6122 *(p + j + 1 + copy_offset / 4) = *(p + j + 1);
6123 *(p + j + 2 + copy_offset / 4) = *(p + j + 2);
6124 *(p + j + 3 + copy_offset / 4) = *(p + j + 3);
6125 j = j + 4;
6126 }
6127 }
6128 if (us_delay_counter)
6129 ddr_udelay(us_delay_counter);
6130 } while (loop--);
6131
6132 printf("\ntest end\n");
6133
6134 return 1;
6135 }
6136}
6137
6138#if (CONFIG_DDR_PHY >= P_DDR_PHY_G12)
6139
6140#define TEST_MIN_DDR_EE_VOLTAGE 681
6141#define TEST_MAX_DDR_EE_VOLTAGE 962
6142static int pwm_voltage_table_ee[][2] =
6143{
6144 { 0x1c0000, 681 },
6145 { 0x1b0001, 691 },
6146 { 0x1a0002, 701 },
6147 { 0x190003, 711 },
6148 { 0x180004, 721 },
6149 { 0x170005, 731 },
6150 { 0x160006, 741 },
6151 { 0x150007, 751 },
6152 { 0x140008, 761 },
6153 { 0x130009, 772 },
6154 { 0x12000a, 782 },
6155 { 0x11000b, 792 },
6156 { 0x10000c, 802 },
6157 { 0x0f000d, 812 },
6158 { 0x0e000e, 822 },
6159 { 0x0d000f, 832 },
6160 { 0x0c0010, 842 },
6161 { 0x0b0011, 852 },
6162 { 0x0a0012, 862 },
6163 { 0x090013, 872 },
6164 { 0x080014, 882 },
6165 { 0x070015, 892 },
6166 { 0x060016, 902 },
6167 { 0x050017, 912 },
6168 { 0x040018, 922 },
6169 { 0x030019, 932 },
6170 { 0x02001a, 942 },
6171 { 0x01001b, 952 },
6172 { 0x00001c, 962 }
6173};
6174uint32_t find_vddee_voltage_index(unsigned int target_voltage)
6175{
6176 unsigned int to;
6177
6178 for (to = 0; to < ARRAY_SIZE(pwm_voltage_table_ee); to++)
6179 if (pwm_voltage_table_ee[to][1] >= target_voltage)
6180 break;
6181
6182 if (to >= ARRAY_SIZE(pwm_voltage_table_ee))
6183 to = ARRAY_SIZE(pwm_voltage_table_ee) - 1;
6184 return to;
6185}
6186
6187void set_ee_voltage(uint32_t ee_over_ride_voltage)
6188{
6189 unsigned int to;
6190
6191 for (to = (ARRAY_SIZE(pwm_voltage_table_ee) - 1); (to > 0); to--)
6192 if ((pwm_voltage_table_ee[to - 1][1] < ee_over_ride_voltage) && (pwm_voltage_table_ee[to][1] >= ee_over_ride_voltage))
6193 break;
6194 if (to == (ARRAY_SIZE(pwm_voltage_table_ee)))
6195 to = (ARRAY_SIZE(pwm_voltage_table_ee) - 1);
6196 if (ee_over_ride_voltage) {
6197 writel(pwm_voltage_table_ee[to][0], (p_ddr_base->ee_pwm_base_address));
6198 printf("\nDDR_override_EE_voltage ==%d mv /n", pwm_voltage_table_ee[to][1]);
6199 }
6200}
6201
6202unsigned int read_ee_voltage(void)
6203{
6204 unsigned int to;
6205 unsigned int reg_value = 0;
6206
6207 reg_value = readl((p_ddr_base->ee_pwm_base_address));
6208 to = reg_value & 0xff;
6209 return pwm_voltage_table_ee[to][1];
6210}
6211
6212uint32_t get_bdlr_100step(uint32_t ddr_frequency)
6213{
6214 uint32_t bdlr_100step = 0;
6215
6216 if ((p_ddr_base->chip_id >= DDR_MESON_CPU_MAJOR_ID_C2 &&
6217 p_ddr_base->chip_id <= DDR_MESON_CPU_MAJOR_ID_T5D) ||
6218 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_S4 ||
6219 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T3 ||
6220 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T5W) {
6221 bdlr_100step = do_read_c2_ddr_bdlr_steps();
6222 } else {
6223 dwc_ddrphy_apb_wr(((((0 << 20) | (2 << 16) | (0 << 12) | (0xe3)))), 0xc00);
6224 bdlr_100step = (100000000 / (2 * ddr_frequency)) / ((dwc_ddrphy_apb_rd((((0 << 20) | (2 << 16) | (0 << 12) | (0xe4))))) & 0x3ff);
6225 }
6226 return bdlr_100step;
6227}
6228
6229int do_ddr_test_pwm_bdlr(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
6230{
6231 char *endp;
6232
6233 printf("\nEnter g12 do_ddr_test_pwm_bdl function\n");
6234 int i = 0;
6235 printf("\nargc== 0x%08x\n", argc);
6236 for (i = 0; i < argc; i++)
6237 printf("\nargv[%d]=%s\n", i, argv[i]);
6238
6239 unsigned int argc_count = 1;
6240 unsigned int para_meter[30] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
6241 while (argc_count < argc) {
6242 para_meter[argc_count - 1] = simple_strtoul(argv[argc_count], &endp, 0);
6243 if (*argv[argc_count] == 0 || *endp != 0)
6244 para_meter[argc_count - 1] = 0;
6245 argc_count++;
6246 }
6247
6248 uint32_t loop = para_meter[0];
6249 uint32_t voltage_min = para_meter[1];
6250 uint32_t voltage_max = para_meter[2];
6251 uint32_t show_count_message = para_meter[3];
6252
6253#define PWM_LOOP_DEFAULT 10 << 0
6254#define PWM_VOLTAGE_MIN_DEFAULT TEST_MIN_DDR_EE_VOLTAGE
6255#define PWM_VOLTAGE_MAX_DEFAULT TEST_MAX_DDR_EE_VOLTAGE
6256
6257 loop = loop ? loop : PWM_LOOP_DEFAULT;
6258 voltage_min = (voltage_min < PWM_VOLTAGE_MIN_DEFAULT) ? PWM_VOLTAGE_MIN_DEFAULT : voltage_min;
6259 voltage_max = (voltage_max > PWM_VOLTAGE_MAX_DEFAULT) ? PWM_VOLTAGE_MAX_DEFAULT : voltage_max;
6260 voltage_max = (voltage_max < PWM_VOLTAGE_MIN_DEFAULT) ? PWM_VOLTAGE_MAX_DEFAULT : voltage_max;
6261
6262 uint16_t bdlr_100_min = 0;
6263 uint16_t bdlr_100_average = 0;
6264 uint16_t bdlr_100_max = 0;
6265 uint16_t bdlr_100_cur = 0;
6266 uint32_t count = 1;
6267
6268 bdlr_100_cur = get_bdlr_100step(global_ddr_clk);
6269 bdlr_100_min = bdlr_100_cur;
6270 bdlr_100_max = bdlr_100_cur;
6271 bdlr_100_average = bdlr_100_cur;
6272
6273 unsigned int to = 0;
6274 unsigned int to_min = 0;
6275 unsigned int to_max = (ARRAY_SIZE(pwm_voltage_table_ee)) - 1;
6276 printf("\nread org_EE_voltage %d mv \n", read_ee_voltage());
6277 to_min = find_vddee_voltage_index(voltage_min);
6278 to_max = find_vddee_voltage_index(voltage_max);
6279 for (to = (to_max + 1); (to > to_min); to--) {
6280 writel(pwm_voltage_table_ee[to - 1][0], (p_ddr_base->ee_pwm_base_address));
6281 udelay(1000);
6282 bdlr_100_cur = get_bdlr_100step(global_ddr_clk);
6283 bdlr_100_min = bdlr_100_cur;
6284 bdlr_100_max = bdlr_100_cur;
6285 bdlr_100_average = bdlr_100_cur;
6286 count = 1;
6287
6288 do {
6289 bdlr_100_cur = (100000000 / (2 * global_ddr_clk)) / ((dwc_ddrphy_apb_rd((((0 << 20) | (2 << 16) | (0 << 12) | (0xe4))))) & 0x3ff);
6290 bdlr_100_min = (bdlr_100_cur < bdlr_100_min) ? bdlr_100_cur : bdlr_100_min;
6291 bdlr_100_max = (bdlr_100_cur > bdlr_100_max) ? bdlr_100_cur : bdlr_100_max;
6292 bdlr_100_average = (bdlr_100_cur + bdlr_100_average * count) / (count + 1);
6293 count++;
6294 if (show_count_message)
6295 printf("%d\n", bdlr_100_cur);
6296 } while (count < loop);
6297 printf("\nDDR_set EE_voltage %d bdlr_100_average %d bdlr_100_min %d bdlr_100_max %d count %d", pwm_voltage_table_ee[to - 1][1],
6298 bdlr_100_average, bdlr_100_min, bdlr_100_max, count);
6299 }
6300 return 1;
6301}
6302
6303
6304int printf_log(char log_level, const char *fmt, ...)
6305{
6306 if (log_level < 1) {
6307 va_list args;
6308 va_start(args, fmt);
6309 vprintf(fmt, args); //
6310 va_end(args);
6311 return 0;
6312 } else {
6313 return 1;
6314 }
6315}
6316
6317int do_read_ddr_training_data(char log_level, ddr_set_t *ddr_set_t_p)
6318{
6319 printf_log(log_level, "\nddr_set_t_p==0x%08x\n", (uint32_t)(uint64_t)(ddr_set_t_p));
6320 uint32_t loop = 0;
6321 uint32_t loop_max = (4 + (0x3f << 2)); //((DMC_STICKY_63-DMC_STICKY_0));
6322 for (loop = 0; loop < loop_max; loop += 4)
6323 wr_reg(((uint64_t)(ddr_set_t_p) + loop), rd_reg((p_ddr_base->ddr_dmc_sticky0) + loop));
6324
6325 for (loop = 0; loop < MESON_CPU_CHIP_ID_SIZE; loop++) //update chip id
6326 ddr_sha.sha_chip_id[loop] = global_chip_id[loop];
6327 {
6328 uint16_t dq_bit_delay[72];
6329 unsigned char t_count = 0;
6330 uint16_t delay_org = 0;
6331 uint16_t delay_temp = 0;
6332 uint32_t add_offset = 0;
6333 dwc_ddrphy_apb_wr(0xd0000, 0x0);
6334 bdlr_100step = get_bdlr_100step(global_ddr_clk);
6335 ui_1_32_100step = (1000000 * 100 / (global_ddr_clk * 2 * 32));
6336 uint32_t ps = 0;
6337 for (ps = 0; ps < 2; ps++) {
6338 {
6339 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].ARdPtrInitVal = 0;
6340 printf_log(log_level, "\n ARdPtrInitVal ps=%d", ps);
6341 add_offset = ((ps << 20) | (2 << 16) | (0 << 12) | (0x2e));
6342 delay_org = dwc_ddrphy_apb_rd(add_offset);
6343 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].ARdPtrInitVal = delay_org;
6344 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", 0, delay_org, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), delay_org);
6345
6346 printf_log(log_level, "\n dfimrl0 dfimrl1 dfimrl2 dfimrl3 HwtMRL ps=%d", ps);
6347 add_offset = ((ps << 20) | (1 << 16) | (0 << 12) | (0x20));
6348 delay_org = dwc_ddrphy_apb_rd(add_offset);
6349 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].dfi_mrl = delay_org;
6350 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", 0, delay_org, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), delay_org);
6351 add_offset = ((ps << 20) | (1 << 16) | (1 << 12) | (0x20));
6352 delay_org = dwc_ddrphy_apb_rd(add_offset);
6353 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", 1, delay_org, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), delay_org);
6354 add_offset = ((ps << 20) | (1 << 16) | (2 << 12) | (0x20));
6355 delay_org = dwc_ddrphy_apb_rd(add_offset);
6356 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", 2, delay_org, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), delay_org);
6357 add_offset = ((ps << 20) | (1 << 16) | (3 << 12) | (0x20));
6358 delay_org = dwc_ddrphy_apb_rd(add_offset);
6359 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", 3, delay_org, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), delay_org);
6360 add_offset = ((ps << 20) | (2 << 16) | (0 << 12) | (0x20));
6361 delay_org = dwc_ddrphy_apb_rd(add_offset);
6362
6363 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].dfi_hwtmrl = delay_org;
6364 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", 0, delay_org, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), delay_org);
6365 }
6366 {
6367 printf_log(log_level, "\n count_index delay_value register_add register_value ps=%d\n ", ps);
6368 printf_log(log_level, "\n address delay * 1/32UIx100==%d ps bit0-4 fine tune --step==1/32UI ,bit 6 is coarse --step==1UI ps=%d", ui_1_32_100step, ps);
6369 for (t_count = 0; t_count < 10; t_count++) {
6370 add_offset = ((ps << 20) | (0 << 16) | (t_count << 12) | (0x80));
6371 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6372 delay_org = dq_bit_delay[t_count];
6373 delay_temp = (32 * (((delay_org >> 6) & 0xf) + ((delay_org >> 5) & 1)) + (delay_org & 0x1f));
6374 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].ac_trace_delay[t_count] = delay_temp;
6375 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6376 }
6377 }
6378 {
6379 printf_log(log_level, "\n tdqs delay * 1/32UIx100==%d ps bit0-4 fine tune --step==1/32UI ,bit 6-9 is coarse --step==1UI ps=%d", ui_1_32_100step, ps);
6380 for (t_count = 0; t_count < 16; t_count++) {
6381 add_offset = ((ps << 20) | (1 << 16) | (((t_count % 8) >> 1) << 12) | (0xd0 + (t_count / 8) + ((t_count % 2) << 8)));
6382 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6383 delay_org = dq_bit_delay[t_count];
6384 delay_temp = (32 * (((delay_org >> 6) & 0xf) + ((delay_org >> 5) & 1)) + (delay_org & 0x1f));
6385
6386 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].write_dqs_delay[t_count] = delay_temp;
6387
6388 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6389 }
6390 }
6391 {
6392 printf_log(log_level, "\n rxdqs delay * 1/32UIx100==%d ps bit0-4 fine tune --step==1/32UI,no coarse ps=%d", ui_1_32_100step, ps);
6393 for (t_count = 0; t_count < 16; t_count++) {
6394 add_offset = ((ps << 20) | (1 << 16) | (((t_count % 8) >> 1) << 12) | (0x8c + (t_count / 8) + ((t_count % 2) << 8)));
6395 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6396 delay_org = dq_bit_delay[t_count];
6397 delay_temp = (32 * (((delay_org >> 6) & 0xf) + ((delay_org >> 5) & 1)) + (delay_org & 0x1f));
6398 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].read_dqs_delay[t_count] = delay_temp;
6399 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6400 }
6401 }
6402 {
6403 printf_log(log_level, "\n write dq_bit delay * 1/32UIx100==%d ps bit0-4 fine tune --step==1/32UI ,bit 6-8 is coarse --step==1U ps=%d", ui_1_32_100step, ps);
6404 for (t_count = 0; t_count < 72; t_count++) {
6405 add_offset = ((ps << 20) | (1 << 16) | (((t_count % 36) / 9) << 12) | (0xc0 + ((t_count % 9) << 8) + (t_count / 36)));
6406 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6407 delay_org = dq_bit_delay[t_count];
6408 delay_temp = (32 * (((delay_org >> 6) & 0xf) + ((delay_org >> 5) & 1)) + (delay_org & 0x1f));
6409
6410 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].write_dq_bit_delay[t_count] = delay_temp;
6411 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6412 }
6413 }
6414 {
6415 printf_log(log_level, "\n read dq_bit delay * BDLRx100==%d ps bit0-4 fine tune --step==bdlr step size about 5ps,no coarse ps=%d", bdlr_100step, ps);
6416 for (t_count = 0; t_count < 72; t_count++) {
6417 add_offset = ((0 << 20) | (1 << 16) | (((t_count % 36) / 9) << 12) | (0x68 + ((t_count % 9) << 8) + (t_count / 36)));
6418 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6419 delay_org = dq_bit_delay[t_count];
6420 delay_temp = ((delay_org & 0x3f));
6421
6422 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].read_dq_bit_delay[t_count] = delay_temp;
6423 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6424 }
6425 }
6426 {
6427 printf_log(log_level, "\n read dqs gate delay * 1/32UIx100==%d ps bit0-4 fine tune ,bit 6-10 is coarse ps=%d", ui_1_32_100step, ps);
6428 for (t_count = 0; t_count < 16; t_count++) {
6429 add_offset = ((ps << 20) | (1 << 16) | (((t_count % 8) >> 1) << 12) | (0x80 + (t_count / 8) + ((t_count % 2) << 8)));
6430 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6431 delay_org = dq_bit_delay[t_count];
6432 delay_temp = (32 * (((delay_org >> 6) & 0x1f) + ((delay_org >> 5) & 1)) + (delay_org & 0x1f));
6433
6434 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].read_dqs_gate_delay[t_count] = delay_temp;
6435 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6436 }
6437
6438 printf_log(log_level, "\n soc vref : lpddr4-- VREF = VDDQ*(0.047 + VrefDAC0[6:0]*0.00367 DDR4 --VREF = VDDQ*(0.510 + VrefDAC0[6:0]*0.00345 ps=%d", ps);
6439 uint32_t vref_t_count = 0;
6440 for (t_count = 0; t_count < 72; t_count++) { //add normal vref0---vrefDac0 for just 1->x transitions
6441 add_offset = ((0 << 20) | (1 << 16) | (((t_count % 36) / 9) << 12) | (((t_count % 36) % 9) << 8) | (0x40));
6442 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6443 delay_org = dq_bit_delay[t_count];
6444 delay_temp = ((delay_org));
6445 if (t_count < 35) {
6446 vref_t_count = ((((t_count % 36) / 9) * 8) + (t_count % 9));
6447 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].soc_bit_vref[vref_t_count] = delay_temp;
6448 }
6449 if ((t_count % 9) == 8) {
6450 vref_t_count = 32 + ((((t_count % 36) / 9)));
6451 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].soc_bit_vref[vref_t_count] = delay_temp;
6452 }
6453
6454 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6455 }
6456 printf_log(log_level, "\n soc vref-dfe dac1 0--->x : lpddr4-- VREF = VDDQ*(0.047 + VrefDAC0[6:0]*0.00367 DDR4 --VREF = VDDQ*(0.510 + VrefDAC0[6:0]*0.00345 ps=%d", ps);
6457 for (t_count = 0; t_count < 72; t_count++) { //add dfe vref1---vrefDac1 for just 0->x transitions
6458 add_offset = ((0 << 20) | (1 << 16) | (((t_count % 36) / 9) << 12) | (((t_count % 36) % 9) << 8) | (0x30));
6459 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6460 delay_org = dq_bit_delay[t_count];
6461 delay_temp = ((delay_org));
6462 if (t_count < 35) {
6463 vref_t_count = ((((t_count % 36) / 9) * 8) + (t_count % 9));
6464 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_soc_vref_dac1_dfe[vref_t_count] = delay_temp;
6465 }
6466 if ((t_count % 9) == 8) {
6467 vref_t_count = 32 + ((((t_count % 36) / 9)));
6468 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_soc_vref_dac1_dfe[vref_t_count] = delay_temp;
6469 }
6470 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6471 }
6472 printf_log(log_level, "\n dram vref : lpddr4-- VREF = VDDQ*(0. + VrefDAC0[6:0]*0. DDR4 --VREF = VDDQ*(0. + VrefDAC0[6:0]*0. ps=%d", ps);
6473 add_offset = ((0 << 20) | (1 << 16) | (0 << 12) | (0x082));
6474 delay_temp = dwc_ddrphy_apb_rd(add_offset);
6475 for (t_count = 0; t_count < 32; t_count++)
6476 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].dram_bit_vref[t_count] = delay_temp;
6477
6478 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", 0, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), delay_temp);
6479 }
6480 //add for skip training
6481 printf_log(log_level, "\n extra retraining setting. ps=%d", ps);
6482 t_count = 0;
6483 add_offset = (0 << 20) | (2 << 16) | (0 << 12) | (0xcb);
6484 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6485 delay_temp = dq_bit_delay[t_count];
6486 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_pllctrl3 = delay_temp;
6487 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6488
6489 for (t_count = 0; t_count < 4; t_count++) {
6490 add_offset = ((0 << 20) | (1 << 16) | (t_count << 12) | (0xaa));
6491 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6492 delay_temp = dq_bit_delay[t_count];
6493 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_pptctlstatic[t_count] = delay_temp;
6494 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6495 }
6496 for (t_count = 0; t_count < 4; t_count++) {
6497 add_offset = ((0 << 20) | (1 << 16) | (t_count << 12) | (0x62));
6498 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6499 delay_temp = dq_bit_delay[t_count];
6500 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_trainingincdecdtsmen[t_count] = delay_temp;
6501 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6502 }
6503 for (t_count = 0; t_count < 4; t_count++) {
6504 add_offset = ((0 << 20) | (1 << 16) | (t_count << 12) | (0x01));
6505 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6506 delay_temp = dq_bit_delay[t_count];
6507 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_tsmbyte0[t_count] = delay_temp;
6508 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6509 }
6510 for (t_count = 0; t_count < 4; t_count++) {
6511 add_offset = ((ps << 20) | (1 << 16) | (t_count << 12) | (0x43));
6512 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6513 delay_temp = dq_bit_delay[t_count];
6514 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_dqsrcvcntrl[t_count] = delay_temp;
6515 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6516 }
6517 for (t_count = 0; t_count < 4; t_count++) {
6518 add_offset = ((ps << 20) | (1 << 16) | (t_count << 12) | (0xae));
6519 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6520 delay_temp = dq_bit_delay[t_count];
6521 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_pptdqscntinvtrntg0[t_count] = delay_temp;
6522 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6523 }
6524 for (t_count = 0; t_count < 4; t_count++) {
6525 add_offset = ((ps << 20) | (1 << 16) | (t_count << 12) | (0xaf));
6526 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6527 delay_temp = dq_bit_delay[t_count];
6528 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_pptdqscntinvtrntg1[t_count] = delay_temp;
6529 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6530 }
6531 {
6532 t_count = 0;
6533 add_offset = ((ps << 20) | (2 << 16) | (t_count << 12) | (0xb2));
6534 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6535 delay_temp = dq_bit_delay[t_count];
6536 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_vrefinglobal = delay_temp;
6537 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6538 }
6539 for (t_count = 1; t_count < 9; t_count++) {
6540 add_offset = ((ps << 20) | (9 << 16) | (0 << 12) | (0x200) | t_count);
6541 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6542 delay_temp = dq_bit_delay[t_count];
6543 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_seq0bgpr[t_count] = delay_temp;
6544 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6545 }
6546 {
6547 t_count = 0;
6548 add_offset = ((ps << 20) | (2 << 16) | (t_count << 12) | (0x7c));
6549 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6550 delay_temp = dq_bit_delay[t_count];
6551 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_dllgainctl = delay_temp;
6552 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6553 }
6554 {
6555 t_count = 0;
6556 add_offset = ((ps << 20) | (2 << 16) | (t_count << 12) | (0x7d));
6557 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6558 delay_temp = dq_bit_delay[t_count];
6559 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_dlllockpara = delay_temp;
6560 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6561 }
6562 {
6563 t_count = 0;
6564 add_offset = ((0 << 20) | (2 << 16) | (t_count << 12) | (0x77));
6565 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6566 delay_temp = dq_bit_delay[t_count];
6567 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_hwtcamode = delay_temp;
6568 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6569 }
6570 {
6571 t_count = 0;
6572 add_offset = ((0 << 20) | (2 << 16) | (t_count << 12) | (0x72));
6573 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6574 delay_temp = dq_bit_delay[t_count];
6575 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_hwtlpcsena = delay_temp;
6576 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6577 }
6578 {
6579 t_count = 0;
6580 add_offset = ((0 << 20) | (2 << 16) | (t_count << 12) | (0x73));
6581 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6582 delay_temp = dq_bit_delay[t_count];
6583 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_hwtlpcsenb = delay_temp;
6584 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6585 }
6586 {
6587 t_count = 0;
6588 add_offset = ((0 << 20) | (4 << 16) | (t_count << 12) | (0xfd));
6589 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6590 delay_temp = dq_bit_delay[t_count];
6591 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_acsmctrl13 = delay_temp;
6592 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6593 }
6594 {
6595 t_count = 0;
6596 add_offset = ((0 << 20) | (4 << 16) | (t_count << 12) | (0xc0));
6597 dq_bit_delay[t_count] = dwc_ddrphy_apb_rd(add_offset);
6598 delay_temp = dq_bit_delay[t_count];
6599 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_acsmctrl23 = delay_temp;
6600 printf_log(log_level, "\n t_count: %04d %04d %08x %08x", t_count, delay_temp, ((((add_offset) << 1) + (p_ddr_base->ddr_phy_base_address))), dq_bit_delay[t_count]);
6601 }
6602 }
6603 }
6604 return 1;
6605}
6606
6607int do_ddr_display_g12_ddr_information(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
6608{
6609#ifdef ENABLE_G12_PHY_TEST_CMD
6610 int i = 0;
6611 unsigned int ps = 0;
6612
6613 printf("\nargc== 0x%08x\n", argc);
6614 for (i = 0; i < argc; i++)
6615 printf("\nargv[%d]=%s\n", i, argv[i]);
6616 ddr_set_t *ddr_set_t_p = NULL;
6617 ddr_set_t_p = (ddr_set_t *)(ddr_set_t_p_array);
6618 ddr_set_t7 *ddr_set_t_p_t7 = (ddr_set_t7 *)ddr_set_t_p;
6619 do_read_ddr_training_data(0, ddr_set_t_p);
6620
6621 {
6622 uint32_t count = 0;
6623 uint32_t reg_add_offset = 0;
6624 uint16_t reg_value = 0;
6625
6626 printf("\n PCTL timming: 0x");
6627
6628 for (count = 0; count < ((p_ddr_base->ddr_pctl_timing_end_address) - (p_ddr_base->ddr_pctl_timing_base_address)); ) {
6629 reg_add_offset = ((p_ddr_base->ddr_pctl_timing_base_address) + (count));
6630 printf("\n reg_add_offset: %08x %08x %08x ", reg_add_offset, readl(reg_add_offset), reg_add_offset);
6631 count = count + 4;
6632 }
6633 printf("\n mrs register: ");
6634 printf("\n mrs register: base (0x54000<<1)+DDR_PHY_BASE,%08x byte offset\n", (0x54000 << 1) + (p_ddr_base->ddr_phy_base_address));
6635 for (count = 0; count < 0x80; ) {
6636 reg_add_offset = 0x54000 + count; //dwc_ddrphy_apb_wr(0x54008,0x1001);
6637 reg_value = ((*(volatile uint16_t *)((uint64_t)(((0x54000 + (count >> 1))) << 1) + (p_ddr_base->ddr_phy_base_address))) >> (((count) % 2) ? 8 : 0)); //dwc_ddrphy_apb_rd(0x54000+add_offset+1);
6638 reg_value = reg_value & 0xff;
6639 printf("\n reg_add_offset: %08x %08x %08x", reg_add_offset, reg_value, ((((0x54000 + (count >> 1))) << 1) + (p_ddr_base->ddr_phy_base_address)));
6640 count = count + 1;
6641 }
6642
6643 printf("\n sticky register: ");
6644 {
6645 uint32_t loop_max = 0;
6646 loop_max = 64 << 2; //sizeof(ddr_set_t);
6647 for (count = 0; count < loop_max; count += 4)
6648 printf("\n reg_add_offset: %08x %08x %08x", count, rd_reg((uint64_t)((p_ddr_base->ddr_dmc_sticky0)) + count), (((p_ddr_base->ddr_dmc_sticky0)) + count));
6649 }
6650
6651 {
6652 uint32_t loop_max = 0;
6653 loop_max = sizeof(ddr_set_t);
6654 uint32_t count = 0;
6655 for (count = 0; count < loop_max; ) {
6656 printf("\n%08x %08x", count, rd_reg((uint64_t)(ddr_set_t_p) + count));
6657 count = count + 4;
6658 }
6659 }
6660 }
6661
6662 printf("\n {");
6663
6664#define DDR_TIMMING_OFFSET_DDR_SET_T7(X) (unsigned int)(unsigned long)(&(((ddr_set_t7 *)(0))->X))
6665////#define DDR_TIMMING_OFFSET_SIZE(X) sizeof(((ddr_set_t7 *)(0))->X)
6666#define DDR_TIMMING_OFFSET_DDR_SET(X) (unsigned int)(unsigned long)(&(((ddr_set_t *)(0))->X))
6667//#define DDR_TIMMING_OFFSET_SIZE(X) sizeof(((ddr_set_t *)(0))->X)
6668 uint32_t temp_count = 0;
6669 {
6670 printf("\n.magic=0x%08x,// %d,0x%08x", ddr_set_t_p->magic, ddr_set_t_p->magic, DDR_TIMMING_OFFSET_DDR_SET(magic));
6671 printf("\n//old fast_boot[%d]=0x%08x,// %d,0x%08x", 0, ddr_set_t_p->fast_boot[0], ddr_set_t_p->fast_boot[0], DDR_TIMMING_OFFSET_DDR_SET(fast_boot[0]));
6672 ddr_set_t_p->fast_boot[0] = 0xfd; //add for auto copy to code test
6673 for (temp_count = 0; temp_count < 4; temp_count++)
6674 printf("\n.fast_boot[%d]=0x%08x,// %d,0x%08x", temp_count, ddr_set_t_p->fast_boot[temp_count], ddr_set_t_p->fast_boot[temp_count], DDR_TIMMING_OFFSET_DDR_SET(fast_boot[temp_count]));
6675 printf("\n.board_id=0x%08x,// %d,0x%08x", ddr_set_t_p->board_id, ddr_set_t_p->board_id, DDR_TIMMING_OFFSET_DDR_SET(board_id));
6676 printf("\n.version=0x%08x,// %d,0x%08x", ddr_set_t_p->version, ddr_set_t_p->version, DDR_TIMMING_OFFSET_DDR_SET(version));
6677 printf("\n.DramType=0x%08x,// %d,0x%08x", ddr_set_t_p->DramType, ddr_set_t_p->DramType, DDR_TIMMING_OFFSET_DDR_SET(DramType));
6678 if (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T7 ||
6679 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_P1) {
6680 printf("\n.DisabledDbyte[0]=0x%08x,// %d,0x%08x", ddr_set_t_p_t7->DisabledDbyte[0], ddr_set_t_p_t7->DisabledDbyte[0], DDR_TIMMING_OFFSET_DDR_SET_T7(DisabledDbyte[0]));
6681 printf("\n.DisabledDbyte[1]=0x%08x,// %d,0x%08x", ddr_set_t_p_t7->DisabledDbyte[1], ddr_set_t_p_t7->DisabledDbyte[1], DDR_TIMMING_OFFSET_DDR_SET_T7(DisabledDbyte[1]));
6682 printf("\n.Is2Ttiming=0x%08x,// %d,0x%08x", ddr_set_t_p_t7->Is2Ttiming, ddr_set_t_p_t7->Is2Ttiming, DDR_TIMMING_OFFSET_DDR_SET_T7(Is2Ttiming));
6683 printf("\n.HdtCtrl=0x%08x,// %d,0x%08x", ddr_set_t_p_t7->HdtCtrl, ddr_set_t_p_t7->HdtCtrl, DDR_TIMMING_OFFSET_DDR_SET_T7(HdtCtrl));
6684 printf("\n.dram_rank_config=0x%08x,// %d,0x%08x", ddr_set_t_p_t7->dram_rank_config, ddr_set_t_p_t7->dram_rank_config, DDR_TIMMING_OFFSET_DDR_SET_T7(dram_rank_config));
6685 } else {
6686 printf("\n.DisabledDbyte=0x%08x,// %d,0x%08x", ddr_set_t_p->DisabledDbyte, ddr_set_t_p->DisabledDbyte, DDR_TIMMING_OFFSET_DDR_SET(DisabledDbyte));
6687 printf("\n.Is2Ttiming=0x%08x,// %d,0x%08x", ddr_set_t_p->Is2Ttiming, ddr_set_t_p->Is2Ttiming, DDR_TIMMING_OFFSET_DDR_SET(Is2Ttiming));
6688 printf("\n.HdtCtrl=0x%08x,// %d,0x%08x", ddr_set_t_p->HdtCtrl, ddr_set_t_p->HdtCtrl, DDR_TIMMING_OFFSET_DDR_SET(HdtCtrl));
6689 printf("\n.dram_rank_config=0x%08x,// %d,0x%08x", ddr_set_t_p->dram_rank_config, ddr_set_t_p->dram_rank_config, DDR_TIMMING_OFFSET_DDR_SET(dram_rank_config));
6690 printf("\n.diagnose=0x%08x,// %d,0x%08x", ddr_set_t_p->diagnose, ddr_set_t_p->diagnose, DDR_TIMMING_OFFSET_DDR_SET(diagnose));
6691 }
6692 printf("\n.soc_data_drv_ohm_ps1=0x%08x,// %d,0x%08x", ddr_set_t_p->soc_data_drv_ohm_ps1, ddr_set_t_p->soc_data_drv_ohm_ps1, DDR_TIMMING_OFFSET_DDR_SET(soc_data_drv_ohm_ps1));
6693 printf("\n.dram_data_drv_ohm_ps1=0x%08x,// %d,0x%08x", ddr_set_t_p->dram_data_drv_ohm_ps1, ddr_set_t_p->dram_data_drv_ohm_ps1, DDR_TIMMING_OFFSET_DDR_SET(dram_data_drv_ohm_ps1));
6694 printf("\n.soc_data_odt_ohm_ps1=0x%08x,// %d,0x%08x", ddr_set_t_p->soc_data_odt_ohm_ps1, ddr_set_t_p->soc_data_odt_ohm_ps1, DDR_TIMMING_OFFSET_DDR_SET(soc_data_odt_ohm_ps1));
6695 printf("\n.dram_data_odt_ohm_ps1=0x%08x,// %d,0x%08x", ddr_set_t_p->dram_data_odt_ohm_ps1, ddr_set_t_p->dram_data_odt_ohm_ps1, DDR_TIMMING_OFFSET_DDR_SET(dram_data_odt_ohm_ps1));
6696 printf("\n.dram_data_wr_odt_ohm_ps1=0x%08x,// %d,0x%08x", ddr_set_t_p->dram_data_wr_odt_ohm_ps1, ddr_set_t_p->dram_data_wr_odt_ohm_ps1, DDR_TIMMING_OFFSET_DDR_SET(dram_data_wr_odt_ohm_ps1));
6697 if (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T7) {
6698 printf("\n.soc_data_drv_ohm_ffe=0x%08x,// %d,0x%08x", ddr_set_t_p_t7->soc_data_drv_ohm_ffe, ddr_set_t_p_t7->soc_data_drv_ohm_ffe, DDR_TIMMING_OFFSET_DDR_SET_T7(soc_data_drv_ohm_ffe));
6699 printf("\n.ddr_base_addr=0x%08x,// %d,0x%08x", ddr_set_t_p->ddr_base_addr, ddr_set_t_p->ddr_base_addr, DDR_TIMMING_OFFSET_DDR_SET_T7(ddr_base_addr));
6700 printf("\n.ddr_start_offset=0x%08x,// %d,0x%08x", ddr_set_t_p->ddr_start_offset, ddr_set_t_p->ddr_start_offset, DDR_TIMMING_OFFSET_DDR_SET_T7(ddr_start_offset));
6701 printf("\n.dram_ch0_size_MB=0x%08x,// %d,0x%08x", ddr_set_t_p_t7->dram_ch0_size_MB, ddr_set_t_p_t7->dram_ch0_size_MB, DDR_TIMMING_OFFSET_DDR_SET_T7(dram_ch0_size_MB));
6702 printf("\n.dram_ch1_size_MB=0x%08x,// %d,0x%08x", ddr_set_t_p_t7->dram_ch1_size_MB, ddr_set_t_p_t7->dram_ch1_size_MB, DDR_TIMMING_OFFSET_DDR_SET_T7(dram_ch1_size_MB));
6703 } else {
6704 printf("\n.dmem_load_size=0x%08x,// %d,0x%08x", ddr_set_t_p->dmem_load_size, ddr_set_t_p->dmem_load_size, DDR_TIMMING_OFFSET_DDR_SET(dmem_load_size));
6705 printf("\n.ddr_base_addr=0x%08x,// %d,0x%08x", ddr_set_t_p->ddr_base_addr, ddr_set_t_p->ddr_base_addr, DDR_TIMMING_OFFSET_DDR_SET(ddr_base_addr));
6706 printf("\n.ddr_start_offset=0x%08x,// %d,0x%08x", ddr_set_t_p->ddr_start_offset, ddr_set_t_p->ddr_start_offset, DDR_TIMMING_OFFSET_DDR_SET(ddr_start_offset));
6707 printf("\n.dram_cs0_size_MB=0x%08x,// %d,0x%08x", ddr_set_t_p->dram_cs0_size_MB, ddr_set_t_p->dram_cs0_size_MB, DDR_TIMMING_OFFSET_DDR_SET(dram_cs0_size_MB));
6708 printf("\n.dram_cs1_size_MB=0x%08x,// %d,0x%08x", ddr_set_t_p->dram_cs1_size_MB, ddr_set_t_p->dram_cs1_size_MB, DDR_TIMMING_OFFSET_DDR_SET(dram_cs1_size_MB));
6709 }
6710 printf("\n.training_SequenceCtrl[0]=0x%08x,// %d,0x%08x", ddr_set_t_p->training_SequenceCtrl[0], ddr_set_t_p->training_SequenceCtrl[0], DDR_TIMMING_OFFSET_DDR_SET(training_SequenceCtrl[0]));
6711 printf("\n.training_SequenceCtrl[1]=0x%08x,// %d,0x%08x", ddr_set_t_p->training_SequenceCtrl[1], ddr_set_t_p->training_SequenceCtrl[1], DDR_TIMMING_OFFSET_DDR_SET(training_SequenceCtrl[1]));
6712 printf("\n.phy_odt_config_rank[0]=0x%08x,// %d,0x%08x", ddr_set_t_p->phy_odt_config_rank[0], ddr_set_t_p->phy_odt_config_rank[0], DDR_TIMMING_OFFSET_DDR_SET(phy_odt_config_rank[0]));
6713 printf("\n.phy_odt_config_rank[1]=0x%08x,// %d,0x%08x", ddr_set_t_p->phy_odt_config_rank[1], ddr_set_t_p->phy_odt_config_rank[1], DDR_TIMMING_OFFSET_DDR_SET(phy_odt_config_rank[1]));
6714 printf("\n.rank1_ca_vref_permil=0x%08x,// %d,0x%08x", ddr_set_t_p->rank1_ca_vref_permil, ddr_set_t_p->rank1_ca_vref_permil, DDR_TIMMING_OFFSET_DDR_SET(rank1_ca_vref_permil));
6715
6716 printf("\n.dfi_odt_config=0x%08x,// %d,0x%08x", ddr_set_t_p->dfi_odt_config, ddr_set_t_p->dfi_odt_config, DDR_TIMMING_OFFSET_DDR_SET(dfi_odt_config));
6717 printf("\n.DRAMFreq[0]=0x%08x,// %d,0x%08x", ddr_set_t_p->DRAMFreq[0], ddr_set_t_p->DRAMFreq[0], DDR_TIMMING_OFFSET_DDR_SET(DRAMFreq[0]));
6718 printf("\n.DRAMFreq[1]=0x%08x,// %d,0x%08x", ddr_set_t_p->DRAMFreq[1], ddr_set_t_p->DRAMFreq[1], DDR_TIMMING_OFFSET_DDR_SET(DRAMFreq[1]));
6719 printf("\n.DRAMFreq[2]=0x%08x,// %d,0x%08x", ddr_set_t_p->DRAMFreq[2], ddr_set_t_p->DRAMFreq[2], DDR_TIMMING_OFFSET_DDR_SET(DRAMFreq[2]));
6720 printf("\n.DRAMFreq[3]=0x%08x,// %d,0x%08x", ddr_set_t_p->DRAMFreq[3], ddr_set_t_p->DRAMFreq[3], DDR_TIMMING_OFFSET_DDR_SET(DRAMFreq[3]));
6721 printf("\n.PllBypassEn=0x%08x,// %d,0x%08x", ddr_set_t_p->PllBypassEn, ddr_set_t_p->PllBypassEn, DDR_TIMMING_OFFSET_DDR_SET(PllBypassEn));
6722 printf("\n.ddr_rdbi_wr_enable=0x%08x,// %d,0x%08x", ddr_set_t_p->ddr_rdbi_wr_enable, ddr_set_t_p->ddr_rdbi_wr_enable, DDR_TIMMING_OFFSET_DDR_SET(ddr_rdbi_wr_enable));
6723 printf("\n.ddr_rfc_type=0x%08x,// %d,0x%08x", ddr_set_t_p->ddr_rfc_type, ddr_set_t_p->ddr_rfc_type, DDR_TIMMING_OFFSET_DDR_SET(ddr_rfc_type));
6724 printf("\n.enable_lpddr4x_mode=0x%08x,// %d,0x%08x", ddr_set_t_p->enable_lpddr4x_mode, ddr_set_t_p->enable_lpddr4x_mode, DDR_TIMMING_OFFSET_DDR_SET(enable_lpddr4x_mode));
6725 printf("\n.pll_ssc_mode=0x%08x,// %d,0x%08x", ddr_set_t_p->pll_ssc_mode, ddr_set_t_p->pll_ssc_mode, DDR_TIMMING_OFFSET_DDR_SET(pll_ssc_mode));
6726 printf("\n.clk_drv_ohm=0x%08x,// %d,0x%08x", ddr_set_t_p->clk_drv_ohm, ddr_set_t_p->clk_drv_ohm, DDR_TIMMING_OFFSET_DDR_SET(clk_drv_ohm));
6727 printf("\n.cs_drv_ohm=0x%08x,// %d,0x%08x", ddr_set_t_p->cs_drv_ohm, ddr_set_t_p->cs_drv_ohm, DDR_TIMMING_OFFSET_DDR_SET(cs_drv_ohm));
6728 printf("\n.ac_drv_ohm=0x%08x,// %d,0x%08x", ddr_set_t_p->ac_drv_ohm, ddr_set_t_p->ac_drv_ohm, DDR_TIMMING_OFFSET_DDR_SET(ac_drv_ohm));
6729 printf("\n.soc_data_drv_ohm_p=0x%08x,// %d,0x%08x", ddr_set_t_p->soc_data_drv_ohm_p, ddr_set_t_p->soc_data_drv_ohm_p, DDR_TIMMING_OFFSET_DDR_SET(soc_data_drv_ohm_p));
6730 printf("\n.soc_data_drv_ohm_n=0x%08x,// %d,0x%08x", ddr_set_t_p->soc_data_drv_ohm_n, ddr_set_t_p->soc_data_drv_ohm_n, DDR_TIMMING_OFFSET_DDR_SET(soc_data_drv_ohm_n));
6731 printf("\n.soc_data_odt_ohm_p=0x%08x,// %d,0x%08x", ddr_set_t_p->soc_data_odt_ohm_p, ddr_set_t_p->soc_data_odt_ohm_p, DDR_TIMMING_OFFSET_DDR_SET(soc_data_odt_ohm_p));
6732 printf("\n.soc_data_odt_ohm_n=0x%08x,// %d,0x%08x", ddr_set_t_p->soc_data_odt_ohm_n, ddr_set_t_p->soc_data_odt_ohm_n, DDR_TIMMING_OFFSET_DDR_SET(soc_data_odt_ohm_n));
6733 printf("\n.dram_data_drv_ohm=0x%08x,// %d,0x%08x", ddr_set_t_p->dram_data_drv_ohm, ddr_set_t_p->dram_data_drv_ohm, DDR_TIMMING_OFFSET_DDR_SET(dram_data_drv_ohm));
6734 printf("\n.dram_data_odt_ohm=0x%08x,// %d,0x%08x", ddr_set_t_p->dram_data_odt_ohm, ddr_set_t_p->dram_data_odt_ohm, DDR_TIMMING_OFFSET_DDR_SET(dram_data_drv_ohm));
6735 printf("\n.dram_ac_odt_ohm=0x%08x,// %d,0x%08x", ddr_set_t_p->dram_ac_odt_ohm, ddr_set_t_p->dram_ac_odt_ohm, DDR_TIMMING_OFFSET_DDR_SET(dram_ac_odt_ohm));
6736 printf("\n.soc_clk_slew_rate=0x%08x,// %d,0x%08x", ddr_set_t_p->soc_clk_slew_rate, ddr_set_t_p->soc_clk_slew_rate, DDR_TIMMING_OFFSET_DDR_SET(soc_clk_slew_rate));
6737 printf("\n.soc_cs_slew_rate=0x%08x,// %d,0x%08x", ddr_set_t_p->soc_cs_slew_rate, ddr_set_t_p->soc_cs_slew_rate, DDR_TIMMING_OFFSET_DDR_SET(soc_cs_slew_rate));
6738 printf("\n.soc_ac_slew_rate=0x%08x,// %d,0x%08x", ddr_set_t_p->soc_ac_slew_rate, ddr_set_t_p->soc_ac_slew_rate, DDR_TIMMING_OFFSET_DDR_SET(soc_ac_slew_rate));
6739 printf("\n.soc_data_slew_rate=0x%08x,// %d,0x%08x", ddr_set_t_p->soc_data_slew_rate, ddr_set_t_p->soc_data_slew_rate, DDR_TIMMING_OFFSET_DDR_SET(soc_data_slew_rate));
6740 printf("\n.vref_output_permil =0x%08x,// %d,0x%08x", ddr_set_t_p->vref_output_permil, ddr_set_t_p->vref_output_permil, DDR_TIMMING_OFFSET_DDR_SET(vref_output_permil));
6741 printf("\n.vref_receiver_permil =0x%08x,// %d,0x%08x", ddr_set_t_p->vref_receiver_permil, ddr_set_t_p->vref_receiver_permil, DDR_TIMMING_OFFSET_DDR_SET(vref_receiver_permil));
6742 printf("\n.vref_dram_permil=0x%08x,// %d,0x%08x", ddr_set_t_p->vref_dram_permil, ddr_set_t_p->vref_dram_permil, DDR_TIMMING_OFFSET_DDR_SET(vref_dram_permil));
6743 printf("\n.max_core_timmming_frequency=0x%08x,// %d,0x%08x", ddr_set_t_p->max_core_timmming_frequency, ddr_set_t_p->max_core_timmming_frequency, DDR_TIMMING_OFFSET_DDR_SET(max_core_timmming_frequency));
6744 for (temp_count = 0; temp_count < 10; temp_count++)
6745 printf("\n.ac_trace_delay[%d]=0x%08x,// %d,0x%08x", temp_count, ddr_set_t_p->ac_trace_delay[temp_count], ddr_set_t_p->ac_trace_delay[temp_count], DDR_TIMMING_OFFSET_DDR_SET(ac_trace_delay[temp_count]));
6746 printf("\n.lpddr4_dram_vout_voltage_1_3_2_5_setting=0x%08x,// %d,0x%08x", ddr_set_t_p->lpddr4_dram_vout_voltage_1_3_2_5_setting, ddr_set_t_p->lpddr4_dram_vout_voltage_1_3_2_5_setting, DDR_TIMMING_OFFSET_DDR_SET(lpddr4_dram_vout_voltage_1_3_2_5_setting));
6747 printf("\n.lpddr4_x8_mode=0x%08x,// %d,0x%08x", ddr_set_t_p->lpddr4_x8_mode, ddr_set_t_p->lpddr4_x8_mode, DDR_TIMMING_OFFSET_DDR_SET(lpddr4_x8_mode));
6748 for (temp_count = 0; temp_count < 28; temp_count++)
6749 printf("\n.ac_pinmux[%d]=0x%08x,// %d,0x%08x", temp_count, ddr_set_t_p->ac_pinmux[temp_count], ddr_set_t_p->ac_pinmux[temp_count], DDR_TIMMING_OFFSET_DDR_SET(ac_pinmux[temp_count]));
6750 for (temp_count = 0; temp_count < 26; temp_count++)
6751 printf("\n.dfi_pinmux[%d]=0x%08x,// %d,0x%08x", temp_count, ddr_set_t_p->dfi_pinmux[temp_count], ddr_set_t_p->dfi_pinmux[temp_count], DDR_TIMMING_OFFSET_DDR_SET(dfi_pinmux[temp_count]));
6752
6753 printf("\n.slt_test_function[0] =0x%08x,// %d,0x%08x", ddr_set_t_p->slt_test_function[0], ddr_set_t_p->slt_test_function[0], DDR_TIMMING_OFFSET_DDR_SET(slt_test_function[0]));
6754 printf("\n.slt_test_function[1] =0x%08x,// %d,0x%08x", ddr_set_t_p->slt_test_function[1], ddr_set_t_p->slt_test_function[1], DDR_TIMMING_OFFSET_DDR_SET(slt_test_function[1]));
6755 printf("\n.tdqs2dq=0x%08x,// %d,0x%08x", ddr_set_t_p->tdqs2dq, ddr_set_t_p->tdqs2dq, DDR_TIMMING_OFFSET_DDR_SET(tdqs2dq));
6756 printf("\n.dram_data_wr_odt_ohm=0x%08x,// %d,0x%08x", ddr_set_t_p->dram_data_wr_odt_ohm, ddr_set_t_p->dram_data_wr_odt_ohm, DDR_TIMMING_OFFSET_DDR_SET(dram_data_wr_odt_ohm));
6757 printf("\n.bitTimeControl_2d=0x%08x,// %d,0x%08x", ddr_set_t_p->bitTimeControl_2d, ddr_set_t_p->bitTimeControl_2d, DDR_TIMMING_OFFSET_DDR_SET(bitTimeControl_2d));
6758 if (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T7 ||
6759 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_P1)
6760 printf("\n.training_offset=0x%08x,// %d,0x%08x", ddr_set_t_p_t7->training_offset, ddr_set_t_p_t7->training_offset, DDR_TIMMING_OFFSET_DDR_SET_T7(training_offset));
6761 for (temp_count = 0; temp_count < 5; temp_count++)
6762 printf("\n.ddr_dmc_remap[%d]=0x%08x,// %d,0x%08x", temp_count, ddr_set_t_p->ddr_dmc_remap[temp_count], ddr_set_t_p->ddr_dmc_remap[temp_count], DDR_TIMMING_OFFSET_DDR_SET(ddr_dmc_remap[temp_count]));
6763 for (temp_count = 0; temp_count < 4; temp_count++)
6764 printf("\n.ddr_lpddr34_ca_remap[%d]=0x%08x,// %d,0x%08x", temp_count, ddr_set_t_p->ddr_lpddr34_ca_remap[temp_count], ddr_set_t_p->ddr_lpddr34_ca_remap[temp_count], DDR_TIMMING_OFFSET_DDR_SET(ddr_lpddr34_ca_remap[temp_count]));
6765 printf("\n.dram_rtt_nom_wr_park[0]=0x%08x,// %d,0x%08x", ddr_set_t_p->dram_rtt_nom_wr_park[0], ddr_set_t_p->dram_rtt_nom_wr_park[0], DDR_TIMMING_OFFSET_DDR_SET(dram_rtt_nom_wr_park[0]));
6766 printf("\n.dram_rtt_nom_wr_park[1]=0x%08x,// %d,0x%08x", ddr_set_t_p->dram_rtt_nom_wr_park[1], ddr_set_t_p->dram_rtt_nom_wr_park[1], DDR_TIMMING_OFFSET_DDR_SET(dram_rtt_nom_wr_park[1]));
6767 printf("\n.ddr_func=0x%08x,// %d,0x%08x", ddr_set_t_p->ddr_func, ddr_set_t_p->ddr_func, DDR_TIMMING_OFFSET_DDR_SET(ddr_func));
6768 for (ps = 0; ps < 2; ps++) {
6769 for (temp_count = 0; temp_count < 10; temp_count++)
6770 printf("\n.cfg_ddr_training_delay_ps[%d].ac_trace_delay[%d]=0x%08x,// %d,0x%08x", ps, temp_count,
6771 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].ac_trace_delay[temp_count],
6772 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].ac_trace_delay[temp_count],
6773 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].ac_trace_delay[temp_count]));
6774
6775 for (temp_count = 0; temp_count < 16; temp_count++)
6776 printf("\n.cfg_ddr_training_delay_ps[%d].read_dqs_delay[%d]=0x%08x,// %d,0x%08x", ps, temp_count,
6777 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].read_dqs_delay[temp_count],
6778 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].read_dqs_delay[temp_count],
6779 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].read_dqs_delay[temp_count]));
6780 for (temp_count = 0; temp_count < 72; temp_count++)
6781 printf("\n.cfg_ddr_training_delay_ps[%d].read_dq_bit_delay[%d]=0x%08x,// %d,0x%08x", ps, temp_count,
6782 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].read_dq_bit_delay[temp_count],
6783 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].read_dq_bit_delay[temp_count],
6784 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].read_dq_bit_delay[temp_count]));
6785 for (temp_count = 0; temp_count < 16; temp_count++)
6786 printf("\n.cfg_ddr_training_delay_ps[%d].write_dqs_delay[%d]=0x%08x,// %d,0x%08x", ps, temp_count,
6787 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].write_dqs_delay[temp_count],
6788 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].write_dqs_delay[temp_count],
6789 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].write_dqs_delay[temp_count]));
6790 for (temp_count = 0; temp_count < 72; temp_count++)
6791 printf("\n.cfg_ddr_training_delay_ps[%d].write_dq_bit_delay[%d]=0x%08x,// %d,0x%08x", ps, temp_count,
6792 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].write_dq_bit_delay[temp_count],
6793 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].write_dq_bit_delay[temp_count],
6794 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].write_dq_bit_delay[temp_count]));
6795 for (temp_count = 0; temp_count < 16; temp_count++)
6796 printf("\n.cfg_ddr_training_delay_ps[%d].read_dqs_gate_delay[%d]=0x%08x,// %d,0x%08x", ps, temp_count,
6797 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].read_dqs_gate_delay[temp_count],
6798 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].read_dqs_gate_delay[temp_count],
6799 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].read_dqs_gate_delay[temp_count]));
6800 for (temp_count = 0; temp_count < 36; temp_count++)
6801 printf("\n.cfg_ddr_training_delay_ps[%d].soc_bit_vref[%d]=0x%08x,// %d,0x%08x", ps, temp_count,
6802 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].soc_bit_vref[temp_count],
6803 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].soc_bit_vref[temp_count],
6804 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].soc_bit_vref[temp_count]));
6805 for (temp_count = 0; temp_count < 36; temp_count++)
6806 printf("\n.cfg_ddr_phy_common_extra_set_t.csr_soc_vref_dac1_dfe[%d]=0x%08x,// %d,0x%08x", temp_count,
6807 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_soc_vref_dac1_dfe[temp_count],
6808 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_soc_vref_dac1_dfe[temp_count],
6809 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_phy_common_extra_set_t.csr_soc_vref_dac1_dfe[temp_count]));
6810 for (temp_count = 0; temp_count < 32; temp_count++)
6811 printf("\n.cfg_ddr_training_delay_ps[%d].dram_bit_vref[%d]=0x%08x,// %d,0x%08x", ps, temp_count,
6812 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].dram_bit_vref[temp_count],
6813 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].dram_bit_vref[temp_count],
6814 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].dram_bit_vref[temp_count]));
6815
6816 printf("\n.cfg_ddr_training_delay_ps[%d].dfi_mrl=0x%08x,// %d,0x%08x", ps,
6817 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].dfi_mrl, ddr_set_t_p->cfg_ddr_training_delay_ps[ps].dfi_mrl,
6818 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].dfi_mrl));
6819 printf("\n.cfg_ddr_training_delay_ps[%d].dfi_hwtmrl=0x%08x,// %d,0x%08x", ps,
6820 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].dfi_hwtmrl, ddr_set_t_p->cfg_ddr_training_delay_ps[ps].dfi_hwtmrl,
6821 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].dfi_hwtmrl));
6822 printf("\n.cfg_ddr_training_delay_ps[%d].ARdPtrInitVal=0x%08x,// %d,0x%08x", ps,
6823 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].ARdPtrInitVal, ddr_set_t_p->cfg_ddr_training_delay_ps[ps].ARdPtrInitVal,
6824 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].ARdPtrInitVal));
6825
6826 printf("\n.cfg_ddr_training_delay_ps[%d].csr_vrefinglobal=0x%08x,// %d,0x%08x", ps,
6827 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_vrefinglobal, ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_vrefinglobal,
6828 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].csr_vrefinglobal));
6829 for (temp_count = 0; temp_count < 4; temp_count++)
6830 printf("\n.cfg_ddr_training_delay_ps[%d].csr_dqsrcvcntrl[%d]=0x%08x,// %d,0x%08x", ps, temp_count,
6831 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_dqsrcvcntrl[temp_count], ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_dqsrcvcntrl[temp_count],
6832 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].csr_dqsrcvcntrl[temp_count]));
6833 for (temp_count = 0; temp_count < 4; temp_count++)
6834 printf("\n.cfg_ddr_training_delay_ps[%d].csr_pptdqscntinvtrntg0[%d]=0x%08x,// %d,0x%08x", ps, temp_count,
6835 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_pptdqscntinvtrntg0[temp_count],
6836 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_pptdqscntinvtrntg0[temp_count],
6837 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].csr_pptdqscntinvtrntg0[temp_count]));
6838 for (temp_count = 0; temp_count < 4; temp_count++)
6839 printf("\n.cfg_ddr_training_delay_ps[%d].csr_pptdqscntinvtrntg1[%d]=0x%08x,// %d,0x%08x", ps, temp_count,
6840 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_pptdqscntinvtrntg1[temp_count],
6841 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_pptdqscntinvtrntg1[temp_count],
6842 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].csr_pptdqscntinvtrntg1[temp_count]));
6843 for (temp_count = 0; temp_count < 9; temp_count++)
6844 printf("\n.cfg_ddr_training_delay_ps[%d].csr_seq0bgpr[%d]=0x%08x,// %d,0x%08x", ps, temp_count,
6845 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_seq0bgpr[temp_count],
6846 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_seq0bgpr[temp_count],
6847 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].csr_seq0bgpr[temp_count]));
6848 printf("\n.cfg_ddr_training_delay_ps[%d].csr_dllgainctl=0x%08x,// %d,0x%08x", ps,
6849 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_dllgainctl,
6850 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_dllgainctl,
6851 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].csr_dllgainctl));
6852 printf("\n.cfg_ddr_training_delay_ps[%d].csr_dlllockpara=0x%08x,// %d,0x%08x", ps,
6853 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_dlllockpara,
6854 ddr_set_t_p->cfg_ddr_training_delay_ps[ps].csr_dlllockpara,
6855 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_training_delay_ps[ps].csr_dlllockpara));
6856 }
6857 printf("\n.cfg_ddr_phy_common_extra_set_t.csr_pllctrl3=0x%08x,// %d,0x%08x",
6858 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_pllctrl3,
6859 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_pllctrl3,
6860 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_phy_common_extra_set_t.csr_pllctrl3));
6861 for (temp_count = 0; temp_count < 4; temp_count++)
6862 printf("\n.cfg_ddr_phy_common_extra_set_t.csr_pptctlstatic[%d]=0x%08x,// %d,0x%08x", temp_count,
6863 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_pptctlstatic[temp_count],
6864 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_pptctlstatic[temp_count],
6865 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_phy_common_extra_set_t.csr_pptctlstatic[temp_count]));
6866 for (temp_count = 0; temp_count < 4; temp_count++)
6867 printf("\n.cfg_ddr_phy_common_extra_set_t.csr_trainingincdecdtsmen[%d]=0x%08x,// %d,0x%08x", temp_count,
6868 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_trainingincdecdtsmen[temp_count],
6869 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_trainingincdecdtsmen[temp_count],
6870 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_phy_common_extra_set_t.csr_trainingincdecdtsmen[temp_count]));
6871 for (temp_count = 0; temp_count < 4; temp_count++)
6872 printf("\n.cfg_ddr_phy_common_extra_set_t.csr_tsmbyte0[%d]=0x%08x,// %d,0x%08x", temp_count,
6873 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_tsmbyte0[temp_count],
6874 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_tsmbyte0[temp_count],
6875 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_phy_common_extra_set_t.csr_tsmbyte0[temp_count]));
6876
6877 printf("\n.cfg_ddr_phy_common_extra_set_t.csr_hwtcamode=0x%08x,// %d,0x%08x",
6878 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_hwtcamode,
6879 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_hwtcamode,
6880 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_phy_common_extra_set_t.csr_hwtcamode));
6881 printf("\n.cfg_ddr_phy_common_extra_set_t.csr_hwtlpcsena=0x%08x,// %d,0x%08x",
6882 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_hwtlpcsena,
6883 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_hwtlpcsena,
6884 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_phy_common_extra_set_t.csr_hwtlpcsena));
6885 printf("\n.cfg_ddr_phy_common_extra_set_t.csr_hwtlpcsenb=0x%08x,// %d,0x%08x",
6886 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_hwtlpcsenb,
6887 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_hwtlpcsenb,
6888 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_phy_common_extra_set_t.csr_hwtlpcsenb));
6889 printf("\n.cfg_ddr_phy_common_extra_set_t.csr_acsmctrl13=0x%08x,// %d,0x%08x",
6890 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_acsmctrl13,
6891 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_acsmctrl13,
6892 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_phy_common_extra_set_t.csr_acsmctrl13));
6893 printf("\n.cfg_ddr_phy_common_extra_set_t.csr_acsmctrl23=0x%08x,// %d,0x%08x",
6894 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_acsmctrl23,
6895 ddr_set_t_p->cfg_ddr_phy_common_extra_set_t.csr_acsmctrl23,
6896 DDR_TIMMING_OFFSET_DDR_SET(cfg_ddr_phy_common_extra_set_t.csr_acsmctrl23));
6897
6898 printf("\n},\n");
6899 }
6900#endif
6901 return 1;
6902}
6903
6904uint32_t ddr_mask_convert_offset(uint32_t mask)
6905{
6906 uint32_t offset = 0;
6907
6908 while ((mask & 1)) {
6909 offset++;
6910 mask = (mask >> 1);
6911 }
6912 return offset;
6913}
6914
6915uint32_t ddr_cacl_phy_delay_all_step_c2(char test_index, uint32_t value)
6916{
6917 //value bit0-15 fine value ,bit 16-32 coarse value
6918 uint32_t result = 0;
6919 uint32_t coarse_value = 0;
6920 uint32_t fine_value = 0;
6921
6922 if (value)
6923 coarse_value = (value >> 16);
6924 else
6925 coarse_value = 0;
6926 fine_value = (value & 0xffff);
6927 result = (coarse_value * 128 + fine_value);
6928 return result;
6929}
6930
6931uint32_t ddr_cacl_phy_over_ride_back_reg_c2(char test_index, uint32_t value)
6932{
6933 uint32_t result = 0; //bit0-15 fine value ,bit 16-32 coarse value
6934
6935 if ((test_index == DMC_TEST_WINDOW_INDEX_ATXDLY)) {
6936 if (value > (3 * 128 + 127))
6937 value = (3 * 128 + 127);
6938 result = (value % 128) + ((value / 128) << 16);
6939 } else if ((test_index == DMC_TEST_WINDOW_INDEX_TXDQSDLY) || (test_index == DMC_TEST_WINDOW_INDEX_TXDQDLY)) {
6940 if (value > (7 * 128 + 127))
6941 value = (7 * 128 + 127);
6942 result = (value % 128) + ((value / 128) << 16);
6943 } else if ((test_index == DMC_TEST_WINDOW_INDEX_RXCLKDLY) || (test_index == DMC_TEST_WINDOW_INDEX_RXPBDLY)) {
6944 if (value > (1 * 128 + 127))
6945 value = (1 * 128 + 127);
6946 result = value;
6947 } else if ((test_index == DMC_TEST_WINDOW_INDEX_RXENDLY)) {
6948 if (value > (31 * 128 + 127))
6949 value = (31 * 128 + 127);
6950 result = (value % 128) + ((value / 128) << 16);
6951 } else if ((test_index == DMC_TEST_WINDOW_INDEX_SOC_VREF) ||
6952 (test_index == DMC_TEST_WINDOW_INDEX_SOC_VREF_DAC1)) {
6953 if (value > (63))
6954 value = (63);
6955 result = value;
6956 }
6957 return result;
6958}
6959
6960uint32_t ddr_disable_update_delay_line_c2(void)
6961{
6962 //config phy update use register change and ctrl update req and condition,power on default is or condition
6963 //disable ctrl update req
6964 return 1;
6965}
6966
6967uint32_t ddr_enable_update_delay_line_c2(void)
6968{
6969 //config phy update use register change and ctrl update req and condition,power on default is or condition
6970 //enable ctrl update req
6971 return 1;
6972}
6973
6974uint32_t ddr_phy_training_reg_read_write(ddr_set_t_c2 *p_ddrs, char index,
6975 uint32_t sub_index, uint32_t read_write_value, char read_write_enable, char ps)
6976{
6977 //read_write_value bit0-15 fine value ,bit 16-32 coarse value
6978 uint32_t delay_old_value = 0;
6979 uint32_t delay_new_value = 0;
6980 uint32_t delay_reg_coarse_value = 0;
6981 uint32_t delay_reg_fine_value = 0;
6982 uint64_t reg_add_coarse = 0;
6983 uint32_t reg_add_coarse_bit_mask = 0;
6984 uint64_t reg_add_fine = 0;
6985 uint32_t reg_add_fine_bit_mask = 0;
6986 uint64_t add_base = (p_ddr_base->ddr_phy_base_address);
6987 uint32_t reg_offset = 0;
6988 uint32_t temp_save = 0;
6989
6990#define DDR_X32_F0_A800 (0x800)
6991#define DDR_X32_F0_A804 (0x804)
6992#define DDR_X32_F0_A808 (0x808)
6993#define DDR_X32_F0_A810 (0x810)
6994#define DDR_X32_F0_A828 (0x828)
6995#define DDR_X32_F0_A82C (0x82c)
6996#define DDR_X32_F0_A840 (0x840)
6997#define DDR_X32_F0_A844 (0x844)
6998#define DDR_X32_F0_A850 (0x850)
6999#define DDR_X32_F0_A858 (0x858)
7000#define DDR_X32_F0_A890 (0x890)
7001#define DDR_X32_F0_A8D0 (0x8d0)
7002#define DDR_X32_F0_A8F0 (0x8F0)
7003#define DDR_X32_F0_A8F8 (0x8F8)
7004#define DDR_X32_F0_A8D4 (0x8d4)
7005#define DDR_X32_F0_A930 (0x930)
7006#define DDR_X32_F0_AC08 (0xc08)
7007#define DDR_X32_F0_AC2C (0xc2c)
7008#define DDR_X32_F0_AC40 (0xc40)
7009#define DDR_X32_F0_AC44 (0xc44)
7010#define DDR_X32_F0_AC50 (0xc50)
7011#define DDR_X32_F0_AC58 (0xc58)
7012#define DDR_X32_F0_ACD0 (0xcd0)
7013#define DDR_X32_F0_ACD4 (0xcd4)
7014#define DDR_X32_F0_ACF0 (0xcf0)
7015#define DDR_X32_F0_ACF8 (0xcf8)
7016#define DDR_X32_F0_AD30 (0xD30)
7017 reg_offset = ps * (0x1000);
7018 if (!index)
7019 return read_write_value;
7020 //ac group0 then ac group1
7021 if (index == DMC_TEST_WINDOW_INDEX_ATXDLY) {
7022 if (sub_index < 8) { //ac group 0
7023 switch (sub_index) {
7024 case 0: //cke0
7025 reg_add_coarse = (add_base + DDR_X32_F0_A808 + reg_offset);
7026 reg_add_fine = (add_base + DDR_X32_F0_A82C + reg_offset);
7027 reg_add_coarse_bit_mask = (~(3 << 4));
7028 reg_add_fine_bit_mask = (~(0x7f << 16));
7029 break;
7030 case 1: //cke1
7031 reg_add_coarse = (add_base + DDR_X32_F0_AC08 + reg_offset);
7032 reg_add_fine = (add_base + DDR_X32_F0_AC2C + reg_offset);
7033 reg_add_coarse_bit_mask = (~(3 << 4));
7034 reg_add_fine_bit_mask = (~(0x7f << 16));
7035 break;
7036 case 2: //cs0
7037 reg_add_coarse = (add_base + DDR_X32_F0_A808 + reg_offset);
7038 reg_add_fine = (add_base + DDR_X32_F0_A82C + reg_offset);
7039 reg_add_coarse_bit_mask = (~(3 << 2));
7040 reg_add_fine_bit_mask = (~(0x7f << 8));
7041 break;
7042 case 3: //cs1
7043 reg_add_coarse = (add_base + DDR_X32_F0_AC08 + reg_offset);
7044 reg_add_fine = (add_base + DDR_X32_F0_AC2C + reg_offset);
7045 reg_add_coarse_bit_mask = (~(3 << 2));
7046 reg_add_fine_bit_mask = (~(0x7f << 8));
7047 break;
7048 case 4: //odt0
7049 reg_add_coarse = (add_base + DDR_X32_F0_A808 + reg_offset);
7050 reg_add_fine = (add_base + DDR_X32_F0_A82C + reg_offset);
7051 reg_add_coarse_bit_mask = (~(3 << 0));
7052 reg_add_fine_bit_mask = (~(0x7f << 0));
7053 break;
7054 case 5: //odt1
7055 reg_add_coarse = (add_base + DDR_X32_F0_AC08 + reg_offset);
7056 reg_add_fine = (add_base + DDR_X32_F0_AC2C + reg_offset);
7057 reg_add_coarse_bit_mask = (~(3 << 0));
7058 reg_add_fine_bit_mask = (~(0x7f << 0));
7059 break;
7060 case 6: //clk
7061 reg_add_coarse = (add_base + DDR_X32_F0_A804 + reg_offset);
7062 reg_add_fine = (add_base + DDR_X32_F0_A828 + reg_offset);
7063 reg_add_coarse_bit_mask = (~(1 << 18));
7064 reg_add_fine_bit_mask = (~(0x7f << 8));
7065 break;
7066 case 7: //this pin use for act pin
7067 //reg_add_coarse = 0;
7068 //reg_add_fine = 0;
7069 reg_add_coarse = (add_base + DDR_X32_F0_A800 + (((36 - 8 - 4 - 2 + 2) / 16) << 2) + reg_offset);
7070 reg_add_fine = (add_base + DDR_X32_F0_A810 + (((36 - 8 - 4 - 2 + 2) / 4) << 2) + reg_offset);
7071 reg_add_coarse_bit_mask = (~(3 << (((36 - 8 - 4 - 2 + 2) % 16) << 1)));
7072 reg_add_fine_bit_mask = (~(0x7f << (((36 - 8 - 4 - 2 + 2) % 4) * 8)));
7073
7074 break;
7075 }
7076 } else if (sub_index < (8 + 16)) { ////ac group 1
7077 reg_add_coarse = (add_base + DDR_X32_F0_A800 + (((sub_index - 8) / 16) << 2) + reg_offset);
7078 reg_add_fine = (add_base + DDR_X32_F0_A810 + (((sub_index - 8) / 4) << 2) + reg_offset);
7079 reg_add_coarse_bit_mask = (~(3 << (((sub_index - 8) % 16) << 1)));
7080 reg_add_fine_bit_mask = (~(0x7f << (((sub_index - 8) % 4) * 8)));
7081 } else if (sub_index < (8 + 16 + 4)) {
7082 reg_add_coarse = 0;
7083 reg_add_fine = 0;
7084 } else if (sub_index < (8 + 16 + 4 + 3 + 2)) {
7085 reg_add_coarse = (add_base + DDR_X32_F0_A800 + (((sub_index - 8 - 4) / 16) << 2) + reg_offset);
7086 reg_add_fine = (add_base + DDR_X32_F0_A810 + (((sub_index - 8 - 4) / 4) << 2) + reg_offset);
7087 reg_add_coarse_bit_mask = (~(3 << (((sub_index - 8 - 4) % 16) << 1)));
7088 reg_add_fine_bit_mask = (~(0x7f << (((sub_index - 8 - 4) % 4) * 8)));
7089 }
7090#if 0
7091 else if (sub_index < (8 + 16 + 4 + 3 + 2)) {
7092 reg_add_coarse = 0;
7093 reg_add_fine = 0;
7094 }
7095#endif
7096 else if (sub_index < (8 + 28)) {
7097 reg_add_coarse = (add_base + DDR_X32_F0_A800 + (((sub_index - 8 - 4 - 2 + 2) / 16) << 2) + reg_offset);
7098 reg_add_fine = (add_base + DDR_X32_F0_A810 + (((sub_index - 8 - 4 - 2 + 2) / 4) << 2) + reg_offset);
7099 reg_add_coarse_bit_mask = (~(3 << (((sub_index - 8 - 4 - 2 + 2) % 16) << 1)));
7100 reg_add_fine_bit_mask = (~(0x7f << (((sub_index - 8 - 4 - 2 + 2) % 4) * 8)));
7101 } else {
7102 reg_add_coarse = 0;
7103 reg_add_fine = 0;
7104 }
7105 } else if (index == DMC_TEST_WINDOW_INDEX_TXDQSDLY) {
7106 reg_add_coarse = (add_base + DDR_X32_F0_A8D4 + (sub_index / 4) * (
7107 DDR_X32_F0_ACD4 - DDR_X32_F0_A8D4) + (((sub_index % 4) << 1) << 2) + reg_offset);
7108 reg_add_fine = (add_base + DDR_X32_F0_A8F8 + (sub_index / 4) * (
7109 DDR_X32_F0_ACF8 - DDR_X32_F0_A8F8) + ((sub_index % 4) << 4) + reg_offset);
7110 reg_add_coarse_bit_mask = (~(3 << ((4))));
7111 reg_add_fine_bit_mask = (~(0x7f << 8));
7112 } else if (index == DMC_TEST_WINDOW_INDEX_RXCLKDLY) {
7113 reg_add_coarse = 0;
7114 reg_add_fine = (add_base + DDR_X32_F0_A858 + (sub_index / 4) * (
7115 DDR_X32_F0_AC58 - DDR_X32_F0_A858) + ((sub_index % 4) << 4) + reg_offset);
7116 reg_add_coarse_bit_mask = 0;
7117 reg_add_fine_bit_mask = (~(0xff << (8)));
7118 }
7119 //d0-d7 dm0 d8-d15 dm1...
7120 else if (index == DMC_TEST_WINDOW_INDEX_TXDQDLY) {
7121 reg_add_coarse = (add_base + DDR_X32_F0_A8D0 + (sub_index / 36) * (DDR_X32_F0_ACD0
7122 - DDR_X32_F0_A8D0) + ((((sub_index % 36) / 9) << 1) << 2) + (((((sub_index) % 9) / 8)) << 2) + reg_offset);
7123 reg_add_fine = (add_base + DDR_X32_F0_A8F0 + (sub_index / 36) * (DDR_X32_F0_ACF0
7124 - DDR_X32_F0_A8F0) + ((((sub_index % 36) / 9)) << 4) + (((((sub_index) % 9)) >> 2) << 2) + reg_offset);
7125 reg_add_coarse_bit_mask = (~(7 << (((((sub_index) % 9) % 8) << 2))));
7126 reg_add_fine_bit_mask = (~(0x7f << (((((sub_index) % 9) % 4) << 3))));
7127 }
7128 //d0-d7 dm0 d8-d15 dm1...
7129 else if (index == DMC_TEST_WINDOW_INDEX_RXPBDLY) {
7130 reg_add_coarse = 0;
7131 reg_add_fine = (add_base + DDR_X32_F0_A850 + (sub_index / 36) * (DDR_X32_F0_AC50
7132 - DDR_X32_F0_A850) + ((((sub_index % 36) / 9)) << 4) + (((sub_index % 9) >> 2) << 2) + reg_offset);
7133 reg_add_coarse_bit_mask = 0;
7134 reg_add_fine_bit_mask = (~(0xff << (((((sub_index) % 9) % 4) << 3))));
7135 } else if (index == DMC_TEST_WINDOW_INDEX_RXENDLY) {
7136 reg_add_coarse = (add_base + DDR_X32_F0_A840 + (sub_index / 4) * (DDR_X32_F0_AC40
7137 - DDR_X32_F0_A840) + reg_offset);
7138 reg_add_fine = (add_base + DDR_X32_F0_A844 + (sub_index / 4) * (DDR_X32_F0_AC44
7139 - DDR_X32_F0_A844) + reg_offset);
7140 reg_add_coarse_bit_mask = (~(0x1f << ((sub_index << 3))));
7141 reg_add_fine_bit_mask = (~(0x7f << ((sub_index << 3))));
7142 } else if (index == DMC_TEST_WINDOW_INDEX_SOC_VREF) {
7143 if (sub_index < (36)) { //vref dq and dbi
7144 reg_add_coarse = 0;
7145 reg_add_fine = (add_base + DDR_X32_F0_A890 + (((sub_index / 9) * 4) << 2)
7146 + (((sub_index % 9) >> 2) << 2) + reg_offset);
7147 reg_add_coarse_bit_mask = 0;
7148 reg_add_fine_bit_mask = (~(0x3f << (((((sub_index) % 9) % 4) << 3))));
7149 } else if (sub_index < (44)) { //vref dqs and dqsn
7150 reg_add_coarse = 0;
7151 reg_add_fine = (add_base + DDR_X32_F0_A890 + 8 + ((((sub_index - 36) / 2) * 4) << 2) + reg_offset);
7152 reg_add_coarse_bit_mask = 0;
7153 reg_add_fine_bit_mask = (~(0x3f << (((((sub_index - 36) % 2)) << 3) + 8)));
7154 }
7155 } else if (index == DMC_TEST_WINDOW_INDEX_SOC_VREF_DAC1) {
7156 if (sub_index < (36)) { //vref dq and dbi
7157 reg_add_coarse = 0;
7158 reg_add_fine = (add_base + DDR_X32_F0_A890 + 0x100 + (((sub_index / 9) * 4) << 2)
7159 + (((sub_index % 9) >> 2) << 2) + reg_offset);
7160 reg_add_coarse_bit_mask = 0;
7161 reg_add_fine_bit_mask = (~(0x3f << (((((sub_index) % 9) % 4) << 3))));
7162 } else if (sub_index < (44)) { //vref dqs and dqsn
7163 reg_add_coarse = 0;
7164 reg_add_fine = (add_base + DDR_X32_F0_A890 + 0x100 + 8 + ((((sub_index - 36) / 2) * 4) << 2) + reg_offset);
7165 reg_add_coarse_bit_mask = 0;
7166 reg_add_fine_bit_mask = (~(0x3f << (((((sub_index - 36) % 2)) << 3) + 8)));
7167 }
7168 } else if (index == DMC_TEST_WINDOW_INDEX_DRAM_VREF) {
7169 if (sub_index < (36)) { //DDR_X32_F0_AD30 DDR_X32_F0_A930
7170 reg_add_coarse = 0;
7171 reg_add_fine = (add_base + DDR_X32_F0_A930 +
7172 ((DDR_X32_F0_AD30 - DDR_X32_F0_A930) * sub_index % 2) + reg_offset);
7173 reg_add_coarse_bit_mask = 0;
7174 reg_add_fine_bit_mask = (~(0xff << 0));
7175 }
7176 } else if (index == DMC_TEST_WINDOW_INDEX_EXTERA_PS) {
7177 if (sub_index == 1) { //DDR_X32_F0_AD30 DDR_X32_F0_A930
7178 }
7179
7180 return read_write_value;
7181 }
7182
7183 {
7184 if (reg_add_coarse)
7185 delay_reg_coarse_value = (((rd_reg(reg_add_coarse)) & (~reg_add_coarse_bit_mask))
7186 >> (ddr_mask_convert_offset(reg_add_coarse_bit_mask)));
7187 if (reg_add_fine)
7188 delay_reg_fine_value = (((rd_reg(reg_add_fine)) & (~reg_add_fine_bit_mask))
7189 >> (ddr_mask_convert_offset(reg_add_fine_bit_mask)));
7190
7191 delay_old_value = ((delay_reg_coarse_value << 16) | delay_reg_fine_value);
7192 delay_old_value = ddr_cacl_phy_delay_all_step_c2(index, delay_old_value);
7193 }
7194
7195 if (read_write_enable == REGISTER_READ) {
7196 read_write_value = delay_old_value;
7197 } else if (read_write_enable == REGISTER_WRITE) {
7198 delay_new_value = read_write_value;
7199 delay_new_value = ddr_cacl_phy_over_ride_back_reg_c2(index, delay_new_value);
7200 temp_save = rd_reg(p_ddr_base->ddr_dmc_refresh_ctrl_address);
7201 wr_reg((p_ddr_base->ddr_dmc_refresh_ctrl_address), 0x21); //take care T5 no set bit //bit 22 dmc to control DFI_CTRLUPD_REQ with zq generation together.
7202 ddr_udelay_dummy(1);
7203 wr_reg(p_ddr_base->ddr_phy_base_address + 0x2440, 1); //detect should update delay when controller update arrive
7204 ddr_udelay_dummy(1);
7205 if (reg_add_coarse)
7206 wr_reg(reg_add_coarse, ((rd_reg(reg_add_coarse)) & (reg_add_coarse_bit_mask))
7207 | ((delay_new_value >> 16) << (ddr_mask_convert_offset(reg_add_coarse_bit_mask))));
7208 if (reg_add_fine)
7209 wr_reg(reg_add_fine, ((rd_reg(reg_add_fine)) & (reg_add_fine_bit_mask))
7210 | ((delay_new_value & 0xffff) << (ddr_mask_convert_offset(reg_add_fine_bit_mask))));
7211 ddr_udelay_dummy(1);
7212 //wr_reg(p_ddr_base->ddr_phy_base_address + 0x2440, 1); //no need force release ,because maybe have glitch when ddr read/write ,must update on the rfc stage
7213 //wr_reg(p_ddr_base->ddr_phy_base_address + 0x2440, 2);
7214 //ddr_udelay_dummy(1);
7215 //wr_reg(p_ddr_base->ddr_phy_base_address + 0x2440, 0);
7216 //ddr_udelay_dummy(1);
7217 wr_reg((p_ddr_base->ddr_dmc_refresh_ctrl_address), (temp_save & (~((1 << 22) | (1 << 4)))));
7218 ddr_udelay_dummy(1);
7219 wr_reg((p_ddr_base->ddr_dmc_refresh_ctrl_address), (temp_save & (~((1 << 22)))) | (1 << 4));
7220 ddr_udelay_dummy(40); //since we are use 3 refresh time ,so should over 4*7.8us make sure a update command send out ,then maybe fail
7221 wr_reg((p_ddr_base->ddr_dmc_refresh_ctrl_address), (temp_save & (~((1 << 22)))) | (1 << 4));
7222 ddr_udelay_dummy(1);
7223 wr_reg((p_ddr_base->ddr_dmc_refresh_ctrl_address), (temp_save));
7224 }
7225 printf("delay_old_value,%08x,read_write_value,%08x,index,%08x,sub_index,%08x\n", delay_old_value, read_write_value, index, sub_index);
7226
7227 return read_write_value;
7228}
7229
7230void ddr_read_write_training_value(ddr_set_t_c2 *p_ddrs, char over_ride_index,
7231 char read_write, uint32_t ps, void *input, char print)
7232{
7233 uint16_t t_count = 0;
7234 char count_max = 72;
7235 uint16_t t_count_value = 0;
7236 uint16_t delay_temp = 0;
7237 char *input_uint8_p = input;
7238 uint16_t *input_uint16_p = input;
7239 char p_size = 1;
7240 char read_skip = 0;
7241
7242 for (t_count = 0; t_count < count_max; t_count++) {
7243 if ((over_ride_index == DMC_TEST_WINDOW_INDEX_ATXDLY)
7244 || (over_ride_index == DMC_TEST_WINDOW_INDEX_TXDQSDLY)
7245 || (over_ride_index == DMC_TEST_WINDOW_INDEX_RXPBDLY)
7246 || (over_ride_index == DMC_TEST_WINDOW_INDEX_RXENDLY)
7247 || (over_ride_index == DMC_TEST_WINDOW_INDEX_RXCLKDLY)
7248 || (over_ride_index == DMC_TEST_WINDOW_INDEX_TXDQDLY)
7249 || (over_ride_index == DMC_TEST_WINDOW_INDEX_SOC_VREF)
7250 || (over_ride_index == DMC_TEST_WINDOW_INDEX_SOC_VREF_DAC1)
7251 ) {
7252 if (over_ride_index == DMC_TEST_WINDOW_INDEX_ATXDLY) {
7253 p_size = 2;
7254 count_max = 36;
7255 } else if (over_ride_index == DMC_TEST_WINDOW_INDEX_TXDQSDLY) {
7256 p_size = 2;
7257 count_max = 8;
7258 } else if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXPBDLY) {
7259 p_size = 1;
7260 count_max = 72;
7261 } else if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXENDLY) {
7262 p_size = 2;
7263 count_max = 8;
7264 } else if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXCLKDLY) {
7265 p_size = 1;
7266 count_max = 8;
7267 } else if (over_ride_index == DMC_TEST_WINDOW_INDEX_TXDQDLY) {
7268 p_size = 2;
7269 count_max = 72;
7270 } else if ((over_ride_index == DMC_TEST_WINDOW_INDEX_SOC_VREF) ||
7271 (over_ride_index == DMC_TEST_WINDOW_INDEX_SOC_VREF_DAC1)) {
7272 p_size = 1;
7273 count_max = 44;
7274 } //else if (over_ride_index == DMC_TEST_WINDOW_INDEX_EXTERA_PS) {
7275 // p_size = 2;
7276 // count_max = 8;
7277 //}
7278 if (read_write == REGISTER_READ) {
7279 read_skip = 0;
7280 if ((ps == 3) && ((over_ride_index == DMC_TEST_WINDOW_INDEX_SOC_VREF) ||
7281 (over_ride_index == DMC_TEST_WINDOW_INDEX_SOC_VREF_DAC1))) {
7282 if (t_count > 35)
7283 read_skip = 1;
7284 else //ro training no vref value
7285 if ((t_count % 9) == 8)
7286 read_skip = 1;
7287 }
7288 t_count_value = ddr_phy_training_reg_read_write(p_ddrs,
7289 over_ride_index, t_count, t_count_value, read_write, ps);
7290 delay_temp = t_count_value;
7291 if (read_skip) {
7292 } else {
7293 if (p_size == 1)
7294 (*input_uint8_p) = delay_temp;
7295 if (p_size == 2)
7296 (*input_uint16_p) = delay_temp;
7297 }
7298 } else {
7299 if (p_size == 1)
7300 delay_temp = (*input_uint8_p);
7301 if (p_size == 2)
7302 delay_temp = (*input_uint16_p);
7303 t_count_value = delay_temp;
7304 ddr_phy_training_reg_read_write(p_ddrs, over_ride_index, t_count, t_count_value, read_write, ps);
7305 }
7306 if (p_size == 1)
7307 input_uint8_p++;
7308 if (p_size == 2)
7309 input_uint16_p++;
7310
7311 if (print == DDR_PRINT_ENABLE) {
7312 printf("training_index %d sub_index %d phase %d\n", over_ride_index, t_count, t_count_value);
7313 } else { //maybe function will be optimize not use the variable
7314 }
7315 //printf("training_index %d sub_index %d phase %d\n", over_ride_index, t_count, t_count_value);
7316 }
7317 }
7318} /* ddr_read_write_training_value */
7319
7320void ddr_read_write_training_all_delay_value(ddr_set_t_c2 *p_ddrs, char read_write, char print)
7321{
7322 uint32_t ps = 0;
7323
7324 for (ps = 0; ps < 2; ) {
7325 ddr_read_write_training_value(p_ddrs, DMC_TEST_WINDOW_INDEX_ATXDLY,
7326 read_write, ps, &(p_ddrs->cfg_ddr_training_delay_ps[ps].ac_trace_delay), print);
7327 ddr_read_write_training_value(p_ddrs, DMC_TEST_WINDOW_INDEX_TXDQSDLY,
7328 read_write, ps, &(p_ddrs->cfg_ddr_training_delay_ps[ps].write_dqs_delay), print);
7329 ddr_read_write_training_value(p_ddrs, DMC_TEST_WINDOW_INDEX_RXCLKDLY,
7330 read_write, ps, &(p_ddrs->cfg_ddr_training_delay_ps[ps].read_dqs_delay), print);
7331 ddr_read_write_training_value(p_ddrs, DMC_TEST_WINDOW_INDEX_TXDQDLY,
7332 read_write, ps, &(p_ddrs->cfg_ddr_training_delay_ps[ps].write_dq_bit_delay), print);
7333 ddr_read_write_training_value(p_ddrs, DMC_TEST_WINDOW_INDEX_RXPBDLY,
7334 read_write, ps, &(p_ddrs->cfg_ddr_training_delay_ps[ps].read_dq_bit_delay), print);
7335 ddr_read_write_training_value(p_ddrs, DMC_TEST_WINDOW_INDEX_RXENDLY,
7336 read_write, ps, &(p_ddrs->cfg_ddr_training_delay_ps[ps].read_dqs_gate_delay), print);
7337 ddr_read_write_training_value(p_ddrs, DMC_TEST_WINDOW_INDEX_SOC_VREF,
7338 read_write, ps, &(p_ddrs->cfg_ddr_training_delay_ps[ps].soc_bit_vref), print);
7339 ddr_read_write_training_value(p_ddrs, DMC_TEST_WINDOW_INDEX_SOC_VREF_DAC1,
7340 read_write, ps, &(p_ddrs->cfg_ddr_training_delay_ps[ps].soc_bit_vref_dac1), print);
7341 ddr_read_write_training_value(p_ddrs, DMC_TEST_WINDOW_INDEX_EXTERA_PS,
7342 read_write, ps, 0, print);
7343 p_ddrs->cfg_ddr_training_delay_ps[ps].dram_bit_vref[0] = ((rd_reg(p_ddr_base->ddr_phy_base_address + 0x3930)) & 0x3f);
7344
7345 ps = ps + 1;
7346 }
7347}
7348
7349uint32_t ddr_get_c2_bdlr_100step_min(void)
7350{
7351 uint32_t bdlr_100step = 0;
7352 uint32_t DRAMFreq = 0;
7353 uint32_t stick_store_sticky_f0_reg_base_t = (p_ddr_base->ddr_phy_base_address + 0x0128);
7354
7355 DRAMFreq = rd_reg(stick_store_sticky_f0_reg_base_t);
7356 uint32_t dll_counter = 0;
7357 uint32_t dll_counter_max = 0;
7358
7359 dll_counter = (((rd_reg(p_ddr_base->ddr_phy_base_address + 0x3130))));
7360 dll_counter_max = ddr_max((dll_counter & 0xff), ((dll_counter >> 8) & 0xff));
7361 dll_counter_max = ddr_max(dll_counter_max, ((dll_counter >> 16) & 0xff));
7362 dll_counter_max = ddr_max(dll_counter_max, ((dll_counter >> 24) & 0xff));
7363 dll_counter_max = dll_counter_max ? dll_counter_max : 1;
7364 bdlr_100step = (100000000 / (2 * (DRAMFreq))) / (dll_counter_max);
7365 return bdlr_100step;
7366}
7367
7368uint32_t ddr_get_c2_bdlr_100step_max(void)
7369{
7370 uint32_t bdlr_100step = 0;
7371 uint32_t DRAMFreq = 0;
7372 uint32_t stick_store_sticky_f0_reg_base_t = (p_ddr_base->ddr_phy_base_address + 0x0128);
7373
7374 DRAMFreq = rd_reg(stick_store_sticky_f0_reg_base_t);
7375 uint32_t dll_counter = 0;
7376 uint32_t dll_counter_min = 0;
7377
7378 dll_counter = (((rd_reg(p_ddr_base->ddr_phy_base_address + 0x312c))));
7379 dll_counter_min = ddr_min((dll_counter & 0xff), ((dll_counter >> 8) & 0xff));
7380 dll_counter_min = ddr_min(dll_counter_min, ((dll_counter >> 16) & 0xff));
7381 dll_counter_min = ddr_min(dll_counter_min, ((dll_counter >> 24) & 0xff));
7382 dll_counter_min = dll_counter_min ? dll_counter_min : 1;
7383 bdlr_100step = (100000000 / (2 * (DRAMFreq))) / (dll_counter_min);
7384 return bdlr_100step;
7385}
7386
7387uint32_t ddr_get_c2_bdlr_100step(void)
7388{
7389 uint32_t bdlr_100step = 0;
7390 uint32_t DRAMFreq = 0;
7391 uint32_t dll_counter = 0;
7392 uint32_t stick_store_sticky_f0_reg_base_t = (p_ddr_base->ddr_phy_base_address + 0x0128);
7393
7394 DRAMFreq = rd_reg(stick_store_sticky_f0_reg_base_t);
7395 dll_counter = rd_reg(p_ddr_base->ddr_phy_base_address + 0x3128);
7396 dll_counter = (((dll_counter & 0xff) + ((dll_counter >> 8) & 0xff) + ((dll_counter >> 16) & 0xff) + ((dll_counter >> 24) & 0xff)) >> 2);
7397 bdlr_100step = (100000000 / (2 * DRAMFreq)) / (dll_counter + 1);
7398 return bdlr_100step;
7399}
7400
7401uint32_t ddr_get_c2_bdlr_100step_cur(void)
7402{
7403 uint32_t bdlr_100step = 0;
7404 uint32_t DRAMFreq = 0;
7405 uint32_t dll_counter = 0;
7406 uint32_t stick_store_sticky_f0_reg_base_t = (p_ddr_base->ddr_phy_base_address + 0x0128);
7407
7408 DRAMFreq = rd_reg(stick_store_sticky_f0_reg_base_t);
7409 dll_counter = rd_reg(p_ddr_base->ddr_phy_base_address + 0x3100);
7410 dll_counter = (((dll_counter >> 1) & 0xff));
7411 bdlr_100step = (100000000 / (2 * DRAMFreq)) / (dll_counter + 1);
7412 // printf("\nrdll_counter=%08x ", rd_reg(p_ddr_base->ddr_phy_base_address + 0x3100));
7413 return bdlr_100step;
7414}
7415
7416uint32_t ddr_get_ui_1_128_100step(void)
7417{
7418 uint32_t DRAMFreq = 0;
7419 uint32_t stick_store_sticky_f0_reg_base_t = (p_ddr_base->ddr_phy_base_address + 0x0128);
7420
7421 DRAMFreq = rd_reg(stick_store_sticky_f0_reg_base_t);
7422 return (1000000 * 100 / (2 * 128)) / ((DRAMFreq));
7423}
7424
7425uint32_t do_read_c2_ddr_bdlr_steps(void)
7426{
7427 uint32_t DRAMFreq = 0;
7428
7429 DRAMFreq = get_ddr_clk();
7430 printf("\nc2_chip_DRAMFreq=%d MHz,100min_bdlr=%d ps,100max_bdlr=%d ps,ave_100_bdlr=%d ps,bdlr_var=%d thousand,cur_100_bdlr=%d ps\n",
7431 DRAMFreq, ddr_get_c2_bdlr_100step_min(), ddr_get_c2_bdlr_100step_max(), ddr_get_c2_bdlr_100step(),
7432 2000 * (ddr_get_c2_bdlr_100step_max() - ddr_get_c2_bdlr_100step_min()) / (ddr_get_c2_bdlr_100step_max() + ddr_get_c2_bdlr_100step_min()), ddr_get_c2_bdlr_100step_cur());
7433
7434 return ddr_get_c2_bdlr_100step();
7435}
7436
7437int do_read_c2_ddr_training_data(char log_level, ddr_set_t_c2 *ddr_set_t_p)
7438{
7439 uint32_t stick_store_sticky_f0_reg_base_t = (p_ddr_base->ddr_phy_base_address + 0x0128);
7440 uint32_t stick_store_sticky_f1_reg_base_t = (p_ddr_base->ddr_phy_base_address + 0x1128);
7441
7442 printf_log(log_level, "\nddr_set_t_p==0x%08x\n", (uint32_t)(uint64_t)(ddr_set_t_p));
7443 uint32_t loop = 0;
7444 uint32_t loop_max = (4 + (0x3f << 2)); //((DMC_STICKY_63-DMC_STICKY_0));
7445 for (loop = 0; loop < loop_max; loop += 4)
7446 wr_reg(((uint64_t)(ddr_set_t_p) + loop), rd_reg((p_ddr_base->ddr_dmc_sticky0) + loop));
7447 loop_max = sizeof(board_SI_setting_ps_t);
7448 for (loop = 0; loop < loop_max; loop += 4)
7449 wr_reg(((uint64_t)(&(ddr_set_t_p->cfg_board_SI_setting_ps[0])) + loop), rd_reg((stick_store_sticky_f0_reg_base_t + loop)));
7450 for (loop = 0; loop < loop_max; loop += 4)
7451 wr_reg(((uint64_t)(&(ddr_set_t_p->cfg_board_SI_setting_ps[1])) + loop), rd_reg((stick_store_sticky_f1_reg_base_t + loop)));
7452 for (loop = 0; loop < MESON_CPU_CHIP_ID_SIZE; loop++) //update chip id
7453
7454 ddr_sha_c2.sha_chip_id[loop] = global_chip_id[loop];
7455 {
7456 bdlr_100step = get_bdlr_100step(global_ddr_clk);
7457 ui_1_32_100step = (1000000 * 100 / (global_ddr_clk * 2 * 32));
7458 ddr_read_write_training_all_delay_value(ddr_set_t_p, REGISTER_READ, ~log_level);
7459 }
7460 return 1;
7461}
7462
7463int do_ddr_display_c2_ddr_information(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
7464{
7465 int i = 0;
7466 unsigned int ps = 0;
7467
7468 printf("\nargc== 0x%08x\n", argc);
7469 for (i = 0; i < argc; i++)
7470 printf("\nargv[%d]=%s\n", i, argv[i]);
7471
7472 do_read_c2_ddr_training_data(0, ddr_set_t_p);
7473
7474 {
7475 uint32_t count = 0;
7476 uint32_t reg_add_offset = 0;
7477
7478 printf("\n PCTL timming: 0x");
7479
7480 for (count = 0; count < ((p_ddr_base->ddr_pctl_timing_end_address) - (p_ddr_base->ddr_pctl_timing_base_address)); ) {
7481 reg_add_offset = ((p_ddr_base->ddr_pctl_timing_base_address) + (count));
7482 printf("\n reg_add_offset: %08x %08x %08x ", reg_add_offset, readl(reg_add_offset), reg_add_offset);
7483 count = count + 4;
7484 }
7485 printf("\n mrs register: ");
7486 printf("\n mrs register: base (0x54000<<1)+DDR_PHY_BASE,%08x byte offset\n", (0x54000 << 1) + (p_ddr_base->ddr_phy_base_address));
7487
7488 printf("\n sticky register: ");
7489 {
7490 uint32_t loop_max = 0;
7491 loop_max = 64 << 2; //sizeof(ddr_set_t);
7492 for (count = 0; count < loop_max; count += 4)
7493 printf("\n reg_add_offset: %08x %08x %08x", count, rd_reg((uint64_t)((p_ddr_base->ddr_dmc_sticky0)) + count), (((p_ddr_base->ddr_dmc_sticky0)) + count));
7494 }
7495
7496 {
7497 uint32_t loop_max = 0;
7498 loop_max = sizeof(ddr_set_t_c2);
7499 uint32_t count = 0;
7500 for (count = 0; count < loop_max; ) {
7501 printf("\n%08x %08x", count, rd_reg((uint64_t)(ddr_set_t_p) + count));
7502 count = count + 4;
7503 }
7504 }
7505 }
7506
7507 printf("\n {");
7508
7509 uint32_t temp_count = 0;
7510 {
7511 printf("\n//old fast_boot[%d]=0x%08x,// %d", 0, ddr_set_t_p->cfg_board_common_setting.fast_boot[0], ddr_set_t_p->cfg_board_common_setting.fast_boot[0]);
7512 ddr_set_t_p->cfg_board_common_setting.fast_boot[0] = 0xfd; //add for auto copy to code test
7513 for (temp_count = 0; temp_count < 4; temp_count++)
7514 printf("\n.cfg_board_common_setting.fast_boot[%d]=0x%08x,// %d", temp_count, ddr_set_t_p->cfg_board_common_setting.fast_boot[temp_count], ddr_set_t_p->cfg_board_common_setting.fast_boot[temp_count]);
7515
7516 printf("\n.cfg_board_common_setting.timming_magic=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.timming_magic, ddr_set_t_p->cfg_board_common_setting.timming_magic);
7517 printf("\n.cfg_board_common_setting.timming_max_valid_configs=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.timming_max_valid_configs, ddr_set_t_p->cfg_board_common_setting.timming_max_valid_configs);
7518 printf("\n.cfg_board_common_setting.timming_struct_version=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.timming_struct_version, ddr_set_t_p->cfg_board_common_setting.timming_struct_version);
7519 printf("\n.cfg_board_common_setting.timming_struct_org_size=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.timming_struct_org_size, ddr_set_t_p->cfg_board_common_setting.timming_struct_org_size);
7520 printf("\n.cfg_board_common_setting.timming_struct_real_size=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.timming_struct_real_size, ddr_set_t_p->cfg_board_common_setting.timming_struct_real_size);
7521 printf("\n.cfg_board_common_setting.ddr_func=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.ddr_func, ddr_set_t_p->cfg_board_common_setting.ddr_func);
7522 printf("\n.cfg_board_common_setting.board_id=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.board_id, ddr_set_t_p->cfg_board_common_setting.board_id);
7523 printf("\n.cfg_board_common_setting.DramType=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.DramType, ddr_set_t_p->cfg_board_common_setting.DramType);
7524 printf("\n.cfg_board_common_setting.dram_rank_config=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.dram_rank_config, ddr_set_t_p->cfg_board_common_setting.dram_rank_config);
7525 printf("\n.cfg_board_common_setting.DisabledDbyte=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.DisabledDbyte, ddr_set_t_p->cfg_board_common_setting.DisabledDbyte);
7526 printf("\n.cfg_board_common_setting.dram_cs0_base_add=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.dram_cs0_base_add, ddr_set_t_p->cfg_board_common_setting.dram_cs0_base_add);
7527 printf("\n.cfg_board_common_setting.dram_cs1_base_add=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.dram_cs1_base_add, ddr_set_t_p->cfg_board_common_setting.dram_cs1_base_add);
7528 if (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T3) {
7529 printf("\n.cfg_board_common_setting.dram_ch0_size_MB=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.dram_cs0_size_MB, ddr_set_t_p->cfg_board_common_setting.dram_cs0_size_MB);
7530 printf("\n.cfg_board_common_setting.dram_ch1_size_MB=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.dram_cs1_size_MB, ddr_set_t_p->cfg_board_common_setting.dram_cs1_size_MB);
7531 } else {
7532 printf("\n.cfg_board_common_setting.dram_cs0_size_MB=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.dram_cs0_size_MB, ddr_set_t_p->cfg_board_common_setting.dram_cs0_size_MB);
7533 printf("\n.cfg_board_common_setting.dram_cs1_size_MB=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.dram_cs1_size_MB, ddr_set_t_p->cfg_board_common_setting.dram_cs1_size_MB);
7534 }
7535 printf("\n.cfg_board_common_setting.dram_x4x8x16_mode=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.dram_x4x8x16_mode, ddr_set_t_p->cfg_board_common_setting.dram_x4x8x16_mode);
7536 printf("\n.cfg_board_common_setting.Is2Ttiming=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.Is2Ttiming, ddr_set_t_p->cfg_board_common_setting.Is2Ttiming);
7537 printf("\n.cfg_board_common_setting.log_level=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.log_level, ddr_set_t_p->cfg_board_common_setting.log_level);
7538 printf("\n.cfg_board_common_setting.ddr_rdbi_wr_enable=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.ddr_rdbi_wr_enable, ddr_set_t_p->cfg_board_common_setting.ddr_rdbi_wr_enable);
7539 printf("\n.cfg_board_common_setting.pll_ssc_mode=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.pll_ssc_mode, ddr_set_t_p->cfg_board_common_setting.pll_ssc_mode);
7540 printf("\n.cfg_board_common_setting.org_tdqs2dq=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.org_tdqs2dq, ddr_set_t_p->cfg_board_common_setting.org_tdqs2dq);
7541 for (temp_count = 0; temp_count < 2; temp_count++)
7542 printf("\n.cfg_board_common_setting.reserve1_test_function[%d]=0x%08x,// %d", temp_count, ddr_set_t_p->cfg_board_common_setting.reserve1_test_function[temp_count], ddr_set_t_p->cfg_board_common_setting.reserve1_test_function[temp_count]);
7543 for (temp_count = 0; temp_count < 5; temp_count++)
7544 printf("\n.cfg_board_common_setting.ddr_dmc_remap[%d]=0x%08x,// %d", temp_count, ddr_set_t_p->cfg_board_common_setting.ddr_dmc_remap[temp_count], ddr_set_t_p->cfg_board_common_setting.ddr_dmc_remap[temp_count]);
7545 for (temp_count = 0; temp_count < 35; temp_count++)
7546 printf("\n.cfg_board_common_setting.ac_pinmux[%d]=0x%08x,// %d", temp_count, ddr_set_t_p->cfg_board_common_setting.ac_pinmux[temp_count], (uint32_t)ddr_set_t_p->cfg_board_common_setting.ac_pinmux[temp_count]);
7547 printf("\n.cfg_board_common_setting.ddr_dqs_swap=0x%08x,// %d", ddr_set_t_p->cfg_board_common_setting.ddr_dqs_swap, ddr_set_t_p->cfg_board_common_setting.ddr_dqs_swap);
7548 for (temp_count = 0; temp_count < 36; temp_count++)
7549 printf("\n.cfg_board_common_setting.ddr_dq_remap[%d]=0x%08x,// %d", temp_count, ddr_set_t_p->cfg_board_common_setting.ddr_dq_remap[temp_count], (uint32_t)ddr_set_t_p->cfg_board_common_setting.ddr_dq_remap[temp_count]);
7550 for (temp_count = 0; temp_count < 4; temp_count++)
7551 printf("\n.cfg_board_common_setting.ddr_vddee_setting[%d]=0x%08x,// %d", temp_count, ddr_set_t_p->cfg_board_common_setting.ddr_vddee_setting[temp_count], (uint32_t)ddr_set_t_p->cfg_board_common_setting.ddr_vddee_setting[temp_count]);
7552
7553
7554
7555
7556 for (ps = 0; ps < 2; ps++) {
7557 printf("\n.cfg_board_SI_setting_ps[%d].DRAMFreq=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].DRAMFreq, ddr_set_t_p->cfg_board_SI_setting_ps[ps].DRAMFreq);
7558 printf("\n.cfg_board_SI_setting_ps[%d].PllBypassEn=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].PllBypassEn, ddr_set_t_p->cfg_board_SI_setting_ps[ps].PllBypassEn);
7559 printf("\n.cfg_board_SI_setting_ps[%d].training_SequenceCtrl=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].training_SequenceCtrl, ddr_set_t_p->cfg_board_SI_setting_ps[ps].training_SequenceCtrl);
7560 printf("\n.cfg_board_SI_setting_ps[%d].ddr_odt_config=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].ddr_odt_config, ddr_set_t_p->cfg_board_SI_setting_ps[ps].ddr_odt_config);
7561 printf("\n.cfg_board_SI_setting_ps[%d].clk_drv_ohm=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].clk_drv_ohm, ddr_set_t_p->cfg_board_SI_setting_ps[ps].clk_drv_ohm);
7562 printf("\n.cfg_board_SI_setting_ps[%d].cs_drv_ohm=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].cs_drv_ohm, ddr_set_t_p->cfg_board_SI_setting_ps[ps].cs_drv_ohm);
7563 printf("\n.cfg_board_SI_setting_ps[%d].ac_drv_ohm=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].ac_drv_ohm, ddr_set_t_p->cfg_board_SI_setting_ps[ps].ac_drv_ohm);
7564 printf("\n.cfg_board_SI_setting_ps[%d].soc_data_drv_ohm_p=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].soc_data_drv_ohm_p, ddr_set_t_p->cfg_board_SI_setting_ps[ps].soc_data_drv_ohm_p);
7565 printf("\n.cfg_board_SI_setting_ps[%d].soc_data_drv_ohm_n=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].soc_data_drv_ohm_n, ddr_set_t_p->cfg_board_SI_setting_ps[ps].soc_data_drv_ohm_n);
7566 printf("\n.cfg_board_SI_setting_ps[%d].soc_data_odt_ohm_p=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].soc_data_odt_ohm_p, ddr_set_t_p->cfg_board_SI_setting_ps[ps].soc_data_odt_ohm_p);
7567 printf("\n.cfg_board_SI_setting_ps[%d].soc_data_odt_ohm_n=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].soc_data_odt_ohm_n, ddr_set_t_p->cfg_board_SI_setting_ps[ps].soc_data_odt_ohm_n);
7568 printf("\n.cfg_board_SI_setting_ps[%d].dram_data_drv_ohm=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].dram_data_drv_ohm, ddr_set_t_p->cfg_board_SI_setting_ps[ps].dram_data_drv_ohm);
7569 printf("\n.cfg_board_SI_setting_ps[%d].dram_data_odt_ohm=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].dram_data_odt_ohm, ddr_set_t_p->cfg_board_SI_setting_ps[ps].dram_data_odt_ohm);
7570 printf("\n.cfg_board_SI_setting_ps[%d].dram_data_wr_odt_ohm=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].dram_data_wr_odt_ohm, ddr_set_t_p->cfg_board_SI_setting_ps[ps].dram_data_wr_odt_ohm);
7571 printf("\n.cfg_board_SI_setting_ps[%d].dram_ac_odt_ohm=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].dram_ac_odt_ohm, ddr_set_t_p->cfg_board_SI_setting_ps[ps].dram_ac_odt_ohm);
7572 printf("\n.cfg_board_SI_setting_ps[%d].dram_data_drv_pull_up_calibration_ohm=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].dram_data_drv_pull_up_calibration_ohm, ddr_set_t_p->cfg_board_SI_setting_ps[ps].dram_data_drv_pull_up_calibration_ohm);
7573 printf("\n.cfg_board_SI_setting_ps[%d].lpddr4_dram_vout_voltage_range_setting=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].lpddr4_dram_vout_voltage_range_setting, ddr_set_t_p->cfg_board_SI_setting_ps[ps].lpddr4_dram_vout_voltage_range_setting);
7574 if (p_ddr_base->chip_id >= DDR_MESON_CPU_MAJOR_ID_S4)
7575 printf("\n.cfg_board_SI_setting_ps[%d].dfe_offset=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].dfe_offset, ddr_set_t_p->cfg_board_SI_setting_ps[ps].dfe_offset);
7576
7577 printf("\n.cfg_board_SI_setting_ps[%d].vref_ac_permil =0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].vref_ac_permil, ddr_set_t_p->cfg_board_SI_setting_ps[ps].vref_ac_permil);
7578 printf("\n.cfg_board_SI_setting_ps[%d].vref_soc_data_permil =0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].vref_soc_data_permil, ddr_set_t_p->cfg_board_SI_setting_ps[ps].vref_soc_data_permil);
7579 printf("\n.cfg_board_SI_setting_ps[%d].vref_dram_data_permil=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].vref_dram_data_permil, ddr_set_t_p->cfg_board_SI_setting_ps[ps].vref_dram_data_permil);
7580 printf("\n.cfg_board_SI_setting_ps[%d].max_core_timmming_frequency=0x%08x,// %d", ps, ddr_set_t_p->cfg_board_SI_setting_ps[ps].max_core_timmming_frequency, ddr_set_t_p->cfg_board_SI_setting_ps[ps].max_core_timmming_frequency);
7581 for (temp_count = 0; temp_count < 2; temp_count++)
7582 printf("\n.cfg_board_SI_setting_ps[%d].training_phase_parameter[%d]=0x%08x,// %d", ps, temp_count, ddr_set_t_p->cfg_board_SI_setting_ps[ps].training_phase_parameter[temp_count], (uint32_t)ddr_set_t_p->cfg_board_SI_setting_ps[ps].training_phase_parameter[temp_count]);
7583 for (temp_count = 0; temp_count < 36; temp_count++)
7584 printf("\n.cfg_board_SI_setting_ps[%d].ac_trace_delay_org[%d]=0x%08x,// %d", ps, temp_count, ddr_set_t_p->cfg_board_SI_setting_ps[ps].ac_trace_delay_org[temp_count], (uint32_t)ddr_set_t_p->cfg_board_SI_setting_ps[ps].ac_trace_delay_org[temp_count]);
7585
7586 for (temp_count = 0; temp_count < 36; temp_count++)
7587 printf("\n.cfg_ddr_training_delay_ps[%d].ac_trace_delay[%d]=0x%08x,// %d", ps, temp_count, ddr_set_t_p->cfg_ddr_training_delay_ps[ps].ac_trace_delay[temp_count], ddr_set_t_p->cfg_ddr_training_delay_ps[ps].ac_trace_delay[temp_count]);
7588 for (temp_count = 0; temp_count < 8; temp_count++)
7589 printf("\n.cfg_ddr_training_delay_ps[%d].write_dqs_delay[%d]=0x%08x,// %d", ps, temp_count, ddr_set_t_p->cfg_ddr_training_delay_ps[ps].write_dqs_delay[temp_count], ddr_set_t_p->cfg_ddr_training_delay_ps[ps].write_dqs_delay[temp_count]);
7590 for (temp_count = 0; temp_count < 72; temp_count++)
7591 printf("\n.cfg_ddr_training_delay_ps[%d].write_dq_bit_delay[%d]=0x%08x,// %d", ps, temp_count, ddr_set_t_p->cfg_ddr_training_delay_ps[ps].write_dq_bit_delay[temp_count], ddr_set_t_p->cfg_ddr_training_delay_ps[ps].write_dq_bit_delay[temp_count]);
7592 for (temp_count = 0; temp_count < 8; temp_count++)
7593 printf("\n.cfg_ddr_training_delay_ps[%d].read_dqs_gate_delay[%d]=0x%08x,// %d", ps, temp_count, ddr_set_t_p->cfg_ddr_training_delay_ps[ps].read_dqs_gate_delay[temp_count], ddr_set_t_p->cfg_ddr_training_delay_ps[ps].read_dqs_gate_delay[temp_count]);
7594 for (temp_count = 0; temp_count < 8; temp_count++)
7595 printf("\n.cfg_ddr_training_delay_ps[%d].read_dqs_delay[%d]=0x%08x,// %d", ps, temp_count, ddr_set_t_p->cfg_ddr_training_delay_ps[ps].read_dqs_delay[temp_count], ddr_set_t_p->cfg_ddr_training_delay_ps[ps].read_dqs_delay[temp_count]);
7596 for (temp_count = 0; temp_count < 72; temp_count++)
7597 printf("\n.cfg_ddr_training_delay_ps[%d].read_dq_bit_delay[%d]=0x%08x,// %d", ps, temp_count, ddr_set_t_p->cfg_ddr_training_delay_ps[ps].read_dq_bit_delay[temp_count], ddr_set_t_p->cfg_ddr_training_delay_ps[ps].read_dq_bit_delay[temp_count]);
7598 for (temp_count = 0; temp_count < 44; temp_count++)
7599 printf("\n.cfg_ddr_training_delay_ps[%d].soc_bit_vref[%d]=0x%08x,// %d", ps, temp_count, ddr_set_t_p->cfg_ddr_training_delay_ps[ps].soc_bit_vref[temp_count], ddr_set_t_p->cfg_ddr_training_delay_ps[ps].soc_bit_vref[temp_count]);
7600 for (temp_count = 0; temp_count < 36; temp_count++)
7601 printf("\n.cfg_ddr_training_delay_ps[%d].dram_bit_vref[%d]=0x%08x,// %d", ps, temp_count, ddr_set_t_p->cfg_ddr_training_delay_ps[ps].dram_bit_vref[temp_count], ddr_set_t_p->cfg_ddr_training_delay_ps[ps].dram_bit_vref[temp_count]);
7602 for (temp_count = 0; temp_count < 16; temp_count++)
7603 printf("\n.cfg_ddr_training_delay_ps[%d].reserve_training_parameter[%d]=0x%08x,// %d", ps, temp_count, ddr_set_t_p->cfg_ddr_training_delay_ps[ps].reserve_training_parameter[temp_count], ddr_set_t_p->cfg_ddr_training_delay_ps[ps].reserve_training_parameter[temp_count]);
7604 if (p_ddr_base->chip_id >= DDR_MESON_CPU_MAJOR_ID_S4) {
7605 for (temp_count = 0; temp_count < 44; temp_count++)
7606 printf("\n.cfg_ddr_training_delay_ps[%d].soc_bit_vref_dac1[%d]=0x%08x,// %d", ps, temp_count, ddr_set_t_p->cfg_ddr_training_delay_ps[ps].soc_bit_vref_dac1[temp_count], ddr_set_t_p->cfg_ddr_training_delay_ps[ps].soc_bit_vref_dac1[temp_count]);
7607 }
7608 }
7609
7610 printf("\n},\n");
7611 }
7612 return 1;
7613}
7614
7615#ifdef USE_FOR_UBOOT_2018
7616#include <amlogic/storage.h>
7617extern struct storage_t *current;
7618
7619static int ddr_do_store_ddr_parameter_ops(uint8_t *buffer, uint32_t length)
7620{
7621 char str[1024] = "";
7622
7623 if (!current) {
7624 sprintf(str, "store init");
7625 run_command(str, 0);
7626 }
7627
7628 {
7629 printf("\nstore rsv write ddr-parameter 0x%08x 0x%08x\n", (uint32_t)(uint64_t)buffer, length);
7630 sprintf(str, "store rsv write ddr-parameter 0x%08x 0x%08x\n", (uint32_t)(uint64_t)buffer, length);
7631 run_command(str, 0);
7632 }
7633
7634 return 1;
7635}
7636#else
7637static int ddr_do_store_ddr_parameter_ops(uint8_t *buffer, uint32_t length)
7638{
7639 extern int store_ddr_parameter_write(uint8_t *buffer, uint32_t length);
7640 printf("\nstore ddr_parameter write 0x%08x 0x%08x\n", (uint32_t)(uint64_t)buffer, length);
7641 store_ddr_parameter_write((uint8_t *)buffer, length);
7642
7643
7644 return 1;
7645}
7646#endif
7647
7648
7649int do_ddr_fastboot_config(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
7650{
7651 check_base_address();
7652 int i = 0;
7653 int count = 0;
7654 char *endp;
7655 unsigned int enable_ddr_fast_boot = 0; // 0 pause 1,resume
7656 char *out_sha2;
7657
7658 printf("\nargc== 0x%08x\n", argc);
7659 for (i = 0; i < argc; i++)
7660 printf("\nargv[%d]=%s\n", i, argv[i]);
7661 if (argc == 1) {
7662 printf("\nplease read help\n");
7663 } else if (argc > 1) {
7664 count = 0;
7665 enable_ddr_fast_boot = simple_strtoull_ddr(argv[count + 1], &endp, 0);
7666 if (*argv[count + 1] == 0 || *endp != 0)
7667 enable_ddr_fast_boot = 0;
7668 }
7669 if (!enable_ddr_fast_boot)
7670 return 1;
7671
7672 uint32_t dmc_retraining_ctrl = 0;
7673 dmc_retraining_ctrl = rd_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address));
7674
7675 if ((p_ddr_base->ddr_dmc_lpdd4_retraining_address))
7676 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl & (~(1 << 31)));
7677 ddr_set_t *ddr_set_t_p = NULL;
7678 ddr_set_t_p = (ddr_set_t *)(ddr_set_t_p_array);
7679 uint32_t ddr_set_add = 0;
7680 uint32_t ddr_set_size = 0;
7681 out_sha2 = (char *)ddr_sha.sha2;
7682
7683 ddr_set_t_c2 *ddr_set_t_p_c2 = NULL;
7684 ddr_set_t_p_c2 = (ddr_set_t_c2 *)(ddr_set_t_p_array_c2);
7685
7686 uint32_t write_size = 0;
7687
7688 if ((p_ddr_base->chip_id >= DDR_MESON_CPU_MAJOR_ID_C2 &&
7689 p_ddr_base->chip_id <= DDR_MESON_CPU_MAJOR_ID_T5D) ||
7690 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_S4 ||
7691 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T3 ||
7692 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T5W) {
7693 ddr_set_add = (uint32_t)(uint64_t)(ddr_set_t_p_c2);
7694 ddr_set_size = sizeof(ddr_set_t_c2);
7695 out_sha2 = (char *)ddr_sha_c2.sha2;
7696 do_read_c2_ddr_training_data(1, ddr_set_t_p_c2);
7697 uint32_t loop = 0;
7698 #if 1
7699 //for C2 T5/T5D ddr window fast boot no support dfe vref1
7700 if ((p_ddr_base->chip_id >= DDR_MESON_CPU_MAJOR_ID_C2 &&
7701 p_ddr_base->chip_id <= DDR_MESON_CPU_MAJOR_ID_T5D) ||
7702 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T5W) {
7703 //sizeof(board_phase_setting_ps_t.soc_bit_vref_dac1);
7704 ddr_set_size = sizeof(ddr_set_t_c2) - (44 * 2);
7705 unsigned char *sha_t_chip_id;
7706 sha_t_chip_id = (unsigned char *)((uint64_t)(&(ddr_sha_c2.sha_chip_id)) - (44 * 2));
7707 //update chip id
7708 for (loop = 0; loop < MESON_CPU_CHIP_ID_SIZE; loop++)
7709 sha_t_chip_id[loop] = global_chip_id[loop];
7710 }
7711 #endif
7712
7713 if (enable_ddr_fast_boot == 1)
7714 ddr_set_t_p_c2->cfg_board_common_setting.fast_boot[0] = 0xff;
7715
7716 if (enable_ddr_fast_boot == 2)
7717 ddr_set_t_p_c2->cfg_board_common_setting.fast_boot[0] = 0;
7718 }
7719
7720 //do_read_ddr_training_data(1, ddr_set_t_p);
7721 if (p_ddr_base->chip_id >= DDR_MESON_CPU_MAJOR_ID_G12A &&
7722 p_ddr_base->chip_id <= DDR_MESON_CPU_MAJOR_ID_SC2) {
7723 ddr_set_add = (uint32_t)(uint64_t)(ddr_set_t_p);
7724 ddr_set_size = sizeof(ddr_set_t);
7725 out_sha2 = (char *)ddr_sha.sha2;
7726 dwc_ddrphy_apb_wr(0xd0000, 0x0);
7727 do_read_ddr_training_data(1, ddr_set_t_p);
7728 char dmc_test_worst_window_rx = 0;
7729 char dmc_test_worst_window_tx = 0;
7730
7731 {
7732 dwc_ddrphy_apb_wr((0 << 20) | (0xd << 16) | (0 << 12) | (0x0), 0); // DWC_DDRPHYA_APBONLY0_MicroContMuxSel
7733
7734 dmc_test_worst_window_tx = dwc_ddrphy_apb_rd((0 << 20) | (1 << 16) | (0 << 12) | (0x0c2));
7735 dmc_test_worst_window_rx = dwc_ddrphy_apb_rd((0 << 20) | (1 << 16) | (0 << 12) | (0x0c3));
7736 if (dmc_test_worst_window_tx > 30)
7737 dmc_test_worst_window_tx = 30;
7738 if (dmc_test_worst_window_rx > 30)
7739 dmc_test_worst_window_rx = 30;
7740 ddr_set_t_p->fast_boot[1] = (((dmc_test_worst_window_tx / 2) << 4)) | (((dmc_test_worst_window_rx / 2)));
7741 }
7742 if (enable_ddr_fast_boot == 1)
7743 ddr_set_t_p->fast_boot[0] = 0xff;
7744
7745 if (enable_ddr_fast_boot == 2)
7746 ddr_set_t_p->fast_boot[0] = 0;
7747 }
7748 if (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T7 ||
7749 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_P1) {
7750 ddr_set_add = (uint32_t)(uint64_t)(ddr_set_t_p);
7751 ddr_set_size = sizeof(ddr_set_t);
7752 out_sha2 = (char *)ddr_sha.sha2;
7753 dwc_ddrphy_apb_wr(0xd0000, 0x0);
7754 do_read_ddr_training_data(1, ddr_set_t_p);
7755 char dmc_test_worst_window_rx = 0;
7756 char dmc_test_worst_window_tx = 0;
7757
7758 {
7759 dwc_ddrphy_apb_wr((0 << 20) | (0xd << 16) | (0 << 12) | (0x0), 0); // DWC_DDRPHYA_APBONLY0_MicroContMuxSel
7760
7761 dmc_test_worst_window_tx = dwc_ddrphy_apb_rd((0 << 20) | (1 << 16) | (0 << 12) | (0x0c2));
7762 dmc_test_worst_window_rx = dwc_ddrphy_apb_rd((0 << 20) | (1 << 16) | (0 << 12) | (0x0c3));
7763 if (dmc_test_worst_window_tx > 30)
7764 dmc_test_worst_window_tx = 30;
7765 if (dmc_test_worst_window_rx > 30)
7766 dmc_test_worst_window_rx = 30;
7767 ddr_set_t_p->fast_boot[1] = (((dmc_test_worst_window_tx / 2) << 4)) | (((dmc_test_worst_window_rx / 2)));
7768 }
7769 if (enable_ddr_fast_boot == 1)
7770 ddr_set_t_p->fast_boot[0] = 0xff;
7771
7772 if (enable_ddr_fast_boot == 2)
7773 ddr_set_t_p->fast_boot[0] = 0;
7774 }
7775
7776 write_size = ((ddr_set_size + SHA256_SUM_LEN + MESON_CPU_CHIP_ID_SIZE + 511) / 512) * 512;
7777
7778 {
7779 //printf("&ddr_sha.ddrs : 0x%x\n", (uint32_t)(uint64_t)&ddr_sha.ddrs);
7780 //printf("&ddr_sha.sha2 : 0x%x\n", (uint32_t)(uint64_t)out_sha2);
7781 printf("ddr_set_add : 0x%x sizeof(ddr_set_t):0x%x\n ", (uint32_t)(uint64_t)ddr_set_add, (uint32_t)(uint64_t)ddr_set_size);
7782 printf("ddr_set_add_chip_id : 0x%x\n", (uint32_t)(uint64_t)(ddr_set_add + ddr_set_size));
7783 sha256_csum_wd_internal((unsigned char *)(uint64_t)ddr_set_add, ddr_set_size, (unsigned char *)out_sha2, 0);
7784 printf("print sha\n");
7785 ddr_do_store_ddr_parameter_ops((uint8_t *)(unsigned long)(ddr_set_add - SHA256_SUM_LEN), write_size);
7786 }
7787 return 1;
7788}
7789#endif
7790
7791int do_ddr_set_watchdog_value(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
7792{
7793 char *endp;
7794 int i = 0;
7795
7796 printf("\nargc== 0x%08x\n", argc);
7797 for (i = 0; i < argc; i++)
7798 printf("\nargv[%d]=%s\n", i, argv[i]);
7799
7800 if (argc == 1) {
7801 printf("\nplease read help\n");
7802 } else if (argc > 1) {
7803 {
7804 watchdog_time_s = simple_strtoull_ddr(argv[1], &endp, 0);
7805 if (*argv[1] == 0 || *endp != 0)
7806 watchdog_time_s = 20;
7807 }
7808 printf("watchdog_time_s==%d\n", watchdog_time_s);
7809 }
7810
7811 return 1;
7812}
7813
7814#define G12_DATA_READ_OFFSET_MAX (0X3F)
7815#define G12_DATA_WRITE_OFFSET_MAX (0X3F + 7 * 32)
7816
7817#define DMC_TEST_WINDOW_INDEX_ATXDLY 1
7818#define DMC_TEST_WINDOW_INDEX_TXDQSDLY 2
7819#define DMC_TEST_WINDOW_INDEX_RXCLKDLY 3
7820#define DMC_TEST_WINDOW_INDEX_TXDQDLY 4
7821#define DMC_TEST_WINDOW_INDEX_RXPBDLY 5
7822#define DMC_TEST_WINDOW_INDEX_RXENDLY 6
7823
7824#define DMC_TEST_WINDOW_INDEX_EE_VOLTAGE 0x11
7825#define DMC_TEST_WINDOW_INDEX_SOC_VREF 0x12
7826#define DMC_TEST_WINDOW_INDEX_DRAM_VREF 0x14
7827
7828typedef struct training_delay_information {
7829 uint16_t ac_delay[10];
7830 uint16_t txdqs_delay[16];
7831 uint16_t rxdqs_delay[16];
7832 uint16_t txdq_delay[72];
7833 uint16_t rxdq_delay[72];
7834 uint16_t gate_rxdq_delay[72];
7835} training_delay_t;
7836training_delay_t training_delay_t_p;
7837
7838uint16_t lcd_bdl_value[72][4]; //org min max status
7839#define LCD_BDLR_MIN 0
7840#define LCD_BDLR_MAX 1
7841#define LCD_BDLR_STATUS 2
7842
7843//BYTE0-3
7844#define TEST_ARG_0_DMC_STICKY_MAGIC 0
7845#define TEST_ARG_1_CMD0 1
7846#define TEST_ARG_2_STEP 2 // 0 init 1 test ac 2 test tdqs_write
7847#define TEST_ARG_3_ALL_TIGHTER 3
7848
7849//BYTE4-7
7850#define TEST_ARG_FREQ_NIBBLE_L 4
7851#define TEST_ARG_FREQ_NIBBLE_H 5
7852
7853//BYTE8-11
7854#define TEST_ARG_BOOT_TIMES_L 6
7855#define TEST_ARG_BOOT_TIMES_H 7
7856
7857//BYTE12-15
7858#define TEST_ARG_ERROR_FLAG 8 //take 4 byte for kernel test flag
7859
7860//BYTE16-19
7861#define TEST_ARG_CS0_TEST_START_INDEX 12
7862#define TEST_ARG_CS0_TEST_SIZE_INDEX 16
7863#define TEST_ARG_CS1_TEST_START_INDEX 20
7864#define TEST_ARG_CS1_TEST_SIZE_INDEX 24
7865
7866#define TEST_ARG_WATCHDOG_TIME_SIZE_INDEX 28
7867#define TEST_ARG_TEST_INDEX_ENALBE_INDEX 30
7868
7869#define TEST_ARG_ERROR_FLAG_NULL 0
7870#define TEST_ARG_ERROR_FLAG_FAIL 1
7871#define TEST_ARG_ERROR_FLAG_PASS 2
7872
7873#define TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE 32 // 32BYTE
7874#define TEST_ARG_NIBBLE_WIDTH_BYTE 3 //3///BYTE
7875
7876int do_ddr_test_dqs_window_sticky(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
7877{
7878 printf("\nEnterddr_test_dqs_window function ddr_test_cmd 0x27 0x1080000 0x800000 0x40000000 0x800000 15 0x6 0 0 0 0 0 0 1/config\n");
7879 printf("\nddr_test_cmd 0x27 cs0_test_start cs0_test_size cs1_test_start cs1_test_size ns test_index_enable nibble_mask0 nibble_mask1 nibble_mask2 dram_type channel_mode config_register all_together--- watchdog should >15s\n");
7880 printf("\n ac write_dqs read_dqs can test together test_index_enable can enable kernel test \n");
7881#define DDR_CROSS_TALK_TEST_SIZE 0x20000
7882 unsigned int temp_test_error = 0;
7883 unsigned int nibble_save_offset = 0;
7884 unsigned int nibble_step = 0;
7885 unsigned int nibble_max = 16;
7886 unsigned int test_index_enable = 0;
7887 unsigned int test_index = 0;
7888 unsigned int test_index_max = 6;
7889 unsigned int reg_value = 0;
7890 unsigned int dram_type = 0;
7891 unsigned int channel_mode = 0;
7892 unsigned int kernel_watchdog_s = 20; //240;
7893 unsigned int config_register = 0;
7894 unsigned int all_tighter_enable = 0;
7895 unsigned int error_flag_reg_add = 0;
7896 char *string_print_flag = " uboot-window-loop \n";
7897 char *endp;
7898 char *buf;
7899 buf = "";
7900
7901 unsigned int cs0_test_start = 0x1080000;
7902 unsigned int cs0_test_size = DDR_CROSS_TALK_TEST_SIZE;
7903 unsigned int cs1_test_start = 0;
7904 unsigned int cs1_test_size = 0;
7905 unsigned int enable_kernel_test = 0;
7906 if (argc > 1) {
7907 cs0_test_start = simple_strtoull_ddr(argv[1], &endp, 16);
7908 if (*argv[1] == 0 || *endp != 0)
7909 cs0_test_start = 0x1080000;
7910 }
7911
7912 if (argc > 2) {
7913 cs0_test_size = simple_strtoull_ddr(argv[2], &endp, 16);
7914 if (*argv[2] == 0 || *endp != 0)
7915 cs0_test_size = DDR_CROSS_TALK_TEST_SIZE;
7916 }
7917
7918 if (argc > 3) {
7919 cs1_test_start = simple_strtoull_ddr(argv[3], &endp, 16);
7920 if (*argv[3] == 0 || *endp != 0)
7921 cs1_test_start = 0;
7922 }
7923 if (argc > 4) {
7924 cs1_test_size = simple_strtoull_ddr(argv[4], &endp, 16);
7925 if (*argv[4] == 0 || *endp != 0)
7926 cs1_test_size = 0;
7927 }
7928
7929 unsigned int ddr_test_size = DDR_CROSS_TALK_TEST_SIZE;
7930 ddr_test_size = cs0_test_size;
7931 if (argc > 5) {
7932 watchdog_time_s = simple_strtoull_ddr(argv[5], &endp, 0);
7933 if (*argv[5] == 0 || *endp != 0)
7934 watchdog_time_s = 20;
7935 }
7936 printf("watchdog_time_s==%d\n", watchdog_time_s);
7937
7938 if (argc > 6) {
7939 test_index_enable = simple_strtoull_ddr(argv[6], &endp, 0);
7940 if (*argv[5] == 0 || *endp != 0)
7941 test_index_enable = 0;
7942 }
7943 printf("test_index_enable==0x%08x\n", test_index_enable);
7944 enable_kernel_test = (test_index_enable >> 7) & 1;
7945 if (enable_kernel_test)
7946 printf("enable kernel window test\n");
7947
7948 unsigned int nibble_mask[3] = { 0, 0, 0 };
7949 if (argc > 7) {
7950 nibble_mask[0] = simple_strtoull_ddr(argv[7], &endp, 0);
7951 if (*argv[7] == 0 || *endp != 0)
7952 nibble_mask[0] = 0;
7953 }
7954 printf("nibble_mask[0]==0x%08x\n", nibble_mask[0]);
7955 if (argc > 8) {
7956 nibble_mask[1] = simple_strtoull_ddr(argv[8], &endp, 0);
7957 if (*argv[8] == 0 || *endp != 0)
7958 nibble_mask[1] = 0;
7959 }
7960 printf("nibble_mask[1]==0x%08x\n", nibble_mask[1]);
7961 if (argc > 9) {
7962 nibble_mask[2] = simple_strtoull_ddr(argv[9], &endp, 0);
7963 if (*argv[9] == 0 || *endp != 0)
7964 nibble_mask[2] = 0;
7965 }
7966 printf("nibble_mask[2]==0x%08x\n", nibble_mask[2]);
7967
7968 if (argc > 10) {
7969 dram_type = simple_strtoull_ddr(argv[10], &endp, 0);
7970 if (*argv[10] == 0 || *endp != 0)
7971 dram_type = 0;
7972 }
7973 if (argc > 11) {
7974 channel_mode = simple_strtoull_ddr(argv[11], &endp, 0);
7975 if (*argv[11] == 0 || *endp != 0)
7976 channel_mode = 0;
7977 }
7978 if (argc > 12) {
7979 config_register = simple_strtoull_ddr(argv[12], &endp, 0);
7980 if (*argv[12] == 0 || *endp != 0)
7981 config_register = 0;
7982 }
7983 if (argc > 13) {
7984 all_tighter_enable = simple_strtoull_ddr(argv[13], &endp, 0);
7985 if (*argv[13] == 0 || *endp != 0)
7986 all_tighter_enable = 0;
7987 }
7988 printf("all_tighter_enable==0x%08x\n", all_tighter_enable);
7989
7990 if (argc > 14) {
7991 error_flag_reg_add = simple_strtoull_ddr(argv[14], &endp, 0);
7992 if (*argv[14] == 0 || *endp != 0)
7993 error_flag_reg_add = 0;
7994 }
7995 printf("error_flag_reg_add==0x%08x\n", error_flag_reg_add);
7996 printf("\ntest use uboot sticky register\n");
7997
7998 char str[1024] = "";
7999 volatile uint16_t num_arry[256] = { 0 }; // NULL;
8000 int i;
8001
8002 sticky_reg_base_add = (((p_ddr_base->ddr_dmc_sticky0)) & 0xffff);
8003 for (i = 0; i < 64 * 4; i++) {
8004 num_arry[i] = ddr_rd_8_16bit_on_32reg(sticky_reg_base_add, 8, i);
8005 if ((i == 0) || (i == 32) || (i == (32 + 10 * 3)) || (i == (32 + 10 * 3 + 16 * 3)) || (i == (32 + 10 * 3 + 16 * 3 + 16 * 3)))
8006 printf("\n numarry[%d]", i);
8007 printf(" %d ", num_arry[i]);
8008 }
8009
8010 uint16_t test_left_max_init_value = 32;
8011 uint16_t test_right_max_init_value = 32;
8012 uint16_t test_boot_times = 0;
8013 uint16_t test_ddr_frequency = 0;
8014
8015 printf("\nTEST_ARG_0_DMC_STICKY_MAGIC==0x%08x\n", num_arry[TEST_ARG_0_DMC_STICKY_MAGIC]);
8016 printf("\nTEST_ARG_1_CMD0==0x%08x\n", num_arry[TEST_ARG_1_CMD0]);
8017 printf("TEST_ARG_2_STEP==0x%08x\n", num_arry[TEST_ARG_2_STEP]);
8018 printf("TEST_ARG_3_ALL_TIGHTER==0x%08x\n", num_arry[TEST_ARG_3_ALL_TIGHTER]);
8019 printf("TEST_ARG_FREQ_NIBBLE_L==0x%08x\n", num_arry[TEST_ARG_FREQ_NIBBLE_L]);
8020 printf("TEST_ARG_FREQ_NIBBLE_H==0x%08x\n", num_arry[TEST_ARG_FREQ_NIBBLE_H]);
8021 printf("TEST_ARG_BOOT_TIMES_L==0x%08x\n", num_arry[TEST_ARG_BOOT_TIMES_L]);
8022 printf("TEST_ARG_BOOT_TIMES_H==0x%08x\n", num_arry[TEST_ARG_BOOT_TIMES_H]);
8023 printf("TEST_ARG_ERROR_FLAG==0x%08x\n", num_arry[TEST_ARG_ERROR_FLAG]);
8024
8025 printf("TEST_ARG_FREQ==%dM\n", (num_arry[TEST_ARG_FREQ_NIBBLE_H] << 8) | (num_arry[TEST_ARG_FREQ_NIBBLE_L] << 0));
8026 printf("TEST_ARG_BOOT_TIMES==%d\n", (num_arry[TEST_ARG_BOOT_TIMES_H] << 8) | (num_arry[TEST_ARG_BOOT_TIMES_L] << 0));
8027 test_boot_times = (num_arry[TEST_ARG_BOOT_TIMES_H] << 8) | (num_arry[TEST_ARG_BOOT_TIMES_L] << 0);
8028 test_ddr_frequency = (num_arry[TEST_ARG_FREQ_NIBBLE_H] << 8) | (num_arry[TEST_ARG_FREQ_NIBBLE_L] << 0);
8029
8030 if ((num_arry[TEST_ARG_0_DMC_STICKY_MAGIC] == (DMC_STICKY_UBOOT_WINDOW_MAGIC_1 & 0xff))
8031 && (num_arry[TEST_ARG_1_CMD0] == (DMC_STICKY_UBOOT_WINDOW_MAGIC_1 & 0xff))) { //for check magic number make sume enter test command
8032 test_boot_times++;
8033 num_arry[TEST_ARG_BOOT_TIMES_L] = test_boot_times & 0xff;
8034 num_arry[TEST_ARG_BOOT_TIMES_H] = (test_boot_times >> 8) & 0xff;
8035 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_BOOT_TIMES_L, num_arry[TEST_ARG_BOOT_TIMES_L]);
8036 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_BOOT_TIMES_H, num_arry[TEST_ARG_BOOT_TIMES_H]);
8037
8038 if (test_ddr_frequency != global_ddr_clk) { //
8039 printf("running ddr freq==%d,but test freq is%d,will reboot use d2pll \n", global_ddr_clk, test_ddr_frequency);
8040 sprintf(str, "d2pll %d", test_ddr_frequency);
8041 printf("\nstr=%s\n", str);
8042 run_command(str, 0);
8043
8044 while (1) {
8045 }
8046 }
8047 } else {
8048 test_boot_times = 0;
8049 num_arry[TEST_ARG_BOOT_TIMES_L] = test_boot_times & 0xff;
8050 num_arry[TEST_ARG_BOOT_TIMES_H] = (test_boot_times >> 8) & 0xff;
8051 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_BOOT_TIMES_L, num_arry[TEST_ARG_BOOT_TIMES_L]);
8052 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_BOOT_TIMES_H, num_arry[TEST_ARG_BOOT_TIMES_H]);
8053 num_arry[TEST_ARG_2_STEP] = 0;
8054 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_2_STEP, num_arry[TEST_ARG_2_STEP]);
8055 }
8056 printf("test_sticky is not magic number,boot times==%d\n", test_boot_times);
8057
8058 {
8059 wr_reg((sticky_reg_base_add + TEST_ARG_CS0_TEST_START_INDEX), cs0_test_start);
8060 wr_reg((sticky_reg_base_add + TEST_ARG_CS0_TEST_SIZE_INDEX), cs0_test_size);
8061 wr_reg((sticky_reg_base_add + TEST_ARG_CS1_TEST_START_INDEX), cs1_test_start);
8062 wr_reg((sticky_reg_base_add + TEST_ARG_CS1_TEST_SIZE_INDEX), cs1_test_size);
8063 {
8064 num_arry[TEST_ARG_WATCHDOG_TIME_SIZE_INDEX] = watchdog_time_s & 0xff;
8065 num_arry[TEST_ARG_WATCHDOG_TIME_SIZE_INDEX + 1] = (watchdog_time_s >> 8) & 0xff;
8066 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_WATCHDOG_TIME_SIZE_INDEX, num_arry[TEST_ARG_WATCHDOG_TIME_SIZE_INDEX]);
8067 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, (TEST_ARG_WATCHDOG_TIME_SIZE_INDEX + 1), num_arry[TEST_ARG_WATCHDOG_TIME_SIZE_INDEX + 1]);
8068 }
8069 num_arry[TEST_ARG_TEST_INDEX_ENALBE_INDEX] = test_index_enable;
8070 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_TEST_INDEX_ENALBE_INDEX, num_arry[TEST_ARG_TEST_INDEX_ENALBE_INDEX]);
8071 if (config_register == 1) {
8072 num_arry[TEST_ARG_2_STEP] = 0;
8073 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_2_STEP, num_arry[TEST_ARG_2_STEP]);
8074 }
8075 num_arry[TEST_ARG_3_ALL_TIGHTER] = all_tighter_enable;
8076 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_3_ALL_TIGHTER, num_arry[TEST_ARG_3_ALL_TIGHTER]);
8077 }
8078
8079 if ((num_arry[TEST_ARG_2_STEP]) == 0) {
8080 {
8081 num_arry[TEST_ARG_0_DMC_STICKY_MAGIC] = DMC_STICKY_UBOOT_WINDOW_MAGIC_1;
8082 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_0_DMC_STICKY_MAGIC, num_arry[TEST_ARG_0_DMC_STICKY_MAGIC]);
8083 num_arry[TEST_ARG_1_CMD0] = DMC_STICKY_UBOOT_WINDOW_MAGIC_1;
8084 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_1_CMD0, num_arry[TEST_ARG_1_CMD0]);
8085 num_arry[TEST_ARG_2_STEP] = 1;
8086 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_2_STEP, num_arry[TEST_ARG_2_STEP]);
8087 {
8088 test_boot_times = 0;
8089 num_arry[TEST_ARG_BOOT_TIMES_L] = test_boot_times & 0xff;
8090 num_arry[TEST_ARG_BOOT_TIMES_H] = (test_boot_times >> 8) & 0xff;
8091 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_BOOT_TIMES_L, num_arry[TEST_ARG_BOOT_TIMES_L]);
8092 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_BOOT_TIMES_H, num_arry[TEST_ARG_BOOT_TIMES_H]);
8093 }
8094 {
8095 test_ddr_frequency = global_ddr_clk;
8096 num_arry[TEST_ARG_FREQ_NIBBLE_L] = test_ddr_frequency & 0xff;
8097 num_arry[TEST_ARG_FREQ_NIBBLE_H] = (test_ddr_frequency >> 8) & 0xff;
8098 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_FREQ_NIBBLE_L, num_arry[TEST_ARG_FREQ_NIBBLE_L]);
8099 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_FREQ_NIBBLE_H, num_arry[TEST_ARG_FREQ_NIBBLE_H]);
8100 }
8101
8102 num_arry[TEST_ARG_ERROR_FLAG] = TEST_ARG_ERROR_FLAG_NULL;
8103 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_ERROR_FLAG, num_arry[TEST_ARG_ERROR_FLAG]);
8104 }
8105
8106
8107 for (nibble_step = 0; nibble_step < 72; nibble_step++) {
8108 {
8109 test_left_max_init_value = 16;
8110 test_right_max_init_value = 16;
8111 if (nibble_step < 10) {
8112 test_left_max_init_value = 32;
8113 test_right_max_init_value = 32;
8114 }
8115 num_arry[TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + (nibble_step * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN] = test_left_max_init_value;
8116 num_arry[TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + (nibble_step * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX] = test_right_max_init_value;
8117 num_arry[TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + (nibble_step * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS] = 0; //0
8118 }
8119
8120 {
8121 if (nibble_step < 32) {
8122 if (((nibble_mask[0]) >> nibble_step) & 1)
8123 num_arry[TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + nibble_step * TEST_ARG_NIBBLE_WIDTH_BYTE + LCD_BDLR_STATUS] = 4;
8124 } else if (nibble_step < 64) {
8125 if (((nibble_mask[1]) >> (nibble_step - 32)) & 1)
8126 num_arry[TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + nibble_step * TEST_ARG_NIBBLE_WIDTH_BYTE + LCD_BDLR_STATUS] = 4;
8127 } else if (nibble_step < 96) {
8128 if (((nibble_mask[2]) >> (nibble_step - 64)) & 1)
8129 num_arry[TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + nibble_step * TEST_ARG_NIBBLE_WIDTH_BYTE + LCD_BDLR_STATUS] = 4;
8130 }
8131 if (all_tighter_enable) {
8132 if ((nibble_step == 0) || (nibble_step == 10) || (nibble_step == (10 + 16)))
8133 num_arry[TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + nibble_step * TEST_ARG_NIBBLE_WIDTH_BYTE + LCD_BDLR_STATUS] = 0;
8134 else
8135 num_arry[TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + nibble_step * TEST_ARG_NIBBLE_WIDTH_BYTE + LCD_BDLR_STATUS] = 4;
8136 }
8137 }
8138 }
8139
8140 {
8141 for (i = TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE; i < 72 * TEST_ARG_NIBBLE_WIDTH_BYTE; i++)
8142 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, i, num_arry[i]);
8143
8144 num_arry[TEST_ARG_2_STEP] = 1;
8145 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_2_STEP, num_arry[TEST_ARG_2_STEP]);
8146 }
8147 }
8148
8149 if (all_tighter_enable) {
8150 for (nibble_step = 0; nibble_step < 72; nibble_step++) {
8151 if ((nibble_step == 0) || (nibble_step == 10) || (nibble_step == (10 + 16))) {
8152 } else {
8153 num_arry[TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + nibble_step * TEST_ARG_NIBBLE_WIDTH_BYTE + LCD_BDLR_STATUS] = 4;
8154 }
8155 }
8156 }
8157
8158 if (config_register == 1) {
8159 num_arry[TEST_ARG_2_STEP] = 0;
8160 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_2_STEP, num_arry[TEST_ARG_2_STEP]);
8161 }
8162
8163 if ((num_arry[TEST_ARG_2_STEP])) {
8164 for (test_index = num_arry[TEST_ARG_2_STEP]; test_index < test_index_max; test_index++) {
8165 printf("\ntest_index=%d\n", test_index);
8166 if ((((test_index_enable) >> (test_index - 1)) & 1) == 0) {
8167 num_arry[TEST_ARG_2_STEP] = ((num_arry[TEST_ARG_2_STEP]) + 1); //why can not use ++
8168 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_2_STEP, num_arry[TEST_ARG_2_STEP]);
8169 continue;
8170 }
8171 {
8172 if (test_index == DMC_TEST_WINDOW_INDEX_ATXDLY) {
8173 nibble_save_offset = 0;
8174 nibble_max = 10;
8175 nibble_mask[0] = 0x30;
8176 if ((dram_type == CONFIG_DDR_TYPE_LPDDR3))
8177 nibble_mask[0] = 0x3e3;
8178 if ((dram_type == CONFIG_DDR_TYPE_LPDDR4)) {
8179 nibble_mask[0] = 0x273;
8180 if ((channel_mode == CONFIG_DDR0_32BIT_RANK01_CH0))
8181 nibble_mask[0] = 0x3f3;
8182 }
8183 test_left_max_init_value = 64;
8184 test_right_max_init_value = 64;
8185 }
8186 if (test_index == DMC_TEST_WINDOW_INDEX_TXDQSDLY) {
8187 nibble_save_offset = 10;
8188 nibble_max = 16;
8189 if ((cs1_test_size == 0))
8190 nibble_mask[0] = 0xff00;
8191 test_left_max_init_value = 16;
8192 test_right_max_init_value = 16;
8193 }
8194 if (test_index == DMC_TEST_WINDOW_INDEX_RXCLKDLY) {
8195 nibble_save_offset = (10) + (16);
8196 if ((cs1_test_size == 0))
8197 nibble_mask[0] = 0xff00;
8198 nibble_max = 16;
8199 test_left_max_init_value = 16;
8200 test_right_max_init_value = 16;
8201 }
8202 if (test_index == DMC_TEST_WINDOW_INDEX_TXDQDLY) {
8203 nibble_save_offset = 0;
8204 nibble_max = 72;
8205 if ((cs1_test_size == 0)) {
8206 nibble_mask[1] = 0xfffffff0;
8207 nibble_mask[2] = 0xffffffff;
8208 }
8209 test_left_max_init_value = 16;
8210 test_right_max_init_value = 16;
8211 }
8212 if (test_index == DMC_TEST_WINDOW_INDEX_RXPBDLY) {
8213 nibble_save_offset = 0;
8214 nibble_max = 72;
8215 if ((cs1_test_size == 0)) {
8216 nibble_mask[1] = 0xfffffff0;
8217 nibble_mask[2] = 0xffffffff;
8218 }
8219
8220 test_left_max_init_value = 64;
8221 test_right_max_init_value = 64;
8222 }
8223 for ((nibble_step = 0); (nibble_step < nibble_max); (nibble_step++)) {
8224 if (nibble_step < 32) {
8225 if (((nibble_mask[0]) >> nibble_step) & 1)
8226 num_arry[TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + (nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE + LCD_BDLR_STATUS] = 4;
8227 } else if (nibble_step < 64) {
8228 if (((nibble_mask[1]) >> (nibble_step - 32)) & 1)
8229 num_arry[TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + (nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE + LCD_BDLR_STATUS] = 4;
8230 } else if (nibble_step < 96) {
8231 if (((nibble_mask[2]) >> (nibble_step - 64)) & 1)
8232 num_arry[TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + (nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE + LCD_BDLR_STATUS] = 4;
8233 }
8234 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8235 (TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS),
8236 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)]);
8237 }
8238 }
8239
8240 {
8241 for ((nibble_step = 0); (nibble_step < nibble_max); (nibble_step++)) {
8242 if (num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] == 4)
8243 continue;
8244 printf("nibble_step ==%d\n", nibble_step);
8245
8246 if (test_index == DMC_TEST_WINDOW_INDEX_TXDQSDLY) {
8247 if (nibble_step % 2) {
8248 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8249 (TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN),
8250 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step - 1 + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN)]);
8251 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8252 (TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX),
8253 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step - 1 + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX)]);
8254 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8255 (TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS),
8256 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step - 1 + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)]);
8257 continue;
8258 }
8259 }
8260 test_start_addr = cs0_test_start;
8261 ddr_test_size = cs0_test_size;
8262 if (test_index == DMC_TEST_WINDOW_INDEX_ATXDLY) {
8263 test_start_addr = cs0_test_start;
8264 ddr_test_size = cs0_test_size;
8265 }
8266
8267 if (test_index == DMC_TEST_WINDOW_INDEX_TXDQSDLY) {
8268 if (nibble_step > 7) {
8269 test_start_addr = cs1_test_start;
8270 ddr_test_size = cs1_test_size;
8271 }
8272 }
8273 if (test_index == DMC_TEST_WINDOW_INDEX_RXCLKDLY) {
8274 if (nibble_step > 7) {
8275 test_start_addr = cs1_test_start;
8276 ddr_test_size = cs1_test_size;
8277 }
8278 }
8279 if (test_index == DMC_TEST_WINDOW_INDEX_TXDQDLY) {
8280 if (nibble_step > 35) {
8281 test_start_addr = cs1_test_start;
8282 ddr_test_size = cs1_test_size;
8283 }
8284 }
8285 if (test_index == DMC_TEST_WINDOW_INDEX_RXPBDLY) {
8286 if (nibble_step > 35) {
8287 test_start_addr = cs1_test_start;
8288 ddr_test_size = cs1_test_size;
8289 }
8290 }
8291 {
8292 if (nibble_step < 32) {
8293 nibble_mask[0] = ((0xffffffff) & (~(1 << nibble_step)));
8294 nibble_mask[1] = ((0xffffffff));
8295 nibble_mask[2] = ((0xffffffff));
8296 } else if (nibble_step < 64) {
8297 nibble_mask[0] = ((0xffffffff));
8298 nibble_mask[1] = ((0xffffffff) & (~(1 << (nibble_step - 32))));
8299 nibble_mask[2] = ((0xffffffff));
8300 } else if (nibble_step < 96) {
8301 nibble_mask[0] = ((0xffffffff));
8302 nibble_mask[1] = ((0xffffffff));
8303 nibble_mask[2] = ((0xffffffff) & (~(1 << (nibble_step - 64))));
8304 }
8305 }
8306 if (all_tighter_enable) {
8307 if (test_index == DMC_TEST_WINDOW_INDEX_ATXDLY) {
8308 nibble_save_offset = 0;
8309 nibble_max = 10;
8310 nibble_mask[0] = 0x30;
8311 nibble_mask[1] = 0;
8312 nibble_mask[2] = 0;
8313 if ((dram_type == CONFIG_DDR_TYPE_LPDDR3))
8314 nibble_mask[0] = 0x3e3;
8315 if ((dram_type == CONFIG_DDR_TYPE_LPDDR4)) {
8316 nibble_mask[0] = 0x273;
8317 if ((channel_mode == CONFIG_DDR0_32BIT_RANK01_CH0))
8318 nibble_mask[0] = 0x3f3;
8319 }
8320 } else {
8321 nibble_mask[0] = 0;
8322 nibble_mask[1] = 0;
8323 nibble_mask[2] = 0;
8324 }
8325 }
8326
8327 ddr_test_watchdog_enable(watchdog_time_s); //s
8328 printf("\nenable %ds watchdog \n", watchdog_time_s);
8329 if ((num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] == 0xffff)
8330 || (num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] == 0)
8331 || (num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] == 1)) {
8332 printf("\nnibble_step ==%d ", nibble_step);
8333 if ((num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] == 0xffff)
8334 || (num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] == 0)) {
8335 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] = 1;
8336 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8337 (TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS),
8338 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)]);
8339
8340 if (num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN)] == 0) {
8341 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] = 2;
8342 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8343 (TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS),
8344 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)]);
8345 run_command("reset", 0);
8346 }
8347 {
8348 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN)] =
8349 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN)] - 1;
8350 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8351 (TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN),
8352 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN)]);
8353 }
8354
8355 {
8356 num_arry[TEST_ARG_ERROR_FLAG] = TEST_ARG_ERROR_FLAG_FAIL;
8357 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8358 TEST_ARG_ERROR_FLAG,
8359 num_arry[TEST_ARG_ERROR_FLAG]);
8360 }
8361
8362 sprintf(str, "ddr_g12_offset_data %d 0x%08x 0x%08x 0x%08x %d %d", test_index, nibble_mask[0], nibble_mask[1], nibble_mask[2], DDR_PARAMETER_LEFT,
8363 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN)]);
8364 printf("\nstr=%s\n", str);
8365 ddr_test_watchdog_clear();
8366 run_command(str, 0);
8367
8368 temp_test_error = ddr_test_s_cross_talk_pattern(ddr_test_size);
8369 if (all_tighter_enable && cs1_test_size) {
8370 test_start_addr = cs1_test_start;
8371 ddr_test_size = cs1_test_size;
8372 temp_test_error = temp_test_error + ddr_test_s_cross_talk_pattern(ddr_test_size);
8373 test_start_addr = cs0_test_start;
8374 ddr_test_size = cs0_test_size;
8375 }
8376 if (temp_test_error) {
8377 run_command("reset", 0);
8378 } else {
8379 if (!enable_kernel_test) {
8380 num_arry[TEST_ARG_ERROR_FLAG] = TEST_ARG_ERROR_FLAG_PASS;
8381 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8382 TEST_ARG_ERROR_FLAG,
8383 num_arry[TEST_ARG_ERROR_FLAG]);
8384 run_command("reset", 0);
8385 } else {
8386 ddr_test_watchdog_enable(kernel_watchdog_s); //s
8387 printf("\nenable %ds watchdog \n", kernel_watchdog_s);
8388 run_command("run storeboot", 0);
8389 }
8390 }
8391 } else if (num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] == 1) { //go on find left edge
8392 if (num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN)] == 0) {
8393 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] = 2;
8394 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8395 (TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS),
8396 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)]);
8397 run_command("reset", 0);
8398 }
8399
8400 if ((num_arry[TEST_ARG_ERROR_FLAG]) == TEST_ARG_ERROR_FLAG_PASS) {
8401 {
8402 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] = 2;
8403 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8404 (TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS),
8405 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)]);
8406 }
8407 {
8408 num_arry[TEST_ARG_ERROR_FLAG] = TEST_ARG_ERROR_FLAG_NULL;
8409 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8410 TEST_ARG_ERROR_FLAG,
8411 num_arry[TEST_ARG_ERROR_FLAG]);
8412 }
8413 run_command("reset", 0);
8414 }
8415 if ((num_arry[TEST_ARG_ERROR_FLAG]) == TEST_ARG_ERROR_FLAG_FAIL) {
8416 {
8417 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN)] =
8418 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN)] - 1;
8419 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8420 (TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN),
8421 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN)]);
8422 }
8423 {
8424 num_arry[TEST_ARG_ERROR_FLAG] = TEST_ARG_ERROR_FLAG_FAIL;
8425 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8426 TEST_ARG_ERROR_FLAG,
8427 num_arry[TEST_ARG_ERROR_FLAG]);
8428 }
8429 sprintf(buf, "0x%08x", (num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN)]));
8430 printf("%s", buf);
8431 sprintf(str, "ddr_g12_offset_data %d 0x%08x 0x%08x 0x%08x %d %d", test_index, nibble_mask[0], nibble_mask[1], nibble_mask[2], DDR_PARAMETER_LEFT,
8432 (num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN)]));
8433 printf("\nstr=%s\n", str);
8434 ddr_test_watchdog_clear();
8435 run_command(str, 0);
8436 temp_test_error = ddr_test_s_cross_talk_pattern(ddr_test_size);
8437 if (all_tighter_enable && cs1_test_size) {
8438 test_start_addr = cs1_test_start;
8439 ddr_test_size = cs1_test_size;
8440 temp_test_error = temp_test_error + ddr_test_s_cross_talk_pattern(ddr_test_size);
8441 test_start_addr = cs0_test_start;
8442 ddr_test_size = cs0_test_size;
8443 }
8444 if (temp_test_error) {
8445 run_command("reset", 0);
8446 } else {
8447 if (!enable_kernel_test) {
8448 num_arry[TEST_ARG_ERROR_FLAG] = TEST_ARG_ERROR_FLAG_PASS;
8449 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8450 TEST_ARG_ERROR_FLAG,
8451 num_arry[TEST_ARG_ERROR_FLAG]);
8452 run_command("reset", 0);
8453 } else {
8454 ddr_test_watchdog_enable(kernel_watchdog_s); //s
8455 printf("\nenable %ds watchdog \n", kernel_watchdog_s);
8456 run_command("run storeboot", 0);
8457 }
8458 }
8459 }
8460 }
8461 }
8462
8463 if ((num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] == 2)
8464 || (num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] == 3)) {
8465 printf("\nnibble_step ==%d ", nibble_step);
8466
8467 if ((num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] == 2)
8468 || (num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] == 2)) {
8469 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] = 3;
8470 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8471 (TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS),
8472 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)]);
8473
8474 if (num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX)] == 0) {
8475 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] = 4;
8476 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8477 (TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS),
8478 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)]);
8479 run_command("reset", 0);
8480 }
8481 {
8482 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX)] =
8483 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX)] - 1;
8484 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8485 (TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX),
8486 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX)]);
8487 }
8488
8489 {
8490 num_arry[TEST_ARG_ERROR_FLAG] = TEST_ARG_ERROR_FLAG_FAIL;
8491 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8492 TEST_ARG_ERROR_FLAG,
8493 num_arry[TEST_ARG_ERROR_FLAG]);
8494 }
8495 sprintf(str, "ddr_g12_offset_data %d 0x%08x 0x%08x 0x%08x %d %d", test_index, nibble_mask[0], nibble_mask[1], nibble_mask[2], DDR_PARAMETER_RIGHT,
8496 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX)]);
8497 printf("\nstr=%s\n", str);
8498 ddr_test_watchdog_clear();
8499 run_command(str, 0);
8500 temp_test_error = ddr_test_s_cross_talk_pattern(ddr_test_size);
8501 if (all_tighter_enable && cs1_test_size) {
8502 test_start_addr = cs1_test_start;
8503 ddr_test_size = cs1_test_size;
8504 temp_test_error = temp_test_error + ddr_test_s_cross_talk_pattern(ddr_test_size);
8505 test_start_addr = cs0_test_start;
8506 ddr_test_size = cs0_test_size;
8507 }
8508 if (temp_test_error) {
8509 run_command("reset", 0);
8510 } else {
8511 if (!enable_kernel_test) {
8512 num_arry[TEST_ARG_ERROR_FLAG] = TEST_ARG_ERROR_FLAG_PASS;
8513 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8514 TEST_ARG_ERROR_FLAG,
8515 num_arry[TEST_ARG_ERROR_FLAG]);
8516 run_command("reset", 0);
8517 } else {
8518 ddr_test_watchdog_enable(kernel_watchdog_s); //s
8519 printf("\nenable %ds watchdog \n", kernel_watchdog_s);
8520 run_command("run storeboot", 0);
8521 }
8522 }
8523 } else if (num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] == 3) { //go on find left edge
8524 if (num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX)] == 0) {
8525 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] = 4;
8526 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8527 (TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS),
8528 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)]);
8529 run_command("reset", 0);
8530 }
8531
8532 if ((num_arry[TEST_ARG_ERROR_FLAG]) == TEST_ARG_ERROR_FLAG_PASS) {
8533 {
8534 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)] = 4;
8535 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8536 (TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS),
8537 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_STATUS)]);
8538 }
8539 {
8540 num_arry[TEST_ARG_ERROR_FLAG] = TEST_ARG_ERROR_FLAG_NULL;
8541 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8542 TEST_ARG_ERROR_FLAG,
8543 num_arry[TEST_ARG_ERROR_FLAG]);
8544 }
8545 run_command("reset", 0);
8546 }
8547 if ((num_arry[TEST_ARG_ERROR_FLAG]) == TEST_ARG_ERROR_FLAG_FAIL) {
8548 {
8549 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX)] =
8550 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX)] - 1;
8551 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8552 (TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX),
8553 num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX)]);
8554 }
8555 {
8556 num_arry[TEST_ARG_ERROR_FLAG] = TEST_ARG_ERROR_FLAG_FAIL;
8557 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8558 TEST_ARG_ERROR_FLAG,
8559 num_arry[TEST_ARG_ERROR_FLAG]);
8560 }
8561 sprintf(buf, "0x%08x", (num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX)]));
8562 printf("%s", buf);
8563 sprintf(str, "ddr_g12_offset_data %d 0x%08x 0x%08x 0x%08x %d %d", test_index, nibble_mask[0], nibble_mask[1], nibble_mask[2], DDR_PARAMETER_RIGHT,
8564 (num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX)]));
8565 printf("\nstr=%s\n", str);
8566 ddr_test_watchdog_clear();
8567 run_command(str, 0);
8568 temp_test_error = ddr_test_s_cross_talk_pattern(ddr_test_size);
8569 if (all_tighter_enable && cs1_test_size) {
8570 test_start_addr = cs1_test_start;
8571 ddr_test_size = cs1_test_size;
8572 temp_test_error = temp_test_error + ddr_test_s_cross_talk_pattern(ddr_test_size);
8573 test_start_addr = cs0_test_start;
8574 ddr_test_size = cs0_test_size;
8575 }
8576 if (temp_test_error) {
8577 run_command("reset", 0);
8578 } else {
8579 if (!enable_kernel_test) {
8580 num_arry[TEST_ARG_ERROR_FLAG] = TEST_ARG_ERROR_FLAG_PASS;
8581 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8,
8582 TEST_ARG_ERROR_FLAG,
8583 num_arry[TEST_ARG_ERROR_FLAG]);
8584 run_command("reset", 0);
8585 } else {
8586 ddr_test_watchdog_enable(kernel_watchdog_s); //s
8587 printf("\nenable %ds watchdog \n", kernel_watchdog_s);
8588 run_command("run storeboot", 0);
8589 }
8590 }
8591 }
8592 }
8593 }
8594
8595 ddr_test_watchdog_disable(); //s
8596 {
8597 printf("close watchdog\n");
8598 }
8599 }
8600
8601 printf("11num_arry[TEST_ARG_2_STEP]==%d\n", num_arry[TEST_ARG_2_STEP]);
8602 num_arry[TEST_ARG_2_STEP] = (num_arry[TEST_ARG_2_STEP]) + 1;
8603 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_2_STEP, num_arry[TEST_ARG_2_STEP]);
8604 printf("22num_arry[TEST_ARG_2_STEP]==%d\n", num_arry[TEST_ARG_2_STEP]);
8605
8606 ddr_test_watchdog_disable(); //s
8607 printf("close watchdog\n");
8608 {
8609 unsigned int ui_1_32_100step = 0;
8610 unsigned int bdlr_100step = 0;
8611 ui_1_32_100step = (1000000 * 100 / (global_ddr_clk * 2 * 32));
8612 bdlr_100step = get_bdlr_100step(global_ddr_clk);
8613
8614 printf("\nacmdlr=0x%08x-->dec %d,ddr clk==%d,bdlr_100step=%d ps,ui_1_32_100step=%d ps,\n", 0, 0, global_ddr_clk,
8615 bdlr_100step, ui_1_32_100step);
8616
8617 printf("\n test result index==");
8618 printf("%08d", test_index);
8619
8620 if (test_index == DMC_TEST_WINDOW_INDEX_ATXDLY) {
8621 printf(" ac window:");
8622 printf(" step_size ps==");
8623 printf("%08d", ui_1_32_100step);
8624 printf("/100 ps ");
8625 }
8626 if (test_index == DMC_TEST_WINDOW_INDEX_TXDQSDLY) {
8627 printf(" txdqs window:");
8628 printf(" step_size ps==");
8629 printf("%08d", ui_1_32_100step);
8630 printf("/100 ps ");
8631 }
8632 if (test_index == DMC_TEST_WINDOW_INDEX_RXCLKDLY) {
8633 printf(" rx_clk_window:");
8634 printf(" step_size ps==");
8635 printf("%08d", ui_1_32_100step);
8636 printf("/100 ps ");
8637 }
8638 if (test_index == DMC_TEST_WINDOW_INDEX_TXDQDLY) {
8639 printf(" tx_bit_dq_window:");
8640 printf(" step_size ps==");
8641 printf("%08d", ui_1_32_100step);
8642 printf("/100 ps ");
8643 }
8644 if (test_index == DMC_TEST_WINDOW_INDEX_RXPBDLY) {
8645 printf(" rx_bit_dq_window");
8646 printf(" step_size ps==");
8647 printf("%08d", bdlr_100step); //480ps
8648 printf("/100 ps ");
8649 }
8650 printf("ddr clk frequency : ");
8651 printf("%08d", (global_ddr_clk));
8652 printf("Mhz ");
8653 printf(string_print_flag);
8654 printf("index org min max left right dec vref_range vref_count");
8655 printf(string_print_flag);
8656
8657 char delay_left_margin = 0;
8658 char delay_right_margin = 0;
8659 if (all_tighter_enable == 1)
8660 nibble_max = 1;
8661 for (nibble_step = 0; nibble_step < nibble_max; nibble_step++) {
8662 printf("%08d", nibble_step);
8663 printf(" ");
8664 printf("%08d", 0);
8665 {
8666 printf(" ");
8667 printf("%08d", 0 //num_arry[TEST_ARG_NIBBLE_SAVE_OFFSET+nibble_step*TEST_ARG_NIBBLE_WIDTH+LCD_BDLR_MIN]
8668 );
8669 }
8670 {
8671 printf(" ");
8672 printf("%08d", 0 //num_arry[TEST_ARG_NIBBLE_SAVE_OFFSET+nibble_step*TEST_ARG_NIBBLE_WIDTH+LCD_BDLR_MAX]
8673 );
8674 }
8675
8676 delay_left_margin = num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MIN)];
8677 delay_right_margin = num_arry[(TEST_ARG_NIBBLE_SAVE_OFFSET_BYTE + ((nibble_step + nibble_save_offset) * TEST_ARG_NIBBLE_WIDTH_BYTE) + LCD_BDLR_MAX)];
8678 printf(" ");
8679 printf("%08d", delay_left_margin);
8680
8681 printf(" ");
8682 printf("%08d", delay_right_margin);
8683 printf(" ");
8684 printf("%08d", 0);
8685 printf(" ");
8686 printf("%08d", 0);
8687 printf(" 2d-eye"); //p_dev->cur_type
8688 printf(" dramtype ");
8689 printf("%08d", 0);
8690 printf(" ");
8691 printf("%08d", (global_ddr_clk));
8692 printf(" M bdl ");
8693 printf("%08d", bdlr_100step); //480ps
8694 printf(" /100 ps ");
8695 printf("1/32step== ");
8696 printf("%08d", ui_1_32_100step);
8697 printf(" /100 ps ");
8698 printf(string_print_flag);
8699 }
8700 }
8701 }
8702 }
8703 }
8704
8705 if (config_register == 1) {
8706 if (num_arry[TEST_ARG_2_STEP] == 0) {
8707 num_arry[TEST_ARG_2_STEP] = 1;
8708 ddr_wr_8_16bit_on_32reg(sticky_reg_base_add, 8, TEST_ARG_2_STEP, num_arry[TEST_ARG_2_STEP]);
8709 }
8710 }
8711
8712 if ((enable_kernel_test) && (num_arry[TEST_ARG_2_STEP] > 1))
8713 run_command("run storeboot", 0);
8714 return reg_value;
8715}
8716
8717#define ACX_MAX 0x80
8718
8719#if (CONFIG_DDR_PHY >= P_DDR_PHY_G12)
8720#define G12_DATA_READ_OFFSET_MAX (0X3F)
8721#define G12_DATA_WRITE_OFFSET_MAX (0X3F + 7 * 32)
8722
8723#define DMC_TEST_WINDOW_INDEX_ATXDLY 1
8724#define DMC_TEST_WINDOW_INDEX_TXDQSDLY 2
8725#define DMC_TEST_WINDOW_INDEX_RXCLKDLY 3
8726#define DMC_TEST_WINDOW_INDEX_TXDQDLY 4
8727#define DMC_TEST_WINDOW_INDEX_RXPBDLY 5
8728#define DMC_TEST_WINDOW_INDEX_RXENDLY 6
8729
8730#define DMC_TEST_WINDOW_INDEX_EE_VOLTAGE 0x11
8731#define DMC_TEST_WINDOW_INDEX_SOC_VREF 0x12
8732#define DMC_TEST_WINDOW_INDEX_DRAM_VREF 0x14
8733
8734uint32_t ddr_cacl_phy_delay_all_step(char test_index, uint32_t value)
8735{
8736 uint32_t result = 0;
8737
8738 if (test_index == DMC_TEST_WINDOW_INDEX_ATXDLY)
8739 result = (32 * (((value >> 6) & 1) + ((value >> 5) & 1))) + (value & 0x1f);
8740 //use for txdqdly register ,because of this register bit 5 is no use jiaxing 20180814
8741 else if ((test_index == DMC_TEST_WINDOW_INDEX_TXDQDLY) || (test_index == DMC_TEST_WINDOW_INDEX_TXDQSDLY))
8742 result = (32 * (((value >> 6) & 7))) + (value & 0x3f);
8743 else //other register bit5 is effect ,but can not modify coarse delay why ? jiaxing 20180814
8744 result = value & 0x3f;
8745 if (test_index >= DMC_TEST_WINDOW_INDEX_EE_VOLTAGE)
8746 result = value;
8747 return result;
8748}
8749
8750uint32_t ddr_cacl_phy_over_ride_back_reg(char test_index, uint32_t value)
8751{
8752 uint32_t result = 0;
8753
8754 if ((test_index == DMC_TEST_WINDOW_INDEX_ATXDLY)) {
8755 if (value < 64)
8756 result = ((value / 32) << 6) + value % 32;
8757 else
8758 result = (3 << 5) + (value % 32);
8759 } else if ((test_index == DMC_TEST_WINDOW_INDEX_TXDQDLY)
8760 || (test_index == DMC_TEST_WINDOW_INDEX_RXCLKDLY)
8761 || (test_index == DMC_TEST_WINDOW_INDEX_RXENDLY)) {
8762 result = value % 64;
8763 if ((test_index == DMC_TEST_WINDOW_INDEX_TXDQDLY) || (test_index == DMC_TEST_WINDOW_INDEX_RXENDLY)) //use for txdqdly register ,because of this register bit 5 is no use jiaxing 20180814
8764 result = ((value / 32) << 6) + value % 32;
8765 } else if (test_index == DMC_TEST_WINDOW_INDEX_RXPBDLY) {
8766 result = value & 0x3f;
8767 } else if (test_index == DMC_TEST_WINDOW_INDEX_TXDQSDLY) {
8768 result = ((value / 32) << 6) + value % 32;
8769 } else if (test_index > DMC_TEST_WINDOW_INDEX_RXPBDLY) {
8770 result = value;
8771 }
8772
8773 return result;
8774}
8775
8776unsigned int do_ddr_g12_read_write_ddr_add_window_lcdlr(unsigned int rank_index, unsigned int add_index, unsigned int lcdlr_value, unsigned int read_write_flag)
8777{
8778 dwc_ddrphy_apb_wr(0xd0000, 0); //mw fe1a0000 0
8779 if (read_write_flag == DDR_PARAMETER_READ)
8780 lcdlr_value = dwc_ddrphy_apb_rd((0 << 20) | (0 << 16) | (add_index << 12) | (0x80));
8781 if (read_write_flag == DDR_PARAMETER_WRITE)
8782 dwc_ddrphy_apb_wr(((0 << 20) | (0 << 16) | (add_index << 12) | (0x80)), lcdlr_value);
8783
8784 printf("rank_index %d add_index %d lcdlr== %d \n", rank_index, add_index, lcdlr_value);
8785 return lcdlr_value;
8786}
8787
8788void dwc_window_reg_after_training_update_increas_dq(char over_ride_index, uint32_t over_ride_sub_index, uint32_t over_ride_increase_decrease,
8789 uint32_t step_value)
8790{
8791 uint32_t delay_old_value = 0;
8792 uint32_t delay_reg_value = 0;
8793
8794 uint64_t reg_add = 0;
8795
8796 if (!over_ride_index)
8797 return;
8798
8799 if (over_ride_index == DMC_TEST_WINDOW_INDEX_TXDQDLY) {
8800 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 36) / 9) << 12) | (0xc0 + ((over_ride_sub_index % 9) << 8) + (over_ride_sub_index / 36)));
8801 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
8802 delay_reg_value = ddr_cacl_phy_delay_all_step(over_ride_index, delay_old_value);
8803 if (over_ride_increase_decrease == 0) {
8804 delay_reg_value = delay_reg_value + step_value;
8805 if (delay_reg_value > 255)
8806 delay_reg_value = 255;
8807 }
8808 if (over_ride_increase_decrease != 0) {
8809 if (delay_reg_value > step_value)
8810 delay_reg_value = delay_reg_value - step_value;
8811 else
8812 delay_reg_value = 0;
8813 }
8814 delay_reg_value = ddr_cacl_phy_over_ride_back_reg(over_ride_index, delay_reg_value);
8815 dwc_ddrphy_apb_wr(reg_add, delay_reg_value);
8816 }
8817
8818 printf("reg_add %08x old_value %08x update_to %08x dec %d to %d \n", ((unsigned int)(((reg_add) << 1) + (p_ddr_base->ddr_phy_base_address))),
8819 delay_old_value, dwc_ddrphy_apb_rd(reg_add), ddr_cacl_phy_delay_all_step(over_ride_index, delay_old_value),
8820 (unsigned int)ddr_cacl_phy_delay_all_step(over_ride_index, dwc_ddrphy_apb_rd(reg_add)));
8821}
8822
8823void dwc_window_reg_after_training_update(char over_ride_index, uint32_t over_ride_sub_index, uint32_t over_ride_value)
8824{
8825 uint32_t delay_old_value = 0;
8826 uint32_t delay_reg_value = 0;
8827 uint64_t reg_add = 0;
8828
8829 if (!over_ride_index)
8830 return;
8831 delay_reg_value = ddr_cacl_phy_over_ride_back_reg(over_ride_index, over_ride_value);
8832 if (over_ride_index == DMC_TEST_WINDOW_INDEX_ATXDLY) {
8833 reg_add = ((0 << 20) | (0 << 16) | (over_ride_sub_index << 12) | (0x80));
8834 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
8835 dwc_ddrphy_apb_wr(reg_add, delay_reg_value);
8836 }
8837
8838 if (over_ride_index == DMC_TEST_WINDOW_INDEX_TXDQSDLY) {
8839 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 8) >> 1) << 12) | (0xd0 + (over_ride_sub_index / 8) + ((over_ride_sub_index % 2) << 8)));
8840 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
8841
8842 dwc_ddrphy_apb_wr(reg_add, delay_reg_value);
8843 }
8844 if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXCLKDLY) {
8845 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 8) >> 1) << 12) | (0x8c + (over_ride_sub_index / 8) + ((over_ride_sub_index % 2) << 8)));
8846 delay_old_value = dwc_ddrphy_apb_rd((0 << 20) | (1 << 16) | (((over_ride_sub_index % 8) >> 1) << 12) | (0x8c + (over_ride_sub_index / 8) + ((over_ride_sub_index % 2) << 8)));
8847 dwc_ddrphy_apb_wr(reg_add, delay_reg_value);
8848 dwc_ddrphy_apb_wr(reg_add + 4, delay_reg_value);
8849 }
8850 if (over_ride_index == DMC_TEST_WINDOW_INDEX_TXDQDLY) {
8851 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 36) / 9) << 12) | (0xc0 + ((over_ride_sub_index % 9) << 8) + (over_ride_sub_index / 36)));
8852 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
8853 dwc_ddrphy_apb_wr(reg_add, delay_reg_value);
8854 }
8855 if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXPBDLY) {
8856 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 36) / 9) << 12) | (0x68 + ((over_ride_sub_index % 9) << 8) + (over_ride_sub_index / 36)));
8857 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
8858 dwc_ddrphy_apb_wr(reg_add, delay_reg_value);
8859 }
8860
8861 if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXENDLY) {
8862 reg_add = ((0 << 20) | (1 << 16) | ((over_ride_sub_index % 8) << 12) | (0x80 + (over_ride_sub_index / 8)));
8863 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
8864 dwc_ddrphy_apb_wr(reg_add, delay_reg_value);
8865 }
8866 if (over_ride_index == DMC_TEST_WINDOW_INDEX_SOC_VREF)
8867 dwc_ddrphy_apb_wr((0 << 20) | (1 << 16) | (((over_ride_sub_index % 36) / 9) << 12) | (((over_ride_sub_index % 36) % 9) << 8) | (0x40), over_ride_value);
8868 if (over_ride_index == DMC_TEST_WINDOW_INDEX_SOC_VREF_DAC1)
8869 dwc_ddrphy_apb_wr((0 << 20) | (1 << 16) | (((over_ride_sub_index % 36) / 9) << 12) | (((over_ride_sub_index % 36) % 9) << 8) | (0x30), over_ride_value);
8870
8871 printf("reg_add %08x old_value %08x update_to %08x dec %d to %d \n", ((unsigned int)(((reg_add) << 1) + (p_ddr_base->ddr_phy_base_address))),
8872 delay_old_value, dwc_ddrphy_apb_rd(reg_add), ddr_cacl_phy_delay_all_step(over_ride_index, delay_old_value),
8873 (unsigned int)ddr_cacl_phy_delay_all_step(over_ride_index, delay_reg_value));
8874}
8875
8876void dwc_window_reg_after_training_update_increas_sub(char over_ride_index, uint32_t over_ride_sub_index, uint32_t over_ride_increase_decrease,
8877 uint32_t step_value)
8878{
8879 uint32_t delay_old_value = 0;
8880 uint32_t delay_reg_value = 0;
8881
8882 uint64_t reg_add = 0;
8883
8884 if (!over_ride_index)
8885 return;
8886 if (over_ride_index == DMC_TEST_WINDOW_INDEX_ATXDLY) {
8887 reg_add = ((0 << 20) | (0 << 16) | (over_ride_sub_index << 12) | (0x80));
8888 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
8889 delay_reg_value = ddr_cacl_phy_delay_all_step(over_ride_index, delay_old_value);
8890 if (over_ride_increase_decrease == 0) {
8891 delay_reg_value = delay_reg_value + step_value;
8892 if (delay_reg_value > 95)
8893 delay_reg_value = 95;
8894 }
8895 if (over_ride_increase_decrease != 0) {
8896 if (delay_reg_value >= step_value)
8897 delay_reg_value = delay_reg_value - step_value;
8898 else
8899 delay_reg_value = 0;
8900 }
8901 delay_reg_value = ddr_cacl_phy_over_ride_back_reg(over_ride_index, delay_reg_value);
8902 dwc_ddrphy_apb_wr((reg_add), delay_reg_value);
8903 }
8904 if (over_ride_index == DMC_TEST_WINDOW_INDEX_TXDQSDLY) {
8905 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 8) >> 1) << 12) | (0xd0 + (over_ride_sub_index / 8) + ((over_ride_sub_index % 2) << 8)));
8906 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
8907
8908 //some case will happen tdqs from 0x1f to 0x0 or 0x0 to 0x1f ,then fast boot write back will happen error ,because
8909 // fast boot write back will re-calculate coarse UI,then result dq phase fail.
8910 if ((over_ride_sub_index % 2) == 0) {
8911 char temp_test_index = DMC_TEST_WINDOW_INDEX_TXDQDLY;
8912 char temp_count = 0;
8913 {
8914 for (temp_count = 0; temp_count < 9; temp_count++)
8915 dwc_window_reg_after_training_update_increas_dq(temp_test_index
8916 , (((over_ride_sub_index) >> 1) * 9 + temp_count), (!over_ride_increase_decrease), step_value);
8917 }
8918 }
8919 }
8920 if (over_ride_index == DMC_TEST_WINDOW_INDEX_TXDQDLY) {
8921 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 36) / 9) << 12) | (0xc0 + ((over_ride_sub_index % 9) << 8) + (over_ride_sub_index / 36)));
8922 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
8923 delay_reg_value = ddr_cacl_phy_delay_all_step(over_ride_index, delay_old_value);
8924 if (over_ride_increase_decrease == 0) {
8925 delay_reg_value = delay_reg_value + step_value;
8926 if (delay_reg_value > 255)
8927 delay_reg_value = 255;
8928 }
8929 if (over_ride_increase_decrease != 0) {
8930 if (delay_reg_value > step_value)
8931 delay_reg_value = delay_reg_value - step_value;
8932 else
8933 delay_reg_value = 0;
8934 }
8935 delay_reg_value = ddr_cacl_phy_over_ride_back_reg(over_ride_index, delay_reg_value);
8936 dwc_ddrphy_apb_wr(reg_add, delay_reg_value);
8937 }
8938 if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXCLKDLY) {
8939 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 8) >> 1) << 12) | (0x8c + (over_ride_sub_index / 8) + ((over_ride_sub_index % 2) << 8)));
8940 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
8941 delay_reg_value = ddr_cacl_phy_delay_all_step(over_ride_index, delay_old_value);
8942 if (over_ride_increase_decrease == 0) {
8943 delay_reg_value = delay_reg_value + step_value;
8944 if (delay_reg_value > 95)
8945 delay_reg_value = 95;
8946 }
8947 if (over_ride_increase_decrease != 0) {
8948 if (delay_reg_value > step_value)
8949 delay_reg_value = delay_reg_value - step_value;
8950 else
8951 delay_reg_value = 0;
8952 }
8953 delay_reg_value = ddr_cacl_phy_over_ride_back_reg(over_ride_index, delay_reg_value);
8954 dwc_ddrphy_apb_wr(reg_add, delay_reg_value);
8955 dwc_ddrphy_apb_wr(reg_add + 4, delay_reg_value);
8956 }
8957 if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXPBDLY) {
8958 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 36) / 9) << 12) | (0x68 + ((over_ride_sub_index % 9) << 8) + (over_ride_sub_index / 36)));
8959 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
8960 delay_reg_value = ddr_cacl_phy_delay_all_step(over_ride_index, delay_old_value);
8961 if (over_ride_increase_decrease == 0) {
8962 delay_reg_value = delay_reg_value + step_value;
8963 if (delay_reg_value > 63)
8964 delay_reg_value = 63;
8965 }
8966 if (over_ride_increase_decrease != 0) {
8967 if (delay_reg_value > step_value)
8968 delay_reg_value = delay_reg_value - step_value;
8969 else
8970 delay_reg_value = 0;
8971 }
8972 delay_reg_value = ddr_cacl_phy_over_ride_back_reg(over_ride_index, delay_reg_value);
8973 dwc_ddrphy_apb_wr(reg_add, delay_reg_value);
8974 }
8975 if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXENDLY) {
8976 reg_add = ((0 << 20) | (1 << 16) | ((over_ride_sub_index % 8) << 12) | (0x80 + (over_ride_sub_index / 8)));
8977 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
8978 //delay_reg_value = ddr_cacl_phy_delay_all_step(over_ride_index, delay_old_value);
8979 if (over_ride_increase_decrease == 0) {
8980 dwc_ddrphy_apb_wr(reg_add, ((delay_old_value & 0x3f) + step_value) | (delay_old_value & 0xffc0));
8981 if (((delay_old_value & 0x3f) + step_value) > 0x3f)
8982 dwc_ddrphy_apb_wr(reg_add, 0x3f | (delay_old_value & 0xffc0));
8983 } else {
8984 dwc_ddrphy_apb_wr(reg_add, ((delay_old_value & 0x3f) - step_value) | (delay_old_value & 0xffc0));
8985 if (((delay_old_value & 0x3f) < step_value))
8986 dwc_ddrphy_apb_wr(reg_add, (delay_old_value & 0xffc0));
8987 }
8988 }
8989
8990 if ((over_ride_index == DMC_TEST_WINDOW_INDEX_SOC_VREF) || (over_ride_index == DMC_TEST_WINDOW_INDEX_SOC_VREF_DAC1)) {
8991 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 36) / 9) << 12) | (((over_ride_sub_index % 36) % 9) << 8) | (0x40));
8992 if (over_ride_index == DMC_TEST_WINDOW_INDEX_SOC_VREF_DAC1)
8993 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 36) / 9) << 12) | (((over_ride_sub_index % 36) % 9) << 8) | (0x30));
8994 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
8995 delay_reg_value = delay_old_value;
8996 if (over_ride_increase_decrease == 0) {
8997 delay_reg_value = delay_reg_value + step_value;
8998 if (delay_reg_value > 127)
8999 delay_reg_value = 127;
9000 }
9001 if (over_ride_increase_decrease != 0) {
9002 if (delay_reg_value >= step_value)
9003 delay_reg_value = delay_reg_value - step_value;
9004 else
9005 delay_reg_value = 0;
9006 }
9007 dwc_ddrphy_apb_wr(reg_add, delay_reg_value);
9008 }
9009 printf("reg_add %08x old_value %08x update_to %08x dec %d to %d \n", ((unsigned int)(((reg_add) << 1) + (p_ddr_base->ddr_phy_base_address))),
9010 delay_old_value, dwc_ddrphy_apb_rd(reg_add), ddr_cacl_phy_delay_all_step(over_ride_index, delay_old_value),
9011 (unsigned int)ddr_cacl_phy_delay_all_step(over_ride_index, dwc_ddrphy_apb_rd(reg_add)));
9012}
9013
9014void dwc_window_reg_after_training_update_increas(char over_ride_index, uint32_t over_ride_sub_index, uint32_t over_ride_increase_decrease,
9015 uint32_t offset_value)
9016{
9017 uint32_t delay_old_value = 0;
9018 uint32_t temp_count_3 = 0;
9019 uint64_t reg_add = 0;
9020
9021 if (!over_ride_index)
9022 return;
9023
9024 if (over_ride_index == DMC_TEST_WINDOW_INDEX_ATXDLY) {
9025 reg_add = ((0 << 20) | (0 << 16) | (over_ride_sub_index << 12) | (0x80));
9026 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
9027 for (temp_count_3 = 0; temp_count_3 < offset_value; temp_count_3++)
9028 dwc_window_reg_after_training_update_increas_sub(over_ride_index
9029 , ((over_ride_sub_index)), over_ride_increase_decrease, 1);
9030 }
9031
9032 if (over_ride_index == DMC_TEST_WINDOW_INDEX_TXDQSDLY) {
9033 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 8) >> 1) << 12) | (0xd0 + (over_ride_sub_index / 8) + ((over_ride_sub_index % 2) << 8)));
9034 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
9035 for (temp_count_3 = 0; temp_count_3 < offset_value; temp_count_3++)
9036 dwc_window_reg_after_training_update_increas_sub(over_ride_index
9037 , ((over_ride_sub_index)), over_ride_increase_decrease, 1);
9038 }
9039 if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXCLKDLY) {
9040 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 8) >> 1) << 12) | (0x8c + (over_ride_sub_index / 8) + ((over_ride_sub_index % 2) << 8)));
9041 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
9042 for (temp_count_3 = 0; temp_count_3 < offset_value; temp_count_3++)
9043 dwc_window_reg_after_training_update_increas_sub(over_ride_index
9044 , ((over_ride_sub_index)), over_ride_increase_decrease, 1);
9045 }
9046 if (over_ride_index == DMC_TEST_WINDOW_INDEX_TXDQDLY) {
9047 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 36) / 9) << 12) | (0xc0 + ((over_ride_sub_index % 9) << 8) + (over_ride_sub_index / 36)));
9048 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
9049 for (temp_count_3 = 0; temp_count_3 < offset_value; temp_count_3++)
9050 dwc_window_reg_after_training_update_increas_sub(over_ride_index
9051 , ((over_ride_sub_index)), over_ride_increase_decrease, 1);
9052 }
9053 if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXPBDLY) {
9054 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 36) / 9) << 12) | (0x68 + ((over_ride_sub_index % 9) << 8) + (over_ride_sub_index / 36)));
9055 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
9056 for (temp_count_3 = 0; temp_count_3 < offset_value; temp_count_3++)
9057 dwc_window_reg_after_training_update_increas_sub(over_ride_index
9058 , ((over_ride_sub_index)), over_ride_increase_decrease, 1);
9059 }
9060
9061 if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXENDLY) {
9062 reg_add = ((0 << 20) | (1 << 16) | ((over_ride_sub_index % 8) << 12) | (0x80 + (over_ride_sub_index / 8)));
9063 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
9064 for (temp_count_3 = 0; temp_count_3 < offset_value; temp_count_3++)
9065 dwc_window_reg_after_training_update_increas_sub(over_ride_index
9066 , ((over_ride_sub_index)), over_ride_increase_decrease, 1);
9067 }
9068
9069 if ((over_ride_index == DMC_TEST_WINDOW_INDEX_SOC_VREF) || (over_ride_index == DMC_TEST_WINDOW_INDEX_SOC_VREF_DAC1)) {
9070 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 36) / 9) << 12) | (((over_ride_sub_index % 36) % 9) << 8) | (0x40));
9071 if (over_ride_index == DMC_TEST_WINDOW_INDEX_SOC_VREF_DAC1)
9072 reg_add = ((0 << 20) | (1 << 16) | (((over_ride_sub_index % 36) / 9) << 12) | (((over_ride_sub_index % 36) % 9) << 8) | (0x30));
9073 delay_old_value = dwc_ddrphy_apb_rd(reg_add);
9074 for (temp_count_3 = 0; temp_count_3 < offset_value; temp_count_3++)
9075 dwc_window_reg_after_training_update_increas_sub(over_ride_index
9076 , ((over_ride_sub_index)), over_ride_increase_decrease, 1);
9077 }
9078
9079 printf("over_ride_increase_decrease==%d\n", over_ride_increase_decrease);
9080
9081 if (over_ride_increase_decrease == 1) {
9082 unsigned int org_cacl_value = (delay_old_value) & 0x3f;
9083 printf("org_cacl_value==%d\n", org_cacl_value);
9084 printf("offset_value==%d\n", offset_value);
9085 if ((org_cacl_value & 0x3f) < offset_value) {
9086 char temp_test_index_2 = 0;
9087 char temp_count_4 = 0;
9088 char temp_count_2 = 0;
9089 if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXCLKDLY) {
9090 temp_test_index_2 = DMC_TEST_WINDOW_INDEX_RXPBDLY;
9091
9092 for (temp_count_2 = 0; temp_count_2 < 4; temp_count_2++) {
9093 for (temp_count_4 = 0; temp_count_4 < (((offset_value - org_cacl_value) * ui_1_32_100step) / bdlr_100step); temp_count_4++) {
9094 dwc_window_reg_after_training_update_increas_sub(temp_test_index_2
9095 , ((over_ride_sub_index / 2) * 9 +
9096 temp_count_2 + (over_ride_sub_index % 2) * 4), 0, 1);
9097 }
9098 }
9099 }
9100
9101 if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXPBDLY) {
9102 temp_test_index_2 = DMC_TEST_WINDOW_INDEX_RXPBDLY;
9103
9104 for (temp_count_2 = 0; temp_count_2 < 4; temp_count_2++) {
9105 if (temp_count_2 == ((over_ride_sub_index % 9) % 4))
9106 temp_count_2++;
9107
9108 for (temp_count_4 = 0; temp_count_4 < (offset_value - org_cacl_value); temp_count_4++) {
9109 dwc_window_reg_after_training_update_increas_sub(temp_test_index_2
9110 , ((over_ride_sub_index / 9) * 9 +
9111 temp_count_2 + (((over_ride_sub_index % 9) > 3) ? 4 : 0)), 0, 1);
9112 }
9113 }
9114
9115 if ((((offset_value - org_cacl_value) * bdlr_100step) / ui_1_32_100step)) {
9116 temp_test_index_2 = DMC_TEST_WINDOW_INDEX_RXCLKDLY;
9117
9118 for (temp_count_4 = 0; temp_count_4 < (((offset_value - org_cacl_value) * bdlr_100step) / ui_1_32_100step); temp_count_4++) {
9119 dwc_window_reg_after_training_update_increas_sub(temp_test_index_2
9120 , (((over_ride_sub_index / 9) << 1) +
9121 (((over_ride_sub_index % 9) > 3) ? 1 : 0)
9122 ), 0, 1);
9123 }
9124 }
9125 }
9126 }
9127 }
9128 printf("reg_add %08x old_value %08x update_to %08x dec %d to %d \n", ((unsigned int)(((reg_add) << 1) + (p_ddr_base->ddr_phy_base_address))),
9129 delay_old_value, dwc_ddrphy_apb_rd(reg_add), ddr_cacl_phy_delay_all_step(over_ride_index, delay_old_value),
9130 ddr_cacl_phy_delay_all_step(over_ride_index, dwc_ddrphy_apb_rd(reg_add)));
9131}
9132
9133int do_ddr2pll_g12_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
9134{
9135 check_base_address();
9136#define DMC_WINDOW_CMD 20180010 //g12_d2pll 1584 0 0 0 0 0x8
9137#define G12_D2PLL_CMD_DMC_FULL_TEST 0x01
9138#define G12_D2PLL_CMD_OVER_RIDE 0x02
9139#define G12_D2PLL_CMD_OVER_RIDE_PLUS_FULLTEST 0x03
9140#define G12_D2PLL_CMD_OVER_RIDE_TRAINING_HDTL 0x04
9141#define G12_D2PLL_CMD_OFFSET 0x06
9142#define G12_D2PLL_CMD_WINDOW_TEST 0x11
9143#define G12_D2PLL_CMD_WINDOW_TEST_AND_STICKY_OVERRIDE 0x12
9144#define G12_D2PLL_CMD_SUSPEND_TEST 0x21
9145#define G12_D2PLL_CMD_SWEEP_EE_VOLTAGE_FREQUENCY_TABLE_TEST 0x32
9146#define G12_D2PLL_CMD_DDR_EYE_TEST 0x41
9147#define G12_D2PLL_CMD_DDR_EYE_TEST_AND_STICKY_OVERRIDE 0x42
9148#define G12_D2PLL_CMD_DDR_EYE_TEST_DAC1 0x43
9149#define G12_D2PLL_CMD_DDR_EYE_TEST_AND_STICKY_OVERRIDE_DAC1 0x44
9150
9151#define G12_D2PLL_CMD_DDR_DVFS_TEST 0x51
9152
9153#define DMC_TEST_WINDOW_INDEX_ATXDLY 1
9154#define DMC_TEST_WINDOW_INDEX_TXDQSDLY 2
9155#define DMC_TEST_WINDOW_INDEX_RXCLKDLY 3
9156#define DMC_TEST_WINDOW_INDEX_TXDQDLY 4
9157#define DMC_TEST_WINDOW_INDEX_RXPBDLY 5
9158
9159#define DMC_TEST_WINDOW_INDEX_EE_VOLTAGE 0x11
9160
9161 char *endp;
9162 unsigned int pll;
9163 unsigned int window_test_stick_cmd_value = 0;
9164 /* need at least two arguments */
9165 if ((p_ddr_base->chip_id >= DDR_MESON_CPU_MAJOR_ID_C2 &&
9166 p_ddr_base->chip_id <= DDR_MESON_CPU_MAJOR_ID_T5D) ||
9167 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_S4 ||
9168 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T3 ||
9169 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T5W)
9170 do_read_c2_ddr_bdlr_steps();
9171 if (argc < 2)
9172 //goto usage;
9173 return 1;
9174
9175 pll = simple_strtoul(argv[1], &endp, 0);
9176 if (*argv[1] == 0 || *endp != 0) {
9177 printf("Error: Wrong format parament!pll=0x%08x\n", pll);
9178 return 1;
9179 }
9180 unsigned int argc_count = 1;
9181 unsigned int para_meter[30] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
9182 while (argc_count < argc) {
9183 para_meter[argc_count - 1] = simple_strtoul(argv[argc_count], &endp, 0);
9184 if (*argv[argc_count] == 0 || *endp != 0)
9185 para_meter[argc_count - 1] = 0;
9186 argc_count++;
9187 }
9188
9189 argc_count = 2;
9190 window_test_stick_cmd_value = para_meter[argc_count - 1];
9191 window_test_stick_cmd_value = (window_test_stick_cmd_value & 0xff);
9192 if ((window_test_stick_cmd_value == G12_D2PLL_CMD_OVER_RIDE) || (window_test_stick_cmd_value == G12_D2PLL_CMD_OVER_RIDE_PLUS_FULLTEST)) {
9193 para_meter[3] = (para_meter[3] << 24) | (para_meter[4] << 16) | (para_meter[5] << 0);
9194 para_meter[4] = (para_meter[6] << 24) | (para_meter[7] << 16) | (para_meter[8] << 0);
9195 para_meter[5] = (para_meter[9] << 24) | (para_meter[10] << 16) | (para_meter[11] << 0);
9196 }
9197 if ((window_test_stick_cmd_value == G12_D2PLL_CMD_WINDOW_TEST) || (window_test_stick_cmd_value == G12_D2PLL_CMD_WINDOW_TEST_AND_STICKY_OVERRIDE))
9198 para_meter[5] = (para_meter[9] << 28) | (para_meter[10] << 24) | (para_meter[11] << 20) | (para_meter[12] << 21) | (para_meter[13] << 22) | (para_meter[14] << 25) | (para_meter[5] << 0);
9199 if ((window_test_stick_cmd_value >= G12_D2PLL_CMD_DDR_EYE_TEST) && (window_test_stick_cmd_value <= G12_D2PLL_CMD_DDR_EYE_TEST_AND_STICKY_OVERRIDE_DAC1)) {
9200 para_meter[3] = (para_meter[3] << 0) | (para_meter[4] << 8) | (para_meter[5] << 16) | (para_meter[6] << 24);
9201 para_meter[4] = (para_meter[7] << 0) | (para_meter[8] << 8) | (para_meter[9] << 16) | (para_meter[10] << 24);
9202 para_meter[5] = para_meter[11]; //(para_meter[11]<<0)|(para_meter[12]<<8)|(para_meter[13]<<16)|(para_meter[14]<<24);
9203 para_meter[6] = para_meter[12]; //para_meter[15];
9204 para_meter[7] = para_meter[13]; //para_meter[16];
9205 para_meter[8] = para_meter[14]; //para_meter[17];
9206 }
9207 wr_reg((p_ddr_base->preg_sticky_reg0), (rd_reg((p_ddr_base->preg_sticky_reg0)) & 0xffff) | (0xf13 << 20));
9208 argc_count = 0;
9209 printf("\nP_PREG_STICKY_REG [0x%08x] [0x%08x]==[0x%08x]\n", argc_count, ((p_ddr_base->preg_sticky_reg0) + (argc_count << 2)), rd_reg((p_ddr_base->preg_sticky_reg0) + (argc_count << 2)));
9210 argc_count = 1;
9211 while (argc_count < 10) {
9212 wr_reg((p_ddr_base->preg_sticky_reg0) + (argc_count << 2), para_meter[argc_count - 1]);
9213 printf("P_PREG_STICKY_REG [0x%08x] [0x%08x]==[0x%08x]\n", argc_count, ((p_ddr_base->preg_sticky_reg0) + (argc_count << 2)), rd_reg((p_ddr_base->preg_sticky_reg0) + (argc_count << 2)));
9214 argc_count++;
9215 }
9216 dcache_disable();
9217 if (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_A1 ||
9218 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_C1 ||
9219 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_C2 ||
9220 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_SC2 ||
9221 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_S4 ||
9222 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T3
9223//|| (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T5)
9224//|| (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T5D)
9225 ) {
9226 printf("reset...\n");
9227 run_command("reset", 0);
9228 run_command("reboot", 0);
9229 } else {
9230 //G12A/G12B/SM1/TL1/TM2
9231 //p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T7
9232 printf("reboot...\n"); //reset will enter bl2 panic path,so change to "reboot"
9233 run_command("reboot", 0);
9234 run_command("reset", 0);
9235 //ddr_test_watchdog_reset_system();
9236 }
9237
9238 return 0;
9239
9240//usage:
9241// cmd_usage(cmdtp);
9242// return 1;
9243}
9244
9245U_BOOT_CMD(
9246 g12_d2pll, 18, 1, do_ddr2pll_g12_cmd,
9247 "g12_d2pll 1300 1 0x10 0",
9248 "g12_d2pll clk delay_index delay_value before_after_training_setting\n"
9249 );
9250
9251#endif
9252
9253#if (CONFIG_DDR_PHY >= P_DDR_PHY_G12)
9254
9255int do_ddr_g12_override_data(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
9256{
9257 check_base_address();
9258
9259 uint32_t dmc_retraining_ctrl = 0;
9260 dmc_retraining_ctrl = rd_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address));
9261 unsigned int ddr_dmc_apd_temp_save, ddr_dmc_asr_temp_save;
9262 ddr_dmc_apd_temp_save = readl((p_ddr_base->ddr_dmc_apd_address));
9263 ddr_dmc_asr_temp_save = readl((p_ddr_base->ddr_dmc_asr_address));
9264 printf("\12nm phy read write register should closed apd and asr function\n");
9265
9266#define G12_DATA_READ_OFFSET_MAX (0X3F)
9267#define G12_DATA_WRITE_OFFSET_MAX (0X3F + 7 * 32)
9268
9269#if 1
9270 int i = 0;
9271 printf("\nargc== 0x%08x\n", argc);
9272 for (i = 0; i < argc; i++)
9273 printf("\nargv[%d]=%s\n", i, argv[i]);
9274 char *endp;
9275 //rank_index dq_index write_read left/right offset_value
9276 unsigned int test_index = 0; // 1 ac ,0x2, write dqs ,0x4,read dqs,0x8,write dq,0x10 read dq
9277 unsigned int dq_index = 0; //0-8 rank0 lane0 ,rank0 9-17 lane1,rank0 18-26 lane2, rank0 27-35 lane3, 36+0-8 rank1 lane0 ,rank1 36+9-17 lane1,rank1 36+18-26 lane2, rank1 36+27-35 lane3
9278 unsigned int ovrride_value = 0; //
9279
9280 unsigned int count = 0;
9281 unsigned int lcdlr_max = 0;
9282
9283 if (argc == 1) {
9284 printf("\nplease read help\n");
9285 } else if (argc > 4) { //offset_enable=1;
9286 {
9287 count = 0;
9288 test_index = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9289 if (*argv[count + 1] == 0 || *endp != 0)
9290 test_index = 0;
9291 }
9292 {
9293 count++;
9294 dq_index = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9295 if (*argv[count + 1] == 0 || *endp != 0)
9296 dq_index = 0;
9297 }
9298
9299 {
9300 count++;
9301 ovrride_value = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9302 if (*argv[count + 1] == 0 || *endp != 0)
9303 ovrride_value = 0;
9304 }
9305 } else {
9306 return 1;
9307 }
9308 printf("lcdlr_max %d,\n", lcdlr_max);
9309
9310 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl & (~(1 << 31)));
9311 writel((0), p_ddr_base->ddr_dmc_apd_address);
9312 writel((0), p_ddr_base->ddr_dmc_asr_address);
9313 {
9314 dwc_window_reg_after_training_update(test_index, dq_index, ovrride_value);
9315 }
9316
9317#endif
9318 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
9319 writel(ddr_dmc_apd_temp_save, p_ddr_base->ddr_dmc_apd_address);
9320 writel(ddr_dmc_asr_temp_save, p_ddr_base->ddr_dmc_asr_address);
9321 return 1;
9322}
9323U_BOOT_CMD(
9324 ddr_g12_override_data, 20, 1, do_ddr_g12_override_data,
9325 "ddr_g12_override_data 1 0 0 0 1 3",
9326 "ddr_g12_override_data test_index dq_index ovrride_value \n"
9327 );
9328
9329void ddr_window_reg_after_training_update_increas_sub_c2(char over_ride_index, uint32_t over_ride_sub_index, uint32_t over_ride_increase_decrease, uint32_t step)
9330{
9331 uint32_t delay_old_value = 0;
9332 uint32_t delay_reg_value = 0;
9333 uint32_t ps = 0;
9334
9335 if (!over_ride_index)
9336 return;
9337 if (over_ride_index <= DMC_TEST_WINDOW_INDEX_DRAM_VREF) {
9338 delay_old_value = ddr_phy_training_reg_read_write(ddr_set_t_p, over_ride_index, over_ride_sub_index, delay_old_value, REGISTER_READ, ps);
9339 if (over_ride_increase_decrease == 0)
9340 delay_reg_value = delay_old_value + step;
9341 if (over_ride_increase_decrease != 0) {
9342 if (delay_old_value > step)
9343 delay_reg_value = delay_old_value - step;
9344 else
9345 delay_reg_value = 0;
9346 }
9347
9348 ddr_phy_training_reg_read_write(ddr_set_t_p, over_ride_index, over_ride_sub_index, delay_reg_value, REGISTER_WRITE,
9349 ps);
9350 }
9351}
9352
9353void dwc_window_reg_after_training_update_increas_c2(char over_ride_index, uint32_t over_ride_sub_index, uint32_t over_ride_increase_decrease,
9354 uint32_t offset_value)
9355{
9356 uint32_t temp_count_3 = 0;
9357
9358 if (!over_ride_index)
9359 return;
9360
9361 if (over_ride_index == DMC_TEST_WINDOW_INDEX_ATXDLY) {
9362 for (temp_count_3 = 0; temp_count_3 < offset_value; temp_count_3++)
9363 ddr_window_reg_after_training_update_increas_sub_c2(over_ride_index
9364 , ((over_ride_sub_index)), over_ride_increase_decrease, 1);
9365 }
9366
9367 if (over_ride_index == DMC_TEST_WINDOW_INDEX_TXDQSDLY) {
9368 for (temp_count_3 = 0; temp_count_3 < offset_value; temp_count_3++)
9369 ddr_window_reg_after_training_update_increas_sub_c2(over_ride_index
9370 , ((over_ride_sub_index)), over_ride_increase_decrease, 1);
9371 }
9372 if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXCLKDLY) {
9373 for (temp_count_3 = 0; temp_count_3 < offset_value; temp_count_3++)
9374 ddr_window_reg_after_training_update_increas_sub_c2(over_ride_index
9375 , ((over_ride_sub_index)), over_ride_increase_decrease, 1);
9376 }
9377 if (over_ride_index == DMC_TEST_WINDOW_INDEX_TXDQDLY) {
9378 for (temp_count_3 = 0; temp_count_3 < offset_value; temp_count_3++)
9379 ddr_window_reg_after_training_update_increas_sub_c2(over_ride_index
9380 , ((over_ride_sub_index)), over_ride_increase_decrease, 1);
9381 }
9382 if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXPBDLY) {
9383 for (temp_count_3 = 0; temp_count_3 < offset_value; temp_count_3++)
9384 ddr_window_reg_after_training_update_increas_sub_c2(over_ride_index
9385 , ((over_ride_sub_index)), over_ride_increase_decrease, 1);
9386 }
9387
9388 if (over_ride_index == DMC_TEST_WINDOW_INDEX_RXENDLY) {
9389 for (temp_count_3 = 0; temp_count_3 < offset_value; temp_count_3++)
9390 ddr_window_reg_after_training_update_increas_sub_c2(over_ride_index
9391 , ((over_ride_sub_index)), over_ride_increase_decrease, 1);
9392 }
9393
9394 if (over_ride_index == DMC_TEST_WINDOW_INDEX_SOC_VREF) {
9395 for (temp_count_3 = 0; temp_count_3 < offset_value; temp_count_3++)
9396 ddr_window_reg_after_training_update_increas_sub_c2(over_ride_index
9397 , ((over_ride_sub_index)), over_ride_increase_decrease, 1);
9398 }
9399 if (over_ride_index == DMC_TEST_WINDOW_INDEX_SOC_VREF_DAC1) {
9400 for (temp_count_3 = 0; temp_count_3 < offset_value; temp_count_3++)
9401 ddr_window_reg_after_training_update_increas_sub_c2(over_ride_index
9402 , ((over_ride_sub_index)), over_ride_increase_decrease, 1);
9403 }
9404}
9405
9406int do_ddr_c2_offset_data(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
9407{
9408 check_base_address();
9409
9410 uint32_t dmc_retraining_ctrl = 0;
9411 dmc_retraining_ctrl = rd_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address));
9412 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl & (~(1 << 31)));
9413 unsigned int ddr_dmc_apd_temp_save, ddr_dmc_asr_temp_save;
9414 ddr_dmc_apd_temp_save = readl(p_ddr_base->ddr_dmc_apd_address);
9415 ddr_dmc_asr_temp_save = readl(p_ddr_base->ddr_dmc_asr_address);
9416#define G12_DATA_READ_OFFSET_MAX (0X3F)
9417#define G12_DATA_WRITE_OFFSET_MAX (0X3F + 7 * 32)
9418 printf("\12nm phy read write register should closed apd and asr function\n");
9419 int i = 0;
9420
9421 printf("\nargc== 0x%08x\n", argc);
9422 for (i = 0; i < argc; i++)
9423 printf("\nargv[%d]=%s\n", i, argv[i]);
9424 char *endp;
9425 //rank_index dq_index write_read left/right offset_value
9426 unsigned int test_index = 0; // 1 ac ,0x2, write dqs ,0x4,read dqs,0x8,write dq,0x10 read dq
9427 unsigned int test_dq_mask_1 = 0; //each bit mask correspond with dq_index
9428 unsigned int test_dq_mask_2 = 0; //each bit mask correspond with dq_index
9429 unsigned int test_dq_mask_3 = 0; //each bit mask correspond with dq_index
9430 unsigned int left_right_flag = 0; // 1 left ,2 right #define DDR_PARAMETER_LEFT 1 #define DDR_PARAMETER_RIGHT 2
9431 unsigned int offset_value = 0; //
9432 unsigned int count = 0;
9433 unsigned int count_max = 0;
9434 //unsigned int lcdlr_max = 0;
9435
9436 global_ddr_clk = get_ddr_clk();
9437 bdlr_100step = get_bdlr_100step(global_ddr_clk);
9438 if (global_ddr_clk)
9439 ui_1_32_100step = (1000000 * 100 / (global_ddr_clk * 2 * 32));
9440
9441 if (argc == 1) {
9442 printf("\nplease read aml phy cmd help\n");
9443 } else if (argc > 6) { //offset_enable=1;
9444 {
9445 count = 0;
9446 test_index = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9447 if (*argv[count + 1] == 0 || *endp != 0)
9448 test_index = 0;
9449 }
9450 {
9451 count++;
9452 test_dq_mask_1 = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9453 if (*argv[count + 1] == 0 || *endp != 0)
9454 test_dq_mask_1 = 0;
9455 }
9456 {
9457 count++;
9458 test_dq_mask_2 = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9459 if (*argv[count + 1] == 0 || *endp != 0)
9460 test_dq_mask_2 = 0;
9461 }
9462 {
9463 count++;
9464 test_dq_mask_3 = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9465 if (*argv[count + 1] == 0 || *endp != 0)
9466 test_dq_mask_3 = 0;
9467 }
9468 {
9469 count++;
9470 left_right_flag = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9471 if (*argv[count + 1] == 0 || *endp != 0)
9472 left_right_flag = 0;
9473 }
9474 {
9475 count++;
9476 offset_value = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9477 if (*argv[count + 1] == 0 || *endp != 0)
9478 offset_value = 0;
9479 }
9480 } else {
9481 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
9482 return 1;
9483 }
9484
9485 if (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T3) {
9486 writel(ddr_dmc_apd_temp_save, p_ddr_base->ddr_dmc_apd_address);
9487 writel(ddr_dmc_asr_temp_save, p_ddr_base->ddr_dmc_asr_address);
9488 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
9489 count = 0;
9490 test_index = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9491 if (*argv[count + 1] == 0 || *endp != 0)
9492 test_index = 0;
9493 if (test_index / 100)
9494 dmc_ddr_config_channel_id = 1;
9495 else
9496 dmc_ddr_config_channel_id = 0;
9497 test_index = (test_index % 100); //for DDR_PHY 1
9498 dmc_change_channel(dmc_ddr_config_channel_id);
9499 dmc_retraining_ctrl = rd_reg(p_ddr_base->ddr_dmc_lpdd4_retraining_address);
9500 wr_reg(p_ddr_base->ddr_dmc_lpdd4_retraining_address, dmc_retraining_ctrl & (~(1 << 31)));
9501 ddr_dmc_apd_temp_save = readl(p_ddr_base->ddr_dmc_apd_address);
9502 ddr_dmc_asr_temp_save = readl(p_ddr_base->ddr_dmc_asr_address);
9503 }
9504
9505 //printf("lcdlr_max %d,\n", lcdlr_max);
9506 if (left_right_flag == DDR_PARAMETER_RIGHT)
9507 printf("offset right ++ left_right_flag %d,\n", left_right_flag);
9508 if (left_right_flag == DDR_PARAMETER_LEFT)
9509 printf("offset left --left_right_flag %d,\n", left_right_flag);
9510
9511 if (test_index == DMC_TEST_WINDOW_INDEX_ATXDLY)
9512 count_max = 36;
9513 // lcdlr_max = 4 * 128 - 1; //0x3ff;
9514 if (test_index == DMC_TEST_WINDOW_INDEX_TXDQSDLY)
9515 count_max = 8;
9516 // lcdlr_max = 4 * 128 - 1; //0x3ff;
9517 if (test_index == DMC_TEST_WINDOW_INDEX_RXCLKDLY)
9518 count_max = 8;
9519 // lcdlr_max = 255; //0x3f;
9520
9521 if (test_index == DMC_TEST_WINDOW_INDEX_TXDQDLY)
9522 count_max = 36 * 2;
9523 // lcdlr_max = 8 * 128 - 1; //0x1ff;
9524
9525 if (test_index == DMC_TEST_WINDOW_INDEX_RXPBDLY)
9526 count_max = 36 * 2;
9527 // lcdlr_max = 255;
9528 if (test_index == DMC_TEST_WINDOW_INDEX_SOC_VREF) {
9529 count_max = 36 * 1;
9530 // lcdlr_max = 0x3f;
9531 printf(" soc vref rank0 and rank1 share vref dac\n");
9532 }
9533 if (test_index == DMC_TEST_WINDOW_INDEX_SOC_VREF_DAC1) {
9534 count_max = 36 * 1;
9535 // lcdlr_max = 0x3f;
9536 printf(" soc vref rank0 and rank1 share vref dac\n");
9537 }
9538 count = 0;
9539 writel((0), p_ddr_base->ddr_dmc_apd_address);
9540 writel((0), p_ddr_base->ddr_dmc_asr_address);
9541
9542 for (; count < count_max; count++) {
9543 if ((count < 32))
9544 if (test_dq_mask_1 & (1 << (count % 32)))
9545 continue;
9546
9547 if ((count > 31) && (count < 63))
9548 if (test_dq_mask_2 & (1 << (count % 32)))
9549 continue;
9550
9551 if ((count > 63))
9552 if (test_dq_mask_3 & (1 << (count % 32)))
9553 continue;
9554 {
9555 if (left_right_flag == DDR_PARAMETER_RIGHT) {
9556 dwc_window_reg_after_training_update_increas_c2(test_index,
9557 count,
9558 0, offset_value);
9559 }
9560 if (left_right_flag == DDR_PARAMETER_LEFT) {
9561 dwc_window_reg_after_training_update_increas_c2(test_index,
9562 count,
9563 1, offset_value);
9564 }
9565 }
9566 }
9567 writel(ddr_dmc_apd_temp_save, p_ddr_base->ddr_dmc_apd_address);
9568 writel(ddr_dmc_asr_temp_save, p_ddr_base->ddr_dmc_asr_address);
9569 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
9570
9571 if (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T3) {
9572 dmc_ddr_config_channel_id = 0;
9573 dmc_change_channel(dmc_ddr_config_channel_id);
9574 }
9575 return 1;
9576}
9577
9578int do_ddr_g12_offset_data(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
9579{
9580 //ddr_g12_offset_data 1 0 0 0 1 3
9581 check_base_address();
9582
9583 if ((p_ddr_base->chip_id >= DDR_MESON_CPU_MAJOR_ID_C2 &&
9584 p_ddr_base->chip_id <= DDR_MESON_CPU_MAJOR_ID_T5D) ||
9585 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_S4 ||
9586 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T3 ||
9587 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T5W) {
9588 do_ddr_c2_offset_data(cmdtp, flag, argc, argv);
9589 return 1;
9590 }
9591
9592 uint32_t dmc_retraining_ctrl = 0;
9593 dmc_retraining_ctrl = rd_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address));
9594 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl & (~(1 << 31)));
9595 unsigned int ddr_dmc_apd_temp_save, ddr_dmc_asr_temp_save;
9596 ddr_dmc_apd_temp_save = readl(p_ddr_base->ddr_dmc_apd_address);
9597 ddr_dmc_asr_temp_save = readl(p_ddr_base->ddr_dmc_asr_address);
9598#define G12_DATA_READ_OFFSET_MAX (0X3F)
9599#define G12_DATA_WRITE_OFFSET_MAX (0X3F + 7 * 32)
9600 printf("\12nm phy read write register should closed apd and asr function\n");
9601
9602 int i = 0;
9603 printf("\nargc== 0x%08x\n", argc);
9604 for (i = 0; i < argc; i++)
9605 printf("\nargv[%d]=%s\n", i, argv[i]);
9606 char *endp;
9607 //rank_index dq_index write_read left/right offset_value
9608 unsigned int test_index = 0; // 1 ac ,0x2, write dqs ,0x4,read dqs,0x8,write dq,0x10 read dq
9609 unsigned int test_dq_mask_1 = 0; //each bit mask correspond with dq_index
9610 unsigned int test_dq_mask_2 = 0; //each bit mask correspond with dq_index
9611 unsigned int test_dq_mask_3 = 0; //each bit mask correspond with dq_index
9612 unsigned int left_right_flag = 0; // 1 left ,2 right #define DDR_PARAMETER_LEFT 1 #define DDR_PARAMETER_RIGHT 2
9613 unsigned int offset_value = 0; //
9614 unsigned int count = 0;
9615 unsigned int count_max = 0;
9616 //unsigned int lcdlr_max = 0;
9617
9618 global_ddr_clk = get_ddr_clk();
9619 bdlr_100step = get_bdlr_100step(global_ddr_clk);
9620 if (global_ddr_clk)
9621 ui_1_32_100step = (1000000 * 100 / (global_ddr_clk * 2 * 32));
9622
9623 if (argc == 1) {
9624 printf("\nplease read help\n");
9625 return 1;
9626 } else if (argc > 6) { //offset_enable=1;
9627 {
9628 count = 0;
9629 test_index = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9630 if (*argv[count + 1] == 0 || *endp != 0)
9631 test_index = 0;
9632 }
9633 {
9634 count++;
9635 test_dq_mask_1 = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9636 if (*argv[count + 1] == 0 || *endp != 0)
9637 test_dq_mask_1 = 0;
9638 }
9639 {
9640 count++;
9641 test_dq_mask_2 = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9642 if (*argv[count + 1] == 0 || *endp != 0)
9643 test_dq_mask_2 = 0;
9644 }
9645 {
9646 count++;
9647 test_dq_mask_3 = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9648 if (*argv[count + 1] == 0 || *endp != 0)
9649 test_dq_mask_3 = 0;
9650 }
9651 {
9652 count++;
9653 left_right_flag = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9654 if (*argv[count + 1] == 0 || *endp != 0)
9655 left_right_flag = 0;
9656 }
9657 {
9658 count++;
9659 offset_value = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9660 if (*argv[count + 1] == 0 || *endp != 0)
9661 offset_value = 0;
9662 }
9663 } else {
9664 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
9665 return 1;
9666 }
9667
9668 if (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T7 ||
9669 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_P1) {
9670 writel(ddr_dmc_apd_temp_save, p_ddr_base->ddr_dmc_apd_address);
9671 writel(ddr_dmc_asr_temp_save, p_ddr_base->ddr_dmc_asr_address);
9672 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
9673 count = 0;
9674 test_index = simple_strtoull_ddr(argv[count + 1], &endp, 0);
9675 if (*argv[count + 1] == 0 || *endp != 0)
9676 test_index = 0;
9677 if (test_index / 100)
9678 dmc_ddr_config_channel_id = 1;
9679 else
9680 dmc_ddr_config_channel_id = 0;
9681 test_index = (test_index % 100); //for DDR_PHY 1
9682 dmc_change_channel(dmc_ddr_config_channel_id);
9683 dmc_retraining_ctrl = rd_reg(p_ddr_base->ddr_dmc_lpdd4_retraining_address);
9684 wr_reg(p_ddr_base->ddr_dmc_lpdd4_retraining_address, dmc_retraining_ctrl & (~(1 << 31)));
9685 ddr_dmc_apd_temp_save = readl(p_ddr_base->ddr_dmc_apd_address);
9686 ddr_dmc_asr_temp_save = readl(p_ddr_base->ddr_dmc_asr_address);
9687 }
9688
9689 //printf("lcdlr_max %d,\n", lcdlr_max);
9690 if (left_right_flag == DDR_PARAMETER_RIGHT)
9691 printf("offset right ++ left_right_flag %d,\n", left_right_flag);
9692 if (left_right_flag == DDR_PARAMETER_LEFT)
9693 printf("offset left --left_right_flag %d,\n", left_right_flag);
9694 if (test_index == DMC_TEST_WINDOW_INDEX_ATXDLY)
9695 count_max = 10;
9696 //lcdlr_max = 3 * 32; //0x3ff;
9697
9698 if (test_index == DMC_TEST_WINDOW_INDEX_TXDQSDLY)
9699 count_max = 16;
9700 //lcdlr_max = 16 * 32; //0x3ff;
9701 if (test_index == DMC_TEST_WINDOW_INDEX_RXCLKDLY)
9702 count_max = 16;
9703 //lcdlr_max = 96; //0x3f;
9704 if (test_index == DMC_TEST_WINDOW_INDEX_TXDQDLY)
9705 count_max = 36 * 2;
9706 //lcdlr_max = 8 * 32; //0x1ff;
9707 if (test_index == DMC_TEST_WINDOW_INDEX_RXPBDLY)
9708 count_max = 36 * 2;
9709 //lcdlr_max = 0x3f;
9710 if (test_index == DMC_TEST_WINDOW_INDEX_SOC_VREF) {
9711 count_max = 36 * 1;
9712 //lcdlr_max = 0x3f;
9713 printf(" soc vref rank0 and rank1 share vref dac\n");
9714 }
9715 if (test_index == DMC_TEST_WINDOW_INDEX_SOC_VREF_DAC1) {
9716 count_max = 36 * 1;
9717 //lcdlr_max = 0x3f;
9718 printf(" soc vref rank0 and rank1 share vref dac\n");
9719 }
9720
9721 count = 0;
9722 writel((0), p_ddr_base->ddr_dmc_apd_address);
9723 writel((0), p_ddr_base->ddr_dmc_asr_address);
9724
9725 for (; count < count_max; count++) {
9726 if ((count < 32))
9727 if (test_dq_mask_1 & (1 << (count % 32)))
9728 continue;
9729
9730 if ((count > 31) && (count < 63))
9731 if (test_dq_mask_2 & (1 << (count % 32)))
9732 continue;
9733
9734 if ((count > 63))
9735 if (test_dq_mask_3 & (1 << (count % 32)))
9736 continue;
9737 {
9738 if (left_right_flag == DDR_PARAMETER_RIGHT) {
9739 dwc_window_reg_after_training_update_increas(test_index,
9740 count,
9741 0, offset_value);
9742 }
9743 if (left_right_flag == DDR_PARAMETER_LEFT) {
9744 dwc_window_reg_after_training_update_increas(test_index,
9745 count,
9746 1, offset_value);
9747 }
9748 }
9749 }
9750
9751 writel(ddr_dmc_apd_temp_save, p_ddr_base->ddr_dmc_apd_address);
9752 writel(ddr_dmc_asr_temp_save, p_ddr_base->ddr_dmc_asr_address);
9753 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
9754
9755 if (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T7 ||
9756 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_P1) {
9757 dmc_ddr_config_channel_id = 0;
9758 dmc_change_channel(dmc_ddr_config_channel_id);
9759 }
9760 return 1;
9761}
9762
9763U_BOOT_CMD(
9764 ddr_g12_offset_data, 20, 1, do_ddr_g12_offset_data,
9765 "ddr_g12_offset_data 1 0 0 0 1 3",
9766 "ddr_g12_offset_data test_index mask1 mask2 mask3 left/right offset_value \n"
9767 );
9768
9769#endif
9770
9771int do_ddr_test_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
9772{
9773 check_base_address();
9774
9775 uint32_t dmc_retraining_ctrl = 0;
9776 dmc_retraining_ctrl = rd_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address));
9777 unsigned int ddr_dmc_apd_temp_save, ddr_dmc_asr_temp_save;
9778 ddr_dmc_apd_temp_save = readl(p_ddr_base->ddr_dmc_apd_address);
9779 ddr_dmc_asr_temp_save = readl(p_ddr_base->ddr_dmc_asr_address);
9780
9781 printf("\n ddr test cmd version== %s\n", CMD_VER);
9782 printf("\nargc== 0x%08x\n", argc);
9783 int i;
9784 for (i = 0; i < argc; i++)
9785 printf("\nargv[%d]=%s\n", i, argv[i]);
9786
9787 /* need at least two arguments */
9788 if (argc < 2)
9789 //goto usage;
9790 return 1;
9791 if ((strcmp(argv[1], "h") == 0))
9792 //goto usage;
9793 return 1;
9794 printf("\12nm phy read write register should closed apd and asr function\n");
9795
9796 global_ddr_clk = get_ddr_clk();
9797 printf("\nddr_clk== %dMHz\n", global_ddr_clk);
9798
9799#define DDR_TEST_CMD__NONE 0
9800#define DDR_TEST_CMD__DDR_TEST 1
9801#define DDR_TEST_CMD__DDR_TUNE_ACLCDLR 2
9802#define DDR_TEST_CMD__DDR_TUNE_MAX_CLK 3 //ddr_test_cmd 3 0x8000000 3 1
9803#define DDR_TEST_CMD__DDR_TUNE_ZQ 4
9804#define DDR_TEST_CMD__DDR_TUNE_VREF 5
9805#define DDR_TEST_CMD__DDR_GXTVBB_CROSSTALK 6
9806#define DDR_TEST_CMD__DDR_BANDWIDTH_TEST 7
9807#define DDR_TEST_CMD__DDR_LCDLR_ENV_TUNE 8
9808#define DDR_TEST_CMD__DDR_MODIFY_REG_USE_MASK 9
9809#define DDR_TEST_CMD__DDR_DDR_TUNE_AC_CLK 0xa
9810
9811#define DDR_TEST_CMD__DDR_SETZQ 0x10
9812#define DDR_TEST_CMD__DDR_TUNE_DQS 0x11
9813#define DDR_TEST_CMD__DDR_SET_TEST_START_ADD 0x12
9814#define DDR_TEST_CMD__DDR_TEST_AC_BIT_SETUP_HOLD_MARGIN 0x13
9815#define DDR_TEST_CMD__DDR_TEST_DATA_BIT_SETUP_HOLD_MARGIN 0x14
9816#define DDR_TEST_CMD__DDR_TEST_AC_LANE_BIT_MARGIN 0x15
9817#define DDR_TEST_CMD__DDR_TEST_EE_VOLTAGE_MDLR_STEP 0x16
9818#define DDR_TEST_CMD__DDR_TEST_D2PLL_CMD 0x17
9819#define DDR_TEST_CMD__DDR_TEST_DATA_LANE_BIT_MARGIN 0x18
9820#define DDR_TEST_CMD__DDR4_TUNE_PHY_VREF 0x19
9821#define DDR_TEST_CMD__DDR4_TUNE_DRAM_VREF 0x1A
9822#define DDR_TEST_CMD__DDR4_TUNE_AC_VREF 0x1b
9823#define DDR_TEST_CMD__DDR4_SWEEP_DRAM_CLK_USE_D2PLL 0x1c
9824#define DDR_TEST_CMD__DDR4_TEST_SHIFT_DDR_FREQUENCY 0x1d
9825#define DDR_TEST_CMD__DDR4_TEST_DATA_WRTIE_READ 0x1e
9826#define DDR_TEST_CMD__DDR_TEST_PWM_CMD 0x1f
9827#define DDR_TEST_CMD__DDR_TEST_EE_SI 0x20
9828#define DDR_TEST_CMD__DDR_TEST_VDDQ_SI 0x21
9829#define DDR_TEST_CMD__DDR_TUNE_DDR_DATA_WINDOW_ENV 0x22
9830#define DDR_TEST_CMD__DDR4_TEST_SHIFT_DDR_FREQUENCY_TXL 0x23
9831#define DDR_TEST_CMD__DISPLAY_DDR_INFORMATION 0x24
9832#define DDR_TEST_CMD__OFFSET_LCDLR 0x25
9833#define DDR_TEST_CMD__SET_WATCH_DOG_VALUE 0x26
9834#define DDR_TEST_CMD__DDR_TUNE_DDR_DATA_WINDOW_STICKY 0x27
9835#define DDR_TEST_CMD__DDR4_SWEEP_DRAM_CLK_USE_D2PLL_STICKY 0x28
9836#define DDR_TEST_CMD__DDR4_DDR_BIST_TEST_USE_D2PLL_STICKY 0x29
9837#define DDR_TEST_CMD__DDR_SET_BIST_TEST_SIZE_STICKY_6 0x30
9838#define DDR_TEST_CMD__DDR_SET_UBOOT_STORE_WINDOW 0x31
9839#define DDR_TEST_CMD__DDR_SET_UBOOT_STORE_QUICK_WINDOW 0x32
9840#define DDR_TEST_CMD__DDR_SET_UBOOT_KERNEL_STORE_QUICK_WINDOW 0x33
9841#define DDR_TEST_CMD__DDR_SET_UBOOT_KERNEL_STORE_QUICK_WINDOW_MULTI 0x34
9842#define DDR_TEST_CMD__DDR_SET_UBOOT_KERNEL_WINDOW_SAME_CHANGE 0x35
9843#define DDR_TEST_CMD__DDR_SET_UBOOT_G12_RECONFIG_CMD 0x36
9844#define DDR_TEST_CMD__DISPLAY_G12_DDR_INFORMATION 0x37
9845#define DDR_TEST_CMD__DDR_G12_DMC_TEST 0x38
9846#define DDR_TEST_CMD__DDR_G12_EE_BDLR_TEST 0x39
9847
9848 unsigned int ddr_test_cmd = 0;
9849 unsigned int arg[30] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
9850 char *endp;
9851 ddr_test_cmd = simple_strtoull_ddr(argv[1], &endp, 0);
9852 for (i = 2; i < argc; i++)
9853 arg[i - 2] = simple_strtoull_ddr(argv[i], &endp, 0);
9854 printf("\nddr_test_cmd== 0x%08x\n", ddr_test_cmd);
9855
9856 for (i = 0; i < (argc - 2); i++)
9857 printf("\narg[%08x]=%08x\n", i, arg[i]);
9858
9859 int argc2;
9860 char *argv2[30];
9861
9862 argc2 = argc - 1;
9863 for (i = 1; i < (argc); i++)
9864 argv2[i - 1] = argv[i];
9865 {
9866 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl & (~(1 << 31)));
9867 writel((0), p_ddr_base->ddr_dmc_apd_address);
9868 writel((0), p_ddr_base->ddr_dmc_asr_address);
9869 run_command("dcache off", 0);
9870 run_command("dcache on", 0);
9871 printf("\n cache off on");
9872 switch (ddr_test_cmd) {
9873 case (DDR_TEST_CMD__NONE):
9874 {
9875 printf("\n 0x0 help\n");
9876 printf("\n 0x1 ddrtest ddr_test_cmd 0x1 start_add test_size loops ");
9877 printf("\n 0x2 test aclcdlr ddr_test_cmd 0x2 start_add test_size loops ddr_test_cmd 0x2 a 0 0x8000000 1");
9878 printf("\n 0x3 test max_pllclk ddr_test_cmd 0x3 test_size loops add_freq sub_freq ");
9879 printf("\n 0x4 test zq ddr_test_cmd 0x4 test_size loops add_freq sub_freq drv_odt_flag ");
9880 printf("\n 0x5 test vref ddr_test_cmd 0x5 ");
9881 printf("\n 0x6 test gxtvbb_crosstalk ddr_test_cmd 0x6 loops pattern_flag ");
9882 printf("\n 0x7 test bandwidth ddr_test_cmd 0x7 size loops port sub_id timer_ms ");
9883 printf("\n 0x8 test lcdlr_use_env_uart ddr_test_cmd 0x8 input_src wr_adj_per[] rd_adj_per[][] ");
9884 printf("\n 0x9 test_reg_use_mask ddr_test_cmd 0x9 reg_add value mask ");
9885 printf("\n 0xa test ac_clk ddr_test_cmd 0xa start_add test_size loops ddr_test_cmd 0xa a 0 0x8000000 1 ");
9886 printf("\n 0xb ... ");
9887 printf("\n 0xc ... ");
9888 printf("\n 0xd ... ");
9889 printf("\n 0xe ... ");
9890 printf("\n 0xf ... ");
9891 printf("\n 0x10 test set zq ddr_test_cmd 0x10 zq0pr0 zq1pr0 zq2pr0 ");
9892 printf("\n 0x11 test tune dqs ddr_test_cmd 0x11 a 0 test_size ddr_test_cmd 0x11 a 0 0x80000");
9893 printf("\n 0x12 test set start_add ddr_test_cmd 0x12 start_add ");
9894 printf("\n 0x13 test ac_bit_setup_hold time ddr_test_cmd 0x13 a 0 size method pin_id ddr_test_cmd 0x13 a 0 0x8000000 0 0xc");
9895 printf("\n 0x14 test data_bit_setup_hold time ddr_test_cmd 0x14 a 0 size setup/hold pin_id ddr_test_cmd 0x14 a 0 0x80000 0 3 ");
9896 printf("\n 0x15 test ac_lane_setup_hold ddr_test_cmd 0x15 a 0 size ");
9897 printf("\n 0x16 test ee mdlr ddr_test_cmd 0x16 voltage pwm_id loops ");
9898 printf("\n 0x17 d2pll ddr_test_cmd 0x17 clk zq_ac zq_soc_dram soc_vref dram_vref dec_hex zq_vref 0\n \
9899 example ddr_test_cmd 0x17 1200 0x2aa4a 0x2015995d 50 81 1 50 \n \
9900 or ddr_test_cmd 0x17 1200 0x2aa4a 0x2015995d 0x09 0x20 0 50 \n");
9901 printf("or ddr_test_cmd 0x17 1200 6034 60346034 0 0 0 0 1 \n");
9902 printf("\n 0x18 test data_lane_setup_hold ddr_test_cmd 0x18 a 0 size range start_pin_id end_pin_id ddr_test_cmd 0x18 a 0 0x80000 1 0 96 ");
9903 printf("\n 0x19 test phy vref ddr_test_cmd 0x19 a 0 0x80000 1 seed step vref_all vref_lcdlr_offset test_down_up_step seed_hex_dec \
9904 ddr_test_cmd 0x19 a 0 0x1000000 1 63 1 1 0x8 0 1 ");
9905 printf("\n 0x1a test dram vref ddr_test_cmd 0x1A a 0 0x80000 clear seed step vref_all vref_lcdlr_offset test_down_up_step vref_range seed_hex_dec \
9906 \n setenv ddr_test_ddr4ram_vref ddr_test_cmd 0x1A a 0 0x0800000 0 0x14 1 0 0x8 0 0 0 ; setenv storeboot run ddr_test_ddr4ram_vref ;save;reset ");
9907 printf("\n 0x1b test ac vref ddr_test_cmd 0x1B a 0 0x80000 clear seed step vref_all vref_lcdlr_offset seed_hex_dec");
9908 printf("\n 0x1c sweep dram clk use d2pll_env ddr_test_cmd 0x1c test_size start_freq end_freq test_loops ddr_test_cmd 0x1c 0x8000000 800 1500 1");
9909 printf("\n 0x1d test shift clk ddr_test_cmd 0x1d type delay_ms times");
9910 printf("\n 0x1e test write_read ddr_test_cmd 0x1e write_read pattern_id loop start_add test_size");
9911 printf("\n 0x1f test pwm_cmd ddr_test_cmd 0x1f pwmid pwm_low pwm_high");
9912 printf("\n 0x22 test ddr_window use env ddr_test_cmd 0x22 a 0 test_size watchdog_time \
9913 lane_disable_mask add_test_size setenv bootcmd ddr_test_cmd 0x22 a 0 0x800000 15 0 0x8000000");
9914 printf("\n defenv;save;setenv bootcmd ddr_test_cmd 0x22 a 0 0x800000 18 0x0 0x8000000");
9915 printf("\n setenv env_ddrtest_data_lane 0x22;save;reset");
9916 printf("\n 0x23 test shift ddr frequency ddr_test_cmd 0x23");
9917 printf("\n 0x24 display ddr_information ddr_test_cmd 0x24");
9918 printf("\n 0x25 offset ddr_lcdlr ddr_test_cmd 0x25");
9919 printf("\n 0x26 set watchdog_value ddr_test_cmd 0x26 30");
9920 printf("\n 0x27 test ddr_window use sticky register ddr_test_cmd 0x27 a 0 test_size watchdog_time \
9921 lane_disable_mask add_test_size setenv bootcmd ddr_test_cmd 0x27 a 0 0x800000 15 0 0x8000000");
9922 printf("\n 0x28 sweep dram clk use d2pll_sticky ddr_test_cmd 0x28 test_size start_freq end_freq test_loops ddr_test_cmd 0x28 0x8000000 800 1500 1");
9923 }
9924 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
9925 //return 1;
9926 break;
9927
9928
9929 case (DDR_TEST_CMD__DDR_TEST):
9930 {
9931 do_ddr_test((cmd_tbl_t *)cmdtp, (int)flag, (int)argc2, (argv2));
9932 break;
9933 }
9934 case (DDR_TEST_CMD__DDR_TUNE_ACLCDLR):
9935 break;
9936 case (DDR_TEST_CMD__DDR_DDR_TUNE_AC_CLK):
9937 break;
9938 case (DDR_TEST_CMD__DDR_TUNE_ZQ):
9939 break;
9940 case (DDR_TEST_CMD__DDR_GXTVBB_CROSSTALK):
9941 break;
9942 case (DDR_TEST_CMD__DDR_BANDWIDTH_TEST):
9943 break;
9944 case (DDR_TEST_CMD__DDR_LCDLR_ENV_TUNE):
9945 break;
9946 case (DDR_TEST_CMD__DDR_MODIFY_REG_USE_MASK):
9947 break;
9948 case (DDR_TEST_CMD__DDR_SETZQ):
9949 break;
9950
9951 case (DDR_TEST_CMD__DDR_TUNE_DDR_DATA_WINDOW_STICKY):
9952 break;
9953 case (DDR_TEST_CMD__DDR4_TEST_DATA_WRTIE_READ):
9954 {
9955 printf("\ntest ddr write read \n");
9956
9957 do_ddr_test_write_read((cmd_tbl_t *)cmdtp, (int)flag, (int)argc2, (argv2));
9958 }
9959 break;
9960 case (DDR_TEST_CMD__DDR_SET_UBOOT_G12_RECONFIG_CMD):
9961 {
9962 printf("\nset do_ddr_uboot_reconfig cmd\n");
9963
9964 do_ddr_uboot_new_cmd((cmd_tbl_t *)cmdtp, (int)flag, (int)argc2, (argv2));
9965 }
9966 break;
9967
9968 case (DDR_TEST_CMD__DISPLAY_G12_DDR_INFORMATION):
9969 {
9970 printf("\nshow g12 ddr information\n");
9971 if ((p_ddr_base->chip_id >= DDR_MESON_CPU_MAJOR_ID_C2 &&
9972 p_ddr_base->chip_id <= DDR_MESON_CPU_MAJOR_ID_T5D) ||
9973 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_S4 ||
9974 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T3 ||
9975 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T5W) {
9976 if (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T3) {
9977 dmc_ddr_config_channel_id = 0;
9978 dmc_change_channel(dmc_ddr_config_channel_id);
9979 do_ddr_display_c2_ddr_information((cmd_tbl_t *)cmdtp, (int)flag, (int)argc2, (argv2));
9980 dmc_ddr_config_channel_id = 1;
9981 dmc_change_channel(dmc_ddr_config_channel_id);
9982 do_ddr_display_c2_ddr_information((cmd_tbl_t *)cmdtp, (int)flag, (int)argc2, (argv2));
9983 dmc_ddr_config_channel_id = 0;
9984 dmc_change_channel(dmc_ddr_config_channel_id);
9985 } else {
9986 do_ddr_display_c2_ddr_information((cmd_tbl_t *)cmdtp, (int)flag, (int)argc2, (argv2));
9987 }
9988 } else if (p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T7 ||
9989 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_P1) {
9990 dmc_ddr_config_channel_id = 0;
9991 dmc_change_channel(dmc_ddr_config_channel_id);
9992 do_ddr_display_g12_ddr_information((cmd_tbl_t *)cmdtp, (int)flag, (int)argc2, (argv2));
9993 dmc_ddr_config_channel_id = 1;
9994 dmc_change_channel(dmc_ddr_config_channel_id);
9995 do_ddr_display_g12_ddr_information((cmd_tbl_t *)cmdtp, (int)flag, (int)argc2, (argv2));
9996 dmc_ddr_config_channel_id = 0;
9997 dmc_change_channel(dmc_ddr_config_channel_id);
9998 } else {
9999 do_ddr_display_g12_ddr_information((cmd_tbl_t *)cmdtp, (int)flag, (int)argc2, (argv2));
10000 }
10001 }
10002 break;
10003
10004 case (DDR_TEST_CMD__DDR_G12_DMC_TEST):
10005 break;
10006 case (DDR_TEST_CMD__DDR_G12_EE_BDLR_TEST):
10007 {
10008 printf("\nUboot BDLR test \n");
10009
10010 do_ddr_test_pwm_bdlr((cmd_tbl_t *)cmdtp, (int)flag, (int)argc2, (argv2));
10011 }
10012 break;
10013 }
10014 writel(ddr_dmc_apd_temp_save, p_ddr_base->ddr_dmc_apd_address);
10015 writel(ddr_dmc_asr_temp_save, p_ddr_base->ddr_dmc_asr_address);
10016 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
10017 return 1; //test_start_addr
10018 }
10019
10020//usage:
10021// cmd_usage(cmdtp);
10022 //wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
10023// return 1;
10024}
10025
10026U_BOOT_CMD(
10027 ddr_test_cmd, 30, 1, do_ddr_test_cmd,
10028 "ddr_test_cmd cmd arg1 arg2 arg3...",
10029 "ddr_test_cmd cmd arg1 arg2 arg3... \n dcache off ? \n"
10030 );
10031
10032#ifdef ENABLE_OLD_EXTRA_TEST_CMD
10033int do_ddr_auto_test_window(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
10034{
10035 check_base_address();
10036 global_boot_times = rd_reg(p_ddr_base->preg_sticky_reg0);
10037 printf("\nglobal_boot_times== %d\n", global_boot_times);
10038
10039 printf("\nargc== 0x%08x\n", argc);
10040 printf("\nargc== 0x%08x\n", argc);
10041 int i;
10042 for (i = 0; i < argc; i++)
10043 printf("\nargv[%d]=%s\n", i, argv[i]);
10044
10045 char str[1024] = "";
10046 unsigned int ddr_test_cmd = 0;
10047 unsigned int temp_reg_add = 0;
10048 unsigned int num_arry[32] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
10049
10050 temp_reg_add = (((p_ddr_base->ddr_dmc_sticky0)));
10051 for (i = 0; i < 32; i++) {
10052 num_arry[i] = ddr_rd_8_16bit_on_32reg(temp_reg_add, 8, i);
10053 if ((i == 0) || (i == 16))
10054 printf("\n numarry[%d]", i);
10055 printf(" %d ", num_arry[i]);
10056 }
10057
10058 ddr_test_cmd = num_arry[0];
10059
10060 unsigned int cs0_test_start = 0x1080000;
10061 unsigned int cs0_test_size = DDR_CROSS_TALK_TEST_SIZE;
10062 unsigned int cs1_test_start = 0;
10063 unsigned int cs1_test_size = 0;
10064 unsigned int watchdog_time_s = 0;
10065 unsigned int test_index_enable = 0;
10066 unsigned int all_tighter_enable = 0;
10067 cs0_test_start = ((num_arry[TEST_ARG_CS0_TEST_START_INDEX]) | ((num_arry[TEST_ARG_CS0_TEST_START_INDEX + 1]) << 8) |
10068 ((num_arry[TEST_ARG_CS0_TEST_START_INDEX + 2]) << 16) | ((num_arry[TEST_ARG_CS0_TEST_START_INDEX + 3]) << 24));
10069 cs0_test_size = ((num_arry[TEST_ARG_CS0_TEST_SIZE_INDEX]) | ((num_arry[TEST_ARG_CS0_TEST_SIZE_INDEX + 1]) << 8) |
10070 ((num_arry[TEST_ARG_CS0_TEST_SIZE_INDEX + 2]) << 16) | ((num_arry[TEST_ARG_CS0_TEST_SIZE_INDEX + 3]) << 24));
10071 cs1_test_start = ((num_arry[TEST_ARG_CS1_TEST_START_INDEX]) | ((num_arry[TEST_ARG_CS1_TEST_START_INDEX + 1]) << 8) |
10072 ((num_arry[TEST_ARG_CS1_TEST_START_INDEX + 2]) << 16) | ((num_arry[TEST_ARG_CS1_TEST_START_INDEX + 3]) << 24));
10073 cs1_test_size = ((num_arry[TEST_ARG_CS1_TEST_SIZE_INDEX]) | ((num_arry[TEST_ARG_CS1_TEST_SIZE_INDEX + 1]) << 8) |
10074 ((num_arry[TEST_ARG_CS1_TEST_SIZE_INDEX + 2]) << 16) | ((num_arry[TEST_ARG_CS1_TEST_SIZE_INDEX + 3]) << 24));
10075 watchdog_time_s = ((num_arry[TEST_ARG_WATCHDOG_TIME_SIZE_INDEX]) | ((num_arry[TEST_ARG_WATCHDOG_TIME_SIZE_INDEX + 1]) << 8));
10076 test_index_enable = ((num_arry[TEST_ARG_TEST_INDEX_ENALBE_INDEX]) | ((num_arry[TEST_ARG_TEST_INDEX_ENALBE_INDEX + 1]) << 8));
10077 all_tighter_enable = (num_arry[TEST_ARG_3_ALL_TIGHTER]);
10078 switch (ddr_test_cmd) {
10079 case (DMC_STICKY_UBOOT_WINDOW_MAGIC_1):
10080 if (num_arry[1] == DMC_STICKY_UBOOT_WINDOW_MAGIC_1) {
10081 sprintf(str, "ddr_test_cmd 0x27 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x \
10082 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x", cs0_test_start, cs0_test_size, cs1_test_start, cs1_test_size,
10083 watchdog_time_s, test_index_enable, 0, 0, 0, 0, 0, 0, all_tighter_enable);
10084
10085 printf("\nstr=%s\n", str);
10086
10087 run_command(str, 0);
10088 break;
10089 }
10090 }
10091
10092 return 1;
10093}
10094
10095U_BOOT_CMD(
10096 ddr_auto_test_window, 30, 1, do_ddr_auto_test_window,
10097 "ddr_test_cmd cmd arg1 arg2 arg3...",
10098 "ddr_test_cmd cmd arg1 arg2 arg3... \n dcache off ? \n"
10099 );
10100
10101int do_ddr_auto_scan_drv(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
10102{
10103 check_base_address();
10104#define AUTO_SCAN_DDR3 0
10105#define AUTO_SCAN_DDR4 1
10106#define AUTO_SCAN_LPDDR3 2
10107#define AUTO_SCAN_LPDDR4 3
10108
10109#define AUTO_SCAN_CONFIG_RANK0 0
10110#define AUTO_SCAN_CONFIG_RANK01 1
10111
10112 char *string_print_flag = " window-loop \n";
10113 global_boot_times = rd_reg((p_ddr_base->preg_sticky_reg0));
10114
10115 printf("\nargc== 0x%08x\n", argc);
10116 printf("\nargc== 0x%08x\n", argc);
10117 int i;
10118 for (i = 0; i < argc; i++)
10119 printf("\nargv[%d]=%s\n", i, argv[i]);
10120
10121 unsigned int ddr_type = 0;
10122 unsigned int ddr_channel_rank_config = 0;
10123 unsigned int loop = 0;
10124 char *endp;
10125 if (argc > 1) {
10126 ddr_type = simple_strtoull_ddr(argv[1], &endp, 0);
10127 if (*argv[1] == 0 || *endp != 0)
10128 ddr_type = 0;
10129 }
10130 if (argc > 2) {
10131 ddr_channel_rank_config = simple_strtoull_ddr(argv[2], &endp, 0);
10132 if (*argv[2] == 0 || *endp != 0)
10133 ddr_channel_rank_config = 0;
10134 }
10135 if (argc > 3) {
10136 loop = simple_strtoull_ddr(argv[3], &endp, 0);
10137 if (*argv[3] == 0 || *endp != 0)
10138 loop = 0;
10139 }
10140 unsigned int temp_reg_add = 0;
10141 {
10142 temp_reg_add = (((p_ddr_base->ddr_dmc_sticky0)));
10143 }
10144
10145 char str[1024] = "";
10146
10147 unsigned int counter_loop = 0;
10148 unsigned int ddr_frequency = 0;
10149 unsigned int soc_data_drv_ohm_p = 0; //74 //config soc data pin pull up driver strength,select 0,28,30,32,34,37,40,43,48,53,60,68,80,96,120ohm
10150 unsigned int soc_data_drv_ohm_n = 0; //76
10151 unsigned int soc_data_odt_ohm_p = 0; //78 //config soc data pin odt pull up strength,select 0,28,30,32,34,37,40,43,48,53,60,68,80,96,120ohm
10152 unsigned int soc_data_odt_ohm_n = 0; //80
10153 unsigned int dram_data_drv_ohm = 0; //82 //config dram data pin pull up pull down driver strength,ddr3 select 34,40ohm,ddr4 select 34,48ohm,lpddr4 select 40,48,60,80,120,240ohm
10154 unsigned int dram_data_odt_ohm = 0; //84 //config dram data pin odt pull up down strength,ddr3 select 40,60,120ohm,ddr4 select 34,40,48,60,120,240ohm,lpddr4 select 40,48,60,80,120,240ohm
10155 unsigned int dram_data_wr_odt_ohm = 0; //174 char 1
10156 i = 74 / 2;
10157 soc_data_drv_ohm_p = ddr_rd_8_16bit_on_32reg(temp_reg_add, 16, i);
10158 i = 76 / 2;
10159 soc_data_drv_ohm_n = ddr_rd_8_16bit_on_32reg(temp_reg_add, 16, i);
10160 i = 78 / 2;
10161 soc_data_odt_ohm_p = ddr_rd_8_16bit_on_32reg(temp_reg_add, 16, i);
10162 i = 80 / 2;
10163 soc_data_odt_ohm_n = ddr_rd_8_16bit_on_32reg(temp_reg_add, 16, i);
10164 i = 82 / 2;
10165 dram_data_drv_ohm = ddr_rd_8_16bit_on_32reg(temp_reg_add, 16, i);
10166 i = 84 / 2;
10167 dram_data_odt_ohm = ddr_rd_8_16bit_on_32reg(temp_reg_add, 16, i);
10168 i = 174 / 1;
10169 dram_data_wr_odt_ohm = ddr_rd_8_16bit_on_32reg(temp_reg_add, 8, i);
10170 i = 52 / 2;
10171 ddr_frequency = ddr_rd_8_16bit_on_32reg(temp_reg_add, 16, i);
10172 if (global_boot_times == 1) {
10173 printf("\norg_global_boot_times== %d %s", global_boot_times, string_print_flag);
10174 printf("\nsoc_data_drv_ohm_p=%d %s", soc_data_drv_ohm_p, string_print_flag);
10175 printf("\nsoc_data_drv_ohm_n=%d %s", soc_data_drv_ohm_n, string_print_flag);
10176 printf("\nsoc_data_odt_ohm_p=%d %s", soc_data_odt_ohm_p, string_print_flag);
10177 printf("\nsoc_data_odt_ohm_n=%d %s", soc_data_odt_ohm_n, string_print_flag);
10178 printf("\ndram_data_drv_ohm=%d %s", dram_data_drv_ohm, string_print_flag);
10179 printf("\ndram_data_odt_ohm=%d %s", dram_data_odt_ohm, string_print_flag);
10180 printf("\ndram_data_wr_odt_ohm=%d %s", dram_data_wr_odt_ohm, string_print_flag);
10181 }
10182 unsigned int soc_data_drv_ohm_p_t[] = { 34, 40, 48, 60 };
10183
10184 unsigned int dram_data_odt_ohm_t_ddr3[] = { 40, 60, 120 }; //ddr3
10185 unsigned int dram_data_odt_ohm_t_ddr4[] = { 40, 48, 60, 120 }; //ddr4
10186 unsigned int dram_data_odt_ohm_t_lpddr4[] = { 40, 48, 60, 120 }; //lpddr4
10187
10188 unsigned int dram_data_drv_ohm_t_ddr3[] = { 34, 40 }; //ddr3
10189 unsigned int dram_data_drv_ohm_t_ddr4[] = { 34, 48 }; //ddr4
10190 unsigned int dram_data_drv_ohm_t_lpddr4[] = { 40, 48, 60 }; //lpddr4
10191
10192 unsigned int soc_data_odt_ohm_p_t[] = { 40, 48, 60, 80, 120 };
10193 unsigned int soc_data_odt_ohm_n_t[] = { 40, 48, 60, 80, 120 };
10194
10195 unsigned int dram_data_wr_odt_ohm_t_ddr3[] = { 60, 120, 0 }; //ddr3
10196 unsigned int dram_data_wr_odt_ohm_t_ddr4[] = { 80, 120, 0 }; //ddr4
10197
10198 unsigned int *p_soc_data_drv_ohm_p = NULL;
10199 unsigned int *p_soc_data_odt_ohm_p = NULL;
10200 unsigned int *p_soc_data_odt_ohm_n = NULL;
10201
10202
10203 unsigned int *p_dram_data_drv_ohm = NULL;
10204 unsigned int *p_dram_data_odt_ohm = NULL;
10205 unsigned int *p_dram_data_wr_odt_ohm = NULL;
10206
10207 p_soc_data_drv_ohm_p = soc_data_drv_ohm_p_t;
10208 p_soc_data_odt_ohm_p = soc_data_odt_ohm_p_t;
10209 p_soc_data_odt_ohm_n = soc_data_odt_ohm_n_t;
10210
10211
10212 p_dram_data_drv_ohm = dram_data_drv_ohm_t_ddr3;
10213 p_dram_data_odt_ohm = dram_data_odt_ohm_t_ddr3;
10214 p_dram_data_wr_odt_ohm = dram_data_wr_odt_ohm_t_ddr3;
10215
10216 unsigned int max_counter_loop_w1 = (sizeof(soc_data_drv_ohm_p_t)) / (sizeof(soc_data_drv_ohm_p_t[0]));
10217 unsigned int max_counter_loop_w2 = (sizeof(dram_data_odt_ohm_t_ddr3)) / (sizeof(dram_data_odt_ohm_t_ddr3[0]));
10218 unsigned int max_counter_loop_r1 = (sizeof(dram_data_drv_ohm_t_ddr3)) / (sizeof(dram_data_drv_ohm_t_ddr3[0]));
10219 unsigned int max_counter_loop_r2 = (sizeof(soc_data_odt_ohm_p_t)) / (sizeof(soc_data_odt_ohm_p_t[0]));
10220 unsigned int max_counter_loop_wr1 = 1;
10221 if (ddr_channel_rank_config)
10222 max_counter_loop_wr1 = (sizeof(dram_data_wr_odt_ohm_t_ddr3)) / (sizeof(dram_data_wr_odt_ohm_t_ddr3[0]));
10223 if (ddr_type == AUTO_SCAN_DDR4) {
10224 p_dram_data_drv_ohm = dram_data_drv_ohm_t_ddr4;
10225 p_dram_data_odt_ohm = dram_data_odt_ohm_t_ddr4;
10226 p_dram_data_wr_odt_ohm = dram_data_wr_odt_ohm_t_ddr4;
10227 max_counter_loop_w2 = (sizeof(dram_data_odt_ohm_t_ddr4)) / (sizeof(dram_data_odt_ohm_t_ddr4[0]));
10228 max_counter_loop_r1 = (sizeof(dram_data_drv_ohm_t_ddr4)) / (sizeof(dram_data_drv_ohm_t_ddr4[0]));
10229
10230 if (ddr_channel_rank_config)
10231 max_counter_loop_wr1 = (sizeof(dram_data_wr_odt_ohm_t_ddr4)) / (sizeof(dram_data_wr_odt_ohm_t_ddr4[0]));
10232 }
10233 if (ddr_type == AUTO_SCAN_LPDDR4) {
10234 p_dram_data_drv_ohm = dram_data_drv_ohm_t_lpddr4;
10235 p_dram_data_odt_ohm = dram_data_odt_ohm_t_lpddr4;
10236 max_counter_loop_w2 = (sizeof(dram_data_odt_ohm_t_lpddr4)) / (sizeof(dram_data_odt_ohm_t_lpddr4[0]));
10237 max_counter_loop_r1 = (sizeof(dram_data_drv_ohm_t_lpddr4)) / (sizeof(dram_data_drv_ohm_t_lpddr4[0]));
10238 max_counter_loop_r2 = (sizeof(soc_data_odt_ohm_n_t)) / (sizeof(soc_data_odt_ohm_n_t[0]));
10239
10240 if (ddr_channel_rank_config)
10241 max_counter_loop_wr1 = 1;
10242 }
10243
10244 unsigned int max_counter_total = (max_counter_loop_w1 * max_counter_loop_w2 + max_counter_loop_r1 * max_counter_loop_r2 + 2) * max_counter_loop_wr1;
10245 //add 2 times recover
10246 //each array test 2 times ,for maybe 1times will fail,then next time will recovery
10247 //jiaxing 20181114
10248 counter_loop = (((global_boot_times - 1) / 2) % max_counter_total);
10249 dram_data_wr_odt_ohm = 0;
10250 if (max_counter_loop_wr1 > 1)
10251 dram_data_wr_odt_ohm = p_dram_data_wr_odt_ohm[(counter_loop / (max_counter_loop_w1 * max_counter_loop_w2 + max_counter_loop_r1 * max_counter_loop_r2 + 2))];
10252 if ((counter_loop % (max_counter_loop_w1 * max_counter_loop_w2 + max_counter_loop_r1 * max_counter_loop_r2 + 2)) < (max_counter_loop_w1 * max_counter_loop_w2)) {
10253 soc_data_drv_ohm_p = p_soc_data_drv_ohm_p[(((counter_loop % (max_counter_loop_w1 * max_counter_loop_w2 + max_counter_loop_r1 * max_counter_loop_r2 + 2))) % max_counter_loop_w1)];
10254 soc_data_drv_ohm_n = soc_data_drv_ohm_p;
10255 dram_data_odt_ohm = p_dram_data_odt_ohm[(((counter_loop % (max_counter_loop_w1 * max_counter_loop_w2 + max_counter_loop_r1 * max_counter_loop_r2 + 2))) / max_counter_loop_w1) % max_counter_loop_w2];
10256 } else if ((counter_loop % (max_counter_loop_w1 * max_counter_loop_w2 + max_counter_loop_r1 * max_counter_loop_r2 + 2)) == ((max_counter_loop_w1 * max_counter_loop_w2) + 0)) {
10257 ddr_test_watchdog_reset_system();
10258 } else if ((counter_loop % (max_counter_loop_w1 * max_counter_loop_w2 + max_counter_loop_r1 * max_counter_loop_r2 + 2)) < (max_counter_loop_w1 * max_counter_loop_w2 + max_counter_loop_r1 * max_counter_loop_r2 + 2 - 1)) {
10259 dram_data_drv_ohm = p_dram_data_drv_ohm[((((counter_loop % (max_counter_loop_w1 * max_counter_loop_w2 + max_counter_loop_r1 * max_counter_loop_r2 + 2))) - (max_counter_loop_w1 * max_counter_loop_w2 + 1)) % max_counter_loop_r1)];
10260 soc_data_odt_ohm_p = p_soc_data_odt_ohm_p[((((counter_loop % (max_counter_loop_w1 * max_counter_loop_w2 + max_counter_loop_r1 * max_counter_loop_r2 + 2))) - (max_counter_loop_w1 * max_counter_loop_w2 + 1)) / max_counter_loop_r1)];
10261 soc_data_odt_ohm_n = 0;
10262 if (ddr_type == CONFIG_DDR_TYPE_LPDDR4) {
10263 soc_data_odt_ohm_p = 0;
10264 soc_data_odt_ohm_n = p_soc_data_odt_ohm_n[((((counter_loop % (max_counter_loop_w1 * max_counter_loop_w2 + max_counter_loop_r1 * max_counter_loop_r2 + 2))) - (max_counter_loop_w1 * max_counter_loop_w2 + 1)) / max_counter_loop_r1)];
10265 }
10266 } else if ((counter_loop % (max_counter_loop_w1 * max_counter_loop_w2 + max_counter_loop_r1 * max_counter_loop_r2 + 2)) == (max_counter_loop_w1 * max_counter_loop_w2 + max_counter_loop_r1 * max_counter_loop_r2 + 2 - 1)) {
10267 ddr_test_watchdog_reset_system();
10268 }
10269 printf("\nglobal_boot_times== %d %s", global_boot_times, string_print_flag);
10270
10271 if (loop)
10272 if (((global_boot_times - 1) / 2) > max_counter_total)
10273 return 1;
10274 printf("\nmax_counter=%d %d %s", max_counter_total, max_counter_total * 2, string_print_flag);
10275 printf("\nsoc_data_drv_ohm_p=%d %s", soc_data_drv_ohm_p, string_print_flag);
10276 printf("\nsoc_data_drv_ohm_n=%d %s", soc_data_drv_ohm_n, string_print_flag);
10277 printf("\nsoc_data_odt_ohm_p=%d %s", soc_data_odt_ohm_p, string_print_flag);
10278 printf("\nsoc_data_odt_ohm_n=%d %s", soc_data_odt_ohm_n, string_print_flag);
10279 printf("\ndram_data_drv_ohm=%d %s", dram_data_drv_ohm, string_print_flag);
10280 printf("\ndram_data_odt_ohm=%d %s", dram_data_odt_ohm, string_print_flag);
10281 printf("\ndram_data_wr_odt_ohm=%d %s", dram_data_wr_odt_ohm, string_print_flag);
10282 {
10283 if (soc_data_drv_ohm_p) {
10284 sprintf(str, "ddr_test_cmd 0x36 0x20180030 0x1 74 %d 2 0 ",
10285 soc_data_drv_ohm_p);
10286 printf("\nstr=%s\n", str);
10287 run_command(str, 0);
10288 }
10289 if (soc_data_drv_ohm_n) {
10290 sprintf(str, "ddr_test_cmd 0x36 0x20180030 0x1 76 %d 2 0 ",
10291 soc_data_drv_ohm_n);
10292 printf("\nstr=%s\n", str);
10293 run_command(str, 0);
10294 }
10295 if (soc_data_odt_ohm_p) {
10296 sprintf(str, "ddr_test_cmd 0x36 0x20180030 0x1 78 %d 2 0 ",
10297 soc_data_odt_ohm_p);
10298 printf("\nstr=%s\n", str);
10299 run_command(str, 0);
10300 }
10301 if (soc_data_odt_ohm_n) {
10302 sprintf(str, "ddr_test_cmd 0x36 0x20180030 0x1 80 %d 2 0 ",
10303 soc_data_odt_ohm_n);
10304 printf("\nstr=%s\n", str);
10305 run_command(str, 0);
10306 }
10307 if (dram_data_drv_ohm) {
10308 sprintf(str, "ddr_test_cmd 0x36 0x20180030 0x1 82 %d 2 0 ",
10309 dram_data_drv_ohm);
10310 printf("\nstr=%s\n", str);
10311 run_command(str, 0);
10312 }
10313 if (dram_data_odt_ohm) {
10314 sprintf(str, "ddr_test_cmd 0x36 0x20180030 0x1 84 %d 2 0 ",
10315 dram_data_odt_ohm);
10316 printf("\nstr=%s\n", str);
10317 run_command(str, 0);
10318 }
10319 {
10320 sprintf(str, "ddr_test_cmd 0x36 0x20180030 0x1 174 %d 1 0 ",
10321 dram_data_wr_odt_ohm);
10322 printf("\nstr=%s\n", str);
10323 run_command(str, 0);
10324 }
10325
10326 sprintf(str, "g12_d2pll %d 0x12 0x6 0 0x0 0 0 0 0x800000 0 1 ", ddr_frequency);
10327 printf("\nstr=%s\n", str);
10328 run_command(str, 0);
10329 }
10330
10331 return 1;
10332}
10333#endif
10334
10335unsigned char temp_sha2[SHA256_SUM_LEN];
10336int do_verify_flash_ddr_parameter(char log_level)
10337{
10338 unsigned count = 0;
10339 unsigned error = 0;
10340 unsigned ret = 0;
10341
10342 if ((p_ddr_base->chip_id >= DDR_MESON_CPU_MAJOR_ID_C2 &&
10343 p_ddr_base->chip_id <= DDR_MESON_CPU_MAJOR_ID_T5D) ||
10344 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_S4 ||
10345 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T3 ||
10346 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T5W) {
10347 char temp_buf[((sizeof(ddr_sha_t_c2) + 511) / 512) * 512] = { 0 };
10348 unsigned ddr_set_size = 0;
10349 ddr_set_size = sizeof(ddr_sha_t_c2);
10350 #if 1
10351 uint32_t loop = 0;
10352 //for C2 T5/T5D ddr window fast boot no support dfe vref1
10353 if ((p_ddr_base->chip_id >= DDR_MESON_CPU_MAJOR_ID_C2 &&
10354 p_ddr_base->chip_id <= DDR_MESON_CPU_MAJOR_ID_T5D) ||
10355 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T5W) {
10356 ddr_set_size = sizeof(ddr_set_t_c2) - (44 * 2); //sizeof(board_phase_setting_ps_t.soc_bit_vref_dac1);
10357 unsigned char *sha_t_chip_id;
10358 sha_t_chip_id = (unsigned char *)((uint64_t)(&(ddr_sha_c2.sha_chip_id)) - (44 * 2));
10359 for (loop = 0; loop < MESON_CPU_CHIP_ID_SIZE; loop++) //update chip id
10360 ddr_sha_c2.sha_chip_id[loop] = sha_t_chip_id[loop];
10361 }
10362 #endif
10363
10364#ifdef USE_FOR_UBOOT_2018
10365 extern int store_rsv_read(const char *name, size_t size, void *buf);
10366
10367 ret = store_rsv_read("ddr-parameter", ((sizeof(ddr_sha_t_c2) + 511) / 512) * 512, (uint8_t *)(temp_buf));
10368
10369#else
10370 extern int store_ddr_parameter_read(uint8_t *buffer, uint32_t length);
10371
10372 ret = store_ddr_parameter_read((uint8_t *)(temp_buf), ((sizeof(ddr_sha_t_c2) + 511) / 512) * 512);
10373#endif
10374 char *s = temp_buf;
10375 char *d = (char *)(&ddr_sha_c2);
10376
10377 for (count = 0; count < sizeof(ddr_sha_t_c2); count++) {
10378 *d = *s;
10379 s++;
10380 d++;
10381 }
10382
10383 for (count = 0; count < SHA256_SUM_LEN; count++)
10384 ((temp_sha2[count]) = (ddr_sha_c2.sha2[count]));
10385
10386 sha256_csum_wd_internal((uint8_t *)(&(ddr_sha_c2.ddrs)), ddr_set_size, ddr_sha_c2.sha2, 0);
10387
10388 for (count = 0; count < SHA256_SUM_LEN; count++) {
10389 if ((temp_sha2[count]) != (ddr_sha_c2.sha2[count]))
10390 error++;
10391
10392 if (log_level == 0)
10393 printf("\nread sha[%08x] %08x,calu %08x", count, (ddr_sha_c2.sha2[count]), (temp_sha2[count]));
10394 }
10395
10396#define DDR_FUNC_FAST_BOOT_CHECK_CHIP_ID (1 << 30)
10397 // if ((ddr_sha_c2.ddrs.cfg_board_common_setting.ddr_func) & DDR_FUNC_FAST_BOOT_CHECK_CHIP_ID)
10398 {
10399 for (count = 0; count < MESON_CPU_CHIP_ID_SIZE; count++) {
10400 if ((ddr_sha_c2.sha_chip_id[count]) != (global_chip_id[count]))
10401 error++;
10402
10403 if (log_level == 0)
10404 printf("\nglobal_chip_id[%08x] %08x,read %08x", count, (global_chip_id[count]), (ddr_sha_c2.sha_chip_id[count]));
10405 }
10406 }
10407
10408 return error;
10409 }
10410 char temp_buf[((sizeof(ddr_sha_t) + 511) / 512) * 512] = { 0 };
10411
10412#ifdef USE_FOR_UBOOT_2018
10413 extern int store_rsv_read(const char *name, size_t size, void *buf);
10414
10415 ret = store_rsv_read("ddr-parameter", ((sizeof(ddr_sha_t) + 511) / 512) * 512, (uint8_t *)(temp_buf));
10416
10417
10418#else
10419 extern int store_ddr_parameter_read(uint8_t *buffer, uint32_t length);
10420
10421 ret = store_ddr_parameter_read((uint8_t *)(temp_buf), ((sizeof(ddr_sha_t) + 511) / 512) * 512);
10422#endif
10423 if (ret)
10424 printf("\nstore_rsv_read ret=%d", ret);
10425 char *s = temp_buf;
10426 char *d = (char *)(&ddr_sha);
10427
10428 for (count = 0; count < sizeof(ddr_sha_t); count++) {
10429 *d = *s;
10430 s++;
10431 d++;
10432 }
10433
10434 for (count = 0; count < SHA256_SUM_LEN; count++)
10435 ((temp_sha2[count]) = (ddr_sha.sha2[count]));
10436
10437 sha256_csum_wd_internal((uint8_t *)(&(ddr_sha.ddrs)), sizeof(ddr_set_t), ddr_sha.sha2, 0);
10438
10439 for (count = 0; count < SHA256_SUM_LEN; count++) {
10440 if ((temp_sha2[count]) != (ddr_sha.sha2[count]))
10441 error++;
10442
10443 if (log_level == 0)
10444 printf("\nread sha[%08x] %08x,calu %08x", count, (ddr_sha.sha2[count]), (temp_sha2[count]));
10445 }
10446
10447#define DDR_FUNC_FAST_BOOT_CHECK_CHIP_ID (1 << 30)
10448
10449 if ((ddr_sha.ddrs.ddr_func) & DDR_FUNC_FAST_BOOT_CHECK_CHIP_ID) {
10450 for (count = 0; count < MESON_CPU_CHIP_ID_SIZE; count++) {
10451 if ((ddr_sha.sha_chip_id[count]) != (global_chip_id[count]))
10452 error++;
10453
10454 if (log_level == 0)
10455 printf("\nglobal_chip_id[%08x] %08x,read %08x", count, (global_chip_id[count]), (ddr_sha.sha_chip_id[count]));
10456 }
10457 }
10458 return error;
10459} /* do_verify_flash_ddr_parameter */
10460
10461uint32_t enable_ddr_check_boot_reason = 0;
10462uint32_t boot_reason = 0;
10463#define HOT_BOOT_MAGIC 0x99887766
10464#define HOT_BOOT_STICKY_ADD (p_ddr_base->preg_sticky_reg0 + (6 << 2))
10465#define AMLOGIC_COLD_BOOT 0
10466int do_ddr_auto_fastboot_check_c2(char auto_window_test_enable_item,
10467 uint32_t auto_window_test_dq_size,
10468 char pattern_dis_scramble,
10469 uint32_t stick_dmc_ddr_window_test_read_vref_offset_value,
10470 uint32_t skip_window_test_enable)
10471{
10472 uint32_t ddr_set_size = 0;
10473 uint32_t need_ddr_window_test = 0;
10474 char str[1024] = "";
10475 int verify_error = 0;
10476
10477 verify_error = do_verify_flash_ddr_parameter(1);
10478
10479 if ((verify_error) == 0) {
10480 if ((ddr_sha_c2.ddrs.cfg_board_common_setting.fast_boot[0]) == 0xff) {
10481 printf("\nuboot auto fast boot check flash data is ok return \n");
10482 return 1;
10483 }
10484 }
10485 enable_ddr_check_boot_reason = 0;
10486 enable_ddr_check_boot_reason = env_to_a_num("enable_ddr_check_boot_reason");
10487 printf("\nenable_ddr_check_boot_reason==%d \n", enable_ddr_check_boot_reason);
10488 printf("\nddr_fast_boot_enable_flag==%d \n", env_to_a_num("ddr_fast_boot_enable_flag"));
10489 ddr_set_t_c2 *ddr_set_t_p = NULL;
10490 ddr_set_t_p = (ddr_set_t_c2 *)(ddr_set_t_p_array_c2);
10491 uint32_t ddr_set_add = 0;
10492
10493 ddr_set_add = (uint32_t)(uint64_t)(ddr_set_t_p);
10494 ddr_set_size = sizeof(ddr_set_t_c2);
10495 printf("\nddr_set_t_p==0x%08x\n", ddr_set_add);
10496
10497 uint32_t dmc_retraining_ctrl = 0;
10498 dmc_retraining_ctrl = rd_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address));
10499 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address),
10500 dmc_retraining_ctrl & (~(1 << 31)));
10501 uint32_t write_size = 0;
10502
10503 do_read_c2_ddr_training_data(1, ddr_set_t_p);
10504 #if 1
10505 uint32_t loop = 0;
10506 //for C2 T5/T5D ddr window fast boot no support dfe vref1
10507 if ((p_ddr_base->chip_id >= DDR_MESON_CPU_MAJOR_ID_C2 &&
10508 p_ddr_base->chip_id <= DDR_MESON_CPU_MAJOR_ID_T5D) ||
10509 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T5W) {
10510 //sizeof(board_phase_setting_ps_t.soc_bit_vref_dac1);
10511 ddr_set_size = sizeof(ddr_set_t_c2) - (44 * 2);
10512 unsigned char *sha_t_chip_id;
10513 sha_t_chip_id = (unsigned char *)((uint64_t)(&(ddr_sha_c2.sha_chip_id)) - (44 * 2));
10514 for (loop = 0; loop < MESON_CPU_CHIP_ID_SIZE; loop++) //update chip id
10515 sha_t_chip_id[loop] = global_chip_id[loop];
10516 }
10517 #endif
10518 write_size = ((ddr_set_size + SHA256_SUM_LEN +
10519 MESON_CPU_CHIP_ID_SIZE + 511) / 512) * 512;
10520
10521 if ((ddr_set_t_p->cfg_board_common_setting.fast_boot[3] & 0xc0) &&
10522 (ddr_set_t_p->cfg_board_common_setting.fast_boot[3] & 0x3f)) {
10523 enable_ddr_check_boot_reason = 0;
10524
10525 if (ddr_set_t_p->cfg_board_common_setting.fast_boot[0] > 0 &&
10526 ddr_set_t_p->cfg_board_common_setting.fast_boot[0] < 0xff) {
10527 (ddr_set_t_p->cfg_board_common_setting.fast_boot[0]) = 0xfe;
10528 (verify_error) = 0;
10529 }
10530 }
10531
10532 if ((ddr_set_t_p->cfg_board_common_setting.fast_boot[0])) {
10533 printf("\nuboot enable auto fast boot function\n");
10534
10535 if ((verify_error)) {
10536 printf("\nuboot auto fast boot check verify data happen wrong \n");
10537 (ddr_set_t_p->cfg_board_common_setting.fast_boot[0]) = 1;
10538 }
10539 } else {
10540 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
10541 return 1;
10542 }
10543
10544 if (enable_ddr_check_boot_reason) {
10545 boot_reason = 0; //ddr_set_t_p->boot_reason
10546 {
10547 if ((((readl(p_ddr_base->ddr_boot_reason_address) >> 0) & 0xf) == AMLOGIC_COLD_BOOT) && ((rd_reg(HOT_BOOT_STICKY_ADD)) == HOT_BOOT_MAGIC))
10548 boot_reason = 1;
10549
10550 if (ddr_set_t_p->cfg_board_common_setting.fast_boot[0] == 0xfe)
10551 boot_reason = 2;
10552 }
10553 printf("\nboot_reason=%08x \n", (boot_reason));
10554 printf("\nHOT_BOOT_STICKY_ADD=%08x \n", (rd_reg(HOT_BOOT_STICKY_ADD)));
10555 wr_reg(HOT_BOOT_STICKY_ADD, HOT_BOOT_MAGIC);
10556 printf("\nHOT_BOOT_STICKY_ADD=%08x \n", (rd_reg(HOT_BOOT_STICKY_ADD)));
10557
10558 if (boot_reason == 0) {
10559 if ((ddr_set_t_p->cfg_board_common_setting.fast_boot[0]) < 0xfe) {
10560 need_ddr_window_test = 1;
10561 sprintf(str, "setenv initargs ${initargs} need_ddr_window_test=%d", need_ddr_window_test);
10562 printf("\nstr=%s\n", str);
10563 run_command(str, 0);
10564 sprintf(str, "setenv bootargs ${bootargs} need_ddr_window_test=%d", need_ddr_window_test);
10565 printf("\nstr=%s\n", str);
10566 run_command(str, 0);
10567 } else {
10568 sprintf(str, "setenv initargs ${initargs} need_ddr_window_test=%d", need_ddr_window_test);
10569 printf("\nstr=%s\n", str);
10570 run_command(str, 0);
10571 sprintf(str, "setenv bootargs ${bootargs} need_ddr_window_test=%d", need_ddr_window_test);
10572 printf("\nstr=%s\n", str);
10573 run_command(str, 0);
10574 }
10575 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
10576 return 1;
10577 } else {
10578 sprintf(str, "setenv initargs ${initargs} need_ddr_window_test=%d", need_ddr_window_test);
10579 printf("\nstr=%s\n", str);
10580 run_command(str, 0);
10581 sprintf(str, "setenv bootargs ${bootargs} need_ddr_window_test=%d", need_ddr_window_test);
10582 printf("\nstr=%s\n", str);
10583 run_command(str, 0);
10584 }
10585 }
10586
10587 if ((ddr_set_t_p->cfg_board_common_setting.fast_boot[0]) == 0xff) {
10588 printf("\nuboot auto fast boot auto window test is done \n");
10589 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
10590 return 1;
10591 }
10592
10593 if (skip_window_test_enable) {
10594 printf("enable skip window test fast boot mode! \n");
10595 ddr_set_t_p->cfg_board_common_setting.fast_boot[0] = 0xfe;
10596 }
10597 printf("\n(ddr_set_t_p->cfg_board_common_setting.fast_boot[0])==0x%08x\n", (ddr_set_t_p->cfg_board_common_setting.fast_boot[0]));
10598
10599 if ((ddr_set_t_p->cfg_board_common_setting.fast_boot[0]) < 0xfe) {
10600 printf("\nuboot auto fast boot auto window test begin \n");
10601 {
10602 ddr_set_t_p->cfg_board_common_setting.fast_boot[0] = 0xfd; //0xfd for check unexcept power off status
10603 sha256_csum_wd_internal((unsigned char *)(uint64_t)ddr_set_add, ddr_set_size, ddr_sha_c2.sha2, 0);
10604 write_size = ((ddr_set_size + SHA256_SUM_LEN + MESON_CPU_CHIP_ID_SIZE + 511) / 512) * 512;
10605 {
10606 ddr_do_store_ddr_parameter_ops((uint8_t *)(unsigned long)(ddr_set_add - SHA256_SUM_LEN), write_size);
10607 }
10608 sprintf(str, "g12_d2pll %d 0x11 %d 0 0 0 0 %d 0x%08x 0 %d", ddr_set_t_p->cfg_board_SI_setting_ps[0].DRAMFreq, auto_window_test_enable_item, stick_dmc_ddr_window_test_read_vref_offset_value, auto_window_test_dq_size, pattern_dis_scramble);
10609 printf("\nstr=%s\n", str);
10610
10611 run_command(str, 0);
10612 }
10613 return 1;
10614 }
10615
10616 if ((ddr_set_t_p->cfg_board_common_setting.fast_boot[0]) == 0xfe) {
10617#if 0
10618 char dmc_test_worst_window_rx = 0;
10619 char dmc_test_worst_window_tx = 0;
10620
10621 {
10622 dwc_ddrphy_apb_wr((0 << 20) | (0xd << 16) | (0 << 12) | (0x0), 0); // DWC_DDRPHYA_APBONLY0_MicroContMuxSel
10623
10624 dmc_test_worst_window_tx = dwc_ddrphy_apb_rd((0 << 20) | (1 << 16) | (0 << 12) | (0x0c2));
10625 dmc_test_worst_window_rx = dwc_ddrphy_apb_rd((0 << 20) | (1 << 16) | (0 << 12) | (0x0c3));
10626 printf("\ndmc_test_worst_window_tx =%d \n", dmc_test_worst_window_tx);
10627 printf("\ndmc_test_worst_window_rx=%d \n", dmc_test_worst_window_rx);
10628
10629 if (dmc_test_worst_window_tx > 30)
10630 dmc_test_worst_window_tx = 30;
10631
10632 if (dmc_test_worst_window_rx > 30)
10633 dmc_test_worst_window_rx = 30;
10634 ddr_set_t_p->fast_boot[1] = (((dmc_test_worst_window_tx / 2) << 4)) | (((dmc_test_worst_window_rx / 2)));
10635 }
10636#endif
10637 ddr_set_t_p->cfg_board_common_setting.fast_boot[0] = 0xff;
10638 {
10639 printf("\nuboot auto fast boot auto window test finish \n");
10640
10641 if (ddr_set_t_p->cfg_board_common_setting.fast_boot[2]) {
10642 if ((ddr_set_t_p->cfg_board_common_setting.fast_boot[2]) & 0x7) {
10643 if (((ddr_set_t_p->cfg_board_common_setting.fast_boot[2]) & 0x8))
10644 sprintf(str, "ddr_g12_offset_data 3 0x0 0 0 1 %d ", (ddr_set_t_p->cfg_board_common_setting.fast_boot[2]) & 0x7);
10645 else
10646 sprintf(str, "ddr_g12_offset_data 3 0x0 0 0 2 %d ", (ddr_set_t_p->cfg_board_common_setting.fast_boot[2]) & 0x7);
10647 printf("\nstr=%s\n", str);
10648
10649 run_command(str, 0);
10650 }
10651
10652 if ((ddr_set_t_p->cfg_board_common_setting.fast_boot[2]) & 0x70) {
10653 if (((ddr_set_t_p->cfg_board_common_setting.fast_boot[2]) & 0x80))
10654 sprintf(str, "ddr_g12_offset_data 2 0x0 0 0 1 %d ", ((ddr_set_t_p->cfg_board_common_setting.fast_boot[2]) >> 4) & 0x7);
10655 else
10656 sprintf(str, "ddr_g12_offset_data 2 0x0 0 0 2 %d ", ((ddr_set_t_p->cfg_board_common_setting.fast_boot[2]) >> 4) & 0x7);
10657 printf("\nstr=%s\n", str);
10658
10659 run_command(str, 0);
10660 }
10661 sprintf(str, "ddr_fast_boot 1 ");
10662 printf("\nstr=%s\n", str);
10663 run_command(str, 0);
10664 } else {
10665 sha256_csum_wd_internal((unsigned char *)(uint64_t)ddr_set_add, ddr_set_size, ddr_sha_c2.sha2, 0);
10666 ddr_do_store_ddr_parameter_ops((uint8_t *)(unsigned long)(ddr_set_add - SHA256_SUM_LEN), write_size);
10667 }
10668
10669 if ((enable_ddr_check_boot_reason)) {
10670 if (boot_reason) {
10671 sprintf(str, "systemoff");
10672 printf("\nstr=%s\n", str);
10673 run_command(str, 0);
10674 }
10675 }
10676 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
10677 return 1;
10678 }
10679 }
10680 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
10681 return 1;
10682} /* do_ddr_auto_fastboot_check_c2 */
10683
10684int do_ddr_auto_fastboot_check(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
10685{
10686 check_base_address();
10687#define DMC_TEST_SLT_ENABLE_DDR_AUTO_FAST_BOOT (1 << 5)
10688#define AUTO_WINDOW_TEST_ENABLE_ITEM ((1 << 1) | (1 << 2))
10689 char *endp;
10690 char auto_window_test_enable_item = DMC_TEST_SLT_ENABLE_DDR_AUTO_FAST_BOOT;
10691 uint32_t auto_window_test_dq_size = 0;
10692 char pattern_dis_scramble = 0;
10693 uint32_t stick_dmc_ddr_window_test_read_vref_offset_value = 0;
10694 uint32_t ddr_set_size = 0;
10695 uint32_t need_ddr_window_test = 0;
10696 uint32_t skip_window_test_enable = 0;
10697 if (argc > 1) {
10698 auto_window_test_enable_item = simple_strtoull_ddr(argv[1], &endp, 0);
10699 if (*argv[1] == 0 || *endp != 0)
10700 auto_window_test_enable_item = DMC_TEST_SLT_ENABLE_DDR_AUTO_FAST_BOOT;
10701 }
10702 if (argc > 2) {
10703 auto_window_test_dq_size = simple_strtoull_ddr(argv[2], &endp, 0);
10704 if (*argv[2] == 0 || *endp != 0)
10705 auto_window_test_dq_size = 0;
10706 }
10707 if (argc > 3) {
10708 pattern_dis_scramble = simple_strtoull_ddr(argv[3], &endp, 0);
10709 if (*argv[3] == 0 || *endp != 0)
10710 pattern_dis_scramble = 0;
10711 }
10712 if (argc > 4) {
10713 stick_dmc_ddr_window_test_read_vref_offset_value = simple_strtoull_ddr(argv[4], &endp, 0);
10714 if (*argv[4] == 0 || *endp != 0)
10715 stick_dmc_ddr_window_test_read_vref_offset_value = 0;
10716 }
10717 if (argc > 5) {
10718 skip_window_test_enable = simple_strtoull_ddr(argv[5], &endp, 0);
10719 if (*argv[5] == 0 || *endp != 0)
10720 skip_window_test_enable = 0;
10721 }
10722 if ((p_ddr_base->chip_id >= DDR_MESON_CPU_MAJOR_ID_C2 &&
10723 p_ddr_base->chip_id <= DDR_MESON_CPU_MAJOR_ID_T5D) ||
10724 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_S4 ||
10725 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T3 ||
10726 p_ddr_base->chip_id == DDR_MESON_CPU_MAJOR_ID_T5W) {
10727 do_ddr_auto_fastboot_check_c2(auto_window_test_enable_item,
10728 auto_window_test_dq_size,
10729 pattern_dis_scramble,
10730 stick_dmc_ddr_window_test_read_vref_offset_value,
10731 skip_window_test_enable);
10732 return 1;
10733 }
10734 char str[1024] = "";
10735 int verify_error = 0;
10736 verify_error = do_verify_flash_ddr_parameter(1);
10737 if ((verify_error) == 0) {
10738 if ((ddr_sha.ddrs.fast_boot[0]) == 0xff) {
10739 printf("\nuboot auto fast boot check flash data is ok return \n");
10740 return 1;
10741 }
10742 }
10743 enable_ddr_check_boot_reason = 0;
10744 enable_ddr_check_boot_reason = env_to_a_num("enable_ddr_check_boot_reason");
10745 printf("\nenable_ddr_check_boot_reason==%d \n", enable_ddr_check_boot_reason);
10746 printf("\nddr_fast_boot_enable_flag==%d \n", env_to_a_num("ddr_fast_boot_enable_flag"));
10747 ddr_set_t *ddr_set_t_p = NULL;
10748 ddr_set_t_p = (ddr_set_t *)(ddr_set_t_p_array);
10749 uint32_t ddr_set_add = 0;
10750
10751 ddr_set_add = (uint32_t)(uint64_t)(ddr_set_t_p);
10752 ddr_set_size = sizeof(ddr_set_t);
10753 printf("\nddr_set_t_p==0x%08x\n", ddr_set_add);
10754
10755 uint32_t dmc_retraining_ctrl = 0;
10756 dmc_retraining_ctrl = rd_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address));
10757 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl & (~(1 << 31)));
10758 uint32_t write_size = 0;
10759 write_size = ((ddr_set_size + SHA256_SUM_LEN + MESON_CPU_CHIP_ID_SIZE + 511) / 512) * 512;
10760 do_read_ddr_training_data(1, ddr_set_t_p);
10761 if (((ddr_set_t_p->fast_boot[3]) & 0xc0) && ((ddr_set_t_p->fast_boot[3]) & 0x3f)) {
10762 enable_ddr_check_boot_reason = 0;
10763 if (((ddr_set_t_p->fast_boot[0]) > 0) && ((ddr_set_t_p->fast_boot[0]) < 0xff)) {
10764 (ddr_set_t_p->fast_boot[0]) = 0xfe;
10765 (verify_error) = 0;
10766 }
10767 }
10768 if (ddr_set_t_p->fast_boot[0]) {
10769 printf("\nuboot enable auto fast boot function\n");
10770 if (verify_error) {
10771 printf("\nuboot auto fast boot check verify data happen wrong\n");
10772 (ddr_set_t_p->fast_boot[0]) = 1;
10773 }
10774 } else {
10775 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
10776 return 1;
10777 }
10778
10779 if (enable_ddr_check_boot_reason) {
10780 boot_reason = 0; //ddr_set_t_p->boot_reason
10781 {
10782 if ((((readl(p_ddr_base->ddr_boot_reason_address) >> 12) & 0xf) == AMLOGIC_COLD_BOOT) && ((rd_reg(HOT_BOOT_STICKY_ADD)) == HOT_BOOT_MAGIC))
10783 boot_reason = 1;
10784 if (ddr_set_t_p->fast_boot[0] == 0xfe)
10785 boot_reason = 2;
10786 }
10787 printf("\nboot_reason=%08x \n", (boot_reason));
10788 printf("\nHOT_BOOT_STICKY_ADD=%08x \n", (rd_reg(HOT_BOOT_STICKY_ADD)));
10789 wr_reg(HOT_BOOT_STICKY_ADD, HOT_BOOT_MAGIC);
10790 printf("\nHOT_BOOT_STICKY_ADD=%08x \n", (rd_reg(HOT_BOOT_STICKY_ADD)));
10791
10792 if (boot_reason == 0) {
10793 if ((ddr_set_t_p->fast_boot[0]) < 0xfe) {
10794 need_ddr_window_test = 1;
10795 sprintf(str, "setenv initargs ${initargs} need_ddr_window_test=%d", need_ddr_window_test);
10796 printf("\nstr=%s\n", str);
10797 run_command(str, 0);
10798 sprintf(str, "setenv bootargs ${bootargs} need_ddr_window_test=%d", need_ddr_window_test);
10799 printf("\nstr=%s\n", str);
10800 run_command(str, 0);
10801 } else {
10802 sprintf(str, "setenv initargs ${initargs} need_ddr_window_test=%d", need_ddr_window_test);
10803 printf("\nstr=%s\n", str);
10804 run_command(str, 0);
10805 sprintf(str, "setenv bootargs ${bootargs} need_ddr_window_test=%d", need_ddr_window_test);
10806 printf("\nstr=%s\n", str);
10807 run_command(str, 0);
10808 }
10809 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
10810 return 1;
10811 } else {
10812 sprintf(str, "setenv initargs ${initargs} need_ddr_window_test=%d", need_ddr_window_test);
10813 printf("\nstr=%s\n", str);
10814 run_command(str, 0);
10815 sprintf(str, "setenv bootargs ${bootargs} need_ddr_window_test=%d", need_ddr_window_test);
10816 printf("\nstr=%s\n", str);
10817 run_command(str, 0);
10818 }
10819 }
10820 if ((ddr_set_t_p->fast_boot[0]) == 0xff) {
10821 printf("\nuboot auto fast boot auto window test is done \n");
10822 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
10823 return 1;
10824 }
10825 if (skip_window_test_enable) {
10826 printf("enable skip window test fast boot mode! \n");
10827 ddr_set_t_p->fast_boot[0] = 0xfe;
10828 }
10829 printf("\n(ddr_set_t_p->fast_boot[0])==0x%08x\n", (ddr_set_t_p->fast_boot[0]));
10830
10831 if ((ddr_set_t_p->fast_boot[0]) < 0xfe) {
10832 printf("\nuboot auto fast boot auto window test begin \n");
10833 {
10834 ddr_set_t_p->fast_boot[0] = 0xfd; //0xfd for check unexcept power off status
10835 sha256_csum_wd_internal((unsigned char *)(uint64_t)ddr_set_add, sizeof(ddr_set_t), ddr_sha.sha2, 0);
10836 write_size = ((ddr_set_size + SHA256_SUM_LEN + MESON_CPU_CHIP_ID_SIZE + 511) / 512) * 512;
10837 {
10838 ddr_do_store_ddr_parameter_ops((uint8_t *)(unsigned long)(ddr_set_add - SHA256_SUM_LEN), write_size);
10839 }
10840 sprintf(str, "g12_d2pll %d 0x11 %d 0 0 0 0 %d 0x%08x 0 %d", ddr_set_t_p->DRAMFreq[0], auto_window_test_enable_item, stick_dmc_ddr_window_test_read_vref_offset_value, auto_window_test_dq_size, pattern_dis_scramble);
10841 printf("\nstr=%s\n", str);
10842
10843 run_command(str, 0);
10844 }
10845 return 1;
10846 }
10847
10848 if ((ddr_set_t_p->fast_boot[0]) == 0xfe) {
10849 char dmc_test_worst_window_rx = 0;
10850 char dmc_test_worst_window_tx = 0;
10851
10852 {
10853 dwc_ddrphy_apb_wr((0 << 20) | (0xd << 16) | (0 << 12) | (0x0), 0); // DWC_DDRPHYA_APBONLY0_MicroContMuxSel
10854
10855 dmc_test_worst_window_tx = dwc_ddrphy_apb_rd((0 << 20) | (1 << 16) | (0 << 12) | (0x0c2));
10856 dmc_test_worst_window_rx = dwc_ddrphy_apb_rd((0 << 20) | (1 << 16) | (0 << 12) | (0x0c3));
10857 printf("\ndmc_test_worst_window_tx =%d \n", dmc_test_worst_window_tx);
10858 printf("\ndmc_test_worst_window_rx=%d \n", dmc_test_worst_window_rx);
10859 if (dmc_test_worst_window_tx > 30)
10860 dmc_test_worst_window_tx = 30;
10861 if (dmc_test_worst_window_rx > 30)
10862 dmc_test_worst_window_rx = 30;
10863 ddr_set_t_p->fast_boot[1] = (((dmc_test_worst_window_tx / 2) << 4)) | (((dmc_test_worst_window_rx / 2)));
10864 }
10865
10866 ddr_set_t_p->fast_boot[0] = 0xff;
10867 {
10868 printf("\nuboot auto fast boot auto window test finish \n");
10869
10870 if (ddr_set_t_p->fast_boot[2]) {
10871 if ((ddr_set_t_p->fast_boot[2]) & 0x7) {
10872 if (((ddr_set_t_p->fast_boot[2]) & 0x8))
10873 sprintf(str, "ddr_g12_offset_data 3 0x0 0 0 1 %d ", (ddr_set_t_p->fast_boot[2]) & 0x7);
10874 else
10875 sprintf(str, "ddr_g12_offset_data 3 0x0 0 0 2 %d ", (ddr_set_t_p->fast_boot[2]) & 0x7);
10876
10877 printf("\nstr=%s\n", str);
10878
10879 run_command(str, 0);
10880 }
10881 if ((ddr_set_t_p->fast_boot[2]) & 0x70) {
10882 if (((ddr_set_t_p->fast_boot[2]) & 0x80))
10883 sprintf(str, "ddr_g12_offset_data 2 0x0 0 0 1 %d ", ((ddr_set_t_p->fast_boot[2]) >> 4) & 0x7);
10884 else
10885 sprintf(str, "ddr_g12_offset_data 2 0x0 0 0 2 %d ", ((ddr_set_t_p->fast_boot[2]) >> 4) & 0x7);
10886
10887 printf("\nstr=%s\n", str);
10888
10889 run_command(str, 0);
10890 }
10891
10892 sprintf(str, "ddr_fast_boot 1 ");
10893 printf("\nstr=%s\n", str);
10894 run_command(str, 0);
10895 } else {
10896 sha256_csum_wd_internal((unsigned char *)(uint64_t)ddr_set_add, sizeof(ddr_set_t), ddr_sha.sha2, 0);
10897 ddr_do_store_ddr_parameter_ops((uint8_t *)(unsigned long)(ddr_set_add - SHA256_SUM_LEN), write_size);
10898 }
10899 if ((enable_ddr_check_boot_reason)) {
10900 if (boot_reason) {
10901 sprintf(str, "systemoff");
10902 printf("\nstr=%s\n", str);
10903 run_command(str, 0);
10904 }
10905 }
10906 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
10907 return 1;
10908 }
10909 }
10910 wr_reg((p_ddr_base->ddr_dmc_lpdd4_retraining_address), dmc_retraining_ctrl);
10911 return 1;
10912}
10913
10914#ifdef ENABLE_OLD_EXTRA_TEST_CMD
10915U_BOOT_CMD(
10916 ddr_auto_scan_drv, 30, 1, do_ddr_auto_scan_drv,
10917 "ddr_test_cmd cmd arg1 arg2 arg3...",
10918 "ddr_test_cmd cmd arg1 arg2 arg3... \n dcache off ? \n"
10919 );
10920#endif
10921U_BOOT_CMD(
10922 ddr_fast_boot, 30, 1, do_ddr_fastboot_config,
10923 "ddr_fastboot_config cmd arg1 arg2 arg3...",
10924 "ddr_fastboot_config cmd arg1 arg2 arg3... \n dcache off ? \n"
10925 );
10926
10927U_BOOT_CMD(
10928 ddr_auto_fast_boot_check, 30, 1, do_ddr_auto_fastboot_check,
10929 "ddr_fastboot_config cmd arg1 arg2 arg3...",
10930 "ddr_fastboot_config cmd arg1 arg2 arg3... \n dcache off ? \n"
10931 );