blob: 358dd5a91f08061983c2612caf1a7f84e5df8d66 (
plain)
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
111
112
113
114
115
116
117
118
119
120
121
122
123
|
/** @file
*
* Copyright (c) 2011-2014, ARM Limited. All rights reserved.
*
* This program and the accompanying materials
* are licensed and made available under the terms and conditions of the BSD License
* which accompanies this distribution. The full text of the license may be found at
* http://opensource.org/licenses/bsd-license.php
*
* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
*
**/
#include <PiPei.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/HobLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/PeiServicesLib.h>
#include <Platform/DramInfo.h>
#include <Ppi/DramInfo.h>
#include <Ppi/MemoryDiscovered.h>
STATIC
CONST DRAM_INFO *mDramInfo = (VOID *)(UINTN)FixedPcdGet64 (PcdDramInfoBase);
/**
Retrieve the number of discontiguous DRAM regions
@param[out] RegionCount The number of available DRAM regions
@retval EFI_SUCCESS The data was successfully returned.
@retval EFI_INVALID_PARAMETER RegionCount == NULL
**/
STATIC
EFI_STATUS
EFIAPI
GetDramRegionCount (
OUT UINTN *RegionCount
)
{
if (RegionCount == NULL) {
return EFI_INVALID_PARAMETER;
}
*RegionCount = mDramInfo->NumRegions;
return EFI_SUCCESS;
}
/**
Retrieve the base and size of a DRAM region
@param[in] RegionIndex The 0-based index of the region to retrieve
@param[out] Base The base of the requested region
@param[out] Size The size of the requested region
@retval EFI_SUCCESS The data was successfully returned.
@retval EFI_INVALID_PARAMETER Base == NULL or Size == NULL
@retval EFI_NOT_FOUND No region exists with index >= RegionIndex
**/
STATIC
EFI_STATUS
EFIAPI
GetDramRegion (
IN UINTN RegionIndex,
OUT UINT64 *Base,
OUT UINT64 *Size
)
{
if (Base == NULL || Size == NULL) {
return EFI_INVALID_PARAMETER;
}
if (RegionIndex >= mDramInfo->NumRegions) {
return EFI_NOT_FOUND;
}
*Base = mDramInfo->Entry[RegionIndex].Base;
*Size = mDramInfo->Entry[RegionIndex].Size;
return EFI_SUCCESS;
}
STATIC SYNQUACER_DRAM_INFO_PPI mDramInfoPpi = {
GetDramRegionCount,
GetDramRegion
};
STATIC CONST EFI_PEI_PPI_DESCRIPTOR mDramInfoPpiDescriptor = {
EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
&gSynQuacerDramInfoPpiGuid,
&mDramInfoPpi
};
EFI_STATUS
EFIAPI
PlatformPeim (
VOID
)
{
EFI_STATUS Status;
ASSERT (mDramInfo->NumRegions > 0);
//
// Record the first region into PcdSystemMemoryBase and PcdSystemMemorySize.
// This is the region we will use for UEFI itself.
//
Status = PcdSet64S (PcdSystemMemoryBase, mDramInfo->Entry[0].Base);
ASSERT_EFI_ERROR (Status);
Status = PcdSet64S (PcdSystemMemorySize, mDramInfo->Entry[0].Size);
ASSERT_EFI_ERROR (Status);
BuildFvHob (FixedPcdGet64 (PcdFvBaseAddress), FixedPcdGet32 (PcdFvSize));
return PeiServicesInstallPpi (&mDramInfoPpiDescriptor);
}
|