2 Private functions used by PCD PEIM.
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 PEI_PCD_DB_INIT_VALUE in Autogen.h
23 /* PEI_PCD_DATABASE_INIT
33 The function registers the CallBackOnSet fucntion
34 according to TokenNumber and EFI_GUID space.
36 @param[in] TokenNumber The token number.
37 @param[in] Guid The GUID space.
38 @param[in] CallBackFunction The Callback function to be registered.
40 @retval EFI_SUCCESS If the Callback function is registered.
41 @retval EFI_NOT_FOUND If the PCD Entry is not found according to Token Number and GUID space.
44 PeiRegisterCallBackWorker (
45 IN UINTN ExTokenNumber
,
46 IN CONST EFI_GUID
*Guid
, OPTIONAL
47 IN PCD_PPI_CALLBACK CallBackFunction
,
51 EFI_HOB_GUID_TYPE
*GuidHob
;
52 PCD_PPI_CALLBACK
*CallbackTable
;
53 PCD_PPI_CALLBACK Compare
;
54 PCD_PPI_CALLBACK Assign
;
55 UINT32 LocalTokenNumber
;
58 EX_PCD_ENTRY_ATTRIBUTE Attr
;
61 TokenNumber
= ExTokenNumber
;
62 ASSERT (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
);
63 LocalTokenNumber
= GetPcdDatabase()->Init
.LocalTokenNumberTable
[TokenNumber
];
65 GetExPcdTokenAttributes (Guid
, ExTokenNumber
, &Attr
);
66 TokenNumber
= Attr
.TokenNumber
;
67 LocalTokenNumber
= Attr
.LocalTokenNumberAlias
;
70 ASSERT ((LocalTokenNumber
& PCD_TYPE_HII
) == 0);
71 ASSERT ((LocalTokenNumber
& PCD_TYPE_VPD
) == 0);
73 GuidHob
= GetFirstGuidHob (&gPcdPeiCallbackFnTableHobGuid
);
74 ASSERT (GuidHob
!= NULL
);
76 CallbackTable
= GET_GUID_HOB_DATA (GuidHob
);
78 Compare
= Register
? NULL
: CallBackFunction
;
79 Assign
= Register
? CallBackFunction
: NULL
;
81 for (Idx
= 0; Idx
< FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry
); Idx
++) {
82 if (CallbackTable
[Idx
] == Compare
) {
83 CallbackTable
[Idx
] = Assign
;
88 return Register
? EFI_OUT_OF_RESOURCES
: EFI_NOT_FOUND
;
96 The function builds the PCD database based on the
97 PCD_IMAGE on the flash.
99 @param[in] PcdImageOnFlash The PCD image on flash.
108 PEI_PCD_DATABASE
*Database
;
109 VOID
*CallbackFnTable
;
110 UINTN SizeOfCallbackFnTable
;
112 Database
= BuildGuidHob (&gPcdDataBaseHobGuid
, sizeof (PEI_PCD_DATABASE
));
114 ZeroMem (Database
, sizeof (PEI_PCD_DATABASE
));
117 // gPEIPcdDbInit is smaller than PEI_PCD_DATABASE
120 CopyMem (&Database
->Init
, &gPEIPcdDbInit
, sizeof (gPEIPcdDbInit
));
122 SizeOfCallbackFnTable
= PEI_LOCAL_TOKEN_NUMBER
* sizeof (PCD_PPI_CALLBACK
) * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry
);
124 CallbackFnTable
= BuildGuidHob (&gPcdPeiCallbackFnTableHobGuid
, SizeOfCallbackFnTable
);
126 ZeroMem (CallbackFnTable
, SizeOfCallbackFnTable
);
134 The function is provided by PCD PEIM and PCD DXE driver to
135 do the work of reading a HII variable from variable service.
137 @param[in] VariableGuid The Variable GUID.
138 @param[in] VariableName The Variable Name.
139 @param[out] VariableData The output data.
140 @param[out] VariableSize The size of the variable.
142 @retval EFI_SUCCESS Operation successful.
143 @retval EFI_SUCCESS Variablel not found.
147 IN CONST EFI_GUID
*VariableGuid
,
148 IN UINT16
*VariableName
,
149 OUT VOID
**VariableData
,
150 OUT UINTN
*VariableSize
156 EFI_PEI_READ_ONLY_VARIABLE_PPI
*VariablePpi
;
158 Status
= PeiCoreLocatePpi (&gEfiPeiReadOnlyVariablePpiGuid
, 0, NULL
, &VariablePpi
);
159 ASSERT_EFI_ERROR (Status
);
163 Status
= VariablePpi
->PeiGetVariable (
164 GetPeiServicesTablePointer (),
166 (EFI_GUID
*) VariableGuid
,
171 ASSERT (Status
== EFI_BUFFER_TOO_SMALL
);
173 Status
= PeiCoreAllocatePool (Size
, &Buffer
);
174 ASSERT_EFI_ERROR (Status
);
176 // declare a local for STP.
178 Status
= VariablePpi
->PeiGetVariable (
179 GetPeiServicesTablePointer (),
180 (UINT16
*) VariableName
,
181 (EFI_GUID
*) VariableGuid
,
186 ASSERT_EFI_ERROR (Status
);
188 *VariableSize
= Size
;
189 *VariableData
= Buffer
;
196 GetSkuEnabledTokenNumber (
197 UINT32 LocalTokenNumber
,
201 PEI_PCD_DATABASE
*PeiPcdDb
;
207 PeiPcdDb
= GetPcdDatabase ();
209 ASSERT ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0);
211 SkuHead
= (SKU_HEAD
*) ((UINT8
*)PeiPcdDb
+ (LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
));
212 Value
= (UINT8
*) ((UINT8
*)PeiPcdDb
+ (SkuHead
->SkuDataStartOffset
));
213 SkuIdTable
= (SKU_ID
*) ((UINT8
*)PeiPcdDb
+ (SkuHead
->SkuIdTableOffset
));
215 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
216 if (PeiPcdDb
->Init
.SystemSkuId
== SkuIdTable
[i
+ 1]) {
221 switch (LocalTokenNumber
& ~PCD_DATABASE_OFFSET_MASK
) {
223 Value
+= sizeof(VPD_HEAD
) * i
;
224 return ((Value
- (UINT8
*) PeiPcdDb
) | PCD_TYPE_VPD
);
227 Value
+= sizeof(VARIABLE_HEAD
) * i
;
228 return ((Value
- (UINT8
*) PeiPcdDb
) | PCD_TYPE_HII
);
230 case 0: //Change to a MACRO PCD_TYPE_DATA
232 return (Value
- (UINT8
*) PeiPcdDb
);
248 InvokeCallbackOnSet (
249 UINT32 ExTokenNumber
,
250 CONST EFI_GUID
*Guid
, OPTIONAL
256 EFI_HOB_GUID_TYPE
*GuidHob
;
257 PCD_PPI_CALLBACK
*CallbackTable
;
261 ASSERT (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
);
263 GuidHob
= GetFirstGuidHob (&gPcdPeiCallbackFnTableHobGuid
);
264 ASSERT (GuidHob
!= NULL
);
266 CallbackTable
= GET_GUID_HOB_DATA (GuidHob
);
268 CallbackTable
+= (TokenNumber
* FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry
));
270 for (Idx
= 0; Idx
< FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry
); Idx
++) {
271 if (CallbackTable
[Idx
] != NULL
) {
272 CallbackTable
[Idx
] (Guid
,
273 (Guid
== NULL
)? TokenNumber
: ExTokenNumber
,
290 UINT32 LocalTokenNumber
;
291 PEI_PCD_DATABASE
*PeiPcdDb
;
293 ASSERT (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
);
295 PeiPcdDb
= GetPcdDatabase ();
297 LocalTokenNumber
= PeiPcdDb
->Init
.LocalTokenNumberTable
[TokenNumber
];
300 ASSERT (PeiPcdDb
->Init
.SizeTable
[TokenNumber
] >= Size
);
302 ASSERT (PeiPcdDb
->Init
.SizeTable
[TokenNumber
] == Size
);
305 InvokeCallbackOnSet (0, NULL
, TokenNumber
, Data
, Size
);
307 return SetWorkerByLocalTokenNumber (LocalTokenNumber
, Data
, Size
, PtrType
);
316 IN UINT32 ExTokenNumber
,
317 IN CONST EFI_GUID
*Guid
,
323 PEI_PCD_DATABASE
*PeiPcdDb
;
324 EX_PCD_ENTRY_ATTRIBUTE Attr
;
327 PeiPcdDb
= GetPcdDatabase ();
329 GetExPcdTokenAttributes (Guid
, ExTokenNumber
, &Attr
);
331 ASSERT (!PtrType
&& Attr
.Size
);
333 ASSERT (PtrType
&& Attr
.Size
>= Size
);
335 InvokeCallbackOnSet (ExTokenNumber
, Guid
, Attr
.TokenNumber
, Data
, Size
);
337 SetWorkerByLocalTokenNumber (Attr
.LocalTokenNumberAlias
, Data
, Size
, PtrType
);
347 SetWorkerByLocalTokenNumber (
348 UINT32 LocalTokenNumber
,
354 PEI_PCD_DATABASE
*PeiPcdDb
;
356 UINT16 StringTableIdx
;
361 PeiPcdDb
= GetPcdDatabase ();
362 PeiPcdDbRaw
= (UINT8
*) PeiPcdDb
;
364 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == PCD_TYPE_SKU_ENABLED
) {
365 LocalTokenNumber
= GetSkuEnabledTokenNumber (LocalTokenNumber
& ~PCD_TYPE_SKU_ENABLED
, Size
);
368 Offset
= LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
;
369 InternalData
= (VOID
*) (PeiPcdDbRaw
+ Offset
);
371 switch (LocalTokenNumber
& ~PCD_DATABASE_OFFSET_MASK
) {
376 return EFI_INVALID_PARAMETER
;
379 case PCD_TYPE_STRING
:
380 StringTableIdx
= *((UINT16
*)InternalData
);
381 CopyMem (&PeiPcdDb
->Init
.StringTable
[StringTableIdx
], Data
, Size
);
388 CopyMem (InternalData
, Data
, Size
);
394 *((UINT8
*) InternalData
) = *((UINT8
*) Data
);
398 *((UINT16
*) InternalData
) = *((UINT16
*) Data
);
402 *((UINT32
*) InternalData
) = *((UINT32
*) Data
);
406 *((UINT64
*) InternalData
) = *((UINT64
*) Data
);
411 return EFI_NOT_FOUND
;
418 return EFI_NOT_FOUND
;
423 GetWorkerByLocalTokenNumber (
424 PEI_PCD_DATABASE
*PeiPcdDb
,
425 UINT32 LocalTokenNumber
,
432 VARIABLE_HEAD
*VariableHead
;
437 UINT16 StringTableIdx
;
439 PeiPcdDb
= GetPcdDatabase ();
441 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == PCD_TYPE_SKU_ENABLED
) {
442 LocalTokenNumber
= GetSkuEnabledTokenNumber (LocalTokenNumber
& ~PCD_TYPE_SKU_ENABLED
, Size
);
445 Offset
= LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
;
446 StringTable
= PeiPcdDb
->Init
.StringTable
;
448 switch (LocalTokenNumber
& ~PCD_DATABASE_OFFSET_MASK
) {
452 VpdHead
= (VPD_HEAD
*) ((UINT8
*)PeiPcdDb
+ Offset
);
453 return (VOID
*) (FixedPcdGet32(PcdVpdBaseAddress
) + VpdHead
->Offset
);
458 VariableHead
= (VARIABLE_HEAD
*) ((UINT8
*)PeiPcdDb
+ Offset
);
460 Guid
= &(PeiPcdDb
->Init
.GuidTable
[VariableHead
->GuidTableIndex
]);
461 Name
= &StringTable
[VariableHead
->StringIndex
];
463 Status
= GetHiiVariable (Guid
, Name
, &Data
, &DataSize
);
464 ASSERT_EFI_ERROR (Status
);
465 ASSERT (DataSize
>= (UINTN
) (VariableHead
->Offset
+ Size
));
467 return (VOID
*) ((UINT8
*) Data
+ VariableHead
->Offset
);
471 return (VOID
*) ((UINT8
*)PeiPcdDb
+ Offset
);
474 case PCD_TYPE_STRING
:
475 StringTableIdx
= (UINT16
) *((UINT8
*) PeiPcdDb
+ Offset
);
476 return (VOID
*) (&StringTable
[StringTableIdx
]);
493 IN CONST EFI_GUID
*Guid
,
494 IN UINT32 ExTokenNumber
,
498 EX_PCD_ENTRY_ATTRIBUTE Attr
;
500 GetExPcdTokenAttributes (Guid
, ExTokenNumber
, &Attr
);
502 ASSERT ((GetSize
== Attr
.Size
) || (GetSize
== 0));
504 return GetWorkerByLocalTokenNumber (GetPcdDatabase(),
505 Attr
.LocalTokenNumberAlias
,
516 PEI_PCD_DATABASE
*PeiPcdDb
;
518 ASSERT (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
);
520 ASSERT (GetSize
== PeiPcdGetSize (TokenNumber
) || GetSize
== 0);
522 PeiPcdDb
= GetPcdDatabase ();
524 return GetWorkerByLocalTokenNumber (PeiPcdDb
, PeiPcdDb
->Init
.LocalTokenNumberTable
[TokenNumber
], GetSize
);
529 GetExPcdTokenAttributes (
530 IN CONST EFI_GUID
*Guid
,
531 IN UINT32 ExTokenNumber
,
532 OUT EX_PCD_ENTRY_ATTRIBUTE
*ExAttr
536 DYNAMICEX_MAPPING
*ExMap
;
538 PEI_PCD_DATABASE
*PeiPcdDb
;
540 PeiPcdDb
= GetPcdDatabase();
542 ExMap
= PeiPcdDb
->Init
.ExMapTable
;
543 GuidTable
= PeiPcdDb
->Init
.GuidTable
;
545 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
546 if ((ExTokenNumber
== ExMap
[i
].ExTokenNumber
) &&
547 CompareGuid (Guid
, (CONST EFI_GUID
*) &GuidTable
[ExMap
[i
].ExGuidIndex
])) {
548 ExAttr
->TokenNumber
= i
+ PEI_NEX_TOKEN_NUMBER
;
549 ExAttr
->Size
= PeiPcdDb
->Init
.SizeTable
[i
+ PEI_NEX_TOKEN_NUMBER
];
550 ExAttr
->LocalTokenNumberAlias
= ExMap
[i
].LocalTokenNumber
;
566 EFI_HOB_GUID_TYPE
*GuidHob
;
568 GuidHob
= GetFirstGuidHob (&gPcdDataBaseHobGuid
);
569 ASSERT (GuidHob
!= NULL
);
571 return (PEI_PCD_DATABASE
*) GET_GUID_HOB_DATA (GuidHob
);