Dmitry Zhadinets has uploaded this change for review. ( https://review.coreboot.org/c/flashrom/+/87251?usp=email )
Change subject: libflashrom: Add API for capabilitible chips ......................................................................
libflashrom: Add API for capabilitible chips
There were no options available to obtain the list of compatible chips for the programmer. The implementation is based on flashrom_supported_flash_chips and flashrom_flash_probe. Arrays of constant strings are returned, and the array must be freed using flashrom_data_free.
Testing: Both unit tests and CLI tools serve as libflashrom clients. All unit tests run successfully. Tests are moved because there is a bug in spi test. It does not clean everything. WIP
Change-Id: Id33fac2935b4098586526bda87b25231c9a6ab39 Signed-off-by: Dmitry Zhadinets dzhadinets@gmail.com --- M include/libflashrom.h M libflashrom.c M libflashrom.map M tests/libflashrom.c M tests/tests.c M tests/tests.h 6 files changed, 66 insertions(+), 9 deletions(-)
git pull ssh://review.coreboot.org:29418/flashrom refs/changes/51/87251/1
diff --git a/include/libflashrom.h b/include/libflashrom.h index f30ad6b..fc56251 100644 --- a/include/libflashrom.h +++ b/include/libflashrom.h @@ -261,6 +261,16 @@ */
/** + * @brief Returns list of supported chip names for selected programmer + * + * @param[in] flashprog The flash programmer used to access the chip. + * + * @return List of supported flash chips, or NULL if an error occurred. + * The pointer must be freed after using flashrom_data_free + */ +const char **flashrom_programmer_capabilities(const struct flashrom_programmer *const flashprog); + +/** * @brief Probe for a flash chip. * * Probes for a flash chip and returns a flash context, that can be used diff --git a/libflashrom.c b/libflashrom.c index d6bd098..4b0e34b 100644 --- a/libflashrom.c +++ b/libflashrom.c @@ -329,7 +329,31 @@ return programmer_shutdown(); }
-/* TODO: flashrom_programmer_capabilities()? */ +const char **flashrom_programmer_capabilities(const struct flashrom_programmer *const flashprog) +{ + (void) flashprog; /* unused */ + unsigned int chipcount = 0; + const char **result = malloc((flashchips_size + 1) * sizeof(char*)); + + struct flashrom_flashctx flashctx = { 0 }; + for (int j = 0; j < registered_master_count; j++) { + int startchip = 0; + + while (chipcount < flashchips_size) { + startchip = probe_flash(®istered_masters[j], startchip, &flashctx, 0, NULL); + if (startchip == -1) + break; + result[chipcount] = flashctx.chip->name; + chipcount++; + startchip++; + flashrom_layout_release(flashctx.default_layout); + free(flashctx.chip); + } + } + result = realloc(result, (chipcount + 1) * sizeof(char*)); + result[chipcount] = 0; + return result; +}
int flashrom_flash_probe(struct flashrom_flashctx **const flashctx, const struct flashrom_programmer *const flashprog, diff --git a/libflashrom.map b/libflashrom.map index fc6724a..c0b6933 100644 --- a/libflashrom.map +++ b/libflashrom.map @@ -21,6 +21,7 @@ flashrom_layout_read_from_ifd; flashrom_layout_release; flashrom_layout_set; + flashrom_programmer_capabilities; flashrom_programmer_init; flashrom_programmer_shutdown; flashrom_set_log_callback; diff --git a/tests/libflashrom.c b/tests/libflashrom.c index 59ffeaf..9f44217 100644 --- a/tests/libflashrom.c +++ b/tests/libflashrom.c @@ -114,3 +114,23 @@
assert_int_not_equal(ptr - array, 0); } + +void flashrom_programmer_capabilities_test_success(void **state) +{ + struct flashrom_programmer *flashprog = NULL; + const char **array; + const char **ptr; + + flashrom_programmer_init(&flashprog, "dummy", + "emulate=SST25VF040.REMS"); + array = flashrom_programmer_capabilities(flashprog); + ptr = array; + assert_non_null(array); + + while (*(ptr++)) {} + flashrom_data_free(array); + + assert_int_equal(ptr - array, 2); + + flashrom_programmer_shutdown(flashprog); +} diff --git a/tests/tests.c b/tests/tests.c index 2a79d32..562fdae 100644 --- a/tests/tests.c +++ b/tests/tests.c @@ -478,14 +478,6 @@ }; ret |= cmocka_run_group_tests_name("flashrom.c tests", flashrom_tests, NULL, NULL);
- const struct CMUnitTest libflashrom_tests[] = { - cmocka_unit_test(flashrom_set_log_callback_test_success), - cmocka_unit_test(flashrom_set_log_callback_v2_test_success), - cmocka_unit_test(flashrom_set_log_level_test_success), - cmocka_unit_test(flashrom_supported_programmers_test_success), - }; - ret |= cmocka_run_group_tests_name("libflashrom.c tests", libflashrom_tests, NULL, NULL); - const struct CMUnitTest spi25_tests[] = { cmocka_unit_test(spi_write_enable_test_success), cmocka_unit_test(spi_write_disable_test_success), @@ -501,6 +493,15 @@ }; ret |= cmocka_run_group_tests_name("spi25.c tests", spi25_tests, NULL, NULL);
+ const struct CMUnitTest libflashrom_tests[] = { + cmocka_unit_test(flashrom_set_log_callback_test_success), + cmocka_unit_test(flashrom_set_log_callback_v2_test_success), + cmocka_unit_test(flashrom_set_log_level_test_success), + cmocka_unit_test(flashrom_supported_programmers_test_success), + cmocka_unit_test(flashrom_programmer_capabilities_test_success), + }; + ret |= cmocka_run_group_tests_name("libflashrom.c tests", libflashrom_tests, NULL, NULL); + const struct CMUnitTest lifecycle_tests[] = { cmocka_unit_test(dummy_basic_lifecycle_test_success), cmocka_unit_test(dummy_probe_lifecycle_test_success), diff --git a/tests/tests.h b/tests/tests.h index e87c00c..3d715e8 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -36,6 +36,7 @@ void flashrom_set_log_callback_v2_test_success(void **state); void flashrom_set_log_level_test_success(void **state); void flashrom_supported_programmers_test_success(void **state); +void flashrom_programmer_capabilities_test_success(void **state);
/* spi25.c */ void spi_write_enable_test_success(void **state);