summaryrefslogtreecommitdiff
path: root/firmware/2lib/2ui_screens.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/2lib/2ui_screens.c')
-rw-r--r--firmware/2lib/2ui_screens.c165
1 files changed, 165 insertions, 0 deletions
diff --git a/firmware/2lib/2ui_screens.c b/firmware/2lib/2ui_screens.c
index e0a6d599..2e5dbfaf 100644
--- a/firmware/2lib/2ui_screens.c
+++ b/firmware/2lib/2ui_screens.c
@@ -866,12 +866,15 @@ static const struct vb2_menu_item diagnostics_items[] = {
LANGUAGE_SELECT_ITEM,
{
.text = "Storage",
+ .target = VB2_SCREEN_DIAGNOSTICS_STORAGE,
},
{
.text = "Quick memory check",
+ .target = VB2_SCREEN_DIAGNOSTICS_MEMORY_QUICK,
},
{
.text = "Full memory check",
+ .target = VB2_SCREEN_DIAGNOSTICS_MEMORY_FULL,
},
POWER_OFF_ITEM,
};
@@ -883,6 +886,165 @@ static const struct vb2_screen_info diagnostics_screen = {
};
/******************************************************************************/
+/* VB2_SCREEN_DIAGNOSTICS_STORAGE */
+
+#define DIAGNOSTICS_STORAGE_ITEM_PAGE_DOWN 1
+#define DIAGNOSTICS_STORAGE_ITEM_BACK 2
+
+static vb2_error_t diagnostics_storage_init(struct vb2_ui_context *ui)
+{
+ const char *log_string = vb2ex_get_diagnostic_storage();
+ if (!log_string) {
+ VB2_DEBUG("ERROR: Failed to retrieve storage log message\n");
+ ui->error_code = VB2_UI_ERROR_DIAGNOSTICS;
+ ui->error_beep = 1;
+ return vb2_ui_screen_back(ui);
+ }
+
+ ui->state->page_count = vb2ex_prepare_log_screen(log_string);
+ if (ui->state->page_count == 0) {
+ VB2_DEBUG("ERROR: Failed to prepare storage log screen\n");
+ ui->error_code = VB2_UI_ERROR_DIAGNOSTICS;
+ ui->error_beep = 1;
+ return vb2_ui_screen_back(ui);
+ }
+ return log_page_init(ui, DIAGNOSTICS_STORAGE_ITEM_PAGE_DOWN,
+ DIAGNOSTICS_STORAGE_ITEM_BACK);
+}
+
+static const struct vb2_menu_item diagnostics_storage_items[] = {
+ {
+ .text = "Page up",
+ .action = log_page_prev_action,
+ },
+ [DIAGNOSTICS_STORAGE_ITEM_PAGE_DOWN] = {
+ .text = "Page down",
+ .action = log_page_next_action,
+ },
+ [DIAGNOSTICS_STORAGE_ITEM_BACK] = BACK_ITEM,
+ POWER_OFF_ITEM,
+};
+
+static const struct vb2_screen_info diagnostics_storage_screen = {
+ .id = VB2_SCREEN_DIAGNOSTICS_STORAGE,
+ .name = "Storage",
+ .init = diagnostics_storage_init,
+ .menu = MENU_ITEMS(diagnostics_storage_items),
+};
+
+/******************************************************************************/
+/* VB2_SCREEN_DIAGNOSTICS_MEMORY_QUICK
+ VB2_SCREEN_DIAGNOSTICS_MEMORY_FULL */
+
+#define DIAGNOSTICS_MEMORY_ITEM_PAGE_DOWN 1
+#define DIAGNOSTICS_MEMORY_ITEM_CANCEL 2
+#define DIAGNOSTICS_MEMORY_ITEM_BACK 3
+
+typedef vb2_error_t (*memory_test_op_t)(int reset, const char **out);
+static vb2_error_t diagnostics_memory_update_screen(struct vb2_ui_context *ui,
+ memory_test_op_t op,
+ int reset)
+{
+ const char *log_string = NULL;
+ vb2_error_t rv = op(reset, &log_string);
+ if ((rv && rv != VB2_ERROR_EX_DIAG_TEST_RUNNING) || !log_string) {
+ VB2_DEBUG("ERROR: Failed to retrieve memory test status\n");
+ ui->error_code = VB2_UI_ERROR_DIAGNOSTICS;
+ ui->error_beep = 1;
+ return vb2_ui_screen_back(ui);
+ }
+
+ ui->state->page_count = vb2ex_prepare_log_screen(log_string);
+ if (ui->state->page_count == 0) {
+ VB2_DEBUG("ERROR: Failed to prepare memory log screen, error: "
+ "%#x\n", rv);
+ ui->error_code = VB2_UI_ERROR_DIAGNOSTICS;
+ ui->error_beep = 1;
+ return vb2_ui_screen_back(ui);
+ }
+ if (ui->state->current_page >= ui->state->page_count)
+ ui->state->current_page = ui->state->page_count - 1;
+
+ ui->force_display = 1;
+
+ /* Show cancel button when the test is running, otherwise show the back
+ * button. VB2_SUCCESS indicates the test is finished. */
+ ui->state->disabled_item_mask &= ~(1 << DIAGNOSTICS_MEMORY_ITEM_CANCEL);
+ ui->state->disabled_item_mask &= ~(1 << DIAGNOSTICS_MEMORY_ITEM_BACK);
+ if (rv == VB2_ERROR_EX_DIAG_TEST_RUNNING) {
+ ui->state->disabled_item_mask |=
+ 1 << DIAGNOSTICS_MEMORY_ITEM_BACK;
+ if (ui->state->selected_item == DIAGNOSTICS_MEMORY_ITEM_BACK)
+ ui->state->selected_item =
+ DIAGNOSTICS_MEMORY_ITEM_CANCEL;
+ } else {
+ ui->state->disabled_item_mask |=
+ 1 << DIAGNOSTICS_MEMORY_ITEM_CANCEL;
+ if (ui->state->selected_item == DIAGNOSTICS_MEMORY_ITEM_CANCEL)
+ ui->state->selected_item = DIAGNOSTICS_MEMORY_ITEM_BACK;
+ }
+
+ return VB2_REQUEST_UI_CONTINUE;
+}
+
+static vb2_error_t diagnostics_memory_init_quick(struct vb2_ui_context *ui)
+{
+ return diagnostics_memory_update_screen(
+ ui, &vb2ex_diag_memory_quick_test, 1);
+}
+
+static vb2_error_t diagnostics_memory_init_full(struct vb2_ui_context *ui)
+{
+ return diagnostics_memory_update_screen(
+ ui, &vb2ex_diag_memory_full_test, 1);
+}
+
+static vb2_error_t diagnostics_memory_update_quick(struct vb2_ui_context *ui)
+{
+ return diagnostics_memory_update_screen(
+ ui, &vb2ex_diag_memory_quick_test, 0);
+}
+
+static vb2_error_t diagnostics_memory_update_full(struct vb2_ui_context *ui)
+{
+ return diagnostics_memory_update_screen(
+ ui, &vb2ex_diag_memory_full_test, 0);
+}
+
+static const struct vb2_menu_item diagnostics_memory_items[] = {
+ {
+ .text = "Page up",
+ .action = log_page_prev_action,
+ },
+ [DIAGNOSTICS_MEMORY_ITEM_PAGE_DOWN] = {
+ .text = "Page down",
+ .action = log_page_next_action,
+ },
+ [DIAGNOSTICS_MEMORY_ITEM_CANCEL] = {
+ .text = "Cancel and go back",
+ .action = vb2_ui_screen_back,
+ },
+ [DIAGNOSTICS_MEMORY_ITEM_BACK] = BACK_ITEM,
+ POWER_OFF_ITEM,
+};
+
+static const struct vb2_screen_info diagnostics_memory_quick_screen = {
+ .id = VB2_SCREEN_DIAGNOSTICS_MEMORY_QUICK,
+ .name = "Quick memory check",
+ .init = diagnostics_memory_init_quick,
+ .action = diagnostics_memory_update_quick,
+ .menu = MENU_ITEMS(diagnostics_memory_items),
+};
+
+static const struct vb2_screen_info diagnostics_memory_full_screen = {
+ .id = VB2_SCREEN_DIAGNOSTICS_MEMORY_FULL,
+ .name = "Full memory check",
+ .init = diagnostics_memory_init_full,
+ .action = diagnostics_memory_update_full,
+ .menu = MENU_ITEMS(diagnostics_memory_items),
+};
+
+/******************************************************************************/
/*
* TODO(chromium:1035800): Refactor UI code across vboot and depthcharge.
* Currently vboot and depthcharge maintain their own copies of menus/screens.
@@ -910,6 +1072,9 @@ static const struct vb2_screen_info *screens[] = {
&developer_boot_external_screen,
&developer_invalid_disk_screen,
&diagnostics_screen,
+ &diagnostics_storage_screen,
+ &diagnostics_memory_quick_screen,
+ &diagnostics_memory_full_screen,
};
const struct vb2_screen_info *vb2_get_screen_info(enum vb2_screen id)