dp_catalog.c (31803B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. 4 */ 5 6#define pr_fmt(fmt) "[drm-dp] %s: " fmt, __func__ 7 8#include <linux/delay.h> 9#include <linux/iopoll.h> 10#include <linux/phy/phy.h> 11#include <linux/phy/phy-dp.h> 12#include <linux/rational.h> 13#include <drm/display/drm_dp_helper.h> 14#include <drm/drm_print.h> 15 16#include "dp_catalog.h" 17#include "dp_reg.h" 18 19#define POLLING_SLEEP_US 1000 20#define POLLING_TIMEOUT_US 10000 21 22#define SCRAMBLER_RESET_COUNT_VALUE 0xFC 23 24#define DP_INTERRUPT_STATUS_ACK_SHIFT 1 25#define DP_INTERRUPT_STATUS_MASK_SHIFT 2 26 27#define DP_INTF_CONFIG_DATABUS_WIDEN BIT(4) 28 29#define DP_INTERRUPT_STATUS1 \ 30 (DP_INTR_AUX_I2C_DONE| \ 31 DP_INTR_WRONG_ADDR | DP_INTR_TIMEOUT | \ 32 DP_INTR_NACK_DEFER | DP_INTR_WRONG_DATA_CNT | \ 33 DP_INTR_I2C_NACK | DP_INTR_I2C_DEFER | \ 34 DP_INTR_PLL_UNLOCKED | DP_INTR_AUX_ERROR) 35 36#define DP_INTERRUPT_STATUS1_ACK \ 37 (DP_INTERRUPT_STATUS1 << DP_INTERRUPT_STATUS_ACK_SHIFT) 38#define DP_INTERRUPT_STATUS1_MASK \ 39 (DP_INTERRUPT_STATUS1 << DP_INTERRUPT_STATUS_MASK_SHIFT) 40 41#define DP_INTERRUPT_STATUS2 \ 42 (DP_INTR_READY_FOR_VIDEO | DP_INTR_IDLE_PATTERN_SENT | \ 43 DP_INTR_FRAME_END | DP_INTR_CRC_UPDATED) 44 45#define DP_INTERRUPT_STATUS2_ACK \ 46 (DP_INTERRUPT_STATUS2 << DP_INTERRUPT_STATUS_ACK_SHIFT) 47#define DP_INTERRUPT_STATUS2_MASK \ 48 (DP_INTERRUPT_STATUS2 << DP_INTERRUPT_STATUS_MASK_SHIFT) 49 50struct dp_catalog_private { 51 struct device *dev; 52 struct drm_device *drm_dev; 53 struct dp_io *io; 54 u32 (*audio_map)[DP_AUDIO_SDP_HEADER_MAX]; 55 struct dp_catalog dp_catalog; 56 u8 aux_lut_cfg_index[PHY_AUX_CFG_MAX]; 57}; 58 59void dp_catalog_snapshot(struct dp_catalog *dp_catalog, struct msm_disp_state *disp_state) 60{ 61 struct dp_catalog_private *catalog = container_of(dp_catalog, 62 struct dp_catalog_private, dp_catalog); 63 struct dss_io_data *dss = &catalog->io->dp_controller; 64 65 msm_disp_snapshot_add_block(disp_state, dss->ahb.len, dss->ahb.base, "dp_ahb"); 66 msm_disp_snapshot_add_block(disp_state, dss->aux.len, dss->aux.base, "dp_aux"); 67 msm_disp_snapshot_add_block(disp_state, dss->link.len, dss->link.base, "dp_link"); 68 msm_disp_snapshot_add_block(disp_state, dss->p0.len, dss->p0.base, "dp_p0"); 69} 70 71static inline u32 dp_read_aux(struct dp_catalog_private *catalog, u32 offset) 72{ 73 return readl_relaxed(catalog->io->dp_controller.aux.base + offset); 74} 75 76static inline void dp_write_aux(struct dp_catalog_private *catalog, 77 u32 offset, u32 data) 78{ 79 /* 80 * To make sure aux reg writes happens before any other operation, 81 * this function uses writel() instread of writel_relaxed() 82 */ 83 writel(data, catalog->io->dp_controller.aux.base + offset); 84} 85 86static inline u32 dp_read_ahb(const struct dp_catalog_private *catalog, u32 offset) 87{ 88 return readl_relaxed(catalog->io->dp_controller.ahb.base + offset); 89} 90 91static inline void dp_write_ahb(struct dp_catalog_private *catalog, 92 u32 offset, u32 data) 93{ 94 /* 95 * To make sure phy reg writes happens before any other operation, 96 * this function uses writel() instread of writel_relaxed() 97 */ 98 writel(data, catalog->io->dp_controller.ahb.base + offset); 99} 100 101static inline void dp_write_p0(struct dp_catalog_private *catalog, 102 u32 offset, u32 data) 103{ 104 /* 105 * To make sure interface reg writes happens before any other operation, 106 * this function uses writel() instread of writel_relaxed() 107 */ 108 writel(data, catalog->io->dp_controller.p0.base + offset); 109} 110 111static inline u32 dp_read_p0(struct dp_catalog_private *catalog, 112 u32 offset) 113{ 114 /* 115 * To make sure interface reg writes happens before any other operation, 116 * this function uses writel() instread of writel_relaxed() 117 */ 118 return readl_relaxed(catalog->io->dp_controller.p0.base + offset); 119} 120 121static inline u32 dp_read_link(struct dp_catalog_private *catalog, u32 offset) 122{ 123 return readl_relaxed(catalog->io->dp_controller.link.base + offset); 124} 125 126static inline void dp_write_link(struct dp_catalog_private *catalog, 127 u32 offset, u32 data) 128{ 129 /* 130 * To make sure link reg writes happens before any other operation, 131 * this function uses writel() instread of writel_relaxed() 132 */ 133 writel(data, catalog->io->dp_controller.link.base + offset); 134} 135 136/* aux related catalog functions */ 137u32 dp_catalog_aux_read_data(struct dp_catalog *dp_catalog) 138{ 139 struct dp_catalog_private *catalog = container_of(dp_catalog, 140 struct dp_catalog_private, dp_catalog); 141 142 return dp_read_aux(catalog, REG_DP_AUX_DATA); 143} 144 145int dp_catalog_aux_write_data(struct dp_catalog *dp_catalog) 146{ 147 struct dp_catalog_private *catalog = container_of(dp_catalog, 148 struct dp_catalog_private, dp_catalog); 149 150 dp_write_aux(catalog, REG_DP_AUX_DATA, dp_catalog->aux_data); 151 return 0; 152} 153 154int dp_catalog_aux_write_trans(struct dp_catalog *dp_catalog) 155{ 156 struct dp_catalog_private *catalog = container_of(dp_catalog, 157 struct dp_catalog_private, dp_catalog); 158 159 dp_write_aux(catalog, REG_DP_AUX_TRANS_CTRL, dp_catalog->aux_data); 160 return 0; 161} 162 163int dp_catalog_aux_clear_trans(struct dp_catalog *dp_catalog, bool read) 164{ 165 u32 data; 166 struct dp_catalog_private *catalog = container_of(dp_catalog, 167 struct dp_catalog_private, dp_catalog); 168 169 if (read) { 170 data = dp_read_aux(catalog, REG_DP_AUX_TRANS_CTRL); 171 data &= ~DP_AUX_TRANS_CTRL_GO; 172 dp_write_aux(catalog, REG_DP_AUX_TRANS_CTRL, data); 173 } else { 174 dp_write_aux(catalog, REG_DP_AUX_TRANS_CTRL, 0); 175 } 176 return 0; 177} 178 179int dp_catalog_aux_clear_hw_interrupts(struct dp_catalog *dp_catalog) 180{ 181 struct dp_catalog_private *catalog = container_of(dp_catalog, 182 struct dp_catalog_private, dp_catalog); 183 184 dp_read_aux(catalog, REG_DP_PHY_AUX_INTERRUPT_STATUS); 185 dp_write_aux(catalog, REG_DP_PHY_AUX_INTERRUPT_CLEAR, 0x1f); 186 dp_write_aux(catalog, REG_DP_PHY_AUX_INTERRUPT_CLEAR, 0x9f); 187 dp_write_aux(catalog, REG_DP_PHY_AUX_INTERRUPT_CLEAR, 0); 188 return 0; 189} 190 191/** 192 * dp_catalog_aux_reset() - reset AUX controller 193 * 194 * @dp_catalog: DP catalog structure 195 * 196 * return: void 197 * 198 * This function reset AUX controller 199 * 200 * NOTE: reset AUX controller will also clear any pending HPD related interrupts 201 * 202 */ 203void dp_catalog_aux_reset(struct dp_catalog *dp_catalog) 204{ 205 u32 aux_ctrl; 206 struct dp_catalog_private *catalog = container_of(dp_catalog, 207 struct dp_catalog_private, dp_catalog); 208 209 aux_ctrl = dp_read_aux(catalog, REG_DP_AUX_CTRL); 210 211 aux_ctrl |= DP_AUX_CTRL_RESET; 212 dp_write_aux(catalog, REG_DP_AUX_CTRL, aux_ctrl); 213 usleep_range(1000, 1100); /* h/w recommended delay */ 214 215 aux_ctrl &= ~DP_AUX_CTRL_RESET; 216 dp_write_aux(catalog, REG_DP_AUX_CTRL, aux_ctrl); 217} 218 219void dp_catalog_aux_enable(struct dp_catalog *dp_catalog, bool enable) 220{ 221 u32 aux_ctrl; 222 struct dp_catalog_private *catalog = container_of(dp_catalog, 223 struct dp_catalog_private, dp_catalog); 224 225 aux_ctrl = dp_read_aux(catalog, REG_DP_AUX_CTRL); 226 227 if (enable) { 228 dp_write_aux(catalog, REG_DP_TIMEOUT_COUNT, 0xffff); 229 dp_write_aux(catalog, REG_DP_AUX_LIMITS, 0xffff); 230 aux_ctrl |= DP_AUX_CTRL_ENABLE; 231 } else { 232 aux_ctrl &= ~DP_AUX_CTRL_ENABLE; 233 } 234 235 dp_write_aux(catalog, REG_DP_AUX_CTRL, aux_ctrl); 236} 237 238void dp_catalog_aux_update_cfg(struct dp_catalog *dp_catalog) 239{ 240 struct dp_catalog_private *catalog = container_of(dp_catalog, 241 struct dp_catalog_private, dp_catalog); 242 struct dp_io *dp_io = catalog->io; 243 struct phy *phy = dp_io->phy; 244 245 phy_calibrate(phy); 246} 247 248int dp_catalog_aux_wait_for_hpd_connect_state(struct dp_catalog *dp_catalog) 249{ 250 u32 state; 251 struct dp_catalog_private *catalog = container_of(dp_catalog, 252 struct dp_catalog_private, dp_catalog); 253 254 /* poll for hpd connected status every 2ms and timeout after 500ms */ 255 return readl_poll_timeout(catalog->io->dp_controller.aux.base + 256 REG_DP_DP_HPD_INT_STATUS, 257 state, state & DP_DP_HPD_STATE_STATUS_CONNECTED, 258 2000, 500000); 259} 260 261static void dump_regs(void __iomem *base, int len) 262{ 263 int i; 264 u32 x0, x4, x8, xc; 265 u32 addr_off = 0; 266 267 len = DIV_ROUND_UP(len, 16); 268 for (i = 0; i < len; i++) { 269 x0 = readl_relaxed(base + addr_off); 270 x4 = readl_relaxed(base + addr_off + 0x04); 271 x8 = readl_relaxed(base + addr_off + 0x08); 272 xc = readl_relaxed(base + addr_off + 0x0c); 273 274 pr_info("%08x: %08x %08x %08x %08x", addr_off, x0, x4, x8, xc); 275 addr_off += 16; 276 } 277} 278 279void dp_catalog_dump_regs(struct dp_catalog *dp_catalog) 280{ 281 struct dp_catalog_private *catalog = container_of(dp_catalog, 282 struct dp_catalog_private, dp_catalog); 283 struct dss_io_data *io = &catalog->io->dp_controller; 284 285 pr_info("AHB regs\n"); 286 dump_regs(io->ahb.base, io->ahb.len); 287 288 pr_info("AUXCLK regs\n"); 289 dump_regs(io->aux.base, io->aux.len); 290 291 pr_info("LCLK regs\n"); 292 dump_regs(io->link.base, io->link.len); 293 294 pr_info("P0CLK regs\n"); 295 dump_regs(io->p0.base, io->p0.len); 296} 297 298u32 dp_catalog_aux_get_irq(struct dp_catalog *dp_catalog) 299{ 300 struct dp_catalog_private *catalog = container_of(dp_catalog, 301 struct dp_catalog_private, dp_catalog); 302 u32 intr, intr_ack; 303 304 intr = dp_read_ahb(catalog, REG_DP_INTR_STATUS); 305 intr &= ~DP_INTERRUPT_STATUS1_MASK; 306 intr_ack = (intr & DP_INTERRUPT_STATUS1) 307 << DP_INTERRUPT_STATUS_ACK_SHIFT; 308 dp_write_ahb(catalog, REG_DP_INTR_STATUS, intr_ack | 309 DP_INTERRUPT_STATUS1_MASK); 310 311 return intr; 312 313} 314 315/* controller related catalog functions */ 316void dp_catalog_ctrl_update_transfer_unit(struct dp_catalog *dp_catalog, 317 u32 dp_tu, u32 valid_boundary, 318 u32 valid_boundary2) 319{ 320 struct dp_catalog_private *catalog = container_of(dp_catalog, 321 struct dp_catalog_private, dp_catalog); 322 323 dp_write_link(catalog, REG_DP_VALID_BOUNDARY, valid_boundary); 324 dp_write_link(catalog, REG_DP_TU, dp_tu); 325 dp_write_link(catalog, REG_DP_VALID_BOUNDARY_2, valid_boundary2); 326} 327 328void dp_catalog_ctrl_state_ctrl(struct dp_catalog *dp_catalog, u32 state) 329{ 330 struct dp_catalog_private *catalog = container_of(dp_catalog, 331 struct dp_catalog_private, dp_catalog); 332 333 dp_write_link(catalog, REG_DP_STATE_CTRL, state); 334} 335 336void dp_catalog_ctrl_config_ctrl(struct dp_catalog *dp_catalog, u32 cfg) 337{ 338 struct dp_catalog_private *catalog = container_of(dp_catalog, 339 struct dp_catalog_private, dp_catalog); 340 341 drm_dbg_dp(catalog->drm_dev, "DP_CONFIGURATION_CTRL=0x%x\n", cfg); 342 343 dp_write_link(catalog, REG_DP_CONFIGURATION_CTRL, cfg); 344} 345 346void dp_catalog_ctrl_lane_mapping(struct dp_catalog *dp_catalog) 347{ 348 struct dp_catalog_private *catalog = container_of(dp_catalog, 349 struct dp_catalog_private, dp_catalog); 350 u32 ln_0 = 0, ln_1 = 1, ln_2 = 2, ln_3 = 3; /* One-to-One mapping */ 351 u32 ln_mapping; 352 353 ln_mapping = ln_0 << LANE0_MAPPING_SHIFT; 354 ln_mapping |= ln_1 << LANE1_MAPPING_SHIFT; 355 ln_mapping |= ln_2 << LANE2_MAPPING_SHIFT; 356 ln_mapping |= ln_3 << LANE3_MAPPING_SHIFT; 357 358 dp_write_link(catalog, REG_DP_LOGICAL2PHYSICAL_LANE_MAPPING, 359 ln_mapping); 360} 361 362void dp_catalog_ctrl_mainlink_ctrl(struct dp_catalog *dp_catalog, 363 bool enable) 364{ 365 u32 mainlink_ctrl; 366 struct dp_catalog_private *catalog = container_of(dp_catalog, 367 struct dp_catalog_private, dp_catalog); 368 369 drm_dbg_dp(catalog->drm_dev, "enable=%d\n", enable); 370 if (enable) { 371 /* 372 * To make sure link reg writes happens before other operation, 373 * dp_write_link() function uses writel() 374 */ 375 mainlink_ctrl = dp_read_link(catalog, REG_DP_MAINLINK_CTRL); 376 377 mainlink_ctrl &= ~(DP_MAINLINK_CTRL_RESET | 378 DP_MAINLINK_CTRL_ENABLE); 379 dp_write_link(catalog, REG_DP_MAINLINK_CTRL, mainlink_ctrl); 380 381 mainlink_ctrl |= DP_MAINLINK_CTRL_RESET; 382 dp_write_link(catalog, REG_DP_MAINLINK_CTRL, mainlink_ctrl); 383 384 mainlink_ctrl &= ~DP_MAINLINK_CTRL_RESET; 385 dp_write_link(catalog, REG_DP_MAINLINK_CTRL, mainlink_ctrl); 386 387 mainlink_ctrl |= (DP_MAINLINK_CTRL_ENABLE | 388 DP_MAINLINK_FB_BOUNDARY_SEL); 389 dp_write_link(catalog, REG_DP_MAINLINK_CTRL, mainlink_ctrl); 390 } else { 391 mainlink_ctrl = dp_read_link(catalog, REG_DP_MAINLINK_CTRL); 392 mainlink_ctrl &= ~DP_MAINLINK_CTRL_ENABLE; 393 dp_write_link(catalog, REG_DP_MAINLINK_CTRL, mainlink_ctrl); 394 } 395} 396 397void dp_catalog_ctrl_config_misc(struct dp_catalog *dp_catalog, 398 u32 colorimetry_cfg, 399 u32 test_bits_depth) 400{ 401 u32 misc_val; 402 struct dp_catalog_private *catalog = container_of(dp_catalog, 403 struct dp_catalog_private, dp_catalog); 404 405 misc_val = dp_read_link(catalog, REG_DP_MISC1_MISC0); 406 407 /* clear bpp bits */ 408 misc_val &= ~(0x07 << DP_MISC0_TEST_BITS_DEPTH_SHIFT); 409 misc_val |= colorimetry_cfg << DP_MISC0_COLORIMETRY_CFG_SHIFT; 410 misc_val |= test_bits_depth << DP_MISC0_TEST_BITS_DEPTH_SHIFT; 411 /* Configure clock to synchronous mode */ 412 misc_val |= DP_MISC0_SYNCHRONOUS_CLK; 413 414 drm_dbg_dp(catalog->drm_dev, "misc settings = 0x%x\n", misc_val); 415 dp_write_link(catalog, REG_DP_MISC1_MISC0, misc_val); 416} 417 418void dp_catalog_ctrl_config_msa(struct dp_catalog *dp_catalog, 419 u32 rate, u32 stream_rate_khz, 420 bool fixed_nvid) 421{ 422 u32 pixel_m, pixel_n; 423 u32 mvid, nvid, pixel_div = 0, dispcc_input_rate; 424 u32 const nvid_fixed = DP_LINK_CONSTANT_N_VALUE; 425 u32 const link_rate_hbr2 = 540000; 426 u32 const link_rate_hbr3 = 810000; 427 unsigned long den, num; 428 429 struct dp_catalog_private *catalog = container_of(dp_catalog, 430 struct dp_catalog_private, dp_catalog); 431 432 if (rate == link_rate_hbr3) 433 pixel_div = 6; 434 else if (rate == 1620000 || rate == 270000) 435 pixel_div = 2; 436 else if (rate == link_rate_hbr2) 437 pixel_div = 4; 438 else 439 DRM_ERROR("Invalid pixel mux divider\n"); 440 441 dispcc_input_rate = (rate * 10) / pixel_div; 442 443 rational_best_approximation(dispcc_input_rate, stream_rate_khz, 444 (unsigned long)(1 << 16) - 1, 445 (unsigned long)(1 << 16) - 1, &den, &num); 446 447 den = ~(den - num); 448 den = den & 0xFFFF; 449 pixel_m = num; 450 pixel_n = den; 451 452 mvid = (pixel_m & 0xFFFF) * 5; 453 nvid = (0xFFFF & (~pixel_n)) + (pixel_m & 0xFFFF); 454 455 if (nvid < nvid_fixed) { 456 u32 temp; 457 458 temp = (nvid_fixed / nvid) * nvid; 459 mvid = (nvid_fixed / nvid) * mvid; 460 nvid = temp; 461 } 462 463 if (link_rate_hbr2 == rate) 464 nvid *= 2; 465 466 if (link_rate_hbr3 == rate) 467 nvid *= 3; 468 469 drm_dbg_dp(catalog->drm_dev, "mvid=0x%x, nvid=0x%x\n", mvid, nvid); 470 dp_write_link(catalog, REG_DP_SOFTWARE_MVID, mvid); 471 dp_write_link(catalog, REG_DP_SOFTWARE_NVID, nvid); 472 dp_write_p0(catalog, MMSS_DP_DSC_DTO, 0x0); 473} 474 475int dp_catalog_ctrl_set_pattern_state_bit(struct dp_catalog *dp_catalog, 476 u32 state_bit) 477{ 478 int bit, ret; 479 u32 data; 480 struct dp_catalog_private *catalog = container_of(dp_catalog, 481 struct dp_catalog_private, dp_catalog); 482 483 bit = BIT(state_bit - 1); 484 drm_dbg_dp(catalog->drm_dev, "hw: bit=%d train=%d\n", bit, state_bit); 485 dp_catalog_ctrl_state_ctrl(dp_catalog, bit); 486 487 bit = BIT(state_bit - 1) << DP_MAINLINK_READY_LINK_TRAINING_SHIFT; 488 489 /* Poll for mainlink ready status */ 490 ret = readx_poll_timeout(readl, catalog->io->dp_controller.link.base + 491 REG_DP_MAINLINK_READY, 492 data, data & bit, 493 POLLING_SLEEP_US, POLLING_TIMEOUT_US); 494 if (ret < 0) { 495 DRM_ERROR("set state_bit for link_train=%d failed\n", state_bit); 496 return ret; 497 } 498 return 0; 499} 500 501/** 502 * dp_catalog_hw_revision() - retrieve DP hw revision 503 * 504 * @dp_catalog: DP catalog structure 505 * 506 * Return: DP controller hw revision 507 * 508 */ 509u32 dp_catalog_hw_revision(const struct dp_catalog *dp_catalog) 510{ 511 const struct dp_catalog_private *catalog = container_of(dp_catalog, 512 struct dp_catalog_private, dp_catalog); 513 514 return dp_read_ahb(catalog, REG_DP_HW_VERSION); 515} 516 517/** 518 * dp_catalog_ctrl_reset() - reset DP controller 519 * 520 * @dp_catalog: DP catalog structure 521 * 522 * return: void 523 * 524 * This function reset the DP controller 525 * 526 * NOTE: reset DP controller will also clear any pending HPD related interrupts 527 * 528 */ 529void dp_catalog_ctrl_reset(struct dp_catalog *dp_catalog) 530{ 531 u32 sw_reset; 532 struct dp_catalog_private *catalog = container_of(dp_catalog, 533 struct dp_catalog_private, dp_catalog); 534 535 sw_reset = dp_read_ahb(catalog, REG_DP_SW_RESET); 536 537 sw_reset |= DP_SW_RESET; 538 dp_write_ahb(catalog, REG_DP_SW_RESET, sw_reset); 539 usleep_range(1000, 1100); /* h/w recommended delay */ 540 541 sw_reset &= ~DP_SW_RESET; 542 dp_write_ahb(catalog, REG_DP_SW_RESET, sw_reset); 543} 544 545bool dp_catalog_ctrl_mainlink_ready(struct dp_catalog *dp_catalog) 546{ 547 u32 data; 548 int ret; 549 struct dp_catalog_private *catalog = container_of(dp_catalog, 550 struct dp_catalog_private, dp_catalog); 551 552 /* Poll for mainlink ready status */ 553 ret = readl_poll_timeout(catalog->io->dp_controller.link.base + 554 REG_DP_MAINLINK_READY, 555 data, data & DP_MAINLINK_READY_FOR_VIDEO, 556 POLLING_SLEEP_US, POLLING_TIMEOUT_US); 557 if (ret < 0) { 558 DRM_ERROR("mainlink not ready\n"); 559 return false; 560 } 561 562 return true; 563} 564 565void dp_catalog_ctrl_enable_irq(struct dp_catalog *dp_catalog, 566 bool enable) 567{ 568 struct dp_catalog_private *catalog = container_of(dp_catalog, 569 struct dp_catalog_private, dp_catalog); 570 571 if (enable) { 572 dp_write_ahb(catalog, REG_DP_INTR_STATUS, 573 DP_INTERRUPT_STATUS1_MASK); 574 dp_write_ahb(catalog, REG_DP_INTR_STATUS2, 575 DP_INTERRUPT_STATUS2_MASK); 576 } else { 577 dp_write_ahb(catalog, REG_DP_INTR_STATUS, 0x00); 578 dp_write_ahb(catalog, REG_DP_INTR_STATUS2, 0x00); 579 } 580} 581 582void dp_catalog_hpd_config_intr(struct dp_catalog *dp_catalog, 583 u32 intr_mask, bool en) 584{ 585 struct dp_catalog_private *catalog = container_of(dp_catalog, 586 struct dp_catalog_private, dp_catalog); 587 588 u32 config = dp_read_aux(catalog, REG_DP_DP_HPD_INT_MASK); 589 590 config = (en ? config | intr_mask : config & ~intr_mask); 591 592 drm_dbg_dp(catalog->drm_dev, "intr_mask=%#x config=%#x\n", 593 intr_mask, config); 594 dp_write_aux(catalog, REG_DP_DP_HPD_INT_MASK, 595 config & DP_DP_HPD_INT_MASK); 596} 597 598void dp_catalog_ctrl_hpd_config(struct dp_catalog *dp_catalog) 599{ 600 struct dp_catalog_private *catalog = container_of(dp_catalog, 601 struct dp_catalog_private, dp_catalog); 602 603 u32 reftimer = dp_read_aux(catalog, REG_DP_DP_HPD_REFTIMER); 604 605 /* Configure REFTIMER and enable it */ 606 reftimer |= DP_DP_HPD_REFTIMER_ENABLE; 607 dp_write_aux(catalog, REG_DP_DP_HPD_REFTIMER, reftimer); 608 609 /* Enable HPD */ 610 dp_write_aux(catalog, REG_DP_DP_HPD_CTRL, DP_DP_HPD_CTRL_HPD_EN); 611} 612 613u32 dp_catalog_link_is_connected(struct dp_catalog *dp_catalog) 614{ 615 struct dp_catalog_private *catalog = container_of(dp_catalog, 616 struct dp_catalog_private, dp_catalog); 617 u32 status; 618 619 status = dp_read_aux(catalog, REG_DP_DP_HPD_INT_STATUS); 620 drm_dbg_dp(catalog->drm_dev, "aux status: %#x\n", status); 621 status >>= DP_DP_HPD_STATE_STATUS_BITS_SHIFT; 622 status &= DP_DP_HPD_STATE_STATUS_BITS_MASK; 623 624 return status; 625} 626 627u32 dp_catalog_hpd_get_intr_status(struct dp_catalog *dp_catalog) 628{ 629 struct dp_catalog_private *catalog = container_of(dp_catalog, 630 struct dp_catalog_private, dp_catalog); 631 int isr, mask; 632 633 isr = dp_read_aux(catalog, REG_DP_DP_HPD_INT_STATUS); 634 dp_write_aux(catalog, REG_DP_DP_HPD_INT_ACK, 635 (isr & DP_DP_HPD_INT_MASK)); 636 mask = dp_read_aux(catalog, REG_DP_DP_HPD_INT_MASK); 637 638 /* 639 * We only want to return interrupts that are unmasked to the caller. 640 * However, the interrupt status field also contains other 641 * informational bits about the HPD state status, so we only mask 642 * out the part of the register that tells us about which interrupts 643 * are pending. 644 */ 645 return isr & (mask | ~DP_DP_HPD_INT_MASK); 646} 647 648int dp_catalog_ctrl_get_interrupt(struct dp_catalog *dp_catalog) 649{ 650 struct dp_catalog_private *catalog = container_of(dp_catalog, 651 struct dp_catalog_private, dp_catalog); 652 u32 intr, intr_ack; 653 654 intr = dp_read_ahb(catalog, REG_DP_INTR_STATUS2); 655 intr &= ~DP_INTERRUPT_STATUS2_MASK; 656 intr_ack = (intr & DP_INTERRUPT_STATUS2) 657 << DP_INTERRUPT_STATUS_ACK_SHIFT; 658 dp_write_ahb(catalog, REG_DP_INTR_STATUS2, 659 intr_ack | DP_INTERRUPT_STATUS2_MASK); 660 661 return intr; 662} 663 664void dp_catalog_ctrl_phy_reset(struct dp_catalog *dp_catalog) 665{ 666 struct dp_catalog_private *catalog = container_of(dp_catalog, 667 struct dp_catalog_private, dp_catalog); 668 669 dp_write_ahb(catalog, REG_DP_PHY_CTRL, 670 DP_PHY_CTRL_SW_RESET | DP_PHY_CTRL_SW_RESET_PLL); 671 usleep_range(1000, 1100); /* h/w recommended delay */ 672 dp_write_ahb(catalog, REG_DP_PHY_CTRL, 0x0); 673} 674 675int dp_catalog_ctrl_update_vx_px(struct dp_catalog *dp_catalog, 676 u8 v_level, u8 p_level) 677{ 678 struct dp_catalog_private *catalog = container_of(dp_catalog, 679 struct dp_catalog_private, dp_catalog); 680 struct dp_io *dp_io = catalog->io; 681 struct phy *phy = dp_io->phy; 682 struct phy_configure_opts_dp *opts_dp = &dp_io->phy_opts.dp; 683 684 /* TODO: Update for all lanes instead of just first one */ 685 opts_dp->voltage[0] = v_level; 686 opts_dp->pre[0] = p_level; 687 opts_dp->set_voltages = 1; 688 phy_configure(phy, &dp_io->phy_opts); 689 opts_dp->set_voltages = 0; 690 691 return 0; 692} 693 694void dp_catalog_ctrl_send_phy_pattern(struct dp_catalog *dp_catalog, 695 u32 pattern) 696{ 697 struct dp_catalog_private *catalog = container_of(dp_catalog, 698 struct dp_catalog_private, dp_catalog); 699 u32 value = 0x0; 700 701 /* Make sure to clear the current pattern before starting a new one */ 702 dp_write_link(catalog, REG_DP_STATE_CTRL, 0x0); 703 704 drm_dbg_dp(catalog->drm_dev, "pattern: %#x\n", pattern); 705 switch (pattern) { 706 case DP_PHY_TEST_PATTERN_D10_2: 707 dp_write_link(catalog, REG_DP_STATE_CTRL, 708 DP_STATE_CTRL_LINK_TRAINING_PATTERN1); 709 break; 710 case DP_PHY_TEST_PATTERN_ERROR_COUNT: 711 value &= ~(1 << 16); 712 dp_write_link(catalog, REG_DP_HBR2_COMPLIANCE_SCRAMBLER_RESET, 713 value); 714 value |= SCRAMBLER_RESET_COUNT_VALUE; 715 dp_write_link(catalog, REG_DP_HBR2_COMPLIANCE_SCRAMBLER_RESET, 716 value); 717 dp_write_link(catalog, REG_DP_MAINLINK_LEVELS, 718 DP_MAINLINK_SAFE_TO_EXIT_LEVEL_2); 719 dp_write_link(catalog, REG_DP_STATE_CTRL, 720 DP_STATE_CTRL_LINK_SYMBOL_ERR_MEASURE); 721 break; 722 case DP_PHY_TEST_PATTERN_PRBS7: 723 dp_write_link(catalog, REG_DP_STATE_CTRL, 724 DP_STATE_CTRL_LINK_PRBS7); 725 break; 726 case DP_PHY_TEST_PATTERN_80BIT_CUSTOM: 727 dp_write_link(catalog, REG_DP_STATE_CTRL, 728 DP_STATE_CTRL_LINK_TEST_CUSTOM_PATTERN); 729 /* 00111110000011111000001111100000 */ 730 dp_write_link(catalog, REG_DP_TEST_80BIT_CUSTOM_PATTERN_REG0, 731 0x3E0F83E0); 732 /* 00001111100000111110000011111000 */ 733 dp_write_link(catalog, REG_DP_TEST_80BIT_CUSTOM_PATTERN_REG1, 734 0x0F83E0F8); 735 /* 1111100000111110 */ 736 dp_write_link(catalog, REG_DP_TEST_80BIT_CUSTOM_PATTERN_REG2, 737 0x0000F83E); 738 break; 739 case DP_PHY_TEST_PATTERN_CP2520: 740 value = dp_read_link(catalog, REG_DP_MAINLINK_CTRL); 741 value &= ~DP_MAINLINK_CTRL_SW_BYPASS_SCRAMBLER; 742 dp_write_link(catalog, REG_DP_MAINLINK_CTRL, value); 743 744 value = DP_HBR2_ERM_PATTERN; 745 dp_write_link(catalog, REG_DP_HBR2_COMPLIANCE_SCRAMBLER_RESET, 746 value); 747 value |= SCRAMBLER_RESET_COUNT_VALUE; 748 dp_write_link(catalog, REG_DP_HBR2_COMPLIANCE_SCRAMBLER_RESET, 749 value); 750 dp_write_link(catalog, REG_DP_MAINLINK_LEVELS, 751 DP_MAINLINK_SAFE_TO_EXIT_LEVEL_2); 752 dp_write_link(catalog, REG_DP_STATE_CTRL, 753 DP_STATE_CTRL_LINK_SYMBOL_ERR_MEASURE); 754 value = dp_read_link(catalog, REG_DP_MAINLINK_CTRL); 755 value |= DP_MAINLINK_CTRL_ENABLE; 756 dp_write_link(catalog, REG_DP_MAINLINK_CTRL, value); 757 break; 758 case DP_PHY_TEST_PATTERN_SEL_MASK: 759 dp_write_link(catalog, REG_DP_MAINLINK_CTRL, 760 DP_MAINLINK_CTRL_ENABLE); 761 dp_write_link(catalog, REG_DP_STATE_CTRL, 762 DP_STATE_CTRL_LINK_TRAINING_PATTERN4); 763 break; 764 default: 765 drm_dbg_dp(catalog->drm_dev, 766 "No valid test pattern requested: %#x\n", pattern); 767 break; 768 } 769} 770 771u32 dp_catalog_ctrl_read_phy_pattern(struct dp_catalog *dp_catalog) 772{ 773 struct dp_catalog_private *catalog = container_of(dp_catalog, 774 struct dp_catalog_private, dp_catalog); 775 776 return dp_read_link(catalog, REG_DP_MAINLINK_READY); 777} 778 779/* panel related catalog functions */ 780int dp_catalog_panel_timing_cfg(struct dp_catalog *dp_catalog) 781{ 782 struct dp_catalog_private *catalog = container_of(dp_catalog, 783 struct dp_catalog_private, dp_catalog); 784 u32 reg; 785 786 dp_write_link(catalog, REG_DP_TOTAL_HOR_VER, 787 dp_catalog->total); 788 dp_write_link(catalog, REG_DP_START_HOR_VER_FROM_SYNC, 789 dp_catalog->sync_start); 790 dp_write_link(catalog, REG_DP_HSYNC_VSYNC_WIDTH_POLARITY, 791 dp_catalog->width_blanking); 792 dp_write_link(catalog, REG_DP_ACTIVE_HOR_VER, dp_catalog->dp_active); 793 794 reg = dp_read_p0(catalog, MMSS_DP_INTF_CONFIG); 795 796 if (dp_catalog->wide_bus_en) 797 reg |= DP_INTF_CONFIG_DATABUS_WIDEN; 798 else 799 reg &= ~DP_INTF_CONFIG_DATABUS_WIDEN; 800 801 802 DRM_DEBUG_DP("wide_bus_en=%d reg=%#x\n", dp_catalog->wide_bus_en, reg); 803 804 dp_write_p0(catalog, MMSS_DP_INTF_CONFIG, reg); 805 return 0; 806} 807 808void dp_catalog_panel_tpg_enable(struct dp_catalog *dp_catalog, 809 struct drm_display_mode *drm_mode) 810{ 811 struct dp_catalog_private *catalog = container_of(dp_catalog, 812 struct dp_catalog_private, dp_catalog); 813 u32 hsync_period, vsync_period; 814 u32 display_v_start, display_v_end; 815 u32 hsync_start_x, hsync_end_x; 816 u32 v_sync_width; 817 u32 hsync_ctl; 818 u32 display_hctl; 819 820 /* TPG config parameters*/ 821 hsync_period = drm_mode->htotal; 822 vsync_period = drm_mode->vtotal; 823 824 display_v_start = ((drm_mode->vtotal - drm_mode->vsync_start) * 825 hsync_period); 826 display_v_end = ((vsync_period - (drm_mode->vsync_start - 827 drm_mode->vdisplay)) 828 * hsync_period) - 1; 829 830 display_v_start += drm_mode->htotal - drm_mode->hsync_start; 831 display_v_end -= (drm_mode->hsync_start - drm_mode->hdisplay); 832 833 hsync_start_x = drm_mode->htotal - drm_mode->hsync_start; 834 hsync_end_x = hsync_period - (drm_mode->hsync_start - 835 drm_mode->hdisplay) - 1; 836 837 v_sync_width = drm_mode->vsync_end - drm_mode->vsync_start; 838 839 hsync_ctl = (hsync_period << 16) | 840 (drm_mode->hsync_end - drm_mode->hsync_start); 841 display_hctl = (hsync_end_x << 16) | hsync_start_x; 842 843 844 dp_write_p0(catalog, MMSS_DP_INTF_CONFIG, 0x0); 845 dp_write_p0(catalog, MMSS_DP_INTF_HSYNC_CTL, hsync_ctl); 846 dp_write_p0(catalog, MMSS_DP_INTF_VSYNC_PERIOD_F0, vsync_period * 847 hsync_period); 848 dp_write_p0(catalog, MMSS_DP_INTF_VSYNC_PULSE_WIDTH_F0, v_sync_width * 849 hsync_period); 850 dp_write_p0(catalog, MMSS_DP_INTF_VSYNC_PERIOD_F1, 0); 851 dp_write_p0(catalog, MMSS_DP_INTF_VSYNC_PULSE_WIDTH_F1, 0); 852 dp_write_p0(catalog, MMSS_DP_INTF_DISPLAY_HCTL, display_hctl); 853 dp_write_p0(catalog, MMSS_DP_INTF_ACTIVE_HCTL, 0); 854 dp_write_p0(catalog, MMSS_INTF_DISPLAY_V_START_F0, display_v_start); 855 dp_write_p0(catalog, MMSS_DP_INTF_DISPLAY_V_END_F0, display_v_end); 856 dp_write_p0(catalog, MMSS_INTF_DISPLAY_V_START_F1, 0); 857 dp_write_p0(catalog, MMSS_DP_INTF_DISPLAY_V_END_F1, 0); 858 dp_write_p0(catalog, MMSS_DP_INTF_ACTIVE_V_START_F0, 0); 859 dp_write_p0(catalog, MMSS_DP_INTF_ACTIVE_V_END_F0, 0); 860 dp_write_p0(catalog, MMSS_DP_INTF_ACTIVE_V_START_F1, 0); 861 dp_write_p0(catalog, MMSS_DP_INTF_ACTIVE_V_END_F1, 0); 862 dp_write_p0(catalog, MMSS_DP_INTF_POLARITY_CTL, 0); 863 864 dp_write_p0(catalog, MMSS_DP_TPG_MAIN_CONTROL, 865 DP_TPG_CHECKERED_RECT_PATTERN); 866 dp_write_p0(catalog, MMSS_DP_TPG_VIDEO_CONFIG, 867 DP_TPG_VIDEO_CONFIG_BPP_8BIT | 868 DP_TPG_VIDEO_CONFIG_RGB); 869 dp_write_p0(catalog, MMSS_DP_BIST_ENABLE, 870 DP_BIST_ENABLE_DPBIST_EN); 871 dp_write_p0(catalog, MMSS_DP_TIMING_ENGINE_EN, 872 DP_TIMING_ENGINE_EN_EN); 873 drm_dbg_dp(catalog->drm_dev, "%s: enabled tpg\n", __func__); 874} 875 876void dp_catalog_panel_tpg_disable(struct dp_catalog *dp_catalog) 877{ 878 struct dp_catalog_private *catalog = container_of(dp_catalog, 879 struct dp_catalog_private, dp_catalog); 880 881 dp_write_p0(catalog, MMSS_DP_TPG_MAIN_CONTROL, 0x0); 882 dp_write_p0(catalog, MMSS_DP_BIST_ENABLE, 0x0); 883 dp_write_p0(catalog, MMSS_DP_TIMING_ENGINE_EN, 0x0); 884} 885 886struct dp_catalog *dp_catalog_get(struct device *dev, struct dp_io *io) 887{ 888 struct dp_catalog_private *catalog; 889 890 if (!io) { 891 DRM_ERROR("invalid input\n"); 892 return ERR_PTR(-EINVAL); 893 } 894 895 catalog = devm_kzalloc(dev, sizeof(*catalog), GFP_KERNEL); 896 if (!catalog) 897 return ERR_PTR(-ENOMEM); 898 899 catalog->dev = dev; 900 catalog->io = io; 901 902 return &catalog->dp_catalog; 903} 904 905void dp_catalog_audio_get_header(struct dp_catalog *dp_catalog) 906{ 907 struct dp_catalog_private *catalog; 908 u32 (*sdp_map)[DP_AUDIO_SDP_HEADER_MAX]; 909 enum dp_catalog_audio_sdp_type sdp; 910 enum dp_catalog_audio_header_type header; 911 912 if (!dp_catalog) 913 return; 914 915 catalog = container_of(dp_catalog, 916 struct dp_catalog_private, dp_catalog); 917 918 sdp_map = catalog->audio_map; 919 sdp = dp_catalog->sdp_type; 920 header = dp_catalog->sdp_header; 921 922 dp_catalog->audio_data = dp_read_link(catalog, 923 sdp_map[sdp][header]); 924} 925 926void dp_catalog_audio_set_header(struct dp_catalog *dp_catalog) 927{ 928 struct dp_catalog_private *catalog; 929 u32 (*sdp_map)[DP_AUDIO_SDP_HEADER_MAX]; 930 enum dp_catalog_audio_sdp_type sdp; 931 enum dp_catalog_audio_header_type header; 932 u32 data; 933 934 if (!dp_catalog) 935 return; 936 937 catalog = container_of(dp_catalog, 938 struct dp_catalog_private, dp_catalog); 939 940 sdp_map = catalog->audio_map; 941 sdp = dp_catalog->sdp_type; 942 header = dp_catalog->sdp_header; 943 data = dp_catalog->audio_data; 944 945 dp_write_link(catalog, sdp_map[sdp][header], data); 946} 947 948void dp_catalog_audio_config_acr(struct dp_catalog *dp_catalog) 949{ 950 struct dp_catalog_private *catalog; 951 u32 acr_ctrl, select; 952 953 if (!dp_catalog) 954 return; 955 956 catalog = container_of(dp_catalog, 957 struct dp_catalog_private, dp_catalog); 958 959 select = dp_catalog->audio_data; 960 acr_ctrl = select << 4 | BIT(31) | BIT(8) | BIT(14); 961 962 drm_dbg_dp(catalog->drm_dev, "select: %#x, acr_ctrl: %#x\n", 963 select, acr_ctrl); 964 965 dp_write_link(catalog, MMSS_DP_AUDIO_ACR_CTRL, acr_ctrl); 966} 967 968void dp_catalog_audio_enable(struct dp_catalog *dp_catalog) 969{ 970 struct dp_catalog_private *catalog; 971 bool enable; 972 u32 audio_ctrl; 973 974 if (!dp_catalog) 975 return; 976 977 catalog = container_of(dp_catalog, 978 struct dp_catalog_private, dp_catalog); 979 980 enable = !!dp_catalog->audio_data; 981 audio_ctrl = dp_read_link(catalog, MMSS_DP_AUDIO_CFG); 982 983 if (enable) 984 audio_ctrl |= BIT(0); 985 else 986 audio_ctrl &= ~BIT(0); 987 988 drm_dbg_dp(catalog->drm_dev, "dp_audio_cfg = 0x%x\n", audio_ctrl); 989 990 dp_write_link(catalog, MMSS_DP_AUDIO_CFG, audio_ctrl); 991 /* make sure audio engine is disabled */ 992 wmb(); 993} 994 995void dp_catalog_audio_config_sdp(struct dp_catalog *dp_catalog) 996{ 997 struct dp_catalog_private *catalog; 998 u32 sdp_cfg = 0; 999 u32 sdp_cfg2 = 0; 1000 1001 if (!dp_catalog) 1002 return; 1003 1004 catalog = container_of(dp_catalog, 1005 struct dp_catalog_private, dp_catalog); 1006 1007 sdp_cfg = dp_read_link(catalog, MMSS_DP_SDP_CFG); 1008 /* AUDIO_TIMESTAMP_SDP_EN */ 1009 sdp_cfg |= BIT(1); 1010 /* AUDIO_STREAM_SDP_EN */ 1011 sdp_cfg |= BIT(2); 1012 /* AUDIO_COPY_MANAGEMENT_SDP_EN */ 1013 sdp_cfg |= BIT(5); 1014 /* AUDIO_ISRC_SDP_EN */ 1015 sdp_cfg |= BIT(6); 1016 /* AUDIO_INFOFRAME_SDP_EN */ 1017 sdp_cfg |= BIT(20); 1018 1019 drm_dbg_dp(catalog->drm_dev, "sdp_cfg = 0x%x\n", sdp_cfg); 1020 1021 dp_write_link(catalog, MMSS_DP_SDP_CFG, sdp_cfg); 1022 1023 sdp_cfg2 = dp_read_link(catalog, MMSS_DP_SDP_CFG2); 1024 /* IFRM_REGSRC -> Do not use reg values */ 1025 sdp_cfg2 &= ~BIT(0); 1026 /* AUDIO_STREAM_HB3_REGSRC-> Do not use reg values */ 1027 sdp_cfg2 &= ~BIT(1); 1028 1029 drm_dbg_dp(catalog->drm_dev, "sdp_cfg2 = 0x%x\n", sdp_cfg2); 1030 1031 dp_write_link(catalog, MMSS_DP_SDP_CFG2, sdp_cfg2); 1032} 1033 1034void dp_catalog_audio_init(struct dp_catalog *dp_catalog) 1035{ 1036 struct dp_catalog_private *catalog; 1037 1038 static u32 sdp_map[][DP_AUDIO_SDP_HEADER_MAX] = { 1039 { 1040 MMSS_DP_AUDIO_STREAM_0, 1041 MMSS_DP_AUDIO_STREAM_1, 1042 MMSS_DP_AUDIO_STREAM_1, 1043 }, 1044 { 1045 MMSS_DP_AUDIO_TIMESTAMP_0, 1046 MMSS_DP_AUDIO_TIMESTAMP_1, 1047 MMSS_DP_AUDIO_TIMESTAMP_1, 1048 }, 1049 { 1050 MMSS_DP_AUDIO_INFOFRAME_0, 1051 MMSS_DP_AUDIO_INFOFRAME_1, 1052 MMSS_DP_AUDIO_INFOFRAME_1, 1053 }, 1054 { 1055 MMSS_DP_AUDIO_COPYMANAGEMENT_0, 1056 MMSS_DP_AUDIO_COPYMANAGEMENT_1, 1057 MMSS_DP_AUDIO_COPYMANAGEMENT_1, 1058 }, 1059 { 1060 MMSS_DP_AUDIO_ISRC_0, 1061 MMSS_DP_AUDIO_ISRC_1, 1062 MMSS_DP_AUDIO_ISRC_1, 1063 }, 1064 }; 1065 1066 if (!dp_catalog) 1067 return; 1068 1069 catalog = container_of(dp_catalog, 1070 struct dp_catalog_private, dp_catalog); 1071 1072 catalog->audio_map = sdp_map; 1073} 1074 1075void dp_catalog_audio_sfe_level(struct dp_catalog *dp_catalog) 1076{ 1077 struct dp_catalog_private *catalog; 1078 u32 mainlink_levels, safe_to_exit_level; 1079 1080 if (!dp_catalog) 1081 return; 1082 1083 catalog = container_of(dp_catalog, 1084 struct dp_catalog_private, dp_catalog); 1085 1086 safe_to_exit_level = dp_catalog->audio_data; 1087 mainlink_levels = dp_read_link(catalog, REG_DP_MAINLINK_LEVELS); 1088 mainlink_levels &= 0xFE0; 1089 mainlink_levels |= safe_to_exit_level; 1090 1091 drm_dbg_dp(catalog->drm_dev, 1092 "mainlink_level = 0x%x, safe_to_exit_level = 0x%x\n", 1093 mainlink_levels, safe_to_exit_level); 1094 1095 dp_write_link(catalog, REG_DP_MAINLINK_LEVELS, mainlink_levels); 1096}