17#include <Protocol/PciRootBridgeIo.h>
18#include <Library/UefiBootServicesTableLib.h>
19#include <Library/UefiRuntimeServicesTableLib.h>
20#include <Library/BaseLib.h>
21#include <Library/BaseMemoryLib.h>
22#include <Library/MemoryAllocationLib.h>
23#include <Library/PciLib.h>
24#include <Library/HobLib.h>
25#include <Library/IoLib.h>
26#include <Guid/GlobalVariable.h>
38#define FORCE_PROVISIONING 1
40#define R_SA_PAVPC (0x58)
42#define MmPciAddress(Segment, Bus, Device, Function, Register) \
43 ((UINTN) (PciRead32 (PCI_LIB_ADDRESS (0,0,0,0x60)) & 0xFC000000) + \
44 (UINTN) (Bus << 20) + (UINTN) (Device << 15) + (UINTN) \
45 (Function << 12) + (UINTN) (Register))
47#define MmPci32(Segment, Bus, Device, Function, Register) \
48 *((volatile UINT32 *) MmPciAddress (Segment, Bus, Device, Function, Register))
62 IN EFI_GUID *FvNameGuid,
69 UINT32 AuthenticationStatus;
72 EFI_HANDLE *HandleBuffer;
74 Status =
gBS->LocateHandleBuffer (
82 if (!EFI_ERROR (Status)) {
83 for (Index = 0; Index < NumOfHandles; ++Index) {
84 Status =
gBS->HandleProtocol (
87 (VOID **)&FirmwareVolumeInterface
90 if (EFI_ERROR (Status)) {
91 gBS->FreePool (HandleBuffer);
98 Status = FirmwareVolumeInterface->ReadSection (
99 FirmwareVolumeInterface,
105 &AuthenticationStatus
108 if (!EFI_ERROR (Status)) {
109 gBS->FreePool (HandleBuffer);
114 gBS->FreePool (HandleBuffer);
115 Status = EFI_NOT_FOUND;
121 if (EFI_ERROR (Status)) {
122 DEBUG ((DEBUG_INFO,
"OCPAVP: No %g in firmware, using default - %r\n", FvNameGuid, Status));
135 Status = EFI_SUCCESS;
137 Status = EFI_NOT_FOUND;
149 OUT UINT32 *EpidGroupPublicKeysCount
153 UINTN EpidCertificateSize;
154 UINTN EpidGroupPublicKeysSize;
158 (VOID **)EpidCertificate,
162 if (EFI_ERROR (Status)) {
168 (VOID **)EpidGroupPublicKeys,
169 &EpidGroupPublicKeysSize
172 if (EFI_ERROR (Status)) {
173 gBS->FreePool (*EpidGroupPublicKeys);
184 gBS->FreePool (*EpidCertificate);
185 gBS->FreePool (*EpidGroupPublicKeys);
186 return EFI_VOLUME_CORRUPTED;
196 #ifdef FORCE_PROVISIONING
203 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
214 IN UINTN PublicKeyCount,
222 Status = EFI_NOT_FOUND;
224 for (Index = 0; Index < PublicKeyCount; ++Index) {
225 if (SwapBytes32 (PublicKeys[Index].GroupId) == Key) {
226 *ChosenPublicKey = &PublicKeys[Index];
242 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *Interface;
244 Status =
gBS->LocateProtocol (
250 if (EFI_ERROR (Status)) {
251 DEBUG ((DEBUG_INFO,
"OCPAVP: Failed to find PCI root protocol - %r\n", Status));
261 Status = Interface->Pci.Read (
269 if (EFI_ERROR (Status)) {
270 DEBUG ((DEBUG_INFO,
"OCPAVP: Failed to read from IGPU device - %r\n", Status));
274 DEBUG ((DEBUG_INFO,
"OCPAVP: IGPU is %X\n", Value));
276 return Value != 0xFFFFFFFFU;
290 DataSize =
sizeof (Data);
292 Status =
gRT->GetVariable (
300 #ifdef FORCE_PROVISIONING
304 if (EFI_ERROR (Status) || (Data != 1)) {
309 return EFI_NOT_FOUND;
329 DEBUG ((DEBUG_INFO,
"OCPAVP: HOB for FPF is %p\n", Hob));
332 DataSize =
sizeof (Data);
333 Status =
gRT->GetVariable (
341 if (EFI_ERROR (Status) || (Data != 1)) {
345 return EFI_NOT_FOUND;
348 return EFI_UNSUPPORTED;
361 UINT32 EpidGroupPublicKeysCount;
368 DEBUG ((DEBUG_INFO,
"OCPAVP: Needs provisioning EPID - %r\n", Status));
369 if (EFI_ERROR (Status)) {
370 return EFI_ALREADY_STARTED;
374 DEBUG ((DEBUG_INFO,
"OCPAVP: HECI protocol lookup - %r\n", Status));
375 if (EFI_ERROR (Status)) {
381 &EpidGroupPublicKeys,
382 &EpidGroupPublicKeysCount
384 DEBUG ((DEBUG_INFO,
"OCPAVP: Provisioning data - %r\n", Status));
385 if (EFI_ERROR (Status)) {
395 if (EFI_ERROR (Status)) {
399 Status = EFI_NOT_FOUND;
409 "OCPAVP: Client %u has %g protocol - %r\n",
415 if (EFI_ERROR (Status)) {
425 DEBUG ((DEBUG_INFO,
"OCPAVP: Found application at %u\n", (UINT32)Index));
428 if (!EFI_ERROR (Status)) {
429 EpidStatus = EpidGroupId = 0;
432 DEBUG ((DEBUG_INFO,
"OCPAVP: Got EPID status %X and group id %x - %r\n", EpidStatus, EpidGroupId, Status));
435 if (!EFI_ERROR (Status)) {
441 EpidGroupPublicKeysCount,
443 &EpidCurrentGroupPublicKey
446 DEBUG ((DEBUG_INFO,
"OCPAVP: Got EPID group public key - %r\n", Status));
448 if (!EFI_ERROR (Status)) {
450 DEBUG ((DEBUG_INFO,
"OCPAVP: Sent EPID certificate - %r / %d\n", Status,
SetVar));
451 if (!EFI_ERROR (Status) ||
SetVar) {
460 DEBUG ((DEBUG_INFO,
"OCPAVP: No EPID application found\n"));
468 Status = EFI_NOT_FOUND;
472 gBS->FreePool (EpidCertificate);
473 gBS->FreePool (EpidGroupPublicKeys);
489 DEBUG ((DEBUG_INFO,
"OCPAVP: Needs provisioning FPF - %r\n", Status));
490 if (EFI_ERROR (Status)) {
491 return EFI_ALREADY_STARTED;
495 DEBUG ((DEBUG_INFO,
"OCPAVP: HECI protocol lookup - %r\n", Status));
496 if (EFI_ERROR (Status)) {
506 if (EFI_ERROR (Status)) {
510 Status = EFI_NOT_FOUND;
520 "OCPAVP: Client %u has %g protocol - %r\n",
526 if (EFI_ERROR (Status)) {
536 DEBUG ((DEBUG_INFO,
"OCPAVP: Found application at %u\n", (UINT32)Index));
544 if (!EFI_ERROR (Status)) {
546 DEBUG ((DEBUG_INFO,
"OCPAVP: Got FPF status %u - %r\n", FpfStatus, Status));
547 if (!EFI_ERROR (Status)) {
548 if (FpfStatus == 250) {
550 DEBUG ((DEBUG_INFO,
"OCPAVP: Got FPF provisioning %u - %r\n", FpfStatus, Status));
551 if (!EFI_ERROR (Status) && (FpfStatus == 0)) {
554 Status = EFI_DEVICE_ERROR;
557 Status = EFI_DEVICE_ERROR;
564 DEBUG ((DEBUG_INFO,
"OCPAVP: No FPF application found\n"));
572 Status = EFI_NOT_FOUND;
587 DEBUG ((DEBUG_INFO,
"OCPAVP: Checking PAVPC register...\n"));
591 DEBUG ((DEBUG_INFO,
"OCPAVP: Current PAVPC is %X\n", PAVPC));
593 if ((PAVPC & BIT2) == 0) {
596 DEBUG ((DEBUG_INFO,
"OCPAVP: New PAVPC is %X\n", PAVPC));
599 DEBUG ((DEBUG_INFO,
"OCPAVP: Starting EPID provisioning\n"));
603 DEBUG ((DEBUG_INFO,
"OCPAVP: Done EPID provisioning - %r\n", Status));
606 DEBUG ((DEBUG_INFO,
"OCPAVP: Starting FPF provisioning\n"));
610 DEBUG ((DEBUG_INFO,
"OCPAVP: Done FPF provisioning - %r\n", Status));
617 IN EFI_HANDLE ImageHandle,
618 IN EFI_SYSTEM_TABLE *SystemTable
#define APPLE_EPID_PROVISIONED_VARIABLE_NAME
#define APPLE_FPF_PROVISIONED_VARIABLE_NAME
EFI_GUID gAppleFpfConfigurationHobGuid
EFI_GUID gAppleEpidCertificateFileGuid
EFI_GUID gAppleEpidGroupPublicKeysFileGuid
EFI_GUID gEfiFirmwareVolumeProtocolGuid
STATIC EFI_STATUS SetVar(UINTN Line, CHAR8 *Token, BOOLEAN IsIndented, BOOLEAN ContainsVars)
EFI_GUID gMeFpfProtocolGuid
#define EPID_STATUS_PROVISIONED
#define EPID_CERTIFICATE_SIZE
EFI_GUID gMePavpProtocolGuid
#define EPID_GROUP_PUBLIC_KEY_SIZE
#define EPID_STATUS_CAN_PROVISION
#define HBM_ME_CLIENT_MAX
EFI_STATUS HeciDisconnectFromClients(VOID)
EFI_STATUS HeciPavpPerformProvisioning(IN EPID_CERTIFICATE *EpidCertificate, IN EPID_GROUP_PUBLIC_KEY *EpidGroupPublicKey, OUT BOOLEAN *SetVar OPTIONAL)
EFI_STATUS HeciPavpRequestProvisioning(OUT UINT32 *EpidStatus, OUT UINT32 *EpidGroupId)
EFI_STATUS HeciLocateProtocol(VOID)
EFI_STATUS HeciConnectToClient(IN UINT8 Address)
EFI_STATUS HeciFpfGetStatus(OUT UINT32 *FpfStatus)
EFI_STATUS HeciFpfProvision(OUT UINT32 *FpfStatus)
EFI_STATUS HeciGetClientMap(OUT UINT8 *ClientMap, OUT UINT8 *ClientActiveCount)
EFI_STATUS HeciGetClientProperties(IN UINT8 Address, OUT HECI_CLIENT_PROPERTIES *Properties)
#define SECONDS_TO_MICROSECONDS(x)
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
STATIC BOOLEAN IsBuiltinGpuAvailable(VOID)
STATIC EFI_STATUS NeedsEpidProvisioning(VOID)
STATIC UINT8 mMeClientActiveCount
UINTN gDefaultAppleEpidCertificateSize
EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
STATIC VOID SetProvisioningVariable(IN CHAR16 *Variable, IN UINT32 Value)
STATIC UINT8 mMeClientMap[HBM_ME_CLIENT_MAX]
STATIC EFI_STATUS ReadProvisioningDataFile(IN EFI_GUID *FvNameGuid, OUT VOID **Buffer, OUT UINTN *BufferSize)
STATIC EFI_STATUS GetGroupPublicKey(IN EPID_GROUP_PUBLIC_KEY *PublicKeys, IN UINTN PublicKeyCount, IN UINT32 Key, OUT EPID_GROUP_PUBLIC_KEY **ChosenPublicKey)
EFI_STATUS OcPerformEpidProvisioning(VOID)
UINT8 gDefaultAppleEpidCertificate[]
STATIC VOID OcPerformProvisioning(VOID)
STATIC EFI_STATUS ReadProvisioningData(OUT EPID_CERTIFICATE **EpidCertificate, OUT EPID_GROUP_PUBLIC_KEY **EpidGroupPublicKeys, OUT UINT32 *EpidGroupPublicKeysCount)
EFI_STATUS OcPerformFpfProvisioning(VOID)
STATIC EFI_STATUS NeedsFpfProvisioning(VOID)
UINTN gDefaultAppleGroupPublicKeysSize
#define MmPci32(Segment, Bus, Device, Function, Register)
UINT8 gDefaultAppleGroupPublicKeys[]
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
EFI_RUNTIME_SERVICES * gRT
EFI_GUID gEfiPciRootBridgeIoProtocolGuid
EFI_GUID gEfiGlobalVariableGuid
VOID *EFIAPI GetFirstGuidHob(IN CONST EFI_GUID *Guid)