]> git.proxmox.com Git - mirror_edk2.git/blobdiff - QuarkPlatformPkg/Platform/Pei/PlatformInit/BootMode.c
QuarkPlatformPkg/PlatformInit: Fix recovery detection issues
[mirror_edk2.git] / QuarkPlatformPkg / Platform / Pei / PlatformInit / BootMode.c
index 0dd3d24cf37d2274ebbf8d9edbfb7077e9afecd5..215f8f03b32c123b4c28145bc90353b893019ef8 100644 (file)
@@ -119,19 +119,6 @@ ValidateFvHeader (
   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
@@ -154,31 +141,35 @@ UpdateBootMode (
   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
@@ -217,41 +208,17 @@ UpdateBootMode (
       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