ahci: convert to use libata functions and definitions
authorRob Herring <rob.herring@calxeda.com>
Sat, 24 Aug 2013 15:10:54 +0000 (10:10 -0500)
committerTom Rini <trini@ti.com>
Fri, 6 Sep 2013 17:09:07 +0000 (13:09 -0400)
libata already has similar functions as implemented in the ahci code.
Refactor the code to use the libata variants and remove the dependency on
ata.h. Convert some defines to use the version from libata.h. Also, remove
some unnecessary memset's of bss data.

This is a step toward hopefully merging ahci.c and dw_ahsata.c which are
essentially the same driver.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Reviewed-by: Tom Rini <trini@ti.com>
drivers/block/ahci.c
include/ahci.h
include/configs/MPC8544DS.h
include/configs/MPC8572DS.h
include/configs/MPC8610HPCD.h
include/configs/MPC8641HPCN.h
include/configs/P2020DS.h
include/configs/coreboot.h
include/configs/highbank.h

index 7f78c0030144e7431e5f248e984dba7b2faaf69c..8cc9379b82c406ff4245a800c26520c2f79bff64 100644 (file)
 #include <asm/io.h>
 #include <malloc.h>
 #include <scsi.h>
-#include <ata.h>
+#include <libata.h>
 #include <linux/ctype.h>
 #include <ahci.h>
 
 static int ata_io_flush(u8 port);
 
 struct ahci_probe_ent *probe_ent = NULL;
-hd_driveid_t *ataid[AHCI_MAX_PORTS];
+u16 *ataid[AHCI_MAX_PORTS];
 
 #define writel_with_flush(a,b) do { writel(a,b); readl(b); } while (0)
 
@@ -240,7 +240,7 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
                j = 0;
                while (j < WAIT_MS_SPINUP) {
                        tmp = readl(port_mmio + PORT_TFDATA);
-                       if (!(tmp & (ATA_STAT_BUSY | ATA_STAT_DRQ)))
+                       if (!(tmp & (ATA_BUSY | ATA_DRQ)))
                                break;
                        udelay(1000);
                        tmp = readl(port_mmio + PORT_SCR_STAT);
@@ -378,8 +378,6 @@ static int ahci_init_one(pci_dev_t pdev)
        u16 vendor;
        int rc;
 
-       memset((void *)ataid, 0, sizeof(hd_driveid_t *) * AHCI_MAX_PORTS);
-
        probe_ent = malloc(sizeof(struct ahci_probe_ent));
        memset(probe_ent, 0, sizeof(struct ahci_probe_ent));
        probe_ent->dev = pdev;
@@ -469,7 +467,7 @@ static void ahci_set_feature(u8 port)
        memset(fis, 0, sizeof(fis));
        fis[0] = 0x27;
        fis[1] = 1 << 7;
-       fis[2] = ATA_CMD_SETF;
+       fis[2] = ATA_CMD_SET_FEATURES;
        fis[3] = SETFEATURES_XFER;
        fis[12] = __ilog2(probe_ent->udma_mask + 1) + 0x40 - 0x01;
 
@@ -607,27 +605,6 @@ static char *ata_id_strcpy(u16 *target, u16 *src, int len)
        return (char *)target;
 }
 
-
-static void dump_ataid(hd_driveid_t *ataid)
-{
-       debug("(49)ataid->capability = 0x%x\n", ataid->capability);
-       debug("(53)ataid->field_valid =0x%x\n", ataid->field_valid);
-       debug("(63)ataid->dma_mword = 0x%x\n", ataid->dma_mword);
-       debug("(64)ataid->eide_pio_modes = 0x%x\n", ataid->eide_pio_modes);
-       debug("(75)ataid->queue_depth = 0x%x\n", ataid->queue_depth);
-       debug("(80)ataid->major_rev_num = 0x%x\n", ataid->major_rev_num);
-       debug("(81)ataid->minor_rev_num = 0x%x\n", ataid->minor_rev_num);
-       debug("(82)ataid->command_set_1 = 0x%x\n", ataid->command_set_1);
-       debug("(83)ataid->command_set_2 = 0x%x\n", ataid->command_set_2);
-       debug("(84)ataid->cfsse = 0x%x\n", ataid->cfsse);
-       debug("(85)ataid->cfs_enable_1 = 0x%x\n", ataid->cfs_enable_1);
-       debug("(86)ataid->cfs_enable_2 = 0x%x\n", ataid->cfs_enable_2);
-       debug("(87)ataid->csf_default = 0x%x\n", ataid->csf_default);
-       debug("(88)ataid->dma_ultra = 0x%x\n", ataid->dma_ultra);
-       debug("(93)ataid->hw_config = 0x%x\n", ataid->hw_config);
-}
-
-
 /*
  * SCSI INQUIRY command operation.
  */
@@ -641,7 +618,7 @@ static int ata_scsiop_inquiry(ccb *pccb)
                95 - 4,
        };
        u8 fis[20];
