/** @file\r
\r
- A UI application to offer a UI interface in device manager to let user configue\r
+ A UI application to offer a UI interface in device manager to let user configure\r
platform override protocol to override the default algorithm for matching\r
drivers to controllers.\r
\r
#include <Protocol/ComponentName.h>\r
#include <Protocol/DriverBinding.h>\r
#include <Protocol/DevicePathToText.h>\r
-#include <Guid/GlobalVariable.h>\r
+#include <Protocol/DevicePath.h>\r
\r
+#include <Library/DevicePathLib.h>\r
#include <Library/BaseLib.h>\r
#include <Library/DebugLib.h>\r
#include <Library/UefiLib.h>\r
#include <Library/PlatformDriverOverrideLib.h>\r
#include <Library/HiiLib.h>\r
#include <Library/IfrSupportLib.h>\r
-#include <Library/ExtendedHiiLib.h>\r
#include <Library/ExtendedIfrSupportLib.h>\r
#include <Library/BaseMemoryLib.h>\r
#include <Library/MemoryAllocationLib.h>\r
-#include <Library/UefiRuntimeServicesTableLib.h>\r
#include <Library/DevicePathLib.h>\r
#include "PlatOverMngr.h"\r
\r
EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;\r
} EFI_CALLBACK_INFO;\r
\r
+#pragma pack(1)\r
+\r
+///\r
+/// HII specific Vendor Device Path definition.\r
+///\r
+typedef struct {\r
+ VENDOR_DEVICE_PATH VendorDevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL End;\r
+} HII_VENDOR_DEVICE_PATH;\r
+\r
+#pragma pack()\r
+\r
//\r
// uni string and Vfr Binary data.\r
//\r
EFI_DEVICE_PATH_PROTOCOL *mControllerDevicePathProtocol[MAX_CHOICE_NUM];\r
UINTN mSelectedDriverImageNum;\r
UINTN mLastSavedDriverImageNum;\r
-CHAR8 mLanguage[RFC_3066_ENTRY_SIZE];\r
UINT16 mCurrentPage;\r
\r
+HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath = {\r
+ {\r
+ {\r
+ HARDWARE_DEVICE_PATH,\r
+ HW_VENDOR_DP,\r
+ {\r
+ (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
+ (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
+ }\r
+ },\r
+ //\r
+ // {99936717-BF3D-4b04-9787-76CEE324D76F}\r
+ //\r
+ { 0x99936717, 0xbf3d, 0x4b04, { 0x97, 0x87, 0x76, 0xce, 0xe3, 0x24, 0xd7, 0x6f } }\r
+ },\r
+ {\r
+ END_DEVICE_PATH_TYPE,\r
+ END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+ { \r
+ (UINT8) (END_DEVICE_PATH_LENGTH),\r
+ (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
+ }\r
+ }\r
+};\r
+\r
/**\r
Converting a given device to an unicode string. \r
\r
);\r
\r
/**\r
- Do string convertion for the ComponentName supported language. It do\r
- the convertion just for english language code from RFC 3066 to ISO 639-2.\r
- Then it will check whether the converted language is in the supported language list.\r
- If not supported, NULL is returned.\r
- If Language is not english, NULL is returned.\r
+ Worker function to get the driver name by ComponentName or ComponentName2 protocol \r
+ according to the driver binding handle.\r
\r
- @param SupportedLanguages Pointer to ComponentName supported language string list. ISO 639-2 language\r
- @param Language The language string. RFC 3066 language\r
+ @param DriverBindingHandle The Handle of DriverBinding.\r
+ @param ProtocolGuid The pointer to Component Name (2) protocol GUID.\r
+ @param VariableName The name of the RFC 4646 or ISO 639-2 language variable.\r
\r
- @return English language string (ISO 639-2)\r
- @return NULL if the conertion is not successful.\r
+ @retval !NULL Pointer into the image name if the image name is found,\r
+ @retval NULL Pointer to NULL if the image name is not found.\r
\r
**/\r
-CHAR8 *\r
-ConvertComponentNameSupportLanguage (\r
- IN CHAR8 *SupportedLanguages,\r
- IN CHAR8 *Language\r
+CHAR16 *\r
+GetComponentNameWorker (\r
+ IN EFI_HANDLE DriverBindingHandle,\r
+ IN EFI_GUID *ProtocolGuid,\r
+ IN CONST CHAR16 *VariableName\r
)\r
{\r
- CHAR8 *LangCode;\r
- LangCode = NULL;\r
+ EFI_STATUS Status;\r
+ EFI_COMPONENT_NAME_PROTOCOL *ComponentName;\r
+ CHAR16 *DriverName;\r
+ CHAR8 *Language;\r
+ CHAR8 *BestLanguage;\r
\r
- //\r
- // Check the input language is English\r
- //\r
- if (AsciiStrnCmp (Language, "en-", 3) != 0) {\r
+ Status = gBS->OpenProtocol (\r
+ DriverBindingHandle,\r
+ ProtocolGuid,\r
+ (VOID *) &ComponentName,\r
+ NULL,\r
+ NULL,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
return NULL;\r
}\r
- \r
+\r
//\r
- // Check SupportedLanguages format\r
+ // Find the best matching language.\r
//\r
- if (AsciiStrStr (SupportedLanguages, "en-") != NULL) {\r
- //\r
- // Create RFC 3066 language\r
- //\r
- LangCode = AllocateZeroPool(AsciiStrSize (Language));\r
- AsciiStrCpy (LangCode, Language);\r
- } else if (AsciiStrStr (SupportedLanguages, "en") != NULL) {\r
- //\r
- // Create ISO 639-2 Language\r
- //\r
- LangCode = AllocateZeroPool(4);\r
- AsciiStrCpy (LangCode, "eng"); \r
+ Language = GetEfiGlobalVariable (VariableName);\r
+ BestLanguage = GetBestLanguage (\r
+ ComponentName->SupportedLanguages,\r
+ (BOOLEAN) (ProtocolGuid == &gEfiComponentNameProtocolGuid),\r
+ Language,\r
+ NULL\r
+ );\r
+\r
+ DriverName = NULL;\r
+ if (BestLanguage != NULL) {\r
+ ComponentName->GetDriverName (\r
+ ComponentName,\r
+ BestLanguage,\r
+ &DriverName\r
+ );\r
+ FreePool (BestLanguage);\r
}\r
- \r
- return LangCode;\r
+\r
+ if (Language != NULL) {\r
+ FreePool (Language);\r
+ }\r
+\r
+ return DriverName;\r
}\r
\r
+\r
/**\r
Get the driver name by ComponentName or ComponentName2 protocol \r
according to the driver binding handle\r
IN EFI_HANDLE DriverBindingHandle\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_COMPONENT_NAME_PROTOCOL *ComponentName;\r
- EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;\r
- CHAR8 *SupportedLanguage;\r
- CHAR16 *DriverName;\r
-\r
- ComponentName = NULL;\r
- ComponentName2 = NULL;\r
- Status = gBS->OpenProtocol (\r
- DriverBindingHandle,\r
- &gEfiComponentName2ProtocolGuid,\r
- (VOID **) &ComponentName2,\r
- NULL,\r
- NULL,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- if (EFI_ERROR(Status)) {\r
- Status = gBS->OpenProtocol (\r
- DriverBindingHandle,\r
- &gEfiComponentNameProtocolGuid,\r
- (VOID **) &ComponentName,\r
- NULL,\r
- NULL,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- }\r
+ CHAR16 *DriverName;\r
\r
- Status = EFI_SUCCESS;\r
- DriverName = NULL;\r
- if (ComponentName != NULL) {\r
- if (ComponentName->GetDriverName != NULL) {\r
- SupportedLanguage = ConvertComponentNameSupportLanguage (ComponentName->SupportedLanguages, mLanguage);\r
- if (SupportedLanguage != NULL) {\r
- Status = ComponentName->GetDriverName (\r
- ComponentName,\r
- SupportedLanguage,\r
- &DriverName\r
- );\r
- FreePool (SupportedLanguage);\r
- }\r
- }\r
- } else if (ComponentName2 != NULL) {\r
- if (ComponentName2->GetDriverName != NULL) {\r
- Status = ComponentName2->GetDriverName (\r
- ComponentName2,\r
- mLanguage,\r
- &DriverName\r
- );\r
- }\r
- }\r
-\r
- if (EFI_ERROR (Status)) {\r
- return NULL;\r
+ //\r
+ // Try RFC 4646 Component Name 2 protocol first.\r
+ //\r
+ DriverName = GetComponentNameWorker (DriverBindingHandle, &gEfiComponentName2ProtocolGuid, L"PlatformLang");\r
+ if (DriverName == NULL) {\r
+ //\r
+ // If we can not get driver name from Component Name 2 protocol, we can try ISO 639-2 Component Name protocol. \r
+ //\r
+ DriverName = GetComponentNameWorker (DriverBindingHandle, &gEfiComponentNameProtocolGuid, L"Lang");\r
}\r
\r
return DriverName;\r
\r
/**\r
Get the image name from EFI UI section.\r
- Get FV protocol by its loaded image protoocl to abastract EFI UI section.\r
+ Get FV protocol by its loaded image protocol to abstract EFI UI section.\r
\r
@param Image Pointer to the loaded image protocol\r
\r
{\r
EFI_HII_UPDATE_DATA UpdateData;\r
EFI_STATUS Status;\r
- UINTN LangSize;\r
UINTN Index;\r
UINTN DevicePathHandleCount;\r
CHAR16 *NewString;\r
//\r
mCurrentPage = FORM_ID_DEVICE; \r
\r
- //\r
- // Get Platform supported Language (RFC_3066 format)\r
- //\r
- LangSize = RFC_3066_ENTRY_SIZE;\r
- Status = gRT->GetVariable (\r
- L"PlatformLang",\r
- &gEfiGlobalVariableGuid,\r
- NULL,\r
- &LangSize,\r
- mLanguage\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
//\r
// Initial the mapping database in memory\r
//\r
Status = CommintChanges (Private, KeyValue, FakeNvData);\r
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
if (EFI_ERROR (Status)) {\r
- IfrLibCreatePopUp (1, &Key, L"Single Override Info too large, Saving Error!");\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Single Override Info too large, Saving Error!", NULL);\r
return EFI_DEVICE_ERROR;\r
}\r
}\r
EFI_HII_DATABASE_PROTOCOL *HiiDatabase;\r
EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
EFI_CALLBACK_INFO *CallbackInfo;\r
- EFI_HANDLE DriverHandle;\r
- EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2;\r
+ EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2;\r
\r
//\r
// There should only be one HII protocol\r
CallbackInfo->ConfigAccess.Callback = PlatOverMngrCallback;\r
\r
//\r
- // Create driver handle used by HII database\r
- //\r
- Status = HiiLibCreateHiiDriverHandle (&DriverHandle);\r
- if (EFI_ERROR (Status)) {\r
- goto Finish;\r
- }\r
- CallbackInfo->DriverHandle = DriverHandle;\r
-\r
- //\r
- // Install Config Access protocol to driver handle\r
+ // Install Device Path Protocol and Config Access protocol to driver handle\r
//\r
- Status = gBS->InstallProtocolInterface (\r
- &DriverHandle,\r
+ Status = gBS->InstallMultipleProtocolInterfaces (\r
+ &CallbackInfo->DriverHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ &mHiiVendorDevicePath,\r
&gEfiHiiConfigAccessProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &CallbackInfo->ConfigAccess\r
+ &CallbackInfo->ConfigAccess,\r
+ NULL\r
);\r
if (EFI_ERROR (Status)) {\r
goto Finish;\r
Status = HiiDatabase->NewPackageList (\r
HiiDatabase,\r
PackageList,\r
- DriverHandle,\r
+ CallbackInfo->DriverHandle,\r
&CallbackInfo->RegisteredHandle\r
);\r
FreePool (PackageList);\r
\r
Finish:\r
if (CallbackInfo->DriverHandle != NULL) {\r
- HiiLibDestroyHiiDriverHandle (CallbackInfo->DriverHandle);\r
+ gBS->UninstallMultipleProtocolInterfaces (\r
+ CallbackInfo->DriverHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ &mHiiVendorDevicePath,\r
+ &gEfiHiiConfigAccessProtocolGuid,\r
+ &CallbackInfo->ConfigAccess,\r
+ NULL\r
+ );\r
}\r
if (CallbackInfo != NULL) {\r
FreePool (CallbackInfo);\r