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