1 1.8 thorpej /* $NetBSD: atppc_isadma.c,v 1.8 2022/09/25 17:09:36 thorpej Exp $ */ 2 1.1 jdolecek 3 1.1 jdolecek /*- 4 1.1 jdolecek * Copyright (c) 2001 Alcove - Nicolas Souchu 5 1.1 jdolecek * All rights reserved. 6 1.1 jdolecek * 7 1.1 jdolecek * Redistribution and use in source and binary forms, with or without 8 1.1 jdolecek * modification, are permitted provided that the following conditions 9 1.1 jdolecek * are met: 10 1.1 jdolecek * 1. Redistributions of source code must retain the above copyright 11 1.1 jdolecek * notice, this list of conditions and the following disclaimer. 12 1.1 jdolecek * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 jdolecek * notice, this list of conditions and the following disclaimer in the 14 1.1 jdolecek * documentation and/or other materials provided with the distribution. 15 1.1 jdolecek * 16 1.1 jdolecek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 1.1 jdolecek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 1.1 jdolecek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 1.1 jdolecek * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 1.1 jdolecek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 1.1 jdolecek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 1.1 jdolecek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 1.1 jdolecek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 1.1 jdolecek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 1.1 jdolecek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 1.1 jdolecek * SUCH DAMAGE. 27 1.1 jdolecek * 28 1.1 jdolecek * FreeBSD: src/sys/isa/ppc.c,v 1.26.2.5 2001/10/02 05:21:45 nsouch Exp 29 1.1 jdolecek * 30 1.1 jdolecek */ 31 1.1 jdolecek 32 1.1 jdolecek #include <sys/cdefs.h> 33 1.8 thorpej __KERNEL_RCSID(0, "$NetBSD: atppc_isadma.c,v 1.8 2022/09/25 17:09:36 thorpej Exp $"); 34 1.1 jdolecek 35 1.1 jdolecek #include "opt_atppc.h" 36 1.1 jdolecek 37 1.1 jdolecek #include <sys/param.h> 38 1.1 jdolecek #include <sys/systm.h> 39 1.1 jdolecek #include <sys/kernel.h> 40 1.1 jdolecek #include <sys/device.h> 41 1.1 jdolecek 42 1.5 ad #include <sys/intr.h> 43 1.5 ad #include <sys/bus.h> 44 1.1 jdolecek 45 1.1 jdolecek #include <dev/ic/atppcreg.h> 46 1.1 jdolecek #include <dev/ic/atppcvar.h> 47 1.1 jdolecek 48 1.1 jdolecek #include <dev/isa/isadmavar.h> 49 1.1 jdolecek #include <dev/isa/isareg.h> 50 1.1 jdolecek #include <dev/isa/isavar.h> 51 1.1 jdolecek 52 1.1 jdolecek #include <dev/isa/atppc_isadma.h> 53 1.1 jdolecek 54 1.1 jdolecek /* Enable DMA */ 55 1.2 perry int 56 1.1 jdolecek atppc_isadma_setup(struct atppc_softc * lsc, isa_chipset_tag_t ic, int drq) 57 1.1 jdolecek { 58 1.1 jdolecek int error = 1; 59 1.1 jdolecek 60 1.1 jdolecek /* Reserve DRQ */ 61 1.1 jdolecek if (isa_drq_alloc(ic, drq)) { 62 1.1 jdolecek ATPPC_DPRINTF(("%s(%s): cannot reserve DRQ line.\n", __func__, 63 1.7 cegger device_xname(lsc->sc_dev))); 64 1.1 jdolecek return error; 65 1.1 jdolecek } 66 1.1 jdolecek 67 1.1 jdolecek /* Get maximum DMA size for isa bus */ 68 1.1 jdolecek lsc->sc_dma_maxsize = isa_dmamaxsize(ic, drq); 69 1.1 jdolecek 70 1.1 jdolecek /* Create dma mapping */ 71 1.2 perry error = isa_dmamap_create(ic, drq, lsc->sc_dma_maxsize, 72 1.1 jdolecek BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW); 73 1.2 perry 74 1.1 jdolecek return error; 75 1.1 jdolecek } 76 1.1 jdolecek 77 1.1 jdolecek /* Start DMA operation over ISA bus */ 78 1.2 perry int 79 1.4 christos atppc_isadma_start(isa_chipset_tag_t ic, int drq, void *buf, u_int nbytes, 80 1.1 jdolecek u_int8_t mode) 81 1.1 jdolecek { 82 1.2 perry return (isa_dmastart(ic, drq, buf, nbytes, NULL, 83 1.2 perry ((mode == ATPPC_DMA_MODE_WRITE) ? DMAMODE_WRITE : 84 1.2 perry DMAMODE_READ) | DMAMODE_DEMAND, ((mode == ATPPC_DMA_MODE_WRITE) 85 1.1 jdolecek ? BUS_DMA_WRITE : BUS_DMA_READ) | BUS_DMA_NOWAIT)); 86 1.1 jdolecek } 87 1.1 jdolecek 88 1.1 jdolecek /* Stop DMA operation over ISA bus */ 89 1.2 perry int 90 1.1 jdolecek atppc_isadma_finish(isa_chipset_tag_t ic, int drq) 91 1.1 jdolecek { 92 1.1 jdolecek isa_dmadone(ic, drq); 93 1.1 jdolecek return 0; 94 1.1 jdolecek } 95 1.1 jdolecek 96 1.1 jdolecek /* Abort DMA operation over ISA bus */ 97 1.2 perry int 98 1.1 jdolecek atppc_isadma_abort(isa_chipset_tag_t ic, int drq) 99 1.1 jdolecek { 100 1.1 jdolecek isa_dmaabort(ic, drq); 101 1.1 jdolecek return 0; 102 1.1 jdolecek } 103 1.1 jdolecek 104 1.2 perry /* Allocate memory for DMA over ISA bus */ 105 1.1 jdolecek int 106 1.4 christos atppc_isadma_malloc(isa_chipset_tag_t ic, int drq, void **buf, bus_addr_t *bus_addr, bus_size_t size) 107 1.1 jdolecek { 108 1.1 jdolecek int error; 109 1.1 jdolecek 110 1.1 jdolecek error = isa_dmamem_alloc(ic, drq, size, bus_addr, BUS_DMA_WAITOK); 111 1.1 jdolecek if (error) 112 1.1 jdolecek return error; 113 1.1 jdolecek 114 1.1 jdolecek error = isa_dmamem_map(ic, drq, *bus_addr, size, buf, BUS_DMA_WAITOK); 115 1.1 jdolecek if (error) 116 1.1 jdolecek isa_dmamem_free(ic, drq, *bus_addr, size); 117 1.1 jdolecek 118 1.1 jdolecek return error; 119 1.1 jdolecek } 120 1.1 jdolecek 121 1.2 perry /* Free memory allocated by atppc_isadma_malloc() */ 122 1.2 perry void 123 1.4 christos atppc_isadma_free(isa_chipset_tag_t ic, int drq, void ** buf, bus_addr_t * bus_addr, bus_size_t size) 124 1.1 jdolecek { 125 1.1 jdolecek isa_dmamem_unmap(ic, drq, *buf, size); 126 1.1 jdolecek isa_dmamem_free(ic, drq, *bus_addr, size); 127 1.1 jdolecek } 128