X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=OvmfPkg%2FPlatformDxe%2FPlatform.c;fp=OvmfPkg%2FPlatformDxe%2FPlatform.c;h=49189141bbbbe04351f56e97111c1d6b0aeada41;hp=b95326e2b5fe5d5eb6a1783fb3d7ab56da6964a1;hb=cbd08bcc1787ae0166caa75cd340d45bb20295a7;hpb=1df57ba3e66ad72f6ac67008aa9a99d4648e0200 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);