| // SPDX-License-Identifier: GPL-2.0+ |
| /* |
| * Copyright (C) 2008 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com> |
| */ |
| |
| #include <common.h> |
| #include <console.h> |
| #include <asm/io.h> |
| #include <asm/processor.h> |
| #include <asm/pci.h> |
| |
| #if defined(CONFIG_CPU_32BIT) |
| #define NOCACHE_OFFSET 0x00000000 |
| #else |
| #define NOCACHE_OFFSET 0xa0000000 |
| #endif |
| #define PLD_LEDCR (0x04000008 + NOCACHE_OFFSET) |
| #define PLD_SWSR (0x0400000a + NOCACHE_OFFSET) |
| #define PLD_VERSR (0x0400000c + NOCACHE_OFFSET) |
| |
| #define SM107_DEVICEID (0x13e00060 + NOCACHE_OFFSET) |
| |
| static void test_pld(void) |
| { |
| printf("PLD version = %04x\n", readb(PLD_VERSR)); |
| } |
| |
| static void test_sm107(void) |
| { |
| printf("SM107 device ID = %04x\n", readl(SM107_DEVICEID)); |
| } |
| |
| static void test_led(void) |
| { |
| printf("turn on LEDs 3, 5, 7, 9\n"); |
| writeb(0x55, PLD_LEDCR); |
| mdelay(2000); |
| printf("turn on LEDs 4, 6, 8, 10\n"); |
| writeb(0xaa, PLD_LEDCR); |
| mdelay(2000); |
| writeb(0x00, PLD_LEDCR); |
| } |
| |
| static void test_dipsw(void) |
| { |
| printf("Please DIPSW set = B'0101\n"); |
| while (readb(PLD_SWSR) != 0x05) { |
| if (ctrlc()) |
| return; |
| } |
| printf("Please DIPSW set = B'1010\n"); |
| while (readb(PLD_SWSR) != 0x0A) { |
| if (ctrlc()) |
| return; |
| } |
| printf("DIPSW OK\n"); |
| } |
| |
| static void test_net(void) |
| { |
| unsigned long data; |
| |
| writel(0x80000000, 0xfe0401c0); |
| data = readl(0xfe040220); |
| if (data == 0x816910ec) |
| printf("Ethernet OK\n"); |
| else |
| printf("Ethernet NG, data = %08x\n", (unsigned int)data); |
| } |
| |
| static void test_sata(void) |
| { |
| unsigned long data; |
| |
| writel(0x80000800, 0xfe0401c0); |
| data = readl(0xfe040220); |
| if (data == 0x35121095) |
| printf("SATA OK\n"); |
| else |
| printf("SATA NG, data = %08x\n", (unsigned int)data); |
| } |
| |
| static void test_pci(void) |
| { |
| writel(0x80001800, 0xfe0401c0); |
| printf("PCI CN1 ID = %08x\n", readl(0xfe040220)); |
| |
| writel(0x80001000, 0xfe0401c0); |
| printf("PCI CN2 ID = %08x\n", readl(0xfe040220)); |
| } |
| |
| int do_hw_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
| { |
| char *cmd; |
| |
| if (argc != 2) |
| return cmd_usage(cmdtp); |
| |
| cmd = argv[1]; |
| switch (cmd[0]) { |
| case 'a': /* all */ |
| test_pld(); |
| test_led(); |
| test_dipsw(); |
| test_sm107(); |
| test_net(); |
| test_sata(); |
| test_pci(); |
| break; |
| case 'p': /* pld or pci */ |
| if (cmd[1] == 'l') |
| test_pld(); |
| else |
| test_pci(); |
| break; |
| case 'l': /* led */ |
| test_led(); |
| break; |
| case 'd': /* dipsw */ |
| test_dipsw(); |
| break; |
| case 's': /* sm107 or sata */ |
| if (cmd[1] == 'm') |
| test_sm107(); |
| else |
| test_sata(); |
| break; |
| case 'n': /* net */ |
| test_net(); |
| break; |
| default: |
| return cmd_usage(cmdtp); |
| } |
| |
| return 0; |
| } |
| |
| U_BOOT_CMD( |
| hwtest, 2, 1, do_hw_test, |
| "hardware test for R0P7785LC0011RL board", |
| "\n" |
| "hwtest all - test all hardware\n" |
| "hwtest pld - output PLD version\n" |
| "hwtest led - turn on LEDs\n" |
| "hwtest dipsw - test DIP switch\n" |
| "hwtest sm107 - output SM107 version\n" |
| "hwtest net - check RTL8110 ID\n" |
| "hwtest sata - check SiI3512 ID\n" |
| "hwtest pci - output PCI slot device ID" |
| ); |