/** @file The OEM config reference implementation Copyright (c) 2018, Hisilicon Limited. All rights reserved. Copyright (c) 2018, Linaro Limited. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "OemConfig.h" OEM_CONFIG_CALLBACK_DATA mOemConfigPrivate = { OEM_CONFIG_CALLBACK_DATA_SIGNATURE, NULL, NULL, { OemExtractConfig, OemRouteConfig, OemCallback } }; HII_VENDOR_DEVICE_PATH mOemHiiVendorDevicePath = { { { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { (UINT8) (sizeof (VENDOR_DEVICE_PATH)), (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) } }, { 0x874c4dcb, 0x08ec, 0x4fe6, { 0xb5, 0x8e, 0x3a, 0x9e, 0x1c, 0x26, 0x70, 0xb9 } } }, { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { (UINT8) (END_DEVICE_PATH_LENGTH), (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8) } } }; /** This function allows a caller to extract the current configuration for one or more named elements from the target driver. @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. @param Request A null-terminated Unicode string in format. @param Progress On return, points to a character in the Request string. Points to the string's null terminator if request was successful. Points to the most recent '&' before the first failing name/value pair (or the beginning of the string if the failure is in the first name/value pair) if the request was not successful. @param Results A null-terminated Unicode string in format which has all values filled in for the names in the Request string. String to be allocated by the called function. @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name. @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver. **/ EFI_STATUS EFIAPI OemExtractConfig ( IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN CONST EFI_STRING Request, OUT EFI_STRING *Progress, OUT EFI_STRING *Results ) { if (Progress == NULL || Results == NULL) { return EFI_INVALID_PARAMETER; } *Progress = Request; return EFI_NOT_FOUND; } /** This function processes the results of changes in configuration. @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. @param Configuration A null-terminated Unicode string in format. @param Progress A pointer to a string filled in with the offset of the most recent '&' before the first failing name/value pair (or the beginning of the string if the failure is in the first name/value pair) or the terminating NULL if all was successful. @retval EFI_INVALID_PARAMETER Configuration is NULL. @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver. **/ EFI_STATUS EFIAPI OemRouteConfig ( IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN CONST EFI_STRING Configuration, OUT EFI_STRING *Progress ) { if (Configuration == NULL || Progress == NULL) { return EFI_INVALID_PARAMETER; } *Progress = Configuration; return EFI_NOT_FOUND; } /** This function is invoked if user selected a interactive opcode from Device Manager's Formset. If user set VBIOS, the new value is saved to EFI variable. @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. @param Action Specifies the type of action taken by the browser. @param QuestionId A unique value which is sent to the original exporting driver so that it can identify the type of data to expect. @param Type The type of value for the question. @param Value A pointer to the data being sent to the original exporting driver. @param ActionRequest On return, points to the action requested by the callback function. @retval EFI_SUCCESS The callback successfully handled the action. @retval EFI_INVALID_PARAMETER The setup browser call this function with invalid parameters. **/ EFI_STATUS EFIAPI OemCallback ( IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN EFI_BROWSER_ACTION Action, IN EFI_QUESTION_ID QuestionId, IN UINT8 Type, IN EFI_IFR_TYPE_VALUE *Value, OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest ) { if (Action != EFI_BROWSER_ACTION_CHANGING) { // // Do nothing for other UEFI Action. Only do call back when data is changed. // return EFI_UNSUPPORTED; } if ((Value == NULL) || (ActionRequest == NULL)) { return EFI_INVALID_PARAMETER; } return EFI_SUCCESS; } /** Install Boot Manager Menu driver. @param ImageHandle The image handle. @param SystemTable The system table. @retval EFI_SUCEESS Install Boot manager menu success. @retval Other Return error status. **/ EFI_STATUS EFIAPI OemConfigUiLibConstructor ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; OEM_CONFIG_DATA Configuration; VOID *Hob; VERSION_INFO *VersionInfo; UINTN BufSize; BOOLEAN Action; EFI_STRING ConfigRequestHdr; EFI_TIME Time = {0}; CHAR16 TmpString[0x100] = {0}; mOemConfigPrivate.DriverHandle = NULL; Status = gBS->InstallMultipleProtocolInterfaces ( &mOemConfigPrivate.DriverHandle, &gEfiDevicePathProtocolGuid, &mOemHiiVendorDevicePath, &gEfiHiiConfigAccessProtocolGuid, &mOemConfigPrivate.ConfigAccess, NULL ); if (EFI_ERROR (Status)) { return Status; } // // Publish our HII data. // mOemConfigPrivate.HiiHandle = HiiAddPackages ( &gOemConfigGuid, mOemConfigPrivate.DriverHandle, OemConfigVfrBin, OemConfigUiLibStrings, NULL ); if (mOemConfigPrivate.HiiHandle == NULL) { DEBUG ((DEBUG_ERROR, "%a Fail to Add Oem Hii Package.\n", __FUNCTION__)); return EFI_INVALID_PARAMETER; } // //BIOS Build Time Init // Hob = GetFirstGuidHob (&gVersionInfoHobGuid); if (Hob == NULL) { DEBUG ((DEBUG_ERROR, "[%a]:[%d] Version information HOB not found!\n", __FILE__, __LINE__)); return EFI_NOT_FOUND; } VersionInfo = GET_GUID_HOB_DATA (Hob); Time = VersionInfo->BuildTime; UnicodeSPrint ( TmpString, sizeof (TmpString), L"%02d/%02d/%04d %02d:%02d", Time.Month, Time.Day, Time.Year, Time.Hour, Time.Minute ); HiiSetString ( mOemConfigPrivate.HiiHandle, STRING_TOKEN (STR_MISC_BIOS_BUILDTIME), TmpString, "en-US" ); // // Check Oem Config Variable. // ConfigRequestHdr = HiiConstructConfigHdr ( &gOemConfigGuid, OEM_CONFIG_NAME, mOemConfigPrivate.DriverHandle ); ZeroMem (&Configuration, sizeof (OEM_CONFIG_DATA)); BufSize = sizeof (OEM_CONFIG_DATA); Status = gRT->GetVariable ( OEM_CONFIG_NAME, &gOemConfigGuid, NULL, &BufSize, &Configuration ); if (EFI_ERROR (Status)) { Action = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD); if (!Action) { // //Set the default value of the DDR option // Configuration.DdrDebugLevel = 0; Configuration.DdrFreqLimit = 0; Configuration.DdrRefreshSupport = 0; Configuration.DdrRefreshRate = 0; Configuration.RankMargin = 0; Configuration.RankMarginMode = 2; Configuration.rmtPatternLength = 256; Configuration.perbitmargin = 0x0; Configuration.CaMargin = 0x0; Configuration.CaVrefMarginOption = 0x0; Configuration.NumaEn = 1; Configuration.HwMemTest = 0; Configuration.DieInterleaving = 0; Configuration.ChannelInterleaving = 1; Configuration.RankInterleaving = 2; Configuration.EccSupport = 0; // //Set the default value of the BMC option // Configuration.BmcWdtEnable = 0; Configuration.BmcWdtTimeout = 15; Configuration.BmcWdtAction = 1; Configuration.OSWdtEnable = 0; Configuration.OSWdtTimeout = 5; Configuration.OSWdtAction = 1; // //Set the default value of the Misc option // Configuration.EnableSmmu = 1; Configuration.EnableFdtTable = 0; Configuration.EnableGOP = 0; // //Set the default value of the Ras option // Configuration.EnRasSupport = 1; Configuration.EnPoison = 1; Configuration.CheckAlgorithm = 0; Configuration.PatrolScrub = 1; Configuration.PatrolScrubDuration = 24; Configuration.DemandScrubMode = 0; Configuration.CorrectErrorThreshold = 0; Configuration.AdvanceDeviceCorrection = 0; Configuration.RankSparing = 0; Configuration.FunnelPeriod = 0; Configuration.DpcFeature = 0; Configuration.EcrcFeature = 0; Configuration.CompletionTimeout = 1; Configuration.CompletionTimeoutValue = 0; Configuration.HotPlug = 1; Status = gRT->SetVariable ( OEM_CONFIG_NAME, &gOemConfigGuid, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, sizeof (OEM_CONFIG_DATA), &Configuration ); } } else { Action = HiiValidateSettings (ConfigRequestHdr); if (!Action) { return EFI_INVALID_PARAMETER; } } return EFI_SUCCESS; } /** Unloads the application and its installed protocol. @param ImageHandle Handle that identifies the image to be unloaded. @param SystemTable The system table. @retval EFI_SUCCESS The image has been unloaded. **/ EFI_STATUS EFIAPI OemConfigUiLibDestructor ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; Status = gBS->UninstallMultipleProtocolInterfaces ( mOemConfigPrivate.DriverHandle, &gEfiDevicePathProtocolGuid, &mOemHiiVendorDevicePath, &gEfiHiiConfigAccessProtocolGuid, &mOemConfigPrivate.ConfigAccess, NULL ); HiiRemovePackages (mOemConfigPrivate.HiiHandle); return Status; }