Do a generic Cold Reset for OMAP3550 and BeagleBoard specific Warm reset\r
\r
Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>\r
+ Copyright (c) 2017, Linaro Ltd. All rights reserved.<BR>\r
\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
\r
#include <Uefi.h>\r
\r
-#include <Library/ArmLib.h>\r
-#include <Library/CacheMaintenanceLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
#include <Library/IoLib.h>\r
-#include <Library/PcdLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/ResetSystemLib.h>\r
\r
#include <Omap3530/Omap3530.h>\r
\r
+/**\r
+ This function causes a system-wide reset (cold reset), in which\r
+ all circuitry within the system returns to its initial state. This type of\r
+ reset is asynchronous to system operation and operates without regard to\r
+ cycle boundaries.\r
\r
+ If this function returns, it means that the system does not support cold\r
+ reset.\r
+**/\r
VOID\r
-ShutdownEfi (\r
+EFIAPI\r
+ResetCold (\r
VOID\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN MemoryMapSize;\r
- EFI_MEMORY_DESCRIPTOR *MemoryMap;\r
- UINTN MapKey;\r
- UINTN DescriptorSize;\r
- UINTN DescriptorVersion;\r
- UINTN Pages;\r
-\r
- MemoryMap = NULL;\r
- MemoryMapSize = 0;\r
- do {\r
- Status = gBS->GetMemoryMap (\r
- &MemoryMapSize,\r
- MemoryMap,\r
- &MapKey,\r
- &DescriptorSize,\r
- &DescriptorVersion\r
- );\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
-\r
- Pages = EFI_SIZE_TO_PAGES (MemoryMapSize) + 1;\r
- MemoryMap = AllocatePages (Pages);\r
-\r
- //\r
- // Get System MemoryMap\r
- //\r
- Status = gBS->GetMemoryMap (\r
- &MemoryMapSize,\r
- MemoryMap,\r
- &MapKey,\r
- &DescriptorSize,\r
- &DescriptorVersion\r
- );\r
- // Don't do anything between the GetMemoryMap() and ExitBootServices()\r
- if (!EFI_ERROR (Status)) {\r
- Status = gBS->ExitBootServices (gImageHandle, MapKey);\r
- if (EFI_ERROR (Status)) {\r
- FreePages (MemoryMap, Pages);\r
- MemoryMap = NULL;\r
- MemoryMapSize = 0;\r
- }\r
- }\r
- }\r
- } while (EFI_ERROR (Status));\r
-\r
- //Clean and invalidate caches.\r
- WriteBackInvalidateDataCache();\r
- InvalidateInstructionCache();\r
-\r
- //Turning off Caches and MMU\r
- ArmDisableDataCache ();\r
- ArmDisableInstructionCache ();\r
- ArmDisableMmu ();\r
+ //Perform cold reset of the system.\r
+ MmioOr32 (PRM_RSTCTRL, RST_DPLL3);\r
+ while ((MmioRead32(PRM_RSTST) & GLOBAL_COLD_RST) != 0x1);\r
}\r
\r
-typedef\r
+/**\r
+ This function causes a system-wide initialization (warm reset), in which all\r
+ processors are set to their initial state. Pending cycles are not corrupted.\r
+\r
+ If this function returns, it means that the system does not support warm\r
+ reset.\r
+**/\r
VOID\r
-(EFIAPI *CALL_STUB)(\r
+EFIAPI\r
+ResetWarm (\r
VOID\r
-);\r
-\r
+ )\r
+{\r
+ ResetCold ();\r
+}\r
\r
/**\r
- Resets the entire platform.\r
-\r
- @param ResetType The type of reset to perform.\r
- @param ResetStatus The status code for the reset.\r
- @param DataSize The size, in bytes, of WatchdogData.\r
- @param ResetData For a ResetType of EfiResetCold, EfiResetWarm, or\r
- EfiResetShutdown the data buffer starts with a Null-terminated\r
- Unicode string, optionally followed by additional binary data.\r
+ This function causes the system to enter a power state equivalent\r
+ to the ACPI G2/S5 or G3 states.\r
\r
+ If this function returns, it means that the system does not support shut down\r
+ reset.\r
**/\r
-EFI_STATUS\r
+VOID\r
EFIAPI\r
-LibResetSystem (\r
- IN EFI_RESET_TYPE ResetType,\r
- IN EFI_STATUS ResetStatus,\r
- IN UINTN DataSize,\r
- IN CHAR16 *ResetData OPTIONAL\r
+ResetShutdown (\r
+ VOID\r
)\r
{\r
- CALL_STUB StartOfFv;\r
-\r
- if (ResetData != NULL) {\r
- DEBUG((EFI_D_ERROR, "%s", ResetData));\r
- }\r
-\r
- ShutdownEfi ();\r
-\r
- switch (ResetType) {\r
- case EfiResetWarm:\r
- //Perform warm reset of the system by jumping to the begining of the FV\r
- StartOfFv = (CALL_STUB)(UINTN)PcdGet64 (PcdFvBaseAddress);\r
- StartOfFv ();\r
- break;\r
- case EfiResetCold:\r
- case EfiResetShutdown:\r
- default:\r
- //Perform cold reset of the system.\r
- MmioOr32 (PRM_RSTCTRL, RST_DPLL3);\r
- while ((MmioRead32(PRM_RSTST) & GLOBAL_COLD_RST) != 0x1);\r
- break;\r
- }\r
-\r
- // If the reset didn't work, return an error.\r
- ASSERT (FALSE);\r
- return EFI_DEVICE_ERROR;\r
+ // not implemented\r
}\r
\r
-\r
-\r
/**\r
- Initialize any infrastructure required for LibResetSystem () to function.\r
-\r
- @param ImageHandle The firmware allocated handle for the EFI image.\r
- @param SystemTable A pointer to the EFI System Table.\r
-\r
- @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.\r
+ This function causes the system to enter S3 and then wake up immediately.\r
\r
+ If this function returns, it means that the system does not support S3\r
+ feature.\r
**/\r
-EFI_STATUS\r
+VOID\r
EFIAPI\r
-LibInitializeResetSystem (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
+EnterS3WithImmediateWake (\r
+ VOID\r
)\r
{\r
- return EFI_SUCCESS;\r
+ // not implemented\r
}\r
\r
+/**\r
+ This function causes a systemwide reset. The exact type of the reset is\r
+ defined by the EFI_GUID that follows the Null-terminated Unicode string passed\r
+ into ResetData. If the platform does not recognize the EFI_GUID in ResetData\r
+ the platform must pick a supported reset type to perform.The platform may\r
+ optionally log the parameters from any non-normal reset that occurs.\r
+\r
+ @param[in] DataSize The size, in bytes, of ResetData.\r
+ @param[in] ResetData The data buffer starts with a Null-terminated string,\r
+ followed by the EFI_GUID.\r
+**/\r
+VOID\r
+EFIAPI\r
+ResetPlatformSpecific (\r
+ IN UINTN DataSize,\r
+ IN VOID *ResetData\r
+ )\r
+{\r
+ ResetCold ();\r
+}\r