linux/drivers/ata/sata_svw.c
<<
>>
Prefs
   1/*
   2 *  sata_svw.c - ServerWorks / Apple K2 SATA
   3 *
   4 *  Maintained by: Benjamin Herrenschmidt <benh@kernel.crashing.org> and
   5 *                 Jeff Garzik <jgarzik@pobox.com>
   6 *                  Please ALWAYS copy linux-ide@vger.kernel.org
   7 *                  on emails.
   8 *
   9 *  Copyright 2003 Benjamin Herrenschmidt <benh@kernel.crashing.org>
  10 *
  11 *  Bits from Jeff Garzik, Copyright RedHat, Inc.
  12 *
  13 *  This driver probably works with non-Apple versions of the
  14 *  Broadcom chipset...
  15 *
  16 *
  17 *  This program is free software; you can redistribute it and/or modify
  18 *  it under the terms of the GNU General Public License as published by
  19 *  the Free Software Foundation; either version 2, or (at your option)
  20 *  any later version.
  21 *
  22 *  This program is distributed in the hope that it will be useful,
  23 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  24 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  25 *  GNU General Public License for more details.
  26 *
  27 *  You should have received a copy of the GNU General Public License
  28 *  along with this program; see the file COPYING.  If not, write to
  29 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  30 *
  31 *
  32 *  libata documentation is available via 'make {ps|pdf}docs',
  33 *  as Documentation/DocBook/libata.*
  34 *
  35 *  Hardware documentation available under NDA.
  36 *
  37 */
  38
  39#include <linux/kernel.h>
  40#include <linux/module.h>
  41#include <linux/pci.h>
  42#include <linux/init.h>
  43#include <linux/blkdev.h>
  44#include <linux/delay.h>
  45#include <linux/interrupt.h>
  46#include <linux/device.h>
  47#include <scsi/scsi_host.h>
  48#include <scsi/scsi_cmnd.h>
  49#include <scsi/scsi.h>
  50#include <linux/libata.h>
  51
  52#ifdef CONFIG_PPC_OF
  53#include <asm/prom.h>
  54#include <asm/pci-bridge.h>
  55#endif /* CONFIG_PPC_OF */
  56
  57#define DRV_NAME        "sata_svw"
  58#define DRV_VERSION     "2.3"
  59
  60enum {
  61        /* ap->flags bits */
  62        K2_FLAG_SATA_8_PORTS            = (1 << 24),
  63        K2_FLAG_NO_ATAPI_DMA            = (1 << 25),
  64        K2_FLAG_BAR_POS_3                       = (1 << 26),
  65
  66        /* Taskfile registers offsets */
  67        K2_SATA_TF_CMD_OFFSET           = 0x00,
  68        K2_SATA_TF_DATA_OFFSET          = 0x00,
  69        K2_SATA_TF_ERROR_OFFSET         = 0x04,
  70        K2_SATA_TF_NSECT_OFFSET         = 0x08,
  71        K2_SATA_TF_LBAL_OFFSET          = 0x0c,
  72        K2_SATA_TF_LBAM_OFFSET          = 0x10,
  73        K2_SATA_TF_LBAH_OFFSET          = 0x14,
  74        K2_SATA_TF_DEVICE_OFFSET        = 0x18,
  75        K2_SATA_TF_CMDSTAT_OFFSET       = 0x1c,
  76        K2_SATA_TF_CTL_OFFSET           = 0x20,
  77
  78        /* DMA base */
  79        K2_SATA_DMA_CMD_OFFSET          = 0x30,
  80
  81        /* SCRs base */
  82        K2_SATA_SCR_STATUS_OFFSET       = 0x40,
  83        K2_SATA_SCR_ERROR_OFFSET        = 0x44,
  84        K2_SATA_SCR_CONTROL_OFFSET      = 0x48,
  85
  86        /* Others */
  87        K2_SATA_SICR1_OFFSET            = 0x80,
  88        K2_SATA_SICR2_OFFSET            = 0x84,
  89        K2_SATA_SIM_OFFSET              = 0x88,
  90
  91        /* Port stride */
  92        K2_SATA_PORT_OFFSET             = 0x100,
  93
  94        chip_svw4                       = 0,
  95        chip_svw8                       = 1,
  96        chip_svw42                      = 2,    /* bar 3 */
  97        chip_svw43                      = 3,    /* bar 5 */
  98};
  99
 100static u8 k2_stat_check_status(struct ata_port *ap);
 101
 102
 103static int k2_sata_check_atapi_dma(struct ata_queued_cmd *qc)
 104{
 105        u8 cmnd = qc->scsicmd->cmnd[0];
 106
 107        if (qc->ap->flags & K2_FLAG_NO_ATAPI_DMA)
 108                return -1;      /* ATAPI DMA not supported */
 109        else {
 110                switch (cmnd) {
 111                case READ_10:
 112                case READ_12:
 113                case READ_16:
 114                case WRITE_10:
 115                case WRITE_12:
 116                case WRITE_16:
 117                        return 0;
 118
 119                default:
 120                        return -1;
 121                }
 122
 123        }
 124}
 125
 126static int k2_sata_scr_read(struct ata_link *link,
 127                            unsigned int sc_reg, u32 *val)
 128{
 129        if (sc_reg > SCR_CONTROL)
 130                return -EINVAL;
 131        *val = readl(link->ap->ioaddr.scr_addr + (sc_reg * 4));
 132        return 0;
 133}
 134
 135
 136static int k2_sata_scr_write(struct ata_link *link,
 137                             unsigned int sc_reg, u32 val)
 138{
 139        if (sc_reg > SCR_CONTROL)
 140                return -EINVAL;
 141        writel(val, link->ap->ioaddr.scr_addr + (sc_reg * 4));
 142        return 0;
 143}
 144
 145
 146static void k2_sata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
 147{
 148        struct ata_ioports *ioaddr = &ap->ioaddr;
 149        unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR;
 150
 151        if (tf->ctl != ap->last_ctl) {
 152                writeb(tf->ctl, ioaddr->ctl_addr);
 153                ap->last_ctl = tf->ctl;
 154                ata_wait_idle(ap);
 155        }
 156        if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) {
 157                writew(tf->feature | (((u16)tf->hob_feature) << 8),
 158                       ioaddr->feature_addr);
 159                writew(tf->nsect | (((u16)tf->hob_nsect) << 8),
 160                       ioaddr->nsect_addr);
 161                writew(tf->lbal | (((u16)tf->hob_lbal) << 8),
 162                       ioaddr->lbal_addr);
 163                writew(tf->lbam | (((u16)tf->hob_lbam) << 8),
 164                       ioaddr->lbam_addr);
 165                writew(tf->lbah | (((u16)tf->hob_lbah) << 8),
 166                       ioaddr->lbah_addr);
 167        } else if (is_addr) {
 168                writew(tf->feature, ioaddr->feature_addr);
 169                writew(tf->nsect, ioaddr->nsect_addr);
 170                writew(tf->lbal, ioaddr->lbal_addr);
 171                writew(tf->lbam, ioaddr->lbam_addr);
 172                writew(tf->lbah, ioaddr->lbah_addr);
 173        }
 174
 175        if (tf->flags & ATA_TFLAG_DEVICE)
 176                writeb(tf->device, ioaddr->device_addr);
 177
 178        ata_wait_idle(ap);
 179}
 180
 181
 182static void k2_sata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
 183{
 184        struct ata_ioports *ioaddr = &ap->ioaddr;
 185        u16 nsect, lbal, lbam, lbah, feature;
 186
 187        tf->command = k2_stat_check_status(ap);
 188        tf->device = readw(ioaddr->device_addr);
 189        feature = readw(ioaddr->error_addr);
 190        nsect = readw(ioaddr->nsect_addr);
 191        lbal = readw(ioaddr->lbal_addr);
 192        lbam = readw(ioaddr->lbam_addr);
 193        lbah = readw(ioaddr->lbah_addr);
 194
 195        tf->feature = feature;
 196        tf->nsect = nsect;
 197        tf->lbal = lbal;
 198        tf->lbam = lbam;
 199        tf->lbah = lbah;
 200
 201        if (tf->flags & ATA_TFLAG_LBA48) {
 202                tf->hob_feature = feature >> 8;
 203                tf->hob_nsect = nsect >> 8;
 204                tf->hob_lbal = lbal >> 8;
 205                tf->hob_lbam = lbam >> 8;
 206                tf->hob_lbah = lbah >> 8;
 207        }
 208}
 209
 210/**
 211 *      k2_bmdma_setup_mmio - Set up PCI IDE BMDMA transaction (MMIO)
 212 *      @qc: Info associated with this ATA transaction.
 213 *
 214 *      LOCKING:
 215 *      spin_lock_irqsave(host lock)
 216 */
 217
 218static void k2_bmdma_setup_mmio(struct ata_queued_cmd *qc)
 219{
 220        struct ata_port *ap = qc->ap;
 221        unsigned int rw = (qc->tf.flags & ATA_TFLAG_WRITE);
 222        u8 dmactl;
 223        void __iomem *mmio = ap->ioaddr.bmdma_addr;
 224
 225        /* load PRD table addr. */
 226        mb();   /* make sure PRD table writes are visible to controller */
 227        writel(ap->bmdma_prd_dma, mmio + ATA_DMA_TABLE_OFS);
 228
 229        /* specify data direction, triple-check start bit is clear */
 230        dmactl = readb(mmio + ATA_DMA_CMD);
 231        dmactl &= ~(ATA_DMA_WR | ATA_DMA_START);
 232        if (!rw)
 233                dmactl |= ATA_DMA_WR;
 234        writeb(dmactl, mmio + ATA_DMA_CMD);
 235
 236        /* issue r/w command if this is not a ATA DMA command*/
 237        if (qc->tf.protocol != ATA_PROT_DMA)
 238                ap->ops->sff_exec_command(ap, &qc->tf);
 239}
 240
 241/**
 242 *      k2_bmdma_start_mmio - Start a PCI IDE BMDMA transaction (MMIO)
 243 *      @qc: Info associated with this ATA transaction.
 244 *
 245 *      LOCKING:
 246 *      spin_lock_irqsave(host lock)
 247 */
 248
 249static void k2_bmdma_start_mmio(struct ata_queued_cmd *qc)
 250{
 251        struct ata_port *ap = qc->ap;
 252        void __iomem *mmio = ap->ioaddr.bmdma_addr;
 253        u8 dmactl;
 254
 255        /* start host DMA transaction */
 256        dmactl = readb(mmio + ATA_DMA_CMD);
 257        writeb(dmactl | ATA_DMA_START, mmio + ATA_DMA_CMD);
 258        /* This works around possible data corruption.
 259
 260           On certain SATA controllers that can be seen when the r/w
 261           command is given to the controller before the host DMA is
 262           started.
 263
 264           On a Read command, the controller would initiate the
 265           command to the drive even before it sees the DMA
 266           start. When there are very fast drives connected to the
 267           controller, or when the data request hits in the drive
 268           cache, there is the possibility that the drive returns a
 269           part or all of the requested data to the controller before
 270           the DMA start is issued.  In this case, the controller
 271           would become confused as to what to do with the data.  In
 272           the worst case when all the data is returned back to the
 273           controller, the controller could hang. In other cases it
 274           could return partial data returning in data
 275           corruption. This problem has been seen in PPC systems and
 276           can also appear on an system with very fast disks, where
 277           the SATA controller is sitting behind a number of bridges,
 278           and hence there is significant latency between the r/w
 279           command and the start command. */
 280        /* issue r/w command if the access is to ATA */
 281        if (qc->tf.protocol == ATA_PROT_DMA)
 282                ap->ops->sff_exec_command(ap, &qc->tf);
 283}
 284
 285
 286static u8 k2_stat_check_status(struct ata_port *ap)
 287{
 288        return readl(ap->ioaddr.status_addr);
 289}
 290
 291#ifdef CONFIG_PPC_OF
 292/*
 293 * k2_sata_proc_info
 294 * inout : decides on the direction of the dataflow and the meaning of the
 295 *         variables
 296 * buffer: If inout==FALSE data is being written to it else read from it
 297 * *start: If inout==FALSE start of the valid data in the buffer
 298 * offset: If inout==FALSE offset from the beginning of the imaginary file
 299 *         from which we start writing into the buffer
 300 * length: If inout==FALSE max number of bytes to be written into the buffer
 301 *         else number of bytes in the buffer
 302 */
 303static int k2_sata_proc_info(struct Scsi_Host *shost, char *page, char **start,
 304                             off_t offset, int count, int inout)
 305{
 306        struct ata_port *ap;
 307        struct device_node *np;
 308        int len, index;
 309
 310        /* Find  the ata_port */
 311        ap = ata_shost_to_port(shost);
 312        if (ap == NULL)
 313                return 0;
 314
 315        /* Find the OF node for the PCI device proper */
 316        np = pci_device_to_OF_node(to_pci_dev(ap->host->dev));
 317        if (np == NULL)
 318                return 0;
 319
 320        /* Match it to a port node */
 321        index = (ap == ap->host->ports[0]) ? 0 : 1;
 322        for (np = np->child; np != NULL; np = np->sibling) {
 323                const u32 *reg = of_get_property(np, "reg", NULL);
 324                if (!reg)
 325                        continue;
 326                if (index == *reg)
 327                        break;
 328        }
 329        if (np == NULL)
 330                return 0;
 331
 332        len = sprintf(page, "devspec: %s\n", np->full_name);
 333
 334        return len;
 335}
 336#endif /* CONFIG_PPC_OF */
 337
 338
 339static struct scsi_host_template k2_sata_sht = {
 340        ATA_BMDMA_SHT(DRV_NAME),
 341#ifdef CONFIG_PPC_OF
 342        .proc_info              = k2_sata_proc_info,
 343#endif
 344};
 345
 346
 347static struct ata_port_operations k2_sata_ops = {
 348        .inherits               = &ata_bmdma_port_ops,
 349        .sff_tf_load            = k2_sata_tf_load,
 350        .sff_tf_read            = k2_sata_tf_read,
 351        .sff_check_status       = k2_stat_check_status,
 352        .check_atapi_dma        = k2_sata_check_atapi_dma,
 353        .bmdma_setup            = k2_bmdma_setup_mmio,
 354        .bmdma_start            = k2_bmdma_start_mmio,
 355        .scr_read               = k2_sata_scr_read,
 356        .scr_write              = k2_sata_scr_write,
 357};
 358
 359static const struct ata_port_info k2_port_info[] = {
 360        /* chip_svw4 */
 361        {
 362                .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
 363                                  ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA,
 364                .pio_mask       = ATA_PIO4,
 365                .mwdma_mask     = ATA_MWDMA2,
 366                .udma_mask      = ATA_UDMA6,
 367                .port_ops       = &k2_sata_ops,
 368        },
 369        /* chip_svw8 */
 370        {
 371                .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
 372                                  ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA |
 373                                  K2_FLAG_SATA_8_PORTS,
 374                .pio_mask       = ATA_PIO4,
 375                .mwdma_mask     = ATA_MWDMA2,
 376                .udma_mask      = ATA_UDMA6,
 377                .port_ops       = &k2_sata_ops,
 378        },
 379        /* chip_svw42 */
 380        {
 381                .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
 382                                  ATA_FLAG_MMIO | K2_FLAG_BAR_POS_3,
 383                .pio_mask       = ATA_PIO4,
 384                .mwdma_mask     = ATA_MWDMA2,
 385                .udma_mask      = ATA_UDMA6,
 386                .port_ops       = &k2_sata_ops,
 387        },
 388        /* chip_svw43 */
 389        {
 390                .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
 391                                  ATA_FLAG_MMIO,
 392                .pio_mask       = ATA_PIO4,
 393                .mwdma_mask     = ATA_MWDMA2,
 394                .udma_mask      = ATA_UDMA6,
 395                .port_ops       = &k2_sata_ops,
 396        },
 397};
 398
 399static void k2_sata_setup_port(struct ata_ioports *port, void __iomem *base)
 400{
 401        port->cmd_addr          = base + K2_SATA_TF_CMD_OFFSET;
 402        port->data_addr         = base + K2_SATA_TF_DATA_OFFSET;
 403        port->feature_addr      =
 404        port->error_addr        = base + K2_SATA_TF_ERROR_OFFSET;
 405        port->nsect_addr        = base + K2_SATA_TF_NSECT_OFFSET;
 406        port->lbal_addr         = base + K2_SATA_TF_LBAL_OFFSET;
 407        port->lbam_addr         = base + K2_SATA_TF_LBAM_OFFSET;
 408        port->lbah_addr         = base + K2_SATA_TF_LBAH_OFFSET;
 409        port->device_addr       = base + K2_SATA_TF_DEVICE_OFFSET;
 410        port->command_addr      =
 411        port->status_addr       = base + K2_SATA_TF_CMDSTAT_OFFSET;
 412        port->altstatus_addr    =
 413        port->ctl_addr          = base + K2_SATA_TF_CTL_OFFSET;
 414        port->bmdma_addr        = base + K2_SATA_DMA_CMD_OFFSET;
 415        port->scr_addr          = base + K2_SATA_SCR_STATUS_OFFSET;
 416}
 417
 418
 419static int k2_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 420{
 421        static int printed_version;
 422        const struct ata_port_info *ppi[] =
 423                { &k2_port_info[ent->driver_data], NULL };
 424        struct ata_host *host;
 425        void __iomem *mmio_base;
 426        int n_ports, i, rc, bar_pos;
 427
 428        if (!printed_version++)
 429                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 430
 431        /* allocate host */
 432        n_ports = 4;
 433        if (ppi[0]->flags & K2_FLAG_SATA_8_PORTS)
 434                n_ports = 8;
 435
 436        host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
 437        if (!host)
 438                return -ENOMEM;
 439
 440        bar_pos = 5;
 441        if (ppi[0]->flags & K2_FLAG_BAR_POS_3)
 442                bar_pos = 3;
 443        /*
 444         * If this driver happens to only be useful on Apple's K2, then
 445         * we should check that here as it has a normal Serverworks ID
 446         */
 447        rc = pcim_enable_device(pdev);
 448        if (rc)
 449                return rc;
 450
 451        /*
 452         * Check if we have resources mapped at all (second function may
 453         * have been disabled by firmware)
 454         */
 455        if (pci_resource_len(pdev, bar_pos) == 0) {
 456                /* In IDE mode we need to pin the device to ensure that
 457                        pcim_release does not clear the busmaster bit in config
 458                        space, clearing causes busmaster DMA to fail on
 459                        ports 3 & 4 */
 460                pcim_pin_device(pdev);
 461                return -ENODEV;
 462        }
 463
 464        /* Request and iomap PCI regions */
 465        rc = pcim_iomap_regions(pdev, 1 << bar_pos, DRV_NAME);
 466        if (rc == -EBUSY)
 467                pcim_pin_device(pdev);
 468        if (rc)
 469                return rc;
 470        host->iomap = pcim_iomap_table(pdev);
 471        mmio_base = host->iomap[bar_pos];
 472
 473        /* different controllers have different number of ports - currently 4 or 8 */
 474        /* All ports are on the same function. Multi-function device is no
 475         * longer available. This should not be seen in any system. */
 476        for (i = 0; i < host->n_ports; i++) {
 477                struct ata_port *ap = host->ports[i];
 478                unsigned int offset = i * K2_SATA_PORT_OFFSET;
 479
 480                k2_sata_setup_port(&ap->ioaddr, mmio_base + offset);
 481
 482                ata_port_pbar_desc(ap, 5, -1, "mmio");
 483                ata_port_pbar_desc(ap, 5, offset, "port");
 484        }
 485
 486        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
 487        if (rc)
 488                return rc;
 489        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
 490        if (rc)
 491                return rc;
 492
 493        /* Clear a magic bit in SCR1 according to Darwin, those help
 494         * some funky seagate drives (though so far, those were already
 495         * set by the firmware on the machines I had access to)
 496         */
 497        writel(readl(mmio_base + K2_SATA_SICR1_OFFSET) & ~0x00040000,
 498               mmio_base + K2_SATA_SICR1_OFFSET);
 499
 500        /* Clear SATA error & interrupts we don't use */
 501        writel(0xffffffff, mmio_base + K2_SATA_SCR_ERROR_OFFSET);
 502        writel(0x0, mmio_base + K2_SATA_SIM_OFFSET);
 503
 504        pci_set_master(pdev);
 505        return ata_host_activate(host, pdev->irq, ata_bmdma_interrupt,
 506                                 IRQF_SHARED, &k2_sata_sht);
 507}
 508
 509/* 0x240 is device ID for Apple K2 device
 510 * 0x241 is device ID for Serverworks Frodo4
 511 * 0x242 is device ID for Serverworks Frodo8
 512 * 0x24a is device ID for BCM5785 (aka HT1000) HT southbridge integrated SATA
 513 * controller
 514 * */
 515static const struct pci_device_id k2_sata_pci_tbl[] = {
 516        { PCI_VDEVICE(SERVERWORKS, 0x0240), chip_svw4 },
 517        { PCI_VDEVICE(SERVERWORKS, 0x0241), chip_svw8 },
 518        { PCI_VDEVICE(SERVERWORKS, 0x0242), chip_svw4 },
 519        { PCI_VDEVICE(SERVERWORKS, 0x024a), chip_svw4 },
 520        { PCI_VDEVICE(SERVERWORKS, 0x024b), chip_svw4 },
 521        { PCI_VDEVICE(SERVERWORKS, 0x0410), chip_svw42 },
 522        { PCI_VDEVICE(SERVERWORKS, 0x0411), chip_svw43 },
 523
 524        { }
 525};
 526
 527static struct pci_driver k2_sata_pci_driver = {
 528        .name                   = DRV_NAME,
 529        .id_table               = k2_sata_pci_tbl,
 530        .probe                  = k2_sata_init_one,
 531        .remove                 = ata_pci_remove_one,
 532};
 533
 534static int __init k2_sata_init(void)
 535{
 536        return pci_register_driver(&k2_sata_pci_driver);
 537}
 538
 539static void __exit k2_sata_exit(void)
 540{
 541        pci_unregister_driver(&k2_sata_pci_driver);
 542}
 543
 544MODULE_AUTHOR("Benjamin Herrenschmidt");
 545MODULE_DESCRIPTION("low-level driver for K2 SATA controller");
 546MODULE_LICENSE("GPL");
 547MODULE_DEVICE_TABLE(pci, k2_sata_pci_tbl);
 548MODULE_VERSION(DRV_VERSION);
 549
 550module_init(k2_sata_init);
 551module_exit(k2_sata_exit);
 552