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.surface_size.x,
99 				surface->plane_size.grph.surface_size.y,
100 				surface->plane_size.grph.surface_size.width,
101 				surface->plane_size.grph.surface_size.height,
102 				surface->plane_size.grph.surface_pitch);
103 
104 
105 		SURFACE_TRACE(
106 				"surface->tiling_info.gfx8.num_banks = %d;\n"
107 				"surface->tiling_info.gfx8.bank_width = %d;\n"
108 				"surface->tiling_info.gfx8.bank_width_c = %d;\n"
109 				"surface->tiling_info.gfx8.bank_height = %d;\n"
110 				"surface->tiling_info.gfx8.bank_height_c = %d;\n"
111 				"surface->tiling_info.gfx8.tile_aspect = %d;\n"
112 				"surface->tiling_info.gfx8.tile_aspect_c = %d;\n"
113 				"surface->tiling_info.gfx8.tile_split = %d;\n"
114 				"surface->tiling_info.gfx8.tile_split_c = %d;\n"
115 				"surface->tiling_info.gfx8.tile_mode = %d;\n"
116 				"surface->tiling_info.gfx8.tile_mode_c = %d;\n",
117 				surface->tiling_info.gfx8.num_banks,
118 				surface->tiling_info.gfx8.bank_width,
119 				surface->tiling_info.gfx8.bank_width_c,
120 				surface->tiling_info.gfx8.bank_height,
121 				surface->tiling_info.gfx8.bank_height_c,
122 				surface->tiling_info.gfx8.tile_aspect,
123 				surface->tiling_info.gfx8.tile_aspect_c,
124 				surface->tiling_info.gfx8.tile_split,
125 				surface->tiling_info.gfx8.tile_split_c,
126 				surface->tiling_info.gfx8.tile_mode,
127 				surface->tiling_info.gfx8.tile_mode_c);
128 
129 		SURFACE_TRACE(
130 				"surface->tiling_info.gfx8.pipe_config = %d;\n"
131 				"surface->tiling_info.gfx8.array_mode = %d;\n"
132 				"surface->color_space = %d;\n"
133 				"surface->dcc.enable = %d;\n"
134 				"surface->format = %d;\n"
135 				"surface->rotation = %d;\n"
136 				"surface->stereo_format = %d;\n",
137 				surface->tiling_info.gfx8.pipe_config,
138 				surface->tiling_info.gfx8.array_mode,
139 				surface->color_space,
140 				surface->dcc.enable,
141 				surface->format,
142 				surface->rotation,
143 				surface->stereo_format);
144 		SURFACE_TRACE("\n");
145 	}
146 	SURFACE_TRACE("\n");
147 }
148 
149 void update_surface_trace(
150 		const struct dc *dc,
151 		const struct dc_surface_update *updates,
152 		int surface_count)
153 {
154 	int i;
155 	struct core_dc *core_dc = DC_TO_CORE(dc);
156 	struct dal_logger *logger =  core_dc->ctx->logger;
157 
158 	for (i = 0; i < surface_count; i++) {
159 		const struct dc_surface_update *update = &updates[i];
160 
161 		SURFACE_TRACE("Update %d\n", i);
162 		if (update->flip_addr) {
163 			SURFACE_TRACE("flip_addr->address.type = %d;\n"
164 					"flip_addr->address.grph.addr.quad_part = 0x%X;\n"
165 					"flip_addr->address.grph.meta_addr.quad_part = 0x%X;\n"
166 					"flip_addr->flip_immediate = %d;\n",
167 					update->flip_addr->address.type,
168 					update->flip_addr->address.grph.addr.quad_part,
169 					update->flip_addr->address.grph.meta_addr.quad_part,
170 					update->flip_addr->flip_immediate);
171 		}
172 
173 		if (update->plane_info) {
174 			SURFACE_TRACE(
175 					"plane_info->color_space = %d;\n"
176 					"plane_info->format = %d;\n"
177 					"plane_info->plane_size.grph.surface_pitch = %d;\n"
178 					"plane_info->plane_size.grph.surface_size.height = %d;\n"
179 					"plane_info->plane_size.grph.surface_size.width = %d;\n"
180 					"plane_info->plane_size.grph.surface_size.x = %d;\n"
181 					"plane_info->plane_size.grph.surface_size.y = %d;\n"
182 					"plane_info->rotation = %d;\n",
183 					update->plane_info->color_space,
184 					update->plane_info->format,
185 					update->plane_info->plane_size.grph.surface_pitch,
186 					update->plane_info->plane_size.grph.surface_size.height,
187 					update->plane_info->plane_size.grph.surface_size.width,
188 					update->plane_info->plane_size.grph.surface_size.x,
189 					update->plane_info->plane_size.grph.surface_size.y,
190 					update->plane_info->rotation,
191 					update->plane_info->stereo_format);
192 
193 			SURFACE_TRACE(
194 					"plane_info->tiling_info.gfx8.num_banks = %d;\n"
195 					"plane_info->tiling_info.gfx8.bank_width = %d;\n"
196 					"plane_info->tiling_info.gfx8.bank_width_c = %d;\n"
197 					"plane_info->tiling_info.gfx8.bank_height = %d;\n"
198 					"plane_info->tiling_info.gfx8.bank_height_c = %d;\n"
199 					"plane_info->tiling_info.gfx8.tile_aspect = %d;\n"
200 					"plane_info->tiling_info.gfx8.tile_aspect_c = %d;\n"
201 					"plane_info->tiling_info.gfx8.tile_split = %d;\n"
202 					"plane_info->tiling_info.gfx8.tile_split_c = %d;\n"
203 					"plane_info->tiling_info.gfx8.tile_mode = %d;\n"
204 					"plane_info->tiling_info.gfx8.tile_mode_c = %d;\n",
205 					update->plane_info->tiling_info.gfx8.num_banks,
206 					update->plane_info->tiling_info.gfx8.bank_width,
207 					update->plane_info->tiling_info.gfx8.bank_width_c,
208 					update->plane_info->tiling_info.gfx8.bank_height,
209 					update->plane_info->tiling_info.gfx8.bank_height_c,
210 					update->plane_info->tiling_info.gfx8.tile_aspect,
211 					update->plane_info->tiling_info.gfx8.tile_aspect_c,
212 					update->plane_info->tiling_info.gfx8.tile_split,
213 					update->plane_info->tiling_info.gfx8.tile_split_c,
214 					update->plane_info->tiling_info.gfx8.tile_mode,
215 					update->plane_info->tiling_info.gfx8.tile_mode_c);
216 
217 			SURFACE_TRACE(
218 					"plane_info->tiling_info.gfx8.pipe_config = %d;\n"
219 					"plane_info->tiling_info.gfx8.array_mode = %d;\n"
220 					"plane_info->visible = %d;\n",
221 					update->plane_info->tiling_info.gfx8.pipe_config,
222 					update->plane_info->tiling_info.gfx8.array_mode,
223 					update->plane_info->visible);
224 		}
225 
226 		if (update->scaling_info) {
227 			SURFACE_TRACE(
228 					"scaling_info->src_rect.x = %d;\n"
229 					"scaling_info->src_rect.y = %d;\n"
230 					"scaling_info->src_rect.width = %d;\n"
231 					"scaling_info->src_rect.height = %d;\n"
232 					"scaling_info->dst_rect.x = %d;\n"
233 					"scaling_info->dst_rect.y = %d;\n"
234 					"scaling_info->dst_rect.width = %d;\n"
235 					"scaling_info->dst_rect.height = %d;\n"
236 					"scaling_info->clip_rect.x = %d;\n"
237 					"scaling_info->clip_rect.y = %d;\n"
238 					"scaling_info->clip_rect.width = %d;\n"
239 					"scaling_info->clip_rect.height = %d;\n"
240 					"scaling_info->scaling_quality.h_taps = %d;\n"
241 					"scaling_info->scaling_quality.v_taps = %d;\n"
242 					"scaling_info->scaling_quality.h_taps_c = %d;\n"
243 					"scaling_info->scaling_quality.v_taps_c = %d;\n",
244 					update->scaling_info->src_rect.x,
245 					update->scaling_info->src_rect.y,
246 					update->scaling_info->src_rect.width,
247 					update->scaling_info->src_rect.height,
248 					update->scaling_info->dst_rect.x,
249 					update->scaling_info->dst_rect.y,
250 					update->scaling_info->dst_rect.width,
251 					update->scaling_info->dst_rect.height,
252 					update->scaling_info->clip_rect.x,
253 					update->scaling_info->clip_rect.y,
254 					update->scaling_info->clip_rect.width,
255 					update->scaling_info->clip_rect.height,
256 					update->scaling_info->scaling_quality.h_taps,
257 					update->scaling_info->scaling_quality.v_taps,
258 					update->scaling_info->scaling_quality.h_taps_c,
259 					update->scaling_info->scaling_quality.v_taps_c);
260 		}
261 		SURFACE_TRACE("\n");
262 	}
263 	SURFACE_TRACE("\n");
264 }
265 
266 void post_surface_trace(const struct dc *dc)
267 {
268 	struct core_dc *core_dc = DC_TO_CORE(dc);
269 	struct dal_logger *logger =  core_dc->ctx->logger;
270 
271 	SURFACE_TRACE("post surface process.\n");
272 
273 }
274 
275 void context_timing_trace(
276 		const struct dc *dc,
277 		struct resource_context *res_ctx)
278 {
279 	int i;
280 	struct core_dc *core_dc = DC_TO_CORE(dc);
281 	struct dal_logger *logger =  core_dc->ctx->logger;
282 	int h_pos[MAX_PIPES], v_pos[MAX_PIPES];
283 
284 	for (i = 0; i < core_dc->res_pool->pipe_count; i++) {
285 		struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i];
286 
287 		if (pipe_ctx->stream == NULL)
288 			continue;
289 
290 		pipe_ctx->tg->funcs->get_position(pipe_ctx->tg, &h_pos[i], &v_pos[i]);
291 	}
292 	for (i = 0; i < core_dc->res_pool->pipe_count; i++) {
293 		struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i];
294 
295 		if (pipe_ctx->stream == NULL)
296 			continue;
297 
298 		TIMING_TRACE("OTG_%d   H_tot:%d  V_tot:%d   H_pos:%d  V_pos:%d\n",
299 				pipe_ctx->tg->inst,
300 				pipe_ctx->stream->public.timing.h_total,
301 				pipe_ctx->stream->public.timing.v_total,
302 				h_pos[i], v_pos[i]);
303 	}
304 }
305