From 93f9a23f8771e718106d1c024b8d0a466f8ddcda Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Fri, 8 Apr 2016 11:44:53 +0200 Subject: ArmVirtPkg/ArmVirtPsciResetSystemLib: move to FDT client protocol Instead of relying on VirtFdtDxe to detect the PSCI method, move our EfiResetSystemLib to the FDT client protocol to interrogate the device tree directly. Since this library is only consumed by EmbeddedPkg/ResetRuntimeDxe, and considering that the PCD is no longer set, and even removed completely in a subsequent patch, this conversion is guaranteed to be safe. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel Reviewed-by: Laszlo Ersek --- .../ArmVirtPsciResetSystemLib.c | 29 ++++++++++++++++++++-- .../ArmVirtPsciResetSystemLib.inf | 14 +++++++---- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/ArmVirtPkg/Library/ArmVirtPsciResetSystemLib/ArmVirtPsciResetSystemLib.c b/ArmVirtPkg/Library/ArmVirtPsciResetSystemLib/ArmVirtPsciResetSystemLib.c index 88332f56fd..b94d1b0090 100644 --- a/ArmVirtPkg/Library/ArmVirtPsciResetSystemLib/ArmVirtPsciResetSystemLib.c +++ b/ArmVirtPkg/Library/ArmVirtPsciResetSystemLib/ArmVirtPsciResetSystemLib.c @@ -26,9 +26,12 @@ #include #include #include +#include #include +#include + STATIC UINT32 mArmPsciMethod; RETURN_STATUS @@ -37,8 +40,30 @@ ArmPsciResetSystemLibConstructor ( VOID ) { - mArmPsciMethod = PcdGet32 (PcdArmPsciMethod); - return RETURN_SUCCESS; + EFI_STATUS Status; + FDT_CLIENT_PROTOCOL *FdtClient; + CONST VOID *Prop; + + Status = gBS->LocateProtocol (&gFdtClientProtocolGuid, NULL, + (VOID **)&FdtClient); + ASSERT_EFI_ERROR (Status); + + Status = FdtClient->FindCompatibleNodeProperty (FdtClient, "arm,psci-0.2", + "method", &Prop, NULL); + if (EFI_ERROR (Status)) { + return Status; + } + + if (AsciiStrnCmp (Prop, "hvc", 3) == 0) { + mArmPsciMethod = 1; + } else if (AsciiStrnCmp (Prop, "smc", 3) == 0) { + mArmPsciMethod = 2; + } else { + DEBUG ((EFI_D_ERROR, "%a: Unknown PSCI method \"%a\"\n", __FUNCTION__, + Prop)); + return EFI_NOT_FOUND; + } + return EFI_SUCCESS; } /** diff --git a/ArmVirtPkg/Library/ArmVirtPsciResetSystemLib/ArmVirtPsciResetSystemLib.inf b/ArmVirtPkg/Library/ArmVirtPsciResetSystemLib/ArmVirtPsciResetSystemLib.inf index 86d6104ca2..9dc515aee5 100644 --- a/ArmVirtPkg/Library/ArmVirtPsciResetSystemLib/ArmVirtPsciResetSystemLib.inf +++ b/ArmVirtPkg/Library/ArmVirtPsciResetSystemLib/ArmVirtPsciResetSystemLib.inf @@ -20,7 +20,7 @@ FILE_GUID = c81d76ed-66fa-44a3-ac4a-f163120187a9 MODULE_TYPE = BASE VERSION_STRING = 1.0 - LIBRARY_CLASS = EfiResetSystemLib + LIBRARY_CLASS = EfiResetSystemLib|DXE_DRIVER DXE_RUNTIME_DRIVER CONSTRUCTOR = ArmPsciResetSystemLibConstructor [Sources] @@ -33,10 +33,14 @@ EmbeddedPkg/EmbeddedPkg.dec [LibraryClasses] - DebugLib - BaseLib ArmSmcLib ArmHvcLib + BaseLib + DebugLib + UefiBootServicesTableLib + +[Protocols] + gFdtClientProtocolGuid ## CONSUMES -[Pcd] - gArmVirtTokenSpaceGuid.PcdArmPsciMethod +[Depex] + gFdtClientProtocolGuid -- cgit v1.2.3