#include <Library/EfiResetSystemLib.h>\r
#include <Library/ArmSmcLib.h>\r
#include <Library/ArmHvcLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
\r
#include <IndustryStandard/ArmStdSmc.h>\r
\r
+#include <Protocol/FdtClient.h>\r
+\r
STATIC UINT32 mArmPsciMethod;\r
\r
RETURN_STATUS\r
VOID\r
)\r
{\r
- mArmPsciMethod = PcdGet32 (PcdArmPsciMethod);\r
- return RETURN_SUCCESS;\r
+ EFI_STATUS Status;\r
+ FDT_CLIENT_PROTOCOL *FdtClient;\r
+ CONST VOID *Prop;\r
+\r
+ Status = gBS->LocateProtocol (&gFdtClientProtocolGuid, NULL,\r
+ (VOID **)&FdtClient);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = FdtClient->FindCompatibleNodeProperty (FdtClient, "arm,psci-0.2",\r
+ "method", &Prop, NULL);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ if (AsciiStrnCmp (Prop, "hvc", 3) == 0) {\r
+ mArmPsciMethod = 1;\r
+ } else if (AsciiStrnCmp (Prop, "smc", 3) == 0) {\r
+ mArmPsciMethod = 2;\r
+ } else {\r
+ DEBUG ((EFI_D_ERROR, "%a: Unknown PSCI method \"%a\"\n", __FUNCTION__,\r
+ Prop));\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ return EFI_SUCCESS;\r
}\r
\r
/**\r
FILE_GUID = c81d76ed-66fa-44a3-ac4a-f163120187a9\r
MODULE_TYPE = BASE\r
VERSION_STRING = 1.0\r
- LIBRARY_CLASS = EfiResetSystemLib\r
+ LIBRARY_CLASS = EfiResetSystemLib|DXE_DRIVER DXE_RUNTIME_DRIVER\r
CONSTRUCTOR = ArmPsciResetSystemLibConstructor\r
\r
[Sources]\r
EmbeddedPkg/EmbeddedPkg.dec\r
\r
[LibraryClasses]\r
- DebugLib\r
- BaseLib\r
ArmSmcLib\r
ArmHvcLib\r
+ BaseLib\r
+ DebugLib\r
+ UefiBootServicesTableLib\r
+\r
+[Protocols]\r
+ gFdtClientProtocolGuid ## CONSUMES\r
\r
-[Pcd]\r
- gArmVirtTokenSpaceGuid.PcdArmPsciMethod\r
+[Depex]\r
+ gFdtClientProtocolGuid\r