1 // SPDX-License-Identifier: MIT 2 /* 3 * Copyright © 2023 Intel Corporation 4 */ 5 6 #include "i915_drv.h" 7 8 #include <drm/display/drm_dp_tunnel.h> 9 10 #include "intel_atomic.h" 11 #include "intel_display_limits.h" 12 #include "intel_display_types.h" 13 #include "intel_dp.h" 14 #include "intel_dp_link_training.h" 15 #include "intel_dp_mst.h" 16 #include "intel_dp_tunnel.h" 17 #include "intel_link_bw.h" 18 19 struct intel_dp_tunnel_inherited_state { 20 struct drm_dp_tunnel_ref ref[I915_MAX_PIPES]; 21 }; 22 23 /** 24 * intel_dp_tunnel_disconnect - Disconnect a DP tunnel from a port 25 * @intel_dp: DP port object the tunnel is connected to 26 * 27 * Disconnect a DP tunnel from @intel_dp, destroying any related state. This 28 * should be called after detecting a sink-disconnect event from the port. 29 */ 30 void intel_dp_tunnel_disconnect(struct intel_dp *intel_dp) 31 { 32 drm_dp_tunnel_destroy(intel_dp->tunnel); 33 intel_dp->tunnel = NULL; 34 } 35 36 /** 37 * intel_dp_tunnel_destroy - Destroy a DP tunnel 38 * @intel_dp: DP port object the tunnel is connected to 39 * 40 * Destroy a DP tunnel connected to @intel_dp, after disabling the BW 41 * allocation mode on the tunnel. This should be called while destroying the 42 * port. 43 */ 44 void intel_dp_tunnel_destroy(struct intel_dp *intel_dp) 45 { 46 if (intel_dp_tunnel_bw_alloc_is_enabled(intel_dp)) 47 drm_dp_tunnel_disable_bw_alloc(intel_dp->tunnel); 48 49 intel_dp_tunnel_disconnect(intel_dp); 50 } 51 52 static int kbytes_to_mbits(int kbytes) 53 { 54 return DIV_ROUND_UP(kbytes * 8, 1000); 55 } 56 57 static int get_current_link_bw(struct intel_dp *intel_dp, 58 bool *below_dprx_bw) 59 { 60 int rate = intel_dp_max_common_rate(intel_dp); 61 int lane_count = intel_dp_max_common_lane_count(intel_dp); 62 int bw; 63 64 bw = intel_dp_max_link_data_rate(intel_dp, rate, lane_count); 65 *below_dprx_bw = bw < drm_dp_max_dprx_data_rate(rate, lane_count); 66 67 return bw; 68 } 69 70 static int update_tunnel_state(struct intel_dp *intel_dp) 71 { 72 struct drm_i915_private *i915 = dp_to_i915(intel_dp); 73 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 74 bool old_bw_below_dprx; 75 bool new_bw_below_dprx; 76 int old_bw; 77 int new_bw; 78 int ret; 79 80 old_bw = get_current_link_bw(intel_dp, &old_bw_below_dprx); 81 82 ret = drm_dp_tunnel_update_state(intel_dp->tunnel); 83 if (ret < 0) { 84 drm_dbg_kms(&i915->drm, 85 "[DPTUN %s][ENCODER:%d:%s] State update failed (err %pe)\n", 86 drm_dp_tunnel_name(intel_dp->tunnel), 87 encoder->base.base.id, encoder->base.name, 88 ERR_PTR(ret)); 89 90 return ret; 91 } 92 93 if (ret == 0 || 94 !drm_dp_tunnel_bw_alloc_is_enabled(intel_dp->tunnel)) 95 return 0; 96 97 intel_dp_update_sink_caps(intel_dp); 98 99 new_bw = get_current_link_bw(intel_dp, &new_bw_below_dprx); 100 101 /* Suppress the notification if the mode list can't change due to bw. */ 102 if (old_bw_below_dprx == new_bw_below_dprx && 103 !new_bw_below_dprx) 104 return 0; 105 106 drm_dbg_kms(&i915->drm, 107 "[DPTUN %s][ENCODER:%d:%s] Notify users about BW change: %d -> %d\n", 108 drm_dp_tunnel_name(intel_dp->tunnel), 109 encoder->base.base.id, encoder->base.name, 110 kbytes_to_mbits(old_bw), kbytes_to_mbits(new_bw)); 111 112 return 1; 113 } 114 115 /* 116 * Allocate the BW for a tunnel on a DP connector/port if the connector/port 117 * was already active when detecting the tunnel. The allocated BW must be 118 * freed by the next atomic modeset, storing the BW in the 119 * intel_atomic_state::inherited_dp_tunnels, and calling 120 * intel_dp_tunnel_atomic_free_bw(). 121 */ 122 static int allocate_initial_tunnel_bw_for_pipes(struct intel_dp *intel_dp, u8 pipe_mask) 123 { 124 struct drm_i915_private *i915 = dp_to_i915(intel_dp); 125 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 126 struct intel_crtc *crtc; 127 int tunnel_bw = 0; 128 int err; 129 130 for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc, pipe_mask) { 131 const struct intel_crtc_state *crtc_state = 132 to_intel_crtc_state(crtc->base.state); 133 int stream_bw = intel_dp_config_required_rate(crtc_state); 134 135 tunnel_bw += stream_bw; 136 137 drm_dbg_kms(&i915->drm, 138 "[DPTUN %s][ENCODER:%d:%s][CRTC:%d:%s] Initial BW for stream %d: %d/%d Mb/s\n", 139 drm_dp_tunnel_name(intel_dp->tunnel), 140 encoder->base.base.id, encoder->base.name, 141 crtc->base.base.id, crtc->base.name, 142 crtc->pipe, 143 kbytes_to_mbits(stream_bw), kbytes_to_mbits(tunnel_bw)); 144 } 145 146 err = drm_dp_tunnel_alloc_bw(intel_dp->tunnel, tunnel_bw); 147 if (err) { 148 drm_dbg_kms(&i915->drm, 149 "[DPTUN %s][ENCODER:%d:%s] Initial BW allocation failed (err %pe)\n", 150 drm_dp_tunnel_name(intel_dp->tunnel), 151 encoder->base.base.id, encoder->base.name, 152 ERR_PTR(err)); 153 154 return err; 155 } 156 157 return update_tunnel_state(intel_dp); 158 } 159 160 static int allocate_initial_tunnel_bw(struct intel_dp *intel_dp, 161 struct drm_modeset_acquire_ctx *ctx) 162 { 163 u8 pipe_mask; 164 int err; 165 166 err = intel_dp_get_active_pipes(intel_dp, ctx, &pipe_mask); 167 if (err) 168 return err; 169 170 return allocate_initial_tunnel_bw_for_pipes(intel_dp, pipe_mask); 171 } 172 173 static int detect_new_tunnel(struct intel_dp *intel_dp, struct drm_modeset_acquire_ctx *ctx) 174 { 175 struct drm_i915_private *i915 = dp_to_i915(intel_dp); 176 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 177 struct drm_dp_tunnel *tunnel; 178 int ret; 179 180 tunnel = drm_dp_tunnel_detect(i915->display.dp_tunnel_mgr, 181 &intel_dp->aux); 182 if (IS_ERR(tunnel)) 183 return PTR_ERR(tunnel); 184 185 intel_dp->tunnel = tunnel; 186 187 ret = drm_dp_tunnel_enable_bw_alloc(intel_dp->tunnel); 188 if (ret) { 189 if (ret == -EOPNOTSUPP) 190 return 0; 191 192 drm_dbg_kms(&i915->drm, 193 "[DPTUN %s][ENCODER:%d:%s] Failed to enable BW allocation mode (ret %pe)\n", 194 drm_dp_tunnel_name(intel_dp->tunnel), 195 encoder->base.base.id, encoder->base.name, 196 ERR_PTR(ret)); 197 198 /* Keep the tunnel with BWA disabled */ 199 return 0; 200 } 201 202 ret = allocate_initial_tunnel_bw(intel_dp, ctx); 203 if (ret < 0) 204 intel_dp_tunnel_destroy(intel_dp); 205 206 return ret; 207 } 208 209 /** 210 * intel_dp_tunnel_detect - Detect a DP tunnel on a port 211 * @intel_dp: DP port object 212 * @ctx: lock context acquired by the connector detection handler 213 * 214 * Detect a DP tunnel on the @intel_dp port, enabling the BW allocation mode 215 * on it if supported and allocating the BW required on an already active port. 216 * The BW allocated this way must be freed by the next atomic modeset calling 217 * intel_dp_tunnel_atomic_free_bw(). 218 * 219 * If @intel_dp has already a tunnel detected on it, update the tunnel's state 220 * wrt. its support for BW allocation mode and the available BW via the 221 * tunnel. If the tunnel's state change requires this - for instance the 222 * tunnel's group ID has changed - the tunnel will be dropped and recreated. 223 * 224 * Return 0 in case of success - after any tunnel detected and added to 225 * @intel_dp - 1 in case the BW on an already existing tunnel has changed in a 226 * way that requires notifying user space. 227 */ 228 int intel_dp_tunnel_detect(struct intel_dp *intel_dp, struct drm_modeset_acquire_ctx *ctx) 229 { 230 int ret; 231 232 if (intel_dp_is_edp(intel_dp)) 233 return 0; 234 235 if (intel_dp->tunnel) { 236 ret = update_tunnel_state(intel_dp); 237 if (ret >= 0) 238 return ret; 239 240 /* Try to recreate the tunnel after an update error. */ 241 intel_dp_tunnel_destroy(intel_dp); 242 } 243 244 return detect_new_tunnel(intel_dp, ctx); 245 } 246 247 /** 248 * intel_dp_tunnel_bw_alloc_is_enabled - Query the BW allocation support on a tunnel 249 * @intel_dp: DP port object 250 * 251 * Query whether a DP tunnel is connected on @intel_dp and the tunnel supports 252 * the BW allocation mode. 253 * 254 * Returns %true if the BW allocation mode is supported on @intel_dp. 255 */ 256 bool intel_dp_tunnel_bw_alloc_is_enabled(struct intel_dp *intel_dp) 257 { 258 return drm_dp_tunnel_bw_alloc_is_enabled(intel_dp->tunnel); 259 } 260 261 /** 262 * intel_dp_tunnel_suspend - Suspend a DP tunnel connected on a port 263 * @intel_dp: DP port object 264 * 265 * Suspend a DP tunnel on @intel_dp with BW allocation mode enabled on it. 266 */ 267 void intel_dp_tunnel_suspend(struct intel_dp *intel_dp) 268 { 269 struct drm_i915_private *i915 = dp_to_i915(intel_dp); 270 struct intel_connector *connector = intel_dp->attached_connector; 271 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 272 273 if (!intel_dp_tunnel_bw_alloc_is_enabled(intel_dp)) 274 return; 275 276 drm_dbg_kms(&i915->drm, "[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s] Suspend\n", 277 drm_dp_tunnel_name(intel_dp->tunnel), 278 connector->base.base.id, connector->base.name, 279 encoder->base.base.id, encoder->base.name); 280 281 drm_dp_tunnel_disable_bw_alloc(intel_dp->tunnel); 282 283 intel_dp->tunnel_suspended = true; 284 } 285 286 /** 287 * intel_dp_tunnel_resume - Resume a DP tunnel connected on a port 288 * @intel_dp: DP port object 289 * @crtc_state: CRTC state 290 * @dpcd_updated: the DPCD DPRX capabilities got updated during resume 291 * 292 * Resume a DP tunnel on @intel_dp with BW allocation mode enabled on it. 293 */ 294 void intel_dp_tunnel_resume(struct intel_dp *intel_dp, 295 const struct intel_crtc_state *crtc_state, 296 bool dpcd_updated) 297 { 298 struct drm_i915_private *i915 = dp_to_i915(intel_dp); 299 struct intel_connector *connector = intel_dp->attached_connector; 300 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 301 u8 dpcd[DP_RECEIVER_CAP_SIZE]; 302 u8 pipe_mask; 303 int err = 0; 304 305 if (!intel_dp->tunnel_suspended) 306 return; 307 308 intel_dp->tunnel_suspended = false; 309 310 drm_dbg_kms(&i915->drm, "[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s] Resume\n", 311 drm_dp_tunnel_name(intel_dp->tunnel), 312 connector->base.base.id, connector->base.name, 313 encoder->base.base.id, encoder->base.name); 314 315 /* 316 * The TBT Connection Manager requires the GFX driver to read out 317 * the sink's DPRX caps to be able to service any BW requests later. 318 * During resume overriding the caps in @intel_dp cached before 319 * suspend must be avoided, so do here only a dummy read, unless the 320 * capabilities were updated already during resume. 321 */ 322 if (!dpcd_updated) { 323 err = intel_dp_read_dprx_caps(intel_dp, dpcd); 324 325 if (err) { 326 drm_dp_tunnel_set_io_error(intel_dp->tunnel); 327 goto out_err; 328 } 329 } 330 331 err = drm_dp_tunnel_enable_bw_alloc(intel_dp->tunnel); 332 if (err) 333 goto out_err; 334 335 pipe_mask = 0; 336 if (crtc_state) { 337 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 338 339 /* TODO: Add support for MST */ 340 pipe_mask |= BIT(crtc->pipe); 341 } 342 343 err = allocate_initial_tunnel_bw_for_pipes(intel_dp, pipe_mask); 344 if (err < 0) 345 goto out_err; 346 347 return; 348 349 out_err: 350 drm_dbg_kms(&i915->drm, 351 "[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s] Tunnel can't be resumed, will drop and reject it (err %pe)\n", 352 drm_dp_tunnel_name(intel_dp->tunnel), 353 connector->base.base.id, connector->base.name, 354 encoder->base.base.id, encoder->base.name, 355 ERR_PTR(err)); 356 } 357 358 static struct drm_dp_tunnel * 359 get_inherited_tunnel(struct intel_atomic_state *state, struct intel_crtc *crtc) 360 { 361 if (!state->inherited_dp_tunnels) 362 return NULL; 363 364 return state->inherited_dp_tunnels->ref[crtc->pipe].tunnel; 365 } 366 367 static int 368 add_inherited_tunnel(struct intel_atomic_state *state, 369 struct drm_dp_tunnel *tunnel, 370 struct intel_crtc *crtc) 371 { 372 struct drm_i915_private *i915 = to_i915(state->base.dev); 373 struct drm_dp_tunnel *old_tunnel; 374 375 old_tunnel = get_inherited_tunnel(state, crtc); 376 if (old_tunnel) { 377 drm_WARN_ON(&i915->drm, old_tunnel != tunnel); 378 return 0; 379 } 380 381 if (!state->inherited_dp_tunnels) { 382 state->inherited_dp_tunnels = kzalloc(sizeof(*state->inherited_dp_tunnels), 383 GFP_KERNEL); 384 if (!state->inherited_dp_tunnels) 385 return -ENOMEM; 386 } 387 388 drm_dp_tunnel_ref_get(tunnel, &state->inherited_dp_tunnels->ref[crtc->pipe]); 389 390 return 0; 391 } 392 393 static int check_inherited_tunnel_state(struct intel_atomic_state *state, 394 struct intel_dp *intel_dp, 395 const struct intel_digital_connector_state *old_conn_state) 396 { 397 struct drm_i915_private *i915 = dp_to_i915(intel_dp); 398 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 399 struct intel_connector *connector = 400 to_intel_connector(old_conn_state->base.connector); 401 struct intel_crtc *old_crtc; 402 const struct intel_crtc_state *old_crtc_state; 403 404 /* 405 * If a BWA tunnel gets detected only after the corresponding 406 * connector got enabled already without a BWA tunnel, or a different 407 * BWA tunnel (which was removed meanwhile) the old CRTC state won't 408 * contain the state of the current tunnel. This tunnel still has a 409 * reserved BW, which needs to be released, add the state for such 410 * inherited tunnels separately only to this atomic state. 411 */ 412 if (!intel_dp_tunnel_bw_alloc_is_enabled(intel_dp)) 413 return 0; 414 415 if (!old_conn_state->base.crtc) 416 return 0; 417 418 old_crtc = to_intel_crtc(old_conn_state->base.crtc); 419 old_crtc_state = intel_atomic_get_old_crtc_state(state, old_crtc); 420 421 if (!old_crtc_state->hw.active || 422 old_crtc_state->dp_tunnel_ref.tunnel == intel_dp->tunnel) 423 return 0; 424 425 drm_dbg_kms(&i915->drm, 426 "[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s][CRTC:%d:%s] Adding state for inherited tunnel %p\n", 427 drm_dp_tunnel_name(intel_dp->tunnel), 428 connector->base.base.id, connector->base.name, 429 encoder->base.base.id, encoder->base.name, 430 old_crtc->base.base.id, old_crtc->base.name, 431 intel_dp->tunnel); 432 433 return add_inherited_tunnel(state, intel_dp->tunnel, old_crtc); 434 } 435 436 /** 437 * intel_dp_tunnel_atomic_cleanup_inherited_state - Free any inherited DP tunnel state 438 * @state: Atomic state 439 * 440 * Free the inherited DP tunnel state in @state. 441 */ 442 void intel_dp_tunnel_atomic_cleanup_inherited_state(struct intel_atomic_state *state) 443 { 444 enum pipe pipe; 445 446 if (!state->inherited_dp_tunnels) 447 return; 448 449 for_each_pipe(to_i915(state->base.dev), pipe) 450 if (state->inherited_dp_tunnels->ref[pipe].tunnel) 451 drm_dp_tunnel_ref_put(&state->inherited_dp_tunnels->ref[pipe]); 452 453 kfree(state->inherited_dp_tunnels); 454 state->inherited_dp_tunnels = NULL; 455 } 456 457 static int intel_dp_tunnel_atomic_add_group_state(struct intel_atomic_state *state, 458 struct drm_dp_tunnel *tunnel) 459 { 460 struct drm_i915_private *i915 = to_i915(state->base.dev); 461 u32 pipe_mask; 462 int err; 463 464 err = drm_dp_tunnel_atomic_get_group_streams_in_state(&state->base, 465 tunnel, &pipe_mask); 466 if (err) 467 return err; 468 469 drm_WARN_ON(&i915->drm, pipe_mask & ~((1 << I915_MAX_PIPES) - 1)); 470 471 return intel_modeset_pipes_in_mask_early(state, "DPTUN", pipe_mask); 472 } 473 474 /** 475 * intel_dp_tunnel_atomic_add_state_for_crtc - Add CRTC specific DP tunnel state 476 * @state: Atomic state 477 * @crtc: CRTC to add the tunnel state for 478 * 479 * Add the DP tunnel state for @crtc if the CRTC (aka DP tunnel stream) is enabled 480 * via a DP tunnel. 481 * 482 * Return 0 in case of success, a negative error code otherwise. 483 */ 484 int intel_dp_tunnel_atomic_add_state_for_crtc(struct intel_atomic_state *state, 485 struct intel_crtc *crtc) 486 { 487 const struct intel_crtc_state *new_crtc_state = 488 intel_atomic_get_new_crtc_state(state, crtc); 489 const struct drm_dp_tunnel_state *tunnel_state; 490 struct drm_dp_tunnel *tunnel = new_crtc_state->dp_tunnel_ref.tunnel; 491 492 if (!tunnel) 493 return 0; 494 495 tunnel_state = drm_dp_tunnel_atomic_get_state(&state->base, tunnel); 496 if (IS_ERR(tunnel_state)) 497 return PTR_ERR(tunnel_state); 498 499 return 0; 500 } 501 502 static int check_group_state(struct intel_atomic_state *state, 503 struct intel_dp *intel_dp, 504 struct intel_connector *connector, 505 struct intel_crtc *crtc) 506 { 507 struct drm_i915_private *i915 = to_i915(state->base.dev); 508 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 509 const struct intel_crtc_state *crtc_state = 510 intel_atomic_get_new_crtc_state(state, crtc); 511 512 if (!crtc_state->dp_tunnel_ref.tunnel) 513 return 0; 514 515 drm_dbg_kms(&i915->drm, 516 "[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s][CRTC:%d:%s] Adding group state for tunnel %p\n", 517 drm_dp_tunnel_name(intel_dp->tunnel), 518 connector->base.base.id, connector->base.name, 519 encoder->base.base.id, encoder->base.name, 520 crtc->base.base.id, crtc->base.name, 521 crtc_state->dp_tunnel_ref.tunnel); 522 523 return intel_dp_tunnel_atomic_add_group_state(state, crtc_state->dp_tunnel_ref.tunnel); 524 } 525 526 /** 527 * intel_dp_tunnel_atomic_check_state - Check a connector's DP tunnel specific state 528 * @state: Atomic state 529 * @intel_dp: DP port object 530 * @connector: connector using @intel_dp 531 * 532 * Check and add the DP tunnel atomic state for @intel_dp/@connector to 533 * @state, if there is a DP tunnel detected on @intel_dp with BW allocation 534 * mode enabled on it, or if @intel_dp/@connector was previously enabled via a 535 * DP tunnel. 536 * 537 * Returns 0 in case of success, or a negative error code otherwise. 538 */ 539 int intel_dp_tunnel_atomic_check_state(struct intel_atomic_state *state, 540 struct intel_dp *intel_dp, 541 struct intel_connector *connector) 542 { 543 const struct intel_digital_connector_state *old_conn_state = 544 intel_atomic_get_old_connector_state(state, connector); 545 const struct intel_digital_connector_state *new_conn_state = 546 intel_atomic_get_new_connector_state(state, connector); 547 int err; 548 549 if (old_conn_state->base.crtc) { 550 err = check_group_state(state, intel_dp, connector, 551 to_intel_crtc(old_conn_state->base.crtc)); 552 if (err) 553 return err; 554 } 555 556 if (new_conn_state->base.crtc && 557 new_conn_state->base.crtc != old_conn_state->base.crtc) { 558 err = check_group_state(state, intel_dp, connector, 559 to_intel_crtc(new_conn_state->base.crtc)); 560 if (err) 561 return err; 562 } 563 564 return check_inherited_tunnel_state(state, intel_dp, old_conn_state); 565 } 566 567 /** 568 * intel_dp_tunnel_atomic_compute_stream_bw - Compute the BW required by a DP tunnel stream 569 * @state: Atomic state 570 * @intel_dp: DP object 571 * @connector: connector using @intel_dp 572 * @crtc_state: state of CRTC of the given DP tunnel stream 573 * 574 * Compute the required BW of CRTC (aka DP tunnel stream), storing this BW to 575 * the DP tunnel state containing the stream in @state. Before re-calculating a 576 * BW requirement in the crtc_state state the old BW requirement computed by this 577 * function must be cleared by calling intel_dp_tunnel_atomic_clear_stream_bw(). 578 * 579 * Returns 0 in case of success, a negative error code otherwise. 580 */ 581 int intel_dp_tunnel_atomic_compute_stream_bw(struct intel_atomic_state *state, 582 struct intel_dp *intel_dp, 583 const struct intel_connector *connector, 584 struct intel_crtc_state *crtc_state) 585 { 586 struct drm_i915_private *i915 = to_i915(state->base.dev); 587 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 588 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 589 int required_rate = intel_dp_config_required_rate(crtc_state); 590 int ret; 591 592 if (!intel_dp_tunnel_bw_alloc_is_enabled(intel_dp)) 593 return 0; 594 595 drm_dbg_kms(&i915->drm, 596 "[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s][CRTC:%d:%s] Stream %d required BW %d Mb/s\n", 597 drm_dp_tunnel_name(intel_dp->tunnel), 598 connector->base.base.id, connector->base.name, 599 encoder->base.base.id, encoder->base.name, 600 crtc->base.base.id, crtc->base.name, 601 crtc->pipe, 602 kbytes_to_mbits(required_rate)); 603 604 ret = drm_dp_tunnel_atomic_set_stream_bw(&state->base, intel_dp->tunnel, 605 crtc->pipe, required_rate); 606 if (ret < 0) 607 return ret; 608 609 drm_dp_tunnel_ref_get(intel_dp->tunnel, 610 &crtc_state->dp_tunnel_ref); 611 612 return 0; 613 } 614 615 /** 616 * intel_dp_tunnel_atomic_clear_stream_bw - Clear any DP tunnel stream BW requirement 617 * @state: Atomic state 618 * @crtc_state: state of CRTC of the given DP tunnel stream 619 * 620 * Clear any DP tunnel stream BW requirement set by 621 * intel_dp_tunnel_atomic_compute_stream_bw(). 622 */ 623 void intel_dp_tunnel_atomic_clear_stream_bw(struct intel_atomic_state *state, 624 struct intel_crtc_state *crtc_state) 625 { 626 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 627 628 if (!crtc_state->dp_tunnel_ref.tunnel) 629 return; 630 631 drm_dp_tunnel_atomic_set_stream_bw(&state->base, 632 crtc_state->dp_tunnel_ref.tunnel, 633 crtc->pipe, 0); 634 drm_dp_tunnel_ref_put(&crtc_state->dp_tunnel_ref); 635 } 636 637 /** 638 * intel_dp_tunnel_atomic_check_link - Check the DP tunnel atomic state 639 * @state: intel atomic state 640 * @limits: link BW limits 641 * 642 * Check the link configuration for all DP tunnels in @state. If the 643 * configuration is invalid @limits will be updated if possible to 644 * reduce the total BW, after which the configuration for all CRTCs in 645 * @state must be recomputed with the updated @limits. 646 * 647 * Returns: 648 * - 0 if the confugration is valid 649 * - %-EAGAIN, if the configuration is invalid and @limits got updated 650 * with fallback values with which the configuration of all CRTCs in 651 * @state must be recomputed 652 * - Other negative error, if the configuration is invalid without a 653 * fallback possibility, or the check failed for another reason 654 */ 655 int intel_dp_tunnel_atomic_check_link(struct intel_atomic_state *state, 656 struct intel_link_bw_limits *limits) 657 { 658 u32 failed_stream_mask; 659 int err; 660 661 err = drm_dp_tunnel_atomic_check_stream_bws(&state->base, 662 &failed_stream_mask); 663 if (err != -ENOSPC) 664 return err; 665 666 err = intel_link_bw_reduce_bpp(state, limits, 667 failed_stream_mask, "DP tunnel link BW"); 668 669 return err ? : -EAGAIN; 670 } 671 672 static void atomic_decrease_bw(struct intel_atomic_state *state) 673 { 674 struct intel_crtc *crtc; 675 const struct intel_crtc_state *old_crtc_state; 676 const struct intel_crtc_state *new_crtc_state; 677 int i; 678 679 for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) { 680 const struct drm_dp_tunnel_state *new_tunnel_state; 681 struct drm_dp_tunnel *tunnel; 682 int old_bw; 683 int new_bw; 684 685 if (!intel_crtc_needs_modeset(new_crtc_state)) 686 continue; 687 688 tunnel = get_inherited_tunnel(state, crtc); 689 if (!tunnel) 690 tunnel = old_crtc_state->dp_tunnel_ref.tunnel; 691 692 if (!tunnel) 693 continue; 694 695 old_bw = drm_dp_tunnel_get_allocated_bw(tunnel); 696 697 new_tunnel_state = drm_dp_tunnel_atomic_get_new_state(&state->base, tunnel); 698 new_bw = drm_dp_tunnel_atomic_get_required_bw(new_tunnel_state); 699 700 if (new_bw >= old_bw) 701 continue; 702 703 drm_dp_tunnel_alloc_bw(tunnel, new_bw); 704 } 705 } 706 707 static void queue_retry_work(struct intel_atomic_state *state, 708 struct drm_dp_tunnel *tunnel, 709 const struct intel_crtc_state *crtc_state) 710 { 711 struct drm_i915_private *i915 = to_i915(state->base.dev); 712 struct intel_encoder *encoder; 713 714 encoder = intel_get_crtc_new_encoder(state, crtc_state); 715 716 if (!intel_digital_port_connected(encoder)) 717 return; 718 719 drm_dbg_kms(&i915->drm, 720 "[DPTUN %s][ENCODER:%d:%s] BW allocation failed on a connected sink\n", 721 drm_dp_tunnel_name(tunnel), 722 encoder->base.base.id, 723 encoder->base.name); 724 725 intel_dp_queue_modeset_retry_for_link(state, encoder, crtc_state); 726 } 727 728 static void atomic_increase_bw(struct intel_atomic_state *state) 729 { 730 struct intel_crtc *crtc; 731 const struct intel_crtc_state *crtc_state; 732 int i; 733 734 for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) { 735 struct drm_dp_tunnel_state *tunnel_state; 736 struct drm_dp_tunnel *tunnel = crtc_state->dp_tunnel_ref.tunnel; 737 int bw; 738 739 if (!intel_crtc_needs_modeset(crtc_state)) 740 continue; 741 742 if (!tunnel) 743 continue; 744 745 tunnel_state = drm_dp_tunnel_atomic_get_new_state(&state->base, tunnel); 746 747 bw = drm_dp_tunnel_atomic_get_required_bw(tunnel_state); 748 749 if (drm_dp_tunnel_alloc_bw(tunnel, bw) != 0) 750 queue_retry_work(state, tunnel, crtc_state); 751 } 752 } 753 754 /** 755 * intel_dp_tunnel_atomic_alloc_bw - Allocate the BW for all modeset tunnels 756 * @state: Atomic state 757 * 758 * Allocate the required BW for all tunnels in @state. 759 */ 760 void intel_dp_tunnel_atomic_alloc_bw(struct intel_atomic_state *state) 761 { 762 atomic_decrease_bw(state); 763 atomic_increase_bw(state); 764 } 765 766 /** 767 * intel_dp_tunnel_mgr_init - Initialize the DP tunnel manager 768 * @i915: i915 device object 769 * 770 * Initialize the DP tunnel manager. The tunnel manager will support the 771 * detection/management of DP tunnels on all DP connectors, so the function 772 * must be called after all these connectors have been registered already. 773 * 774 * Return 0 in case of success, a negative error code otherwise. 775 */ 776 int intel_dp_tunnel_mgr_init(struct drm_i915_private *i915) 777 { 778 struct drm_dp_tunnel_mgr *tunnel_mgr; 779 struct drm_connector_list_iter connector_list_iter; 780 struct intel_connector *connector; 781 int dp_connectors = 0; 782 783 drm_connector_list_iter_begin(&i915->drm, &connector_list_iter); 784 for_each_intel_connector_iter(connector, &connector_list_iter) { 785 if (connector->base.connector_type != DRM_MODE_CONNECTOR_DisplayPort) 786 continue; 787 788 dp_connectors++; 789 } 790 drm_connector_list_iter_end(&connector_list_iter); 791 792 tunnel_mgr = drm_dp_tunnel_mgr_create(&i915->drm, dp_connectors); 793 if (IS_ERR(tunnel_mgr)) 794 return PTR_ERR(tunnel_mgr); 795 796 i915->display.dp_tunnel_mgr = tunnel_mgr; 797 798 return 0; 799 } 800 801 /** 802 * intel_dp_tunnel_mgr_cleanup - Clean up the DP tunnel manager state 803 * @i915: i915 device object 804 * 805 * Clean up the DP tunnel manager state. 806 */ 807 void intel_dp_tunnel_mgr_cleanup(struct drm_i915_private *i915) 808 { 809 drm_dp_tunnel_mgr_destroy(i915->display.dp_tunnel_mgr); 810 i915->display.dp_tunnel_mgr = NULL; 811 } 812