blob: a318568f5ff4f22898c21f4bd195be306de2f5bb [file] [log] [blame]
Simon Glass59dd5aa2015-04-14 21:03:41 -06001/*
2 * Copyright (c) 2011-2013, NVIDIA Corporation.
3 * Copyright 2014 Google Inc.
4 *
5 * SPDX-License-Identifier: GPL-2.0
6 */
7
8#include <common.h>
9#include <displayport.h>
10#include <dm.h>
11#include <div64.h>
12#include <errno.h>
13#include <fdtdec.h>
14#include <asm/io.h>
15#include <asm/arch-tegra/dc.h>
16#include "displayport.h"
17#include "edid.h"
18#include "sor.h"
19
20DECLARE_GLOBAL_DATA_PTR;
21
22struct tegra_dp_plat {
23 ulong base;
24};
25
26struct tegra_dp_priv {
27 struct dpaux_ctlr *regs;
28 struct tegra_dc_sor_data *sor;
29 u8 revision;
30 int enabled;
31};
32
33struct tegra_dp_priv dp_data;
34
35static inline u32 tegra_dpaux_readl(struct tegra_dp_priv *dp, u32 reg)
36{
37 return readl((u32 *)dp->regs + reg);
38}
39
40static inline void tegra_dpaux_writel(struct tegra_dp_priv *dp, u32 reg,
41 u32 val)
42{
43 writel(val, (u32 *)dp->regs + reg);
44}
45
46static inline u32 tegra_dc_dpaux_poll_register(struct tegra_dp_priv *dp,
47 u32 reg, u32 mask, u32 exp_val,
48 u32 poll_interval_us,
49 u32 timeout_us)
50{
51 u32 reg_val = 0;
52 u32 temp = timeout_us;
53
54 do {
55 udelay(poll_interval_us);
56 reg_val = tegra_dpaux_readl(dp, reg);
57 if (timeout_us > poll_interval_us)
58 timeout_us -= poll_interval_us;
59 else
60 break;
61 } while ((reg_val & mask) != exp_val);
62
63 if ((reg_val & mask) == exp_val)
64 return 0; /* success */
65 debug("dpaux_poll_register 0x%x: timeout: (reg_val)0x%08x & (mask)0x%08x != (exp_val)0x%08x\n",
66 reg, reg_val, mask, exp_val);
67 return temp;
68}
69
70static inline int tegra_dpaux_wait_transaction(struct tegra_dp_priv *dp)
71{
72 /* According to DP spec, each aux transaction needs to finish
73 within 40ms. */
74 if (tegra_dc_dpaux_poll_register(dp, DPAUX_DP_AUXCTL,
75 DPAUX_DP_AUXCTL_TRANSACTREQ_MASK,
76 DPAUX_DP_AUXCTL_TRANSACTREQ_DONE,
77 100, DP_AUX_TIMEOUT_MS * 1000) != 0) {
78 debug("dp: DPAUX transaction timeout\n");
79 return -1;
80 }
81 return 0;
82}
83
84static int tegra_dc_dpaux_write_chunk(struct tegra_dp_priv *dp, u32 cmd,
85 u32 addr, u8 *data, u32 *size,
86 u32 *aux_stat)
87{
88 int i;
89 u32 reg_val;
90 u32 timeout_retries = DP_AUX_TIMEOUT_MAX_TRIES;
91 u32 defer_retries = DP_AUX_DEFER_MAX_TRIES;
92 u32 temp_data;
93
94 if (*size > DP_AUX_MAX_BYTES)
95 return -1; /* only write one chunk of data */
96
97 /* Make sure the command is write command */
98 switch (cmd) {
99 case DPAUX_DP_AUXCTL_CMD_I2CWR:
100 case DPAUX_DP_AUXCTL_CMD_MOTWR:
101 case DPAUX_DP_AUXCTL_CMD_AUXWR:
102 break;
103 default:
104 debug("dp: aux write cmd 0x%x is invalid\n", cmd);
105 return -EINVAL;
106 }
107
108 tegra_dpaux_writel(dp, DPAUX_DP_AUXADDR, addr);
109 for (i = 0; i < DP_AUX_MAX_BYTES / 4; ++i) {
110 memcpy(&temp_data, data, 4);
111 tegra_dpaux_writel(dp, DPAUX_DP_AUXDATA_WRITE_W(i), temp_data);
112 data += 4;
113 }
114
115 reg_val = tegra_dpaux_readl(dp, DPAUX_DP_AUXCTL);
116 reg_val &= ~DPAUX_DP_AUXCTL_CMD_MASK;
117 reg_val |= cmd;
118 reg_val &= ~DPAUX_DP_AUXCTL_CMDLEN_FIELD;
119 reg_val |= ((*size - 1) << DPAUX_DP_AUXCTL_CMDLEN_SHIFT);
120
121 while ((timeout_retries > 0) && (defer_retries > 0)) {
122 if ((timeout_retries != DP_AUX_TIMEOUT_MAX_TRIES) ||
123 (defer_retries != DP_AUX_DEFER_MAX_TRIES))
124 udelay(1);
125
126 reg_val |= DPAUX_DP_AUXCTL_TRANSACTREQ_PENDING;
127 tegra_dpaux_writel(dp, DPAUX_DP_AUXCTL, reg_val);
128
129 if (tegra_dpaux_wait_transaction(dp))
130 debug("dp: aux write transaction timeout\n");
131
132 *aux_stat = tegra_dpaux_readl(dp, DPAUX_DP_AUXSTAT);
133
134 if ((*aux_stat & DPAUX_DP_AUXSTAT_TIMEOUT_ERROR_PENDING) ||
135 (*aux_stat & DPAUX_DP_AUXSTAT_RX_ERROR_PENDING) ||
136 (*aux_stat & DPAUX_DP_AUXSTAT_SINKSTAT_ERROR_PENDING) ||
137 (*aux_stat & DPAUX_DP_AUXSTAT_NO_STOP_ERROR_PENDING)) {
138 if (timeout_retries-- > 0) {
139 debug("dp: aux write retry (0x%x) -- %d\n",
140 *aux_stat, timeout_retries);
141 /* clear the error bits */
142 tegra_dpaux_writel(dp, DPAUX_DP_AUXSTAT,
143 *aux_stat);
144 continue;
145 } else {
146 debug("dp: aux write got error (0x%x)\n",
147 *aux_stat);
148 return -ETIMEDOUT;
149 }
150 }
151
152 if ((*aux_stat & DPAUX_DP_AUXSTAT_REPLYTYPE_I2CDEFER) ||
153 (*aux_stat & DPAUX_DP_AUXSTAT_REPLYTYPE_DEFER)) {
154 if (defer_retries-- > 0) {
155 debug("dp: aux write defer (0x%x) -- %d\n",
156 *aux_stat, defer_retries);
157 /* clear the error bits */
158 tegra_dpaux_writel(dp, DPAUX_DP_AUXSTAT,
159 *aux_stat);
160 continue;
161 } else {
162 debug("dp: aux write defer exceeds max retries (0x%x)\n",
163 *aux_stat);
164 return -ETIMEDOUT;
165 }
166 }
167
168 if ((*aux_stat & DPAUX_DP_AUXSTAT_REPLYTYPE_MASK) ==
169 DPAUX_DP_AUXSTAT_REPLYTYPE_ACK) {
170 *size = ((*aux_stat) & DPAUX_DP_AUXSTAT_REPLY_M_MASK);
171 return 0;
172 } else {
173 debug("dp: aux write failed (0x%x)\n", *aux_stat);
174 return -EIO;
175 }
176 }
177 /* Should never come to here */
178 return -EIO;
179}
180
181static int tegra_dc_dpaux_read_chunk(struct tegra_dp_priv *dp, u32 cmd,
182 u32 addr, u8 *data, u32 *size,
183 u32 *aux_stat)
184{
185 u32 reg_val;
186 u32 timeout_retries = DP_AUX_TIMEOUT_MAX_TRIES;
187 u32 defer_retries = DP_AUX_DEFER_MAX_TRIES;
188
189 if (*size > DP_AUX_MAX_BYTES) {
190 debug("only read one chunk\n");
191 return -EIO; /* only read one chunk */
192 }
193
194 /* Check to make sure the command is read command */
195 switch (cmd) {
196 case DPAUX_DP_AUXCTL_CMD_I2CRD:
197 case DPAUX_DP_AUXCTL_CMD_I2CREQWSTAT:
198 case DPAUX_DP_AUXCTL_CMD_MOTRD:
199 case DPAUX_DP_AUXCTL_CMD_AUXRD:
200 break;
201 default:
202 debug("dp: aux read cmd 0x%x is invalid\n", cmd);
203 return -EIO;
204 }
205
206 *aux_stat = tegra_dpaux_readl(dp, DPAUX_DP_AUXSTAT);
207 if (!(*aux_stat & DPAUX_DP_AUXSTAT_HPD_STATUS_PLUGGED)) {
208 debug("dp: HPD is not detected\n");
209 return -EIO;
210 }
211
212 tegra_dpaux_writel(dp, DPAUX_DP_AUXADDR, addr);
213
214 reg_val = tegra_dpaux_readl(dp, DPAUX_DP_AUXCTL);
215 reg_val &= ~DPAUX_DP_AUXCTL_CMD_MASK;
216 reg_val |= cmd;
217 reg_val &= ~DPAUX_DP_AUXCTL_CMDLEN_FIELD;
218 reg_val |= ((*size - 1) << DPAUX_DP_AUXCTL_CMDLEN_SHIFT);
219 while ((timeout_retries > 0) && (defer_retries > 0)) {
220 if ((timeout_retries != DP_AUX_TIMEOUT_MAX_TRIES) ||
221 (defer_retries != DP_AUX_DEFER_MAX_TRIES))
222 udelay(DP_DPCP_RETRY_SLEEP_NS * 2);
223
224 reg_val |= DPAUX_DP_AUXCTL_TRANSACTREQ_PENDING;
225 tegra_dpaux_writel(dp, DPAUX_DP_AUXCTL, reg_val);
226
227 if (tegra_dpaux_wait_transaction(dp))
228 debug("dp: aux read transaction timeout\n");
229
230 *aux_stat = tegra_dpaux_readl(dp, DPAUX_DP_AUXSTAT);
231
232 if ((*aux_stat & DPAUX_DP_AUXSTAT_TIMEOUT_ERROR_PENDING) ||
233 (*aux_stat & DPAUX_DP_AUXSTAT_RX_ERROR_PENDING) ||
234 (*aux_stat & DPAUX_DP_AUXSTAT_SINKSTAT_ERROR_PENDING) ||
235 (*aux_stat & DPAUX_DP_AUXSTAT_NO_STOP_ERROR_PENDING)) {
236 if (timeout_retries-- > 0) {
237 debug("dp: aux read retry (0x%x) -- %d\n",
238 *aux_stat, timeout_retries);
239 /* clear the error bits */
240 tegra_dpaux_writel(dp, DPAUX_DP_AUXSTAT,
241 *aux_stat);
242 continue; /* retry */
243 } else {
244 debug("dp: aux read got error (0x%x)\n",
245 *aux_stat);
246 return -ETIMEDOUT;
247 }
248 }
249
250 if ((*aux_stat & DPAUX_DP_AUXSTAT_REPLYTYPE_I2CDEFER) ||
251 (*aux_stat & DPAUX_DP_AUXSTAT_REPLYTYPE_DEFER)) {
252 if (defer_retries-- > 0) {
253 debug("dp: aux read defer (0x%x) -- %d\n",
254 *aux_stat, defer_retries);
255 /* clear the error bits */
256 tegra_dpaux_writel(dp, DPAUX_DP_AUXSTAT,
257 *aux_stat);
258 continue;
259 } else {
260 debug("dp: aux read defer exceeds max retries (0x%x)\n",
261 *aux_stat);
262 return -ETIMEDOUT;
263 }
264 }
265
266 if ((*aux_stat & DPAUX_DP_AUXSTAT_REPLYTYPE_MASK) ==
267 DPAUX_DP_AUXSTAT_REPLYTYPE_ACK) {
268 int i;
269 u32 temp_data[4];
270
271 for (i = 0; i < DP_AUX_MAX_BYTES / 4; ++i)
272 temp_data[i] = tegra_dpaux_readl(dp,
273 DPAUX_DP_AUXDATA_READ_W(i));
274
275 *size = ((*aux_stat) & DPAUX_DP_AUXSTAT_REPLY_M_MASK);
276 memcpy(data, temp_data, *size);
277
278 return 0;
279 } else {
280 debug("dp: aux read failed (0x%x\n", *aux_stat);
281 return -EIO;
282 }
283 }
284 /* Should never come to here */
285 debug("%s: can't\n", __func__);
286
287 return -EIO;
288}
289
290static int tegra_dc_dpaux_read(struct tegra_dp_priv *dp, u32 cmd, u32 addr,
291 u8 *data, u32 *size, u32 *aux_stat)
292{
293 u32 finished = 0;
294 u32 cur_size;
295 int ret = 0;
296
297 do {
298 cur_size = *size - finished;
299 if (cur_size > DP_AUX_MAX_BYTES)
300 cur_size = DP_AUX_MAX_BYTES;
301
302 ret = tegra_dc_dpaux_read_chunk(dp, cmd, addr,
303 data, &cur_size, aux_stat);
304 if (ret)
305 break;
306
307 /* cur_size should be the real size returned */
308 addr += cur_size;
309 data += cur_size;
310 finished += cur_size;
311
312 } while (*size > finished);
313 *size = finished;
314
315 return ret;
316}
317
318static int tegra_dc_dp_dpcd_read(struct tegra_dp_priv *dp, u32 cmd,
319 u8 *data_ptr)
320{
321 u32 size = 1;
322 u32 status = 0;
323 int ret;
324
325 ret = tegra_dc_dpaux_read_chunk(dp, DPAUX_DP_AUXCTL_CMD_AUXRD,
326 cmd, data_ptr, &size, &status);
327 if (ret) {
328 debug("dp: Failed to read DPCD data. CMD 0x%x, Status 0x%x\n",
329 cmd, status);
330 }
331
332 return ret;
333}
334
335static int tegra_dc_dp_dpcd_write(struct tegra_dp_priv *dp, u32 cmd,
336 u8 data)
337{
338 u32 size = 1;
339 u32 status = 0;
340 int ret;
341
342 ret = tegra_dc_dpaux_write_chunk(dp, DPAUX_DP_AUXCTL_CMD_AUXWR,
343 cmd, &data, &size, &status);
344 if (ret) {
345 debug("dp: Failed to write DPCD data. CMD 0x%x, Status 0x%x\n",
346 cmd, status);
347 }
348
349 return ret;
350}
351
352static int tegra_dc_i2c_aux_read(struct tegra_dp_priv *dp, u32 i2c_addr,
353 u8 addr, u8 *data, u32 size, u32 *aux_stat)
354{
355 u32 finished = 0;
356 int ret = 0;
357
358 do {
359 u32 cur_size = min((u32)DP_AUX_MAX_BYTES, size - finished);
360
361 u32 len = 1;
362 ret = tegra_dc_dpaux_write_chunk(
363 dp, DPAUX_DP_AUXCTL_CMD_MOTWR, i2c_addr,
364 &addr, &len, aux_stat);
365 if (ret) {
366 debug("%s: error sending address to read.\n",
367 __func__);
368 return ret;
369 }
370
371 ret = tegra_dc_dpaux_read_chunk(
372 dp, DPAUX_DP_AUXCTL_CMD_I2CRD, i2c_addr,
373 data, &cur_size, aux_stat);
374 if (ret) {
375 debug("%s: error reading data.\n", __func__);
376 return ret;
377 }
378
379 /* cur_size should be the real size returned */
380 addr += cur_size;
381 data += cur_size;
382 finished += cur_size;
383 } while (size > finished);
384
385 return finished;
386}
387
388static void tegra_dc_dpaux_enable(struct tegra_dp_priv *dp)
389{
390 /* clear interrupt */
391 tegra_dpaux_writel(dp, DPAUX_INTR_AUX, 0xffffffff);
392 /* do not enable interrupt for now. Enable them when Isr in place */
393 tegra_dpaux_writel(dp, DPAUX_INTR_EN_AUX, 0x0);
394
395 tegra_dpaux_writel(dp, DPAUX_HYBRID_PADCTL,
396 DPAUX_HYBRID_PADCTL_AUX_DRVZ_OHM_50 |
397 DPAUX_HYBRID_PADCTL_AUX_CMH_V0_70 |
398 0x18 << DPAUX_HYBRID_PADCTL_AUX_DRVI_SHIFT |
399 DPAUX_HYBRID_PADCTL_AUX_INPUT_RCV_ENABLE);
400
401 tegra_dpaux_writel(dp, DPAUX_HYBRID_SPARE,
402 DPAUX_HYBRID_SPARE_PAD_PWR_POWERUP);
403}
404
405#ifdef DEBUG
406static void tegra_dc_dp_dump_link_cfg(struct tegra_dp_priv *dp,
407 const struct tegra_dp_link_config *link_cfg)
408{
409 debug("DP config: cfg_name cfg_value\n");
410 debug(" Lane Count %d\n",
411 link_cfg->max_lane_count);
412 debug(" SupportEnhancedFraming %s\n",
413 link_cfg->support_enhanced_framing ? "Y" : "N");
414 debug(" Bandwidth %d\n",
415 link_cfg->max_link_bw);
416 debug(" bpp %d\n",
417 link_cfg->bits_per_pixel);
418 debug(" EnhancedFraming %s\n",
419 link_cfg->enhanced_framing ? "Y" : "N");
420 debug(" Scramble_enabled %s\n",
421 link_cfg->scramble_ena ? "Y" : "N");
422 debug(" LinkBW %d\n",
423 link_cfg->link_bw);
424 debug(" lane_count %d\n",
425 link_cfg->lane_count);
426 debug(" activespolarity %d\n",
427 link_cfg->activepolarity);
428 debug(" active_count %d\n",
429 link_cfg->active_count);
430 debug(" tu_size %d\n",
431 link_cfg->tu_size);
432 debug(" active_frac %d\n",
433 link_cfg->active_frac);
434 debug(" watermark %d\n",
435 link_cfg->watermark);
436 debug(" hblank_sym %d\n",
437 link_cfg->hblank_sym);
438 debug(" vblank_sym %d\n",
439 link_cfg->vblank_sym);
440}
441#endif
442
443/*
444 * Calcuate if given cfg can meet the mode request.
445 * Return 0 if mode is possible, -1 otherwise
446 */
447static int tegra_dc_dp_calc_config(struct tegra_dp_priv *dp,
448 const struct display_timing *timing,
449 struct tegra_dp_link_config *link_cfg)
450{
451 const u32 link_rate = 27 * link_cfg->link_bw * 1000 * 1000;
452 const u64 f = 100000; /* precision factor */
453 u32 num_linkclk_line; /* Number of link clocks per line */
454 u64 ratio_f; /* Ratio of incoming to outgoing data rate */
455 u64 frac_f;
456 u64 activesym_f; /* Activesym per TU */
457 u64 activecount_f;
458 u32 activecount;
459 u32 activepolarity;
460 u64 approx_value_f;
461 u32 activefrac = 0;
462 u64 accumulated_error_f = 0;
463 u32 lowest_neg_activecount = 0;
464 u32 lowest_neg_activepolarity = 0;
465 u32 lowest_neg_tusize = 64;
466 u32 num_symbols_per_line;
467 u64 lowest_neg_activefrac = 0;
468 u64 lowest_neg_error_f = 64 * f;
469 u64 watermark_f;
470 int i;
471 int neg;
472
473 if (!link_rate || !link_cfg->lane_count || !timing->pixelclock.typ ||
474 !link_cfg->bits_per_pixel)
475 return -1;
476
477 if ((u64)timing->pixelclock.typ * link_cfg->bits_per_pixel >=
478 (u64)link_rate * 8 * link_cfg->lane_count)
479 return -1;
480
481 num_linkclk_line = (u32)(lldiv(link_rate * timing->hactive.typ,
482 timing->pixelclock.typ));
483
484 ratio_f = (u64)timing->pixelclock.typ * link_cfg->bits_per_pixel * f;
485 ratio_f /= 8;
486 do_div(ratio_f, link_rate * link_cfg->lane_count);
487
488 for (i = 64; i >= 32; --i) {
489 activesym_f = ratio_f * i;
490 activecount_f = lldiv(activesym_f, (u32)f) * f;
491 frac_f = activesym_f - activecount_f;
492 activecount = (u32)(lldiv(activecount_f, (u32)f));
493
494 if (frac_f < (lldiv(f, 2))) /* fraction < 0.5 */
495 activepolarity = 0;
496 else {
497 activepolarity = 1;
498 frac_f = f - frac_f;
499 }
500
501 if (frac_f != 0) {
502 /* warning: frac_f should be 64-bit */
503 frac_f = lldiv(f * f, frac_f); /* 1 / fraction */
504 if (frac_f > (15 * f))
505 activefrac = activepolarity ? 1 : 15;
506 else
507 activefrac = activepolarity ?
508 (u32)lldiv(frac_f, (u32)f) + 1 :
509 (u32)lldiv(frac_f, (u32)f);
510 }
511
512 if (activefrac == 1)
513 activepolarity = 0;
514
515 if (activepolarity == 1)
516 approx_value_f = activefrac ? lldiv(
517 (activecount_f + (activefrac * f - f) * f),
518 (activefrac * f)) :
519 activecount_f + f;
520 else
521 approx_value_f = activefrac ?
522 activecount_f + lldiv(f, activefrac) :
523 activecount_f;
524
525 if (activesym_f < approx_value_f) {
526 accumulated_error_f = num_linkclk_line *
527 lldiv(approx_value_f - activesym_f, i);
528 neg = 1;
529 } else {
530 accumulated_error_f = num_linkclk_line *
531 lldiv(activesym_f - approx_value_f, i);
532 neg = 0;
533 }
534
535 if ((neg && (lowest_neg_error_f > accumulated_error_f)) ||
536 (accumulated_error_f == 0)) {
537 lowest_neg_error_f = accumulated_error_f;
538 lowest_neg_tusize = i;
539 lowest_neg_activecount = activecount;
540 lowest_neg_activepolarity = activepolarity;
541 lowest_neg_activefrac = activefrac;
542
543 if (accumulated_error_f == 0)
544 break;
545 }
546 }
547
548 if (lowest_neg_activefrac == 0) {
549 link_cfg->activepolarity = 0;
550 link_cfg->active_count = lowest_neg_activepolarity ?
551 lowest_neg_activecount : lowest_neg_activecount - 1;
552 link_cfg->tu_size = lowest_neg_tusize;
553 link_cfg->active_frac = 1;
554 } else {
555 link_cfg->activepolarity = lowest_neg_activepolarity;
556 link_cfg->active_count = (u32)lowest_neg_activecount;
557 link_cfg->tu_size = lowest_neg_tusize;
558 link_cfg->active_frac = (u32)lowest_neg_activefrac;
559 }
560
561 watermark_f = lldiv(ratio_f * link_cfg->tu_size * (f - ratio_f), f);
562 link_cfg->watermark = (u32)(lldiv(watermark_f + lowest_neg_error_f,
563 f)) + link_cfg->bits_per_pixel / 4 - 1;
564 num_symbols_per_line = (timing->hactive.typ *
565 link_cfg->bits_per_pixel) /
566 (8 * link_cfg->lane_count);
567
568 if (link_cfg->watermark > 30) {
569 debug("dp: sor setting: unable to get a good tusize, force watermark to 30\n");
570 link_cfg->watermark = 30;
571 return -1;
572 } else if (link_cfg->watermark > num_symbols_per_line) {
573 debug("dp: sor setting: force watermark to the number of symbols in the line\n");
574 link_cfg->watermark = num_symbols_per_line;
575 return -1;
576 }
577
578 /*
579 * Refer to dev_disp.ref for more information.
580 * # symbols/hblank = ((SetRasterBlankEnd.X + SetRasterSize.Width -
581 * SetRasterBlankStart.X - 7) * link_clk / pclk)
582 * - 3 * enhanced_framing - Y
583 * where Y = (# lanes == 4) 3 : (# lanes == 2) ? 6 : 12
584 */
585 link_cfg->hblank_sym = (int)lldiv(((uint64_t)timing->hback_porch.typ +
586 timing->hfront_porch.typ + timing->hsync_len.typ - 7) *
587 link_rate, timing->pixelclock.typ) -
588 3 * link_cfg->enhanced_framing -
589 (12 / link_cfg->lane_count);
590
591 if (link_cfg->hblank_sym < 0)
592 link_cfg->hblank_sym = 0;
593
594
595 /*
596 * Refer to dev_disp.ref for more information.
597 * # symbols/vblank = ((SetRasterBlankStart.X -
598 * SetRasterBlankEen.X - 25) * link_clk / pclk)
599 * - Y - 1;
600 * where Y = (# lanes == 4) 12 : (# lanes == 2) ? 21 : 39
601 */
602 link_cfg->vblank_sym = (int)lldiv(((uint64_t)timing->hactive.typ - 25)
603 * link_rate, timing->pixelclock.typ) - (36 /
604 link_cfg->lane_count) - 4;
605
606 if (link_cfg->vblank_sym < 0)
607 link_cfg->vblank_sym = 0;
608
609 link_cfg->is_valid = 1;
610#ifdef DEBUG
611 tegra_dc_dp_dump_link_cfg(dp, link_cfg);
612#endif
613
614 return 0;
615}
616
617static int tegra_dc_dp_init_max_link_cfg(
618 const struct display_timing *timing,
619 struct tegra_dp_priv *dp,
620 struct tegra_dp_link_config *link_cfg)
621{
622 const int drive_current = 0x40404040;
623 const int preemphasis = 0x0f0f0f0f;
624 const int postcursor = 0;
625 u8 dpcd_data;
626 int ret;
627
628 ret = tegra_dc_dp_dpcd_read(dp, DP_MAX_LANE_COUNT, &dpcd_data);
629 if (ret)
630 return ret;
631 link_cfg->max_lane_count = dpcd_data & DP_MAX_LANE_COUNT_MASK;
632
633 link_cfg->support_enhanced_framing =
634 (dpcd_data & DP_MAX_LANE_COUNT_ENHANCED_FRAMING_YES) ?
635 1 : 0;
636
637 ret = tegra_dc_dp_dpcd_read(dp, DP_MAX_DOWNSPREAD, &dpcd_data);
638 if (ret)
639 return ret;
640 link_cfg->downspread = (dpcd_data & DP_MAX_DOWNSPREAD_VAL_0_5_PCT) ?
641 1 : 0;
642
643 ret = tegra_dc_dp_dpcd_read(dp, DP_MAX_LINK_RATE,
644 &link_cfg->max_link_bw);
645 if (ret)
646 return ret;
647
648 /*
649 * Set to a high value for link training and attach.
650 * Will be re-programmed when dp is enabled.
651 */
652 link_cfg->drive_current = drive_current;
653 link_cfg->preemphasis = preemphasis;
654 link_cfg->postcursor = postcursor;
655
656 ret = tegra_dc_dp_dpcd_read(dp, DP_EDP_CONFIGURATION_CAP, &dpcd_data);
657 if (ret)
658 return ret;
659
660 link_cfg->alt_scramber_reset_cap =
661 (dpcd_data & DP_EDP_CONFIGURATION_CAP_ASC_RESET_YES) ?
662 1 : 0;
663 link_cfg->only_enhanced_framing =
664 (dpcd_data & DP_EDP_CONFIGURATION_CAP_FRAMING_CHANGE_YES) ?
665 1 : 0;
666
667 link_cfg->lane_count = link_cfg->max_lane_count;
668 link_cfg->link_bw = link_cfg->max_link_bw;
669 link_cfg->enhanced_framing = link_cfg->support_enhanced_framing;
670
671 tegra_dc_dp_calc_config(dp, timing, link_cfg);
672 return 0;
673}
674
675static int tegra_dc_dp_set_assr(struct tegra_dp_priv *dp,
676 struct tegra_dc_sor_data *sor, int ena)
677{
678 int ret;
679
680 u8 dpcd_data = ena ?
681 DP_MAIN_LINK_CHANNEL_CODING_SET_ASC_RESET_ENABLE :
682 DP_MAIN_LINK_CHANNEL_CODING_SET_ASC_RESET_DISABLE;
683
684 ret = tegra_dc_dp_dpcd_write(dp, DP_EDP_CONFIGURATION_SET,
685 dpcd_data);
686 if (ret)
687 return ret;
688
689 /* Also reset the scrambler to 0xfffe */
690 tegra_dc_sor_set_internal_panel(sor, ena);
691 return 0;
692}
693
694static int tegra_dp_set_link_bandwidth(struct tegra_dp_priv *dp,
695 struct tegra_dc_sor_data *sor,
696 u8 link_bw)
697{
698 tegra_dc_sor_set_link_bandwidth(sor, link_bw);
699
700 /* Sink side */
701 return tegra_dc_dp_dpcd_write(dp, DP_LINK_BW_SET, link_bw);
702}
703
704static int tegra_dp_set_lane_count(struct tegra_dp_priv *dp,
705 const struct tegra_dp_link_config *link_cfg,
706 struct tegra_dc_sor_data *sor)
707{
708 u8 dpcd_data;
709 int ret;
710
711 /* check if panel support enhanched_framing */
712 dpcd_data = link_cfg->lane_count;
713 if (link_cfg->enhanced_framing)
714 dpcd_data |= DP_LANE_COUNT_SET_ENHANCEDFRAMING_T;
715 ret = tegra_dc_dp_dpcd_write(dp, DP_LANE_COUNT_SET, dpcd_data);
716 if (ret)
717 return ret;
718
719 tegra_dc_sor_set_lane_count(sor, link_cfg->lane_count);
720
721 /* Also power down lanes that will not be used */
722 return 0;
723}
724
725static int tegra_dc_dp_link_trained(struct tegra_dp_priv *dp,
726 const struct tegra_dp_link_config *cfg)
727{
728 u32 lane;
729 u8 mask;
730 u8 data;
731 int ret;
732
733 for (lane = 0; lane < cfg->lane_count; ++lane) {
734 ret = tegra_dc_dp_dpcd_read(dp, (lane / 2) ?
735 DP_LANE2_3_STATUS : DP_LANE0_1_STATUS,
736 &data);
737 if (ret)
738 return ret;
739 mask = (lane & 1) ?
740 NV_DPCD_STATUS_LANEXPLUS1_CR_DONE_YES |
741 NV_DPCD_STATUS_LANEXPLUS1_CHN_EQ_DONE_YES |
742 NV_DPCD_STATUS_LANEXPLUS1_SYMBOL_LOCKED_YES :
743 DP_LANE_CR_DONE |
744 DP_LANE_CHANNEL_EQ_DONE |
745 DP_LANE_SYMBOL_LOCKED;
746 if ((data & mask) != mask)
747 return -1;
748 }
749 return 0;
750}
751
752/*
753 * All link training functions are ported from kernel dc driver.
754 * See more details at drivers/video/tegra/dc/dp.c
755 */
756static int tegra_dc_dp_fast_link_training(struct tegra_dp_priv *dp,
757 const struct tegra_dp_link_config *link_cfg,
758 struct tegra_dc_sor_data *sor)
759{
760 u8 link_bw;
761 u8 lane_count;
762 u16 data16;
763 u32 data32;
764 u32 size;
765 u32 status;
766 int j;
767 u32 mask = 0xffff >> ((4 - link_cfg->lane_count) * 4);
768
769 tegra_dc_sor_set_lane_parm(sor, link_cfg);
770 tegra_dc_dp_dpcd_write(dp, DP_MAIN_LINK_CHANNEL_CODING_SET,
771 DP_SET_ANSI_8B10B);
772
773 /* Send TP1 */
774 tegra_dc_sor_set_dp_linkctl(sor, 1, training_pattern_1, link_cfg);
775 tegra_dc_dp_dpcd_write(dp, DP_TRAINING_PATTERN_SET,
776 DP_TRAINING_PATTERN_1);
777
778 for (j = 0; j < link_cfg->lane_count; ++j)
779 tegra_dc_dp_dpcd_write(dp, DP_TRAINING_LANE0_SET + j, 0x24);
780 udelay(520);
781
782 size = sizeof(data16);
783 tegra_dc_dpaux_read(dp, DPAUX_DP_AUXCTL_CMD_AUXRD,
784 DP_LANE0_1_STATUS, (u8 *)&data16, &size, &status);
785 status = mask & 0x1111;
786 if ((data16 & status) != status) {
787 debug("dp: Link training error for TP1 (%#x, status %#x)\n",
788 data16, status);
789 return -EFAULT;
790 }
791
792 /* enable ASSR */
793 tegra_dc_dp_set_assr(dp, sor, link_cfg->scramble_ena);
794 tegra_dc_sor_set_dp_linkctl(sor, 1, training_pattern_3, link_cfg);
795
796 tegra_dc_dp_dpcd_write(dp, DP_TRAINING_PATTERN_SET,
797 link_cfg->link_bw == 20 ? 0x23 : 0x22);
798 for (j = 0; j < link_cfg->lane_count; ++j)
799 tegra_dc_dp_dpcd_write(dp, DP_TRAINING_LANE0_SET + j, 0x24);
800 udelay(520);
801
802 size = sizeof(data32);
803 tegra_dc_dpaux_read(dp, DPAUX_DP_AUXCTL_CMD_AUXRD, DP_LANE0_1_STATUS,
804 (u8 *)&data32, &size, &status);
805 if ((data32 & mask) != (0x7777 & mask)) {
806 debug("dp: Link training error for TP2/3 (0x%x)\n", data32);
807 return -EFAULT;
808 }
809
810 tegra_dc_sor_set_dp_linkctl(sor, 1, training_pattern_disabled,
811 link_cfg);
812 tegra_dc_dp_dpcd_write(dp, DP_TRAINING_PATTERN_SET, 0);
813
814 if (tegra_dc_dp_link_trained(dp, link_cfg)) {
815 tegra_dc_sor_read_link_config(sor, &link_bw, &lane_count);
816 debug("Fast link training failed, link bw %d, lane # %d\n",
817 link_bw, lane_count);
818 return -EFAULT;
819 }
820
821 debug("Fast link training succeeded, link bw %d, lane %d\n",
822 link_cfg->link_bw, link_cfg->lane_count);
823
824 return 0;
825}
826
827static int tegra_dp_link_config(struct tegra_dp_priv *dp,
828 const struct tegra_dp_link_config *link_cfg,
829 struct tegra_dc_sor_data *sor)
830{
831 u8 dpcd_data;
832 u8 link_bw;
833 u8 lane_count;
834 u32 retry;
835 int ret;
836
837 if (link_cfg->lane_count == 0) {
838 debug("dp: error: lane count is 0. Can not set link config.\n");
839 return -1;
840 }
841
842 /* Set power state if it is not in normal level */
843 ret = tegra_dc_dp_dpcd_read(dp, DP_SET_POWER, &dpcd_data);
844 if (ret)
845 return ret;
846 if (dpcd_data == DP_SET_POWER_D3) {
847 dpcd_data = DP_SET_POWER_D0;
848 retry = 3; /* DP spec requires 3 retries */
849 do {
850 ret = tegra_dc_dp_dpcd_write(dp,
851 DP_SET_POWER, dpcd_data);
852 } while ((--retry > 0) && ret);
853 if (ret) {
854 debug("dp: Failed to set DP panel power\n");
855 return ret;
856 }
857 }
858
859 /* Enable ASSR if possible */
860 if (link_cfg->alt_scramber_reset_cap) {
861 ret = tegra_dc_dp_set_assr(dp, sor, 1);
862 if (ret)
863 return ret;
864 }
865
866 ret = tegra_dp_set_link_bandwidth(dp, sor, link_cfg->link_bw);
867 if (ret) {
868 debug("dp: Failed to set link bandwidth\n");
869 return ret;
870 }
871 ret = tegra_dp_set_lane_count(dp, link_cfg, sor);
872 if (ret) {
873 debug("dp: Failed to set lane count\n");
874 return ret;
875 }
876 tegra_dc_sor_set_dp_linkctl(sor, 1, training_pattern_none, link_cfg);
877
878 /* Now do the fast link training for eDP */
879 ret = tegra_dc_dp_fast_link_training(dp, link_cfg, sor);
880 if (ret) {
881 debug("dp: fast link training failed\n");
882 return ret;
883 }
884
885 /* Everything is good; double check the link config */
886 tegra_dc_sor_read_link_config(sor, &link_bw, &lane_count);
887
888 if ((link_cfg->link_bw == link_bw) &&
889 (link_cfg->lane_count == lane_count))
890 return 0;
891 else
892 return -EFAULT;
893}
894
895static int tegra_dc_dp_explore_link_cfg(struct tegra_dp_priv *dp,
896 struct tegra_dp_link_config *link_cfg,
897 struct tegra_dc_sor_data *sor,
898 const struct display_timing *timing)
899{
900 struct tegra_dp_link_config temp_cfg;
901
902 if (!timing->pixelclock.typ || !timing->hactive.typ ||
903 !timing->vactive.typ) {
904 debug("dp: error mode configuration");
905 return -EINVAL;
906 }
907 if (!link_cfg->max_link_bw || !link_cfg->max_lane_count) {
908 debug("dp: error link configuration");
909 return -EINVAL;
910 }
911
912 link_cfg->is_valid = 0;
913
914 memcpy(&temp_cfg, link_cfg, sizeof(temp_cfg));
915
916 temp_cfg.link_bw = temp_cfg.max_link_bw;
917 temp_cfg.lane_count = temp_cfg.max_lane_count;
918
919 /*
920 * set to max link config
921 */
922 if ((!tegra_dc_dp_calc_config(dp, timing, &temp_cfg)) &&
923 (!(tegra_dp_link_config(dp, &temp_cfg, sor))))
924 /* the max link cfg is doable */
925 memcpy(link_cfg, &temp_cfg, sizeof(temp_cfg));
926
927 return link_cfg->is_valid ? 0 : -EFAULT;
928}
929
930static int tegra_dp_hpd_plug(struct tegra_dp_priv *dp)
931{
932 const int vdd_to_hpd_delay_ms = 200;
933 u32 val;
934 ulong start;
935
936 start = get_timer(0);
937 do {
938 val = tegra_dpaux_readl(dp, DPAUX_DP_AUXSTAT);
939 if (val & DPAUX_DP_AUXSTAT_HPD_STATUS_PLUGGED)
940 return 0;
941 udelay(100);
942 } while (get_timer(start) < vdd_to_hpd_delay_ms);
943
944 return -EIO;
945}
946
947int tegra_dp_enable(struct udevice *dev, int panel_bpp,
948 const struct display_timing *timing)
949{
950 struct tegra_dp_priv *priv = dev_get_priv(dev);
951 struct tegra_dp_link_config slink_cfg, *link_cfg = &slink_cfg;
952 struct tegra_dc_sor_data *sor;
953 int data;
954 int retry;
955 int ret;
956
957 memset(link_cfg, '\0', sizeof(*link_cfg));
958 link_cfg->is_valid = 0;
959 link_cfg->scramble_ena = 1;
960
961 tegra_dc_dpaux_enable(priv);
962
963 if (tegra_dp_hpd_plug(priv) < 0) {
964 debug("dp: hpd plug failed\n");
965 return -EIO;
966 }
967
968 link_cfg->bits_per_pixel = panel_bpp;
969 if (tegra_dc_dp_init_max_link_cfg(timing, priv, link_cfg)) {
970 debug("dp: failed to init link configuration\n");
971 return -ENOLINK;
972 }
973
974 ret = tegra_dc_sor_init(&sor);
975 if (ret)
976 return ret;
977 priv->sor = sor;
978 ret = tegra_dc_sor_enable_dp(sor, link_cfg);
979 if (ret)
980 return ret;
981
982 tegra_dc_sor_set_panel_power(sor, 1);
983
984 /* Write power on to DPCD */
985 data = DP_SET_POWER_D0;
986 retry = 0;
987 do {
988 ret = tegra_dc_dp_dpcd_write(priv, DP_SET_POWER, data);
989 } while ((retry++ < DP_POWER_ON_MAX_TRIES) && ret);
990
991 if (ret || retry >= DP_POWER_ON_MAX_TRIES) {
992 debug("dp: failed to power on panel (0x%x)\n", ret);
993 return -ENETUNREACH;
994 goto error_enable;
995 }
996
997 /* Confirm DP plugging status */
998 if (!(tegra_dpaux_readl(priv, DPAUX_DP_AUXSTAT) &
999 DPAUX_DP_AUXSTAT_HPD_STATUS_PLUGGED)) {
1000 debug("dp: could not detect HPD\n");
1001 return -ENXIO;
1002 }
1003
1004 /* Check DP version */
1005 if (tegra_dc_dp_dpcd_read(priv, DP_DPCD_REV, &priv->revision)) {
1006 debug("dp: failed to read the revision number from sink\n");
1007 return -EIO;
1008 }
1009
1010 if (tegra_dc_dp_explore_link_cfg(priv, link_cfg, sor, timing)) {
1011 debug("dp: error configuring link\n");
1012 return -ENOMEDIUM;
1013 }
1014
1015 tegra_dc_sor_set_power_state(sor, 1);
1016 ret = tegra_dc_sor_attach(sor, link_cfg, timing);
1017 if (ret && ret != -EEXIST)
1018 return ret;
1019
1020 /* Power down the unused lanes to save power - a few hundred mW */
1021 tegra_dc_sor_power_down_unused_lanes(sor, link_cfg);
1022
1023 priv->enabled = true;
1024error_enable:
1025 return 0;
1026}
1027
1028static int tegra_dp_ofdata_to_platdata(struct udevice *dev)
1029{
1030 struct tegra_dp_plat *plat = dev_get_platdata(dev);
1031 const void *blob = gd->fdt_blob;
1032
1033 plat->base = fdtdec_get_addr(blob, dev->of_offset, "reg");
1034
1035 return 0;
1036}
1037
1038static int tegra_dp_read_edid(struct udevice *dev, u8 *buf, int buf_size)
1039{
1040 struct tegra_dp_priv *priv = dev_get_priv(dev);
1041 const int tegra_edid_i2c_address = 0x50;
1042 u32 aux_stat = 0;
1043
1044 tegra_dc_dpaux_enable(priv);
1045
1046 return tegra_dc_i2c_aux_read(priv, tegra_edid_i2c_address, 0, buf,
1047 buf_size, &aux_stat);
1048}
1049
1050static const struct dm_display_port_ops dp_tegra_ops = {
1051 .read_edid = tegra_dp_read_edid,
1052 .enable = tegra_dp_enable,
1053};
1054
1055static int dp_tegra_probe(struct udevice *dev)
1056{
1057 struct tegra_dp_plat *plat = dev_get_platdata(dev);
1058 struct tegra_dp_priv *priv = dev_get_priv(dev);
1059
1060 priv->regs = (struct dpaux_ctlr *)plat->base;
1061 priv->enabled = false;
1062
1063 return 0;
1064}
1065
1066static const struct udevice_id tegra_dp_ids[] = {
1067 { .compatible = "nvidia,tegra124-dpaux" },
1068 { }
1069};
1070
1071U_BOOT_DRIVER(dp_tegra) = {
1072 .name = "dpaux_tegra",
1073 .id = UCLASS_DISPLAY_PORT,
1074 .of_match = tegra_dp_ids,
1075 .ofdata_to_platdata = tegra_dp_ofdata_to_platdata,
1076 .probe = dp_tegra_probe,
1077 .ops = &dp_tegra_ops,
1078 .priv_auto_alloc_size = sizeof(struct tegra_dp_priv),
1079 .platdata_auto_alloc_size = sizeof(struct tegra_dp_plat),
1080};