1 /* $NetBSD: pciide.c,v 1.180 2003/01/27 18:21:23 thorpej Exp $ */ 2 3 4 /* 5 * Copyright (c) 1999, 2000, 2001 Manuel Bouyer. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by Manuel Bouyer. 18 * 4. Neither the name of the University nor the names of its contributors 19 * may be used to endorse or promote products derived from this software 20 * without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 * 33 */ 34 35 36 /* 37 * Copyright (c) 1996, 1998 Christopher G. Demetriou. All rights reserved. 38 * 39 * Redistribution and use in source and binary forms, with or without 40 * modification, are permitted provided that the following conditions 41 * are met: 42 * 1. Redistributions of source code must retain the above copyright 43 * notice, this list of conditions and the following disclaimer. 44 * 2. Redistributions in binary form must reproduce the above copyright 45 * notice, this list of conditions and the following disclaimer in the 46 * documentation and/or other materials provided with the distribution. 47 * 3. All advertising materials mentioning features or use of this software 48 * must display the following acknowledgement: 49 * This product includes software developed by Christopher G. Demetriou 50 * for the NetBSD Project. 51 * 4. The name of the author may not be used to endorse or promote products 52 * derived from this software without specific prior written permission 53 * 54 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 55 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 56 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 57 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 58 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 59 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 60 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 61 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 62 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 63 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 64 */ 65 66 /* 67 * PCI IDE controller driver. 68 * 69 * Author: Christopher G. Demetriou, March 2, 1998 (derived from NetBSD 70 * sys/dev/pci/ppb.c, revision 1.16). 71 * 72 * See "PCI IDE Controller Specification, Revision 1.0 3/4/94" and 73 * "Programming Interface for Bus Master IDE Controller, Revision 1.0 74 * 5/16/94" from the PCI SIG. 75 * 76 */ 77 78 #include <sys/cdefs.h> 79 __KERNEL_RCSID(0, "$NetBSD: pciide.c,v 1.180 2003/01/27 18:21:23 thorpej Exp $"); 80 81 #ifndef WDCDEBUG 82 #define WDCDEBUG 83 #endif 84 85 #define DEBUG_DMA 0x01 86 #define DEBUG_XFERS 0x02 87 #define DEBUG_FUNCS 0x08 88 #define DEBUG_PROBE 0x10 89 #ifdef WDCDEBUG 90 int wdcdebug_pciide_mask = 0; 91 #define WDCDEBUG_PRINT(args, level) \ 92 if (wdcdebug_pciide_mask & (level)) printf args 93 #else 94 #define WDCDEBUG_PRINT(args, level) 95 #endif 96 #include <sys/param.h> 97 #include <sys/systm.h> 98 #include <sys/device.h> 99 #include <sys/malloc.h> 100 101 #include <uvm/uvm_extern.h> 102 103 #include <machine/endian.h> 104 105 #include <dev/pci/pcireg.h> 106 #include <dev/pci/pcivar.h> 107 #include <dev/pci/pcidevs.h> 108 #include <dev/pci/pciidereg.h> 109 #include <dev/pci/pciidevar.h> 110 #include <dev/pci/pciide_piix_reg.h> 111 #include <dev/pci/pciide_amd_reg.h> 112 #include <dev/pci/pciide_apollo_reg.h> 113 #include <dev/pci/pciide_cmd_reg.h> 114 #include <dev/pci/pciide_cy693_reg.h> 115 #include <dev/pci/pciide_sis_reg.h> 116 #include <dev/pci/pciide_acer_reg.h> 117 #include <dev/pci/pciide_pdc202xx_reg.h> 118 #include <dev/pci/pciide_opti_reg.h> 119 #include <dev/pci/pciide_hpt_reg.h> 120 #include <dev/pci/pciide_acard_reg.h> 121 #include <dev/pci/pciide_sl82c105_reg.h> 122 #include <dev/pci/cy82c693var.h> 123 124 #include "opt_pciide.h" 125 126 /* inlines for reading/writing 8-bit PCI registers */ 127 static __inline u_int8_t pciide_pci_read __P((pci_chipset_tag_t, pcitag_t, 128 int)); 129 static __inline void pciide_pci_write __P((pci_chipset_tag_t, pcitag_t, 130 int, u_int8_t)); 131 132 static __inline u_int8_t 133 pciide_pci_read(pc, pa, reg) 134 pci_chipset_tag_t pc; 135 pcitag_t pa; 136 int reg; 137 { 138 139 return (pci_conf_read(pc, pa, (reg & ~0x03)) >> 140 ((reg & 0x03) * 8) & 0xff); 141 } 142 143 static __inline void 144 pciide_pci_write(pc, pa, reg, val) 145 pci_chipset_tag_t pc; 146 pcitag_t pa; 147 int reg; 148 u_int8_t val; 149 { 150 pcireg_t pcival; 151 152 pcival = pci_conf_read(pc, pa, (reg & ~0x03)); 153 pcival &= ~(0xff << ((reg & 0x03) * 8)); 154 pcival |= (val << ((reg & 0x03) * 8)); 155 pci_conf_write(pc, pa, (reg & ~0x03), pcival); 156 } 157 158 void default_chip_map __P((struct pciide_softc*, struct pci_attach_args*)); 159 160 void piix_chip_map __P((struct pciide_softc*, struct pci_attach_args*)); 161 void piix_setup_channel __P((struct channel_softc*)); 162 void piix3_4_setup_channel __P((struct channel_softc*)); 163 static u_int32_t piix_setup_idetim_timings __P((u_int8_t, u_int8_t, u_int8_t)); 164 static u_int32_t piix_setup_idetim_drvs __P((struct ata_drive_datas*)); 165 static u_int32_t piix_setup_sidetim_timings __P((u_int8_t, u_int8_t, u_int8_t)); 166 167 void amd7x6_chip_map __P((struct pciide_softc*, struct pci_attach_args*)); 168 void amd7x6_setup_channel __P((struct channel_softc*)); 169 170 void apollo_chip_map __P((struct pciide_softc*, struct pci_attach_args*)); 171 void apollo_setup_channel __P((struct channel_softc*)); 172 173 void cmd_chip_map __P((struct pciide_softc*, struct pci_attach_args*)); 174 void cmd0643_9_chip_map __P((struct pciide_softc*, struct pci_attach_args*)); 175 void cmd0643_9_setup_channel __P((struct channel_softc*)); 176 void cmd_channel_map __P((struct pci_attach_args *, 177 struct pciide_softc *, int)); 178 int cmd_pci_intr __P((void *)); 179 void cmd646_9_irqack __P((struct channel_softc *)); 180 void cmd680_chip_map __P((struct pciide_softc*, struct pci_attach_args*)); 181 void cmd680_setup_channel __P((struct channel_softc*)); 182 void cmd680_channel_map __P((struct pci_attach_args *, 183 struct pciide_softc *, int)); 184 185 void cy693_chip_map __P((struct pciide_softc*, struct pci_attach_args*)); 186 void cy693_setup_channel __P((struct channel_softc*)); 187 188 void sis_chip_map __P((struct pciide_softc*, struct pci_attach_args*)); 189 void sis_setup_channel __P((struct channel_softc*)); 190 static int sis_hostbr_match __P(( struct pci_attach_args *)); 191 192 void acer_chip_map __P((struct pciide_softc*, struct pci_attach_args*)); 193 void acer_setup_channel __P((struct channel_softc*)); 194 int acer_pci_intr __P((void *)); 195 196 void pdc202xx_chip_map __P((struct pciide_softc*, struct pci_attach_args*)); 197 void pdc202xx_setup_channel __P((struct channel_softc*)); 198 void pdc20268_setup_channel __P((struct channel_softc*)); 199 int pdc202xx_pci_intr __P((void *)); 200 int pdc20265_pci_intr __P((void *)); 201 202 void opti_chip_map __P((struct pciide_softc*, struct pci_attach_args*)); 203 void opti_setup_channel __P((struct channel_softc*)); 204 205 void hpt_chip_map __P((struct pciide_softc*, struct pci_attach_args*)); 206 void hpt_setup_channel __P((struct channel_softc*)); 207 int hpt_pci_intr __P((void *)); 208 209 void acard_chip_map __P((struct pciide_softc*, struct pci_attach_args*)); 210 void acard_setup_channel __P((struct channel_softc*)); 211 int acard_pci_intr __P((void *)); 212 213 void serverworks_chip_map __P((struct pciide_softc*, struct pci_attach_args*)); 214 void serverworks_setup_channel __P((struct channel_softc*)); 215 int serverworks_pci_intr __P((void *)); 216 217 void sl82c105_chip_map __P((struct pciide_softc*, struct pci_attach_args*)); 218 void sl82c105_setup_channel __P((struct channel_softc*)); 219 220 void pciide_channel_dma_setup __P((struct pciide_channel *)); 221 int pciide_dma_table_setup __P((struct pciide_softc*, int, int)); 222 int pciide_dma_init __P((void*, int, int, void *, size_t, int)); 223 void pciide_dma_start __P((void*, int, int)); 224 int pciide_dma_finish __P((void*, int, int, int)); 225 void pciide_irqack __P((struct channel_softc *)); 226 void pciide_print_modes __P((struct pciide_channel *)); 227 228 struct pciide_product_desc { 229 u_int32_t ide_product; 230 int ide_flags; 231 const char *ide_name; 232 /* map and setup chip, probe drives */ 233 void (*chip_map) __P((struct pciide_softc*, struct pci_attach_args*)); 234 }; 235 236 /* Flags for ide_flags */ 237 #define IDE_PCI_CLASS_OVERRIDE 0x0001 /* accept even if class != pciide */ 238 #define IDE_16BIT_IOSPACE 0x0002 /* I/O space BARS ignore upper word */ 239 240 /* Default product description for devices not known from this controller */ 241 const struct pciide_product_desc default_product_desc = { 242 0, 243 0, 244 "Generic PCI IDE controller", 245 default_chip_map, 246 }; 247 248 const struct pciide_product_desc pciide_intel_products[] = { 249 { PCI_PRODUCT_INTEL_82092AA, 250 0, 251 "Intel 82092AA IDE controller", 252 default_chip_map, 253 }, 254 { PCI_PRODUCT_INTEL_82371FB_IDE, 255 0, 256 "Intel 82371FB IDE controller (PIIX)", 257 piix_chip_map, 258 }, 259 { PCI_PRODUCT_INTEL_82371SB_IDE, 260 0, 261 "Intel 82371SB IDE Interface (PIIX3)", 262 piix_chip_map, 263 }, 264 { PCI_PRODUCT_INTEL_82371AB_IDE, 265 0, 266 "Intel 82371AB IDE controller (PIIX4)", 267 piix_chip_map, 268 }, 269 { PCI_PRODUCT_INTEL_82440MX_IDE, 270 0, 271 "Intel 82440MX IDE controller", 272 piix_chip_map 273 }, 274 { PCI_PRODUCT_INTEL_82801AA_IDE, 275 0, 276 "Intel 82801AA IDE Controller (ICH)", 277 piix_chip_map, 278 }, 279 { PCI_PRODUCT_INTEL_82801AB_IDE, 280 0, 281 "Intel 82801AB IDE Controller (ICH0)", 282 piix_chip_map, 283 }, 284 { PCI_PRODUCT_INTEL_82801BA_IDE, 285 0, 286 "Intel 82801BA IDE Controller (ICH2)", 287 piix_chip_map, 288 }, 289 { PCI_PRODUCT_INTEL_82801BAM_IDE, 290 0, 291 "Intel 82801BAM IDE Controller (ICH2)", 292 piix_chip_map, 293 }, 294 { PCI_PRODUCT_INTEL_82801CA_IDE_1, 295 0, 296 "Intel 82801CA IDE Controller", 297 piix_chip_map, 298 }, 299 { PCI_PRODUCT_INTEL_82801CA_IDE_2, 300 0, 301 "Intel 82801CA IDE Controller", 302 piix_chip_map, 303 }, 304 { PCI_PRODUCT_INTEL_82801DB_IDE, 305 0, 306 "Intel 82801DB IDE Controller (ICH4)", 307 piix_chip_map, 308 }, 309 { 0, 310 0, 311 NULL, 312 NULL 313 } 314 }; 315 316 const struct pciide_product_desc pciide_amd_products[] = { 317 { PCI_PRODUCT_AMD_PBC756_IDE, 318 0, 319 "Advanced Micro Devices AMD756 IDE Controller", 320 amd7x6_chip_map 321 }, 322 { PCI_PRODUCT_AMD_PBC766_IDE, 323 0, 324 "Advanced Micro Devices AMD766 IDE Controller", 325 amd7x6_chip_map 326 }, 327 { PCI_PRODUCT_AMD_PBC768_IDE, 328 0, 329 "Advanced Micro Devices AMD768 IDE Controller", 330 amd7x6_chip_map 331 }, 332 { PCI_PRODUCT_AMD_PBC8111_IDE, 333 0, 334 "Advanced Micro Devices AMD8111 IDE Controller", 335 amd7x6_chip_map 336 }, 337 { 0, 338 0, 339 NULL, 340 NULL 341 } 342 }; 343 344 const struct pciide_product_desc pciide_nvidia_products[] = { 345 { PCI_PRODUCT_NVIDIA_NFORCE_ATA100, 346 0, 347 "NVIDIA nForce IDE Controller", 348 amd7x6_chip_map 349 }, 350 { PCI_PRODUCT_NVIDIA_NFORCE2_ATA133, 351 0, 352 "NVIDIA nForce2 IDE Controller", 353 amd7x6_chip_map 354 }, 355 { 0, 356 0, 357 NULL, 358 NULL 359 } 360 }; 361 362 const struct pciide_product_desc pciide_cmd_products[] = { 363 { PCI_PRODUCT_CMDTECH_640, 364 0, 365 "CMD Technology PCI0640", 366 cmd_chip_map 367 }, 368 { PCI_PRODUCT_CMDTECH_643, 369 0, 370 "CMD Technology PCI0643", 371 cmd0643_9_chip_map, 372 }, 373 { PCI_PRODUCT_CMDTECH_646, 374 0, 375 "CMD Technology PCI0646", 376 cmd0643_9_chip_map, 377 }, 378 { PCI_PRODUCT_CMDTECH_648, 379 IDE_PCI_CLASS_OVERRIDE, 380 "CMD Technology PCI0648", 381 cmd0643_9_chip_map, 382 }, 383 { PCI_PRODUCT_CMDTECH_649, 384 IDE_PCI_CLASS_OVERRIDE, 385 "CMD Technology PCI0649", 386 cmd0643_9_chip_map, 387 }, 388 { PCI_PRODUCT_CMDTECH_680, 389 IDE_PCI_CLASS_OVERRIDE, 390 "Silicon Image 0680", 391 cmd680_chip_map, 392 }, 393 { 0, 394 0, 395 NULL, 396 NULL 397 } 398 }; 399 400 const struct pciide_product_desc pciide_via_products[] = { 401 { PCI_PRODUCT_VIATECH_VT82C586_IDE, 402 0, 403 NULL, 404 apollo_chip_map, 405 }, 406 { PCI_PRODUCT_VIATECH_VT82C586A_IDE, 407 0, 408 NULL, 409 apollo_chip_map, 410 }, 411 { 0, 412 0, 413 NULL, 414 NULL 415 } 416 }; 417 418 const struct pciide_product_desc pciide_cypress_products[] = { 419 { PCI_PRODUCT_CONTAQ_82C693, 420 IDE_16BIT_IOSPACE, 421 "Cypress 82C693 IDE Controller", 422 cy693_chip_map, 423 }, 424 { 0, 425 0, 426 NULL, 427 NULL 428 } 429 }; 430 431 const struct pciide_product_desc pciide_sis_products[] = { 432 { PCI_PRODUCT_SIS_5597_IDE, 433 0, 434 "Silicon Integrated System 5597/5598 IDE controller", 435 sis_chip_map, 436 }, 437 { 0, 438 0, 439 NULL, 440 NULL 441 } 442 }; 443 444 const struct pciide_product_desc pciide_acer_products[] = { 445 { PCI_PRODUCT_ALI_M5229, 446 0, 447 "Acer Labs M5229 UDMA IDE Controller", 448 acer_chip_map, 449 }, 450 { 0, 451 0, 452 NULL, 453 NULL 454 } 455 }; 456 457 const struct pciide_product_desc pciide_promise_products[] = { 458 { PCI_PRODUCT_PROMISE_ULTRA33, 459 IDE_PCI_CLASS_OVERRIDE, 460 "Promise Ultra33/ATA Bus Master IDE Accelerator", 461 pdc202xx_chip_map, 462 }, 463 { PCI_PRODUCT_PROMISE_ULTRA66, 464 IDE_PCI_CLASS_OVERRIDE, 465 "Promise Ultra66/ATA Bus Master IDE Accelerator", 466 pdc202xx_chip_map, 467 }, 468 { PCI_PRODUCT_PROMISE_ULTRA100, 469 IDE_PCI_CLASS_OVERRIDE, 470 "Promise Ultra100/ATA Bus Master IDE Accelerator", 471 pdc202xx_chip_map, 472 }, 473 { PCI_PRODUCT_PROMISE_ULTRA100X, 474 IDE_PCI_CLASS_OVERRIDE, 475 "Promise Ultra100/ATA Bus Master IDE Accelerator", 476 pdc202xx_chip_map, 477 }, 478 { PCI_PRODUCT_PROMISE_ULTRA100TX2, 479 IDE_PCI_CLASS_OVERRIDE, 480 "Promise Ultra100TX2/ATA Bus Master IDE Accelerator", 481 pdc202xx_chip_map, 482 }, 483 { PCI_PRODUCT_PROMISE_ULTRA100TX2v2, 484 IDE_PCI_CLASS_OVERRIDE, 485 "Promise Ultra100TX2v2/ATA Bus Master IDE Accelerator", 486 pdc202xx_chip_map, 487 }, 488 { PCI_PRODUCT_PROMISE_ULTRA133, 489 IDE_PCI_CLASS_OVERRIDE, 490 "Promise Ultra133/ATA Bus Master IDE Accelerator", 491 pdc202xx_chip_map, 492 }, 493 { PCI_PRODUCT_PROMISE_ULTRA133TX2, 494 IDE_PCI_CLASS_OVERRIDE, 495 "Promise Ultra133TX2/ATA Bus Master IDE Accelerator", 496 pdc202xx_chip_map, 497 }, 498 { PCI_PRODUCT_PROMISE_MBULTRA133, 499 IDE_PCI_CLASS_OVERRIDE, 500 "Promise Ultra133/ATA Bus Master IDE Accelerator (MB)", 501 pdc202xx_chip_map, 502 }, 503 { PCI_PRODUCT_PROMISE_ULTRA133TX2v2, 504 IDE_PCI_CLASS_OVERRIDE, 505 "Promise Ultra133TX2v2/ATA Bus Master IDE Accelerator", 506 pdc202xx_chip_map, 507 }, 508 { PCI_PRODUCT_PROMISE_FASTTRAK133LITE, 509 IDE_PCI_CLASS_OVERRIDE, 510 "Promise Fasttrak133 Lite Bus Master IDE Accelerator", 511 pdc202xx_chip_map, 512 }, 513 { PCI_PRODUCT_PROMISE_SATA150TX2PLUS, 514 IDE_PCI_CLASS_OVERRIDE, 515 "Promise Serial ATA/150 TX2plus Bus Master IDE Accelerator", 516 pdc202xx_chip_map, 517 }, 518 { 0, 519 0, 520 NULL, 521 NULL 522 } 523 }; 524 525 const struct pciide_product_desc pciide_opti_products[] = { 526 { PCI_PRODUCT_OPTI_82C621, 527 0, 528 "OPTi 82c621 PCI IDE controller", 529 opti_chip_map, 530 }, 531 { PCI_PRODUCT_OPTI_82C568, 532 0, 533 "OPTi 82c568 (82c621 compatible) PCI IDE controller", 534 opti_chip_map, 535 }, 536 { PCI_PRODUCT_OPTI_82D568, 537 0, 538 "OPTi 82d568 (82c621 compatible) PCI IDE controller", 539 opti_chip_map, 540 }, 541 { 0, 542 0, 543 NULL, 544 NULL 545 } 546 }; 547 548 const struct pciide_product_desc pciide_triones_products[] = { 549 { PCI_PRODUCT_TRIONES_HPT366, 550 IDE_PCI_CLASS_OVERRIDE, 551 NULL, 552 hpt_chip_map, 553 }, 554 { PCI_PRODUCT_TRIONES_HPT372, 555 IDE_PCI_CLASS_OVERRIDE, 556 NULL, 557 hpt_chip_map 558 }, 559 { PCI_PRODUCT_TRIONES_HPT374, 560 IDE_PCI_CLASS_OVERRIDE, 561 NULL, 562 hpt_chip_map 563 }, 564 { 0, 565 0, 566 NULL, 567 NULL 568 } 569 }; 570 571 const struct pciide_product_desc pciide_acard_products[] = { 572 { PCI_PRODUCT_ACARD_ATP850U, 573 IDE_PCI_CLASS_OVERRIDE, 574 "Acard ATP850U Ultra33 IDE Controller", 575 acard_chip_map, 576 }, 577 { PCI_PRODUCT_ACARD_ATP860, 578 IDE_PCI_CLASS_OVERRIDE, 579 "Acard ATP860 Ultra66 IDE Controller", 580 acard_chip_map, 581 }, 582 { PCI_PRODUCT_ACARD_ATP860A, 583 IDE_PCI_CLASS_OVERRIDE, 584 "Acard ATP860-A Ultra66 IDE Controller", 585 acard_chip_map, 586 }, 587 { 0, 588 0, 589 NULL, 590 NULL 591 } 592 }; 593 594 const struct pciide_product_desc pciide_serverworks_products[] = { 595 { PCI_PRODUCT_SERVERWORKS_OSB4_IDE, 596 0, 597 "ServerWorks OSB4 IDE Controller", 598 serverworks_chip_map, 599 }, 600 { PCI_PRODUCT_SERVERWORKS_CSB5_IDE, 601 0, 602 "ServerWorks CSB5 IDE Controller", 603 serverworks_chip_map, 604 }, 605 { 0, 606 0, 607 NULL, 608 } 609 }; 610 611 const struct pciide_product_desc pciide_symphony_products[] = { 612 { PCI_PRODUCT_SYMPHONY_82C105, 613 0, 614 "Symphony Labs 82C105 IDE controller", 615 sl82c105_chip_map, 616 }, 617 { 0, 618 0, 619 NULL, 620 } 621 }; 622 623 const struct pciide_product_desc pciide_winbond_products[] = { 624 { PCI_PRODUCT_WINBOND_W83C553F_1, 625 0, 626 "Winbond W83C553F IDE controller", 627 sl82c105_chip_map, 628 }, 629 { 0, 630 0, 631 NULL, 632 } 633 }; 634 635 struct pciide_vendor_desc { 636 u_int32_t ide_vendor; 637 const struct pciide_product_desc *ide_products; 638 }; 639 640 const struct pciide_vendor_desc pciide_vendors[] = { 641 { PCI_VENDOR_INTEL, pciide_intel_products }, 642 { PCI_VENDOR_CMDTECH, pciide_cmd_products }, 643 { PCI_VENDOR_VIATECH, pciide_via_products }, 644 { PCI_VENDOR_CONTAQ, pciide_cypress_products }, 645 { PCI_VENDOR_SIS, pciide_sis_products }, 646 { PCI_VENDOR_ALI, pciide_acer_products }, 647 { PCI_VENDOR_PROMISE, pciide_promise_products }, 648 { PCI_VENDOR_AMD, pciide_amd_products }, 649 { PCI_VENDOR_OPTI, pciide_opti_products }, 650 { PCI_VENDOR_TRIONES, pciide_triones_products }, 651 { PCI_VENDOR_ACARD, pciide_acard_products }, 652 { PCI_VENDOR_SERVERWORKS, pciide_serverworks_products }, 653 { PCI_VENDOR_SYMPHONY, pciide_symphony_products }, 654 { PCI_VENDOR_WINBOND, pciide_winbond_products }, 655 { PCI_VENDOR_NVIDIA, pciide_nvidia_products }, 656 { 0, NULL } 657 }; 658 659 /* options passed via the 'flags' config keyword */ 660 #define PCIIDE_OPTIONS_DMA 0x01 661 #define PCIIDE_OPTIONS_NODMA 0x02 662 663 int pciide_match __P((struct device *, struct cfdata *, void *)); 664 void pciide_attach __P((struct device *, struct device *, void *)); 665 666 CFATTACH_DECL(pciide, sizeof(struct pciide_softc), 667 pciide_match, pciide_attach, NULL, NULL); 668 669 int pciide_chipen __P((struct pciide_softc *, struct pci_attach_args *)); 670 int pciide_mapregs_compat __P(( struct pci_attach_args *, 671 struct pciide_channel *, int, bus_size_t *, bus_size_t*)); 672 int pciide_mapregs_native __P((struct pci_attach_args *, 673 struct pciide_channel *, bus_size_t *, bus_size_t *, 674 int (*pci_intr) __P((void *)))); 675 void pciide_mapreg_dma __P((struct pciide_softc *, 676 struct pci_attach_args *)); 677 int pciide_chansetup __P((struct pciide_softc *, int, pcireg_t)); 678 void pciide_mapchan __P((struct pci_attach_args *, 679 struct pciide_channel *, pcireg_t, bus_size_t *, bus_size_t *, 680 int (*pci_intr) __P((void *)))); 681 int pciide_chan_candisable __P((struct pciide_channel *)); 682 void pciide_map_compat_intr __P(( struct pci_attach_args *, 683 struct pciide_channel *, int, int)); 684 int pciide_compat_intr __P((void *)); 685 int pciide_pci_intr __P((void *)); 686 const struct pciide_product_desc* pciide_lookup_product __P((u_int32_t)); 687 688 const struct pciide_product_desc * 689 pciide_lookup_product(id) 690 u_int32_t id; 691 { 692 const struct pciide_product_desc *pp; 693 const struct pciide_vendor_desc *vp; 694 695 for (vp = pciide_vendors; vp->ide_products != NULL; vp++) 696 if (PCI_VENDOR(id) == vp->ide_vendor) 697 break; 698 699 if ((pp = vp->ide_products) == NULL) 700 return NULL; 701 702 for (; pp->chip_map != NULL; pp++) 703 if (PCI_PRODUCT(id) == pp->ide_product) 704 break; 705 706 if (pp->chip_map == NULL) 707 return NULL; 708 return pp; 709 } 710 711 int 712 pciide_match(parent, match, aux) 713 struct device *parent; 714 struct cfdata *match; 715 void *aux; 716 { 717 struct pci_attach_args *pa = aux; 718 const struct pciide_product_desc *pp; 719 720 /* 721 * Check the ID register to see that it's a PCI IDE controller. 722 * If it is, we assume that we can deal with it; it _should_ 723 * work in a standardized way... 724 */ 725 if (PCI_CLASS(pa->pa_class) == PCI_CLASS_MASS_STORAGE && 726 PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_IDE) { 727 return (1); 728 } 729 730 /* 731 * Some controllers (e.g. promise Utra-33) don't claim to be PCI IDE 732 * controllers. Let see if we can deal with it anyway. 733 */ 734 pp = pciide_lookup_product(pa->pa_id); 735 if (pp && (pp->ide_flags & IDE_PCI_CLASS_OVERRIDE)) { 736 return (1); 737 } 738 739 return (0); 740 } 741 742 void 743 pciide_attach(parent, self, aux) 744 struct device *parent, *self; 745 void *aux; 746 { 747 struct pci_attach_args *pa = aux; 748 pci_chipset_tag_t pc = pa->pa_pc; 749 pcitag_t tag = pa->pa_tag; 750 struct pciide_softc *sc = (struct pciide_softc *)self; 751 pcireg_t csr; 752 char devinfo[256]; 753 const char *displaydev; 754 755 sc->sc_pci_vendor = PCI_VENDOR(pa->pa_id); 756 sc->sc_pp = pciide_lookup_product(pa->pa_id); 757 if (sc->sc_pp == NULL) { 758 sc->sc_pp = &default_product_desc; 759 pci_devinfo(pa->pa_id, pa->pa_class, 0, devinfo); 760 displaydev = devinfo; 761 } else 762 displaydev = sc->sc_pp->ide_name; 763 764 /* if displaydev == NULL, printf is done in chip-specific map */ 765 if (displaydev) 766 printf(": %s (rev. 0x%02x)\n", displaydev, 767 PCI_REVISION(pa->pa_class)); 768 769 sc->sc_pc = pa->pa_pc; 770 sc->sc_tag = pa->pa_tag; 771 #ifdef WDCDEBUG 772 if (wdcdebug_pciide_mask & DEBUG_PROBE) 773 pci_conf_print(sc->sc_pc, sc->sc_tag, NULL); 774 #endif 775 sc->sc_pp->chip_map(sc, pa); 776 777 if (sc->sc_dma_ok) { 778 csr = pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG); 779 csr |= PCI_COMMAND_MASTER_ENABLE; 780 pci_conf_write(pc, tag, PCI_COMMAND_STATUS_REG, csr); 781 } 782 WDCDEBUG_PRINT(("pciide: command/status register=%x\n", 783 pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG)), DEBUG_PROBE); 784 } 785 786 /* tell whether the chip is enabled or not */ 787 int 788 pciide_chipen(sc, pa) 789 struct pciide_softc *sc; 790 struct pci_attach_args *pa; 791 { 792 pcireg_t csr; 793 if ((pa->pa_flags & PCI_FLAGS_IO_ENABLED) == 0) { 794 csr = pci_conf_read(sc->sc_pc, sc->sc_tag, 795 PCI_COMMAND_STATUS_REG); 796 printf("%s: device disabled (at %s)\n", 797 sc->sc_wdcdev.sc_dev.dv_xname, 798 (csr & PCI_COMMAND_IO_ENABLE) == 0 ? 799 "device" : "bridge"); 800 return 0; 801 } 802 return 1; 803 } 804 805 int 806 pciide_mapregs_compat(pa, cp, compatchan, cmdsizep, ctlsizep) 807 struct pci_attach_args *pa; 808 struct pciide_channel *cp; 809 int compatchan; 810 bus_size_t *cmdsizep, *ctlsizep; 811 { 812 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 813 struct channel_softc *wdc_cp = &cp->wdc_channel; 814 815 cp->compat = 1; 816 *cmdsizep = PCIIDE_COMPAT_CMD_SIZE; 817 *ctlsizep = PCIIDE_COMPAT_CTL_SIZE; 818 819 wdc_cp->cmd_iot = pa->pa_iot; 820 if (bus_space_map(wdc_cp->cmd_iot, PCIIDE_COMPAT_CMD_BASE(compatchan), 821 PCIIDE_COMPAT_CMD_SIZE, 0, &wdc_cp->cmd_ioh) != 0) { 822 printf("%s: couldn't map %s channel cmd regs\n", 823 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 824 return (0); 825 } 826 827 wdc_cp->ctl_iot = pa->pa_iot; 828 if (bus_space_map(wdc_cp->ctl_iot, PCIIDE_COMPAT_CTL_BASE(compatchan), 829 PCIIDE_COMPAT_CTL_SIZE, 0, &wdc_cp->ctl_ioh) != 0) { 830 printf("%s: couldn't map %s channel ctl regs\n", 831 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 832 bus_space_unmap(wdc_cp->cmd_iot, wdc_cp->cmd_ioh, 833 PCIIDE_COMPAT_CMD_SIZE); 834 return (0); 835 } 836 837 return (1); 838 } 839 840 int 841 pciide_mapregs_native(pa, cp, cmdsizep, ctlsizep, pci_intr) 842 struct pci_attach_args * pa; 843 struct pciide_channel *cp; 844 bus_size_t *cmdsizep, *ctlsizep; 845 int (*pci_intr) __P((void *)); 846 { 847 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 848 struct channel_softc *wdc_cp = &cp->wdc_channel; 849 const char *intrstr; 850 pci_intr_handle_t intrhandle; 851 852 cp->compat = 0; 853 854 if (sc->sc_pci_ih == NULL) { 855 if (pci_intr_map(pa, &intrhandle) != 0) { 856 printf("%s: couldn't map native-PCI interrupt\n", 857 sc->sc_wdcdev.sc_dev.dv_xname); 858 return 0; 859 } 860 intrstr = pci_intr_string(pa->pa_pc, intrhandle); 861 sc->sc_pci_ih = pci_intr_establish(pa->pa_pc, 862 intrhandle, IPL_BIO, pci_intr, sc); 863 if (sc->sc_pci_ih != NULL) { 864 printf("%s: using %s for native-PCI interrupt\n", 865 sc->sc_wdcdev.sc_dev.dv_xname, 866 intrstr ? intrstr : "unknown interrupt"); 867 } else { 868 printf("%s: couldn't establish native-PCI interrupt", 869 sc->sc_wdcdev.sc_dev.dv_xname); 870 if (intrstr != NULL) 871 printf(" at %s", intrstr); 872 printf("\n"); 873 return 0; 874 } 875 } 876 cp->ih = sc->sc_pci_ih; 877 if (pci_mapreg_map(pa, PCIIDE_REG_CMD_BASE(wdc_cp->channel), 878 PCI_MAPREG_TYPE_IO, 0, 879 &wdc_cp->cmd_iot, &wdc_cp->cmd_ioh, NULL, cmdsizep) != 0) { 880 printf("%s: couldn't map %s channel cmd regs\n", 881 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 882 return 0; 883 } 884 885 if (pci_mapreg_map(pa, PCIIDE_REG_CTL_BASE(wdc_cp->channel), 886 PCI_MAPREG_TYPE_IO, 0, 887 &wdc_cp->ctl_iot, &cp->ctl_baseioh, NULL, ctlsizep) != 0) { 888 printf("%s: couldn't map %s channel ctl regs\n", 889 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 890 bus_space_unmap(wdc_cp->cmd_iot, wdc_cp->cmd_ioh, *cmdsizep); 891 return 0; 892 } 893 /* 894 * In native mode, 4 bytes of I/O space are mapped for the control 895 * register, the control register is at offset 2. Pass the generic 896 * code a handle for only one byte at the right offset. 897 */ 898 if (bus_space_subregion(wdc_cp->ctl_iot, cp->ctl_baseioh, 2, 1, 899 &wdc_cp->ctl_ioh) != 0) { 900 printf("%s: unable to subregion %s channel ctl regs\n", 901 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 902 bus_space_unmap(wdc_cp->cmd_iot, wdc_cp->cmd_ioh, *cmdsizep); 903 bus_space_unmap(wdc_cp->cmd_iot, cp->ctl_baseioh, *ctlsizep); 904 return 0; 905 } 906 return (1); 907 } 908 909 void 910 pciide_mapreg_dma(sc, pa) 911 struct pciide_softc *sc; 912 struct pci_attach_args *pa; 913 { 914 pcireg_t maptype; 915 bus_addr_t addr; 916 917 /* 918 * Map DMA registers 919 * 920 * Note that sc_dma_ok is the right variable to test to see if 921 * DMA can be done. If the interface doesn't support DMA, 922 * sc_dma_ok will never be non-zero. If the DMA regs couldn't 923 * be mapped, it'll be zero. I.e., sc_dma_ok will only be 924 * non-zero if the interface supports DMA and the registers 925 * could be mapped. 926 * 927 * XXX Note that despite the fact that the Bus Master IDE specs 928 * XXX say that "The bus master IDE function uses 16 bytes of IO 929 * XXX space," some controllers (at least the United 930 * XXX Microelectronics UM8886BF) place it in memory space. 931 */ 932 maptype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, 933 PCIIDE_REG_BUS_MASTER_DMA); 934 935 switch (maptype) { 936 case PCI_MAPREG_TYPE_IO: 937 sc->sc_dma_ok = (pci_mapreg_info(pa->pa_pc, pa->pa_tag, 938 PCIIDE_REG_BUS_MASTER_DMA, PCI_MAPREG_TYPE_IO, 939 &addr, NULL, NULL) == 0); 940 if (sc->sc_dma_ok == 0) { 941 printf(", but unused (couldn't query registers)"); 942 break; 943 } 944 if ((sc->sc_pp->ide_flags & IDE_16BIT_IOSPACE) 945 && addr >= 0x10000) { 946 sc->sc_dma_ok = 0; 947 printf(", but unused (registers at unsafe address " 948 "%#lx)", (unsigned long)addr); 949 break; 950 } 951 /* FALLTHROUGH */ 952 953 case PCI_MAPREG_MEM_TYPE_32BIT: 954 sc->sc_dma_ok = (pci_mapreg_map(pa, 955 PCIIDE_REG_BUS_MASTER_DMA, maptype, 0, 956 &sc->sc_dma_iot, &sc->sc_dma_ioh, NULL, NULL) == 0); 957 sc->sc_dmat = pa->pa_dmat; 958 if (sc->sc_dma_ok == 0) { 959 printf(", but unused (couldn't map registers)"); 960 } else { 961 sc->sc_wdcdev.dma_arg = sc; 962 sc->sc_wdcdev.dma_init = pciide_dma_init; 963 sc->sc_wdcdev.dma_start = pciide_dma_start; 964 sc->sc_wdcdev.dma_finish = pciide_dma_finish; 965 } 966 967 if (sc->sc_wdcdev.sc_dev.dv_cfdata->cf_flags & 968 PCIIDE_OPTIONS_NODMA) { 969 printf(", but unused (forced off by config file)"); 970 sc->sc_dma_ok = 0; 971 } 972 break; 973 974 default: 975 sc->sc_dma_ok = 0; 976 printf(", but unsupported register maptype (0x%x)", maptype); 977 } 978 } 979 980 int 981 pciide_compat_intr(arg) 982 void *arg; 983 { 984 struct pciide_channel *cp = arg; 985 986 #ifdef DIAGNOSTIC 987 /* should only be called for a compat channel */ 988 if (cp->compat == 0) 989 panic("pciide compat intr called for non-compat chan %p", cp); 990 #endif 991 return (wdcintr(&cp->wdc_channel)); 992 } 993 994 int 995 pciide_pci_intr(arg) 996 void *arg; 997 { 998 struct pciide_softc *sc = arg; 999 struct pciide_channel *cp; 1000 struct channel_softc *wdc_cp; 1001 int i, rv, crv; 1002 1003 rv = 0; 1004 for (i = 0; i < sc->sc_wdcdev.nchannels; i++) { 1005 cp = &sc->pciide_channels[i]; 1006 wdc_cp = &cp->wdc_channel; 1007 1008 /* If a compat channel skip. */ 1009 if (cp->compat) 1010 continue; 1011 /* if this channel not waiting for intr, skip */ 1012 if ((wdc_cp->ch_flags & WDCF_IRQ_WAIT) == 0) 1013 continue; 1014 1015 crv = wdcintr(wdc_cp); 1016 if (crv == 0) 1017 ; /* leave rv alone */ 1018 else if (crv == 1) 1019 rv = 1; /* claim the intr */ 1020 else if (rv == 0) /* crv should be -1 in this case */ 1021 rv = crv; /* if we've done no better, take it */ 1022 } 1023 return (rv); 1024 } 1025 1026 void 1027 pciide_channel_dma_setup(cp) 1028 struct pciide_channel *cp; 1029 { 1030 int drive; 1031 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 1032 struct ata_drive_datas *drvp; 1033 1034 for (drive = 0; drive < 2; drive++) { 1035 drvp = &cp->wdc_channel.ch_drive[drive]; 1036 /* If no drive, skip */ 1037 if ((drvp->drive_flags & DRIVE) == 0) 1038 continue; 1039 /* setup DMA if needed */ 1040 if (((drvp->drive_flags & DRIVE_DMA) == 0 && 1041 (drvp->drive_flags & DRIVE_UDMA) == 0) || 1042 sc->sc_dma_ok == 0) { 1043 drvp->drive_flags &= ~(DRIVE_DMA | DRIVE_UDMA); 1044 continue; 1045 } 1046 if (pciide_dma_table_setup(sc, cp->wdc_channel.channel, drive) 1047 != 0) { 1048 /* Abort DMA setup */ 1049 drvp->drive_flags &= ~(DRIVE_DMA | DRIVE_UDMA); 1050 continue; 1051 } 1052 } 1053 } 1054 1055 int 1056 pciide_dma_table_setup(sc, channel, drive) 1057 struct pciide_softc *sc; 1058 int channel, drive; 1059 { 1060 bus_dma_segment_t seg; 1061 int error, rseg; 1062 const bus_size_t dma_table_size = 1063 sizeof(struct idedma_table) * NIDEDMA_TABLES; 1064 struct pciide_dma_maps *dma_maps = 1065 &sc->pciide_channels[channel].dma_maps[drive]; 1066 1067 /* If table was already allocated, just return */ 1068 if (dma_maps->dma_table) 1069 return 0; 1070 1071 /* Allocate memory for the DMA tables and map it */ 1072 if ((error = bus_dmamem_alloc(sc->sc_dmat, dma_table_size, 1073 IDEDMA_TBL_ALIGN, IDEDMA_TBL_ALIGN, &seg, 1, &rseg, 1074 BUS_DMA_NOWAIT)) != 0) { 1075 printf("%s:%d: unable to allocate table DMA for " 1076 "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname, 1077 channel, drive, error); 1078 return error; 1079 } 1080 if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg, 1081 dma_table_size, 1082 (caddr_t *)&dma_maps->dma_table, 1083 BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) != 0) { 1084 printf("%s:%d: unable to map table DMA for" 1085 "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname, 1086 channel, drive, error); 1087 return error; 1088 } 1089 WDCDEBUG_PRINT(("pciide_dma_table_setup: table at %p len %lu, " 1090 "phy 0x%lx\n", dma_maps->dma_table, (u_long)dma_table_size, 1091 (unsigned long)seg.ds_addr), DEBUG_PROBE); 1092 1093 /* Create and load table DMA map for this disk */ 1094 if ((error = bus_dmamap_create(sc->sc_dmat, dma_table_size, 1095 1, dma_table_size, IDEDMA_TBL_ALIGN, BUS_DMA_NOWAIT, 1096 &dma_maps->dmamap_table)) != 0) { 1097 printf("%s:%d: unable to create table DMA map for " 1098 "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname, 1099 channel, drive, error); 1100 return error; 1101 } 1102 if ((error = bus_dmamap_load(sc->sc_dmat, 1103 dma_maps->dmamap_table, 1104 dma_maps->dma_table, 1105 dma_table_size, NULL, BUS_DMA_NOWAIT)) != 0) { 1106 printf("%s:%d: unable to load table DMA map for " 1107 "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname, 1108 channel, drive, error); 1109 return error; 1110 } 1111 WDCDEBUG_PRINT(("pciide_dma_table_setup: phy addr of table 0x%lx\n", 1112 (unsigned long)dma_maps->dmamap_table->dm_segs[0].ds_addr), 1113 DEBUG_PROBE); 1114 /* Create a xfer DMA map for this drive */ 1115 if ((error = bus_dmamap_create(sc->sc_dmat, IDEDMA_BYTE_COUNT_MAX, 1116 NIDEDMA_TABLES, IDEDMA_BYTE_COUNT_MAX, IDEDMA_BYTE_COUNT_ALIGN, 1117 BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, 1118 &dma_maps->dmamap_xfer)) != 0) { 1119 printf("%s:%d: unable to create xfer DMA map for " 1120 "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname, 1121 channel, drive, error); 1122 return error; 1123 } 1124 return 0; 1125 } 1126 1127 int 1128 pciide_dma_init(v, channel, drive, databuf, datalen, flags) 1129 void *v; 1130 int channel, drive; 1131 void *databuf; 1132 size_t datalen; 1133 int flags; 1134 { 1135 struct pciide_softc *sc = v; 1136 int error, seg; 1137 struct pciide_dma_maps *dma_maps = 1138 &sc->pciide_channels[channel].dma_maps[drive]; 1139 1140 error = bus_dmamap_load(sc->sc_dmat, 1141 dma_maps->dmamap_xfer, 1142 databuf, datalen, NULL, BUS_DMA_NOWAIT | BUS_DMA_STREAMING | 1143 ((flags & WDC_DMA_READ) ? BUS_DMA_READ : BUS_DMA_WRITE)); 1144 if (error) { 1145 printf("%s:%d: unable to load xfer DMA map for" 1146 "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname, 1147 channel, drive, error); 1148 return error; 1149 } 1150 1151 bus_dmamap_sync(sc->sc_dmat, dma_maps->dmamap_xfer, 0, 1152 dma_maps->dmamap_xfer->dm_mapsize, 1153 (flags & WDC_DMA_READ) ? 1154 BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE); 1155 1156 for (seg = 0; seg < dma_maps->dmamap_xfer->dm_nsegs; seg++) { 1157 #ifdef DIAGNOSTIC 1158 /* A segment must not cross a 64k boundary */ 1159 { 1160 u_long phys = dma_maps->dmamap_xfer->dm_segs[seg].ds_addr; 1161 u_long len = dma_maps->dmamap_xfer->dm_segs[seg].ds_len; 1162 if ((phys & ~IDEDMA_BYTE_COUNT_MASK) != 1163 ((phys + len - 1) & ~IDEDMA_BYTE_COUNT_MASK)) { 1164 printf("pciide_dma: segment %d physical addr 0x%lx" 1165 " len 0x%lx not properly aligned\n", 1166 seg, phys, len); 1167 panic("pciide_dma: buf align"); 1168 } 1169 } 1170 #endif 1171 dma_maps->dma_table[seg].base_addr = 1172 htole32(dma_maps->dmamap_xfer->dm_segs[seg].ds_addr); 1173 dma_maps->dma_table[seg].byte_count = 1174 htole32(dma_maps->dmamap_xfer->dm_segs[seg].ds_len & 1175 IDEDMA_BYTE_COUNT_MASK); 1176 WDCDEBUG_PRINT(("\t seg %d len %d addr 0x%x\n", 1177 seg, le32toh(dma_maps->dma_table[seg].byte_count), 1178 le32toh(dma_maps->dma_table[seg].base_addr)), DEBUG_DMA); 1179 1180 } 1181 dma_maps->dma_table[dma_maps->dmamap_xfer->dm_nsegs -1].byte_count |= 1182 htole32(IDEDMA_BYTE_COUNT_EOT); 1183 1184 bus_dmamap_sync(sc->sc_dmat, dma_maps->dmamap_table, 0, 1185 dma_maps->dmamap_table->dm_mapsize, 1186 BUS_DMASYNC_PREWRITE); 1187 1188 /* Maps are ready. Start DMA function */ 1189 #ifdef DIAGNOSTIC 1190 if (dma_maps->dmamap_table->dm_segs[0].ds_addr & ~IDEDMA_TBL_MASK) { 1191 printf("pciide_dma_init: addr 0x%lx not properly aligned\n", 1192 (u_long)dma_maps->dmamap_table->dm_segs[0].ds_addr); 1193 panic("pciide_dma_init: table align"); 1194 } 1195 #endif 1196 1197 /* Clear status bits */ 1198 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 1199 IDEDMA_CTL + IDEDMA_SCH_OFFSET * channel, 1200 bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, 1201 IDEDMA_CTL + IDEDMA_SCH_OFFSET * channel)); 1202 /* Write table addr */ 1203 bus_space_write_4(sc->sc_dma_iot, sc->sc_dma_ioh, 1204 IDEDMA_TBL + IDEDMA_SCH_OFFSET * channel, 1205 dma_maps->dmamap_table->dm_segs[0].ds_addr); 1206 /* set read/write */ 1207 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 1208 IDEDMA_CMD + IDEDMA_SCH_OFFSET * channel, 1209 (flags & WDC_DMA_READ) ? IDEDMA_CMD_WRITE: 0); 1210 /* remember flags */ 1211 dma_maps->dma_flags = flags; 1212 return 0; 1213 } 1214 1215 void 1216 pciide_dma_start(v, channel, drive) 1217 void *v; 1218 int channel, drive; 1219 { 1220 struct pciide_softc *sc = v; 1221 1222 WDCDEBUG_PRINT(("pciide_dma_start\n"),DEBUG_XFERS); 1223 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 1224 IDEDMA_CMD + IDEDMA_SCH_OFFSET * channel, 1225 bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, 1226 IDEDMA_CMD + IDEDMA_SCH_OFFSET * channel) | IDEDMA_CMD_START); 1227 } 1228 1229 int 1230 pciide_dma_finish(v, channel, drive, force) 1231 void *v; 1232 int channel, drive; 1233 int force; 1234 { 1235 struct pciide_softc *sc = v; 1236 u_int8_t status; 1237 int error = 0; 1238 struct pciide_dma_maps *dma_maps = 1239 &sc->pciide_channels[channel].dma_maps[drive]; 1240 1241 status = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, 1242 IDEDMA_CTL + IDEDMA_SCH_OFFSET * channel); 1243 WDCDEBUG_PRINT(("pciide_dma_finish: status 0x%x\n", status), 1244 DEBUG_XFERS); 1245 1246 if (force == 0 && (status & IDEDMA_CTL_INTR) == 0) 1247 return WDC_DMAST_NOIRQ; 1248 1249 /* stop DMA channel */ 1250 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 1251 IDEDMA_CMD + IDEDMA_SCH_OFFSET * channel, 1252 bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, 1253 IDEDMA_CMD + IDEDMA_SCH_OFFSET * channel) & ~IDEDMA_CMD_START); 1254 1255 /* Unload the map of the data buffer */ 1256 bus_dmamap_sync(sc->sc_dmat, dma_maps->dmamap_xfer, 0, 1257 dma_maps->dmamap_xfer->dm_mapsize, 1258 (dma_maps->dma_flags & WDC_DMA_READ) ? 1259 BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE); 1260 bus_dmamap_unload(sc->sc_dmat, dma_maps->dmamap_xfer); 1261 1262 if ((status & IDEDMA_CTL_ERR) != 0) { 1263 printf("%s:%d:%d: bus-master DMA error: status=0x%x\n", 1264 sc->sc_wdcdev.sc_dev.dv_xname, channel, drive, status); 1265 error |= WDC_DMAST_ERR; 1266 } 1267 1268 if ((status & IDEDMA_CTL_INTR) == 0) { 1269 printf("%s:%d:%d: bus-master DMA error: missing interrupt, " 1270 "status=0x%x\n", sc->sc_wdcdev.sc_dev.dv_xname, channel, 1271 drive, status); 1272 error |= WDC_DMAST_NOIRQ; 1273 } 1274 1275 if ((status & IDEDMA_CTL_ACT) != 0) { 1276 /* data underrun, may be a valid condition for ATAPI */ 1277 error |= WDC_DMAST_UNDER; 1278 } 1279 return error; 1280 } 1281 1282 void 1283 pciide_irqack(chp) 1284 struct channel_softc *chp; 1285 { 1286 struct pciide_channel *cp = (struct pciide_channel*)chp; 1287 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 1288 1289 /* clear status bits in IDE DMA registers */ 1290 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 1291 IDEDMA_CTL + IDEDMA_SCH_OFFSET * chp->channel, 1292 bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, 1293 IDEDMA_CTL + IDEDMA_SCH_OFFSET * chp->channel)); 1294 } 1295 1296 /* some common code used by several chip_map */ 1297 int 1298 pciide_chansetup(sc, channel, interface) 1299 struct pciide_softc *sc; 1300 int channel; 1301 pcireg_t interface; 1302 { 1303 struct pciide_channel *cp = &sc->pciide_channels[channel]; 1304 sc->wdc_chanarray[channel] = &cp->wdc_channel; 1305 cp->name = PCIIDE_CHANNEL_NAME(channel); 1306 cp->wdc_channel.channel = channel; 1307 cp->wdc_channel.wdc = &sc->sc_wdcdev; 1308 cp->wdc_channel.ch_queue = 1309 malloc(sizeof(struct channel_queue), M_DEVBUF, M_NOWAIT); 1310 if (cp->wdc_channel.ch_queue == NULL) { 1311 printf("%s %s channel: " 1312 "can't allocate memory for command queue", 1313 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 1314 return 0; 1315 } 1316 printf("%s: %s channel %s to %s mode\n", 1317 sc->sc_wdcdev.sc_dev.dv_xname, cp->name, 1318 (interface & PCIIDE_INTERFACE_SETTABLE(channel)) ? 1319 "configured" : "wired", 1320 (interface & PCIIDE_INTERFACE_PCI(channel)) ? 1321 "native-PCI" : "compatibility"); 1322 return 1; 1323 } 1324 1325 /* some common code used by several chip channel_map */ 1326 void 1327 pciide_mapchan(pa, cp, interface, cmdsizep, ctlsizep, pci_intr) 1328 struct pci_attach_args *pa; 1329 struct pciide_channel *cp; 1330 pcireg_t interface; 1331 bus_size_t *cmdsizep, *ctlsizep; 1332 int (*pci_intr) __P((void *)); 1333 { 1334 struct channel_softc *wdc_cp = &cp->wdc_channel; 1335 1336 if (interface & PCIIDE_INTERFACE_PCI(wdc_cp->channel)) 1337 cp->hw_ok = pciide_mapregs_native(pa, cp, cmdsizep, ctlsizep, 1338 pci_intr); 1339 else 1340 cp->hw_ok = pciide_mapregs_compat(pa, cp, 1341 wdc_cp->channel, cmdsizep, ctlsizep); 1342 1343 if (cp->hw_ok == 0) 1344 return; 1345 wdc_cp->data32iot = wdc_cp->cmd_iot; 1346 wdc_cp->data32ioh = wdc_cp->cmd_ioh; 1347 wdcattach(wdc_cp); 1348 } 1349 1350 /* 1351 * Generic code to call to know if a channel can be disabled. Return 1 1352 * if channel can be disabled, 0 if not 1353 */ 1354 int 1355 pciide_chan_candisable(cp) 1356 struct pciide_channel *cp; 1357 { 1358 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 1359 struct channel_softc *wdc_cp = &cp->wdc_channel; 1360 1361 if ((wdc_cp->ch_drive[0].drive_flags & DRIVE) == 0 && 1362 (wdc_cp->ch_drive[1].drive_flags & DRIVE) == 0) { 1363 printf("%s: disabling %s channel (no drives)\n", 1364 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 1365 cp->hw_ok = 0; 1366 return 1; 1367 } 1368 return 0; 1369 } 1370 1371 /* 1372 * generic code to map the compat intr if hw_ok=1 and it is a compat channel. 1373 * Set hw_ok=0 on failure 1374 */ 1375 void 1376 pciide_map_compat_intr(pa, cp, compatchan, interface) 1377 struct pci_attach_args *pa; 1378 struct pciide_channel *cp; 1379 int compatchan, interface; 1380 { 1381 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 1382 struct channel_softc *wdc_cp = &cp->wdc_channel; 1383 1384 if (cp->hw_ok == 0) 1385 return; 1386 if ((interface & PCIIDE_INTERFACE_PCI(wdc_cp->channel)) != 0) 1387 return; 1388 1389 #ifdef __HAVE_PCIIDE_MACHDEP_COMPAT_INTR_ESTABLISH 1390 cp->ih = pciide_machdep_compat_intr_establish(&sc->sc_wdcdev.sc_dev, 1391 pa, compatchan, pciide_compat_intr, cp); 1392 if (cp->ih == NULL) { 1393 #endif 1394 printf("%s: no compatibility interrupt for use by %s " 1395 "channel\n", sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 1396 cp->hw_ok = 0; 1397 #ifdef __HAVE_PCIIDE_MACHDEP_COMPAT_INTR_ESTABLISH 1398 } 1399 #endif 1400 } 1401 1402 void 1403 pciide_print_modes(cp) 1404 struct pciide_channel *cp; 1405 { 1406 wdc_print_modes(&cp->wdc_channel); 1407 } 1408 1409 void 1410 default_chip_map(sc, pa) 1411 struct pciide_softc *sc; 1412 struct pci_attach_args *pa; 1413 { 1414 struct pciide_channel *cp; 1415 pcireg_t interface = PCI_INTERFACE(pa->pa_class); 1416 pcireg_t csr; 1417 int channel, drive; 1418 struct ata_drive_datas *drvp; 1419 u_int8_t idedma_ctl; 1420 bus_size_t cmdsize, ctlsize; 1421 char *failreason; 1422 1423 if (pciide_chipen(sc, pa) == 0) 1424 return; 1425 1426 if (interface & PCIIDE_INTERFACE_BUS_MASTER_DMA) { 1427 printf("%s: bus-master DMA support present", 1428 sc->sc_wdcdev.sc_dev.dv_xname); 1429 if (sc->sc_pp == &default_product_desc && 1430 (sc->sc_wdcdev.sc_dev.dv_cfdata->cf_flags & 1431 PCIIDE_OPTIONS_DMA) == 0) { 1432 printf(", but unused (no driver support)"); 1433 sc->sc_dma_ok = 0; 1434 } else { 1435 pciide_mapreg_dma(sc, pa); 1436 if (sc->sc_dma_ok != 0) 1437 printf(", used without full driver " 1438 "support"); 1439 } 1440 } else { 1441 printf("%s: hardware does not support DMA", 1442 sc->sc_wdcdev.sc_dev.dv_xname); 1443 sc->sc_dma_ok = 0; 1444 } 1445 printf("\n"); 1446 if (sc->sc_dma_ok) { 1447 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK; 1448 sc->sc_wdcdev.irqack = pciide_irqack; 1449 } 1450 sc->sc_wdcdev.PIO_cap = 0; 1451 sc->sc_wdcdev.DMA_cap = 0; 1452 1453 sc->sc_wdcdev.channels = sc->wdc_chanarray; 1454 sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS; 1455 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16; 1456 1457 for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) { 1458 cp = &sc->pciide_channels[channel]; 1459 if (pciide_chansetup(sc, channel, interface) == 0) 1460 continue; 1461 if (interface & PCIIDE_INTERFACE_PCI(channel)) { 1462 cp->hw_ok = pciide_mapregs_native(pa, cp, &cmdsize, 1463 &ctlsize, pciide_pci_intr); 1464 } else { 1465 cp->hw_ok = pciide_mapregs_compat(pa, cp, 1466 channel, &cmdsize, &ctlsize); 1467 } 1468 if (cp->hw_ok == 0) 1469 continue; 1470 /* 1471 * Check to see if something appears to be there. 1472 */ 1473 failreason = NULL; 1474 if (!wdcprobe(&cp->wdc_channel)) { 1475 failreason = "not responding; disabled or no drives?"; 1476 goto next; 1477 } 1478 /* 1479 * Now, make sure it's actually attributable to this PCI IDE 1480 * channel by trying to access the channel again while the 1481 * PCI IDE controller's I/O space is disabled. (If the 1482 * channel no longer appears to be there, it belongs to 1483 * this controller.) YUCK! 1484 */ 1485 csr = pci_conf_read(sc->sc_pc, sc->sc_tag, 1486 PCI_COMMAND_STATUS_REG); 1487 pci_conf_write(sc->sc_pc, sc->sc_tag, PCI_COMMAND_STATUS_REG, 1488 csr & ~PCI_COMMAND_IO_ENABLE); 1489 if (wdcprobe(&cp->wdc_channel)) 1490 failreason = "other hardware responding at addresses"; 1491 pci_conf_write(sc->sc_pc, sc->sc_tag, 1492 PCI_COMMAND_STATUS_REG, csr); 1493 next: 1494 if (failreason) { 1495 printf("%s: %s channel ignored (%s)\n", 1496 sc->sc_wdcdev.sc_dev.dv_xname, cp->name, 1497 failreason); 1498 cp->hw_ok = 0; 1499 bus_space_unmap(cp->wdc_channel.cmd_iot, 1500 cp->wdc_channel.cmd_ioh, cmdsize); 1501 if (interface & PCIIDE_INTERFACE_PCI(channel)) 1502 bus_space_unmap(cp->wdc_channel.ctl_iot, 1503 cp->ctl_baseioh, ctlsize); 1504 else 1505 bus_space_unmap(cp->wdc_channel.ctl_iot, 1506 cp->wdc_channel.ctl_ioh, ctlsize); 1507 } else { 1508 pciide_map_compat_intr(pa, cp, channel, interface); 1509 } 1510 if (cp->hw_ok) { 1511 cp->wdc_channel.data32iot = cp->wdc_channel.cmd_iot; 1512 cp->wdc_channel.data32ioh = cp->wdc_channel.cmd_ioh; 1513 wdcattach(&cp->wdc_channel); 1514 } 1515 } 1516 1517 if (sc->sc_dma_ok == 0) 1518 return; 1519 1520 /* Allocate DMA maps */ 1521 for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) { 1522 idedma_ctl = 0; 1523 cp = &sc->pciide_channels[channel]; 1524 for (drive = 0; drive < 2; drive++) { 1525 drvp = &cp->wdc_channel.ch_drive[drive]; 1526 /* If no drive, skip */ 1527 if ((drvp->drive_flags & DRIVE) == 0) 1528 continue; 1529 if ((drvp->drive_flags & DRIVE_DMA) == 0) 1530 continue; 1531 if (pciide_dma_table_setup(sc, channel, drive) != 0) { 1532 /* Abort DMA setup */ 1533 printf("%s:%d:%d: can't allocate DMA maps, " 1534 "using PIO transfers\n", 1535 sc->sc_wdcdev.sc_dev.dv_xname, 1536 channel, drive); 1537 drvp->drive_flags &= ~DRIVE_DMA; 1538 } 1539 printf("%s:%d:%d: using DMA data transfers\n", 1540 sc->sc_wdcdev.sc_dev.dv_xname, 1541 channel, drive); 1542 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 1543 } 1544 if (idedma_ctl != 0) { 1545 /* Add software bits in status register */ 1546 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 1547 IDEDMA_CTL + (IDEDMA_SCH_OFFSET * channel), 1548 idedma_ctl); 1549 } 1550 } 1551 } 1552 1553 void 1554 piix_chip_map(sc, pa) 1555 struct pciide_softc *sc; 1556 struct pci_attach_args *pa; 1557 { 1558 struct pciide_channel *cp; 1559 int channel; 1560 u_int32_t idetim; 1561 bus_size_t cmdsize, ctlsize; 1562 1563 if (pciide_chipen(sc, pa) == 0) 1564 return; 1565 1566 printf("%s: bus-master DMA support present", 1567 sc->sc_wdcdev.sc_dev.dv_xname); 1568 pciide_mapreg_dma(sc, pa); 1569 printf("\n"); 1570 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 | 1571 WDC_CAPABILITY_MODE; 1572 if (sc->sc_dma_ok) { 1573 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK; 1574 sc->sc_wdcdev.irqack = pciide_irqack; 1575 switch(sc->sc_pp->ide_product) { 1576 case PCI_PRODUCT_INTEL_82371AB_IDE: 1577 case PCI_PRODUCT_INTEL_82440MX_IDE: 1578 case PCI_PRODUCT_INTEL_82801AA_IDE: 1579 case PCI_PRODUCT_INTEL_82801AB_IDE: 1580 case PCI_PRODUCT_INTEL_82801BA_IDE: 1581 case PCI_PRODUCT_INTEL_82801BAM_IDE: 1582 case PCI_PRODUCT_INTEL_82801CA_IDE_1: 1583 case PCI_PRODUCT_INTEL_82801CA_IDE_2: 1584 case PCI_PRODUCT_INTEL_82801DB_IDE: 1585 sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA; 1586 } 1587 } 1588 sc->sc_wdcdev.PIO_cap = 4; 1589 sc->sc_wdcdev.DMA_cap = 2; 1590 switch(sc->sc_pp->ide_product) { 1591 case PCI_PRODUCT_INTEL_82801AA_IDE: 1592 sc->sc_wdcdev.UDMA_cap = 4; 1593 break; 1594 case PCI_PRODUCT_INTEL_82801BA_IDE: 1595 case PCI_PRODUCT_INTEL_82801BAM_IDE: 1596 case PCI_PRODUCT_INTEL_82801CA_IDE_1: 1597 case PCI_PRODUCT_INTEL_82801CA_IDE_2: 1598 case PCI_PRODUCT_INTEL_82801DB_IDE: 1599 sc->sc_wdcdev.UDMA_cap = 5; 1600 break; 1601 default: 1602 sc->sc_wdcdev.UDMA_cap = 2; 1603 } 1604 if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82371FB_IDE) 1605 sc->sc_wdcdev.set_modes = piix_setup_channel; 1606 else 1607 sc->sc_wdcdev.set_modes = piix3_4_setup_channel; 1608 sc->sc_wdcdev.channels = sc->wdc_chanarray; 1609 sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS; 1610 1611 WDCDEBUG_PRINT(("piix_setup_chip: old idetim=0x%x", 1612 pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM)), 1613 DEBUG_PROBE); 1614 if (sc->sc_pp->ide_product != PCI_PRODUCT_INTEL_82371FB_IDE) { 1615 WDCDEBUG_PRINT((", sidetim=0x%x", 1616 pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM)), 1617 DEBUG_PROBE); 1618 if (sc->sc_wdcdev.cap & WDC_CAPABILITY_UDMA) { 1619 WDCDEBUG_PRINT((", udamreg 0x%x", 1620 pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG)), 1621 DEBUG_PROBE); 1622 } 1623 if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE || 1624 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AB_IDE || 1625 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE || 1626 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE || 1627 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_1 || 1628 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_2 || 1629 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE) { 1630 WDCDEBUG_PRINT((", IDE_CONTROL 0x%x", 1631 pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_CONFIG)), 1632 DEBUG_PROBE); 1633 } 1634 1635 } 1636 WDCDEBUG_PRINT(("\n"), DEBUG_PROBE); 1637 1638 for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) { 1639 cp = &sc->pciide_channels[channel]; 1640 /* PIIX is compat-only */ 1641 if (pciide_chansetup(sc, channel, 0) == 0) 1642 continue; 1643 idetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM); 1644 if ((PIIX_IDETIM_READ(idetim, channel) & 1645 PIIX_IDETIM_IDE) == 0) { 1646 printf("%s: %s channel ignored (disabled)\n", 1647 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 1648 continue; 1649 } 1650 /* PIIX are compat-only pciide devices */ 1651 pciide_mapchan(pa, cp, 0, &cmdsize, &ctlsize, pciide_pci_intr); 1652 if (cp->hw_ok == 0) 1653 continue; 1654 if (pciide_chan_candisable(cp)) { 1655 idetim = PIIX_IDETIM_CLEAR(idetim, PIIX_IDETIM_IDE, 1656 channel); 1657 pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM, 1658 idetim); 1659 } 1660 pciide_map_compat_intr(pa, cp, channel, 0); 1661 if (cp->hw_ok == 0) 1662 continue; 1663 sc->sc_wdcdev.set_modes(&cp->wdc_channel); 1664 } 1665 1666 WDCDEBUG_PRINT(("piix_setup_chip: idetim=0x%x", 1667 pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM)), 1668 DEBUG_PROBE); 1669 if (sc->sc_pp->ide_product != PCI_PRODUCT_INTEL_82371FB_IDE) { 1670 WDCDEBUG_PRINT((", sidetim=0x%x", 1671 pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM)), 1672 DEBUG_PROBE); 1673 if (sc->sc_wdcdev.cap & WDC_CAPABILITY_UDMA) { 1674 WDCDEBUG_PRINT((", udamreg 0x%x", 1675 pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG)), 1676 DEBUG_PROBE); 1677 } 1678 if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE || 1679 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AB_IDE || 1680 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE || 1681 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE || 1682 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_1 || 1683 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_2 || 1684 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE) { 1685 WDCDEBUG_PRINT((", IDE_CONTROL 0x%x", 1686 pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_CONFIG)), 1687 DEBUG_PROBE); 1688 } 1689 } 1690 WDCDEBUG_PRINT(("\n"), DEBUG_PROBE); 1691 } 1692 1693 void 1694 piix_setup_channel(chp) 1695 struct channel_softc *chp; 1696 { 1697 u_int8_t mode[2], drive; 1698 u_int32_t oidetim, idetim, idedma_ctl; 1699 struct pciide_channel *cp = (struct pciide_channel*)chp; 1700 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 1701 struct ata_drive_datas *drvp = cp->wdc_channel.ch_drive; 1702 1703 oidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM); 1704 idetim = PIIX_IDETIM_CLEAR(oidetim, 0xffff, chp->channel); 1705 idedma_ctl = 0; 1706 1707 /* set up new idetim: Enable IDE registers decode */ 1708 idetim = PIIX_IDETIM_SET(idetim, PIIX_IDETIM_IDE, 1709 chp->channel); 1710 1711 /* setup DMA */ 1712 pciide_channel_dma_setup(cp); 1713 1714 /* 1715 * Here we have to mess up with drives mode: PIIX can't have 1716 * different timings for master and slave drives. 1717 * We need to find the best combination. 1718 */ 1719 1720 /* If both drives supports DMA, take the lower mode */ 1721 if ((drvp[0].drive_flags & DRIVE_DMA) && 1722 (drvp[1].drive_flags & DRIVE_DMA)) { 1723 mode[0] = mode[1] = 1724 min(drvp[0].DMA_mode, drvp[1].DMA_mode); 1725 drvp[0].DMA_mode = mode[0]; 1726 drvp[1].DMA_mode = mode[1]; 1727 goto ok; 1728 } 1729 /* 1730 * If only one drive supports DMA, use its mode, and 1731 * put the other one in PIO mode 0 if mode not compatible 1732 */ 1733 if (drvp[0].drive_flags & DRIVE_DMA) { 1734 mode[0] = drvp[0].DMA_mode; 1735 mode[1] = drvp[1].PIO_mode; 1736 if (piix_isp_pio[mode[1]] != piix_isp_dma[mode[0]] || 1737 piix_rtc_pio[mode[1]] != piix_rtc_dma[mode[0]]) 1738 mode[1] = drvp[1].PIO_mode = 0; 1739 goto ok; 1740 } 1741 if (drvp[1].drive_flags & DRIVE_DMA) { 1742 mode[1] = drvp[1].DMA_mode; 1743 mode[0] = drvp[0].PIO_mode; 1744 if (piix_isp_pio[mode[0]] != piix_isp_dma[mode[1]] || 1745 piix_rtc_pio[mode[0]] != piix_rtc_dma[mode[1]]) 1746 mode[0] = drvp[0].PIO_mode = 0; 1747 goto ok; 1748 } 1749 /* 1750 * If both drives are not DMA, takes the lower mode, unless 1751 * one of them is PIO mode < 2 1752 */ 1753 if (drvp[0].PIO_mode < 2) { 1754 mode[0] = drvp[0].PIO_mode = 0; 1755 mode[1] = drvp[1].PIO_mode; 1756 } else if (drvp[1].PIO_mode < 2) { 1757 mode[1] = drvp[1].PIO_mode = 0; 1758 mode[0] = drvp[0].PIO_mode; 1759 } else { 1760 mode[0] = mode[1] = 1761 min(drvp[1].PIO_mode, drvp[0].PIO_mode); 1762 drvp[0].PIO_mode = mode[0]; 1763 drvp[1].PIO_mode = mode[1]; 1764 } 1765 ok: /* The modes are setup */ 1766 for (drive = 0; drive < 2; drive++) { 1767 if (drvp[drive].drive_flags & DRIVE_DMA) { 1768 idetim |= piix_setup_idetim_timings( 1769 mode[drive], 1, chp->channel); 1770 goto end; 1771 } 1772 } 1773 /* If we are there, none of the drives are DMA */ 1774 if (mode[0] >= 2) 1775 idetim |= piix_setup_idetim_timings( 1776 mode[0], 0, chp->channel); 1777 else 1778 idetim |= piix_setup_idetim_timings( 1779 mode[1], 0, chp->channel); 1780 end: /* 1781 * timing mode is now set up in the controller. Enable 1782 * it per-drive 1783 */ 1784 for (drive = 0; drive < 2; drive++) { 1785 /* If no drive, skip */ 1786 if ((drvp[drive].drive_flags & DRIVE) == 0) 1787 continue; 1788 idetim |= piix_setup_idetim_drvs(&drvp[drive]); 1789 if (drvp[drive].drive_flags & DRIVE_DMA) 1790 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 1791 } 1792 if (idedma_ctl != 0) { 1793 /* Add software bits in status register */ 1794 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 1795 IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel), 1796 idedma_ctl); 1797 } 1798 pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM, idetim); 1799 pciide_print_modes(cp); 1800 } 1801 1802 void 1803 piix3_4_setup_channel(chp) 1804 struct channel_softc *chp; 1805 { 1806 struct ata_drive_datas *drvp; 1807 u_int32_t oidetim, idetim, sidetim, udmareg, ideconf, idedma_ctl; 1808 struct pciide_channel *cp = (struct pciide_channel*)chp; 1809 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 1810 int drive; 1811 int channel = chp->channel; 1812 1813 oidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM); 1814 sidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM); 1815 udmareg = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG); 1816 ideconf = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_CONFIG); 1817 idetim = PIIX_IDETIM_CLEAR(oidetim, 0xffff, channel); 1818 sidetim &= ~(PIIX_SIDETIM_ISP_MASK(channel) | 1819 PIIX_SIDETIM_RTC_MASK(channel)); 1820 1821 idedma_ctl = 0; 1822 /* If channel disabled, no need to go further */ 1823 if ((PIIX_IDETIM_READ(oidetim, channel) & PIIX_IDETIM_IDE) == 0) 1824 return; 1825 /* set up new idetim: Enable IDE registers decode */ 1826 idetim = PIIX_IDETIM_SET(idetim, PIIX_IDETIM_IDE, channel); 1827 1828 /* setup DMA if needed */ 1829 pciide_channel_dma_setup(cp); 1830 1831 for (drive = 0; drive < 2; drive++) { 1832 udmareg &= ~(PIIX_UDMACTL_DRV_EN(channel, drive) | 1833 PIIX_UDMATIM_SET(0x3, channel, drive)); 1834 drvp = &chp->ch_drive[drive]; 1835 /* If no drive, skip */ 1836 if ((drvp->drive_flags & DRIVE) == 0) 1837 continue; 1838 if (((drvp->drive_flags & DRIVE_DMA) == 0 && 1839 (drvp->drive_flags & DRIVE_UDMA) == 0)) 1840 goto pio; 1841 1842 if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE || 1843 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AB_IDE || 1844 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE || 1845 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE || 1846 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_1 || 1847 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_2 || 1848 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE) { 1849 ideconf |= PIIX_CONFIG_PINGPONG; 1850 } 1851 if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE || 1852 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE || 1853 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_1 || 1854 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_2 || 1855 sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE) { 1856 /* setup Ultra/100 */ 1857 if (drvp->UDMA_mode > 2 && 1858 (ideconf & PIIX_CONFIG_CR(channel, drive)) == 0) 1859 drvp->UDMA_mode = 2; 1860 if (drvp->UDMA_mode > 4) { 1861 ideconf |= PIIX_CONFIG_UDMA100(channel, drive); 1862 } else { 1863 ideconf &= ~PIIX_CONFIG_UDMA100(channel, drive); 1864 if (drvp->UDMA_mode > 2) { 1865 ideconf |= PIIX_CONFIG_UDMA66(channel, 1866 drive); 1867 } else { 1868 ideconf &= ~PIIX_CONFIG_UDMA66(channel, 1869 drive); 1870 } 1871 } 1872 } 1873 if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE) { 1874 /* setup Ultra/66 */ 1875 if (drvp->UDMA_mode > 2 && 1876 (ideconf & PIIX_CONFIG_CR(channel, drive)) == 0) 1877 drvp->UDMA_mode = 2; 1878 if (drvp->UDMA_mode > 2) 1879 ideconf |= PIIX_CONFIG_UDMA66(channel, drive); 1880 else 1881 ideconf &= ~PIIX_CONFIG_UDMA66(channel, drive); 1882 } 1883 if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) && 1884 (drvp->drive_flags & DRIVE_UDMA)) { 1885 /* use Ultra/DMA */ 1886 drvp->drive_flags &= ~DRIVE_DMA; 1887 udmareg |= PIIX_UDMACTL_DRV_EN( channel, drive); 1888 udmareg |= PIIX_UDMATIM_SET( 1889 piix4_sct_udma[drvp->UDMA_mode], channel, drive); 1890 } else { 1891 /* use Multiword DMA */ 1892 drvp->drive_flags &= ~DRIVE_UDMA; 1893 if (drive == 0) { 1894 idetim |= piix_setup_idetim_timings( 1895 drvp->DMA_mode, 1, channel); 1896 } else { 1897 sidetim |= piix_setup_sidetim_timings( 1898 drvp->DMA_mode, 1, channel); 1899 idetim =PIIX_IDETIM_SET(idetim, 1900 PIIX_IDETIM_SITRE, channel); 1901 } 1902 } 1903 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 1904 1905 pio: /* use PIO mode */ 1906 idetim |= piix_setup_idetim_drvs(drvp); 1907 if (drive == 0) { 1908 idetim |= piix_setup_idetim_timings( 1909 drvp->PIO_mode, 0, channel); 1910 } else { 1911 sidetim |= piix_setup_sidetim_timings( 1912 drvp->PIO_mode, 0, channel); 1913 idetim =PIIX_IDETIM_SET(idetim, 1914 PIIX_IDETIM_SITRE, channel); 1915 } 1916 } 1917 if (idedma_ctl != 0) { 1918 /* Add software bits in status register */ 1919 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 1920 IDEDMA_CTL + (IDEDMA_SCH_OFFSET * channel), 1921 idedma_ctl); 1922 } 1923 pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM, idetim); 1924 pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM, sidetim); 1925 pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG, udmareg); 1926 pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_CONFIG, ideconf); 1927 pciide_print_modes(cp); 1928 } 1929 1930 1931 /* setup ISP and RTC fields, based on mode */ 1932 static u_int32_t 1933 piix_setup_idetim_timings(mode, dma, channel) 1934 u_int8_t mode; 1935 u_int8_t dma; 1936 u_int8_t channel; 1937 { 1938 1939 if (dma) 1940 return PIIX_IDETIM_SET(0, 1941 PIIX_IDETIM_ISP_SET(piix_isp_dma[mode]) | 1942 PIIX_IDETIM_RTC_SET(piix_rtc_dma[mode]), 1943 channel); 1944 else 1945 return PIIX_IDETIM_SET(0, 1946 PIIX_IDETIM_ISP_SET(piix_isp_pio[mode]) | 1947 PIIX_IDETIM_RTC_SET(piix_rtc_pio[mode]), 1948 channel); 1949 } 1950 1951 /* setup DTE, PPE, IE and TIME field based on PIO mode */ 1952 static u_int32_t 1953 piix_setup_idetim_drvs(drvp) 1954 struct ata_drive_datas *drvp; 1955 { 1956 u_int32_t ret = 0; 1957 struct channel_softc *chp = drvp->chnl_softc; 1958 u_int8_t channel = chp->channel; 1959 u_int8_t drive = drvp->drive; 1960 1961 /* 1962 * If drive is using UDMA, timings setups are independant 1963 * So just check DMA and PIO here. 1964 */ 1965 if (drvp->drive_flags & DRIVE_DMA) { 1966 /* if mode = DMA mode 0, use compatible timings */ 1967 if ((drvp->drive_flags & DRIVE_DMA) && 1968 drvp->DMA_mode == 0) { 1969 drvp->PIO_mode = 0; 1970 return ret; 1971 } 1972 ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_TIME(drive), channel); 1973 /* 1974 * PIO and DMA timings are the same, use fast timings for PIO 1975 * too, else use compat timings. 1976 */ 1977 if ((piix_isp_pio[drvp->PIO_mode] != 1978 piix_isp_dma[drvp->DMA_mode]) || 1979 (piix_rtc_pio[drvp->PIO_mode] != 1980 piix_rtc_dma[drvp->DMA_mode])) 1981 drvp->PIO_mode = 0; 1982 /* if PIO mode <= 2, use compat timings for PIO */ 1983 if (drvp->PIO_mode <= 2) { 1984 ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_DTE(drive), 1985 channel); 1986 return ret; 1987 } 1988 } 1989 1990 /* 1991 * Now setup PIO modes. If mode < 2, use compat timings. 1992 * Else enable fast timings. Enable IORDY and prefetch/post 1993 * if PIO mode >= 3. 1994 */ 1995 1996 if (drvp->PIO_mode < 2) 1997 return ret; 1998 1999 ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_TIME(drive), channel); 2000 if (drvp->PIO_mode >= 3) { 2001 ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_IE(drive), channel); 2002 ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_PPE(drive), channel); 2003 } 2004 return ret; 2005 } 2006 2007 /* setup values in SIDETIM registers, based on mode */ 2008 static u_int32_t 2009 piix_setup_sidetim_timings(mode, dma, channel) 2010 u_int8_t mode; 2011 u_int8_t dma; 2012 u_int8_t channel; 2013 { 2014 if (dma) 2015 return PIIX_SIDETIM_ISP_SET(piix_isp_dma[mode], channel) | 2016 PIIX_SIDETIM_RTC_SET(piix_rtc_dma[mode], channel); 2017 else 2018 return PIIX_SIDETIM_ISP_SET(piix_isp_pio[mode], channel) | 2019 PIIX_SIDETIM_RTC_SET(piix_rtc_pio[mode], channel); 2020 } 2021 2022 void 2023 amd7x6_chip_map(sc, pa) 2024 struct pciide_softc *sc; 2025 struct pci_attach_args *pa; 2026 { 2027 struct pciide_channel *cp; 2028 pcireg_t interface = PCI_INTERFACE(pa->pa_class); 2029 int channel; 2030 pcireg_t chanenable; 2031 bus_size_t cmdsize, ctlsize; 2032 2033 if (pciide_chipen(sc, pa) == 0) 2034 return; 2035 printf("%s: bus-master DMA support present", 2036 sc->sc_wdcdev.sc_dev.dv_xname); 2037 pciide_mapreg_dma(sc, pa); 2038 printf("\n"); 2039 sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 | 2040 WDC_CAPABILITY_MODE; 2041 if (sc->sc_dma_ok) { 2042 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA; 2043 sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK; 2044 sc->sc_wdcdev.irqack = pciide_irqack; 2045 } 2046 sc->sc_wdcdev.PIO_cap = 4; 2047 sc->sc_wdcdev.DMA_cap = 2; 2048 2049 switch (sc->sc_pci_vendor) { 2050 case PCI_VENDOR_AMD: 2051 switch (sc->sc_pp->ide_product) { 2052 case PCI_PRODUCT_AMD_PBC766_IDE: 2053 case PCI_PRODUCT_AMD_PBC768_IDE: 2054 case PCI_PRODUCT_AMD_PBC8111_IDE: 2055 sc->sc_wdcdev.UDMA_cap = 5; 2056 break; 2057 default: 2058 sc->sc_wdcdev.UDMA_cap = 4; 2059 } 2060 sc->sc_amd_regbase = AMD7X6_AMD_REGBASE; 2061 break; 2062 2063 case PCI_VENDOR_NVIDIA: 2064 switch (sc->sc_pp->ide_product) { 2065 case PCI_PRODUCT_NVIDIA_NFORCE_ATA100: 2066 sc->sc_wdcdev.UDMA_cap = 5; 2067 break; 2068 case PCI_PRODUCT_NVIDIA_NFORCE2_ATA133: 2069 sc->sc_wdcdev.UDMA_cap = 6; 2070 break; 2071 } 2072 sc->sc_amd_regbase = AMD7X6_NVIDIA_REGBASE; 2073 break; 2074 2075 default: 2076 panic("amd7x6_chip_map: unknown vendor"); 2077 } 2078 sc->sc_wdcdev.set_modes = amd7x6_setup_channel; 2079 sc->sc_wdcdev.channels = sc->wdc_chanarray; 2080 sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS; 2081 chanenable = pci_conf_read(sc->sc_pc, sc->sc_tag, 2082 AMD7X6_CHANSTATUS_EN(sc)); 2083 2084 WDCDEBUG_PRINT(("amd7x6_chip_map: Channel enable=0x%x\n", chanenable), 2085 DEBUG_PROBE); 2086 for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) { 2087 cp = &sc->pciide_channels[channel]; 2088 if (pciide_chansetup(sc, channel, interface) == 0) 2089 continue; 2090 2091 if ((chanenable & AMD7X6_CHAN_EN(channel)) == 0) { 2092 printf("%s: %s channel ignored (disabled)\n", 2093 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 2094 continue; 2095 } 2096 pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize, 2097 pciide_pci_intr); 2098 2099 if (pciide_chan_candisable(cp)) 2100 chanenable &= ~AMD7X6_CHAN_EN(channel); 2101 pciide_map_compat_intr(pa, cp, channel, interface); 2102 if (cp->hw_ok == 0) 2103 continue; 2104 2105 amd7x6_setup_channel(&cp->wdc_channel); 2106 } 2107 pci_conf_write(sc->sc_pc, sc->sc_tag, AMD7X6_CHANSTATUS_EN(sc), 2108 chanenable); 2109 return; 2110 } 2111 2112 void 2113 amd7x6_setup_channel(chp) 2114 struct channel_softc *chp; 2115 { 2116 u_int32_t udmatim_reg, datatim_reg; 2117 u_int8_t idedma_ctl; 2118 int mode, drive; 2119 struct ata_drive_datas *drvp; 2120 struct pciide_channel *cp = (struct pciide_channel*)chp; 2121 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 2122 #ifndef PCIIDE_AMD756_ENABLEDMA 2123 int rev = PCI_REVISION( 2124 pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG)); 2125 #endif 2126 2127 idedma_ctl = 0; 2128 datatim_reg = pci_conf_read(sc->sc_pc, sc->sc_tag, AMD7X6_DATATIM(sc)); 2129 udmatim_reg = pci_conf_read(sc->sc_pc, sc->sc_tag, AMD7X6_UDMA(sc)); 2130 datatim_reg &= ~AMD7X6_DATATIM_MASK(chp->channel); 2131 udmatim_reg &= ~AMD7X6_UDMA_MASK(chp->channel); 2132 2133 /* setup DMA if needed */ 2134 pciide_channel_dma_setup(cp); 2135 2136 for (drive = 0; drive < 2; drive++) { 2137 drvp = &chp->ch_drive[drive]; 2138 /* If no drive, skip */ 2139 if ((drvp->drive_flags & DRIVE) == 0) 2140 continue; 2141 /* add timing values, setup DMA if needed */ 2142 if (((drvp->drive_flags & DRIVE_DMA) == 0 && 2143 (drvp->drive_flags & DRIVE_UDMA) == 0)) { 2144 mode = drvp->PIO_mode; 2145 goto pio; 2146 } 2147 if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) && 2148 (drvp->drive_flags & DRIVE_UDMA)) { 2149 /* use Ultra/DMA */ 2150 drvp->drive_flags &= ~DRIVE_DMA; 2151 udmatim_reg |= AMD7X6_UDMA_EN(chp->channel, drive) | 2152 AMD7X6_UDMA_EN_MTH(chp->channel, drive) | 2153 AMD7X6_UDMA_TIME(chp->channel, drive, 2154 amd7x6_udma_tim[drvp->UDMA_mode]); 2155 /* can use PIO timings, MW DMA unused */ 2156 mode = drvp->PIO_mode; 2157 } else { 2158 /* use Multiword DMA, but only if revision is OK */ 2159 drvp->drive_flags &= ~DRIVE_UDMA; 2160 #ifndef PCIIDE_AMD756_ENABLEDMA 2161 /* 2162 * The workaround doesn't seem to be necessary 2163 * with all drives, so it can be disabled by 2164 * PCIIDE_AMD756_ENABLEDMA. It causes a hard hang if 2165 * triggered. 2166 */ 2167 if (sc->sc_pci_vendor == PCI_VENDOR_AMD && 2168 sc->sc_pp->ide_product == 2169 PCI_PRODUCT_AMD_PBC756_IDE && 2170 AMD756_CHIPREV_DISABLEDMA(rev)) { 2171 printf("%s:%d:%d: multi-word DMA disabled due " 2172 "to chip revision\n", 2173 sc->sc_wdcdev.sc_dev.dv_xname, 2174 chp->channel, drive); 2175 mode = drvp->PIO_mode; 2176 drvp->drive_flags &= ~DRIVE_DMA; 2177 goto pio; 2178 } 2179 #endif 2180 /* mode = min(pio, dma+2) */ 2181 if (drvp->PIO_mode <= (drvp->DMA_mode +2)) 2182 mode = drvp->PIO_mode; 2183 else 2184 mode = drvp->DMA_mode + 2; 2185 } 2186 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 2187 2188 pio: /* setup PIO mode */ 2189 if (mode <= 2) { 2190 drvp->DMA_mode = 0; 2191 drvp->PIO_mode = 0; 2192 mode = 0; 2193 } else { 2194 drvp->PIO_mode = mode; 2195 drvp->DMA_mode = mode - 2; 2196 } 2197 datatim_reg |= 2198 AMD7X6_DATATIM_PULSE(chp->channel, drive, 2199 amd7x6_pio_set[mode]) | 2200 AMD7X6_DATATIM_RECOV(chp->channel, drive, 2201 amd7x6_pio_rec[mode]); 2202 } 2203 if (idedma_ctl != 0) { 2204 /* Add software bits in status register */ 2205 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 2206 IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel), 2207 idedma_ctl); 2208 } 2209 pciide_print_modes(cp); 2210 pci_conf_write(sc->sc_pc, sc->sc_tag, AMD7X6_DATATIM(sc), datatim_reg); 2211 pci_conf_write(sc->sc_pc, sc->sc_tag, AMD7X6_UDMA(sc), udmatim_reg); 2212 } 2213 2214 void 2215 apollo_chip_map(sc, pa) 2216 struct pciide_softc *sc; 2217 struct pci_attach_args *pa; 2218 { 2219 struct pciide_channel *cp; 2220 pcireg_t interface = PCI_INTERFACE(pa->pa_class); 2221 int channel; 2222 u_int32_t ideconf; 2223 bus_size_t cmdsize, ctlsize; 2224 pcitag_t pcib_tag; 2225 pcireg_t pcib_id, pcib_class; 2226 2227 if (pciide_chipen(sc, pa) == 0) 2228 return; 2229 /* get a PCI tag for the ISA bridge (function 0 of the same device) */ 2230 pcib_tag = pci_make_tag(pa->pa_pc, pa->pa_bus, pa->pa_device, 0); 2231 /* and read ID and rev of the ISA bridge */ 2232 pcib_id = pci_conf_read(sc->sc_pc, pcib_tag, PCI_ID_REG); 2233 pcib_class = pci_conf_read(sc->sc_pc, pcib_tag, PCI_CLASS_REG); 2234 printf(": VIA Technologies "); 2235 switch (PCI_PRODUCT(pcib_id)) { 2236 case PCI_PRODUCT_VIATECH_VT82C586_ISA: 2237 printf("VT82C586 (Apollo VP) "); 2238 if(PCI_REVISION(pcib_class) >= 0x02) { 2239 printf("ATA33 controller\n"); 2240 sc->sc_wdcdev.UDMA_cap = 2; 2241 } else { 2242 printf("controller\n"); 2243 sc->sc_wdcdev.UDMA_cap = 0; 2244 } 2245 break; 2246 case PCI_PRODUCT_VIATECH_VT82C596A: 2247 printf("VT82C596A (Apollo Pro) "); 2248 if (PCI_REVISION(pcib_class) >= 0x12) { 2249 printf("ATA66 controller\n"); 2250 sc->sc_wdcdev.UDMA_cap = 4; 2251 } else { 2252 printf("ATA33 controller\n"); 2253 sc->sc_wdcdev.UDMA_cap = 2; 2254 } 2255 break; 2256 case PCI_PRODUCT_VIATECH_VT82C686A_ISA: 2257 printf("VT82C686A (Apollo KX133) "); 2258 if (PCI_REVISION(pcib_class) >= 0x40) { 2259 printf("ATA100 controller\n"); 2260 sc->sc_wdcdev.UDMA_cap = 5; 2261 } else { 2262 printf("ATA66 controller\n"); 2263 sc->sc_wdcdev.UDMA_cap = 4; 2264 } 2265 break; 2266 case PCI_PRODUCT_VIATECH_VT8231: 2267 printf("VT8231 ATA100 controller\n"); 2268 sc->sc_wdcdev.UDMA_cap = 5; 2269 break; 2270 case PCI_PRODUCT_VIATECH_VT8233: 2271 printf("VT8233 ATA100 controller\n"); 2272 sc->sc_wdcdev.UDMA_cap = 5; 2273 break; 2274 case PCI_PRODUCT_VIATECH_VT8233A: 2275 printf("VT8233A ATA133 controller\n"); 2276 sc->sc_wdcdev.UDMA_cap = 6; 2277 break; 2278 case PCI_PRODUCT_VIATECH_VT8235: 2279 printf("VT8235 ATA133 controller\n"); 2280 sc->sc_wdcdev.UDMA_cap = 6; 2281 break; 2282 default: 2283 printf("unknown ATA controller\n"); 2284 sc->sc_wdcdev.UDMA_cap = 0; 2285 } 2286 2287 printf("%s: bus-master DMA support present", 2288 sc->sc_wdcdev.sc_dev.dv_xname); 2289 pciide_mapreg_dma(sc, pa); 2290 printf("\n"); 2291 sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 | 2292 WDC_CAPABILITY_MODE; 2293 if (sc->sc_dma_ok) { 2294 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK; 2295 sc->sc_wdcdev.irqack = pciide_irqack; 2296 if (sc->sc_wdcdev.UDMA_cap > 0) 2297 sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA; 2298 } 2299 sc->sc_wdcdev.PIO_cap = 4; 2300 sc->sc_wdcdev.DMA_cap = 2; 2301 sc->sc_wdcdev.set_modes = apollo_setup_channel; 2302 sc->sc_wdcdev.channels = sc->wdc_chanarray; 2303 sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS; 2304 2305 WDCDEBUG_PRINT(("apollo_chip_map: old APO_IDECONF=0x%x, " 2306 "APO_CTLMISC=0x%x, APO_DATATIM=0x%x, APO_UDMA=0x%x\n", 2307 pci_conf_read(sc->sc_pc, sc->sc_tag, APO_IDECONF), 2308 pci_conf_read(sc->sc_pc, sc->sc_tag, APO_CTLMISC), 2309 pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM), 2310 pci_conf_read(sc->sc_pc, sc->sc_tag, APO_UDMA)), 2311 DEBUG_PROBE); 2312 2313 for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) { 2314 cp = &sc->pciide_channels[channel]; 2315 if (pciide_chansetup(sc, channel, interface) == 0) 2316 continue; 2317 2318 ideconf = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_IDECONF); 2319 if ((ideconf & APO_IDECONF_EN(channel)) == 0) { 2320 printf("%s: %s channel ignored (disabled)\n", 2321 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 2322 continue; 2323 } 2324 pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize, 2325 pciide_pci_intr); 2326 if (cp->hw_ok == 0) 2327 continue; 2328 if (pciide_chan_candisable(cp)) { 2329 ideconf &= ~APO_IDECONF_EN(channel); 2330 pci_conf_write(sc->sc_pc, sc->sc_tag, APO_IDECONF, 2331 ideconf); 2332 } 2333 pciide_map_compat_intr(pa, cp, channel, interface); 2334 2335 if (cp->hw_ok == 0) 2336 continue; 2337 apollo_setup_channel(&sc->pciide_channels[channel].wdc_channel); 2338 } 2339 WDCDEBUG_PRINT(("apollo_chip_map: APO_DATATIM=0x%x, APO_UDMA=0x%x\n", 2340 pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM), 2341 pci_conf_read(sc->sc_pc, sc->sc_tag, APO_UDMA)), DEBUG_PROBE); 2342 } 2343 2344 void 2345 apollo_setup_channel(chp) 2346 struct channel_softc *chp; 2347 { 2348 u_int32_t udmatim_reg, datatim_reg; 2349 u_int8_t idedma_ctl; 2350 int mode, drive; 2351 struct ata_drive_datas *drvp; 2352 struct pciide_channel *cp = (struct pciide_channel*)chp; 2353 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 2354 2355 idedma_ctl = 0; 2356 datatim_reg = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM); 2357 udmatim_reg = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_UDMA); 2358 datatim_reg &= ~APO_DATATIM_MASK(chp->channel); 2359 udmatim_reg &= ~APO_UDMA_MASK(chp->channel); 2360 2361 /* setup DMA if needed */ 2362 pciide_channel_dma_setup(cp); 2363 2364 for (drive = 0; drive < 2; drive++) { 2365 drvp = &chp->ch_drive[drive]; 2366 /* If no drive, skip */ 2367 if ((drvp->drive_flags & DRIVE) == 0) 2368 continue; 2369 /* add timing values, setup DMA if needed */ 2370 if (((drvp->drive_flags & DRIVE_DMA) == 0 && 2371 (drvp->drive_flags & DRIVE_UDMA) == 0)) { 2372 mode = drvp->PIO_mode; 2373 goto pio; 2374 } 2375 if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) && 2376 (drvp->drive_flags & DRIVE_UDMA)) { 2377 /* use Ultra/DMA */ 2378 drvp->drive_flags &= ~DRIVE_DMA; 2379 udmatim_reg |= APO_UDMA_EN(chp->channel, drive) | 2380 APO_UDMA_EN_MTH(chp->channel, drive); 2381 if (sc->sc_wdcdev.UDMA_cap == 6) { 2382 /* 8233a */ 2383 udmatim_reg |= APO_UDMA_TIME(chp->channel, 2384 drive, apollo_udma133_tim[drvp->UDMA_mode]); 2385 } else if (sc->sc_wdcdev.UDMA_cap == 5) { 2386 /* 686b */ 2387 udmatim_reg |= APO_UDMA_TIME(chp->channel, 2388 drive, apollo_udma100_tim[drvp->UDMA_mode]); 2389 } else if (sc->sc_wdcdev.UDMA_cap == 4) { 2390 /* 596b or 686a */ 2391 udmatim_reg |= APO_UDMA_CLK66(chp->channel); 2392 udmatim_reg |= APO_UDMA_TIME(chp->channel, 2393 drive, apollo_udma66_tim[drvp->UDMA_mode]); 2394 } else { 2395 /* 596a or 586b */ 2396 udmatim_reg |= APO_UDMA_TIME(chp->channel, 2397 drive, apollo_udma33_tim[drvp->UDMA_mode]); 2398 } 2399 /* can use PIO timings, MW DMA unused */ 2400 mode = drvp->PIO_mode; 2401 } else { 2402 /* use Multiword DMA */ 2403 drvp->drive_flags &= ~DRIVE_UDMA; 2404 /* mode = min(pio, dma+2) */ 2405 if (drvp->PIO_mode <= (drvp->DMA_mode +2)) 2406 mode = drvp->PIO_mode; 2407 else 2408 mode = drvp->DMA_mode + 2; 2409 } 2410 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 2411 2412 pio: /* setup PIO mode */ 2413 if (mode <= 2) { 2414 drvp->DMA_mode = 0; 2415 drvp->PIO_mode = 0; 2416 mode = 0; 2417 } else { 2418 drvp->PIO_mode = mode; 2419 drvp->DMA_mode = mode - 2; 2420 } 2421 datatim_reg |= 2422 APO_DATATIM_PULSE(chp->channel, drive, 2423 apollo_pio_set[mode]) | 2424 APO_DATATIM_RECOV(chp->channel, drive, 2425 apollo_pio_rec[mode]); 2426 } 2427 if (idedma_ctl != 0) { 2428 /* Add software bits in status register */ 2429 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 2430 IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel), 2431 idedma_ctl); 2432 } 2433 pciide_print_modes(cp); 2434 pci_conf_write(sc->sc_pc, sc->sc_tag, APO_DATATIM, datatim_reg); 2435 pci_conf_write(sc->sc_pc, sc->sc_tag, APO_UDMA, udmatim_reg); 2436 } 2437 2438 void 2439 cmd_channel_map(pa, sc, channel) 2440 struct pci_attach_args *pa; 2441 struct pciide_softc *sc; 2442 int channel; 2443 { 2444 struct pciide_channel *cp = &sc->pciide_channels[channel]; 2445 bus_size_t cmdsize, ctlsize; 2446 u_int8_t ctrl = pciide_pci_read(sc->sc_pc, sc->sc_tag, CMD_CTRL); 2447 int interface, one_channel; 2448 2449 /* 2450 * The 0648/0649 can be told to identify as a RAID controller. 2451 * In this case, we have to fake interface 2452 */ 2453 if (PCI_SUBCLASS(pa->pa_class) != PCI_SUBCLASS_MASS_STORAGE_IDE) { 2454 interface = PCIIDE_INTERFACE_SETTABLE(0) | 2455 PCIIDE_INTERFACE_SETTABLE(1); 2456 if (pciide_pci_read(pa->pa_pc, pa->pa_tag, CMD_CONF) & 2457 CMD_CONF_DSA1) 2458 interface |= PCIIDE_INTERFACE_PCI(0) | 2459 PCIIDE_INTERFACE_PCI(1); 2460 } else { 2461 interface = PCI_INTERFACE(pa->pa_class); 2462 } 2463 2464 sc->wdc_chanarray[channel] = &cp->wdc_channel; 2465 cp->name = PCIIDE_CHANNEL_NAME(channel); 2466 cp->wdc_channel.channel = channel; 2467 cp->wdc_channel.wdc = &sc->sc_wdcdev; 2468 2469 /* 2470 * Older CMD64X doesn't have independant channels 2471 */ 2472 switch (sc->sc_pp->ide_product) { 2473 case PCI_PRODUCT_CMDTECH_649: 2474 one_channel = 0; 2475 break; 2476 default: 2477 one_channel = 1; 2478 break; 2479 } 2480 2481 if (channel > 0 && one_channel) { 2482 cp->wdc_channel.ch_queue = 2483 sc->pciide_channels[0].wdc_channel.ch_queue; 2484 } else { 2485 cp->wdc_channel.ch_queue = 2486 malloc(sizeof(struct channel_queue), M_DEVBUF, M_NOWAIT); 2487 } 2488 if (cp->wdc_channel.ch_queue == NULL) { 2489 printf("%s %s channel: " 2490 "can't allocate memory for command queue", 2491 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 2492 return; 2493 } 2494 2495 printf("%s: %s channel %s to %s mode\n", 2496 sc->sc_wdcdev.sc_dev.dv_xname, cp->name, 2497 (interface & PCIIDE_INTERFACE_SETTABLE(channel)) ? 2498 "configured" : "wired", 2499 (interface & PCIIDE_INTERFACE_PCI(channel)) ? 2500 "native-PCI" : "compatibility"); 2501 2502 /* 2503 * with a CMD PCI64x, if we get here, the first channel is enabled: 2504 * there's no way to disable the first channel without disabling 2505 * the whole device 2506 */ 2507 if (channel != 0 && (ctrl & CMD_CTRL_2PORT) == 0) { 2508 printf("%s: %s channel ignored (disabled)\n", 2509 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 2510 return; 2511 } 2512 2513 pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize, cmd_pci_intr); 2514 if (cp->hw_ok == 0) 2515 return; 2516 if (channel == 1) { 2517 if (pciide_chan_candisable(cp)) { 2518 ctrl &= ~CMD_CTRL_2PORT; 2519 pciide_pci_write(pa->pa_pc, pa->pa_tag, 2520 CMD_CTRL, ctrl); 2521 } 2522 } 2523 pciide_map_compat_intr(pa, cp, channel, interface); 2524 } 2525 2526 int 2527 cmd_pci_intr(arg) 2528 void *arg; 2529 { 2530 struct pciide_softc *sc = arg; 2531 struct pciide_channel *cp; 2532 struct channel_softc *wdc_cp; 2533 int i, rv, crv; 2534 u_int32_t priirq, secirq; 2535 2536 rv = 0; 2537 priirq = pciide_pci_read(sc->sc_pc, sc->sc_tag, CMD_CONF); 2538 secirq = pciide_pci_read(sc->sc_pc, sc->sc_tag, CMD_ARTTIM23); 2539 for (i = 0; i < sc->sc_wdcdev.nchannels; i++) { 2540 cp = &sc->pciide_channels[i]; 2541 wdc_cp = &cp->wdc_channel; 2542 /* If a compat channel skip. */ 2543 if (cp->compat) 2544 continue; 2545 if ((i == 0 && (priirq & CMD_CONF_DRV0_INTR)) || 2546 (i == 1 && (secirq & CMD_ARTTIM23_IRQ))) { 2547 crv = wdcintr(wdc_cp); 2548 if (crv == 0) 2549 printf("%s:%d: bogus intr\n", 2550 sc->sc_wdcdev.sc_dev.dv_xname, i); 2551 else 2552 rv = 1; 2553 } 2554 } 2555 return rv; 2556 } 2557 2558 void 2559 cmd_chip_map(sc, pa) 2560 struct pciide_softc *sc; 2561 struct pci_attach_args *pa; 2562 { 2563 int channel; 2564 2565 /* 2566 * For a CMD PCI064x, the use of PCI_COMMAND_IO_ENABLE 2567 * and base adresses registers can be disabled at 2568 * hardware level. In this case, the device is wired 2569 * in compat mode and its first channel is always enabled, 2570 * but we can't rely on PCI_COMMAND_IO_ENABLE. 2571 * In fact, it seems that the first channel of the CMD PCI0640 2572 * can't be disabled. 2573 */ 2574 2575 #ifdef PCIIDE_CMD064x_DISABLE 2576 if (pciide_chipen(sc, pa) == 0) 2577 return; 2578 #endif 2579 2580 printf("%s: hardware does not support DMA\n", 2581 sc->sc_wdcdev.sc_dev.dv_xname); 2582 sc->sc_dma_ok = 0; 2583 2584 sc->sc_wdcdev.channels = sc->wdc_chanarray; 2585 sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS; 2586 sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16; 2587 2588 for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) { 2589 cmd_channel_map(pa, sc, channel); 2590 } 2591 } 2592 2593 void 2594 cmd0643_9_chip_map(sc, pa) 2595 struct pciide_softc *sc; 2596 struct pci_attach_args *pa; 2597 { 2598 struct pciide_channel *cp; 2599 int channel; 2600 pcireg_t rev = PCI_REVISION(pa->pa_class); 2601 2602 /* 2603 * For a CMD PCI064x, the use of PCI_COMMAND_IO_ENABLE 2604 * and base adresses registers can be disabled at 2605 * hardware level. In this case, the device is wired 2606 * in compat mode and its first channel is always enabled, 2607 * but we can't rely on PCI_COMMAND_IO_ENABLE. 2608 * In fact, it seems that the first channel of the CMD PCI0640 2609 * can't be disabled. 2610 */ 2611 2612 #ifdef PCIIDE_CMD064x_DISABLE 2613 if (pciide_chipen(sc, pa) == 0) 2614 return; 2615 #endif 2616 printf("%s: bus-master DMA support present", 2617 sc->sc_wdcdev.sc_dev.dv_xname); 2618 pciide_mapreg_dma(sc, pa); 2619 printf("\n"); 2620 sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 | 2621 WDC_CAPABILITY_MODE; 2622 if (sc->sc_dma_ok) { 2623 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK; 2624 switch (sc->sc_pp->ide_product) { 2625 case PCI_PRODUCT_CMDTECH_649: 2626 sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA; 2627 sc->sc_wdcdev.UDMA_cap = 5; 2628 sc->sc_wdcdev.irqack = cmd646_9_irqack; 2629 break; 2630 case PCI_PRODUCT_CMDTECH_648: 2631 sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA; 2632 sc->sc_wdcdev.UDMA_cap = 4; 2633 sc->sc_wdcdev.irqack = cmd646_9_irqack; 2634 break; 2635 case PCI_PRODUCT_CMDTECH_646: 2636 if (rev >= CMD0646U2_REV) { 2637 sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA; 2638 sc->sc_wdcdev.UDMA_cap = 2; 2639 } else if (rev >= CMD0646U_REV) { 2640 /* 2641 * Linux's driver claims that the 646U is broken 2642 * with UDMA. Only enable it if we know what we're 2643 * doing 2644 */ 2645 #ifdef PCIIDE_CMD0646U_ENABLEUDMA 2646 sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA; 2647 sc->sc_wdcdev.UDMA_cap = 2; 2648 #endif 2649 /* explicitly disable UDMA */ 2650 pciide_pci_write(sc->sc_pc, sc->sc_tag, 2651 CMD_UDMATIM(0), 0); 2652 pciide_pci_write(sc->sc_pc, sc->sc_tag, 2653 CMD_UDMATIM(1), 0); 2654 } 2655 sc->sc_wdcdev.irqack = cmd646_9_irqack; 2656 break; 2657 default: 2658 sc->sc_wdcdev.irqack = pciide_irqack; 2659 } 2660 } 2661 2662 sc->sc_wdcdev.channels = sc->wdc_chanarray; 2663 sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS; 2664 sc->sc_wdcdev.PIO_cap = 4; 2665 sc->sc_wdcdev.DMA_cap = 2; 2666 sc->sc_wdcdev.set_modes = cmd0643_9_setup_channel; 2667 2668 WDCDEBUG_PRINT(("cmd0643_9_chip_map: old timings reg 0x%x 0x%x\n", 2669 pci_conf_read(sc->sc_pc, sc->sc_tag, 0x54), 2670 pci_conf_read(sc->sc_pc, sc->sc_tag, 0x58)), 2671 DEBUG_PROBE); 2672 2673 for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) { 2674 cp = &sc->pciide_channels[channel]; 2675 cmd_channel_map(pa, sc, channel); 2676 if (cp->hw_ok == 0) 2677 continue; 2678 cmd0643_9_setup_channel(&cp->wdc_channel); 2679 } 2680 /* 2681 * note - this also makes sure we clear the irq disable and reset 2682 * bits 2683 */ 2684 pciide_pci_write(sc->sc_pc, sc->sc_tag, CMD_DMA_MODE, CMD_DMA_MULTIPLE); 2685 WDCDEBUG_PRINT(("cmd0643_9_chip_map: timings reg now 0x%x 0x%x\n", 2686 pci_conf_read(sc->sc_pc, sc->sc_tag, 0x54), 2687 pci_conf_read(sc->sc_pc, sc->sc_tag, 0x58)), 2688 DEBUG_PROBE); 2689 } 2690 2691 void 2692 cmd0643_9_setup_channel(chp) 2693 struct channel_softc *chp; 2694 { 2695 struct ata_drive_datas *drvp; 2696 u_int8_t tim; 2697 u_int32_t idedma_ctl, udma_reg; 2698 int drive; 2699 struct pciide_channel *cp = (struct pciide_channel*)chp; 2700 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 2701 2702 idedma_ctl = 0; 2703 /* setup DMA if needed */ 2704 pciide_channel_dma_setup(cp); 2705 2706 for (drive = 0; drive < 2; drive++) { 2707 drvp = &chp->ch_drive[drive]; 2708 /* If no drive, skip */ 2709 if ((drvp->drive_flags & DRIVE) == 0) 2710 continue; 2711 /* add timing values, setup DMA if needed */ 2712 tim = cmd0643_9_data_tim_pio[drvp->PIO_mode]; 2713 if (drvp->drive_flags & (DRIVE_DMA | DRIVE_UDMA)) { 2714 if (drvp->drive_flags & DRIVE_UDMA) { 2715 /* UltraDMA on a 646U2, 0648 or 0649 */ 2716 drvp->drive_flags &= ~DRIVE_DMA; 2717 udma_reg = pciide_pci_read(sc->sc_pc, 2718 sc->sc_tag, CMD_UDMATIM(chp->channel)); 2719 if (drvp->UDMA_mode > 2 && 2720 (pciide_pci_read(sc->sc_pc, sc->sc_tag, 2721 CMD_BICSR) & 2722 CMD_BICSR_80(chp->channel)) == 0) 2723 drvp->UDMA_mode = 2; 2724 if (drvp->UDMA_mode > 2) 2725 udma_reg &= ~CMD_UDMATIM_UDMA33(drive); 2726 else if (sc->sc_wdcdev.UDMA_cap > 2) 2727 udma_reg |= CMD_UDMATIM_UDMA33(drive); 2728 udma_reg |= CMD_UDMATIM_UDMA(drive); 2729 udma_reg &= ~(CMD_UDMATIM_TIM_MASK << 2730 CMD_UDMATIM_TIM_OFF(drive)); 2731 udma_reg |= 2732 (cmd0646_9_tim_udma[drvp->UDMA_mode] << 2733 CMD_UDMATIM_TIM_OFF(drive)); 2734 pciide_pci_write(sc->sc_pc, sc->sc_tag, 2735 CMD_UDMATIM(chp->channel), udma_reg); 2736 } else { 2737 /* 2738 * use Multiword DMA. 2739 * Timings will be used for both PIO and DMA, 2740 * so adjust DMA mode if needed 2741 * if we have a 0646U2/8/9, turn off UDMA 2742 */ 2743 if (sc->sc_wdcdev.cap & WDC_CAPABILITY_UDMA) { 2744 udma_reg = pciide_pci_read(sc->sc_pc, 2745 sc->sc_tag, 2746 CMD_UDMATIM(chp->channel)); 2747 udma_reg &= ~CMD_UDMATIM_UDMA(drive); 2748 pciide_pci_write(sc->sc_pc, sc->sc_tag, 2749 CMD_UDMATIM(chp->channel), 2750 udma_reg); 2751 } 2752 if (drvp->PIO_mode >= 3 && 2753 (drvp->DMA_mode + 2) > drvp->PIO_mode) { 2754 drvp->DMA_mode = drvp->PIO_mode - 2; 2755 } 2756 tim = cmd0643_9_data_tim_dma[drvp->DMA_mode]; 2757 } 2758 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 2759 } 2760 pciide_pci_write(sc->sc_pc, sc->sc_tag, 2761 CMD_DATA_TIM(chp->channel, drive), tim); 2762 } 2763 if (idedma_ctl != 0) { 2764 /* Add software bits in status register */ 2765 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 2766 IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel), 2767 idedma_ctl); 2768 } 2769 pciide_print_modes(cp); 2770 } 2771 2772 void 2773 cmd646_9_irqack(chp) 2774 struct channel_softc *chp; 2775 { 2776 u_int32_t priirq, secirq; 2777 struct pciide_channel *cp = (struct pciide_channel*)chp; 2778 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 2779 2780 if (chp->channel == 0) { 2781 priirq = pciide_pci_read(sc->sc_pc, sc->sc_tag, CMD_CONF); 2782 pciide_pci_write(sc->sc_pc, sc->sc_tag, CMD_CONF, priirq); 2783 } else { 2784 secirq = pciide_pci_read(sc->sc_pc, sc->sc_tag, CMD_ARTTIM23); 2785 pciide_pci_write(sc->sc_pc, sc->sc_tag, CMD_ARTTIM23, secirq); 2786 } 2787 pciide_irqack(chp); 2788 } 2789 2790 void 2791 cmd680_chip_map(sc, pa) 2792 struct pciide_softc *sc; 2793 struct pci_attach_args *pa; 2794 { 2795 struct pciide_channel *cp; 2796 int channel; 2797 2798 if (pciide_chipen(sc, pa) == 0) 2799 return; 2800 printf("%s: bus-master DMA support present", 2801 sc->sc_wdcdev.sc_dev.dv_xname); 2802 pciide_mapreg_dma(sc, pa); 2803 printf("\n"); 2804 sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 | 2805 WDC_CAPABILITY_MODE; 2806 if (sc->sc_dma_ok) { 2807 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK; 2808 sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA; 2809 sc->sc_wdcdev.UDMA_cap = 6; 2810 sc->sc_wdcdev.irqack = pciide_irqack; 2811 } 2812 2813 sc->sc_wdcdev.channels = sc->wdc_chanarray; 2814 sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS; 2815 sc->sc_wdcdev.PIO_cap = 4; 2816 sc->sc_wdcdev.DMA_cap = 2; 2817 sc->sc_wdcdev.set_modes = cmd680_setup_channel; 2818 2819 pciide_pci_write(sc->sc_pc, sc->sc_tag, 0x80, 0x00); 2820 pciide_pci_write(sc->sc_pc, sc->sc_tag, 0x84, 0x00); 2821 pciide_pci_write(sc->sc_pc, sc->sc_tag, 0x8a, 2822 pciide_pci_read(sc->sc_pc, sc->sc_tag, 0x8a) | 0x01); 2823 for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) { 2824 cp = &sc->pciide_channels[channel]; 2825 cmd680_channel_map(pa, sc, channel); 2826 if (cp->hw_ok == 0) 2827 continue; 2828 cmd680_setup_channel(&cp->wdc_channel); 2829 } 2830 } 2831 2832 void 2833 cmd680_channel_map(pa, sc, channel) 2834 struct pci_attach_args *pa; 2835 struct pciide_softc *sc; 2836 int channel; 2837 { 2838 struct pciide_channel *cp = &sc->pciide_channels[channel]; 2839 bus_size_t cmdsize, ctlsize; 2840 int interface, i, reg; 2841 static const u_int8_t init_val[] = 2842 { 0x8a, 0x32, 0x8a, 0x32, 0x8a, 0x32, 2843 0x92, 0x43, 0x92, 0x43, 0x09, 0x40, 0x09, 0x40 }; 2844 2845 if (PCI_SUBCLASS(pa->pa_class) != PCI_SUBCLASS_MASS_STORAGE_IDE) { 2846 interface = PCIIDE_INTERFACE_SETTABLE(0) | 2847 PCIIDE_INTERFACE_SETTABLE(1); 2848 interface |= PCIIDE_INTERFACE_PCI(0) | 2849 PCIIDE_INTERFACE_PCI(1); 2850 } else { 2851 interface = PCI_INTERFACE(pa->pa_class); 2852 } 2853 2854 sc->wdc_chanarray[channel] = &cp->wdc_channel; 2855 cp->name = PCIIDE_CHANNEL_NAME(channel); 2856 cp->wdc_channel.channel = channel; 2857 cp->wdc_channel.wdc = &sc->sc_wdcdev; 2858 2859 cp->wdc_channel.ch_queue = 2860 malloc(sizeof(struct channel_queue), M_DEVBUF, M_NOWAIT); 2861 if (cp->wdc_channel.ch_queue == NULL) { 2862 printf("%s %s channel: " 2863 "can't allocate memory for command queue", 2864 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 2865 return; 2866 } 2867 2868 /* XXX */ 2869 reg = 0xa2 + channel * 16; 2870 for (i = 0; i < sizeof(init_val); i++) 2871 pciide_pci_write(sc->sc_pc, sc->sc_tag, reg + i, init_val[i]); 2872 2873 printf("%s: %s channel %s to %s mode\n", 2874 sc->sc_wdcdev.sc_dev.dv_xname, cp->name, 2875 (interface & PCIIDE_INTERFACE_SETTABLE(channel)) ? 2876 "configured" : "wired", 2877 (interface & PCIIDE_INTERFACE_PCI(channel)) ? 2878 "native-PCI" : "compatibility"); 2879 2880 pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize, pciide_pci_intr); 2881 if (cp->hw_ok == 0) 2882 return; 2883 pciide_map_compat_intr(pa, cp, channel, interface); 2884 } 2885 2886 void 2887 cmd680_setup_channel(chp) 2888 struct channel_softc *chp; 2889 { 2890 struct ata_drive_datas *drvp; 2891 u_int8_t mode, off, scsc; 2892 u_int16_t val; 2893 u_int32_t idedma_ctl; 2894 int drive; 2895 struct pciide_channel *cp = (struct pciide_channel*)chp; 2896 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 2897 pci_chipset_tag_t pc = sc->sc_pc; 2898 pcitag_t pa = sc->sc_tag; 2899 static const u_int8_t udma2_tbl[] = 2900 { 0x0f, 0x0b, 0x07, 0x06, 0x03, 0x02, 0x01 }; 2901 static const u_int8_t udma_tbl[] = 2902 { 0x0c, 0x07, 0x05, 0x04, 0x02, 0x01, 0x00 }; 2903 static const u_int16_t dma_tbl[] = 2904 { 0x2208, 0x10c2, 0x10c1 }; 2905 static const u_int16_t pio_tbl[] = 2906 { 0x328a, 0x2283, 0x1104, 0x10c3, 0x10c1 }; 2907 2908 idedma_ctl = 0; 2909 pciide_channel_dma_setup(cp); 2910 mode = pciide_pci_read(pc, pa, 0x80 + chp->channel * 4); 2911 2912 for (drive = 0; drive < 2; drive++) { 2913 drvp = &chp->ch_drive[drive]; 2914 /* If no drive, skip */ 2915 if ((drvp->drive_flags & DRIVE) == 0) 2916 continue; 2917 mode &= ~(0x03 << (drive * 4)); 2918 if (drvp->drive_flags & DRIVE_UDMA) { 2919 drvp->drive_flags &= ~DRIVE_DMA; 2920 off = 0xa0 + chp->channel * 16; 2921 if (drvp->UDMA_mode > 2 && 2922 (pciide_pci_read(pc, pa, off) & 0x01) == 0) 2923 drvp->UDMA_mode = 2; 2924 scsc = pciide_pci_read(pc, pa, 0x8a); 2925 if (drvp->UDMA_mode == 6 && (scsc & 0x30) == 0) { 2926 pciide_pci_write(pc, pa, 0x8a, scsc | 0x01); 2927 scsc = pciide_pci_read(pc, pa, 0x8a); 2928 if ((scsc & 0x30) == 0) 2929 drvp->UDMA_mode = 5; 2930 } 2931 mode |= 0x03 << (drive * 4); 2932 off = 0xac + chp->channel * 16 + drive * 2; 2933 val = pciide_pci_read(pc, pa, off) & ~0x3f; 2934 if (scsc & 0x30) 2935 val |= udma2_tbl[drvp->UDMA_mode]; 2936 else 2937 val |= udma_tbl[drvp->UDMA_mode]; 2938 pciide_pci_write(pc, pa, off, val); 2939 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 2940 } else if (drvp->drive_flags & DRIVE_DMA) { 2941 mode |= 0x02 << (drive * 4); 2942 off = 0xa8 + chp->channel * 16 + drive * 2; 2943 val = dma_tbl[drvp->DMA_mode]; 2944 pciide_pci_write(pc, pa, off, val & 0xff); 2945 pciide_pci_write(pc, pa, off, val >> 8); 2946 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 2947 } else { 2948 mode |= 0x01 << (drive * 4); 2949 off = 0xa4 + chp->channel * 16 + drive * 2; 2950 val = pio_tbl[drvp->PIO_mode]; 2951 pciide_pci_write(pc, pa, off, val & 0xff); 2952 pciide_pci_write(pc, pa, off, val >> 8); 2953 } 2954 } 2955 2956 pciide_pci_write(pc, pa, 0x80 + chp->channel * 4, mode); 2957 if (idedma_ctl != 0) { 2958 /* Add software bits in status register */ 2959 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 2960 IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel), 2961 idedma_ctl); 2962 } 2963 pciide_print_modes(cp); 2964 } 2965 2966 void 2967 cy693_chip_map(sc, pa) 2968 struct pciide_softc *sc; 2969 struct pci_attach_args *pa; 2970 { 2971 struct pciide_channel *cp; 2972 pcireg_t interface = PCI_INTERFACE(pa->pa_class); 2973 bus_size_t cmdsize, ctlsize; 2974 2975 if (pciide_chipen(sc, pa) == 0) 2976 return; 2977 /* 2978 * this chip has 2 PCI IDE functions, one for primary and one for 2979 * secondary. So we need to call pciide_mapregs_compat() with 2980 * the real channel 2981 */ 2982 if (pa->pa_function == 1) { 2983 sc->sc_cy_compatchan = 0; 2984 } else if (pa->pa_function == 2) { 2985 sc->sc_cy_compatchan = 1; 2986 } else { 2987 printf("%s: unexpected PCI function %d\n", 2988 sc->sc_wdcdev.sc_dev.dv_xname, pa->pa_function); 2989 return; 2990 } 2991 if (interface & PCIIDE_INTERFACE_BUS_MASTER_DMA) { 2992 printf("%s: bus-master DMA support present", 2993 sc->sc_wdcdev.sc_dev.dv_xname); 2994 pciide_mapreg_dma(sc, pa); 2995 } else { 2996 printf("%s: hardware does not support DMA", 2997 sc->sc_wdcdev.sc_dev.dv_xname); 2998 sc->sc_dma_ok = 0; 2999 } 3000 printf("\n"); 3001 3002 sc->sc_cy_handle = cy82c693_init(pa->pa_iot); 3003 if (sc->sc_cy_handle == NULL) { 3004 printf("%s: unable to map hyperCache control registers\n", 3005 sc->sc_wdcdev.sc_dev.dv_xname); 3006 sc->sc_dma_ok = 0; 3007 } 3008 3009 sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 | 3010 WDC_CAPABILITY_MODE; 3011 if (sc->sc_dma_ok) { 3012 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK; 3013 sc->sc_wdcdev.irqack = pciide_irqack; 3014 } 3015 sc->sc_wdcdev.PIO_cap = 4; 3016 sc->sc_wdcdev.DMA_cap = 2; 3017 sc->sc_wdcdev.set_modes = cy693_setup_channel; 3018 3019 sc->sc_wdcdev.channels = sc->wdc_chanarray; 3020 sc->sc_wdcdev.nchannels = 1; 3021 3022 /* Only one channel for this chip; if we are here it's enabled */ 3023 cp = &sc->pciide_channels[0]; 3024 sc->wdc_chanarray[0] = &cp->wdc_channel; 3025 cp->name = PCIIDE_CHANNEL_NAME(0); 3026 cp->wdc_channel.channel = 0; 3027 cp->wdc_channel.wdc = &sc->sc_wdcdev; 3028 cp->wdc_channel.ch_queue = 3029 malloc(sizeof(struct channel_queue), M_DEVBUF, M_NOWAIT); 3030 if (cp->wdc_channel.ch_queue == NULL) { 3031 printf("%s primary channel: " 3032 "can't allocate memory for command queue", 3033 sc->sc_wdcdev.sc_dev.dv_xname); 3034 return; 3035 } 3036 printf("%s: primary channel %s to ", 3037 sc->sc_wdcdev.sc_dev.dv_xname, 3038 (interface & PCIIDE_INTERFACE_SETTABLE(0)) ? 3039 "configured" : "wired"); 3040 if (interface & PCIIDE_INTERFACE_PCI(0)) { 3041 printf("native-PCI"); 3042 cp->hw_ok = pciide_mapregs_native(pa, cp, &cmdsize, &ctlsize, 3043 pciide_pci_intr); 3044 } else { 3045 printf("compatibility"); 3046 cp->hw_ok = pciide_mapregs_compat(pa, cp, sc->sc_cy_compatchan, 3047 &cmdsize, &ctlsize); 3048 } 3049 printf(" mode\n"); 3050 cp->wdc_channel.data32iot = cp->wdc_channel.cmd_iot; 3051 cp->wdc_channel.data32ioh = cp->wdc_channel.cmd_ioh; 3052 wdcattach(&cp->wdc_channel); 3053 if (pciide_chan_candisable(cp)) { 3054 pci_conf_write(sc->sc_pc, sc->sc_tag, 3055 PCI_COMMAND_STATUS_REG, 0); 3056 } 3057 pciide_map_compat_intr(pa, cp, sc->sc_cy_compatchan, interface); 3058 if (cp->hw_ok == 0) 3059 return; 3060 WDCDEBUG_PRINT(("cy693_chip_map: old timings reg 0x%x\n", 3061 pci_conf_read(sc->sc_pc, sc->sc_tag, CY_CMD_CTRL)),DEBUG_PROBE); 3062 cy693_setup_channel(&cp->wdc_channel); 3063 WDCDEBUG_PRINT(("cy693_chip_map: new timings reg 0x%x\n", 3064 pci_conf_read(sc->sc_pc, sc->sc_tag, CY_CMD_CTRL)), DEBUG_PROBE); 3065 } 3066 3067 void 3068 cy693_setup_channel(chp) 3069 struct channel_softc *chp; 3070 { 3071 struct ata_drive_datas *drvp; 3072 int drive; 3073 u_int32_t cy_cmd_ctrl; 3074 u_int32_t idedma_ctl; 3075 struct pciide_channel *cp = (struct pciide_channel*)chp; 3076 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 3077 int dma_mode = -1; 3078 3079 cy_cmd_ctrl = idedma_ctl = 0; 3080 3081 /* setup DMA if needed */ 3082 pciide_channel_dma_setup(cp); 3083 3084 for (drive = 0; drive < 2; drive++) { 3085 drvp = &chp->ch_drive[drive]; 3086 /* If no drive, skip */ 3087 if ((drvp->drive_flags & DRIVE) == 0) 3088 continue; 3089 /* add timing values, setup DMA if needed */ 3090 if (drvp->drive_flags & DRIVE_DMA) { 3091 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 3092 /* use Multiword DMA */ 3093 if (dma_mode == -1 || dma_mode > drvp->DMA_mode) 3094 dma_mode = drvp->DMA_mode; 3095 } 3096 cy_cmd_ctrl |= (cy_pio_pulse[drvp->PIO_mode] << 3097 CY_CMD_CTRL_IOW_PULSE_OFF(drive)); 3098 cy_cmd_ctrl |= (cy_pio_rec[drvp->PIO_mode] << 3099 CY_CMD_CTRL_IOW_REC_OFF(drive)); 3100 cy_cmd_ctrl |= (cy_pio_pulse[drvp->PIO_mode] << 3101 CY_CMD_CTRL_IOR_PULSE_OFF(drive)); 3102 cy_cmd_ctrl |= (cy_pio_rec[drvp->PIO_mode] << 3103 CY_CMD_CTRL_IOR_REC_OFF(drive)); 3104 } 3105 pci_conf_write(sc->sc_pc, sc->sc_tag, CY_CMD_CTRL, cy_cmd_ctrl); 3106 chp->ch_drive[0].DMA_mode = dma_mode; 3107 chp->ch_drive[1].DMA_mode = dma_mode; 3108 3109 if (dma_mode == -1) 3110 dma_mode = 0; 3111 3112 if (sc->sc_cy_handle != NULL) { 3113 /* Note: `multiple' is implied. */ 3114 cy82c693_write(sc->sc_cy_handle, 3115 (sc->sc_cy_compatchan == 0) ? 3116 CY_DMA_IDX_PRIMARY : CY_DMA_IDX_SECONDARY, dma_mode); 3117 } 3118 3119 pciide_print_modes(cp); 3120 3121 if (idedma_ctl != 0) { 3122 /* Add software bits in status register */ 3123 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 3124 IDEDMA_CTL, idedma_ctl); 3125 } 3126 } 3127 3128 static int 3129 sis_hostbr_match(pa) 3130 struct pci_attach_args *pa; 3131 { 3132 return ((PCI_VENDOR(pa->pa_id) == PCI_VENDOR_SIS) && 3133 ((PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_SIS_645) || 3134 (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_SIS_650) || 3135 (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_SIS_730) || 3136 (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_SIS_735) || 3137 (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_SIS_745))); 3138 } 3139 3140 void 3141 sis_chip_map(sc, pa) 3142 struct pciide_softc *sc; 3143 struct pci_attach_args *pa; 3144 { 3145 struct pciide_channel *cp; 3146 int channel; 3147 u_int8_t sis_ctr0 = pciide_pci_read(sc->sc_pc, sc->sc_tag, SIS_CTRL0); 3148 pcireg_t interface = PCI_INTERFACE(pa->pa_class); 3149 pcireg_t rev = PCI_REVISION(pa->pa_class); 3150 bus_size_t cmdsize, ctlsize; 3151 pcitag_t pchb_tag; 3152 pcireg_t pchb_id, pchb_class; 3153 3154 if (pciide_chipen(sc, pa) == 0) 3155 return; 3156 printf("%s: bus-master DMA support present", 3157 sc->sc_wdcdev.sc_dev.dv_xname); 3158 pciide_mapreg_dma(sc, pa); 3159 printf("\n"); 3160 3161 /* get a PCI tag for the host bridge (function 0 of the same device) */ 3162 pchb_tag = pci_make_tag(pa->pa_pc, pa->pa_bus, pa->pa_device, 0); 3163 /* and read ID and rev of the ISA bridge */ 3164 pchb_id = pci_conf_read(sc->sc_pc, pchb_tag, PCI_ID_REG); 3165 pchb_class = pci_conf_read(sc->sc_pc, pchb_tag, PCI_CLASS_REG); 3166 3167 sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 | 3168 WDC_CAPABILITY_MODE; 3169 if (sc->sc_dma_ok) { 3170 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK; 3171 sc->sc_wdcdev.irqack = pciide_irqack; 3172 /* 3173 * controllers associated to a rev 0x2 530 Host to PCI Bridge 3174 * have problems with UDMA (info provided by Christos) 3175 */ 3176 if (rev >= 0xd0 && 3177 (PCI_PRODUCT(pchb_id) != PCI_PRODUCT_SIS_530HB || 3178 PCI_REVISION(pchb_class) >= 0x03)) 3179 sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA; 3180 } 3181 3182 sc->sc_wdcdev.PIO_cap = 4; 3183 sc->sc_wdcdev.DMA_cap = 2; 3184 if (sc->sc_wdcdev.cap & WDC_CAPABILITY_UDMA) 3185 /* 3186 * Use UDMA/100 on SiS 735 chipset and UDMA/33 on other 3187 * chipsets. 3188 */ 3189 sc->sc_wdcdev.UDMA_cap = 3190 pci_find_device(pa, sis_hostbr_match) ? 5 : 2; 3191 sc->sc_wdcdev.set_modes = sis_setup_channel; 3192 3193 sc->sc_wdcdev.channels = sc->wdc_chanarray; 3194 sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS; 3195 3196 pciide_pci_write(sc->sc_pc, sc->sc_tag, SIS_MISC, 3197 pciide_pci_read(sc->sc_pc, sc->sc_tag, SIS_MISC) | 3198 SIS_MISC_TIM_SEL | SIS_MISC_FIFO_SIZE); 3199 3200 for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) { 3201 cp = &sc->pciide_channels[channel]; 3202 if (pciide_chansetup(sc, channel, interface) == 0) 3203 continue; 3204 if ((channel == 0 && (sis_ctr0 & SIS_CTRL0_CHAN0_EN) == 0) || 3205 (channel == 1 && (sis_ctr0 & SIS_CTRL0_CHAN1_EN) == 0)) { 3206 printf("%s: %s channel ignored (disabled)\n", 3207 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 3208 continue; 3209 } 3210 pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize, 3211 pciide_pci_intr); 3212 if (cp->hw_ok == 0) 3213 continue; 3214 if (pciide_chan_candisable(cp)) { 3215 if (channel == 0) 3216 sis_ctr0 &= ~SIS_CTRL0_CHAN0_EN; 3217 else 3218 sis_ctr0 &= ~SIS_CTRL0_CHAN1_EN; 3219 pciide_pci_write(sc->sc_pc, sc->sc_tag, SIS_CTRL0, 3220 sis_ctr0); 3221 } 3222 pciide_map_compat_intr(pa, cp, channel, interface); 3223 if (cp->hw_ok == 0) 3224 continue; 3225 sis_setup_channel(&cp->wdc_channel); 3226 } 3227 } 3228 3229 void 3230 sis_setup_channel(chp) 3231 struct channel_softc *chp; 3232 { 3233 struct ata_drive_datas *drvp; 3234 int drive; 3235 u_int32_t sis_tim; 3236 u_int32_t idedma_ctl; 3237 struct pciide_channel *cp = (struct pciide_channel*)chp; 3238 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 3239 3240 WDCDEBUG_PRINT(("sis_setup_channel: old timings reg for " 3241 "channel %d 0x%x\n", chp->channel, 3242 pci_conf_read(sc->sc_pc, sc->sc_tag, SIS_TIM(chp->channel))), 3243 DEBUG_PROBE); 3244 sis_tim = 0; 3245 idedma_ctl = 0; 3246 /* setup DMA if needed */ 3247 pciide_channel_dma_setup(cp); 3248 3249 for (drive = 0; drive < 2; drive++) { 3250 drvp = &chp->ch_drive[drive]; 3251 /* If no drive, skip */ 3252 if ((drvp->drive_flags & DRIVE) == 0) 3253 continue; 3254 /* add timing values, setup DMA if needed */ 3255 if ((drvp->drive_flags & DRIVE_DMA) == 0 && 3256 (drvp->drive_flags & DRIVE_UDMA) == 0) 3257 goto pio; 3258 3259 if (drvp->drive_flags & DRIVE_UDMA) { 3260 /* use Ultra/DMA */ 3261 drvp->drive_flags &= ~DRIVE_DMA; 3262 sis_tim |= sis_udma_tim[drvp->UDMA_mode] << 3263 SIS_TIM_UDMA_TIME_OFF(drive); 3264 sis_tim |= SIS_TIM_UDMA_EN(drive); 3265 } else { 3266 /* 3267 * use Multiword DMA 3268 * Timings will be used for both PIO and DMA, 3269 * so adjust DMA mode if needed 3270 */ 3271 if (drvp->PIO_mode > (drvp->DMA_mode + 2)) 3272 drvp->PIO_mode = drvp->DMA_mode + 2; 3273 if (drvp->DMA_mode + 2 > (drvp->PIO_mode)) 3274 drvp->DMA_mode = (drvp->PIO_mode > 2) ? 3275 drvp->PIO_mode - 2 : 0; 3276 if (drvp->DMA_mode == 0) 3277 drvp->PIO_mode = 0; 3278 } 3279 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 3280 pio: sis_tim |= sis_pio_act[drvp->PIO_mode] << 3281 SIS_TIM_ACT_OFF(drive); 3282 sis_tim |= sis_pio_rec[drvp->PIO_mode] << 3283 SIS_TIM_REC_OFF(drive); 3284 } 3285 WDCDEBUG_PRINT(("sis_setup_channel: new timings reg for " 3286 "channel %d 0x%x\n", chp->channel, sis_tim), DEBUG_PROBE); 3287 pci_conf_write(sc->sc_pc, sc->sc_tag, SIS_TIM(chp->channel), sis_tim); 3288 if (idedma_ctl != 0) { 3289 /* Add software bits in status register */ 3290 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 3291 IDEDMA_CTL+ (IDEDMA_SCH_OFFSET * chp->channel), 3292 idedma_ctl); 3293 } 3294 pciide_print_modes(cp); 3295 } 3296 3297 void 3298 acer_chip_map(sc, pa) 3299 struct pciide_softc *sc; 3300 struct pci_attach_args *pa; 3301 { 3302 struct pciide_channel *cp; 3303 int channel; 3304 pcireg_t cr, interface; 3305 bus_size_t cmdsize, ctlsize; 3306 pcireg_t rev = PCI_REVISION(pa->pa_class); 3307 3308 if (pciide_chipen(sc, pa) == 0) 3309 return; 3310 printf("%s: bus-master DMA support present", 3311 sc->sc_wdcdev.sc_dev.dv_xname); 3312 pciide_mapreg_dma(sc, pa); 3313 printf("\n"); 3314 sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 | 3315 WDC_CAPABILITY_MODE; 3316 if (sc->sc_dma_ok) { 3317 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA; 3318 if (rev >= 0x20) { 3319 sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA; 3320 if (rev >= 0xC4) 3321 sc->sc_wdcdev.UDMA_cap = 5; 3322 else if (rev >= 0xC2) 3323 sc->sc_wdcdev.UDMA_cap = 4; 3324 else 3325 sc->sc_wdcdev.UDMA_cap = 2; 3326 } 3327 sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK; 3328 sc->sc_wdcdev.irqack = pciide_irqack; 3329 } 3330 3331 sc->sc_wdcdev.PIO_cap = 4; 3332 sc->sc_wdcdev.DMA_cap = 2; 3333 sc->sc_wdcdev.set_modes = acer_setup_channel; 3334 sc->sc_wdcdev.channels = sc->wdc_chanarray; 3335 sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS; 3336 3337 pciide_pci_write(sc->sc_pc, sc->sc_tag, ACER_CDRC, 3338 (pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_CDRC) | 3339 ACER_CDRC_DMA_EN) & ~ACER_CDRC_FIFO_DISABLE); 3340 3341 /* Enable "microsoft register bits" R/W. */ 3342 pciide_pci_write(sc->sc_pc, sc->sc_tag, ACER_CCAR3, 3343 pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_CCAR3) | ACER_CCAR3_PI); 3344 pciide_pci_write(sc->sc_pc, sc->sc_tag, ACER_CCAR1, 3345 pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_CCAR1) & 3346 ~(ACER_CHANSTATUS_RO|PCIIDE_CHAN_RO(0)|PCIIDE_CHAN_RO(1))); 3347 pciide_pci_write(sc->sc_pc, sc->sc_tag, ACER_CCAR2, 3348 pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_CCAR2) & 3349 ~ACER_CHANSTATUSREGS_RO); 3350 cr = pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG); 3351 cr |= (PCIIDE_CHANSTATUS_EN << PCI_INTERFACE_SHIFT); 3352 pci_conf_write(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG, cr); 3353 /* Don't use cr, re-read the real register content instead */ 3354 interface = PCI_INTERFACE(pci_conf_read(sc->sc_pc, sc->sc_tag, 3355 PCI_CLASS_REG)); 3356 3357 /* From linux: enable "Cable Detection" */ 3358 if (rev >= 0xC2) { 3359 pciide_pci_write(sc->sc_pc, sc->sc_tag, ACER_0x4B, 3360 pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_0x4B) 3361 | ACER_0x4B_CDETECT); 3362 } 3363 3364 for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) { 3365 cp = &sc->pciide_channels[channel]; 3366 if (pciide_chansetup(sc, channel, interface) == 0) 3367 continue; 3368 if ((interface & PCIIDE_CHAN_EN(channel)) == 0) { 3369 printf("%s: %s channel ignored (disabled)\n", 3370 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 3371 continue; 3372 } 3373 /* newer controllers seems to lack the ACER_CHIDS. Sigh */ 3374 pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize, 3375 (rev >= 0xC2) ? pciide_pci_intr : acer_pci_intr); 3376 if (cp->hw_ok == 0) 3377 continue; 3378 if (pciide_chan_candisable(cp)) { 3379 cr &= ~(PCIIDE_CHAN_EN(channel) << PCI_INTERFACE_SHIFT); 3380 pci_conf_write(sc->sc_pc, sc->sc_tag, 3381 PCI_CLASS_REG, cr); 3382 } 3383 pciide_map_compat_intr(pa, cp, channel, interface); 3384 acer_setup_channel(&cp->wdc_channel); 3385 } 3386 } 3387 3388 void 3389 acer_setup_channel(chp) 3390 struct channel_softc *chp; 3391 { 3392 struct ata_drive_datas *drvp; 3393 int drive; 3394 u_int32_t acer_fifo_udma; 3395 u_int32_t idedma_ctl; 3396 struct pciide_channel *cp = (struct pciide_channel*)chp; 3397 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 3398 3399 idedma_ctl = 0; 3400 acer_fifo_udma = pci_conf_read(sc->sc_pc, sc->sc_tag, ACER_FTH_UDMA); 3401 WDCDEBUG_PRINT(("acer_setup_channel: old fifo/udma reg 0x%x\n", 3402 acer_fifo_udma), DEBUG_PROBE); 3403 /* setup DMA if needed */ 3404 pciide_channel_dma_setup(cp); 3405 3406 if ((chp->ch_drive[0].drive_flags | chp->ch_drive[1].drive_flags) & 3407 DRIVE_UDMA) { /* check 80 pins cable */ 3408 if (pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_0x4A) & 3409 ACER_0x4A_80PIN(chp->channel)) { 3410 if (chp->ch_drive[0].UDMA_mode > 2) 3411 chp->ch_drive[0].UDMA_mode = 2; 3412 if (chp->ch_drive[1].UDMA_mode > 2) 3413 chp->ch_drive[1].UDMA_mode = 2; 3414 } 3415 } 3416 3417 for (drive = 0; drive < 2; drive++) { 3418 drvp = &chp->ch_drive[drive]; 3419 /* If no drive, skip */ 3420 if ((drvp->drive_flags & DRIVE) == 0) 3421 continue; 3422 WDCDEBUG_PRINT(("acer_setup_channel: old timings reg for " 3423 "channel %d drive %d 0x%x\n", chp->channel, drive, 3424 pciide_pci_read(sc->sc_pc, sc->sc_tag, 3425 ACER_IDETIM(chp->channel, drive))), DEBUG_PROBE); 3426 /* clear FIFO/DMA mode */ 3427 acer_fifo_udma &= ~(ACER_FTH_OPL(chp->channel, drive, 0x3) | 3428 ACER_UDMA_EN(chp->channel, drive) | 3429 ACER_UDMA_TIM(chp->channel, drive, 0x7)); 3430 3431 /* add timing values, setup DMA if needed */ 3432 if ((drvp->drive_flags & DRIVE_DMA) == 0 && 3433 (drvp->drive_flags & DRIVE_UDMA) == 0) { 3434 acer_fifo_udma |= 3435 ACER_FTH_OPL(chp->channel, drive, 0x1); 3436 goto pio; 3437 } 3438 3439 acer_fifo_udma |= ACER_FTH_OPL(chp->channel, drive, 0x2); 3440 if (drvp->drive_flags & DRIVE_UDMA) { 3441 /* use Ultra/DMA */ 3442 drvp->drive_flags &= ~DRIVE_DMA; 3443 acer_fifo_udma |= ACER_UDMA_EN(chp->channel, drive); 3444 acer_fifo_udma |= 3445 ACER_UDMA_TIM(chp->channel, drive, 3446 acer_udma[drvp->UDMA_mode]); 3447 /* XXX disable if one drive < UDMA3 ? */ 3448 if (drvp->UDMA_mode >= 3) { 3449 pciide_pci_write(sc->sc_pc, sc->sc_tag, 3450 ACER_0x4B, 3451 pciide_pci_read(sc->sc_pc, sc->sc_tag, 3452 ACER_0x4B) | ACER_0x4B_UDMA66); 3453 } 3454 } else { 3455 /* 3456 * use Multiword DMA 3457 * Timings will be used for both PIO and DMA, 3458 * so adjust DMA mode if needed 3459 */ 3460 if (drvp->PIO_mode > (drvp->DMA_mode + 2)) 3461 drvp->PIO_mode = drvp->DMA_mode + 2; 3462 if (drvp->DMA_mode + 2 > (drvp->PIO_mode)) 3463 drvp->DMA_mode = (drvp->PIO_mode > 2) ? 3464 drvp->PIO_mode - 2 : 0; 3465 if (drvp->DMA_mode == 0) 3466 drvp->PIO_mode = 0; 3467 } 3468 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 3469 pio: pciide_pci_write(sc->sc_pc, sc->sc_tag, 3470 ACER_IDETIM(chp->channel, drive), 3471 acer_pio[drvp->PIO_mode]); 3472 } 3473 WDCDEBUG_PRINT(("acer_setup_channel: new fifo/udma reg 0x%x\n", 3474 acer_fifo_udma), DEBUG_PROBE); 3475 pci_conf_write(sc->sc_pc, sc->sc_tag, ACER_FTH_UDMA, acer_fifo_udma); 3476 if (idedma_ctl != 0) { 3477 /* Add software bits in status register */ 3478 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 3479 IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel), 3480 idedma_ctl); 3481 } 3482 pciide_print_modes(cp); 3483 } 3484 3485 int 3486 acer_pci_intr(arg) 3487 void *arg; 3488 { 3489 struct pciide_softc *sc = arg; 3490 struct pciide_channel *cp; 3491 struct channel_softc *wdc_cp; 3492 int i, rv, crv; 3493 u_int32_t chids; 3494 3495 rv = 0; 3496 chids = pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_CHIDS); 3497 for (i = 0; i < sc->sc_wdcdev.nchannels; i++) { 3498 cp = &sc->pciide_channels[i]; 3499 wdc_cp = &cp->wdc_channel; 3500 /* If a compat channel skip. */ 3501 if (cp->compat) 3502 continue; 3503 if (chids & ACER_CHIDS_INT(i)) { 3504 crv = wdcintr(wdc_cp); 3505 if (crv == 0) 3506 printf("%s:%d: bogus intr\n", 3507 sc->sc_wdcdev.sc_dev.dv_xname, i); 3508 else 3509 rv = 1; 3510 } 3511 } 3512 return rv; 3513 } 3514 3515 void 3516 hpt_chip_map(sc, pa) 3517 struct pciide_softc *sc; 3518 struct pci_attach_args *pa; 3519 { 3520 struct pciide_channel *cp; 3521 int i, compatchan, revision; 3522 pcireg_t interface; 3523 bus_size_t cmdsize, ctlsize; 3524 3525 if (pciide_chipen(sc, pa) == 0) 3526 return; 3527 revision = PCI_REVISION(pa->pa_class); 3528 printf(": Triones/Highpoint "); 3529 if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374) 3530 printf("HPT374 IDE Controller\n"); 3531 else if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372) 3532 printf("HPT372 IDE Controller\n"); 3533 else if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366) { 3534 if (revision == HPT372_REV) 3535 printf("HPT372 IDE Controller\n"); 3536 else if (revision == HPT370_REV) 3537 printf("HPT370 IDE Controller\n"); 3538 else if (revision == HPT370A_REV) 3539 printf("HPT370A IDE Controller\n"); 3540 else if (revision == HPT366_REV) 3541 printf("HPT366 IDE Controller\n"); 3542 else 3543 printf("unknown HPT IDE controller rev %d\n", revision); 3544 } else 3545 printf("unknown HPT IDE controller 0x%x\n", 3546 sc->sc_pp->ide_product); 3547 3548 /* 3549 * when the chip is in native mode it identifies itself as a 3550 * 'misc mass storage'. Fake interface in this case. 3551 */ 3552 if (PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_IDE) { 3553 interface = PCI_INTERFACE(pa->pa_class); 3554 } else { 3555 interface = PCIIDE_INTERFACE_BUS_MASTER_DMA | 3556 PCIIDE_INTERFACE_PCI(0); 3557 if ((sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 && 3558 (revision == HPT370_REV || revision == HPT370A_REV || 3559 revision == HPT372_REV)) || 3560 sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372 || 3561 sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374) 3562 interface |= PCIIDE_INTERFACE_PCI(1); 3563 } 3564 3565 printf("%s: bus-master DMA support present", 3566 sc->sc_wdcdev.sc_dev.dv_xname); 3567 pciide_mapreg_dma(sc, pa); 3568 printf("\n"); 3569 sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 | 3570 WDC_CAPABILITY_MODE; 3571 if (sc->sc_dma_ok) { 3572 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA; 3573 sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK; 3574 sc->sc_wdcdev.irqack = pciide_irqack; 3575 } 3576 sc->sc_wdcdev.PIO_cap = 4; 3577 sc->sc_wdcdev.DMA_cap = 2; 3578 3579 sc->sc_wdcdev.set_modes = hpt_setup_channel; 3580 sc->sc_wdcdev.channels = sc->wdc_chanarray; 3581 if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 && 3582 revision == HPT366_REV) { 3583 sc->sc_wdcdev.UDMA_cap = 4; 3584 /* 3585 * The 366 has 2 PCI IDE functions, one for primary and one 3586 * for secondary. So we need to call pciide_mapregs_compat() 3587 * with the real channel 3588 */ 3589 if (pa->pa_function == 0) { 3590 compatchan = 0; 3591 } else if (pa->pa_function == 1) { 3592 compatchan = 1; 3593 } else { 3594 printf("%s: unexpected PCI function %d\n", 3595 sc->sc_wdcdev.sc_dev.dv_xname, pa->pa_function); 3596 return; 3597 } 3598 sc->sc_wdcdev.nchannels = 1; 3599 } else { 3600 sc->sc_wdcdev.nchannels = 2; 3601 if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374 || 3602 sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372 || 3603 (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 && 3604 revision == HPT372_REV)) 3605 sc->sc_wdcdev.UDMA_cap = 6; 3606 else 3607 sc->sc_wdcdev.UDMA_cap = 5; 3608 } 3609 for (i = 0; i < sc->sc_wdcdev.nchannels; i++) { 3610 cp = &sc->pciide_channels[i]; 3611 if (sc->sc_wdcdev.nchannels > 1) { 3612 compatchan = i; 3613 if((pciide_pci_read(sc->sc_pc, sc->sc_tag, 3614 HPT370_CTRL1(i)) & HPT370_CTRL1_EN) == 0) { 3615 printf("%s: %s channel ignored (disabled)\n", 3616 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 3617 continue; 3618 } 3619 } 3620 if (pciide_chansetup(sc, i, interface) == 0) 3621 continue; 3622 if (interface & PCIIDE_INTERFACE_PCI(i)) { 3623 cp->hw_ok = pciide_mapregs_native(pa, cp, &cmdsize, 3624 &ctlsize, hpt_pci_intr); 3625 } else { 3626 cp->hw_ok = pciide_mapregs_compat(pa, cp, compatchan, 3627 &cmdsize, &ctlsize); 3628 } 3629 if (cp->hw_ok == 0) 3630 return; 3631 cp->wdc_channel.data32iot = cp->wdc_channel.cmd_iot; 3632 cp->wdc_channel.data32ioh = cp->wdc_channel.cmd_ioh; 3633 wdcattach(&cp->wdc_channel); 3634 hpt_setup_channel(&cp->wdc_channel); 3635 } 3636 if ((sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 && 3637 (revision == HPT370_REV || revision == HPT370A_REV || 3638 revision == HPT372_REV)) || 3639 sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372 || 3640 sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374) { 3641 /* 3642 * HPT370_REV and highter has a bit to disable interrupts, 3643 * make sure to clear it 3644 */ 3645 pciide_pci_write(sc->sc_pc, sc->sc_tag, HPT_CSEL, 3646 pciide_pci_read(sc->sc_pc, sc->sc_tag, HPT_CSEL) & 3647 ~HPT_CSEL_IRQDIS); 3648 } 3649 /* set clocks, etc (mandatory on 372/4, optional otherwise) */ 3650 if ((sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 && 3651 revision == HPT372_REV ) || 3652 sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372 || 3653 sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374) 3654 pciide_pci_write(sc->sc_pc, sc->sc_tag, HPT_SC2, 3655 (pciide_pci_read(sc->sc_pc, sc->sc_tag, HPT_SC2) & 3656 HPT_SC2_MAEN) | HPT_SC2_OSC_EN); 3657 return; 3658 } 3659 3660 void 3661 hpt_setup_channel(chp) 3662 struct channel_softc *chp; 3663 { 3664 struct ata_drive_datas *drvp; 3665 int drive; 3666 int cable; 3667 u_int32_t before, after; 3668 u_int32_t idedma_ctl; 3669 struct pciide_channel *cp = (struct pciide_channel*)chp; 3670 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 3671 int revision = 3672 PCI_REVISION(pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG)); 3673 3674 cable = pciide_pci_read(sc->sc_pc, sc->sc_tag, HPT_CSEL); 3675 3676 /* setup DMA if needed */ 3677 pciide_channel_dma_setup(cp); 3678 3679 idedma_ctl = 0; 3680 3681 /* Per drive settings */ 3682 for (drive = 0; drive < 2; drive++) { 3683 drvp = &chp->ch_drive[drive]; 3684 /* If no drive, skip */ 3685 if ((drvp->drive_flags & DRIVE) == 0) 3686 continue; 3687 before = pci_conf_read(sc->sc_pc, sc->sc_tag, 3688 HPT_IDETIM(chp->channel, drive)); 3689 3690 /* add timing values, setup DMA if needed */ 3691 if (drvp->drive_flags & DRIVE_UDMA) { 3692 /* use Ultra/DMA */ 3693 drvp->drive_flags &= ~DRIVE_DMA; 3694 if ((cable & HPT_CSEL_CBLID(chp->channel)) != 0 && 3695 drvp->UDMA_mode > 2) 3696 drvp->UDMA_mode = 2; 3697 switch (sc->sc_pp->ide_product) { 3698 case PCI_PRODUCT_TRIONES_HPT374: 3699 after = hpt374_udma[drvp->UDMA_mode]; 3700 break; 3701 case PCI_PRODUCT_TRIONES_HPT372: 3702 after = hpt372_udma[drvp->UDMA_mode]; 3703 break; 3704 case PCI_PRODUCT_TRIONES_HPT366: 3705 default: 3706 switch(revision) { 3707 case HPT372_REV: 3708 after = hpt372_udma[drvp->UDMA_mode]; 3709 break; 3710 case HPT370_REV: 3711 case HPT370A_REV: 3712 after = hpt370_udma[drvp->UDMA_mode]; 3713 break; 3714 case HPT366_REV: 3715 default: 3716 after = hpt366_udma[drvp->UDMA_mode]; 3717 break; 3718 } 3719 } 3720 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 3721 } else if (drvp->drive_flags & DRIVE_DMA) { 3722 /* 3723 * use Multiword DMA. 3724 * Timings will be used for both PIO and DMA, so adjust 3725 * DMA mode if needed 3726 */ 3727 if (drvp->PIO_mode >= 3 && 3728 (drvp->DMA_mode + 2) > drvp->PIO_mode) { 3729 drvp->DMA_mode = drvp->PIO_mode - 2; 3730 } 3731 switch (sc->sc_pp->ide_product) { 3732 case PCI_PRODUCT_TRIONES_HPT374: 3733 after = hpt374_dma[drvp->DMA_mode]; 3734 break; 3735 case PCI_PRODUCT_TRIONES_HPT372: 3736 after = hpt372_dma[drvp->DMA_mode]; 3737 break; 3738 case PCI_PRODUCT_TRIONES_HPT366: 3739 default: 3740 switch(revision) { 3741 case HPT372_REV: 3742 after = hpt372_dma[drvp->DMA_mode]; 3743 break; 3744 case HPT370_REV: 3745 case HPT370A_REV: 3746 after = hpt370_dma[drvp->DMA_mode]; 3747 break; 3748 case HPT366_REV: 3749 default: 3750 after = hpt366_dma[drvp->DMA_mode]; 3751 break; 3752 } 3753 } 3754 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 3755 } else { 3756 /* PIO only */ 3757 switch (sc->sc_pp->ide_product) { 3758 case PCI_PRODUCT_TRIONES_HPT374: 3759 after = hpt374_pio[drvp->PIO_mode]; 3760 break; 3761 case PCI_PRODUCT_TRIONES_HPT372: 3762 after = hpt372_pio[drvp->PIO_mode]; 3763 break; 3764 case PCI_PRODUCT_TRIONES_HPT366: 3765 default: 3766 switch(revision) { 3767 case HPT372_REV: 3768 after = hpt372_pio[drvp->PIO_mode]; 3769 break; 3770 case HPT370_REV: 3771 case HPT370A_REV: 3772 after = hpt370_pio[drvp->PIO_mode]; 3773 break; 3774 case HPT366_REV: 3775 default: 3776 after = hpt366_pio[drvp->PIO_mode]; 3777 break; 3778 } 3779 } 3780 } 3781 pci_conf_write(sc->sc_pc, sc->sc_tag, 3782 HPT_IDETIM(chp->channel, drive), after); 3783 WDCDEBUG_PRINT(("%s: bus speed register set to 0x%08x " 3784 "(BIOS 0x%08x)\n", drvp->drv_softc->dv_xname, 3785 after, before), DEBUG_PROBE); 3786 } 3787 if (idedma_ctl != 0) { 3788 /* Add software bits in status register */ 3789 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 3790 IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel), 3791 idedma_ctl); 3792 } 3793 pciide_print_modes(cp); 3794 } 3795 3796 int 3797 hpt_pci_intr(arg) 3798 void *arg; 3799 { 3800 struct pciide_softc *sc = arg; 3801 struct pciide_channel *cp; 3802 struct channel_softc *wdc_cp; 3803 int rv = 0; 3804 int dmastat, i, crv; 3805 3806 for (i = 0; i < sc->sc_wdcdev.nchannels; i++) { 3807 dmastat = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, 3808 IDEDMA_CTL + IDEDMA_SCH_OFFSET * i); 3809 if((dmastat & ( IDEDMA_CTL_ACT | IDEDMA_CTL_INTR)) != 3810 IDEDMA_CTL_INTR) 3811 continue; 3812 cp = &sc->pciide_channels[i]; 3813 wdc_cp = &cp->wdc_channel; 3814 crv = wdcintr(wdc_cp); 3815 if (crv == 0) { 3816 printf("%s:%d: bogus intr\n", 3817 sc->sc_wdcdev.sc_dev.dv_xname, i); 3818 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 3819 IDEDMA_CTL + IDEDMA_SCH_OFFSET * i, dmastat); 3820 } else 3821 rv = 1; 3822 } 3823 return rv; 3824 } 3825 3826 3827 /* Macros to test product */ 3828 #define PDC_IS_262(sc) \ 3829 ((sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA66 || \ 3830 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100 || \ 3831 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100X || \ 3832 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100TX2 || \ 3833 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100TX2v2 || \ 3834 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133 || \ 3835 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133TX2 || \ 3836 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_MBULTRA133 || \ 3837 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133TX2v2 || \ 3838 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_FASTTRAK133LITE) 3839 #define PDC_IS_265(sc) \ 3840 ((sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100 || \ 3841 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100X || \ 3842 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100TX2 || \ 3843 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100TX2v2 || \ 3844 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133 || \ 3845 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133TX2 || \ 3846 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_MBULTRA133 || \ 3847 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133TX2v2 || \ 3848 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_FASTTRAK133LITE) 3849 #define PDC_IS_268(sc) \ 3850 ((sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100TX2 || \ 3851 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100TX2v2 || \ 3852 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133 || \ 3853 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133TX2 || \ 3854 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_MBULTRA133 || \ 3855 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133TX2v2 || \ 3856 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_FASTTRAK133LITE) 3857 #define PDC_IS_276(sc) \ 3858 ((sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133 || \ 3859 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133TX2 || \ 3860 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_MBULTRA133 || \ 3861 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133TX2v2 || \ 3862 (sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_FASTTRAK133LITE) 3863 3864 void 3865 pdc202xx_chip_map(sc, pa) 3866 struct pciide_softc *sc; 3867 struct pci_attach_args *pa; 3868 { 3869 struct pciide_channel *cp; 3870 int channel; 3871 pcireg_t interface, st, mode; 3872 bus_size_t cmdsize, ctlsize; 3873 3874 if (!PDC_IS_268(sc)) { 3875 st = pci_conf_read(sc->sc_pc, sc->sc_tag, PDC2xx_STATE); 3876 WDCDEBUG_PRINT(("pdc202xx_setup_chip: controller state 0x%x\n", 3877 st), DEBUG_PROBE); 3878 } 3879 if (pciide_chipen(sc, pa) == 0) 3880 return; 3881 3882 /* turn off RAID mode */ 3883 if (!PDC_IS_268(sc)) 3884 st &= ~PDC2xx_STATE_IDERAID; 3885 3886 /* 3887 * can't rely on the PCI_CLASS_REG content if the chip was in raid 3888 * mode. We have to fake interface 3889 */ 3890 interface = PCIIDE_INTERFACE_SETTABLE(0) | PCIIDE_INTERFACE_SETTABLE(1); 3891 if (PDC_IS_268(sc) || (st & PDC2xx_STATE_NATIVE)) 3892 interface |= PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1); 3893 3894 printf("%s: bus-master DMA support present", 3895 sc->sc_wdcdev.sc_dev.dv_xname); 3896 pciide_mapreg_dma(sc, pa); 3897 printf("\n"); 3898 sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 | 3899 WDC_CAPABILITY_MODE; 3900 if (sc->sc_dma_ok) { 3901 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA; 3902 sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK; 3903 sc->sc_wdcdev.irqack = pciide_irqack; 3904 } 3905 if (PCI_CLASS(pa->pa_class) == PCI_CLASS_MASS_STORAGE && 3906 PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_RAID) 3907 sc->sc_wdcdev.cap |= WDC_CAPABILITY_RAID; 3908 sc->sc_wdcdev.PIO_cap = 4; 3909 sc->sc_wdcdev.DMA_cap = 2; 3910 if (PDC_IS_276(sc)) 3911 sc->sc_wdcdev.UDMA_cap = 6; 3912 else if (PDC_IS_265(sc)) 3913 sc->sc_wdcdev.UDMA_cap = 5; 3914 else if (PDC_IS_262(sc)) 3915 sc->sc_wdcdev.UDMA_cap = 4; 3916 else 3917 sc->sc_wdcdev.UDMA_cap = 2; 3918 sc->sc_wdcdev.set_modes = PDC_IS_268(sc) ? 3919 pdc20268_setup_channel : pdc202xx_setup_channel; 3920 sc->sc_wdcdev.channels = sc->wdc_chanarray; 3921 sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS; 3922 3923 if (!PDC_IS_268(sc)) { 3924 /* setup failsafe defaults */ 3925 mode = 0; 3926 mode = PDC2xx_TIM_SET_PA(mode, pdc2xx_pa[0]); 3927 mode = PDC2xx_TIM_SET_PB(mode, pdc2xx_pb[0]); 3928 mode = PDC2xx_TIM_SET_MB(mode, pdc2xx_dma_mb[0]); 3929 mode = PDC2xx_TIM_SET_MC(mode, pdc2xx_dma_mc[0]); 3930 for (channel = 0; 3931 channel < sc->sc_wdcdev.nchannels; 3932 channel++) { 3933 WDCDEBUG_PRINT(("pdc202xx_setup_chip: channel %d " 3934 "drive 0 initial timings 0x%x, now 0x%x\n", 3935 channel, pci_conf_read(sc->sc_pc, sc->sc_tag, 3936 PDC2xx_TIM(channel, 0)), mode | PDC2xx_TIM_IORDYp), 3937 DEBUG_PROBE); 3938 pci_conf_write(sc->sc_pc, sc->sc_tag, 3939 PDC2xx_TIM(channel, 0), mode | PDC2xx_TIM_IORDYp); 3940 WDCDEBUG_PRINT(("pdc202xx_setup_chip: channel %d " 3941 "drive 1 initial timings 0x%x, now 0x%x\n", 3942 channel, pci_conf_read(sc->sc_pc, sc->sc_tag, 3943 PDC2xx_TIM(channel, 1)), mode), DEBUG_PROBE); 3944 pci_conf_write(sc->sc_pc, sc->sc_tag, 3945 PDC2xx_TIM(channel, 1), mode); 3946 } 3947 3948 mode = PDC2xx_SCR_DMA; 3949 if (PDC_IS_262(sc)) { 3950 mode = PDC2xx_SCR_SET_GEN(mode, PDC262_SCR_GEN_LAT); 3951 } else { 3952 /* the BIOS set it up this way */ 3953 mode = PDC2xx_SCR_SET_GEN(mode, 0x1); 3954 } 3955 mode = PDC2xx_SCR_SET_I2C(mode, 0x3); /* ditto */ 3956 mode = PDC2xx_SCR_SET_POLL(mode, 0x1); /* ditto */ 3957 WDCDEBUG_PRINT(("pdc202xx_setup_chip: initial SCR 0x%x, " 3958 "now 0x%x\n", 3959 bus_space_read_4(sc->sc_dma_iot, sc->sc_dma_ioh, 3960 PDC2xx_SCR), 3961 mode), DEBUG_PROBE); 3962 bus_space_write_4(sc->sc_dma_iot, sc->sc_dma_ioh, 3963 PDC2xx_SCR, mode); 3964 3965 /* controller initial state register is OK even without BIOS */ 3966 /* Set DMA mode to IDE DMA compatibility */ 3967 mode = 3968 bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, PDC2xx_PM); 3969 WDCDEBUG_PRINT(("pdc202xx_setup_chip: primary mode 0x%x", mode), 3970 DEBUG_PROBE); 3971 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, PDC2xx_PM, 3972 mode | 0x1); 3973 mode = 3974 bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, PDC2xx_SM); 3975 WDCDEBUG_PRINT((", secondary mode 0x%x\n", mode ), DEBUG_PROBE); 3976 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, PDC2xx_SM, 3977 mode | 0x1); 3978 } 3979 3980 for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) { 3981 cp = &sc->pciide_channels[channel]; 3982 if (pciide_chansetup(sc, channel, interface) == 0) 3983 continue; 3984 if (!PDC_IS_268(sc) && (st & (PDC_IS_262(sc) ? 3985 PDC262_STATE_EN(channel):PDC246_STATE_EN(channel))) == 0) { 3986 printf("%s: %s channel ignored (disabled)\n", 3987 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 3988 continue; 3989 } 3990 if (PDC_IS_265(sc)) 3991 pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize, 3992 pdc20265_pci_intr); 3993 else 3994 pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize, 3995 pdc202xx_pci_intr); 3996 if (cp->hw_ok == 0) 3997 continue; 3998 if (!PDC_IS_268(sc) && pciide_chan_candisable(cp)) 3999 st &= ~(PDC_IS_262(sc) ? 4000 PDC262_STATE_EN(channel):PDC246_STATE_EN(channel)); 4001 pciide_map_compat_intr(pa, cp, channel, interface); 4002 sc->sc_wdcdev.set_modes(&cp->wdc_channel); 4003 } 4004 if (!PDC_IS_268(sc)) { 4005 WDCDEBUG_PRINT(("pdc202xx_setup_chip: new controller state " 4006 "0x%x\n", st), DEBUG_PROBE); 4007 pci_conf_write(sc->sc_pc, sc->sc_tag, PDC2xx_STATE, st); 4008 } 4009 return; 4010 } 4011 4012 void 4013 pdc202xx_setup_channel(chp) 4014 struct channel_softc *chp; 4015 { 4016 struct ata_drive_datas *drvp; 4017 int drive; 4018 pcireg_t mode, st; 4019 u_int32_t idedma_ctl, scr, atapi; 4020 struct pciide_channel *cp = (struct pciide_channel*)chp; 4021 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 4022 int channel = chp->channel; 4023 4024 /* setup DMA if needed */ 4025 pciide_channel_dma_setup(cp); 4026 4027 idedma_ctl = 0; 4028 WDCDEBUG_PRINT(("pdc202xx_setup_channel %s: scr 0x%x\n", 4029 sc->sc_wdcdev.sc_dev.dv_xname, 4030 bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, PDC262_U66)), 4031 DEBUG_PROBE); 4032 4033 /* Per channel settings */ 4034 if (PDC_IS_262(sc)) { 4035 scr = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, 4036 PDC262_U66); 4037 st = pci_conf_read(sc->sc_pc, sc->sc_tag, PDC2xx_STATE); 4038 /* Trim UDMA mode */ 4039 if ((st & PDC262_STATE_80P(channel)) != 0 || 4040 (chp->ch_drive[0].drive_flags & DRIVE_UDMA && 4041 chp->ch_drive[0].UDMA_mode <= 2) || 4042 (chp->ch_drive[1].drive_flags & DRIVE_UDMA && 4043 chp->ch_drive[1].UDMA_mode <= 2)) { 4044 if (chp->ch_drive[0].UDMA_mode > 2) 4045 chp->ch_drive[0].UDMA_mode = 2; 4046 if (chp->ch_drive[1].UDMA_mode > 2) 4047 chp->ch_drive[1].UDMA_mode = 2; 4048 } 4049 /* Set U66 if needed */ 4050 if ((chp->ch_drive[0].drive_flags & DRIVE_UDMA && 4051 chp->ch_drive[0].UDMA_mode > 2) || 4052 (chp->ch_drive[1].drive_flags & DRIVE_UDMA && 4053 chp->ch_drive[1].UDMA_mode > 2)) 4054 scr |= PDC262_U66_EN(channel); 4055 else 4056 scr &= ~PDC262_U66_EN(channel); 4057 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 4058 PDC262_U66, scr); 4059 WDCDEBUG_PRINT(("pdc202xx_setup_channel %s:%d: ATAPI 0x%x\n", 4060 sc->sc_wdcdev.sc_dev.dv_xname, channel, 4061 bus_space_read_4(sc->sc_dma_iot, sc->sc_dma_ioh, 4062 PDC262_ATAPI(channel))), DEBUG_PROBE); 4063 if (chp->ch_drive[0].drive_flags & DRIVE_ATAPI || 4064 chp->ch_drive[1].drive_flags & DRIVE_ATAPI) { 4065 if (((chp->ch_drive[0].drive_flags & DRIVE_UDMA) && 4066 !(chp->ch_drive[1].drive_flags & DRIVE_UDMA) && 4067 (chp->ch_drive[1].drive_flags & DRIVE_DMA)) || 4068 ((chp->ch_drive[1].drive_flags & DRIVE_UDMA) && 4069 !(chp->ch_drive[0].drive_flags & DRIVE_UDMA) && 4070 (chp->ch_drive[0].drive_flags & DRIVE_DMA))) 4071 atapi = 0; 4072 else 4073 atapi = PDC262_ATAPI_UDMA; 4074 bus_space_write_4(sc->sc_dma_iot, sc->sc_dma_ioh, 4075 PDC262_ATAPI(channel), atapi); 4076 } 4077 } 4078 for (drive = 0; drive < 2; drive++) { 4079 drvp = &chp->ch_drive[drive]; 4080 /* If no drive, skip */ 4081 if ((drvp->drive_flags & DRIVE) == 0) 4082 continue; 4083 mode = 0; 4084 if (drvp->drive_flags & DRIVE_UDMA) { 4085 /* use Ultra/DMA */ 4086 drvp->drive_flags &= ~DRIVE_DMA; 4087 mode = PDC2xx_TIM_SET_MB(mode, 4088 pdc2xx_udma_mb[drvp->UDMA_mode]); 4089 mode = PDC2xx_TIM_SET_MC(mode, 4090 pdc2xx_udma_mc[drvp->UDMA_mode]); 4091 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 4092 } else if (drvp->drive_flags & DRIVE_DMA) { 4093 mode = PDC2xx_TIM_SET_MB(mode, 4094 pdc2xx_dma_mb[drvp->DMA_mode]); 4095 mode = PDC2xx_TIM_SET_MC(mode, 4096 pdc2xx_dma_mc[drvp->DMA_mode]); 4097 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 4098 } else { 4099 mode = PDC2xx_TIM_SET_MB(mode, 4100 pdc2xx_dma_mb[0]); 4101 mode = PDC2xx_TIM_SET_MC(mode, 4102 pdc2xx_dma_mc[0]); 4103 } 4104 mode = PDC2xx_TIM_SET_PA(mode, pdc2xx_pa[drvp->PIO_mode]); 4105 mode = PDC2xx_TIM_SET_PB(mode, pdc2xx_pb[drvp->PIO_mode]); 4106 if (drvp->drive_flags & DRIVE_ATA) 4107 mode |= PDC2xx_TIM_PRE; 4108 mode |= PDC2xx_TIM_SYNC | PDC2xx_TIM_ERRDY; 4109 if (drvp->PIO_mode >= 3) { 4110 mode |= PDC2xx_TIM_IORDY; 4111 if (drive == 0) 4112 mode |= PDC2xx_TIM_IORDYp; 4113 } 4114 WDCDEBUG_PRINT(("pdc202xx_setup_channel: %s:%d:%d " 4115 "timings 0x%x\n", 4116 sc->sc_wdcdev.sc_dev.dv_xname, 4117 chp->channel, drive, mode), DEBUG_PROBE); 4118 pci_conf_write(sc->sc_pc, sc->sc_tag, 4119 PDC2xx_TIM(chp->channel, drive), mode); 4120 } 4121 if (idedma_ctl != 0) { 4122 /* Add software bits in status register */ 4123 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 4124 IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel), 4125 idedma_ctl); 4126 } 4127 pciide_print_modes(cp); 4128 } 4129 4130 void 4131 pdc20268_setup_channel(chp) 4132 struct channel_softc *chp; 4133 { 4134 struct ata_drive_datas *drvp; 4135 int drive; 4136 u_int32_t idedma_ctl; 4137 struct pciide_channel *cp = (struct pciide_channel*)chp; 4138 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 4139 int u100; 4140 4141 /* setup DMA if needed */ 4142 pciide_channel_dma_setup(cp); 4143 4144 idedma_ctl = 0; 4145 4146 /* I don't know what this is for, FreeBSD does it ... */ 4147 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 4148 IDEDMA_CMD + 0x1, 0x0b); 4149 4150 /* 4151 * I don't know what this is for; FreeBSD checks this ... this is not 4152 * cable type detect. 4153 */ 4154 u100 = (bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, 4155 IDEDMA_CMD + 0x3) & 0x04) ? 0 : 1; 4156 4157 for (drive = 0; drive < 2; drive++) { 4158 drvp = &chp->ch_drive[drive]; 4159 /* If no drive, skip */ 4160 if ((drvp->drive_flags & DRIVE) == 0) 4161 continue; 4162 if (drvp->drive_flags & DRIVE_UDMA) { 4163 /* use Ultra/DMA */ 4164 drvp->drive_flags &= ~DRIVE_DMA; 4165 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 4166 if (drvp->UDMA_mode > 2 && u100 == 0) 4167 drvp->UDMA_mode = 2; 4168 } else if (drvp->drive_flags & DRIVE_DMA) { 4169 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 4170 } 4171 } 4172 /* nothing to do to setup modes, the controller snoop SET_FEATURE cmd */ 4173 if (idedma_ctl != 0) { 4174 /* Add software bits in status register */ 4175 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 4176 IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel), 4177 idedma_ctl); 4178 } 4179 pciide_print_modes(cp); 4180 } 4181 4182 int 4183 pdc202xx_pci_intr(arg) 4184 void *arg; 4185 { 4186 struct pciide_softc *sc = arg; 4187 struct pciide_channel *cp; 4188 struct channel_softc *wdc_cp; 4189 int i, rv, crv; 4190 u_int32_t scr; 4191 4192 rv = 0; 4193 scr = bus_space_read_4(sc->sc_dma_iot, sc->sc_dma_ioh, PDC2xx_SCR); 4194 for (i = 0; i < sc->sc_wdcdev.nchannels; i++) { 4195 cp = &sc->pciide_channels[i]; 4196 wdc_cp = &cp->wdc_channel; 4197 /* If a compat channel skip. */ 4198 if (cp->compat) 4199 continue; 4200 if (scr & PDC2xx_SCR_INT(i)) { 4201 crv = wdcintr(wdc_cp); 4202 if (crv == 0) 4203 printf("%s:%d: bogus intr (reg 0x%x)\n", 4204 sc->sc_wdcdev.sc_dev.dv_xname, i, scr); 4205 else 4206 rv = 1; 4207 } 4208 } 4209 return rv; 4210 } 4211 4212 int 4213 pdc20265_pci_intr(arg) 4214 void *arg; 4215 { 4216 struct pciide_softc *sc = arg; 4217 struct pciide_channel *cp; 4218 struct channel_softc *wdc_cp; 4219 int i, rv, crv; 4220 u_int32_t dmastat; 4221 4222 rv = 0; 4223 for (i = 0; i < sc->sc_wdcdev.nchannels; i++) { 4224 cp = &sc->pciide_channels[i]; 4225 wdc_cp = &cp->wdc_channel; 4226 /* If a compat channel skip. */ 4227 if (cp->compat) 4228 continue; 4229 /* 4230 * The Ultra/100 seems to assert PDC2xx_SCR_INT * spuriously, 4231 * however it asserts INT in IDEDMA_CTL even for non-DMA ops. 4232 * So use it instead (requires 2 reg reads instead of 1, 4233 * but we can't do it another way). 4234 */ 4235 dmastat = bus_space_read_1(sc->sc_dma_iot, 4236 sc->sc_dma_ioh, IDEDMA_CTL + IDEDMA_SCH_OFFSET * i); 4237 if((dmastat & IDEDMA_CTL_INTR) == 0) 4238 continue; 4239 crv = wdcintr(wdc_cp); 4240 if (crv == 0) 4241 printf("%s:%d: bogus intr\n", 4242 sc->sc_wdcdev.sc_dev.dv_xname, i); 4243 else 4244 rv = 1; 4245 } 4246 return rv; 4247 } 4248 4249 void 4250 opti_chip_map(sc, pa) 4251 struct pciide_softc *sc; 4252 struct pci_attach_args *pa; 4253 { 4254 struct pciide_channel *cp; 4255 bus_size_t cmdsize, ctlsize; 4256 pcireg_t interface; 4257 u_int8_t init_ctrl; 4258 int channel; 4259 4260 if (pciide_chipen(sc, pa) == 0) 4261 return; 4262 printf("%s: bus-master DMA support present", 4263 sc->sc_wdcdev.sc_dev.dv_xname); 4264 4265 /* 4266 * XXXSCW: 4267 * There seem to be a couple of buggy revisions/implementations 4268 * of the OPTi pciide chipset. This kludge seems to fix one of 4269 * the reported problems (PR/11644) but still fails for the 4270 * other (PR/13151), although the latter may be due to other 4271 * issues too... 4272 */ 4273 if (PCI_REVISION(pa->pa_class) <= 0x12) { 4274 printf(" but disabled due to chip rev. <= 0x12"); 4275 sc->sc_dma_ok = 0; 4276 } else 4277 pciide_mapreg_dma(sc, pa); 4278 4279 printf("\n"); 4280 4281 sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA32 | WDC_CAPABILITY_DATA16 | 4282 WDC_CAPABILITY_MODE; 4283 sc->sc_wdcdev.PIO_cap = 4; 4284 if (sc->sc_dma_ok) { 4285 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK; 4286 sc->sc_wdcdev.irqack = pciide_irqack; 4287 sc->sc_wdcdev.DMA_cap = 2; 4288 } 4289 sc->sc_wdcdev.set_modes = opti_setup_channel; 4290 4291 sc->sc_wdcdev.channels = sc->wdc_chanarray; 4292 sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS; 4293 4294 init_ctrl = pciide_pci_read(sc->sc_pc, sc->sc_tag, 4295 OPTI_REG_INIT_CONTROL); 4296 4297 interface = PCI_INTERFACE(pa->pa_class); 4298 4299 for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) { 4300 cp = &sc->pciide_channels[channel]; 4301 if (pciide_chansetup(sc, channel, interface) == 0) 4302 continue; 4303 if (channel == 1 && 4304 (init_ctrl & OPTI_INIT_CONTROL_CH2_DISABLE) != 0) { 4305 printf("%s: %s channel ignored (disabled)\n", 4306 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 4307 continue; 4308 } 4309 pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize, 4310 pciide_pci_intr); 4311 if (cp->hw_ok == 0) 4312 continue; 4313 pciide_map_compat_intr(pa, cp, channel, interface); 4314 if (cp->hw_ok == 0) 4315 continue; 4316 opti_setup_channel(&cp->wdc_channel); 4317 } 4318 } 4319 4320 void 4321 opti_setup_channel(chp) 4322 struct channel_softc *chp; 4323 { 4324 struct ata_drive_datas *drvp; 4325 struct pciide_channel *cp = (struct pciide_channel*)chp; 4326 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 4327 int drive, spd; 4328 int mode[2]; 4329 u_int8_t rv, mr; 4330 4331 /* 4332 * The `Delay' and `Address Setup Time' fields of the 4333 * Miscellaneous Register are always zero initially. 4334 */ 4335 mr = opti_read_config(chp, OPTI_REG_MISC) & ~OPTI_MISC_INDEX_MASK; 4336 mr &= ~(OPTI_MISC_DELAY_MASK | 4337 OPTI_MISC_ADDR_SETUP_MASK | 4338 OPTI_MISC_INDEX_MASK); 4339 4340 /* Prime the control register before setting timing values */ 4341 opti_write_config(chp, OPTI_REG_CONTROL, OPTI_CONTROL_DISABLE); 4342 4343 /* Determine the clockrate of the PCIbus the chip is attached to */ 4344 spd = (int) opti_read_config(chp, OPTI_REG_STRAP); 4345 spd &= OPTI_STRAP_PCI_SPEED_MASK; 4346 4347 /* setup DMA if needed */ 4348 pciide_channel_dma_setup(cp); 4349 4350 for (drive = 0; drive < 2; drive++) { 4351 drvp = &chp->ch_drive[drive]; 4352 /* If no drive, skip */ 4353 if ((drvp->drive_flags & DRIVE) == 0) { 4354 mode[drive] = -1; 4355 continue; 4356 } 4357 4358 if ((drvp->drive_flags & DRIVE_DMA)) { 4359 /* 4360 * Timings will be used for both PIO and DMA, 4361 * so adjust DMA mode if needed 4362 */ 4363 if (drvp->PIO_mode > (drvp->DMA_mode + 2)) 4364 drvp->PIO_mode = drvp->DMA_mode + 2; 4365 if (drvp->DMA_mode + 2 > (drvp->PIO_mode)) 4366 drvp->DMA_mode = (drvp->PIO_mode > 2) ? 4367 drvp->PIO_mode - 2 : 0; 4368 if (drvp->DMA_mode == 0) 4369 drvp->PIO_mode = 0; 4370 4371 mode[drive] = drvp->DMA_mode + 5; 4372 } else 4373 mode[drive] = drvp->PIO_mode; 4374 4375 if (drive && mode[0] >= 0 && 4376 (opti_tim_as[spd][mode[0]] != opti_tim_as[spd][mode[1]])) { 4377 /* 4378 * Can't have two drives using different values 4379 * for `Address Setup Time'. 4380 * Slow down the faster drive to compensate. 4381 */ 4382 int d = (opti_tim_as[spd][mode[0]] > 4383 opti_tim_as[spd][mode[1]]) ? 0 : 1; 4384 4385 mode[d] = mode[1-d]; 4386 chp->ch_drive[d].PIO_mode = chp->ch_drive[1-d].PIO_mode; 4387 chp->ch_drive[d].DMA_mode = 0; 4388 chp->ch_drive[d].drive_flags &= ~DRIVE_DMA; 4389 } 4390 } 4391 4392 for (drive = 0; drive < 2; drive++) { 4393 int m; 4394 if ((m = mode[drive]) < 0) 4395 continue; 4396 4397 /* Set the Address Setup Time and select appropriate index */ 4398 rv = opti_tim_as[spd][m] << OPTI_MISC_ADDR_SETUP_SHIFT; 4399 rv |= OPTI_MISC_INDEX(drive); 4400 opti_write_config(chp, OPTI_REG_MISC, mr | rv); 4401 4402 /* Set the pulse width and recovery timing parameters */ 4403 rv = opti_tim_cp[spd][m] << OPTI_PULSE_WIDTH_SHIFT; 4404 rv |= opti_tim_rt[spd][m] << OPTI_RECOVERY_TIME_SHIFT; 4405 opti_write_config(chp, OPTI_REG_READ_CYCLE_TIMING, rv); 4406 opti_write_config(chp, OPTI_REG_WRITE_CYCLE_TIMING, rv); 4407 4408 /* Set the Enhanced Mode register appropriately */ 4409 rv = pciide_pci_read(sc->sc_pc, sc->sc_tag, OPTI_REG_ENH_MODE); 4410 rv &= ~OPTI_ENH_MODE_MASK(chp->channel, drive); 4411 rv |= OPTI_ENH_MODE(chp->channel, drive, opti_tim_em[m]); 4412 pciide_pci_write(sc->sc_pc, sc->sc_tag, OPTI_REG_ENH_MODE, rv); 4413 } 4414 4415 /* Finally, enable the timings */ 4416 opti_write_config(chp, OPTI_REG_CONTROL, OPTI_CONTROL_ENABLE); 4417 4418 pciide_print_modes(cp); 4419 } 4420 4421 #define ACARD_IS_850(sc) \ 4422 ((sc)->sc_pp->ide_product == PCI_PRODUCT_ACARD_ATP850U) 4423 4424 void 4425 acard_chip_map(sc, pa) 4426 struct pciide_softc *sc; 4427 struct pci_attach_args *pa; 4428 { 4429 struct pciide_channel *cp; 4430 int i; 4431 pcireg_t interface; 4432 bus_size_t cmdsize, ctlsize; 4433 4434 if (pciide_chipen(sc, pa) == 0) 4435 return; 4436 4437 /* 4438 * when the chip is in native mode it identifies itself as a 4439 * 'misc mass storage'. Fake interface in this case. 4440 */ 4441 if (PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_IDE) { 4442 interface = PCI_INTERFACE(pa->pa_class); 4443 } else { 4444 interface = PCIIDE_INTERFACE_BUS_MASTER_DMA | 4445 PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1); 4446 } 4447 4448 printf("%s: bus-master DMA support present", 4449 sc->sc_wdcdev.sc_dev.dv_xname); 4450 pciide_mapreg_dma(sc, pa); 4451 printf("\n"); 4452 sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 | 4453 WDC_CAPABILITY_MODE; 4454 4455 if (sc->sc_dma_ok) { 4456 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA; 4457 sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK; 4458 sc->sc_wdcdev.irqack = pciide_irqack; 4459 } 4460 sc->sc_wdcdev.PIO_cap = 4; 4461 sc->sc_wdcdev.DMA_cap = 2; 4462 sc->sc_wdcdev.UDMA_cap = ACARD_IS_850(sc) ? 2 : 4; 4463 4464 sc->sc_wdcdev.set_modes = acard_setup_channel; 4465 sc->sc_wdcdev.channels = sc->wdc_chanarray; 4466 sc->sc_wdcdev.nchannels = 2; 4467 4468 for (i = 0; i < sc->sc_wdcdev.nchannels; i++) { 4469 cp = &sc->pciide_channels[i]; 4470 if (pciide_chansetup(sc, i, interface) == 0) 4471 continue; 4472 if (interface & PCIIDE_INTERFACE_PCI(i)) { 4473 cp->hw_ok = pciide_mapregs_native(pa, cp, &cmdsize, 4474 &ctlsize, pciide_pci_intr); 4475 } else { 4476 cp->hw_ok = pciide_mapregs_compat(pa, cp, i, 4477 &cmdsize, &ctlsize); 4478 } 4479 if (cp->hw_ok == 0) 4480 return; 4481 cp->wdc_channel.data32iot = cp->wdc_channel.cmd_iot; 4482 cp->wdc_channel.data32ioh = cp->wdc_channel.cmd_ioh; 4483 wdcattach(&cp->wdc_channel); 4484 acard_setup_channel(&cp->wdc_channel); 4485 } 4486 if (!ACARD_IS_850(sc)) { 4487 u_int32_t reg; 4488 reg = pci_conf_read(sc->sc_pc, sc->sc_tag, ATP8x0_CTRL); 4489 reg &= ~ATP860_CTRL_INT; 4490 pci_conf_write(sc->sc_pc, sc->sc_tag, ATP8x0_CTRL, reg); 4491 } 4492 } 4493 4494 void 4495 acard_setup_channel(chp) 4496 struct channel_softc *chp; 4497 { 4498 struct ata_drive_datas *drvp; 4499 struct pciide_channel *cp = (struct pciide_channel*)chp; 4500 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 4501 int channel = chp->channel; 4502 int drive; 4503 u_int32_t idetime, udma_mode; 4504 u_int32_t idedma_ctl; 4505 4506 /* setup DMA if needed */ 4507 pciide_channel_dma_setup(cp); 4508 4509 if (ACARD_IS_850(sc)) { 4510 idetime = 0; 4511 udma_mode = pci_conf_read(sc->sc_pc, sc->sc_tag, ATP850_UDMA); 4512 udma_mode &= ~ATP850_UDMA_MASK(channel); 4513 } else { 4514 idetime = pci_conf_read(sc->sc_pc, sc->sc_tag, ATP860_IDETIME); 4515 idetime &= ~ATP860_SETTIME_MASK(channel); 4516 udma_mode = pci_conf_read(sc->sc_pc, sc->sc_tag, ATP860_UDMA); 4517 udma_mode &= ~ATP860_UDMA_MASK(channel); 4518 4519 /* check 80 pins cable */ 4520 if ((chp->ch_drive[0].drive_flags & DRIVE_UDMA) || 4521 (chp->ch_drive[1].drive_flags & DRIVE_UDMA)) { 4522 if (pci_conf_read(sc->sc_pc, sc->sc_tag, ATP8x0_CTRL) 4523 & ATP860_CTRL_80P(chp->channel)) { 4524 if (chp->ch_drive[0].UDMA_mode > 2) 4525 chp->ch_drive[0].UDMA_mode = 2; 4526 if (chp->ch_drive[1].UDMA_mode > 2) 4527 chp->ch_drive[1].UDMA_mode = 2; 4528 } 4529 } 4530 } 4531 4532 idedma_ctl = 0; 4533 4534 /* Per drive settings */ 4535 for (drive = 0; drive < 2; drive++) { 4536 drvp = &chp->ch_drive[drive]; 4537 /* If no drive, skip */ 4538 if ((drvp->drive_flags & DRIVE) == 0) 4539 continue; 4540 /* add timing values, setup DMA if needed */ 4541 if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) && 4542 (drvp->drive_flags & DRIVE_UDMA)) { 4543 /* use Ultra/DMA */ 4544 if (ACARD_IS_850(sc)) { 4545 idetime |= ATP850_SETTIME(drive, 4546 acard_act_udma[drvp->UDMA_mode], 4547 acard_rec_udma[drvp->UDMA_mode]); 4548 udma_mode |= ATP850_UDMA_MODE(channel, drive, 4549 acard_udma_conf[drvp->UDMA_mode]); 4550 } else { 4551 idetime |= ATP860_SETTIME(channel, drive, 4552 acard_act_udma[drvp->UDMA_mode], 4553 acard_rec_udma[drvp->UDMA_mode]); 4554 udma_mode |= ATP860_UDMA_MODE(channel, drive, 4555 acard_udma_conf[drvp->UDMA_mode]); 4556 } 4557 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 4558 } else if ((chp->wdc->cap & WDC_CAPABILITY_DMA) && 4559 (drvp->drive_flags & DRIVE_DMA)) { 4560 /* use Multiword DMA */ 4561 drvp->drive_flags &= ~DRIVE_UDMA; 4562 if (ACARD_IS_850(sc)) { 4563 idetime |= ATP850_SETTIME(drive, 4564 acard_act_dma[drvp->DMA_mode], 4565 acard_rec_dma[drvp->DMA_mode]); 4566 } else { 4567 idetime |= ATP860_SETTIME(channel, drive, 4568 acard_act_dma[drvp->DMA_mode], 4569 acard_rec_dma[drvp->DMA_mode]); 4570 } 4571 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 4572 } else { 4573 /* PIO only */ 4574 drvp->drive_flags &= ~(DRIVE_UDMA | DRIVE_DMA); 4575 if (ACARD_IS_850(sc)) { 4576 idetime |= ATP850_SETTIME(drive, 4577 acard_act_pio[drvp->PIO_mode], 4578 acard_rec_pio[drvp->PIO_mode]); 4579 } else { 4580 idetime |= ATP860_SETTIME(channel, drive, 4581 acard_act_pio[drvp->PIO_mode], 4582 acard_rec_pio[drvp->PIO_mode]); 4583 } 4584 pci_conf_write(sc->sc_pc, sc->sc_tag, ATP8x0_CTRL, 4585 pci_conf_read(sc->sc_pc, sc->sc_tag, ATP8x0_CTRL) 4586 | ATP8x0_CTRL_EN(channel)); 4587 } 4588 } 4589 4590 if (idedma_ctl != 0) { 4591 /* Add software bits in status register */ 4592 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 4593 IDEDMA_CTL + IDEDMA_SCH_OFFSET * channel, idedma_ctl); 4594 } 4595 pciide_print_modes(cp); 4596 4597 if (ACARD_IS_850(sc)) { 4598 pci_conf_write(sc->sc_pc, sc->sc_tag, 4599 ATP850_IDETIME(channel), idetime); 4600 pci_conf_write(sc->sc_pc, sc->sc_tag, ATP850_UDMA, udma_mode); 4601 } else { 4602 pci_conf_write(sc->sc_pc, sc->sc_tag, ATP860_IDETIME, idetime); 4603 pci_conf_write(sc->sc_pc, sc->sc_tag, ATP860_UDMA, udma_mode); 4604 } 4605 } 4606 4607 int 4608 acard_pci_intr(arg) 4609 void *arg; 4610 { 4611 struct pciide_softc *sc = arg; 4612 struct pciide_channel *cp; 4613 struct channel_softc *wdc_cp; 4614 int rv = 0; 4615 int dmastat, i, crv; 4616 4617 for (i = 0; i < sc->sc_wdcdev.nchannels; i++) { 4618 dmastat = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, 4619 IDEDMA_CTL + IDEDMA_SCH_OFFSET * i); 4620 if ((dmastat & IDEDMA_CTL_INTR) == 0) 4621 continue; 4622 cp = &sc->pciide_channels[i]; 4623 wdc_cp = &cp->wdc_channel; 4624 if ((wdc_cp->ch_flags & WDCF_IRQ_WAIT) == 0) { 4625 (void)wdcintr(wdc_cp); 4626 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 4627 IDEDMA_CTL + IDEDMA_SCH_OFFSET * i, dmastat); 4628 continue; 4629 } 4630 crv = wdcintr(wdc_cp); 4631 if (crv == 0) 4632 printf("%s:%d: bogus intr\n", 4633 sc->sc_wdcdev.sc_dev.dv_xname, i); 4634 else if (crv == 1) 4635 rv = 1; 4636 else if (rv == 0) 4637 rv = crv; 4638 } 4639 return rv; 4640 } 4641 4642 static int 4643 sl82c105_bugchk(struct pci_attach_args *pa) 4644 { 4645 4646 if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_WINBOND || 4647 PCI_PRODUCT(pa->pa_id) != PCI_PRODUCT_WINBOND_W83C553F_0) 4648 return (0); 4649 4650 if (PCI_REVISION(pa->pa_class) <= 0x05) 4651 return (1); 4652 4653 return (0); 4654 } 4655 4656 void 4657 sl82c105_chip_map(sc, pa) 4658 struct pciide_softc *sc; 4659 struct pci_attach_args *pa; 4660 { 4661 struct pciide_channel *cp; 4662 bus_size_t cmdsize, ctlsize; 4663 pcireg_t interface, idecr; 4664 int channel; 4665 4666 if (pciide_chipen(sc, pa) == 0) 4667 return; 4668 4669 printf("%s: bus-master DMA support present", 4670 sc->sc_wdcdev.sc_dev.dv_xname); 4671 4672 /* 4673 * Check to see if we're part of the Winbond 83c553 Southbridge. 4674 * If so, we need to disable DMA on rev. <= 5 of that chip. 4675 */ 4676 if (pci_find_device(pa, sl82c105_bugchk)) { 4677 printf(" but disabled due to 83c553 rev. <= 0x05"); 4678 sc->sc_dma_ok = 0; 4679 } else 4680 pciide_mapreg_dma(sc, pa); 4681 printf("\n"); 4682 4683 sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA32 | WDC_CAPABILITY_DATA16 | 4684 WDC_CAPABILITY_MODE; 4685 sc->sc_wdcdev.PIO_cap = 4; 4686 if (sc->sc_dma_ok) { 4687 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK; 4688 sc->sc_wdcdev.irqack = pciide_irqack; 4689 sc->sc_wdcdev.DMA_cap = 2; 4690 } 4691 sc->sc_wdcdev.set_modes = sl82c105_setup_channel; 4692 4693 sc->sc_wdcdev.channels = sc->wdc_chanarray; 4694 sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS; 4695 4696 idecr = pci_conf_read(sc->sc_pc, sc->sc_tag, SYMPH_IDECSR); 4697 4698 interface = PCI_INTERFACE(pa->pa_class); 4699 4700 for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) { 4701 cp = &sc->pciide_channels[channel]; 4702 if (pciide_chansetup(sc, channel, interface) == 0) 4703 continue; 4704 if ((channel == 0 && (idecr & IDECR_P0EN) == 0) || 4705 (channel == 1 && (idecr & IDECR_P1EN) == 0)) { 4706 printf("%s: %s channel ignored (disabled)\n", 4707 sc->sc_wdcdev.sc_dev.dv_xname, cp->name); 4708 continue; 4709 } 4710 pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize, 4711 pciide_pci_intr); 4712 if (cp->hw_ok == 0) 4713 continue; 4714 pciide_map_compat_intr(pa, cp, channel, interface); 4715 if (cp->hw_ok == 0) 4716 continue; 4717 sl82c105_setup_channel(&cp->wdc_channel); 4718 } 4719 } 4720 4721 void 4722 sl82c105_setup_channel(chp) 4723 struct channel_softc *chp; 4724 { 4725 struct ata_drive_datas *drvp; 4726 struct pciide_channel *cp = (struct pciide_channel*)chp; 4727 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 4728 int pxdx_reg, drive; 4729 pcireg_t pxdx; 4730 4731 /* Set up DMA if needed. */ 4732 pciide_channel_dma_setup(cp); 4733 4734 for (drive = 0; drive < 2; drive++) { 4735 pxdx_reg = ((chp->channel == 0) ? SYMPH_P0D0CR 4736 : SYMPH_P1D0CR) + (drive * 4); 4737 4738 pxdx = pci_conf_read(sc->sc_pc, sc->sc_tag, pxdx_reg); 4739 4740 pxdx &= ~(PxDx_CMD_ON_MASK|PxDx_CMD_OFF_MASK); 4741 pxdx &= ~(PxDx_PWEN|PxDx_RDYEN|PxDx_RAEN); 4742 4743 drvp = &chp->ch_drive[drive]; 4744 /* If no drive, skip. */ 4745 if ((drvp->drive_flags & DRIVE) == 0) { 4746 pci_conf_write(sc->sc_pc, sc->sc_tag, pxdx_reg, pxdx); 4747 continue; 4748 } 4749 4750 if (drvp->drive_flags & DRIVE_DMA) { 4751 /* 4752 * Timings will be used for both PIO and DMA, 4753 * so adjust DMA mode if needed. 4754 */ 4755 if (drvp->PIO_mode >= 3) { 4756 if ((drvp->DMA_mode + 2) > drvp->PIO_mode) 4757 drvp->DMA_mode = drvp->PIO_mode - 2; 4758 if (drvp->DMA_mode < 1) { 4759 /* 4760 * Can't mix both PIO and DMA. 4761 * Disable DMA. 4762 */ 4763 drvp->drive_flags &= ~DRIVE_DMA; 4764 } 4765 } else { 4766 /* 4767 * Can't mix both PIO and DMA. Disable 4768 * DMA. 4769 */ 4770 drvp->drive_flags &= ~DRIVE_DMA; 4771 } 4772 } 4773 4774 if (drvp->drive_flags & DRIVE_DMA) { 4775 /* Use multi-word DMA. */ 4776 pxdx |= symph_mw_dma_times[drvp->DMA_mode].cmd_on << 4777 PxDx_CMD_ON_SHIFT; 4778 pxdx |= symph_mw_dma_times[drvp->DMA_mode].cmd_off; 4779 } else { 4780 pxdx |= symph_pio_times[drvp->PIO_mode].cmd_on << 4781 PxDx_CMD_ON_SHIFT; 4782 pxdx |= symph_pio_times[drvp->PIO_mode].cmd_off; 4783 } 4784 4785 /* XXX PxDx_PWEN? PxDx_RDYEN? PxDx_RAEN? */ 4786 4787 /* ...and set the mode for this drive. */ 4788 pci_conf_write(sc->sc_pc, sc->sc_tag, pxdx_reg, pxdx); 4789 } 4790 4791 pciide_print_modes(cp); 4792 } 4793 4794 void 4795 serverworks_chip_map(sc, pa) 4796 struct pciide_softc *sc; 4797 struct pci_attach_args *pa; 4798 { 4799 struct pciide_channel *cp; 4800 pcireg_t interface = PCI_INTERFACE(pa->pa_class); 4801 pcitag_t pcib_tag; 4802 int channel; 4803 bus_size_t cmdsize, ctlsize; 4804 4805 if (pciide_chipen(sc, pa) == 0) 4806 return; 4807 4808 printf("%s: bus-master DMA support present", 4809 sc->sc_wdcdev.sc_dev.dv_xname); 4810 pciide_mapreg_dma(sc, pa); 4811 printf("\n"); 4812 sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 | 4813 WDC_CAPABILITY_MODE; 4814 4815 if (sc->sc_dma_ok) { 4816 sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA; 4817 sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK; 4818 sc->sc_wdcdev.irqack = pciide_irqack; 4819 } 4820 sc->sc_wdcdev.PIO_cap = 4; 4821 sc->sc_wdcdev.DMA_cap = 2; 4822 switch (sc->sc_pp->ide_product) { 4823 case PCI_PRODUCT_SERVERWORKS_OSB4_IDE: 4824 sc->sc_wdcdev.UDMA_cap = 2; 4825 break; 4826 case PCI_PRODUCT_SERVERWORKS_CSB5_IDE: 4827 if (PCI_REVISION(pa->pa_class) < 0x92) 4828 sc->sc_wdcdev.UDMA_cap = 4; 4829 else 4830 sc->sc_wdcdev.UDMA_cap = 5; 4831 break; 4832 } 4833 4834 sc->sc_wdcdev.set_modes = serverworks_setup_channel; 4835 sc->sc_wdcdev.channels = sc->wdc_chanarray; 4836 sc->sc_wdcdev.nchannels = 2; 4837 4838 for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) { 4839 cp = &sc->pciide_channels[channel]; 4840 if (pciide_chansetup(sc, channel, interface) == 0) 4841 continue; 4842 pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize, 4843 serverworks_pci_intr); 4844 if (cp->hw_ok == 0) 4845 return; 4846 pciide_map_compat_intr(pa, cp, channel, interface); 4847 if (cp->hw_ok == 0) 4848 return; 4849 serverworks_setup_channel(&cp->wdc_channel); 4850 } 4851 4852 pcib_tag = pci_make_tag(pa->pa_pc, pa->pa_bus, pa->pa_device, 0); 4853 pci_conf_write(pa->pa_pc, pcib_tag, 0x64, 4854 (pci_conf_read(pa->pa_pc, pcib_tag, 0x64) & ~0x2000) | 0x4000); 4855 } 4856 4857 void 4858 serverworks_setup_channel(chp) 4859 struct channel_softc *chp; 4860 { 4861 struct ata_drive_datas *drvp; 4862 struct pciide_channel *cp = (struct pciide_channel*)chp; 4863 struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; 4864 int channel = chp->channel; 4865 int drive, unit; 4866 u_int32_t pio_time, dma_time, pio_mode, udma_mode; 4867 u_int32_t idedma_ctl; 4868 static const u_int8_t pio_modes[5] = {0x5d, 0x47, 0x34, 0x22, 0x20}; 4869 static const u_int8_t dma_modes[3] = {0x77, 0x21, 0x20}; 4870 4871 /* setup DMA if needed */ 4872 pciide_channel_dma_setup(cp); 4873 4874 pio_time = pci_conf_read(sc->sc_pc, sc->sc_tag, 0x40); 4875 dma_time = pci_conf_read(sc->sc_pc, sc->sc_tag, 0x44); 4876 pio_mode = pci_conf_read(sc->sc_pc, sc->sc_tag, 0x48); 4877 udma_mode = pci_conf_read(sc->sc_pc, sc->sc_tag, 0x54); 4878 4879 pio_time &= ~(0xffff << (16 * channel)); 4880 dma_time &= ~(0xffff << (16 * channel)); 4881 pio_mode &= ~(0xff << (8 * channel + 16)); 4882 udma_mode &= ~(0xff << (8 * channel + 16)); 4883 udma_mode &= ~(3 << (2 * channel)); 4884 4885 idedma_ctl = 0; 4886 4887 /* Per drive settings */ 4888 for (drive = 0; drive < 2; drive++) { 4889 drvp = &chp->ch_drive[drive]; 4890 /* If no drive, skip */ 4891 if ((drvp->drive_flags & DRIVE) == 0) 4892 continue; 4893 unit = drive + 2 * channel; 4894 /* add timing values, setup DMA if needed */ 4895 pio_time |= pio_modes[drvp->PIO_mode] << (8 * (unit^1)); 4896 pio_mode |= drvp->PIO_mode << (4 * unit + 16); 4897 if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) && 4898 (drvp->drive_flags & DRIVE_UDMA)) { 4899 /* use Ultra/DMA, check for 80-pin cable */ 4900 if (drvp->UDMA_mode > 2 && 4901 (PCI_PRODUCT(pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_SUBSYS_ID_REG)) & (1 << (14 + channel))) == 0) 4902 drvp->UDMA_mode = 2; 4903 dma_time |= dma_modes[drvp->DMA_mode] << (8 * (unit^1)); 4904 udma_mode |= drvp->UDMA_mode << (4 * unit + 16); 4905 udma_mode |= 1 << unit; 4906 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 4907 } else if ((chp->wdc->cap & WDC_CAPABILITY_DMA) && 4908 (drvp->drive_flags & DRIVE_DMA)) { 4909 /* use Multiword DMA */ 4910 drvp->drive_flags &= ~DRIVE_UDMA; 4911 dma_time |= dma_modes[drvp->DMA_mode] << (8 * (unit^1)); 4912 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 4913 } else { 4914 /* PIO only */ 4915 drvp->drive_flags &= ~(DRIVE_UDMA | DRIVE_DMA); 4916 } 4917 } 4918 4919 pci_conf_write(sc->sc_pc, sc->sc_tag, 0x40, pio_time); 4920 pci_conf_write(sc->sc_pc, sc->sc_tag, 0x44, dma_time); 4921 if (sc->sc_pp->ide_product != PCI_PRODUCT_SERVERWORKS_OSB4_IDE) 4922 pci_conf_write(sc->sc_pc, sc->sc_tag, 0x48, pio_mode); 4923 pci_conf_write(sc->sc_pc, sc->sc_tag, 0x54, udma_mode); 4924 4925 if (idedma_ctl != 0) { 4926 /* Add software bits in status register */ 4927 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 4928 IDEDMA_CTL + IDEDMA_SCH_OFFSET * channel, idedma_ctl); 4929 } 4930 pciide_print_modes(cp); 4931 } 4932 4933 int 4934 serverworks_pci_intr(arg) 4935 void *arg; 4936 { 4937 struct pciide_softc *sc = arg; 4938 struct pciide_channel *cp; 4939 struct channel_softc *wdc_cp; 4940 int rv = 0; 4941 int dmastat, i, crv; 4942 4943 for (i = 0; i < sc->sc_wdcdev.nchannels; i++) { 4944 dmastat = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, 4945 IDEDMA_CTL + IDEDMA_SCH_OFFSET * i); 4946 if ((dmastat & (IDEDMA_CTL_ACT | IDEDMA_CTL_INTR)) != 4947 IDEDMA_CTL_INTR) 4948 continue; 4949 cp = &sc->pciide_channels[i]; 4950 wdc_cp = &cp->wdc_channel; 4951 crv = wdcintr(wdc_cp); 4952 if (crv == 0) { 4953 printf("%s:%d: bogus intr\n", 4954 sc->sc_wdcdev.sc_dev.dv_xname, i); 4955 bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, 4956 IDEDMA_CTL + IDEDMA_SCH_OFFSET * i, dmastat); 4957 } else 4958 rv = 1; 4959 } 4960 return rv; 4961 } 4962