cmd_arc.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
  2. /*
  3. * Command for accessing Arcturus factory environment.
  4. *
  5. * Copyright 2013-2015 Arcturus Networks Inc.
  6. * http://www.arcturusnetworks.com/products/ucp1020/
  7. * by Oleksandr G Zhadan et al.
  8. *
  9. */
  10. #include <common.h>
  11. #include <div64.h>
  12. #include <malloc.h>
  13. #include <spi_flash.h>
  14. #include <asm/io.h>
  15. #ifndef CONFIG_SF_DEFAULT_SPEED
  16. # define CONFIG_SF_DEFAULT_SPEED 1000000
  17. #endif
  18. #ifndef CONFIG_SF_DEFAULT_MODE
  19. # define CONFIG_SF_DEFAULT_MODE SPI_MODE0
  20. #endif
  21. #ifndef CONFIG_SF_DEFAULT_CS
  22. # define CONFIG_SF_DEFAULT_CS 0
  23. #endif
  24. #ifndef CONFIG_SF_DEFAULT_BUS
  25. # define CONFIG_SF_DEFAULT_BUS 0
  26. #endif
  27. #define MAX_SERIAL_SIZE 15
  28. #define MAX_HWADDR_SIZE 17
  29. #define FIRM_ADDR1 (0x200 - sizeof(smac))
  30. #define FIRM_ADDR2 (0x400 - sizeof(smac))
  31. #define FIRM_ADDR3 (CONFIG_ENV_SECT_SIZE + 0x200 - sizeof(smac))
  32. #define FIRM_ADDR4 (CONFIG_ENV_SECT_SIZE + 0x400 - sizeof(smac))
  33. static struct spi_flash *flash;
  34. char smac[4][18];
  35. static int ishwaddr(char *hwaddr)
  36. {
  37. if (strlen(hwaddr) == MAX_HWADDR_SIZE)
  38. if (hwaddr[2] == ':' &&
  39. hwaddr[5] == ':' &&
  40. hwaddr[8] == ':' &&
  41. hwaddr[11] == ':' &&
  42. hwaddr[14] == ':')
  43. return 0;
  44. return -1;
  45. }
  46. static int set_arc_product(int argc, char *const argv[])
  47. {
  48. int err = 0;
  49. char *mystrerr = "ERROR: Failed to save factory info in spi location";
  50. if (argc != 5)
  51. return -1;
  52. /* Check serial number */
  53. if (strlen(argv[1]) != MAX_SERIAL_SIZE)
  54. return -1;
  55. /* Check HWaddrs */
  56. if (ishwaddr(argv[2]) || ishwaddr(argv[3]) || ishwaddr(argv[4]))
  57. return -1;
  58. strcpy(smac[3], argv[1]);
  59. strcpy(smac[2], argv[2]);
  60. strcpy(smac[1], argv[3]);
  61. strcpy(smac[0], argv[4]);
  62. flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS,
  63. CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE);
  64. /*
  65. * Save factory defaults
  66. */
  67. if (spi_flash_write(flash, FIRM_ADDR1, sizeof(smac), smac)) {
  68. printf("%s: %s [1]\n", __func__, mystrerr);
  69. err++;
  70. }
  71. if (spi_flash_write(flash, FIRM_ADDR2, sizeof(smac), smac)) {
  72. printf("%s: %s [2]\n", __func__, mystrerr);
  73. err++;
  74. }
  75. if (spi_flash_write(flash, FIRM_ADDR3, sizeof(smac), smac)) {
  76. printf("%s: %s [3]\n", __func__, mystrerr);
  77. err++;
  78. }
  79. if (spi_flash_write(flash, FIRM_ADDR4, sizeof(smac), smac)) {
  80. printf("%s: %s [4]\n", __func__, mystrerr);
  81. err++;
  82. }
  83. if (err == 4) {
  84. printf("%s: %s [ALL]\n", __func__, mystrerr);
  85. return -2;
  86. }
  87. return 0;
  88. }
  89. int get_arc_info(void)
  90. {
  91. int location = 1;
  92. char *myerr = "ERROR: Failed to read all 4 factory info spi locations";
  93. flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS,
  94. CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE);
  95. if (spi_flash_read(flash, FIRM_ADDR1, sizeof(smac), smac)) {
  96. location++;
  97. if (spi_flash_read(flash, FIRM_ADDR2, sizeof(smac), smac)) {
  98. location++;
  99. if (spi_flash_read(flash, FIRM_ADDR3, sizeof(smac),
  100. smac)) {
  101. location++;
  102. if (spi_flash_read(flash, FIRM_ADDR4,
  103. sizeof(smac), smac)) {
  104. printf("%s: %s\n", __func__, myerr);
  105. return -2;
  106. }
  107. }
  108. }
  109. }
  110. if (smac[3][0] != 0) {
  111. if (location > 1)
  112. printf("Using region %d\n", location);
  113. printf("SERIAL: ");
  114. if (smac[3][0] == 0xFF) {
  115. printf("\t<not found>\n");
  116. } else {
  117. printf("\t%s\n", smac[3]);
  118. env_set("SERIAL", smac[3]);
  119. }
  120. }
  121. if (strcmp(smac[2], "00:00:00:00:00:00") == 0)
  122. return 0;
  123. printf("HWADDR0:");
  124. if (smac[2][0] == 0xFF) {
  125. printf("\t<not found>\n");
  126. } else {
  127. char *ret = env_get("ethaddr");
  128. if (strcmp(ret, __stringify(CONFIG_ETHADDR)) == 0) {
  129. env_set("ethaddr", smac[2]);
  130. printf("\t%s (factory)\n", smac[2]);
  131. } else {
  132. printf("\t%s\n", ret);
  133. }
  134. }
  135. if (strcmp(smac[1], "00:00:00:00:00:00") == 0) {
  136. env_set("eth1addr", smac[2]);
  137. env_set("eth2addr", smac[2]);
  138. return 0;
  139. }
  140. printf("HWADDR1:");
  141. if (smac[1][0] == 0xFF) {
  142. printf("\t<not found>\n");
  143. } else {
  144. char *ret = env_get("eth1addr");
  145. if (strcmp(ret, __stringify(CONFIG_ETH1ADDR)) == 0) {
  146. env_set("eth1addr", smac[1]);
  147. printf("\t%s (factory)\n", smac[1]);
  148. } else {
  149. printf("\t%s\n", ret);
  150. }
  151. }
  152. if (strcmp(smac[0], "00:00:00:00:00:00") == 0) {
  153. env_set("eth2addr", smac[1]);
  154. return 0;
  155. }
  156. printf("HWADDR2:");
  157. if (smac[0][0] == 0xFF) {
  158. printf("\t<not found>\n");
  159. } else {
  160. char *ret = env_get("eth2addr");
  161. if (strcmp(ret, __stringify(CONFIG_ETH2ADDR)) == 0) {
  162. env_set("eth2addr", smac[0]);
  163. printf("\t%s (factory)\n", smac[0]);
  164. } else {
  165. printf("\t%s\n", ret);
  166. }
  167. }
  168. return 0;
  169. }
  170. static int do_arc_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
  171. {
  172. const char *cmd;
  173. int ret = -1;
  174. cmd = argv[1];
  175. --argc;
  176. ++argv;
  177. if (strcmp(cmd, "product") == 0) {
  178. ret = set_arc_product(argc, argv);
  179. goto done;
  180. }
  181. if (strcmp(cmd, "info") == 0) {
  182. ret = get_arc_info();
  183. goto done;
  184. }
  185. done:
  186. if (ret == -1)
  187. return CMD_RET_USAGE;
  188. return ret;
  189. }
  190. U_BOOT_CMD(arc, 6, 1, do_arc_cmd,
  191. "Arcturus product command sub-system",
  192. "product serial hwaddr0 hwaddr1 hwaddr2 - save Arcturus factory env\n"
  193. "info - show Arcturus factory env\n\n");