diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-07 20:27:39 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-07 20:27:39 -0400 |
| commit | cc896f08717c445235554a7963a7b2ecf58911ad (patch) | |
| tree | 1f3bdd0d1b7b503e2344755ff03e0862c8eb9a01 | |
| parent | 87129d96265cebcb1176896746d285b46c2d7b36 (diff) | |
| parent | ca20aa6954bcb4537064a1bf5e8f74af57da2a03 (diff) | |
Merge branch 'upstream' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev
| -rw-r--r-- | drivers/scsi/Kconfig | 9 | ||||
| -rw-r--r-- | drivers/scsi/Makefile | 1 | ||||
| -rw-r--r-- | drivers/scsi/ahci.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/sata_mv.c | 843 | ||||
| -rw-r--r-- | drivers/scsi/sata_uli.c | 4 |
5 files changed, 856 insertions, 3 deletions
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index 787ad00a2b73..a261b9eea139 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig | |||
| @@ -459,6 +459,15 @@ config SCSI_ATA_PIIX | |||
| 459 | 459 | ||
| 460 | If unsure, say N. | 460 | If unsure, say N. |
| 461 | 461 | ||
| 462 | config SCSI_SATA_MV | ||
| 463 | tristate "Marvell SATA support" | ||
| 464 | depends on SCSI_SATA && PCI && EXPERIMENTAL | ||
| 465 | help | ||
| 466 | This option enables support for the Marvell Serial ATA family. | ||
| 467 | Currently supports 88SX[56]0[48][01] chips. | ||
| 468 | |||
| 469 | If unsure, say N. | ||
| 470 | |||
| 462 | config SCSI_SATA_NV | 471 | config SCSI_SATA_NV |
| 463 | tristate "NVIDIA SATA support" | 472 | tristate "NVIDIA SATA support" |
| 464 | depends on SCSI_SATA && PCI && EXPERIMENTAL | 473 | depends on SCSI_SATA && PCI && EXPERIMENTAL |
diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile index 3746fb9fa2f5..c662b8c8cc6d 100644 --- a/drivers/scsi/Makefile +++ b/drivers/scsi/Makefile | |||
| @@ -132,6 +132,7 @@ obj-$(CONFIG_SCSI_SATA_SIS) += libata.o sata_sis.o | |||
| 132 | obj-$(CONFIG_SCSI_SATA_SX4) += libata.o sata_sx4.o | 132 | obj-$(CONFIG_SCSI_SATA_SX4) += libata.o sata_sx4.o |
| 133 | obj-$(CONFIG_SCSI_SATA_NV) += libata.o sata_nv.o | 133 | obj-$(CONFIG_SCSI_SATA_NV) += libata.o sata_nv.o |
| 134 | obj-$(CONFIG_SCSI_SATA_ULI) += libata.o sata_uli.o | 134 | obj-$(CONFIG_SCSI_SATA_ULI) += libata.o sata_uli.o |
| 135 | obj-$(CONFIG_SCSI_SATA_MV) += libata.o sata_mv.o | ||
| 135 | 136 | ||
| 136 | obj-$(CONFIG_ARM) += arm/ | 137 | obj-$(CONFIG_ARM) += arm/ |
| 137 | 138 | ||
diff --git a/drivers/scsi/ahci.c b/drivers/scsi/ahci.c index 31065261de8e..320df6cd3def 100644 --- a/drivers/scsi/ahci.c +++ b/drivers/scsi/ahci.c | |||
| @@ -250,7 +250,7 @@ static struct ata_port_info ahci_port_info[] = { | |||
| 250 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | 250 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
| 251 | ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO | | 251 | ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO | |
| 252 | ATA_FLAG_PIO_DMA, | 252 | ATA_FLAG_PIO_DMA, |
| 253 | .pio_mask = 0x03, /* pio3-4 */ | 253 | .pio_mask = 0x1f, /* pio0-4 */ |
| 254 | .udma_mask = 0x7f, /* udma0-6 ; FIXME */ | 254 | .udma_mask = 0x7f, /* udma0-6 ; FIXME */ |
| 255 | .port_ops = &ahci_ops, | 255 | .port_ops = &ahci_ops, |
| 256 | }, | 256 | }, |
diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c new file mode 100644 index 000000000000..f97e3afa97d9 --- /dev/null +++ b/drivers/scsi/sata_mv.c | |||
| @@ -0,0 +1,843 @@ | |||
| 1 | /* | ||
| 2 | * sata_mv.c - Marvell SATA support | ||
| 3 | * | ||
| 4 | * Copyright 2005: EMC Corporation, all rights reserved. | ||
| 5 | * | ||
| 6 | * Please ALWAYS copy linux-ide@vger.kernel.org on emails. | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License as published by | ||
| 10 | * the Free Software Foundation; version 2 of the License. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 20 | * | ||
| 21 | */ | ||
| 22 | |||
| 23 | #include <linux/kernel.h> | ||
| 24 | #include <linux/module.h> | ||
| 25 | #include <linux/pci.h> | ||
| 26 | #include <linux/init.h> | ||
| 27 | #include <linux/blkdev.h> | ||
| 28 | #include <linux/delay.h> | ||
| 29 | #include <linux/interrupt.h> | ||
| 30 | #include <linux/sched.h> | ||
| 31 | #include <linux/dma-mapping.h> | ||
| 32 | #include "scsi.h" | ||
| 33 | #include <scsi/scsi_host.h> | ||
| 34 | #include <linux/libata.h> | ||
| 35 | #include <asm/io.h> | ||
| 36 | |||
| 37 | #define DRV_NAME "sata_mv" | ||
| 38 | #define DRV_VERSION "0.12" | ||
| 39 | |||
| 40 | enum { | ||
| 41 | /* BAR's are enumerated in terms of pci_resource_start() terms */ | ||
| 42 | MV_PRIMARY_BAR = 0, /* offset 0x10: memory space */ | ||
| 43 | MV_IO_BAR = 2, /* offset 0x18: IO space */ | ||
| 44 | MV_MISC_BAR = 3, /* offset 0x1c: FLASH, NVRAM, SRAM */ | ||
| 45 | |||
| 46 | MV_MAJOR_REG_AREA_SZ = 0x10000, /* 64KB */ | ||
| 47 | MV_MINOR_REG_AREA_SZ = 0x2000, /* 8KB */ | ||
| 48 | |||
| 49 | MV_PCI_REG_BASE = 0, | ||
| 50 | MV_IRQ_COAL_REG_BASE = 0x18000, /* 6xxx part only */ | ||
| 51 | MV_SATAHC0_REG_BASE = 0x20000, | ||
| 52 | |||
| 53 | MV_PCI_REG_SZ = MV_MAJOR_REG_AREA_SZ, | ||
| 54 | MV_SATAHC_REG_SZ = MV_MAJOR_REG_AREA_SZ, | ||
| 55 | MV_SATAHC_ARBTR_REG_SZ = MV_MINOR_REG_AREA_SZ, /* arbiter */ | ||
| 56 | MV_PORT_REG_SZ = MV_MINOR_REG_AREA_SZ, | ||
| 57 | |||
| 58 | MV_Q_CT = 32, | ||
| 59 | MV_CRQB_SZ = 32, | ||
| 60 | MV_CRPB_SZ = 8, | ||
| 61 | |||
| 62 | MV_DMA_BOUNDARY = 0xffffffffU, | ||
| 63 | SATAHC_MASK = (~(MV_SATAHC_REG_SZ - 1)), | ||
| 64 | |||
| 65 | MV_PORTS_PER_HC = 4, | ||
| 66 | /* == (port / MV_PORTS_PER_HC) to determine HC from 0-7 port */ | ||
| 67 | MV_PORT_HC_SHIFT = 2, | ||
| 68 | /* == (port % MV_PORTS_PER_HC) to determine port from 0-7 port */ | ||
| 69 | MV_PORT_MASK = 3, | ||
| 70 | |||
| 71 | /* Host Flags */ | ||
| 72 | MV_FLAG_DUAL_HC = (1 << 30), /* two SATA Host Controllers */ | ||
| 73 | MV_FLAG_IRQ_COALESCE = (1 << 29), /* IRQ coalescing capability */ | ||
| 74 | MV_FLAG_BDMA = (1 << 28), /* Basic DMA */ | ||
| 75 | |||
| 76 | chip_504x = 0, | ||
| 77 | chip_508x = 1, | ||
| 78 | chip_604x = 2, | ||
| 79 | chip_608x = 3, | ||
| 80 | |||
| 81 | /* PCI interface registers */ | ||
| 82 | |||
| 83 | PCI_MAIN_CMD_STS_OFS = 0xd30, | ||
| 84 | STOP_PCI_MASTER = (1 << 2), | ||
| 85 | PCI_MASTER_EMPTY = (1 << 3), | ||
| 86 | GLOB_SFT_RST = (1 << 4), | ||
| 87 | |||
| 88 | PCI_IRQ_CAUSE_OFS = 0x1d58, | ||
| 89 | PCI_IRQ_MASK_OFS = 0x1d5c, | ||
| 90 | PCI_UNMASK_ALL_IRQS = 0x7fffff, /* bits 22-0 */ | ||
| 91 | |||
| 92 | HC_MAIN_IRQ_CAUSE_OFS = 0x1d60, | ||
| 93 | HC_MAIN_IRQ_MASK_OFS = 0x1d64, | ||
| 94 | PORT0_ERR = (1 << 0), /* shift by port # */ | ||
| 95 | PORT0_DONE = (1 << 1), /* shift by port # */ | ||
| 96 | HC0_IRQ_PEND = 0x1ff, /* bits 0-8 = HC0's ports */ | ||
| 97 | HC_SHIFT = 9, /* bits 9-17 = HC1's ports */ | ||
| 98 | PCI_ERR = (1 << 18), | ||
| 99 | TRAN_LO_DONE = (1 << 19), /* 6xxx: IRQ coalescing */ | ||
| 100 | TRAN_HI_DONE = (1 << 20), /* 6xxx: IRQ coalescing */ | ||
| 101 | PORTS_0_7_COAL_DONE = (1 << 21), /* 6xxx: IRQ coalescing */ | ||
| 102 | GPIO_INT = (1 << 22), | ||
| 103 | SELF_INT = (1 << 23), | ||
| 104 | TWSI_INT = (1 << 24), | ||
| 105 | HC_MAIN_RSVD = (0x7f << 25), /* bits 31-25 */ | ||
| 106 | HC_MAIN_MASKED_IRQS = (TRAN_LO_DONE | TRAN_HI_DONE | | ||
| 107 | PORTS_0_7_COAL_DONE | GPIO_INT | TWSI_INT | | ||
| 108 | HC_MAIN_RSVD), | ||
| 109 | |||
| 110 | /* SATAHC registers */ | ||
| 111 | HC_CFG_OFS = 0, | ||
| 112 | |||
| 113 | HC_IRQ_CAUSE_OFS = 0x14, | ||
| 114 | CRBP_DMA_DONE = (1 << 0), /* shift by port # */ | ||
| 115 | HC_IRQ_COAL = (1 << 4), /* IRQ coalescing */ | ||
| 116 | DEV_IRQ = (1 << 8), /* shift by port # */ | ||
| 117 | |||
| 118 | /* Shadow block registers */ | ||
| 119 | SHD_PIO_DATA_OFS = 0x100, | ||
| 120 | SHD_FEA_ERR_OFS = 0x104, | ||
| 121 | SHD_SECT_CNT_OFS = 0x108, | ||
| 122 | SHD_LBA_L_OFS = 0x10C, | ||
| 123 | SHD_LBA_M_OFS = 0x110, | ||
| 124 | SHD_LBA_H_OFS = 0x114, | ||
| 125 | SHD_DEV_HD_OFS = 0x118, | ||
| 126 | SHD_CMD_STA_OFS = 0x11C, | ||
| 127 | SHD_CTL_AST_OFS = 0x120, | ||
| 128 | |||
| 129 | /* SATA registers */ | ||
| 130 | SATA_STATUS_OFS = 0x300, /* ctrl, err regs follow status */ | ||
| 131 | SATA_ACTIVE_OFS = 0x350, | ||
| 132 | |||
| 133 | /* Port registers */ | ||
| 134 | EDMA_CFG_OFS = 0, | ||
| 135 | |||
| 136 | EDMA_ERR_IRQ_CAUSE_OFS = 0x8, | ||
| 137 | EDMA_ERR_IRQ_MASK_OFS = 0xc, | ||
| 138 | EDMA_ERR_D_PAR = (1 << 0), | ||
| 139 | EDMA_ERR_PRD_PAR = (1 << 1), | ||
| 140 | EDMA_ERR_DEV = (1 << 2), | ||
| 141 | EDMA_ERR_DEV_DCON = (1 << 3), | ||
| 142 | EDMA_ERR_DEV_CON = (1 << 4), | ||
| 143 | EDMA_ERR_SERR | ||
