1
2
3
4
5
6
7
8#ifndef __CROS_EC_COMMANDS_H
9#define __CROS_EC_COMMANDS_H
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#define EC_PROTO_VERSION 0x00000002
38
39
40#define EC_VER_MASK(version) (1UL << (version))
41
42
43#define EC_LPC_ADDR_ACPI_DATA 0x62
44#define EC_LPC_ADDR_ACPI_CMD 0x66
45
46
47#define EC_LPC_ADDR_HOST_DATA 0x200
48#define EC_LPC_ADDR_HOST_CMD 0x204
49
50
51
52#define EC_LPC_ADDR_HOST_ARGS 0x800
53#define EC_LPC_ADDR_HOST_PARAM 0x804
54
55
56#define EC_LPC_ADDR_HOST_PACKET 0x800
57#define EC_LPC_HOST_PACKET_SIZE 0x100
58
59
60
61#define EC_HOST_CMD_REGION0 0x800
62#define EC_HOST_CMD_REGION1 0x880
63#define EC_HOST_CMD_REGION_SIZE 0x80
64
65
66#define EC_LPC_CMDR_DATA (1 << 0)
67#define EC_LPC_CMDR_PENDING (1 << 1)
68#define EC_LPC_CMDR_BUSY (1 << 2)
69#define EC_LPC_CMDR_CMD (1 << 3)
70#define EC_LPC_CMDR_ACPI_BRST (1 << 4)
71#define EC_LPC_CMDR_SCI (1 << 5)
72#define EC_LPC_CMDR_SMI (1 << 6)
73
74
75#define MEC_EMI_BASE 0x800
76#define MEC_EMI_SIZE 8
77
78#define EC_LPC_ADDR_MEMMAP 0x900
79#define EC_MEMMAP_SIZE 255
80#define EC_MEMMAP_TEXT_MAX 8
81
82
83#define EC_MEMMAP_TEMP_SENSOR 0x00
84#define EC_MEMMAP_FAN 0x10
85#define EC_MEMMAP_TEMP_SENSOR_B 0x18
86#define EC_MEMMAP_ID 0x20
87#define EC_MEMMAP_ID_VERSION 0x22
88#define EC_MEMMAP_THERMAL_VERSION 0x23
89#define EC_MEMMAP_BATTERY_VERSION 0x24
90#define EC_MEMMAP_SWITCHES_VERSION 0x25
91#define EC_MEMMAP_EVENTS_VERSION 0x26
92#define EC_MEMMAP_HOST_CMD_FLAGS 0x27
93
94#define EC_MEMMAP_SWITCHES 0x30
95
96#define EC_MEMMAP_HOST_EVENTS 0x34
97
98
99#define EC_MEMMAP_BATT_VOLT 0x40
100#define EC_MEMMAP_BATT_RATE 0x44
101#define EC_MEMMAP_BATT_CAP 0x48
102#define EC_MEMMAP_BATT_FLAG 0x4c
103#define EC_MEMMAP_BATT_DCAP 0x50
104#define EC_MEMMAP_BATT_DVLT 0x54
105#define EC_MEMMAP_BATT_LFCC 0x58
106#define EC_MEMMAP_BATT_CCNT 0x5c
107
108#define EC_MEMMAP_BATT_MFGR 0x60
109#define EC_MEMMAP_BATT_MODEL 0x68
110#define EC_MEMMAP_BATT_SERIAL 0x70
111#define EC_MEMMAP_BATT_TYPE 0x78
112#define EC_MEMMAP_ALS 0x80
113
114#define EC_MEMMAP_ACC_STATUS 0x90
115
116#define EC_MEMMAP_ACC_DATA 0x92
117
118
119
120#define EC_MEMMAP_GYRO_DATA 0xa0
121
122
123
124
125
126
127
128#define EC_MEMMAP_NO_ACPI 0xe0
129
130
131#define EC_MEMMAP_ACC_STATUS_SAMPLE_ID_MASK 0x0f
132#define EC_MEMMAP_ACC_STATUS_BUSY_BIT (1 << 4)
133#define EC_MEMMAP_ACC_STATUS_PRESENCE_BIT (1 << 7)
134
135
136#define EC_TEMP_SENSOR_ENTRIES 16
137
138
139
140
141
142#define EC_TEMP_SENSOR_B_ENTRIES 8
143
144
145#define EC_TEMP_SENSOR_NOT_PRESENT 0xff
146#define EC_TEMP_SENSOR_ERROR 0xfe
147#define EC_TEMP_SENSOR_NOT_POWERED 0xfd
148#define EC_TEMP_SENSOR_NOT_CALIBRATED 0xfc
149
150
151
152
153#define EC_TEMP_SENSOR_OFFSET 200
154
155
156
157
158#define EC_ALS_ENTRIES 2
159
160
161
162
163
164
165#define EC_TEMP_SENSOR_DEFAULT (296 - EC_TEMP_SENSOR_OFFSET)
166
167#define EC_FAN_SPEED_ENTRIES 4
168#define EC_FAN_SPEED_NOT_PRESENT 0xffff
169#define EC_FAN_SPEED_STALLED 0xfffe
170
171
172#define EC_BATT_FLAG_AC_PRESENT 0x01
173#define EC_BATT_FLAG_BATT_PRESENT 0x02
174#define EC_BATT_FLAG_DISCHARGING 0x04
175#define EC_BATT_FLAG_CHARGING 0x08
176#define EC_BATT_FLAG_LEVEL_CRITICAL 0x10
177
178
179#define EC_SWITCH_LID_OPEN 0x01
180#define EC_SWITCH_POWER_BUTTON_PRESSED 0x02
181#define EC_SWITCH_WRITE_PROTECT_DISABLED 0x04
182
183#define EC_SWITCH_IGNORE1 0x08
184
185#define EC_SWITCH_DEDICATED_RECOVERY 0x10
186
187#define EC_SWITCH_IGNORE0 0x20
188
189
190
191#define EC_HOST_CMD_FLAG_LPC_ARGS_SUPPORTED 0x01
192
193#define EC_HOST_CMD_FLAG_VERSION_3 0x02
194
195
196#define EC_WIRELESS_SWITCH_ALL ~0x00
197#define EC_WIRELESS_SWITCH_WLAN 0x01
198#define EC_WIRELESS_SWITCH_BLUETOOTH 0x02
199#define EC_WIRELESS_SWITCH_WWAN 0x04
200#define EC_WIRELESS_SWITCH_WLAN_POWER 0x08
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222#define EC_CMD_ACPI_READ 0x0080
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237#define EC_CMD_ACPI_WRITE 0x0081
238
239
240
241
242
243
244
245
246#define EC_CMD_ACPI_BURST_ENABLE 0x0082
247
248
249
250
251
252
253
254#define EC_CMD_ACPI_BURST_DISABLE 0x0083
255
256
257
258
259
260
261
262
263#define EC_CMD_ACPI_QUERY_EVENT 0x0084
264
265
266
267
268#define EC_ACPI_MEM_VERSION 0x00
269
270
271
272
273#define EC_ACPI_MEM_TEST 0x01
274
275#define EC_ACPI_MEM_TEST_COMPLIMENT 0x02
276
277
278#define EC_ACPI_MEM_KEYBOARD_BACKLIGHT 0x03
279
280#define EC_ACPI_MEM_FAN_DUTY 0x04
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297#define EC_ACPI_MEM_TEMP_ID 0x05
298#define EC_ACPI_MEM_TEMP_THRESHOLD 0x06
299#define EC_ACPI_MEM_TEMP_COMMIT 0x07
300
301
302
303
304
305
306#define EC_ACPI_MEM_TEMP_COMMIT_SELECT_MASK (1 << 0)
307#define EC_ACPI_MEM_TEMP_COMMIT_ENABLE_MASK (1 << 1)
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324#define EC_ACPI_MEM_CHARGING_LIMIT 0x08
325
326
327#define EC_ACPI_MEM_CHARGING_LIMIT_STEP_MA 64
328
329#define EC_ACPI_MEM_CHARGING_LIMIT_DISABLED 0xff
330
331
332
333
334
335#define EC_ACPI_MEM_DEVICE_ORIENTATION 0x09
336#define EC_ACPI_MEM_DEVICE_TABLET_MODE 0x01
337
338
339
340
341
342#define EC_ACPI_MEM_MAPPED_BEGIN 0x20
343#define EC_ACPI_MEM_MAPPED_SIZE 0xe0
344
345
346#define EC_ACPI_MEM_VERSION_CURRENT 2
347
348
349
350
351
352
353
354#ifndef __ACPI__
355
356
357
358
359
360#ifndef __packed
361#define __packed __attribute__((packed))
362#endif
363
364#ifndef __aligned
365#define __aligned(x) __attribute__((aligned(x)))
366#endif
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#ifdef CONFIG_HOSTCMD_ALIGNED
396
397
398
399
400
401#define __ec_align1 __packed
402#define __ec_align2 __packed __aligned(2)
403#define __ec_align4 __packed __aligned(4)
404
405
406
407
408
409
410
411
412
413#define __ec_align_size1 __packed
414
415
416
417
418
419#define __ec_align_offset1 __packed
420#define __ec_align_offset2 __packed __aligned(2)
421
422
423
424
425
426
427
428
429
430#define __ec_todo_packed __packed
431#define __ec_todo_unpacked
432
433#else
434
435
436
437
438
439#define __ec_align1 __packed
440#define __ec_align2 __packed
441#define __ec_align4 __packed
442#define __ec_align_size1 __packed
443#define __ec_align_offset1 __packed
444#define __ec_align_offset2 __packed
445#define __ec_todo_packed __packed
446#define __ec_todo_unpacked
447
448#endif
449
450
451
452#define EC_LPC_STATUS_TO_HOST 0x01
453
454#define EC_LPC_STATUS_FROM_HOST 0x02
455
456#define EC_LPC_STATUS_PROCESSING 0x04
457
458#define EC_LPC_STATUS_LAST_CMD 0x08
459
460#define EC_LPC_STATUS_BURST_MODE 0x10
461
462#define EC_LPC_STATUS_SCI_PENDING 0x20
463
464#define EC_LPC_STATUS_SMI_PENDING 0x40
465
466#define EC_LPC_STATUS_RESERVED 0x80
467
468
469
470
471
472#define EC_LPC_STATUS_BUSY_MASK \
473 (EC_LPC_STATUS_FROM_HOST | EC_LPC_STATUS_PROCESSING)
474
475
476
477
478enum ec_status {
479 EC_RES_SUCCESS = 0,
480 EC_RES_INVALID_COMMAND = 1,
481 EC_RES_ERROR = 2,
482 EC_RES_INVALID_PARAM = 3,
483 EC_RES_ACCESS_DENIED = 4,
484 EC_RES_INVALID_RESPONSE = 5,
485 EC_RES_INVALID_VERSION = 6,
486 EC_RES_INVALID_CHECKSUM = 7,
487 EC_RES_IN_PROGRESS = 8,
488 EC_RES_UNAVAILABLE = 9,
489 EC_RES_TIMEOUT = 10,
490 EC_RES_OVERFLOW = 11,
491 EC_RES_INVALID_HEADER = 12,
492 EC_RES_REQUEST_TRUNCATED = 13,
493 EC_RES_RESPONSE_TOO_BIG = 14,
494 EC_RES_BUS_ERROR = 15,
495 EC_RES_BUSY = 16
496};
497
498
499
500
501
502
503
504
505enum host_event_code {
506 EC_HOST_EVENT_LID_CLOSED = 1,
507 EC_HOST_EVENT_LID_OPEN = 2,
508 EC_HOST_EVENT_POWER_BUTTON = 3,
509 EC_HOST_EVENT_AC_CONNECTED = 4,
510 EC_HOST_EVENT_AC_DISCONNECTED = 5,
511 EC_HOST_EVENT_BATTERY_LOW = 6,
512 EC_HOST_EVENT_BATTERY_CRITICAL = 7,
513 EC_HOST_EVENT_BATTERY = 8,
514 EC_HOST_EVENT_THERMAL_THRESHOLD = 9,
515
516 EC_HOST_EVENT_DEVICE = 10,
517 EC_HOST_EVENT_THERMAL = 11,
518 EC_HOST_EVENT_USB_CHARGER = 12,
519 EC_HOST_EVENT_KEY_PRESSED = 13,
520
521
522
523
524
525 EC_HOST_EVENT_INTERFACE_READY = 14,
526
527 EC_HOST_EVENT_KEYBOARD_RECOVERY = 15,
528
529
530 EC_HOST_EVENT_THERMAL_SHUTDOWN = 16,
531
532 EC_HOST_EVENT_BATTERY_SHUTDOWN = 17,
533
534
535 EC_HOST_EVENT_THROTTLE_START = 18,
536
537 EC_HOST_EVENT_THROTTLE_STOP = 19,
538
539
540 EC_HOST_EVENT_HANG_DETECT = 20,
541
542 EC_HOST_EVENT_HANG_REBOOT = 21,
543
544
545 EC_HOST_EVENT_PD_MCU = 22,
546
547
548 EC_HOST_EVENT_BATTERY_STATUS = 23,
549
550
551 EC_HOST_EVENT_PANIC = 24,
552
553
554 EC_HOST_EVENT_KEYBOARD_FASTBOOT = 25,
555
556
557 EC_HOST_EVENT_RTC = 26,
558
559
560 EC_HOST_EVENT_MKBP = 27,
561
562
563 EC_HOST_EVENT_USB_MUX = 28,
564
565
566 EC_HOST_EVENT_MODE_CHANGE = 29,
567
568
569 EC_HOST_EVENT_KEYBOARD_RECOVERY_HW_REINIT = 30,
570
571
572
573
574
575 EC_HOST_EVENT_EXTENDED = 31,
576
577
578
579
580
581
582
583
584 EC_HOST_EVENT_INVALID = 32
585};
586
587#define EC_HOST_EVENT_MASK(event_code) (1ULL << ((event_code) - 1))
588
589
590struct __ec_align4 ec_lpc_host_args {
591 uint8_t flags;
592 uint8_t command_version;
593 uint8_t data_size;
594
595
596
597
598 uint8_t checksum;
599};
600
601
602
603
604
605
606
607
608
609
610
611#define EC_HOST_ARGS_FLAG_FROM_HOST 0x01
612
613
614
615
616
617
618
619#define EC_HOST_ARGS_FLAG_TO_HOST 0x02
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#define EC_SPI_FRAME_START 0xec
662
663
664
665
666#define EC_SPI_PAST_END 0xed
667
668
669
670
671
672
673#define EC_SPI_RX_READY 0xf8
674
675
676
677
678
679#define EC_SPI_RECEIVING 0xf9
680
681
682#define EC_SPI_PROCESSING 0xfa
683
684
685
686
687
688#define EC_SPI_RX_BAD_DATA 0xfb
689
690
691
692
693
694
695#define EC_SPI_NOT_READY 0xfc
696
697
698
699
700
701
702#define EC_SPI_OLD_READY 0xfd
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722#define EC_PROTO2_REQUEST_HEADER_BYTES 3
723#define EC_PROTO2_REQUEST_TRAILER_BYTES 1
724#define EC_PROTO2_REQUEST_OVERHEAD (EC_PROTO2_REQUEST_HEADER_BYTES + \
725 EC_PROTO2_REQUEST_TRAILER_BYTES)
726
727#define EC_PROTO2_RESPONSE_HEADER_BYTES 2
728#define EC_PROTO2_RESPONSE_TRAILER_BYTES 1
729#define EC_PROTO2_RESPONSE_OVERHEAD (EC_PROTO2_RESPONSE_HEADER_BYTES + \
730 EC_PROTO2_RESPONSE_TRAILER_BYTES)
731
732
733#define EC_PROTO2_MAX_PARAM_SIZE 0xfc
734
735
736#define EC_PROTO2_MAX_REQUEST_SIZE (EC_PROTO2_REQUEST_OVERHEAD + \
737 EC_PROTO2_MAX_PARAM_SIZE)
738#define EC_PROTO2_MAX_RESPONSE_SIZE (EC_PROTO2_RESPONSE_OVERHEAD + \
739 EC_PROTO2_MAX_PARAM_SIZE)
740
741
742
743
744
745
746
747#define EC_COMMAND_PROTOCOL_3 0xda
748
749#define EC_HOST_REQUEST_VERSION 3
750
751
752struct __ec_align4 ec_host_request {
753
754
755
756
757
758 uint8_t struct_version;
759
760
761
762
763
764 uint8_t checksum;
765
766
767 uint16_t command;
768
769
770 uint8_t command_version;
771
772
773 uint8_t reserved;
774
775
776 uint16_t data_len;
777};
778
779#define EC_HOST_RESPONSE_VERSION 3
780
781
782struct __ec_align4 ec_host_response {
783
784 uint8_t struct_version;
785
786
787
788
789
790 uint8_t checksum;
791
792
793 uint16_t result;
794
795
796 uint16_t data_len;
797
798
799 uint16_t reserved;
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#define EC_CMD_PROTO_VERSION 0x0000
825
826struct __ec_align4 ec_response_proto_version {
827 uint32_t version;
828};
829
830
831
832
833
834#define EC_CMD_HELLO 0x0001
835
836struct __ec_align4 ec_params_hello {
837 uint32_t in_data;
838};
839
840struct __ec_align4 ec_response_hello {
841 uint32_t out_data;
842};
843
844
845#define EC_CMD_GET_VERSION 0x0002
846
847enum ec_current_image {
848 EC_IMAGE_UNKNOWN = 0,
849 EC_IMAGE_RO,
850 EC_IMAGE_RW
851};
852
853struct __ec_align4 ec_response_get_version {
854
855 char version_string_ro[32];
856 char version_string_rw[32];
857 char reserved[32];
858 uint32_t current_image;
859};
860
861
862#define EC_CMD_READ_TEST 0x0003
863
864struct __ec_align4 ec_params_read_test {
865 uint32_t offset;
866 uint32_t size;
867};
868
869struct __ec_align4 ec_response_read_test {
870 uint32_t data[32];
871};
872
873
874
875
876
877
878#define EC_CMD_GET_BUILD_INFO 0x0004
879
880
881#define EC_CMD_GET_CHIP_INFO 0x0005
882
883struct __ec_align4 ec_response_get_chip_info {
884
885 char vendor[32];
886 char name[32];
887 char revision[32];
888};
889
890
891#define EC_CMD_GET_BOARD_VERSION 0x0006
892
893struct __ec_align2 ec_response_board_version {
894 uint16_t board_version;
895};
896
897
898
899
900
901
902
903
904
905#define EC_CMD_READ_MEMMAP 0x0007
906
907struct __ec_align1 ec_params_read_memmap {
908 uint8_t offset;
909 uint8_t size;
910};
911
912
913#define EC_CMD_GET_CMD_VERSIONS 0x0008
914
915struct __ec_align1 ec_params_get_cmd_versions {
916 uint8_t cmd;
917};
918
919struct __ec_align2 ec_params_get_cmd_versions_v1 {
920 uint16_t cmd;
921};
922
923struct __ec_align4 ec_response_get_cmd_versions {
924
925
926
927
928 uint32_t version_mask;
929};
930
931
932
933
934
935
936
937
938#define EC_CMD_GET_COMMS_STATUS 0x0009
939
940
941enum ec_comms_status {
942 EC_COMMS_STATUS_PROCESSING = 1 << 0,
943};
944
945struct __ec_align4 ec_response_get_comms_status {
946 uint32_t flags;
947};
948
949
950#define EC_CMD_TEST_PROTOCOL 0x000A
951
952
953struct __ec_align4 ec_params_test_protocol {
954 uint32_t ec_result;
955 uint32_t ret_len;
956 uint8_t buf[32];
957};
958
959
960struct __ec_align4 ec_response_test_protocol {
961 uint8_t buf[32];
962};
963
964
965#define EC_CMD_GET_PROTOCOL_INFO 0x000B
966
967
968
969#define EC_PROTOCOL_INFO_IN_PROGRESS_SUPPORTED (1 << 0)
970
971struct __ec_align4 ec_response_get_protocol_info {
972
973
974
975 uint32_t protocol_versions;
976
977
978 uint16_t max_request_packet_size;
979
980
981 uint16_t max_response_packet_size;
982
983
984 uint32_t flags;
985};
986
987
988
989
990
991
992#define EC_GSV_SET 0x80000000
993
994
995
996#define EC_GSV_PARAM_MASK 0x00ffffff
997
998struct __ec_align4 ec_params_get_set_value {
999 uint32_t flags;
1000 uint32_t value;
1001};
1002
1003struct __ec_align4 ec_response_get_set_value {
1004 uint32_t flags;
1005 uint32_t value;
1006};
1007
1008
1009#define EC_CMD_GSV_PAUSE_IN_S5 0x000C
1010
1011
1012
1013#define EC_CMD_GET_FEATURES 0x000D
1014
1015
1016enum ec_feature_code {
1017
1018
1019
1020
1021 EC_FEATURE_LIMITED = 0,
1022
1023
1024
1025
1026 EC_FEATURE_FLASH = 1,
1027
1028
1029
1030 EC_FEATURE_PWM_FAN = 2,
1031
1032
1033
1034 EC_FEATURE_PWM_KEYB = 3,
1035
1036
1037
1038 EC_FEATURE_LIGHTBAR = 4,
1039
1040 EC_FEATURE_LED = 5,
1041
1042
1043
1044
1045 EC_FEATURE_MOTION_SENSE = 6,
1046
1047 EC_FEATURE_KEYB = 7,
1048
1049 EC_FEATURE_PSTORE = 8,
1050
1051 EC_FEATURE_PORT80 = 9,
1052
1053
1054
1055
1056 EC_FEATURE_THERMAL = 10,
1057
1058 EC_FEATURE_BKLIGHT_SWITCH = 11,
1059
1060 EC_FEATURE_WIFI_SWITCH = 12,
1061
1062 EC_FEATURE_HOST_EVENTS = 13,
1063
1064 EC_FEATURE_GPIO = 14,
1065
1066 EC_FEATURE_I2C = 15,
1067
1068 EC_FEATURE_CHARGER = 16,
1069
1070 EC_FEATURE_BATTERY = 17,
1071
1072
1073
1074
1075 EC_FEATURE_SMART_BATTERY = 18,
1076
1077 EC_FEATURE_HANG_DETECT = 19,
1078
1079 EC_FEATURE_PMU = 20,
1080
1081 EC_FEATURE_SUB_MCU = 21,
1082
1083 EC_FEATURE_USB_PD = 22,
1084
1085 EC_FEATURE_USB_MUX = 23,
1086
1087 EC_FEATURE_MOTION_SENSE_FIFO = 24,
1088
1089 EC_FEATURE_VSTORE = 25,
1090
1091 EC_FEATURE_USBC_SS_MUX_VIRTUAL = 26,
1092
1093 EC_FEATURE_RTC = 27,
1094
1095 EC_FEATURE_FINGERPRINT = 28,
1096
1097 EC_FEATURE_TOUCHPAD = 29,
1098
1099 EC_FEATURE_RWSIG = 30,
1100
1101 EC_FEATURE_DEVICE_EVENT = 31,
1102
1103 EC_FEATURE_UNIFIED_WAKE_MASKS = 32,
1104};
1105
1106#define EC_FEATURE_MASK_0(event_code) (1UL << (event_code % 32))
1107#define EC_FEATURE_MASK_1(event_code) (1UL << (event_code - 32))
1108struct __ec_align4 ec_response_get_features {
1109 uint32_t flags[2];
1110};
1111
1112
1113
1114#define EC_CMD_GET_SKU_ID 0x000E
1115
1116
1117#define EC_CMD_SET_SKU_ID 0x000F
1118
1119struct __ec_align4 ec_sku_id_info {
1120 uint32_t sku_id;
1121};
1122
1123
1124
1125
1126
1127#define EC_CMD_FLASH_INFO 0x0010
1128#define EC_VER_FLASH_INFO 2
1129
1130
1131struct __ec_align4 ec_response_flash_info {
1132
1133 uint32_t flash_size;
1134
1135
1136
1137
1138 uint32_t write_block_size;
1139
1140
1141
1142
1143 uint32_t erase_block_size;
1144
1145
1146
1147
1148 uint32_t protect_block_size;
1149};
1150
1151
1152
1153#define EC_FLASH_INFO_ERASE_TO_0 (1 << 0)
1154
1155
1156
1157
1158
1159
1160#define EC_FLASH_INFO_SELECT_REQUIRED (1 << 1)
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176struct __ec_align4 ec_response_flash_info_1 {
1177
1178 uint32_t flash_size;
1179 uint32_t write_block_size;
1180 uint32_t erase_block_size;
1181 uint32_t protect_block_size;
1182
1183
1184
1185
1186
1187
1188
1189
1190 uint32_t write_ideal_size;
1191
1192
1193 uint32_t flags;
1194};
1195
1196struct __ec_align4 ec_params_flash_info_2 {
1197
1198 uint16_t num_banks_desc;
1199
1200 uint8_t reserved[2];
1201};
1202
1203struct ec_flash_bank {
1204
1205 uint16_t count;
1206
1207 uint8_t size_exp;
1208
1209 uint8_t write_size_exp;
1210
1211 uint8_t erase_size_exp;
1212
1213 uint8_t protect_size_exp;
1214
1215 uint8_t reserved[2];
1216};
1217
1218struct __ec_align4 ec_response_flash_info_2 {
1219
1220 uint32_t flash_size;
1221
1222 uint32_t flags;
1223
1224 uint32_t write_ideal_size;
1225
1226 uint16_t num_banks_total;
1227
1228 uint16_t num_banks_desc;
1229 struct ec_flash_bank banks[0];
1230};
1231
1232
1233
1234
1235
1236
1237#define EC_CMD_FLASH_READ 0x0011
1238
1239struct __ec_align4 ec_params_flash_read {
1240 uint32_t offset;
1241 uint32_t size;
1242};
1243
1244
1245#define EC_CMD_FLASH_WRITE 0x0012
1246#define EC_VER_FLASH_WRITE 1
1247
1248
1249#define EC_FLASH_WRITE_VER0_SIZE 64
1250
1251struct __ec_align4 ec_params_flash_write {
1252 uint32_t offset;
1253 uint32_t size;
1254
1255};
1256
1257
1258#define EC_CMD_FLASH_ERASE 0x0013
1259
1260
1261struct __ec_align4 ec_params_flash_erase {
1262 uint32_t offset;
1263 uint32_t size;
1264};
1265
1266
1267#define EC_VER_FLASH_WRITE 1
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284enum ec_flash_erase_cmd {
1285 FLASH_ERASE_SECTOR,
1286 FLASH_ERASE_SECTOR_ASYNC,
1287 FLASH_ERASE_GET_RESULT,
1288};
1289
1290struct __ec_align4 ec_params_flash_erase_v1 {
1291
1292 uint8_t cmd;
1293
1294 uint8_t reserved;
1295
1296 uint16_t flag;
1297
1298 struct ec_params_flash_erase params;
1299};
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311#define EC_CMD_FLASH_PROTECT 0x0015
1312#define EC_VER_FLASH_PROTECT 1
1313
1314
1315
1316#define EC_FLASH_PROTECT_RO_AT_BOOT (1 << 0)
1317
1318
1319
1320
1321#define EC_FLASH_PROTECT_RO_NOW (1 << 1)
1322
1323#define EC_FLASH_PROTECT_ALL_NOW (1 << 2)
1324
1325#define EC_FLASH_PROTECT_GPIO_ASSERTED (1 << 3)
1326
1327#define EC_FLASH_PROTECT_ERROR_STUCK (1 << 4)
1328
1329
1330
1331
1332
1333#define EC_FLASH_PROTECT_ERROR_INCONSISTENT (1 << 5)
1334
1335#define EC_FLASH_PROTECT_ALL_AT_BOOT (1 << 6)
1336
1337#define EC_FLASH_PROTECT_RW_AT_BOOT (1 << 7)
1338
1339#define EC_FLASH_PROTECT_RW_NOW (1 << 8)
1340
1341#define EC_FLASH_PROTECT_ROLLBACK_AT_BOOT (1 << 9)
1342
1343#define EC_FLASH_PROTECT_ROLLBACK_NOW (1 << 10)
1344
1345struct __ec_align4 ec_params_flash_protect {
1346 uint32_t mask;
1347 uint32_t flags;
1348};
1349
1350struct __ec_align4 ec_response_flash_protect {
1351
1352 uint32_t flags;
1353
1354
1355
1356
1357
1358 uint32_t valid_flags;
1359
1360 uint32_t writable_flags;
1361};
1362
1363
1364
1365
1366
1367
1368
1369#define EC_CMD_FLASH_REGION_INFO 0x0016
1370#define EC_VER_FLASH_REGION_INFO 1
1371
1372enum ec_flash_region {
1373
1374 EC_FLASH_REGION_RO = 0,
1375
1376 EC_FLASH_REGION_ACTIVE,
1377
1378
1379
1380
1381 EC_FLASH_REGION_WP_RO,
1382
1383 EC_FLASH_REGION_UPDATE,
1384
1385 EC_FLASH_REGION_COUNT,
1386};
1387
1388struct __ec_align4 ec_params_flash_region_info {
1389 uint32_t region;
1390};
1391
1392struct __ec_align4 ec_response_flash_region_info {
1393 uint32_t offset;
1394 uint32_t size;
1395};
1396
1397
1398#define EC_CMD_VBNV_CONTEXT 0x0017
1399#define EC_VER_VBNV_CONTEXT 1
1400#define EC_VBNV_BLOCK_SIZE 16
1401#define EC_VBNV_BLOCK_SIZE_V2 64
1402
1403enum ec_vbnvcontext_op {
1404 EC_VBNV_CONTEXT_OP_READ,
1405 EC_VBNV_CONTEXT_OP_WRITE,
1406};
1407
1408struct __ec_align4 ec_params_vbnvcontext {
1409 uint32_t op;
1410 uint8_t block[EC_VBNV_BLOCK_SIZE_V2];
1411};
1412
1413struct __ec_align4 ec_response_vbnvcontext {
1414 uint8_t block[EC_VBNV_BLOCK_SIZE_V2];
1415};
1416
1417
1418
1419#define EC_CMD_FLASH_SPI_INFO 0x0018
1420
1421struct __ec_align1 ec_response_flash_spi_info {
1422
1423 uint8_t jedec[3];
1424
1425
1426 uint8_t reserved0;
1427
1428
1429 uint8_t mfr_dev_id[2];
1430
1431
1432 uint8_t sr1, sr2;
1433};
1434
1435
1436
1437#define EC_CMD_FLASH_SELECT 0x0019
1438
1439struct __ec_align4 ec_params_flash_select {
1440
1441 uint8_t select;
1442};
1443
1444
1445
1446
1447
1448#define EC_CMD_PWM_GET_FAN_TARGET_RPM 0x0020
1449
1450struct __ec_align4 ec_response_pwm_get_fan_rpm {
1451 uint32_t rpm;
1452};
1453
1454
1455#define EC_CMD_PWM_SET_FAN_TARGET_RPM 0x0021
1456
1457
1458struct __ec_align4 ec_params_pwm_set_fan_target_rpm_v0 {
1459 uint32_t rpm;
1460};
1461
1462
1463struct __ec_align_size1 ec_params_pwm_set_fan_target_rpm_v1 {
1464 uint32_t rpm;
1465 uint8_t fan_idx;
1466};
1467
1468
1469
1470#define EC_CMD_PWM_GET_KEYBOARD_BACKLIGHT 0x0022
1471
1472struct __ec_align1 ec_response_pwm_get_keyboard_backlight {
1473 uint8_t percent;
1474 uint8_t enabled;
1475};
1476
1477
1478
1479#define EC_CMD_PWM_SET_KEYBOARD_BACKLIGHT 0x0023
1480
1481struct __ec_align1 ec_params_pwm_set_keyboard_backlight {
1482 uint8_t percent;
1483};
1484
1485
1486#define EC_CMD_PWM_SET_FAN_DUTY 0x0024
1487
1488
1489struct __ec_align4 ec_params_pwm_set_fan_duty_v0 {
1490 uint32_t percent;
1491};
1492
1493
1494struct __ec_align_size1 ec_params_pwm_set_fan_duty_v1 {
1495 uint32_t percent;
1496 uint8_t fan_idx;
1497};
1498
1499#define EC_CMD_PWM_SET_DUTY 0x0025
1500
1501#define EC_PWM_MAX_DUTY 0xffff
1502
1503enum ec_pwm_type {
1504
1505 EC_PWM_TYPE_GENERIC = 0,
1506
1507 EC_PWM_TYPE_KB_LIGHT,
1508
1509 EC_PWM_TYPE_DISPLAY_LIGHT,
1510 EC_PWM_TYPE_COUNT,
1511};
1512
1513struct __ec_align4 ec_params_pwm_set_duty {
1514 uint16_t duty;
1515 uint8_t pwm_type;
1516 uint8_t index;
1517};
1518
1519#define EC_CMD_PWM_GET_DUTY 0x0026
1520
1521struct __ec_align1 ec_params_pwm_get_duty {
1522 uint8_t pwm_type;
1523 uint8_t index;
1524};
1525
1526struct __ec_align2 ec_response_pwm_get_duty {
1527 uint16_t duty;
1528};
1529
1530
1531
1532
1533
1534
1535
1536
1537#define EC_CMD_LIGHTBAR_CMD 0x0028
1538
1539struct __ec_todo_unpacked rgb_s {
1540 uint8_t r, g, b;
1541};
1542
1543#define LB_BATTERY_LEVELS 4
1544
1545
1546
1547struct __ec_todo_packed lightbar_params_v0 {
1548
1549 int32_t google_ramp_up;
1550 int32_t google_ramp_down;
1551 int32_t s3s0_ramp_up;
1552 int32_t s0_tick_delay[2];
1553 int32_t s0a_tick_delay[2];
1554 int32_t s0s3_ramp_down;
1555 int32_t s3_sleep_for;
1556 int32_t s3_ramp_up;
1557 int32_t s3_ramp_down;
1558
1559
1560 uint8_t new_s0;
1561 uint8_t osc_min[2];
1562 uint8_t osc_max[2];
1563 uint8_t w_ofs[2];
1564
1565
1566 uint8_t bright_bl_off_fixed[2];
1567 uint8_t bright_bl_on_min[2];
1568 uint8_t bright_bl_on_max[2];
1569
1570
1571 uint8_t battery_threshold[LB_BATTERY_LEVELS - 1];
1572
1573
1574 uint8_t s0_idx[2][LB_BATTERY_LEVELS];
1575 uint8_t s3_idx[2][LB_BATTERY_LEVELS];
1576
1577
1578 struct rgb_s color[8];
1579};
1580
1581struct __ec_todo_packed lightbar_params_v1 {
1582
1583 int32_t google_ramp_up;
1584 int32_t google_ramp_down;
1585 int32_t s3s0_ramp_up;
1586 int32_t s0_tick_delay[2];
1587 int32_t s0a_tick_delay[2];
1588 int32_t s0s3_ramp_down;
1589 int32_t s3_sleep_for;
1590 int32_t s3_ramp_up;
1591 int32_t s3_ramp_down;
1592 int32_t s5_ramp_up;
1593 int32_t s5_ramp_down;
1594 int32_t tap_tick_delay;
1595 int32_t tap_gate_delay;
1596 int32_t tap_display_time;
1597
1598
1599 uint8_t tap_pct_red;
1600 uint8_t tap_pct_green;
1601 uint8_t tap_seg_min_on;
1602 uint8_t tap_seg_max_on;
1603 uint8_t tap_seg_osc;
1604 uint8_t tap_idx[3];
1605
1606
1607 uint8_t osc_min[2];
1608 uint8_t osc_max[2];
1609 uint8_t w_ofs[2];
1610
1611
1612 uint8_t bright_bl_off_fixed[2];
1613 uint8_t bright_bl_on_min[2];
1614 uint8_t bright_bl_on_max[2];
1615
1616
1617 uint8_t battery_threshold[LB_BATTERY_LEVELS - 1];
1618
1619
1620 uint8_t s0_idx[2][LB_BATTERY_LEVELS];
1621 uint8_t s3_idx[2][LB_BATTERY_LEVELS];
1622
1623
1624 uint8_t s5_idx;
1625
1626
1627 struct rgb_s color[8];
1628};
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639struct __ec_todo_packed lightbar_params_v2_timing {
1640
1641 int32_t google_ramp_up;
1642 int32_t google_ramp_down;
1643 int32_t s3s0_ramp_up;
1644 int32_t s0_tick_delay[2];
1645 int32_t s0a_tick_delay[2];
1646 int32_t s0s3_ramp_down;
1647 int32_t s3_sleep_for;
1648 int32_t s3_ramp_up;
1649 int32_t s3_ramp_down;
1650 int32_t s5_ramp_up;
1651 int32_t s5_ramp_down;
1652 int32_t tap_tick_delay;
1653 int32_t tap_gate_delay;
1654 int32_t tap_display_time;
1655};
1656
1657struct __ec_todo_packed lightbar_params_v2_tap {
1658
1659 uint8_t tap_pct_red;
1660 uint8_t tap_pct_green;
1661 uint8_t tap_seg_min_on;
1662 uint8_t tap_seg_max_on;
1663 uint8_t tap_seg_osc;
1664 uint8_t tap_idx[3];
1665};
1666
1667struct __ec_todo_packed lightbar_params_v2_oscillation {
1668
1669 uint8_t osc_min[2];
1670 uint8_t osc_max[2];
1671 uint8_t w_ofs[2];
1672};
1673
1674struct __ec_todo_packed lightbar_params_v2_brightness {
1675
1676 uint8_t bright_bl_off_fixed[2];
1677 uint8_t bright_bl_on_min[2];
1678 uint8_t bright_bl_on_max[2];
1679};
1680
1681struct __ec_todo_packed lightbar_params_v2_thresholds {
1682
1683 uint8_t battery_threshold[LB_BATTERY_LEVELS - 1];
1684};
1685
1686struct __ec_todo_packed lightbar_params_v2_colors {
1687
1688 uint8_t s0_idx[2][LB_BATTERY_LEVELS];
1689 uint8_t s3_idx[2][LB_BATTERY_LEVELS];
1690
1691
1692 uint8_t s5_idx;
1693
1694
1695 struct rgb_s color[8];
1696};
1697
1698
1699#define EC_LB_PROG_LEN 192
1700struct __ec_todo_unpacked lightbar_program {
1701 uint8_t size;
1702 uint8_t data[EC_LB_PROG_LEN];
1703};
1704
1705struct __ec_todo_packed ec_params_lightbar {
1706 uint8_t cmd;
1707 union {
1708 struct __ec_todo_unpacked {
1709
1710 } dump, off, on, init, get_seq, get_params_v0, get_params_v1,
1711 version, get_brightness, get_demo, suspend, resume,
1712 get_params_v2_timing, get_params_v2_tap,
1713 get_params_v2_osc, get_params_v2_bright,
1714 get_params_v2_thlds, get_params_v2_colors;
1715
1716 struct __ec_todo_unpacked {
1717 uint8_t num;
1718 } set_brightness, seq, demo;
1719
1720 struct __ec_todo_unpacked {
1721 uint8_t ctrl, reg, value;
1722 } reg;
1723
1724 struct __ec_todo_unpacked {
1725 uint8_t led, red, green, blue;
1726 } set_rgb;
1727
1728 struct __ec_todo_unpacked {
1729 uint8_t led;
1730 } get_rgb;
1731
1732 struct __ec_todo_unpacked {
1733 uint8_t enable;
1734 } manual_suspend_ctrl;
1735
1736 struct lightbar_params_v0 set_params_v0;
1737 struct lightbar_params_v1 set_params_v1;
1738
1739 struct lightbar_params_v2_timing set_v2par_timing;
1740 struct lightbar_params_v2_tap set_v2par_tap;
1741 struct lightbar_params_v2_oscillation set_v2par_osc;
1742 struct lightbar_params_v2_brightness set_v2par_bright;
1743 struct lightbar_params_v2_thresholds set_v2par_thlds;
1744 struct lightbar_params_v2_colors set_v2par_colors;
1745
1746 struct lightbar_program set_program;
1747 };
1748};
1749
1750struct __ec_todo_packed ec_response_lightbar {
1751 union {
1752 struct __ec_todo_unpacked {
1753 struct __ec_todo_unpacked {
1754 uint8_t reg;
1755 uint8_t ic0;
1756 uint8_t ic1;
1757 } vals[23];
1758 } dump;
1759
1760 struct __ec_todo_unpacked {
1761 uint8_t num;
1762 } get_seq, get_brightness, get_demo;
1763
1764 struct lightbar_params_v0 get_params_v0;
1765 struct lightbar_params_v1 get_params_v1;
1766
1767
1768 struct lightbar_params_v2_timing get_params_v2_timing;
1769 struct lightbar_params_v2_tap get_params_v2_tap;
1770 struct lightbar_params_v2_oscillation get_params_v2_osc;
1771 struct lightbar_params_v2_brightness get_params_v2_bright;
1772 struct lightbar_params_v2_thresholds get_params_v2_thlds;
1773 struct lightbar_params_v2_colors get_params_v2_colors;
1774
1775 struct __ec_todo_unpacked {
1776 uint32_t num;
1777 uint32_t flags;
1778 } version;
1779
1780 struct __ec_todo_unpacked {
1781 uint8_t red, green, blue;
1782 } get_rgb;
1783
1784 struct __ec_todo_unpacked {
1785
1786 } off, on, init, set_brightness, seq, reg, set_rgb,
1787 demo, set_params_v0, set_params_v1,
1788 set_program, manual_suspend_ctrl, suspend, resume,
1789 set_v2par_timing, set_v2par_tap,
1790 set_v2par_osc, set_v2par_bright, set_v2par_thlds,
1791 set_v2par_colors;
1792 };
1793};
1794
1795
1796enum lightbar_command {
1797 LIGHTBAR_CMD_DUMP = 0,
1798 LIGHTBAR_CMD_OFF = 1,
1799 LIGHTBAR_CMD_ON = 2,
1800 LIGHTBAR_CMD_INIT = 3,
1801 LIGHTBAR_CMD_SET_BRIGHTNESS = 4,
1802 LIGHTBAR_CMD_SEQ = 5,
1803 LIGHTBAR_CMD_REG = 6,
1804 LIGHTBAR_CMD_SET_RGB = 7,
1805 LIGHTBAR_CMD_GET_SEQ = 8,
1806 LIGHTBAR_CMD_DEMO = 9,
1807 LIGHTBAR_CMD_GET_PARAMS_V0 = 10,
1808 LIGHTBAR_CMD_SET_PARAMS_V0 = 11,
1809 LIGHTBAR_CMD_VERSION = 12,
1810 LIGHTBAR_CMD_GET_BRIGHTNESS = 13,
1811 LIGHTBAR_CMD_GET_RGB = 14,
1812 LIGHTBAR_CMD_GET_DEMO = 15,
1813 LIGHTBAR_CMD_GET_PARAMS_V1 = 16,
1814 LIGHTBAR_CMD_SET_PARAMS_V1 = 17,
1815 LIGHTBAR_CMD_SET_PROGRAM = 18,
1816 LIGHTBAR_CMD_MANUAL_SUSPEND_CTRL = 19,
1817 LIGHTBAR_CMD_SUSPEND = 20,
1818 LIGHTBAR_CMD_RESUME = 21,
1819 LIGHTBAR_CMD_GET_PARAMS_V2_TIMING = 22,
1820 LIGHTBAR_CMD_SET_PARAMS_V2_TIMING = 23,
1821 LIGHTBAR_CMD_GET_PARAMS_V2_TAP = 24,
1822 LIGHTBAR_CMD_SET_PARAMS_V2_TAP = 25,
1823 LIGHTBAR_CMD_GET_PARAMS_V2_OSCILLATION = 26,
1824 LIGHTBAR_CMD_SET_PARAMS_V2_OSCILLATION = 27,
1825 LIGHTBAR_CMD_GET_PARAMS_V2_BRIGHTNESS = 28,
1826 LIGHTBAR_CMD_SET_PARAMS_V2_BRIGHTNESS = 29,
1827 LIGHTBAR_CMD_GET_PARAMS_V2_THRESHOLDS = 30,
1828 LIGHTBAR_CMD_SET_PARAMS_V2_THRESHOLDS = 31,
1829 LIGHTBAR_CMD_GET_PARAMS_V2_COLORS = 32,
1830 LIGHTBAR_CMD_SET_PARAMS_V2_COLORS = 33,
1831 LIGHTBAR_NUM_CMDS
1832};
1833
1834
1835
1836
1837#define EC_CMD_LED_CONTROL 0x0029
1838
1839enum ec_led_id {
1840
1841 EC_LED_ID_BATTERY_LED = 0,
1842
1843
1844
1845
1846 EC_LED_ID_POWER_LED,
1847
1848 EC_LED_ID_ADAPTER_LED,
1849
1850 EC_LED_ID_LEFT_LED,
1851
1852 EC_LED_ID_RIGHT_LED,
1853
1854 EC_LED_ID_RECOVERY_HW_REINIT_LED,
1855
1856 EC_LED_ID_SYSRQ_DEBUG_LED,
1857
1858 EC_LED_ID_COUNT
1859};
1860
1861
1862#define EC_LED_FLAGS_QUERY (1 << 0)
1863#define EC_LED_FLAGS_AUTO (1 << 1)
1864
1865enum ec_led_colors {
1866 EC_LED_COLOR_RED = 0,
1867 EC_LED_COLOR_GREEN,
1868 EC_LED_COLOR_BLUE,
1869 EC_LED_COLOR_YELLOW,
1870 EC_LED_COLOR_WHITE,
1871 EC_LED_COLOR_AMBER,
1872
1873 EC_LED_COLOR_COUNT
1874};
1875
1876struct __ec_align1 ec_params_led_control {
1877 uint8_t led_id;
1878 uint8_t flags;
1879
1880 uint8_t brightness[EC_LED_COLOR_COUNT];
1881};
1882
1883struct __ec_align1 ec_response_led_control {
1884
1885
1886
1887
1888
1889
1890
1891 uint8_t brightness_range[EC_LED_COLOR_COUNT];
1892};
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903#define EC_CMD_VBOOT_HASH 0x002A
1904
1905struct __ec_align4 ec_params_vboot_hash {
1906 uint8_t cmd;
1907 uint8_t hash_type;
1908 uint8_t nonce_size;
1909 uint8_t reserved0;
1910 uint32_t offset;
1911 uint32_t size;
1912 uint8_t nonce_data[64];
1913};
1914
1915struct __ec_align4 ec_response_vboot_hash {
1916 uint8_t status;
1917 uint8_t hash_type;
1918 uint8_t digest_size;
1919 uint8_t reserved0;
1920 uint32_t offset;
1921 uint32_t size;
1922 uint8_t hash_digest[64];
1923};
1924
1925enum ec_vboot_hash_cmd {
1926 EC_VBOOT_HASH_GET = 0,
1927 EC_VBOOT_HASH_ABORT = 1,
1928 EC_VBOOT_HASH_START = 2,
1929 EC_VBOOT_HASH_RECALC = 3,
1930};
1931
1932enum ec_vboot_hash_type {
1933 EC_VBOOT_HASH_TYPE_SHA256 = 0,
1934};
1935
1936enum ec_vboot_hash_status {
1937 EC_VBOOT_HASH_STATUS_NONE = 0,
1938 EC_VBOOT_HASH_STATUS_DONE = 1,
1939 EC_VBOOT_HASH_STATUS_BUSY = 2,
1940};
1941
1942
1943
1944
1945
1946
1947#define EC_VBOOT_HASH_OFFSET_RO 0xfffffffe
1948#define EC_VBOOT_HASH_OFFSET_ACTIVE 0xfffffffd
1949#define EC_VBOOT_HASH_OFFSET_UPDATE 0xfffffffc
1950
1951
1952
1953
1954
1955
1956#define EC_CMD_MOTION_SENSE_CMD 0x002B
1957
1958
1959enum motionsense_command {
1960
1961
1962
1963
1964 MOTIONSENSE_CMD_DUMP = 0,
1965
1966
1967
1968
1969
1970
1971 MOTIONSENSE_CMD_INFO = 1,
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983 MOTIONSENSE_CMD_EC_RATE = 2,
1984
1985
1986
1987
1988
1989 MOTIONSENSE_CMD_SENSOR_ODR = 3,
1990
1991
1992
1993
1994
1995 MOTIONSENSE_CMD_SENSOR_RANGE = 4,
1996
1997
1998
1999
2000
2001
2002
2003
2004 MOTIONSENSE_CMD_KB_WAKE_ANGLE = 5,
2005
2006
2007
2008
2009 MOTIONSENSE_CMD_DATA = 6,
2010
2011
2012
2013
2014 MOTIONSENSE_CMD_FIFO_INFO = 7,
2015
2016
2017
2018
2019
2020 MOTIONSENSE_CMD_FIFO_FLUSH = 8,
2021
2022
2023
2024
2025 MOTIONSENSE_CMD_FIFO_READ = 9,
2026
2027
2028
2029
2030
2031 MOTIONSENSE_CMD_PERFORM_CALIB = 10,
2032
2033
2034
2035
2036
2037
2038
2039 MOTIONSENSE_CMD_SENSOR_OFFSET = 11,
2040
2041
2042
2043
2044
2045 MOTIONSENSE_CMD_LIST_ACTIVITIES = 12,
2046
2047
2048
2049
2050
2051 MOTIONSENSE_CMD_SET_ACTIVITY = 13,
2052
2053
2054
2055
2056 MOTIONSENSE_CMD_LID_ANGLE = 14,
2057
2058
2059
2060
2061
2062
2063 MOTIONSENSE_CMD_FIFO_INT_ENABLE = 15,
2064
2065
2066
2067
2068
2069 MOTIONSENSE_CMD_SPOOF = 16,
2070
2071
2072 MOTIONSENSE_NUM_CMDS
2073};
2074
2075
2076enum motionsensor_type {
2077 MOTIONSENSE_TYPE_ACCEL = 0,
2078 MOTIONSENSE_TYPE_GYRO = 1,
2079 MOTIONSENSE_TYPE_MAG = 2,
2080 MOTIONSENSE_TYPE_PROX = 3,
2081 MOTIONSENSE_TYPE_LIGHT = 4,
2082 MOTIONSENSE_TYPE_ACTIVITY = 5,
2083 MOTIONSENSE_TYPE_BARO = 6,
2084 MOTIONSENSE_TYPE_MAX,
2085};
2086
2087
2088enum motionsensor_location {
2089 MOTIONSENSE_LOC_BASE = 0,
2090 MOTIONSENSE_LOC_LID = 1,
2091 MOTIONSENSE_LOC_MAX,
2092};
2093
2094
2095enum motionsensor_chip {
2096 MOTIONSENSE_CHIP_KXCJ9 = 0,
2097 MOTIONSENSE_CHIP_LSM6DS0 = 1,
2098 MOTIONSENSE_CHIP_BMI160 = 2,
2099 MOTIONSENSE_CHIP_SI1141 = 3,
2100 MOTIONSENSE_CHIP_SI1142 = 4,
2101 MOTIONSENSE_CHIP_SI1143 = 5,
2102 MOTIONSENSE_CHIP_KX022 = 6,
2103 MOTIONSENSE_CHIP_L3GD20H = 7,
2104 MOTIONSENSE_CHIP_BMA255 = 8,
2105 MOTIONSENSE_CHIP_BMP280 = 9,
2106 MOTIONSENSE_CHIP_OPT3001 = 10,
2107};
2108
2109struct __ec_todo_packed ec_response_motion_sensor_data {
2110
2111 uint8_t flags;
2112
2113 uint8_t sensor_num;
2114
2115 union {
2116 int16_t data[3];
2117 struct __ec_todo_packed {
2118 uint16_t reserved;
2119 uint32_t timestamp;
2120 };
2121 struct __ec_todo_unpacked {
2122 uint8_t activity;
2123 uint8_t state;
2124 int16_t add_info[2];
2125 };
2126 };
2127};
2128
2129
2130struct __ec_todo_packed ec_response_motion_sense_fifo_info {
2131
2132 uint16_t size;
2133
2134 uint16_t count;
2135
2136 uint32_t timestamp;
2137
2138 uint16_t total_lost;
2139
2140 uint16_t lost[0];
2141};
2142
2143struct __ec_todo_packed ec_response_motion_sense_fifo_data {
2144 uint32_t number_data;
2145 struct ec_response_motion_sensor_data data[0];
2146};
2147
2148
2149enum motionsensor_activity {
2150 MOTIONSENSE_ACTIVITY_RESERVED = 0,
2151 MOTIONSENSE_ACTIVITY_SIG_MOTION = 1,
2152 MOTIONSENSE_ACTIVITY_DOUBLE_TAP = 2,
2153};
2154
2155struct __ec_todo_unpacked ec_motion_sense_activity {
2156 uint8_t sensor_num;
2157 uint8_t activity;
2158 uint8_t enable;
2159 uint8_t reserved;
2160 uint16_t parameters[3];
2161};
2162
2163
2164#define MOTIONSENSE_MODULE_FLAG_ACTIVE (1<<0)
2165
2166
2167#define MOTIONSENSE_SENSOR_FLAG_PRESENT (1<<0)
2168
2169
2170
2171
2172
2173#define MOTIONSENSE_SENSOR_FLAG_FLUSH (1<<0)
2174#define MOTIONSENSE_SENSOR_FLAG_TIMESTAMP (1<<1)
2175#define MOTIONSENSE_SENSOR_FLAG_WAKEUP (1<<2)
2176#define MOTIONSENSE_SENSOR_FLAG_TABLET_MODE (1<<3)
2177
2178
2179
2180
2181
2182
2183#define EC_MOTION_SENSE_NO_VALUE -1
2184
2185#define EC_MOTION_SENSE_INVALID_CALIB_TEMP 0x8000
2186
2187
2188
2189#define MOTION_SENSE_SET_OFFSET 1
2190
2191#define LID_ANGLE_UNRELIABLE 500
2192
2193enum motionsense_spoof_mode {
2194
2195 MOTIONSENSE_SPOOF_MODE_DISABLE = 0,
2196
2197
2198 MOTIONSENSE_SPOOF_MODE_CUSTOM,
2199
2200
2201 MOTIONSENSE_SPOOF_MODE_LOCK_CURRENT,
2202
2203
2204 MOTIONSENSE_SPOOF_MODE_QUERY,
2205};
2206
2207struct __ec_todo_packed ec_params_motion_sense {
2208 uint8_t cmd;
2209 union {
2210
2211 struct __ec_todo_unpacked {
2212
2213
2214
2215
2216
2217 uint8_t max_sensor_count;
2218 } dump;
2219
2220
2221
2222
2223 struct __ec_todo_unpacked {
2224
2225
2226
2227 int16_t data;
2228 } kb_wake_angle;
2229
2230
2231
2232 struct __ec_todo_unpacked {
2233 uint8_t sensor_num;
2234 } info, info_3, data, fifo_flush, perform_calib,
2235 list_activities;
2236
2237
2238
2239
2240
2241 struct __ec_todo_unpacked {
2242 uint8_t sensor_num;
2243
2244
2245 uint8_t roundup;
2246
2247 uint16_t reserved;
2248
2249
2250 int32_t data;
2251 } ec_rate, sensor_odr, sensor_range;
2252
2253
2254 struct __ec_todo_packed {
2255 uint8_t sensor_num;
2256
2257
2258
2259
2260
2261
2262 uint16_t flags;
2263
2264
2265
2266
2267
2268
2269
2270 int16_t temp;
2271
2272
2273
2274
2275
2276
2277
2278
2279 int16_t offset[3];
2280 } sensor_offset;
2281
2282
2283 struct __ec_todo_unpacked {
2284 } fifo_info;
2285
2286
2287 struct __ec_todo_unpacked {
2288
2289
2290
2291
2292 uint32_t max_data_vector;
2293 } fifo_read;
2294
2295 struct ec_motion_sense_activity set_activity;
2296
2297
2298 struct __ec_todo_unpacked {
2299 } lid_angle;
2300
2301
2302 struct __ec_todo_unpacked {
2303
2304
2305
2306
2307 int8_t enable;
2308 } fifo_int_enable;
2309
2310
2311 struct __ec_todo_packed {
2312 uint8_t sensor_id;
2313
2314
2315 uint8_t spoof_enable;
2316
2317
2318 uint8_t reserved;
2319
2320
2321 int16_t components[3];
2322 } spoof;
2323 };
2324};
2325
2326struct __ec_todo_packed ec_response_motion_sense {
2327 union {
2328
2329 struct __ec_todo_unpacked {
2330
2331 uint8_t module_flags;
2332
2333
2334 uint8_t sensor_count;
2335
2336
2337
2338
2339
2340 struct ec_response_motion_sensor_data sensor[0];
2341 } dump;
2342
2343
2344 struct __ec_todo_unpacked {
2345
2346 uint8_t type;
2347
2348
2349 uint8_t location;
2350
2351
2352 uint8_t chip;
2353 } info;
2354
2355
2356 struct __ec_todo_unpacked {
2357
2358 uint8_t type;
2359
2360
2361 uint8_t location;
2362
2363
2364 uint8_t chip;
2365
2366
2367 uint32_t min_frequency;
2368
2369
2370 uint32_t max_frequency;
2371
2372
2373 uint32_t fifo_max_event_count;
2374 } info_3;
2375
2376
2377 struct ec_response_motion_sensor_data data;
2378
2379
2380
2381
2382
2383
2384
2385
2386 struct __ec_todo_unpacked {
2387
2388 int32_t ret;
2389 } ec_rate, sensor_odr, sensor_range, kb_wake_angle,
2390 fifo_int_enable, spoof;
2391
2392
2393 struct __ec_todo_unpacked {
2394 int16_t temp;
2395 int16_t offset[3];
2396 } sensor_offset, perform_calib;
2397
2398 struct ec_response_motion_sense_fifo_info fifo_info, fifo_flush;
2399
2400 struct ec_response_motion_sense_fifo_data fifo_read;
2401
2402 struct __ec_todo_packed {
2403 uint16_t reserved;
2404 uint32_t enabled;
2405 uint32_t disabled;
2406 } list_activities;
2407
2408 struct __ec_todo_unpacked {
2409 } set_activity;
2410
2411
2412 struct __ec_todo_unpacked {
2413
2414
2415
2416
2417 uint16_t value;
2418 } lid_angle;
2419 };
2420};
2421
2422
2423
2424
2425
2426#define EC_CMD_FORCE_LID_OPEN 0x002C
2427
2428struct __ec_align1 ec_params_force_lid_open {
2429 uint8_t enabled;
2430};
2431
2432
2433
2434#define EC_CMD_CONFIG_POWER_BUTTON 0x002D
2435
2436enum ec_config_power_button_flags {
2437
2438 EC_POWER_BUTTON_ENABLE_PULSE = (1 << 0),
2439};
2440
2441struct __ec_align1 ec_params_config_power_button {
2442
2443 uint8_t flags;
2444};
2445
2446
2447
2448
2449
2450#define EC_CMD_USB_CHARGE_SET_MODE 0x0030
2451
2452struct __ec_align1 ec_params_usb_charge_set_mode {
2453 uint8_t usb_port_id;
2454 uint8_t mode;
2455};
2456
2457
2458
2459
2460
2461#define EC_PSTORE_SIZE_MAX 64
2462
2463
2464#define EC_CMD_PSTORE_INFO 0x0040
2465
2466struct __ec_align4 ec_response_pstore_info {
2467
2468 uint32_t pstore_size;
2469
2470 uint32_t access_size;
2471};
2472
2473
2474
2475
2476
2477
2478#define EC_CMD_PSTORE_READ 0x0041
2479
2480struct __ec_align4 ec_params_pstore_read {
2481 uint32_t offset;
2482 uint32_t size;
2483};
2484
2485
2486#define EC_CMD_PSTORE_WRITE 0x0042
2487
2488struct __ec_align4 ec_params_pstore_write {
2489 uint32_t offset;
2490 uint32_t size;
2491 uint8_t data[EC_PSTORE_SIZE_MAX];
2492};
2493
2494
2495
2496
2497
2498struct __ec_align4 ec_params_rtc {
2499 uint32_t time;
2500};
2501
2502struct __ec_align4 ec_response_rtc {
2503 uint32_t time;
2504};
2505
2506
2507#define EC_CMD_RTC_GET_VALUE 0x0044
2508#define EC_CMD_RTC_GET_ALARM 0x0045
2509
2510
2511#define EC_CMD_RTC_SET_VALUE 0x0046
2512#define EC_CMD_RTC_SET_ALARM 0x0047
2513
2514
2515#define EC_RTC_ALARM_CLEAR 0
2516
2517
2518
2519
2520
2521#define EC_PORT80_SIZE_MAX 32
2522
2523
2524#define EC_CMD_PORT80_LAST_BOOT 0x0048
2525#define EC_CMD_PORT80_READ 0x0048
2526
2527enum ec_port80_subcmd {
2528 EC_PORT80_GET_INFO = 0,
2529 EC_PORT80_READ_BUFFER,
2530};
2531
2532struct __ec_todo_packed ec_params_port80_read {
2533 uint16_t subcmd;
2534 union {
2535 struct __ec_todo_unpacked {
2536 uint32_t offset;
2537 uint32_t num_entries;
2538 } read_buffer;
2539 };
2540};
2541
2542struct __ec_todo_packed ec_response_port80_read {
2543 union {
2544 struct __ec_todo_unpacked {
2545 uint32_t writes;
2546 uint32_t history_size;
2547 uint32_t last_boot;
2548 } get_info;
2549 struct __ec_todo_unpacked {
2550 uint16_t codes[EC_PORT80_SIZE_MAX];
2551 } data;
2552 };
2553};
2554
2555struct __ec_align2 ec_response_port80_last_boot {
2556 uint16_t code;
2557};
2558
2559
2560
2561
2562
2563#define EC_VSTORE_SLOT_SIZE 64
2564
2565
2566#define EC_VSTORE_SLOT_MAX 32
2567
2568
2569#define EC_CMD_VSTORE_INFO 0x0049
2570struct __ec_align_size1 ec_response_vstore_info {
2571
2572 uint32_t slot_locked;
2573
2574 uint8_t slot_count;
2575};
2576
2577
2578
2579
2580
2581
2582#define EC_CMD_VSTORE_READ 0x004A
2583
2584struct __ec_align1 ec_params_vstore_read {
2585 uint8_t slot;
2586};
2587
2588struct __ec_align1 ec_response_vstore_read {
2589 uint8_t data[EC_VSTORE_SLOT_SIZE];
2590};
2591
2592
2593
2594
2595#define EC_CMD_VSTORE_WRITE 0x004B
2596
2597struct __ec_align1 ec_params_vstore_write {
2598 uint8_t slot;
2599 uint8_t data[EC_VSTORE_SLOT_SIZE];
2600};
2601
2602
2603
2604
2605
2606
2607
2608
2609#define EC_CMD_THERMAL_SET_THRESHOLD 0x0050
2610#define EC_CMD_THERMAL_GET_THRESHOLD 0x0051
2611
2612
2613
2614
2615
2616
2617struct __ec_align2 ec_params_thermal_set_threshold {
2618 uint8_t sensor_type;
2619 uint8_t threshold_id;
2620 uint16_t value;
2621};
2622
2623
2624struct __ec_align1 ec_params_thermal_get_threshold {
2625 uint8_t sensor_type;
2626 uint8_t threshold_id;
2627};
2628
2629struct __ec_align2 ec_response_thermal_get_threshold {
2630 uint16_t value;
2631};
2632
2633
2634
2635enum ec_temp_thresholds {
2636 EC_TEMP_THRESH_WARN = 0,
2637 EC_TEMP_THRESH_HIGH,
2638 EC_TEMP_THRESH_HALT,
2639
2640 EC_TEMP_THRESH_COUNT
2641};
2642
2643
2644
2645
2646
2647
2648
2649
2650struct __ec_align4 ec_thermal_config {
2651 uint32_t temp_host[EC_TEMP_THRESH_COUNT];
2652 uint32_t temp_fan_off;
2653 uint32_t temp_fan_max;
2654};
2655
2656
2657struct __ec_align4 ec_params_thermal_get_threshold_v1 {
2658 uint32_t sensor_num;
2659};
2660
2661
2662
2663
2664struct __ec_align4 ec_params_thermal_set_threshold_v1 {
2665 uint32_t sensor_num;
2666 struct ec_thermal_config cfg;
2667};
2668
2669
2670
2671
2672
2673#define EC_CMD_THERMAL_AUTO_FAN_CTRL 0x0052
2674
2675
2676struct __ec_align1 ec_params_auto_fan_ctrl_v1 {
2677 uint8_t fan_idx;
2678};
2679
2680
2681#define EC_CMD_TMP006_GET_CALIBRATION 0x0053
2682#define EC_CMD_TMP006_SET_CALIBRATION 0x0054
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694struct __ec_align1 ec_params_tmp006_get_calibration {
2695 uint8_t index;
2696};
2697
2698
2699struct __ec_align4 ec_response_tmp006_get_calibration_v0 {
2700 float s0;
2701 float b0;
2702 float b1;
2703 float b2;
2704};
2705
2706struct __ec_align4 ec_params_tmp006_set_calibration_v0 {
2707 uint8_t index;
2708 uint8_t reserved[3];
2709 float s0;
2710 float b0;
2711 float b1;
2712 float b2;
2713};
2714
2715
2716struct __ec_align4 ec_response_tmp006_get_calibration_v1 {
2717 uint8_t algorithm;
2718 uint8_t num_params;
2719 uint8_t reserved[2];
2720 float val[0];
2721};
2722
2723struct __ec_align4 ec_params_tmp006_set_calibration_v1 {
2724 uint8_t index;
2725 uint8_t algorithm;
2726 uint8_t num_params;
2727 uint8_t reserved;
2728 float val[0];
2729};
2730
2731
2732
2733#define EC_CMD_TMP006_GET_RAW 0x0055
2734
2735struct __ec_align1 ec_params_tmp006_get_raw {
2736 uint8_t index;
2737};
2738
2739struct __ec_align4 ec_response_tmp006_get_raw {
2740 int32_t t;
2741 int32_t v;
2742};
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757#define EC_CMD_MKBP_STATE 0x0060
2758
2759
2760
2761
2762#define EC_CMD_MKBP_INFO 0x0061
2763
2764struct __ec_align_size1 ec_response_mkbp_info {
2765 uint32_t rows;
2766 uint32_t cols;
2767
2768 uint8_t reserved;
2769};
2770
2771struct __ec_align1 ec_params_mkbp_info {
2772 uint8_t info_type;
2773 uint8_t event_type;
2774};
2775
2776enum ec_mkbp_info_type {
2777
2778
2779
2780
2781
2782 EC_MKBP_INFO_KBD = 0,
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793 EC_MKBP_INFO_SUPPORTED = 1,
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812 EC_MKBP_INFO_CURRENT = 2,
2813};
2814
2815
2816#define EC_CMD_MKBP_SIMULATE_KEY 0x0062
2817
2818struct __ec_align1 ec_params_mkbp_simulate_key {
2819 uint8_t col;
2820 uint8_t row;
2821 uint8_t pressed;
2822};
2823
2824
2825#define EC_CMD_MKBP_SET_CONFIG 0x0064
2826#define EC_CMD_MKBP_GET_CONFIG 0x0065
2827
2828
2829enum mkbp_config_flags {
2830 EC_MKBP_FLAGS_ENABLE = 1,
2831};
2832
2833enum mkbp_config_valid {
2834 EC_MKBP_VALID_SCAN_PERIOD = 1 << 0,
2835 EC_MKBP_VALID_POLL_TIMEOUT = 1 << 1,
2836 EC_MKBP_VALID_MIN_POST_SCAN_DELAY = 1 << 3,
2837 EC_MKBP_VALID_OUTPUT_SETTLE = 1 << 4,
2838 EC_MKBP_VALID_DEBOUNCE_DOWN = 1 << 5,
2839 EC_MKBP_VALID_DEBOUNCE_UP = 1 << 6,
2840 EC_MKBP_VALID_FIFO_MAX_DEPTH = 1 << 7,
2841};
2842
2843
2844
2845
2846
2847
2848
2849struct __ec_align_size1 ec_mkbp_config {
2850 uint32_t valid_mask;
2851 uint8_t flags;
2852 uint8_t valid_flags;
2853 uint16_t scan_period_us;
2854
2855 uint32_t poll_timeout_us;
2856
2857
2858
2859
2860
2861 uint16_t min_post_scan_delay_us;
2862
2863 uint16_t output_settle_us;
2864 uint16_t debounce_down_us;
2865 uint16_t debounce_up_us;
2866
2867 uint8_t fifo_max_depth;
2868};
2869
2870struct __ec_align_size1 ec_params_mkbp_set_config {
2871 struct ec_mkbp_config config;
2872};
2873
2874struct __ec_align_size1 ec_response_mkbp_get_config {
2875 struct ec_mkbp_config config;
2876};
2877
2878
2879#define EC_CMD_KEYSCAN_SEQ_CTRL 0x0066
2880
2881enum ec_keyscan_seq_cmd {
2882 EC_KEYSCAN_SEQ_STATUS = 0,
2883 EC_KEYSCAN_SEQ_CLEAR = 1,
2884 EC_KEYSCAN_SEQ_ADD = 2,
2885 EC_KEYSCAN_SEQ_START = 3,
2886 EC_KEYSCAN_SEQ_COLLECT = 4,
2887};
2888
2889enum ec_collect_flags {
2890
2891
2892
2893
2894 EC_KEYSCAN_SEQ_FLAG_DONE = 1 << 0,
2895};
2896
2897struct __ec_align1 ec_collect_item {
2898 uint8_t flags;
2899};
2900
2901struct __ec_todo_packed ec_params_keyscan_seq_ctrl {
2902 uint8_t cmd;
2903 union {
2904 struct __ec_align1 {
2905 uint8_t active;
2906 uint8_t num_items;
2907
2908 uint8_t cur_item;
2909 } status;
2910 struct __ec_todo_unpacked {
2911
2912
2913
2914
2915 uint32_t time_us;
2916 uint8_t scan[0];
2917 } add;
2918 struct __ec_align1 {
2919 uint8_t start_item;
2920 uint8_t num_items;
2921 } collect;
2922 };
2923};
2924
2925struct __ec_todo_packed ec_result_keyscan_seq_ctrl {
2926 union {
2927 struct __ec_todo_unpacked {
2928 uint8_t num_items;
2929
2930 struct ec_collect_item item[0];
2931 } collect;
2932 };
2933};
2934
2935
2936
2937
2938
2939
2940#define EC_CMD_GET_NEXT_EVENT 0x0067
2941
2942enum ec_mkbp_event {
2943
2944 EC_MKBP_EVENT_KEY_MATRIX = 0,
2945
2946
2947 EC_MKBP_EVENT_HOST_EVENT = 1,
2948
2949
2950 EC_MKBP_EVENT_SENSOR_FIFO = 2,
2951
2952
2953 EC_MKBP_EVENT_BUTTON = 3,
2954
2955
2956 EC_MKBP_EVENT_SWITCH = 4,
2957
2958
2959 EC_MKBP_EVENT_FINGERPRINT = 5,
2960
2961
2962
2963
2964
2965 EC_MKBP_EVENT_SYSRQ = 6,
2966
2967
2968 EC_MKBP_EVENT_COUNT,
2969};
2970
2971union __ec_align_offset1 ec_response_get_next_data {
2972 uint8_t key_matrix[13];
2973
2974
2975 uint32_t host_event;
2976
2977 struct __ec_todo_unpacked {
2978
2979 uint8_t reserved[3];
2980 struct ec_response_motion_sense_fifo_info info;
2981 } sensor_fifo;
2982
2983 uint32_t buttons;
2984
2985 uint32_t switches;
2986
2987 uint32_t fp_events;
2988
2989 uint32_t sysrq;
2990};
2991
2992struct __ec_align1 ec_response_get_next_event {
2993 uint8_t event_type;
2994
2995 union ec_response_get_next_data data;
2996};
2997
2998
2999
3000#define EC_MKBP_POWER_BUTTON 0
3001#define EC_MKBP_VOL_UP 1
3002#define EC_MKBP_VOL_DOWN 2
3003#define EC_MKBP_RECOVERY 3
3004
3005
3006#define EC_MKBP_LID_OPEN 0
3007#define EC_MKBP_TABLET_MODE 1
3008
3009
3010#define EC_CMD_KEYBOARD_FACTORY_TEST 0x0068
3011
3012struct __ec_align2 ec_response_keyboard_factory_test {
3013 uint16_t shorted;
3014};
3015
3016
3017#define EC_MKBP_FP_RAW_EVENT(fp_events) ((fp_events) & 0x00FFFFFF)
3018#define EC_MKBP_FP_FINGER_DOWN (1 << 29)
3019#define EC_MKBP_FP_FINGER_UP (1 << 30)
3020#define EC_MKBP_FP_IMAGE_READY (1 << 31)
3021
3022
3023
3024
3025
3026#define EC_CMD_TEMP_SENSOR_GET_INFO 0x0070
3027
3028struct __ec_align1 ec_params_temp_sensor_get_info {
3029 uint8_t id;
3030};
3031
3032struct __ec_align1 ec_response_temp_sensor_get_info {
3033 char sensor_name[32];
3034 uint8_t sensor_type;
3035};
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054struct __ec_align4 ec_params_host_event_mask {
3055 uint32_t mask;
3056};
3057
3058struct __ec_align4 ec_response_host_event_mask {
3059 uint32_t mask;
3060};
3061
3062
3063#define EC_CMD_HOST_EVENT_GET_B 0x0087
3064#define EC_CMD_HOST_EVENT_GET_SMI_MASK 0x0088
3065#define EC_CMD_HOST_EVENT_GET_SCI_MASK 0x0089
3066#define EC_CMD_HOST_EVENT_GET_WAKE_MASK 0x008D
3067
3068
3069#define EC_CMD_HOST_EVENT_SET_SMI_MASK 0x008A
3070#define EC_CMD_HOST_EVENT_SET_SCI_MASK 0x008B
3071#define EC_CMD_HOST_EVENT_CLEAR 0x008C
3072#define EC_CMD_HOST_EVENT_SET_WAKE_MASK 0x008E
3073#define EC_CMD_HOST_EVENT_CLEAR_B 0x008F
3074
3075
3076
3077
3078
3079
3080struct __ec_align4 ec_params_host_event {
3081
3082
3083 uint8_t action;
3084
3085
3086
3087
3088
3089 uint8_t mask_type;
3090
3091
3092 uint16_t reserved;
3093
3094
3095 uint64_t value;
3096};
3097
3098
3099
3100
3101
3102
3103struct __ec_align4 ec_response_host_event {
3104
3105
3106 uint64_t value;
3107};
3108
3109enum ec_host_event_action {
3110
3111
3112
3113
3114 EC_HOST_EVENT_GET,
3115
3116
3117 EC_HOST_EVENT_SET,
3118
3119
3120 EC_HOST_EVENT_CLEAR,
3121};
3122
3123enum ec_host_event_mask_type {
3124
3125
3126 EC_HOST_EVENT_MAIN,
3127
3128
3129 EC_HOST_EVENT_B,
3130
3131
3132 EC_HOST_EVENT_SCI_MASK,
3133
3134
3135 EC_HOST_EVENT_SMI_MASK,
3136
3137
3138 EC_HOST_EVENT_ALWAYS_REPORT_MASK,
3139
3140
3141 EC_HOST_EVENT_ACTIVE_WAKE_MASK,
3142
3143
3144 EC_HOST_EVENT_LAZY_WAKE_MASK_S0IX,
3145
3146
3147 EC_HOST_EVENT_LAZY_WAKE_MASK_S3,
3148
3149
3150 EC_HOST_EVENT_LAZY_WAKE_MASK_S5,
3151};
3152
3153#define EC_CMD_HOST_EVENT 0x00A4
3154
3155
3156
3157
3158
3159#define EC_CMD_SWITCH_ENABLE_BKLIGHT 0x0090
3160
3161struct __ec_align1 ec_params_switch_enable_backlight {
3162 uint8_t enabled;
3163};
3164
3165
3166#define EC_CMD_SWITCH_ENABLE_WIRELESS 0x0091
3167#define EC_VER_SWITCH_ENABLE_WIRELESS 1
3168
3169
3170struct __ec_align1 ec_params_switch_enable_wireless_v0 {
3171 uint8_t enabled;
3172};
3173
3174
3175struct __ec_align1 ec_params_switch_enable_wireless_v1 {
3176
3177 uint8_t now_flags;
3178
3179
3180 uint8_t now_mask;
3181
3182
3183
3184
3185
3186
3187 uint8_t suspend_flags;
3188
3189
3190 uint8_t suspend_mask;
3191};
3192
3193
3194struct __ec_align1 ec_response_switch_enable_wireless_v1 {
3195
3196 uint8_t now_flags;
3197
3198
3199 uint8_t suspend_flags;
3200};
3201
3202
3203
3204
3205
3206#define EC_CMD_GPIO_SET 0x0092
3207
3208struct __ec_align1 ec_params_gpio_set {
3209 char name[32];
3210 uint8_t val;
3211};
3212
3213
3214#define EC_CMD_GPIO_GET 0x0093
3215
3216
3217struct __ec_align1 ec_params_gpio_get {
3218 char name[32];
3219};
3220
3221struct __ec_align1 ec_response_gpio_get {
3222 uint8_t val;
3223};
3224
3225
3226struct __ec_align1 ec_params_gpio_get_v1 {
3227 uint8_t subcmd;
3228 union {
3229 struct __ec_align1 {
3230 char name[32];
3231 } get_value_by_name;
3232 struct __ec_align1 {
3233 uint8_t index;
3234 } get_info;
3235 };
3236};
3237
3238struct __ec_todo_packed ec_response_gpio_get_v1 {
3239 union {
3240 struct __ec_align1 {
3241 uint8_t val;
3242 } get_value_by_name, get_count;
3243 struct __ec_todo_unpacked {
3244 uint8_t val;
3245 char name[32];
3246 uint32_t flags;
3247 } get_info;
3248 };
3249};
3250
3251enum gpio_get_subcmd {
3252 EC_GPIO_GET_BY_NAME = 0,
3253 EC_GPIO_GET_COUNT = 1,
3254 EC_GPIO_GET_INFO = 2,
3255};
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268#define EC_CMD_I2C_READ 0x0094
3269
3270struct __ec_align_size1 ec_params_i2c_read {
3271 uint16_t addr;
3272 uint8_t read_size;
3273 uint8_t port;
3274 uint8_t offset;
3275};
3276
3277struct __ec_align2 ec_response_i2c_read {
3278 uint16_t data;
3279};
3280
3281
3282#define EC_CMD_I2C_WRITE 0x0095
3283
3284struct __ec_align_size1 ec_params_i2c_write {
3285 uint16_t data;
3286 uint16_t addr;
3287 uint8_t write_size;
3288 uint8_t port;
3289 uint8_t offset;
3290};
3291
3292
3293
3294
3295
3296
3297
3298#define EC_CMD_CHARGE_CONTROL 0x0096
3299#define EC_VER_CHARGE_CONTROL 1
3300
3301enum ec_charge_control_mode {
3302 CHARGE_CONTROL_NORMAL = 0,
3303 CHARGE_CONTROL_IDLE,
3304 CHARGE_CONTROL_DISCHARGE,
3305};
3306
3307struct __ec_align4 ec_params_charge_control {
3308 uint32_t mode;
3309};
3310
3311
3312
3313
3314
3315#define EC_CMD_CONSOLE_SNAPSHOT 0x0097
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329#define EC_CMD_CONSOLE_READ 0x0098
3330
3331enum ec_console_read_subcmd {
3332 CONSOLE_READ_NEXT = 0,
3333 CONSOLE_READ_RECENT
3334};
3335
3336struct __ec_align1 ec_params_console_read_v1 {
3337 uint8_t subcmd;
3338};
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349#define EC_CMD_BATTERY_CUT_OFF 0x0099
3350
3351#define EC_BATTERY_CUTOFF_FLAG_AT_SHUTDOWN (1 << 0)
3352
3353struct __ec_align1 ec_params_battery_cutoff {
3354 uint8_t flags;
3355};
3356
3357
3358
3359
3360
3361
3362
3363#define EC_CMD_USB_MUX 0x009A
3364
3365struct __ec_align1 ec_params_usb_mux {
3366 uint8_t mux;
3367};
3368
3369
3370
3371
3372enum ec_ldo_state {
3373 EC_LDO_STATE_OFF = 0,
3374 EC_LDO_STATE_ON = 1,
3375};
3376
3377
3378
3379
3380#define EC_CMD_LDO_SET 0x009B
3381
3382struct __ec_align1 ec_params_ldo_set {
3383 uint8_t index;
3384 uint8_t state;
3385};
3386
3387
3388
3389
3390#define EC_CMD_LDO_GET 0x009C
3391
3392struct __ec_align1 ec_params_ldo_get {
3393 uint8_t index;
3394};
3395
3396struct __ec_align1 ec_response_ldo_get {
3397 uint8_t state;
3398};
3399
3400
3401
3402
3403
3404
3405
3406#define EC_CMD_POWER_INFO 0x009D
3407
3408struct __ec_align4 ec_response_power_info {
3409 uint32_t usb_dev_type;
3410 uint16_t voltage_ac;
3411 uint16_t voltage_system;
3412 uint16_t current_system;
3413 uint16_t usb_current_limit;
3414};
3415
3416
3417
3418
3419#define EC_CMD_I2C_PASSTHRU 0x009E
3420
3421
3422#define EC_I2C_FLAG_READ (1 << 15)
3423
3424
3425#define EC_I2C_ADDR_MASK 0x3ff
3426
3427#define EC_I2C_STATUS_NAK (1 << 0)
3428#define EC_I2C_STATUS_TIMEOUT (1 << 1)
3429
3430
3431#define EC_I2C_STATUS_ERROR (EC_I2C_STATUS_NAK | EC_I2C_STATUS_TIMEOUT)
3432
3433struct __ec_align2 ec_params_i2c_passthru_msg {
3434 uint16_t addr_flags;
3435 uint16_t len;
3436};
3437
3438struct __ec_align2 ec_params_i2c_passthru {
3439 uint8_t port;
3440 uint8_t num_msgs;
3441 struct ec_params_i2c_passthru_msg msg[];
3442
3443};
3444
3445struct __ec_align1 ec_response_i2c_passthru {
3446 uint8_t i2c_status;
3447 uint8_t num_msgs;
3448 uint8_t data[];
3449};
3450
3451
3452
3453
3454#define EC_CMD_HANG_DETECT 0x009F
3455
3456
3457
3458#define EC_HANG_START_ON_POWER_PRESS (1 << 0)
3459
3460
3461#define EC_HANG_START_ON_LID_CLOSE (1 << 1)
3462
3463
3464#define EC_HANG_START_ON_LID_OPEN (1 << 2)
3465
3466
3467#define EC_HANG_START_ON_RESUME (1 << 3)
3468
3469
3470
3471
3472#define EC_HANG_STOP_ON_POWER_RELEASE (1 << 8)
3473
3474
3475#define EC_HANG_STOP_ON_HOST_COMMAND (1 << 9)
3476
3477
3478#define EC_HANG_STOP_ON_SUSPEND (1 << 10)
3479
3480
3481
3482
3483
3484
3485
3486#define EC_HANG_START_NOW (1 << 30)
3487
3488
3489
3490
3491
3492
3493#define EC_HANG_STOP_NOW (1 << 31)
3494
3495struct __ec_align4 ec_params_hang_detect {
3496
3497 uint32_t flags;
3498
3499
3500 uint16_t host_event_timeout_msec;
3501
3502
3503 uint16_t warm_reboot_timeout_msec;
3504};
3505
3506
3507
3508
3509
3510
3511
3512
3513#define EC_CMD_CHARGE_STATE 0x00A0
3514
3515
3516enum charge_state_command {
3517 CHARGE_STATE_CMD_GET_STATE,
3518 CHARGE_STATE_CMD_GET_PARAM,
3519 CHARGE_STATE_CMD_SET_PARAM,
3520 CHARGE_STATE_NUM_CMDS
3521};
3522
3523
3524
3525
3526
3527enum charge_state_params {
3528 CS_PARAM_CHG_VOLTAGE,
3529 CS_PARAM_CHG_CURRENT,
3530 CS_PARAM_CHG_INPUT_CURRENT,
3531 CS_PARAM_CHG_STATUS,
3532 CS_PARAM_CHG_OPTION,
3533 CS_PARAM_LIMIT_POWER,
3534
3535
3536
3537
3538
3539 CS_NUM_BASE_PARAMS,
3540
3541
3542 CS_PARAM_CUSTOM_PROFILE_MIN = 0x10000,
3543 CS_PARAM_CUSTOM_PROFILE_MAX = 0x1ffff,
3544
3545
3546};
3547
3548struct __ec_todo_packed ec_params_charge_state {
3549 uint8_t cmd;
3550 union {
3551 struct __ec_align1 {
3552
3553 } get_state;
3554
3555 struct __ec_todo_unpacked {
3556 uint32_t param;
3557 } get_param;
3558
3559 struct __ec_todo_unpacked {
3560 uint32_t param;
3561 uint32_t value;
3562 } set_param;
3563 };
3564};
3565
3566struct __ec_align4 ec_response_charge_state {
3567 union {
3568 struct __ec_align4 {
3569 int ac;
3570 int chg_voltage;
3571 int chg_current;
3572 int chg_input_current;
3573 int batt_state_of_charge;
3574 } get_state;
3575
3576 struct __ec_align4 {
3577 uint32_t value;
3578 } get_param;
3579 struct __ec_align4 {
3580
3581 } set_param;
3582 };
3583};
3584
3585
3586
3587
3588
3589#define EC_CMD_CHARGE_CURRENT_LIMIT 0x00A1
3590
3591struct __ec_align4 ec_params_current_limit {
3592 uint32_t limit;
3593};
3594
3595
3596
3597
3598#define EC_CMD_EXTERNAL_POWER_LIMIT 0x00A2
3599
3600
3601struct __ec_align2 ec_params_external_power_limit_v1 {
3602 uint16_t current_lim;
3603 uint16_t voltage_lim;
3604};
3605
3606#define EC_POWER_LIMIT_NONE 0xffff
3607
3608
3609
3610
3611#define EC_CMD_OVERRIDE_DEDICATED_CHARGER_LIMIT 0x00A3
3612
3613struct __ec_align2 ec_params_dedicated_charger_limit {
3614 uint16_t current_lim;
3615 uint16_t voltage_lim;
3616};
3617
3618
3619
3620
3621
3622#define EC_CMD_HIBERNATION_DELAY 0x00A8
3623
3624struct __ec_align4 ec_params_hibernation_delay {
3625
3626
3627
3628
3629 uint32_t seconds;
3630};
3631
3632struct __ec_align4 ec_response_hibernation_delay {
3633
3634
3635
3636
3637 uint32_t time_g3;
3638
3639
3640
3641
3642
3643 uint32_t time_remaining;
3644
3645
3646
3647
3648
3649 uint32_t hibernate_delay;
3650};
3651
3652
3653#define EC_CMD_HOST_SLEEP_EVENT 0x00A9
3654
3655enum host_sleep_event {
3656 HOST_SLEEP_EVENT_S3_SUSPEND = 1,
3657 HOST_SLEEP_EVENT_S3_RESUME = 2,
3658 HOST_SLEEP_EVENT_S0IX_SUSPEND = 3,
3659 HOST_SLEEP_EVENT_S0IX_RESUME = 4
3660};
3661
3662struct __ec_align1 ec_params_host_sleep_event {
3663 uint8_t sleep_event;
3664};
3665
3666
3667
3668#define EC_CMD_DEVICE_EVENT 0x00AA
3669
3670enum ec_device_event {
3671 EC_DEVICE_EVENT_TRACKPAD,
3672 EC_DEVICE_EVENT_DSP,
3673 EC_DEVICE_EVENT_WIFI,
3674};
3675
3676enum ec_device_event_param {
3677
3678 EC_DEVICE_EVENT_PARAM_GET_CURRENT_EVENTS,
3679
3680 EC_DEVICE_EVENT_PARAM_GET_ENABLED_EVENTS,
3681
3682 EC_DEVICE_EVENT_PARAM_SET_ENABLED_EVENTS,
3683};
3684
3685#define EC_DEVICE_EVENT_MASK(event_code) (1UL << (event_code % 32))
3686
3687struct __ec_align_size1 ec_params_device_event {
3688 uint32_t event_mask;
3689 uint8_t param;
3690};
3691
3692struct __ec_align4 ec_response_device_event {
3693 uint32_t event_mask;
3694};
3695
3696
3697
3698
3699
3700#define EC_CMD_SB_READ_WORD 0x00B0
3701#define EC_CMD_SB_WRITE_WORD 0x00B1
3702
3703
3704
3705
3706#define EC_CMD_SB_READ_BLOCK 0x00B2
3707#define EC_CMD_SB_WRITE_BLOCK 0x00B3
3708
3709struct __ec_align1 ec_params_sb_rd {
3710 uint8_t reg;
3711};
3712
3713struct __ec_align2 ec_response_sb_rd_word {
3714 uint16_t value;
3715};
3716
3717struct __ec_align1 ec_params_sb_wr_word {
3718 uint8_t reg;
3719 uint16_t value;
3720};
3721
3722struct __ec_align1 ec_response_sb_rd_block {
3723 uint8_t data[32];
3724};
3725
3726struct __ec_align1 ec_params_sb_wr_block {
3727 uint8_t reg;
3728 uint16_t data[32];
3729};
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740#define EC_CMD_BATTERY_VENDOR_PARAM 0x00B4
3741
3742enum ec_battery_vendor_param_mode {
3743 BATTERY_VENDOR_PARAM_MODE_GET = 0,
3744 BATTERY_VENDOR_PARAM_MODE_SET,
3745};
3746
3747struct __ec_align_size1 ec_params_battery_vendor_param {
3748 uint32_t param;
3749 uint32_t value;
3750 uint8_t mode;
3751};
3752
3753struct __ec_align4 ec_response_battery_vendor_param {
3754 uint32_t value;
3755};
3756
3757
3758
3759
3760
3761#define EC_CMD_SB_FW_UPDATE 0x00B5
3762
3763enum ec_sb_fw_update_subcmd {
3764 EC_SB_FW_UPDATE_PREPARE = 0x0,
3765 EC_SB_FW_UPDATE_INFO = 0x1,
3766 EC_SB_FW_UPDATE_BEGIN = 0x2,
3767 EC_SB_FW_UPDATE_WRITE = 0x3,
3768 EC_SB_FW_UPDATE_END = 0x4,
3769 EC_SB_FW_UPDATE_STATUS = 0x5,
3770 EC_SB_FW_UPDATE_PROTECT = 0x6,
3771 EC_SB_FW_UPDATE_MAX = 0x7,
3772};
3773
3774#define SB_FW_UPDATE_CMD_WRITE_BLOCK_SIZE 32
3775#define SB_FW_UPDATE_CMD_STATUS_SIZE 2
3776#define SB_FW_UPDATE_CMD_INFO_SIZE 8
3777
3778struct __ec_align4 ec_sb_fw_update_header {
3779 uint16_t subcmd;
3780 uint16_t fw_id;
3781};
3782
3783struct __ec_align4 ec_params_sb_fw_update {
3784 struct ec_sb_fw_update_header hdr;
3785 union {
3786
3787
3788
3789
3790
3791
3792 struct __ec_align4 {
3793
3794 } dummy;
3795
3796
3797 struct __ec_align4 {
3798 uint8_t data[SB_FW_UPDATE_CMD_WRITE_BLOCK_SIZE];
3799 } write;
3800 };
3801};
3802
3803struct __ec_align1 ec_response_sb_fw_update {
3804 union {
3805
3806 struct __ec_align1 {
3807 uint8_t data[SB_FW_UPDATE_CMD_INFO_SIZE];
3808 } info;
3809
3810
3811 struct __ec_align1 {
3812 uint8_t data[SB_FW_UPDATE_CMD_STATUS_SIZE];
3813 } status;
3814 };
3815};
3816
3817
3818
3819
3820
3821
3822#define EC_CMD_ENTERING_MODE 0x00B6
3823
3824struct __ec_align4 ec_params_entering_mode {
3825 int vboot_mode;
3826};
3827
3828#define VBOOT_MODE_NORMAL 0
3829#define VBOOT_MODE_DEVELOPER 1
3830#define VBOOT_MODE_RECOVERY 2
3831
3832
3833
3834
3835
3836
3837#define EC_CMD_I2C_PASSTHRU_PROTECT 0x00B7
3838
3839enum ec_i2c_passthru_protect_subcmd {
3840 EC_CMD_I2C_PASSTHRU_PROTECT_STATUS = 0x0,
3841 EC_CMD_I2C_PASSTHRU_PROTECT_ENABLE = 0x1,
3842};
3843
3844struct __ec_align1 ec_params_i2c_passthru_protect {
3845 uint8_t subcmd;
3846 uint8_t port;
3847};
3848
3849struct __ec_align1 ec_response_i2c_passthru_protect {
3850 uint8_t status;
3851};
3852
3853
3854
3855
3856
3857
3858
3859
3860#define EC_CMD_REBOOT_EC 0x00D2
3861
3862
3863enum ec_reboot_cmd {
3864 EC_REBOOT_CANCEL = 0,
3865 EC_REBOOT_JUMP_RO = 1,
3866 EC_REBOOT_JUMP_RW = 2,
3867
3868 EC_REBOOT_COLD = 4,
3869 EC_REBOOT_DISABLE_JUMP = 5,
3870 EC_REBOOT_HIBERNATE = 6,
3871 EC_REBOOT_HIBERNATE_CLEAR_AP_OFF = 7,
3872};
3873
3874
3875#define EC_REBOOT_FLAG_RESERVED0 (1 << 0)
3876#define EC_REBOOT_FLAG_ON_AP_SHUTDOWN (1 << 1)
3877#define EC_REBOOT_FLAG_SWITCH_RW_SLOT (1 << 2)
3878
3879struct __ec_align1 ec_params_reboot_ec {
3880 uint8_t cmd;
3881 uint8_t flags;
3882};
3883
3884
3885
3886
3887
3888
3889
3890#define EC_CMD_GET_PANIC_INFO 0x00D3
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909#define EC_CMD_REBOOT 0x00D1
3910
3911
3912
3913
3914
3915
3916
3917
3918#define EC_CMD_RESEND_RESPONSE 0x00DB
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930#define EC_CMD_VERSION0 0x00DC
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940#define EC_CMD_PD_EXCHANGE_STATUS 0x0100
3941#define EC_VER_PD_EXCHANGE_STATUS 2
3942
3943enum pd_charge_state {
3944 PD_CHARGE_NO_CHANGE = 0,
3945 PD_CHARGE_NONE,
3946 PD_CHARGE_5V,
3947 PD_CHARGE_MAX
3948};
3949
3950
3951#define EC_STATUS_HIBERNATING (1 << 0)
3952
3953struct __ec_align1 ec_params_pd_status {
3954 uint8_t status;
3955 int8_t batt_soc;
3956 uint8_t charge_state;
3957};
3958
3959
3960#define PD_STATUS_HOST_EVENT (1 << 0)
3961#define PD_STATUS_IN_RW (1 << 1)
3962#define PD_STATUS_JUMPED_TO_IMAGE (1 << 2)
3963#define PD_STATUS_TCPC_ALERT_0 (1 << 3)
3964#define PD_STATUS_TCPC_ALERT_1 (1 << 4)
3965#define PD_STATUS_TCPC_ALERT_2 (1 << 5)
3966#define PD_STATUS_TCPC_ALERT_3 (1 << 6)
3967#define PD_STATUS_EC_INT_ACTIVE (PD_STATUS_TCPC_ALERT_0 | \
3968 PD_STATUS_TCPC_ALERT_1 | \
3969 PD_STATUS_HOST_EVENT)
3970struct __ec_align_size1 ec_response_pd_status {
3971 uint32_t curr_lim_ma;
3972 uint16_t status;
3973 int8_t active_charge_port;
3974};
3975
3976
3977#define EC_CMD_PD_HOST_EVENT_STATUS 0x0104
3978
3979
3980#define PD_EVENT_UPDATE_DEVICE (1 << 0)
3981#define PD_EVENT_POWER_CHANGE (1 << 1)
3982#define PD_EVENT_IDENTITY_RECEIVED (1 << 2)
3983#define PD_EVENT_DATA_SWAP (1 << 3)
3984struct __ec_align4 ec_response_host_event_status {
3985 uint32_t status;
3986};
3987
3988
3989#define EC_CMD_USB_PD_CONTROL 0x0101
3990
3991enum usb_pd_control_role {
3992 USB_PD_CTRL_ROLE_NO_CHANGE = 0,
3993 USB_PD_CTRL_ROLE_TOGGLE_ON = 1,
3994 USB_PD_CTRL_ROLE_TOGGLE_OFF = 2,
3995 USB_PD_CTRL_ROLE_FORCE_SINK = 3,
3996 USB_PD_CTRL_ROLE_FORCE_SOURCE = 4,
3997 USB_PD_CTRL_ROLE_COUNT
3998};
3999
4000enum usb_pd_control_mux {
4001 USB_PD_CTRL_MUX_NO_CHANGE = 0,
4002 USB_PD_CTRL_MUX_NONE = 1,
4003 USB_PD_CTRL_MUX_USB = 2,
4004 USB_PD_CTRL_MUX_DP = 3,
4005 USB_PD_CTRL_MUX_DOCK = 4,
4006 USB_PD_CTRL_MUX_AUTO = 5,
4007 USB_PD_CTRL_MUX_COUNT
4008};
4009
4010enum usb_pd_control_swap {
4011 USB_PD_CTRL_SWAP_NONE = 0,
4012 USB_PD_CTRL_SWAP_DATA = 1,
4013 USB_PD_CTRL_SWAP_POWER = 2,
4014 USB_PD_CTRL_SWAP_VCONN = 3,
4015 USB_PD_CTRL_SWAP_COUNT
4016};
4017
4018struct __ec_align1 ec_params_usb_pd_control {
4019 uint8_t port;
4020 uint8_t role;
4021 uint8_t mux;
4022 uint8_t swap;
4023};
4024
4025#define PD_CTRL_RESP_ENABLED_COMMS (1 << 0)
4026#define PD_CTRL_RESP_ENABLED_CONNECTED (1 << 1)
4027#define PD_CTRL_RESP_ENABLED_PD_CAPABLE (1 << 2)
4028
4029#define PD_CTRL_RESP_ROLE_POWER (1 << 0)
4030#define PD_CTRL_RESP_ROLE_DATA (1 << 1)
4031#define PD_CTRL_RESP_ROLE_VCONN (1 << 2)
4032#define PD_CTRL_RESP_ROLE_DR_POWER (1 << 3)
4033#define PD_CTRL_RESP_ROLE_DR_DATA (1 << 4)
4034#define PD_CTRL_RESP_ROLE_USB_COMM (1 << 5)
4035#define PD_CTRL_RESP_ROLE_EXT_POWERED (1 << 6)
4036
4037struct __ec_align1 ec_response_usb_pd_control {
4038 uint8_t enabled;
4039 uint8_t role;
4040 uint8_t polarity;
4041 uint8_t state;
4042};
4043
4044struct __ec_align1 ec_response_usb_pd_control_v1 {
4045 uint8_t enabled;
4046 uint8_t role;
4047 uint8_t polarity;
4048 char state[32];
4049};
4050
4051#define EC_CMD_USB_PD_PORTS 0x0102
4052
4053
4054#define EC_USB_PD_MAX_PORTS 8
4055
4056struct __ec_align1 ec_response_usb_pd_ports {
4057 uint8_t num_ports;
4058};
4059
4060#define EC_CMD_USB_PD_POWER_INFO 0x0103
4061
4062#define PD_POWER_CHARGING_PORT 0xff
4063struct __ec_align1 ec_params_usb_pd_power_info {
4064 uint8_t port;
4065};
4066
4067enum usb_chg_type {
4068 USB_CHG_TYPE_NONE,
4069 USB_CHG_TYPE_PD,
4070 USB_CHG_TYPE_C,
4071 USB_CHG_TYPE_PROPRIETARY,
4072 USB_CHG_TYPE_BC12_DCP,
4073 USB_CHG_TYPE_BC12_CDP,
4074 USB_CHG_TYPE_BC12_SDP,
4075 USB_CHG_TYPE_OTHER,
4076 USB_CHG_TYPE_VBUS,
4077 USB_CHG_TYPE_UNKNOWN,
4078};
4079enum usb_power_roles {
4080 USB_PD_PORT_POWER_DISCONNECTED,
4081 USB_PD_PORT_POWER_SOURCE,
4082 USB_PD_PORT_POWER_SINK,
4083 USB_PD_PORT_POWER_SINK_NOT_CHARGING,
4084};
4085
4086struct __ec_align2 usb_chg_measures {
4087 uint16_t voltage_max;
4088 uint16_t voltage_now;
4089 uint16_t current_max;
4090 uint16_t current_lim;
4091};
4092
4093struct __ec_align4 ec_response_usb_pd_power_info {
4094 uint8_t role;
4095 uint8_t type;
4096 uint8_t dualrole;
4097 uint8_t reserved1;
4098 struct usb_chg_measures meas;
4099 uint32_t max_power;
4100};
4101
4102
4103#define EC_CMD_USB_PD_FW_UPDATE 0x0110
4104
4105enum usb_pd_fw_update_cmds {
4106 USB_PD_FW_REBOOT,
4107 USB_PD_FW_FLASH_ERASE,
4108 USB_PD_FW_FLASH_WRITE,
4109 USB_PD_FW_ERASE_SIG,
4110};
4111
4112struct __ec_align4 ec_params_usb_pd_fw_update {
4113 uint16_t dev_id;
4114 uint8_t cmd;
4115 uint8_t port;
4116 uint32_t size;
4117
4118};
4119
4120
4121#define EC_CMD_USB_PD_RW_HASH_ENTRY 0x0111
4122
4123#define PD_RW_HASH_SIZE 20
4124struct __ec_align1 ec_params_usb_pd_rw_hash_entry {
4125 uint16_t dev_id;
4126 uint8_t dev_rw_hash[PD_RW_HASH_SIZE];
4127 uint8_t reserved;
4128
4129
4130 uint32_t current_image;
4131};
4132
4133
4134#define EC_CMD_USB_PD_DEV_INFO 0x0112
4135
4136struct __ec_align1 ec_params_usb_pd_info_request {
4137 uint8_t port;
4138};
4139
4140
4141#define EC_CMD_USB_PD_DISCOVERY 0x0113
4142struct __ec_align_size1 ec_params_usb_pd_discovery_entry {
4143 uint16_t vid;
4144 uint16_t pid;
4145 uint8_t ptype;
4146};
4147
4148
4149#define EC_CMD_PD_CHARGE_PORT_OVERRIDE 0x0114
4150
4151
4152enum usb_pd_override_ports {
4153 OVERRIDE_DONT_CHARGE = -2,
4154 OVERRIDE_OFF = -1,
4155
4156};
4157
4158struct __ec_align2 ec_params_charge_port_override {
4159 int16_t override_port;
4160};
4161
4162
4163#define EC_CMD_PD_GET_LOG_ENTRY 0x0115
4164
4165struct __ec_align4 ec_response_pd_log {
4166 uint32_t timestamp;
4167 uint8_t type;
4168 uint8_t size_port;
4169 uint16_t data;
4170 uint8_t payload[0];
4171};
4172
4173
4174
4175#define PD_LOG_TIMESTAMP_SHIFT 10
4176
4177#define PD_LOG_SIZE_MASK 0x1f
4178#define PD_LOG_PORT_MASK 0xe0
4179#define PD_LOG_PORT_SHIFT 5
4180#define PD_LOG_PORT_SIZE(port, size) (((port) << PD_LOG_PORT_SHIFT) | \
4181 ((size) & PD_LOG_SIZE_MASK))
4182#define PD_LOG_PORT(size_port) ((size_port) >> PD_LOG_PORT_SHIFT)
4183#define PD_LOG_SIZE(size_port) ((size_port) & PD_LOG_SIZE_MASK)
4184
4185
4186
4187#define PD_EVENT_MCU_BASE 0x00
4188#define PD_EVENT_MCU_CHARGE (PD_EVENT_MCU_BASE+0)
4189#define PD_EVENT_MCU_CONNECT (PD_EVENT_MCU_BASE+1)
4190
4191#define PD_EVENT_MCU_BOARD_CUSTOM (PD_EVENT_MCU_BASE+2)
4192
4193#define PD_EVENT_ACC_BASE 0x20
4194#define PD_EVENT_ACC_RW_FAIL (PD_EVENT_ACC_BASE+0)
4195#define PD_EVENT_ACC_RW_ERASE (PD_EVENT_ACC_BASE+1)
4196
4197#define PD_EVENT_PS_BASE 0x40
4198#define PD_EVENT_PS_FAULT (PD_EVENT_PS_BASE+0)
4199
4200#define PD_EVENT_VIDEO_BASE 0x60
4201#define PD_EVENT_VIDEO_DP_MODE (PD_EVENT_VIDEO_BASE+0)
4202#define PD_EVENT_VIDEO_CODEC (PD_EVENT_VIDEO_BASE+1)
4203
4204#define PD_EVENT_NO_ENTRY 0xff
4205
4206
4207
4208
4209
4210
4211
4212#define CHARGE_FLAGS_DUAL_ROLE (1 << 15)
4213
4214#define CHARGE_FLAGS_DELAYED_OVERRIDE (1 << 14)
4215
4216#define CHARGE_FLAGS_OVERRIDE (1 << 13)
4217
4218#define CHARGE_FLAGS_TYPE_SHIFT 3
4219#define CHARGE_FLAGS_TYPE_MASK (0xf << CHARGE_FLAGS_TYPE_SHIFT)
4220
4221#define CHARGE_FLAGS_ROLE_MASK (7 << 0)
4222
4223
4224
4225
4226#define PS_FAULT_OCP 1
4227#define PS_FAULT_FAST_OCP 2
4228#define PS_FAULT_OVP 3
4229#define PS_FAULT_DISCH 4
4230
4231
4232
4233
4234struct __ec_align4 mcdp_version {
4235 uint8_t major;
4236 uint8_t minor;
4237 uint16_t build;
4238};
4239
4240struct __ec_align4 mcdp_info {
4241 uint8_t family[2];
4242 uint8_t chipid[2];
4243 struct mcdp_version irom;
4244 struct mcdp_version fw;
4245};
4246
4247
4248#define MCDP_CHIPID(chipid) ((chipid[0] << 8) | chipid[1])
4249#define MCDP_FAMILY(family) ((family[0] << 8) | family[1])
4250
4251
4252#define EC_CMD_USB_PD_GET_AMODE 0x0116
4253struct __ec_align_size1 ec_params_usb_pd_get_mode_request {
4254 uint16_t svid_idx;
4255 uint8_t port;
4256};
4257
4258struct __ec_align4 ec_params_usb_pd_get_mode_response {
4259 uint16_t svid;
4260 uint16_t opos;
4261 uint32_t vdo[6];
4262};
4263
4264#define EC_CMD_USB_PD_SET_AMODE 0x0117
4265
4266enum pd_mode_cmd {
4267 PD_EXIT_MODE = 0,
4268 PD_ENTER_MODE = 1,
4269
4270 PD_MODE_CMD_COUNT,
4271};
4272
4273struct __ec_align4 ec_params_usb_pd_set_mode_request {
4274 uint32_t cmd;
4275 uint16_t svid;
4276 uint8_t opos;
4277 uint8_t port;
4278};
4279
4280
4281#define EC_CMD_PD_WRITE_LOG_ENTRY 0x0118
4282
4283struct __ec_align1 ec_params_pd_write_log_entry {
4284 uint8_t type;
4285 uint8_t port;
4286};
4287
4288
4289
4290#define EC_CMD_PD_CONTROL 0x0119
4291
4292enum ec_pd_control_cmd {
4293 PD_SUSPEND = 0,
4294 PD_RESUME,
4295 PD_RESET,
4296 PD_CONTROL_DISABLE
4297};
4298
4299struct __ec_align1 ec_params_pd_control {
4300 uint8_t chip;
4301 uint8_t subcmd;
4302};
4303
4304
4305#define EC_CMD_USB_PD_MUX_INFO 0x011A
4306
4307struct __ec_align1 ec_params_usb_pd_mux_info {
4308 uint8_t port;
4309};
4310
4311
4312#define USB_PD_MUX_USB_ENABLED (1 << 0)
4313#define USB_PD_MUX_DP_ENABLED (1 << 1)
4314#define USB_PD_MUX_POLARITY_INVERTED (1 << 2)
4315#define USB_PD_MUX_HPD_IRQ (1 << 3)
4316
4317struct __ec_align1 ec_response_usb_pd_mux_info {
4318 uint8_t flags;
4319};
4320
4321#define EC_CMD_PD_CHIP_INFO 0x011B
4322
4323struct __ec_align1 ec_params_pd_chip_info {
4324 uint8_t port;
4325 uint8_t renew;
4326};
4327
4328struct __ec_align2 ec_response_pd_chip_info {
4329 uint16_t vendor_id;
4330 uint16_t product_id;
4331 uint16_t device_id;
4332 union {
4333 uint8_t fw_version_string[8];
4334 uint64_t fw_version_number;
4335 };
4336};
4337
4338
4339#define EC_CMD_RWSIG_CHECK_STATUS 0x011C
4340
4341struct __ec_align4 ec_response_rwsig_check_status {
4342 uint32_t status;
4343};
4344
4345
4346#define EC_CMD_RWSIG_ACTION 0x011D
4347
4348enum rwsig_action {
4349 RWSIG_ACTION_ABORT = 0,
4350 RWSIG_ACTION_CONTINUE = 1,
4351};
4352
4353struct __ec_align4 ec_params_rwsig_action {
4354 uint32_t action;
4355};
4356
4357
4358#define EC_CMD_EFS_VERIFY 0x011E
4359
4360struct __ec_align1 ec_params_efs_verify {
4361 uint8_t region;
4362};
4363
4364
4365
4366
4367
4368
4369#define EC_CMD_GET_CROS_BOARD_INFO 0x011F
4370
4371
4372
4373
4374#define EC_CMD_SET_CROS_BOARD_INFO 0x0120
4375
4376enum cbi_data_tag {
4377 CBI_TAG_BOARD_VERSION = 0,
4378 CBI_TAG_OEM_ID = 1,
4379 CBI_TAG_SKU_ID = 2,
4380 CBI_TAG_COUNT,
4381};
4382
4383
4384
4385
4386
4387
4388
4389#define CBI_GET_RELOAD (1 << 0)
4390
4391struct __ec_align4 ec_params_get_cbi {
4392 uint32_t type;
4393 uint32_t flag;
4394};
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404#define CBI_SET_NO_SYNC (1 << 0)
4405#define CBI_SET_INIT (1 << 1)
4406
4407struct __ec_align1 ec_params_set_cbi {
4408 uint32_t tag;
4409 uint32_t flag;
4410 uint32_t size;
4411 uint8_t data[];
4412};
4413
4414
4415
4416
4417
4418
4419
4420
4421#define EC_CMD_CR51_BASE 0x0300
4422#define EC_CMD_CR51_LAST 0x03FF
4423
4424
4425
4426
4427
4428#define EC_CMD_FP_PASSTHRU 0x0400
4429
4430#define EC_FP_FLAG_NOT_COMPLETE 0x1
4431
4432struct __ec_align2 ec_params_fp_passthru {
4433 uint16_t len;
4434 uint16_t flags;
4435 uint8_t data[];
4436};
4437
4438
4439#define EC_CMD_FP_SENSOR_CONFIG 0x0401
4440
4441#define EC_FP_SENSOR_CONFIG_MAX_REGS 16
4442
4443struct __ec_align2 ec_params_fp_sensor_config {
4444 uint8_t count;
4445
4446
4447
4448
4449
4450 uint8_t len[EC_FP_SENSOR_CONFIG_MAX_REGS];
4451 uint8_t data[];
4452};
4453
4454
4455#define EC_CMD_FP_MODE 0x0402
4456
4457
4458#define FP_MODE_DEEPSLEEP (1<<0)
4459
4460#define FP_MODE_FINGER_DOWN (1<<1)
4461
4462#define FP_MODE_FINGER_UP (1<<2)
4463
4464#define FP_MODE_CAPTURE (1<<3)
4465
4466#define FP_MODE_DONT_CHANGE (1<<31)
4467
4468struct __ec_align4 ec_params_fp_mode {
4469 uint32_t mode;
4470
4471};
4472
4473struct __ec_align4 ec_response_fp_mode {
4474 uint32_t mode;
4475
4476};
4477
4478
4479#define EC_CMD_FP_INFO 0x0403
4480
4481struct __ec_align2 ec_response_fp_info {
4482
4483 uint32_t vendor_id;
4484 uint32_t product_id;
4485 uint32_t model_id;
4486 uint32_t version;
4487
4488 uint32_t frame_size;
4489 uint32_t pixel_format;
4490 uint16_t width;
4491 uint16_t height;
4492 uint16_t bpp;
4493};
4494
4495
4496#define EC_CMD_FP_FRAME 0x0404
4497
4498struct __ec_align4 ec_params_fp_frame {
4499 uint32_t offset;
4500 uint32_t size;
4501};
4502
4503
4504
4505
4506
4507#define EC_CMD_TP_SELF_TEST 0x0500
4508
4509
4510#define EC_CMD_TP_FRAME_INFO 0x0501
4511
4512struct __ec_align4 ec_response_tp_frame_info {
4513 uint32_t n_frames;
4514 uint32_t frame_sizes[0];
4515};
4516
4517
4518#define EC_CMD_TP_FRAME_SNAPSHOT 0x0502
4519
4520
4521#define EC_CMD_TP_FRAME_GET 0x0503
4522
4523struct __ec_align4 ec_params_tp_frame_get {
4524 uint32_t frame_index;
4525 uint32_t offset;
4526 uint32_t size;
4527};
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555#define EC_CMD_BOARD_SPECIFIC_BASE 0x3E00
4556#define EC_CMD_BOARD_SPECIFIC_LAST 0x3FFF
4557
4558
4559
4560
4561
4562#define EC_PRIVATE_HOST_COMMAND_VALUE(command) \
4563 (EC_CMD_BOARD_SPECIFIC_BASE + (command))
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589#define EC_CMD_PASSTHRU_OFFSET(n) (0x4000 * (n))
4590#define EC_CMD_PASSTHRU_MAX(n) (EC_CMD_PASSTHRU_OFFSET(n) + 0x3fff)
4591
4592
4593
4594
4595
4596
4597
4598
4599#define EC_HOST_PARAM_SIZE EC_PROTO2_MAX_PARAM_SIZE
4600#define EC_LPC_ADDR_OLD_PARAM EC_HOST_CMD_REGION1
4601#define EC_OLD_PARAM_SIZE EC_HOST_CMD_REGION_SIZE
4602
4603#endif
4604
4605#endif
4606