hc
2024-03-25 edb30157bad0c0001c32b854271ace01d3b9a16a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/** @file
  Implementation of Fsp Misc UPD Initialization.
 
 
  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/
 
#include <PiPei.h>
 
#include <Library/DebugLib.h>
#include <Library/PcdLib.h>
#include <Library/PeiLib.h>
#include <Library/ConfigBlockLib.h>
#include <Library/PeiServicesLib.h>
 
#include <FspEas.h>
#include <FspmUpd.h>
#include <FspsUpd.h>
 
#include <Library/MemoryAllocationLib.h>
#include <Library/DebugLib.h>
#include <Library/DebugPrintErrorLevelLib.h>
#include <Library/PciLib.h>
#include <Ppi/ReadOnlyVariable2.h>
#include <Guid/MemoryOverwriteControl.h>
#include <PchAccess.h>
#include <Platform.h>
 
#include "PeiMiscPolicyUpdate.h"
 
/**
  Performs FSP Misc UPD initialization.
 
  @param[in,out]    FspmUpd                 Pointer to FSPM_UPD Data.
 
  @retval           EFI_SUCCESS             FSP UPD Data is updated.
  @retval           EFI_NOT_FOUND           An instance of gEfiPeiReadOnlyVariable2PpiGuid
                                            could not be located.
  @retval           EFI_OUT_OF_RESOURCES    Insufficent resources to allocate a memory buffer.
**/
EFI_STATUS
EFIAPI
PeiFspMiscUpdUpdatePreMem (
  IN OUT FSPM_UPD    *FspmUpd
  )
{
  EFI_STATUS                        Status;
  EFI_PEI_READ_ONLY_VARIABLE2_PPI   *VariableServices;
  UINTN                             VariableSize;
  VOID                              *MemorySavedData;
 
  Status = PeiServicesLocatePpi (
             &gEfiPeiReadOnlyVariable2PpiGuid,
             0,
             NULL,
             (VOID **) &VariableServices
             );
  if (EFI_ERROR (Status)) {
    ASSERT_EFI_ERROR (Status);
    return Status;
  }
 
  VariableSize = 0;
  MemorySavedData = NULL;
  Status = VariableServices->GetVariable (
                               VariableServices,
                               L"MemoryConfig",
                               &gFspNonVolatileStorageHobGuid,
                               NULL,
                               &VariableSize,
                               MemorySavedData
                               );
  if (Status == EFI_BUFFER_TOO_SMALL) {
    MemorySavedData = AllocatePool (VariableSize);
    if (MemorySavedData == NULL) {
      ASSERT (MemorySavedData != NULL);
      return EFI_OUT_OF_RESOURCES;
    }
 
    DEBUG ((DEBUG_INFO, "VariableSize is 0x%x\n", VariableSize));
    Status = VariableServices->GetVariable (
                                 VariableServices,
                                 L"MemoryConfig",
                                 &gFspNonVolatileStorageHobGuid,
                                 NULL,
                                 &VariableSize,
                                 MemorySavedData
                                 );
    if (Status == EFI_SUCCESS) {
      FspmUpd->FspmArchUpd.NvsBufferPtr = MemorySavedData;
    } else {
      FspmUpd->FspmArchUpd.NvsBufferPtr = NULL;
      DEBUG ((DEBUG_ERROR, "Fail to retrieve Variable:\"MemoryConfig\" gMemoryConfigVariableGuid, Status = %r\n", Status));
      ASSERT_EFI_ERROR (Status);
    }
  }
 
  FspmUpd->FspmConfig.TsegSize              = FixedPcdGet32 (PcdTsegSize);
  FspmUpd->FspmConfig.CpuRatio              = 0;
  FspmUpd->FspmConfig.CaVrefConfig          = PcdGet8 (PcdMrcCaVrefConfig);
  FspmUpd->FspmConfig.PlatformMemorySize    = PEI_MIN_MEMORY_SIZE;
  FspmUpd->FspmConfig.PcdSerialDebugLevel   = 3;
  FspmUpd->FspmConfig.SafeMode              = 0;
  FspmUpd->FspmConfig.PeciC10Reset          = 0;
 
  return EFI_SUCCESS;
}