int cros_ec_decode_ec_flash(struct udevice *dev, struct fdt_cros_ec *config) { ofnode flash_node, node; flash_node = dev_read_subnode(dev, "flash"); if (!ofnode_valid(flash_node)) { debug("Failed to find flash node\n"); return -1; } if (ofnode_read_fmap_entry(flash_node, &config->flash)) { debug("Failed to decode flash node in chrome-ec\n"); return -1; } config->flash_erase_value = ofnode_read_s32_default(flash_node, "erase-value", -1); ofnode_for_each_subnode(node, flash_node) { const char *name = ofnode_get_name(node); enum ec_flash_region region; if (0 == strcmp(name, "ro")) { region = EC_FLASH_REGION_RO; } else if (0 == strcmp(name, "rw")) { region = EC_FLASH_REGION_ACTIVE; } else if (0 == strcmp(name, "wp-ro")) { region = EC_FLASH_REGION_WP_RO; } else { debug("Unknown EC flash region name '%s'\n", name); return -1; } if (ofnode_read_fmap_entry(node, &config->region[region])) { debug("Failed to decode flash region in chrome-ec'\n"); return -1; } } return 0; }
int ofnode_read_fmap_entry(ofnode node, struct fmap_entry *entry) { const char *prop; u32 reg[2]; if (ofnode_read_u32_array(node, "reg", reg, 2)) { debug("Node '%s' has bad/missing 'reg' property\n", ofnode_get_name(node)); return -log_ret(ENOENT); } entry->offset = reg[0]; entry->length = reg[1]; entry->used = ofnode_read_s32_default(node, "used", entry->length); prop = ofnode_read_string(node, "compress"); entry->compress_algo = prop && !strcmp(prop, "lzo") ? FMAP_COMPRESS_LZO : FMAP_COMPRESS_NONE; prop = ofnode_read_string(node, "hash"); if (prop) entry->hash_size = strlen(prop); entry->hash_algo = prop ? FMAP_HASH_SHA256 : FMAP_HASH_NONE; entry->hash = (uint8_t *)prop; return 0; }