[edk2,edk2-platforms,v3,12/36] Silicon/Hisilicon/D06: Stop watchdog

Message ID 20180816121239.44129-13-ming.huang@linaro.org
State Superseded
Headers show
Series
  • Upload for D06 platform
Related show

Commit Message

Ming Huang Aug. 16, 2018, 12:12 p.m.
according as watchdog design on D06, watchdog should be
stopped before boot a option.

This is an out of band watchdog timer in BMC; it is used
to monitor the whole BIOS boot process and reset the system
in case BIOS hangs somewhere, i.e. it is armed when system
is power on, and disabled before handling system control to
OS, while UEFI boot services watchdog is only armed before
invoking a boot option. So they are two different watchdogs.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>

---
 Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf |  1 +
 Silicon/Hisilicon/Include/Library/IpmiCmdLib.h                              | 16 ++++++++++++++
 Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c               | 22 ++++++++++++++++++++
 3 files changed, 39 insertions(+)

-- 
2.17.0

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Patch

diff --git a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
index 96a46da8c5..ecbe724dfe 100644
--- a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
+++ b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
@@ -46,6 +46,7 @@ 
   DebugLib
   DevicePathLib
   DxeServicesLib
+  IpmiCmdLib
   MemoryAllocationLib
   PcdLib
   PrintLib
diff --git a/Silicon/Hisilicon/Include/Library/IpmiCmdLib.h b/Silicon/Hisilicon/Include/Library/IpmiCmdLib.h
index 8868b76135..b956ee6d07 100644
--- a/Silicon/Hisilicon/Include/Library/IpmiCmdLib.h
+++ b/Silicon/Hisilicon/Include/Library/IpmiCmdLib.h
@@ -19,6 +19,17 @@ 
 #define BOOT_OPTION_BOOT_FLAG_VALID         1
 #define BOOT_OPTION_BOOT_FLAG_INVALID       0
 
+typedef enum {
+  EfiReserved,
+  EfiBiosFrb2,
+  EfiBiosPost,
+  EfiOsLoad,
+  EfiSmsOs,
+  EfiOem,
+  EfiFrbReserved1,
+  EfiFrbReserved2
+} EFI_WDT_USER_TYPE;
+
 typedef enum {
   NoOverride = 0x0,
   ForcePxe,
@@ -91,4 +102,9 @@  IpmiCmdGetSysBootOptions (
   IN IPMI_GET_BOOT_OPTION   *BootOption
   );
 
+EFI_STATUS
+IpmiCmdStopWatchdogTimer (
+  IN EFI_WDT_USER_TYPE  UserType
+  );
+
 #endif
diff --git a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
index eaa6ce78d0..56ca8d63b0 100644
--- a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
+++ b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
@@ -19,6 +19,8 @@ 
 #include <Library/BootLogoLib.h>
 #include <Library/BmcConfigBootLib.h>
 #include <Library/DevicePathLib.h>
+#include <Library/IpmiCmdLib.h>
+#include <Library/OemConfigData.h>
 #include <Library/PcdLib.h>
 #include <Library/TimerLib.h>
 #include <Library/UefiBootManagerLib.h>
@@ -609,6 +611,8 @@  PlatformBootManagerAfterConsole (
 {
   EFI_STATUS Status;
   ESRT_MANAGEMENT_PROTOCOL           *EsrtManagement = NULL;
+  OEM_CONFIG_DATA                    SetupData;
+  UINTN                              DataSize = sizeof (OEM_CONFIG_DATA);
 
   //
   // Show the splash screen.
@@ -645,6 +649,24 @@  PlatformBootManagerAfterConsole (
     );
 
   HandleBmcBootType ();
+
+  //Disable POST Watch Dog before attempting boot
+  Status = gRT->GetVariable (
+                  OEM_CONFIG_NAME,
+                  &gOemConfigGuid,
+                  NULL,
+                  &DataSize,
+                  &SetupData
+                  );
+
+  if (!EFI_ERROR (Status)) {
+    if (SetupData.BmcWdtEnable) {
+      Status = IpmiCmdStopWatchdogTimer (EfiBiosPost);
+      if (EFI_ERROR (Status)) {
+        DEBUG ((DEBUG_ERROR, "%a:%r\n", __FUNCTION__, Status));
+      }
+    }
+  }
 }
 
 /**