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