1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#ifndef __DMA_GLOBAL_H_INCLUDED__
17#define __DMA_GLOBAL_H_INCLUDED__
18
19#include <type_support.h>
20
21#define IS_DMA_VERSION_2
22
23#define HIVE_ISP_NUM_DMA_CONNS 3
24#define HIVE_ISP_NUM_DMA_CHANNELS 32
25
26#define N_DMA_CHANNEL_ID HIVE_ISP_NUM_DMA_CHANNELS
27
28#include "dma_v2_defs.h"
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44#define _DMA_PACKING_SETUP_PARAM _DMA_V2_PACKING_SETUP_PARAM
45#define _DMA_HEIGHT_PARAM _DMA_V2_HEIGHT_PARAM
46#define _DMA_STRIDE_A_PARAM _DMA_V2_STRIDE_A_PARAM
47#define _DMA_ELEM_CROPPING_A_PARAM _DMA_V2_ELEM_CROPPING_A_PARAM
48#define _DMA_WIDTH_A_PARAM _DMA_V2_WIDTH_A_PARAM
49#define _DMA_STRIDE_B_PARAM _DMA_V2_STRIDE_B_PARAM
50#define _DMA_ELEM_CROPPING_B_PARAM _DMA_V2_ELEM_CROPPING_B_PARAM
51#define _DMA_WIDTH_B_PARAM _DMA_V2_WIDTH_B_PARAM
52
53#define _DMA_ZERO_EXTEND _DMA_V2_ZERO_EXTEND
54#define _DMA_SIGN_EXTEND _DMA_V2_SIGN_EXTEND
55
56typedef unsigned int dma_channel;
57
58typedef enum {
59 dma_isp_to_bus_connection = HIVE_DMA_ISP_BUS_CONN,
60 dma_isp_to_ddr_connection = HIVE_DMA_ISP_DDR_CONN,
61 dma_bus_to_ddr_connection = HIVE_DMA_BUS_DDR_CONN,
62} dma_connection;
63
64typedef enum {
65 dma_zero_extension = _DMA_ZERO_EXTEND,
66 dma_sign_extension = _DMA_SIGN_EXTEND
67} dma_extension;
68
69#define DMA_PROP_SHIFT(val, param) ((val) << _DMA_V2_ ## param ## _IDX)
70#define DMA_PROP_MASK(param) ((1U << _DMA_V2_ ## param ## _BITS) - 1)
71#define DMA_PACK(val, param) DMA_PROP_SHIFT((val) & DMA_PROP_MASK(param), param)
72
73#define DMA_PACK_COMMAND(cmd) DMA_PACK(cmd, CMD)
74#define DMA_PACK_CHANNEL(ch) DMA_PACK(ch, CHANNEL)
75#define DMA_PACK_PARAM(par) DMA_PACK(par, PARAM)
76#define DMA_PACK_EXTENSION(ext) DMA_PACK(ext, EXTENSION)
77#define DMA_PACK_LEFT_CROPPING(lc) DMA_PACK(lc, LEFT_CROPPING)
78#define DMA_PACK_WIDTH_A(w) DMA_PACK(w, SPEC_DEV_A_XB)
79#define DMA_PACK_WIDTH_B(w) DMA_PACK(w, SPEC_DEV_B_XB)
80#define DMA_PACK_HEIGHT(h) DMA_PACK(h, SPEC_YB)
81
82#define DMA_PACK_CMD_CHANNEL(cmd, ch) (DMA_PACK_COMMAND(cmd) | DMA_PACK_CHANNEL(ch))
83#define DMA_PACK_SETUP(conn, ext) ((conn) | DMA_PACK_EXTENSION(ext))
84#define DMA_PACK_CROP_ELEMS(elems, crop) ((elems) | DMA_PACK_LEFT_CROPPING(crop))
85
86#define hive_dma_snd(dma_id, token) OP_std_snd(dma_id, (unsigned int)(token))
87
88#define DMA_PACK_BLOCK_CMD(cmd, ch, width_a, width_b, height) \
89 (DMA_PACK_COMMAND(cmd) | \
90 DMA_PACK_CHANNEL(ch) | \
91 DMA_PACK_WIDTH_A(width_a) | \
92 DMA_PACK_WIDTH_B(width_b) | \
93 DMA_PACK_HEIGHT(height))
94
95#define hive_dma_move_data(dma_id, read, channel, addr_a, addr_b, to_is_var, from_is_var) \
96{ \
97 hive_dma_snd(dma_id, DMA_PACK(_DMA_V2_SET_CRUN_COMMAND, CMD)); \
98 hive_dma_snd(dma_id, DMA_PACK_CMD_CHANNEL(read ? _DMA_V2_MOVE_B2A_COMMAND : _DMA_V2_MOVE_A2B_COMMAND, channel)); \
99 hive_dma_snd(dma_id, read ? (unsigned int)(addr_b) : (unsigned int)(addr_a)); \
100 hive_dma_snd(dma_id, read ? (unsigned int)(addr_a) : (unsigned int)(addr_b)); \
101 hive_dma_snd(dma_id, to_is_var); \
102 hive_dma_snd(dma_id, from_is_var); \
103}
104
105#define hive_dma_move_data_no_ack(dma_id, read, channel, addr_a, addr_b, to_is_var, from_is_var) \
106{ \
107 hive_dma_snd(dma_id, DMA_PACK(_DMA_V2_SET_CRUN_COMMAND, CMD)); \
108 hive_dma_snd(dma_id, DMA_PACK_CMD_CHANNEL(read ? _DMA_V2_NO_ACK_MOVE_B2A_NO_SYNC_CHK_COMMAND : _DMA_V2_NO_ACK_MOVE_A2B_NO_SYNC_CHK_COMMAND, channel)); \
109 hive_dma_snd(dma_id, read ? (unsigned int)(addr_b) : (unsigned int)(addr_a)); \
110 hive_dma_snd(dma_id, read ? (unsigned int)(addr_a) : (unsigned int)(addr_b)); \
111 hive_dma_snd(dma_id, to_is_var); \
112 hive_dma_snd(dma_id, from_is_var); \
113}
114
115#define hive_dma_move_b2a_data(dma_id, channel, to_addr, from_addr, to_is_var, from_is_var) \
116{ \
117 hive_dma_move_data(dma_id, true, channel, to_addr, from_addr, to_is_var, from_is_var) \
118}
119
120#define hive_dma_move_a2b_data(dma_id, channel, from_addr, to_addr, from_is_var, to_is_var) \
121{ \
122 hive_dma_move_data(dma_id, false, channel, from_addr, to_addr, from_is_var, to_is_var) \
123}
124
125#define hive_dma_set_data(dma_id, channel, address, value, is_var) \
126{ \
127 hive_dma_snd(dma_id, DMA_PACK(_DMA_V2_SET_CRUN_COMMAND, CMD)); \
128 hive_dma_snd(dma_id, DMA_PACK_CMD_CHANNEL(_DMA_V2_INIT_A_COMMAND, channel)); \
129 hive_dma_snd(dma_id, value); \
130 hive_dma_snd(dma_id, address); \
131 hive_dma_snd(dma_id, is_var); \
132}
133
134#define hive_dma_clear_data(dma_id, channel, address, is_var) hive_dma_set_data(dma_id, channel, address, 0, is_var)
135
136#define hive_dma_configure(dma_id, channel, connection, extension, height, \
137 stride_A, elems_A, cropping_A, width_A, \
138 stride_B, elems_B, cropping_B, width_B) \
139{ \
140 hive_dma_snd(dma_id, DMA_PACK_CMD_CHANNEL(_DMA_V2_CONFIG_CHANNEL_COMMAND, channel)); \
141 hive_dma_snd(dma_id, DMA_PACK_SETUP(connection, extension)); \
142 hive_dma_snd(dma_id, stride_A); \
143 hive_dma_snd(dma_id, DMA_PACK_CROP_ELEMS(elems_A, cropping_A)); \
144 hive_dma_snd(dma_id, width_A); \
145 hive_dma_snd(dma_id, stride_B); \
146 hive_dma_snd(dma_id, DMA_PACK_CROP_ELEMS(elems_B, cropping_B)); \
147 hive_dma_snd(dma_id, width_B); \
148 hive_dma_snd(dma_id, height); \
149}
150
151#define hive_dma_execute(dma_id, channel, cmd, to_addr, from_addr_value, to_is_var, from_is_var) \
152{ \
153 hive_dma_snd(dma_id, DMA_PACK(_DMA_V2_SET_CRUN_COMMAND, CMD)); \
154 hive_dma_snd(dma_id, DMA_PACK_CMD_CHANNEL(cmd, channel)); \
155 hive_dma_snd(dma_id, to_addr); \
156 hive_dma_snd(dma_id, from_addr_value); \
157 hive_dma_snd(dma_id, to_is_var); \
158 if ((cmd & DMA_CLEAR_CMDBIT) == 0) { \
159 hive_dma_snd(dma_id, from_is_var); \
160 } \
161}
162
163#define hive_dma_configure_fast(dma_id, channel, connection, extension, elems_A, elems_B) \
164{ \
165 hive_dma_snd(dma_id, DMA_PACK_CMD_CHANNEL(_DMA_V2_CONFIG_CHANNEL_COMMAND, channel)); \
166 hive_dma_snd(dma_id, DMA_PACK_SETUP(connection, extension)); \
167 hive_dma_snd(dma_id, 0); \
168 hive_dma_snd(dma_id, DMA_PACK_CROP_ELEMS(elems_A, 0)); \
169 hive_dma_snd(dma_id, 0); \
170 hive_dma_snd(dma_id, 0); \
171 hive_dma_snd(dma_id, DMA_PACK_CROP_ELEMS(elems_B, 0)); \
172 hive_dma_snd(dma_id, 0); \
173 hive_dma_snd(dma_id, 1); \
174}
175
176#define hive_dma_set_parameter(dma_id, channel, param, value) \
177{ \
178 hive_dma_snd(dma_id, _DMA_V2_SET_CHANNEL_PARAM_COMMAND | DMA_PACK_CHANNEL(channel) | DMA_PACK_PARAM(param)); \
179 hive_dma_snd(dma_id, value); \
180}
181
182#define DMA_SPECIFIC_CMDBIT 0x01
183#define DMA_CHECK_CMDBIT 0x02
184#define DMA_RW_CMDBIT 0x04
185#define DMA_CLEAR_CMDBIT 0x08
186#define DMA_ACK_CMDBIT 0x10
187#define DMA_CFG_CMDBIT 0x20
188#define DMA_PARAM_CMDBIT 0x01
189
190
191#define DMA_NOACK_CMD (DMA_ACK_CMDBIT | DMA_CHECK_CMDBIT)
192#define DMA_CFG_CMD (DMA_CFG_CMDBIT)
193#define DMA_CFGPARAM_CMD (DMA_CFG_CMDBIT | DMA_PARAM_CMDBIT)
194
195#define DMA_CMD_NEEDS_ACK(cmd) ((cmd & DMA_NOACK_CMD) == 0)
196#define DMA_CMD_IS_TRANSFER(cmd) ((cmd & DMA_CFG_CMDBIT) == 0)
197#define DMA_CMD_IS_WR(cmd) ((cmd & DMA_RW_CMDBIT) != 0)
198#define DMA_CMD_IS_RD(cmd) ((cmd & DMA_RW_CMDBIT) == 0)
199#define DMA_CMD_IS_CLR(cmd) ((cmd & DMA_CLEAR_CMDBIT) != 0)
200#define DMA_CMD_IS_CFG(cmd) ((cmd & DMA_CFG_CMDBIT) != 0)
201#define DMA_CMD_IS_PARAMCFG(cmd) ((cmd & DMA_CFGPARAM_CMD) == DMA_CFGPARAM_CMD)
202
203
204#define DMA_TRANSFER_READ DMA_TRANSFER_B2A
205#define DMA_TRANSFER_WRITE DMA_TRANSFER_A2B
206
207#define DMA_TRANSFER_STORE DMA_TRANSFER_B2A
208#define DMA_TRANSFER_LOAD DMA_TRANSFER_A2B
209#define DMA_TRANSFER_CLEAR DMA_TRANSFER_CLEAR_A
210
211typedef enum {
212 DMA_TRANSFER_CLEAR_A = DMA_CLEAR_CMDBIT,
213 DMA_TRANSFER_CLEAR_B = DMA_CLEAR_CMDBIT | DMA_RW_CMDBIT,
214 DMA_TRANSFER_A2B = DMA_RW_CMDBIT,
215 DMA_TRANSFER_B2A = 0,
216 DMA_TRANSFER_CLEAR_A_NOACK = DMA_CLEAR_CMDBIT | DMA_NOACK_CMD,
217 DMA_TRANSFER_CLEAR_B_NOACK = DMA_CLEAR_CMDBIT | DMA_RW_CMDBIT | DMA_NOACK_CMD,
218 DMA_TRANSFER_A2B_NOACK = DMA_RW_CMDBIT | DMA_NOACK_CMD,
219 DMA_TRANSFER_B2A_NOACK = DMA_NOACK_CMD,
220 DMA_FASTTRANSFER_CLEAR_A = DMA_CLEAR_CMDBIT | DMA_SPECIFIC_CMDBIT,
221 DMA_FASTTRANSFER_CLEAR_B = DMA_CLEAR_CMDBIT | DMA_RW_CMDBIT | DMA_SPECIFIC_CMDBIT,
222 DMA_FASTTRANSFER_A2B = DMA_RW_CMDBIT | DMA_SPECIFIC_CMDBIT,
223 DMA_FASTTRANSFER_B2A = DMA_SPECIFIC_CMDBIT,
224 DMA_FASTTRANSFER_CLEAR_A_NOACK = DMA_CLEAR_CMDBIT | DMA_NOACK_CMD | DMA_SPECIFIC_CMDBIT,
225 DMA_FASTTRANSFER_CLEAR_B_NOACK = DMA_CLEAR_CMDBIT | DMA_RW_CMDBIT | DMA_NOACK_CMD | DMA_SPECIFIC_CMDBIT,
226 DMA_FASTTRANSFER_A2B_NOACK = DMA_RW_CMDBIT | DMA_NOACK_CMD | DMA_SPECIFIC_CMDBIT,
227 DMA_FASTTRANSFER_B2A_NOACK = DMA_NOACK_CMD | DMA_SPECIFIC_CMDBIT,
228} dma_transfer_type_t;
229
230typedef enum {
231 DMA_CONFIG_SETUP = _DMA_V2_PACKING_SETUP_PARAM,
232 DMA_CONFIG_HEIGHT = _DMA_V2_HEIGHT_PARAM,
233 DMA_CONFIG_STRIDE_A_ = _DMA_V2_STRIDE_A_PARAM,
234 DMA_CONFIG_CROP_ELEM_A = _DMA_V2_ELEM_CROPPING_A_PARAM,
235 DMA_CONFIG_WIDTH_A = _DMA_V2_WIDTH_A_PARAM,
236 DMA_CONFIG_STRIDE_B_ = _DMA_V2_STRIDE_B_PARAM,
237 DMA_CONFIG_CROP_ELEM_B = _DMA_V2_ELEM_CROPPING_B_PARAM,
238 DMA_CONFIG_WIDTH_B = _DMA_V2_WIDTH_B_PARAM,
239} dma_config_type_t;
240
241struct dma_port_config {
242 u8 crop, elems;
243 u16 width;
244 u32 stride;
245};
246
247
248struct dma_channel_config {
249 u8 connection;
250 u8 extension;
251 u8 height;
252 struct dma_port_config a, b;
253};
254
255#endif
256