[edk2,edk2-platforms,v3,07/36] Silicon/Hisilicon/D06: Wait for all disk ready

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

Commit Message

Ming Huang Aug. 16, 2018, 12:12 p.m.
This patch is relative to D06 SasDxe driver. The SasDxe set a
variable to notice this libray. Here Wait for all disk ready
for 15S at most.

D06:
For using straight-through hard disk backboard, some disk need
15 seconds to ready. Actually, wait less 15 seconds here(minus
the time from end of SAS driver to here).
For using expander backboard, wait less 6 seconds here(minus
the time from end of SAS driver to here).

D03/D05:
As Sas driver don't install PLATFORM_SAS_NOTIFY Protocol, D03/D05
will skip waiting here.

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

---
 Silicon/Hisilicon/HisiPkg.dec                                               |  1 +
 Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf |  3 ++
 Silicon/Hisilicon/Include/Protocol/PlatformSasNotify.h                      | 27 ++++++++++++++
 Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c               | 37 ++++++++++++++++++++
 4 files changed, 68 insertions(+)

-- 
2.17.0

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

Comments

Leif Lindholm Aug. 22, 2018, 10:25 a.m. | #1
(Commenting on the v3 patch since I know it supersedes the v2 patch.)

On Thu, Aug 16, 2018 at 08:12:10PM +0800, Ming Huang wrote:
> This patch is relative to D06 SasDxe driver. The SasDxe set a

> variable to notice this libray. Here Wait for all disk ready

> for 15S at most.

> 

> D06:

> For using straight-through hard disk backboard, some disk need

> 15 seconds to ready. Actually, wait less 15 seconds here(minus

> the time from end of SAS driver to here).

> For using expander backboard, wait less 6 seconds here(minus

> the time from end of SAS driver to here).

> 

> D03/D05:

> As Sas driver don't install PLATFORM_SAS_NOTIFY Protocol, D03/D05

> will skip waiting here.

> 

> Contributed-under: TianoCore Contribution Agreement 1.1

> Signed-off-by: Ming Huang <ming.huang@linaro.org>

> ---

>  Silicon/Hisilicon/HisiPkg.dec                                               |  1 +

>  Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf |  3 ++

>  Silicon/Hisilicon/Include/Protocol/PlatformSasNotify.h                      | 27 ++++++++++++++

>  Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c               | 37 ++++++++++++++++++++

>  4 files changed, 68 insertions(+)

> 

> diff --git a/Silicon/Hisilicon/HisiPkg.dec b/Silicon/Hisilicon/HisiPkg.dec

> index 35bea970ec..0595790df8 100644

> --- a/Silicon/Hisilicon/HisiPkg.dec

> +++ b/Silicon/Hisilicon/HisiPkg.dec

> @@ -39,6 +39,7 @@

>    gPlatformSasProtocolGuid = {0x40e9829f, 0x3a2c, 0x479a, {0x9a, 0x93, 0x45, 0x7d, 0x13, 0x50, 0x96, 0x5d}}

>    gHisiPlatformSasProtocolGuid = {0x20e9829f, 0x3a2c, 0x479a, {0x9a, 0x93, 0x45, 0x7d, 0x13, 0x50, 0x96, 0x6d}}

>    gHisiSnpPlatformProtocolGuid = {0x81321f27, 0xff58, 0x4a1d, {0x99, 0x97, 0xd, 0xcc, 0xfa, 0x82, 0xf4, 0x6f}}

> +  gPlatformSasNotifyProtocolGuid = {0xac62b9a5, 0x9939, 0x41d3, {0xff, 0x5c, 0xc5, 0x80, 0x32, 0x7d, 0x9b, 0x29}}


Ideally, I would like to see a new package declaration file added in
edk2-non-osi/Silicon/Hisilicon. Maybe HisiliconNonOsi.dec. And this
guid added there.

>  

>  [Guids]

>    gHisiTokenSpaceGuid = {0xc8bc553e, 0x12bf, 0x11e6, {0x97, 0x4f, 0x87, 0xf7, 0x7c, 0xfd, 0x52, 0x1d}}

> diff --git a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf

> index 7a53befc44..96a46da8c5 100644

> --- a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf

> +++ b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf

> @@ -49,6 +49,7 @@

>    MemoryAllocationLib

>    PcdLib

>    PrintLib

> +  TimerLib

>    UefiBootManagerLib

>    UefiBootServicesTableLib

>    UefiLib

> @@ -67,8 +68,10 @@

>  [Guids]

>    gEfiEndOfDxeEventGroupGuid

>    gEfiTtyTermGuid

> +  gOemConfigGuid

