1 /*
2  * dc_debug.c
3  *
4  *  Created on: Nov 3, 2016
5  *      Author: yonsun
6  */
7 
8 #include "dm_services.h"
9 
10 #include "dc.h"
11 
12 #include "core_status.h"
13 #include "core_types.h"
14 #include "hw_sequencer.h"
15 
16 #include "resource.h"
17 
18 #define SURFACE_TRACE(...) do {\
19 		if (dc->debug.surface_trace) \
20 			dm_logger_write(logger, \
21 					LOG_IF_TRACE, \
22 					##__VA_ARGS__); \
23 } while (0)
24 
25 #define TIMING_TRACE(...) do {\
26 	if (dc->debug.timing_trace) \
27 		dm_logger_write(logger, \
28 				LOG_SYNC, \
29 				##__VA_ARGS__); \
30 } while (0)
31 
32 void pre_surface_trace(
33 		const struct dc *dc,
34 		const struct dc_surface *const *surfaces,
35 		int surface_count)
36 {
37 	int i;
38 	struct core_dc *core_dc = DC_TO_CORE(dc);
39 	struct dal_logger *logger =  core_dc->ctx->logger;
40 
41 	for (i = 0; i < surface_count; i++) {
42 		const struct dc_surface *surface = surfaces[i];
43 
44 		SURFACE_TRACE("Surface %d:\n", i);
45 
46 		SURFACE_TRACE(
47 				"surface->visible = %d;\n"
48 				"surface->flip_immediate = %d;\n"
49 				"surface->address.type = %d;\n"
50 				"surface->address.grph.addr.quad_part = 0x%X;\n"
51 				"surface->address.grph.meta_addr.quad_part = 0x%X;\n"
52 				"surface->scaling_quality.h_taps = %d;\n"
53 				"surface->scaling_quality.v_taps = %d;\n"
54 				"surface->scaling_quality.h_taps_c = %d;\n"
55 				"surface->scaling_quality.v_taps_c = %d;\n",
56 				surface->visible,
57 				surface->flip_immediate,
58 				surface->address.type,
59 				surface->address.grph.addr.quad_part,
60 				surface->address.grph.meta_addr.quad_part,
61 				surface->scaling_quality.h_taps,
62 				surface->scaling_quality.v_taps,
63 				surface->scaling_quality.h_taps_c,
64 				surface->scaling_quality.v_taps_c);
65 
66 		SURFACE_TRACE(
67 				"surface->src_rect.x = %d;\n"
68 				"surface->src_rect.y = %d;\n"
69 				"surface->src_rect.width = %d;\n"
70 				"surface->src_rect.height = %d;\n"
71 				"surface->dst_rect.x = %d;\n"
72 				"surface->dst_rect.y = %d;\n"
73 				"surface->dst_rect.width = %d;\n"
74 				"surface->dst_rect.height = %d;\n"
75 				"surface->clip_rect.x = %d;\n"
76 				"surface->clip_rect.y = %d;\n"
77 				"surface->clip_rect.width = %d;\n"
78 				"surface->clip_rect.height = %d;\n",
79 				surface->src_rect.x,
80 				surface->src_rect.y,
81 				surface->src_rect.width,
82 				surface->src_rect.height,
83 				surface->dst_rect.x,
84 				surface->dst_rect.y,
85 				surface->dst_rect.width,
86 				surface->dst_rect.height,
87 				surface->clip_rect.x,
88 				surface->clip_rect.y,
89 				surface->clip_rect.width,
90 				surface->clip_rect.height);
91 
92 		SURFACE_TRACE(
93 				"surface->plane_size.grph.surface_size.x = %d;\n"
94 				"surface->plane_size.grph.surface_size.y = %d;\n"
95 				"surface->plane_size.grph.surface_size.width = %d;\n"
96 				"surface->plane_size.grph.surface_size.height = %d;\n"
97 				"surface->plane_size.grph.surface_pitch = %d;\n"
98 				"surface->plane_size.grph.meta_pitch = %d;\n",
99 				surface->plane_size.grph.surface_size.x,
100 				surface->plane_size.grph.surface_size.y,
101 				surface->plane_size.grph.surface_size.width,
102 				surface->plane_size.grph.surface_size.height,
103 				surface->plane_size.grph.surface_pitch,
104 				surface->plane_size.grph.meta_pitch);
105 
106 
107 		SURFACE_TRACE(
108 				"surface->tiling_info.gfx8.num_banks = %d;\n"
109 				"surface->tiling_info.gfx8.bank_width = %d;\n"
110 				"surface->tiling_info.gfx8.bank_width_c = %d;\n"
111 				"surface->tiling_info.gfx8.bank_height = %d;\n"
112 				"surface->tiling_info.gfx8.bank_height_c = %d;\n"
113 				"surface->tiling_info.gfx8.tile_aspect = %d;\n"
114 				"surface->tiling_info.gfx8.tile_aspect_c = %d;\n"
115 				"surface->tiling_info.gfx8.tile_split = %d;\n"
116 				"surface->tiling_info.gfx8.tile_split_c = %d;\n"
117 				"surface->tiling_info.gfx8.tile_mode = %d;\n"
118 				"surface->tiling_info.gfx8.tile_mode_c = %d;\n",
119 				surface->tiling_info.gfx8.num_banks,
120 				surface->tiling_info.gfx8.bank_width,
121 				surface->tiling_info.gfx8.bank_width_c,
122 				surface->tiling_info.gfx8.bank_height,
123 				surface->tiling_info.gfx8.bank_height_c,
124 				surface->tiling_info.gfx8.tile_aspect,
125 				surface->tiling_info.gfx8.tile_aspect_c,
126 				surface->tiling_info.gfx8.tile_split,
127 				surface->tiling_info.gfx8.tile_split_c,
128 				surface->tiling_info.gfx8.tile_mode,
129 				surface->tiling_info.gfx8.tile_mode_c);
130 
131 		SURFACE_TRACE(
132 				"surface->tiling_info.gfx8.pipe_config = %d;\n"
133 				"surface->tiling_info.gfx8.array_mode = %d;\n"
134 				"surface->color_space = %d;\n"
135 				"surface->dcc.enable = %d;\n"
136 				"surface->format = %d;\n"
137 				"surface->rotation = %d;\n"
138 				"surface->stereo_format = %d;\n",
139 				surface->tiling_info.gfx8.pipe_config,
140 				surface->tiling_info.gfx8.array_mode,
141 				surface->color_space,
142 				surface->dcc.enable,
143 				surface->format,
144 				surface->rotation,
145 				surface->stereo_format);
146 		SURFACE_TRACE("\n");
147 	}
148 	SURFACE_TRACE("\n");
149 }
150 
151 void update_surface_trace(
152 		const struct dc *dc,
153 		const struct dc_surface_update *updates,
154 		int surface_count)
155 {
156 	int i;
157 	struct core_dc *core_dc = DC_TO_CORE(dc);
158 	struct dal_logger *logger =  core_dc->ctx->logger;
159 
160 	for (i = 0; i < surface_count; i++) {
161 		const struct dc_surface_update *update = &updates[i];
162 
163 		SURFACE_TRACE("Update %d\n", i);
164 		if (update->flip_addr) {
165 			SURFACE_TRACE("flip_addr->address.type = %d;\n"
166 					"flip_addr->address.grph.addr.quad_part = 0x%X;\n"
167 					"flip_addr->address.grph.meta_addr.quad_part = 0x%X;\n"
168 					"flip_addr->flip_immediate = %d;\n",
169 					update->flip_addr->address.type,
170 					update->flip_addr->address.grph.addr.quad_part,
171 					update->flip_addr->address.grph.meta_addr.quad_part,
172 					update->flip_addr->flip_immediate);
173 		}
174 
175 		if (update->plane_info) {
176 			SURFACE_TRACE(
177 					"plane_info->color_space = %d;\n"
178 					"plane_info->format = %d;\n"
179 					"plane_info->plane_size.grph.meta_pitch = %d;\n"
180 					"plane_info->plane_size.grph.surface_pitch = %d;\n"
181 					"plane_info->plane_size.grph.surface_size.height = %d;\n"
182 					"plane_info->plane_size.grph.surface_size.width = %d;\n"
183 					"plane_info->plane_size.grph.surface_size.x = %d;\n"
184 					"plane_info->plane_size.grph.surface_size.y = %d;\n"
185 					"plane_info->rotation = %d;\n",
186 					update->plane_info->color_space,
187 					update->plane_info->format,
188 					update->plane_info->plane_size.grph.meta_pitch,
189 					update->plane_info->plane_size.grph.surface_pitch,
190 					update->plane_info->plane_size.grph.surface_size.height,
191 					update->plane_info->plane_size.grph.surface_size.width,
192 					update->plane_info->plane_size.grph.surface_size.x,
193 					update->plane_info->plane_size.grph.surface_size.y,
194 					update->plane_info->rotation,
195 					update->plane_info->stereo_format);
196 
197 			SURFACE_TRACE(
198 					"plane_info->tiling_info.gfx8.num_banks = %d;\n"
199 					"plane_info->tiling_info.gfx8.bank_width = %d;\n"
200 					"plane_info->tiling_info.gfx8.bank_width_c = %d;\n"
201 					"plane_info->tiling_info.gfx8.bank_height = %d;\n"
202 					"plane_info->tiling_info.gfx8.bank_height_c = %d;\n"
203 					"plane_info->tiling_info.gfx8.tile_aspect = %d;\n"
204 					"plane_info->tiling_info.gfx8.tile_aspect_c = %d;\n"
205 					"plane_info->tiling_info.gfx8.tile_split = %d;\n"
206 					"plane_info->tiling_info.gfx8.tile_split_c = %d;\n"
207 					"plane_info->tiling_info.gfx8.tile_mode = %d;\n"
208 					"plane_info->tiling_info.gfx8.tile_mode_c = %d;\n",
209 					update->plane_info->tiling_info.gfx8.num_banks,
210 					update->plane_info->tiling_info.gfx8.bank_width,
211 					update->plane_info->tiling_info.gfx8.bank_width_c,
212 					update->plane_info->tiling_info.gfx8.bank_height,
213 					update->plane_info->tiling_info.gfx8.bank_height_c,
214 					update->plane_info->tiling_info.gfx8.tile_aspect,
215 					update->plane_info->tiling_info.gfx8.tile_aspect_c,
216 					update->plane_info->tiling_info.gfx8.tile_split,
217 					update->plane_info->tiling_info.gfx8.tile_split_c,
218 					update->plane_info->tiling_info.gfx8.tile_mode,
219 					update->plane_info->tiling_info.gfx8.tile_mode_c);
220 
221 			SURFACE_TRACE(
222 					"plane_info->tiling_info.gfx8.pipe_config = %d;\n"
223 					"plane_info->tiling_info.gfx8.array_mode = %d;\n"
224 					"plane_info->visible = %d;\n",
225 					update->plane_info->tiling_info.gfx8.pipe_config,
226 					update->plane_info->tiling_info.gfx8.array_mode,
227 					update->plane_info->visible);
228 		}
229 
230 		if (update->scaling_info) {
231 			SURFACE_TRACE(
232 					"scaling_info->src_rect.x = %d;\n"
233 					"scaling_info->src_rect.y = %d;\n"
234 					"scaling_info->src_rect.width = %d;\n"
235 					"scaling_info->src_rect.height = %d;\n"
236 					"scaling_info->dst_rect.x = %d;\n"
237 					"scaling_info->dst_rect.y = %d;\n"
238 					"scaling_info->dst_rect.width = %d;\n"
239 					"scaling_info->dst_rect.height = %d;\n"
240 					"scaling_info->clip_rect.x = %d;\n"
241 					"scaling_info->clip_rect.y = %d;\n"
242 					"scaling_info->clip_rect.width = %d;\n"
243 					"scaling_info->clip_rect.height = %d;\n"
244 					"scaling_info->scaling_quality.h_taps = %d;\n"
245 					"scaling_info->scaling_quality.v_taps = %d;\n"
246 					"scaling_info->scaling_quality.h_taps_c = %d;\n"
247 					"scaling_info->scaling_quality.v_taps_c = %d;\n",
248 					update->scaling_info->src_rect.x,
249 					update->scaling_info->src_rect.y,
250 					update->scaling_info->src_rect.width,
251 					update->scaling_info->src_rect.height,
252 					update->scaling_info->dst_rect.x,
253 					update->scaling_info->dst_rect.y,
254 					update->scaling_info->dst_rect.width,
255 					update->scaling_info->dst_rect.height,
256 					update->scaling_info->clip_rect.x,
257 					update->scaling_info->clip_rect.y,
258 					update->scaling_info->clip_rect.width,
259 					update->scaling_info->clip_rect.height,
260 					update->scaling_info->scaling_quality.h_taps,
261 					update->scaling_info->scaling_quality.v_taps,
262 					update->scaling_info->scaling_quality.h_taps_c,
263 					update->scaling_info->scaling_quality.v_taps_c);
264 		}
265 		SURFACE_TRACE("\n");
266 	}
267 	SURFACE_TRACE("\n");
268 }
269 
270 void post_surface_trace(const struct dc *dc)
271 {
272 	struct core_dc *core_dc = DC_TO_CORE(dc);
273 	struct dal_logger *logger =  core_dc->ctx->logger;
274 
275 	SURFACE_TRACE("post surface process.\n");
276 
277 }
278 
279 void context_timing_trace(
280 		const struct dc *dc,
281 		struct resource_context *res_ctx)
282 {
283 	int i;
284 	struct core_dc *core_dc = DC_TO_CORE(dc);
285 	struct dal_logger *logger =  core_dc->ctx->logger;
286 
287 	for (i = 0; i < core_dc->res_pool->pipe_count; i++) {
288 		struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i];
289 		int h_pos = 0;
290 		int v_pos = 0;
291 
292 		if (pipe_ctx->stream == NULL)
293 			continue;
294 
295 		pipe_ctx->tg->funcs->get_position(pipe_ctx->tg, &h_pos, &v_pos);
296 		TIMING_TRACE("Pipe_%d   H_tot:%d  V_tot:%d   H_pos:%d  V_pos:%d\n",
297 				pipe_ctx->pipe_idx,
298 				pipe_ctx->stream->public.timing.h_total,
299 				pipe_ctx->stream->public.timing.v_total,
300 				h_pos, v_pos);
301 	}
302 }
303