| /** @file |
| |
| Copyright (c) 2008-2009, Apple Inc. All rights reserved. |
| |
| All rights reserved. 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 <Library/BeagleBoardSystemLib.h> |
| |
| #include <Omap3530/Omap3530.h> |
| |
| VOID |
| ResetSystem ( |
| IN EFI_RESET_TYPE ResetType |
| ) |
| { |
| switch (ResetType) { |
| case EfiResetWarm: |
| //Perform warm reset of the system. |
| GoLittleEndian(PcdGet32(PcdFlashFvMainBase)); |
| 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; |
| } |
| |
| //Should never come here. |
| ASSERT(FALSE); |
| } |
| |
| 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(); |
| } |
| |