1 1.67 riastrad /* $NetBSD: piixide.c,v 1.67 2018/09/03 16:29:32 riastradh Exp $ */ 2 1.1 bouyer 3 1.1 bouyer /* 4 1.1 bouyer * Copyright (c) 1999, 2000, 2001 Manuel Bouyer. 5 1.1 bouyer * 6 1.1 bouyer * Redistribution and use in source and binary forms, with or without 7 1.1 bouyer * modification, are permitted provided that the following conditions 8 1.1 bouyer * are met: 9 1.1 bouyer * 1. Redistributions of source code must retain the above copyright 10 1.1 bouyer * notice, this list of conditions and the following disclaimer. 11 1.1 bouyer * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 bouyer * notice, this list of conditions and the following disclaimer in the 13 1.1 bouyer * documentation and/or other materials provided with the distribution. 14 1.1 bouyer * 15 1.1 bouyer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 1.1 bouyer * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 1.1 bouyer * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 1.19 perry * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 1.1 bouyer * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 1.1 bouyer * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 1.1 bouyer * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 1.1 bouyer * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 1.1 bouyer * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 1.1 bouyer * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 1.1 bouyer */ 26 1.1 bouyer 27 1.20 lukem #include <sys/cdefs.h> 28 1.67 riastrad __KERNEL_RCSID(0, "$NetBSD: piixide.c,v 1.67 2018/09/03 16:29:32 riastradh Exp $"); 29 1.20 lukem 30 1.1 bouyer #include <sys/param.h> 31 1.1 bouyer #include <sys/systm.h> 32 1.1 bouyer 33 1.1 bouyer #include <dev/pci/pcivar.h> 34 1.1 bouyer #include <dev/pci/pcidevs.h> 35 1.1 bouyer #include <dev/pci/pciidereg.h> 36 1.1 bouyer #include <dev/pci/pciidevar.h> 37 1.1 bouyer #include <dev/pci/pciide_piix_reg.h> 38 1.1 bouyer 39 1.57 dyoung static void piix_chip_map(struct pciide_softc*, 40 1.57 dyoung const struct pci_attach_args *); 41 1.12 thorpej static void piix_setup_channel(struct ata_channel *); 42 1.12 thorpej static void piix3_4_setup_channel(struct ata_channel *); 43 1.2 thorpej static u_int32_t piix_setup_idetim_timings(u_int8_t, u_int8_t, u_int8_t); 44 1.2 thorpej static u_int32_t piix_setup_idetim_drvs(struct ata_drive_datas *); 45 1.2 thorpej static u_int32_t piix_setup_sidetim_timings(u_int8_t, u_int8_t, u_int8_t); 46 1.57 dyoung static void piixsata_chip_map(struct pciide_softc*, 47 1.57 dyoung const struct pci_attach_args *); 48 1.37 itohy static int piix_dma_init(void *, int, int, void *, size_t, int); 49 1.2 thorpej 50 1.54 dyoung static bool piixide_resume(device_t, const pmf_qual_t *); 51 1.54 dyoung static bool piixide_suspend(device_t, const pmf_qual_t *); 52 1.46 cube static int piixide_match(device_t, cfdata_t, void *); 53 1.46 cube static void piixide_attach(device_t, device_t, void *); 54 1.1 bouyer 55 1.2 thorpej static const struct pciide_product_desc pciide_intel_products[] = { 56 1.1 bouyer { PCI_PRODUCT_INTEL_82092AA, 57 1.1 bouyer 0, 58 1.1 bouyer "Intel 82092AA IDE controller", 59 1.1 bouyer default_chip_map, 60 1.1 bouyer }, 61 1.1 bouyer { PCI_PRODUCT_INTEL_82371FB_IDE, 62 1.1 bouyer 0, 63 1.1 bouyer "Intel 82371FB IDE controller (PIIX)", 64 1.1 bouyer piix_chip_map, 65 1.1 bouyer }, 66 1.1 bouyer { PCI_PRODUCT_INTEL_82371SB_IDE, 67 1.1 bouyer 0, 68 1.1 bouyer "Intel 82371SB IDE Interface (PIIX3)", 69 1.1 bouyer piix_chip_map, 70 1.1 bouyer }, 71 1.1 bouyer { PCI_PRODUCT_INTEL_82371AB_IDE, 72 1.1 bouyer 0, 73 1.1 bouyer "Intel 82371AB IDE controller (PIIX4)", 74 1.1 bouyer piix_chip_map, 75 1.1 bouyer }, 76 1.1 bouyer { PCI_PRODUCT_INTEL_82440MX_IDE, 77 1.1 bouyer 0, 78 1.1 bouyer "Intel 82440MX IDE controller", 79 1.1 bouyer piix_chip_map 80 1.1 bouyer }, 81 1.1 bouyer { PCI_PRODUCT_INTEL_82801AA_IDE, 82 1.1 bouyer 0, 83 1.1 bouyer "Intel 82801AA IDE Controller (ICH)", 84 1.1 bouyer piix_chip_map, 85 1.1 bouyer }, 86 1.1 bouyer { PCI_PRODUCT_INTEL_82801AB_IDE, 87 1.1 bouyer 0, 88 1.1 bouyer "Intel 82801AB IDE Controller (ICH0)", 89 1.1 bouyer piix_chip_map, 90 1.1 bouyer }, 91 1.1 bouyer { PCI_PRODUCT_INTEL_82801BA_IDE, 92 1.1 bouyer 0, 93 1.1 bouyer "Intel 82801BA IDE Controller (ICH2)", 94 1.1 bouyer piix_chip_map, 95 1.1 bouyer }, 96 1.1 bouyer { PCI_PRODUCT_INTEL_82801BAM_IDE, 97 1.1 bouyer 0, 98 1.1 bouyer "Intel 82801BAM IDE Controller (ICH2-M)", 99 1.1 bouyer piix_chip_map, 100 1.1 bouyer }, 101 1.1 bouyer { PCI_PRODUCT_INTEL_82801CA_IDE_1, 102 1.1 bouyer 0, 103 1.1 bouyer "Intel 82801CA IDE Controller (ICH3)", 104 1.1 bouyer piix_chip_map, 105 1.1 bouyer }, 106 1.1 bouyer { PCI_PRODUCT_INTEL_82801CA_IDE_2, 107 1.1 bouyer 0, 108 1.1 bouyer "Intel 82801CA IDE Controller (ICH3)", 109 1.1 bouyer piix_chip_map, 110 1.1 bouyer }, 111 1.1 bouyer { PCI_PRODUCT_INTEL_82801DB_IDE, 112 1.1 bouyer 0, 113 1.1 bouyer "Intel 82801DB IDE Controller (ICH4)", 114 1.1 bouyer piix_chip_map, 115 1.1 bouyer }, 116 1.1 bouyer { PCI_PRODUCT_INTEL_82801DBM_IDE, 117 1.1 bouyer 0, 118 1.1 bouyer "Intel 82801DBM IDE Controller (ICH4-M)", 119 1.1 bouyer piix_chip_map, 120 1.1 bouyer }, 121 1.1 bouyer { PCI_PRODUCT_INTEL_82801EB_IDE, 122 1.1 bouyer 0, 123 1.1 bouyer "Intel 82801EB IDE Controller (ICH5)", 124 1.1 bouyer piix_chip_map, 125 1.1 bouyer }, 126 1.1 bouyer { PCI_PRODUCT_INTEL_82801EB_SATA, 127 1.1 bouyer 0, 128 1.1 bouyer "Intel 82801EB Serial ATA Controller", 129 1.5 bouyer piixsata_chip_map, 130 1.4 bouyer }, 131 1.4 bouyer { PCI_PRODUCT_INTEL_82801ER_SATA, 132 1.4 bouyer 0, 133 1.4 bouyer "Intel 82801ER Serial ATA/Raid Controller", 134 1.5 bouyer piixsata_chip_map, 135 1.1 bouyer }, 136 1.9 thorpej { PCI_PRODUCT_INTEL_6300ESB_IDE, 137 1.9 thorpej 0, 138 1.9 thorpej "Intel 6300ESB IDE Controller (ICH5)", 139 1.9 thorpej piix_chip_map, 140 1.9 thorpej }, 141 1.9 thorpej { PCI_PRODUCT_INTEL_6300ESB_SATA, 142 1.9 thorpej 0, 143 1.9 thorpej "Intel 6300ESB Serial ATA Controller", 144 1.9 thorpej piixsata_chip_map, 145 1.9 thorpej }, 146 1.22 briggs { PCI_PRODUCT_INTEL_6300ESB_RAID, 147 1.22 briggs 0, 148 1.22 briggs "Intel 6300ESB Serial ATA/RAID Controller", 149 1.22 briggs piixsata_chip_map, 150 1.22 briggs }, 151 1.17 cube { PCI_PRODUCT_INTEL_82801FB_IDE, 152 1.17 cube 0, 153 1.17 cube "Intel 82801FB IDE Controller (ICH6)", 154 1.17 cube piix_chip_map, 155 1.17 cube }, 156 1.16 cube { PCI_PRODUCT_INTEL_82801FB_SATA, 157 1.16 cube 0, 158 1.16 cube "Intel 82801FB Serial ATA/Raid Controller", 159 1.16 cube piixsata_chip_map, 160 1.16 cube }, 161 1.16 cube { PCI_PRODUCT_INTEL_82801FR_SATA, 162 1.16 cube 0, 163 1.16 cube "Intel 82801FR Serial ATA/Raid Controller", 164 1.16 cube piixsata_chip_map, 165 1.16 cube }, 166 1.21 bouyer { PCI_PRODUCT_INTEL_82801FBM_SATA, 167 1.21 bouyer 0, 168 1.21 bouyer "Intel 82801FBM Serial ATA Controller (ICH6)", 169 1.21 bouyer piixsata_chip_map, 170 1.21 bouyer }, 171 1.23 tron { PCI_PRODUCT_INTEL_82801G_IDE, 172 1.23 tron 0, 173 1.23 tron "Intel 82801GB/GR IDE Controller (ICH7)", 174 1.23 tron piix_chip_map, 175 1.23 tron }, 176 1.23 tron { PCI_PRODUCT_INTEL_82801G_SATA, 177 1.23 tron 0, 178 1.23 tron "Intel 82801GB/GR Serial ATA/Raid Controller (ICH7)", 179 1.23 tron piixsata_chip_map, 180 1.23 tron }, 181 1.26 markd { PCI_PRODUCT_INTEL_82801GBM_SATA, 182 1.26 markd 0, 183 1.26 markd "Intel 82801GBM/GHM Serial ATA Controller (ICH7)", 184 1.26 markd piixsata_chip_map, 185 1.26 markd }, 186 1.29 xtraeme { PCI_PRODUCT_INTEL_82801H_SATA_1, 187 1.29 xtraeme 0, 188 1.29 xtraeme "Intel 82801H Serial ATA Controller (ICH8)", 189 1.29 xtraeme piixsata_chip_map, 190 1.29 xtraeme }, 191 1.29 xtraeme { PCI_PRODUCT_INTEL_82801H_SATA_RAID, 192 1.29 xtraeme 0, 193 1.29 xtraeme "Intel 82801H Serial ATA RAID Controller (ICH8)", 194 1.29 xtraeme piixsata_chip_map, 195 1.29 xtraeme }, 196 1.29 xtraeme { PCI_PRODUCT_INTEL_82801H_SATA_2, 197 1.29 xtraeme 0, 198 1.29 xtraeme "Intel 82801H Serial ATA Controller (ICH8)", 199 1.29 xtraeme piixsata_chip_map, 200 1.29 xtraeme }, 201 1.39 xtraeme { PCI_PRODUCT_INTEL_82801HBM_IDE, 202 1.39 xtraeme 0, 203 1.39 xtraeme "Intel 82801HBM IDE Controller (ICH8M)", 204 1.39 xtraeme piix_chip_map, 205 1.39 xtraeme }, 206 1.65 msaitoh { PCI_PRODUCT_INTEL_82801HBM_SATA_AHCI, 207 1.29 xtraeme 0, 208 1.65 msaitoh "Intel 82801HBM Serial ATA AHCI Controller (ICH8M)", 209 1.29 xtraeme piixsata_chip_map, 210 1.29 xtraeme }, 211 1.65 msaitoh { PCI_PRODUCT_INTEL_82801HBM_SATA_RAID, 212 1.29 xtraeme 0, 213 1.65 msaitoh "Intel 82801HBM Serial ATA RAID Controller (ICH8M)", 214 1.29 xtraeme piixsata_chip_map, 215 1.29 xtraeme }, 216 1.41 xtraeme { PCI_PRODUCT_INTEL_82801HEM_SATA, 217 1.41 xtraeme 0, 218 1.41 xtraeme "Intel 82801HEM Serial ATA Controller (ICH8M)", 219 1.41 xtraeme piixsata_chip_map, 220 1.41 xtraeme }, 221 1.28 cube { PCI_PRODUCT_INTEL_63XXESB_IDE, 222 1.28 cube 0, 223 1.28 cube "Intel 631xESB/632xESB IDE Controller", 224 1.28 cube piix_chip_map, 225 1.28 cube }, 226 1.38 xtraeme { PCI_PRODUCT_INTEL_82801I_SATA_1, 227 1.38 xtraeme 0, 228 1.38 xtraeme "Intel 82801I Serial ATA Controller (ICH9)", 229 1.38 xtraeme piixsata_chip_map, 230 1.38 xtraeme }, 231 1.38 xtraeme { PCI_PRODUCT_INTEL_82801I_SATA_2, 232 1.38 xtraeme 0, 233 1.38 xtraeme "Intel 82801I Serial ATA Controller (ICH9)", 234 1.38 xtraeme piixsata_chip_map, 235 1.38 xtraeme }, 236 1.38 xtraeme { PCI_PRODUCT_INTEL_82801I_SATA_3, 237 1.38 xtraeme 0, 238 1.38 xtraeme "Intel 82801I Serial ATA Controller (ICH9)", 239 1.38 xtraeme piixsata_chip_map, 240 1.38 xtraeme }, 241 1.48 markd { PCI_PRODUCT_INTEL_82801I_SATA_4, 242 1.48 markd 0, 243 1.48 markd "Intel 82801I Mobile Serial ATA Controller (ICH9)", 244 1.48 markd piixsata_chip_map, 245 1.48 markd }, 246 1.48 markd { PCI_PRODUCT_INTEL_82801I_SATA_5, 247 1.48 markd 0, 248 1.48 markd "Intel 82801I Mobile Serial ATA Controller (ICH9)", 249 1.48 markd piixsata_chip_map, 250 1.48 markd }, 251 1.48 markd { PCI_PRODUCT_INTEL_82801I_SATA_6, 252 1.48 markd 0, 253 1.48 markd "Intel 82801I Mobile Serial ATA Controller (ICH9)", 254 1.48 markd piixsata_chip_map, 255 1.48 markd }, 256 1.48 markd { PCI_PRODUCT_INTEL_82801I_SATA_7, 257 1.48 markd 0, 258 1.48 markd "Intel 82801I Mobile Serial ATA Controller (ICH9)", 259 1.48 markd piixsata_chip_map, 260 1.48 markd }, 261 1.28 cube { PCI_PRODUCT_INTEL_63XXESB_SATA, 262 1.28 cube 0, 263 1.28 cube "Intel 631xESB/632xESB Serial ATA Controller", 264 1.28 cube piixsata_chip_map, 265 1.28 cube }, 266 1.55 njoly { PCI_PRODUCT_INTEL_82801JD_SATA_IDE2, 267 1.47 christos 0, 268 1.55 njoly "Intel 82801JD Serial ATA Controller (ICH10)", 269 1.47 christos piixsata_chip_map, 270 1.47 christos }, 271 1.55 njoly { PCI_PRODUCT_INTEL_82801JI_SATA_IDE2, 272 1.47 christos 0, 273 1.55 njoly "Intel 82801JI Serial ATA Controller (ICH10)", 274 1.47 christos piixsata_chip_map, 275 1.47 christos }, 276 1.55 njoly { PCI_PRODUCT_INTEL_82801JD_SATA_IDE, 277 1.47 christos 0, 278 1.55 njoly "Intel 82801JD Serial ATA Controller (ICH10)", 279 1.47 christos piixsata_chip_map, 280 1.47 christos }, 281 1.55 njoly { PCI_PRODUCT_INTEL_82801JI_SATA_IDE, 282 1.47 christos 0, 283 1.55 njoly "Intel 82801JI Serial ATA Controller (ICH10)", 284 1.47 christos piixsata_chip_map, 285 1.47 christos }, 286 1.49 christos { 287 1.49 christos PCI_PRODUCT_INTEL_82965PM_IDE, 288 1.49 christos 0, 289 1.49 christos "Intel 82965PM IDE controller", 290 1.49 christos piixsata_chip_map, 291 1.49 christos }, 292 1.66 jakllsch { PCI_PRODUCT_INTEL_82Q45_IDER, 293 1.66 jakllsch 0, 294 1.66 jakllsch "Intel 82Q45 IDE Redirection controller", 295 1.66 jakllsch piixsata_chip_map, 296 1.66 jakllsch }, 297 1.52 sborrill { 298 1.52 sborrill PCI_PRODUCT_INTEL_3400_SATA_1, 299 1.52 sborrill 0, 300 1.52 sborrill "Intel 3400 Serial ATA Controller", 301 1.52 sborrill piixsata_chip_map, 302 1.52 sborrill }, 303 1.52 sborrill { 304 1.52 sborrill PCI_PRODUCT_INTEL_3400_SATA_1, 305 1.52 sborrill 0, 306 1.52 sborrill "Intel 3400 Serial ATA Controller", 307 1.52 sborrill piixsata_chip_map, 308 1.52 sborrill }, 309 1.52 sborrill { 310 1.52 sborrill PCI_PRODUCT_INTEL_3400_SATA_2, 311 1.52 sborrill 0, 312 1.52 sborrill "Intel 3400 Serial ATA Controller", 313 1.52 sborrill piixsata_chip_map, 314 1.52 sborrill }, 315 1.52 sborrill { 316 1.52 sborrill PCI_PRODUCT_INTEL_3400_SATA_3, 317 1.52 sborrill 0, 318 1.52 sborrill "Intel 3400 Serial ATA Controller", 319 1.52 sborrill piixsata_chip_map, 320 1.52 sborrill }, 321 1.52 sborrill { 322 1.52 sborrill PCI_PRODUCT_INTEL_3400_SATA_4, 323 1.52 sborrill 0, 324 1.52 sborrill "Intel 3400 Serial ATA Controller", 325 1.52 sborrill piixsata_chip_map, 326 1.52 sborrill }, 327 1.52 sborrill { 328 1.52 sborrill PCI_PRODUCT_INTEL_3400_SATA_5, 329 1.52 sborrill 0, 330 1.52 sborrill "Intel 3400 Serial ATA Controller", 331 1.52 sborrill piixsata_chip_map, 332 1.52 sborrill }, 333 1.52 sborrill { 334 1.52 sborrill PCI_PRODUCT_INTEL_3400_SATA_6, 335 1.52 sborrill 0, 336 1.52 sborrill "Intel 3400 Serial ATA Controller", 337 1.52 sborrill piixsata_chip_map, 338 1.52 sborrill }, 339 1.58 sborrill { 340 1.58 sborrill PCI_PRODUCT_INTEL_6SERIES_SATA_1, 341 1.58 sborrill 0, 342 1.58 sborrill "Intel 6 Series Serial ATA Controller", 343 1.58 sborrill piixsata_chip_map, 344 1.58 sborrill }, 345 1.58 sborrill { 346 1.58 sborrill PCI_PRODUCT_INTEL_6SERIES_SATA_2, 347 1.58 sborrill 0, 348 1.58 sborrill "Intel 6 Series Serial ATA Controller", 349 1.58 sborrill piixsata_chip_map, 350 1.58 sborrill }, 351 1.58 sborrill { 352 1.58 sborrill PCI_PRODUCT_INTEL_6SERIES_SATA_3, 353 1.58 sborrill 0, 354 1.58 sborrill "Intel 6 Series Serial ATA Controller", 355 1.58 sborrill piixsata_chip_map, 356 1.58 sborrill }, 357 1.58 sborrill { 358 1.58 sborrill PCI_PRODUCT_INTEL_6SERIES_SATA_4, 359 1.58 sborrill 0, 360 1.58 sborrill "Intel 6 Series Serial ATA Controller", 361 1.58 sborrill piixsata_chip_map, 362 1.58 sborrill }, 363 1.1 bouyer { 0, 364 1.1 bouyer 0, 365 1.1 bouyer NULL, 366 1.1 bouyer NULL 367 1.1 bouyer } 368 1.1 bouyer }; 369 1.1 bouyer 370 1.46 cube CFATTACH_DECL_NEW(piixide, sizeof(struct pciide_softc), 371 1.64 jakllsch piixide_match, piixide_attach, pciide_detach, NULL); 372 1.1 bouyer 373 1.2 thorpej static int 374 1.46 cube piixide_match(device_t parent, cfdata_t match, void *aux) 375 1.1 bouyer { 376 1.1 bouyer struct pci_attach_args *pa = aux; 377 1.1 bouyer 378 1.1 bouyer if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_INTEL) { 379 1.1 bouyer if (pciide_lookup_product(pa->pa_id, pciide_intel_products)) 380 1.1 bouyer return (2); 381 1.1 bouyer } 382 1.1 bouyer return (0); 383 1.1 bouyer } 384 1.1 bouyer 385 1.2 thorpej static void 386 1.46 cube piixide_attach(device_t parent, device_t self, void *aux) 387 1.1 bouyer { 388 1.1 bouyer struct pci_attach_args *pa = aux; 389 1.46 cube struct pciide_softc *sc = device_private(self); 390 1.46 cube 391 1.46 cube sc->sc_wdcdev.sc_atac.atac_dev = self; 392 1.1 bouyer 393 1.1 bouyer pciide_common_attach(sc, pa, 394 1.1 bouyer pciide_lookup_product(pa->pa_id, pciide_intel_products)); 395 1.1 bouyer 396 1.42 jmcneill if (!pmf_device_register(self, piixide_suspend, piixide_resume)) 397 1.42 jmcneill aprint_error_dev(self, "couldn't establish power handler\n"); 398 1.18 jmcneill } 399 1.18 jmcneill 400 1.42 jmcneill static bool 401 1.54 dyoung piixide_resume(device_t dv, const pmf_qual_t *qual) 402 1.42 jmcneill { 403 1.42 jmcneill struct pciide_softc *sc = device_private(dv); 404 1.42 jmcneill 405 1.42 jmcneill pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM, 406 1.43 joerg sc->sc_pm_reg[0]); 407 1.44 drochner pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG, 408 1.43 joerg sc->sc_pm_reg[1]); 409 1.42 jmcneill 410 1.42 jmcneill return true; 411 1.42 jmcneill } 412 1.42 jmcneill 413 1.42 jmcneill static bool 414 1.54 dyoung piixide_suspend(device_t dv, const pmf_qual_t *qual) 415 1.18 jmcneill { 416 1.42 jmcneill struct pciide_softc *sc = device_private(dv); 417 1.18 jmcneill 418 1.43 joerg sc->sc_pm_reg[0] = pci_conf_read(sc->sc_pc, sc->sc_tag, 419 1.42 jmcneill PIIX_IDETIM); 420 1.43 joerg sc->sc_pm_reg[1] = pci_conf_read(sc->sc_pc, sc->sc_tag, 421 1.44 drochner PIIX_UDMAREG); 422 1.18 jmcneill 423 1.42 jmcneill return true; 424 1.1 bouyer } 425 1.1 bouyer 426 1.2 thorpej static void 427 1.57 dyoung piix_chip_map(struct pciide_softc *sc, const struct pci_attach_args *pa) 428 1.1 bouyer { 429 1.1 bouyer struct pciide_channel *cp; 430 1.1 bouyer int channel; 431 1.1 bouyer u_int32_t idetim; 432 1.24 bouyer pcireg_t interface = PCI_INTERFACE(pa->pa_class); 433 1.1 bouyer 434 1.1 bouyer if (pciide_chipen(sc, pa) == 0) 435 1.1 bouyer return; 436 1.1 bouyer 437 1.46 cube aprint_verbose_dev(sc->sc_wdcdev.sc_atac.atac_dev, 438 1.46 cube "bus-master DMA support present"); 439 1.1 bouyer pciide_mapreg_dma(sc, pa); 440 1.36 ad aprint_verbose("\n"); 441 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DATA16 | ATAC_CAP_DATA32; 442 1.1 bouyer if (sc->sc_dma_ok) { 443 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DMA; 444 1.1 bouyer sc->sc_wdcdev.irqack = pciide_irqack; 445 1.37 itohy /* Do all revisions require DMA alignment workaround? */ 446 1.37 itohy sc->sc_wdcdev.dma_init = piix_dma_init; 447 1.1 bouyer switch(sc->sc_pp->ide_product) { 448 1.1 bouyer case PCI_PRODUCT_INTEL_82371AB_IDE: 449 1.1 bouyer case PCI_PRODUCT_INTEL_82440MX_IDE: 450 1.1 bouyer case PCI_PRODUCT_INTEL_82801AA_IDE: 451 1.1 bouyer case PCI_PRODUCT_INTEL_82801AB_IDE: 452 1.1 bouyer case PCI_PRODUCT_INTEL_82801BA_IDE: 453 1.1 bouyer case PCI_PRODUCT_INTEL_82801BAM_IDE: 454 1.1 bouyer case PCI_PRODUCT_INTEL_82801CA_IDE_1: 455 1.1 bouyer case PCI_PRODUCT_INTEL_82801CA_IDE_2: 456 1.1 bouyer case PCI_PRODUCT_INTEL_82801DB_IDE: 457 1.1 bouyer case PCI_PRODUCT_INTEL_82801DBM_IDE: 458 1.1 bouyer case PCI_PRODUCT_INTEL_82801EB_IDE: 459 1.9 thorpej case PCI_PRODUCT_INTEL_6300ESB_IDE: 460 1.17 cube case PCI_PRODUCT_INTEL_82801FB_IDE: 461 1.23 tron case PCI_PRODUCT_INTEL_82801G_IDE: 462 1.40 xtraeme case PCI_PRODUCT_INTEL_82801HBM_IDE: 463 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_UDMA; 464 1.1 bouyer } 465 1.1 bouyer } 466 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_pio_cap = 4; 467 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_dma_cap = 2; 468 1.1 bouyer switch(sc->sc_pp->ide_product) { 469 1.1 bouyer case PCI_PRODUCT_INTEL_82801AA_IDE: 470 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_udma_cap = 4; 471 1.1 bouyer break; 472 1.1 bouyer case PCI_PRODUCT_INTEL_82801BA_IDE: 473 1.1 bouyer case PCI_PRODUCT_INTEL_82801BAM_IDE: 474 1.1 bouyer case PCI_PRODUCT_INTEL_82801CA_IDE_1: 475 1.1 bouyer case PCI_PRODUCT_INTEL_82801CA_IDE_2: 476 1.1 bouyer case PCI_PRODUCT_INTEL_82801DB_IDE: 477 1.1 bouyer case PCI_PRODUCT_INTEL_82801DBM_IDE: 478 1.1 bouyer case PCI_PRODUCT_INTEL_82801EB_IDE: 479 1.9 thorpej case PCI_PRODUCT_INTEL_6300ESB_IDE: 480 1.17 cube case PCI_PRODUCT_INTEL_82801FB_IDE: 481 1.23 tron case PCI_PRODUCT_INTEL_82801G_IDE: 482 1.40 xtraeme case PCI_PRODUCT_INTEL_82801HBM_IDE: 483 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_udma_cap = 5; 484 1.1 bouyer break; 485 1.1 bouyer default: 486 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_udma_cap = 2; 487 1.1 bouyer } 488 1.1 bouyer if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82371FB_IDE) 489 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_set_modes = piix_setup_channel; 490 1.1 bouyer else 491 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_set_modes = piix3_4_setup_channel; 492 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_channels = sc->wdc_chanarray; 493 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_nchannels = PCIIDE_NUM_CHANNELS; 494 1.63 bouyer sc->sc_wdcdev.wdc_maxdrives = 2; 495 1.1 bouyer 496 1.11 thorpej ATADEBUG_PRINT(("piix_setup_chip: old idetim=0x%x", 497 1.1 bouyer pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM)), 498 1.1 bouyer DEBUG_PROBE); 499 1.1 bouyer if (sc->sc_pp->ide_product != PCI_PRODUCT_INTEL_82371FB_IDE) { 500 1.11 thorpej ATADEBUG_PRINT((", sidetim=0x%x", 501 1.1 bouyer pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM)), 502 1.1 bouyer DEBUG_PROBE); 503 1.14 thorpej if (sc->sc_wdcdev.sc_atac.atac_cap & ATAC_CAP_UDMA) { 504 1.11 thorpej ATADEBUG_PRINT((", udamreg 0x%x", 505 1.1 bouyer pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG)), 506 1.1 bouyer DEBUG_PROBE); 507 1.1 bouyer } 508 1.1 bouyer if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE || 509 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AB_IDE || 510 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE || 511 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE || 512 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_1 || 513 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_2 || 514 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE || 515 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBM_IDE || 516 1.9 thorpej sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801EB_IDE || 517 1.17 cube sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801FB_IDE || 518 1.23 tron sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_6300ESB_IDE || 519 1.40 xtraeme sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801G_IDE || 520 1.40 xtraeme sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801HBM_IDE) { 521 1.11 thorpej ATADEBUG_PRINT((", IDE_CONTROL 0x%x", 522 1.1 bouyer pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_CONFIG)), 523 1.1 bouyer DEBUG_PROBE); 524 1.1 bouyer } 525 1.1 bouyer 526 1.1 bouyer } 527 1.11 thorpej ATADEBUG_PRINT(("\n"), DEBUG_PROBE); 528 1.1 bouyer 529 1.12 thorpej wdc_allocate_regs(&sc->sc_wdcdev); 530 1.12 thorpej 531 1.14 thorpej for (channel = 0; channel < sc->sc_wdcdev.sc_atac.atac_nchannels; 532 1.14 thorpej channel++) { 533 1.1 bouyer cp = &sc->pciide_channels[channel]; 534 1.24 bouyer if (pciide_chansetup(sc, channel, interface) == 0) 535 1.1 bouyer continue; 536 1.1 bouyer idetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM); 537 1.1 bouyer if ((PIIX_IDETIM_READ(idetim, channel) & 538 1.1 bouyer PIIX_IDETIM_IDE) == 0) { 539 1.1 bouyer #if 1 540 1.46 cube aprint_normal_dev(sc->sc_wdcdev.sc_atac.atac_dev, 541 1.46 cube "%s channel ignored (disabled)\n", cp->name); 542 1.12 thorpej cp->ata_channel.ch_flags |= ATACH_DISABLED; 543 1.1 bouyer continue; 544 1.1 bouyer #else 545 1.1 bouyer pcireg_t interface; 546 1.1 bouyer 547 1.1 bouyer idetim = PIIX_IDETIM_SET(idetim, PIIX_IDETIM_IDE, 548 1.1 bouyer channel); 549 1.1 bouyer pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM, 550 1.1 bouyer idetim); 551 1.1 bouyer interface = PCI_INTERFACE(pci_conf_read(sc->sc_pc, 552 1.1 bouyer sc->sc_tag, PCI_CLASS_REG)); 553 1.1 bouyer aprint_normal("channel %d idetim=%08x interface=%02x\n", 554 1.1 bouyer channel, idetim, interface); 555 1.1 bouyer #endif 556 1.1 bouyer } 557 1.56 jakllsch pciide_mapchan(pa, cp, interface, pciide_pci_intr); 558 1.1 bouyer } 559 1.1 bouyer 560 1.11 thorpej ATADEBUG_PRINT(("piix_setup_chip: idetim=0x%x", 561 1.1 bouyer pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM)), 562 1.1 bouyer DEBUG_PROBE); 563 1.1 bouyer if (sc->sc_pp->ide_product != PCI_PRODUCT_INTEL_82371FB_IDE) { 564 1.11 thorpej ATADEBUG_PRINT((", sidetim=0x%x", 565 1.1 bouyer pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM)), 566 1.1 bouyer DEBUG_PROBE); 567 1.14 thorpej if (sc->sc_wdcdev.sc_atac.atac_cap & ATAC_CAP_UDMA) { 568 1.11 thorpej ATADEBUG_PRINT((", udamreg 0x%x", 569 1.1 bouyer pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG)), 570 1.1 bouyer DEBUG_PROBE); 571 1.1 bouyer } 572 1.1 bouyer if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE || 573 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AB_IDE || 574 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE || 575 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE || 576 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_1 || 577 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_2 || 578 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE || 579 1.9 thorpej sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBM_IDE || 580 1.9 thorpej sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801EB_IDE || 581 1.17 cube sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801FB_IDE || 582 1.23 tron sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_6300ESB_IDE || 583 1.40 xtraeme sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801G_IDE || 584 1.40 xtraeme sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801HBM_IDE) { 585 1.11 thorpej ATADEBUG_PRINT((", IDE_CONTROL 0x%x", 586 1.1 bouyer pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_CONFIG)), 587 1.1 bouyer DEBUG_PROBE); 588 1.1 bouyer } 589 1.1 bouyer } 590 1.11 thorpej ATADEBUG_PRINT(("\n"), DEBUG_PROBE); 591 1.1 bouyer } 592 1.1 bouyer 593 1.2 thorpej static void 594 1.12 thorpej piix_setup_channel(struct ata_channel *chp) 595 1.1 bouyer { 596 1.1 bouyer u_int8_t mode[2], drive; 597 1.1 bouyer u_int32_t oidetim, idetim, idedma_ctl; 598 1.13 thorpej struct pciide_channel *cp = CHAN_TO_PCHAN(chp); 599 1.13 thorpej struct pciide_softc *sc = CHAN_TO_PCIIDE(chp); 600 1.12 thorpej struct ata_drive_datas *drvp = cp->ata_channel.ch_drive; 601 1.1 bouyer 602 1.1 bouyer oidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM); 603 1.8 thorpej idetim = PIIX_IDETIM_CLEAR(oidetim, 0xffff, chp->ch_channel); 604 1.1 bouyer idedma_ctl = 0; 605 1.1 bouyer 606 1.1 bouyer /* set up new idetim: Enable IDE registers decode */ 607 1.1 bouyer idetim = PIIX_IDETIM_SET(idetim, PIIX_IDETIM_IDE, 608 1.8 thorpej chp->ch_channel); 609 1.1 bouyer 610 1.1 bouyer /* setup DMA */ 611 1.1 bouyer pciide_channel_dma_setup(cp); 612 1.1 bouyer 613 1.1 bouyer /* 614 1.1 bouyer * Here we have to mess up with drives mode: PIIX can't have 615 1.1 bouyer * different timings for master and slave drives. 616 1.1 bouyer * We need to find the best combination. 617 1.1 bouyer */ 618 1.1 bouyer 619 1.1 bouyer /* If both drives supports DMA, take the lower mode */ 620 1.63 bouyer if ((drvp[0].drive_flags & ATA_DRIVE_DMA) && 621 1.63 bouyer (drvp[1].drive_flags & ATA_DRIVE_DMA)) { 622 1.1 bouyer mode[0] = mode[1] = 623 1.67 riastrad uimin(drvp[0].DMA_mode, drvp[1].DMA_mode); 624 1.1 bouyer drvp[0].DMA_mode = mode[0]; 625 1.1 bouyer drvp[1].DMA_mode = mode[1]; 626 1.1 bouyer goto ok; 627 1.1 bouyer } 628 1.1 bouyer /* 629 1.1 bouyer * If only one drive supports DMA, use its mode, and 630 1.1 bouyer * put the other one in PIO mode 0 if mode not compatible 631 1.1 bouyer */ 632 1.63 bouyer if (drvp[0].drive_flags & ATA_DRIVE_DMA) { 633 1.1 bouyer mode[0] = drvp[0].DMA_mode; 634 1.1 bouyer mode[1] = drvp[1].PIO_mode; 635 1.1 bouyer if (piix_isp_pio[mode[1]] != piix_isp_dma[mode[0]] || 636 1.1 bouyer piix_rtc_pio[mode[1]] != piix_rtc_dma[mode[0]]) 637 1.1 bouyer mode[1] = drvp[1].PIO_mode = 0; 638 1.1 bouyer goto ok; 639 1.1 bouyer } 640 1.63 bouyer if (drvp[1].drive_flags & ATA_DRIVE_DMA) { 641 1.1 bouyer mode[1] = drvp[1].DMA_mode; 642 1.1 bouyer mode[0] = drvp[0].PIO_mode; 643 1.1 bouyer if (piix_isp_pio[mode[0]] != piix_isp_dma[mode[1]] || 644 1.1 bouyer piix_rtc_pio[mode[0]] != piix_rtc_dma[mode[1]]) 645 1.1 bouyer mode[0] = drvp[0].PIO_mode = 0; 646 1.1 bouyer goto ok; 647 1.1 bouyer } 648 1.1 bouyer /* 649 1.1 bouyer * If both drives are not DMA, takes the lower mode, unless 650 1.1 bouyer * one of them is PIO mode < 2 651 1.1 bouyer */ 652 1.1 bouyer if (drvp[0].PIO_mode < 2) { 653 1.1 bouyer mode[0] = drvp[0].PIO_mode = 0; 654 1.1 bouyer mode[1] = drvp[1].PIO_mode; 655 1.1 bouyer } else if (drvp[1].PIO_mode < 2) { 656 1.1 bouyer mode[1] = drvp[1].PIO_mode = 0; 657 1.1 bouyer mode[0] = drvp[0].PIO_mode; 658 1.1 bouyer } else { 659 1.1 bouyer mode[0] = mode[1] = 660 1.67 riastrad uimin(drvp[1].PIO_mode, drvp[0].PIO_mode); 661 1.1 bouyer drvp[0].PIO_mode = mode[0]; 662 1.1 bouyer drvp[1].PIO_mode = mode[1]; 663 1.1 bouyer } 664 1.1 bouyer ok: /* The modes are setup */ 665 1.1 bouyer for (drive = 0; drive < 2; drive++) { 666 1.63 bouyer if (drvp[drive].drive_flags & ATA_DRIVE_DMA) { 667 1.1 bouyer idetim |= piix_setup_idetim_timings( 668 1.8 thorpej mode[drive], 1, chp->ch_channel); 669 1.1 bouyer goto end; 670 1.1 bouyer } 671 1.1 bouyer } 672 1.1 bouyer /* If we are there, none of the drives are DMA */ 673 1.1 bouyer if (mode[0] >= 2) 674 1.1 bouyer idetim |= piix_setup_idetim_timings( 675 1.8 thorpej mode[0], 0, chp->ch_channel); 676 1.19 perry else 677 1.1 bouyer idetim |= piix_setup_idetim_timings( 678 1.8 thorpej mode[1], 0, chp->ch_channel); 679 1.1 bouyer end: /* 680 1.1 bouyer * timing mode is now set up in the controller. Enable 681 1.1 bouyer * it per-drive 682 1.1 bouyer */ 683 1.1 bouyer for (drive = 0; drive < 2; drive++) { 684 1.1 bouyer /* If no drive, skip */ 685 1.63 bouyer if (drvp[drive].drive_type == ATA_DRIVET_NONE) 686 1.1 bouyer continue; 687 1.1 bouyer idetim |= piix_setup_idetim_drvs(&drvp[drive]); 688 1.63 bouyer if (drvp[drive].drive_flags & ATA_DRIVE_DMA) 689 1.1 bouyer idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 690 1.1 bouyer } 691 1.1 bouyer if (idedma_ctl != 0) { 692 1.1 bouyer /* Add software bits in status register */ 693 1.3 fvdl bus_space_write_1(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CTL], 0, 694 1.1 bouyer idedma_ctl); 695 1.1 bouyer } 696 1.1 bouyer pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM, idetim); 697 1.1 bouyer } 698 1.1 bouyer 699 1.2 thorpej static void 700 1.12 thorpej piix3_4_setup_channel(struct ata_channel *chp) 701 1.1 bouyer { 702 1.1 bouyer struct ata_drive_datas *drvp; 703 1.1 bouyer u_int32_t oidetim, idetim, sidetim, udmareg, ideconf, idedma_ctl; 704 1.13 thorpej struct pciide_channel *cp = CHAN_TO_PCHAN(chp); 705 1.13 thorpej struct pciide_softc *sc = CHAN_TO_PCIIDE(chp); 706 1.8 thorpej struct wdc_softc *wdc = &sc->sc_wdcdev; 707 1.15 thorpej int drive, s; 708 1.8 thorpej int channel = chp->ch_channel; 709 1.1 bouyer 710 1.1 bouyer oidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM); 711 1.1 bouyer sidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM); 712 1.1 bouyer udmareg = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG); 713 1.1 bouyer ideconf = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_CONFIG); 714 1.1 bouyer idetim = PIIX_IDETIM_CLEAR(oidetim, 0xffff, channel); 715 1.1 bouyer sidetim &= ~(PIIX_SIDETIM_ISP_MASK(channel) | 716 1.1 bouyer PIIX_SIDETIM_RTC_MASK(channel)); 717 1.1 bouyer idedma_ctl = 0; 718 1.1 bouyer 719 1.1 bouyer /* set up new idetim: Enable IDE registers decode */ 720 1.1 bouyer idetim = PIIX_IDETIM_SET(idetim, PIIX_IDETIM_IDE, channel); 721 1.1 bouyer 722 1.1 bouyer /* setup DMA if needed */ 723 1.1 bouyer pciide_channel_dma_setup(cp); 724 1.1 bouyer 725 1.1 bouyer for (drive = 0; drive < 2; drive++) { 726 1.1 bouyer udmareg &= ~(PIIX_UDMACTL_DRV_EN(channel, drive) | 727 1.1 bouyer PIIX_UDMATIM_SET(0x3, channel, drive)); 728 1.1 bouyer drvp = &chp->ch_drive[drive]; 729 1.1 bouyer /* If no drive, skip */ 730 1.63 bouyer if (drvp->drive_type == ATA_DRIVET_NONE) 731 1.1 bouyer continue; 732 1.63 bouyer if (((drvp->drive_flags & ATA_DRIVE_DMA) == 0 && 733 1.63 bouyer (drvp->drive_flags & ATA_DRIVE_UDMA) == 0)) 734 1.1 bouyer goto pio; 735 1.1 bouyer 736 1.1 bouyer if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE || 737 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AB_IDE || 738 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE || 739 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE || 740 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_1 || 741 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_2 || 742 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE || 743 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBM_IDE || 744 1.9 thorpej sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801EB_IDE || 745 1.17 cube sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801FB_IDE || 746 1.23 tron sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_6300ESB_IDE || 747 1.40 xtraeme sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801G_IDE || 748 1.40 xtraeme sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801HBM_IDE) { 749 1.1 bouyer ideconf |= PIIX_CONFIG_PINGPONG; 750 1.1 bouyer } 751 1.1 bouyer if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE || 752 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE || 753 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_1 || 754 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_2 || 755 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE || 756 1.1 bouyer sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBM_IDE || 757 1.9 thorpej sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801EB_IDE || 758 1.17 cube sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801FB_IDE || 759 1.23 tron sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_6300ESB_IDE || 760 1.40 xtraeme sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801G_IDE || 761 1.40 xtraeme sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801HBM_IDE) { 762 1.1 bouyer /* setup Ultra/100 */ 763 1.1 bouyer if (drvp->UDMA_mode > 2 && 764 1.1 bouyer (ideconf & PIIX_CONFIG_CR(channel, drive)) == 0) 765 1.1 bouyer drvp->UDMA_mode = 2; 766 1.1 bouyer if (drvp->UDMA_mode > 4) { 767 1.1 bouyer ideconf |= PIIX_CONFIG_UDMA100(channel, drive); 768 1.1 bouyer } else { 769 1.1 bouyer ideconf &= ~PIIX_CONFIG_UDMA100(channel, drive); 770 1.1 bouyer if (drvp->UDMA_mode > 2) { 771 1.1 bouyer ideconf |= PIIX_CONFIG_UDMA66(channel, 772 1.1 bouyer drive); 773 1.1 bouyer } else { 774 1.1 bouyer ideconf &= ~PIIX_CONFIG_UDMA66(channel, 775 1.1 bouyer drive); 776 1.1 bouyer } 777 1.1 bouyer } 778 1.1 bouyer } 779 1.1 bouyer if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE) { 780 1.1 bouyer /* setup Ultra/66 */ 781 1.1 bouyer if (drvp->UDMA_mode > 2 && 782 1.1 bouyer (ideconf & PIIX_CONFIG_CR(channel, drive)) == 0) 783 1.1 bouyer drvp->UDMA_mode = 2; 784 1.1 bouyer if (drvp->UDMA_mode > 2) 785 1.1 bouyer ideconf |= PIIX_CONFIG_UDMA66(channel, drive); 786 1.1 bouyer else 787 1.1 bouyer ideconf &= ~PIIX_CONFIG_UDMA66(channel, drive); 788 1.1 bouyer } 789 1.14 thorpej if ((wdc->sc_atac.atac_cap & ATAC_CAP_UDMA) && 790 1.63 bouyer (drvp->drive_flags & ATA_DRIVE_UDMA)) { 791 1.1 bouyer /* use Ultra/DMA */ 792 1.15 thorpej s = splbio(); 793 1.63 bouyer drvp->drive_flags &= ~ATA_DRIVE_DMA; 794 1.15 thorpej splx(s); 795 1.1 bouyer udmareg |= PIIX_UDMACTL_DRV_EN( channel, drive); 796 1.1 bouyer udmareg |= PIIX_UDMATIM_SET( 797 1.1 bouyer piix4_sct_udma[drvp->UDMA_mode], channel, drive); 798 1.1 bouyer } else { 799 1.1 bouyer /* use Multiword DMA */ 800 1.15 thorpej s = splbio(); 801 1.63 bouyer drvp->drive_flags &= ~ATA_DRIVE_UDMA; 802 1.15 thorpej splx(s); 803 1.1 bouyer if (drive == 0) { 804 1.1 bouyer idetim |= piix_setup_idetim_timings( 805 1.1 bouyer drvp->DMA_mode, 1, channel); 806 1.1 bouyer } else { 807 1.1 bouyer sidetim |= piix_setup_sidetim_timings( 808 1.1 bouyer drvp->DMA_mode, 1, channel); 809 1.1 bouyer idetim =PIIX_IDETIM_SET(idetim, 810 1.1 bouyer PIIX_IDETIM_SITRE, channel); 811 1.1 bouyer } 812 1.1 bouyer } 813 1.1 bouyer idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); 814 1.19 perry 815 1.1 bouyer pio: /* use PIO mode */ 816 1.1 bouyer idetim |= piix_setup_idetim_drvs(drvp); 817 1.1 bouyer if (drive == 0) { 818 1.1 bouyer idetim |= piix_setup_idetim_timings( 819 1.1 bouyer drvp->PIO_mode, 0, channel); 820 1.1 bouyer } else { 821 1.1 bouyer sidetim |= piix_setup_sidetim_timings( 822 1.1 bouyer drvp->PIO_mode, 0, channel); 823 1.1 bouyer idetim =PIIX_IDETIM_SET(idetim, 824 1.1 bouyer PIIX_IDETIM_SITRE, channel); 825 1.1 bouyer } 826 1.1 bouyer } 827 1.1 bouyer if (idedma_ctl != 0) { 828 1.1 bouyer /* Add software bits in status register */ 829 1.3 fvdl bus_space_write_1(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CTL], 0, 830 1.1 bouyer idedma_ctl); 831 1.1 bouyer } 832 1.1 bouyer pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM, idetim); 833 1.1 bouyer pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM, sidetim); 834 1.1 bouyer pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG, udmareg); 835 1.1 bouyer pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_CONFIG, ideconf); 836 1.1 bouyer } 837 1.1 bouyer 838 1.1 bouyer 839 1.1 bouyer /* setup ISP and RTC fields, based on mode */ 840 1.1 bouyer static u_int32_t 841 1.50 dsl piix_setup_idetim_timings(u_int8_t mode, u_int8_t dma, u_int8_t channel) 842 1.1 bouyer { 843 1.19 perry 844 1.1 bouyer if (dma) 845 1.1 bouyer return PIIX_IDETIM_SET(0, 846 1.19 perry PIIX_IDETIM_ISP_SET(piix_isp_dma[mode]) | 847 1.1 bouyer PIIX_IDETIM_RTC_SET(piix_rtc_dma[mode]), 848 1.1 bouyer channel); 849 1.19 perry else 850 1.1 bouyer return PIIX_IDETIM_SET(0, 851 1.19 perry PIIX_IDETIM_ISP_SET(piix_isp_pio[mode]) | 852 1.1 bouyer PIIX_IDETIM_RTC_SET(piix_rtc_pio[mode]), 853 1.1 bouyer channel); 854 1.1 bouyer } 855 1.1 bouyer 856 1.1 bouyer /* setup DTE, PPE, IE and TIME field based on PIO mode */ 857 1.1 bouyer static u_int32_t 858 1.50 dsl piix_setup_idetim_drvs(struct ata_drive_datas *drvp) 859 1.1 bouyer { 860 1.1 bouyer u_int32_t ret = 0; 861 1.12 thorpej struct ata_channel *chp = drvp->chnl_softc; 862 1.8 thorpej u_int8_t channel = chp->ch_channel; 863 1.1 bouyer u_int8_t drive = drvp->drive; 864 1.1 bouyer 865 1.1 bouyer /* 866 1.34 wiz * If drive is using UDMA, timings setups are independent 867 1.1 bouyer * So just check DMA and PIO here. 868 1.1 bouyer */ 869 1.63 bouyer if (drvp->drive_flags & ATA_DRIVE_DMA) { 870 1.1 bouyer /* if mode = DMA mode 0, use compatible timings */ 871 1.63 bouyer if ((drvp->drive_flags & ATA_DRIVE_DMA) && 872 1.1 bouyer drvp->DMA_mode == 0) { 873 1.1 bouyer drvp->PIO_mode = 0; 874 1.1 bouyer return ret; 875 1.1 bouyer } 876 1.1 bouyer ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_TIME(drive), channel); 877 1.1 bouyer /* 878 1.1 bouyer * PIO and DMA timings are the same, use fast timings for PIO 879 1.1 bouyer * too, else use compat timings. 880 1.1 bouyer */ 881 1.1 bouyer if ((piix_isp_pio[drvp->PIO_mode] != 882 1.1 bouyer piix_isp_dma[drvp->DMA_mode]) || 883 1.1 bouyer (piix_rtc_pio[drvp->PIO_mode] != 884 1.1 bouyer piix_rtc_dma[drvp->DMA_mode])) 885 1.1 bouyer drvp->PIO_mode = 0; 886 1.1 bouyer /* if PIO mode <= 2, use compat timings for PIO */ 887 1.1 bouyer if (drvp->PIO_mode <= 2) { 888 1.1 bouyer ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_DTE(drive), 889 1.1 bouyer channel); 890 1.1 bouyer return ret; 891 1.1 bouyer } 892 1.1 bouyer } 893 1.1 bouyer 894 1.1 bouyer /* 895 1.1 bouyer * Now setup PIO modes. If mode < 2, use compat timings. 896 1.1 bouyer * Else enable fast timings. Enable IORDY and prefetch/post 897 1.1 bouyer * if PIO mode >= 3. 898 1.1 bouyer */ 899 1.1 bouyer 900 1.1 bouyer if (drvp->PIO_mode < 2) 901 1.1 bouyer return ret; 902 1.1 bouyer 903 1.1 bouyer ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_TIME(drive), channel); 904 1.1 bouyer if (drvp->PIO_mode >= 3) { 905 1.1 bouyer ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_IE(drive), channel); 906 1.1 bouyer ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_PPE(drive), channel); 907 1.1 bouyer } 908 1.1 bouyer return ret; 909 1.1 bouyer } 910 1.1 bouyer 911 1.1 bouyer /* setup values in SIDETIM registers, based on mode */ 912 1.1 bouyer static u_int32_t 913 1.50 dsl piix_setup_sidetim_timings(u_int8_t mode, u_int8_t dma, u_int8_t channel) 914 1.1 bouyer { 915 1.1 bouyer if (dma) 916 1.1 bouyer return PIIX_SIDETIM_ISP_SET(piix_isp_dma[mode], channel) | 917 1.1 bouyer PIIX_SIDETIM_RTC_SET(piix_rtc_dma[mode], channel); 918 1.19 perry else 919 1.1 bouyer return PIIX_SIDETIM_ISP_SET(piix_isp_pio[mode], channel) | 920 1.1 bouyer PIIX_SIDETIM_RTC_SET(piix_rtc_pio[mode], channel); 921 1.5 bouyer } 922 1.5 bouyer 923 1.5 bouyer static void 924 1.57 dyoung piixsata_chip_map(struct pciide_softc *sc, const struct pci_attach_args *pa) 925 1.5 bouyer { 926 1.5 bouyer struct pciide_channel *cp; 927 1.22 briggs pcireg_t interface, cmdsts; 928 1.35 cube int channel; 929 1.5 bouyer 930 1.5 bouyer if (pciide_chipen(sc, pa) == 0) 931 1.5 bouyer return; 932 1.5 bouyer 933 1.46 cube aprint_verbose_dev(sc->sc_wdcdev.sc_atac.atac_dev, 934 1.46 cube "bus-master DMA support present"); 935 1.5 bouyer pciide_mapreg_dma(sc, pa); 936 1.36 ad aprint_verbose("\n"); 937 1.1 bouyer 938 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DATA16 | ATAC_CAP_DATA32; 939 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_pio_cap = 4; 940 1.1 bouyer if (sc->sc_dma_ok) { 941 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DMA | ATAC_CAP_UDMA; 942 1.1 bouyer sc->sc_wdcdev.irqack = pciide_irqack; 943 1.37 itohy /* Do all revisions require DMA alignment workaround? */ 944 1.37 itohy sc->sc_wdcdev.dma_init = piix_dma_init; 945 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_dma_cap = 2; 946 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_udma_cap = 6; 947 1.1 bouyer } 948 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_set_modes = sata_setup_channel; 949 1.1 bouyer 950 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_channels = sc->wdc_chanarray; 951 1.14 thorpej sc->sc_wdcdev.sc_atac.atac_nchannels = PCIIDE_NUM_CHANNELS; 952 1.63 bouyer sc->sc_wdcdev.wdc_maxdrives = 2; 953 1.1 bouyer 954 1.22 briggs cmdsts = pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_COMMAND_STATUS_REG); 955 1.32 drochner cmdsts &= ~PCI_COMMAND_INTERRUPT_DISABLE; 956 1.22 briggs pci_conf_write(sc->sc_pc, sc->sc_tag, PCI_COMMAND_STATUS_REG, cmdsts); 957 1.22 briggs 958 1.22 briggs if (PCI_CLASS(pa->pa_class) == PCI_CLASS_MASS_STORAGE && 959 1.22 briggs PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_RAID) 960 1.22 briggs sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_RAID; 961 1.22 briggs 962 1.1 bouyer interface = PCI_INTERFACE(pa->pa_class); 963 1.29 xtraeme 964 1.12 thorpej wdc_allocate_regs(&sc->sc_wdcdev); 965 1.12 thorpej 966 1.14 thorpej for (channel = 0; channel < sc->sc_wdcdev.sc_atac.atac_nchannels; 967 1.14 thorpej channel++) { 968 1.1 bouyer cp = &sc->pciide_channels[channel]; 969 1.1 bouyer if (pciide_chansetup(sc, channel, interface) == 0) 970 1.1 bouyer continue; 971 1.56 jakllsch pciide_mapchan(pa, cp, interface, pciide_pci_intr); 972 1.1 bouyer } 973 1.1 bouyer } 974 1.37 itohy 975 1.37 itohy static int 976 1.37 itohy piix_dma_init(void *v, int channel, int drive, void *databuf, 977 1.37 itohy size_t datalen, int flags) 978 1.37 itohy { 979 1.37 itohy 980 1.37 itohy /* use PIO for unaligned transfer */ 981 1.37 itohy if (((uintptr_t)databuf) & 0x1) 982 1.37 itohy return EINVAL; 983 1.37 itohy 984 1.37 itohy return pciide_dma_init(v, channel, drive, databuf, datalen, flags); 985 1.37 itohy } 986