1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Cadence MHDP8546 DP bridge driver. 4 * 5 * Copyright (C) 2020 Cadence Design Systems, Inc. 6 * 7 * Authors: Quentin Schulz <quentin.schulz@free-electrons.com> 8 * Swapnil Jakhade <sjakhade@cadence.com> 9 * Yuti Amonkar <yamonkar@cadence.com> 10 * Tomi Valkeinen <tomi.valkeinen@ti.com> 11 * Jyri Sarha <jsarha@ti.com> 12 * 13 * TODO: 14 * - Implement optimized mailbox communication using mailbox interrupts 15 * - Add support for power management 16 * - Add support for features like audio, MST and fast link training 17 * - Implement request_fw_cancel to handle HW_STATE 18 * - Fix asynchronous loading of firmware implementation 19 * - Add DRM helper function for cdns_mhdp_lower_link_rate 20 */ 21 22 #include <linux/clk.h> 23 #include <linux/delay.h> 24 #include <linux/err.h> 25 #include <linux/firmware.h> 26 #include <linux/io.h> 27 #include <linux/iopoll.h> 28 #include <linux/irq.h> 29 #include <linux/module.h> 30 #include <linux/of.h> 31 #include <linux/of_device.h> 32 #include <linux/phy/phy.h> 33 #include <linux/phy/phy-dp.h> 34 #include <linux/platform_device.h> 35 #include <linux/slab.h> 36 #include <linux/wait.h> 37 38 #include <drm/drm_atomic.h> 39 #include <drm/drm_atomic_helper.h> 40 #include <drm/drm_atomic_state_helper.h> 41 #include <drm/drm_bridge.h> 42 #include <drm/drm_connector.h> 43 #include <drm/drm_crtc_helper.h> 44 #include <drm/drm_dp_helper.h> 45 #include <drm/drm_hdcp.h> 46 #include <drm/drm_modeset_helper_vtables.h> 47 #include <drm/drm_print.h> 48 #include <drm/drm_probe_helper.h> 49 50 #include <asm/unaligned.h> 51 52 #include "cdns-mhdp8546-core.h" 53 #include "cdns-mhdp8546-hdcp.h" 54 #include "cdns-mhdp8546-j721e.h" 55 56 static int cdns_mhdp_mailbox_read(struct cdns_mhdp_device *mhdp) 57 { 58 int ret, empty; 59 60 WARN_ON(!mutex_is_locked(&mhdp->mbox_mutex)); 61 62 ret = readx_poll_timeout(readl, mhdp->regs + CDNS_MAILBOX_EMPTY, 63 empty, !empty, MAILBOX_RETRY_US, 64 MAILBOX_TIMEOUT_US); 65 if (ret < 0) 66 return ret; 67 68 return readl(mhdp->regs + CDNS_MAILBOX_RX_DATA) & 0xff; 69 } 70 71 static int cdns_mhdp_mailbox_write(struct cdns_mhdp_device *mhdp, u8 val) 72 { 73 int ret, full; 74 75 WARN_ON(!mutex_is_locked(&mhdp->mbox_mutex)); 76 77 ret = readx_poll_timeout(readl, mhdp->regs + CDNS_MAILBOX_FULL, 78 full, !full, MAILBOX_RETRY_US, 79 MAILBOX_TIMEOUT_US); 80 if (ret < 0) 81 return ret; 82 83 writel(val, mhdp->regs + CDNS_MAILBOX_TX_DATA); 84 85 return 0; 86 } 87 88 static int cdns_mhdp_mailbox_recv_header(struct cdns_mhdp_device *mhdp, 89 u8 module_id, u8 opcode, 90 u16 req_size) 91 { 92 u32 mbox_size, i; 93 u8 header[4]; 94 int ret; 95 96 /* read the header of the message */ 97 for (i = 0; i < sizeof(header); i++) { 98 ret = cdns_mhdp_mailbox_read(mhdp); 99 if (ret < 0) 100 return ret; 101 102 header[i] = ret; 103 } 104 105 mbox_size = get_unaligned_be16(header + 2); 106 107 if (opcode != header[0] || module_id != header[1] || 108 req_size != mbox_size) { 109 /* 110 * If the message in mailbox is not what we want, we need to 111 * clear the mailbox by reading its contents. 112 */ 113 for (i = 0; i < mbox_size; i++) 114 if (cdns_mhdp_mailbox_read(mhdp) < 0) 115 break; 116 117 return -EINVAL; 118 } 119 120 return 0; 121 } 122 123 static int cdns_mhdp_mailbox_recv_data(struct cdns_mhdp_device *mhdp, 124 u8 *buff, u16 buff_size) 125 { 126 u32 i; 127 int ret; 128 129 for (i = 0; i < buff_size; i++) { 130 ret = cdns_mhdp_mailbox_read(mhdp); 131 if (ret < 0) 132 return ret; 133 134 buff[i] = ret; 135 } 136 137 return 0; 138 } 139 140 static int cdns_mhdp_mailbox_send(struct cdns_mhdp_device *mhdp, u8 module_id, 141 u8 opcode, u16 size, u8 *message) 142 { 143 u8 header[4]; 144 int ret, i; 145 146 header[0] = opcode; 147 header[1] = module_id; 148 put_unaligned_be16(size, header + 2); 149 150 for (i = 0; i < sizeof(header); i++) { 151 ret = cdns_mhdp_mailbox_write(mhdp, header[i]); 152 if (ret) 153 return ret; 154 } 155 156 for (i = 0; i < size; i++) { 157 ret = cdns_mhdp_mailbox_write(mhdp, message[i]); 158 if (ret) 159 return ret; 160 } 161 162 return 0; 163 } 164 165 static 166 int cdns_mhdp_reg_read(struct cdns_mhdp_device *mhdp, u32 addr, u32 *value) 167 { 168 u8 msg[4], resp[8]; 169 int ret; 170 171 put_unaligned_be32(addr, msg); 172 173 mutex_lock(&mhdp->mbox_mutex); 174 175 ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_GENERAL, 176 GENERAL_REGISTER_READ, 177 sizeof(msg), msg); 178 if (ret) 179 goto out; 180 181 ret = cdns_mhdp_mailbox_recv_header(mhdp, MB_MODULE_ID_GENERAL, 182 GENERAL_REGISTER_READ, 183 sizeof(resp)); 184 if (ret) 185 goto out; 186 187 ret = cdns_mhdp_mailbox_recv_data(mhdp, resp, sizeof(resp)); 188 if (ret) 189 goto out; 190 191 /* Returned address value should be the same as requested */ 192 if (memcmp(msg, resp, sizeof(msg))) { 193 ret = -EINVAL; 194 goto out; 195 } 196 197 *value = get_unaligned_be32(resp + 4); 198 199 out: 200 mutex_unlock(&mhdp->mbox_mutex); 201 if (ret) { 202 dev_err(mhdp->dev, "Failed to read register\n"); 203 *value = 0; 204 } 205 206 return ret; 207 } 208 209 static 210 int cdns_mhdp_reg_write(struct cdns_mhdp_device *mhdp, u16 addr, u32 val) 211 { 212 u8 msg[6]; 213 int ret; 214 215 put_unaligned_be16(addr, msg); 216 put_unaligned_be32(val, msg + 2); 217 218 mutex_lock(&mhdp->mbox_mutex); 219 220 ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, 221 DPTX_WRITE_REGISTER, sizeof(msg), msg); 222 223 mutex_unlock(&mhdp->mbox_mutex); 224 225 return ret; 226 } 227 228 static 229 int cdns_mhdp_reg_write_bit(struct cdns_mhdp_device *mhdp, u16 addr, 230 u8 start_bit, u8 bits_no, u32 val) 231 { 232 u8 field[8]; 233 int ret; 234 235 put_unaligned_be16(addr, field); 236 field[2] = start_bit; 237 field[3] = bits_no; 238 put_unaligned_be32(val, field + 4); 239 240 mutex_lock(&mhdp->mbox_mutex); 241 242 ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, 243 DPTX_WRITE_FIELD, sizeof(field), field); 244 245 mutex_unlock(&mhdp->mbox_mutex); 246 247 return ret; 248 } 249 250 static 251 int cdns_mhdp_dpcd_read(struct cdns_mhdp_device *mhdp, 252 u32 addr, u8 *data, u16 len) 253 { 254 u8 msg[5], reg[5]; 255 int ret; 256 257 put_unaligned_be16(len, msg); 258 put_unaligned_be24(addr, msg + 2); 259 260 mutex_lock(&mhdp->mbox_mutex); 261 262 ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, 263 DPTX_READ_DPCD, sizeof(msg), msg); 264 if (ret) 265 goto out; 266 267 ret = cdns_mhdp_mailbox_recv_header(mhdp, MB_MODULE_ID_DP_TX, 268 DPTX_READ_DPCD, 269 sizeof(reg) + len); 270 if (ret) 271 goto out; 272 273 ret = cdns_mhdp_mailbox_recv_data(mhdp, reg, sizeof(reg)); 274 if (ret) 275 goto out; 276 277 ret = cdns_mhdp_mailbox_recv_data(mhdp, data, len); 278 279 out: 280 mutex_unlock(&mhdp->mbox_mutex); 281 282 return ret; 283 } 284 285 static 286 int cdns_mhdp_dpcd_write(struct cdns_mhdp_device *mhdp, u32 addr, u8 value) 287 { 288 u8 msg[6], reg[5]; 289 int ret; 290 291 put_unaligned_be16(1, msg); 292 put_unaligned_be24(addr, msg + 2); 293 msg[5] = value; 294 295 mutex_lock(&mhdp->mbox_mutex); 296 297 ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, 298 DPTX_WRITE_DPCD, sizeof(msg), msg); 299 if (ret) 300 goto out; 301 302 ret = cdns_mhdp_mailbox_recv_header(mhdp, MB_MODULE_ID_DP_TX, 303 DPTX_WRITE_DPCD, sizeof(reg)); 304 if (ret) 305 goto out; 306 307 ret = cdns_mhdp_mailbox_recv_data(mhdp, reg, sizeof(reg)); 308 if (ret) 309 goto out; 310 311 if (addr != get_unaligned_be24(reg + 2)) 312 ret = -EINVAL; 313 314 out: 315 mutex_unlock(&mhdp->mbox_mutex); 316 317 if (ret) 318 dev_err(mhdp->dev, "dpcd write failed: %d\n", ret); 319 return ret; 320 } 321 322 static 323 int cdns_mhdp_set_firmware_active(struct cdns_mhdp_device *mhdp, bool enable) 324 { 325 u8 msg[5]; 326 int ret, i; 327 328 msg[0] = GENERAL_MAIN_CONTROL; 329 msg[1] = MB_MODULE_ID_GENERAL; 330 msg[2] = 0; 331 msg[3] = 1; 332 msg[4] = enable ? FW_ACTIVE : FW_STANDBY; 333 334 mutex_lock(&mhdp->mbox_mutex); 335 336 for (i = 0; i < sizeof(msg); i++) { 337 ret = cdns_mhdp_mailbox_write(mhdp, msg[i]); 338 if (ret) 339 goto out; 340 } 341 342 /* read the firmware state */ 343 ret = cdns_mhdp_mailbox_recv_data(mhdp, msg, sizeof(msg)); 344 if (ret) 345 goto out; 346 347 ret = 0; 348 349 out: 350 mutex_unlock(&mhdp->mbox_mutex); 351 352 if (ret < 0) 353 dev_err(mhdp->dev, "set firmware active failed\n"); 354 return ret; 355 } 356 357 static 358 int cdns_mhdp_get_hpd_status(struct cdns_mhdp_device *mhdp) 359 { 360 u8 status; 361 int ret; 362 363 mutex_lock(&mhdp->mbox_mutex); 364 365 ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, 366 DPTX_HPD_STATE, 0, NULL); 367 if (ret) 368 goto err_get_hpd; 369 370 ret = cdns_mhdp_mailbox_recv_header(mhdp, MB_MODULE_ID_DP_TX, 371 DPTX_HPD_STATE, 372 sizeof(status)); 373 if (ret) 374 goto err_get_hpd; 375 376 ret = cdns_mhdp_mailbox_recv_data(mhdp, &status, sizeof(status)); 377 if (ret) 378 goto err_get_hpd; 379 380 mutex_unlock(&mhdp->mbox_mutex); 381 382 dev_dbg(mhdp->dev, "%s: HPD %splugged\n", __func__, 383 status ? "" : "un"); 384 385 return status; 386 387 err_get_hpd: 388 mutex_unlock(&mhdp->mbox_mutex); 389 390 return ret; 391 } 392 393 static 394 int cdns_mhdp_get_edid_block(void *data, u8 *edid, 395 unsigned int block, size_t length) 396 { 397 struct cdns_mhdp_device *mhdp = data; 398 u8 msg[2], reg[2], i; 399 int ret; 400 401 mutex_lock(&mhdp->mbox_mutex); 402 403 for (i = 0; i < 4; i++) { 404 msg[0] = block / 2; 405 msg[1] = block % 2; 406 407 ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, 408 DPTX_GET_EDID, sizeof(msg), msg); 409 if (ret) 410 continue; 411 412 ret = cdns_mhdp_mailbox_recv_header(mhdp, MB_MODULE_ID_DP_TX, 413 DPTX_GET_EDID, 414 sizeof(reg) + length); 415 if (ret) 416 continue; 417 418 ret = cdns_mhdp_mailbox_recv_data(mhdp, reg, sizeof(reg)); 419 if (ret) 420 continue; 421 422 ret = cdns_mhdp_mailbox_recv_data(mhdp, edid, length); 423 if (ret) 424 continue; 425 426 if (reg[0] == length && reg[1] == block / 2) 427 break; 428 } 429 430 mutex_unlock(&mhdp->mbox_mutex); 431 432 if (ret) 433 dev_err(mhdp->dev, "get block[%d] edid failed: %d\n", 434 block, ret); 435 436 return ret; 437 } 438 439 static 440 int cdns_mhdp_read_hpd_event(struct cdns_mhdp_device *mhdp) 441 { 442 u8 event = 0; 443 int ret; 444 445 mutex_lock(&mhdp->mbox_mutex); 446 447 ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, 448 DPTX_READ_EVENT, 0, NULL); 449 if (ret) 450 goto out; 451 452 ret = cdns_mhdp_mailbox_recv_header(mhdp, MB_MODULE_ID_DP_TX, 453 DPTX_READ_EVENT, sizeof(event)); 454 if (ret < 0) 455 goto out; 456 457 ret = cdns_mhdp_mailbox_recv_data(mhdp, &event, sizeof(event)); 458 out: 459 mutex_unlock(&mhdp->mbox_mutex); 460 461 if (ret < 0) 462 return ret; 463 464 dev_dbg(mhdp->dev, "%s: %s%s%s%s\n", __func__, 465 (event & DPTX_READ_EVENT_HPD_TO_HIGH) ? "TO_HIGH " : "", 466 (event & DPTX_READ_EVENT_HPD_TO_LOW) ? "TO_LOW " : "", 467 (event & DPTX_READ_EVENT_HPD_PULSE) ? "PULSE " : "", 468 (event & DPTX_READ_EVENT_HPD_STATE) ? "HPD_STATE " : ""); 469 470 return event; 471 } 472 473 static 474 int cdns_mhdp_adjust_lt(struct cdns_mhdp_device *mhdp, unsigned int nlanes, 475 unsigned int udelay, const u8 *lanes_data, 476 u8 link_status[DP_LINK_STATUS_SIZE]) 477 { 478 u8 payload[7]; 479 u8 hdr[5]; /* For DPCD read response header */ 480 u32 addr; 481 int ret; 482 483 if (nlanes != 4 && nlanes != 2 && nlanes != 1) { 484 dev_err(mhdp->dev, "invalid number of lanes: %u\n", nlanes); 485 ret = -EINVAL; 486 goto out; 487 } 488 489 payload[0] = nlanes; 490 put_unaligned_be16(udelay, payload + 1); 491 memcpy(payload + 3, lanes_data, nlanes); 492 493 mutex_lock(&mhdp->mbox_mutex); 494 495 ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, 496 DPTX_ADJUST_LT, 497 sizeof(payload), payload); 498 if (ret) 499 goto out; 500 501 /* Yes, read the DPCD read command response */ 502 ret = cdns_mhdp_mailbox_recv_header(mhdp, MB_MODULE_ID_DP_TX, 503 DPTX_READ_DPCD, 504 sizeof(hdr) + DP_LINK_STATUS_SIZE); 505 if (ret) 506 goto out; 507 508 ret = cdns_mhdp_mailbox_recv_data(mhdp, hdr, sizeof(hdr)); 509 if (ret) 510 goto out; 511 512 addr = get_unaligned_be24(hdr + 2); 513 if (addr != DP_LANE0_1_STATUS) 514 goto out; 515 516 ret = cdns_mhdp_mailbox_recv_data(mhdp, link_status, 517 DP_LINK_STATUS_SIZE); 518 519 out: 520 mutex_unlock(&mhdp->mbox_mutex); 521 522 if (ret) 523 dev_err(mhdp->dev, "Failed to adjust Link Training.\n"); 524 525 return ret; 526 } 527 528 /** 529 * cdns_mhdp_link_power_up() - power up a DisplayPort link 530 * @aux: DisplayPort AUX channel 531 * @link: pointer to a structure containing the link configuration 532 * 533 * Returns 0 on success or a negative error code on failure. 534 */ 535 static 536 int cdns_mhdp_link_power_up(struct drm_dp_aux *aux, struct cdns_mhdp_link *link) 537 { 538 u8 value; 539 int err; 540 541 /* DP_SET_POWER register is only available on DPCD v1.1 and later */ 542 if (link->revision < 0x11) 543 return 0; 544 545 err = drm_dp_dpcd_readb(aux, DP_SET_POWER, &value); 546 if (err < 0) 547 return err; 548 549 value &= ~DP_SET_POWER_MASK; 550 value |= DP_SET_POWER_D0; 551 552 err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value); 553 if (err < 0) 554 return err; 555 556 /* 557 * According to the DP 1.1 specification, a "Sink Device must exit the 558 * power saving state within 1 ms" (Section 2.5.3.1, Table 5-52, "Sink 559 * Control Field" (register 0x600). 560 */ 561 usleep_range(1000, 2000); 562 563 return 0; 564 } 565 566 /** 567 * cdns_mhdp_link_power_down() - power down a DisplayPort link 568 * @aux: DisplayPort AUX channel 569 * @link: pointer to a structure containing the link configuration 570 * 571 * Returns 0 on success or a negative error code on failure. 572 */ 573 static 574 int cdns_mhdp_link_power_down(struct drm_dp_aux *aux, 575 struct cdns_mhdp_link *link) 576 { 577 u8 value; 578 int err; 579 580 /* DP_SET_POWER register is only available on DPCD v1.1 and later */ 581 if (link->revision < 0x11) 582 return 0; 583 584 err = drm_dp_dpcd_readb(aux, DP_SET_POWER, &value); 585 if (err < 0) 586 return err; 587 588 value &= ~DP_SET_POWER_MASK; 589 value |= DP_SET_POWER_D3; 590 591 err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value); 592 if (err < 0) 593 return err; 594 595 return 0; 596 } 597 598 /** 599 * cdns_mhdp_link_configure() - configure a DisplayPort link 600 * @aux: DisplayPort AUX channel 601 * @link: pointer to a structure containing the link configuration 602 * 603 * Returns 0 on success or a negative error code on failure. 604 */ 605 static 606 int cdns_mhdp_link_configure(struct drm_dp_aux *aux, 607 struct cdns_mhdp_link *link) 608 { 609 u8 values[2]; 610 int err; 611 612 values[0] = drm_dp_link_rate_to_bw_code(link->rate); 613 values[1] = link->num_lanes; 614 615 if (link->capabilities & DP_LINK_CAP_ENHANCED_FRAMING) 616 values[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN; 617 618 err = drm_dp_dpcd_write(aux, DP_LINK_BW_SET, values, sizeof(values)); 619 if (err < 0) 620 return err; 621 622 return 0; 623 } 624 625 static unsigned int cdns_mhdp_max_link_rate(struct cdns_mhdp_device *mhdp) 626 { 627 return min(mhdp->host.link_rate, mhdp->sink.link_rate); 628 } 629 630 static u8 cdns_mhdp_max_num_lanes(struct cdns_mhdp_device *mhdp) 631 { 632 return min(mhdp->sink.lanes_cnt, mhdp->host.lanes_cnt); 633 } 634 635 static u8 cdns_mhdp_eq_training_pattern_supported(struct cdns_mhdp_device *mhdp) 636 { 637 return fls(mhdp->host.pattern_supp & mhdp->sink.pattern_supp); 638 } 639 640 static bool cdns_mhdp_get_ssc_supported(struct cdns_mhdp_device *mhdp) 641 { 642 /* Check if SSC is supported by both sides */ 643 return mhdp->host.ssc && mhdp->sink.ssc; 644 } 645 646 static enum drm_connector_status cdns_mhdp_detect(struct cdns_mhdp_device *mhdp) 647 { 648 dev_dbg(mhdp->dev, "%s: %d\n", __func__, mhdp->plugged); 649 650 if (mhdp->plugged) 651 return connector_status_connected; 652 else 653 return connector_status_disconnected; 654 } 655 656 static int cdns_mhdp_check_fw_version(struct cdns_mhdp_device *mhdp) 657 { 658 u32 major_num, minor_num, revision; 659 u32 fw_ver, lib_ver; 660 661 fw_ver = (readl(mhdp->regs + CDNS_VER_H) << 8) 662 | readl(mhdp->regs + CDNS_VER_L); 663 664 lib_ver = (readl(mhdp->regs + CDNS_LIB_H_ADDR) << 8) 665 | readl(mhdp->regs + CDNS_LIB_L_ADDR); 666 667 if (lib_ver < 33984) { 668 /* 669 * Older FW versions with major number 1, used to store FW 670 * version information by storing repository revision number 671 * in registers. This is for identifying these FW versions. 672 */ 673 major_num = 1; 674 minor_num = 2; 675 if (fw_ver == 26098) { 676 revision = 15; 677 } else if (lib_ver == 0 && fw_ver == 0) { 678 revision = 17; 679 } else { 680 dev_err(mhdp->dev, "Unsupported FW version: fw_ver = %u, lib_ver = %u\n", 681 fw_ver, lib_ver); 682 return -ENODEV; 683 } 684 } else { 685 /* To identify newer FW versions with major number 2 onwards. */ 686 major_num = fw_ver / 10000; 687 minor_num = (fw_ver / 100) % 100; 688 revision = (fw_ver % 10000) % 100; 689 } 690 691 dev_dbg(mhdp->dev, "FW version: v%u.%u.%u\n", major_num, minor_num, 692 revision); 693 return 0; 694 } 695 696 static int cdns_mhdp_fw_activate(const struct firmware *fw, 697 struct cdns_mhdp_device *mhdp) 698 { 699 unsigned int reg; 700 int ret; 701 702 /* Release uCPU reset and stall it. */ 703 writel(CDNS_CPU_STALL, mhdp->regs + CDNS_APB_CTRL); 704 705 memcpy_toio(mhdp->regs + CDNS_MHDP_IMEM, fw->data, fw->size); 706 707 /* Leave debug mode, release stall */ 708 writel(0, mhdp->regs + CDNS_APB_CTRL); 709 710 /* 711 * Wait for the KEEP_ALIVE "message" on the first 8 bits. 712 * Updated each sched "tick" (~2ms) 713 */ 714 ret = readl_poll_timeout(mhdp->regs + CDNS_KEEP_ALIVE, reg, 715 reg & CDNS_KEEP_ALIVE_MASK, 500, 716 CDNS_KEEP_ALIVE_TIMEOUT); 717 if (ret) { 718 dev_err(mhdp->dev, 719 "device didn't give any life sign: reg %d\n", reg); 720 return ret; 721 } 722 723 ret = cdns_mhdp_check_fw_version(mhdp); 724 if (ret) 725 return ret; 726 727 /* Init events to 0 as it's not cleared by FW at boot but on read */ 728 readl(mhdp->regs + CDNS_SW_EVENT0); 729 readl(mhdp->regs + CDNS_SW_EVENT1); 730 readl(mhdp->regs + CDNS_SW_EVENT2); 731 readl(mhdp->regs + CDNS_SW_EVENT3); 732 733 /* Activate uCPU */ 734 ret = cdns_mhdp_set_firmware_active(mhdp, true); 735 if (ret) 736 return ret; 737 738 spin_lock(&mhdp->start_lock); 739 740 mhdp->hw_state = MHDP_HW_READY; 741 742 /* 743 * Here we must keep the lock while enabling the interrupts 744 * since it would otherwise be possible that interrupt enable 745 * code is executed after the bridge is detached. The similar 746 * situation is not possible in attach()/detach() callbacks 747 * since the hw_state changes from MHDP_HW_READY to 748 * MHDP_HW_STOPPED happens only due to driver removal when 749 * bridge should already be detached. 750 */ 751 if (mhdp->bridge_attached) 752 writel(~(u32)CDNS_APB_INT_MASK_SW_EVENT_INT, 753 mhdp->regs + CDNS_APB_INT_MASK); 754 755 spin_unlock(&mhdp->start_lock); 756 757 wake_up(&mhdp->fw_load_wq); 758 dev_dbg(mhdp->dev, "DP FW activated\n"); 759 760 return 0; 761 } 762 763 static void cdns_mhdp_fw_cb(const struct firmware *fw, void *context) 764 { 765 struct cdns_mhdp_device *mhdp = context; 766 bool bridge_attached; 767 int ret; 768 769 dev_dbg(mhdp->dev, "firmware callback\n"); 770 771 if (!fw || !fw->data) { 772 dev_err(mhdp->dev, "%s: No firmware.\n", __func__); 773 return; 774 } 775 776 ret = cdns_mhdp_fw_activate(fw, mhdp); 777 778 release_firmware(fw); 779 780 if (ret) 781 return; 782 783 /* 784 * XXX how to make sure the bridge is still attached when 785 * calling drm_kms_helper_hotplug_event() after releasing 786 * the lock? We should not hold the spin lock when 787 * calling drm_kms_helper_hotplug_event() since it may 788 * cause a dead lock. FB-dev console calls detect from the 789 * same thread just down the call stack started here. 790 */ 791 spin_lock(&mhdp->start_lock); 792 bridge_attached = mhdp->bridge_attached; 793 spin_unlock(&mhdp->start_lock); 794 if (bridge_attached) { 795 if (mhdp->connector.dev) 796 drm_kms_helper_hotplug_event(mhdp->bridge.dev); 797 else 798 drm_bridge_hpd_notify(&mhdp->bridge, cdns_mhdp_detect(mhdp)); 799 } 800 } 801 802 static int cdns_mhdp_load_firmware(struct cdns_mhdp_device *mhdp) 803 { 804 int ret; 805 806 ret = request_firmware_nowait(THIS_MODULE, true, FW_NAME, mhdp->dev, 807 GFP_KERNEL, mhdp, cdns_mhdp_fw_cb); 808 if (ret) { 809 dev_err(mhdp->dev, "failed to load firmware (%s), ret: %d\n", 810 FW_NAME, ret); 811 return ret; 812 } 813 814 return 0; 815 } 816 817 static ssize_t cdns_mhdp_transfer(struct drm_dp_aux *aux, 818 struct drm_dp_aux_msg *msg) 819 { 820 struct cdns_mhdp_device *mhdp = dev_get_drvdata(aux->dev); 821 int ret; 822 823 if (msg->request != DP_AUX_NATIVE_WRITE && 824 msg->request != DP_AUX_NATIVE_READ) 825 return -EOPNOTSUPP; 826 827 if (msg->request == DP_AUX_NATIVE_WRITE) { 828 const u8 *buf = msg->buffer; 829 unsigned int i; 830 831 for (i = 0; i < msg->size; ++i) { 832 ret = cdns_mhdp_dpcd_write(mhdp, 833 msg->address + i, buf[i]); 834 if (!ret) 835 continue; 836 837 dev_err(mhdp->dev, 838 "Failed to write DPCD addr %u\n", 839 msg->address + i); 840 841 return ret; 842 } 843 } else { 844 ret = cdns_mhdp_dpcd_read(mhdp, msg->address, 845 msg->buffer, msg->size); 846 if (ret) { 847 dev_err(mhdp->dev, 848 "Failed to read DPCD addr %u\n", 849 msg->address); 850 851 return ret; 852 } 853 } 854 855 return msg->size; 856 } 857 858 static int cdns_mhdp_link_training_init(struct cdns_mhdp_device *mhdp) 859 { 860 union phy_configure_opts phy_cfg; 861 u32 reg32; 862 int ret; 863 864 drm_dp_dpcd_writeb(&mhdp->aux, DP_TRAINING_PATTERN_SET, 865 DP_TRAINING_PATTERN_DISABLE); 866 867 /* Reset PHY configuration */ 868 reg32 = CDNS_PHY_COMMON_CONFIG | CDNS_PHY_TRAINING_TYPE(1); 869 if (!mhdp->host.scrambler) 870 reg32 |= CDNS_PHY_SCRAMBLER_BYPASS; 871 872 cdns_mhdp_reg_write(mhdp, CDNS_DPTX_PHY_CONFIG, reg32); 873 874 cdns_mhdp_reg_write(mhdp, CDNS_DP_ENHNCD, 875 mhdp->sink.enhanced & mhdp->host.enhanced); 876 877 cdns_mhdp_reg_write(mhdp, CDNS_DP_LANE_EN, 878 CDNS_DP_LANE_EN_LANES(mhdp->link.num_lanes)); 879 880 cdns_mhdp_link_configure(&mhdp->aux, &mhdp->link); 881 phy_cfg.dp.link_rate = mhdp->link.rate / 100; 882 phy_cfg.dp.lanes = mhdp->link.num_lanes; 883 884 memset(phy_cfg.dp.voltage, 0, sizeof(phy_cfg.dp.voltage)); 885 memset(phy_cfg.dp.pre, 0, sizeof(phy_cfg.dp.pre)); 886 887 phy_cfg.dp.ssc = cdns_mhdp_get_ssc_supported(mhdp); 888 phy_cfg.dp.set_lanes = true; 889 phy_cfg.dp.set_rate = true; 890 phy_cfg.dp.set_voltages = true; 891 ret = phy_configure(mhdp->phy, &phy_cfg); 892 if (ret) { 893 dev_err(mhdp->dev, "%s: phy_configure() failed: %d\n", 894 __func__, ret); 895 return ret; 896 } 897 898 cdns_mhdp_reg_write(mhdp, CDNS_DPTX_PHY_CONFIG, 899 CDNS_PHY_COMMON_CONFIG | 900 CDNS_PHY_TRAINING_EN | 901 CDNS_PHY_TRAINING_TYPE(1) | 902 CDNS_PHY_SCRAMBLER_BYPASS); 903 904 drm_dp_dpcd_writeb(&mhdp->aux, DP_TRAINING_PATTERN_SET, 905 DP_TRAINING_PATTERN_1 | DP_LINK_SCRAMBLING_DISABLE); 906 907 return 0; 908 } 909 910 static void cdns_mhdp_get_adjust_train(struct cdns_mhdp_device *mhdp, 911 u8 link_status[DP_LINK_STATUS_SIZE], 912 u8 lanes_data[CDNS_DP_MAX_NUM_LANES], 913 union phy_configure_opts *phy_cfg) 914 { 915 u8 adjust, max_pre_emph, max_volt_swing; 916 u8 set_volt, set_pre; 917 unsigned int i; 918 919 max_pre_emph = CDNS_PRE_EMPHASIS(mhdp->host.pre_emphasis) 920 << DP_TRAIN_PRE_EMPHASIS_SHIFT; 921 max_volt_swing = CDNS_VOLT_SWING(mhdp->host.volt_swing); 922 923 for (i = 0; i < mhdp->link.num_lanes; i++) { 924 /* Check if Voltage swing and pre-emphasis are within limits */ 925 adjust = drm_dp_get_adjust_request_voltage(link_status, i); 926 set_volt = min(adjust, max_volt_swing); 927 928 adjust = drm_dp_get_adjust_request_pre_emphasis(link_status, i); 929 set_pre = min(adjust, max_pre_emph) 930 >> DP_TRAIN_PRE_EMPHASIS_SHIFT; 931 932 /* 933 * Voltage swing level and pre-emphasis level combination is 934 * not allowed: leaving pre-emphasis as-is, and adjusting 935 * voltage swing. 936 */ 937 if (set_volt + set_pre > 3) 938 set_volt = 3 - set_pre; 939 940 phy_cfg->dp.voltage[i] = set_volt; 941 lanes_data[i] = set_volt; 942 943 if (set_volt == max_volt_swing) 944 lanes_data[i] |= DP_TRAIN_MAX_SWING_REACHED; 945 946 phy_cfg->dp.pre[i] = set_pre; 947 lanes_data[i] |= (set_pre << DP_TRAIN_PRE_EMPHASIS_SHIFT); 948 949 if (set_pre == (max_pre_emph >> DP_TRAIN_PRE_EMPHASIS_SHIFT)) 950 lanes_data[i] |= DP_TRAIN_MAX_PRE_EMPHASIS_REACHED; 951 } 952 } 953 954 static 955 void cdns_mhdp_set_adjust_request_voltage(u8 link_status[DP_LINK_STATUS_SIZE], 956 unsigned int lane, u8 volt) 957 { 958 unsigned int s = ((lane & 1) ? 959 DP_ADJUST_VOLTAGE_SWING_LANE1_SHIFT : 960 DP_ADJUST_VOLTAGE_SWING_LANE0_SHIFT); 961 unsigned int idx = DP_ADJUST_REQUEST_LANE0_1 - DP_LANE0_1_STATUS + (lane >> 1); 962 963 link_status[idx] &= ~(DP_ADJUST_VOLTAGE_SWING_LANE0_MASK << s); 964 link_status[idx] |= volt << s; 965 } 966 967 static 968 void cdns_mhdp_set_adjust_request_pre_emphasis(u8 link_status[DP_LINK_STATUS_SIZE], 969 unsigned int lane, u8 pre_emphasis) 970 { 971 unsigned int s = ((lane & 1) ? 972 DP_ADJUST_PRE_EMPHASIS_LANE1_SHIFT : 973 DP_ADJUST_PRE_EMPHASIS_LANE0_SHIFT); 974 unsigned int idx = DP_ADJUST_REQUEST_LANE0_1 - DP_LANE0_1_STATUS + (lane >> 1); 975 976 link_status[idx] &= ~(DP_ADJUST_PRE_EMPHASIS_LANE0_MASK << s); 977 link_status[idx] |= pre_emphasis << s; 978 } 979 980 static void cdns_mhdp_adjust_requested_eq(struct cdns_mhdp_device *mhdp, 981 u8 link_status[DP_LINK_STATUS_SIZE]) 982 { 983 u8 max_pre = CDNS_PRE_EMPHASIS(mhdp->host.pre_emphasis); 984 u8 max_volt = CDNS_VOLT_SWING(mhdp->host.volt_swing); 985 unsigned int i; 986 u8 volt, pre; 987 988 for (i = 0; i < mhdp->link.num_lanes; i++) { 989 volt = drm_dp_get_adjust_request_voltage(link_status, i); 990 pre = drm_dp_get_adjust_request_pre_emphasis(link_status, i); 991 if (volt + pre > 3) 992 cdns_mhdp_set_adjust_request_voltage(link_status, i, 993 3 - pre); 994 if (mhdp->host.volt_swing & CDNS_FORCE_VOLT_SWING) 995 cdns_mhdp_set_adjust_request_voltage(link_status, i, 996 max_volt); 997 if (mhdp->host.pre_emphasis & CDNS_FORCE_PRE_EMPHASIS) 998 cdns_mhdp_set_adjust_request_pre_emphasis(link_status, 999 i, max_pre); 1000 } 1001 } 1002 1003 static void cdns_mhdp_print_lt_status(const char *prefix, 1004 struct cdns_mhdp_device *mhdp, 1005 union phy_configure_opts *phy_cfg) 1006 { 1007 char vs[8] = "0/0/0/0"; 1008 char pe[8] = "0/0/0/0"; 1009 unsigned int i; 1010 1011 for (i = 0; i < mhdp->link.num_lanes; i++) { 1012 vs[i * 2] = '0' + phy_cfg->dp.voltage[i]; 1013 pe[i * 2] = '0' + phy_cfg->dp.pre[i]; 1014 } 1015 1016 vs[i * 2 - 1] = '\0'; 1017 pe[i * 2 - 1] = '\0'; 1018 1019 dev_dbg(mhdp->dev, "%s, %u lanes, %u Mbps, vs %s, pe %s\n", 1020 prefix, 1021 mhdp->link.num_lanes, mhdp->link.rate / 100, 1022 vs, pe); 1023 } 1024 1025 static bool cdns_mhdp_link_training_channel_eq(struct cdns_mhdp_device *mhdp, 1026 u8 eq_tps, 1027 unsigned int training_interval) 1028 { 1029 u8 lanes_data[CDNS_DP_MAX_NUM_LANES], fail_counter_short = 0; 1030 u8 link_status[DP_LINK_STATUS_SIZE]; 1031 union phy_configure_opts phy_cfg; 1032 u32 reg32; 1033 int ret; 1034 bool r; 1035 1036 dev_dbg(mhdp->dev, "Starting EQ phase\n"); 1037 1038 /* Enable link training TPS[eq_tps] in PHY */ 1039 reg32 = CDNS_PHY_COMMON_CONFIG | CDNS_PHY_TRAINING_EN | 1040 CDNS_PHY_TRAINING_TYPE(eq_tps); 1041 if (eq_tps != 4) 1042 reg32 |= CDNS_PHY_SCRAMBLER_BYPASS; 1043 cdns_mhdp_reg_write(mhdp, CDNS_DPTX_PHY_CONFIG, reg32); 1044 1045 drm_dp_dpcd_writeb(&mhdp->aux, DP_TRAINING_PATTERN_SET, 1046 (eq_tps != 4) ? eq_tps | DP_LINK_SCRAMBLING_DISABLE : 1047 CDNS_DP_TRAINING_PATTERN_4); 1048 1049 drm_dp_dpcd_read_link_status(&mhdp->aux, link_status); 1050 1051 do { 1052 cdns_mhdp_get_adjust_train(mhdp, link_status, lanes_data, 1053 &phy_cfg); 1054 phy_cfg.dp.lanes = mhdp->link.num_lanes; 1055 phy_cfg.dp.ssc = cdns_mhdp_get_ssc_supported(mhdp); 1056 phy_cfg.dp.set_lanes = false; 1057 phy_cfg.dp.set_rate = false; 1058 phy_cfg.dp.set_voltages = true; 1059 ret = phy_configure(mhdp->phy, &phy_cfg); 1060 if (ret) { 1061 dev_err(mhdp->dev, "%s: phy_configure() failed: %d\n", 1062 __func__, ret); 1063 goto err; 1064 } 1065 1066 cdns_mhdp_adjust_lt(mhdp, mhdp->link.num_lanes, 1067 training_interval, lanes_data, link_status); 1068 1069 r = drm_dp_clock_recovery_ok(link_status, mhdp->link.num_lanes); 1070 if (!r) 1071 goto err; 1072 1073 if (drm_dp_channel_eq_ok(link_status, mhdp->link.num_lanes)) { 1074 cdns_mhdp_print_lt_status("EQ phase ok", mhdp, 1075 &phy_cfg); 1076 return true; 1077 } 1078 1079 fail_counter_short++; 1080 1081 cdns_mhdp_adjust_requested_eq(mhdp, link_status); 1082 } while (fail_counter_short < 5); 1083 1084 err: 1085 cdns_mhdp_print_lt_status("EQ phase failed", mhdp, &phy_cfg); 1086 1087 return false; 1088 } 1089 1090 static void cdns_mhdp_adjust_requested_cr(struct cdns_mhdp_device *mhdp, 1091 u8 link_status[DP_LINK_STATUS_SIZE], 1092 u8 *req_volt, u8 *req_pre) 1093 { 1094 const u8 max_volt = CDNS_VOLT_SWING(mhdp->host.volt_swing); 1095 const u8 max_pre = CDNS_PRE_EMPHASIS(mhdp->host.pre_emphasis); 1096 unsigned int i; 1097 1098 for (i = 0; i < mhdp->link.num_lanes; i++) { 1099 u8 val; 1100 1101 val = mhdp->host.volt_swing & CDNS_FORCE_VOLT_SWING ? 1102 max_volt : req_volt[i]; 1103 cdns_mhdp_set_adjust_request_voltage(link_status, i, val); 1104 1105 val = mhdp->host.pre_emphasis & CDNS_FORCE_PRE_EMPHASIS ? 1106 max_pre : req_pre[i]; 1107 cdns_mhdp_set_adjust_request_pre_emphasis(link_status, i, val); 1108 } 1109 } 1110 1111 static 1112 void cdns_mhdp_validate_cr(struct cdns_mhdp_device *mhdp, bool *cr_done, 1113 bool *same_before_adjust, bool *max_swing_reached, 1114 u8 before_cr[CDNS_DP_MAX_NUM_LANES], 1115 u8 after_cr[DP_LINK_STATUS_SIZE], u8 *req_volt, 1116 u8 *req_pre) 1117 { 1118 const u8 max_volt = CDNS_VOLT_SWING(mhdp->host.volt_swing); 1119 const u8 max_pre = CDNS_PRE_EMPHASIS(mhdp->host.pre_emphasis); 1120 bool same_pre, same_volt; 1121 unsigned int i; 1122 u8 adjust; 1123 1124 *same_before_adjust = false; 1125 *max_swing_reached = false; 1126 *cr_done = drm_dp_clock_recovery_ok(after_cr, mhdp->link.num_lanes); 1127 1128 for (i = 0; i < mhdp->link.num_lanes; i++) { 1129 adjust = drm_dp_get_adjust_request_voltage(after_cr, i); 1130 req_volt[i] = min(adjust, max_volt); 1131 1132 adjust = drm_dp_get_adjust_request_pre_emphasis(after_cr, i) >> 1133 DP_TRAIN_PRE_EMPHASIS_SHIFT; 1134 req_pre[i] = min(adjust, max_pre); 1135 1136 same_pre = (before_cr[i] & DP_TRAIN_PRE_EMPHASIS_MASK) == 1137 req_pre[i] << DP_TRAIN_PRE_EMPHASIS_SHIFT; 1138 same_volt = (before_cr[i] & DP_TRAIN_VOLTAGE_SWING_MASK) == 1139 req_volt[i]; 1140 if (same_pre && same_volt) 1141 *same_before_adjust = true; 1142 1143 /* 3.1.5.2 in DP Standard v1.4. Table 3-1 */ 1144 if (!*cr_done && req_volt[i] + req_pre[i] >= 3) { 1145 *max_swing_reached = true; 1146 return; 1147 } 1148 } 1149 } 1150 1151 static bool cdns_mhdp_link_training_cr(struct cdns_mhdp_device *mhdp) 1152 { 1153 u8 lanes_data[CDNS_DP_MAX_NUM_LANES], 1154 fail_counter_short = 0, fail_counter_cr_long = 0; 1155 u8 link_status[DP_LINK_STATUS_SIZE]; 1156 bool cr_done; 1157 union phy_configure_opts phy_cfg; 1158 int ret; 1159 1160 dev_dbg(mhdp->dev, "Starting CR phase\n"); 1161 1162 ret = cdns_mhdp_link_training_init(mhdp); 1163 if (ret) 1164 goto err; 1165 1166 drm_dp_dpcd_read_link_status(&mhdp->aux, link_status); 1167 1168 do { 1169 u8 requested_adjust_volt_swing[CDNS_DP_MAX_NUM_LANES] = {}; 1170 u8 requested_adjust_pre_emphasis[CDNS_DP_MAX_NUM_LANES] = {}; 1171 bool same_before_adjust, max_swing_reached; 1172 1173 cdns_mhdp_get_adjust_train(mhdp, link_status, lanes_data, 1174 &phy_cfg); 1175 phy_cfg.dp.lanes = mhdp->link.num_lanes; 1176 phy_cfg.dp.ssc = cdns_mhdp_get_ssc_supported(mhdp); 1177 phy_cfg.dp.set_lanes = false; 1178 phy_cfg.dp.set_rate = false; 1179 phy_cfg.dp.set_voltages = true; 1180 ret = phy_configure(mhdp->phy, &phy_cfg); 1181 if (ret) { 1182 dev_err(mhdp->dev, "%s: phy_configure() failed: %d\n", 1183 __func__, ret); 1184 goto err; 1185 } 1186 1187 cdns_mhdp_adjust_lt(mhdp, mhdp->link.num_lanes, 100, 1188 lanes_data, link_status); 1189 1190 cdns_mhdp_validate_cr(mhdp, &cr_done, &same_before_adjust, 1191 &max_swing_reached, lanes_data, 1192 link_status, 1193 requested_adjust_volt_swing, 1194 requested_adjust_pre_emphasis); 1195 1196 if (max_swing_reached) { 1197 dev_err(mhdp->dev, "CR: max swing reached\n"); 1198 goto err; 1199 } 1200 1201 if (cr_done) { 1202 cdns_mhdp_print_lt_status("CR phase ok", mhdp, 1203 &phy_cfg); 1204 return true; 1205 } 1206 1207 /* Not all CR_DONE bits set */ 1208 fail_counter_cr_long++; 1209 1210 if (same_before_adjust) { 1211 fail_counter_short++; 1212 continue; 1213 } 1214 1215 fail_counter_short = 0; 1216 /* 1217 * Voltage swing/pre-emphasis adjust requested 1218 * during CR phase 1219 */ 1220 cdns_mhdp_adjust_requested_cr(mhdp, link_status, 1221 requested_adjust_volt_swing, 1222 requested_adjust_pre_emphasis); 1223 } while (fail_counter_short < 5 && fail_counter_cr_long < 10); 1224 1225 err: 1226 cdns_mhdp_print_lt_status("CR phase failed", mhdp, &phy_cfg); 1227 1228 return false; 1229 } 1230 1231 static void cdns_mhdp_lower_link_rate(struct cdns_mhdp_link *link) 1232 { 1233 switch (drm_dp_link_rate_to_bw_code(link->rate)) { 1234 case DP_LINK_BW_2_7: 1235 link->rate = drm_dp_bw_code_to_link_rate(DP_LINK_BW_1_62); 1236 break; 1237 case DP_LINK_BW_5_4: 1238 link->rate = drm_dp_bw_code_to_link_rate(DP_LINK_BW_2_7); 1239 break; 1240 case DP_LINK_BW_8_1: 1241 link->rate = drm_dp_bw_code_to_link_rate(DP_LINK_BW_5_4); 1242 break; 1243 } 1244 } 1245 1246 static int cdns_mhdp_link_training(struct cdns_mhdp_device *mhdp, 1247 unsigned int training_interval) 1248 { 1249 u32 reg32; 1250 const u8 eq_tps = cdns_mhdp_eq_training_pattern_supported(mhdp); 1251 int ret; 1252 1253 while (1) { 1254 if (!cdns_mhdp_link_training_cr(mhdp)) { 1255 if (drm_dp_link_rate_to_bw_code(mhdp->link.rate) != 1256 DP_LINK_BW_1_62) { 1257 dev_dbg(mhdp->dev, 1258 "Reducing link rate during CR phase\n"); 1259 cdns_mhdp_lower_link_rate(&mhdp->link); 1260 1261 continue; 1262 } else if (mhdp->link.num_lanes > 1) { 1263 dev_dbg(mhdp->dev, 1264 "Reducing lanes number during CR phase\n"); 1265 mhdp->link.num_lanes >>= 1; 1266 mhdp->link.rate = cdns_mhdp_max_link_rate(mhdp); 1267 1268 continue; 1269 } 1270 1271 dev_err(mhdp->dev, 1272 "Link training failed during CR phase\n"); 1273 goto err; 1274 } 1275 1276 if (cdns_mhdp_link_training_channel_eq(mhdp, eq_tps, 1277 training_interval)) 1278 break; 1279 1280 if (mhdp->link.num_lanes > 1) { 1281 dev_dbg(mhdp->dev, 1282 "Reducing lanes number during EQ phase\n"); 1283 mhdp->link.num_lanes >>= 1; 1284 1285 continue; 1286 } else if (drm_dp_link_rate_to_bw_code(mhdp->link.rate) != 1287 DP_LINK_BW_1_62) { 1288 dev_dbg(mhdp->dev, 1289 "Reducing link rate during EQ phase\n"); 1290 cdns_mhdp_lower_link_rate(&mhdp->link); 1291 mhdp->link.num_lanes = cdns_mhdp_max_num_lanes(mhdp); 1292 1293 continue; 1294 } 1295 1296 dev_err(mhdp->dev, "Link training failed during EQ phase\n"); 1297 goto err; 1298 } 1299 1300 dev_dbg(mhdp->dev, "Link training ok. Lanes: %u, Rate %u Mbps\n", 1301 mhdp->link.num_lanes, mhdp->link.rate / 100); 1302 1303 drm_dp_dpcd_writeb(&mhdp->aux, DP_TRAINING_PATTERN_SET, 1304 mhdp->host.scrambler ? 0 : 1305 DP_LINK_SCRAMBLING_DISABLE); 1306 1307 ret = cdns_mhdp_reg_read(mhdp, CDNS_DP_FRAMER_GLOBAL_CONFIG, ®32); 1308 if (ret < 0) { 1309 dev_err(mhdp->dev, 1310 "Failed to read CDNS_DP_FRAMER_GLOBAL_CONFIG %d\n", 1311 ret); 1312 return ret; 1313 } 1314 reg32 &= ~GENMASK(1, 0); 1315 reg32 |= CDNS_DP_NUM_LANES(mhdp->link.num_lanes); 1316 reg32 |= CDNS_DP_WR_FAILING_EDGE_VSYNC; 1317 reg32 |= CDNS_DP_FRAMER_EN; 1318 cdns_mhdp_reg_write(mhdp, CDNS_DP_FRAMER_GLOBAL_CONFIG, reg32); 1319 1320 /* Reset PHY config */ 1321 reg32 = CDNS_PHY_COMMON_CONFIG | CDNS_PHY_TRAINING_TYPE(1); 1322 if (!mhdp->host.scrambler) 1323 reg32 |= CDNS_PHY_SCRAMBLER_BYPASS; 1324 cdns_mhdp_reg_write(mhdp, CDNS_DPTX_PHY_CONFIG, reg32); 1325 1326 return 0; 1327 err: 1328 /* Reset PHY config */ 1329 reg32 = CDNS_PHY_COMMON_CONFIG | CDNS_PHY_TRAINING_TYPE(1); 1330 if (!mhdp->host.scrambler) 1331 reg32 |= CDNS_PHY_SCRAMBLER_BYPASS; 1332 cdns_mhdp_reg_write(mhdp, CDNS_DPTX_PHY_CONFIG, reg32); 1333 1334 drm_dp_dpcd_writeb(&mhdp->aux, DP_TRAINING_PATTERN_SET, 1335 DP_TRAINING_PATTERN_DISABLE); 1336 1337 return -EIO; 1338 } 1339 1340 static u32 cdns_mhdp_get_training_interval_us(struct cdns_mhdp_device *mhdp, 1341 u32 interval) 1342 { 1343 if (interval == 0) 1344 return 400; 1345 if (interval < 5) 1346 return 4000 << (interval - 1); 1347 dev_err(mhdp->dev, 1348 "wrong training interval returned by DPCD: %d\n", interval); 1349 return 0; 1350 } 1351 1352 static void cdns_mhdp_fill_host_caps(struct cdns_mhdp_device *mhdp) 1353 { 1354 unsigned int link_rate; 1355 1356 /* Get source capabilities based on PHY attributes */ 1357 1358 mhdp->host.lanes_cnt = mhdp->phy->attrs.bus_width; 1359 if (!mhdp->host.lanes_cnt) 1360 mhdp->host.lanes_cnt = 4; 1361 1362 link_rate = mhdp->phy->attrs.max_link_rate; 1363 if (!link_rate) 1364 link_rate = drm_dp_bw_code_to_link_rate(DP_LINK_BW_8_1); 1365 else 1366 /* PHY uses Mb/s, DRM uses tens of kb/s. */ 1367 link_rate *= 100; 1368 1369 mhdp->host.link_rate = link_rate; 1370 mhdp->host.volt_swing = CDNS_VOLT_SWING(3); 1371 mhdp->host.pre_emphasis = CDNS_PRE_EMPHASIS(3); 1372 mhdp->host.pattern_supp = CDNS_SUPPORT_TPS(1) | 1373 CDNS_SUPPORT_TPS(2) | CDNS_SUPPORT_TPS(3) | 1374 CDNS_SUPPORT_TPS(4); 1375 mhdp->host.lane_mapping = CDNS_LANE_MAPPING_NORMAL; 1376 mhdp->host.fast_link = false; 1377 mhdp->host.enhanced = true; 1378 mhdp->host.scrambler = true; 1379 mhdp->host.ssc = false; 1380 } 1381 1382 static void cdns_mhdp_fill_sink_caps(struct cdns_mhdp_device *mhdp, 1383 u8 dpcd[DP_RECEIVER_CAP_SIZE]) 1384 { 1385 mhdp->sink.link_rate = mhdp->link.rate; 1386 mhdp->sink.lanes_cnt = mhdp->link.num_lanes; 1387 mhdp->sink.enhanced = !!(mhdp->link.capabilities & 1388 DP_LINK_CAP_ENHANCED_FRAMING); 1389 1390 /* Set SSC support */ 1391 mhdp->sink.ssc = !!(dpcd[DP_MAX_DOWNSPREAD] & 1392 DP_MAX_DOWNSPREAD_0_5); 1393 1394 /* Set TPS support */ 1395 mhdp->sink.pattern_supp = CDNS_SUPPORT_TPS(1) | CDNS_SUPPORT_TPS(2); 1396 if (drm_dp_tps3_supported(dpcd)) 1397 mhdp->sink.pattern_supp |= CDNS_SUPPORT_TPS(3); 1398 if (drm_dp_tps4_supported(dpcd)) 1399 mhdp->sink.pattern_supp |= CDNS_SUPPORT_TPS(4); 1400 1401 /* Set fast link support */ 1402 mhdp->sink.fast_link = !!(dpcd[DP_MAX_DOWNSPREAD] & 1403 DP_NO_AUX_HANDSHAKE_LINK_TRAINING); 1404 } 1405 1406 static int cdns_mhdp_link_up(struct cdns_mhdp_device *mhdp) 1407 { 1408 u8 dpcd[DP_RECEIVER_CAP_SIZE], amp[2]; 1409 u32 resp, interval, interval_us; 1410 u8 ext_cap_chk = 0; 1411 unsigned int addr; 1412 int err; 1413 1414 WARN_ON(!mutex_is_locked(&mhdp->link_mutex)); 1415 1416 drm_dp_dpcd_readb(&mhdp->aux, DP_TRAINING_AUX_RD_INTERVAL, 1417 &ext_cap_chk); 1418 1419 if (ext_cap_chk & DP_EXTENDED_RECEIVER_CAP_FIELD_PRESENT) 1420 addr = DP_DP13_DPCD_REV; 1421 else 1422 addr = DP_DPCD_REV; 1423 1424 err = drm_dp_dpcd_read(&mhdp->aux, addr, dpcd, DP_RECEIVER_CAP_SIZE); 1425 if (err < 0) { 1426 dev_err(mhdp->dev, "Failed to read receiver capabilities\n"); 1427 return err; 1428 } 1429 1430 mhdp->link.revision = dpcd[0]; 1431 mhdp->link.rate = drm_dp_bw_code_to_link_rate(dpcd[1]); 1432 mhdp->link.num_lanes = dpcd[2] & DP_MAX_LANE_COUNT_MASK; 1433 1434 if (dpcd[2] & DP_ENHANCED_FRAME_CAP) 1435 mhdp->link.capabilities |= DP_LINK_CAP_ENHANCED_FRAMING; 1436 1437 dev_dbg(mhdp->dev, "Set sink device power state via DPCD\n"); 1438 cdns_mhdp_link_power_up(&mhdp->aux, &mhdp->link); 1439 1440 cdns_mhdp_fill_sink_caps(mhdp, dpcd); 1441 1442 mhdp->link.rate = cdns_mhdp_max_link_rate(mhdp); 1443 mhdp->link.num_lanes = cdns_mhdp_max_num_lanes(mhdp); 1444 1445 /* Disable framer for link training */ 1446 err = cdns_mhdp_reg_read(mhdp, CDNS_DP_FRAMER_GLOBAL_CONFIG, &resp); 1447 if (err < 0) { 1448 dev_err(mhdp->dev, 1449 "Failed to read CDNS_DP_FRAMER_GLOBAL_CONFIG %d\n", 1450 err); 1451 return err; 1452 } 1453 1454 resp &= ~CDNS_DP_FRAMER_EN; 1455 cdns_mhdp_reg_write(mhdp, CDNS_DP_FRAMER_GLOBAL_CONFIG, resp); 1456 1457 /* Spread AMP if required, enable 8b/10b coding */ 1458 amp[0] = cdns_mhdp_get_ssc_supported(mhdp) ? DP_SPREAD_AMP_0_5 : 0; 1459 amp[1] = DP_SET_ANSI_8B10B; 1460 drm_dp_dpcd_write(&mhdp->aux, DP_DOWNSPREAD_CTRL, amp, 2); 1461 1462 if (mhdp->host.fast_link & mhdp->sink.fast_link) { 1463 dev_err(mhdp->dev, "fastlink not supported\n"); 1464 return -EOPNOTSUPP; 1465 } 1466 1467 interval = dpcd[DP_TRAINING_AUX_RD_INTERVAL] & DP_TRAINING_AUX_RD_MASK; 1468 interval_us = cdns_mhdp_get_training_interval_us(mhdp, interval); 1469 if (!interval_us || 1470 cdns_mhdp_link_training(mhdp, interval_us)) { 1471 dev_err(mhdp->dev, "Link training failed. Exiting.\n"); 1472 return -EIO; 1473 } 1474 1475 mhdp->link_up = true; 1476 1477 return 0; 1478 } 1479 1480 static void cdns_mhdp_link_down(struct cdns_mhdp_device *mhdp) 1481 { 1482 WARN_ON(!mutex_is_locked(&mhdp->link_mutex)); 1483 1484 if (mhdp->plugged) 1485 cdns_mhdp_link_power_down(&mhdp->aux, &mhdp->link); 1486 1487 mhdp->link_up = false; 1488 } 1489 1490 static struct edid *cdns_mhdp_get_edid(struct cdns_mhdp_device *mhdp, 1491 struct drm_connector *connector) 1492 { 1493 if (!mhdp->plugged) 1494 return NULL; 1495 1496 return drm_do_get_edid(connector, cdns_mhdp_get_edid_block, mhdp); 1497 } 1498 1499 static int cdns_mhdp_get_modes(struct drm_connector *connector) 1500 { 1501 struct cdns_mhdp_device *mhdp = connector_to_mhdp(connector); 1502 struct edid *edid; 1503 int num_modes; 1504 1505 if (!mhdp->plugged) 1506 return 0; 1507 1508 edid = cdns_mhdp_get_edid(mhdp, connector); 1509 if (!edid) { 1510 dev_err(mhdp->dev, "Failed to read EDID\n"); 1511 return 0; 1512 } 1513 1514 drm_connector_update_edid_property(connector, edid); 1515 num_modes = drm_add_edid_modes(connector, edid); 1516 kfree(edid); 1517 1518 /* 1519 * HACK: Warn about unsupported display formats until we deal 1520 * with them correctly. 1521 */ 1522 if (connector->display_info.color_formats && 1523 !(connector->display_info.color_formats & 1524 mhdp->display_fmt.color_format)) 1525 dev_warn(mhdp->dev, 1526 "%s: No supported color_format found (0x%08x)\n", 1527 __func__, connector->display_info.color_formats); 1528 1529 if (connector->display_info.bpc && 1530 connector->display_info.bpc < mhdp->display_fmt.bpc) 1531 dev_warn(mhdp->dev, "%s: Display bpc only %d < %d\n", 1532 __func__, connector->display_info.bpc, 1533 mhdp->display_fmt.bpc); 1534 1535 return num_modes; 1536 } 1537 1538 static int cdns_mhdp_connector_detect(struct drm_connector *conn, 1539 struct drm_modeset_acquire_ctx *ctx, 1540 bool force) 1541 { 1542 struct cdns_mhdp_device *mhdp = connector_to_mhdp(conn); 1543 1544 return cdns_mhdp_detect(mhdp); 1545 } 1546 1547 static u32 cdns_mhdp_get_bpp(struct cdns_mhdp_display_fmt *fmt) 1548 { 1549 u32 bpp; 1550 1551 if (fmt->y_only) 1552 return fmt->bpc; 1553 1554 switch (fmt->color_format) { 1555 case DRM_COLOR_FORMAT_RGB444: 1556 case DRM_COLOR_FORMAT_YCRCB444: 1557 bpp = fmt->bpc * 3; 1558 break; 1559 case DRM_COLOR_FORMAT_YCRCB422: 1560 bpp = fmt->bpc * 2; 1561 break; 1562 case DRM_COLOR_FORMAT_YCRCB420: 1563 bpp = fmt->bpc * 3 / 2; 1564 break; 1565 default: 1566 bpp = fmt->bpc * 3; 1567 WARN_ON(1); 1568 } 1569 return bpp; 1570 } 1571 1572 static 1573 bool cdns_mhdp_bandwidth_ok(struct cdns_mhdp_device *mhdp, 1574 const struct drm_display_mode *mode, 1575 unsigned int lanes, unsigned int rate) 1576 { 1577 u32 max_bw, req_bw, bpp; 1578 1579 /* 1580 * mode->clock is expressed in kHz. Multiplying by bpp and dividing by 8 1581 * we get the number of kB/s. DisplayPort applies a 8b-10b encoding, the 1582 * value thus equals the bandwidth in 10kb/s units, which matches the 1583 * units of the rate parameter. 1584 */ 1585 1586 bpp = cdns_mhdp_get_bpp(&mhdp->display_fmt); 1587 req_bw = mode->clock * bpp / 8; 1588 max_bw = lanes * rate; 1589 if (req_bw > max_bw) { 1590 dev_dbg(mhdp->dev, 1591 "Unsupported Mode: %s, Req BW: %u, Available Max BW:%u\n", 1592 mode->name, req_bw, max_bw); 1593 1594 return false; 1595 } 1596 1597 return true; 1598 } 1599 1600 static 1601 enum drm_mode_status cdns_mhdp_mode_valid(struct drm_connector *conn, 1602 struct drm_display_mode *mode) 1603 { 1604 struct cdns_mhdp_device *mhdp = connector_to_mhdp(conn); 1605 1606 mutex_lock(&mhdp->link_mutex); 1607 1608 if (!cdns_mhdp_bandwidth_ok(mhdp, mode, mhdp->link.num_lanes, 1609 mhdp->link.rate)) { 1610 mutex_unlock(&mhdp->link_mutex); 1611 return MODE_CLOCK_HIGH; 1612 } 1613 1614 mutex_unlock(&mhdp->link_mutex); 1615 return MODE_OK; 1616 } 1617 1618 static int cdns_mhdp_connector_atomic_check(struct drm_connector *conn, 1619 struct drm_atomic_state *state) 1620 { 1621 struct cdns_mhdp_device *mhdp = connector_to_mhdp(conn); 1622 struct drm_connector_state *old_state, *new_state; 1623 struct drm_crtc_state *crtc_state; 1624 u64 old_cp, new_cp; 1625 1626 if (!mhdp->hdcp_supported) 1627 return 0; 1628 1629 old_state = drm_atomic_get_old_connector_state(state, conn); 1630 new_state = drm_atomic_get_new_connector_state(state, conn); 1631 old_cp = old_state->content_protection; 1632 new_cp = new_state->content_protection; 1633 1634 if (old_state->hdcp_content_type != new_state->hdcp_content_type && 1635 new_cp != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) { 1636 new_state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED; 1637 goto mode_changed; 1638 } 1639 1640 if (!new_state->crtc) { 1641 if (old_cp == DRM_MODE_CONTENT_PROTECTION_ENABLED) 1642 new_state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED; 1643 return 0; 1644 } 1645 1646 if (old_cp == new_cp || 1647 (old_cp == DRM_MODE_CONTENT_PROTECTION_DESIRED && 1648 new_cp == DRM_MODE_CONTENT_PROTECTION_ENABLED)) 1649 return 0; 1650 1651 mode_changed: 1652 crtc_state = drm_atomic_get_new_crtc_state(state, new_state->crtc); 1653 crtc_state->mode_changed = true; 1654 1655 return 0; 1656 } 1657 1658 static const struct drm_connector_helper_funcs cdns_mhdp_conn_helper_funcs = { 1659 .detect_ctx = cdns_mhdp_connector_detect, 1660 .get_modes = cdns_mhdp_get_modes, 1661 .mode_valid = cdns_mhdp_mode_valid, 1662 .atomic_check = cdns_mhdp_connector_atomic_check, 1663 }; 1664 1665 static const struct drm_connector_funcs cdns_mhdp_conn_funcs = { 1666 .fill_modes = drm_helper_probe_single_connector_modes, 1667 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 1668 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 1669 .reset = drm_atomic_helper_connector_reset, 1670 .destroy = drm_connector_cleanup, 1671 }; 1672 1673 static int cdns_mhdp_connector_init(struct cdns_mhdp_device *mhdp) 1674 { 1675 u32 bus_format = MEDIA_BUS_FMT_RGB121212_1X36; 1676 struct drm_connector *conn = &mhdp->connector; 1677 struct drm_bridge *bridge = &mhdp->bridge; 1678 int ret; 1679 1680 if (!bridge->encoder) { 1681 dev_err(mhdp->dev, "Parent encoder object not found"); 1682 return -ENODEV; 1683 } 1684 1685 conn->polled = DRM_CONNECTOR_POLL_HPD; 1686 1687 ret = drm_connector_init(bridge->dev, conn, &cdns_mhdp_conn_funcs, 1688 DRM_MODE_CONNECTOR_DisplayPort); 1689 if (ret) { 1690 dev_err(mhdp->dev, "Failed to initialize connector with drm\n"); 1691 return ret; 1692 } 1693 1694 drm_connector_helper_add(conn, &cdns_mhdp_conn_helper_funcs); 1695 1696 ret = drm_display_info_set_bus_formats(&conn->display_info, 1697 &bus_format, 1); 1698 if (ret) 1699 return ret; 1700 1701 ret = drm_connector_attach_encoder(conn, bridge->encoder); 1702 if (ret) { 1703 dev_err(mhdp->dev, "Failed to attach connector to encoder\n"); 1704 return ret; 1705 } 1706 1707 if (mhdp->hdcp_supported) 1708 ret = drm_connector_attach_content_protection_property(conn, true); 1709 1710 return ret; 1711 } 1712 1713 static int cdns_mhdp_attach(struct drm_bridge *bridge, 1714 enum drm_bridge_attach_flags flags) 1715 { 1716 struct cdns_mhdp_device *mhdp = bridge_to_mhdp(bridge); 1717 bool hw_ready; 1718 int ret; 1719 1720 dev_dbg(mhdp->dev, "%s\n", __func__); 1721 1722 mhdp->aux.drm_dev = bridge->dev; 1723 ret = drm_dp_aux_register(&mhdp->aux); 1724 if (ret < 0) 1725 return ret; 1726 1727 if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) { 1728 ret = cdns_mhdp_connector_init(mhdp); 1729 if (ret) 1730 goto aux_unregister; 1731 } 1732 1733 spin_lock(&mhdp->start_lock); 1734 1735 mhdp->bridge_attached = true; 1736 hw_ready = mhdp->hw_state == MHDP_HW_READY; 1737 1738 spin_unlock(&mhdp->start_lock); 1739 1740 /* Enable SW event interrupts */ 1741 if (hw_ready) 1742 writel(~(u32)CDNS_APB_INT_MASK_SW_EVENT_INT, 1743 mhdp->regs + CDNS_APB_INT_MASK); 1744 1745 return 0; 1746 aux_unregister: 1747 drm_dp_aux_unregister(&mhdp->aux); 1748 return ret; 1749 } 1750 1751 static void cdns_mhdp_configure_video(struct cdns_mhdp_device *mhdp, 1752 const struct drm_display_mode *mode) 1753 { 1754 unsigned int dp_framer_sp = 0, msa_horizontal_1, 1755 msa_vertical_1, bnd_hsync2vsync, hsync2vsync_pol_ctrl, 1756 misc0 = 0, misc1 = 0, pxl_repr, 1757 front_porch, back_porch, msa_h0, msa_v0, hsync, vsync, 1758 dp_vertical_1; 1759 u8 stream_id = mhdp->stream_id; 1760 u32 bpp, bpc, pxlfmt, framer; 1761 int ret; 1762 1763 pxlfmt = mhdp->display_fmt.color_format; 1764 bpc = mhdp->display_fmt.bpc; 1765 1766 /* 1767 * If YCBCR supported and stream not SD, use ITU709 1768 * Need to handle ITU version with YCBCR420 when supported 1769 */ 1770 if ((pxlfmt == DRM_COLOR_FORMAT_YCRCB444 || 1771 pxlfmt == DRM_COLOR_FORMAT_YCRCB422) && mode->crtc_vdisplay >= 720) 1772 misc0 = DP_YCBCR_COEFFICIENTS_ITU709; 1773 1774 bpp = cdns_mhdp_get_bpp(&mhdp->display_fmt); 1775 1776 switch (pxlfmt) { 1777 case DRM_COLOR_FORMAT_RGB444: 1778 pxl_repr = CDNS_DP_FRAMER_RGB << CDNS_DP_FRAMER_PXL_FORMAT; 1779 misc0 |= DP_COLOR_FORMAT_RGB; 1780 break; 1781 case DRM_COLOR_FORMAT_YCRCB444: 1782 pxl_repr = CDNS_DP_FRAMER_YCBCR444 << CDNS_DP_FRAMER_PXL_FORMAT; 1783 misc0 |= DP_COLOR_FORMAT_YCbCr444 | DP_TEST_DYNAMIC_RANGE_CEA; 1784 break; 1785 case DRM_COLOR_FORMAT_YCRCB422: 1786 pxl_repr = CDNS_DP_FRAMER_YCBCR422 << CDNS_DP_FRAMER_PXL_FORMAT; 1787 misc0 |= DP_COLOR_FORMAT_YCbCr422 | DP_TEST_DYNAMIC_RANGE_CEA; 1788 break; 1789 case DRM_COLOR_FORMAT_YCRCB420: 1790 pxl_repr = CDNS_DP_FRAMER_YCBCR420 << CDNS_DP_FRAMER_PXL_FORMAT; 1791 break; 1792 default: 1793 pxl_repr = CDNS_DP_FRAMER_Y_ONLY << CDNS_DP_FRAMER_PXL_FORMAT; 1794 } 1795 1796 switch (bpc) { 1797 case 6: 1798 misc0 |= DP_TEST_BIT_DEPTH_6; 1799 pxl_repr |= CDNS_DP_FRAMER_6_BPC; 1800 break; 1801 case 8: 1802 misc0 |= DP_TEST_BIT_DEPTH_8; 1803 pxl_repr |= CDNS_DP_FRAMER_8_BPC; 1804 break; 1805 case 10: 1806 misc0 |= DP_TEST_BIT_DEPTH_10; 1807 pxl_repr |= CDNS_DP_FRAMER_10_BPC; 1808 break; 1809 case 12: 1810 misc0 |= DP_TEST_BIT_DEPTH_12; 1811 pxl_repr |= CDNS_DP_FRAMER_12_BPC; 1812 break; 1813 case 16: 1814 misc0 |= DP_TEST_BIT_DEPTH_16; 1815 pxl_repr |= CDNS_DP_FRAMER_16_BPC; 1816 break; 1817 } 1818 1819 bnd_hsync2vsync = CDNS_IP_BYPASS_V_INTERFACE; 1820 if (mode->flags & DRM_MODE_FLAG_INTERLACE) 1821 bnd_hsync2vsync |= CDNS_IP_DET_INTERLACE_FORMAT; 1822 1823 cdns_mhdp_reg_write(mhdp, CDNS_BND_HSYNC2VSYNC(stream_id), 1824 bnd_hsync2vsync); 1825 1826 hsync2vsync_pol_ctrl = 0; 1827 if (mode->flags & DRM_MODE_FLAG_NHSYNC) 1828 hsync2vsync_pol_ctrl |= CDNS_H2V_HSYNC_POL_ACTIVE_LOW; 1829 if (mode->flags & DRM_MODE_FLAG_NVSYNC) 1830 hsync2vsync_pol_ctrl |= CDNS_H2V_VSYNC_POL_ACTIVE_LOW; 1831 cdns_mhdp_reg_write(mhdp, CDNS_HSYNC2VSYNC_POL_CTRL(stream_id), 1832 hsync2vsync_pol_ctrl); 1833 1834 cdns_mhdp_reg_write(mhdp, CDNS_DP_FRAMER_PXL_REPR(stream_id), pxl_repr); 1835 1836 if (mode->flags & DRM_MODE_FLAG_INTERLACE) 1837 dp_framer_sp |= CDNS_DP_FRAMER_INTERLACE; 1838 if (mode->flags & DRM_MODE_FLAG_NHSYNC) 1839 dp_framer_sp |= CDNS_DP_FRAMER_HSYNC_POL_LOW; 1840 if (mode->flags & DRM_MODE_FLAG_NVSYNC) 1841 dp_framer_sp |= CDNS_DP_FRAMER_VSYNC_POL_LOW; 1842 cdns_mhdp_reg_write(mhdp, CDNS_DP_FRAMER_SP(stream_id), dp_framer_sp); 1843 1844 front_porch = mode->crtc_hsync_start - mode->crtc_hdisplay; 1845 back_porch = mode->crtc_htotal - mode->crtc_hsync_end; 1846 cdns_mhdp_reg_write(mhdp, CDNS_DP_FRONT_BACK_PORCH(stream_id), 1847 CDNS_DP_FRONT_PORCH(front_porch) | 1848 CDNS_DP_BACK_PORCH(back_porch)); 1849 1850 cdns_mhdp_reg_write(mhdp, CDNS_DP_BYTE_COUNT(stream_id), 1851 mode->crtc_hdisplay * bpp / 8); 1852 1853 msa_h0 = mode->crtc_htotal - mode->crtc_hsync_start; 1854 cdns_mhdp_reg_write(mhdp, CDNS_DP_MSA_HORIZONTAL_0(stream_id), 1855 CDNS_DP_MSAH0_H_TOTAL(mode->crtc_htotal) | 1856 CDNS_DP_MSAH0_HSYNC_START(msa_h0)); 1857 1858 hsync = mode->crtc_hsync_end - mode->crtc_hsync_start; 1859 msa_horizontal_1 = CDNS_DP_MSAH1_HSYNC_WIDTH(hsync) | 1860 CDNS_DP_MSAH1_HDISP_WIDTH(mode->crtc_hdisplay); 1861 if (mode->flags & DRM_MODE_FLAG_NHSYNC) 1862 msa_horizontal_1 |= CDNS_DP_MSAH1_HSYNC_POL_LOW; 1863 cdns_mhdp_reg_write(mhdp, CDNS_DP_MSA_HORIZONTAL_1(stream_id), 1864 msa_horizontal_1); 1865 1866 msa_v0 = mode->crtc_vtotal - mode->crtc_vsync_start; 1867 cdns_mhdp_reg_write(mhdp, CDNS_DP_MSA_VERTICAL_0(stream_id), 1868 CDNS_DP_MSAV0_V_TOTAL(mode->crtc_vtotal) | 1869 CDNS_DP_MSAV0_VSYNC_START(msa_v0)); 1870 1871 vsync = mode->crtc_vsync_end - mode->crtc_vsync_start; 1872 msa_vertical_1 = CDNS_DP_MSAV1_VSYNC_WIDTH(vsync) | 1873 CDNS_DP_MSAV1_VDISP_WIDTH(mode->crtc_vdisplay); 1874 if (mode->flags & DRM_MODE_FLAG_NVSYNC) 1875 msa_vertical_1 |= CDNS_DP_MSAV1_VSYNC_POL_LOW; 1876 cdns_mhdp_reg_write(mhdp, CDNS_DP_MSA_VERTICAL_1(stream_id), 1877 msa_vertical_1); 1878 1879 if ((mode->flags & DRM_MODE_FLAG_INTERLACE) && 1880 mode->crtc_vtotal % 2 == 0) 1881 misc1 = DP_TEST_INTERLACED; 1882 if (mhdp->display_fmt.y_only) 1883 misc1 |= CDNS_DP_TEST_COLOR_FORMAT_RAW_Y_ONLY; 1884 /* Use VSC SDP for Y420 */ 1885 if (pxlfmt == DRM_COLOR_FORMAT_YCRCB420) 1886 misc1 = CDNS_DP_TEST_VSC_SDP; 1887 1888 cdns_mhdp_reg_write(mhdp, CDNS_DP_MSA_MISC(stream_id), 1889 misc0 | (misc1 << 8)); 1890 1891 cdns_mhdp_reg_write(mhdp, CDNS_DP_HORIZONTAL(stream_id), 1892 CDNS_DP_H_HSYNC_WIDTH(hsync) | 1893 CDNS_DP_H_H_TOTAL(mode->crtc_hdisplay)); 1894 1895 cdns_mhdp_reg_write(mhdp, CDNS_DP_VERTICAL_0(stream_id), 1896 CDNS_DP_V0_VHEIGHT(mode->crtc_vdisplay) | 1897 CDNS_DP_V0_VSTART(msa_v0)); 1898 1899 dp_vertical_1 = CDNS_DP_V1_VTOTAL(mode->crtc_vtotal); 1900 if ((mode->flags & DRM_MODE_FLAG_INTERLACE) && 1901 mode->crtc_vtotal % 2 == 0) 1902 dp_vertical_1 |= CDNS_DP_V1_VTOTAL_EVEN; 1903 1904 cdns_mhdp_reg_write(mhdp, CDNS_DP_VERTICAL_1(stream_id), dp_vertical_1); 1905 1906 cdns_mhdp_reg_write_bit(mhdp, CDNS_DP_VB_ID(stream_id), 2, 1, 1907 (mode->flags & DRM_MODE_FLAG_INTERLACE) ? 1908 CDNS_DP_VB_ID_INTERLACED : 0); 1909 1910 ret = cdns_mhdp_reg_read(mhdp, CDNS_DP_FRAMER_GLOBAL_CONFIG, &framer); 1911 if (ret < 0) { 1912 dev_err(mhdp->dev, 1913 "Failed to read CDNS_DP_FRAMER_GLOBAL_CONFIG %d\n", 1914 ret); 1915 return; 1916 } 1917 framer |= CDNS_DP_FRAMER_EN; 1918 framer &= ~CDNS_DP_NO_VIDEO_MODE; 1919 cdns_mhdp_reg_write(mhdp, CDNS_DP_FRAMER_GLOBAL_CONFIG, framer); 1920 } 1921 1922 static void cdns_mhdp_sst_enable(struct cdns_mhdp_device *mhdp, 1923 const struct drm_display_mode *mode) 1924 { 1925 u32 rate, vs, required_bandwidth, available_bandwidth; 1926 s32 line_thresh1, line_thresh2, line_thresh = 0; 1927 int pxlclock = mode->crtc_clock; 1928 u32 tu_size = 64; 1929 u32 bpp; 1930 1931 /* Get rate in MSymbols per second per lane */ 1932 rate = mhdp->link.rate / 1000; 1933 1934 bpp = cdns_mhdp_get_bpp(&mhdp->display_fmt); 1935 1936 required_bandwidth = pxlclock * bpp / 8; 1937 available_bandwidth = mhdp->link.num_lanes * rate; 1938 1939 vs = tu_size * required_bandwidth / available_bandwidth; 1940 vs /= 1000; 1941 1942 if (vs == tu_size) 1943 vs = tu_size - 1; 1944 1945 line_thresh1 = ((vs + 1) << 5) * 8 / bpp; 1946 line_thresh2 = (pxlclock << 5) / 1000 / rate * (vs + 1) - (1 << 5); 1947 line_thresh = line_thresh1 - line_thresh2 / (s32)mhdp->link.num_lanes; 1948 line_thresh = (line_thresh >> 5) + 2; 1949 1950 mhdp->stream_id = 0; 1951 1952 cdns_mhdp_reg_write(mhdp, CDNS_DP_FRAMER_TU, 1953 CDNS_DP_FRAMER_TU_VS(vs) | 1954 CDNS_DP_FRAMER_TU_SIZE(tu_size) | 1955 CDNS_DP_FRAMER_TU_CNT_RST_EN); 1956 1957 cdns_mhdp_reg_write(mhdp, CDNS_DP_LINE_THRESH(0), 1958 line_thresh & GENMASK(5, 0)); 1959 1960 cdns_mhdp_reg_write(mhdp, CDNS_DP_STREAM_CONFIG_2(0), 1961 CDNS_DP_SC2_TU_VS_DIFF((tu_size - vs > 3) ? 1962 0 : tu_size - vs)); 1963 1964 cdns_mhdp_configure_video(mhdp, mode); 1965 } 1966 1967 static void cdns_mhdp_atomic_enable(struct drm_bridge *bridge, 1968 struct drm_bridge_state *bridge_state) 1969 { 1970 struct cdns_mhdp_device *mhdp = bridge_to_mhdp(bridge); 1971 struct drm_atomic_state *state = bridge_state->base.state; 1972 struct cdns_mhdp_bridge_state *mhdp_state; 1973 struct drm_crtc_state *crtc_state; 1974 struct drm_connector *connector; 1975 struct drm_connector_state *conn_state; 1976 struct drm_bridge_state *new_state; 1977 const struct drm_display_mode *mode; 1978 u32 resp; 1979 int ret; 1980 1981 dev_dbg(mhdp->dev, "bridge enable\n"); 1982 1983 mutex_lock(&mhdp->link_mutex); 1984 1985 if (mhdp->plugged && !mhdp->link_up) { 1986 ret = cdns_mhdp_link_up(mhdp); 1987 if (ret < 0) 1988 goto out; 1989 } 1990 1991 if (mhdp->info && mhdp->info->ops && mhdp->info->ops->enable) 1992 mhdp->info->ops->enable(mhdp); 1993 1994 /* Enable VIF clock for stream 0 */ 1995 ret = cdns_mhdp_reg_read(mhdp, CDNS_DPTX_CAR, &resp); 1996 if (ret < 0) { 1997 dev_err(mhdp->dev, "Failed to read CDNS_DPTX_CAR %d\n", ret); 1998 goto out; 1999 } 2000 2001 cdns_mhdp_reg_write(mhdp, CDNS_DPTX_CAR, 2002 resp | CDNS_VIF_CLK_EN | CDNS_VIF_CLK_RSTN); 2003 2004 connector = drm_atomic_get_new_connector_for_encoder(state, 2005 bridge->encoder); 2006 if (WARN_ON(!connector)) 2007 goto out; 2008 2009 conn_state = drm_atomic_get_new_connector_state(state, connector); 2010 if (WARN_ON(!conn_state)) 2011 goto out; 2012 2013 if (mhdp->hdcp_supported && 2014 mhdp->hw_state == MHDP_HW_READY && 2015 conn_state->content_protection == 2016 DRM_MODE_CONTENT_PROTECTION_DESIRED) { 2017 mutex_unlock(&mhdp->link_mutex); 2018 cdns_mhdp_hdcp_enable(mhdp, conn_state->hdcp_content_type); 2019 mutex_lock(&mhdp->link_mutex); 2020 } 2021 2022 crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc); 2023 if (WARN_ON(!crtc_state)) 2024 goto out; 2025 2026 mode = &crtc_state->adjusted_mode; 2027 2028 new_state = drm_atomic_get_new_bridge_state(state, bridge); 2029 if (WARN_ON(!new_state)) 2030 goto out; 2031 2032 if (!cdns_mhdp_bandwidth_ok(mhdp, mode, mhdp->link.num_lanes, 2033 mhdp->link.rate)) { 2034 ret = -EINVAL; 2035 goto out; 2036 } 2037 2038 cdns_mhdp_sst_enable(mhdp, mode); 2039 2040 mhdp_state = to_cdns_mhdp_bridge_state(new_state); 2041 2042 mhdp_state->current_mode = drm_mode_duplicate(bridge->dev, mode); 2043 drm_mode_set_name(mhdp_state->current_mode); 2044 2045 dev_dbg(mhdp->dev, "%s: Enabling mode %s\n", __func__, mode->name); 2046 2047 mhdp->bridge_enabled = true; 2048 2049 out: 2050 mutex_unlock(&mhdp->link_mutex); 2051 if (ret < 0) 2052 schedule_work(&mhdp->modeset_retry_work); 2053 } 2054 2055 static void cdns_mhdp_atomic_disable(struct drm_bridge *bridge, 2056 struct drm_bridge_state *bridge_state) 2057 { 2058 struct cdns_mhdp_device *mhdp = bridge_to_mhdp(bridge); 2059 u32 resp; 2060 2061 dev_dbg(mhdp->dev, "%s\n", __func__); 2062 2063 mutex_lock(&mhdp->link_mutex); 2064 2065 if (mhdp->hdcp_supported) 2066 cdns_mhdp_hdcp_disable(mhdp); 2067 2068 mhdp->bridge_enabled = false; 2069 cdns_mhdp_reg_read(mhdp, CDNS_DP_FRAMER_GLOBAL_CONFIG, &resp); 2070 resp &= ~CDNS_DP_FRAMER_EN; 2071 resp |= CDNS_DP_NO_VIDEO_MODE; 2072 cdns_mhdp_reg_write(mhdp, CDNS_DP_FRAMER_GLOBAL_CONFIG, resp); 2073 2074 cdns_mhdp_link_down(mhdp); 2075 2076 /* Disable VIF clock for stream 0 */ 2077 cdns_mhdp_reg_read(mhdp, CDNS_DPTX_CAR, &resp); 2078 cdns_mhdp_reg_write(mhdp, CDNS_DPTX_CAR, 2079 resp & ~(CDNS_VIF_CLK_EN | CDNS_VIF_CLK_RSTN)); 2080 2081 if (mhdp->info && mhdp->info->ops && mhdp->info->ops->disable) 2082 mhdp->info->ops->disable(mhdp); 2083 2084 mutex_unlock(&mhdp->link_mutex); 2085 } 2086 2087 static void cdns_mhdp_detach(struct drm_bridge *bridge) 2088 { 2089 struct cdns_mhdp_device *mhdp = bridge_to_mhdp(bridge); 2090 2091 dev_dbg(mhdp->dev, "%s\n", __func__); 2092 2093 drm_dp_aux_unregister(&mhdp->aux); 2094 2095 spin_lock(&mhdp->start_lock); 2096 2097 mhdp->bridge_attached = false; 2098 2099 spin_unlock(&mhdp->start_lock); 2100 2101 writel(~0, mhdp->regs + CDNS_APB_INT_MASK); 2102 } 2103 2104 static struct drm_bridge_state * 2105 cdns_mhdp_bridge_atomic_duplicate_state(struct drm_bridge *bridge) 2106 { 2107 struct cdns_mhdp_bridge_state *state; 2108 2109 state = kzalloc(sizeof(*state), GFP_KERNEL); 2110 if (!state) 2111 return NULL; 2112 2113 __drm_atomic_helper_bridge_duplicate_state(bridge, &state->base); 2114 2115 return &state->base; 2116 } 2117 2118 static void 2119 cdns_mhdp_bridge_atomic_destroy_state(struct drm_bridge *bridge, 2120 struct drm_bridge_state *state) 2121 { 2122 struct cdns_mhdp_bridge_state *cdns_mhdp_state; 2123 2124 cdns_mhdp_state = to_cdns_mhdp_bridge_state(state); 2125 2126 if (cdns_mhdp_state->current_mode) { 2127 drm_mode_destroy(bridge->dev, cdns_mhdp_state->current_mode); 2128 cdns_mhdp_state->current_mode = NULL; 2129 } 2130 2131 kfree(cdns_mhdp_state); 2132 } 2133 2134 static struct drm_bridge_state * 2135 cdns_mhdp_bridge_atomic_reset(struct drm_bridge *bridge) 2136 { 2137 struct cdns_mhdp_bridge_state *cdns_mhdp_state; 2138 2139 cdns_mhdp_state = kzalloc(sizeof(*cdns_mhdp_state), GFP_KERNEL); 2140 if (!cdns_mhdp_state) 2141 return NULL; 2142 2143 __drm_atomic_helper_bridge_reset(bridge, &cdns_mhdp_state->base); 2144 2145 return &cdns_mhdp_state->base; 2146 } 2147 2148 static int cdns_mhdp_atomic_check(struct drm_bridge *bridge, 2149 struct drm_bridge_state *bridge_state, 2150 struct drm_crtc_state *crtc_state, 2151 struct drm_connector_state *conn_state) 2152 { 2153 struct cdns_mhdp_device *mhdp = bridge_to_mhdp(bridge); 2154 const struct drm_display_mode *mode = &crtc_state->adjusted_mode; 2155 2156 mutex_lock(&mhdp->link_mutex); 2157 2158 if (!cdns_mhdp_bandwidth_ok(mhdp, mode, mhdp->link.num_lanes, 2159 mhdp->link.rate)) { 2160 dev_err(mhdp->dev, "%s: Not enough BW for %s (%u lanes at %u Mbps)\n", 2161 __func__, mode->name, mhdp->link.num_lanes, 2162 mhdp->link.rate / 100); 2163 mutex_unlock(&mhdp->link_mutex); 2164 return -EINVAL; 2165 } 2166 2167 mutex_unlock(&mhdp->link_mutex); 2168 return 0; 2169 } 2170 2171 static enum drm_connector_status cdns_mhdp_bridge_detect(struct drm_bridge *bridge) 2172 { 2173 struct cdns_mhdp_device *mhdp = bridge_to_mhdp(bridge); 2174 2175 return cdns_mhdp_detect(mhdp); 2176 } 2177 2178 static struct edid *cdns_mhdp_bridge_get_edid(struct drm_bridge *bridge, 2179 struct drm_connector *connector) 2180 { 2181 struct cdns_mhdp_device *mhdp = bridge_to_mhdp(bridge); 2182 2183 return cdns_mhdp_get_edid(mhdp, connector); 2184 } 2185 2186 static void cdns_mhdp_bridge_hpd_enable(struct drm_bridge *bridge) 2187 { 2188 struct cdns_mhdp_device *mhdp = bridge_to_mhdp(bridge); 2189 2190 /* Enable SW event interrupts */ 2191 if (mhdp->bridge_attached) 2192 writel(~(u32)CDNS_APB_INT_MASK_SW_EVENT_INT, 2193 mhdp->regs + CDNS_APB_INT_MASK); 2194 } 2195 2196 static void cdns_mhdp_bridge_hpd_disable(struct drm_bridge *bridge) 2197 { 2198 struct cdns_mhdp_device *mhdp = bridge_to_mhdp(bridge); 2199 2200 writel(CDNS_APB_INT_MASK_SW_EVENT_INT, mhdp->regs + CDNS_APB_INT_MASK); 2201 } 2202 2203 static const struct drm_bridge_funcs cdns_mhdp_bridge_funcs = { 2204 .atomic_enable = cdns_mhdp_atomic_enable, 2205 .atomic_disable = cdns_mhdp_atomic_disable, 2206 .atomic_check = cdns_mhdp_atomic_check, 2207 .attach = cdns_mhdp_attach, 2208 .detach = cdns_mhdp_detach, 2209 .atomic_duplicate_state = cdns_mhdp_bridge_atomic_duplicate_state, 2210 .atomic_destroy_state = cdns_mhdp_bridge_atomic_destroy_state, 2211 .atomic_reset = cdns_mhdp_bridge_atomic_reset, 2212 .detect = cdns_mhdp_bridge_detect, 2213 .get_edid = cdns_mhdp_bridge_get_edid, 2214 .hpd_enable = cdns_mhdp_bridge_hpd_enable, 2215 .hpd_disable = cdns_mhdp_bridge_hpd_disable, 2216 }; 2217 2218 static bool cdns_mhdp_detect_hpd(struct cdns_mhdp_device *mhdp, bool *hpd_pulse) 2219 { 2220 int hpd_event, hpd_status; 2221 2222 *hpd_pulse = false; 2223 2224 hpd_event = cdns_mhdp_read_hpd_event(mhdp); 2225 2226 /* Getting event bits failed, bail out */ 2227 if (hpd_event < 0) { 2228 dev_warn(mhdp->dev, "%s: read event failed: %d\n", 2229 __func__, hpd_event); 2230 return false; 2231 } 2232 2233 hpd_status = cdns_mhdp_get_hpd_status(mhdp); 2234 if (hpd_status < 0) { 2235 dev_warn(mhdp->dev, "%s: get hpd status failed: %d\n", 2236 __func__, hpd_status); 2237 return false; 2238 } 2239 2240 if (hpd_event & DPTX_READ_EVENT_HPD_PULSE) 2241 *hpd_pulse = true; 2242 2243 return !!hpd_status; 2244 } 2245 2246 static int cdns_mhdp_update_link_status(struct cdns_mhdp_device *mhdp) 2247 { 2248 struct cdns_mhdp_bridge_state *cdns_bridge_state; 2249 struct drm_display_mode *current_mode; 2250 bool old_plugged = mhdp->plugged; 2251 struct drm_bridge_state *state; 2252 u8 status[DP_LINK_STATUS_SIZE]; 2253 bool hpd_pulse; 2254 int ret = 0; 2255 2256 mutex_lock(&mhdp->link_mutex); 2257 2258 mhdp->plugged = cdns_mhdp_detect_hpd(mhdp, &hpd_pulse); 2259 2260 if (!mhdp->plugged) { 2261 cdns_mhdp_link_down(mhdp); 2262 mhdp->link.rate = mhdp->host.link_rate; 2263 mhdp->link.num_lanes = mhdp->host.lanes_cnt; 2264 goto out; 2265 } 2266 2267 /* 2268 * If we get a HPD pulse event and we were and still are connected, 2269 * check the link status. If link status is ok, there's nothing to do 2270 * as we don't handle DP interrupts. If link status is bad, continue 2271 * with full link setup. 2272 */ 2273 if (hpd_pulse && old_plugged == mhdp->plugged) { 2274 ret = drm_dp_dpcd_read_link_status(&mhdp->aux, status); 2275 2276 /* 2277 * If everything looks fine, just return, as we don't handle 2278 * DP IRQs. 2279 */ 2280 if (ret > 0 && 2281 drm_dp_channel_eq_ok(status, mhdp->link.num_lanes) && 2282 drm_dp_clock_recovery_ok(status, mhdp->link.num_lanes)) 2283 goto out; 2284 2285 /* If link is bad, mark link as down so that we do a new LT */ 2286 mhdp->link_up = false; 2287 } 2288 2289 if (!mhdp->link_up) { 2290 ret = cdns_mhdp_link_up(mhdp); 2291 if (ret < 0) 2292 goto out; 2293 } 2294 2295 if (mhdp->bridge_enabled) { 2296 state = drm_priv_to_bridge_state(mhdp->bridge.base.state); 2297 if (!state) { 2298 ret = -EINVAL; 2299 goto out; 2300 } 2301 2302 cdns_bridge_state = to_cdns_mhdp_bridge_state(state); 2303 if (!cdns_bridge_state) { 2304 ret = -EINVAL; 2305 goto out; 2306 } 2307 2308 current_mode = cdns_bridge_state->current_mode; 2309 if (!current_mode) { 2310 ret = -EINVAL; 2311 goto out; 2312 } 2313 2314 if (!cdns_mhdp_bandwidth_ok(mhdp, current_mode, mhdp->link.num_lanes, 2315 mhdp->link.rate)) { 2316 ret = -EINVAL; 2317 goto out; 2318 } 2319 2320 dev_dbg(mhdp->dev, "%s: Enabling mode %s\n", __func__, 2321 current_mode->name); 2322 2323 cdns_mhdp_sst_enable(mhdp, current_mode); 2324 } 2325 out: 2326 mutex_unlock(&mhdp->link_mutex); 2327 return ret; 2328 } 2329 2330 static void cdns_mhdp_modeset_retry_fn(struct work_struct *work) 2331 { 2332 struct cdns_mhdp_device *mhdp; 2333 struct drm_connector *conn; 2334 2335 mhdp = container_of(work, typeof(*mhdp), modeset_retry_work); 2336 2337 conn = &mhdp->connector; 2338 2339 /* Grab the locks before changing connector property */ 2340 mutex_lock(&conn->dev->mode_config.mutex); 2341 2342 /* 2343 * Set connector link status to BAD and send a Uevent to notify 2344 * userspace to do a modeset. 2345 */ 2346 drm_connector_set_link_status_property(conn, DRM_MODE_LINK_STATUS_BAD); 2347 mutex_unlock(&conn->dev->mode_config.mutex); 2348 2349 /* Send Hotplug uevent so userspace can reprobe */ 2350 drm_kms_helper_hotplug_event(mhdp->bridge.dev); 2351 } 2352 2353 static irqreturn_t cdns_mhdp_irq_handler(int irq, void *data) 2354 { 2355 struct cdns_mhdp_device *mhdp = data; 2356 u32 apb_stat, sw_ev0; 2357 bool bridge_attached; 2358 2359 apb_stat = readl(mhdp->regs + CDNS_APB_INT_STATUS); 2360 if (!(apb_stat & CDNS_APB_INT_MASK_SW_EVENT_INT)) 2361 return IRQ_NONE; 2362 2363 sw_ev0 = readl(mhdp->regs + CDNS_SW_EVENT0); 2364 2365 /* 2366 * Calling drm_kms_helper_hotplug_event() when not attached 2367 * to drm device causes an oops because the drm_bridge->dev 2368 * is NULL. See cdns_mhdp_fw_cb() comments for details about the 2369 * problems related drm_kms_helper_hotplug_event() call. 2370 */ 2371 spin_lock(&mhdp->start_lock); 2372 bridge_attached = mhdp->bridge_attached; 2373 spin_unlock(&mhdp->start_lock); 2374 2375 if (bridge_attached && (sw_ev0 & CDNS_DPTX_HPD)) { 2376 schedule_work(&mhdp->hpd_work); 2377 } 2378 2379 if (sw_ev0 & ~CDNS_DPTX_HPD) { 2380 mhdp->sw_events |= (sw_ev0 & ~CDNS_DPTX_HPD); 2381 wake_up(&mhdp->sw_events_wq); 2382 } 2383 2384 return IRQ_HANDLED; 2385 } 2386 2387 u32 cdns_mhdp_wait_for_sw_event(struct cdns_mhdp_device *mhdp, u32 event) 2388 { 2389 u32 ret; 2390 2391 ret = wait_event_timeout(mhdp->sw_events_wq, 2392 mhdp->sw_events & event, 2393 msecs_to_jiffies(500)); 2394 if (!ret) { 2395 dev_dbg(mhdp->dev, "SW event 0x%x timeout\n", event); 2396 goto sw_event_out; 2397 } 2398 2399 ret = mhdp->sw_events; 2400 mhdp->sw_events &= ~event; 2401 2402 sw_event_out: 2403 return ret; 2404 } 2405 2406 static void cdns_mhdp_hpd_work(struct work_struct *work) 2407 { 2408 struct cdns_mhdp_device *mhdp = container_of(work, 2409 struct cdns_mhdp_device, 2410 hpd_work); 2411 int ret; 2412 2413 ret = cdns_mhdp_update_link_status(mhdp); 2414 if (mhdp->connector.dev) { 2415 if (ret < 0) 2416 schedule_work(&mhdp->modeset_retry_work); 2417 else 2418 drm_kms_helper_hotplug_event(mhdp->bridge.dev); 2419 } else { 2420 drm_bridge_hpd_notify(&mhdp->bridge, cdns_mhdp_detect(mhdp)); 2421 } 2422 } 2423 2424 static int cdns_mhdp_probe(struct platform_device *pdev) 2425 { 2426 struct device *dev = &pdev->dev; 2427 struct cdns_mhdp_device *mhdp; 2428 unsigned long rate; 2429 struct clk *clk; 2430 int ret; 2431 int irq; 2432 2433 mhdp = devm_kzalloc(dev, sizeof(*mhdp), GFP_KERNEL); 2434 if (!mhdp) 2435 return -ENOMEM; 2436 2437 clk = devm_clk_get(dev, NULL); 2438 if (IS_ERR(clk)) { 2439 dev_err(dev, "couldn't get clk: %ld\n", PTR_ERR(clk)); 2440 return PTR_ERR(clk); 2441 } 2442 2443 mhdp->clk = clk; 2444 mhdp->dev = dev; 2445 mutex_init(&mhdp->mbox_mutex); 2446 mutex_init(&mhdp->link_mutex); 2447 spin_lock_init(&mhdp->start_lock); 2448 2449 drm_dp_aux_init(&mhdp->aux); 2450 mhdp->aux.dev = dev; 2451 mhdp->aux.transfer = cdns_mhdp_transfer; 2452 2453 mhdp->regs = devm_platform_ioremap_resource(pdev, 0); 2454 if (IS_ERR(mhdp->regs)) { 2455 dev_err(dev, "Failed to get memory resource\n"); 2456 return PTR_ERR(mhdp->regs); 2457 } 2458 2459 mhdp->sapb_regs = devm_platform_ioremap_resource_byname(pdev, "mhdptx-sapb"); 2460 if (IS_ERR(mhdp->sapb_regs)) { 2461 mhdp->hdcp_supported = false; 2462 dev_warn(dev, 2463 "Failed to get SAPB memory resource, HDCP not supported\n"); 2464 } else { 2465 mhdp->hdcp_supported = true; 2466 } 2467 2468 mhdp->phy = devm_of_phy_get_by_index(dev, pdev->dev.of_node, 0); 2469 if (IS_ERR(mhdp->phy)) { 2470 dev_err(dev, "no PHY configured\n"); 2471 return PTR_ERR(mhdp->phy); 2472 } 2473 2474 platform_set_drvdata(pdev, mhdp); 2475 2476 mhdp->info = of_device_get_match_data(dev); 2477 2478 clk_prepare_enable(clk); 2479 2480 pm_runtime_enable(dev); 2481 ret = pm_runtime_resume_and_get(dev); 2482 if (ret < 0) { 2483 dev_err(dev, "pm_runtime_resume_and_get failed\n"); 2484 pm_runtime_disable(dev); 2485 goto clk_disable; 2486 } 2487 2488 if (mhdp->info && mhdp->info->ops && mhdp->info->ops->init) { 2489 ret = mhdp->info->ops->init(mhdp); 2490 if (ret != 0) { 2491 dev_err(dev, "MHDP platform initialization failed: %d\n", 2492 ret); 2493 goto runtime_put; 2494 } 2495 } 2496 2497 rate = clk_get_rate(clk); 2498 writel(rate % 1000000, mhdp->regs + CDNS_SW_CLK_L); 2499 writel(rate / 1000000, mhdp->regs + CDNS_SW_CLK_H); 2500 2501 dev_dbg(dev, "func clk rate %lu Hz\n", rate); 2502 2503 writel(~0, mhdp->regs + CDNS_APB_INT_MASK); 2504 2505 irq = platform_get_irq(pdev, 0); 2506 ret = devm_request_threaded_irq(mhdp->dev, irq, NULL, 2507 cdns_mhdp_irq_handler, IRQF_ONESHOT, 2508 "mhdp8546", mhdp); 2509 if (ret) { 2510 dev_err(dev, "cannot install IRQ %d\n", irq); 2511 ret = -EIO; 2512 goto plat_fini; 2513 } 2514 2515 cdns_mhdp_fill_host_caps(mhdp); 2516 2517 /* Initialize link rate and num of lanes to host values */ 2518 mhdp->link.rate = mhdp->host.link_rate; 2519 mhdp->link.num_lanes = mhdp->host.lanes_cnt; 2520 2521 /* The only currently supported format */ 2522 mhdp->display_fmt.y_only = false; 2523 mhdp->display_fmt.color_format = DRM_COLOR_FORMAT_RGB444; 2524 mhdp->display_fmt.bpc = 8; 2525 2526 mhdp->bridge.of_node = pdev->dev.of_node; 2527 mhdp->bridge.funcs = &cdns_mhdp_bridge_funcs; 2528 mhdp->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | 2529 DRM_BRIDGE_OP_HPD; 2530 mhdp->bridge.type = DRM_MODE_CONNECTOR_DisplayPort; 2531 if (mhdp->info) 2532 mhdp->bridge.timings = mhdp->info->timings; 2533 2534 ret = phy_init(mhdp->phy); 2535 if (ret) { 2536 dev_err(mhdp->dev, "Failed to initialize PHY: %d\n", ret); 2537 goto plat_fini; 2538 } 2539 2540 /* Initialize the work for modeset in case of link train failure */ 2541 INIT_WORK(&mhdp->modeset_retry_work, cdns_mhdp_modeset_retry_fn); 2542 INIT_WORK(&mhdp->hpd_work, cdns_mhdp_hpd_work); 2543 2544 init_waitqueue_head(&mhdp->fw_load_wq); 2545 init_waitqueue_head(&mhdp->sw_events_wq); 2546 2547 ret = cdns_mhdp_load_firmware(mhdp); 2548 if (ret) 2549 goto phy_exit; 2550 2551 if (mhdp->hdcp_supported) 2552 cdns_mhdp_hdcp_init(mhdp); 2553 2554 drm_bridge_add(&mhdp->bridge); 2555 2556 return 0; 2557 2558 phy_exit: 2559 phy_exit(mhdp->phy); 2560 plat_fini: 2561 if (mhdp->info && mhdp->info->ops && mhdp->info->ops->exit) 2562 mhdp->info->ops->exit(mhdp); 2563 runtime_put: 2564 pm_runtime_put_sync(dev); 2565 pm_runtime_disable(dev); 2566 clk_disable: 2567 clk_disable_unprepare(mhdp->clk); 2568 2569 return ret; 2570 } 2571 2572 static int cdns_mhdp_remove(struct platform_device *pdev) 2573 { 2574 struct cdns_mhdp_device *mhdp = platform_get_drvdata(pdev); 2575 unsigned long timeout = msecs_to_jiffies(100); 2576 bool stop_fw = false; 2577 int ret; 2578 2579 drm_bridge_remove(&mhdp->bridge); 2580 2581 ret = wait_event_timeout(mhdp->fw_load_wq, 2582 mhdp->hw_state == MHDP_HW_READY, 2583 timeout); 2584 if (ret == 0) 2585 dev_err(mhdp->dev, "%s: Timeout waiting for fw loading\n", 2586 __func__); 2587 else 2588 stop_fw = true; 2589 2590 spin_lock(&mhdp->start_lock); 2591 mhdp->hw_state = MHDP_HW_STOPPED; 2592 spin_unlock(&mhdp->start_lock); 2593 2594 if (stop_fw) 2595 ret = cdns_mhdp_set_firmware_active(mhdp, false); 2596 2597 phy_exit(mhdp->phy); 2598 2599 if (mhdp->info && mhdp->info->ops && mhdp->info->ops->exit) 2600 mhdp->info->ops->exit(mhdp); 2601 2602 pm_runtime_put_sync(&pdev->dev); 2603 pm_runtime_disable(&pdev->dev); 2604 2605 cancel_work_sync(&mhdp->modeset_retry_work); 2606 flush_scheduled_work(); 2607 2608 clk_disable_unprepare(mhdp->clk); 2609 2610 return ret; 2611 } 2612 2613 static const struct of_device_id mhdp_ids[] = { 2614 { .compatible = "cdns,mhdp8546", }, 2615 #ifdef CONFIG_DRM_CDNS_MHDP8546_J721E 2616 { .compatible = "ti,j721e-mhdp8546", 2617 .data = &(const struct cdns_mhdp_platform_info) { 2618 .timings = &mhdp_ti_j721e_bridge_timings, 2619 .ops = &mhdp_ti_j721e_ops, 2620 }, 2621 }, 2622 #endif 2623 { /* sentinel */ } 2624 }; 2625 MODULE_DEVICE_TABLE(of, mhdp_ids); 2626 2627 static struct platform_driver mhdp_driver = { 2628 .driver = { 2629 .name = "cdns-mhdp8546", 2630 .of_match_table = of_match_ptr(mhdp_ids), 2631 }, 2632 .probe = cdns_mhdp_probe, 2633 .remove = cdns_mhdp_remove, 2634 }; 2635 module_platform_driver(mhdp_driver); 2636 2637 MODULE_FIRMWARE(FW_NAME); 2638 2639 MODULE_AUTHOR("Quentin Schulz <quentin.schulz@free-electrons.com>"); 2640 MODULE_AUTHOR("Swapnil Jakhade <sjakhade@cadence.com>"); 2641 MODULE_AUTHOR("Yuti Amonkar <yamonkar@cadence.com>"); 2642 MODULE_AUTHOR("Tomi Valkeinen <tomi.valkeinen@ti.com>"); 2643 MODULE_AUTHOR("Jyri Sarha <jsarha@ti.com>"); 2644 MODULE_DESCRIPTION("Cadence MHDP8546 DP bridge driver"); 2645 MODULE_LICENSE("GPL"); 2646 MODULE_ALIAS("platform:cdns-mhdp8546"); 2647