2kernel.c: Clear VB2_NV_DIAG_REQUEST unconditionally

BUG=none
TEST=make runtests
BRANCH=none

Signed-off-by: Hsin-Te Yuan <yuanhsinte@google.com>
Change-Id: I406bcf806a6bbe21faa5f069381b73d43a7550b2
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/3737566
Reviewed-by: Julius Werner <jwerner@chromium.org>
Reviewed-by: Yu-Ping Wu <yupingso@chromium.org>
Tested-by: Hsuan Ting Chen <roccochen@chromium.org>
diff --git a/firmware/2lib/2kernel.c b/firmware/2lib/2kernel.c
index 8d17ff5..bec9c50 100644
--- a/firmware/2lib/2kernel.c
+++ b/firmware/2lib/2kernel.c
@@ -242,6 +242,21 @@
 	 */
 	vb2_clear_recovery(ctx);
 
+	/*
+	 * Clear the diagnostic request flag and commit nvdata to prevent
+	 * booting back into diagnostic mode when a forced system reset occurs.
+	 */
+	if (vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST)) {
+		vb2_nv_set(ctx, VB2_NV_DIAG_REQUEST, 0);
+		/*
+		 * According to current FAFT design (firmware_MiniDiag), we
+		 * need an AP reset after MiniDiag test items to preserve the
+		 * CBMEM console logs. So we need to commit nvdata immediately
+		 * to prevent booting back to VB2_BOOT_MODE_DIAGNOSTICS.
+		 */
+		vb2ex_commit_data(ctx);
+	}
+
 	/* Select boot path */
 	switch (ctx->boot_mode) {
 	case VB2_BOOT_MODE_MANUAL_RECOVERY:
@@ -260,14 +275,6 @@
 		vb2ex_commit_data(ctx);
 		break;
 	case VB2_BOOT_MODE_DIAGNOSTICS:
-		/*
-		 * Need to clear the request flag and commit nvdata changes
-		 * immediately to avoid booting back into diagnostic tool when a
-		 * forced system reset occurs.
-		 */
-		vb2_nv_set(ctx, VB2_NV_DIAG_REQUEST, 0);
-		vb2ex_commit_data(ctx);
-		break;
 	case VB2_BOOT_MODE_DEVELOPER:
 	case VB2_BOOT_MODE_NORMAL:
 		break;
diff --git a/firmware/2lib/2misc.c b/firmware/2lib/2misc.c
index 6e92690..5735127 100644
--- a/firmware/2lib/2misc.c
+++ b/firmware/2lib/2misc.c
@@ -520,6 +520,7 @@
 		 VB2_SECDATA_KERNEL_FLAG_PHONE_RECOVERY_UI_DISABLED);
 }
 
+test_mockable
 int vb2api_diagnostic_ui_enabled(struct vb2_context *ctx)
 {
 	return !(vb2_secdata_kernel_get(ctx, VB2_SECDATA_KERNEL_FLAGS) &
diff --git a/tests/vboot_api_kernel4_tests.c b/tests/vboot_api_kernel4_tests.c
index 60d87c6..6f210d3 100644
--- a/tests/vboot_api_kernel4_tests.c
+++ b/tests/vboot_api_kernel4_tests.c
@@ -251,8 +251,7 @@
 
 	reset_common_data();
 	vb2_nv_set(ctx, VB2_NV_DIAG_REQUEST, 1);
-	test_slk(VB2_REQUEST_REBOOT, 0,
-		 "Normal boot with diag disabled (reboot to unset)");
+	test_slk(0, 0, "Normal boot with diag disabled (reboot to unset)");
 
 	/* Boot normal - phase1 failure */
 	reset_common_data();