188364387SHung-ying Tyan /* 288364387SHung-ying Tyan * Chromium OS cros_ec driver 388364387SHung-ying Tyan * 488364387SHung-ying Tyan * Copyright (c) 2012 The Chromium OS Authors. 588364387SHung-ying Tyan * 61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 788364387SHung-ying Tyan */ 888364387SHung-ying Tyan 988364387SHung-ying Tyan #ifndef _CROS_EC_H 1088364387SHung-ying Tyan #define _CROS_EC_H 1188364387SHung-ying Tyan 1288364387SHung-ying Tyan #include <linux/compiler.h> 1388364387SHung-ying Tyan #include <ec_commands.h> 1488364387SHung-ying Tyan #include <fdtdec.h> 1588364387SHung-ying Tyan #include <cros_ec_message.h> 16*32f8a19fSSimon Glass #include <asm/gpio.h> 1788364387SHung-ying Tyan 1884d6cbd3SSimon Glass #ifndef CONFIG_DM_CROS_EC 1988364387SHung-ying Tyan /* Which interface is the device on? */ 2088364387SHung-ying Tyan enum cros_ec_interface_t { 2188364387SHung-ying Tyan CROS_EC_IF_NONE, 2288364387SHung-ying Tyan CROS_EC_IF_SPI, 2388364387SHung-ying Tyan CROS_EC_IF_I2C, 2488364387SHung-ying Tyan CROS_EC_IF_LPC, /* Intel Low Pin Count interface */ 25df93d90aSSimon Glass CROS_EC_IF_SANDBOX, 2688364387SHung-ying Tyan }; 2784d6cbd3SSimon Glass #endif 2888364387SHung-ying Tyan 2988364387SHung-ying Tyan /* Our configuration information */ 3088364387SHung-ying Tyan struct cros_ec_dev { 3184d6cbd3SSimon Glass #ifdef CONFIG_DM_CROS_EC 3284d6cbd3SSimon Glass struct udevice *dev; /* Transport device */ 3384d6cbd3SSimon Glass #else 3488364387SHung-ying Tyan enum cros_ec_interface_t interface; 3588364387SHung-ying Tyan struct spi_slave *spi; /* Our SPI slave, if using SPI */ 3688364387SHung-ying Tyan int node; /* Our node */ 3788364387SHung-ying Tyan int parent_node; /* Our parent node (interface) */ 3888364387SHung-ying Tyan unsigned int cs; /* Our chip select */ 3988364387SHung-ying Tyan unsigned int addr; /* Device address (for I2C) */ 4088364387SHung-ying Tyan unsigned int bus_num; /* Bus number (for I2C) */ 4188364387SHung-ying Tyan unsigned int max_frequency; /* Maximum interface frequency */ 4284d6cbd3SSimon Glass #endif 43*32f8a19fSSimon Glass struct gpio_desc ec_int; /* GPIO used as EC interrupt line */ 44e8c12662SRandall Spangler int protocol_version; /* Protocol version to use */ 4588364387SHung-ying Tyan int optimise_flash_write; /* Don't write erased flash blocks */ 4688364387SHung-ying Tyan 4788364387SHung-ying Tyan /* 4888364387SHung-ying Tyan * These two buffers will always be dword-aligned and include enough 4988364387SHung-ying Tyan * space for up to 7 word-alignment bytes also, so we can ensure that 5088364387SHung-ying Tyan * the body of the message is always dword-aligned (64-bit). 5188364387SHung-ying Tyan * 5288364387SHung-ying Tyan * We use this alignment to keep ARM and x86 happy. Probably word 5388364387SHung-ying Tyan * alignment would be OK, there might be a small performance advantage 5488364387SHung-ying Tyan * to using dword. 5588364387SHung-ying Tyan */ 5688364387SHung-ying Tyan uint8_t din[ALIGN(MSG_BYTES + sizeof(int64_t), sizeof(int64_t))] 5788364387SHung-ying Tyan __aligned(sizeof(int64_t)); 5888364387SHung-ying Tyan uint8_t dout[ALIGN(MSG_BYTES + sizeof(int64_t), sizeof(int64_t))] 5988364387SHung-ying Tyan __aligned(sizeof(int64_t)); 6088364387SHung-ying Tyan }; 6188364387SHung-ying Tyan 6288364387SHung-ying Tyan /* 6388364387SHung-ying Tyan * Hard-code the number of columns we happen to know we have right now. It 6488364387SHung-ying Tyan * would be more correct to call cros_ec_info() at startup and determine the 6588364387SHung-ying Tyan * actual number of keyboard cols from there. 6688364387SHung-ying Tyan */ 6788364387SHung-ying Tyan #define CROS_EC_KEYSCAN_COLS 13 6888364387SHung-ying Tyan 6988364387SHung-ying Tyan /* Information returned by a key scan */ 7088364387SHung-ying Tyan struct mbkp_keyscan { 7188364387SHung-ying Tyan uint8_t data[CROS_EC_KEYSCAN_COLS]; 7288364387SHung-ying Tyan }; 7388364387SHung-ying Tyan 74d7f25f35SSimon Glass /* Holds information about the Chrome EC */ 75d7f25f35SSimon Glass struct fdt_cros_ec { 76d7f25f35SSimon Glass struct fmap_entry flash; /* Address and size of EC flash */ 77d7f25f35SSimon Glass /* 78d7f25f35SSimon Glass * Byte value of erased flash, or -1 if not known. It is normally 79d7f25f35SSimon Glass * 0xff but some flash devices use 0 (e.g. STM32Lxxx) 80d7f25f35SSimon Glass */ 81d7f25f35SSimon Glass int flash_erase_value; 82d7f25f35SSimon Glass struct fmap_entry region[EC_FLASH_REGION_COUNT]; 83d7f25f35SSimon Glass }; 84d7f25f35SSimon Glass 8588364387SHung-ying Tyan /** 8688364387SHung-ying Tyan * Read the ID of the CROS-EC device 8788364387SHung-ying Tyan * 8888364387SHung-ying Tyan * The ID is a string identifying the CROS-EC device. 8988364387SHung-ying Tyan * 9088364387SHung-ying Tyan * @param dev CROS-EC device 9188364387SHung-ying Tyan * @param id Place to put the ID 9288364387SHung-ying Tyan * @param maxlen Maximum length of the ID field 9388364387SHung-ying Tyan * @return 0 if ok, -1 on error 9488364387SHung-ying Tyan */ 9588364387SHung-ying Tyan int cros_ec_read_id(struct cros_ec_dev *dev, char *id, int maxlen); 9688364387SHung-ying Tyan 9788364387SHung-ying Tyan /** 9888364387SHung-ying Tyan * Read a keyboard scan from the CROS-EC device 9988364387SHung-ying Tyan * 10088364387SHung-ying Tyan * Send a message requesting a keyboard scan and return the result 10188364387SHung-ying Tyan * 10288364387SHung-ying Tyan * @param dev CROS-EC device 10388364387SHung-ying Tyan * @param scan Place to put the scan results 10488364387SHung-ying Tyan * @return 0 if ok, -1 on error 10588364387SHung-ying Tyan */ 10688364387SHung-ying Tyan int cros_ec_scan_keyboard(struct cros_ec_dev *dev, struct mbkp_keyscan *scan); 10788364387SHung-ying Tyan 10888364387SHung-ying Tyan /** 10988364387SHung-ying Tyan * Read which image is currently running on the CROS-EC device. 11088364387SHung-ying Tyan * 11188364387SHung-ying Tyan * @param dev CROS-EC device 11288364387SHung-ying Tyan * @param image Destination for image identifier 11388364387SHung-ying Tyan * @return 0 if ok, <0 on error 11488364387SHung-ying Tyan */ 11588364387SHung-ying Tyan int cros_ec_read_current_image(struct cros_ec_dev *dev, 11688364387SHung-ying Tyan enum ec_current_image *image); 11788364387SHung-ying Tyan 11888364387SHung-ying Tyan /** 11988364387SHung-ying Tyan * Read the hash of the CROS-EC device firmware. 12088364387SHung-ying Tyan * 12188364387SHung-ying Tyan * @param dev CROS-EC device 12288364387SHung-ying Tyan * @param hash Destination for hash information 12388364387SHung-ying Tyan * @return 0 if ok, <0 on error 12488364387SHung-ying Tyan */ 12588364387SHung-ying Tyan int cros_ec_read_hash(struct cros_ec_dev *dev, 12688364387SHung-ying Tyan struct ec_response_vboot_hash *hash); 12788364387SHung-ying Tyan 12888364387SHung-ying Tyan /** 12988364387SHung-ying Tyan * Send a reboot command to the CROS-EC device. 13088364387SHung-ying Tyan * 13188364387SHung-ying Tyan * Note that some reboot commands (such as EC_REBOOT_COLD) also reboot the AP. 13288364387SHung-ying Tyan * 13388364387SHung-ying Tyan * @param dev CROS-EC device 13488364387SHung-ying Tyan * @param cmd Reboot command 13588364387SHung-ying Tyan * @param flags Flags for reboot command (EC_REBOOT_FLAG_*) 13688364387SHung-ying Tyan * @return 0 if ok, <0 on error 13788364387SHung-ying Tyan */ 13888364387SHung-ying Tyan int cros_ec_reboot(struct cros_ec_dev *dev, enum ec_reboot_cmd cmd, 13988364387SHung-ying Tyan uint8_t flags); 14088364387SHung-ying Tyan 14188364387SHung-ying Tyan /** 14288364387SHung-ying Tyan * Check if the CROS-EC device has an interrupt pending. 14388364387SHung-ying Tyan * 14488364387SHung-ying Tyan * Read the status of the external interrupt connected to the CROS-EC device. 14588364387SHung-ying Tyan * If no external interrupt is configured, this always returns 1. 14688364387SHung-ying Tyan * 14788364387SHung-ying Tyan * @param dev CROS-EC device 14888364387SHung-ying Tyan * @return 0 if no interrupt is pending 14988364387SHung-ying Tyan */ 15088364387SHung-ying Tyan int cros_ec_interrupt_pending(struct cros_ec_dev *dev); 15188364387SHung-ying Tyan 15288364387SHung-ying Tyan enum { 15388364387SHung-ying Tyan CROS_EC_OK, 15488364387SHung-ying Tyan CROS_EC_ERR = 1, 15588364387SHung-ying Tyan CROS_EC_ERR_FDT_DECODE, 15688364387SHung-ying Tyan CROS_EC_ERR_CHECK_VERSION, 15788364387SHung-ying Tyan CROS_EC_ERR_READ_ID, 15888364387SHung-ying Tyan CROS_EC_ERR_DEV_INIT, 15988364387SHung-ying Tyan }; 16088364387SHung-ying Tyan 16188364387SHung-ying Tyan /** 162836bb6e8SSimon Glass * Initialise the Chromium OS EC driver 16388364387SHung-ying Tyan * 16488364387SHung-ying Tyan * @param blob Device tree blob containing setup information 16588364387SHung-ying Tyan * @param cros_ecp Returns pointer to the cros_ec device, or NULL if none 16688364387SHung-ying Tyan * @return 0 if we got an cros_ec device and all is well (or no cros_ec is 16788364387SHung-ying Tyan * expected), -ve if we should have an cros_ec device but failed to find 16888364387SHung-ying Tyan * one, or init failed (-CROS_EC_ERR_...). 16988364387SHung-ying Tyan */ 17088364387SHung-ying Tyan int cros_ec_init(const void *blob, struct cros_ec_dev **cros_ecp); 17188364387SHung-ying Tyan 17288364387SHung-ying Tyan /** 17388364387SHung-ying Tyan * Read information about the keyboard matrix 17488364387SHung-ying Tyan * 17588364387SHung-ying Tyan * @param dev CROS-EC device 17688364387SHung-ying Tyan * @param info Place to put the info structure 17788364387SHung-ying Tyan */ 17888364387SHung-ying Tyan int cros_ec_info(struct cros_ec_dev *dev, 179836bb6e8SSimon Glass struct ec_response_mkbp_info *info); 18088364387SHung-ying Tyan 18188364387SHung-ying Tyan /** 18288364387SHung-ying Tyan * Read the host event flags 18388364387SHung-ying Tyan * 18488364387SHung-ying Tyan * @param dev CROS-EC device 18588364387SHung-ying Tyan * @param events_ptr Destination for event flags. Not changed on error. 18688364387SHung-ying Tyan * @return 0 if ok, <0 on error 18788364387SHung-ying Tyan */ 18888364387SHung-ying Tyan int cros_ec_get_host_events(struct cros_ec_dev *dev, uint32_t *events_ptr); 18988364387SHung-ying Tyan 19088364387SHung-ying Tyan /** 19188364387SHung-ying Tyan * Clear the specified host event flags 19288364387SHung-ying Tyan * 19388364387SHung-ying Tyan * @param dev CROS-EC device 19488364387SHung-ying Tyan * @param events Event flags to clear 19588364387SHung-ying Tyan * @return 0 if ok, <0 on error 19688364387SHung-ying Tyan */ 19788364387SHung-ying Tyan int cros_ec_clear_host_events(struct cros_ec_dev *dev, uint32_t events); 19888364387SHung-ying Tyan 19988364387SHung-ying Tyan /** 20088364387SHung-ying Tyan * Get/set flash protection 20188364387SHung-ying Tyan * 20288364387SHung-ying Tyan * @param dev CROS-EC device 20388364387SHung-ying Tyan * @param set_mask Mask of flags to set; if 0, just retrieves existing 20488364387SHung-ying Tyan * protection state without changing it. 20588364387SHung-ying Tyan * @param set_flags New flag values; only bits in set_mask are applied; 20688364387SHung-ying Tyan * ignored if set_mask=0. 20788364387SHung-ying Tyan * @param prot Destination for updated protection state from EC. 20888364387SHung-ying Tyan * @return 0 if ok, <0 on error 20988364387SHung-ying Tyan */ 21088364387SHung-ying Tyan int cros_ec_flash_protect(struct cros_ec_dev *dev, 21188364387SHung-ying Tyan uint32_t set_mask, uint32_t set_flags, 21288364387SHung-ying Tyan struct ec_response_flash_protect *resp); 21388364387SHung-ying Tyan 21488364387SHung-ying Tyan 21588364387SHung-ying Tyan /** 21688364387SHung-ying Tyan * Run internal tests on the cros_ec interface. 21788364387SHung-ying Tyan * 21888364387SHung-ying Tyan * @param dev CROS-EC device 21988364387SHung-ying Tyan * @return 0 if ok, <0 if the test failed 22088364387SHung-ying Tyan */ 22188364387SHung-ying Tyan int cros_ec_test(struct cros_ec_dev *dev); 22288364387SHung-ying Tyan 22388364387SHung-ying Tyan /** 22488364387SHung-ying Tyan * Update the EC RW copy. 22588364387SHung-ying Tyan * 22688364387SHung-ying Tyan * @param dev CROS-EC device 22788364387SHung-ying Tyan * @param image the content to write 22888364387SHung-ying Tyan * @param imafge_size content length 22988364387SHung-ying Tyan * @return 0 if ok, <0 if the test failed 23088364387SHung-ying Tyan */ 23188364387SHung-ying Tyan int cros_ec_flash_update_rw(struct cros_ec_dev *dev, 23288364387SHung-ying Tyan const uint8_t *image, int image_size); 23388364387SHung-ying Tyan 23488364387SHung-ying Tyan /** 23588364387SHung-ying Tyan * Return a pointer to the board's CROS-EC device 23688364387SHung-ying Tyan * 23788364387SHung-ying Tyan * This should be implemented by board files. 23888364387SHung-ying Tyan * 23988364387SHung-ying Tyan * @return pointer to CROS-EC device, or NULL if none is available 24088364387SHung-ying Tyan */ 24188364387SHung-ying Tyan struct cros_ec_dev *board_get_cros_ec_dev(void); 24288364387SHung-ying Tyan 24384d6cbd3SSimon Glass #ifdef CONFIG_DM_CROS_EC 24484d6cbd3SSimon Glass 24584d6cbd3SSimon Glass struct dm_cros_ec_ops { 24684d6cbd3SSimon Glass int (*check_version)(struct udevice *dev); 24784d6cbd3SSimon Glass int (*command)(struct udevice *dev, uint8_t cmd, int cmd_version, 24884d6cbd3SSimon Glass const uint8_t *dout, int dout_len, 24984d6cbd3SSimon Glass uint8_t **dinp, int din_len); 25084d6cbd3SSimon Glass int (*packet)(struct udevice *dev, int out_bytes, int in_bytes); 25184d6cbd3SSimon Glass }; 25284d6cbd3SSimon Glass 25384d6cbd3SSimon Glass #define dm_cros_ec_get_ops(dev) \ 25484d6cbd3SSimon Glass ((struct dm_cros_ec_ops *)(dev)->driver->ops) 25584d6cbd3SSimon Glass 25684d6cbd3SSimon Glass int cros_ec_register(struct udevice *dev); 25784d6cbd3SSimon Glass 25884d6cbd3SSimon Glass #else /* !CONFIG_DM_CROS_EC */ 25988364387SHung-ying Tyan 26088364387SHung-ying Tyan /* Internal interfaces */ 26188364387SHung-ying Tyan int cros_ec_i2c_init(struct cros_ec_dev *dev, const void *blob); 26288364387SHung-ying Tyan int cros_ec_spi_init(struct cros_ec_dev *dev, const void *blob); 26388364387SHung-ying Tyan int cros_ec_lpc_init(struct cros_ec_dev *dev, const void *blob); 264df93d90aSSimon Glass int cros_ec_sandbox_init(struct cros_ec_dev *dev, const void *blob); 26588364387SHung-ying Tyan 26688364387SHung-ying Tyan /** 26788364387SHung-ying Tyan * Read information from the fdt for the i2c cros_ec interface 26888364387SHung-ying Tyan * 26988364387SHung-ying Tyan * @param dev CROS-EC device 27088364387SHung-ying Tyan * @param blob Device tree blob 27188364387SHung-ying Tyan * @return 0 if ok, -1 if we failed to read all required information 27288364387SHung-ying Tyan */ 27388364387SHung-ying Tyan int cros_ec_i2c_decode_fdt(struct cros_ec_dev *dev, const void *blob); 27488364387SHung-ying Tyan 27588364387SHung-ying Tyan /** 27688364387SHung-ying Tyan * Read information from the fdt for the spi cros_ec interface 27788364387SHung-ying Tyan * 27888364387SHung-ying Tyan * @param dev CROS-EC device 27988364387SHung-ying Tyan * @param blob Device tree blob 28088364387SHung-ying Tyan * @return 0 if ok, -1 if we failed to read all required information 28188364387SHung-ying Tyan */ 28288364387SHung-ying Tyan int cros_ec_spi_decode_fdt(struct cros_ec_dev *dev, const void *blob); 28388364387SHung-ying Tyan 28488364387SHung-ying Tyan /** 285df93d90aSSimon Glass * Read information from the fdt for the sandbox cros_ec interface 286df93d90aSSimon Glass * 287df93d90aSSimon Glass * @param dev CROS-EC device 288df93d90aSSimon Glass * @param blob Device tree blob 289df93d90aSSimon Glass * @return 0 if ok, -1 if we failed to read all required information 290df93d90aSSimon Glass */ 291df93d90aSSimon Glass int cros_ec_sandbox_decode_fdt(struct cros_ec_dev *dev, const void *blob); 292df93d90aSSimon Glass 293df93d90aSSimon Glass /** 29488364387SHung-ying Tyan * Check whether the LPC interface supports new-style commands. 29588364387SHung-ying Tyan * 29688364387SHung-ying Tyan * LPC has its own way of doing this, which involves checking LPC values 297e8c12662SRandall Spangler * visible to the host. Do this, and update dev->protocol_version accordingly. 29888364387SHung-ying Tyan * 29988364387SHung-ying Tyan * @param dev CROS-EC device to check 30088364387SHung-ying Tyan */ 30188364387SHung-ying Tyan int cros_ec_lpc_check_version(struct cros_ec_dev *dev); 30288364387SHung-ying Tyan 30388364387SHung-ying Tyan /** 30488364387SHung-ying Tyan * Send a command to an I2C CROS-EC device and return the reply. 30588364387SHung-ying Tyan * 30688364387SHung-ying Tyan * This rather complicated function deals with sending both old-style and 30788364387SHung-ying Tyan * new-style commands. The old ones have just a command byte and arguments. 30888364387SHung-ying Tyan * The new ones have version, command, arg-len, [args], chksum so are 3 bytes 30988364387SHung-ying Tyan * longer. 31088364387SHung-ying Tyan * 31188364387SHung-ying Tyan * The device's internal input/output buffers are used. 31288364387SHung-ying Tyan * 31388364387SHung-ying Tyan * @param dev CROS-EC device 31488364387SHung-ying Tyan * @param cmd Command to send (EC_CMD_...) 31588364387SHung-ying Tyan * @param cmd_version Version of command to send (EC_VER_...) 31688364387SHung-ying Tyan * @param dout Output data (may be NULL If dout_len=0) 31788364387SHung-ying Tyan * @param dout_len Size of output data in bytes 31888364387SHung-ying Tyan * @param dinp Returns pointer to response data 31988364387SHung-ying Tyan * @param din_len Maximum size of response in bytes 32088364387SHung-ying Tyan * @return number of bytes in response, or -1 on error 32188364387SHung-ying Tyan */ 32288364387SHung-ying Tyan int cros_ec_i2c_command(struct cros_ec_dev *dev, uint8_t cmd, int cmd_version, 32388364387SHung-ying Tyan const uint8_t *dout, int dout_len, 32488364387SHung-ying Tyan uint8_t **dinp, int din_len); 32588364387SHung-ying Tyan 32688364387SHung-ying Tyan /** 32788364387SHung-ying Tyan * Send a command to a LPC CROS-EC device and return the reply. 32888364387SHung-ying Tyan * 32988364387SHung-ying Tyan * The device's internal input/output buffers are used. 33088364387SHung-ying Tyan * 33188364387SHung-ying Tyan * @param dev CROS-EC device 33288364387SHung-ying Tyan * @param cmd Command to send (EC_CMD_...) 33388364387SHung-ying Tyan * @param cmd_version Version of command to send (EC_VER_...) 33488364387SHung-ying Tyan * @param dout Output data (may be NULL If dout_len=0) 33588364387SHung-ying Tyan * @param dout_len Size of output data in bytes 33688364387SHung-ying Tyan * @param dinp Returns pointer to response data 33788364387SHung-ying Tyan * @param din_len Maximum size of response in bytes 33888364387SHung-ying Tyan * @return number of bytes in response, or -1 on error 33988364387SHung-ying Tyan */ 34088364387SHung-ying Tyan int cros_ec_lpc_command(struct cros_ec_dev *dev, uint8_t cmd, int cmd_version, 34188364387SHung-ying Tyan const uint8_t *dout, int dout_len, 34288364387SHung-ying Tyan uint8_t **dinp, int din_len); 34388364387SHung-ying Tyan 34488364387SHung-ying Tyan int cros_ec_spi_command(struct cros_ec_dev *dev, uint8_t cmd, int cmd_version, 34588364387SHung-ying Tyan const uint8_t *dout, int dout_len, 34688364387SHung-ying Tyan uint8_t **dinp, int din_len); 34788364387SHung-ying Tyan 34888364387SHung-ying Tyan /** 349a6070283SRandall Spangler * Send a packet to a CROS-EC device and return the response packet. 350a6070283SRandall Spangler * 351a6070283SRandall Spangler * Expects the request packet to be stored in dev->dout. Stores the response 352a6070283SRandall Spangler * packet in dev->din. 353a6070283SRandall Spangler * 354a6070283SRandall Spangler * @param dev CROS-EC device 355a6070283SRandall Spangler * @param out_bytes Size of request packet to output 356a6070283SRandall Spangler * @param in_bytes Maximum size of response packet to receive 357a6070283SRandall Spangler * @return number of bytes in response packet, or <0 on error 358a6070283SRandall Spangler */ 359a6070283SRandall Spangler int cros_ec_spi_packet(struct cros_ec_dev *dev, int out_bytes, int in_bytes); 360df93d90aSSimon Glass int cros_ec_sandbox_packet(struct cros_ec_dev *dev, int out_bytes, 361df93d90aSSimon Glass int in_bytes); 36284d6cbd3SSimon Glass #endif 363a6070283SRandall Spangler 364a6070283SRandall Spangler /** 36588364387SHung-ying Tyan * Dump a block of data for a command. 36688364387SHung-ying Tyan * 36788364387SHung-ying Tyan * @param name Name for data (e.g. 'in', 'out') 36888364387SHung-ying Tyan * @param cmd Command number associated with data, or -1 for none 36988364387SHung-ying Tyan * @param data Data block to dump 37088364387SHung-ying Tyan * @param len Length of data block to dump 37188364387SHung-ying Tyan */ 37288364387SHung-ying Tyan void cros_ec_dump_data(const char *name, int cmd, const uint8_t *data, int len); 37388364387SHung-ying Tyan 37488364387SHung-ying Tyan /** 37588364387SHung-ying Tyan * Calculate a simple 8-bit checksum of a data block 37688364387SHung-ying Tyan * 37788364387SHung-ying Tyan * @param data Data block to checksum 37888364387SHung-ying Tyan * @param size Size of data block in bytes 37988364387SHung-ying Tyan * @return checksum value (0 to 255) 38088364387SHung-ying Tyan */ 38188364387SHung-ying Tyan int cros_ec_calc_checksum(const uint8_t *data, int size); 38288364387SHung-ying Tyan 38388364387SHung-ying Tyan /** 38488364387SHung-ying Tyan * Decode a flash region parameter 38588364387SHung-ying Tyan * 38688364387SHung-ying Tyan * @param argc Number of params remaining 38788364387SHung-ying Tyan * @param argv List of remaining parameters 38888364387SHung-ying Tyan * @return flash region (EC_FLASH_REGION_...) or -1 on error 38988364387SHung-ying Tyan */ 39088364387SHung-ying Tyan int cros_ec_decode_region(int argc, char * const argv[]); 39188364387SHung-ying Tyan 39288364387SHung-ying Tyan int cros_ec_flash_erase(struct cros_ec_dev *dev, uint32_t offset, 39388364387SHung-ying Tyan uint32_t size); 39488364387SHung-ying Tyan 39588364387SHung-ying Tyan /** 39688364387SHung-ying Tyan * Read data from the flash 39788364387SHung-ying Tyan * 39888364387SHung-ying Tyan * Read an arbitrary amount of data from the EC flash, by repeatedly reading 39988364387SHung-ying Tyan * small blocks. 40088364387SHung-ying Tyan * 40188364387SHung-ying Tyan * The offset starts at 0. You can obtain the region information from 40288364387SHung-ying Tyan * cros_ec_flash_offset() to find out where to read for a particular region. 40388364387SHung-ying Tyan * 40488364387SHung-ying Tyan * @param dev CROS-EC device 40588364387SHung-ying Tyan * @param data Pointer to data buffer to read into 40688364387SHung-ying Tyan * @param offset Offset within flash to read from 40788364387SHung-ying Tyan * @param size Number of bytes to read 40888364387SHung-ying Tyan * @return 0 if ok, -1 on error 40988364387SHung-ying Tyan */ 41088364387SHung-ying Tyan int cros_ec_flash_read(struct cros_ec_dev *dev, uint8_t *data, uint32_t offset, 41188364387SHung-ying Tyan uint32_t size); 41288364387SHung-ying Tyan 41388364387SHung-ying Tyan /** 41488364387SHung-ying Tyan * Write data to the flash 41588364387SHung-ying Tyan * 41688364387SHung-ying Tyan * Write an arbitrary amount of data to the EC flash, by repeatedly writing 41788364387SHung-ying Tyan * small blocks. 41888364387SHung-ying Tyan * 41988364387SHung-ying Tyan * The offset starts at 0. You can obtain the region information from 42088364387SHung-ying Tyan * cros_ec_flash_offset() to find out where to write for a particular region. 42188364387SHung-ying Tyan * 42288364387SHung-ying Tyan * Attempting to write to the region where the EC is currently running from 42388364387SHung-ying Tyan * will result in an error. 42488364387SHung-ying Tyan * 42588364387SHung-ying Tyan * @param dev CROS-EC device 42688364387SHung-ying Tyan * @param data Pointer to data buffer to write 42788364387SHung-ying Tyan * @param offset Offset within flash to write to. 42888364387SHung-ying Tyan * @param size Number of bytes to write 42988364387SHung-ying Tyan * @return 0 if ok, -1 on error 43088364387SHung-ying Tyan */ 43188364387SHung-ying Tyan int cros_ec_flash_write(struct cros_ec_dev *dev, const uint8_t *data, 43288364387SHung-ying Tyan uint32_t offset, uint32_t size); 43388364387SHung-ying Tyan 43488364387SHung-ying Tyan /** 43588364387SHung-ying Tyan * Obtain position and size of a flash region 43688364387SHung-ying Tyan * 43788364387SHung-ying Tyan * @param dev CROS-EC device 43888364387SHung-ying Tyan * @param region Flash region to query 43988364387SHung-ying Tyan * @param offset Returns offset of flash region in EC flash 44088364387SHung-ying Tyan * @param size Returns size of flash region 44188364387SHung-ying Tyan * @return 0 if ok, -1 on error 44288364387SHung-ying Tyan */ 44388364387SHung-ying Tyan int cros_ec_flash_offset(struct cros_ec_dev *dev, enum ec_flash_region region, 44488364387SHung-ying Tyan uint32_t *offset, uint32_t *size); 44588364387SHung-ying Tyan 44688364387SHung-ying Tyan /** 44788364387SHung-ying Tyan * Read/write VbNvContext from/to a CROS-EC device. 44888364387SHung-ying Tyan * 44988364387SHung-ying Tyan * @param dev CROS-EC device 45088364387SHung-ying Tyan * @param block Buffer of VbNvContext to be read/write 45188364387SHung-ying Tyan * @return 0 if ok, -1 on error 45288364387SHung-ying Tyan */ 45388364387SHung-ying Tyan int cros_ec_read_vbnvcontext(struct cros_ec_dev *dev, uint8_t *block); 45488364387SHung-ying Tyan int cros_ec_write_vbnvcontext(struct cros_ec_dev *dev, const uint8_t *block); 45588364387SHung-ying Tyan 45688364387SHung-ying Tyan /** 45788364387SHung-ying Tyan * Read the version information for the EC images 45888364387SHung-ying Tyan * 45988364387SHung-ying Tyan * @param dev CROS-EC device 46088364387SHung-ying Tyan * @param versionp This is set to point to the version information 46188364387SHung-ying Tyan * @return 0 if ok, -1 on error 46288364387SHung-ying Tyan */ 46388364387SHung-ying Tyan int cros_ec_read_version(struct cros_ec_dev *dev, 46488364387SHung-ying Tyan struct ec_response_get_version **versionp); 46588364387SHung-ying Tyan 46688364387SHung-ying Tyan /** 46788364387SHung-ying Tyan * Read the build information for the EC 46888364387SHung-ying Tyan * 46988364387SHung-ying Tyan * @param dev CROS-EC device 47088364387SHung-ying Tyan * @param versionp This is set to point to the build string 47188364387SHung-ying Tyan * @return 0 if ok, -1 on error 47288364387SHung-ying Tyan */ 47388364387SHung-ying Tyan int cros_ec_read_build_info(struct cros_ec_dev *dev, char **strp); 47488364387SHung-ying Tyan 47588364387SHung-ying Tyan /** 47688364387SHung-ying Tyan * Switch on/off a LDO / FET. 47788364387SHung-ying Tyan * 47888364387SHung-ying Tyan * @param dev CROS-EC device 47988364387SHung-ying Tyan * @param index index of the LDO/FET to switch 48088364387SHung-ying Tyan * @param state new state of the LDO/FET : EC_LDO_STATE_ON|OFF 48188364387SHung-ying Tyan * @return 0 if ok, -1 on error 48288364387SHung-ying Tyan */ 48388364387SHung-ying Tyan int cros_ec_set_ldo(struct cros_ec_dev *dev, uint8_t index, uint8_t state); 48488364387SHung-ying Tyan 48588364387SHung-ying Tyan /** 48688364387SHung-ying Tyan * Read back a LDO / FET current state. 48788364387SHung-ying Tyan * 48888364387SHung-ying Tyan * @param dev CROS-EC device 48988364387SHung-ying Tyan * @param index index of the LDO/FET to switch 49088364387SHung-ying Tyan * @param state current state of the LDO/FET : EC_LDO_STATE_ON|OFF 49188364387SHung-ying Tyan * @return 0 if ok, -1 on error 49288364387SHung-ying Tyan */ 49388364387SHung-ying Tyan int cros_ec_get_ldo(struct cros_ec_dev *dev, uint8_t index, uint8_t *state); 49441364f0fSVadim Bendebury 49541364f0fSVadim Bendebury /** 49641364f0fSVadim Bendebury * Initialize the Chrome OS EC at board initialization time. 49741364f0fSVadim Bendebury * 49841364f0fSVadim Bendebury * @return 0 if ok, -ve on error 49941364f0fSVadim Bendebury */ 50041364f0fSVadim Bendebury int cros_ec_board_init(void); 50141364f0fSVadim Bendebury 50241364f0fSVadim Bendebury /** 50341364f0fSVadim Bendebury * Get access to the error reported when cros_ec_board_init() was called 50441364f0fSVadim Bendebury * 50541364f0fSVadim Bendebury * This permits delayed reporting of the EC error if it failed during 50641364f0fSVadim Bendebury * early init. 50741364f0fSVadim Bendebury * 50841364f0fSVadim Bendebury * @return error (0 if there was no error, -ve if there was an error) 50941364f0fSVadim Bendebury */ 51041364f0fSVadim Bendebury int cros_ec_get_error(void); 51141364f0fSVadim Bendebury 512d7f25f35SSimon Glass /** 513d7f25f35SSimon Glass * Returns information from the FDT about the Chrome EC flash 514d7f25f35SSimon Glass * 515d7f25f35SSimon Glass * @param blob FDT blob to use 51684d6cbd3SSimon Glass * @param node Node offset to read from 517d7f25f35SSimon Glass * @param config Structure to use to return information 518d7f25f35SSimon Glass */ 51984d6cbd3SSimon Glass int cros_ec_decode_ec_flash(const void *blob, int node, 52084d6cbd3SSimon Glass struct fdt_cros_ec *config); 521d7f25f35SSimon Glass 522df93d90aSSimon Glass /** 523df93d90aSSimon Glass * Check the current keyboard state, in case recovery mode is requested. 524df93d90aSSimon Glass * This function is for sandbox only. 525df93d90aSSimon Glass * 526df93d90aSSimon Glass * @param ec CROS-EC device 527df93d90aSSimon Glass */ 528df93d90aSSimon Glass void cros_ec_check_keyboard(struct cros_ec_dev *dev); 529df93d90aSSimon Glass 530b2a668b5SSimon Glass /* 531b2a668b5SSimon Glass * Tunnel an I2C transfer to the EC 532b2a668b5SSimon Glass * 533b2a668b5SSimon Glass * @param dev CROS-EC device 534b2a668b5SSimon Glass * @param chip Chip address (7-bit I2C address) 535b2a668b5SSimon Glass * @param addr Register address to read/write 536b2a668b5SSimon Glass * @param alen Length of register address in bytes 537b2a668b5SSimon Glass * @param buffer Buffer containing data to read/write 538b2a668b5SSimon Glass * @param len Length of buffer 539b2a668b5SSimon Glass * @param is_read 1 if this is a read, 0 if this is a write 540b2a668b5SSimon Glass */ 541b2a668b5SSimon Glass int cros_ec_i2c_xfer(struct cros_ec_dev *dev, uchar chip, uint addr, 542b2a668b5SSimon Glass int alen, uchar *buffer, int len, int is_read); 543b2a668b5SSimon Glass 54488364387SHung-ying Tyan #endif 545