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