diff mbox series

[edk2,v2,3/4] ArmVirtPkg/FdtClientDxe: install DT configuration table at ReadyToBoot

Message ID 1489080073-13328-4-git-send-email-ard.biesheuvel@linaro.org
State Accepted
Commit 18f6d4df9ece8b91b86511bcdd1cf7da478c3627
Headers show
Series ArmVirtPkg: make DT vs ACPI support mutually exclusive | expand

Commit Message

Ard Biesheuvel March 9, 2017, 5:21 p.m. UTC
Defer FDT configuration table installation until ReadyToBoot is signaled.
This allows any driver to make modifications in the mean time, and will
also allow us to defer the decision of whether to install it in the first
place to later on in the boot.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

---
 ArmVirtPkg/FdtClientDxe/FdtClientDxe.c   | 49 ++++++++++++++++----
 ArmVirtPkg/FdtClientDxe/FdtClientDxe.inf |  1 +
 2 files changed, 41 insertions(+), 9 deletions(-)

-- 
2.7.4

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

Comments

Laszlo Ersek March 9, 2017, 5:33 p.m. UTC | #1
On 03/09/17 18:21, Ard Biesheuvel wrote:
> Defer FDT configuration table installation until ReadyToBoot is signaled.

> This allows any driver to make modifications in the mean time, and will

> also allow us to defer the decision of whether to install it in the first

> place to later on in the boot.

> 

> Contributed-under: TianoCore Contribution Agreement 1.0

> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

> ---

>  ArmVirtPkg/FdtClientDxe/FdtClientDxe.c   | 49 ++++++++++++++++----

>  ArmVirtPkg/FdtClientDxe/FdtClientDxe.inf |  1 +

>  2 files changed, 41 insertions(+), 9 deletions(-)

> 

> diff --git a/ArmVirtPkg/FdtClientDxe/FdtClientDxe.c b/ArmVirtPkg/FdtClientDxe/FdtClientDxe.c

> index 547a29fce62c..4cf79f70cb2a 100644

> --- a/ArmVirtPkg/FdtClientDxe/FdtClientDxe.c

> +++ b/ArmVirtPkg/FdtClientDxe/FdtClientDxe.c

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

>  #include <Library/HobLib.h>

>  #include <libfdt.h>

>  

> +#include <Guid/EventGroup.h>

>  #include <Guid/Fdt.h>

>  #include <Guid/FdtHob.h>

>  

> @@ -306,6 +307,30 @@ STATIC FDT_CLIENT_PROTOCOL mFdtClientProtocol = {

>    GetOrInsertChosenNode,

>  };

>  

> +STATIC

> +VOID

> +EFIAPI

> +OnReadyToBoot (

> +  EFI_EVENT       Event,

> +  VOID            *Context

> +  )

> +{

> +  EFI_STATUS      Status;

> +

> +  if (!FeaturePcdGet (PcdPureAcpiBoot)) {

> +    //

> +    // Only install the FDT as a configuration table if we want to leave it up

> +    // to the OS to decide whether it prefers ACPI over DT.

> +    //

> +    Status = gBS->InstallConfigurationTable (&gFdtTableGuid, mDeviceTreeBase);

> +    ASSERT_EFI_ERROR (Status);

> +  }

> +

> +  gBS->CloseEvent (Event);

> +}

> +

> +STATIC EFI_EVENT         mReadyToBootEvent;

> +

>  EFI_STATUS

>  EFIAPI

