1f3a72e40SRuslan Bukin /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3af3dc4a7SPedro F. Giffuni * 4f3a72e40SRuslan Bukin * Copyright (c) 2014 Ruslan Bukin <br@bsdpad.com> 5f3a72e40SRuslan Bukin * All rights reserved. 6f3a72e40SRuslan Bukin * 7f3a72e40SRuslan Bukin * Redistribution and use in source and binary forms, with or without 8f3a72e40SRuslan Bukin * modification, are permitted provided that the following conditions 9f3a72e40SRuslan Bukin * are met: 10f3a72e40SRuslan Bukin * 1. Redistributions of source code must retain the above copyright 11f3a72e40SRuslan Bukin * notice, this list of conditions and the following disclaimer. 12f3a72e40SRuslan Bukin * 2. Redistributions in binary form must reproduce the above copyright 13f3a72e40SRuslan Bukin * notice, this list of conditions and the following disclaimer in the 14f3a72e40SRuslan Bukin * documentation and/or other materials provided with the distribution. 15f3a72e40SRuslan Bukin * 16f3a72e40SRuslan Bukin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17f3a72e40SRuslan Bukin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18f3a72e40SRuslan Bukin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19f3a72e40SRuslan Bukin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20f3a72e40SRuslan Bukin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21f3a72e40SRuslan Bukin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22f3a72e40SRuslan Bukin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23f3a72e40SRuslan Bukin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24f3a72e40SRuslan Bukin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25f3a72e40SRuslan Bukin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26f3a72e40SRuslan Bukin * SUCH DAMAGE. 27f3a72e40SRuslan Bukin */ 28f3a72e40SRuslan Bukin 29f3a72e40SRuslan Bukin #define DMA_CR 0x000 /* Control */ 30f3a72e40SRuslan Bukin #define DMA_ES 0x004 /* Error Status */ 31f3a72e40SRuslan Bukin #define DMA_ERQ 0x00C /* Enable Request */ 32f3a72e40SRuslan Bukin #define DMA_EEI 0x014 /* Enable Error Interrupt */ 33f3a72e40SRuslan Bukin #define DMA_CEEI 0x018 /* Clear Enable Error Interrupt */ 34f3a72e40SRuslan Bukin #define DMA_SEEI 0x019 /* Set Enable Error Interrupt */ 35f3a72e40SRuslan Bukin #define DMA_CERQ 0x01A /* Clear Enable Request */ 36f3a72e40SRuslan Bukin #define DMA_SERQ 0x01B /* Set Enable Request */ 37f3a72e40SRuslan Bukin #define DMA_CDNE 0x01C /* Clear DONE Status Bit */ 38f3a72e40SRuslan Bukin #define DMA_SSRT 0x01D /* Set START Bit */ 39f3a72e40SRuslan Bukin #define DMA_CERR 0x01E /* Clear Error */ 40f3a72e40SRuslan Bukin #define CERR_CAEI (1 << 6) /* Clear All Error Indicators */ 41f3a72e40SRuslan Bukin #define DMA_CINT 0x01F /* Clear Interrupt Request */ 42f3a72e40SRuslan Bukin #define CINT_CAIR (1 << 6) /* Clear All Interrupt Requests */ 43f3a72e40SRuslan Bukin #define DMA_INT 0x024 /* Interrupt Request */ 44f3a72e40SRuslan Bukin #define DMA_ERR 0x02C /* Error */ 45f3a72e40SRuslan Bukin #define DMA_HRS 0x034 /* Hardware Request Status */ 46f3a72e40SRuslan Bukin #define DMA_EARS 0x044 /* Enable Asynchronous Request in Stop */ 47f3a72e40SRuslan Bukin #define DMA_DCHPRI3 0x100 /* Channel n Priority */ 48f3a72e40SRuslan Bukin #define DMA_DCHPRI2 0x101 /* Channel n Priority */ 49f3a72e40SRuslan Bukin #define DMA_DCHPRI1 0x102 /* Channel n Priority */ 50f3a72e40SRuslan Bukin #define DMA_DCHPRI0 0x103 /* Channel n Priority */ 51f3a72e40SRuslan Bukin #define DMA_DCHPRI7 0x104 /* Channel n Priority */ 52f3a72e40SRuslan Bukin #define DMA_DCHPRI6 0x105 /* Channel n Priority */ 53f3a72e40SRuslan Bukin #define DMA_DCHPRI5 0x106 /* Channel n Priority */ 54f3a72e40SRuslan Bukin #define DMA_DCHPRI4 0x107 /* Channel n Priority */ 55f3a72e40SRuslan Bukin #define DMA_DCHPRI11 0x108 /* Channel n Priority */ 56f3a72e40SRuslan Bukin #define DMA_DCHPRI10 0x109 /* Channel n Priority */ 57f3a72e40SRuslan Bukin #define DMA_DCHPRI9 0x10A /* Channel n Priority */ 58f3a72e40SRuslan Bukin #define DMA_DCHPRI8 0x10B /* Channel n Priority */ 59f3a72e40SRuslan Bukin #define DMA_DCHPRI15 0x10C /* Channel n Priority */ 60f3a72e40SRuslan Bukin #define DMA_DCHPRI14 0x10D /* Channel n Priority */ 61f3a72e40SRuslan Bukin #define DMA_DCHPRI13 0x10E /* Channel n Priority */ 62f3a72e40SRuslan Bukin #define DMA_DCHPRI12 0x10F /* Channel n Priority */ 63f3a72e40SRuslan Bukin #define DMA_DCHPRI19 0x110 /* Channel n Priority */ 64f3a72e40SRuslan Bukin #define DMA_DCHPRI18 0x111 /* Channel n Priority */ 65f3a72e40SRuslan Bukin #define DMA_DCHPRI17 0x112 /* Channel n Priority */ 66f3a72e40SRuslan Bukin #define DMA_DCHPRI16 0x113 /* Channel n Priority */ 67f3a72e40SRuslan Bukin #define DMA_DCHPRI23 0x114 /* Channel n Priority */ 68f3a72e40SRuslan Bukin #define DMA_DCHPRI22 0x115 /* Channel n Priority */ 69f3a72e40SRuslan Bukin #define DMA_DCHPRI21 0x116 /* Channel n Priority */ 70f3a72e40SRuslan Bukin #define DMA_DCHPRI20 0x117 /* Channel n Priority */ 71f3a72e40SRuslan Bukin #define DMA_DCHPRI27 0x118 /* Channel n Priority */ 72f3a72e40SRuslan Bukin #define DMA_DCHPRI26 0x119 /* Channel n Priority */ 73f3a72e40SRuslan Bukin #define DMA_DCHPRI25 0x11A /* Channel n Priority */ 74f3a72e40SRuslan Bukin #define DMA_DCHPRI24 0x11B /* Channel n Priority */ 75f3a72e40SRuslan Bukin #define DMA_DCHPRI31 0x11C /* Channel n Priority */ 76f3a72e40SRuslan Bukin #define DMA_DCHPRI30 0x11D /* Channel n Priority */ 77f3a72e40SRuslan Bukin #define DMA_DCHPRI29 0x11E /* Channel n Priority */ 78f3a72e40SRuslan Bukin #define DMA_DCHPRI28 0x11F /* Channel n Priority */ 79f3a72e40SRuslan Bukin 80f3a72e40SRuslan Bukin #define DMA_TCDn_SADDR(n) (0x00 + 0x20 * n) /* Source Address */ 81f3a72e40SRuslan Bukin #define DMA_TCDn_SOFF(n) (0x04 + 0x20 * n) /* Signed Source Address Offset */ 82f3a72e40SRuslan Bukin #define DMA_TCDn_ATTR(n) (0x06 + 0x20 * n) /* Transfer Attributes */ 83f3a72e40SRuslan Bukin #define DMA_TCDn_NBYTES_MLNO(n) (0x08 + 0x20 * n) /* Minor Byte Count */ 84f3a72e40SRuslan Bukin #define DMA_TCDn_NBYTES_MLOFFNO(n) (0x08 + 0x20 * n) /* Signed Minor Loop Offset */ 85f3a72e40SRuslan Bukin #define DMA_TCDn_NBYTES_MLOFFYES(n) (0x08 + 0x20 * n) /* Signed Minor Loop Offset */ 86f3a72e40SRuslan Bukin #define DMA_TCDn_SLAST(n) (0x0C + 0x20 * n) /* Last Source Address Adjustment */ 87f3a72e40SRuslan Bukin #define DMA_TCDn_DADDR(n) (0x10 + 0x20 * n) /* Destination Address */ 88f3a72e40SRuslan Bukin #define DMA_TCDn_DOFF(n) (0x14 + 0x20 * n) /* Signed Destination Address Offset */ 89f3a72e40SRuslan Bukin #define DMA_TCDn_CITER_ELINKYES(n) (0x16 + 0x20 * n) /* Current Minor Loop Link, Major Loop Count */ 90f3a72e40SRuslan Bukin #define DMA_TCDn_CITER_ELINKNO(n) (0x16 + 0x20 * n) 91f3a72e40SRuslan Bukin #define DMA_TCDn_DLASTSGA(n) (0x18 + 0x20 * n) /* Last Dst Addr Adjustment/Scatter Gather Address */ 92f3a72e40SRuslan Bukin #define DMA_TCDn_CSR(n) (0x1C + 0x20 * n) /* Control and Status */ 93f3a72e40SRuslan Bukin #define DMA_TCDn_BITER_ELINKYES(n) (0x1E + 0x20 * n) /* Beginning Minor Loop Link, Major Loop Count */ 94f3a72e40SRuslan Bukin #define DMA_TCDn_BITER_ELINKNO(n) (0x1E + 0x20 * n) /* Beginning Minor Loop Link, Major Loop Count */ 95f3a72e40SRuslan Bukin 96f3a72e40SRuslan Bukin #define TCD_CSR_START (1 << 0) 97f3a72e40SRuslan Bukin #define TCD_CSR_INTMAJOR (1 << 1) 98f3a72e40SRuslan Bukin #define TCD_CSR_INTHALF (1 << 2) 99f3a72e40SRuslan Bukin #define TCD_CSR_DREQ (1 << 3) 100f3a72e40SRuslan Bukin #define TCD_CSR_ESG (1 << 4) 101f3a72e40SRuslan Bukin #define TCD_CSR_MAJORELINK (1 << 5) 102f3a72e40SRuslan Bukin #define TCD_CSR_ACTIVE (1 << 6) 103f3a72e40SRuslan Bukin #define TCD_CSR_DONE (1 << 7) 104f3a72e40SRuslan Bukin #define TCD_CSR_MAJORELINKCH_SHIFT 8 105f3a72e40SRuslan Bukin 106f3a72e40SRuslan Bukin #define TCD_ATTR_SMOD_SHIFT 11 /* Source Address Modulo */ 107f3a72e40SRuslan Bukin #define TCD_ATTR_SSIZE_SHIFT 8 /* Source Data Transfer Size */ 108f3a72e40SRuslan Bukin #define TCD_ATTR_DMOD_SHIFT 3 /* Dst Address Modulo */ 109f3a72e40SRuslan Bukin #define TCD_ATTR_DSIZE_SHIFT 0 /* Dst Data Transfer Size */ 110f3a72e40SRuslan Bukin 111f3a72e40SRuslan Bukin #define TCD_READ4(_sc, _reg) \ 112f3a72e40SRuslan Bukin bus_space_read_4(_sc->bst_tcd, _sc->bsh_tcd, _reg) 113f3a72e40SRuslan Bukin #define TCD_WRITE4(_sc, _reg, _val) \ 114f3a72e40SRuslan Bukin bus_space_write_4(_sc->bst_tcd, _sc->bsh_tcd, _reg, _val) 115f3a72e40SRuslan Bukin #define TCD_READ2(_sc, _reg) \ 116f3a72e40SRuslan Bukin bus_space_read_2(_sc->bst_tcd, _sc->bsh_tcd, _reg) 117f3a72e40SRuslan Bukin #define TCD_WRITE2(_sc, _reg, _val) \ 118f3a72e40SRuslan Bukin bus_space_write_2(_sc->bst_tcd, _sc->bsh_tcd, _reg, _val) 119f3a72e40SRuslan Bukin #define TCD_READ1(_sc, _reg) \ 120f3a72e40SRuslan Bukin bus_space_read_1(_sc->bst_tcd, _sc->bsh_tcd, _reg) 121f3a72e40SRuslan Bukin #define TCD_WRITE1(_sc, _reg, _val) \ 122f3a72e40SRuslan Bukin bus_space_write_1(_sc->bst_tcd, _sc->bsh_tcd, _reg, _val) 123f3a72e40SRuslan Bukin 124f3a72e40SRuslan Bukin #define EDMA_NUM_DEVICES 2 125f3a72e40SRuslan Bukin #define EDMA_NUM_CHANNELS 32 126f3a72e40SRuslan Bukin #define NCHAN_PER_MUX 16 127f3a72e40SRuslan Bukin 128f3a72e40SRuslan Bukin struct tcd_conf { 129f3a72e40SRuslan Bukin bus_addr_t saddr; 130f3a72e40SRuslan Bukin bus_addr_t daddr; 131f3a72e40SRuslan Bukin uint32_t nbytes; 132f3a72e40SRuslan Bukin uint32_t nmajor; 133f3a72e40SRuslan Bukin uint32_t majorelink; 134f3a72e40SRuslan Bukin uint32_t majorelinkch; 135f3a72e40SRuslan Bukin uint32_t esg; 136f3a72e40SRuslan Bukin uint32_t smod; 137f3a72e40SRuslan Bukin uint32_t dmod; 138f3a72e40SRuslan Bukin uint32_t soff; 139f3a72e40SRuslan Bukin uint32_t doff; 140f3a72e40SRuslan Bukin uint32_t ssize; 141f3a72e40SRuslan Bukin uint32_t dsize; 142f3a72e40SRuslan Bukin uint32_t slast; 143f3a72e40SRuslan Bukin uint32_t dlast_sga; 144f3a72e40SRuslan Bukin uint32_t channel; 145f3a72e40SRuslan Bukin uint32_t (*ih)(void *, int); 146f3a72e40SRuslan Bukin void *ih_user; 147f3a72e40SRuslan Bukin }; 148f3a72e40SRuslan Bukin 149f3a72e40SRuslan Bukin /* 150f3a72e40SRuslan Bukin * TCD struct is described at 151f3a72e40SRuslan Bukin * Vybrid Reference Manual, Rev. 5, 07/2013 152f3a72e40SRuslan Bukin * 153f3a72e40SRuslan Bukin * Should be used for Scatter/Gathering feature. 154f3a72e40SRuslan Bukin */ 155f3a72e40SRuslan Bukin 156f3a72e40SRuslan Bukin struct TCD { 157f3a72e40SRuslan Bukin uint32_t saddr; 158f3a72e40SRuslan Bukin uint16_t attr; 159f3a72e40SRuslan Bukin uint16_t soff; 160f3a72e40SRuslan Bukin uint32_t nbytes; 161f3a72e40SRuslan Bukin uint32_t slast; 162f3a72e40SRuslan Bukin uint32_t daddr; 163f3a72e40SRuslan Bukin uint16_t citer; 164f3a72e40SRuslan Bukin uint16_t doff; 165f3a72e40SRuslan Bukin uint32_t dlast_sga; 166f3a72e40SRuslan Bukin uint16_t biter; 167f3a72e40SRuslan Bukin uint16_t csr; 168f3a72e40SRuslan Bukin } __packed; 169f3a72e40SRuslan Bukin 170f3a72e40SRuslan Bukin struct edma_softc { 171f3a72e40SRuslan Bukin device_t dev; 172f3a72e40SRuslan Bukin struct resource *res[4]; 173f3a72e40SRuslan Bukin bus_space_tag_t bst; 174f3a72e40SRuslan Bukin bus_space_handle_t bsh; 175f3a72e40SRuslan Bukin bus_space_tag_t bst_tcd; 176f3a72e40SRuslan Bukin bus_space_handle_t bsh_tcd; 177f3a72e40SRuslan Bukin void *tc_ih; 178f3a72e40SRuslan Bukin void *err_ih; 179f3a72e40SRuslan Bukin uint32_t device_id; 180f3a72e40SRuslan Bukin 181f3a72e40SRuslan Bukin int (*channel_configure) (struct edma_softc *, int, int); 182f3a72e40SRuslan Bukin int (*channel_free) (struct edma_softc *, int); 183f3a72e40SRuslan Bukin int (*dma_request) (struct edma_softc *, int); 184f3a72e40SRuslan Bukin int (*dma_setup) (struct edma_softc *, struct tcd_conf *); 185f3a72e40SRuslan Bukin int (*dma_stop) (struct edma_softc *, int); 186f3a72e40SRuslan Bukin }; 187