dwcdmacreg.h revision 1.1 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