]> git.proxmox.com Git - mirror_edk2.git/blob - EdkModulePkg/Universal/PCD/Pei/Pcd.c
Add in support for MaxSize and CurrentSize for PCD entry.
[mirror_edk2.git] / EdkModulePkg / Universal / PCD / Pei / Pcd.c
1 /** @file PCD PEIM
2
3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12
13 Module Name: Pcd.c
14
15 **/
16
17 #include "Service.h"
18
19
20 PCD_PPI mPcdPpiInstance = {
21 PeiPcdSetSku,
22
23 PeiPcdGet8,
24 PeiPcdGet16,
25 PeiPcdGet32,
26 PeiPcdGet64,
27 PeiPcdGetPtr,
28 PeiPcdGetBool,
29 PeiPcdGetSize,
30
31 PeiPcdGet8Ex,
32 PeiPcdGet16Ex,
33 PeiPcdGet32Ex,
34 PeiPcdGet64Ex,
35 PeiPcdGetPtrEx,
36 PeiPcdGetBoolEx,
37 PeiPcdGetSizeEx,
38
39 PeiPcdSet8,
40 PeiPcdSet16,
41 PeiPcdSet32,
42 PeiPcdSet64,
43 PeiPcdSetPtr,
44 PeiPcdSetBool,
45
46 PeiPcdSet8Ex,
47 PeiPcdSet16Ex,
48 PeiPcdSet32Ex,
49 PeiPcdSet64Ex,
50 PeiPcdSetPtrEx,
51 PeiPcdSetBoolEx,
52
53 PeiRegisterCallBackOnSet,
54 PcdUnRegisterCallBackOnSet,
55 PeiPcdGetNextToken,
56 PeiPcdGetNextTokenSpace
57 };
58
59
60
61 STATIC EFI_PEI_PPI_DESCRIPTOR mPpiPCD = {
62 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
63 &gPcdPpiGuid,
64 &mPcdPpiInstance
65 };
66
67
68
69 EFI_STATUS
70 EFIAPI
71 PcdPeimInit (
72 IN EFI_FFS_FILE_HEADER *FfsHeader,
73 IN EFI_PEI_SERVICES **PeiServices
74 )
75 {
76 EFI_STATUS Status;
77
78 BuildPcdDatabase ();
79
80 Status = PeiServicesInstallPpi (&mPpiPCD);
81
82 ASSERT_EFI_ERROR (Status);
83
84 return EFI_SUCCESS;
85 }
86
87 VOID
88 EFIAPI
89 PeiPcdSetSku (
90 IN UINTN SkuId
91 )
92 {
93
94 GetPcdDatabase()->Init.SystemSkuId = (SKU_ID) SkuId;
95
96 return;
97 }
98
99
100
101 UINT8
102 EFIAPI
103 PeiPcdGet8 (
104 IN UINTN TokenNumber
105 )
106 {
107 return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));
108 }
109
110
111
112 UINT16
113 EFIAPI
114 PeiPcdGet16 (
115 IN UINTN TokenNumber
116 )
117 {
118 return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));
119 }
120
121
122
123 UINT32
124 EFIAPI
125 PeiPcdGet32 (
126 IN UINTN TokenNumber
127 )
128 {
129 return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));
130 }
131
132
133
134 UINT64
135 EFIAPI
136 PeiPcdGet64 (
137 IN UINTN TokenNumber
138 )
139 {
140 return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));
141 }
142
143
144
145 VOID *
146 EFIAPI
147 PeiPcdGetPtr (
148 IN UINTN TokenNumber
149 )
150 {
151 return GetWorker (TokenNumber, 0);
152 }
153
154
155
156 BOOLEAN
157 EFIAPI
158 PeiPcdGetBool (
159 IN UINTN TokenNumber
160 )
161 {
162 return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));
163 }
164
165
166
167 UINTN
168 EFIAPI
169 PeiPcdGetSize (
170 IN UINTN TokenNumber
171 )
172 {
173 PEI_PCD_DATABASE *PeiPcdDb;
174 UINTN Size;
175 UINTN MaxSize;
176
177 PeiPcdDb = GetPcdDatabase ();
178 //
179 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
180 // We have to decrement TokenNumber by 1 to make it usable
181 // as the array index.
182 //
183 TokenNumber--;
184
185 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);
186
187 Size = (PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber] & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;
188
189 if (Size == 0) {
190 //
191 // For pointer type, we need to scan the SIZE_TABLE to get the current size.
192 //
193 return GetPtrTypeSize (TokenNumber, &MaxSize, PeiPcdDb);
194 } else {
195 return Size;
196 }
197
198 }
199
200
201
202 UINT8
203 EFIAPI
204 PeiPcdGet8Ex (
205 IN CONST EFI_GUID *Guid,
206 IN UINTN ExTokenNumber
207 )
208 {
209 return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));
210 }
211
212
213
214 UINT16
215 EFIAPI
216 PeiPcdGet16Ex (
217 IN CONST EFI_GUID *Guid,
218 IN UINTN ExTokenNumber
219 )
220 {
221 return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));
222 }
223
224
225
226 UINT32
227 EFIAPI
228 PeiPcdGet32Ex (
229 IN CONST EFI_GUID *Guid,
230 IN UINTN ExTokenNumber
231 )
232 {
233 return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));
234 }
235
236
237
238 UINT64
239 EFIAPI
240 PeiPcdGet64Ex (
241 IN CONST EFI_GUID *Guid,
242 IN UINTN ExTokenNumber
243 )
244 {
245 return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));
246 }
247
248
249
250 VOID *
251 EFIAPI
252 PeiPcdGetPtrEx (
253 IN CONST EFI_GUID *Guid,
254 IN UINTN ExTokenNumber
255 )
256 {
257 return ExGetWorker (Guid, ExTokenNumber, 0);
258 }
259
260
261
262 BOOLEAN
263 EFIAPI
264 PeiPcdGetBoolEx (
265 IN CONST EFI_GUID *Guid,
266 IN UINTN ExTokenNumber
267 )
268 {
269 return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));
270 }
271
272
273
274 UINTN
275 EFIAPI
276 PeiPcdGetSizeEx (
277 IN CONST EFI_GUID *Guid,
278 IN UINTN ExTokenNumber
279 )
280 {
281 return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber));
282 }
283
284
285
286 EFI_STATUS
287 EFIAPI
288 PeiPcdSet8 (
289 IN UINTN TokenNumber,
290 IN UINT8 Value
291 )
292 {
293 return SetValueWorker (TokenNumber, &Value, sizeof (Value));
294 }
295
296
297
298 EFI_STATUS
299 EFIAPI
300 PeiPcdSet16 (
301 IN UINTN TokenNumber,
302 IN UINT16 Value
303 )
304 {
305 return SetValueWorker (TokenNumber, &Value, sizeof (Value));
306 }
307
308
309
310 EFI_STATUS
311 EFIAPI
312 PeiPcdSet32 (
313 IN UINTN TokenNumber,
314 IN UINT32 Value
315 )
316 {
317 return SetValueWorker (TokenNumber, &Value, sizeof (Value));
318 }
319
320
321
322 EFI_STATUS
323 EFIAPI
324 PeiPcdSet64 (
325 IN UINTN TokenNumber,
326 IN UINT64 Value
327 )
328 {
329 return SetValueWorker (TokenNumber, &Value, sizeof (Value));
330 }
331
332
333 EFI_STATUS
334 EFIAPI
335 PeiPcdSetPtr (
336 IN UINTN TokenNumber,
337 IN OUT UINTN *SizeOfBuffer,
338 IN VOID *Buffer
339 )
340 {
341 return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);
342 }
343
344
345
346 EFI_STATUS
347 EFIAPI
348 PeiPcdSetBool (
349 IN UINTN TokenNumber,
350 IN BOOLEAN Value
351 )
352 {
353 return SetValueWorker (TokenNumber, &Value, sizeof (Value));
354 }
355
356
357
358 EFI_STATUS
359 EFIAPI
360 PeiPcdSet8Ex (
361 IN CONST EFI_GUID *Guid,
362 IN UINTN ExTokenNumber,
363 IN UINT8 Value
364 )
365 {
366 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));
367 }
368
369
370
371 EFI_STATUS
372 EFIAPI
373 PeiPcdSet16Ex (
374 IN CONST EFI_GUID *Guid,
375 IN UINTN ExTokenNumber,
376 IN UINT16 Value
377 )
378 {
379 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));
380 }
381
382
383
384 EFI_STATUS
385 EFIAPI
386 PeiPcdSet32Ex (
387 IN CONST EFI_GUID *Guid,
388 IN UINTN ExTokenNumber,
389 IN UINT32 Value
390 )
391 {
392 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));
393 }
394
395
396
397 EFI_STATUS
398 EFIAPI
399 PeiPcdSet64Ex (
400 IN CONST EFI_GUID *Guid,
401 IN UINTN ExTokenNumber,
402 IN UINT64 Value
403 )
404 {
405 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));
406 }
407
408
409
410 EFI_STATUS
411 EFIAPI
412 PeiPcdSetPtrEx (
413 IN CONST EFI_GUID *Guid,
414 IN UINTN ExTokenNumber,
415 IN UINTN *SizeOfBuffer,
416 IN VOID *Value
417 )
418 {
419 return ExSetWorker (ExTokenNumber, Guid, Value, SizeOfBuffer, TRUE);
420 }
421
422
423
424 EFI_STATUS
425 EFIAPI
426 PeiPcdSetBoolEx (
427 IN CONST EFI_GUID *Guid,
428 IN UINTN ExTokenNumber,
429 IN BOOLEAN Value
430 )
431 {
432 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));
433 }
434
435
436
437
438 EFI_STATUS
439 EFIAPI
440 PeiRegisterCallBackOnSet (
441 IN UINTN ExTokenNumber,
442 IN CONST EFI_GUID *Guid, OPTIONAL
443 IN PCD_PPI_CALLBACK CallBackFunction
444 )
445 {
446 ASSERT (CallBackFunction != NULL);
447
448 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);
449 }
450
451
452
453 EFI_STATUS
454 EFIAPI
455 PcdUnRegisterCallBackOnSet (
456 IN UINTN ExTokenNumber,
457 IN CONST EFI_GUID *Guid, OPTIONAL
458 IN PCD_PPI_CALLBACK CallBackFunction
459 )
460 {
461 ASSERT (CallBackFunction != NULL);
462
463 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);
464 }
465
466
467
468 EFI_STATUS
469 EFIAPI
470 PeiPcdGetNextToken (
471 IN CONST EFI_GUID *Guid, OPTIONAL
472 IN OUT UINTN *TokenNumber
473 )
474 {
475 UINTN GuidTableIdx;
476 PEI_PCD_DATABASE *PeiPcdDb;
477 EFI_GUID *MatchGuid;
478 DYNAMICEX_MAPPING *ExMapTable;
479 UINTN i;
480 BOOLEAN Found;
481
482 if (Guid == NULL) {
483 (*TokenNumber)++;
484
485 if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER) {
486 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;
487 }
488
489 } else {
490
491 if (PEI_EXMAP_TABLE_EMPTY) {
492 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;
493 return EFI_NOT_FOUND;
494 }
495
496 //
497 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
498 // 1) ExGuid
499 // 2) ExTokenNumber
500 //
501 PeiPcdDb = GetPcdDatabase ();
502
503 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);
504
505 if (MatchGuid == NULL) {
506 *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;
507 return EFI_NOT_FOUND;
508 }
509
510 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;
511
512 ExMapTable = PeiPcdDb->Init.ExMapTable;
513
514 Found = FALSE;
515 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {
516 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {
517 Found = TRUE;
518 break;
519 }
520 }
521
522 if (Found) {
523 if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) {
524 *TokenNumber = ExMapTable[i].ExTokenNumber;
525 return EFI_SUCCESS;
526 }
527
528 for ( ; ExMapTable[i].ExGuidIndex == GuidTableIdx; i++) {
529 if (ExMapTable[i].ExTokenNumber == *TokenNumber) {
530 i++;
531 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {
532 *TokenNumber = ExMapTable[i].ExTokenNumber;
533 return EFI_SUCCESS;
534 } else {
535 *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;
536 return EFI_SUCCESS;
537 }
538 }
539 }
540
541 return EFI_NOT_FOUND;
542 }
543
544 }
545
546 return EFI_SUCCESS;
547 }
548
549
550
551 EFI_STATUS
552 EFIAPI
553 PeiPcdGetNextTokenSpace (
554 IN OUT CONST EFI_GUID **Guid
555 )
556 {
557 UINTN GuidTableIdx;
558 EFI_GUID *MatchGuid;
559 PEI_PCD_DATABASE *PeiPcdDb;
560 DYNAMICEX_MAPPING *ExMapTable;
561 UINTN i;
562 BOOLEAN Found;
563
564 ASSERT (Guid != NULL);
565
566 if (PEI_EXMAP_TABLE_EMPTY) {
567 if (*Guid != NULL) {
568 return EFI_NOT_FOUND;
569 } else {
570 return EFI_SUCCESS;
571 }
572 }
573
574 //
575 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
576 // 1) ExGuid
577 // 2) ExTokenNumber
578 //
579 PeiPcdDb = GetPcdDatabase ();
580
581 ExMapTable = PeiPcdDb->Init.ExMapTable;
582
583 if (*Guid == NULL) {
584 //
585 // return the first Token Space Guid.
586 //
587 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex];
588 return EFI_SUCCESS;
589 }
590
591 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid);
592
593 if (MatchGuid == NULL) {
594 return EFI_NOT_FOUND;
595 }
596
597 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;
598
599 Found = FALSE;
600 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {
601 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {
602 Found = TRUE;
603 break;
604 }
605 }
606
607 if (Found) {
608 i++;
609 for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {
610 if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {
611 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];
612 return EFI_SUCCESS;
613 }
614 }
615 *Guid = NULL;
616 return EFI_SUCCESS;
617 }
618
619 return EFI_NOT_FOUND;
620
621 }
622