]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - EdkModulePkg/Universal/PCD/Pei/Pcd.c
1) Add in support to traverse taken space
[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 PeiRegisterCallBackOnSet,\r
54 PcdUnRegisterCallBackOnSet,\r
55 PeiPcdGetNextToken,\r
56 PeiPcdGetNextTokenSpace\r
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
77\r
78 BuildPcdDatabase ();\r
79 \r
80 Status = PeiServicesInstallPpi (&mPpiPCD);\r
81\r
82 ASSERT_EFI_ERROR (Status);\r
83 \r
84 return EFI_SUCCESS;\r
85}\r
86\r
87VOID\r
88EFIAPI\r
89PeiPcdSetSku (\r
90 IN UINTN SkuId\r
91 )\r
92{\r
93\r
94 GetPcdDatabase()->Init.SystemSkuId = (SKU_ID) SkuId;\r
95\r
96 return;\r
97}\r
98\r
99\r
100\r
101UINT8\r
102EFIAPI\r
103PeiPcdGet8 (\r
104 IN UINTN TokenNumber\r
105 )\r
106{\r
107 return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
108}\r
109\r
110\r
111\r
112UINT16\r
113EFIAPI\r
114PeiPcdGet16 (\r
115 IN UINTN TokenNumber\r
116 )\r
117{\r
118 return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
119}\r
120\r
121\r
122\r
123UINT32\r
124EFIAPI\r
125PeiPcdGet32 (\r
126 IN UINTN TokenNumber\r
127 )\r
128{\r
129 return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
130}\r
131\r
132\r
133\r
134UINT64\r
135EFIAPI\r
136PeiPcdGet64 (\r
137 IN UINTN TokenNumber\r
138 )\r
139{\r
140 return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));\r
141}\r
142\r
143\r
144\r
145VOID *\r
146EFIAPI\r
147PeiPcdGetPtr (\r
148 IN UINTN TokenNumber\r
149 )\r
150{\r
151 return GetWorker (TokenNumber, 0);\r
152}\r
153\r
154\r
155\r
156BOOLEAN\r
157EFIAPI\r
158PeiPcdGetBool (\r
159 IN UINTN TokenNumber\r
160 )\r
161{\r
162 return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
163}\r
164\r
165\r
166\r
167UINTN\r
168EFIAPI\r
169PeiPcdGetSize (\r
170 IN UINTN TokenNumber\r
171 )\r
172{\r
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
180 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
181\r
182 return GetPcdDatabase()->Init.SizeTable[TokenNumber];\r
183}\r
184\r
185\r
186\r
187UINT8\r
188EFIAPI\r
189PeiPcdGet8Ex (\r
190 IN CONST EFI_GUID *Guid,\r
191 IN UINTN ExTokenNumber\r
192 )\r
193{\r
194 return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
195}\r
196\r
197\r
198\r
199UINT16\r
200EFIAPI\r
201PeiPcdGet16Ex (\r
202 IN CONST EFI_GUID *Guid,\r
203 IN UINTN ExTokenNumber\r
204 )\r
205{\r
206 return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
207}\r
208\r
209\r
210\r
211UINT32\r
212EFIAPI\r
213PeiPcdGet32Ex (\r
214 IN CONST EFI_GUID *Guid,\r
215 IN UINTN ExTokenNumber\r
216 )\r
217{\r
218 return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
219}\r
220\r
221\r
222\r
223UINT64\r
224EFIAPI\r
225PeiPcdGet64Ex (\r
226 IN CONST EFI_GUID *Guid,\r
227 IN UINTN ExTokenNumber\r
228 )\r
229{\r
230 return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
231}\r
232\r
233\r
234\r
235VOID *\r
236EFIAPI\r
237PeiPcdGetPtrEx (\r
238 IN CONST EFI_GUID *Guid,\r
239 IN UINTN ExTokenNumber\r
240 )\r
241{\r
242 return ExGetWorker (Guid, ExTokenNumber, 0);\r
243}\r
244\r
245\r
246\r
247BOOLEAN\r
248EFIAPI\r
249PeiPcdGetBoolEx (\r
250 IN CONST EFI_GUID *Guid,\r
251 IN UINTN ExTokenNumber\r
252 )\r
253{\r
254 return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
255}\r
256\r
257\r
258\r
259UINTN\r
260EFIAPI\r
261PeiPcdGetSizeEx (\r
262 IN CONST EFI_GUID *Guid,\r
263 IN UINTN ExTokenNumber\r
264 )\r
265{\r
266 return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber));\r
267}\r
268\r
269\r
270\r
271EFI_STATUS\r
272EFIAPI\r
273PeiPcdSet8 (\r
274 IN UINTN TokenNumber,\r
275 IN UINT8 Value\r
276 )\r
277{\r
278 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
279}\r
280\r
281\r
282\r
283EFI_STATUS\r
284EFIAPI\r
285PeiPcdSet16 (\r
286 IN UINTN TokenNumber,\r
287 IN UINT16 Value\r
288 )\r
289{\r
290 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
291}\r
292\r
293\r
294\r
295EFI_STATUS\r
296EFIAPI\r
297PeiPcdSet32 (\r
298 IN UINTN TokenNumber,\r
299 IN UINT32 Value\r
300 )\r
301{\r
302 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
303}\r
304\r
305\r
306\r
307EFI_STATUS\r
308EFIAPI\r
309PeiPcdSet64 (\r
310 IN UINTN TokenNumber,\r
311 IN UINT64 Value\r
312 )\r
313{\r
314 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
315}\r
316\r
317\r
318EFI_STATUS\r
319EFIAPI\r
320PeiPcdSetPtr (\r
321 IN UINTN TokenNumber,\r
322 IN UINTN SizeOfBuffer,\r
323 IN VOID *Buffer\r
324 )\r
325{\r
326 return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
327}\r
328\r
329\r
330\r
331EFI_STATUS\r
332EFIAPI\r
333PeiPcdSetBool (\r
334 IN UINTN TokenNumber,\r
335 IN BOOLEAN Value\r
336 )\r
337{\r
338 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
339}\r
340\r
341\r
342\r
343EFI_STATUS\r
344EFIAPI\r
345PeiPcdSet8Ex (\r
346 IN CONST EFI_GUID *Guid,\r
347 IN UINTN ExTokenNumber,\r
348 IN UINT8 Value\r
349 )\r
350{\r
351 return ExSetWorker(\r
352 ExTokenNumber, \r
353 Guid,\r
354 &Value, \r
355 sizeof (Value), \r
356 FALSE\r
357 );\r
358}\r
359\r
360\r
361\r
362EFI_STATUS\r
363EFIAPI\r
364PeiPcdSet16Ex (\r
365 IN CONST EFI_GUID *Guid,\r
366 IN UINTN ExTokenNumber,\r
367 IN UINT16 Value\r
368 )\r
369{\r
370 return ExSetWorker(\r
371 ExTokenNumber, \r
372 Guid,\r
373 &Value, \r
374 sizeof (Value), \r
375 FALSE\r
376 );\r
377}\r
378\r
379\r
380\r
381EFI_STATUS\r
382EFIAPI\r
383PeiPcdSet32Ex (\r
384 IN CONST EFI_GUID *Guid,\r
385 IN UINTN ExTokenNumber,\r
386 IN UINT32 Value\r
387 )\r
388{\r
389 return ExSetWorker(\r
390 ExTokenNumber, \r
391 Guid,\r
392 &Value, \r
393 sizeof (Value), \r
394 FALSE\r
395 );\r
396}\r
397\r
398\r
399\r
400EFI_STATUS\r
401EFIAPI\r
402PeiPcdSet64Ex (\r
403 IN CONST EFI_GUID *Guid,\r
404 IN UINTN ExTokenNumber,\r
405 IN UINT64 Value\r
406 )\r
407{\r
408 return ExSetWorker(\r
409 ExTokenNumber, \r
410 Guid,\r
411 &Value, \r
412 sizeof (Value), \r
413 FALSE\r
414 );\r
415}\r
416\r
417\r
418\r
419EFI_STATUS\r
420EFIAPI\r
421PeiPcdSetPtrEx (\r
422 IN CONST EFI_GUID *Guid,\r
423 IN UINTN ExTokenNumber,\r
424 IN UINTN SizeOfBuffer,\r
425 IN VOID *Value\r
426 )\r
427{\r
428 return ExSetWorker(\r
429 ExTokenNumber, \r
430 Guid,\r
431 Value, \r
432 SizeOfBuffer, \r
433 TRUE\r
434 );\r
435}\r
436\r
437\r
438\r
439EFI_STATUS\r
440EFIAPI\r
441PeiPcdSetBoolEx (\r
442 IN CONST EFI_GUID *Guid,\r
443 IN UINTN ExTokenNumber,\r
444 IN BOOLEAN Value\r
445 )\r
446{\r
447 return ExSetWorker(\r
448 ExTokenNumber, \r
449 Guid,\r
450 &Value, \r
451 sizeof (Value), \r
452 FALSE\r
453 );\r
454}\r
455\r
456\r
457\r
458\r
459EFI_STATUS\r
460EFIAPI\r
461PeiRegisterCallBackOnSet (\r
462 IN UINTN ExTokenNumber,\r
463 IN CONST EFI_GUID *Guid, OPTIONAL\r
464 IN PCD_PPI_CALLBACK CallBackFunction\r
465 )\r
466{\r
467 ASSERT (CallBackFunction != NULL);\r
468 \r
469 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);\r
470}\r
471\r
472\r
473\r
474EFI_STATUS\r
475EFIAPI\r
476PcdUnRegisterCallBackOnSet (\r
477 IN UINTN ExTokenNumber,\r
478 IN CONST EFI_GUID *Guid, OPTIONAL\r
479 IN PCD_PPI_CALLBACK CallBackFunction\r
480 )\r
481{\r
482 ASSERT (CallBackFunction != NULL);\r
483 \r
484 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);\r
485}\r
486\r
487\r
488\r
489EFI_STATUS\r
490EFIAPI\r
491PeiPcdGetNextToken (\r
492 IN CONST EFI_GUID *Guid, OPTIONAL\r
493 IN OUT UINTN *TokenNumber\r
494 )\r
495{\r
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
503 if (Guid == NULL) {\r
504 (*TokenNumber)++;\r
505\r
506 if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER) {\r
507 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
508 }\r
509 \r
510 } else {\r
511\r
512 if (PEI_EXMAP_TABLE_EMPTY) {\r
513 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
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
570EFI_STATUS\r
571EFIAPI\r
572PeiPcdGetNextTokenSpace (\r
573 IN OUT CONST EFI_GUID **Guid\r
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
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
588 } else {\r
589 return EFI_SUCCESS;\r
590 }\r
591 }\r
592\r
593 //\r
594 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
595 // 1) ExGuid\r
596 // 2) ExTokenNumber\r
597 //\r
598 PeiPcdDb = GetPcdDatabase ();\r
599\r
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
610 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid);\r
611\r
612 if (MatchGuid == NULL) {\r
613 return EFI_NOT_FOUND;\r
614 }\r
615 \r
616 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
617\r
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
627 i++;\r
628 for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {\r
629 if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {\r
630 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];\r
631 return EFI_SUCCESS;\r
632 }\r
633 }\r
634 *Guid = NULL;\r
635 return EFI_SUCCESS;\r
636 }\r
637\r
638 return EFI_NOT_FOUND;\r
639\r
640}\r
641\r