1 1.32 andvar /* $NetBSD: pdcsata.c,v 1.32 2021/09/03 21:55:00 andvar Exp $ */ 2 1.1 bouyer 3 1.1 bouyer /* 4 1.1 bouyer * Copyright (c) 2004, 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.3 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.9 xtraeme #include <sys/cdefs.h> 28 1.32 andvar __KERNEL_RCSID(0, "$NetBSD: pdcsata.c,v 1.32 2021/09/03 21:55:00 andvar Exp $"); 29 1.9 xtraeme 30 1.1 bouyer #include <sys/types.h> 31 1.1 bouyer #include <sys/param.h> 32 1.1 bouyer #include <sys/systm.h> 33 1.1 bouyer 34 1.1 bouyer #include <dev/pci/pcivar.h> 35 1.1 bouyer #include <dev/pci/pcidevs.h> 36 1.1 bouyer #include <dev/pci/pciidereg.h> 37 1.1 bouyer #include <dev/pci/pciidevar.h> 38 1.4 christos #include <dev/ata/atareg.h> 39 1.4 christos #include <dev/ata/satavar.h> 40 1.4 christos #include <dev/ata/satareg.h> 41 1.1 bouyer 42 1.13 bouyer #define PDC203xx_SATA_NCHANNELS 4 43 1.13 bouyer #define PDC203xx_COMBO_NCHANNELS 3 44 1.13 bouyer #define PDC40718_SATA_NCHANNELS 4 45 1.13 bouyer #define PDC20575_COMBO_NCHANNELS 3 46 1.1 bouyer 47 1.1 bouyer #define PDC203xx_BAR_IDEREGS 0x1c /* BAR where the IDE registers are mapped */ 48 1.1 bouyer 49 1.7 christos #define PDC_CHANNELBASE(ch) 0x200 + ((ch) * 0x80) 50 1.7 christos #define PDC_ERRMASK 0x00780700 51 1.7 christos 52 1.13 bouyer #define PDC205_REGADDR(base,ch) ((base)+((ch)<<8)) 53 1.13 bouyer #define PDC205_SSTATUS(ch) PDC205_REGADDR(0x400,ch) 54 1.13 bouyer #define PDC205_SERROR(ch) PDC205_REGADDR(0x404,ch) 55 1.13 bouyer #define PDC205_SCONTROL(ch) PDC205_REGADDR(0x408,ch) 56 1.13 bouyer #define PDC205_MULTIPLIER(ch) PDC205_REGADDR(0x4e8,ch) 57 1.13 bouyer 58 1.20 dyoung static void pdcsata_chip_map(struct pciide_softc *, 59 1.20 dyoung const struct pci_attach_args *); 60 1.1 bouyer static void pdc203xx_setup_channel(struct ata_channel *); 61 1.1 bouyer static void pdc203xx_irqack(struct ata_channel *); 62 1.1 bouyer static int pdc203xx_dma_init(void *, int, int, void *, size_t, int); 63 1.1 bouyer static void pdc203xx_dma_start(void *,int ,int); 64 1.1 bouyer static int pdc203xx_dma_finish(void *, int, int, int); 65 1.13 bouyer static void pdc203xx_combo_probe(struct ata_channel *); 66 1.7 christos static int pdcsata_pci_intr(void *); 67 1.7 christos static void pdcsata_do_reset(struct ata_channel *, int); 68 1.1 bouyer 69 1.16 cube static int pdcsata_match(device_t, cfdata_t, void *); 70 1.16 cube static void pdcsata_attach(device_t, device_t, void *); 71 1.1 bouyer 72 1.16 cube CFATTACH_DECL_NEW(pdcsata, sizeof(struct pciide_softc), 73 1.26 jakllsch pdcsata_match, pdcsata_attach, pciide_detach, NULL); 74 1.1 bouyer 75 1.1 bouyer static const struct pciide_product_desc pciide_pdcsata_products[] = { 76 1.1 bouyer { PCI_PRODUCT_PROMISE_PDC20318, 77 1.1 bouyer 0, 78 1.1 bouyer "Promise PDC20318 SATA150 controller", 79 1.1 bouyer pdcsata_chip_map, 80 1.1 bouyer }, 81 1.1 bouyer { PCI_PRODUCT_PROMISE_PDC20319, 82 1.1 bouyer 0, 83 1.1 bouyer "Promise PDC20319 SATA150 controller", 84 1.1 bouyer pdcsata_chip_map, 85 1.1 bouyer }, 86 1.1 bouyer { PCI_PRODUCT_PROMISE_PDC20371, 87 1.1 bouyer 0, 88 1.1 bouyer "Promise PDC20371 SATA150 controller", 89 1.1 bouyer pdcsata_chip_map, 90 1.1 bouyer }, 91 1.1 bouyer { PCI_PRODUCT_PROMISE_PDC20375, 92 1.1 bouyer 0, 93 1.1 bouyer "Promise PDC20375 SATA150 controller", 94 1.1 bouyer pdcsata_chip_map, 95 1.1 bouyer }, 96 1.1 bouyer { PCI_PRODUCT_PROMISE_PDC20376, 97 1.1 bouyer 0, 98 1.1 bouyer "Promise PDC20376 SATA150 controller", 99 1.1 bouyer pdcsata_chip_map, 100 1.1 bouyer }, 101 1.1 bouyer { PCI_PRODUCT_PROMISE_PDC20377, 102 1.1 bouyer 0, 103 1.1 bouyer "Promise PDC20377 SATA150 controller", 104 1.1 bouyer pdcsata_chip_map, 105 1.1 bouyer }, 106 1.1 bouyer { PCI_PRODUCT_PROMISE_PDC20378, 107 1.1 bouyer 0, 108 1.1 bouyer "Promise PDC20378 SATA150 controller", 109 1.1 bouyer pdcsata_chip_map, 110 1.1 bouyer }, 111 1.1 bouyer { PCI_PRODUCT_PROMISE_PDC20379, 112 1.1 bouyer 0, 113 1.1 bouyer "Promise PDC20379 SATA150 controller", 114 1.1 bouyer pdcsata_chip_map, 115 1.1 bouyer }, 116 1.8 xtraeme { PCI_PRODUCT_PROMISE_PDC40518, 117 1.8 xtraeme 0, 118 1.11 xtraeme "Promise PDC40518 SATA150 controller", 119 1.11 xtraeme pdcsata_chip_map, 120 1.11 xtraeme }, 121 1.11 xtraeme { PCI_PRODUCT_PROMISE_PDC40519, 122 1.11 xtraeme 0, 123 1.11 xtraeme "Promise PDC40519 SATA 150 controller", 124 1.8 xtraeme pdcsata_chip_map, 125 1.8 xtraeme }, 126 1.4 christos { PCI_PRODUCT_PROMISE_PDC40718, 127 1.4 christos 0, 128 1.4 christos "Promise PDC40718 SATA300 controller", 129 1.4 christos pdcsata_chip_map, 130 1.4 christos }, 131 1.4 christos { PCI_PRODUCT_PROMISE_PDC40719, 132 1.4 christos 0, 133 1.4 christos "Promise PDC40719 SATA300 controller", 134 1.4 christos pdcsata_chip_map, 135 1.4 christos }, 136 1.11 xtraeme { PCI_PRODUCT_PROMISE_PDC40779, 137 1.11 xtraeme 0, 138 1.11 xtraeme "Promise PDC40779 SATA300 controller", 139 1.11 xtraeme pdcsata_chip_map, 140 1.11 xtraeme }, 141 1.6 bouyer { PCI_PRODUCT_PROMISE_PDC20571, 142 1.6 bouyer 0, 143 1.6 bouyer "Promise PDC20571 SATA150 controller", 144 1.6 bouyer pdcsata_chip_map, 145 1.6 bouyer }, 146 1.6 bouyer { PCI_PRODUCT_PROMISE_PDC20575, 147 1.6 bouyer 0, 148 1.6 bouyer "Promise PDC20575 SATA150 controller", 149 1.6 bouyer pdcsata_chip_map, 150 1.6 bouyer }, 151 1.6 bouyer { PCI_PRODUCT_PROMISE_PDC20579, 152 1.6 bouyer 0, 153 1.6 bouyer "Promise PDC20579 SATA150 controller", 154 1.6 bouyer pdcsata_chip_map, 155 1.6 bouyer }, 156 1.10 dsainty { PCI_PRODUCT_PROMISE_PDC20771, 157 1.10 dsainty 0, 158 1.10 dsainty "Promise PDC20771 SATA300 controller", 159 1.10 dsainty pdcsata_chip_map, 160 1.10 dsainty }, 161 1.8 xtraeme { PCI_PRODUCT_PROMISE_PDC20775, 162 1.8 xtraeme 0, 163 1.8 xtraeme "Promise PDC20775 SATA300 controller", 164 1.8 xtraeme pdcsata_chip_map, 165 1.8 xtraeme }, 166 1.13 bouyer { PCI_PRODUCT_PROMISE_PDC20617, 167 1.13 bouyer 0, 168 1.13 bouyer "Promise PDC2020617 Ultra/133 controller", 169 1.13 bouyer pdcsata_chip_map, 170 1.13 bouyer }, 171 1.13 bouyer { PCI_PRODUCT_PROMISE_PDC20618, 172 1.13 bouyer 0, 173 1.13 bouyer "Promise PDC20618 Ultra/133 controller", 174 1.13 bouyer pdcsata_chip_map, 175 1.13 bouyer }, 176 1.13 bouyer { PCI_PRODUCT_PROMISE_PDC20619, 177 1.13 bouyer 0, 178 1.13 bouyer "Promise PDC20619 Ultra/133 controller", 179 1.13 bouyer pdcsata_chip_map, 180 1.13 bouyer }, 181 1.13 bouyer { PCI_PRODUCT_PROMISE_PDC20620, 182 1.13 bouyer 0, 183 1.13 bouyer "Promise PDC20620 Ultra/133 controller", 184 1.13 bouyer pdcsata_chip_map, 185 1.13 bouyer }, 186 1.13 bouyer { PCI_PRODUCT_PROMISE_PDC20621, 187 1.13 bouyer 0, 188 1.13 bouyer "Promise PDC20621 Ultra/133 controller", 189 1.13 bouyer pdcsata_chip_map, 190 1.13 bouyer }, 191 1.1 bouyer { 0, 192 1.1 bouyer 0, 193 1.1 bouyer NULL, 194 1.1 bouyer NULL 195 1.1 bouyer } 196 1.1 bouyer }; 197 1.1 bouyer 198 1.1 bouyer static int 199 1.16 cube pdcsata_match(device_t parent, cfdata_t match, void *aux) 200 1.1 bouyer { 201 1.1 bouyer struct pci_attach_args *pa = aux; 202 1.1 bouyer 203 1.1 bouyer if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_PROMISE) { 204 1.1 bouyer if (pciide_lookup_product(pa->pa_id, pciide_pdcsata_products)) 205 1.1 bouyer return (2); 206 1.1 bouyer } 207 1.1 bouyer return (0); 208 1.1 bouyer } 209 1.1 bouyer 210 1.1 bouyer static void 211 1.16 cube pdcsata_attach(device_t parent, device_t self, void *aux) 212 1.1 bouyer { 213 1.1 bouyer struct pci_attach_args *pa = aux; 214 1.16 cube struct pciide_softc *sc = device_private(self); 215 1.16 cube 216 1.16 cube sc->sc_wdcdev.sc_atac.atac_dev = self; 217 1.1 bouyer 218 1.1 bouyer pciide_common_attach(sc, pa, 219 1.1 bouyer pciide_lookup_product(pa->pa_id, pciide_pdcsata_products)); 220 1.1 bouyer } 221 1.1 bouyer 222 1.1 bouyer static void 223 1.20 dyoung pdcsata_chip_map(struct pciide_softc *sc, const struct pci_attach_args *pa) 224 1.1 bouyer { 225 1.1 bouyer struct pciide_channel *cp; 226 1.1 bouyer struct ata_channel *wdc_cp; 227 1.1 bouyer struct wdc_regs *wdr; 228 1.1 bouyer int channel, i; 229 1.1 bouyer pci_intr_handle_t intrhandle; 230 1.1 bouyer const char *intrstr; 231 1.27 christos char intrbuf[PCI_INTRSTR_LEN]; 232 1.1 bouyer 233 1.1 bouyer /* 234 1.1 bouyer * Promise SATA controllers have 3 or 4 channels, 235 1.1 bouyer * the usual IDE registers are mapped in I/O space, with offsets. 236 1.1 bouyer */ 237 1.1 bouyer if (pci_intr_map(pa, &intrhandle) != 0) { 238 1.16 cube aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 239 1.16 cube "couldn't map interrupt\n"); 240 1.1 bouyer return; 241 1.1 bouyer } 242 1.30 jdolecek intrstr = pci_intr_string(pa->pa_pc, intrhandle, intrbuf, 243 1.30 jdolecek sizeof(intrbuf)); 244 1.30 jdolecek sc->sc_pci_ih = pci_intr_establish_xname(pa->pa_pc, 245 1.30 jdolecek intrhandle, IPL_BIO, pdcsata_pci_intr, sc, 246 1.30 jdolecek device_xname(sc->sc_wdcdev.sc_atac.atac_dev)); 247 1.4 christos 248 1.1 bouyer if (sc->sc_pci_ih == NULL) { 249 1.16 cube aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 250 1.16 cube "couldn't establish native-PCI interrupt"); 251 1.1 bouyer if (intrstr != NULL) 252 1.18 njoly aprint_error(" at %s", intrstr); 253 1.18 njoly aprint_error("\n"); 254 1.1 bouyer return; 255 1.1 bouyer } 256 1.16 cube aprint_normal_dev(sc->sc_wdcdev.sc_atac.atac_dev, 257 1.16 cube "interrupting at %s\n", 258 1.16 cube intrstr ? intrstr : "unknown interrupt"); 259 1.3 perry 260 1.1 bouyer sc->sc_dma_ok = (pci_mapreg_map(pa, PCIIDE_REG_BUS_MASTER_DMA, 261 1.1 bouyer PCI_MAPREG_MEM_TYPE_32BIT, 0, &sc->sc_dma_iot, 262 1.19 jakllsch &sc->sc_dma_ioh, NULL, &sc->sc_dma_ios) == 0); 263 1.1 bouyer if (!sc->sc_dma_ok) { 264 1.16 cube aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 265 1.16 cube "couldn't map bus-master DMA registers\n"); 266 1.1 bouyer pci_intr_disestablish(pa->pa_pc, sc->sc_pci_ih); 267 1.1 bouyer return; 268 1.1 bouyer } 269 1.1 bouyer 270 1.1 bouyer sc->sc_dmat = pa->pa_dmat; 271 1.1 bouyer 272 1.1 bouyer if (pci_mapreg_map(pa, PDC203xx_BAR_IDEREGS, 273 1.1 bouyer PCI_MAPREG_MEM_TYPE_32BIT, 0, &sc->sc_ba5_st, 274 1.19 jakllsch &sc->sc_ba5_sh, NULL, &sc->sc_ba5_ss) != 0) { 275 1.16 cube aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 276 1.16 cube "couldn't map IDE registers\n"); 277 1.19 jakllsch bus_space_unmap(sc->sc_dma_iot, sc->sc_dma_ioh, sc->sc_dma_ios); 278 1.1 bouyer pci_intr_disestablish(pa->pa_pc, sc->sc_pci_ih); 279 1.1 bouyer return; 280 1.1 bouyer } 281 1.1 bouyer 282 1.16 cube aprint_verbose_dev(sc->sc_wdcdev.sc_atac.atac_dev, 283 1.16 cube "bus-master DMA support present\n"); 284 1.1 bouyer sc->sc_wdcdev.sc_atac.atac_cap = ATAC_CAP_DATA16; 285 1.1 bouyer if (sc->sc_dma_ok) { 286 1.1 bouyer sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DMA | ATAC_CAP_UDMA; 287 1.1 bouyer } 288 1.2 bouyer if (PCI_CLASS(pa->pa_class) == PCI_CLASS_MASS_STORAGE && 289 1.2 bouyer PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_RAID) 290 1.2 bouyer sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_RAID; 291 1.1 bouyer sc->sc_wdcdev.irqack = pdc203xx_irqack; 292 1.1 bouyer sc->sc_wdcdev.sc_atac.atac_pio_cap = 4; 293 1.1 bouyer sc->sc_wdcdev.sc_atac.atac_dma_cap = 2; 294 1.1 bouyer sc->sc_wdcdev.sc_atac.atac_udma_cap = 6; 295 1.1 bouyer sc->sc_wdcdev.sc_atac.atac_set_modes = pdc203xx_setup_channel; 296 1.1 bouyer sc->sc_wdcdev.sc_atac.atac_channels = sc->wdc_chanarray; 297 1.25 bouyer sc->sc_wdcdev.wdc_maxdrives = 2; 298 1.4 christos 299 1.7 christos sc->sc_wdcdev.reset = pdcsata_do_reset; 300 1.7 christos 301 1.4 christos switch (sc->sc_pp->ide_product) { 302 1.4 christos case PCI_PRODUCT_PROMISE_PDC20318: 303 1.4 christos case PCI_PRODUCT_PROMISE_PDC20319: 304 1.13 bouyer bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, 0x6c, 305 1.13 bouyer 0x00ff0033); 306 1.13 bouyer sc->sc_wdcdev.sc_atac.atac_probe = wdc_sataprobe; 307 1.13 bouyer sc->sc_wdcdev.sc_atac.atac_nchannels = PDC203xx_SATA_NCHANNELS; 308 1.25 bouyer sc->sc_wdcdev.wdc_maxdrives = 1; 309 1.13 bouyer break; 310 1.4 christos case PCI_PRODUCT_PROMISE_PDC20371: 311 1.4 christos case PCI_PRODUCT_PROMISE_PDC20375: 312 1.4 christos case PCI_PRODUCT_PROMISE_PDC20376: 313 1.4 christos case PCI_PRODUCT_PROMISE_PDC20377: 314 1.4 christos case PCI_PRODUCT_PROMISE_PDC20378: 315 1.4 christos case PCI_PRODUCT_PROMISE_PDC20379: 316 1.13 bouyer bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, 0x6c, 317 1.13 bouyer 0x00ff0033); 318 1.13 bouyer sc->sc_wdcdev.sc_atac.atac_probe = pdc203xx_combo_probe; 319 1.13 bouyer sc->sc_wdcdev.sc_atac.atac_nchannels = PDC203xx_COMBO_NCHANNELS; 320 1.4 christos break; 321 1.4 christos 322 1.8 xtraeme case PCI_PRODUCT_PROMISE_PDC40518: 323 1.11 xtraeme case PCI_PRODUCT_PROMISE_PDC40519: 324 1.4 christos case PCI_PRODUCT_PROMISE_PDC40718: 325 1.4 christos case PCI_PRODUCT_PROMISE_PDC40719: 326 1.11 xtraeme case PCI_PRODUCT_PROMISE_PDC40779: 327 1.13 bouyer bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, 0x60, 328 1.13 bouyer 0x00ff00ff); 329 1.13 bouyer sc->sc_wdcdev.sc_atac.atac_nchannels = PDC40718_SATA_NCHANNELS; 330 1.13 bouyer sc->sc_wdcdev.sc_atac.atac_probe = wdc_sataprobe; 331 1.25 bouyer sc->sc_wdcdev.wdc_maxdrives = 1; 332 1.13 bouyer break; 333 1.13 bouyer 334 1.6 bouyer case PCI_PRODUCT_PROMISE_PDC20571: 335 1.6 bouyer case PCI_PRODUCT_PROMISE_PDC20575: 336 1.6 bouyer case PCI_PRODUCT_PROMISE_PDC20579: 337 1.10 dsainty case PCI_PRODUCT_PROMISE_PDC20771: 338 1.8 xtraeme case PCI_PRODUCT_PROMISE_PDC20775: 339 1.13 bouyer bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, 0x60, 340 1.13 bouyer 0x00ff00ff); 341 1.13 bouyer sc->sc_wdcdev.sc_atac.atac_nchannels = PDC20575_COMBO_NCHANNELS; 342 1.13 bouyer sc->sc_wdcdev.sc_atac.atac_probe = pdc203xx_combo_probe; 343 1.13 bouyer break; 344 1.6 bouyer 345 1.13 bouyer case PCI_PRODUCT_PROMISE_PDC20617: 346 1.13 bouyer case PCI_PRODUCT_PROMISE_PDC20618: 347 1.13 bouyer case PCI_PRODUCT_PROMISE_PDC20619: 348 1.13 bouyer case PCI_PRODUCT_PROMISE_PDC20620: 349 1.13 bouyer case PCI_PRODUCT_PROMISE_PDC20621: 350 1.13 bouyer sc->sc_wdcdev.sc_atac.atac_nchannels = 351 1.13 bouyer ((bus_space_read_4(sc->sc_ba5_st, sc->sc_ba5_sh, 352 1.13 bouyer 0x48) & 0x01) ? 1 : 0) + 353 1.13 bouyer ((bus_space_read_4(sc->sc_ba5_st, sc->sc_ba5_sh, 354 1.13 bouyer 0x48) & 0x02) ? 1 : 0) + 355 1.13 bouyer 2; 356 1.13 bouyer sc->sc_wdcdev.sc_atac.atac_probe = wdc_drvprobe; 357 1.6 bouyer 358 1.31 mrg /* FALLTHROUGH */ 359 1.13 bouyer default: 360 1.13 bouyer aprint_error("unknown promise product 0x%x\n", 361 1.13 bouyer sc->sc_pp->ide_product); 362 1.4 christos } 363 1.4 christos 364 1.1 bouyer wdc_allocate_regs(&sc->sc_wdcdev); 365 1.1 bouyer 366 1.1 bouyer sc->sc_wdcdev.dma_arg = sc; 367 1.1 bouyer sc->sc_wdcdev.dma_init = pdc203xx_dma_init; 368 1.1 bouyer sc->sc_wdcdev.dma_start = pdc203xx_dma_start; 369 1.1 bouyer sc->sc_wdcdev.dma_finish = pdc203xx_dma_finish; 370 1.1 bouyer 371 1.1 bouyer for (channel = 0; channel < sc->sc_wdcdev.sc_atac.atac_nchannels; 372 1.1 bouyer channel++) { 373 1.1 bouyer cp = &sc->pciide_channels[channel]; 374 1.1 bouyer sc->wdc_chanarray[channel] = &cp->ata_channel; 375 1.1 bouyer 376 1.1 bouyer cp->ih = sc->sc_pci_ih; 377 1.1 bouyer cp->name = NULL; 378 1.1 bouyer cp->ata_channel.ch_channel = channel; 379 1.1 bouyer cp->ata_channel.ch_atac = &sc->sc_wdcdev.sc_atac; 380 1.29 jdolecek 381 1.1 bouyer wdc_cp = &cp->ata_channel; 382 1.1 bouyer wdr = CHAN_TO_WDC_REGS(wdc_cp); 383 1.1 bouyer 384 1.1 bouyer wdr->ctl_iot = sc->sc_ba5_st; 385 1.1 bouyer wdr->cmd_iot = sc->sc_ba5_st; 386 1.1 bouyer 387 1.1 bouyer if (bus_space_subregion(sc->sc_ba5_st, sc->sc_ba5_sh, 388 1.1 bouyer 0x0238 + (channel << 7), 1, &wdr->ctl_ioh) != 0) { 389 1.16 cube aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 390 1.16 cube "couldn't map channel %d ctl regs\n", channel); 391 1.1 bouyer goto next_channel; 392 1.1 bouyer } 393 1.1 bouyer for (i = 0; i < WDC_NREG; i++) { 394 1.1 bouyer if (bus_space_subregion(sc->sc_ba5_st, sc->sc_ba5_sh, 395 1.1 bouyer 0x0200 + (i << 2) + (channel << 7), i == 0 ? 4 : 1, 396 1.1 bouyer &wdr->cmd_iohs[i]) != 0) { 397 1.16 cube aprint_error_dev(sc->sc_wdcdev.sc_atac.atac_dev, 398 1.16 cube "couldn't map channel %d cmd regs\n", 399 1.1 bouyer channel); 400 1.1 bouyer goto next_channel; 401 1.1 bouyer } 402 1.1 bouyer } 403 1.28 jdolecek wdc_init_shadow_regs(wdr); 404 1.1 bouyer 405 1.1 bouyer /* 406 1.1 bouyer * subregion de busmaster registers. They're spread all over 407 1.1 bouyer * the controller's register space :(. They are also 4 bytes 408 1.32 andvar * sized, with some specific extensions in the extra bits. 409 1.1 bouyer * It also seems that the IDEDMA_CTL register isn't available. 410 1.1 bouyer */ 411 1.1 bouyer if (bus_space_subregion(sc->sc_ba5_st, sc->sc_ba5_sh, 412 1.1 bouyer 0x260 + (channel << 7), 1, 413 1.1 bouyer &cp->dma_iohs[IDEDMA_CMD]) != 0) { 414 1.1 bouyer aprint_normal("%s channel %d: can't subregion DMA " 415 1.1 bouyer "registers\n", 416 1.16 cube device_xname(sc->sc_wdcdev.sc_atac.atac_dev), 417 1.16 cube channel); 418 1.1 bouyer goto next_channel; 419 1.1 bouyer } 420 1.1 bouyer if (bus_space_subregion(sc->sc_ba5_st, sc->sc_ba5_sh, 421 1.1 bouyer 0x244 + (channel << 7), 4, 422 1.1 bouyer &cp->dma_iohs[IDEDMA_TBL]) != 0) { 423 1.1 bouyer aprint_normal("%s channel %d: can't subregion DMA " 424 1.1 bouyer "registers\n", 425 1.16 cube device_xname(sc->sc_wdcdev.sc_atac.atac_dev), 426 1.16 cube channel); 427 1.1 bouyer goto next_channel; 428 1.1 bouyer } 429 1.1 bouyer 430 1.13 bouyer /* subregion the SATA registers */ 431 1.13 bouyer if (sc->sc_wdcdev.sc_atac.atac_probe == wdc_sataprobe || 432 1.13 bouyer (sc->sc_wdcdev.sc_atac.atac_probe == pdc203xx_combo_probe 433 1.13 bouyer && channel < 2)) { 434 1.13 bouyer wdr->sata_iot = sc->sc_ba5_st; 435 1.13 bouyer wdr->sata_baseioh = sc->sc_ba5_sh; 436 1.13 bouyer if (bus_space_subregion(sc->sc_ba5_st, sc->sc_ba5_sh, 437 1.13 bouyer PDC205_SSTATUS(channel), 1, 438 1.13 bouyer &wdr->sata_status) != 0) { 439 1.16 cube aprint_error_dev( 440 1.16 cube sc->sc_wdcdev.sc_atac.atac_dev, 441 1.16 cube "couldn't map channel %d " 442 1.16 cube "sata_status regs\n", channel); 443 1.13 bouyer goto next_channel; 444 1.13 bouyer } 445 1.13 bouyer if (bus_space_subregion(sc->sc_ba5_st, sc->sc_ba5_sh, 446 1.13 bouyer PDC205_SERROR(channel), 1, &wdr->sata_error) != 0) { 447 1.16 cube aprint_error_dev( 448 1.16 cube sc->sc_wdcdev.sc_atac.atac_dev, 449 1.16 cube "couldn't map channel %d " 450 1.16 cube "sata_error regs\n", channel); 451 1.13 bouyer goto next_channel; 452 1.13 bouyer } 453 1.13 bouyer if (bus_space_subregion(sc->sc_ba5_st, sc->sc_ba5_sh, 454 1.13 bouyer PDC205_SCONTROL(channel), 1, 455 1.13 bouyer &wdr->sata_control) != 0) { 456 1.16 cube aprint_error_dev( 457 1.16 cube sc->sc_wdcdev.sc_atac.atac_dev, 458 1.16 cube "couldn't map channel %d " 459 1.16 cube "sata_control regs\n", channel); 460 1.13 bouyer goto next_channel; 461 1.13 bouyer } 462 1.13 bouyer } 463 1.13 bouyer 464 1.1 bouyer wdcattach(wdc_cp); 465 1.1 bouyer bus_space_write_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CMD], 0, 466 1.1 bouyer (bus_space_read_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CMD], 467 1.1 bouyer 0) & ~0x00003f9f) | (channel + 1)); 468 1.1 bouyer bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, 469 1.1 bouyer (channel + 1) << 2, 0x00000001); 470 1.1 bouyer next_channel: 471 1.1 bouyer continue; 472 1.1 bouyer } 473 1.1 bouyer return; 474 1.1 bouyer } 475 1.1 bouyer 476 1.1 bouyer static void 477 1.13 bouyer pdc203xx_combo_probe(struct ata_channel *chp) 478 1.13 bouyer { 479 1.13 bouyer if (chp->ch_channel < 2) 480 1.13 bouyer wdc_sataprobe(chp); 481 1.13 bouyer else 482 1.13 bouyer wdc_drvprobe(chp); 483 1.13 bouyer } 484 1.13 bouyer 485 1.13 bouyer static void 486 1.1 bouyer pdc203xx_setup_channel(struct ata_channel *chp) 487 1.1 bouyer { 488 1.1 bouyer struct ata_drive_datas *drvp; 489 1.1 bouyer int drive, s; 490 1.1 bouyer struct pciide_channel *cp = CHAN_TO_PCHAN(chp); 491 1.1 bouyer 492 1.1 bouyer pciide_channel_dma_setup(cp); 493 1.1 bouyer 494 1.1 bouyer for (drive = 0; drive < 2; drive++) { 495 1.1 bouyer drvp = &chp->ch_drive[drive]; 496 1.25 bouyer if (drvp->drive_type == ATA_DRIVET_NONE) 497 1.1 bouyer continue; 498 1.25 bouyer if (drvp->drive_flags & ATA_DRIVE_UDMA) { 499 1.1 bouyer s = splbio(); 500 1.25 bouyer drvp->drive_flags &= ~ATA_DRIVE_DMA; 501 1.1 bouyer splx(s); 502 1.1 bouyer } 503 1.1 bouyer } 504 1.1 bouyer } 505 1.1 bouyer 506 1.1 bouyer static int 507 1.7 christos pdcsata_pci_intr(void *arg) 508 1.1 bouyer { 509 1.1 bouyer struct pciide_softc *sc = arg; 510 1.1 bouyer struct pciide_channel *cp; 511 1.1 bouyer struct ata_channel *wdc_cp; 512 1.3 perry int i, rv, crv; 513 1.7 christos u_int32_t scr, status, chanbase; 514 1.4 christos 515 1.4 christos rv = 0; 516 1.4 christos scr = bus_space_read_4(sc->sc_ba5_st, sc->sc_ba5_sh, 0x40); 517 1.7 christos if (scr == 0xffffffff) return(rv); 518 1.4 christos bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, 0x40, scr & 0x0000ffff); 519 1.7 christos scr = scr & 0x0000ffff; 520 1.7 christos if (!scr) return(rv); 521 1.4 christos 522 1.4 christos for (i = 0; i < sc->sc_wdcdev.sc_atac.atac_nchannels; i++) { 523 1.4 christos cp = &sc->pciide_channels[i]; 524 1.4 christos wdc_cp = &cp->ata_channel; 525 1.4 christos if (scr & (1 << (i + 1))) { 526 1.7 christos chanbase = PDC_CHANNELBASE(i) + 0x48; 527 1.7 christos status = bus_space_read_4(sc->sc_ba5_st, sc->sc_ba5_sh, chanbase); 528 1.7 christos if (status & PDC_ERRMASK) { 529 1.7 christos chanbase = PDC_CHANNELBASE(i) + 0x60; 530 1.7 christos status = bus_space_read_4(sc->sc_ba5_st, sc->sc_ba5_sh, chanbase); 531 1.7 christos status |= 0x800; 532 1.7 christos bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, chanbase, status); 533 1.7 christos status &= ~0x800; 534 1.7 christos bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, chanbase, status); 535 1.7 christos status = bus_space_read_4(sc->sc_ba5_st, sc->sc_ba5_sh, chanbase); 536 1.7 christos continue; 537 1.7 christos } 538 1.4 christos crv = wdcintr(wdc_cp); 539 1.4 christos if (crv == 0) { 540 1.16 cube aprint_error("%s:%d: bogus intr (reg 0x%x)\n", 541 1.16 cube device_xname( 542 1.16 cube sc->sc_wdcdev.sc_atac.atac_dev), i, scr); 543 1.4 christos } else 544 1.4 christos rv = 1; 545 1.4 christos } 546 1.4 christos } 547 1.4 christos return rv; 548 1.4 christos } 549 1.4 christos 550 1.1 bouyer static void 551 1.1 bouyer pdc203xx_irqack(struct ata_channel *chp) 552 1.1 bouyer { 553 1.1 bouyer struct pciide_channel *cp = CHAN_TO_PCHAN(chp); 554 1.1 bouyer struct pciide_softc *sc = CHAN_TO_PCIIDE(chp); 555 1.1 bouyer 556 1.1 bouyer bus_space_write_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CMD], 0, 557 1.1 bouyer (bus_space_read_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CMD], 558 1.1 bouyer 0) & ~0x00003f9f) | (cp->ata_channel.ch_channel + 1)); 559 1.1 bouyer bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, 560 1.1 bouyer (cp->ata_channel.ch_channel + 1) << 2, 0x00000001); 561 1.1 bouyer } 562 1.1 bouyer 563 1.1 bouyer static int 564 1.1 bouyer pdc203xx_dma_init(void *v, int channel, int drive, void *databuf, 565 1.1 bouyer size_t datalen, int flags) 566 1.1 bouyer { 567 1.1 bouyer struct pciide_softc *sc = v; 568 1.1 bouyer 569 1.1 bouyer return pciide_dma_dmamap_setup(sc, channel, drive, 570 1.1 bouyer databuf, datalen, flags); 571 1.1 bouyer } 572 1.1 bouyer 573 1.1 bouyer static void 574 1.1 bouyer pdc203xx_dma_start(void *v, int channel, int drive) 575 1.1 bouyer { 576 1.1 bouyer struct pciide_softc *sc = v; 577 1.1 bouyer struct pciide_channel *cp = &sc->pciide_channels[channel]; 578 1.1 bouyer struct pciide_dma_maps *dma_maps = &cp->dma_maps[drive]; 579 1.1 bouyer 580 1.1 bouyer /* Write table addr */ 581 1.1 bouyer bus_space_write_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_TBL], 0, 582 1.1 bouyer dma_maps->dmamap_table->dm_segs[0].ds_addr); 583 1.1 bouyer /* start DMA engine */ 584 1.1 bouyer bus_space_write_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CMD], 0, 585 1.1 bouyer (bus_space_read_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CMD], 586 1.1 bouyer 0) & ~0xc0) | ((dma_maps->dma_flags & WDC_DMA_READ) ? 0x80 : 0xc0)); 587 1.1 bouyer } 588 1.1 bouyer 589 1.1 bouyer static int 590 1.14 christos pdc203xx_dma_finish(void *v, int channel, int drive, int force) 591 1.1 bouyer { 592 1.1 bouyer struct pciide_softc *sc = v; 593 1.1 bouyer struct pciide_channel *cp = &sc->pciide_channels[channel]; 594 1.1 bouyer struct pciide_dma_maps *dma_maps = &cp->dma_maps[drive]; 595 1.1 bouyer 596 1.1 bouyer /* stop DMA channel */ 597 1.1 bouyer bus_space_write_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CMD], 0, 598 1.1 bouyer (bus_space_read_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CMD], 599 1.1 bouyer 0) & ~0x80)); 600 1.1 bouyer 601 1.1 bouyer /* Unload the map of the data buffer */ 602 1.1 bouyer bus_dmamap_sync(sc->sc_dmat, dma_maps->dmamap_xfer, 0, 603 1.1 bouyer dma_maps->dmamap_xfer->dm_mapsize, 604 1.1 bouyer (dma_maps->dma_flags & WDC_DMA_READ) ? 605 1.1 bouyer BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE); 606 1.1 bouyer bus_dmamap_unload(sc->sc_dmat, dma_maps->dmamap_xfer); 607 1.1 bouyer 608 1.1 bouyer return 0; 609 1.1 bouyer } 610 1.4 christos 611 1.4 christos 612 1.4 christos static void 613 1.7 christos pdcsata_do_reset(struct ata_channel *chp, int poll) 614 1.4 christos { 615 1.4 christos struct pciide_softc *sc = CHAN_TO_PCIIDE(chp); 616 1.7 christos int reset, status, i, chanbase; 617 1.7 christos 618 1.7 christos /* reset SATA */ 619 1.7 christos reset = (1 << 11); 620 1.7 christos chanbase = PDC_CHANNELBASE(chp->ch_channel) + 0x60; 621 1.7 christos for (i = 0; i < 11;i ++) { 622 1.7 christos status = bus_space_read_4(sc->sc_ba5_st, sc->sc_ba5_sh, chanbase); 623 1.7 christos if (status & reset) break; 624 1.7 christos delay(100); 625 1.7 christos status |= reset; 626 1.7 christos bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, chanbase, status); 627 1.7 christos } 628 1.7 christos status = bus_space_read_4(sc->sc_ba5_st, sc->sc_ba5_sh, chanbase); 629 1.7 christos status &= ~reset; 630 1.7 christos bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, chanbase, status); 631 1.7 christos status = bus_space_read_4(sc->sc_ba5_st, sc->sc_ba5_sh, chanbase); 632 1.4 christos 633 1.4 christos wdc_do_reset(chp, poll); 634 1.4 christos } 635