>  

>  [Protocols]

>    gEfiGenericMemTestProtocolGuid

>    gEfiLoadedImageProtocolGuid

>    gEsrtManagementProtocolGuid

> +  gPlatformSasNotifyProtocolGuid

> diff --git a/Silicon/Hisilicon/Include/Protocol/PlatformSasNotify.h b/Silicon/Hisilicon/Include/Protocol/PlatformSasNotify.h

> new file mode 100644

> index 0000000000..54fd30fc68

> --- /dev/null

> +++ b/Silicon/Hisilicon/Include/Protocol/PlatformSasNotify.h


And similarly, this file added under edk2-non-osi/Silicon/Hisilicon/Include/Protocol.

Other than that, I am happy with this patch.

(Yes, I know we have not enforced this in the past, but it is way
cleaner and makes API-updates a single patch in a single repository.)

/
    Leif

> @@ -0,0 +1,27 @@

> +/** @file

> +*

> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.

> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.

> +*

> +*  This program and the accompanying materials

> +*  are licensed and made available under the terms and conditions of the BSD License

> +*  which accompanies this distribution.  The full text of the license may be found at

> +*  http://opensource.org/licenses/bsd-license.php

> +*

> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

> +*

> +**/

> +

> +#ifndef _PLATFORM_SAS_NOTIFY_H_

> +#define _PLATFORM_SAS_NOTIFY_H_

> +

> +typedef struct _PLATFORM_SAS_NOTIFY PLATFORM_SAS_NOTIFY;

> +

> +struct _PLATFORM_SAS_NOTIFY {

> +  EFI_EVENT               WaitDiskEvent;

> +};

> +

> +extern EFI_GUID gPlatformSasNotifyProtocolGuid;

> +

> +#endif

> diff --git a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c

> index 7dd5ba615c..eaa6ce78d0 100644

> --- a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c

> +++ b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c

> @@ -20,6 +20,7 @@

>  #include <Library/BmcConfigBootLib.h>

>  #include <Library/DevicePathLib.h>

>  #include <Library/PcdLib.h>

> +#include <Library/TimerLib.h>

>  #include <Library/UefiBootManagerLib.h>

>  #include <Library/UefiLib.h>

>  #include <Protocol/DevicePath.h>

> @@ -29,6 +30,7 @@

>  #include <Protocol/LoadedImage.h>

>  #include <Protocol/PciIo.h>

>  #include <Protocol/PciRootBridgeIo.h>

> +#include <Protocol/PlatformSasNotify.h>

>  #include <Guid/EventGroup.h>

>  #include <Guid/TtyTerm.h>

>  

> @@ -554,6 +556,40 @@ PlatformBootManagerBeforeConsole (

>    PlatformRegisterOptionsAndKeys ();

>  }

>  

> +STATIC

> +VOID

> +WaitForDiskReady (

> +  VOID

> +  )

> +{

> +  EFI_STATUS                Status;

> +  UINT32                    Index;

> +  PLATFORM_SAS_NOTIFY       *SasNotify;

> +

> +  Status = gBS->LocateProtocol (

> +                  &gPlatformSasNotifyProtocolGuid,

> +                  NULL,

> +                  (VOID **)&SasNotify);

> +  if (EFI_ERROR (Status)) {

> +    DEBUG ((DEBUG_INFO, "Locate SasPlatformNotify:%r\n", Status));

> +    return;

> +  }

> +

> +  // Wait for 30 seconds at most.

> +  for (Index = 0; Index < 30; Index++) {

> +    Status = gBS->CheckEvent (SasNotify->WaitDiskEvent);

> +    if (!EFI_ERROR (Status)) {

> +      DEBUG ((DEBUG_INFO, "WaitDiskEvent is signaled.\n"));

> +      EfiBootManagerConnectAll ();

> +      break;

> +    }

> +    DEBUG ((DEBUG_ERROR, "%a", Index == 0 ? "Wait for disk." : "."));

> +    MicroSecondDelay (1000 * 1000);

> +  }

> +

> +  return;

> +}

> +

