diff --git a/IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/DriverDiagnostics.c b/IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/DriverDiagnostics.c index 8aa6d05712..f3f649c163 100644 --- a/IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/DriverDiagnostics.c +++ b/IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/DriverDiagnostics.c @@ -18,11 +18,19 @@ // // EFI Driver Diagnostics Protocol // -EFI_DRIVER_DIAGNOSTICS_PROTOCOL gIDEBusDriverDiagnostics = { +GLOBAL_REMOVE_IF_UNREFERENCED EFI_DRIVER_DIAGNOSTICS_PROTOCOL gIDEBusDriverDiagnostics = { IDEBusDriverDiagnosticsRunDiagnostics, "eng" }; +// +// EFI Driver Diagnostics 2 Protocol +// +GLOBAL_REMOVE_IF_UNREFERENCED EFI_DRIVER_DIAGNOSTICS2_PROTOCOL gIDEBusDriverDiagnostics2 = { + (EFI_DRIVER_DIAGNOSTICS2_RUN_DIAGNOSTICS) IDEBusDriverDiagnosticsRunDiagnostics, + "en" +}; + /** Runs diagnostics on a controller. @@ -98,6 +106,49 @@ IDEBusDriverDiagnosticsRunDiagnostics ( IDE_BLK_IO_DEV *IdeBlkIoDevice; UINT32 VendorDeviceId; VOID *BlockBuffer; + CHAR8 *SupportedLanguages; + BOOLEAN Iso639Language; + BOOLEAN Found; + UINTN Index; + + if (Language == NULL || + ErrorType == NULL || + Buffer == NULL || + ControllerHandle == NULL || + BufferSize == NULL) { + + return EFI_INVALID_PARAMETER; + } + + SupportedLanguages = This->SupportedLanguages; + Iso639Language = (BOOLEAN)(This == &gIDEBusDriverDiagnostics); + // + // Make sure Language is in the set of Supported Languages + // + Found = FALSE; + while (*SupportedLanguages != 0) { + if (Iso639Language) { + if (CompareMem (Language, SupportedLanguages, 3) == 0) { + Found = TRUE; + break; + } + SupportedLanguages += 3; + } else { + for (Index = 0; SupportedLanguages[Index] != 0 && SupportedLanguages[Index] != ';'; Index++); + if (AsciiStrnCmp(SupportedLanguages, Language, Index) == 0) { + Found = TRUE; + break; + } + SupportedLanguages += Index; + for (; *SupportedLanguages != 0 && *SupportedLanguages == ';'; SupportedLanguages++); + } + } + // + // If Language is not a member of SupportedLanguages, then return EFI_UNSUPPORTED + // + if (!Found) { + return EFI_UNSUPPORTED; + } *ErrorType = NULL; *BufferSize = 0; diff --git a/IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/idebus.c b/IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/idebus.c index 48c2184696..666b81768c 100644 --- a/IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/idebus.c +++ b/IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/idebus.c @@ -1419,13 +1419,16 @@ InitializeIdeBus( // // Install driver model protocol(s). // - Status = EfiLibInstallDriverBindingComponentName2 ( + Status = EfiLibInstallAllDriverProtocols2 ( ImageHandle, SystemTable, &gIDEBusDriverBinding, ImageHandle, &gIDEBusComponentName, - &gIDEBusComponentName2 + &gIDEBusComponentName2, + NULL, + &gIDEBusDriverDiagnostics, + &gIDEBusDriverDiagnostics2 ); ASSERT_EFI_ERROR (Status); diff --git a/IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/idebus.h b/IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/idebus.h index 9c6e41bc95..da7a03f71b 100644 --- a/IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/idebus.h +++ b/IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/idebus.h @@ -111,7 +111,9 @@ typedef struct { // // Global Variables // -extern EFI_DRIVER_BINDING_PROTOCOL gIDEBusDriverBinding; +extern EFI_DRIVER_BINDING_PROTOCOL gIDEBusDriverBinding; +extern EFI_DRIVER_DIAGNOSTICS_PROTOCOL gIDEBusDriverDiagnostics; +extern EFI_DRIVER_DIAGNOSTICS2_PROTOCOL gIDEBusDriverDiagnostics2; #include "ide.h"