Dmitry Zhadinets has uploaded this change for review.

View Change

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(&registered_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);

To view, visit change 87251. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: newchange
Gerrit-Project: flashrom
Gerrit-Branch: main
Gerrit-Change-Id: Id33fac2935b4098586526bda87b25231c9a6ab39
Gerrit-Change-Number: 87251
Gerrit-PatchSet: 1
Gerrit-Owner: Dmitry Zhadinets <dzhadinets@gmail.com>