>  InitializeFdtClientDxe (

> @@ -333,15 +358,21 @@ InitializeFdtClientDxe (

>  

>    DEBUG ((EFI_D_INFO, "%a: DTB @ 0x%p\n", __FUNCTION__, mDeviceTreeBase));

>  

> -  if (!FeaturePcdGet (PcdPureAcpiBoot)) {

> -    //

> -    // Only install the FDT as a configuration table if we want to leave it up

> -    // to the OS to decide whether it prefers ACPI over DT.

> -    //

> -    Status = gBS->InstallConfigurationTable (&gFdtTableGuid, DeviceTreeBase);

> -    ASSERT_EFI_ERROR (Status);

> +  Status = gBS->InstallProtocolInterface (&ImageHandle, &gFdtClientProtocolGuid,

> +                  EFI_NATIVE_INTERFACE, &mFdtClientProtocol);

> +  if (EFI_ERROR (Status)) {

> +    return Status;

>    }

>  

> -  return gBS->InstallProtocolInterface (&ImageHandle, &gFdtClientProtocolGuid,

> -                EFI_NATIVE_INTERFACE, &mFdtClientProtocol);

> +  Status = gBS->CreateEventEx (

> +                  EVT_NOTIFY_SIGNAL,

> +                  TPL_CALLBACK,

> +                  OnReadyToBoot,

> +                  NULL,

> +                  &gEfiEventReadyToBootGuid,

> +                  &mReadyToBootEvent

> +                  );

> +  ASSERT_EFI_ERROR (Status);

> +

> +  return EFI_SUCCESS;

>  }

> diff --git a/ArmVirtPkg/FdtClientDxe/FdtClientDxe.inf b/ArmVirtPkg/FdtClientDxe/FdtClientDxe.inf

> index 3a0cd37040eb..00017727c32c 100644

> --- a/ArmVirtPkg/FdtClientDxe/FdtClientDxe.inf

> +++ b/ArmVirtPkg/FdtClientDxe/FdtClientDxe.inf

> @@ -42,6 +42,7 @@ [Protocols]

>    gFdtClientProtocolGuid                  ## PRODUCES

>  

>  [Guids]

> +  gEfiEventReadyToBootGuid

>    gFdtHobGuid

>    gFdtTableGuid

>  

> 


Reviewed-by: Laszlo Ersek <lersek@redhat.com>

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

Patch

diff --git a/ArmVirtPkg/FdtClientDxe/FdtClientDxe.c b/ArmVirtPkg/FdtClientDxe/FdtClientDxe.c
index 547a29fce62c..4cf79f70cb2a 100644
--- a/ArmVirtPkg/FdtClientDxe/FdtClientDxe.c
+++ b/ArmVirtPkg/FdtClientDxe/FdtClientDxe.c
@@ -20,6 +20,7 @@ 
 #include <Library/HobLib.h>
 #include <libfdt.h>
 
+#include <Guid/EventGroup.h>
 #include <Guid/Fdt.h>
 #include <Guid/FdtHob.h>
 
@@ -306,6 +307,30 @@  STATIC FDT_CLIENT_PROTOCOL mFdtClientProtocol = {
   GetOrInsertChosenNode,
 };
 
+STATIC
+VOID
+EFIAPI
+OnReadyToBoot (
+  EFI_EVENT       Event,
+  VOID            *Context
+  )
+{
+  EFI_STATUS      Status;
+
+  if (!FeaturePcdGet (PcdPureAcpiBoot)) {
+    //
+    // Only install the FDT as a configuration table if we want to leave it up
+    // to the OS to decide whether it prefers ACPI over DT.
+    //
+    Status = gBS->InstallConfigurationTable (&gFdtTableGuid, mDeviceTreeBase);
+    ASSERT_EFI_ERROR (Status);
+  }
+
+  gBS->CloseEvent (Event);
+}
+
+STATIC EFI_EVENT         mReadyToBootEvent;
+
 EFI_STATUS
 EFIAPI
 InitializeFdtClientDxe (
@@ -333,15 +358,21 @@  InitializeFdtClientDxe (
 
   DEBUG ((EFI_D_INFO, "%a: DTB @ 0x%p\n", __FUNCTION__, mDeviceTreeBase));
 
-  if (!FeaturePcdGet (PcdPureAcpiBoot)) {
-    //
-    // Only install the FDT as a configuration table if we want to leave it up
-    // to the OS to decide whether it prefers ACPI over DT.
-    //
-    Status = gBS->InstallConfigurationTable (&gFdtTableGuid, DeviceTreeBase);
-    ASSERT_EFI_ERROR (Status);
+  Status = gBS->InstallProtocolInterface (&ImageHandle, &gFdtClientProtocolGuid,
+                  EFI_NATIVE_INTERFACE, &mFdtClientProtocol);
+  if (EFI_ERROR (Status)) {
+    return Status;
   }
 
-  return gBS->InstallProtocolInterface (&ImageHandle, &gFdtClientProtocolGuid,
-                EFI_NATIVE_INTERFACE, &mFdtClientProtocol);
+  Status = gBS->CreateEventEx (
+                  EVT_NOTIFY_SIGNAL,
+                  TPL_CALLBACK,
+                  OnReadyToBoot,
+                  NULL,
+                  &gEfiEventReadyToBootGuid,
+                  &mReadyToBootEvent
+                  );
+  ASSERT_EFI_ERROR (Status);
+
+  return EFI_SUCCESS;
 }
diff --git a/ArmVirtPkg/FdtClientDxe/FdtClientDxe.inf b/ArmVirtPkg/FdtClientDxe/FdtClientDxe.inf
index 3a0cd37040eb..00017727c32c 100644
--- a/ArmVirtPkg/FdtClientDxe/FdtClientDxe.inf
+++ b/ArmVirtPkg/FdtClientDxe/FdtClientDxe.inf
@@ -42,6 +42,7 @@  [Protocols]
   gFdtClientProtocolGuid                  ## PRODUCES
 
 [Guids]
+  gEfiEventReadyToBootGuid
   gFdtHobGuid
   gFdtTableGuid