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