diff --git a/OvmfPkg/Include/Library/QemuBootOrderLib.h b/OvmfPkg/Include/Library/QemuBootOrderLib.h index 12cda6aa91..80d02c80c2 100644 --- a/OvmfPkg/Include/Library/QemuBootOrderLib.h +++ b/OvmfPkg/Include/Library/QemuBootOrderLib.h @@ -54,4 +54,16 @@ SetBootOrderFromQemu ( IN CONST LIST_ENTRY *BootOptionList ); + +/** + Calculate the number of seconds we should be showing the FrontPage progress + bar for. + + @return The TimeoutDefault argument for PlatformBdsEnterFrontPage(). +**/ +UINT16 +GetFrontPageTimeoutFromQemu ( + VOID + ); + #endif diff --git a/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.c b/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.c index bc2fb56954..e63ad26224 100644 --- a/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.c +++ b/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.c @@ -1571,3 +1571,53 @@ ErrorFreeFwCfg: return Status; } + + +/** + Calculate the number of seconds we should be showing the FrontPage progress + bar for. + + @return The TimeoutDefault argument for PlatformBdsEnterFrontPage(). +**/ +UINT16 +GetFrontPageTimeoutFromQemu ( + VOID + ) +{ + FIRMWARE_CONFIG_ITEM BootMenuWaitItem; + UINTN BootMenuWaitSize; + + QemuFwCfgSelectItem (QemuFwCfgItemBootMenu); + if (QemuFwCfgRead16 () == 0) { + // + // The user specified "-boot menu=off", or didn't specify "-boot + // menu=(on|off)" at all. Return the platform default. + // + return PcdGet16 (PcdPlatformBootTimeOut); + } + + if (RETURN_ERROR (QemuFwCfgFindFile ("etc/boot-menu-wait", &BootMenuWaitItem, + &BootMenuWaitSize)) || + BootMenuWaitSize != sizeof (UINT16)) { + // + // "-boot menu=on" was specified without "splash-time=N". In this case, + // return three seconds if the platform default would cause us to skip the + // front page, and return the platform default otherwise. + // + UINT16 Timeout; + + Timeout = PcdGet16 (PcdPlatformBootTimeOut); + if (Timeout == 0) { + Timeout = 3; + } + return Timeout; + } + + // + // "-boot menu=on,splash-time=N" was specified, where N is in units of + // milliseconds. The Intel BDS Front Page progress bar only supports whole + // seconds, round N up. + // + QemuFwCfgSelectItem (BootMenuWaitItem); + return (UINT16)((QemuFwCfgRead16 () + 999) / 1000); +} diff --git a/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf b/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf index 6289e6abe6..e7be0f3cd7 100644 --- a/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf +++ b/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf @@ -57,3 +57,6 @@ [FeaturePcd] gUefiOvmfPkgTokenSpaceGuid.PcdQemuBootOrderPciTranslation gUefiOvmfPkgTokenSpaceGuid.PcdQemuBootOrderMmioTranslation + +[Pcd] + gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPlatformBootTimeOut