Home | History | Annotate | Line # | Download | only in dev
      1  1.1  rkujawa /*	$NetBSD: dwcdmacreg.h,v 1.1 2026/06/14 00:02:35 rkujawa Exp $	*/
      2  1.1  rkujawa 
      3  1.1  rkujawa /*
      4  1.1  rkujawa  * Copyright (c) 2024, 2026 The NetBSD Foundation, Inc.
      5  1.1  rkujawa  * All rights reserved.
      6  1.1  rkujawa  *
      7  1.1  rkujawa  * This code is derived from software contributed to The NetBSD Foundation
      8  1.1  rkujawa  * by Radoslaw Kujawa.
      9  1.1  rkujawa  *
     10  1.1  rkujawa  * Redistribution and use in source and binary forms, with or without
     11  1.1  rkujawa  * modification, are permitted provided that the following conditions
     12  1.1  rkujawa  * are met:
     13  1.1  rkujawa  * 1. Redistributions of source code must retain the above copyright
     14  1.1  rkujawa  *    notice, this list of conditions and the following disclaimer.
     15  1.1  rkujawa  * 2. Redistributions in binary form must reproduce the above copyright
     16  1.1  rkujawa  *    notice, this list of conditions and the following disclaimer in the
     17  1.1  rkujawa  *    documentation and/or other materials provided with the distribution.
     18  1.1  rkujawa  *
     19  1.1  rkujawa  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     20  1.1  rkujawa  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     21  1.1  rkujawa  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     22  1.1  rkujawa  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     23  1.1  rkujawa  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     24  1.1  rkujawa  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  1.1  rkujawa  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  1.1  rkujawa  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  1.1  rkujawa  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     28  1.1  rkujawa  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  1.1  rkujawa  */
     30  1.1  rkujawa 
     31  1.1  rkujawa /*
     32  1.1  rkujawa  * Synopsys DesignWare AHB Central DMA Controller (dw_dmac).
     33  1.1  rkujawa  *
     34  1.1  rkujawa  * Register layout is generic to the core; this copy lives here for the
     35  1.1  rkujawa  * 460EX integration, where one dedicated instance sits on the AHB just
     36  1.1  rkujawa  * below the DWC SATA core and feeds its DMADR FIFO window through the
     37  1.1  rkujawa  * hardware handshake interface.
     38  1.1  rkujawa  *
     39  1.1  rkujawa  * This should probably go to sys/dev/ic/, when someone else needs it.
     40  1.1  rkujawa  */
     41  1.1  rkujawa 
     42  1.1  rkujawa #ifndef _IBM4XX_DWCDMACREG_H_
     43  1.1  rkujawa #define	_IBM4XX_DWCDMACREG_H_
     44  1.1  rkujawa 
     45  1.1  rkujawa #define	DWCDMAC_SIZE		0x400
     46  1.1  rkujawa /* offset of the DMAC below the SATA core on the 460EX AHB */
     47  1.1  rkujawa #define	DWCDMAC_OFFSET		0x800
     48  1.1  rkujawa 
     49  1.1  rkujawa /* per-channel register block, ch = 0..7 */
     50  1.1  rkujawa #define	DWCDMAC_CHAN_SIZE	0x58
     51  1.1  rkujawa #define	DWCDMAC_CHAN(ch)	((ch) * DWCDMAC_CHAN_SIZE)
     52  1.1  rkujawa #define	DWCDMAC_SAR(ch)		(DWCDMAC_CHAN(ch) + 0x00) /* source addr */
     53  1.1  rkujawa #define	DWCDMAC_DAR(ch)		(DWCDMAC_CHAN(ch) + 0x08) /* dest addr */
     54  1.1  rkujawa #define	DWCDMAC_LLP(ch)		(DWCDMAC_CHAN(ch) + 0x10) /* list pointer */
     55  1.1  rkujawa #define	DWCDMAC_CTL(ch)		(DWCDMAC_CHAN(ch) + 0x18) /* control, low */
     56  1.1  rkujawa #define	DWCDMAC_CTL_HI(ch)	(DWCDMAC_CHAN(ch) + 0x1c) /* control, high */
     57  1.1  rkujawa #define	DWCDMAC_SSTAT(ch)	(DWCDMAC_CHAN(ch) + 0x20)
     58  1.1  rkujawa #define	DWCDMAC_DSTAT(ch)	(DWCDMAC_CHAN(ch) + 0x28)
     59  1.1  rkujawa #define	DWCDMAC_SSTATAR(ch)	(DWCDMAC_CHAN(ch) + 0x30)
     60  1.1  rkujawa #define	DWCDMAC_DSTATAR(ch)	(DWCDMAC_CHAN(ch) + 0x38)
     61  1.1  rkujawa #define	DWCDMAC_CFG(ch)		(DWCDMAC_CHAN(ch) + 0x40) /* config, low */
     62  1.1  rkujawa #define	DWCDMAC_CFG_HI(ch)	(DWCDMAC_CHAN(ch) + 0x44) /* config, high */
     63  1.1  rkujawa #define	DWCDMAC_SGR(ch)		(DWCDMAC_CHAN(ch) + 0x48)
     64  1.1  rkujawa #define	DWCDMAC_DSR(ch)		(DWCDMAC_CHAN(ch) + 0x50)
     65  1.1  rkujawa 
     66  1.1  rkujawa /*
     67  1.1  rkujawa  * Interrupt registers, one channel bit each.  RAW latches regardless of
     68  1.1  rkujawa  * MASK_*; STATUS_* is RAW & MASK; CLEAR_* is write-1-to-clear.
     69  1.1  rkujawa  */
     70  1.1  rkujawa #define	DWCDMAC_RAW_TFR		0x2c0	/* DMA (chain) transfer complete */
     71  1.1  rkujawa #define	DWCDMAC_RAW_BLOCK	0x2c8	/* block transfer complete */
     72  1.1  rkujawa #define	DWCDMAC_RAW_SRCTRAN	0x2d0
     73  1.1  rkujawa #define	DWCDMAC_RAW_DSTTRAN	0x2d8
     74  1.1  rkujawa #define	DWCDMAC_RAW_ERR		0x2e0	/* AHB error response */
     75  1.1  rkujawa #define	DWCDMAC_STATUS_TFR	0x2e8
     76  1.1  rkujawa #define	DWCDMAC_STATUS_BLOCK	0x2f0
     77  1.1  rkujawa #define	DWCDMAC_STATUS_SRCTRAN	0x2f8
     78  1.1  rkujawa #define	DWCDMAC_STATUS_DSTTRAN	0x300
     79  1.1  rkujawa #define	DWCDMAC_STATUS_ERR	0x308
     80  1.1  rkujawa #define	DWCDMAC_MASK_TFR	0x310	/* write-enable scheme, see below */
     81  1.1  rkujawa #define	DWCDMAC_MASK_BLOCK	0x318
     82  1.1  rkujawa #define	DWCDMAC_MASK_SRCTRAN	0x320
     83  1.1  rkujawa #define	DWCDMAC_MASK_DSTTRAN	0x328
     84  1.1  rkujawa #define	DWCDMAC_MASK_ERR	0x330
     85  1.1  rkujawa #define	DWCDMAC_CLEAR_TFR	0x338
     86  1.1  rkujawa #define	DWCDMAC_CLEAR_BLOCK	0x340
     87  1.1  rkujawa #define	DWCDMAC_CLEAR_SRCTRAN	0x348
     88  1.1  rkujawa #define	DWCDMAC_CLEAR_DSTTRAN	0x350
     89  1.1  rkujawa #define	DWCDMAC_CLEAR_ERR	0x358
     90  1.1  rkujawa #define	DWCDMAC_STATUSINT	0x360	/* combined status, read-only */
     91  1.1  rkujawa 
     92  1.1  rkujawa /* software handshake request registers; unused (hardware handshake) */
     93  1.1  rkujawa #define	DWCDMAC_REQ_SRC		0x368
     94  1.1  rkujawa #define	DWCDMAC_REQ_DST		0x370
     95  1.1  rkujawa #define	DWCDMAC_SGL_REQ_SRC	0x378
     96  1.1  rkujawa #define	DWCDMAC_SGL_REQ_DST	0x380
     97  1.1  rkujawa #define	DWCDMAC_LST_SRC		0x388
     98  1.1  rkujawa #define	DWCDMAC_LST_DST		0x390
     99  1.1  rkujawa 
    100  1.1  rkujawa #define	DWCDMAC_DMACFG		0x398	/* global configuration */
    101  1.1  rkujawa #define	DWCDMAC_DMACFG_EN	0x00000001
    102  1.1  rkujawa #define	DWCDMAC_CHEN		0x3a0	/* channel enable */
    103  1.1  rkujawa #define	DWCDMAC_ID		0x3a8
    104  1.1  rkujawa #define	DWCDMAC_TEST		0x3b0
    105  1.1  rkujawa /* 0x3c8-0x3f7: component parameter registers, unused */
    106  1.1  rkujawa 
    107  1.1  rkujawa /*
    108  1.1  rkujawa  * CHEN and MASK_* use a write-enable scheme: bits 15:8 select which of
    109  1.1  rkujawa  * the channel bits 7:0 a write actually affects.  A channel's CHEN bit
    110  1.1  rkujawa  * self-clears when its transfer (chain) completes.
    111  1.1  rkujawa  */
    112  1.1  rkujawa #define	DWCDMAC_CHANBIT(ch)	(1U << (ch))
    113  1.1  rkujawa #define	DWCDMAC_CH_ENABLE(ch)	(DWCDMAC_CHANBIT(ch) | (DWCDMAC_CHANBIT(ch) << 8))
    114  1.1  rkujawa #define	DWCDMAC_CH_DISABLE(ch)	(DWCDMAC_CHANBIT(ch) << 8)
    115  1.1  rkujawa 
    116  1.1  rkujawa /* CTL, low word */
    117  1.1  rkujawa #define	DWCDMAC_CTL_INT_EN		0x00000001
    118  1.1  rkujawa #define	DWCDMAC_CTL_DST_TRWID(w)	(((w) & 0x7) << 1)  /* 2 = 32-bit */
    119  1.1  rkujawa #define	DWCDMAC_CTL_SRC_TRWID(w)	(((w) & 0x7) << 4)
    120  1.1  rkujawa #define	DWCDMAC_CTL_DINC_INC		0x00000000
    121  1.1  rkujawa #define	DWCDMAC_CTL_DINC_DEC		0x00000080
    122  1.1  rkujawa #define	DWCDMAC_CTL_DINC_NOCHANGE	0x00000100
    123  1.1  rkujawa #define	DWCDMAC_CTL_SINC_INC		0x00000000
    124  1.1  rkujawa #define	DWCDMAC_CTL_SINC_DEC		0x00000200
    125  1.1  rkujawa #define	DWCDMAC_CTL_SINC_NOCHANGE	0x00000400
    126  1.1  rkujawa #define	DWCDMAC_CTL_DST_MSIZE(m)	(((m) & 0x7) << 11) /* 3 = 16 items */
    127  1.1  rkujawa #define	DWCDMAC_CTL_SRC_MSIZE(m)	(((m) & 0x7) << 14)
    128  1.1  rkujawa #define	DWCDMAC_CTL_TTFC(t)		(((t) & 0x7) << 20)
    129  1.1  rkujawa #define	DWCDMAC_TTFC_P2M_DMAC		0x2 /* dev->mem, DMAC flow control */
    130  1.1  rkujawa #define	DWCDMAC_TTFC_M2P_DMAC		0x1 /* mem->dev, DMAC flow control */
    131  1.1  rkujawa #define	DWCDMAC_TTFC_M2P_PER		0x3 /* mem->dev, periph flow control */
    132  1.1  rkujawa #define	DWCDMAC_CTL_DMS(m)		(((m) & 0x3) << 23) /* dst master */
    133  1.1  rkujawa #define	DWCDMAC_CTL_SMS(m)		(((m) & 0x3) << 25) /* src master */
    134  1.1  rkujawa #define	DWCDMAC_CTL_LLP_DST_EN		0x08000000 /* block chaining, dst */
    135  1.1  rkujawa #define	DWCDMAC_CTL_LLP_SRC_EN		0x10000000 /* block chaining, src */
    136  1.1  rkujawa /* CTL, high word */
    137  1.1  rkujawa #define	DWCDMAC_CTL_BLOCK_TS(items)	((items) & 0xfff)
    138  1.1  rkujawa #define	DWCDMAC_MAX_BLOCK_ITEMS		0x800	/* x4 bytes = 8KB per block */
    139  1.1  rkujawa #define	DWCDMAC_CTL_DONE	0x00001000 /* block done; written back to the
    140  1.1  rkujawa 					      LLI ctl_hi in memory */
    141  1.1  rkujawa 
    142  1.1  rkujawa /* CFG, low word */
    143  1.1  rkujawa #define	DWCDMAC_CFG_CH_PRIOR(p)	(((p) & 0x7) << 5)
    144  1.1  rkujawa #define	DWCDMAC_CFG_CH_SUSP	0x00000100
    145  1.1  rkujawa #define	DWCDMAC_CFG_FIFO_EMPTY	0x00000200
    146  1.1  rkujawa #define	DWCDMAC_CFG_HS_SEL_DST	0x00000400 /* 1 = software handshake */
    147  1.1  rkujawa #define	DWCDMAC_CFG_HS_SEL_SRC	0x00000800
    148  1.1  rkujawa /* CFG, high word */
    149  1.1  rkujawa #define	DWCDMAC_CFG_FCMODE_REQ	0x00000001 /* prefetch only on request */
    150  1.1  rkujawa #define	DWCDMAC_CFG_FIFO_MODE	0x00000002 /* burst only when FIFO ready */
    151  1.1  rkujawa #define	DWCDMAC_CFG_PROTCTL	0x0000000c /* AHB hprot, per Linux */
    152  1.1  rkujawa #define	DWCDMAC_CFG_HS_SRC(i)	(((i) & 0xf) << 7)  /* hw handshake if */
    153  1.1  rkujawa #define	DWCDMAC_CFG_HS_DST(i)	(((i) & 0xf) << 11)
    154  1.1  rkujawa 
    155  1.1  rkujawa /*
    156  1.1  rkujawa  * Master select encodes
    157  1.1  rkujawa  */
    158  1.1  rkujawa #define	DWCDMAC_MS_PERIPH	0
    159  1.1  rkujawa #define	DWCDMAC_MS_MEM		1
    160  1.1  rkujawa 
    161  1.1  rkujawa /*
    162  1.1  rkujawa  * In-memory linked list item, fetched by the DMAC through the master
    163  1.1  rkujawa  * named in the LMS bits.
    164  1.1  rkujawa  */
    165  1.1  rkujawa struct dwcdmac_lli {
    166  1.1  rkujawa 	uint32_t sar;
    167  1.1  rkujawa 	uint32_t dar;
    168  1.1  rkujawa 	uint32_t llp;		/* phys addr of next item | LMS; 0 = last */
    169  1.1  rkujawa 	uint32_t ctl_lo;
    170  1.1  rkujawa 	uint32_t ctl_hi;
    171  1.1  rkujawa 	uint32_t dstat_lo;
    172  1.1  rkujawa 	uint32_t dstat_hi;
    173  1.1  rkujawa };
    174  1.1  rkujawa 
    175  1.1  rkujawa #endif	/* _IBM4XX_DWCDMACREG_H_ */
    176