]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.c
ArmPkg: Move ARM Platform drivers from ArmPkg/Drivers/ to ArmPlatformPkg/Drivers/
[mirror_edk2.git] / ArmPlatformPkg / MemoryInitPei / MemoryInitPeim.c
CommitLineData
3a6eaccf 1/** @file\r
2*\r
3* Copyright (c) 2011, ARM Limited. All rights reserved.\r
4* \r
5* This program and the accompanying materials \r
6* are licensed and made available under the terms and conditions of the BSD License \r
7* which accompanies this distribution. The full text of the license may be found at \r
8* http://opensource.org/licenses/bsd-license.php \r
9*\r
10* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
11* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
12*\r
13**/\r
14\r
15#include <PiPei.h>\r
16\r
17//\r
18// The protocols, PPI and GUID defintions for this module\r
19//\r
20#include <Ppi/MasterBootMode.h>\r
21#include <Ppi/BootInRecoveryMode.h>\r
22#include <Guid/MemoryTypeInformation.h>\r
23//\r
24// The Library classes this module consumes\r
25//\r
26#include <Library/ArmPlatformLib.h>\r
27#include <Library/DebugLib.h>\r
28#include <Library/HobLib.h>\r
29#include <Library/PeimEntryPoint.h>\r
30#include <Library/PeiServicesLib.h>\r
31#include <Library/PcdLib.h>\r
32\r
33EFI_STATUS\r
34EFIAPI\r
35MemoryPeim (\r
36 IN EFI_PHYSICAL_ADDRESS UefiMemoryBase,\r
37 IN UINT64 UefiMemorySize\r
38 );\r
39\r
40// May want to put this into a library so you only need the PCD settings if you are using the feature?\r
41VOID\r
42BuildMemoryTypeInformationHob (\r
43 VOID\r
44 )\r
45{\r
46 EFI_MEMORY_TYPE_INFORMATION Info[10];\r
47\r
48 Info[0].Type = EfiACPIReclaimMemory;\r
49 Info[0].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiACPIReclaimMemory);\r
50 Info[1].Type = EfiACPIMemoryNVS;\r
51 Info[1].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiACPIMemoryNVS);\r
52 Info[2].Type = EfiReservedMemoryType;\r
53 Info[2].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiReservedMemoryType);\r
54 Info[3].Type = EfiRuntimeServicesData;\r
55 Info[3].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiRuntimeServicesData);\r
56 Info[4].Type = EfiRuntimeServicesCode;\r
57 Info[4].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiRuntimeServicesCode);\r
58 Info[5].Type = EfiBootServicesCode;\r
59 Info[5].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiBootServicesCode);\r
60 Info[6].Type = EfiBootServicesData;\r
61 Info[6].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiBootServicesData);\r
62 Info[7].Type = EfiLoaderCode;\r
63 Info[7].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiLoaderCode);\r
64 Info[8].Type = EfiLoaderData;\r
65 Info[8].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiLoaderData);\r
66 \r
67 // Terminator for the list\r
68 Info[9].Type = EfiMaxMemoryType;\r
69 Info[9].NumberOfPages = 0;\r
70\r
71 BuildGuidDataHob (&gEfiMemoryTypeInformationGuid, &Info, sizeof (Info));\r
72}\r
73\r
74/*++\r
75\r
76Routine Description:\r
77\r
78 \r
79\r
80Arguments:\r
81\r
82 FileHandle - Handle of the file being invoked.\r
83 PeiServices - Describes the list of possible PEI Services.\r
84 \r
85Returns:\r
86\r
87 Status - EFI_SUCCESS if the boot mode could be set\r
88\r
89--*/\r
90EFI_STATUS\r
91EFIAPI\r
92InitializeMemory (\r
93 IN EFI_PEI_FILE_HANDLE FileHandle,\r
94 IN CONST EFI_PEI_SERVICES **PeiServices\r
95 )\r
96{\r
97 EFI_STATUS Status;\r
3a6eaccf 98 UINTN SystemMemoryTop;\r
99 UINTN UefiMemoryBase;\r
3a6eaccf 100\r
101 DEBUG ((EFI_D_ERROR, "Memory Init PEIM Loaded\n"));\r
102\r
103 // Ensure PcdSystemMemorySize has been set\r
104 ASSERT (FixedPcdGet32 (PcdSystemMemorySize) != 0);\r
105\r
106 SystemMemoryTop = (UINTN)FixedPcdGet32 (PcdSystemMemoryBase) + (UINTN)FixedPcdGet32 (PcdSystemMemorySize);\r
107\r
108 //\r
109 // Initialize the System Memory (DRAM)\r
110 //\r
bf72cf33 111 if (PcdGet32 (PcdStandalone)) {\r
3a6eaccf 112 // In case of a standalone version, the DRAM is already initialized\r
113 ArmPlatformInitializeSystemMemory();\r
114 }\r
115\r
116 //\r
117 // Declare the UEFI memory to PEI\r
118 //\r
bf72cf33 119 if (PcdGet32 (PcdStandalone)) {\r
3a6eaccf 120 // In case of standalone UEFI, we set the UEFI memory region at the top of the DRAM\r
121 UefiMemoryBase = SystemMemoryTop - FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);\r
122 } else {\r
123 // In case of a non standalone UEFI, we set the UEFI memory below the Firmware Volume\r
124 UefiMemoryBase = FixedPcdGet32 (PcdNormalFdBaseAddress) - FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);\r
125 }\r
126 Status = PeiServicesInstallPeiMemory (UefiMemoryBase,FixedPcdGet32 (PcdSystemMemoryUefiRegionSize));\r
127 ASSERT_EFI_ERROR (Status);\r
128\r
129 // Initialize MMU and Memory HOBs (Resource Descriptor HOBs)\r
130 Status = MemoryPeim (UefiMemoryBase, FixedPcdGet32 (PcdSystemMemoryUefiRegionSize));\r
131 ASSERT_EFI_ERROR (Status);\r
132\r
133 return Status;\r
134}\r