selfcheck.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2008 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
  4. */
  5. #include <common.h>
  6. #include <console.h>
  7. #include <asm/io.h>
  8. #include <asm/processor.h>
  9. #include <asm/pci.h>
  10. #if defined(CONFIG_CPU_32BIT)
  11. #define NOCACHE_OFFSET 0x00000000
  12. #else
  13. #define NOCACHE_OFFSET 0xa0000000
  14. #endif
  15. #define PLD_LEDCR (0x04000008 + NOCACHE_OFFSET)
  16. #define PLD_SWSR (0x0400000a + NOCACHE_OFFSET)
  17. #define PLD_VERSR (0x0400000c + NOCACHE_OFFSET)
  18. #define SM107_DEVICEID (0x13e00060 + NOCACHE_OFFSET)
  19. static void test_pld(void)
  20. {
  21. printf("PLD version = %04x\n", readb(PLD_VERSR));
  22. }
  23. static void test_sm107(void)
  24. {
  25. printf("SM107 device ID = %04x\n", readl(SM107_DEVICEID));
  26. }
  27. static void test_led(void)
  28. {
  29. printf("turn on LEDs 3, 5, 7, 9\n");
  30. writeb(0x55, PLD_LEDCR);
  31. mdelay(2000);
  32. printf("turn on LEDs 4, 6, 8, 10\n");
  33. writeb(0xaa, PLD_LEDCR);
  34. mdelay(2000);
  35. writeb(0x00, PLD_LEDCR);
  36. }
  37. static void test_dipsw(void)
  38. {
  39. printf("Please DIPSW set = B'0101\n");
  40. while (readb(PLD_SWSR) != 0x05) {
  41. if (ctrlc())
  42. return;
  43. }
  44. printf("Please DIPSW set = B'1010\n");
  45. while (readb(PLD_SWSR) != 0x0A) {
  46. if (ctrlc())
  47. return;
  48. }
  49. printf("DIPSW OK\n");
  50. }
  51. static void test_net(void)
  52. {
  53. unsigned long data;
  54. writel(0x80000000, 0xfe0401c0);
  55. data = readl(0xfe040220);
  56. if (data == 0x816910ec)
  57. printf("Ethernet OK\n");
  58. else
  59. printf("Ethernet NG, data = %08x\n", (unsigned int)data);
  60. }
  61. static void test_sata(void)
  62. {
  63. unsigned long data;
  64. writel(0x80000800, 0xfe0401c0);
  65. data = readl(0xfe040220);
  66. if (data == 0x35121095)
  67. printf("SATA OK\n");
  68. else
  69. printf("SATA NG, data = %08x\n", (unsigned int)data);
  70. }
  71. static void test_pci(void)
  72. {
  73. writel(0x80001800, 0xfe0401c0);
  74. printf("PCI CN1 ID = %08x\n", readl(0xfe040220));
  75. writel(0x80001000, 0xfe0401c0);
  76. printf("PCI CN2 ID = %08x\n", readl(0xfe040220));
  77. }
  78. int do_hw_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  79. {
  80. char *cmd;
  81. if (argc != 2)
  82. return cmd_usage(cmdtp);
  83. cmd = argv[1];
  84. switch (cmd[0]) {
  85. case 'a': /* all */
  86. test_pld();
  87. test_led();
  88. test_dipsw();
  89. test_sm107();
  90. test_net();
  91. test_sata();
  92. test_pci();
  93. break;
  94. case 'p': /* pld or pci */
  95. if (cmd[1] == 'l')
  96. test_pld();
  97. else
  98. test_pci();
  99. break;
  100. case 'l': /* led */
  101. test_led();
  102. break;
  103. case 'd': /* dipsw */
  104. test_dipsw();
  105. break;
  106. case 's': /* sm107 or sata */
  107. if (cmd[1] == 'm')
  108. test_sm107();
  109. else
  110. test_sata();
  111. break;
  112. case 'n': /* net */
  113. test_net();
  114. break;
  115. default:
  116. return cmd_usage(cmdtp);
  117. }
  118. return 0;
  119. }
  120. U_BOOT_CMD(
  121. hwtest, 2, 1, do_hw_test,
  122. "hardware test for R0P7785LC0011RL board",
  123. "\n"
  124. "hwtest all - test all hardware\n"
  125. "hwtest pld - output PLD version\n"
  126. "hwtest led - turn on LEDs\n"
  127. "hwtest dipsw - test DIP switch\n"
  128. "hwtest sm107 - output SM107 version\n"
  129. "hwtest net - check RTL8110 ID\n"
  130. "hwtest sata - check SiI3512 ID\n"
  131. "hwtest pci - output PCI slot device ID"
  132. );