>  /**

>    Do the platform specific action after the console is ready

>    Possible things that can be done in PlatformBootManagerAfterConsole:

> @@ -583,6 +619,7 @@ PlatformBootManagerAfterConsole (

>    // Connect the rest of the devices.

>    //

>    EfiBootManagerConnectAll ();

> +  WaitForDiskReady ();

>  

>    //

>    // Enumerate all possible boot options.

> -- 

> 2.17.0

> 

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Ming Huang Aug. 22, 2018, 3 p.m. | #2
On 8/22/2018 6:25 PM, Leif Lindholm wrote:
> (Commenting on the v3 patch since I know it supersedes the v2 patch.)

> 

> On Thu, Aug 16, 2018 at 08:12:10PM +0800, Ming Huang wrote:

>> This patch is relative to D06 SasDxe driver. The SasDxe set a

>> variable to notice this libray. Here Wait for all disk ready

>> for 15S at most.

>>

>> D06:

>> For using straight-through hard disk backboard, some disk need

>> 15 seconds to ready. Actually, wait less 15 seconds here(minus

>> the time from end of SAS driver to here).

>> For using expander backboard, wait less 6 seconds here(minus

>> the time from end of SAS driver to here).

>>

>> D03/D05:

>> As Sas driver don't install PLATFORM_SAS_NOTIFY Protocol, D03/D05

>> will skip waiting here.

>>

>> Contributed-under: TianoCore Contribution Agreement 1.1

>> Signed-off-by: Ming Huang <ming.huang@linaro.org>

>> ---

>>  Silicon/Hisilicon/HisiPkg.dec                                               |  1 +

>>  Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf |  3 ++

>>  Silicon/Hisilicon/Include/Protocol/PlatformSasNotify.h                      | 27 ++++++++++++++

>>  Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c               | 37 ++++++++++++++++++++

>>  4 files changed, 68 insertions(+)

>>

>> diff --git a/Silicon/Hisilicon/HisiPkg.dec b/Silicon/Hisilicon/HisiPkg.dec

>> index 35bea970ec..0595790df8 100644

>> --- a/Silicon/Hisilicon/HisiPkg.dec

>> +++ b/Silicon/Hisilicon/HisiPkg.dec

>> @@ -39,6 +39,7 @@

>>    gPlatformSasProtocolGuid = {0x40e9829f, 0x3a2c, 0x479a, {0x9a, 0x93, 0x45, 0x7d, 0x13, 0x50, 0x96, 0x5d}}

>>    gHisiPlatformSasProtocolGuid = {0x20e9829f, 0x3a2c, 0x479a, {0x9a, 0x93, 0x45, 0x7d, 0x13, 0x50, 0x96, 0x6d}}

>>    gHisiSnpPlatformProtocolGuid = {0x81321f27, 0xff58, 0x4a1d, {0x99, 0x97, 0xd, 0xcc, 0xfa, 0x82, 0xf4, 0x6f}}

>> +  gPlatformSasNotifyProtocolGuid = {0xac62b9a5, 0x9939, 0x41d3, {0xff, 0x5c, 0xc5, 0x80, 0x32, 0x7d, 0x9b, 0x29}}

> 

> Ideally, I would like to see a new package declaration file added in

> edk2-non-osi/Silicon/Hisilicon. Maybe HisiliconNonOsi.dec. And this

> guid added there.

> 

>>  

>>  [Guids]

>>    gHisiTokenSpaceGuid = {0xc8bc553e, 0x12bf, 0x11e6, {0x97, 0x4f, 0x87, 0xf7, 0x7c, 0xfd, 0x52, 0x1d}}

>> diff --git a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf

>> index 7a53befc44..96a46da8c5 100644

>> --- a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf

>> +++ b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf

>> @@ -49,6 +49,7 @@

>>    MemoryAllocationLib

>>    PcdLib

>>    PrintLib

>> +  TimerLib

>>    UefiBootManagerLib

>>    UefiBootServicesTableLib

>>    UefiLib

>> @@ -67,8 +68,10 @@

>>  [Guids]

>>    gEfiEndOfDxeEventGroupGuid

>>    gEfiTtyTermGuid

>> +  gOemConfigGuid

>>  

>>  [Protocols]

>>    gEfiGenericMemTestProtocolGuid

>>    gEfiLoadedImageProtocolGuid

>>    gEsrtManagementProtocolGuid

>> +  gPlatformSasNotifyProtocolGuid

>> diff --git a/Silicon/Hisilicon/Include/Protocol/PlatformSasNotify.h b/Silicon/Hisilicon/Include/Protocol/PlatformSasNotify.h

>> new file mode 100644

>> index 0000000000..54fd30fc68

>> --- /dev/null

>> +++ b/Silicon/Hisilicon/Include/Protocol/PlatformSasNotify.h

> 

> And similarly, this file added under edk2-non-osi/Silicon/Hisilicon/Include/Protocol.

> 

> Other than that, I am happy with this patch.

> 

> (Yes, I know we have not enforced this in the past, but it is way

> cleaner and makes API-updates a single patch in a single repository.)


OK, do it in v4.
Thanks.

> 

> /

>     Leif

> 

>> @@ -0,0 +1,27 @@

>> +/** @file

>> +*

>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.

>> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.

>> +*

>> +*  This program and the accompanying materials

>> +*  are licensed and made available under the terms and conditions of the BSD License

>> +*  which accompanies this distribution.  The full text of the license may be found at

>> +*  http://opensource.org/licenses/bsd-license.php

>> +*

>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

>> +*

>> +**/

