uboot/drivers/ata/libata.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (C) 2008 Freescale Semiconductor, Inc.
   4 *              Dave Liu <daveliu@freescale.com>
   5 *              port from the libata of linux kernel
   6 */
   7
   8#include <libata.h>
   9
  10u64 ata_id_n_sectors(u16 *id)
  11{
  12        if (ata_id_has_lba(id)) {
  13                if (ata_id_has_lba48(id))
  14                        return ata_id_u64(id, ATA_ID_LBA48_SECTORS);
  15                else
  16                        return ata_id_u32(id, ATA_ID_LBA_SECTORS);
  17        } else {
  18                return 0;
  19        }
  20}
  21
  22u32 ata_dev_classify(u32 sig)
  23{
  24        u8 lbam, lbah;
  25
  26        lbam = (sig >> 16) & 0xff;
  27        lbah = (sig >> 24) & 0xff;
  28
  29        if (((lbam == 0) && (lbah == 0)) ||
  30                ((lbam == 0x3c) && (lbah == 0xc3)))
  31                return ATA_DEV_ATA;
  32
  33        if ((lbam == 0x14) && (lbah == 0xeb))
  34                return ATA_DEV_ATAPI;
  35
  36        if ((lbam == 0x69) && (lbah == 0x96))
  37                return ATA_DEV_PMP;
  38
  39        return ATA_DEV_UNKNOWN;
  40}
  41
  42static void ata_id_string(const u16 *id, unsigned char *s,
  43                         unsigned int ofs, unsigned int len)
  44{
  45        unsigned int c;
  46
  47        while (len > 0) {
  48                c = id[ofs] >> 8;
  49                *s = c;
  50                s++;
  51
  52                c = id[ofs] & 0xff;
  53                *s = c;
  54                s++;
  55
  56                ofs++;
  57                len -= 2;
  58        }
  59}
  60
  61void ata_id_c_string(const u16 *id, unsigned char *s,
  62                         unsigned int ofs, unsigned int len)
  63{
  64        unsigned char *p;
  65
  66        ata_id_string(id, s, ofs, len - 1);
  67
  68        p = s + strnlen((char *)s, len - 1);
  69        while (p > s && p[-1] == ' ')
  70                p--;
  71        *p = '\0';
  72}
  73
  74void ata_dump_id(u16 *id)
  75{
  76        unsigned char serial[ATA_ID_SERNO_LEN + 1];
  77        unsigned char firmware[ATA_ID_FW_REV_LEN + 1];
  78        unsigned char product[ATA_ID_PROD_LEN + 1];
  79        u64 n_sectors;
  80
  81        /* Serial number */
  82        ata_id_c_string(id, serial, ATA_ID_SERNO, sizeof(serial));
  83        printf("S/N: %s\n\r", serial);
  84
  85        /* Firmware version */
  86        ata_id_c_string(id, firmware, ATA_ID_FW_REV, sizeof(firmware));
  87        printf("Firmware version: %s\n\r", firmware);
  88
  89        /* Product model */
  90        ata_id_c_string(id, product, ATA_ID_PROD, sizeof(product));
  91        printf("Product model number: %s\n\r", product);
  92
  93        /* Total sectors of device  */
  94        n_sectors = ata_id_n_sectors(id);
  95        printf("Capablity: %lld sectors\n\r", n_sectors);
  96
  97        printf ("id[49]: capabilities = 0x%04x\n"
  98                "id[53]: field valid = 0x%04x\n"
  99                "id[63]: mwdma = 0x%04x\n"
 100                "id[64]: pio = 0x%04x\n"
 101                "id[75]: queue depth = 0x%04x\n",
 102                id[49],
 103                id[53],
 104                id[63],
 105                id[64],
 106                id[75]);
 107
 108        printf ("id[76]: sata capablity = 0x%04x\n"
 109                "id[78]: sata features supported = 0x%04x\n"
 110                "id[79]: sata features enable = 0x%04x\n",
 111                id[76],
 112                id[78],
 113                id[79]);
 114
 115        printf ("id[80]: major version = 0x%04x\n"
 116                "id[81]: minor version = 0x%04x\n"
 117                "id[82]: command set supported 1 = 0x%04x\n"
 118                "id[83]: command set supported 2 = 0x%04x\n"
 119                "id[84]: command set extension = 0x%04x\n",
 120                id[80],
 121                id[81],
 122                id[82],
 123                id[83],
 124                id[84]);
 125        printf ("id[85]: command set enable 1 = 0x%04x\n"
 126                "id[86]: command set enable 2 = 0x%04x\n"
 127                "id[87]: command set default = 0x%04x\n"
 128                "id[88]: udma = 0x%04x\n"
 129                "id[93]: hardware reset result = 0x%04x\n",
 130                id[85],
 131                id[86],
 132                id[87],
 133                id[88],
 134                id[93]);
 135}
 136
 137void ata_swap_buf_le16(u16 *buf, unsigned int buf_words)
 138{
 139        unsigned int i;
 140
 141        for (i = 0; i < buf_words; i++)
 142                buf[i] = le16_to_cpu(buf[i]);
 143}
 144