]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - EdkModulePkg/Universal/PCD/Pei/Pcd.c
Added Wordpad recommendation for editor, change ACTIVE_PLATFORM from REQUIRED to...
[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 PEI_PCD_DATABASE *PeiPcdDb;\r
174 UINTN Size;\r
175 UINTN MaxSize;\r
176\r
177 PeiPcdDb = GetPcdDatabase ();\r
178 //\r
179 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
180 // We have to decrement TokenNumber by 1 to make it usable\r
181 // as the array index.\r
182 //\r
183 TokenNumber--;\r
184\r
185 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
186\r
187 Size = (PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber] & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;\r
188\r
189 if (Size == 0) {\r
190 //\r
191 // For pointer type, we need to scan the SIZE_TABLE to get the current size.\r
192 //\r
193 return GetPtrTypeSize (TokenNumber, &MaxSize, PeiPcdDb);\r
194 } else {\r
195 return Size;\r
196 }\r
197\r
198}\r
199\r
200\r
201\r
202UINT8\r
203EFIAPI\r
204PeiPcdGet8Ex (\r
205 IN CONST EFI_GUID *Guid,\r
206 IN UINTN ExTokenNumber\r
207 )\r
208{\r
209 return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
210}\r
211\r
212\r
213\r
214UINT16\r
215EFIAPI\r
216PeiPcdGet16Ex (\r
217 IN CONST EFI_GUID *Guid,\r
218 IN UINTN ExTokenNumber\r
219 )\r
220{\r
221 return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
222}\r
223\r
224\r
225\r
226UINT32\r
227EFIAPI\r
228PeiPcdGet32Ex (\r
229 IN CONST EFI_GUID *Guid,\r
230 IN UINTN ExTokenNumber\r
231 )\r
232{\r
233 return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
234}\r
235\r
236\r
237\r
238UINT64\r
239EFIAPI\r
240PeiPcdGet64Ex (\r
241 IN CONST EFI_GUID *Guid,\r
242 IN UINTN ExTokenNumber\r
243 )\r
244{\r
245 return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
246}\r
247\r
248\r
249\r
250VOID *\r
251EFIAPI\r
252PeiPcdGetPtrEx (\r
253 IN CONST EFI_GUID *Guid,\r
254 IN UINTN ExTokenNumber\r
255 )\r
256{\r
257 return ExGetWorker (Guid, ExTokenNumber, 0);\r
258}\r
259\r
260\r
261\r
262BOOLEAN\r
263EFIAPI\r
264PeiPcdGetBoolEx (\r
265 IN CONST EFI_GUID *Guid,\r
266 IN UINTN ExTokenNumber\r
267 )\r
268{\r
269 return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
270}\r
271\r
272\r
273\r
274UINTN\r
275EFIAPI\r
276PeiPcdGetSizeEx (\r
277 IN CONST EFI_GUID *Guid,\r
278 IN UINTN ExTokenNumber\r
279 )\r
280{\r
281 return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber));\r
282}\r
283\r
284\r
285\r
286EFI_STATUS\r
287EFIAPI\r
288PeiPcdSet8 (\r
289 IN UINTN TokenNumber,\r
290 IN UINT8 Value\r
291 )\r
292{\r
293 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
294}\r
295\r
296\r
297\r
298EFI_STATUS\r
299EFIAPI\r
300PeiPcdSet16 (\r
301 IN UINTN TokenNumber,\r
302 IN UINT16 Value\r
303 )\r
304{\r
305 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
306}\r
307\r
308\r
309\r
310EFI_STATUS\r
311EFIAPI\r
312PeiPcdSet32 (\r
313 IN UINTN TokenNumber,\r
314 IN UINT32 Value\r
315 )\r
316{\r
317 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
318}\r
319\r
320\r
321\r
322EFI_STATUS\r
323EFIAPI\r
324PeiPcdSet64 (\r
325 IN UINTN TokenNumber,\r
326 IN UINT64 Value\r
327 )\r
328{\r
329 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
330}\r
331\r
332\r
333EFI_STATUS\r
334EFIAPI\r
335PeiPcdSetPtr (\r
336 IN UINTN TokenNumber,\r
337 IN OUT UINTN *SizeOfBuffer,\r
338 IN VOID *Buffer\r
339 )\r
340{\r
341 return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
342}\r
343\r
344\r
345\r
346EFI_STATUS\r
347EFIAPI\r
348PeiPcdSetBool (\r
349 IN UINTN TokenNumber,\r
350 IN BOOLEAN Value\r
351 )\r
352{\r
353 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
354}\r
355\r
356\r
357\r
358EFI_STATUS\r
359EFIAPI\r
360PeiPcdSet8Ex (\r
361 IN CONST EFI_GUID *Guid,\r
362 IN UINTN ExTokenNumber,\r
363 IN UINT8 Value\r
364 )\r
365{\r
366 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
367}\r
368\r
369\r
370\r
371EFI_STATUS\r
372EFIAPI\r
373PeiPcdSet16Ex (\r
374 IN CONST EFI_GUID *Guid,\r
375 IN UINTN ExTokenNumber,\r
376 IN UINT16 Value\r
377 )\r
378{\r
379 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
380}\r
381\r
382\r
383\r
384EFI_STATUS\r
385EFIAPI\r
386PeiPcdSet32Ex (\r
387 IN CONST EFI_GUID *Guid,\r
388 IN UINTN ExTokenNumber,\r
389 IN UINT32 Value\r
390 )\r
391{\r
392 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
393}\r
394\r
395\r
396\r
397EFI_STATUS\r
398EFIAPI\r
399PeiPcdSet64Ex (\r
400 IN CONST EFI_GUID *Guid,\r
401 IN UINTN ExTokenNumber,\r
402 IN UINT64 Value\r
403 )\r
404{\r
405 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
406}\r
407\r
408\r
409\r
410EFI_STATUS\r
411EFIAPI\r
412PeiPcdSetPtrEx (\r
413 IN CONST EFI_GUID *Guid,\r
414 IN UINTN ExTokenNumber,\r
415 IN UINTN *SizeOfBuffer,\r
416 IN VOID *Value\r
417 )\r
418{\r
419 return ExSetWorker (ExTokenNumber, Guid, Value, SizeOfBuffer, TRUE);\r
420}\r
421\r
422\r
423\r
424EFI_STATUS\r
425EFIAPI\r
426PeiPcdSetBoolEx (\r
427 IN CONST EFI_GUID *Guid,\r
428 IN UINTN ExTokenNumber,\r
429 IN BOOLEAN Value\r
430 )\r
431{\r
432 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
433}\r
434\r
435\r
436\r
437\r
438EFI_STATUS\r
439EFIAPI\r
440PeiRegisterCallBackOnSet (\r
441 IN UINTN ExTokenNumber,\r
442 IN CONST EFI_GUID *Guid, OPTIONAL\r
443 IN PCD_PPI_CALLBACK CallBackFunction\r
444 )\r
445{\r
446 ASSERT (CallBackFunction != NULL);\r
447 \r
448 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);\r
449}\r
450\r
451\r
452\r
453EFI_STATUS\r
454EFIAPI\r
455PcdUnRegisterCallBackOnSet (\r
456 IN UINTN ExTokenNumber,\r
457 IN CONST EFI_GUID *Guid, OPTIONAL\r
458 IN PCD_PPI_CALLBACK CallBackFunction\r
459 )\r
460{\r
461 ASSERT (CallBackFunction != NULL);\r
462 \r
463 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);\r
464}\r
465\r
466\r
467\r
468EFI_STATUS\r
469EFIAPI\r
470PeiPcdGetNextToken (\r
471 IN CONST EFI_GUID *Guid, OPTIONAL\r
472 IN OUT UINTN *TokenNumber\r
473 )\r
474{\r
475 UINTN GuidTableIdx;\r
476 PEI_PCD_DATABASE *PeiPcdDb;\r
477 EFI_GUID *MatchGuid;\r
478 DYNAMICEX_MAPPING *ExMapTable;\r
479 UINTN i;\r
480 BOOLEAN Found;\r
481 \r
482 if (Guid == NULL) {\r
483 if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {\r
484 return EFI_NOT_FOUND;\r
485 }\r
486 (*TokenNumber)++;\r
487 if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {\r
488 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
489 }\r
490 return EFI_SUCCESS;\r
491 } else {\r
492 if (PEI_EXMAP_TABLE_EMPTY) {\r
493 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
494 return EFI_SUCCESS;\r
495 }\r
496 \r
497 //\r
498 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
499 // 1) ExGuid\r
500 // 2) ExTokenNumber\r
501 //\r
502 PeiPcdDb = GetPcdDatabase ();\r
503 \r
504 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
505\r
506 if (MatchGuid == NULL) {\r
507 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
508 return EFI_NOT_FOUND;\r
509 }\r
510\r
511 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
512\r
513 ExMapTable = PeiPcdDb->Init.ExMapTable;\r
514\r
515 Found = FALSE;\r
516 //\r
517 // Locate the GUID in ExMapTable first.\r
518 //\r
519 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
520 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
521 Found = TRUE;\r
522 break;\r
523 }\r
524 }\r
525\r
526 if (Found) {\r
527 if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) {\r
528 *TokenNumber = ExMapTable[i].ExTokenNumber;\r
529 return EFI_SUCCESS;\r
530 }\r
531\r
532 for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
533 if (ExMapTable[i].ExTokenNumber == *TokenNumber) {\r
534 i++;\r
535 if (i == PEI_EXMAPPING_TABLE_SIZE) {\r
536 //\r
537 // Exceed the length of ExMap Table\r
538 //\r
539 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
540 return EFI_SUCCESS;\r
541 }\r
542 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
543 *TokenNumber = ExMapTable[i].ExTokenNumber;\r
544 return EFI_SUCCESS;\r
545 } else {\r
546 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
547 return EFI_SUCCESS;\r
548 }\r
549 }\r
550 }\r
551 return EFI_NOT_FOUND;\r
552 }\r
553 }\r
554\r
555 return EFI_NOT_FOUND;\r
556}\r
557\r
558\r
559\r
560EFI_STATUS\r
561EFIAPI\r
562PeiPcdGetNextTokenSpace (\r
563 IN OUT CONST EFI_GUID **Guid\r
564 )\r
565{\r
566 UINTN GuidTableIdx;\r
567 EFI_GUID *MatchGuid;\r
568 PEI_PCD_DATABASE *PeiPcdDb;\r
569 DYNAMICEX_MAPPING *ExMapTable;\r
570 UINTN i;\r
571 BOOLEAN Found;\r
572\r
573 ASSERT (Guid != NULL);\r
574\r
575 if (PEI_EXMAP_TABLE_EMPTY) {\r
576 if (*Guid != NULL) {\r
577 return EFI_NOT_FOUND;\r
578 } else {\r
579 return EFI_SUCCESS;\r
580 }\r
581 }\r
582\r
583 //\r
584 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
585 // 1) ExGuid\r
586 // 2) ExTokenNumber\r
587 //\r
588 PeiPcdDb = GetPcdDatabase ();\r
589\r
590 ExMapTable = PeiPcdDb->Init.ExMapTable;\r
591\r
592 if (*Guid == NULL) {\r
593 //\r
594 // return the first Token Space Guid.\r
595 //\r
596 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex];\r
597 return EFI_SUCCESS;\r
598 }\r
599\r
600 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid);\r
601\r
602 if (MatchGuid == NULL) {\r
603 return EFI_NOT_FOUND;\r
604 }\r
605 \r
606 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
607\r
608 Found = FALSE;\r
609 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
610 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
611 Found = TRUE;\r
612 break;\r
613 }\r
614 }\r
615\r
616 if (Found) {\r
617 i++;\r
618 for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {\r
619 if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {\r
620 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];\r
621 return EFI_SUCCESS;\r
622 }\r
623 }\r
624 *Guid = NULL;\r
625 return EFI_SUCCESS;\r
626 }\r
627\r
628 return EFI_NOT_FOUND;\r
629\r
630}\r
631\r