diff options
Diffstat (limited to 'host')
-rw-r--r-- | host/lib/flashrom_drv.c | 92 | ||||
-rw-r--r-- | host/lib/include/flashrom.h | 25 |
2 files changed, 117 insertions, 0 deletions
diff --git a/host/lib/flashrom_drv.c b/host/lib/flashrom_drv.c index 09e7f468..6eb0de8d 100644 --- a/host/lib/flashrom_drv.c +++ b/host/lib/flashrom_drv.c @@ -311,3 +311,95 @@ err_init: return ret; } + +int flashrom_set_wp(const char *prog_with_params, bool wp_mode, + uint32_t wp_start, uint32_t wp_len, int verbosity) +{ + int ret = 1; + + g_verbose_screen = (verbosity == -1) ? FLASHROM_MSG_INFO : verbosity; + + struct flashrom_programmer *prog = NULL; + struct flashrom_flashctx *flashctx = NULL; + + struct flashrom_wp_cfg *cfg = NULL; + + char *programmer, *params; + char *tmp = flashrom_extract_params(prog_with_params, &programmer, + ¶ms); + + flashrom_set_log_callback((flashrom_log_callback *)&flashrom_print_cb); + + if (flashrom_init(1) + || flashrom_programmer_init(&prog, programmer, params)) + goto err_init; + + if (flashrom_flash_probe(&flashctx, prog, NULL)) + goto err_probe; + + if (flashrom_wp_cfg_new(&cfg) != FLASHROM_WP_OK) + goto err_cleanup; + + enum flashrom_wp_mode mode = wp_mode ? + FLASHROM_WP_MODE_HARDWARE : FLASHROM_WP_MODE_DISABLED; + flashrom_wp_set_mode(cfg, mode); + flashrom_wp_set_range(cfg, wp_start, wp_len); + + if (flashrom_wp_write_cfg(flashctx, cfg) != FLASHROM_WP_OK) + goto err_write_cfg; + + ret = 0; + +err_write_cfg: + flashrom_wp_cfg_release(cfg); + +err_cleanup: + flashrom_flash_release(flashctx); + +err_probe: + if (flashrom_programmer_shutdown(prog)) + ret = 1; + +err_init: + free(tmp); + + return ret; +} + +int flashrom_get_size(const char *prog_with_params, + uint32_t *flash_len, int verbosity) +{ + int r = 0; + + g_verbose_screen = (verbosity == -1) ? FLASHROM_MSG_INFO : verbosity; + + char *programmer, *params; + char *tmp = flashrom_extract_params(prog_with_params, + &programmer, ¶ms); + + struct flashrom_programmer *prog = NULL; + struct flashrom_flashctx *flashctx = NULL; + + flashrom_set_log_callback((flashrom_log_callback *)&flashrom_print_cb); + + if (flashrom_init(1) || + flashrom_programmer_init(&prog, programmer, params)) { + r = -1; + goto err_init; + } + if (flashrom_flash_probe(&flashctx, prog, NULL)) { + r = -1; + goto err_probe; + } + + *flash_len = flashrom_flash_getsize(flashctx); + + flashrom_flash_release(flashctx); + +err_probe: + r |= flashrom_programmer_shutdown(prog); + +err_init: + free(tmp); + return r; +} diff --git a/host/lib/include/flashrom.h b/host/lib/include/flashrom.h index 5fb7a03c..4b61d199 100644 --- a/host/lib/include/flashrom.h +++ b/host/lib/include/flashrom.h @@ -88,3 +88,28 @@ int flashrom_write_image(const struct firmware_image *image, */ int flashrom_get_wp(const char *programmer, bool *wp_mode, uint32_t *wp_start, uint32_t *wp_len, int verbosity); + +/** + * Set wp state using flashrom. + * + * @param programmer The name of the programmer to use for writing the + * writeprotect state. + * @param wp_mode WP mode to set. true to enable, false disable WP. + * @param wp_start WP start addr to set + * @param wp_len WP region length set + * + * @return 0 on success, or a relevant error. + */ +int flashrom_set_wp(const char *programmer, bool wp_mode, + uint32_t wp_start, uint32_t wp_len, int verbosity); + +/** + * Get flash size using flashrom. + * + * @param programmer The name of the programmer to use. + * @param flash_len Pointer to a uint32_t to store chip length. + * + * @return 0 on success, or a relevant error. + */ +int flashrom_get_size(const char *programmer, uint32_t *flash_len, + int verbosity); |