blob: 999c3c90c50a58f4271c434cf966d8a46e0c452c [file] [log] [blame]
Hung-ying Tyan88364382013-05-15 18:27:28 +08001/*
2 * Chromium OS cros_ec driver
3 *
4 * Copyright (c) 2012 The Chromium OS Authors.
Hung-ying Tyan88364382013-05-15 18:27:28 +08005 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02006 * SPDX-License-Identifier: GPL-2.0+
Hung-ying Tyan88364382013-05-15 18:27:28 +08007 */
8
9#ifndef _CROS_EC_H
10#define _CROS_EC_H
11
12#include <linux/compiler.h>
13#include <ec_commands.h>
14#include <fdtdec.h>
15#include <cros_ec_message.h>
16
17/* Which interface is the device on? */
18enum cros_ec_interface_t {
19 CROS_EC_IF_NONE,
20 CROS_EC_IF_SPI,
21 CROS_EC_IF_I2C,
22 CROS_EC_IF_LPC, /* Intel Low Pin Count interface */
23};
24
25/* Our configuration information */
26struct cros_ec_dev {
27 enum cros_ec_interface_t interface;
28 struct spi_slave *spi; /* Our SPI slave, if using SPI */
29 int node; /* Our node */
30 int parent_node; /* Our parent node (interface) */
31 unsigned int cs; /* Our chip select */
32 unsigned int addr; /* Device address (for I2C) */
33 unsigned int bus_num; /* Bus number (for I2C) */
34 unsigned int max_frequency; /* Maximum interface frequency */
35 struct fdt_gpio_state ec_int; /* GPIO used as EC interrupt line */
36 int cmd_version_is_supported; /* Device supports command versions */
37 int optimise_flash_write; /* Don't write erased flash blocks */
38
39 /*
40 * These two buffers will always be dword-aligned and include enough
41 * space for up to 7 word-alignment bytes also, so we can ensure that
42 * the body of the message is always dword-aligned (64-bit).
43 *
44 * We use this alignment to keep ARM and x86 happy. Probably word
45 * alignment would be OK, there might be a small performance advantage
46 * to using dword.
47 */
48 uint8_t din[ALIGN(MSG_BYTES + sizeof(int64_t), sizeof(int64_t))]
49 __aligned(sizeof(int64_t));
50 uint8_t dout[ALIGN(MSG_BYTES + sizeof(int64_t), sizeof(int64_t))]
51 __aligned(sizeof(int64_t));
52};
53
54/*
55 * Hard-code the number of columns we happen to know we have right now. It
56 * would be more correct to call cros_ec_info() at startup and determine the
57 * actual number of keyboard cols from there.
58 */
59#define CROS_EC_KEYSCAN_COLS 13
60
61/* Information returned by a key scan */
62struct mbkp_keyscan {
63 uint8_t data[CROS_EC_KEYSCAN_COLS];
64};
65
Simon Glassd7f25f32014-02-27 13:26:03 -070066/* Holds information about the Chrome EC */
67struct fdt_cros_ec {
68 struct fmap_entry flash; /* Address and size of EC flash */
69 /*
70 * Byte value of erased flash, or -1 if not known. It is normally
71 * 0xff but some flash devices use 0 (e.g. STM32Lxxx)
72 */
73 int flash_erase_value;
74 struct fmap_entry region[EC_FLASH_REGION_COUNT];
75};
76
Hung-ying Tyan88364382013-05-15 18:27:28 +080077/**
78 * Read the ID of the CROS-EC device
79 *
80 * The ID is a string identifying the CROS-EC device.
81 *
82 * @param dev CROS-EC device
83 * @param id Place to put the ID
84 * @param maxlen Maximum length of the ID field
85 * @return 0 if ok, -1 on error
86 */
87int cros_ec_read_id(struct cros_ec_dev *dev, char *id, int maxlen);
88
89/**
90 * Read a keyboard scan from the CROS-EC device
91 *
92 * Send a message requesting a keyboard scan and return the result
93 *
94 * @param dev CROS-EC device
95 * @param scan Place to put the scan results
96 * @return 0 if ok, -1 on error
97 */
98int cros_ec_scan_keyboard(struct cros_ec_dev *dev, struct mbkp_keyscan *scan);
99
100/**
101 * Read which image is currently running on the CROS-EC device.
102 *
103 * @param dev CROS-EC device
104 * @param image Destination for image identifier
105 * @return 0 if ok, <0 on error
106 */
107int cros_ec_read_current_image(struct cros_ec_dev *dev,
108 enum ec_current_image *image);
109
110/**
111 * Read the hash of the CROS-EC device firmware.
112 *
113 * @param dev CROS-EC device
114 * @param hash Destination for hash information
115 * @return 0 if ok, <0 on error
116 */
117int cros_ec_read_hash(struct cros_ec_dev *dev,
118 struct ec_response_vboot_hash *hash);
119
120/**
121 * Send a reboot command to the CROS-EC device.
122 *
123 * Note that some reboot commands (such as EC_REBOOT_COLD) also reboot the AP.
124 *
125 * @param dev CROS-EC device
126 * @param cmd Reboot command
127 * @param flags Flags for reboot command (EC_REBOOT_FLAG_*)
128 * @return 0 if ok, <0 on error
129 */
130int cros_ec_reboot(struct cros_ec_dev *dev, enum ec_reboot_cmd cmd,
131 uint8_t flags);
132
133/**
134 * Check if the CROS-EC device has an interrupt pending.
135 *
136 * Read the status of the external interrupt connected to the CROS-EC device.
137 * If no external interrupt is configured, this always returns 1.
138 *
139 * @param dev CROS-EC device
140 * @return 0 if no interrupt is pending
141 */
142int cros_ec_interrupt_pending(struct cros_ec_dev *dev);
143
144enum {
145 CROS_EC_OK,
146 CROS_EC_ERR = 1,
147 CROS_EC_ERR_FDT_DECODE,
148 CROS_EC_ERR_CHECK_VERSION,
149 CROS_EC_ERR_READ_ID,
150 CROS_EC_ERR_DEV_INIT,
151};
152
153/**
154 * Set up the Chromium OS matrix keyboard protocol
155 *
156 * @param blob Device tree blob containing setup information
157 * @param cros_ecp Returns pointer to the cros_ec device, or NULL if none
158 * @return 0 if we got an cros_ec device and all is well (or no cros_ec is
159 * expected), -ve if we should have an cros_ec device but failed to find
160 * one, or init failed (-CROS_EC_ERR_...).
161 */
162int cros_ec_init(const void *blob, struct cros_ec_dev **cros_ecp);
163
164/**
165 * Read information about the keyboard matrix
166 *
167 * @param dev CROS-EC device
168 * @param info Place to put the info structure
169 */
170int cros_ec_info(struct cros_ec_dev *dev,
171 struct ec_response_cros_ec_info *info);
172
173/**
174 * Read the host event flags
175 *
176 * @param dev CROS-EC device
177 * @param events_ptr Destination for event flags. Not changed on error.
178 * @return 0 if ok, <0 on error
179 */
180int cros_ec_get_host_events(struct cros_ec_dev *dev, uint32_t *events_ptr);
181
182/**
183 * Clear the specified host event flags
184 *
185 * @param dev CROS-EC device
186 * @param events Event flags to clear
187 * @return 0 if ok, <0 on error
188 */
189int cros_ec_clear_host_events(struct cros_ec_dev *dev, uint32_t events);
190
191/**
192 * Get/set flash protection
193 *
194 * @param dev CROS-EC device
195 * @param set_mask Mask of flags to set; if 0, just retrieves existing
196 * protection state without changing it.
197 * @param set_flags New flag values; only bits in set_mask are applied;
198 * ignored if set_mask=0.
199 * @param prot Destination for updated protection state from EC.
200 * @return 0 if ok, <0 on error
201 */
202int cros_ec_flash_protect(struct cros_ec_dev *dev,
203 uint32_t set_mask, uint32_t set_flags,
204 struct ec_response_flash_protect *resp);
205
206
207/**
208 * Run internal tests on the cros_ec interface.
209 *
210 * @param dev CROS-EC device
211 * @return 0 if ok, <0 if the test failed
212 */
213int cros_ec_test(struct cros_ec_dev *dev);
214
215/**
216 * Update the EC RW copy.
217 *
218 * @param dev CROS-EC device
219 * @param image the content to write
220 * @param imafge_size content length
221 * @return 0 if ok, <0 if the test failed
222 */
223int cros_ec_flash_update_rw(struct cros_ec_dev *dev,
224 const uint8_t *image, int image_size);
225
226/**
227 * Return a pointer to the board's CROS-EC device
228 *
229 * This should be implemented by board files.
230 *
231 * @return pointer to CROS-EC device, or NULL if none is available
232 */
233struct cros_ec_dev *board_get_cros_ec_dev(void);
234
235
236/* Internal interfaces */
237int cros_ec_i2c_init(struct cros_ec_dev *dev, const void *blob);
238int cros_ec_spi_init(struct cros_ec_dev *dev, const void *blob);
239int cros_ec_lpc_init(struct cros_ec_dev *dev, const void *blob);
240
241/**
242 * Read information from the fdt for the i2c cros_ec interface
243 *
244 * @param dev CROS-EC device
245 * @param blob Device tree blob
246 * @return 0 if ok, -1 if we failed to read all required information
247 */
248int cros_ec_i2c_decode_fdt(struct cros_ec_dev *dev, const void *blob);
249
250/**
251 * Read information from the fdt for the spi cros_ec interface
252 *
253 * @param dev CROS-EC device
254 * @param blob Device tree blob
255 * @return 0 if ok, -1 if we failed to read all required information
256 */
257int cros_ec_spi_decode_fdt(struct cros_ec_dev *dev, const void *blob);
258
259/**
260 * Check whether the LPC interface supports new-style commands.
261 *
262 * LPC has its own way of doing this, which involves checking LPC values
263 * visible to the host. Do this, and update dev->cmd_version_is_supported
264 * accordingly.
265 *
266 * @param dev CROS-EC device to check
267 */
268int cros_ec_lpc_check_version(struct cros_ec_dev *dev);
269
270/**
271 * Send a command to an I2C CROS-EC device and return the reply.
272 *
273 * This rather complicated function deals with sending both old-style and
274 * new-style commands. The old ones have just a command byte and arguments.
275 * The new ones have version, command, arg-len, [args], chksum so are 3 bytes
276 * longer.
277 *
278 * The device's internal input/output buffers are used.
279 *
280 * @param dev CROS-EC device
281 * @param cmd Command to send (EC_CMD_...)
282 * @param cmd_version Version of command to send (EC_VER_...)
283 * @param dout Output data (may be NULL If dout_len=0)
284 * @param dout_len Size of output data in bytes
285 * @param dinp Returns pointer to response data
286 * @param din_len Maximum size of response in bytes
287 * @return number of bytes in response, or -1 on error
288 */
289int cros_ec_i2c_command(struct cros_ec_dev *dev, uint8_t cmd, int cmd_version,
290 const uint8_t *dout, int dout_len,
291 uint8_t **dinp, int din_len);
292
293/**
294 * Send a command to a LPC CROS-EC device and return the reply.
295 *
296 * The device's internal input/output buffers are used.
297 *
298 * @param dev CROS-EC device
299 * @param cmd Command to send (EC_CMD_...)
300 * @param cmd_version Version of command to send (EC_VER_...)
301 * @param dout Output data (may be NULL If dout_len=0)
302 * @param dout_len Size of output data in bytes
303 * @param dinp Returns pointer to response data
304 * @param din_len Maximum size of response in bytes
305 * @return number of bytes in response, or -1 on error
306 */
307int cros_ec_lpc_command(struct cros_ec_dev *dev, uint8_t cmd, int cmd_version,
308 const uint8_t *dout, int dout_len,
309 uint8_t **dinp, int din_len);
310
311int cros_ec_spi_command(struct cros_ec_dev *dev, uint8_t cmd, int cmd_version,
312 const uint8_t *dout, int dout_len,
313 uint8_t **dinp, int din_len);
314
315/**
316 * Dump a block of data for a command.
317 *
318 * @param name Name for data (e.g. 'in', 'out')
319 * @param cmd Command number associated with data, or -1 for none
320 * @param data Data block to dump
321 * @param len Length of data block to dump
322 */
323void cros_ec_dump_data(const char *name, int cmd, const uint8_t *data, int len);
324
325/**
326 * Calculate a simple 8-bit checksum of a data block
327 *
328 * @param data Data block to checksum
329 * @param size Size of data block in bytes
330 * @return checksum value (0 to 255)
331 */
332int cros_ec_calc_checksum(const uint8_t *data, int size);
333
334/**
335 * Decode a flash region parameter
336 *
337 * @param argc Number of params remaining
338 * @param argv List of remaining parameters
339 * @return flash region (EC_FLASH_REGION_...) or -1 on error
340 */
341int cros_ec_decode_region(int argc, char * const argv[]);
342
343int cros_ec_flash_erase(struct cros_ec_dev *dev, uint32_t offset,
344 uint32_t size);
345
346/**
347 * Read data from the flash
348 *
349 * Read an arbitrary amount of data from the EC flash, by repeatedly reading
350 * small blocks.
351 *
352 * The offset starts at 0. You can obtain the region information from
353 * cros_ec_flash_offset() to find out where to read for a particular region.
354 *
355 * @param dev CROS-EC device
356 * @param data Pointer to data buffer to read into
357 * @param offset Offset within flash to read from
358 * @param size Number of bytes to read
359 * @return 0 if ok, -1 on error
360 */
361int cros_ec_flash_read(struct cros_ec_dev *dev, uint8_t *data, uint32_t offset,
362 uint32_t size);
363
364/**
365 * Write data to the flash
366 *
367 * Write an arbitrary amount of data to the EC flash, by repeatedly writing
368 * small blocks.
369 *
370 * The offset starts at 0. You can obtain the region information from
371 * cros_ec_flash_offset() to find out where to write for a particular region.
372 *
373 * Attempting to write to the region where the EC is currently running from
374 * will result in an error.
375 *
376 * @param dev CROS-EC device
377 * @param data Pointer to data buffer to write
378 * @param offset Offset within flash to write to.
379 * @param size Number of bytes to write
380 * @return 0 if ok, -1 on error
381 */
382int cros_ec_flash_write(struct cros_ec_dev *dev, const uint8_t *data,
383 uint32_t offset, uint32_t size);
384
385/**
386 * Obtain position and size of a flash region
387 *
388 * @param dev CROS-EC device
389 * @param region Flash region to query
390 * @param offset Returns offset of flash region in EC flash
391 * @param size Returns size of flash region
392 * @return 0 if ok, -1 on error
393 */
394int cros_ec_flash_offset(struct cros_ec_dev *dev, enum ec_flash_region region,
395 uint32_t *offset, uint32_t *size);
396
397/**
398 * Read/write VbNvContext from/to a CROS-EC device.
399 *
400 * @param dev CROS-EC device
401 * @param block Buffer of VbNvContext to be read/write
402 * @return 0 if ok, -1 on error
403 */
404int cros_ec_read_vbnvcontext(struct cros_ec_dev *dev, uint8_t *block);
405int cros_ec_write_vbnvcontext(struct cros_ec_dev *dev, const uint8_t *block);
406
407/**
408 * Read the version information for the EC images
409 *
410 * @param dev CROS-EC device
411 * @param versionp This is set to point to the version information
412 * @return 0 if ok, -1 on error
413 */
414int cros_ec_read_version(struct cros_ec_dev *dev,
415 struct ec_response_get_version **versionp);
416
417/**
418 * Read the build information for the EC
419 *
420 * @param dev CROS-EC device
421 * @param versionp This is set to point to the build string
422 * @return 0 if ok, -1 on error
423 */
424int cros_ec_read_build_info(struct cros_ec_dev *dev, char **strp);
425
426/**
427 * Switch on/off a LDO / FET.
428 *
429 * @param dev CROS-EC device
430 * @param index index of the LDO/FET to switch
431 * @param state new state of the LDO/FET : EC_LDO_STATE_ON|OFF
432 * @return 0 if ok, -1 on error
433 */
434int cros_ec_set_ldo(struct cros_ec_dev *dev, uint8_t index, uint8_t state);
435
436/**
437 * Read back a LDO / FET current state.
438 *
439 * @param dev CROS-EC device
440 * @param index index of the LDO/FET to switch
441 * @param state current state of the LDO/FET : EC_LDO_STATE_ON|OFF
442 * @return 0 if ok, -1 on error
443 */
444int cros_ec_get_ldo(struct cros_ec_dev *dev, uint8_t index, uint8_t *state);
Vadim Bendebury41364f02014-02-27 13:26:02 -0700445
446/**
447 * Initialize the Chrome OS EC at board initialization time.
448 *
449 * @return 0 if ok, -ve on error
450 */
451int cros_ec_board_init(void);
452
453/**
454 * Get access to the error reported when cros_ec_board_init() was called
455 *
456 * This permits delayed reporting of the EC error if it failed during
457 * early init.
458 *
459 * @return error (0 if there was no error, -ve if there was an error)
460 */
461int cros_ec_get_error(void);
462
Simon Glassd7f25f32014-02-27 13:26:03 -0700463/**
464 * Returns information from the FDT about the Chrome EC flash
465 *
466 * @param blob FDT blob to use
467 * @param config Structure to use to return information
468 */
469int cros_ec_decode_ec_flash(const void *blob, struct fdt_cros_ec *config);
470
Hung-ying Tyan88364382013-05-15 18:27:28 +0800471#endif