Annotation of sys/dev/pci/pciide.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: pciide.c,v 1.272 2007/07/02 14:01:14 dlg Exp $ */
2: /* $NetBSD: pciide.c,v 1.127 2001/08/03 01:31:08 tsutsui Exp $ */
3:
4: /*
5: * Copyright (c) 1999, 2000, 2001 Manuel Bouyer.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
15: * 3. All advertising materials mentioning features or use of this software
16: * must display the following acknowledgement:
17: * This product includes software developed by Manuel Bouyer.
18: * 4. Neither the name of the University nor the names of its contributors
19: * may be used to endorse or promote products derived from this software
20: * without specific prior written permission.
21: *
22: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32: *
33: */
34:
35: /*
36: * Copyright (c) 1996, 1998 Christopher G. Demetriou. All rights reserved.
37: *
38: * Redistribution and use in source and binary forms, with or without
39: * modification, are permitted provided that the following conditions
40: * are met:
41: * 1. Redistributions of source code must retain the above copyright
42: * notice, this list of conditions and the following disclaimer.
43: * 2. Redistributions in binary form must reproduce the above copyright
44: * notice, this list of conditions and the following disclaimer in the
45: * documentation and/or other materials provided with the distribution.
46: * 3. All advertising materials mentioning features or use of this software
47: * must display the following acknowledgement:
48: * This product includes software developed by Christopher G. Demetriou
49: * for the NetBSD Project.
50: * 4. The name of the author may not be used to endorse or promote products
51: * derived from this software without specific prior written permission
52: *
53: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
54: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
55: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
56: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
57: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
58: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
59: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
60: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
61: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
62: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
63: */
64:
65: /*
66: * PCI IDE controller driver.
67: *
68: * Author: Christopher G. Demetriou, March 2, 1998 (derived from NetBSD
69: * sys/dev/pci/ppb.c, revision 1.16).
70: *
71: * See "PCI IDE Controller Specification, Revision 1.0 3/4/94" and
72: * "Programming Interface for Bus Master IDE Controller, Revision 1.0
73: * 5/16/94" from the PCI SIG.
74: *
75: */
76:
77: #define DEBUG_DMA 0x01
78: #define DEBUG_XFERS 0x02
79: #define DEBUG_FUNCS 0x08
80: #define DEBUG_PROBE 0x10
81:
82: #ifdef WDCDEBUG
83: #ifndef WDCDEBUG_PCIIDE_MASK
84: #define WDCDEBUG_PCIIDE_MASK 0x00
85: #endif
86: int wdcdebug_pciide_mask = WDCDEBUG_PCIIDE_MASK;
87: #define WDCDEBUG_PRINT(args, level) do { \
88: if ((wdcdebug_pciide_mask & (level)) != 0) \
89: printf args; \
90: } while (0)
91: #else
92: #define WDCDEBUG_PRINT(args, level)
93: #endif
94: #include <sys/param.h>
95: #include <sys/systm.h>
96: #include <sys/device.h>
97: #include <sys/malloc.h>
98:
99: #include <machine/bus.h>
100: #include <machine/endian.h>
101:
102: #include <dev/ata/atavar.h>
103: #include <dev/ata/satareg.h>
104: #include <dev/ic/wdcreg.h>
105: #include <dev/ic/wdcvar.h>
106:
107: #include <dev/pci/pcireg.h>
108: #include <dev/pci/pcivar.h>
109: #include <dev/pci/pcidevs.h>
110:
111: #if defined(SMALL_KERNEL)
112: #define INLINE
113: #else
114: #define INLINE __inline
115: #endif
116:
117: #include <dev/pci/pciidereg.h>
118: #include <dev/pci/pciidevar.h>
119: #include <dev/pci/pciide_piix_reg.h>
120: #include <dev/pci/pciide_amd_reg.h>
121: #include <dev/pci/pciide_apollo_reg.h>
122: #include <dev/pci/pciide_cmd_reg.h>
123: #include <dev/pci/pciide_sii3112_reg.h>
124: #include <dev/pci/pciide_cy693_reg.h>
125: #include <dev/pci/pciide_sis_reg.h>
126: #include <dev/pci/pciide_acer_reg.h>
127: #include <dev/pci/pciide_pdc202xx_reg.h>
128: #include <dev/pci/pciide_opti_reg.h>
129: #include <dev/pci/pciide_hpt_reg.h>
130: #include <dev/pci/pciide_acard_reg.h>
131: #include <dev/pci/pciide_natsemi_reg.h>
132: #include <dev/pci/pciide_nforce_reg.h>
133: #include <dev/pci/pciide_i31244_reg.h>
134: #include <dev/pci/pciide_ite_reg.h>
135: #include <dev/pci/pciide_ixp_reg.h>
136: #include <dev/pci/pciide_svwsata_reg.h>
137: #include <dev/pci/pciide_jmicron_reg.h>
138: #include <dev/pci/cy82c693var.h>
139:
140: /* inlines for reading/writing 8-bit PCI registers */
141:
142: static INLINE u_int8_t pciide_pci_read(pci_chipset_tag_t, pcitag_t,
143: int);
144: static INLINE void pciide_pci_write(pci_chipset_tag_t, pcitag_t,
145: int, u_int8_t);
146:
147: static INLINE u_int8_t
148: pciide_pci_read(pci_chipset_tag_t pc, pcitag_t pa, int reg)
149: {
150: return (pci_conf_read(pc, pa, (reg & ~0x03)) >>
151: ((reg & 0x03) * 8) & 0xff);
152: }
153:
154: static INLINE void
155: pciide_pci_write(pci_chipset_tag_t pc, pcitag_t pa, int reg, u_int8_t val)
156: {
157: pcireg_t pcival;
158:
159: pcival = pci_conf_read(pc, pa, (reg & ~0x03));
160: pcival &= ~(0xff << ((reg & 0x03) * 8));
161: pcival |= (val << ((reg & 0x03) * 8));
162: pci_conf_write(pc, pa, (reg & ~0x03), pcival);
163: }
164:
165: void default_chip_map(struct pciide_softc *, struct pci_attach_args *);
166:
167: void sata_chip_map(struct pciide_softc *, struct pci_attach_args *);
168: void sata_setup_channel(struct channel_softc *);
169:
170: void piix_chip_map(struct pciide_softc *, struct pci_attach_args *);
171: void piixsata_chip_map(struct pciide_softc *, struct pci_attach_args *);
172: void piix_setup_channel(struct channel_softc *);
173: void piix3_4_setup_channel(struct channel_softc *);
174: void piix_timing_debug(struct pciide_softc *);
175:
176: static u_int32_t piix_setup_idetim_timings(u_int8_t, u_int8_t, u_int8_t);
177: static u_int32_t piix_setup_idetim_drvs(struct ata_drive_datas *);
178: static u_int32_t piix_setup_sidetim_timings(u_int8_t, u_int8_t, u_int8_t);
179:
180: void amd756_chip_map(struct pciide_softc *, struct pci_attach_args *);
181: void amd756_setup_channel(struct channel_softc *);
182:
183: void apollo_chip_map(struct pciide_softc *, struct pci_attach_args *);
184: void apollo_setup_channel(struct channel_softc *);
185:
186: void cmd_chip_map(struct pciide_softc *, struct pci_attach_args *);
187: void cmd0643_9_chip_map(struct pciide_softc *, struct pci_attach_args *);
188: void cmd0643_9_setup_channel(struct channel_softc *);
189: void cmd680_chip_map(struct pciide_softc *, struct pci_attach_args *);
190: void cmd680_setup_channel(struct channel_softc *);
191: void cmd680_channel_map(struct pci_attach_args *, struct pciide_softc *, int);
192: void cmd_channel_map(struct pci_attach_args *,
193: struct pciide_softc *, int);
194: int cmd_pci_intr(void *);
195: void cmd646_9_irqack(struct channel_softc *);
196:
197: void sii_fixup_cacheline(struct pciide_softc *, struct pci_attach_args *);
198: void sii3112_chip_map(struct pciide_softc *, struct pci_attach_args *);
199: void sii3112_setup_channel(struct channel_softc *);
200: void sii3112_drv_probe(struct channel_softc *);
201: void sii3114_chip_map(struct pciide_softc *, struct pci_attach_args *);
202: void sii3114_mapreg_dma(struct pciide_softc *, struct pci_attach_args *);
203: int sii3114_chansetup(struct pciide_softc *, int);
204: void sii3114_mapchan(struct pciide_channel *);
205: u_int8_t sii3114_dmacmd_read(struct pciide_softc *, int);
206: void sii3114_dmacmd_write(struct pciide_softc *, int, u_int8_t);
207: u_int8_t sii3114_dmactl_read(struct pciide_softc *, int);
208: void sii3114_dmactl_write(struct pciide_softc *, int, u_int8_t);
209: void sii3114_dmatbl_write(struct pciide_softc *, int, u_int32_t);
210:
211: void cy693_chip_map(struct pciide_softc *, struct pci_attach_args *);
212: void cy693_setup_channel(struct channel_softc *);
213:
214: void sis_chip_map(struct pciide_softc *, struct pci_attach_args *);
215: void sis_setup_channel(struct channel_softc *);
216: void sis96x_setup_channel(struct channel_softc *);
217: int sis_hostbr_match(struct pci_attach_args *);
218: int sis_south_match(struct pci_attach_args *);
219:
220: void natsemi_chip_map(struct pciide_softc *, struct pci_attach_args *);
221: void natsemi_setup_channel(struct channel_softc *);
222: int natsemi_pci_intr(void *);
223: void natsemi_irqack(struct channel_softc *);
224: void ns_scx200_chip_map(struct pciide_softc *, struct pci_attach_args *);
225: void ns_scx200_setup_channel(struct channel_softc *);
226:
227: void acer_chip_map(struct pciide_softc *, struct pci_attach_args *);
228: void acer_setup_channel(struct channel_softc *);
229: int acer_pci_intr(void *);
230:
231: void pdc202xx_chip_map(struct pciide_softc *, struct pci_attach_args *);
232: void pdc202xx_setup_channel(struct channel_softc *);
233: void pdc20268_setup_channel(struct channel_softc *);
234: int pdc202xx_pci_intr(void *);
235: int pdc20265_pci_intr(void *);
236: void pdc20262_dma_start(void *, int, int);
237: int pdc20262_dma_finish(void *, int, int, int);
238:
239: void pdcsata_chip_map(struct pciide_softc *, struct pci_attach_args *);
240: void pdc203xx_setup_channel(struct channel_softc *);
241: int pdc203xx_pci_intr(void *);
242: void pdc203xx_irqack(struct channel_softc *);
243: void pdc203xx_dma_start(void *,int ,int);
244: int pdc203xx_dma_finish(void *, int, int, int);
245: int pdc205xx_pci_intr(void *);
246: void pdc205xx_do_reset(struct channel_softc *);
247: void pdc205xx_drv_probe(struct channel_softc *);
248:
249: void opti_chip_map(struct pciide_softc *, struct pci_attach_args *);
250: void opti_setup_channel(struct channel_softc *);
251:
252: void hpt_chip_map(struct pciide_softc *, struct pci_attach_args *);
253: void hpt_setup_channel(struct channel_softc *);
254: int hpt_pci_intr(void *);
255:
256: void acard_chip_map(struct pciide_softc *, struct pci_attach_args *);
257: void acard_setup_channel(struct channel_softc *);
258:
259: void serverworks_chip_map(struct pciide_softc *, struct pci_attach_args *);
260: void serverworks_setup_channel(struct channel_softc *);
261: int serverworks_pci_intr(void *);
262:
263: void svwsata_chip_map(struct pciide_softc *, struct pci_attach_args *);
264: void svwsata_mapreg_dma(struct pciide_softc *, struct pci_attach_args *);
265: void svwsata_mapchan(struct pciide_channel *);
266: u_int8_t svwsata_dmacmd_read(struct pciide_softc *, int);
267: void svwsata_dmacmd_write(struct pciide_softc *, int, u_int8_t);
268: u_int8_t svwsata_dmactl_read(struct pciide_softc *, int);
269: void svwsata_dmactl_write(struct pciide_softc *, int, u_int8_t);
270: void svwsata_dmatbl_write(struct pciide_softc *, int, u_int32_t);
271: void svwsata_drv_probe(struct channel_softc *);
272:
273: void nforce_chip_map(struct pciide_softc *, struct pci_attach_args *);
274: void nforce_setup_channel(struct channel_softc *);
275: int nforce_pci_intr(void *);
276:
277: void artisea_chip_map(struct pciide_softc *, struct pci_attach_args *);
278:
279: void ite_chip_map(struct pciide_softc *, struct pci_attach_args *);
280: void ite_setup_channel(struct channel_softc *);
281:
282: void ixp_chip_map(struct pciide_softc *, struct pci_attach_args *);
283: void ixp_setup_channel(struct channel_softc *);
284:
285: void jmicron_chip_map(struct pciide_softc *, struct pci_attach_args *);
286: void jmicron_setup_channel(struct channel_softc *);
287:
288: u_int8_t pciide_dmacmd_read(struct pciide_softc *, int);
289: void pciide_dmacmd_write(struct pciide_softc *, int, u_int8_t);
290: u_int8_t pciide_dmactl_read(struct pciide_softc *, int);
291: void pciide_dmactl_write(struct pciide_softc *, int, u_int8_t);
292: void pciide_dmatbl_write(struct pciide_softc *, int, u_int32_t);
293:
294: void pciide_channel_dma_setup(struct pciide_channel *);
295: int pciide_dma_table_setup(struct pciide_softc *, int, int);
296: int pciide_dma_init(void *, int, int, void *, size_t, int);
297: void pciide_dma_start(void *, int, int);
298: int pciide_dma_finish(void *, int, int, int);
299: void pciide_irqack(struct channel_softc *);
300: void pciide_print_modes(struct pciide_channel *);
301: void pciide_print_channels(int, pcireg_t);
302:
303: struct pciide_product_desc {
304: u_int32_t ide_product;
305: u_short ide_flags;
306: /* map and setup chip, probe drives */
307: void (*chip_map)(struct pciide_softc *, struct pci_attach_args *);
308: };
309:
310: /* Flags for ide_flags */
311: #define IDE_PCI_CLASS_OVERRIDE 0x0001 /* accept even if class != pciide */
312: #define IDE_16BIT_IOSPACE 0x0002 /* I/O space BARS ignore upper word */
313:
314: /* Default product description for devices not known from this controller */
315: const struct pciide_product_desc default_product_desc = {
316: 0, /* Generic PCI IDE controller */
317: 0,
318: default_chip_map
319: };
320:
321: const struct pciide_product_desc pciide_intel_products[] = {
322: { PCI_PRODUCT_INTEL_31244, /* Intel 31244 SATA */
323: 0,
324: artisea_chip_map
325: },
326: { PCI_PRODUCT_INTEL_82092AA, /* Intel 82092AA IDE */
327: 0,
328: default_chip_map
329: },
330: { PCI_PRODUCT_INTEL_82371FB_IDE, /* Intel 82371FB IDE (PIIX) */
331: 0,
332: piix_chip_map
333: },
334: { PCI_PRODUCT_INTEL_82371FB_ISA, /* Intel 82371FB IDE (PIIX) */
335: 0,
336: piix_chip_map
337: },
338: { PCI_PRODUCT_INTEL_82372FB_IDE, /* Intel 82372FB IDE (PIIX4) */
339: 0,
340: piix_chip_map
341: },
342: { PCI_PRODUCT_INTEL_82371SB_IDE, /* Intel 82371SB IDE (PIIX3) */
343: 0,
344: piix_chip_map
345: },
346: { PCI_PRODUCT_INTEL_82371AB_IDE, /* Intel 82371AB IDE (PIIX4) */
347: 0,
348: piix_chip_map
349: },
350: { PCI_PRODUCT_INTEL_82371MX, /* Intel 82371MX IDE */
351: 0,
352: piix_chip_map
353: },
354: { PCI_PRODUCT_INTEL_82440MX_IDE, /* Intel 82440MX IDE */
355: 0,
356: piix_chip_map
357: },
358: { PCI_PRODUCT_INTEL_82451NX, /* Intel 82451NX (PIIX4) IDE */
359: 0,
360: piix_chip_map
361: },
362: { PCI_PRODUCT_INTEL_82801AA_IDE, /* Intel 82801AA IDE (ICH) */
363: 0,
364: piix_chip_map
365: },
366: { PCI_PRODUCT_INTEL_82801AB_IDE, /* Intel 82801AB IDE (ICH0) */
367: 0,
368: piix_chip_map
369: },
370: { PCI_PRODUCT_INTEL_82801BAM_IDE, /* Intel 82801BAM IDE (ICH2) */
371: 0,
372: piix_chip_map
373: },
374: { PCI_PRODUCT_INTEL_82801BA_IDE, /* Intel 82801BA IDE (ICH2) */
375: 0,
376: piix_chip_map
377: },
378: { PCI_PRODUCT_INTEL_82801CAM_IDE, /* Intel 82801CAM IDE (ICH3) */
379: 0,
380: piix_chip_map
381: },
382: { PCI_PRODUCT_INTEL_82801CA_IDE, /* Intel 82801CA IDE (ICH3) */
383: 0,
384: piix_chip_map
385: },
386: { PCI_PRODUCT_INTEL_82801DB_IDE, /* Intel 82801DB IDE (ICH4) */
387: 0,
388: piix_chip_map
389: },
390: { PCI_PRODUCT_INTEL_82801DBL_IDE, /* Intel 82801DBL IDE (ICH4-L) */
391: 0,
392: piix_chip_map
393: },
394: { PCI_PRODUCT_INTEL_82801DBM_IDE, /* Intel 82801DBM IDE (ICH4-M) */
395: 0,
396: piix_chip_map
397: },
398: { PCI_PRODUCT_INTEL_82801EB_IDE, /* Intel 82801EB/ER (ICH5/5R) IDE */
399: 0,
400: piix_chip_map
401: },
402: { PCI_PRODUCT_INTEL_82801EB_SATA, /* Intel 82801EB (ICH5) SATA */
403: 0,
404: piixsata_chip_map
405: },
406: { PCI_PRODUCT_INTEL_82801ER_SATA, /* Intel 82801ER (ICH5R) SATA */
407: IDE_PCI_CLASS_OVERRIDE,
408: piixsata_chip_map
409: },
410: { PCI_PRODUCT_INTEL_6300ESB_IDE, /* Intel 6300ESB IDE */
411: IDE_PCI_CLASS_OVERRIDE,
412: piix_chip_map
413: },
414: { PCI_PRODUCT_INTEL_6300ESB_SATA, /* Intel 6300ESB SATA */
415: IDE_PCI_CLASS_OVERRIDE,
416: piixsata_chip_map
417: },
418: { PCI_PRODUCT_INTEL_6300ESB_SATA2, /* Intel 6300ESB SATA */
419: IDE_PCI_CLASS_OVERRIDE,
420: piixsata_chip_map
421: },
422: { PCI_PRODUCT_INTEL_6321ESB_IDE, /* Intel 6321ESB IDE */
423: IDE_PCI_CLASS_OVERRIDE,
424: piix_chip_map
425: },
426: { PCI_PRODUCT_INTEL_82801FB_IDE, /* Intel 82801FB (ICH6) IDE */
427: IDE_PCI_CLASS_OVERRIDE,
428: piix_chip_map
429: },
430: { PCI_PRODUCT_INTEL_82801FBM_SATA, /* Intel 82801FBM (ICH6M) SATA */
431: IDE_PCI_CLASS_OVERRIDE,
432: piixsata_chip_map
433: },
434: { PCI_PRODUCT_INTEL_82801FB_SATA, /* Intel 82801FB (ICH6) SATA */
435: IDE_PCI_CLASS_OVERRIDE,
436: piixsata_chip_map
437: },
438: { PCI_PRODUCT_INTEL_82801FR_SATA, /* Intel 82801FR (ICH6R) SATA */
439: IDE_PCI_CLASS_OVERRIDE,
440: piixsata_chip_map
441: },
442: { PCI_PRODUCT_INTEL_82801GB_IDE, /* Intel 82801GB (ICH7) IDE */
443: IDE_PCI_CLASS_OVERRIDE,
444: piix_chip_map
445: },
446: { PCI_PRODUCT_INTEL_82801GB_SATA, /* Intel 82801GB (ICH7) SATA */
447: IDE_PCI_CLASS_OVERRIDE,
448: piixsata_chip_map
449: },
450: { PCI_PRODUCT_INTEL_82801GR_SATA, /* Intel 82801GR (ICH7R) SATA */
451: IDE_PCI_CLASS_OVERRIDE,
452: piixsata_chip_map
453: },
454: { PCI_PRODUCT_INTEL_82801GR_AHCI, /* Intel 82801GR (ICH7R) AHCI */
455: IDE_PCI_CLASS_OVERRIDE,
456: piixsata_chip_map
457: },
458: { PCI_PRODUCT_INTEL_82801GBM_SATA, /* Intel 82801GBM (ICH7M) SATA */
459: IDE_PCI_CLASS_OVERRIDE,
460: piixsata_chip_map
461: },
462: { PCI_PRODUCT_INTEL_82801GBM_AHCI, /* Intel 82801GBM (ICH7M) AHCI */
463: IDE_PCI_CLASS_OVERRIDE,
464: piixsata_chip_map
465: },
466: { PCI_PRODUCT_INTEL_82801GHM_RAID, /* Intel 82801GHM (ICH7-M DH) SATA */
467: IDE_PCI_CLASS_OVERRIDE,
468: piixsata_chip_map
469: },
470: { PCI_PRODUCT_INTEL_82801H_SATA_1_6P, /* Intel 82801H (ICH8) SATA */
471: IDE_PCI_CLASS_OVERRIDE,
472: piixsata_chip_map
473: },
474: { PCI_PRODUCT_INTEL_82801H_AHCI, /* Intel 82801H (ICH8) AHCI */
475: IDE_PCI_CLASS_OVERRIDE,
476: piixsata_chip_map
477: },
478: { PCI_PRODUCT_INTEL_82801H_RAID, /* Intel 82801H (ICH8) SATA */
479: IDE_PCI_CLASS_OVERRIDE,
480: piixsata_chip_map
481: },
482: { PCI_PRODUCT_INTEL_82801H_SATA_1_4P, /* Intel 82801H (ICH8) SATA */
483: IDE_PCI_CLASS_OVERRIDE,
484: piixsata_chip_map
485: },
486: { PCI_PRODUCT_INTEL_82801H_SATA_2, /* Intel 82801H (ICH8) SATA */
487: IDE_PCI_CLASS_OVERRIDE,
488: piixsata_chip_map
489: },
490: { PCI_PRODUCT_INTEL_82801HBM_SATA_1, /* Intel 82801HBM (ICH8M) SATA */
491: IDE_PCI_CLASS_OVERRIDE,
492: piixsata_chip_map
493: },
494: { PCI_PRODUCT_INTEL_82801HBM_SATA_2, /* Intel 82801HBM (ICH8M) SATA */
495: IDE_PCI_CLASS_OVERRIDE,
496: piixsata_chip_map
497: },
498: { PCI_PRODUCT_INTEL_82801HBM_IDE, /* Intel 82801HBM (ICH8M) IDE */
499: 0,
500: piix_chip_map
501: },
502: { PCI_PRODUCT_INTEL_6321ESB_SATA, /* Intel 6321ESB SATA */
503: 0,
504: piixsata_chip_map
505: }
506: };
507:
508: const struct pciide_product_desc pciide_amd_products[] = {
509: { PCI_PRODUCT_AMD_PBC756_IDE, /* AMD 756 */
510: 0,
511: amd756_chip_map
512: },
513: { PCI_PRODUCT_AMD_766_IDE, /* AMD 766 */
514: 0,
515: amd756_chip_map
516: },
517: { PCI_PRODUCT_AMD_PBC768_IDE,
518: 0,
519: amd756_chip_map
520: },
521: { PCI_PRODUCT_AMD_8111_IDE,
522: 0,
523: amd756_chip_map
524: },
525: { PCI_PRODUCT_AMD_CS5536_IDE,
526: 0,
527: amd756_chip_map
528: }
529: };
530:
531: #ifdef notyet
532: const struct pciide_product_desc pciide_opti_products[] = {
533:
534: { PCI_PRODUCT_OPTI_82C621,
535: 0,
536: opti_chip_map
537: },
538: { PCI_PRODUCT_OPTI_82C568,
539: 0,
540: opti_chip_map
541: },
542: { PCI_PRODUCT_OPTI_82D568,
543: 0,
544: opti_chip_map
545: }
546: };
547: #endif
548:
549: const struct pciide_product_desc pciide_cmd_products[] = {
550: { PCI_PRODUCT_CMDTECH_640, /* CMD Technology PCI0640 */
551: 0,
552: cmd_chip_map
553: },
554: { PCI_PRODUCT_CMDTECH_643, /* CMD Technology PCI0643 */
555: 0,
556: cmd0643_9_chip_map
557: },
558: { PCI_PRODUCT_CMDTECH_646, /* CMD Technology PCI0646 */
559: 0,
560: cmd0643_9_chip_map
561: },
562: { PCI_PRODUCT_CMDTECH_648, /* CMD Technology PCI0648 */
563: IDE_PCI_CLASS_OVERRIDE,
564: cmd0643_9_chip_map
565: },
566: { PCI_PRODUCT_CMDTECH_649, /* CMD Technology PCI0649 */
567: IDE_PCI_CLASS_OVERRIDE,
568: cmd0643_9_chip_map
569: },
570: { PCI_PRODUCT_CMDTECH_680, /* CMD Technology PCI0680 */
571: IDE_PCI_CLASS_OVERRIDE,
572: cmd680_chip_map
573: },
574: { PCI_PRODUCT_CMDTECH_3112, /* SiI3112 SATA */
575: IDE_PCI_CLASS_OVERRIDE,
576: sii3112_chip_map
577: },
578: { PCI_PRODUCT_CMDTECH_3512, /* SiI3512 SATA */
579: IDE_PCI_CLASS_OVERRIDE,
580: sii3112_chip_map
581: },
582: { PCI_PRODUCT_CMDTECH_AAR_1210SA, /* Adaptec AAR-1210SA */
583: IDE_PCI_CLASS_OVERRIDE,
584: sii3112_chip_map
585: },
586: { PCI_PRODUCT_CMDTECH_3114, /* SiI3114 */
587: IDE_PCI_CLASS_OVERRIDE,
588: sii3114_chip_map
589: }
590: };
591:
592: const struct pciide_product_desc pciide_via_products[] = {
593: { PCI_PRODUCT_VIATECH_VT82C416, /* VIA VT82C416 IDE */
594: 0,
595: apollo_chip_map
596: },
597: { PCI_PRODUCT_VIATECH_VT82C571, /* VIA VT82C571 IDE */
598: 0,
599: apollo_chip_map
600: },
601: { PCI_PRODUCT_VIATECH_VT6410, /* VIA VT6410 IDE */
602: IDE_PCI_CLASS_OVERRIDE,
603: apollo_chip_map
604: },
605: { PCI_PRODUCT_VIATECH_CX700_IDE, /* VIA CX700 IDE */
606: 0,
607: apollo_chip_map
608: },
609: { PCI_PRODUCT_VIATECH_VT6420_SATA, /* VIA VT6420 SATA */
610: IDE_PCI_CLASS_OVERRIDE,
611: sata_chip_map
612: },
613: { PCI_PRODUCT_VIATECH_VT6421_SATA, /* VIA VT6421 SATA */
614: IDE_PCI_CLASS_OVERRIDE,
615: sata_chip_map
616: },
617: { PCI_PRODUCT_VIATECH_VT8237A_SATA, /* VIA VT8237A SATA */
618: IDE_PCI_CLASS_OVERRIDE,
619: sata_chip_map
620: },
621: { PCI_PRODUCT_VIATECH_VT8237A_SATA_2, /* VIA VT8237A SATA */
622: 0,
623: sata_chip_map
624: },
625: { PCI_PRODUCT_VIATECH_VT8251_SATA, /* VIA VT8251 SATA */
626: IDE_PCI_CLASS_OVERRIDE,
627: sata_chip_map
628: }
629: };
630:
631: const struct pciide_product_desc pciide_cypress_products[] = {
632: { PCI_PRODUCT_CONTAQ_82C693, /* Contaq CY82C693 IDE */
633: IDE_16BIT_IOSPACE,
634: cy693_chip_map
635: }
636: };
637:
638: const struct pciide_product_desc pciide_sis_products[] = {
639: { PCI_PRODUCT_SIS_5513, /* SIS 5513 EIDE */
640: 0,
641: sis_chip_map
642: },
643: { PCI_PRODUCT_SIS_180, /* SIS 180 SATA */
644: IDE_PCI_CLASS_OVERRIDE,
645: sata_chip_map
646: },
647: { PCI_PRODUCT_SIS_181, /* SIS 181 SATA */
648: IDE_PCI_CLASS_OVERRIDE,
649: sata_chip_map
650: },
651: { PCI_PRODUCT_SIS_182, /* SIS 182 SATA */
652: IDE_PCI_CLASS_OVERRIDE,
653: sata_chip_map
654: }
655: };
656:
657: const struct pciide_product_desc pciide_natsemi_products[] = {
658: { PCI_PRODUCT_NS_PC87415, /* National Semi PC87415 IDE */
659: 0,
660: natsemi_chip_map
661: },
662: { PCI_PRODUCT_NS_SCx200_IDE, /* National Semi SCx200 IDE */
663: 0,
664: ns_scx200_chip_map
665: }
666: };
667:
668: const struct pciide_product_desc pciide_acer_products[] = {
669: { PCI_PRODUCT_ALI_M5229, /* Acer Labs M5229 UDMA IDE */
670: 0,
671: acer_chip_map
672: }
673: };
674:
675: const struct pciide_product_desc pciide_triones_products[] = {
676: { PCI_PRODUCT_TRIONES_HPT366, /* Highpoint HPT36x/37x IDE */
677: IDE_PCI_CLASS_OVERRIDE,
678: hpt_chip_map,
679: },
680: { PCI_PRODUCT_TRIONES_HPT372A, /* Highpoint HPT372A IDE */
681: IDE_PCI_CLASS_OVERRIDE,
682: hpt_chip_map
683: },
684: { PCI_PRODUCT_TRIONES_HPT302, /* Highpoint HPT302 IDE */
685: IDE_PCI_CLASS_OVERRIDE,
686: hpt_chip_map
687: },
688: { PCI_PRODUCT_TRIONES_HPT371, /* Highpoint HPT371 IDE */
689: IDE_PCI_CLASS_OVERRIDE,
690: hpt_chip_map
691: },
692: { PCI_PRODUCT_TRIONES_HPT374, /* Highpoint HPT374 IDE */
693: IDE_PCI_CLASS_OVERRIDE,
694: hpt_chip_map
695: }
696: };
697:
698: const struct pciide_product_desc pciide_promise_products[] = {
699: { PCI_PRODUCT_PROMISE_PDC20246,
700: IDE_PCI_CLASS_OVERRIDE,
701: pdc202xx_chip_map,
702: },
703: { PCI_PRODUCT_PROMISE_PDC20262,
704: IDE_PCI_CLASS_OVERRIDE,
705: pdc202xx_chip_map,
706: },
707: { PCI_PRODUCT_PROMISE_PDC20265,
708: IDE_PCI_CLASS_OVERRIDE,
709: pdc202xx_chip_map,
710: },
711: { PCI_PRODUCT_PROMISE_PDC20267,
712: IDE_PCI_CLASS_OVERRIDE,
713: pdc202xx_chip_map,
714: },
715: { PCI_PRODUCT_PROMISE_PDC20268,
716: IDE_PCI_CLASS_OVERRIDE,
717: pdc202xx_chip_map,
718: },
719: { PCI_PRODUCT_PROMISE_PDC20268R,
720: IDE_PCI_CLASS_OVERRIDE,
721: pdc202xx_chip_map,
722: },
723: { PCI_PRODUCT_PROMISE_PDC20269,
724: IDE_PCI_CLASS_OVERRIDE,
725: pdc202xx_chip_map,
726: },
727: { PCI_PRODUCT_PROMISE_PDC20271,
728: IDE_PCI_CLASS_OVERRIDE,
729: pdc202xx_chip_map,
730: },
731: { PCI_PRODUCT_PROMISE_PDC20275,
732: IDE_PCI_CLASS_OVERRIDE,
733: pdc202xx_chip_map,
734: },
735: { PCI_PRODUCT_PROMISE_PDC20276,
736: IDE_PCI_CLASS_OVERRIDE,
737: pdc202xx_chip_map,
738: },
739: { PCI_PRODUCT_PROMISE_PDC20277,
740: IDE_PCI_CLASS_OVERRIDE,
741: pdc202xx_chip_map,
742: },
743: { PCI_PRODUCT_PROMISE_PDC20318,
744: IDE_PCI_CLASS_OVERRIDE,
745: pdcsata_chip_map,
746: },
747: { PCI_PRODUCT_PROMISE_PDC20319,
748: IDE_PCI_CLASS_OVERRIDE,
749: pdcsata_chip_map,
750: },
751: { PCI_PRODUCT_PROMISE_PDC20371,
752: IDE_PCI_CLASS_OVERRIDE,
753: pdcsata_chip_map,
754: },
755: { PCI_PRODUCT_PROMISE_PDC20375,
756: IDE_PCI_CLASS_OVERRIDE,
757: pdcsata_chip_map,
758: },
759: { PCI_PRODUCT_PROMISE_PDC20376,
760: IDE_PCI_CLASS_OVERRIDE,
761: pdcsata_chip_map,
762: },
763: { PCI_PRODUCT_PROMISE_PDC20377,
764: IDE_PCI_CLASS_OVERRIDE,
765: pdcsata_chip_map,
766: },
767: { PCI_PRODUCT_PROMISE_PDC20378,
768: IDE_PCI_CLASS_OVERRIDE,
769: pdcsata_chip_map,
770: },
771: { PCI_PRODUCT_PROMISE_PDC20379,
772: IDE_PCI_CLASS_OVERRIDE,
773: pdcsata_chip_map,
774: },
775: { PCI_PRODUCT_PROMISE_PDC40518,
776: IDE_PCI_CLASS_OVERRIDE,
777: pdcsata_chip_map,
778: },
779: { PCI_PRODUCT_PROMISE_PDC40519,
780: IDE_PCI_CLASS_OVERRIDE,
781: pdcsata_chip_map,
782: },
783: { PCI_PRODUCT_PROMISE_PDC40718,
784: IDE_PCI_CLASS_OVERRIDE,
785: pdcsata_chip_map,
786: },
787: { PCI_PRODUCT_PROMISE_PDC40719,
788: IDE_PCI_CLASS_OVERRIDE,
789: pdcsata_chip_map,
790: },
791: { PCI_PRODUCT_PROMISE_PDC40779,
792: IDE_PCI_CLASS_OVERRIDE,
793: pdcsata_chip_map,
794: },
795: { PCI_PRODUCT_PROMISE_PDC20571,
796: IDE_PCI_CLASS_OVERRIDE,
797: pdcsata_chip_map,
798: },
799: { PCI_PRODUCT_PROMISE_PDC20575,
800: IDE_PCI_CLASS_OVERRIDE,
801: pdcsata_chip_map,
802: },
803: { PCI_PRODUCT_PROMISE_PDC20579,
804: IDE_PCI_CLASS_OVERRIDE,
805: pdcsata_chip_map,
806: },
807: { PCI_PRODUCT_PROMISE_PDC20771,
808: IDE_PCI_CLASS_OVERRIDE,
809: pdcsata_chip_map,
810: },
811: { PCI_PRODUCT_PROMISE_PDC20775,
812: IDE_PCI_CLASS_OVERRIDE,
813: pdcsata_chip_map,
814: }
815: };
816:
817: const struct pciide_product_desc pciide_acard_products[] = {
818: { PCI_PRODUCT_ACARD_ATP850U, /* Acard ATP850U Ultra33 Controller */
819: IDE_PCI_CLASS_OVERRIDE,
820: acard_chip_map,
821: },
822: { PCI_PRODUCT_ACARD_ATP860, /* Acard ATP860 Ultra66 Controller */
823: IDE_PCI_CLASS_OVERRIDE,
824: acard_chip_map,
825: },
826: { PCI_PRODUCT_ACARD_ATP860A, /* Acard ATP860-A Ultra66 Controller */
827: IDE_PCI_CLASS_OVERRIDE,
828: acard_chip_map,
829: },
830: { PCI_PRODUCT_ACARD_ATP865A, /* Acard ATP865-A Ultra133 Controller */
831: IDE_PCI_CLASS_OVERRIDE,
832: acard_chip_map,
833: },
834: { PCI_PRODUCT_ACARD_ATP865R, /* Acard ATP865-R Ultra133 Controller */
835: IDE_PCI_CLASS_OVERRIDE,
836: acard_chip_map,
837: }
838: };
839:
840: const struct pciide_product_desc pciide_serverworks_products[] = {
841: { PCI_PRODUCT_RCC_OSB4_IDE,
842: 0,
843: serverworks_chip_map,
844: },
845: { PCI_PRODUCT_RCC_CSB5_IDE,
846: 0,
847: serverworks_chip_map,
848: },
849: { PCI_PRODUCT_RCC_CSB6_IDE,
850: 0,
851: serverworks_chip_map,
852: },
853: { PCI_PRODUCT_RCC_CSB6_RAID_IDE,
854: 0,
855: serverworks_chip_map,
856: },
857: { PCI_PRODUCT_RCC_HT_1000_IDE,
858: 0,
859: serverworks_chip_map,
860: },
861: { PCI_PRODUCT_RCC_K2_SATA,
862: IDE_PCI_CLASS_OVERRIDE,
863: svwsata_chip_map,
864: },
865: { PCI_PRODUCT_RCC_FRODO4_SATA,
866: 0,
867: svwsata_chip_map,
868: },
869: { PCI_PRODUCT_RCC_FRODO8_SATA,
870: 0,
871: svwsata_chip_map,
872: },
873: { PCI_PRODUCT_RCC_HT_1000_SATA_1,
874: 0,
875: svwsata_chip_map,
876: },
877: { PCI_PRODUCT_RCC_HT_1000_SATA_2,
878: 0,
879: svwsata_chip_map,
880: }
881: };
882:
883: const struct pciide_product_desc pciide_nvidia_products[] = {
884: { PCI_PRODUCT_NVIDIA_NFORCE_IDE,
885: 0,
886: nforce_chip_map
887: },
888: { PCI_PRODUCT_NVIDIA_NFORCE2_IDE,
889: 0,
890: nforce_chip_map
891: },
892: { PCI_PRODUCT_NVIDIA_NFORCE2_400_IDE,
893: 0,
894: nforce_chip_map
895: },
896: { PCI_PRODUCT_NVIDIA_NFORCE3_IDE,
897: 0,
898: nforce_chip_map
899: },
900: { PCI_PRODUCT_NVIDIA_NFORCE3_250_IDE,
901: 0,
902: nforce_chip_map
903: },
904: { PCI_PRODUCT_NVIDIA_NFORCE4_ATA133,
905: 0,
906: nforce_chip_map
907: },
908: { PCI_PRODUCT_NVIDIA_MCP04_IDE,
909: 0,
910: nforce_chip_map
911: },
912: { PCI_PRODUCT_NVIDIA_MCP51_IDE,
913: 0,
914: nforce_chip_map
915: },
916: { PCI_PRODUCT_NVIDIA_MCP55_IDE,
917: 0,
918: nforce_chip_map
919: },
920: { PCI_PRODUCT_NVIDIA_MCP61_IDE,
921: 0,
922: nforce_chip_map
923: },
924: { PCI_PRODUCT_NVIDIA_MCP65_IDE,
925: 0,
926: nforce_chip_map
927: },
928: { PCI_PRODUCT_NVIDIA_MCP67_IDE,
929: 0,
930: nforce_chip_map
931: },
932: { PCI_PRODUCT_NVIDIA_NFORCE2_400_SATA,
933: 0,
934: sata_chip_map
935: },
936: { PCI_PRODUCT_NVIDIA_NFORCE3_250_SATA,
937: 0,
938: sata_chip_map
939: },
940: { PCI_PRODUCT_NVIDIA_NFORCE3_250_SATA2,
941: 0,
942: sata_chip_map
943: },
944: { PCI_PRODUCT_NVIDIA_NFORCE4_SATA1,
945: 0,
946: sata_chip_map
947: },
948: { PCI_PRODUCT_NVIDIA_NFORCE4_SATA2,
949: 0,
950: sata_chip_map
951: },
952: { PCI_PRODUCT_NVIDIA_MCP04_SATA,
953: 0,
954: sata_chip_map
955: },
956: { PCI_PRODUCT_NVIDIA_MCP04_SATA2,
957: 0,
958: sata_chip_map
959: },
960: { PCI_PRODUCT_NVIDIA_MCP51_SATA,
961: 0,
962: sata_chip_map
963: },
964: { PCI_PRODUCT_NVIDIA_MCP51_SATA2,
965: 0,
966: sata_chip_map
967: },
968: { PCI_PRODUCT_NVIDIA_MCP55_SATA,
969: 0,
970: sata_chip_map
971: },
972: { PCI_PRODUCT_NVIDIA_MCP55_SATA2,
973: 0,
974: sata_chip_map
975: },
976: { PCI_PRODUCT_NVIDIA_MCP61_SATA,
977: 0,
978: sata_chip_map
979: },
980: { PCI_PRODUCT_NVIDIA_MCP61_SATA2,
981: 0,
982: sata_chip_map
983: },
984: { PCI_PRODUCT_NVIDIA_MCP61_SATA3,
985: 0,
986: sata_chip_map
987: },
988: { PCI_PRODUCT_NVIDIA_MCP65_SATA,
989: 0,
990: sata_chip_map
991: },
992: { PCI_PRODUCT_NVIDIA_MCP65_SATA2,
993: 0,
994: sata_chip_map
995: },
996: { PCI_PRODUCT_NVIDIA_MCP65_SATA3,
997: 0,
998: sata_chip_map
999: },
1000: { PCI_PRODUCT_NVIDIA_MCP65_SATA4,
1001: 0,
1002: sata_chip_map
1003: },
1004: { PCI_PRODUCT_NVIDIA_MCP67_SATA,
1005: 0,
1006: sata_chip_map
1007: },
1008: { PCI_PRODUCT_NVIDIA_MCP67_SATA2,
1009: 0,
1010: sata_chip_map
1011: },
1012: { PCI_PRODUCT_NVIDIA_MCP67_SATA3,
1013: 0,
1014: sata_chip_map
1015: },
1016: { PCI_PRODUCT_NVIDIA_MCP67_SATA4,
1017: 0,
1018: sata_chip_map
1019: }
1020: };
1021:
1022: const struct pciide_product_desc pciide_ite_products[] = {
1023: { PCI_PRODUCT_ITEXPRESS_IT8211F,
1024: IDE_PCI_CLASS_OVERRIDE,
1025: ite_chip_map
1026: },
1027: { PCI_PRODUCT_ITEXPRESS_IT8212F,
1028: IDE_PCI_CLASS_OVERRIDE,
1029: ite_chip_map
1030: }
1031: };
1032:
1033: const struct pciide_product_desc pciide_ati_products[] = {
1034: { PCI_PRODUCT_ATI_IXP_IDE_200,
1035: 0,
1036: ixp_chip_map
1037: },
1038: { PCI_PRODUCT_ATI_IXP_IDE_300,
1039: 0,
1040: ixp_chip_map
1041: },
1042: { PCI_PRODUCT_ATI_IXP_IDE_400,
1043: 0,
1044: ixp_chip_map
1045: },
1046: { PCI_PRODUCT_ATI_IXP_IDE_600,
1047: 0,
1048: ixp_chip_map
1049: },
1050: { PCI_PRODUCT_ATI_IXP_SATA_300,
1051: IDE_PCI_CLASS_OVERRIDE,
1052: sii3112_chip_map
1053: },
1054: { PCI_PRODUCT_ATI_IXP_SATA_400_1,
1055: IDE_PCI_CLASS_OVERRIDE,
1056: sii3112_chip_map
1057: },
1058: { PCI_PRODUCT_ATI_IXP_SATA_400_2,
1059: IDE_PCI_CLASS_OVERRIDE,
1060: sii3112_chip_map
1061: }
1062: };
1063:
1064: const struct pciide_product_desc pciide_jmicron_products[] = {
1065: { PCI_PRODUCT_JMICRON_JMB361,
1066: 0,
1067: jmicron_chip_map
1068: },
1069: { PCI_PRODUCT_JMICRON_JMB363,
1070: 0,
1071: jmicron_chip_map
1072: },
1073: { PCI_PRODUCT_JMICRON_JMB365,
1074: 0,
1075: jmicron_chip_map
1076: },
1077: { PCI_PRODUCT_JMICRON_JMB366,
1078: 0,
1079: jmicron_chip_map
1080: },
1081: { PCI_PRODUCT_JMICRON_JMB368,
1082: 0,
1083: jmicron_chip_map
1084: }
1085: };
1086:
1087: struct pciide_vendor_desc {
1088: u_int32_t ide_vendor;
1089: const struct pciide_product_desc *ide_products;
1090: int ide_nproducts;
1091: };
1092:
1093: const struct pciide_vendor_desc pciide_vendors[] = {
1094: { PCI_VENDOR_INTEL, pciide_intel_products,
1095: sizeof(pciide_intel_products)/sizeof(pciide_intel_products[0]) },
1096: { PCI_VENDOR_AMD, pciide_amd_products,
1097: sizeof(pciide_amd_products)/sizeof(pciide_amd_products[0]) },
1098: #ifdef notyet
1099: { PCI_VENDOR_OPTI, pciide_opti_products,
1100: sizeof(pciide_opti_products)/sizeof(pciide_opti_products[0]) },
1101: #endif
1102: { PCI_VENDOR_CMDTECH, pciide_cmd_products,
1103: sizeof(pciide_cmd_products)/sizeof(pciide_cmd_products[0]) },
1104: { PCI_VENDOR_VIATECH, pciide_via_products,
1105: sizeof(pciide_via_products)/sizeof(pciide_via_products[0]) },
1106: { PCI_VENDOR_CONTAQ, pciide_cypress_products,
1107: sizeof(pciide_cypress_products)/sizeof(pciide_cypress_products[0]) },
1108: { PCI_VENDOR_SIS, pciide_sis_products,
1109: sizeof(pciide_sis_products)/sizeof(pciide_sis_products[0]) },
1110: { PCI_VENDOR_NS, pciide_natsemi_products,
1111: sizeof(pciide_natsemi_products)/sizeof(pciide_natsemi_products[0]) },
1112: { PCI_VENDOR_ALI, pciide_acer_products,
1113: sizeof(pciide_acer_products)/sizeof(pciide_acer_products[0]) },
1114: { PCI_VENDOR_TRIONES, pciide_triones_products,
1115: sizeof(pciide_triones_products)/sizeof(pciide_triones_products[0]) },
1116: { PCI_VENDOR_ACARD, pciide_acard_products,
1117: sizeof(pciide_acard_products)/sizeof(pciide_acard_products[0]) },
1118: { PCI_VENDOR_RCC, pciide_serverworks_products,
1119: sizeof(pciide_serverworks_products)/sizeof(pciide_serverworks_products[0]) },
1120: { PCI_VENDOR_PROMISE, pciide_promise_products,
1121: sizeof(pciide_promise_products)/sizeof(pciide_promise_products[0]) },
1122: { PCI_VENDOR_NVIDIA, pciide_nvidia_products,
1123: sizeof(pciide_nvidia_products)/sizeof(pciide_nvidia_products[0]) },
1124: { PCI_VENDOR_ITEXPRESS, pciide_ite_products,
1125: sizeof(pciide_ite_products)/sizeof(pciide_ite_products[0]) },
1126: { PCI_VENDOR_ATI, pciide_ati_products,
1127: sizeof(pciide_ati_products)/sizeof(pciide_ati_products[0]) },
1128: { PCI_VENDOR_JMICRON, pciide_jmicron_products,
1129: sizeof(pciide_jmicron_products)/sizeof(pciide_jmicron_products[0]) }
1130: };
1131:
1132: /* options passed via the 'flags' config keyword */
1133: #define PCIIDE_OPTIONS_DMA 0x01
1134:
1135: int pciide_match(struct device *, void *, void *);
1136: void pciide_attach(struct device *, struct device *, void *);
1137:
1138: struct cfattach pciide_pci_ca = {
1139: sizeof(struct pciide_softc), pciide_match, pciide_attach
1140: };
1141:
1142: struct cfattach pciide_jmb_ca = {
1143: sizeof(struct pciide_softc), pciide_match, pciide_attach
1144: };
1145:
1146: struct cfdriver pciide_cd = {
1147: NULL, "pciide", DV_DULL
1148: };
1149:
1150: int pciide_mapregs_compat( struct pci_attach_args *,
1151: struct pciide_channel *, int, bus_size_t *, bus_size_t *);
1152: int pciide_mapregs_native(struct pci_attach_args *,
1153: struct pciide_channel *, bus_size_t *, bus_size_t *,
1154: int (*pci_intr)(void *));
1155: void pciide_mapreg_dma(struct pciide_softc *,
1156: struct pci_attach_args *);
1157: int pciide_chansetup(struct pciide_softc *, int, pcireg_t);
1158: void pciide_mapchan(struct pci_attach_args *,
1159: struct pciide_channel *, pcireg_t, bus_size_t *, bus_size_t *,
1160: int (*pci_intr)(void *));
1161: int pciide_chan_candisable(struct pciide_channel *);
1162: void pciide_map_compat_intr( struct pci_attach_args *,
1163: struct pciide_channel *, int, int);
1164: void pciide_unmap_compat_intr( struct pci_attach_args *,
1165: struct pciide_channel *, int, int);
1166: int pciide_compat_intr(void *);
1167: int pciide_pci_intr(void *);
1168: int pciide_intr_flag(struct pciide_channel *);
1169:
1170: const struct pciide_product_desc *pciide_lookup_product(u_int32_t);
1171:
1172: const struct pciide_product_desc *
1173: pciide_lookup_product(u_int32_t id)
1174: {
1175: const struct pciide_product_desc *pp;
1176: const struct pciide_vendor_desc *vp;
1177: int i;
1178:
1179: for (i = 0, vp = pciide_vendors;
1180: i < sizeof(pciide_vendors)/sizeof(pciide_vendors[0]);
1181: vp++, i++)
1182: if (PCI_VENDOR(id) == vp->ide_vendor)
1183: break;
1184:
1185: if (i == sizeof(pciide_vendors)/sizeof(pciide_vendors[0]))
1186: return (NULL);
1187:
1188: for (pp = vp->ide_products, i = 0; i < vp->ide_nproducts; pp++, i++)
1189: if (PCI_PRODUCT(id) == pp->ide_product)
1190: break;
1191:
1192: if (i == vp->ide_nproducts)
1193: return (NULL);
1194: return (pp);
1195: }
1196:
1197: int
1198: pciide_match(struct device *parent, void *match, void *aux)
1199: {
1200: struct pci_attach_args *pa = aux;
1201: const struct pciide_product_desc *pp;
1202:
1203: /*
1204: * Some IDE controllers have severe bugs when used in PCI mode.
1205: * We punt and attach them to the ISA bus instead.
1206: */
1207: if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_PCTECH &&
1208: PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_PCTECH_RZ1000)
1209: return (0);
1210:
1211: /*
1212: * Some controllers (e.g. promise Ultra-33) don't claim to be PCI IDE
1213: * controllers. Let see if we can deal with it anyway.
1214: */
1215: pp = pciide_lookup_product(pa->pa_id);
1216: if (pp && (pp->ide_flags & IDE_PCI_CLASS_OVERRIDE))
1217: return (1);
1218:
1219: /*
1220: * Check the ID register to see that it's a PCI IDE controller.
1221: * If it is, we assume that we can deal with it; it _should_
1222: * work in a standardized way...
1223: */
1224: if (PCI_CLASS(pa->pa_class) == PCI_CLASS_MASS_STORAGE) {
1225: switch (PCI_SUBCLASS(pa->pa_class)) {
1226: case PCI_SUBCLASS_MASS_STORAGE_IDE:
1227: return (1);
1228:
1229: /*
1230: * We only match these if we know they have
1231: * a match, as we may not support native interfaces
1232: * on them.
1233: */
1234: case PCI_SUBCLASS_MASS_STORAGE_SATA:
1235: case PCI_SUBCLASS_MASS_STORAGE_RAID:
1236: if (pp)
1237: return (1);
1238: else
1239: return (0);
1240: break;
1241: }
1242: }
1243:
1244: return (0);
1245: }
1246:
1247: void
1248: pciide_attach(struct device *parent, struct device *self, void *aux)
1249: {
1250: struct pciide_softc *sc = (struct pciide_softc *)self;
1251: struct pci_attach_args *pa = aux;
1252:
1253: sc->sc_pp = pciide_lookup_product(pa->pa_id);
1254: if (sc->sc_pp == NULL)
1255: sc->sc_pp = &default_product_desc;
1256: sc->sc_rev = PCI_REVISION(pa->pa_class);
1257:
1258: sc->sc_pc = pa->pa_pc;
1259: sc->sc_tag = pa->pa_tag;
1260:
1261: /* Set up DMA defaults; these might be adjusted by chip_map. */
1262: sc->sc_dma_maxsegsz = IDEDMA_BYTE_COUNT_MAX;
1263: sc->sc_dma_boundary = IDEDMA_BYTE_COUNT_ALIGN;
1264:
1265: sc->sc_dmacmd_read = pciide_dmacmd_read;
1266: sc->sc_dmacmd_write = pciide_dmacmd_write;
1267: sc->sc_dmactl_read = pciide_dmactl_read;
1268: sc->sc_dmactl_write = pciide_dmactl_write;
1269: sc->sc_dmatbl_write = pciide_dmatbl_write;
1270:
1271: WDCDEBUG_PRINT((" sc_pc=%p, sc_tag=%p, pa_class=0x%x\n", sc->sc_pc,
1272: sc->sc_tag, pa->pa_class), DEBUG_PROBE);
1273:
1274: sc->sc_pp->chip_map(sc, pa);
1275:
1276: WDCDEBUG_PRINT(("pciide: command/status register=0x%x\n",
1277: pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_COMMAND_STATUS_REG)),
1278: DEBUG_PROBE);
1279: }
1280:
1281: int
1282: pciide_mapregs_compat(struct pci_attach_args *pa, struct pciide_channel *cp,
1283: int compatchan, bus_size_t *cmdsizep, bus_size_t *ctlsizep)
1284: {
1285: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1286: struct channel_softc *wdc_cp = &cp->wdc_channel;
1287: pcireg_t csr;
1288:
1289: cp->compat = 1;
1290: *cmdsizep = PCIIDE_COMPAT_CMD_SIZE;
1291: *ctlsizep = PCIIDE_COMPAT_CTL_SIZE;
1292:
1293: csr = pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_COMMAND_STATUS_REG);
1294: pci_conf_write(sc->sc_pc, sc->sc_tag, PCI_COMMAND_STATUS_REG,
1295: csr | PCI_COMMAND_IO_ENABLE | PCI_COMMAND_MASTER_ENABLE);
1296:
1297: wdc_cp->cmd_iot = pa->pa_iot;
1298:
1299: if (bus_space_map(wdc_cp->cmd_iot, PCIIDE_COMPAT_CMD_BASE(compatchan),
1300: PCIIDE_COMPAT_CMD_SIZE, 0, &wdc_cp->cmd_ioh) != 0) {
1301: printf("%s: couldn't map %s cmd regs\n",
1302: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1303: return (0);
1304: }
1305:
1306: wdc_cp->ctl_iot = pa->pa_iot;
1307:
1308: if (bus_space_map(wdc_cp->ctl_iot, PCIIDE_COMPAT_CTL_BASE(compatchan),
1309: PCIIDE_COMPAT_CTL_SIZE, 0, &wdc_cp->ctl_ioh) != 0) {
1310: printf("%s: couldn't map %s ctl regs\n",
1311: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1312: bus_space_unmap(wdc_cp->cmd_iot, wdc_cp->cmd_ioh,
1313: PCIIDE_COMPAT_CMD_SIZE);
1314: return (0);
1315: }
1316:
1317: return (1);
1318: }
1319:
1320: int
1321: pciide_mapregs_native(struct pci_attach_args *pa, struct pciide_channel *cp,
1322: bus_size_t *cmdsizep, bus_size_t *ctlsizep, int (*pci_intr)(void *))
1323: {
1324: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1325: struct channel_softc *wdc_cp = &cp->wdc_channel;
1326: const char *intrstr;
1327: pci_intr_handle_t intrhandle;
1328: pcireg_t maptype;
1329:
1330: cp->compat = 0;
1331:
1332: if (sc->sc_pci_ih == NULL) {
1333: if (pci_intr_map(pa, &intrhandle) != 0) {
1334: printf("%s: couldn't map native-PCI interrupt\n",
1335: sc->sc_wdcdev.sc_dev.dv_xname);
1336: return (0);
1337: }
1338: intrstr = pci_intr_string(pa->pa_pc, intrhandle);
1339: sc->sc_pci_ih = pci_intr_establish(pa->pa_pc,
1340: intrhandle, IPL_BIO, pci_intr, sc,
1341: sc->sc_wdcdev.sc_dev.dv_xname);
1342: if (sc->sc_pci_ih != NULL) {
1343: printf("%s: using %s for native-PCI interrupt\n",
1344: sc->sc_wdcdev.sc_dev.dv_xname,
1345: intrstr ? intrstr : "unknown interrupt");
1346: } else {
1347: printf("%s: couldn't establish native-PCI interrupt",
1348: sc->sc_wdcdev.sc_dev.dv_xname);
1349: if (intrstr != NULL)
1350: printf(" at %s", intrstr);
1351: printf("\n");
1352: return (0);
1353: }
1354: }
1355: cp->ih = sc->sc_pci_ih;
1356:
1357: maptype = pci_mapreg_type(pa->pa_pc, pa->pa_tag,
1358: PCIIDE_REG_CMD_BASE(wdc_cp->channel));
1359: WDCDEBUG_PRINT(("%s: %s cmd regs mapping: %s\n",
1360: sc->sc_wdcdev.sc_dev.dv_xname, cp->name,
1361: (maptype == PCI_MAPREG_TYPE_IO ? "I/O" : "memory")), DEBUG_PROBE);
1362: if (pci_mapreg_map(pa, PCIIDE_REG_CMD_BASE(wdc_cp->channel),
1363: maptype, 0,
1364: &wdc_cp->cmd_iot, &wdc_cp->cmd_ioh, NULL, cmdsizep, 0) != 0) {
1365: printf("%s: couldn't map %s cmd regs\n",
1366: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1367: return (0);
1368: }
1369:
1370: maptype = pci_mapreg_type(pa->pa_pc, pa->pa_tag,
1371: PCIIDE_REG_CTL_BASE(wdc_cp->channel));
1372: WDCDEBUG_PRINT(("%s: %s ctl regs mapping: %s\n",
1373: sc->sc_wdcdev.sc_dev.dv_xname, cp->name,
1374: (maptype == PCI_MAPREG_TYPE_IO ? "I/O": "memory")), DEBUG_PROBE);
1375: if (pci_mapreg_map(pa, PCIIDE_REG_CTL_BASE(wdc_cp->channel),
1376: maptype, 0,
1377: &wdc_cp->ctl_iot, &cp->ctl_baseioh, NULL, ctlsizep, 0) != 0) {
1378: printf("%s: couldn't map %s ctl regs\n",
1379: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1380: bus_space_unmap(wdc_cp->cmd_iot, wdc_cp->cmd_ioh, *cmdsizep);
1381: return (0);
1382: }
1383: /*
1384: * In native mode, 4 bytes of I/O space are mapped for the control
1385: * register, the control register is at offset 2. Pass the generic
1386: * code a handle for only one byte at the right offset.
1387: */
1388: if (bus_space_subregion(wdc_cp->ctl_iot, cp->ctl_baseioh, 2, 1,
1389: &wdc_cp->ctl_ioh) != 0) {
1390: printf("%s: unable to subregion %s ctl regs\n",
1391: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1392: bus_space_unmap(wdc_cp->cmd_iot, wdc_cp->cmd_ioh, *cmdsizep);
1393: bus_space_unmap(wdc_cp->cmd_iot, cp->ctl_baseioh, *ctlsizep);
1394: return (0);
1395: }
1396: return (1);
1397: }
1398:
1399: void
1400: pciide_mapreg_dma(struct pciide_softc *sc, struct pci_attach_args *pa)
1401: {
1402: pcireg_t maptype;
1403: bus_addr_t addr;
1404:
1405: /*
1406: * Map DMA registers
1407: *
1408: * Note that sc_dma_ok is the right variable to test to see if
1409: * DMA can be done. If the interface doesn't support DMA,
1410: * sc_dma_ok will never be non-zero. If the DMA regs couldn't
1411: * be mapped, it'll be zero. I.e., sc_dma_ok will only be
1412: * non-zero if the interface supports DMA and the registers
1413: * could be mapped.
1414: *
1415: * XXX Note that despite the fact that the Bus Master IDE specs
1416: * XXX say that "The bus master IDE function uses 16 bytes of IO
1417: * XXX space", some controllers (at least the United
1418: * XXX Microelectronics UM8886BF) place it in memory space.
1419: */
1420:
1421: maptype = pci_mapreg_type(pa->pa_pc, pa->pa_tag,
1422: PCIIDE_REG_BUS_MASTER_DMA);
1423:
1424: switch (maptype) {
1425: case PCI_MAPREG_TYPE_IO:
1426: sc->sc_dma_ok = (pci_mapreg_info(pa->pa_pc, pa->pa_tag,
1427: PCIIDE_REG_BUS_MASTER_DMA, PCI_MAPREG_TYPE_IO,
1428: &addr, NULL, NULL) == 0);
1429: if (sc->sc_dma_ok == 0) {
1430: printf(", unused (couldn't query registers)");
1431: break;
1432: }
1433: if ((sc->sc_pp->ide_flags & IDE_16BIT_IOSPACE)
1434: && addr >= 0x10000) {
1435: sc->sc_dma_ok = 0;
1436: printf(", unused (registers at unsafe address %#lx)", addr);
1437: break;
1438: }
1439: /* FALLTHROUGH */
1440:
1441: case PCI_MAPREG_MEM_TYPE_32BIT:
1442: sc->sc_dma_ok = (pci_mapreg_map(pa,
1443: PCIIDE_REG_BUS_MASTER_DMA, maptype, 0,
1444: &sc->sc_dma_iot, &sc->sc_dma_ioh, NULL, NULL, 0) == 0);
1445: sc->sc_dmat = pa->pa_dmat;
1446: if (sc->sc_dma_ok == 0) {
1447: printf(", unused (couldn't map registers)");
1448: } else {
1449: sc->sc_wdcdev.dma_arg = sc;
1450: sc->sc_wdcdev.dma_init = pciide_dma_init;
1451: sc->sc_wdcdev.dma_start = pciide_dma_start;
1452: sc->sc_wdcdev.dma_finish = pciide_dma_finish;
1453: }
1454: break;
1455:
1456: default:
1457: sc->sc_dma_ok = 0;
1458: printf(", (unsupported maptype 0x%x)", maptype);
1459: break;
1460: }
1461: }
1462:
1463: int
1464: pciide_intr_flag(struct pciide_channel *cp)
1465: {
1466: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1467: int chan = cp->wdc_channel.channel;
1468:
1469: if (cp->dma_in_progress) {
1470: int retry = 10;
1471: int status;
1472:
1473: /* Check the status register */
1474: for (retry = 10; retry > 0; retry--) {
1475: status = PCIIDE_DMACTL_READ(sc, chan);
1476: if (status & IDEDMA_CTL_INTR) {
1477: break;
1478: }
1479: DELAY(5);
1480: }
1481:
1482: /* Not for us. */
1483: if (retry == 0)
1484: return (0);
1485:
1486: return (1);
1487: }
1488:
1489: return (-1);
1490: }
1491:
1492: int
1493: pciide_compat_intr(void *arg)
1494: {
1495: struct pciide_channel *cp = arg;
1496:
1497: if (pciide_intr_flag(cp) == 0)
1498: return (0);
1499:
1500: #ifdef DIAGNOSTIC
1501: /* should only be called for a compat channel */
1502: if (cp->compat == 0)
1503: panic("pciide compat intr called for non-compat chan %p", cp);
1504: #endif
1505: return (wdcintr(&cp->wdc_channel));
1506: }
1507:
1508: int
1509: pciide_pci_intr(void *arg)
1510: {
1511: struct pciide_softc *sc = arg;
1512: struct pciide_channel *cp;
1513: struct channel_softc *wdc_cp;
1514: int i, rv, crv;
1515:
1516: rv = 0;
1517: for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
1518: cp = &sc->pciide_channels[i];
1519: wdc_cp = &cp->wdc_channel;
1520:
1521: /* If a compat channel skip. */
1522: if (cp->compat)
1523: continue;
1524:
1525: if (pciide_intr_flag(cp) == 0)
1526: continue;
1527:
1528: crv = wdcintr(wdc_cp);
1529: if (crv == 0)
1530: ; /* leave rv alone */
1531: else if (crv == 1)
1532: rv = 1; /* claim the intr */
1533: else if (rv == 0) /* crv should be -1 in this case */
1534: rv = crv; /* if we've done no better, take it */
1535: }
1536: return (rv);
1537: }
1538:
1539: u_int8_t
1540: pciide_dmacmd_read(struct pciide_softc *sc, int chan)
1541: {
1542: return (bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1543: IDEDMA_CMD(chan)));
1544: }
1545:
1546: void
1547: pciide_dmacmd_write(struct pciide_softc *sc, int chan, u_int8_t val)
1548: {
1549: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1550: IDEDMA_CMD(chan), val);
1551: }
1552:
1553: u_int8_t
1554: pciide_dmactl_read(struct pciide_softc *sc, int chan)
1555: {
1556: return (bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1557: IDEDMA_CTL(chan)));
1558: }
1559:
1560: void
1561: pciide_dmactl_write(struct pciide_softc *sc, int chan, u_int8_t val)
1562: {
1563: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1564: IDEDMA_CTL(chan), val);
1565: }
1566:
1567: void
1568: pciide_dmatbl_write(struct pciide_softc *sc, int chan, u_int32_t val)
1569: {
1570: bus_space_write_4(sc->sc_dma_iot, sc->sc_dma_ioh,
1571: IDEDMA_TBL(chan), val);
1572: }
1573:
1574: void
1575: pciide_channel_dma_setup(struct pciide_channel *cp)
1576: {
1577: int drive;
1578: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1579: struct ata_drive_datas *drvp;
1580:
1581: for (drive = 0; drive < 2; drive++) {
1582: drvp = &cp->wdc_channel.ch_drive[drive];
1583: /* If no drive, skip */
1584: if ((drvp->drive_flags & DRIVE) == 0)
1585: continue;
1586: /* setup DMA if needed */
1587: if (((drvp->drive_flags & DRIVE_DMA) == 0 &&
1588: (drvp->drive_flags & DRIVE_UDMA) == 0) ||
1589: sc->sc_dma_ok == 0) {
1590: drvp->drive_flags &= ~(DRIVE_DMA | DRIVE_UDMA);
1591: continue;
1592: }
1593: if (pciide_dma_table_setup(sc, cp->wdc_channel.channel, drive)
1594: != 0) {
1595: /* Abort DMA setup */
1596: drvp->drive_flags &= ~(DRIVE_DMA | DRIVE_UDMA);
1597: continue;
1598: }
1599: }
1600: }
1601:
1602: int
1603: pciide_dma_table_setup(struct pciide_softc *sc, int channel, int drive)
1604: {
1605: bus_dma_segment_t seg;
1606: int error, rseg;
1607: const bus_size_t dma_table_size =
1608: sizeof(struct idedma_table) * NIDEDMA_TABLES;
1609: struct pciide_dma_maps *dma_maps =
1610: &sc->pciide_channels[channel].dma_maps[drive];
1611:
1612: /* If table was already allocated, just return */
1613: if (dma_maps->dma_table)
1614: return (0);
1615:
1616: /* Allocate memory for the DMA tables and map it */
1617: if ((error = bus_dmamem_alloc(sc->sc_dmat, dma_table_size,
1618: IDEDMA_TBL_ALIGN, IDEDMA_TBL_ALIGN, &seg, 1, &rseg,
1619: BUS_DMA_NOWAIT)) != 0) {
1620: printf("%s:%d: unable to allocate table DMA for "
1621: "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname,
1622: channel, drive, error);
1623: return (error);
1624: }
1625:
1626: if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg,
1627: dma_table_size,
1628: (caddr_t *)&dma_maps->dma_table,
1629: BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) != 0) {
1630: printf("%s:%d: unable to map table DMA for"
1631: "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname,
1632: channel, drive, error);
1633: return (error);
1634: }
1635:
1636: WDCDEBUG_PRINT(("pciide_dma_table_setup: table at %p len %ld, "
1637: "phy 0x%lx\n", dma_maps->dma_table, dma_table_size,
1638: seg.ds_addr), DEBUG_PROBE);
1639:
1640: /* Create and load table DMA map for this disk */
1641: if ((error = bus_dmamap_create(sc->sc_dmat, dma_table_size,
1642: 1, dma_table_size, IDEDMA_TBL_ALIGN, BUS_DMA_NOWAIT,
1643: &dma_maps->dmamap_table)) != 0) {
1644: printf("%s:%d: unable to create table DMA map for "
1645: "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname,
1646: channel, drive, error);
1647: return (error);
1648: }
1649: if ((error = bus_dmamap_load(sc->sc_dmat,
1650: dma_maps->dmamap_table,
1651: dma_maps->dma_table,
1652: dma_table_size, NULL, BUS_DMA_NOWAIT)) != 0) {
1653: printf("%s:%d: unable to load table DMA map for "
1654: "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname,
1655: channel, drive, error);
1656: return (error);
1657: }
1658: WDCDEBUG_PRINT(("pciide_dma_table_setup: phy addr of table 0x%lx\n",
1659: dma_maps->dmamap_table->dm_segs[0].ds_addr), DEBUG_PROBE);
1660: /* Create a xfer DMA map for this drive */
1661: if ((error = bus_dmamap_create(sc->sc_dmat, IDEDMA_BYTE_COUNT_MAX,
1662: NIDEDMA_TABLES, sc->sc_dma_maxsegsz, sc->sc_dma_boundary,
1663: BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW,
1664: &dma_maps->dmamap_xfer)) != 0) {
1665: printf("%s:%d: unable to create xfer DMA map for "
1666: "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname,
1667: channel, drive, error);
1668: return (error);
1669: }
1670: return (0);
1671: }
1672:
1673: int
1674: pciide_dma_init(void *v, int channel, int drive, void *databuf,
1675: size_t datalen, int flags)
1676: {
1677: struct pciide_softc *sc = v;
1678: int error, seg;
1679: struct pciide_channel *cp = &sc->pciide_channels[channel];
1680: struct pciide_dma_maps *dma_maps =
1681: &sc->pciide_channels[channel].dma_maps[drive];
1682: #ifndef BUS_DMA_RAW
1683: #define BUS_DMA_RAW 0
1684: #endif
1685:
1686: error = bus_dmamap_load(sc->sc_dmat,
1687: dma_maps->dmamap_xfer,
1688: databuf, datalen, NULL, BUS_DMA_NOWAIT|BUS_DMA_RAW);
1689: if (error) {
1690: printf("%s:%d: unable to load xfer DMA map for "
1691: "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname,
1692: channel, drive, error);
1693: return (error);
1694: }
1695:
1696: bus_dmamap_sync(sc->sc_dmat, dma_maps->dmamap_xfer, 0,
1697: dma_maps->dmamap_xfer->dm_mapsize,
1698: (flags & WDC_DMA_READ) ?
1699: BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
1700:
1701: for (seg = 0; seg < dma_maps->dmamap_xfer->dm_nsegs; seg++) {
1702: #ifdef DIAGNOSTIC
1703: /* A segment must not cross a 64k boundary */
1704: {
1705: u_long phys = dma_maps->dmamap_xfer->dm_segs[seg].ds_addr;
1706: u_long len = dma_maps->dmamap_xfer->dm_segs[seg].ds_len;
1707: if ((phys & ~IDEDMA_BYTE_COUNT_MASK) !=
1708: ((phys + len - 1) & ~IDEDMA_BYTE_COUNT_MASK)) {
1709: printf("pciide_dma: segment %d physical addr 0x%lx"
1710: " len 0x%lx not properly aligned\n",
1711: seg, phys, len);
1712: panic("pciide_dma: buf align");
1713: }
1714: }
1715: #endif
1716: dma_maps->dma_table[seg].base_addr =
1717: htole32(dma_maps->dmamap_xfer->dm_segs[seg].ds_addr);
1718: dma_maps->dma_table[seg].byte_count =
1719: htole32(dma_maps->dmamap_xfer->dm_segs[seg].ds_len &
1720: IDEDMA_BYTE_COUNT_MASK);
1721: WDCDEBUG_PRINT(("\t seg %d len %d addr 0x%x\n",
1722: seg, letoh32(dma_maps->dma_table[seg].byte_count),
1723: letoh32(dma_maps->dma_table[seg].base_addr)), DEBUG_DMA);
1724:
1725: }
1726: dma_maps->dma_table[dma_maps->dmamap_xfer->dm_nsegs -1].byte_count |=
1727: htole32(IDEDMA_BYTE_COUNT_EOT);
1728:
1729: bus_dmamap_sync(sc->sc_dmat, dma_maps->dmamap_table, 0,
1730: dma_maps->dmamap_table->dm_mapsize,
1731: BUS_DMASYNC_PREWRITE);
1732:
1733: /* Maps are ready. Start DMA function */
1734: #ifdef DIAGNOSTIC
1735: if (dma_maps->dmamap_table->dm_segs[0].ds_addr & ~IDEDMA_TBL_MASK) {
1736: printf("pciide_dma_init: addr 0x%lx not properly aligned\n",
1737: dma_maps->dmamap_table->dm_segs[0].ds_addr);
1738: panic("pciide_dma_init: table align");
1739: }
1740: #endif
1741:
1742: /* Clear status bits */
1743: PCIIDE_DMACTL_WRITE(sc, channel, PCIIDE_DMACTL_READ(sc, channel));
1744: /* Write table addr */
1745: PCIIDE_DMATBL_WRITE(sc, channel,
1746: dma_maps->dmamap_table->dm_segs[0].ds_addr);
1747: /* set read/write */
1748: PCIIDE_DMACMD_WRITE(sc, channel,
1749: ((flags & WDC_DMA_READ) ? IDEDMA_CMD_WRITE : 0) | cp->idedma_cmd);
1750: /* remember flags */
1751: dma_maps->dma_flags = flags;
1752: return (0);
1753: }
1754:
1755: void
1756: pciide_dma_start(void *v, int channel, int drive)
1757: {
1758: struct pciide_softc *sc = v;
1759:
1760: WDCDEBUG_PRINT(("pciide_dma_start\n"), DEBUG_XFERS);
1761: PCIIDE_DMACMD_WRITE(sc, channel, PCIIDE_DMACMD_READ(sc, channel) |
1762: IDEDMA_CMD_START);
1763:
1764: sc->pciide_channels[channel].dma_in_progress = 1;
1765: }
1766:
1767: int
1768: pciide_dma_finish(void *v, int channel, int drive, int force)
1769: {
1770: struct pciide_softc *sc = v;
1771: struct pciide_channel *cp = &sc->pciide_channels[channel];
1772: u_int8_t status;
1773: int error = 0;
1774: struct pciide_dma_maps *dma_maps =
1775: &sc->pciide_channels[channel].dma_maps[drive];
1776:
1777: status = PCIIDE_DMACTL_READ(sc, channel);
1778: WDCDEBUG_PRINT(("pciide_dma_finish: status 0x%x\n", status),
1779: DEBUG_XFERS);
1780:
1781: if (force == 0 && (status & IDEDMA_CTL_INTR) == 0) {
1782: error = WDC_DMAST_NOIRQ;
1783: goto done;
1784: }
1785:
1786: /* stop DMA channel */
1787: PCIIDE_DMACMD_WRITE(sc, channel,
1788: ((dma_maps->dma_flags & WDC_DMA_READ) ?
1789: 0x00 : IDEDMA_CMD_WRITE) | cp->idedma_cmd);
1790:
1791: /* Unload the map of the data buffer */
1792: bus_dmamap_sync(sc->sc_dmat, dma_maps->dmamap_xfer, 0,
1793: dma_maps->dmamap_xfer->dm_mapsize,
1794: (dma_maps->dma_flags & WDC_DMA_READ) ?
1795: BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
1796: bus_dmamap_unload(sc->sc_dmat, dma_maps->dmamap_xfer);
1797:
1798: /* Clear status bits */
1799: PCIIDE_DMACTL_WRITE(sc, channel, status);
1800:
1801: if ((status & IDEDMA_CTL_ERR) != 0) {
1802: printf("%s:%d:%d: bus-master DMA error: status=0x%x\n",
1803: sc->sc_wdcdev.sc_dev.dv_xname, channel, drive, status);
1804: error |= WDC_DMAST_ERR;
1805: }
1806:
1807: if ((status & IDEDMA_CTL_INTR) == 0) {
1808: printf("%s:%d:%d: bus-master DMA error: missing interrupt, "
1809: "status=0x%x\n", sc->sc_wdcdev.sc_dev.dv_xname, channel,
1810: drive, status);
1811: error |= WDC_DMAST_NOIRQ;
1812: }
1813:
1814: if ((status & IDEDMA_CTL_ACT) != 0) {
1815: /* data underrun, may be a valid condition for ATAPI */
1816: error |= WDC_DMAST_UNDER;
1817: }
1818:
1819: done:
1820: sc->pciide_channels[channel].dma_in_progress = 0;
1821: return (error);
1822: }
1823:
1824: void
1825: pciide_irqack(struct channel_softc *chp)
1826: {
1827: struct pciide_channel *cp = (struct pciide_channel *)chp;
1828: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1829: int chan = chp->channel;
1830:
1831: /* clear status bits in IDE DMA registers */
1832: PCIIDE_DMACTL_WRITE(sc, chan, PCIIDE_DMACTL_READ(sc, chan));
1833: }
1834:
1835: /* some common code used by several chip_map */
1836: int
1837: pciide_chansetup(struct pciide_softc *sc, int channel, pcireg_t interface)
1838: {
1839: struct pciide_channel *cp = &sc->pciide_channels[channel];
1840: sc->wdc_chanarray[channel] = &cp->wdc_channel;
1841: cp->name = PCIIDE_CHANNEL_NAME(channel);
1842: cp->wdc_channel.channel = channel;
1843: cp->wdc_channel.wdc = &sc->sc_wdcdev;
1844: cp->wdc_channel.ch_queue =
1845: malloc(sizeof(struct channel_queue), M_DEVBUF, M_NOWAIT);
1846: if (cp->wdc_channel.ch_queue == NULL) {
1847: printf("%s: %s "
1848: "cannot allocate memory for command queue",
1849: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1850: return (0);
1851: }
1852: cp->hw_ok = 1;
1853:
1854: return (1);
1855: }
1856:
1857: /* some common code used by several chip channel_map */
1858: void
1859: pciide_mapchan(struct pci_attach_args *pa, struct pciide_channel *cp,
1860: pcireg_t interface, bus_size_t *cmdsizep, bus_size_t *ctlsizep,
1861: int (*pci_intr)(void *))
1862: {
1863: struct channel_softc *wdc_cp = &cp->wdc_channel;
1864:
1865: if (interface & PCIIDE_INTERFACE_PCI(wdc_cp->channel))
1866: cp->hw_ok = pciide_mapregs_native(pa, cp, cmdsizep, ctlsizep,
1867: pci_intr);
1868: else
1869: cp->hw_ok = pciide_mapregs_compat(pa, cp,
1870: wdc_cp->channel, cmdsizep, ctlsizep);
1871: if (cp->hw_ok == 0)
1872: return;
1873: wdc_cp->data32iot = wdc_cp->cmd_iot;
1874: wdc_cp->data32ioh = wdc_cp->cmd_ioh;
1875: wdcattach(wdc_cp);
1876: }
1877:
1878: /*
1879: * Generic code to call to know if a channel can be disabled. Return 1
1880: * if channel can be disabled, 0 if not
1881: */
1882: int
1883: pciide_chan_candisable(struct pciide_channel *cp)
1884: {
1885: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1886: struct channel_softc *wdc_cp = &cp->wdc_channel;
1887:
1888: if ((wdc_cp->ch_drive[0].drive_flags & DRIVE) == 0 &&
1889: (wdc_cp->ch_drive[1].drive_flags & DRIVE) == 0) {
1890: printf("%s: %s disabled (no drives)\n",
1891: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1892: cp->hw_ok = 0;
1893: return (1);
1894: }
1895: return (0);
1896: }
1897:
1898: /*
1899: * generic code to map the compat intr if hw_ok=1 and it is a compat channel.
1900: * Set hw_ok=0 on failure
1901: */
1902: void
1903: pciide_map_compat_intr(struct pci_attach_args *pa, struct pciide_channel *cp,
1904: int compatchan, int interface)
1905: {
1906: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1907: struct channel_softc *wdc_cp = &cp->wdc_channel;
1908:
1909: if ((interface & PCIIDE_INTERFACE_PCI(wdc_cp->channel)) != 0)
1910: return;
1911:
1912: cp->compat = 1;
1913: cp->ih = pciide_machdep_compat_intr_establish(&sc->sc_wdcdev.sc_dev,
1914: pa, compatchan, pciide_compat_intr, cp);
1915: if (cp->ih == NULL) {
1916: printf("%s: no compatibility interrupt for use by %s\n",
1917: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1918: cp->hw_ok = 0;
1919: }
1920: }
1921:
1922: /*
1923: * generic code to unmap the compat intr if hw_ok=1 and it is a compat channel.
1924: * Set hw_ok=0 on failure
1925: */
1926: void
1927: pciide_unmap_compat_intr(struct pci_attach_args *pa, struct pciide_channel *cp,
1928: int compatchan, int interface)
1929: {
1930: struct channel_softc *wdc_cp = &cp->wdc_channel;
1931:
1932: if ((interface & PCIIDE_INTERFACE_PCI(wdc_cp->channel)) != 0)
1933: return;
1934:
1935: pciide_machdep_compat_intr_disestablish(pa->pa_pc, cp->ih);
1936: }
1937:
1938: void
1939: pciide_print_channels(int nchannels, pcireg_t interface)
1940: {
1941: int i;
1942:
1943: for (i = 0; i < nchannels; i++) {
1944: printf(", %s %s to %s", PCIIDE_CHANNEL_NAME(i),
1945: (interface & PCIIDE_INTERFACE_SETTABLE(i)) ?
1946: "configured" : "wired",
1947: (interface & PCIIDE_INTERFACE_PCI(i)) ? "native-PCI" :
1948: "compatibility");
1949: }
1950:
1951: printf("\n");
1952: }
1953:
1954: void
1955: pciide_print_modes(struct pciide_channel *cp)
1956: {
1957: wdc_print_current_modes(&cp->wdc_channel);
1958: }
1959:
1960: void
1961: default_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
1962: {
1963: struct pciide_channel *cp;
1964: pcireg_t interface = PCI_INTERFACE(pa->pa_class);
1965: pcireg_t csr;
1966: int channel, drive;
1967: struct ata_drive_datas *drvp;
1968: u_int8_t idedma_ctl;
1969: bus_size_t cmdsize, ctlsize;
1970: char *failreason;
1971:
1972: if (interface & PCIIDE_INTERFACE_BUS_MASTER_DMA) {
1973: printf(": DMA");
1974: if (sc->sc_pp == &default_product_desc &&
1975: (sc->sc_wdcdev.sc_dev.dv_cfdata->cf_flags &
1976: PCIIDE_OPTIONS_DMA) == 0) {
1977: printf(" (unsupported)");
1978: sc->sc_dma_ok = 0;
1979: } else {
1980: pciide_mapreg_dma(sc, pa);
1981: if (sc->sc_dma_ok != 0)
1982: printf(", (partial support)");
1983: }
1984: } else {
1985: printf(": no DMA");
1986: sc->sc_dma_ok = 0;
1987: }
1988: if (sc->sc_dma_ok) {
1989: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
1990: sc->sc_wdcdev.irqack = pciide_irqack;
1991: }
1992: sc->sc_wdcdev.PIO_cap = 0;
1993: sc->sc_wdcdev.DMA_cap = 0;
1994: sc->sc_wdcdev.channels = sc->wdc_chanarray;
1995: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
1996: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16;
1997:
1998: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
1999:
2000: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
2001: cp = &sc->pciide_channels[channel];
2002: if (pciide_chansetup(sc, channel, interface) == 0)
2003: continue;
2004: if (interface & PCIIDE_INTERFACE_PCI(channel)) {
2005: cp->hw_ok = pciide_mapregs_native(pa, cp, &cmdsize,
2006: &ctlsize, pciide_pci_intr);
2007: } else {
2008: cp->hw_ok = pciide_mapregs_compat(pa, cp,
2009: channel, &cmdsize, &ctlsize);
2010: }
2011: if (cp->hw_ok == 0)
2012: continue;
2013: /*
2014: * Check to see if something appears to be there.
2015: */
2016: failreason = NULL;
2017: pciide_map_compat_intr(pa, cp, channel, interface);
2018: if (cp->hw_ok == 0)
2019: continue;
2020: if (!wdcprobe(&cp->wdc_channel)) {
2021: failreason = "not responding; disabled or no drives?";
2022: goto next;
2023: }
2024: /*
2025: * Now, make sure it's actually attributable to this PCI IDE
2026: * channel by trying to access the channel again while the
2027: * PCI IDE controller's I/O space is disabled. (If the
2028: * channel no longer appears to be there, it belongs to
2029: * this controller.) YUCK!
2030: */
2031: csr = pci_conf_read(sc->sc_pc, sc->sc_tag,
2032: PCI_COMMAND_STATUS_REG);
2033: pci_conf_write(sc->sc_pc, sc->sc_tag, PCI_COMMAND_STATUS_REG,
2034: csr & ~PCI_COMMAND_IO_ENABLE);
2035: if (wdcprobe(&cp->wdc_channel))
2036: failreason = "other hardware responding at addresses";
2037: pci_conf_write(sc->sc_pc, sc->sc_tag,
2038: PCI_COMMAND_STATUS_REG, csr);
2039: next:
2040: if (failreason) {
2041: printf("%s: %s ignored (%s)\n",
2042: sc->sc_wdcdev.sc_dev.dv_xname, cp->name,
2043: failreason);
2044: cp->hw_ok = 0;
2045: pciide_unmap_compat_intr(pa, cp, channel, interface);
2046: bus_space_unmap(cp->wdc_channel.cmd_iot,
2047: cp->wdc_channel.cmd_ioh, cmdsize);
2048: if (interface & PCIIDE_INTERFACE_PCI(channel))
2049: bus_space_unmap(cp->wdc_channel.ctl_iot,
2050: cp->ctl_baseioh, ctlsize);
2051: else
2052: bus_space_unmap(cp->wdc_channel.ctl_iot,
2053: cp->wdc_channel.ctl_ioh, ctlsize);
2054: }
2055: if (cp->hw_ok) {
2056: cp->wdc_channel.data32iot = cp->wdc_channel.cmd_iot;
2057: cp->wdc_channel.data32ioh = cp->wdc_channel.cmd_ioh;
2058: wdcattach(&cp->wdc_channel);
2059: }
2060: }
2061:
2062: if (sc->sc_dma_ok == 0)
2063: return;
2064:
2065: /* Allocate DMA maps */
2066: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
2067: idedma_ctl = 0;
2068: cp = &sc->pciide_channels[channel];
2069: for (drive = 0; drive < 2; drive++) {
2070: drvp = &cp->wdc_channel.ch_drive[drive];
2071: /* If no drive, skip */
2072: if ((drvp->drive_flags & DRIVE) == 0)
2073: continue;
2074: if ((drvp->drive_flags & DRIVE_DMA) == 0)
2075: continue;
2076: if (pciide_dma_table_setup(sc, channel, drive) != 0) {
2077: /* Abort DMA setup */
2078: printf("%s:%d:%d: cannot allocate DMA maps, "
2079: "using PIO transfers\n",
2080: sc->sc_wdcdev.sc_dev.dv_xname,
2081: channel, drive);
2082: drvp->drive_flags &= ~DRIVE_DMA;
2083: }
2084: printf("%s:%d:%d: using DMA data transfers\n",
2085: sc->sc_wdcdev.sc_dev.dv_xname,
2086: channel, drive);
2087: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
2088: }
2089: if (idedma_ctl != 0) {
2090: /* Add software bits in status register */
2091: PCIIDE_DMACTL_WRITE(sc, channel, idedma_ctl);
2092: }
2093: }
2094: }
2095:
2096: void
2097: sata_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
2098: {
2099: struct pciide_channel *cp;
2100: pcireg_t interface = PCI_INTERFACE(pa->pa_class);
2101: int channel;
2102: bus_size_t cmdsize, ctlsize;
2103:
2104: if (interface == 0) {
2105: WDCDEBUG_PRINT(("sata_chip_map interface == 0\n"),
2106: DEBUG_PROBE);
2107: interface = PCIIDE_INTERFACE_BUS_MASTER_DMA |
2108: PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1);
2109: }
2110:
2111: printf(": DMA");
2112: pciide_mapreg_dma(sc, pa);
2113: printf("\n");
2114:
2115: if (sc->sc_dma_ok) {
2116: sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA |
2117: WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
2118: sc->sc_wdcdev.irqack = pciide_irqack;
2119: }
2120: sc->sc_wdcdev.PIO_cap = 4;
2121: sc->sc_wdcdev.DMA_cap = 2;
2122: sc->sc_wdcdev.UDMA_cap = 6;
2123:
2124: sc->sc_wdcdev.channels = sc->wdc_chanarray;
2125: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
2126: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
2127: WDC_CAPABILITY_MODE | WDC_CAPABILITY_SATA;
2128: sc->sc_wdcdev.set_modes = sata_setup_channel;
2129:
2130: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
2131: cp = &sc->pciide_channels[channel];
2132: if (pciide_chansetup(sc, channel, interface) == 0)
2133: continue;
2134: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
2135: pciide_pci_intr);
2136: sata_setup_channel(&cp->wdc_channel);
2137: }
2138: }
2139:
2140: void
2141: sata_setup_channel(struct channel_softc *chp)
2142: {
2143: struct ata_drive_datas *drvp;
2144: int drive;
2145: u_int32_t idedma_ctl;
2146: struct pciide_channel *cp = (struct pciide_channel *)chp;
2147: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
2148:
2149: /* setup DMA if needed */
2150: pciide_channel_dma_setup(cp);
2151:
2152: idedma_ctl = 0;
2153:
2154: for (drive = 0; drive < 2; drive++) {
2155: drvp = &chp->ch_drive[drive];
2156: /* If no drive, skip */
2157: if ((drvp->drive_flags & DRIVE) == 0)
2158: continue;
2159: if (drvp->drive_flags & DRIVE_UDMA) {
2160: /* use Ultra/DMA */
2161: drvp->drive_flags &= ~DRIVE_DMA;
2162: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
2163: } else if (drvp->drive_flags & DRIVE_DMA) {
2164: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
2165: }
2166: }
2167:
2168: /*
2169: * Nothing to do to setup modes; it is meaningless in S-ATA
2170: * (but many S-ATA drives still want to get the SET_FEATURE
2171: * command).
2172: */
2173: if (idedma_ctl != 0) {
2174: /* Add software bits in status register */
2175: PCIIDE_DMACTL_WRITE(sc, chp->channel, idedma_ctl);
2176: }
2177: pciide_print_modes(cp);
2178: }
2179:
2180: void
2181: piix_timing_debug(struct pciide_softc *sc)
2182: {
2183: WDCDEBUG_PRINT(("piix_setup_chip: idetim=0x%x",
2184: pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM)),
2185: DEBUG_PROBE);
2186: if (sc->sc_pp->ide_product != PCI_PRODUCT_INTEL_82371FB_IDE &&
2187: sc->sc_pp->ide_product != PCI_PRODUCT_INTEL_82371FB_ISA) {
2188: WDCDEBUG_PRINT((", sidetim=0x%x",
2189: pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM)),
2190: DEBUG_PROBE);
2191: if (sc->sc_wdcdev.cap & WDC_CAPABILITY_UDMA) {
2192: WDCDEBUG_PRINT((", udamreg 0x%x",
2193: pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG)),
2194: DEBUG_PROBE);
2195: }
2196: if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_6300ESB_IDE ||
2197: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_6321ESB_IDE ||
2198: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE ||
2199: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AB_IDE ||
2200: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE ||
2201: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE ||
2202: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CAM_IDE ||
2203: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE ||
2204: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE ||
2205: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBL_IDE ||
2206: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBM_IDE ||
2207: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801EB_IDE ||
2208: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801FB_IDE ||
2209: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801GB_IDE ||
2210: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801HBM_IDE ||
2211: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82372FB_IDE) {
2212: WDCDEBUG_PRINT((", IDE_CONTROL 0x%x",
2213: pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_CONFIG)),
2214: DEBUG_PROBE);
2215: }
2216: }
2217: WDCDEBUG_PRINT(("\n"), DEBUG_PROBE);
2218: }
2219:
2220: void
2221: piix_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
2222: {
2223: struct pciide_channel *cp;
2224: int channel;
2225: u_int32_t idetim;
2226: bus_size_t cmdsize, ctlsize;
2227:
2228: pcireg_t interface = PCI_INTERFACE(pa->pa_class);
2229:
2230: printf(": DMA");
2231: pciide_mapreg_dma(sc, pa);
2232: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
2233: WDC_CAPABILITY_MODE;
2234: if (sc->sc_dma_ok) {
2235: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
2236: sc->sc_wdcdev.irqack = pciide_irqack;
2237: switch (sc->sc_pp->ide_product) {
2238: case PCI_PRODUCT_INTEL_6300ESB_IDE:
2239: case PCI_PRODUCT_INTEL_6321ESB_IDE:
2240: case PCI_PRODUCT_INTEL_82371AB_IDE:
2241: case PCI_PRODUCT_INTEL_82372FB_IDE:
2242: case PCI_PRODUCT_INTEL_82440MX_IDE:
2243: case PCI_PRODUCT_INTEL_82451NX:
2244: case PCI_PRODUCT_INTEL_82801AA_IDE:
2245: case PCI_PRODUCT_INTEL_82801AB_IDE:
2246: case PCI_PRODUCT_INTEL_82801BAM_IDE:
2247: case PCI_PRODUCT_INTEL_82801BA_IDE:
2248: case PCI_PRODUCT_INTEL_82801CAM_IDE:
2249: case PCI_PRODUCT_INTEL_82801CA_IDE:
2250: case PCI_PRODUCT_INTEL_82801DB_IDE:
2251: case PCI_PRODUCT_INTEL_82801DBL_IDE:
2252: case PCI_PRODUCT_INTEL_82801DBM_IDE:
2253: case PCI_PRODUCT_INTEL_82801EB_IDE:
2254: case PCI_PRODUCT_INTEL_82801FB_IDE:
2255: case PCI_PRODUCT_INTEL_82801GB_IDE:
2256: case PCI_PRODUCT_INTEL_82801HBM_IDE:
2257: sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
2258: break;
2259: }
2260: }
2261: sc->sc_wdcdev.PIO_cap = 4;
2262: sc->sc_wdcdev.DMA_cap = 2;
2263: switch (sc->sc_pp->ide_product) {
2264: case PCI_PRODUCT_INTEL_82801AA_IDE:
2265: case PCI_PRODUCT_INTEL_82372FB_IDE:
2266: sc->sc_wdcdev.UDMA_cap = 4;
2267: break;
2268: case PCI_PRODUCT_INTEL_6300ESB_IDE:
2269: case PCI_PRODUCT_INTEL_6321ESB_IDE:
2270: case PCI_PRODUCT_INTEL_82801BAM_IDE:
2271: case PCI_PRODUCT_INTEL_82801BA_IDE:
2272: case PCI_PRODUCT_INTEL_82801CAM_IDE:
2273: case PCI_PRODUCT_INTEL_82801CA_IDE:
2274: case PCI_PRODUCT_INTEL_82801DB_IDE:
2275: case PCI_PRODUCT_INTEL_82801DBL_IDE:
2276: case PCI_PRODUCT_INTEL_82801DBM_IDE:
2277: case PCI_PRODUCT_INTEL_82801EB_IDE:
2278: case PCI_PRODUCT_INTEL_82801FB_IDE:
2279: case PCI_PRODUCT_INTEL_82801GB_IDE:
2280: case PCI_PRODUCT_INTEL_82801HBM_IDE:
2281: sc->sc_wdcdev.UDMA_cap = 5;
2282: break;
2283: default:
2284: sc->sc_wdcdev.UDMA_cap = 2;
2285: break;
2286: }
2287:
2288: if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82371FB_IDE ||
2289: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82371FB_ISA) {
2290: sc->sc_wdcdev.set_modes = piix_setup_channel;
2291: } else {
2292: sc->sc_wdcdev.set_modes = piix3_4_setup_channel;
2293: }
2294: sc->sc_wdcdev.channels = sc->wdc_chanarray;
2295: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
2296:
2297: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
2298:
2299: piix_timing_debug(sc);
2300:
2301: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
2302: cp = &sc->pciide_channels[channel];
2303:
2304: /* PIIX is compat-only */
2305: if (pciide_chansetup(sc, channel, 0) == 0)
2306: continue;
2307: idetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM);
2308: if ((PIIX_IDETIM_READ(idetim, channel) &
2309: PIIX_IDETIM_IDE) == 0) {
2310: printf("%s: %s ignored (disabled)\n",
2311: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
2312: continue;
2313: }
2314: /* PIIX are compat-only pciide devices */
2315: pciide_map_compat_intr(pa, cp, channel, 0);
2316: if (cp->hw_ok == 0)
2317: continue;
2318: pciide_mapchan(pa, cp, 0, &cmdsize, &ctlsize, pciide_pci_intr);
2319: if (cp->hw_ok == 0)
2320: goto next;
2321: if (pciide_chan_candisable(cp)) {
2322: idetim = PIIX_IDETIM_CLEAR(idetim, PIIX_IDETIM_IDE,
2323: channel);
2324: pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM,
2325: idetim);
2326: }
2327: if (cp->hw_ok == 0)
2328: goto next;
2329: sc->sc_wdcdev.set_modes(&cp->wdc_channel);
2330: next:
2331: if (cp->hw_ok == 0)
2332: pciide_unmap_compat_intr(pa, cp, channel, 0);
2333: }
2334:
2335: piix_timing_debug(sc);
2336: }
2337:
2338: void
2339: piixsata_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
2340: {
2341: struct pciide_channel *cp;
2342: pcireg_t interface = PCI_INTERFACE(pa->pa_class);
2343: int channel;
2344: bus_size_t cmdsize, ctlsize;
2345: u_int8_t reg, ich = 0;
2346:
2347: printf(": DMA");
2348: pciide_mapreg_dma(sc, pa);
2349:
2350: if (sc->sc_dma_ok) {
2351: sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA |
2352: WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
2353: sc->sc_wdcdev.irqack = pciide_irqack;
2354: sc->sc_wdcdev.DMA_cap = 2;
2355: sc->sc_wdcdev.UDMA_cap = 6;
2356: }
2357: sc->sc_wdcdev.PIO_cap = 4;
2358:
2359: sc->sc_wdcdev.channels = sc->wdc_chanarray;
2360: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
2361: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
2362: WDC_CAPABILITY_MODE | WDC_CAPABILITY_SATA;
2363: sc->sc_wdcdev.set_modes = sata_setup_channel;
2364:
2365: switch(sc->sc_pp->ide_product) {
2366: case PCI_PRODUCT_INTEL_6300ESB_SATA:
2367: case PCI_PRODUCT_INTEL_6300ESB_SATA2:
2368: case PCI_PRODUCT_INTEL_82801EB_SATA:
2369: case PCI_PRODUCT_INTEL_82801ER_SATA:
2370: ich = 5;
2371: break;
2372: case PCI_PRODUCT_INTEL_82801FB_SATA:
2373: case PCI_PRODUCT_INTEL_82801FR_SATA:
2374: case PCI_PRODUCT_INTEL_82801FBM_SATA:
2375: ich = 6;
2376: break;
2377: default:
2378: ich = 7;
2379: break;
2380: }
2381:
2382: /*
2383: * Put the SATA portion of controllers that don't operate in combined
2384: * mode into native PCI modes so the maximum number of devices can be
2385: * used. Intel calls this "enhanced mode"
2386: */
2387: if (ich == 5) {
2388: reg = pciide_pci_read(sc->sc_pc, sc->sc_tag, ICH5_SATA_MAP);
2389: if ((reg & ICH5_SATA_MAP_COMBINED) == 0) {
2390: reg = pciide_pci_read(pa->pa_pc, pa->pa_tag,
2391: ICH5_SATA_PI);
2392: reg |= ICH5_SATA_PI_PRI_NATIVE |
2393: ICH5_SATA_PI_SEC_NATIVE;
2394: pciide_pci_write(pa->pa_pc, pa->pa_tag,
2395: ICH5_SATA_PI, reg);
2396: interface |= PCIIDE_INTERFACE_PCI(0) |
2397: PCIIDE_INTERFACE_PCI(1);
2398: }
2399: } else {
2400: reg = pciide_pci_read(sc->sc_pc, sc->sc_tag, ICH5_SATA_MAP) &
2401: ICH6_SATA_MAP_CMB_MASK;
2402: if (reg != ICH6_SATA_MAP_CMB_PRI &&
2403: reg != ICH6_SATA_MAP_CMB_SEC) {
2404: reg = pciide_pci_read(pa->pa_pc, pa->pa_tag,
2405: ICH5_SATA_PI);
2406: reg |= ICH5_SATA_PI_PRI_NATIVE |
2407: ICH5_SATA_PI_SEC_NATIVE;
2408:
2409: pciide_pci_write(pa->pa_pc, pa->pa_tag,
2410: ICH5_SATA_PI, reg);
2411: interface |= PCIIDE_INTERFACE_PCI(0) |
2412: PCIIDE_INTERFACE_PCI(1);
2413:
2414: /*
2415: * Ask for SATA IDE Mode, we don't need to do this
2416: * for the combined mode case as combined mode is
2417: * only allowed in IDE Mode
2418: */
2419: if (ich >= 7) {
2420: reg = pciide_pci_read(sc->sc_pc, sc->sc_tag,
2421: ICH5_SATA_MAP) & ~ICH7_SATA_MAP_SMS_MASK;
2422: pciide_pci_write(pa->pa_pc, pa->pa_tag,
2423: ICH5_SATA_MAP, reg);
2424: }
2425: }
2426: }
2427:
2428: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
2429:
2430: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
2431: cp = &sc->pciide_channels[channel];
2432: if (pciide_chansetup(sc, channel, interface) == 0)
2433: continue;
2434:
2435: pciide_map_compat_intr(pa, cp, channel, interface);
2436: if (cp->hw_ok == 0)
2437: continue;
2438:
2439: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
2440: pciide_pci_intr);
2441: if (cp->hw_ok != 0)
2442: sc->sc_wdcdev.set_modes(&cp->wdc_channel);
2443:
2444: if (cp->hw_ok == 0)
2445: pciide_unmap_compat_intr(pa, cp, channel, interface);
2446: }
2447: }
2448:
2449: void
2450: piix_setup_channel(struct channel_softc *chp)
2451: {
2452: u_int8_t mode[2], drive;
2453: u_int32_t oidetim, idetim, idedma_ctl;
2454: struct pciide_channel *cp = (struct pciide_channel *)chp;
2455: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
2456: struct ata_drive_datas *drvp = cp->wdc_channel.ch_drive;
2457:
2458: oidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM);
2459: idetim = PIIX_IDETIM_CLEAR(oidetim, 0xffff, chp->channel);
2460: idedma_ctl = 0;
2461:
2462: /* set up new idetim: Enable IDE registers decode */
2463: idetim = PIIX_IDETIM_SET(idetim, PIIX_IDETIM_IDE,
2464: chp->channel);
2465:
2466: /* setup DMA */
2467: pciide_channel_dma_setup(cp);
2468:
2469: /*
2470: * Here we have to mess up with drives mode: PIIX can't have
2471: * different timings for master and slave drives.
2472: * We need to find the best combination.
2473: */
2474:
2475: /* If both drives supports DMA, take the lower mode */
2476: if ((drvp[0].drive_flags & DRIVE_DMA) &&
2477: (drvp[1].drive_flags & DRIVE_DMA)) {
2478: mode[0] = mode[1] =
2479: min(drvp[0].DMA_mode, drvp[1].DMA_mode);
2480: drvp[0].DMA_mode = mode[0];
2481: drvp[1].DMA_mode = mode[1];
2482: goto ok;
2483: }
2484: /*
2485: * If only one drive supports DMA, use its mode, and
2486: * put the other one in PIO mode 0 if mode not compatible
2487: */
2488: if (drvp[0].drive_flags & DRIVE_DMA) {
2489: mode[0] = drvp[0].DMA_mode;
2490: mode[1] = drvp[1].PIO_mode;
2491: if (piix_isp_pio[mode[1]] != piix_isp_dma[mode[0]] ||
2492: piix_rtc_pio[mode[1]] != piix_rtc_dma[mode[0]])
2493: mode[1] = drvp[1].PIO_mode = 0;
2494: goto ok;
2495: }
2496: if (drvp[1].drive_flags & DRIVE_DMA) {
2497: mode[1] = drvp[1].DMA_mode;
2498: mode[0] = drvp[0].PIO_mode;
2499: if (piix_isp_pio[mode[0]] != piix_isp_dma[mode[1]] ||
2500: piix_rtc_pio[mode[0]] != piix_rtc_dma[mode[1]])
2501: mode[0] = drvp[0].PIO_mode = 0;
2502: goto ok;
2503: }
2504: /*
2505: * If both drives are not DMA, takes the lower mode, unless
2506: * one of them is PIO mode < 2
2507: */
2508: if (drvp[0].PIO_mode < 2) {
2509: mode[0] = drvp[0].PIO_mode = 0;
2510: mode[1] = drvp[1].PIO_mode;
2511: } else if (drvp[1].PIO_mode < 2) {
2512: mode[1] = drvp[1].PIO_mode = 0;
2513: mode[0] = drvp[0].PIO_mode;
2514: } else {
2515: mode[0] = mode[1] =
2516: min(drvp[1].PIO_mode, drvp[0].PIO_mode);
2517: drvp[0].PIO_mode = mode[0];
2518: drvp[1].PIO_mode = mode[1];
2519: }
2520: ok: /* The modes are setup */
2521: for (drive = 0; drive < 2; drive++) {
2522: if (drvp[drive].drive_flags & DRIVE_DMA) {
2523: idetim |= piix_setup_idetim_timings(
2524: mode[drive], 1, chp->channel);
2525: goto end;
2526: }
2527: }
2528: /* If we are there, none of the drives are DMA */
2529: if (mode[0] >= 2)
2530: idetim |= piix_setup_idetim_timings(
2531: mode[0], 0, chp->channel);
2532: else
2533: idetim |= piix_setup_idetim_timings(
2534: mode[1], 0, chp->channel);
2535: end: /*
2536: * timing mode is now set up in the controller. Enable
2537: * it per-drive
2538: */
2539: for (drive = 0; drive < 2; drive++) {
2540: /* If no drive, skip */
2541: if ((drvp[drive].drive_flags & DRIVE) == 0)
2542: continue;
2543: idetim |= piix_setup_idetim_drvs(&drvp[drive]);
2544: if (drvp[drive].drive_flags & DRIVE_DMA)
2545: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
2546: }
2547: if (idedma_ctl != 0) {
2548: /* Add software bits in status register */
2549: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
2550: IDEDMA_CTL(chp->channel),
2551: idedma_ctl);
2552: }
2553: pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM, idetim);
2554: pciide_print_modes(cp);
2555: }
2556:
2557: void
2558: piix3_4_setup_channel(struct channel_softc *chp)
2559: {
2560: struct ata_drive_datas *drvp;
2561: u_int32_t oidetim, idetim, sidetim, udmareg, ideconf, idedma_ctl;
2562: struct pciide_channel *cp = (struct pciide_channel *)chp;
2563: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
2564: int drive;
2565: int channel = chp->channel;
2566:
2567: oidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM);
2568: sidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM);
2569: udmareg = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG);
2570: ideconf = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_CONFIG);
2571: idetim = PIIX_IDETIM_CLEAR(oidetim, 0xffff, channel);
2572: sidetim &= ~(PIIX_SIDETIM_ISP_MASK(channel) |
2573: PIIX_SIDETIM_RTC_MASK(channel));
2574:
2575: idedma_ctl = 0;
2576: /* If channel disabled, no need to go further */
2577: if ((PIIX_IDETIM_READ(oidetim, channel) & PIIX_IDETIM_IDE) == 0)
2578: return;
2579: /* set up new idetim: Enable IDE registers decode */
2580: idetim = PIIX_IDETIM_SET(idetim, PIIX_IDETIM_IDE, channel);
2581:
2582: /* setup DMA if needed */
2583: pciide_channel_dma_setup(cp);
2584:
2585: for (drive = 0; drive < 2; drive++) {
2586: udmareg &= ~(PIIX_UDMACTL_DRV_EN(channel, drive) |
2587: PIIX_UDMATIM_SET(0x3, channel, drive));
2588: drvp = &chp->ch_drive[drive];
2589: /* If no drive, skip */
2590: if ((drvp->drive_flags & DRIVE) == 0)
2591: continue;
2592: if (((drvp->drive_flags & DRIVE_DMA) == 0 &&
2593: (drvp->drive_flags & DRIVE_UDMA) == 0))
2594: goto pio;
2595:
2596: if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_6300ESB_IDE ||
2597: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_6321ESB_IDE ||
2598: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE ||
2599: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AB_IDE ||
2600: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE ||
2601: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE ||
2602: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CAM_IDE ||
2603: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE ||
2604: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE ||
2605: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBL_IDE ||
2606: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBM_IDE ||
2607: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801EB_IDE ||
2608: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801FB_IDE ||
2609: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801GB_IDE ||
2610: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801HBM_IDE ||
2611: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82372FB_IDE) {
2612: ideconf |= PIIX_CONFIG_PINGPONG;
2613: }
2614: if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_6300ESB_IDE ||
2615: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_6321ESB_IDE ||
2616: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE ||
2617: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE||
2618: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CAM_IDE||
2619: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE ||
2620: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE ||
2621: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBL_IDE ||
2622: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBM_IDE ||
2623: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801EB_IDE ||
2624: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801FB_IDE ||
2625: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801GB_IDE ||
2626: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801HBM_IDE) {
2627: /* setup Ultra/100 */
2628: if (drvp->UDMA_mode > 2 &&
2629: (ideconf & PIIX_CONFIG_CR(channel, drive)) == 0)
2630: drvp->UDMA_mode = 2;
2631: if (drvp->UDMA_mode > 4) {
2632: ideconf |= PIIX_CONFIG_UDMA100(channel, drive);
2633: } else {
2634: ideconf &= ~PIIX_CONFIG_UDMA100(channel, drive);
2635: if (drvp->UDMA_mode > 2) {
2636: ideconf |= PIIX_CONFIG_UDMA66(channel,
2637: drive);
2638: } else {
2639: ideconf &= ~PIIX_CONFIG_UDMA66(channel,
2640: drive);
2641: }
2642: }
2643: }
2644: if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE ||
2645: sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82372FB_IDE) {
2646: /* setup Ultra/66 */
2647: if (drvp->UDMA_mode > 2 &&
2648: (ideconf & PIIX_CONFIG_CR(channel, drive)) == 0)
2649: drvp->UDMA_mode = 2;
2650: if (drvp->UDMA_mode > 2)
2651: ideconf |= PIIX_CONFIG_UDMA66(channel, drive);
2652: else
2653: ideconf &= ~PIIX_CONFIG_UDMA66(channel, drive);
2654: }
2655:
2656: if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) &&
2657: (drvp->drive_flags & DRIVE_UDMA)) {
2658: /* use Ultra/DMA */
2659: drvp->drive_flags &= ~DRIVE_DMA;
2660: udmareg |= PIIX_UDMACTL_DRV_EN( channel, drive);
2661: udmareg |= PIIX_UDMATIM_SET(
2662: piix4_sct_udma[drvp->UDMA_mode], channel, drive);
2663: } else {
2664: /* use Multiword DMA */
2665: drvp->drive_flags &= ~DRIVE_UDMA;
2666: if (drive == 0) {
2667: idetim |= piix_setup_idetim_timings(
2668: drvp->DMA_mode, 1, channel);
2669: } else {
2670: sidetim |= piix_setup_sidetim_timings(
2671: drvp->DMA_mode, 1, channel);
2672: idetim =PIIX_IDETIM_SET(idetim,
2673: PIIX_IDETIM_SITRE, channel);
2674: }
2675: }
2676: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
2677:
2678: pio: /* use PIO mode */
2679: idetim |= piix_setup_idetim_drvs(drvp);
2680: if (drive == 0) {
2681: idetim |= piix_setup_idetim_timings(
2682: drvp->PIO_mode, 0, channel);
2683: } else {
2684: sidetim |= piix_setup_sidetim_timings(
2685: drvp->PIO_mode, 0, channel);
2686: idetim =PIIX_IDETIM_SET(idetim,
2687: PIIX_IDETIM_SITRE, channel);
2688: }
2689: }
2690: if (idedma_ctl != 0) {
2691: /* Add software bits in status register */
2692: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
2693: IDEDMA_CTL(channel),
2694: idedma_ctl);
2695: }
2696: pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM, idetim);
2697: pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM, sidetim);
2698: pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG, udmareg);
2699: pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_CONFIG, ideconf);
2700: pciide_print_modes(cp);
2701: }
2702:
2703:
2704: /* setup ISP and RTC fields, based on mode */
2705: static u_int32_t
2706: piix_setup_idetim_timings(u_int8_t mode, u_int8_t dma, u_int8_t channel)
2707: {
2708:
2709: if (dma)
2710: return (PIIX_IDETIM_SET(0,
2711: PIIX_IDETIM_ISP_SET(piix_isp_dma[mode]) |
2712: PIIX_IDETIM_RTC_SET(piix_rtc_dma[mode]),
2713: channel));
2714: else
2715: return (PIIX_IDETIM_SET(0,
2716: PIIX_IDETIM_ISP_SET(piix_isp_pio[mode]) |
2717: PIIX_IDETIM_RTC_SET(piix_rtc_pio[mode]),
2718: channel));
2719: }
2720:
2721: /* setup DTE, PPE, IE and TIME field based on PIO mode */
2722: static u_int32_t
2723: piix_setup_idetim_drvs(struct ata_drive_datas *drvp)
2724: {
2725: u_int32_t ret = 0;
2726: struct channel_softc *chp = drvp->chnl_softc;
2727: u_int8_t channel = chp->channel;
2728: u_int8_t drive = drvp->drive;
2729:
2730: /*
2731: * If drive is using UDMA, timings setups are independant
2732: * So just check DMA and PIO here.
2733: */
2734: if (drvp->drive_flags & DRIVE_DMA) {
2735: /* if mode = DMA mode 0, use compatible timings */
2736: if ((drvp->drive_flags & DRIVE_DMA) &&
2737: drvp->DMA_mode == 0) {
2738: drvp->PIO_mode = 0;
2739: return (ret);
2740: }
2741: ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_TIME(drive), channel);
2742: /*
2743: * PIO and DMA timings are the same, use fast timings for PIO
2744: * too, else use compat timings.
2745: */
2746: if ((piix_isp_pio[drvp->PIO_mode] !=
2747: piix_isp_dma[drvp->DMA_mode]) ||
2748: (piix_rtc_pio[drvp->PIO_mode] !=
2749: piix_rtc_dma[drvp->DMA_mode]))
2750: drvp->PIO_mode = 0;
2751: /* if PIO mode <= 2, use compat timings for PIO */
2752: if (drvp->PIO_mode <= 2) {
2753: ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_DTE(drive),
2754: channel);
2755: return (ret);
2756: }
2757: }
2758:
2759: /*
2760: * Now setup PIO modes. If mode < 2, use compat timings.
2761: * Else enable fast timings. Enable IORDY and prefetch/post
2762: * if PIO mode >= 3.
2763: */
2764:
2765: if (drvp->PIO_mode < 2)
2766: return (ret);
2767:
2768: ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_TIME(drive), channel);
2769: if (drvp->PIO_mode >= 3) {
2770: ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_IE(drive), channel);
2771: ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_PPE(drive), channel);
2772: }
2773: return (ret);
2774: }
2775:
2776: /* setup values in SIDETIM registers, based on mode */
2777: static u_int32_t
2778: piix_setup_sidetim_timings(u_int8_t mode, u_int8_t dma, u_int8_t channel)
2779: {
2780: if (dma)
2781: return (PIIX_SIDETIM_ISP_SET(piix_isp_dma[mode], channel) |
2782: PIIX_SIDETIM_RTC_SET(piix_rtc_dma[mode], channel));
2783: else
2784: return (PIIX_SIDETIM_ISP_SET(piix_isp_pio[mode], channel) |
2785: PIIX_SIDETIM_RTC_SET(piix_rtc_pio[mode], channel));
2786: }
2787:
2788: void
2789: amd756_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
2790: {
2791: struct pciide_channel *cp;
2792: pcireg_t interface = PCI_INTERFACE(pa->pa_class);
2793: int channel;
2794: pcireg_t chanenable;
2795: bus_size_t cmdsize, ctlsize;
2796:
2797: printf(": DMA");
2798: pciide_mapreg_dma(sc, pa);
2799: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
2800: WDC_CAPABILITY_MODE;
2801: if (sc->sc_dma_ok) {
2802: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
2803: sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
2804: sc->sc_wdcdev.irqack = pciide_irqack;
2805: }
2806: sc->sc_wdcdev.PIO_cap = 4;
2807: sc->sc_wdcdev.DMA_cap = 2;
2808: switch (sc->sc_pp->ide_product) {
2809: case PCI_PRODUCT_AMD_8111_IDE:
2810: sc->sc_wdcdev.UDMA_cap = 6;
2811: break;
2812: case PCI_PRODUCT_AMD_766_IDE:
2813: case PCI_PRODUCT_AMD_PBC768_IDE:
2814: sc->sc_wdcdev.UDMA_cap = 5;
2815: break;
2816: default:
2817: sc->sc_wdcdev.UDMA_cap = 4;
2818: break;
2819: }
2820: sc->sc_wdcdev.set_modes = amd756_setup_channel;
2821: sc->sc_wdcdev.channels = sc->wdc_chanarray;
2822: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
2823: chanenable = pci_conf_read(sc->sc_pc, sc->sc_tag, AMD756_CHANSTATUS_EN);
2824:
2825: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
2826:
2827: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
2828: cp = &sc->pciide_channels[channel];
2829: if (pciide_chansetup(sc, channel, interface) == 0)
2830: continue;
2831:
2832: if ((chanenable & AMD756_CHAN_EN(channel)) == 0) {
2833: printf("%s: %s ignored (disabled)\n",
2834: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
2835: continue;
2836: }
2837: pciide_map_compat_intr(pa, cp, channel, interface);
2838: if (cp->hw_ok == 0)
2839: continue;
2840:
2841: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
2842: pciide_pci_intr);
2843:
2844: if (pciide_chan_candisable(cp)) {
2845: chanenable &= ~AMD756_CHAN_EN(channel);
2846: }
2847: if (cp->hw_ok == 0) {
2848: pciide_unmap_compat_intr(pa, cp, channel, interface);
2849: continue;
2850: }
2851:
2852: amd756_setup_channel(&cp->wdc_channel);
2853: }
2854: pci_conf_write(sc->sc_pc, sc->sc_tag, AMD756_CHANSTATUS_EN,
2855: chanenable);
2856: return;
2857: }
2858:
2859: void
2860: amd756_setup_channel(struct channel_softc *chp)
2861: {
2862: u_int32_t udmatim_reg, datatim_reg;
2863: u_int8_t idedma_ctl;
2864: int mode, drive;
2865: struct ata_drive_datas *drvp;
2866: struct pciide_channel *cp = (struct pciide_channel *)chp;
2867: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
2868: pcireg_t chanenable;
2869: #ifndef PCIIDE_AMD756_ENABLEDMA
2870: int product = sc->sc_pp->ide_product;
2871: int rev = sc->sc_rev;
2872: #endif
2873:
2874: idedma_ctl = 0;
2875: datatim_reg = pci_conf_read(sc->sc_pc, sc->sc_tag, AMD756_DATATIM);
2876: udmatim_reg = pci_conf_read(sc->sc_pc, sc->sc_tag, AMD756_UDMA);
2877: datatim_reg &= ~AMD756_DATATIM_MASK(chp->channel);
2878: udmatim_reg &= ~AMD756_UDMA_MASK(chp->channel);
2879: chanenable = pci_conf_read(sc->sc_pc, sc->sc_tag,
2880: AMD756_CHANSTATUS_EN);
2881:
2882: /* setup DMA if needed */
2883: pciide_channel_dma_setup(cp);
2884:
2885: for (drive = 0; drive < 2; drive++) {
2886: drvp = &chp->ch_drive[drive];
2887: /* If no drive, skip */
2888: if ((drvp->drive_flags & DRIVE) == 0)
2889: continue;
2890: /* add timing values, setup DMA if needed */
2891: if (((drvp->drive_flags & DRIVE_DMA) == 0 &&
2892: (drvp->drive_flags & DRIVE_UDMA) == 0)) {
2893: mode = drvp->PIO_mode;
2894: goto pio;
2895: }
2896: if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) &&
2897: (drvp->drive_flags & DRIVE_UDMA)) {
2898: /* use Ultra/DMA */
2899: drvp->drive_flags &= ~DRIVE_DMA;
2900:
2901: /* Check cable */
2902: if ((chanenable & AMD756_CABLE(chp->channel,
2903: drive)) == 0 && drvp->UDMA_mode > 2) {
2904: WDCDEBUG_PRINT(("%s(%s:%d:%d): 80-wire "
2905: "cable not detected\n", drvp->drive_name,
2906: sc->sc_wdcdev.sc_dev.dv_xname,
2907: chp->channel, drive), DEBUG_PROBE);
2908: drvp->UDMA_mode = 2;
2909: }
2910:
2911: udmatim_reg |= AMD756_UDMA_EN(chp->channel, drive) |
2912: AMD756_UDMA_EN_MTH(chp->channel, drive) |
2913: AMD756_UDMA_TIME(chp->channel, drive,
2914: amd756_udma_tim[drvp->UDMA_mode]);
2915: /* can use PIO timings, MW DMA unused */
2916: mode = drvp->PIO_mode;
2917: } else {
2918: /* use Multiword DMA, but only if revision is OK */
2919: drvp->drive_flags &= ~DRIVE_UDMA;
2920: #ifndef PCIIDE_AMD756_ENABLEDMA
2921: /*
2922: * The workaround doesn't seem to be necessary
2923: * with all drives, so it can be disabled by
2924: * PCIIDE_AMD756_ENABLEDMA. It causes a hard hang if
2925: * triggered.
2926: */
2927: if (AMD756_CHIPREV_DISABLEDMA(product, rev)) {
2928: printf("%s:%d:%d: multi-word DMA disabled due "
2929: "to chip revision\n",
2930: sc->sc_wdcdev.sc_dev.dv_xname,
2931: chp->channel, drive);
2932: mode = drvp->PIO_mode;
2933: drvp->drive_flags &= ~DRIVE_DMA;
2934: goto pio;
2935: }
2936: #endif
2937: /* mode = min(pio, dma+2) */
2938: if (drvp->PIO_mode <= (drvp->DMA_mode +2))
2939: mode = drvp->PIO_mode;
2940: else
2941: mode = drvp->DMA_mode + 2;
2942: }
2943: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
2944:
2945: pio: /* setup PIO mode */
2946: if (mode <= 2) {
2947: drvp->DMA_mode = 0;
2948: drvp->PIO_mode = 0;
2949: mode = 0;
2950: } else {
2951: drvp->PIO_mode = mode;
2952: drvp->DMA_mode = mode - 2;
2953: }
2954: datatim_reg |=
2955: AMD756_DATATIM_PULSE(chp->channel, drive,
2956: amd756_pio_set[mode]) |
2957: AMD756_DATATIM_RECOV(chp->channel, drive,
2958: amd756_pio_rec[mode]);
2959: }
2960: if (idedma_ctl != 0) {
2961: /* Add software bits in status register */
2962: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
2963: IDEDMA_CTL(chp->channel),
2964: idedma_ctl);
2965: }
2966: pciide_print_modes(cp);
2967: pci_conf_write(sc->sc_pc, sc->sc_tag, AMD756_DATATIM, datatim_reg);
2968: pci_conf_write(sc->sc_pc, sc->sc_tag, AMD756_UDMA, udmatim_reg);
2969: }
2970:
2971: void
2972: apollo_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
2973: {
2974: struct pciide_channel *cp;
2975: pcireg_t interface;
2976: int channel;
2977: u_int32_t ideconf;
2978: bus_size_t cmdsize, ctlsize;
2979: pcitag_t tag;
2980: pcireg_t id, class;
2981:
2982: /*
2983: * Fake interface since VT6410 is claimed to be a ``RAID'' device.
2984: */
2985: if (PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_IDE) {
2986: interface = PCI_INTERFACE(pa->pa_class);
2987: } else {
2988: interface = PCIIDE_INTERFACE_BUS_MASTER_DMA |
2989: PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1);
2990: }
2991:
2992: if ((PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_VIATECH_VT6410) ||
2993: (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_VIATECH_CX700_IDE)) {
2994: printf(": ATA133");
2995: sc->sc_wdcdev.UDMA_cap = 6;
2996: } else {
2997: /*
2998: * Determine the DMA capabilities by looking at the
2999: * ISA bridge.
3000: */
3001: tag = pci_make_tag(pa->pa_pc, pa->pa_bus, pa->pa_device, 0);
3002: id = pci_conf_read(sc->sc_pc, tag, PCI_ID_REG);
3003: class = pci_conf_read(sc->sc_pc, tag, PCI_CLASS_REG);
3004:
3005: /*
3006: * XXX On the VT8237, the ISA bridge is on a different
3007: * device.
3008: */
3009: if (PCI_CLASS(class) != PCI_CLASS_BRIDGE &&
3010: pa->pa_device == 15) {
3011: tag = pci_make_tag(pa->pa_pc, pa->pa_bus, 17, 0);
3012: id = pci_conf_read(sc->sc_pc, tag, PCI_ID_REG);
3013: class = pci_conf_read(sc->sc_pc, tag, PCI_CLASS_REG);
3014: }
3015:
3016: switch (PCI_PRODUCT(id)) {
3017: case PCI_PRODUCT_VIATECH_VT82C586_ISA:
3018: if (PCI_REVISION(class) >= 0x02) {
3019: printf(": ATA33");
3020: sc->sc_wdcdev.UDMA_cap = 2;
3021: } else {
3022: printf(": DMA");
3023: sc->sc_wdcdev.UDMA_cap = 0;
3024: }
3025: break;
3026: case PCI_PRODUCT_VIATECH_VT82C596A:
3027: if (PCI_REVISION(class) >= 0x12) {
3028: printf(": ATA66");
3029: sc->sc_wdcdev.UDMA_cap = 4;
3030: } else {
3031: printf(": ATA33");
3032: sc->sc_wdcdev.UDMA_cap = 2;
3033: }
3034: break;
3035:
3036: case PCI_PRODUCT_VIATECH_VT82C686A_ISA:
3037: if (PCI_REVISION(class) >= 0x40) {
3038: printf(": ATA100");
3039: sc->sc_wdcdev.UDMA_cap = 5;
3040: } else {
3041: printf(": ATA66");
3042: sc->sc_wdcdev.UDMA_cap = 4;
3043: }
3044: break;
3045: case PCI_PRODUCT_VIATECH_VT8231_ISA:
3046: case PCI_PRODUCT_VIATECH_VT8233_ISA:
3047: printf(": ATA100");
3048: sc->sc_wdcdev.UDMA_cap = 5;
3049: break;
3050: case PCI_PRODUCT_VIATECH_VT8233A_ISA:
3051: case PCI_PRODUCT_VIATECH_VT8235_ISA:
3052: case PCI_PRODUCT_VIATECH_VT8237_ISA:
3053: printf(": ATA133");
3054: sc->sc_wdcdev.UDMA_cap = 6;
3055: break;
3056: default:
3057: printf(": DMA");
3058: sc->sc_wdcdev.UDMA_cap = 0;
3059: break;
3060: }
3061: }
3062:
3063: pciide_mapreg_dma(sc, pa);
3064: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
3065: WDC_CAPABILITY_MODE;
3066: if (sc->sc_dma_ok) {
3067: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
3068: sc->sc_wdcdev.irqack = pciide_irqack;
3069: if (sc->sc_wdcdev.UDMA_cap > 0)
3070: sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
3071: }
3072: sc->sc_wdcdev.PIO_cap = 4;
3073: sc->sc_wdcdev.DMA_cap = 2;
3074: sc->sc_wdcdev.set_modes = apollo_setup_channel;
3075: sc->sc_wdcdev.channels = sc->wdc_chanarray;
3076: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
3077:
3078: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
3079:
3080: WDCDEBUG_PRINT(("apollo_chip_map: old APO_IDECONF=0x%x, "
3081: "APO_CTLMISC=0x%x, APO_DATATIM=0x%x, APO_UDMA=0x%x\n",
3082: pci_conf_read(sc->sc_pc, sc->sc_tag, APO_IDECONF),
3083: pci_conf_read(sc->sc_pc, sc->sc_tag, APO_CTLMISC),
3084: pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM),
3085: pci_conf_read(sc->sc_pc, sc->sc_tag, APO_UDMA)),
3086: DEBUG_PROBE);
3087:
3088: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
3089: cp = &sc->pciide_channels[channel];
3090: if (pciide_chansetup(sc, channel, interface) == 0)
3091: continue;
3092:
3093: ideconf = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_IDECONF);
3094: if ((ideconf & APO_IDECONF_EN(channel)) == 0) {
3095: printf("%s: %s ignored (disabled)\n",
3096: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
3097: continue;
3098: }
3099: pciide_map_compat_intr(pa, cp, channel, interface);
3100: if (cp->hw_ok == 0)
3101: continue;
3102:
3103: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
3104: pciide_pci_intr);
3105: if (cp->hw_ok == 0) {
3106: goto next;
3107: }
3108: if (pciide_chan_candisable(cp)) {
3109: ideconf &= ~APO_IDECONF_EN(channel);
3110: pci_conf_write(sc->sc_pc, sc->sc_tag, APO_IDECONF,
3111: ideconf);
3112: }
3113:
3114: if (cp->hw_ok == 0)
3115: goto next;
3116: apollo_setup_channel(&sc->pciide_channels[channel].wdc_channel);
3117: next:
3118: if (cp->hw_ok == 0)
3119: pciide_unmap_compat_intr(pa, cp, channel, interface);
3120: }
3121: WDCDEBUG_PRINT(("apollo_chip_map: APO_DATATIM=0x%x, APO_UDMA=0x%x\n",
3122: pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM),
3123: pci_conf_read(sc->sc_pc, sc->sc_tag, APO_UDMA)), DEBUG_PROBE);
3124: }
3125:
3126: void
3127: apollo_setup_channel(struct channel_softc *chp)
3128: {
3129: u_int32_t udmatim_reg, datatim_reg;
3130: u_int8_t idedma_ctl;
3131: int mode, drive;
3132: struct ata_drive_datas *drvp;
3133: struct pciide_channel *cp = (struct pciide_channel *)chp;
3134: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
3135:
3136: idedma_ctl = 0;
3137: datatim_reg = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM);
3138: udmatim_reg = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_UDMA);
3139: datatim_reg &= ~APO_DATATIM_MASK(chp->channel);
3140: udmatim_reg &= ~APO_UDMA_MASK(chp->channel);
3141:
3142: /* setup DMA if needed */
3143: pciide_channel_dma_setup(cp);
3144:
3145: /*
3146: * We can't mix Ultra/33 and Ultra/66 on the same channel, so
3147: * downgrade to Ultra/33 if needed
3148: */
3149: if ((chp->ch_drive[0].drive_flags & DRIVE_UDMA) &&
3150: (chp->ch_drive[1].drive_flags & DRIVE_UDMA)) {
3151: /* both drives UDMA */
3152: if (chp->ch_drive[0].UDMA_mode > 2 &&
3153: chp->ch_drive[1].UDMA_mode <= 2) {
3154: /* drive 0 Ultra/66, drive 1 Ultra/33 */
3155: chp->ch_drive[0].UDMA_mode = 2;
3156: } else if (chp->ch_drive[1].UDMA_mode > 2 &&
3157: chp->ch_drive[0].UDMA_mode <= 2) {
3158: /* drive 1 Ultra/66, drive 0 Ultra/33 */
3159: chp->ch_drive[1].UDMA_mode = 2;
3160: }
3161: }
3162:
3163: for (drive = 0; drive < 2; drive++) {
3164: drvp = &chp->ch_drive[drive];
3165: /* If no drive, skip */
3166: if ((drvp->drive_flags & DRIVE) == 0)
3167: continue;
3168: /* add timing values, setup DMA if needed */
3169: if (((drvp->drive_flags & DRIVE_DMA) == 0 &&
3170: (drvp->drive_flags & DRIVE_UDMA) == 0)) {
3171: mode = drvp->PIO_mode;
3172: goto pio;
3173: }
3174: if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) &&
3175: (drvp->drive_flags & DRIVE_UDMA)) {
3176: /* use Ultra/DMA */
3177: drvp->drive_flags &= ~DRIVE_DMA;
3178: udmatim_reg |= APO_UDMA_EN(chp->channel, drive) |
3179: APO_UDMA_EN_MTH(chp->channel, drive);
3180: if (sc->sc_wdcdev.UDMA_cap == 6) {
3181: udmatim_reg |= APO_UDMA_TIME(chp->channel,
3182: drive, apollo_udma133_tim[drvp->UDMA_mode]);
3183: } else if (sc->sc_wdcdev.UDMA_cap == 5) {
3184: /* 686b */
3185: udmatim_reg |= APO_UDMA_TIME(chp->channel,
3186: drive, apollo_udma100_tim[drvp->UDMA_mode]);
3187: } else if (sc->sc_wdcdev.UDMA_cap == 4) {
3188: /* 596b or 686a */
3189: udmatim_reg |= APO_UDMA_CLK66(chp->channel);
3190: udmatim_reg |= APO_UDMA_TIME(chp->channel,
3191: drive, apollo_udma66_tim[drvp->UDMA_mode]);
3192: } else {
3193: /* 596a or 586b */
3194: udmatim_reg |= APO_UDMA_TIME(chp->channel,
3195: drive, apollo_udma33_tim[drvp->UDMA_mode]);
3196: }
3197: /* can use PIO timings, MW DMA unused */
3198: mode = drvp->PIO_mode;
3199: } else {
3200: /* use Multiword DMA */
3201: drvp->drive_flags &= ~DRIVE_UDMA;
3202: /* mode = min(pio, dma+2) */
3203: if (drvp->PIO_mode <= (drvp->DMA_mode +2))
3204: mode = drvp->PIO_mode;
3205: else
3206: mode = drvp->DMA_mode + 2;
3207: }
3208: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
3209:
3210: pio: /* setup PIO mode */
3211: if (mode <= 2) {
3212: drvp->DMA_mode = 0;
3213: drvp->PIO_mode = 0;
3214: mode = 0;
3215: } else {
3216: drvp->PIO_mode = mode;
3217: drvp->DMA_mode = mode - 2;
3218: }
3219: datatim_reg |=
3220: APO_DATATIM_PULSE(chp->channel, drive,
3221: apollo_pio_set[mode]) |
3222: APO_DATATIM_RECOV(chp->channel, drive,
3223: apollo_pio_rec[mode]);
3224: }
3225: if (idedma_ctl != 0) {
3226: /* Add software bits in status register */
3227: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
3228: IDEDMA_CTL(chp->channel),
3229: idedma_ctl);
3230: }
3231: pciide_print_modes(cp);
3232: pci_conf_write(sc->sc_pc, sc->sc_tag, APO_DATATIM, datatim_reg);
3233: pci_conf_write(sc->sc_pc, sc->sc_tag, APO_UDMA, udmatim_reg);
3234: }
3235:
3236: void
3237: cmd_channel_map(struct pci_attach_args *pa, struct pciide_softc *sc,
3238: int channel)
3239: {
3240: struct pciide_channel *cp = &sc->pciide_channels[channel];
3241: bus_size_t cmdsize, ctlsize;
3242: u_int8_t ctrl = pciide_pci_read(sc->sc_pc, sc->sc_tag, CMD_CTRL);
3243: pcireg_t interface;
3244: int one_channel;
3245:
3246: /*
3247: * The 0648/0649 can be told to identify as a RAID controller.
3248: * In this case, we have to fake interface
3249: */
3250: if (PCI_SUBCLASS(pa->pa_class) != PCI_SUBCLASS_MASS_STORAGE_IDE) {
3251: interface = PCIIDE_INTERFACE_SETTABLE(0) |
3252: PCIIDE_INTERFACE_SETTABLE(1);
3253: if (pciide_pci_read(pa->pa_pc, pa->pa_tag, CMD_CONF) &
3254: CMD_CONF_DSA1)
3255: interface |= PCIIDE_INTERFACE_PCI(0) |
3256: PCIIDE_INTERFACE_PCI(1);
3257: } else {
3258: interface = PCI_INTERFACE(pa->pa_class);
3259: }
3260:
3261: sc->wdc_chanarray[channel] = &cp->wdc_channel;
3262: cp->name = PCIIDE_CHANNEL_NAME(channel);
3263: cp->wdc_channel.channel = channel;
3264: cp->wdc_channel.wdc = &sc->sc_wdcdev;
3265:
3266: /*
3267: * Older CMD64X doesn't have independant channels
3268: */
3269: switch (sc->sc_pp->ide_product) {
3270: case PCI_PRODUCT_CMDTECH_649:
3271: one_channel = 0;
3272: break;
3273: default:
3274: one_channel = 1;
3275: break;
3276: }
3277:
3278: if (channel > 0 && one_channel) {
3279: cp->wdc_channel.ch_queue =
3280: sc->pciide_channels[0].wdc_channel.ch_queue;
3281: } else {
3282: cp->wdc_channel.ch_queue =
3283: malloc(sizeof(struct channel_queue), M_DEVBUF, M_NOWAIT);
3284: }
3285: if (cp->wdc_channel.ch_queue == NULL) {
3286: printf(
3287: "%s: %s cannot allocate memory for command queue",
3288: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
3289: return;
3290: }
3291:
3292: /*
3293: * with a CMD PCI64x, if we get here, the first channel is enabled:
3294: * there's no way to disable the first channel without disabling
3295: * the whole device
3296: */
3297: if (channel != 0 && (ctrl & CMD_CTRL_2PORT) == 0) {
3298: printf("%s: %s ignored (disabled)\n",
3299: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
3300: return;
3301: }
3302: cp->hw_ok = 1;
3303: pciide_map_compat_intr(pa, cp, channel, interface);
3304: if (cp->hw_ok == 0)
3305: return;
3306: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize, cmd_pci_intr);
3307: if (cp->hw_ok == 0) {
3308: pciide_unmap_compat_intr(pa, cp, channel, interface);
3309: return;
3310: }
3311: if (pciide_chan_candisable(cp)) {
3312: if (channel == 1) {
3313: ctrl &= ~CMD_CTRL_2PORT;
3314: pciide_pci_write(pa->pa_pc, pa->pa_tag,
3315: CMD_CTRL, ctrl);
3316: pciide_unmap_compat_intr(pa, cp, channel, interface);
3317: }
3318: }
3319: }
3320:
3321: int
3322: cmd_pci_intr(void *arg)
3323: {
3324: struct pciide_softc *sc = arg;
3325: struct pciide_channel *cp;
3326: struct channel_softc *wdc_cp;
3327: int i, rv, crv;
3328: u_int32_t priirq, secirq;
3329:
3330: rv = 0;
3331: priirq = pciide_pci_read(sc->sc_pc, sc->sc_tag, CMD_CONF);
3332: secirq = pciide_pci_read(sc->sc_pc, sc->sc_tag, CMD_ARTTIM23);
3333: for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
3334: cp = &sc->pciide_channels[i];
3335: wdc_cp = &cp->wdc_channel;
3336: /* If a compat channel skip. */
3337: if (cp->compat)
3338: continue;
3339: if ((i == 0 && (priirq & CMD_CONF_DRV0_INTR)) ||
3340: (i == 1 && (secirq & CMD_ARTTIM23_IRQ))) {
3341: crv = wdcintr(wdc_cp);
3342: if (crv == 0) {
3343: #if 0
3344: printf("%s:%d: bogus intr\n",
3345: sc->sc_wdcdev.sc_dev.dv_xname, i);
3346: #endif
3347: } else
3348: rv = 1;
3349: }
3350: }
3351: return (rv);
3352: }
3353:
3354: void
3355: cmd_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
3356: {
3357: int channel;
3358: pcireg_t interface = PCI_INTERFACE(pa->pa_class);
3359:
3360: printf(": no DMA");
3361: sc->sc_dma_ok = 0;
3362:
3363: sc->sc_wdcdev.channels = sc->wdc_chanarray;
3364: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
3365: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16;
3366:
3367: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
3368:
3369: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
3370: cmd_channel_map(pa, sc, channel);
3371: }
3372: }
3373:
3374: void
3375: cmd0643_9_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
3376: {
3377: struct pciide_channel *cp;
3378: int channel;
3379: int rev = sc->sc_rev;
3380: pcireg_t interface;
3381:
3382: /*
3383: * The 0648/0649 can be told to identify as a RAID controller.
3384: * In this case, we have to fake interface
3385: */
3386: if (PCI_SUBCLASS(pa->pa_class) != PCI_SUBCLASS_MASS_STORAGE_IDE) {
3387: interface = PCIIDE_INTERFACE_SETTABLE(0) |
3388: PCIIDE_INTERFACE_SETTABLE(1);
3389: if (pciide_pci_read(pa->pa_pc, pa->pa_tag, CMD_CONF) &
3390: CMD_CONF_DSA1)
3391: interface |= PCIIDE_INTERFACE_PCI(0) |
3392: PCIIDE_INTERFACE_PCI(1);
3393: } else {
3394: interface = PCI_INTERFACE(pa->pa_class);
3395: }
3396:
3397: printf(": DMA");
3398: pciide_mapreg_dma(sc, pa);
3399: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
3400: WDC_CAPABILITY_MODE;
3401: if (sc->sc_dma_ok) {
3402: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
3403: switch (sc->sc_pp->ide_product) {
3404: case PCI_PRODUCT_CMDTECH_649:
3405: sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
3406: sc->sc_wdcdev.UDMA_cap = 5;
3407: sc->sc_wdcdev.irqack = cmd646_9_irqack;
3408: break;
3409: case PCI_PRODUCT_CMDTECH_648:
3410: sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
3411: sc->sc_wdcdev.UDMA_cap = 4;
3412: sc->sc_wdcdev.irqack = cmd646_9_irqack;
3413: break;
3414: case PCI_PRODUCT_CMDTECH_646:
3415: if (rev >= CMD0646U2_REV) {
3416: sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
3417: sc->sc_wdcdev.UDMA_cap = 2;
3418: } else if (rev >= CMD0646U_REV) {
3419: /*
3420: * Linux's driver claims that the 646U is broken
3421: * with UDMA. Only enable it if we know what we're
3422: * doing
3423: */
3424: #ifdef PCIIDE_CMD0646U_ENABLEUDMA
3425: sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
3426: sc->sc_wdcdev.UDMA_cap = 2;
3427: #endif
3428: /* explicitly disable UDMA */
3429: pciide_pci_write(sc->sc_pc, sc->sc_tag,
3430: CMD_UDMATIM(0), 0);
3431: pciide_pci_write(sc->sc_pc, sc->sc_tag,
3432: CMD_UDMATIM(1), 0);
3433: }
3434: sc->sc_wdcdev.irqack = cmd646_9_irqack;
3435: break;
3436: default:
3437: sc->sc_wdcdev.irqack = pciide_irqack;
3438: }
3439: }
3440:
3441: sc->sc_wdcdev.channels = sc->wdc_chanarray;
3442: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
3443: sc->sc_wdcdev.PIO_cap = 4;
3444: sc->sc_wdcdev.DMA_cap = 2;
3445: sc->sc_wdcdev.set_modes = cmd0643_9_setup_channel;
3446:
3447: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
3448:
3449: WDCDEBUG_PRINT(("cmd0643_9_chip_map: old timings reg 0x%x 0x%x\n",
3450: pci_conf_read(sc->sc_pc, sc->sc_tag, 0x54),
3451: pci_conf_read(sc->sc_pc, sc->sc_tag, 0x58)),
3452: DEBUG_PROBE);
3453: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
3454: cp = &sc->pciide_channels[channel];
3455: cmd_channel_map(pa, sc, channel);
3456: if (cp->hw_ok == 0)
3457: continue;
3458: cmd0643_9_setup_channel(&cp->wdc_channel);
3459: }
3460: /*
3461: * note - this also makes sure we clear the irq disable and reset
3462: * bits
3463: */
3464: pciide_pci_write(sc->sc_pc, sc->sc_tag, CMD_DMA_MODE, CMD_DMA_MULTIPLE);
3465: WDCDEBUG_PRINT(("cmd0643_9_chip_map: timings reg now 0x%x 0x%x\n",
3466: pci_conf_read(sc->sc_pc, sc->sc_tag, 0x54),
3467: pci_conf_read(sc->sc_pc, sc->sc_tag, 0x58)),
3468: DEBUG_PROBE);
3469: }
3470:
3471: void
3472: cmd0643_9_setup_channel(struct channel_softc *chp)
3473: {
3474: struct ata_drive_datas *drvp;
3475: u_int8_t tim;
3476: u_int32_t idedma_ctl, udma_reg;
3477: int drive;
3478: struct pciide_channel *cp = (struct pciide_channel *)chp;
3479: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
3480:
3481: idedma_ctl = 0;
3482: /* setup DMA if needed */
3483: pciide_channel_dma_setup(cp);
3484:
3485: for (drive = 0; drive < 2; drive++) {
3486: drvp = &chp->ch_drive[drive];
3487: /* If no drive, skip */
3488: if ((drvp->drive_flags & DRIVE) == 0)
3489: continue;
3490: /* add timing values, setup DMA if needed */
3491: tim = cmd0643_9_data_tim_pio[drvp->PIO_mode];
3492: if (drvp->drive_flags & (DRIVE_DMA | DRIVE_UDMA)) {
3493: if (drvp->drive_flags & DRIVE_UDMA) {
3494: /* UltraDMA on a 646U2, 0648 or 0649 */
3495: drvp->drive_flags &= ~DRIVE_DMA;
3496: udma_reg = pciide_pci_read(sc->sc_pc,
3497: sc->sc_tag, CMD_UDMATIM(chp->channel));
3498: if (drvp->UDMA_mode > 2 &&
3499: (pciide_pci_read(sc->sc_pc, sc->sc_tag,
3500: CMD_BICSR) &
3501: CMD_BICSR_80(chp->channel)) == 0) {
3502: WDCDEBUG_PRINT(("%s(%s:%d:%d): "
3503: "80-wire cable not detected\n",
3504: drvp->drive_name,
3505: sc->sc_wdcdev.sc_dev.dv_xname,
3506: chp->channel, drive), DEBUG_PROBE);
3507: drvp->UDMA_mode = 2;
3508: }
3509: if (drvp->UDMA_mode > 2)
3510: udma_reg &= ~CMD_UDMATIM_UDMA33(drive);
3511: else if (sc->sc_wdcdev.UDMA_cap > 2)
3512: udma_reg |= CMD_UDMATIM_UDMA33(drive);
3513: udma_reg |= CMD_UDMATIM_UDMA(drive);
3514: udma_reg &= ~(CMD_UDMATIM_TIM_MASK <<
3515: CMD_UDMATIM_TIM_OFF(drive));
3516: udma_reg |=
3517: (cmd0646_9_tim_udma[drvp->UDMA_mode] <<
3518: CMD_UDMATIM_TIM_OFF(drive));
3519: pciide_pci_write(sc->sc_pc, sc->sc_tag,
3520: CMD_UDMATIM(chp->channel), udma_reg);
3521: } else {
3522: /*
3523: * use Multiword DMA.
3524: * Timings will be used for both PIO and DMA,
3525: * so adjust DMA mode if needed
3526: * if we have a 0646U2/8/9, turn off UDMA
3527: */
3528: if (sc->sc_wdcdev.cap & WDC_CAPABILITY_UDMA) {
3529: udma_reg = pciide_pci_read(sc->sc_pc,
3530: sc->sc_tag,
3531: CMD_UDMATIM(chp->channel));
3532: udma_reg &= ~CMD_UDMATIM_UDMA(drive);
3533: pciide_pci_write(sc->sc_pc, sc->sc_tag,
3534: CMD_UDMATIM(chp->channel),
3535: udma_reg);
3536: }
3537: if (drvp->PIO_mode >= 3 &&
3538: (drvp->DMA_mode + 2) > drvp->PIO_mode) {
3539: drvp->DMA_mode = drvp->PIO_mode - 2;
3540: }
3541: tim = cmd0643_9_data_tim_dma[drvp->DMA_mode];
3542: }
3543: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
3544: }
3545: pciide_pci_write(sc->sc_pc, sc->sc_tag,
3546: CMD_DATA_TIM(chp->channel, drive), tim);
3547: }
3548: if (idedma_ctl != 0) {
3549: /* Add software bits in status register */
3550: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
3551: IDEDMA_CTL(chp->channel),
3552: idedma_ctl);
3553: }
3554: pciide_print_modes(cp);
3555: #ifdef __sparc64__
3556: /*
3557: * The Ultra 5 has a tendency to hang during reboot. This is due
3558: * to the PCI0646U asserting a PCI interrupt line when the chip
3559: * registers claim that it is not. Performing a reset at this
3560: * point appears to eliminate the symptoms. It is likely the
3561: * real cause is still lurking somewhere in the code.
3562: */
3563: wdcreset(chp, SILENT);
3564: #endif /* __sparc64__ */
3565: }
3566:
3567: void
3568: cmd646_9_irqack(struct channel_softc *chp)
3569: {
3570: u_int32_t priirq, secirq;
3571: struct pciide_channel *cp = (struct pciide_channel *)chp;
3572: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
3573:
3574: if (chp->channel == 0) {
3575: priirq = pciide_pci_read(sc->sc_pc, sc->sc_tag, CMD_CONF);
3576: pciide_pci_write(sc->sc_pc, sc->sc_tag, CMD_CONF, priirq);
3577: } else {
3578: secirq = pciide_pci_read(sc->sc_pc, sc->sc_tag, CMD_ARTTIM23);
3579: pciide_pci_write(sc->sc_pc, sc->sc_tag, CMD_ARTTIM23, secirq);
3580: }
3581: pciide_irqack(chp);
3582: }
3583:
3584: void
3585: cmd680_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
3586: {
3587: struct pciide_channel *cp;
3588: int channel;
3589:
3590: printf("\n%s: bus-master DMA support present",
3591: sc->sc_wdcdev.sc_dev.dv_xname);
3592: pciide_mapreg_dma(sc, pa);
3593: printf("\n");
3594: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
3595: WDC_CAPABILITY_MODE;
3596: if (sc->sc_dma_ok) {
3597: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
3598: sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
3599: sc->sc_wdcdev.UDMA_cap = 6;
3600: sc->sc_wdcdev.irqack = pciide_irqack;
3601: }
3602:
3603: sc->sc_wdcdev.channels = sc->wdc_chanarray;
3604: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
3605: sc->sc_wdcdev.PIO_cap = 4;
3606: sc->sc_wdcdev.DMA_cap = 2;
3607: sc->sc_wdcdev.set_modes = cmd680_setup_channel;
3608:
3609: pciide_pci_write(sc->sc_pc, sc->sc_tag, 0x80, 0x00);
3610: pciide_pci_write(sc->sc_pc, sc->sc_tag, 0x84, 0x00);
3611: pciide_pci_write(sc->sc_pc, sc->sc_tag, 0x8a,
3612: pciide_pci_read(sc->sc_pc, sc->sc_tag, 0x8a) | 0x01);
3613: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
3614: cp = &sc->pciide_channels[channel];
3615: cmd680_channel_map(pa, sc, channel);
3616: if (cp->hw_ok == 0)
3617: continue;
3618: cmd680_setup_channel(&cp->wdc_channel);
3619: }
3620: }
3621:
3622: void
3623: cmd680_channel_map(struct pci_attach_args *pa, struct pciide_softc *sc,
3624: int channel)
3625: {
3626: struct pciide_channel *cp = &sc->pciide_channels[channel];
3627: bus_size_t cmdsize, ctlsize;
3628: int interface, i, reg;
3629: static const u_int8_t init_val[] =
3630: { 0x8a, 0x32, 0x8a, 0x32, 0x8a, 0x32,
3631: 0x92, 0x43, 0x92, 0x43, 0x09, 0x40, 0x09, 0x40 };
3632:
3633: if (PCI_SUBCLASS(pa->pa_class) != PCI_SUBCLASS_MASS_STORAGE_IDE) {
3634: interface = PCIIDE_INTERFACE_SETTABLE(0) |
3635: PCIIDE_INTERFACE_SETTABLE(1);
3636: interface |= PCIIDE_INTERFACE_PCI(0) |
3637: PCIIDE_INTERFACE_PCI(1);
3638: } else {
3639: interface = PCI_INTERFACE(pa->pa_class);
3640: }
3641:
3642: sc->wdc_chanarray[channel] = &cp->wdc_channel;
3643: cp->name = PCIIDE_CHANNEL_NAME(channel);
3644: cp->wdc_channel.channel = channel;
3645: cp->wdc_channel.wdc = &sc->sc_wdcdev;
3646:
3647: cp->wdc_channel.ch_queue =
3648: malloc(sizeof(struct channel_queue), M_DEVBUF, M_NOWAIT);
3649: if (cp->wdc_channel.ch_queue == NULL) {
3650: printf("%s %s: "
3651: "can't allocate memory for command queue",
3652: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
3653: return;
3654: }
3655:
3656: /* XXX */
3657: reg = 0xa2 + channel * 16;
3658: for (i = 0; i < sizeof(init_val); i++)
3659: pciide_pci_write(sc->sc_pc, sc->sc_tag, reg + i, init_val[i]);
3660:
3661: printf("%s: %s %s to %s mode\n",
3662: sc->sc_wdcdev.sc_dev.dv_xname, cp->name,
3663: (interface & PCIIDE_INTERFACE_SETTABLE(channel)) ?
3664: "configured" : "wired",
3665: (interface & PCIIDE_INTERFACE_PCI(channel)) ?
3666: "native-PCI" : "compatibility");
3667:
3668: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize, pciide_pci_intr);
3669: if (cp->hw_ok == 0)
3670: return;
3671: pciide_map_compat_intr(pa, cp, channel, interface);
3672: }
3673:
3674: void
3675: cmd680_setup_channel(struct channel_softc *chp)
3676: {
3677: struct ata_drive_datas *drvp;
3678: u_int8_t mode, off, scsc;
3679: u_int16_t val;
3680: u_int32_t idedma_ctl;
3681: int drive;
3682: struct pciide_channel *cp = (struct pciide_channel *)chp;
3683: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
3684: pci_chipset_tag_t pc = sc->sc_pc;
3685: pcitag_t pa = sc->sc_tag;
3686: static const u_int8_t udma2_tbl[] =
3687: { 0x0f, 0x0b, 0x07, 0x06, 0x03, 0x02, 0x01 };
3688: static const u_int8_t udma_tbl[] =
3689: { 0x0c, 0x07, 0x05, 0x04, 0x02, 0x01, 0x00 };
3690: static const u_int16_t dma_tbl[] =
3691: { 0x2208, 0x10c2, 0x10c1 };
3692: static const u_int16_t pio_tbl[] =
3693: { 0x328a, 0x2283, 0x1104, 0x10c3, 0x10c1 };
3694:
3695: idedma_ctl = 0;
3696: pciide_channel_dma_setup(cp);
3697: mode = pciide_pci_read(pc, pa, 0x80 + chp->channel * 4);
3698:
3699: for (drive = 0; drive < 2; drive++) {
3700: drvp = &chp->ch_drive[drive];
3701: /* If no drive, skip */
3702: if ((drvp->drive_flags & DRIVE) == 0)
3703: continue;
3704: mode &= ~(0x03 << (drive * 4));
3705: if (drvp->drive_flags & DRIVE_UDMA) {
3706: drvp->drive_flags &= ~DRIVE_DMA;
3707: off = 0xa0 + chp->channel * 16;
3708: if (drvp->UDMA_mode > 2 &&
3709: (pciide_pci_read(pc, pa, off) & 0x01) == 0)
3710: drvp->UDMA_mode = 2;
3711: scsc = pciide_pci_read(pc, pa, 0x8a);
3712: if (drvp->UDMA_mode == 6 && (scsc & 0x30) == 0) {
3713: pciide_pci_write(pc, pa, 0x8a, scsc | 0x01);
3714: scsc = pciide_pci_read(pc, pa, 0x8a);
3715: if ((scsc & 0x30) == 0)
3716: drvp->UDMA_mode = 5;
3717: }
3718: mode |= 0x03 << (drive * 4);
3719: off = 0xac + chp->channel * 16 + drive * 2;
3720: val = pciide_pci_read(pc, pa, off) & ~0x3f;
3721: if (scsc & 0x30)
3722: val |= udma2_tbl[drvp->UDMA_mode];
3723: else
3724: val |= udma_tbl[drvp->UDMA_mode];
3725: pciide_pci_write(pc, pa, off, val);
3726: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
3727: } else if (drvp->drive_flags & DRIVE_DMA) {
3728: mode |= 0x02 << (drive * 4);
3729: off = 0xa8 + chp->channel * 16 + drive * 2;
3730: val = dma_tbl[drvp->DMA_mode];
3731: pciide_pci_write(pc, pa, off, val & 0xff);
3732: pciide_pci_write(pc, pa, off, val >> 8);
3733: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
3734: } else {
3735: mode |= 0x01 << (drive * 4);
3736: off = 0xa4 + chp->channel * 16 + drive * 2;
3737: val = pio_tbl[drvp->PIO_mode];
3738: pciide_pci_write(pc, pa, off, val & 0xff);
3739: pciide_pci_write(pc, pa, off, val >> 8);
3740: }
3741: }
3742:
3743: pciide_pci_write(pc, pa, 0x80 + chp->channel * 4, mode);
3744: if (idedma_ctl != 0) {
3745: /* Add software bits in status register */
3746: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
3747: IDEDMA_CTL(chp->channel),
3748: idedma_ctl);
3749: }
3750: pciide_print_modes(cp);
3751: }
3752:
3753: /*
3754: * When the Silicon Image 3112 retries a PCI memory read command,
3755: * it may retry it as a memory read multiple command under some
3756: * circumstances. This can totally confuse some PCI controllers,
3757: * so ensure that it will never do this by making sure that the
3758: * Read Threshold (FIFO Read Request Control) field of the FIFO
3759: * Valid Byte Count and Control registers for both channels (BA5
3760: * offset 0x40 and 0x44) are set to be at least as large as the
3761: * cacheline size register.
3762: */
3763: void
3764: sii_fixup_cacheline(struct pciide_softc *sc, struct pci_attach_args *pa)
3765: {
3766: pcireg_t cls, reg40, reg44;
3767:
3768: cls = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_BHLC_REG);
3769: cls = (cls >> PCI_CACHELINE_SHIFT) & PCI_CACHELINE_MASK;
3770: cls *= 4;
3771: if (cls > 224) {
3772: cls = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_BHLC_REG);
3773: cls &= ~(PCI_CACHELINE_MASK << PCI_CACHELINE_SHIFT);
3774: cls |= ((224/4) << PCI_CACHELINE_SHIFT);
3775: pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_BHLC_REG, cls);
3776: cls = 224;
3777: }
3778: if (cls < 32)
3779: cls = 32;
3780: cls = (cls + 31) / 32;
3781: reg40 = ba5_read_4(sc, 0x40);
3782: reg44 = ba5_read_4(sc, 0x44);
3783: if ((reg40 & 0x7) < cls)
3784: ba5_write_4(sc, 0x40, (reg40 & ~0x07) | cls);
3785: if ((reg44 & 0x7) < cls)
3786: ba5_write_4(sc, 0x44, (reg44 & ~0x07) | cls);
3787: }
3788:
3789: void
3790: sii3112_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
3791: {
3792: struct pciide_channel *cp;
3793: bus_size_t cmdsize, ctlsize;
3794: pcireg_t interface, scs_cmd, cfgctl;
3795: int channel;
3796: struct pciide_satalink *sl = sc->sc_cookie;
3797:
3798: /* Allocate memory for private data */
3799: sc->sc_cookie = malloc(sizeof(struct pciide_satalink), M_DEVBUF,
3800: M_NOWAIT);
3801: sl = sc->sc_cookie;
3802: bzero(sl, sizeof(*sl));
3803:
3804: #define SII3112_RESET_BITS \
3805: (SCS_CMD_PBM_RESET | SCS_CMD_ARB_RESET | \
3806: SCS_CMD_FF1_RESET | SCS_CMD_FF0_RESET | \
3807: SCS_CMD_IDE1_RESET | SCS_CMD_IDE0_RESET)
3808:
3809: /*
3810: * Reset everything and then unblock all of the interrupts.
3811: */
3812: scs_cmd = pci_conf_read(pa->pa_pc, pa->pa_tag, SII3112_SCS_CMD);
3813: pci_conf_write(pa->pa_pc, pa->pa_tag, SII3112_SCS_CMD,
3814: scs_cmd | SII3112_RESET_BITS);
3815: delay(50 * 1000);
3816: pci_conf_write(pa->pa_pc, pa->pa_tag, SII3112_SCS_CMD,
3817: scs_cmd & SCS_CMD_BA5_EN);
3818: delay(50 * 1000);
3819:
3820: if (scs_cmd & SCS_CMD_BA5_EN) {
3821: if (pci_mapreg_map(pa, PCI_MAPREG_START + 0x14,
3822: PCI_MAPREG_TYPE_MEM |
3823: PCI_MAPREG_MEM_TYPE_32BIT, 0,
3824: &sl->ba5_st, &sl->ba5_sh,
3825: NULL, NULL, 0) != 0)
3826: printf(": unable to map BA5 register space\n");
3827: else
3828: sl->ba5_en = 1;
3829: } else {
3830: cfgctl = pci_conf_read(pa->pa_pc, pa->pa_tag,
3831: SII3112_PCI_CFGCTL);
3832: pci_conf_write(pa->pa_pc, pa->pa_tag, SII3112_PCI_CFGCTL,
3833: cfgctl | CFGCTL_BA5INDEN);
3834: }
3835:
3836: printf(": DMA");
3837: pciide_mapreg_dma(sc, pa);
3838: printf("\n");
3839:
3840: /*
3841: * Rev. <= 0x01 of the 3112 have a bug that can cause data
3842: * corruption if DMA transfers cross an 8K boundary. This is
3843: * apparently hard to tickle, but we'll go ahead and play it
3844: * safe.
3845: */
3846: if (sc->sc_rev <= 0x01) {
3847: sc->sc_dma_maxsegsz = 8192;
3848: sc->sc_dma_boundary = 8192;
3849: }
3850:
3851: sii_fixup_cacheline(sc, pa);
3852:
3853: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32;
3854: sc->sc_wdcdev.PIO_cap = 4;
3855: if (sc->sc_dma_ok) {
3856: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
3857: sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
3858: sc->sc_wdcdev.irqack = pciide_irqack;
3859: sc->sc_wdcdev.DMA_cap = 2;
3860: sc->sc_wdcdev.UDMA_cap = 6;
3861: }
3862: sc->sc_wdcdev.set_modes = sii3112_setup_channel;
3863:
3864: /* We can use SControl and SStatus to probe for drives. */
3865: sc->sc_wdcdev.drv_probe = sii3112_drv_probe;
3866:
3867: sc->sc_wdcdev.channels = sc->wdc_chanarray;
3868: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
3869:
3870: /*
3871: * The 3112 either identifies itself as a RAID storage device
3872: * or a Misc storage device. Fake up the interface bits for
3873: * what our driver expects.
3874: */
3875: if (PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_IDE) {
3876: interface = PCI_INTERFACE(pa->pa_class);
3877: } else {
3878: interface = PCIIDE_INTERFACE_BUS_MASTER_DMA |
3879: PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1);
3880: }
3881:
3882: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
3883: cp = &sc->pciide_channels[channel];
3884: if (pciide_chansetup(sc, channel, interface) == 0)
3885: continue;
3886: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
3887: pciide_pci_intr);
3888: if (cp->hw_ok == 0)
3889: continue;
3890: sc->sc_wdcdev.set_modes(&cp->wdc_channel);
3891: }
3892: }
3893:
3894: void
3895: sii3112_setup_channel(struct channel_softc *chp)
3896: {
3897: struct ata_drive_datas *drvp;
3898: int drive;
3899: u_int32_t idedma_ctl, dtm;
3900: struct pciide_channel *cp = (struct pciide_channel *)chp;
3901: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
3902:
3903: /* setup DMA if needed */
3904: pciide_channel_dma_setup(cp);
3905:
3906: idedma_ctl = 0;
3907: dtm = 0;
3908:
3909: for (drive = 0; drive < 2; drive++) {
3910: drvp = &chp->ch_drive[drive];
3911: /* If no drive, skip */
3912: if ((drvp->drive_flags & DRIVE) == 0)
3913: continue;
3914: if (drvp->drive_flags & DRIVE_UDMA) {
3915: /* use Ultra/DMA */
3916: drvp->drive_flags &= ~DRIVE_DMA;
3917: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
3918: dtm |= DTM_IDEx_DMA;
3919: } else if (drvp->drive_flags & DRIVE_DMA) {
3920: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
3921: dtm |= DTM_IDEx_DMA;
3922: } else {
3923: dtm |= DTM_IDEx_PIO;
3924: }
3925: }
3926:
3927: /*
3928: * Nothing to do to setup modes; it is meaningless in S-ATA
3929: * (but many S-ATA drives still want to get the SET_FEATURE
3930: * command).
3931: */
3932: if (idedma_ctl != 0) {
3933: /* Add software bits in status register */
3934: PCIIDE_DMACTL_WRITE(sc, chp->channel, idedma_ctl);
3935: }
3936: BA5_WRITE_4(sc, chp->channel, ba5_IDE_DTM, dtm);
3937: pciide_print_modes(cp);
3938: }
3939:
3940: void
3941: sii3112_drv_probe(struct channel_softc *chp)
3942: {
3943: struct pciide_channel *cp = (struct pciide_channel *)chp;
3944: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
3945: uint32_t scontrol, sstatus;
3946: uint8_t scnt, sn, cl, ch;
3947: int i, s;
3948:
3949: /* XXX This should be done by other code. */
3950: for (i = 0; i < 2; i++) {
3951: chp->ch_drive[i].chnl_softc = chp;
3952: chp->ch_drive[i].drive = i;
3953: }
3954:
3955: /*
3956: * The 3112 is a 2-port part, and only has one drive per channel
3957: * (each port emulates a master drive).
3958: *
3959: * The 3114 is similar, but has 4 channels.
3960: */
3961:
3962: /*
3963: * Request communication initialization sequence, any speed.
3964: * Performing this is the equivalent of an ATA Reset.
3965: */
3966: scontrol = SControl_DET_INIT | SControl_SPD_ANY;
3967:
3968: /*
3969: * XXX We don't yet support SATA power management; disable all
3970: * power management state transitions.
3971: */
3972: scontrol |= SControl_IPM_NONE;
3973:
3974: BA5_WRITE_4(sc, chp->channel, ba5_SControl, scontrol);
3975: delay(50 * 1000);
3976: scontrol &= ~SControl_DET_INIT;
3977: BA5_WRITE_4(sc, chp->channel, ba5_SControl, scontrol);
3978: delay(50 * 1000);
3979:
3980: sstatus = BA5_READ_4(sc, chp->channel, ba5_SStatus);
3981: #if 0
3982: printf("%s: port %d: SStatus=0x%08x, SControl=0x%08x\n",
3983: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel, sstatus,
3984: BA5_READ_4(sc, chp->channel, ba5_SControl));
3985: #endif
3986: switch (sstatus & SStatus_DET_mask) {
3987: case SStatus_DET_NODEV:
3988: /* No device; be silent. */
3989: break;
3990:
3991: case SStatus_DET_DEV_NE:
3992: printf("%s: port %d: device connected, but "
3993: "communication not established\n",
3994: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel);
3995: break;
3996:
3997: case SStatus_DET_OFFLINE:
3998: printf("%s: port %d: PHY offline\n",
3999: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel);
4000: break;
4001:
4002: case SStatus_DET_DEV:
4003: /*
4004: * XXX ATAPI detection doesn't currently work. Don't
4005: * XXX know why. But, it's not like the standard method
4006: * XXX can detect an ATAPI device connected via a SATA/PATA
4007: * XXX bridge, so at least this is no worse. --thorpej
4008: */
4009: if (chp->_vtbl != NULL)
4010: CHP_WRITE_REG(chp, wdr_sdh, WDSD_IBM | (0 << 4));
4011: else
4012: bus_space_write_1(chp->cmd_iot, chp->cmd_ioh,
4013: wdr_sdh & _WDC_REGMASK, WDSD_IBM | (0 << 4));
4014: delay(10); /* 400ns delay */
4015: /* Save register contents. */
4016: if (chp->_vtbl != NULL) {
4017: scnt = CHP_READ_REG(chp, wdr_seccnt);
4018: sn = CHP_READ_REG(chp, wdr_sector);
4019: cl = CHP_READ_REG(chp, wdr_cyl_lo);
4020: ch = CHP_READ_REG(chp, wdr_cyl_hi);
4021: } else {
4022: scnt = bus_space_read_1(chp->cmd_iot,
4023: chp->cmd_ioh, wdr_seccnt & _WDC_REGMASK);
4024: sn = bus_space_read_1(chp->cmd_iot,
4025: chp->cmd_ioh, wdr_sector & _WDC_REGMASK);
4026: cl = bus_space_read_1(chp->cmd_iot,
4027: chp->cmd_ioh, wdr_cyl_lo & _WDC_REGMASK);
4028: ch = bus_space_read_1(chp->cmd_iot,
4029: chp->cmd_ioh, wdr_cyl_hi & _WDC_REGMASK);
4030: }
4031: #if 0
4032: printf("%s: port %d: scnt=0x%x sn=0x%x cl=0x%x ch=0x%x\n",
4033: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel,
4034: scnt, sn, cl, ch);
4035: #endif
4036: /*
4037: * scnt and sn are supposed to be 0x1 for ATAPI, but in some
4038: * cases we get wrong values here, so ignore it.
4039: */
4040: s = splbio();
4041: if (cl == 0x14 && ch == 0xeb)
4042: chp->ch_drive[0].drive_flags |= DRIVE_ATAPI;
4043: else
4044: chp->ch_drive[0].drive_flags |= DRIVE_ATA;
4045: splx(s);
4046:
4047: printf("%s: port %d: device present",
4048: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel);
4049: switch ((sstatus & SStatus_SPD_mask) >> SStatus_SPD_shift) {
4050: case 1:
4051: printf(", speed: 1.5Gb/s");
4052: break;
4053: case 2:
4054: printf(", speed: 3.0Gb/s");
4055: break;
4056: }
4057: printf("\n");
4058: break;
4059:
4060: default:
4061: printf("%s: port %d: unknown SStatus: 0x%08x\n",
4062: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel, sstatus);
4063: }
4064: }
4065:
4066: void
4067: sii3114_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
4068: {
4069: struct pciide_channel *cp;
4070: pcireg_t scs_cmd;
4071: pci_intr_handle_t intrhandle;
4072: const char *intrstr;
4073: int channel;
4074: struct pciide_satalink *sl = sc->sc_cookie;
4075:
4076: /* Allocate memory for private data */
4077: sc->sc_cookie = malloc(sizeof(struct pciide_satalink), M_DEVBUF,
4078: M_NOWAIT);
4079: sl = sc->sc_cookie;
4080: bzero(sl, sizeof(*sl));
4081:
4082: #define SII3114_RESET_BITS \
4083: (SCS_CMD_PBM_RESET | SCS_CMD_ARB_RESET | \
4084: SCS_CMD_FF1_RESET | SCS_CMD_FF0_RESET | \
4085: SCS_CMD_FF3_RESET | SCS_CMD_FF2_RESET | \
4086: SCS_CMD_IDE1_RESET | SCS_CMD_IDE0_RESET | \
4087: SCS_CMD_IDE3_RESET | SCS_CMD_IDE2_RESET)
4088:
4089: /*
4090: * Reset everything and then unblock all of the interrupts.
4091: */
4092: scs_cmd = pci_conf_read(pa->pa_pc, pa->pa_tag, SII3112_SCS_CMD);
4093: pci_conf_write(pa->pa_pc, pa->pa_tag, SII3112_SCS_CMD,
4094: scs_cmd | SII3114_RESET_BITS);
4095: delay(50 * 1000);
4096: pci_conf_write(pa->pa_pc, pa->pa_tag, SII3112_SCS_CMD,
4097: scs_cmd & SCS_CMD_M66EN);
4098: delay(50 * 1000);
4099:
4100: /*
4101: * On the 3114, the BA5 register space is always enabled. In
4102: * order to use the 3114 in any sane way, we must use this BA5
4103: * register space, and so we consider it an error if we cannot
4104: * map it.
4105: *
4106: * As a consequence of using BA5, our register mapping is different
4107: * from a normal PCI IDE controller's, and so we are unable to use
4108: * most of the common PCI IDE register mapping functions.
4109: */
4110: if (pci_mapreg_map(pa, PCI_MAPREG_START + 0x14,
4111: PCI_MAPREG_TYPE_MEM |
4112: PCI_MAPREG_MEM_TYPE_32BIT, 0,
4113: &sl->ba5_st, &sl->ba5_sh,
4114: NULL, NULL, 0) != 0) {
4115: printf(": unable to map BA5 register space\n");
4116: return;
4117: }
4118: sl->ba5_en = 1;
4119:
4120: /*
4121: * Set the Interrupt Steering bit in the IDEDMA_CMD register of
4122: * channel 2. This is required at all times for proper operation
4123: * when using the BA5 register space (otherwise interrupts from
4124: * all 4 channels won't work).
4125: */
4126: BA5_WRITE_4(sc, 2, ba5_IDEDMA_CMD, IDEDMA_CMD_INT_STEER);
4127:
4128: printf(": DMA");
4129: sii3114_mapreg_dma(sc, pa);
4130: printf("\n");
4131:
4132: sii_fixup_cacheline(sc, pa);
4133:
4134: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32;
4135: sc->sc_wdcdev.PIO_cap = 4;
4136: if (sc->sc_dma_ok) {
4137: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
4138: sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
4139: sc->sc_wdcdev.irqack = pciide_irqack;
4140: sc->sc_wdcdev.DMA_cap = 2;
4141: sc->sc_wdcdev.UDMA_cap = 6;
4142: }
4143: sc->sc_wdcdev.set_modes = sii3112_setup_channel;
4144:
4145: /* We can use SControl and SStatus to probe for drives. */
4146: sc->sc_wdcdev.drv_probe = sii3112_drv_probe;
4147:
4148: sc->sc_wdcdev.channels = sc->wdc_chanarray;
4149: sc->sc_wdcdev.nchannels = 4;
4150:
4151: /* Map and establish the interrupt handler. */
4152: if (pci_intr_map(pa, &intrhandle) != 0) {
4153: printf("%s: couldn't map native-PCI interrupt\n",
4154: sc->sc_wdcdev.sc_dev.dv_xname);
4155: return;
4156: }
4157: intrstr = pci_intr_string(pa->pa_pc, intrhandle);
4158: sc->sc_pci_ih = pci_intr_establish(pa->pa_pc, intrhandle, IPL_BIO,
4159: /* XXX */
4160: pciide_pci_intr, sc,
4161: sc->sc_wdcdev.sc_dev.dv_xname);
4162: if (sc->sc_pci_ih != NULL) {
4163: printf("%s: using %s for native-PCI interrupt\n",
4164: sc->sc_wdcdev.sc_dev.dv_xname,
4165: intrstr ? intrstr : "unknown interrupt");
4166: } else {
4167: printf("%s: couldn't establish native-PCI interrupt",
4168: sc->sc_wdcdev.sc_dev.dv_xname);
4169: if (intrstr != NULL)
4170: printf(" at %s", intrstr);
4171: printf("\n");
4172: return;
4173: }
4174:
4175: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
4176: cp = &sc->pciide_channels[channel];
4177: if (sii3114_chansetup(sc, channel) == 0)
4178: continue;
4179: sii3114_mapchan(cp);
4180: if (cp->hw_ok == 0)
4181: continue;
4182: sc->sc_wdcdev.set_modes(&cp->wdc_channel);
4183: }
4184: }
4185:
4186: void
4187: sii3114_mapreg_dma(struct pciide_softc *sc, struct pci_attach_args *pa)
4188: {
4189: struct pciide_channel *pc;
4190: int chan, reg;
4191: bus_size_t size;
4192: struct pciide_satalink *sl = sc->sc_cookie;
4193:
4194: sc->sc_wdcdev.dma_arg = sc;
4195: sc->sc_wdcdev.dma_init = pciide_dma_init;
4196: sc->sc_wdcdev.dma_start = pciide_dma_start;
4197: sc->sc_wdcdev.dma_finish = pciide_dma_finish;
4198:
4199: /*
4200: * Slice off a subregion of BA5 for each of the channel's DMA
4201: * registers.
4202: */
4203:
4204: sc->sc_dma_iot = sl->ba5_st;
4205: for (chan = 0; chan < 4; chan++) {
4206: pc = &sc->pciide_channels[chan];
4207: for (reg = 0; reg < IDEDMA_NREGS; reg++) {
4208: size = 4;
4209: if (size > (IDEDMA_SCH_OFFSET - reg))
4210: size = IDEDMA_SCH_OFFSET - reg;
4211: if (bus_space_subregion(sl->ba5_st,
4212: sl->ba5_sh,
4213: satalink_ba5_regmap[chan].ba5_IDEDMA_CMD + reg,
4214: size, &sl->regs[chan].dma_iohs[reg]) != 0) {
4215: sc->sc_dma_ok = 0;
4216: printf(": can't subregion offset "
4217: "%lu size %lu",
4218: (u_long) satalink_ba5_regmap[
4219: chan].ba5_IDEDMA_CMD + reg,
4220: (u_long) size);
4221: return;
4222: }
4223: }
4224: }
4225:
4226: sc->sc_dmacmd_read = sii3114_dmacmd_read;
4227: sc->sc_dmacmd_write = sii3114_dmacmd_write;
4228: sc->sc_dmactl_read = sii3114_dmactl_read;
4229: sc->sc_dmactl_write = sii3114_dmactl_write;
4230: sc->sc_dmatbl_write = sii3114_dmatbl_write;
4231:
4232: /* DMA registers all set up! */
4233: sc->sc_dmat = pa->pa_dmat;
4234: sc->sc_dma_ok = 1;
4235: }
4236:
4237: int
4238: sii3114_chansetup(struct pciide_softc *sc, int channel)
4239: {
4240: static const char *channel_names[] = {
4241: "port 0",
4242: "port 1",
4243: "port 2",
4244: "port 3",
4245: };
4246: struct pciide_channel *cp = &sc->pciide_channels[channel];
4247:
4248: sc->wdc_chanarray[channel] = &cp->wdc_channel;
4249:
4250: /*
4251: * We must always keep the Interrupt Steering bit set in channel 2's
4252: * IDEDMA_CMD register.
4253: */
4254: if (channel == 2)
4255: cp->idedma_cmd = IDEDMA_CMD_INT_STEER;
4256:
4257: cp->name = channel_names[channel];
4258: cp->wdc_channel.channel = channel;
4259: cp->wdc_channel.wdc = &sc->sc_wdcdev;
4260: cp->wdc_channel.ch_queue =
4261: malloc(sizeof(struct channel_queue), M_DEVBUF, M_NOWAIT);
4262: if (cp->wdc_channel.ch_queue == NULL) {
4263: printf("%s %s channel: "
4264: "can't allocate memory for command queue",
4265: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
4266: return (0);
4267: }
4268: return (1);
4269: }
4270:
4271: void
4272: sii3114_mapchan(struct pciide_channel *cp)
4273: {
4274: struct channel_softc *wdc_cp = &cp->wdc_channel;
4275: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
4276: struct pciide_satalink *sl = sc->sc_cookie;
4277: int chan = wdc_cp->channel;
4278: int i;
4279:
4280: cp->hw_ok = 0;
4281: cp->compat = 0;
4282: cp->ih = sc->sc_pci_ih;
4283:
4284: sl->regs[chan].cmd_iot = sl->ba5_st;
4285: if (bus_space_subregion(sl->ba5_st, sl->ba5_sh,
4286: satalink_ba5_regmap[chan].ba5_IDE_TF0,
4287: 9, &sl->regs[chan].cmd_baseioh) != 0) {
4288: printf("%s: couldn't subregion %s cmd base\n",
4289: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
4290: return;
4291: }
4292:
4293: sl->regs[chan].ctl_iot = sl->ba5_st;
4294: if (bus_space_subregion(sl->ba5_st, sl->ba5_sh,
4295: satalink_ba5_regmap[chan].ba5_IDE_TF8,
4296: 1, &cp->ctl_baseioh) != 0) {
4297: printf("%s: couldn't subregion %s ctl base\n",
4298: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
4299: return;
4300: }
4301: sl->regs[chan].ctl_ioh = cp->ctl_baseioh;
4302:
4303: for (i = 0; i < WDC_NREG; i++) {
4304: if (bus_space_subregion(sl->regs[chan].cmd_iot,
4305: sl->regs[chan].cmd_baseioh,
4306: i, i == 0 ? 4 : 1,
4307: &sl->regs[chan].cmd_iohs[i]) != 0) {
4308: printf("%s: couldn't subregion %s channel "
4309: "cmd regs\n",
4310: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
4311: return;
4312: }
4313: }
4314: sl->regs[chan].cmd_iohs[wdr_status & _WDC_REGMASK] =
4315: sl->regs[chan].cmd_iohs[wdr_command & _WDC_REGMASK];
4316: sl->regs[chan].cmd_iohs[wdr_features & _WDC_REGMASK] =
4317: sl->regs[chan].cmd_iohs[wdr_error & _WDC_REGMASK];
4318: wdc_cp->data32iot = wdc_cp->cmd_iot = sl->regs[chan].cmd_iot;
4319: wdc_cp->data32ioh = wdc_cp->cmd_ioh = sl->regs[chan].cmd_iohs[0];
4320: wdc_cp->_vtbl = &wdc_sii3114_vtbl;
4321: wdcattach(wdc_cp);
4322: cp->hw_ok = 1;
4323: }
4324:
4325: u_int8_t
4326: sii3114_read_reg(struct channel_softc *chp, enum wdc_regs reg)
4327: {
4328: struct pciide_channel *cp = (struct pciide_channel *)chp;
4329: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
4330: struct pciide_satalink *sl = sc->sc_cookie;
4331:
4332: if (reg & _WDC_AUX)
4333: return (bus_space_read_1(sl->regs[chp->channel].ctl_iot,
4334: sl->regs[chp->channel].ctl_ioh, reg & _WDC_REGMASK));
4335: else
4336: return (bus_space_read_1(sl->regs[chp->channel].cmd_iot,
4337: sl->regs[chp->channel].cmd_iohs[reg & _WDC_REGMASK], 0));
4338: }
4339:
4340: void
4341: sii3114_write_reg(struct channel_softc *chp, enum wdc_regs reg, u_int8_t val)
4342: {
4343: struct pciide_channel *cp = (struct pciide_channel *)chp;
4344: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
4345: struct pciide_satalink *sl = sc->sc_cookie;
4346:
4347: if (reg & _WDC_AUX)
4348: bus_space_write_1(sl->regs[chp->channel].ctl_iot,
4349: sl->regs[chp->channel].ctl_ioh, reg & _WDC_REGMASK, val);
4350: else
4351: bus_space_write_1(sl->regs[chp->channel].cmd_iot,
4352: sl->regs[chp->channel].cmd_iohs[reg & _WDC_REGMASK],
4353: 0, val);
4354: }
4355:
4356: u_int8_t
4357: sii3114_dmacmd_read(struct pciide_softc *sc, int chan)
4358: {
4359: struct pciide_satalink *sl = sc->sc_cookie;
4360:
4361: return (bus_space_read_1(sc->sc_dma_iot,
4362: sl->regs[chan].dma_iohs[IDEDMA_CMD(0)], 0));
4363: }
4364:
4365: void
4366: sii3114_dmacmd_write(struct pciide_softc *sc, int chan, u_int8_t val)
4367: {
4368: struct pciide_satalink *sl = sc->sc_cookie;
4369:
4370: bus_space_write_1(sc->sc_dma_iot,
4371: sl->regs[chan].dma_iohs[IDEDMA_CMD(0)], 0, val);
4372: }
4373:
4374: u_int8_t
4375: sii3114_dmactl_read(struct pciide_softc *sc, int chan)
4376: {
4377: struct pciide_satalink *sl = sc->sc_cookie;
4378:
4379: return (bus_space_read_1(sc->sc_dma_iot,
4380: sl->regs[chan].dma_iohs[IDEDMA_CTL(0)], 0));
4381: }
4382:
4383: void
4384: sii3114_dmactl_write(struct pciide_softc *sc, int chan, u_int8_t val)
4385: {
4386: struct pciide_satalink *sl = sc->sc_cookie;
4387:
4388: bus_space_write_1(sc->sc_dma_iot,
4389: sl->regs[chan].dma_iohs[IDEDMA_CTL(0)], 0, val);
4390: }
4391:
4392: void
4393: sii3114_dmatbl_write(struct pciide_softc *sc, int chan, u_int32_t val)
4394: {
4395: struct pciide_satalink *sl = sc->sc_cookie;
4396:
4397: bus_space_write_4(sc->sc_dma_iot,
4398: sl->regs[chan].dma_iohs[IDEDMA_TBL(0)], 0, val);
4399: }
4400:
4401: void
4402: cy693_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
4403: {
4404: struct pciide_channel *cp;
4405: pcireg_t interface = PCI_INTERFACE(pa->pa_class);
4406: bus_size_t cmdsize, ctlsize;
4407: struct pciide_cy *cy;
4408:
4409: /* Allocate memory for private data */
4410: sc->sc_cookie = malloc(sizeof(struct pciide_cy), M_DEVBUF, M_NOWAIT);
4411: cy = sc->sc_cookie;
4412: bzero(cy, sizeof(*cy));
4413:
4414: /*
4415: * this chip has 2 PCI IDE functions, one for primary and one for
4416: * secondary. So we need to call pciide_mapregs_compat() with
4417: * the real channel
4418: */
4419: if (pa->pa_function == 1) {
4420: cy->cy_compatchan = 0;
4421: } else if (pa->pa_function == 2) {
4422: cy->cy_compatchan = 1;
4423: } else {
4424: printf(": unexpected PCI function %d\n", pa->pa_function);
4425: return;
4426: }
4427:
4428: if (interface & PCIIDE_INTERFACE_BUS_MASTER_DMA) {
4429: printf(": DMA");
4430: pciide_mapreg_dma(sc, pa);
4431: } else {
4432: printf(": no DMA");
4433: sc->sc_dma_ok = 0;
4434: }
4435:
4436: cy->cy_handle = cy82c693_init(pa->pa_iot);
4437: if (cy->cy_handle == NULL) {
4438: printf(", (unable to map ctl registers)");
4439: sc->sc_dma_ok = 0;
4440: }
4441:
4442: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
4443: WDC_CAPABILITY_MODE;
4444: if (sc->sc_dma_ok) {
4445: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
4446: sc->sc_wdcdev.irqack = pciide_irqack;
4447: }
4448: sc->sc_wdcdev.PIO_cap = 4;
4449: sc->sc_wdcdev.DMA_cap = 2;
4450: sc->sc_wdcdev.set_modes = cy693_setup_channel;
4451:
4452: sc->sc_wdcdev.channels = sc->wdc_chanarray;
4453: sc->sc_wdcdev.nchannels = 1;
4454:
4455: /* Only one channel for this chip; if we are here it's enabled */
4456: cp = &sc->pciide_channels[0];
4457: sc->wdc_chanarray[0] = &cp->wdc_channel;
4458: cp->name = PCIIDE_CHANNEL_NAME(0);
4459: cp->wdc_channel.channel = 0;
4460: cp->wdc_channel.wdc = &sc->sc_wdcdev;
4461: cp->wdc_channel.ch_queue =
4462: malloc(sizeof(struct channel_queue), M_DEVBUF, M_NOWAIT);
4463: if (cp->wdc_channel.ch_queue == NULL) {
4464: printf(": cannot allocate memory for command queue\n");
4465: return;
4466: }
4467: printf(", %s %s to ", PCIIDE_CHANNEL_NAME(0),
4468: (interface & PCIIDE_INTERFACE_SETTABLE(0)) ?
4469: "configured" : "wired");
4470: if (interface & PCIIDE_INTERFACE_PCI(0)) {
4471: printf("native-PCI\n");
4472: cp->hw_ok = pciide_mapregs_native(pa, cp, &cmdsize, &ctlsize,
4473: pciide_pci_intr);
4474: } else {
4475: printf("compatibility\n");
4476: cp->hw_ok = pciide_mapregs_compat(pa, cp, cy->cy_compatchan,
4477: &cmdsize, &ctlsize);
4478: }
4479:
4480: cp->wdc_channel.data32iot = cp->wdc_channel.cmd_iot;
4481: cp->wdc_channel.data32ioh = cp->wdc_channel.cmd_ioh;
4482: pciide_map_compat_intr(pa, cp, cy->cy_compatchan, interface);
4483: if (cp->hw_ok == 0)
4484: return;
4485: wdcattach(&cp->wdc_channel);
4486: if (pciide_chan_candisable(cp)) {
4487: pci_conf_write(sc->sc_pc, sc->sc_tag,
4488: PCI_COMMAND_STATUS_REG, 0);
4489: }
4490: if (cp->hw_ok == 0) {
4491: pciide_unmap_compat_intr(pa, cp, cy->cy_compatchan,
4492: interface);
4493: return;
4494: }
4495:
4496: WDCDEBUG_PRINT(("cy693_chip_map: old timings reg 0x%x\n",
4497: pci_conf_read(sc->sc_pc, sc->sc_tag, CY_CMD_CTRL)), DEBUG_PROBE);
4498: cy693_setup_channel(&cp->wdc_channel);
4499: WDCDEBUG_PRINT(("cy693_chip_map: new timings reg 0x%x\n",
4500: pci_conf_read(sc->sc_pc, sc->sc_tag, CY_CMD_CTRL)), DEBUG_PROBE);
4501: }
4502:
4503: void
4504: cy693_setup_channel(struct channel_softc *chp)
4505: {
4506: struct ata_drive_datas *drvp;
4507: int drive;
4508: u_int32_t cy_cmd_ctrl;
4509: u_int32_t idedma_ctl;
4510: struct pciide_channel *cp = (struct pciide_channel *)chp;
4511: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
4512: int dma_mode = -1;
4513: struct pciide_cy *cy = sc->sc_cookie;
4514:
4515: cy_cmd_ctrl = idedma_ctl = 0;
4516:
4517: /* setup DMA if needed */
4518: pciide_channel_dma_setup(cp);
4519:
4520: for (drive = 0; drive < 2; drive++) {
4521: drvp = &chp->ch_drive[drive];
4522: /* If no drive, skip */
4523: if ((drvp->drive_flags & DRIVE) == 0)
4524: continue;
4525: /* add timing values, setup DMA if needed */
4526: if (drvp->drive_flags & DRIVE_DMA) {
4527: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
4528: /* use Multiword DMA */
4529: if (dma_mode == -1 || dma_mode > drvp->DMA_mode)
4530: dma_mode = drvp->DMA_mode;
4531: }
4532: cy_cmd_ctrl |= (cy_pio_pulse[drvp->PIO_mode] <<
4533: CY_CMD_CTRL_IOW_PULSE_OFF(drive));
4534: cy_cmd_ctrl |= (cy_pio_rec[drvp->PIO_mode] <<
4535: CY_CMD_CTRL_IOW_REC_OFF(drive));
4536: cy_cmd_ctrl |= (cy_pio_pulse[drvp->PIO_mode] <<
4537: CY_CMD_CTRL_IOR_PULSE_OFF(drive));
4538: cy_cmd_ctrl |= (cy_pio_rec[drvp->PIO_mode] <<
4539: CY_CMD_CTRL_IOR_REC_OFF(drive));
4540: }
4541: pci_conf_write(sc->sc_pc, sc->sc_tag, CY_CMD_CTRL, cy_cmd_ctrl);
4542: chp->ch_drive[0].DMA_mode = dma_mode;
4543: chp->ch_drive[1].DMA_mode = dma_mode;
4544:
4545: if (dma_mode == -1)
4546: dma_mode = 0;
4547:
4548: if (cy->cy_handle != NULL) {
4549: /* Note: `multiple' is implied. */
4550: cy82c693_write(cy->cy_handle,
4551: (cy->cy_compatchan == 0) ?
4552: CY_DMA_IDX_PRIMARY : CY_DMA_IDX_SECONDARY, dma_mode);
4553: }
4554:
4555: pciide_print_modes(cp);
4556:
4557: if (idedma_ctl != 0) {
4558: /* Add software bits in status register */
4559: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
4560: IDEDMA_CTL(chp->channel), idedma_ctl);
4561: }
4562: }
4563:
4564: static struct sis_hostbr_type {
4565: u_int16_t id;
4566: u_int8_t rev;
4567: u_int8_t udma_mode;
4568: char *name;
4569: u_int8_t type;
4570: #define SIS_TYPE_NOUDMA 0
4571: #define SIS_TYPE_66 1
4572: #define SIS_TYPE_100OLD 2
4573: #define SIS_TYPE_100NEW 3
4574: #define SIS_TYPE_133OLD 4
4575: #define SIS_TYPE_133NEW 5
4576: #define SIS_TYPE_SOUTH 6
4577: } sis_hostbr_type[] = {
4578: /* Most infos here are from sos@freebsd.org */
4579: {PCI_PRODUCT_SIS_530, 0x00, 4, "530", SIS_TYPE_66},
4580: #if 0
4581: /*
4582: * controllers associated to a rev 0x2 530 Host to PCI Bridge
4583: * have problems with UDMA (info provided by Christos)
4584: */
4585: {PCI_PRODUCT_SIS_530, 0x02, 0, "530 (buggy)", SIS_TYPE_NOUDMA},
4586: #endif
4587: {PCI_PRODUCT_SIS_540, 0x00, 4, "540", SIS_TYPE_66},
4588: {PCI_PRODUCT_SIS_550, 0x00, 4, "550", SIS_TYPE_66},
4589: {PCI_PRODUCT_SIS_620, 0x00, 4, "620", SIS_TYPE_66},
4590: {PCI_PRODUCT_SIS_630, 0x00, 4, "630", SIS_TYPE_66},
4591: {PCI_PRODUCT_SIS_630, 0x30, 5, "630S", SIS_TYPE_100NEW},
4592: {PCI_PRODUCT_SIS_633, 0x00, 5, "633", SIS_TYPE_100NEW},
4593: {PCI_PRODUCT_SIS_635, 0x00, 5, "635", SIS_TYPE_100NEW},
4594: {PCI_PRODUCT_SIS_640, 0x00, 4, "640", SIS_TYPE_SOUTH},
4595: {PCI_PRODUCT_SIS_645, 0x00, 6, "645", SIS_TYPE_SOUTH},
4596: {PCI_PRODUCT_SIS_646, 0x00, 6, "645DX", SIS_TYPE_SOUTH},
4597: {PCI_PRODUCT_SIS_648, 0x00, 6, "648", SIS_TYPE_SOUTH},
4598: {PCI_PRODUCT_SIS_650, 0x00, 6, "650", SIS_TYPE_SOUTH},
4599: {PCI_PRODUCT_SIS_651, 0x00, 6, "651", SIS_TYPE_SOUTH},
4600: {PCI_PRODUCT_SIS_652, 0x00, 6, "652", SIS_TYPE_SOUTH},
4601: {PCI_PRODUCT_SIS_655, 0x00, 6, "655", SIS_TYPE_SOUTH},
4602: {PCI_PRODUCT_SIS_658, 0x00, 6, "658", SIS_TYPE_SOUTH},
4603: {PCI_PRODUCT_SIS_661, 0x00, 6, "661", SIS_TYPE_SOUTH},
4604: {PCI_PRODUCT_SIS_730, 0x00, 5, "730", SIS_TYPE_100OLD},
4605: {PCI_PRODUCT_SIS_733, 0x00, 5, "733", SIS_TYPE_100NEW},
4606: {PCI_PRODUCT_SIS_735, 0x00, 5, "735", SIS_TYPE_100NEW},
4607: {PCI_PRODUCT_SIS_740, 0x00, 5, "740", SIS_TYPE_SOUTH},
4608: {PCI_PRODUCT_SIS_741, 0x00, 6, "741", SIS_TYPE_SOUTH},
4609: {PCI_PRODUCT_SIS_745, 0x00, 5, "745", SIS_TYPE_100NEW},
4610: {PCI_PRODUCT_SIS_746, 0x00, 6, "746", SIS_TYPE_SOUTH},
4611: {PCI_PRODUCT_SIS_748, 0x00, 6, "748", SIS_TYPE_SOUTH},
4612: {PCI_PRODUCT_SIS_750, 0x00, 6, "750", SIS_TYPE_SOUTH},
4613: {PCI_PRODUCT_SIS_751, 0x00, 6, "751", SIS_TYPE_SOUTH},
4614: {PCI_PRODUCT_SIS_752, 0x00, 6, "752", SIS_TYPE_SOUTH},
4615: {PCI_PRODUCT_SIS_755, 0x00, 6, "755", SIS_TYPE_SOUTH},
4616: {PCI_PRODUCT_SIS_760, 0x00, 6, "760", SIS_TYPE_SOUTH},
4617: /*
4618: * From sos@freebsd.org: the 0x961 ID will never be found in real world
4619: * {PCI_PRODUCT_SIS_961, 0x00, 6, "961", SIS_TYPE_133NEW},
4620: */
4621: {PCI_PRODUCT_SIS_962, 0x00, 6, "962", SIS_TYPE_133NEW},
4622: {PCI_PRODUCT_SIS_963, 0x00, 6, "963", SIS_TYPE_133NEW}
4623: };
4624:
4625: static struct sis_hostbr_type *sis_hostbr_type_match;
4626:
4627: int
4628: sis_hostbr_match(struct pci_attach_args *pa)
4629: {
4630: int i;
4631:
4632: if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_SIS)
4633: return (0);
4634: sis_hostbr_type_match = NULL;
4635: for (i = 0;
4636: i < sizeof(sis_hostbr_type) / sizeof(sis_hostbr_type[0]);
4637: i++) {
4638: if (PCI_PRODUCT(pa->pa_id) == sis_hostbr_type[i].id &&
4639: PCI_REVISION(pa->pa_class) >= sis_hostbr_type[i].rev)
4640: sis_hostbr_type_match = &sis_hostbr_type[i];
4641: }
4642: return (sis_hostbr_type_match != NULL);
4643: }
4644:
4645: int
4646: sis_south_match(struct pci_attach_args *pa)
4647: {
4648: return(PCI_VENDOR(pa->pa_id) == PCI_VENDOR_SIS &&
4649: PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_SIS_85C503 &&
4650: PCI_REVISION(pa->pa_class) >= 0x10);
4651: }
4652:
4653: void
4654: sis_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
4655: {
4656: struct pciide_channel *cp;
4657: int channel;
4658: u_int8_t sis_ctr0 = pciide_pci_read(sc->sc_pc, sc->sc_tag, SIS_CTRL0);
4659: pcireg_t interface = PCI_INTERFACE(pa->pa_class);
4660: int rev = sc->sc_rev;
4661: bus_size_t cmdsize, ctlsize;
4662: pcitag_t br_tag;
4663: struct pci_attach_args br_pa;
4664: struct pciide_sis *sis;
4665:
4666: /* Allocate memory for private data */
4667: sc->sc_cookie = malloc(sizeof(struct pciide_sis), M_DEVBUF, M_NOWAIT);
4668: sis = sc->sc_cookie;
4669: bzero(sis, sizeof(*sis));
4670:
4671: /* Find PCI bridge (dev 0 func 0 on the same bus) */
4672: br_tag = pci_make_tag(pa->pa_pc, pa->pa_bus, 0, 0);
4673: br_pa.pa_id = pci_conf_read(sc->sc_pc, br_tag, PCI_ID_REG);
4674: br_pa.pa_class = pci_conf_read(sc->sc_pc, br_tag, PCI_CLASS_REG);
4675: WDCDEBUG_PRINT(("%s: PCI bridge pa_id=0x%x pa_class=0x%x\n",
4676: __func__, br_pa.pa_id, br_pa.pa_class), DEBUG_PROBE);
4677:
4678: if (sis_hostbr_match(&br_pa)) {
4679: if (sis_hostbr_type_match->type == SIS_TYPE_SOUTH) {
4680: pciide_pci_write(sc->sc_pc, sc->sc_tag, SIS_REG_57,
4681: pciide_pci_read(sc->sc_pc, sc->sc_tag,
4682: SIS_REG_57) & 0x7f);
4683: if (sc->sc_pp->ide_product == SIS_PRODUCT_5518) {
4684: sis->sis_type = SIS_TYPE_133NEW;
4685: sc->sc_wdcdev.UDMA_cap =
4686: sis_hostbr_type_match->udma_mode;
4687: } else {
4688: /* Find ISA bridge (func 0 of the same dev) */
4689: br_tag = pci_make_tag(pa->pa_pc, pa->pa_bus,
4690: pa->pa_device, 0);
4691: br_pa.pa_id = pci_conf_read(sc->sc_pc,
4692: br_tag, PCI_ID_REG);
4693: br_pa.pa_class = pci_conf_read(sc->sc_pc,
4694: br_tag, PCI_CLASS_REG);
4695: WDCDEBUG_PRINT(("%s: ISA bridge "
4696: "pa_id=0x%x pa_class=0x%x\n",
4697: __func__, br_pa.pa_id, br_pa.pa_class),
4698: DEBUG_PROBE);
4699:
4700: if (sis_south_match(&br_pa)) {
4701: sis->sis_type = SIS_TYPE_133OLD;
4702: sc->sc_wdcdev.UDMA_cap =
4703: sis_hostbr_type_match->udma_mode;
4704: } else {
4705: sis->sis_type = SIS_TYPE_100NEW;
4706: sc->sc_wdcdev.UDMA_cap =
4707: sis_hostbr_type_match->udma_mode;
4708: }
4709: }
4710: } else {
4711: sis->sis_type = sis_hostbr_type_match->type;
4712: sc->sc_wdcdev.UDMA_cap =
4713: sis_hostbr_type_match->udma_mode;
4714: }
4715: printf(": %s", sis_hostbr_type_match->name);
4716: } else {
4717: printf(": 5597/5598");
4718: if (rev >= 0xd0) {
4719: sc->sc_wdcdev.UDMA_cap = 2;
4720: sis->sis_type = SIS_TYPE_66;
4721: } else {
4722: sc->sc_wdcdev.UDMA_cap = 0;
4723: sis->sis_type = SIS_TYPE_NOUDMA;
4724: }
4725: }
4726:
4727: printf(": DMA");
4728: pciide_mapreg_dma(sc, pa);
4729:
4730: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
4731: WDC_CAPABILITY_MODE;
4732: if (sc->sc_dma_ok) {
4733: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
4734: sc->sc_wdcdev.irqack = pciide_irqack;
4735: if (sis->sis_type >= SIS_TYPE_66)
4736: sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
4737: }
4738:
4739: sc->sc_wdcdev.PIO_cap = 4;
4740: sc->sc_wdcdev.DMA_cap = 2;
4741:
4742: sc->sc_wdcdev.channels = sc->wdc_chanarray;
4743: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
4744: switch (sis->sis_type) {
4745: case SIS_TYPE_NOUDMA:
4746: case SIS_TYPE_66:
4747: case SIS_TYPE_100OLD:
4748: sc->sc_wdcdev.set_modes = sis_setup_channel;
4749: pciide_pci_write(sc->sc_pc, sc->sc_tag, SIS_MISC,
4750: pciide_pci_read(sc->sc_pc, sc->sc_tag, SIS_MISC) |
4751: SIS_MISC_TIM_SEL | SIS_MISC_FIFO_SIZE | SIS_MISC_GTC);
4752: break;
4753: case SIS_TYPE_100NEW:
4754: case SIS_TYPE_133OLD:
4755: sc->sc_wdcdev.set_modes = sis_setup_channel;
4756: pciide_pci_write(sc->sc_pc, sc->sc_tag, SIS_REG_49,
4757: pciide_pci_read(sc->sc_pc, sc->sc_tag, SIS_REG_49) | 0x01);
4758: break;
4759: case SIS_TYPE_133NEW:
4760: sc->sc_wdcdev.set_modes = sis96x_setup_channel;
4761: pciide_pci_write(sc->sc_pc, sc->sc_tag, SIS_REG_50,
4762: pciide_pci_read(sc->sc_pc, sc->sc_tag, SIS_REG_50) & 0xf7);
4763: pciide_pci_write(sc->sc_pc, sc->sc_tag, SIS_REG_52,
4764: pciide_pci_read(sc->sc_pc, sc->sc_tag, SIS_REG_52) & 0xf7);
4765: break;
4766: }
4767:
4768: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
4769:
4770: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
4771: cp = &sc->pciide_channels[channel];
4772: if (pciide_chansetup(sc, channel, interface) == 0)
4773: continue;
4774: if ((channel == 0 && (sis_ctr0 & SIS_CTRL0_CHAN0_EN) == 0) ||
4775: (channel == 1 && (sis_ctr0 & SIS_CTRL0_CHAN1_EN) == 0)) {
4776: printf("%s: %s ignored (disabled)\n",
4777: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
4778: continue;
4779: }
4780: pciide_map_compat_intr(pa, cp, channel, interface);
4781: if (cp->hw_ok == 0)
4782: continue;
4783: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
4784: pciide_pci_intr);
4785: if (cp->hw_ok == 0) {
4786: pciide_unmap_compat_intr(pa, cp, channel, interface);
4787: continue;
4788: }
4789: if (pciide_chan_candisable(cp)) {
4790: if (channel == 0)
4791: sis_ctr0 &= ~SIS_CTRL0_CHAN0_EN;
4792: else
4793: sis_ctr0 &= ~SIS_CTRL0_CHAN1_EN;
4794: pciide_pci_write(sc->sc_pc, sc->sc_tag, SIS_CTRL0,
4795: sis_ctr0);
4796: }
4797: if (cp->hw_ok == 0) {
4798: pciide_unmap_compat_intr(pa, cp, channel, interface);
4799: continue;
4800: }
4801: sc->sc_wdcdev.set_modes(&cp->wdc_channel);
4802: }
4803: }
4804:
4805: void
4806: sis96x_setup_channel(struct channel_softc *chp)
4807: {
4808: struct ata_drive_datas *drvp;
4809: int drive;
4810: u_int32_t sis_tim;
4811: u_int32_t idedma_ctl;
4812: int regtim;
4813: struct pciide_channel *cp = (struct pciide_channel *)chp;
4814: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
4815:
4816: sis_tim = 0;
4817: idedma_ctl = 0;
4818: /* setup DMA if needed */
4819: pciide_channel_dma_setup(cp);
4820:
4821: for (drive = 0; drive < 2; drive++) {
4822: regtim = SIS_TIM133(
4823: pciide_pci_read(sc->sc_pc, sc->sc_tag, SIS_REG_57),
4824: chp->channel, drive);
4825: drvp = &chp->ch_drive[drive];
4826: /* If no drive, skip */
4827: if ((drvp->drive_flags & DRIVE) == 0)
4828: continue;
4829: /* add timing values, setup DMA if needed */
4830: if (drvp->drive_flags & DRIVE_UDMA) {
4831: /* use Ultra/DMA */
4832: drvp->drive_flags &= ~DRIVE_DMA;
4833: if (pciide_pci_read(sc->sc_pc, sc->sc_tag,
4834: SIS96x_REG_CBL(chp->channel)) & SIS96x_REG_CBL_33) {
4835: if (drvp->UDMA_mode > 2)
4836: drvp->UDMA_mode = 2;
4837: }
4838: sis_tim |= sis_udma133new_tim[drvp->UDMA_mode];
4839: sis_tim |= sis_pio133new_tim[drvp->PIO_mode];
4840: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
4841: } else if (drvp->drive_flags & DRIVE_DMA) {
4842: /*
4843: * use Multiword DMA
4844: * Timings will be used for both PIO and DMA,
4845: * so adjust DMA mode if needed
4846: */
4847: if (drvp->PIO_mode > (drvp->DMA_mode + 2))
4848: drvp->PIO_mode = drvp->DMA_mode + 2;
4849: if (drvp->DMA_mode + 2 > (drvp->PIO_mode))
4850: drvp->DMA_mode = (drvp->PIO_mode > 2) ?
4851: drvp->PIO_mode - 2 : 0;
4852: sis_tim |= sis_dma133new_tim[drvp->DMA_mode];
4853: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
4854: } else {
4855: sis_tim |= sis_pio133new_tim[drvp->PIO_mode];
4856: }
4857: WDCDEBUG_PRINT(("sis96x_setup_channel: new timings reg for "
4858: "channel %d drive %d: 0x%x (reg 0x%x)\n",
4859: chp->channel, drive, sis_tim, regtim), DEBUG_PROBE);
4860: pci_conf_write(sc->sc_pc, sc->sc_tag, regtim, sis_tim);
4861: }
4862: if (idedma_ctl != 0) {
4863: /* Add software bits in status register */
4864: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
4865: IDEDMA_CTL(chp->channel), idedma_ctl);
4866: }
4867: pciide_print_modes(cp);
4868: }
4869:
4870: void
4871: sis_setup_channel(struct channel_softc *chp)
4872: {
4873: struct ata_drive_datas *drvp;
4874: int drive;
4875: u_int32_t sis_tim;
4876: u_int32_t idedma_ctl;
4877: struct pciide_channel *cp = (struct pciide_channel *)chp;
4878: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
4879: struct pciide_sis *sis = sc->sc_cookie;
4880:
4881: WDCDEBUG_PRINT(("sis_setup_channel: old timings reg for "
4882: "channel %d 0x%x\n", chp->channel,
4883: pci_conf_read(sc->sc_pc, sc->sc_tag, SIS_TIM(chp->channel))),
4884: DEBUG_PROBE);
4885: sis_tim = 0;
4886: idedma_ctl = 0;
4887: /* setup DMA if needed */
4888: pciide_channel_dma_setup(cp);
4889:
4890: for (drive = 0; drive < 2; drive++) {
4891: drvp = &chp->ch_drive[drive];
4892: /* If no drive, skip */
4893: if ((drvp->drive_flags & DRIVE) == 0)
4894: continue;
4895: /* add timing values, setup DMA if needed */
4896: if ((drvp->drive_flags & DRIVE_DMA) == 0 &&
4897: (drvp->drive_flags & DRIVE_UDMA) == 0)
4898: goto pio;
4899:
4900: if (drvp->drive_flags & DRIVE_UDMA) {
4901: /* use Ultra/DMA */
4902: drvp->drive_flags &= ~DRIVE_DMA;
4903: if (pciide_pci_read(sc->sc_pc, sc->sc_tag,
4904: SIS_REG_CBL) & SIS_REG_CBL_33(chp->channel)) {
4905: if (drvp->UDMA_mode > 2)
4906: drvp->UDMA_mode = 2;
4907: }
4908: switch (sis->sis_type) {
4909: case SIS_TYPE_66:
4910: case SIS_TYPE_100OLD:
4911: sis_tim |= sis_udma66_tim[drvp->UDMA_mode] <<
4912: SIS_TIM66_UDMA_TIME_OFF(drive);
4913: break;
4914: case SIS_TYPE_100NEW:
4915: sis_tim |=
4916: sis_udma100new_tim[drvp->UDMA_mode] <<
4917: SIS_TIM100_UDMA_TIME_OFF(drive);
4918: break;
4919: case SIS_TYPE_133OLD:
4920: sis_tim |=
4921: sis_udma133old_tim[drvp->UDMA_mode] <<
4922: SIS_TIM100_UDMA_TIME_OFF(drive);
4923: break;
4924: default:
4925: printf("unknown SiS IDE type %d\n",
4926: sis->sis_type);
4927: }
4928: } else {
4929: /*
4930: * use Multiword DMA
4931: * Timings will be used for both PIO and DMA,
4932: * so adjust DMA mode if needed
4933: */
4934: if (drvp->PIO_mode > (drvp->DMA_mode + 2))
4935: drvp->PIO_mode = drvp->DMA_mode + 2;
4936: if (drvp->DMA_mode + 2 > (drvp->PIO_mode))
4937: drvp->DMA_mode = (drvp->PIO_mode > 2) ?
4938: drvp->PIO_mode - 2 : 0;
4939: if (drvp->DMA_mode == 0)
4940: drvp->PIO_mode = 0;
4941: }
4942: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
4943: pio: switch (sis->sis_type) {
4944: case SIS_TYPE_NOUDMA:
4945: case SIS_TYPE_66:
4946: case SIS_TYPE_100OLD:
4947: sis_tim |= sis_pio_act[drvp->PIO_mode] <<
4948: SIS_TIM66_ACT_OFF(drive);
4949: sis_tim |= sis_pio_rec[drvp->PIO_mode] <<
4950: SIS_TIM66_REC_OFF(drive);
4951: break;
4952: case SIS_TYPE_100NEW:
4953: case SIS_TYPE_133OLD:
4954: sis_tim |= sis_pio_act[drvp->PIO_mode] <<
4955: SIS_TIM100_ACT_OFF(drive);
4956: sis_tim |= sis_pio_rec[drvp->PIO_mode] <<
4957: SIS_TIM100_REC_OFF(drive);
4958: break;
4959: default:
4960: printf("unknown SiS IDE type %d\n",
4961: sis->sis_type);
4962: }
4963: }
4964: WDCDEBUG_PRINT(("sis_setup_channel: new timings reg for "
4965: "channel %d 0x%x\n", chp->channel, sis_tim), DEBUG_PROBE);
4966: pci_conf_write(sc->sc_pc, sc->sc_tag, SIS_TIM(chp->channel), sis_tim);
4967: if (idedma_ctl != 0) {
4968: /* Add software bits in status register */
4969: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
4970: IDEDMA_CTL(chp->channel), idedma_ctl);
4971: }
4972: pciide_print_modes(cp);
4973: }
4974:
4975: void
4976: natsemi_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
4977: {
4978: struct pciide_channel *cp;
4979: int channel;
4980: pcireg_t interface, ctl;
4981: bus_size_t cmdsize, ctlsize;
4982:
4983: printf(": DMA");
4984: pciide_mapreg_dma(sc, pa);
4985: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16;
4986:
4987: if (sc->sc_dma_ok) {
4988: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
4989: sc->sc_wdcdev.irqack = natsemi_irqack;
4990: }
4991:
4992: pciide_pci_write(sc->sc_pc, sc->sc_tag, NATSEMI_CCBT, 0xb7);
4993:
4994: /*
4995: * Mask off interrupts from both channels, appropriate channel(s)
4996: * will be unmasked later.
4997: */
4998: pciide_pci_write(sc->sc_pc, sc->sc_tag, NATSEMI_CTRL2,
4999: pciide_pci_read(sc->sc_pc, sc->sc_tag, NATSEMI_CTRL2) |
5000: NATSEMI_CHMASK(0) | NATSEMI_CHMASK(1));
5001:
5002: sc->sc_wdcdev.PIO_cap = 4;
5003: sc->sc_wdcdev.DMA_cap = 2;
5004: sc->sc_wdcdev.set_modes = natsemi_setup_channel;
5005: sc->sc_wdcdev.channels = sc->wdc_chanarray;
5006: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
5007:
5008: interface = PCI_INTERFACE(pci_conf_read(sc->sc_pc, sc->sc_tag,
5009: PCI_CLASS_REG));
5010: interface &= ~PCIIDE_CHANSTATUS_EN; /* Reserved on PC87415 */
5011: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
5012:
5013: /* If we're in PCIIDE mode, unmask INTA, otherwise mask it. */
5014: ctl = pciide_pci_read(sc->sc_pc, sc->sc_tag, NATSEMI_CTRL1);
5015: if (interface & (PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1)))
5016: ctl &= ~NATSEMI_CTRL1_INTAMASK;
5017: else
5018: ctl |= NATSEMI_CTRL1_INTAMASK;
5019: pciide_pci_write(sc->sc_pc, sc->sc_tag, NATSEMI_CTRL1, ctl);
5020:
5021: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
5022: cp = &sc->pciide_channels[channel];
5023: if (pciide_chansetup(sc, channel, interface) == 0)
5024: continue;
5025:
5026: pciide_map_compat_intr(pa, cp, channel, interface);
5027: if (cp->hw_ok == 0)
5028: continue;
5029:
5030: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
5031: natsemi_pci_intr);
5032: if (cp->hw_ok == 0) {
5033: pciide_unmap_compat_intr(pa, cp, channel, interface);
5034: continue;
5035: }
5036: natsemi_setup_channel(&cp->wdc_channel);
5037: }
5038: }
5039:
5040: void
5041: natsemi_setup_channel(struct channel_softc *chp)
5042: {
5043: struct ata_drive_datas *drvp;
5044: int drive, ndrives = 0;
5045: u_int32_t idedma_ctl = 0;
5046: struct pciide_channel *cp = (struct pciide_channel *)chp;
5047: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
5048: u_int8_t tim;
5049:
5050: /* setup DMA if needed */
5051: pciide_channel_dma_setup(cp);
5052:
5053: for (drive = 0; drive < 2; drive++) {
5054: drvp = &chp->ch_drive[drive];
5055: /* If no drive, skip */
5056: if ((drvp->drive_flags & DRIVE) == 0)
5057: continue;
5058:
5059: ndrives++;
5060: /* add timing values, setup DMA if needed */
5061: if ((drvp->drive_flags & DRIVE_DMA) == 0) {
5062: tim = natsemi_pio_pulse[drvp->PIO_mode] |
5063: (natsemi_pio_recover[drvp->PIO_mode] << 4);
5064: } else {
5065: /*
5066: * use Multiword DMA
5067: * Timings will be used for both PIO and DMA,
5068: * so adjust DMA mode if needed
5069: */
5070: if (drvp->PIO_mode >= 3 &&
5071: (drvp->DMA_mode + 2) > drvp->PIO_mode) {
5072: drvp->DMA_mode = drvp->PIO_mode - 2;
5073: }
5074: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
5075: tim = natsemi_dma_pulse[drvp->DMA_mode] |
5076: (natsemi_dma_recover[drvp->DMA_mode] << 4);
5077: }
5078:
5079: pciide_pci_write(sc->sc_pc, sc->sc_tag,
5080: NATSEMI_RTREG(chp->channel, drive), tim);
5081: pciide_pci_write(sc->sc_pc, sc->sc_tag,
5082: NATSEMI_WTREG(chp->channel, drive), tim);
5083: }
5084: if (idedma_ctl != 0) {
5085: /* Add software bits in status register */
5086: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5087: IDEDMA_CTL(chp->channel), idedma_ctl);
5088: }
5089: if (ndrives > 0) {
5090: /* Unmask the channel if at least one drive is found */
5091: pciide_pci_write(sc->sc_pc, sc->sc_tag, NATSEMI_CTRL2,
5092: pciide_pci_read(sc->sc_pc, sc->sc_tag, NATSEMI_CTRL2) &
5093: ~(NATSEMI_CHMASK(chp->channel)));
5094: }
5095:
5096: pciide_print_modes(cp);
5097:
5098: /* Go ahead and ack interrupts generated during probe. */
5099: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5100: IDEDMA_CTL(chp->channel),
5101: bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5102: IDEDMA_CTL(chp->channel)));
5103: }
5104:
5105: void
5106: natsemi_irqack(struct channel_softc *chp)
5107: {
5108: struct pciide_channel *cp = (struct pciide_channel *)chp;
5109: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
5110: u_int8_t clr;
5111:
5112: /* The "clear" bits are in the wrong register *sigh* */
5113: clr = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5114: IDEDMA_CMD(chp->channel));
5115: clr |= bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5116: IDEDMA_CTL(chp->channel)) &
5117: (IDEDMA_CTL_ERR | IDEDMA_CTL_INTR);
5118: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5119: IDEDMA_CMD(chp->channel), clr);
5120: }
5121:
5122: int
5123: natsemi_pci_intr(void *arg)
5124: {
5125: struct pciide_softc *sc = arg;
5126: struct pciide_channel *cp;
5127: struct channel_softc *wdc_cp;
5128: int i, rv, crv;
5129: u_int8_t msk;
5130:
5131: rv = 0;
5132: msk = pciide_pci_read(sc->sc_pc, sc->sc_tag, NATSEMI_CTRL2);
5133: for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
5134: cp = &sc->pciide_channels[i];
5135: wdc_cp = &cp->wdc_channel;
5136:
5137: /* If a compat channel skip. */
5138: if (cp->compat)
5139: continue;
5140:
5141: /* If this channel is masked, skip it. */
5142: if (msk & NATSEMI_CHMASK(i))
5143: continue;
5144:
5145: if (pciide_intr_flag(cp) == 0)
5146: continue;
5147:
5148: crv = wdcintr(wdc_cp);
5149: if (crv == 0)
5150: ; /* leave rv alone */
5151: else if (crv == 1)
5152: rv = 1; /* claim the intr */
5153: else if (rv == 0) /* crv should be -1 in this case */
5154: rv = crv; /* if we've done no better, take it */
5155: }
5156: return (rv);
5157: }
5158:
5159: void
5160: ns_scx200_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
5161: {
5162: struct pciide_channel *cp;
5163: int channel;
5164: pcireg_t interface = PCI_INTERFACE(pa->pa_class);
5165: bus_size_t cmdsize, ctlsize;
5166:
5167: printf(": DMA");
5168: pciide_mapreg_dma(sc, pa);
5169:
5170: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
5171: WDC_CAPABILITY_MODE;
5172: if (sc->sc_dma_ok) {
5173: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
5174: sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
5175: sc->sc_wdcdev.irqack = pciide_irqack;
5176: }
5177: sc->sc_wdcdev.PIO_cap = 4;
5178: sc->sc_wdcdev.DMA_cap = 2;
5179: sc->sc_wdcdev.UDMA_cap = 2;
5180:
5181: sc->sc_wdcdev.set_modes = ns_scx200_setup_channel;
5182: sc->sc_wdcdev.channels = sc->wdc_chanarray;
5183: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
5184:
5185: /*
5186: * Soekris net4801 errata 0003:
5187: *
5188: * The SC1100 built in busmaster IDE controller is pretty standard,
5189: * but have two bugs: data transfers need to be dword aligned and
5190: * it cannot do an exact 64Kbyte data transfer.
5191: *
5192: * Assume that reducing maximum segment size by one page
5193: * will be enough, and restrict boundary too for extra certainty.
5194: */
5195: if (sc->sc_pp->ide_product == PCI_PRODUCT_NS_SCx200_IDE) {
5196: sc->sc_dma_maxsegsz = IDEDMA_BYTE_COUNT_MAX - PAGE_SIZE;
5197: sc->sc_dma_boundary = IDEDMA_BYTE_COUNT_MAX - PAGE_SIZE;
5198: }
5199:
5200: /*
5201: * This chip seems to be unable to do one-sector transfers
5202: * using DMA.
5203: */
5204: sc->sc_wdcdev.quirks = WDC_QUIRK_NOSHORTDMA;
5205:
5206: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
5207:
5208: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
5209: cp = &sc->pciide_channels[channel];
5210: if (pciide_chansetup(sc, channel, interface) == 0)
5211: continue;
5212: pciide_map_compat_intr(pa, cp, channel, interface);
5213: if (cp->hw_ok == 0)
5214: continue;
5215: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
5216: pciide_pci_intr);
5217: if (cp->hw_ok == 0) {
5218: pciide_unmap_compat_intr(pa, cp, channel, interface);
5219: continue;
5220: }
5221: sc->sc_wdcdev.set_modes(&cp->wdc_channel);
5222: }
5223: }
5224:
5225: void
5226: ns_scx200_setup_channel(struct channel_softc *chp)
5227: {
5228: struct ata_drive_datas *drvp;
5229: int drive, mode;
5230: u_int32_t idedma_ctl;
5231: struct pciide_channel *cp = (struct pciide_channel*)chp;
5232: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
5233: int channel = chp->channel;
5234: int pioformat;
5235: pcireg_t piotim, dmatim;
5236:
5237: /* Setup DMA if needed */
5238: pciide_channel_dma_setup(cp);
5239:
5240: idedma_ctl = 0;
5241:
5242: pioformat = (pci_conf_read(sc->sc_pc, sc->sc_tag,
5243: SCx200_TIM_DMA(0, 0)) >> SCx200_PIOFORMAT_SHIFT) & 0x01;
5244: WDCDEBUG_PRINT(("%s: pio format %d\n", __func__, pioformat),
5245: DEBUG_PROBE);
5246:
5247: /* Per channel settings */
5248: for (drive = 0; drive < 2; drive++) {
5249: drvp = &chp->ch_drive[drive];
5250:
5251: /* If no drive, skip */
5252: if ((drvp->drive_flags & DRIVE) == 0)
5253: continue;
5254:
5255: piotim = pci_conf_read(sc->sc_pc, sc->sc_tag,
5256: SCx200_TIM_PIO(channel, drive));
5257: dmatim = pci_conf_read(sc->sc_pc, sc->sc_tag,
5258: SCx200_TIM_DMA(channel, drive));
5259: WDCDEBUG_PRINT(("%s:%d:%d: piotim=0x%x, dmatim=0x%x\n",
5260: sc->sc_wdcdev.sc_dev.dv_xname, channel, drive,
5261: piotim, dmatim), DEBUG_PROBE);
5262:
5263: if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) != 0 &&
5264: (drvp->drive_flags & DRIVE_UDMA) != 0) {
5265: /* Setup UltraDMA mode */
5266: drvp->drive_flags &= ~DRIVE_DMA;
5267: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
5268: dmatim = scx200_udma33[drvp->UDMA_mode];
5269: mode = drvp->PIO_mode;
5270: } else if ((chp->wdc->cap & WDC_CAPABILITY_DMA) != 0 &&
5271: (drvp->drive_flags & DRIVE_DMA) != 0) {
5272: /* Setup multiword DMA mode */
5273: drvp->drive_flags &= ~DRIVE_UDMA;
5274: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
5275: dmatim = scx200_dma33[drvp->DMA_mode];
5276:
5277: /* mode = min(pio, dma + 2) */
5278: if (drvp->PIO_mode <= (drvp->DMA_mode + 2))
5279: mode = drvp->PIO_mode;
5280: else
5281: mode = drvp->DMA_mode + 2;
5282: } else {
5283: mode = drvp->PIO_mode;
5284: }
5285:
5286: /* Setup PIO mode */
5287: drvp->PIO_mode = mode;
5288: if (mode < 2)
5289: drvp->DMA_mode = 0;
5290: else
5291: drvp->DMA_mode = mode - 2;
5292:
5293: piotim = scx200_pio33[pioformat][drvp->PIO_mode];
5294:
5295: WDCDEBUG_PRINT(("%s:%d:%d: new piotim=0x%x, dmatim=0x%x\n",
5296: sc->sc_wdcdev.sc_dev.dv_xname, channel, drive,
5297: piotim, dmatim), DEBUG_PROBE);
5298:
5299: pci_conf_write(sc->sc_pc, sc->sc_tag,
5300: SCx200_TIM_PIO(channel, drive), piotim);
5301: pci_conf_write(sc->sc_pc, sc->sc_tag,
5302: SCx200_TIM_DMA(channel, drive), dmatim);
5303: }
5304:
5305: if (idedma_ctl != 0) {
5306: /* Add software bits in status register */
5307: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5308: IDEDMA_CTL(channel), idedma_ctl);
5309: }
5310:
5311: pciide_print_modes(cp);
5312: }
5313:
5314: void
5315: acer_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
5316: {
5317: struct pciide_channel *cp;
5318: int channel;
5319: pcireg_t cr, interface;
5320: bus_size_t cmdsize, ctlsize;
5321: int rev = sc->sc_rev;
5322:
5323: printf(": DMA");
5324: pciide_mapreg_dma(sc, pa);
5325: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
5326: WDC_CAPABILITY_MODE;
5327:
5328: if (sc->sc_dma_ok) {
5329: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA;
5330: if (rev >= 0x20) {
5331: sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
5332: if (rev >= 0xC4)
5333: sc->sc_wdcdev.UDMA_cap = 5;
5334: else if (rev >= 0xC2)
5335: sc->sc_wdcdev.UDMA_cap = 4;
5336: else
5337: sc->sc_wdcdev.UDMA_cap = 2;
5338: }
5339: sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
5340: sc->sc_wdcdev.irqack = pciide_irqack;
5341: }
5342:
5343: sc->sc_wdcdev.PIO_cap = 4;
5344: sc->sc_wdcdev.DMA_cap = 2;
5345: sc->sc_wdcdev.set_modes = acer_setup_channel;
5346: sc->sc_wdcdev.channels = sc->wdc_chanarray;
5347: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
5348:
5349: pciide_pci_write(sc->sc_pc, sc->sc_tag, ACER_CDRC,
5350: (pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_CDRC) |
5351: ACER_CDRC_DMA_EN) & ~ACER_CDRC_FIFO_DISABLE);
5352:
5353: /* Enable "microsoft register bits" R/W. */
5354: pciide_pci_write(sc->sc_pc, sc->sc_tag, ACER_CCAR3,
5355: pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_CCAR3) | ACER_CCAR3_PI);
5356: pciide_pci_write(sc->sc_pc, sc->sc_tag, ACER_CCAR1,
5357: pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_CCAR1) &
5358: ~(ACER_CHANSTATUS_RO|PCIIDE_CHAN_RO(0)|PCIIDE_CHAN_RO(1)));
5359: pciide_pci_write(sc->sc_pc, sc->sc_tag, ACER_CCAR2,
5360: pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_CCAR2) &
5361: ~ACER_CHANSTATUSREGS_RO);
5362: cr = pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG);
5363: cr |= (PCIIDE_CHANSTATUS_EN << PCI_INTERFACE_SHIFT);
5364: pci_conf_write(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG, cr);
5365: /* Don't use cr, re-read the real register content instead */
5366: interface = PCI_INTERFACE(pci_conf_read(sc->sc_pc, sc->sc_tag,
5367: PCI_CLASS_REG));
5368:
5369: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
5370:
5371: /* From linux: enable "Cable Detection" */
5372: if (rev >= 0xC2)
5373: pciide_pci_write(sc->sc_pc, sc->sc_tag, ACER_0x4B,
5374: pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_0x4B)
5375: | ACER_0x4B_CDETECT);
5376:
5377: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
5378: cp = &sc->pciide_channels[channel];
5379: if (pciide_chansetup(sc, channel, interface) == 0)
5380: continue;
5381: if ((interface & PCIIDE_CHAN_EN(channel)) == 0) {
5382: printf("%s: %s ignored (disabled)\n",
5383: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
5384: continue;
5385: }
5386: pciide_map_compat_intr(pa, cp, channel, interface);
5387: if (cp->hw_ok == 0)
5388: continue;
5389: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
5390: (rev >= 0xC2) ? pciide_pci_intr : acer_pci_intr);
5391: if (cp->hw_ok == 0) {
5392: pciide_unmap_compat_intr(pa, cp, channel, interface);
5393: continue;
5394: }
5395: if (pciide_chan_candisable(cp)) {
5396: cr &= ~(PCIIDE_CHAN_EN(channel) << PCI_INTERFACE_SHIFT);
5397: pci_conf_write(sc->sc_pc, sc->sc_tag,
5398: PCI_CLASS_REG, cr);
5399: }
5400: if (cp->hw_ok == 0) {
5401: pciide_unmap_compat_intr(pa, cp, channel, interface);
5402: continue;
5403: }
5404: acer_setup_channel(&cp->wdc_channel);
5405: }
5406: }
5407:
5408: void
5409: acer_setup_channel(struct channel_softc *chp)
5410: {
5411: struct ata_drive_datas *drvp;
5412: int drive;
5413: u_int32_t acer_fifo_udma;
5414: u_int32_t idedma_ctl;
5415: struct pciide_channel *cp = (struct pciide_channel *)chp;
5416: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
5417:
5418: idedma_ctl = 0;
5419: acer_fifo_udma = pci_conf_read(sc->sc_pc, sc->sc_tag, ACER_FTH_UDMA);
5420: WDCDEBUG_PRINT(("acer_setup_channel: old fifo/udma reg 0x%x\n",
5421: acer_fifo_udma), DEBUG_PROBE);
5422: /* setup DMA if needed */
5423: pciide_channel_dma_setup(cp);
5424:
5425: if ((chp->ch_drive[0].drive_flags | chp->ch_drive[1].drive_flags) &
5426: DRIVE_UDMA) { /* check 80 pins cable */
5427: if (pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_0x4A) &
5428: ACER_0x4A_80PIN(chp->channel)) {
5429: WDCDEBUG_PRINT(("%s:%d: 80-wire cable not detected\n",
5430: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel),
5431: DEBUG_PROBE);
5432: if (chp->ch_drive[0].UDMA_mode > 2)
5433: chp->ch_drive[0].UDMA_mode = 2;
5434: if (chp->ch_drive[1].UDMA_mode > 2)
5435: chp->ch_drive[1].UDMA_mode = 2;
5436: }
5437: }
5438:
5439: for (drive = 0; drive < 2; drive++) {
5440: drvp = &chp->ch_drive[drive];
5441: /* If no drive, skip */
5442: if ((drvp->drive_flags & DRIVE) == 0)
5443: continue;
5444: WDCDEBUG_PRINT(("acer_setup_channel: old timings reg for "
5445: "channel %d drive %d 0x%x\n", chp->channel, drive,
5446: pciide_pci_read(sc->sc_pc, sc->sc_tag,
5447: ACER_IDETIM(chp->channel, drive))), DEBUG_PROBE);
5448: /* clear FIFO/DMA mode */
5449: acer_fifo_udma &= ~(ACER_FTH_OPL(chp->channel, drive, 0x3) |
5450: ACER_UDMA_EN(chp->channel, drive) |
5451: ACER_UDMA_TIM(chp->channel, drive, 0x7));
5452:
5453: /* add timing values, setup DMA if needed */
5454: if ((drvp->drive_flags & DRIVE_DMA) == 0 &&
5455: (drvp->drive_flags & DRIVE_UDMA) == 0) {
5456: acer_fifo_udma |=
5457: ACER_FTH_OPL(chp->channel, drive, 0x1);
5458: goto pio;
5459: }
5460:
5461: acer_fifo_udma |= ACER_FTH_OPL(chp->channel, drive, 0x2);
5462: if (drvp->drive_flags & DRIVE_UDMA) {
5463: /* use Ultra/DMA */
5464: drvp->drive_flags &= ~DRIVE_DMA;
5465: acer_fifo_udma |= ACER_UDMA_EN(chp->channel, drive);
5466: acer_fifo_udma |=
5467: ACER_UDMA_TIM(chp->channel, drive,
5468: acer_udma[drvp->UDMA_mode]);
5469: /* XXX disable if one drive < UDMA3 ? */
5470: if (drvp->UDMA_mode >= 3) {
5471: pciide_pci_write(sc->sc_pc, sc->sc_tag,
5472: ACER_0x4B,
5473: pciide_pci_read(sc->sc_pc, sc->sc_tag,
5474: ACER_0x4B) | ACER_0x4B_UDMA66);
5475: }
5476: } else {
5477: /*
5478: * use Multiword DMA
5479: * Timings will be used for both PIO and DMA,
5480: * so adjust DMA mode if needed
5481: */
5482: if (drvp->PIO_mode > (drvp->DMA_mode + 2))
5483: drvp->PIO_mode = drvp->DMA_mode + 2;
5484: if (drvp->DMA_mode + 2 > (drvp->PIO_mode))
5485: drvp->DMA_mode = (drvp->PIO_mode > 2) ?
5486: drvp->PIO_mode - 2 : 0;
5487: if (drvp->DMA_mode == 0)
5488: drvp->PIO_mode = 0;
5489: }
5490: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
5491: pio: pciide_pci_write(sc->sc_pc, sc->sc_tag,
5492: ACER_IDETIM(chp->channel, drive),
5493: acer_pio[drvp->PIO_mode]);
5494: }
5495: WDCDEBUG_PRINT(("acer_setup_channel: new fifo/udma reg 0x%x\n",
5496: acer_fifo_udma), DEBUG_PROBE);
5497: pci_conf_write(sc->sc_pc, sc->sc_tag, ACER_FTH_UDMA, acer_fifo_udma);
5498: if (idedma_ctl != 0) {
5499: /* Add software bits in status register */
5500: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5501: IDEDMA_CTL(chp->channel), idedma_ctl);
5502: }
5503: pciide_print_modes(cp);
5504: }
5505:
5506: int
5507: acer_pci_intr(void *arg)
5508: {
5509: struct pciide_softc *sc = arg;
5510: struct pciide_channel *cp;
5511: struct channel_softc *wdc_cp;
5512: int i, rv, crv;
5513: u_int32_t chids;
5514:
5515: rv = 0;
5516: chids = pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_CHIDS);
5517: for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
5518: cp = &sc->pciide_channels[i];
5519: wdc_cp = &cp->wdc_channel;
5520: /* If a compat channel skip. */
5521: if (cp->compat)
5522: continue;
5523: if (chids & ACER_CHIDS_INT(i)) {
5524: crv = wdcintr(wdc_cp);
5525: if (crv == 0)
5526: printf("%s:%d: bogus intr\n",
5527: sc->sc_wdcdev.sc_dev.dv_xname, i);
5528: else
5529: rv = 1;
5530: }
5531: }
5532: return (rv);
5533: }
5534:
5535: void
5536: hpt_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
5537: {
5538: struct pciide_channel *cp;
5539: int i, compatchan, revision;
5540: pcireg_t interface;
5541: bus_size_t cmdsize, ctlsize;
5542:
5543: revision = sc->sc_rev;
5544:
5545: /*
5546: * when the chip is in native mode it identifies itself as a
5547: * 'misc mass storage'. Fake interface in this case.
5548: */
5549: if (PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_IDE) {
5550: interface = PCI_INTERFACE(pa->pa_class);
5551: } else {
5552: interface = PCIIDE_INTERFACE_BUS_MASTER_DMA |
5553: PCIIDE_INTERFACE_PCI(0);
5554: if ((sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 &&
5555: (revision == HPT370_REV || revision == HPT370A_REV ||
5556: revision == HPT372_REV)) ||
5557: sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372A ||
5558: sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT302 ||
5559: sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT371 ||
5560: sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374)
5561: interface |= PCIIDE_INTERFACE_PCI(1);
5562: }
5563:
5564: printf(": DMA");
5565: pciide_mapreg_dma(sc, pa);
5566: printf("\n");
5567: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
5568: WDC_CAPABILITY_MODE;
5569: if (sc->sc_dma_ok) {
5570: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
5571: sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
5572: sc->sc_wdcdev.irqack = pciide_irqack;
5573: }
5574: sc->sc_wdcdev.PIO_cap = 4;
5575: sc->sc_wdcdev.DMA_cap = 2;
5576:
5577: sc->sc_wdcdev.set_modes = hpt_setup_channel;
5578: sc->sc_wdcdev.channels = sc->wdc_chanarray;
5579: if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 &&
5580: revision == HPT366_REV) {
5581: sc->sc_wdcdev.UDMA_cap = 4;
5582: /*
5583: * The 366 has 2 PCI IDE functions, one for primary and one
5584: * for secondary. So we need to call pciide_mapregs_compat()
5585: * with the real channel
5586: */
5587: if (pa->pa_function == 0) {
5588: compatchan = 0;
5589: } else if (pa->pa_function == 1) {
5590: compatchan = 1;
5591: } else {
5592: printf("%s: unexpected PCI function %d\n",
5593: sc->sc_wdcdev.sc_dev.dv_xname, pa->pa_function);
5594: return;
5595: }
5596: sc->sc_wdcdev.nchannels = 1;
5597: } else {
5598: sc->sc_wdcdev.nchannels = 2;
5599: if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372A ||
5600: sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT302 ||
5601: sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT371 ||
5602: sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374)
5603: sc->sc_wdcdev.UDMA_cap = 6;
5604: else if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366) {
5605: if (revision == HPT372_REV)
5606: sc->sc_wdcdev.UDMA_cap = 6;
5607: else
5608: sc->sc_wdcdev.UDMA_cap = 5;
5609: }
5610: }
5611: for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
5612: cp = &sc->pciide_channels[i];
5613: if (sc->sc_wdcdev.nchannels > 1) {
5614: compatchan = i;
5615: if((pciide_pci_read(sc->sc_pc, sc->sc_tag,
5616: HPT370_CTRL1(i)) & HPT370_CTRL1_EN) == 0) {
5617: printf("%s: %s ignored (disabled)\n",
5618: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
5619: continue;
5620: }
5621: }
5622: if (pciide_chansetup(sc, i, interface) == 0)
5623: continue;
5624: if (interface & PCIIDE_INTERFACE_PCI(i)) {
5625: cp->hw_ok = pciide_mapregs_native(pa, cp, &cmdsize,
5626: &ctlsize, hpt_pci_intr);
5627: } else {
5628: cp->hw_ok = pciide_mapregs_compat(pa, cp, compatchan,
5629: &cmdsize, &ctlsize);
5630: }
5631: if (cp->hw_ok == 0)
5632: return;
5633: cp->wdc_channel.data32iot = cp->wdc_channel.cmd_iot;
5634: cp->wdc_channel.data32ioh = cp->wdc_channel.cmd_ioh;
5635: wdcattach(&cp->wdc_channel);
5636: hpt_setup_channel(&cp->wdc_channel);
5637: }
5638: if ((sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 &&
5639: (revision == HPT370_REV || revision == HPT370A_REV ||
5640: revision == HPT372_REV)) ||
5641: sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372A ||
5642: sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT302 ||
5643: sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT371 ||
5644: sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374) {
5645: /*
5646: * Turn off fast interrupts
5647: */
5648: pciide_pci_write(sc->sc_pc, sc->sc_tag, HPT370_CTRL2(0),
5649: pciide_pci_read(sc->sc_pc, sc->sc_tag, HPT370_CTRL2(0)) &
5650: ~(HPT370_CTRL2_FASTIRQ | HPT370_CTRL2_HIRQ));
5651: pciide_pci_write(sc->sc_pc, sc->sc_tag, HPT370_CTRL2(1),
5652: pciide_pci_read(sc->sc_pc, sc->sc_tag, HPT370_CTRL2(1)) &
5653: ~(HPT370_CTRL2_FASTIRQ | HPT370_CTRL2_HIRQ));
5654:
5655: /*
5656: * HPT370 and highter has a bit to disable interrupts,
5657: * make sure to clear it
5658: */
5659: pciide_pci_write(sc->sc_pc, sc->sc_tag, HPT_CSEL,
5660: pciide_pci_read(sc->sc_pc, sc->sc_tag, HPT_CSEL) &
5661: ~HPT_CSEL_IRQDIS);
5662: }
5663: /* set clocks, etc (mandatory on 372/4, optional otherwise) */
5664: if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372A ||
5665: sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT302 ||
5666: sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT371 ||
5667: sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374 ||
5668: (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 &&
5669: revision == HPT372_REV))
5670: pciide_pci_write(sc->sc_pc, sc->sc_tag, HPT_SC2,
5671: (pciide_pci_read(sc->sc_pc, sc->sc_tag, HPT_SC2) &
5672: HPT_SC2_MAEN) | HPT_SC2_OSC_EN);
5673:
5674: return;
5675: }
5676:
5677: void
5678: hpt_setup_channel(struct channel_softc *chp)
5679: {
5680: struct ata_drive_datas *drvp;
5681: int drive;
5682: int cable;
5683: u_int32_t before, after;
5684: u_int32_t idedma_ctl;
5685: struct pciide_channel *cp = (struct pciide_channel *)chp;
5686: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
5687: int revision = sc->sc_rev;
5688: u_int32_t *tim_pio, *tim_dma, *tim_udma;
5689:
5690: cable = pciide_pci_read(sc->sc_pc, sc->sc_tag, HPT_CSEL);
5691:
5692: /* setup DMA if needed */
5693: pciide_channel_dma_setup(cp);
5694:
5695: idedma_ctl = 0;
5696:
5697: switch (sc->sc_pp->ide_product) {
5698: case PCI_PRODUCT_TRIONES_HPT366:
5699: if (revision == HPT370_REV ||
5700: revision == HPT370A_REV) {
5701: tim_pio = hpt370_pio;
5702: tim_dma = hpt370_dma;
5703: tim_udma = hpt370_udma;
5704: } else if (revision == HPT372_REV) {
5705: tim_pio = hpt372_pio;
5706: tim_dma = hpt372_dma;
5707: tim_udma = hpt372_udma;
5708: } else {
5709: tim_pio = hpt366_pio;
5710: tim_dma = hpt366_dma;
5711: tim_udma = hpt366_udma;
5712: }
5713: break;
5714: case PCI_PRODUCT_TRIONES_HPT372A:
5715: case PCI_PRODUCT_TRIONES_HPT302:
5716: case PCI_PRODUCT_TRIONES_HPT371:
5717: tim_pio = hpt372_pio;
5718: tim_dma = hpt372_dma;
5719: tim_udma = hpt372_udma;
5720: break;
5721: case PCI_PRODUCT_TRIONES_HPT374:
5722: tim_pio = hpt374_pio;
5723: tim_dma = hpt374_dma;
5724: tim_udma = hpt374_udma;
5725: break;
5726: default:
5727: printf("%s: no known timing values\n",
5728: sc->sc_wdcdev.sc_dev.dv_xname);
5729: goto end;
5730: }
5731:
5732: /* Per drive settings */
5733: for (drive = 0; drive < 2; drive++) {
5734: drvp = &chp->ch_drive[drive];
5735: /* If no drive, skip */
5736: if ((drvp->drive_flags & DRIVE) == 0)
5737: continue;
5738: before = pci_conf_read(sc->sc_pc, sc->sc_tag,
5739: HPT_IDETIM(chp->channel, drive));
5740:
5741: /* add timing values, setup DMA if needed */
5742: if (drvp->drive_flags & DRIVE_UDMA) {
5743: /* use Ultra/DMA */
5744: drvp->drive_flags &= ~DRIVE_DMA;
5745: if ((cable & HPT_CSEL_CBLID(chp->channel)) != 0 &&
5746: drvp->UDMA_mode > 2) {
5747: WDCDEBUG_PRINT(("%s(%s:%d:%d): 80-wire "
5748: "cable not detected\n", drvp->drive_name,
5749: sc->sc_wdcdev.sc_dev.dv_xname,
5750: chp->channel, drive), DEBUG_PROBE);
5751: drvp->UDMA_mode = 2;
5752: }
5753: after = tim_udma[drvp->UDMA_mode];
5754: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
5755: } else if (drvp->drive_flags & DRIVE_DMA) {
5756: /*
5757: * use Multiword DMA.
5758: * Timings will be used for both PIO and DMA, so adjust
5759: * DMA mode if needed
5760: */
5761: if (drvp->PIO_mode >= 3 &&
5762: (drvp->DMA_mode + 2) > drvp->PIO_mode) {
5763: drvp->DMA_mode = drvp->PIO_mode - 2;
5764: }
5765: after = tim_dma[drvp->DMA_mode];
5766: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
5767: } else {
5768: /* PIO only */
5769: after = tim_pio[drvp->PIO_mode];
5770: }
5771: pci_conf_write(sc->sc_pc, sc->sc_tag,
5772: HPT_IDETIM(chp->channel, drive), after);
5773: WDCDEBUG_PRINT(("%s: bus speed register set to 0x%08x "
5774: "(BIOS 0x%08x)\n", sc->sc_wdcdev.sc_dev.dv_xname,
5775: after, before), DEBUG_PROBE);
5776: }
5777: end:
5778: if (idedma_ctl != 0) {
5779: /* Add software bits in status register */
5780: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5781: IDEDMA_CTL(chp->channel), idedma_ctl);
5782: }
5783: pciide_print_modes(cp);
5784: }
5785:
5786: int
5787: hpt_pci_intr(void *arg)
5788: {
5789: struct pciide_softc *sc = arg;
5790: struct pciide_channel *cp;
5791: struct channel_softc *wdc_cp;
5792: int rv = 0;
5793: int dmastat, i, crv;
5794:
5795: for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
5796: dmastat = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5797: IDEDMA_CTL(i));
5798: if((dmastat & (IDEDMA_CTL_ACT | IDEDMA_CTL_INTR)) !=
5799: IDEDMA_CTL_INTR)
5800: continue;
5801: cp = &sc->pciide_channels[i];
5802: wdc_cp = &cp->wdc_channel;
5803: crv = wdcintr(wdc_cp);
5804: if (crv == 0) {
5805: printf("%s:%d: bogus intr\n",
5806: sc->sc_wdcdev.sc_dev.dv_xname, i);
5807: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5808: IDEDMA_CTL(i), dmastat);
5809: } else
5810: rv = 1;
5811: }
5812: return (rv);
5813: }
5814:
5815: /* Macros to test product */
5816: #define PDC_IS_262(sc) \
5817: ((sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20262 || \
5818: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20265 || \
5819: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20267)
5820: #define PDC_IS_265(sc) \
5821: ((sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20265 || \
5822: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20267 || \
5823: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20268 || \
5824: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20268R || \
5825: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20269 || \
5826: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20271 || \
5827: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20275 || \
5828: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20276 || \
5829: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20277)
5830: #define PDC_IS_268(sc) \
5831: ((sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20268 || \
5832: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20268R || \
5833: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20269 || \
5834: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20271 || \
5835: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20275 || \
5836: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20276 || \
5837: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20277)
5838: #define PDC_IS_269(sc) \
5839: ((sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20269 || \
5840: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20271 || \
5841: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20275 || \
5842: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20276 || \
5843: (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20277)
5844:
5845: static INLINE u_int8_t
5846: pdc268_config_read(struct channel_softc *chp, int index)
5847: {
5848: struct pciide_channel *cp = (struct pciide_channel *)chp;
5849: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
5850: int channel = chp->channel;
5851:
5852: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5853: PDC268_INDEX(channel), index);
5854: return (bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5855: PDC268_DATA(channel)));
5856: }
5857:
5858: /* unused */
5859: static __inline void
5860: pdc268_config_write(struct channel_softc *chp, int index, u_int8_t value)
5861: {
5862: struct pciide_channel *cp = (struct pciide_channel *)chp;
5863: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
5864: int channel = chp->channel;
5865:
5866: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5867: PDC268_INDEX(channel), index);
5868: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5869: PDC268_DATA(channel), value);
5870: }
5871:
5872: void
5873: pdc202xx_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
5874: {
5875: struct pciide_channel *cp;
5876: int channel;
5877: pcireg_t interface, st, mode;
5878: bus_size_t cmdsize, ctlsize;
5879:
5880: if (!PDC_IS_268(sc)) {
5881: st = pci_conf_read(sc->sc_pc, sc->sc_tag, PDC2xx_STATE);
5882: WDCDEBUG_PRINT(("pdc202xx_setup_chip: controller state 0x%x\n",
5883: st), DEBUG_PROBE);
5884: }
5885:
5886: /* turn off RAID mode */
5887: if (!PDC_IS_268(sc))
5888: st &= ~PDC2xx_STATE_IDERAID;
5889:
5890: /*
5891: * can't rely on the PCI_CLASS_REG content if the chip was in raid
5892: * mode. We have to fake interface
5893: */
5894: interface = PCIIDE_INTERFACE_SETTABLE(0) | PCIIDE_INTERFACE_SETTABLE(1);
5895: if (PDC_IS_268(sc) || (st & PDC2xx_STATE_NATIVE))
5896: interface |= PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1);
5897:
5898: printf(": DMA");
5899: pciide_mapreg_dma(sc, pa);
5900:
5901: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
5902: WDC_CAPABILITY_MODE;
5903: if (sc->sc_pp->ide_product == PCI_PRODUCT_PROMISE_PDC20246 ||
5904: PDC_IS_262(sc))
5905: sc->sc_wdcdev.cap |= WDC_CAPABILITY_NO_ATAPI_DMA;
5906: if (sc->sc_dma_ok) {
5907: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
5908: sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
5909: sc->sc_wdcdev.irqack = pciide_irqack;
5910: }
5911: sc->sc_wdcdev.PIO_cap = 4;
5912: sc->sc_wdcdev.DMA_cap = 2;
5913: if (PDC_IS_269(sc))
5914: sc->sc_wdcdev.UDMA_cap = 6;
5915: else if (PDC_IS_265(sc))
5916: sc->sc_wdcdev.UDMA_cap = 5;
5917: else if (PDC_IS_262(sc))
5918: sc->sc_wdcdev.UDMA_cap = 4;
5919: else
5920: sc->sc_wdcdev.UDMA_cap = 2;
5921: sc->sc_wdcdev.set_modes = PDC_IS_268(sc) ?
5922: pdc20268_setup_channel : pdc202xx_setup_channel;
5923: sc->sc_wdcdev.channels = sc->wdc_chanarray;
5924: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
5925:
5926: if (PDC_IS_262(sc)) {
5927: sc->sc_wdcdev.dma_start = pdc20262_dma_start;
5928: sc->sc_wdcdev.dma_finish = pdc20262_dma_finish;
5929: }
5930:
5931: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
5932: if (!PDC_IS_268(sc)) {
5933: /* setup failsafe defaults */
5934: mode = 0;
5935: mode = PDC2xx_TIM_SET_PA(mode, pdc2xx_pa[0]);
5936: mode = PDC2xx_TIM_SET_PB(mode, pdc2xx_pb[0]);
5937: mode = PDC2xx_TIM_SET_MB(mode, pdc2xx_dma_mb[0]);
5938: mode = PDC2xx_TIM_SET_MC(mode, pdc2xx_dma_mc[0]);
5939: for (channel = 0;
5940: channel < sc->sc_wdcdev.nchannels;
5941: channel++) {
5942: WDCDEBUG_PRINT(("pdc202xx_setup_chip: channel %d "
5943: "drive 0 initial timings 0x%x, now 0x%x\n",
5944: channel, pci_conf_read(sc->sc_pc, sc->sc_tag,
5945: PDC2xx_TIM(channel, 0)), mode | PDC2xx_TIM_IORDYp),
5946: DEBUG_PROBE);
5947: pci_conf_write(sc->sc_pc, sc->sc_tag,
5948: PDC2xx_TIM(channel, 0), mode | PDC2xx_TIM_IORDYp);
5949: WDCDEBUG_PRINT(("pdc202xx_setup_chip: channel %d "
5950: "drive 1 initial timings 0x%x, now 0x%x\n",
5951: channel, pci_conf_read(sc->sc_pc, sc->sc_tag,
5952: PDC2xx_TIM(channel, 1)), mode), DEBUG_PROBE);
5953: pci_conf_write(sc->sc_pc, sc->sc_tag,
5954: PDC2xx_TIM(channel, 1), mode);
5955: }
5956:
5957: mode = PDC2xx_SCR_DMA;
5958: if (PDC_IS_262(sc)) {
5959: mode = PDC2xx_SCR_SET_GEN(mode, PDC262_SCR_GEN_LAT);
5960: } else {
5961: /* the BIOS set it up this way */
5962: mode = PDC2xx_SCR_SET_GEN(mode, 0x1);
5963: }
5964: mode = PDC2xx_SCR_SET_I2C(mode, 0x3); /* ditto */
5965: mode = PDC2xx_SCR_SET_POLL(mode, 0x1); /* ditto */
5966: WDCDEBUG_PRINT(("pdc202xx_setup_chip: initial SCR 0x%x, "
5967: "now 0x%x\n",
5968: bus_space_read_4(sc->sc_dma_iot, sc->sc_dma_ioh,
5969: PDC2xx_SCR),
5970: mode), DEBUG_PROBE);
5971: bus_space_write_4(sc->sc_dma_iot, sc->sc_dma_ioh,
5972: PDC2xx_SCR, mode);
5973:
5974: /* controller initial state register is OK even without BIOS */
5975: /* Set DMA mode to IDE DMA compatibility */
5976: mode =
5977: bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, PDC2xx_PM);
5978: WDCDEBUG_PRINT(("pdc202xx_setup_chip: primary mode 0x%x", mode),
5979: DEBUG_PROBE);
5980: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, PDC2xx_PM,
5981: mode | 0x1);
5982: mode =
5983: bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, PDC2xx_SM);
5984: WDCDEBUG_PRINT((", secondary mode 0x%x\n", mode ), DEBUG_PROBE);
5985: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, PDC2xx_SM,
5986: mode | 0x1);
5987: }
5988:
5989: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
5990: cp = &sc->pciide_channels[channel];
5991: if (pciide_chansetup(sc, channel, interface) == 0)
5992: continue;
5993: if (!PDC_IS_268(sc) && (st & (PDC_IS_262(sc) ?
5994: PDC262_STATE_EN(channel):PDC246_STATE_EN(channel))) == 0) {
5995: printf("%s: %s ignored (disabled)\n",
5996: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
5997: continue;
5998: }
5999: pciide_map_compat_intr(pa, cp, channel, interface);
6000: if (cp->hw_ok == 0)
6001: continue;
6002: if (PDC_IS_265(sc))
6003: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
6004: pdc20265_pci_intr);
6005: else
6006: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
6007: pdc202xx_pci_intr);
6008: if (cp->hw_ok == 0) {
6009: pciide_unmap_compat_intr(pa, cp, channel, interface);
6010: continue;
6011: }
6012: if (!PDC_IS_268(sc) && pciide_chan_candisable(cp)) {
6013: st &= ~(PDC_IS_262(sc) ?
6014: PDC262_STATE_EN(channel):PDC246_STATE_EN(channel));
6015: pciide_unmap_compat_intr(pa, cp, channel, interface);
6016: }
6017: if (PDC_IS_268(sc))
6018: pdc20268_setup_channel(&cp->wdc_channel);
6019: else
6020: pdc202xx_setup_channel(&cp->wdc_channel);
6021: }
6022: if (!PDC_IS_268(sc)) {
6023: WDCDEBUG_PRINT(("pdc202xx_setup_chip: new controller state "
6024: "0x%x\n", st), DEBUG_PROBE);
6025: pci_conf_write(sc->sc_pc, sc->sc_tag, PDC2xx_STATE, st);
6026: }
6027: return;
6028: }
6029:
6030: void
6031: pdc202xx_setup_channel(struct channel_softc *chp)
6032: {
6033: struct ata_drive_datas *drvp;
6034: int drive;
6035: pcireg_t mode, st;
6036: u_int32_t idedma_ctl, scr, atapi;
6037: struct pciide_channel *cp = (struct pciide_channel *)chp;
6038: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
6039: int channel = chp->channel;
6040:
6041: /* setup DMA if needed */
6042: pciide_channel_dma_setup(cp);
6043:
6044: idedma_ctl = 0;
6045: WDCDEBUG_PRINT(("pdc202xx_setup_channel %s: scr 0x%x\n",
6046: sc->sc_wdcdev.sc_dev.dv_xname,
6047: bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, PDC262_U66)),
6048: DEBUG_PROBE);
6049:
6050: /* Per channel settings */
6051: if (PDC_IS_262(sc)) {
6052: scr = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
6053: PDC262_U66);
6054: st = pci_conf_read(sc->sc_pc, sc->sc_tag, PDC2xx_STATE);
6055: /* Check cable */
6056: if ((st & PDC262_STATE_80P(channel)) != 0 &&
6057: ((chp->ch_drive[0].drive_flags & DRIVE_UDMA &&
6058: chp->ch_drive[0].UDMA_mode > 2) ||
6059: (chp->ch_drive[1].drive_flags & DRIVE_UDMA &&
6060: chp->ch_drive[1].UDMA_mode > 2))) {
6061: WDCDEBUG_PRINT(("%s:%d: 80-wire cable not detected\n",
6062: sc->sc_wdcdev.sc_dev.dv_xname, channel),
6063: DEBUG_PROBE);
6064: if (chp->ch_drive[0].UDMA_mode > 2)
6065: chp->ch_drive[0].UDMA_mode = 2;
6066: if (chp->ch_drive[1].UDMA_mode > 2)
6067: chp->ch_drive[1].UDMA_mode = 2;
6068: }
6069: /* Trim UDMA mode */
6070: if ((chp->ch_drive[0].drive_flags & DRIVE_UDMA &&
6071: chp->ch_drive[0].UDMA_mode <= 2) ||
6072: (chp->ch_drive[1].drive_flags & DRIVE_UDMA &&
6073: chp->ch_drive[1].UDMA_mode <= 2)) {
6074: if (chp->ch_drive[0].UDMA_mode > 2)
6075: chp->ch_drive[0].UDMA_mode = 2;
6076: if (chp->ch_drive[1].UDMA_mode > 2)
6077: chp->ch_drive[1].UDMA_mode = 2;
6078: }
6079: /* Set U66 if needed */
6080: if ((chp->ch_drive[0].drive_flags & DRIVE_UDMA &&
6081: chp->ch_drive[0].UDMA_mode > 2) ||
6082: (chp->ch_drive[1].drive_flags & DRIVE_UDMA &&
6083: chp->ch_drive[1].UDMA_mode > 2))
6084: scr |= PDC262_U66_EN(channel);
6085: else
6086: scr &= ~PDC262_U66_EN(channel);
6087: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
6088: PDC262_U66, scr);
6089: WDCDEBUG_PRINT(("pdc202xx_setup_channel %s:%d: ATAPI 0x%x\n",
6090: sc->sc_wdcdev.sc_dev.dv_xname, channel,
6091: bus_space_read_4(sc->sc_dma_iot, sc->sc_dma_ioh,
6092: PDC262_ATAPI(channel))), DEBUG_PROBE);
6093: if (chp->ch_drive[0].drive_flags & DRIVE_ATAPI ||
6094: chp->ch_drive[1].drive_flags & DRIVE_ATAPI) {
6095: if (((chp->ch_drive[0].drive_flags & DRIVE_UDMA) &&
6096: !(chp->ch_drive[1].drive_flags & DRIVE_UDMA) &&
6097: (chp->ch_drive[1].drive_flags & DRIVE_DMA)) ||
6098: ((chp->ch_drive[1].drive_flags & DRIVE_UDMA) &&
6099: !(chp->ch_drive[0].drive_flags & DRIVE_UDMA) &&
6100: (chp->ch_drive[0].drive_flags & DRIVE_DMA)))
6101: atapi = 0;
6102: else
6103: atapi = PDC262_ATAPI_UDMA;
6104: bus_space_write_4(sc->sc_dma_iot, sc->sc_dma_ioh,
6105: PDC262_ATAPI(channel), atapi);
6106: }
6107: }
6108: for (drive = 0; drive < 2; drive++) {
6109: drvp = &chp->ch_drive[drive];
6110: /* If no drive, skip */
6111: if ((drvp->drive_flags & DRIVE) == 0)
6112: continue;
6113: mode = 0;
6114: if (drvp->drive_flags & DRIVE_UDMA) {
6115: /* use Ultra/DMA */
6116: drvp->drive_flags &= ~DRIVE_DMA;
6117: mode = PDC2xx_TIM_SET_MB(mode,
6118: pdc2xx_udma_mb[drvp->UDMA_mode]);
6119: mode = PDC2xx_TIM_SET_MC(mode,
6120: pdc2xx_udma_mc[drvp->UDMA_mode]);
6121: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
6122: } else if (drvp->drive_flags & DRIVE_DMA) {
6123: mode = PDC2xx_TIM_SET_MB(mode,
6124: pdc2xx_dma_mb[drvp->DMA_mode]);
6125: mode = PDC2xx_TIM_SET_MC(mode,
6126: pdc2xx_dma_mc[drvp->DMA_mode]);
6127: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
6128: } else {
6129: mode = PDC2xx_TIM_SET_MB(mode,
6130: pdc2xx_dma_mb[0]);
6131: mode = PDC2xx_TIM_SET_MC(mode,
6132: pdc2xx_dma_mc[0]);
6133: }
6134: mode = PDC2xx_TIM_SET_PA(mode, pdc2xx_pa[drvp->PIO_mode]);
6135: mode = PDC2xx_TIM_SET_PB(mode, pdc2xx_pb[drvp->PIO_mode]);
6136: if (drvp->drive_flags & DRIVE_ATA)
6137: mode |= PDC2xx_TIM_PRE;
6138: mode |= PDC2xx_TIM_SYNC | PDC2xx_TIM_ERRDY;
6139: if (drvp->PIO_mode >= 3) {
6140: mode |= PDC2xx_TIM_IORDY;
6141: if (drive == 0)
6142: mode |= PDC2xx_TIM_IORDYp;
6143: }
6144: WDCDEBUG_PRINT(("pdc202xx_setup_channel: %s:%d:%d "
6145: "timings 0x%x\n",
6146: sc->sc_wdcdev.sc_dev.dv_xname,
6147: chp->channel, drive, mode), DEBUG_PROBE);
6148: pci_conf_write(sc->sc_pc, sc->sc_tag,
6149: PDC2xx_TIM(chp->channel, drive), mode);
6150: }
6151: if (idedma_ctl != 0) {
6152: /* Add software bits in status register */
6153: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
6154: IDEDMA_CTL(channel), idedma_ctl);
6155: }
6156: pciide_print_modes(cp);
6157: }
6158:
6159: void
6160: pdc20268_setup_channel(struct channel_softc *chp)
6161: {
6162: struct ata_drive_datas *drvp;
6163: int drive, cable;
6164: u_int32_t idedma_ctl;
6165: struct pciide_channel *cp = (struct pciide_channel *)chp;
6166: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
6167: int channel = chp->channel;
6168:
6169: /* check 80 pins cable */
6170: cable = pdc268_config_read(chp, 0x0b) & PDC268_CABLE;
6171:
6172: /* setup DMA if needed */
6173: pciide_channel_dma_setup(cp);
6174:
6175: idedma_ctl = 0;
6176:
6177: for (drive = 0; drive < 2; drive++) {
6178: drvp = &chp->ch_drive[drive];
6179: /* If no drive, skip */
6180: if ((drvp->drive_flags & DRIVE) == 0)
6181: continue;
6182: if (drvp->drive_flags & DRIVE_UDMA) {
6183: /* use Ultra/DMA */
6184: drvp->drive_flags &= ~DRIVE_DMA;
6185: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
6186: if (cable && drvp->UDMA_mode > 2) {
6187: WDCDEBUG_PRINT(("%s(%s:%d:%d): 80-wire "
6188: "cable not detected\n", drvp->drive_name,
6189: sc->sc_wdcdev.sc_dev.dv_xname,
6190: channel, drive), DEBUG_PROBE);
6191: drvp->UDMA_mode = 2;
6192: }
6193: } else if (drvp->drive_flags & DRIVE_DMA) {
6194: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
6195: }
6196: }
6197: /* nothing to do to setup modes, the controller snoop SET_FEATURE cmd */
6198: if (idedma_ctl != 0) {
6199: /* Add software bits in status register */
6200: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
6201: IDEDMA_CTL(channel), idedma_ctl);
6202: }
6203: pciide_print_modes(cp);
6204: }
6205:
6206: int
6207: pdc202xx_pci_intr(void *arg)
6208: {
6209: struct pciide_softc *sc = arg;
6210: struct pciide_channel *cp;
6211: struct channel_softc *wdc_cp;
6212: int i, rv, crv;
6213: u_int32_t scr;
6214:
6215: rv = 0;
6216: scr = bus_space_read_4(sc->sc_dma_iot, sc->sc_dma_ioh, PDC2xx_SCR);
6217: for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
6218: cp = &sc->pciide_channels[i];
6219: wdc_cp = &cp->wdc_channel;
6220: /* If a compat channel skip. */
6221: if (cp->compat)
6222: continue;
6223: if (scr & PDC2xx_SCR_INT(i)) {
6224: crv = wdcintr(wdc_cp);
6225: if (crv == 0)
6226: printf("%s:%d: bogus intr (reg 0x%x)\n",
6227: sc->sc_wdcdev.sc_dev.dv_xname, i, scr);
6228: else
6229: rv = 1;
6230: }
6231: }
6232: return (rv);
6233: }
6234:
6235: int
6236: pdc20265_pci_intr(void *arg)
6237: {
6238: struct pciide_softc *sc = arg;
6239: struct pciide_channel *cp;
6240: struct channel_softc *wdc_cp;
6241: int i, rv, crv;
6242: u_int32_t dmastat;
6243:
6244: rv = 0;
6245: for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
6246: cp = &sc->pciide_channels[i];
6247: wdc_cp = &cp->wdc_channel;
6248: /* If a compat channel skip. */
6249: if (cp->compat)
6250: continue;
6251:
6252: /*
6253: * In case of shared IRQ check that the interrupt
6254: * was actually generated by this channel.
6255: * Only check the channel that is enabled.
6256: */
6257: if (cp->hw_ok && PDC_IS_268(sc)) {
6258: if ((pdc268_config_read(wdc_cp,
6259: 0x0b) & PDC268_INTR) == 0)
6260: continue;
6261: }
6262:
6263: /*
6264: * The Ultra/100 seems to assert PDC2xx_SCR_INT * spuriously,
6265: * however it asserts INT in IDEDMA_CTL even for non-DMA ops.
6266: * So use it instead (requires 2 reg reads instead of 1,
6267: * but we can't do it another way).
6268: */
6269: dmastat = bus_space_read_1(sc->sc_dma_iot,
6270: sc->sc_dma_ioh, IDEDMA_CTL(i));
6271: if ((dmastat & IDEDMA_CTL_INTR) == 0)
6272: continue;
6273:
6274: crv = wdcintr(wdc_cp);
6275: if (crv == 0)
6276: printf("%s:%d: bogus intr\n",
6277: sc->sc_wdcdev.sc_dev.dv_xname, i);
6278: else
6279: rv = 1;
6280: }
6281: return (rv);
6282: }
6283:
6284: void
6285: pdc20262_dma_start(void *v, int channel, int drive)
6286: {
6287: struct pciide_softc *sc = v;
6288: struct pciide_dma_maps *dma_maps =
6289: &sc->pciide_channels[channel].dma_maps[drive];
6290: u_int8_t clock;
6291: u_int32_t count;
6292:
6293: if (dma_maps->dma_flags & WDC_DMA_LBA48) {
6294: clock = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
6295: PDC262_U66);
6296: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
6297: PDC262_U66, clock | PDC262_U66_EN(channel));
6298: count = dma_maps->dmamap_xfer->dm_mapsize >> 1;
6299: count |= dma_maps->dma_flags & WDC_DMA_READ ?
6300: PDC262_ATAPI_LBA48_READ : PDC262_ATAPI_LBA48_WRITE;
6301: bus_space_write_4(sc->sc_dma_iot, sc->sc_dma_ioh,
6302: PDC262_ATAPI(channel), count);
6303: }
6304:
6305: pciide_dma_start(v, channel, drive);
6306: }
6307:
6308: int
6309: pdc20262_dma_finish(void *v, int channel, int drive, int force)
6310: {
6311: struct pciide_softc *sc = v;
6312: struct pciide_dma_maps *dma_maps =
6313: &sc->pciide_channels[channel].dma_maps[drive];
6314: u_int8_t clock;
6315:
6316: if (dma_maps->dma_flags & WDC_DMA_LBA48) {
6317: clock = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
6318: PDC262_U66);
6319: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
6320: PDC262_U66, clock & ~PDC262_U66_EN(channel));
6321: bus_space_write_4(sc->sc_dma_iot, sc->sc_dma_ioh,
6322: PDC262_ATAPI(channel), 0);
6323: }
6324:
6325: return (pciide_dma_finish(v, channel, drive, force));
6326: }
6327:
6328: void
6329: pdcsata_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
6330: {
6331: struct pciide_channel *cp;
6332: struct channel_softc *wdc_cp;
6333: struct pciide_pdcsata *ps;
6334: int channel, i;
6335: bus_size_t dmasize;
6336: pci_intr_handle_t intrhandle;
6337: const char *intrstr;
6338:
6339: /* Allocate memory for private data */
6340: sc->sc_cookie = malloc(sizeof(struct pciide_pdcsata), M_DEVBUF,
6341: M_NOWAIT);
6342: ps = sc->sc_cookie;
6343: bzero(ps, sizeof(*ps));
6344:
6345: /*
6346: * Promise SATA controllers have 3 or 4 channels,
6347: * the usual IDE registers are mapped in I/O space, with offsets.
6348: */
6349: if (pci_intr_map(pa, &intrhandle) != 0) {
6350: printf(": couldn't map interrupt\n");
6351: return;
6352: }
6353: intrstr = pci_intr_string(pa->pa_pc, intrhandle);
6354:
6355: switch (sc->sc_pp->ide_product) {
6356: case PCI_PRODUCT_PROMISE_PDC20318:
6357: case PCI_PRODUCT_PROMISE_PDC20319:
6358: case PCI_PRODUCT_PROMISE_PDC20371:
6359: case PCI_PRODUCT_PROMISE_PDC20375:
6360: case PCI_PRODUCT_PROMISE_PDC20376:
6361: case PCI_PRODUCT_PROMISE_PDC20377:
6362: case PCI_PRODUCT_PROMISE_PDC20378:
6363: case PCI_PRODUCT_PROMISE_PDC20379:
6364: default:
6365: sc->sc_pci_ih = pci_intr_establish(pa->pa_pc,
6366: intrhandle, IPL_BIO, pdc203xx_pci_intr, sc,
6367: sc->sc_wdcdev.sc_dev.dv_xname);
6368: break;
6369:
6370: case PCI_PRODUCT_PROMISE_PDC40518:
6371: case PCI_PRODUCT_PROMISE_PDC40519:
6372: case PCI_PRODUCT_PROMISE_PDC40718:
6373: case PCI_PRODUCT_PROMISE_PDC40719:
6374: case PCI_PRODUCT_PROMISE_PDC40779:
6375: case PCI_PRODUCT_PROMISE_PDC20571:
6376: case PCI_PRODUCT_PROMISE_PDC20575:
6377: case PCI_PRODUCT_PROMISE_PDC20579:
6378: case PCI_PRODUCT_PROMISE_PDC20771:
6379: case PCI_PRODUCT_PROMISE_PDC20775:
6380: sc->sc_pci_ih = pci_intr_establish(pa->pa_pc,
6381: intrhandle, IPL_BIO, pdc205xx_pci_intr, sc,
6382: sc->sc_wdcdev.sc_dev.dv_xname);
6383: break;
6384: }
6385:
6386: if (sc->sc_pci_ih == NULL) {
6387: printf(": couldn't establish native-PCI interrupt");
6388: if (intrstr != NULL)
6389: printf(" at %s", intrstr);
6390: printf("\n");
6391: return;
6392: }
6393:
6394: sc->sc_dma_ok = (pci_mapreg_map(pa, PCIIDE_REG_BUS_MASTER_DMA,
6395: PCI_MAPREG_MEM_TYPE_32BIT, 0, &sc->sc_dma_iot,
6396: &sc->sc_dma_ioh, NULL, &dmasize, 0) == 0);
6397: if (!sc->sc_dma_ok) {
6398: printf(": couldn't map bus-master DMA registers\n");
6399: pci_intr_disestablish(pa->pa_pc, sc->sc_pci_ih);
6400: return;
6401: }
6402:
6403: sc->sc_dmat = pa->pa_dmat;
6404:
6405: if (pci_mapreg_map(pa, PDC203xx_BAR_IDEREGS,
6406: PCI_MAPREG_MEM_TYPE_32BIT, 0, &ps->ba5_st,
6407: &ps->ba5_sh, NULL, NULL, 0) != 0) {
6408: printf(": couldn't map IDE registers\n");
6409: bus_space_unmap(sc->sc_dma_iot, sc->sc_dma_ioh, dmasize);
6410: pci_intr_disestablish(pa->pa_pc, sc->sc_pci_ih);
6411: return;
6412: }
6413:
6414: printf(": DMA\n");
6415:
6416: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16;
6417: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
6418: sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
6419: sc->sc_wdcdev.irqack = pdc203xx_irqack;
6420: sc->sc_wdcdev.PIO_cap = 4;
6421: sc->sc_wdcdev.DMA_cap = 2;
6422: sc->sc_wdcdev.UDMA_cap = 6;
6423: sc->sc_wdcdev.set_modes = pdc203xx_setup_channel;
6424: sc->sc_wdcdev.channels = sc->wdc_chanarray;
6425:
6426: switch (sc->sc_pp->ide_product) {
6427: case PCI_PRODUCT_PROMISE_PDC20318:
6428: case PCI_PRODUCT_PROMISE_PDC20319:
6429: case PCI_PRODUCT_PROMISE_PDC20371:
6430: case PCI_PRODUCT_PROMISE_PDC20375:
6431: case PCI_PRODUCT_PROMISE_PDC20376:
6432: case PCI_PRODUCT_PROMISE_PDC20377:
6433: case PCI_PRODUCT_PROMISE_PDC20378:
6434: case PCI_PRODUCT_PROMISE_PDC20379:
6435: default:
6436: bus_space_write_4(ps->ba5_st, ps->ba5_sh, 0x06c, 0x00ff0033);
6437: sc->sc_wdcdev.nchannels =
6438: (bus_space_read_4(ps->ba5_st, ps->ba5_sh, 0x48) & 0x02) ?
6439: PDC203xx_NCHANNELS : 3;
6440: break;
6441:
6442: case PCI_PRODUCT_PROMISE_PDC40518:
6443: case PCI_PRODUCT_PROMISE_PDC40519:
6444: case PCI_PRODUCT_PROMISE_PDC40718:
6445: case PCI_PRODUCT_PROMISE_PDC40719:
6446: case PCI_PRODUCT_PROMISE_PDC40779:
6447: case PCI_PRODUCT_PROMISE_PDC20571:
6448: bus_space_write_4(ps->ba5_st, ps->ba5_sh, 0x60, 0x00ff00ff);
6449: sc->sc_wdcdev.nchannels = PDC40718_NCHANNELS;
6450:
6451: sc->sc_wdcdev.reset = pdc205xx_do_reset;
6452: sc->sc_wdcdev.drv_probe = pdc205xx_drv_probe;
6453:
6454: break;
6455: case PCI_PRODUCT_PROMISE_PDC20575:
6456: case PCI_PRODUCT_PROMISE_PDC20579:
6457: case PCI_PRODUCT_PROMISE_PDC20771:
6458: case PCI_PRODUCT_PROMISE_PDC20775:
6459: bus_space_write_4(ps->ba5_st, ps->ba5_sh, 0x60, 0x00ff00ff);
6460: sc->sc_wdcdev.nchannels = PDC20575_NCHANNELS;
6461:
6462: sc->sc_wdcdev.reset = pdc205xx_do_reset;
6463: sc->sc_wdcdev.drv_probe = pdc205xx_drv_probe;
6464:
6465: break;
6466: }
6467:
6468: sc->sc_wdcdev.dma_arg = sc;
6469: sc->sc_wdcdev.dma_init = pciide_dma_init;
6470: sc->sc_wdcdev.dma_start = pdc203xx_dma_start;
6471: sc->sc_wdcdev.dma_finish = pdc203xx_dma_finish;
6472:
6473: for (channel = 0; channel < sc->sc_wdcdev.nchannels;
6474: channel++) {
6475: cp = &sc->pciide_channels[channel];
6476: sc->wdc_chanarray[channel] = &cp->wdc_channel;
6477:
6478: cp->ih = sc->sc_pci_ih;
6479: cp->name = NULL;
6480: cp->wdc_channel.channel = channel;
6481: cp->wdc_channel.wdc = &sc->sc_wdcdev;
6482: cp->wdc_channel.ch_queue =
6483: malloc(sizeof(struct channel_queue), M_DEVBUF, M_NOWAIT);
6484: if (cp->wdc_channel.ch_queue == NULL) {
6485: printf("%s: channel %d: "
6486: "can't allocate memory for command queue\n",
6487: sc->sc_wdcdev.sc_dev.dv_xname, channel);
6488: continue;
6489: }
6490: wdc_cp = &cp->wdc_channel;
6491:
6492: ps->regs[channel].ctl_iot = ps->ba5_st;
6493: ps->regs[channel].cmd_iot = ps->ba5_st;
6494:
6495: if (bus_space_subregion(ps->ba5_st, ps->ba5_sh,
6496: 0x0238 + (channel << 7), 1,
6497: &ps->regs[channel].ctl_ioh) != 0) {
6498: printf("%s: couldn't map channel %d ctl regs\n",
6499: sc->sc_wdcdev.sc_dev.dv_xname,
6500: channel);
6501: continue;
6502: }
6503: for (i = 0; i < WDC_NREG; i++) {
6504: if (bus_space_subregion(ps->ba5_st, ps->ba5_sh,
6505: 0x0200 + (i << 2) + (channel << 7), i == 0 ? 4 : 1,
6506: &ps->regs[channel].cmd_iohs[i]) != 0) {
6507: printf("%s: couldn't map channel %d cmd "
6508: "regs\n",
6509: sc->sc_wdcdev.sc_dev.dv_xname,
6510: channel);
6511: continue;
6512: }
6513: }
6514: ps->regs[channel].cmd_iohs[wdr_status & _WDC_REGMASK] =
6515: ps->regs[channel].cmd_iohs[wdr_command & _WDC_REGMASK];
6516: ps->regs[channel].cmd_iohs[wdr_features & _WDC_REGMASK] =
6517: ps->regs[channel].cmd_iohs[wdr_error & _WDC_REGMASK];
6518: wdc_cp->data32iot = wdc_cp->cmd_iot =
6519: ps->regs[channel].cmd_iot;
6520: wdc_cp->data32ioh = wdc_cp->cmd_ioh =
6521: ps->regs[channel].cmd_iohs[0];
6522: wdc_cp->_vtbl = &wdc_pdc203xx_vtbl;
6523:
6524: /*
6525: * Subregion de busmaster registers. They're spread all over
6526: * the controller's register space :(. They are also 4 bytes
6527: * sized, with some specific extentions in the extra bits.
6528: * It also seems that the IDEDMA_CTL register isn't available.
6529: */
6530: if (bus_space_subregion(ps->ba5_st, ps->ba5_sh,
6531: 0x260 + (channel << 7), 1,
6532: &ps->regs[channel].dma_iohs[IDEDMA_CMD(0)]) != 0) {
6533: printf("%s channel %d: can't subregion DMA "
6534: "registers\n",
6535: sc->sc_wdcdev.sc_dev.dv_xname, channel);
6536: continue;
6537: }
6538: if (bus_space_subregion(ps->ba5_st, ps->ba5_sh,
6539: 0x244 + (channel << 7), 4,
6540: &ps->regs[channel].dma_iohs[IDEDMA_TBL(0)]) != 0) {
6541: printf("%s channel %d: can't subregion DMA "
6542: "registers\n",
6543: sc->sc_wdcdev.sc_dev.dv_xname, channel);
6544: continue;
6545: }
6546:
6547: wdcattach(wdc_cp);
6548: bus_space_write_4(sc->sc_dma_iot,
6549: ps->regs[channel].dma_iohs[IDEDMA_CMD(0)], 0,
6550: (bus_space_read_4(sc->sc_dma_iot,
6551: ps->regs[channel].dma_iohs[IDEDMA_CMD(0)],
6552: 0) & ~0x00003f9f) | (channel + 1));
6553: bus_space_write_4(ps->ba5_st, ps->ba5_sh,
6554: (channel + 1) << 2, 0x00000001);
6555:
6556: pdc203xx_setup_channel(&cp->wdc_channel);
6557: }
6558:
6559: printf("%s: using %s for native-PCI interrupt\n",
6560: sc->sc_wdcdev.sc_dev.dv_xname,
6561: intrstr ? intrstr : "unknown interrupt");
6562: }
6563:
6564: void
6565: pdc203xx_setup_channel(struct channel_softc *chp)
6566: {
6567: struct ata_drive_datas *drvp;
6568: struct pciide_channel *cp = (struct pciide_channel *)chp;
6569: int drive, s;
6570:
6571: pciide_channel_dma_setup(cp);
6572:
6573: for (drive = 0; drive < 2; drive++) {
6574: drvp = &chp->ch_drive[drive];
6575: if ((drvp->drive_flags & DRIVE) == 0)
6576: continue;
6577: if (drvp->drive_flags & DRIVE_UDMA) {
6578: s = splbio();
6579: drvp->drive_flags &= ~DRIVE_DMA;
6580: splx(s);
6581: }
6582: }
6583: pciide_print_modes(cp);
6584: }
6585:
6586: int
6587: pdc203xx_pci_intr(void *arg)
6588: {
6589: struct pciide_softc *sc = arg;
6590: struct pciide_channel *cp;
6591: struct channel_softc *wdc_cp;
6592: struct pciide_pdcsata *ps = sc->sc_cookie;
6593: int i, rv, crv;
6594: u_int32_t scr;
6595:
6596: rv = 0;
6597: scr = bus_space_read_4(ps->ba5_st, ps->ba5_sh, 0x00040);
6598:
6599: for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
6600: cp = &sc->pciide_channels[i];
6601: wdc_cp = &cp->wdc_channel;
6602: if (scr & (1 << (i + 1))) {
6603: crv = wdcintr(wdc_cp);
6604: if (crv == 0) {
6605: printf("%s:%d: bogus intr (reg 0x%x)\n",
6606: sc->sc_wdcdev.sc_dev.dv_xname,
6607: i, scr);
6608: } else
6609: rv = 1;
6610: }
6611: }
6612:
6613: return (rv);
6614: }
6615:
6616: int
6617: pdc205xx_pci_intr(void *arg)
6618: {
6619: struct pciide_softc *sc = arg;
6620: struct pciide_channel *cp;
6621: struct channel_softc *wdc_cp;
6622: struct pciide_pdcsata *ps = sc->sc_cookie;
6623: int i, rv, crv;
6624: u_int32_t scr, status;
6625:
6626: rv = 0;
6627: scr = bus_space_read_4(ps->ba5_st, ps->ba5_sh, 0x40);
6628: bus_space_write_4(ps->ba5_st, ps->ba5_sh, 0x40, scr & 0x0000ffff);
6629:
6630: status = bus_space_read_4(ps->ba5_st, ps->ba5_sh, 0x60);
6631: bus_space_write_4(ps->ba5_st, ps->ba5_sh, 0x60, status & 0x000000ff);
6632:
6633: for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
6634: cp = &sc->pciide_channels[i];
6635: wdc_cp = &cp->wdc_channel;
6636: if (scr & (1 << (i + 1))) {
6637: crv = wdcintr(wdc_cp);
6638: if (crv == 0) {
6639: printf("%s:%d: bogus intr (reg 0x%x)\n",
6640: sc->sc_wdcdev.sc_dev.dv_xname,
6641: i, scr);
6642: } else
6643: rv = 1;
6644: }
6645: }
6646: return rv;
6647: }
6648:
6649: void
6650: pdc203xx_irqack(struct channel_softc *chp)
6651: {
6652: struct pciide_channel *cp = (struct pciide_channel *)chp;
6653: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
6654: struct pciide_pdcsata *ps = sc->sc_cookie;
6655: int chan = chp->channel;
6656:
6657: bus_space_write_4(sc->sc_dma_iot,
6658: ps->regs[chan].dma_iohs[IDEDMA_CMD(0)], 0,
6659: (bus_space_read_4(sc->sc_dma_iot,
6660: ps->regs[chan].dma_iohs[IDEDMA_CMD(0)],
6661: 0) & ~0x00003f9f) | (chan + 1));
6662: bus_space_write_4(ps->ba5_st, ps->ba5_sh,
6663: (chan + 1) << 2, 0x00000001);
6664: }
6665:
6666: void
6667: pdc203xx_dma_start(void *v, int channel, int drive)
6668: {
6669: struct pciide_softc *sc = v;
6670: struct pciide_channel *cp = &sc->pciide_channels[channel];
6671: struct pciide_dma_maps *dma_maps = &cp->dma_maps[drive];
6672: struct pciide_pdcsata *ps = sc->sc_cookie;
6673:
6674: /* Write table address */
6675: bus_space_write_4(sc->sc_dma_iot,
6676: ps->regs[channel].dma_iohs[IDEDMA_TBL(0)], 0,
6677: dma_maps->dmamap_table->dm_segs[0].ds_addr);
6678:
6679: /* Start DMA engine */
6680: bus_space_write_4(sc->sc_dma_iot,
6681: ps->regs[channel].dma_iohs[IDEDMA_CMD(0)], 0,
6682: (bus_space_read_4(sc->sc_dma_iot,
6683: ps->regs[channel].dma_iohs[IDEDMA_CMD(0)],
6684: 0) & ~0xc0) | ((dma_maps->dma_flags & WDC_DMA_READ) ? 0x80 : 0xc0));
6685: }
6686:
6687: int
6688: pdc203xx_dma_finish(void *v, int channel, int drive, int force)
6689: {
6690: struct pciide_softc *sc = v;
6691: struct pciide_channel *cp = &sc->pciide_channels[channel];
6692: struct pciide_dma_maps *dma_maps = &cp->dma_maps[drive];
6693: struct pciide_pdcsata *ps = sc->sc_cookie;
6694:
6695: /* Stop DMA channel */
6696: bus_space_write_4(sc->sc_dma_iot,
6697: ps->regs[channel].dma_iohs[IDEDMA_CMD(0)], 0,
6698: (bus_space_read_4(sc->sc_dma_iot,
6699: ps->regs[channel].dma_iohs[IDEDMA_CMD(0)],
6700: 0) & ~0x80));
6701:
6702: /* Unload the map of the data buffer */
6703: bus_dmamap_sync(sc->sc_dmat, dma_maps->dmamap_xfer, 0,
6704: dma_maps->dmamap_xfer->dm_mapsize,
6705: (dma_maps->dma_flags & WDC_DMA_READ) ?
6706: BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
6707: bus_dmamap_unload(sc->sc_dmat, dma_maps->dmamap_xfer);
6708:
6709: return (0);
6710: }
6711:
6712: u_int8_t
6713: pdc203xx_read_reg(struct channel_softc *chp, enum wdc_regs reg)
6714: {
6715: struct pciide_channel *cp = (struct pciide_channel *)chp;
6716: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
6717: struct pciide_pdcsata *ps = sc->sc_cookie;
6718: u_int8_t val;
6719:
6720: if (reg & _WDC_AUX) {
6721: return (bus_space_read_1(ps->regs[chp->channel].ctl_iot,
6722: ps->regs[chp->channel].ctl_ioh, reg & _WDC_REGMASK));
6723: } else {
6724: val = bus_space_read_1(ps->regs[chp->channel].cmd_iot,
6725: ps->regs[chp->channel].cmd_iohs[reg & _WDC_REGMASK], 0);
6726: return (val);
6727: }
6728: }
6729:
6730: void
6731: pdc203xx_write_reg(struct channel_softc *chp, enum wdc_regs reg, u_int8_t val)
6732: {
6733: struct pciide_channel *cp = (struct pciide_channel *)chp;
6734: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
6735: struct pciide_pdcsata *ps = sc->sc_cookie;
6736:
6737: if (reg & _WDC_AUX)
6738: bus_space_write_1(ps->regs[chp->channel].ctl_iot,
6739: ps->regs[chp->channel].ctl_ioh, reg & _WDC_REGMASK, val);
6740: else
6741: bus_space_write_1(ps->regs[chp->channel].cmd_iot,
6742: ps->regs[chp->channel].cmd_iohs[reg & _WDC_REGMASK],
6743: 0, val);
6744: }
6745:
6746: void
6747: pdc205xx_do_reset(struct channel_softc *chp)
6748: {
6749: struct pciide_channel *cp = (struct pciide_channel *)chp;
6750: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
6751: struct pciide_pdcsata *ps = sc->sc_cookie;
6752: u_int32_t scontrol;
6753:
6754: wdc_do_reset(chp);
6755:
6756: /* reset SATA */
6757: scontrol = SControl_DET_INIT | SControl_SPD_ANY | SControl_IPM_NONE;
6758: SCONTROL_WRITE(ps, chp->channel, scontrol);
6759: delay(50*1000);
6760:
6761: scontrol &= ~SControl_DET_INIT;
6762: SCONTROL_WRITE(ps, chp->channel, scontrol);
6763: delay(50*1000);
6764: }
6765:
6766: void
6767: pdc205xx_drv_probe(struct channel_softc *chp)
6768: {
6769: struct pciide_channel *cp = (struct pciide_channel *)chp;
6770: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
6771: struct pciide_pdcsata *ps = sc->sc_cookie;
6772: bus_space_handle_t *iohs;
6773: u_int32_t scontrol, sstatus;
6774: u_int16_t scnt, sn, cl, ch;
6775: int i, s;
6776:
6777: /* XXX This should be done by other code. */
6778: for (i = 0; i < 2; i++) {
6779: chp->ch_drive[i].chnl_softc = chp;
6780: chp->ch_drive[i].drive = i;
6781: }
6782:
6783: SCONTROL_WRITE(ps, chp->channel, 0);
6784: delay(50*1000);
6785:
6786: scontrol = SControl_DET_INIT | SControl_SPD_ANY | SControl_IPM_NONE;
6787: SCONTROL_WRITE(ps,chp->channel,scontrol);
6788: delay(50*1000);
6789:
6790: scontrol &= ~SControl_DET_INIT;
6791: SCONTROL_WRITE(ps,chp->channel,scontrol);
6792: delay(50*1000);
6793:
6794: sstatus = SSTATUS_READ(ps,chp->channel);
6795:
6796: switch (sstatus & SStatus_DET_mask) {
6797: case SStatus_DET_NODEV:
6798: /* No Device; be silent. */
6799: break;
6800:
6801: case SStatus_DET_DEV_NE:
6802: printf("%s: port %d: device connected, but "
6803: "communication not established\n",
6804: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel);
6805: break;
6806:
6807: case SStatus_DET_OFFLINE:
6808: printf("%s: port %d: PHY offline\n",
6809: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel);
6810: break;
6811:
6812: case SStatus_DET_DEV:
6813: iohs = ps->regs[chp->channel].cmd_iohs;
6814: bus_space_write_1(chp->cmd_iot, iohs[wdr_sdh], 0,
6815: WDSD_IBM);
6816: delay(10); /* 400ns delay */
6817: scnt = bus_space_read_2(chp->cmd_iot, iohs[wdr_seccnt], 0);
6818: sn = bus_space_read_2(chp->cmd_iot, iohs[wdr_sector], 0);
6819: cl = bus_space_read_2(chp->cmd_iot, iohs[wdr_cyl_lo], 0);
6820: ch = bus_space_read_2(chp->cmd_iot, iohs[wdr_cyl_hi], 0);
6821: #if 0
6822: printf("%s: port %d: scnt=0x%x sn=0x%x cl=0x%x ch=0x%x\n",
6823: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel,
6824: scnt, sn, cl, ch);
6825: #endif
6826: /*
6827: * scnt and sn are supposed to be 0x1 for ATAPI, but in some
6828: * cases we get wrong values here, so ignore it.
6829: */
6830: s = splbio();
6831: if (cl == 0x14 && ch == 0xeb)
6832: chp->ch_drive[0].drive_flags |= DRIVE_ATAPI;
6833: else
6834: chp->ch_drive[0].drive_flags |= DRIVE_ATA;
6835: splx(s);
6836: #if 0
6837: printf("%s: port %d: device present",
6838: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel);
6839: switch ((sstatus & SStatus_SPD_mask) >> SStatus_SPD_shift) {
6840: case 1:
6841: printf(", speed: 1.5Gb/s");
6842: break;
6843: case 2:
6844: printf(", speed: 3.0Gb/s");
6845: break;
6846: }
6847: printf("\n");
6848: #endif
6849: break;
6850:
6851: default:
6852: printf("%s: port %d: unknown SStatus: 0x%08x\n",
6853: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel, sstatus);
6854: }
6855: }
6856:
6857: #ifdef notyet
6858: /*
6859: * Inline functions for accessing the timing registers of the
6860: * OPTi controller.
6861: *
6862: * These *MUST* disable interrupts as they need atomic access to
6863: * certain magic registers. Failure to adhere to this *will*
6864: * break things in subtle ways if the wdc registers are accessed
6865: * by an interrupt routine while this magic sequence is executing.
6866: */
6867: static __inline__ u_int8_t
6868: opti_read_config(struct channel_softc *chp, int reg)
6869: {
6870: u_int8_t rv;
6871: int s = splhigh();
6872:
6873: /* Two consecutive 16-bit reads from register #1 (0x1f1/0x171) */
6874: (void) bus_space_read_2(chp->cmd_iot, chp->cmd_ioh, wdr_features);
6875: (void) bus_space_read_2(chp->cmd_iot, chp->cmd_ioh, wdr_features);
6876:
6877: /* Followed by an 8-bit write of 0x3 to register #2 */
6878: bus_space_write_1(chp->cmd_iot, chp->cmd_ioh, wdr_seccnt, 0x03u);
6879:
6880: /* Now we can read the required register */
6881: rv = bus_space_read_1(chp->cmd_iot, chp->cmd_ioh, reg);
6882:
6883: /* Restore the real registers */
6884: bus_space_write_1(chp->cmd_iot, chp->cmd_ioh, wdr_seccnt, 0x83u);
6885:
6886: splx(s);
6887:
6888: return (rv);
6889: }
6890:
6891: static __inline__ void
6892: opti_write_config(struct channel_softc *chp, int reg, u_int8_t val)
6893: {
6894: int s = splhigh();
6895:
6896: /* Two consecutive 16-bit reads from register #1 (0x1f1/0x171) */
6897: (void) bus_space_read_2(chp->cmd_iot, chp->cmd_ioh, wdr_features);
6898: (void) bus_space_read_2(chp->cmd_iot, chp->cmd_ioh, wdr_features);
6899:
6900: /* Followed by an 8-bit write of 0x3 to register #2 */
6901: bus_space_write_1(chp->cmd_iot, chp->cmd_ioh, wdr_seccnt, 0x03u);
6902:
6903: /* Now we can write the required register */
6904: bus_space_write_1(chp->cmd_iot, chp->cmd_ioh, reg, val);
6905:
6906: /* Restore the real registers */
6907: bus_space_write_1(chp->cmd_iot, chp->cmd_ioh, wdr_seccnt, 0x83u);
6908:
6909: splx(s);
6910: }
6911:
6912: void
6913: opti_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
6914: {
6915: struct pciide_channel *cp;
6916: bus_size_t cmdsize, ctlsize;
6917: pcireg_t interface;
6918: u_int8_t init_ctrl;
6919: int channel;
6920:
6921: printf(": DMA");
6922: /*
6923: * XXXSCW:
6924: * There seem to be a couple of buggy revisions/implementations
6925: * of the OPTi pciide chipset. This kludge seems to fix one of
6926: * the reported problems (NetBSD PR/11644) but still fails for the
6927: * other (NetBSD PR/13151), although the latter may be due to other
6928: * issues too...
6929: */
6930: if (sc->sc_rev <= 0x12) {
6931: printf(" (disabled)");
6932: sc->sc_dma_ok = 0;
6933: sc->sc_wdcdev.cap = 0;
6934: } else {
6935: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA32;
6936: pciide_mapreg_dma(sc, pa);
6937: }
6938:
6939: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_MODE;
6940: sc->sc_wdcdev.PIO_cap = 4;
6941: if (sc->sc_dma_ok) {
6942: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
6943: sc->sc_wdcdev.irqack = pciide_irqack;
6944: sc->sc_wdcdev.DMA_cap = 2;
6945: }
6946: sc->sc_wdcdev.set_modes = opti_setup_channel;
6947:
6948: sc->sc_wdcdev.channels = sc->wdc_chanarray;
6949: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
6950:
6951: init_ctrl = pciide_pci_read(sc->sc_pc, sc->sc_tag,
6952: OPTI_REG_INIT_CONTROL);
6953:
6954: interface = PCI_INTERFACE(pa->pa_class);
6955:
6956: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
6957:
6958: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
6959: cp = &sc->pciide_channels[channel];
6960: if (pciide_chansetup(sc, channel, interface) == 0)
6961: continue;
6962: if (channel == 1 &&
6963: (init_ctrl & OPTI_INIT_CONTROL_CH2_DISABLE) != 0) {
6964: printf("%s: %s ignored (disabled)\n",
6965: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
6966: continue;
6967: }
6968: pciide_map_compat_intr(pa, cp, channel, interface);
6969: if (cp->hw_ok == 0)
6970: continue;
6971: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
6972: pciide_pci_intr);
6973: if (cp->hw_ok == 0) {
6974: pciide_unmap_compat_intr(pa, cp, channel, interface);
6975: continue;
6976: }
6977: opti_setup_channel(&cp->wdc_channel);
6978: }
6979: }
6980:
6981: void
6982: opti_setup_channel(struct channel_softc *chp)
6983: {
6984: struct ata_drive_datas *drvp;
6985: struct pciide_channel *cp = (struct pciide_channel *)chp;
6986: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
6987: int drive, spd;
6988: int mode[2];
6989: u_int8_t rv, mr;
6990:
6991: /*
6992: * The `Delay' and `Address Setup Time' fields of the
6993: * Miscellaneous Register are always zero initially.
6994: */
6995: mr = opti_read_config(chp, OPTI_REG_MISC) & ~OPTI_MISC_INDEX_MASK;
6996: mr &= ~(OPTI_MISC_DELAY_MASK |
6997: OPTI_MISC_ADDR_SETUP_MASK |
6998: OPTI_MISC_INDEX_MASK);
6999:
7000: /* Prime the control register before setting timing values */
7001: opti_write_config(chp, OPTI_REG_CONTROL, OPTI_CONTROL_DISABLE);
7002:
7003: /* Determine the clockrate of the PCIbus the chip is attached to */
7004: spd = (int) opti_read_config(chp, OPTI_REG_STRAP);
7005: spd &= OPTI_STRAP_PCI_SPEED_MASK;
7006:
7007: /* setup DMA if needed */
7008: pciide_channel_dma_setup(cp);
7009:
7010: for (drive = 0; drive < 2; drive++) {
7011: drvp = &chp->ch_drive[drive];
7012: /* If no drive, skip */
7013: if ((drvp->drive_flags & DRIVE) == 0) {
7014: mode[drive] = -1;
7015: continue;
7016: }
7017:
7018: if ((drvp->drive_flags & DRIVE_DMA)) {
7019: /*
7020: * Timings will be used for both PIO and DMA,
7021: * so adjust DMA mode if needed
7022: */
7023: if (drvp->PIO_mode > (drvp->DMA_mode + 2))
7024: drvp->PIO_mode = drvp->DMA_mode + 2;
7025: if (drvp->DMA_mode + 2 > (drvp->PIO_mode))
7026: drvp->DMA_mode = (drvp->PIO_mode > 2) ?
7027: drvp->PIO_mode - 2 : 0;
7028: if (drvp->DMA_mode == 0)
7029: drvp->PIO_mode = 0;
7030:
7031: mode[drive] = drvp->DMA_mode + 5;
7032: } else
7033: mode[drive] = drvp->PIO_mode;
7034:
7035: if (drive && mode[0] >= 0 &&
7036: (opti_tim_as[spd][mode[0]] != opti_tim_as[spd][mode[1]])) {
7037: /*
7038: * Can't have two drives using different values
7039: * for `Address Setup Time'.
7040: * Slow down the faster drive to compensate.
7041: */
7042: int d = (opti_tim_as[spd][mode[0]] >
7043: opti_tim_as[spd][mode[1]]) ? 0 : 1;
7044:
7045: mode[d] = mode[1-d];
7046: chp->ch_drive[d].PIO_mode = chp->ch_drive[1-d].PIO_mode;
7047: chp->ch_drive[d].DMA_mode = 0;
7048: chp->ch_drive[d].drive_flags &= DRIVE_DMA;
7049: }
7050: }
7051:
7052: for (drive = 0; drive < 2; drive++) {
7053: int m;
7054: if ((m = mode[drive]) < 0)
7055: continue;
7056:
7057: /* Set the Address Setup Time and select appropriate index */
7058: rv = opti_tim_as[spd][m] << OPTI_MISC_ADDR_SETUP_SHIFT;
7059: rv |= OPTI_MISC_INDEX(drive);
7060: opti_write_config(chp, OPTI_REG_MISC, mr | rv);
7061:
7062: /* Set the pulse width and recovery timing parameters */
7063: rv = opti_tim_cp[spd][m] << OPTI_PULSE_WIDTH_SHIFT;
7064: rv |= opti_tim_rt[spd][m] << OPTI_RECOVERY_TIME_SHIFT;
7065: opti_write_config(chp, OPTI_REG_READ_CYCLE_TIMING, rv);
7066: opti_write_config(chp, OPTI_REG_WRITE_CYCLE_TIMING, rv);
7067:
7068: /* Set the Enhanced Mode register appropriately */
7069: rv = pciide_pci_read(sc->sc_pc, sc->sc_tag, OPTI_REG_ENH_MODE);
7070: rv &= ~OPTI_ENH_MODE_MASK(chp->channel, drive);
7071: rv |= OPTI_ENH_MODE(chp->channel, drive, opti_tim_em[m]);
7072: pciide_pci_write(sc->sc_pc, sc->sc_tag, OPTI_REG_ENH_MODE, rv);
7073: }
7074:
7075: /* Finally, enable the timings */
7076: opti_write_config(chp, OPTI_REG_CONTROL, OPTI_CONTROL_ENABLE);
7077:
7078: pciide_print_modes(cp);
7079: }
7080: #endif
7081:
7082: void
7083: serverworks_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
7084: {
7085: struct pciide_channel *cp;
7086: pcireg_t interface = PCI_INTERFACE(pa->pa_class);
7087: pcitag_t pcib_tag;
7088: int channel;
7089: bus_size_t cmdsize, ctlsize;
7090:
7091: printf(": DMA");
7092: pciide_mapreg_dma(sc, pa);
7093: printf("\n");
7094: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
7095: WDC_CAPABILITY_MODE;
7096:
7097: if (sc->sc_dma_ok) {
7098: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
7099: sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
7100: sc->sc_wdcdev.irqack = pciide_irqack;
7101: }
7102: sc->sc_wdcdev.PIO_cap = 4;
7103: sc->sc_wdcdev.DMA_cap = 2;
7104: switch (sc->sc_pp->ide_product) {
7105: case PCI_PRODUCT_RCC_OSB4_IDE:
7106: sc->sc_wdcdev.UDMA_cap = 2;
7107: break;
7108: case PCI_PRODUCT_RCC_CSB5_IDE:
7109: if (sc->sc_rev < 0x92)
7110: sc->sc_wdcdev.UDMA_cap = 4;
7111: else
7112: sc->sc_wdcdev.UDMA_cap = 5;
7113: break;
7114: case PCI_PRODUCT_RCC_CSB6_IDE:
7115: sc->sc_wdcdev.UDMA_cap = 4;
7116: break;
7117: case PCI_PRODUCT_RCC_CSB6_RAID_IDE:
7118: sc->sc_wdcdev.UDMA_cap = 5;
7119: break;
7120: }
7121:
7122: sc->sc_wdcdev.set_modes = serverworks_setup_channel;
7123: sc->sc_wdcdev.channels = sc->wdc_chanarray;
7124: sc->sc_wdcdev.nchannels =
7125: (sc->sc_pp->ide_product == PCI_PRODUCT_RCC_CSB6_IDE ? 1 : 2);
7126:
7127: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
7128: cp = &sc->pciide_channels[channel];
7129: if (pciide_chansetup(sc, channel, interface) == 0)
7130: continue;
7131: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
7132: serverworks_pci_intr);
7133: if (cp->hw_ok == 0)
7134: return;
7135: pciide_map_compat_intr(pa, cp, channel, interface);
7136: if (cp->hw_ok == 0)
7137: return;
7138: serverworks_setup_channel(&cp->wdc_channel);
7139: }
7140:
7141: pcib_tag = pci_make_tag(pa->pa_pc, pa->pa_bus, pa->pa_device, 0);
7142: pci_conf_write(pa->pa_pc, pcib_tag, 0x64,
7143: (pci_conf_read(pa->pa_pc, pcib_tag, 0x64) & ~0x2000) | 0x4000);
7144: }
7145:
7146: void
7147: serverworks_setup_channel(struct channel_softc *chp)
7148: {
7149: struct ata_drive_datas *drvp;
7150: struct pciide_channel *cp = (struct pciide_channel *)chp;
7151: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
7152: int channel = chp->channel;
7153: int drive, unit;
7154: u_int32_t pio_time, dma_time, pio_mode, udma_mode;
7155: u_int32_t idedma_ctl;
7156: static const u_int8_t pio_modes[5] = {0x5d, 0x47, 0x34, 0x22, 0x20};
7157: static const u_int8_t dma_modes[3] = {0x77, 0x21, 0x20};
7158:
7159: /* setup DMA if needed */
7160: pciide_channel_dma_setup(cp);
7161:
7162: pio_time = pci_conf_read(sc->sc_pc, sc->sc_tag, 0x40);
7163: dma_time = pci_conf_read(sc->sc_pc, sc->sc_tag, 0x44);
7164: pio_mode = pci_conf_read(sc->sc_pc, sc->sc_tag, 0x48);
7165: udma_mode = pci_conf_read(sc->sc_pc, sc->sc_tag, 0x54);
7166:
7167: pio_time &= ~(0xffff << (16 * channel));
7168: dma_time &= ~(0xffff << (16 * channel));
7169: pio_mode &= ~(0xff << (8 * channel + 16));
7170: udma_mode &= ~(0xff << (8 * channel + 16));
7171: udma_mode &= ~(3 << (2 * channel));
7172:
7173: idedma_ctl = 0;
7174:
7175: /* Per drive settings */
7176: for (drive = 0; drive < 2; drive++) {
7177: drvp = &chp->ch_drive[drive];
7178: /* If no drive, skip */
7179: if ((drvp->drive_flags & DRIVE) == 0)
7180: continue;
7181: unit = drive + 2 * channel;
7182: /* add timing values, setup DMA if needed */
7183: pio_time |= pio_modes[drvp->PIO_mode] << (8 * (unit^1));
7184: pio_mode |= drvp->PIO_mode << (4 * unit + 16);
7185: if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) &&
7186: (drvp->drive_flags & DRIVE_UDMA)) {
7187: /* use Ultra/DMA, check for 80-pin cable */
7188: if (sc->sc_rev <= 0x92 && drvp->UDMA_mode > 2 &&
7189: (PCI_PRODUCT(pci_conf_read(sc->sc_pc, sc->sc_tag,
7190: PCI_SUBSYS_ID_REG)) &
7191: (1 << (14 + channel))) == 0) {
7192: WDCDEBUG_PRINT(("%s(%s:%d:%d): 80-wire "
7193: "cable not detected\n", drvp->drive_name,
7194: sc->sc_wdcdev.sc_dev.dv_xname,
7195: channel, drive), DEBUG_PROBE);
7196: drvp->UDMA_mode = 2;
7197: }
7198: dma_time |= dma_modes[drvp->DMA_mode] << (8 * (unit^1));
7199: udma_mode |= drvp->UDMA_mode << (4 * unit + 16);
7200: udma_mode |= 1 << unit;
7201: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
7202: } else if ((chp->wdc->cap & WDC_CAPABILITY_DMA) &&
7203: (drvp->drive_flags & DRIVE_DMA)) {
7204: /* use Multiword DMA */
7205: drvp->drive_flags &= ~DRIVE_UDMA;
7206: dma_time |= dma_modes[drvp->DMA_mode] << (8 * (unit^1));
7207: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
7208: } else {
7209: /* PIO only */
7210: drvp->drive_flags &= ~(DRIVE_UDMA | DRIVE_DMA);
7211: }
7212: }
7213:
7214: pci_conf_write(sc->sc_pc, sc->sc_tag, 0x40, pio_time);
7215: pci_conf_write(sc->sc_pc, sc->sc_tag, 0x44, dma_time);
7216: if (sc->sc_pp->ide_product != PCI_PRODUCT_RCC_OSB4_IDE)
7217: pci_conf_write(sc->sc_pc, sc->sc_tag, 0x48, pio_mode);
7218: pci_conf_write(sc->sc_pc, sc->sc_tag, 0x54, udma_mode);
7219:
7220: if (idedma_ctl != 0) {
7221: /* Add software bits in status register */
7222: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
7223: IDEDMA_CTL(channel), idedma_ctl);
7224: }
7225: pciide_print_modes(cp);
7226: }
7227:
7228: int
7229: serverworks_pci_intr(void *arg)
7230: {
7231: struct pciide_softc *sc = arg;
7232: struct pciide_channel *cp;
7233: struct channel_softc *wdc_cp;
7234: int rv = 0;
7235: int dmastat, i, crv;
7236:
7237: for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
7238: dmastat = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
7239: IDEDMA_CTL(i));
7240: if ((dmastat & (IDEDMA_CTL_ACT | IDEDMA_CTL_INTR)) !=
7241: IDEDMA_CTL_INTR)
7242: continue;
7243: cp = &sc->pciide_channels[i];
7244: wdc_cp = &cp->wdc_channel;
7245: crv = wdcintr(wdc_cp);
7246: if (crv == 0) {
7247: printf("%s:%d: bogus intr\n",
7248: sc->sc_wdcdev.sc_dev.dv_xname, i);
7249: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
7250: IDEDMA_CTL(i), dmastat);
7251: } else
7252: rv = 1;
7253: }
7254: return (rv);
7255: }
7256:
7257: void
7258: svwsata_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
7259: {
7260: struct pciide_channel *cp;
7261: pci_intr_handle_t intrhandle;
7262: const char *intrstr;
7263: int channel;
7264: struct pciide_svwsata *ss;
7265:
7266: /* Allocate memory for private data */
7267: sc->sc_cookie = malloc(sizeof(struct pciide_svwsata), M_DEVBUF,
7268: M_NOWAIT);
7269: ss = sc->sc_cookie;
7270: bzero(ss, sizeof(*ss));
7271:
7272: /* The 4-port version has a dummy second function. */
7273: if (pci_conf_read(sc->sc_pc, sc->sc_tag,
7274: PCI_MAPREG_START + 0x14) == 0) {
7275: printf("\n");
7276: return;
7277: }
7278:
7279: if (pci_mapreg_map(pa, PCI_MAPREG_START + 0x14,
7280: PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT, 0,
7281: &ss->ba5_st, &ss->ba5_sh, NULL, NULL, 0) != 0) {
7282: printf(": unable to map BA5 register space\n");
7283: return;
7284: }
7285:
7286: printf(": DMA");
7287: svwsata_mapreg_dma(sc, pa);
7288: printf("\n");
7289:
7290: if (sc->sc_dma_ok) {
7291: sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA |
7292: WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
7293: sc->sc_wdcdev.irqack = pciide_irqack;
7294: }
7295: sc->sc_wdcdev.PIO_cap = 4;
7296: sc->sc_wdcdev.DMA_cap = 2;
7297: sc->sc_wdcdev.UDMA_cap = 6;
7298:
7299: sc->sc_wdcdev.channels = sc->wdc_chanarray;
7300: sc->sc_wdcdev.nchannels = 4;
7301: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
7302: WDC_CAPABILITY_MODE | WDC_CAPABILITY_SATA;
7303: sc->sc_wdcdev.set_modes = sata_setup_channel;
7304:
7305: /* We can use SControl and SStatus to probe for drives. */
7306: sc->sc_wdcdev.drv_probe = svwsata_drv_probe;
7307:
7308: /* Map and establish the interrupt handler. */
7309: if(pci_intr_map(pa, &intrhandle) != 0) {
7310: printf("%s: couldn't map native-PCI interrupt\n",
7311: sc->sc_wdcdev.sc_dev.dv_xname);
7312: return;
7313: }
7314: intrstr = pci_intr_string(pa->pa_pc, intrhandle);
7315: sc->sc_pci_ih = pci_intr_establish(pa->pa_pc, intrhandle, IPL_BIO,
7316: pciide_pci_intr, sc, sc->sc_wdcdev.sc_dev.dv_xname);
7317: if (sc->sc_pci_ih != NULL) {
7318: printf("%s: using %s for native-PCI interrupt\n",
7319: sc->sc_wdcdev.sc_dev.dv_xname,
7320: intrstr ? intrstr : "unknown interrupt");
7321: } else {
7322: printf("%s: couldn't establish native-PCI interrupt",
7323: sc->sc_wdcdev.sc_dev.dv_xname);
7324: if (intrstr != NULL)
7325: printf(" at %s", intrstr);
7326: printf("\n");
7327: return;
7328: }
7329:
7330: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
7331: cp = &sc->pciide_channels[channel];
7332: if (pciide_chansetup(sc, channel, 0) == 0)
7333: continue;
7334: svwsata_mapchan(cp);
7335: sata_setup_channel(&cp->wdc_channel);
7336: }
7337: }
7338:
7339: void
7340: svwsata_mapreg_dma(struct pciide_softc *sc, struct pci_attach_args *pa)
7341: {
7342: struct pciide_svwsata *ss = sc->sc_cookie;
7343:
7344: sc->sc_wdcdev.dma_arg = sc;
7345: sc->sc_wdcdev.dma_init = pciide_dma_init;
7346: sc->sc_wdcdev.dma_start = pciide_dma_start;
7347: sc->sc_wdcdev.dma_finish = pciide_dma_finish;
7348:
7349: /* XXX */
7350: sc->sc_dma_iot = ss->ba5_st;
7351: sc->sc_dma_ioh = ss->ba5_sh;
7352:
7353: sc->sc_dmacmd_read = svwsata_dmacmd_read;
7354: sc->sc_dmacmd_write = svwsata_dmacmd_write;
7355: sc->sc_dmactl_read = svwsata_dmactl_read;
7356: sc->sc_dmactl_write = svwsata_dmactl_write;
7357: sc->sc_dmatbl_write = svwsata_dmatbl_write;
7358:
7359: /* DMA registers all set up! */
7360: sc->sc_dmat = pa->pa_dmat;
7361: sc->sc_dma_ok = 1;
7362: }
7363:
7364: u_int8_t
7365: svwsata_dmacmd_read(struct pciide_softc *sc, int chan)
7366: {
7367: return (bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
7368: (chan << 8) + SVWSATA_DMA + IDEDMA_CMD(0)));
7369: }
7370:
7371: void
7372: svwsata_dmacmd_write(struct pciide_softc *sc, int chan, u_int8_t val)
7373: {
7374: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
7375: (chan << 8) + SVWSATA_DMA + IDEDMA_CMD(0), val);
7376: }
7377:
7378: u_int8_t
7379: svwsata_dmactl_read(struct pciide_softc *sc, int chan)
7380: {
7381: return (bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
7382: (chan << 8) + SVWSATA_DMA + IDEDMA_CTL(0)));
7383: }
7384:
7385: void
7386: svwsata_dmactl_write(struct pciide_softc *sc, int chan, u_int8_t val)
7387: {
7388: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
7389: (chan << 8) + SVWSATA_DMA + IDEDMA_CTL(0), val);
7390: }
7391:
7392: void
7393: svwsata_dmatbl_write(struct pciide_softc *sc, int chan, u_int32_t val)
7394: {
7395: bus_space_write_4(sc->sc_dma_iot, sc->sc_dma_ioh,
7396: (chan << 8) + SVWSATA_DMA + IDEDMA_TBL(0), val);
7397: }
7398:
7399: void
7400: svwsata_mapchan(struct pciide_channel *cp)
7401: {
7402: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
7403: struct channel_softc *wdc_cp = &cp->wdc_channel;
7404: struct pciide_svwsata *ss = sc->sc_cookie;
7405:
7406: cp->compat = 0;
7407: cp->ih = sc->sc_pci_ih;
7408:
7409: if (bus_space_subregion(ss->ba5_st, ss->ba5_sh,
7410: (wdc_cp->channel << 8) + SVWSATA_TF0,
7411: SVWSATA_TF8 - SVWSATA_TF0, &wdc_cp->cmd_ioh) != 0) {
7412: printf("%s: couldn't map %s cmd regs\n",
7413: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
7414: return;
7415: }
7416: if (bus_space_subregion(ss->ba5_st, ss->ba5_sh,
7417: (wdc_cp->channel << 8) + SVWSATA_TF8, 4,
7418: &wdc_cp->ctl_ioh) != 0) {
7419: printf("%s: couldn't map %s ctl regs\n",
7420: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
7421: return;
7422: }
7423: wdc_cp->cmd_iot = wdc_cp->ctl_iot = ss->ba5_st;
7424: wdc_cp->_vtbl = &wdc_svwsata_vtbl;
7425: wdcattach(wdc_cp);
7426: }
7427:
7428: void
7429: svwsata_drv_probe(struct channel_softc *chp)
7430: {
7431: struct pciide_channel *cp = (struct pciide_channel *)chp;
7432: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
7433: struct pciide_svwsata *ss = sc->sc_cookie;
7434: int channel = chp->channel;
7435: uint32_t scontrol, sstatus;
7436: uint8_t scnt, sn, cl, ch;
7437: int i, s;
7438:
7439: /* XXX This should be done by other code. */
7440: for (i = 0; i < 2; i++) {
7441: chp->ch_drive[i].chnl_softc = chp;
7442: chp->ch_drive[i].drive = i;
7443: }
7444:
7445: /*
7446: * Request communication initialization sequence, any speed.
7447: * Performing this is the equivalent of an ATA Reset.
7448: */
7449: scontrol = SControl_DET_INIT | SControl_SPD_ANY;
7450:
7451: /*
7452: * XXX We don't yet support SATA power management; disable all
7453: * power management state transitions.
7454: */
7455: scontrol |= SControl_IPM_NONE;
7456:
7457: bus_space_write_4(ss->ba5_st, ss->ba5_sh,
7458: (channel << 8) + SVWSATA_SCONTROL, scontrol);
7459: delay(50 * 1000);
7460: scontrol &= ~SControl_DET_INIT;
7461: bus_space_write_4(ss->ba5_st, ss->ba5_sh,
7462: (channel << 8) + SVWSATA_SCONTROL, scontrol);
7463: delay(50 * 1000);
7464:
7465: sstatus = bus_space_read_4(ss->ba5_st, ss->ba5_sh,
7466: (channel << 8) + SVWSATA_SSTATUS);
7467: #if 0
7468: printf("%s: port %d: SStatus=0x%08x, SControl=0x%08x\n",
7469: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel, sstatus,
7470: bus_space_read_4(ss->ba5_st, ss->ba5_sh,
7471: (channel << 8) + SVWSATA_SSTATUS));
7472: #endif
7473: switch (sstatus & SStatus_DET_mask) {
7474: case SStatus_DET_NODEV:
7475: /* No device; be silent. */
7476: break;
7477:
7478: case SStatus_DET_DEV_NE:
7479: printf("%s: port %d: device connected, but "
7480: "communication not established\n",
7481: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel);
7482: break;
7483:
7484: case SStatus_DET_OFFLINE:
7485: printf("%s: port %d: PHY offline\n",
7486: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel);
7487: break;
7488:
7489: case SStatus_DET_DEV:
7490: /*
7491: * XXX ATAPI detection doesn't currently work. Don't
7492: * XXX know why. But, it's not like the standard method
7493: * XXX can detect an ATAPI device connected via a SATA/PATA
7494: * XXX bridge, so at least this is no worse. --thorpej
7495: */
7496: if (chp->_vtbl != NULL)
7497: CHP_WRITE_REG(chp, wdr_sdh, WDSD_IBM | (0 << 4));
7498: else
7499: bus_space_write_1(chp->cmd_iot, chp->cmd_ioh,
7500: wdr_sdh & _WDC_REGMASK, WDSD_IBM | (0 << 4));
7501: delay(10); /* 400ns delay */
7502: /* Save register contents. */
7503: if (chp->_vtbl != NULL) {
7504: scnt = CHP_READ_REG(chp, wdr_seccnt);
7505: sn = CHP_READ_REG(chp, wdr_sector);
7506: cl = CHP_READ_REG(chp, wdr_cyl_lo);
7507: ch = CHP_READ_REG(chp, wdr_cyl_hi);
7508: } else {
7509: scnt = bus_space_read_1(chp->cmd_iot,
7510: chp->cmd_ioh, wdr_seccnt & _WDC_REGMASK);
7511: sn = bus_space_read_1(chp->cmd_iot,
7512: chp->cmd_ioh, wdr_sector & _WDC_REGMASK);
7513: cl = bus_space_read_1(chp->cmd_iot,
7514: chp->cmd_ioh, wdr_cyl_lo & _WDC_REGMASK);
7515: ch = bus_space_read_1(chp->cmd_iot,
7516: chp->cmd_ioh, wdr_cyl_hi & _WDC_REGMASK);
7517: }
7518: #if 0
7519: printf("%s: port %d: scnt=0x%x sn=0x%x cl=0x%x ch=0x%x\n",
7520: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel,
7521: scnt, sn, cl, ch);
7522: #endif
7523: /*
7524: * scnt and sn are supposed to be 0x1 for ATAPI, but in some
7525: * cases we get wrong values here, so ignore it.
7526: */
7527: s = splbio();
7528: if (cl == 0x14 && ch == 0xeb)
7529: chp->ch_drive[0].drive_flags |= DRIVE_ATAPI;
7530: else
7531: chp->ch_drive[0].drive_flags |= DRIVE_ATA;
7532: splx(s);
7533:
7534: printf("%s: port %d: device present",
7535: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel);
7536: switch ((sstatus & SStatus_SPD_mask) >> SStatus_SPD_shift) {
7537: case 1:
7538: printf(", speed: 1.5Gb/s");
7539: break;
7540: case 2:
7541: printf(", speed: 3.0Gb/s");
7542: break;
7543: }
7544: printf("\n");
7545: break;
7546:
7547: default:
7548: printf("%s: port %d: unknown SStatus: 0x%08x\n",
7549: sc->sc_wdcdev.sc_dev.dv_xname, chp->channel, sstatus);
7550: }
7551: }
7552:
7553: u_int8_t
7554: svwsata_read_reg(struct channel_softc *chp, enum wdc_regs reg)
7555: {
7556: if (reg & _WDC_AUX) {
7557: return (bus_space_read_4(chp->ctl_iot, chp->ctl_ioh,
7558: (reg & _WDC_REGMASK) << 2));
7559: } else {
7560: return (bus_space_read_4(chp->cmd_iot, chp->cmd_ioh,
7561: (reg & _WDC_REGMASK) << 2));
7562: }
7563: }
7564:
7565: void
7566: svwsata_write_reg(struct channel_softc *chp, enum wdc_regs reg, u_int8_t val)
7567: {
7568: if (reg & _WDC_AUX) {
7569: bus_space_write_4(chp->ctl_iot, chp->ctl_ioh,
7570: (reg & _WDC_REGMASK) << 2, val);
7571: } else {
7572: bus_space_write_4(chp->cmd_iot, chp->cmd_ioh,
7573: (reg & _WDC_REGMASK) << 2, val);
7574: }
7575: }
7576:
7577: void
7578: svwsata_lba48_write_reg(struct channel_softc *chp, enum wdc_regs reg, u_int16_t val)
7579: {
7580: if (reg & _WDC_AUX) {
7581: bus_space_write_4(chp->ctl_iot, chp->ctl_ioh,
7582: (reg & _WDC_REGMASK) << 2, val);
7583: } else {
7584: bus_space_write_4(chp->cmd_iot, chp->cmd_ioh,
7585: (reg & _WDC_REGMASK) << 2, val);
7586: }
7587: }
7588:
7589: #define ACARD_IS_850(sc) \
7590: ((sc)->sc_pp->ide_product == PCI_PRODUCT_ACARD_ATP850U)
7591:
7592: void
7593: acard_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
7594: {
7595: struct pciide_channel *cp;
7596: int i;
7597: pcireg_t interface;
7598: bus_size_t cmdsize, ctlsize;
7599:
7600: /*
7601: * when the chip is in native mode it identifies itself as a
7602: * 'misc mass storage'. Fake interface in this case.
7603: */
7604: if (PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_IDE) {
7605: interface = PCI_INTERFACE(pa->pa_class);
7606: } else {
7607: interface = PCIIDE_INTERFACE_BUS_MASTER_DMA |
7608: PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1);
7609: }
7610:
7611: printf(": DMA");
7612: pciide_mapreg_dma(sc, pa);
7613: printf("\n");
7614: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
7615: WDC_CAPABILITY_MODE;
7616:
7617: if (sc->sc_dma_ok) {
7618: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
7619: sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
7620: sc->sc_wdcdev.irqack = pciide_irqack;
7621: }
7622: sc->sc_wdcdev.PIO_cap = 4;
7623: sc->sc_wdcdev.DMA_cap = 2;
7624: switch (sc->sc_pp->ide_product) {
7625: case PCI_PRODUCT_ACARD_ATP850U:
7626: sc->sc_wdcdev.UDMA_cap = 2;
7627: break;
7628: case PCI_PRODUCT_ACARD_ATP860:
7629: case PCI_PRODUCT_ACARD_ATP860A:
7630: sc->sc_wdcdev.UDMA_cap = 4;
7631: break;
7632: case PCI_PRODUCT_ACARD_ATP865A:
7633: case PCI_PRODUCT_ACARD_ATP865R:
7634: sc->sc_wdcdev.UDMA_cap = 6;
7635: break;
7636: }
7637:
7638: sc->sc_wdcdev.set_modes = acard_setup_channel;
7639: sc->sc_wdcdev.channels = sc->wdc_chanarray;
7640: sc->sc_wdcdev.nchannels = 2;
7641:
7642: for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
7643: cp = &sc->pciide_channels[i];
7644: if (pciide_chansetup(sc, i, interface) == 0)
7645: continue;
7646: if (interface & PCIIDE_INTERFACE_PCI(i)) {
7647: cp->hw_ok = pciide_mapregs_native(pa, cp, &cmdsize,
7648: &ctlsize, pciide_pci_intr);
7649: } else {
7650: cp->hw_ok = pciide_mapregs_compat(pa, cp, i,
7651: &cmdsize, &ctlsize);
7652: }
7653: if (cp->hw_ok == 0)
7654: return;
7655: cp->wdc_channel.data32iot = cp->wdc_channel.cmd_iot;
7656: cp->wdc_channel.data32ioh = cp->wdc_channel.cmd_ioh;
7657: wdcattach(&cp->wdc_channel);
7658: acard_setup_channel(&cp->wdc_channel);
7659: }
7660: if (!ACARD_IS_850(sc)) {
7661: u_int32_t reg;
7662: reg = pci_conf_read(sc->sc_pc, sc->sc_tag, ATP8x0_CTRL);
7663: reg &= ~ATP860_CTRL_INT;
7664: pci_conf_write(sc->sc_pc, sc->sc_tag, ATP8x0_CTRL, reg);
7665: }
7666: }
7667:
7668: void
7669: acard_setup_channel(struct channel_softc *chp)
7670: {
7671: struct ata_drive_datas *drvp;
7672: struct pciide_channel *cp = (struct pciide_channel *)chp;
7673: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
7674: int channel = chp->channel;
7675: int drive;
7676: u_int32_t idetime, udma_mode;
7677: u_int32_t idedma_ctl;
7678:
7679: /* setup DMA if needed */
7680: pciide_channel_dma_setup(cp);
7681:
7682: if (ACARD_IS_850(sc)) {
7683: idetime = 0;
7684: udma_mode = pci_conf_read(sc->sc_pc, sc->sc_tag, ATP850_UDMA);
7685: udma_mode &= ~ATP850_UDMA_MASK(channel);
7686: } else {
7687: idetime = pci_conf_read(sc->sc_pc, sc->sc_tag, ATP860_IDETIME);
7688: idetime &= ~ATP860_SETTIME_MASK(channel);
7689: udma_mode = pci_conf_read(sc->sc_pc, sc->sc_tag, ATP860_UDMA);
7690: udma_mode &= ~ATP860_UDMA_MASK(channel);
7691: }
7692:
7693: idedma_ctl = 0;
7694:
7695: /* Per drive settings */
7696: for (drive = 0; drive < 2; drive++) {
7697: drvp = &chp->ch_drive[drive];
7698: /* If no drive, skip */
7699: if ((drvp->drive_flags & DRIVE) == 0)
7700: continue;
7701: /* add timing values, setup DMA if needed */
7702: if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) &&
7703: (drvp->drive_flags & DRIVE_UDMA)) {
7704: /* use Ultra/DMA */
7705: if (ACARD_IS_850(sc)) {
7706: idetime |= ATP850_SETTIME(drive,
7707: acard_act_udma[drvp->UDMA_mode],
7708: acard_rec_udma[drvp->UDMA_mode]);
7709: udma_mode |= ATP850_UDMA_MODE(channel, drive,
7710: acard_udma_conf[drvp->UDMA_mode]);
7711: } else {
7712: idetime |= ATP860_SETTIME(channel, drive,
7713: acard_act_udma[drvp->UDMA_mode],
7714: acard_rec_udma[drvp->UDMA_mode]);
7715: udma_mode |= ATP860_UDMA_MODE(channel, drive,
7716: acard_udma_conf[drvp->UDMA_mode]);
7717: }
7718: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
7719: } else if ((chp->wdc->cap & WDC_CAPABILITY_DMA) &&
7720: (drvp->drive_flags & DRIVE_DMA)) {
7721: /* use Multiword DMA */
7722: drvp->drive_flags &= ~DRIVE_UDMA;
7723: if (ACARD_IS_850(sc)) {
7724: idetime |= ATP850_SETTIME(drive,
7725: acard_act_dma[drvp->DMA_mode],
7726: acard_rec_dma[drvp->DMA_mode]);
7727: } else {
7728: idetime |= ATP860_SETTIME(channel, drive,
7729: acard_act_dma[drvp->DMA_mode],
7730: acard_rec_dma[drvp->DMA_mode]);
7731: }
7732: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
7733: } else {
7734: /* PIO only */
7735: drvp->drive_flags &= ~(DRIVE_UDMA | DRIVE_DMA);
7736: if (ACARD_IS_850(sc)) {
7737: idetime |= ATP850_SETTIME(drive,
7738: acard_act_pio[drvp->PIO_mode],
7739: acard_rec_pio[drvp->PIO_mode]);
7740: } else {
7741: idetime |= ATP860_SETTIME(channel, drive,
7742: acard_act_pio[drvp->PIO_mode],
7743: acard_rec_pio[drvp->PIO_mode]);
7744: }
7745: pci_conf_write(sc->sc_pc, sc->sc_tag, ATP8x0_CTRL,
7746: pci_conf_read(sc->sc_pc, sc->sc_tag, ATP8x0_CTRL)
7747: | ATP8x0_CTRL_EN(channel));
7748: }
7749: }
7750:
7751: if (idedma_ctl != 0) {
7752: /* Add software bits in status register */
7753: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
7754: IDEDMA_CTL(channel), idedma_ctl);
7755: }
7756: pciide_print_modes(cp);
7757:
7758: if (ACARD_IS_850(sc)) {
7759: pci_conf_write(sc->sc_pc, sc->sc_tag,
7760: ATP850_IDETIME(channel), idetime);
7761: pci_conf_write(sc->sc_pc, sc->sc_tag, ATP850_UDMA, udma_mode);
7762: } else {
7763: pci_conf_write(sc->sc_pc, sc->sc_tag, ATP860_IDETIME, idetime);
7764: pci_conf_write(sc->sc_pc, sc->sc_tag, ATP860_UDMA, udma_mode);
7765: }
7766: }
7767:
7768: void
7769: nforce_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
7770: {
7771: struct pciide_channel *cp;
7772: int channel;
7773: pcireg_t interface = PCI_INTERFACE(pa->pa_class);
7774: bus_size_t cmdsize, ctlsize;
7775: u_int32_t conf;
7776:
7777: conf = pci_conf_read(sc->sc_pc, sc->sc_tag, NFORCE_CONF);
7778: WDCDEBUG_PRINT(("%s: conf register 0x%x\n",
7779: sc->sc_wdcdev.sc_dev.dv_xname, conf), DEBUG_PROBE);
7780:
7781: printf(": DMA");
7782: pciide_mapreg_dma(sc, pa);
7783:
7784: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
7785: WDC_CAPABILITY_MODE;
7786: if (sc->sc_dma_ok) {
7787: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
7788: sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
7789: sc->sc_wdcdev.irqack = pciide_irqack;
7790: }
7791: sc->sc_wdcdev.PIO_cap = 4;
7792: sc->sc_wdcdev.DMA_cap = 2;
7793: switch (sc->sc_pp->ide_product) {
7794: case PCI_PRODUCT_NVIDIA_NFORCE_IDE:
7795: sc->sc_wdcdev.UDMA_cap = 5;
7796: break;
7797: default:
7798: sc->sc_wdcdev.UDMA_cap = 6;
7799: }
7800: sc->sc_wdcdev.set_modes = nforce_setup_channel;
7801: sc->sc_wdcdev.channels = sc->wdc_chanarray;
7802: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
7803:
7804: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
7805:
7806: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
7807: cp = &sc->pciide_channels[channel];
7808:
7809: if (pciide_chansetup(sc, channel, interface) == 0)
7810: continue;
7811:
7812: if ((conf & NFORCE_CHAN_EN(channel)) == 0) {
7813: printf("%s: %s ignored (disabled)\n",
7814: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
7815: continue;
7816: }
7817:
7818: pciide_map_compat_intr(pa, cp, channel, interface);
7819: if (cp->hw_ok == 0)
7820: continue;
7821: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
7822: nforce_pci_intr);
7823: if (cp->hw_ok == 0) {
7824: pciide_unmap_compat_intr(pa, cp, channel, interface);
7825: continue;
7826: }
7827:
7828: if (pciide_chan_candisable(cp)) {
7829: conf &= ~NFORCE_CHAN_EN(channel);
7830: pciide_unmap_compat_intr(pa, cp, channel, interface);
7831: continue;
7832: }
7833:
7834: sc->sc_wdcdev.set_modes(&cp->wdc_channel);
7835: }
7836: WDCDEBUG_PRINT(("%s: new conf register 0x%x\n",
7837: sc->sc_wdcdev.sc_dev.dv_xname, conf), DEBUG_PROBE);
7838: pci_conf_write(sc->sc_pc, sc->sc_tag, NFORCE_CONF, conf);
7839: }
7840:
7841: void
7842: nforce_setup_channel(struct channel_softc *chp)
7843: {
7844: struct ata_drive_datas *drvp;
7845: int drive, mode;
7846: u_int32_t idedma_ctl;
7847: struct pciide_channel *cp = (struct pciide_channel *)chp;
7848: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
7849: int channel = chp->channel;
7850: u_int32_t conf, piodmatim, piotim, udmatim;
7851:
7852: conf = pci_conf_read(sc->sc_pc, sc->sc_tag, NFORCE_CONF);
7853: piodmatim = pci_conf_read(sc->sc_pc, sc->sc_tag, NFORCE_PIODMATIM);
7854: piotim = pci_conf_read(sc->sc_pc, sc->sc_tag, NFORCE_PIOTIM);
7855: udmatim = pci_conf_read(sc->sc_pc, sc->sc_tag, NFORCE_UDMATIM);
7856: WDCDEBUG_PRINT(("%s: %s old timing values: piodmatim=0x%x, "
7857: "piotim=0x%x, udmatim=0x%x\n", sc->sc_wdcdev.sc_dev.dv_xname,
7858: cp->name, piodmatim, piotim, udmatim), DEBUG_PROBE);
7859:
7860: /* Setup DMA if needed */
7861: pciide_channel_dma_setup(cp);
7862:
7863: /* Clear all bits for this channel */
7864: idedma_ctl = 0;
7865: piodmatim &= ~NFORCE_PIODMATIM_MASK(channel);
7866: udmatim &= ~NFORCE_UDMATIM_MASK(channel);
7867:
7868: /* Per channel settings */
7869: for (drive = 0; drive < 2; drive++) {
7870: drvp = &chp->ch_drive[drive];
7871:
7872: /* If no drive, skip */
7873: if ((drvp->drive_flags & DRIVE) == 0)
7874: continue;
7875:
7876: if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) != 0 &&
7877: (drvp->drive_flags & DRIVE_UDMA) != 0) {
7878: /* Setup UltraDMA mode */
7879: drvp->drive_flags &= ~DRIVE_DMA;
7880:
7881: udmatim |= NFORCE_UDMATIM_SET(channel, drive,
7882: nforce_udma[drvp->UDMA_mode]) |
7883: NFORCE_UDMA_EN(channel, drive) |
7884: NFORCE_UDMA_ENM(channel, drive);
7885:
7886: mode = drvp->PIO_mode;
7887: } else if ((chp->wdc->cap & WDC_CAPABILITY_DMA) != 0 &&
7888: (drvp->drive_flags & DRIVE_DMA) != 0) {
7889: /* Setup multiword DMA mode */
7890: drvp->drive_flags &= ~DRIVE_UDMA;
7891:
7892: /* mode = min(pio, dma + 2) */
7893: if (drvp->PIO_mode <= (drvp->DMA_mode + 2))
7894: mode = drvp->PIO_mode;
7895: else
7896: mode = drvp->DMA_mode + 2;
7897: } else {
7898: mode = drvp->PIO_mode;
7899: goto pio;
7900: }
7901: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
7902:
7903: pio:
7904: /* Setup PIO mode */
7905: if (mode <= 2) {
7906: drvp->DMA_mode = 0;
7907: drvp->PIO_mode = 0;
7908: mode = 0;
7909: } else {
7910: drvp->PIO_mode = mode;
7911: drvp->DMA_mode = mode - 2;
7912: }
7913: piodmatim |= NFORCE_PIODMATIM_SET(channel, drive,
7914: nforce_pio[mode]);
7915: }
7916:
7917: if (idedma_ctl != 0) {
7918: /* Add software bits in status register */
7919: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
7920: IDEDMA_CTL(channel), idedma_ctl);
7921: }
7922:
7923: WDCDEBUG_PRINT(("%s: %s new timing values: piodmatim=0x%x, "
7924: "piotim=0x%x, udmatim=0x%x\n", sc->sc_wdcdev.sc_dev.dv_xname,
7925: cp->name, piodmatim, piotim, udmatim), DEBUG_PROBE);
7926: pci_conf_write(sc->sc_pc, sc->sc_tag, NFORCE_PIODMATIM, piodmatim);
7927: pci_conf_write(sc->sc_pc, sc->sc_tag, NFORCE_UDMATIM, udmatim);
7928:
7929: pciide_print_modes(cp);
7930: }
7931:
7932: int
7933: nforce_pci_intr(void *arg)
7934: {
7935: struct pciide_softc *sc = arg;
7936: struct pciide_channel *cp;
7937: struct channel_softc *wdc_cp;
7938: int i, rv, crv;
7939: u_int32_t dmastat;
7940:
7941: rv = 0;
7942: for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
7943: cp = &sc->pciide_channels[i];
7944: wdc_cp = &cp->wdc_channel;
7945:
7946: /* Skip compat channel */
7947: if (cp->compat)
7948: continue;
7949:
7950: dmastat = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
7951: IDEDMA_CTL(i));
7952: if ((dmastat & IDEDMA_CTL_INTR) == 0)
7953: continue;
7954:
7955: crv = wdcintr(wdc_cp);
7956: if (crv == 0)
7957: printf("%s:%d: bogus intr\n",
7958: sc->sc_wdcdev.sc_dev.dv_xname, i);
7959: else
7960: rv = 1;
7961: }
7962: return (rv);
7963: }
7964:
7965: void
7966: artisea_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
7967: {
7968: struct pciide_channel *cp;
7969: bus_size_t cmdsize, ctlsize;
7970: pcireg_t interface;
7971: int channel;
7972:
7973: printf(": DMA");
7974: #ifdef PCIIDE_I31244_DISABLEDMA
7975: if (sc->sc_rev == 0) {
7976: printf(" disabled due to rev. 0");
7977: sc->sc_dma_ok = 0;
7978: } else
7979: #endif
7980: pciide_mapreg_dma(sc, pa);
7981: printf("\n");
7982:
7983: /*
7984: * XXX Configure LEDs to show activity.
7985: */
7986:
7987: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
7988: WDC_CAPABILITY_MODE | WDC_CAPABILITY_SATA;
7989: sc->sc_wdcdev.PIO_cap = 4;
7990: if (sc->sc_dma_ok) {
7991: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
7992: sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
7993: sc->sc_wdcdev.irqack = pciide_irqack;
7994: sc->sc_wdcdev.DMA_cap = 2;
7995: sc->sc_wdcdev.UDMA_cap = 6;
7996: }
7997: sc->sc_wdcdev.set_modes = sata_setup_channel;
7998:
7999: sc->sc_wdcdev.channels = sc->wdc_chanarray;
8000: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
8001:
8002: interface = PCI_INTERFACE(pa->pa_class);
8003:
8004: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
8005: cp = &sc->pciide_channels[channel];
8006: if (pciide_chansetup(sc, channel, interface) == 0)
8007: continue;
8008: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
8009: pciide_pci_intr);
8010: if (cp->hw_ok == 0)
8011: continue;
8012: pciide_map_compat_intr(pa, cp, channel, interface);
8013: sata_setup_channel(&cp->wdc_channel);
8014: }
8015: }
8016:
8017: void
8018: ite_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
8019: {
8020: struct pciide_channel *cp;
8021: int channel;
8022: pcireg_t interface;
8023: bus_size_t cmdsize, ctlsize;
8024: pcireg_t cfg, modectl;
8025:
8026: /*
8027: * Fake interface since IT8212F is claimed to be a ``RAID'' device.
8028: */
8029: interface = PCIIDE_INTERFACE_BUS_MASTER_DMA |
8030: PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1);
8031:
8032: cfg = pci_conf_read(sc->sc_pc, sc->sc_tag, IT_CFG);
8033: modectl = pci_conf_read(sc->sc_pc, sc->sc_tag, IT_MODE);
8034: WDCDEBUG_PRINT(("%s: cfg=0x%x, modectl=0x%x\n",
8035: sc->sc_wdcdev.sc_dev.dv_xname, cfg & IT_CFG_MASK,
8036: modectl & IT_MODE_MASK), DEBUG_PROBE);
8037:
8038: printf(": DMA");
8039: pciide_mapreg_dma(sc, pa);
8040:
8041: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
8042: WDC_CAPABILITY_MODE;
8043: if (sc->sc_dma_ok) {
8044: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
8045: sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
8046: sc->sc_wdcdev.irqack = pciide_irqack;
8047: }
8048: sc->sc_wdcdev.PIO_cap = 4;
8049: sc->sc_wdcdev.DMA_cap = 2;
8050: sc->sc_wdcdev.UDMA_cap = 6;
8051:
8052: sc->sc_wdcdev.set_modes = ite_setup_channel;
8053: sc->sc_wdcdev.channels = sc->wdc_chanarray;
8054: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
8055:
8056: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
8057:
8058: /* Disable RAID */
8059: modectl &= ~IT_MODE_RAID1;
8060: /* Disable CPU firmware mode */
8061: modectl &= ~IT_MODE_CPU;
8062:
8063: pci_conf_write(sc->sc_pc, sc->sc_tag, IT_MODE, modectl);
8064:
8065: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
8066: cp = &sc->pciide_channels[channel];
8067:
8068: if (pciide_chansetup(sc, channel, interface) == 0)
8069: continue;
8070: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
8071: pciide_pci_intr);
8072: sc->sc_wdcdev.set_modes(&cp->wdc_channel);
8073: }
8074:
8075: /* Re-read configuration registers after channels setup */
8076: cfg = pci_conf_read(sc->sc_pc, sc->sc_tag, IT_CFG);
8077: modectl = pci_conf_read(sc->sc_pc, sc->sc_tag, IT_MODE);
8078: WDCDEBUG_PRINT(("%s: cfg=0x%x, modectl=0x%x\n",
8079: sc->sc_wdcdev.sc_dev.dv_xname, cfg & IT_CFG_MASK,
8080: modectl & IT_MODE_MASK), DEBUG_PROBE);
8081: }
8082:
8083: void
8084: ite_setup_channel(struct channel_softc *chp)
8085: {
8086: struct ata_drive_datas *drvp;
8087: int drive, mode;
8088: u_int32_t idedma_ctl;
8089: struct pciide_channel *cp = (struct pciide_channel *)chp;
8090: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
8091: int channel = chp->channel;
8092: pcireg_t cfg, modectl;
8093: pcireg_t tim;
8094:
8095: cfg = pci_conf_read(sc->sc_pc, sc->sc_tag, IT_CFG);
8096: modectl = pci_conf_read(sc->sc_pc, sc->sc_tag, IT_MODE);
8097: tim = pci_conf_read(sc->sc_pc, sc->sc_tag, IT_TIM(channel));
8098: WDCDEBUG_PRINT(("%s:%d: tim=0x%x\n", sc->sc_wdcdev.sc_dev.dv_xname,
8099: channel, tim), DEBUG_PROBE);
8100:
8101: /* Setup DMA if needed */
8102: pciide_channel_dma_setup(cp);
8103:
8104: /* Clear all bits for this channel */
8105: idedma_ctl = 0;
8106:
8107: /* Per channel settings */
8108: for (drive = 0; drive < 2; drive++) {
8109: drvp = &chp->ch_drive[drive];
8110:
8111: /* If no drive, skip */
8112: if ((drvp->drive_flags & DRIVE) == 0)
8113: continue;
8114:
8115: if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) != 0 &&
8116: (drvp->drive_flags & DRIVE_UDMA) != 0) {
8117: /* Setup UltraDMA mode */
8118: drvp->drive_flags &= ~DRIVE_DMA;
8119: modectl &= ~IT_MODE_DMA(channel, drive);
8120:
8121: #if 0
8122: /* Check cable, works only in CPU firmware mode */
8123: if (drvp->UDMA_mode > 2 &&
8124: (cfg & IT_CFG_CABLE(channel, drive)) == 0) {
8125: WDCDEBUG_PRINT(("%s(%s:%d:%d): "
8126: "80-wire cable not detected\n",
8127: drvp->drive_name,
8128: sc->sc_wdcdev.sc_dev.dv_xname,
8129: channel, drive), DEBUG_PROBE);
8130: drvp->UDMA_mode = 2;
8131: }
8132: #endif
8133:
8134: if (drvp->UDMA_mode >= 5)
8135: tim |= IT_TIM_UDMA5(drive);
8136: else
8137: tim &= ~IT_TIM_UDMA5(drive);
8138:
8139: mode = drvp->PIO_mode;
8140: } else if ((chp->wdc->cap & WDC_CAPABILITY_DMA) != 0 &&
8141: (drvp->drive_flags & DRIVE_DMA) != 0) {
8142: /* Setup multiword DMA mode */
8143: drvp->drive_flags &= ~DRIVE_UDMA;
8144: modectl |= IT_MODE_DMA(channel, drive);
8145:
8146: /* mode = min(pio, dma + 2) */
8147: if (drvp->PIO_mode <= (drvp->DMA_mode + 2))
8148: mode = drvp->PIO_mode;
8149: else
8150: mode = drvp->DMA_mode + 2;
8151: } else {
8152: goto pio;
8153: }
8154: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
8155:
8156: pio:
8157: /* Setup PIO mode */
8158: if (mode <= 2) {
8159: drvp->DMA_mode = 0;
8160: drvp->PIO_mode = 0;
8161: mode = 0;
8162: } else {
8163: drvp->PIO_mode = mode;
8164: drvp->DMA_mode = mode - 2;
8165: }
8166:
8167: /* Enable IORDY if PIO mode >= 3 */
8168: if (drvp->PIO_mode >= 3)
8169: cfg |= IT_CFG_IORDY(channel);
8170: }
8171:
8172: WDCDEBUG_PRINT(("%s: tim=0x%x\n", sc->sc_wdcdev.sc_dev.dv_xname,
8173: tim), DEBUG_PROBE);
8174:
8175: pci_conf_write(sc->sc_pc, sc->sc_tag, IT_CFG, cfg);
8176: pci_conf_write(sc->sc_pc, sc->sc_tag, IT_MODE, modectl);
8177: pci_conf_write(sc->sc_pc, sc->sc_tag, IT_TIM(channel), tim);
8178:
8179: if (idedma_ctl != 0) {
8180: /* Add software bits in status register */
8181: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
8182: IDEDMA_CTL(channel), idedma_ctl);
8183: }
8184:
8185: pciide_print_modes(cp);
8186: }
8187:
8188: void
8189: ixp_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
8190: {
8191: struct pciide_channel *cp;
8192: int channel;
8193: pcireg_t interface = PCI_INTERFACE(pa->pa_class);
8194: bus_size_t cmdsize, ctlsize;
8195:
8196: printf(": DMA");
8197: pciide_mapreg_dma(sc, pa);
8198:
8199: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
8200: WDC_CAPABILITY_MODE;
8201: if (sc->sc_dma_ok) {
8202: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
8203: sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
8204: sc->sc_wdcdev.irqack = pciide_irqack;
8205: }
8206: sc->sc_wdcdev.PIO_cap = 4;
8207: sc->sc_wdcdev.DMA_cap = 2;
8208: sc->sc_wdcdev.UDMA_cap = 6;
8209:
8210: sc->sc_wdcdev.set_modes = ixp_setup_channel;
8211: sc->sc_wdcdev.channels = sc->wdc_chanarray;
8212: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
8213:
8214: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
8215:
8216: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
8217: cp = &sc->pciide_channels[channel];
8218: if (pciide_chansetup(sc, channel, interface) == 0)
8219: continue;
8220: pciide_map_compat_intr(pa, cp, channel, interface);
8221: if (cp->hw_ok == 0)
8222: continue;
8223: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
8224: pciide_pci_intr);
8225: if (cp->hw_ok == 0) {
8226: pciide_unmap_compat_intr(pa, cp, channel, interface);
8227: continue;
8228: }
8229: sc->sc_wdcdev.set_modes(&cp->wdc_channel);
8230: }
8231: }
8232:
8233: void
8234: ixp_setup_channel(struct channel_softc *chp)
8235: {
8236: struct ata_drive_datas *drvp;
8237: int drive, mode;
8238: u_int32_t idedma_ctl;
8239: struct pciide_channel *cp = (struct pciide_channel*)chp;
8240: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
8241: int channel = chp->channel;
8242: pcireg_t udma, mdma_timing, pio, pio_timing;
8243:
8244: pio_timing = pci_conf_read(sc->sc_pc, sc->sc_tag, IXP_PIO_TIMING);
8245: pio = pci_conf_read(sc->sc_pc, sc->sc_tag, IXP_PIO_CTL);
8246: mdma_timing = pci_conf_read(sc->sc_pc, sc->sc_tag, IXP_MDMA_TIMING);
8247: udma = pci_conf_read(sc->sc_pc, sc->sc_tag, IXP_UDMA_CTL);
8248:
8249: /* Setup DMA if needed */
8250: pciide_channel_dma_setup(cp);
8251:
8252: idedma_ctl = 0;
8253:
8254: /* Per channel settings */
8255: for (drive = 0; drive < 2; drive++) {
8256: drvp = &chp->ch_drive[drive];
8257:
8258: /* If no drive, skip */
8259: if ((drvp->drive_flags & DRIVE) == 0)
8260: continue;
8261: if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) != 0 &&
8262: (drvp->drive_flags & DRIVE_UDMA) != 0) {
8263: /* Setup UltraDMA mode */
8264: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
8265: IXP_UDMA_ENABLE(udma, chp->channel, drive);
8266: IXP_SET_MODE(udma, chp->channel, drive,
8267: drvp->UDMA_mode);
8268: mode = drvp->PIO_mode;
8269: } else if ((chp->wdc->cap & WDC_CAPABILITY_DMA) != 0 &&
8270: (drvp->drive_flags & DRIVE_DMA) != 0) {
8271: /* Setup multiword DMA mode */
8272: drvp->drive_flags &= ~DRIVE_UDMA;
8273: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
8274: IXP_UDMA_DISABLE(udma, chp->channel, drive);
8275: IXP_SET_TIMING(mdma_timing, chp->channel, drive,
8276: ixp_mdma_timings[drvp->DMA_mode]);
8277:
8278: /* mode = min(pio, dma + 2) */
8279: if (drvp->PIO_mode <= (drvp->DMA_mode + 2))
8280: mode = drvp->PIO_mode;
8281: else
8282: mode = drvp->DMA_mode + 2;
8283: } else {
8284: mode = drvp->PIO_mode;
8285: }
8286:
8287: /* Setup PIO mode */
8288: drvp->PIO_mode = mode;
8289: if (mode < 2)
8290: drvp->DMA_mode = 0;
8291: else
8292: drvp->DMA_mode = mode - 2;
8293: /*
8294: * Set PIO mode and timings
8295: * Linux driver avoids PIO mode 1, let's do it too.
8296: */
8297: if (drvp->PIO_mode == 1)
8298: drvp->PIO_mode = 0;
8299:
8300: IXP_SET_MODE(pio, chp->channel, drive, drvp->PIO_mode);
8301: IXP_SET_TIMING(pio_timing, chp->channel, drive,
8302: ixp_pio_timings[drvp->PIO_mode]);
8303: }
8304:
8305: pci_conf_write(sc->sc_pc, sc->sc_tag, IXP_UDMA_CTL, udma);
8306: pci_conf_write(sc->sc_pc, sc->sc_tag, IXP_MDMA_TIMING, mdma_timing);
8307: pci_conf_write(sc->sc_pc, sc->sc_tag, IXP_PIO_CTL, pio);
8308: pci_conf_write(sc->sc_pc, sc->sc_tag, IXP_PIO_TIMING, pio_timing);
8309:
8310: if (idedma_ctl != 0) {
8311: /* Add software bits in status register */
8312: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
8313: IDEDMA_CTL(channel), idedma_ctl);
8314: }
8315:
8316: pciide_print_modes(cp);
8317: }
8318:
8319: void
8320: jmicron_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
8321: {
8322: struct pciide_channel *cp;
8323: int channel;
8324: pcireg_t interface = PCI_INTERFACE(pa->pa_class);
8325: bus_size_t cmdsize, ctlsize;
8326: u_int32_t conf;
8327:
8328: conf = pci_conf_read(sc->sc_pc, sc->sc_tag, JMICRON_CONF);
8329: WDCDEBUG_PRINT(("%s: conf register 0x%x\n",
8330: sc->sc_wdcdev.sc_dev.dv_xname, conf), DEBUG_PROBE);
8331:
8332: printf(": DMA");
8333: pciide_mapreg_dma(sc, pa);
8334:
8335: sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
8336: WDC_CAPABILITY_MODE;
8337: if (sc->sc_dma_ok) {
8338: sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
8339: sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
8340: sc->sc_wdcdev.irqack = pciide_irqack;
8341: }
8342: sc->sc_wdcdev.PIO_cap = 4;
8343: sc->sc_wdcdev.DMA_cap = 2;
8344: sc->sc_wdcdev.UDMA_cap = 6;
8345: sc->sc_wdcdev.set_modes = jmicron_setup_channel;
8346: sc->sc_wdcdev.channels = sc->wdc_chanarray;
8347: sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
8348:
8349: pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
8350:
8351: for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
8352: cp = &sc->pciide_channels[channel];
8353:
8354: if (pciide_chansetup(sc, channel, interface) == 0)
8355: continue;
8356:
8357: #if 0
8358: if ((conf & JMICRON_CHAN_EN(channel)) == 0) {
8359: printf("%s: %s ignored (disabled)\n",
8360: sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
8361: continue;
8362: }
8363: #endif
8364:
8365: pciide_map_compat_intr(pa, cp, channel, interface);
8366: if (cp->hw_ok == 0)
8367: continue;
8368: pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
8369: pciide_pci_intr);
8370: if (cp->hw_ok == 0) {
8371: pciide_unmap_compat_intr(pa, cp, channel, interface);
8372: continue;
8373: }
8374:
8375: if (pciide_chan_candisable(cp)) {
8376: conf &= ~JMICRON_CHAN_EN(channel);
8377: pciide_unmap_compat_intr(pa, cp, channel, interface);
8378: continue;
8379: }
8380:
8381: sc->sc_wdcdev.set_modes(&cp->wdc_channel);
8382: }
8383: WDCDEBUG_PRINT(("%s: new conf register 0x%x\n",
8384: sc->sc_wdcdev.sc_dev.dv_xname, conf), DEBUG_PROBE);
8385: pci_conf_write(sc->sc_pc, sc->sc_tag, NFORCE_CONF, conf);
8386: }
8387:
8388: void
8389: jmicron_setup_channel(struct channel_softc *chp)
8390: {
8391: struct ata_drive_datas *drvp;
8392: int drive, mode;
8393: u_int32_t idedma_ctl;
8394: struct pciide_channel *cp = (struct pciide_channel *)chp;
8395: struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
8396: int channel = chp->channel;
8397: u_int32_t conf;
8398:
8399: conf = pci_conf_read(sc->sc_pc, sc->sc_tag, JMICRON_CONF);
8400:
8401: /* Setup DMA if needed */
8402: pciide_channel_dma_setup(cp);
8403:
8404: /* Clear all bits for this channel */
8405: idedma_ctl = 0;
8406:
8407: /* Per channel settings */
8408: for (drive = 0; drive < 2; drive++) {
8409: drvp = &chp->ch_drive[drive];
8410:
8411: /* If no drive, skip */
8412: if ((drvp->drive_flags & DRIVE) == 0)
8413: continue;
8414:
8415: if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) != 0 &&
8416: (drvp->drive_flags & DRIVE_UDMA) != 0) {
8417: /* Setup UltraDMA mode */
8418: drvp->drive_flags &= ~DRIVE_DMA;
8419:
8420: /* see if cable is up to scratch */
8421: if ((conf & JMICRON_CONF_40PIN) &&
8422: (drvp->UDMA_mode > 2))
8423: drvp->UDMA_mode = 2;
8424:
8425: mode = drvp->PIO_mode;
8426: } else if ((chp->wdc->cap & WDC_CAPABILITY_DMA) != 0 &&
8427: (drvp->drive_flags & DRIVE_DMA) != 0) {
8428: /* Setup multiword DMA mode */
8429: drvp->drive_flags &= ~DRIVE_UDMA;
8430:
8431: /* mode = min(pio, dma + 2) */
8432: if (drvp->PIO_mode <= (drvp->DMA_mode + 2))
8433: mode = drvp->PIO_mode;
8434: else
8435: mode = drvp->DMA_mode + 2;
8436: } else {
8437: mode = drvp->PIO_mode;
8438: goto pio;
8439: }
8440: idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
8441:
8442: pio:
8443: /* Setup PIO mode */
8444: if (mode <= 2) {
8445: drvp->DMA_mode = 0;
8446: drvp->PIO_mode = 0;
8447: mode = 0;
8448: } else {
8449: drvp->PIO_mode = mode;
8450: drvp->DMA_mode = mode - 2;
8451: }
8452: }
8453:
8454: if (idedma_ctl != 0) {
8455: /* Add software bits in status register */
8456: bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
8457: IDEDMA_CTL(channel), idedma_ctl);
8458: }
8459:
8460: pciide_print_modes(cp);
8461: }
CVSweb