1 /** @file
2 *
3 * Copyright (c) 2013-2014, ARM Limited. All rights reserved.
4 *
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 <Library/IoLib.h>
16 #include <Library/ArmPlatformLib.h>
17 #include <Library/DebugLib.h>
18 #include <Library/PcdLib.h>
19
20 #include <Ppi/ArmMpCoreInfo.h>
21
22 #include <ArmPlatform.h>
23
24 ARM_CORE_INFO mJunoInfoTable[] = {
25 {
26 // Cluster 0, Core 0
27 0x0, 0x0,
28
29 // MP Core MailBox Set/Get/Clear Addresses and Clear Value
30 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
31 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
32 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
33 (UINT64)0xFFFFFFFF
34 },
35 {
36 // Cluster 0, Core 1
37 0x0, 0x1,
38
39 // MP Core MailBox Set/Get/Clear Addresses and Clear Value
40 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
41 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
42 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
43 (UINT64)0xFFFFFFFF
44 },
45 {
46 // Cluster 1, Core 0
47 0x1, 0x0,
48
49 // MP Core MailBox Set/Get/Clear Addresses and Clear Value
50 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
51 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
52 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
53 (UINT64)0xFFFFFFFF
54 },
55 {
56 // Cluster 1, Core 1
57 0x1, 0x1,
58
59 // MP Core MailBox Set/Get/Clear Addresses and Clear Value
60 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
61 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
62 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
63 (UINT64)0xFFFFFFFF
64 },
65 {
66 // Cluster 1, Core 2
67 0x1, 0x2,
68
69 // MP Core MailBox Set/Get/Clear Addresses and Clear Value
70 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
71 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
72 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
73 (UINT64)0xFFFFFFFF
74 },
75 {
76 // Cluster 1, Core 3
77 0x1, 0x3,
78
79 // MP Core MailBox Set/Get/Clear Addresses and Clear Value
80 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
81 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
82 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
83 (UINT64)0xFFFFFFFF
84 }
85 };
86
87 /**
88 Return the current Boot Mode
89
90 This function returns the boot reason on the platform
91
92 @return Return the current Boot Mode of the platform
93
94 **/
95 EFI_BOOT_MODE
ArmPlatformGetBootMode(VOID)96 ArmPlatformGetBootMode (
97 VOID
98 )
99 {
100 return BOOT_WITH_FULL_CONFIGURATION;
101 }
102
103 /**
104 Initialize controllers that must setup in the normal world
105
106 This function is called by the ArmPlatformPkg/Pei or ArmPlatformPkg/Pei/PlatformPeim
107 in the PEI phase.
108
109 **/
110 RETURN_STATUS
ArmPlatformInitialize(IN UINTN MpId)111 ArmPlatformInitialize (
112 IN UINTN MpId
113 )
114 {
115 return RETURN_SUCCESS;
116 }
117
118 /**
119 Initialize the system (or sometimes called permanent) memory
120
121 This memory is generally represented by the DRAM.
122
123 **/
124 VOID
ArmPlatformInitializeSystemMemory(VOID)125 ArmPlatformInitializeSystemMemory (
126 VOID
127 )
128 {
129 }
130
131 EFI_STATUS
PrePeiCoreGetMpCoreInfo(OUT UINTN * CoreCount,OUT ARM_CORE_INFO ** ArmCoreTable)132 PrePeiCoreGetMpCoreInfo (
133 OUT UINTN *CoreCount,
134 OUT ARM_CORE_INFO **ArmCoreTable
135 )
136 {
137 // Only support one cluster
138 *CoreCount = sizeof(mJunoInfoTable) / sizeof(ARM_CORE_INFO);
139 *ArmCoreTable = mJunoInfoTable;
140 return EFI_SUCCESS;
141 }
142
143 ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi = { PrePeiCoreGetMpCoreInfo };
144
145 EFI_PEI_PPI_DESCRIPTOR gPlatformPpiTable[] = {
146 {
147 EFI_PEI_PPI_DESCRIPTOR_PPI,
148 &gArmMpCoreInfoPpiGuid,
149 &mMpCoreInfoPpi
150 }
151 };
152
153 VOID
ArmPlatformGetPlatformPpiList(OUT UINTN * PpiListSize,OUT EFI_PEI_PPI_DESCRIPTOR ** PpiList)154 ArmPlatformGetPlatformPpiList (
155 OUT UINTN *PpiListSize,
156 OUT EFI_PEI_PPI_DESCRIPTOR **PpiList
157 )
158 {
159 *PpiListSize = sizeof(gPlatformPpiTable);
160 *PpiList = gPlatformPpiTable;
161 }
162