>> +

>> +#ifndef _PLATFORM_SAS_NOTIFY_H_

>> +#define _PLATFORM_SAS_NOTIFY_H_

>> +

>> +typedef struct _PLATFORM_SAS_NOTIFY PLATFORM_SAS_NOTIFY;

>> +

>> +struct _PLATFORM_SAS_NOTIFY {

>> +  EFI_EVENT               WaitDiskEvent;

>> +};

>> +

>> +extern EFI_GUID gPlatformSasNotifyProtocolGuid;

>> +

>> +#endif

>> diff --git a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c

>> index 7dd5ba615c..eaa6ce78d0 100644

>> --- a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c

>> +++ b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c

>> @@ -20,6 +20,7 @@

>>  #include <Library/BmcConfigBootLib.h>

>>  #include <Library/DevicePathLib.h>

>>  #include <Library/PcdLib.h>

>> +#include <Library/TimerLib.h>

>>  #include <Library/UefiBootManagerLib.h>

>>  #include <Library/UefiLib.h>

>>  #include <Protocol/DevicePath.h>

>> @@ -29,6 +30,7 @@

>>  #include <Protocol/LoadedImage.h>

>>  #include <Protocol/PciIo.h>

>>  #include <Protocol/PciRootBridgeIo.h>

>> +#include <Protocol/PlatformSasNotify.h>

>>  #include <Guid/EventGroup.h>

>>  #include <Guid/TtyTerm.h>

>>  

>> @@ -554,6 +556,40 @@ PlatformBootManagerBeforeConsole (

>>    PlatformRegisterOptionsAndKeys ();

>>  }

>>  

>> +STATIC

>> +VOID

>> +WaitForDiskReady (

>> +  VOID

>> +  )

>> +{

>> +  EFI_STATUS                Status;

>> +  UINT32                    Index;

>> +  PLATFORM_SAS_NOTIFY       *SasNotify;

>> +

>> +  Status = gBS->LocateProtocol (

>> +                  &gPlatformSasNotifyProtocolGuid,

>> +                  NULL,

>> +                  (VOID **)&SasNotify);

>> +  if (EFI_ERROR (Status)) {

>> +    DEBUG ((DEBUG_INFO, "Locate SasPlatformNotify:%r\n", Status));

>> +    return;

>> +  }

>> +

>> +  // Wait for 30 seconds at most.

>> +  for (Index = 0; Index < 30; Index++) {

>> +    Status = gBS->CheckEvent (SasNotify->WaitDiskEvent);

>> +    if (!EFI_ERROR (Status)) {

>> +      DEBUG ((DEBUG_INFO, "WaitDiskEvent is signaled.\n"));

>> +      EfiBootManagerConnectAll ();

>> +      break;

>> +    }

>> +    DEBUG ((DEBUG_ERROR, "%a", Index == 0 ? "Wait for disk." : "."));

>> +    MicroSecondDelay (1000 * 1000);

>> +  }

>> +

>> +  return;

>> +}

>> +