-       u8 *tmpid;
+       u16 *tmpid;
        u8 port;
 
        /* Clean ccb data buffer */
@@ -656,15 +633,16 @@ static int ata_scsiop_inquiry(ccb *pccb)
        /* Construct the FIS */
        fis[0] = 0x27;          /* Host to device FIS. */
        fis[1] = 1 << 7;        /* Command FIS. */
-       fis[2] = ATA_CMD_IDENT; /* Command byte. */
+       fis[2] = ATA_CMD_ID_ATA; /* Command byte. */
 
        /* Read id from sata */
        port = pccb->target;
-       if (!(tmpid = malloc(sizeof(hd_driveid_t))))
+       tmpid = malloc(ATA_ID_WORDS * 2);
+       if (!tmpid)
                return -ENOMEM;
 
-       if (ahci_device_data_io(port, (u8 *) &fis, sizeof(fis), tmpid,
-                               sizeof(hd_driveid_t), 0)) {
+       if (ahci_device_data_io(port, (u8 *) &fis, sizeof(fis), (u8 *)tmpid,
+                               ATA_ID_WORDS * 2, 0)) {
                debug("scsi_ahci: SCSI inquiry command failure.\n");
                free(tmpid);
                return -EIO;
@@ -672,13 +650,16 @@ static int ata_scsiop_inquiry(ccb *pccb)
 
        if (ataid[port])
                free(ataid[port]);
-       ataid[port] = (hd_driveid_t *) tmpid;
+       ataid[port] = tmpid;
+       ata_swap_buf_le16(tmpid, ATA_ID_WORDS);
 
        memcpy(&pccb->pdata[8], "ATA     ", 8);
-       ata_id_strcpy((u16 *) &pccb->pdata[16], (u16 *)ataid[port]->model, 16);
-       ata_id_strcpy((u16 *) &pccb->pdata[32], (u16 *)ataid[port]->fw_rev, 4);
+       ata_id_strcpy((u16 *) &pccb->pdata[16], &tmpid[ATA_ID_PROD], 16);
+       ata_id_strcpy((u16 *) &pccb->pdata[32], &tmpid[ATA_ID_FW_REV], 4);
 
-       dump_ataid(ataid[port]);
+#ifdef DEBUG
+       ata_dump_id(tmpid);
+#endif
        return 0;
 }
 
@@ -726,7 +707,7 @@ static int ata_scsiop_read_write(ccb *pccb, u8 is_write)
 
                now_blocks = min(MAX_SATA_BLOCKS_READ_WRITE, blocks);
 
-               transfer_size = ATA_BLOCKSIZE * now_blocks;
+               transfer_size = ATA_SECT_SIZE * now_blocks;
                if (transfer_size > user_buffer_size) {
                        printf("scsi_ahci: Error: buffer too small.\n");
                        return -EIO;
@@ -781,6 +762,7 @@ static int ata_scsiop_read_write(ccb *pccb, u8 is_write)
 static int ata_scsiop_read_capacity10(ccb *pccb)
 {
        u32 cap;
+       u64 cap64;
        u32 block_size;
 
        if (!ataid[pccb->target]) {
@@ -790,18 +772,11 @@ static int ata_scsiop_read_capacity10(ccb *pccb)
                return -EPERM;
        }
 
-       cap = le32_to_cpu(ataid[pccb->target]->lba_capacity);
-       if (cap == 0xfffffff) {
-               unsigned short *cap48 = ataid[pccb->target]->lba48_capacity;
-               if (cap48[2] || cap48[3]) {
-                       cap = 0xffffffff;
-               } else {
-                       cap = (le16_to_cpu(cap48[1]) << 16) |
-                             (le16_to_cpu(cap48[0]));
-               }
-       }
+       cap64 = ata_id_n_sectors(ataid[pccb->target]);
+       if (cap64 > 0x100000000ULL)
+               cap64 = 0xffffffff;
 
-       cap = cpu_to_be32(cap);
+       cap = cpu_to_be32(cap64);
        memcpy(pccb->pdata, &cap, sizeof(cap));
 
        block_size = cpu_to_be32((u32)512);
@@ -826,12 +801,7 @@ static int ata_scsiop_read_capacity16(ccb *pccb)
                return -EPERM;
        }
 
-       cap = le32_to_cpu(ataid[pccb->target]->lba_capacity);
-       if (cap == 0xfffffff) {
-               memcpy(&cap, ataid[pccb->target]->lba48_capacity, sizeof(cap));
-               cap = le64_to_cpu(cap);
-       }
-
+       cap = ata_id_n_sectors(ataid[pccb->target]);
        cap = cpu_to_be64(cap);
        memcpy(pccb->pdata, &cap, sizeof(cap));
 
@@ -918,8 +888,6 @@ int ahci_init(u32 base)
        int i, rc = 0;
        u32 linkmap;
 
-       memset(ataid, 0, sizeof(ataid));
-
        probe_ent = malloc(sizeof(struct ahci_probe_ent));
        memset(probe_ent, 0, sizeof(struct ahci_probe_ent));
 
index d76993ca2a2880e02aeb8f4e0c86a9cc08b63b0e..90e850929b7d4c625dee3baeb7ed4307af2fe0cc 100644 (file)
 
 #define AHCI_MAX_PORTS         32
 
-/* SETFEATURES stuff */
-#define SETFEATURES_XFER       0x03
-#define XFER_UDMA_7            0x47
-#define XFER_UDMA_6            0x46
-#define XFER_UDMA_5            0x45
-#define XFER_UDMA_4            0x44
-#define XFER_UDMA_3            0x43
-#define XFER_UDMA_2            0x42
-#define XFER_UDMA_1            0x41
-#define XFER_UDMA_0            0x40
-#define XFER_MW_DMA_2          0x22
-#define XFER_MW_DMA_1          0x21
-#define XFER_MW_DMA_0          0x20
-#define XFER_SW_DMA_2          0x12
-#define XFER_SW_DMA_1          0x11
-#define XFER_SW_DMA_0          0x10
-#define XFER_PIO_4             0x0C
-#define XFER_PIO_3             0x0B
-#define XFER_PIO_2             0x0A
-#define XFER_PIO_1             0x09
-#define XFER_PIO_0             0x08
-#define XFER_PIO_SLOW          0x00
-
 #define ATA_FLAG_SATA          (1 << 3)
 #define ATA_FLAG_NO_LEGACY     (1 << 4) /* no legacy mode check */
 #define ATA_FLAG_MMIO          (1 << 6) /* use MMIO, not PIO */
index 2a5e5d4ed9df39546ace24152f49dd3dc4fcc153..7f1628592fd09c5105ba5539db3bd99419d81e50 100644 (file)
@@ -318,6 +318,7 @@ extern unsigned long get_board_sys_clk(unsigned long dummy);
 #define CONFIG_SCSI_AHCI
 
 #ifdef CONFIG_SCSI_AHCI
+#define CONFIG_LIBATA
 #define CONFIG_SATA_ULI5288
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    4
 #define CONFIG_SYS_SCSI_MAX_LUN        1
index 05d887050046eeb23f46c3fcda43837f44f29551..acd39816bea4d8c2db0aff2bce969f9af6aab57a 100644 (file)
 #define CONFIG_SCSI_AHCI
 
 #ifdef CONFIG_SCSI_AHCI
+#define CONFIG_LIBATA
 #define CONFIG_SATA_ULI5288
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    4
 #define CONFIG_SYS_SCSI_MAX_LUN        1
index 1553a746c8a55b3d54ffb3fc20bbf81a476ead46..0b2cf87016ddcb905feb19188e980536dc82a6c3 100644 (file)
 #define CONFIG_SCSI_AHCI
 
 #ifdef CONFIG_SCSI_AHCI
+#define CONFIG_LIBATA
 #define CONFIG_SATA_ULI5288
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    4
 #define CONFIG_SYS_SCSI_MAX_LUN        1
index 6ca6f6b807e2e960959cf0808ba9d7ead0fd71a8..0945ae155d4ba7c4bc35759c43e018bdf4188583 100644 (file)
@@ -412,6 +412,7 @@ extern unsigned long get_board_sys_clk(unsigned long dummy);
 #define CONFIG_SCSI_AHCI
 
 #ifdef CONFIG_SCSI_AHCI
+#define CONFIG_LIBATA
 #define CONFIG_SATA_ULI5288
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    4
 #define CONFIG_SYS_SCSI_MAX_LUN        1
index b5078cdb524e991c43715daa7f7c52132760b2e6..785e497f20ff69e3f97287e9bc7215fa69c5b6aa 100644 (file)
 #define CONFIG_SCSI_AHCI
 
 #ifdef CONFIG_SCSI_AHCI
+#define CONFIG_LIBATA
 #define CONFIG_SATA_ULI5288
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    4
 #define CONFIG_SYS_SCSI_MAX_LUN        1
index c2dcef89c6e526c70a14d69d9cc444a0d7606355..47215e59aa8983d6a5bec75533816f6db5124b6f 100644 (file)
@@ -56,6 +56,7 @@
 #define CONFIG_SCSI_AHCI
 
 #ifdef CONFIG_SCSI_AHCI
+#define CONFIG_LIBATA
 #define CONFIG_SYS_64BIT_LBA
 #define CONFIG_SATA_INTEL              1
 #define CONFIG_SCSI_DEV_LIST           {PCI_VENDOR_ID_INTEL, \
index a5743d63df5174f8e9baceb0c7f2df45993a276a..afb6e64e1b0464c6d9ec521a8b701e1711b766aa 100644 (file)
@@ -39,6 +39,7 @@
 #define CONFIG_SYS_BOOTCOUNT_ADDR      0xfff3cf0c
 
 #define CONFIG_MISC_INIT_R
+#define CONFIG_LIBATA
 #define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    5