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 145 SURFACE_TRACE("surface->tiling_info.gfx9.swizzle = %d;\n", 146 surface->tiling_info.gfx9.swizzle); 147 148 SURFACE_TRACE("\n"); 149 } 150 SURFACE_TRACE("\n"); 151 } 152 153 void update_surface_trace( 154 const struct dc *dc, 155 const struct dc_surface_update *updates, 156 int surface_count) 157 { 158 int i; 159 struct core_dc *core_dc = DC_TO_CORE(dc); 160 struct dal_logger *logger = core_dc->ctx->logger; 161 162 for (i = 0; i < surface_count; i++) { 163 const struct dc_surface_update *update = &updates[i]; 164 165 SURFACE_TRACE("Update %d\n", i); 166 if (update->flip_addr) { 167 SURFACE_TRACE("flip_addr->address.type = %d;\n" 168 "flip_addr->address.grph.addr.quad_part = 0x%X;\n" 169 "flip_addr->address.grph.meta_addr.quad_part = 0x%X;\n" 170 "flip_addr->flip_immediate = %d;\n", 171 update->flip_addr->address.type, 172 update->flip_addr->address.grph.addr.quad_part, 173 update->flip_addr->address.grph.meta_addr.quad_part, 174 update->flip_addr->flip_immediate); 175 } 176 177 if (update->plane_info) { 178 SURFACE_TRACE( 179 "plane_info->color_space = %d;\n" 180 "plane_info->format = %d;\n" 181 "plane_info->plane_size.grph.surface_pitch = %d;\n" 182 "plane_info->plane_size.grph.surface_size.height = %d;\n" 183 "plane_info->plane_size.grph.surface_size.width = %d;\n" 184 "plane_info->plane_size.grph.surface_size.x = %d;\n" 185 "plane_info->plane_size.grph.surface_size.y = %d;\n" 186 "plane_info->rotation = %d;\n", 187 update->plane_info->color_space, 188 update->plane_info->format, 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 SURFACE_TRACE("surface->tiling_info.gfx9.swizzle = %d;\n", 230 update->plane_info->tiling_info.gfx9.swizzle); 231 } 232 233 if (update->scaling_info) { 234 SURFACE_TRACE( 235 "scaling_info->src_rect.x = %d;\n" 236 "scaling_info->src_rect.y = %d;\n" 237 "scaling_info->src_rect.width = %d;\n" 238 "scaling_info->src_rect.height = %d;\n" 239 "scaling_info->dst_rect.x = %d;\n" 240 "scaling_info->dst_rect.y = %d;\n" 241 "scaling_info->dst_rect.width = %d;\n" 242 "scaling_info->dst_rect.height = %d;\n" 243 "scaling_info->clip_rect.x = %d;\n" 244 "scaling_info->clip_rect.y = %d;\n" 245 "scaling_info->clip_rect.width = %d;\n" 246 "scaling_info->clip_rect.height = %d;\n" 247 "scaling_info->scaling_quality.h_taps = %d;\n" 248 "scaling_info->scaling_quality.v_taps = %d;\n" 249 "scaling_info->scaling_quality.h_taps_c = %d;\n" 250 "scaling_info->scaling_quality.v_taps_c = %d;\n", 251 update->scaling_info->src_rect.x, 252 update->scaling_info->src_rect.y, 253 update->scaling_info->src_rect.width, 254 update->scaling_info->src_rect.height, 255 update->scaling_info->dst_rect.x, 256 update->scaling_info->dst_rect.y, 257 update->scaling_info->dst_rect.width, 258 update->scaling_info->dst_rect.height, 259 update->scaling_info->clip_rect.x, 260 update->scaling_info->clip_rect.y, 261 update->scaling_info->clip_rect.width, 262 update->scaling_info->clip_rect.height, 263 update->scaling_info->scaling_quality.h_taps, 264 update->scaling_info->scaling_quality.v_taps, 265 update->scaling_info->scaling_quality.h_taps_c, 266 update->scaling_info->scaling_quality.v_taps_c); 267 } 268 SURFACE_TRACE("\n"); 269 } 270 SURFACE_TRACE("\n"); 271 } 272 273 void post_surface_trace(const struct dc *dc) 274 { 275 struct core_dc *core_dc = DC_TO_CORE(dc); 276 struct dal_logger *logger = core_dc->ctx->logger; 277 278 SURFACE_TRACE("post surface process.\n"); 279 280 } 281 282 void context_timing_trace( 283 const struct dc *dc, 284 struct resource_context *res_ctx) 285 { 286 int i; 287 struct core_dc *core_dc = DC_TO_CORE(dc); 288 struct dal_logger *logger = core_dc->ctx->logger; 289 int h_pos[MAX_PIPES], v_pos[MAX_PIPES]; 290 291 for (i = 0; i < core_dc->res_pool->pipe_count; i++) { 292 struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i]; 293 294 if (pipe_ctx->stream == NULL) 295 continue; 296 297 pipe_ctx->tg->funcs->get_position(pipe_ctx->tg, &h_pos[i], &v_pos[i]); 298 } 299 for (i = 0; i < core_dc->res_pool->pipe_count; i++) { 300 struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i]; 301 302 if (pipe_ctx->stream == NULL) 303 continue; 304 305 TIMING_TRACE("OTG_%d H_tot:%d V_tot:%d H_pos:%d V_pos:%d\n", 306 pipe_ctx->tg->inst, 307 pipe_ctx->stream->public.timing.h_total, 308 pipe_ctx->stream->public.timing.v_total, 309 h_pos[i], v_pos[i]); 310 } 311 } 312