blob: 6c6143a92f0b820b37f3f4387f13352e8af1d535 [file] [log] [blame]
Jitao Shi56126602021-05-29 16:26:00 +08001/* SPDX-License-Identifier: GPL-2.0-only */
2
3#include <console/console.h>
4#include <device/mmio.h>
5#include <delay.h>
6#include <edid.h>
7#include <soc/dptx.h>
8#include <soc/dptx_hal.h>
9#include <soc/dptx_reg.h>
10#include <string.h>
11#include <timer.h>
12
13#define REG_OFFSET_LIMIT 0x8000
14
15struct shift_mask {
16 u32 shift;
17 u32 mask;
18};
19static const struct shift_mask volt_swing[DPTX_LANE_MAX] = {
20 [DPTX_LANE0] = { DP_TX0_VOLT_SWING_FLDMASK_POS, DP_TX0_VOLT_SWING_FLDMASK },
21 [DPTX_LANE1] = { DP_TX1_VOLT_SWING_FLDMASK_POS, DP_TX1_VOLT_SWING_FLDMASK },
22 [DPTX_LANE2] = { DP_TX2_VOLT_SWING_FLDMASK_POS, DP_TX2_VOLT_SWING_FLDMASK },
23 [DPTX_LANE3] = { DP_TX3_VOLT_SWING_FLDMASK_POS, DP_TX3_VOLT_SWING_FLDMASK },
24};
25static const struct shift_mask volt_preemphasis[DPTX_LANE_MAX] = {
26 [DPTX_LANE0] = { DP_TX0_PRE_EMPH_FLDMASK_POS, DP_TX0_PRE_EMPH_FLDMASK },
27 [DPTX_LANE1] = { DP_TX1_PRE_EMPH_FLDMASK_POS, DP_TX1_PRE_EMPH_FLDMASK },
28 [DPTX_LANE2] = { DP_TX2_PRE_EMPH_FLDMASK_POS, DP_TX2_PRE_EMPH_FLDMASK },
29 [DPTX_LANE3] = { DP_TX3_PRE_EMPH_FLDMASK_POS, DP_TX3_PRE_EMPH_FLDMASK },
30};
31
32u32 mtk_dp_read(struct mtk_dp *mtk_dp, u32 offset)
33{
34 void *addr = mtk_dp->regs + offset;
35
36 if (offset % 4 != 0 || offset > REG_OFFSET_LIMIT) {
37 printk(BIOS_ERR, "[%s] invalid offset %#x for reg %p\n",
38 __func__, offset, mtk_dp->regs);
39 return 0;
40 }
41
42 return read32(addr);
43}
44
45void mtk_dp_write(struct mtk_dp *mtk_dp, u32 offset, u32 val)
46{
47 void *addr = mtk_dp->regs + offset;
48
49 if (offset % 4 != 0 || offset > REG_OFFSET_LIMIT) {
50 printk(BIOS_ERR, "[%s] invalid offset %#x for reg %p\n",
51 __func__, offset, mtk_dp->regs);
52 return;
53 }
54
55 write32(addr, val);
56}
57
58void mtk_dp_mask(struct mtk_dp *mtk_dp, u32 offset, u32 val, u32 mask)
59{
60 void *addr = mtk_dp->regs + offset;
61
62 if (offset % 4 != 0 || offset > REG_OFFSET_LIMIT) {
63 printk(BIOS_ERR, "[%s] invalid offset %#x for reg %p\n",
64 __func__, offset, mtk_dp->regs);
65 return;
66 }
67
68 /*
69 * TODO: modify to clrsetbits32(addr, mask, val);
70 * There is asserion error when testing assert((val & mask) == val).
71 */
72 clrsetbits32(addr, mask, val & mask);
73}
74
75void mtk_dp_write_byte(struct mtk_dp *mtk_dp, u32 addr, u8 val, u32 mask)
76{
77 if (addr % 2) {
78 mtk_dp_write(mtk_dp, DP_TX_TOP_APB_WSTRB, 0x12);
79 mtk_dp_mask(mtk_dp, addr - 1, val << 8, mask << 8);
80 } else {
81 mtk_dp_write(mtk_dp, DP_TX_TOP_APB_WSTRB, 0x11);
82 mtk_dp_mask(mtk_dp, addr, val, mask);
83 }
84
85 mtk_dp_write(mtk_dp, DP_TX_TOP_APB_WSTRB, 0x0);
86}
87
88void dptx_hal_verify_clock(struct mtk_dp *mtk_dp)
89{
90 u32 m, n, ls_clk, pix_clk;
91
92 m = mtk_dp_read(mtk_dp, REG_33C8_DP_ENCODER1_P0);
93 n = 0x8000;
94 ls_clk = mtk_dp->train_info.linkrate;
95 ls_clk *= 27;
96
97 pix_clk = m * ls_clk / n;
98 printk(BIOS_DEBUG, "DPTX calc pixel clock = %d MHz, dp_intf clock = %dMHz\n",
99 pix_clk, pix_clk / 4);
100}
101
102void dptx_hal_init_setting(struct mtk_dp *mtk_dp)
103{
104 DP_WRITE1BYTE(mtk_dp, REG_342C_DP_TRANS_P0, 0x69);
105 mtk_dp_mask(mtk_dp, REG_3540_DP_TRANS_P0, BIT(3), BIT(3));
106 mtk_dp_mask(mtk_dp, REG_31EC_DP_ENCODER0_P0, BIT(4), BIT(4));
107 mtk_dp_mask(mtk_dp, REG_304C_DP_ENCODER0_P0, 0, BIT(8));
108 mtk_dp_mask(mtk_dp, DP_TX_TOP_IRQ_MASK, BIT(2), BIT(2));
109}
110
111void dptx_hal_bypassmsa_en(struct mtk_dp *mtk_dp, bool enable)
112{
113 mtk_dp_mask(mtk_dp, REG_3030_DP_ENCODER0_P0,
114 enable ? 0 : 0x3ff, 0x3ff);
115}
116
117void dptx_hal_set_msa(struct mtk_dp *mtk_dp)
118{
119 u32 va, vsync, vbp, vfp, vtotal, ha, hsync, hbp, hfp, htotal;
120 struct edid *edid = mtk_dp->edid;
121
122 va = edid->mode.va;
123 vsync = edid->mode.vspw;
124 vbp = edid->mode.vbl - edid->mode.vso -
125 edid->mode.vspw - edid->mode.vborder;
126 vfp = edid->mode.vso - edid->mode.vborder;
127
128 ha = edid->mode.ha;
129 hsync = edid->mode.hspw;
130 hbp = edid->mode.hbl - edid->mode.hso -
131 edid->mode.hspw - edid->mode.hborder;
132 hfp = edid->mode.hso - edid->mode.hborder;
133
134 htotal = ha + hsync + hbp + hfp;
135 vtotal = va + vsync + vbp + vfp;
136
137 DP_WRITE2BYTE(mtk_dp, REG_3010_DP_ENCODER0_P0, htotal);
138 DP_WRITE2BYTE(mtk_dp, REG_3018_DP_ENCODER0_P0, hsync + hbp);
139 mtk_dp_mask(mtk_dp, REG_3028_DP_ENCODER0_P0,
140 hsync << HSW_SW_DP_ENCODER0_P0_FLDMASK_POS,
141 HSW_SW_DP_ENCODER0_P0_FLDMASK);
142 mtk_dp_mask(mtk_dp, REG_3028_DP_ENCODER0_P0,
143 0 << HSP_SW_DP_ENCODER0_P0_FLDMASK_POS,
144 HSP_SW_DP_ENCODER0_P0_FLDMASK);
145 DP_WRITE2BYTE(mtk_dp, REG_3020_DP_ENCODER0_P0, ha);
146 DP_WRITE2BYTE(mtk_dp, REG_3014_DP_ENCODER0_P0, va);
147 DP_WRITE2BYTE(mtk_dp, REG_301C_DP_ENCODER0_P0, vsync + vbp);
148 mtk_dp_mask(mtk_dp, REG_302C_DP_ENCODER0_P0,
149 vsync << VSW_SW_DP_ENCODER0_P0_FLDMASK_POS,
150 VSW_SW_DP_ENCODER0_P0_FLDMASK);
151 mtk_dp_mask(mtk_dp, REG_302C_DP_ENCODER0_P0,
152 0 << VSP_SW_DP_ENCODER0_P0_FLDMASK_POS,
153 VSP_SW_DP_ENCODER0_P0_FLDMASK);
154 DP_WRITE2BYTE(mtk_dp, REG_3024_DP_ENCODER0_P0, va);
155 DP_WRITE2BYTE(mtk_dp, REG_3064_DP_ENCODER0_P0, ha);
156 DP_WRITE2BYTE(mtk_dp, REG_3154_DP_ENCODER0_P0, htotal);
157 DP_WRITE2BYTE(mtk_dp, REG_3158_DP_ENCODER0_P0, hfp);
158 DP_WRITE2BYTE(mtk_dp, REG_315C_DP_ENCODER0_P0, vsync);
159 DP_WRITE2BYTE(mtk_dp, REG_3160_DP_ENCODER0_P0, hsync + hbp);
160 DP_WRITE2BYTE(mtk_dp, REG_3164_DP_ENCODER0_P0, ha);
161 DP_WRITE2BYTE(mtk_dp, REG_3168_DP_ENCODER0_P0, vtotal);
162 DP_WRITE2BYTE(mtk_dp, REG_316C_DP_ENCODER0_P0, hfp);
163 DP_WRITE2BYTE(mtk_dp, REG_3170_DP_ENCODER0_P0, vsync);
164 DP_WRITE2BYTE(mtk_dp, REG_3174_DP_ENCODER0_P0, vsync + vbp);
165 DP_WRITE2BYTE(mtk_dp, REG_3178_DP_ENCODER0_P0, va);
166
167 printk(BIOS_INFO, "MSA:Htt(%d), Vtt(%d), Hact(%d), Vact(%d), FPS(%d)\n",
168 htotal, vtotal, ha, va,
169 edid->mode.pixel_clock * 1000 / htotal / vtotal);
170}
171
172void dptx_hal_set_color_format(struct mtk_dp *mtk_dp, u8 out_format)
173{
174 /* MISC0 */
175 mtk_dp_write_byte(mtk_dp, REG_3034_DP_ENCODER0_P0,
176 out_format << 0x1, MASKBIT(2, 1));
177
178 switch (out_format) {
179 case DP_COLOR_FORMAT_RGB_444:
180 case DP_COLOR_FORMAT_YUV_444:
181 mtk_dp_write_byte(mtk_dp, REG_303C_DP_ENCODER0_P0 + 1,
182 0, MASKBIT(6, 4));
183 break;
184 case DP_COLOR_FORMAT_YUV_422:
185 mtk_dp_write_byte(mtk_dp, REG_303C_DP_ENCODER0_P0 + 1,
186 BIT(4), MASKBIT(6, 4));
187 break;
188 case DP_COLOR_FORMAT_YUV_420:
189 mtk_dp_write_byte(mtk_dp, REG_303C_DP_ENCODER0_P0 + 1, BIT(5),
190 MASKBIT(6, 4));
191 break;
192 default:
193 break;
194 }
195}
196
197void dptx_hal_set_color_depth(struct mtk_dp *mtk_dp, u8 color_depth)
198{
199 u8 val;
200
201 mtk_dp_write_byte(mtk_dp, REG_3034_DP_ENCODER0_P0,
202 color_depth << 0x5, 0xe0);
203
204 switch (color_depth) {
205 case DP_COLOR_DEPTH_6BIT:
206 val = 4;
207 break;
208 case DP_COLOR_DEPTH_8BIT:
209 val = 3;
210 break;
211 case DP_COLOR_DEPTH_10BIT:
212 val = 2;
213 break;
214 case DP_COLOR_DEPTH_12BIT:
215 val = 1;
216 break;
217 case DP_COLOR_DEPTH_16BIT:
218 val = 0;
219 break;
220 default:
221 return;
222 }
223 mtk_dp_write_byte(mtk_dp, REG_303C_DP_ENCODER0_P0 + 1, val, 0x7);
224}
225
226void dptx_hal_setmisc(struct mtk_dp *mtk_dp, u8 cmisc[2])
227{
228 mtk_dp_write_byte(mtk_dp, REG_3034_DP_ENCODER0_P0, cmisc[0], 0xfe);
229 mtk_dp_write_byte(mtk_dp, REG_3034_DP_ENCODER0_P0 + 1, cmisc[1], 0xff);
230}
231
232void dptx_hal_overwrite_mn(struct mtk_dp *mtk_dp,
233 bool enable, u32 video_m, u32 video_n)
234{
235 if (enable) {
236 /* Turn on overwrite MN */
237 DP_WRITE2BYTE(mtk_dp, REG_3008_DP_ENCODER0_P0,
238 video_m & 0xffff);
239 DP_WRITE1BYTE(mtk_dp, REG_300C_DP_ENCODER0_P0,
240 (video_m >> 16) & 0xff);
241 DP_WRITE2BYTE(mtk_dp, REG_3044_DP_ENCODER0_P0,
242 video_n & 0xffff);
243 DP_WRITE1BYTE(mtk_dp, REG_3048_DP_ENCODER0_P0,
244 (video_n >> 16) & 0xff);
245 DP_WRITE2BYTE(mtk_dp, REG_3050_DP_ENCODER0_P0,
246 video_n & 0xffff);
247
248 /* Add legerII. */
249 DP_WRITE1BYTE(mtk_dp, REG_3054_DP_ENCODER0_P0,
250 (video_n >> 16) & 0xff);
251 mtk_dp_write_byte(mtk_dp, REG_3004_DP_ENCODER0_P0 + 1,
252 BIT(0), BIT(0));
253 } else {
254 /* Turn off overwrite MN */
255 mtk_dp_write_byte(mtk_dp, REG_3004_DP_ENCODER0_P0 + 1,
256 0, BIT(0));
257 }
258}
259
260u8 dptx_hal_get_colorbpp(struct mtk_dp *mtk_dp)
261{
262 u8 color_bpp;
263 u8 color_depth = mtk_dp->info.depth;
264 u8 color_format = mtk_dp->info.format;
265
266 switch (color_depth) {
267 case DP_COLOR_DEPTH_6BIT:
268 if (color_format == DP_COLOR_FORMAT_YUV_422)
269 color_bpp = 16;
270 else if (color_format == DP_COLOR_FORMAT_YUV_420)
271 color_bpp = 12;
272 else
273 color_bpp = 18;
274 break;
275 case DP_COLOR_DEPTH_8BIT:
276 if (color_format == DP_COLOR_FORMAT_YUV_422)
277 color_bpp = 16;
278 else if (color_format == DP_COLOR_FORMAT_YUV_420)
279 color_bpp = 12;
280 else
281 color_bpp = 24;
282 break;
283 case DP_COLOR_DEPTH_10BIT:
284 if (color_format == DP_COLOR_FORMAT_YUV_422)
285 color_bpp = 20;
286 else if (color_format == DP_COLOR_FORMAT_YUV_420)
287 color_bpp = 15;
288 else
289 color_bpp = 30;
290 break;
291 case DP_COLOR_DEPTH_12BIT:
292 if (color_format == DP_COLOR_FORMAT_YUV_422)
293 color_bpp = 24;
294 else if (color_format == DP_COLOR_FORMAT_YUV_420)
295 color_bpp = 18;
296 else
297 color_bpp = 36;
298 break;
299 case DP_COLOR_DEPTH_16BIT:
300 if (color_format == DP_COLOR_FORMAT_YUV_422)
301 color_bpp = 32;
302 else if (color_format == DP_COLOR_FORMAT_YUV_420)
303 color_bpp = 24;
304 else
305 color_bpp = 48;
306 break;
307 default:
308 color_bpp = 24;
309 printk(BIOS_ERR, "Set wrong bpp = %d\n", color_bpp);
310 break;
311 }
312
313 return color_bpp;
314}
315
316void dptx_hal_settu_sramrd_start(struct mtk_dp *mtk_dp, u16 value)
317{
318 /*
319 * [5:0] video sram start address
320 * modify in 480P case only, default=0x1f
321 */
322 mtk_dp_write_byte(mtk_dp, REG_303C_DP_ENCODER0_P0, (u8)value, 0x3f);
323}
324
325void dptx_hal_setsdp_downcnt_init_inhblanking(struct mtk_dp *mtk_dp, u16 value)
326{
327 mtk_dp_mask(mtk_dp, REG_3364_DP_ENCODER1_P0, value, 0xfff);
328
329}
330
331void dptx_hal_setsdp_downcnt_init(struct mtk_dp *mtk_dp, u16 value)
332{
333 mtk_dp_mask(mtk_dp, REG_3040_DP_ENCODER0_P0, value, 0xfff);
334}
335
336void dptx_hal_settu_setencoder(struct mtk_dp *mtk_dp)
337{
338 mtk_dp_write_byte(mtk_dp, REG_303C_DP_ENCODER0_P0 + 1,
339 BIT(7), BIT(7));
340 DP_WRITE2BYTE(mtk_dp, REG_3040_DP_ENCODER0_P0, 0x2020);
341 mtk_dp_mask(mtk_dp, REG_3364_DP_ENCODER1_P0, 0x2020, 0xfff);
342 mtk_dp_write_byte(mtk_dp, REG_3300_DP_ENCODER1_P0 + 1,
343 0x2, BIT(1) | BIT(0));
344 mtk_dp_write_byte(mtk_dp, REG_3364_DP_ENCODER1_P0 + 1,
345 0x40, 0x70);
346 DP_WRITE2BYTE(mtk_dp, REG_3368_DP_ENCODER1_P0, 0x1111);
347}
348
349bool dptx_hal_hpd_high(struct mtk_dp *mtk_dp)
350{
351 return mtk_dp_read(mtk_dp, REG_3414_DP_TRANS_P0) & BIT(2);
352}
353
354bool dptx_hal_auxread_bytes(struct mtk_dp *mtk_dp, u8 cmd,
355 u32 dpcd_addr, size_t length, u8 *rx_buf)
356{
357 bool valid_cmd = false;
358 u8 reply_cmd, aux_irq_status;
359 int rd_count;
360 u32 wait_reply_count = AUX_WAITREPLY_LPNUM;
361
362 DP_WRITE1BYTE(mtk_dp, REG_3640_AUX_TX_P0, 0x7f);
363 mdelay(1);
364
365 if (length > 16 || (cmd == AUX_CMD_NATIVE_R && length == 0x0))
366 return false;
367
368 DP_WRITE1BYTE(mtk_dp, REG_3650_AUX_TX_P0 + 1, 0x1);
369 DP_WRITE1BYTE(mtk_dp, REG_3644_AUX_TX_P0, cmd);
370 DP_WRITE2BYTE(mtk_dp, REG_3648_AUX_TX_P0, dpcd_addr & 0xffff);
371 DP_WRITE1BYTE(mtk_dp, REG_364C_AUX_TX_P0, (dpcd_addr >> 16) & 0xf);
372
373 if (length > 0) {
374 mtk_dp_mask(mtk_dp, REG_3650_AUX_TX_P0,
375 (length - 1) << MCU_REQ_DATA_NUM_AUX_TX_P0_FLDMASK_POS,
376 MCU_REQUEST_DATA_NUM_AUX_TX_P0_FLDMASK);
377 DP_WRITE1BYTE(mtk_dp, REG_362C_AUX_TX_P0, 0x0);
378 }
379
380 if (cmd == AUX_CMD_I2C_R || cmd == AUX_CMD_I2C_R_MOT0)
381 if (length == 0x0)
382 mtk_dp_mask(mtk_dp, REG_362C_AUX_TX_P0,
383 0x1 << AUX_NO_LENGTH_AUX_TX_P0_FLDMASK_POS,
384 AUX_NO_LENGTH_AUX_TX_P0_FLDMASK);
385
386 mtk_dp_mask(mtk_dp, REG_3630_AUX_TX_P0,
387 0x1 << AUX_TX_REQUEST_READY_AUX_TX_P0_FLDMASK_POS,
388 AUX_TX_REQUEST_READY_AUX_TX_P0_FLDMASK);
389
390 while (--wait_reply_count) {
391 if (mtk_dp_read(mtk_dp, REG_3618_AUX_TX_P0) &
392 AUX_RX_FIFO_WRITE_POINTER_AUX_TX_P0_FLDMASK) {
393 valid_cmd = true;
394 break;
395 }
396
397 if (mtk_dp_read(mtk_dp, REG_3618_AUX_TX_P0) &
398 AUX_RX_FIFO_FULL_AUX_TX_P0_FLDMASK) {
399 valid_cmd = true;
400 break;
401 }
402
403 aux_irq_status = mtk_dp_read(mtk_dp, REG_3640_AUX_TX_P0) & 0xff;
404
405 if (aux_irq_status & AUX_RX_RECV_COMPLETE_IRQ_TX_P0_FLDMASK) {
406 valid_cmd = true;
407 break;
408 }
409
410 if (aux_irq_status & AUX_400US_TIMEOUT_IRQ_AUX_TX_P0_FLDMASK) {
411 printk(BIOS_ERR, "(AUX Read)HW Timeout 400us irq\n");
412 break;
413 }
414 }
415
416 reply_cmd = mtk_dp_read(mtk_dp, REG_3624_AUX_TX_P0) & 0xf;
417 if (reply_cmd)
418 printk(BIOS_ERR, "reply_cmd(%#x), NACK or Defer\n", reply_cmd);
419
420 if (wait_reply_count == 0x0 || reply_cmd) {
421 u8 phy_status = 0x0;
422
423 phy_status = mtk_dp_read(mtk_dp, REG_3628_AUX_TX_P0);
424 if (phy_status != 0x1)
425 printk(BIOS_ERR, "Aux read: aux hang, need sw reset\n");
426
427 mtk_dp_mask(mtk_dp, REG_3650_AUX_TX_P0,
428 0x1 << MCU_ACK_TRAN_COMPLETE_AUX_TX_P0_FLDMASK_POS,
429 MCU_ACK_TRANSACTION_COMPLETE_AUX_TX_P0_FLDMASK);
430 DP_WRITE1BYTE(mtk_dp, REG_3640_AUX_TX_P0, 0x7f);
431
432 mdelay(1);
433 printk(BIOS_ERR, "wait_reply_count(%#x), TimeOut\n",
434 wait_reply_count);
435 return false;
436 }
437
438 if (length == 0) {
439 DP_WRITE1BYTE(mtk_dp, REG_362C_AUX_TX_P0, 0x0);
440 } else {
441 if (valid_cmd) {
442 mtk_dp_mask(mtk_dp, REG_3620_AUX_TX_P0,
443 0x0 << AUX_RD_MODE_AUX_TX_P0_FLDMASK_POS,
444 AUX_RD_MODE_AUX_TX_P0_FLDMASK);
445
446 for (rd_count = 0; rd_count < length; rd_count++) {
447 mtk_dp_mask(mtk_dp, REG_3620_AUX_TX_P0,
448 0x1 << AUX_RX_FIFO_R_PULSE_TX_P0_FLDMASK_POS,
449 AUX_RX_FIFO_READ_PULSE_TX_P0_FLDMASK);
450 mdelay(1);
451 *(rx_buf + rd_count) = mtk_dp_read(mtk_dp,
452 REG_3620_AUX_TX_P0);
453 }
454 } else {
455 printk(BIOS_INFO, "Read TimeOut %#x\n", dpcd_addr);
456 }
457 }
458
459 mtk_dp_mask(mtk_dp, REG_3650_AUX_TX_P0,
460 0x1 << MCU_ACK_TRAN_COMPLETE_AUX_TX_P0_FLDMASK_POS,
461 MCU_ACK_TRANSACTION_COMPLETE_AUX_TX_P0_FLDMASK);
462 DP_WRITE1BYTE(mtk_dp, REG_3640_AUX_TX_P0, 0x7f);
463
464 mdelay(1);
465 return valid_cmd;
466}
467
468bool dptx_hal_auxwrite_bytes(struct mtk_dp *mtk_dp, u8 cmd,
469 u32 dpcd_addr, size_t length, u8 *data)
470{
471 bool valid_cmd = false;
472 u8 reply_cmd;
473 int i;
474 u16 wait_reply_count = AUX_WAITREPLY_LPNUM;
475 int reg_idx;
476
477 mtk_dp_write_byte(mtk_dp, REG_3704_AUX_TX_P0,
478 1 << AUX_TX_FIFO_NEW_MODE_EN_AUX_TX_P0_FLDMASK_POS,
479 AUX_TX_FIFO_NEW_MODE_EN_AUX_TX_P0_FLDMASK);
480 DP_WRITE1BYTE(mtk_dp, REG_3650_AUX_TX_P0 + 1, 0x1);
481 DP_WRITE1BYTE(mtk_dp, REG_3640_AUX_TX_P0, 0x7f);
482 mdelay(1);
483
484 DP_WRITE1BYTE(mtk_dp, REG_3650_AUX_TX_P0 + 1, 0x1);
485 DP_WRITE1BYTE(mtk_dp, REG_3644_AUX_TX_P0, cmd);
486 DP_WRITE1BYTE(mtk_dp, REG_3648_AUX_TX_P0, dpcd_addr & 0xff);
487 DP_WRITE1BYTE(mtk_dp, REG_3648_AUX_TX_P0 + 1,
488 (dpcd_addr >> 8) & 0xff);
489 DP_WRITE1BYTE(mtk_dp, REG_364C_AUX_TX_P0,
490 (dpcd_addr >> 16) & 0xf);
491
492 if (length > 0) {
493 DP_WRITE1BYTE(mtk_dp, REG_362C_AUX_TX_P0, 0x0);
494 for (i = 0; i < (length + 1) / 2; i++)
495 for (reg_idx = 0; reg_idx < 2; reg_idx++)
496 if ((i * 2 + reg_idx) < length)
497 DP_WRITE1BYTE(mtk_dp,
498 REG_3708_AUX_TX_P0 + i * 4 + reg_idx,
499 data[i * 2 + reg_idx]);
500 DP_WRITE1BYTE(mtk_dp, REG_3650_AUX_TX_P0 + 1,
501 ((length - 1) & 0xf) << 4);
502 } else {
503 DP_WRITE1BYTE(mtk_dp, REG_362C_AUX_TX_P0, 0x1);
504 }
505
506 mtk_dp_write_byte(mtk_dp, REG_3704_AUX_TX_P0,
507 AUX_TX_FIFO_WRITE_DATA_NEW_MODE_TOGGLE_AUX_TX_P0_FLDMASK,
508 AUX_TX_FIFO_WRITE_DATA_NEW_MODE_TOGGLE_AUX_TX_P0_FLDMASK);
509 DP_WRITE1BYTE(mtk_dp, REG_3630_AUX_TX_P0, 0x8);
510
511 while (--wait_reply_count) {
512 u8 aux_irq_status;
513
514 aux_irq_status = mtk_dp_read(mtk_dp, REG_3640_AUX_TX_P0) & 0xff;
515 mdelay(1);
516 if (aux_irq_status & AUX_RX_RECV_COMPLETE_IRQ_TX_P0_FLDMASK) {
517 valid_cmd = true;
518 break;
519 }
520
521 if (aux_irq_status & AUX_400US_TIMEOUT_IRQ_AUX_TX_P0_FLDMASK)
522 break;
523 }
524
525 reply_cmd = mtk_dp_read(mtk_dp, REG_3624_AUX_TX_P0) & 0xf;
526 if (reply_cmd)
527 printk(BIOS_ERR, "reply_cmd(%#x), NACK or Defer\n", reply_cmd);
528
529 if (wait_reply_count == 0x0 || reply_cmd) {
530 u8 phy_status = 0x0;
531
532 phy_status = mtk_dp_read(mtk_dp, REG_3628_AUX_TX_P0);
533 if (phy_status != 0x1)
534 printk(BIOS_ERR,
535 "Aux write: aux hang, need SW reset!\n");
536
537 DP_WRITE1BYTE(mtk_dp, REG_3650_AUX_TX_P0 + 1, 0x1);
538 DP_WRITE1BYTE(mtk_dp, REG_3640_AUX_TX_P0, 0x7f);
539
540 mdelay(1);
541
542 printk(BIOS_INFO, "reply_cmd(%#x), wait_reply_count(%d)\n",
543 reply_cmd, wait_reply_count);
544 return false;
545 }
546
547 DP_WRITE1BYTE(mtk_dp, REG_3650_AUX_TX_P0 + 1, 0x1);
548
549 if (length == 0)
550 DP_WRITE1BYTE(mtk_dp, REG_362C_AUX_TX_P0, 0x0);
551
552 DP_WRITE1BYTE(mtk_dp, REG_3640_AUX_TX_P0, 0x7f);
553
554 mdelay(1);
555
556 return valid_cmd;
557}
558
559bool dptx_hal_setswing_preemphasis(struct mtk_dp *mtk_dp, int lane_num,
560 int swing_value, int preemphasis)
561{
562 printk(BIOS_DEBUG, "lane(%d), set swing(%#x), emp(%#x)\n",
563 lane_num, swing_value, preemphasis);
564
565 if (lane_num >= DPTX_LANE_MAX) {
566 printk(BIOS_ERR, "invalid lane number: %d\n", lane_num);
567 return false;
568 }
569
570 mtk_dp_mask(mtk_dp, DP_TX_TOP_SWING_EMP,
571 swing_value << volt_swing[lane_num].shift,
572 volt_swing[lane_num].mask);
573 mtk_dp_mask(mtk_dp, DP_TX_TOP_SWING_EMP,
574 preemphasis << volt_preemphasis[lane_num].shift,
575 volt_preemphasis[lane_num].mask);
576 return true;
577}
578
579void dptx_hal_reset_swing_preemphasis(struct mtk_dp *mtk_dp)
580{
581 int lane;
582
583 for (lane = 0; lane < DPTX_LANE_MAX; lane++)
584 mtk_dp_mask(mtk_dp, DP_TX_TOP_SWING_EMP,
585 0, volt_swing[lane].mask);
586 for (lane = 0; lane < DPTX_LANE_MAX; lane++)
587 mtk_dp_mask(mtk_dp, DP_TX_TOP_SWING_EMP,
588 0, volt_preemphasis[lane].mask);
589}
590
591void dptx_hal_hpd_int_en(struct mtk_dp *mtk_dp, bool enable)
592{
593 /* [7]:int, [6]:Con, [5]DisCon, [4]No-Use: UnMASK HPD Port */
594 mtk_dp_write_byte(mtk_dp, REG_3418_DP_TRANS_P0,
595 enable ? 0 : MASKBIT(7, 5), MASKBIT(7, 5));
596}
597
598void dptx_hal_hpd_detect_setting(struct mtk_dp *mtk_dp)
599{
600 mtk_dp_write_byte(mtk_dp, REG_3410_DP_TRANS_P0,
601 0x8, MASKBIT(3, 0));
602 mtk_dp_write_byte(mtk_dp, REG_3410_DP_TRANS_P0,
603 0xa << 4, MASKBIT(7, 4));
604
605 DP_WRITE1BYTE(mtk_dp, REG_3410_DP_TRANS_P0 + 1, 0x55);
606 DP_WRITE1BYTE(mtk_dp, REG_3430_DP_TRANS_P0, 0x2);
607}
608
609void dptx_hal_phy_setting(struct mtk_dp *mtk_dp)
610{
611 mtk_dp_mask(mtk_dp, DP_TX_TOP_PWR_STATE,
612 0x3 << DP_PWR_STATE_FLDMASK_POS, DP_PWR_STATE_FLDMASK);
613
614 mtk_dp_write(mtk_dp, 0x2000, 0x00000001);
615 mtk_dp_write(mtk_dp, 0x103c, 0x00000000);
616 mtk_dp_write(mtk_dp, 0x2000, 0x00000003);
617 mtk_dp_write(mtk_dp, 0x1138, 0x20181410);
618 mtk_dp_write(mtk_dp, 0x1238, 0x20181410);
619 mtk_dp_write(mtk_dp, 0x1338, 0x20181410);
620 mtk_dp_write(mtk_dp, 0x1438, 0x20181410);
621 mtk_dp_write(mtk_dp, 0x113C, 0x20241e18);
622 mtk_dp_write(mtk_dp, 0x123C, 0x20241e18);
623 mtk_dp_write(mtk_dp, 0x133C, 0x20241e18);
624 mtk_dp_write(mtk_dp, 0x143C, 0x20241e18);
625 mtk_dp_write(mtk_dp, 0x1140, 0x00003028);
626 mtk_dp_write(mtk_dp, 0x1240, 0x00003028);
627 mtk_dp_write(mtk_dp, 0x1340, 0x00003028);
628 mtk_dp_write(mtk_dp, 0x1440, 0x00003028);
629 mtk_dp_write(mtk_dp, 0x1144, 0x10080400);
630 mtk_dp_write(mtk_dp, 0x1244, 0x10080400);
631 mtk_dp_write(mtk_dp, 0x1344, 0x10080400);
632 mtk_dp_write(mtk_dp, 0x1444, 0x10080400);
633 mtk_dp_write(mtk_dp, 0x1148, 0x000c0600);
634 mtk_dp_write(mtk_dp, 0x1248, 0x000c0600);
635 mtk_dp_write(mtk_dp, 0x1348, 0x000c0600);
636 mtk_dp_write(mtk_dp, 0x1448, 0x000c0600);
637 mtk_dp_write(mtk_dp, 0x114C, 0x00000008);
638 mtk_dp_write(mtk_dp, 0x124C, 0x00000008);
639 mtk_dp_write(mtk_dp, 0x134C, 0x00000008);
640 mtk_dp_write(mtk_dp, 0x144C, 0x00000008);
641 mtk_dp_mask(mtk_dp, 0x3690, BIT(8), BIT(8));
642}
643
644void dptx_hal_ssc_en(struct mtk_dp *mtk_dp, bool enable)
645{
646 mtk_dp_mask(mtk_dp, 0x2000, BIT(0), MASKBIT(1, 0));
647
648 if (enable)
649 mtk_dp_mask(mtk_dp, 0x1014, BIT(3), BIT(3));
650 else
651 mtk_dp_mask(mtk_dp, 0x1014, 0x0, BIT(3));
652
653 mtk_dp_mask(mtk_dp, 0x2000, MASKBIT(1, 0), MASKBIT(1, 0));
654
655 mdelay(1);
656}
657
658void dptx_hal_aux_setting(struct mtk_dp *mtk_dp)
659{
660 /* [12 : 8]: modify timeout threshold = 1595 */
661 mtk_dp_mask(mtk_dp, REG_360C_AUX_TX_P0,
662 0x1595, AUX_TIMEOUT_THR_AUX_TX_P0_FLDMASK);
663 mtk_dp_write_byte(mtk_dp, REG_3658_AUX_TX_P0, 0, BIT(0));
664
665 /* 0x19 for 26M */
666 DP_WRITE1BYTE(mtk_dp, REG_3634_AUX_TX_P0 + 1, 0x19);
667 /* 0xd for 26M */
668 mtk_dp_write_byte(mtk_dp, REG_3614_AUX_TX_P0,
669 0xd, MASKBIT(6, 0));
670 mtk_dp_mask(mtk_dp, REG_37C8_AUX_TX_P0,
671 0x01 << MTK_ATOP_EN_AUX_TX_P0_FLDMASK_POS,
672 MTK_ATOP_EN_AUX_TX_P0_FLDMASK);
673}
674
675void dptx_hal_digital_setting(struct mtk_dp *mtk_dp)
676{
677 mtk_dp_write_byte(mtk_dp, REG_304C_DP_ENCODER0_P0,
678 0, VBID_VIDEO_MUTE_DP_ENCODER0_P0_FLDMASK);
679 /* MISC0 */
680 dptx_hal_set_color_format(mtk_dp, DP_COLOR_FORMAT_RGB_444);
681
682 dptx_hal_set_color_depth(mtk_dp, DP_COLOR_DEPTH_8BIT);
683 mtk_dp_write_byte(mtk_dp, REG_3368_DP_ENCODER1_P0 + 1,
684 BIT(4), MASKBIT(5, 4));
685 /* DPtx encoder reset all sw. */
686 mtk_dp_write_byte(mtk_dp, REG_3004_DP_ENCODER0_P0 + 1, BIT(1), BIT(1));
687
688 mdelay(1);
689
690 /* DPtx encoder reset all sw. */
691 mtk_dp_write_byte(mtk_dp, REG_3004_DP_ENCODER0_P0 + 1, 0, BIT(1));
692}
693
694void dptx_hal_digital_swreset(struct mtk_dp *mtk_dp)
695{
696 mtk_dp_write_byte(mtk_dp, REG_340C_DP_TRANS_P0 + 1, BIT(5), BIT(5));
697 mdelay(1);
698 mtk_dp_write_byte(mtk_dp, REG_340C_DP_TRANS_P0 + 1, 0, BIT(5));
699}
700
701void dptx_hal_phyd_reset(struct mtk_dp *mtk_dp)
702{
703 mtk_dp_write_byte(mtk_dp, 0x1038, 0, BIT(0));
704 mdelay(1);
705 mtk_dp_write_byte(mtk_dp, 0x1038, BIT(0), BIT(0));
706}
707
708void dptx_hal_set_txlane(struct mtk_dp *mtk_dp, int value)
709{
710 if (value == 0)
711 mtk_dp_write_byte(mtk_dp, REG_35F0_DP_TRANS_P0,
712 0, BIT(3) | BIT(2));
713 else
714 mtk_dp_write_byte(mtk_dp, REG_35F0_DP_TRANS_P0,
715 BIT(3), BIT(3) | BIT(2));
716
717 if ((value << 2) <= UINT8_MAX) {
718 mtk_dp_write_byte(mtk_dp, REG_3000_DP_ENCODER0_P0,
719 value, BIT(1) | BIT(0));
720 mtk_dp_write_byte(mtk_dp, REG_34A4_DP_TRANS_P0,
721 value << 2, BIT(3) | BIT(2));
722 } else {
723 printk(BIOS_ERR, "ERROR: [%s]value << 2 > 0xff\n", __func__);
724 }
725}
726
727void dptx_hal_set_txrate(struct mtk_dp *mtk_dp, int value)
728{
729 /* Power off TPLL and lane */
730 mtk_dp_write(mtk_dp, 0x2000, 0x00000001);
731 /* Set gear : 0x0 : RBR, 0x1 : HBR, 0x2 : HBR2, 0x3 : HBR3 */
732 switch (value) {
733 case DP_LINKRATE_RBR:
734 mtk_dp_write(mtk_dp, 0x103C, 0x0);
735 break;
736 case DP_LINKRATE_HBR:
737 mtk_dp_write(mtk_dp, 0x103C, 0x1);
738 break;
739 case DP_LINKRATE_HBR2:
740 mtk_dp_write(mtk_dp, 0x103C, 0x2);
741 break;
742 case DP_LINKRATE_HBR3:
743 mtk_dp_write(mtk_dp, 0x103C, 0x3);
744 break;
745 default:
746 printk(BIOS_ERR, "ERROR: Link rate not support(%d)\n", value);
747 break;
748 }
749
750 /* Power on BandGap, TPLL and Lane */
751 mtk_dp_write(mtk_dp, 0x2000, 0x3);
752}
753
754void dptx_hal_set_txtrainingpattern(struct mtk_dp *mtk_dp, int value)
755{
756 /* if Set TPS1. */
757 if (value == BIT(4))
758 dptx_hal_phy_setidlepattern(mtk_dp, false);
759
760 mtk_dp_write_byte(mtk_dp, REG_3400_DP_TRANS_P0 + 1,
761 value, MASKBIT(7, 4));
762}
763
764void dptx_hal_phy_setidlepattern(struct mtk_dp *mtk_dp, bool enable)
765{
766 mtk_dp_write_byte(mtk_dp, REG_3580_DP_TRANS_P0 + 1,
767 enable ? 0xf : 0x0, 0xf);
768}
769
770void dptx_hal_set_ef_mode(struct mtk_dp *mtk_dp, bool enable)
771{
772 /*
773 * [4]: REG_enhanced_frame_mode
774 * [1 : 0]: REG_lane_num
775 */
776 if (enable)
777 mtk_dp_write_byte(mtk_dp, REG_3000_DP_ENCODER0_P0,
778 BIT(4), BIT(4));
779 else
780 mtk_dp_write_byte(mtk_dp, REG_3000_DP_ENCODER0_P0,
781 0, BIT(4));
782}
783
784void dptx_hal_setscramble(struct mtk_dp *mtk_dp, bool enable)
785{
786 /* [0]: dp tx transmitter scramble enable. */
787 if (enable)
788 mtk_dp_write_byte(mtk_dp, REG_3404_DP_TRANS_P0,
789 BIT(0), BIT(0));
790 else
791 mtk_dp_write_byte(mtk_dp, REG_3404_DP_TRANS_P0,
792 0, BIT(0));
793}
794
795void dptx_hal_videomute(struct mtk_dp *mtk_dp, bool enable)
796{
797 if (enable) {
798 mtk_dp_write_byte(mtk_dp, REG_3000_DP_ENCODER0_P0,
799 BIT(3) | BIT(2), BIT(3) | BIT(2));
800 mtk_dp_write_byte(mtk_dp, DP_TX_SECURE_REG11,
801 BIT(3) | BIT(4), BIT(3) | BIT(4));
802 } else {
803 mtk_dp_write_byte(mtk_dp, REG_3000_DP_ENCODER0_P0,
804 BIT(3), BIT(3) | BIT(2));
805 mtk_dp_write_byte(mtk_dp, DP_TX_SECURE_REG11,
806 BIT(4), BIT(3) | BIT(4));
807 }
808 printk(BIOS_DEBUG, "mute = %#x\n", read32(mtk_dp->regs + 0x402c));
809}
810
811void dptx_hal_analog_power_en(struct mtk_dp *mtk_dp, bool enable)
812{
813 if (enable) {
814 mtk_dp_write_byte(mtk_dp, DP_TX_TOP_RESET_AND_PROBE,
815 0, BIT(4));
816 mdelay(1);
817 mtk_dp_write_byte(mtk_dp, DP_TX_TOP_RESET_AND_PROBE,
818 BIT(4), BIT(4));
819 } else {
820 DP_WRITE2BYTE(mtk_dp, TOP_OFFSET, 0x0);
821 mdelay(1);
822 DP_WRITE2BYTE(mtk_dp, 0x0034, 0x4aa);
823 DP_WRITE2BYTE(mtk_dp, 0x1040, 0x0);
824 DP_WRITE2BYTE(mtk_dp, 0x0038, 0x555);
825 }
826}