Hi Ray,

Thank you for review and comments. Please see my answers below.

Regards,
Daniil

On 05/04/2016 12:04 AM, Ni, Ruiyu wrote:
3 comments below.

Regards,
Ray

-----Original Message-----
From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Daniil 
Egranov
Sent: Wednesday, May 4, 2016 9:34 AM
To: edk2-devel@lists.01.org
Cc: Fan, Jeff <jeff....@intel.com>
Subject: [edk2] [PATCH v2 2/3] IntelFrameworkModulePkg/BdsDxe: Fix for the BDS 
boot timeout

The patch loads timeout value from the "Timeout" global variable and passes
it to PlatformBdsEnterFrontPage(), which handles delay and key input.
The PcdPlatformBootTimeOut is only used at the BDS entry point and updates
the "Timeout" value. This will allow the modification of the timeout value
through the BDS menu and overwrite it if PcdPlatformBootTimeOut has been
set.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Daniil Egranov <daniil.egra...@arm.com>
---
IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c    | 18 +++++++++++++++---
.../Universal/BdsDxe/BootMaint/BootMaint.c             | 17 ++++++++++++++++-
.../Universal/BdsDxe/BootMaint/UpdatePage.c            | 13 +++++++------
3 files changed, 38 insertions(+), 10 deletions(-)

diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c
b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c
index ae7ad21..1d80fca 100644
--- a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c
+++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c
@@ -123,6 +123,7 @@ BdsBootDeviceSelect (
   BOOLEAN           BootNextExist;
   LIST_ENTRY        *LinkBootNext;
   EFI_EVENT         ConnectConInEvent;
+  UINTN             Size;

   //
   // Got the latest boot option
@@ -214,6 +215,18 @@ BdsBootDeviceSelect (
   if (Link == NULL) {
     return ;
   }
+
+  //Read boot timeout variable
+  Status = gRT->GetVariable (L"Timeout",
+                             &gEfiGlobalVariableGuid,
+                             NULL,
+                             &Size,
+                             (VOID *) &Timeout);
+
+  if (EFI_ERROR (Status)) {
+    Timeout = 0xFFFF;
+  }
+
   //
   // Here we make the boot in a loop, every boot success will
   // return to the front page
@@ -222,7 +235,7 @@ BdsBootDeviceSelect (
     //
     // Check the boot option list first
     //
-    if (Link == &BootLists) {
+    if (Link == &BootLists || Timeout != 0xFFFF) {
       //
       // When LazyConIn enabled, signal connect ConIn event before enter UI
       //
@@ -238,12 +251,11 @@ BdsBootDeviceSelect (
       //    one is success to boot, then we back here to allow user
       //    add new active boot option
       //
-      Timeout = 0xffff;
       PlatformBdsEnterFrontPage (Timeout, FALSE);
+      Timeout = 0xffff;

1. The old code is to enter front page unconditionally and immediately while you
changed the behavior to wait for Timeout seconds before entering front page.
Why?
The previous logic allows entry into the BDS boot menu in two cases: no active boot options and all attempts to boot from the current boot options fail. If there is a valid bootable device in the boot options, i found no way to interrupt the boot process. In a lot of cases, the boot options have to be changed before any boot attempts have been made. This patch checks if boot timeout is set and uses PlatformBdsEnterFrontPage to manage time and key inputs before using current boot options.


       InitializeListHead (&BootLists);
       BdsLibBuildOptionFromVar (&BootLists, L"BootOrder");
       Link = BootLists.ForwardLink;
-      continue;
     }
     //
     // Get the boot option from the link list
diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c
b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c
index d4b4475..cc2d656 100644
--- a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c
+++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c
@@ -111,6 +111,9 @@ InitializeBmmConfig (
   BM_MENU_ENTRY   *NewMenuEntry;
   BM_LOAD_CONTEXT *NewLoadContext;
   UINT16          Index;
+  UINT16          BootTimeOut;
+  EFI_STATUS      Status;
+  UINTN           Size;

   ASSERT (CallbackData != NULL);

@@ -128,7 +131,19 @@ InitializeBmmConfig (
     }
   }

-  CallbackData->BmmFakeNvData.BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);
+  //Read boot timeout variable. If PcdPlatformBootTimeOut has been set,
+  //the Timeout variable will be initialized as part of the BDS startup 
procedure
+  Status = gRT->GetVariable ( L"Timeout",
+                              &gEfiGlobalVariableGuid,
+                              NULL,
+                              &Size,
+                              (VOID *) &BootTimeOut);
+
+  if (EFI_ERROR (Status)) {
+          BootTimeOut = 0;
+  }
+
+  CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;

2. With the platform DSC maps the PcdPlatformBootTimeout to L"Timeout" variable 
correctly,
the above change is not necessary. right?
I agree, but what about the case when PcdPlatformBootTimeOut is not mapped or the value is not set? The L"Timeout" is initialized by PcdPlatformBootTimeOut in the BdsEntry() call so it has the timeout value anyway. In the current implementation, two different variables are used for the same purpose during the run time. I think the code can be cleaner if only one of them is used across the code. In case PcdPlatformBootTimeOut is preferred, it has to be synchronized with UI timeout menu input. Otherwise, the modified timeout value will be reset back to the original PcdPlatformBootTimeOut value. Also, the PcdPlatformBootTimeOut variable may have to be synchronized with Bmm BootTimeOut between reboots.



   //
   // Initialize data which located in Boot Options Menu
diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
index b13ed11..c872766 100644
--- a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
+++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
@@ -722,18 +722,21 @@ UpdateTimeOutPage (
   IN BMM_CALLBACK_DATA                *CallbackData
   )
{
-  UINT16  BootTimeOut;
   VOID    *DefaultOpCodeHandle;

   CallbackData->BmmAskSaveOrNot = TRUE;

   UpdatePageStart (CallbackData);

-  BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);
-
   DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();
   ASSERT (DefaultOpCodeHandle != NULL);
-  HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, 
EFI_IFR_TYPE_NUM_SIZE_16,
BootTimeOut);
+
+  HiiCreateDefaultOpCode (
+    DefaultOpCodeHandle,
+    EFI_HII_DEFAULT_CLASS_STANDARD,
+    EFI_IFR_TYPE_NUM_SIZE_16,
+    CallbackData->BmmFakeNvData.BootTimeOut
+    );

3. I agree it's not necessary to re-get the timeout value from PCD again.

So in summary I think only #3 is necessary.

   HiiCreateNumericOpCode (
     mStartOpCodeHandle,
@@ -752,8 +755,6 @@ UpdateTimeOutPage (

   HiiFreeOpCodeHandle (DefaultOpCodeHandle);

-  //CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;
-
   UpdatePageEnd (CallbackData);
}

--
2.7.4

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to