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.
26 DXE_PCD_DATABASE_INIT gDXEPcdDbInit = {
31 PCD_DATABASE
* gPcdDatabase
;
34 GetWorkerByLocalTokenNumber (
35 UINT32 LocalTokenNumber
,
45 VARIABLE_HEAD
*VariableHead
;
51 UINT16 StringTableIdx
;
53 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == PCD_TYPE_SKU_ENABLED
) {
54 LocalTokenNumber
= GetSkuEnabledTokenNumber (LocalTokenNumber
& ~PCD_TYPE_SKU_ENABLED
, Size
, IsPeiDb
);
57 PcdDb
= IsPeiDb
? ((UINT8
*) &gPcdDatabase
->PeiDb
) : ((UINT8
*) &gPcdDatabase
->DxeDb
);
58 StringTable
= IsPeiDb
? gPcdDatabase
->PeiDb
.Init
.StringTable
:
59 gPcdDatabase
->DxeDb
.Init
.StringTable
;
61 Offset
= LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
;
63 switch (LocalTokenNumber
& ~PCD_DATABASE_OFFSET_MASK
) {
65 VpdHead
= (VPD_HEAD
*) ((UINT8
*) PcdDb
+ Offset
);
66 return (VOID
*) (FixedPcdGet32(PcdVpdBaseAddress
) + VpdHead
->Offset
);
69 GuidTable
= IsPeiDb
? gPcdDatabase
->PeiDb
.Init
.GuidTable
:
70 gPcdDatabase
->DxeDb
.Init
.GuidTable
;
72 VariableHead
= (VARIABLE_HEAD
*) (PcdDb
+ Offset
);
74 Guid
= &(GuidTable
[VariableHead
->GuidTableIndex
]);
75 Name
= &(StringTable
[VariableHead
->StringIndex
]);
77 Status
= GetHiiVariable (Guid
, Name
, &Data
, &DataSize
);
78 ASSERT_EFI_ERROR (Status
);
79 ASSERT (DataSize
>= (UINTN
) (VariableHead
->Offset
+ Size
));
81 return (UINT8
*) Data
+ VariableHead
->Offset
;
84 StringTableIdx
= (UINT16
) *((UINT8
*) PcdDb
+ Offset
);
85 return (VOID
*) &StringTable
[StringTableIdx
];
88 return (VOID
*) ((UINT8
*) PcdDb
+ Offset
);
107 UINT32
*LocalTokenNumberTable
;
111 ASSERT (TokenNumber
< PCD_TOTAL_TOKEN_NUMBER
);
113 IsPeiDb
= (TokenNumber
<= PEI_LOCAL_TOKEN_NUMBER
) ? TRUE
: FALSE
;
115 LocalTokenNumberTable
= IsPeiDb
? gPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
:
116 gPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
118 SizeTable
= IsPeiDb
? gPcdDatabase
->PeiDb
.Init
.SizeTable
:
119 gPcdDatabase
->DxeDb
.Init
.SizeTable
;
121 TokenNumber
= IsPeiDb
? TokenNumber
:
122 TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
;
123 return GetWorkerByLocalTokenNumber (LocalTokenNumberTable
[TokenNumber
], IsPeiDb
, SizeTable
[TokenNumber
]);
129 DxeRegisterCallBackWorker (
130 IN UINTN TokenNumber
,
131 IN CONST GUID
*Guid
, OPTIONAL
132 IN PCD_PROTOCOL_CALLBACK CallBackFunction
,
142 DxeGetNextTokenWorker (
143 IN OUT UINTN
*TokenNumber
,
144 IN CONST GUID
*Guid OPTIONAL
153 BuildPcdDxeDataBase (
157 PEI_PCD_DATABASE
*PeiDatabase
;
158 EFI_HOB_GUID_TYPE
*GuidHob
;
160 gPcdDatabase
= AllocateZeroPool (sizeof(PCD_DATABASE
));
161 ASSERT (gPcdDatabase
!= NULL
);
163 GuidHob
= GetFirstGuidHob (&gPcdDataBaseHobGuid
);
164 ASSERT (GuidHob
!= NULL
);
166 PeiDatabase
= (PEI_PCD_DATABASE
*) GET_GUID_HOB_DATA (GuidHob
);
168 // Copy PCD Entries refereneced in PEI phase to PCD DATABASE
170 CopyMem (&gPcdDatabase
->PeiDb
, PeiDatabase
, sizeof (PEI_PCD_DATABASE
));
173 // Copy PCD Entries with default value to PCD DATABASE
175 CopyMem (&gPcdDatabase
->DxeDb
.Init
, &gDXEPcdDbInit
, sizeof(DXE_PCD_DATABASE_INIT
));
184 IN EFI_GUID
*VariableGuid
,
185 IN UINT16
*VariableName
,
186 OUT VOID
** VariableData
,
187 OUT UINTN
*VariableSize
194 Status
= EfiGetVariable (
195 (UINT16
*)VariableName
,
201 ASSERT (Status
== EFI_BUFFER_TOO_SMALL
);
203 Buffer
= AllocatePool (Size
);
205 ASSERT (Buffer
!= NULL
);
207 Status
= EfiGetVariable (
221 GetSkuEnabledTokenNumber (
222 UINT32 LocalTokenNumber
,
231 SKU_ID
*PhaseSkuIdTable
;
234 ASSERT ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0);
236 PcdDb
= IsPeiDb
? (UINT8
*) &gPcdDatabase
->PeiDb
: (UINT8
*) &gPcdDatabase
->DxeDb
;
238 SkuHead
= (SKU_HEAD
*) (PcdDb
+ (LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
));
239 Value
= (UINT8
*) (PcdDb
+ SkuHead
->SkuDataStartOffset
);
241 PhaseSkuIdTable
= IsPeiDb
? gPcdDatabase
->PeiDb
.Init
.SkuIdTable
:
242 gPcdDatabase
->DxeDb
.Init
.SkuIdTable
;
244 SkuIdTable
= &PhaseSkuIdTable
[SkuHead
->SkuIdTableOffset
];
246 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
247 if (gPcdDatabase
->PeiDb
.Init
.SystemSkuId
== SkuIdTable
[i
+ 1]) {
251 ASSERT (i
< SkuIdTable
[0]);
253 switch (LocalTokenNumber
& ~PCD_DATABASE_OFFSET_MASK
) {
255 Value
= (UINT8
*) &(((VPD_HEAD
*) Value
)[i
]);
256 return ((Value
- PcdDb
) | PCD_TYPE_VPD
);
259 Value
= (UINT8
*) &(((VARIABLE_HEAD
*) Value
)[i
]);
260 return ((Value
- PcdDb
) | PCD_TYPE_HII
);
264 return (Value
- PcdDb
);
281 InvokeCallbackOnSet (
282 UINT32 ExTokenNumber
,
283 CONST EFI_GUID
*Guid
, OPTIONAL
303 UINT32
*LocalTokenNumberTable
;
307 ASSERT (TokenNumber
< PCD_TOTAL_TOKEN_NUMBER
);
310 ASSERT (Size
<= DxePcdGetSize (TokenNumber
));
312 ASSERT (Size
== DxePcdGetSize (TokenNumber
));
315 IsPeiDb
= (TokenNumber
<= PEI_LOCAL_TOKEN_NUMBER
) ? TRUE
: FALSE
;
317 LocalTokenNumberTable
= IsPeiDb
? gPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
:
318 gPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
320 TokenNumber
= IsPeiDb
? TokenNumber
321 : TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
;
323 InvokeCallbackOnSet (0, NULL
, TokenNumber
, Data
, Size
);
325 return SetWorkerByLocalTokenNumber (LocalTokenNumberTable
[TokenNumber
], Data
, Size
, PtrType
, IsPeiDb
);
335 IN CONST EFI_GUID
*Guid
,
336 IN UINTN ExTokenNumber
,
340 EX_PCD_ENTRY_ATTRIBUTE Attr
;
342 GetExPcdTokenAttributes (Guid
, ExTokenNumber
, &Attr
);
344 ASSERT ((GetSize
== Attr
.Size
) || (GetSize
== 0));
346 return GetWorkerByLocalTokenNumber (Attr
.LocalTokenNumberAlias
,
358 IN UINT32 ExTokenNumber
,
359 IN CONST EFI_GUID
*Guid
,
365 EX_PCD_ENTRY_ATTRIBUTE Attr
;
367 GetExPcdTokenAttributes (Guid
, ExTokenNumber
, &Attr
);
369 ASSERT (!PtrType
&& (SetSize
== Attr
.Size
));
371 ASSERT (PtrType
&& (SetSize
<= Attr
.Size
));
373 InvokeCallbackOnSet (ExTokenNumber
, Guid
, Attr
.TokenNumber
, Data
, Attr
.Size
);
375 SetWorkerByLocalTokenNumber (Attr
.LocalTokenNumberAlias
, Data
, Attr
.Size
, PtrType
, Attr
.IsPeiDb
);
385 SetWorkerByLocalTokenNumber (
386 UINT32 LocalTokenNumber
,
398 VARIABLE_HEAD
*VariableHead
;
403 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == PCD_TYPE_SKU_ENABLED
) {
404 LocalTokenNumber
= GetSkuEnabledTokenNumber (LocalTokenNumber
& ~PCD_TYPE_SKU_ENABLED
, Size
, IsPeiDb
);
407 Offset
= LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
;
409 PcdDb
= IsPeiDb
? ((UINT8
*) &gPcdDatabase
->PeiDb
) : ((UINT8
*) &gPcdDatabase
->DxeDb
);
411 StringTable
= IsPeiDb
? gPcdDatabase
->PeiDb
.Init
.StringTable
:
412 gPcdDatabase
->DxeDb
.Init
.StringTable
;
414 InternalData
= PcdDb
+ Offset
;
416 switch (LocalTokenNumber
& ~PCD_DATABASE_OFFSET_MASK
) {
419 return EFI_INVALID_PARAMETER
;
421 case PCD_TYPE_STRING
:
422 CopyMem (&StringTable
[*((UINT16
*)InternalData
)], Data
, Size
);
427 // Bug Bug: Please implement this
429 GuidTable
= IsPeiDb
? gPcdDatabase
->PeiDb
.Init
.GuidTable
:
430 gPcdDatabase
->DxeDb
.Init
.GuidTable
;
432 VariableHead
= (VARIABLE_HEAD
*) (PcdDb
+ Offset
);
434 Guid
= &(GuidTable
[VariableHead
->GuidTableIndex
]);
435 Name
= &(StringTable
[VariableHead
->StringIndex
]);
441 CopyMem (InternalData
, Data
, Size
);
447 *((UINT8
*) InternalData
) = *((UINT8
*) Data
);
451 *((UINT16
*) InternalData
) = *((UINT16
*) Data
);
455 *((UINT32
*) InternalData
) = *((UINT32
*) Data
);
459 *((UINT64
*) InternalData
) = *((UINT64
*) Data
);
464 return EFI_NOT_FOUND
;
473 return EFI_NOT_FOUND
;
480 IN EFI_GUID
*VariableGuid
,
481 IN UINT16
*VariableName
,
494 Status
= EfiGetVariable (
495 (UINT16
*)VariableName
,
502 ASSERT (Status
== EFI_BUFFER_TOO_SMALL
);
504 Buffer
= AllocatePool (Size
);
506 ASSERT (Buffer
!= NULL
);
508 Status
= EfiGetVariable (
517 CopyMem ((UINT8
*)Buffer
+ Offset
, Data
, DataSize
);
519 return EfiSetVariable (
534 GetExPcdTokenAttributes (
535 IN CONST EFI_GUID
*Guid
,
536 IN UINT32 ExTokenNumber
,
537 OUT EX_PCD_ENTRY_ATTRIBUTE
*ExAttr
541 DYNAMICEX_MAPPING
*ExMap
;
545 ExMap
= gPcdDatabase
->PeiDb
.Init
.ExMapTable
;
546 GuidTable
= gPcdDatabase
->PeiDb
.Init
.GuidTable
;
547 SizeTable
= gPcdDatabase
->PeiDb
.Init
.SizeTable
;
549 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
550 if ((ExTokenNumber
== ExMap
[i
].ExTokenNumber
) &&
551 CompareGuid (Guid
, (CONST EFI_GUID
*) &GuidTable
[ExMap
[i
].ExGuidIndex
])
554 ExAttr
->IsPeiDb
= TRUE
;
555 ExAttr
->Size
= SizeTable
[i
+ PEI_NEX_TOKEN_NUMBER
];
556 ExAttr
->TokenNumber
= i
+ PEI_NEX_TOKEN_NUMBER
;
557 ExAttr
->LocalTokenNumberAlias
= ExMap
[i
].LocalTokenNumber
;
563 ExMap
= gPcdDatabase
->DxeDb
.Init
.ExMapTable
;
564 GuidTable
= gPcdDatabase
->DxeDb
.Init
.GuidTable
;
565 SizeTable
= gPcdDatabase
->DxeDb
.Init
.SizeTable
;
567 for (i
= 0; i
< DXE_EXMAPPING_TABLE_SIZE
; i
++) {
568 if ((ExTokenNumber
== ExMap
[i
].ExTokenNumber
) &&
569 CompareGuid (Guid
, (CONST EFI_GUID
*) &GuidTable
[ExMap
[i
].ExGuidIndex
])
572 ExAttr
->IsPeiDb
= FALSE
;
573 ExAttr
->Size
= SizeTable
[i
+ DXE_NEX_TOKEN_NUMBER
];
574 ExAttr
->TokenNumber
= i
+ DXE_NEX_TOKEN_NUMBER
;
575 ExAttr
->LocalTokenNumberAlias
= ExMap
[i
].LocalTokenNumber
;