A sample driver produces driver health protocol. This driver use DiskIO driver as...
authorgikidy <gikidy@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 4 Dec 2009 03:49:48 +0000 (03:49 +0000)
committergikidy <gikidy@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 4 Dec 2009 03:49:48 +0000 (03:49 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9516 6f19259b-4bc3-4df7-8a09-765794883524

OptionRomPkg/DriverHealthDxe/ComponentName.c [new file with mode: 0644]
OptionRomPkg/DriverHealthDxe/DriverHealthDxe.c [new file with mode: 0644]
OptionRomPkg/DriverHealthDxe/DriverHealthDxe.h [new file with mode: 0644]
OptionRomPkg/DriverHealthDxe/DriverHealthDxe.inf [new file with mode: 0644]
OptionRomPkg/DriverHealthDxe/DriverHealthStrings.uni [new file with mode: 0644]
OptionRomPkg/DriverHealthDxe/DriverHealthVfr.Vfr [new file with mode: 0644]
OptionRomPkg/DriverHealthDxe/NVDataStruc.h [new file with mode: 0644]
OptionRomPkg/OptionRomPkg.dsc

diff --git a/OptionRomPkg/DriverHealthDxe/ComponentName.c b/OptionRomPkg/DriverHealthDxe/ComponentName.c
new file mode 100644 (file)
index 0000000..546f1e6
--- /dev/null
@@ -0,0 +1,269 @@
+/** @file\r
+  UEFI Component Name(2) protocol implementation for DiskIo driver.\r
+\r
+Copyright (c) 2006 - 2009, Intel Corporation. <BR>\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "DriverHealthDxe.h"\r
+\r
+#define DISK_IO_CONTRORLLER_NAME  "Disk Io Controller # "\r
+\r
+//\r
+// EFI Component Name Protocol\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL  gDiskIoComponentName = {\r
+  DiskIoComponentNameGetDriverName,\r
+  DiskIoComponentNameGetControllerName,\r
+  "eng"\r
+};\r
+\r
+//\r
+// EFI Component Name 2 Protocol\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gDiskIoComponentName2 = {\r
+  (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) DiskIoComponentNameGetDriverName,\r
+  (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) DiskIoComponentNameGetControllerName,\r
+  "en"\r
+};\r
+\r
+//\r
+// Driver name table for DiskIo module.\r
+// It is shared by the implementation of ComponentName & ComponentName2 Protocol.\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mDiskIoDriverNameTable[] = {\r
+  {\r
+    "eng;en",\r
+    (CHAR16 *)L"Generic Disk I/O Driver"\r
+  },\r
+  {\r
+    NULL,\r
+    NULL\r
+  }\r
+};\r
+\r
+\r
+\r
+/**\r
+  Retrieves a Unicode string that is the user readable name of the driver.\r
+\r
+  This function retrieves the user readable name of a driver in the form of a\r
+  Unicode string. If the driver specified by This has a user readable name in\r
+  the language specified by Language, then a pointer to the driver name is\r
+  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified\r
+  by This does not support the language specified by Language,\r
+  then EFI_UNSUPPORTED is returned.\r
+\r
+  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
+                                EFI_COMPONENT_NAME_PROTOCOL instance.\r
+\r
+  @param  Language[in]          A pointer to a Null-terminated ASCII string\r
+                                array indicating the language. This is the\r
+                                language of the driver name that the caller is\r
+                                requesting, and it must match one of the\r
+                                languages specified in SupportedLanguages. The\r
+                                number of languages supported by a driver is up\r
+                                to the driver writer. Language is specified\r
+                                in RFC 4646 or ISO 639-2 language code format.\r
+\r
+  @param  DriverName[out]       A pointer to the Unicode string to return.\r
+                                This Unicode string is the name of the\r
+                                driver specified by This in the language\r
+                                specified by Language.\r
+\r
+  @retval EFI_SUCCESS           The Unicode string for the Driver specified by\r
+                                This and the language specified by Language was\r
+                                returned in DriverName.\r
+\r
+  @retval EFI_INVALID_PARAMETER Language is NULL.\r
+\r
+  @retval EFI_INVALID_PARAMETER DriverName is NULL.\r
+\r
+  @retval EFI_UNSUPPORTED       The driver specified by This does not support\r
+                                the language specified by Language.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoComponentNameGetDriverName (\r
+  IN  EFI_COMPONENT_NAME_PROTOCOL  *This,\r
+  IN  CHAR8                        *Language,\r
+  OUT CHAR16                       **DriverName\r
+  )\r
+{\r
+  return LookupUnicodeString2 (\r
+           Language,\r
+           This->SupportedLanguages,\r
+           mDiskIoDriverNameTable,\r
+           DriverName,\r
+           (BOOLEAN)(This == &gDiskIoComponentName)\r
+           );\r
+}\r
+\r
+\r
+\r
+/**\r
+  Retrieves a Unicode string that is the user readable name of the controller\r
+  that is being managed by a driver.\r
+\r
+  This function retrieves the user readable name of the controller specified by\r
+  ControllerHandle and ChildHandle in the form of a Unicode string. If the\r
+  driver specified by This has a user readable name in the language specified by\r
+  Language, then a pointer to the controller name is returned in ControllerName,\r
+  and EFI_SUCCESS is returned.  If the driver specified by This is not currently\r
+  managing the controller specified by ControllerHandle and ChildHandle,\r
+  then EFI_UNSUPPORTED is returned.  If the driver specified by This does not\r
+  support the language specified by Language, then EFI_UNSUPPORTED is returned.\r
+\r
+  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
+                                EFI_COMPONENT_NAME_PROTOCOL instance.\r
+\r
+  @param  ControllerHandle[in]  The handle of a controller that the driver\r
+                                specified by This is managing.  This handle\r
+                                specifies the controller whose name is to be\r
+                                returned.\r
+\r
+  @param  ChildHandle[in]       The handle of the child controller to retrieve\r
+                                the name of.  This is an optional parameter that\r
+                                may be NULL.  It will be NULL for device\r
+                                drivers.  It will also be NULL for a bus drivers\r
+                                that wish to retrieve the name of the bus\r
+                                controller.  It will not be NULL for a bus\r
+                                driver that wishes to retrieve the name of a\r
+                                child controller.\r
+\r
+  @param  Language[in]          A pointer to a Null-terminated ASCII string\r
+                                array indicating the language.  This is the\r
+                                language of the driver name that the caller is\r
+                                requesting, and it must match one of the\r
+                                languages specified in SupportedLanguages. The\r
+                                number of languages supported by a driver is up\r
+                                to the driver writer. Language is specified in\r
+                                RFC 4646 or ISO 639-2 language code format.\r
+\r
+  @param  ControllerName[out]   A pointer to the Unicode string to return.\r
+                                This Unicode string is the name of the\r
+                                controller specified by ControllerHandle and\r
+                                ChildHandle in the language specified by\r
+                                Language from the point of view of the driver\r
+                                specified by This.\r
+\r
+  @retval EFI_SUCCESS           The Unicode string for the user readable name in\r
+                                the language specified by Language for the\r
+                                driver specified by This was returned in\r
+                                DriverName.\r
+\r
+  @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.\r
+\r
+  @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid\r
+                                EFI_HANDLE.\r
+\r
+  @retval EFI_INVALID_PARAMETER Language is NULL.\r
+\r
+  @retval EFI_INVALID_PARAMETER ControllerName is NULL.\r
+\r
+  @retval EFI_UNSUPPORTED       The driver specified by This is not currently\r
+                                managing the controller specified by\r
+                                ControllerHandle and ChildHandle.\r
+\r
+  @retval EFI_UNSUPPORTED       The driver specified by This does not support\r
+                                the language specified by Language.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoComponentNameGetControllerName (\r
+  IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,\r
+  IN  EFI_HANDLE                                      ControllerHandle,\r
+  IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,\r
+  IN  CHAR8                                           *Language,\r
+  OUT CHAR16                                          **ControllerName\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  EFI_DISK_IO_PROTOCOL    *DiskIo;\r
+  DISK_IO_PRIVATE_DATA    *Private;\r
+\r
+  //\r
+  // This is a device driver, so ChildHandle must be NULL.\r
+  //\r
+  if (ChildHandle != NULL) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+  //\r
+  // Make sure this driver is currently managing ControllerHandle\r
+  //\r
+  Status = EfiTestManagedDevice (\r
+             ControllerHandle,\r
+             gDiskIoDriverBinding.DriverBindingHandle,\r
+             &gEfiBlockIoProtocolGuid\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+  //\r
+  // Get the Block I/O Protocol on Controller\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  ControllerHandle,\r
+                  &gEfiDiskIoProtocolGuid,\r
+                  (VOID **) &DiskIo,\r
+                  gDiskIoDriverBinding.DriverBindingHandle,\r
+                  ControllerHandle,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+  //\r
+  // Get the Serial Controller's Device structure\r
+  //\r
+  Private = DISK_IO_PRIVATE_DATA_FROM_THIS (DiskIo);\r
+\r
+  return LookupUnicodeString2 (\r
+           Language,\r
+           This->SupportedLanguages,\r
+           Private->ControllerNameTable,\r
+           ControllerName,\r
+           (BOOLEAN)(This == &gDiskIoComponentName)\r
+           );\r
+}\r
+\r
+/**\r
+  Add the ISO639-2 and RFC4646 component name both for the Disk IO device\r
+\r
+  @param DiskIoDevice     A pointer to the DISK_IO_PRIVATE_DATA instance.\r
+\r
+**/\r
+VOID\r
+AddName (\r
+  IN  DISK_IO_PRIVATE_DATA                     *DiskIoDevice\r
+  )\r
+{\r
+  CHAR16  DiskIoControllerName[sizeof (DISK_IO_CONTRORLLER_NAME)];\r
+\r
+  StrCpy (DiskIoControllerName, L"Disk Io Controller # ");\r
+  DiskIoControllerName[sizeof (DISK_IO_CONTRORLLER_NAME) - 2] = (CHAR16) (L'0' + DiskIoDevice->ControllerIndex);\r
+  AddUnicodeString2 (\r
+    "eng",\r
+    gDiskIoComponentName.SupportedLanguages,\r
+    &DiskIoDevice->ControllerNameTable,\r
+    (CHAR16 *) DiskIoControllerName,\r
+    TRUE\r
+    );\r
+  AddUnicodeString2 (\r
+    "en",\r
+    gDiskIoComponentName2.SupportedLanguages,\r
+    &DiskIoDevice->ControllerNameTable,\r
+    (CHAR16 *) DiskIoControllerName,\r
+    FALSE\r
+    );\r
+\r
+}\r
diff --git a/OptionRomPkg/DriverHealthDxe/DriverHealthDxe.c b/OptionRomPkg/DriverHealthDxe/DriverHealthDxe.c
new file mode 100644 (file)
index 0000000..5f56cfb
--- /dev/null
@@ -0,0 +1,1961 @@
+/** @file\r
+  DiskIo driver that lays on every BlockIo protocol in the system.\r
+  DiskIo converts a block oriented device to a byte oriented device.\r
+\r
+  Disk access may have to handle unaligned request about sector boundaries.\r
+  There are three cases:\r
+    UnderRun - The first byte is not on a sector boundary or the read request is\r
+               less than a sector in length.\r
+    Aligned  - A read of N contiguous sectors.\r
+    OverRun  - The last byte is not on a sector boundary.\r
+\r
+Copyright (c) 2006 - 2009, Intel Corporation. <BR>\r
+  All rights reserved. This program and the accompanying materials                          \r
+  are licensed and made available under the terms and conditions of the BSD License         \r
+  which accompanies this distribution.  The full text of the license may be found at        \r
+  http://opensource.org/licenses/bsd-license.php                                            \r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+\r
+**/\r
+\r
+#include "DriverHealthDxe.h"\r
+\r
+#undef STRING_TOKEN\r
+#define STRING_TOKEN(x) 0\r
+\r
+extern EFI_GUID gEfiCallerIdGuid;\r
+\r
+CHAR16 VariableName[]    = L"Config";\r
+UINTN  mNumNotHealthy = 0;\r
+UINT8  ControllerIndex = 0;\r
+\r
+//\r
+// Link used to store the controller health status\r
+//\r
+LIST_ENTRY  mControllerList = {NULL, NULL};\r
+\r
+//\r
+// 0           - Healthy -> {0}\r
+// 1           - Health with warning messages -> {1}\r
+// 2           - Failed -> {2}\r
+// 3           - Failed with error messages -> {3}\r
+// 4           - RebootRequired -> {4}\r
+// 5           - RebootRequired with messages -> {5}\r
+// 6           - ReconnectRequired -> {6}\r
+// 7           - ReconnectRequired with messages -> {7}\r
+// 100..103    - RepairRequired -> {0..3}\r
+// 104..107    - RepairRequired with error messages -> {0..3}\r
+// 108..111    - RepairRequired with progress notifications -> {0..3}\r
+// 112..115    - RepairRequired with error messages and progress notifications -> {0..3}\r
+// 132..163    - RepairRequired -> {300..331}\r
+// 164..195    - RepairRequired with error messages -> {300..331}\r
+// 196..227    - RepairRequired with progress notifications -> {300..331}\r
+// 228..259    - RepairRequired with error messages and progress notifications -> {300..331}\r
+// 300..307    - ConfigRequired -> {0..7}\r
+// 308..315    - ConfigRequired with error messages -> {0..7}\r
+// 316..323    - ConfigRequired with forms -> {0..7}\r
+// 324..331    - ConfigRequired with forms and error messages -> {0..7}\r
+// 332..347    - ConfigRequired -> {100..115}\r
+// 348..363    - ConfigRequired with error messages -> {100..115}\r
+// 364..379    - ConfigRequired with forms -> {100.115}\r
+// 380..395    - ConfigRequired with forms and error messages -> {100..115}\r
+\r
+DEVICE_STATE  mDeviceState[] = {\r
+  { TRUE,  308, 000, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  309, 001, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  310, 002, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  311, 003, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  312, 004, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  313, 005, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  314, 006, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  315, 007, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+\r
+  { TRUE,  000, 000, 0,                                       FALSE, EfiDriverHealthStatusHealthy },\r
+  { TRUE,  001, 001, STRING_TOKEN (STR_HEALTHY_WARNING),      FALSE, EfiDriverHealthStatusHealthy },\r
+\r
+  { TRUE,  002, 002, 0,                                       FALSE, EfiDriverHealthStatusFailed },\r
+  { TRUE,  003, 003, STRING_TOKEN (STR_FAILED_ERROR),         FALSE, EfiDriverHealthStatusFailed },\r
+\r
+  { FALSE, 004, 004, 0,                                       FALSE, EfiDriverHealthStatusRebootRequired },\r
+  { FALSE, 005, 005, STRING_TOKEN (STR_REBOOT_REQUIRED),      FALSE, EfiDriverHealthStatusRebootRequired },\r
+\r
+  { FALSE, 006, 006, 0,                                       FALSE, EfiDriverHealthStatusReconnectRequired },\r
+  { FALSE, 007, 007, STRING_TOKEN (STR_RECONNECT_REQUIRED),   FALSE, EfiDriverHealthStatusReconnectRequired },\r
+\r
+  { TRUE,  100, 000, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired },\r
+  { TRUE,  101, 001, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired },\r
+  { TRUE,  102, 002, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired },\r
+  { TRUE,  103, 003, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired },\r
+\r
+  { TRUE,  104, 000, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  105, 001, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  106, 002, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  107, 003, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+\r
+  { TRUE,  108, 000, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired   },\r
+  { TRUE,  109, 001, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired   },\r
+  { TRUE,  110, 002, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired   },\r
+  { TRUE,  111, 003, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired   },\r
+\r
+  { TRUE,  112, 000, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired   },\r
+  { TRUE,  113, 001, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired   },\r
+  { TRUE,  114, 002, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired   },\r
+  { TRUE,  115, 003, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired   },\r
+\r
+  { TRUE,  132, 300, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  133, 301, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  134, 302, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  135, 303, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  136, 304, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  137, 305, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  138, 306, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  139, 307, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  140, 308, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  141, 309, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  142, 310, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  143, 311, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  144, 312, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  145, 313, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  146, 314, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  147, 315, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  148, 316, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  149, 317, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  150, 318, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  151, 319, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  152, 320, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  153, 321, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  154, 322, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  155, 323, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  156, 324, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  157, 325, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  158, 326, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  159, 327, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  160, 328, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  161, 329, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  162, 330, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  163, 331, 0,                                       FALSE, EfiDriverHealthStatusRepairRequired  },\r
+\r
+  { TRUE,  164, 300, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  165, 301, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  166, 302, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  167, 303, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  168, 304, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  169, 305, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  170, 306, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  171, 307, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  172, 308, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  173, 309, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  174, 310, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  175, 311, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  176, 312, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  177, 313, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  178, 314, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  179, 315, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  180, 316, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  181, 317, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  182, 318, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  183, 319, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  184, 320, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  185, 321, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  186, 322, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  187, 323, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  188, 324, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  189, 325, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  190, 326, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  191, 327, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  192, 328, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  193, 329, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  194, 330, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  195, 331, STRING_TOKEN (STR_REPAIR_REQUIRED),      FALSE, EfiDriverHealthStatusRepairRequired  },\r
+\r
+  { TRUE,  196, 300, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  197, 301, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  198, 302, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  199, 303, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  200, 304, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  201, 305, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  202, 306, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  203, 307, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  204, 308, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  205, 309, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  206, 310, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  207, 311, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  208, 312, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  209, 313, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  210, 314, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  211, 315, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  212, 316, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  213, 317, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  214, 318, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  215, 319, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  216, 320, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  217, 321, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  218, 322, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  219, 323, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  220, 324, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  221, 325, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  222, 326, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  223, 327, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  224, 328, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  225, 329, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  226, 330, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  227, 331, 0,                                       TRUE, EfiDriverHealthStatusRepairRequired  },\r
+\r
+  { TRUE,  228, 300, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  229, 301, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  230, 302, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  231, 303, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  232, 304, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  233, 305, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  234, 306, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  235, 307, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  236, 308, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  237, 309, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  238, 310, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  239, 311, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  240, 312, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  241, 313, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  242, 314, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  243, 315, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  244, 316, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  245, 317, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  246, 318, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  247, 319, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  248, 320, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  249, 321, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  250, 322, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  251, 323, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  252, 324, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  253, 325, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  254, 326, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  255, 327, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  256, 328, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  257, 329, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  258, 330, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+  { TRUE,  259, 331, STRING_TOKEN (STR_REPAIR_REQUIRED),      TRUE, EfiDriverHealthStatusRepairRequired  },\r
+\r
+  { TRUE,  300, 000, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  301, 001, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  302, 002, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  303, 003, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  304, 004, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  305, 005, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  306, 006, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  307, 007, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+\r
+  { TRUE,  308, 000, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  309, 001, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  310, 002, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  311, 003, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  312, 004, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  313, 005, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  314, 006, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  315, 007, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+\r
+  { TRUE,  316, 000, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  317, 001, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  318, 002, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  319, 003, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  320, 004, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  321, 005, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  322, 006, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  323, 007, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+\r
+  { TRUE,  324, 000, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  325, 001, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  326, 002, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  327, 003, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  328, 004, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  329, 005, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  330, 006, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  331, 007, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+\r
+  { TRUE,  332, 100, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  333, 101, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  334, 102, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  335, 103, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  336, 104, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  337, 105, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  338, 106, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  339, 107, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  340, 108, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  341, 109, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  342, 110, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  343, 111, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  344, 112, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  345, 113, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  346, 114, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  347, 115, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+\r
+  { TRUE,  348, 100, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  349, 101, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  350, 102, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  351, 103, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  352, 104, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  353, 105, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  354, 106, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  355, 107, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  356, 108, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  357, 109, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  358, 110, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  359, 111, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  360, 112, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  361, 113, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  362, 114, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  363, 115, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+\r
+  { TRUE,  364, 100, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  365, 101, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  366, 102, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  367, 103, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  368, 104, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  369, 105, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  370, 106, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  371, 107, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  372, 108, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  373, 109, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  374, 110, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  375, 111, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  376, 112, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  377, 113, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  378, 114, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  379, 115, 0,                                       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+\r
+  { TRUE,  380, 100, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  381, 101, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  382, 102, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  383, 103, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  384, 104, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  385, 105, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  386, 106, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  387, 107, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  388, 108, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  389, 109, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  390, 110, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  391, 111, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  392, 112, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  393, 113, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  394, 114, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+  { TRUE,  395, 115, STRING_TOKEN (STR_CONFIG_WARNING),       FALSE, EfiDriverHealthStatusConfigurationRequired },\r
+\r
+  { TRUE,  999, 999, 0,                                       FALSE }\r
+};\r
+\r
+HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePathDiskIoDummy = {\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
+      // {C153B68E-EBFC-488e-B110-662867745BBE}\r
+      //\r
+    { 0xc153b68e, 0xebfc, 0x488e, { 0xb1, 0x10, 0x66, 0x28, 0x67, 0x74, 0x5b, 0xbe} }\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
+EFI_HII_HANDLE     mHiiHandle = NULL;\r
+\r
+EFI_DRIVER_BINDING_PROTOCOL gDiskIoDriverBinding = {\r
+  DiskIoDriverBindingSupported,\r
+  DiskIoDriverBindingStart,\r
+  DiskIoDriverBindingStop,\r
+  0xaa,\r
+  NULL,\r
+  NULL\r
+};\r
+\r
+EFI_DRIVER_HEALTH_PROTOCOL gDiskIoDriverHealth = {\r
+  DiskIoDriverHealthGetHealthStatus,\r
+  DiskIoDriverHealthRepair\r
+};\r
+//\r
+// Template for DiskIo private data structure.\r
+// The pointer to BlockIo protocol interface is assigned dynamically.\r
+//\r
+DISK_IO_PRIVATE_DATA gDiskIoPrivateDataTemplate = {\r
+  DISK_IO_PRIVATE_DATA_SIGNATURE,\r
+  {\r
+    EFI_DISK_IO_PROTOCOL_REVISION,\r
+    DiskIoReadDisk,\r
+    DiskIoWriteDisk\r
+  },\r
+  NULL,\r
+  NULL, // Handle\r
+  NULL, // Consumed Protocol\r
+  NULL,\r
+  //\r
+  // Produced Protocol\r
+  //\r
+  {\r
+    DummyExtractConfig,\r
+    DummyRouteConfig,\r
+    DummyDriverCallback\r
+  },\r
+  //\r
+  // NVdata\r
+  //\r
+  { 0x0 },\r
+  //\r
+  // Controller Name\r
+  //\r
+  NULL,\r
+  //\r
+  // Controller Index\r
+  //\r
+  0\r
+};\r
+\r
+DEVICE_STATE *\r
+GetDeviceState (\r
+  UINTN  DeviceStateNumber\r
+  )\r
+{\r
+  UINTN  Index;\r
+\r
+  for (Index = 0; mDeviceState[Index].CurrentState != 999 && mDeviceState[Index].CurrentState != DeviceStateNumber; Index++);\r
+  ASSERT (mDeviceState[Index].CurrentState != 999);\r
+\r
+  return &mDeviceState[Index];\r
+}\r
+\r
+\r
+/**\r
+  Test to see if this driver supports ControllerHandle. \r
+\r
+  @param  This                Protocol instance pointer.\r
+  @param  ControllerHandle    Handle of device to test\r
+  @param  RemainingDevicePath Optional parameter use to pick a specific child\r
+                              device to start.\r
+\r
+  @retval EFI_SUCCESS         This driver supports this device\r
+  @retval EFI_ALREADY_STARTED This driver is already running on this device\r
+  @retval other               This driver does not support this device\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingSupported (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,\r
+  IN EFI_HANDLE                   ControllerHandle,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL\r
+  )\r
+{\r
+  EFI_STATUS            Status;\r
+  EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
+\r
+  //\r
+  // Open the IO Abstraction(s) needed to perform the supported test.\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  ControllerHandle,\r
+                  &gEfiBlockIoProtocolGuid,\r
+                  (VOID **) &BlockIo,\r
+                  This->DriverBindingHandle,\r
+                  ControllerHandle,\r
+                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Close the I/O Abstraction(s) used to perform the supported test.\r
+  //\r
+  gBS->CloseProtocol (\r
+        ControllerHandle,\r
+        &gEfiBlockIoProtocolGuid,\r
+        This->DriverBindingHandle,\r
+        ControllerHandle\r
+        );\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Start this driver on ControllerHandle by opening a Block IO protocol and\r
+  installing a Disk IO protocol on ControllerHandle.\r
+\r
+  @param  This                 Protocol instance pointer.\r
+  @param  ControllerHandle     Handle of device to bind driver to\r
+  @param  RemainingDevicePath  Optional parameter use to pick a specific child\r
+                               device to start.\r
+\r
+  @retval EFI_SUCCESS          This driver is added to ControllerHandle\r
+  @retval EFI_ALREADY_STARTED  This driver is already running on ControllerHandle\r
+  @retval other                This driver does not support this device\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingStart (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,\r
+  IN EFI_HANDLE                   ControllerHandle,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL\r
+  )\r
+{\r
+  EFI_STATUS            Status;\r
+  DISK_IO_PRIVATE_DATA  *Private;\r
+  DEVICE_STATE          *DeviceState;\r
+  UINTN                 DataSize;\r
+  UINT32                StartCount;\r
+  CONTROLLER_STATE      *ControllerState;\r
+\r
+  Private          = NULL;\r
+  ControllerState  = NULL;\r
+\r
+  //\r
+  // Connect to the Block IO interface on ControllerHandle.\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  ControllerHandle,\r
+                  &gEfiBlockIoProtocolGuid,\r
+                  (VOID **) &gDiskIoPrivateDataTemplate.BlockIo,\r
+                  This->DriverBindingHandle,\r
+                  ControllerHandle,\r
+                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+  \r
+  //\r
+  // Initialize the Disk IO device instance.\r
+  //\r
+  Private = AllocateCopyPool (sizeof (DISK_IO_PRIVATE_DATA), &gDiskIoPrivateDataTemplate);\r
+  if (Private == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto ErrorExit;\r
+  }\r
+  \r
+  //\r
+  // Begin Driver Health Protocol Support\r
+  //\r
+  DataSize = sizeof (StartCount);\r
+  Status = gRT->GetVariable (\r
+                  L"StartCount",\r
+                  &gEfiCallerIdGuid,\r
+                  NULL,\r
+                  &DataSize,\r
+                  &StartCount\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    //\r
+    // If the configuration can not be read, then set the default config value of 0\r
+    //\r
+    StartCount = 0;\r
+  }\r
+\r
+  ControllerIndex++;\r
+\r
+  DeviceState = GetDeviceState (mDeviceState[StartCount].CurrentState);\r
+  ASSERT (DeviceState != NULL);\r
+\r
+  ControllerState = AllocateZeroPool (sizeof (CONTROLLER_STATE));\r
+  if (ControllerState == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  \r
+  ControllerState->ControllerHandle  = ControllerHandle;\r
+  ControllerState->Signature         = DISK_IO_CONTROLLER_STATE_SIGNATURE;\r
+  ControllerState->DeviceStateNum    = DeviceState->CurrentState;\r
+  ControllerState->ChildHandle       = NULL;\r
+  ControllerState->ControllerIndex   = ControllerIndex; \r
+\r
+  InsertTailList (&mControllerList, &ControllerState->Link);\r
+\r
+  if (DeviceState->HealthStatus != EfiDriverHealthStatusHealthy || DeviceState->StringId != 0) {\r
+    mNumNotHealthy++;\r
+  }\r
+\r
+  StartCount++;\r
+  while (!mDeviceState[StartCount].StartState) {\r
+    if (mDeviceState[StartCount].CurrentState == 999) {\r
+      StartCount = 0;\r
+    } else {\r
+      StartCount++;\r
+    }\r
+  }\r
+  if (mDeviceState[StartCount].CurrentState == 999) {\r
+    StartCount = 0;\r
+  }\r
+\r
+  Status = gRT->SetVariable (\r
+                  L"StartCount",\r
+                  &gEfiCallerIdGuid,\r
+                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+                  sizeof (StartCount),\r
+                  &StartCount\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  if (DeviceState->HealthStatus == EfiDriverHealthStatusConfigurationRequired) {\r
+    Private->NVdata.ConfigGood = 0;\r
+  } else {\r
+    Private->NVdata.ConfigGood = 1;\r
+  }\r
+  Status = gRT->SetVariable (\r
+                  L"Config",\r
+                  &gEfiCallerIdGuid,\r
+                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+                  sizeof (Private->NVdata.ConfigGood),\r
+                  &Private->NVdata.ConfigGood\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // End Driver Health Protocol Support\r
+  //\r
+\r
+  //\r
+  // Install protocol interfaces for the Disk IO device.\r
+  //\r
+  Status = gBS->InstallProtocolInterface (\r
+                  &ControllerHandle,\r
+                  &gEfiDiskIoProtocolGuid,\r
+                  EFI_NATIVE_INTERFACE,\r
+                  &Private->DiskIo\r
+                  );\r
\r
+  Private->ControllerIndex = ControllerIndex;\r
+  AddName (Private);\r
+\r
+ErrorExit:\r
+  if (EFI_ERROR (Status)) {\r
+\r
+    if (Private != NULL) {\r
+      FreeUnicodeStringTable (Private->ControllerNameTable);\r
+      FreePool (Private);\r
+    }\r
+\r
+    gBS->CloseProtocol (\r
+          ControllerHandle,\r
+          &gEfiBlockIoProtocolGuid,\r
+          This->DriverBindingHandle,\r
+          ControllerHandle\r
+          );\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+  Stop this driver on ControllerHandle by removing Disk IO protocol and closing\r
+  the Block IO protocol on ControllerHandle.\r
+\r
+  @param  This              Protocol instance pointer.\r
+  @param  ControllerHandle  Handle of device to stop driver on\r
+  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of\r
+                            children is zero stop the entire bus driver.\r
+  @param  ChildHandleBuffer List of Child Handles to Stop.\r
+\r
+  @retval EFI_SUCCESS       This driver is removed ControllerHandle\r
+  @retval other             This driver was not removed from this device\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingStop (\r
+  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,\r
+  IN  EFI_HANDLE                     ControllerHandle,\r
+  IN  UINTN                          NumberOfChildren,\r
+  IN  EFI_HANDLE                     *ChildHandleBuffer\r
+  )\r
+{\r
+  EFI_STATUS            Status;\r
+  EFI_DISK_IO_PROTOCOL  *DiskIo;\r
+  DISK_IO_PRIVATE_DATA  *Private;\r
+  DEVICE_STATE          *DeviceState;\r
+  CONTROLLER_STATE      *ControllerState;\r
+  LIST_ENTRY            *Link;\r
+\r
+  ControllerState   = NULL;\r
+  DeviceState       = NULL;\r
+\r
+  //\r
+  // Get our context back.\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  ControllerHandle,\r
+                  &gEfiDiskIoProtocolGuid,\r
+                  (VOID **) &DiskIo,\r
+                  This->DriverBindingHandle,\r
+                  ControllerHandle,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  Private = DISK_IO_PRIVATE_DATA_FROM_THIS (DiskIo);\r
+\r
+  Status = gBS->UninstallProtocolInterface (\r
+                  ControllerHandle,\r
+                  &gEfiDiskIoProtocolGuid,\r
+                  &Private->DiskIo\r
+                  );\r
+  if (!EFI_ERROR (Status)) {\r
+\r
+    Status = gBS->CloseProtocol (\r
+                    ControllerHandle,\r
+                    &gEfiBlockIoProtocolGuid,\r
+                    This->DriverBindingHandle,\r
+                    ControllerHandle\r
+                    );\r
+    //\r
+    // Get the Controller State from global list\r
+    //\r
+    Link = GetFirstNode (&mControllerList);\r
+\r
+    while (!IsNull (&mControllerList, Link)) {\r
+      ControllerState = DISK_IO_CONTROLLER_STATE_FROM_LINK (Link);\r
+\r
+      if (ControllerState->ControllerHandle == ControllerHandle) {\r
+        DeviceState = GetDeviceState (ControllerState->DeviceStateNum);\r
+        break;\r
+      }\r
+      Link = GetNextNode (&mControllerList, Link);\r
+    }\r
+\r
+    ASSERT (DeviceState != NULL);\r
+\r
+    if (DeviceState->HealthStatus != EfiDriverHealthStatusHealthy || DeviceState->StringId != 0) {\r
+      mNumNotHealthy--;\r
+    }\r
+     \r
+    RemoveEntryList (Link);\r
+\r
+    if (ControllerState != NULL) {\r
+      FreePool (ControllerState);\r
+    }    \r
+  }\r
+\r
+  if (!EFI_ERROR (Status)) {\r
+    FreeUnicodeStringTable (Private->ControllerNameTable);\r
+    FreePool (Private);\r
+  }\r
+\r
+  ControllerIndex = 0;\r
+  return Status;\r
+}\r
+\r
+\r
+\r
+/**\r
+  Read BufferSize bytes from Offset into Buffer.\r
+  Reads may support reads that are not aligned on\r
+  sector boundaries. There are three cases:\r
+    UnderRun - The first byte is not on a sector boundary or the read request is\r
+               less than a sector in length.\r
+    Aligned  - A read of N contiguous sectors.\r
+    OverRun  - The last byte is not on a sector boundary.\r
+\r
+  @param  This                  Protocol instance pointer.\r
+  @param  MediaId               Id of the media, changes every time the media is replaced.\r
+  @param  Offset                The starting byte offset to read from\r
+  @param  BufferSize            Size of Buffer\r
+  @param  Buffer                Buffer containing read data\r
+\r
+  @retval EFI_SUCCESS           The data was read correctly from the device.\r
+  @retval EFI_DEVICE_ERROR      The device reported an error while performing the read.\r
+  @retval EFI_NO_MEDIA          There is no media in the device.\r
+  @retval EFI_MEDIA_CHNAGED     The MediaId does not matched the current device.\r
+  @retval EFI_INVALID_PARAMETER The read request contains device addresses that are not\r
+                                valid for the device.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoReadDisk (\r
+  IN EFI_DISK_IO_PROTOCOL  *This,\r
+  IN UINT32                MediaId,\r
+  IN UINT64                Offset,\r
+  IN UINTN                 BufferSize,\r
+  OUT VOID                 *Buffer\r
+  )\r
+{\r
+  EFI_STATUS            Status;\r
+  DISK_IO_PRIVATE_DATA  *Private;\r
+  EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
+  EFI_BLOCK_IO_MEDIA    *Media;\r
+  UINT32                BlockSize;\r
+  UINT64                Lba;\r
+  UINT64                OverRunLba;\r
+  UINT32                UnderRun;\r
+  UINT32                OverRun;\r
+  BOOLEAN               TransactionComplete;\r
+  UINTN                 WorkingBufferSize;\r
+  UINT8                 *WorkingBuffer;\r
+  UINTN                 Length;\r
+  UINT8                 *Data;\r
+  UINT8                 *PreData;\r
+  UINTN                 IsBufferAligned;\r
+  UINTN                 DataBufferSize;\r
+  BOOLEAN               LastRead;\r
+\r
+  Private   = DISK_IO_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  BlockIo   = Private->BlockIo;\r
+  Media     = BlockIo->Media;\r
+  BlockSize = Media->BlockSize;\r
+\r
+  if (Media->MediaId != MediaId) {\r
+    return EFI_MEDIA_CHANGED;\r
+  }\r
+\r
+  WorkingBuffer     = Buffer;\r
+  WorkingBufferSize = BufferSize;\r
+\r
+  //\r
+  // Allocate a temporary buffer for operation\r
+  //\r
+  DataBufferSize = BlockSize * DATA_BUFFER_BLOCK_NUM;\r
+\r
+  if (Media->IoAlign > 1) {\r
+    PreData = AllocatePool (DataBufferSize + Media->IoAlign);\r
+    Data    = PreData - ((UINTN) PreData & (Media->IoAlign - 1)) + Media->IoAlign;\r
+  } else {\r
+    PreData = AllocatePool (DataBufferSize);\r
+    Data    = PreData;\r
+  }\r
+\r
+  if (PreData == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  Lba                 = DivU64x32Remainder (Offset, BlockSize, &UnderRun);\r
+\r
+  Length              = BlockSize - UnderRun;\r
+  TransactionComplete = FALSE;\r
+\r
+  Status              = EFI_SUCCESS;\r
+  if (UnderRun != 0) {\r
+    //\r
+    // Offset starts in the middle of an Lba, so read the entire block.\r
+    //\r
+    Status = BlockIo->ReadBlocks (\r
+                        BlockIo,\r
+                        MediaId,\r
+                        Lba,\r
+                        BlockSize,\r
+                        Data\r
+                        );\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      goto Done;\r
+    }\r
+\r
+    if (Length > BufferSize) {\r
+      Length              = BufferSize;\r
+      TransactionComplete = TRUE;\r
+    }\r
+\r
+    CopyMem (WorkingBuffer, Data + UnderRun, Length);\r
+\r
+    WorkingBuffer += Length;\r
+\r
+    WorkingBufferSize -= Length;\r
+    if (WorkingBufferSize == 0) {\r
+      goto Done;\r
+    }\r
+\r
+    Lba += 1;\r
+  }\r
+\r
+  OverRunLba = Lba + DivU64x32Remainder (WorkingBufferSize, BlockSize, &OverRun);\r
+\r
+  if (!TransactionComplete && WorkingBufferSize >= BlockSize) {\r
+    //\r
+    // If the DiskIo maps directly to a BlockIo device do the read.\r
+    //\r
+    if (OverRun != 0) {\r
+      WorkingBufferSize -= OverRun;\r
+    }\r
+    //\r
+    // Check buffer alignment\r
+    //\r
+    IsBufferAligned = (UINTN) WorkingBuffer & (UINTN) (Media->IoAlign - 1);\r
+\r
+    if (Media->IoAlign <= 1 || IsBufferAligned == 0) {\r
+      //\r
+      // Alignment is satisfied, so read them together\r
+      //\r
+      Status = BlockIo->ReadBlocks (\r
+                          BlockIo,\r
+                          MediaId,\r
+                          Lba,\r
+                          WorkingBufferSize,\r
+                          WorkingBuffer\r
+                          );\r
+\r
+      if (EFI_ERROR (Status)) {\r
+        goto Done;\r
+      }\r
+\r
+      WorkingBuffer += WorkingBufferSize;\r
+\r
+    } else {\r
+      //\r
+      // Use the allocated buffer instead of the original buffer\r
+      // to avoid alignment issue.\r
+      // Here, the allocated buffer (8-byte align) can satisfy the alignment\r
+      //\r
+      LastRead = FALSE;\r
+      do {\r
+        if (WorkingBufferSize <= DataBufferSize) {\r
+          //\r
+          // It is the last calling to readblocks in this loop\r
+          //\r
+          DataBufferSize  = WorkingBufferSize;\r
+          LastRead        = TRUE;\r
+        }\r
+\r
+        Status = BlockIo->ReadBlocks (\r
+                            BlockIo,\r
+                            MediaId,\r
+                            Lba,\r
+                            DataBufferSize,\r
+                            Data\r
+                            );\r
+        if (EFI_ERROR (Status)) {\r
+          goto Done;\r
+        }\r
+\r
+        CopyMem (WorkingBuffer, Data, DataBufferSize);\r
+        WorkingBufferSize -= DataBufferSize;\r
+        WorkingBuffer += DataBufferSize;\r
+        Lba += DATA_BUFFER_BLOCK_NUM;\r
+      } while (!LastRead);\r
+    }\r
+  }\r
+\r
+  if (!TransactionComplete && OverRun != 0) {\r
+    //\r
+    // Last read is not a complete block.\r
+    //\r
+    Status = BlockIo->ReadBlocks (\r
+                        BlockIo,\r
+                        MediaId,\r
+                        OverRunLba,\r
+                        BlockSize,\r
+                        Data\r
+                        );\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      goto Done;\r
+    }\r
+\r
+    CopyMem (WorkingBuffer, Data, OverRun);\r
+  }\r
+\r
+Done:\r
+  if (PreData != NULL) {\r
+    FreePool (PreData);\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+  Writes BufferSize bytes from Buffer into Offset.\r
+  Writes may require a read modify write to support writes that are not\r
+  aligned on sector boundaries. There are three cases:\r
+    UnderRun - The first byte is not on a sector boundary or the write request\r
+               is less than a sector in length. Read modify write is required.\r
+    Aligned  - A write of N contiguous sectors.\r
+    OverRun  - The last byte is not on a sector boundary. Read modified write\r
+               required.\r
+\r
+  @param  This       Protocol instance pointer.\r
+  @param  MediaId    Id of the media, changes every time the media is replaced.\r
+  @param  Offset     The starting byte offset to read from\r
+  @param  BufferSize Size of Buffer\r
+  @param  Buffer     Buffer containing read data\r
+\r
+  @retval EFI_SUCCESS           The data was written correctly to the device.\r
+  @retval EFI_WRITE_PROTECTED   The device can not be written to.\r
+  @retval EFI_DEVICE_ERROR      The device reported an error while performing the write.\r
+  @retval EFI_NO_MEDIA          There is no media in the device.\r
+  @retval EFI_MEDIA_CHNAGED     The MediaId does not matched the current device.\r
+  @retval EFI_INVALID_PARAMETER The write request contains device addresses that are not\r
+                                 valid for the device.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoWriteDisk (\r
+  IN EFI_DISK_IO_PROTOCOL  *This,\r
+  IN UINT32                MediaId,\r
+  IN UINT64                Offset,\r
+  IN UINTN                 BufferSize,\r
+  IN VOID                  *Buffer\r
+  )\r
+{\r
+  EFI_STATUS            Status;\r
+  DISK_IO_PRIVATE_DATA  *Private;\r
+  EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
+  EFI_BLOCK_IO_MEDIA    *Media;\r
+  UINT32                BlockSize;\r
+  UINT64                Lba;\r
+  UINT64                OverRunLba;\r
+  UINT32                UnderRun;\r
+  UINT32                OverRun;\r
+  BOOLEAN               TransactionComplete;\r
+  UINTN                 WorkingBufferSize;\r
+  UINT8                 *WorkingBuffer;\r
+  UINTN                 Length;\r
+  UINT8                 *Data;\r
+  UINT8                 *PreData;\r
+  UINTN                 IsBufferAligned;\r
+  UINTN                 DataBufferSize;\r
+  BOOLEAN               LastWrite;\r
+\r
+  Private   = DISK_IO_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  BlockIo   = Private->BlockIo;\r
+  Media     = BlockIo->Media;\r
+  BlockSize = Media->BlockSize;\r
+\r
+  if (Media->ReadOnly) {\r
+    return EFI_WRITE_PROTECTED;\r
+  }\r
+\r
+  if (Media->MediaId != MediaId) {\r
+    return EFI_MEDIA_CHANGED;\r
+  }\r
+\r
+  DataBufferSize = BlockSize * DATA_BUFFER_BLOCK_NUM;\r
+\r
+  if (Media->IoAlign > 1) {\r
+    PreData = AllocatePool (DataBufferSize + Media->IoAlign);\r
+    Data    = PreData - ((UINTN) PreData & (Media->IoAlign - 1)) + Media->IoAlign;\r
+  } else {\r
+    PreData = AllocatePool (DataBufferSize);\r
+    Data    = PreData;\r
+  }\r
+\r
+  if (PreData == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  WorkingBuffer       = Buffer;\r
+  WorkingBufferSize   = BufferSize;\r
+\r
+  Lba                 = DivU64x32Remainder (Offset, BlockSize, &UnderRun);\r
+\r
+  Length              = BlockSize - UnderRun;\r
+  TransactionComplete = FALSE;\r
+\r
+  Status              = EFI_SUCCESS;\r
+  if (UnderRun != 0) {\r
+    //\r
+    // Offset starts in the middle of an Lba, so do read modify write.\r
+    //\r
+    Status = BlockIo->ReadBlocks (\r
+                        BlockIo,\r
+                        MediaId,\r
+                        Lba,\r
+                        BlockSize,\r
+                        Data\r
+                        );\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      goto Done;\r
+    }\r
+\r
+    if (Length > BufferSize) {\r
+      Length              = BufferSize;\r
+      TransactionComplete = TRUE;\r
+    }\r
+\r
+    CopyMem (Data + UnderRun, WorkingBuffer, Length);\r
+\r
+    Status = BlockIo->WriteBlocks (\r
+                        BlockIo,\r
+                        MediaId,\r
+                        Lba,\r
+                        BlockSize,\r
+                        Data\r
+                        );\r
+    if (EFI_ERROR (Status)) {\r
+      goto Done;\r
+    }\r
+\r
+    WorkingBuffer += Length;\r
+    WorkingBufferSize -= Length;\r
+    if (WorkingBufferSize == 0) {\r
+      goto Done;\r
+    }\r
+\r
+    Lba += 1;\r
+  }\r
+\r
+  OverRunLba = Lba + DivU64x32Remainder (WorkingBufferSize, BlockSize, &OverRun);\r
+\r
+  if (!TransactionComplete && WorkingBufferSize >= BlockSize) {\r
+    //\r
+    // If the DiskIo maps directly to a BlockIo device do the write.\r
+    //\r
+    if (OverRun != 0) {\r
+      WorkingBufferSize -= OverRun;\r
+    }\r
+    //\r
+    // Check buffer alignment\r
+    //\r
+    IsBufferAligned = (UINTN) WorkingBuffer & (UINTN) (Media->IoAlign - 1);\r
+\r
+    if (Media->IoAlign <= 1 || IsBufferAligned == 0) {\r
+      //\r
+      // Alignment is satisfied, so write them together\r
+      //\r
+      Status = BlockIo->WriteBlocks (\r
+                          BlockIo,\r
+                          MediaId,\r
+                          Lba,\r
+                          WorkingBufferSize,\r
+                          WorkingBuffer\r
+                          );\r
+\r
+      if (EFI_ERROR (Status)) {\r
+        goto Done;\r
+      }\r
+\r
+      WorkingBuffer += WorkingBufferSize;\r
+\r
+    } else {\r
+      //\r
+      // The buffer parameter is not aligned with the request\r
+      // So use the allocated instead.\r
+      // It can fit almost all the cases.\r
+      //\r
+      LastWrite = FALSE;\r
+      do {\r
+        if (WorkingBufferSize <= DataBufferSize) {\r
+          //\r
+          // It is the last calling to writeblocks in this loop\r
+          //\r
+          DataBufferSize  = WorkingBufferSize;\r
+          LastWrite       = TRUE;\r
+        }\r
+\r
+        CopyMem (Data, WorkingBuffer, DataBufferSize);\r
+        Status = BlockIo->WriteBlocks (\r
+                            BlockIo,\r
+                            MediaId,\r
+                            Lba,\r
+                            DataBufferSize,\r
+                            Data\r
+                            );\r
+        if (EFI_ERROR (Status)) {\r
+          goto Done;\r
+        }\r
+\r
+        WorkingBufferSize -= DataBufferSize;\r
+        WorkingBuffer += DataBufferSize;\r
+        Lba += DATA_BUFFER_BLOCK_NUM;\r
+      } while (!LastWrite);\r
+    }\r
+  }\r
+\r
+  if (!TransactionComplete && OverRun != 0) {\r
+    //\r
+    // Last bit is not a complete block, so do a read modify write.\r
+    //\r
+    Status = BlockIo->ReadBlocks (\r
+                        BlockIo,\r
+                        MediaId,\r
+                        OverRunLba,\r
+                        BlockSize,\r
+                        Data\r
+                        );\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      goto Done;\r
+    }\r
+\r
+    CopyMem (Data, WorkingBuffer, OverRun);\r
+\r
+    Status = BlockIo->WriteBlocks (\r
+                        BlockIo,\r
+                        MediaId,\r
+                        OverRunLba,\r
+                        BlockSize,\r
+                        Data\r
+                        );\r
+    if (EFI_ERROR (Status)) {\r
+      goto Done;\r
+    }\r
+  }\r
+\r
+Done:\r
+  if (PreData != NULL) {\r
+    FreePool (PreData);\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+  Retrieves the health status of a controller in the platform.  This function can also \r
+  optionally return warning messages, error messages, and a set of HII Forms that may \r
+  be repair a controller that is not proper configured. \r
+  \r
+  @param  This             A pointer to the EFI_DRIVER_HEALTH_PROTOCOL instance.\r
+\r
+  @param  ControllerHandle The handle of the controller to retrieve the health status \r
+                           on.  This is an optional parameter that may be NULL.  If \r
+                           this parameter is NULL, then the value of ChildHandle is \r
+                           ignored, and the combined health status of all the devices \r
+                           that the driver is managing is returned.\r
+\r
+  @param  ChildHandle      The handle of the child controller to retrieve the health \r
+                           status on.  This is an optional parameter that may be NULL.  \r
+                           This parameter is ignored of ControllerHandle is NULL.  It \r
+                           will be NULL for device drivers.  It will also be NULL for \r
+                           bus drivers when an attempt is made to collect the health \r
+                           status of the bus controller.  If will not be NULL when an \r
+                           attempt is made to collect the health status for a child \r
+                           controller produced by the driver.\r
+\r
+  @param  HealthStatus     A pointer to the health status that is returned by this \r
+                           function.  This is an optional parameter that may be NULL.  \r
+                           This parameter is ignored of ControllerHandle is NULL.  \r
+                           The health status for the controller specified by \r
+                           ControllerHandle and ChildHandle is returned. \r
+\r
+  @param  MessageList      A pointer to an array of warning or error messages associated \r
+                           with the controller specified by ControllerHandle and \r
+                           ChildHandle.  This is an optional parameter that may be NULL.  \r
+                           MessageList is allocated by this function with the EFI Boot \r
+                           Service AllocatePool(), and it is the caller's responsibility \r
+                           to free MessageList with the EFI Boot Service FreePool().  \r
+                           Each message is specified by tuple of an EFI_HII_HANDLE and \r
+                           an EFI_STRING_ID.  The array of messages is terminated by tuple \r
+                           containing a EFI_HII_HANDLE with a value of NULL.  The \r
+                           EFI_HII_STRING_PROTOCOL.GetString() function can be used to \r
+                           retrieve the warning or error message as a Null-terminated \r
+                           Unicode string in a specific language.  Messages may be \r
+                           returned for any of the HealthStatus values except \r
+                           EfiDriverHealthStatusReconnectRequired and \r
+                           EfiDriverHealthStatusRebootRequired.\r
+\r
+  @param  FormHiiHandle    A pointer to the HII handle for an HII form associated with the \r
+                           controller specified by ControllerHandle and ChildHandle.  \r
+                           This is an optional parameter that may be NULL.  An HII form \r
+                           is specified by a combination of an EFI_HII_HANDLE and an \r
+                           EFI_GUID that identifies the Form Set GUID.  The \r
+                           EFI_FORM_BROWSER2_PROTOCOL.SendForm() function can be used \r
+                           to display and allow the user to make configuration changes \r
+                           to the HII Form.  An HII form may only be returned with a \r
+                           HealthStatus value of EfiDriverHealthStatusConfigurationRequired.\r
+\r
+  @retval EFI_SUCCESS           ControllerHandle is NULL, and all the controllers \r
+                                managed by this driver specified by This have a health \r
+                                status of EfiDriverHealthStatusHealthy with no warning \r
+                                messages to be returned.  The ChildHandle, HealthStatus, \r
+                                MessageList, and FormList parameters are ignored.\r
+\r
+  @retval EFI_DEVICE_ERROR      ControllerHandle is NULL, and one or more of the \r
+                                controllers managed by this driver specified by This \r
+                                do not have a health status of EfiDriverHealthStatusHealthy.  \r
+                                The ChildHandle, HealthStatus, MessageList, and \r
+                                FormList parameters are ignored.\r
+\r
+  @retval EFI_DEVICE_ERROR      ControllerHandle is NULL, and one or more of the \r
+                                controllers managed by this driver specified by This \r
+                                have one or more warning and/or error messages.  \r
+                                The ChildHandle, HealthStatus, MessageList, and \r
+                                FormList parameters are ignored.\r
+\r
+  @retval EFI_SUCCESS           ControllerHandle is not NULL and the health status \r
+                                of the controller specified by ControllerHandle and \r
+                                ChildHandle was returned in HealthStatus.  A list \r
+                                of warning and error messages may be optionally \r
+                                returned in MessageList, and a list of HII Forms \r
+                                may be optionally returned in FormList.\r
+\r
+  @retval EFI_UNSUPPORTED            ControllerHandle is not NULL, and the controller \r
+                                specified by ControllerHandle and ChildHandle is not \r
+                                currently being managed by the driver specified by This.\r
+\r
+  @retval EFI_INVALID_PARAMETER        HealthStatus is NULL.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES MessageList is not NULL, and there are not enough \r
+                                resource available to allocate memory for MessageList.\r
+\r
+**/\r
+EFI_STATUS\r
+DiskIoDriverHealthGetHealthStatus (\r
+  IN  EFI_DRIVER_HEALTH_PROTOCOL       *This,\r
+  IN  EFI_HANDLE                       ControllerHandle  OPTIONAL,\r
+  IN  EFI_HANDLE                       ChildHandle       OPTIONAL,\r
+  OUT EFI_DRIVER_HEALTH_STATUS         *HealthStatus,\r
+  OUT EFI_DRIVER_HEALTH_HII_MESSAGE    **MessageList     OPTIONAL,\r
+  OUT EFI_HII_HANDLE                   *FormHiiHandle    OPTIONAL\r
+  )\r
+{\r
+  EFI_STATUS            Status;\r
+  EFI_DISK_IO_PROTOCOL  *DiskIo;\r
+  DISK_IO_PRIVATE_DATA  *Private;\r
+  DEVICE_STATE          *DeviceState;\r
+  CONTROLLER_STATE      *ControllerState;\r
+  LIST_ENTRY            *Link;\r
+  UINTN                 BufferSize;\r
+\r
+  ControllerState   = NULL;\r
+  DeviceState       = NULL;\r
+\r
+  if (HealthStatus == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (ControllerHandle == NULL) {\r
+    *HealthStatus = EfiDriverHealthStatusHealthy;\r
+    if (mNumNotHealthy != 0) {\r
+      *HealthStatus = EfiDriverHealthStatusFailed;\r
+    }\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  //\r
+  // This is a device driver, so ChildHandle must be NULL.\r
+  //\r
+  if (ChildHandle != NULL) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+  //\r
+  // Make sure this driver is currently managing ControllerHandle\r
+  //\r
+  Status = EfiTestManagedDevice (\r
+             ControllerHandle,\r
+             gDiskIoDriverBinding.DriverBindingHandle,\r
+             &gEfiBlockIoProtocolGuid\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  if (HealthStatus == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  Status = gBS->HandleProtocol (ControllerHandle, &gEfiDiskIoProtocolGuid, (VOID **) &DiskIo);\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  if (HealthStatus == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Private = DISK_IO_PRIVATE_DATA_FROM_THIS (DiskIo);\r
+\r
+\r
+  //\r
+  // Get the Controller State from global list\r
+  //\r
+  Link = GetFirstNode (&mControllerList);\r
+\r
+  while (!IsNull (&mControllerList, Link)) {\r
+    ControllerState = DISK_IO_CONTROLLER_STATE_FROM_LINK (Link);\r
+\r
+    if (ControllerState->ControllerHandle == ControllerHandle) {\r
+      DeviceState = GetDeviceState (ControllerState->DeviceStateNum);\r
+      break;\r
+    }\r
+    Link = GetNextNode (&mControllerList, Link);\r
+  }\r
+\r
+  ASSERT (DeviceState != NULL);\r
+\r
+  if (DeviceState->HealthStatus == EfiDriverHealthStatusConfigurationRequired) {\r
+    \r
+    //\r
+    // Read the configuration for this device\r
+    //\r
+    BufferSize = sizeof (Private->NVdata.ConfigGood);\r
+    Status = gRT->GetVariable (\r
+                    L"Config",\r
+                    &gEfiCallerIdGuid,\r
+                    NULL,\r
+                    &BufferSize,\r
+                    &Private->NVdata.ConfigGood\r
+                    );\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
+    //\r
+    // If the config value is 1, then the configuration is valid and the state machine can move to the next state\r
+    // Otherwise, the state machine returns ConfigurationRequired again\r
+    //\r
+    if (Private->NVdata.ConfigGood == ControllerState->ControllerIndex) {\r
+      if (DeviceState->HealthStatus != EfiDriverHealthStatusHealthy || DeviceState->StringId != 0) {\r
+        mNumNotHealthy--;\r
+      }\r
+\r
+      ControllerState->DeviceStateNum = DeviceState->NextState;\r
+\r
+      DeviceState = GetDeviceState (ControllerState->DeviceStateNum);\r
+      ASSERT (DeviceState != NULL);\r
+\r
+      if (DeviceState->HealthStatus != EfiDriverHealthStatusHealthy) {\r
+        mNumNotHealthy++;\r
+      }\r
+    }\r
+  }    \r
+  \r
+  *HealthStatus = DeviceState->HealthStatus;\r
+\r
+  if (MessageList != NULL) {\r
+    *MessageList = NULL;\r
+    if (DeviceState->StringId != 0) {\r
+      *MessageList = AllocateZeroPool (sizeof(EFI_DRIVER_HEALTH_HII_MESSAGE) * 2);\r
+      if (*MessageList == NULL) {\r
+        return EFI_UNSUPPORTED;\r
+      }\r
+      (*MessageList)[0].HiiHandle = mHiiHandle;\r
+      (*MessageList)[0].StringId  = DeviceState->StringId;\r
+    } else {\r
+      *MessageList = AllocateZeroPool (sizeof(EFI_DRIVER_HEALTH_HII_MESSAGE) * 1);\r
+      if (*MessageList == NULL) {\r
+        return EFI_UNSUPPORTED;\r
+      }\r
+    }\r
+  }\r
+  if (FormHiiHandle != NULL) {\r
+    *FormHiiHandle = mHiiHandle;\r
+  }\r
+\r
+  if (DeviceState->HealthStatus == EfiDriverHealthStatusConfigurationRequired) {\r
+    Private->NVdata.ConfigGood = 0;\r
+    Status = gRT->SetVariable (\r
+                    L"Config",\r
+                    &gEfiCallerIdGuid,\r
+                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+                    sizeof (Private->NVdata.ConfigGood),\r
+                    &Private->NVdata.ConfigGood\r
+                    );\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Performs a repair operation on a controller in the platform.  This function can \r
+  optionally report repair progress information back to the platform. \r
+  \r
+  @param  This             A pointer to the EFI_DRIVER_HEALTH_PROTOCOL instance.\r
+  @param  ControllerHandle The handle of the controller to repair.\r
+  @param  ChildHandle      The handle of the child controller to repair.  This is \r
+                           an optional parameter that may be NULL.  It will be NULL \r
+                           for device drivers.  It will also be NULL for bus \r
+                           drivers when an attempt is made to repair a bus controller.\r
+                           If will not be NULL when an attempt is made to repair a \r
+                           child controller produced by the driver.\r
+  @param  RepairNotify     A notification function that may be used by a driver to \r
+                           report the progress of the repair operation.  This is \r
+                           an optional parameter that may be NULL.  \r
+\r
+\r
+  @retval EFI_SUCCESS            An attempt to repair the controller specified by \r
+                                ControllerHandle and ChildHandle was performed.  \r
+                                The result of the repair operation can be \r
+                                determined by calling GetHealthStatus().\r
+  @retval EFI_UNSUPPORTED            The driver specified by This is not currently \r
+                                managing the controller specified by ControllerHandle \r
+                                and ChildHandle.\r
+  @retval EFI_OUT_OF_RESOURCES There are not enough resources to perform the \r
+                                repair operation.\r
+\r
+*/\r
+EFI_STATUS\r
+DiskIoDriverHealthRepair (\r
+  IN  EFI_DRIVER_HEALTH_PROTOCOL                *This,\r
+  IN  EFI_HANDLE                                ControllerHandle,\r
+  IN  EFI_HANDLE                                ChildHandle       OPTIONAL,\r
+  IN  EFI_DRIVER_HEALTH_REPAIR_PROGRESS_NOTIFY  RepairNotify      OPTIONAL\r
+  )\r
+{\r
+  EFI_STATUS            Status;\r
+  UINTN                 Index;\r
+  DEVICE_STATE          *DeviceState;\r
+  CONTROLLER_STATE      *ControllerState;\r
+  LIST_ENTRY            *Link;\r
+  EFI_DISK_IO_PROTOCOL  *DiskIo;\r
+  DISK_IO_PRIVATE_DATA  *Private;\r
+\r
+  Index           = 0;\r
+  ControllerState = NULL;\r
+  DeviceState     = NULL;\r
+  //\r
+  // This is a device driver, so ChildHandle must be NULL.\r
+  //\r
+  if (ChildHandle != NULL) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+  //\r
+  // Make sure this driver is currently managing ControllerHandle\r
+  //\r
+  Status = EfiTestManagedDevice (\r
+             ControllerHandle,\r
+             gDiskIoDriverBinding.DriverBindingHandle,\r
+             &gEfiBlockIoProtocolGuid\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  Status = gBS->HandleProtocol (ControllerHandle, &gEfiDiskIoProtocolGuid, (VOID **) &DiskIo);\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  Private = DISK_IO_PRIVATE_DATA_FROM_THIS (DiskIo);\r
+\r
+  Link = GetFirstNode (&mControllerList);\r
+\r
+  while (!IsNull (&mControllerList, Link)) {\r
+    ControllerState = DISK_IO_CONTROLLER_STATE_FROM_LINK (Link);\r
+\r
+    if (ControllerState->ControllerHandle == ControllerHandle) {\r
+      DeviceState = GetDeviceState (ControllerState->DeviceStateNum);\r
+      break;\r
+    }\r
+    Link = GetNextNode (&mControllerList, Link);\r
+  }\r
+\r
+  ASSERT (DeviceState != NULL);\r
+  //\r
+  // Check to see if the controller has already been repaired\r
+  //\r
+  if (DeviceState->HealthStatus != EfiDriverHealthStatusRepairRequired) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  if (DeviceState->RepairNotify) {\r
+    do {\r
+      RepairNotify(Index, 10);\r
+      Index++;\r
+    } while ((gBS->Stall(100000) == EFI_SUCCESS) && (Index < 10));\r
+  }\r
+\r
+  if (DeviceState->HealthStatus != EfiDriverHealthStatusHealthy || DeviceState->StringId != 0) {\r
+    mNumNotHealthy--;\r
+  }\r
+  \r
+  //\r
+  // Repair success, go to next state\r
+  //\r
+  ControllerState->DeviceStateNum = DeviceState->NextState;\r
+\r
+  DeviceState = GetDeviceState (ControllerState->DeviceStateNum);\r
+  ASSERT (DeviceState != NULL);\r
+\r
+  if (DeviceState->HealthStatus != EfiDriverHealthStatusHealthy || DeviceState->StringId != 0) {\r
+    mNumNotHealthy++;\r
+  }\r
+\r
+  if (DeviceState->HealthStatus == EfiDriverHealthStatusConfigurationRequired) {\r
+    Private->NVdata.ConfigGood = 0;\r
+    Status = gRT->SetVariable (\r
+                    L"Config",\r
+                    &gEfiCallerIdGuid,\r
+                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+                    sizeof (Private->NVdata.ConfigGood),\r
+                    &Private->NVdata.ConfigGood\r
+                    );\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  The user Entry Point for module DiskIo. The user code starts with this function.\r
+\r
+  @param[in] ImageHandle    The firmware allocated handle for the EFI image.  \r
+  @param[in] SystemTable    A pointer to the EFI System Table.\r
+  \r
+  @retval EFI_SUCCESS       The entry point is executed successfully.\r
+  @retval other             Some error occurs when executing this entry point.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+InitializeDiskIo (\r
+  IN EFI_HANDLE           ImageHandle,\r
+  IN EFI_SYSTEM_TABLE     *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS        Status;\r
+  //\r
+  // Install driver model protocol(s).\r
+  //\r
+  Status = EfiLibInstallDriverBindingComponentName2 (\r
+           ImageHandle,\r
+           SystemTable,\r
+           &gDiskIoDriverBinding,\r
+           ImageHandle,\r
+           &gDiskIoComponentName,\r
+           &gDiskIoComponentName2\r
+           );\r
+\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = gBS->InstallProtocolInterface (\r
+                  &ImageHandle,\r
+                  &gEfiDriverHealthProtocolGuid,\r
+                  EFI_NATIVE_INTERFACE,\r
+                  &gDiskIoDriverHealth\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  InitializeListHead (&mControllerList);\r
+\r
+  gDiskIoPrivateDataTemplate.Handle = ImageHandle;\r
+  Status = DiskIoConfigFormInit ();\r
+\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Initialize the serial configuration form.\r
+\r
+  @retval EFI_SUCCESS              The serial configuration form is initialized.\r
+  @retval EFI_OUT_OF_RESOURCES     Failed to allocate memory.\r
+  @retval Others                   Other errors as indicated.\r
+**/\r
+EFI_STATUS\r
+DiskIoConfigFormInit (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS                       Status;\r
+\r
+  //\r
+  // Locate Hii Database protocol\r
+  //\r
+  Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **)&gDiskIoPrivateDataTemplate.HiiDatabase);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **)&gDiskIoPrivateDataTemplate.HiiConfigRouting);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Install Device Path Protocol and Config Access protocol to driver handle\r
+  //\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+    &gDiskIoPrivateDataTemplate.Handle,\r
+    &gEfiDevicePathProtocolGuid, &mHiiVendorDevicePathDiskIoDummy,\r
+    &gEfiHiiConfigAccessProtocolGuid, &gDiskIoPrivateDataTemplate.ConfigAccess,\r
+    NULL\r
+    );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Publish our HII data\r
+  //\r
+  mHiiHandle = HiiAddPackages (\r
+    &gEfiCallerIdGuid,\r
+    gDiskIoPrivateDataTemplate.Handle,\r
+    DriverHealthDxeStrings,\r
+    DriverHealthVfrBin,\r
+    NULL\r
+    );\r
+  if (mHiiHandle == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+/**\r
+  This function processes the results of changes in configuration.\r
+\r
+  @param  This                   Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+  @param  Action                 Specifies the type of action taken by the browser.\r
+  @param  QuestionId             A unique value which is sent to the original\r
+                                 exporting driver so that it can identify the type\r
+                                 of data to expect.\r
+  @param  Type                   The type of value for the question.\r
+  @param  Value                  A pointer to the data being sent to the original\r
+                                 exporting driver.\r
+  @param  ActionRequest          On return, points to the action requested by the\r
+                                 callback function.\r
+\r
+  @retval EFI_SUCCESS            The callback successfully handled the action.\r
+  @retval EFI_OUT_OF_RESOURCES   Not enough storage is available to hold the\r
+                                 variable and its data.\r
+  @retval EFI_DEVICE_ERROR       The variable could not be saved.\r
+  @retval EFI_UNSUPPORTED        The specified Action is not supported by the\r
+                                 callback.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DummyDriverCallback (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  EFI_BROWSER_ACTION                     Action,\r
+  IN  EFI_QUESTION_ID                        QuestionId,\r
+  IN  UINT8                                  Type,\r
+  IN  EFI_IFR_TYPE_VALUE                     *Value,\r
+  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest\r
+  )\r
+{\r
+\r
+  DISK_IO_NV_DATA  *IfrNvData;\r
+\r
+  //\r
+  // Retrieve uncommitted data from Browser\r
+  //\r
+\r
+  IfrNvData = AllocateZeroPool (sizeof (DISK_IO_NV_DATA));\r
+  ASSERT (IfrNvData != NULL);\r
+\r
+  if (!HiiGetBrowserData (&gEfiCallerIdGuid, VariableName, sizeof (DISK_IO_NV_DATA), (UINT8 *) IfrNvData)) {\r
+    FreePool (IfrNvData);\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  if ((Value == NULL) || (ActionRequest == NULL)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  This function allows a caller to extract the current configuration for one\r
+  or more named elements from the target driver.\r
+\r
+  @param  This                   Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+  @param  Request                A null-terminated Unicode string in\r
+                                 <ConfigRequest> format.\r
+  @param  Progress               On return, points to a character in the Request\r
+                                 string. Points to the string's null terminator if\r
+                                 request was successful. Points to the most recent\r
+                                 '&' before the first failing name/value pair (or\r
+                                 the beginning of the string if the failure is in\r
+                                 the first name/value pair) if the request was not\r
+                                 successful.\r
+  @param  Results                A null-terminated Unicode string in\r
+                                 <ConfigAltResp> format which has all values filled\r
+                                 in for the names in the Request string. String to\r
+                                 be allocated by the called function.\r
+\r
+  @retval EFI_SUCCESS            The Results is filled with the requested values.\r
+  @retval EFI_OUT_OF_RESOURCES   Not enough memory to store the results.\r
+  @retval EFI_INVALID_PARAMETER  Request is NULL, illegal syntax, or unknown name.\r
+  @retval EFI_NOT_FOUND          Routing data doesn't match any storage in this\r
+                                 driver.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DummyExtractConfig (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  CONST EFI_STRING                       Request,\r
+  OUT EFI_STRING                             *Progress,\r
+  OUT EFI_STRING                             *Results\r
+  )\r
+{\r
+  EFI_STATUS                       Status;\r
+  UINTN                            BufferSize;\r
+  DISK_IO_PRIVATE_DATA             *PrivateData;\r
+  EFI_HII_CONFIG_ROUTING_PROTOCOL  *HiiConfigRouting;\r
+  EFI_STRING                       ConfigRequest;\r
+  EFI_STRING                       ConfigRequestHdr;\r
+  UINTN                            Size;\r
+  \r
+  if (Progress == NULL || Results == NULL || Request == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  //\r
+  // Initialize the local variables.\r
+  //\r
+  ConfigRequestHdr  = NULL;\r
+  ConfigRequest     = NULL;\r
+  Size              = 0;\r
+  *Progress         = Request;\r
+\r
+  PrivateData = DISK_IO_PRIVATE_DATA_FROM_CONFIG_ACCESS(This);\r
+  HiiConfigRouting = PrivateData->HiiConfigRouting;\r
+\r
+  //\r
+  // Get Buffer Storage data from EFI variable.\r
+  // Try to get the current setting from variable.\r
+  //\r
+  BufferSize = sizeof (DISK_IO_NV_DATA);\r
+  Status = gRT->GetVariable (\r
+            VariableName,\r
+            &gEfiCallerIdGuid,\r
+            NULL,\r
+            &BufferSize,\r
+            &PrivateData->NVdata\r
+            );\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+  \r
+  if (Request == NULL) {\r
+    //\r
+    // Request is set to NULL, construct full request string.\r
+    //\r
+\r
+    //\r
+    // Allocate and fill a buffer large enough to hold the <ConfigHdr> template \r
+    // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
+    //\r
+    ConfigRequestHdr = HiiConstructConfigHdr (&gEfiCallerIdGuid, VariableName, PrivateData->Handle);\r
+    Size = (StrLen (ConfigRequest) + 32 + 1) * sizeof (CHAR16);\r
+    ConfigRequest = AllocateZeroPool (Size);\r
+    UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
+    FreePool (ConfigRequestHdr);\r
+  } else {\r
+    //\r
+    // Check routing data in <ConfigHdr>.\r
+    // Note: if only one Storage is used, then this checking could be skipped.\r
+    //\r
+    if (!HiiIsConfigHdrMatch (Request, &gEfiCallerIdGuid, VariableName)) {\r
+      return EFI_NOT_FOUND;\r
+    }\r
+    ConfigRequest = Request;\r
+  }\r
+\r
+  //\r
+  // Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
+  //\r
+  Status = HiiConfigRouting->BlockToConfig (\r
+                                HiiConfigRouting,\r
+                                ConfigRequest,\r
+                                (UINT8 *) &PrivateData->NVdata,\r
+                                BufferSize,\r
+                                Results,\r
+                                Progress\r
+                                );\r
+  \r
+  if (Request == NULL) {\r
+    FreePool (ConfigRequest);\r
+    *Progress = NULL;\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  This function processes the results of changes in configuration.\r
+\r
+  @param  This                   Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+  @param  Configuration          A null-terminated Unicode string in <ConfigResp>\r
+                                 format.\r
+  @param  Progress               A pointer to a string filled in with the offset of\r
+                                 the most recent '&' before the first failing\r
+                                 name/value pair (or the beginning of the string if\r
+                                 the failure is in the first name/value pair) or\r
+                                 the terminating NULL if all was successful.\r
+\r
+  @retval EFI_SUCCESS            The Results is processed successfully.\r
+  @retval EFI_INVALID_PARAMETER  Configuration is NULL.\r
+  @retval EFI_NOT_FOUND          Routing data doesn't match any storage in this\r
+                                 driver.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DummyRouteConfig (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  CONST EFI_STRING                       Configuration,\r
+  OUT EFI_STRING                             *Progress\r
+  )\r
+{\r
+  EFI_STATUS                       Status;\r
+  UINTN                            BufferSize;\r
+  DISK_IO_PRIVATE_DATA             *PrivateData;\r
+  EFI_HII_CONFIG_ROUTING_PROTOCOL  *HiiConfigRouting;\r
+\r
+  if (Configuration == NULL || Progress == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+\r
+  PrivateData = DISK_IO_PRIVATE_DATA_FROM_CONFIG_ACCESS (This);\r
+  HiiConfigRouting = PrivateData->HiiConfigRouting;\r
+  *Progress = Configuration;\r
+\r
+  //\r
+  // Check routing data in <ConfigHdr>.\r
+  // Note: if only one Storage is used, then this checking could be skipped.\r
+  //\r
+  if (!HiiIsConfigHdrMatch (Configuration, &gEfiCallerIdGuid, VariableName)) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  //\r
+  // Get Buffer Storage data from EFI variable\r
+  //\r
+  BufferSize = sizeof (DISK_IO_NV_DATA);\r
+  Status = gRT->GetVariable (\r
+            VariableName,\r
+            &gEfiCallerIdGuid,\r
+            NULL,\r
+            &BufferSize,\r
+            &PrivateData->NVdata\r
+            );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()\r
+  //\r
+  BufferSize = sizeof (DISK_IO_NV_DATA);\r
+  Status = HiiConfigRouting->ConfigToBlock (\r
+                               HiiConfigRouting,\r
+                               Configuration,\r
+                               (UINT8 *) &PrivateData->NVdata,\r
+                               &BufferSize,\r
+                               Progress\r
+                               );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Store Buffer Storage back to EFI variable\r
+  //\r
+  Status = gRT->SetVariable(\r
+                  VariableName,\r
+                  &gEfiCallerIdGuid,\r
+                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+                  sizeof (DISK_IO_NV_DATA),\r
+                  &PrivateData->NVdata\r
+                  );\r
+\r
+  return Status;\r
+}\r
diff --git a/OptionRomPkg/DriverHealthDxe/DriverHealthDxe.h b/OptionRomPkg/DriverHealthDxe/DriverHealthDxe.h
new file mode 100644 (file)
index 0000000..646ae14
--- /dev/null
@@ -0,0 +1,643 @@
+/** @file\r
+  DiskIo driver that layers it's self on every Block IO protocol in the system.\r
+  DiskIo converts a block oriented device to a byte oriented device.\r
+\r
+  Copyright (c) 2006 - 2009, Intel Corporation                                              \r
+  All rights reserved. This program and the accompanying materials                          \r
+  are licensed and made available under the terms and conditions of the BSD License         \r
+  which accompanies this distribution.  The full text of the license may be found at        \r
+  http://opensource.org/licenses/bsd-license.php                                            \r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+\r
+**/\r
+\r
+#ifndef _DISK_IO_H\r
+#define _DISK_IO_H\r
+\r
+#include <Uefi.h>\r
+#include <Protocol/BlockIo.h>\r
+#include <Protocol/ComponentName.h>\r
+#include <Protocol/DriverBinding.h>\r
+#include <Protocol/DriverConfiguration.h>\r
+#include <Protocol/DriverConfiguration2.h>\r
+#include <Protocol/DriverHealth.h>\r
+#include <Protocol/DiskIo.h>\r
+#include <Protocol/HiiDatabase.h>\r
+#include <Protocol/HiiConfigAccess.h>\r
+#include <Protocol/HiiConfigRouting.h>\r
+#include <Protocol/DevicePath.h>\r
+#include <Protocol/HiiString.h>\r
+\r
+#include <Library/DebugLib.h>\r
+#include <Library/UefiDriverEntryPoint.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiRuntimeServicesTableLib.h>\r
+#include <Library/DevicePathLib.h>\r
+#include <Library/HiiLib.h>\r
+#include <Library/PrintLib.h>\r
+#include "NVDataStruc.h"\r
+\r
+#define DISK_IO_PRIVATE_DATA_SIGNATURE  SIGNATURE_32 ('d', 's', 'k', 'I') \r
+\r
+#define DISK_IO_CONTROLLER_STATE_SIGNATURE  SIGNATURE_32 ('c', 't', 's', 'S')   \r
+\r
+#define DATA_BUFFER_BLOCK_NUM           (64)\r
+\r
+typedef struct {\r
+  VENDOR_DEVICE_PATH             VendorDevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL       End;\r
+} HII_VENDOR_DEVICE_PATH;\r
+\r
+typedef struct {\r
+  UINTN                            Signature;\r
+  EFI_DISK_IO_PROTOCOL             DiskIo;\r
+  EFI_BLOCK_IO_PROTOCOL            *BlockIo;\r
+  EFI_HANDLE                       Handle;\r
+  //\r
+  // Consumed protocol\r
+  //\r
+  EFI_HII_DATABASE_PROTOCOL        *HiiDatabase;\r
+  EFI_HII_CONFIG_ROUTING_PROTOCOL  *HiiConfigRouting;\r
+\r
+  //\r
+  // Produced protocol\r
+  //\r
+  EFI_HII_CONFIG_ACCESS_PROTOCOL   ConfigAccess;\r
+\r
+  DISK_IO_NV_DATA                  NVdata;\r
+  EFI_UNICODE_STRING_TABLE         *ControllerNameTable;\r
+  UINT8                            ControllerIndex;\r
+} DISK_IO_PRIVATE_DATA;\r
+\r
+typedef struct {\r
+  BOOLEAN                          StartState;\r
+  UINTN                            CurrentState;\r
+  UINTN                            NextState;\r
+  EFI_STRING_ID                    StringId;\r
+  BOOLEAN                          RepairNotify;\r
+  EFI_DRIVER_HEALTH_STATUS         HealthStatus;\r
+} DEVICE_STATE;\r
+\r
+typedef struct {\r
+  UINTN                            Signature;\r
+  LIST_ENTRY                       Link;\r
+\r
+  EFI_HANDLE                       ControllerHandle;\r
+  UINTN                            ControllerIndex;\r
+  EFI_HANDLE                       ChildHandle;\r
+  UINTN                            DeviceStateNum;\r
+} CONTROLLER_STATE;\r
+\r
+#define DISK_IO_PRIVATE_DATA_FROM_THIS(a) CR (a, DISK_IO_PRIVATE_DATA, DiskIo, DISK_IO_PRIVATE_DATA_SIGNATURE)\r
+#define DISK_IO_PRIVATE_DATA_FROM_CONFIG_ACCESS(a) CR (a, DISK_IO_PRIVATE_DATA, ConfigAccess, DISK_IO_PRIVATE_DATA_SIGNATURE)\r
+\r
+#define DISK_IO_CONTROLLER_STATE_FROM_HANDLE(a) CR (a, CONTROLLER_STATE, ControllerHandle, DISK_IO_CONTROLLER_STATE_SIGNATURE)\r
+#define DISK_IO_CONTROLLER_STATE_FROM_LINK(a) CR (a, CONTROLLER_STATE, Link, DISK_IO_CONTROLLER_STATE_SIGNATURE)\r
+//\r
+// Global Variables\r
+//\r
+extern EFI_DRIVER_BINDING_PROTOCOL         gDiskIoDriverBinding;\r
+extern EFI_COMPONENT_NAME_PROTOCOL         gDiskIoComponentName;\r
+extern EFI_COMPONENT_NAME2_PROTOCOL        gDiskIoComponentName2;\r
+extern EFI_DRIVER_HEALTH_PROTOCOL          gDiskIoDriverHealth;\r
+\r
+//\r
+// This is the generated String package data for all .UNI files.\r
+// This data array is ready to be used as input of HiiAddPackages() to\r
+// create a packagelist (which contains Form packages, String packages, etc).\r
+//\r
+extern UINT8  DriverHealthDxeStrings[];\r
+extern UINT8  DriverHealthVfrBin[];\r
+\r
+\r
+//\r
+// Prototypes\r
+// Driver model protocol interface\r
+//\r
+/**\r
+  Test to see if this driver supports ControllerHandle. \r
+\r
+  @param  This                Protocol instance pointer.\r
+  @param  ControllerHandle    Handle of device to test\r
+  @param  RemainingDevicePath Optional parameter use to pick a specific child\r
+                              device to start.\r
+\r
+  @retval EFI_SUCCESS         This driver supports this device\r
+  @retval EFI_ALREADY_STARTED This driver is already running on this device\r
+  @retval other               This driver does not support this device\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingSupported (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
+  IN EFI_HANDLE                     ControllerHandle,\r
+  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath OPTIONAL\r
+  );\r
+\r
+/**\r
+  Start this driver on ControllerHandle by opening a Block IO protocol and\r
+  installing a Disk IO protocol on ControllerHandle.\r
+\r
+  @param  This                 Protocol instance pointer.\r
+  @param  ControllerHandle     Handle of device to bind driver to\r
+  @param  RemainingDevicePath  Optional parameter use to pick a specific child\r
+                               device to start.\r
+\r
+  @retval EFI_SUCCESS          This driver is added to ControllerHandle\r
+  @retval EFI_ALREADY_STARTED  This driver is already running on ControllerHandle\r
+  @retval other                This driver does not support this device\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingStart (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
+  IN EFI_HANDLE                     ControllerHandle,\r
+  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath OPTIONAL\r
+  );\r
+\r
+/**\r
+  Stop this driver on ControllerHandle by removing Disk IO protocol and closing\r
+  the Block IO protocol on ControllerHandle.\r
+\r
+  @param  This              Protocol instance pointer.\r
+  @param  ControllerHandle  Handle of device to stop driver on\r
+  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of\r
+                            children is zero stop the entire bus driver.\r
+  @param  ChildHandleBuffer List of Child Handles to Stop.\r
+\r
+  @retval EFI_SUCCESS       This driver is removed ControllerHandle\r
+  @retval other             This driver was not removed from this device\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingStop (\r
+  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,\r
+  IN  EFI_HANDLE                     ControllerHandle,\r
+  IN  UINTN                          NumberOfChildren,\r
+  IN  EFI_HANDLE                     *ChildHandleBuffer\r
+  );\r
+\r
+//\r
+// Disk I/O Protocol Interface\r
+//\r
+/**\r
+  Read BufferSize bytes from Offset into Buffer.\r
+  Reads may support reads that are not aligned on\r
+  sector boundaries. There are three cases:\r
+    UnderRun - The first byte is not on a sector boundary or the read request is\r
+               less than a sector in length.\r
+    Aligned  - A read of N contiguous sectors.\r
+    OverRun  - The last byte is not on a sector boundary.\r
+\r
+  @param  This                  Protocol instance pointer.\r
+  @param  MediaId               Id of the media, changes every time the media is replaced.\r
+  @param  Offset                The starting byte offset to read from\r
+  @param  BufferSize            Size of Buffer\r
+  @param  Buffer                Buffer containing read data\r
+\r
+  @retval EFI_SUCCESS           The data was read correctly from the device.\r
+  @retval EFI_DEVICE_ERROR      The device reported an error while performing the read.\r
+  @retval EFI_NO_MEDIA          There is no media in the device.\r
+  @retval EFI_MEDIA_CHNAGED     The MediaId does not matched the current device.\r
+  @retval EFI_INVALID_PARAMETER The read request contains device addresses that are not\r
+                                valid for the device.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoReadDisk (\r
+  IN EFI_DISK_IO_PROTOCOL  *This,\r
+  IN UINT32                MediaId,\r
+  IN UINT64                Offset,\r
+  IN UINTN                 BufferSize,\r
+  OUT VOID                 *Buffer\r
+  );\r
+\r
+/**\r
+  Writes BufferSize bytes from Buffer into Offset.\r
+  Writes may require a read modify write to support writes that are not\r
+  aligned on sector boundaries. There are three cases:\r
+    UnderRun - The first byte is not on a sector boundary or the write request\r
+               is less than a sector in length. Read modify write is required.\r
+    Aligned  - A write of N contiguous sectors.\r
+    OverRun  - The last byte is not on a sector boundary. Read modified write\r
+               required.\r
+\r
+  @param  This       Protocol instance pointer.\r
+  @param  MediaId    Id of the media, changes every time the media is replaced.\r
+  @param  Offset     The starting byte offset to read from\r
+  @param  BufferSize Size of Buffer\r
+  @param  Buffer     Buffer containing read data\r
+\r
+  @retval EFI_SUCCESS           The data was written correctly to the device.\r
+  @retval EFI_WRITE_PROTECTED   The device can not be written to.\r
+  @retval EFI_DEVICE_ERROR      The device reported an error while performing the write.\r
+  @retval EFI_NO_MEDIA          There is no media in the device.\r
+  @retval EFI_MEDIA_CHNAGED     The MediaId does not matched the current device.\r
+  @retval EFI_INVALID_PARAMETER The write request contains device addresses that are not\r
+                                 valid for the device.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoWriteDisk (\r
+  IN EFI_DISK_IO_PROTOCOL  *This,\r
+  IN UINT32                MediaId,\r
+  IN UINT64                Offset,\r
+  IN UINTN                 BufferSize,\r
+  IN VOID                  *Buffer\r
+  );\r
+\r
+//\r
+// EFI Component Name Functions\r
+//\r
+/**\r
+  Retrieves a Unicode string that is the user readable name of the driver.\r
+\r
+  This function retrieves the user readable name of a driver in the form of a\r
+  Unicode string. If the driver specified by This has a user readable name in\r
+  the language specified by Language, then a pointer to the driver name is\r
+  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified\r
+  by This does not support the language specified by Language,\r
+  then EFI_UNSUPPORTED is returned.\r
+\r
+  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
+                                EFI_COMPONENT_NAME_PROTOCOL instance.\r
+\r
+  @param  Language[in]          A pointer to a Null-terminated ASCII string\r
+                                array indicating the language. This is the\r
+                                language of the driver name that the caller is\r
+                                requesting, and it must match one of the\r
+                                languages specified in SupportedLanguages. The\r
+                                number of languages supported by a driver is up\r
+                                to the driver writer. Language is specified\r
+                                in RFC 4646 or ISO 639-2 language code format.\r
+\r
+  @param  DriverName[out]       A pointer to the Unicode string to return.\r
+                                This Unicode string is the name of the\r
+                                driver specified by This in the language\r
+                                specified by Language.\r
+\r
+  @retval EFI_SUCCESS           The Unicode string for the Driver specified by\r
+                                This and the language specified by Language was\r
+                                returned in DriverName.\r
+\r
+  @retval EFI_INVALID_PARAMETER Language is NULL.\r
+\r
+  @retval EFI_INVALID_PARAMETER DriverName is NULL.\r
+\r
+  @retval EFI_UNSUPPORTED       The driver specified by This does not support\r
+                                the language specified by Language.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoComponentNameGetDriverName (\r
+  IN  EFI_COMPONENT_NAME_PROTOCOL  *This,\r
+  IN  CHAR8                        *Language,\r
+  OUT CHAR16                       **DriverName\r
+  );\r
+\r
+/**\r
+  Retrieves a Unicode string that is the user readable name of the controller\r
+  that is being managed by a driver.\r
+\r
+  This function retrieves the user readable name of the controller specified by\r
+  ControllerHandle and ChildHandle in the form of a Unicode string. If the\r
+  driver specified by This has a user readable name in the language specified by\r
+  Language, then a pointer to the controller name is returned in ControllerName,\r
+  and EFI_SUCCESS is returned.  If the driver specified by This is not currently\r
+  managing the controller specified by ControllerHandle and ChildHandle,\r
+  then EFI_UNSUPPORTED is returned.  If the driver specified by This does not\r
+  support the language specified by Language, then EFI_UNSUPPORTED is returned.\r
+\r
+  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
+                                EFI_COMPONENT_NAME_PROTOCOL instance.\r
+\r
+  @param  ControllerHandle[in]  The handle of a controller that the driver\r
+                                specified by This is managing.  This handle\r
+                                specifies the controller whose name is to be\r
+                                returned.\r
+\r
+  @param  ChildHandle[in]       The handle of the child controller to retrieve\r
+                                the name of.  This is an optional parameter that\r
+                                may be NULL.  It will be NULL for device\r
+                                drivers.  It will also be NULL for a bus drivers\r
+                                that wish to retrieve the name of the bus\r
+                                controller.  It will not be NULL for a bus\r
+                                driver that wishes to retrieve the name of a\r
+                                child controller.\r
+\r
+  @param  Language[in]          A pointer to a Null-terminated ASCII string\r
+                                array indicating the language.  This is the\r
+                                language of the driver name that the caller is\r
+                                requesting, and it must match one of the\r
+                                languages specified in SupportedLanguages. The\r
+                                number of languages supported by a driver is up\r
+                                to the driver writer. Language is specified in\r
+                                RFC 4646 or ISO 639-2 language code format.\r
+\r
+  @param  ControllerName[out]   A pointer to the Unicode string to return.\r
+                                This Unicode string is the name of the\r
+                                controller specified by ControllerHandle and\r
+                                ChildHandle in the language specified by\r
+                                Language from the point of view of the driver\r
+                                specified by This.\r
+\r
+  @retval EFI_SUCCESS           The Unicode string for the user readable name in\r
+                                the language specified by Language for the\r
+                                driver specified by This was returned in\r
+                                DriverName.\r
+\r
+  @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.\r
+\r
+  @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid\r
+                                EFI_HANDLE.\r
+\r
+  @retval EFI_INVALID_PARAMETER Language is NULL.\r
+\r
+  @retval EFI_INVALID_PARAMETER ControllerName is NULL.\r
+\r
+  @retval EFI_UNSUPPORTED       The driver specified by This is not currently\r
+                                managing the controller specified by\r
+                                ControllerHandle and ChildHandle.\r
+\r
+  @retval EFI_UNSUPPORTED       The driver specified by This does not support\r
+                                the language specified by Language.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoComponentNameGetControllerName (\r
+  IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,\r
+  IN  EFI_HANDLE                                      ControllerHandle,\r
+  IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,\r
+  IN  CHAR8                                           *Language,\r
+  OUT CHAR16                                          **ControllerName\r
+  );\r
+\r
+//\r
+// EFI Driver Health Functions\r
+//\r
+/**\r
+  Retrieves the health status of a controller in the platform.  This function can also \r
+  optionally return warning messages, error messages, and a set of HII Forms that may \r
+  be repair a controller that is not proper configured. \r
+  \r
+  @param  This             A pointer to the EFI_DRIVER_HEALTH_PROTOCOL instance.\r
+\r
+  @param  ControllerHandle The handle of the controller to retrieve the health status \r
+                           on.  This is an optional parameter that may be NULL.  If \r
+                           this parameter is NULL, then the value of ChildHandle is \r
+                           ignored, and the combined health status of all the devices \r
+                           that the driver is managing is returned.\r
+\r
+  @param  ChildHandle      The handle of the child controller to retrieve the health \r
+                           status on.  This is an optional parameter that may be NULL.  \r
+                           This parameter is ignored of ControllerHandle is NULL.  It \r
+                           will be NULL for device drivers.  It will also be NULL for \r
+                           bus drivers when an attempt is made to collect the health \r
+                           status of the bus controller.  If will not be NULL when an \r
+                           attempt is made to collect the health status for a child \r
+                           controller produced by the driver.\r
+\r
+  @param  HealthStatus     A pointer to the health status that is returned by this \r
+                           function.  This is an optional parameter that may be NULL.  \r
+                           This parameter is ignored of ControllerHandle is NULL.  \r
+                           The health status for the controller specified by \r
+                           ControllerHandle and ChildHandle is returned. \r
+\r
+  @param  MessageList      A pointer to an array of warning or error messages associated \r
+                           with the controller specified by ControllerHandle and \r
+                           ChildHandle.  This is an optional parameter that may be NULL.  \r
+                           MessageList is allocated by this function with the EFI Boot \r
+                           Service AllocatePool(), and it is the caller's responsibility \r
+                           to free MessageList with the EFI Boot Service FreePool().  \r
+                           Each message is specified by tuple of an EFI_HII_HANDLE and \r
+                           an EFI_STRING_ID.  The array of messages is terminated by tuple \r
+                           containing a EFI_HII_HANDLE with a value of NULL.  The \r
+                           EFI_HII_STRING_PROTOCOL.GetString() function can be used to \r
+                           retrieve the warning or error message as a Null-terminated \r
+                           Unicode string in a specific language.  Messages may be \r
+                           returned for any of the HealthStatus values except \r
+                           EfiDriverHealthStatusReconnectRequired and \r
+                           EfiDriverHealthStatusRebootRequired.\r
+\r
+  @param  FormHiiHandle    A pointer to the HII handle for an HII form associated with the \r
+                           controller specified by ControllerHandle and ChildHandle.  \r
+                           This is an optional parameter that may be NULL.  An HII form \r
+                           is specified by a combination of an EFI_HII_HANDLE and an \r
+                           EFI_GUID that identifies the Form Set GUID.  The \r
+                           EFI_FORM_BROWSER2_PROTOCOL.SendForm() function can be used \r
+                           to display and allow the user to make configuration changes \r
+                           to the HII Form.  An HII form may only be returned with a \r
+                           HealthStatus value of EfiDriverHealthStatusConfigurationRequired.\r
+\r
+  @retval EFI_SUCCESS           ControllerHandle is NULL, and all the controllers \r
+                                managed by this driver specified by This have a health \r
+                                status of EfiDriverHealthStatusHealthy with no warning \r
+                                messages to be returned.  The ChildHandle, HealthStatus, \r
+                                MessageList, and FormList parameters are ignored.\r
+\r
+  @retval EFI_DEVICE_ERROR      ControllerHandle is NULL, and one or more of the \r
+                                controllers managed by this driver specified by This \r
+                                do not have a health status of EfiDriverHealthStatusHealthy.  \r
+                                The ChildHandle, HealthStatus, MessageList, and \r
+                                FormList parameters are ignored.\r
+\r
+  @retval EFI_DEVICE_ERROR      ControllerHandle is NULL, and one or more of the \r
+                                controllers managed by this driver specified by This \r
+                                have one or more warning and/or error messages.  \r
+                                The ChildHandle, HealthStatus, MessageList, and \r
+                                FormList parameters are ignored.\r
+\r
+  @retval EFI_SUCCESS           ControllerHandle is not NULL and the health status \r
+                                of the controller specified by ControllerHandle and \r
+                                ChildHandle was returned in HealthStatus.  A list \r
+                                of warning and error messages may be optionally \r
+                                returned in MessageList, and a list of HII Forms \r
+                                may be optionally returned in FormList.\r
+\r
+  @retval EFI_UNSUPPORTED            ControllerHandle is not NULL, and the controller \r
+                                specified by ControllerHandle and ChildHandle is not \r
+                                currently being managed by the driver specified by This.\r
+\r
+  @retval EFI_INVALID_PARAMETER        HealthStatus is NULL.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES MessageList is not NULL, and there are not enough \r
+                                resource available to allocate memory for MessageList.\r
+\r
+**/\r
+EFI_STATUS\r
+DiskIoDriverHealthGetHealthStatus (\r
+  IN  EFI_DRIVER_HEALTH_PROTOCOL       *This,\r
+  IN  EFI_HANDLE                       ControllerHandle  OPTIONAL,\r
+  IN  EFI_HANDLE                       ChildHandle       OPTIONAL,\r
+  OUT EFI_DRIVER_HEALTH_STATUS         *HealthStatus,\r
+  OUT EFI_DRIVER_HEALTH_HII_MESSAGE    **MessageList     OPTIONAL,\r
+  OUT EFI_HII_HANDLE                   *FormHiiHandle    OPTIONAL\r
+  );\r
+\r
+/**\r
+  Performs a repair operation on a controller in the platform.  This function can \r
+  optionally report repair progress information back to the platform. \r
+  \r
+  @param  This             A pointer to the EFI_DRIVER_HEALTH_PROTOCOL instance.\r
+  @param  ControllerHandle The handle of the controller to repair.\r
+  @param  ChildHandle      The handle of the child controller to repair.  This is \r
+                           an optional parameter that may be NULL.  It will be NULL \r
+                           for device drivers.  It will also be NULL for bus \r
+                           drivers when an attempt is made to repair a bus controller.\r
+                           If will not be NULL when an attempt is made to repair a \r
+                           child controller produced by the driver.\r
+  @param  RepairNotify     A notification function that may be used by a driver to \r
+                           report the progress of the repair operation.  This is \r
+                           an optional parameter that may be NULL.  \r
+\r
+\r
+  @retval EFI_SUCCESS            An attempt to repair the controller specified by \r
+                                ControllerHandle and ChildHandle was performed.  \r
+                                The result of the repair operation can be \r
+                                determined by calling GetHealthStatus().\r
+  @retval EFI_UNSUPPORTED            The driver specified by This is not currently \r
+                                managing the controller specified by ControllerHandle \r
+                                and ChildHandle.\r
+  @retval EFI_OUT_OF_RESOURCES There are not enough resources to perform the \r
+                                repair operation.\r
+\r
+*/\r
+EFI_STATUS\r
+DiskIoDriverHealthRepair (\r
+  IN  EFI_DRIVER_HEALTH_PROTOCOL                *This,\r
+  IN  EFI_HANDLE                                ControllerHandle,\r
+  IN  EFI_HANDLE                                ChildHandle       OPTIONAL,\r
+  IN  EFI_DRIVER_HEALTH_REPAIR_PROGRESS_NOTIFY  RepairNotify      OPTIONAL\r
+  );\r
+\r
+/**\r
+  Initialize the serial configuration form.\r
+\r
+  @retval EFI_SUCCESS              The serial configuration form is initialized.\r
+  @retval EFI_OUT_OF_RESOURCES     Failed to allocate memory.\r
+  @retval Others                   Other errors as indicated.\r
+**/\r
+EFI_STATUS\r
+DiskIoConfigFormInit (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function allows a caller to extract the current configuration for one\r
+  or more named elements from the target driver.\r
+\r
+  @param  This                   Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+  @param  Request                A null-terminated Unicode string in\r
+                                 <ConfigRequest> format.\r
+  @param  Progress               On return, points to a character in the Request\r
+                                 string. Points to the string's null terminator if\r
+                                 request was successful. Points to the most recent\r
+                                 '&' before the first failing name/value pair (or\r
+                                 the beginning of the string if the failure is in\r
+                                 the first name/value pair) if the request was not\r
+                                 successful.\r
+  @param  Results                A null-terminated Unicode string in\r
+                                 <ConfigAltResp> format which has all values filled\r
+                                 in for the names in the Request string. String to\r
+                                 be allocated by the called function.\r
+\r
+  @retval EFI_SUCCESS            The Results is filled with the requested values.\r
+  @retval EFI_OUT_OF_RESOURCES   Not enough memory to store the results.\r
+  @retval EFI_INVALID_PARAMETER  Request is NULL, illegal syntax, or unknown name.\r
+  @retval EFI_NOT_FOUND          Routing data doesn't match any storage in this\r
+                                 driver.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DummyExtractConfig (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  CONST EFI_STRING                       Request,\r
+  OUT EFI_STRING                             *Progress,\r
+  OUT EFI_STRING                             *Results\r
+  );\r
+\r
+/**\r
+  This function processes the results of changes in configuration.\r
+\r
+  @param  This                   Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+  @param  Configuration          A null-terminated Unicode string in <ConfigResp>\r
+                                 format.\r
+  @param  Progress               A pointer to a string filled in with the offset of\r
+                                 the most recent '&' before the first failing\r
+                                 name/value pair (or the beginning of the string if\r
+                                 the failure is in the first name/value pair) or\r
+                                 the terminating NULL if all was successful.\r
+\r
+  @retval EFI_SUCCESS            The Results is processed successfully.\r
+  @retval EFI_INVALID_PARAMETER  Configuration is NULL.\r
+  @retval EFI_NOT_FOUND          Routing data doesn't match any storage in this\r
+                                 driver.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DummyRouteConfig (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  CONST EFI_STRING                       Configuration,\r
+  OUT EFI_STRING                             *Progress\r
+  );\r
+\r
+/**\r
+  This function processes the results of changes in configuration.\r
+\r
+  @param  This                   Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+  @param  Action                 Specifies the type of action taken by the browser.\r
+  @param  QuestionId             A unique value which is sent to the original\r
+                                 exporting driver so that it can identify the type\r
+                                 of data to expect.\r
+  @param  Type                   The type of value for the question.\r
+  @param  Value                  A pointer to the data being sent to the original\r
+                                 exporting driver.\r
+  @param  ActionRequest          On return, points to the action requested by the\r
+                                 callback function.\r
+\r
+  @retval EFI_SUCCESS            The callback successfully handled the action.\r
+  @retval EFI_OUT_OF_RESOURCES   Not enough storage is available to hold the\r
+                                 variable and its data.\r
+  @retval EFI_DEVICE_ERROR       The variable could not be saved.\r
+  @retval EFI_UNSUPPORTED        The specified Action is not supported by the\r
+                                 callback.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DummyDriverCallback (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  EFI_BROWSER_ACTION                     Action,\r
+  IN  EFI_QUESTION_ID                        QuestionId,\r
+  IN  UINT8                                  Type,\r
+  IN  EFI_IFR_TYPE_VALUE                     *Value,\r
+  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest\r
+  );\r
+\r
+/**\r
+  Add the ISO639-2 and RFC4646 component name both for the Disk IO device\r
+\r
+  @param DiskIoDevice     A pointer to the DISK_IO_PRIVATE_DATA instance.\r
+\r
+**/\r
+VOID\r
+AddName (\r
+  IN  DISK_IO_PRIVATE_DATA                     *DiskIoDevice\r
+  );\r
+\r
+#endif\r
diff --git a/OptionRomPkg/DriverHealthDxe/DriverHealthDxe.inf b/OptionRomPkg/DriverHealthDxe/DriverHealthDxe.inf
new file mode 100644 (file)
index 0000000..a524628
--- /dev/null
@@ -0,0 +1,72 @@
+#/** @file\r
+#  This is a sample driver produces Driver Health Protocol.  \r
+#\r
+#  It demos how to use Driver Health Protocol. The protocol is produced optional and make  \r
+#  the driver easier to be managed. \r
+#\r
+#  Copyright (c) 2009, Intel Corporation\r
+#  All rights reserved. This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\r
+#\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+#\r
+#**/\r
+\r
+################################################################################\r
+#\r
+# Defines Section - statements that will be processed to create a Makefile.\r
+#\r
+################################################################################\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = DriverHealthDxe\r
+  FILE_GUID                      = D1D9694C-90B4-46a7-8753-60413CEFE0A1\r
+  MODULE_TYPE                    = UEFI_DRIVER\r
+  VERSION_STRING                 = 1.0\r
+  ENTRY_POINT                    = InitializeDiskIo\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC\r
+#\r
+#  DRIVER_BINDING                =  gDiskIoDriverBinding\r
+#  COMPONENT_NAME                =  gDiskIoComponentName\r
+#\r
+\r
+\r
+[Sources.common]\r
+  ComponentName.c\r
+  DriverHealthDxe.h\r
+  DriverHealthDxe.c\r
+  DriverHealthStrings.uni\r
+  NVDataStruc.h\r
+  DriverHealthVfr.Vfr\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec\r
+  MdeModulePkg/MdeModulePkg.dec \r
+\r
+[LibraryClasses]\r
+  UefiBootServicesTableLib\r
+  UefiRuntimeServicesTableLib\r
+  MemoryAllocationLib\r
+  BaseMemoryLib\r
+  BaseLib\r
+  UefiLib\r
+  UefiDriverEntryPoint\r
+  DebugLib\r
+  HiiLib\r
+  \r
+[Protocols]\r
+  gEfiDiskIoProtocolGuid                        ## PROTOCOL BY_START\r
+  gEfiBlockIoProtocolGuid                       ## PROTOCOL TO_START\r
+  gEfiDriverHealthProtocolGuid                  ## PROTOCOL PRODUCES\r
+  gEfiHiiConfigRoutingProtocolGuid              ## PROTOCOL CONSUMES\r
+  gEfiHiiDatabaseProtocolGuid                   ## PROTOCOL CONSUMES\r
+  gEfiHiiConfigAccessProtocolGuid               ## PROTOCOL CONSUMES  
\ No newline at end of file
diff --git a/OptionRomPkg/DriverHealthDxe/DriverHealthStrings.uni b/OptionRomPkg/DriverHealthDxe/DriverHealthStrings.uni
new file mode 100644 (file)
index 0000000..70374b4
Binary files /dev/null and b/OptionRomPkg/DriverHealthDxe/DriverHealthStrings.uni differ
diff --git a/OptionRomPkg/DriverHealthDxe/DriverHealthVfr.Vfr b/OptionRomPkg/DriverHealthDxe/DriverHealthVfr.Vfr
new file mode 100644 (file)
index 0000000..2d7d4db
--- /dev/null
@@ -0,0 +1,60 @@
+// *++\r
+//\r
+// Copyright (c) 2009, Intel Corporation\r
+// All rights reserved. This program and the accompanying materials\r
+// are licensed and made available under the terms and conditions of the BSD License\r
+// which accompanies this distribution.  The full text of the license may be found at\r
+// http://opensource.org/licenses/bsd-license.php\r
+//\r
+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+//\r
+// Module Name:\r
+//\r
+//   Vfr.vfr\r
+//\r
+// Abstract:\r
+//\r
+//   Sample Setup formset\r
+//\r
+// Revision History:\r
+//\r
+// --*/\r
+\r
+\r
+\r
+#include "NVDataStruc.h"\r
+#include <Guid/HiiPlatformSetupFormset.h>\r
+\r
+formset\r
+  guid      = EFI_CALLER_ID_GUID,\r
+  title     = STRING_TOKEN(STR_FORM_SET_TITLE),\r
+  help      = STRING_TOKEN(STR_FORM_SET_TITLE_HELP),\r
+  classguid = EFI_HII_DRIVER_HEALTH_FORMSET_GUID,\r
+\r
+  //\r
+  // Define a Buffer Storage (EFI_IFR_VARSTORE)\r
+  //\r
+  varstore DISK_IO_NV_DATA,                   // This is the data structure type\r
+    varid = 0x1234,                           // Optional VarStore ID\r
+    name  = Config,                           // Define referenced name in vfr\r
+    guid  = EFI_CALLER_ID_GUID;               // GUID of this buffer storage\r
+    \r
+  form formid = 1,\r
+  \r
+       title  = STRING_TOKEN(STR_TITLE);      \r
+       //\r
+       // Define a numeric\r
+       //\r
+       numeric    varid    = Config.ConfigGood,\r
+                  prompt   = STRING_TOKEN(STR_CONFIG_CONTROLLER_LIST),\r
+                  help     = STRING_TOKEN(STR_CONFIG_CONTROLLER_LIST_HELP),\r
+                  flags    = DISPLAY_UINT_DEC,\r
+                  key      = 0x1236,\r
+                  minimum  = 0,\r
+                  maximum  = 0xff,\r
+                  default  = 0, \r
+       endnumeric;          \r
+  endform;\r
+  \r
+endformset;\r
diff --git a/OptionRomPkg/DriverHealthDxe/NVDataStruc.h b/OptionRomPkg/DriverHealthDxe/NVDataStruc.h
new file mode 100644 (file)
index 0000000..439fd68
--- /dev/null
@@ -0,0 +1,35 @@
+/*++\r
+\r
+Copyright (c) 2006 - 2009, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+Module Name:\r
+\r
+  NVDataStruc.h\r
+\r
+Abstract:\r
+\r
+  NVData structure used by the sample driver\r
\r
+Revision History: \r
\r
+--*/\r
+\r
+#ifndef _NVDATASTRUC_H\r
+#define _NVDATASTRUC_H\r
+\r
+#define EFI_CALLER_ID_GUID {0xD1D9694C, 0x90B4, 0x46a7, {0x87, 0x53, 0x60, 0x41, 0x3C, 0xEF, 0xE0, 0xA1}}\r
+\r
+#pragma pack(1)\r
+typedef struct {\r
+  UINT8  ConfigGood;\r
+} DISK_IO_NV_DATA;\r
+#pragma pack()\r
+\r
+#endif\r
index df5f83e..b3ce7a7 100644 (file)
@@ -56,6 +56,8 @@
   MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf\r
   DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf\r
   UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf\r
+  UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf\r
+  HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf\r
 \r
 ################################################################################\r
 #\r
   OptionRomPkg/AtapiPassThruDxe/AtapiPassThruDxe.inf\r
   OptionRomPkg/CirrusLogic5430Dxe/CirrusLogic5430Dxe.inf\r
   OptionRomPkg/UndiRuntimeDxe/UndiRuntimeDxe.inf\r
+  OptionRomPkg/DriverHealthDxe/DriverHealthDxe.inf\r
 \r