1d4abc757SPeter Tyser /* 2d4abc757SPeter Tyser * (C) Copyright 2007-2008 Semihalf 3d4abc757SPeter Tyser * 4d4abc757SPeter Tyser * Written by: Rafal Jaworowski <raj@semihalf.com> 5d4abc757SPeter Tyser * 6*1a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 7d4abc757SPeter Tyser */ 8d4abc757SPeter Tyser 9d4abc757SPeter Tyser #include <common.h> 10d4abc757SPeter Tyser #include <linux/types.h> 11d4abc757SPeter Tyser #include <api_public.h> 12d4abc757SPeter Tyser 13d4abc757SPeter Tyser #include "glue.h" 14d4abc757SPeter Tyser 15d4abc757SPeter Tyser #define errf(fmt, args...) do { printf("ERROR @ %s(): ", __func__); printf(fmt, ##args); } while (0) 16d4abc757SPeter Tyser 17d4abc757SPeter Tyser #define BUF_SZ 2048 18d4abc757SPeter Tyser #define WAIT_SECS 5 19d4abc757SPeter Tyser 20d4abc757SPeter Tyser void test_dump_buf(void *, int); 21d4abc757SPeter Tyser void test_dump_di(int); 22d4abc757SPeter Tyser void test_dump_si(struct sys_info *); 23d4abc757SPeter Tyser void test_dump_sig(struct api_signature *); 24d4abc757SPeter Tyser 25d4abc757SPeter Tyser static char buf[BUF_SZ]; 26d4abc757SPeter Tyser 2754841ab5SWolfgang Denk int main(int argc, char * const argv[]) 28d4abc757SPeter Tyser { 29d4abc757SPeter Tyser int rv = 0, h, i, j, devs_no; 30d4abc757SPeter Tyser struct api_signature *sig = NULL; 31d4abc757SPeter Tyser ulong start, now; 32d4abc757SPeter Tyser struct device_info *di; 33d4abc757SPeter Tyser lbasize_t rlen; 34a2a5729fSChe-Liang Chiou struct display_info disinfo; 35d4abc757SPeter Tyser 36d4abc757SPeter Tyser if (!api_search_sig(&sig)) 37d4abc757SPeter Tyser return -1; 38d4abc757SPeter Tyser 39d4abc757SPeter Tyser syscall_ptr = sig->syscall; 40d4abc757SPeter Tyser if (syscall_ptr == NULL) 41d4abc757SPeter Tyser return -2; 42d4abc757SPeter Tyser 43d4abc757SPeter Tyser if (sig->version > API_SIG_VERSION) 44d4abc757SPeter Tyser return -3; 45d4abc757SPeter Tyser 46d4abc757SPeter Tyser printf("API signature found @%x\n", (unsigned int)sig); 47d4abc757SPeter Tyser test_dump_sig(sig); 48d4abc757SPeter Tyser 49d4abc757SPeter Tyser printf("\n*** Consumer API test ***\n"); 50d4abc757SPeter Tyser printf("syscall ptr 0x%08x@%08x\n", (unsigned int)syscall_ptr, 51d4abc757SPeter Tyser (unsigned int)&syscall_ptr); 52d4abc757SPeter Tyser 53d4abc757SPeter Tyser /* console activities */ 54d4abc757SPeter Tyser ub_putc('B'); 55d4abc757SPeter Tyser 56d4abc757SPeter Tyser printf("*** Press any key to continue ***\n"); 57d4abc757SPeter Tyser printf("got char 0x%x\n", ub_getc()); 58d4abc757SPeter Tyser 59d4abc757SPeter Tyser /* system info */ 60d4abc757SPeter Tyser test_dump_si(ub_get_sys_info()); 61d4abc757SPeter Tyser 62d4abc757SPeter Tyser /* timing */ 63d4abc757SPeter Tyser printf("\n*** Timing - wait a couple of secs ***\n"); 64d4abc757SPeter Tyser start = ub_get_timer(0); 65d4abc757SPeter Tyser printf("\ntime: start %lu\n\n", start); 66d4abc757SPeter Tyser for (i = 0; i < WAIT_SECS; i++) 67d4abc757SPeter Tyser for (j = 0; j < 1000; j++) 68d4abc757SPeter Tyser ub_udelay(1000); /* wait 1 ms */ 69d4abc757SPeter Tyser 70d4abc757SPeter Tyser /* this is the number of milliseconds that passed from ub_get_timer(0) */ 71d4abc757SPeter Tyser now = ub_get_timer(start); 72d4abc757SPeter Tyser printf("\ntime: now %lu\n\n", now); 73d4abc757SPeter Tyser 74d4abc757SPeter Tyser /* enumerate devices */ 75d4abc757SPeter Tyser printf("\n*** Enumerate devices ***\n"); 76d4abc757SPeter Tyser devs_no = ub_dev_enum(); 77d4abc757SPeter Tyser 78d4abc757SPeter Tyser printf("Number of devices found: %d\n", devs_no); 79d4abc757SPeter Tyser if (devs_no == 0) 80d4abc757SPeter Tyser return -1; 81d4abc757SPeter Tyser 82d4abc757SPeter Tyser printf("\n*** Show devices ***\n"); 83d4abc757SPeter Tyser for (i = 0; i < devs_no; i++) { 84d4abc757SPeter Tyser test_dump_di(i); 85d4abc757SPeter Tyser printf("\n"); 86d4abc757SPeter Tyser } 87d4abc757SPeter Tyser 88d4abc757SPeter Tyser printf("\n*** Operations on devices ***\n"); 89d4abc757SPeter Tyser 90d4abc757SPeter Tyser /* test opening a device already opened */ 91d4abc757SPeter Tyser h = 0; 92d4abc757SPeter Tyser if ((rv = ub_dev_open(h)) != 0) { 93d4abc757SPeter Tyser errf("open device %d error %d\n", h, rv); 94d4abc757SPeter Tyser return -1; 95d4abc757SPeter Tyser } 96d4abc757SPeter Tyser if ((rv = ub_dev_open(h)) != 0) 97d4abc757SPeter Tyser errf("open device %d error %d\n", h, rv); 98d4abc757SPeter Tyser 99d4abc757SPeter Tyser ub_dev_close(h); 100d4abc757SPeter Tyser 101d4abc757SPeter Tyser /* test storage */ 102d4abc757SPeter Tyser printf("Trying storage devices...\n"); 103d4abc757SPeter Tyser for (i = 0; i < devs_no; i++) { 104d4abc757SPeter Tyser di = ub_dev_get(i); 105d4abc757SPeter Tyser 106d4abc757SPeter Tyser if (di->type & DEV_TYP_STOR) 107d4abc757SPeter Tyser break; 108d4abc757SPeter Tyser 109d4abc757SPeter Tyser } 110d4abc757SPeter Tyser if (i == devs_no) 111d4abc757SPeter Tyser printf("No storage devices available\n"); 112d4abc757SPeter Tyser else { 113d4abc757SPeter Tyser memset(buf, 0, BUF_SZ); 114d4abc757SPeter Tyser 115d4abc757SPeter Tyser if ((rv = ub_dev_open(i)) != 0) 116d4abc757SPeter Tyser errf("open device %d error %d\n", i, rv); 117d4abc757SPeter Tyser 118d4abc757SPeter Tyser else if ((rv = ub_dev_read(i, buf, 1, 0, &rlen)) != 0) 119d4abc757SPeter Tyser errf("could not read from device %d, error %d\n", i, rv); 120d4abc757SPeter Tyser else { 121d4abc757SPeter Tyser printf("Sector 0 dump (512B):\n"); 122d4abc757SPeter Tyser test_dump_buf(buf, 512); 123d4abc757SPeter Tyser } 124d4abc757SPeter Tyser 125d4abc757SPeter Tyser ub_dev_close(i); 126d4abc757SPeter Tyser } 127d4abc757SPeter Tyser 128d4abc757SPeter Tyser /* test networking */ 129d4abc757SPeter Tyser printf("Trying network devices...\n"); 130d4abc757SPeter Tyser for (i = 0; i < devs_no; i++) { 131d4abc757SPeter Tyser di = ub_dev_get(i); 132d4abc757SPeter Tyser 133d4abc757SPeter Tyser if (di->type == DEV_TYP_NET) 134d4abc757SPeter Tyser break; 135d4abc757SPeter Tyser 136d4abc757SPeter Tyser } 137d4abc757SPeter Tyser if (i == devs_no) 138d4abc757SPeter Tyser printf("No network devices available\n"); 139d4abc757SPeter Tyser else { 140d4abc757SPeter Tyser if ((rv = ub_dev_open(i)) != 0) 141d4abc757SPeter Tyser errf("open device %d error %d\n", i, rv); 142d4abc757SPeter Tyser else if ((rv = ub_dev_send(i, &buf, 2048)) != 0) 143d4abc757SPeter Tyser errf("could not send to device %d, error %d\n", i, rv); 144d4abc757SPeter Tyser 145d4abc757SPeter Tyser ub_dev_close(i); 146d4abc757SPeter Tyser } 147d4abc757SPeter Tyser 148d4abc757SPeter Tyser if (ub_dev_close(h) != 0) 149d4abc757SPeter Tyser errf("could not close device %d\n", h); 150d4abc757SPeter Tyser 151d4abc757SPeter Tyser printf("\n*** Env vars ***\n"); 152d4abc757SPeter Tyser 153d4abc757SPeter Tyser printf("ethact = %s\n", ub_env_get("ethact")); 154d4abc757SPeter Tyser printf("old fileaddr = %s\n", ub_env_get("fileaddr")); 155d4abc757SPeter Tyser ub_env_set("fileaddr", "deadbeef"); 156d4abc757SPeter Tyser printf("new fileaddr = %s\n", ub_env_get("fileaddr")); 157d4abc757SPeter Tyser 158d4abc757SPeter Tyser const char *env = NULL; 159d4abc757SPeter Tyser 160d4abc757SPeter Tyser while ((env = ub_env_enum(env)) != NULL) 161d4abc757SPeter Tyser printf("%s = %s\n", env, ub_env_get(env)); 162d4abc757SPeter Tyser 163a2a5729fSChe-Liang Chiou printf("\n*** Display ***\n"); 164a2a5729fSChe-Liang Chiou 165a2a5729fSChe-Liang Chiou if (ub_display_get_info(DISPLAY_TYPE_LCD, &disinfo)) { 166a2a5729fSChe-Liang Chiou printf("LCD info: failed\n"); 167a2a5729fSChe-Liang Chiou } else { 168a2a5729fSChe-Liang Chiou printf("LCD info:\n"); 169a2a5729fSChe-Liang Chiou printf(" pixel width: %d\n", disinfo.pixel_width); 170a2a5729fSChe-Liang Chiou printf(" pixel height: %d\n", disinfo.pixel_height); 171a2a5729fSChe-Liang Chiou printf(" screen rows: %d\n", disinfo.screen_rows); 172a2a5729fSChe-Liang Chiou printf(" screen cols: %d\n", disinfo.screen_cols); 173a2a5729fSChe-Liang Chiou } 174a2a5729fSChe-Liang Chiou if (ub_display_get_info(DISPLAY_TYPE_VIDEO, &disinfo)) { 175a2a5729fSChe-Liang Chiou printf("video info: failed\n"); 176a2a5729fSChe-Liang Chiou } else { 177a2a5729fSChe-Liang Chiou printf("video info:\n"); 178a2a5729fSChe-Liang Chiou printf(" pixel width: %d\n", disinfo.pixel_width); 179a2a5729fSChe-Liang Chiou printf(" pixel height: %d\n", disinfo.pixel_height); 180a2a5729fSChe-Liang Chiou printf(" screen rows: %d\n", disinfo.screen_rows); 181a2a5729fSChe-Liang Chiou printf(" screen cols: %d\n", disinfo.screen_cols); 182a2a5729fSChe-Liang Chiou } 183a2a5729fSChe-Liang Chiou 184a2a5729fSChe-Liang Chiou printf("*** Press any key to continue ***\n"); 185a2a5729fSChe-Liang Chiou printf("got char 0x%x\n", ub_getc()); 186a2a5729fSChe-Liang Chiou 187a2a5729fSChe-Liang Chiou /* 188a2a5729fSChe-Liang Chiou * This only clears messages on screen, not on serial port. It is 189a2a5729fSChe-Liang Chiou * equivalent to a no-op if no display is available. 190a2a5729fSChe-Liang Chiou */ 191a2a5729fSChe-Liang Chiou ub_display_clear(); 192a2a5729fSChe-Liang Chiou 193d4abc757SPeter Tyser /* reset */ 194d4abc757SPeter Tyser printf("\n*** Resetting board ***\n"); 195d4abc757SPeter Tyser ub_reset(); 196d4abc757SPeter Tyser printf("\nHmm, reset returned...?!\n"); 197d4abc757SPeter Tyser 198d4abc757SPeter Tyser return rv; 199d4abc757SPeter Tyser } 200d4abc757SPeter Tyser 201d4abc757SPeter Tyser void test_dump_sig(struct api_signature *sig) 202d4abc757SPeter Tyser { 203d4abc757SPeter Tyser printf("signature:\n"); 204d4abc757SPeter Tyser printf(" version\t= %d\n", sig->version); 205d4abc757SPeter Tyser printf(" checksum\t= 0x%08x\n", sig->checksum); 206d4abc757SPeter Tyser printf(" sc entry\t= 0x%08x\n", (unsigned int)sig->syscall); 207d4abc757SPeter Tyser } 208d4abc757SPeter Tyser 209d4abc757SPeter Tyser void test_dump_si(struct sys_info *si) 210d4abc757SPeter Tyser { 211d4abc757SPeter Tyser int i; 212d4abc757SPeter Tyser 213d4abc757SPeter Tyser printf("sys info:\n"); 214d4abc757SPeter Tyser printf(" clkbus\t= 0x%08x\n", (unsigned int)si->clk_bus); 215d4abc757SPeter Tyser printf(" clkcpu\t= 0x%08x\n", (unsigned int)si->clk_cpu); 216d4abc757SPeter Tyser printf(" bar\t\t= 0x%08x\n", (unsigned int)si->bar); 217d4abc757SPeter Tyser 218d4abc757SPeter Tyser printf("---\n"); 219d4abc757SPeter Tyser for (i = 0; i < si->mr_no; i++) { 220d4abc757SPeter Tyser if (si->mr[i].flags == 0) 221d4abc757SPeter Tyser break; 222d4abc757SPeter Tyser 223d4abc757SPeter Tyser printf(" start\t= 0x%08lx\n", si->mr[i].start); 224d4abc757SPeter Tyser printf(" size\t= 0x%08lx\n", si->mr[i].size); 225d4abc757SPeter Tyser 226d4abc757SPeter Tyser switch(si->mr[i].flags & 0x000F) { 227d4abc757SPeter Tyser case MR_ATTR_FLASH: 228d4abc757SPeter Tyser printf(" type FLASH\n"); 229d4abc757SPeter Tyser break; 230d4abc757SPeter Tyser case MR_ATTR_DRAM: 231d4abc757SPeter Tyser printf(" type DRAM\n"); 232d4abc757SPeter Tyser break; 233d4abc757SPeter Tyser case MR_ATTR_SRAM: 234d4abc757SPeter Tyser printf(" type SRAM\n"); 235d4abc757SPeter Tyser break; 236d4abc757SPeter Tyser default: 237d4abc757SPeter Tyser printf(" type UNKNOWN\n"); 238d4abc757SPeter Tyser } 239d4abc757SPeter Tyser printf("---\n"); 240d4abc757SPeter Tyser } 241d4abc757SPeter Tyser } 242d4abc757SPeter Tyser 243d4abc757SPeter Tyser static char *test_stor_typ(int type) 244d4abc757SPeter Tyser { 245d4abc757SPeter Tyser if (type & DT_STOR_IDE) 246d4abc757SPeter Tyser return "IDE"; 247d4abc757SPeter Tyser 248d4abc757SPeter Tyser if (type & DT_STOR_MMC) 249d4abc757SPeter Tyser return "MMC"; 250d4abc757SPeter Tyser 251d4abc757SPeter Tyser if (type & DT_STOR_SATA) 252d4abc757SPeter Tyser return "SATA"; 253d4abc757SPeter Tyser 254d4abc757SPeter Tyser if (type & DT_STOR_SCSI) 255d4abc757SPeter Tyser return "SCSI"; 256d4abc757SPeter Tyser 257d4abc757SPeter Tyser if (type & DT_STOR_USB) 258d4abc757SPeter Tyser return "USB"; 259d4abc757SPeter Tyser 260d4abc757SPeter Tyser return "Unknown"; 261d4abc757SPeter Tyser } 262d4abc757SPeter Tyser 263d4abc757SPeter Tyser void test_dump_buf(void *buf, int len) 264d4abc757SPeter Tyser { 265d4abc757SPeter Tyser int i; 266d4abc757SPeter Tyser int line_counter = 0; 267d4abc757SPeter Tyser int sep_flag = 0; 268d4abc757SPeter Tyser int addr = 0; 269d4abc757SPeter Tyser 270d4abc757SPeter Tyser printf("%07x:\t", addr); 271d4abc757SPeter Tyser 272d4abc757SPeter Tyser for (i = 0; i < len; i++) { 273d4abc757SPeter Tyser if (line_counter++ > 15) { 274d4abc757SPeter Tyser line_counter = 0; 275d4abc757SPeter Tyser sep_flag = 0; 276d4abc757SPeter Tyser addr += 16; 277d4abc757SPeter Tyser i--; 278d4abc757SPeter Tyser printf("\n%07x:\t", addr); 279d4abc757SPeter Tyser continue; 280d4abc757SPeter Tyser } 281d4abc757SPeter Tyser 282d4abc757SPeter Tyser if (sep_flag++ > 1) { 283d4abc757SPeter Tyser sep_flag = 1; 284d4abc757SPeter Tyser printf(" "); 285d4abc757SPeter Tyser } 286d4abc757SPeter Tyser 287d4abc757SPeter Tyser printf("%02x", *((char *)buf++)); 288d4abc757SPeter Tyser } 289d4abc757SPeter Tyser 290d4abc757SPeter Tyser printf("\n"); 291d4abc757SPeter Tyser } 292d4abc757SPeter Tyser 293d4abc757SPeter Tyser void test_dump_di(int handle) 294d4abc757SPeter Tyser { 295d4abc757SPeter Tyser int i; 296d4abc757SPeter Tyser struct device_info *di = ub_dev_get(handle); 297d4abc757SPeter Tyser 298d4abc757SPeter Tyser printf("device info (%d):\n", handle); 299d4abc757SPeter Tyser printf(" cookie\t= 0x%08x\n", (uint32_t)di->cookie); 300d4abc757SPeter Tyser printf(" type\t\t= 0x%08x\n", di->type); 301d4abc757SPeter Tyser 302d4abc757SPeter Tyser if (di->type == DEV_TYP_NET) { 303d4abc757SPeter Tyser printf(" hwaddr\t= "); 304d4abc757SPeter Tyser for (i = 0; i < 6; i++) 305d4abc757SPeter Tyser printf("%02x ", di->di_net.hwaddr[i]); 306d4abc757SPeter Tyser 307d4abc757SPeter Tyser printf("\n"); 308d4abc757SPeter Tyser 309d4abc757SPeter Tyser } else if (di->type & DEV_TYP_STOR) { 310d4abc757SPeter Tyser printf(" type\t\t= %s\n", test_stor_typ(di->type)); 311d4abc757SPeter Tyser printf(" blk size\t\t= %d\n", (unsigned int)di->di_stor.block_size); 312d4abc757SPeter Tyser printf(" blk count\t\t= %d\n", (unsigned int)di->di_stor.block_count); 313d4abc757SPeter Tyser } 314d4abc757SPeter Tyser } 315