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 .fill_sg = ata_fill_sg,
112 .eng_timeout = ata_eng_timeout,
114 .irq_handler = ata_interrupt,
116 .scr_read = svia_scr_read,
117 .scr_write = svia_scr_write,
119 .port_start = ata_port_start,
120 .port_stop = ata_port_stop,
123 MODULE_AUTHOR("Jeff Garzik");
124 MODULE_DESCRIPTION("SCSI low-level driver for VIA SATA controllers");
125 MODULE_LICENSE("GPL");
126 MODULE_DEVICE_TABLE(pci, svia_pci_tbl);
128 static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg)
130 if (sc_reg > SCR_CONTROL)
132 return inl(ap->ioaddr.scr_addr + (4 * sc_reg));
135 static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
137 if (sc_reg > SCR_CONTROL)
139 outl(val, ap->ioaddr.scr_addr + (4 * sc_reg));
142 static const unsigned int svia_bar_sizes[] = {
146 static unsigned long svia_scr_addr(unsigned long addr, unsigned int port)
148 return addr + (port * 128);
151 static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
153 static int printed_version;
156 struct ata_probe_ent *probe_ent;
159 if (!printed_version++)
160 printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
162 rc = pci_enable_device(pdev);
166 rc = pci_request_regions(pdev, DRV_NAME);
170 pci_read_config_byte(pdev, SATA_PATA_SHARING, &tmp8);
171 if (tmp8 & SATA_2DEV) {
172 printk(KERN_ERR DRV_NAME "(%s): SATA master/slave not supported (0x%x)\n",
173 pci_name(pdev), (int) tmp8);
175 goto err_out_regions;
178 for (i = 0; i < ARRAY_SIZE(svia_bar_sizes); i++)
179 if ((pci_resource_start(pdev, i) == 0) ||
180 (pci_resource_len(pdev, i) < svia_bar_sizes[i])) {
181 printk(KERN_ERR DRV_NAME "(%s): invalid PCI BAR %u (sz 0x%lx, val 0x%lx)\n",
183 pci_resource_start(pdev, i),
184 pci_resource_len(pdev, i));
186 goto err_out_regions;
189 rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
191 goto err_out_regions;
192 rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
194 goto err_out_regions;
196 probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
198 printk(KERN_ERR DRV_NAME "(%s): out of memory\n",
201 goto err_out_regions;
203 memset(probe_ent, 0, sizeof(*probe_ent));
204 INIT_LIST_HEAD(&probe_ent->node);
205 probe_ent->pdev = pdev;
206 probe_ent->sht = &svia_sht;
207 probe_ent->host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST |
209 probe_ent->port_ops = &svia_sata_ops;
210 probe_ent->n_ports = 2;
211 probe_ent->irq = pdev->irq;
212 probe_ent->irq_flags = SA_SHIRQ;
213 probe_ent->pio_mask = 0x1f;
214 probe_ent->udma_mask = 0x7f;
216 probe_ent->port[0].cmd_addr = pci_resource_start(pdev, 0);
217 ata_std_ports(&probe_ent->port[0]);
218 probe_ent->port[0].altstatus_addr =
219 probe_ent->port[0].ctl_addr =
220 pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS;
221 probe_ent->port[0].bmdma_addr = pci_resource_start(pdev, 4);
222 probe_ent->port[0].scr_addr =
223 svia_scr_addr(pci_resource_start(pdev, 5), 0);
225 probe_ent->port[1].cmd_addr = pci_resource_start(pdev, 2);
226 ata_std_ports(&probe_ent->port[1]);
227 probe_ent->port[1].altstatus_addr =
228 probe_ent->port[1].ctl_addr =
229 pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS;
230 probe_ent->port[1].bmdma_addr = pci_resource_start(pdev, 4) + 8;
231 probe_ent->port[1].scr_addr =
232 svia_scr_addr(pci_resource_start(pdev, 5), 1);
234 pci_read_config_byte(pdev, PCI_INTERRUPT_LINE, &tmp8);
235 printk(KERN_INFO DRV_NAME "(%s): routed to hard irq line %d\n",
237 (int) (tmp8 & 0xf0) == 0xf0 ? 0 : tmp8 & 0x0f);
239 /* make sure SATA channels are enabled */
240 pci_read_config_byte(pdev, SATA_CHAN_ENAB, &tmp8);
241 if ((tmp8 & ENAB_ALL) != ENAB_ALL) {
242 printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channels (0x%x)\n",
243 pci_name(pdev), (int) tmp8);
245 pci_write_config_byte(pdev, SATA_CHAN_ENAB, tmp8);
248 /* make sure interrupts for each channel sent to us */
249 pci_read_config_byte(pdev, SATA_INT_GATE, &tmp8);
250 if ((tmp8 & INT_GATE_ALL) != INT_GATE_ALL) {
251 printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel interrupts (0x%x)\n",
252 pci_name(pdev), (int) tmp8);
253 tmp8 |= INT_GATE_ALL;
254 pci_write_config_byte(pdev, SATA_INT_GATE, tmp8);
257 /* make sure native mode is enabled */
258 pci_read_config_byte(pdev, SATA_NATIVE_MODE, &tmp8);
259 if ((tmp8 & NATIVE_MODE_ALL) != NATIVE_MODE_ALL) {
260 printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel native mode (0x%x)\n",
261 pci_name(pdev), (int) tmp8);
262 tmp8 |= NATIVE_MODE_ALL;
263 pci_write_config_byte(pdev, SATA_NATIVE_MODE, tmp8);
266 pci_set_master(pdev);
268 /* FIXME: check ata_device_add return value */
269 ata_device_add(probe_ent);
275 pci_release_regions(pdev);
277 pci_disable_device(pdev);
281 static int __init svia_init(void)
283 return pci_module_init(&svia_pci_driver);
286 static void __exit svia_exit(void)
288 pci_unregister_driver(&svia_pci_driver);
291 module_init(svia_init);
292 module_exit(svia_exit);