Regards, Ray
>-----Original Message----- >From: Daniil Egranov [mailto:daniil.egra...@arm.com] >Sent: Thursday, May 5, 2016 7:57 AM >To: Ni, Ruiyu <ruiyu...@intel.com>; edk2-devel@lists.01.org >Cc: Fan, Jeff <jeff....@intel.com> >Subject: Re: [edk2] [PATCH v2 2/3] IntelFrameworkModulePkg/BdsDxe: Fix for the >BDS boot timeout > >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. You could refer to the OvmfPkg/Library/PlatformBdsLib. PlatformBdsEnterFrontPage() is called by PlatformBdsPolicyBehavior() with the timeout. >> >> >>> 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. The IntelFrameworkModulePkg/Bds requires platform map the PcdPlatformBootTimeOut to L"Timeout". >> >> >>> >>> // >>> // 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