>>  /**

>>    Do the platform specific action after the console is ready

>>    Possible things that can be done in PlatformBootManagerAfterConsole:

>> @@ -583,6 +619,7 @@ PlatformBootManagerAfterConsole (

>>    // Connect the rest of the devices.

>>    //

>>    EfiBootManagerConnectAll ();

>> +  WaitForDiskReady ();

>>  

>>    //

>>    // Enumerate all possible boot options.

>> -- 

>> 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/HisiPkg.dec b/Silicon/Hisilicon/HisiPkg.dec
index 35bea970ec..0595790df8 100644
--- a/Silicon/Hisilicon/HisiPkg.dec
+++ b/Silicon/Hisilicon/HisiPkg.dec
@@ -39,6 +39,7 @@ 
   gPlatformSasProtocolGuid = {0x40e9829f, 0x3a2c, 0x479a, {0x9a, 0x93, 0x45, 0x7d, 0x13, 0x50, 0x96, 0x5d}}
   gHisiPlatformSasProtocolGuid = {0x20e9829f, 0x3a2c, 0x479a, {0x9a, 0x93, 0x45, 0x7d, 0x13, 0x50, 0x96, 0x6d}}
   gHisiSnpPlatformProtocolGuid = {0x81321f27, 0xff58, 0x4a1d, {0x99, 0x97, 0xd, 0xcc, 0xfa, 0x82, 0xf4, 0x6f}}
+  gPlatformSasNotifyProtocolGuid = {0xac62b9a5, 0x9939, 0x41d3, {0xff, 0x5c, 0xc5, 0x80, 0x32, 0x7d, 0x9b, 0x29}}
 
 [Guids]
   gHisiTokenSpaceGuid = {0xc8bc553e, 0x12bf, 0x11e6, {0x97, 0x4f, 0x87, 0xf7, 0x7c, 0xfd, 0x52, 0x1d}}
diff --git a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
index 7a53befc44..96a46da8c5 100644
--- a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
+++ b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
@@ -49,6 +49,7 @@ 
   MemoryAllocationLib
   PcdLib
   PrintLib
+  TimerLib
   UefiBootManagerLib
   UefiBootServicesTableLib
   UefiLib
@@ -67,8 +68,10 @@ 
 [Guids]
   gEfiEndOfDxeEventGroupGuid
   gEfiTtyTermGuid
+  gOemConfigGuid
 
 [Protocols]
   gEfiGenericMemTestProtocolGuid
   gEfiLoadedImageProtocolGuid
   gEsrtManagementProtocolGuid
+  gPlatformSasNotifyProtocolGuid
diff --git a/Silicon/Hisilicon/Include/Protocol/PlatformSasNotify.h b/Silicon/Hisilicon/Include/Protocol/PlatformSasNotify.h
new file mode 100644
index 0000000000..54fd30fc68
--- /dev/null
+++ b/Silicon/Hisilicon/Include/Protocol/PlatformSasNotify.h
@@ -0,0 +1,27 @@ 
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef _PLATFORM_SAS_NOTIFY_H_
+#define _PLATFORM_SAS_NOTIFY_H_
+
+typedef struct _PLATFORM_SAS_NOTIFY PLATFORM_SAS_NOTIFY;
+
+struct _PLATFORM_SAS_NOTIFY {
+  EFI_EVENT               WaitDiskEvent;
+};
+
+extern EFI_GUID gPlatformSasNotifyProtocolGuid;
+
+#endif
diff --git a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
index 7dd5ba615c..eaa6ce78d0 100644
--- a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
+++ b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
@@ -20,6 +20,7 @@ 
 #include <Library/BmcConfigBootLib.h>
 #include <Library/DevicePathLib.h>
 #include <Library/PcdLib.h>
+#include <Library/TimerLib.h>
 #include <Library/UefiBootManagerLib.h>
 #include <Library/UefiLib.h>
 #include <Protocol/DevicePath.h>
@@ -29,6 +30,7 @@ 
 #include <Protocol/LoadedImage.h>
 #include <Protocol/PciIo.h>
 #include <Protocol/PciRootBridgeIo.h>
+#include <Protocol/PlatformSasNotify.h>
 #include <Guid/EventGroup.h>
 #include <Guid/TtyTerm.h>
 
@@ -554,6 +556,40 @@  PlatformBootManagerBeforeConsole (
   PlatformRegisterOptionsAndKeys ();
 }
 
+STATIC
+VOID
+WaitForDiskReady (
+  VOID
+  )
+{
+  EFI_STATUS                Status;
+  UINT32                    Index;
+  PLATFORM_SAS_NOTIFY       *SasNotify;
+
+  Status = gBS->LocateProtocol (
+                  &gPlatformSasNotifyProtocolGuid,
+                  NULL,
+                  (VOID **)&SasNotify);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_INFO, "Locate SasPlatformNotify:%r\n", Status));
+    return;
+  }
+
+  // Wait for 30 seconds at most.
+  for (Index = 0; Index < 30; Index++) {
+    Status = gBS->CheckEvent (SasNotify->WaitDiskEvent);
+    if (!EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_INFO, "WaitDiskEvent is signaled.\n"));
+      EfiBootManagerConnectAll ();
+      break;
+    }
+    DEBUG ((DEBUG_ERROR, "%a", Index == 0 ? "Wait for disk." : "."));
+    MicroSecondDelay (1000 * 1000);
+  }
+
+  return;
+}
+
 /**
   Do the platform specific action after the console is ready
   Possible things that can be done in PlatformBootManagerAfterConsole:
@@ -583,6 +619,7 @@  PlatformBootManagerAfterConsole (
   // Connect the rest of the devices.
   //
   EfiBootManagerConnectAll ();
+  WaitForDiskReady ();
 
   //
   // Enumerate all possible boot options.