]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - EdkModulePkg/Universal/PCD/Pei/Pcd.c
Fix gcc build break. Slashes should always lean forward!
[mirror_edk2.git] / EdkModulePkg / Universal / PCD / Pei / Pcd.c
... / ...
CommitLineData
1/** @file PCD PEIM\r
2\r
3Copyright (c) 2006, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12\r
13Module Name: Pcd.c\r
14\r
15**/\r
16\r
17#include "Service.h"\r
18\r
19\r
20PCD_PPI mPcdPpiInstance = {\r
21 PeiPcdSetSku,\r
22\r
23 PeiPcdGet8,\r
24 PeiPcdGet16, \r
25 PeiPcdGet32, \r
26 PeiPcdGet64, \r
27 PeiPcdGetPtr, \r
28 PeiPcdGetBool, \r
29 PeiPcdGetSize,\r
30\r
31 PeiPcdGet8Ex,\r
32 PeiPcdGet16Ex, \r
33 PeiPcdGet32Ex, \r
34 PeiPcdGet64Ex, \r
35 PeiPcdGetPtrEx, \r
36 PeiPcdGetBoolEx, \r
37 PeiPcdGetSizeEx,\r
38 \r
39 PeiPcdSet8,\r
40 PeiPcdSet16, \r
41 PeiPcdSet32, \r
42 PeiPcdSet64, \r
43 PeiPcdSetPtr, \r
44 PeiPcdSetBool, \r
45\r
46 PeiPcdSet8Ex,\r
47 PeiPcdSet16Ex, \r
48 PeiPcdSet32Ex, \r
49 PeiPcdSet64Ex, \r
50 PeiPcdSetPtrEx, \r
51 PeiPcdSetBoolEx,\r
52\r
53 PcdRegisterCallBackOnSet,\r
54 PcdUnRegisterCallBackOnSet,\r
55 PeiPcdGetNextToken\r
56};\r
57\r
58\r
59\r
60STATIC EFI_PEI_PPI_DESCRIPTOR mPpiPCD = {\r
61 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
62 &gPcdPpiGuid,\r
63 &mPcdPpiInstance\r
64};\r
65\r
66\r
67\r
68EFI_STATUS\r
69EFIAPI\r
70PcdPeimInit (\r
71 IN EFI_FFS_FILE_HEADER *FfsHeader,\r
72 IN EFI_PEI_SERVICES **PeiServices\r
73 )\r
74{\r
75 EFI_STATUS Status;\r
76\r
77 BuildPcdDatabase ();\r
78 \r
79 Status = PeiCoreInstallPpi (&mPpiPCD);\r
80\r
81 ASSERT_EFI_ERROR (Status);\r
82 \r
83 return EFI_SUCCESS;\r
84}\r
85\r
86VOID\r
87EFIAPI\r
88PeiPcdSetSku (\r
89 IN SKU_ID SkuId\r
90 )\r
91{\r
92\r
93 GetPcdDatabase()->Init.SystemSkuId = SkuId;\r
94\r
95 return;\r
96}\r
97\r
98\r
99\r
100UINT8\r
101EFIAPI\r
102PeiPcdGet8 (\r
103 IN PCD_TOKEN_NUMBER TokenNumber\r
104 )\r
105{\r
106 return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
107}\r
108\r
109\r
110\r
111UINT16\r
112EFIAPI\r
113PeiPcdGet16 (\r
114 IN PCD_TOKEN_NUMBER TokenNumber\r
115 )\r
116{\r
117 return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
118}\r
119\r
120\r
121\r
122UINT32\r
123EFIAPI\r
124PeiPcdGet32 (\r
125 IN PCD_TOKEN_NUMBER TokenNumber\r
126 )\r
127{\r
128 return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
129}\r
130\r
131\r
132\r
133UINT64\r
134EFIAPI\r
135PeiPcdGet64 (\r
136 IN PCD_TOKEN_NUMBER TokenNumber\r
137 )\r
138{\r
139 return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));\r
140}\r
141\r
142\r
143\r
144VOID *\r
145EFIAPI\r
146PeiPcdGetPtr (\r
147 IN PCD_TOKEN_NUMBER TokenNumber\r
148 )\r
149{\r
150 return GetWorker (TokenNumber, 0);\r
151}\r
152\r
153\r
154\r
155BOOLEAN\r
156EFIAPI\r
157PeiPcdGetBool (\r
158 IN PCD_TOKEN_NUMBER TokenNumber\r
159 )\r
160{\r
161 return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
162}\r
163\r
164\r
165\r
166UINTN\r
167EFIAPI\r
168PeiPcdGetSize (\r
169 IN PCD_TOKEN_NUMBER TokenNumber\r
170 )\r
171{\r
172 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
173\r
174 return GetPcdDatabase()->Init.SizeTable[TokenNumber];\r
175}\r
176\r
177\r
178\r
179UINT8\r
180EFIAPI\r
181PeiPcdGet8Ex (\r
182 IN CONST EFI_GUID *Guid,\r
183 IN PCD_TOKEN_NUMBER ExTokenNumber\r
184 )\r
185{\r
186 return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
187}\r
188\r
189\r
190\r
191UINT16\r
192EFIAPI\r
193PeiPcdGet16Ex (\r
194 IN CONST EFI_GUID *Guid,\r
195 IN PCD_TOKEN_NUMBER ExTokenNumber\r
196 )\r
197{\r
198 return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
199}\r
200\r
201\r
202\r
203UINT32\r
204EFIAPI\r
205PeiPcdGet32Ex (\r
206 IN CONST EFI_GUID *Guid,\r
207 IN PCD_TOKEN_NUMBER ExTokenNumber\r
208 )\r
209{\r
210 return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
211}\r
212\r
213\r
214\r
215UINT64\r
216EFIAPI\r
217PeiPcdGet64Ex (\r
218 IN CONST EFI_GUID *Guid,\r
219 IN PCD_TOKEN_NUMBER ExTokenNumber\r
220 )\r
221{\r
222 return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
223}\r
224\r
225\r
226\r
227VOID *\r
228EFIAPI\r
229PeiPcdGetPtrEx (\r
230 IN CONST EFI_GUID *Guid,\r
231 IN PCD_TOKEN_NUMBER ExTokenNumber\r
232 )\r
233{\r
234 return ExGetWorker (Guid, ExTokenNumber, 0);\r
235}\r
236\r
237\r
238\r
239BOOLEAN\r
240EFIAPI\r
241PeiPcdGetBoolEx (\r
242 IN CONST EFI_GUID *Guid,\r
243 IN PCD_TOKEN_NUMBER ExTokenNumber\r
244 )\r
245{\r
246 return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
247}\r
248\r
249\r
250\r
251UINTN\r
252EFIAPI\r
253PeiPcdGetSizeEx (\r
254 IN CONST EFI_GUID *Guid,\r
255 IN PCD_TOKEN_NUMBER ExTokenNumber\r
256 )\r
257{\r
258 EX_PCD_ENTRY_ATTRIBUTE Attr;\r
259\r
260 GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
261 \r
262 return Attr.Size;\r
263}\r
264\r
265\r
266\r
267EFI_STATUS\r
268EFIAPI\r
269PeiPcdSet8 (\r
270 IN PCD_TOKEN_NUMBER TokenNumber,\r
271 IN UINT8 Value\r
272 )\r
273{\r
274 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
275}\r
276\r
277\r
278\r
279EFI_STATUS\r
280EFIAPI\r
281PeiPcdSet16 (\r
282 IN PCD_TOKEN_NUMBER TokenNumber,\r
283 IN UINT16 Value\r
284 )\r
285{\r
286 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
287}\r
288\r
289\r
290\r
291EFI_STATUS\r
292EFIAPI\r
293PeiPcdSet32 (\r
294 IN PCD_TOKEN_NUMBER TokenNumber,\r
295 IN UINT32 Value\r
296 )\r
297{\r
298 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
299}\r
300\r
301\r
302\r
303EFI_STATUS\r
304EFIAPI\r
305PeiPcdSet64 (\r
306 IN PCD_TOKEN_NUMBER TokenNumber,\r
307 IN UINT64 Value\r
308 )\r
309{\r
310 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
311}\r
312\r
313\r
314EFI_STATUS\r
315EFIAPI\r
316PeiPcdSetPtr (\r
317 IN PCD_TOKEN_NUMBER TokenNumber,\r
318 IN UINTN SizeOfBuffer,\r
319 IN VOID *Buffer\r
320 )\r
321{\r
322 return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
323}\r
324\r
325\r
326\r
327EFI_STATUS\r
328EFIAPI\r
329PeiPcdSetBool (\r
330 IN PCD_TOKEN_NUMBER TokenNumber,\r
331 IN BOOLEAN Value\r
332 )\r
333{\r
334 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
335}\r
336\r
337\r
338\r
339EFI_STATUS\r
340EFIAPI\r
341PeiPcdSet8Ex (\r
342 IN CONST EFI_GUID *Guid,\r
343 IN PCD_TOKEN_NUMBER ExTokenNumber,\r
344 IN UINT8 Value\r
345 )\r
346{\r
347 return ExSetWorker(\r
348 ExTokenNumber, \r
349 Guid,\r
350 &Value, \r
351 sizeof (Value), \r
352 FALSE\r
353 );\r
354}\r
355\r
356\r
357\r
358EFI_STATUS\r
359EFIAPI\r
360PeiPcdSet16Ex (\r
361 IN CONST EFI_GUID *Guid,\r
362 IN PCD_TOKEN_NUMBER ExTokenNumber,\r
363 IN UINT16 Value\r
364 )\r
365{\r
366 return ExSetWorker(\r
367 ExTokenNumber, \r
368 Guid,\r
369 &Value, \r
370 sizeof (Value), \r
371 FALSE\r
372 );\r
373}\r
374\r
375\r
376\r
377EFI_STATUS\r
378EFIAPI\r
379PeiPcdSet32Ex (\r
380 IN CONST EFI_GUID *Guid,\r
381 IN PCD_TOKEN_NUMBER ExTokenNumber,\r
382 IN UINT32 Value\r
383 )\r
384{\r
385 return ExSetWorker(\r
386 ExTokenNumber, \r
387 Guid,\r
388 &Value, \r
389 sizeof (Value), \r
390 FALSE\r
391 );\r
392}\r
393\r
394\r
395\r
396EFI_STATUS\r
397EFIAPI\r
398PeiPcdSet64Ex (\r
399 IN CONST EFI_GUID *Guid,\r
400 IN PCD_TOKEN_NUMBER ExTokenNumber,\r
401 IN UINT64 Value\r
402 )\r
403{\r
404 return ExSetWorker(\r
405 ExTokenNumber, \r
406 Guid,\r
407 &Value, \r
408 sizeof (Value), \r
409 FALSE\r
410 );\r
411}\r
412\r
413\r
414\r
415EFI_STATUS\r
416EFIAPI\r
417PeiPcdSetPtrEx (\r
418 IN CONST EFI_GUID *Guid,\r
419 IN PCD_TOKEN_NUMBER ExTokenNumber,\r
420 IN UINTN SizeOfBuffer,\r
421 IN VOID *Value\r
422 )\r
423{\r
424 return ExSetWorker(\r
425 ExTokenNumber, \r
426 Guid,\r
427 Value, \r
428 SizeOfBuffer, \r
429 TRUE\r
430 );\r
431}\r
432\r
433\r
434\r
435EFI_STATUS\r
436EFIAPI\r
437PeiPcdSetBoolEx (\r
438 IN CONST EFI_GUID *Guid,\r
439 IN PCD_TOKEN_NUMBER ExTokenNumber,\r
440 IN BOOLEAN Value\r
441 )\r
442{\r
443 return ExSetWorker(\r
444 ExTokenNumber, \r
445 Guid,\r
446 &Value, \r
447 sizeof (Value), \r
448 FALSE\r
449 );\r
450}\r
451\r
452\r
453\r
454\r
455EFI_STATUS\r
456EFIAPI\r
457PcdRegisterCallBackOnSet (\r
458 IN PCD_TOKEN_NUMBER ExTokenNumber,\r
459 IN CONST EFI_GUID *Guid, OPTIONAL\r
460 IN PCD_PPI_CALLBACK CallBackFunction\r
461 )\r
462{\r
463 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);\r
464}\r
465\r
466\r
467\r
468EFI_STATUS\r
469EFIAPI\r
470PcdUnRegisterCallBackOnSet (\r
471 IN PCD_TOKEN_NUMBER ExTokenNumber,\r
472 IN CONST EFI_GUID *Guid, OPTIONAL\r
473 IN PCD_PPI_CALLBACK CallBackFunction\r
474 )\r
475{\r
476 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);\r
477}\r
478\r
479\r
480\r
481EFI_STATUS\r
482EFIAPI\r
483PeiPcdGetNextToken (\r
484 IN CONST EFI_GUID *Guid, OPTIONAL\r
485 IN OUT PCD_TOKEN_NUMBER *TokenNumber\r
486 )\r
487{\r
488 UINTN GuidTableIdx;\r
489 PEI_PCD_DATABASE *PeiPcdDb;\r
490 EFI_GUID *MatchGuid;\r
491 DYNAMICEX_MAPPING *ExMapTable;\r
492 UINTN i;\r
493 BOOLEAN Found;\r
494 \r
495 if (Guid == NULL) {\r
496 *TokenNumber++;\r
497\r
498 if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER) {\r
499 *TokenNumber = 0;\r
500 }\r
501 \r
502 } else {\r
503\r
504 if (PEI_EXMAP_TABLE_EMPTY) {\r
505 *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
506 return EFI_NOT_FOUND;\r
507 }\r
508 \r
509 //\r
510 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
511 // 1) ExGuid\r
512 // 2) ExTokenNumber\r
513 //\r
514 PeiPcdDb = GetPcdDatabase ();\r
515 \r
516 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
517\r
518 if (MatchGuid == NULL) {\r
519 *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
520 return EFI_NOT_FOUND;\r
521 }\r
522\r
523 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
524\r
525 ExMapTable = PeiPcdDb->Init.ExMapTable;\r
526\r
527 Found = FALSE;\r
528 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
529 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
530 Found = TRUE;\r
531 break;\r
532 }\r
533 }\r
534\r
535 if (Found) {\r
536 if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) {\r
537 *TokenNumber = ExMapTable[i].ExTokenNumber;\r
538 return EFI_SUCCESS;\r
539 }\r
540 \r
541 for ( ; ExMapTable[i].ExGuidIndex == GuidTableIdx; i++) {\r
542 if (ExMapTable[i].ExTokenNumber == *TokenNumber) {\r
543 i++;\r
544 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
545 *TokenNumber = ExMapTable[i].ExTokenNumber;\r
546 return EFI_SUCCESS;\r
547 } else {\r
548 *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
549 return EFI_SUCCESS;\r
550 }\r
551 }\r
552 }\r
553\r
554 return EFI_NOT_FOUND;\r
555 }\r
556 \r
557 }\r
558\r
559 return EFI_SUCCESS;\r
560}\r
561\r
562EFI_GUID *\r
563EFIAPI\r
564PeiPcdGetNextTokenSpaceGuid (\r
565 IN CONST EFI_GUID *Guid\r
566 )\r
567{\r
568 UINTN GuidTableIdx;\r
569 EFI_GUID *MatchGuid;\r
570 PEI_PCD_DATABASE *PeiPcdDb;\r
571 DYNAMICEX_MAPPING *ExMapTable;\r
572 UINTN i;\r
573 BOOLEAN Found;\r
574\r
575 if (PEI_EXMAP_TABLE_EMPTY) {\r
576 return NULL;\r
577 }\r
578\r
579 //\r
580 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
581 // 1) ExGuid\r
582 // 2) ExTokenNumber\r
583 //\r
584 PeiPcdDb = GetPcdDatabase ();\r
585\r
586 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
587\r
588 if (MatchGuid == NULL) {\r
589 return NULL;\r
590 }\r
591 \r
592 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
593\r
594 ExMapTable = PeiPcdDb->Init.ExMapTable;\r
595\r
596 Found = FALSE;\r
597 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
598 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
599 Found = TRUE;\r
600 break;\r
601 }\r
602 }\r
603\r
604 if (Found) {\r
605 for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {\r
606 if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {\r
607 if (i < PEI_EXMAPPING_TABLE_SIZE) {\r
608 return &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];\r
609 } else {\r
610 return NULL;\r
611 }\r
612 }\r
613 }\r
614 }\r
615\r
616 return NULL;\r
617\r
618}\r
619\r