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 "0.20"
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 .queuecommand = ata_scsi_queuecmd,
85 .eh_strategy_handler = ata_scsi_error,
86 .can_queue = ATA_DEF_QUEUE,
87 .this_id = ATA_SHT_THIS_ID,
88 .sg_tablesize = LIBATA_MAX_PRD,
89 .max_sectors = ATA_MAX_SECTORS,
90 .cmd_per_lun = ATA_SHT_CMD_PER_LUN,
91 .emulated = ATA_SHT_EMULATED,
92 .use_clustering = ATA_SHT_USE_CLUSTERING,
93 .proc_name = DRV_NAME,
94 .dma_boundary = ATA_DMA_BOUNDARY,
95 .slave_configure = ata_scsi_slave_config,
96 .bios_param = ata_std_bios_param,
99 static struct ata_port_operations svia_sata_ops = {
100 .port_disable = ata_port_disable,
102 .tf_load = ata_tf_load_pio,
103 .tf_read = ata_tf_read_pio,
104 .check_status = ata_check_status_pio,
105 .exec_command = ata_exec_command_pio,
107 .phy_reset = sata_phy_reset,
109 .bmdma_setup = ata_bmdma_setup_pio,
110 .bmdma_start = ata_bmdma_start_pio,
111 .qc_prep = ata_qc_prep,
112 .qc_issue = ata_qc_issue_prot,
114 .eng_timeout = ata_eng_timeout,
116 .irq_handler = ata_interrupt,
117 .irq_clear = ata_bmdma_irq_clear,
119 .scr_read = svia_scr_read,
120 .scr_write = svia_scr_write,
122 .port_start = ata_port_start,
123 .port_stop = ata_port_stop,
126 MODULE_AUTHOR("Jeff Garzik");
127 MODULE_DESCRIPTION("SCSI low-level driver for VIA SATA controllers");
128 MODULE_LICENSE("GPL");
129 MODULE_DEVICE_TABLE(pci, svia_pci_tbl);
131 static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg)
133 if (sc_reg > SCR_CONTROL)
135 return inl(ap->ioaddr.scr_addr + (4 * sc_reg));
138 static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
140 if (sc_reg > SCR_CONTROL)
142 outl(val, ap->ioaddr.scr_addr + (4 * sc_reg));
145 static const unsigned int svia_bar_sizes[] = {
149 static unsigned long svia_scr_addr(unsigned long addr, unsigned int port)
151 return addr + (port * 128);
154 static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
156 static int printed_version;
159 struct ata_probe_ent *probe_ent;
162 if (!printed_version++)
163 printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
165 rc = pci_enable_device(pdev);
169 rc = pci_request_regions(pdev, DRV_NAME);
173 pci_read_config_byte(pdev, SATA_PATA_SHARING, &tmp8);
174 if (tmp8 & SATA_2DEV) {
175 printk(KERN_ERR DRV_NAME "(%s): SATA master/slave not supported (0x%x)\n",
176 pci_name(pdev), (int) tmp8);
178 goto err_out_regions;
181 for (i = 0; i < ARRAY_SIZE(svia_bar_sizes); i++)
182 if ((pci_resource_start(pdev, i) == 0) ||
183 (pci_resource_len(pdev, i) < svia_bar_sizes[i])) {
184 printk(KERN_ERR DRV_NAME "(%s): invalid PCI BAR %u (sz 0x%lx, val 0x%lx)\n",
186 pci_resource_start(pdev, i),
187 pci_resource_len(pdev, i));
189 goto err_out_regions;
192 rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
194 goto err_out_regions;
195 rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
197 goto err_out_regions;
199 probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
201 printk(KERN_ERR DRV_NAME "(%s): out of memory\n",
204 goto err_out_regions;
206 memset(probe_ent, 0, sizeof(*probe_ent));
207 INIT_LIST_HEAD(&probe_ent->node);
208 probe_ent->pdev = pdev;
209 probe_ent->sht = &svia_sht;
210 probe_ent->host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST |
212 probe_ent->port_ops = &svia_sata_ops;
213 probe_ent->n_ports = 2;
214 probe_ent->irq = pdev->irq;
215 probe_ent->irq_flags = SA_SHIRQ;
216 probe_ent->pio_mask = 0x1f;
217 probe_ent->udma_mask = 0x7f;
219 probe_ent->port[0].cmd_addr = pci_resource_start(pdev, 0);
220 ata_std_ports(&probe_ent->port[0]);
221 probe_ent->port[0].altstatus_addr =
222 probe_ent->port[0].ctl_addr =
223 pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS;
224 probe_ent->port[0].bmdma_addr = pci_resource_start(pdev, 4);
225 probe_ent->port[0].scr_addr =
226 svia_scr_addr(pci_resource_start(pdev, 5), 0);
228 probe_ent->port[1].cmd_addr = pci_resource_start(pdev, 2);
229 ata_std_ports(&probe_ent->port[1]);
230 probe_ent->port[1].altstatus_addr =
231 probe_ent->port[1].ctl_addr =
232 pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS;
233 probe_ent->port[1].bmdma_addr = pci_resource_start(pdev, 4) + 8;
234 probe_ent->port[1].scr_addr =
235 svia_scr_addr(pci_resource_start(pdev, 5), 1);
237 pci_read_config_byte(pdev, PCI_INTERRUPT_LINE, &tmp8);
238 printk(KERN_INFO DRV_NAME "(%s): routed to hard irq line %d\n",
240 (int) (tmp8 & 0xf0) == 0xf0 ? 0 : tmp8 & 0x0f);
242 /* make sure SATA channels are enabled */
243 pci_read_config_byte(pdev, SATA_CHAN_ENAB, &tmp8);
244 if ((tmp8 & ENAB_ALL) != ENAB_ALL) {
245 printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channels (0x%x)\n",
246 pci_name(pdev), (int) tmp8);
248 pci_write_config_byte(pdev, SATA_CHAN_ENAB, tmp8);
251 /* make sure interrupts for each channel sent to us */
252 pci_read_config_byte(pdev, SATA_INT_GATE, &tmp8);
253 if ((tmp8 & INT_GATE_ALL) != INT_GATE_ALL) {
254 printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel interrupts (0x%x)\n",
255 pci_name(pdev), (int) tmp8);
256 tmp8 |= INT_GATE_ALL;
257 pci_write_config_byte(pdev, SATA_INT_GATE, tmp8);
260 /* make sure native mode is enabled */
261 pci_read_config_byte(pdev, SATA_NATIVE_MODE, &tmp8);
262 if ((tmp8 & NATIVE_MODE_ALL) != NATIVE_MODE_ALL) {
263 printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel native mode (0x%x)\n",
264 pci_name(pdev), (int) tmp8);
265 tmp8 |= NATIVE_MODE_ALL;
266 pci_write_config_byte(pdev, SATA_NATIVE_MODE, tmp8);
269 pci_set_master(pdev);
271 /* FIXME: check ata_device_add return value */
272 ata_device_add(probe_ent);
278 pci_release_regions(pdev);
280 pci_disable_device(pdev);
284 static int __init svia_init(void)
286 return pci_module_init(&svia_pci_driver);
289 static void __exit svia_exit(void)
291 pci_unregister_driver(&svia_pci_driver);
294 module_init(svia_init);
295 module_exit(svia_exit);