xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/rockchip/dw-dp.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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