/** @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;
}