diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/2lib/2stub.c | 13 | ||||
-rw-r--r-- | firmware/2lib/2ui_screens.c | 154 | ||||
-rw-r--r-- | firmware/2lib/include/2api.h | 28 | ||||
-rw-r--r-- | firmware/2lib/include/2ui.h | 2 |
4 files changed, 195 insertions, 2 deletions
diff --git a/firmware/2lib/2stub.c b/firmware/2lib/2stub.c index f7b15ce5..7cec2e5d 100644 --- a/firmware/2lib/2stub.c +++ b/firmware/2lib/2stub.c @@ -194,6 +194,19 @@ vb2_error_t vb2ex_diag_get_storage_health(const char **out) } __attribute__((weak)) +vb2_error_t vb2ex_diag_get_storage_test_log(const char **out) +{ + *out = "mock"; + return VB2_SUCCESS; +} + +__attribute__((weak)) +vb2_error_t vb2ex_diag_storage_test_control(enum vb2_diag_storage_test ops) +{ + return VB2_SUCCESS; +} + +__attribute__((weak)) vb2_error_t vb2ex_diag_memory_quick_test(int reset, const char **out) { *out = "mock"; diff --git a/firmware/2lib/2ui_screens.c b/firmware/2lib/2ui_screens.c index 4f00fd5e..e3d7067e 100644 --- a/firmware/2lib/2ui_screens.c +++ b/firmware/2lib/2ui_screens.c @@ -1034,12 +1034,38 @@ static const struct vb2_screen_info developer_select_bootloader_screen = { /******************************************************************************/ /* VB2_SCREEN_DIAGNOSTICS */ +#define DIAGNOSTICS_ITEM_STORAGE_HEALTH 1 +#define DIAGNOSTICS_ITEM_STORAGE_TEST_SHORT 2 +#define DIAGNOSTICS_ITEM_STORAGE_TEST_EXTENDED 3 + +static vb2_error_t diagnostics_init(struct vb2_ui_context *ui) +{ + const char *unused_log_string; + vb2_error_t rv = vb2ex_diag_get_storage_test_log(&unused_log_string); + if (rv == VB2_ERROR_EX_UNIMPLEMENTED) { + VB2_SET_BIT(ui->state->disabled_item_mask, + DIAGNOSTICS_ITEM_STORAGE_TEST_SHORT); + VB2_SET_BIT(ui->state->disabled_item_mask, + DIAGNOSTICS_ITEM_STORAGE_TEST_EXTENDED); + } + ui->state->selected_item = DIAGNOSTICS_ITEM_STORAGE_HEALTH; + return VB2_SUCCESS; +} + static const struct vb2_menu_item diagnostics_items[] = { LANGUAGE_SELECT_ITEM, - { + [DIAGNOSTICS_ITEM_STORAGE_HEALTH] = { .text = "Storage health info", .target = VB2_SCREEN_DIAGNOSTICS_STORAGE_HEALTH, }, + [DIAGNOSTICS_ITEM_STORAGE_TEST_SHORT] = { + .text = "Storage self-test (short)", + .target = VB2_SCREEN_DIAGNOSTICS_STORAGE_TEST_SHORT, + }, + [DIAGNOSTICS_ITEM_STORAGE_TEST_EXTENDED] = { + .text = "Storage self-test (Extended)", + .target = VB2_SCREEN_DIAGNOSTICS_STORAGE_TEST_EXTENDED, + }, { .text = "Memory check (quick)", .target = VB2_SCREEN_DIAGNOSTICS_MEMORY_QUICK, @@ -1054,6 +1080,7 @@ static const struct vb2_menu_item diagnostics_items[] = { static const struct vb2_screen_info diagnostics_screen = { .id = VB2_SCREEN_DIAGNOSTICS, .name = "Diagnostic tools", + .init = diagnostics_init, .menu = MENU_ITEMS(diagnostics_items), }; @@ -1098,6 +1125,129 @@ static const struct vb2_screen_info diagnostics_storage_health_screen = { }; /******************************************************************************/ +/* VB2_SCREEN_DIAGNOSTICS_STORAGE_TEST */ + +#define DIAGNOSTICS_STORAGE_TEST_ITEM_PAGE_UP 0 +#define DIAGNOSTICS_STORAGE_TEST_ITEM_PAGE_DOWN 1 +#define DIAGNOSTICS_STORAGE_TEST_ITEM_BACK 2 +#define DIAGNOSTICS_STORAGE_TEST_ITEM_CANCEL 3 + +static vb2_error_t diagnostics_storage_test_update_impl( + struct vb2_ui_context *ui) +{ + const char *log_string; + int is_test_running = 0; + + /* Early return if the test is done. */ + if (ui->state->test_finished) + return VB2_SUCCESS; + + vb2_error_t rv = vb2ex_diag_get_storage_test_log(&log_string); + switch (rv) { + case VB2_ERROR_EX_DIAG_TEST_RUNNING: + is_test_running = 1; + break; + case VB2_SUCCESS: + ui->state->test_finished = 1; + break; + default: + VB2_DEBUG("vb2ex_diag_get_storage_test_log returned %#x\n", rv); + return rv; + } + VB2_TRY(log_page_show_back_or_cancel(ui, is_test_running)); + return log_page_update(ui, log_string); +} + +static vb2_error_t diagnostics_storage_test_update(struct vb2_ui_context *ui) +{ + vb2_error_t rv = diagnostics_storage_test_update_impl(ui); + if (rv) { + ui->error_code = VB2_UI_ERROR_DIAGNOSTICS; + return vb2_ui_screen_back(ui); + } + return VB2_SUCCESS; +} + +static vb2_error_t diagnostics_storage_test_control( + struct vb2_ui_context *ui, enum vb2_diag_storage_test op) +{ + vb2_error_t rv = vb2ex_diag_storage_test_control(op); + if (rv) { + ui->error_code = VB2_UI_ERROR_DIAGNOSTICS; + return vb2_ui_screen_back(ui); + } + return VB2_SUCCESS; +} + +static vb2_error_t diagnostics_storage_test_init(struct vb2_ui_context *ui) +{ + VB2_TRY(diagnostics_storage_test_update(ui)); + return log_page_reset_to_top(ui); +} + +static vb2_error_t diagnostics_storage_test_short_init( + struct vb2_ui_context *ui) +{ + VB2_TRY(diagnostics_storage_test_control(ui, + VB2_DIAG_STORAGE_TEST_STOP)); + VB2_TRY(diagnostics_storage_test_control(ui, + VB2_DIAG_STORAGE_TEST_SHORT)); + return diagnostics_storage_test_init(ui); +} + +static vb2_error_t diagnostics_storage_test_extended_init( + struct vb2_ui_context *ui) +{ + VB2_TRY(diagnostics_storage_test_control(ui, + VB2_DIAG_STORAGE_TEST_STOP)); + VB2_TRY(diagnostics_storage_test_control( + ui, VB2_DIAG_STORAGE_TEST_EXTENDED)); + return diagnostics_storage_test_init(ui); +} + +static vb2_error_t diagnostics_storage_test_cancel(struct vb2_ui_context *ui) +{ + VB2_TRY(diagnostics_storage_test_control(ui, + VB2_DIAG_STORAGE_TEST_STOP)); + return vb2_ui_screen_back(ui); +} + +static const struct vb2_menu_item diagnostics_storage_test_items[] = { + [DIAGNOSTICS_STORAGE_TEST_ITEM_PAGE_UP] = PAGE_UP_ITEM, + [DIAGNOSTICS_STORAGE_TEST_ITEM_PAGE_DOWN] = PAGE_DOWN_ITEM, + [DIAGNOSTICS_STORAGE_TEST_ITEM_BACK] = BACK_ITEM, + [DIAGNOSTICS_STORAGE_TEST_ITEM_CANCEL] = { + .text = "Cancel", + .action = diagnostics_storage_test_cancel, + }, + POWER_OFF_ITEM, +}; + +static const struct vb2_screen_info diagnostics_storage_test_short_screen = { + .id = VB2_SCREEN_DIAGNOSTICS_STORAGE_TEST_SHORT, + .name = "Storage self-test (short)", + .init = diagnostics_storage_test_short_init, + .action = diagnostics_storage_test_update, + .menu = MENU_ITEMS(diagnostics_storage_test_items), + .page_up_item = DIAGNOSTICS_STORAGE_TEST_ITEM_PAGE_UP, + .page_down_item = DIAGNOSTICS_STORAGE_TEST_ITEM_PAGE_DOWN, + .back_item = DIAGNOSTICS_STORAGE_TEST_ITEM_BACK, + .cancel_item = DIAGNOSTICS_STORAGE_TEST_ITEM_CANCEL, +}; + +static const struct vb2_screen_info diagnostics_storage_test_extended_screen = { + .id = VB2_SCREEN_DIAGNOSTICS_STORAGE_TEST_EXTENDED, + .name = "Storage self-test (extended)", + .init = diagnostics_storage_test_extended_init, + .action = diagnostics_storage_test_update, + .menu = MENU_ITEMS(diagnostics_storage_test_items), + .page_up_item = DIAGNOSTICS_STORAGE_TEST_ITEM_PAGE_UP, + .page_down_item = DIAGNOSTICS_STORAGE_TEST_ITEM_PAGE_DOWN, + .back_item = DIAGNOSTICS_STORAGE_TEST_ITEM_BACK, + .cancel_item = DIAGNOSTICS_STORAGE_TEST_ITEM_CANCEL, +}; + +/******************************************************************************/ /* VB2_SCREEN_DIAGNOSTICS_MEMORY_QUICK VB2_SCREEN_DIAGNOSTICS_MEMORY_FULL */ @@ -1240,6 +1390,8 @@ static const struct vb2_screen_info *screens[] = { &developer_select_bootloader_screen, &diagnostics_screen, &diagnostics_storage_health_screen, + &diagnostics_storage_test_short_screen, + &diagnostics_storage_test_extended_screen, &diagnostics_memory_quick_screen, &diagnostics_memory_full_screen, }; diff --git a/firmware/2lib/include/2api.h b/firmware/2lib/include/2api.h index 6a1fc171..8d14f376 100644 --- a/firmware/2lib/include/2api.h +++ b/firmware/2lib/include/2api.h @@ -1345,6 +1345,8 @@ enum vb2_screen { VB2_SCREEN_DIAGNOSTICS = 0x400, /* Storage diagnostic screen */ VB2_SCREEN_DIAGNOSTICS_STORAGE_HEALTH = 0x410, + VB2_SCREEN_DIAGNOSTICS_STORAGE_TEST_SHORT = 0x411, + VB2_SCREEN_DIAGNOSTICS_STORAGE_TEST_EXTENDED = 0x412, /* Memory diagnostic screens */ VB2_SCREEN_DIAGNOSTICS_MEMORY_QUICK = 0x420, VB2_SCREEN_DIAGNOSTICS_MEMORY_FULL = 0x421, @@ -1526,6 +1528,21 @@ uint32_t vb2ex_prepare_log_screen(enum vb2_screen screen, uint32_t locale_id, vb2_error_t vb2ex_diag_get_storage_health(const char **out); /** + * Get the storage self-test log. + * + * @param out For returning a read-only pointer of full log string which is + * guaranteed to be null-terminated. The function will manage + * memory internally, so the returned pointer will only be valid + * until next call. + * @return The status of storage test. VB2_SUCCESS means the test is finished, + * regardless of passing or failing. VB2_ERROR_EX_DIAG_TEST_RUNNING means + * the test is still running. VB2_ERROR_EX_UNIMPLEMENTED means the storage + * self-test is not supported on this device. Other non-zero codes for internal + * errors. + */ +vb2_error_t vb2ex_diag_get_storage_test_log(const char **out); + +/** * Get the memory diagnostic status. When it is called, it will take over the * control for a short period of time running memory test, and then return the * result of current status. If `reset` is not zero, it will reset the memory @@ -1547,6 +1564,17 @@ vb2_error_t vb2ex_diag_memory_quick_test(int reset, const char **out); vb2_error_t vb2ex_diag_memory_full_test(int reset, const char **out); /*****************************************************************************/ +/* Functions for diagnostics control. */ + +enum vb2_diag_storage_test { + VB2_DIAG_STORAGE_TEST_STOP = 0, + VB2_DIAG_STORAGE_TEST_SHORT, + VB2_DIAG_STORAGE_TEST_EXTENDED, +}; + +vb2_error_t vb2ex_diag_storage_test_control(enum vb2_diag_storage_test ops); + +/*****************************************************************************/ /* Timer. */ /** diff --git a/firmware/2lib/include/2ui.h b/firmware/2lib/include/2ui.h index 5434fd96..6dbb322d 100644 --- a/firmware/2lib/include/2ui.h +++ b/firmware/2lib/include/2ui.h @@ -79,7 +79,7 @@ struct vb2_screen_state { uint32_t page_count; uint32_t current_page; - /* For memory check screen. */ + /* For minidiag test screens. */ int test_finished; /* Do not update screen if the content is done */ struct vb2_screen_state *prev; |