]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - EdkModulePkg/Universal/PCD/Dxe/Service.c
Revise XML Schema to be valid.
[mirror_edk2.git] / EdkModulePkg / Universal / PCD / Dxe / Service.c
... / ...
CommitLineData
1/** @file\r
2Private functions used by PCD DXE driver.s\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: Service.c\r
15\r
16**/\r
17#include "Service.h"\r
18\r
19\r
20//\r
21// Build Tool will generate DXE_PCD_DB_INIT_VALUE in Autogen.h\r
22// Compression Algorithm will take care of the size optimization.\r
23//\r
24\r
25/*\r
26DXE_PCD_DATABASE_INIT gDXEPcdDbInit = {\r
27 DXE_PCD_DB_INIT_VALUE\r
28};\r
29*/\r
30\r
31PCD_DATABASE * gPcdDatabase;\r
32\r
33VOID *\r
34GetWorkerByLocalTokenNumber (\r
35 UINT32 LocalTokenNumber,\r
36 BOOLEAN IsPeiDb,\r
37 UINTN Size\r
38 ) \r
39{\r
40 UINT32 Offset;\r
41 EFI_GUID *GuidTable;\r
42 UINT16 *StringTable;\r
43 EFI_GUID *Guid;\r
44 UINT16 *Name;\r
45 VARIABLE_HEAD *VariableHead;\r
46 EFI_STATUS Status;\r
47 UINTN DataSize;\r
48 VOID *Data;\r
49 VPD_HEAD *VpdHead;\r
50 UINT8 *PcdDb;\r
51 UINT16 StringTableIdx; \r
52\r
53 if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
54 LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size, IsPeiDb);\r
55 }\r
56\r
57 PcdDb = IsPeiDb ? ((UINT8 *) &gPcdDatabase->PeiDb) : ((UINT8 *) &gPcdDatabase->DxeDb);\r
58 StringTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.StringTable :\r
59 gPcdDatabase->DxeDb.Init.StringTable;\r
60 \r
61 Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
62 \r
63 switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
64 case PCD_TYPE_VPD:\r
65 VpdHead = (VPD_HEAD *) ((UINT8 *) PcdDb + Offset);\r
66 return (VOID *) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset);\r
67 \r
68 case PCD_TYPE_HII:\r
69 GuidTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.GuidTable :\r
70 gPcdDatabase->DxeDb.Init.GuidTable;\r
71 \r
72 VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);\r
73 \r
74 Guid = &(GuidTable[VariableHead->GuidTableIndex]);\r
75 Name = &(StringTable[VariableHead->StringIndex]);\r
76\r
77 Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
78 ASSERT_EFI_ERROR (Status);\r
79 ASSERT (DataSize >= (UINTN) (VariableHead->Offset + Size));\r
80\r
81 return (UINT8 *) Data + VariableHead->Offset;\r
82\r
83 case PCD_TYPE_STRING:\r
84 StringTableIdx = (UINT16) *((UINT8 *) PcdDb + Offset);\r
85 return (VOID *) &StringTable[StringTableIdx];\r
86\r
87 case PCD_TYPE_DATA:\r
88 return (VOID *) ((UINT8 *) PcdDb + Offset);\r
89 break;\r
90\r
91 default:\r
92 ASSERT (FALSE);\r
93 break;\r
94 \r
95 }\r
96\r
97 ASSERT (FALSE);\r
98 \r
99 return NULL;\r
100}\r
101 \r
102VOID *\r
103GetWorker (\r
104 UINTN TokenNumber\r
105 )\r
106{\r
107 UINT32 *LocalTokenNumberTable;\r
108 UINT16 *SizeTable;\r
109 BOOLEAN IsPeiDb;\r
110\r
111 ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER);\r
112 \r
113 IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;\r
114\r
115 LocalTokenNumberTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.LocalTokenNumberTable : \r
116 gPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
117\r
118 SizeTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.SizeTable: \r
119 gPcdDatabase->DxeDb.Init.SizeTable;\r
120\r
121 TokenNumber = IsPeiDb ? TokenNumber :\r
122 TokenNumber - PEI_LOCAL_TOKEN_NUMBER;\r
123 return GetWorkerByLocalTokenNumber (LocalTokenNumberTable[TokenNumber], IsPeiDb, SizeTable[TokenNumber]);\r
124}\r
125\r
126\r
127\r
128EFI_STATUS\r
129DxeRegisterCallBackWorker (\r
130 IN UINTN TokenNumber,\r
131 IN CONST GUID *Guid, OPTIONAL\r
132 IN PCD_PROTOCOL_CALLBACK CallBackFunction,\r
133 IN BOOLEAN Register\r
134)\r
135{\r
136 \r
137 return EFI_SUCCESS;\r
138}\r
139\r
140\r
141EFI_STATUS\r
142DxeGetNextTokenWorker (\r
143 IN OUT UINTN *TokenNumber,\r
144 IN CONST GUID *Guid OPTIONAL\r
145 )\r
146{\r
147 return EFI_SUCCESS;\r
148}\r
149\r
150\r
151\r
152VOID\r
153BuildPcdDxeDataBase (\r
154 VOID\r
155)\r
156{\r
157 PEI_PCD_DATABASE *PeiDatabase;\r
158 EFI_HOB_GUID_TYPE *GuidHob;\r
159\r
160 gPcdDatabase = AllocateZeroPool (sizeof(PCD_DATABASE));\r
161 ASSERT (gPcdDatabase != NULL);\r
162\r
163 GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
164 ASSERT (GuidHob != NULL);\r
165\r
166 PeiDatabase = (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
167 //\r
168 // Copy PCD Entries refereneced in PEI phase to PCD DATABASE\r
169 //\r
170 CopyMem (&gPcdDatabase->PeiDb, PeiDatabase, sizeof (PEI_PCD_DATABASE));\r
171\r
172 //\r
173 // Copy PCD Entries with default value to PCD DATABASE\r
174 //\r
175 CopyMem (&gPcdDatabase->DxeDb.Init, &gDXEPcdDbInit, sizeof(DXE_PCD_DATABASE_INIT));\r
176 \r
177 return;\r
178}\r
179\r
180\r
181\r
182EFI_STATUS\r
183GetHiiVariable (\r
184 IN EFI_GUID *VariableGuid,\r
185 IN UINT16 *VariableName,\r
186 OUT VOID ** VariableData,\r
187 OUT UINTN *VariableSize\r
188 )\r
189{\r
190 UINTN Size;\r
191 EFI_STATUS Status;\r
192 VOID *Buffer;\r
193\r
194 Status = EfiGetVariable (\r
195 (UINT16 *)VariableName,\r
196 VariableGuid,\r
197 NULL,\r
198 &Size,\r
199 NULL\r
200 );\r
201 ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
202\r
203 Buffer = AllocatePool (Size);\r
204\r
205 ASSERT (Buffer != NULL);\r
206\r
207 Status = EfiGetVariable (\r
208 VariableName,\r
209 VariableGuid,\r
210 NULL,\r
211 &Size,\r
212 Buffer\r
213 );\r
214\r
215 return Status;\r
216\r
217}\r
218\r
219\r
220UINT32\r
221GetSkuEnabledTokenNumber (\r
222 UINT32 LocalTokenNumber,\r
223 UINTN Size,\r
224 BOOLEAN IsPeiDb\r
225 ) \r
226{\r
227 SKU_HEAD *SkuHead;\r
228 SKU_ID *SkuIdTable;\r
229 INTN i;\r
230 UINT8 *Value;\r
231 SKU_ID *PhaseSkuIdTable;\r
232 UINT8 *PcdDb;\r
233\r
234 ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);\r
235\r
236 PcdDb = IsPeiDb ? (UINT8 *) &gPcdDatabase->PeiDb : (UINT8 *) &gPcdDatabase->DxeDb;\r
237\r
238 SkuHead = (SKU_HEAD *) (PcdDb + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
239 Value = (UINT8 *) (PcdDb + SkuHead->SkuDataStartOffset); \r
240\r
241 PhaseSkuIdTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.SkuIdTable :\r
242 gPcdDatabase->DxeDb.Init.SkuIdTable;\r
243 \r
244 SkuIdTable = &PhaseSkuIdTable[SkuHead->SkuIdTableOffset];\r
245 \r
246 for (i = 0; i < SkuIdTable[0]; i++) {\r
247 if (gPcdDatabase->PeiDb.Init.SystemSkuId == SkuIdTable[i + 1]) {\r
248 break;\r
249 }\r
250 }\r
251 ASSERT (i < SkuIdTable[0]);\r
252\r
253 switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
254 case PCD_TYPE_VPD:\r
255 Value = (UINT8 *) &(((VPD_HEAD *) Value)[i]);\r
256 return ((Value - PcdDb) | PCD_TYPE_VPD);\r
257\r
258 case PCD_TYPE_HII:\r
259 Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[i]);\r
260 return ((Value - PcdDb) | PCD_TYPE_HII);\r
261 \r
262 case PCD_TYPE_DATA:\r
263 Value += Size * i;\r
264 return (Value - PcdDb);\r
265 \r
266 default:\r
267 ASSERT (FALSE);\r
268 }\r
269\r
270 ASSERT (FALSE);\r
271\r
272 return 0;\r
273 \r
274}\r
275\r
276\r
277\r
278\r
279\r
280VOID\r
281InvokeCallbackOnSet (\r
282 UINT32 ExTokenNumber,\r
283 CONST EFI_GUID *Guid, OPTIONAL\r
284 UINTN TokenNumber,\r
285 VOID *Data,\r
286 UINTN Size\r
287 )\r
288{\r
289 return;\r
290}\r
291\r
292\r
293\r
294\r
295EFI_STATUS\r
296SetWorker (\r
297 UINTN TokenNumber,\r
298 VOID *Data,\r
299 UINTN Size,\r
300 BOOLEAN PtrType\r
301 )\r
302{\r
303 UINT32 *LocalTokenNumberTable;\r
304 BOOLEAN IsPeiDb;\r
305\r
306\r
307 ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER);\r
308\r
309 if (PtrType) {\r
310 ASSERT (Size <= DxePcdGetSize (TokenNumber));\r
311 } else {\r
312 ASSERT (Size == DxePcdGetSize (TokenNumber));\r
313 }\r
314 \r
315 IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;\r
316\r
317 LocalTokenNumberTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.LocalTokenNumberTable : \r
318 gPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
319\r
320 TokenNumber = IsPeiDb ? TokenNumber\r
321 : TokenNumber - PEI_LOCAL_TOKEN_NUMBER;\r
322 \r
323 InvokeCallbackOnSet (0, NULL, TokenNumber, Data, Size);\r
324\r
325 return SetWorkerByLocalTokenNumber (LocalTokenNumberTable[TokenNumber], Data, Size, PtrType, IsPeiDb);\r
326\r
327}\r
328\r
329\r
330\r
331\r
332\r
333VOID *\r
334ExGetWorker (\r
335 IN CONST EFI_GUID *Guid,\r
336 IN UINTN ExTokenNumber,\r
337 IN UINTN GetSize\r
338 ) \r
339{\r
340 EX_PCD_ENTRY_ATTRIBUTE Attr;\r
341\r
342 GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
343\r
344 ASSERT ((GetSize == Attr.Size) || (GetSize == 0));\r
345\r
346 return GetWorkerByLocalTokenNumber (Attr.LocalTokenNumberAlias,\r
347 Attr.IsPeiDb,\r
348 Attr.Size\r
349 );\r
350}\r
351\r
352\r
353\r
354\r
355\r
356EFI_STATUS\r
357ExSetWorker (\r
358 IN UINT32 ExTokenNumber,\r
359 IN CONST EFI_GUID *Guid,\r
360 VOID *Data,\r
361 UINTN SetSize,\r
362 BOOLEAN PtrType\r
363 )\r
364{\r
365 EX_PCD_ENTRY_ATTRIBUTE Attr;\r
366\r
367 GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
368\r
369 ASSERT (!PtrType && (SetSize == Attr.Size));\r
370\r
371 ASSERT (PtrType && (SetSize <= Attr.Size));\r
372\r
373 InvokeCallbackOnSet (ExTokenNumber, Guid, Attr.TokenNumber, Data, Attr.Size);\r
374\r
375 SetWorkerByLocalTokenNumber (Attr.LocalTokenNumberAlias, Data, Attr.Size, PtrType, Attr.IsPeiDb);\r
376\r
377 return EFI_SUCCESS;\r
378 \r
379}\r
380\r
381\r
382\r
383\r
384EFI_STATUS\r
385SetWorkerByLocalTokenNumber (\r
386 UINT32 LocalTokenNumber,\r
387 VOID *Data,\r
388 UINTN Size,\r
389 BOOLEAN PtrType,\r
390 BOOLEAN IsPeiDb\r
391 )\r
392{\r
393 EFI_GUID *GuidTable;\r
394 UINT16 *StringTable;\r
395 EFI_GUID *Guid;\r
396 UINT16 *Name;\r
397 VOID *InternalData;\r
398 VARIABLE_HEAD *VariableHead;\r
399 UINTN Offset;\r
400 UINT8 *PcdDb;\r
401\r
402\r
403 if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
404 LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size, IsPeiDb);\r
405 }\r
406\r
407 Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
408\r
409 PcdDb = IsPeiDb ? ((UINT8 *) &gPcdDatabase->PeiDb) : ((UINT8 *) &gPcdDatabase->DxeDb);\r
410\r
411 StringTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.StringTable :\r
412 gPcdDatabase->DxeDb.Init.StringTable;\r
413 \r
414 InternalData = PcdDb + Offset;\r
415\r
416 switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
417 case PCD_TYPE_VPD:\r
418 ASSERT (FALSE);\r
419 return EFI_INVALID_PARAMETER;\r
420 \r
421 case PCD_TYPE_STRING:\r
422 CopyMem (&StringTable[*((UINT16 *)InternalData)], Data, Size);\r
423 break;\r
424\r
425 case PCD_TYPE_HII:\r
426 //\r
427 // Bug Bug: Please implement this\r
428 //\r
429 GuidTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.GuidTable :\r
430 gPcdDatabase->DxeDb.Init.GuidTable;\r
431 \r
432 VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);\r
433 \r
434 Guid = &(GuidTable[VariableHead->GuidTableIndex]);\r
435 Name = &(StringTable[VariableHead->StringIndex]);\r
436\r
437 return EFI_SUCCESS;\r
438\r
439 case PCD_TYPE_DATA:\r
440 if (PtrType) {\r
441 CopyMem (InternalData, Data, Size);\r
442 return EFI_SUCCESS;\r
443 }\r
444\r
445 switch (Size) {\r
446 case sizeof(UINT8):\r
447 *((UINT8 *) InternalData) = *((UINT8 *) Data);\r
448 return EFI_SUCCESS;\r
449\r
450 case sizeof(UINT16):\r
451 *((UINT16 *) InternalData) = *((UINT16 *) Data);\r
452 return EFI_SUCCESS;\r
453\r
454 case sizeof(UINT32):\r
455 *((UINT32 *) InternalData) = *((UINT32 *) Data);\r
456 return EFI_SUCCESS;\r
457\r
458 case sizeof(UINT64):\r
459 *((UINT64 *) InternalData) = *((UINT64 *) Data);\r
460 return EFI_SUCCESS;\r
461\r
462 default:\r
463 ASSERT (FALSE);\r
464 return EFI_NOT_FOUND;\r
465 }\r
466\r
467 default:\r
468 ASSERT (FALSE);\r
469 break;\r
470 }\r
471 \r
472 ASSERT (FALSE);\r
473 return EFI_NOT_FOUND;\r
474}\r
475\r
476\r
477\r
478EFI_STATUS\r
479SetHiiVariable (\r
480 IN EFI_GUID *VariableGuid,\r
481 IN UINT16 *VariableName,\r
482 IN CONST VOID *Data,\r
483 IN UINTN DataSize,\r
484 IN UINTN Offset\r
485 )\r
486{\r
487 UINTN Size;\r
488 VOID *Buffer;\r
489 EFI_STATUS Status;\r
490 UINT32 Attribute;\r
491\r
492 Size = 0;\r
493\r
494 Status = EfiGetVariable (\r
495 (UINT16 *)VariableName,\r
496 VariableGuid,\r
497 &Attribute,\r
498 &Size,\r
499 NULL\r
500 );\r
501\r
502 ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
503\r
504 Buffer = AllocatePool (Size);\r
505\r
506 ASSERT (Buffer != NULL);\r
507\r
508 Status = EfiGetVariable (\r
509 VariableName,\r
510 VariableGuid,\r
511 &Attribute,\r
512 &Size,\r
513 Buffer\r
514 );\r
515\r
516\r
517 CopyMem ((UINT8 *)Buffer + Offset, Data, DataSize);\r
518\r
519 return EfiSetVariable (\r
520 VariableName,\r
521 VariableGuid,\r
522 Attribute,\r
523 Size,\r
524 Buffer\r
525 );\r
526\r
527}\r
528\r
529\r
530\r
531\r
532\r
533VOID\r
534GetExPcdTokenAttributes (\r
535 IN CONST EFI_GUID *Guid,\r
536 IN UINT32 ExTokenNumber,\r
537 OUT EX_PCD_ENTRY_ATTRIBUTE *ExAttr\r
538 )\r
539{\r
540 UINT32 i;\r
541 DYNAMICEX_MAPPING *ExMap;\r
542 EFI_GUID *GuidTable;\r
543 UINT16 *SizeTable;\r
544\r
545 ExMap = gPcdDatabase->PeiDb.Init.ExMapTable;\r
546 GuidTable = gPcdDatabase->PeiDb.Init.GuidTable;\r
547 SizeTable = gPcdDatabase->PeiDb.Init.SizeTable;\r
548 \r
549 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
550 if ((ExTokenNumber == ExMap[i].ExTokenNumber) &&\r
551 CompareGuid (Guid, (CONST EFI_GUID *) &GuidTable[ExMap[i].ExGuidIndex])\r
552 ) {\r
553\r
554 ExAttr->IsPeiDb = TRUE;\r
555 ExAttr->Size = SizeTable[i + PEI_NEX_TOKEN_NUMBER];\r
556 ExAttr->TokenNumber = i + PEI_NEX_TOKEN_NUMBER;\r
557 ExAttr->LocalTokenNumberAlias = ExMap[i].LocalTokenNumber;\r
558 return;\r
559\r
560 }\r
561 }\r
562 \r
563 ExMap = gPcdDatabase->DxeDb.Init.ExMapTable;\r
564 GuidTable = gPcdDatabase->DxeDb.Init.GuidTable;\r
565 SizeTable = gPcdDatabase->DxeDb.Init.SizeTable;\r
566 \r
567 for (i = 0; i < DXE_EXMAPPING_TABLE_SIZE; i++) {\r
568 if ((ExTokenNumber == ExMap[i].ExTokenNumber) &&\r
569 CompareGuid (Guid, (CONST EFI_GUID *) &GuidTable[ExMap[i].ExGuidIndex])\r
570 ) {\r
571\r
572 ExAttr->IsPeiDb = FALSE;\r
573 ExAttr->Size = SizeTable[i + DXE_NEX_TOKEN_NUMBER];\r
574 ExAttr->TokenNumber = i + DXE_NEX_TOKEN_NUMBER;\r
575 ExAttr->LocalTokenNumberAlias = ExMap[i].LocalTokenNumber;\r
576 return;\r
577\r
578 }\r
579 }\r
580\r
581 ASSERT (FALSE);\r
582\r
583 return;\r
584}\r
585\r