/** @file Update the patched PCDs to their correct value Copyright (c) 2020, Linaro Ltd. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ /** * Patch the relevant PCDs of the RPMB driver with the correct address of the * allocated memory * **/ #include #include #include #include #include #include #include "OpTeeRpmbFvb.h" /** Fixup the Pcd values for variable storage Since the upper layers of EDK2 expect a memory mapped interface and we can't offer that from an RPMB, the driver allocates memory on init and passes that on the upper layers. Since the memory is dynamically allocated and we can't set the PCD in StMM context, we need to patch it correctly on each access @retval EFI_SUCCESS Protocol was found and PCDs patched up @retval EFI_INVALID_PARAMETER Invalid parameter @retval EFI_NOT_FOUND Protocol interface not found **/ EFI_STATUS EFIAPI FixPcdMemory ( VOID ) { EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbProtocol; MEM_INSTANCE *Instance; EFI_STATUS Status; // // Locate SmmFirmwareVolumeBlockProtocol // Status = gMmst->MmLocateProtocol ( &gEfiSmmFirmwareVolumeBlockProtocolGuid, NULL, (VOID **) &FvbProtocol ); ASSERT_EFI_ERROR (Status); Instance = INSTANCE_FROM_FVB_THIS (FvbProtocol); // Patch PCDs with the correct values PatchPcdSet64 (PcdFlashNvStorageVariableBase64, Instance->MemBaseAddress); PatchPcdSet64 ( PcdFlashNvStorageFtwWorkingBase64, Instance->MemBaseAddress + PcdGet32 (PcdFlashNvStorageVariableSize) ); PatchPcdSet64 ( PcdFlashNvStorageFtwSpareBase64, Instance->MemBaseAddress + PcdGet32 (PcdFlashNvStorageVariableSize) + PcdGet32 (PcdFlashNvStorageFtwWorkingSize) ); DEBUG ((DEBUG_INFO, "%a: Fixup PcdFlashNvStorageVariableBase64: 0x%lx\n", __FUNCTION__, PcdGet64 (PcdFlashNvStorageVariableBase64))); DEBUG ((DEBUG_INFO, "%a: Fixup PcdFlashNvStorageFtwWorkingBase64: 0x%lx\n", __FUNCTION__, PcdGet64 (PcdFlashNvStorageFtwWorkingBase64))); DEBUG ((DEBUG_INFO, "%a: Fixup PcdFlashNvStorageFtwSpareBase64: 0x%lx\n", __FUNCTION__, PcdGet64 (PcdFlashNvStorageFtwSpareBase64))); return Status; }