1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Synopsys DesignWare Cores DisplayPort Transmitter Controller
4 *
5 * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
6 *
7 * Author: Wyon Bi <bivvy.bi@rock-chips.com>
8 * Zhang Yubing <yubing.zhang@rock-chips.com>
9 */
10
11 #include <asm/unaligned.h>
12
13 #include <drm/drm_atomic_helper.h>
14 #include <drm/drm_bridge.h>
15 #include <drm/drm_dp_helper.h>
16 #include <drm/drm_hdcp.h>
17 #include <drm/drm_of.h>
18 #include <drm/drm_panel.h>
19 #include <drm/drm_print.h>
20 #include <drm/drm_probe_helper.h>
21 #include <drm/drm_simple_kms_helper.h>
22
23 #include <linux/bitfield.h>
24 #include <linux/clk.h>
25 #include <linux/component.h>
26 #include <linux/extcon-provider.h>
27 #include <linux/iopoll.h>
28 #include <linux/irq.h>
29 #include <linux/of_device.h>
30 #include <linux/of_graph.h>
31 #include <linux/regmap.h>
32 #include <linux/reset.h>
33 #include <linux/gpio/consumer.h>
34 #include <linux/phy/phy.h>
35 #include <linux/mfd/syscon.h>
36 #include <linux/rockchip/rockchip_sip.h>
37 #include <linux/soc/rockchip/rk_vendor_storage.h>
38
39 #include <sound/hdmi-codec.h>
40
41 #include <uapi/linux/videodev2.h>
42
43 #include "rockchip_drm_drv.h"
44 #include "rockchip_drm_vop.h"
45
46 #define DPTX_VERSION_NUMBER 0x0000
47 #define DPTX_VERSION_TYPE 0x0004
48 #define DPTX_ID 0x0008
49
50 #define DPTX_CONFIG_REG1 0x0100
51 #define DPTX_CONFIG_REG2 0x0104
52 #define DPTX_CONFIG_REG3 0x0108
53
54 #define DPTX_CCTL 0x0200
55 #define FORCE_HPD BIT(4)
56 #define DEFAULT_FAST_LINK_TRAIN_EN BIT(2)
57 #define ENHANCE_FRAMING_EN BIT(1)
58 #define SCRAMBLE_DIS BIT(0)
59 #define DPTX_SOFT_RESET_CTRL 0x0204
60 #define VIDEO_RESET BIT(5)
61 #define AUX_RESET BIT(4)
62 #define AUDIO_SAMPLER_RESET BIT(3)
63 #define HDCP_MODULE_RESET BIT(2)
64 #define PHY_SOFT_RESET BIT(1)
65 #define CONTROLLER_RESET BIT(0)
66
67 #define DPTX_VSAMPLE_CTRL 0x0300
68 #define PIXEL_MODE_SELECT GENMASK(22, 21)
69 #define VIDEO_MAPPING GENMASK(20, 16)
70 #define VIDEO_STREAM_ENABLE BIT(5)
71 #define DPTX_VSAMPLE_STUFF_CTRL1 0x0304
72 #define DPTX_VSAMPLE_STUFF_CTRL2 0x0308
73 #define DPTX_VINPUT_POLARITY_CTRL 0x030c
74 #define DE_IN_POLARITY BIT(2)
75 #define HSYNC_IN_POLARITY BIT(1)
76 #define VSYNC_IN_POLARITY BIT(0)
77 #define DPTX_VIDEO_CONFIG1 0x0310
78 #define HACTIVE GENMASK(31, 16)
79 #define HBLANK GENMASK(15, 2)
80 #define I_P BIT(1)
81 #define R_V_BLANK_IN_OSC BIT(0)
82 #define DPTX_VIDEO_CONFIG2 0x0314
83 #define VBLANK GENMASK(31, 16)
84 #define VACTIVE GENMASK(15, 0)
85 #define DPTX_VIDEO_CONFIG3 0x0318
86 #define H_SYNC_WIDTH GENMASK(31, 16)
87 #define H_FRONT_PORCH GENMASK(15, 0)
88 #define DPTX_VIDEO_CONFIG4 0x031c
89 #define V_SYNC_WIDTH GENMASK(31, 16)
90 #define V_FRONT_PORCH GENMASK(15, 0)
91 #define DPTX_VIDEO_CONFIG5 0x0320
92 #define INIT_THRESHOLD_HI GENMASK(22, 21)
93 #define AVERAGE_BYTES_PER_TU_FRAC GENMASK(19, 16)
94 #define INIT_THRESHOLD GENMASK(13, 7)
95 #define AVERAGE_BYTES_PER_TU GENMASK(6, 0)
96 #define DPTX_VIDEO_MSA1 0x0324
97 #define VSTART GENMASK(31, 16)
98 #define HSTART GENMASK(15, 0)
99 #define DPTX_VIDEO_MSA2 0x0328
100 #define MISC0 GENMASK(31, 24)
101 #define DPTX_VIDEO_MSA3 0x032c
102 #define MISC1 GENMASK(31, 24)
103 #define DPTX_VIDEO_HBLANK_INTERVAL 0x0330
104 #define HBLANK_INTERVAL_EN BIT(16)
105 #define HBLANK_INTERVAL GENMASK(15, 0)
106
107 #define DPTX_AUD_CONFIG1 0x0400
108 #define AUDIO_TIMESTAMP_VERSION_NUM GENMASK(29, 24)
109 #define AUDIO_PACKET_ID GENMASK(23, 16)
110 #define AUDIO_MUTE BIT(15)
111 #define NUM_CHANNELS GENMASK(14, 12)
112 #define HBR_MODE_ENABLE BIT(10)
113 #define AUDIO_DATA_WIDTH GENMASK(9, 5)
114 #define AUDIO_DATA_IN_EN GENMASK(4, 1)
115 #define AUDIO_INF_SELECT BIT(0)
116
117 #define DPTX_SDP_VERTICAL_CTRL 0x0500
118 #define EN_VERTICAL_SDP BIT(2)
119 #define EN_AUDIO_STREAM_SDP BIT(1)
120 #define EN_AUDIO_TIMESTAMP_SDP BIT(0)
121 #define DPTX_SDP_HORIZONTAL_CTRL 0x0504
122 #define EN_HORIZONTAL_SDP BIT(2)
123 #define DPTX_SDP_STATUS_REGISTER 0x0508
124 #define DPTX_SDP_MANUAL_CTRL 0x050c
125 #define DPTX_SDP_STATUS_EN 0x0510
126
127 #define DPTX_SDP_REGISTER_BANK 0x0600
128 #define SDP_REGS GENMASK(31, 0)
129
130 #define DPTX_PHYIF_CTRL 0x0a00
131 #define PHY_WIDTH BIT(25)
132 #define PHY_POWERDOWN GENMASK(20, 17)
133 #define PHY_BUSY GENMASK(15, 12)
134 #define SSC_DIS BIT(16)
135 #define XMIT_ENABLE GENMASK(11, 8)
136 #define PHY_LANES GENMASK(7, 6)
137 #define PHY_RATE GENMASK(5, 4)
138 #define TPS_SEL GENMASK(3, 0)
139 #define DPTX_PHY_TX_EQ 0x0a04
140 #define DPTX_CUSTOMPAT0 0x0a08
141 #define DPTX_CUSTOMPAT1 0x0a0c
142 #define DPTX_CUSTOMPAT2 0x0a10
143 #define DPTX_HBR2_COMPLIANCE_SCRAMBLER_RESET 0x0a14
144 #define DPTX_PHYIF_PWRDOWN_CTRL 0x0a18
145
146 #define DPTX_AUX_CMD 0x0b00
147 #define AUX_CMD_TYPE GENMASK(31, 28)
148 #define AUX_ADDR GENMASK(27, 8)
149 #define I2C_ADDR_ONLY BIT(4)
150 #define AUX_LEN_REQ GENMASK(3, 0)
151 #define DPTX_AUX_STATUS 0x0b04
152 #define AUX_TIMEOUT BIT(17)
153 #define AUX_BYTES_READ GENMASK(23, 19)
154 #define AUX_STATUS GENMASK(7, 4)
155 #define DPTX_AUX_DATA0 0x0b08
156 #define DPTX_AUX_DATA1 0x0b0c
157 #define DPTX_AUX_DATA2 0x0b10
158 #define DPTX_AUX_DATA3 0x0b14
159
160 #define DPTX_GENERAL_INTERRUPT 0x0d00
161 #define VIDEO_FIFO_OVERFLOW_STREAM0 BIT(6)
162 #define AUDIO_FIFO_OVERFLOW_STREAM0 BIT(5)
163 #define SDP_EVENT_STREAM0 BIT(4)
164 #define AUX_CMD_INVALID BIT(3)
165 #define HDCP_EVENT BIT(2)
166 #define AUX_REPLY_EVENT BIT(1)
167 #define HPD_EVENT BIT(0)
168 #define DPTX_GENERAL_INTERRUPT_ENABLE 0x0d04
169 #define HDCP_EVENT_EN BIT(2)
170 #define AUX_REPLY_EVENT_EN BIT(1)
171 #define HPD_EVENT_EN BIT(0)
172 #define DPTX_HPD_STATUS 0x0d08
173 #define HPD_STATE GENMASK(11, 9)
174 #define HPD_STATUS BIT(8)
175 #define HPD_HOT_UNPLUG BIT(2)
176 #define HPD_HOT_PLUG BIT(1)
177 #define HPD_IRQ BIT(0)
178 #define DPTX_HPD_INTERRUPT_ENABLE 0x0d0c
179 #define HPD_UNPLUG_ERR_EN BIT(3)
180 #define HPD_UNPLUG_EN BIT(2)
181 #define HPD_PLUG_EN BIT(1)
182 #define HPD_IRQ_EN BIT(0)
183
184 #define DPTX_HDCPCFG 0x0e00
185 #define DPCD12PLUS BIT(7)
186 #define CP_IRQ BIT(6)
187 #define BYPENCRYPTION BIT(5)
188 #define HDCP_LOCK BIT(4)
189 #define ENCRYPTIONDISABLE BIT(3)
190 #define ENABLE_HDCP_13 BIT(2)
191 #define ENABLE_HDCP BIT(1)
192 #define DPTX_HDCPOBS 0x0e04
193 #define HDCP22_RE_AUTHENTICATION_REQ BIT(31)
194 #define HDCP22_AUTHENTICATION_FAILED BIT(30)
195 #define HDCP22_AUTHENTICATION_SUCCESS BIT(29)
196 #define HDCP22_CAPABLE_SINK BIT(28)
197 #define HDCP22_SINK_CAP_CHECK_COMPLETE BIT(27)
198 #define HDCP22_STATE GENMASK(26, 24)
199 #define HDCP22_BOOTED BIT(23)
200 #define HDCP13_BSTATUS GENMASK(22, 19)
201 #define REPEATER BIT(18)
202 #define HDCP_CAPABLE BIT(17)
203 #define STATEE GENMASK(16, 14)
204 #define STATEOEG GENMASK(13, 11)
205 #define STATER GENMASK(10, 8)
206 #define STATEA GENMASK(7, 4)
207 #define SUBSTATEA GENMASK(3, 1)
208 #define HDCPENGAGED BIT(0)
209 #define DPTX_HDCPAPIINTCLR 0x0e08
210 #define DPTX_HDCPAPIINTSTAT 0x0e0c
211 #define DPTX_HDCPAPIINTMSK 0x0e10
212 #define HDCP22_GPIOINT BIT(8)
213 #define HDCP_ENGAGED BIT(7)
214 #define HDCP_FAILED BIT(6)
215 #define KSVSHA1CALCDONEINT BIT(5)
216 #define AUXRESPNACK7TIMES BIT(4)
217 #define AUXRESPTIMEOUT BIT(3)
218 #define AUXRESPDEFER7TIMES BIT(2)
219 #define KSVACCESSINT BIT(0)
220 #define DPTX_HDCPKSVMEMCTRL 0x0e18
221 #define KSVSHA1STATUS BIT(4)
222 #define KSVMEMACCESS BIT(1)
223 #define KSVMEMREQUEST BIT(0)
224 #define DPTX_HDCPREG_BKSV0 0x3600
225 #define DPTX_HDCPREG_BKSV1 0x3604
226 #define DPTX_HDCPREG_ANCONF 0x3608
227 #define OANBYPASS BIT(0)
228 #define DPTX_HDCPREG_AN0 0x360c
229 #define DPTX_HDCPREG_AN1 0x3610
230 #define DPTX_HDCPREG_RMLCTL 0x3614
231 #define ODPK_DECRYPT_ENABLE BIT(0)
232 #define DPTX_HDCPREG_RMLSTS 0x3618
233 #define IDPK_WR_OK_STS BIT(6)
234 #define IDPK_DATA_INDEX GENMASK(5, 0)
235 #define DPTX_HDCPREG_SEED 0x361c
236 #define DPTX_HDCPREG_DPK0 0x3620
237 #define DPTX_HDCPREG_DPK1 0x3624
238 #define DPTX_HDCP22GPIOSTS 0x3628
239 #define DPTX_HDCP22GPIOCHNGSTS 0x362c
240 #define DPTX_HDCPREG_DPK_CRC 0x3630
241
242 #define HDCP_DATA_SIZE 330
243 #define DP_HDCP1X_ID 6
244
245 #define DPTX_MAX_REGISTER DPTX_HDCPREG_DPK_CRC
246
247 #define SDP_REG_BANK_SIZE 16
248
249 enum {
250 HDCP_TX_NONE,
251 HDCP_TX_1,
252 HDCP_TX_2,
253 };
254
255 struct dw_dp_hdcp {
256 struct delayed_work check_work;
257 struct work_struct prop_work;
258 struct mutex mutex;
259 u64 value;
260 unsigned long check_link_interval;
261 int status;
262 u8 hdcp_content_type;
263 bool hdcp2_encrypted;
264 bool hdcp_encrypted;
265 };
266
267 struct drm_dp_link_caps {
268 bool enhanced_framing;
269 bool tps3_supported;
270 bool tps4_supported;
271 bool fast_training;
272 bool channel_coding;
273 bool ssc;
274 };
275
276 struct drm_dp_link_train_set {
277 unsigned int voltage_swing[4];
278 unsigned int pre_emphasis[4];
279 bool voltage_max_reached[4];
280 bool pre_max_reached[4];
281 };
282
283 struct drm_dp_link_train {
284 struct drm_dp_link_train_set request;
285 struct drm_dp_link_train_set adjust;
286 bool clock_recovered;
287 bool channel_equalized;
288 };
289
290 struct dw_dp_link {
291 u8 dpcd[DP_RECEIVER_CAP_SIZE];
292 unsigned char revision;
293 unsigned int rate;
294 unsigned int lanes;
295 struct drm_dp_link_caps caps;
296 struct drm_dp_link_train train;
297 struct drm_dp_desc desc;
298 u8 sink_count;
299 u8 vsc_sdp_extension_for_colorimetry_supported;
300 };
301
302 struct dw_dp_video {
303 struct drm_display_mode mode;
304 u32 bus_format;
305 u8 video_mapping;
306 u8 pixel_mode;
307 u8 color_format;
308 u8 bpc;
309 u8 bpp;
310 };
311
312 enum audio_format {
313 AFMT_I2S = 0,
314 AFMT_SPDIF = 1,
315 AFMT_UNUSED,
316 };
317
318 struct dw_dp_audio {
319 struct platform_device *pdev;
320 hdmi_codec_plugged_cb plugged_cb;
321 struct device *codec_dev;
322 enum audio_format format;
323 u8 channels;
324 };
325
326 struct dw_dp_sdp {
327 struct dp_sdp_header header;
328 u8 db[32];
329 unsigned long flags;
330 };
331
332 struct dw_dp_hotplug {
333 bool long_hpd;
334 bool status;
335 };
336
337 struct dw_dp_compliance_data {
338 struct drm_dp_phy_test_params phytest;
339 };
340
341 struct dw_dp_compliance {
342 unsigned long test_type;
343 struct dw_dp_compliance_data test_data;
344 bool test_active;
345 };
346
347 struct dw_dp {
348 struct device *dev;
349 struct regmap *regmap;
350 struct phy *phy;
351 struct clk *apb_clk;
352 struct clk *aux_clk;
353 struct clk *hclk;
354 struct clk *i2s_clk;
355 struct clk *spdif_clk;
356 struct clk *hdcp_clk;
357 struct reset_control *rstc;
358 struct regmap *grf;
359 struct completion complete;
360 int irq;
361 int hpd_irq;
362 int id;
363 struct work_struct hpd_work;
364 struct gpio_desc *hpd_gpio;
365 bool force_hpd;
366 struct dw_dp_hotplug hotplug;
367 struct mutex irq_lock;
368 struct extcon_dev *extcon;
369
370 struct drm_bridge bridge;
371 struct drm_connector connector;
372 struct drm_encoder encoder;
373 struct drm_dp_aux aux;
374 struct drm_bridge *next_bridge;
375 struct drm_panel *panel;
376
377 struct dw_dp_link link;
378 struct dw_dp_video video;
379 struct dw_dp_audio audio;
380 struct dw_dp_compliance compliance;
381
382 DECLARE_BITMAP(sdp_reg_bank, SDP_REG_BANK_SIZE);
383
384 bool split_mode;
385 struct dw_dp *left;
386 struct dw_dp *right;
387
388 struct drm_property *color_depth_property;
389 struct drm_property *color_format_property;
390 struct drm_property *color_depth_capacity;
391 struct drm_property *color_format_capacity;
392 struct drm_property *hdcp_state_property;
393 struct drm_property *hdr_panel_metadata_property;
394 struct drm_property_blob *hdr_panel_blob_ptr;
395
396 struct rockchip_drm_sub_dev sub_dev;
397 struct dw_dp_hdcp hdcp;
398 int eotf_type;
399
400 u32 max_link_rate;
401 };
402
403 struct dw_dp_state {
404 struct drm_connector_state state;
405
406 int bpc;
407 int color_format;
408 };
409
410 enum {
411 DPTX_VM_RGB_6BIT,
412 DPTX_VM_RGB_8BIT,
413 DPTX_VM_RGB_10BIT,
414 DPTX_VM_RGB_12BIT,
415 DPTX_VM_RGB_16BIT,
416 DPTX_VM_YCBCR444_8BIT,
417 DPTX_VM_YCBCR444_10BIT,
418 DPTX_VM_YCBCR444_12BIT,
419 DPTX_VM_YCBCR444_16BIT,
420 DPTX_VM_YCBCR422_8BIT,
421 DPTX_VM_YCBCR422_10BIT,
422 DPTX_VM_YCBCR422_12BIT,
423 DPTX_VM_YCBCR422_16BIT,
424 DPTX_VM_YCBCR420_8BIT,
425 DPTX_VM_YCBCR420_10BIT,
426 DPTX_VM_YCBCR420_12BIT,
427 DPTX_VM_YCBCR420_16BIT,
428 };
429
430 enum {
431 DPTX_MP_SINGLE_PIXEL,
432 DPTX_MP_DUAL_PIXEL,
433 DPTX_MP_QUAD_PIXEL,
434 };
435
436 enum {
437 DPTX_SDP_VERTICAL_INTERVAL = BIT(0),
438 DPTX_SDP_HORIZONTAL_INTERVAL = BIT(1),
439 };
440
441 enum {
442 SOURCE_STATE_IDLE,
443 SOURCE_STATE_UNPLUG,
444 SOURCE_STATE_HPD_TIMEOUT = 4,
445 SOURCE_STATE_PLUG = 7
446 };
447
448 enum {
449 DPTX_PHY_PATTERN_NONE,
450 DPTX_PHY_PATTERN_TPS_1,
451 DPTX_PHY_PATTERN_TPS_2,
452 DPTX_PHY_PATTERN_TPS_3,
453 DPTX_PHY_PATTERN_TPS_4,
454 DPTX_PHY_PATTERN_SERM,
455 DPTX_PHY_PATTERN_PBRS7,
456 DPTX_PHY_PATTERN_CUSTOM_80BIT,
457 DPTX_PHY_PATTERN_CP2520_1,
458 DPTX_PHY_PATTERN_CP2520_2,
459 };
460
461 static const unsigned int dw_dp_cable[] = {
462 EXTCON_DISP_DP,
463 EXTCON_NONE,
464 };
465
466 struct dw_dp_output_format {
467 u32 bus_format;
468 u32 color_format;
469 u8 video_mapping;
470 u8 bpc;
471 u8 bpp;
472 };
473
474 static const struct dw_dp_output_format possible_output_fmts[] = {
475 { MEDIA_BUS_FMT_RGB101010_1X30, DRM_COLOR_FORMAT_RGB444,
476 DPTX_VM_RGB_10BIT, 10, 30 },
477 { MEDIA_BUS_FMT_RGB888_1X24, DRM_COLOR_FORMAT_RGB444,
478 DPTX_VM_RGB_8BIT, 8, 24 },
479 { MEDIA_BUS_FMT_YUV10_1X30, DRM_COLOR_FORMAT_YCRCB444,
480 DPTX_VM_YCBCR444_10BIT, 10, 30 },
481 { MEDIA_BUS_FMT_YUV8_1X24, DRM_COLOR_FORMAT_YCRCB444,
482 DPTX_VM_YCBCR444_8BIT, 8, 24},
483 { MEDIA_BUS_FMT_YUYV10_1X20, DRM_COLOR_FORMAT_YCRCB422,
484 DPTX_VM_YCBCR422_10BIT, 10, 20 },
485 { MEDIA_BUS_FMT_YUYV8_1X16, DRM_COLOR_FORMAT_YCRCB422,
486 DPTX_VM_YCBCR422_8BIT, 8, 16 },
487 { MEDIA_BUS_FMT_UYYVYY10_0_5X30, DRM_COLOR_FORMAT_YCRCB420,
488 DPTX_VM_YCBCR420_10BIT, 10, 15 },
489 { MEDIA_BUS_FMT_UYYVYY8_0_5X24, DRM_COLOR_FORMAT_YCRCB420,
490 DPTX_VM_YCBCR420_8BIT, 8, 12 },
491 { MEDIA_BUS_FMT_RGB666_1X24_CPADHI, DRM_COLOR_FORMAT_RGB444,
492 DPTX_VM_RGB_6BIT, 6, 18 },
493 };
494
dw_dp_hdcp_init_keys(struct dw_dp * dp)495 static int dw_dp_hdcp_init_keys(struct dw_dp *dp)
496 {
497 u32 val;
498 int size;
499 u8 hdcp_vendor_data[HDCP_DATA_SIZE + 1];
500 void __iomem *base;
501 struct arm_smccc_res res;
502
503 regmap_read(dp->regmap, DPTX_HDCPREG_RMLSTS, &val);
504 if (FIELD_GET(IDPK_DATA_INDEX, val) == 40) {
505 dev_info(dp->dev, "dpk keys already write\n");
506 return 0;
507 }
508
509 size = rk_vendor_read(DP_HDCP1X_ID, hdcp_vendor_data, HDCP_DATA_SIZE);
510 if (size < HDCP_DATA_SIZE) {
511 dev_info(dp->dev, "HDCP: read size %d\n", size);
512 return -EINVAL;
513 }
514
515 base = sip_hdcp_request_share_memory(dp->id ? DP_TX1 : DP_TX0);
516 if (!base)
517 return -ENOMEM;
518
519 memcpy_toio(base, hdcp_vendor_data, size);
520
521 res = sip_hdcp_config(HDCP_FUNC_KEY_LOAD, dp->id ? DP_TX1 : DP_TX0, 0);
522 if (IS_SIP_ERROR(res.a0)) {
523 dev_err(dp->dev, "load hdcp key failed\n");
524 return -EBUSY;
525 }
526
527 return 0;
528 }
529
dw_dp_hdcp_rng_init(struct dw_dp * dp)530 static int dw_dp_hdcp_rng_init(struct dw_dp *dp)
531 {
532 u32 random_val;
533
534 regmap_write(dp->regmap, DPTX_HDCPREG_ANCONF, OANBYPASS);
535 get_random_bytes(&random_val, sizeof(u32));
536 regmap_write(dp->regmap, DPTX_HDCPREG_AN0, random_val);
537 get_random_bytes(&random_val, sizeof(u32));
538 regmap_write(dp->regmap, DPTX_HDCPREG_AN1, random_val);
539
540 return 0;
541 }
542
dw_dp_hw_hdcp_init(struct dw_dp * dp)543 static int dw_dp_hw_hdcp_init(struct dw_dp *dp)
544 {
545 regmap_update_bits(dp->regmap, DPTX_SOFT_RESET_CTRL, HDCP_MODULE_RESET,
546 FIELD_PREP(HDCP_MODULE_RESET, 1));
547 udelay(10);
548 regmap_update_bits(dp->regmap, DPTX_SOFT_RESET_CTRL, HDCP_MODULE_RESET,
549 FIELD_PREP(HDCP_MODULE_RESET, 0));
550
551 regmap_update_bits(dp->regmap, DPTX_GENERAL_INTERRUPT_ENABLE,
552 HDCP_EVENT_EN, FIELD_PREP(HDCP_EVENT_EN, 1));
553
554 return 0;
555 }
556
dw_dp_hdcp2_capable(struct dw_dp * dp)557 static bool dw_dp_hdcp2_capable(struct dw_dp *dp)
558 {
559 u8 rx_caps[3];
560 int ret;
561
562 ret = drm_dp_dpcd_read(&dp->aux, DP_HDCP_2_2_REG_RX_CAPS_OFFSET,
563 rx_caps, HDCP_2_2_RXCAPS_LEN);
564 if (ret != HDCP_2_2_RXCAPS_LEN) {
565 dev_err(dp->dev, "get hdcp2 capable failed:%d\n", ret);
566 return false;
567 }
568
569 if (rx_caps[0] == HDCP_2_2_RX_CAPS_VERSION_VAL &&
570 HDCP_2_2_DP_HDCP_CAPABLE(rx_caps[2]))
571 return true;
572
573 return false;
574 }
575
_dw_dp_hdcp2_disable(struct dw_dp * dp)576 static int _dw_dp_hdcp2_disable(struct dw_dp *dp)
577 {
578 struct dw_dp_hdcp *hdcp = &dp->hdcp;
579
580 regmap_update_bits(dp->regmap, DPTX_HDCPCFG, ENABLE_HDCP, 0);
581 clk_disable_unprepare(dp->hdcp_clk);
582
583 hdcp->status = HDCP_TX_NONE;
584
585 dp->hdcp.hdcp2_encrypted = false;
586
587 return 0;
588 }
589
dw_dp_hdcp2_auth_check(struct dw_dp * dp)590 static int dw_dp_hdcp2_auth_check(struct dw_dp *dp)
591 {
592 u32 val;
593 int ret;
594
595 ret = regmap_read_poll_timeout(dp->regmap, DPTX_HDCPOBS, val,
596 FIELD_GET(HDCP22_BOOTED, val), 1000, 1000000);
597 if (ret) {
598 dev_err(dp->dev, "wait HDCP2 controller booted timeout\n");
599 return ret;
600 }
601
602 ret = regmap_read_poll_timeout(dp->regmap, DPTX_HDCPOBS, val,
603 FIELD_GET(HDCP22_CAPABLE_SINK
604 | HDCP22_SINK_CAP_CHECK_COMPLETE, val),
605 1000, 1000000);
606 if (ret) {
607 dev_err(dp->dev, "sink not support HDCP2\n");
608 return ret;
609 }
610
611 ret = regmap_read_poll_timeout(dp->regmap, DPTX_HDCPOBS, val,
612 FIELD_GET(HDCP22_AUTHENTICATION_SUCCESS, val),
613 1000, 2000000);
614 if (ret) {
615 dev_err(dp->dev, "wait hdcp22 controller auth timeout\n");
616 return ret;
617 }
618
619 dp->hdcp.hdcp2_encrypted = true;
620
621 dev_info(dp->dev, "HDCP2 authentication succeed\n");
622
623 return ret;
624 }
625
_dw_dp_hdcp2_enable(struct dw_dp * dp)626 static int _dw_dp_hdcp2_enable(struct dw_dp *dp)
627 {
628 struct dw_dp_hdcp *hdcp = &dp->hdcp;
629
630 hdcp->status = HDCP_TX_2;
631
632 clk_prepare_enable(dp->hdcp_clk);
633
634 regmap_update_bits(dp->regmap, DPTX_HDCPCFG, ENABLE_HDCP, ENABLE_HDCP);
635
636 return dw_dp_hdcp2_auth_check(dp);
637 }
638
dw_dp_hdcp_capable(struct dw_dp * dp)639 static bool dw_dp_hdcp_capable(struct dw_dp *dp)
640 {
641 int ret;
642 u8 bcaps;
643
644 ret = drm_dp_dpcd_readb(&dp->aux, DP_AUX_HDCP_BCAPS, &bcaps);
645 if (ret != 1) {
646 dev_err(dp->dev, "get hdcp capable failed:%d\n", ret);
647 return false;
648 }
649
650 return bcaps & DP_BCAPS_HDCP_CAPABLE;
651 }
652
_dw_dp_hdcp_disable(struct dw_dp * dp)653 static int _dw_dp_hdcp_disable(struct dw_dp *dp)
654 {
655 struct dw_dp_hdcp *hdcp = &dp->hdcp;
656
657 regmap_update_bits(dp->regmap, DPTX_HDCPCFG, ENABLE_HDCP | ENABLE_HDCP_13, 0);
658
659 hdcp->status = HDCP_TX_NONE;
660
661 dp->hdcp.hdcp_encrypted = false;
662
663 return 0;
664 }
665
dw_dp_hdcp_auth_check(struct dw_dp * dp)666 static int dw_dp_hdcp_auth_check(struct dw_dp *dp)
667 {
668 u32 val;
669 int ret;
670
671 ret = regmap_read_poll_timeout(dp->regmap, DPTX_HDCPAPIINTSTAT, val,
672 FIELD_GET(HDCP_ENGAGED, val), 1000, 1000000);
673 if (ret) {
674 if (val & HDCP_FAILED) {
675 dev_err(dp->dev, " HDCP authentication process failed\n");
676 regmap_write(dp->regmap, DPTX_HDCPAPIINTCLR, HDCP_FAILED);
677 }
678
679 if (val & AUXRESPNACK7TIMES) {
680 dev_err(dp->dev, "Aux received nack response continuously for 7 times\n");
681 regmap_write(dp->regmap, DPTX_HDCPAPIINTCLR, AUXRESPNACK7TIMES);
682 }
683
684 if (val & AUXRESPTIMEOUT) {
685 dev_err(dp->dev, "Aux did not receive a response and timedout\n");
686 regmap_write(dp->regmap, DPTX_HDCPAPIINTCLR, AUXRESPTIMEOUT);
687 }
688
689 if (val & AUXRESPDEFER7TIMES) {
690 dev_err(dp->dev, "Aux received defer response continuously for 7 times\n");
691 regmap_write(dp->regmap, DPTX_HDCPAPIINTCLR, AUXRESPDEFER7TIMES);
692 }
693
694 dev_err(dp->dev, "HDCP authentication timeout\n");
695 } else {
696 regmap_write(dp->regmap, DPTX_HDCPAPIINTCLR, HDCP_ENGAGED);
697 dp->hdcp.hdcp_encrypted = true;
698 dev_info(dp->dev, "HDCP authentication succeed\n");
699 }
700
701 return ret;
702 }
703
_dw_dp_hdcp_enable(struct dw_dp * dp)704 static int _dw_dp_hdcp_enable(struct dw_dp *dp)
705 {
706 int ret;
707 u8 rev;
708 struct dw_dp_hdcp *hdcp = &dp->hdcp;
709
710 hdcp->status = HDCP_TX_1;
711
712 dw_dp_hdcp_rng_init(dp);
713
714 ret = dw_dp_hdcp_init_keys(dp);
715 if (ret)
716 return ret;
717
718 ret = drm_dp_dpcd_readb(&dp->aux, DP_DPCD_REV, &rev);
719 if (ret < 0)
720 return ret;
721
722 if (rev >= DP_DPCD_REV_12)
723 regmap_update_bits(dp->regmap, DPTX_HDCPCFG, DPCD12PLUS, DPCD12PLUS);
724
725 regmap_update_bits(dp->regmap, DPTX_HDCPCFG, ENABLE_HDCP | ENABLE_HDCP_13,
726 ENABLE_HDCP | ENABLE_HDCP_13);
727
728 return dw_dp_hdcp_auth_check(dp);
729
730 return ret;
731 }
732
dw_dp_hdcp_enable(struct dw_dp * dp,u8 content_type)733 static int dw_dp_hdcp_enable(struct dw_dp *dp, u8 content_type)
734 {
735 int ret = -EINVAL;
736
737 dp->hdcp.check_link_interval = DRM_HDCP_CHECK_PERIOD_MS;
738 mutex_lock(&dp->hdcp.mutex);
739 sip_hdcp_config(HDCP_FUNC_ENCRYPT_MODE, dp->id ? DP_TX1 : DP_TX0, 0x0);
740 dw_dp_hw_hdcp_init(dp);
741 if (dw_dp_hdcp2_capable(dp)) {
742 ret = _dw_dp_hdcp2_enable(dp);
743 if (!ret)
744 dp->hdcp.check_link_interval = DRM_HDCP2_CHECK_PERIOD_MS;
745 else
746 _dw_dp_hdcp2_disable(dp);
747 }
748
749 if (ret && dw_dp_hdcp_capable(dp) && content_type != DRM_MODE_HDCP_CONTENT_TYPE1) {
750 ret = _dw_dp_hdcp_enable(dp);
751 if (!ret)
752 dp->hdcp.check_link_interval = DRM_HDCP_CHECK_PERIOD_MS;
753 else
754 _dw_dp_hdcp_disable(dp);
755 }
756
757 if (ret)
758 goto out;
759
760 dp->hdcp.hdcp_content_type = content_type;
761 dp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_ENABLED;
762 schedule_work(&dp->hdcp.prop_work);
763 schedule_delayed_work(&dp->hdcp.check_work, dp->hdcp.check_link_interval);
764
765 out:
766 mutex_unlock(&dp->hdcp.mutex);
767 return ret;
768 }
769
dw_dp_hdcp_disable(struct dw_dp * dp)770 static int dw_dp_hdcp_disable(struct dw_dp *dp)
771 {
772 int ret = 0;
773
774 mutex_lock(&dp->hdcp.mutex);
775 if (dp->hdcp.value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) {
776 dp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_UNDESIRED;
777 sip_hdcp_config(HDCP_FUNC_ENCRYPT_MODE, dp->id ? DP_TX1 : DP_TX0, 0x1);
778 ret = _dw_dp_hdcp_disable(dp);
779 }
780 mutex_unlock(&dp->hdcp.mutex);
781 cancel_delayed_work_sync(&dp->hdcp.check_work);
782
783 return ret;
784 }
785
_dw_dp_hdcp_check_link(struct dw_dp * dp)786 static int _dw_dp_hdcp_check_link(struct dw_dp *dp)
787 {
788 u8 bstatus;
789 int ret;
790
791 ret = drm_dp_dpcd_readb(&dp->aux, DP_AUX_HDCP_BSTATUS, &bstatus);
792 if (ret < 0)
793 return ret;
794
795 if (bstatus & (DP_BSTATUS_LINK_FAILURE | DP_BSTATUS_REAUTH_REQ))
796 return -EINVAL;
797
798 return 0;
799 }
800
dw_dp_hdcp_check_link(struct dw_dp * dp)801 static int dw_dp_hdcp_check_link(struct dw_dp *dp)
802 {
803 int ret = 0;
804
805 mutex_lock(&dp->hdcp.mutex);
806
807 if (dp->hdcp.value == DRM_MODE_CONTENT_PROTECTION_UNDESIRED)
808 goto out;
809
810 ret = _dw_dp_hdcp_check_link(dp);
811 if (!ret)
812 goto out;
813
814 dev_info(dp->dev, "HDCP link failed, retrying authentication\n");
815
816 if (dp->hdcp.status == HDCP_TX_2) {
817 ret = _dw_dp_hdcp2_disable(dp);
818 if (ret) {
819 dp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_DESIRED;
820 schedule_work(&dp->hdcp.prop_work);
821 goto out;
822 }
823
824 ret = _dw_dp_hdcp2_enable(dp);
825 if (ret) {
826 dp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_DESIRED;
827 schedule_work(&dp->hdcp.prop_work);
828 }
829 } else if (dp->hdcp.status == HDCP_TX_1) {
830 ret = _dw_dp_hdcp_disable(dp);
831 if (ret) {
832 dp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_DESIRED;
833 schedule_work(&dp->hdcp.prop_work);
834 goto out;
835 }
836
837 ret = _dw_dp_hdcp_enable(dp);
838 if (ret) {
839 dp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_DESIRED;
840 schedule_work(&dp->hdcp.prop_work);
841 }
842 }
843
844 out:
845 mutex_unlock(&dp->hdcp.mutex);
846 return ret;
847 }
848
dw_dp_hdcp_check_work(struct work_struct * work)849 static void dw_dp_hdcp_check_work(struct work_struct *work)
850 {
851 struct delayed_work *d_work = to_delayed_work(work);
852 struct dw_dp_hdcp *hdcp =
853 container_of(d_work, struct dw_dp_hdcp, check_work);
854 struct dw_dp *dp =
855 container_of(hdcp, struct dw_dp, hdcp);
856
857 if (!dw_dp_hdcp_check_link(dp))
858 schedule_delayed_work(&hdcp->check_work,
859 hdcp->check_link_interval);
860 }
861
dp_dp_hdcp_prop_work(struct work_struct * work)862 static void dp_dp_hdcp_prop_work(struct work_struct *work)
863 {
864 struct dw_dp_hdcp *hdcp =
865 container_of(work, struct dw_dp_hdcp, prop_work);
866 struct dw_dp *dp =
867 container_of(hdcp, struct dw_dp, hdcp);
868 struct drm_device *dev = dp->connector.dev;
869
870 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
871 mutex_lock(&dp->hdcp.mutex);
872 if (dp->hdcp.value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED)
873 drm_hdcp_update_content_protection(&dp->connector, dp->hdcp.value);
874 mutex_unlock(&dp->hdcp.mutex);
875 drm_modeset_unlock(&dev->mode_config.connection_mutex);
876 }
877
dw_dp_hdcp_init(struct dw_dp * dp)878 static void dw_dp_hdcp_init(struct dw_dp *dp)
879 {
880 INIT_DELAYED_WORK(&dp->hdcp.check_work, dw_dp_hdcp_check_work);
881 INIT_WORK(&dp->hdcp.prop_work, dp_dp_hdcp_prop_work);
882 mutex_init(&dp->hdcp.mutex);
883 }
884
dw_dp_handle_hdcp_event(struct dw_dp * dp)885 static void dw_dp_handle_hdcp_event(struct dw_dp *dp)
886 {
887 u32 value;
888
889 mutex_lock(&dp->irq_lock);
890
891 regmap_read(dp->regmap, DPTX_HDCPAPIINTSTAT, &value);
892
893 if (value & HDCP22_GPIOINT) {
894 dev_info(dp->dev, "A change in HDCP22 GPIO Output status\n");
895 regmap_write(dp->regmap, DPTX_HDCPAPIINTCLR, HDCP22_GPIOINT);
896 }
897
898 mutex_unlock(&dp->irq_lock);
899 }
900
901 static const struct drm_prop_enum_list color_depth_enum_list[] = {
902 { 0, "Automatic" },
903 { 6, "18bit" },
904 { 8, "24bit" },
905 { 10, "30bit" },
906 };
907
908 static const struct drm_prop_enum_list color_format_enum_list[] = {
909 { RK_IF_FORMAT_RGB, "rgb" },
910 { RK_IF_FORMAT_YCBCR444, "ycbcr444" },
911 { RK_IF_FORMAT_YCBCR422, "ycbcr422" },
912 { RK_IF_FORMAT_YCBCR420, "ycbcr420" },
913 };
914
dw_dp_get_output_format(u32 bus_format)915 static const struct dw_dp_output_format *dw_dp_get_output_format(u32 bus_format)
916 {
917 unsigned int i;
918
919 for (i = 0; i < ARRAY_SIZE(possible_output_fmts); i++)
920 if (possible_output_fmts[i].bus_format == bus_format)
921 return &possible_output_fmts[i];
922
923 return &possible_output_fmts[1];
924 }
925
connector_to_dp(struct drm_connector * c)926 static inline struct dw_dp *connector_to_dp(struct drm_connector *c)
927 {
928 return container_of(c, struct dw_dp, connector);
929 }
930
encoder_to_dp(struct drm_encoder * e)931 static inline struct dw_dp *encoder_to_dp(struct drm_encoder *e)
932 {
933 return container_of(e, struct dw_dp, encoder);
934 }
935
bridge_to_dp(struct drm_bridge * b)936 static inline struct dw_dp *bridge_to_dp(struct drm_bridge *b)
937 {
938 return container_of(b, struct dw_dp, bridge);
939 }
940
connector_to_dp_state(struct drm_connector_state * cstate)941 static inline struct dw_dp_state *connector_to_dp_state(struct drm_connector_state *cstate)
942 {
943 return container_of(cstate, struct dw_dp_state, state);
944 }
945
dw_dp_match_by_id(struct device * dev,const void * data)946 static int dw_dp_match_by_id(struct device *dev, const void *data)
947 {
948 struct dw_dp *dp = dev_get_drvdata(dev);
949 const unsigned int *id = data;
950
951 return dp->id == *id;
952 }
953
dw_dp_find_by_id(struct device_driver * drv,unsigned int id)954 static struct dw_dp *dw_dp_find_by_id(struct device_driver *drv,
955 unsigned int id)
956 {
957 struct device *dev;
958
959 dev = driver_find_device(drv, NULL, &id, dw_dp_match_by_id);
960 if (!dev)
961 return NULL;
962
963 return dev_get_drvdata(dev);
964 }
965
dw_dp_phy_set_pattern(struct dw_dp * dp,u32 pattern)966 static void dw_dp_phy_set_pattern(struct dw_dp *dp, u32 pattern)
967 {
968 regmap_update_bits(dp->regmap, DPTX_PHYIF_CTRL, TPS_SEL,
969 FIELD_PREP(TPS_SEL, pattern));
970 }
971
dw_dp_phy_xmit_enable(struct dw_dp * dp,u32 lanes)972 static void dw_dp_phy_xmit_enable(struct dw_dp *dp, u32 lanes)
973 {
974 u32 xmit_enable;
975
976 switch (lanes) {
977 case 4:
978 case 2:
979 case 1:
980 xmit_enable = GENMASK(lanes - 1, 0);
981 break;
982 case 0:
983 default:
984 xmit_enable = 0;
985 break;
986 }
987
988 regmap_update_bits(dp->regmap, DPTX_PHYIF_CTRL, XMIT_ENABLE,
989 FIELD_PREP(XMIT_ENABLE, xmit_enable));
990 }
991
dw_dp_bandwidth_ok(struct dw_dp * dp,const struct drm_display_mode * mode,u32 bpp,unsigned int lanes,unsigned int rate)992 static bool dw_dp_bandwidth_ok(struct dw_dp *dp,
993 const struct drm_display_mode *mode, u32 bpp,
994 unsigned int lanes, unsigned int rate)
995 {
996 u32 max_bw, req_bw;
997
998 req_bw = mode->clock * bpp / 8;
999 max_bw = lanes * rate;
1000 if (req_bw > max_bw)
1001 return false;
1002
1003 return true;
1004 }
1005
dw_dp_detect(struct dw_dp * dp)1006 static bool dw_dp_detect(struct dw_dp *dp)
1007 {
1008 u32 value;
1009
1010 if (dp->hpd_gpio)
1011 return gpiod_get_value_cansleep(dp->hpd_gpio);
1012
1013 regmap_read(dp->regmap, DPTX_HPD_STATUS, &value);
1014
1015 return FIELD_GET(HPD_STATE, value) == SOURCE_STATE_PLUG;
1016 }
1017
1018 static enum drm_connector_status
dw_dp_connector_detect(struct drm_connector * connector,bool force)1019 dw_dp_connector_detect(struct drm_connector *connector, bool force)
1020 {
1021 struct dw_dp *dp = connector_to_dp(connector);
1022
1023 if (dp->right && drm_bridge_detect(&dp->right->bridge) != connector_status_connected)
1024 return connector_status_disconnected;
1025
1026 return drm_bridge_detect(&dp->bridge);
1027 }
1028
dw_dp_audio_handle_plugged_change(struct dw_dp_audio * audio,bool plugged)1029 static void dw_dp_audio_handle_plugged_change(struct dw_dp_audio *audio, bool plugged)
1030 {
1031 if (audio->plugged_cb && audio->codec_dev)
1032 audio->plugged_cb(audio->codec_dev, plugged);
1033 }
1034
dw_dp_connector_force(struct drm_connector * connector)1035 static void dw_dp_connector_force(struct drm_connector *connector)
1036 {
1037 struct dw_dp *dp = connector_to_dp(connector);
1038
1039 if (connector->status == connector_status_connected) {
1040 extcon_set_state_sync(dp->extcon, EXTCON_DISP_DP, true);
1041 dw_dp_audio_handle_plugged_change(&dp->audio, true);
1042 } else {
1043 extcon_set_state_sync(dp->extcon, EXTCON_DISP_DP, false);
1044 dw_dp_audio_handle_plugged_change(&dp->audio, false);
1045 }
1046 }
1047
dw_dp_atomic_connector_reset(struct drm_connector * connector)1048 static void dw_dp_atomic_connector_reset(struct drm_connector *connector)
1049 {
1050 struct dw_dp_state *dp_state = connector_to_dp_state(connector->state);
1051
1052 if (connector->state) {
1053 __drm_atomic_helper_connector_destroy_state(connector->state);
1054 kfree(dp_state);
1055 }
1056
1057 dp_state = kzalloc(sizeof(*dp_state), GFP_KERNEL);
1058 if (!dp_state)
1059 return;
1060
1061 __drm_atomic_helper_connector_reset(connector, &dp_state->state);
1062 dp_state->bpc = 0;
1063 dp_state->color_format = RK_IF_FORMAT_RGB;
1064 }
1065
1066 static struct drm_connector_state *
dw_dp_atomic_connector_duplicate_state(struct drm_connector * connector)1067 dw_dp_atomic_connector_duplicate_state(struct drm_connector *connector)
1068 {
1069 struct dw_dp_state *cstate, *old_cstate;
1070
1071 if (WARN_ON(!connector->state))
1072 return NULL;
1073
1074 old_cstate = connector_to_dp_state(connector->state);
1075 cstate = kmalloc(sizeof(*cstate), GFP_KERNEL);
1076 if (!cstate)
1077 return NULL;
1078
1079 __drm_atomic_helper_connector_duplicate_state(connector, &cstate->state);
1080 cstate->bpc = old_cstate->bpc;
1081 cstate->color_format = old_cstate->color_format;
1082
1083 return &cstate->state;
1084 }
1085
dw_dp_atomic_connector_destroy_state(struct drm_connector * connector,struct drm_connector_state * state)1086 static void dw_dp_atomic_connector_destroy_state(struct drm_connector *connector,
1087 struct drm_connector_state *state)
1088 {
1089 struct dw_dp_state *cstate = connector_to_dp_state(state);
1090
1091 __drm_atomic_helper_connector_destroy_state(&cstate->state);
1092 kfree(cstate);
1093 }
1094
dw_dp_atomic_connector_get_property(struct drm_connector * connector,const struct drm_connector_state * state,struct drm_property * property,uint64_t * val)1095 static int dw_dp_atomic_connector_get_property(struct drm_connector *connector,
1096 const struct drm_connector_state *state,
1097 struct drm_property *property,
1098 uint64_t *val)
1099 {
1100 struct dw_dp *dp = connector_to_dp(connector);
1101 struct dw_dp_state *dp_state = connector_to_dp_state((struct drm_connector_state *)state);
1102 struct drm_display_info *info = &connector->display_info;
1103
1104 if (property == dp->color_depth_property) {
1105 *val = dp_state->bpc;
1106 return 0;
1107 } else if (property == dp->color_format_property) {
1108 *val = dp_state->color_format;
1109 return 0;
1110 } else if (property == dp->color_depth_capacity) {
1111 *val = BIT(RK_IF_DEPTH_8);
1112 switch (info->bpc) {
1113 case 16:
1114 fallthrough;
1115 case 12:
1116 fallthrough;
1117 case 10:
1118 *val |= BIT(RK_IF_DEPTH_10);
1119 fallthrough;
1120 case 8:
1121 *val |= BIT(RK_IF_DEPTH_8);
1122 fallthrough;
1123 case 6:
1124 *val |= BIT(RK_IF_DEPTH_6);
1125 fallthrough;
1126 default:
1127 break;
1128 }
1129 return 0;
1130 } else if (property == dp->color_format_capacity) {
1131 *val = info->color_formats;
1132 return 0;
1133 } else if (property == dp->hdcp_state_property) {
1134 if (dp->hdcp.hdcp2_encrypted)
1135 *val = RK_IF_HDCP_ENCRYPTED_LEVEL2;
1136 else if (dp->hdcp.hdcp_encrypted)
1137 *val = RK_IF_HDCP_ENCRYPTED_LEVEL1;
1138 else
1139 *val = RK_IF_HDCP_ENCRYPTED_NONE;
1140 return 0;
1141 }
1142
1143 dev_err(dp->dev, "Unknown property [PROP:%d:%s]\n",
1144 property->base.id, property->name);
1145
1146 return 0;
1147 }
1148
dw_dp_atomic_connector_set_property(struct drm_connector * connector,struct drm_connector_state * state,struct drm_property * property,uint64_t val)1149 static int dw_dp_atomic_connector_set_property(struct drm_connector *connector,
1150 struct drm_connector_state *state,
1151 struct drm_property *property,
1152 uint64_t val)
1153 {
1154 struct dw_dp *dp = connector_to_dp(connector);
1155 struct dw_dp_state *dp_state = connector_to_dp_state(state);
1156
1157 if (property == dp->color_depth_property) {
1158 dp_state->bpc = val;
1159 return 0;
1160 } else if (property == dp->color_format_property) {
1161 dp_state->color_format = val;
1162 return 0;
1163 } else if (property == dp->color_depth_capacity) {
1164 return 0;
1165 } else if (property == dp->color_format_capacity) {
1166 return 0;
1167 } else if (property == dp->hdcp_state_property) {
1168 return 0;
1169 }
1170
1171 dev_err(dp->dev, "Unknown property [PROP:%d:%s]\n",
1172 property->base.id, property->name);
1173
1174 return -EINVAL;
1175 }
1176
1177 static const struct drm_connector_funcs dw_dp_connector_funcs = {
1178 .detect = dw_dp_connector_detect,
1179 .fill_modes = drm_helper_probe_single_connector_modes,
1180 .destroy = drm_connector_cleanup,
1181 .force = dw_dp_connector_force,
1182 .reset = dw_dp_atomic_connector_reset,
1183 .atomic_duplicate_state = dw_dp_atomic_connector_duplicate_state,
1184 .atomic_destroy_state = dw_dp_atomic_connector_destroy_state,
1185 .atomic_get_property = dw_dp_atomic_connector_get_property,
1186 .atomic_set_property = dw_dp_atomic_connector_set_property,
1187 };
1188
dw_dp_update_hdr_property(struct drm_connector * connector)1189 static int dw_dp_update_hdr_property(struct drm_connector *connector)
1190 {
1191 struct dw_dp *dp = connector_to_dp(connector);
1192 struct drm_device *dev = connector->dev;
1193 const struct hdr_static_metadata *metadata =
1194 &connector->hdr_sink_metadata.hdmi_type1;
1195 size_t size = sizeof(*metadata);
1196 int ret;
1197
1198 ret = drm_property_replace_global_blob(dev, &dp->hdr_panel_blob_ptr, size, metadata,
1199 &connector->base, dp->hdr_panel_metadata_property);
1200
1201 return ret;
1202 }
1203
dw_dp_connector_get_modes(struct drm_connector * connector)1204 static int dw_dp_connector_get_modes(struct drm_connector *connector)
1205 {
1206 struct dw_dp *dp = connector_to_dp(connector);
1207 struct drm_display_info *di = &connector->display_info;
1208 struct edid *edid;
1209 int num_modes = 0;
1210
1211 if (dp->right && dp->right->next_bridge) {
1212 struct drm_bridge *bridge = dp->right->next_bridge;
1213
1214 if (bridge->ops & DRM_BRIDGE_OP_MODES) {
1215 if (!drm_bridge_get_modes(bridge, connector))
1216 return 0;
1217 }
1218 }
1219
1220 if (dp->next_bridge)
1221 num_modes = drm_bridge_get_modes(dp->next_bridge, connector);
1222
1223 if (dp->panel)
1224 num_modes = drm_panel_get_modes(dp->panel, connector);
1225
1226 if (!num_modes) {
1227 edid = drm_bridge_get_edid(&dp->bridge, connector);
1228 if (edid) {
1229 drm_connector_update_edid_property(connector, edid);
1230 num_modes = drm_add_edid_modes(connector, edid);
1231 dw_dp_update_hdr_property(connector);
1232 kfree(edid);
1233 }
1234 }
1235
1236 if (!di->color_formats)
1237 di->color_formats = DRM_COLOR_FORMAT_RGB444;
1238
1239 if (!di->bpc)
1240 di->bpc = 8;
1241
1242 if (num_modes > 0 && dp->split_mode) {
1243 struct drm_display_mode *mode;
1244
1245 di->width_mm *= 2;
1246
1247 list_for_each_entry(mode, &connector->probed_modes, head)
1248 drm_mode_convert_to_split_mode(mode);
1249 }
1250
1251 return num_modes;
1252 }
1253
dw_dp_hdcp_atomic_check(struct drm_connector * conn,struct drm_atomic_state * state)1254 static int dw_dp_hdcp_atomic_check(struct drm_connector *conn,
1255 struct drm_atomic_state *state)
1256 {
1257 struct drm_connector_state *old_state, *new_state;
1258 struct drm_crtc_state *crtc_state;
1259 u64 old_cp, new_cp;
1260
1261 old_state = drm_atomic_get_old_connector_state(state, conn);
1262 new_state = drm_atomic_get_new_connector_state(state, conn);
1263 old_cp = old_state->content_protection;
1264 new_cp = new_state->content_protection;
1265
1266 if (old_state->hdcp_content_type != new_state->hdcp_content_type &&
1267 new_cp != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) {
1268 new_state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED;
1269 goto mode_changed;
1270 }
1271
1272 if (!new_state->crtc) {
1273 if (old_cp == DRM_MODE_CONTENT_PROTECTION_ENABLED)
1274 new_state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED;
1275 return 0;
1276 }
1277
1278 if (old_cp == new_cp ||
1279 (old_cp == DRM_MODE_CONTENT_PROTECTION_DESIRED &&
1280 new_cp == DRM_MODE_CONTENT_PROTECTION_ENABLED))
1281 return 0;
1282
1283 mode_changed:
1284 crtc_state = drm_atomic_get_new_crtc_state(state, new_state->crtc);
1285 crtc_state->mode_changed = true;
1286
1287 return 0;
1288 }
1289
dw_dp_hdr_metadata_equal(const struct drm_connector_state * old_state,const struct drm_connector_state * new_state)1290 static bool dw_dp_hdr_metadata_equal(const struct drm_connector_state *old_state,
1291 const struct drm_connector_state *new_state)
1292 {
1293 struct drm_property_blob *old_blob = old_state->hdr_output_metadata;
1294 struct drm_property_blob *new_blob = new_state->hdr_output_metadata;
1295
1296 if (!old_blob || !new_blob)
1297 return old_blob == new_blob;
1298
1299 if (old_blob->length != new_blob->length)
1300 return false;
1301
1302 return !memcmp(old_blob->data, new_blob->data, old_blob->length);
1303 }
1304
dw_dp_is_hdr_eotf(int eotf)1305 static inline bool dw_dp_is_hdr_eotf(int eotf)
1306 {
1307 return eotf > HDMI_EOTF_TRADITIONAL_GAMMA_SDR && eotf <= HDMI_EOTF_BT_2100_HLG;
1308 }
1309
dw_dp_connector_atomic_check(struct drm_connector * conn,struct drm_atomic_state * state)1310 static int dw_dp_connector_atomic_check(struct drm_connector *conn,
1311 struct drm_atomic_state *state)
1312 {
1313 struct drm_connector_state *old_state, *new_state;
1314 struct dw_dp_state *dp_old_state, *dp_new_state;
1315 struct drm_crtc_state *crtc_state;
1316 struct dw_dp *dp = connector_to_dp(conn);
1317
1318 old_state = drm_atomic_get_old_connector_state(state, conn);
1319 new_state = drm_atomic_get_new_connector_state(state, conn);
1320 dp_old_state = connector_to_dp_state(old_state);
1321 dp_new_state = connector_to_dp_state(new_state);
1322
1323 dw_dp_hdcp_atomic_check(conn, state);
1324
1325 if (!new_state->crtc)
1326 return 0;
1327
1328 crtc_state = drm_atomic_get_new_crtc_state(state, new_state->crtc);
1329
1330 if (!dw_dp_hdr_metadata_equal(old_state, new_state))
1331 crtc_state->mode_changed = true;
1332
1333 if ((dp_new_state->bpc != 0) && (dp_new_state->bpc != 6) && (dp_new_state->bpc != 8) &&
1334 (dp_new_state->bpc != 10)) {
1335 dev_err(dp->dev, "set invalid bpc:%d\n", dp_new_state->bpc);
1336 return -EINVAL;
1337 }
1338
1339 if ((dp_new_state->color_format < RK_IF_FORMAT_RGB) ||
1340 (dp_new_state->color_format > RK_IF_FORMAT_YCBCR420)) {
1341 dev_err(dp->dev, "set invalid color format:%d\n", dp_new_state->color_format);
1342 return -EINVAL;
1343 }
1344
1345 if ((dp_old_state->bpc != dp_new_state->bpc) ||
1346 (dp_old_state->color_format != dp_new_state->color_format)) {
1347 if ((dp_old_state->bpc == 0) && (dp_new_state->bpc == 0))
1348 dev_info(dp->dev, "still auto set color mode\n");
1349 else
1350 crtc_state->mode_changed = true;
1351 }
1352
1353 return 0;
1354 }
1355
1356 static const struct drm_connector_helper_funcs dw_dp_connector_helper_funcs = {
1357 .get_modes = dw_dp_connector_get_modes,
1358 .atomic_check = dw_dp_connector_atomic_check,
1359 };
1360
dw_dp_link_caps_reset(struct drm_dp_link_caps * caps)1361 static void dw_dp_link_caps_reset(struct drm_dp_link_caps *caps)
1362 {
1363 caps->enhanced_framing = false;
1364 caps->tps3_supported = false;
1365 caps->tps4_supported = false;
1366 caps->fast_training = false;
1367 caps->channel_coding = false;
1368 }
1369
dw_dp_link_reset(struct dw_dp_link * link)1370 static void dw_dp_link_reset(struct dw_dp_link *link)
1371 {
1372 link->vsc_sdp_extension_for_colorimetry_supported = 0;
1373 link->sink_count = 0;
1374 link->revision = 0;
1375
1376 dw_dp_link_caps_reset(&link->caps);
1377 memset(link->dpcd, 0, sizeof(link->dpcd));
1378
1379 link->rate = 0;
1380 link->lanes = 0;
1381 }
1382
dw_dp_link_power_up(struct dw_dp * dp)1383 static int dw_dp_link_power_up(struct dw_dp *dp)
1384 {
1385 struct dw_dp_link *link = &dp->link;
1386 u8 value;
1387 int ret;
1388
1389 if (link->revision < 0x11)
1390 return 0;
1391
1392 ret = drm_dp_dpcd_readb(&dp->aux, DP_SET_POWER, &value);
1393 if (ret < 0)
1394 return ret;
1395
1396 value &= ~DP_SET_POWER_MASK;
1397 value |= DP_SET_POWER_D0;
1398
1399 ret = drm_dp_dpcd_writeb(&dp->aux, DP_SET_POWER, value);
1400 if (ret < 0)
1401 return ret;
1402
1403 usleep_range(1000, 2000);
1404
1405 return 0;
1406 }
1407
dw_dp_link_power_down(struct dw_dp * dp)1408 static int dw_dp_link_power_down(struct dw_dp *dp)
1409 {
1410 struct dw_dp_link *link = &dp->link;
1411 u8 value;
1412 int ret;
1413
1414 if (link->revision < 0x11)
1415 return 0;
1416
1417 ret = drm_dp_dpcd_readb(&dp->aux, DP_SET_POWER, &value);
1418 if (ret < 0)
1419 return ret;
1420
1421 value &= ~DP_SET_POWER_MASK;
1422 value |= DP_SET_POWER_D3;
1423
1424 ret = drm_dp_dpcd_writeb(&dp->aux, DP_SET_POWER, value);
1425 if (ret < 0)
1426 return ret;
1427
1428 return 0;
1429 }
1430
dw_dp_has_sink_count(const u8 dpcd[DP_RECEIVER_CAP_SIZE],const struct drm_dp_desc * desc)1431 static bool dw_dp_has_sink_count(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
1432 const struct drm_dp_desc *desc)
1433 {
1434 return dpcd[DP_DPCD_REV] >= DP_DPCD_REV_11 &&
1435 dpcd[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_PRESENT &&
1436 !drm_dp_has_quirk(desc, 0, DP_DPCD_QUIRK_NO_SINK_COUNT);
1437 }
1438
dw_dp_link_probe(struct dw_dp * dp)1439 static int dw_dp_link_probe(struct dw_dp *dp)
1440 {
1441 struct dw_dp_link *link = &dp->link;
1442 u8 dpcd;
1443 int ret;
1444
1445 dw_dp_link_reset(link);
1446
1447 ret = drm_dp_read_dpcd_caps(&dp->aux, link->dpcd);
1448 if (ret < 0)
1449 return ret;
1450
1451 drm_dp_read_desc(&dp->aux, &link->desc, drm_dp_is_branch(link->dpcd));
1452
1453 if (dw_dp_has_sink_count(link->dpcd, &link->desc)) {
1454 ret = drm_dp_read_sink_count(&dp->aux);
1455 if (ret < 0)
1456 return ret;
1457
1458 link->sink_count = ret;
1459
1460 /* Dongle connected, but no display */
1461 if (!link->sink_count)
1462 return -ENODEV;
1463 }
1464
1465 ret = drm_dp_dpcd_readb(&dp->aux, DP_DPRX_FEATURE_ENUMERATION_LIST,
1466 &dpcd);
1467 if (ret < 0)
1468 return ret;
1469
1470 link->vsc_sdp_extension_for_colorimetry_supported =
1471 !!(dpcd & DP_VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED);
1472
1473 link->revision = link->dpcd[DP_DPCD_REV];
1474 link->rate = min_t(u32, min(dp->max_link_rate, dp->phy->attrs.max_link_rate * 100),
1475 drm_dp_max_link_rate(link->dpcd));
1476 link->lanes = min_t(u8, phy_get_bus_width(dp->phy),
1477 drm_dp_max_lane_count(link->dpcd));
1478
1479 link->caps.enhanced_framing = drm_dp_enhanced_frame_cap(link->dpcd);
1480 link->caps.tps3_supported = drm_dp_tps3_supported(link->dpcd);
1481 link->caps.tps4_supported = drm_dp_tps4_supported(link->dpcd);
1482 link->caps.fast_training = drm_dp_fast_training_cap(link->dpcd);
1483 link->caps.channel_coding = drm_dp_channel_coding_supported(link->dpcd);
1484 link->caps.ssc = !!(link->dpcd[DP_MAX_DOWNSPREAD] & DP_MAX_DOWNSPREAD_0_5);
1485
1486 return 0;
1487 }
1488
dw_dp_phy_update_vs_emph(struct dw_dp * dp,unsigned int rate,unsigned int lanes,struct drm_dp_link_train_set * train_set)1489 static int dw_dp_phy_update_vs_emph(struct dw_dp *dp, unsigned int rate, unsigned int lanes,
1490 struct drm_dp_link_train_set *train_set)
1491 {
1492 union phy_configure_opts phy_cfg;
1493 unsigned int *vs, *pe;
1494 u8 buf[4];
1495 int i, ret;
1496
1497 vs = train_set->voltage_swing;
1498 pe = train_set->pre_emphasis;
1499
1500 for (i = 0; i < lanes; i++) {
1501 phy_cfg.dp.voltage[i] = vs[i];
1502 phy_cfg.dp.pre[i] = pe[i];
1503 }
1504
1505 phy_cfg.dp.lanes = lanes;
1506 phy_cfg.dp.link_rate = rate / 100;
1507 phy_cfg.dp.set_lanes = false;
1508 phy_cfg.dp.set_rate = false;
1509 phy_cfg.dp.set_voltages = true;
1510
1511 ret = phy_configure(dp->phy, &phy_cfg);
1512 if (ret)
1513 return ret;
1514
1515 for (i = 0; i < lanes; i++) {
1516 buf[i] = (vs[i] << DP_TRAIN_VOLTAGE_SWING_SHIFT) |
1517 (pe[i] << DP_TRAIN_PRE_EMPHASIS_SHIFT);
1518 if (train_set->voltage_max_reached[i])
1519 buf[i] |= DP_TRAIN_MAX_SWING_REACHED;
1520 if (train_set->pre_max_reached[i])
1521 buf[i] |= DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
1522 }
1523
1524 ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, buf, lanes);
1525 if (ret < 0)
1526 return ret;
1527
1528 return 0;
1529 }
1530
dw_dp_link_train_update_vs_emph(struct dw_dp * dp)1531 static int dw_dp_link_train_update_vs_emph(struct dw_dp *dp)
1532 {
1533 struct dw_dp_link *link = &dp->link;
1534 struct drm_dp_link_train_set *request = &link->train.request;
1535
1536 return dw_dp_phy_update_vs_emph(dp, dp->link.rate, dp->link.lanes, request);
1537 }
1538
dw_dp_phy_configure(struct dw_dp * dp,unsigned int rate,unsigned int lanes,bool ssc)1539 static int dw_dp_phy_configure(struct dw_dp *dp, unsigned int rate,
1540 unsigned int lanes, bool ssc)
1541 {
1542 union phy_configure_opts phy_cfg;
1543 int ret;
1544
1545 /* Move PHY to P3 */
1546 regmap_update_bits(dp->regmap, DPTX_PHYIF_CTRL, PHY_POWERDOWN,
1547 FIELD_PREP(PHY_POWERDOWN, 0x3));
1548
1549 phy_cfg.dp.lanes = lanes;
1550 phy_cfg.dp.link_rate = rate / 100;
1551 phy_cfg.dp.ssc = ssc;
1552 phy_cfg.dp.set_lanes = true;
1553 phy_cfg.dp.set_rate = true;
1554 phy_cfg.dp.set_voltages = false;
1555 ret = phy_configure(dp->phy, &phy_cfg);
1556 if (ret)
1557 return ret;
1558
1559 regmap_update_bits(dp->regmap, DPTX_PHYIF_CTRL, PHY_LANES,
1560 FIELD_PREP(PHY_LANES, lanes / 2));
1561
1562 /* Move PHY to P0 */
1563 regmap_update_bits(dp->regmap, DPTX_PHYIF_CTRL, PHY_POWERDOWN,
1564 FIELD_PREP(PHY_POWERDOWN, 0x0));
1565
1566 dw_dp_phy_xmit_enable(dp, lanes);
1567
1568 return 0;
1569 }
1570
dw_dp_link_configure(struct dw_dp * dp)1571 static int dw_dp_link_configure(struct dw_dp *dp)
1572 {
1573 struct dw_dp_link *link = &dp->link;
1574 u8 buf[2];
1575 int ret;
1576
1577 ret = dw_dp_phy_configure(dp, link->rate, link->lanes, link->caps.ssc);
1578 if (ret)
1579 return ret;
1580 buf[0] = drm_dp_link_rate_to_bw_code(link->rate);
1581 buf[1] = link->lanes;
1582
1583 if (link->caps.enhanced_framing) {
1584 buf[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
1585 regmap_update_bits(dp->regmap, DPTX_CCTL, ENHANCE_FRAMING_EN,
1586 FIELD_PREP(ENHANCE_FRAMING_EN, 1));
1587 } else {
1588 regmap_update_bits(dp->regmap, DPTX_CCTL, ENHANCE_FRAMING_EN,
1589 FIELD_PREP(ENHANCE_FRAMING_EN, 0));
1590 }
1591
1592 ret = drm_dp_dpcd_write(&dp->aux, DP_LINK_BW_SET, buf, sizeof(buf));
1593 if (ret < 0)
1594 return ret;
1595
1596 buf[0] = link->caps.ssc ? DP_SPREAD_AMP_0_5 : 0;
1597 buf[1] = link->caps.channel_coding ? DP_SET_ANSI_8B10B : 0;
1598
1599 ret = drm_dp_dpcd_write(&dp->aux, DP_DOWNSPREAD_CTRL, buf,
1600 sizeof(buf));
1601 if (ret < 0)
1602 return ret;
1603
1604 return 0;
1605 }
1606
dw_dp_link_train_init(struct drm_dp_link_train * train)1607 static void dw_dp_link_train_init(struct drm_dp_link_train *train)
1608 {
1609 struct drm_dp_link_train_set *request = &train->request;
1610 struct drm_dp_link_train_set *adjust = &train->adjust;
1611 unsigned int i;
1612
1613 for (i = 0; i < 4; i++) {
1614 request->voltage_swing[i] = 0;
1615 adjust->voltage_swing[i] = 0;
1616
1617 request->pre_emphasis[i] = 0;
1618 adjust->pre_emphasis[i] = 0;
1619
1620 request->voltage_max_reached[i] = false;
1621 adjust->voltage_max_reached[i] = false;
1622
1623 request->pre_max_reached[i] = false;
1624 adjust->pre_max_reached[i] = false;
1625 }
1626
1627 train->clock_recovered = false;
1628 train->channel_equalized = false;
1629 }
1630
dw_dp_link_train_valid(const struct drm_dp_link_train * train)1631 static bool dw_dp_link_train_valid(const struct drm_dp_link_train *train)
1632 {
1633 return train->clock_recovered && train->channel_equalized;
1634 }
1635
dw_dp_link_train_set_pattern(struct dw_dp * dp,u32 pattern)1636 static int dw_dp_link_train_set_pattern(struct dw_dp *dp, u32 pattern)
1637 {
1638 u8 buf = 0;
1639 int ret;
1640
1641 if (pattern && pattern != DP_TRAINING_PATTERN_4) {
1642 buf |= DP_LINK_SCRAMBLING_DISABLE;
1643
1644 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS,
1645 FIELD_PREP(SCRAMBLE_DIS, 1));
1646 } else {
1647 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS,
1648 FIELD_PREP(SCRAMBLE_DIS, 0));
1649 }
1650
1651 switch (pattern) {
1652 case DP_TRAINING_PATTERN_DISABLE:
1653 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_NONE);
1654 break;
1655 case DP_TRAINING_PATTERN_1:
1656 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_TPS_1);
1657 break;
1658 case DP_TRAINING_PATTERN_2:
1659 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_TPS_2);
1660 break;
1661 case DP_TRAINING_PATTERN_3:
1662 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_TPS_3);
1663 break;
1664 case DP_TRAINING_PATTERN_4:
1665 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_TPS_4);
1666 break;
1667 default:
1668 return -EINVAL;
1669 }
1670
1671 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
1672 buf | pattern);
1673 if (ret < 0)
1674 return ret;
1675
1676 return 0;
1677 }
1678
dw_dp_voltage_max(u8 preemph)1679 static u8 dw_dp_voltage_max(u8 preemph)
1680 {
1681 switch (preemph & DP_TRAIN_PRE_EMPHASIS_MASK) {
1682 case DP_TRAIN_PRE_EMPH_LEVEL_0:
1683 return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
1684 case DP_TRAIN_PRE_EMPH_LEVEL_1:
1685 return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
1686 case DP_TRAIN_PRE_EMPH_LEVEL_2:
1687 return DP_TRAIN_VOLTAGE_SWING_LEVEL_1;
1688 case DP_TRAIN_PRE_EMPH_LEVEL_3:
1689 default:
1690 return DP_TRAIN_VOLTAGE_SWING_LEVEL_0;
1691 }
1692 }
1693
dw_dp_link_get_adjustments(struct dw_dp_link * link,u8 status[DP_LINK_STATUS_SIZE])1694 static void dw_dp_link_get_adjustments(struct dw_dp_link *link,
1695 u8 status[DP_LINK_STATUS_SIZE])
1696 {
1697 struct drm_dp_link_train_set *adjust = &link->train.adjust;
1698 u8 v = 0;
1699 u8 p = 0;
1700 unsigned int i;
1701
1702 for (i = 0; i < link->lanes; i++) {
1703 v = drm_dp_get_adjust_request_voltage(status, i);
1704 p = drm_dp_get_adjust_request_pre_emphasis(status, i);
1705 if (p >= DP_TRAIN_PRE_EMPH_LEVEL_3) {
1706 adjust->pre_emphasis[i] = DP_TRAIN_PRE_EMPH_LEVEL_3 >>
1707 DP_TRAIN_PRE_EMPHASIS_SHIFT;
1708 adjust->pre_max_reached[i] = true;
1709 } else {
1710 adjust->pre_emphasis[i] = p >> DP_TRAIN_PRE_EMPHASIS_SHIFT;
1711 adjust->pre_max_reached[i] = false;
1712 }
1713 v = min(v, dw_dp_voltage_max(p));
1714 if (v >= DP_TRAIN_VOLTAGE_SWING_LEVEL_3) {
1715 adjust->voltage_swing[i] = DP_TRAIN_VOLTAGE_SWING_LEVEL_3 >>
1716 DP_TRAIN_VOLTAGE_SWING_SHIFT;
1717 adjust->voltage_max_reached[i] = true;
1718 } else {
1719 adjust->voltage_swing[i] = v >> DP_TRAIN_VOLTAGE_SWING_SHIFT;
1720 adjust->voltage_max_reached[i] = false;
1721 }
1722 }
1723 }
1724
dw_dp_link_train_adjust(struct drm_dp_link_train * train)1725 static void dw_dp_link_train_adjust(struct drm_dp_link_train *train)
1726 {
1727 struct drm_dp_link_train_set *request = &train->request;
1728 struct drm_dp_link_train_set *adjust = &train->adjust;
1729 unsigned int i;
1730
1731 for (i = 0; i < 4; i++) {
1732 if (request->voltage_swing[i] != adjust->voltage_swing[i])
1733 request->voltage_swing[i] = adjust->voltage_swing[i];
1734 if (request->voltage_max_reached[i] != adjust->voltage_max_reached[i])
1735 request->voltage_max_reached[i] = adjust->voltage_max_reached[i];
1736 }
1737
1738 for (i = 0; i < 4; i++) {
1739 if (request->pre_emphasis[i] != adjust->pre_emphasis[i])
1740 request->pre_emphasis[i] = adjust->pre_emphasis[i];
1741 if (request->pre_max_reached[i] != adjust->pre_max_reached[i])
1742 request->pre_max_reached[i] = adjust->pre_max_reached[i];
1743 }
1744 }
1745
dw_dp_link_clock_recovery(struct dw_dp * dp)1746 static int dw_dp_link_clock_recovery(struct dw_dp *dp)
1747 {
1748 struct dw_dp_link *link = &dp->link;
1749 u8 status[DP_LINK_STATUS_SIZE];
1750 unsigned int tries = 0;
1751 int ret;
1752
1753 ret = dw_dp_link_train_set_pattern(dp, DP_TRAINING_PATTERN_1);
1754 if (ret)
1755 return ret;
1756
1757 for (;;) {
1758 ret = dw_dp_link_train_update_vs_emph(dp);
1759 if (ret)
1760 return ret;
1761
1762 drm_dp_link_train_clock_recovery_delay(link->dpcd);
1763
1764 ret = drm_dp_dpcd_read_link_status(&dp->aux, status);
1765 if (ret < 0) {
1766 dev_err(dp->dev, "failed to read link status: %d\n", ret);
1767 return ret;
1768 }
1769
1770 if (drm_dp_clock_recovery_ok(status, link->lanes)) {
1771 link->train.clock_recovered = true;
1772 break;
1773 }
1774
1775 dw_dp_link_get_adjustments(link, status);
1776
1777 if (link->train.request.voltage_swing[0] ==
1778 link->train.adjust.voltage_swing[0])
1779 tries++;
1780 else
1781 tries = 0;
1782
1783 if (tries == 5)
1784 break;
1785
1786 dw_dp_link_train_adjust(&link->train);
1787 }
1788
1789 return 0;
1790 }
1791
dw_dp_link_channel_equalization(struct dw_dp * dp)1792 static int dw_dp_link_channel_equalization(struct dw_dp *dp)
1793 {
1794 struct dw_dp_link *link = &dp->link;
1795 u8 status[DP_LINK_STATUS_SIZE], pattern;
1796 unsigned int tries;
1797 int ret;
1798
1799 if (link->caps.tps4_supported)
1800 pattern = DP_TRAINING_PATTERN_4;
1801 else if (link->caps.tps3_supported)
1802 pattern = DP_TRAINING_PATTERN_3;
1803 else
1804 pattern = DP_TRAINING_PATTERN_2;
1805 ret = dw_dp_link_train_set_pattern(dp, pattern);
1806 if (ret)
1807 return ret;
1808
1809 for (tries = 1; tries < 5; tries++) {
1810 ret = dw_dp_link_train_update_vs_emph(dp);
1811 if (ret)
1812 return ret;
1813
1814 drm_dp_link_train_channel_eq_delay(link->dpcd);
1815
1816 ret = drm_dp_dpcd_read_link_status(&dp->aux, status);
1817 if (ret < 0)
1818 return ret;
1819
1820 if (!drm_dp_clock_recovery_ok(status, link->lanes)) {
1821 dev_err(dp->dev, "clock recovery lost while equalizing channel\n");
1822 link->train.clock_recovered = false;
1823 break;
1824 }
1825
1826 if (drm_dp_channel_eq_ok(status, link->lanes)) {
1827 link->train.channel_equalized = true;
1828 break;
1829 }
1830
1831 dw_dp_link_get_adjustments(link, status);
1832 dw_dp_link_train_adjust(&link->train);
1833 }
1834
1835 return 0;
1836 }
1837
dw_dp_link_downgrade(struct dw_dp * dp)1838 static int dw_dp_link_downgrade(struct dw_dp *dp)
1839 {
1840 struct dw_dp_link *link = &dp->link;
1841 struct dw_dp_video *video = &dp->video;
1842
1843 switch (link->rate) {
1844 case 162000:
1845 return -EINVAL;
1846 case 270000:
1847 link->rate = 162000;
1848 break;
1849 case 540000:
1850 link->rate = 270000;
1851 break;
1852 case 810000:
1853 link->rate = 540000;
1854 break;
1855 }
1856
1857 if (!dw_dp_bandwidth_ok(dp, &video->mode, video->bpp, link->lanes,
1858 link->rate))
1859 return -E2BIG;
1860
1861 return 0;
1862 }
1863
dw_dp_link_train_full(struct dw_dp * dp)1864 static int dw_dp_link_train_full(struct dw_dp *dp)
1865 {
1866 struct dw_dp_link *link = &dp->link;
1867 int ret;
1868
1869 retry:
1870 dw_dp_link_train_init(&link->train);
1871
1872 dev_info(dp->dev, "full-training link: %u lane%s at %u MHz\n",
1873 link->lanes, (link->lanes > 1) ? "s" : "", link->rate / 100);
1874
1875 ret = dw_dp_link_configure(dp);
1876 if (ret < 0) {
1877 dev_err(dp->dev, "failed to configure DP link: %d\n", ret);
1878 return ret;
1879 }
1880
1881 ret = dw_dp_link_clock_recovery(dp);
1882 if (ret < 0) {
1883 dev_err(dp->dev, "clock recovery failed: %d\n", ret);
1884 goto out;
1885 }
1886
1887 if (!link->train.clock_recovered) {
1888 dev_err(dp->dev, "clock recovery failed, downgrading link\n");
1889
1890 ret = dw_dp_link_downgrade(dp);
1891 if (ret < 0)
1892 goto out;
1893 else
1894 goto retry;
1895 }
1896
1897 dev_info(dp->dev, "clock recovery succeeded\n");
1898
1899 ret = dw_dp_link_channel_equalization(dp);
1900 if (ret < 0) {
1901 dev_err(dp->dev, "channel equalization failed: %d\n", ret);
1902 goto out;
1903 }
1904
1905 if (!link->train.channel_equalized) {
1906 dev_err(dp->dev, "channel equalization failed, downgrading link\n");
1907
1908 ret = dw_dp_link_downgrade(dp);
1909 if (ret < 0)
1910 goto out;
1911 else
1912 goto retry;
1913 }
1914
1915 dev_info(dp->dev, "channel equalization succeeded\n");
1916
1917 out:
1918 dw_dp_link_train_set_pattern(dp, DP_TRAINING_PATTERN_DISABLE);
1919 return ret;
1920 }
1921
dw_dp_link_train_fast(struct dw_dp * dp)1922 static int dw_dp_link_train_fast(struct dw_dp *dp)
1923 {
1924 struct dw_dp_link *link = &dp->link;
1925 u8 status[DP_LINK_STATUS_SIZE], pattern;
1926 int ret;
1927
1928 dw_dp_link_train_init(&link->train);
1929
1930 dev_info(dp->dev, "fast-training link: %u lane%s at %u MHz\n",
1931 link->lanes, (link->lanes > 1) ? "s" : "", link->rate / 100);
1932
1933 ret = dw_dp_link_configure(dp);
1934 if (ret < 0) {
1935 dev_err(dp->dev, "failed to configure DP link: %d\n", ret);
1936 return ret;
1937 }
1938
1939 ret = dw_dp_link_train_set_pattern(dp, DP_TRAINING_PATTERN_1);
1940 if (ret)
1941 goto out;
1942
1943 usleep_range(500, 1000);
1944
1945 if (link->caps.tps4_supported)
1946 pattern = DP_TRAINING_PATTERN_4;
1947 else if (link->caps.tps3_supported)
1948 pattern = DP_TRAINING_PATTERN_3;
1949 else
1950 pattern = DP_TRAINING_PATTERN_2;
1951 ret = dw_dp_link_train_set_pattern(dp, pattern);
1952 if (ret)
1953 goto out;
1954
1955 usleep_range(500, 1000);
1956
1957 ret = drm_dp_dpcd_read_link_status(&dp->aux, status);
1958 if (ret < 0) {
1959 dev_err(dp->dev, "failed to read link status: %d\n", ret);
1960 goto out;
1961 }
1962
1963 if (!drm_dp_clock_recovery_ok(status, link->lanes)) {
1964 dev_err(dp->dev, "clock recovery failed\n");
1965 ret = -EIO;
1966 goto out;
1967 }
1968
1969 if (!drm_dp_channel_eq_ok(status, link->lanes)) {
1970 dev_err(dp->dev, "channel equalization failed\n");
1971 ret = -EIO;
1972 goto out;
1973 }
1974
1975 out:
1976 dw_dp_link_train_set_pattern(dp, DP_TRAINING_PATTERN_DISABLE);
1977 return ret;
1978 }
1979
dw_dp_link_train(struct dw_dp * dp)1980 static int dw_dp_link_train(struct dw_dp *dp)
1981 {
1982 struct dw_dp_link *link = &dp->link;
1983 int ret;
1984
1985 if (link->caps.fast_training) {
1986 if (dw_dp_link_train_valid(&link->train)) {
1987 ret = dw_dp_link_train_fast(dp);
1988 if (ret < 0)
1989 dev_err(dp->dev,
1990 "fast link training failed: %d\n", ret);
1991 else
1992 return 0;
1993 }
1994 }
1995
1996 ret = dw_dp_link_train_full(dp);
1997 if (ret < 0) {
1998 dev_err(dp->dev, "full link training failed: %d\n", ret);
1999 return ret;
2000 }
2001
2002 return 0;
2003 }
2004
dw_dp_send_sdp(struct dw_dp * dp,struct dw_dp_sdp * sdp)2005 static int dw_dp_send_sdp(struct dw_dp *dp, struct dw_dp_sdp *sdp)
2006 {
2007 const u8 *payload = sdp->db;
2008 u32 reg;
2009 int i, nr;
2010
2011 nr = find_first_zero_bit(dp->sdp_reg_bank, SDP_REG_BANK_SIZE);
2012 if (nr < SDP_REG_BANK_SIZE)
2013 set_bit(nr, dp->sdp_reg_bank);
2014 else
2015 return -EBUSY;
2016
2017 reg = DPTX_SDP_REGISTER_BANK + nr * 9 * 4;
2018
2019 /* SDP header */
2020 regmap_write(dp->regmap, reg, get_unaligned_le32(&sdp->header));
2021
2022 /* SDP data payload */
2023 for (i = 1; i < 9; i++, payload += 4)
2024 regmap_write(dp->regmap, reg + i * 4,
2025 FIELD_PREP(SDP_REGS, get_unaligned_le32(payload)));
2026
2027 if (sdp->flags & DPTX_SDP_VERTICAL_INTERVAL)
2028 regmap_update_bits(dp->regmap, DPTX_SDP_VERTICAL_CTRL,
2029 EN_VERTICAL_SDP << nr,
2030 EN_VERTICAL_SDP << nr);
2031
2032 if (sdp->flags & DPTX_SDP_HORIZONTAL_INTERVAL)
2033 regmap_update_bits(dp->regmap, DPTX_SDP_HORIZONTAL_CTRL,
2034 EN_HORIZONTAL_SDP << nr,
2035 EN_HORIZONTAL_SDP << nr);
2036
2037 return 0;
2038 }
2039
dw_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp * vsc,struct dw_dp_sdp * sdp)2040 static void dw_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp *vsc,
2041 struct dw_dp_sdp *sdp)
2042 {
2043 sdp->header.HB0 = 0;
2044 sdp->header.HB1 = DP_SDP_VSC;
2045 sdp->header.HB2 = vsc->revision;
2046 sdp->header.HB3 = vsc->length;
2047
2048 sdp->db[16] = (vsc->pixelformat & 0xf) << 4;
2049 sdp->db[16] |= vsc->colorimetry & 0xf;
2050
2051 switch (vsc->bpc) {
2052 case 8:
2053 sdp->db[17] = 0x1;
2054 break;
2055 case 10:
2056 sdp->db[17] = 0x2;
2057 break;
2058 case 12:
2059 sdp->db[17] = 0x3;
2060 break;
2061 case 16:
2062 sdp->db[17] = 0x4;
2063 break;
2064 case 6:
2065 default:
2066 break;
2067 }
2068
2069 if (vsc->dynamic_range == DP_DYNAMIC_RANGE_CTA)
2070 sdp->db[17] |= 0x80;
2071
2072 sdp->db[18] = vsc->content_type & 0x7;
2073
2074 sdp->flags |= DPTX_SDP_VERTICAL_INTERVAL;
2075 }
2076
dw_dp_send_vsc_sdp(struct dw_dp * dp)2077 static int dw_dp_send_vsc_sdp(struct dw_dp *dp)
2078 {
2079 struct dw_dp_video *video = &dp->video;
2080 struct drm_dp_vsc_sdp vsc = {};
2081 struct dw_dp_sdp sdp = {};
2082
2083 vsc.revision = 0x5;
2084 vsc.length = 0x13;
2085
2086 switch (video->color_format) {
2087 case DRM_COLOR_FORMAT_YCRCB444:
2088 vsc.pixelformat = DP_PIXELFORMAT_YUV444;
2089 break;
2090 case DRM_COLOR_FORMAT_YCRCB420:
2091 vsc.pixelformat = DP_PIXELFORMAT_YUV420;
2092 break;
2093 case DRM_COLOR_FORMAT_YCRCB422:
2094 vsc.pixelformat = DP_PIXELFORMAT_YUV422;
2095 break;
2096 case DRM_COLOR_FORMAT_RGB444:
2097 default:
2098 vsc.pixelformat = DP_PIXELFORMAT_RGB;
2099 break;
2100 }
2101
2102 if (video->color_format == DRM_COLOR_FORMAT_RGB444) {
2103 if (dw_dp_is_hdr_eotf(dp->eotf_type))
2104 vsc.colorimetry = DP_COLORIMETRY_BT2020_RGB;
2105 else
2106 vsc.colorimetry = DP_COLORIMETRY_DEFAULT;
2107 vsc.dynamic_range = DP_DYNAMIC_RANGE_VESA;
2108 } else {
2109 if (dw_dp_is_hdr_eotf(dp->eotf_type))
2110 vsc.colorimetry = DP_COLORIMETRY_BT2020_YCC;
2111 else
2112 vsc.colorimetry = DP_COLORIMETRY_BT709_YCC;
2113 vsc.dynamic_range = DP_DYNAMIC_RANGE_CTA;
2114 }
2115
2116 vsc.bpc = video->bpc;
2117 vsc.content_type = DP_CONTENT_TYPE_NOT_DEFINED;
2118
2119 dw_dp_vsc_sdp_pack(&vsc, &sdp);
2120
2121 return dw_dp_send_sdp(dp, &sdp);
2122 }
2123
dw_dp_hdr_metadata_infoframe_sdp_pack(struct dw_dp * dp,const struct hdmi_drm_infoframe * drm_infoframe,struct dw_dp_sdp * sdp)2124 static ssize_t dw_dp_hdr_metadata_infoframe_sdp_pack(struct dw_dp *dp,
2125 const struct hdmi_drm_infoframe *drm_infoframe,
2126 struct dw_dp_sdp *sdp)
2127 {
2128 const int infoframe_size = HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_SIZE;
2129 unsigned char buf[HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_SIZE];
2130 ssize_t len;
2131
2132 memset(sdp, 0, sizeof(*sdp));
2133
2134 len = hdmi_drm_infoframe_pack_only(drm_infoframe, buf, sizeof(buf));
2135 if (len < 0) {
2136 dev_err(dp->dev, "buffer size is smaller than hdr metadata infoframe\n");
2137 return -ENOSPC;
2138 }
2139
2140 if (len != infoframe_size) {
2141 dev_err(dp->dev, "wrong static hdr metadata size\n");
2142 return -ENOSPC;
2143 }
2144
2145 sdp->header.HB0 = 0;
2146 sdp->header.HB1 = drm_infoframe->type;
2147 sdp->header.HB2 = 0x1D;
2148 sdp->header.HB3 = (0x13 << 2);
2149 sdp->db[0] = drm_infoframe->version;
2150 sdp->db[1] = drm_infoframe->length;
2151
2152 memcpy(&sdp->db[2], &buf[HDMI_INFOFRAME_HEADER_SIZE],
2153 HDMI_DRM_INFOFRAME_SIZE);
2154
2155 sdp->flags |= DPTX_SDP_VERTICAL_INTERVAL;
2156
2157 return sizeof(struct dp_sdp_header) + 2 + HDMI_DRM_INFOFRAME_SIZE;
2158 }
2159
dw_dp_send_hdr_metadata_infoframe_sdp(struct dw_dp * dp)2160 static int dw_dp_send_hdr_metadata_infoframe_sdp(struct dw_dp *dp)
2161 {
2162 struct hdmi_drm_infoframe drm_infoframe = {};
2163 struct dw_dp_sdp sdp = {};
2164 struct drm_connector_state *conn_state;
2165 int ret;
2166
2167 conn_state = dp->connector.state;
2168
2169 ret = drm_hdmi_infoframe_set_hdr_metadata(&drm_infoframe, conn_state);
2170 if (ret) {
2171 dev_err(dp->dev, "couldn't set HDR metadata in infoframe\n");
2172 return ret;
2173 }
2174
2175 dw_dp_hdr_metadata_infoframe_sdp_pack(dp, &drm_infoframe, &sdp);
2176
2177 return dw_dp_send_sdp(dp, &sdp);
2178 }
2179
dw_dp_video_set_pixel_mode(struct dw_dp * dp,u8 pixel_mode)2180 static int dw_dp_video_set_pixel_mode(struct dw_dp *dp, u8 pixel_mode)
2181 {
2182 switch (pixel_mode) {
2183 case DPTX_MP_SINGLE_PIXEL:
2184 case DPTX_MP_DUAL_PIXEL:
2185 case DPTX_MP_QUAD_PIXEL:
2186 break;
2187 default:
2188 return -EINVAL;
2189 }
2190
2191 regmap_update_bits(dp->regmap, DPTX_VSAMPLE_CTRL, PIXEL_MODE_SELECT,
2192 FIELD_PREP(PIXEL_MODE_SELECT, pixel_mode));
2193
2194 return 0;
2195 }
2196
dw_dp_video_need_vsc_sdp(struct dw_dp * dp)2197 static bool dw_dp_video_need_vsc_sdp(struct dw_dp *dp)
2198 {
2199 struct dw_dp_link *link = &dp->link;
2200 struct dw_dp_video *video = &dp->video;
2201
2202 if (!link->vsc_sdp_extension_for_colorimetry_supported)
2203 return false;
2204
2205 if (video->color_format == DRM_COLOR_FORMAT_YCRCB420)
2206 return true;
2207
2208 if (dw_dp_is_hdr_eotf(dp->eotf_type))
2209 return true;
2210
2211 return false;
2212 }
2213
dw_dp_video_set_msa(struct dw_dp * dp,u8 color_format,u8 bpc,u16 vstart,u16 hstart)2214 static int dw_dp_video_set_msa(struct dw_dp *dp, u8 color_format, u8 bpc,
2215 u16 vstart, u16 hstart)
2216 {
2217 u16 misc = 0;
2218
2219 if (dw_dp_video_need_vsc_sdp(dp))
2220 misc |= DP_MSA_MISC_COLOR_VSC_SDP;
2221
2222 switch (color_format) {
2223 case DRM_COLOR_FORMAT_RGB444:
2224 misc |= DP_MSA_MISC_COLOR_RGB;
2225 break;
2226 case DRM_COLOR_FORMAT_YCRCB444:
2227 misc |= DP_MSA_MISC_COLOR_YCBCR_444_BT709;
2228 break;
2229 case DRM_COLOR_FORMAT_YCRCB422:
2230 misc |= DP_MSA_MISC_COLOR_YCBCR_422_BT709;
2231 break;
2232 case DRM_COLOR_FORMAT_YCRCB420:
2233 break;
2234 default:
2235 return -EINVAL;
2236 }
2237
2238 switch (bpc) {
2239 case 6:
2240 misc |= DP_MSA_MISC_6_BPC;
2241 break;
2242 case 8:
2243 misc |= DP_MSA_MISC_8_BPC;
2244 break;
2245 case 10:
2246 misc |= DP_MSA_MISC_10_BPC;
2247 break;
2248 case 12:
2249 misc |= DP_MSA_MISC_12_BPC;
2250 break;
2251 case 16:
2252 misc |= DP_MSA_MISC_16_BPC;
2253 break;
2254 default:
2255 return -EINVAL;
2256 }
2257
2258 regmap_write(dp->regmap, DPTX_VIDEO_MSA1,
2259 FIELD_PREP(VSTART, vstart) | FIELD_PREP(HSTART, hstart));
2260 regmap_write(dp->regmap, DPTX_VIDEO_MSA2, FIELD_PREP(MISC0, misc));
2261 regmap_write(dp->regmap, DPTX_VIDEO_MSA3, FIELD_PREP(MISC1, misc >> 8));
2262
2263 return 0;
2264 }
2265
dw_dp_video_disable(struct dw_dp * dp)2266 static void dw_dp_video_disable(struct dw_dp *dp)
2267 {
2268 regmap_update_bits(dp->regmap, DPTX_VSAMPLE_CTRL, VIDEO_STREAM_ENABLE,
2269 FIELD_PREP(VIDEO_STREAM_ENABLE, 0));
2270 }
2271
dw_dp_video_enable(struct dw_dp * dp)2272 static int dw_dp_video_enable(struct dw_dp *dp)
2273 {
2274 struct dw_dp_video *video = &dp->video;
2275 struct dw_dp_link *link = &dp->link;
2276 struct drm_display_mode *mode = &video->mode;
2277 u8 color_format = video->color_format;
2278 u8 bpc = video->bpc;
2279 u8 pixel_mode = video->pixel_mode;
2280 u8 bpp = video->bpp, init_threshold, vic;
2281 u32 hactive, hblank, h_sync_width, h_front_porch;
2282 u32 vactive, vblank, v_sync_width, v_front_porch;
2283 u32 vstart = mode->vtotal - mode->vsync_start;
2284 u32 hstart = mode->htotal - mode->hsync_start;
2285 u32 peak_stream_bandwidth, link_bandwidth;
2286 u32 average_bytes_per_tu, average_bytes_per_tu_frac;
2287 u32 ts, hblank_interval;
2288 u32 value;
2289 int ret;
2290
2291 ret = dw_dp_video_set_pixel_mode(dp, pixel_mode);
2292 if (ret)
2293 return ret;
2294
2295 ret = dw_dp_video_set_msa(dp, color_format, bpc, vstart, hstart);
2296 if (ret)
2297 return ret;
2298
2299 regmap_update_bits(dp->regmap, DPTX_VSAMPLE_CTRL, VIDEO_MAPPING,
2300 FIELD_PREP(VIDEO_MAPPING, video->video_mapping));
2301
2302 /* Configure DPTX_VINPUT_POLARITY_CTRL register */
2303 value = 0;
2304 if (mode->flags & DRM_MODE_FLAG_PHSYNC)
2305 value |= FIELD_PREP(HSYNC_IN_POLARITY, 1);
2306 if (mode->flags & DRM_MODE_FLAG_PVSYNC)
2307 value |= FIELD_PREP(VSYNC_IN_POLARITY, 1);
2308 regmap_write(dp->regmap, DPTX_VINPUT_POLARITY_CTRL, value);
2309
2310 /* Configure DPTX_VIDEO_CONFIG1 register */
2311 hactive = mode->hdisplay;
2312 hblank = mode->htotal - mode->hdisplay;
2313 value = FIELD_PREP(HACTIVE, hactive) | FIELD_PREP(HBLANK, hblank);
2314 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2315 value |= FIELD_PREP(I_P, 1);
2316 vic = drm_match_cea_mode(mode);
2317 if (vic == 5 || vic == 6 || vic == 7 ||
2318 vic == 10 || vic == 11 || vic == 20 ||
2319 vic == 21 || vic == 22 || vic == 39 ||
2320 vic == 25 || vic == 26 || vic == 40 ||
2321 vic == 44 || vic == 45 || vic == 46 ||
2322 vic == 50 || vic == 51 || vic == 54 ||
2323 vic == 55 || vic == 58 || vic == 59)
2324 value |= R_V_BLANK_IN_OSC;
2325 regmap_write(dp->regmap, DPTX_VIDEO_CONFIG1, value);
2326
2327 /* Configure DPTX_VIDEO_CONFIG2 register */
2328 vblank = mode->vtotal - mode->vdisplay;
2329 vactive = mode->vdisplay;
2330 regmap_write(dp->regmap, DPTX_VIDEO_CONFIG2,
2331 FIELD_PREP(VBLANK, vblank) | FIELD_PREP(VACTIVE, vactive));
2332
2333 /* Configure DPTX_VIDEO_CONFIG3 register */
2334 h_sync_width = mode->hsync_end - mode->hsync_start;
2335 h_front_porch = mode->hsync_start - mode->hdisplay;
2336 regmap_write(dp->regmap, DPTX_VIDEO_CONFIG3,
2337 FIELD_PREP(H_SYNC_WIDTH, h_sync_width) |
2338 FIELD_PREP(H_FRONT_PORCH, h_front_porch));
2339
2340 /* Configure DPTX_VIDEO_CONFIG4 register */
2341 v_sync_width = mode->vsync_end - mode->vsync_start;
2342 v_front_porch = mode->vsync_start - mode->vdisplay;
2343 regmap_write(dp->regmap, DPTX_VIDEO_CONFIG4,
2344 FIELD_PREP(V_SYNC_WIDTH, v_sync_width) |
2345 FIELD_PREP(V_FRONT_PORCH, v_front_porch));
2346
2347 /* Configure DPTX_VIDEO_CONFIG5 register */
2348 peak_stream_bandwidth = mode->clock * bpp / 8;
2349 link_bandwidth = (link->rate / 1000) * link->lanes;
2350 ts = peak_stream_bandwidth * 64 / link_bandwidth;
2351 average_bytes_per_tu = ts / 1000;
2352 average_bytes_per_tu_frac = ts / 100 - average_bytes_per_tu * 10;
2353 if (pixel_mode == DPTX_MP_SINGLE_PIXEL) {
2354 if (average_bytes_per_tu < 6)
2355 init_threshold = 32;
2356 else if (hblank <= 80 && color_format != DRM_COLOR_FORMAT_YCRCB420)
2357 init_threshold = 12;
2358 else if (hblank <= 40 && color_format == DRM_COLOR_FORMAT_YCRCB420)
2359 init_threshold = 3;
2360 else
2361 init_threshold = 16;
2362 } else {
2363 u32 t1 = 0, t2 = 0, t3 = 0;
2364
2365 switch (bpc) {
2366 case 6:
2367 t1 = (4 * 1000 / 9) * link->lanes;
2368 break;
2369 case 8:
2370 if (color_format == DRM_COLOR_FORMAT_YCRCB422) {
2371 t1 = (1000 / 2) * link->lanes;
2372 } else {
2373 if (pixel_mode == DPTX_MP_DUAL_PIXEL)
2374 t1 = (1000 / 3) * link->lanes;
2375 else
2376 t1 = (3000 / 16) * link->lanes;
2377 }
2378 break;
2379 case 10:
2380 if (color_format == DRM_COLOR_FORMAT_YCRCB422)
2381 t1 = (2000 / 5) * link->lanes;
2382 else
2383 t1 = (4000 / 15) * link->lanes;
2384 break;
2385 case 12:
2386 if (color_format == DRM_COLOR_FORMAT_YCRCB422) {
2387 if (pixel_mode == DPTX_MP_DUAL_PIXEL)
2388 t1 = (1000 / 6) * link->lanes;
2389 else
2390 t1 = (1000 / 3) * link->lanes;
2391 } else {
2392 t1 = (2000 / 9) * link->lanes;
2393 }
2394 break;
2395 case 16:
2396 if (color_format != DRM_COLOR_FORMAT_YCRCB422 &&
2397 pixel_mode == DPTX_MP_DUAL_PIXEL)
2398 t1 = (1000 / 6) * link->lanes;
2399 else
2400 t1 = (1000 / 4) * link->lanes;
2401 break;
2402 default:
2403 return -EINVAL;
2404 }
2405
2406 if (color_format == DRM_COLOR_FORMAT_YCRCB420)
2407 t2 = (link->rate / 4) * 1000 / (mode->clock / 2);
2408 else
2409 t2 = (link->rate / 4) * 1000 / mode->clock;
2410
2411 if (average_bytes_per_tu_frac)
2412 t3 = average_bytes_per_tu + 1;
2413 else
2414 t3 = average_bytes_per_tu;
2415 init_threshold = t1 * t2 * t3 / (1000 * 1000);
2416 if (init_threshold <= 16 || average_bytes_per_tu < 10)
2417 init_threshold = 40;
2418 }
2419
2420 regmap_write(dp->regmap, DPTX_VIDEO_CONFIG5,
2421 FIELD_PREP(INIT_THRESHOLD_HI, init_threshold >> 6) |
2422 FIELD_PREP(AVERAGE_BYTES_PER_TU_FRAC, average_bytes_per_tu_frac) |
2423 FIELD_PREP(INIT_THRESHOLD, init_threshold) |
2424 FIELD_PREP(AVERAGE_BYTES_PER_TU, average_bytes_per_tu));
2425
2426 /* Configure DPTX_VIDEO_HBLANK_INTERVAL register */
2427 hblank_interval = hblank * (link->rate / 4) / mode->clock;
2428 regmap_write(dp->regmap, DPTX_VIDEO_HBLANK_INTERVAL,
2429 FIELD_PREP(HBLANK_INTERVAL_EN, 1) |
2430 FIELD_PREP(HBLANK_INTERVAL, hblank_interval));
2431
2432 /* Video stream enable */
2433 regmap_update_bits(dp->regmap, DPTX_VSAMPLE_CTRL, VIDEO_STREAM_ENABLE,
2434 FIELD_PREP(VIDEO_STREAM_ENABLE, 1));
2435
2436 if (dw_dp_video_need_vsc_sdp(dp))
2437 dw_dp_send_vsc_sdp(dp);
2438
2439 if (dw_dp_is_hdr_eotf(dp->eotf_type))
2440 dw_dp_send_hdr_metadata_infoframe_sdp(dp);
2441
2442 return 0;
2443 }
2444
dw_dp_hpd_irq_handler(int irq,void * arg)2445 static irqreturn_t dw_dp_hpd_irq_handler(int irq, void *arg)
2446 {
2447 struct dw_dp *dp = arg;
2448 bool hpd = dw_dp_detect(dp);
2449
2450 mutex_lock(&dp->irq_lock);
2451
2452 dp->hotplug.long_hpd = true;
2453
2454 if (dp->hotplug.status && !hpd) {
2455 usleep_range(2000, 2001);
2456
2457 hpd = dw_dp_detect(dp);
2458 if (hpd)
2459 dp->hotplug.long_hpd = false;
2460 }
2461
2462 dp->hotplug.status = hpd;
2463
2464 mutex_unlock(&dp->irq_lock);
2465
2466 schedule_work(&dp->hpd_work);
2467
2468 return IRQ_HANDLED;
2469 }
2470
dw_dp_hpd_init(struct dw_dp * dp)2471 static void dw_dp_hpd_init(struct dw_dp *dp)
2472 {
2473 dp->hotplug.status = dw_dp_detect(dp);
2474
2475 if (dp->hpd_gpio || dp->force_hpd) {
2476 regmap_update_bits(dp->regmap, DPTX_CCTL, FORCE_HPD,
2477 FIELD_PREP(FORCE_HPD, 1));
2478 return;
2479 }
2480
2481 /* Enable all HPD interrupts */
2482 regmap_update_bits(dp->regmap, DPTX_HPD_INTERRUPT_ENABLE,
2483 HPD_UNPLUG_EN | HPD_PLUG_EN | HPD_IRQ_EN,
2484 FIELD_PREP(HPD_UNPLUG_EN, 1) |
2485 FIELD_PREP(HPD_PLUG_EN, 1) |
2486 FIELD_PREP(HPD_IRQ_EN, 1));
2487
2488 /* Enable all top-level interrupts */
2489 regmap_update_bits(dp->regmap, DPTX_GENERAL_INTERRUPT_ENABLE,
2490 HPD_EVENT_EN, FIELD_PREP(HPD_EVENT_EN, 1));
2491 }
2492
dw_dp_aux_init(struct dw_dp * dp)2493 static void dw_dp_aux_init(struct dw_dp *dp)
2494 {
2495 regmap_update_bits(dp->regmap, DPTX_GENERAL_INTERRUPT_ENABLE,
2496 AUX_REPLY_EVENT_EN,
2497 FIELD_PREP(AUX_REPLY_EVENT_EN, 1));
2498 }
2499
dw_dp_init(struct dw_dp * dp)2500 static void dw_dp_init(struct dw_dp *dp)
2501 {
2502 regmap_update_bits(dp->regmap, DPTX_CCTL, DEFAULT_FAST_LINK_TRAIN_EN,
2503 FIELD_PREP(DEFAULT_FAST_LINK_TRAIN_EN, 0));
2504
2505 dw_dp_hpd_init(dp);
2506 dw_dp_aux_init(dp);
2507 }
2508
dw_dp_encoder_enable(struct drm_encoder * encoder)2509 static void dw_dp_encoder_enable(struct drm_encoder *encoder)
2510 {
2511
2512 }
2513
dw_dp_encoder_disable(struct drm_encoder * encoder)2514 static void dw_dp_encoder_disable(struct drm_encoder *encoder)
2515 {
2516 struct dw_dp *dp = encoder_to_dp(encoder);
2517 struct drm_crtc *crtc = encoder->crtc;
2518 struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state);
2519
2520 if (!crtc->state->active_changed)
2521 return;
2522
2523 if (dp->split_mode)
2524 s->output_if &= ~(VOP_OUTPUT_IF_DP0 | VOP_OUTPUT_IF_DP1);
2525 else
2526 s->output_if &= ~(dp->id ? VOP_OUTPUT_IF_DP1 : VOP_OUTPUT_IF_DP0);
2527 }
2528
dw_dp_mode_fixup(struct dw_dp * dp,struct drm_display_mode * adjusted_mode)2529 static void dw_dp_mode_fixup(struct dw_dp *dp, struct drm_display_mode *adjusted_mode)
2530 {
2531 int min_hbp = 16;
2532 int min_hsync = 9;
2533
2534 if (dp->split_mode) {
2535 min_hbp *= 2;
2536 min_hsync *= 2;
2537 }
2538
2539 if (adjusted_mode->hsync_end - adjusted_mode->hsync_start < min_hsync) {
2540 adjusted_mode->hsync_end = adjusted_mode->hsync_start + min_hsync;
2541 dev_warn(dp->dev, "hsync is too narrow, fixup to min hsync:%d\n", min_hsync);
2542 }
2543 if (adjusted_mode->htotal - adjusted_mode->hsync_end < min_hbp) {
2544 adjusted_mode->htotal = adjusted_mode->hsync_end + min_hbp;
2545 dev_warn(dp->dev, "hbp is too narrow, fixup to min hbp:%d\n", min_hbp);
2546 }
2547 }
2548
dw_dp_get_eotf(struct drm_connector_state * conn_state)2549 static int dw_dp_get_eotf(struct drm_connector_state *conn_state)
2550 {
2551 if (conn_state->hdr_output_metadata) {
2552 struct hdr_output_metadata *hdr_metadata =
2553 (struct hdr_output_metadata *)conn_state->hdr_output_metadata->data;
2554
2555 return hdr_metadata->hdmi_metadata_type1.eotf;
2556 }
2557
2558 return HDMI_EOTF_TRADITIONAL_GAMMA_SDR;
2559 }
2560
dw_dp_encoder_atomic_check(struct drm_encoder * encoder,struct drm_crtc_state * crtc_state,struct drm_connector_state * conn_state)2561 static int dw_dp_encoder_atomic_check(struct drm_encoder *encoder,
2562 struct drm_crtc_state *crtc_state,
2563 struct drm_connector_state *conn_state)
2564 {
2565 struct dw_dp *dp = encoder_to_dp(encoder);
2566 struct dw_dp_video *video = &dp->video;
2567 struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
2568 struct drm_display_info *di = &conn_state->connector->display_info;
2569
2570 dp->eotf_type = dw_dp_get_eotf(conn_state);
2571 switch (video->color_format) {
2572 case DRM_COLOR_FORMAT_YCRCB420:
2573 s->output_mode = ROCKCHIP_OUT_MODE_YUV420;
2574 break;
2575 case DRM_COLOR_FORMAT_YCRCB422:
2576 s->output_mode = ROCKCHIP_OUT_MODE_S888_DUMMY;
2577 break;
2578 case DRM_COLOR_FORMAT_RGB444:
2579 case DRM_COLOR_FORMAT_YCRCB444:
2580 default:
2581 s->output_mode = ROCKCHIP_OUT_MODE_AAAA;
2582 break;
2583 }
2584
2585 if (dp->split_mode) {
2586 s->output_flags |= ROCKCHIP_OUTPUT_DUAL_CHANNEL_LEFT_RIGHT_MODE;
2587 s->output_flags |= dp->id ? ROCKCHIP_OUTPUT_DATA_SWAP : 0;
2588 s->output_if |= VOP_OUTPUT_IF_DP0 | VOP_OUTPUT_IF_DP1;
2589 } else {
2590 s->output_if |= dp->id ? VOP_OUTPUT_IF_DP1 : VOP_OUTPUT_IF_DP0;
2591 }
2592
2593 s->output_type = DRM_MODE_CONNECTOR_DisplayPort;
2594 s->bus_format = video->bus_format;
2595 s->bus_flags = di->bus_flags;
2596 s->tv_state = &conn_state->tv;
2597 s->eotf = dp->eotf_type;
2598 if (dw_dp_is_hdr_eotf(s->eotf))
2599 s->color_space = V4L2_COLORSPACE_BT2020;
2600 else
2601 s->color_space = V4L2_COLORSPACE_DEFAULT;
2602
2603 dw_dp_mode_fixup(dp, &crtc_state->adjusted_mode);
2604
2605 return 0;
2606 }
2607
dw_dp_encoder_mode_valid(struct drm_encoder * encoder,const struct drm_display_mode * mode)2608 static enum drm_mode_status dw_dp_encoder_mode_valid(struct drm_encoder *encoder,
2609 const struct drm_display_mode *mode)
2610 {
2611 struct drm_crtc *crtc = encoder->crtc;
2612 struct drm_device *dev = encoder->dev;
2613 struct rockchip_crtc_state *s;
2614
2615 if (!crtc) {
2616 drm_for_each_crtc(crtc, dev) {
2617 if (!drm_encoder_crtc_ok(encoder, crtc))
2618 continue;
2619
2620 s = to_rockchip_crtc_state(crtc->state);
2621 s->output_type = DRM_MODE_CONNECTOR_DisplayPort;
2622 }
2623 }
2624
2625 return MODE_OK;
2626 }
2627
2628 static const struct drm_encoder_helper_funcs dw_dp_encoder_helper_funcs = {
2629 .enable = dw_dp_encoder_enable,
2630 .disable = dw_dp_encoder_disable,
2631 .atomic_check = dw_dp_encoder_atomic_check,
2632 .mode_valid = dw_dp_encoder_mode_valid,
2633 };
2634
dw_dp_aux_write_data(struct dw_dp * dp,const u8 * buffer,size_t size)2635 static int dw_dp_aux_write_data(struct dw_dp *dp, const u8 *buffer, size_t size)
2636 {
2637 size_t i, j;
2638
2639 for (i = 0; i < DIV_ROUND_UP(size, 4); i++) {
2640 size_t num = min_t(size_t, size - i * 4, 4);
2641 u32 value = 0;
2642
2643 for (j = 0; j < num; j++)
2644 value |= buffer[i * 4 + j] << (j * 8);
2645
2646 regmap_write(dp->regmap, DPTX_AUX_DATA0 + i * 4, value);
2647 }
2648
2649 return size;
2650 }
2651
dw_dp_aux_read_data(struct dw_dp * dp,u8 * buffer,size_t size)2652 static int dw_dp_aux_read_data(struct dw_dp *dp, u8 *buffer, size_t size)
2653 {
2654 size_t i, j;
2655
2656 for (i = 0; i < DIV_ROUND_UP(size, 4); i++) {
2657 size_t num = min_t(size_t, size - i * 4, 4);
2658 u32 value;
2659
2660 regmap_read(dp->regmap, DPTX_AUX_DATA0 + i * 4, &value);
2661
2662 for (j = 0; j < num; j++)
2663 buffer[i * 4 + j] = value >> (j * 8);
2664 }
2665
2666 return size;
2667 }
2668
dw_dp_aux_transfer(struct drm_dp_aux * aux,struct drm_dp_aux_msg * msg)2669 static ssize_t dw_dp_aux_transfer(struct drm_dp_aux *aux,
2670 struct drm_dp_aux_msg *msg)
2671 {
2672 struct dw_dp *dp = container_of(aux, struct dw_dp, aux);
2673 unsigned long timeout = msecs_to_jiffies(10);
2674 u32 status, value;
2675 ssize_t ret = 0;
2676
2677 if (WARN_ON(msg->size > 16))
2678 return -E2BIG;
2679
2680 switch (msg->request & ~DP_AUX_I2C_MOT) {
2681 case DP_AUX_NATIVE_WRITE:
2682 case DP_AUX_I2C_WRITE:
2683 case DP_AUX_I2C_WRITE_STATUS_UPDATE:
2684 ret = dw_dp_aux_write_data(dp, msg->buffer, msg->size);
2685 if (ret < 0)
2686 return ret;
2687 break;
2688 case DP_AUX_NATIVE_READ:
2689 case DP_AUX_I2C_READ:
2690 break;
2691 default:
2692 return -EINVAL;
2693 }
2694
2695 if (msg->size > 0)
2696 value = FIELD_PREP(AUX_LEN_REQ, msg->size - 1);
2697 else
2698 value = FIELD_PREP(I2C_ADDR_ONLY, 1);
2699 value |= FIELD_PREP(AUX_CMD_TYPE, msg->request);
2700 value |= FIELD_PREP(AUX_ADDR, msg->address);
2701 regmap_write(dp->regmap, DPTX_AUX_CMD, value);
2702
2703 status = wait_for_completion_timeout(&dp->complete, timeout);
2704 if (!status) {
2705 dev_dbg(dp->dev, "timeout waiting for AUX reply\n");
2706 return -ETIMEDOUT;
2707 }
2708
2709 regmap_read(dp->regmap, DPTX_AUX_STATUS, &value);
2710 if (value & AUX_TIMEOUT)
2711 return -ETIMEDOUT;
2712
2713 msg->reply = FIELD_GET(AUX_STATUS, value);
2714
2715 if (msg->size > 0 && msg->reply == DP_AUX_NATIVE_REPLY_ACK) {
2716 if (msg->request & DP_AUX_I2C_READ) {
2717 size_t count = FIELD_GET(AUX_BYTES_READ, value) - 1;
2718
2719 if (count != msg->size)
2720 return -EBUSY;
2721
2722 ret = dw_dp_aux_read_data(dp, msg->buffer, count);
2723 if (ret < 0)
2724 return ret;
2725 }
2726 }
2727
2728 return ret;
2729 }
2730
2731 static enum drm_mode_status
dw_dp_bridge_mode_valid(struct drm_bridge * bridge,const struct drm_display_info * info,const struct drm_display_mode * mode)2732 dw_dp_bridge_mode_valid(struct drm_bridge *bridge,
2733 const struct drm_display_info *info,
2734 const struct drm_display_mode *mode)
2735 {
2736 struct dw_dp *dp = bridge_to_dp(bridge);
2737 struct dw_dp_link *link = &dp->link;
2738 struct drm_display_mode m;
2739 u32 min_bpp;
2740
2741 drm_mode_copy(&m, mode);
2742
2743 if (dp->split_mode)
2744 drm_mode_convert_to_origin_mode(&m);
2745
2746 if (info->color_formats & DRM_COLOR_FORMAT_YCRCB420 &&
2747 link->vsc_sdp_extension_for_colorimetry_supported &&
2748 (drm_mode_is_420_only(info, &m) || drm_mode_is_420_also(info, &m)))
2749 min_bpp = 12;
2750 else if (info->color_formats & DRM_COLOR_FORMAT_YCRCB422)
2751 min_bpp = 16;
2752 else if (info->color_formats & DRM_COLOR_FORMAT_RGB444)
2753 min_bpp = 18;
2754 else
2755 min_bpp = 24;
2756
2757 if (!link->vsc_sdp_extension_for_colorimetry_supported &&
2758 drm_mode_is_420_only(info, &m))
2759 return MODE_NO_420;
2760
2761 if (!dw_dp_bandwidth_ok(dp, &m, min_bpp, link->lanes, link->rate))
2762 return MODE_CLOCK_HIGH;
2763
2764 return MODE_OK;
2765 }
2766
_dw_dp_loader_protect(struct dw_dp * dp,bool on)2767 static void _dw_dp_loader_protect(struct dw_dp *dp, bool on)
2768 {
2769 struct dw_dp_link *link = &dp->link;
2770 struct drm_connector *conn = &dp->connector;
2771 struct drm_display_info *di = &conn->display_info;
2772
2773 u32 value;
2774
2775 if (on) {
2776 di->color_formats = DRM_COLOR_FORMAT_RGB444;
2777 di->bpc = 8;
2778
2779 regmap_read(dp->regmap, DPTX_PHYIF_CTRL, &value);
2780 switch (FIELD_GET(PHY_LANES, value)) {
2781 case 2:
2782 link->lanes = 4;
2783 break;
2784 case 1:
2785 link->lanes = 2;
2786 break;
2787 case 0:
2788 fallthrough;
2789 default:
2790 link->lanes = 1;
2791 break;
2792 }
2793
2794 switch (FIELD_GET(PHY_RATE, value)) {
2795 case 3:
2796 link->rate = 810000;
2797 break;
2798 case 2:
2799 link->rate = 540000;
2800 break;
2801 case 1:
2802 link->rate = 270000;
2803 break;
2804 case 0:
2805 fallthrough;
2806 default:
2807 link->rate = 162000;
2808 break;
2809 }
2810
2811 phy_power_on(dp->phy);
2812 } else {
2813 phy_power_off(dp->phy);
2814 }
2815 }
2816
dw_dp_loader_protect(struct drm_encoder * encoder,bool on)2817 static int dw_dp_loader_protect(struct drm_encoder *encoder, bool on)
2818 {
2819 struct dw_dp *dp = encoder_to_dp(encoder);
2820
2821 _dw_dp_loader_protect(dp, on);
2822 if (dp->right)
2823 _dw_dp_loader_protect(dp->right, on);
2824
2825 return 0;
2826 }
2827
dw_dp_connector_init(struct dw_dp * dp)2828 static int dw_dp_connector_init(struct dw_dp *dp)
2829 {
2830 struct drm_connector *connector = &dp->connector;
2831 struct drm_bridge *bridge = &dp->bridge;
2832 struct drm_property *prop;
2833 struct drm_device *dev = bridge->dev;
2834 int ret;
2835
2836 connector->polled = DRM_CONNECTOR_POLL_HPD;
2837 if (dp->next_bridge && dp->next_bridge->ops & DRM_BRIDGE_OP_DETECT)
2838 connector->polled = DRM_CONNECTOR_POLL_CONNECT |
2839 DRM_CONNECTOR_POLL_DISCONNECT;
2840 connector->ycbcr_420_allowed = true;
2841
2842 ret = drm_connector_init(bridge->dev, connector,
2843 &dw_dp_connector_funcs,
2844 DRM_MODE_CONNECTOR_DisplayPort);
2845 if (ret) {
2846 DRM_DEV_ERROR(dp->dev, "Failed to initialize connector\n");
2847 return ret;
2848 }
2849
2850 drm_connector_helper_add(connector,
2851 &dw_dp_connector_helper_funcs);
2852
2853 drm_connector_attach_encoder(connector, bridge->encoder);
2854
2855 prop = drm_property_create_enum(connector->dev, 0, RK_IF_PROP_COLOR_DEPTH,
2856 color_depth_enum_list,
2857 ARRAY_SIZE(color_depth_enum_list));
2858 if (!prop) {
2859 DRM_DEV_ERROR(dp->dev, "create color depth prop for dp%d failed\n", dp->id);
2860 return -ENOMEM;
2861 }
2862 dp->color_depth_property = prop;
2863 drm_object_attach_property(&connector->base, prop, 0);
2864
2865 prop = drm_property_create_enum(connector->dev, 0, RK_IF_PROP_COLOR_FORMAT,
2866 color_format_enum_list,
2867 ARRAY_SIZE(color_format_enum_list));
2868 if (!prop) {
2869 DRM_DEV_ERROR(dp->dev, "create color format prop for dp%d failed\n", dp->id);
2870 return -ENOMEM;
2871 }
2872 dp->color_format_property = prop;
2873 drm_object_attach_property(&connector->base, prop, 0);
2874
2875 prop = drm_property_create_range(connector->dev, 0, RK_IF_PROP_COLOR_DEPTH_CAPS,
2876 0, 1 << RK_IF_DEPTH_MAX);
2877 if (!prop) {
2878 DRM_DEV_ERROR(dp->dev, "create color depth caps prop for dp%d failed\n", dp->id);
2879 return -ENOMEM;
2880 }
2881 dp->color_depth_capacity = prop;
2882 drm_object_attach_property(&connector->base, prop, 0);
2883
2884 prop = drm_property_create_range(connector->dev, 0, RK_IF_PROP_COLOR_FORMAT_CAPS,
2885 0, 1 << RK_IF_FORMAT_MAX);
2886 if (!prop) {
2887 DRM_DEV_ERROR(dp->dev, "create color format caps prop for dp%d failed\n", dp->id);
2888 return -ENOMEM;
2889 }
2890 dp->color_format_capacity = prop;
2891 drm_object_attach_property(&connector->base, prop, 0);
2892
2893 ret = drm_connector_attach_content_protection_property(&dp->connector, true);
2894 if (ret) {
2895 dev_err(dp->dev, "failed to attach content protection: %d\n", ret);
2896 return ret;
2897 }
2898
2899 prop = drm_property_create_range(connector->dev, 0, RK_IF_PROP_ENCRYPTED,
2900 RK_IF_HDCP_ENCRYPTED_NONE, RK_IF_HDCP_ENCRYPTED_LEVEL2);
2901 if (!prop) {
2902 dev_err(dp->dev, "create hdcp encrypted prop for dp%d failed\n", dp->id);
2903 return -ENOMEM;
2904 }
2905 dp->hdcp_state_property = prop;
2906 drm_object_attach_property(&connector->base, prop, RK_IF_HDCP_ENCRYPTED_NONE);
2907
2908 prop = drm_property_create(connector->dev, DRM_MODE_PROP_BLOB | DRM_MODE_PROP_IMMUTABLE,
2909 "HDR_PANEL_METADATA", 0);
2910 if (!prop) {
2911 DRM_DEV_ERROR(dp->dev, "create hdr metedata prop for dp%d failed\n", dp->id);
2912 return -ENOMEM;
2913 }
2914 dp->hdr_panel_metadata_property = prop;
2915 drm_object_attach_property(&connector->base, prop, 0);
2916 drm_object_attach_property(&connector->base,
2917 dev->mode_config.hdr_output_metadata_property,
2918 0);
2919
2920 return 0;
2921 }
2922
dw_dp_bridge_attach(struct drm_bridge * bridge,enum drm_bridge_attach_flags flags)2923 static int dw_dp_bridge_attach(struct drm_bridge *bridge,
2924 enum drm_bridge_attach_flags flags)
2925 {
2926 struct dw_dp *dp = bridge_to_dp(bridge);
2927 struct drm_connector *connector;
2928 bool skip_connector = false;
2929 int ret;
2930
2931 if (!bridge->encoder) {
2932 DRM_DEV_ERROR(dp->dev, "Parent encoder object not found");
2933 return -ENODEV;
2934 }
2935
2936 ret = drm_of_find_panel_or_bridge(bridge->of_node, 1, -1, &dp->panel,
2937 &dp->next_bridge);
2938 if (ret < 0 && ret != -ENODEV)
2939 return ret;
2940
2941 if (dp->next_bridge) {
2942 struct drm_bridge *next_bridge = dp->next_bridge;
2943
2944 ret = drm_bridge_attach(bridge->encoder, next_bridge, bridge,
2945 next_bridge->ops & DRM_BRIDGE_OP_MODES ?
2946 DRM_BRIDGE_ATTACH_NO_CONNECTOR : 0);
2947 if (ret) {
2948 DRM_DEV_ERROR(dp->dev, "failed to attach next bridge: %d\n", ret);
2949 return ret;
2950 }
2951
2952 skip_connector = !(next_bridge->ops & DRM_BRIDGE_OP_MODES);
2953 }
2954
2955 if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
2956 return 0;
2957
2958 if (!skip_connector) {
2959 ret = dw_dp_connector_init(dp);
2960 if (ret) {
2961 DRM_DEV_ERROR(dp->dev, "failed to create connector\n");
2962 return ret;
2963 }
2964
2965 connector = &dp->connector;
2966 } else {
2967 struct list_head *connector_list =
2968 &bridge->dev->mode_config.connector_list;
2969
2970 list_for_each_entry(connector, connector_list, head)
2971 if (drm_connector_has_possible_encoder(connector,
2972 bridge->encoder))
2973 break;
2974 }
2975
2976 dp->sub_dev.connector = connector;
2977 dp->sub_dev.of_node = dp->dev->of_node;
2978 dp->sub_dev.loader_protect = dw_dp_loader_protect;
2979 rockchip_drm_register_sub_dev(&dp->sub_dev);
2980
2981 return 0;
2982 }
2983
dw_dp_bridge_detach(struct drm_bridge * bridge)2984 static void dw_dp_bridge_detach(struct drm_bridge *bridge)
2985 {
2986 struct dw_dp *dp = bridge_to_dp(bridge);
2987
2988 drm_connector_cleanup(&dp->connector);
2989 }
2990
dw_dp_bridge_atomic_pre_enable(struct drm_bridge * bridge,struct drm_bridge_state * bridge_state)2991 static void dw_dp_bridge_atomic_pre_enable(struct drm_bridge *bridge,
2992 struct drm_bridge_state *bridge_state)
2993 {
2994 struct dw_dp *dp = bridge_to_dp(bridge);
2995 struct dw_dp_video *video = &dp->video;
2996 struct drm_crtc_state *crtc_state = bridge->encoder->crtc->state;
2997 struct drm_display_mode *m = &video->mode;
2998
2999 drm_mode_copy(m, &crtc_state->adjusted_mode);
3000
3001 if (dp->split_mode)
3002 drm_mode_convert_to_origin_mode(m);
3003
3004 if (dp->panel)
3005 drm_panel_prepare(dp->panel);
3006 }
3007
3008 static void
dw_dp_bridge_atomic_post_disable(struct drm_bridge * bridge,struct drm_bridge_state * bridge_state)3009 dw_dp_bridge_atomic_post_disable(struct drm_bridge *bridge,
3010 struct drm_bridge_state *bridge_state)
3011 {
3012 struct dw_dp *dp = bridge_to_dp(bridge);
3013
3014 if (dp->panel)
3015 drm_panel_unprepare(dp->panel);
3016 }
3017
dw_dp_needs_link_retrain(struct dw_dp * dp)3018 static bool dw_dp_needs_link_retrain(struct dw_dp *dp)
3019 {
3020 struct dw_dp_link *link = &dp->link;
3021 u8 link_status[DP_LINK_STATUS_SIZE];
3022
3023 if (!dw_dp_link_train_valid(&link->train))
3024 return false;
3025
3026 if (drm_dp_dpcd_read_link_status(&dp->aux, link_status) < 0)
3027 return false;
3028
3029 /* Retrain if Channel EQ or CR not ok */
3030 return !drm_dp_channel_eq_ok(link_status, dp->link.lanes);
3031 }
3032
dw_dp_link_disable(struct dw_dp * dp)3033 static void dw_dp_link_disable(struct dw_dp *dp)
3034 {
3035 struct dw_dp_link *link = &dp->link;
3036
3037 if (dw_dp_detect(dp))
3038 dw_dp_link_power_down(dp);
3039
3040 dw_dp_phy_xmit_enable(dp, 0);
3041
3042 phy_power_off(dp->phy);
3043
3044 link->train.clock_recovered = false;
3045 link->train.channel_equalized = false;
3046 }
3047
dw_dp_link_enable(struct dw_dp * dp)3048 static int dw_dp_link_enable(struct dw_dp *dp)
3049 {
3050 int ret;
3051
3052 ret = phy_power_on(dp->phy);
3053 if (ret)
3054 return ret;
3055
3056 ret = dw_dp_link_power_up(dp);
3057 if (ret < 0)
3058 return ret;
3059
3060 ret = dw_dp_link_train(dp);
3061 if (ret < 0) {
3062 dev_err(dp->dev, "link training failed: %d\n", ret);
3063 return ret;
3064 }
3065
3066 return 0;
3067 }
3068
dw_dp_bridge_atomic_enable(struct drm_bridge * bridge,struct drm_bridge_state * old_state)3069 static void dw_dp_bridge_atomic_enable(struct drm_bridge *bridge,
3070 struct drm_bridge_state *old_state)
3071 {
3072 struct dw_dp *dp = bridge_to_dp(bridge);
3073 struct drm_atomic_state *state = old_state->base.state;
3074 struct drm_connector *connector;
3075 struct drm_connector_state *conn_state;
3076 int ret;
3077
3078 connector = drm_atomic_get_new_connector_for_encoder(state, bridge->encoder);
3079 if (!connector) {
3080 dev_err(dp->dev, "failed to get connector\n");
3081 return;
3082 }
3083
3084 conn_state = drm_atomic_get_new_connector_state(state, connector);
3085 if (!conn_state) {
3086 dev_err(dp->dev, "failed to get connector state\n");
3087 return;
3088 }
3089
3090 set_bit(0, dp->sdp_reg_bank);
3091
3092 ret = dw_dp_link_enable(dp);
3093 if (ret < 0) {
3094 dev_err(dp->dev, "failed to enable link: %d\n", ret);
3095 return;
3096 }
3097
3098 if (conn_state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED)
3099 dw_dp_hdcp_enable(dp, conn_state->hdcp_content_type);
3100
3101 ret = dw_dp_video_enable(dp);
3102 if (ret < 0) {
3103 dev_err(dp->dev, "failed to enable video: %d\n", ret);
3104 return;
3105 }
3106
3107 if (dp->panel)
3108 drm_panel_enable(dp->panel);
3109
3110 extcon_set_state_sync(dp->extcon, EXTCON_DISP_DP, true);
3111 dw_dp_audio_handle_plugged_change(&dp->audio, true);
3112 }
3113
dw_dp_reset(struct dw_dp * dp)3114 static void dw_dp_reset(struct dw_dp *dp)
3115 {
3116 int val;
3117
3118 disable_irq(dp->irq);
3119 regmap_update_bits(dp->regmap, DPTX_SOFT_RESET_CTRL, CONTROLLER_RESET,
3120 FIELD_PREP(CONTROLLER_RESET, 1));
3121 udelay(10);
3122 regmap_update_bits(dp->regmap, DPTX_SOFT_RESET_CTRL, CONTROLLER_RESET,
3123 FIELD_PREP(CONTROLLER_RESET, 0));
3124
3125 dw_dp_init(dp);
3126 if (!dp->hpd_gpio) {
3127 regmap_read_poll_timeout(dp->regmap, DPTX_HPD_STATUS, val,
3128 FIELD_GET(HPD_HOT_PLUG, val), 200, 200000);
3129 regmap_write(dp->regmap, DPTX_HPD_STATUS, HPD_HOT_PLUG);
3130 }
3131 enable_irq(dp->irq);
3132 }
3133
dw_dp_bridge_atomic_disable(struct drm_bridge * bridge,struct drm_bridge_state * old_bridge_state)3134 static void dw_dp_bridge_atomic_disable(struct drm_bridge *bridge,
3135 struct drm_bridge_state *old_bridge_state)
3136 {
3137 struct dw_dp *dp = bridge_to_dp(bridge);
3138
3139 if (dp->panel)
3140 drm_panel_disable(dp->panel);
3141
3142 dw_dp_hdcp_disable(dp);
3143 dw_dp_video_disable(dp);
3144 dw_dp_link_disable(dp);
3145 bitmap_zero(dp->sdp_reg_bank, SDP_REG_BANK_SIZE);
3146 dw_dp_reset(dp);
3147
3148 extcon_set_state_sync(dp->extcon, EXTCON_DISP_DP, false);
3149 dw_dp_audio_handle_plugged_change(&dp->audio, false);
3150 }
3151
dw_dp_detect_dpcd(struct dw_dp * dp)3152 static bool dw_dp_detect_dpcd(struct dw_dp *dp)
3153 {
3154 u8 value;
3155 int ret;
3156
3157 ret = phy_power_on(dp->phy);
3158 if (ret)
3159 goto fail_power_on;
3160
3161 ret = drm_dp_dpcd_readb(&dp->aux, DP_DPCD_REV, &value);
3162 if (ret < 0) {
3163 dev_err(dp->dev, "aux failed to read dpcd: %d\n", ret);
3164 goto fail_probe;
3165 }
3166
3167 ret = dw_dp_link_probe(dp);
3168 if (ret) {
3169 dev_err(dp->dev, "failed to probe DP link: %d\n", ret);
3170 goto fail_probe;
3171 }
3172
3173 phy_power_off(dp->phy);
3174
3175 return true;
3176
3177 fail_probe:
3178 phy_power_off(dp->phy);
3179 fail_power_on:
3180 return false;
3181 }
3182
dw_dp_bridge_detect(struct drm_bridge * bridge)3183 static enum drm_connector_status dw_dp_bridge_detect(struct drm_bridge *bridge)
3184 {
3185 struct dw_dp *dp = bridge_to_dp(bridge);
3186 enum drm_connector_status status = connector_status_connected;
3187
3188 if (dp->panel)
3189 drm_panel_prepare(dp->panel);
3190
3191 if (!dw_dp_detect(dp)) {
3192 status = connector_status_disconnected;
3193 goto out;
3194 }
3195
3196 if (!dw_dp_detect_dpcd(dp)) {
3197 status = connector_status_disconnected;
3198 goto out;
3199 }
3200
3201 if (dp->next_bridge) {
3202 struct drm_bridge *next_bridge = dp->next_bridge;
3203
3204 if (next_bridge->ops & DRM_BRIDGE_OP_DETECT)
3205 status = drm_bridge_detect(next_bridge);
3206 }
3207
3208 out:
3209 return status;
3210 }
3211
dw_dp_bridge_get_edid(struct drm_bridge * bridge,struct drm_connector * connector)3212 static struct edid *dw_dp_bridge_get_edid(struct drm_bridge *bridge,
3213 struct drm_connector *connector)
3214 {
3215 struct dw_dp *dp = bridge_to_dp(bridge);
3216 struct edid *edid;
3217 int ret;
3218
3219 ret = phy_power_on(dp->phy);
3220 if (ret)
3221 return NULL;
3222
3223 edid = drm_get_edid(connector, &dp->aux.ddc);
3224
3225 phy_power_off(dp->phy);
3226
3227 return edid;
3228 }
3229
dw_dp_bridge_atomic_get_output_bus_fmts(struct drm_bridge * bridge,struct drm_bridge_state * bridge_state,struct drm_crtc_state * crtc_state,struct drm_connector_state * conn_state,unsigned int * num_output_fmts)3230 static u32 *dw_dp_bridge_atomic_get_output_bus_fmts(struct drm_bridge *bridge,
3231 struct drm_bridge_state *bridge_state,
3232 struct drm_crtc_state *crtc_state,
3233 struct drm_connector_state *conn_state,
3234 unsigned int *num_output_fmts)
3235 {
3236 struct dw_dp *dp = bridge_to_dp(bridge);
3237 struct dw_dp_state *dp_state = connector_to_dp_state(conn_state);
3238 struct dw_dp_link *link = &dp->link;
3239 struct drm_display_info *di = &conn_state->connector->display_info;
3240 struct drm_display_mode mode = crtc_state->mode;
3241 u32 *output_fmts;
3242 unsigned int i, j = 0;
3243
3244 if (dp->split_mode)
3245 drm_mode_convert_to_origin_mode(&mode);
3246
3247 if (dp->panel) {
3248 *num_output_fmts = 1;
3249
3250 output_fmts = kzalloc(sizeof(*output_fmts), GFP_KERNEL);
3251 if (!output_fmts)
3252 return NULL;
3253
3254 if (di->num_bus_formats && di->bus_formats)
3255 output_fmts[0] = di->bus_formats[0];
3256 else
3257 output_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24;
3258
3259 return output_fmts;
3260 }
3261
3262 *num_output_fmts = 0;
3263
3264 output_fmts = kcalloc(ARRAY_SIZE(possible_output_fmts),
3265 sizeof(*output_fmts), GFP_KERNEL);
3266 if (!output_fmts)
3267 return NULL;
3268
3269 for (i = 0; i < ARRAY_SIZE(possible_output_fmts); i++) {
3270 const struct dw_dp_output_format *fmt = &possible_output_fmts[i];
3271
3272 if (fmt->bpc > conn_state->max_bpc)
3273 continue;
3274
3275 if (!(di->color_formats & fmt->color_format))
3276 continue;
3277
3278 if (fmt->color_format == DRM_COLOR_FORMAT_YCRCB420 &&
3279 !link->vsc_sdp_extension_for_colorimetry_supported)
3280 continue;
3281
3282 if (drm_mode_is_420_only(di, &mode) &&
3283 fmt->color_format != DRM_COLOR_FORMAT_YCRCB420)
3284 continue;
3285
3286 if (!dw_dp_bandwidth_ok(dp, &mode, fmt->bpp, link->lanes, link->rate))
3287 continue;
3288
3289 if (dp_state->bpc != 0) {
3290 if ((fmt->bpc != dp_state->bpc) ||
3291 (fmt->color_format != BIT(dp_state->color_format)))
3292 continue;
3293 }
3294
3295 if (dw_dp_is_hdr_eotf(dp->eotf_type) && fmt->bpc < 10)
3296 continue;
3297
3298 output_fmts[j++] = fmt->bus_format;
3299 }
3300
3301 *num_output_fmts = j;
3302
3303 return output_fmts;
3304 }
3305
dw_dp_bridge_atomic_check(struct drm_bridge * bridge,struct drm_bridge_state * bridge_state,struct drm_crtc_state * crtc_state,struct drm_connector_state * conn_state)3306 static int dw_dp_bridge_atomic_check(struct drm_bridge *bridge,
3307 struct drm_bridge_state *bridge_state,
3308 struct drm_crtc_state *crtc_state,
3309 struct drm_connector_state *conn_state)
3310 {
3311 struct dw_dp *dp = bridge_to_dp(bridge);
3312 struct dw_dp_video *video = &dp->video;
3313 const struct dw_dp_output_format *fmt =
3314 dw_dp_get_output_format(bridge_state->output_bus_cfg.format);
3315
3316 dev_dbg(dp->dev, "input format 0x%04x, output format 0x%04x\n",
3317 bridge_state->input_bus_cfg.format,
3318 bridge_state->output_bus_cfg.format);
3319
3320 video->video_mapping = fmt->video_mapping;
3321 video->color_format = fmt->color_format;
3322 video->bus_format = fmt->bus_format;
3323 video->bpc = fmt->bpc;
3324 video->bpp = fmt->bpp;
3325
3326 return 0;
3327 }
3328
3329 static const struct drm_bridge_funcs dw_dp_bridge_funcs = {
3330 .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
3331 .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
3332 .atomic_reset = drm_atomic_helper_bridge_reset,
3333 .atomic_get_input_bus_fmts = drm_atomic_helper_bridge_propagate_bus_fmt,
3334 .atomic_get_output_bus_fmts = dw_dp_bridge_atomic_get_output_bus_fmts,
3335 .attach = dw_dp_bridge_attach,
3336 .detach = dw_dp_bridge_detach,
3337 .mode_valid = dw_dp_bridge_mode_valid,
3338 .atomic_check = dw_dp_bridge_atomic_check,
3339 .atomic_pre_enable = dw_dp_bridge_atomic_pre_enable,
3340 .atomic_post_disable = dw_dp_bridge_atomic_post_disable,
3341 .atomic_enable = dw_dp_bridge_atomic_enable,
3342 .atomic_disable = dw_dp_bridge_atomic_disable,
3343 .detect = dw_dp_bridge_detect,
3344 .get_edid = dw_dp_bridge_get_edid,
3345 };
3346
dw_dp_link_retrain(struct dw_dp * dp)3347 static int dw_dp_link_retrain(struct dw_dp *dp)
3348 {
3349 struct drm_device *dev = dp->bridge.dev;
3350 struct drm_modeset_acquire_ctx ctx;
3351 int ret;
3352
3353 if (!dw_dp_needs_link_retrain(dp))
3354 return 0;
3355
3356 dev_dbg(dp->dev, "Retraining link\n");
3357
3358 drm_modeset_acquire_init(&ctx, 0);
3359 for (;;) {
3360 ret = drm_modeset_lock(&dev->mode_config.connection_mutex, &ctx);
3361 if (ret != -EDEADLK)
3362 break;
3363
3364 drm_modeset_backoff(&ctx);
3365 }
3366
3367 ret = dw_dp_link_train(dp);
3368 drm_modeset_drop_locks(&ctx);
3369 drm_modeset_acquire_fini(&ctx);
3370
3371 return ret;
3372 }
3373
dw_dp_autotest_phy_pattern(struct dw_dp * dp)3374 static u8 dw_dp_autotest_phy_pattern(struct dw_dp *dp)
3375 {
3376 struct drm_dp_phy_test_params *data = &dp->compliance.test_data.phytest;
3377
3378 if (drm_dp_get_phy_test_pattern(&dp->aux, data)) {
3379 dev_err(dp->dev, "DP Phy Test pattern AUX read failure\n");
3380 return DP_TEST_NAK;
3381 }
3382
3383 /* Set test active flag here so userspace doesn't interrupt things */
3384 dp->compliance.test_active = true;
3385
3386 return DP_TEST_ACK;
3387 }
3388
dw_dp_handle_test_request(struct dw_dp * dp)3389 static void dw_dp_handle_test_request(struct dw_dp *dp)
3390 {
3391 u8 response = DP_TEST_NAK;
3392 u8 request = 0;
3393 int status;
3394
3395 status = drm_dp_dpcd_readb(&dp->aux, DP_TEST_REQUEST, &request);
3396 if (status <= 0) {
3397 dev_err(dp->dev, "Could not read test request from sink\n");
3398 goto update_status;
3399 }
3400
3401 switch (request) {
3402 case DP_TEST_LINK_PHY_TEST_PATTERN:
3403 dev_dbg(dp->dev, "PHY_PATTERN test requested\n");
3404 response = dw_dp_autotest_phy_pattern(dp);
3405 break;
3406 default:
3407 dev_warn(dp->dev, "Invalid test request '%02x'\n", request);
3408 break;
3409 }
3410
3411 if (response & DP_TEST_ACK)
3412 dp->compliance.test_type = request;
3413
3414 update_status:
3415 status = drm_dp_dpcd_writeb(&dp->aux, DP_TEST_RESPONSE, response);
3416 if (status <= 0)
3417 dev_warn(dp->dev, "Could not write test response to sink\n");
3418 }
3419
dw_dp_hdcp_handle_cp_irq(struct dw_dp * dp)3420 static void dw_dp_hdcp_handle_cp_irq(struct dw_dp *dp)
3421 {
3422 regmap_update_bits(dp->regmap, DPTX_HDCPCFG, CP_IRQ, CP_IRQ);
3423 udelay(20);
3424 regmap_update_bits(dp->regmap, DPTX_HDCPCFG, CP_IRQ, 0);
3425 }
3426
dw_dp_check_service_irq(struct dw_dp * dp)3427 static void dw_dp_check_service_irq(struct dw_dp *dp)
3428 {
3429 struct dw_dp_link *link = &dp->link;
3430 u8 val;
3431
3432 if (link->dpcd[DP_DPCD_REV] < 0x11)
3433 return;
3434
3435 if (drm_dp_dpcd_readb(&dp->aux, DP_DEVICE_SERVICE_IRQ_VECTOR, &val) != 1 || !val)
3436 return;
3437
3438 drm_dp_dpcd_writeb(&dp->aux, DP_DEVICE_SERVICE_IRQ_VECTOR, val);
3439
3440 if (val & DP_AUTOMATED_TEST_REQUEST)
3441 dw_dp_handle_test_request(dp);
3442
3443 if (val & DP_CP_IRQ)
3444 dw_dp_hdcp_handle_cp_irq(dp);
3445
3446 if (val & DP_SINK_SPECIFIC_IRQ)
3447 dev_info(dp->dev, "Sink specific irq unhandled\n");
3448 }
3449
dw_dp_phy_pattern_update(struct dw_dp * dp)3450 static void dw_dp_phy_pattern_update(struct dw_dp *dp)
3451 {
3452 struct drm_dp_phy_test_params *data = &dp->compliance.test_data.phytest;
3453
3454 switch (data->phy_pattern) {
3455 case DP_PHY_TEST_PATTERN_NONE:
3456 dev_dbg(dp->dev, "Disable Phy Test Pattern\n");
3457 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS,
3458 FIELD_PREP(SCRAMBLE_DIS, 1));
3459 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_NONE);
3460 break;
3461 case DP_PHY_TEST_PATTERN_D10_2:
3462 dev_dbg(dp->dev, "Set D10.2 Phy Test Pattern\n");
3463 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS,
3464 FIELD_PREP(SCRAMBLE_DIS, 1));
3465 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_TPS_1);
3466 break;
3467 case DP_PHY_TEST_PATTERN_ERROR_COUNT:
3468 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS,
3469 FIELD_PREP(SCRAMBLE_DIS, 0));
3470 dev_dbg(dp->dev, "Set Error Count Phy Test Pattern\n");
3471 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_SERM);
3472 break;
3473 case DP_PHY_TEST_PATTERN_PRBS7:
3474 dev_dbg(dp->dev, "Set PRBS7 Phy Test Pattern\n");
3475 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS,
3476 FIELD_PREP(SCRAMBLE_DIS, 1));
3477 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_PBRS7);
3478 break;
3479 case DP_PHY_TEST_PATTERN_80BIT_CUSTOM:
3480 dev_dbg(dp->dev, "Set 80Bit Custom Phy Test Pattern\n");
3481 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS,
3482 FIELD_PREP(SCRAMBLE_DIS, 1));
3483 regmap_write(dp->regmap, DPTX_CUSTOMPAT0, 0x3e0f83e0);
3484 regmap_write(dp->regmap, DPTX_CUSTOMPAT1, 0x3e0f83e0);
3485 regmap_write(dp->regmap, DPTX_CUSTOMPAT2, 0x000f83e0);
3486 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_CUSTOM_80BIT);
3487 break;
3488 case DP_PHY_TEST_PATTERN_CP2520:
3489 dev_dbg(dp->dev, "Set HBR2 compliance Phy Test Pattern\n");
3490 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS,
3491 FIELD_PREP(SCRAMBLE_DIS, 0));
3492 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_CP2520_1);
3493 break;
3494 case DP_PHY_TEST_PATTERN_SEL_MASK:
3495 dev_dbg(dp->dev, "Set TPS4 Phy Test Pattern\n");
3496 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS,
3497 FIELD_PREP(SCRAMBLE_DIS, 0));
3498 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_TPS_4);
3499 break;
3500 default:
3501 WARN(1, "Invalid Phy Test Pattern\n");
3502 }
3503 }
3504
dw_dp_process_phy_request(struct dw_dp * dp)3505 static void dw_dp_process_phy_request(struct dw_dp *dp)
3506 {
3507 struct drm_dp_phy_test_params *data = &dp->compliance.test_data.phytest;
3508 u8 link_status[DP_LINK_STATUS_SIZE], spread;
3509 int ret;
3510
3511 ret = drm_dp_dpcd_read(&dp->aux, DP_LANE0_1_STATUS, link_status, DP_LINK_STATUS_SIZE);
3512 if (ret < 0) {
3513 dev_err(dp->dev, "failed to get link status\n");
3514 return;
3515 }
3516
3517 ret = drm_dp_dpcd_readb(&dp->aux, DP_MAX_DOWNSPREAD, &spread);
3518 if (ret < 0) {
3519 dev_err(dp->dev, "failed to get spread\n");
3520 return;
3521 }
3522
3523 dw_dp_phy_configure(dp, data->link_rate, data->num_lanes,
3524 !!(spread & DP_MAX_DOWNSPREAD_0_5));
3525 dw_dp_link_get_adjustments(&dp->link, link_status);
3526 dw_dp_phy_update_vs_emph(dp, data->link_rate, data->num_lanes, &dp->link.train.adjust);
3527 dw_dp_phy_pattern_update(dp);
3528 drm_dp_set_phy_test_pattern(&dp->aux, data, link_status[DP_DPCD_REV]);
3529
3530 dev_dbg(dp->dev, "phy test rate:%d, lane count:%d, ssc:%d, vs:%d, pe: %d\n",
3531 data->link_rate, data->num_lanes, spread, dp->link.train.adjust.voltage_swing[0],
3532 dp->link.train.adjust.pre_emphasis[0]);
3533 }
3534
dw_dp_phy_test(struct dw_dp * dp)3535 static void dw_dp_phy_test(struct dw_dp *dp)
3536 {
3537 struct drm_device *dev = dp->bridge.dev;
3538 struct drm_modeset_acquire_ctx ctx;
3539 int ret;
3540
3541 drm_modeset_acquire_init(&ctx, 0);
3542
3543 for (;;) {
3544 ret = drm_modeset_lock(&dev->mode_config.connection_mutex, &ctx);
3545 if (ret != -EDEADLK)
3546 break;
3547
3548 drm_modeset_backoff(&ctx);
3549 }
3550
3551 dw_dp_process_phy_request(dp);
3552 drm_modeset_drop_locks(&ctx);
3553 drm_modeset_acquire_fini(&ctx);
3554 }
3555
dw_dp_hpd_short_pulse(struct dw_dp * dp)3556 static bool dw_dp_hpd_short_pulse(struct dw_dp *dp)
3557 {
3558 memset(&dp->compliance, 0, sizeof(dp->compliance));
3559
3560 dw_dp_check_service_irq(dp);
3561
3562 if (dw_dp_needs_link_retrain(dp))
3563 return false;
3564
3565 switch (dp->compliance.test_type) {
3566 case DP_TEST_LINK_PHY_TEST_PATTERN:
3567 return false;
3568 default:
3569 dev_warn(dp->dev, "test_type%lu is not support\n", dp->compliance.test_type);
3570 break;
3571 }
3572
3573 return true;
3574 }
3575
dw_dp_hpd_work(struct work_struct * work)3576 static void dw_dp_hpd_work(struct work_struct *work)
3577 {
3578 struct dw_dp *dp = container_of(work, struct dw_dp, hpd_work);
3579 bool long_hpd;
3580 int ret;
3581
3582 mutex_lock(&dp->irq_lock);
3583 long_hpd = dp->hotplug.long_hpd;
3584 mutex_unlock(&dp->irq_lock);
3585
3586 dev_dbg(dp->dev, "got hpd irq - %s\n", long_hpd ? "long" : "short");
3587
3588 if (!long_hpd) {
3589 if (dw_dp_hpd_short_pulse(dp))
3590 return;
3591
3592 if (dp->compliance.test_active &&
3593 dp->compliance.test_type == DP_TEST_LINK_PHY_TEST_PATTERN) {
3594 dw_dp_phy_test(dp);
3595 /* just do the PHY test and nothing else */
3596 return;
3597 }
3598
3599 ret = dw_dp_link_retrain(dp);
3600 if (ret)
3601 dev_warn(dp->dev, "Retrain link failed\n");
3602 } else {
3603 drm_helper_hpd_irq_event(dp->bridge.dev);
3604 }
3605 }
3606
dw_dp_handle_hpd_event(struct dw_dp * dp)3607 static void dw_dp_handle_hpd_event(struct dw_dp *dp)
3608 {
3609 u32 value;
3610
3611 mutex_lock(&dp->irq_lock);
3612
3613 regmap_read(dp->regmap, DPTX_HPD_STATUS, &value);
3614
3615 if (value & HPD_IRQ) {
3616 dev_dbg(dp->dev, "IRQ from the HPD\n");
3617 dp->hotplug.long_hpd = false;
3618 regmap_write(dp->regmap, DPTX_HPD_STATUS, HPD_IRQ);
3619 }
3620
3621 if (value & HPD_HOT_PLUG) {
3622 dev_dbg(dp->dev, "Hot plug detected\n");
3623 dp->hotplug.long_hpd = true;
3624 regmap_write(dp->regmap, DPTX_HPD_STATUS, HPD_HOT_PLUG);
3625 }
3626
3627 if (value & HPD_HOT_UNPLUG) {
3628 dev_dbg(dp->dev, "Unplug detected\n");
3629 dp->hotplug.long_hpd = true;
3630 regmap_write(dp->regmap, DPTX_HPD_STATUS, HPD_HOT_UNPLUG);
3631 }
3632
3633 mutex_unlock(&dp->irq_lock);
3634
3635 schedule_work(&dp->hpd_work);
3636 }
3637
dw_dp_irq_handler(int irq,void * data)3638 static irqreturn_t dw_dp_irq_handler(int irq, void *data)
3639 {
3640 struct dw_dp *dp = data;
3641 u32 value;
3642
3643 regmap_read(dp->regmap, DPTX_GENERAL_INTERRUPT, &value);
3644 if (!value)
3645 return IRQ_NONE;
3646
3647 if (value & HPD_EVENT)
3648 dw_dp_handle_hpd_event(dp);
3649
3650 if (value & AUX_REPLY_EVENT) {
3651 regmap_write(dp->regmap, DPTX_GENERAL_INTERRUPT,
3652 AUX_REPLY_EVENT);
3653 complete(&dp->complete);
3654 }
3655
3656 if (value & HDCP_EVENT)
3657 dw_dp_handle_hdcp_event(dp);
3658
3659 return IRQ_HANDLED;
3660 }
3661
dw_dp_audio_hw_params(struct device * dev,void * data,struct hdmi_codec_daifmt * daifmt,struct hdmi_codec_params * params)3662 static int dw_dp_audio_hw_params(struct device *dev, void *data,
3663 struct hdmi_codec_daifmt *daifmt,
3664 struct hdmi_codec_params *params)
3665 {
3666 struct dw_dp *dp = dev_get_drvdata(dev);
3667 struct dw_dp_audio *audio = &dp->audio;
3668 u8 audio_data_in_en, num_channels, audio_inf_select;
3669
3670 audio->channels = params->cea.channels;
3671
3672 switch (params->cea.channels) {
3673 case 1:
3674 audio_data_in_en = 0x1;
3675 num_channels = 0x0;
3676 break;
3677 case 2:
3678 audio_data_in_en = 0x1;
3679 num_channels = 0x1;
3680 break;
3681 case 8:
3682 audio_data_in_en = 0xf;
3683 num_channels = 0x7;
3684 break;
3685 default:
3686 dev_err(dp->dev, "invalid channels %d\n", params->cea.channels);
3687 return -EINVAL;
3688 }
3689
3690 switch (daifmt->fmt) {
3691 case HDMI_SPDIF:
3692 audio_inf_select = 0x1;
3693 audio->format = AFMT_SPDIF;
3694 break;
3695 case HDMI_I2S:
3696 audio_inf_select = 0x0;
3697 audio->format = AFMT_I2S;
3698 break;
3699 default:
3700 dev_err(dp->dev, "invalid daifmt %d\n", daifmt->fmt);
3701 return -EINVAL;
3702 }
3703
3704 clk_prepare_enable(dp->spdif_clk);
3705 clk_prepare_enable(dp->i2s_clk);
3706
3707 regmap_update_bits(dp->regmap, DPTX_AUD_CONFIG1,
3708 AUDIO_DATA_IN_EN | NUM_CHANNELS | AUDIO_DATA_WIDTH |
3709 AUDIO_INF_SELECT,
3710 FIELD_PREP(AUDIO_DATA_IN_EN, audio_data_in_en) |
3711 FIELD_PREP(NUM_CHANNELS, num_channels) |
3712 FIELD_PREP(AUDIO_DATA_WIDTH, params->sample_width) |
3713 FIELD_PREP(AUDIO_INF_SELECT, audio_inf_select));
3714
3715 /* Wait for inf switch */
3716 usleep_range(20, 40);
3717 if (audio->format == AFMT_I2S)
3718 clk_disable_unprepare(dp->spdif_clk);
3719 else if (audio->format == AFMT_SPDIF)
3720 clk_disable_unprepare(dp->i2s_clk);
3721
3722 return 0;
3723 }
3724
dw_dp_audio_infoframe_send(struct dw_dp * dp)3725 static int dw_dp_audio_infoframe_send(struct dw_dp *dp)
3726 {
3727 struct dw_dp_audio *audio = &dp->audio;
3728 struct hdmi_audio_infoframe frame;
3729 struct dp_sdp_header header;
3730 u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_SIZE];
3731 u8 size = sizeof(buffer);
3732 int i, j, ret;
3733
3734 header.HB0 = 0;
3735 header.HB1 = HDMI_INFOFRAME_TYPE_AUDIO;
3736 header.HB2 = 0x1b;
3737 header.HB3 = 0x48;
3738
3739 ret = hdmi_audio_infoframe_init(&frame);
3740 if (ret < 0)
3741 return ret;
3742
3743 frame.coding_type = HDMI_AUDIO_CODING_TYPE_STREAM;
3744 frame.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM;
3745 frame.sample_size = HDMI_AUDIO_SAMPLE_SIZE_STREAM;
3746 frame.channels = audio->channels;
3747
3748 ret = hdmi_audio_infoframe_pack(&frame, buffer, sizeof(buffer));
3749 if (ret < 0)
3750 return ret;
3751
3752 regmap_write(dp->regmap, DPTX_SDP_REGISTER_BANK,
3753 get_unaligned_le32(&header));
3754
3755 for (i = 1; i < DIV_ROUND_UP(size, 4); i++) {
3756 size_t num = min_t(size_t, size - i * 4, 4);
3757 u32 value = 0;
3758
3759 for (j = 0; j < num; j++)
3760 value |= buffer[i * 4 + j] << (j * 8);
3761
3762 regmap_write(dp->regmap, DPTX_SDP_REGISTER_BANK + 4 * i, value);
3763 }
3764
3765 regmap_update_bits(dp->regmap, DPTX_SDP_VERTICAL_CTRL,
3766 EN_VERTICAL_SDP, FIELD_PREP(EN_VERTICAL_SDP, 1));
3767
3768 return 0;
3769 }
3770
dw_dp_audio_startup(struct device * dev,void * data)3771 static int dw_dp_audio_startup(struct device *dev, void *data)
3772 {
3773 struct dw_dp *dp = dev_get_drvdata(dev);
3774
3775 regmap_update_bits(dp->regmap, DPTX_SDP_VERTICAL_CTRL,
3776 EN_AUDIO_STREAM_SDP | EN_AUDIO_TIMESTAMP_SDP,
3777 FIELD_PREP(EN_AUDIO_STREAM_SDP, 1) |
3778 FIELD_PREP(EN_AUDIO_TIMESTAMP_SDP, 1));
3779 regmap_update_bits(dp->regmap, DPTX_SDP_HORIZONTAL_CTRL,
3780 EN_AUDIO_STREAM_SDP,
3781 FIELD_PREP(EN_AUDIO_STREAM_SDP, 1));
3782
3783 return dw_dp_audio_infoframe_send(dp);
3784 }
3785
dw_dp_audio_shutdown(struct device * dev,void * data)3786 static void dw_dp_audio_shutdown(struct device *dev, void *data)
3787 {
3788 struct dw_dp *dp = dev_get_drvdata(dev);
3789 struct dw_dp_audio *audio = &dp->audio;
3790
3791 regmap_update_bits(dp->regmap, DPTX_AUD_CONFIG1, AUDIO_DATA_IN_EN,
3792 FIELD_PREP(AUDIO_DATA_IN_EN, 0));
3793
3794 if (audio->format == AFMT_SPDIF)
3795 clk_disable_unprepare(dp->spdif_clk);
3796 else if (audio->format == AFMT_I2S)
3797 clk_disable_unprepare(dp->i2s_clk);
3798
3799 audio->format = AFMT_UNUSED;
3800 }
3801
dw_dp_audio_hook_plugged_cb(struct device * dev,void * data,hdmi_codec_plugged_cb fn,struct device * codec_dev)3802 static int dw_dp_audio_hook_plugged_cb(struct device *dev, void *data,
3803 hdmi_codec_plugged_cb fn,
3804 struct device *codec_dev)
3805 {
3806 struct dw_dp *dp = dev_get_drvdata(dev);
3807 struct dw_dp_audio *audio = &dp->audio;
3808
3809 audio->plugged_cb = fn;
3810 audio->codec_dev = codec_dev;
3811 dw_dp_audio_handle_plugged_change(audio, dw_dp_detect(dp));
3812 return 0;
3813 }
3814
dw_dp_audio_get_eld(struct device * dev,void * data,uint8_t * buf,size_t len)3815 static int dw_dp_audio_get_eld(struct device *dev, void *data, uint8_t *buf,
3816 size_t len)
3817 {
3818 struct dw_dp *dp = dev_get_drvdata(dev);
3819 struct drm_connector *connector = &dp->connector;
3820
3821 memcpy(buf, connector->eld, min(sizeof(connector->eld), len));
3822
3823 return 0;
3824 }
3825
3826 static const struct hdmi_codec_ops dw_dp_audio_codec_ops = {
3827 .hw_params = dw_dp_audio_hw_params,
3828 .audio_startup = dw_dp_audio_startup,
3829 .audio_shutdown = dw_dp_audio_shutdown,
3830 .get_eld = dw_dp_audio_get_eld,
3831 .hook_plugged_cb = dw_dp_audio_hook_plugged_cb
3832 };
3833
dw_dp_register_audio_driver(struct dw_dp * dp)3834 static int dw_dp_register_audio_driver(struct dw_dp *dp)
3835 {
3836 struct dw_dp_audio *audio = &dp->audio;
3837 struct hdmi_codec_pdata codec_data = {
3838 .ops = &dw_dp_audio_codec_ops,
3839 .spdif = 1,
3840 .i2s = 1,
3841 .max_i2s_channels = 8,
3842 };
3843
3844 audio->format = AFMT_UNUSED;
3845 audio->pdev = platform_device_register_data(dp->dev,
3846 HDMI_CODEC_DRV_NAME,
3847 PLATFORM_DEVID_AUTO,
3848 &codec_data,
3849 sizeof(codec_data));
3850
3851 return PTR_ERR_OR_ZERO(audio->pdev);
3852 }
3853
dw_dp_unregister_audio_driver(void * data)3854 static void dw_dp_unregister_audio_driver(void *data)
3855 {
3856 struct dw_dp *dp = data;
3857 struct dw_dp_audio *audio = &dp->audio;
3858
3859 if (audio->pdev) {
3860 platform_device_unregister(audio->pdev);
3861 audio->pdev = NULL;
3862 }
3863 }
3864
dw_dp_aux_unregister(void * data)3865 static void dw_dp_aux_unregister(void *data)
3866 {
3867 struct dw_dp *dp = data;
3868
3869 drm_dp_aux_unregister(&dp->aux);
3870 }
3871
dw_dp_bind(struct device * dev,struct device * master,void * data)3872 static int dw_dp_bind(struct device *dev, struct device *master, void *data)
3873 {
3874 struct dw_dp *dp = dev_get_drvdata(dev);
3875 struct drm_device *drm_dev = data;
3876 struct drm_encoder *encoder = &dp->encoder;
3877 struct drm_bridge *bridge = &dp->bridge;
3878 int ret;
3879
3880 if (!dp->left) {
3881 drm_simple_encoder_init(drm_dev, encoder, DRM_MODE_ENCODER_TMDS);
3882 drm_encoder_helper_add(encoder, &dw_dp_encoder_helper_funcs);
3883
3884 encoder->possible_crtcs =
3885 rockchip_drm_of_find_possible_crtcs(drm_dev, dev->of_node);
3886
3887 ret = drm_bridge_attach(encoder, bridge, NULL, 0);
3888 if (ret) {
3889 dev_err(dev, "failed to attach bridge: %d\n", ret);
3890 return ret;
3891 }
3892 }
3893
3894 if (dp->right) {
3895 struct dw_dp *secondary = dp->right;
3896 struct drm_bridge *last_bridge =
3897 list_last_entry(&encoder->bridge_chain,
3898 struct drm_bridge, chain_node);
3899
3900 ret = drm_bridge_attach(encoder, &secondary->bridge, last_bridge,
3901 DRM_BRIDGE_ATTACH_NO_CONNECTOR);
3902 if (ret)
3903 return ret;
3904 }
3905
3906 pm_runtime_enable(dp->dev);
3907 pm_runtime_get_sync(dp->dev);
3908
3909 enable_irq(dp->irq);
3910 if (dp->hpd_gpio)
3911 enable_irq(dp->hpd_irq);
3912
3913 return 0;
3914 }
3915
dw_dp_unbind(struct device * dev,struct device * master,void * data)3916 static void dw_dp_unbind(struct device *dev, struct device *master, void *data)
3917 {
3918 struct dw_dp *dp = dev_get_drvdata(dev);
3919
3920 if (dp->hpd_gpio)
3921 disable_irq(dp->hpd_irq);
3922 disable_irq(dp->irq);
3923
3924 pm_runtime_put(dp->dev);
3925 pm_runtime_disable(dp->dev);
3926
3927 drm_encoder_cleanup(&dp->encoder);
3928 }
3929
3930 static const struct component_ops dw_dp_component_ops = {
3931 .bind = dw_dp_bind,
3932 .unbind = dw_dp_unbind,
3933 };
3934
3935 static const struct regmap_range dw_dp_readable_ranges[] = {
3936 regmap_reg_range(DPTX_VERSION_NUMBER, DPTX_ID),
3937 regmap_reg_range(DPTX_CONFIG_REG1, DPTX_CONFIG_REG3),
3938 regmap_reg_range(DPTX_CCTL, DPTX_SOFT_RESET_CTRL),
3939 regmap_reg_range(DPTX_VSAMPLE_CTRL, DPTX_VIDEO_HBLANK_INTERVAL),
3940 regmap_reg_range(DPTX_AUD_CONFIG1, DPTX_AUD_CONFIG1),
3941 regmap_reg_range(DPTX_SDP_VERTICAL_CTRL, DPTX_SDP_STATUS_EN),
3942 regmap_reg_range(DPTX_PHYIF_CTRL, DPTX_PHYIF_PWRDOWN_CTRL),
3943 regmap_reg_range(DPTX_AUX_CMD, DPTX_AUX_DATA3),
3944 regmap_reg_range(DPTX_GENERAL_INTERRUPT, DPTX_HPD_INTERRUPT_ENABLE),
3945 regmap_reg_range(DPTX_HDCPCFG, DPTX_HDCPKSVMEMCTRL),
3946 regmap_reg_range(DPTX_HDCPREG_BKSV0, DPTX_HDCPREG_DPK_CRC),
3947 };
3948
3949 static const struct regmap_access_table dw_dp_readable_table = {
3950 .yes_ranges = dw_dp_readable_ranges,
3951 .n_yes_ranges = ARRAY_SIZE(dw_dp_readable_ranges),
3952 };
3953
3954 static const struct regmap_config dw_dp_regmap_config = {
3955 .reg_bits = 32,
3956 .reg_stride = 4,
3957 .val_bits = 32,
3958 .fast_io = true,
3959 .max_register = DPTX_MAX_REGISTER,
3960 .rd_table = &dw_dp_readable_table,
3961 };
3962
dw_dp_parse_link_frequencies(struct dw_dp * dp)3963 static u32 dw_dp_parse_link_frequencies(struct dw_dp *dp)
3964 {
3965 struct device_node *node = dp->dev->of_node;
3966 struct device_node *endpoint;
3967 u64 frequency = 0;
3968 int cnt;
3969
3970 endpoint = of_graph_get_endpoint_by_regs(node, 1, 0);
3971 if (!endpoint)
3972 return 0;
3973
3974 cnt = of_property_count_u64_elems(endpoint, "link-frequencies");
3975 if (cnt > 0)
3976 of_property_read_u64_index(endpoint, "link-frequencies",
3977 cnt - 1, &frequency);
3978 of_node_put(endpoint);
3979
3980 if (!frequency)
3981 return 0;
3982
3983 do_div(frequency, 10 * 1000); /* symbol rate kbytes */
3984
3985 switch (frequency) {
3986 case 162000:
3987 case 270000:
3988 case 540000:
3989 case 810000:
3990 break;
3991 default:
3992 dev_err(dp->dev, "invalid link frequency value: %llu\n", frequency);
3993 return 0;
3994 }
3995
3996 return frequency;
3997 }
3998
dw_dp_parse_dt(struct dw_dp * dp)3999 static int dw_dp_parse_dt(struct dw_dp *dp)
4000 {
4001 dp->force_hpd = device_property_read_bool(dp->dev, "force-hpd");
4002
4003 dp->max_link_rate = dw_dp_parse_link_frequencies(dp);
4004 if (!dp->max_link_rate)
4005 dp->max_link_rate = 810000;
4006
4007 return 0;
4008 }
4009
dw_dp_probe(struct platform_device * pdev)4010 static int dw_dp_probe(struct platform_device *pdev)
4011 {
4012 struct device *dev = &pdev->dev;
4013 struct dw_dp *dp;
4014 void __iomem *base;
4015 int id, ret;
4016
4017 dp = devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL);
4018 if (!dp)
4019 return -ENOMEM;
4020
4021 id = of_alias_get_id(dev->of_node, "dp");
4022 if (id < 0)
4023 id = 0;
4024
4025 dp->id = id;
4026 dp->dev = dev;
4027 dp->video.pixel_mode = DPTX_MP_QUAD_PIXEL;
4028
4029 ret = dw_dp_parse_dt(dp);
4030 if (ret)
4031 return dev_err_probe(dev, ret, "failed to parse DT\n");
4032
4033 mutex_init(&dp->irq_lock);
4034 INIT_WORK(&dp->hpd_work, dw_dp_hpd_work);
4035 init_completion(&dp->complete);
4036
4037 base = devm_platform_ioremap_resource(pdev, 0);
4038 if (IS_ERR(base))
4039 return PTR_ERR(base);
4040
4041 dp->regmap = devm_regmap_init_mmio(dev, base, &dw_dp_regmap_config);
4042 if (IS_ERR(dp->regmap))
4043 return dev_err_probe(dev, PTR_ERR(dp->regmap),
4044 "failed to create regmap\n");
4045
4046 dp->phy = devm_of_phy_get(dev, dev->of_node, NULL);
4047 if (IS_ERR(dp->phy))
4048 return dev_err_probe(dev, PTR_ERR(dp->phy),
4049 "failed to get phy\n");
4050
4051 dp->apb_clk = devm_clk_get(dev, "apb");
4052 if (IS_ERR(dp->apb_clk))
4053 return dev_err_probe(dev, PTR_ERR(dp->apb_clk),
4054 "failed to get apb clock\n");
4055
4056 dp->aux_clk = devm_clk_get(dev, "aux");
4057 if (IS_ERR(dp->aux_clk))
4058 return dev_err_probe(dev, PTR_ERR(dp->aux_clk),
4059 "failed to get aux clock\n");
4060
4061 dp->i2s_clk = devm_clk_get(dev, "i2s");
4062 if (IS_ERR(dp->i2s_clk))
4063 return dev_err_probe(dev, PTR_ERR(dp->i2s_clk),
4064 "failed to get i2s clock\n");
4065
4066 dp->spdif_clk = devm_clk_get(dev, "spdif");
4067 if (IS_ERR(dp->spdif_clk))
4068 return dev_err_probe(dev, PTR_ERR(dp->spdif_clk),
4069 "failed to get spdif clock\n");
4070
4071 dp->hclk = devm_clk_get_optional(dev, "hclk");
4072 if (IS_ERR(dp->hclk))
4073 return dev_err_probe(dev, PTR_ERR(dp->hclk),
4074 "failed to get hclk\n");
4075
4076 dp->hdcp_clk = devm_clk_get(dev, "hdcp");
4077 if (IS_ERR(dp->hdcp_clk))
4078 return dev_err_probe(dev, PTR_ERR(dp->hdcp_clk),
4079 "failed to get hdcp clock\n");
4080
4081 dp->rstc = devm_reset_control_get(dev, NULL);
4082 if (IS_ERR(dp->rstc))
4083 return dev_err_probe(dev, PTR_ERR(dp->rstc),
4084 "failed to get reset control\n");
4085
4086 dp->hpd_gpio = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN);
4087 if (IS_ERR(dp->hpd_gpio))
4088 return dev_err_probe(dev, PTR_ERR(dp->hpd_gpio),
4089 "failed to get hpd GPIO\n");
4090 if (dp->hpd_gpio) {
4091 dp->hpd_irq = gpiod_to_irq(dp->hpd_gpio);
4092 if (dp->hpd_irq < 0)
4093 return dev_err_probe(dev, dp->hpd_irq,
4094 "failed to get hpd irq\n");
4095
4096 irq_set_status_flags(dp->hpd_irq, IRQ_NOAUTOEN);
4097 ret = devm_request_threaded_irq(dev, dp->hpd_irq, NULL,
4098 dw_dp_hpd_irq_handler,
4099 IRQF_TRIGGER_RISING |
4100 IRQF_TRIGGER_FALLING |
4101 IRQF_ONESHOT, "dw-dp-hpd", dp);
4102 if (ret) {
4103 dev_err(dev, "failed to request HPD interrupt\n");
4104 return ret;
4105 }
4106 }
4107
4108 dp->irq = platform_get_irq(pdev, 0);
4109 if (dp->irq < 0)
4110 return dp->irq;
4111
4112 irq_set_status_flags(dp->irq, IRQ_NOAUTOEN);
4113 ret = devm_request_threaded_irq(dev, dp->irq, NULL, dw_dp_irq_handler,
4114 IRQF_ONESHOT, dev_name(dev), dp);
4115 if (ret) {
4116 dev_err(dev, "failed to request irq: %d\n", ret);
4117 return ret;
4118 }
4119
4120 dp->extcon = devm_extcon_dev_allocate(dev, dw_dp_cable);
4121 if (IS_ERR(dp->extcon))
4122 return dev_err_probe(dev, PTR_ERR(dp->extcon),
4123 "failed to allocate extcon device\n");
4124
4125 ret = devm_extcon_dev_register(dev, dp->extcon);
4126 if (ret)
4127 return dev_err_probe(dev, ret,
4128 "failed to register extcon device\n");
4129
4130 ret = dw_dp_register_audio_driver(dp);
4131 if (ret)
4132 return ret;
4133
4134 ret = devm_add_action_or_reset(dev, dw_dp_unregister_audio_driver, dp);
4135 if (ret)
4136 return ret;
4137
4138 dp->aux.dev = dev;
4139 dp->aux.name = dev_name(dev);
4140 dp->aux.transfer = dw_dp_aux_transfer;
4141 ret = drm_dp_aux_register(&dp->aux);
4142 if (ret)
4143 return ret;
4144
4145 ret = devm_add_action_or_reset(dev, dw_dp_aux_unregister, dp);
4146 if (ret)
4147 return ret;
4148
4149 dp->bridge.of_node = dev->of_node;
4150 dp->bridge.funcs = &dw_dp_bridge_funcs;
4151 dp->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID |
4152 DRM_BRIDGE_OP_HPD;
4153 dp->bridge.type = DRM_MODE_CONNECTOR_DisplayPort;
4154
4155 platform_set_drvdata(pdev, dp);
4156
4157 if (device_property_read_bool(dev, "split-mode")) {
4158 struct dw_dp *secondary = dw_dp_find_by_id(dev->driver, !dp->id);
4159
4160 if (!secondary)
4161 return -EPROBE_DEFER;
4162
4163 dp->right = secondary;
4164 dp->split_mode = true;
4165 secondary->left = dp;
4166 secondary->split_mode = true;
4167 }
4168
4169 dw_dp_hdcp_init(dp);
4170
4171 return component_add(dev, &dw_dp_component_ops);
4172 }
4173
dw_dp_remove(struct platform_device * pdev)4174 static int dw_dp_remove(struct platform_device *pdev)
4175 {
4176 struct dw_dp *dp = platform_get_drvdata(pdev);
4177
4178 component_del(dp->dev, &dw_dp_component_ops);
4179 cancel_work_sync(&dp->hpd_work);
4180
4181 return 0;
4182 }
4183
dw_dp_runtime_suspend(struct device * dev)4184 static int __maybe_unused dw_dp_runtime_suspend(struct device *dev)
4185 {
4186 struct dw_dp *dp = dev_get_drvdata(dev);
4187
4188 clk_disable_unprepare(dp->aux_clk);
4189 clk_disable_unprepare(dp->apb_clk);
4190 clk_disable_unprepare(dp->hclk);
4191
4192 return 0;
4193 }
4194
dw_dp_runtime_resume(struct device * dev)4195 static int __maybe_unused dw_dp_runtime_resume(struct device *dev)
4196 {
4197 struct dw_dp *dp = dev_get_drvdata(dev);
4198
4199 clk_prepare_enable(dp->hclk);
4200 clk_prepare_enable(dp->apb_clk);
4201 clk_prepare_enable(dp->aux_clk);
4202
4203 dw_dp_init(dp);
4204
4205 return 0;
4206 }
4207
4208 static const struct dev_pm_ops dw_dp_pm_ops = {
4209 SET_RUNTIME_PM_OPS(dw_dp_runtime_suspend, dw_dp_runtime_resume, NULL)
4210 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
4211 pm_runtime_force_resume)
4212 };
4213
4214 static const struct of_device_id dw_dp_of_match[] = {
4215 { .compatible = "rockchip,rk3588-dp", },
4216 {}
4217 };
4218 MODULE_DEVICE_TABLE(of, dw_dp_of_match);
4219
4220 struct platform_driver dw_dp_driver = {
4221 .probe = dw_dp_probe,
4222 .remove = dw_dp_remove,
4223 .driver = {
4224 .name = "dw-dp",
4225 .of_match_table = dw_dp_of_match,
4226 .pm = &dw_dp_pm_ops,
4227 },
4228 };
4229