Blame view

board/bf537-stamp/post-memory.c 6.21 KB
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
1
2
  #include <common.h>
  #include <asm/io.h>
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
3
4
  #include <post.h>
  #include <watchdog.h>
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
5
  #if CONFIG_POST & CONFIG_SYS_POST_MEMORY
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
6
7
8
9
10
11
12
13
  #define CLKIN 25000000
  #define PATTERN1 0x5A5A5A5A
  #define PATTERN2 0xAAAAAAAA
  
  #define CCLK_NUM	4
  #define SCLK_NUM	3
  
  void post_out_buff(char *buff);
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
14
15
16
17
18
  void post_init_pll(int mult, int div);
  int post_init_sdram(int sclk);
  void post_init_uart(int sclk);
  
  const int pll[CCLK_NUM][SCLK_NUM][2] = {
a750d038f   Mike Frysinger   Blackfin: tighten...
19
20
21
22
  	{ {20, 4}, {20, 5}, {20, 10} },	/* CCLK = 500M */
  	{ {16, 4}, {16, 5}, {16, 8} },	/* CCLK = 400M */
  	{ {8, 2}, {8, 4}, {8, 5} },	/* CCLK = 200M */
  	{ {4, 1}, {4, 2}, {4, 4} }	/* CCLK = 100M */
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
23
24
  };
  const char *const log[CCLK_NUM][SCLK_NUM] = {
8ed44d91c   Wolfgang Denk   Cleanup: fix "MHz...
25
26
27
28
29
30
31
32
33
34
35
36
  	{"CCLK-500MHz SCLK-125MHz:    Writing...\0",
  	 "CCLK-500MHz SCLK-100MHz:    Writing...\0",
  	 "CCLK-500MHz SCLK- 50MHz:    Writing...\0",},
  	{"CCLK-400MHz SCLK-100MHz:    Writing...\0",
  	 "CCLK-400MHz SCLK- 80MHz:    Writing...\0",
  	 "CCLK-400MHz SCLK- 50MHz:    Writing...\0",},
  	{"CCLK-200MHz SCLK-100MHz:    Writing...\0",
  	 "CCLK-200MHz SCLK- 50MHz:    Writing...\0",
  	 "CCLK-200MHz SCLK- 40MHz:    Writing...\0",},
  	{"CCLK-100MHz SCLK-100MHz:    Writing...\0",
  	 "CCLK-100MHz SCLK- 50MHz:    Writing...\0",
  	 "CCLK-100MHz SCLK- 25MHz:    Writing...\0",},
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
  };
  
  int memory_post_test(int flags)
  {
  	int addr;
  	int m, n;
  	int sclk, sclk_temp;
  	int ret = 1;
  
  	sclk_temp = CLKIN / 1000000;
  	sclk_temp = sclk_temp * CONFIG_VCO_MULT;
  	for (sclk = 0; sclk_temp > 0; sclk++)
  		sclk_temp -= CONFIG_SCLK_DIV;
  	sclk = sclk * 1000000;
  	post_init_uart(sclk);
0fc474441   Mike Frysinger   Blackfin: bf537-s...
52
  	if (post_hotkeys_pressed() == 0)
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
  		return 0;
  
  	for (m = 0; m < CCLK_NUM; m++) {
  		for (n = 0; n < SCLK_NUM; n++) {
  			/* Calculate the sclk */
  			sclk_temp = CLKIN / 1000000;
  			sclk_temp = sclk_temp * pll[m][n][0];
  			for (sclk = 0; sclk_temp > 0; sclk++)
  				sclk_temp -= pll[m][n][1];
  			sclk = sclk * 1000000;
  
  			post_init_pll(pll[m][n][0], pll[m][n][1]);
  			post_init_sdram(sclk);
  			post_init_uart(sclk);
  			post_out_buff("
  \r\0");
  			post_out_buff(log[m][n]);
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
70
  			for (addr = 0x0; addr < CONFIG_SYS_MAX_RAM_SIZE; addr += 4)
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
71
72
  				*(unsigned long *)addr = PATTERN1;
  			post_out_buff("Reading...\0");
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
73
  			for (addr = 0x0; addr < CONFIG_SYS_MAX_RAM_SIZE; addr += 4) {
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
  				if ((*(unsigned long *)addr) != PATTERN1) {
  					post_out_buff("Error
  \r\0");
  					ret = 0;
  				}
  			}
  			post_out_buff("OK
  \r\0");
  		}
  	}
  	if (ret)
  		post_out_buff("memory POST passed
  \r\0");
  	else
  		post_out_buff("memory POST failed
  \r\0");
  
  	post_out_buff("
  \r
  \r\0");
  	return 1;
  }
  
  void post_init_uart(int sclk)
  {
  	int divisor;
  
  	for (divisor = 0; sclk > 0; divisor++)
  		sclk -= 57600 * 16;
0049053ff   Mike Frysinger   Blackfin: bf537-s...
103
104
  	bfin_write_PORTF_FER(0x000F);
  	bfin_write_PORTH_FER(0xFFFF);
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
105

0049053ff   Mike Frysinger   Blackfin: bf537-s...
106
107
  	bfin_write_UART_GCTL(0x00);
  	bfin_write_UART_LCR(0x83);
d4d773085   Mike Frysinger   punt Blackfin VDS...
108
  	SSYNC();
0049053ff   Mike Frysinger   Blackfin: bf537-s...
109
  	bfin_write_UART_DLL(divisor & 0xFF);
d4d773085   Mike Frysinger   punt Blackfin VDS...
110
  	SSYNC();
0049053ff   Mike Frysinger   Blackfin: bf537-s...
111
  	bfin_write_UART_DLH((divisor >> 8) & 0xFF);
d4d773085   Mike Frysinger   punt Blackfin VDS...
112
  	SSYNC();
0049053ff   Mike Frysinger   Blackfin: bf537-s...
113
  	bfin_write_UART_LCR(0x03);
d4d773085   Mike Frysinger   punt Blackfin VDS...
114
  	SSYNC();
0049053ff   Mike Frysinger   Blackfin: bf537-s...
115
  	bfin_write_UART_GCTL(0x01);
d4d773085   Mike Frysinger   punt Blackfin VDS...
116
  	SSYNC();
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
117
118
119
120
121
122
  }
  
  void post_out_buff(char *buff)
  {
  
  	int i = 0;
a750d038f   Mike Frysinger   Blackfin: tighten...
123
124
  	for (i = 0; i < 0x80000; i++)
  		;
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
125
126
  	i = 0;
  	while ((buff[i] != '\0') && (i != 100)) {
0049053ff   Mike Frysinger   Blackfin: bf537-s...
127
128
  		while (!(bfin_read_pUART_LSR() & 0x20)) ;
  		bfin_write_UART_THR(buff[i]);
d4d773085   Mike Frysinger   punt Blackfin VDS...
129
  		SSYNC();
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
130
131
  		i++;
  	}
a750d038f   Mike Frysinger   Blackfin: tighten...
132
133
  	for (i = 0; i < 0x80000; i++)
  		;
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
134
  }
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
135
136
  void post_init_pll(int mult, int div)
  {
0049053ff   Mike Frysinger   Blackfin: bf537-s...
137
138
139
  	bfin_write_SIC_IWR(0x01);
  	bfin_write_PLL_CTL((mult << 9));
  	bfin_write_PLL_DIV(div);
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
140
141
142
  	asm("CLI R2;");
  	asm("IDLE;");
  	asm("STI R2;");
0049053ff   Mike Frysinger   Blackfin: bf537-s...
143
  	while (!(bfin_read_PLL_STAT() & 0x20)) ;
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
  }
  
  int post_init_sdram(int sclk)
  {
  	int SDRAM_tRP, SDRAM_tRP_num, SDRAM_tRAS, SDRAM_tRAS_num, SDRAM_tRCD,
  	    SDRAM_tWR;
  	int SDRAM_Tref, SDRAM_NRA, SDRAM_CL, SDRAM_SIZE, SDRAM_WIDTH,
  	    mem_SDGCTL, mem_SDBCTL, mem_SDRRC;
  
  	if ((sclk > 119402985)) {
  		SDRAM_tRP = TRP_2;
  		SDRAM_tRP_num = 2;
  		SDRAM_tRAS = TRAS_7;
  		SDRAM_tRAS_num = 7;
  		SDRAM_tRCD = TRCD_2;
  		SDRAM_tWR = TWR_2;
  	} else if ((sclk > 104477612) && (sclk <= 119402985)) {
  		SDRAM_tRP = TRP_2;
  		SDRAM_tRP_num = 2;
  		SDRAM_tRAS = TRAS_6;
  		SDRAM_tRAS_num = 6;
  		SDRAM_tRCD = TRCD_2;
  		SDRAM_tWR = TWR_2;
  	} else if ((sclk > 89552239) && (sclk <= 104477612)) {
  		SDRAM_tRP = TRP_2;
  		SDRAM_tRP_num = 2;
  		SDRAM_tRAS = TRAS_5;
  		SDRAM_tRAS_num = 5;
  		SDRAM_tRCD = TRCD_2;
  		SDRAM_tWR = TWR_2;
  	} else if ((sclk > 74626866) && (sclk <= 89552239)) {
  		SDRAM_tRP = TRP_2;
  		SDRAM_tRP_num = 2;
  		SDRAM_tRAS = TRAS_4;
  		SDRAM_tRAS_num = 4;
  		SDRAM_tRCD = TRCD_2;
  		SDRAM_tWR = TWR_2;
  	} else if ((sclk > 66666667) && (sclk <= 74626866)) {
  		SDRAM_tRP = TRP_2;
  		SDRAM_tRP_num = 2;
  		SDRAM_tRAS = TRAS_3;
  		SDRAM_tRAS_num = 3;
  		SDRAM_tRCD = TRCD_2;
  		SDRAM_tWR = TWR_2;
  	} else if ((sclk > 59701493) && (sclk <= 66666667)) {
  		SDRAM_tRP = TRP_1;
  		SDRAM_tRP_num = 1;
  		SDRAM_tRAS = TRAS_4;
  		SDRAM_tRAS_num = 4;
  		SDRAM_tRCD = TRCD_1;
  		SDRAM_tWR = TWR_2;
  	} else if ((sclk > 44776119) && (sclk <= 59701493)) {
  		SDRAM_tRP = TRP_1;
  		SDRAM_tRP_num = 1;
  		SDRAM_tRAS = TRAS_3;
  		SDRAM_tRAS_num = 3;
  		SDRAM_tRCD = TRCD_1;
  		SDRAM_tWR = TWR_2;
  	} else if ((sclk > 29850746) && (sclk <= 44776119)) {
  		SDRAM_tRP = TRP_1;
  		SDRAM_tRP_num = 1;
  		SDRAM_tRAS = TRAS_2;
  		SDRAM_tRAS_num = 2;
  		SDRAM_tRCD = TRCD_1;
  		SDRAM_tWR = TWR_2;
  	} else if (sclk <= 29850746) {
  		SDRAM_tRP = TRP_1;
  		SDRAM_tRP_num = 1;
  		SDRAM_tRAS = TRAS_1;
  		SDRAM_tRAS_num = 1;
  		SDRAM_tRCD = TRCD_1;
  		SDRAM_tWR = TWR_2;
  	} else {
  		SDRAM_tRP = TRP_1;
  		SDRAM_tRP_num = 1;
  		SDRAM_tRAS = TRAS_1;
  		SDRAM_tRAS_num = 1;
  		SDRAM_tRCD = TRCD_1;
  		SDRAM_tWR = TWR_2;
  	}
  	/*SDRAM INFORMATION: */
  	SDRAM_Tref = 64;	/* Refresh period in milliseconds */
  	SDRAM_NRA = 4096;	/* Number of row addresses in SDRAM */
  	SDRAM_CL = CL_3;	/* 2 */
  
  	SDRAM_SIZE = EBSZ_64;
  	SDRAM_WIDTH = EBCAW_10;
  
  	mem_SDBCTL = SDRAM_WIDTH | SDRAM_SIZE | EBE;
  
  	/* Equation from section 17 (p17-46) of BF533 HRM */
  	mem_SDRRC =
  	    (((CONFIG_SCLK_HZ / 1000) * SDRAM_Tref) / SDRAM_NRA) -
  	    (SDRAM_tRAS_num + SDRAM_tRP_num);
  
  	/* Enable SCLK Out */
  	mem_SDGCTL =
  	    (SCTLE | SDRAM_CL | SDRAM_tRAS | SDRAM_tRP | SDRAM_tRCD | SDRAM_tWR
  	     | PSS);
d4d773085   Mike Frysinger   punt Blackfin VDS...
243
  	SSYNC();
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
244

0049053ff   Mike Frysinger   Blackfin: bf537-s...
245
  	bfin_write_EBIU_SDGCTL(bfin_write_EBIU_SDGCTL() | 0x1000000);
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
246
  	/* Set the SDRAM Refresh Rate control register based on SSCLK value */
0049053ff   Mike Frysinger   Blackfin: bf537-s...
247
  	bfin_write_EBIU_SDRRC(mem_SDRRC);
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
248
249
  
  	/* SDRAM Memory Bank Control Register */
0049053ff   Mike Frysinger   Blackfin: bf537-s...
250
  	bfin_write_EBIU_SDBCTL(mem_SDBCTL);
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
251
252
  
  	/* SDRAM Memory Global Control Register */
0049053ff   Mike Frysinger   Blackfin: bf537-s...
253
  	bfin_write_EBIU_SDGCTL(mem_SDGCTL);
d4d773085   Mike Frysinger   punt Blackfin VDS...
254
  	SSYNC();
26bf7deca   Aubrey Li   [Blackfin][PATCH]...
255
256
  	return mem_SDRRC;
  }
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
257
  #endif				/* CONFIG_POST & CONFIG_SYS_POST_MEMORY */