]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
88364387 HT |
2 | /* |
3 | * Chromium OS cros_ec driver | |
4 | * | |
5 | * Copyright (c) 2012 The Chromium OS Authors. | |
88364387 HT |
6 | */ |
7 | ||
8 | #ifndef _CROS_EC_H | |
9 | #define _CROS_EC_H | |
10 | ||
11 | #include <linux/compiler.h> | |
12 | #include <ec_commands.h> | |
88364387 | 13 | #include <cros_ec_message.h> |
32f8a19f | 14 | #include <asm/gpio.h> |
b7e0d73b | 15 | #include <dm/of_extra.h> |
88364387 | 16 | |
88364387 HT |
17 | /* Our configuration information */ |
18 | struct cros_ec_dev { | |
84d6cbd3 | 19 | struct udevice *dev; /* Transport device */ |
32f8a19f | 20 | struct gpio_desc ec_int; /* GPIO used as EC interrupt line */ |
e8c12662 | 21 | int protocol_version; /* Protocol version to use */ |
88364387 HT |
22 | int optimise_flash_write; /* Don't write erased flash blocks */ |
23 | ||
24 | /* | |
25 | * These two buffers will always be dword-aligned and include enough | |
26 | * space for up to 7 word-alignment bytes also, so we can ensure that | |
27 | * the body of the message is always dword-aligned (64-bit). | |
28 | * | |
29 | * We use this alignment to keep ARM and x86 happy. Probably word | |
30 | * alignment would be OK, there might be a small performance advantage | |
31 | * to using dword. | |
32 | */ | |
33 | uint8_t din[ALIGN(MSG_BYTES + sizeof(int64_t), sizeof(int64_t))] | |
34 | __aligned(sizeof(int64_t)); | |
35 | uint8_t dout[ALIGN(MSG_BYTES + sizeof(int64_t), sizeof(int64_t))] | |
36 | __aligned(sizeof(int64_t)); | |
37 | }; | |
38 | ||
39 | /* | |
40 | * Hard-code the number of columns we happen to know we have right now. It | |
41 | * would be more correct to call cros_ec_info() at startup and determine the | |
42 | * actual number of keyboard cols from there. | |
43 | */ | |
44 | #define CROS_EC_KEYSCAN_COLS 13 | |
45 | ||
46 | /* Information returned by a key scan */ | |
47 | struct mbkp_keyscan { | |
48 | uint8_t data[CROS_EC_KEYSCAN_COLS]; | |
49 | }; | |
50 | ||
d7f25f35 SG |
51 | /* Holds information about the Chrome EC */ |
52 | struct fdt_cros_ec { | |
53 | struct fmap_entry flash; /* Address and size of EC flash */ | |
54 | /* | |
55 | * Byte value of erased flash, or -1 if not known. It is normally | |
56 | * 0xff but some flash devices use 0 (e.g. STM32Lxxx) | |
57 | */ | |
58 | int flash_erase_value; | |
59 | struct fmap_entry region[EC_FLASH_REGION_COUNT]; | |
60 | }; | |
61 | ||
88364387 HT |
62 | /** |
63 | * Read the ID of the CROS-EC device | |
64 | * | |
65 | * The ID is a string identifying the CROS-EC device. | |
66 | * | |
67 | * @param dev CROS-EC device | |
68 | * @param id Place to put the ID | |
69 | * @param maxlen Maximum length of the ID field | |
70 | * @return 0 if ok, -1 on error | |
71 | */ | |
6322a7b6 | 72 | int cros_ec_read_id(struct udevice *dev, char *id, int maxlen); |
88364387 HT |
73 | |
74 | /** | |
75 | * Read a keyboard scan from the CROS-EC device | |
76 | * | |
77 | * Send a message requesting a keyboard scan and return the result | |
78 | * | |
79 | * @param dev CROS-EC device | |
80 | * @param scan Place to put the scan results | |
81 | * @return 0 if ok, -1 on error | |
82 | */ | |
745009c4 | 83 | int cros_ec_scan_keyboard(struct udevice *dev, struct mbkp_keyscan *scan); |
88364387 HT |
84 | |
85 | /** | |
86 | * Read which image is currently running on the CROS-EC device. | |
87 | * | |
88 | * @param dev CROS-EC device | |
89 | * @param image Destination for image identifier | |
90 | * @return 0 if ok, <0 on error | |
91 | */ | |
6322a7b6 SG |
92 | int cros_ec_read_current_image(struct udevice *dev, |
93 | enum ec_current_image *image); | |
88364387 HT |
94 | |
95 | /** | |
96 | * Read the hash of the CROS-EC device firmware. | |
97 | * | |
98 | * @param dev CROS-EC device | |
a12ef7e2 | 99 | * @param hash_offset Offset in flash to read from |
88364387 HT |
100 | * @param hash Destination for hash information |
101 | * @return 0 if ok, <0 on error | |
102 | */ | |
a12ef7e2 SG |
103 | int cros_ec_read_hash(struct udevice *dev, uint hash_offset, |
104 | struct ec_response_vboot_hash *hash); | |
88364387 HT |
105 | |
106 | /** | |
107 | * Send a reboot command to the CROS-EC device. | |
108 | * | |
109 | * Note that some reboot commands (such as EC_REBOOT_COLD) also reboot the AP. | |
110 | * | |
111 | * @param dev CROS-EC device | |
112 | * @param cmd Reboot command | |
113 | * @param flags Flags for reboot command (EC_REBOOT_FLAG_*) | |
114 | * @return 0 if ok, <0 on error | |
115 | */ | |
6322a7b6 | 116 | int cros_ec_reboot(struct udevice *dev, enum ec_reboot_cmd cmd, uint8_t flags); |
88364387 HT |
117 | |
118 | /** | |
119 | * Check if the CROS-EC device has an interrupt pending. | |
120 | * | |
121 | * Read the status of the external interrupt connected to the CROS-EC device. | |
122 | * If no external interrupt is configured, this always returns 1. | |
123 | * | |
124 | * @param dev CROS-EC device | |
125 | * @return 0 if no interrupt is pending | |
126 | */ | |
745009c4 | 127 | int cros_ec_interrupt_pending(struct udevice *dev); |
88364387 HT |
128 | |
129 | enum { | |
130 | CROS_EC_OK, | |
131 | CROS_EC_ERR = 1, | |
132 | CROS_EC_ERR_FDT_DECODE, | |
133 | CROS_EC_ERR_CHECK_VERSION, | |
134 | CROS_EC_ERR_READ_ID, | |
135 | CROS_EC_ERR_DEV_INIT, | |
136 | }; | |
137 | ||
138 | /** | |
836bb6e8 | 139 | * Initialise the Chromium OS EC driver |
88364387 HT |
140 | * |
141 | * @param blob Device tree blob containing setup information | |
142 | * @param cros_ecp Returns pointer to the cros_ec device, or NULL if none | |
143 | * @return 0 if we got an cros_ec device and all is well (or no cros_ec is | |
144 | * expected), -ve if we should have an cros_ec device but failed to find | |
145 | * one, or init failed (-CROS_EC_ERR_...). | |
146 | */ | |
6322a7b6 | 147 | int cros_ec_init(const void *blob, struct udevice**cros_ecp); |
88364387 HT |
148 | |
149 | /** | |
150 | * Read information about the keyboard matrix | |
151 | * | |
152 | * @param dev CROS-EC device | |
153 | * @param info Place to put the info structure | |
154 | */ | |
6322a7b6 | 155 | int cros_ec_info(struct udevice *dev, struct ec_response_mkbp_info *info); |
88364387 HT |
156 | |
157 | /** | |
158 | * Read the host event flags | |
159 | * | |
160 | * @param dev CROS-EC device | |
161 | * @param events_ptr Destination for event flags. Not changed on error. | |
162 | * @return 0 if ok, <0 on error | |
163 | */ | |
6322a7b6 | 164 | int cros_ec_get_host_events(struct udevice *dev, uint32_t *events_ptr); |
88364387 HT |
165 | |
166 | /** | |
167 | * Clear the specified host event flags | |
168 | * | |
169 | * @param dev CROS-EC device | |
170 | * @param events Event flags to clear | |
171 | * @return 0 if ok, <0 on error | |
172 | */ | |
6322a7b6 | 173 | int cros_ec_clear_host_events(struct udevice *dev, uint32_t events); |
88364387 HT |
174 | |
175 | /** | |
176 | * Get/set flash protection | |
177 | * | |
178 | * @param dev CROS-EC device | |
179 | * @param set_mask Mask of flags to set; if 0, just retrieves existing | |
180 | * protection state without changing it. | |
181 | * @param set_flags New flag values; only bits in set_mask are applied; | |
182 | * ignored if set_mask=0. | |
183 | * @param prot Destination for updated protection state from EC. | |
184 | * @return 0 if ok, <0 on error | |
185 | */ | |
6322a7b6 SG |
186 | int cros_ec_flash_protect(struct udevice *dev, uint32_t set_mask, |
187 | uint32_t set_flags, | |
188 | struct ec_response_flash_protect *resp); | |
88364387 | 189 | |
72ef8bfd SG |
190 | /** |
191 | * Notify EC of current boot mode | |
192 | * | |
193 | * @param dev CROS-EC device | |
194 | * @param vboot_mode Verified boot mode | |
195 | * @return 0 if ok, <0 on error | |
196 | */ | |
197 | int cros_ec_entering_mode(struct udevice *dev, int mode); | |
88364387 HT |
198 | |
199 | /** | |
200 | * Run internal tests on the cros_ec interface. | |
201 | * | |
202 | * @param dev CROS-EC device | |
203 | * @return 0 if ok, <0 if the test failed | |
204 | */ | |
6322a7b6 | 205 | int cros_ec_test(struct udevice *dev); |
88364387 HT |
206 | |
207 | /** | |
208 | * Update the EC RW copy. | |
209 | * | |
210 | * @param dev CROS-EC device | |
211 | * @param image the content to write | |
212 | * @param imafge_size content length | |
213 | * @return 0 if ok, <0 if the test failed | |
214 | */ | |
6322a7b6 SG |
215 | int cros_ec_flash_update_rw(struct udevice *dev, const uint8_t *image, |
216 | int image_size); | |
88364387 HT |
217 | |
218 | /** | |
219 | * Return a pointer to the board's CROS-EC device | |
220 | * | |
88364387 HT |
221 | * @return pointer to CROS-EC device, or NULL if none is available |
222 | */ | |
42116f64 | 223 | struct udevice *board_get_cros_ec_dev(void); |
88364387 | 224 | |
84d6cbd3 SG |
225 | struct dm_cros_ec_ops { |
226 | int (*check_version)(struct udevice *dev); | |
227 | int (*command)(struct udevice *dev, uint8_t cmd, int cmd_version, | |
228 | const uint8_t *dout, int dout_len, | |
229 | uint8_t **dinp, int din_len); | |
230 | int (*packet)(struct udevice *dev, int out_bytes, int in_bytes); | |
231 | }; | |
232 | ||
233 | #define dm_cros_ec_get_ops(dev) \ | |
234 | ((struct dm_cros_ec_ops *)(dev)->driver->ops) | |
235 | ||
236 | int cros_ec_register(struct udevice *dev); | |
237 | ||
88364387 HT |
238 | /** |
239 | * Dump a block of data for a command. | |
240 | * | |
241 | * @param name Name for data (e.g. 'in', 'out') | |
242 | * @param cmd Command number associated with data, or -1 for none | |
243 | * @param data Data block to dump | |
244 | * @param len Length of data block to dump | |
245 | */ | |
246 | void cros_ec_dump_data(const char *name, int cmd, const uint8_t *data, int len); | |
247 | ||
248 | /** | |
249 | * Calculate a simple 8-bit checksum of a data block | |
250 | * | |
251 | * @param data Data block to checksum | |
252 | * @param size Size of data block in bytes | |
253 | * @return checksum value (0 to 255) | |
254 | */ | |
255 | int cros_ec_calc_checksum(const uint8_t *data, int size); | |
256 | ||
6322a7b6 | 257 | int cros_ec_flash_erase(struct udevice *dev, uint32_t offset, uint32_t size); |
88364387 HT |
258 | |
259 | /** | |
260 | * Read data from the flash | |
261 | * | |
262 | * Read an arbitrary amount of data from the EC flash, by repeatedly reading | |
263 | * small blocks. | |
264 | * | |
265 | * The offset starts at 0. You can obtain the region information from | |
266 | * cros_ec_flash_offset() to find out where to read for a particular region. | |
267 | * | |
268 | * @param dev CROS-EC device | |
269 | * @param data Pointer to data buffer to read into | |
270 | * @param offset Offset within flash to read from | |
271 | * @param size Number of bytes to read | |
272 | * @return 0 if ok, -1 on error | |
273 | */ | |
6322a7b6 SG |
274 | int cros_ec_flash_read(struct udevice *dev, uint8_t *data, uint32_t offset, |
275 | uint32_t size); | |
88364387 | 276 | |
bfeba017 MF |
277 | /** |
278 | * Read back flash parameters | |
279 | * | |
280 | * This function reads back parameters of the flash as reported by the EC | |
281 | * | |
282 | * @param dev Pointer to device | |
283 | * @param info Pointer to output flash info struct | |
284 | */ | |
6322a7b6 SG |
285 | int cros_ec_read_flashinfo(struct udevice *dev, |
286 | struct ec_response_flash_info *info); | |
bfeba017 | 287 | |
88364387 HT |
288 | /** |
289 | * Write data to the flash | |
290 | * | |
291 | * Write an arbitrary amount of data to the EC flash, by repeatedly writing | |
292 | * small blocks. | |
293 | * | |
294 | * The offset starts at 0. You can obtain the region information from | |
295 | * cros_ec_flash_offset() to find out where to write for a particular region. | |
296 | * | |
297 | * Attempting to write to the region where the EC is currently running from | |
298 | * will result in an error. | |
299 | * | |
300 | * @param dev CROS-EC device | |
301 | * @param data Pointer to data buffer to write | |
302 | * @param offset Offset within flash to write to. | |
303 | * @param size Number of bytes to write | |
304 | * @return 0 if ok, -1 on error | |
305 | */ | |
6322a7b6 SG |
306 | int cros_ec_flash_write(struct udevice *dev, const uint8_t *data, |
307 | uint32_t offset, uint32_t size); | |
88364387 HT |
308 | |
309 | /** | |
310 | * Obtain position and size of a flash region | |
311 | * | |
312 | * @param dev CROS-EC device | |
313 | * @param region Flash region to query | |
314 | * @param offset Returns offset of flash region in EC flash | |
315 | * @param size Returns size of flash region | |
316 | * @return 0 if ok, -1 on error | |
317 | */ | |
6322a7b6 SG |
318 | int cros_ec_flash_offset(struct udevice *dev, enum ec_flash_region region, |
319 | uint32_t *offset, uint32_t *size); | |
88364387 HT |
320 | |
321 | /** | |
6322a7b6 | 322 | * Read/write non-volatile data from/to a CROS-EC device. |
88364387 HT |
323 | * |
324 | * @param dev CROS-EC device | |
325 | * @param block Buffer of VbNvContext to be read/write | |
326 | * @return 0 if ok, -1 on error | |
327 | */ | |
6322a7b6 SG |
328 | int cros_ec_read_nvdata(struct udevice *dev, uint8_t *block, int size); |
329 | int cros_ec_write_nvdata(struct udevice *dev, const uint8_t *block, int size); | |
88364387 HT |
330 | |
331 | /** | |
332 | * Read the version information for the EC images | |
333 | * | |
334 | * @param dev CROS-EC device | |
335 | * @param versionp This is set to point to the version information | |
336 | * @return 0 if ok, -1 on error | |
337 | */ | |
6322a7b6 SG |
338 | int cros_ec_read_version(struct udevice *dev, |
339 | struct ec_response_get_version **versionp); | |
88364387 HT |
340 | |
341 | /** | |
342 | * Read the build information for the EC | |
343 | * | |
344 | * @param dev CROS-EC device | |
345 | * @param versionp This is set to point to the build string | |
346 | * @return 0 if ok, -1 on error | |
347 | */ | |
6322a7b6 | 348 | int cros_ec_read_build_info(struct udevice *dev, char **strp); |
88364387 HT |
349 | |
350 | /** | |
351 | * Switch on/off a LDO / FET. | |
352 | * | |
353 | * @param dev CROS-EC device | |
354 | * @param index index of the LDO/FET to switch | |
355 | * @param state new state of the LDO/FET : EC_LDO_STATE_ON|OFF | |
356 | * @return 0 if ok, -1 on error | |
357 | */ | |
f48eaf01 | 358 | int cros_ec_set_ldo(struct udevice *dev, uint8_t index, uint8_t state); |
88364387 HT |
359 | |
360 | /** | |
361 | * Read back a LDO / FET current state. | |
362 | * | |
363 | * @param dev CROS-EC device | |
364 | * @param index index of the LDO/FET to switch | |
365 | * @param state current state of the LDO/FET : EC_LDO_STATE_ON|OFF | |
366 | * @return 0 if ok, -1 on error | |
367 | */ | |
f48eaf01 | 368 | int cros_ec_get_ldo(struct udevice *dev, uint8_t index, uint8_t *state); |
41364f0f | 369 | |
41364f0f VB |
370 | /** |
371 | * Get access to the error reported when cros_ec_board_init() was called | |
372 | * | |
373 | * This permits delayed reporting of the EC error if it failed during | |
374 | * early init. | |
375 | * | |
376 | * @return error (0 if there was no error, -ve if there was an error) | |
377 | */ | |
378 | int cros_ec_get_error(void); | |
379 | ||
d7f25f35 SG |
380 | /** |
381 | * Returns information from the FDT about the Chrome EC flash | |
382 | * | |
2ec9d171 | 383 | * @param dev Device to read from |
d7f25f35 SG |
384 | * @param config Structure to use to return information |
385 | */ | |
2ec9d171 | 386 | int cros_ec_decode_ec_flash(struct udevice *dev, struct fdt_cros_ec *config); |
d7f25f35 | 387 | |
df93d90a SG |
388 | /** |
389 | * Check the current keyboard state, in case recovery mode is requested. | |
390 | * This function is for sandbox only. | |
391 | * | |
392 | * @param ec CROS-EC device | |
393 | */ | |
6322a7b6 | 394 | void cros_ec_check_keyboard(struct udevice *dev); |
df93d90a | 395 | |
cc456bd7 SG |
396 | struct i2c_msg; |
397 | /* | |
398 | * Tunnel an I2C transfer to the EC | |
399 | * | |
400 | * @param dev CROS-EC device | |
6d1a718f | 401 | * @param port The remote port on EC to use |
cc456bd7 SG |
402 | * @param msg List of messages to transfer |
403 | * @param nmsgs Number of messages to transfer | |
404 | */ | |
6d1a718f MF |
405 | int cros_ec_i2c_tunnel(struct udevice *dev, int port, struct i2c_msg *msg, |
406 | int nmsgs); | |
cc456bd7 | 407 | |
72ef8bfd SG |
408 | /** |
409 | * cros_ec_get_events_b() - Get event mask B | |
410 | * | |
411 | * @return value of event mask, default value of 0 if it could not be read | |
412 | */ | |
413 | uint64_t cros_ec_get_events_b(struct udevice *dev); | |
414 | ||
415 | /** | |
416 | * cros_ec_clear_events_b() - Clear even mask B | |
417 | * | |
418 | * Any pending events in the B range are cleared | |
419 | * | |
420 | * @return 0 if OK, -ve on error | |
421 | */ | |
422 | int cros_ec_clear_events_b(struct udevice *dev, uint64_t mask); | |
423 | ||
424 | /** | |
425 | * cros_ec_efs_verify() - tell the EC to verify one of its images | |
426 | * | |
427 | * @param dev CROS-EC device | |
428 | * @param region Flash region to query | |
429 | * @return 0 if OK, -ve on error | |
430 | */ | |
431 | int cros_ec_efs_verify(struct udevice *dev, enum ec_flash_region region); | |
432 | ||
433 | /** | |
434 | * cros_ec_battery_cutoff() - Request that the battery be cut off | |
435 | * | |
436 | * This tells the battery to stop supplying power. This is used before shipping | |
437 | * a device to ensure that the battery remains charged while the device is | |
438 | * shipped or sitting on the shelf waiting to be purchased. | |
439 | * | |
440 | * @param dev CROS-EC device | |
441 | * @param flags Flags to use (EC_BATTERY_CUTOFF_FLAG_...) | |
442 | * @return 0 if OK, -ve on error | |
443 | */ | |
444 | int cros_ec_battery_cutoff(struct udevice *dev, uint8_t flags); | |
445 | ||
446 | /** | |
447 | * cros_ec_read_limit_power() - Check if power is limited by batter/charger | |
448 | * | |
449 | * Sometimes the battery is low and / or the device is connected to a charger | |
450 | * that cannot supply much power. | |
451 | * | |
452 | * @param dev CROS-EC device | |
453 | * @param limit_powerp Returns whether power is limited (0 or 1) | |
454 | * @return 0 if OK, -ENOSYS if the EC does not support this comment, -EINVAL | |
455 | * if the EC returned an invalid response | |
456 | */ | |
457 | int cros_ec_read_limit_power(struct udevice *dev, int *limit_powerp); | |
458 | ||
459 | /** | |
460 | * cros_ec_config_powerbtn() - Configure the behaviour of the power button | |
461 | * | |
462 | * @param dev CROS-EC device | |
463 | * @param flags Flags to use (EC_POWER_BUTTON_...) | |
464 | * @return 0 if OK, -ve on error | |
465 | */ | |
466 | int cros_ec_config_powerbtn(struct udevice *dev, uint32_t flags); | |
467 | ||
468 | /** | |
469 | * cros_ec_get_lid_shutdown_mask() - Set the lid shutdown mask | |
470 | * | |
471 | * Determines whether a lid close event is reported | |
472 | * | |
473 | * @param dev CROS-EC device | |
474 | * @return shufdown mas if OK, -ve on error | |
475 | */ | |
476 | int cros_ec_get_lid_shutdown_mask(struct udevice *dev); | |
477 | ||
478 | /** | |
479 | * cros_ec_set_lid_shutdown_mask() - Set the lid shutdown mask | |
480 | * | |
481 | * Set whether a lid close event is reported | |
482 | * | |
483 | * @param dev CROS-EC device | |
484 | * @param enable true to enable reporting, false to disable | |
485 | * @return shufdown mas if OK, -ve on error | |
486 | */ | |
487 | int cros_ec_set_lid_shutdown_mask(struct udevice *dev, int enable); | |
488 | ||
88364387 | 489 | #endif |