summaryrefslogtreecommitdiff
path: root/host
diff options
context:
space:
mode:
Diffstat (limited to 'host')
-rw-r--r--host/lib/flashrom_drv.c92
-rw-r--r--host/lib/include/flashrom.h25
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,
+ &params);
+
+ 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, &params);
+
+ 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);