This source file includes following definitions.
- pciide_pci_read
- pciide_pci_write
- pciide_lookup_product
- pciide_match
- pciide_attach
- pciide_mapregs_compat
- pciide_mapregs_native
- pciide_mapreg_dma
- pciide_intr_flag
- pciide_compat_intr
- pciide_pci_intr
- pciide_dmacmd_read
- pciide_dmacmd_write
- pciide_dmactl_read
- pciide_dmactl_write
- pciide_dmatbl_write
- pciide_channel_dma_setup
- pciide_dma_table_setup
- pciide_dma_init
- pciide_dma_start
- pciide_dma_finish
- pciide_irqack
- pciide_chansetup
- pciide_mapchan
- pciide_chan_candisable
- pciide_map_compat_intr
- pciide_unmap_compat_intr
- pciide_print_channels
- pciide_print_modes
- default_chip_map
- sata_chip_map
- sata_setup_channel
- piix_timing_debug
- piix_chip_map
- piixsata_chip_map
- piix_setup_channel
- piix3_4_setup_channel
- piix_setup_idetim_timings
- piix_setup_idetim_drvs
- piix_setup_sidetim_timings
- amd756_chip_map
- amd756_setup_channel
- apollo_chip_map
- apollo_setup_channel
- cmd_channel_map
- cmd_pci_intr
- cmd_chip_map
- cmd0643_9_chip_map
- cmd0643_9_setup_channel
- cmd646_9_irqack
- cmd680_chip_map
- cmd680_channel_map
- cmd680_setup_channel
- sii_fixup_cacheline
- sii3112_chip_map
- sii3112_setup_channel
- sii3112_drv_probe
- sii3114_chip_map
- sii3114_mapreg_dma
- sii3114_chansetup
- sii3114_mapchan
- sii3114_read_reg
- sii3114_write_reg
- sii3114_dmacmd_read
- sii3114_dmacmd_write
- sii3114_dmactl_read
- sii3114_dmactl_write
- sii3114_dmatbl_write
- cy693_chip_map
- cy693_setup_channel
- sis_hostbr_match
- sis_south_match
- sis_chip_map
- sis96x_setup_channel
- sis_setup_channel
- natsemi_chip_map
- natsemi_setup_channel
- natsemi_irqack
- natsemi_pci_intr
- ns_scx200_chip_map
- ns_scx200_setup_channel
- acer_chip_map
- acer_setup_channel
- acer_pci_intr
- hpt_chip_map
- hpt_setup_channel
- hpt_pci_intr
- pdc268_config_read
- pdc268_config_write
- pdc202xx_chip_map
- pdc202xx_setup_channel
- pdc20268_setup_channel
- pdc202xx_pci_intr
- pdc20265_pci_intr
- pdc20262_dma_start
- pdc20262_dma_finish
- pdcsata_chip_map
- pdc203xx_setup_channel
- pdc203xx_pci_intr
- pdc205xx_pci_intr
- pdc203xx_irqack
- pdc203xx_dma_start
- pdc203xx_dma_finish
- pdc203xx_read_reg
- pdc203xx_write_reg
- pdc205xx_do_reset
- pdc205xx_drv_probe
- opti_read_config
- opti_write_config
- opti_chip_map
- opti_setup_channel
- serverworks_chip_map
- serverworks_setup_channel
- serverworks_pci_intr
- svwsata_chip_map
- svwsata_mapreg_dma
- svwsata_dmacmd_read
- svwsata_dmacmd_write
- svwsata_dmactl_read
- svwsata_dmactl_write
- svwsata_dmatbl_write
- svwsata_mapchan
- svwsata_drv_probe
- svwsata_read_reg
- svwsata_write_reg
- svwsata_lba48_write_reg
- acard_chip_map
- acard_setup_channel
- nforce_chip_map
- nforce_setup_channel
- nforce_pci_intr
- artisea_chip_map
- ite_chip_map
- ite_setup_channel
- ixp_chip_map
- ixp_setup_channel
- jmicron_chip_map
- jmicron_setup_channel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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
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
307 void (*chip_map)(struct pciide_softc *, struct pci_attach_args *);
308 };
309
310
311 #define IDE_PCI_CLASS_OVERRIDE 0x0001
312 #define IDE_16BIT_IOSPACE 0x0002
313
314
315 const struct pciide_product_desc default_product_desc = {
316 0,
317 0,
318 default_chip_map
319 };
320
321 const struct pciide_product_desc pciide_intel_products[] = {
322 { PCI_PRODUCT_INTEL_31244,
323 0,
324 artisea_chip_map
325 },
326 { PCI_PRODUCT_INTEL_82092AA,
327 0,
328 default_chip_map
329 },
330 { PCI_PRODUCT_INTEL_82371FB_IDE,
331 0,
332 piix_chip_map
333 },
334 { PCI_PRODUCT_INTEL_82371FB_ISA,
335 0,
336 piix_chip_map
337 },
338 { PCI_PRODUCT_INTEL_82372FB_IDE,
339 0,
340 piix_chip_map
341 },
342 { PCI_PRODUCT_INTEL_82371SB_IDE,
343 0,
344 piix_chip_map
345 },
346 { PCI_PRODUCT_INTEL_82371AB_IDE,
347 0,
348 piix_chip_map
349 },
350 { PCI_PRODUCT_INTEL_82371MX,
351 0,
352 piix_chip_map
353 },
354 { PCI_PRODUCT_INTEL_82440MX_IDE,
355 0,
356 piix_chip_map
357 },
358 { PCI_PRODUCT_INTEL_82451NX,
359 0,
360 piix_chip_map
361 },
362 { PCI_PRODUCT_INTEL_82801AA_IDE,
363 0,
364 piix_chip_map
365 },
366 { PCI_PRODUCT_INTEL_82801AB_IDE,
367 0,
368 piix_chip_map
369 },
370 { PCI_PRODUCT_INTEL_82801BAM_IDE,
371 0,
372 piix_chip_map
373 },
374 { PCI_PRODUCT_INTEL_82801BA_IDE,
375 0,
376 piix_chip_map
377 },
378 { PCI_PRODUCT_INTEL_82801CAM_IDE,
379 0,
380 piix_chip_map
381 },
382 { PCI_PRODUCT_INTEL_82801CA_IDE,
383 0,
384 piix_chip_map
385 },
386 { PCI_PRODUCT_INTEL_82801DB_IDE,
387 0,
388 piix_chip_map
389 },
390 { PCI_PRODUCT_INTEL_82801DBL_IDE,
391 0,
392 piix_chip_map
393 },
394 { PCI_PRODUCT_INTEL_82801DBM_IDE,
395 0,
396 piix_chip_map
397 },
398 { PCI_PRODUCT_INTEL_82801EB_IDE,
399 0,
400 piix_chip_map
401 },
402 { PCI_PRODUCT_INTEL_82801EB_SATA,
403 0,
404 piixsata_chip_map
405 },
406 { PCI_PRODUCT_INTEL_82801ER_SATA,
407 IDE_PCI_CLASS_OVERRIDE,
408 piixsata_chip_map
409 },
410 { PCI_PRODUCT_INTEL_6300ESB_IDE,
411 IDE_PCI_CLASS_OVERRIDE,
412 piix_chip_map
413 },
414 { PCI_PRODUCT_INTEL_6300ESB_SATA,
415 IDE_PCI_CLASS_OVERRIDE,
416 piixsata_chip_map
417 },
418 { PCI_PRODUCT_INTEL_6300ESB_SATA2,
419 IDE_PCI_CLASS_OVERRIDE,
420 piixsata_chip_map
421 },
422 { PCI_PRODUCT_INTEL_6321ESB_IDE,
423 IDE_PCI_CLASS_OVERRIDE,
424 piix_chip_map
425 },
426 { PCI_PRODUCT_INTEL_82801FB_IDE,
427 IDE_PCI_CLASS_OVERRIDE,
428 piix_chip_map
429 },
430 { PCI_PRODUCT_INTEL_82801FBM_SATA,
431 IDE_PCI_CLASS_OVERRIDE,
432 piixsata_chip_map
433 },
434 { PCI_PRODUCT_INTEL_82801FB_SATA,
435 IDE_PCI_CLASS_OVERRIDE,
436 piixsata_chip_map
437 },
438 { PCI_PRODUCT_INTEL_82801FR_SATA,
439 IDE_PCI_CLASS_OVERRIDE,
440 piixsata_chip_map
441 },
442 { PCI_PRODUCT_INTEL_82801GB_IDE,
443 IDE_PCI_CLASS_OVERRIDE,
444 piix_chip_map
445 },
446 { PCI_PRODUCT_INTEL_82801GB_SATA,
447 IDE_PCI_CLASS_OVERRIDE,
448 piixsata_chip_map
449 },
450 { PCI_PRODUCT_INTEL_82801GR_SATA,
451 IDE_PCI_CLASS_OVERRIDE,
452 piixsata_chip_map
453 },
454 { PCI_PRODUCT_INTEL_82801GR_AHCI,
455 IDE_PCI_CLASS_OVERRIDE,
456 piixsata_chip_map
457 },
458 { PCI_PRODUCT_INTEL_82801GBM_SATA,
459 IDE_PCI_CLASS_OVERRIDE,
460 piixsata_chip_map
461 },
462 { PCI_PRODUCT_INTEL_82801GBM_AHCI,
463 IDE_PCI_CLASS_OVERRIDE,
464 piixsata_chip_map
465 },
466 { PCI_PRODUCT_INTEL_82801GHM_RAID,
467 IDE_PCI_CLASS_OVERRIDE,
468 piixsata_chip_map
469 },
470 { PCI_PRODUCT_INTEL_82801H_SATA_1_6P,
471 IDE_PCI_CLASS_OVERRIDE,
472 piixsata_chip_map
473 },
474 { PCI_PRODUCT_INTEL_82801H_AHCI,
475 IDE_PCI_CLASS_OVERRIDE,
476 piixsata_chip_map
477 },
478 { PCI_PRODUCT_INTEL_82801H_RAID,
479 IDE_PCI_CLASS_OVERRIDE,
480 piixsata_chip_map
481 },
482 { PCI_PRODUCT_INTEL_82801H_SATA_1_4P,
483 IDE_PCI_CLASS_OVERRIDE,
484 piixsata_chip_map
485 },
486 { PCI_PRODUCT_INTEL_82801H_SATA_2,
487 IDE_PCI_CLASS_OVERRIDE,
488 piixsata_chip_map
489 },
490 { PCI_PRODUCT_INTEL_82801HBM_SATA_1,
491 IDE_PCI_CLASS_OVERRIDE,
492 piixsata_chip_map
493 },
494 { PCI_PRODUCT_INTEL_82801HBM_SATA_2,
495 IDE_PCI_CLASS_OVERRIDE,
496 piixsata_chip_map
497 },
498 { PCI_PRODUCT_INTEL_82801HBM_IDE,
499 0,
500 piix_chip_map
501 },
502 { PCI_PRODUCT_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,
510 0,
511 amd756_chip_map
512 },
513 { PCI_PRODUCT_AMD_766_IDE,
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,
551 0,
552 cmd_chip_map
553 },
554 { PCI_PRODUCT_CMDTECH_643,
555 0,
556 cmd0643_9_chip_map
557 },
558 { PCI_PRODUCT_CMDTECH_646,
559 0,
560 cmd0643_9_chip_map
561 },
562 { PCI_PRODUCT_CMDTECH_648,
563 IDE_PCI_CLASS_OVERRIDE,
564 cmd0643_9_chip_map
565 },
566 { PCI_PRODUCT_CMDTECH_649,
567 IDE_PCI_CLASS_OVERRIDE,
568 cmd0643_9_chip_map
569 },
570 { PCI_PRODUCT_CMDTECH_680,
571 IDE_PCI_CLASS_OVERRIDE,
572 cmd680_chip_map
573 },
574 { PCI_PRODUCT_CMDTECH_3112,
575 IDE_PCI_CLASS_OVERRIDE,
576 sii3112_chip_map
577 },
578 { PCI_PRODUCT_CMDTECH_3512,
579 IDE_PCI_CLASS_OVERRIDE,
580 sii3112_chip_map
581 },
582 { PCI_PRODUCT_CMDTECH_AAR_1210SA,
583 IDE_PCI_CLASS_OVERRIDE,
584 sii3112_chip_map
585 },
586 { PCI_PRODUCT_CMDTECH_3114,
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,
594 0,
595 apollo_chip_map
596 },
597 { PCI_PRODUCT_VIATECH_VT82C571,
598 0,
599 apollo_chip_map
600 },
601 { PCI_PRODUCT_VIATECH_VT6410,
602 IDE_PCI_CLASS_OVERRIDE,
603 apollo_chip_map
604 },
605 { PCI_PRODUCT_VIATECH_CX700_IDE,
606 0,
607 apollo_chip_map
608 },
609 { PCI_PRODUCT_VIATECH_VT6420_SATA,
610 IDE_PCI_CLASS_OVERRIDE,
611 sata_chip_map
612 },
613 { PCI_PRODUCT_VIATECH_VT6421_SATA,
614 IDE_PCI_CLASS_OVERRIDE,
615 sata_chip_map
616 },
617 { PCI_PRODUCT_VIATECH_VT8237A_SATA,
618 IDE_PCI_CLASS_OVERRIDE,
619 sata_chip_map
620 },
621 { PCI_PRODUCT_VIATECH_VT8237A_SATA_2,
622 0,
623 sata_chip_map
624 },
625 { PCI_PRODUCT_VIATECH_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,
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,
640 0,
641 sis_chip_map
642 },
643 { PCI_PRODUCT_SIS_180,
644 IDE_PCI_CLASS_OVERRIDE,
645 sata_chip_map
646 },
647 { PCI_PRODUCT_SIS_181,
648 IDE_PCI_CLASS_OVERRIDE,
649 sata_chip_map
650 },
651 { PCI_PRODUCT_SIS_182,
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,
659 0,
660 natsemi_chip_map
661 },
662 { PCI_PRODUCT_NS_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,
670 0,
671 acer_chip_map
672 }
673 };
674
675 const struct pciide_product_desc pciide_triones_products[] = {
676 { PCI_PRODUCT_TRIONES_HPT366,
677 IDE_PCI_CLASS_OVERRIDE,
678 hpt_chip_map,
679 },
680 { PCI_PRODUCT_TRIONES_HPT372A,
681 IDE_PCI_CLASS_OVERRIDE,
682 hpt_chip_map
683 },
684 { PCI_PRODUCT_TRIONES_HPT302,
685 IDE_PCI_CLASS_OVERRIDE,
686 hpt_chip_map
687 },
688 { PCI_PRODUCT_TRIONES_HPT371,
689 IDE_PCI_CLASS_OVERRIDE,
690 hpt_chip_map
691 },
692 { PCI_PRODUCT_TRIONES_HPT374,
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,
819 IDE_PCI_CLASS_OVERRIDE,
820 acard_chip_map,
821 },
822 { PCI_PRODUCT_ACARD_ATP860,
823 IDE_PCI_CLASS_OVERRIDE,
824 acard_chip_map,
825 },
826 { PCI_PRODUCT_ACARD_ATP860A,
827 IDE_PCI_CLASS_OVERRIDE,
828 acard_chip_map,
829 },
830 { PCI_PRODUCT_ACARD_ATP865A,
831 IDE_PCI_CLASS_OVERRIDE,
832 acard_chip_map,
833 },
834 { PCI_PRODUCT_ACARD_ATP865R,
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
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
1205
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
1213
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
1221
1222
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
1231
1232
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
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
1385
1386
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
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
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
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
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
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
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
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 ;
1531 else if (crv == 1)
1532 rv = 1;
1533 else if (rv == 0)
1534 rv = crv;
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
1584 if ((drvp->drive_flags & DRIVE) == 0)
1585 continue;
1586
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
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
1613 if (dma_maps->dma_table)
1614 return (0);
1615
1616
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
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
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
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
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
1743 PCIIDE_DMACTL_WRITE(sc, channel, PCIIDE_DMACTL_READ(sc, channel));
1744
1745 PCIIDE_DMATBL_WRITE(sc, channel,
1746 dma_maps->dmamap_table->dm_segs[0].ds_addr);
1747
1748 PCIIDE_DMACMD_WRITE(sc, channel,
1749 ((flags & WDC_DMA_READ) ? IDEDMA_CMD_WRITE : 0) | cp->idedma_cmd);
1750
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
1787 PCIIDE_DMACMD_WRITE(sc, channel,
1788 ((dma_maps->dma_flags & WDC_DMA_READ) ?
1789 0x00 : IDEDMA_CMD_WRITE) | cp->idedma_cmd);
1790
1791
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
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
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
1832 PCIIDE_DMACTL_WRITE(sc, chan, PCIIDE_DMACTL_READ(sc, chan));
1833 }
1834
1835
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
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
1880
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
1900
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
1924
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
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
2026
2027
2028
2029
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
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
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
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
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
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
2157 if ((drvp->drive_flags & DRIVE) == 0)
2158 continue;
2159 if (drvp->drive_flags & DRIVE_UDMA) {
2160
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
2170
2171
2172
2173 if (idedma_ctl != 0) {
2174
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
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
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
2384
2385
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
2416
2417
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
2463 idetim = PIIX_IDETIM_SET(idetim, PIIX_IDETIM_IDE,
2464 chp->channel);
2465
2466
2467 pciide_channel_dma_setup(cp);
2468
2469
2470
2471
2472
2473
2474
2475
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
2486
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
2506
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:
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
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
2537
2538
2539 for (drive = 0; drive < 2; drive++) {
2540
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
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
2577 if ((PIIX_IDETIM_READ(oidetim, channel) & PIIX_IDETIM_IDE) == 0)
2578 return;
2579
2580 idetim = PIIX_IDETIM_SET(idetim, PIIX_IDETIM_IDE, channel);
2581
2582
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
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
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
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
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
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:
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
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
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
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
2732
2733
2734 if (drvp->drive_flags & DRIVE_DMA) {
2735
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
2744
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
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
2761
2762
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
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
2883 pciide_channel_dma_setup(cp);
2884
2885 for (drive = 0; drive < 2; drive++) {
2886 drvp = &chp->ch_drive[drive];
2887
2888 if ((drvp->drive_flags & DRIVE) == 0)
2889 continue;
2890
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
2899 drvp->drive_flags &= ~DRIVE_DMA;
2900
2901
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
2916 mode = drvp->PIO_mode;
2917 } else {
2918
2919 drvp->drive_flags &= ~DRIVE_UDMA;
2920 #ifndef PCIIDE_AMD756_ENABLEDMA
2921
2922
2923
2924
2925
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
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:
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
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
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
2999
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
3007
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
3143 pciide_channel_dma_setup(cp);
3144
3145
3146
3147
3148
3149 if ((chp->ch_drive[0].drive_flags & DRIVE_UDMA) &&
3150 (chp->ch_drive[1].drive_flags & DRIVE_UDMA)) {
3151
3152 if (chp->ch_drive[0].UDMA_mode > 2 &&
3153 chp->ch_drive[1].UDMA_mode <= 2) {
3154
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
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
3166 if ((drvp->drive_flags & DRIVE) == 0)
3167 continue;
3168
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
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
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
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
3194 udmatim_reg |= APO_UDMA_TIME(chp->channel,
3195 drive, apollo_udma33_tim[drvp->UDMA_mode]);
3196 }
3197
3198 mode = drvp->PIO_mode;
3199 } else {
3200
3201 drvp->drive_flags &= ~DRIVE_UDMA;
3202
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:
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
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
3248
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
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
3294
3295
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
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
3384
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
3421
3422
3423
3424 #ifdef PCIIDE_CMD0646U_ENABLEUDMA
3425 sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
3426 sc->sc_wdcdev.UDMA_cap = 2;
3427 #endif
3428
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
3462
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
3483 pciide_channel_dma_setup(cp);
3484
3485 for (drive = 0; drive < 2; drive++) {
3486 drvp = &chp->ch_drive[drive];
3487
3488 if ((drvp->drive_flags & DRIVE) == 0)
3489 continue;
3490
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
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
3524
3525
3526
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
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
3558
3559
3560
3561
3562
3563 wdcreset(chp, SILENT);
3564 #endif
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
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
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
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
3755
3756
3757
3758
3759
3760
3761
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
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
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
3842
3843
3844
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
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
3872
3873
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
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
3912 if ((drvp->drive_flags & DRIVE) == 0)
3913 continue;
3914 if (drvp->drive_flags & DRIVE_UDMA) {
3915
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
3929
3930
3931
3932 if (idedma_ctl != 0) {
3933
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
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
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966 scontrol = SControl_DET_INIT | SControl_SPD_ANY;
3967
3968
3969
3970
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
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
4005
4006
4007
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);
4015
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
4038
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
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
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
4102
4103
4104
4105
4106
4107
4108
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
4122
4123
4124
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
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
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
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
4201
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
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
4252
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
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
4416
4417
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
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
4518 pciide_channel_dma_setup(cp);
4519
4520 for (drive = 0; drive < 2; drive++) {
4521 drvp = &chp->ch_drive[drive];
4522
4523 if ((drvp->drive_flags & DRIVE) == 0)
4524 continue;
4525
4526 if (drvp->drive_flags & DRIVE_DMA) {
4527 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
4528
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
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
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
4579 {PCI_PRODUCT_SIS_530, 0x00, 4, "530", SIS_TYPE_66},
4580 #if 0
4581
4582
4583
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
4619
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
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
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
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
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
4827 if ((drvp->drive_flags & DRIVE) == 0)
4828 continue;
4829
4830 if (drvp->drive_flags & DRIVE_UDMA) {
4831
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
4844
4845
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
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
4888 pciide_channel_dma_setup(cp);
4889
4890 for (drive = 0; drive < 2; drive++) {
4891 drvp = &chp->ch_drive[drive];
4892
4893 if ((drvp->drive_flags & DRIVE) == 0)
4894 continue;
4895
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
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
4931
4932
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
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
4996
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;
5011 pciide_print_channels(sc->sc_wdcdev.nchannels, interface);
5012
5013
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
5051 pciide_channel_dma_setup(cp);
5052
5053 for (drive = 0; drive < 2; drive++) {
5054 drvp = &chp->ch_drive[drive];
5055
5056 if ((drvp->drive_flags & DRIVE) == 0)
5057 continue;
5058
5059 ndrives++;
5060
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
5067
5068
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
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
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
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
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
5138 if (cp->compat)
5139 continue;
5140
5141
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 ;
5151 else if (crv == 1)
5152 rv = 1;
5153 else if (rv == 0)
5154 rv = crv;
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
5187
5188
5189
5190
5191
5192
5193
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
5202
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
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
5248 for (drive = 0; drive < 2; drive++) {
5249 drvp = &chp->ch_drive[drive];
5250
5251
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
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
5273 drvp->drive_flags &= ~DRIVE_UDMA;
5274 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
5275 dmatim = scx200_dma33[drvp->DMA_mode];
5276
5277
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
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
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
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
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
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
5423 pciide_channel_dma_setup(cp);
5424
5425 if ((chp->ch_drive[0].drive_flags | chp->ch_drive[1].drive_flags) &
5426 DRIVE_UDMA) {
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
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
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
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
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
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
5479
5480
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
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
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
5547
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
5584
5585
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
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
5657
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
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
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
5733 for (drive = 0; drive < 2; drive++) {
5734 drvp = &chp->ch_drive[drive];
5735
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
5742 if (drvp->drive_flags & DRIVE_UDMA) {
5743
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
5758
5759
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
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
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
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
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
5887 if (!PDC_IS_268(sc))
5888 st &= ~PDC2xx_STATE_IDERAID;
5889
5890
5891
5892
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
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
5962 mode = PDC2xx_SCR_SET_GEN(mode, 0x1);
5963 }
5964 mode = PDC2xx_SCR_SET_I2C(mode, 0x3);
5965 mode = PDC2xx_SCR_SET_POLL(mode, 0x1);
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
5975
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
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
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
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
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
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
6111 if ((drvp->drive_flags & DRIVE) == 0)
6112 continue;
6113 mode = 0;
6114 if (drvp->drive_flags & DRIVE_UDMA) {
6115
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
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
6170 cable = pdc268_config_read(chp, 0x0b) & PDC268_CABLE;
6171
6172
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
6180 if ((drvp->drive_flags & DRIVE) == 0)
6181 continue;
6182 if (drvp->drive_flags & DRIVE_UDMA) {
6183
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
6198 if (idedma_ctl != 0) {
6199
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
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
6249 if (cp->compat)
6250 continue;
6251
6252
6253
6254
6255
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
6265
6266
6267
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
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
6347
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
6526
6527
6528
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
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
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
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
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
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
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
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);
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
6828
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
6860
6861
6862
6863
6864
6865
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
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
6878 bus_space_write_1(chp->cmd_iot, chp->cmd_ioh, wdr_seccnt, 0x03u);
6879
6880
6881 rv = bus_space_read_1(chp->cmd_iot, chp->cmd_ioh, reg);
6882
6883
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
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
6901 bus_space_write_1(chp->cmd_iot, chp->cmd_ioh, wdr_seccnt, 0x03u);
6902
6903
6904 bus_space_write_1(chp->cmd_iot, chp->cmd_ioh, reg, val);
6905
6906
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
6924
6925
6926
6927
6928
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
6993
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
7001 opti_write_config(chp, OPTI_REG_CONTROL, OPTI_CONTROL_DISABLE);
7002
7003
7004 spd = (int) opti_read_config(chp, OPTI_REG_STRAP);
7005 spd &= OPTI_STRAP_PCI_SPEED_MASK;
7006
7007
7008 pciide_channel_dma_setup(cp);
7009
7010 for (drive = 0; drive < 2; drive++) {
7011 drvp = &chp->ch_drive[drive];
7012
7013 if ((drvp->drive_flags & DRIVE) == 0) {
7014 mode[drive] = -1;
7015 continue;
7016 }
7017
7018 if ((drvp->drive_flags & DRIVE_DMA)) {
7019
7020
7021
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
7039
7040
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
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
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
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
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
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
7176 for (drive = 0; drive < 2; drive++) {
7177 drvp = &chp->ch_drive[drive];
7178
7179 if ((drvp->drive_flags & DRIVE) == 0)
7180 continue;
7181 unit = drive + 2 * channel;
7182
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
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
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
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
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
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
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
7306 sc->sc_wdcdev.drv_probe = svwsata_drv_probe;
7307
7308
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
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
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
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
7447
7448
7449 scontrol = SControl_DET_INIT | SControl_SPD_ANY;
7450
7451
7452
7453
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
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
7492
7493
7494
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);
7502
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
7525
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
7602
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
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
7696 for (drive = 0; drive < 2; drive++) {
7697 drvp = &chp->ch_drive[drive];
7698
7699 if ((drvp->drive_flags & DRIVE) == 0)
7700 continue;
7701
7702 if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) &&
7703 (drvp->drive_flags & DRIVE_UDMA)) {
7704
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
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
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
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
7861 pciide_channel_dma_setup(cp);
7862
7863
7864 idedma_ctl = 0;
7865 piodmatim &= ~NFORCE_PIODMATIM_MASK(channel);
7866 udmatim &= ~NFORCE_UDMATIM_MASK(channel);
7867
7868
7869 for (drive = 0; drive < 2; drive++) {
7870 drvp = &chp->ch_drive[drive];
7871
7872
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
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
7890 drvp->drive_flags &= ~DRIVE_UDMA;
7891
7892
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
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
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
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
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
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
8059 modectl &= ~IT_MODE_RAID1;
8060
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
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
8102 pciide_channel_dma_setup(cp);
8103
8104
8105 idedma_ctl = 0;
8106
8107
8108 for (drive = 0; drive < 2; drive++) {
8109 drvp = &chp->ch_drive[drive];
8110
8111
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
8118 drvp->drive_flags &= ~DRIVE_DMA;
8119 modectl &= ~IT_MODE_DMA(channel, drive);
8120
8121 #if 0
8122
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
8143 drvp->drive_flags &= ~DRIVE_UDMA;
8144 modectl |= IT_MODE_DMA(channel, drive);
8145
8146
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
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
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
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
8250 pciide_channel_dma_setup(cp);
8251
8252 idedma_ctl = 0;
8253
8254
8255 for (drive = 0; drive < 2; drive++) {
8256 drvp = &chp->ch_drive[drive];
8257
8258
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
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
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
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
8288 drvp->PIO_mode = mode;
8289 if (mode < 2)
8290 drvp->DMA_mode = 0;
8291 else
8292 drvp->DMA_mode = mode - 2;
8293
8294
8295
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
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
8402 pciide_channel_dma_setup(cp);
8403
8404
8405 idedma_ctl = 0;
8406
8407
8408 for (drive = 0; drive < 2; drive++) {
8409 drvp = &chp->ch_drive[drive];
8410
8411
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
8418 drvp->drive_flags &= ~DRIVE_DMA;
8419
8420
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
8429 drvp->drive_flags &= ~DRIVE_UDMA;
8430
8431
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
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
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 }