1 /* $NetBSD: viaide.c,v 1.53 2008/03/18 20:46:37 cube Exp $ */ 2 3 /* 4 * Copyright (c) 1999, 2000, 2001 Manuel Bouyer. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. All advertising materials mentioning features or use of this software 15 * must display the following acknowledgement: 16 * This product includes software developed by Manuel Bouyer. 17 * 4. The name of the author may not be used to endorse or promote products 18 * derived from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 * 31 */ 32 33 #include <sys/cdefs.h> 34 __KERNEL_RCSID(0, "$NetBSD: viaide.c,v 1.53 2008/03/18 20:46:37 cube Exp $"); 35 36 #include <sys/param.h> 37 #include <sys/systm.h> 38 39 #include <dev/pci/pcivar.h> 40 #include <dev/pci/pcidevs.h> 41 #include <dev/pci/pciidereg.h> 42 #include <dev/pci/pciidevar.h> 43 #include <dev/pci/pciide_apollo_reg.h> 44 45 static int via_pcib_match(struct pci_attach_args *); 46 static void via_chip_map(struct pciide_softc *, struct pci_attach_args *); 47 static void via_mapchan(struct pci_attach_args *, struct pciide_channel *, 48 pcireg_t, bus_size_t *, bus_size_t *, int (*)(void *)); 49 static void vt8231_mapregs_native(struct pci_attach_args *, 50 struct pciide_channel *, bus_size_t *, bus_size_t *, 51 int (*)(void *)); 52 static int via_sata_chip_map_common(struct pciide_softc *, 53 struct pci_attach_args *); 54 static void via_sata_chip_map(struct pciide_softc *, 55 struct pci_attach_args *, int); 56 static void via_sata_chip_map_0(struct pciide_softc *, 57 struct pci_attach_args *); 58 static void via_sata_chip_map_6(struct pciide_softc *, 59 struct pci_attach_args *); 60 static void via_sata_chip_map_7(struct pciide_softc *, 61 struct pci_attach_args *); 62 static void via_sata_chip_map_new(struct pciide_softc *, 63 struct pci_attach_args *); 64 static void via_setup_channel(struct ata_channel *); 65 66 static int viaide_match(device_t, cfdata_t, void *); 67 static void viaide_attach(device_t, device_t, void *); 68 static const struct pciide_product_desc * 69 viaide_lookup(pcireg_t); 70 static bool viaide_suspend(device_t PMF_FN_PROTO); 71 static bool viaide_resume(device_t PMF_FN_PROTO); 72 73 CFATTACH_DECL_NEW(viaide, sizeof(struct pciide_softc), 74 viaide_match, viaide_attach, NULL, NULL); 75 76 static const struct pciide_product_desc pciide_amd_products[] = { 77 { PCI_PRODUCT_AMD_PBC756_IDE, 78 0, 79 "Advanced Micro Devices AMD756 IDE Controller", 80 via_chip_map 81 }, 82 { PCI_PRODUCT_AMD_PBC766_IDE, 83 0, 84 "Advanced Micro Devices AMD766 IDE Controller", 85 via_chip_map 86 }, 87 { PCI_PRODUCT_AMD_PBC768_IDE, 88 0, 89 "Advanced Micro Devices AMD768 IDE Controller", 90 via_chip_map 91 }, 92 { PCI_PRODUCT_AMD_PBC8111_IDE, 93 0, 94 "Advanced Micro Devices AMD8111 IDE Controller", 95 via_chip_map 96 }, 97 { PCI_PRODUCT_AMD_CS5536_IDE, 98 0, 99 "Advanced Micro Devices CS5536 IDE Controller", 100 via_chip_map 101 }, 102 { 0, 103 0, 104 NULL, 105 NULL 106 } 107 }; 108 109 static const struct pciide_product_desc pciide_nvidia_products[] = { 110 { PCI_PRODUCT_NVIDIA_NFORCE_ATA100, 111 0, 112 "NVIDIA nForce IDE Controller", 113 via_chip_map 114 }, 115 { PCI_PRODUCT_NVIDIA_NFORCE2_ATA133, 116 0, 117 "NVIDIA nForce2 IDE Controller", 118 via_chip_map 119 }, 120 { PCI_PRODUCT_NVIDIA_NFORCE2_400_ATA133, 121 0, 122 "NVIDIA nForce2 Ultra 400 IDE Controller", 123 via_chip_map 124 }, 125 { PCI_PRODUCT_NVIDIA_NFORCE2_400_SATA, 126 0, 127 "NVIDIA nForce2 Ultra 400 Serial ATA Controller", 128 via_sata_chip_map_6 129 }, 130 { PCI_PRODUCT_NVIDIA_NFORCE3_ATA133, 131 0, 132 "NVIDIA nForce3 IDE Controller", 133 via_chip_map 134 }, 135 { PCI_PRODUCT_NVIDIA_NFORCE3_250_ATA133, 136 0, 137 "NVIDIA nForce3 250 IDE Controller", 138 via_chip_map 139 }, 140 { PCI_PRODUCT_NVIDIA_NFORCE3_250_SATA, 141 0, 142 "NVIDIA nForce3 250 Serial ATA Controller", 143 via_sata_chip_map_6 144 }, 145 { PCI_PRODUCT_NVIDIA_NFORCE3_250_SATA2, 146 0, 147 "NVIDIA nForce3 250 Serial ATA Controller", 148 via_sata_chip_map_6 149 }, 150 { PCI_PRODUCT_NVIDIA_NFORCE4_ATA133, 151 0, 152 "NVIDIA nForce4 IDE Controller", 153 via_chip_map 154 }, 155 { PCI_PRODUCT_NVIDIA_NFORCE4_SATA1, 156 0, 157 "NVIDIA nForce4 Serial ATA Controller", 158 via_sata_chip_map_6 159 }, 160 { PCI_PRODUCT_NVIDIA_NFORCE4_SATA2, 161 0, 162 "NVIDIA nForce4 Serial ATA Controller", 163 via_sata_chip_map_6 164 }, 165 { PCI_PRODUCT_NVIDIA_NFORCE430_ATA133, 166 0, 167 "NVIDIA nForce430 IDE Controller", 168 via_chip_map 169 }, 170 { PCI_PRODUCT_NVIDIA_NFORCE430_SATA1, 171 0, 172 "NVIDIA nForce430 Serial ATA Controller", 173 via_sata_chip_map_6 174 }, 175 { PCI_PRODUCT_NVIDIA_NFORCE430_SATA2, 176 0, 177 "NVIDIA nForce430 Serial ATA Controller", 178 via_sata_chip_map_6 179 }, 180 { PCI_PRODUCT_NVIDIA_MCP04_IDE, 181 0, 182 "NVIDIA MCP04 IDE Controller", 183 via_chip_map 184 }, 185 { PCI_PRODUCT_NVIDIA_MCP04_SATA, 186 0, 187 "NVIDIA MCP04 Serial ATA Controller", 188 via_sata_chip_map_6 189 }, 190 { PCI_PRODUCT_NVIDIA_MCP04_SATA2, 191 0, 192 "NVIDIA MCP04 Serial ATA Controller", 193 via_sata_chip_map_6 194 }, 195 { PCI_PRODUCT_NVIDIA_MCP55_IDE, 196 0, 197 "NVIDIA MCP55 IDE Controller", 198 via_chip_map 199 }, 200 { PCI_PRODUCT_NVIDIA_MCP55_SATA, 201 0, 202 "NVIDIA MCP55 Serial ATA Controller", 203 via_sata_chip_map_6 204 }, 205 { PCI_PRODUCT_NVIDIA_MCP55_SATA2, 206 0, 207 "NVIDIA MCP55 Serial ATA Controller", 208 via_sata_chip_map_6 209 }, 210 { PCI_PRODUCT_NVIDIA_MCP61_IDE, 211 0, 212 "NVIDIA MCP61 IDE Controller", 213 via_chip_map 214 }, 215 { PCI_PRODUCT_NVIDIA_MCP65_IDE, 216 0, 217 "NVIDIA MCP65 IDE Controller", 218 via_chip_map 219 }, 220 { PCI_PRODUCT_NVIDIA_MCP73_IDE, 221 0, 222 "NVIDIA MCP73 IDE Controller", 223 via_chip_map 224 }, 225 { PCI_PRODUCT_NVIDIA_MCP77_IDE, 226 0, 227 "NVIDIA MCP77 IDE Controller", 228 via_chip_map 229 }, 230 { PCI_PRODUCT_NVIDIA_MCP61_SATA, 231 0, 232 "NVIDIA MCP61 Serial ATA Controller", 233 via_sata_chip_map_6 234 }, 235 { PCI_PRODUCT_NVIDIA_MCP61_SATA2, 236 0, 237 "NVIDIA MCP61 Serial ATA Controller", 238 via_sata_chip_map_6 239 }, 240 { PCI_PRODUCT_NVIDIA_MCP61_SATA3, 241 0, 242 "NVIDIA MCP61 Serial ATA Controller", 243 via_sata_chip_map_6 244 }, 245 { PCI_PRODUCT_NVIDIA_MCP65_SATA, 246 0, 247 "NVIDIA MCP65 Serial ATA Controller", 248 via_sata_chip_map_6 249 }, 250 { PCI_PRODUCT_NVIDIA_MCP65_SATA2, 251 0, 252 "NVIDIA MCP65 Serial ATA Controller", 253 via_sata_chip_map_6 254 }, 255 { PCI_PRODUCT_NVIDIA_MCP65_SATA3, 256 0, 257 "NVIDIA MCP65 Serial ATA Controller", 258 via_sata_chip_map_6 259 }, 260 { PCI_PRODUCT_NVIDIA_MCP65_SATA4, 261 0, 262 "NVIDIA MCP65 Serial ATA Controller", 263 via_sata_chip_map_6 264 }, 265 { PCI_PRODUCT_NVIDIA_MCP67_IDE, 266 0, 267 "NVIDIA MCP67 IDE Controller", 268 via_chip_map, 269 }, 270 { PCI_PRODUCT_NVIDIA_MCP67_SATA, 271 0, 272 "NVIDIA MCP67 Serial ATA Controller", 273 via_sata_chip_map_6, 274 }, 275 { PCI_PRODUCT_NVIDIA_MCP67_SATA2, 276 0, 277 "NVIDIA MCP67 Serial ATA Controller", 278 via_sata_chip_map_6, 279 }, 280 { PCI_PRODUCT_NVIDIA_MCP67_SATA3, 281 0, 282 "NVIDIA MCP67 Serial ATA Controller", 283 via_sata_chip_map_6, 284 }, 285 { PCI_PRODUCT_NVIDIA_MCP67_SATA4, 286 0, 287 "NVIDIA MCP67 Serial ATA Controller", 288 via_sata_chip_map_6, 289 }, 290 { 0, 291 0, 292 NULL, 293 NULL 294 } 295 }; 296 297 static const struct pciide_product_desc pciide_via_products[] = { 298 { PCI_PRODUCT_VIATECH_VT82C586_IDE, 299 0, 300 NULL, 301 via_chip_map, 302 }, 303 { PCI_PRODUCT_VIATECH_VT82C586A_IDE, 304 0, 305 NULL, 306 via_chip_map, 307 }, 308 { PCI_PRODUCT_VIATECH_CX700_IDE, 309 0, 310 NULL, 311 via_chip_map, 312 }, 313 { PCI_PRODUCT_VIATECH_VT6421_RAID, 314 0, 315 "VIA Technologies VT6421 Serial RAID Controller", 316 via_sata_chip_map_new, 317 }, 318 { PCI_PRODUCT_VIATECH_VT8237_SATA, 319 0, 320 "VIA Technologies VT8237 SATA Controller", 321 via_sata_chip_map_7, 322 }, 323 { PCI_PRODUCT_VIATECH_VT8237A_SATA, 324 0, 325 "VIA Technologies VT8237A SATA Controller", 326 via_sata_chip_map_7, 327 }, 328 { PCI_PRODUCT_VIATECH_VT8237R_SATA, 329 0, 330 "VIA Technologies VT8237R SATA Controller", 331 via_sata_chip_map_0, 332 }, 333 { 0, 334 0, 335 NULL, 336 NULL 337 } 338 }; 339 340 static const struct pciide_product_desc * 341 viaide_lookup(pcireg_t id) 342 { 343 344 switch (PCI_VENDOR(id)) { 345 case PCI_VENDOR_VIATECH: 346 return (pciide_lookup_product(id, pciide_via_products)); 347 348 case PCI_VENDOR_AMD: 349 return (pciide_lookup_product(id, pciide_amd_products)); 350 351 case PCI_VENDOR_NVIDIA: 352 return (pciide_lookup_product(id, pciide_nvidia_products)); 353 } 354 return (NULL); 355 } 356 357 static int 358 viaide_match(device_t parent, cfdata_t match, void *aux) 359 { 360 struct pci_attach_args *pa = aux; 361 362 if (viaide_lookup(pa->pa_id) != NULL) 363 return (2); 364 return (0); 365 } 366 367 static void 368 viaide_attach(device_t parent, device_t self, void *aux) 369 { 370 struct pci_attach_args *pa = aux; 371 struct pciide_softc *sc = device_private(self); 372 const struct pciide_product_desc *pp; 373 374 sc->sc_wdcdev.sc_atac.atac_dev = self; 375 376 pp = viaide_lookup(pa->pa_id); 377 if (pp == NULL) 378 panic("viaide_attach"); 379 pciide_common_attach(sc, pa, pp); 380 381 if (!pmf_device_register(self, viaide_suspend, viaide_resume)) 382 aprint_error_dev(self, "couldn't establish power handler\n"); 383 } 384 385 static int 386 via_pcib_match(struct pci_attach_args *pa) 387 { 388 if (PCI_CLASS(pa->pa_class) == PCI_CLASS_BRIDGE && 389 PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_BRIDGE_ISA && 390 PCI_VENDOR(pa->pa_id) == PCI_VENDOR_VIATECH) 391 return (1); 392 return 0; 393 } 394 395 static bool 396 viaide_suspend(device_t dv PMF_FN_ARGS) 397 { 398 struct pciide_softc *sc = device_private(dv); 399 400 sc->sc_pm_reg[0] = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_IDECONF(sc)); 401 /* APO_DATATIM(sc) includes APO_UDMA(sc) */ 402 sc->sc_pm_reg[1] = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM(sc)); 403 /* This two are VIA-only, but should be ignored by other devices. */ 404 sc->sc_pm_reg[2] = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_CTLMISC(sc)); 405 sc->sc_pm_reg[3] = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_MISCTIM(sc)); 406 407 return true; 408 } 409 410 static bool 411 viaide_resume(device_t dv PMF_FN_ARGS) 412 { 413 struct pciide_softc *sc = device_private(dv); 414 415 pci_conf_write(sc->sc_pc, sc->sc_tag, APO_IDECONF(sc), 416 sc->sc_pm_reg[0]); 417 pci_conf_write(sc->sc_pc, sc->sc_tag, APO_DATATIM(sc), 418 sc->sc_pm_reg[1]); 419 /* This two are VIA-only, but should be ignored by other devices. */ 420 pci_conf_write(sc->sc_pc, sc->sc_tag, APO_CTLMISC(sc), 421 sc->sc_pm_reg[2]); 422 pci_conf_write(sc->sc_pc, sc->sc_tag, APO_MISCTIM(sc), 423 sc->sc_pm_reg[3]); 424 425 return true; 426 } 427 428 static void 429 via_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa) 430 { 431 struct pciide_channel *cp; 432 pcireg_t interface = PCI_INTERFACE(pa->pa_class); 433 pcireg_t vendor = PCI_VENDOR(pa->pa_id); 434 int channel; 435 u_int32_t ideconf; 436 bus_size_t cmdsize, ctlsize; 437 pcireg_t pcib_id, pcib_class; 438 struct pci_attach_args pcib_pa; 439 440 if (pciide_chipen(sc, pa) == 0) 441 return; 442 443 switch (vendor) { 444 case PCI_VENDOR_VIATECH: 445 /* 446 * get a PCI tag for the ISA bridge. 447 */ 448 if (pci_find_device(&pcib_pa, via_pcib_match) == 0) 449 goto unknown; 450 pcib_id = pcib_pa.pa_id; 451 pcib_class = pcib_pa.pa_class; 452 aprint_normal_dev(sc->sc_wdcdev.sc_atac.atac_dev, 453 "VIA Technologies "); 454 switch (PCI_PRODUCT(pcib_id)) { 455 case PCI_PRODUCT_VIATECH_VT82C586_ISA: 456 aprint_normal("VT82C586 (Apollo VP) "); 457 if(PCI_REVISION(pcib_class) >= 0x02) { 458 aprint_normal("ATA33 controller\n"); 459 sc->sc_wdcdev.sc_atac.atac_udma_cap = 2; 460 } else { 461 aprint_normal("controller\n"); 462 sc->sc_wdcdev.sc_atac.atac_udma_cap = 0; 463 } 464 break; 465 case PCI_PRODUCT_VIATECH_VT82C596A: 466 aprint_normal("VT82C596A (Apollo Pro) "); 467 if (PCI_REVISION(pcib_class) >= 0x12) { 468 aprint_normal("ATA66 controller\n"); 469 sc->sc_wdcdev.sc_atac.atac_udma_cap = 4; 470 } else { 471 aprint_normal("ATA33 controller\n"); 472 sc->sc_wdcdev.sc_atac.atac_udma_cap = 2; 473 } 474 break; 475 case PCI_PRODUCT_VIATECH_VT82C686A_ISA: 476 aprint_normal("VT82C686A (Apollo KX133) "); 477 if (PCI_REVISION(pcib_class) >= 0x40) { 478 aprint_normal("ATA100 controller\n"); 479 sc->sc_wdcdev.sc_atac.atac_udma_cap = 5; 480 } else { 481 aprint_normal("ATA66 controller\n"); 482 sc->sc_wdcdev.sc_atac.atac_udma_cap = 4; 483 } 484 break; 485 case PCI_PRODUCT_VIATECH_VT8231: 486 aprint_normal("VT8231 ATA100 controller\n"); 487 sc->sc_wdcdev.sc_atac.atac_udma_cap = 5; 488 break; 489 case PCI_PRODUCT_VIATECH_VT8233: 490 aprint_normal("VT8233 ATA100 controller\n"); 491 sc->sc_wdcdev.sc_atac.atac_udma_cap = 5; 492 break; 493 case PCI_PRODUCT_VIATECH_VT8233A: 494 aprint_normal("VT8233A ATA133 controller\n"); 495 sc->sc_wdcdev.sc_atac.atac_udma_cap = 6; 496 break; 497 case PCI_PRODUCT_VIATECH_VT8235: 498 aprint_normal("VT8235 ATA133 controller\n"); 499 sc->sc_wdcdev.sc_atac.atac_udma_cap = 6; 500 break; 501 case PCI_PRODUCT_VIATECH_VT8237: 502 aprint_normal("VT8237 ATA133 controller\n"); 503 sc->sc_wdcdev.sc_atac.atac_udma_cap = 6; 504 break; 505 case PCI_PRODUCT_VIATECH_VT8237A_ISA: 506 aprint_normal("VT8237A ATA133 controller\n"); 507 sc->sc_wdcdev.sc_atac.atac_udma_cap = 6; 508 break; 509 case PCI_PRODUCT_VIATECH_CX700_IDE: 510 aprint_normal("CX700 ATA133 controller\n"); 511 sc->sc_wdcdev.sc_atac.atac_udma_cap = 6; 512 break; 513 default: 514 unknown: 515 aprint_normal("unknown VIA ATA controller\n"); 516 sc->sc_wdcdev.sc_atac.atac_udma_cap = 0; 517 } 518 sc->sc_apo_regbase = APO_VIA_REGBASE; 519 break; 520 case PCI_VENDOR_AMD: 521 switch (sc->sc_pp->ide_product) { 522 case PCI_PRODUCT_AMD_PBC8111_IDE: 523 sc->sc_wdcdev.sc_atac.atac_udma_cap = 6; 524 break; 525 case PCI_PRODUCT_AMD_CS5536_IDE: 526 case PCI_PRODUCT_AMD_PBC766_IDE: 527 case PCI_PRODUCT_AMD_PBC768_IDE: 528 sc->sc_wdcdev.sc_atac.atac_udma_cap = 5; 529 break; 530 default: 531 sc->sc_wdcdev.sc_atac.atac_udma_cap = 4; 532 } 533 sc->sc_apo_regbase = APO_AMD_REGBASE; 534 break; 535 case PCI_VENDOR_NVIDIA: 536 switch (sc->sc_pp->ide_product) { 537 case PCI_PRODUCT_NVIDIA_NFORCE_ATA100: 538 sc->sc_wdcdev.sc_atac.atac_udma_cap = 5; 539 break; 540 case PCI_PRODUCT_NVIDIA_NFORCE2_ATA133: 541 case PCI_PRODUCT_NVIDIA_NFORCE2_400_ATA133: 542 case PCI_PRODUCT_NVIDIA_NFORCE3_ATA133: 543 case PCI_PRODUCT_NVIDIA_NFORCE3_250_ATA133: 544 case PCI_PRODUCT_NVIDIA_NFORCE4_ATA133: 545 case PCI_PRODUCT_NVIDIA_NFORCE430_ATA133: 546 case PCI_PRODUCT_NVIDIA_MCP04_IDE: 547 case PCI_PRODUCT_NVIDIA_MCP55_IDE: 548 case PCI_PRODUCT_NVIDIA_MCP61_IDE: 549 case PCI_PRODUCT_NVIDIA_MCP65_IDE: 550 case PCI_PRODUCT_NVIDIA_MCP67_IDE: 551 case PCI_PRODUCT_NVIDIA_MCP73_IDE: 552 case PCI_PRODUCT_NVIDIA_MCP77_IDE: 553 sc->sc_wdcdev.sc_atac.atac_udma_cap = 6; 554 break; 555 } 556 sc->sc_apo_regbase = APO_NVIDIA_REGBASE; 557 break; 558 default: 559 panic("via_chip_map: unknown vendor"); 560 } 561 562 aprint_verbose_dev(sc->sc_wdcdev.sc_atac.atac_dev, 563 "bus-master DMA support present"); 564 pciide_mapreg_dma(sc, pa); 565 aprint_verbose("\n"); 566 sc->sc_wdcdev.sc_atac.atac_cap = ATAC_CAP_DATA16 | ATAC_CAP_DATA32; 567 if (sc->sc_dma_ok) { 568 sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DMA; 569 sc->sc_wdcdev.irqack = pciide_irqack; 570 if (sc->sc_wdcdev.sc_atac.atac_udma_cap > 0) 571 sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_UDMA; 572 } 573 sc->sc_wdcdev.sc_atac.atac_pio_cap = 4; 574 sc->sc_wdcdev.sc_atac.atac_dma_cap = 2; 575 sc->sc_wdcdev.sc_atac.atac_set_modes = via_setup_channel; 576 sc->sc_wdcdev.sc_atac.atac_channels = sc->wdc_chanarray; 577 sc->sc_wdcdev.sc_atac.atac_nchannels = PCIIDE_NUM_CHANNELS; 578 579 if (PCI_CLASS(pa->pa_class) == PCI_CLASS_MASS_STORAGE && 580 PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_RAID) 581 sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_RAID; 582 583 wdc_allocate_regs(&sc->sc_wdcdev); 584 585 ATADEBUG_PRINT(("via_chip_map: old APO_IDECONF=0x%x, " 586 "APO_CTLMISC=0x%x, APO_DATATIM=0x%x, APO_UDMA=0x%x\n", 587 pci_conf_read(sc->sc_pc, sc->sc_tag, APO_IDECONF(sc)), 588 pci_conf_read(sc->sc_pc, sc->sc_tag, APO_CTLMISC(sc)), 589 pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM(sc)), 590 pci_conf_read(sc->sc_pc, sc->sc_tag, APO_UDMA(sc))), 591 DEBUG_PROBE); 592 593 ideconf = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_IDECONF(sc)); 594 for (channel = 0; channel < sc->sc_wdcdev.sc_atac.atac_nchannels; 595 channel++) { 596 cp = &sc->pciide_channels[channel]; 597 if (pciide_chansetup(sc, channel, interface) == 0) 598 continue; 599 600 if ((ideconf & APO_IDECONF_EN(channel)) == 0) { 601 aprint_normal_dev(sc->sc_wdcdev.sc_atac.atac_dev, 602 "%s channel ignored (disabled)\n", cp->name); 603 cp->ata_channel.ch_flags |= ATACH_DISABLED; 604 continue; 605 } 606 via_mapchan(pa, cp, interface, &cmdsize, &ctlsize, 607 pciide_pci_intr); 608 } 609 } 610 611 static void 612 via_mapchan(struct pci_attach_args *pa, struct pciide_channel *cp, 613 pcireg_t interface, bus_size_t *cmdsizep, bus_size_t *ctlsizep, 614 int (*pci_intr)(void *)) 615 { 616 struct ata_channel *wdc_cp; 617 struct pciide_softc *sc; 618 prop_bool_t compat_nat_enable; 619 620 wdc_cp = &cp->ata_channel; 621 sc = CHAN_TO_PCIIDE(&cp->ata_channel); 622 compat_nat_enable = prop_dictionary_get( 623 device_properties(sc->sc_wdcdev.sc_atac.atac_dev), 624 "use-compat-native-irq"); 625 626 if (interface & PCIIDE_INTERFACE_PCI(wdc_cp->ch_channel)) { 627 /* native mode with irq 14/15 requested? */ 628 if (compat_nat_enable != NULL && 629 prop_bool_true(compat_nat_enable)) 630 vt8231_mapregs_native(pa, cp, cmdsizep, ctlsizep, 631 pci_intr); 632 else 633 pciide_mapregs_native(pa, cp, cmdsizep, ctlsizep, 634 pci_intr); 635 } else { 636 pciide_mapregs_compat(pa, cp, wdc_cp->ch_channel, cmdsizep, 637 ctlsizep); 638 if ((cp->ata_channel.ch_flags & ATACH_DISABLED) == 0) 639 pciide_map_compat_intr(pa, cp, wdc_cp->ch_channel); 640 } 641 wdcattach(wdc_cp); 642 } 643 644 /* 645 * At least under certain (mis)configurations (e.g. on the "Pegasos" board) 646 * the VT8231-IDE's native mode only works with irq 14/15, and cannot be 647 * programmed to use a single native PCI irq alone. So we install an interrupt 648 * handler for each channel, as in compatibility mode. 649 */ 650 static void 651 vt8231_mapregs_native(struct pci_attach_args *pa, struct pciide_channel *cp, 652 bus_size_t *cmdsizep, bus_size_t *ctlsizep, int (*pci_intr)(void *)) 653 { 654 struct ata_channel *wdc_cp; 655 struct pciide_softc *sc; 656 657 wdc_cp = &cp->ata_channel; 658 sc = CHAN_TO_PCIIDE(&cp->ata_channel); 659 660 /* XXX prevent pciide_mapregs_native from installing a handler */ 661 if (sc->sc_pci_ih == NULL) 662 sc->sc_pci_ih = (void *)~0; 663 pciide_mapregs_native(pa, cp, cmdsizep, ctlsizep, NULL); 664 665 /* interrupts are fixed to 14/15, as in compatibility mode */ 666 if ((wdc_cp->ch_flags & ATACH_DISABLED) == 0) { 667 #ifdef __HAVE_PCIIDE_MACHDEP_COMPAT_INTR_ESTABLISH 668 cp->ih = pciide_machdep_compat_intr_establish( 669 sc->sc_wdcdev.sc_atac.atac_dev, pa, wdc_cp->ch_channel, 670 pci_intr, sc); 671 if (cp->ih == NULL) { 672 #endif 673 aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 674 "no compatibility interrupt for " 675 "use by %s channel\n", cp->name); 676 wdc_cp->ch_flags |= ATACH_DISABLED; 677 #ifdef __HAVE_PCIIDE_MACHDEP_COMPAT_INTR_ESTABLISH 678 } 679 sc->sc_pci_ih = cp->ih; /* XXX */ 680 #endif 681 } 682 } 683 684 static void 685 via_setup_channel(struct ata_channel *chp) 686 { 687 u_int32_t udmatim_reg, datatim_reg; 688 u_int8_t idedma_ctl; 689 int mode, drive, s; 690 struct ata_drive_datas *drvp; 691 struct atac_softc *atac = chp->ch_atac; 692 struct pciide_channel *cp = CHAN_TO_PCHAN(chp); 693 struct pciide_softc *sc = CHAN_TO_PCIIDE(chp); 694 #ifndef PCIIDE_AMD756_ENABLEDMA 695 int rev = PCI_REVISION( 696 pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG)); 697 #endif 698 699 idedma_ctl = 0; 700 datatim_reg = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM(sc)); 701 udmatim_reg = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_UDMA(sc)); 702 datatim_reg &= ~APO_DATATIM_MASK(chp->ch_channel); 703 udmatim_reg &= ~APO_UDMA_MASK(chp->ch_channel); 704 705 /* setup DMA if needed */ 706 pciide_channel_dma_setup(cp); 707 708 for (drive = 0; drive < 2; drive++) { 709 drvp = &chp->ch_drive[drive]; 710 /* If no drive, skip */ 711 if ((drvp->drive_flags & DRIVE) == 0) 712 continue; 713 /* add timing values, setup DMA if needed */ 714 if (((drvp->drive_flags & DRIVE_DMA) == 0 && 715 (drvp->drive_flags & DRIVE_UDMA) == 0)) { 716 mode = drvp->PIO_mode; 717 goto pio; 718 } 719 if ((atac->atac_cap & ATAC_CAP_UDMA) && 720 (drvp->drive_flags & DRIVE_UDMA)) { 721 /* use Ultra/DMA */ 722 s = splbio(); 723 drvp->drive_flags &= ~DRIVE_DMA; 724 splx(s); 725 udmatim_reg |= APO_UDMA_EN(chp->ch_channel, drive) | 726 APO_UDMA_EN_MTH(chp->ch_channel, drive); 727 switch (PCI_VENDOR(sc->sc_pci_id)) { 728 case PCI_VENDOR_VIATECH: 729 if (sc->sc_wdcdev.sc_atac.atac_udma_cap == 6) { 730 /* 8233a */ 731 udmatim_reg |= APO_UDMA_TIME( 732 chp->ch_channel, 733 drive, 734 via_udma133_tim[drvp->UDMA_mode]); 735 } else if (sc->sc_wdcdev.sc_atac.atac_udma_cap == 5) { 736 /* 686b */ 737 udmatim_reg |= APO_UDMA_TIME( 738 chp->ch_channel, 739 drive, 740 via_udma100_tim[drvp->UDMA_mode]); 741 } else if (sc->sc_wdcdev.sc_atac.atac_udma_cap == 4) { 742 /* 596b or 686a */ 743 udmatim_reg |= APO_UDMA_CLK66( 744 chp->ch_channel); 745 udmatim_reg |= APO_UDMA_TIME( 746 chp->ch_channel, 747 drive, 748 via_udma66_tim[drvp->UDMA_mode]); 749 } else { 750 /* 596a or 586b */ 751 udmatim_reg |= APO_UDMA_TIME( 752 chp->ch_channel, 753 drive, 754 via_udma33_tim[drvp->UDMA_mode]); 755 } 756 break; 757 case PCI_VENDOR_AMD: 758 case PCI_VENDOR_NVIDIA: 759 udmatim_reg |= APO_UDMA_TIME(chp->ch_channel, 760 drive, amd7x6_udma_tim[drvp->UDMA_mode]); 761 break; 762 } 763 /* can use PIO timings, MW DMA unused */ 764 mode = drvp->PIO_mode; 765 } else { 766 /* use Multiword DMA, but only if revision is OK */ 767 s = splbio(); 768 drvp->drive_flags &= ~DRIVE_UDMA; 769 splx(s); 770 #ifndef PCIIDE_AMD756_ENABLEDMA 771 /* 772 * The workaround doesn't seem to be necessary 773 * with all drives, so it can be disabled by 774 * PCIIDE_AMD756_ENABLEDMA. It causes a hard hang if 775 * triggered. 776 */ 777 if (PCI_VENDOR(sc->sc_pci_id) == PCI_VENDOR_AMD && 778 sc->sc_pp->ide_product == 779 PCI_PRODUCT_AMD_PBC756_IDE && 780 AMD756_CHIPREV_DISABLEDMA(rev)) { 781 aprint_normal( 782 "%s:%d:%d: multi-word DMA disabled due " 783 "to chip revision\n", 784 device_xname( 785 sc->sc_wdcdev.sc_atac.atac_dev), 786 chp->ch_channel, drive); 787 mode = drvp->PIO_mode; 788 s = splbio(); 789 drvp->drive_flags &= ~DRIVE_DMA; 790 splx(s); 791 goto pio; 792 } 793 #endif 794 /* mode = min(pio, dma+2) */ 795 if (drvp->PIO_mode <= (drvp->DMA_mode + 2)) 796 mode = drvp->PIO_mode; 797 else 798 mode = drvp->DMA_mode + 2; 799 } 800 idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 801 802 pio: /* setup PIO mode */ 803 if (mode <= 2) { 804 drvp->DMA_mode = 0; 805 drvp->PIO_mode = 0; 806 mode = 0; 807 } else { 808 drvp->PIO_mode = mode; 809 drvp->DMA_mode = mode - 2; 810 } 811 datatim_reg |= 812 APO_DATATIM_PULSE(chp->ch_channel, drive, 813 apollo_pio_set[mode]) | 814 APO_DATATIM_RECOV(chp->ch_channel, drive, 815 apollo_pio_rec[mode]); 816 } 817 if (idedma_ctl != 0) { 818 /* Add software bits in status register */ 819 bus_space_write_1(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CTL], 0, 820 idedma_ctl); 821 } 822 pci_conf_write(sc->sc_pc, sc->sc_tag, APO_DATATIM(sc), datatim_reg); 823 pci_conf_write(sc->sc_pc, sc->sc_tag, APO_UDMA(sc), udmatim_reg); 824 ATADEBUG_PRINT(("via_chip_map: APO_DATATIM=0x%x, APO_UDMA=0x%x\n", 825 pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM(sc)), 826 pci_conf_read(sc->sc_pc, sc->sc_tag, APO_UDMA(sc))), DEBUG_PROBE); 827 } 828 829 static int 830 via_sata_chip_map_common(struct pciide_softc *sc, struct pci_attach_args *pa) 831 { 832 bus_size_t satasize; 833 int maptype, ret; 834 835 if (pciide_chipen(sc, pa) == 0) 836 return 0; 837 838 aprint_verbose_dev(sc->sc_wdcdev.sc_atac.atac_dev, 839 "bus-master DMA support present"); 840 pciide_mapreg_dma(sc, pa); 841 aprint_verbose("\n"); 842 843 if (sc->sc_dma_ok) { 844 sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_UDMA | ATAC_CAP_DMA; 845 sc->sc_wdcdev.irqack = pciide_irqack; 846 } 847 sc->sc_wdcdev.sc_atac.atac_pio_cap = 4; 848 sc->sc_wdcdev.sc_atac.atac_dma_cap = 2; 849 sc->sc_wdcdev.sc_atac.atac_udma_cap = 6; 850 851 sc->sc_wdcdev.sc_atac.atac_channels = sc->wdc_chanarray; 852 sc->sc_wdcdev.sc_atac.atac_nchannels = PCIIDE_NUM_CHANNELS; 853 sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DATA16 | ATAC_CAP_DATA32; 854 sc->sc_wdcdev.sc_atac.atac_set_modes = sata_setup_channel; 855 856 if (PCI_CLASS(pa->pa_class) == PCI_CLASS_MASS_STORAGE && 857 PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_RAID) 858 sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_RAID; 859 860 wdc_allocate_regs(&sc->sc_wdcdev); 861 maptype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, 862 PCI_MAPREG_START + 0x14); 863 switch(maptype) { 864 case PCI_MAPREG_TYPE_IO: 865 ret = pci_mapreg_map(pa, PCI_MAPREG_START + 0x14, 866 PCI_MAPREG_TYPE_IO, 0, &sc->sc_ba5_st, &sc->sc_ba5_sh, 867 NULL, &satasize); 868 break; 869 case PCI_MAPREG_MEM_TYPE_32BIT: 870 ret = pci_mapreg_map(pa, PCI_MAPREG_START + 0x14, 871 PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT, 872 0, &sc->sc_ba5_st, &sc->sc_ba5_sh, 873 NULL, &satasize); 874 break; 875 default: 876 aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 877 "couldn't map sata regs, unsupportedmaptype (0x%x)\n", 878 maptype); 879 return 0; 880 } 881 if (ret != 0) { 882 aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 883 "couldn't map sata regs\n"); 884 return 0; 885 } 886 return 1; 887 } 888 889 static void 890 via_sata_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa, 891 int satareg_shift) 892 { 893 struct pciide_channel *cp; 894 struct ata_channel *wdc_cp; 895 struct wdc_regs *wdr; 896 pcireg_t interface = PCI_INTERFACE(pa->pa_class); 897 int channel; 898 bus_size_t cmdsize, ctlsize; 899 900 if (via_sata_chip_map_common(sc, pa) == 0) 901 return; 902 903 if (interface == 0) { 904 ATADEBUG_PRINT(("via_sata_chip_map interface == 0\n"), 905 DEBUG_PROBE); 906 interface = PCIIDE_INTERFACE_BUS_MASTER_DMA | 907 PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1); 908 } 909 910 for (channel = 0; channel < sc->sc_wdcdev.sc_atac.atac_nchannels; 911 channel++) { 912 cp = &sc->pciide_channels[channel]; 913 if (pciide_chansetup(sc, channel, interface) == 0) 914 continue; 915 wdc_cp = &cp->ata_channel; 916 wdr = CHAN_TO_WDC_REGS(wdc_cp); 917 wdr->sata_iot = sc->sc_ba5_st; 918 wdr->sata_baseioh = sc->sc_ba5_sh; 919 if (bus_space_subregion(wdr->sata_iot, wdr->sata_baseioh, 920 (wdc_cp->ch_channel << satareg_shift) + 0x0, 1, 921 &wdr->sata_status) != 0) { 922 aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 923 "couldn't map channel %d sata_status regs\n", 924 wdc_cp->ch_channel); 925 continue; 926 } 927 if (bus_space_subregion(wdr->sata_iot, wdr->sata_baseioh, 928 (wdc_cp->ch_channel << satareg_shift) + 0x4, 1, 929 &wdr->sata_error) != 0) { 930 aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 931 "couldn't map channel %d sata_error regs\n", 932 wdc_cp->ch_channel); 933 continue; 934 } 935 if (bus_space_subregion(wdr->sata_iot, wdr->sata_baseioh, 936 (wdc_cp->ch_channel << satareg_shift) + 0x8, 1, 937 &wdr->sata_control) != 0) { 938 aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 939 "couldn't map channel %d sata_control regs\n", 940 wdc_cp->ch_channel); 941 continue; 942 } 943 sc->sc_wdcdev.sc_atac.atac_probe = wdc_sataprobe; 944 pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize, 945 pciide_pci_intr); 946 } 947 } 948 949 static void 950 via_sata_chip_map_0(struct pciide_softc *sc, struct pci_attach_args *pa) 951 { 952 via_sata_chip_map(sc, pa, 0); 953 } 954 955 static void 956 via_sata_chip_map_6(struct pciide_softc *sc, struct pci_attach_args *pa) 957 { 958 via_sata_chip_map(sc, pa, 6); 959 } 960 961 static void 962 via_sata_chip_map_7(struct pciide_softc *sc, struct pci_attach_args *pa) 963 { 964 via_sata_chip_map(sc, pa, 7); 965 } 966 967 static void 968 via_sata_chip_map_new(struct pciide_softc *sc, struct pci_attach_args *pa) 969 { 970 struct pciide_channel *cp; 971 struct ata_channel *wdc_cp; 972 struct wdc_regs *wdr; 973 pcireg_t interface = PCI_INTERFACE(pa->pa_class); 974 int channel; 975 bus_size_t cmdsize; 976 pci_intr_handle_t intrhandle; 977 const char *intrstr; 978 int i; 979 980 if (via_sata_chip_map_common(sc, pa) == 0) 981 return; 982 983 if (interface == 0) { 984 ATADEBUG_PRINT(("via_sata_chip_map interface == 0\n"), 985 DEBUG_PROBE); 986 interface = PCIIDE_INTERFACE_BUS_MASTER_DMA | 987 PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1); 988 } 989 990 if (pci_intr_map(pa, &intrhandle) != 0) { 991 aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 992 "couldn't map native-PCI interrupt\n"); 993 return; 994 } 995 intrstr = pci_intr_string(pa->pa_pc, intrhandle); 996 sc->sc_pci_ih = pci_intr_establish(pa->pa_pc, 997 intrhandle, IPL_BIO, pciide_pci_intr, sc); 998 if (sc->sc_pci_ih == NULL) { 999 aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 1000 "couldn't establish native-PCI interrupt"); 1001 if (intrstr != NULL) 1002 aprint_error(" at %s", intrstr); 1003 aprint_error("\n"); 1004 return; 1005 } 1006 aprint_normal_dev(sc->sc_wdcdev.sc_atac.atac_dev, 1007 "using %s for native-PCI interrupt\n", 1008 intrstr ? intrstr : "unknown interrupt"); 1009 1010 for (channel = 0; channel < sc->sc_wdcdev.sc_atac.atac_nchannels; 1011 channel++) { 1012 cp = &sc->pciide_channels[channel]; 1013 if (pciide_chansetup(sc, channel, interface) == 0) 1014 continue; 1015 cp->ata_channel.ch_ndrive = 1; 1016 wdc_cp = &cp->ata_channel; 1017 wdr = CHAN_TO_WDC_REGS(wdc_cp); 1018 1019 wdr->sata_iot = sc->sc_ba5_st; 1020 wdr->sata_baseioh = sc->sc_ba5_sh; 1021 if (bus_space_subregion(wdr->sata_iot, wdr->sata_baseioh, 1022 (wdc_cp->ch_channel << 6) + 0x0, 1, 1023 &wdr->sata_status) != 0) { 1024 aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 1025 "couldn't map channel %d sata_status regs\n", 1026 wdc_cp->ch_channel); 1027 continue; 1028 } 1029 if (bus_space_subregion(wdr->sata_iot, wdr->sata_baseioh, 1030 (wdc_cp->ch_channel << 6) + 0x4, 1, 1031 &wdr->sata_error) != 0) { 1032 aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 1033 "couldn't map channel %d sata_error regs\n", 1034 wdc_cp->ch_channel); 1035 continue; 1036 } 1037 if (bus_space_subregion(wdr->sata_iot, wdr->sata_baseioh, 1038 (wdc_cp->ch_channel << 6) + 0x8, 1, 1039 &wdr->sata_control) != 0) { 1040 aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 1041 "couldn't map channel %d sata_control regs\n", 1042 wdc_cp->ch_channel); 1043 continue; 1044 } 1045 sc->sc_wdcdev.sc_atac.atac_probe = wdc_sataprobe; 1046 1047 if (pci_mapreg_map(pa, (0x10 + (4 * (channel))), 1048 PCI_MAPREG_TYPE_IO, 0, &wdr->cmd_iot, &wdr->cmd_baseioh, 1049 NULL, &cmdsize) != 0) { 1050 aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 1051 "couldn't map %s channel regs\n", cp->name); 1052 } 1053 wdr->ctl_iot = wdr->cmd_iot; 1054 for (i = 0; i < WDC_NREG; i++) { 1055 if (bus_space_subregion(wdr->cmd_iot, 1056 wdr->cmd_baseioh, i, i == 0 ? 4 : 1, 1057 &wdr->cmd_iohs[i]) != 0) { 1058 aprint_error_dev( 1059 sc->sc_wdcdev.sc_atac.atac_dev, 1060 "couldn't subregion %s " 1061 "channel cmd regs\n", cp->name); 1062 return; 1063 } 1064 } 1065 if (bus_space_subregion(wdr->cmd_iot, wdr->cmd_baseioh, 1066 WDC_NREG + 2, 1, &wdr->ctl_ioh) != 0) { 1067 aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 1068 "couldn't map channel %d ctl regs\n", channel); 1069 return; 1070 } 1071 wdc_init_shadow_regs(wdc_cp); 1072 wdcattach(wdc_cp); 1073 } 1074 } 1075