1 /* 2 * (C) Copyright 2000-2011 3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 /* 9 * IDE support 10 */ 11 12 #include <common.h> 13 #include <blk.h> 14 #include <config.h> 15 #include <watchdog.h> 16 #include <command.h> 17 #include <image.h> 18 #include <asm/byteorder.h> 19 #include <asm/io.h> 20 21 #if defined(CONFIG_IDE_PCMCIA) 22 # include <pcmcia.h> 23 #endif 24 25 #include <ide.h> 26 #include <ata.h> 27 28 #ifdef CONFIG_LED_STATUS 29 # include <status_led.h> 30 #endif 31 32 /* Current I/O Device */ 33 static int curr_device = -1; 34 35 int do_ide(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) 36 { 37 int rcode = 0; 38 39 switch (argc) { 40 case 0: 41 case 1: 42 return CMD_RET_USAGE; 43 case 2: 44 if (strncmp(argv[1], "res", 3) == 0) { 45 puts("\nReset IDE: "); 46 ide_init(); 47 return 0; 48 } else if (strncmp(argv[1], "inf", 3) == 0) { 49 blk_list_devices(IF_TYPE_IDE); 50 return 0; 51 52 } else if (strncmp(argv[1], "dev", 3) == 0) { 53 if (blk_print_device_num(IF_TYPE_IDE, curr_device)) { 54 printf("\nno IDE devices available\n"); 55 return CMD_RET_FAILURE; 56 } 57 58 return 0; 59 } else if (strncmp(argv[1], "part", 4) == 0) { 60 if (blk_list_part(IF_TYPE_IDE)) 61 printf("\nno IDE devices available\n"); 62 return 1; 63 } 64 return CMD_RET_USAGE; 65 case 3: 66 if (strncmp(argv[1], "dev", 3) == 0) { 67 int dev = (int)simple_strtoul(argv[2], NULL, 10); 68 69 if (!blk_show_device(IF_TYPE_IDE, dev)) { 70 curr_device = dev; 71 printf("... is now current device\n"); 72 } else { 73 return CMD_RET_FAILURE; 74 } 75 return 0; 76 } else if (strncmp(argv[1], "part", 4) == 0) { 77 int dev = (int)simple_strtoul(argv[2], NULL, 10); 78 79 if (blk_print_part_devnum(IF_TYPE_IDE, dev)) { 80 printf("\nIDE device %d not available\n", dev); 81 return CMD_RET_FAILURE; 82 } 83 return 1; 84 } 85 86 return CMD_RET_USAGE; 87 default: 88 /* at least 4 args */ 89 90 if (strcmp(argv[1], "read") == 0) { 91 ulong addr = simple_strtoul(argv[2], NULL, 16); 92 ulong cnt = simple_strtoul(argv[4], NULL, 16); 93 ulong n; 94 95 #ifdef CONFIG_SYS_64BIT_LBA 96 lbaint_t blk = simple_strtoull(argv[3], NULL, 16); 97 98 printf("\nIDE read: device %d block # %lld, count %ld...", 99 curr_device, blk, cnt); 100 #else 101 lbaint_t blk = simple_strtoul(argv[3], NULL, 16); 102 103 printf("\nIDE read: device %d block # %ld, count %ld...", 104 curr_device, blk, cnt); 105 #endif 106 107 n = blk_read_devnum(IF_TYPE_IDE, curr_device, blk, cnt, 108 (ulong *)addr); 109 110 printf("%ld blocks read: %s\n", 111 n, (n == cnt) ? "OK" : "ERROR"); 112 if (n == cnt) 113 return 0; 114 else 115 return 1; 116 } else if (strcmp(argv[1], "write") == 0) { 117 ulong addr = simple_strtoul(argv[2], NULL, 16); 118 ulong cnt = simple_strtoul(argv[4], NULL, 16); 119 ulong n; 120 121 #ifdef CONFIG_SYS_64BIT_LBA 122 lbaint_t blk = simple_strtoull(argv[3], NULL, 16); 123 124 printf("\nIDE write: device %d block # %lld, count %ld...", 125 curr_device, blk, cnt); 126 #else 127 lbaint_t blk = simple_strtoul(argv[3], NULL, 16); 128 129 printf("\nIDE write: device %d block # %ld, count %ld...", 130 curr_device, blk, cnt); 131 #endif 132 n = blk_write_devnum(IF_TYPE_IDE, curr_device, blk, cnt, 133 (ulong *)addr); 134 135 printf("%ld blocks written: %s\n", n, 136 n == cnt ? "OK" : "ERROR"); 137 if (n == cnt) 138 return 0; 139 else 140 return 1; 141 } else { 142 return CMD_RET_USAGE; 143 } 144 145 return rcode; 146 } 147 } 148 149 int do_diskboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) 150 { 151 return common_diskboot(cmdtp, "ide", argc, argv); 152 } 153 154 U_BOOT_CMD(ide, 5, 1, do_ide, 155 "IDE sub-system", 156 "reset - reset IDE controller\n" 157 "ide info - show available IDE devices\n" 158 "ide device [dev] - show or set current device\n" 159 "ide part [dev] - print partition table of one or all IDE devices\n" 160 "ide read addr blk# cnt\n" 161 "ide write addr blk# cnt - read/write `cnt'" 162 " blocks starting at block `blk#'\n" 163 " to/from memory address `addr'"); 164 165 U_BOOT_CMD(diskboot, 3, 1, do_diskboot, 166 "boot from IDE device", "loadAddr dev:part"); 167