return EFI_SUCCESS;\r
}\r
\r
-/**\r
-\r
- Check whether go to recovery path\r
- @retval TRUE Go to recovery path\r
- @retval FALSE Go to normal path\r
-\r
-**/\r
-BOOLEAN\r
-OemRecoveryBootMode ()\r
-{\r
- return PlatformIsBootWithRecoveryStage1 ();\r
-}\r
-\r
/**\r
Peform the boot mode determination logic\r
If the box is closed, then\r
EFI_STATUS Status;\r
EFI_BOOT_MODE NewBootMode;\r
PEI_CAPSULE_PPI *Capsule;\r
- CHAR8 UserSelection;\r
- UINT32 Straps32;\r
+ UINT32 RegValue;\r
+\r
+ NewBootMode = *BootMode;\r
\r
//\r
- // Read Straps. Used later if recovery boot.\r
+ // Read Sticky R/W Bits\r
//\r
- Straps32 = QNCAltPortRead (QUARK_SCSS_SOC_UNIT_SB_PORT_ID, QUARK_SCSS_SOC_UNIT_STPDDRCFG);\r
+ RegValue = QNCAltPortRead (QUARK_SCSS_SOC_UNIT_SB_PORT_ID, QUARK_SCSS_SOC_UNIT_CFG_STICKY_RW);\r
+ DEBUG ((EFI_D_ERROR, "RegValue = %08x\n", RegValue));\r
\r
//\r
// Check if we need to boot in recovery mode\r
//\r
- if ((ValidateFvHeader (BootMode) != EFI_SUCCESS)) {\r
- DEBUG ((EFI_D_INFO, "Force Boot mode recovery\n"));\r
+ if ((RegValue & B_CFG_STICKY_RW_FORCE_RECOVERY) != 0) {\r
NewBootMode = BOOT_IN_RECOVERY_MODE;\r
- Status = PeiServicesInstallPpi (&mPpiListRecoveryBootMode);\r
- ASSERT_EFI_ERROR (Status);\r
- if (OemRecoveryBootMode () == FALSE) {\r
- DEBUG ((EFI_D_INFO, "Recovery stage1 not Active, reboot to activate recovery stage1 image\n"));\r
- OemInitiateRecoveryAndWait ();\r
- }\r
- } else if (OemRecoveryBootMode ()) {\r
- DEBUG ((EFI_D_INFO, "Boot mode recovery\n"));\r
+ DEBUG ((EFI_D_ERROR, "RECOVERY from sticky bit\n"));;\r
+\r
+ //\r
+ // Clear force recovery sticky bit\r
+ //\r
+ QNCAltPortWrite (\r
+ QUARK_SCSS_SOC_UNIT_SB_PORT_ID,\r
+ QUARK_SCSS_SOC_UNIT_CFG_STICKY_RW,\r
+ RegValue &(~B_CFG_STICKY_RW_FORCE_RECOVERY)\r
+ );\r
+\r
+ } else if (ValidateFvHeader (BootMode) != EFI_SUCCESS) {\r
NewBootMode = BOOT_IN_RECOVERY_MODE;\r
- Status = PeiServicesInstallPpi (&mPpiListRecoveryBootMode);\r
- ASSERT_EFI_ERROR (Status);\r
+ DEBUG ((EFI_D_ERROR, "RECOVERY from corrupt FV\n"));;\r
} else if (QNCCheckS3AndClearState ()) {\r
//\r
// Determine if we're in capsule update mode\r
NewBootMode = BOOT_WITH_FULL_CONFIGURATION;\r
}\r
}\r
- *BootMode = NewBootMode;\r
- Status = PeiServicesSetBootMode (NewBootMode);\r
- ASSERT_EFI_ERROR (Status);\r
\r
- //\r
- // If Recovery Boot then prompt the user to insert a USB key with recovery nodule and\r
- // continue with the recovery. Also give the user a chance to retry a normal boot.\r
- //\r
if (NewBootMode == BOOT_IN_RECOVERY_MODE) {\r
- if ((Straps32 & B_STPDDRCFG_FORCE_RECOVERY) == 0) {\r
- DEBUG ((EFI_D_ERROR, "*****************************************************************\n"));\r
- DEBUG ((EFI_D_ERROR, "***** Force Recovery Jumper Detected. *****\n"));\r
- DEBUG ((EFI_D_ERROR, "***** Attempting auto recovery of system flash. *****\n"));\r
- DEBUG ((EFI_D_ERROR, "***** Expecting USB key with recovery module connected. *****\n"));\r
- DEBUG ((EFI_D_ERROR, "***** PLEASE REMOVE FORCE RECOVERY JUMPER. *****\n"));\r
- DEBUG ((EFI_D_ERROR, "*****************************************************************\n"));\r
- } else {\r
- DEBUG ((EFI_D_ERROR, "*****************************************************************\n"));\r
- DEBUG ((EFI_D_ERROR, "***** ERROR: System boot failure!!!!!!! *****\n"));\r
- DEBUG ((EFI_D_ERROR, "***** - Press 'R' if you wish to force system recovery *****\n"));\r
- DEBUG ((EFI_D_ERROR, "***** (connect USB key with recovery module first) *****\n"));\r
- DEBUG ((EFI_D_ERROR, "***** - Press any other key to attempt another boot *****\n"));\r
- DEBUG ((EFI_D_ERROR, "*****************************************************************\n"));\r
-\r
- UserSelection = PlatformDebugPortGetChar8 ();\r
- if ((UserSelection != 'R') && (UserSelection != 'r')) {\r
- DEBUG ((EFI_D_ERROR, "New boot attempt selected........\n"));\r
- //\r
- // Initialte the cold reset\r
- //\r
- ResetCold ();\r
- }\r
- DEBUG ((EFI_D_ERROR, "Recovery boot selected..........\n"));\r
- }\r
+ DEBUG ((EFI_D_INFO, "Boot mode recovery\n"));\r
+ Status = PeiServicesInstallPpi (&mPpiListRecoveryBootMode);\r
+ ASSERT_EFI_ERROR (Status);\r
}\r
\r
+ Status = PeiServicesSetBootMode (NewBootMode);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ *BootMode = NewBootMode;\r
+\r
return EFI_SUCCESS;\r
}\r