]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - include/cros_ec.h
999c3c90c50a58f4271c434cf966d8a46e0c452c
[karo-tx-uboot.git] / include / cros_ec.h
1 /*
2  * Chromium OS cros_ec driver
3  *
4  * Copyright (c) 2012 The Chromium OS Authors.
5  *
6  * SPDX-License-Identifier:     GPL-2.0+
7  */
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? */
18 enum 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 */
26 struct 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 */
62 struct mbkp_keyscan {
63         uint8_t data[CROS_EC_KEYSCAN_COLS];
64 };
65
66 /* Holds information about the Chrome EC */
67 struct 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
77 /**
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  */
87 int 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  */
98 int 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  */
107 int 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  */
117 int 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  */
130 int 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  */
142 int cros_ec_interrupt_pending(struct cros_ec_dev *dev);
143
144 enum {
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  */
162 int 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  */
170 int 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  */
180 int 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  */
189 int 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  */
202 int 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  */
213 int 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  */
223 int 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  */
233 struct cros_ec_dev *board_get_cros_ec_dev(void);
234
235
236 /* Internal interfaces */
237 int cros_ec_i2c_init(struct cros_ec_dev *dev, const void *blob);
238 int cros_ec_spi_init(struct cros_ec_dev *dev, const void *blob);
239 int 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  */
248 int 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  */
257 int 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  */
268 int 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  */
289 int 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  */
307 int 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
311 int 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  */
323 void 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  */
332 int 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  */
341 int cros_ec_decode_region(int argc, char * const argv[]);
342
343 int 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  */
361 int 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  */
382 int 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  */
394 int 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  */
404 int cros_ec_read_vbnvcontext(struct cros_ec_dev *dev, uint8_t *block);
405 int 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  */
414 int 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  */
424 int 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  */
434 int 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  */
444 int cros_ec_get_ldo(struct cros_ec_dev *dev, uint8_t index, uint8_t *state);
445
446 /**
447  * Initialize the Chrome OS EC at board initialization time.
448  *
449  * @return 0 if ok, -ve on error
450  */
451 int 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  */
461 int cros_ec_get_error(void);
462
463 /**
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  */
469 int cros_ec_decode_ec_flash(const void *blob, struct fdt_cros_ec *config);
470
471 #endif