selfcheck.c 2.9 KB

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