xref: /dflybsd-src/sys/dev/disk/nata/ata-chipset.c (revision 878a32344aea04eb9f358030d9fed9ed6f565550)
1c1b3d7c5SThomas E. Spanjaard /*-
2f6e8a0a1SImre Vadasz  * Copyright (c) 1998 - 2006 Søren Schmidt <sos@FreeBSD.org>
3c1b3d7c5SThomas E. Spanjaard  * All rights reserved.
4c1b3d7c5SThomas E. Spanjaard  *
5c1b3d7c5SThomas E. Spanjaard  * Redistribution and use in source and binary forms, with or without
6c1b3d7c5SThomas E. Spanjaard  * modification, are permitted provided that the following conditions
7c1b3d7c5SThomas E. Spanjaard  * are met:
8c1b3d7c5SThomas E. Spanjaard  * 1. Redistributions of source code must retain the above copyright
9c1b3d7c5SThomas E. Spanjaard  *    notice, this list of conditions and the following disclaimer,
10c1b3d7c5SThomas E. Spanjaard  *    without modification, immediately at the beginning of the file.
11c1b3d7c5SThomas E. Spanjaard  * 2. Redistributions in binary form must reproduce the above copyright
12c1b3d7c5SThomas E. Spanjaard  *    notice, this list of conditions and the following disclaimer in the
13c1b3d7c5SThomas E. Spanjaard  *    documentation and/or other materials provided with the distribution.
14c1b3d7c5SThomas E. Spanjaard  *
15c1b3d7c5SThomas E. Spanjaard  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16c1b3d7c5SThomas E. Spanjaard  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17c1b3d7c5SThomas E. Spanjaard  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18c1b3d7c5SThomas E. Spanjaard  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19c1b3d7c5SThomas E. Spanjaard  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20c1b3d7c5SThomas E. Spanjaard  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21c1b3d7c5SThomas E. Spanjaard  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22c1b3d7c5SThomas E. Spanjaard  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23c1b3d7c5SThomas E. Spanjaard  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24c1b3d7c5SThomas E. Spanjaard  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25c1b3d7c5SThomas E. Spanjaard  *
2602d7aa4aSSascha Wildner  * $FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.196 2007/04/08 19:18:51 sos Exp $
27c1b3d7c5SThomas E. Spanjaard  */
28c1b3d7c5SThomas E. Spanjaard 
29c1b3d7c5SThomas E. Spanjaard #include "opt_ata.h"
30c1b3d7c5SThomas E. Spanjaard 
31c1b3d7c5SThomas E. Spanjaard #include <sys/param.h>
32c1b3d7c5SThomas E. Spanjaard #include <sys/bus.h>
33c1b3d7c5SThomas E. Spanjaard #include <sys/bus_dma.h>
34c1b3d7c5SThomas E. Spanjaard #include <sys/bus_resource.h>
35c1b3d7c5SThomas E. Spanjaard #include <sys/callout.h>
36c1b3d7c5SThomas E. Spanjaard #include <sys/endian.h>
37c1b3d7c5SThomas E. Spanjaard #include <sys/libkern.h>
38c1b3d7c5SThomas E. Spanjaard #include <sys/malloc.h>
39c1b3d7c5SThomas E. Spanjaard #include <sys/nata.h>
40c1b3d7c5SThomas E. Spanjaard #include <sys/queue.h>
41c1b3d7c5SThomas E. Spanjaard #include <sys/rman.h>
42c1b3d7c5SThomas E. Spanjaard #include <sys/systm.h>
43c1b3d7c5SThomas E. Spanjaard #include <sys/taskqueue.h>
44b47b3275SSepherosa Ziehau #include <sys/machintr.h>
45c1b3d7c5SThomas E. Spanjaard 
46c1b3d7c5SThomas E. Spanjaard #include <machine/bus_dma.h>
47c1b3d7c5SThomas E. Spanjaard 
48c1b3d7c5SThomas E. Spanjaard #include <bus/pci/pcireg.h>
49c1b3d7c5SThomas E. Spanjaard #include <bus/pci/pcivar.h>
50c1b3d7c5SThomas E. Spanjaard 
51c1b3d7c5SThomas E. Spanjaard #include "ata-all.h"
52c1b3d7c5SThomas E. Spanjaard #include "ata-pci.h"
53c1b3d7c5SThomas E. Spanjaard #include "ata_if.h"
54c1b3d7c5SThomas E. Spanjaard 
55d7ac09b9Szrj /* ATA_NO_SMTH helper */
56d7ac09b9Szrj #define ATA_IDENT_DUMMY(name) int ata_ ## name ## _ident	\
57d7ac09b9Szrj 				(device_t x __unused){return 1;}
58d7ac09b9Szrj 
59c1b3d7c5SThomas E. Spanjaard /* local prototypes */
60c1b3d7c5SThomas E. Spanjaard /* ata-chipset.c */
61c1b3d7c5SThomas E. Spanjaard static int ata_generic_chipinit(device_t dev);
62c1b3d7c5SThomas E. Spanjaard static void ata_generic_setmode(device_t dev, int mode);
63a1917f14Szrj 
64d7ac09b9Szrj #if !defined(ATA_NO_AHCI)
65a1917f14Szrj /* used by ata-{ahci,acerlabs,ati,intel,jmicron,via}.c */
66c1b3d7c5SThomas E. Spanjaard static int ata_ahci_chipinit(device_t dev);
67a1917f14Szrj 
68a1917f14Szrj /* used by ata-ahci.c and ata-jmicron.c */
69c1b3d7c5SThomas E. Spanjaard static int ata_ahci_allocate(device_t dev);
70c1b3d7c5SThomas E. Spanjaard static void ata_ahci_dmainit(device_t dev);
71a1917f14Szrj static void ata_ahci_reset(device_t dev);
72d7ac09b9Szrj #endif
73a1917f14Szrj 
74*878a3234Szrj #if !defined(ATA_NO_MARVELL)
75*878a3234Szrj /* ata-adaptec.c depends on ata-marwell.c */
76*878a3234Szrj static int ata_marvell_edma_chipinit(device_t dev);
77*878a3234Szrj #endif
78*878a3234Szrj 
79d7ac09b9Szrj #if !defined(ATA_NO_SILICONIMAGE)
80a1917f14Szrj /* ata-ati.c depends on ata-siliconimage.c */
81a1917f14Szrj /* used by ata-ati.c and ata-siliconimage.c */
82a1917f14Szrj static int ata_sii_chipinit(device_t dev);
83d7ac09b9Szrj #endif
84a1917f14Szrj 
85a1917f14Szrj 
86a1917f14Szrj /*
87d7ac09b9Szrj  * ahci capable chipset support functions (needed for some vendor chipsets)
88a1917f14Szrj  */
89d7ac09b9Szrj #if !defined(ATA_NO_AHCI)
90a1917f14Szrj #include "chipsets/ata-ahci.c"
91d7ac09b9Szrj #else
ATA_IDENT_DUMMY(ahci)92d7ac09b9Szrj ATA_IDENT_DUMMY(ahci)
93d7ac09b9Szrj #endif
94a1917f14Szrj 
95a1917f14Szrj /*
96a1917f14Szrj  * various vendor specific chipset support functions
97a1917f14Szrj  */
98d7ac09b9Szrj #if !defined(ATA_NO_ACARD)
99a1917f14Szrj #include "chipsets/ata-acard.c"
100d7ac09b9Szrj #else
101d7ac09b9Szrj ATA_IDENT_DUMMY(acard)
102d7ac09b9Szrj #endif
103d7ac09b9Szrj 
104d7ac09b9Szrj #if !defined(ATA_NO_ACERLABS) && !defined(ATA_NO_AHCI)
105a1917f14Szrj #include "chipsets/ata-acerlabs.c"
106d7ac09b9Szrj #else
107d7ac09b9Szrj ATA_IDENT_DUMMY(ali)
108d7ac09b9Szrj #endif
109d7ac09b9Szrj 
110d7ac09b9Szrj #if !defined(ATA_NO_AMD)
111a1917f14Szrj #include "chipsets/ata-amd.c"
112d7ac09b9Szrj #else
113d7ac09b9Szrj ATA_IDENT_DUMMY(amd)
114d7ac09b9Szrj #endif
115d7ac09b9Szrj 
116d7ac09b9Szrj #if !defined(ATA_NO_AHCI) && !defined(ATA_NO_SILICONIMAGE)
117a1917f14Szrj #include "chipsets/ata-ati.c"
118d7ac09b9Szrj #else
119d7ac09b9Szrj ATA_IDENT_DUMMY(ati)
120d7ac09b9Szrj #endif
121d7ac09b9Szrj 
122d7ac09b9Szrj #if !defined(ATA_NO_CYPRESS)
123a1917f14Szrj #include "chipsets/ata-cypress.c"
124d7ac09b9Szrj #else
125d7ac09b9Szrj ATA_IDENT_DUMMY(cypress)
126d7ac09b9Szrj #endif
127d7ac09b9Szrj 
128d7ac09b9Szrj #if !defined(ATA_NO_CYRIX)
129a1917f14Szrj #include "chipsets/ata-cyrix.c"
130d7ac09b9Szrj #else
131d7ac09b9Szrj ATA_IDENT_DUMMY(cyrix)
132d7ac09b9Szrj #endif
133d7ac09b9Szrj 
134d7ac09b9Szrj #if !defined(ATA_NO_HIGHPOINT)
135a1917f14Szrj #include "chipsets/ata-highpoint.c"
136d7ac09b9Szrj #else
137d7ac09b9Szrj ATA_IDENT_DUMMY(highpoint)
138d7ac09b9Szrj #endif
139d7ac09b9Szrj 
140d7ac09b9Szrj #if !defined(ATA_NO_INTEL) && !defined(ATA_NO_AHCI)
141a1917f14Szrj #include "chipsets/ata-intel.c"
142d7ac09b9Szrj #else
143d7ac09b9Szrj ATA_IDENT_DUMMY(intel)
144d7ac09b9Szrj #endif
145d7ac09b9Szrj 
146d7ac09b9Szrj #if !defined(ATA_NO_ITE)
147a1917f14Szrj #include "chipsets/ata-ite.c"
148d7ac09b9Szrj #else
149d7ac09b9Szrj ATA_IDENT_DUMMY(ite)
150d7ac09b9Szrj #endif
151d7ac09b9Szrj 
152d7ac09b9Szrj #if !defined(ATA_NO_JMICRON) && !defined(ATA_NO_AHCI)
153a1917f14Szrj #include "chipsets/ata-jmicron.c"
154d7ac09b9Szrj #else
155d7ac09b9Szrj ATA_IDENT_DUMMY(jmicron)
156d7ac09b9Szrj #endif
157d7ac09b9Szrj 
158d7ac09b9Szrj #if !defined(ATA_NO_MARVELL)
159*878a3234Szrj #include "chipsets/ata-adaptec.c"
160a1917f14Szrj #include "chipsets/ata-marvell.c"
161d7ac09b9Szrj #else
162*878a3234Szrj ATA_IDENT_DUMMY(adaptec)
163d7ac09b9Szrj ATA_IDENT_DUMMY(marvell)
164d7ac09b9Szrj #endif
165d7ac09b9Szrj 
166d7ac09b9Szrj #if !defined(ATA_NO_NATIONAL)
167a1917f14Szrj #include "chipsets/ata-national.c"
168d7ac09b9Szrj #else
169d7ac09b9Szrj ATA_IDENT_DUMMY(national)
170d7ac09b9Szrj #endif
171d7ac09b9Szrj 
172d7ac09b9Szrj #if !defined(ATA_NO_NETCELL)
173a1917f14Szrj #include "chipsets/ata-netcell.c"
174d7ac09b9Szrj #else
175d7ac09b9Szrj ATA_IDENT_DUMMY(netcell)
176d7ac09b9Szrj #endif
177d7ac09b9Szrj 
178d7ac09b9Szrj #if !defined(ATA_NO_NVIDIA)
179a1917f14Szrj #include "chipsets/ata-nvidia.c"
180d7ac09b9Szrj #else
181d7ac09b9Szrj ATA_IDENT_DUMMY(nvidia)
182d7ac09b9Szrj #endif
183d7ac09b9Szrj 
184d7ac09b9Szrj #if !defined(ATA_NO_PROMISE)
185a1917f14Szrj #include "chipsets/ata-promise.c"
186d7ac09b9Szrj #else
187d7ac09b9Szrj ATA_IDENT_DUMMY(promise)
188d7ac09b9Szrj #endif
189d7ac09b9Szrj 
190d7ac09b9Szrj #if !defined(ATA_NO_SERVERWORKS)
191a1917f14Szrj #include "chipsets/ata-serverworks.c"
192d7ac09b9Szrj #else
193d7ac09b9Szrj ATA_IDENT_DUMMY(serverworks)
194d7ac09b9Szrj #endif
195d7ac09b9Szrj 
196d7ac09b9Szrj #if !defined(ATA_NO_SILICONIMAGE)
197a1917f14Szrj #include "chipsets/ata-siliconimage.c"
198d7ac09b9Szrj #else
199d7ac09b9Szrj ATA_IDENT_DUMMY(sii)
200d7ac09b9Szrj #endif
201d7ac09b9Szrj 
202d7ac09b9Szrj #if !defined(ATA_NO_SIS)
203a1917f14Szrj #include "chipsets/ata-sis.c"
204d7ac09b9Szrj #else
205d7ac09b9Szrj ATA_IDENT_DUMMY(sis)
206d7ac09b9Szrj #endif
207d7ac09b9Szrj 
208d7ac09b9Szrj #if !defined(ATA_NO_VIA) && !defined(ATA_NO_AHCI)
209a1917f14Szrj #include "chipsets/ata-via.c"
210d7ac09b9Szrj #else
211d7ac09b9Szrj ATA_IDENT_DUMMY(via)
212d7ac09b9Szrj #endif
213c1b3d7c5SThomas E. Spanjaard 
214c1b3d7c5SThomas E. Spanjaard /*
215*878a3234Szrj  * various vendor specific chipset support functions based on generic ATA
216*878a3234Szrj  */
217*878a3234Szrj 
218*878a3234Szrj #include "chipsets/ata-cenatek.c"
219*878a3234Szrj #include "chipsets/ata-micron.c"
220*878a3234Szrj 
221*878a3234Szrj /*
222c1b3d7c5SThomas E. Spanjaard  * generic ATA support functions
223c1b3d7c5SThomas E. Spanjaard  */
224c1b3d7c5SThomas E. Spanjaard int
225c1b3d7c5SThomas E. Spanjaard ata_generic_ident(device_t dev)
226c1b3d7c5SThomas E. Spanjaard {
227c1b3d7c5SThomas E. Spanjaard     struct ata_pci_controller *ctlr = device_get_softc(dev);
2283ec9ecbcSMatthew Dillon     char buffer[64];
229c1b3d7c5SThomas E. Spanjaard 
2303ec9ecbcSMatthew Dillon     ksnprintf(buffer, sizeof(buffer),
2313ec9ecbcSMatthew Dillon 	      "%s ATA controller", ata_pcivendor2str(dev));
2323ec9ecbcSMatthew Dillon     device_set_desc_copy(dev, buffer);
233c1b3d7c5SThomas E. Spanjaard     ctlr->chipinit = ata_generic_chipinit;
234c1b3d7c5SThomas E. Spanjaard     return 0;
235c1b3d7c5SThomas E. Spanjaard }
236c1b3d7c5SThomas E. Spanjaard 
237c1b3d7c5SThomas E. Spanjaard static int
ata_generic_chipinit(device_t dev)238c1b3d7c5SThomas E. Spanjaard ata_generic_chipinit(device_t dev)
239c1b3d7c5SThomas E. Spanjaard {
240c1b3d7c5SThomas E. Spanjaard     struct ata_pci_controller *ctlr = device_get_softc(dev);
241c1b3d7c5SThomas E. Spanjaard 
24243156ad7Szrj     if (ata_setup_interrupt(dev, ata_generic_intr))
243c1b3d7c5SThomas E. Spanjaard 	return ENXIO;
244c1b3d7c5SThomas E. Spanjaard     ctlr->setmode = ata_generic_setmode;
245c1b3d7c5SThomas E. Spanjaard     return 0;
246c1b3d7c5SThomas E. Spanjaard }
247c1b3d7c5SThomas E. Spanjaard 
248c1b3d7c5SThomas E. Spanjaard static void
ata_generic_setmode(device_t dev,int mode)249c1b3d7c5SThomas E. Spanjaard ata_generic_setmode(device_t dev, int mode)
250c1b3d7c5SThomas E. Spanjaard {
251c1b3d7c5SThomas E. Spanjaard     struct ata_device *atadev = device_get_softc(dev);
252c1b3d7c5SThomas E. Spanjaard 
253c1b3d7c5SThomas E. Spanjaard     mode = ata_limit_mode(dev, mode, ATA_UDMA2);
254c1b3d7c5SThomas E. Spanjaard     mode = ata_check_80pin(dev, mode);
255c1b3d7c5SThomas E. Spanjaard     if (!ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode))
256c1b3d7c5SThomas E. Spanjaard 	atadev->mode = mode;
257c1b3d7c5SThomas E. Spanjaard }
258