From: Laszlo Ersek Date: Sat, 22 Mar 2014 07:14:03 +0000 (+0000) Subject: OvmfPkg: PlatformDxe: connect ExtractConfig() to platform data X-Git-Tag: edk2-stable201903~11603 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=cbd08bcc1787ae0166caa75cd340d45bb20295a7 OvmfPkg: PlatformDxe: connect ExtractConfig() to platform data Establish the full stack of conversions in retrieving the platform configuration: MultiConfigAltResp -- form engine / HII communication ^ | [BlockToConfig] | MAIN_FORM_STATE -- binary representation of form/widget state ^ | [PlatformConfigToFormState] | PLATFORM_CONFIG -- accessible to DXE and UEFI drivers ^ | [PlatformConfigLoad] | UEFI non-volatile variable -- accessible to external utilities Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek Reviewed-by: Jordan Justen git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15374 6f19259b-4bc3-4df7-8a09-765794883524 --- diff --git a/OvmfPkg/PlatformDxe/Platform.c b/OvmfPkg/PlatformDxe/Platform.c index b95326e2b5..49189141bb 100644 --- a/OvmfPkg/PlatformDxe/Platform.c +++ b/OvmfPkg/PlatformDxe/Platform.c @@ -15,6 +15,7 @@ **/ #include +#include #include #include #include @@ -125,6 +126,79 @@ STATIC UINTN mNumGopModes; STATIC GOP_MODE *mGopModes; +/** + Load the persistent platform configuration and translate it to binary form + state. + + If the platform configuration is missing, then the function fills in a + default state. + + @param[out] MainFormState Binary form/widget state after translation. + + @retval EFI_SUCCESS Form/widget state ready. + @return Error codes from underlying functions. +**/ +STATIC +EFI_STATUS +EFIAPI +PlatformConfigToFormState ( + OUT MAIN_FORM_STATE *MainFormState + ) +{ + EFI_STATUS Status; + PLATFORM_CONFIG PlatformConfig; + UINT64 OptionalElements; + UINTN ModeNumber; + + ZeroMem (MainFormState, sizeof *MainFormState); + + Status = PlatformConfigLoad (&PlatformConfig, &OptionalElements); + switch (Status) { + case EFI_SUCCESS: + if (OptionalElements & PLATFORM_CONFIG_F_GRAPHICS_RESOLUTION) { + // + // Format the preferred resolution as text. + // + UnicodeSPrintAsciiFormat ( + (CHAR16 *) MainFormState->CurrentPreferredResolution, + sizeof MainFormState->CurrentPreferredResolution, + "%Ldx%Ld", + (INT64) PlatformConfig.HorizontalResolution, + (INT64) PlatformConfig.VerticalResolution); + + // + // Try to locate it in the drop-down list too. This may not succeed, but + // that's fine. + // + for (ModeNumber = 0; ModeNumber < mNumGopModes; ++ModeNumber) { + if (mGopModes[ModeNumber].X == PlatformConfig.HorizontalResolution && + mGopModes[ModeNumber].Y == PlatformConfig.VerticalResolution) { + MainFormState->NextPreferredResolution = (UINT32) ModeNumber; + break; + } + } + + break; + } + // + // fall through otherwise + // + + case EFI_NOT_FOUND: + UnicodeSPrintAsciiFormat ( + (CHAR16 *) MainFormState->CurrentPreferredResolution, + sizeof MainFormState->CurrentPreferredResolution, + "Unset"); + break; + + default: + return Status; + } + + return EFI_SUCCESS; +} + + /** This function is called by the HII machinery when it fetches the form state. @@ -142,7 +216,9 @@ STATIC GOP_MODE *mGopModes; all values filled in for the names in the Request string. - @return Status codes from gHiiConfigRouting->BlockToConfig(). + @retval EFI_SUCCESS Extraction of form state in + encoding successful. + @return Status codes from underlying functions. **/ STATIC @@ -160,9 +236,15 @@ ExtractConfig ( DEBUG ((EFI_D_VERBOSE, "%a: Request=\"%s\"\n", __FUNCTION__, Request)); - StrnCpy ((CHAR16 *) MainFormState.CurrentPreferredResolution, - L"Unset", MAXSIZE_RES_CUR); - MainFormState.NextPreferredResolution = 0; + Status = PlatformConfigToFormState (&MainFormState); + if (EFI_ERROR (Status)) { + *Progress = Request; + return Status; + } + + // + // Answer the textual request keying off the binary form state. + // Status = gHiiConfigRouting->BlockToConfig (gHiiConfigRouting, Request, (VOID *) &MainFormState, sizeof MainFormState, Results, Progress);