• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   Reset System Library functions for coreboot
3 
4   Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>
5   This program and the accompanying materials
6   are licensed and made available under the terms and conditions of the BSD License
7   which accompanies this distribution.  The full text of the license may be found at
8   http://opensource.org/licenses/bsd-license.php
9 
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 #include <PiDxe.h>
16 #include <Library/BaseLib.h>
17 #include <Library/DebugLib.h>
18 #include <Library/IoLib.h>
19 #include <Library/HobLib.h>
20 
21 #include <Guid/AcpiBoardInfoGuid.h>
22 
23 VOID
AcpiPmControl(UINTN SuspendType)24 AcpiPmControl (
25   UINTN SuspendType
26   )
27 {
28 	EFI_HOB_GUID_TYPE  *GuidHob;
29 	ACPI_BOARD_INFO    *pAcpiBoardInfo;
30 	UINTN PmCtrlReg = 0;
31 
32   ASSERT (SuspendType <= 7);
33   //
34 	// Find the acpi board information guid hob
35 	//
36 	GuidHob = GetFirstGuidHob (&gUefiAcpiBoardInfoGuid);
37 	ASSERT (GuidHob != NULL);
38   pAcpiBoardInfo = (ACPI_BOARD_INFO *)GET_GUID_HOB_DATA (GuidHob);
39 
40   PmCtrlReg = (UINTN)pAcpiBoardInfo->PmCtrlRegBase;
41   IoAndThenOr16 (PmCtrlReg, (UINT16) ~0x3c00, (UINT16) (SuspendType << 10));
42   IoOr16 (PmCtrlReg, BIT13);
43   CpuDeadLoop ();
44 }
45 
46 /**
47   Calling this function causes a system-wide reset. This sets
48   all circuitry within the system to its initial state. This type of reset
49   is asynchronous to system operation and operates without regard to
50   cycle boundaries.
51 
52   System reset should not return, if it returns, it means the system does
53   not support cold reset.
54 **/
55 VOID
56 EFIAPI
ResetCold(VOID)57 ResetCold (
58   VOID
59   )
60 {
61   EFI_HOB_GUID_TYPE  *GuidHob;
62 	ACPI_BOARD_INFO    *pAcpiBoardInfo;
63 
64 	//
65 	// Find the acpi board information guid hob
66 	//
67 	GuidHob = GetFirstGuidHob (&gUefiAcpiBoardInfoGuid);
68 	ASSERT (GuidHob != NULL);
69   pAcpiBoardInfo = (ACPI_BOARD_INFO *)GET_GUID_HOB_DATA (GuidHob);
70 
71   IoWrite8 ((UINTN)pAcpiBoardInfo->ResetRegAddress, pAcpiBoardInfo->ResetValue);
72   CpuDeadLoop ();
73 }
74 
75 /**
76   Calling this function causes a system-wide initialization. The processors
77   are set to their initial state, and pending cycles are not corrupted.
78 
79   System reset should not return, if it returns, it means the system does
80   not support warm reset.
81 **/
82 VOID
83 EFIAPI
ResetWarm(VOID)84 ResetWarm (
85   VOID
86   )
87 {
88 	EFI_HOB_GUID_TYPE  *GuidHob;
89 	ACPI_BOARD_INFO    *pAcpiBoardInfo;
90 
91 	//
92 	// Find the acpi board information guid hob
93 	//
94 	GuidHob = GetFirstGuidHob (&gUefiAcpiBoardInfoGuid);
95 	ASSERT (GuidHob != NULL);
96   pAcpiBoardInfo = (ACPI_BOARD_INFO *)GET_GUID_HOB_DATA (GuidHob);
97 
98   IoWrite8 ((UINTN)pAcpiBoardInfo->ResetRegAddress, pAcpiBoardInfo->ResetValue);
99   CpuDeadLoop ();
100 }
101 
102 /**
103   Calling this function causes the system to enter a power state equivalent
104   to the ACPI G2/S5 or G3 states.
105 
106   System shutdown should not return, if it returns, it means the system does
107   not support shut down reset.
108 **/
109 VOID
110 EFIAPI
ResetShutdown(VOID)111 ResetShutdown (
112   VOID
113   )
114 {
115   EFI_HOB_GUID_TYPE  *GuidHob;
116   ACPI_BOARD_INFO    *pAcpiBoardInfo;
117   UINTN              PmCtrlReg;
118 
119   //
120   // Find the acpi board information guid hob
121   //
122   GuidHob = GetFirstGuidHob (&gUefiAcpiBoardInfoGuid);
123   ASSERT (GuidHob != NULL);
124   pAcpiBoardInfo = (ACPI_BOARD_INFO *)GET_GUID_HOB_DATA (GuidHob);
125 
126   //
127   // GPE0_EN should be disabled to avoid any GPI waking up the system from S5
128   //
129   IoWrite16 ((UINTN)pAcpiBoardInfo->PmGpeEnBase,  0);
130 
131   //
132   // Clear Power Button Status
133   //
134   IoWrite16((UINTN) pAcpiBoardInfo->PmEvtBase, BIT8);
135 
136   //
137   // Transform system into S5 sleep state
138   //
139   PmCtrlReg = (UINTN)pAcpiBoardInfo->PmCtrlRegBase;
140   IoAndThenOr16 (PmCtrlReg, (UINT16) ~0x3c00, (UINT16) (7 << 10));
141   IoOr16 (PmCtrlReg, BIT13);
142   CpuDeadLoop ();
143 
144   ASSERT (FALSE);
145 }
146 
147 /**
148   Calling this function causes the system to enter a power state for capsule
149   update.
150 
151   Reset update should not return, if it returns, it means the system does
152   not support capsule update.
153 
154 **/
155 VOID
156 EFIAPI
EnterS3WithImmediateWake(VOID)157 EnterS3WithImmediateWake (
158   VOID
159   )
160 {
161   AcpiPmControl (5);
162   ASSERT (FALSE);
163 }
164 
165 /**
166   This function causes a systemwide reset. The exact type of the reset is
167   defined by the EFI_GUID that follows the Null-terminated Unicode string passed
168   into ResetData. If the platform does not recognize the EFI_GUID in ResetData
169   the platform must pick a supported reset type to perform.The platform may
170   optionally log the parameters from any non-normal reset that occurs.
171 
172   @param[in]  DataSize   The size, in bytes, of ResetData.
173   @param[in]  ResetData  The data buffer starts with a Null-terminated string,
174                          followed by the EFI_GUID.
175 **/
176 VOID
177 EFIAPI
ResetPlatformSpecific(IN UINTN DataSize,IN VOID * ResetData)178 ResetPlatformSpecific (
179   IN UINTN   DataSize,
180   IN VOID    *ResetData
181   )
182 {
183   ResetCold ();
184 }
185