]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - EdkModulePkg/Universal/PCD/Dxe/Pcd.c
Corrected a typo error.
[mirror_edk2.git] / EdkModulePkg / Universal / PCD / Dxe / Pcd.c
... / ...
CommitLineData
1/** @file\r
2PCD DXE driver\r
3\r
4Copyright (c) 2006, Intel Corporation\r
5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13\r
14Module Name: Pcd.c\r
15\r
16**/\r
17\r
18#include "Service.h"\r
19\r
20\r
21PCD_PROTOCOL mPcdInstance = {\r
22 DxePcdSetSku,\r
23\r
24 DxePcdGet8,\r
25 DxePcdGet16,\r
26 DxePcdGet32,\r
27 DxePcdGet64,\r
28 DxePcdGetPtr,\r
29 DxePcdGetBool,\r
30 DxePcdGetSize,\r
31\r
32 DxePcdGet8Ex,\r
33 DxePcdGet16Ex,\r
34 DxePcdGet32Ex,\r
35 DxePcdGet64Ex,\r
36 DxePcdGetPtrEx,\r
37 DxePcdGetBoolEx,\r
38 DxePcdGetSizeEx,\r
39\r
40 DxePcdSet8,\r
41 DxePcdSet16,\r
42 DxePcdSet32,\r
43 DxePcdSet64,\r
44 DxePcdSetPtr,\r
45 DxePcdSetBool,\r
46\r
47 DxePcdSet8Ex,\r
48 DxePcdSet16Ex,\r
49 DxePcdSet32Ex,\r
50 DxePcdSet64Ex,\r
51 DxePcdSetPtrEx,\r
52 DxePcdSetBoolEx,\r
53\r
54 DxeRegisterCallBackOnSet,\r
55 DxeUnRegisterCallBackOnSet,\r
56 DxePcdGetNextToken\r
57};\r
58\r
59\r
60//\r
61// Static global to reduce the code size\r
62//\r
63static EFI_HANDLE NewHandle = NULL;\r
64\r
65EFI_STATUS\r
66EFIAPI\r
67PcdDxeInit (\r
68 IN EFI_HANDLE ImageHandle,\r
69 IN EFI_SYSTEM_TABLE *SystemTable\r
70 )\r
71{\r
72 EFI_STATUS Status;\r
73\r
74 //\r
75 // Make sure the Pcd Protocol is not already installed in the system\r
76 //\r
77\r
78 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gPcdProtocolGuid);\r
79\r
80 BuildPcdDxeDataBase ();\r
81\r
82 //\r
83 // BugBug Check if PcdDatabase is already installed.\r
84 //\r
85 \r
86 Status = gBS->InstallProtocolInterface (\r
87 &NewHandle,\r
88 &gPcdProtocolGuid,\r
89 EFI_NATIVE_INTERFACE,\r
90 &mPcdInstance\r
91 );\r
92\r
93 ASSERT_EFI_ERROR (Status);\r
94\r
95 return EFI_SUCCESS;\r
96\r
97}\r
98\r
99\r
100VOID\r
101EFIAPI\r
102DxePcdSetSku (\r
103 IN UINTN SkuId\r
104 )\r
105{\r
106 mPcdDatabase->PeiDb.Init.SystemSkuId = (SKU_ID) SkuId;\r
107 \r
108 return;\r
109}\r
110\r
111\r
112\r
113UINT8\r
114EFIAPI\r
115DxePcdGet8 (\r
116 IN UINTN TokenNumber\r
117 )\r
118{\r
119 return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
120}\r
121\r
122\r
123\r
124UINT16\r
125EFIAPI\r
126DxePcdGet16 (\r
127 IN UINTN TokenNumber\r
128 )\r
129{\r
130 return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
131}\r
132\r
133\r
134\r
135UINT32\r
136EFIAPI\r
137DxePcdGet32 (\r
138 IN UINTN TokenNumber\r
139 )\r
140{\r
141 return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
142}\r
143\r
144\r
145\r
146UINT64\r
147EFIAPI\r
148DxePcdGet64 (\r
149 IN UINTN TokenNumber\r
150 )\r
151{\r
152 return ReadUnaligned64(GetWorker (TokenNumber, sizeof (UINT64)));\r
153}\r
154\r
155\r
156\r
157VOID *\r
158EFIAPI\r
159DxePcdGetPtr (\r
160 IN UINTN TokenNumber\r
161 )\r
162{\r
163 return GetWorker (TokenNumber, 0);\r
164}\r
165\r
166\r
167\r
168BOOLEAN\r
169EFIAPI\r
170DxePcdGetBool (\r
171 IN UINTN TokenNumber\r
172 )\r
173{\r
174 return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
175}\r
176\r
177\r
178\r
179UINTN\r
180EFIAPI\r
181DxePcdGetSize (\r
182 IN UINTN TokenNumber\r
183 )\r
184{\r
185 UINTN Size;\r
186 UINT32 *LocalTokenNumberTable;\r
187 BOOLEAN IsPeiDb;\r
188 UINTN MaxSize;\r
189 UINTN TmpTokenNumber;\r
190 //\r
191 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
192 // We have to decrement TokenNumber by 1 to make it usable\r
193 // as the array index.\r
194 //\r
195 TokenNumber--;\r
196\r
197 //\r
198 // Backup the TokenNumber passed in as GetPtrTypeSize need the original TokenNumber\r
199 // \r
200 TmpTokenNumber = TokenNumber;\r
201\r
202 ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER);\r
203\r
204 IsPeiDb = (BOOLEAN) (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
205 \r
206 TokenNumber = IsPeiDb ? TokenNumber : \r
207 (TokenNumber - PEI_LOCAL_TOKEN_NUMBER);\r
208\r
209 LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable \r
210 : mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
211\r
212 Size = (LocalTokenNumberTable[TokenNumber] & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;\r
213\r
214 if (Size == 0) {\r
215 //\r
216 // For pointer type, we need to scan the SIZE_TABLE to get the current size.\r
217 //\r
218 return GetPtrTypeSize (TmpTokenNumber, &MaxSize);\r
219 } else {\r
220 return Size;\r
221 }\r
222\r
223}\r
224\r
225\r
226\r
227UINT8\r
228EFIAPI\r
229DxePcdGet8Ex (\r
230 IN CONST EFI_GUID *Guid,\r
231 IN UINTN ExTokenNumber\r
232 )\r
233{\r
234 return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT8)));\r
235}\r
236\r
237\r
238\r
239UINT16\r
240EFIAPI\r
241DxePcdGet16Ex (\r
242 IN CONST EFI_GUID *Guid,\r
243 IN UINTN ExTokenNumber\r
244 )\r
245{\r
246 return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof(UINT16)));\r
247}\r
248\r
249\r
250\r
251UINT32\r
252EFIAPI\r
253DxePcdGet32Ex (\r
254 IN CONST EFI_GUID *Guid,\r
255 IN UINTN ExTokenNumber\r
256 )\r
257{\r
258 return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof(UINT32)));\r
259}\r
260\r
261\r
262\r
263UINT64\r
264EFIAPI\r
265DxePcdGet64Ex (\r
266 IN CONST EFI_GUID *Guid,\r
267 IN UINTN ExTokenNumber\r
268 )\r
269{\r
270 return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof(UINT64)));\r
271}\r
272\r
273\r
274\r
275VOID *\r
276EFIAPI\r
277DxePcdGetPtrEx (\r
278 IN CONST EFI_GUID *Guid,\r
279 IN UINTN ExTokenNumber\r
280 )\r
281{\r
282 return ExGetWorker (Guid, ExTokenNumber, 0);\r
283}\r
284\r
285\r
286\r
287BOOLEAN\r
288EFIAPI\r
289DxePcdGetBoolEx (\r
290 IN CONST EFI_GUID *Guid,\r
291 IN UINTN ExTokenNumber\r
292 )\r
293{\r
294 return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof(BOOLEAN)));\r
295}\r
296\r
297\r
298\r
299UINTN\r
300EFIAPI\r
301DxePcdGetSizeEx (\r
302 IN CONST EFI_GUID *Guid,\r
303 IN UINTN ExTokenNumber\r
304 )\r
305{\r
306 return DxePcdGetSize(GetExPcdTokenNumber (Guid, (UINT32) ExTokenNumber));\r
307}\r
308\r
309\r
310\r
311EFI_STATUS\r
312EFIAPI\r
313DxePcdSet8 (\r
314 IN UINTN TokenNumber,\r
315 IN UINT8 Value\r
316 )\r
317{\r
318 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
319}\r
320\r
321\r
322\r
323EFI_STATUS\r
324EFIAPI\r
325DxePcdSet16 (\r
326 IN UINTN TokenNumber,\r
327 IN UINT16 Value\r
328 )\r
329{\r
330 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
331}\r
332\r
333\r
334\r
335EFI_STATUS\r
336EFIAPI\r
337DxePcdSet32 (\r
338 IN UINTN TokenNumber,\r
339 IN UINT32 Value\r
340 )\r
341{\r
342 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
343}\r
344\r
345\r
346\r
347EFI_STATUS\r
348EFIAPI\r
349DxePcdSet64 (\r
350 IN UINTN TokenNumber,\r
351 IN UINT64 Value\r
352 )\r
353{\r
354 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
355}\r
356\r
357\r
358\r
359EFI_STATUS\r
360EFIAPI\r
361DxePcdSetPtr (\r
362 IN UINTN TokenNumber,\r
363 IN OUT UINTN *SizeOfBuffer,\r
364 IN VOID *Buffer\r
365 )\r
366{\r
367 return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
368}\r
369\r
370\r
371\r
372EFI_STATUS\r
373EFIAPI\r
374DxePcdSetBool (\r
375 IN UINTN TokenNumber,\r
376 IN BOOLEAN Value\r
377 )\r
378{\r
379 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
380}\r
381\r
382\r
383\r
384EFI_STATUS\r
385EFIAPI\r
386DxePcdSet8Ex (\r
387 IN CONST EFI_GUID *Guid,\r
388 IN UINTN ExTokenNumber,\r
389 IN UINT8 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
399DxePcdSet16Ex (\r
400 IN CONST EFI_GUID *Guid,\r
401 IN UINTN ExTokenNumber,\r
402 IN UINT16 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
412DxePcdSet32Ex (\r
413 IN CONST EFI_GUID *Guid,\r
414 IN UINTN ExTokenNumber,\r
415 IN UINT32 Value\r
416 )\r
417{\r
418 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
419}\r
420\r
421\r
422\r
423EFI_STATUS\r
424EFIAPI\r
425DxePcdSet64Ex (\r
426 IN CONST EFI_GUID *Guid,\r
427 IN UINTN ExTokenNumber,\r
428 IN UINT64 Value\r
429 )\r
430{\r
431 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
432}\r
433\r
434\r
435\r
436EFI_STATUS\r
437EFIAPI\r
438DxePcdSetPtrEx (\r
439 IN CONST EFI_GUID *Guid,\r
440 IN UINTN ExTokenNumber,\r
441 IN OUT UINTN *SizeOfBuffer,\r
442 IN VOID *Buffer\r
443 )\r
444{\r
445 return ExSetWorker(ExTokenNumber, Guid, Buffer, SizeOfBuffer, TRUE);\r
446}\r
447\r
448\r
449\r
450EFI_STATUS\r
451EFIAPI\r
452DxePcdSetBoolEx (\r
453 IN CONST EFI_GUID *Guid,\r
454 IN UINTN ExTokenNumber,\r
455 IN BOOLEAN Value\r
456 )\r
457{\r
458 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
459}\r
460\r
461\r
462\r
463\r
464EFI_STATUS\r
465EFIAPI\r
466DxeRegisterCallBackOnSet (\r
467 IN UINTN TokenNumber,\r
468 IN CONST EFI_GUID *Guid, OPTIONAL\r
469 IN PCD_PROTOCOL_CALLBACK CallBackFunction\r
470 )\r
471{\r
472 ASSERT (CallBackFunction != NULL);\r
473 \r
474 return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);\r
475}\r
476\r
477\r
478\r
479EFI_STATUS\r
480EFIAPI\r
481DxeUnRegisterCallBackOnSet (\r
482 IN UINTN TokenNumber,\r
483 IN CONST EFI_GUID *Guid, OPTIONAL\r
484 IN PCD_PROTOCOL_CALLBACK CallBackFunction\r
485 )\r
486{\r
487 ASSERT (CallBackFunction != NULL);\r
488 \r
489 return DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);\r
490}\r
491\r
492\r
493\r
494EFI_STATUS\r
495EFIAPI\r
496DxePcdGetNextToken (\r
497 IN CONST EFI_GUID *Guid, OPTIONAL\r
498 IN OUT UINTN *TokenNumber\r
499 )\r
500{\r
501 UINTN ExTokenNumber;\r
502 \r
503 //\r
504 // Scan the local token space\r
505 //\r
506 if (Guid == NULL) {\r
507 (*TokenNumber)++;\r
508 if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) {\r
509 return EFI_SUCCESS;\r
510 } else {\r
511 if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER &&\r
512 *TokenNumber < PEI_LOCAL_TOKEN_NUMBER) {\r
513 //\r
514 // The first Non-Ex type Token Number for DXE PCD \r
515 // database is PEI_LOCAL_TOKEN_NUMBER\r
516 //\r
517 *TokenNumber = PEI_LOCAL_TOKEN_NUMBER;\r
518 return EFI_SUCCESS;\r
519 } else if (*TokenNumber >= DXE_NEX_TOKEN_NUMBER + PEI_LOCAL_TOKEN_NUMBER) {\r
520 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
521 return EFI_SUCCESS;\r
522 }\r
523 }\r
524 }\r
525\r
526 if (PEI_EXMAP_TABLE_EMPTY && PEI_EXMAP_TABLE_EMPTY) {\r
527 *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
528 return EFI_NOT_FOUND;\r
529 }\r
530\r
531 ExTokenNumber = *TokenNumber;\r
532 if (!PEI_EXMAP_TABLE_EMPTY) {\r
533 ExTokenNumber = ExGetNextTokeNumber (\r
534 Guid,\r
535 ExTokenNumber,\r
536 mPcdDatabase->PeiDb.Init.GuidTable,\r
537 sizeof(mPcdDatabase->PeiDb.Init.GuidTable),\r
538 mPcdDatabase->PeiDb.Init.ExMapTable,\r
539 sizeof(mPcdDatabase->PeiDb.Init.ExMapTable)\r
540 );\r
541 }\r
542\r
543 if ((ExTokenNumber == PCD_INVALID_TOKEN_NUMBER) &&\r
544 !DXE_EXMAP_TABLE_EMPTY\r
545 ) {\r
546 ExTokenNumber = ExGetNextTokeNumber (\r
547 Guid,\r
548 ExTokenNumber,\r
549 mPcdDatabase->PeiDb.Init.GuidTable,\r
550 sizeof(mPcdDatabase->PeiDb.Init.GuidTable),\r
551 mPcdDatabase->PeiDb.Init.ExMapTable,\r
552 sizeof(mPcdDatabase->PeiDb.Init.ExMapTable)\r
553 );\r
554 }\r
555\r
556 *TokenNumber = ExTokenNumber;\r
557\r
558 return EFI_SUCCESS;\r
559}\r
560\r
561\r
562EFI_GUID **\r
563GetDistinctTokenSpace (\r
564 IN OUT UINTN *ExMapTableSize,\r
565 IN DYNAMICEX_MAPPING *ExMapTable,\r
566 IN EFI_GUID *GuidTable\r
567 )\r
568{\r
569 EFI_GUID **DistinctTokenSpace;\r
570 UINTN OldGuidIndex;\r
571 UINTN TsIdx;\r
572 UINTN Idx;\r
573\r
574\r
575 DistinctTokenSpace = AllocateZeroPool (*ExMapTableSize * sizeof (EFI_GUID *));\r
576 ASSERT (DistinctTokenSpace != NULL);\r
577\r
578 TsIdx = 0;\r
579 OldGuidIndex = ExMapTable[0].ExGuidIndex;\r
580 DistinctTokenSpace[TsIdx] = &GuidTable[OldGuidIndex];\r
581 for (Idx = 1; Idx < PEI_EXMAPPING_TABLE_SIZE; Idx++) {\r
582 if (ExMapTable[Idx].ExGuidIndex != OldGuidIndex) {\r
583 OldGuidIndex = ExMapTable[Idx].ExGuidIndex;\r
584 DistinctTokenSpace[++TsIdx] = &GuidTable[OldGuidIndex];\r
585 }\r
586 }\r
587\r
588 *ExMapTableSize = TsIdx;\r
589 return DistinctTokenSpace;\r
590 \r
591}\r
592 \r
593\r
594STATIC EFI_GUID *TmpTokenSpaceBuffer[PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZE] = { 0 };\r
595\r
596EFI_STATUS\r
597EFIAPI\r
598DxePcdGetNextTokenSpace (\r
599 IN OUT CONST EFI_GUID **Guid\r
600 )\r
601{\r
602 UINTN Idx;\r
603 UINTN Idx2;\r
604 UINTN Idx3;\r
605 UINTN PeiTokenSpaceTableSize;\r
606 UINTN DxeTokenSpaceTableSize;\r
607 EFI_GUID **PeiTokenSpaceTable;\r
608 EFI_GUID **DxeTokenSpaceTable;\r
609 BOOLEAN Match;\r
610\r
611 ASSERT (Guid != NULL);\r
612 \r
613 if (PEI_EXMAP_TABLE_EMPTY && DXE_EXMAP_TABLE_EMPTY) {\r
614 if (*Guid != NULL) {\r
615 return EFI_NOT_FOUND;\r
616 } else {\r
617 return EFI_SUCCESS;\r
618 }\r
619 }\r
620 \r
621 \r
622 if (TmpTokenSpaceBuffer[0] != NULL) {\r
623 PeiTokenSpaceTableSize = 0;\r
624\r
625 if (!PEI_EXMAP_TABLE_EMPTY) {\r
626 PeiTokenSpaceTableSize = PEI_EXMAPPING_TABLE_SIZE;\r
627 PeiTokenSpaceTable = GetDistinctTokenSpace (&PeiTokenSpaceTableSize,\r
628 mPcdDatabase->PeiDb.Init.ExMapTable,\r
629 mPcdDatabase->PeiDb.Init.GuidTable\r
630 );\r
631 CopyMem (TmpTokenSpaceBuffer, PeiTokenSpaceTable, sizeof (EFI_GUID*) * PeiTokenSpaceTableSize);\r
632 }\r
633\r
634 if (!DXE_EXMAP_TABLE_EMPTY) {\r
635 DxeTokenSpaceTableSize = DXE_EXMAPPING_TABLE_SIZE;\r
636 DxeTokenSpaceTable = GetDistinctTokenSpace (&DxeTokenSpaceTableSize,\r
637 mPcdDatabase->DxeDb.Init.ExMapTable,\r
638 mPcdDatabase->DxeDb.Init.GuidTable\r
639 );\r
640\r
641 //\r
642 // Make sure EFI_GUID in DxeTokenSpaceTable does not exist in PeiTokenSpaceTable\r
643 //\r
644 for (Idx2 = 0, Idx3 = PeiTokenSpaceTableSize; Idx2 < DxeTokenSpaceTableSize; Idx2++) {\r
645 Match = FALSE;\r
646 for (Idx = 0; Idx < PeiTokenSpaceTableSize; Idx++) {\r
647 if (CompareGuid (TmpTokenSpaceBuffer[Idx], DxeTokenSpaceTable[Idx2])) {\r
648 Match = TRUE;\r
649 break;\r
650 }\r
651 }\r
652 if (!Match) {\r
653 TmpTokenSpaceBuffer[Idx3++] = DxeTokenSpaceTable[Idx2];\r
654 }\r
655 }\r
656 }\r
657 }\r
658\r
659 if (*Guid == NULL) {\r
660 *Guid = TmpTokenSpaceBuffer[0];\r
661 return EFI_SUCCESS;\r
662 }\r
663 \r
664 for (Idx = 0; Idx < (PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZE); Idx++) {\r
665 if(CompareGuid (*Guid, TmpTokenSpaceBuffer[Idx])) {\r
666 Idx++;\r
667 *Guid = TmpTokenSpaceBuffer[Idx];\r
668 return EFI_SUCCESS;\r
669 }\r
670 }\r
671\r
672 return EFI_NOT_FOUND;\r
673\r
674}\r
675\r
676\r