1 /* 2 * Copyright (C) 2008 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com> 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License as 6 * published by the Free Software Foundation; either version 2 of 7 * the License, or (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 17 * MA 02111-1307 USA 18 */ 19 20 #include <common.h> 21 #include <asm/io.h> 22 #include <asm/processor.h> 23 #include <asm/pci.h> 24 25 #if defined(CONFIG_CPU_32BIT) 26 #define NOCACHE_OFFSET 0x00000000 27 #else 28 #define NOCACHE_OFFSET 0xa0000000 29 #endif 30 #define PLD_LEDCR (0x04000008 + NOCACHE_OFFSET) 31 #define PLD_SWSR (0x0400000a + NOCACHE_OFFSET) 32 #define PLD_VERSR (0x0400000c + NOCACHE_OFFSET) 33 34 #define SM107_DEVICEID (0x13e00060 + NOCACHE_OFFSET) 35 36 static void wait_ms(unsigned long time) 37 { 38 while (time--) 39 udelay(1000); 40 } 41 42 static void test_pld(void) 43 { 44 printf("PLD version = %04x\n", readb(PLD_VERSR)); 45 } 46 47 static void test_sm107(void) 48 { 49 printf("SM107 device ID = %04x\n", readl(SM107_DEVICEID)); 50 } 51 52 static void test_led(void) 53 { 54 printf("turn on LEDs 3, 5, 7, 9\n"); 55 writeb(0x55, PLD_LEDCR); 56 wait_ms(2000); 57 printf("turn on LEDs 4, 6, 8, 10\n"); 58 writeb(0xaa, PLD_LEDCR); 59 wait_ms(2000); 60 writeb(0x00, PLD_LEDCR); 61 } 62 63 static void test_dipsw(void) 64 { 65 printf("Please DIPSW set = B'0101\n"); 66 while (readb(PLD_SWSR) != 0x05) { 67 if (ctrlc()) 68 return; 69 } 70 printf("Please DIPSW set = B'1010\n"); 71 while (readb(PLD_SWSR) != 0x0A) { 72 if (ctrlc()) 73 return; 74 } 75 printf("DIPSW OK\n"); 76 } 77 78 static void test_net(void) 79 { 80 unsigned long data; 81 82 writel(0x80000000, 0xfe0401c0); 83 data = readl(0xfe040220); 84 if (data == 0x816910ec) 85 printf("Ethernet OK\n"); 86 else 87 printf("Ethernet NG, data = %08x\n", (unsigned int)data); 88 } 89 90 static void test_sata(void) 91 { 92 unsigned long data; 93 94 writel(0x80000800, 0xfe0401c0); 95 data = readl(0xfe040220); 96 if (data == 0x35121095) 97 printf("SATA OK\n"); 98 else 99 printf("SATA NG, data = %08x\n", (unsigned int)data); 100 } 101 102 static void test_pci(void) 103 { 104 writel(0x80001800, 0xfe0401c0); 105 printf("PCI CN1 ID = %08x\n", readl(0xfe040220)); 106 107 writel(0x80001000, 0xfe0401c0); 108 printf("PCI CN2 ID = %08x\n", readl(0xfe040220)); 109 } 110 111 int do_hw_test(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) 112 { 113 char *cmd; 114 115 if (argc != 2) { 116 cmd_usage(cmdtp); 117 return 1; 118 } 119 120 cmd = argv[1]; 121 switch (cmd[0]) { 122 case 'a': /* all */ 123 test_pld(); 124 test_led(); 125 test_dipsw(); 126 test_sm107(); 127 test_net(); 128 test_sata(); 129 test_pci(); 130 break; 131 case 'p': /* pld or pci */ 132 if (cmd[1] == 'l') 133 test_pld(); 134 else 135 test_pci(); 136 break; 137 case 'l': /* led */ 138 test_led(); 139 break; 140 case 'd': /* dipsw */ 141 test_dipsw(); 142 break; 143 case 's': /* sm107 or sata */ 144 if (cmd[1] == 'm') 145 test_sm107(); 146 else 147 test_sata(); 148 break; 149 case 'n': /* net */ 150 test_net(); 151 break; 152 default: 153 cmd_usage(cmdtp); 154 return 1; 155 } 156 157 return 0; 158 } 159 160 U_BOOT_CMD( 161 hwtest, 2, 1, do_hw_test, 162 "hardware test for R0P7785LC0011RL board", 163 "\n" 164 "hwtest all - test all hardware\n" 165 "hwtest pld - output PLD version\n" 166 "hwtest led - turn on LEDs\n" 167 "hwtest dipsw - test DIP switch\n" 168 "hwtest sm107 - output SM107 version\n" 169 "hwtest net - check RTL8110 ID\n" 170 "hwtest sata - check SiI3512 ID\n" 171 "hwtest pci - output PCI slot device ID" 172 ); 173