1 /*-
2 *******************************************************************************
3 Copyright (C) 2015 Annapurna Labs Ltd.
4 
5 This file may be licensed under the terms of the Annapurna Labs Commercial
6 License Agreement.
7 
8 Alternatively, this file can be distributed under the terms of the GNU General
9 Public License V2 as published by the Free Software Foundation and can be
10 found at http://www.gnu.org/licenses/gpl-2.0.html
11 
12 Alternatively, redistribution and use in source and binary forms, with or
13 without modification, are permitted provided that the following conditions are
14 met:
15 
16     *     Redistributions of source code must retain the above copyright notice,
17 this list of conditions and the following disclaimer.
18 
19     *     Redistributions in binary form must reproduce the above copyright
20 notice, this list of conditions and the following disclaimer in
21 the documentation and/or other materials provided with the
22 distribution.
23 
24 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
25 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
28 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
31 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 
35 *******************************************************************************/
36 
37 /**
38  * @file   al_hal_udma_debug.c
39  *
40  * @brief  Universal DMA HAL driver for debug
41  *
42  */
43 
44 #define DEBUG
45 
46 #include <al_hal_common.h>
47 #include <al_hal_udma_regs.h>
48 #include <al_hal_udma_debug.h>
49 
50 static void al_udma_regs_m2s_axi_print(struct al_udma *udma)
51 {
52 	al_dbg("M2S AXI regs:\n");
53 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, axi_m2s, comp_wr_cfg_1);
54 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, axi_m2s, comp_wr_cfg_2);
55 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, axi_m2s, data_rd_cfg_1);
56 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, axi_m2s, data_rd_cfg_2);
57 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, axi_m2s, desc_rd_cfg_1);
58 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, axi_m2s, desc_rd_cfg_2);
59 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, axi_m2s, data_rd_cfg);
60 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, axi_m2s, desc_rd_cfg_3);
61 
62 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, axi_m2s, desc_wr_cfg_1);
63 	AL_UDMA_PRINT_REG_FIELD(udma, "  ", "\n", "%d", m2s, axi_m2s,
64 			desc_wr_cfg_1,
65 			max_axi_beats,
66 			UDMA_AXI_M2S_DESC_WR_CFG_1_MAX_AXI_BEATS);
67 	AL_UDMA_PRINT_REG_FIELD(udma, "  ", "\n", "%d", m2s, axi_m2s,
68 			desc_wr_cfg_1,
69 			min_axi_beats,
70 			UDMA_AXI_M2S_DESC_WR_CFG_1_MIN_AXI_BEATS);
71 
72 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, axi_m2s, ostand_cfg);
73 }
74 
75 static void al_udma_regs_m2s_general_print(struct al_udma *udma)
76 {
77 	al_dbg("M2S general regs:\n");
78 
79 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, state);
80 	AL_UDMA_PRINT_REG_FIELD(udma, "  ", "\n", "%d", m2s, m2s, state,
81 			comp_ctrl,
82 			UDMA_M2S_STATE_COMP_CTRL);
83 	AL_UDMA_PRINT_REG_FIELD(udma, "  ", "\n", "%d", m2s, m2s, state,
84 			stream_if,
85 			UDMA_M2S_STATE_STREAM_IF);
86 	AL_UDMA_PRINT_REG_FIELD(udma, "  ", "\n", "%d", m2s, m2s, state,
87 			rd_ctrl,
88 			UDMA_M2S_STATE_DATA_RD_CTRL);
89 	AL_UDMA_PRINT_REG_FIELD(udma, "  ", "\n", "%d", m2s, m2s, state,
90 			desc_pref,
91 			UDMA_M2S_STATE_DESC_PREF);
92 
93 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, err_log_mask);
94 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, log_0);
95 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, log_1);
96 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, log_2);
97 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, log_3);
98 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, data_fifo_status);
99 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, header_fifo_status);
100 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, unack_fifo_status);
101 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, check_en);
102 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, fifo_en);
103 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, cfg_len);
104 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, stream_cfg);
105 }
106 
107 static void al_udma_regs_m2s_rd_print(struct al_udma *udma)
108 {
109 	al_dbg("M2S read regs:\n");
110 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_rd, desc_pref_cfg_1);
111 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_rd, desc_pref_cfg_2);
112 
113 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_rd, desc_pref_cfg_3);
114 	AL_UDMA_PRINT_REG_FIELD(udma, "  ", "\n", "%d", m2s, m2s_rd,
115 			desc_pref_cfg_3,
116 			min_burst_below_thr,
117 			UDMA_M2S_RD_DESC_PREF_CFG_3_MIN_BURST_BELOW_THR);
118 	AL_UDMA_PRINT_REG_FIELD(udma, "  ", "\n", "%d", m2s, m2s_rd,
119 			desc_pref_cfg_3,
120 			min_burst_above_thr,
121 			UDMA_M2S_RD_DESC_PREF_CFG_3_MIN_BURST_ABOVE_THR);
122 	AL_UDMA_PRINT_REG_FIELD(udma, "  ", "\n", "%d", m2s, m2s_rd,
123 			desc_pref_cfg_3,
124 			pref_thr,
125 			UDMA_M2S_RD_DESC_PREF_CFG_3_PREF_THR);
126 
127 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_rd, data_cfg);
128 }
129 
130 static void al_udma_regs_m2s_dwrr_print(struct al_udma *udma)
131 {
132 	al_dbg("M2S DWRR regs:\n");
133 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_dwrr, cfg_sched);
134 }
135 
136 static void al_udma_regs_m2s_rate_limiter_print(struct al_udma *udma)
137 {
138 	al_dbg("M2S rate limiter regs:\n");
139 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_rate_limiter, gen_cfg);
140 }
141 
142 static void al_udma_regs_m2s_stream_rate_limiter_print(struct al_udma *udma)
143 {
144 	al_dbg("M2S stream rate limiter regs:\n");
145 
146 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_stream_rate_limiter,
147 			rlimit.cfg_1s);
148 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_stream_rate_limiter,
149 			rlimit.cfg_cycle);
150 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_stream_rate_limiter,
151 			rlimit.cfg_token_size_1);
152 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_stream_rate_limiter,
153 			rlimit.cfg_token_size_2);
154 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_stream_rate_limiter,
155 			rlimit.mask);
156 }
157 
158 static void al_udma_regs_m2s_comp_print(struct al_udma *udma)
159 {
160 	al_dbg("M2S completion regs:\n");
161 
162 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_comp, cfg_1c);
163 
164 	AL_UDMA_PRINT_REG_FIELD(udma, "  ", "\n", "%d", m2s, m2s_comp, cfg_1c,
165 			comp_fifo_depth,
166 			UDMA_M2S_COMP_CFG_1C_COMP_FIFO_DEPTH);
167 	AL_UDMA_PRINT_REG_FIELD(udma, "  ", "\n", "%d", m2s, m2s_comp, cfg_1c,
168 			unack_fifo_depth,
169 			UDMA_M2S_COMP_CFG_1C_UNACK_FIFO_DEPTH);
170 	AL_UDMA_PRINT_REG_BIT(udma, "  ", "\n", m2s, m2s_comp, cfg_1c,
171 			q_promotion,
172 			UDMA_M2S_COMP_CFG_1C_Q_PROMOTION);
173 	AL_UDMA_PRINT_REG_BIT(udma, "  ", "\n", m2s, m2s_comp, cfg_1c,
174 			force_rr,
175 			UDMA_M2S_COMP_CFG_1C_FORCE_RR);
176 	AL_UDMA_PRINT_REG_FIELD(udma, "  ", "\n", "%d", m2s, m2s_comp, cfg_1c,
177 			q_free_min,
178 			UDMA_M2S_COMP_CFG_1C_Q_FREE_MIN);
179 
180 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_comp, cfg_coal);
181 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_comp, cfg_application_ack);
182 }
183 
184 static void al_udma_regs_m2s_stat_print(struct al_udma *udma)
185 {
186 	al_dbg("M2S statistics regs:\n");
187 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_stat, cfg_st);
188 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_stat, tx_pkt);
189 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_stat, tx_bytes_low);
190 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_stat, tx_bytes_high);
191 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_stat, prefed_desc);
192 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_stat, comp_pkt);
193 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_stat, comp_desc);
194 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_stat, ack_pkts);
195 }
196 
197 static void al_udma_regs_m2s_feature_print(struct al_udma *udma)
198 {
199 	al_dbg("M2S feature regs:\n");
200 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_feature, reg_1);
201 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_feature, reg_3);
202 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_feature, reg_4);
203 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_feature, reg_5);
204 }
205 
206 static void al_udma_regs_m2s_q_print(struct al_udma *udma, uint32_t qid)
207 {
208 	al_dbg("M2S Q[%d] status regs:\n", qid);
209 	al_reg_write32(&udma->udma_regs->m2s.m2s.indirect_ctrl, qid);
210 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, sel_pref_fifo_status);
211 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, sel_comp_fifo_status);
212 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, sel_rate_limit_status);
213 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s, sel_dwrr_status);
214 
215 	al_dbg("M2S Q[%d] regs:\n", qid);
216 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], cfg);
217 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], status);
218 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], tdrbp_low);
219 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], tdrbp_high);
220 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], tdrl);
221 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], tdrhp);
222 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], tdrtp);
223 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], tdcp);
224 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], tcrbp_low);
225 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], tcrbp_high);
226 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], tcrhp);
227 
228 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], rlimit.cfg_1s);
229 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], rlimit.cfg_cycle);
230 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid],
231 			rlimit.cfg_token_size_1);
232 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid],
233 			rlimit.cfg_token_size_2);
234 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], rlimit.mask);
235 
236 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], dwrr_cfg_1);
237 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], dwrr_cfg_2);
238 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], dwrr_cfg_3);
239 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], comp_cfg);
240 	AL_UDMA_PRINT_REG(udma, " ", "\n", m2s, m2s_q[qid], q_tx_pkt);
241 }
242 
243 static void al_udma_regs_s2m_axi_print(struct al_udma *udma)
244 {
245 	al_dbg("S2M AXI regs:\n");
246 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, axi_s2m, data_wr_cfg_1);
247 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, axi_s2m, data_wr_cfg_2);
248 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, axi_s2m, desc_rd_cfg_4);
249 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, axi_s2m, desc_rd_cfg_5);
250 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, axi_s2m, comp_wr_cfg_1);
251 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, axi_s2m, comp_wr_cfg_2);
252 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, axi_s2m, data_wr_cfg);
253 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, axi_s2m, desc_rd_cfg_3);
254 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, axi_s2m, desc_wr_cfg_1);
255 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, axi_s2m, ostand_cfg_rd);
256 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, axi_s2m, ostand_cfg_wr);
257 }
258 
259 static void al_udma_regs_s2m_general_print(struct al_udma *udma)
260 {
261 	al_dbg("S2M general regs:\n");
262 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m, state);
263 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m, err_log_mask);
264 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m, log_0);
265 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m, log_1);
266 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m, log_2);
267 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m, log_3);
268 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m, s_data_fifo_status);
269 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m, s_header_fifo_status);
270 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m, axi_data_fifo_status);
271 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m, unack_fifo_status);
272 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m, check_en);
273 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m, fifo_en);
274 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m, stream_cfg);
275 }
276 
277 static void al_udma_regs_s2m_rd_print(struct al_udma *udma)
278 {
279 	al_dbg("S2M read regs:\n");
280 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_rd, desc_pref_cfg_1);
281 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_rd, desc_pref_cfg_2);
282 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_rd, desc_pref_cfg_3);
283 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_rd, desc_pref_cfg_4);
284 }
285 
286 static void al_udma_regs_s2m_wr_print(struct al_udma *udma)
287 {
288 	al_dbg("S2M write regs:\n");
289 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_wr, data_cfg_1);
290 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_wr, data_cfg_1);
291 }
292 
293 static void al_udma_regs_s2m_comp_print(struct al_udma *udma)
294 {
295 	al_dbg("S2M completion regs:\n");
296 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_comp, cfg_1c);
297 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_comp, cfg_2c);
298 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_comp, cfg_application_ack);
299 }
300 
301 static void al_udma_regs_s2m_stat_print(struct al_udma *udma)
302 {
303 	al_dbg("S2M statistics regs:\n");
304 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_stat, drop_pkt);
305 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_stat, rx_bytes_low);
306 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_stat, rx_bytes_high);
307 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_stat, prefed_desc);
308 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_stat, comp_pkt);
309 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_stat, comp_desc);
310 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_stat, ack_pkts);
311 }
312 
313 static void al_udma_regs_s2m_feature_print(struct al_udma *udma)
314 {
315 	al_dbg("S2M feature regs:\n");
316 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_feature, reg_1);
317 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_feature, reg_3);
318 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_feature, reg_4);
319 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_feature, reg_5);
320 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_feature, reg_6);
321 }
322 
323 static void al_udma_regs_s2m_q_print(struct al_udma *udma, uint32_t qid)
324 {
325 	al_dbg("S2M Q[%d] status regs:\n", qid);
326 	al_reg_write32(&udma->udma_regs->m2s.m2s.indirect_ctrl, qid);
327 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m, sel_pref_fifo_status);
328 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m, sel_comp_fifo_status);
329 
330 	al_dbg("S2M Q[%d] regs:\n", qid);
331 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], cfg);
332 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], status);
333 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], rdrbp_low);
334 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], rdrbp_high);
335 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], rdrl);
336 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], rdrhp);
337 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], rdrtp);
338 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], rdcp);
339 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], rcrbp_low);
340 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], rcrbp_high);
341 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], rcrhp);
342 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], rcrhp_internal);
343 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], comp_cfg);
344 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], comp_cfg_2);
345 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], pkt_cfg);
346 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], qos_cfg);
347 	AL_UDMA_PRINT_REG(udma, " ", "\n", s2m, s2m_q[qid], q_rx_pkt);
348 }
349 
350 void al_udma_regs_print(struct al_udma *udma, unsigned int mask)
351 {
352 	uint32_t i;
353 
354 	if (!udma)
355 		return;
356 
357 	if (udma->type == UDMA_TX) {
358 		if (mask & AL_UDMA_DEBUG_AXI)
359 			al_udma_regs_m2s_axi_print(udma);
360 		if (mask & AL_UDMA_DEBUG_GENERAL)
361 			al_udma_regs_m2s_general_print(udma);
362 		if (mask & AL_UDMA_DEBUG_READ)
363 			al_udma_regs_m2s_rd_print(udma);
364 		if (mask & AL_UDMA_DEBUG_DWRR)
365 			al_udma_regs_m2s_dwrr_print(udma);
366 		if (mask & AL_UDMA_DEBUG_RATE_LIMITER)
367 			al_udma_regs_m2s_rate_limiter_print(udma);
368 		if (mask & AL_UDMA_DEBUG_STREAM_RATE_LIMITER)
369 			al_udma_regs_m2s_stream_rate_limiter_print(udma);
370 		if (mask & AL_UDMA_DEBUG_COMP)
371 			al_udma_regs_m2s_comp_print(udma);
372 		if (mask & AL_UDMA_DEBUG_STAT)
373 			al_udma_regs_m2s_stat_print(udma);
374 		if (mask & AL_UDMA_DEBUG_FEATURE)
375 			al_udma_regs_m2s_feature_print(udma);
376 		for (i = 0; i < DMA_MAX_Q; i++) {
377 			if (mask & AL_UDMA_DEBUG_QUEUE(i))
378 				al_udma_regs_m2s_q_print(udma, i);
379 		}
380 	} else {
381 		if (mask & AL_UDMA_DEBUG_AXI)
382 			al_udma_regs_s2m_axi_print(udma);
383 		if (mask & AL_UDMA_DEBUG_GENERAL)
384 			al_udma_regs_s2m_general_print(udma);
385 		if (mask & AL_UDMA_DEBUG_READ)
386 			al_udma_regs_s2m_rd_print(udma);
387 		if (mask & AL_UDMA_DEBUG_WRITE)
388 			al_udma_regs_s2m_wr_print(udma);
389 		if (mask & AL_UDMA_DEBUG_COMP)
390 			al_udma_regs_s2m_comp_print(udma);
391 		if (mask & AL_UDMA_DEBUG_STAT)
392 			al_udma_regs_s2m_stat_print(udma);
393 		if (mask & AL_UDMA_DEBUG_FEATURE)
394 			al_udma_regs_s2m_feature_print(udma);
395 		for (i = 0; i < DMA_MAX_Q; i++) {
396 			if (mask & AL_UDMA_DEBUG_QUEUE(i))
397 				al_udma_regs_s2m_q_print(udma, i);
398 		}
399 	}
400 }
401 
402 void al_udma_q_struct_print(struct al_udma *udma, uint32_t qid)
403 {
404 	struct al_udma_q *queue;
405 
406 	if (!udma)
407 		return;
408 
409 	if (qid >= DMA_MAX_Q)
410 		return;
411 
412 	queue = &udma->udma_q[qid];
413 
414 	al_dbg("Q[%d] struct:\n", qid);
415 	al_dbg(" size_mask = 0x%08x\n", (uint32_t)queue->size_mask);
416 	al_dbg(" q_regs = %p\n", queue->q_regs);
417 	al_dbg(" desc_base_ptr = %p\n", queue->desc_base_ptr);
418 	al_dbg(" next_desc_idx = %d\n", (uint16_t)queue->next_desc_idx);
419 	al_dbg(" desc_ring_id = %d\n", (uint32_t)queue->desc_ring_id);
420 	al_dbg(" cdesc_base_ptr = %p\n", queue->cdesc_base_ptr);
421 	al_dbg(" cdesc_size = %d\n", (uint32_t)queue->cdesc_size);
422 	al_dbg(" next_cdesc_idx = %d\n", (uint16_t)queue->next_cdesc_idx);
423 	al_dbg(" end_cdesc_ptr = %p\n", queue->end_cdesc_ptr);
424 	al_dbg(" comp_head_idx = %d\n", (uint16_t)queue->comp_head_idx);
425 	al_dbg(" comp_head_ptr = %p\n", queue->comp_head_ptr);
426 	al_dbg(" pkt_crnt_descs = %d\n", (uint32_t)queue->pkt_crnt_descs);
427 	al_dbg(" comp_ring_id = %d\n", (uint32_t)queue->comp_ring_id);
428 	al_dbg(" desc_phy_base = 0x%016llx\n", (uint64_t)queue->desc_phy_base);
429 	al_dbg(" cdesc_phy_base = 0x%016llx\n",
430 			(uint64_t)queue->cdesc_phy_base);
431 	al_dbg(" flags = 0x%08x\n", (uint32_t)queue->flags);
432 	al_dbg(" size = %d\n", (uint32_t)queue->size);
433 	al_dbg(" status = %d\n", (uint32_t)queue->status);
434 	al_dbg(" udma = %p\n", queue->udma);
435 	al_dbg(" qid = %d\n", (uint32_t)queue->qid);
436 }
437 
438 void al_udma_ring_print(struct al_udma *udma, uint32_t qid,
439 		enum al_udma_ring_type rtype)
440 {
441 	struct al_udma_q *queue;
442 	uint32_t desc_size;
443 	void *base_ptr;
444 	uint32_t i;
445 
446 	if (!udma)
447 		return;
448 
449 	if (qid >= DMA_MAX_Q)
450 		return;
451 
452 	queue = &udma->udma_q[qid];
453 	if (rtype == AL_RING_SUBMISSION) {
454 		base_ptr = queue->desc_base_ptr;
455 		desc_size = sizeof(union al_udma_desc);
456 		if (base_ptr)
457 			al_dbg("Q[%d] submission ring pointers:\n", qid);
458 		else {
459 			al_dbg("Q[%d] submission ring is not allocated\n", qid);
460 			return;
461 		}
462 	} else {
463 		base_ptr = queue->cdesc_base_ptr;
464 		desc_size = queue->cdesc_size;
465 		if (base_ptr)
466 			al_dbg("Q[%d] completion ring pointers:\n", qid);
467 		else {
468 			al_dbg("Q[%d] completion ring is not allocated\n", qid);
469 			return;
470 		}
471 	}
472 
473 	for (i = 0; i < queue->size; i++) {
474 		uint32_t *curr_addr = (void*)((uint32_t)base_ptr + i * desc_size);
475 		if (desc_size == 16)
476 			al_dbg("[%04d](%p): %08x %08x %08x %08x\n",
477 					i,
478 					curr_addr,
479 					(uint32_t)*curr_addr,
480 					(uint32_t)*(curr_addr+1),
481 					(uint32_t)*(curr_addr+2),
482 					(uint32_t)*(curr_addr+3));
483 		else if (desc_size == 8)
484 			al_dbg("[%04d](%p): %08x %08x\n",
485 					i,
486 					curr_addr,
487 					(uint32_t)*curr_addr,
488 					(uint32_t)*(curr_addr+1));
489 		else if (desc_size == 4)
490 			al_dbg("[%04d](%p): %08x\n",
491 					i,
492 					curr_addr,
493 					(uint32_t)*curr_addr);
494 		else
495 			break;
496 	}
497 }
498