2 sata_via.c - VIA Serial ATA controllers
4 Maintained by: Jeff Garzik <jgarzik@pobox.com>
5 Please ALWAYS copy linux-ide@vger.kernel.org
8 Copyright 2003-2004 Red Hat, Inc. All rights reserved.
9 Copyright 2003-2004 Jeff Garzik
11 The contents of this file are subject to the Open
12 Software License version 1.1 that can be found at
13 http://www.opensource.org/licenses/osl-1.1.txt and is included herein
16 Alternatively, the contents of this file may be used under the terms
17 of the GNU General Public License version 2 (the "GPL") as distributed
18 in the kernel source COPYING file, in which case the provisions of
19 the GPL are applicable instead of the above. If you wish to allow
20 the use of your version of this file only under the terms of the
21 GPL and not to allow others to use your version of this file under
22 the OSL, indicate your decision by deleting the provisions above and
23 replace them with the notice and other provisions required by the GPL.
24 If you do not delete the provisions above, a recipient may use your
25 version of this file under either the OSL or the GPL.
29 #include <linux/kernel.h>
30 #include <linux/module.h>
31 #include <linux/pci.h>
32 #include <linux/init.h>
33 #include <linux/blkdev.h>
34 #include <linux/delay.h>
36 #include <scsi/scsi_host.h>
37 #include <linux/libata.h>
40 #define DRV_NAME "sata_via"
41 #define DRV_VERSION "1.0"
46 SATA_CHAN_ENAB = 0x40, /* SATA channel enable */
47 SATA_INT_GATE = 0x41, /* SATA interrupt gating */
48 SATA_NATIVE_MODE = 0x42, /* Native mode enable */
49 SATA_PATA_SHARING = 0x49, /* PATA/SATA sharing func ctrl */
54 ENAB_ALL = PORT0 | PORT1,
56 INT_GATE_ALL = PORT0 | PORT1,
58 NATIVE_MODE_ALL = (1 << 7) | (1 << 6) | (1 << 5) | (1 << 4),
60 SATA_EXT_PHY = (1 << 6), /* 0==use PATA, 1==ext phy */
61 SATA_2DEV = (1 << 5), /* SATA is master/slave */
64 static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
65 static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg);
66 static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
68 static struct pci_device_id svia_pci_tbl[] = {
69 { 0x1106, 0x3149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, via_sata },
71 { } /* terminate list */
74 static struct pci_driver svia_pci_driver = {
76 .id_table = svia_pci_tbl,
77 .probe = svia_init_one,
78 .remove = ata_pci_remove_one,
81 static Scsi_Host_Template svia_sht = {
82 .module = THIS_MODULE,
84 .ioctl = ata_scsi_ioctl,
85 .queuecommand = ata_scsi_queuecmd,
86 .eh_strategy_handler = ata_scsi_error,
87 .can_queue = ATA_DEF_QUEUE,
88 .this_id = ATA_SHT_THIS_ID,
89 .sg_tablesize = LIBATA_MAX_PRD,
90 .max_sectors = ATA_MAX_SECTORS,
91 .cmd_per_lun = ATA_SHT_CMD_PER_LUN,
92 .emulated = ATA_SHT_EMULATED,
93 .use_clustering = ATA_SHT_USE_CLUSTERING,
94 .proc_name = DRV_NAME,
95 .dma_boundary = ATA_DMA_BOUNDARY,
96 .slave_configure = ata_scsi_slave_config,
97 .bios_param = ata_std_bios_param,
100 static struct ata_port_operations svia_sata_ops = {
101 .port_disable = ata_port_disable,
103 .tf_load = ata_tf_load,
104 .tf_read = ata_tf_read,
105 .check_status = ata_check_status,
106 .exec_command = ata_exec_command,
107 .dev_select = ata_std_dev_select,
109 .phy_reset = sata_phy_reset,
111 .bmdma_setup = ata_bmdma_setup,
112 .bmdma_start = ata_bmdma_start,
113 .qc_prep = ata_qc_prep,
114 .qc_issue = ata_qc_issue_prot,
116 .eng_timeout = ata_eng_timeout,
118 .irq_handler = ata_interrupt,
119 .irq_clear = ata_bmdma_irq_clear,
121 .scr_read = svia_scr_read,
122 .scr_write = svia_scr_write,
124 .port_start = ata_port_start,
125 .port_stop = ata_port_stop,
128 static struct ata_port_info svia_port_info = {
130 .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | ATA_FLAG_NO_LEGACY,
134 .port_ops = &svia_sata_ops,
137 MODULE_AUTHOR("Jeff Garzik");
138 MODULE_DESCRIPTION("SCSI low-level driver for VIA SATA controllers");
139 MODULE_LICENSE("GPL");
140 MODULE_DEVICE_TABLE(pci, svia_pci_tbl);
141 MODULE_VERSION(DRV_VERSION);
143 static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg)
145 if (sc_reg > SCR_CONTROL)
147 return inl(ap->ioaddr.scr_addr + (4 * sc_reg));
150 static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
152 if (sc_reg > SCR_CONTROL)
154 outl(val, ap->ioaddr.scr_addr + (4 * sc_reg));
157 static const unsigned int svia_bar_sizes[] = {
161 static unsigned long svia_scr_addr(unsigned long addr, unsigned int port)
163 return addr + (port * 128);
166 static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
168 static int printed_version;
171 struct ata_port_info *ppi;
172 struct ata_probe_ent *probe_ent;
175 if (!printed_version++)
176 printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
178 rc = pci_enable_device(pdev);
182 rc = pci_request_regions(pdev, DRV_NAME);
186 pci_read_config_byte(pdev, SATA_PATA_SHARING, &tmp8);
187 if (tmp8 & SATA_2DEV) {
188 printk(KERN_ERR DRV_NAME "(%s): SATA master/slave not supported (0x%x)\n",
189 pci_name(pdev), (int) tmp8);
191 goto err_out_regions;
194 for (i = 0; i < ARRAY_SIZE(svia_bar_sizes); i++)
195 if ((pci_resource_start(pdev, i) == 0) ||
196 (pci_resource_len(pdev, i) < svia_bar_sizes[i])) {
197 printk(KERN_ERR DRV_NAME "(%s): invalid PCI BAR %u (sz 0x%lx, val 0x%lx)\n",
199 pci_resource_start(pdev, i),
200 pci_resource_len(pdev, i));
202 goto err_out_regions;
205 rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
207 goto err_out_regions;
208 rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
210 goto err_out_regions;
212 ppi = &svia_port_info;
213 probe_ent = ata_pci_init_native_mode(pdev, &ppi);
215 printk(KERN_ERR DRV_NAME "(%s): out of memory\n",
218 goto err_out_regions;
221 probe_ent->port[0].scr_addr =
222 svia_scr_addr(pci_resource_start(pdev, 5), 0);
223 probe_ent->port[1].scr_addr =
224 svia_scr_addr(pci_resource_start(pdev, 5), 1);
226 pci_read_config_byte(pdev, PCI_INTERRUPT_LINE, &tmp8);
227 printk(KERN_INFO DRV_NAME "(%s): routed to hard irq line %d\n",
229 (int) (tmp8 & 0xf0) == 0xf0 ? 0 : tmp8 & 0x0f);
231 /* make sure SATA channels are enabled */
232 pci_read_config_byte(pdev, SATA_CHAN_ENAB, &tmp8);
233 if ((tmp8 & ENAB_ALL) != ENAB_ALL) {
234 printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channels (0x%x)\n",
235 pci_name(pdev), (int) tmp8);
237 pci_write_config_byte(pdev, SATA_CHAN_ENAB, tmp8);
240 /* make sure interrupts for each channel sent to us */
241 pci_read_config_byte(pdev, SATA_INT_GATE, &tmp8);
242 if ((tmp8 & INT_GATE_ALL) != INT_GATE_ALL) {
243 printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel interrupts (0x%x)\n",
244 pci_name(pdev), (int) tmp8);
245 tmp8 |= INT_GATE_ALL;
246 pci_write_config_byte(pdev, SATA_INT_GATE, tmp8);
249 /* make sure native mode is enabled */
250 pci_read_config_byte(pdev, SATA_NATIVE_MODE, &tmp8);
251 if ((tmp8 & NATIVE_MODE_ALL) != NATIVE_MODE_ALL) {
252 printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel native mode (0x%x)\n",
253 pci_name(pdev), (int) tmp8);
254 tmp8 |= NATIVE_MODE_ALL;
255 pci_write_config_byte(pdev, SATA_NATIVE_MODE, tmp8);
258 pci_set_master(pdev);
260 /* FIXME: check ata_device_add return value */
261 ata_device_add(probe_ent);
267 pci_release_regions(pdev);
269 pci_disable_device(pdev);
273 static int __init svia_init(void)
275 return pci_module_init(&svia_pci_driver);
278 static void __exit svia_exit(void)
280 pci_unregister_driver(&svia_pci_driver);
283 module_init(svia_init);
284 module_exit(svia_exit);