Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/display: Add DP audio BW validation

[Why]
Timings with small HBlank (such as CVT RBv2) can result in insufficient
HBlank bandwidth for audio SDP transmission when DSC is active. This
will cause some higher bandwidth audio modes to fail.

The combination of CVT RBv2 timings + DSC can commonly be encountered
in MST scenarios.

[How]
Add DP audio bandwidth validation for 8b/10b MST and 128b/132b SST/MST
cases and filter out modes that cannot be supported with the current
timing config.

Reviewed-by: Wenjing Liu <wenjing.liu@amd.com>
Acked-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: George Shen <george.shen@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

George Shen and committed by
Alex Deucher
12f72a15 d451b534

+352 -19
+278 -16
drivers/gpu/drm/amd/display/dc/dce/dce_audio.c
··· 239 239 } 240 240 } 241 241 } 242 - 243 - /*For DP SST, calculate if specified sample rates can fit into a given timing */ 244 - static void check_audio_bandwidth_dpsst( 245 - const struct audio_crtc_info *crtc_info, 246 - uint32_t channel_count, 247 - union audio_sample_rates *sample_rates) 242 + static struct fixed31_32 get_link_symbol_clk_freq_mhz(enum dc_link_rate link_rate) 248 243 { 249 - /* do nothing */ 244 + switch (link_rate) { 245 + case LINK_RATE_LOW: 246 + return dc_fixpt_from_int(162); /* 162 MHz */ 247 + case LINK_RATE_HIGH: 248 + return dc_fixpt_from_int(270); /* 270 MHz */ 249 + case LINK_RATE_HIGH2: 250 + return dc_fixpt_from_int(540); /* 540 MHz */ 251 + case LINK_RATE_HIGH3: 252 + return dc_fixpt_from_int(810); /* 810 MHz */ 253 + case LINK_RATE_UHBR10: 254 + return dc_fixpt_from_fraction(3125, 10); /* 312.5 MHz */ 255 + case LINK_RATE_UHBR13_5: 256 + return dc_fixpt_from_fraction(421875, 1000); /* 421.875 MHz */ 257 + case LINK_RATE_UHBR20: 258 + return dc_fixpt_from_int(625); /* 625 MHz */ 259 + default: 260 + /* Unexpected case, this requires debug if encountered. */ 261 + ASSERT(0); 262 + return dc_fixpt_from_int(0); 263 + } 250 264 } 251 265 252 - /*For DP MST, calculate if specified sample rates can fit into a given timing */ 253 - static void check_audio_bandwidth_dpmst( 266 + struct dp_audio_layout_config { 267 + uint8_t layouts_per_sample_denom; 268 + uint8_t symbols_per_layout; 269 + uint8_t max_layouts_per_audio_sdp; 270 + }; 271 + 272 + static void get_audio_layout_config( 273 + uint32_t channel_count, 274 + enum dp_link_encoding encoding, 275 + struct dp_audio_layout_config *output) 276 + { 277 + /* Assuming L-PCM audio. Current implementation uses max 1 layout per SDP, 278 + * with each layout being the same size (8ch layout). 279 + */ 280 + if (encoding == DP_8b_10b_ENCODING) { 281 + if (channel_count == 2) { 282 + output->layouts_per_sample_denom = 4; 283 + output->symbols_per_layout = 40; 284 + output->max_layouts_per_audio_sdp = 1; 285 + } else if (channel_count == 8) { 286 + output->layouts_per_sample_denom = 1; 287 + output->symbols_per_layout = 40; 288 + output->max_layouts_per_audio_sdp = 1; 289 + } 290 + } else if (encoding == DP_128b_132b_ENCODING) { 291 + if (channel_count == 2) { 292 + output->layouts_per_sample_denom = 4; 293 + output->symbols_per_layout = 10; 294 + output->max_layouts_per_audio_sdp = 1; 295 + } else if (channel_count == 8) { 296 + output->layouts_per_sample_denom = 1; 297 + output->symbols_per_layout = 10; 298 + output->max_layouts_per_audio_sdp = 1; 299 + } 300 + } 301 + } 302 + 303 + static uint32_t get_av_stream_map_lane_count( 304 + enum dp_link_encoding encoding, 305 + enum dc_lane_count lane_count, 306 + bool is_mst) 307 + { 308 + uint32_t av_stream_map_lane_count = 0; 309 + 310 + if (encoding == DP_8b_10b_ENCODING) { 311 + if (!is_mst) 312 + av_stream_map_lane_count = lane_count; 313 + else 314 + av_stream_map_lane_count = 4; 315 + } else if (encoding == DP_128b_132b_ENCODING) { 316 + av_stream_map_lane_count = 4; 317 + } 318 + 319 + ASSERT(av_stream_map_lane_count != 0); 320 + 321 + return av_stream_map_lane_count; 322 + } 323 + 324 + static uint32_t get_audio_sdp_overhead( 325 + enum dp_link_encoding encoding, 326 + enum dc_lane_count lane_count, 327 + bool is_mst) 328 + { 329 + uint32_t audio_sdp_overhead = 0; 330 + 331 + if (encoding == DP_8b_10b_ENCODING) { 332 + if (is_mst) 333 + audio_sdp_overhead = 16; /* 4 * 2 + 8 */ 334 + else 335 + audio_sdp_overhead = lane_count * 2 + 8; 336 + } else if (encoding == DP_128b_132b_ENCODING) { 337 + audio_sdp_overhead = 10; /* 4 x 2.5 */ 338 + } 339 + 340 + ASSERT(audio_sdp_overhead != 0); 341 + 342 + return audio_sdp_overhead; 343 + } 344 + 345 + static uint32_t calculate_required_audio_bw_in_symbols( 254 346 const struct audio_crtc_info *crtc_info, 347 + const struct dp_audio_layout_config *layout_config, 348 + uint32_t channel_count, 349 + uint32_t sample_rate_hz, 350 + uint32_t av_stream_map_lane_count, 351 + uint32_t audio_sdp_overhead) 352 + { 353 + /* DP spec recommends between 1.05 to 1.1 safety margin to prevent sample under-run */ 354 + struct fixed31_32 audio_sdp_margin = dc_fixpt_from_fraction(110, 100); 355 + struct fixed31_32 horizontal_line_freq_khz = dc_fixpt_from_fraction( 356 + crtc_info->requested_pixel_clock_100Hz, crtc_info->h_total * 10); 357 + struct fixed31_32 samples_per_line; 358 + struct fixed31_32 layouts_per_line; 359 + struct fixed31_32 symbols_per_sdp_max_layout; 360 + struct fixed31_32 remainder; 361 + uint32_t num_sdp_with_max_layouts; 362 + uint32_t required_symbols_per_hblank; 363 + 364 + samples_per_line = dc_fixpt_from_fraction(sample_rate_hz, 1000); 365 + samples_per_line = dc_fixpt_div(samples_per_line, horizontal_line_freq_khz); 366 + layouts_per_line = dc_fixpt_div_int(samples_per_line, layout_config->layouts_per_sample_denom); 367 + 368 + num_sdp_with_max_layouts = dc_fixpt_floor( 369 + dc_fixpt_div_int(layouts_per_line, layout_config->max_layouts_per_audio_sdp)); 370 + symbols_per_sdp_max_layout = dc_fixpt_from_int( 371 + layout_config->max_layouts_per_audio_sdp * layout_config->symbols_per_layout); 372 + symbols_per_sdp_max_layout = dc_fixpt_add_int(symbols_per_sdp_max_layout, audio_sdp_overhead); 373 + symbols_per_sdp_max_layout = dc_fixpt_mul(symbols_per_sdp_max_layout, audio_sdp_margin); 374 + required_symbols_per_hblank = num_sdp_with_max_layouts; 375 + required_symbols_per_hblank *= ((dc_fixpt_ceil(symbols_per_sdp_max_layout) + av_stream_map_lane_count) / 376 + av_stream_map_lane_count) * av_stream_map_lane_count; 377 + 378 + if (num_sdp_with_max_layouts != dc_fixpt_ceil( 379 + dc_fixpt_div_int(layouts_per_line, layout_config->max_layouts_per_audio_sdp))) { 380 + remainder = dc_fixpt_sub_int(layouts_per_line, 381 + num_sdp_with_max_layouts * layout_config->max_layouts_per_audio_sdp); 382 + remainder = dc_fixpt_mul_int(remainder, layout_config->symbols_per_layout); 383 + remainder = dc_fixpt_add_int(remainder, audio_sdp_overhead); 384 + remainder = dc_fixpt_mul(remainder, audio_sdp_margin); 385 + required_symbols_per_hblank += ((dc_fixpt_ceil(remainder) + av_stream_map_lane_count) / 386 + av_stream_map_lane_count) * av_stream_map_lane_count; 387 + } 388 + 389 + return required_symbols_per_hblank; 390 + } 391 + 392 + /* Current calculation only applicable for 8b/10b MST and 128b/132b SST/MST. 393 + */ 394 + static uint32_t calculate_available_hblank_bw_in_symbols( 395 + const struct audio_crtc_info *crtc_info, 396 + const struct audio_dp_link_info *dp_link_info) 397 + { 398 + uint64_t hblank = crtc_info->h_total - crtc_info->h_active; 399 + struct fixed31_32 hblank_time_msec = 400 + dc_fixpt_from_fraction(hblank * 10, crtc_info->requested_pixel_clock_100Hz); 401 + struct fixed31_32 lsclkfreq_mhz = 402 + get_link_symbol_clk_freq_mhz(dp_link_info->link_rate); 403 + struct fixed31_32 average_stream_sym_bw_frac; 404 + struct fixed31_32 peak_stream_bw_kbps; 405 + struct fixed31_32 bits_per_pixel; 406 + struct fixed31_32 link_bw_kbps; 407 + struct fixed31_32 available_stream_sym_count; 408 + uint32_t available_hblank_bw = 0; /* in stream symbols */ 409 + 410 + if (crtc_info->dsc_bits_per_pixel) { 411 + bits_per_pixel = dc_fixpt_from_fraction(crtc_info->dsc_bits_per_pixel, 16); 412 + } else { 413 + switch (crtc_info->color_depth) { 414 + case COLOR_DEPTH_666: 415 + bits_per_pixel = dc_fixpt_from_int(6); 416 + break; 417 + case COLOR_DEPTH_888: 418 + bits_per_pixel = dc_fixpt_from_int(8); 419 + break; 420 + case COLOR_DEPTH_101010: 421 + bits_per_pixel = dc_fixpt_from_int(10); 422 + break; 423 + case COLOR_DEPTH_121212: 424 + bits_per_pixel = dc_fixpt_from_int(12); 425 + break; 426 + default: 427 + /* Default to commonly supported color depth. */ 428 + bits_per_pixel = dc_fixpt_from_int(8); 429 + break; 430 + } 431 + 432 + bits_per_pixel = dc_fixpt_mul_int(bits_per_pixel, 3); 433 + 434 + if (crtc_info->pixel_encoding == PIXEL_ENCODING_YCBCR422) { 435 + bits_per_pixel = dc_fixpt_div_int(bits_per_pixel, 3); 436 + bits_per_pixel = dc_fixpt_mul_int(bits_per_pixel, 2); 437 + } else if (crtc_info->pixel_encoding == PIXEL_ENCODING_YCBCR420) { 438 + bits_per_pixel = dc_fixpt_div_int(bits_per_pixel, 2); 439 + } 440 + } 441 + 442 + /* Use simple stream BW calculation because mainlink overhead is 443 + * accounted for separately in the audio BW calculations. 444 + */ 445 + peak_stream_bw_kbps = dc_fixpt_from_fraction(crtc_info->requested_pixel_clock_100Hz, 10); 446 + peak_stream_bw_kbps = dc_fixpt_mul(peak_stream_bw_kbps, bits_per_pixel); 447 + link_bw_kbps = dc_fixpt_from_int(dp_link_info->link_bandwidth_kbps); 448 + average_stream_sym_bw_frac = dc_fixpt_div(peak_stream_bw_kbps, link_bw_kbps); 449 + 450 + available_stream_sym_count = dc_fixpt_mul_int(hblank_time_msec, 1000); 451 + available_stream_sym_count = dc_fixpt_mul(available_stream_sym_count, lsclkfreq_mhz); 452 + available_stream_sym_count = dc_fixpt_mul(available_stream_sym_count, average_stream_sym_bw_frac); 453 + available_hblank_bw = dc_fixpt_floor(available_stream_sym_count); 454 + available_hblank_bw *= dp_link_info->lane_count; 455 + available_hblank_bw -= crtc_info->dsc_num_slices * 4; /* EOC overhead */ 456 + 457 + if (available_hblank_bw < dp_link_info->hblank_min_symbol_width) 458 + available_hblank_bw = dp_link_info->hblank_min_symbol_width; 459 + 460 + if (available_hblank_bw < 12) 461 + available_hblank_bw = 0; 462 + else 463 + available_hblank_bw -= 12; /* Main link overhead */ 464 + 465 + return available_hblank_bw; 466 + } 467 + 468 + static void check_audio_bandwidth_dp( 469 + const struct audio_crtc_info *crtc_info, 470 + const struct audio_dp_link_info *dp_link_info, 255 471 uint32_t channel_count, 256 472 union audio_sample_rates *sample_rates) 257 473 { 258 - /* do nothing */ 474 + struct dp_audio_layout_config layout_config = {0}; 475 + uint32_t available_hblank_bw; 476 + uint32_t av_stream_map_lane_count; 477 + uint32_t audio_sdp_overhead; 478 + 479 + /* TODO: Add validation for SST 8b/10 case */ 480 + if (!dp_link_info->is_mst && dp_link_info->encoding == DP_8b_10b_ENCODING) 481 + return; 482 + 483 + available_hblank_bw = calculate_available_hblank_bw_in_symbols( 484 + crtc_info, dp_link_info); 485 + av_stream_map_lane_count = get_av_stream_map_lane_count( 486 + dp_link_info->encoding, dp_link_info->lane_count, dp_link_info->is_mst); 487 + audio_sdp_overhead = get_audio_sdp_overhead( 488 + dp_link_info->encoding, dp_link_info->lane_count, dp_link_info->is_mst); 489 + get_audio_layout_config( 490 + channel_count, dp_link_info->encoding, &layout_config); 491 + 492 + if (available_hblank_bw < calculate_required_audio_bw_in_symbols( 493 + crtc_info, &layout_config, channel_count, 192000, 494 + av_stream_map_lane_count, audio_sdp_overhead)) 495 + sample_rates->rate.RATE_192 = 0; 496 + if (available_hblank_bw < calculate_required_audio_bw_in_symbols( 497 + crtc_info, &layout_config, channel_count, 176400, 498 + av_stream_map_lane_count, audio_sdp_overhead)) 499 + sample_rates->rate.RATE_176_4 = 0; 500 + if (available_hblank_bw < calculate_required_audio_bw_in_symbols( 501 + crtc_info, &layout_config, channel_count, 96000, 502 + av_stream_map_lane_count, audio_sdp_overhead)) 503 + sample_rates->rate.RATE_96 = 0; 504 + if (available_hblank_bw < calculate_required_audio_bw_in_symbols( 505 + crtc_info, &layout_config, channel_count, 88200, 506 + av_stream_map_lane_count, audio_sdp_overhead)) 507 + sample_rates->rate.RATE_88_2 = 0; 508 + if (available_hblank_bw < calculate_required_audio_bw_in_symbols( 509 + crtc_info, &layout_config, channel_count, 48000, 510 + av_stream_map_lane_count, audio_sdp_overhead)) 511 + sample_rates->rate.RATE_48 = 0; 512 + if (available_hblank_bw < calculate_required_audio_bw_in_symbols( 513 + crtc_info, &layout_config, channel_count, 44100, 514 + av_stream_map_lane_count, audio_sdp_overhead)) 515 + sample_rates->rate.RATE_44_1 = 0; 516 + if (available_hblank_bw < calculate_required_audio_bw_in_symbols( 517 + crtc_info, &layout_config, channel_count, 32000, 518 + av_stream_map_lane_count, audio_sdp_overhead)) 519 + sample_rates->rate.RATE_32 = 0; 259 520 } 260 521 261 522 static void check_audio_bandwidth( 262 523 const struct audio_crtc_info *crtc_info, 524 + const struct audio_dp_link_info *dp_link_info, 263 525 uint32_t channel_count, 264 526 enum signal_type signal, 265 527 union audio_sample_rates *sample_rates) ··· 533 271 break; 534 272 case SIGNAL_TYPE_EDP: 535 273 case SIGNAL_TYPE_DISPLAY_PORT: 536 - check_audio_bandwidth_dpsst( 537 - crtc_info, channel_count, sample_rates); 538 - break; 539 274 case SIGNAL_TYPE_DISPLAY_PORT_MST: 540 - check_audio_bandwidth_dpmst( 541 - crtc_info, channel_count, sample_rates); 275 + check_audio_bandwidth_dp( 276 + crtc_info, dp_link_info, channel_count, sample_rates); 542 277 break; 543 278 default: 544 279 break; ··· 653 394 struct audio *audio, 654 395 enum signal_type signal, 655 396 const struct audio_crtc_info *crtc_info, 656 - const struct audio_info *audio_info) 397 + const struct audio_info *audio_info, 398 + const struct audio_dp_link_info *dp_link_info) 657 399 { 658 400 struct dce_audio *aud = DCE_AUD(audio); 659 401 ··· 789 529 790 530 check_audio_bandwidth( 791 531 crtc_info, 532 + dp_link_info, 792 533 channel_count, 793 534 signal, 794 535 &sample_rates); ··· 849 588 850 589 check_audio_bandwidth( 851 590 crtc_info, 591 + dp_link_info, 852 592 8, 853 593 signal, 854 594 &sample_rate);
+2 -1
drivers/gpu/drm/amd/display/dc/dce/dce_audio.h
··· 170 170 void dce_aud_az_configure(struct audio *audio, 171 171 enum signal_type signal, 172 172 const struct audio_crtc_info *crtc_info, 173 - const struct audio_info *audio_info); 173 + const struct audio_info *audio_info, 174 + const struct audio_dp_link_info *dp_link_info); 174 175 175 176 void dce_aud_wall_dto_setup(struct audio *audio, 176 177 enum signal_type signal,
+55 -1
drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c
··· 1291 1291 } 1292 1292 } 1293 1293 1294 + static void populate_audio_dp_link_info( 1295 + const struct pipe_ctx *pipe_ctx, 1296 + struct audio_dp_link_info *dp_link_info) 1297 + { 1298 + const struct dc_stream_state *stream = pipe_ctx->stream; 1299 + const struct dc_link *link = stream->link; 1300 + struct fixed31_32 link_bw_kbps; 1301 + 1302 + dp_link_info->encoding = link->dc->link_srv->dp_get_encoding_format( 1303 + &pipe_ctx->link_config.dp_link_settings); 1304 + dp_link_info->is_mst = (stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST); 1305 + dp_link_info->lane_count = pipe_ctx->link_config.dp_link_settings.lane_count; 1306 + dp_link_info->link_rate = pipe_ctx->link_config.dp_link_settings.link_rate; 1307 + 1308 + link_bw_kbps = dc_fixpt_from_int(dc_link_bandwidth_kbps(link, 1309 + &pipe_ctx->link_config.dp_link_settings)); 1310 + 1311 + /* For audio stream calculations, the video stream should not include FEC or SSC 1312 + * in order to get the most pessimistic values. 1313 + */ 1314 + if (dp_link_info->encoding == DP_8b_10b_ENCODING && 1315 + link->dc->link_srv->dp_is_fec_supported(link)) { 1316 + link_bw_kbps = dc_fixpt_mul(link_bw_kbps, 1317 + dc_fixpt_from_fraction(100, DATA_EFFICIENCY_8b_10b_FEC_EFFICIENCY_x100)); 1318 + } else if (dp_link_info->encoding == DP_128b_132b_ENCODING) { 1319 + link_bw_kbps = dc_fixpt_mul(link_bw_kbps, 1320 + dc_fixpt_from_fraction(10000, 9975)); /* 99.75% SSC overhead*/ 1321 + } 1322 + 1323 + dp_link_info->link_bandwidth_kbps = dc_fixpt_floor(link_bw_kbps); 1324 + 1325 + /* HW minimum for 128b/132b HBlank is 4 frame symbols. 1326 + * TODO: Plumb the actual programmed HBlank min symbol width to here. 1327 + */ 1328 + if (dp_link_info->encoding == DP_128b_132b_ENCODING) 1329 + dp_link_info->hblank_min_symbol_width = 4; 1330 + else 1331 + dp_link_info->hblank_min_symbol_width = 0; 1332 + } 1333 + 1294 1334 static void build_audio_output( 1295 1335 struct dc_state *state, 1296 1336 const struct pipe_ctx *pipe_ctx, ··· 1378 1338 audio_output->crtc_info.calculated_pixel_clock_100Hz = 1379 1339 pipe_ctx->stream_res.pix_clk_params.requested_pix_clk_100hz; 1380 1340 1341 + audio_output->crtc_info.pixel_encoding = 1342 + stream->timing.pixel_encoding; 1343 + 1344 + audio_output->crtc_info.dsc_bits_per_pixel = 1345 + stream->timing.dsc_cfg.bits_per_pixel; 1346 + 1347 + audio_output->crtc_info.dsc_num_slices = 1348 + stream->timing.dsc_cfg.num_slices_h; 1349 + 1381 1350 /*for HDMI, audio ACR is with deep color ratio factor*/ 1382 1351 if (dc_is_hdmi_tmds_signal(pipe_ctx->stream->signal) && 1383 1352 audio_output->crtc_info.requested_pixel_clock_100Hz == ··· 1420 1371 1421 1372 audio_output->pll_info.ss_percentage = 1422 1373 pipe_ctx->pll_settings.ss_percentage; 1374 + 1375 + if (dc_is_dp_signal(pipe_ctx->stream->signal)) { 1376 + populate_audio_dp_link_info(pipe_ctx, &audio_output->dp_link_info); 1377 + } 1423 1378 } 1424 1379 1425 1380 static void program_scaler(const struct dc *dc, ··· 1560 1507 pipe_ctx->stream_res.audio, 1561 1508 pipe_ctx->stream->signal, 1562 1509 &audio_output.crtc_info, 1563 - &pipe_ctx->stream->audio_info); 1510 + &pipe_ctx->stream->audio_info, 1511 + &audio_output.dp_link_info); 1564 1512 } 1565 1513 1566 1514 /* make sure no pipes syncd to the pipe being enabled */
+2 -1
drivers/gpu/drm/amd/display/dc/inc/hw/audio.h
··· 43 43 void (*az_configure)(struct audio *audio, 44 44 enum signal_type signal, 45 45 const struct audio_crtc_info *crtc_info, 46 - const struct audio_info *audio_info); 46 + const struct audio_info *audio_info, 47 + const struct audio_dp_link_info *dp_link_info); 47 48 48 49 void (*wall_dto_setup)(struct audio *audio, 49 50 enum signal_type signal,
+15
drivers/gpu/drm/amd/display/include/audio_types.h
··· 27 27 #define __AUDIO_TYPES_H__ 28 28 29 29 #include "signal_types.h" 30 + #include "fixed31_32.h" 31 + #include "dc_dp_types.h" 30 32 31 33 #define AUDIO_INFO_DISPLAY_NAME_SIZE_IN_CHARS 20 32 34 #define MAX_HW_AUDIO_INFO_DISPLAY_NAME_SIZE_IN_CHARS 18 33 35 #define MULTI_CHANNEL_SPLIT_NO_ASSO_INFO 0xFFFFFFFF 34 36 37 + struct audio_dp_link_info { 38 + uint32_t link_bandwidth_kbps; 39 + uint32_t hblank_min_symbol_width; 40 + enum dp_link_encoding encoding; 41 + enum dc_link_rate link_rate; 42 + enum dc_lane_count lane_count; 43 + bool is_mst; 44 + }; 35 45 36 46 struct audio_crtc_info { 37 47 uint32_t h_total; ··· 52 42 uint32_t calculated_pixel_clock_100Hz; /* in 100Hz */ 53 43 uint32_t refresh_rate; 54 44 enum dc_color_depth color_depth; 45 + enum dc_pixel_encoding pixel_encoding; 55 46 bool interlaced; 47 + uint32_t dsc_bits_per_pixel; 48 + uint32_t dsc_num_slices; 56 49 }; 57 50 struct azalia_clock_info { 58 51 uint32_t pixel_clock_in_10khz; ··· 108 95 enum signal_type signal; 109 96 /* video timing */ 110 97 struct audio_crtc_info crtc_info; 98 + /* DP link info */ 99 + struct audio_dp_link_info dp_link_info; 111 100 /* PLL for audio */ 112 101 struct audio_pll_info pll_info; 113 102 };