1 /** @file
2   Do a generic Cold Reset for OMAP3550 and BeagleBoard specific Warm reset
3 
4   Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
5 
6   This program and the accompanying materials
7   are licensed and made available under the terms and conditions of the BSD License
8   which accompanies this distribution.  The full text of the license may be found at
9   http://opensource.org/licenses/bsd-license.php
10 
11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 
17 #include <Uefi.h>
18 
19 #include <Library/ArmLib.h>
20 #include <Library/CacheMaintenanceLib.h>
21 #include <Library/MemoryAllocationLib.h>
22 #include <Library/IoLib.h>
23 #include <Library/PcdLib.h>
24 #include <Library/DebugLib.h>
25 #include <Library/UefiBootServicesTableLib.h>
26 
27 #include <Omap3530/Omap3530.h>
28 
29 
30 VOID
ShutdownEfi(VOID)31 ShutdownEfi (
32   VOID
33   )
34 {
35   EFI_STATUS              Status;
36   UINTN                   MemoryMapSize;
37   EFI_MEMORY_DESCRIPTOR   *MemoryMap;
38   UINTN                   MapKey;
39   UINTN                   DescriptorSize;
40   UINTN                   DescriptorVersion;
41   UINTN                   Pages;
42 
43   MemoryMap = NULL;
44   MemoryMapSize = 0;
45   do {
46     Status = gBS->GetMemoryMap (
47                     &MemoryMapSize,
48                     MemoryMap,
49                     &MapKey,
50                     &DescriptorSize,
51                     &DescriptorVersion
52                     );
53     if (Status == EFI_BUFFER_TOO_SMALL) {
54 
55       Pages = EFI_SIZE_TO_PAGES (MemoryMapSize) + 1;
56       MemoryMap = AllocatePages (Pages);
57 
58       //
59       // Get System MemoryMap
60       //
61       Status = gBS->GetMemoryMap (
62                       &MemoryMapSize,
63                       MemoryMap,
64                       &MapKey,
65                       &DescriptorSize,
66                       &DescriptorVersion
67                       );
68       // Don't do anything between the GetMemoryMap() and ExitBootServices()
69       if (!EFI_ERROR (Status)) {
70         Status = gBS->ExitBootServices (gImageHandle, MapKey);
71         if (EFI_ERROR (Status)) {
72           FreePages (MemoryMap, Pages);
73           MemoryMap = NULL;
74           MemoryMapSize = 0;
75         }
76       }
77     }
78   } while (EFI_ERROR (Status));
79 
80   //Clean and invalidate caches.
81   WriteBackInvalidateDataCache();
82   InvalidateInstructionCache();
83 
84   //Turning off Caches and MMU
85   ArmDisableDataCache ();
86   ArmDisableInstructionCache ();
87   ArmDisableMmu ();
88 }
89 
90 typedef
91 VOID
92 (EFIAPI *CALL_STUB)(
93   VOID
94 );
95 
96 
97 /**
98   Resets the entire platform.
99 
100   @param  ResetType             The type of reset to perform.
101   @param  ResetStatus           The status code for the reset.
102   @param  DataSize              The size, in bytes, of WatchdogData.
103   @param  ResetData             For a ResetType of EfiResetCold, EfiResetWarm, or
104                                 EfiResetShutdown the data buffer starts with a Null-terminated
105                                 Unicode string, optionally followed by additional binary data.
106 
107 **/
108 EFI_STATUS
109 EFIAPI
LibResetSystem(IN EFI_RESET_TYPE ResetType,IN EFI_STATUS ResetStatus,IN UINTN DataSize,IN CHAR16 * ResetData OPTIONAL)110 LibResetSystem (
111   IN EFI_RESET_TYPE   ResetType,
112   IN EFI_STATUS       ResetStatus,
113   IN UINTN            DataSize,
114   IN CHAR16           *ResetData OPTIONAL
115   )
116 {
117   CALL_STUB   StartOfFv;
118 
119   if (ResetData != NULL) {
120     DEBUG((EFI_D_ERROR, "%s", ResetData));
121   }
122 
123   ShutdownEfi ();
124 
125   switch (ResetType) {
126   case EfiResetWarm:
127     //Perform warm reset of the system by jumping to the begining of the FV
128     StartOfFv = (CALL_STUB)(UINTN)PcdGet64 (PcdFvBaseAddress);
129     StartOfFv ();
130     break;
131   case EfiResetCold:
132   case EfiResetShutdown:
133   default:
134     //Perform cold reset of the system.
135     MmioOr32 (PRM_RSTCTRL, RST_DPLL3);
136     while ((MmioRead32(PRM_RSTST) & GLOBAL_COLD_RST) != 0x1);
137     break;
138   }
139 
140   // If the reset didn't work, return an error.
141   ASSERT (FALSE);
142   return EFI_DEVICE_ERROR;
143 }
144 
145 
146 
147 /**
148   Initialize any infrastructure required for LibResetSystem () to function.
149 
150   @param  ImageHandle   The firmware allocated handle for the EFI image.
151   @param  SystemTable   A pointer to the EFI System Table.
152 
153   @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.
154 
155 **/
156 EFI_STATUS
157 EFIAPI
LibInitializeResetSystem(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)158 LibInitializeResetSystem (
159   IN EFI_HANDLE        ImageHandle,
160   IN EFI_SYSTEM_TABLE  *SystemTable
161   )
162 {
163   return EFI_SUCCESS;
164 }
165 
166