]> git.proxmox.com Git - mirror_edk2.git/blame - QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNCSmmHelpers.c
QuarkSocPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / QuarkSocPkg / QuarkNorthCluster / Smm / DxeSmm / QncSmmDispatcher / QNCSmmHelpers.c
CommitLineData
9b6bbcdb
MK
1/** @file\r
2\r
3Copyright (c) 2013-2015 Intel Corporation.\r
4\r
c9f231d0 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
9b6bbcdb
MK
6\r
7\r
8**/\r
9\r
10//\r
11// Include common header file for this module.\r
12//\r
13#include "CommonHeader.h"\r
14\r
15#include "QNCSmm.h"\r
16#include "QNCSmmHelpers.h"\r
17\r
18//\r
19// #define BIT_ZERO 0x00000001\r
20//\r
21CONST UINT32 BIT_ZERO = 0x00000001;\r
22\r
23//\r
24// /////////////////////////////////////////////////////////////////////////////\r
25// SUPPORT / HELPER FUNCTIONS (QNC version-independent)\r
26//\r
27BOOLEAN\r
28CompareEnables (\r
29 CONST IN QNC_SMM_SOURCE_DESC *Src1,\r
30 CONST IN QNC_SMM_SOURCE_DESC *Src2\r
31 )\r
32/*++\r
33\r
34Routine Description:\r
35\r
36 GC_TODO: Add function description\r
37\r
38Arguments:\r
39\r
40 Src1 - GC_TODO: add argument description\r
41 Src2 - GC_TODO: add argument description\r
42\r
43Returns:\r
44\r
45 GC_TODO: add return values\r
46\r
47--*/\r
48{\r
49 BOOLEAN IsEqual;\r
50 UINTN loopvar;\r
51\r
52 IsEqual = TRUE;\r
53 for (loopvar = 0; loopvar < NUM_EN_BITS; loopvar++) {\r
54 //\r
55 // It's okay to compare a NULL bit description to a non-NULL bit description.\r
56 // They are unequal and these tests will generate the correct result.\r
57 //\r
58 if (Src1->En[loopvar].Bit != Src2->En[loopvar].Bit ||\r
59 Src1->En[loopvar].Reg.Type != Src2->En[loopvar].Reg.Type ||\r
60 Src1->En[loopvar].Reg.Data.raw != Src2->En[loopvar].Reg.Data.raw\r
61 ) {\r
62 IsEqual = FALSE;\r
63 break;\r
64 //\r
65 // out of for loop\r
66 //\r
67 }\r
68 }\r
69\r
70 return IsEqual;\r
71}\r
72\r
73BOOLEAN\r
74CompareStatuses (\r
75 CONST IN QNC_SMM_SOURCE_DESC *Src1,\r
76 CONST IN QNC_SMM_SOURCE_DESC *Src2\r
77 )\r
78/*++\r
79\r
80Routine Description:\r
81\r
82 GC_TODO: Add function description\r
83\r
84Arguments:\r
85\r
86 Src1 - GC_TODO: add argument description\r
87 Src2 - GC_TODO: add argument description\r
88\r
89Returns:\r
90\r
91 GC_TODO: add return values\r
92\r
93--*/\r
94{\r
95 BOOLEAN IsEqual;\r
96 UINTN loopvar;\r
97\r
98 IsEqual = TRUE;\r
99\r
100 for (loopvar = 0; loopvar < NUM_STS_BITS; loopvar++) {\r
101 //\r
102 // It's okay to compare a NULL bit description to a non-NULL bit description.\r
103 // They are unequal and these tests will generate the correct result.\r
104 //\r
105 if (Src1->Sts[loopvar].Bit != Src2->Sts[loopvar].Bit ||\r
106 Src1->Sts[loopvar].Reg.Type != Src2->Sts[loopvar].Reg.Type ||\r
107 Src1->Sts[loopvar].Reg.Data.raw != Src2->Sts[loopvar].Reg.Data.raw\r
108 ) {\r
109 IsEqual = FALSE;\r
110 break;\r
111 //\r
112 // out of for loop\r
113 //\r
114 }\r
115 }\r
116\r
117 return IsEqual;\r
118}\r
119\r
120BOOLEAN\r
121CompareSources (\r
122 CONST IN QNC_SMM_SOURCE_DESC *Src1,\r
123 CONST IN QNC_SMM_SOURCE_DESC *Src2\r
124 )\r
125/*++\r
126\r
127Routine Description:\r
128\r
129 GC_TODO: Add function description\r
130\r
131Arguments:\r
132\r
133 Src1 - GC_TODO: add argument description\r
134 Src2 - GC_TODO: add argument description\r
135\r
136Returns:\r
137\r
138 GC_TODO: add return values\r
139\r
140--*/\r
141{\r
142 return (BOOLEAN) (CompareEnables (Src1, Src2) && CompareStatuses (Src1, Src2));\r
143}\r
144\r
145BOOLEAN\r
146SourceIsActive (\r
147 CONST IN QNC_SMM_SOURCE_DESC *Src\r
148 )\r
149/*++\r
150\r
151Routine Description:\r
152\r
153 GC_TODO: Add function description\r
154\r
155Arguments:\r
156\r
157 Src - GC_TODO: add argument description\r
158\r
159Returns:\r
160\r
161 GC_TODO: add return values\r
162\r
163--*/\r
164{\r
165 BOOLEAN IsActive;\r
166 UINTN loopvar;\r
167\r
168 BOOLEAN SciEn;\r
169\r
170 IsActive = TRUE;\r
171\r
172 SciEn = QNCSmmGetSciEn ();\r
173\r
174 if ((Src->Flags & QNC_SMM_SCI_EN_DEPENDENT) && (SciEn)) {\r
175 //\r
176 // This source is dependent on SciEn, and SciEn == 1. An ACPI OS is present,\r
177 // so we shouldn't do anything w/ this source until SciEn == 0.\r
178 //\r
179 IsActive = FALSE;\r
180\r
181 } else {\r
182 //\r
183 // Read each bit desc from hardware and make sure it's a one\r
184 //\r
185 for (loopvar = 0; loopvar < NUM_EN_BITS; loopvar++) {\r
186\r
187 if (!IS_BIT_DESC_NULL (Src->En[loopvar])) {\r
188\r
189 if (ReadBitDesc (&Src->En[loopvar]) == 0) {\r
190 IsActive = FALSE;\r
191 break;\r
192 //\r
193 // out of for loop\r
194 //\r
195 }\r
196\r
197 }\r
198 }\r
199\r
200 if (IsActive) {\r
201 //\r
202 // Read each bit desc from hardware and make sure it's a one\r
203 //\r
204 for (loopvar = 0; loopvar < NUM_STS_BITS; loopvar++) {\r
205\r
206 if (!IS_BIT_DESC_NULL (Src->Sts[loopvar])) {\r
207\r
208 if (ReadBitDesc (&Src->Sts[loopvar]) == 0) {\r
209 IsActive = FALSE;\r
210 break;\r
211 //\r
212 // out of for loop\r
213 //\r
214 }\r
215\r
216 }\r
217 }\r
218 }\r
219 }\r
220\r
221 return IsActive;\r
222}\r
223\r
224VOID\r
225QNCSmmEnableSource (\r
226 CONST QNC_SMM_SOURCE_DESC *SrcDesc\r
227 )\r
228/*++\r
229\r
230Routine Description:\r
231\r
232 GC_TODO: Add function description\r
233\r
234Arguments:\r
235\r
236 SrcDesc - GC_TODO: add argument description\r
237\r
238Returns:\r
239\r
240 GC_TODO: add return values\r
241\r
242--*/\r
243{\r
244 UINTN loopvar;\r
245\r
246 //\r
247 // Set enables to 1 by writing a 1\r
248 //\r
249 for (loopvar = 0; loopvar < NUM_EN_BITS; loopvar++) {\r
250 if (!IS_BIT_DESC_NULL (SrcDesc->En[loopvar])) {\r
251 WriteBitDesc (&SrcDesc->En[loopvar], 1);\r
252 }\r
253 }\r
254\r
255 QNCSmmClearSource (SrcDesc);\r
256\r
257}\r
258\r
259VOID\r
260QNCSmmDisableSource (\r
261 CONST QNC_SMM_SOURCE_DESC *SrcDesc\r
262 )\r
263/*++\r
264\r
265Routine Description:\r
266\r
267 GC_TODO: Add function description\r
268\r
269Arguments:\r
270\r
271 SrcDesc - GC_TODO: add argument description\r
272\r
273Returns:\r
274\r
275 GC_TODO: add return values\r
276\r
277--*/\r
278{\r
279 UINTN loopvar;\r
280\r
281 for (loopvar = 0; loopvar < NUM_EN_BITS; loopvar++) {\r
282 if (!IS_BIT_DESC_NULL (SrcDesc->En[loopvar])) {\r
283 WriteBitDesc (&SrcDesc->En[loopvar], 0);\r
284 }\r
285 }\r
286}\r
287\r
288VOID\r
289QNCSmmClearSource (\r
290 CONST QNC_SMM_SOURCE_DESC *SrcDesc\r
291 )\r
292/*++\r
293\r
294Routine Description:\r
295\r
296 GC_TODO: Add function description\r
297\r
298Arguments:\r
299\r
300 SrcDesc - GC_TODO: add argument description\r
301\r
302Returns:\r
303\r
304 GC_TODO: add return values\r
305\r
306--*/\r
307{\r
308 UINTN loopvar;\r
309 BOOLEAN ValueToWrite;\r
310\r
311 ValueToWrite =\r
312 ((SrcDesc->Flags & QNC_SMM_CLEAR_WITH_ZERO) == 0) ? TRUE : FALSE;\r
313\r
314 for (loopvar = 0; loopvar < NUM_STS_BITS; loopvar++) {\r
315 if (!IS_BIT_DESC_NULL (SrcDesc->Sts[loopvar])) {\r
316 WriteBitDesc (&SrcDesc->Sts[loopvar], ValueToWrite);\r
317 }\r
318 }\r
319}\r
320\r
321VOID\r
322QNCSmmClearSourceAndBlock (\r
323 CONST QNC_SMM_SOURCE_DESC *SrcDesc\r
324 )\r
325// GC_TODO: function comment should start with '/*++'\r
326/*\r
327 Sets the source to a 1 or 0 and then waits for it to clear.\r
328 Be very careful when calling this function -- it will not\r
329 ASSERT. An acceptable case to call the function is when\r
330 waiting for the NEWCENTURY_STS bit to clear (which takes\r
331 3 RTCCLKs).\r
332*/\r
333// GC_TODO: function comment should end with '--*/'\r
334// GC_TODO: function comment is missing 'Routine Description:'\r
335// GC_TODO: function comment is missing 'Arguments:'\r
336// GC_TODO: function comment is missing 'Returns:'\r
337// GC_TODO: SrcDesc - add argument and description to function comment\r
338{\r
339 UINTN loopvar;\r
340 BOOLEAN IsSet;\r
341 BOOLEAN ValueToWrite;\r
342\r
343 ValueToWrite =\r
344 ((SrcDesc->Flags & QNC_SMM_CLEAR_WITH_ZERO) == 0) ? TRUE : FALSE;\r
345\r
346 for (loopvar = 0; loopvar < NUM_STS_BITS; loopvar++) {\r
347\r
348 if (!IS_BIT_DESC_NULL (SrcDesc->Sts[loopvar])) {\r
349 //\r
350 // Write the bit\r
351 //\r
352 WriteBitDesc (&SrcDesc->Sts[loopvar], ValueToWrite);\r
353\r
354 //\r
355 // Don't return until the bit actually clears.\r
356 //\r
357 IsSet = TRUE;\r
358 while (IsSet) {\r
359 IsSet = ReadBitDesc (&SrcDesc->Sts[loopvar]);\r
360 //\r
361 // IsSet will eventually clear -- or else we'll have\r
362 // an infinite loop.\r
363 //\r
364 }\r
365 }\r
366 }\r
367}\r