Lines Matching +full:pio +full:- +full:mode

1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
32 * Mac-io ATA controller
48 #include <dev/ata/ata-all.h>
89 { 600, 180 }, /* PIO 0 */
90 { 390, 150 }, /* PIO 1 */
91 { 240, 105 }, /* PIO 2 */
92 { 180, 90 }, /* PIO 3 */
93 { 120, 75 } /* PIO 4 */
114 static int ata_macio_setmode(device_t dev, int target, int mode);
167 if (strcmp(name,"ata-4") == 0) { in ata_macio_probe()
169 sc->rev = 4; in ata_macio_probe()
170 sc->max_mode = ATA_UDMA4; in ata_macio_probe()
173 sc->rev = 3; in ata_macio_probe()
174 sc->max_mode = ATA_WDMA2; in ata_macio_probe()
193 ch = &sc->sc_ch.sc_ch; in ata_macio_attach()
194 sc->sc_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, in ata_macio_attach()
196 if (sc->sc_mem == NULL) { in ata_macio_attach()
205 ch->r_io[i].res = sc->sc_mem; in ata_macio_attach()
206 ch->r_io[i].offset = i * ATA_MACIO_REGGAP; in ata_macio_attach()
208 ch->r_io[ATA_CONTROL].res = sc->sc_mem; in ata_macio_attach()
209 ch->r_io[ATA_CONTROL].offset = ATA_MACIO_ALTOFFSET; in ata_macio_attach()
212 ch->unit = 0; in ata_macio_attach()
213 ch->flags |= ATA_USE_16BIT | ATA_NO_ATAPI_DMA; in ata_macio_attach()
224 sc->sc_ch.dbdma_rid = 1; in ata_macio_attach()
225 sc->sc_ch.dbdma_regs = bus_alloc_resource_any(dev, SYS_RES_MEMORY, in ata_macio_attach()
226 &sc->sc_ch.dbdma_rid, RF_ACTIVE); in ata_macio_attach()
231 timingreg = bus_read_4(sc->sc_mem, ATA_MACIO_TIMINGREG); in ata_macio_attach()
232 if (sc->rev == 4) { in ata_macio_attach()
233 sc->udmaconf[0] = sc->udmaconf[1] = timingreg & 0x1ff00000; in ata_macio_attach()
234 sc->wdmaconf[0] = sc->wdmaconf[1] = timingreg & 0x001ffc00; in ata_macio_attach()
235 sc->pioconf[0] = sc->pioconf[1] = timingreg & 0x000003ff; in ata_macio_attach()
237 sc->udmaconf[0] = sc->udmaconf[1] = 0; in ata_macio_attach()
238 sc->wdmaconf[0] = sc->wdmaconf[1] = timingreg & 0xfffff800; in ata_macio_attach()
239 sc->pioconf[0] = sc->pioconf[1] = timingreg & 0x000007ff; in ata_macio_attach()
253 sc->sc_ch.sc_ch.hw.begin_transaction = ata_macio_begin_transaction; in ata_macio_attach()
259 ata_macio_setmode(device_t dev, int target, int mode) in ata_macio_setmode() argument
266 mode = min(mode, sc->max_mode); in ata_macio_setmode()
268 if ((mode & ATA_DMA_MASK) == ATA_UDMA0) { in ata_macio_setmode()
269 min_cycle = udma_timings[mode & ATA_MODE_MASK].cycle; in ata_macio_setmode()
270 min_active = udma_timings[mode & ATA_MODE_MASK].active; in ata_macio_setmode()
272 cycle_tick = ATA_TIME_TO_TICK(sc->rev,min_cycle); in ata_macio_setmode()
273 act_tick = ATA_TIME_TO_TICK(sc->rev,min_active); in ata_macio_setmode()
276 sc->udmaconf[target] = in ata_macio_setmode()
278 } else if ((mode & ATA_DMA_MASK) == ATA_WDMA0) { in ata_macio_setmode()
279 min_cycle = dma_timings[mode & ATA_MODE_MASK].cycle; in ata_macio_setmode()
280 min_active = dma_timings[mode & ATA_MODE_MASK].active; in ata_macio_setmode()
282 cycle_tick = ATA_TIME_TO_TICK(sc->rev,min_cycle); in ata_macio_setmode()
283 act_tick = ATA_TIME_TO_TICK(sc->rev,min_active); in ata_macio_setmode()
285 if (sc->rev == 4) { in ata_macio_setmode()
286 inact_tick = cycle_tick - act_tick; in ata_macio_setmode()
288 sc->wdmaconf[target] = in ata_macio_setmode()
291 inact_tick = cycle_tick - act_tick - DMA_REC_OFFSET; in ata_macio_setmode()
297 sc->wdmaconf[target] = (half_tick << 21) in ata_macio_setmode()
302 pio_timings[(mode & ATA_MODE_MASK) - ATA_PIO0].cycle; in ata_macio_setmode()
304 pio_timings[(mode & ATA_MODE_MASK) - ATA_PIO0].active; in ata_macio_setmode()
306 cycle_tick = ATA_TIME_TO_TICK(sc->rev,min_cycle); in ata_macio_setmode()
307 act_tick = ATA_TIME_TO_TICK(sc->rev,min_active); in ata_macio_setmode()
309 if (sc->rev == 4) { in ata_macio_setmode()
310 inact_tick = cycle_tick - act_tick; in ata_macio_setmode()
313 sc->pioconf[target] = in ata_macio_setmode()
319 inact_tick = cycle_tick - act_tick - PIO_REC_OFFSET; in ata_macio_setmode()
324 sc->pioconf[target] = in ata_macio_setmode()
329 return (mode); in ata_macio_setmode()
335 struct ata_macio_softc *sc = device_get_softc(request->parent); in ata_macio_begin_transaction()
337 bus_write_4(sc->sc_mem, ATA_MACIO_TIMINGREG, in ata_macio_begin_transaction()
338 sc->udmaconf[request->unit] | sc->wdmaconf[request->unit] in ata_macio_begin_transaction()
339 | sc->pioconf[request->unit]); in ata_macio_begin_transaction()
350 if (!ch->sc_ch.attached) in ata_macio_suspend()
354 dbdma_save_state(ch->dbdma); in ata_macio_suspend()
365 if (!ch->sc_ch.attached) in ata_macio_resume()
368 dbdma_restore_state(ch->dbdma); in ata_macio_resume()