1 /*
2 * (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd
3 *
4 * SPDX-License-Identifier: GPL-2.0+
5 */
6
7 #include <config.h>
8 #include <common.h>
9 #include <errno.h>
10 #include <malloc.h>
11 #include <asm/unaligned.h>
12 #include <asm/io.h>
13 #include <dm/device.h>
14 #include <dm/of_access.h>
15 #include <dm/read.h>
16 #include <linux/bitfield.h>
17 #include <linux/list.h>
18 #include <linux/media-bus-format.h>
19 #include <syscon.h>
20 #include <asm/arch-rockchip/clock.h>
21 #include <asm/gpio.h>
22
23 #include "rockchip_display.h"
24 #include "rockchip_crtc.h"
25 #include "rockchip_connector.h"
26 #include "analogix_dp.h"
27
28 #define RK3588_GRF_VO1_CON0 0x0000
29 #define EDP_MODE BIT(0)
30 #define RK3588_GRF_VO1_CON1 0x0004
31
32 /**
33 * struct rockchip_dp_chip_data - splite the grf setting of kind of chips
34 * @lcdsel_grf_reg: grf register offset of lcdc select
35 * @lcdsel_big: reg value of selecting vop big for eDP
36 * @lcdsel_lit: reg value of selecting vop little for eDP
37 * @chip_type: specific chip type
38 * @ssc: check if SSC is supported by source
39 * @max_link_rate: max supported link rate
40 * @max_lane_count: max supported lane count
41 * @format_yuv: check if yuv color format is supported
42 * @support_dp_mode: check if dp mode is supported
43 * @max_bpc: max supported bpc which set to 8 by default
44 */
45 struct rockchip_dp_chip_data {
46 u32 lcdsel_grf_reg;
47 u32 lcdsel_big;
48 u32 lcdsel_lit;
49 u32 chip_type;
50 bool ssc;
51
52 u32 max_link_rate;
53 u32 max_lane_count;
54 bool format_yuv;
55 bool support_dp_mode;
56 u8 max_bpc;
57 };
58
59 static const struct analogix_dp_output_format possible_output_fmts[] = {
60 { MEDIA_BUS_FMT_RGB101010_1X30, DRM_COLOR_FORMAT_RGB444, 10 },
61 { MEDIA_BUS_FMT_RGB888_1X24, DRM_COLOR_FORMAT_RGB444, 8 },
62 { MEDIA_BUS_FMT_RGB666_1X24_CPADHI, DRM_COLOR_FORMAT_RGB444, 6 },
63 { MEDIA_BUS_FMT_YUV10_1X30, DRM_COLOR_FORMAT_YCRCB444, 10 },
64 { MEDIA_BUS_FMT_YUV8_1X24, DRM_COLOR_FORMAT_YCRCB444, 8},
65 { MEDIA_BUS_FMT_YUYV10_1X20, DRM_COLOR_FORMAT_YCRCB422, 10 },
66 { MEDIA_BUS_FMT_YUYV8_1X16, DRM_COLOR_FORMAT_YCRCB422, 8 },
67 };
68
analogix_dp_get_output_bpp(const struct analogix_dp_output_format * fmt)69 static u8 analogix_dp_get_output_bpp(const struct analogix_dp_output_format *fmt)
70 {
71 switch (fmt->color_format) {
72 case DRM_COLOR_FORMAT_YCRCB422:
73 return fmt->bpc * 2;
74 case DRM_COLOR_FORMAT_RGB444:
75 case DRM_COLOR_FORMAT_YCRCB444:
76 default:
77 return fmt->bpc * 3;
78 }
79 }
80
81 static int
analogix_dp_enable_rx_to_enhanced_mode(struct analogix_dp_device * dp,bool enable)82 analogix_dp_enable_rx_to_enhanced_mode(struct analogix_dp_device *dp,
83 bool enable)
84 {
85 u8 data;
86 int ret;
87
88 ret = drm_dp_dpcd_readb(&dp->aux, DP_LANE_COUNT_SET, &data);
89 if (ret != 1)
90 return ret;
91
92 if (enable)
93 ret = drm_dp_dpcd_writeb(&dp->aux, DP_LANE_COUNT_SET,
94 DP_LANE_COUNT_ENHANCED_FRAME_EN |
95 DPCD_LANE_COUNT_SET(data));
96 else
97 ret = drm_dp_dpcd_writeb(&dp->aux, DP_LANE_COUNT_SET,
98 DPCD_LANE_COUNT_SET(data));
99
100 return ret < 0 ? ret : 0;
101 }
102
analogix_dp_set_enhanced_mode(struct analogix_dp_device * dp)103 static int analogix_dp_set_enhanced_mode(struct analogix_dp_device *dp)
104 {
105 bool enhanced_frame_en;
106 u8 data;
107 int ret;
108
109 enhanced_frame_en = drm_dp_enhanced_frame_cap(dp->dpcd);
110
111 ret = analogix_dp_enable_rx_to_enhanced_mode(dp, enhanced_frame_en);
112 if (ret < 0)
113 return ret;
114
115 if (!enhanced_frame_en) {
116 /*
117 * As the Table 3-4 in eDP v1.2 spec:
118 * DPCD 0000Dh:
119 * Bit 1 = FRAMING_CHANGE_CAPABLE
120 * A setting of 1 indicates that this is an eDP device that
121 * uses only Enhanced Framing, independently of the setting by
122 * the source of ENHANCED_FRAME_EN
123 *
124 * And as the Table 3-3 in eDP v1.4 spec:
125 * DPCD 0000Dh:
126 * Bit 1 = RESERVED for eDP
127 * New to eDP v1.4.(Read all 0s)
128 */
129 ret = drm_dp_dpcd_readb(&dp->aux, DP_EDP_CONFIGURATION_CAP,
130 &data);
131 if (ret < 0)
132 return ret;
133
134 enhanced_frame_en = !!(data & DP_FRAMING_CHANGE_CAP);
135 }
136
137 analogix_dp_enable_enhanced_mode(dp, enhanced_frame_en);
138
139 return 0;
140 }
141
analogix_dp_training_pattern_dis(struct analogix_dp_device * dp)142 static int analogix_dp_training_pattern_dis(struct analogix_dp_device *dp)
143 {
144 int ret;
145
146 analogix_dp_set_training_pattern(dp, DP_NONE);
147
148 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
149 DP_TRAINING_PATTERN_DISABLE);
150
151 return ret < 0 ? ret : 0;
152 }
153
analogix_dp_enable_sink_to_assr_mode(struct analogix_dp_device * dp,bool enable)154 static int analogix_dp_enable_sink_to_assr_mode(struct analogix_dp_device *dp, bool enable)
155 {
156 u8 data;
157 int ret;
158
159 ret = drm_dp_dpcd_readb(&dp->aux, DP_EDP_CONFIGURATION_SET, &data);
160 if (ret != 1)
161 return ret;
162
163 if (enable)
164 ret = drm_dp_dpcd_writeb(&dp->aux, DP_EDP_CONFIGURATION_SET,
165 data | DP_ALTERNATE_SCRAMBLER_RESET_ENABLE);
166 else
167 ret = drm_dp_dpcd_writeb(&dp->aux, DP_EDP_CONFIGURATION_SET,
168 data & ~DP_ALTERNATE_SCRAMBLER_RESET_ENABLE);
169
170 return ret < 0 ? ret : 0;
171 }
172
analogix_dp_set_assr_mode(struct analogix_dp_device * dp)173 static int analogix_dp_set_assr_mode(struct analogix_dp_device *dp)
174 {
175 bool assr_en;
176 int ret;
177
178 assr_en = drm_dp_alternate_scrambler_reset_cap(dp->dpcd);
179
180 ret = analogix_dp_enable_sink_to_assr_mode(dp, assr_en);
181 if (ret < 0)
182 return ret;
183
184 analogix_dp_enable_assr_mode(dp, assr_en);
185
186 return 0;
187 }
188
analogix_dp_link_start(struct analogix_dp_device * dp)189 static int analogix_dp_link_start(struct analogix_dp_device *dp)
190 {
191 u8 buf[4];
192 int lane, lane_count, retval;
193
194 lane_count = dp->link_train.lane_count;
195
196 dp->link_train.lt_state = CLOCK_RECOVERY;
197 dp->link_train.eq_loop = 0;
198
199 for (lane = 0; lane < lane_count; lane++)
200 dp->link_train.cr_loop[lane] = 0;
201
202 /* Set link rate and count as you want to establish */
203 analogix_dp_set_link_bandwidth(dp, dp->link_train.link_rate);
204 analogix_dp_set_lane_count(dp, dp->link_train.lane_count);
205
206 if (dp->nr_link_rate_table) {
207 /* Setup DP_LINK_RATE_SET for eDP 1.4 and later */
208 drm_dp_dpcd_writeb(&dp->aux, DP_LANE_COUNT_SET, dp->link_train.lane_count);
209 drm_dp_dpcd_writeb(&dp->aux, DP_LINK_RATE_SET, dp->link_rate_select);
210 } else {
211 /* Setup DP_LINK_BW_SET for eDP 1.3 and earlier */
212 buf[0] = dp->link_train.link_rate;
213 buf[1] = dp->link_train.lane_count;
214 retval = drm_dp_dpcd_write(&dp->aux, DP_LINK_BW_SET, buf, 2);
215 if (retval < 0)
216 return retval;
217 }
218
219 /* Spread AMP if required, enable 8b/10b coding */
220 buf[0] = analogix_dp_ssc_supported(dp) ? DP_SPREAD_AMP_0_5 : 0;
221 buf[1] = DP_SET_ANSI_8B10B;
222 retval = drm_dp_dpcd_write(&dp->aux, DP_DOWNSPREAD_CTRL, buf, 2);
223 if (retval < 0)
224 return retval;
225
226 /* set ASSR if available */
227 retval = analogix_dp_set_assr_mode(dp);
228 if (retval < 0) {
229 dev_err(dp->dev, "failed to set assr mode\n");
230 return retval;
231 }
232
233 /* set enhanced mode if available */
234 retval = analogix_dp_set_enhanced_mode(dp);
235 if (retval < 0) {
236 dev_err(dp->dev, "failed to set enhance mode\n");
237 return retval;
238 }
239
240 /* Set TX voltage-swing and pre-emphasis to minimum */
241 for (lane = 0; lane < lane_count; lane++)
242 dp->link_train.training_lane[lane] =
243 DP_TRAIN_VOLTAGE_SWING_LEVEL_0 |
244 DP_TRAIN_PRE_EMPH_LEVEL_0;
245 analogix_dp_set_lane_link_training(dp);
246
247 /* Set training pattern 1 */
248 analogix_dp_set_training_pattern(dp, TRAINING_PTN1);
249
250 /* Set RX training pattern */
251 retval = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
252 DP_LINK_SCRAMBLING_DISABLE | DP_TRAINING_PATTERN_1);
253 if (retval < 0)
254 return retval;
255
256 for (lane = 0; lane < lane_count; lane++)
257 buf[lane] = DP_TRAIN_PRE_EMPH_LEVEL_0 |
258 DP_TRAIN_VOLTAGE_SWING_LEVEL_0;
259
260 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, buf,
261 lane_count);
262 if (retval < 0)
263 return retval;
264
265 return 0;
266 }
267
analogix_dp_get_lane_status(u8 link_status[2],int lane)268 static unsigned char analogix_dp_get_lane_status(u8 link_status[2], int lane)
269 {
270 int shift = (lane & 1) * 4;
271 u8 link_value = link_status[lane >> 1];
272
273 return (link_value >> shift) & 0xf;
274 }
275
analogix_dp_clock_recovery_ok(u8 link_status[2],int lane_count)276 static int analogix_dp_clock_recovery_ok(u8 link_status[2], int lane_count)
277 {
278 int lane;
279 u8 lane_status;
280
281 for (lane = 0; lane < lane_count; lane++) {
282 lane_status = analogix_dp_get_lane_status(link_status, lane);
283 if ((lane_status & DP_LANE_CR_DONE) == 0)
284 return -EINVAL;
285 }
286 return 0;
287 }
288
analogix_dp_channel_eq_ok(u8 link_status[2],u8 link_align,int lane_count)289 static int analogix_dp_channel_eq_ok(u8 link_status[2], u8 link_align,
290 int lane_count)
291 {
292 int lane;
293 u8 lane_status;
294
295 if ((link_align & DP_INTERLANE_ALIGN_DONE) == 0)
296 return -EINVAL;
297
298 for (lane = 0; lane < lane_count; lane++) {
299 lane_status = analogix_dp_get_lane_status(link_status, lane);
300 lane_status &= DP_CHANNEL_EQ_BITS;
301 if (lane_status != DP_CHANNEL_EQ_BITS)
302 return -EINVAL;
303 }
304
305 return 0;
306 }
307
308 static unsigned char
analogix_dp_get_adjust_request_voltage(u8 adjust_request[2],int lane)309 analogix_dp_get_adjust_request_voltage(u8 adjust_request[2], int lane)
310 {
311 int shift = (lane & 1) * 4;
312 u8 link_value = adjust_request[lane >> 1];
313
314 return (link_value >> shift) & 0x3;
315 }
316
analogix_dp_get_adjust_request_pre_emphasis(u8 adjust_request[2],int lane)317 static unsigned char analogix_dp_get_adjust_request_pre_emphasis(
318 u8 adjust_request[2],
319 int lane)
320 {
321 int shift = (lane & 1) * 4;
322 u8 link_value = adjust_request[lane >> 1];
323
324 return ((link_value >> shift) & 0xc) >> 2;
325 }
326
analogix_dp_reduce_link_rate(struct analogix_dp_device * dp)327 static void analogix_dp_reduce_link_rate(struct analogix_dp_device *dp)
328 {
329 analogix_dp_training_pattern_dis(dp);
330 analogix_dp_set_enhanced_mode(dp);
331
332 dp->link_train.lt_state = FAILED;
333 }
334
analogix_dp_get_adjust_training_lane(struct analogix_dp_device * dp,u8 adjust_request[2])335 static void analogix_dp_get_adjust_training_lane(struct analogix_dp_device *dp,
336 u8 adjust_request[2])
337 {
338 int lane, lane_count;
339 u8 voltage_swing, pre_emphasis, training_lane;
340
341 lane_count = dp->link_train.lane_count;
342 for (lane = 0; lane < lane_count; lane++) {
343 voltage_swing = analogix_dp_get_adjust_request_voltage(
344 adjust_request, lane);
345 pre_emphasis = analogix_dp_get_adjust_request_pre_emphasis(
346 adjust_request, lane);
347 training_lane = DPCD_VOLTAGE_SWING_SET(voltage_swing) |
348 DPCD_PRE_EMPHASIS_SET(pre_emphasis);
349
350 if (voltage_swing == VOLTAGE_LEVEL_3)
351 training_lane |= DP_TRAIN_MAX_SWING_REACHED;
352 if (pre_emphasis == PRE_EMPHASIS_LEVEL_3)
353 training_lane |= DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
354
355 dp->link_train.training_lane[lane] = training_lane;
356 }
357 }
358
analogix_dp_tps3_supported(struct analogix_dp_device * dp)359 static bool analogix_dp_tps3_supported(struct analogix_dp_device *dp)
360 {
361 bool source_tps3_supported, sink_tps3_supported;
362 u8 dpcd = 0;
363
364 source_tps3_supported =
365 dp->video_info.max_link_rate == DP_LINK_BW_5_4;
366 drm_dp_dpcd_readb(&dp->aux, DP_MAX_LANE_COUNT, &dpcd);
367 sink_tps3_supported = dpcd & DP_TPS3_SUPPORTED;
368
369 return source_tps3_supported && sink_tps3_supported;
370 }
371
analogix_dp_process_clock_recovery(struct analogix_dp_device * dp)372 static int analogix_dp_process_clock_recovery(struct analogix_dp_device *dp)
373 {
374 int lane, lane_count, retval;
375 u8 voltage_swing, pre_emphasis, training_lane;
376 u8 link_status[2], adjust_request[2];
377 u8 training_pattern = TRAINING_PTN2;
378
379 drm_dp_link_train_clock_recovery_delay(dp->dpcd);
380
381 lane_count = dp->link_train.lane_count;
382
383 retval = drm_dp_dpcd_read(&dp->aux, DP_LANE0_1_STATUS, link_status, 2);
384 if (retval < 0)
385 return retval;
386
387 if (analogix_dp_clock_recovery_ok(link_status, lane_count) == 0) {
388 if (analogix_dp_tps3_supported(dp))
389 training_pattern = TRAINING_PTN3;
390
391 /* set training pattern for EQ */
392 analogix_dp_set_training_pattern(dp, training_pattern);
393
394 retval = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
395 DP_LINK_SCRAMBLING_DISABLE |
396 (training_pattern == TRAINING_PTN3 ?
397 DP_TRAINING_PATTERN_3 : DP_TRAINING_PATTERN_2));
398 if (retval < 0)
399 return retval;
400
401 dev_info(dp->dev, "Link Training Clock Recovery success\n");
402 dp->link_train.lt_state = EQUALIZER_TRAINING;
403
404 return 0;
405 } else {
406 retval = drm_dp_dpcd_read(&dp->aux, DP_ADJUST_REQUEST_LANE0_1,
407 adjust_request, 2);
408 if (retval < 0)
409 return retval;
410
411 for (lane = 0; lane < lane_count; lane++) {
412 training_lane = analogix_dp_get_lane_link_training(
413 dp, lane);
414 voltage_swing = analogix_dp_get_adjust_request_voltage(
415 adjust_request, lane);
416 pre_emphasis = analogix_dp_get_adjust_request_pre_emphasis(
417 adjust_request, lane);
418
419 if (DPCD_VOLTAGE_SWING_GET(training_lane) ==
420 voltage_swing &&
421 DPCD_PRE_EMPHASIS_GET(training_lane) ==
422 pre_emphasis)
423 dp->link_train.cr_loop[lane]++;
424
425 /*
426 * In DP spec 1.3, Condition of CR fail are
427 * outlined in section 3.5.1.2.2.1, figure 3-20:
428 *
429 * 1. Maximum Voltage Swing reached
430 * 2. Same Voltage five times
431 */
432 if (dp->link_train.cr_loop[lane] == MAX_CR_LOOP ||
433 DPCD_VOLTAGE_SWING_GET(training_lane) == VOLTAGE_LEVEL_3) {
434 dev_err(dp->dev, "CR Max reached (%d,%d,%d)\n",
435 dp->link_train.cr_loop[lane],
436 voltage_swing, pre_emphasis);
437 analogix_dp_reduce_link_rate(dp);
438 return -EIO;
439 }
440 }
441 }
442
443 analogix_dp_get_adjust_training_lane(dp, adjust_request);
444 analogix_dp_set_lane_link_training(dp);
445
446 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET,
447 dp->link_train.training_lane, lane_count);
448 if (retval < 0)
449 return retval;
450
451 return 0;
452 }
453
analogix_dp_process_equalizer_training(struct analogix_dp_device * dp)454 static int analogix_dp_process_equalizer_training(struct analogix_dp_device *dp)
455 {
456 int lane_count, retval;
457 u32 reg;
458 u8 link_align, link_status[2], adjust_request[2];
459
460 drm_dp_link_train_channel_eq_delay(dp->dpcd);
461
462 lane_count = dp->link_train.lane_count;
463
464 retval = drm_dp_dpcd_read(&dp->aux, DP_LANE0_1_STATUS, link_status, 2);
465 if (retval < 0)
466 return retval;
467
468 if (analogix_dp_clock_recovery_ok(link_status, lane_count)) {
469 analogix_dp_reduce_link_rate(dp);
470 return -EIO;
471 }
472
473 retval = drm_dp_dpcd_readb(&dp->aux, DP_LANE_ALIGN_STATUS_UPDATED, &link_align);
474 if (retval < 0)
475 return retval;
476
477 if (!analogix_dp_channel_eq_ok(link_status, link_align, lane_count)) {
478 /* traing pattern Set to Normal */
479 retval = analogix_dp_training_pattern_dis(dp);
480 if (retval < 0)
481 return retval;
482
483 printf("Link Training success!\n");
484
485 analogix_dp_get_link_bandwidth(dp, ®);
486 dp->link_train.link_rate = reg;
487 analogix_dp_get_lane_count(dp, ®);
488 dp->link_train.lane_count = reg;
489
490 printf("final link rate = 0x%.2x, lane count = 0x%.2x\n",
491 dp->link_train.link_rate, dp->link_train.lane_count);
492
493 dp->link_train.lt_state = FINISHED;
494
495 return 0;
496 }
497
498 /* not all locked */
499 dp->link_train.eq_loop++;
500
501 if (dp->link_train.eq_loop > MAX_EQ_LOOP) {
502 dev_dbg(dp->dev, "EQ Max loop\n");
503 analogix_dp_reduce_link_rate(dp);
504 return -EIO;
505 }
506
507 retval = drm_dp_dpcd_read(&dp->aux, DP_ADJUST_REQUEST_LANE0_1, adjust_request, 2);
508 if (retval < 0)
509 return retval;
510
511 analogix_dp_get_adjust_training_lane(dp, adjust_request);
512 analogix_dp_set_lane_link_training(dp);
513
514 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET,
515 dp->link_train.training_lane, lane_count);
516 if (retval < 0)
517 return retval;
518
519 return 0;
520 }
521
analogix_dp_bandwidth_ok(struct analogix_dp_device * dp,const struct drm_display_mode * mode,u32 bpp,unsigned int rate,unsigned int lanes)522 static bool analogix_dp_bandwidth_ok(struct analogix_dp_device *dp,
523 const struct drm_display_mode *mode, u32 bpp,
524 unsigned int rate, unsigned int lanes)
525 {
526 u32 max_bw, req_bw;
527
528 req_bw = mode->clock * bpp / 8;
529 max_bw = lanes * rate;
530 if (req_bw > max_bw)
531 return false;
532
533 return true;
534 }
535
analogix_dp_link_config_validate(u8 link_rate,u8 lane_count)536 static bool analogix_dp_link_config_validate(u8 link_rate, u8 lane_count)
537 {
538 switch (link_rate) {
539 case DP_LINK_BW_1_62:
540 case DP_LINK_BW_2_7:
541 case DP_LINK_BW_5_4:
542 /* Supported link rate in eDP 1.4 */
543 case EDP_LINK_BW_2_16:
544 case EDP_LINK_BW_2_43:
545 case EDP_LINK_BW_3_24:
546 case EDP_LINK_BW_4_32:
547 break;
548 default:
549 return false;
550 }
551
552 switch (lane_count) {
553 case LANE_COUNT1:
554 case LANE_COUNT2:
555 case LANE_COUNT4:
556 break;
557 default:
558 return false;
559 }
560
561 return true;
562 }
563
analogix_dp_select_link_rate_from_table(struct analogix_dp_device * dp)564 static int analogix_dp_select_link_rate_from_table(struct analogix_dp_device *dp)
565 {
566 int i;
567 u8 bw_code;
568 u32 max_link_rate = drm_dp_bw_code_to_link_rate(dp->video_info.max_link_rate);
569
570 for (i = 0; i < dp->nr_link_rate_table; i++) {
571 bw_code = drm_dp_link_rate_to_bw_code(dp->link_rate_table[i]);
572
573 if (!analogix_dp_bandwidth_ok(dp, &dp->video_info.mode,
574 analogix_dp_get_output_bpp(dp->output_fmt),
575 dp->link_rate_table[i], dp->link_train.lane_count))
576 continue;
577
578 if (dp->link_rate_table[i] <= max_link_rate &&
579 analogix_dp_link_config_validate(bw_code, dp->link_train.lane_count)) {
580 dp->link_rate_select = i;
581 return bw_code;
582 }
583 }
584
585 return 0;
586 }
587
analogix_dp_select_rx_bandwidth(struct analogix_dp_device * dp)588 static int analogix_dp_select_rx_bandwidth(struct analogix_dp_device *dp)
589 {
590 if (dp->nr_link_rate_table)
591 /*
592 * Select the smallest one among link rates which meet
593 * the bandwidth requirement for eDP 1.4 and later.
594 */
595 dp->link_train.link_rate = analogix_dp_select_link_rate_from_table(dp);
596 else
597 /*
598 * Select the smaller one between rx DP_MAX_LINK_RATE
599 * and the max link rate supported by the platform.
600 */
601 dp->link_train.link_rate = min_t(u32, dp->link_train.link_rate,
602 dp->video_info.max_link_rate);
603 if (!dp->link_train.link_rate)
604 return -EINVAL;
605
606 return 0;
607 }
608
analogix_dp_init_link_rate_table(struct analogix_dp_device * dp)609 static int analogix_dp_init_link_rate_table(struct analogix_dp_device *dp)
610 {
611 u8 link_rate_table[DP_MAX_SUPPORTED_RATES * 2];
612 int i;
613 int ret;
614
615 ret = drm_dp_dpcd_read(&dp->aux, DP_SUPPORTED_LINK_RATES, link_rate_table,
616 sizeof(link_rate_table));
617 if (ret < 0)
618 return ret;
619
620 for (i = 0; i < ARRAY_SIZE(link_rate_table) / 2; i++) {
621 int val = link_rate_table[2 * i] | link_rate_table[2 * i + 1] << 8;
622
623 if (val == 0)
624 break;
625
626 /* Convert to the link_rate as drm_dp_bw_code_to_link_rate() */
627 dp->link_rate_table[i] = (val * 20);
628 }
629 dp->nr_link_rate_table = i;
630
631 return 0;
632 }
633
analogix_dp_get_max_rx_bandwidth(struct analogix_dp_device * dp,u8 * bandwidth)634 static int analogix_dp_get_max_rx_bandwidth(struct analogix_dp_device *dp,
635 u8 *bandwidth)
636 {
637 u8 data;
638 int ret;
639
640 ret = drm_dp_dpcd_readb(&dp->aux, DP_EDP_DPCD_REV, &data);
641 if (ret == 1 && data >= DP_EDP_14) {
642 u32 max_link_rate;
643
644 /* As the Table 4-23 in eDP 1.4 spec, the link rate table is required */
645 if (!dp->nr_link_rate_table) {
646 dev_info(dp->dev, "eDP version: 0x%02x supports link rate table\n",
647 data);
648
649 if (analogix_dp_init_link_rate_table(dp))
650 dev_err(dp->dev, "failed to read link rate table: %d\n",
651 ret);
652 }
653 max_link_rate = dp->link_rate_table[dp->nr_link_rate_table - 1];
654 *bandwidth = drm_dp_link_rate_to_bw_code(max_link_rate);
655 } else {
656 /*
657 * For DP rev.1.1, Maximum link rate of Main Link lanes
658 * 0x06 = 1.62 Gbps, 0x0a = 2.7 Gbps
659 * For DP rev.1.2, Maximum link rate of Main Link lanes
660 * 0x06 = 1.62 Gbps, 0x0a = 2.7 Gbps, 0x14 = 5.4Gbps
661 */
662 ret = drm_dp_dpcd_readb(&dp->aux, DP_MAX_LINK_RATE, &data);
663 if (ret < 0)
664 return ret;
665
666 *bandwidth = data;
667 }
668
669 return 0;
670 }
671
analogix_dp_get_max_rx_lane_count(struct analogix_dp_device * dp,u8 * lane_count)672 static int analogix_dp_get_max_rx_lane_count(struct analogix_dp_device *dp,
673 u8 *lane_count)
674 {
675 u8 data;
676 int ret;
677
678 /*
679 * For DP rev.1.1, Maximum number of Main Link lanes
680 * 0x01 = 1 lane, 0x02 = 2 lanes, 0x04 = 4 lanes
681 */
682 ret = drm_dp_dpcd_readb(&dp->aux, DP_MAX_LANE_COUNT, &data);
683 if (ret < 0)
684 return ret;
685
686 *lane_count = DPCD_MAX_LANE_COUNT(data);
687
688 return 0;
689 }
690
analogix_dp_init_training(struct analogix_dp_device * dp,enum link_lane_count_type max_lane,int max_rate)691 static int analogix_dp_init_training(struct analogix_dp_device *dp,
692 enum link_lane_count_type max_lane,
693 int max_rate)
694 {
695 u8 dpcd;
696
697 /*
698 * MACRO_RST must be applied after the PLL_LOCK to avoid
699 * the DP inter pair skew issue for at least 10 us
700 */
701 analogix_dp_reset_macro(dp);
702
703 /* Setup TX lane count */
704 dp->link_train.lane_count = min_t(u32, dp->link_train.lane_count, max_lane);
705
706 /* Setup TX lane rate */
707 if (analogix_dp_select_rx_bandwidth(dp)) {
708 dev_err(dp->dev, "Select rx bandwidth failed\n");
709 return -EINVAL;
710 }
711
712 drm_dp_dpcd_readb(&dp->aux, DP_MAX_DOWNSPREAD, &dpcd);
713 dp->link_train.ssc = !!(dpcd & DP_MAX_DOWNSPREAD_0_5);
714
715 /* All DP analog module power up */
716 analogix_dp_set_analog_power_down(dp, POWER_ALL, 0);
717
718 return 0;
719 }
720
analogix_dp_sw_link_training(struct analogix_dp_device * dp)721 static int analogix_dp_sw_link_training(struct analogix_dp_device *dp)
722 {
723 int retval = 0, training_finished = 0;
724
725 dp->link_train.lt_state = START;
726
727 /* Process here */
728 while (!retval && !training_finished) {
729 switch (dp->link_train.lt_state) {
730 case START:
731 retval = analogix_dp_link_start(dp);
732 if (retval)
733 dev_err(dp->dev, "LT link start failed!\n");
734 break;
735 case CLOCK_RECOVERY:
736 retval = analogix_dp_process_clock_recovery(dp);
737 if (retval)
738 dev_err(dp->dev, "LT CR failed!\n");
739 break;
740 case EQUALIZER_TRAINING:
741 retval = analogix_dp_process_equalizer_training(dp);
742 if (retval)
743 dev_err(dp->dev, "LT EQ failed!\n");
744 break;
745 case FINISHED:
746 training_finished = 1;
747 break;
748 case FAILED:
749 return -EREMOTEIO;
750 }
751 }
752
753 return retval;
754 }
755
analogix_dp_set_link_train(struct analogix_dp_device * dp,u32 count,u32 bwtype)756 static int analogix_dp_set_link_train(struct analogix_dp_device *dp,
757 u32 count, u32 bwtype)
758 {
759 int i, ret;
760
761 for (i = 0; i < 5; i++) {
762 ret = analogix_dp_init_training(dp, count, bwtype);
763 if (ret < 0) {
764 dev_err(dp->dev, "failed to init training\n");
765 return ret;
766 }
767
768 ret = analogix_dp_sw_link_training(dp);
769 if (!ret)
770 break;
771 }
772
773 return ret;
774 }
775
analogix_dp_config_video(struct analogix_dp_device * dp)776 static int analogix_dp_config_video(struct analogix_dp_device *dp)
777 {
778 int timeout_loop = 0;
779 int done_count = 0;
780
781 analogix_dp_config_video_slave_mode(dp);
782
783 analogix_dp_set_video_color_format(dp);
784
785 if (analogix_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
786 dev_err(dp->dev, "PLL is not locked yet.\n");
787 return -EINVAL;
788 }
789
790 for (;;) {
791 timeout_loop++;
792 if (analogix_dp_is_slave_video_stream_clock_on(dp) == 0)
793 break;
794 if (timeout_loop > DP_TIMEOUT_LOOP_COUNT) {
795 dev_err(dp->dev, "Timeout of video streamclk ok\n");
796 return -ETIMEDOUT;
797 }
798
799 udelay(2);
800 }
801
802 /* Set to use the register calculated M/N video */
803 analogix_dp_set_video_cr_mn(dp, CALCULATED_M, 0, 0);
804
805 /* For video bist, Video timing must be generated by register */
806 analogix_dp_set_video_timing_mode(dp, VIDEO_TIMING_FROM_REGISTER);
807
808 /* Disable video mute */
809 analogix_dp_enable_video_mute(dp, 0);
810
811 /* Configure video slave mode */
812 analogix_dp_enable_video_master(dp, 0);
813
814 /* Enable video input */
815 analogix_dp_start_video(dp);
816
817 timeout_loop = 0;
818
819 for (;;) {
820 timeout_loop++;
821 if (analogix_dp_is_video_stream_on(dp) == 0) {
822 done_count++;
823 if (done_count > 10)
824 break;
825 } else if (done_count) {
826 done_count = 0;
827 }
828 if (timeout_loop > DP_TIMEOUT_LOOP_COUNT) {
829 dev_err(dp->dev, "Timeout of video streamclk ok\n");
830 return -ETIMEDOUT;
831 }
832
833 udelay(1001);
834 }
835
836 return 0;
837 }
838
analogix_dp_enable_scramble(struct analogix_dp_device * dp,bool enable)839 static int analogix_dp_enable_scramble(struct analogix_dp_device *dp,
840 bool enable)
841 {
842 u8 data;
843 int ret;
844
845 if (enable) {
846 analogix_dp_enable_scrambling(dp);
847
848 ret = drm_dp_dpcd_readb(&dp->aux, DP_TRAINING_PATTERN_SET,
849 &data);
850 if (ret != 1)
851 return ret;
852 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
853 (u8)(data & ~DP_LINK_SCRAMBLING_DISABLE));
854 } else {
855 analogix_dp_disable_scrambling(dp);
856
857 ret = drm_dp_dpcd_readb(&dp->aux, DP_TRAINING_PATTERN_SET,
858 &data);
859 if (ret != 1)
860 return ret;
861 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
862 (u8)(data | DP_LINK_SCRAMBLING_DISABLE));
863 }
864 return ret < 0 ? ret : 0;
865 }
866
analogix_dp_init_dp(struct analogix_dp_device * dp)867 static void analogix_dp_init_dp(struct analogix_dp_device *dp)
868 {
869 analogix_dp_reset(dp);
870
871 analogix_dp_swreset(dp);
872
873 analogix_dp_init_analog_param(dp);
874 analogix_dp_init_interrupt(dp);
875
876 /* SW defined function Normal operation */
877 analogix_dp_enable_sw_function(dp);
878
879 analogix_dp_config_interrupt(dp);
880 analogix_dp_init_analog_func(dp);
881
882 analogix_dp_init_hpd(dp);
883 analogix_dp_init_aux(dp);
884 }
885
analogix_dp_connector_init(struct rockchip_connector * conn,struct display_state * state)886 static int analogix_dp_connector_init(struct rockchip_connector *conn, struct display_state *state)
887 {
888 struct connector_state *conn_state = &state->conn_state;
889 struct analogix_dp_device *dp = dev_get_priv(conn->dev);
890 int submode = PHY_SUBMODE_EDP;
891
892 if (!conn->panel)
893 dp->dp_mode = true;
894
895 if (dev_read_bool(conn->dev, "dp-mode"))
896 dp->dp_mode = true;
897 else if (dev_read_bool(conn->dev, "edp-mode"))
898 dp->dp_mode = false;
899
900 conn_state->output_if |= dp->id ? VOP_OUTPUT_IF_eDP1 : VOP_OUTPUT_IF_eDP0;
901 conn_state->output_mode = ROCKCHIP_OUT_MODE_AAAA;
902 conn_state->color_encoding = DRM_COLOR_YCBCR_BT709;
903 conn_state->color_range = DRM_COLOR_YCBCR_FULL_RANGE;
904
905 reset_assert_bulk(&dp->resets);
906 udelay(1);
907 reset_deassert_bulk(&dp->resets);
908
909 conn_state->disp_info = rockchip_get_disp_info(conn_state->type, dp->id);
910 if (dp->plat_data.support_dp_mode && dp->dp_mode)
911 submode = PHY_SUBMODE_DP;
912 generic_phy_set_mode_ext(&dp->phy, PHY_MODE_DP, submode);
913 generic_phy_power_on(&dp->phy);
914 analogix_dp_init_dp(dp);
915
916 return 0;
917 }
918
analogix_dp_connector_get_edid(struct rockchip_connector * conn,struct display_state * state)919 static int analogix_dp_connector_get_edid(struct rockchip_connector *conn,
920 struct display_state *state)
921 {
922 struct connector_state *conn_state = &state->conn_state;
923 struct analogix_dp_device *dp = dev_get_priv(conn->dev);
924 int ret = 0;
925
926 conn_state->edid = drm_do_get_edid(&dp->aux.ddc);
927 if (!conn_state->edid)
928 ret = -EINVAL;
929
930 return ret;
931 }
932
analogix_dp_link_power_up(struct analogix_dp_device * dp)933 static int analogix_dp_link_power_up(struct analogix_dp_device *dp)
934 {
935 u8 value;
936 int ret;
937
938 if (dp->dpcd[DP_DPCD_REV] < 0x11)
939 return 0;
940
941 ret = drm_dp_dpcd_readb(&dp->aux, DP_SET_POWER, &value);
942 if (ret < 0)
943 return ret;
944
945 value &= ~DP_SET_POWER_MASK;
946 value |= DP_SET_POWER_D0;
947
948 ret = drm_dp_dpcd_writeb(&dp->aux, DP_SET_POWER, value);
949 if (ret < 0)
950 return ret;
951
952 mdelay(1);
953
954 return 0;
955 }
956
analogix_dp_link_power_down(struct analogix_dp_device * dp)957 static int analogix_dp_link_power_down(struct analogix_dp_device *dp)
958 {
959 u8 value;
960 int ret;
961
962 if (dp->dpcd[DP_DPCD_REV] < 0x11)
963 return 0;
964
965 ret = drm_dp_dpcd_readb(&dp->aux, DP_SET_POWER, &value);
966 if (ret < 0)
967 return ret;
968
969 value &= ~DP_SET_POWER_MASK;
970 value |= DP_SET_POWER_D3;
971
972 ret = drm_dp_dpcd_writeb(&dp->aux, DP_SET_POWER, value);
973 if (ret < 0)
974 return ret;
975
976 return 0;
977 }
978
analogix_dp_get_output_format(struct analogix_dp_device * dp,u32 bus_format)979 static u32 analogix_dp_get_output_format(struct analogix_dp_device *dp, u32 bus_format)
980 {
981 unsigned int i;
982
983 for (i = 0; i < ARRAY_SIZE(possible_output_fmts); i++) {
984 const struct analogix_dp_output_format *fmt = &possible_output_fmts[i];
985
986 if (fmt->bus_format == bus_format)
987 break;
988 }
989
990 if (i == ARRAY_SIZE(possible_output_fmts))
991 return 1;
992
993 return i;
994 }
995
analogix_dp_get_output_format_by_edid(struct analogix_dp_device * dp,struct hdmi_edid_data * edid_data)996 static u32 analogix_dp_get_output_format_by_edid(struct analogix_dp_device *dp,
997 struct hdmi_edid_data *edid_data)
998 {
999 unsigned int i;
1000
1001 for (i = 0; i < ARRAY_SIZE(possible_output_fmts); i++) {
1002 const struct analogix_dp_output_format *fmt = &possible_output_fmts[i];
1003
1004 if (fmt->bpc > edid_data->display_info.bpc || fmt->bpc > dp->plat_data.max_bpc)
1005 continue;
1006
1007 if (!(edid_data->display_info.color_formats & fmt->color_format))
1008 continue;
1009
1010 if (!analogix_dp_bandwidth_ok(dp, edid_data->preferred_mode,
1011 analogix_dp_get_output_bpp(fmt),
1012 drm_dp_bw_code_to_link_rate(dp->link_train.link_rate),
1013 dp->link_train.lane_count))
1014 continue;
1015
1016 break;
1017 }
1018
1019 if (i == ARRAY_SIZE(possible_output_fmts))
1020 return 1;
1021
1022 return i;
1023 }
1024
analogix_dp_connector_enable(struct rockchip_connector * conn,struct display_state * state)1025 static int analogix_dp_connector_enable(struct rockchip_connector *conn,
1026 struct display_state *state)
1027 {
1028 struct connector_state *conn_state = &state->conn_state;
1029 struct crtc_state *crtc_state = &state->crtc_state;
1030 const struct rockchip_dp_chip_data *pdata =
1031 (const struct rockchip_dp_chip_data *)dev_get_driver_data(conn->dev);
1032 struct analogix_dp_device *dp = dev_get_priv(conn->dev);
1033 struct video_info *video = &dp->video_info;
1034 struct drm_display_mode mode;
1035 u32 fmt_id;
1036 u32 val;
1037 int ret;
1038
1039 drm_mode_copy(&video->mode, &conn_state->mode);
1040
1041 if (pdata->lcdsel_grf_reg) {
1042 if (crtc_state->crtc_id)
1043 val = pdata->lcdsel_lit;
1044 else
1045 val = pdata->lcdsel_big;
1046
1047 regmap_write(dp->grf, pdata->lcdsel_grf_reg, val);
1048 }
1049
1050 if (pdata->chip_type == RK3588_EDP)
1051 regmap_write(dp->grf, dp->id ? RK3588_GRF_VO1_CON1 : RK3588_GRF_VO1_CON0,
1052 EDP_MODE << 16 | FIELD_PREP(EDP_MODE, 1));
1053
1054 if (!dp->output_fmt) {
1055 fmt_id = analogix_dp_get_output_format(dp, conn_state->bus_format);
1056 dp->output_fmt = &possible_output_fmts[fmt_id];
1057 }
1058
1059 switch (dp->output_fmt->bpc) {
1060 case 12:
1061 video->color_depth = COLOR_12;
1062 break;
1063 case 10:
1064 video->color_depth = COLOR_10;
1065 break;
1066 case 6:
1067 video->color_depth = COLOR_6;
1068 break;
1069 case 8:
1070 default:
1071 video->color_depth = COLOR_8;
1072 break;
1073 }
1074 if (dp->output_fmt->color_format == DRM_COLOR_FORMAT_YCRCB444) {
1075 video->color_space = COLOR_YCBCR444;
1076 video->ycbcr_coeff = COLOR_YCBCR709;
1077 } else if (dp->output_fmt->color_format == DRM_COLOR_FORMAT_YCRCB422) {
1078 video->color_space = COLOR_YCBCR422;
1079 video->ycbcr_coeff = COLOR_YCBCR709;
1080 } else {
1081 video->color_space = COLOR_RGB;
1082 video->ycbcr_coeff = COLOR_YCBCR601;
1083 }
1084
1085 ret = drm_dp_dpcd_read(&dp->aux, DP_DPCD_REV, dp->dpcd, DP_RECEIVER_CAP_SIZE);
1086 if (ret < 0) {
1087 dev_err(dp->dev, "failed to read dpcd caps: %d\n", ret);
1088 return ret;
1089 }
1090
1091 ret = analogix_dp_link_power_up(dp);
1092 if (ret) {
1093 dev_err(dp->dev, "failed to power up link: %d\n", ret);
1094 return ret;
1095 }
1096
1097 ret = analogix_dp_set_link_train(dp, dp->video_info.max_lane_count,
1098 dp->video_info.max_link_rate);
1099 if (ret) {
1100 dev_err(dp->dev, "unable to do link train\n");
1101 return ret;
1102 }
1103
1104 ret = analogix_dp_enable_scramble(dp, 1);
1105 if (ret < 0) {
1106 dev_err(dp->dev, "can not enable scramble\n");
1107 return ret;
1108 }
1109
1110 analogix_dp_init_video(dp);
1111
1112 drm_mode_copy(&mode, &conn_state->mode);
1113 if (conn->dual_channel_mode)
1114 drm_mode_convert_to_origin_mode(&mode);
1115 analogix_dp_set_video_format(dp, &mode);
1116
1117 if (dp->video_bist_enable)
1118 analogix_dp_video_bist_enable(dp);
1119
1120 ret = analogix_dp_config_video(dp);
1121 if (ret) {
1122 dev_err(dp->dev, "unable to config video\n");
1123 return ret;
1124 }
1125
1126 return 0;
1127 }
1128
analogix_dp_connector_disable(struct rockchip_connector * conn,struct display_state * state)1129 static int analogix_dp_connector_disable(struct rockchip_connector *conn,
1130 struct display_state *state)
1131 {
1132 const struct rockchip_dp_chip_data *pdata =
1133 (const struct rockchip_dp_chip_data *)dev_get_driver_data(conn->dev);
1134 struct analogix_dp_device *dp = dev_get_priv(conn->dev);
1135
1136 if (!analogix_dp_get_plug_in_status(dp))
1137 analogix_dp_link_power_down(dp);
1138
1139 if (pdata->chip_type == RK3588_EDP)
1140 regmap_write(dp->grf, dp->id ? RK3588_GRF_VO1_CON1 : RK3588_GRF_VO1_CON0,
1141 EDP_MODE << 16 | FIELD_PREP(EDP_MODE, 0));
1142
1143 return 0;
1144 }
1145
analogix_dp_connector_detect(struct rockchip_connector * conn,struct display_state * state)1146 static int analogix_dp_connector_detect(struct rockchip_connector *conn,
1147 struct display_state *state)
1148 {
1149 struct analogix_dp_device *dp = dev_get_priv(conn->dev);
1150 int ret;
1151
1152 if (analogix_dp_detect(dp)) {
1153 /* Initialize by reading RX's DPCD */
1154 ret = analogix_dp_get_max_rx_bandwidth(dp, &dp->link_train.link_rate);
1155 if (ret) {
1156 dev_err(dp->dev, "failed to read max link rate\n");
1157 return 0;
1158 }
1159
1160 ret = analogix_dp_get_max_rx_lane_count(dp, &dp->link_train.lane_count);
1161 if (ret) {
1162 dev_err(dp->dev, "failed to read max lane count\n");
1163 return 0;
1164 }
1165
1166 return 1;
1167 } else {
1168 return 0;
1169 }
1170 }
1171
analogix_dp_connector_mode_valid(struct rockchip_connector * conn,struct display_state * state)1172 static int analogix_dp_connector_mode_valid(struct rockchip_connector *conn,
1173 struct display_state *state)
1174 {
1175 struct connector_state *conn_state = &state->conn_state;
1176 struct videomode vm;
1177
1178 drm_display_mode_to_videomode(&conn_state->mode, &vm);
1179
1180 if (!vm.hfront_porch || !vm.hback_porch || !vm.vfront_porch || !vm.vback_porch) {
1181 dev_err(dp->dev, "front porch or back porch can not be 0\n");
1182 return MODE_BAD;
1183 }
1184
1185 return MODE_OK;
1186 }
1187
analogix_dp_mode_valid(struct analogix_dp_device * dp,struct hdmi_edid_data * edid_data)1188 static int analogix_dp_mode_valid(struct analogix_dp_device *dp, struct hdmi_edid_data *edid_data)
1189 {
1190 struct drm_display_info *di = &edid_data->display_info;
1191 u32 max_link_rate, max_lane_count;
1192 u32 min_bpp;
1193 int i;
1194
1195 if (di->color_formats & DRM_COLOR_FORMAT_YCRCB422)
1196 min_bpp = 16;
1197 else if (di->color_formats & DRM_COLOR_FORMAT_RGB444)
1198 min_bpp = 18;
1199 else
1200 min_bpp = 24;
1201
1202 max_link_rate = min_t(u32, dp->video_info.max_link_rate, dp->link_train.link_rate);
1203 max_lane_count = min_t(u32, dp->video_info.max_lane_count, dp->link_train.lane_count);
1204 for (i = 0; i < edid_data->modes; i++) {
1205 if (!analogix_dp_bandwidth_ok(dp, &edid_data->mode_buf[i], min_bpp,
1206 drm_dp_bw_code_to_link_rate(max_link_rate),
1207 max_lane_count))
1208 edid_data->mode_buf[i].invalid = true;
1209 }
1210
1211 return 0;
1212 }
1213
analogix_dp_connector_get_timing(struct rockchip_connector * conn,struct display_state * state)1214 static int analogix_dp_connector_get_timing(struct rockchip_connector *conn,
1215 struct display_state *state)
1216 {
1217 struct connector_state *conn_state = &state->conn_state;
1218 const struct rockchip_dp_chip_data *pdata =
1219 (const struct rockchip_dp_chip_data *)dev_get_driver_data(conn->dev);
1220 struct analogix_dp_device *dp = dev_get_priv(conn->dev);
1221 struct drm_display_mode *mode = &conn_state->mode;
1222 struct hdmi_edid_data edid_data;
1223 struct drm_display_mode *mode_buf;
1224 struct vop_rect rect;
1225 u32 yuv_fmts_mask = DRM_COLOR_FORMAT_YCRCB444 | DRM_COLOR_FORMAT_YCRCB422;
1226 u32 fmt_id;
1227 int ret = 0, i;
1228
1229 mode_buf = malloc(MODE_LEN * sizeof(struct drm_display_mode));
1230 if (!mode_buf)
1231 return -ENOMEM;
1232
1233 memset(mode_buf, 0, MODE_LEN * sizeof(struct drm_display_mode));
1234 memset(&edid_data, 0, sizeof(struct hdmi_edid_data));
1235 edid_data.mode_buf = mode_buf;
1236
1237 conn_state->edid = drm_do_get_edid(&dp->aux.ddc);
1238 if (conn_state->edid)
1239 ret = drm_add_edid_modes(&edid_data, conn_state->edid);
1240
1241 if (ret <= 0) {
1242 printf("failed to get edid\n");
1243 goto err;
1244 }
1245
1246 if (!pdata->format_yuv) {
1247 if (edid_data.display_info.color_formats & yuv_fmts_mask) {
1248 printf("Swapping display color format from YUV to RGB\n");
1249 edid_data.display_info.color_formats &= ~yuv_fmts_mask;
1250 edid_data.display_info.color_formats |= DRM_COLOR_FORMAT_RGB444;
1251 }
1252 }
1253
1254 if (state->conn_state.secondary) {
1255 rect.width = state->crtc_state.max_output.width / 2;
1256 rect.height = state->crtc_state.max_output.height / 2;
1257 } else {
1258 rect.width = state->crtc_state.max_output.width;
1259 rect.height = state->crtc_state.max_output.height;
1260 }
1261
1262 drm_mode_max_resolution_filter(&edid_data, &rect);
1263 analogix_dp_mode_valid(dp, &edid_data);
1264
1265 if (!drm_mode_prune_invalid(&edid_data)) {
1266 printf("can't find valid dp mode\n");
1267 ret = -EINVAL;
1268 goto err;
1269 }
1270
1271 for (i = 0; i < edid_data.modes; i++)
1272 edid_data.mode_buf[i].vrefresh = drm_mode_vrefresh(&edid_data.mode_buf[i]);
1273
1274 drm_mode_sort(&edid_data);
1275 memcpy(mode, edid_data.preferred_mode, sizeof(struct drm_display_mode));
1276
1277 fmt_id = analogix_dp_get_output_format_by_edid(dp, &edid_data);
1278 dp->output_fmt = &possible_output_fmts[fmt_id];
1279
1280 switch (dp->output_fmt->color_format) {
1281 case DRM_COLOR_FORMAT_YCRCB422:
1282 conn_state->output_mode = ROCKCHIP_OUT_MODE_YUV422;
1283 break;
1284 case DRM_COLOR_FORMAT_RGB444:
1285 case DRM_COLOR_FORMAT_YCRCB444:
1286 default:
1287 conn_state->output_mode = ROCKCHIP_OUT_MODE_AAAA;
1288 break;
1289 }
1290
1291 conn_state->bus_format = dp->output_fmt->bus_format;
1292 conn_state->bpc = dp->output_fmt->bpc;
1293 conn_state->color_encoding = DRM_COLOR_YCBCR_BT709;
1294 if (dp->output_fmt->color_format == DRM_COLOR_FORMAT_RGB444)
1295 conn_state->color_range = DRM_COLOR_YCBCR_FULL_RANGE;
1296 else
1297 conn_state->color_range = DRM_COLOR_YCBCR_LIMITED_RANGE;
1298
1299 err:
1300 free(mode_buf);
1301
1302 return 0;
1303 }
1304
1305 static const struct rockchip_connector_funcs analogix_dp_connector_funcs = {
1306 .init = analogix_dp_connector_init,
1307 .get_edid = analogix_dp_connector_get_edid,
1308 .enable = analogix_dp_connector_enable,
1309 .disable = analogix_dp_connector_disable,
1310 .detect = analogix_dp_connector_detect,
1311 .mode_valid = analogix_dp_connector_mode_valid,
1312 .get_timing = analogix_dp_connector_get_timing,
1313 };
1314
analogix_dp_parse_link_frequencies(struct analogix_dp_device * dp)1315 static u32 analogix_dp_parse_link_frequencies(struct analogix_dp_device *dp)
1316 {
1317 struct udevice *dev = dp->dev;
1318 const struct device_node *endpoint;
1319 u64 frequency = 0;
1320
1321 endpoint = rockchip_of_graph_get_endpoint_by_regs(dev->node, 1, 0);
1322 if (!endpoint)
1323 return 0;
1324
1325 if (of_property_read_u64(endpoint, "link-frequencies", &frequency) < 0)
1326 return 0;
1327
1328 if (!frequency)
1329 return 0;
1330
1331 do_div(frequency, 10 * 1000); /* symbol rate kbytes */
1332
1333 switch (frequency) {
1334 case 162000:
1335 case 270000:
1336 case 540000:
1337 break;
1338 default:
1339 dev_err(dev, "invalid link frequency value: %llu\n", frequency);
1340 return 0;
1341 }
1342
1343 return frequency;
1344 }
1345
analogix_dp_parse_dt(struct analogix_dp_device * dp)1346 static int analogix_dp_parse_dt(struct analogix_dp_device *dp)
1347 {
1348 struct udevice *dev = dp->dev;
1349 int len;
1350 u32 num_lanes;
1351 u32 max_link_rate;
1352 int ret;
1353
1354 dp->force_hpd = dev_read_bool(dev, "force-hpd");
1355 dp->video_bist_enable = dev_read_bool(dev, "analogix,video-bist-enable");
1356 dp->video_info.force_stream_valid =
1357 dev_read_bool(dev, "analogix,force-stream-valid");
1358
1359 max_link_rate = analogix_dp_parse_link_frequencies(dp);
1360 if (max_link_rate && max_link_rate < drm_dp_bw_code_to_link_rate(dp->video_info.max_link_rate))
1361 dp->video_info.max_link_rate = drm_dp_link_rate_to_bw_code(max_link_rate);
1362
1363 if (dev_read_prop(dev, "data-lanes", &len)) {
1364 num_lanes = len / sizeof(u32);
1365 if (num_lanes < 1 || num_lanes > 4 || num_lanes == 3) {
1366 dev_err(dev, "bad number of data lanes\n");
1367 return -EINVAL;
1368 }
1369
1370 ret = dev_read_u32_array(dev, "data-lanes", dp->lane_map,
1371 num_lanes);
1372 if (ret)
1373 return ret;
1374
1375 dp->video_info.max_lane_count = num_lanes;
1376 } else {
1377 dp->lane_map[0] = 0;
1378 dp->lane_map[1] = 1;
1379 dp->lane_map[2] = 2;
1380 dp->lane_map[3] = 3;
1381 }
1382
1383 return 0;
1384 }
1385
analogix_dp_ddc_init(struct analogix_dp_device * dp)1386 static int analogix_dp_ddc_init(struct analogix_dp_device *dp)
1387 {
1388 dp->aux.name = "analogix-dp";
1389 dp->aux.dev = dp->dev;
1390 dp->aux.transfer = analogix_dp_aux_transfer;
1391 dp->aux.ddc.ddc_xfer = drm_dp_i2c_xfer;
1392
1393 return 0;
1394 }
1395
analogix_dp_probe(struct udevice * dev)1396 static int analogix_dp_probe(struct udevice *dev)
1397 {
1398 struct analogix_dp_device *dp = dev_get_priv(dev);
1399 const struct rockchip_dp_chip_data *pdata =
1400 (const struct rockchip_dp_chip_data *)dev_get_driver_data(dev);
1401 struct udevice *syscon;
1402 int ret;
1403
1404 dp->reg_base = dev_read_addr_ptr(dev);
1405
1406 dp->id = of_alias_get_id(ofnode_to_np(dev->node), "edp");
1407 if (dp->id < 0)
1408 dp->id = 0;
1409
1410 ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf",
1411 &syscon);
1412 if (!ret) {
1413 dp->grf = syscon_get_regmap(syscon);
1414 if (!dp->grf)
1415 return -ENODEV;
1416 }
1417
1418 #if defined(CONFIG_MOS_SUPPORT) && !defined(CONFIG_SPL_BUILD)
1419 ret = power_domain_get(dev, &dp->pwrdom);
1420 if (ret) {
1421 dev_err(dev, "failed to get pwrdom: %d\n", ret);
1422 return ret;
1423 }
1424 ret = power_domain_on(&dp->pwrdom);
1425 if (ret) {
1426 dev_err(dev, "failed to power on pd: %d\n", ret);
1427 return ret;
1428 }
1429 ret = clk_get_bulk(dev, &dp->clks);
1430 if (ret) {
1431 dev_err(dev, "failed to get clk: %d\n", ret);
1432 return ret;
1433 }
1434 ret = clk_enable_bulk(&dp->clks);
1435 if (ret) {
1436 dev_err(dev, "failed to enable clk: %d\n", ret);
1437 return ret;
1438 }
1439 #endif
1440
1441 ret = reset_get_bulk(dev, &dp->resets);
1442 if (ret) {
1443 dev_err(dev, "failed to get reset control: %d\n", ret);
1444 return ret;
1445 }
1446
1447 ret = gpio_request_by_name(dev, "hpd-gpios", 0, &dp->hpd_gpio,
1448 GPIOD_IS_IN);
1449 if (ret && ret != -ENOENT) {
1450 dev_err(dev, "failed to get hpd GPIO: %d\n", ret);
1451 return ret;
1452 }
1453
1454 generic_phy_get_by_name(dev, "dp", &dp->phy);
1455
1456 dp->plat_data.dev_type = ROCKCHIP_DP;
1457 dp->plat_data.subdev_type = pdata->chip_type;
1458 dp->plat_data.ssc = pdata->ssc;
1459 dp->plat_data.support_dp_mode = pdata->support_dp_mode;
1460 dp->plat_data.max_bpc = pdata->max_bpc ? pdata->max_bpc : 8;
1461
1462 dp->video_info.max_link_rate = pdata->max_link_rate;
1463 dp->video_info.max_lane_count = pdata->max_lane_count;
1464
1465 dp->dev = dev;
1466
1467 ret = analogix_dp_parse_dt(dp);
1468 if (ret) {
1469 dev_err(dev, "failed to parse DT: %d\n", ret);
1470 return ret;
1471 }
1472
1473 analogix_dp_ddc_init(dp);
1474
1475 rockchip_connector_bind(&dp->connector, dev, dp->id, &analogix_dp_connector_funcs,
1476 NULL, DRM_MODE_CONNECTOR_eDP);
1477
1478 return 0;
1479 }
1480
1481 static const struct rockchip_dp_chip_data rk3288_edp_platform_data = {
1482 .lcdsel_grf_reg = 0x025c,
1483 .lcdsel_big = 0 | BIT(21),
1484 .lcdsel_lit = BIT(5) | BIT(21),
1485 .chip_type = RK3288_DP,
1486
1487 .max_link_rate = DP_LINK_BW_2_7,
1488 .max_lane_count = 4,
1489 };
1490
1491 static const struct rockchip_dp_chip_data rk3368_edp_platform_data = {
1492 .chip_type = RK3368_EDP,
1493
1494 .max_link_rate = DP_LINK_BW_2_7,
1495 .max_lane_count = 4,
1496 };
1497
1498 static const struct rockchip_dp_chip_data rk3399_edp_platform_data = {
1499 .lcdsel_grf_reg = 0x6250,
1500 .lcdsel_big = 0 | BIT(21),
1501 .lcdsel_lit = BIT(5) | BIT(21),
1502 .chip_type = RK3399_EDP,
1503 .ssc = true,
1504
1505 .max_link_rate = DP_LINK_BW_5_4,
1506 .max_lane_count = 4,
1507 };
1508
1509 static const struct rockchip_dp_chip_data rk3568_edp_platform_data = {
1510 .chip_type = RK3568_EDP,
1511 .ssc = true,
1512
1513 .max_link_rate = DP_LINK_BW_2_7,
1514 .max_lane_count = 4,
1515 };
1516
1517 static const struct rockchip_dp_chip_data rk3576_edp_platform_data = {
1518 .chip_type = RK3576_EDP,
1519 .ssc = true,
1520
1521 .max_link_rate = DP_LINK_BW_5_4,
1522 .max_lane_count = 4,
1523 .format_yuv = true,
1524 .support_dp_mode = true,
1525 .max_bpc = 10,
1526 };
1527
1528 static const struct rockchip_dp_chip_data rk3588_edp_platform_data = {
1529 .chip_type = RK3588_EDP,
1530 .ssc = true,
1531
1532 .max_link_rate = DP_LINK_BW_5_4,
1533 .max_lane_count = 4,
1534 .format_yuv = true,
1535 .support_dp_mode = true,
1536 .max_bpc = 10,
1537 };
1538
1539 static const struct udevice_id analogix_dp_ids[] = {
1540 {
1541 .compatible = "rockchip,rk3288-dp",
1542 .data = (ulong)&rk3288_edp_platform_data,
1543 }, {
1544 .compatible = "rockchip,rk3368-edp",
1545 .data = (ulong)&rk3368_edp_platform_data,
1546 }, {
1547 .compatible = "rockchip,rk3399-edp",
1548 .data = (ulong)&rk3399_edp_platform_data,
1549 }, {
1550 .compatible = "rockchip,rk3568-edp",
1551 .data = (ulong)&rk3568_edp_platform_data,
1552 }, {
1553 .compatible = "rockchip,rk3576-edp",
1554 .data = (ulong)&rk3576_edp_platform_data,
1555 }, {
1556 .compatible = "rockchip,rk3588-edp",
1557 .data = (ulong)&rk3588_edp_platform_data,
1558 },
1559 {}
1560 };
1561
1562 U_BOOT_DRIVER(analogix_dp) = {
1563 .name = "analogix_dp",
1564 .id = UCLASS_DISPLAY,
1565 .of_match = analogix_dp_ids,
1566 .probe = analogix_dp_probe,
1567 .priv_auto_alloc_size = sizeof(struct analogix_dp_device),
1568 };
1569