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