|
@@ -0,0 +1,362 @@
|
|
|
+/** @file
|
|
|
+The OEM config reference implementation
|
|
|
+
|
|
|
+Copyright (c) 2018, Hisilicon Limited. All rights reserved.
|
|
|
+Copyright (c) 2018, Linaro Limited. All rights reserved.
|
|
|
+This program and the accompanying materials
|
|
|
+are licensed and made available under the terms and conditions of the BSD License
|
|
|
+which accompanies this distribution. The full text of the license may be found at
|
|
|
+http://opensource.org/licenses/bsd-license.php
|
|
|
+
|
|
|
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
|
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
+
|
|
|
+**/
|
|
|
+
|
|
|
+#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 <ConfigRequest> 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 <ConfigAltResp> 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 <ConfigResp> 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;
|
|
|
+ //
|
|
|
+ //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;
|
|
|
+}
|
|
|
+
|