xref: /rk3399_rockchip-uboot/include/cros_ec.h (revision 836bb6e8277aaa8f0f86e39b0c38b207d32723d9)
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  * Initialise the Chromium OS EC driver
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_mkbp_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
472