1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
|
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Mailbox EC communication interface for Google Chrome Embedded Controller.
*/
#ifndef _EC_GOOGLE_CHROMEEC_EC_H
#define _EC_GOOGLE_CHROMEEC_EC_H
#include <types.h>
#include <device/device.h>
#include "ec_commands.h"
#include <device/usbc_mux.h>
/* Fill in base and size of the IO port resources used. */
void google_chromeec_ioport_range(uint16_t *base, size_t *size);
int google_chromeec_i2c_xfer(uint8_t chip, uint8_t addr, int alen,
uint8_t *buffer, int len, int is_read);
uint64_t google_chromeec_get_wake_mask(void);
int google_chromeec_set_sci_mask(uint64_t mask);
int google_chromeec_set_smi_mask(uint64_t mask);
int google_chromeec_set_wake_mask(uint64_t mask);
enum host_event_code google_chromeec_get_event(void);
/* Check if EC supports feature EC_FEATURE_UNIFIED_WAKE_MASKS */
bool google_chromeec_is_uhepi_supported(void);
int google_ec_running_ro(void);
enum ec_image google_chromeec_get_current_image(void);
void google_chromeec_init(void);
/* Check for the current mux state in EC
* in: int port physical port number of the type-c port
* out: uint8_t flags representing the status of the mux such as
* usb capability, dp capability, cable type, etc
*/
int google_chromeec_usb_get_pd_mux_info(int port, uint8_t *flags);
/* Poll (up to `timeout_ms` ms) for DisplayPort to be ready
* Return: -1: Error. 0: Timeout.
* >=1: Bitmask of the ports that DP device is connected
*/
int google_chromeec_wait_for_displayport(long timeout_ms);
/* Poll (up to `timeout_ms` ms) for the DP mode entry
* event on the specified port.
* Return: 0 on DP mode entry success, -1 on timeout */
int google_chromeec_wait_for_dp_mode_entry(int port, long timeout_ms);
/* Poll (up to `timeout_ms` ms) for a Hot-Plug Detect (HPD)
* event on the specified port.
* Return: 0 on HPD ready, -1 on timeout */
int google_chromeec_wait_for_hpd(int port, long timeout_ms);
/* Send command to EC to request to enter DisplayPort ALT mode on the
* specified port.
* Return: 0 on success, -1 on error */
int google_chromeec_typec_control_enter_dp_mode(int port);
/*
* Obtain any USB-C mux data needed for the specified port
* in: int port physical port number of the type-c port
* out: struct usbc_mux_info mux_info stores USB-C mux data
* Return: 0 on success, -1 on error
*/
int google_chromeec_get_usbc_mux_info(int port, struct usbc_mux_info *mux_info);
/* Device events */
uint64_t google_chromeec_get_device_enabled_events(void);
int google_chromeec_set_device_enabled_events(uint64_t mask);
uint64_t google_chromeec_get_device_current_events(void);
int google_chromeec_check_feature(int feature);
uint8_t google_chromeec_calc_checksum(const uint8_t *data, int size);
/**
* google_chromeec_get_board_version() - Get the board version
* @version: Out parameter to retrieve the board Version
*
* Return: 0 on success or -1 on failure/error.
*
* This function is used to get the board version information from EC.
*/
int google_chromeec_get_board_version(uint32_t *version);
uint32_t google_chromeec_get_sku_id(void);
int google_chromeec_set_sku_id(uint32_t skuid);
uint64_t google_chromeec_get_events_b(void);
int google_chromeec_clear_events_b(uint64_t mask);
int google_chromeec_kbbacklight(int percent);
void google_chromeec_post(uint8_t postcode);
uint8_t google_chromeec_get_switches(void);
bool google_chromeec_get_ap_watchdog_flag(void);
/* Temporary secure storage commands */
int google_chromeec_vstore_supported(void);
int google_chromeec_vstore_info(uint32_t *locked);
int google_chromeec_vstore_read(int slot, uint8_t *data);
int google_chromeec_vstore_write(int slot, uint8_t *data, size_t size);
/* Issue reboot command to EC with specified type and flags. Returns 0 on
success, < 0 otherwise. */
int google_chromeec_reboot(enum ec_reboot_cmd type, uint8_t flags);
/**
* Get data from Cros Board Info
*
* @param id/fw_config/buf [OUT] value from CBI.
* @return 0 on success or negative integer for errors.
*/
int google_chromeec_cbi_get_oem_id(uint32_t *id);
int google_chromeec_cbi_get_sku_id(uint32_t *id);
int google_chromeec_cbi_get_fw_config(uint64_t *fw_config);
int google_chromeec_cbi_get_dram_part_num(char *buf, size_t bufsize);
int google_chromeec_cbi_get_oem_name(char *buf, size_t bufsize);
/* version may be stored in CBI as a smaller integer width, but the EC code
handles it correctly. */
int google_chromeec_cbi_get_board_version(uint32_t *version);
int google_chromeec_cbi_get_ssfc(uint32_t *ssfc);
#define CROS_SKU_UNKNOWN 0xFFFFFFFF
#define CROS_SKU_UNPROVISIONED 0x7FFFFFFF
/* Returns CROS_SKU_UNKNOWN on failure. */
uint32_t google_chromeec_get_board_sku(void);
const char *google_chromeec_smbios_system_sku(void);
/* MEC uses 0x800/0x804 as register/index pair, thus an 8-byte resource. */
#define MEC_EMI_BASE 0x800
#define MEC_EMI_SIZE 8
/* For MEC, access ranges 0x800 thru 0x9ff using EMI interface instead of LPC */
#define MEC_EMI_RANGE_START EC_HOST_CMD_REGION0
#define MEC_EMI_RANGE_END (EC_LPC_ADDR_MEMMAP + EC_MEMMAP_SIZE)
int google_chromeec_set_usb_charge_mode(uint8_t port_id, enum usb_charge_mode mode);
int google_chromeec_set_usb_pd_role(uint8_t port, enum usb_pd_control_role role);
/*
* Retrieve the charger type and max wattage.
*
* @param type charger type
* @param current_max charger max current
* @param voltage_max charger max voltage
* @return non-zero for error, otherwise 0.
*/
int google_chromeec_get_usb_pd_power_info(enum usb_chg_type *type,
uint16_t *current_max, uint16_t *voltage_max);
/*
* Set max current and voltage of a dedicated charger.
*
* @param current_lim Max current in mA
* @param voltage_lim Max voltage in mV
* @return non-zero for error, otherwise 0.
*/
int google_chromeec_override_dedicated_charger_limit(uint16_t current_lim,
uint16_t voltage_lim);
/* internal structure to send a command to the EC and wait for response. */
struct chromeec_command {
uint16_t cmd_code; /* command code in, status out */
uint8_t cmd_version; /* command version */
const void* cmd_data_in; /* command data, if any */
void* cmd_data_out; /* command response, if any */
uint16_t cmd_size_in; /* size of command data */
uint16_t cmd_size_out; /* expected size of command response in,
* actual received size out */
int cmd_dev_index;/* device index for passthru */
};
/*
* There are transport level constraints for sending protov3 packets. Because
* of this provide a way for the generic protocol layer to request buffers
* so that there is zero copying being done through the layers.
*
* Request the buffer provided the size. If 'req' is non-zero then the
* buffer requested is for EC requests. Otherwise it's for responses. Return
* non-NULL on success, NULL on error.
*/
void *crosec_get_buffer(size_t size, int req);
/*
* The lower level transport works on the buffers handed out to the
* upper level. Therefore, only the size of the request and response
* are required.
*/
typedef int (*crosec_io_t)(size_t req_size, size_t resp_size, void *context);
int crosec_command_proto(struct chromeec_command *cec_command,
crosec_io_t crosec_io, void *context);
/**
* Performs light verification of the EC<->AP communication channel.
*
* @return 0 on success, -1 on error
*/
int google_chromeec_hello(void);
/**
* Send a command to a CrOS EC
*
* @param cec_command: CrOS EC command to send
* @return 0 for success. Non-zero for error.
*/
int google_chromeec_command(struct chromeec_command *cec_command);
struct google_chromeec_event_info {
uint64_t log_events;
uint64_t sci_events;
uint64_t smi_events;
uint64_t s3_wake_events;
uint64_t s3_device_events;
uint64_t s5_wake_events;
uint64_t s0ix_wake_events;
};
void google_chromeec_events_init(const struct google_chromeec_event_info *info,
bool is_s3_wakeup);
/*
* Get next available MKBP event in ec_response_get_next_event. Returns 0 on
* success, < 0 otherwise.
*/
int google_chromeec_get_mkbp_event(struct ec_response_get_next_event *event);
/* Log host events to eventlog based on the mask provided. */
void google_chromeec_log_events(uint64_t mask);
/**
* Protect/un-protect EC flash regions.
*
* @param mask Set/clear the requested bits in 'flags'
* @param flags Flash protection flags
* @param resp Pointer to response structure
* @return 0 on success, -1 on error
*/
int google_chromeec_flash_protect(uint32_t mask, uint32_t flags,
struct ec_response_flash_protect *resp);
/**
* Calculate image hash for vboot.
*
* @param hash_type The hash types supported by the EC for vboot
* @param offset The offset to start hashing in flash
* @param resp Pointer to response structure
* @return 0 on success, -1 on error
*/
int google_chromeec_start_vboot_hash(enum ec_vboot_hash_type hash_type,
uint32_t offset,
struct ec_response_vboot_hash *resp);
/**
* Return the EC's vboot image hash.
*
* @param offset Get hash for flash region beginning here
* @param resp Pointer to response structure
* @return 0 on success, -1 on error
*
*/
int google_chromeec_get_vboot_hash(uint32_t offset,
struct ec_response_vboot_hash *resp);
/**
* Get offset and size of the specified EC flash region.
*
* @param region Which region of EC flash
* @param offset Gets filled with region's offset
* @param size Gets filled with region's size
* @return 0 on success, -1 on error
*/
int google_chromeec_flash_region_info(enum ec_flash_region region,
uint32_t *offset, uint32_t *size);
/**
* Erase a region of EC flash.
*
* @param offset Where to begin erasing
* @param size Size of area to erase
* @return 0 on success, -1 on error
*/
int google_chromeec_flash_erase(uint32_t region_offset, uint32_t region_size);
/**
* Return information about the entire flash.
*
* @param info Pointer to response structure
* @return 0 on success, -1 on error
*/
int google_chromeec_flash_info(struct ec_response_flash_info *info);
/**
* Write a block into EC flash.
*
* @param data Pointer to data to write to flash, prefixed by a
* struct ec_params_flash_write
* @param offset Offset to begin writing data
* @param size Number of bytes to be written to flash from data
* @return 0 on success, -1 on error
*/
int google_chromeec_flash_write_block(const uint8_t *data, uint32_t size);
/**
* Verify flash using EFS if available.
*
* @param region Which flash region to verify
* @return 0 on success, -1 on error
*/
int google_chromeec_efs_verify(enum ec_flash_region region);
/**
* Command EC to perform battery cutoff.
*
* @param flags Flags to pass to the EC
* @return 0 on success, -1 on error
*/
int google_chromeec_battery_cutoff(uint8_t flags);
/**
* Check if the EC is requesting the system to limit input power.
*
* @param limit_power If successful, limit_power is 1 if EC is requesting
* input power limits, otherwise 0.
* @return 0 on success, -1 on error
*/
int google_chromeec_read_limit_power_request(int *limit_power);
/**
* Get information about the protocol that the EC speaks.
*
* @param resp Filled with host command protocol information.
* @return 0 on success, -1 on error
*/
int google_chromeec_get_protocol_info(
struct ec_response_get_protocol_info *resp);
/**
* Get available versions of the specified command.
*
* @param command Command ID
* @param pmask Pointer to version mask
* @return 0 on success, -1 on error
*/
int google_chromeec_get_cmd_versions(int command, uint32_t *pmask);
/**
* Get number of PD-capable USB ports from EC.
*
* @param *num_ports If successful, num_ports is the number
* of PD-capable USB ports according to the EC.
* @return 0 on success, -1 on error
*/
int google_chromeec_get_num_pd_ports(unsigned int *num_ports);
/**
* Return a port's PD chip information.
*
* @param port The desired port number
* @param renew Refresh cached value
* @param r Result buffer for chip info
*
* @return 0 if ok, -1 on error
*/
int google_chromeec_get_pd_chip_info(int port, int renew,
struct ec_response_pd_chip_info *r);
/* Structure representing the capabilities of a USB-PD port */
struct usb_pd_port_caps {
enum ec_pd_power_role_caps power_role_cap;
enum ec_pd_try_power_role_caps try_power_role_cap;
enum ec_pd_data_role_caps data_role_cap;
enum ec_pd_port_location port_location;
};
/**
* Get role-based capabilities for a USB-PD port
*
* @param port Which port to get information about
* @param *power_role_cap The power-role capability of the port
* @param *try_power_role_cap The Try-power-role capability of the port
* @param *data_role_cap The data role capability of the port
* @param *port_location Location of the port on the device
* @return 0 on success, -1 on error
*/
int google_chromeec_get_pd_port_caps(int port,
struct usb_pd_port_caps *port_caps);
/**
* Get the keyboard configuration / layout information from EC
*
* @param *keybd If successful, this is filled with EC filled parameters
* @return 0 on success, -1 on error
*/
int google_chromeec_get_keybd_config(struct ec_response_keybd_config *keybd);
/**
* Send EC command to perform AP reset
*
* @return 0 on success, -1 on error
*/
int google_chromeec_ap_reset(void);
/**
* Configure the regulator as enabled / disabled.
*
* @param index Regulator ID
* @param enable Set to enable / disable the regulator
* @return 0 on success, -1 on error
*/
int google_chromeec_regulator_enable(uint32_t index, uint8_t enable);
/**
* Query if the regulator is enabled.
*
* @param index Regulator ID
* @param *enabled If successful, enabled indicates enable/disable status.
* @return 0 on success, -1 on error
*/
int google_chromeec_regulator_is_enabled(uint32_t index, uint8_t *enabled);
/**
* Set voltage for the voltage regulator within the range specified.
*
* @param index Regulator ID
* @param min_mv Minimum voltage
* @param max_mv Maximum voltage
* @return 0 on success, -1 on error
*/
int google_chromeec_regulator_set_voltage(uint32_t index, uint32_t min_mv,
uint32_t max_mv);
/**
* Get the currently configured voltage for the voltage regulator.
*
* @param index Regulator ID
* @param *voltage_mv If successful, voltage_mv is filled with current voltage
* @return 0 on success, -1 on error
*/
int google_chromeec_regulator_get_voltage(uint32_t index, uint32_t *voltage_mv);
/**
* Clear EC AP_IDLE flag
*/
void google_chromeec_clear_ec_ap_idle(void);
/**
* Check if battery is present and battery level is above critical threshold.
*
* @return true: if the battery is present and battery level is above critical threshold
* false: any of the above conditions is not true
*/
bool google_chromeec_is_battery_present_and_above_critical_threshold(void);
/**
* Check if battery is present.
*
* @return true: if the battery is present
* false: if the battery is not present
*/
bool google_chromeec_is_battery_present(void);
/**
* Determine if the UCSI stack is currently active.
*
* @return true if EC implements the UCSI stack
*/
bool google_chromeec_get_ucsi_enabled(void);
#if CONFIG(HAVE_ACPI_TABLES)
/**
* Writes USB Type-C PD related information to the SSDT
*
* @param dev EC device
*/
void google_chromeec_fill_ssdt_generator(const struct device *dev);
/**
* Returns the ACPI name for the EC device.
*
* @param dev EC device
*/
const char *google_chromeec_acpi_name(const struct device *dev);
#endif /* HAVE_ACPI_TABLES */
#endif /* _EC_GOOGLE_CHROMEEC_EC_H */
|