1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include <linux/kernel.h>
24#include <linux/module.h>
25#include <linux/delay.h>
26#include <linux/init.h>
27#include <linux/errno.h>
28#include <linux/sched.h>
29#include <linux/i2c.h>
30#include <linux/seq_file.h>
31#include <drm/drm_dp_helper.h>
32#include <drm/drmP.h>
33
34#include "drm_crtc_helper_internal.h"
35
36
37
38
39
40
41
42
43
44
45
46static u8 dp_link_status(const u8 link_status[DP_LINK_STATUS_SIZE], int r)
47{
48 return link_status[r - DP_LANE0_1_STATUS];
49}
50
51static u8 dp_get_lane_status(const u8 link_status[DP_LINK_STATUS_SIZE],
52 int lane)
53{
54 int i = DP_LANE0_1_STATUS + (lane >> 1);
55 int s = (lane & 1) * 4;
56 u8 l = dp_link_status(link_status, i);
57 return (l >> s) & 0xf;
58}
59
60bool drm_dp_channel_eq_ok(const u8 link_status[DP_LINK_STATUS_SIZE],
61 int lane_count)
62{
63 u8 lane_align;
64 u8 lane_status;
65 int lane;
66
67 lane_align = dp_link_status(link_status,
68 DP_LANE_ALIGN_STATUS_UPDATED);
69 if ((lane_align & DP_INTERLANE_ALIGN_DONE) == 0)
70 return false;
71 for (lane = 0; lane < lane_count; lane++) {
72 lane_status = dp_get_lane_status(link_status, lane);
73 if ((lane_status & DP_CHANNEL_EQ_BITS) != DP_CHANNEL_EQ_BITS)
74 return false;
75 }
76 return true;
77}
78EXPORT_SYMBOL(drm_dp_channel_eq_ok);
79
80bool drm_dp_clock_recovery_ok(const u8 link_status[DP_LINK_STATUS_SIZE],
81 int lane_count)
82{
83 int lane;
84 u8 lane_status;
85
86 for (lane = 0; lane < lane_count; lane++) {
87 lane_status = dp_get_lane_status(link_status, lane);
88 if ((lane_status & DP_LANE_CR_DONE) == 0)
89 return false;
90 }
91 return true;
92}
93EXPORT_SYMBOL(drm_dp_clock_recovery_ok);
94
95u8 drm_dp_get_adjust_request_voltage(const u8 link_status[DP_LINK_STATUS_SIZE],
96 int lane)
97{
98 int i = DP_ADJUST_REQUEST_LANE0_1 + (lane >> 1);
99 int s = ((lane & 1) ?
100 DP_ADJUST_VOLTAGE_SWING_LANE1_SHIFT :
101 DP_ADJUST_VOLTAGE_SWING_LANE0_SHIFT);
102 u8 l = dp_link_status(link_status, i);
103
104 return ((l >> s) & 0x3) << DP_TRAIN_VOLTAGE_SWING_SHIFT;
105}
106EXPORT_SYMBOL(drm_dp_get_adjust_request_voltage);
107
108u8 drm_dp_get_adjust_request_pre_emphasis(const u8 link_status[DP_LINK_STATUS_SIZE],
109 int lane)
110{
111 int i = DP_ADJUST_REQUEST_LANE0_1 + (lane >> 1);
112 int s = ((lane & 1) ?
113 DP_ADJUST_PRE_EMPHASIS_LANE1_SHIFT :
114 DP_ADJUST_PRE_EMPHASIS_LANE0_SHIFT);
115 u8 l = dp_link_status(link_status, i);
116
117 return ((l >> s) & 0x3) << DP_TRAIN_PRE_EMPHASIS_SHIFT;
118}
119EXPORT_SYMBOL(drm_dp_get_adjust_request_pre_emphasis);
120
121void drm_dp_link_train_clock_recovery_delay(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) {
122 int rd_interval = dpcd[DP_TRAINING_AUX_RD_INTERVAL] &
123 DP_TRAINING_AUX_RD_MASK;
124
125 if (rd_interval > 4)
126 DRM_DEBUG_KMS("AUX interval %d, out of range (max 4)\n",
127 rd_interval);
128
129 if (rd_interval == 0 || dpcd[DP_DPCD_REV] >= DP_DPCD_REV_14)
130 udelay(100);
131 else
132 mdelay(rd_interval * 4);
133}
134EXPORT_SYMBOL(drm_dp_link_train_clock_recovery_delay);
135
136void drm_dp_link_train_channel_eq_delay(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) {
137 int rd_interval = dpcd[DP_TRAINING_AUX_RD_INTERVAL] &
138 DP_TRAINING_AUX_RD_MASK;
139
140 if (rd_interval > 4)
141 DRM_DEBUG_KMS("AUX interval %d, out of range (max 4)\n",
142 rd_interval);
143
144 if (rd_interval == 0)
145 udelay(400);
146 else
147 mdelay(rd_interval * 4);
148}
149EXPORT_SYMBOL(drm_dp_link_train_channel_eq_delay);
150
151u8 drm_dp_link_rate_to_bw_code(int link_rate)
152{
153 switch (link_rate) {
154 default:
155 WARN(1, "unknown DP link rate %d, using %x\n", link_rate,
156 DP_LINK_BW_1_62);
157 case 162000:
158 return DP_LINK_BW_1_62;
159 case 270000:
160 return DP_LINK_BW_2_7;
161 case 540000:
162 return DP_LINK_BW_5_4;
163 case 810000:
164 return DP_LINK_BW_8_1;
165 }
166}
167EXPORT_SYMBOL(drm_dp_link_rate_to_bw_code);
168
169int drm_dp_bw_code_to_link_rate(u8 link_bw)
170{
171 switch (link_bw) {
172 default:
173 WARN(1, "unknown DP link BW code %x, using 162000\n", link_bw);
174 case DP_LINK_BW_1_62:
175 return 162000;
176 case DP_LINK_BW_2_7:
177 return 270000;
178 case DP_LINK_BW_5_4:
179 return 540000;
180 case DP_LINK_BW_8_1:
181 return 810000;
182 }
183}
184EXPORT_SYMBOL(drm_dp_bw_code_to_link_rate);
185
186#define AUX_RETRY_INTERVAL 500
187
188
189
190
191
192
193
194
195
196
197
198
199
200static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request,
201 unsigned int offset, void *buffer, size_t size)
202{
203 struct drm_dp_aux_msg msg;
204 unsigned int retry, native_reply;
205 int err = 0, ret = 0;
206
207 memset(&msg, 0, sizeof(msg));
208 msg.address = offset;
209 msg.request = request;
210 msg.buffer = buffer;
211 msg.size = size;
212
213 mutex_lock(&aux->hw_mutex);
214
215
216
217
218
219
220
221 for (retry = 0; retry < 32; retry++) {
222 if (ret != 0 && ret != -ETIMEDOUT) {
223 usleep_range(AUX_RETRY_INTERVAL,
224 AUX_RETRY_INTERVAL + 100);
225 }
226
227 ret = aux->transfer(aux, &msg);
228
229 if (ret >= 0) {
230 native_reply = msg.reply & DP_AUX_NATIVE_REPLY_MASK;
231 if (native_reply == DP_AUX_NATIVE_REPLY_ACK) {
232 if (ret == size)
233 goto unlock;
234
235 ret = -EPROTO;
236 } else
237 ret = -EIO;
238 }
239
240
241
242
243
244
245 if (!err)
246 err = ret;
247 }
248
249 DRM_DEBUG_KMS("Too many retries, giving up. First error: %d\n", err);
250 ret = err;
251
252unlock:
253 mutex_unlock(&aux->hw_mutex);
254 return ret;
255}
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271ssize_t drm_dp_dpcd_read(struct drm_dp_aux *aux, unsigned int offset,
272 void *buffer, size_t size)
273{
274 int ret;
275
276
277
278
279
280
281
282
283
284
285
286
287
288 ret = drm_dp_dpcd_access(aux, DP_AUX_NATIVE_READ, DP_DPCD_REV, buffer,
289 1);
290 if (ret != 1)
291 return ret;
292
293 return drm_dp_dpcd_access(aux, DP_AUX_NATIVE_READ, offset, buffer,
294 size);
295}
296EXPORT_SYMBOL(drm_dp_dpcd_read);
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312ssize_t drm_dp_dpcd_write(struct drm_dp_aux *aux, unsigned int offset,
313 void *buffer, size_t size)
314{
315 return drm_dp_dpcd_access(aux, DP_AUX_NATIVE_WRITE, offset, buffer,
316 size);
317}
318EXPORT_SYMBOL(drm_dp_dpcd_write);
319
320
321
322
323
324
325
326
327
328int drm_dp_dpcd_read_link_status(struct drm_dp_aux *aux,
329 u8 status[DP_LINK_STATUS_SIZE])
330{
331 return drm_dp_dpcd_read(aux, DP_LANE0_1_STATUS, status,
332 DP_LINK_STATUS_SIZE);
333}
334EXPORT_SYMBOL(drm_dp_dpcd_read_link_status);
335
336
337
338
339
340
341
342
343
344
345
346
347int drm_dp_link_probe(struct drm_dp_aux *aux, struct drm_dp_link *link)
348{
349 u8 values[3];
350 int err;
351
352 memset(link, 0, sizeof(*link));
353
354 err = drm_dp_dpcd_read(aux, DP_DPCD_REV, values, sizeof(values));
355 if (err < 0)
356 return err;
357
358 link->revision = values[0];
359 link->rate = drm_dp_bw_code_to_link_rate(values[1]);
360 link->num_lanes = values[2] & DP_MAX_LANE_COUNT_MASK;
361
362 if (values[2] & DP_ENHANCED_FRAME_CAP)
363 link->capabilities |= DP_LINK_CAP_ENHANCED_FRAMING;
364
365 return 0;
366}
367EXPORT_SYMBOL(drm_dp_link_probe);
368
369
370
371
372
373
374
375
376int drm_dp_link_power_up(struct drm_dp_aux *aux, struct drm_dp_link *link)
377{
378 u8 value;
379 int err;
380
381
382 if (link->revision < 0x11)
383 return 0;
384
385 err = drm_dp_dpcd_readb(aux, DP_SET_POWER, &value);
386 if (err < 0)
387 return err;
388
389 value &= ~DP_SET_POWER_MASK;
390 value |= DP_SET_POWER_D0;
391
392 err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value);
393 if (err < 0)
394 return err;
395
396
397
398
399
400
401 usleep_range(1000, 2000);
402
403 return 0;
404}
405EXPORT_SYMBOL(drm_dp_link_power_up);
406
407
408
409
410
411
412
413
414int drm_dp_link_power_down(struct drm_dp_aux *aux, struct drm_dp_link *link)
415{
416 u8 value;
417 int err;
418
419
420 if (link->revision < 0x11)
421 return 0;
422
423 err = drm_dp_dpcd_readb(aux, DP_SET_POWER, &value);
424 if (err < 0)
425 return err;
426
427 value &= ~DP_SET_POWER_MASK;
428 value |= DP_SET_POWER_D3;
429
430 err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value);
431 if (err < 0)
432 return err;
433
434 return 0;
435}
436EXPORT_SYMBOL(drm_dp_link_power_down);
437
438
439
440
441
442
443
444
445int drm_dp_link_configure(struct drm_dp_aux *aux, struct drm_dp_link *link)
446{
447 u8 values[2];
448 int err;
449
450 values[0] = drm_dp_link_rate_to_bw_code(link->rate);
451 values[1] = link->num_lanes;
452
453 if (link->capabilities & DP_LINK_CAP_ENHANCED_FRAMING)
454 values[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
455
456 err = drm_dp_dpcd_write(aux, DP_LINK_BW_SET, values, sizeof(values));
457 if (err < 0)
458 return err;
459
460 return 0;
461}
462EXPORT_SYMBOL(drm_dp_link_configure);
463
464
465
466
467
468
469
470
471
472
473
474int drm_dp_downstream_max_clock(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
475 const u8 port_cap[4])
476{
477 int type = port_cap[0] & DP_DS_PORT_TYPE_MASK;
478 bool detailed_cap_info = dpcd[DP_DOWNSTREAMPORT_PRESENT] &
479 DP_DETAILED_CAP_INFO_AVAILABLE;
480
481 if (!detailed_cap_info)
482 return 0;
483
484 switch (type) {
485 case DP_DS_PORT_TYPE_VGA:
486 return port_cap[1] * 8 * 1000;
487 case DP_DS_PORT_TYPE_DVI:
488 case DP_DS_PORT_TYPE_HDMI:
489 case DP_DS_PORT_TYPE_DP_DUALMODE:
490 return port_cap[1] * 2500;
491 default:
492 return 0;
493 }
494}
495EXPORT_SYMBOL(drm_dp_downstream_max_clock);
496
497
498
499
500
501
502
503
504
505int drm_dp_downstream_max_bpc(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
506 const u8 port_cap[4])
507{
508 int type = port_cap[0] & DP_DS_PORT_TYPE_MASK;
509 bool detailed_cap_info = dpcd[DP_DOWNSTREAMPORT_PRESENT] &
510 DP_DETAILED_CAP_INFO_AVAILABLE;
511 int bpc;
512
513 if (!detailed_cap_info)
514 return 0;
515
516 switch (type) {
517 case DP_DS_PORT_TYPE_VGA:
518 case DP_DS_PORT_TYPE_DVI:
519 case DP_DS_PORT_TYPE_HDMI:
520 case DP_DS_PORT_TYPE_DP_DUALMODE:
521 bpc = port_cap[2] & DP_DS_MAX_BPC_MASK;
522
523 switch (bpc) {
524 case DP_DS_8BPC:
525 return 8;
526 case DP_DS_10BPC:
527 return 10;
528 case DP_DS_12BPC:
529 return 12;
530 case DP_DS_16BPC:
531 return 16;
532 }
533 default:
534 return 0;
535 }
536}
537EXPORT_SYMBOL(drm_dp_downstream_max_bpc);
538
539
540
541
542
543
544
545
546int drm_dp_downstream_id(struct drm_dp_aux *aux, char id[6])
547{
548 return drm_dp_dpcd_read(aux, DP_BRANCH_ID, id, 6);
549}
550EXPORT_SYMBOL(drm_dp_downstream_id);
551
552
553
554
555
556
557
558
559
560void drm_dp_downstream_debug(struct seq_file *m,
561 const u8 dpcd[DP_RECEIVER_CAP_SIZE],
562 const u8 port_cap[4], struct drm_dp_aux *aux)
563{
564 bool detailed_cap_info = dpcd[DP_DOWNSTREAMPORT_PRESENT] &
565 DP_DETAILED_CAP_INFO_AVAILABLE;
566 int clk;
567 int bpc;
568 char id[7];
569 int len;
570 uint8_t rev[2];
571 int type = port_cap[0] & DP_DS_PORT_TYPE_MASK;
572 bool branch_device = dpcd[DP_DOWNSTREAMPORT_PRESENT] &
573 DP_DWN_STRM_PORT_PRESENT;
574
575 seq_printf(m, "\tDP branch device present: %s\n",
576 branch_device ? "yes" : "no");
577
578 if (!branch_device)
579 return;
580
581 switch (type) {
582 case DP_DS_PORT_TYPE_DP:
583 seq_puts(m, "\t\tType: DisplayPort\n");
584 break;
585 case DP_DS_PORT_TYPE_VGA:
586 seq_puts(m, "\t\tType: VGA\n");
587 break;
588 case DP_DS_PORT_TYPE_DVI:
589 seq_puts(m, "\t\tType: DVI\n");
590 break;
591 case DP_DS_PORT_TYPE_HDMI:
592 seq_puts(m, "\t\tType: HDMI\n");
593 break;
594 case DP_DS_PORT_TYPE_NON_EDID:
595 seq_puts(m, "\t\tType: others without EDID support\n");
596 break;
597 case DP_DS_PORT_TYPE_DP_DUALMODE:
598 seq_puts(m, "\t\tType: DP++\n");
599 break;
600 case DP_DS_PORT_TYPE_WIRELESS:
601 seq_puts(m, "\t\tType: Wireless\n");
602 break;
603 default:
604 seq_puts(m, "\t\tType: N/A\n");
605 }
606
607 memset(id, 0, sizeof(id));
608 drm_dp_downstream_id(aux, id);
609 seq_printf(m, "\t\tID: %s\n", id);
610
611 len = drm_dp_dpcd_read(aux, DP_BRANCH_HW_REV, &rev[0], 1);
612 if (len > 0)
613 seq_printf(m, "\t\tHW: %d.%d\n",
614 (rev[0] & 0xf0) >> 4, rev[0] & 0xf);
615
616 len = drm_dp_dpcd_read(aux, DP_BRANCH_SW_REV, rev, 2);
617 if (len > 0)
618 seq_printf(m, "\t\tSW: %d.%d\n", rev[0], rev[1]);
619
620 if (detailed_cap_info) {
621 clk = drm_dp_downstream_max_clock(dpcd, port_cap);
622
623 if (clk > 0) {
624 if (type == DP_DS_PORT_TYPE_VGA)
625 seq_printf(m, "\t\tMax dot clock: %d kHz\n", clk);
626 else
627 seq_printf(m, "\t\tMax TMDS clock: %d kHz\n", clk);
628 }
629
630 bpc = drm_dp_downstream_max_bpc(dpcd, port_cap);
631
632 if (bpc > 0)
633 seq_printf(m, "\t\tMax bpc: %d\n", bpc);
634 }
635}
636EXPORT_SYMBOL(drm_dp_downstream_debug);
637
638
639
640
641
642static u32 drm_dp_i2c_functionality(struct i2c_adapter *adapter)
643{
644 return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
645 I2C_FUNC_SMBUS_READ_BLOCK_DATA |
646 I2C_FUNC_SMBUS_BLOCK_PROC_CALL |
647 I2C_FUNC_10BIT_ADDR;
648}
649
650static void drm_dp_i2c_msg_write_status_update(struct drm_dp_aux_msg *msg)
651{
652
653
654
655
656
657 if ((msg->request & ~DP_AUX_I2C_MOT) == DP_AUX_I2C_WRITE) {
658 msg->request &= DP_AUX_I2C_MOT;
659 msg->request |= DP_AUX_I2C_WRITE_STATUS_UPDATE;
660 }
661}
662
663#define AUX_PRECHARGE_LEN 10
664#define AUX_SYNC_LEN (16 + 4)
665#define AUX_STOP_LEN 4
666#define AUX_CMD_LEN 4
667#define AUX_ADDRESS_LEN 20
668#define AUX_REPLY_PAD_LEN 4
669#define AUX_LENGTH_LEN 8
670
671
672
673
674
675static int drm_dp_aux_req_duration(const struct drm_dp_aux_msg *msg)
676{
677 int len = AUX_PRECHARGE_LEN + AUX_SYNC_LEN + AUX_STOP_LEN +
678 AUX_CMD_LEN + AUX_ADDRESS_LEN + AUX_LENGTH_LEN;
679
680 if ((msg->request & DP_AUX_I2C_READ) == 0)
681 len += msg->size * 8;
682
683 return len;
684}
685
686static int drm_dp_aux_reply_duration(const struct drm_dp_aux_msg *msg)
687{
688 int len = AUX_PRECHARGE_LEN + AUX_SYNC_LEN + AUX_STOP_LEN +
689 AUX_CMD_LEN + AUX_REPLY_PAD_LEN;
690
691
692
693
694
695 if (msg->request & DP_AUX_I2C_READ)
696 len += msg->size * 8;
697
698 return len;
699}
700
701#define I2C_START_LEN 1
702#define I2C_STOP_LEN 1
703#define I2C_ADDR_LEN 9
704#define I2C_DATA_LEN 9
705
706
707
708
709
710
711
712
713
714static int drm_dp_i2c_msg_duration(const struct drm_dp_aux_msg *msg,
715 int i2c_speed_khz)
716{
717
718 return DIV_ROUND_UP((I2C_START_LEN + I2C_ADDR_LEN +
719 msg->size * I2C_DATA_LEN +
720 I2C_STOP_LEN) * 1000, i2c_speed_khz);
721}
722
723
724
725
726
727
728static int drm_dp_i2c_retry_count(const struct drm_dp_aux_msg *msg,
729 int i2c_speed_khz)
730{
731 int aux_time_us = drm_dp_aux_req_duration(msg) +
732 drm_dp_aux_reply_duration(msg);
733 int i2c_time_us = drm_dp_i2c_msg_duration(msg, i2c_speed_khz);
734
735 return DIV_ROUND_UP(i2c_time_us, aux_time_us + AUX_RETRY_INTERVAL);
736}
737
738
739
740
741
742static int dp_aux_i2c_speed_khz __read_mostly = 10;
743module_param_unsafe(dp_aux_i2c_speed_khz, int, 0644);
744MODULE_PARM_DESC(dp_aux_i2c_speed_khz,
745 "Assumed speed of the i2c bus in kHz, (1-400, default 10)");
746
747
748
749
750
751
752
753
754
755static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
756{
757 unsigned int retry, defer_i2c;
758 int ret;
759
760
761
762
763
764
765
766 int max_retries = max(7, drm_dp_i2c_retry_count(msg, dp_aux_i2c_speed_khz));
767
768 for (retry = 0, defer_i2c = 0; retry < (max_retries + defer_i2c); retry++) {
769 ret = aux->transfer(aux, msg);
770 if (ret < 0) {
771 if (ret == -EBUSY)
772 continue;
773
774
775
776
777
778
779
780 if (ret == -ETIMEDOUT)
781 DRM_DEBUG_KMS_RATELIMITED("transaction timed out\n");
782 else
783 DRM_DEBUG_KMS("transaction failed: %d\n", ret);
784
785 return ret;
786 }
787
788
789 switch (msg->reply & DP_AUX_NATIVE_REPLY_MASK) {
790 case DP_AUX_NATIVE_REPLY_ACK:
791
792
793
794
795 break;
796
797 case DP_AUX_NATIVE_REPLY_NACK:
798 DRM_DEBUG_KMS("native nack (result=%d, size=%zu)\n", ret, msg->size);
799 return -EREMOTEIO;
800
801 case DP_AUX_NATIVE_REPLY_DEFER:
802 DRM_DEBUG_KMS("native defer\n");
803
804
805
806
807
808
809
810
811
812 usleep_range(AUX_RETRY_INTERVAL, AUX_RETRY_INTERVAL + 100);
813 continue;
814
815 default:
816 DRM_ERROR("invalid native reply %#04x\n", msg->reply);
817 return -EREMOTEIO;
818 }
819
820 switch (msg->reply & DP_AUX_I2C_REPLY_MASK) {
821 case DP_AUX_I2C_REPLY_ACK:
822
823
824
825
826 if (ret != msg->size)
827 drm_dp_i2c_msg_write_status_update(msg);
828 return ret;
829
830 case DP_AUX_I2C_REPLY_NACK:
831 DRM_DEBUG_KMS("I2C nack (result=%d, size=%zu\n", ret, msg->size);
832 aux->i2c_nack_count++;
833 return -EREMOTEIO;
834
835 case DP_AUX_I2C_REPLY_DEFER:
836 DRM_DEBUG_KMS("I2C defer\n");
837
838
839
840
841 aux->i2c_defer_count++;
842 if (defer_i2c < 7)
843 defer_i2c++;
844 usleep_range(AUX_RETRY_INTERVAL, AUX_RETRY_INTERVAL + 100);
845 drm_dp_i2c_msg_write_status_update(msg);
846
847 continue;
848
849 default:
850 DRM_ERROR("invalid I2C reply %#04x\n", msg->reply);
851 return -EREMOTEIO;
852 }
853 }
854
855 DRM_DEBUG_KMS("too many retries, giving up\n");
856 return -EREMOTEIO;
857}
858
859static void drm_dp_i2c_msg_set_request(struct drm_dp_aux_msg *msg,
860 const struct i2c_msg *i2c_msg)
861{
862 msg->request = (i2c_msg->flags & I2C_M_RD) ?
863 DP_AUX_I2C_READ : DP_AUX_I2C_WRITE;
864 msg->request |= DP_AUX_I2C_MOT;
865}
866
867
868
869
870
871
872static int drm_dp_i2c_drain_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *orig_msg)
873{
874 int err, ret = orig_msg->size;
875 struct drm_dp_aux_msg msg = *orig_msg;
876
877 while (msg.size > 0) {
878 err = drm_dp_i2c_do_msg(aux, &msg);
879 if (err <= 0)
880 return err == 0 ? -EPROTO : err;
881
882 if (err < msg.size && err < ret) {
883 DRM_DEBUG_KMS("Partial I2C reply: requested %zu bytes got %d bytes\n",
884 msg.size, err);
885 ret = err;
886 }
887
888 msg.size -= err;
889 msg.buffer += err;
890 }
891
892 return ret;
893}
894
895
896
897
898
899
900static int dp_aux_i2c_transfer_size __read_mostly = DP_AUX_MAX_PAYLOAD_BYTES;
901module_param_unsafe(dp_aux_i2c_transfer_size, int, 0644);
902MODULE_PARM_DESC(dp_aux_i2c_transfer_size,
903 "Number of bytes to transfer in a single I2C over DP AUX CH message, (1-16, default 16)");
904
905static int drm_dp_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs,
906 int num)
907{
908 struct drm_dp_aux *aux = adapter->algo_data;
909 unsigned int i, j;
910 unsigned transfer_size;
911 struct drm_dp_aux_msg msg;
912 int err = 0;
913
914 dp_aux_i2c_transfer_size = clamp(dp_aux_i2c_transfer_size, 1, DP_AUX_MAX_PAYLOAD_BYTES);
915
916 memset(&msg, 0, sizeof(msg));
917
918 for (i = 0; i < num; i++) {
919 msg.address = msgs[i].addr;
920 drm_dp_i2c_msg_set_request(&msg, &msgs[i]);
921
922
923
924
925 msg.buffer = NULL;
926 msg.size = 0;
927 err = drm_dp_i2c_do_msg(aux, &msg);
928
929
930
931
932
933 drm_dp_i2c_msg_set_request(&msg, &msgs[i]);
934
935 if (err < 0)
936 break;
937
938
939
940
941 transfer_size = dp_aux_i2c_transfer_size;
942 for (j = 0; j < msgs[i].len; j += msg.size) {
943 msg.buffer = msgs[i].buf + j;
944 msg.size = min(transfer_size, msgs[i].len - j);
945
946 err = drm_dp_i2c_drain_msg(aux, &msg);
947
948
949
950
951
952 drm_dp_i2c_msg_set_request(&msg, &msgs[i]);
953
954 if (err < 0)
955 break;
956 transfer_size = err;
957 }
958 if (err < 0)
959 break;
960 }
961 if (err >= 0)
962 err = num;
963
964
965
966
967 msg.request &= ~DP_AUX_I2C_MOT;
968 msg.buffer = NULL;
969 msg.size = 0;
970 (void)drm_dp_i2c_do_msg(aux, &msg);
971
972 return err;
973}
974
975static const struct i2c_algorithm drm_dp_i2c_algo = {
976 .functionality = drm_dp_i2c_functionality,
977 .master_xfer = drm_dp_i2c_xfer,
978};
979
980static struct drm_dp_aux *i2c_to_aux(struct i2c_adapter *i2c)
981{
982 return container_of(i2c, struct drm_dp_aux, ddc);
983}
984
985static void lock_bus(struct i2c_adapter *i2c, unsigned int flags)
986{
987 mutex_lock(&i2c_to_aux(i2c)->hw_mutex);
988}
989
990static int trylock_bus(struct i2c_adapter *i2c, unsigned int flags)
991{
992 return mutex_trylock(&i2c_to_aux(i2c)->hw_mutex);
993}
994
995static void unlock_bus(struct i2c_adapter *i2c, unsigned int flags)
996{
997 mutex_unlock(&i2c_to_aux(i2c)->hw_mutex);
998}
999
1000static const struct i2c_lock_operations drm_dp_i2c_lock_ops = {
1001 .lock_bus = lock_bus,
1002 .trylock_bus = trylock_bus,
1003 .unlock_bus = unlock_bus,
1004};
1005
1006static int drm_dp_aux_get_crc(struct drm_dp_aux *aux, u8 *crc)
1007{
1008 u8 buf, count;
1009 int ret;
1010
1011 ret = drm_dp_dpcd_readb(aux, DP_TEST_SINK, &buf);
1012 if (ret < 0)
1013 return ret;
1014
1015 WARN_ON(!(buf & DP_TEST_SINK_START));
1016
1017 ret = drm_dp_dpcd_readb(aux, DP_TEST_SINK_MISC, &buf);
1018 if (ret < 0)
1019 return ret;
1020
1021 count = buf & DP_TEST_COUNT_MASK;
1022 if (count == aux->crc_count)
1023 return -EAGAIN;
1024
1025 aux->crc_count = count;
1026
1027
1028
1029
1030
1031 ret = drm_dp_dpcd_read(aux, DP_TEST_CRC_R_CR, crc, 6);
1032 if (ret < 0)
1033 return ret;
1034
1035 return 0;
1036}
1037
1038static void drm_dp_aux_crc_work(struct work_struct *work)
1039{
1040 struct drm_dp_aux *aux = container_of(work, struct drm_dp_aux,
1041 crc_work);
1042 struct drm_crtc *crtc;
1043 u8 crc_bytes[6];
1044 uint32_t crcs[3];
1045 int ret;
1046
1047 if (WARN_ON(!aux->crtc))
1048 return;
1049
1050 crtc = aux->crtc;
1051 while (crtc->crc.opened) {
1052 drm_crtc_wait_one_vblank(crtc);
1053 if (!crtc->crc.opened)
1054 break;
1055
1056 ret = drm_dp_aux_get_crc(aux, crc_bytes);
1057 if (ret == -EAGAIN) {
1058 usleep_range(1000, 2000);
1059 ret = drm_dp_aux_get_crc(aux, crc_bytes);
1060 }
1061
1062 if (ret == -EAGAIN) {
1063 DRM_DEBUG_KMS("Get CRC failed after retrying: %d\n",
1064 ret);
1065 continue;
1066 } else if (ret) {
1067 DRM_DEBUG_KMS("Failed to get a CRC: %d\n", ret);
1068 continue;
1069 }
1070
1071 crcs[0] = crc_bytes[0] | crc_bytes[1] << 8;
1072 crcs[1] = crc_bytes[2] | crc_bytes[3] << 8;
1073 crcs[2] = crc_bytes[4] | crc_bytes[5] << 8;
1074 drm_crtc_add_crc_entry(crtc, false, 0, crcs);
1075 }
1076}
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087void drm_dp_aux_init(struct drm_dp_aux *aux)
1088{
1089 mutex_init(&aux->hw_mutex);
1090 INIT_WORK(&aux->crc_work, drm_dp_aux_crc_work);
1091
1092 aux->ddc.algo = &drm_dp_i2c_algo;
1093 aux->ddc.algo_data = aux;
1094 aux->ddc.retries = 3;
1095
1096 aux->ddc.lock_ops = &drm_dp_i2c_lock_ops;
1097}
1098EXPORT_SYMBOL(drm_dp_aux_init);
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108int drm_dp_aux_register(struct drm_dp_aux *aux)
1109{
1110 int ret;
1111
1112 if (!aux->ddc.algo)
1113 drm_dp_aux_init(aux);
1114
1115 aux->ddc.class = I2C_CLASS_DDC;
1116 aux->ddc.owner = THIS_MODULE;
1117 aux->ddc.dev.parent = aux->dev;
1118
1119 strlcpy(aux->ddc.name, aux->name ? aux->name : dev_name(aux->dev),
1120 sizeof(aux->ddc.name));
1121
1122 ret = drm_dp_aux_register_devnode(aux);
1123 if (ret)
1124 return ret;
1125
1126 ret = i2c_add_adapter(&aux->ddc);
1127 if (ret) {
1128 drm_dp_aux_unregister_devnode(aux);
1129 return ret;
1130 }
1131
1132 return 0;
1133}
1134EXPORT_SYMBOL(drm_dp_aux_register);
1135
1136
1137
1138
1139
1140void drm_dp_aux_unregister(struct drm_dp_aux *aux)
1141{
1142 drm_dp_aux_unregister_devnode(aux);
1143 i2c_del_adapter(&aux->ddc);
1144}
1145EXPORT_SYMBOL(drm_dp_aux_unregister);
1146
1147#define PSR_SETUP_TIME(x) [DP_PSR_SETUP_TIME_ ## x >> DP_PSR_SETUP_TIME_SHIFT] = (x)
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157int drm_dp_psr_setup_time(const u8 psr_cap[EDP_PSR_RECEIVER_CAP_SIZE])
1158{
1159 static const u16 psr_setup_time_us[] = {
1160 PSR_SETUP_TIME(330),
1161 PSR_SETUP_TIME(275),
1162 PSR_SETUP_TIME(220),
1163 PSR_SETUP_TIME(165),
1164 PSR_SETUP_TIME(110),
1165 PSR_SETUP_TIME(55),
1166 PSR_SETUP_TIME(0),
1167 };
1168 int i;
1169
1170 i = (psr_cap[1] & DP_PSR_SETUP_TIME_MASK) >> DP_PSR_SETUP_TIME_SHIFT;
1171 if (i >= ARRAY_SIZE(psr_setup_time_us))
1172 return -EINVAL;
1173
1174 return psr_setup_time_us[i];
1175}
1176EXPORT_SYMBOL(drm_dp_psr_setup_time);
1177
1178#undef PSR_SETUP_TIME
1179
1180
1181
1182
1183
1184
1185
1186
1187int drm_dp_start_crc(struct drm_dp_aux *aux, struct drm_crtc *crtc)
1188{
1189 u8 buf;
1190 int ret;
1191
1192 ret = drm_dp_dpcd_readb(aux, DP_TEST_SINK, &buf);
1193 if (ret < 0)
1194 return ret;
1195
1196 ret = drm_dp_dpcd_writeb(aux, DP_TEST_SINK, buf | DP_TEST_SINK_START);
1197 if (ret < 0)
1198 return ret;
1199
1200 aux->crc_count = 0;
1201 aux->crtc = crtc;
1202 schedule_work(&aux->crc_work);
1203
1204 return 0;
1205}
1206EXPORT_SYMBOL(drm_dp_start_crc);
1207
1208
1209
1210
1211
1212
1213
1214int drm_dp_stop_crc(struct drm_dp_aux *aux)
1215{
1216 u8 buf;
1217 int ret;
1218
1219 ret = drm_dp_dpcd_readb(aux, DP_TEST_SINK, &buf);
1220 if (ret < 0)
1221 return ret;
1222
1223 ret = drm_dp_dpcd_writeb(aux, DP_TEST_SINK, buf & ~DP_TEST_SINK_START);
1224 if (ret < 0)
1225 return ret;
1226
1227 flush_work(&aux->crc_work);
1228 aux->crtc = NULL;
1229
1230 return 0;
1231}
1232EXPORT_SYMBOL(drm_dp_stop_crc);
1233
1234struct dpcd_quirk {
1235 u8 oui[3];
1236 bool is_branch;
1237 u32 quirks;
1238};
1239
1240#define OUI(first, second, third) { (first), (second), (third) }
1241
1242static const struct dpcd_quirk dpcd_quirk_list[] = {
1243
1244 { OUI(0x00, 0x22, 0xb9), true, BIT(DP_DPCD_QUIRK_LIMITED_M_N) },
1245};
1246
1247#undef OUI
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257static u32
1258drm_dp_get_quirks(const struct drm_dp_dpcd_ident *ident, bool is_branch)
1259{
1260 const struct dpcd_quirk *quirk;
1261 u32 quirks = 0;
1262 int i;
1263
1264 for (i = 0; i < ARRAY_SIZE(dpcd_quirk_list); i++) {
1265 quirk = &dpcd_quirk_list[i];
1266
1267 if (quirk->is_branch != is_branch)
1268 continue;
1269
1270 if (memcmp(quirk->oui, ident->oui, sizeof(ident->oui)) != 0)
1271 continue;
1272
1273 quirks |= quirk->quirks;
1274 }
1275
1276 return quirks;
1277}
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290int drm_dp_read_desc(struct drm_dp_aux *aux, struct drm_dp_desc *desc,
1291 bool is_branch)
1292{
1293 struct drm_dp_dpcd_ident *ident = &desc->ident;
1294 unsigned int offset = is_branch ? DP_BRANCH_OUI : DP_SINK_OUI;
1295 int ret, dev_id_len;
1296
1297 ret = drm_dp_dpcd_read(aux, offset, ident, sizeof(*ident));
1298 if (ret < 0)
1299 return ret;
1300
1301 desc->quirks = drm_dp_get_quirks(ident, is_branch);
1302
1303 dev_id_len = strnlen(ident->device_id, sizeof(ident->device_id));
1304
1305 DRM_DEBUG_KMS("DP %s: OUI %*phD dev-ID %*pE HW-rev %d.%d SW-rev %d.%d quirks 0x%04x\n",
1306 is_branch ? "branch" : "sink",
1307 (int)sizeof(ident->oui), ident->oui,
1308 dev_id_len, ident->device_id,
1309 ident->hw_rev >> 4, ident->hw_rev & 0xf,
1310 ident->sw_major_rev, ident->sw_minor_rev,
1311 desc->quirks);
1312
1313 return 0;
1314}
1315EXPORT_SYMBOL(drm_dp_read_desc);
1316