1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#ifndef __CROS_EC_COMMANDS_H
24#define __CROS_EC_COMMANDS_H
25
26
27
28
29
30
31
32
33#define EC_PROTO_VERSION 0x00000002
34
35
36#define EC_VER_MASK(version) (1UL << (version))
37
38
39#define EC_LPC_ADDR_ACPI_DATA 0x62
40#define EC_LPC_ADDR_ACPI_CMD 0x66
41
42
43#define EC_LPC_ADDR_HOST_DATA 0x200
44#define EC_LPC_ADDR_HOST_CMD 0x204
45
46
47
48#define EC_LPC_ADDR_HOST_ARGS 0x800
49#define EC_LPC_ADDR_HOST_PARAM 0x804
50
51
52#define EC_LPC_ADDR_HOST_PACKET 0x800
53#define EC_LPC_HOST_PACKET_SIZE 0x100
54
55
56
57#define EC_HOST_CMD_REGION0 0x800
58#define EC_HOST_CMD_REGION1 0x880
59#define EC_HOST_CMD_REGION_SIZE 0x80
60
61
62#define EC_LPC_CMDR_DATA (1 << 0)
63#define EC_LPC_CMDR_PENDING (1 << 1)
64#define EC_LPC_CMDR_BUSY (1 << 2)
65#define EC_LPC_CMDR_CMD (1 << 3)
66#define EC_LPC_CMDR_ACPI_BRST (1 << 4)
67#define EC_LPC_CMDR_SCI (1 << 5)
68#define EC_LPC_CMDR_SMI (1 << 6)
69
70#define EC_LPC_ADDR_MEMMAP 0x900
71#define EC_MEMMAP_SIZE 255
72#define EC_MEMMAP_TEXT_MAX 8
73
74
75#define EC_MEMMAP_TEMP_SENSOR 0x00
76#define EC_MEMMAP_FAN 0x10
77#define EC_MEMMAP_TEMP_SENSOR_B 0x18
78#define EC_MEMMAP_ID 0x20
79#define EC_MEMMAP_ID_VERSION 0x22
80#define EC_MEMMAP_THERMAL_VERSION 0x23
81#define EC_MEMMAP_BATTERY_VERSION 0x24
82#define EC_MEMMAP_SWITCHES_VERSION 0x25
83#define EC_MEMMAP_EVENTS_VERSION 0x26
84#define EC_MEMMAP_HOST_CMD_FLAGS 0x27
85
86#define EC_MEMMAP_SWITCHES 0x30
87
88#define EC_MEMMAP_HOST_EVENTS 0x34
89
90
91#define EC_MEMMAP_BATT_VOLT 0x40
92#define EC_MEMMAP_BATT_RATE 0x44
93#define EC_MEMMAP_BATT_CAP 0x48
94#define EC_MEMMAP_BATT_FLAG 0x4c
95#define EC_MEMMAP_BATT_DCAP 0x50
96#define EC_MEMMAP_BATT_DVLT 0x54
97#define EC_MEMMAP_BATT_LFCC 0x58
98#define EC_MEMMAP_BATT_CCNT 0x5c
99
100#define EC_MEMMAP_BATT_MFGR 0x60
101#define EC_MEMMAP_BATT_MODEL 0x68
102#define EC_MEMMAP_BATT_SERIAL 0x70
103#define EC_MEMMAP_BATT_TYPE 0x78
104#define EC_MEMMAP_ALS 0x80
105
106#define EC_MEMMAP_ACC_STATUS 0x90
107
108#define EC_MEMMAP_ACC_DATA 0x92
109#define EC_MEMMAP_GYRO_DATA 0xa0
110
111
112
113
114#define EC_MEMMAP_ACC_STATUS_SAMPLE_ID_MASK 0x0f
115#define EC_MEMMAP_ACC_STATUS_BUSY_BIT (1 << 4)
116#define EC_MEMMAP_ACC_STATUS_PRESENCE_BIT (1 << 7)
117
118
119#define EC_TEMP_SENSOR_ENTRIES 16
120
121
122
123
124
125#define EC_TEMP_SENSOR_B_ENTRIES 8
126
127
128#define EC_TEMP_SENSOR_NOT_PRESENT 0xff
129#define EC_TEMP_SENSOR_ERROR 0xfe
130#define EC_TEMP_SENSOR_NOT_POWERED 0xfd
131#define EC_TEMP_SENSOR_NOT_CALIBRATED 0xfc
132
133
134
135
136#define EC_TEMP_SENSOR_OFFSET 200
137
138
139
140
141#define EC_ALS_ENTRIES 2
142
143
144
145
146
147
148#define EC_TEMP_SENSOR_DEFAULT (296 - EC_TEMP_SENSOR_OFFSET)
149
150#define EC_FAN_SPEED_ENTRIES 4
151#define EC_FAN_SPEED_NOT_PRESENT 0xffff
152#define EC_FAN_SPEED_STALLED 0xfffe
153
154
155#define EC_BATT_FLAG_AC_PRESENT 0x01
156#define EC_BATT_FLAG_BATT_PRESENT 0x02
157#define EC_BATT_FLAG_DISCHARGING 0x04
158#define EC_BATT_FLAG_CHARGING 0x08
159#define EC_BATT_FLAG_LEVEL_CRITICAL 0x10
160
161
162#define EC_SWITCH_LID_OPEN 0x01
163#define EC_SWITCH_POWER_BUTTON_PRESSED 0x02
164#define EC_SWITCH_WRITE_PROTECT_DISABLED 0x04
165
166#define EC_SWITCH_IGNORE1 0x08
167
168#define EC_SWITCH_DEDICATED_RECOVERY 0x10
169
170#define EC_SWITCH_IGNORE0 0x20
171
172
173
174#define EC_HOST_CMD_FLAG_LPC_ARGS_SUPPORTED 0x01
175
176#define EC_HOST_CMD_FLAG_VERSION_3 0x02
177
178
179#define EC_WIRELESS_SWITCH_ALL ~0x00
180#define EC_WIRELESS_SWITCH_WLAN 0x01
181#define EC_WIRELESS_SWITCH_BLUETOOTH 0x02
182#define EC_WIRELESS_SWITCH_WWAN 0x04
183#define EC_WIRELESS_SWITCH_WLAN_POWER 0x08
184
185
186
187
188
189
190#ifndef __ACPI__
191
192
193
194
195
196#ifndef __packed
197#define __packed __attribute__((packed))
198#endif
199
200
201
202#define EC_LPC_STATUS_TO_HOST 0x01
203
204#define EC_LPC_STATUS_FROM_HOST 0x02
205
206#define EC_LPC_STATUS_PROCESSING 0x04
207
208#define EC_LPC_STATUS_LAST_CMD 0x08
209
210#define EC_LPC_STATUS_BURST_MODE 0x10
211
212#define EC_LPC_STATUS_SCI_PENDING 0x20
213
214#define EC_LPC_STATUS_SMI_PENDING 0x40
215
216#define EC_LPC_STATUS_RESERVED 0x80
217
218
219
220
221
222#define EC_LPC_STATUS_BUSY_MASK \
223 (EC_LPC_STATUS_FROM_HOST | EC_LPC_STATUS_PROCESSING)
224
225
226enum ec_status {
227 EC_RES_SUCCESS = 0,
228 EC_RES_INVALID_COMMAND = 1,
229 EC_RES_ERROR = 2,
230 EC_RES_INVALID_PARAM = 3,
231 EC_RES_ACCESS_DENIED = 4,
232 EC_RES_INVALID_RESPONSE = 5,
233 EC_RES_INVALID_VERSION = 6,
234 EC_RES_INVALID_CHECKSUM = 7,
235 EC_RES_IN_PROGRESS = 8,
236 EC_RES_UNAVAILABLE = 9,
237 EC_RES_TIMEOUT = 10,
238 EC_RES_OVERFLOW = 11,
239 EC_RES_INVALID_HEADER = 12,
240 EC_RES_REQUEST_TRUNCATED = 13,
241 EC_RES_RESPONSE_TOO_BIG = 14
242};
243
244
245
246
247
248
249
250
251enum host_event_code {
252 EC_HOST_EVENT_LID_CLOSED = 1,
253 EC_HOST_EVENT_LID_OPEN = 2,
254 EC_HOST_EVENT_POWER_BUTTON = 3,
255 EC_HOST_EVENT_AC_CONNECTED = 4,
256 EC_HOST_EVENT_AC_DISCONNECTED = 5,
257 EC_HOST_EVENT_BATTERY_LOW = 6,
258 EC_HOST_EVENT_BATTERY_CRITICAL = 7,
259 EC_HOST_EVENT_BATTERY = 8,
260 EC_HOST_EVENT_THERMAL_THRESHOLD = 9,
261 EC_HOST_EVENT_THERMAL_OVERLOAD = 10,
262 EC_HOST_EVENT_THERMAL = 11,
263 EC_HOST_EVENT_USB_CHARGER = 12,
264 EC_HOST_EVENT_KEY_PRESSED = 13,
265
266
267
268
269
270 EC_HOST_EVENT_INTERFACE_READY = 14,
271
272 EC_HOST_EVENT_KEYBOARD_RECOVERY = 15,
273
274
275 EC_HOST_EVENT_THERMAL_SHUTDOWN = 16,
276
277 EC_HOST_EVENT_BATTERY_SHUTDOWN = 17,
278
279
280 EC_HOST_EVENT_THROTTLE_START = 18,
281
282 EC_HOST_EVENT_THROTTLE_STOP = 19,
283
284
285 EC_HOST_EVENT_HANG_DETECT = 20,
286
287 EC_HOST_EVENT_HANG_REBOOT = 21,
288
289 EC_HOST_EVENT_PD_MCU = 22,
290
291
292 EC_HOST_EVENT_USB_MUX = 28,
293
294
295
296
297
298
299
300
301 EC_HOST_EVENT_INVALID = 32
302};
303
304#define EC_HOST_EVENT_MASK(event_code) (1UL << ((event_code) - 1))
305
306
307struct ec_lpc_host_args {
308 uint8_t flags;
309 uint8_t command_version;
310 uint8_t data_size;
311
312
313
314
315 uint8_t checksum;
316} __packed;
317
318
319
320
321
322
323
324
325
326
327
328#define EC_HOST_ARGS_FLAG_FROM_HOST 0x01
329
330
331
332
333
334
335
336#define EC_HOST_ARGS_FLAG_TO_HOST 0x02
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#define EC_SPI_FRAME_START 0xec
379
380
381
382
383#define EC_SPI_PAST_END 0xed
384
385
386
387
388
389
390#define EC_SPI_RX_READY 0xf8
391
392
393
394
395
396#define EC_SPI_RECEIVING 0xf9
397
398
399#define EC_SPI_PROCESSING 0xfa
400
401
402
403
404
405#define EC_SPI_RX_BAD_DATA 0xfb
406
407
408
409
410
411
412#define EC_SPI_NOT_READY 0xfc
413
414
415
416
417
418
419#define EC_SPI_OLD_READY 0xfd
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439#define EC_PROTO2_REQUEST_HEADER_BYTES 3
440#define EC_PROTO2_REQUEST_TRAILER_BYTES 1
441#define EC_PROTO2_REQUEST_OVERHEAD (EC_PROTO2_REQUEST_HEADER_BYTES + \
442 EC_PROTO2_REQUEST_TRAILER_BYTES)
443
444#define EC_PROTO2_RESPONSE_HEADER_BYTES 2
445#define EC_PROTO2_RESPONSE_TRAILER_BYTES 1
446#define EC_PROTO2_RESPONSE_OVERHEAD (EC_PROTO2_RESPONSE_HEADER_BYTES + \
447 EC_PROTO2_RESPONSE_TRAILER_BYTES)
448
449
450#define EC_PROTO2_MAX_PARAM_SIZE 0xfc
451
452
453#define EC_PROTO2_MAX_REQUEST_SIZE (EC_PROTO2_REQUEST_OVERHEAD + \
454 EC_PROTO2_MAX_PARAM_SIZE)
455#define EC_PROTO2_MAX_RESPONSE_SIZE (EC_PROTO2_RESPONSE_OVERHEAD + \
456 EC_PROTO2_MAX_PARAM_SIZE)
457
458
459
460
461
462
463
464#define EC_COMMAND_PROTOCOL_3 0xda
465
466#define EC_HOST_REQUEST_VERSION 3
467
468
469struct ec_host_request {
470
471
472
473
474
475 uint8_t struct_version;
476
477
478
479
480
481 uint8_t checksum;
482
483
484 uint16_t command;
485
486
487 uint8_t command_version;
488
489
490 uint8_t reserved;
491
492
493 uint16_t data_len;
494} __packed;
495
496#define EC_HOST_RESPONSE_VERSION 3
497
498
499struct ec_host_response {
500
501 uint8_t struct_version;
502
503
504
505
506
507 uint8_t checksum;
508
509
510 uint16_t result;
511
512
513 uint16_t data_len;
514
515
516 uint16_t reserved;
517} __packed;
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538#define EC_CMD_PROTO_VERSION 0x00
539
540struct ec_response_proto_version {
541 uint32_t version;
542} __packed;
543
544
545
546
547
548#define EC_CMD_HELLO 0x01
549
550struct ec_params_hello {
551 uint32_t in_data;
552} __packed;
553
554struct ec_response_hello {
555 uint32_t out_data;
556} __packed;
557
558
559#define EC_CMD_GET_VERSION 0x02
560
561enum ec_current_image {
562 EC_IMAGE_UNKNOWN = 0,
563 EC_IMAGE_RO,
564 EC_IMAGE_RW
565};
566
567struct ec_response_get_version {
568
569 char version_string_ro[32];
570 char version_string_rw[32];
571 char reserved[32];
572 uint32_t current_image;
573} __packed;
574
575
576#define EC_CMD_READ_TEST 0x03
577
578struct ec_params_read_test {
579 uint32_t offset;
580 uint32_t size;
581} __packed;
582
583struct ec_response_read_test {
584 uint32_t data[32];
585} __packed;
586
587
588
589
590
591
592#define EC_CMD_GET_BUILD_INFO 0x04
593
594
595#define EC_CMD_GET_CHIP_INFO 0x05
596
597struct ec_response_get_chip_info {
598
599 char vendor[32];
600 char name[32];
601 char revision[32];
602} __packed;
603
604
605#define EC_CMD_GET_BOARD_VERSION 0x06
606
607struct ec_response_board_version {
608 uint16_t board_version;
609} __packed;
610
611
612
613
614
615
616
617
618
619#define EC_CMD_READ_MEMMAP 0x07
620
621struct ec_params_read_memmap {
622 uint8_t offset;
623 uint8_t size;
624} __packed;
625
626
627#define EC_CMD_GET_CMD_VERSIONS 0x08
628
629struct ec_params_get_cmd_versions {
630 uint8_t cmd;
631} __packed;
632
633struct ec_params_get_cmd_versions_v1 {
634 uint16_t cmd;
635} __packed;
636
637struct ec_response_get_cmd_versions {
638
639
640
641
642 uint32_t version_mask;
643} __packed;
644
645
646
647
648
649
650
651
652#define EC_CMD_GET_COMMS_STATUS 0x09
653
654
655enum ec_comms_status {
656 EC_COMMS_STATUS_PROCESSING = 1 << 0,
657};
658
659struct ec_response_get_comms_status {
660 uint32_t flags;
661} __packed;
662
663
664#define EC_CMD_TEST_PROTOCOL 0x0a
665
666
667struct ec_params_test_protocol {
668 uint32_t ec_result;
669 uint32_t ret_len;
670 uint8_t buf[32];
671} __packed;
672
673
674struct ec_response_test_protocol {
675 uint8_t buf[32];
676} __packed;
677
678
679#define EC_CMD_GET_PROTOCOL_INFO 0x0b
680
681
682
683#define EC_PROTOCOL_INFO_IN_PROGRESS_SUPPORTED (1 << 0)
684
685struct ec_response_get_protocol_info {
686
687
688
689 uint32_t protocol_versions;
690
691
692 uint16_t max_request_packet_size;
693
694
695 uint16_t max_response_packet_size;
696
697
698 uint32_t flags;
699} __packed;
700
701
702
703
704
705
706#define EC_GSV_SET 0x80000000
707
708
709
710#define EC_GSV_PARAM_MASK 0x00ffffff
711
712struct ec_params_get_set_value {
713 uint32_t flags;
714 uint32_t value;
715} __packed;
716
717struct ec_response_get_set_value {
718 uint32_t flags;
719 uint32_t value;
720} __packed;
721
722
723#define EC_CMD_GSV_PAUSE_IN_S5 0x0c
724
725
726
727#define EC_CMD_GET_FEATURES 0x0d
728
729
730enum ec_feature_code {
731
732
733
734
735 EC_FEATURE_LIMITED = 0,
736
737
738
739
740 EC_FEATURE_FLASH = 1,
741
742
743
744 EC_FEATURE_PWM_FAN = 2,
745
746
747
748 EC_FEATURE_PWM_KEYB = 3,
749
750
751
752 EC_FEATURE_LIGHTBAR = 4,
753
754 EC_FEATURE_LED = 5,
755
756
757
758
759 EC_FEATURE_MOTION_SENSE = 6,
760
761 EC_FEATURE_KEYB = 7,
762
763 EC_FEATURE_PSTORE = 8,
764
765 EC_FEATURE_PORT80 = 9,
766
767
768
769
770 EC_FEATURE_THERMAL = 10,
771
772 EC_FEATURE_BKLIGHT_SWITCH = 11,
773
774 EC_FEATURE_WIFI_SWITCH = 12,
775
776 EC_FEATURE_HOST_EVENTS = 13,
777
778 EC_FEATURE_GPIO = 14,
779
780 EC_FEATURE_I2C = 15,
781
782 EC_FEATURE_CHARGER = 16,
783
784 EC_FEATURE_BATTERY = 17,
785
786
787
788
789 EC_FEATURE_SMART_BATTERY = 18,
790
791 EC_FEATURE_HANG_DETECT = 19,
792
793 EC_FEATURE_PMU = 20,
794
795 EC_FEATURE_SUB_MCU = 21,
796
797 EC_FEATURE_USB_PD = 22,
798
799 EC_FEATURE_USB_MUX = 23,
800
801 EC_FEATURE_MOTION_SENSE_FIFO = 24,
802};
803
804#define EC_FEATURE_MASK_0(event_code) (1UL << (event_code % 32))
805#define EC_FEATURE_MASK_1(event_code) (1UL << (event_code - 32))
806struct ec_response_get_features {
807 uint32_t flags[2];
808} __packed;
809
810
811
812
813
814#define EC_CMD_FLASH_INFO 0x10
815
816
817struct ec_response_flash_info {
818
819 uint32_t flash_size;
820
821
822
823
824 uint32_t write_block_size;
825
826
827
828
829 uint32_t erase_block_size;
830
831
832
833
834 uint32_t protect_block_size;
835} __packed;
836
837
838
839#define EC_FLASH_INFO_ERASE_TO_0 (1 << 0)
840
841
842
843
844
845
846
847
848struct ec_response_flash_info_1 {
849
850 uint32_t flash_size;
851 uint32_t write_block_size;
852 uint32_t erase_block_size;
853 uint32_t protect_block_size;
854
855
856
857
858
859
860
861
862 uint32_t write_ideal_size;
863
864
865 uint32_t flags;
866} __packed;
867
868
869
870
871
872
873#define EC_CMD_FLASH_READ 0x11
874
875struct ec_params_flash_read {
876 uint32_t offset;
877 uint32_t size;
878} __packed;
879
880
881#define EC_CMD_FLASH_WRITE 0x12
882#define EC_VER_FLASH_WRITE 1
883
884
885#define EC_FLASH_WRITE_VER0_SIZE 64
886
887struct ec_params_flash_write {
888 uint32_t offset;
889 uint32_t size;
890
891} __packed;
892
893
894#define EC_CMD_FLASH_ERASE 0x13
895
896struct ec_params_flash_erase {
897 uint32_t offset;
898 uint32_t size;
899} __packed;
900
901
902
903
904
905
906
907
908
909
910
911#define EC_CMD_FLASH_PROTECT 0x15
912#define EC_VER_FLASH_PROTECT 1
913
914
915
916#define EC_FLASH_PROTECT_RO_AT_BOOT (1 << 0)
917
918
919
920
921#define EC_FLASH_PROTECT_RO_NOW (1 << 1)
922
923#define EC_FLASH_PROTECT_ALL_NOW (1 << 2)
924
925#define EC_FLASH_PROTECT_GPIO_ASSERTED (1 << 3)
926
927#define EC_FLASH_PROTECT_ERROR_STUCK (1 << 4)
928
929
930
931
932
933#define EC_FLASH_PROTECT_ERROR_INCONSISTENT (1 << 5)
934
935#define EC_FLASH_PROTECT_ALL_AT_BOOT (1 << 6)
936
937struct ec_params_flash_protect {
938 uint32_t mask;
939 uint32_t flags;
940} __packed;
941
942struct ec_response_flash_protect {
943
944 uint32_t flags;
945
946
947
948
949
950 uint32_t valid_flags;
951
952 uint32_t writable_flags;
953} __packed;
954
955
956
957
958
959
960
961#define EC_CMD_FLASH_REGION_INFO 0x16
962#define EC_VER_FLASH_REGION_INFO 1
963
964enum ec_flash_region {
965
966 EC_FLASH_REGION_RO = 0,
967
968 EC_FLASH_REGION_RW,
969
970
971
972
973 EC_FLASH_REGION_WP_RO,
974
975 EC_FLASH_REGION_COUNT,
976};
977
978struct ec_params_flash_region_info {
979 uint32_t region;
980} __packed;
981
982struct ec_response_flash_region_info {
983 uint32_t offset;
984 uint32_t size;
985} __packed;
986
987
988#define EC_CMD_VBNV_CONTEXT 0x17
989#define EC_VER_VBNV_CONTEXT 1
990#define EC_VBNV_BLOCK_SIZE 16
991
992enum ec_vbnvcontext_op {
993 EC_VBNV_CONTEXT_OP_READ,
994 EC_VBNV_CONTEXT_OP_WRITE,
995};
996
997struct ec_params_vbnvcontext {
998 uint32_t op;
999 uint8_t block[EC_VBNV_BLOCK_SIZE];
1000} __packed;
1001
1002struct ec_response_vbnvcontext {
1003 uint8_t block[EC_VBNV_BLOCK_SIZE];
1004} __packed;
1005
1006
1007
1008
1009
1010#define EC_CMD_PWM_GET_FAN_TARGET_RPM 0x20
1011
1012struct ec_response_pwm_get_fan_rpm {
1013 uint32_t rpm;
1014} __packed;
1015
1016
1017#define EC_CMD_PWM_SET_FAN_TARGET_RPM 0x21
1018
1019struct ec_params_pwm_set_fan_target_rpm {
1020 uint32_t rpm;
1021} __packed;
1022
1023
1024#define EC_CMD_PWM_GET_KEYBOARD_BACKLIGHT 0x22
1025
1026struct ec_response_pwm_get_keyboard_backlight {
1027 uint8_t percent;
1028 uint8_t enabled;
1029} __packed;
1030
1031
1032#define EC_CMD_PWM_SET_KEYBOARD_BACKLIGHT 0x23
1033
1034struct ec_params_pwm_set_keyboard_backlight {
1035 uint8_t percent;
1036} __packed;
1037
1038
1039#define EC_CMD_PWM_SET_FAN_DUTY 0x24
1040
1041struct ec_params_pwm_set_fan_duty {
1042 uint32_t percent;
1043} __packed;
1044
1045#define EC_CMD_PWM_SET_DUTY 0x25
1046
1047#define EC_PWM_MAX_DUTY 0xffff
1048
1049enum ec_pwm_type {
1050
1051 EC_PWM_TYPE_GENERIC = 0,
1052
1053 EC_PWM_TYPE_KB_LIGHT,
1054
1055 EC_PWM_TYPE_DISPLAY_LIGHT,
1056 EC_PWM_TYPE_COUNT,
1057};
1058
1059struct ec_params_pwm_set_duty {
1060 uint16_t duty;
1061 uint8_t pwm_type;
1062 uint8_t index;
1063} __packed;
1064
1065#define EC_CMD_PWM_GET_DUTY 0x26
1066
1067struct ec_params_pwm_get_duty {
1068 uint8_t pwm_type;
1069 uint8_t index;
1070} __packed;
1071
1072struct ec_response_pwm_get_duty {
1073 uint16_t duty;
1074} __packed;
1075
1076
1077
1078
1079
1080
1081
1082
1083#define EC_CMD_LIGHTBAR_CMD 0x28
1084
1085struct rgb_s {
1086 uint8_t r, g, b;
1087};
1088
1089#define LB_BATTERY_LEVELS 4
1090
1091
1092
1093struct lightbar_params_v0 {
1094
1095 int32_t google_ramp_up;
1096 int32_t google_ramp_down;
1097 int32_t s3s0_ramp_up;
1098 int32_t s0_tick_delay[2];
1099 int32_t s0a_tick_delay[2];
1100 int32_t s0s3_ramp_down;
1101 int32_t s3_sleep_for;
1102 int32_t s3_ramp_up;
1103 int32_t s3_ramp_down;
1104
1105
1106 uint8_t new_s0;
1107 uint8_t osc_min[2];
1108 uint8_t osc_max[2];
1109 uint8_t w_ofs[2];
1110
1111
1112 uint8_t bright_bl_off_fixed[2];
1113 uint8_t bright_bl_on_min[2];
1114 uint8_t bright_bl_on_max[2];
1115
1116
1117 uint8_t battery_threshold[LB_BATTERY_LEVELS - 1];
1118
1119
1120 uint8_t s0_idx[2][LB_BATTERY_LEVELS];
1121 uint8_t s3_idx[2][LB_BATTERY_LEVELS];
1122
1123
1124 struct rgb_s color[8];
1125} __packed;
1126
1127struct lightbar_params_v1 {
1128
1129 int32_t google_ramp_up;
1130 int32_t google_ramp_down;
1131 int32_t s3s0_ramp_up;
1132 int32_t s0_tick_delay[2];
1133 int32_t s0a_tick_delay[2];
1134 int32_t s0s3_ramp_down;
1135 int32_t s3_sleep_for;
1136 int32_t s3_ramp_up;
1137 int32_t s3_ramp_down;
1138 int32_t tap_tick_delay;
1139 int32_t tap_display_time;
1140
1141
1142 uint8_t tap_pct_red;
1143 uint8_t tap_pct_green;
1144 uint8_t tap_seg_min_on;
1145 uint8_t tap_seg_max_on;
1146 uint8_t tap_seg_osc;
1147 uint8_t tap_idx[3];
1148
1149
1150 uint8_t osc_min[2];
1151 uint8_t osc_max[2];
1152 uint8_t w_ofs[2];
1153
1154
1155 uint8_t bright_bl_off_fixed[2];
1156 uint8_t bright_bl_on_min[2];
1157 uint8_t bright_bl_on_max[2];
1158
1159
1160 uint8_t battery_threshold[LB_BATTERY_LEVELS - 1];
1161
1162
1163 uint8_t s0_idx[2][LB_BATTERY_LEVELS];
1164 uint8_t s3_idx[2][LB_BATTERY_LEVELS];
1165
1166
1167 struct rgb_s color[8];
1168} __packed;
1169
1170
1171#define EC_LB_PROG_LEN 192
1172struct lightbar_program {
1173 uint8_t size;
1174 uint8_t data[EC_LB_PROG_LEN];
1175};
1176
1177struct ec_params_lightbar {
1178 uint8_t cmd;
1179 union {
1180 struct {
1181
1182 } dump, off, on, init, get_seq, get_params_v0, get_params_v1,
1183 version, get_brightness, get_demo, suspend, resume;
1184
1185 struct {
1186 uint8_t num;
1187 } set_brightness, seq, demo;
1188
1189 struct {
1190 uint8_t ctrl, reg, value;
1191 } reg;
1192
1193 struct {
1194 uint8_t led, red, green, blue;
1195 } set_rgb;
1196
1197 struct {
1198 uint8_t led;
1199 } get_rgb;
1200
1201 struct {
1202 uint8_t enable;
1203 } manual_suspend_ctrl;
1204
1205 struct lightbar_params_v0 set_params_v0;
1206 struct lightbar_params_v1 set_params_v1;
1207 struct lightbar_program set_program;
1208 };
1209} __packed;
1210
1211struct ec_response_lightbar {
1212 union {
1213 struct {
1214 struct {
1215 uint8_t reg;
1216 uint8_t ic0;
1217 uint8_t ic1;
1218 } vals[23];
1219 } dump;
1220
1221 struct {
1222 uint8_t num;
1223 } get_seq, get_brightness, get_demo;
1224
1225 struct lightbar_params_v0 get_params_v0;
1226 struct lightbar_params_v1 get_params_v1;
1227
1228 struct {
1229 uint32_t num;
1230 uint32_t flags;
1231 } version;
1232
1233 struct {
1234 uint8_t red, green, blue;
1235 } get_rgb;
1236
1237 struct {
1238
1239 } off, on, init, set_brightness, seq, reg, set_rgb,
1240 demo, set_params_v0, set_params_v1,
1241 set_program, manual_suspend_ctrl, suspend, resume;
1242 };
1243} __packed;
1244
1245
1246enum lightbar_command {
1247 LIGHTBAR_CMD_DUMP = 0,
1248 LIGHTBAR_CMD_OFF = 1,
1249 LIGHTBAR_CMD_ON = 2,
1250 LIGHTBAR_CMD_INIT = 3,
1251 LIGHTBAR_CMD_SET_BRIGHTNESS = 4,
1252 LIGHTBAR_CMD_SEQ = 5,
1253 LIGHTBAR_CMD_REG = 6,
1254 LIGHTBAR_CMD_SET_RGB = 7,
1255 LIGHTBAR_CMD_GET_SEQ = 8,
1256 LIGHTBAR_CMD_DEMO = 9,
1257 LIGHTBAR_CMD_GET_PARAMS_V0 = 10,
1258 LIGHTBAR_CMD_SET_PARAMS_V0 = 11,
1259 LIGHTBAR_CMD_VERSION = 12,
1260 LIGHTBAR_CMD_GET_BRIGHTNESS = 13,
1261 LIGHTBAR_CMD_GET_RGB = 14,
1262 LIGHTBAR_CMD_GET_DEMO = 15,
1263 LIGHTBAR_CMD_GET_PARAMS_V1 = 16,
1264 LIGHTBAR_CMD_SET_PARAMS_V1 = 17,
1265 LIGHTBAR_CMD_SET_PROGRAM = 18,
1266 LIGHTBAR_CMD_MANUAL_SUSPEND_CTRL = 19,
1267 LIGHTBAR_CMD_SUSPEND = 20,
1268 LIGHTBAR_CMD_RESUME = 21,
1269 LIGHTBAR_NUM_CMDS
1270};
1271
1272
1273
1274
1275#define EC_CMD_LED_CONTROL 0x29
1276
1277enum ec_led_id {
1278
1279 EC_LED_ID_BATTERY_LED = 0,
1280
1281
1282
1283
1284 EC_LED_ID_POWER_LED,
1285
1286 EC_LED_ID_ADAPTER_LED,
1287
1288 EC_LED_ID_COUNT
1289};
1290
1291
1292#define EC_LED_FLAGS_QUERY (1 << 0)
1293#define EC_LED_FLAGS_AUTO (1 << 1)
1294
1295enum ec_led_colors {
1296 EC_LED_COLOR_RED = 0,
1297 EC_LED_COLOR_GREEN,
1298 EC_LED_COLOR_BLUE,
1299 EC_LED_COLOR_YELLOW,
1300 EC_LED_COLOR_WHITE,
1301
1302 EC_LED_COLOR_COUNT
1303};
1304
1305struct ec_params_led_control {
1306 uint8_t led_id;
1307 uint8_t flags;
1308
1309 uint8_t brightness[EC_LED_COLOR_COUNT];
1310} __packed;
1311
1312struct ec_response_led_control {
1313
1314
1315
1316
1317
1318
1319
1320 uint8_t brightness_range[EC_LED_COLOR_COUNT];
1321} __packed;
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332#define EC_CMD_VBOOT_HASH 0x2A
1333
1334struct ec_params_vboot_hash {
1335 uint8_t cmd;
1336 uint8_t hash_type;
1337 uint8_t nonce_size;
1338 uint8_t reserved0;
1339 uint32_t offset;
1340 uint32_t size;
1341 uint8_t nonce_data[64];
1342} __packed;
1343
1344struct ec_response_vboot_hash {
1345 uint8_t status;
1346 uint8_t hash_type;
1347 uint8_t digest_size;
1348 uint8_t reserved0;
1349 uint32_t offset;
1350 uint32_t size;
1351 uint8_t hash_digest[64];
1352} __packed;
1353
1354enum ec_vboot_hash_cmd {
1355 EC_VBOOT_HASH_GET = 0,
1356 EC_VBOOT_HASH_ABORT = 1,
1357 EC_VBOOT_HASH_START = 2,
1358 EC_VBOOT_HASH_RECALC = 3,
1359};
1360
1361enum ec_vboot_hash_type {
1362 EC_VBOOT_HASH_TYPE_SHA256 = 0,
1363};
1364
1365enum ec_vboot_hash_status {
1366 EC_VBOOT_HASH_STATUS_NONE = 0,
1367 EC_VBOOT_HASH_STATUS_DONE = 1,
1368 EC_VBOOT_HASH_STATUS_BUSY = 2,
1369};
1370
1371
1372
1373
1374
1375
1376#define EC_VBOOT_HASH_OFFSET_RO 0xfffffffe
1377#define EC_VBOOT_HASH_OFFSET_RW 0xfffffffd
1378
1379
1380
1381
1382
1383
1384#define EC_CMD_MOTION_SENSE_CMD 0x2B
1385
1386
1387enum motionsense_command {
1388
1389
1390
1391
1392 MOTIONSENSE_CMD_DUMP = 0,
1393
1394
1395
1396
1397
1398
1399 MOTIONSENSE_CMD_INFO = 1,
1400
1401
1402
1403
1404
1405 MOTIONSENSE_CMD_EC_RATE = 2,
1406
1407
1408
1409
1410
1411 MOTIONSENSE_CMD_SENSOR_ODR = 3,
1412
1413
1414
1415
1416
1417 MOTIONSENSE_CMD_SENSOR_RANGE = 4,
1418
1419
1420
1421
1422
1423
1424
1425
1426 MOTIONSENSE_CMD_KB_WAKE_ANGLE = 5,
1427
1428
1429
1430
1431 MOTIONSENSE_CMD_DATA = 6,
1432
1433
1434
1435
1436
1437 MOTIONSENSE_CMD_PERFORM_CALIB = 10,
1438
1439
1440
1441
1442
1443
1444 MOTIONSENSE_CMD_SENSOR_OFFSET = 11,
1445
1446
1447 MOTIONSENSE_NUM_CMDS
1448};
1449
1450enum motionsensor_id {
1451 EC_MOTION_SENSOR_ACCEL_BASE = 0,
1452 EC_MOTION_SENSOR_ACCEL_LID = 1,
1453 EC_MOTION_SENSOR_GYRO = 2,
1454
1455
1456
1457
1458
1459 EC_MOTION_SENSOR_COUNT = 3
1460};
1461
1462
1463enum motionsensor_type {
1464 MOTIONSENSE_TYPE_ACCEL = 0,
1465 MOTIONSENSE_TYPE_GYRO = 1,
1466 MOTIONSENSE_TYPE_MAG = 2,
1467 MOTIONSENSE_TYPE_PROX = 3,
1468 MOTIONSENSE_TYPE_LIGHT = 4,
1469 MOTIONSENSE_TYPE_ACTIVITY = 5,
1470 MOTIONSENSE_TYPE_BARO = 6,
1471 MOTIONSENSE_TYPE_MAX,
1472};
1473
1474
1475enum motionsensor_location {
1476 MOTIONSENSE_LOC_BASE = 0,
1477 MOTIONSENSE_LOC_LID = 1,
1478 MOTIONSENSE_LOC_MAX,
1479};
1480
1481
1482enum motionsensor_chip {
1483 MOTIONSENSE_CHIP_KXCJ9 = 0,
1484};
1485
1486
1487#define MOTIONSENSE_MODULE_FLAG_ACTIVE (1<<0)
1488
1489
1490#define MOTIONSENSE_SENSOR_FLAG_PRESENT (1<<0)
1491
1492
1493
1494
1495
1496
1497#define EC_MOTION_SENSE_NO_VALUE -1
1498
1499#define EC_MOTION_SENSE_INVALID_CALIB_TEMP 0x8000
1500
1501
1502#define MOTION_SENSE_SET_OFFSET 1
1503
1504struct ec_response_motion_sensor_data {
1505
1506 uint8_t flags;
1507
1508 uint8_t sensor_num;
1509
1510 union {
1511 int16_t data[3];
1512 struct {
1513 uint16_t rsvd;
1514 uint32_t timestamp;
1515 } __packed;
1516 struct {
1517 uint8_t activity;
1518 uint8_t state;
1519 int16_t add_info[2];
1520 };
1521 };
1522} __packed;
1523
1524struct ec_params_motion_sense {
1525 uint8_t cmd;
1526 union {
1527
1528 struct {
1529
1530 } dump;
1531
1532
1533
1534
1535
1536 struct {
1537
1538 int16_t data;
1539 } ec_rate, kb_wake_angle;
1540
1541
1542 struct {
1543 uint8_t sensor_num;
1544
1545
1546
1547
1548
1549
1550 uint16_t flags;
1551
1552
1553
1554
1555
1556
1557
1558 int16_t temp;
1559
1560
1561
1562
1563
1564
1565
1566
1567 int16_t offset[3];
1568 } __packed sensor_offset;
1569
1570
1571 struct {
1572 uint8_t sensor_num;
1573 } info;
1574
1575
1576
1577
1578
1579 struct {
1580
1581 uint8_t sensor_num;
1582
1583
1584 uint8_t roundup;
1585
1586 uint16_t reserved;
1587
1588
1589 int32_t data;
1590 } sensor_odr, sensor_range;
1591 };
1592} __packed;
1593
1594struct ec_response_motion_sense {
1595 union {
1596
1597 struct {
1598
1599 uint8_t module_flags;
1600
1601
1602 uint8_t sensor_count;
1603
1604
1605
1606
1607
1608 struct ec_response_motion_sensor_data sensor[0];
1609 } dump;
1610
1611
1612 struct {
1613
1614 uint8_t type;
1615
1616
1617 uint8_t location;
1618
1619
1620 uint8_t chip;
1621 } info;
1622
1623
1624 struct ec_response_motion_sensor_data data;
1625
1626
1627
1628
1629
1630
1631 struct {
1632
1633 int32_t ret;
1634 } ec_rate, sensor_odr, sensor_range, kb_wake_angle;
1635
1636
1637 struct {
1638 int16_t temp;
1639 int16_t offset[3];
1640 } sensor_offset, perform_calib;
1641 };
1642} __packed;
1643
1644
1645
1646
1647
1648#define EC_CMD_USB_CHARGE_SET_MODE 0x30
1649
1650struct ec_params_usb_charge_set_mode {
1651 uint8_t usb_port_id;
1652 uint8_t mode;
1653} __packed;
1654
1655
1656
1657
1658
1659#define EC_PSTORE_SIZE_MAX 64
1660
1661
1662#define EC_CMD_PSTORE_INFO 0x40
1663
1664struct ec_response_pstore_info {
1665
1666 uint32_t pstore_size;
1667
1668 uint32_t access_size;
1669} __packed;
1670
1671
1672
1673
1674
1675
1676#define EC_CMD_PSTORE_READ 0x41
1677
1678struct ec_params_pstore_read {
1679 uint32_t offset;
1680 uint32_t size;
1681} __packed;
1682
1683
1684#define EC_CMD_PSTORE_WRITE 0x42
1685
1686struct ec_params_pstore_write {
1687 uint32_t offset;
1688 uint32_t size;
1689 uint8_t data[EC_PSTORE_SIZE_MAX];
1690} __packed;
1691
1692
1693
1694
1695
1696struct ec_params_rtc {
1697 uint32_t time;
1698} __packed;
1699
1700struct ec_response_rtc {
1701 uint32_t time;
1702} __packed;
1703
1704
1705#define EC_CMD_RTC_GET_VALUE 0x44
1706#define EC_CMD_RTC_GET_ALARM 0x45
1707
1708
1709#define EC_CMD_RTC_SET_VALUE 0x46
1710#define EC_CMD_RTC_SET_ALARM 0x47
1711
1712
1713
1714
1715
1716#define EC_PORT80_SIZE_MAX 32
1717
1718
1719#define EC_CMD_PORT80_LAST_BOOT 0x48
1720#define EC_CMD_PORT80_READ 0x48
1721
1722enum ec_port80_subcmd {
1723 EC_PORT80_GET_INFO = 0,
1724 EC_PORT80_READ_BUFFER,
1725};
1726
1727struct ec_params_port80_read {
1728 uint16_t subcmd;
1729 union {
1730 struct {
1731 uint32_t offset;
1732 uint32_t num_entries;
1733 } read_buffer;
1734 };
1735} __packed;
1736
1737struct ec_response_port80_read {
1738 union {
1739 struct {
1740 uint32_t writes;
1741 uint32_t history_size;
1742 uint32_t last_boot;
1743 } get_info;
1744 struct {
1745 uint16_t codes[EC_PORT80_SIZE_MAX];
1746 } data;
1747 };
1748} __packed;
1749
1750struct ec_response_port80_last_boot {
1751 uint16_t code;
1752} __packed;
1753
1754
1755
1756
1757
1758
1759
1760
1761#define EC_CMD_THERMAL_SET_THRESHOLD 0x50
1762#define EC_CMD_THERMAL_GET_THRESHOLD 0x51
1763
1764
1765
1766
1767
1768
1769struct ec_params_thermal_set_threshold {
1770 uint8_t sensor_type;
1771 uint8_t threshold_id;
1772 uint16_t value;
1773} __packed;
1774
1775
1776struct ec_params_thermal_get_threshold {
1777 uint8_t sensor_type;
1778 uint8_t threshold_id;
1779} __packed;
1780
1781struct ec_response_thermal_get_threshold {
1782 uint16_t value;
1783} __packed;
1784
1785
1786
1787enum ec_temp_thresholds {
1788 EC_TEMP_THRESH_WARN = 0,
1789 EC_TEMP_THRESH_HIGH,
1790 EC_TEMP_THRESH_HALT,
1791
1792 EC_TEMP_THRESH_COUNT
1793};
1794
1795
1796
1797
1798struct ec_thermal_config {
1799 uint32_t temp_host[EC_TEMP_THRESH_COUNT];
1800 uint32_t temp_fan_off;
1801 uint32_t temp_fan_max;
1802} __packed;
1803
1804
1805struct ec_params_thermal_get_threshold_v1 {
1806 uint32_t sensor_num;
1807} __packed;
1808
1809
1810
1811
1812struct ec_params_thermal_set_threshold_v1 {
1813 uint32_t sensor_num;
1814 struct ec_thermal_config cfg;
1815} __packed;
1816
1817
1818
1819
1820
1821#define EC_CMD_THERMAL_AUTO_FAN_CTRL 0x52
1822
1823
1824#define EC_CMD_TMP006_GET_CALIBRATION 0x53
1825
1826struct ec_params_tmp006_get_calibration {
1827 uint8_t index;
1828} __packed;
1829
1830struct ec_response_tmp006_get_calibration {
1831 float s0;
1832 float b0;
1833 float b1;
1834 float b2;
1835} __packed;
1836
1837
1838#define EC_CMD_TMP006_SET_CALIBRATION 0x54
1839
1840struct ec_params_tmp006_set_calibration {
1841 uint8_t index;
1842 uint8_t reserved[3];
1843 float s0;
1844 float b0;
1845 float b1;
1846 float b2;
1847} __packed;
1848
1849
1850#define EC_CMD_TMP006_GET_RAW 0x55
1851
1852struct ec_params_tmp006_get_raw {
1853 uint8_t index;
1854} __packed;
1855
1856struct ec_response_tmp006_get_raw {
1857 int32_t t;
1858 int32_t v;
1859};
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874#define EC_CMD_MKBP_STATE 0x60
1875
1876
1877
1878
1879#define EC_CMD_MKBP_INFO 0x61
1880
1881struct ec_response_mkbp_info {
1882 uint32_t rows;
1883 uint32_t cols;
1884
1885 uint8_t reserved;
1886} __packed;
1887
1888struct ec_params_mkbp_info {
1889 uint8_t info_type;
1890 uint8_t event_type;
1891} __packed;
1892
1893enum ec_mkbp_info_type {
1894
1895
1896
1897
1898
1899 EC_MKBP_INFO_KBD = 0,
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910 EC_MKBP_INFO_SUPPORTED = 1,
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929 EC_MKBP_INFO_CURRENT = 2,
1930};
1931
1932
1933#define EC_CMD_MKBP_SIMULATE_KEY 0x62
1934
1935struct ec_params_mkbp_simulate_key {
1936 uint8_t col;
1937 uint8_t row;
1938 uint8_t pressed;
1939} __packed;
1940
1941
1942#define EC_CMD_MKBP_SET_CONFIG 0x64
1943#define EC_CMD_MKBP_GET_CONFIG 0x65
1944
1945
1946enum mkbp_config_flags {
1947 EC_MKBP_FLAGS_ENABLE = 1,
1948};
1949
1950enum mkbp_config_valid {
1951 EC_MKBP_VALID_SCAN_PERIOD = 1 << 0,
1952 EC_MKBP_VALID_POLL_TIMEOUT = 1 << 1,
1953 EC_MKBP_VALID_MIN_POST_SCAN_DELAY = 1 << 3,
1954 EC_MKBP_VALID_OUTPUT_SETTLE = 1 << 4,
1955 EC_MKBP_VALID_DEBOUNCE_DOWN = 1 << 5,
1956 EC_MKBP_VALID_DEBOUNCE_UP = 1 << 6,
1957 EC_MKBP_VALID_FIFO_MAX_DEPTH = 1 << 7,
1958};
1959
1960
1961struct ec_mkbp_config {
1962 uint32_t valid_mask;
1963 uint8_t flags;
1964 uint8_t valid_flags;
1965 uint16_t scan_period_us;
1966
1967 uint32_t poll_timeout_us;
1968
1969
1970
1971
1972
1973 uint16_t min_post_scan_delay_us;
1974
1975 uint16_t output_settle_us;
1976 uint16_t debounce_down_us;
1977 uint16_t debounce_up_us;
1978
1979 uint8_t fifo_max_depth;
1980} __packed;
1981
1982struct ec_params_mkbp_set_config {
1983 struct ec_mkbp_config config;
1984} __packed;
1985
1986struct ec_response_mkbp_get_config {
1987 struct ec_mkbp_config config;
1988} __packed;
1989
1990
1991#define EC_CMD_KEYSCAN_SEQ_CTRL 0x66
1992
1993enum ec_keyscan_seq_cmd {
1994 EC_KEYSCAN_SEQ_STATUS = 0,
1995 EC_KEYSCAN_SEQ_CLEAR = 1,
1996 EC_KEYSCAN_SEQ_ADD = 2,
1997 EC_KEYSCAN_SEQ_START = 3,
1998 EC_KEYSCAN_SEQ_COLLECT = 4,
1999};
2000
2001enum ec_collect_flags {
2002
2003
2004
2005
2006 EC_KEYSCAN_SEQ_FLAG_DONE = 1 << 0,
2007};
2008
2009struct ec_collect_item {
2010 uint8_t flags;
2011};
2012
2013struct ec_params_keyscan_seq_ctrl {
2014 uint8_t cmd;
2015 union {
2016 struct {
2017 uint8_t active;
2018 uint8_t num_items;
2019
2020 uint8_t cur_item;
2021 } status;
2022 struct {
2023
2024
2025
2026
2027 uint32_t time_us;
2028 uint8_t scan[0];
2029 } add;
2030 struct {
2031 uint8_t start_item;
2032 uint8_t num_items;
2033 } collect;
2034 };
2035} __packed;
2036
2037struct ec_result_keyscan_seq_ctrl {
2038 union {
2039 struct {
2040 uint8_t num_items;
2041
2042 struct ec_collect_item item[0];
2043 } collect;
2044 };
2045} __packed;
2046
2047
2048
2049
2050
2051
2052#define EC_CMD_GET_NEXT_EVENT 0x67
2053
2054enum ec_mkbp_event {
2055
2056 EC_MKBP_EVENT_KEY_MATRIX = 0,
2057
2058
2059 EC_MKBP_EVENT_HOST_EVENT = 1,
2060
2061
2062 EC_MKBP_EVENT_SENSOR_FIFO = 2,
2063
2064
2065 EC_MKBP_EVENT_BUTTON = 3,
2066
2067
2068 EC_MKBP_EVENT_SWITCH = 4,
2069
2070
2071 EC_MKBP_EVENT_SYSRQ = 6,
2072
2073
2074 EC_MKBP_EVENT_COUNT,
2075};
2076
2077union ec_response_get_next_data {
2078 uint8_t key_matrix[13];
2079
2080
2081 uint32_t host_event;
2082
2083 uint32_t buttons;
2084 uint32_t switches;
2085 uint32_t sysrq;
2086} __packed;
2087
2088struct ec_response_get_next_event {
2089 uint8_t event_type;
2090
2091 union ec_response_get_next_data data;
2092} __packed;
2093
2094
2095
2096#define EC_MKBP_POWER_BUTTON 0
2097#define EC_MKBP_VOL_UP 1
2098#define EC_MKBP_VOL_DOWN 2
2099
2100
2101#define EC_MKBP_LID_OPEN 0
2102#define EC_MKBP_TABLET_MODE 1
2103
2104
2105
2106
2107
2108#define EC_CMD_TEMP_SENSOR_GET_INFO 0x70
2109
2110struct ec_params_temp_sensor_get_info {
2111 uint8_t id;
2112} __packed;
2113
2114struct ec_response_temp_sensor_get_info {
2115 char sensor_name[32];
2116 uint8_t sensor_type;
2117} __packed;
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134struct ec_params_host_event_mask {
2135 uint32_t mask;
2136} __packed;
2137
2138struct ec_response_host_event_mask {
2139 uint32_t mask;
2140} __packed;
2141
2142
2143#define EC_CMD_HOST_EVENT_GET_B 0x87
2144#define EC_CMD_HOST_EVENT_GET_SMI_MASK 0x88
2145#define EC_CMD_HOST_EVENT_GET_SCI_MASK 0x89
2146#define EC_CMD_HOST_EVENT_GET_WAKE_MASK 0x8d
2147
2148
2149#define EC_CMD_HOST_EVENT_SET_SMI_MASK 0x8a
2150#define EC_CMD_HOST_EVENT_SET_SCI_MASK 0x8b
2151#define EC_CMD_HOST_EVENT_CLEAR 0x8c
2152#define EC_CMD_HOST_EVENT_SET_WAKE_MASK 0x8e
2153#define EC_CMD_HOST_EVENT_CLEAR_B 0x8f
2154
2155
2156
2157
2158
2159#define EC_CMD_SWITCH_ENABLE_BKLIGHT 0x90
2160
2161struct ec_params_switch_enable_backlight {
2162 uint8_t enabled;
2163} __packed;
2164
2165
2166#define EC_CMD_SWITCH_ENABLE_WIRELESS 0x91
2167#define EC_VER_SWITCH_ENABLE_WIRELESS 1
2168
2169
2170struct ec_params_switch_enable_wireless_v0 {
2171 uint8_t enabled;
2172} __packed;
2173
2174
2175struct ec_params_switch_enable_wireless_v1 {
2176
2177 uint8_t now_flags;
2178
2179
2180 uint8_t now_mask;
2181
2182
2183
2184
2185
2186
2187 uint8_t suspend_flags;
2188
2189
2190 uint8_t suspend_mask;
2191} __packed;
2192
2193
2194struct ec_response_switch_enable_wireless_v1 {
2195
2196 uint8_t now_flags;
2197
2198
2199 uint8_t suspend_flags;
2200} __packed;
2201
2202
2203
2204
2205
2206#define EC_CMD_GPIO_SET 0x92
2207
2208struct ec_params_gpio_set {
2209 char name[32];
2210 uint8_t val;
2211} __packed;
2212
2213
2214#define EC_CMD_GPIO_GET 0x93
2215
2216
2217struct ec_params_gpio_get {
2218 char name[32];
2219} __packed;
2220struct ec_response_gpio_get {
2221 uint8_t val;
2222} __packed;
2223
2224
2225struct ec_params_gpio_get_v1 {
2226 uint8_t subcmd;
2227 union {
2228 struct {
2229 char name[32];
2230 } get_value_by_name;
2231 struct {
2232 uint8_t index;
2233 } get_info;
2234 };
2235} __packed;
2236
2237struct ec_response_gpio_get_v1 {
2238 union {
2239 struct {
2240 uint8_t val;
2241 } get_value_by_name, get_count;
2242 struct {
2243 uint8_t val;
2244 char name[32];
2245 uint32_t flags;
2246 } get_info;
2247 };
2248} __packed;
2249
2250enum gpio_get_subcmd {
2251 EC_GPIO_GET_BY_NAME = 0,
2252 EC_GPIO_GET_COUNT = 1,
2253 EC_GPIO_GET_INFO = 2,
2254};
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265#define EC_CMD_I2C_READ 0x94
2266
2267struct ec_params_i2c_read {
2268 uint16_t addr;
2269 uint8_t read_size;
2270 uint8_t port;
2271 uint8_t offset;
2272} __packed;
2273struct ec_response_i2c_read {
2274 uint16_t data;
2275} __packed;
2276
2277
2278#define EC_CMD_I2C_WRITE 0x95
2279
2280struct ec_params_i2c_write {
2281 uint16_t data;
2282 uint16_t addr;
2283 uint8_t write_size;
2284 uint8_t port;
2285 uint8_t offset;
2286} __packed;
2287
2288
2289
2290
2291
2292
2293
2294#define EC_CMD_CHARGE_CONTROL 0x96
2295#define EC_VER_CHARGE_CONTROL 1
2296
2297enum ec_charge_control_mode {
2298 CHARGE_CONTROL_NORMAL = 0,
2299 CHARGE_CONTROL_IDLE,
2300 CHARGE_CONTROL_DISCHARGE,
2301};
2302
2303struct ec_params_charge_control {
2304 uint32_t mode;
2305} __packed;
2306
2307
2308
2309
2310
2311#define EC_CMD_CONSOLE_SNAPSHOT 0x97
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325#define EC_CMD_CONSOLE_READ 0x98
2326
2327enum ec_console_read_subcmd {
2328 CONSOLE_READ_NEXT = 0,
2329 CONSOLE_READ_RECENT
2330};
2331
2332struct ec_params_console_read_v1 {
2333 uint8_t subcmd;
2334} __packed;
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346#define EC_CMD_BATTERY_CUT_OFF 0x99
2347
2348#define EC_BATTERY_CUTOFF_FLAG_AT_SHUTDOWN (1 << 0)
2349
2350struct ec_params_battery_cutoff {
2351 uint8_t flags;
2352} __packed;
2353
2354
2355
2356
2357
2358
2359
2360#define EC_CMD_USB_MUX 0x9a
2361
2362struct ec_params_usb_mux {
2363 uint8_t mux;
2364} __packed;
2365
2366
2367
2368
2369enum ec_ldo_state {
2370 EC_LDO_STATE_OFF = 0,
2371 EC_LDO_STATE_ON = 1,
2372};
2373
2374
2375
2376
2377#define EC_CMD_LDO_SET 0x9b
2378
2379struct ec_params_ldo_set {
2380 uint8_t index;
2381 uint8_t state;
2382} __packed;
2383
2384
2385
2386
2387#define EC_CMD_LDO_GET 0x9c
2388
2389struct ec_params_ldo_get {
2390 uint8_t index;
2391} __packed;
2392
2393struct ec_response_ldo_get {
2394 uint8_t state;
2395} __packed;
2396
2397
2398
2399
2400
2401
2402
2403#define EC_CMD_POWER_INFO 0x9d
2404
2405struct ec_response_power_info {
2406 uint32_t usb_dev_type;
2407 uint16_t voltage_ac;
2408 uint16_t voltage_system;
2409 uint16_t current_system;
2410 uint16_t usb_current_limit;
2411} __packed;
2412
2413
2414
2415
2416#define EC_CMD_I2C_PASSTHRU 0x9e
2417
2418
2419#define EC_I2C_FLAG_READ (1 << 15)
2420
2421
2422#define EC_I2C_ADDR_MASK 0x3ff
2423
2424#define EC_I2C_STATUS_NAK (1 << 0)
2425#define EC_I2C_STATUS_TIMEOUT (1 << 1)
2426
2427
2428#define EC_I2C_STATUS_ERROR (EC_I2C_STATUS_NAK | EC_I2C_STATUS_TIMEOUT)
2429
2430struct ec_params_i2c_passthru_msg {
2431 uint16_t addr_flags;
2432 uint16_t len;
2433} __packed;
2434
2435struct ec_params_i2c_passthru {
2436 uint8_t port;
2437 uint8_t num_msgs;
2438 struct ec_params_i2c_passthru_msg msg[];
2439
2440} __packed;
2441
2442struct ec_response_i2c_passthru {
2443 uint8_t i2c_status;
2444 uint8_t num_msgs;
2445 uint8_t data[];
2446} __packed;
2447
2448
2449
2450
2451#define EC_CMD_HANG_DETECT 0x9f
2452
2453
2454
2455#define EC_HANG_START_ON_POWER_PRESS (1 << 0)
2456
2457
2458#define EC_HANG_START_ON_LID_CLOSE (1 << 1)
2459
2460
2461#define EC_HANG_START_ON_LID_OPEN (1 << 2)
2462
2463
2464#define EC_HANG_START_ON_RESUME (1 << 3)
2465
2466
2467
2468
2469#define EC_HANG_STOP_ON_POWER_RELEASE (1 << 8)
2470
2471
2472#define EC_HANG_STOP_ON_HOST_COMMAND (1 << 9)
2473
2474
2475#define EC_HANG_STOP_ON_SUSPEND (1 << 10)
2476
2477
2478
2479
2480
2481
2482
2483#define EC_HANG_START_NOW (1 << 30)
2484
2485
2486
2487
2488
2489
2490#define EC_HANG_STOP_NOW (1 << 31)
2491
2492struct ec_params_hang_detect {
2493
2494 uint32_t flags;
2495
2496
2497 uint16_t host_event_timeout_msec;
2498
2499
2500 uint16_t warm_reboot_timeout_msec;
2501} __packed;
2502
2503
2504
2505
2506
2507
2508
2509
2510#define EC_CMD_CHARGE_STATE 0xa0
2511
2512
2513enum charge_state_command {
2514 CHARGE_STATE_CMD_GET_STATE,
2515 CHARGE_STATE_CMD_GET_PARAM,
2516 CHARGE_STATE_CMD_SET_PARAM,
2517 CHARGE_STATE_NUM_CMDS
2518};
2519
2520
2521
2522
2523
2524enum charge_state_params {
2525 CS_PARAM_CHG_VOLTAGE,
2526 CS_PARAM_CHG_CURRENT,
2527 CS_PARAM_CHG_INPUT_CURRENT,
2528 CS_PARAM_CHG_STATUS,
2529 CS_PARAM_CHG_OPTION,
2530
2531 CS_NUM_BASE_PARAMS,
2532
2533
2534 CS_PARAM_CUSTOM_PROFILE_MIN = 0x10000,
2535 CS_PARAM_CUSTOM_PROFILE_MAX = 0x1ffff,
2536
2537
2538};
2539
2540struct ec_params_charge_state {
2541 uint8_t cmd;
2542 union {
2543 struct {
2544
2545 } get_state;
2546
2547 struct {
2548 uint32_t param;
2549 } get_param;
2550
2551 struct {
2552 uint32_t param;
2553 uint32_t value;
2554 } set_param;
2555 };
2556} __packed;
2557
2558struct ec_response_charge_state {
2559 union {
2560 struct {
2561 int ac;
2562 int chg_voltage;
2563 int chg_current;
2564 int chg_input_current;
2565 int batt_state_of_charge;
2566 } get_state;
2567
2568 struct {
2569 uint32_t value;
2570 } get_param;
2571 struct {
2572
2573 } set_param;
2574 };
2575} __packed;
2576
2577
2578
2579
2580
2581#define EC_CMD_CHARGE_CURRENT_LIMIT 0xa1
2582
2583struct ec_params_current_limit {
2584 uint32_t limit;
2585} __packed;
2586
2587
2588
2589
2590#define EC_CMD_EXT_POWER_CURRENT_LIMIT 0xa2
2591
2592struct ec_params_ext_power_current_limit {
2593 uint32_t limit;
2594} __packed;
2595
2596
2597#define EC_CMD_HOST_SLEEP_EVENT 0xa9
2598
2599enum host_sleep_event {
2600 HOST_SLEEP_EVENT_S3_SUSPEND = 1,
2601 HOST_SLEEP_EVENT_S3_RESUME = 2,
2602 HOST_SLEEP_EVENT_S0IX_SUSPEND = 3,
2603 HOST_SLEEP_EVENT_S0IX_RESUME = 4
2604};
2605
2606struct ec_params_host_sleep_event {
2607 uint8_t sleep_event;
2608} __packed;
2609
2610
2611
2612
2613
2614#define EC_CMD_SB_READ_WORD 0xb0
2615#define EC_CMD_SB_WRITE_WORD 0xb1
2616
2617
2618
2619
2620#define EC_CMD_SB_READ_BLOCK 0xb2
2621#define EC_CMD_SB_WRITE_BLOCK 0xb3
2622
2623struct ec_params_sb_rd {
2624 uint8_t reg;
2625} __packed;
2626
2627struct ec_response_sb_rd_word {
2628 uint16_t value;
2629} __packed;
2630
2631struct ec_params_sb_wr_word {
2632 uint8_t reg;
2633 uint16_t value;
2634} __packed;
2635
2636struct ec_response_sb_rd_block {
2637 uint8_t data[32];
2638} __packed;
2639
2640struct ec_params_sb_wr_block {
2641 uint8_t reg;
2642 uint16_t data[32];
2643} __packed;
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654#define EC_CMD_BATTERY_VENDOR_PARAM 0xb4
2655
2656enum ec_battery_vendor_param_mode {
2657 BATTERY_VENDOR_PARAM_MODE_GET = 0,
2658 BATTERY_VENDOR_PARAM_MODE_SET,
2659};
2660
2661struct ec_params_battery_vendor_param {
2662 uint32_t param;
2663 uint32_t value;
2664 uint8_t mode;
2665} __packed;
2666
2667struct ec_response_battery_vendor_param {
2668 uint32_t value;
2669} __packed;
2670
2671
2672
2673
2674
2675
2676
2677
2678#define EC_CMD_REBOOT_EC 0xd2
2679
2680
2681enum ec_reboot_cmd {
2682 EC_REBOOT_CANCEL = 0,
2683 EC_REBOOT_JUMP_RO = 1,
2684 EC_REBOOT_JUMP_RW = 2,
2685
2686 EC_REBOOT_COLD = 4,
2687 EC_REBOOT_DISABLE_JUMP = 5,
2688 EC_REBOOT_HIBERNATE = 6
2689};
2690
2691
2692#define EC_REBOOT_FLAG_RESERVED0 (1 << 0)
2693#define EC_REBOOT_FLAG_ON_AP_SHUTDOWN (1 << 1)
2694
2695struct ec_params_reboot_ec {
2696 uint8_t cmd;
2697 uint8_t flags;
2698} __packed;
2699
2700
2701
2702
2703
2704
2705
2706#define EC_CMD_GET_PANIC_INFO 0xd3
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728#define EC_CMD_ACPI_READ 0x80
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743#define EC_CMD_ACPI_WRITE 0x81
2744
2745
2746
2747
2748
2749
2750
2751
2752#define EC_CMD_ACPI_QUERY_EVENT 0x84
2753
2754
2755
2756
2757#define EC_ACPI_MEM_VERSION 0x00
2758
2759
2760
2761
2762#define EC_ACPI_MEM_TEST 0x01
2763
2764#define EC_ACPI_MEM_TEST_COMPLIMENT 0x02
2765
2766
2767#define EC_ACPI_MEM_KEYBOARD_BACKLIGHT 0x03
2768
2769#define EC_ACPI_MEM_FAN_DUTY 0x04
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786#define EC_ACPI_MEM_TEMP_ID 0x05
2787#define EC_ACPI_MEM_TEMP_THRESHOLD 0x06
2788#define EC_ACPI_MEM_TEMP_COMMIT 0x07
2789
2790
2791
2792
2793
2794
2795#define EC_ACPI_MEM_TEMP_COMMIT_SELECT_MASK (1 << 0)
2796#define EC_ACPI_MEM_TEMP_COMMIT_ENABLE_MASK (1 << 1)
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813#define EC_ACPI_MEM_CHARGING_LIMIT 0x08
2814
2815
2816#define EC_ACPI_MEM_CHARGING_LIMIT_STEP_MA 64
2817
2818#define EC_ACPI_MEM_CHARGING_LIMIT_DISABLED 0xff
2819
2820
2821#define EC_ACPI_MEM_VERSION_CURRENT 1
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841#define EC_CMD_REBOOT 0xd1
2842
2843
2844
2845
2846
2847
2848
2849
2850#define EC_CMD_RESEND_RESPONSE 0xdb
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862#define EC_CMD_VERSION0 0xdc
2863
2864#endif
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874#define EC_CMD_PD_EXCHANGE_STATUS 0x100
2875
2876
2877struct ec_params_pd_status {
2878 int8_t batt_soc;
2879} __packed;
2880
2881
2882struct ec_response_pd_status {
2883 int8_t status;
2884 uint32_t curr_lim_ma;
2885} __packed;
2886
2887
2888#define EC_CMD_USB_PD_CONTROL 0x101
2889
2890enum usb_pd_control_role {
2891 USB_PD_CTRL_ROLE_NO_CHANGE = 0,
2892 USB_PD_CTRL_ROLE_TOGGLE_ON = 1,
2893 USB_PD_CTRL_ROLE_TOGGLE_OFF = 2,
2894 USB_PD_CTRL_ROLE_FORCE_SINK = 3,
2895 USB_PD_CTRL_ROLE_FORCE_SOURCE = 4,
2896};
2897
2898enum usb_pd_control_mux {
2899 USB_PD_CTRL_MUX_NO_CHANGE = 0,
2900 USB_PD_CTRL_MUX_NONE = 1,
2901 USB_PD_CTRL_MUX_USB = 2,
2902 USB_PD_CTRL_MUX_DP = 3,
2903 USB_PD_CTRL_MUX_DOCK = 4,
2904 USB_PD_CTRL_MUX_AUTO = 5,
2905};
2906
2907struct ec_params_usb_pd_control {
2908 uint8_t port;
2909 uint8_t role;
2910 uint8_t mux;
2911} __packed;
2912
2913#define PD_CTRL_RESP_ENABLED_COMMS (1 << 0)
2914#define PD_CTRL_RESP_ENABLED_CONNECTED (1 << 1)
2915#define PD_CTRL_RESP_ENABLED_PD_CAPABLE (1 << 2)
2916
2917struct ec_response_usb_pd_control_v1 {
2918 uint8_t enabled;
2919 uint8_t role;
2920 uint8_t polarity;
2921 char state[32];
2922} __packed;
2923
2924#define EC_CMD_USB_PD_PORTS 0x102
2925
2926struct ec_response_usb_pd_ports {
2927 uint8_t num_ports;
2928} __packed;
2929
2930#define EC_CMD_USB_PD_POWER_INFO 0x103
2931
2932#define PD_POWER_CHARGING_PORT 0xff
2933struct ec_params_usb_pd_power_info {
2934 uint8_t port;
2935} __packed;
2936
2937enum usb_chg_type {
2938 USB_CHG_TYPE_NONE,
2939 USB_CHG_TYPE_PD,
2940 USB_CHG_TYPE_C,
2941 USB_CHG_TYPE_PROPRIETARY,
2942 USB_CHG_TYPE_BC12_DCP,
2943 USB_CHG_TYPE_BC12_CDP,
2944 USB_CHG_TYPE_BC12_SDP,
2945 USB_CHG_TYPE_OTHER,
2946 USB_CHG_TYPE_VBUS,
2947 USB_CHG_TYPE_UNKNOWN,
2948};
2949
2950struct usb_chg_measures {
2951 uint16_t voltage_max;
2952 uint16_t voltage_now;
2953 uint16_t current_max;
2954 uint16_t current_lim;
2955} __packed;
2956
2957struct ec_response_usb_pd_power_info {
2958 uint8_t role;
2959 uint8_t type;
2960 uint8_t dualrole;
2961 uint8_t reserved1;
2962 struct usb_chg_measures meas;
2963 uint32_t max_power;
2964} __packed;
2965
2966
2967#define EC_CMD_USB_PD_MUX_INFO 0x11a
2968
2969struct ec_params_usb_pd_mux_info {
2970 uint8_t port;
2971} __packed;
2972
2973
2974#define USB_PD_MUX_USB_ENABLED (1 << 0)
2975#define USB_PD_MUX_DP_ENABLED (1 << 1)
2976#define USB_PD_MUX_POLARITY_INVERTED (1 << 2)
2977#define USB_PD_MUX_HPD_IRQ (1 << 3)
2978
2979struct ec_response_usb_pd_mux_info {
2980 uint8_t flags;
2981} __packed;
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007#define EC_CMD_PASSTHRU_OFFSET(n) (0x4000 * (n))
3008#define EC_CMD_PASSTHRU_MAX(n) (EC_CMD_PASSTHRU_OFFSET(n) + 0x3fff)
3009
3010
3011
3012
3013
3014
3015
3016
3017#define EC_HOST_PARAM_SIZE EC_PROTO2_MAX_PARAM_SIZE
3018#define EC_LPC_ADDR_OLD_PARAM EC_HOST_CMD_REGION1
3019#define EC_OLD_PARAM_SIZE EC_HOST_CMD_REGION_SIZE
3020
3021#endif
3022