cmd_sequoia.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. /*
  2. * (C) Copyright 2007
  3. * Stefan Roese, DENX Software Engineering, sr@denx.de.
  4. *
  5. * See file CREDITS for list of people who contributed to this
  6. * project.
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License as
  10. * published by the Free Software Foundation; either version 2 of
  11. * the License, or (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  21. * MA 02111-1307 USA
  22. *
  23. */
  24. #include <common.h>
  25. #include <command.h>
  26. #include <i2c.h>
  27. #include <asm/io.h>
  28. /*
  29. * There are 2 versions of production Sequoia & Rainier platforms.
  30. * The primary difference is the reference clock. Those with
  31. * 33333333 reference clocks will also have 667MHz rated
  32. * processors. Not enough differences to have unique clock
  33. * settings.
  34. *
  35. * NOR and NAND boot options change bytes 6, 7, 8, 9, 11. The
  36. * values are independent of the rest of the clock settings.
  37. *
  38. * All Sequoias & Rainiers select from two possible EEPROMs in Boot
  39. * Config F. One for 33MHz PCI, one for 66MHz PCI. The following
  40. * values are for the 33MHz PCI configuration. Byte 5 (0 base) is
  41. * the only value affected for a 66MHz PCI and simply needs a +0x10.
  42. */
  43. #define NAND_COMPATIBLE 0x01
  44. #define NOR_COMPATIBLE 0x02
  45. /* check with Stefan on CFG_I2C_EEPROM_ADDR */
  46. #define I2C_EEPROM_ADDR 0x52
  47. static char *config_labels[] = {
  48. "CPU: 333 PLB: 133 OPB: 66 EBC: 66",
  49. "CPU: 333 PLB: 166 OPB: 83 EBC: 55",
  50. "CPU: 400 PLB: 133 OPB: 66 EBC: 66",
  51. "CPU: 400 PLB: 160 OPB: 80 EBC: 53",
  52. "CPU: 416 PLB: 166 OPB: 83 EBC: 55",
  53. "CPU: 500 PLB: 166 OPB: 83 EBC: 55",
  54. "CPU: 533 PLB: 133 OPB: 66 EBC: 66",
  55. "CPU: 667 PLB: 166 OPB: 83 EBC: 55",
  56. NULL
  57. };
  58. static u8 boot_configs[][17] = {
  59. {
  60. (NOR_COMPATIBLE),
  61. 0x84, 0x70, 0xa2, 0xa6, 0x05, 0x57, 0xa0, 0x10, 0x40,
  62. 0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
  63. },
  64. {
  65. (NAND_COMPATIBLE | NOR_COMPATIBLE),
  66. 0xc7, 0x78, 0xf3, 0x4e, 0x05, 0xd7, 0xa0, 0x30, 0x40,
  67. 0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
  68. },
  69. {
  70. (NOR_COMPATIBLE),
  71. 0x86, 0x78, 0xc2, 0xc6, 0x05, 0x57, 0xa0, 0x30, 0x40,
  72. 0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
  73. },
  74. {
  75. (NOR_COMPATIBLE),
  76. 0x86, 0x78, 0xc2, 0xa6, 0x05, 0xd7, 0xa0, 0x10, 0x40,
  77. 0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
  78. },
  79. {
  80. (NAND_COMPATIBLE | NOR_COMPATIBLE),
  81. 0xc6, 0x78, 0x52, 0xa6, 0x05, 0xd7, 0xa0, 0x10, 0x40,
  82. 0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
  83. },
  84. {
  85. (NAND_COMPATIBLE | NOR_COMPATIBLE),
  86. 0xc7, 0x78, 0x52, 0xc6, 0x05, 0xd7, 0xa0, 0x30, 0x40,
  87. 0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
  88. },
  89. {
  90. (NOR_COMPATIBLE),
  91. 0x87, 0x78, 0x82, 0x52, 0x09, 0x57, 0xa0, 0x30, 0x40,
  92. 0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
  93. },
  94. {
  95. (NAND_COMPATIBLE | NOR_COMPATIBLE),
  96. 0x87, 0x78, 0xa2, 0x52, 0x09, 0xd7, 0xa0, 0x30, 0x40,
  97. 0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
  98. },
  99. {
  100. 0,
  101. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  102. }
  103. };
  104. /*
  105. * Bytes 6,8,9,11 change for NAND boot
  106. */
  107. static u8 nand_boot[] = {
  108. 0xd0, 0xa0, 0x68, 0x58
  109. };
  110. static int do_bootstrap(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
  111. {
  112. u8 *buf, bNAND;
  113. int x, y, nbytes, selcfg;
  114. extern char console_buffer[];
  115. if (argc < 2) {
  116. printf("Usage:\n%s\n", cmdtp->usage);
  117. return 1;
  118. }
  119. if ((strcmp(argv[1], "nor") != 0) &&
  120. (strcmp(argv[1], "nand") != 0)) {
  121. printf("Unsupported boot-device - only nor|nand support\n");
  122. return 1;
  123. }
  124. /* set the nand flag based on provided input */
  125. if ((strcmp(argv[1], "nand") == 0))
  126. bNAND = 1;
  127. else
  128. bNAND = 0;
  129. printf("Available configurations: \n\n");
  130. if (bNAND) {
  131. for(x = 0, y = 0; boot_configs[x][0] != 0; x++) {
  132. /* filter on nand compatible */
  133. if (boot_configs[x][0] & NAND_COMPATIBLE) {
  134. printf(" %d - %s\n", (y+1), config_labels[x]);
  135. y++;
  136. }
  137. }
  138. } else {
  139. for(x = 0, y = 0; boot_configs[x][0] != 0; x++) {
  140. /* filter on nor compatible */
  141. if (boot_configs[x][0] & NOR_COMPATIBLE) {
  142. printf(" %d - %s\n", (y+1), config_labels[x]);
  143. y++;
  144. }
  145. }
  146. }
  147. do {
  148. nbytes = readline(" Selection [1-x / quit]: ");
  149. if (nbytes) {
  150. if (strcmp(console_buffer, "quit") == 0)
  151. return 0;
  152. selcfg = simple_strtol(console_buffer, NULL, 10);
  153. if ((selcfg < 1) || (selcfg > y))
  154. nbytes = 0;
  155. }
  156. } while (nbytes == 0);
  157. y = (selcfg - 1);
  158. for (x = 0; boot_configs[x][0] != 0; x++) {
  159. if (bNAND) {
  160. if (boot_configs[x][0] & NAND_COMPATIBLE) {
  161. if (y > 0)
  162. y--;
  163. else if (y < 1)
  164. break;
  165. }
  166. } else {
  167. if (boot_configs[x][0] & NOR_COMPATIBLE) {
  168. if (y > 0)
  169. y--;
  170. else if (y < 1)
  171. break;
  172. }
  173. }
  174. }
  175. buf = &boot_configs[x][1];
  176. if (bNAND) {
  177. buf[6] = nand_boot[0];
  178. buf[8] = nand_boot[1];
  179. buf[9] = nand_boot[2];
  180. buf[11] = nand_boot[3];
  181. }
  182. /* check CPLD register +5 for PCI 66MHz flag */
  183. if ((in_8((void *)(CFG_BCSR_BASE + 5)) & CFG_BCSR5_PCI66EN) == 0)
  184. /*
  185. * PLB-to-PCI divisor = 3 for 33MHz sync PCI
  186. * instead of 2 for 66MHz systems
  187. */
  188. buf[5] |= 0x08;
  189. if (i2c_write(I2C_EEPROM_ADDR, 0, 1, buf, 16) != 0)
  190. printf("Error writing to EEPROM at address 0x%x\n", I2C_EEPROM_ADDR);
  191. udelay(CFG_EEPROM_PAGE_WRITE_DELAY_MS * 1000);
  192. printf("Done\n");
  193. printf("Please power-cycle the board for the changes to take effect\n");
  194. return 0;
  195. }
  196. U_BOOT_CMD(
  197. bootstrap, 2, 0, do_bootstrap,
  198. "bootstrap - program the I2C bootstrap EEPROM\n",
  199. "<nand|nor> - strap to boot from NAND or NOR flash\n"
  200. );