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 312e192b24SSimon Glass return sata_initialize(); 322e192b24SSimon Glass } 332e192b24SSimon Glass 342e192b24SSimon Glass /* If the user has not yet run `sata init`, do it now */ 35*aa6ab905STang Yuantian if (sata_curr_device == -1) { 36*aa6ab905STang Yuantian rc = sata_initialize(); 37*aa6ab905STang Yuantian if (rc == -1) 38*aa6ab905STang Yuantian return rc; 39*aa6ab905STang Yuantian sata_curr_device = rc; 40*aa6ab905STang Yuantian } 412e192b24SSimon Glass 422e192b24SSimon Glass switch (argc) { 432e192b24SSimon Glass case 0: 442e192b24SSimon Glass case 1: 452e192b24SSimon Glass return CMD_RET_USAGE; 462e192b24SSimon Glass case 2: 472e192b24SSimon Glass if (strncmp(argv[1], "inf", 3) == 0) { 48d97dc8a0SSimon Glass blk_list_devices(IF_TYPE_SATA); 492e192b24SSimon Glass return 0; 502e192b24SSimon Glass } else if (strncmp(argv[1], "dev", 3) == 0) { 51d97dc8a0SSimon Glass if (blk_print_device_num(IF_TYPE_SATA, 52d97dc8a0SSimon Glass sata_curr_device)) { 53d97dc8a0SSimon Glass printf("\nno SATA devices available\n"); 54d97dc8a0SSimon Glass return CMD_RET_FAILURE; 552e192b24SSimon Glass } 562e192b24SSimon Glass return 0; 572e192b24SSimon Glass } else if (strncmp(argv[1], "part", 4) == 0) { 58d97dc8a0SSimon Glass if (blk_list_part(IF_TYPE_SATA)) 592e192b24SSimon Glass puts("\nno SATA devices available\n"); 60d97dc8a0SSimon Glass return 0; 612e192b24SSimon Glass } 622e192b24SSimon Glass return CMD_RET_USAGE; 632e192b24SSimon Glass case 3: 642e192b24SSimon Glass if (strncmp(argv[1], "dev", 3) == 0) { 652e192b24SSimon Glass int dev = (int)simple_strtoul(argv[2], NULL, 10); 662e192b24SSimon Glass 67d97dc8a0SSimon Glass if (!blk_show_device(IF_TYPE_SATA, dev)) { 682e192b24SSimon Glass sata_curr_device = dev; 69d97dc8a0SSimon Glass printf("... is now current device\n"); 70d97dc8a0SSimon Glass } else { 71d97dc8a0SSimon Glass return CMD_RET_FAILURE; 72d97dc8a0SSimon Glass } 732e192b24SSimon Glass return 0; 742e192b24SSimon Glass } else if (strncmp(argv[1], "part", 4) == 0) { 752e192b24SSimon Glass int dev = (int)simple_strtoul(argv[2], NULL, 10); 762e192b24SSimon Glass 77d97dc8a0SSimon Glass if (blk_print_part_devnum(IF_TYPE_SATA, dev)) { 78d97dc8a0SSimon Glass printf("\nSATA device %d not available\n", 79d97dc8a0SSimon Glass dev); 80d97dc8a0SSimon Glass return CMD_RET_FAILURE; 812e192b24SSimon Glass } 822e192b24SSimon Glass return rc; 832e192b24SSimon Glass } 842e192b24SSimon Glass return CMD_RET_USAGE; 852e192b24SSimon Glass 862e192b24SSimon Glass default: /* at least 4 args */ 872e192b24SSimon Glass if (strcmp(argv[1], "read") == 0) { 882e192b24SSimon Glass ulong addr = simple_strtoul(argv[2], NULL, 16); 892e192b24SSimon Glass ulong cnt = simple_strtoul(argv[4], NULL, 16); 902e192b24SSimon Glass ulong n; 912e192b24SSimon Glass lbaint_t blk = simple_strtoul(argv[3], NULL, 16); 922e192b24SSimon Glass 932e192b24SSimon Glass printf("\nSATA read: device %d block # %ld, count %ld ... ", 942e192b24SSimon Glass sata_curr_device, blk, cnt); 952e192b24SSimon Glass 96d97dc8a0SSimon Glass n = blk_read_devnum(IF_TYPE_SATA, sata_curr_device, blk, 97d97dc8a0SSimon Glass cnt, (ulong *)addr); 982e192b24SSimon Glass 992e192b24SSimon Glass printf("%ld blocks read: %s\n", 1002e192b24SSimon Glass n, (n==cnt) ? "OK" : "ERROR"); 1012e192b24SSimon Glass return (n == cnt) ? 0 : 1; 1022e192b24SSimon Glass } else if (strcmp(argv[1], "write") == 0) { 1032e192b24SSimon Glass ulong addr = simple_strtoul(argv[2], NULL, 16); 1042e192b24SSimon Glass ulong cnt = simple_strtoul(argv[4], NULL, 16); 1052e192b24SSimon Glass ulong n; 1062e192b24SSimon Glass 1072e192b24SSimon Glass lbaint_t blk = simple_strtoul(argv[3], NULL, 16); 1082e192b24SSimon Glass 1092e192b24SSimon Glass printf("\nSATA write: device %d block # %ld, count %ld ... ", 1102e192b24SSimon Glass sata_curr_device, blk, cnt); 1112e192b24SSimon Glass 112d97dc8a0SSimon Glass n = blk_write_devnum(IF_TYPE_SATA, sata_curr_device, 113d97dc8a0SSimon Glass blk, cnt, (ulong *)addr); 1142e192b24SSimon Glass 1152e192b24SSimon Glass printf("%ld blocks written: %s\n", 1162e192b24SSimon Glass n, (n == cnt) ? "OK" : "ERROR"); 1172e192b24SSimon Glass return (n == cnt) ? 0 : 1; 1182e192b24SSimon Glass } else { 1192e192b24SSimon Glass return CMD_RET_USAGE; 1202e192b24SSimon Glass } 1212e192b24SSimon Glass 1222e192b24SSimon Glass return rc; 1232e192b24SSimon Glass } 1242e192b24SSimon Glass } 1252e192b24SSimon Glass 1262e192b24SSimon Glass U_BOOT_CMD( 1272e192b24SSimon Glass sata, 5, 1, do_sata, 1282e192b24SSimon Glass "SATA sub system", 1292e192b24SSimon Glass "init - init SATA sub system\n" 1302e192b24SSimon Glass "sata stop - disable SATA sub system\n" 1312e192b24SSimon Glass "sata info - show available SATA devices\n" 1322e192b24SSimon Glass "sata device [dev] - show or set current device\n" 1332e192b24SSimon Glass "sata part [dev] - print partition table\n" 1342e192b24SSimon Glass "sata read addr blk# cnt\n" 1352e192b24SSimon Glass "sata write addr blk# cnt" 1362e192b24SSimon Glass ); 137