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