| /** @file | |
| Do a generic Cold Reset for OMAP3550 and BeagleBoard specific Warm reset | |
| Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR> | |
| This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #include <Uefi.h> | |
| #include <Library/ArmLib.h> | |
| #include <Library/CacheMaintenanceLib.h> | |
| #include <Library/MemoryAllocationLib.h> | |
| #include <Library/IoLib.h> | |
| #include <Library/PcdLib.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/UefiBootServicesTableLib.h> | |
| #include <Omap3530/Omap3530.h> | |
| VOID | |
| ShutdownEfi ( | |
| VOID | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINTN MemoryMapSize; | |
| EFI_MEMORY_DESCRIPTOR *MemoryMap; | |
| UINTN MapKey; | |
| UINTN DescriptorSize; | |
| UINTN DescriptorVersion; | |
| UINTN Pages; | |
| MemoryMap = NULL; | |
| MemoryMapSize = 0; | |
| do { | |
| Status = gBS->GetMemoryMap ( | |
| &MemoryMapSize, | |
| MemoryMap, | |
| &MapKey, | |
| &DescriptorSize, | |
| &DescriptorVersion | |
| ); | |
| if (Status == EFI_BUFFER_TOO_SMALL) { | |
| Pages = EFI_SIZE_TO_PAGES (MemoryMapSize) + 1; | |
| MemoryMap = AllocatePages (Pages); | |
| // | |
| // Get System MemoryMap | |
| // | |
| Status = gBS->GetMemoryMap ( | |
| &MemoryMapSize, | |
| MemoryMap, | |
| &MapKey, | |
| &DescriptorSize, | |
| &DescriptorVersion | |
| ); | |
| // Don't do anything between the GetMemoryMap() and ExitBootServices() | |
| if (!EFI_ERROR (Status)) { | |
| Status = gBS->ExitBootServices (gImageHandle, MapKey); | |
| if (EFI_ERROR (Status)) { | |
| FreePages (MemoryMap, Pages); | |
| MemoryMap = NULL; | |
| MemoryMapSize = 0; | |
| } | |
| } | |
| } | |
| } while (EFI_ERROR (Status)); | |
| //Clean and invalidate caches. | |
| WriteBackInvalidateDataCache(); | |
| InvalidateInstructionCache(); | |
| //Turning off Caches and MMU | |
| ArmDisableDataCache (); | |
| ArmDisableInstructionCache (); | |
| ArmDisableMmu (); | |
| } | |
| typedef | |
| VOID | |
| (EFIAPI *CALL_STUB)( | |
| VOID | |
| ); | |
| /** | |
| Resets the entire platform. | |
| @param ResetType The type of reset to perform. | |
| @param ResetStatus The status code for the reset. | |
| @param DataSize The size, in bytes, of WatchdogData. | |
| @param ResetData For a ResetType of EfiResetCold, EfiResetWarm, or | |
| EfiResetShutdown the data buffer starts with a Null-terminated | |
| Unicode string, optionally followed by additional binary data. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| LibResetSystem ( | |
| IN EFI_RESET_TYPE ResetType, | |
| IN EFI_STATUS ResetStatus, | |
| IN UINTN DataSize, | |
| IN CHAR16 *ResetData OPTIONAL | |
| ) | |
| { | |
| CALL_STUB StartOfFv; | |
| if (ResetData != NULL) { | |
| DEBUG((EFI_D_ERROR, "%s", ResetData)); | |
| } | |
| ShutdownEfi (); | |
| switch (ResetType) { | |
| case EfiResetWarm: | |
| //Perform warm reset of the system by jumping to the begining of the FV | |
| StartOfFv = (CALL_STUB)(UINTN)PcdGet64 (PcdFvBaseAddress); | |
| StartOfFv (); | |
| break; | |
| case EfiResetCold: | |
| case EfiResetShutdown: | |
| default: | |
| //Perform cold reset of the system. | |
| MmioOr32 (PRM_RSTCTRL, RST_DPLL3); | |
| while ((MmioRead32(PRM_RSTST) & GLOBAL_COLD_RST) != 0x1); | |
| break; | |
| } | |
| // If the reset didn't work, return an error. | |
| ASSERT (FALSE); | |
| return EFI_DEVICE_ERROR; | |
| } | |
| /** | |
| Initialize any infrastructure required for LibResetSystem () to function. | |
| @param ImageHandle The firmware allocated handle for the EFI image. | |
| @param SystemTable A pointer to the EFI System Table. | |
| @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| LibInitializeResetSystem ( | |
| IN EFI_HANDLE ImageHandle, | |
| IN EFI_SYSTEM_TABLE *SystemTable | |
| ) | |
| { | |
| return EFI_SUCCESS; | |
| } | |