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
al_udma_regs_m2s_axi_print(struct al_udma * udma)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
al_udma_regs_m2s_general_print(struct al_udma * udma)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
al_udma_regs_m2s_rd_print(struct al_udma * udma)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
al_udma_regs_m2s_dwrr_print(struct al_udma * udma)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
al_udma_regs_m2s_rate_limiter_print(struct al_udma * udma)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
al_udma_regs_m2s_stream_rate_limiter_print(struct al_udma * udma)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
al_udma_regs_m2s_comp_print(struct al_udma * udma)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
al_udma_regs_m2s_stat_print(struct al_udma * udma)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
al_udma_regs_m2s_feature_print(struct al_udma * udma)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
al_udma_regs_m2s_q_print(struct al_udma * udma,uint32_t qid)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
al_udma_regs_s2m_axi_print(struct al_udma * udma)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
al_udma_regs_s2m_general_print(struct al_udma * udma)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
al_udma_regs_s2m_rd_print(struct al_udma * udma)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
al_udma_regs_s2m_wr_print(struct al_udma * udma)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
al_udma_regs_s2m_comp_print(struct al_udma * udma)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
al_udma_regs_s2m_stat_print(struct al_udma * udma)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
al_udma_regs_s2m_feature_print(struct al_udma * udma)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
al_udma_regs_s2m_q_print(struct al_udma * udma,uint32_t qid)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
al_udma_regs_print(struct al_udma * udma,unsigned int mask)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
al_udma_q_struct_print(struct al_udma * udma,uint32_t qid)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%016jx\n", (uintmax_t)queue->desc_phy_base);
429 al_dbg(" cdesc_phy_base = 0x%016jx\n",
430 (uintmax_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
al_udma_ring_print(struct al_udma * udma,uint32_t qid,enum al_udma_ring_type rtype)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*)((uintptr_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