2 Private functions used by PCD DXE driver.s
4 Copyright (c) 2006, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 Module Name: Service.c
21 // Build Tool will generate DXE_PCD_DB_INIT_VALUE in Autogen.h
22 // Compression Algorithm will take care of the size optimization.
25 PCD_DATABASE
* mPcdDatabase
;
27 LIST_ENTRY
*mCallbackFnTable
;
35 UINT32
*LocalTokenNumberTable
;
43 VARIABLE_HEAD
*VariableHead
;
44 UINT8
*VaraiableDefaultBuffer
;
50 UINT16 StringTableIdx
;
51 UINT32 LocalTokenNumber
;
56 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
57 // We have to decrement TokenNumber by 1 to make it usable
58 // as the array index.
62 TmpTokenNumber
= TokenNumber
;
64 ASSERT (TokenNumber
< PCD_TOTAL_TOKEN_NUMBER
);
66 ASSERT ((GetSize
== DxePcdGetSize (TokenNumber
+ 1)) || (GetSize
== 0));
69 IsPeiDb
= (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
) ? TRUE
: FALSE
;
71 LocalTokenNumberTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
:
72 mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
74 SizeTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.SizeTable
:
75 mPcdDatabase
->DxeDb
.Init
.SizeTable
;
77 TokenNumber
= IsPeiDb
? TokenNumber
:
78 TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
;
80 LocalTokenNumber
= LocalTokenNumberTable
[TokenNumber
];
82 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == PCD_TYPE_SKU_ENABLED
) {
84 GetPtrTypeSize (TmpTokenNumber
, &MaxSize
);
88 LocalTokenNumber
= GetSkuEnabledTokenNumber (LocalTokenNumber
& ~PCD_TYPE_SKU_ENABLED
, MaxSize
, IsPeiDb
);
91 PcdDb
= IsPeiDb
? ((UINT8
*) &mPcdDatabase
->PeiDb
) : ((UINT8
*) &mPcdDatabase
->DxeDb
);
92 StringTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.StringTable
:
93 mPcdDatabase
->DxeDb
.Init
.StringTable
;
95 Offset
= LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
;
97 switch (LocalTokenNumber
& PCD_TYPE_ALL_SET
) {
99 VpdHead
= (VPD_HEAD
*) ((UINT8
*) PcdDb
+ Offset
);
100 return (VOID
*) (UINTN
) (FixedPcdGet32(PcdVpdBaseAddress
) + VpdHead
->Offset
);
103 GuidTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.GuidTable
:
104 mPcdDatabase
->DxeDb
.Init
.GuidTable
;
106 VariableHead
= (VARIABLE_HEAD
*) (PcdDb
+ Offset
);
108 Guid
= &(GuidTable
[VariableHead
->GuidTableIndex
]);
109 Name
= &(StringTable
[VariableHead
->StringIndex
]);
110 VaraiableDefaultBuffer
= (UINT8
*) PcdDb
+ VariableHead
->DefaultValueOffset
;
112 Status
= GetHiiVariable (Guid
, Name
, &Data
, &DataSize
);
113 if (Status
== EFI_SUCCESS
) {
116 // It is a pointer type. So get the MaxSize reserved for
119 GetPtrTypeSize (TokenNumber
, &GetSize
);
121 CopyMem (VaraiableDefaultBuffer
, Data
+ VariableHead
->Offset
, GetSize
);
125 // If the operation is successful, we copy the data
126 // to the default value buffer in the PCD Database.
127 // So that we can free the Data allocated in GetHiiVariable.
130 // If the operation is not successful,
131 // Return 1) either the default value specified by Platform Integrator
132 // 2) Or the value Set by a PCD set operation.
134 return (VOID
*) VaraiableDefaultBuffer
;
136 case PCD_TYPE_STRING
:
137 StringTableIdx
= (UINT16
) *((UINT8
*) PcdDb
+ Offset
);
138 return (VOID
*) &StringTable
[StringTableIdx
];
141 return (VOID
*) ((UINT8
*) PcdDb
+ Offset
);
159 DxeRegisterCallBackWorker (
160 IN UINTN TokenNumber
,
161 IN CONST GUID
*Guid
, OPTIONAL
162 IN PCD_PROTOCOL_CALLBACK CallBackFunction
165 CALLBACK_FN_ENTRY
*FnTableEntry
;
166 LIST_ENTRY
*ListHead
;
167 LIST_ENTRY
*ListNode
;
170 TokenNumber
= GetExPcdTokenNumber (Guid
, (UINT32
) TokenNumber
);
174 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
175 // We have to decrement TokenNumber by 1 to make it usable
176 // as the array index.
180 ListHead
= &mCallbackFnTable
[TokenNumber
];
181 ListNode
= GetFirstNode (ListHead
);
183 while (ListNode
!= ListHead
) {
184 FnTableEntry
= CR_FNENTRY_FROM_LISTNODE(ListNode
, CALLBACK_FN_ENTRY
, Node
);
186 if (FnTableEntry
->CallbackFn
== CallBackFunction
) {
188 // We only allow a Callback function to be register once
189 // for a TokenNumber. So just return EFI_SUCCESS
193 ListNode
= GetNextNode (ListHead
, ListNode
);
196 FnTableEntry
= AllocatePool (sizeof(CALLBACK_FN_ENTRY
));
197 ASSERT (FnTableEntry
!= NULL
);
199 FnTableEntry
->CallbackFn
= CallBackFunction
;
200 InsertTailList (ListHead
, &FnTableEntry
->Node
);
209 DxeUnRegisterCallBackWorker (
210 IN UINTN TokenNumber
,
211 IN CONST GUID
*Guid
, OPTIONAL
212 IN PCD_PROTOCOL_CALLBACK CallBackFunction
215 CALLBACK_FN_ENTRY
*FnTableEntry
;
216 LIST_ENTRY
*ListHead
;
217 LIST_ENTRY
*ListNode
;
220 TokenNumber
= GetExPcdTokenNumber (Guid
, (UINT32
) TokenNumber
);
224 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
225 // We have to decrement TokenNumber by 1 to make it usable
226 // as the array index.
230 ListHead
= &mCallbackFnTable
[TokenNumber
];
231 ListNode
= GetFirstNode (ListHead
);
233 while (ListNode
!= ListHead
) {
234 FnTableEntry
= CR_FNENTRY_FROM_LISTNODE(ListNode
, CALLBACK_FN_ENTRY
, Node
);
236 if (FnTableEntry
->CallbackFn
== CallBackFunction
) {
238 // We only allow a Callback function to be register once
239 // for a TokenNumber. So we can safely remove the Node from
240 // the Link List and return EFI_SUCCESS.
242 RemoveEntryList (ListNode
);
243 FreePool (FnTableEntry
);
247 ListNode
= GetNextNode (ListHead
, ListNode
);
250 return EFI_INVALID_PARAMETER
;
256 ExGetNextTokeNumber (
257 IN CONST EFI_GUID
*Guid
,
258 IN OUT UINTN
*TokenNumber
,
259 IN EFI_GUID
*GuidTable
,
260 IN UINTN SizeOfGuidTable
,
261 IN DYNAMICEX_MAPPING
*ExMapTable
,
262 IN UINTN SizeOfExMapTable
270 MatchGuid
= ScanGuid (GuidTable
, SizeOfGuidTable
, Guid
);
271 if (MatchGuid
== NULL
) {
272 return EFI_NOT_FOUND
;
276 GuidTableIdx
= MatchGuid
- GuidTable
;
277 for (Idx
= 0; Idx
< SizeOfExMapTable
; Idx
++) {
278 if (ExMapTable
[Idx
].ExGuidIndex
== GuidTableIdx
) {
285 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
286 *TokenNumber
= ExMapTable
[Idx
].ExTokenNumber
;
290 for ( ; Idx
< SizeOfExMapTable
; Idx
++) {
291 if (ExMapTable
[Idx
].ExTokenNumber
== *TokenNumber
) {
293 if (Idx
== SizeOfExMapTable
) {
295 // Exceed the length of ExMap Table
297 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
299 } else if (ExMapTable
[Idx
].ExGuidIndex
== GuidTableIdx
) {
301 // Found the next match
303 *TokenNumber
= ExMapTable
[Idx
].ExTokenNumber
;
307 // Guid has been changed. It is the next Token Space Guid.
308 // We should flag no more TokenNumber.
310 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
317 return EFI_NOT_FOUND
;
324 BuildPcdDxeDataBase (
328 PEI_PCD_DATABASE
*PeiDatabase
;
329 EFI_HOB_GUID_TYPE
*GuidHob
;
332 mPcdDatabase
= AllocateZeroPool (sizeof(PCD_DATABASE
));
333 ASSERT (mPcdDatabase
!= NULL
);
335 GuidHob
= GetFirstGuidHob (&gPcdDataBaseHobGuid
);
337 if (GuidHob
!= NULL
) {
340 // We will copy over the PEI phase's PCD Database.
342 // If no PEIMs use dynamic Pcd Entry, the Pcd Service PEIM
343 // should not be included at all. So the GuidHob could
344 // be NULL. If it is NULL, we just copy over the DXE Default
345 // Value to PCD Database.
348 PeiDatabase
= (PEI_PCD_DATABASE
*) GET_GUID_HOB_DATA (GuidHob
);
350 // Copy PCD Entries refereneced in PEI phase to PCD DATABASE
352 CopyMem (&mPcdDatabase
->PeiDb
, PeiDatabase
, sizeof (PEI_PCD_DATABASE
));
356 // Copy PCD Entries with default value to PCD DATABASE
358 CopyMem (&mPcdDatabase
->DxeDb
.Init
, &gDXEPcdDbInit
, sizeof(DXE_PCD_DATABASE_INIT
));
362 // Initialized the Callback Function Table
365 if (PCD_TOTAL_TOKEN_NUMBER
!= 0) {
366 mCallbackFnTable
= AllocateZeroPool (PCD_TOTAL_TOKEN_NUMBER
* sizeof (LIST_ENTRY
));
369 for (Idx
= 0; Idx
< PCD_TOTAL_TOKEN_NUMBER
; Idx
++) {
370 InitializeListHead (&mCallbackFnTable
[Idx
]);
380 IN EFI_GUID
*VariableGuid
,
381 IN UINT16
*VariableName
,
382 OUT UINT8
**VariableData
,
383 OUT UINTN
*VariableSize
393 Status
= EfiGetVariable (
394 (UINT16
*)VariableName
,
401 if (Status
== EFI_BUFFER_TOO_SMALL
) {
402 Buffer
= (UINT8
*) AllocatePool (Size
);
404 ASSERT (Buffer
!= NULL
);
406 Status
= EfiGetVariable (
414 ASSERT (Status
== EFI_SUCCESS
);
415 *VariableData
= Buffer
;
416 *VariableSize
= Size
;
424 GetSkuEnabledTokenNumber (
425 UINT32 LocalTokenNumber
,
434 SKU_ID
*PhaseSkuIdTable
;
437 ASSERT ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0);
439 PcdDb
= IsPeiDb
? (UINT8
*) &mPcdDatabase
->PeiDb
: (UINT8
*) &mPcdDatabase
->DxeDb
;
441 SkuHead
= (SKU_HEAD
*) (PcdDb
+ (LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
));
442 Value
= (UINT8
*) (PcdDb
+ SkuHead
->SkuDataStartOffset
);
444 PhaseSkuIdTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.SkuIdTable
:
445 mPcdDatabase
->DxeDb
.Init
.SkuIdTable
;
447 SkuIdTable
= &PhaseSkuIdTable
[SkuHead
->SkuIdTableOffset
];
449 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
450 if (mPcdDatabase
->PeiDb
.Init
.SystemSkuId
== SkuIdTable
[i
+ 1]) {
454 ASSERT (i
< SkuIdTable
[0]);
456 switch (LocalTokenNumber
& PCD_TYPE_ALL_SET
) {
458 Value
= (UINT8
*) &(((VPD_HEAD
*) Value
)[i
]);
459 return (UINT32
) ((Value
- PcdDb
) | PCD_TYPE_VPD
);
462 Value
= (UINT8
*) &(((VARIABLE_HEAD
*) Value
)[i
]);
463 return (UINT32
) ((Value
- PcdDb
) | PCD_TYPE_HII
);
465 case PCD_TYPE_STRING
:
466 Value
= (UINT8
*) &(((STRING_HEAD
*) Value
)[i
]);
467 return (UINT32
) ((Value
- PcdDb
) | PCD_TYPE_STRING
);
471 return (UINT32
) (Value
- PcdDb
);
488 InvokeCallbackOnSet (
489 UINT32 ExTokenNumber
,
490 CONST EFI_GUID
*Guid
, OPTIONAL
496 CALLBACK_FN_ENTRY
*FnTableEntry
;
497 LIST_ENTRY
*ListHead
;
498 LIST_ENTRY
*ListNode
;
501 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
502 // We have to decrement TokenNumber by 1 to make it usable
503 // as the array index.
507 ListHead
= &mCallbackFnTable
[TokenNumber
];
508 ListNode
= GetFirstNode (ListHead
);
510 while (ListNode
!= ListHead
) {
511 FnTableEntry
= CR_FNENTRY_FROM_LISTNODE(ListNode
, CALLBACK_FN_ENTRY
, Node
);
513 FnTableEntry
->CallbackFn(Guid
,
514 (Guid
== NULL
) ? TokenNumber
: ExTokenNumber
,
518 ListNode
= GetNextNode (ListHead
, ListNode
);
527 IN UINTN TokenNumber
,
532 return SetWorker (TokenNumber
, Data
, &Size
, FALSE
);
538 IN UINTN TokenNumber
,
544 UINT32
*LocalTokenNumberTable
;
546 UINT32 LocalTokenNumber
;
551 UINTN VariableOffset
;
553 VARIABLE_HEAD
*VariableHead
;
558 UINTN TmpTokenNumber
;
561 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
562 // We have to decrement TokenNumber by 1 to make it usable
563 // as the array index.
567 TmpTokenNumber
= TokenNumber
;
569 ASSERT (TokenNumber
< PCD_TOTAL_TOKEN_NUMBER
);
572 ASSERT (*Size
== DxePcdGetSize (TokenNumber
+ 1));
575 IsPeiDb
= (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
) ? TRUE
: FALSE
;
577 LocalTokenNumberTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
:
578 mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
580 if ((TokenNumber
< PEI_NEX_TOKEN_NUMBER
) ||
581 (TokenNumber
>= PEI_LOCAL_TOKEN_NUMBER
|| TokenNumber
< (PEI_LOCAL_TOKEN_NUMBER
+ DXE_NEX_TOKEN_NUMBER
))) {
582 InvokeCallbackOnSet (0, NULL
, TokenNumber
+ 1, Data
, *Size
);
585 TokenNumber
= IsPeiDb
? TokenNumber
586 : TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
;
588 LocalTokenNumber
= LocalTokenNumberTable
[TokenNumber
];
590 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == PCD_TYPE_SKU_ENABLED
) {
592 GetPtrTypeSize (TmpTokenNumber
, &MaxSize
);
596 LocalTokenNumber
= GetSkuEnabledTokenNumber (LocalTokenNumber
& ~PCD_TYPE_SKU_ENABLED
, MaxSize
, IsPeiDb
);
599 Offset
= LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
;
601 PcdDb
= IsPeiDb
? ((UINT8
*) &mPcdDatabase
->PeiDb
) : ((UINT8
*) &mPcdDatabase
->DxeDb
);
603 StringTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.StringTable
:
604 mPcdDatabase
->DxeDb
.Init
.StringTable
;
606 InternalData
= PcdDb
+ Offset
;
608 switch (LocalTokenNumber
& PCD_TYPE_ALL_SET
) {
611 return EFI_INVALID_PARAMETER
;
613 case PCD_TYPE_STRING
:
614 if (SetPtrTypeSize (TokenNumber
, Size
)) {
615 CopyMem (&StringTable
[*((UINT16
*)InternalData
)], Data
, *Size
);
618 return EFI_INVALID_PARAMETER
;
623 if (!SetPtrTypeSize (TokenNumber
, Size
)) {
624 return EFI_INVALID_PARAMETER
;
628 GuidTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.GuidTable
:
629 mPcdDatabase
->DxeDb
.Init
.GuidTable
;
631 VariableHead
= (VARIABLE_HEAD
*) (PcdDb
+ Offset
);
633 Guid
= &(GuidTable
[VariableHead
->GuidTableIndex
]);
634 Name
= &(StringTable
[VariableHead
->StringIndex
]);
635 VariableOffset
= VariableHead
->Offset
;
637 Status
= SetHiiVariable (Guid
, Name
, Data
, *Size
, VariableOffset
);
639 if (EFI_NOT_FOUND
== Status
) {
640 CopyMem (PcdDb
+ VariableHead
->DefaultValueOffset
, Data
, *Size
);
647 // Bug Bug: Please implement this
652 if (SetPtrTypeSize (TokenNumber
, Size
)) {
653 CopyMem (InternalData
, Data
, *Size
);
656 return EFI_INVALID_PARAMETER
;
662 *((UINT8
*) InternalData
) = *((UINT8
*) Data
);
666 *((UINT16
*) InternalData
) = *((UINT16
*) Data
);
670 *((UINT32
*) InternalData
) = *((UINT32
*) Data
);
674 *((UINT64
*) InternalData
) = *((UINT64
*) Data
);
679 return EFI_NOT_FOUND
;
688 return EFI_NOT_FOUND
;
697 IN CONST EFI_GUID
*Guid
,
698 IN UINTN ExTokenNumber
,
702 return GetWorker(GetExPcdTokenNumber (Guid
, (UINT32
) ExTokenNumber
), GetSize
);
710 IN UINTN ExTokenNumber
,
711 IN CONST EFI_GUID
*Guid
,
716 return ExSetWorker (ExTokenNumber
, Guid
, Data
, &SetSize
, FALSE
);
722 IN UINTN ExTokenNumber
,
723 IN CONST EFI_GUID
*Guid
,
725 IN OUT UINTN
*SetSize
,
731 TokenNumber
= GetExPcdTokenNumber (Guid
, (UINT32
) ExTokenNumber
);
733 InvokeCallbackOnSet ((UINT32
) ExTokenNumber
, Guid
, TokenNumber
, Data
, *SetSize
);
735 return SetWorker (TokenNumber
, Data
, SetSize
, PtrType
);
744 IN EFI_GUID
*VariableGuid
,
745 IN UINT16
*VariableName
,
758 Status
= EfiGetVariable (
759 (UINT16
*)VariableName
,
766 if (Status
== EFI_BUFFER_TOO_SMALL
) {
768 Buffer
= AllocatePool (Size
);
770 ASSERT (Buffer
!= NULL
);
772 Status
= EfiGetVariable (
780 ASSERT_EFI_ERROR (Status
);
782 CopyMem ((UINT8
*)Buffer
+ Offset
, Data
, DataSize
);
784 Status
= EfiSetVariable (
798 // If we drop to here, we don't have a Variable entry in
799 // the variable service yet. So, we will save the data
800 // in the PCD Database's volatile area.
810 GetExPcdTokenNumber (
811 IN CONST EFI_GUID
*Guid
,
812 IN UINT32 ExTokenNumber
816 DYNAMICEX_MAPPING
*ExMap
;
821 if (!PEI_DATABASE_EMPTY
) {
822 ExMap
= mPcdDatabase
->PeiDb
.Init
.ExMapTable
;
823 GuidTable
= mPcdDatabase
->PeiDb
.Init
.GuidTable
;
825 MatchGuid
= ScanGuid (GuidTable
, sizeof(mPcdDatabase
->PeiDb
.Init
.GuidTable
), Guid
);
827 if (MatchGuid
!= NULL
) {
829 MatchGuidIdx
= MatchGuid
- GuidTable
;
831 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
832 if ((ExTokenNumber
== ExMap
[i
].ExTokenNumber
) &&
833 (MatchGuidIdx
== ExMap
[i
].ExGuidIndex
)) {
834 return ExMap
[i
].LocalTokenNumber
;
841 ExMap
= mPcdDatabase
->DxeDb
.Init
.ExMapTable
;
842 GuidTable
= mPcdDatabase
->DxeDb
.Init
.GuidTable
;
844 MatchGuid
= ScanGuid (GuidTable
, sizeof(mPcdDatabase
->DxeDb
.Init
.GuidTable
), Guid
);
846 // We need to ASSERT here. If GUID can't be found in GuidTable, this is a
847 // error in the BUILD system.
849 ASSERT (MatchGuid
!= NULL
);
851 MatchGuidIdx
= MatchGuid
- GuidTable
;
853 for (i
= 0; i
< DXE_EXMAPPING_TABLE_SIZE
; i
++) {
854 if ((ExTokenNumber
== ExMap
[i
].ExTokenNumber
) &&
855 (MatchGuidIdx
== ExMap
[i
].ExGuidIndex
)) {
856 return ExMap
[i
].LocalTokenNumber
;
869 IN UINTN LocalTokenNumberTableIdx
,
874 UINTN LocalTokenNumber
;
878 LocalTokenNumber
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
[LocalTokenNumberTableIdx
];
879 Database
= (UINT8
*) &mPcdDatabase
->PeiDb
;
881 LocalTokenNumber
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
[LocalTokenNumberTableIdx
- PEI_LOCAL_TOKEN_NUMBER
];
882 Database
= (UINT8
*) &mPcdDatabase
->DxeDb
;
885 ASSERT ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) != 0);
887 SkuHead
= (SKU_HEAD
*) ((UINT8
*)Database
+ (LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
));
889 return (SKU_ID
*) (Database
+ SkuHead
->SkuIdTableOffset
);
897 IN UINTN LocalTokenNumberTableIdx
,
898 IN UINT32
*LocalTokenNumberTable
,
904 UINTN LocalTokenNumber
;
909 for (i
=0; i
<LocalTokenNumberTableIdx
; i
++) {
910 LocalTokenNumber
= LocalTokenNumberTable
[i
];
912 if ((LocalTokenNumber
& PCD_DATUM_TYPE_ALL_SET
) == PCD_DATUM_TYPE_POINTER
) {
914 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
917 if (LocalTokenNumber
& PCD_TYPE_VPD
) {
919 // We have only one entry for VPD enabled PCD entry:
921 // We consider current size is equal to MAX size.
925 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0) {
927 // We have only two entry for Non-Sku enabled PCD entry:
934 // We have these entry for SKU enabled PCD entry
936 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
938 SkuIdTable
= GetSkuIdArray (i
, IsPeiDb
);
939 SizeTableIdx
+= (UINTN
)*SkuIdTable
+ 1;
954 IN UINTN LocalTokenNumberTableIdx
,
958 UINT32
*LocalTokenNumberTable
;
961 LocalTokenNumberTable
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
;
963 LocalTokenNumberTable
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
965 return GetSizeTableIndexA (LocalTokenNumberTableIdx
,
966 LocalTokenNumberTable
,
974 IN UINTN LocalTokenNumberTableIdx
,
979 UINTN LocalTokenNumber
;
981 SIZE_INFO
*SizeTable
;
984 UINT32
*LocalTokenNumberTable
;
986 IsPeiDb
= (BOOLEAN
) (LocalTokenNumberTableIdx
< PEI_LOCAL_TOKEN_NUMBER
);
990 LocalTokenNumberTable
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
;
991 SizeTable
= mPcdDatabase
->PeiDb
.Init
.SizeTable
;
993 LocalTokenNumberTableIdx
-= PEI_LOCAL_TOKEN_NUMBER
;
994 LocalTokenNumberTable
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
995 SizeTable
= mPcdDatabase
->DxeDb
.Init
.SizeTable
;
998 LocalTokenNumber
= LocalTokenNumberTable
[LocalTokenNumberTableIdx
];
1000 ASSERT ((LocalTokenNumber
& PCD_DATUM_TYPE_ALL_SET
) == PCD_DATUM_TYPE_POINTER
);
1002 SizeTableIdx
= GetSizeTableIndex (LocalTokenNumberTableIdx
, IsPeiDb
);
1004 *MaxSize
= SizeTable
[SizeTableIdx
];
1006 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
1009 if (LocalTokenNumber
& PCD_TYPE_VPD
) {
1011 // We have only one entry for VPD enabled PCD entry:
1013 // We consider current size is equal to MAX size.
1017 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0) {
1019 // We have only two entry for Non-Sku enabled PCD entry:
1023 return SizeTable
[SizeTableIdx
+ 1];
1026 // We have these entry for SKU enabled PCD entry
1028 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
1030 SkuIdTable
= GetSkuIdArray (LocalTokenNumberTableIdx
, IsPeiDb
);
1031 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
1032 if (SkuIdTable
[1 + i
] == mPcdDatabase
->PeiDb
.Init
.SystemSkuId
) {
1033 return SizeTable
[SizeTableIdx
+ 1 + i
];
1036 return SizeTable
[SizeTableIdx
+ 1];
1045 IN UINTN LocalTokenNumberTableIdx
,
1046 IN OUT UINTN
*CurrentSize
1050 UINTN LocalTokenNumber
;
1052 SIZE_INFO
*SizeTable
;
1056 UINT32
*LocalTokenNumberTable
;
1058 IsPeiDb
= (BOOLEAN
) (LocalTokenNumberTableIdx
< PEI_LOCAL_TOKEN_NUMBER
);
1061 LocalTokenNumberTable
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
;
1062 SizeTable
= mPcdDatabase
->PeiDb
.Init
.SizeTable
;
1064 LocalTokenNumberTableIdx
-= PEI_LOCAL_TOKEN_NUMBER
;
1065 LocalTokenNumberTable
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
1066 SizeTable
= mPcdDatabase
->DxeDb
.Init
.SizeTable
;
1069 LocalTokenNumber
= LocalTokenNumberTable
[LocalTokenNumberTableIdx
];
1071 ASSERT ((LocalTokenNumber
& PCD_DATUM_TYPE_ALL_SET
) == PCD_DATUM_TYPE_POINTER
);
1073 SizeTableIdx
= GetSizeTableIndex (LocalTokenNumberTableIdx
, IsPeiDb
);
1075 MaxSize
= SizeTable
[SizeTableIdx
];
1077 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
1080 if (LocalTokenNumber
& PCD_TYPE_VPD
) {
1082 // We shouldn't come here as we don't support SET for VPD
1087 if ((*CurrentSize
> MaxSize
) ||
1088 (*CurrentSize
== MAX_ADDRESS
)) {
1089 *CurrentSize
= MaxSize
;
1093 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0) {
1095 // We have only two entry for Non-Sku enabled PCD entry:
1099 SizeTable
[SizeTableIdx
+ 1] = (SIZE_INFO
) *CurrentSize
;
1103 // We have these entry for SKU enabled PCD entry
1105 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
1107 SkuIdTable
= GetSkuIdArray (LocalTokenNumberTableIdx
, IsPeiDb
);
1108 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
1109 if (SkuIdTable
[1 + i
] == mPcdDatabase
->PeiDb
.Init
.SystemSkuId
) {
1110 SizeTable
[SizeTableIdx
+ 1 + i
] = (SIZE_INFO
) *CurrentSize
;
1114 SizeTable
[SizeTableIdx
+ 1] = (SIZE_INFO
) *CurrentSize
;