]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BeagleBoardPkg/Library/ResetSystemLib/ResetSystemLib.c
ARM Packages: Removed trailing spaces
[mirror_edk2.git] / BeagleBoardPkg / Library / ResetSystemLib / ResetSystemLib.c
index 9c427e5c653b868c1a0d3d226c9e66a0a84f207e..7b0949e0434a4e4e99b7032edfc26ef316ffdfd5 100644 (file)
@@ -1,12 +1,9 @@
 /** @file\r
-  Template library implementation to support ResetSystem Runtime call.\r
-  \r
-  Fill in the templates with what ever makes you system reset.\r
+  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
 \r
-  Copyright (c) 2008-2009, Apple Inc. All rights reserved.\r
-  \r
-  All rights reserved. This program and the accompanying materials\r
+  This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
   http://opensource.org/licenses/bsd-license.php\r
 **/\r
 \r
 \r
-#include <PiDxe.h>\r
+#include <Uefi.h>\r
 \r
-#include <Library/PcdLib.h>\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/EfiResetSystemLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+\r
+#include <Omap3530/Omap3530.h>\r
+\r
+\r
+VOID\r
+ShutdownEfi (\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
+}\r
+\r
+typedef\r
+VOID\r
+(EFIAPI *CALL_STUB)(\r
+  VOID\r
+);\r
 \r
-#include <Library/BeagleBoardSystemLib.h>\r
 \r
 /**\r
   Resets the entire platform.\r
@@ -47,20 +114,34 @@ LibResetSystem (
   IN CHAR16           *ResetData OPTIONAL\r
   )\r
 {\r
+  CALL_STUB   StartOfFv;\r
+\r
   if (ResetData != NULL) {\r
     DEBUG((EFI_D_ERROR, "%s", ResetData));\r
   }\r
 \r
-  //Shutdown EFI services.\r
-  ShutdownEfi();\r
-\r
-  //Reset the sytem. \r
-  ResetSystem(ResetType);\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)PcdGet32(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
 }\r
-  \r
+\r
 \r
 \r
 /**\r
@@ -68,7 +149,7 @@ LibResetSystem (
 \r
   @param  ImageHandle   The firmware allocated handle for the EFI image.\r
   @param  SystemTable   A pointer to the EFI System Table.\r
-  \r
+\r
   @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.\r
 \r
 **/\r