uboot/cmd/sata.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (C) 2000-2005, DENX Software Engineering
   4 *              Wolfgang Denk <wd@denx.de>
   5 * Copyright (C) Procsys. All rights reserved.
   6 *              Mushtaq Khan <mushtaq_k@procsys.com>
   7 *                      <mushtaqk_921@yahoo.co.in>
   8 * Copyright (C) 2008 Freescale Semiconductor, Inc.
   9 *              Dave Liu <daveliu@freescale.com>
  10 */
  11
  12#include <common.h>
  13#include <ahci.h>
  14#include <dm.h>
  15#include <command.h>
  16#include <part.h>
  17#include <sata.h>
  18#include <dm/device-internal.h>
  19#include <dm/uclass-internal.h>
  20
  21static int sata_curr_device = -1;
  22
  23int sata_remove(int devnum)
  24{
  25#ifdef CONFIG_AHCI
  26        struct udevice *dev;
  27        int rc;
  28
  29        rc = uclass_find_device(UCLASS_AHCI, devnum, &dev);
  30        if (!rc && !dev)
  31                rc = uclass_find_first_device(UCLASS_AHCI, &dev);
  32        if (rc || !dev) {
  33                printf("Cannot find SATA device %d (err=%d)\n", devnum, rc);
  34                return CMD_RET_FAILURE;
  35        }
  36
  37        rc = device_remove(dev, DM_REMOVE_NORMAL);
  38        if (rc) {
  39                printf("Cannot remove SATA device '%s' (err=%d)\n", dev->name,
  40                       rc);
  41                return CMD_RET_FAILURE;
  42        }
  43
  44        return 0;
  45#else
  46        return sata_stop();
  47#endif
  48}
  49
  50int sata_probe(int devnum)
  51{
  52#ifdef CONFIG_AHCI
  53        struct udevice *dev;
  54        int rc;
  55
  56        rc = uclass_get_device(UCLASS_AHCI, devnum, &dev);
  57        if (rc)
  58                rc = uclass_find_first_device(UCLASS_AHCI, &dev);
  59        if (rc) {
  60                printf("Cannot probe SATA device %d (err=%d)\n", devnum, rc);
  61                return CMD_RET_FAILURE;
  62        }
  63        if (!dev) {
  64                printf("No SATA device found!\n");
  65                return CMD_RET_FAILURE;
  66        }
  67        rc = sata_scan(dev);
  68        if (rc) {
  69                printf("Cannot scan SATA device %d (err=%d)\n", devnum, rc);
  70                return CMD_RET_FAILURE;
  71        }
  72
  73        return 0;
  74#else
  75        return sata_initialize() < 0 ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
  76#endif
  77}
  78
  79static int do_sata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  80{
  81        int rc = 0;
  82
  83        if (argc >= 2) {
  84                int devnum = 0;
  85
  86                if (argc == 3)
  87                        devnum = (int)simple_strtoul(argv[2], NULL, 10);
  88                if (!strcmp(argv[1], "stop"))
  89                        return sata_remove(devnum);
  90
  91                if (!strcmp(argv[1], "init")) {
  92                        if (sata_curr_device != -1) {
  93                                rc = sata_remove(devnum);
  94                                if (rc)
  95                                        return rc;
  96                        }
  97
  98                        return sata_probe(devnum);
  99                }
 100        }
 101
 102        /* If the user has not yet run `sata init`, do it now */
 103        if (sata_curr_device == -1) {
 104                rc = sata_probe(0);
 105                if (rc)
 106                        return rc;
 107                sata_curr_device = 0;
 108        }
 109
 110        return blk_common_cmd(argc, argv, IF_TYPE_SATA, &sata_curr_device);
 111}
 112
 113U_BOOT_CMD(
 114        sata, 5, 1, do_sata,
 115        "SATA sub system",
 116        "init - init SATA sub system\n"
 117        "sata stop [dev] - disable SATA sub system or device\n"
 118        "sata info - show available SATA devices\n"
 119        "sata device [dev] - show or set current device\n"
 120        "sata part [dev] - print partition table\n"
 121        "sata read addr blk# cnt\n"
 122        "sata write addr blk# cnt"
 123);
 124