post-memory.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #include <common.h>
  2. #include <asm/io.h>
  3. #include <post.h>
  4. #include <watchdog.h>
  5. #if CONFIG_POST & CONFIG_SYS_POST_MEMORY
  6. #define CLKIN 25000000
  7. #define PATTERN1 0x5A5A5A5A
  8. #define PATTERN2 0xAAAAAAAA
  9. #define CCLK_NUM 4
  10. #define SCLK_NUM 3
  11. void post_out_buff(char *buff);
  12. void post_init_pll(int mult, int div);
  13. int post_init_sdram(int sclk);
  14. void post_init_uart(int sclk);
  15. const int pll[CCLK_NUM][SCLK_NUM][2] = {
  16. { {20, 4}, {20, 5}, {20, 10} }, /* CCLK = 500M */
  17. { {16, 4}, {16, 5}, {16, 8} }, /* CCLK = 400M */
  18. { {8, 2}, {8, 4}, {8, 5} }, /* CCLK = 200M */
  19. { {4, 1}, {4, 2}, {4, 4} } /* CCLK = 100M */
  20. };
  21. const char *const log[CCLK_NUM][SCLK_NUM] = {
  22. {"CCLK-500MHz SCLK-125MHz: Writing...\0",
  23. "CCLK-500MHz SCLK-100MHz: Writing...\0",
  24. "CCLK-500MHz SCLK- 50MHz: Writing...\0",},
  25. {"CCLK-400MHz SCLK-100MHz: Writing...\0",
  26. "CCLK-400MHz SCLK- 80MHz: Writing...\0",
  27. "CCLK-400MHz SCLK- 50MHz: Writing...\0",},
  28. {"CCLK-200MHz SCLK-100MHz: Writing...\0",
  29. "CCLK-200MHz SCLK- 50MHz: Writing...\0",
  30. "CCLK-200MHz SCLK- 40MHz: Writing...\0",},
  31. {"CCLK-100MHz SCLK-100MHz: Writing...\0",
  32. "CCLK-100MHz SCLK- 50MHz: Writing...\0",
  33. "CCLK-100MHz SCLK- 25MHz: Writing...\0",},
  34. };
  35. int memory_post_test(int flags)
  36. {
  37. int addr;
  38. int m, n;
  39. int sclk, sclk_temp;
  40. int ret = 1;
  41. sclk_temp = CLKIN / 1000000;
  42. sclk_temp = sclk_temp * CONFIG_VCO_MULT;
  43. for (sclk = 0; sclk_temp > 0; sclk++)
  44. sclk_temp -= CONFIG_SCLK_DIV;
  45. sclk = sclk * 1000000;
  46. post_init_uart(sclk);
  47. if (post_hotkeys_pressed() == 0)
  48. return 0;
  49. for (m = 0; m < CCLK_NUM; m++) {
  50. for (n = 0; n < SCLK_NUM; n++) {
  51. /* Calculate the sclk */
  52. sclk_temp = CLKIN / 1000000;
  53. sclk_temp = sclk_temp * pll[m][n][0];
  54. for (sclk = 0; sclk_temp > 0; sclk++)
  55. sclk_temp -= pll[m][n][1];
  56. sclk = sclk * 1000000;
  57. post_init_pll(pll[m][n][0], pll[m][n][1]);
  58. post_init_sdram(sclk);
  59. post_init_uart(sclk);
  60. post_out_buff("\n\r\0");
  61. post_out_buff(log[m][n]);
  62. for (addr = 0x0; addr < CONFIG_SYS_MAX_RAM_SIZE; addr += 4)
  63. *(unsigned long *)addr = PATTERN1;
  64. post_out_buff("Reading...\0");
  65. for (addr = 0x0; addr < CONFIG_SYS_MAX_RAM_SIZE; addr += 4) {
  66. if ((*(unsigned long *)addr) != PATTERN1) {
  67. post_out_buff("Error\n\r\0");
  68. ret = 0;
  69. }
  70. }
  71. post_out_buff("OK\n\r\0");
  72. }
  73. }
  74. if (ret)
  75. post_out_buff("memory POST passed\n\r\0");
  76. else
  77. post_out_buff("memory POST failed\n\r\0");
  78. post_out_buff("\n\r\n\r\0");
  79. return 1;
  80. }
  81. void post_init_uart(int sclk)
  82. {
  83. int divisor;
  84. for (divisor = 0; sclk > 0; divisor++)
  85. sclk -= 57600 * 16;
  86. bfin_write_PORTF_FER(0x000F);
  87. bfin_write_PORTH_FER(0xFFFF);
  88. bfin_write_UART_GCTL(0x00);
  89. bfin_write_UART_LCR(0x83);
  90. SSYNC();
  91. bfin_write_UART_DLL(divisor & 0xFF);
  92. SSYNC();
  93. bfin_write_UART_DLH((divisor >> 8) & 0xFF);
  94. SSYNC();
  95. bfin_write_UART_LCR(0x03);
  96. SSYNC();
  97. bfin_write_UART_GCTL(0x01);
  98. SSYNC();
  99. }
  100. void post_out_buff(char *buff)
  101. {
  102. int i = 0;
  103. for (i = 0; i < 0x80000; i++)
  104. ;
  105. i = 0;
  106. while ((buff[i] != '\0') && (i != 100)) {
  107. while (!(bfin_read_pUART_LSR() & 0x20)) ;
  108. bfin_write_UART_THR(buff[i]);
  109. SSYNC();
  110. i++;
  111. }
  112. for (i = 0; i < 0x80000; i++)
  113. ;
  114. }
  115. void post_init_pll(int mult, int div)
  116. {
  117. bfin_write_SIC_IWR(0x01);
  118. bfin_write_PLL_CTL((mult << 9));
  119. bfin_write_PLL_DIV(div);
  120. asm("CLI R2;");
  121. asm("IDLE;");
  122. asm("STI R2;");
  123. while (!(bfin_read_PLL_STAT() & 0x20)) ;
  124. }
  125. int post_init_sdram(int sclk)
  126. {
  127. int SDRAM_tRP, SDRAM_tRP_num, SDRAM_tRAS, SDRAM_tRAS_num, SDRAM_tRCD,
  128. SDRAM_tWR;
  129. int SDRAM_Tref, SDRAM_NRA, SDRAM_CL, SDRAM_SIZE, SDRAM_WIDTH,
  130. mem_SDGCTL, mem_SDBCTL, mem_SDRRC;
  131. if ((sclk > 119402985)) {
  132. SDRAM_tRP = TRP_2;
  133. SDRAM_tRP_num = 2;
  134. SDRAM_tRAS = TRAS_7;
  135. SDRAM_tRAS_num = 7;
  136. SDRAM_tRCD = TRCD_2;
  137. SDRAM_tWR = TWR_2;
  138. } else if ((sclk > 104477612) && (sclk <= 119402985)) {
  139. SDRAM_tRP = TRP_2;
  140. SDRAM_tRP_num = 2;
  141. SDRAM_tRAS = TRAS_6;
  142. SDRAM_tRAS_num = 6;
  143. SDRAM_tRCD = TRCD_2;
  144. SDRAM_tWR = TWR_2;
  145. } else if ((sclk > 89552239) && (sclk <= 104477612)) {
  146. SDRAM_tRP = TRP_2;
  147. SDRAM_tRP_num = 2;
  148. SDRAM_tRAS = TRAS_5;
  149. SDRAM_tRAS_num = 5;
  150. SDRAM_tRCD = TRCD_2;
  151. SDRAM_tWR = TWR_2;
  152. } else if ((sclk > 74626866) && (sclk <= 89552239)) {
  153. SDRAM_tRP = TRP_2;
  154. SDRAM_tRP_num = 2;
  155. SDRAM_tRAS = TRAS_4;
  156. SDRAM_tRAS_num = 4;
  157. SDRAM_tRCD = TRCD_2;
  158. SDRAM_tWR = TWR_2;
  159. } else if ((sclk > 66666667) && (sclk <= 74626866)) {
  160. SDRAM_tRP = TRP_2;
  161. SDRAM_tRP_num = 2;
  162. SDRAM_tRAS = TRAS_3;
  163. SDRAM_tRAS_num = 3;
  164. SDRAM_tRCD = TRCD_2;
  165. SDRAM_tWR = TWR_2;
  166. } else if ((sclk > 59701493) && (sclk <= 66666667)) {
  167. SDRAM_tRP = TRP_1;
  168. SDRAM_tRP_num = 1;
  169. SDRAM_tRAS = TRAS_4;
  170. SDRAM_tRAS_num = 4;
  171. SDRAM_tRCD = TRCD_1;
  172. SDRAM_tWR = TWR_2;
  173. } else if ((sclk > 44776119) && (sclk <= 59701493)) {
  174. SDRAM_tRP = TRP_1;
  175. SDRAM_tRP_num = 1;
  176. SDRAM_tRAS = TRAS_3;
  177. SDRAM_tRAS_num = 3;
  178. SDRAM_tRCD = TRCD_1;
  179. SDRAM_tWR = TWR_2;
  180. } else if ((sclk > 29850746) && (sclk <= 44776119)) {
  181. SDRAM_tRP = TRP_1;
  182. SDRAM_tRP_num = 1;
  183. SDRAM_tRAS = TRAS_2;
  184. SDRAM_tRAS_num = 2;
  185. SDRAM_tRCD = TRCD_1;
  186. SDRAM_tWR = TWR_2;
  187. } else if (sclk <= 29850746) {
  188. SDRAM_tRP = TRP_1;
  189. SDRAM_tRP_num = 1;
  190. SDRAM_tRAS = TRAS_1;
  191. SDRAM_tRAS_num = 1;
  192. SDRAM_tRCD = TRCD_1;
  193. SDRAM_tWR = TWR_2;
  194. } else {
  195. SDRAM_tRP = TRP_1;
  196. SDRAM_tRP_num = 1;
  197. SDRAM_tRAS = TRAS_1;
  198. SDRAM_tRAS_num = 1;
  199. SDRAM_tRCD = TRCD_1;
  200. SDRAM_tWR = TWR_2;
  201. }
  202. /*SDRAM INFORMATION: */
  203. SDRAM_Tref = 64; /* Refresh period in milliseconds */
  204. SDRAM_NRA = 4096; /* Number of row addresses in SDRAM */
  205. SDRAM_CL = CL_3; /* 2 */
  206. SDRAM_SIZE = EBSZ_64;
  207. SDRAM_WIDTH = EBCAW_10;
  208. mem_SDBCTL = SDRAM_WIDTH | SDRAM_SIZE | EBE;
  209. /* Equation from section 17 (p17-46) of BF533 HRM */
  210. mem_SDRRC =
  211. (((CONFIG_SCLK_HZ / 1000) * SDRAM_Tref) / SDRAM_NRA) -
  212. (SDRAM_tRAS_num + SDRAM_tRP_num);
  213. /* Enable SCLK Out */
  214. mem_SDGCTL =
  215. (SCTLE | SDRAM_CL | SDRAM_tRAS | SDRAM_tRP | SDRAM_tRCD | SDRAM_tWR
  216. | PSS);
  217. SSYNC();
  218. bfin_write_EBIU_SDGCTL(bfin_write_EBIU_SDGCTL() | 0x1000000);
  219. /* Set the SDRAM Refresh Rate control register based on SSCLK value */
  220. bfin_write_EBIU_SDRRC(mem_SDRRC);
  221. /* SDRAM Memory Bank Control Register */
  222. bfin_write_EBIU_SDBCTL(mem_SDBCTL);
  223. /* SDRAM Memory Global Control Register */
  224. bfin_write_EBIU_SDGCTL(mem_SDGCTL);
  225. SSYNC();
  226. return mem_SDRRC;
  227. }
  228. #endif /* CONFIG_POST & CONFIG_SYS_POST_MEMORY */