]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/PCD/Pei/Pcd.c
1) Add in support to traverse taken space
[mirror_edk2.git] / EdkModulePkg / Universal / PCD / Pei / Pcd.c
CommitLineData
52e1905d 1/** @file PCD PEIM\r
878ddf1f 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
878ddf1f 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
4c114006 53 PeiRegisterCallBackOnSet,\r
878ddf1f 54 PcdUnRegisterCallBackOnSet,\r
4276d5da 55 PeiPcdGetNextToken,\r
56 PeiPcdGetNextTokenSpace\r
878ddf1f 57};\r
58\r
59\r
60\r
61STATIC EFI_PEI_PPI_DESCRIPTOR mPpiPCD = {\r
62 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
63 &gPcdPpiGuid,\r
64 &mPcdPpiInstance\r
65};\r
66\r
67\r
68\r
69EFI_STATUS\r
70EFIAPI\r
71PcdPeimInit (\r
72 IN EFI_FFS_FILE_HEADER *FfsHeader,\r
73 IN EFI_PEI_SERVICES **PeiServices\r
74 )\r
75{\r
76 EFI_STATUS Status;\r
878ddf1f 77\r
52e1905d 78 BuildPcdDatabase ();\r
79 \r
84a99d48 80 Status = PeiServicesInstallPpi (&mPpiPCD);\r
878ddf1f 81\r
82 ASSERT_EFI_ERROR (Status);\r
83 \r
84 return EFI_SUCCESS;\r
85}\r
86\r
00b7af13 87VOID\r
878ddf1f 88EFIAPI\r
89PeiPcdSetSku (\r
8a43e8dd 90 IN UINTN SkuId\r
878ddf1f 91 )\r
92{\r
878ddf1f 93\r
8a43e8dd 94 GetPcdDatabase()->Init.SystemSkuId = (SKU_ID) SkuId;\r
878ddf1f 95\r
00b7af13 96 return;\r
878ddf1f 97}\r
98\r
99\r
100\r
101UINT8\r
102EFIAPI\r
103PeiPcdGet8 (\r
8a43e8dd 104 IN UINTN TokenNumber\r
878ddf1f 105 )\r
106{\r
52e1905d 107 return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
878ddf1f 108}\r
109\r
110\r
111\r
112UINT16\r
113EFIAPI\r
114PeiPcdGet16 (\r
8a43e8dd 115 IN UINTN TokenNumber\r
878ddf1f 116 )\r
117{\r
52e1905d 118 return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
878ddf1f 119}\r
120\r
121\r
122\r
123UINT32\r
124EFIAPI\r
125PeiPcdGet32 (\r
8a43e8dd 126 IN UINTN TokenNumber\r
878ddf1f 127 )\r
128{\r
52e1905d 129 return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
878ddf1f 130}\r
131\r
132\r
133\r
134UINT64\r
135EFIAPI\r
136PeiPcdGet64 (\r
8a43e8dd 137 IN UINTN TokenNumber\r
878ddf1f 138 )\r
139{\r
52e1905d 140 return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));\r
878ddf1f 141}\r
142\r
143\r
144\r
145VOID *\r
146EFIAPI\r
147PeiPcdGetPtr (\r
8a43e8dd 148 IN UINTN TokenNumber\r
878ddf1f 149 )\r
150{\r
52e1905d 151 return GetWorker (TokenNumber, 0);\r
878ddf1f 152}\r
153\r
154\r
155\r
156BOOLEAN\r
157EFIAPI\r
158PeiPcdGetBool (\r
8a43e8dd 159 IN UINTN TokenNumber\r
878ddf1f 160 )\r
161{\r
52e1905d 162 return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
878ddf1f 163}\r
164\r
165\r
166\r
167UINTN\r
168EFIAPI\r
169PeiPcdGetSize (\r
8a43e8dd 170 IN UINTN TokenNumber\r
878ddf1f 171 )\r
172{\r
58f1099f 173 //\r
174 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
175 // We have to decrement TokenNumber by 1 to make it usable\r
176 // as the array index.\r
177 //\r
178 TokenNumber--;\r
179\r
52e1905d 180 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
181\r
182 return GetPcdDatabase()->Init.SizeTable[TokenNumber];\r
878ddf1f 183}\r
184\r
185\r
186\r
187UINT8\r
188EFIAPI\r
189PeiPcdGet8Ex (\r
190 IN CONST EFI_GUID *Guid,\r
8a43e8dd 191 IN UINTN ExTokenNumber\r
878ddf1f 192 )\r
193{\r
52e1905d 194 return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
878ddf1f 195}\r
196\r
197\r
198\r
199UINT16\r
200EFIAPI\r
201PeiPcdGet16Ex (\r
202 IN CONST EFI_GUID *Guid,\r
8a43e8dd 203 IN UINTN ExTokenNumber\r
878ddf1f 204 )\r
205{\r
52e1905d 206 return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
878ddf1f 207}\r
208\r
209\r
210\r
211UINT32\r
212EFIAPI\r
213PeiPcdGet32Ex (\r
214 IN CONST EFI_GUID *Guid,\r
8a43e8dd 215 IN UINTN ExTokenNumber\r
878ddf1f 216 )\r
217{\r
52e1905d 218 return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
878ddf1f 219}\r
220\r
221\r
222\r
223UINT64\r
224EFIAPI\r
225PeiPcdGet64Ex (\r
226 IN CONST EFI_GUID *Guid,\r
8a43e8dd 227 IN UINTN ExTokenNumber\r
878ddf1f 228 )\r
229{\r
52e1905d 230 return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
878ddf1f 231}\r
232\r
233\r
234\r
235VOID *\r
236EFIAPI\r
237PeiPcdGetPtrEx (\r
238 IN CONST EFI_GUID *Guid,\r
8a43e8dd 239 IN UINTN ExTokenNumber\r
878ddf1f 240 )\r
241{\r
52e1905d 242 return ExGetWorker (Guid, ExTokenNumber, 0);\r
878ddf1f 243}\r
244\r
245\r
246\r
247BOOLEAN\r
248EFIAPI\r
249PeiPcdGetBoolEx (\r
250 IN CONST EFI_GUID *Guid,\r
8a43e8dd 251 IN UINTN ExTokenNumber\r
878ddf1f 252 )\r
253{\r
52e1905d 254 return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
878ddf1f 255}\r
256\r
257\r
258\r
259UINTN\r
260EFIAPI\r
261PeiPcdGetSizeEx (\r
262 IN CONST EFI_GUID *Guid,\r
8a43e8dd 263 IN UINTN ExTokenNumber\r
878ddf1f 264 )\r
265{\r
9d6d8b24 266 return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber));\r
878ddf1f 267}\r
268\r
269\r
270\r
271EFI_STATUS\r
272EFIAPI\r
273PeiPcdSet8 (\r
8a43e8dd 274 IN UINTN TokenNumber,\r
878ddf1f 275 IN UINT8 Value\r
276 )\r
277{\r
52e1905d 278 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
878ddf1f 279}\r
280\r
281\r
282\r
283EFI_STATUS\r
284EFIAPI\r
285PeiPcdSet16 (\r
8a43e8dd 286 IN UINTN TokenNumber,\r
878ddf1f 287 IN UINT16 Value\r
288 )\r
289{\r
52e1905d 290 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
878ddf1f 291}\r
292\r
293\r
294\r
295EFI_STATUS\r
296EFIAPI\r
297PeiPcdSet32 (\r
8a43e8dd 298 IN UINTN TokenNumber,\r
878ddf1f 299 IN UINT32 Value\r
300 )\r
301{\r
52e1905d 302 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
878ddf1f 303}\r
304\r
305\r
306\r
307EFI_STATUS\r
308EFIAPI\r
309PeiPcdSet64 (\r
8a43e8dd 310 IN UINTN TokenNumber,\r
878ddf1f 311 IN UINT64 Value\r
312 )\r
313{\r
52e1905d 314 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
878ddf1f 315}\r
316\r
317\r
318EFI_STATUS\r
319EFIAPI\r
320PeiPcdSetPtr (\r
8a43e8dd 321 IN UINTN TokenNumber,\r
00b7af13 322 IN UINTN SizeOfBuffer,\r
323 IN VOID *Buffer\r
878ddf1f 324 )\r
325{\r
00b7af13 326 return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
878ddf1f 327}\r
328\r
329\r
330\r
331EFI_STATUS\r
332EFIAPI\r
333PeiPcdSetBool (\r
8a43e8dd 334 IN UINTN TokenNumber,\r
878ddf1f 335 IN BOOLEAN Value\r
336 )\r
337{\r
52e1905d 338 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
878ddf1f 339}\r
340\r
341\r
342\r
343EFI_STATUS\r
344EFIAPI\r
345PeiPcdSet8Ex (\r
346 IN CONST EFI_GUID *Guid,\r
8a43e8dd 347 IN UINTN ExTokenNumber,\r
878ddf1f 348 IN UINT8 Value\r
349 )\r
350{\r
52e1905d 351 return ExSetWorker(\r
352 ExTokenNumber, \r
353 Guid,\r
354 &Value, \r
355 sizeof (Value), \r
356 FALSE\r
357 );\r
878ddf1f 358}\r
359\r
360\r
361\r
362EFI_STATUS\r
363EFIAPI\r
364PeiPcdSet16Ex (\r
365 IN CONST EFI_GUID *Guid,\r
8a43e8dd 366 IN UINTN ExTokenNumber,\r
878ddf1f 367 IN UINT16 Value\r
368 )\r
369{\r
52e1905d 370 return ExSetWorker(\r
371 ExTokenNumber, \r
372 Guid,\r
373 &Value, \r
374 sizeof (Value), \r
375 FALSE\r
376 );\r
878ddf1f 377}\r
378\r
379\r
380\r
381EFI_STATUS\r
382EFIAPI\r
383PeiPcdSet32Ex (\r
384 IN CONST EFI_GUID *Guid,\r
8a43e8dd 385 IN UINTN ExTokenNumber,\r
878ddf1f 386 IN UINT32 Value\r
387 )\r
388{\r
52e1905d 389 return ExSetWorker(\r
390 ExTokenNumber, \r
391 Guid,\r
392 &Value, \r
393 sizeof (Value), \r
394 FALSE\r
395 );\r
878ddf1f 396}\r
397\r
398\r
399\r
400EFI_STATUS\r
401EFIAPI\r
402PeiPcdSet64Ex (\r
403 IN CONST EFI_GUID *Guid,\r
8a43e8dd 404 IN UINTN ExTokenNumber,\r
878ddf1f 405 IN UINT64 Value\r
406 )\r
407{\r
52e1905d 408 return ExSetWorker(\r
409 ExTokenNumber, \r
410 Guid,\r
411 &Value, \r
412 sizeof (Value), \r
413 FALSE\r
414 );\r
878ddf1f 415}\r
416\r
417\r
418\r
419EFI_STATUS\r
420EFIAPI\r
421PeiPcdSetPtrEx (\r
422 IN CONST EFI_GUID *Guid,\r
8a43e8dd 423 IN UINTN ExTokenNumber,\r
00b7af13 424 IN UINTN SizeOfBuffer,\r
425 IN VOID *Value\r
878ddf1f 426 )\r
427{\r
52e1905d 428 return ExSetWorker(\r
429 ExTokenNumber, \r
430 Guid,\r
00b7af13 431 Value, \r
432 SizeOfBuffer, \r
52e1905d 433 TRUE\r
434 );\r
878ddf1f 435}\r
436\r
437\r
438\r
439EFI_STATUS\r
440EFIAPI\r
441PeiPcdSetBoolEx (\r
442 IN CONST EFI_GUID *Guid,\r
8a43e8dd 443 IN UINTN ExTokenNumber,\r
878ddf1f 444 IN BOOLEAN Value\r
445 )\r
446{\r
52e1905d 447 return ExSetWorker(\r
448 ExTokenNumber, \r
449 Guid,\r
450 &Value, \r
451 sizeof (Value), \r
452 FALSE\r
453 );\r
878ddf1f 454}\r
455\r
456\r
457\r
458\r
459EFI_STATUS\r
460EFIAPI\r
4c114006 461PeiRegisterCallBackOnSet (\r
8a43e8dd 462 IN UINTN ExTokenNumber,\r
878ddf1f 463 IN CONST EFI_GUID *Guid, OPTIONAL\r
464 IN PCD_PPI_CALLBACK CallBackFunction\r
465 )\r
466{\r
4c114006 467 ASSERT (CallBackFunction != NULL);\r
468 \r
52e1905d 469 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);\r
878ddf1f 470}\r
471\r
472\r
473\r
474EFI_STATUS\r
475EFIAPI\r
476PcdUnRegisterCallBackOnSet (\r
8a43e8dd 477 IN UINTN ExTokenNumber,\r
878ddf1f 478 IN CONST EFI_GUID *Guid, OPTIONAL\r
479 IN PCD_PPI_CALLBACK CallBackFunction\r
480 )\r
481{\r
4c114006 482 ASSERT (CallBackFunction != NULL);\r
483 \r
52e1905d 484 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);\r
878ddf1f 485}\r
486\r
487\r
488\r
489EFI_STATUS\r
490EFIAPI\r
491PeiPcdGetNextToken (\r
492 IN CONST EFI_GUID *Guid, OPTIONAL\r
8a43e8dd 493 IN OUT UINTN *TokenNumber\r
878ddf1f 494 )\r
495{\r
00b7af13 496 UINTN GuidTableIdx;\r
497 PEI_PCD_DATABASE *PeiPcdDb;\r
498 EFI_GUID *MatchGuid;\r
499 DYNAMICEX_MAPPING *ExMapTable;\r
500 UINTN i;\r
501 BOOLEAN Found;\r
502 \r
52e1905d 503 if (Guid == NULL) {\r
b560bb65 504 (*TokenNumber)++;\r
52e1905d 505\r
00b7af13 506 if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER) {\r
0653eb89 507 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
52e1905d 508 }\r
00b7af13 509 \r
510 } else {\r
511\r
512 if (PEI_EXMAP_TABLE_EMPTY) {\r
0653eb89 513 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
00b7af13 514 return EFI_NOT_FOUND;\r
515 }\r
516 \r
517 //\r
518 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
519 // 1) ExGuid\r
520 // 2) ExTokenNumber\r
521 //\r
522 PeiPcdDb = GetPcdDatabase ();\r
523 \r
524 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
525\r
526 if (MatchGuid == NULL) {\r
527 *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
528 return EFI_NOT_FOUND;\r
529 }\r
530\r
531 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
532\r
533 ExMapTable = PeiPcdDb->Init.ExMapTable;\r
534\r
535 Found = FALSE;\r
536 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
537 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
538 Found = TRUE;\r
539 break;\r
540 }\r
541 }\r
542\r
543 if (Found) {\r
544 if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) {\r
545 *TokenNumber = ExMapTable[i].ExTokenNumber;\r
546 return EFI_SUCCESS;\r
547 }\r
548 \r
549 for ( ; ExMapTable[i].ExGuidIndex == GuidTableIdx; i++) {\r
550 if (ExMapTable[i].ExTokenNumber == *TokenNumber) {\r
551 i++;\r
552 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
553 *TokenNumber = ExMapTable[i].ExTokenNumber;\r
554 return EFI_SUCCESS;\r
555 } else {\r
556 *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
557 return EFI_SUCCESS;\r
558 }\r
559 }\r
560 }\r
561\r
562 return EFI_NOT_FOUND;\r
563 }\r
564 \r
565 }\r
566\r
567 return EFI_SUCCESS;\r
568}\r
569\r
58f1099f 570EFI_STATUS\r
00b7af13 571EFIAPI\r
4276d5da 572PeiPcdGetNextTokenSpace (\r
58f1099f 573 IN OUT CONST EFI_GUID **Guid\r
00b7af13 574 )\r
575{\r
576 UINTN GuidTableIdx;\r
577 EFI_GUID *MatchGuid;\r
578 PEI_PCD_DATABASE *PeiPcdDb;\r
579 DYNAMICEX_MAPPING *ExMapTable;\r
580 UINTN i;\r
581 BOOLEAN Found;\r
582\r
4276d5da 583 ASSERT (Guid != NULL);\r
584\r
585 if (PEI_EXMAP_TABLE_EMPTY) {\r
586 if (*Guid != NULL) {\r
587 return EFI_NOT_FOUND;\r
58f1099f 588 } else {\r
58f1099f 589 return EFI_SUCCESS;\r
590 }\r
4276d5da 591 }\r
52e1905d 592\r
593 //\r
00b7af13 594 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
595 // 1) ExGuid\r
596 // 2) ExTokenNumber\r
52e1905d 597 //\r
00b7af13 598 PeiPcdDb = GetPcdDatabase ();\r
52e1905d 599\r
4276d5da 600 ExMapTable = PeiPcdDb->Init.ExMapTable;\r
601\r
602 if (*Guid == NULL) {\r
603 //\r
604 // return the first Token Space Guid.\r
605 //\r
606 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex];\r
607 return EFI_SUCCESS;\r
608 }\r
609\r
58f1099f 610 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid);\r
00b7af13 611\r
612 if (MatchGuid == NULL) {\r
58f1099f 613 return EFI_NOT_FOUND;\r
00b7af13 614 }\r
615 \r
616 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
878ddf1f 617\r
00b7af13 618 Found = FALSE;\r
619 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
620 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
621 Found = TRUE;\r
622 break;\r
623 }\r
624 }\r
625\r
626 if (Found) {\r
4276d5da 627 i++;\r
00b7af13 628 for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {\r
629 if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {\r
58f1099f 630 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];\r
631 return EFI_SUCCESS;\r
00b7af13 632 }\r
633 }\r
4276d5da 634 *Guid = NULL;\r
635 return EFI_SUCCESS;\r
00b7af13 636 }\r
637\r
58f1099f 638 return EFI_NOT_FOUND;\r
00b7af13 639\r
640}\r
878ddf1f 641\r