blob: 345fd7b5f059f9c80e2db6763ded63cbcecc9996 [file] [log] [blame]
Kelvin Zhangc4c3dd12021-12-24 20:59:18 +08001/*
yang.li24770372022-01-11 15:21:49 +08002 * Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved.
Kelvin Zhangc4c3dd12021-12-24 20:59:18 +08003 *
yang.li24770372022-01-11 15:21:49 +08004 * SPDX-License-Identifier: MIT
Kelvin Zhangc4c3dd12021-12-24 20:59:18 +08005 */
yang.li24770372022-01-11 15:21:49 +08006
Xiaohu.Huang60950452022-03-12 22:51:01 +08007#include <stdio.h>
Kelvin Zhangc4c3dd12021-12-24 20:59:18 +08008#include "ddr.h"
9#include "common.h"
10#include "register.h"
11#include "FreeRTOS.h"
12#include "task.h"
13#include "soc.h"
14
15/* io defines */
16#define wr_reg(addr, val) (*((volatile uint32_t *)(addr))) = (val)
17#define rd_reg(addr) (*((volatile uint32_t *)(addr)))
18
19/*clear [mask] 0 bits in [addr], set these 0 bits with [value] corresponding bits*/
20#define modify_reg(addr, value, mask) wr_reg(addr, ((rd_reg(addr) & (mask)) | (value)))
21#define wait_set(addr, loc) do {} while (0 == (rd_reg(addr) & (1 << loc)));
22#define wait_clr(addr, loc) do {} while (1 == (rd_reg(addr) & (1 << loc)));
23#define wait_equal(addr, data) do {} while (data != (rd_reg(addr)));
24
25#define _udelay(tim) vTaskDelay(tim)
26
27unsigned int g_nAPDSet = 0;
28#if 0
29void vDDR_suspend(uint32_t st_f)
30{
31 //printf("aml log : DDR suspend...dummy\n");
32 //return;
33
34 printf("aml log : DDR suspend...1");
35
36 g_nAPDSet = rd_reg(DMC_DRAM_APD_CTRL);
37 wr_reg(DMC_DRAM_APD_CTRL,0);
38
39#ifdef CHECK_DMC_IDLE
40 while ((((rd_reg(DMC_DRAM_STAT)) & 0xf0) != 0) &&
41 (((rd_reg(DMC_DRAM_STAT)) & 0xf0) != 0x40)) {
42 }
43#endif
44
45#if 0
46 wr_reg(DMC_DRAM_SCFG, 2);
47 vTaskDelay(pdMS_TO_TICKS(1));
48 while (((((rd_reg(DMC_DRAM_STAT)) >> 4) & 0xf) != 3)) {
49 }
50#endif
51
52 wr_reg(DMC_DRAM_DFIINITCFG, (1 | (1 << 8)));
53
54 wait_clr(DMC_DRAM_DFIINITCFG, 31);
55
56 vTaskDelay(pdMS_TO_TICKS(1));
57 //wr_reg(AM_DDR_PLL_CNTL0,
58 // (rd_reg(AM_DDR_PLL_CNTL0) & (~(0xf << 28))) | (1 << 29));
59
60 printf("done!!\n");
61
62 vTaskDelay(pdMS_TO_TICKS(1000));
63
64 //vDDR_resume(0);
65
66 printf("\naml log : DMC_DRAM_STAT=0x%x",rd_reg(DMC_DRAM_STAT));
67 printf("\naml log : DMC_DRAM_DFIINITCFG=0x%x\n",rd_reg(DMC_DRAM_DFIINITCFG));
68
69}
70
71void vDDR_resume(uint32_t st_f)
72{
73 printf("aml log : DDR resume...2");
74
75 //printf("aml log : DDR resume...dummy\n");
76 //return;
77
78 #if 0
79 do {
80 wr_reg(AM_DDR_PLL_CNTL0, (rd_reg(AM_DDR_PLL_CNTL0) & (~(0xf << 28))) | (0xc << 28));
81 vTaskDelay(pdMS_TO_TICKS(1));
82 wr_reg(AM_DDR_PLL_CNTL0, (rd_reg(AM_DDR_PLL_CNTL0) & (~(0xf << 28))) | (0xd << 28));
83 vTaskDelay(pdMS_TO_TICKS(5));
84 wr_reg(AM_DDR_PLL_CNTL0, (rd_reg(AM_DDR_PLL_CNTL0) & (~(0xf << 28))) | (0x5 << 28));
85 vTaskDelay(pdMS_TO_TICKS(10));
86 wr_reg(AM_DDR_PLL_CNTL0, (rd_reg(AM_DDR_PLL_CNTL0) & (~(0xf << 28))) | (0x7 << 28));
87 vTaskDelay(pdMS_TO_TICKS(100));
88 } while ((0 == ((rd_reg(AM_DDR_PLL_STS) >> 31) & 0x1)));
89 wr_reg(DDR_CLK_CNTL, 0x10000000);
90 wr_reg(DDR_CLK_CNTL, 0xb0000007);
91
92 vTaskDelay(pdMS_TO_TICKS(1));
93 #endif
94
95
96 wr_reg(DMC_DRAM_DFIINITCFG, (0 | (1 << 8)));
97 vTaskDelay(pdMS_TO_TICKS(1));
98
99 printf("-1");
100
101 wait_set(DMC_DRAM_DFIINITCFG, 31);
102 vTaskDelay(pdMS_TO_TICKS(10)); //extra 10us for vt
103#if 0
104 wr_reg(DMC_DRAM_SCFG, 4);
105#endif
106 vTaskDelay(pdMS_TO_TICKS(1));
107
108 printf("-2");
109
110 int nLoopFlag = 1;
111 do {
112
113 switch ((rd_reg(DMC_DRAM_STAT)) & 0xf0)
114 {
115 case 0: //DRAM IDLE
116 case 0x20: //DRAM ACCESS
117 case 0x40: //DRAM APD
118 nLoopFlag = 0;
119 break;
120 default: break;
121 }
122 } while(nLoopFlag);
123
124 vTaskDelay(pdMS_TO_TICKS(30));
125
126 printf("-3");
127
128 printf("done\n");
129
130 printf("\naml log : DMC_DRAM_STAT=0x%x",rd_reg(DMC_DRAM_STAT));
131 printf("\naml log : DMC_DRAM_DFIINITCFG=0x%x\n",rd_reg(DMC_DRAM_DFIINITCFG));
132
133}
134#endif
135
136/*
137#define PATTERN_MATRIX_X (3 + 32 + 16 + 17) //68*32==2176 ///2.2k -0x880-1 loop
138#define PATTERN_MATRIX_Y (32)
139#define PATTERN_MATRIX_LOOP_SIZE ((PATTERN_MATRIX_X)*(PATTERN_MATRIX_Y) * 4)
140unsigned int cpu_ddr_test_init_pattern_generater(uint32_t martix_x_select, uint32_t martix_y_select)
141{
142 unsigned int pattern_value = 0;
143 unsigned int pattern_value_temp_16 = 0;
144
145 martix_x_select = (martix_x_select % PATTERN_MATRIX_X);
146 {
147 {
148 {
149 if (martix_x_select == 0)
150 pattern_value = 0xaaaa5555; //for 16 bit bus pattern
151
152 if (martix_x_select == 1)
153 pattern_value = 0x0000ffff; //for 16 bit bus pattern
154
155 if (martix_x_select == 2)
156 pattern_value = 0;
157
158 if ((martix_x_select > 2) && (martix_x_select < (3 + 32)))
159 pattern_value = 1 << (martix_x_select - 3);
160 if ((martix_x_select > (2 + 32)) && (martix_x_select < (3 + 32 + 16))) { //for 16 bit bus pattern
161 pattern_value_temp_16 = (1 << (martix_x_select - 3 - 32));
162 pattern_value = pattern_value_temp_16 | ((~pattern_value_temp_16) << 16);
163 }
164 if ((martix_x_select > (2 + 32 + 16)) && (martix_x_select < (3 + 32 + 16 + 17))) { //for dbi bus pattern 17 group
165 pattern_value_temp_16 = (0x0f0f + 0xf0f * (martix_x_select - 3 - 32 - 16));
166 pattern_value = pattern_value_temp_16 | ((~pattern_value_temp_16) << 16);
167 }
168 }
169 if ((martix_y_select % 2))
170 pattern_value = ~pattern_value;
171 if ((martix_y_select % ((PATTERN_MATRIX_Y) / 2)) == (((PATTERN_MATRIX_Y * 1) / 8) - 1)) //for dbi pattern walk 0 and walk 1
172 pattern_value = 0; //insert for dbi pattern jiaxing 20190117
173 if ((martix_y_select % ((PATTERN_MATRIX_Y) / 2)) == (((PATTERN_MATRIX_Y * 3) / 8) - 1)) //for dbi pattern walk 0 and walk 1
174 pattern_value = ~0; //insert for dbi pattern jiaxing 20190117
175 }
176 }
177 return pattern_value;
178}
179*/
180#if 0
181static unsigned int dmc_ddr_test(unsigned int start_add, unsigned int write_enable, unsigned int read_enable, unsigned int read_compare, unsigned int test_end_add, unsigned int pattern, unsigned int seed)
182{
183 seed=2;
184#define DATA_LOOP_PATTERN_INDEX 4 + 32 //0xff
185 unsigned int dmc_test_sts = 0;
186 unsigned int dmc_error = 0;
187 //unsigned int pattern_select = 0;
188 unsigned int pattern_value = 0;
189 unsigned int pattern_inv_value = 0;
190
191 dmc_error = 0;
192 {
193 test_end_add = test_end_add - 4; //sha must bit 0-6 ==ff;
194 }
195 wr_reg(DMC_TEST_STA, start_add); // RESET FIFOS //0x03d81e3f
196 wr_reg(DMC_TEST_EDA, test_end_add); //0x07d81e3f
197 if (pattern == 0) {
198 wr_reg(DMC_TEST_WD0, 0xaa5555aa);
199 wr_reg(DMC_TEST_WD1, 0x55aaaa55);
200 wr_reg(DMC_TEST_WD2, 0);
201 wr_reg(DMC_TEST_WD3, 0xffffffff);
202 wr_reg(DMC_TEST_WD4, 0);
203 wr_reg(DMC_TEST_WD5, 0x0000ffff);
204 wr_reg(DMC_TEST_WD6, 0xffff0000);
205 wr_reg(DMC_TEST_WD7, 0x33cccc33);
206 wr_reg(DMC_TEST_WD0 + 32, 0xaa5555aa);
207 wr_reg(DMC_TEST_WD1 + 32, 0x55aaaa55);
208 wr_reg(DMC_TEST_WD2 + 32, 0);
209 wr_reg(DMC_TEST_WD3 + 32, 0xffffffff);
210 wr_reg(DMC_TEST_WD4 + 32, 0);
211 wr_reg(DMC_TEST_WD5 + 32, 0x0000ffff);
212 wr_reg(DMC_TEST_WD6 + 32, 0xffff0000);
213 wr_reg(DMC_TEST_WD7 + 32, 0x33cccc33);
214 } else if (pattern < 33) {
215 wr_reg(DMC_TEST_WD0, ((1 << (pattern - 1)) + seed));
216 wr_reg(DMC_TEST_WD1, ((2 << (pattern - 1)) + seed));
217 wr_reg(DMC_TEST_WD2, ((3 << (pattern - 1)) + seed));
218 wr_reg(DMC_TEST_WD3, ((4 << (pattern - 1)) + seed));
219 wr_reg(DMC_TEST_WD4, ((4 << (pattern - 1))));
220 wr_reg(DMC_TEST_WD5, ((4 << (pattern - 1))));
221 wr_reg(DMC_TEST_WD6, ((4 << (pattern - 1))));
222 wr_reg(DMC_TEST_WD7, ((4 << (pattern - 1))));
223 if (pattern > 16) {
224 wr_reg(DMC_TEST_WD4, ((4 << (pattern - 1)) + 0x01010101));
225 wr_reg(DMC_TEST_WD5, ((4 << (pattern - 1)) + 0x01010101));
226 wr_reg(DMC_TEST_WD6, ((4 << (pattern - 1)) + 0x01010101));
227 wr_reg(DMC_TEST_WD7, ((4 << (pattern - 1)) + 0x01010101));
228 } else if (pattern > 1) {
229 wr_reg(DMC_TEST_WD4, ((4 << (pattern - 1)) + 0x01010101));
230 wr_reg(DMC_TEST_WD5, ((4 << (pattern - 1)) + 0x01010101));
231 wr_reg(DMC_TEST_WD6, ((4 << (pattern - 1)) + 0x01010101));
232 wr_reg(DMC_TEST_WD7, ((4 << (pattern - 1)) + 0x01010101));
233 }
234 } else {
235 //pattern_select = pattern - 33;
236 pattern_value =1;// cpu_ddr_test_init_pattern_generater(pattern_select, 0);
237 pattern_inv_value = ~pattern_value;
238 for (char counter = 0; counter < 32; ) {
239 wr_reg((DMC_TEST_WD0 + counter), pattern_value);
240 counter = counter + 4;
241 wr_reg((DMC_TEST_WD0 + counter), pattern_inv_value);
242 if (counter == 16)
243 wr_reg((DMC_TEST_WD0 + counter), 0);
244 counter = counter + 4;
245 }
246 for (char counter = 0; counter < 32; ) { //for g12b-revb register not continuous
247 wr_reg((DMC_TEST_WD8 + counter), pattern_value);
248 counter = counter + 4;
249 wr_reg((DMC_TEST_WD8 + counter), pattern_inv_value);
250 if (counter == 16)
251 wr_reg((DMC_TEST_WD0 + counter), ~0);
252 counter = counter + 4;
253 }
254 }
255
256
257 wr_reg(DMC_TEST_STS, 0x8000001f); //must clear watchdog and done flag jiaxing debug 2016_12_07
258 wr_reg(DMC_TEST_WDG, 0xf000f000); //wdg should >rfc value ,use dmc clk count.
259 if ((pattern == 1) || ((pattern < 33) && pattern)) //should repeat 1 times for read ,all will fail when data increase jiaxing debug 20180322
260 wr_reg(DMC_TEST_CTRL, (1 << 31) | (read_compare << 27) | (0 << 28) | (0 << 25) | (1 << 24) | (0 << 20) | (1 << 23) | (0x0 << 16) | (0 << 8) | (0x428) | (3 << 18) | (write_enable << 30) | (read_enable << 29));
261 else
262 wr_reg(DMC_TEST_CTRL, (1 << 31) | (read_compare << 27) | (0 << 28) | (1 << 24) | (0x0 << 16) | (0 << 18) | (0x0 << 0) | (0 << 8) | (0x428) | (3 << 18) | (write_enable << 30) | (read_enable << 29));
263
264 do
265 //_udelay(1);
266 dmc_test_sts = (rd_reg(DMC_TEST_STS));
267 while (!(dmc_test_sts & 0xc0000000));
268
269 wr_reg(DMC_TEST_CTRL, 0x00000000);
270
271 if ((dmc_test_sts & 0x40000000))
272 dmc_error = 1;
273 else
274 if (dmc_test_sts & 0x40000001) //can not deter write triger ,or can not guickly recover dmc with phy? 2016_12_12
275 dmc_error = 1;
276
277 dmc_error = dmc_error + (rd_reg(DMC_TEST_ERR_CNT));
278 wr_reg(DMC_TEST_STS, 0x8000001f); //must clear watchdog and done flag jiaxing debug 2016_12_07
279
280 if (dmc_error) {
281 for (unsigned int counter1 = 0; counter1 < (DMC_TEST_RDRSP_ADDR+4-DMC_TEST_STA); )
282 {
283 printf( "\ncounter %08x %08x",counter1,(rd_reg(DMC_TEST_STA+(counter1))));
284 counter1=counter1+4;
285 }
286 wr_reg(DMC_SOFT_RST, (rd_reg(DMC_SOFT_RST)) & (~((1 << 29) | (1 << 24)))); //clear read buffer dmc test reset
287 vTaskDelay(pdMS_TO_TICKS(1));
288 wr_reg(DMC_SOFT_RST, (rd_reg(DMC_SOFT_RST)) | ((1 << 29)) | (1 << 24));
289 vTaskDelay(pdMS_TO_TICKS(1));
290 }
291 return dmc_error;
292}
293
294unsigned int apb_sec_ctrl = 0;
295#define DDR_APB_SEC_CTRL ((0x00f0 << 2) + 0xff639000)
296#endif
297#if 0 //def CFG_ENABLE_DDR_SUSPEND_TEST
298static void ddr_suspend_resume_test(uint32_t test_size, uint32_t test_delay_time_ms, uint32_t test_write_loops, uint32_t test_read_loops, uint32_t test_skip_suspend, uint32_t p_dev)
299{
300 //return;
301 uint32_t lock_cnt = 100;
302 uint32_t apd_value = 0;
303 p_dev = p_dev;
304 printf( "enter suspend_n_debug\n");
305 apd_value = rd_reg(DMC_DRAM_APD_CTRL);
306 wr_reg(DMC_DRAM_APD_CTRL, 0);
307
308 //watchdog_disable();
309 printf( "test_size=%08x test_delay_time_ms=%d test_write_loops=%d test_read_loops=%d", \
310 test_size, test_delay_time_ms, test_write_loops, test_read_loops);
311 printf( "enter suspend111\n");
312
313#if 1 //def CFG_ENABLE_DDR_DMC_TEST
314 uint64_t dram_size = 0, dram_base = 0;
315 dram_base = 0x0000000; // p_ddrs->ddr_base_addr;
316 //dram_size = 1024;//p_ddrs->cfg_board_common_setting.dram_cs0_size_MB + p_ddrs->cfg_board_common_setting.dram_cs1_size_MB;
317 dram_size =1024;
318
319 if (!test_size)
320 test_size = (dram_size << 20) - 4;
321
322 //if (!test_delay_time_ms)
323 // test_delay_time_ms = 3000;
324
325 if (!test_write_loops)
326 test_write_loops = 1;
327
328 if (!test_read_loops)
329 test_read_loops = 1;
330 uint32_t ddr_bist_test_error = 0;
331#endif
332
333 while ((test_write_loops) || (test_read_loops)) {
334 if (test_write_loops)
335 ddr_bist_test_error = dmc_ddr_test(dram_base, 1, 0, 0, test_size, 1, 0) + ddr_bist_test_error;
336printf( "enter suspend113\n");
337 if (!test_skip_suspend) {
338#if 0 //def CHECK_DMC_IDLE
339 while ((((rd_reg(DMC_DRAM_STAT)) & 0xf0) != 0) && (((rd_reg(DMC_DRAM_STAT)) & 0xf0) != 0x40)) {
340 }
341#endif
342#if 0
343 wr_reg(DMC_DRAM_SCFG, 2);
344 vTaskDelay(pdMS_TO_TICKS(1));
345
346 while (((((rd_reg(DMC_DRAM_STAT)) >> 4) & 0xf) != 3)) {
347 }
348#endif
349//printf( "enter suspend114\n");
350 wr_reg(DMC_DRAM_DFIINITCFG, (1 | (0 << 1) | (0 << 6) | (0 << 14) | (1 << 8)));
351 vTaskDelay(pdMS_TO_TICKS(1));
352 wait_clr(DMC_DRAM_DFIINITCFG, 31); //final version, wait_clr
353 vTaskDelay(pdMS_TO_TICKS(3));
354 // printf( "enter suspend115\n");
355 wr_reg(AM_DDR_PLL_CNTL0, (rd_reg(AM_DDR_PLL_CNTL0) & (~(0xf << 28))) | (1 << 29));
356 }
357 //_udelay(test_delay_time_ms * 1000);
358 vTaskDelay(test_delay_time_ms * pdMS_TO_TICKS(1000));
359 //_udelay( 1000);
360printf( "enter suspend111..wait\n");
361 if (!test_skip_suspend) {
362 printf("enter resume\n");
363
364 do {
365 wr_reg(AM_DDR_PLL_CNTL0, (rd_reg(AM_DDR_PLL_CNTL0) & (~(0xf << 28))) | (1 << 29));
366 vTaskDelay(pdMS_TO_TICKS(1));
367 wr_reg(AM_DDR_PLL_CNTL0, (rd_reg(AM_DDR_PLL_CNTL0) & (~(0x1 << 29))) | (1 << 28));
368
369 vTaskDelay(pdMS_TO_TICKS(200)); //must wait some time than to read
370 } while ((0 == ((rd_reg(AM_DDR_PLL_CNTL0) >> 31) & 0x1)) && (lock_cnt--));
371
372 printf( "pll relock ok\n"); //need extra delay
373 vTaskDelay(pdMS_TO_TICKS(1));
374 wr_reg(DMC_DRAM_DFIINITCFG, (0 | (0 << 1) | (0 << 6) | (0 << 14) | (1 << 8)));
375 vTaskDelay(pdMS_TO_TICKS(1));
376 wait_set(DMC_DRAM_DFIINITCFG, 31);
377 vTaskDelay(pdMS_TO_TICKS(100)); //extra 10us for vt
378 }
379#if 1 //def CFG_ENABLE_DDR_DMC_TEST
380 if (test_read_loops)
381 ddr_bist_test_error = dmc_ddr_test(dram_base, 0, 1, 1, test_size, 1, 0) + ddr_bist_test_error;
382 //if (ddr_bist_test_error)
383 printf( "dmc full test result = %d\n", ddr_bist_test_error);
384#endif
385
386 if (test_write_loops)
387 test_write_loops--;
388
389 if (test_read_loops)
390 test_read_loops--;
391 }
392 wr_reg(DMC_DRAM_APD_CTRL, apd_value);
393
394 //printf("end resume test11\n");
395} /* ddr_suspend_resume_test */
396#endif
397 //#define DDR_SUSPEND_MODE_DMC_TRIGGER_SUSPEND_1 1
398 #define DDR_SUSPEND_MODE_MANUAL_TRIGGER_DFI_INIT_START 2
399void vDDR_suspend(uint32_t st_f)
400{
401 //printf("aml log : DDR suspend...dummy\n");
402 //return;
403
404 st_f = st_f;
405 //unsigned int time_start, time_end;
406 printf("Enter ddr suspend\n");
407
408 //return ;
409
410 while (0xfffffff != rd_reg(DMC_CHAN_STS)) {
411 printf("DMC_CHAN_STS: 0x%x\n", rd_reg(DMC_CHAN_STS));
412 vTaskDelay(pdMS_TO_TICKS(100000));
413 }
414
415 //time_start = rd_reg(P_ISA_TIMERE);
416
417 /* open DMC reg access for M3 */
418 //apb_sec_ctrl = rd_reg(DDR_APB_SEC_CTRL);
419 //wr_reg(DDR_APB_SEC_CTRL,0x91911);
420
421 wr_reg(DMC_REQ_CTRL, 0); //bit0: A53.
422 _udelay(1);
423
424 /* suspend flow */
425 while ((((rd_reg(DMC_DRAM_STAT))&0xf0) != 0) && (((rd_reg(DMC_DRAM_STAT))&0xf0) != 0x40)) {
426 // printf("DMC_DRAM_STAT11: 0x%x\n", rd_reg(DMC_DRAM_STAT));
427 vTaskDelay(pdMS_TO_TICKS(1));
428 }
429#ifdef DDR_SUSPEND_MODE_DMC_TRIGGER_SUSPEND_1
430 wr_reg(DMC_DRAM_ASR_CTRL,(1<<18)); //bit 18 will auto trigger dfi init start cmd when scfg set to value 2
431 wr_reg(DMC_DRAM_SCFG, 2);
432 while (((((rd_reg(DMC_DRAM_STAT))>>4)&0xf) != 3)) {
433 //printf("DMC_DRAM_STAT22: 0x%x\n", readl(DMC_DRAM_STAT));
434 //_udelay(1);//do not add any delay,since use ao cpu maybe speed too slow
435 }
436
437#endif
438
439#ifdef DDR_SUSPEND_MODE_MANUAL_TRIGGER_DFI_INIT_START
440 wr_reg(DMC_DRAM_SCFG, 1);
441 while (((((rd_reg(DMC_DRAM_STAT))>>4)&0xf) != 1)) {
442 //printf("DMC_DRAM_STAT22: 0x%x\n", readl(DMC_DRAM_STAT));
443 //_udelay(1);//do not add any delay,since use ao cpu maybe speed too slow
444 }
445
446 wr_reg(DMC_DRAM_DFIINITCFG, (1 | (0 << 1) | (0 << 6) | (0 << 14) | (1 << 8)));
447 vTaskDelay(pdMS_TO_TICKS(1));
448 wait_clr(DMC_DRAM_DFIINITCFG, 31);
449#endif //final version, wait_clr
450 vTaskDelay(pdMS_TO_TICKS(3));
451 wr_reg(AM_DDR_PLL_CNTL0, (rd_reg(AM_DDR_PLL_CNTL0) & (~(0xf << 28))) | (1 << 29));
452
453
454 /* print time consumption */
455 //time_end = rd_reg(P_ISA_TIMERE);
456 //printf("ddr suspend time: %dus\n", time_end - time_start);
457 printf("\nddr suspend is done\n");
458 //ddr_suspend_resume_test((1024<<20), 100, 3, 3, 0, 0);
459 //ddr_suspend_resume_test((80<<20), 10000000, 0, 3, 0, 0);
460}
461
462static unsigned int pll_lock(void) {
463 unsigned int lock_cnt = 100;
464 do {
465 wr_reg(AM_DDR_PLL_CNTL0, (rd_reg(AM_DDR_PLL_CNTL0) & (~(0xf<<28))) | (1<<29));
466 vTaskDelay(pdMS_TO_TICKS(1));
467 wr_reg(AM_DDR_PLL_CNTL0, (rd_reg(AM_DDR_PLL_CNTL0) & (~(0x1<<29))) | (1<<28));
468 vTaskDelay(pdMS_TO_TICKS(200));
469 } while((0 == ((rd_reg(AM_DDR_PLL_CNTL0) >> 31) & 0x1)) && (lock_cnt--));
470 return lock_cnt;
471}
472
473void vDDR_resume(uint32_t st_f)
474{
475 //unsigned int time_start, time_end;
476 unsigned int ret = 0;
477
478 st_f = st_f;
479 printf("Enter ddr resume\n");
480
481
482 //return;
483
484 //time_start = rd_reg(P_ISA_TIMERE);
485 /* resume flow */
486 #if 1
487 ret = pll_lock();
488 if (!ret) {
489 printf("ddr pll lock r1\n");
490 wr_reg(AM_DDR_PLL_CNTL3, rd_reg(AM_DDR_PLL_CNTL3)|(1<<31));
491 ret = pll_lock();
492 if (!ret) {
493 printf("ddr pll lock r2\n");
494 wr_reg(AM_DDR_PLL_CNTL6, 0x55540000);
495 ret = pll_lock();
496 if (!ret) {
497 printf("ddr pll lock r2\n");
498 while (1) {};
499 }
500 }
501 }
502#endif
503
504#ifdef DDR_SUSPEND_MODE_DMC_TRIGGER_SUSPEND_1
505
506#endif
507
508#ifdef DDR_SUSPEND_MODE_MANUAL_TRIGGER_DFI_INIT_START
509 wr_reg(DMC_DRAM_DFIINITCFG, (0 | (0 << 1) | (0 << 6) | (0 << 14) | (1 << 8)));
510 vTaskDelay(pdMS_TO_TICKS(1));
511 wait_set(DMC_DRAM_DFIINITCFG, 31);
512 vTaskDelay(pdMS_TO_TICKS(100));
513#endif
514 wr_reg(DMC_DRAM_SCFG, 4);
515 while (((((rd_reg(DMC_DRAM_STAT))>>4)&0xf) != 2)) {
516 //printf("DMC_DRAM_STAT22: 0x%x\n", readl(DMC_DRAM_STAT));
517 //_udelay(1);//do not add any delay,since use ao cpu maybe speed too slow
518 }
519
520 #if 0
521 wr_reg( DMC_DRAM_SCFG, 4);
522 vTaskDelay(pdMS_TO_TICKS(1));
523 #endif
524
525 wr_reg(DMC_REQ_CTRL, 0xffffffff);
526 //wr_reg(DDR_APB_SEC_CTRL, apb_sec_ctrl);
527 /* print time consumption */
528 //time_end = readl(P_ISA_TIMERE);
529 //printf("ddr resume time: %dus\n", time_end - time_start);
530 // unsigned int ddr_bist_test_error = 0;
531 //ddr_bist_test_error = dmc_ddr_test(dram_base, 0, 1, 1, test_size, 1, 0) + ddr_bist_test_error;
532 //ddr_bist_test_error = dmc_ddr_test(0, 0, 1, 1, (80<<20), 1, 0) + ddr_bist_test_error;
533 //printf("ddr_bist_test_error = %d\n", ddr_bist_test_error);
534 //wr_reg(0xfe002440, 2);
535// wr_reg(0xfe002440, 0);
536// _udelay(300);
537 //ddr_bist_test_error = dmc_ddr_test(0, 1, 0, 0, (1<<20), 1, 0) + ddr_bist_test_error;
538 //ddr_bist_test_error = dmc_ddr_test(0, 0, 1, 1, (1<<20), 1, 0) + ddr_bist_test_error;
539// printf("ddr_bist_test_error = %d\n", ddr_bist_test_error);
540 //ddr_suspend_resume_test((1<<20), 2, 1, 3, 0, 0);
541 //ddr_suspend_resume_test((1<<20), 0, 1, 3, 0, 0);
542 //_udelay(300);
543// wr_reg(DMC_REQ_CTRL, 0xffffffff);
544 printf("ddr resume done\n");
545}
546
547