1bfeba017SMoritz Fischer /* 2bfeba017SMoritz Fischer * Chromium OS cros_ec driver 3bfeba017SMoritz Fischer * 4bfeba017SMoritz Fischer * Copyright (c) 2016 The Chromium OS Authors. 5bfeba017SMoritz Fischer * Copyright (c) 2016 National Instruments Corp 6bfeba017SMoritz Fischer * 7bfeba017SMoritz Fischer * SPDX-License-Identifier: GPL-2.0+ 8bfeba017SMoritz Fischer */ 9bfeba017SMoritz Fischer 10bfeba017SMoritz Fischer #include <common.h> 11bfeba017SMoritz Fischer #include <command.h> 12bfeba017SMoritz Fischer #include <cros_ec.h> 13bfeba017SMoritz Fischer #include <dm.h> 14bfeba017SMoritz Fischer #include <dm/device-internal.h> 15bfeba017SMoritz Fischer #include <dm/uclass-internal.h> 16bfeba017SMoritz Fischer 17bfeba017SMoritz Fischer /* Note: depends on enum ec_current_image */ 18bfeba017SMoritz Fischer static const char * const ec_current_image_name[] = {"unknown", "RO", "RW"}; 19bfeba017SMoritz Fischer 20bfeba017SMoritz Fischer DECLARE_GLOBAL_DATA_PTR; 21bfeba017SMoritz Fischer 22bfeba017SMoritz Fischer /** 23a2558e87SMoritz Fischer * Decode a flash region parameter 24a2558e87SMoritz Fischer * 25a2558e87SMoritz Fischer * @param argc Number of params remaining 26a2558e87SMoritz Fischer * @param argv List of remaining parameters 27a2558e87SMoritz Fischer * @return flash region (EC_FLASH_REGION_...) or -1 on error 28a2558e87SMoritz Fischer */ 29a2558e87SMoritz Fischer static int cros_ec_decode_region(int argc, char * const argv[]) 30a2558e87SMoritz Fischer { 31a2558e87SMoritz Fischer if (argc > 0) { 32a2558e87SMoritz Fischer if (0 == strcmp(*argv, "rw")) 33a2558e87SMoritz Fischer return EC_FLASH_REGION_RW; 34a2558e87SMoritz Fischer else if (0 == strcmp(*argv, "ro")) 35a2558e87SMoritz Fischer return EC_FLASH_REGION_RO; 36a2558e87SMoritz Fischer 37a2558e87SMoritz Fischer debug("%s: Invalid region '%s'\n", __func__, *argv); 38a2558e87SMoritz Fischer } else { 39a2558e87SMoritz Fischer debug("%s: Missing region parameter\n", __func__); 40a2558e87SMoritz Fischer } 41a2558e87SMoritz Fischer 42a2558e87SMoritz Fischer return -1; 43a2558e87SMoritz Fischer } 44a2558e87SMoritz Fischer 45a2558e87SMoritz Fischer /** 46bfeba017SMoritz Fischer * Perform a flash read or write command 47bfeba017SMoritz Fischer * 48bfeba017SMoritz Fischer * @param dev CROS-EC device to read/write 49bfeba017SMoritz Fischer * @param is_write 1 do to a write, 0 to do a read 50bfeba017SMoritz Fischer * @param argc Number of arguments 51bfeba017SMoritz Fischer * @param argv Arguments (2 is region, 3 is address) 52bfeba017SMoritz Fischer * @return 0 for ok, 1 for a usage error or -ve for ec command error 53bfeba017SMoritz Fischer * (negative EC_RES_...) 54bfeba017SMoritz Fischer */ 55bfeba017SMoritz Fischer static int do_read_write(struct cros_ec_dev *dev, int is_write, int argc, 56bfeba017SMoritz Fischer char * const argv[]) 57bfeba017SMoritz Fischer { 58bfeba017SMoritz Fischer uint32_t offset, size = -1U, region_size; 59bfeba017SMoritz Fischer unsigned long addr; 60bfeba017SMoritz Fischer char *endp; 61bfeba017SMoritz Fischer int region; 62bfeba017SMoritz Fischer int ret; 63bfeba017SMoritz Fischer 64bfeba017SMoritz Fischer region = cros_ec_decode_region(argc - 2, argv + 2); 65bfeba017SMoritz Fischer if (region == -1) 66bfeba017SMoritz Fischer return 1; 67bfeba017SMoritz Fischer if (argc < 4) 68bfeba017SMoritz Fischer return 1; 69bfeba017SMoritz Fischer addr = simple_strtoul(argv[3], &endp, 16); 70bfeba017SMoritz Fischer if (*argv[3] == 0 || *endp != 0) 71bfeba017SMoritz Fischer return 1; 72bfeba017SMoritz Fischer if (argc > 4) { 73bfeba017SMoritz Fischer size = simple_strtoul(argv[4], &endp, 16); 74bfeba017SMoritz Fischer if (*argv[4] == 0 || *endp != 0) 75bfeba017SMoritz Fischer return 1; 76bfeba017SMoritz Fischer } 77bfeba017SMoritz Fischer 78bfeba017SMoritz Fischer ret = cros_ec_flash_offset(dev, region, &offset, ®ion_size); 79bfeba017SMoritz Fischer if (ret) { 80bfeba017SMoritz Fischer debug("%s: Could not read region info\n", __func__); 81bfeba017SMoritz Fischer return ret; 82bfeba017SMoritz Fischer } 83bfeba017SMoritz Fischer if (size == -1U) 84bfeba017SMoritz Fischer size = region_size; 85bfeba017SMoritz Fischer 86bfeba017SMoritz Fischer ret = is_write ? 87bfeba017SMoritz Fischer cros_ec_flash_write(dev, (uint8_t *)addr, offset, size) : 88bfeba017SMoritz Fischer cros_ec_flash_read(dev, (uint8_t *)addr, offset, size); 89bfeba017SMoritz Fischer if (ret) { 90bfeba017SMoritz Fischer debug("%s: Could not %s region\n", __func__, 91bfeba017SMoritz Fischer is_write ? "write" : "read"); 92bfeba017SMoritz Fischer return ret; 93bfeba017SMoritz Fischer } 94bfeba017SMoritz Fischer 95bfeba017SMoritz Fischer return 0; 96bfeba017SMoritz Fischer } 97bfeba017SMoritz Fischer 98bfeba017SMoritz Fischer static int do_cros_ec(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 99bfeba017SMoritz Fischer { 100bfeba017SMoritz Fischer struct cros_ec_dev *dev; 101bfeba017SMoritz Fischer struct udevice *udev; 102bfeba017SMoritz Fischer const char *cmd; 103bfeba017SMoritz Fischer int ret = 0; 104bfeba017SMoritz Fischer 105bfeba017SMoritz Fischer if (argc < 2) 106bfeba017SMoritz Fischer return CMD_RET_USAGE; 107bfeba017SMoritz Fischer 108bfeba017SMoritz Fischer cmd = argv[1]; 109bfeba017SMoritz Fischer if (0 == strcmp("init", cmd)) { 110bfeba017SMoritz Fischer /* Remove any existing device */ 111bfeba017SMoritz Fischer ret = uclass_find_device(UCLASS_CROS_EC, 0, &udev); 112bfeba017SMoritz Fischer if (!ret) 113*706865afSStefan Roese device_remove(udev, DM_REMOVE_NORMAL); 114bfeba017SMoritz Fischer ret = uclass_get_device(UCLASS_CROS_EC, 0, &udev); 115bfeba017SMoritz Fischer if (ret) { 116bfeba017SMoritz Fischer printf("Could not init cros_ec device (err %d)\n", ret); 117bfeba017SMoritz Fischer return 1; 118bfeba017SMoritz Fischer } 119bfeba017SMoritz Fischer return 0; 120bfeba017SMoritz Fischer } 121bfeba017SMoritz Fischer 122bfeba017SMoritz Fischer ret = uclass_get_device(UCLASS_CROS_EC, 0, &udev); 123bfeba017SMoritz Fischer if (ret) { 124bfeba017SMoritz Fischer printf("Cannot get cros-ec device (err=%d)\n", ret); 125bfeba017SMoritz Fischer return 1; 126bfeba017SMoritz Fischer } 127bfeba017SMoritz Fischer dev = dev_get_uclass_priv(udev); 128bfeba017SMoritz Fischer if (0 == strcmp("id", cmd)) { 129bfeba017SMoritz Fischer char id[MSG_BYTES]; 130bfeba017SMoritz Fischer 131bfeba017SMoritz Fischer if (cros_ec_read_id(dev, id, sizeof(id))) { 132bfeba017SMoritz Fischer debug("%s: Could not read KBC ID\n", __func__); 133bfeba017SMoritz Fischer return 1; 134bfeba017SMoritz Fischer } 135bfeba017SMoritz Fischer printf("%s\n", id); 136bfeba017SMoritz Fischer } else if (0 == strcmp("info", cmd)) { 137bfeba017SMoritz Fischer struct ec_response_mkbp_info info; 138bfeba017SMoritz Fischer 139bfeba017SMoritz Fischer if (cros_ec_info(dev, &info)) { 140bfeba017SMoritz Fischer debug("%s: Could not read KBC info\n", __func__); 141bfeba017SMoritz Fischer return 1; 142bfeba017SMoritz Fischer } 143bfeba017SMoritz Fischer printf("rows = %u\n", info.rows); 144bfeba017SMoritz Fischer printf("cols = %u\n", info.cols); 145bfeba017SMoritz Fischer printf("switches = %#x\n", info.switches); 146bfeba017SMoritz Fischer } else if (0 == strcmp("curimage", cmd)) { 147bfeba017SMoritz Fischer enum ec_current_image image; 148bfeba017SMoritz Fischer 149bfeba017SMoritz Fischer if (cros_ec_read_current_image(dev, &image)) { 150bfeba017SMoritz Fischer debug("%s: Could not read KBC image\n", __func__); 151bfeba017SMoritz Fischer return 1; 152bfeba017SMoritz Fischer } 153bfeba017SMoritz Fischer printf("%d\n", image); 154bfeba017SMoritz Fischer } else if (0 == strcmp("hash", cmd)) { 155bfeba017SMoritz Fischer struct ec_response_vboot_hash hash; 156bfeba017SMoritz Fischer int i; 157bfeba017SMoritz Fischer 158bfeba017SMoritz Fischer if (cros_ec_read_hash(dev, &hash)) { 159bfeba017SMoritz Fischer debug("%s: Could not read KBC hash\n", __func__); 160bfeba017SMoritz Fischer return 1; 161bfeba017SMoritz Fischer } 162bfeba017SMoritz Fischer 163bfeba017SMoritz Fischer if (hash.hash_type == EC_VBOOT_HASH_TYPE_SHA256) 164bfeba017SMoritz Fischer printf("type: SHA-256\n"); 165bfeba017SMoritz Fischer else 166bfeba017SMoritz Fischer printf("type: %d\n", hash.hash_type); 167bfeba017SMoritz Fischer 168bfeba017SMoritz Fischer printf("offset: 0x%08x\n", hash.offset); 169bfeba017SMoritz Fischer printf("size: 0x%08x\n", hash.size); 170bfeba017SMoritz Fischer 171bfeba017SMoritz Fischer printf("digest: "); 172bfeba017SMoritz Fischer for (i = 0; i < hash.digest_size; i++) 173bfeba017SMoritz Fischer printf("%02x", hash.hash_digest[i]); 174bfeba017SMoritz Fischer printf("\n"); 175bfeba017SMoritz Fischer } else if (0 == strcmp("reboot", cmd)) { 176bfeba017SMoritz Fischer int region; 177bfeba017SMoritz Fischer enum ec_reboot_cmd cmd; 178bfeba017SMoritz Fischer 179bfeba017SMoritz Fischer if (argc >= 3 && !strcmp(argv[2], "cold")) { 180bfeba017SMoritz Fischer cmd = EC_REBOOT_COLD; 181bfeba017SMoritz Fischer } else { 182bfeba017SMoritz Fischer region = cros_ec_decode_region(argc - 2, argv + 2); 183bfeba017SMoritz Fischer if (region == EC_FLASH_REGION_RO) 184bfeba017SMoritz Fischer cmd = EC_REBOOT_JUMP_RO; 185bfeba017SMoritz Fischer else if (region == EC_FLASH_REGION_RW) 186bfeba017SMoritz Fischer cmd = EC_REBOOT_JUMP_RW; 187bfeba017SMoritz Fischer else 188bfeba017SMoritz Fischer return CMD_RET_USAGE; 189bfeba017SMoritz Fischer } 190bfeba017SMoritz Fischer 191bfeba017SMoritz Fischer if (cros_ec_reboot(dev, cmd, 0)) { 192bfeba017SMoritz Fischer debug("%s: Could not reboot KBC\n", __func__); 193bfeba017SMoritz Fischer return 1; 194bfeba017SMoritz Fischer } 195bfeba017SMoritz Fischer } else if (0 == strcmp("events", cmd)) { 196bfeba017SMoritz Fischer uint32_t events; 197bfeba017SMoritz Fischer 198bfeba017SMoritz Fischer if (cros_ec_get_host_events(dev, &events)) { 199bfeba017SMoritz Fischer debug("%s: Could not read host events\n", __func__); 200bfeba017SMoritz Fischer return 1; 201bfeba017SMoritz Fischer } 202bfeba017SMoritz Fischer printf("0x%08x\n", events); 203bfeba017SMoritz Fischer } else if (0 == strcmp("clrevents", cmd)) { 204bfeba017SMoritz Fischer uint32_t events = 0x7fffffff; 205bfeba017SMoritz Fischer 206bfeba017SMoritz Fischer if (argc >= 3) 207bfeba017SMoritz Fischer events = simple_strtol(argv[2], NULL, 0); 208bfeba017SMoritz Fischer 209bfeba017SMoritz Fischer if (cros_ec_clear_host_events(dev, events)) { 210bfeba017SMoritz Fischer debug("%s: Could not clear host events\n", __func__); 211bfeba017SMoritz Fischer return 1; 212bfeba017SMoritz Fischer } 213bfeba017SMoritz Fischer } else if (0 == strcmp("read", cmd)) { 214bfeba017SMoritz Fischer ret = do_read_write(dev, 0, argc, argv); 215bfeba017SMoritz Fischer if (ret > 0) 216bfeba017SMoritz Fischer return CMD_RET_USAGE; 217bfeba017SMoritz Fischer } else if (0 == strcmp("write", cmd)) { 218bfeba017SMoritz Fischer ret = do_read_write(dev, 1, argc, argv); 219bfeba017SMoritz Fischer if (ret > 0) 220bfeba017SMoritz Fischer return CMD_RET_USAGE; 221bfeba017SMoritz Fischer } else if (0 == strcmp("erase", cmd)) { 222bfeba017SMoritz Fischer int region = cros_ec_decode_region(argc - 2, argv + 2); 223bfeba017SMoritz Fischer uint32_t offset, size; 224bfeba017SMoritz Fischer 225bfeba017SMoritz Fischer if (region == -1) 226bfeba017SMoritz Fischer return CMD_RET_USAGE; 227bfeba017SMoritz Fischer if (cros_ec_flash_offset(dev, region, &offset, &size)) { 228bfeba017SMoritz Fischer debug("%s: Could not read region info\n", __func__); 229bfeba017SMoritz Fischer ret = -1; 230bfeba017SMoritz Fischer } else { 231bfeba017SMoritz Fischer ret = cros_ec_flash_erase(dev, offset, size); 232bfeba017SMoritz Fischer if (ret) { 233bfeba017SMoritz Fischer debug("%s: Could not erase region\n", 234bfeba017SMoritz Fischer __func__); 235bfeba017SMoritz Fischer } 236bfeba017SMoritz Fischer } 237bfeba017SMoritz Fischer } else if (0 == strcmp("regioninfo", cmd)) { 238bfeba017SMoritz Fischer int region = cros_ec_decode_region(argc - 2, argv + 2); 239bfeba017SMoritz Fischer uint32_t offset, size; 240bfeba017SMoritz Fischer 241bfeba017SMoritz Fischer if (region == -1) 242bfeba017SMoritz Fischer return CMD_RET_USAGE; 243bfeba017SMoritz Fischer ret = cros_ec_flash_offset(dev, region, &offset, &size); 244bfeba017SMoritz Fischer if (ret) { 245bfeba017SMoritz Fischer debug("%s: Could not read region info\n", __func__); 246bfeba017SMoritz Fischer } else { 247bfeba017SMoritz Fischer printf("Region: %s\n", region == EC_FLASH_REGION_RO ? 248bfeba017SMoritz Fischer "RO" : "RW"); 249bfeba017SMoritz Fischer printf("Offset: %x\n", offset); 250bfeba017SMoritz Fischer printf("Size: %x\n", size); 251bfeba017SMoritz Fischer } 252bfeba017SMoritz Fischer } else if (0 == strcmp("flashinfo", cmd)) { 253bfeba017SMoritz Fischer struct ec_response_flash_info p; 254bfeba017SMoritz Fischer 255bfeba017SMoritz Fischer ret = cros_ec_read_flashinfo(dev, &p); 256bfeba017SMoritz Fischer if (!ret) { 257bfeba017SMoritz Fischer printf("Flash size: %u\n", p.flash_size); 258bfeba017SMoritz Fischer printf("Write block size: %u\n", p.write_block_size); 259bfeba017SMoritz Fischer printf("Erase block size: %u\n", p.erase_block_size); 260bfeba017SMoritz Fischer } 261bfeba017SMoritz Fischer } else if (0 == strcmp("vbnvcontext", cmd)) { 262bfeba017SMoritz Fischer uint8_t block[EC_VBNV_BLOCK_SIZE]; 263bfeba017SMoritz Fischer char buf[3]; 264bfeba017SMoritz Fischer int i, len; 265bfeba017SMoritz Fischer unsigned long result; 266bfeba017SMoritz Fischer 267bfeba017SMoritz Fischer if (argc <= 2) { 268bfeba017SMoritz Fischer ret = cros_ec_read_vbnvcontext(dev, block); 269bfeba017SMoritz Fischer if (!ret) { 270bfeba017SMoritz Fischer printf("vbnv_block: "); 271bfeba017SMoritz Fischer for (i = 0; i < EC_VBNV_BLOCK_SIZE; i++) 272bfeba017SMoritz Fischer printf("%02x", block[i]); 273bfeba017SMoritz Fischer putc('\n'); 274bfeba017SMoritz Fischer } 275bfeba017SMoritz Fischer } else { 276bfeba017SMoritz Fischer /* 277bfeba017SMoritz Fischer * TODO(clchiou): Move this to a utility function as 278bfeba017SMoritz Fischer * cmd_spi might want to call it. 279bfeba017SMoritz Fischer */ 280bfeba017SMoritz Fischer memset(block, 0, EC_VBNV_BLOCK_SIZE); 281bfeba017SMoritz Fischer len = strlen(argv[2]); 282bfeba017SMoritz Fischer buf[2] = '\0'; 283bfeba017SMoritz Fischer for (i = 0; i < EC_VBNV_BLOCK_SIZE; i++) { 284bfeba017SMoritz Fischer if (i * 2 >= len) 285bfeba017SMoritz Fischer break; 286bfeba017SMoritz Fischer buf[0] = argv[2][i * 2]; 287bfeba017SMoritz Fischer if (i * 2 + 1 >= len) 288bfeba017SMoritz Fischer buf[1] = '0'; 289bfeba017SMoritz Fischer else 290bfeba017SMoritz Fischer buf[1] = argv[2][i * 2 + 1]; 291bfeba017SMoritz Fischer strict_strtoul(buf, 16, &result); 292bfeba017SMoritz Fischer block[i] = result; 293bfeba017SMoritz Fischer } 294bfeba017SMoritz Fischer ret = cros_ec_write_vbnvcontext(dev, block); 295bfeba017SMoritz Fischer } 296bfeba017SMoritz Fischer if (ret) { 297bfeba017SMoritz Fischer debug("%s: Could not %s VbNvContext\n", __func__, 298bfeba017SMoritz Fischer argc <= 2 ? "read" : "write"); 299bfeba017SMoritz Fischer } 300bfeba017SMoritz Fischer } else if (0 == strcmp("test", cmd)) { 301bfeba017SMoritz Fischer int result = cros_ec_test(dev); 302bfeba017SMoritz Fischer 303bfeba017SMoritz Fischer if (result) 304bfeba017SMoritz Fischer printf("Test failed with error %d\n", result); 305bfeba017SMoritz Fischer else 306bfeba017SMoritz Fischer puts("Test passed\n"); 307bfeba017SMoritz Fischer } else if (0 == strcmp("version", cmd)) { 308bfeba017SMoritz Fischer struct ec_response_get_version *p; 309bfeba017SMoritz Fischer char *build_string; 310bfeba017SMoritz Fischer 311bfeba017SMoritz Fischer ret = cros_ec_read_version(dev, &p); 312bfeba017SMoritz Fischer if (!ret) { 313bfeba017SMoritz Fischer /* Print versions */ 314bfeba017SMoritz Fischer printf("RO version: %1.*s\n", 315bfeba017SMoritz Fischer (int)sizeof(p->version_string_ro), 316bfeba017SMoritz Fischer p->version_string_ro); 317bfeba017SMoritz Fischer printf("RW version: %1.*s\n", 318bfeba017SMoritz Fischer (int)sizeof(p->version_string_rw), 319bfeba017SMoritz Fischer p->version_string_rw); 320bfeba017SMoritz Fischer printf("Firmware copy: %s\n", 321bfeba017SMoritz Fischer (p->current_image < 322bfeba017SMoritz Fischer ARRAY_SIZE(ec_current_image_name) ? 323bfeba017SMoritz Fischer ec_current_image_name[p->current_image] : 324bfeba017SMoritz Fischer "?")); 325bfeba017SMoritz Fischer ret = cros_ec_read_build_info(dev, &build_string); 326bfeba017SMoritz Fischer if (!ret) 327bfeba017SMoritz Fischer printf("Build info: %s\n", build_string); 328bfeba017SMoritz Fischer } 329bfeba017SMoritz Fischer } else if (0 == strcmp("ldo", cmd)) { 330bfeba017SMoritz Fischer uint8_t index, state; 331bfeba017SMoritz Fischer char *endp; 332bfeba017SMoritz Fischer 333bfeba017SMoritz Fischer if (argc < 3) 334bfeba017SMoritz Fischer return CMD_RET_USAGE; 335bfeba017SMoritz Fischer index = simple_strtoul(argv[2], &endp, 10); 336bfeba017SMoritz Fischer if (*argv[2] == 0 || *endp != 0) 337bfeba017SMoritz Fischer return CMD_RET_USAGE; 338bfeba017SMoritz Fischer if (argc > 3) { 339bfeba017SMoritz Fischer state = simple_strtoul(argv[3], &endp, 10); 340bfeba017SMoritz Fischer if (*argv[3] == 0 || *endp != 0) 341bfeba017SMoritz Fischer return CMD_RET_USAGE; 342bfeba017SMoritz Fischer ret = cros_ec_set_ldo(udev, index, state); 343bfeba017SMoritz Fischer } else { 344bfeba017SMoritz Fischer ret = cros_ec_get_ldo(udev, index, &state); 345bfeba017SMoritz Fischer if (!ret) { 346bfeba017SMoritz Fischer printf("LDO%d: %s\n", index, 347bfeba017SMoritz Fischer state == EC_LDO_STATE_ON ? 348bfeba017SMoritz Fischer "on" : "off"); 349bfeba017SMoritz Fischer } 350bfeba017SMoritz Fischer } 351bfeba017SMoritz Fischer 352bfeba017SMoritz Fischer if (ret) { 353bfeba017SMoritz Fischer debug("%s: Could not access LDO%d\n", __func__, index); 354bfeba017SMoritz Fischer return ret; 355bfeba017SMoritz Fischer } 356bfeba017SMoritz Fischer } else { 357bfeba017SMoritz Fischer return CMD_RET_USAGE; 358bfeba017SMoritz Fischer } 359bfeba017SMoritz Fischer 360bfeba017SMoritz Fischer if (ret < 0) { 361bfeba017SMoritz Fischer printf("Error: CROS-EC command failed (error %d)\n", ret); 362bfeba017SMoritz Fischer ret = 1; 363bfeba017SMoritz Fischer } 364bfeba017SMoritz Fischer 365bfeba017SMoritz Fischer return ret; 366bfeba017SMoritz Fischer } 367bfeba017SMoritz Fischer 368bfeba017SMoritz Fischer U_BOOT_CMD( 369bfeba017SMoritz Fischer crosec, 6, 1, do_cros_ec, 370bfeba017SMoritz Fischer "CROS-EC utility command", 371bfeba017SMoritz Fischer "init Re-init CROS-EC (done on startup automatically)\n" 372bfeba017SMoritz Fischer "crosec id Read CROS-EC ID\n" 373bfeba017SMoritz Fischer "crosec info Read CROS-EC info\n" 374bfeba017SMoritz Fischer "crosec curimage Read CROS-EC current image\n" 375bfeba017SMoritz Fischer "crosec hash Read CROS-EC hash\n" 376bfeba017SMoritz Fischer "crosec reboot [rw | ro | cold] Reboot CROS-EC\n" 377bfeba017SMoritz Fischer "crosec events Read CROS-EC host events\n" 378bfeba017SMoritz Fischer "crosec clrevents [mask] Clear CROS-EC host events\n" 379bfeba017SMoritz Fischer "crosec regioninfo <ro|rw> Read image info\n" 380bfeba017SMoritz Fischer "crosec flashinfo Read flash info\n" 381bfeba017SMoritz Fischer "crosec erase <ro|rw> Erase EC image\n" 382bfeba017SMoritz Fischer "crosec read <ro|rw> <addr> [<size>] Read EC image\n" 383bfeba017SMoritz Fischer "crosec write <ro|rw> <addr> [<size>] Write EC image\n" 384bfeba017SMoritz Fischer "crosec vbnvcontext [hexstring] Read [write] VbNvContext from EC\n" 385bfeba017SMoritz Fischer "crosec ldo <idx> [<state>] Switch/Read LDO state\n" 386bfeba017SMoritz Fischer "crosec test run tests on cros_ec\n" 387bfeba017SMoritz Fischer "crosec version Read CROS-EC version" 388bfeba017SMoritz Fischer ); 389