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