1/** @file
2  Build FV related hobs for platform.
3
4  Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
5  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
9
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.
12
13**/
14
15#include "PiPei.h"
16#include "Platform.h"
17#include <Library/DebugLib.h>
18#include <Library/HobLib.h>
19#include <Library/PeiServicesLib.h>
20#include <Library/PcdLib.h>
21
22
23/**
24  Publish PEI & DXE (Decompressed) Memory based FVs to let PEI
25  and DXE know about them.
26
27  @retval EFI_SUCCESS   Platform PEI FVs were initialized successfully.
28
29**/
30EFI_STATUS
31PeiFvInitialization (
32  VOID
33  )
34{
35  BOOLEAN SecureS3Needed;
36
37  DEBUG ((EFI_D_INFO, "Platform PEI Firmware Volume Initialization\n"));
38
39  //
40  // Create a memory allocation HOB for the PEI FV.
41  //
42  // Allocate as ACPI NVS is S3 is supported
43  //
44  BuildMemoryAllocationHob (
45    PcdGet32 (PcdOvmfPeiMemFvBase),
46    PcdGet32 (PcdOvmfPeiMemFvSize),
47    mS3Supported ? EfiACPIMemoryNVS : EfiBootServicesData
48    );
49
50  //
51  // Let DXE know about the DXE FV
52  //
53  BuildFvHob (PcdGet32 (PcdOvmfDxeMemFvBase), PcdGet32 (PcdOvmfDxeMemFvSize));
54
55  SecureS3Needed = mS3Supported && FeaturePcdGet (PcdSmmSmramRequire);
56
57  //
58  // Create a memory allocation HOB for the DXE FV.
59  //
60  // If "secure" S3 is needed, then SEC will decompress both PEI and DXE
61  // firmware volumes at S3 resume too, hence we need to keep away the OS from
62  // DXEFV as well. Otherwise we only need to keep away DXE itself from the
63  // DXEFV area.
64  //
65  BuildMemoryAllocationHob (
66    PcdGet32 (PcdOvmfDxeMemFvBase),
67    PcdGet32 (PcdOvmfDxeMemFvSize),
68    SecureS3Needed ? EfiACPIMemoryNVS : EfiBootServicesData
69    );
70
71  //
72  // Additionally, said decompression will use temporary memory above the end
73  // of DXEFV, so let's keep away the OS from there too.
74  //
75  if (SecureS3Needed) {
76    UINT32 DxeMemFvEnd;
77
78    DxeMemFvEnd = PcdGet32 (PcdOvmfDxeMemFvBase) +
79                  PcdGet32 (PcdOvmfDxeMemFvSize);
80    BuildMemoryAllocationHob (
81      DxeMemFvEnd,
82      PcdGet32 (PcdOvmfDecompressionScratchEnd) - DxeMemFvEnd,
83      EfiACPIMemoryNVS
84      );
85  }
86
87  //
88  // Let PEI know about the DXE FV so it can find the DXE Core
89  //
90  PeiServicesInstallFvInfoPpi (
91    NULL,
92    (VOID *)(UINTN) PcdGet32 (PcdOvmfDxeMemFvBase),
93    PcdGet32 (PcdOvmfDxeMemFvSize),
94    NULL,
95    NULL
96    );
97
98  return EFI_SUCCESS;
99}
100
101