cmd_sequoia.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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. /*
  28. * There are 2 versions of production Sequoia & Rainier platforms.
  29. * The primary difference is the reference clock. Those with
  30. * 33333333 reference clocks will also have 667MHz rated
  31. * processors. Not enough differences to have unique clock
  32. * settings.
  33. *
  34. * NOR and NAND boot options change bytes 6, 7, 8, 9, 11. The
  35. * values are independent of the rest of the clock settings.
  36. *
  37. * All Sequoias & Rainiers select from two possible EEPROMs in Boot
  38. * Config F. One for 33MHz PCI, one for 66MHz PCI. The following
  39. * values are for the 33MHz PCI configuration. Byte 5 (0 base) is
  40. * the only value affected for a 66MHz PCI and simply needs a +0x10.
  41. */
  42. #define NAND_COMPATIBLE 0x01
  43. #define NOR_COMPATIBLE 0x02
  44. /* check with Stefan on CFG_I2C_EEPROM_ADDR */
  45. #define I2C_EEPROM_ADDR 0x52
  46. static char *config_labels[] = {
  47. "CPU: 333 PLB: 133 OPB: 66 EBC: 66",
  48. "CPU: 333 PLB: 166 OPB: 83 EBC: 55",
  49. "CPU: 400 PLB: 133 OPB: 66 EBC: 66",
  50. "CPU: 400 PLB: 160 OPB: 80 EBC: 53",
  51. "CPU: 416 PLB: 166 OPB: 83 EBC: 55",
  52. "CPU: 500 PLB: 166 OPB: 83 EBC: 55",
  53. "CPU: 533 PLB: 133 OPB: 66 EBC: 66",
  54. "CPU: 667 PLB: 166 OPB: 83 EBC: 55",
  55. NULL
  56. };
  57. static u8 boot_configs[][17] = {
  58. {
  59. (NOR_COMPATIBLE),
  60. 0x84, 0x70, 0xa2, 0xa6, 0x05, 0x57, 0xa0, 0x10, 0x40,
  61. 0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
  62. },
  63. {
  64. (NAND_COMPATIBLE | NOR_COMPATIBLE),
  65. 0xc7, 0x78, 0xf3, 0x4e, 0x05, 0xd7, 0xa0, 0x30, 0x40,
  66. 0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
  67. },
  68. {
  69. (NOR_COMPATIBLE),
  70. 0x86, 0x78, 0xc2, 0xc6, 0x05, 0x57, 0xa0, 0x30, 0x40,
  71. 0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
  72. },
  73. {
  74. (NOR_COMPATIBLE),
  75. 0x86, 0x78, 0xc2, 0xa6, 0x05, 0xd7, 0xa0, 0x10, 0x40,
  76. 0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
  77. },
  78. {
  79. (NAND_COMPATIBLE | NOR_COMPATIBLE),
  80. 0xc6, 0x78, 0x52, 0xa6, 0x05, 0xd7, 0xa0, 0x10, 0x40,
  81. 0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
  82. },
  83. {
  84. (NAND_COMPATIBLE | NOR_COMPATIBLE),
  85. 0xc7, 0x78, 0x52, 0xc6, 0x05, 0xd7, 0xa0, 0x30, 0x40,
  86. 0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
  87. },
  88. {
  89. (NOR_COMPATIBLE),
  90. 0x87, 0x78, 0x82, 0x52, 0x09, 0x57, 0xa0, 0x30, 0x40,
  91. 0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
  92. },
  93. {
  94. (NAND_COMPATIBLE | NOR_COMPATIBLE),
  95. 0x87, 0x78, 0xa2, 0x52, 0x09, 0xd7, 0xa0, 0x30, 0x40,
  96. 0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
  97. },
  98. {
  99. 0,
  100. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  101. }
  102. };
  103. /*
  104. * Bytes 6,8,9,11 change for NAND boot
  105. */
  106. static u8 nand_boot[] = {
  107. 0xd0, 0xa0, 0x68, 0x58
  108. };
  109. static int do_bootstrap(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
  110. {
  111. u8 *buf, bNAND;
  112. int x, y, nbytes, selcfg;
  113. extern char console_buffer[];
  114. if (argc < 2) {
  115. printf("Usage:\n%s\n", cmdtp->usage);
  116. return 1;
  117. }
  118. if ((strcmp(argv[1], "nor") != 0) &&
  119. (strcmp(argv[1], "nand") != 0)) {
  120. printf("Unsupported boot-device - only nor|nand support\n");
  121. return 1;
  122. }
  123. /* set the nand flag based on provided input */
  124. if ((strcmp(argv[1], "nand") == 0))
  125. bNAND = 1;
  126. else
  127. bNAND = 0;
  128. printf("Available configurations: \n\n");
  129. if (bNAND) {
  130. for(x = 0, y = 0; boot_configs[x][0] != 0; x++) {
  131. /* filter on nand compatible */
  132. if (boot_configs[x][0] & NAND_COMPATIBLE) {
  133. printf(" %d - %s\n", (y+1), config_labels[x]);
  134. y++;
  135. }
  136. }
  137. } else {
  138. for(x = 0, y = 0; boot_configs[x][0] != 0; x++) {
  139. /* filter on nor compatible */
  140. if (boot_configs[x][0] & NOR_COMPATIBLE) {
  141. printf(" %d - %s\n", (y+1), config_labels[x]);
  142. y++;
  143. }
  144. }
  145. }
  146. do {
  147. nbytes = readline(" Selection [1-x / quit]: ");
  148. if (nbytes) {
  149. if (strcmp(console_buffer, "quit") == 0)
  150. return 0;
  151. selcfg = simple_strtol(console_buffer, NULL, 10);
  152. if ((selcfg < 1) || (selcfg > y))
  153. nbytes = 0;
  154. }
  155. } while (nbytes == 0);
  156. y = (selcfg - 1);
  157. for (x = 0; boot_configs[x][0] != 0; x++) {
  158. if (bNAND) {
  159. if (boot_configs[x][0] & NAND_COMPATIBLE) {
  160. if (y > 0)
  161. y--;
  162. else if (y < 1)
  163. break;
  164. }
  165. } else {
  166. if (boot_configs[x][0] & NOR_COMPATIBLE) {
  167. if (y > 0)
  168. y--;
  169. else if (y < 1)
  170. break;
  171. }
  172. }
  173. }
  174. buf = &boot_configs[x][1];
  175. if (bNAND) {
  176. buf[6] = nand_boot[0];
  177. buf[8] = nand_boot[1];
  178. buf[9] = nand_boot[2];
  179. buf[11] = nand_boot[3];
  180. }
  181. /* check CPLD register +5 for PCI 66MHz flag */
  182. if (in8(CFG_BCSR_BASE + 5) & 0x01)
  183. buf[5] += 0x10;
  184. if (i2c_write(I2C_EEPROM_ADDR, 0, 1, buf, 16) != 0)
  185. printf("Error writing to EEPROM at address 0x%x\n", I2C_EEPROM_ADDR);
  186. udelay(CFG_EEPROM_PAGE_WRITE_DELAY_MS * 1000);
  187. printf("Done\n");
  188. printf("Please power-cycle the board for the changes to take effect\n");
  189. return 0;
  190. }
  191. U_BOOT_CMD(
  192. bootstrap, 2, 0, do_bootstrap,
  193. "bootstrap - program the I2C bootstrap EEPROM\n",
  194. "<nand|nor> - strap to boot from NAND or NOR flash\n"
  195. );