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