1 /* 2 * Copyright (c) 2011-2013, NVIDIA Corporation. 3 * Copyright 2014 Google Inc. 4 * 5 * SPDX-License-Identifier: GPL-2.0 6 */ 7 8 #include <common.h> 9 #include <display.h> 10 #include <dm.h> 11 #include <div64.h> 12 #include <errno.h> 13 #include <fdtdec.h> 14 #include <video_bridge.h> 15 #include <asm/io.h> 16 #include <asm/arch-tegra/dc.h> 17 #include "display.h" 18 #include "edid.h" 19 #include "sor.h" 20 #include "displayport.h" 21 22 DECLARE_GLOBAL_DATA_PTR; 23 24 #define DO_FAST_LINK_TRAINING 1 25 26 struct tegra_dp_plat { 27 ulong base; 28 }; 29 30 /** 31 * struct tegra_dp_priv - private displayport driver info 32 * 33 * @dc_dev: Display controller device that is sending the video feed 34 */ 35 struct tegra_dp_priv { 36 struct udevice *sor; 37 struct udevice *dc_dev; 38 struct dpaux_ctlr *regs; 39 u8 revision; 40 int enabled; 41 }; 42 43 struct tegra_dp_priv dp_data; 44 45 static inline u32 tegra_dpaux_readl(struct tegra_dp_priv *dp, u32 reg) 46 { 47 return readl((u32 *)dp->regs + reg); 48 } 49 50 static inline void tegra_dpaux_writel(struct tegra_dp_priv *dp, u32 reg, 51 u32 val) 52 { 53 writel(val, (u32 *)dp->regs + reg); 54 } 55 56 static inline u32 tegra_dc_dpaux_poll_register(struct tegra_dp_priv *dp, 57 u32 reg, u32 mask, u32 exp_val, 58 u32 poll_interval_us, 59 u32 timeout_us) 60 { 61 u32 reg_val = 0; 62 u32 temp = timeout_us; 63 64 do { 65 udelay(poll_interval_us); 66 reg_val = tegra_dpaux_readl(dp, reg); 67 if (timeout_us > poll_interval_us) 68 timeout_us -= poll_interval_us; 69 else 70 break; 71 } while ((reg_val & mask) != exp_val); 72 73 if ((reg_val & mask) == exp_val) 74 return 0; /* success */ 75 debug("dpaux_poll_register 0x%x: timeout: (reg_val)0x%08x & (mask)0x%08x != (exp_val)0x%08x\n", 76 reg, reg_val, mask, exp_val); 77 return temp; 78 } 79 80 static inline int tegra_dpaux_wait_transaction(struct tegra_dp_priv *dp) 81 { 82 /* According to DP spec, each aux transaction needs to finish 83 within 40ms. */ 84 if (tegra_dc_dpaux_poll_register(dp, DPAUX_DP_AUXCTL, 85 DPAUX_DP_AUXCTL_TRANSACTREQ_MASK, 86 DPAUX_DP_AUXCTL_TRANSACTREQ_DONE, 87 100, DP_AUX_TIMEOUT_MS * 1000) != 0) { 88 debug("dp: DPAUX transaction timeout\n"); 89 return -1; 90 } 91 return 0; 92 } 93 94 static int tegra_dc_dpaux_write_chunk(struct tegra_dp_priv *dp, u32 cmd, 95 u32 addr, u8 *data, u32 *size, 96 u32 *aux_stat) 97 { 98 int i; 99 u32 reg_val; 100 u32 timeout_retries = DP_AUX_TIMEOUT_MAX_TRIES; 101 u32 defer_retries = DP_AUX_DEFER_MAX_TRIES; 102 u32 temp_data; 103 104 if (*size > DP_AUX_MAX_BYTES) 105 return -1; /* only write one chunk of data */ 106 107 /* Make sure the command is write command */ 108 switch (cmd) { 109 case DPAUX_DP_AUXCTL_CMD_I2CWR: 110 case DPAUX_DP_AUXCTL_CMD_MOTWR: 111 case DPAUX_DP_AUXCTL_CMD_AUXWR: 112 break; 113 default: 114 debug("dp: aux write cmd 0x%x is invalid\n", cmd); 115 return -EINVAL; 116 } 117 118 tegra_dpaux_writel(dp, DPAUX_DP_AUXADDR, addr); 119 for (i = 0; i < DP_AUX_MAX_BYTES / 4; ++i) { 120 memcpy(&temp_data, data, 4); 121 tegra_dpaux_writel(dp, DPAUX_DP_AUXDATA_WRITE_W(i), temp_data); 122 data += 4; 123 } 124 125 reg_val = tegra_dpaux_readl(dp, DPAUX_DP_AUXCTL); 126 reg_val &= ~DPAUX_DP_AUXCTL_CMD_MASK; 127 reg_val |= cmd; 128 reg_val &= ~DPAUX_DP_AUXCTL_CMDLEN_FIELD; 129 reg_val |= ((*size - 1) << DPAUX_DP_AUXCTL_CMDLEN_SHIFT); 130 131 while ((timeout_retries > 0) && (defer_retries > 0)) { 132 if ((timeout_retries != DP_AUX_TIMEOUT_MAX_TRIES) || 133 (defer_retries != DP_AUX_DEFER_MAX_TRIES)) 134 udelay(1); 135 136 reg_val |= DPAUX_DP_AUXCTL_TRANSACTREQ_PENDING; 137 tegra_dpaux_writel(dp, DPAUX_DP_AUXCTL, reg_val); 138 139 if (tegra_dpaux_wait_transaction(dp)) 140 debug("dp: aux write transaction timeout\n"); 141 142 *aux_stat = tegra_dpaux_readl(dp, DPAUX_DP_AUXSTAT); 143 144 if ((*aux_stat & DPAUX_DP_AUXSTAT_TIMEOUT_ERROR_PENDING) || 145 (*aux_stat & DPAUX_DP_AUXSTAT_RX_ERROR_PENDING) || 146 (*aux_stat & DPAUX_DP_AUXSTAT_SINKSTAT_ERROR_PENDING) || 147 (*aux_stat & DPAUX_DP_AUXSTAT_NO_STOP_ERROR_PENDING)) { 148 if (timeout_retries-- > 0) { 149 debug("dp: aux write retry (0x%x) -- %d\n", 150 *aux_stat, timeout_retries); 151 /* clear the error bits */ 152 tegra_dpaux_writel(dp, DPAUX_DP_AUXSTAT, 153 *aux_stat); 154 continue; 155 } else { 156 debug("dp: aux write got error (0x%x)\n", 157 *aux_stat); 158 return -ETIMEDOUT; 159 } 160 } 161 162 if ((*aux_stat & DPAUX_DP_AUXSTAT_REPLYTYPE_I2CDEFER) || 163 (*aux_stat & DPAUX_DP_AUXSTAT_REPLYTYPE_DEFER)) { 164 if (defer_retries-- > 0) { 165 debug("dp: aux write defer (0x%x) -- %d\n", 166 *aux_stat, defer_retries); 167 /* clear the error bits */ 168 tegra_dpaux_writel(dp, DPAUX_DP_AUXSTAT, 169 *aux_stat); 170 continue; 171 } else { 172 debug("dp: aux write defer exceeds max retries (0x%x)\n", 173 *aux_stat); 174 return -ETIMEDOUT; 175 } 176 } 177 178 if ((*aux_stat & DPAUX_DP_AUXSTAT_REPLYTYPE_MASK) == 179 DPAUX_DP_AUXSTAT_REPLYTYPE_ACK) { 180 *size = ((*aux_stat) & DPAUX_DP_AUXSTAT_REPLY_M_MASK); 181 return 0; 182 } else { 183 debug("dp: aux write failed (0x%x)\n", *aux_stat); 184 return -EIO; 185 } 186 } 187 /* Should never come to here */ 188 return -EIO; 189 } 190 191 static int tegra_dc_dpaux_read_chunk(struct tegra_dp_priv *dp, u32 cmd, 192 u32 addr, u8 *data, u32 *size, 193 u32 *aux_stat) 194 { 195 u32 reg_val; 196 u32 timeout_retries = DP_AUX_TIMEOUT_MAX_TRIES; 197 u32 defer_retries = DP_AUX_DEFER_MAX_TRIES; 198 199 if (*size > DP_AUX_MAX_BYTES) { 200 debug("only read one chunk\n"); 201 return -EIO; /* only read one chunk */ 202 } 203 204 /* Check to make sure the command is read command */ 205 switch (cmd) { 206 case DPAUX_DP_AUXCTL_CMD_I2CRD: 207 case DPAUX_DP_AUXCTL_CMD_I2CREQWSTAT: 208 case DPAUX_DP_AUXCTL_CMD_MOTRD: 209 case DPAUX_DP_AUXCTL_CMD_AUXRD: 210 break; 211 default: 212 debug("dp: aux read cmd 0x%x is invalid\n", cmd); 213 return -EIO; 214 } 215 216 *aux_stat = tegra_dpaux_readl(dp, DPAUX_DP_AUXSTAT); 217 if (!(*aux_stat & DPAUX_DP_AUXSTAT_HPD_STATUS_PLUGGED)) { 218 debug("dp: HPD is not detected\n"); 219 return -EIO; 220 } 221 222 tegra_dpaux_writel(dp, DPAUX_DP_AUXADDR, addr); 223 224 reg_val = tegra_dpaux_readl(dp, DPAUX_DP_AUXCTL); 225 reg_val &= ~DPAUX_DP_AUXCTL_CMD_MASK; 226 reg_val |= cmd; 227 reg_val &= ~DPAUX_DP_AUXCTL_CMDLEN_FIELD; 228 reg_val |= ((*size - 1) << DPAUX_DP_AUXCTL_CMDLEN_SHIFT); 229 while ((timeout_retries > 0) && (defer_retries > 0)) { 230 if ((timeout_retries != DP_AUX_TIMEOUT_MAX_TRIES) || 231 (defer_retries != DP_AUX_DEFER_MAX_TRIES)) 232 udelay(DP_DPCP_RETRY_SLEEP_NS * 2); 233 234 reg_val |= DPAUX_DP_AUXCTL_TRANSACTREQ_PENDING; 235 tegra_dpaux_writel(dp, DPAUX_DP_AUXCTL, reg_val); 236 237 if (tegra_dpaux_wait_transaction(dp)) 238 debug("dp: aux read transaction timeout\n"); 239 240 *aux_stat = tegra_dpaux_readl(dp, DPAUX_DP_AUXSTAT); 241 242 if ((*aux_stat & DPAUX_DP_AUXSTAT_TIMEOUT_ERROR_PENDING) || 243 (*aux_stat & DPAUX_DP_AUXSTAT_RX_ERROR_PENDING) || 244 (*aux_stat & DPAUX_DP_AUXSTAT_SINKSTAT_ERROR_PENDING) || 245 (*aux_stat & DPAUX_DP_AUXSTAT_NO_STOP_ERROR_PENDING)) { 246 if (timeout_retries-- > 0) { 247 debug("dp: aux read retry (0x%x) -- %d\n", 248 *aux_stat, timeout_retries); 249 /* clear the error bits */ 250 tegra_dpaux_writel(dp, DPAUX_DP_AUXSTAT, 251 *aux_stat); 252 continue; /* retry */ 253 } else { 254 debug("dp: aux read got error (0x%x)\n", 255 *aux_stat); 256 return -ETIMEDOUT; 257 } 258 } 259 260 if ((*aux_stat & DPAUX_DP_AUXSTAT_REPLYTYPE_I2CDEFER) || 261 (*aux_stat & DPAUX_DP_AUXSTAT_REPLYTYPE_DEFER)) { 262 if (defer_retries-- > 0) { 263 debug("dp: aux read defer (0x%x) -- %d\n", 264 *aux_stat, defer_retries); 265 /* clear the error bits */ 266 tegra_dpaux_writel(dp, DPAUX_DP_AUXSTAT, 267 *aux_stat); 268 continue; 269 } else { 270 debug("dp: aux read defer exceeds max retries (0x%x)\n", 271 *aux_stat); 272 return -ETIMEDOUT; 273 } 274 } 275 276 if ((*aux_stat & DPAUX_DP_AUXSTAT_REPLYTYPE_MASK) == 277 DPAUX_DP_AUXSTAT_REPLYTYPE_ACK) { 278 int i; 279 u32 temp_data[4]; 280 281 for (i = 0; i < DP_AUX_MAX_BYTES / 4; ++i) 282 temp_data[i] = tegra_dpaux_readl(dp, 283 DPAUX_DP_AUXDATA_READ_W(i)); 284 285 *size = ((*aux_stat) & DPAUX_DP_AUXSTAT_REPLY_M_MASK); 286 memcpy(data, temp_data, *size); 287 288 return 0; 289 } else { 290 debug("dp: aux read failed (0x%x\n", *aux_stat); 291 return -EIO; 292 } 293 } 294 /* Should never come to here */ 295 debug("%s: can't\n", __func__); 296 297 return -EIO; 298 } 299 300 static int tegra_dc_dpaux_read(struct tegra_dp_priv *dp, u32 cmd, u32 addr, 301 u8 *data, u32 *size, u32 *aux_stat) 302 { 303 u32 finished = 0; 304 u32 cur_size; 305 int ret = 0; 306 307 do { 308 cur_size = *size - finished; 309 if (cur_size > DP_AUX_MAX_BYTES) 310 cur_size = DP_AUX_MAX_BYTES; 311 312 ret = tegra_dc_dpaux_read_chunk(dp, cmd, addr, 313 data, &cur_size, aux_stat); 314 if (ret) 315 break; 316 317 /* cur_size should be the real size returned */ 318 addr += cur_size; 319 data += cur_size; 320 finished += cur_size; 321 322 } while (*size > finished); 323 *size = finished; 324 325 return ret; 326 } 327 328 static int tegra_dc_dp_dpcd_read(struct tegra_dp_priv *dp, u32 cmd, 329 u8 *data_ptr) 330 { 331 u32 size = 1; 332 u32 status = 0; 333 int ret; 334 335 ret = tegra_dc_dpaux_read_chunk(dp, DPAUX_DP_AUXCTL_CMD_AUXRD, 336 cmd, data_ptr, &size, &status); 337 if (ret) { 338 debug("dp: Failed to read DPCD data. CMD 0x%x, Status 0x%x\n", 339 cmd, status); 340 } 341 342 return ret; 343 } 344 345 static int tegra_dc_dp_dpcd_write(struct tegra_dp_priv *dp, u32 cmd, 346 u8 data) 347 { 348 u32 size = 1; 349 u32 status = 0; 350 int ret; 351 352 ret = tegra_dc_dpaux_write_chunk(dp, DPAUX_DP_AUXCTL_CMD_AUXWR, 353 cmd, &data, &size, &status); 354 if (ret) { 355 debug("dp: Failed to write DPCD data. CMD 0x%x, Status 0x%x\n", 356 cmd, status); 357 } 358 359 return ret; 360 } 361 362 static int tegra_dc_i2c_aux_read(struct tegra_dp_priv *dp, u32 i2c_addr, 363 u8 addr, u8 *data, u32 size, u32 *aux_stat) 364 { 365 u32 finished = 0; 366 int ret = 0; 367 368 do { 369 u32 cur_size = min((u32)DP_AUX_MAX_BYTES, size - finished); 370 371 u32 len = 1; 372 ret = tegra_dc_dpaux_write_chunk( 373 dp, DPAUX_DP_AUXCTL_CMD_MOTWR, i2c_addr, 374 &addr, &len, aux_stat); 375 if (ret) { 376 debug("%s: error sending address to read.\n", 377 __func__); 378 return ret; 379 } 380 381 ret = tegra_dc_dpaux_read_chunk( 382 dp, DPAUX_DP_AUXCTL_CMD_I2CRD, i2c_addr, 383 data, &cur_size, aux_stat); 384 if (ret) { 385 debug("%s: error reading data.\n", __func__); 386 return ret; 387 } 388 389 /* cur_size should be the real size returned */ 390 addr += cur_size; 391 data += cur_size; 392 finished += cur_size; 393 } while (size > finished); 394 395 return finished; 396 } 397 398 static void tegra_dc_dpaux_enable(struct tegra_dp_priv *dp) 399 { 400 /* clear interrupt */ 401 tegra_dpaux_writel(dp, DPAUX_INTR_AUX, 0xffffffff); 402 /* do not enable interrupt for now. Enable them when Isr in place */ 403 tegra_dpaux_writel(dp, DPAUX_INTR_EN_AUX, 0x0); 404 405 tegra_dpaux_writel(dp, DPAUX_HYBRID_PADCTL, 406 DPAUX_HYBRID_PADCTL_AUX_DRVZ_OHM_50 | 407 DPAUX_HYBRID_PADCTL_AUX_CMH_V0_70 | 408 0x18 << DPAUX_HYBRID_PADCTL_AUX_DRVI_SHIFT | 409 DPAUX_HYBRID_PADCTL_AUX_INPUT_RCV_ENABLE); 410 411 tegra_dpaux_writel(dp, DPAUX_HYBRID_SPARE, 412 DPAUX_HYBRID_SPARE_PAD_PWR_POWERUP); 413 } 414 415 #ifdef DEBUG 416 static void tegra_dc_dp_dump_link_cfg(struct tegra_dp_priv *dp, 417 const struct tegra_dp_link_config *link_cfg) 418 { 419 debug("DP config: cfg_name cfg_value\n"); 420 debug(" Lane Count %d\n", 421 link_cfg->max_lane_count); 422 debug(" SupportEnhancedFraming %s\n", 423 link_cfg->support_enhanced_framing ? "Y" : "N"); 424 debug(" Bandwidth %d\n", 425 link_cfg->max_link_bw); 426 debug(" bpp %d\n", 427 link_cfg->bits_per_pixel); 428 debug(" EnhancedFraming %s\n", 429 link_cfg->enhanced_framing ? "Y" : "N"); 430 debug(" Scramble_enabled %s\n", 431 link_cfg->scramble_ena ? "Y" : "N"); 432 debug(" LinkBW %d\n", 433 link_cfg->link_bw); 434 debug(" lane_count %d\n", 435 link_cfg->lane_count); 436 debug(" activespolarity %d\n", 437 link_cfg->activepolarity); 438 debug(" active_count %d\n", 439 link_cfg->active_count); 440 debug(" tu_size %d\n", 441 link_cfg->tu_size); 442 debug(" active_frac %d\n", 443 link_cfg->active_frac); 444 debug(" watermark %d\n", 445 link_cfg->watermark); 446 debug(" hblank_sym %d\n", 447 link_cfg->hblank_sym); 448 debug(" vblank_sym %d\n", 449 link_cfg->vblank_sym); 450 } 451 #endif 452 453 static int _tegra_dp_lower_link_config(struct tegra_dp_priv *dp, 454 struct tegra_dp_link_config *cfg) 455 { 456 switch (cfg->link_bw) { 457 case SOR_LINK_SPEED_G1_62: 458 if (cfg->max_link_bw > SOR_LINK_SPEED_G1_62) 459 cfg->link_bw = SOR_LINK_SPEED_G2_7; 460 cfg->lane_count /= 2; 461 break; 462 case SOR_LINK_SPEED_G2_7: 463 cfg->link_bw = SOR_LINK_SPEED_G1_62; 464 break; 465 case SOR_LINK_SPEED_G5_4: 466 if (cfg->lane_count == 1) { 467 cfg->link_bw = SOR_LINK_SPEED_G2_7; 468 cfg->lane_count = cfg->max_lane_count; 469 } else { 470 cfg->lane_count /= 2; 471 } 472 break; 473 default: 474 debug("dp: Error link rate %d\n", cfg->link_bw); 475 return -ENOLINK; 476 } 477 478 return (cfg->lane_count > 0) ? 0 : -ENOLINK; 479 } 480 481 /* 482 * Calcuate if given cfg can meet the mode request. 483 * Return 0 if mode is possible, -1 otherwise 484 */ 485 static int tegra_dc_dp_calc_config(struct tegra_dp_priv *dp, 486 const struct display_timing *timing, 487 struct tegra_dp_link_config *link_cfg) 488 { 489 const u32 link_rate = 27 * link_cfg->link_bw * 1000 * 1000; 490 const u64 f = 100000; /* precision factor */ 491 u32 num_linkclk_line; /* Number of link clocks per line */ 492 u64 ratio_f; /* Ratio of incoming to outgoing data rate */ 493 u64 frac_f; 494 u64 activesym_f; /* Activesym per TU */ 495 u64 activecount_f; 496 u32 activecount; 497 u32 activepolarity; 498 u64 approx_value_f; 499 u32 activefrac = 0; 500 u64 accumulated_error_f = 0; 501 u32 lowest_neg_activecount = 0; 502 u32 lowest_neg_activepolarity = 0; 503 u32 lowest_neg_tusize = 64; 504 u32 num_symbols_per_line; 505 u64 lowest_neg_activefrac = 0; 506 u64 lowest_neg_error_f = 64 * f; 507 u64 watermark_f; 508 int i; 509 int neg; 510 511 if (!link_rate || !link_cfg->lane_count || !timing->pixelclock.typ || 512 !link_cfg->bits_per_pixel) 513 return -1; 514 515 if ((u64)timing->pixelclock.typ * link_cfg->bits_per_pixel >= 516 (u64)link_rate * 8 * link_cfg->lane_count) 517 return -1; 518 519 num_linkclk_line = (u32)(lldiv(link_rate * timing->hactive.typ, 520 timing->pixelclock.typ)); 521 522 ratio_f = (u64)timing->pixelclock.typ * link_cfg->bits_per_pixel * f; 523 ratio_f /= 8; 524 do_div(ratio_f, link_rate * link_cfg->lane_count); 525 526 for (i = 64; i >= 32; --i) { 527 activesym_f = ratio_f * i; 528 activecount_f = lldiv(activesym_f, (u32)f) * f; 529 frac_f = activesym_f - activecount_f; 530 activecount = (u32)(lldiv(activecount_f, (u32)f)); 531 532 if (frac_f < (lldiv(f, 2))) /* fraction < 0.5 */ 533 activepolarity = 0; 534 else { 535 activepolarity = 1; 536 frac_f = f - frac_f; 537 } 538 539 if (frac_f != 0) { 540 /* warning: frac_f should be 64-bit */ 541 frac_f = lldiv(f * f, frac_f); /* 1 / fraction */ 542 if (frac_f > (15 * f)) 543 activefrac = activepolarity ? 1 : 15; 544 else 545 activefrac = activepolarity ? 546 (u32)lldiv(frac_f, (u32)f) + 1 : 547 (u32)lldiv(frac_f, (u32)f); 548 } 549 550 if (activefrac == 1) 551 activepolarity = 0; 552 553 if (activepolarity == 1) 554 approx_value_f = activefrac ? lldiv( 555 (activecount_f + (activefrac * f - f) * f), 556 (activefrac * f)) : 557 activecount_f + f; 558 else 559 approx_value_f = activefrac ? 560 activecount_f + lldiv(f, activefrac) : 561 activecount_f; 562 563 if (activesym_f < approx_value_f) { 564 accumulated_error_f = num_linkclk_line * 565 lldiv(approx_value_f - activesym_f, i); 566 neg = 1; 567 } else { 568 accumulated_error_f = num_linkclk_line * 569 lldiv(activesym_f - approx_value_f, i); 570 neg = 0; 571 } 572 573 if ((neg && (lowest_neg_error_f > accumulated_error_f)) || 574 (accumulated_error_f == 0)) { 575 lowest_neg_error_f = accumulated_error_f; 576 lowest_neg_tusize = i; 577 lowest_neg_activecount = activecount; 578 lowest_neg_activepolarity = activepolarity; 579 lowest_neg_activefrac = activefrac; 580 581 if (accumulated_error_f == 0) 582 break; 583 } 584 } 585 586 if (lowest_neg_activefrac == 0) { 587 link_cfg->activepolarity = 0; 588 link_cfg->active_count = lowest_neg_activepolarity ? 589 lowest_neg_activecount : lowest_neg_activecount - 1; 590 link_cfg->tu_size = lowest_neg_tusize; 591 link_cfg->active_frac = 1; 592 } else { 593 link_cfg->activepolarity = lowest_neg_activepolarity; 594 link_cfg->active_count = (u32)lowest_neg_activecount; 595 link_cfg->tu_size = lowest_neg_tusize; 596 link_cfg->active_frac = (u32)lowest_neg_activefrac; 597 } 598 599 watermark_f = lldiv(ratio_f * link_cfg->tu_size * (f - ratio_f), f); 600 link_cfg->watermark = (u32)(lldiv(watermark_f + lowest_neg_error_f, 601 f)) + link_cfg->bits_per_pixel / 4 - 1; 602 num_symbols_per_line = (timing->hactive.typ * 603 link_cfg->bits_per_pixel) / 604 (8 * link_cfg->lane_count); 605 606 if (link_cfg->watermark > 30) { 607 debug("dp: sor setting: unable to get a good tusize, force watermark to 30\n"); 608 link_cfg->watermark = 30; 609 return -1; 610 } else if (link_cfg->watermark > num_symbols_per_line) { 611 debug("dp: sor setting: force watermark to the number of symbols in the line\n"); 612 link_cfg->watermark = num_symbols_per_line; 613 return -1; 614 } 615 616 /* 617 * Refer to dev_disp.ref for more information. 618 * # symbols/hblank = ((SetRasterBlankEnd.X + SetRasterSize.Width - 619 * SetRasterBlankStart.X - 7) * link_clk / pclk) 620 * - 3 * enhanced_framing - Y 621 * where Y = (# lanes == 4) 3 : (# lanes == 2) ? 6 : 12 622 */ 623 link_cfg->hblank_sym = (int)lldiv(((uint64_t)timing->hback_porch.typ + 624 timing->hfront_porch.typ + timing->hsync_len.typ - 7) * 625 link_rate, timing->pixelclock.typ) - 626 3 * link_cfg->enhanced_framing - 627 (12 / link_cfg->lane_count); 628 629 if (link_cfg->hblank_sym < 0) 630 link_cfg->hblank_sym = 0; 631 632 633 /* 634 * Refer to dev_disp.ref for more information. 635 * # symbols/vblank = ((SetRasterBlankStart.X - 636 * SetRasterBlankEen.X - 25) * link_clk / pclk) 637 * - Y - 1; 638 * where Y = (# lanes == 4) 12 : (# lanes == 2) ? 21 : 39 639 */ 640 link_cfg->vblank_sym = (int)lldiv(((uint64_t)timing->hactive.typ - 25) 641 * link_rate, timing->pixelclock.typ) - (36 / 642 link_cfg->lane_count) - 4; 643 644 if (link_cfg->vblank_sym < 0) 645 link_cfg->vblank_sym = 0; 646 647 link_cfg->is_valid = 1; 648 #ifdef DEBUG 649 tegra_dc_dp_dump_link_cfg(dp, link_cfg); 650 #endif 651 652 return 0; 653 } 654 655 static int tegra_dc_dp_init_max_link_cfg( 656 const struct display_timing *timing, 657 struct tegra_dp_priv *dp, 658 struct tegra_dp_link_config *link_cfg) 659 { 660 const int drive_current = 0x40404040; 661 const int preemphasis = 0x0f0f0f0f; 662 const int postcursor = 0; 663 u8 dpcd_data; 664 int ret; 665 666 ret = tegra_dc_dp_dpcd_read(dp, DP_MAX_LANE_COUNT, &dpcd_data); 667 if (ret) 668 return ret; 669 link_cfg->max_lane_count = dpcd_data & DP_MAX_LANE_COUNT_MASK; 670 link_cfg->tps3_supported = (dpcd_data & 671 DP_MAX_LANE_COUNT_TPS3_SUPPORTED_YES) ? 1 : 0; 672 673 link_cfg->support_enhanced_framing = 674 (dpcd_data & DP_MAX_LANE_COUNT_ENHANCED_FRAMING_YES) ? 675 1 : 0; 676 677 ret = tegra_dc_dp_dpcd_read(dp, DP_MAX_DOWNSPREAD, &dpcd_data); 678 if (ret) 679 return ret; 680 link_cfg->downspread = (dpcd_data & DP_MAX_DOWNSPREAD_VAL_0_5_PCT) ? 681 1 : 0; 682 683 ret = tegra_dc_dp_dpcd_read(dp, NV_DPCD_TRAINING_AUX_RD_INTERVAL, 684 &link_cfg->aux_rd_interval); 685 if (ret) 686 return ret; 687 ret = tegra_dc_dp_dpcd_read(dp, DP_MAX_LINK_RATE, 688 &link_cfg->max_link_bw); 689 if (ret) 690 return ret; 691 692 /* 693 * Set to a high value for link training and attach. 694 * Will be re-programmed when dp is enabled. 695 */ 696 link_cfg->drive_current = drive_current; 697 link_cfg->preemphasis = preemphasis; 698 link_cfg->postcursor = postcursor; 699 700 ret = tegra_dc_dp_dpcd_read(dp, DP_EDP_CONFIGURATION_CAP, &dpcd_data); 701 if (ret) 702 return ret; 703 704 link_cfg->alt_scramber_reset_cap = 705 (dpcd_data & DP_EDP_CONFIGURATION_CAP_ASC_RESET_YES) ? 706 1 : 0; 707 link_cfg->only_enhanced_framing = 708 (dpcd_data & DP_EDP_CONFIGURATION_CAP_FRAMING_CHANGE_YES) ? 709 1 : 0; 710 711 link_cfg->lane_count = link_cfg->max_lane_count; 712 link_cfg->link_bw = link_cfg->max_link_bw; 713 link_cfg->enhanced_framing = link_cfg->support_enhanced_framing; 714 link_cfg->frame_in_ms = (1000 / 60) + 1; 715 716 tegra_dc_dp_calc_config(dp, timing, link_cfg); 717 return 0; 718 } 719 720 static int tegra_dc_dp_set_assr(struct tegra_dp_priv *priv, 721 struct udevice *sor, int ena) 722 { 723 int ret; 724 725 u8 dpcd_data = ena ? 726 DP_MAIN_LINK_CHANNEL_CODING_SET_ASC_RESET_ENABLE : 727 DP_MAIN_LINK_CHANNEL_CODING_SET_ASC_RESET_DISABLE; 728 729 ret = tegra_dc_dp_dpcd_write(priv, DP_EDP_CONFIGURATION_SET, 730 dpcd_data); 731 if (ret) 732 return ret; 733 734 /* Also reset the scrambler to 0xfffe */ 735 tegra_dc_sor_set_internal_panel(sor, ena); 736 return 0; 737 } 738 739 static int tegra_dp_set_link_bandwidth(struct tegra_dp_priv *dp, 740 struct udevice *sor, 741 u8 link_bw) 742 { 743 tegra_dc_sor_set_link_bandwidth(sor, link_bw); 744 745 /* Sink side */ 746 return tegra_dc_dp_dpcd_write(dp, DP_LINK_BW_SET, link_bw); 747 } 748 749 static int tegra_dp_set_lane_count(struct tegra_dp_priv *dp, 750 const struct tegra_dp_link_config *link_cfg, 751 struct udevice *sor) 752 { 753 u8 dpcd_data; 754 int ret; 755 756 /* check if panel support enhanched_framing */ 757 dpcd_data = link_cfg->lane_count; 758 if (link_cfg->enhanced_framing) 759 dpcd_data |= DP_LANE_COUNT_SET_ENHANCEDFRAMING_T; 760 ret = tegra_dc_dp_dpcd_write(dp, DP_LANE_COUNT_SET, dpcd_data); 761 if (ret) 762 return ret; 763 764 tegra_dc_sor_set_lane_count(sor, link_cfg->lane_count); 765 766 /* Also power down lanes that will not be used */ 767 return 0; 768 } 769 770 static int tegra_dc_dp_link_trained(struct tegra_dp_priv *dp, 771 const struct tegra_dp_link_config *cfg) 772 { 773 u32 lane; 774 u8 mask; 775 u8 data; 776 int ret; 777 778 for (lane = 0; lane < cfg->lane_count; ++lane) { 779 ret = tegra_dc_dp_dpcd_read(dp, (lane / 2) ? 780 DP_LANE2_3_STATUS : DP_LANE0_1_STATUS, 781 &data); 782 if (ret) 783 return ret; 784 mask = (lane & 1) ? 785 NV_DPCD_STATUS_LANEXPLUS1_CR_DONE_YES | 786 NV_DPCD_STATUS_LANEXPLUS1_CHN_EQ_DONE_YES | 787 NV_DPCD_STATUS_LANEXPLUS1_SYMBOL_LOCKED_YES : 788 DP_LANE_CR_DONE | 789 DP_LANE_CHANNEL_EQ_DONE | 790 DP_LANE_SYMBOL_LOCKED; 791 if ((data & mask) != mask) 792 return -1; 793 } 794 return 0; 795 } 796 797 static int tegra_dp_channel_eq_status(struct tegra_dp_priv *dp, 798 const struct tegra_dp_link_config *cfg) 799 { 800 u32 cnt; 801 u32 n_lanes = cfg->lane_count; 802 u8 data; 803 u8 ce_done = 1; 804 int ret; 805 806 for (cnt = 0; cnt < n_lanes / 2; cnt++) { 807 ret = tegra_dc_dp_dpcd_read(dp, DP_LANE0_1_STATUS + cnt, &data); 808 if (ret) 809 return ret; 810 811 if (n_lanes == 1) { 812 ce_done = (data & (0x1 << 813 NV_DPCD_STATUS_LANEX_CHN_EQ_DONE_SHIFT)) && 814 (data & (0x1 << 815 NV_DPCD_STATUS_LANEX_SYMBOL_LOCKED_SHFIT)); 816 break; 817 } else if (!(data & (0x1 << 818 NV_DPCD_STATUS_LANEX_CHN_EQ_DONE_SHIFT)) || 819 !(data & (0x1 << 820 NV_DPCD_STATUS_LANEX_SYMBOL_LOCKED_SHFIT)) || 821 !(data & (0x1 << 822 NV_DPCD_STATUS_LANEXPLUS1_CHN_EQ_DONE_SHIFT)) || 823 !(data & (0x1 << 824 NV_DPCD_STATUS_LANEXPLUS1_SYMBOL_LOCKED_SHIFT))) 825 return -EIO; 826 } 827 828 if (ce_done) { 829 ret = tegra_dc_dp_dpcd_read(dp, 830 DP_LANE_ALIGN_STATUS_UPDATED, 831 &data); 832 if (ret) 833 return ret; 834 if (!(data & NV_DPCD_LANE_ALIGN_STATUS_UPDATED_DONE_YES)) 835 ce_done = 0; 836 } 837 838 return ce_done ? 0 : -EIO; 839 } 840 841 static int tegra_dp_clock_recovery_status(struct tegra_dp_priv *dp, 842 const struct tegra_dp_link_config *cfg) 843 { 844 u32 cnt; 845 u32 n_lanes = cfg->lane_count; 846 u8 data_ptr; 847 int ret; 848 849 for (cnt = 0; cnt < n_lanes / 2; cnt++) { 850 ret = tegra_dc_dp_dpcd_read(dp, (DP_LANE0_1_STATUS + cnt), 851 &data_ptr); 852 if (ret) 853 return ret; 854 855 if (n_lanes == 1) 856 return (data_ptr & NV_DPCD_STATUS_LANEX_CR_DONE_YES) ? 857 1 : 0; 858 else if (!(data_ptr & NV_DPCD_STATUS_LANEX_CR_DONE_YES) || 859 !(data_ptr & (NV_DPCD_STATUS_LANEXPLUS1_CR_DONE_YES))) 860 return 0; 861 } 862 863 return 1; 864 } 865 866 static int tegra_dp_lt_adjust(struct tegra_dp_priv *dp, u32 pe[4], u32 vs[4], 867 u32 pc[4], u8 pc_supported, 868 const struct tegra_dp_link_config *cfg) 869 { 870 size_t cnt; 871 u8 data_ptr; 872 u32 n_lanes = cfg->lane_count; 873 int ret; 874 875 for (cnt = 0; cnt < n_lanes / 2; cnt++) { 876 ret = tegra_dc_dp_dpcd_read(dp, DP_ADJUST_REQUEST_LANE0_1 + cnt, 877 &data_ptr); 878 if (ret) 879 return ret; 880 pe[2 * cnt] = (data_ptr & NV_DPCD_ADJUST_REQ_LANEX_PE_MASK) >> 881 NV_DPCD_ADJUST_REQ_LANEX_PE_SHIFT; 882 vs[2 * cnt] = (data_ptr & NV_DPCD_ADJUST_REQ_LANEX_DC_MASK) >> 883 NV_DPCD_ADJUST_REQ_LANEX_DC_SHIFT; 884 pe[1 + 2 * cnt] = 885 (data_ptr & NV_DPCD_ADJUST_REQ_LANEXPLUS1_PE_MASK) >> 886 NV_DPCD_ADJUST_REQ_LANEXPLUS1_PE_SHIFT; 887 vs[1 + 2 * cnt] = 888 (data_ptr & NV_DPCD_ADJUST_REQ_LANEXPLUS1_DC_MASK) >> 889 NV_DPCD_ADJUST_REQ_LANEXPLUS1_DC_SHIFT; 890 } 891 if (pc_supported) { 892 ret = tegra_dc_dp_dpcd_read(dp, NV_DPCD_ADJUST_REQ_POST_CURSOR2, 893 &data_ptr); 894 if (ret) 895 return ret; 896 for (cnt = 0; cnt < n_lanes; cnt++) { 897 pc[cnt] = (data_ptr >> 898 NV_DPCD_ADJUST_REQ_POST_CURSOR2_LANE_SHIFT(cnt)) & 899 NV_DPCD_ADJUST_REQ_POST_CURSOR2_LANE_MASK; 900 } 901 } 902 903 return 0; 904 } 905 906 static void tegra_dp_wait_aux_training(struct tegra_dp_priv *dp, 907 bool is_clk_recovery, 908 const struct tegra_dp_link_config *cfg) 909 { 910 if (!cfg->aux_rd_interval) 911 udelay(is_clk_recovery ? 200 : 500); 912 else 913 mdelay(cfg->aux_rd_interval * 4); 914 } 915 916 static void tegra_dp_tpg(struct tegra_dp_priv *dp, u32 tp, u32 n_lanes, 917 const struct tegra_dp_link_config *cfg) 918 { 919 u8 data = (tp == training_pattern_disabled) 920 ? (tp | NV_DPCD_TRAINING_PATTERN_SET_SC_DISABLED_F) 921 : (tp | NV_DPCD_TRAINING_PATTERN_SET_SC_DISABLED_T); 922 923 tegra_dc_sor_set_dp_linkctl(dp->sor, 1, tp, cfg); 924 tegra_dc_dp_dpcd_write(dp, DP_TRAINING_PATTERN_SET, data); 925 } 926 927 static int tegra_dp_link_config(struct tegra_dp_priv *dp, 928 const struct tegra_dp_link_config *link_cfg) 929 { 930 u8 dpcd_data; 931 u32 retry; 932 int ret; 933 934 if (link_cfg->lane_count == 0) { 935 debug("dp: error: lane count is 0. Can not set link config.\n"); 936 return -ENOLINK; 937 } 938 939 /* Set power state if it is not in normal level */ 940 ret = tegra_dc_dp_dpcd_read(dp, DP_SET_POWER, &dpcd_data); 941 if (ret) 942 return ret; 943 944 if (dpcd_data == DP_SET_POWER_D3) { 945 dpcd_data = DP_SET_POWER_D0; 946 947 /* DP spec requires 3 retries */ 948 for (retry = 3; retry > 0; --retry) { 949 ret = tegra_dc_dp_dpcd_write(dp, DP_SET_POWER, 950 dpcd_data); 951 if (!ret) 952 break; 953 if (retry == 1) { 954 debug("dp: Failed to set DP panel power\n"); 955 return ret; 956 } 957 } 958 } 959 960 /* Enable ASSR if possible */ 961 if (link_cfg->alt_scramber_reset_cap) { 962 ret = tegra_dc_dp_set_assr(dp, dp->sor, 1); 963 if (ret) 964 return ret; 965 } 966 967 ret = tegra_dp_set_link_bandwidth(dp, dp->sor, link_cfg->link_bw); 968 if (ret) { 969 debug("dp: Failed to set link bandwidth\n"); 970 return ret; 971 } 972 ret = tegra_dp_set_lane_count(dp, link_cfg, dp->sor); 973 if (ret) { 974 debug("dp: Failed to set lane count\n"); 975 return ret; 976 } 977 tegra_dc_sor_set_dp_linkctl(dp->sor, 1, training_pattern_none, 978 link_cfg); 979 980 return 0; 981 } 982 983 static int tegra_dp_lower_link_config(struct tegra_dp_priv *dp, 984 const struct display_timing *timing, 985 struct tegra_dp_link_config *cfg) 986 { 987 struct tegra_dp_link_config tmp_cfg; 988 int ret; 989 990 tmp_cfg = *cfg; 991 cfg->is_valid = 0; 992 993 ret = _tegra_dp_lower_link_config(dp, cfg); 994 if (!ret) 995 ret = tegra_dc_dp_calc_config(dp, timing, cfg); 996 if (!ret) 997 ret = tegra_dp_link_config(dp, cfg); 998 if (ret) 999 goto fail; 1000 1001 return 0; 1002 1003 fail: 1004 *cfg = tmp_cfg; 1005 tegra_dp_link_config(dp, &tmp_cfg); 1006 return ret; 1007 } 1008 1009 static int tegra_dp_lt_config(struct tegra_dp_priv *dp, u32 pe[4], u32 vs[4], 1010 u32 pc[4], const struct tegra_dp_link_config *cfg) 1011 { 1012 struct udevice *sor = dp->sor; 1013 u32 n_lanes = cfg->lane_count; 1014 u8 pc_supported = cfg->tps3_supported; 1015 u32 cnt; 1016 u32 val; 1017 1018 for (cnt = 0; cnt < n_lanes; cnt++) { 1019 u32 mask = 0; 1020 u32 pe_reg, vs_reg, pc_reg; 1021 u32 shift = 0; 1022 1023 switch (cnt) { 1024 case 0: 1025 mask = PR_LANE2_DP_LANE0_MASK; 1026 shift = PR_LANE2_DP_LANE0_SHIFT; 1027 break; 1028 case 1: 1029 mask = PR_LANE1_DP_LANE1_MASK; 1030 shift = PR_LANE1_DP_LANE1_SHIFT; 1031 break; 1032 case 2: 1033 mask = PR_LANE0_DP_LANE2_MASK; 1034 shift = PR_LANE0_DP_LANE2_SHIFT; 1035 break; 1036 case 3: 1037 mask = PR_LANE3_DP_LANE3_MASK; 1038 shift = PR_LANE3_DP_LANE3_SHIFT; 1039 break; 1040 default: 1041 debug("dp: incorrect lane cnt\n"); 1042 return -EINVAL; 1043 } 1044 1045 pe_reg = tegra_dp_pe_regs[pc[cnt]][vs[cnt]][pe[cnt]]; 1046 vs_reg = tegra_dp_vs_regs[pc[cnt]][vs[cnt]][pe[cnt]]; 1047 pc_reg = tegra_dp_pc_regs[pc[cnt]][vs[cnt]][pe[cnt]]; 1048 1049 tegra_dp_set_pe_vs_pc(sor, mask, pe_reg << shift, 1050 vs_reg << shift, pc_reg << shift, 1051 pc_supported); 1052 } 1053 1054 tegra_dp_disable_tx_pu(dp->sor); 1055 udelay(20); 1056 1057 for (cnt = 0; cnt < n_lanes; cnt++) { 1058 u32 max_vs_flag = tegra_dp_is_max_vs(pe[cnt], vs[cnt]); 1059 u32 max_pe_flag = tegra_dp_is_max_pe(pe[cnt], vs[cnt]); 1060 1061 val = (vs[cnt] << NV_DPCD_TRAINING_LANEX_SET_DC_SHIFT) | 1062 (max_vs_flag ? 1063 NV_DPCD_TRAINING_LANEX_SET_DC_MAX_REACHED_T : 1064 NV_DPCD_TRAINING_LANEX_SET_DC_MAX_REACHED_F) | 1065 (pe[cnt] << NV_DPCD_TRAINING_LANEX_SET_PE_SHIFT) | 1066 (max_pe_flag ? 1067 NV_DPCD_TRAINING_LANEX_SET_PE_MAX_REACHED_T : 1068 NV_DPCD_TRAINING_LANEX_SET_PE_MAX_REACHED_F); 1069 tegra_dc_dp_dpcd_write(dp, (DP_TRAINING_LANE0_SET + cnt), val); 1070 } 1071 1072 if (pc_supported) { 1073 for (cnt = 0; cnt < n_lanes / 2; cnt++) { 1074 u32 max_pc_flag0 = tegra_dp_is_max_pc(pc[cnt]); 1075 u32 max_pc_flag1 = tegra_dp_is_max_pc(pc[cnt + 1]); 1076 val = (pc[cnt] << NV_DPCD_LANEX_SET2_PC2_SHIFT) | 1077 (max_pc_flag0 ? 1078 NV_DPCD_LANEX_SET2_PC2_MAX_REACHED_T : 1079 NV_DPCD_LANEX_SET2_PC2_MAX_REACHED_F) | 1080 (pc[cnt + 1] << 1081 NV_DPCD_LANEXPLUS1_SET2_PC2_SHIFT) | 1082 (max_pc_flag1 ? 1083 NV_DPCD_LANEXPLUS1_SET2_PC2_MAX_REACHED_T : 1084 NV_DPCD_LANEXPLUS1_SET2_PC2_MAX_REACHED_F); 1085 tegra_dc_dp_dpcd_write(dp, 1086 NV_DPCD_TRAINING_LANE0_1_SET2 + 1087 cnt, val); 1088 } 1089 } 1090 1091 return 0; 1092 } 1093 1094 static int _tegra_dp_channel_eq(struct tegra_dp_priv *dp, u32 pe[4], 1095 u32 vs[4], u32 pc[4], u8 pc_supported, 1096 u32 n_lanes, 1097 const struct tegra_dp_link_config *cfg) 1098 { 1099 u32 retry_cnt; 1100 1101 for (retry_cnt = 0; retry_cnt < 4; retry_cnt++) { 1102 int ret; 1103 1104 if (retry_cnt) { 1105 ret = tegra_dp_lt_adjust(dp, pe, vs, pc, pc_supported, 1106 cfg); 1107 if (ret) 1108 return ret; 1109 tegra_dp_lt_config(dp, pe, vs, pc, cfg); 1110 } 1111 1112 tegra_dp_wait_aux_training(dp, false, cfg); 1113 1114 if (!tegra_dp_clock_recovery_status(dp, cfg)) { 1115 debug("dp: CR failed in channel EQ sequence!\n"); 1116 break; 1117 } 1118 1119 if (!tegra_dp_channel_eq_status(dp, cfg)) 1120 return 0; 1121 } 1122 1123 return -EIO; 1124 } 1125 1126 static int tegra_dp_channel_eq(struct tegra_dp_priv *dp, u32 pe[4], u32 vs[4], 1127 u32 pc[4], 1128 const struct tegra_dp_link_config *cfg) 1129 { 1130 u32 n_lanes = cfg->lane_count; 1131 u8 pc_supported = cfg->tps3_supported; 1132 int ret; 1133 u32 tp_src = training_pattern_2; 1134 1135 if (pc_supported) 1136 tp_src = training_pattern_3; 1137 1138 tegra_dp_tpg(dp, tp_src, n_lanes, cfg); 1139 1140 ret = _tegra_dp_channel_eq(dp, pe, vs, pc, pc_supported, n_lanes, cfg); 1141 1142 tegra_dp_tpg(dp, training_pattern_disabled, n_lanes, cfg); 1143 1144 return ret; 1145 } 1146 1147 static int _tegra_dp_clk_recovery(struct tegra_dp_priv *dp, u32 pe[4], 1148 u32 vs[4], u32 pc[4], u8 pc_supported, 1149 u32 n_lanes, 1150 const struct tegra_dp_link_config *cfg) 1151 { 1152 u32 vs_temp[4]; 1153 u32 retry_cnt = 0; 1154 1155 do { 1156 tegra_dp_lt_config(dp, pe, vs, pc, cfg); 1157 tegra_dp_wait_aux_training(dp, true, cfg); 1158 1159 if (tegra_dp_clock_recovery_status(dp, cfg)) 1160 return 0; 1161 1162 memcpy(vs_temp, vs, sizeof(vs_temp)); 1163 tegra_dp_lt_adjust(dp, pe, vs, pc, pc_supported, cfg); 1164 1165 if (memcmp(vs_temp, vs, sizeof(vs_temp))) 1166 retry_cnt = 0; 1167 else 1168 ++retry_cnt; 1169 } while (retry_cnt < 5); 1170 1171 return -EIO; 1172 } 1173 1174 static int tegra_dp_clk_recovery(struct tegra_dp_priv *dp, u32 pe[4], 1175 u32 vs[4], u32 pc[4], 1176 const struct tegra_dp_link_config *cfg) 1177 { 1178 u32 n_lanes = cfg->lane_count; 1179 u8 pc_supported = cfg->tps3_supported; 1180 int err; 1181 1182 tegra_dp_tpg(dp, training_pattern_1, n_lanes, cfg); 1183 1184 err = _tegra_dp_clk_recovery(dp, pe, vs, pc, pc_supported, n_lanes, 1185 cfg); 1186 if (err < 0) 1187 tegra_dp_tpg(dp, training_pattern_disabled, n_lanes, cfg); 1188 1189 return err; 1190 } 1191 1192 static int tegra_dc_dp_full_link_training(struct tegra_dp_priv *dp, 1193 const struct display_timing *timing, 1194 struct tegra_dp_link_config *cfg) 1195 { 1196 struct udevice *sor = dp->sor; 1197 int err; 1198 u32 pe[4], vs[4], pc[4]; 1199 1200 tegra_sor_precharge_lanes(sor, cfg); 1201 1202 retry_cr: 1203 memset(pe, PREEMPHASIS_DISABLED, sizeof(pe)); 1204 memset(vs, DRIVECURRENT_LEVEL0, sizeof(vs)); 1205 memset(pc, POSTCURSOR2_LEVEL0, sizeof(pc)); 1206 1207 err = tegra_dp_clk_recovery(dp, pe, vs, pc, cfg); 1208 if (err) { 1209 if (!tegra_dp_lower_link_config(dp, timing, cfg)) 1210 goto retry_cr; 1211 1212 debug("dp: clk recovery failed\n"); 1213 goto fail; 1214 } 1215 1216 err = tegra_dp_channel_eq(dp, pe, vs, pc, cfg); 1217 if (err) { 1218 if (!tegra_dp_lower_link_config(dp, timing, cfg)) 1219 goto retry_cr; 1220 1221 debug("dp: channel equalization failed\n"); 1222 goto fail; 1223 } 1224 #ifdef DEBUG 1225 tegra_dc_dp_dump_link_cfg(dp, cfg); 1226 #endif 1227 return 0; 1228 1229 fail: 1230 return err; 1231 } 1232 1233 /* 1234 * All link training functions are ported from kernel dc driver. 1235 * See more details at drivers/video/tegra/dc/dp.c 1236 */ 1237 static int tegra_dc_dp_fast_link_training(struct tegra_dp_priv *dp, 1238 const struct tegra_dp_link_config *link_cfg, 1239 struct udevice *sor) 1240 { 1241 u8 link_bw; 1242 u8 lane_count; 1243 u16 data16; 1244 u32 data32; 1245 u32 size; 1246 u32 status; 1247 int j; 1248 u32 mask = 0xffff >> ((4 - link_cfg->lane_count) * 4); 1249 1250 tegra_dc_sor_set_lane_parm(sor, link_cfg); 1251 tegra_dc_dp_dpcd_write(dp, DP_MAIN_LINK_CHANNEL_CODING_SET, 1252 DP_SET_ANSI_8B10B); 1253 1254 /* Send TP1 */ 1255 tegra_dc_sor_set_dp_linkctl(sor, 1, training_pattern_1, link_cfg); 1256 tegra_dc_dp_dpcd_write(dp, DP_TRAINING_PATTERN_SET, 1257 DP_TRAINING_PATTERN_1); 1258 1259 for (j = 0; j < link_cfg->lane_count; ++j) 1260 tegra_dc_dp_dpcd_write(dp, DP_TRAINING_LANE0_SET + j, 0x24); 1261 udelay(520); 1262 1263 size = sizeof(data16); 1264 tegra_dc_dpaux_read(dp, DPAUX_DP_AUXCTL_CMD_AUXRD, 1265 DP_LANE0_1_STATUS, (u8 *)&data16, &size, &status); 1266 status = mask & 0x1111; 1267 if ((data16 & status) != status) { 1268 debug("dp: Link training error for TP1 (%#x, status %#x)\n", 1269 data16, status); 1270 return -EFAULT; 1271 } 1272 1273 /* enable ASSR */ 1274 tegra_dc_dp_set_assr(dp, sor, link_cfg->scramble_ena); 1275 tegra_dc_sor_set_dp_linkctl(sor, 1, training_pattern_3, link_cfg); 1276 1277 tegra_dc_dp_dpcd_write(dp, DP_TRAINING_PATTERN_SET, 1278 link_cfg->link_bw == 20 ? 0x23 : 0x22); 1279 for (j = 0; j < link_cfg->lane_count; ++j) 1280 tegra_dc_dp_dpcd_write(dp, DP_TRAINING_LANE0_SET + j, 0x24); 1281 udelay(520); 1282 1283 size = sizeof(data32); 1284 tegra_dc_dpaux_read(dp, DPAUX_DP_AUXCTL_CMD_AUXRD, DP_LANE0_1_STATUS, 1285 (u8 *)&data32, &size, &status); 1286 if ((data32 & mask) != (0x7777 & mask)) { 1287 debug("dp: Link training error for TP2/3 (0x%x)\n", data32); 1288 return -EFAULT; 1289 } 1290 1291 tegra_dc_sor_set_dp_linkctl(sor, 1, training_pattern_disabled, 1292 link_cfg); 1293 tegra_dc_dp_dpcd_write(dp, DP_TRAINING_PATTERN_SET, 0); 1294 1295 if (tegra_dc_dp_link_trained(dp, link_cfg)) { 1296 tegra_dc_sor_read_link_config(sor, &link_bw, &lane_count); 1297 debug("Fast link training failed, link bw %d, lane # %d\n", 1298 link_bw, lane_count); 1299 return -EFAULT; 1300 } 1301 1302 debug("Fast link training succeeded, link bw %d, lane %d\n", 1303 link_cfg->link_bw, link_cfg->lane_count); 1304 1305 return 0; 1306 } 1307 1308 static int tegra_dp_do_link_training(struct tegra_dp_priv *dp, 1309 struct tegra_dp_link_config *link_cfg, 1310 const struct display_timing *timing, 1311 struct udevice *sor) 1312 { 1313 u8 link_bw; 1314 u8 lane_count; 1315 int ret; 1316 1317 if (DO_FAST_LINK_TRAINING) { 1318 ret = tegra_dc_dp_fast_link_training(dp, link_cfg, sor); 1319 if (ret) { 1320 debug("dp: fast link training failed\n"); 1321 } else { 1322 /* 1323 * set to a known-good drive setting if fast link 1324 * succeeded. Ignore any error. 1325 */ 1326 ret = tegra_dc_sor_set_voltage_swing(dp->sor, link_cfg); 1327 if (ret) 1328 debug("Failed to set voltage swing\n"); 1329 } 1330 } else { 1331 ret = -ENOSYS; 1332 } 1333 if (ret) { 1334 /* Try full link training then */ 1335 ret = tegra_dc_dp_full_link_training(dp, timing, link_cfg); 1336 if (ret) { 1337 debug("dp: full link training failed\n"); 1338 return ret; 1339 } 1340 } 1341 1342 /* Everything is good; double check the link config */ 1343 tegra_dc_sor_read_link_config(sor, &link_bw, &lane_count); 1344 1345 if ((link_cfg->link_bw == link_bw) && 1346 (link_cfg->lane_count == lane_count)) 1347 return 0; 1348 else 1349 return -EFAULT; 1350 } 1351 1352 static int tegra_dc_dp_explore_link_cfg(struct tegra_dp_priv *dp, 1353 struct tegra_dp_link_config *link_cfg, 1354 struct udevice *sor, 1355 const struct display_timing *timing) 1356 { 1357 struct tegra_dp_link_config temp_cfg; 1358 1359 if (!timing->pixelclock.typ || !timing->hactive.typ || 1360 !timing->vactive.typ) { 1361 debug("dp: error mode configuration"); 1362 return -EINVAL; 1363 } 1364 if (!link_cfg->max_link_bw || !link_cfg->max_lane_count) { 1365 debug("dp: error link configuration"); 1366 return -EINVAL; 1367 } 1368 1369 link_cfg->is_valid = 0; 1370 1371 memcpy(&temp_cfg, link_cfg, sizeof(temp_cfg)); 1372 1373 temp_cfg.link_bw = temp_cfg.max_link_bw; 1374 temp_cfg.lane_count = temp_cfg.max_lane_count; 1375 1376 /* 1377 * set to max link config 1378 */ 1379 if ((!tegra_dc_dp_calc_config(dp, timing, &temp_cfg)) && 1380 (!tegra_dp_link_config(dp, &temp_cfg)) && 1381 (!tegra_dp_do_link_training(dp, &temp_cfg, timing, sor))) 1382 /* the max link cfg is doable */ 1383 memcpy(link_cfg, &temp_cfg, sizeof(temp_cfg)); 1384 1385 return link_cfg->is_valid ? 0 : -EFAULT; 1386 } 1387 1388 static int tegra_dp_hpd_plug(struct tegra_dp_priv *dp) 1389 { 1390 const int vdd_to_hpd_delay_ms = 200; 1391 u32 val; 1392 ulong start; 1393 1394 start = get_timer(0); 1395 do { 1396 val = tegra_dpaux_readl(dp, DPAUX_DP_AUXSTAT); 1397 if (val & DPAUX_DP_AUXSTAT_HPD_STATUS_PLUGGED) 1398 return 0; 1399 udelay(100); 1400 } while (get_timer(start) < vdd_to_hpd_delay_ms); 1401 1402 return -EIO; 1403 } 1404 1405 static int tegra_dc_dp_sink_out_of_sync(struct tegra_dp_priv *dp, u32 delay_ms) 1406 { 1407 u8 dpcd_data; 1408 int out_of_sync; 1409 int ret; 1410 1411 debug("%s: delay=%d\n", __func__, delay_ms); 1412 mdelay(delay_ms); 1413 ret = tegra_dc_dp_dpcd_read(dp, DP_SINK_STATUS, &dpcd_data); 1414 if (ret) 1415 return ret; 1416 1417 out_of_sync = !(dpcd_data & DP_SINK_STATUS_PORT0_IN_SYNC); 1418 if (out_of_sync) 1419 debug("SINK receive port 0 out of sync, data=%x\n", dpcd_data); 1420 else 1421 debug("SINK is in synchronization\n"); 1422 1423 return out_of_sync; 1424 } 1425 1426 static int tegra_dc_dp_check_sink(struct tegra_dp_priv *dp, 1427 struct tegra_dp_link_config *link_cfg, 1428 const struct display_timing *timing) 1429 { 1430 const int max_retry = 5; 1431 int delay_frame; 1432 int retries; 1433 1434 /* 1435 * DP TCON may skip some main stream frames, thus we need to wait 1436 * some delay before reading the DPCD SINK STATUS register, starting 1437 * from 5 1438 */ 1439 delay_frame = 5; 1440 1441 retries = max_retry; 1442 do { 1443 int ret; 1444 1445 if (!tegra_dc_dp_sink_out_of_sync(dp, link_cfg->frame_in_ms * 1446 delay_frame)) 1447 return 0; 1448 1449 debug("%s: retries left %d\n", __func__, retries); 1450 if (!retries--) { 1451 printf("DP: Out of sync after %d retries\n", max_retry); 1452 return -EIO; 1453 } 1454 ret = tegra_dc_sor_detach(dp->dc_dev, dp->sor); 1455 if (ret) 1456 return ret; 1457 if (tegra_dc_dp_explore_link_cfg(dp, link_cfg, dp->sor, 1458 timing)) { 1459 debug("dp: %s: error to configure link\n", __func__); 1460 continue; 1461 } 1462 1463 tegra_dc_sor_set_power_state(dp->sor, 1); 1464 tegra_dc_sor_attach(dp->dc_dev, dp->sor, link_cfg, timing); 1465 1466 /* Increase delay_frame for next try in case the sink is 1467 skipping more frames */ 1468 delay_frame += 10; 1469 } while (1); 1470 } 1471 1472 int tegra_dp_enable(struct udevice *dev, int panel_bpp, 1473 const struct display_timing *timing) 1474 { 1475 struct tegra_dp_priv *priv = dev_get_priv(dev); 1476 struct tegra_dp_link_config slink_cfg, *link_cfg = &slink_cfg; 1477 struct udevice *sor; 1478 int data; 1479 int retry; 1480 int ret; 1481 1482 memset(link_cfg, '\0', sizeof(*link_cfg)); 1483 link_cfg->is_valid = 0; 1484 link_cfg->scramble_ena = 1; 1485 1486 tegra_dc_dpaux_enable(priv); 1487 1488 if (tegra_dp_hpd_plug(priv) < 0) { 1489 debug("dp: hpd plug failed\n"); 1490 return -EIO; 1491 } 1492 1493 link_cfg->bits_per_pixel = panel_bpp; 1494 if (tegra_dc_dp_init_max_link_cfg(timing, priv, link_cfg)) { 1495 debug("dp: failed to init link configuration\n"); 1496 return -ENOLINK; 1497 } 1498 1499 ret = uclass_first_device(UCLASS_VIDEO_BRIDGE, &sor); 1500 if (ret || !sor) { 1501 debug("dp: failed to find SOR device: ret=%d\n", ret); 1502 return ret; 1503 } 1504 priv->sor = sor; 1505 ret = tegra_dc_sor_enable_dp(sor, link_cfg); 1506 if (ret) 1507 return ret; 1508 1509 tegra_dc_sor_set_panel_power(sor, 1); 1510 1511 /* Write power on to DPCD */ 1512 data = DP_SET_POWER_D0; 1513 retry = 0; 1514 do { 1515 ret = tegra_dc_dp_dpcd_write(priv, DP_SET_POWER, data); 1516 } while ((retry++ < DP_POWER_ON_MAX_TRIES) && ret); 1517 1518 if (ret || retry >= DP_POWER_ON_MAX_TRIES) { 1519 debug("dp: failed to power on panel (0x%x)\n", ret); 1520 return -ENETUNREACH; 1521 goto error_enable; 1522 } 1523 1524 /* Confirm DP plugging status */ 1525 if (!(tegra_dpaux_readl(priv, DPAUX_DP_AUXSTAT) & 1526 DPAUX_DP_AUXSTAT_HPD_STATUS_PLUGGED)) { 1527 debug("dp: could not detect HPD\n"); 1528 return -ENXIO; 1529 } 1530 1531 /* Check DP version */ 1532 if (tegra_dc_dp_dpcd_read(priv, DP_DPCD_REV, &priv->revision)) { 1533 debug("dp: failed to read the revision number from sink\n"); 1534 return -EIO; 1535 } 1536 1537 if (tegra_dc_dp_explore_link_cfg(priv, link_cfg, sor, timing)) { 1538 debug("dp: error configuring link\n"); 1539 return -ENOMEDIUM; 1540 } 1541 1542 tegra_dc_sor_set_power_state(sor, 1); 1543 ret = tegra_dc_sor_attach(priv->dc_dev, sor, link_cfg, timing); 1544 if (ret && ret != -EEXIST) 1545 return ret; 1546 1547 /* 1548 * This takes a long time, but can apparently resolve a failure to 1549 * bring up the display correctly. 1550 */ 1551 if (0) { 1552 ret = tegra_dc_dp_check_sink(priv, link_cfg, timing); 1553 if (ret) 1554 return ret; 1555 } 1556 1557 /* Power down the unused lanes to save power - a few hundred mW */ 1558 tegra_dc_sor_power_down_unused_lanes(sor, link_cfg); 1559 1560 ret = video_bridge_set_backlight(sor, 80); 1561 if (ret) { 1562 debug("dp: failed to set backlight\n"); 1563 return ret; 1564 } 1565 1566 priv->enabled = true; 1567 error_enable: 1568 return 0; 1569 } 1570 1571 static int tegra_dp_ofdata_to_platdata(struct udevice *dev) 1572 { 1573 struct tegra_dp_plat *plat = dev_get_platdata(dev); 1574 1575 plat->base = devfdt_get_addr(dev); 1576 1577 return 0; 1578 } 1579 1580 static int tegra_dp_read_edid(struct udevice *dev, u8 *buf, int buf_size) 1581 { 1582 struct tegra_dp_priv *priv = dev_get_priv(dev); 1583 const int tegra_edid_i2c_address = 0x50; 1584 u32 aux_stat = 0; 1585 1586 tegra_dc_dpaux_enable(priv); 1587 1588 return tegra_dc_i2c_aux_read(priv, tegra_edid_i2c_address, 0, buf, 1589 buf_size, &aux_stat); 1590 } 1591 1592 static const struct dm_display_ops dp_tegra_ops = { 1593 .read_edid = tegra_dp_read_edid, 1594 .enable = tegra_dp_enable, 1595 }; 1596 1597 static int dp_tegra_probe(struct udevice *dev) 1598 { 1599 struct tegra_dp_plat *plat = dev_get_platdata(dev); 1600 struct tegra_dp_priv *priv = dev_get_priv(dev); 1601 struct display_plat *disp_uc_plat = dev_get_uclass_platdata(dev); 1602 1603 priv->regs = (struct dpaux_ctlr *)plat->base; 1604 priv->enabled = false; 1605 1606 /* Remember the display controller that is sending us video */ 1607 priv->dc_dev = disp_uc_plat->src_dev; 1608 1609 return 0; 1610 } 1611 1612 static const struct udevice_id tegra_dp_ids[] = { 1613 { .compatible = "nvidia,tegra124-dpaux" }, 1614 { } 1615 }; 1616 1617 U_BOOT_DRIVER(dp_tegra) = { 1618 .name = "dpaux_tegra", 1619 .id = UCLASS_DISPLAY, 1620 .of_match = tegra_dp_ids, 1621 .ofdata_to_platdata = tegra_dp_ofdata_to_platdata, 1622 .probe = dp_tegra_probe, 1623 .ops = &dp_tegra_ops, 1624 .priv_auto_alloc_size = sizeof(struct tegra_dp_priv), 1625 .platdata_auto_alloc_size = sizeof(struct tegra_dp_plat), 1626 }; 1627