-
Notifications
You must be signed in to change notification settings - Fork 89
Expand file tree
/
Copy pathusb_pd.h
More file actions
3112 lines (2749 loc) · 92.8 KB
/
usb_pd.h
File metadata and controls
3112 lines (2749 loc) · 92.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/* Copyright 2014 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/* USB Power delivery module */
#ifndef __CROS_EC_USB_PD_H
#define __CROS_EC_USB_PD_H
#include <stdbool.h>
#include <stdint.h>
#include "common.h"
#include "ec_commands.h"
#include "usb_pd_tbt.h"
#include "usb_pd_tcpm.h"
#include "usb_pd_vdo.h"
/* PD Host command timeout */
#define PD_HOST_COMMAND_TIMEOUT_US SECOND
/*
* Define PD_PORT_TO_TASK_ID() and TASK_ID_TO_PD_PORT() macros to
* go between PD port number and task ID. Assume that TASK_ID_PD_C0 is the
* lowest task ID and IDs are on a continuous range.
*/
#if defined(HAS_TASK_PD_C0) && defined(CONFIG_USB_PD_PORT_MAX_COUNT)
#define PD_PORT_TO_TASK_ID(port) (TASK_ID_PD_C0 + (port))
#define TASK_ID_TO_PD_PORT(id) ((id) - TASK_ID_PD_C0)
#else
#define PD_PORT_TO_TASK_ID(port) -1 /* stub task ID */
#define TASK_ID_TO_PD_PORT(id) 0
#endif /* CONFIG_USB_PD_PORT_MAX_COUNT && HAS_TASK_PD_C0 */
enum pd_rx_errors {
PD_RX_ERR_INVAL = -1, /* Invalid packet */
PD_RX_ERR_HARD_RESET = -2, /* Got a Hard-Reset packet */
PD_RX_ERR_CRC = -3, /* CRC mismatch */
PD_RX_ERR_ID = -4, /* Invalid ID number */
PD_RX_ERR_UNSUPPORTED_SOP = -5, /* Unsupported SOP */
PD_RX_ERR_CABLE_RESET = -6 /* Got a Cable-Reset packet */
};
/* Events for USB PD task */
/* Outgoing packet event */
#define PD_EVENT_TX TASK_EVENT_CUSTOM_BIT(3)
/* CC line change event */
#define PD_EVENT_CC TASK_EVENT_CUSTOM_BIT(4)
/* TCPC has reset */
#define PD_EVENT_TCPC_RESET TASK_EVENT_CUSTOM_BIT(5)
/* DRP state has changed */
#define PD_EVENT_UPDATE_DUAL_ROLE TASK_EVENT_CUSTOM_BIT(6)
/*
* A task, other than the task owning the PD port, accessed the TCPC. The task
* that owns the port does not send itself this event.
*/
#define PD_EVENT_DEVICE_ACCESSED TASK_EVENT_CUSTOM_BIT(7)
/* Chipset power state changed */
#define PD_EVENT_POWER_STATE_CHANGE TASK_EVENT_CUSTOM_BIT(8)
/* Issue a Hard Reset. */
#define PD_EVENT_SEND_HARD_RESET TASK_EVENT_CUSTOM_BIT(9)
/* Prepare for sysjump */
#define PD_EVENT_SYSJUMP TASK_EVENT_CUSTOM_BIT(10)
/* Receive a Hard Reset. */
#define PD_EVENT_RX_HARD_RESET TASK_EVENT_CUSTOM_BIT(11)
/* First free event on PD task */
#define PD_EVENT_FIRST_FREE_BIT 12
/* Ensure TCPC is out of low power mode before handling these events. */
#define PD_EXIT_LOW_POWER_EVENT_MASK \
(PD_EVENT_CC | \
PD_EVENT_UPDATE_DUAL_ROLE | \
PD_EVENT_POWER_STATE_CHANGE | \
PD_EVENT_TCPC_RESET)
/* --- PD data message helpers --- */
#define PDO_MAX_OBJECTS 7
#define PDO_MODES (PDO_MAX_OBJECTS - 1)
/* PDO : Power Data Object */
/*
* 1. The vSafe5V Fixed Supply Object shall always be the first object.
* 2. The remaining Fixed Supply Objects,
* if present, shall be sent in voltage order; lowest to highest.
* 3. The Battery Supply Objects,
* if present shall be sent in Minimum Voltage order; lowest to highest.
* 4. The Variable Supply (non battery) Objects,
* if present, shall be sent in Minimum Voltage order; lowest to highest.
* 5. (PD3.0) The Augmented PDO is defined to allow extension beyond the 4 PDOs
* above by examining bits <29:28> to determine the additional PDO function.
*/
#define PDO_TYPE_FIXED (0 << 30)
#define PDO_TYPE_BATTERY BIT(30)
#define PDO_TYPE_VARIABLE (2 << 30)
#define PDO_TYPE_AUGMENTED (3 << 30)
#define PDO_TYPE_MASK (3 << 30)
#define PDO_FIXED_DUAL_ROLE BIT(29) /* Dual role device */
#define PDO_FIXED_SUSPEND BIT(28) /* USB Suspend supported */
#define PDO_FIXED_UNCONSTRAINED BIT(27) /* Unconstrained Power */
#define PDO_FIXED_COMM_CAP BIT(26) /* USB Communications Capable */
#define PDO_FIXED_DATA_SWAP BIT(25) /* Data role swap command supported */
#define PDO_FIXED_FRS_CURR_MASK (3 << 23) /* [23..24] FRS current */
#define PDO_FIXED_FRS_CURR_NOT_SUPPORTED (0 << 23)
#define PDO_FIXED_FRS_CURR_DFLT_USB_POWER (1 << 23)
#define PDO_FIXED_FRS_CURR_1A5_AT_5V (2 << 23)
#define PDO_FIXED_FRS_CURR_3A0_AT_5V (3 << 23)
#define PDO_FIXED_PEAK_CURR () /* [21..20] Peak current */
#define PDO_FIXED_VOLT(mv) (((mv)/50) << 10) /* Voltage in 50mV units */
#define PDO_FIXED_CURR(ma) (((ma)/10) << 0) /* Max current in 10mA units */
#define PDO_FIXED(mv, ma, flags) (PDO_FIXED_VOLT(mv) |\
PDO_FIXED_CURR(ma) | (flags))
#define PDO_VAR_MAX_VOLT(mv) ((((mv) / 50) & 0x3FF) << 20)
#define PDO_VAR_MIN_VOLT(mv) ((((mv) / 50) & 0x3FF) << 10)
#define PDO_VAR_OP_CURR(ma) ((((ma) / 10) & 0x3FF) << 0)
#define PDO_VAR(min_mv, max_mv, op_ma) \
(PDO_VAR_MIN_VOLT(min_mv) | \
PDO_VAR_MAX_VOLT(max_mv) | \
PDO_VAR_OP_CURR(op_ma) | \
PDO_TYPE_VARIABLE)
#define PDO_BATT_MAX_VOLT(mv) ((((mv) / 50) & 0x3FF) << 20)
#define PDO_BATT_MIN_VOLT(mv) ((((mv) / 50) & 0x3FF) << 10)
#define PDO_BATT_OP_POWER(mw) ((((mw) / 250) & 0x3FF) << 0)
#define PDO_BATT(min_mv, max_mv, op_mw) \
(PDO_BATT_MIN_VOLT(min_mv) | \
PDO_BATT_MAX_VOLT(max_mv) | \
PDO_BATT_OP_POWER(op_mw) | \
PDO_TYPE_BATTERY)
/* RDO : Request Data Object */
#define RDO_OBJ_POS(n) (((n) & 0x7) << 28)
#define RDO_POS(rdo) (((rdo) >> 28) & 0x7)
#define RDO_GIVE_BACK BIT(27)
#define RDO_CAP_MISMATCH BIT(26)
#define RDO_COMM_CAP BIT(25)
#define RDO_NO_SUSPEND BIT(24)
#define RDO_FIXED_VAR_OP_CURR(ma) ((((ma) / 10) & 0x3FF) << 10)
#define RDO_FIXED_VAR_MAX_CURR(ma) ((((ma) / 10) & 0x3FF) << 0)
#define RDO_BATT_OP_POWER(mw) ((((mw) / 250) & 0x3FF) << 10)
#define RDO_BATT_MAX_POWER(mw) ((((mw) / 250) & 0x3FF) << 10)
#define RDO_FIXED(n, op_ma, max_ma, flags) \
(RDO_OBJ_POS(n) | (flags) | \
RDO_FIXED_VAR_OP_CURR(op_ma) | \
RDO_FIXED_VAR_MAX_CURR(max_ma))
#define RDO_BATT(n, op_mw, max_mw, flags) \
(RDO_OBJ_POS(n) | (flags) | \
RDO_BATT_OP_POWER(op_mw) | \
RDO_BATT_MAX_POWER(max_mw))
/* BDO : BIST Data Object */
#define BDO_MODE_RECV (0 << 28)
#define BDO_MODE_TRANSMIT BIT(28)
#define BDO_MODE_COUNTERS (2 << 28)
#define BDO_MODE_CARRIER0 (3 << 28)
#define BDO_MODE_CARRIER1 (4 << 28)
#define BDO_MODE_CARRIER2 (5 << 28)
#define BDO_MODE_CARRIER3 (6 << 28)
#define BDO_MODE_EYE (7 << 28)
#define BDO(mode, cnt) ((mode) | ((cnt) & 0xFFFF))
#define BIST_MODE(n) ((n) >> 28)
#define BIST_ERROR_COUNTER(n) ((n) & 0xffff)
#define BIST_RECEIVER_MODE 0
#define BIST_TRANSMIT_MODE 1
#define BIST_RETURNED_COUNTER 2
#define BIST_CARRIER_MODE_0 3
#define BIST_CARRIER_MODE_1 4
#define BIST_CARRIER_MODE_2 5
#define BIST_CARRIER_MODE_3 6
#define BIST_EYE_PATTERN 7
#define BIST_TEST_DATA 8
#define SVID_DISCOVERY_MAX 16
/* Timers */
#define PD_T_SINK_TX (18*MSEC) /* between 16ms and 20 */
#define PD_T_CHUNKING_NOT_SUPPORTED (45*MSEC) /* between 40ms and 50ms */
#define PD_T_CHUNK_SENDER_RSP (24*MSEC) /* between 24ms and 30ms */
#define PD_T_CHUNK_SENDER_REQ (24*MSEC) /* between 24ms and 30ms */
#define PD_T_HARD_RESET_COMPLETE (5*MSEC) /* between 4ms and 5ms*/
#define PD_T_HARD_RESET_RETRY (1*MSEC) /* 1ms */
#define PD_T_SEND_SOURCE_CAP (100*MSEC) /* between 100ms and 200ms */
#define PD_T_SINK_WAIT_CAP (600*MSEC) /* between 310ms and 620ms */
#define PD_T_SINK_TRANSITION (35*MSEC) /* between 20ms and 35ms */
#define PD_T_SOURCE_ACTIVITY (45*MSEC) /* between 40ms and 50ms */
#define PD_T_SENDER_RESPONSE (30*MSEC) /* between 24ms and 30ms */
#define PD_T_PS_TRANSITION (500*MSEC) /* between 450ms and 550ms */
#define PD_T_PS_SOURCE_ON (480*MSEC) /* between 390ms and 480ms */
#define PD_T_PS_SOURCE_OFF (920*MSEC) /* between 750ms and 920ms */
#define PD_T_PS_HARD_RESET (25*MSEC) /* between 25ms and 35ms */
#define PD_T_ERROR_RECOVERY (240*MSEC) /* min 240ms if sourcing VConn */
#define PD_T_CC_DEBOUNCE (100*MSEC) /* between 100ms and 200ms */
/* DRP_SNK + DRP_SRC must be between 50ms and 100ms with 30%-70% duty cycle */
#define PD_T_DRP_SNK (40*MSEC) /* toggle time for sink DRP */
#define PD_T_DRP_SRC (30*MSEC) /* toggle time for source DRP */
#define PD_T_DEBOUNCE (15*MSEC) /* between 10ms and 20ms */
#define PD_T_TRY_CC_DEBOUNCE (15*MSEC) /* between 10ms and 20ms */
#define PD_T_SINK_ADJ (55*MSEC) /* between tPDDebounce and 60ms */
#define PD_T_SRC_RECOVER (760*MSEC) /* between 660ms and 1000ms */
#define PD_T_SRC_RECOVER_MAX (1000*MSEC) /* 1000ms */
#define PD_T_SRC_TURN_ON (275*MSEC) /* 275ms */
#define PD_T_SAFE_0V (650*MSEC) /* 650ms */
#define PD_T_NO_RESPONSE (5500*MSEC) /* between 4.5s and 5.5s */
#define PD_T_BIST_TRANSMIT (50*MSEC) /* 50ms (for task_wait arg) */
#define PD_T_BIST_RECEIVE (60*MSEC) /* 60ms (time to process bist) */
#define PD_T_BIST_CONT_MODE (60*MSEC) /* 30ms to 60ms */
#define PD_T_VCONN_SOURCE_ON (100*MSEC) /* 100ms */
#define PD_T_DRP_TRY (125*MSEC) /* between 75ms and 150ms */
#define PD_T_TRY_TIMEOUT (550*MSEC) /* between 550ms and 1100ms */
#define PD_T_TRY_WAIT (600*MSEC) /* Wait time for TryWait.SNK */
#define PD_T_SINK_REQUEST (100*MSEC) /* 100ms before next request */
#define PD_T_PD_DEBOUNCE (15*MSEC) /* between 10ms and 20ms */
#define PD_T_CHUNK_SENDER_RESPONSE (25*MSEC) /* 25ms */
#define PD_T_CHUNK_SENDER_REQUEST (25*MSEC) /* 25ms */
#define PD_T_SWAP_SOURCE_START (25*MSEC) /* Min of 20ms */
#define PD_T_RP_VALUE_CHANGE (20*MSEC) /* 20ms */
#define PD_T_SRC_DISCONNECT (15*MSEC) /* 15ms */
#define PD_T_VCONN_STABLE (50*MSEC) /* 50ms */
#define PD_T_DISCOVER_IDENTITY (45*MSEC) /* between 40ms and 50ms */
#define PD_T_SYSJUMP (1000*MSEC) /* 1s */
#define PD_T_PR_SWAP_WAIT (100*MSEC) /* tPRSwapWait 100ms */
/* number of edges and time window to detect CC line is not idle */
#define PD_RX_TRANSITION_COUNT 3
#define PD_RX_TRANSITION_WINDOW 20 /* between 12us and 20us */
/* from USB Type-C Specification Table 5-1 */
#define PD_T_AME (1*SECOND) /* timeout from UFP attach to Alt Mode Entry */
/* VDM Timers ( USB PD Spec Rev2.0 Table 6-30 )*/
#define PD_T_VDM_BUSY (50*MSEC) /* at least 50ms */
#define PD_T_VDM_E_MODE (25*MSEC) /* enter/exit the same max */
#define PD_T_VDM_RCVR_RSP (15*MSEC) /* max of 15ms */
#define PD_T_VDM_SNDR_RSP (30*MSEC) /* max of 30ms */
#define PD_T_VDM_WAIT_MODE_E (100*MSEC) /* enter/exit the same max */
/* CTVPD Timers ( USB Type-C ECN Table 4-27 ) */
#define PD_T_VPDDETACH (20*MSEC) /* max of 20*MSEC */
#define PD_T_VPDCTDD (4*MSEC) /* max of 4ms */
#define PD_T_VPDDISABLE (25*MSEC) /* min of 25ms */
/* Voltage thresholds in mV (Table 7-24, PD 3.0 Version 2.0 Spec) */
#define PD_V_SAFE0V_MAX 800
#define PD_V_SAFE5V_MIN 4750
/* USB Type-C voltages in mV (Table 4-3, USB Type-C Release 2.0 Spec) */
#define PD_V_SINK_DISCONNECT_MAX 3670
/* TODO(b/149530538): Add equation for vSinkDisconnectPD */
/* function table for entered mode */
struct amode_fx {
int (*status)(int port, uint32_t *payload);
int (*config)(int port, uint32_t *payload);
};
/* function table for alternate mode capable responders */
struct svdm_response {
/**
* Gets VDM response messages
*
* @param port USB-C Port number
* @param payload buffer used to pass input data and store output data
* @return number of data objects in payload; <0 means BUSY;
* =0 means NAK.
*/
int (*identity)(int port, uint32_t *payload);
int (*svids)(int port, uint32_t *payload);
int (*modes)(int port, uint32_t *payload);
int (*enter_mode)(int port, uint32_t *payload);
int (*exit_mode)(int port, uint32_t *payload);
struct amode_fx *amode;
};
/*
* State of discovery
*
* Note: Discovery needed must be 0 to meet expectations that it be the default
* value after resetting connection information via memset.
*/
enum pd_discovery_state {
PD_DISC_NEEDED = 0, /* Cable or partner still needs to be probed */
PD_DISC_COMPLETE, /* Successfully probed, valid to read VDO */
PD_DISC_FAIL, /* Cable did not respond, or Discover* NAK */
};
/* Mode discovery state for a particular SVID with a particular transmit type */
struct svid_mode_data {
/* The SVID for which modes are discovered */
uint16_t svid;
/* The number of modes discovered for this SVID */
int mode_cnt;
/* The discovered mode VDOs */
uint32_t mode_vdo[PDO_MODES];
/* State of mode discovery for this SVID */
enum pd_discovery_state discovery;
};
struct svdm_amode_fx {
uint16_t svid;
int (*enter)(int port, uint32_t mode_caps);
int (*status)(int port, uint32_t *payload);
int (*config)(int port, uint32_t *payload);
void (*post_config)(int port);
int (*attention)(int port, uint32_t *payload);
void (*exit)(int port);
};
/* defined in <board>/usb_pd_policy.c */
/* All UFP_U should have */
extern const struct svdm_response svdm_rsp;
/* All DFP_U should have */
extern const struct svdm_amode_fx supported_modes[];
extern const int supported_modes_cnt;
/* 4 entry rw_hash table of type-C devices that AP has firmware updates for. */
#ifdef CONFIG_COMMON_RUNTIME
#define RW_HASH_ENTRIES 4
extern struct ec_params_usb_pd_rw_hash_entry rw_hash_table[RW_HASH_ENTRIES];
#endif /* CONFIG_COMMON_RUNTIME */
/*
* defined in common/usb_common.c
* This variable is used in a couple of overridable functions
* in usb_common code. If the routines are overridden then
* this variable should be the same as that used in the common
* code.
*/
extern uint64_t svdm_hpd_deadline[];
/* DFP data needed to support alternate mode entry and exit */
struct svdm_amode_data {
const struct svdm_amode_fx *fx;
/* VDM object position */
int opos;
/* mode capabilities specific to SVID amode. */
struct svid_mode_data *data;
};
enum hpd_event {
hpd_none,
hpd_low,
hpd_high,
hpd_irq,
};
/* DisplayPort flags */
#define DP_FLAGS_DP_ON BIT(0) /* Display port mode is on */
#define DP_FLAGS_HPD_HI_PENDING BIT(1) /* Pending HPD_HI */
/* Discover Identity ACK contents after headers */
union disc_ident_ack {
struct {
struct id_header_vdo_rev20 idh;
struct cert_stat_vdo cert;
struct product_vdo product;
union product_type_vdo1 product_t1;
union product_type_vdo2 product_t2;
uint32_t product_t3;
};
uint32_t raw_value[PDO_MAX_OBJECTS - 1];
};
BUILD_ASSERT(sizeof(union disc_ident_ack) ==
sizeof(uint32_t) * (PDO_MAX_OBJECTS - 1));
/* Discover Identity data - ACK plus discovery state */
struct identity_data {
union disc_ident_ack response;
enum pd_discovery_state discovery;
};
/* supported alternate modes */
enum pd_alternate_modes {
PD_AMODE_GOOGLE,
PD_AMODE_DISPLAYPORT,
PD_AMODE_INTEL,
/* not a real mode */
PD_AMODE_COUNT,
};
/* Discover and possibly enter modes for all SOP* communications when enabled */
#ifdef CONFIG_USB_PD_DECODE_SOP
#define DISCOVERY_TYPE_COUNT (TCPC_TX_SOP_PRIME + 1)
#define AMODE_TYPE_COUNT (TCPC_TX_SOP_PRIME_PRIME + 1)
#else
#define DISCOVERY_TYPE_COUNT (TCPC_TX_SOP + 1)
#define AMODE_TYPE_COUNT (TCPC_TX_SOP + 1)
#endif
/* Discovery results for a port partner (SOP) or cable plug (SOP') */
struct pd_discovery {
/* Identity data */
union disc_ident_ack identity;
/* Identity VDO count */
int identity_cnt;
/* Supported SVIDs and corresponding mode VDOs */
struct svid_mode_data svids[SVID_DISCOVERY_MAX];
/* index of SVID currently being operated on */
int svid_idx;
/* Count of SVIDs discovered */
int svid_cnt;
/* Identity discovery state */
enum pd_discovery_state identity_discovery;
/* SVID discovery state */
enum pd_discovery_state svids_discovery;
};
/* Active modes for a partner (SOP, SOP', or SOP'') */
struct partner_active_modes {
/* Active modes */
struct svdm_amode_data amodes[PD_AMODE_COUNT];
/* Next index to insert DFP alternate mode into amodes */
int amode_idx;
};
/*
* VDO : Vendor Defined Message Object
* VDM object is minimum of VDM header + 6 additional data objects.
*/
#define VDO_HDR_SIZE 1
#define VDO_MAX_SIZE 7
#define VDM_VER10 0
#define VDM_VER20 1
#define PD_VDO_INVALID -1
/*
* VDM header
* ----------
* <31:16> :: SVID
* <15> :: VDM type ( 1b == structured, 0b == unstructured )
* <14:13> :: Structured VDM version (00b == Rev 2.0, 01b == Rev 3.0 )
* <12:11> :: reserved
* <10:8> :: object position (1-7 valid ... used for enter/exit mode only)
* <7:6> :: command type (SVDM only?)
* <5> :: reserved (SVDM), command type (UVDM)
* <4:0> :: command
*/
#define VDO(vid, type, custom) \
(((vid) << 16) | \
((type) << 15) | \
((custom) & 0x7FFF))
#define VDO_SVDM_TYPE BIT(15)
#define VDO_SVDM_VERS(x) (x << 13)
#define VDO_OPOS(x) (x << 8)
#define VDO_CMDT(x) (x << 6)
#define VDO_OPOS_MASK VDO_OPOS(0x7)
#define VDO_CMDT_MASK VDO_CMDT(0x3)
#define CMDT_INIT 0
#define CMDT_RSP_ACK 1
#define CMDT_RSP_NAK 2
#define CMDT_RSP_BUSY 3
/* reserved for SVDM ... for Google UVDM */
#define VDO_SRC_INITIATOR (0 << 5)
#define VDO_SRC_RESPONDER BIT(5)
#define CMD_DISCOVER_IDENT 1
#define CMD_DISCOVER_SVID 2
#define CMD_DISCOVER_MODES 3
#define CMD_ENTER_MODE 4
#define CMD_EXIT_MODE 5
#define CMD_ATTENTION 6
#define CMD_DP_STATUS 16
#define CMD_DP_CONFIG 17
#define VDO_CMD_VENDOR(x) (((10 + (x)) & 0x1f))
/* ChromeOS specific commands */
#define VDO_CMD_VERSION VDO_CMD_VENDOR(0)
#define VDO_CMD_SEND_INFO VDO_CMD_VENDOR(1)
#define VDO_CMD_READ_INFO VDO_CMD_VENDOR(2)
#define VDO_CMD_REBOOT VDO_CMD_VENDOR(5)
#define VDO_CMD_FLASH_ERASE VDO_CMD_VENDOR(6)
#define VDO_CMD_FLASH_WRITE VDO_CMD_VENDOR(7)
#define VDO_CMD_ERASE_SIG VDO_CMD_VENDOR(8)
#define VDO_CMD_PING_ENABLE VDO_CMD_VENDOR(10)
#define VDO_CMD_CURRENT VDO_CMD_VENDOR(11)
#define VDO_CMD_FLIP VDO_CMD_VENDOR(12)
#define VDO_CMD_GET_LOG VDO_CMD_VENDOR(13)
#define VDO_CMD_CCD_EN VDO_CMD_VENDOR(14)
#define PD_VDO_VID(vdo) ((vdo) >> 16)
#define PD_VDO_SVDM(vdo) (((vdo) >> 15) & 1)
#define PD_VDO_OPOS(vdo) (((vdo) >> 8) & 0x7)
#define PD_VDO_CMD(vdo) ((vdo) & 0x1f)
#define PD_VDO_CMDT(vdo) (((vdo) >> 6) & 0x3)
/*
* SVDM Identity request -> response
*
* Request is simply properly formatted SVDM header
*
* Response is 4 data objects.
* In case of Active cables, the response is 5 data objects:
* [0] :: SVDM header
* [1] :: Identitiy header
* [2] :: Cert Stat VDO
* [3] :: (Product | Cable) VDO
* [4] :: AMA VDO
* [4] :: Product type UFP1 VDO
* [4] :: Product type Cable VDO 1
* [5] :: Product type UFP2 VDO
* [5] :: Product type Cable VDO 2
* [6] :: Product type DFP VDO
*
*/
#define VDO_INDEX_HDR 0
#define VDO_INDEX_IDH 1
#define VDO_INDEX_CSTAT 2
#define VDO_INDEX_CABLE 3
#define VDO_INDEX_PRODUCT 3
#define VDO_INDEX_AMA 4
#define VDO_INDEX_PTYPE_UFP1_VDO 4
#define VDO_INDEX_PTYPE_CABLE1 4
#define VDO_INDEX_PTYPE_UFP2_VDO 4
#define VDO_INDEX_PTYPE_CABLE2 5
#define VDO_INDEX_PTYPE_DFP_VDO 6
#define VDO_I(name) VDO_INDEX_##name
#define VDO_IDH(usbh, usbd, ptype, is_modal, vid) \
((usbh) << 31 | (usbd) << 30 | ((ptype) & 0x7) << 27 \
| (is_modal) << 26 | ((vid) & 0xffff))
#define PD_IDH_PTYPE(vdo) (((vdo) >> 27) & 0x7)
#define PD_IDH_IS_MODAL(vdo) (((vdo) >> 26) & 0x1)
#define PD_IDH_VID(vdo) ((vdo) & 0xffff)
#define VDO_CSTAT(tid) ((tid) & 0xfffff)
#define PD_CSTAT_TID(vdo) ((vdo) & 0xfffff)
#define VDO_PRODUCT(pid, bcd) (((pid) & 0xffff) << 16 | ((bcd) & 0xffff))
#define PD_PRODUCT_PID(vdo) (((vdo) >> 16) & 0xffff)
/*
* Message id starts from 0 to 7. If last_msg_id is initialized to 0,
* it will lead to repetitive message id with first received packet,
* so initialize it with an invalid value 0xff.
*/
#define INVALID_MSG_ID_COUNTER 0xff
/* PD Stack Version */
enum pd_stack_version {
TCPMV1 = 1,
TCPMV2,
};
/* Protocol revision */
enum pd_rev_type {
PD_REV10,
PD_REV20,
PD_REV30,
};
#ifdef CONFIG_USB_PD_REV30
#define PD_REVISION PD_REV30
#else
#define PD_REVISION PD_REV20
#endif
#if defined(CONFIG_USB_PD_TCPMV1)
#define PD_STACK_VERSION TCPMV1
#elif defined(CONFIG_USB_PD_TCPMV2)
#define PD_STACK_VERSION TCPMV2
#endif
/* Cable structure for storing cable attributes */
struct pd_cable {
/* Note: the following fields are used by TCPMv1 */
/* Last received SOP' message id counter*/
uint8_t last_sop_p_msg_id;
/* Last received SOP'' message id counter*/
uint8_t last_sop_p_p_msg_id;
/* Cable flags. See CABLE_FLAGS_* */
uint8_t flags;
/* For storing Discover mode response from device */
union tbt_mode_resp_device dev_mode_resp;
/* For storing Discover mode response from cable */
union tbt_mode_resp_cable cable_mode_resp;
/* Cable revision */
enum pd_rev_type rev;
};
/* Note: These flags are only used for TCPMv1 */
/* Check if Thunderbolt-compatible mode enabled */
#define CABLE_FLAGS_TBT_COMPAT_ENABLE BIT(0)
/* Flag to limit speed to TBT Gen 2 passive cable */
#define CABLE_FLAGS_TBT_COMPAT_LIMIT_SPEED BIT(1)
/* Flag for checking if device is USB4.0 capable */
#define CABLE_FLAGS_USB4_CAPABLE BIT(2)
/* Flag for entering ENTER_USB mode */
#define CABLE_FLAGS_ENTER_USB_MODE BIT(3)
/*
* SVDM Discover SVIDs request -> response
*
* Request is properly formatted VDM Header with discover SVIDs command.
* Response is a set of SVIDs of all all supported SVIDs with all zero's to
* mark the end of SVIDs. If more than 12 SVIDs are supported command SHOULD be
* repeated.
*/
#define VDO_SVID(svid0, svid1) (((svid0) & 0xffff) << 16 | ((svid1) & 0xffff))
#define PD_VDO_SVID_SVID0(vdo) ((vdo) >> 16)
#define PD_VDO_SVID_SVID1(vdo) ((vdo) & 0xffff)
/*
* Google modes capabilities
* <31:8> : reserved
* <7:0> : mode
*/
#define VDO_MODE_GOOGLE(mode) (mode & 0xff)
#define MODE_GOOGLE_FU 1 /* Firmware Update mode */
/*
* Mode Capabilities
*
* Number of VDOs supplied is SID dependent (but <= 6 VDOS?)
*/
#define VDO_MODE_CNT_DISPLAYPORT 1
/*
* DisplayPort modes capabilities
* -------------------------------
* <31:24> : SBZ
* <23:16> : UFP_D pin assignment supported
* <15:8> : DFP_D pin assignment supported
* <7> : USB 2.0 signaling (0b=yes, 1b=no)
* <6> : Plug | Receptacle (0b == plug, 1b == receptacle)
* <5:2> : xxx1: Supports DPv1.3, xx1x Supports USB Gen 2 signaling
* Other bits are reserved.
* <1:0> : signal direction ( 00b=rsv, 01b=sink, 10b=src 11b=both )
*/
#define VDO_MODE_DP(snkp, srcp, usb, gdr, sign, sdir) \
(((snkp) & 0xff) << 16 | ((srcp) & 0xff) << 8 \
| ((usb) & 1) << 7 | ((gdr) & 1) << 6 | ((sign) & 0xF) << 2 \
| ((sdir) & 0x3))
#define MODE_DP_DFP_PIN_SHIFT 8
#define MODE_DP_UFP_PIN_SHIFT 16
/* Pin configs B/D/F support multi-function */
#define MODE_DP_PIN_MF_MASK 0x2a
/* Pin configs A/B support BR2 signaling levels */
#define MODE_DP_PIN_BR2_MASK 0x3
/* Pin configs C/D/E/F support DP signaling levels */
#define MODE_DP_PIN_DP_MASK 0x3c
/* Pin configs A/B/C/D/E/F */
#define MODE_DP_PIN_CAPS_MASK 0x3f
#define MODE_DP_V13 0x1
#define MODE_DP_GEN2 0x2
#define MODE_DP_SNK 0x1
#define MODE_DP_SRC 0x2
#define MODE_DP_BOTH 0x3
#define MODE_DP_CABLE_SHIFT 6
/*
* Determine which pin assignments are valid for DP
*
* Based on whether the DP adapter identifies itself as a plug (permanently
* attached cable) or a receptacle, the pin assignments may be in the DFP_D
* field or the UFP_D field.
*
* Refer to DisplayPort Alt Mode On USB Type-C Standard version 1.0, table 5-2
* depending on state of receptacle bit, use pins for DFP_D (if receptacle==0)
* or UFP_D (if receptacle==1)
* Also refer to DisplayPort Alt Mode Capabilities Clarification (4/30/2015)
*/
#define PD_DP_PIN_CAPS(x) ((((x) >> MODE_DP_CABLE_SHIFT) & 0x1) \
? (((x) >> MODE_DP_UFP_PIN_SHIFT) & MODE_DP_PIN_CAPS_MASK) \
: (((x) >> MODE_DP_DFP_PIN_SHIFT) & MODE_DP_PIN_CAPS_MASK))
/*
* DisplayPort Status VDO
* ----------------------
* <31:9> : SBZ
* <8> : IRQ_HPD : 1 == irq arrived since last message otherwise 0.
* <7> : HPD state : 0 = HPD_LOW, 1 == HPD_HIGH
* <6> : Exit DP Alt mode: 0 == maintain, 1 == exit
* <5> : USB config : 0 == maintain current, 1 == switch to USB from DP
* <4> : Multi-function preference : 0 == no pref, 1 == MF preferred.
* <3> : enabled : is DPout on/off.
* <2> : power low : 0 == normal or LPM disabled, 1 == DP disabled for LPM
* <1:0> : connect status : 00b == no (DFP|UFP)_D is connected or disabled.
* 01b == DFP_D connected, 10b == UFP_D connected, 11b == both.
*/
#define VDO_DP_STATUS(irq, lvl, amode, usbc, mf, en, lp, conn) \
(((irq) & 1) << 8 | ((lvl) & 1) << 7 | ((amode) & 1) << 6 \
| ((usbc) & 1) << 5 | ((mf) & 1) << 4 | ((en) & 1) << 3 \
| ((lp) & 1) << 2 | ((conn & 0x3) << 0))
#define PD_VDO_DPSTS_MF_MASK BIT(4)
#define PD_VDO_DPSTS_HPD_IRQ(x) (((x) >> 8) & 1)
#define PD_VDO_DPSTS_HPD_LVL(x) (((x) >> 7) & 1)
#define PD_VDO_DPSTS_MF_PREF(x) (((x) >> 4) & 1)
/* Per DisplayPort Spec v1.3 Section 3.3 */
#define HPD_USTREAM_DEBOUNCE_LVL (2*MSEC)
#define HPD_USTREAM_DEBOUNCE_IRQ (250)
#define HPD_DSTREAM_DEBOUNCE_IRQ (500) /* between 500-1000us */
/*
* DisplayPort Configure VDO
* -------------------------
* <31:24> : SBZ
* <23:16> : SBZ
* <15:8> : Pin assignment requested. Choose one from mode caps.
* <7:6> : SBZ
* <5:2> : signalling : 1h == DP v1.3, 2h == Gen 2
* Oh is only for USB, remaining values are reserved
* <1:0> : cfg : 00 == USB, 01 == DFP_D, 10 == UFP_D, 11 == reserved
*/
#define VDO_DP_CFG(pin, sig, cfg) \
(((pin) & 0xff) << 8 | ((sig) & 0xf) << 2 | ((cfg) & 0x3))
#define PD_DP_CFG_DPON(x) (((x & 0x3) == 1) || ((x & 0x3) == 2))
/*
* Get the pin assignment mask
* for backward compatibility, if it is null,
* get the former sink pin assignment we used to be in <23:16>.
*/
#define PD_DP_CFG_PIN(x) ((((x) >> 8) & 0xff) ? (((x) >> 8) & 0xff) \
: (((x) >> 16) & 0xff))
/*
* ChromeOS specific PD device Hardware IDs. Used to identify unique
* products and used in VDO_INFO. Note this field is 10 bits.
*/
#define USB_PD_HW_DEV_ID_RESERVED 0
#define USB_PD_HW_DEV_ID_ZINGER 1
#define USB_PD_HW_DEV_ID_MINIMUFFIN 2
#define USB_PD_HW_DEV_ID_DINGDONG 3
#define USB_PD_HW_DEV_ID_HOHO 4
#define USB_PD_HW_DEV_ID_HONEYBUNS 5
/*
* ChromeOS specific VDO_CMD_READ_INFO responds with device info including:
* RW Hash: First 20 bytes of SHA-256 of RW (20 bytes)
* HW Device ID: unique descriptor for each ChromeOS model (2 bytes)
* top 6 bits are minor revision, bottom 10 bits are major
* SW Debug Version: Software version useful for debugging (15 bits)
* IS RW: True if currently in RW, False otherwise (1 bit)
*/
#define VDO_INFO(id, id_minor, ver, is_rw) ((id_minor) << 26 \
| ((id) & 0x3ff) << 16 \
| ((ver) & 0x7fff) << 1 \
| ((is_rw) & 1))
#define VDO_INFO_HW_DEV_ID(x) ((x) >> 16)
#define VDO_INFO_SW_DBG_VER(x) (((x) >> 1) & 0x7fff)
#define VDO_INFO_IS_RW(x) ((x) & 1)
#define HW_DEV_ID_MAJ(x) (x & 0x3ff)
#define HW_DEV_ID_MIN(x) ((x) >> 10)
/* USB-IF SIDs */
#define USB_SID_PD 0xff00 /* power delivery */
#define USB_SID_DISPLAYPORT 0xff01
#define USB_GOOGLE_TYPEC_URL "http://www.google.com/chrome/devices/typec"
/* USB Vendor ID assigned to Google Inc. */
#define USB_VID_GOOGLE 0x18d1
/* Other Vendor IDs */
#define USB_VID_APPLE 0x05ac
#define USB_PID1_APPLE 0x1012
#define USB_PID2_APPLE 0x1013
#define USB_VID_INTEL 0x8087
/* Timeout for message receive in microseconds */
#define USB_PD_RX_TMOUT_US 1800
/* --- Protocol layer functions --- */
enum pd_states {
PD_STATE_DISABLED, /* C0 */
PD_STATE_SUSPENDED, /* C1 */
PD_STATE_SNK_DISCONNECTED, /* C2 */
PD_STATE_SNK_DISCONNECTED_DEBOUNCE, /* C3 */
PD_STATE_SNK_HARD_RESET_RECOVER, /* C4 */
PD_STATE_SNK_DISCOVERY, /* C5 */
PD_STATE_SNK_REQUESTED, /* C6 */
PD_STATE_SNK_TRANSITION, /* C7 */
PD_STATE_SNK_READY, /* C8 */
PD_STATE_SNK_SWAP_INIT, /* C9 */
PD_STATE_SNK_SWAP_SNK_DISABLE, /* C10 */
PD_STATE_SNK_SWAP_SRC_DISABLE, /* C11 */
PD_STATE_SNK_SWAP_STANDBY, /* C12 */
PD_STATE_SNK_SWAP_COMPLETE, /* C13 */
PD_STATE_SRC_DISCONNECTED, /* C14 */
PD_STATE_SRC_DISCONNECTED_DEBOUNCE, /* C15 */
PD_STATE_SRC_HARD_RESET_RECOVER, /* C16 */
PD_STATE_SRC_STARTUP, /* C17 */
PD_STATE_SRC_DISCOVERY, /* C18 */
PD_STATE_SRC_NEGOCIATE, /* C19 */
PD_STATE_SRC_ACCEPTED, /* C20 */
PD_STATE_SRC_POWERED, /* C21 */
PD_STATE_SRC_TRANSITION, /* C22 */
PD_STATE_SRC_READY, /* C23 */
PD_STATE_SRC_GET_SINK_CAP, /* C24 */
PD_STATE_DR_SWAP, /* C25 */
PD_STATE_SRC_SWAP_INIT, /* C26 */
PD_STATE_SRC_SWAP_SNK_DISABLE, /* C27 */
PD_STATE_SRC_SWAP_SRC_DISABLE, /* C28 */
PD_STATE_SRC_SWAP_STANDBY, /* C29 */
PD_STATE_VCONN_SWAP_SEND, /* C30 */
PD_STATE_VCONN_SWAP_INIT, /* C31 */
PD_STATE_VCONN_SWAP_READY, /* C32 */
PD_STATE_SOFT_RESET, /* C33 */
PD_STATE_HARD_RESET_SEND, /* C34 */
PD_STATE_HARD_RESET_EXECUTE, /* C35 */
PD_STATE_BIST_RX, /* C36 */
PD_STATE_BIST_TX, /* C37 */
PD_STATE_DRP_AUTO_TOGGLE, /* C38 */
PD_STATE_ENTER_USB, /* C39 */
/* Number of states. Not an actual state. */
PD_STATE_COUNT,
};
/* Generate compile-time errors for unsupported states */
#ifndef CONFIG_USB_PD_DUAL_ROLE
#define PD_STATE_SNK_DISCONNECTED UNSUPPORTED_PD_STATE_SNK_DISCONNECTED
#define PD_STATE_SNK_DISCONNECTED_DEBOUNCE UNSUPPORTED_SNK_DISCONNECTED_DEBOUNCE
#define PD_STATE_SNK_HARD_RESET_RECOVER UNSUPPORTED_SNK_HARD_RESET_RECOVER
#define PD_STATE_SNK_DISCOVERY UNSUPPORTED_PD_STATE_SNK_DISCOVERY
#define PD_STATE_SNK_REQUESTED UNSUPPORTED_PD_STATE_SNK_REQUESTED
#define PD_STATE_SNK_TRANSITION UNSUPPORTED_PD_STATE_SNK_TRANSITION
#define PD_STATE_SNK_READY UNSUPPORTED_PD_STATE_SNK_READY
#define PD_STATE_SNK_SWAP_INIT UNSUPPORTED_PD_STATE_SNK_SWAP_INIT
#define PD_STATE_SNK_SWAP_SNK_DISABLE UNSUPPORTED_PD_STATE_SNK_SWAP_SNK_DISABLE
#define PD_STATE_SNK_SWAP_SRC_DISABLE UNSUPPORTED_PD_STATE_SNK_SWAP_SRC_DISABLE
#define PD_STATE_SNK_SWAP_STANDBY UNSUPPORTED_PD_STATE_SNK_SWAP_STANDBY
#define PD_STATE_SNK_SWAP_COMPLETE UNSUPPORTED_PD_STATE_SNK_SWAP_COMPLETE
#define PD_STATE_SRC_SWAP_INIT UNSUPPORTED_PD_STATE_SRC_SWAP_INIT
#define PD_STATE_SRC_SWAP_SNK_DISABLE UNSUPPORTED_PD_STATE_SRC_SWAP_SNK_DISABLE
#define PD_STATE_SRC_SWAP_SRC_DISABLE UNSUPPORTED_PD_STATE_SRC_SWAP_SRC_DISABLE
#define PD_STATE_SRC_SWAP_STANDBY UNSUPPORTED_PD_STATE_SRC_SWAP_STANDBY
#endif /* CONFIG_USB_PD_DUAL_ROLE */
/* Generate compile-time errors for unsupported states */
#if !defined(CONFIG_USBC_VCONN_SWAP) || !defined(CONFIG_USB_PD_DUAL_ROLE)
#define PD_STATE_VCONN_SWAP_SEND UNSUPPORTED_PD_STATE_VCONN_SWAP_SEND
#define PD_STATE_VCONN_SWAP_INIT UNSUPPORTED_PD_STATE_VCONN_SWAP_INIT
#define PD_STATE_VCONN_SWAP_READY UNSUPPORTED_PD_STATE_VCONN_SWAP_READY
#endif
/* Generate compile-time errors for unsupported states */
#ifndef CONFIG_COMMON_RUNTIME
#define PD_STATE_BIST_RX UNSUPPORTED_PD_STATE_BIST_RX
#define PD_STATE_BIST_TX UNSUPPORTED_PD_STATE_BIST_TX
#endif
/* Generate compile-time errors for unsupported states */
#ifndef CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE
#define PD_STATE_DRP_AUTO_TOGGLE UNSUPPORTED_PD_STATE_DRP_AUTO_TOGGLE
#endif
#ifdef CONFIG_USB_PD_TCPMV1
/* Flags used for TCPMv1 */
#define PD_FLAGS_PING_ENABLED BIT(0) /* SRC_READY pings enabled */
#define PD_FLAGS_PARTNER_DR_POWER BIT(1) /* port partner is dualrole power */
#define PD_FLAGS_PARTNER_DR_DATA BIT(2) /* port partner is dualrole data */
#define PD_FLAGS_CHECK_IDENTITY BIT(3) /* discover identity in READY */
#define PD_FLAGS_SNK_CAP_RECVD BIT(4) /* sink capabilities received */
#define PD_FLAGS_TCPC_DRP_TOGGLE BIT(5) /* TCPC-controlled DRP toggling */
#define PD_FLAGS_EXPLICIT_CONTRACT BIT(6) /* explicit pwr contract in place */
#define PD_FLAGS_VBUS_NEVER_LOW BIT(7) /* VBUS input has never been low */
#define PD_FLAGS_PREVIOUS_PD_CONN BIT(8) /* previously PD connected */
#define PD_FLAGS_CHECK_PR_ROLE BIT(9) /* check power role in READY */
#define PD_FLAGS_CHECK_DR_ROLE BIT(10)/* check data role in READY */
#define PD_FLAGS_PARTNER_UNCONSTR BIT(11)/* port partner unconstrained pwr */
#define PD_FLAGS_VCONN_ON BIT(12)/* vconn is being sourced */
#define PD_FLAGS_TRY_SRC BIT(13)/* Try.SRC states are active */
#define PD_FLAGS_PARTNER_USB_COMM BIT(14)/* port partner is USB comms */
#define PD_FLAGS_UPDATE_SRC_CAPS BIT(15)/* send new source capabilities */
#define PD_FLAGS_TS_DTS_PARTNER BIT(16)/* partner has rp/rp or rd/rd */
/*
* These PD_FLAGS_LPM* flags track the software state (PD_LPM_FLAGS_REQUESTED)
* and hardware state (PD_LPM_FLAGS_ENGAGED) of the TCPC low power mode.
* PD_FLAGS_LPM_TRANSITION is set while the HW is transitioning into or out of
* low power (when PD_LPM_FLAGS_ENGAGED is changing).
*/
#ifdef CONFIG_USB_PD_TCPC_LOW_POWER
#define PD_FLAGS_LPM_REQUESTED BIT(17)/* Tracks SW LPM state */
#define PD_FLAGS_LPM_ENGAGED BIT(18)/* Tracks HW LPM state */
#define PD_FLAGS_LPM_TRANSITION BIT(19)/* Tracks HW LPM transition */
#define PD_FLAGS_LPM_EXIT BIT(19)/* Tracks HW LPM exit */
#endif
/*
* Tracks whether port negotiation may have stalled due to not starting reset
* timers in SNK_DISCOVERY
*/
#define PD_FLAGS_SNK_WAITING_BATT BIT(21)
/* Check vconn state in READY */
#define PD_FLAGS_CHECK_VCONN_STATE BIT(22)
#endif /* CONFIG_USB_PD_TCPMV1 */
/* Per-port battery backed RAM flags */
#define PD_BBRMFLG_EXPLICIT_CONTRACT BIT(0)
#define PD_BBRMFLG_POWER_ROLE BIT(1)
#define PD_BBRMFLG_DATA_ROLE BIT(2)
#define PD_BBRMFLG_VCONN_ROLE BIT(3)
#define PD_BBRMFLG_DBGACC_ROLE BIT(4)
/* Initial value for CC debounce variable */
#define PD_CC_UNSET -1
enum pd_dual_role_states {
/* While disconnected, toggle between src and sink */
PD_DRP_TOGGLE_ON,
/* Stay in src until disconnect, then stay in sink forever */
PD_DRP_TOGGLE_OFF,
/* Stay in current power role, don't switch. No auto-toggle support */
PD_DRP_FREEZE,
/* Switch to sink */
PD_DRP_FORCE_SINK,
/* Switch to source */
PD_DRP_FORCE_SOURCE,
};
/*
* Device Policy Manager Requests.
* NOTE: These are usually set by host commands from the AP.
*/
enum pd_dpm_request {
DPM_REQUEST_DR_SWAP = BIT(0),
DPM_REQUEST_PR_SWAP = BIT(1),
DPM_REQUEST_VCONN_SWAP = BIT(2),
DPM_REQUEST_GOTO_MIN = BIT(3),
DPM_REQUEST_SRC_CAP_CHANGE = BIT(4),
DPM_REQUEST_GET_SNK_CAPS = BIT(5),
DPM_REQUEST_SEND_PING = BIT(6),
DPM_REQUEST_SOURCE_CAP = BIT(7),
DPM_REQUEST_NEW_POWER_LEVEL = BIT(8),
DPM_REQUEST_VDM = BIT(9),
DPM_REQUEST_BIST_RX = BIT(10),
DPM_REQUEST_BIST_TX = BIT(11),
DPM_REQUEST_SNK_STARTUP = BIT(12),
DPM_REQUEST_SRC_STARTUP = BIT(13),
DPM_REQUEST_HARD_RESET_SEND = BIT(14),
DPM_REQUEST_SOFT_RESET_SEND = BIT(15),
DPM_REQUEST_PORT_DISCOVERY = BIT(16),
DPM_REQUEST_SEND_ALERT = BIT(17),
DPM_REQUEST_ENTER_USB = BIT(18),
DPM_REQUEST_GET_SRC_CAPS = BIT(19),
DPM_REQUEST_EXIT_MODES = BIT(20),
};
/**
* Get dual role state
*
* @param port Port number from which to get state
* @return Current dual-role state, from enum pd_dual_role_states
*/
enum pd_dual_role_states pd_get_dual_role(int port);
/**
* Set dual role state, from among enum pd_dual_role_states
*
* @param port Port number of which to set state
* @param state New state of dual-role port, selected from
* enum pd_dual_role_states
*/
void pd_set_dual_role(int port, enum pd_dual_role_states state);
/**
* Get current data role
*
* @param port Port number from which to get role
*/
enum pd_data_role pd_get_data_role(int port);
/**
* Get current power role
*
* @param port Port number from which to get power role
*/
enum pd_power_role pd_get_power_role(int port);
/*
* Return true if PD is capable of trying as source else false
*/