]> git.proxmox.com Git - mirror_edk2.git/blame - InOsEmuPkg/CpuRuntimeDxe/CpuDriver.h
Add MP support. Based on PcdEmuApCount APs (Application Processors) are created in...
[mirror_edk2.git] / InOsEmuPkg / CpuRuntimeDxe / CpuDriver.h
CommitLineData
949f388f 1/*++ @file\r
2\r
3Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>\r
4Portions copyright (c) 2011, Apple Inc. All rights reserved.\r
5This program and the accompanying materials \r
6are licensed and made available under the terms and conditions of the BSD License \r
7which accompanies this distribution. The full text of the license may be found at \r
8http://opensource.org/licenses/bsd-license.php \r
9 \r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
12\r
13**/\r
14\r
15#ifndef _CPU_ARCHITECTURAL_PROTOCOL_DRIVER_H_\r
16#define _CPU_ARCHITECTURAL_PROTOCOL_DRIVER_H_\r
17\r
18\r
19#include <FrameworkDxe.h>\r
20#include <IndustryStandard/SmBios.h>\r
c4671a67 21\r
949f388f 22#include <Protocol/Cpu.h>\r
23#include <Protocol/Smbios.h>\r
24#include <Protocol/FrameworkHii.h>\r
c4671a67 25#include <Protocol/MpService.h>\r
26#include <Protocol/EmuPthreadThunk.h>\r
949f388f 27#include <Protocol/CpuIo2.h>\r
c4671a67 28\r
29#include <Guid/DataHubRecords.h>\r
30\r
949f388f 31#include <Library/BaseLib.h>\r
32#include <Library/DebugLib.h>\r
33#include <Library/HiiLib.h>\r
34#include <Library/UefiDriverEntryPoint.h>\r
35#include <Library/BaseMemoryLib.h>\r
36#include <Library/MemoryAllocationLib.h>\r
37#include <Library/UefiBootServicesTableLib.h>\r
38#include <Library/EmuThunkLib.h>\r
c4671a67 39#include <Library/UefiLib.h>\r
40#include <Library/PcdLib.h>\r
949f388f 41\r
42\r
43extern UINT8 CpuStrings[];\r
44\r
45//\r
46// Internal Data Structures\r
47//\r
48#define CPU_ARCH_PROT_PRIVATE_SIGNATURE SIGNATURE_32 ('c', 'a', 'p', 'd')\r
49\r
50typedef struct {\r
51 UINTN Signature;\r
52 EFI_HANDLE Handle;\r
53\r
54 EFI_CPU_ARCH_PROTOCOL Cpu;\r
55 EFI_CPU_IO2_PROTOCOL CpuIo;\r
56\r
57 //\r
58 // Local Data for CPU interface goes here\r
59 //\r
60 BOOLEAN InterruptState;\r
61\r
62} CPU_ARCH_PROTOCOL_PRIVATE;\r
63\r
64#define CPU_ARCH_PROTOCOL_PRIVATE_DATA_FROM_THIS(a) \\r
65 CR (a, \\r
66 CPU_ARCH_PROTOCOL_PRIVATE, \\r
67 Cpu, \\r
68 CPU_ARCH_PROT_PRIVATE_SIGNATURE \\r
69 )\r
70\r
c4671a67 71\r
72\r
73typedef enum {\r
74 CPU_STATE_IDLE,\r
75 CPU_STATE_BLOCKED,\r
76 CPU_STATE_READY,\r
77 CPU_STATE_BUSY,\r
78 CPU_STATE_FINISHED\r
79} PROCESSOR_STATE;\r
80\r
81\r
82//\r
83// Define Individual Processor Data block.\r
84//\r
85typedef struct {\r
86 EFI_PROCESSOR_INFORMATION Info;\r
87 EFI_AP_PROCEDURE Procedure;\r
88 VOID *Parameter;\r
89 VOID *StateLock;\r
90 VOID *ProcedureLock;\r
91 PROCESSOR_STATE State;\r
92 EFI_EVENT CheckThisAPEvent; \r
93} PROCESSOR_DATA_BLOCK;\r
94\r
95\r
96//\r
97// Define MP data block which consumes individual processor block.\r
98//\r
99typedef struct {\r
100 UINTN NumberOfProcessors;\r
101 UINTN NumberOfEnabledProcessors;\r
102 EFI_EVENT CheckAllAPsEvent;\r
103 EFI_EVENT WaitEvent;\r
104 UINTN FinishCount;\r
105 UINTN StartCount;\r
106 EFI_AP_PROCEDURE Procedure;\r
107 VOID *ProcedureArgument;\r
108 BOOLEAN SingleThread;\r
109 UINTN StartedNumber;\r
110 PROCESSOR_DATA_BLOCK *ProcessorData;\r
111} MP_SYSTEM_DATA;\r
112\r
113\r
114\r
115\r
116\r
949f388f 117EFI_STATUS\r
118EFIAPI\r
119CpuMemoryServiceRead (\r
120 IN EFI_CPU_IO2_PROTOCOL *This,\r
121 IN EFI_CPU_IO_PROTOCOL_WIDTH Width,\r
122 IN UINT64 Address,\r
123 IN UINTN Count,\r
124 IN OUT VOID *Buffer\r
125 );\r
126\r
127EFI_STATUS\r
128EFIAPI\r
129CpuMemoryServiceWrite (\r
130 IN EFI_CPU_IO2_PROTOCOL *This,\r
131 IN EFI_CPU_IO_PROTOCOL_WIDTH Width,\r
132 IN UINT64 Address,\r
133 IN UINTN Count,\r
134 IN OUT VOID *Buffer\r
135 );\r
136\r
137EFI_STATUS\r
138EFIAPI\r
139CpuIoServiceRead (\r
140 IN EFI_CPU_IO2_PROTOCOL *This,\r
141 IN EFI_CPU_IO_PROTOCOL_WIDTH Width,\r
142 IN UINT64 UserAddress,\r
143 IN UINTN Count,\r
144 IN OUT VOID *UserBuffer\r
145 );\r
146\r
147EFI_STATUS\r
148EFIAPI\r
149CpuIoServiceWrite (\r
150 IN EFI_CPU_IO2_PROTOCOL *This,\r
151 IN EFI_CPU_IO_PROTOCOL_WIDTH Width,\r
152 IN UINT64 UserAddress,\r
153 IN UINTN Count,\r
154 IN OUT VOID *UserBuffer\r
155 );\r
156\r
157EFI_STATUS\r
158EFIAPI\r
159InitializeCpu (\r
160 IN EFI_HANDLE ImageHandle,\r
161 IN EFI_SYSTEM_TABLE *SystemTable\r
162 );\r
163\r
164EFI_STATUS\r
165EFIAPI\r
166EmuFlushCpuDataCache (\r
167 IN EFI_CPU_ARCH_PROTOCOL *This,\r
168 IN EFI_PHYSICAL_ADDRESS Start,\r
169 IN UINT64 Length,\r
170 IN EFI_CPU_FLUSH_TYPE FlushType\r
171 );\r
172\r
173EFI_STATUS\r
174EFIAPI\r
175EmuEnableInterrupt (\r
176 IN EFI_CPU_ARCH_PROTOCOL *This\r
177 );\r
178\r
179EFI_STATUS\r
180EFIAPI\r
181EmuDisableInterrupt (\r
182 IN EFI_CPU_ARCH_PROTOCOL *This\r
183 );\r
184\r
185EFI_STATUS\r
186EFIAPI\r
187EmuGetInterruptState (\r
188 IN EFI_CPU_ARCH_PROTOCOL *This,\r
189 OUT BOOLEAN *State\r
190 );\r
191\r
192EFI_STATUS\r
193EFIAPI\r
194EmuInit (\r
195 IN EFI_CPU_ARCH_PROTOCOL *This,\r
196 IN EFI_CPU_INIT_TYPE InitType\r
197 );\r
198\r
199EFI_STATUS\r
200EFIAPI\r
201EmuRegisterInterruptHandler (\r
202 IN EFI_CPU_ARCH_PROTOCOL *This,\r
203 IN EFI_EXCEPTION_TYPE InterruptType,\r
204 IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler\r
205 );\r
206\r
207EFI_STATUS\r
208EFIAPI\r
209EmuGetTimerValue (\r
210 IN EFI_CPU_ARCH_PROTOCOL *This,\r
211 IN UINT32 TimerIndex,\r
212 OUT UINT64 *TimerValue,\r
213 OUT UINT64 *TimerPeriod OPTIONAL\r
214 );\r
215\r
216EFI_STATUS\r
217EFIAPI\r
218EmuSetMemoryAttributes (\r
219 IN EFI_CPU_ARCH_PROTOCOL *This,\r
220 IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
221 IN UINT64 Length,\r
222 IN UINT64 Attributes\r
223 );\r
224\r
c4671a67 225EFI_STATUS\r
226CpuMpServicesInit (\r
227 VOID\r
228 );\r
229\r
230EFI_STATUS\r
231EFIAPI\r
232CpuMpServicesWhoAmI (\r
233 IN EFI_MP_SERVICES_PROTOCOL *This,\r
234 OUT UINTN *ProcessorNumber\r
235 );\r
236\r
237extern EFI_MP_SERVICES_PROTOCOL mMpSercicesTemplate;\r
238\r
239\r
949f388f 240#endif\r