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 test_pld(void)
37 {
38 	printf("PLD version = %04x\n", readb(PLD_VERSR));
39 }
40 
41 static void test_sm107(void)
42 {
43 	printf("SM107 device ID = %04x\n", readl(SM107_DEVICEID));
44 }
45 
46 static void test_led(void)
47 {
48 	printf("turn on LEDs 3, 5, 7, 9\n");
49 	writeb(0x55, PLD_LEDCR);
50 	mdelay(2000);
51 	printf("turn on LEDs 4, 6, 8, 10\n");
52 	writeb(0xaa, PLD_LEDCR);
53 	mdelay(2000);
54 	writeb(0x00, PLD_LEDCR);
55 }
56 
57 static void test_dipsw(void)
58 {
59 	printf("Please DIPSW set = B'0101\n");
60 	while (readb(PLD_SWSR) != 0x05) {
61 		if (ctrlc())
62 			return;
63 	}
64 	printf("Please DIPSW set = B'1010\n");
65 	while (readb(PLD_SWSR) != 0x0A) {
66 		if (ctrlc())
67 			return;
68 	}
69 	printf("DIPSW OK\n");
70 }
71 
72 static void test_net(void)
73 {
74 	unsigned long data;
75 
76 	writel(0x80000000, 0xfe0401c0);
77 	data = readl(0xfe040220);
78 	if (data == 0x816910ec)
79 		printf("Ethernet OK\n");
80 	else
81 		printf("Ethernet NG, data = %08x\n", (unsigned int)data);
82 }
83 
84 static void test_sata(void)
85 {
86 	unsigned long data;
87 
88 	writel(0x80000800, 0xfe0401c0);
89 	data = readl(0xfe040220);
90 	if (data == 0x35121095)
91 		printf("SATA OK\n");
92 	else
93 		printf("SATA NG, data = %08x\n", (unsigned int)data);
94 }
95 
96 static void test_pci(void)
97 {
98 	writel(0x80001800, 0xfe0401c0);
99 	printf("PCI CN1 ID = %08x\n", readl(0xfe040220));
100 
101 	writel(0x80001000, 0xfe0401c0);
102 	printf("PCI CN2 ID = %08x\n", readl(0xfe040220));
103 }
104 
105 int do_hw_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
106 {
107 	char *cmd;
108 
109 	if (argc != 2)
110 		return cmd_usage(cmdtp);
111 
112 	cmd = argv[1];
113 	switch (cmd[0]) {
114 	case 'a':	/* all */
115 		test_pld();
116 		test_led();
117 		test_dipsw();
118 		test_sm107();
119 		test_net();
120 		test_sata();
121 		test_pci();
122 		break;
123 	case 'p':	/* pld or pci */
124 		if (cmd[1] == 'l')
125 			test_pld();
126 		else
127 			test_pci();
128 		break;
129 	case 'l':	/* led */
130 		test_led();
131 		break;
132 	case 'd':	/* dipsw */
133 		test_dipsw();
134 		break;
135 	case 's':	/* sm107 or sata */
136 		if (cmd[1] == 'm')
137 			test_sm107();
138 		else
139 			test_sata();
140 		break;
141 	case 'n':	/* net */
142 		test_net();
143 		break;
144 	default:
145 		return cmd_usage(cmdtp);
146 	}
147 
148 	return 0;
149 }
150 
151 U_BOOT_CMD(
152 	hwtest,	2,	1,	do_hw_test,
153 	"hardware test for R0P7785LC0011RL board",
154 	"\n"
155 	"hwtest all   - test all hardware\n"
156 	"hwtest pld   - output PLD version\n"
157 	"hwtest led   - turn on LEDs\n"
158 	"hwtest dipsw - test DIP switch\n"
159 	"hwtest sm107 - output SM107 version\n"
160 	"hwtest net   - check RTL8110 ID\n"
161 	"hwtest sata  - check SiI3512 ID\n"
162 	"hwtest pci   - output PCI slot device ID"
163 );
164