12e192b24SSimon Glass /* 22e192b24SSimon Glass * Copyright (C) 2000-2005, DENX Software Engineering 32e192b24SSimon Glass * Wolfgang Denk <wd@denx.de> 42e192b24SSimon Glass * Copyright (C) Procsys. All rights reserved. 52e192b24SSimon Glass * Mushtaq Khan <mushtaq_k@procsys.com> 62e192b24SSimon Glass * <mushtaqk_921@yahoo.co.in> 72e192b24SSimon Glass * Copyright (C) 2008 Freescale Semiconductor, Inc. 82e192b24SSimon Glass * Dave Liu <daveliu@freescale.com> 92e192b24SSimon Glass * 102e192b24SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 112e192b24SSimon Glass */ 122e192b24SSimon Glass 132e192b24SSimon Glass #include <common.h> 142e192b24SSimon Glass #include <command.h> 152e192b24SSimon Glass #include <part.h> 162e192b24SSimon Glass #include <sata.h> 172e192b24SSimon Glass 182e192b24SSimon Glass static int sata_curr_device = -1; 192e192b24SSimon Glass 202e192b24SSimon Glass static int do_sata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 212e192b24SSimon Glass { 222e192b24SSimon Glass int rc = 0; 232e192b24SSimon Glass 242e192b24SSimon Glass if (argc == 2 && strcmp(argv[1], "stop") == 0) 252e192b24SSimon Glass return sata_stop(); 262e192b24SSimon Glass 272e192b24SSimon Glass if (argc == 2 && strcmp(argv[1], "init") == 0) { 282e192b24SSimon Glass if (sata_curr_device != -1) 292e192b24SSimon Glass sata_stop(); 302e192b24SSimon Glass 31*8547f45bSGary Bisson return (sata_initialize() < 0) ? 32*8547f45bSGary Bisson CMD_RET_FAILURE : CMD_RET_SUCCESS; 332e192b24SSimon Glass } 342e192b24SSimon Glass 352e192b24SSimon Glass /* If the user has not yet run `sata init`, do it now */ 36aa6ab905STang Yuantian if (sata_curr_device == -1) { 37aa6ab905STang Yuantian rc = sata_initialize(); 38aa6ab905STang Yuantian if (rc == -1) 39*8547f45bSGary Bisson return CMD_RET_FAILURE; 40aa6ab905STang Yuantian sata_curr_device = rc; 41aa6ab905STang Yuantian } 422e192b24SSimon Glass 432e192b24SSimon Glass switch (argc) { 442e192b24SSimon Glass case 0: 452e192b24SSimon Glass case 1: 462e192b24SSimon Glass return CMD_RET_USAGE; 472e192b24SSimon Glass case 2: 482e192b24SSimon Glass if (strncmp(argv[1], "inf", 3) == 0) { 49d97dc8a0SSimon Glass blk_list_devices(IF_TYPE_SATA); 502e192b24SSimon Glass return 0; 512e192b24SSimon Glass } else if (strncmp(argv[1], "dev", 3) == 0) { 52d97dc8a0SSimon Glass if (blk_print_device_num(IF_TYPE_SATA, 53d97dc8a0SSimon Glass sata_curr_device)) { 54d97dc8a0SSimon Glass printf("\nno SATA devices available\n"); 55d97dc8a0SSimon Glass return CMD_RET_FAILURE; 562e192b24SSimon Glass } 572e192b24SSimon Glass return 0; 582e192b24SSimon Glass } else if (strncmp(argv[1], "part", 4) == 0) { 59d97dc8a0SSimon Glass if (blk_list_part(IF_TYPE_SATA)) 602e192b24SSimon Glass puts("\nno SATA devices available\n"); 61d97dc8a0SSimon Glass return 0; 622e192b24SSimon Glass } 632e192b24SSimon Glass return CMD_RET_USAGE; 642e192b24SSimon Glass case 3: 652e192b24SSimon Glass if (strncmp(argv[1], "dev", 3) == 0) { 662e192b24SSimon Glass int dev = (int)simple_strtoul(argv[2], NULL, 10); 672e192b24SSimon Glass 68d97dc8a0SSimon Glass if (!blk_show_device(IF_TYPE_SATA, dev)) { 692e192b24SSimon Glass sata_curr_device = dev; 70d97dc8a0SSimon Glass printf("... is now current device\n"); 71d97dc8a0SSimon Glass } else { 72d97dc8a0SSimon Glass return CMD_RET_FAILURE; 73d97dc8a0SSimon Glass } 742e192b24SSimon Glass return 0; 752e192b24SSimon Glass } else if (strncmp(argv[1], "part", 4) == 0) { 762e192b24SSimon Glass int dev = (int)simple_strtoul(argv[2], NULL, 10); 772e192b24SSimon Glass 78d97dc8a0SSimon Glass if (blk_print_part_devnum(IF_TYPE_SATA, dev)) { 79d97dc8a0SSimon Glass printf("\nSATA device %d not available\n", 80d97dc8a0SSimon Glass dev); 81d97dc8a0SSimon Glass return CMD_RET_FAILURE; 822e192b24SSimon Glass } 832e192b24SSimon Glass return rc; 842e192b24SSimon Glass } 852e192b24SSimon Glass return CMD_RET_USAGE; 862e192b24SSimon Glass 872e192b24SSimon Glass default: /* at least 4 args */ 882e192b24SSimon Glass if (strcmp(argv[1], "read") == 0) { 892e192b24SSimon Glass ulong addr = simple_strtoul(argv[2], NULL, 16); 902e192b24SSimon Glass ulong cnt = simple_strtoul(argv[4], NULL, 16); 912e192b24SSimon Glass ulong n; 922e192b24SSimon Glass lbaint_t blk = simple_strtoul(argv[3], NULL, 16); 932e192b24SSimon Glass 942e192b24SSimon Glass printf("\nSATA read: device %d block # %ld, count %ld ... ", 952e192b24SSimon Glass sata_curr_device, blk, cnt); 962e192b24SSimon Glass 97d97dc8a0SSimon Glass n = blk_read_devnum(IF_TYPE_SATA, sata_curr_device, blk, 98d97dc8a0SSimon Glass cnt, (ulong *)addr); 992e192b24SSimon Glass 1002e192b24SSimon Glass printf("%ld blocks read: %s\n", 1012e192b24SSimon Glass n, (n==cnt) ? "OK" : "ERROR"); 1022e192b24SSimon Glass return (n == cnt) ? 0 : 1; 1032e192b24SSimon Glass } else if (strcmp(argv[1], "write") == 0) { 1042e192b24SSimon Glass ulong addr = simple_strtoul(argv[2], NULL, 16); 1052e192b24SSimon Glass ulong cnt = simple_strtoul(argv[4], NULL, 16); 1062e192b24SSimon Glass ulong n; 1072e192b24SSimon Glass 1082e192b24SSimon Glass lbaint_t blk = simple_strtoul(argv[3], NULL, 16); 1092e192b24SSimon Glass 1102e192b24SSimon Glass printf("\nSATA write: device %d block # %ld, count %ld ... ", 1112e192b24SSimon Glass sata_curr_device, blk, cnt); 1122e192b24SSimon Glass 113d97dc8a0SSimon Glass n = blk_write_devnum(IF_TYPE_SATA, sata_curr_device, 114d97dc8a0SSimon Glass blk, cnt, (ulong *)addr); 1152e192b24SSimon Glass 1162e192b24SSimon Glass printf("%ld blocks written: %s\n", 1172e192b24SSimon Glass n, (n == cnt) ? "OK" : "ERROR"); 1182e192b24SSimon Glass return (n == cnt) ? 0 : 1; 1192e192b24SSimon Glass } else { 1202e192b24SSimon Glass return CMD_RET_USAGE; 1212e192b24SSimon Glass } 1222e192b24SSimon Glass 1232e192b24SSimon Glass return rc; 1242e192b24SSimon Glass } 1252e192b24SSimon Glass } 1262e192b24SSimon Glass 1272e192b24SSimon Glass U_BOOT_CMD( 1282e192b24SSimon Glass sata, 5, 1, do_sata, 1292e192b24SSimon Glass "SATA sub system", 1302e192b24SSimon Glass "init - init SATA sub system\n" 1312e192b24SSimon Glass "sata stop - disable SATA sub system\n" 1322e192b24SSimon Glass "sata info - show available SATA devices\n" 1332e192b24SSimon Glass "sata device [dev] - show or set current device\n" 1342e192b24SSimon Glass "sata part [dev] - print partition table\n" 1352e192b24SSimon Glass "sata read addr blk# cnt\n" 1362e192b24SSimon Glass "sata write addr blk# cnt" 1372e192b24SSimon Glass ); 138