From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=pass header.i=@linaro.org header.s=google header.b=Ea5Dg4rA; spf=pass (domain: linaro.org, ip: 209.85.166.68, mailfrom: ard.biesheuvel@linaro.org) Received: from mail-io1-f68.google.com (mail-io1-f68.google.com [209.85.166.68]) by groups.io with SMTP; Wed, 24 Apr 2019 06:02:10 -0700 Received: by mail-io1-f68.google.com with SMTP id i21so15167173iol.7 for ; Wed, 24 Apr 2019 06:02:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=2EJGrXt4YURPk8L15dbfdH8erUWSIKUbS9wZwVD827s=; b=Ea5Dg4rAZ9Rzu5Kx5qX241tbEijGxrJ3C8Y+Nn0pfgrK8g461ioHHLZx0Sj6ZFe3W4 CpczkVOHKsbNSJBJKZpirN1DNt4rWw8OJqhfqBK7Nz0vLLnJBNdpeWojMhGXbTHaJI6i SsEtB52s0PqfZarOjCD9S3pwUc36f1JO1lU+u2lk2yik0pDMIY9+PmiQ+KMYPTl8AsEL OLuCM+OoB4qTPUPkhr+WZvq9Xh9yPbdmYwc38Hsue9K9Rp8sVQarKOfJ39aWm3trYlZH LbA0moah0N56WCWdyTjdlnp2vn4yyNsOHdZO4hGkfAumyRVPBGfQSFG3CoGN6s6zUdyo YyNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=2EJGrXt4YURPk8L15dbfdH8erUWSIKUbS9wZwVD827s=; b=X/BzuHvtPMCzYncnM7Qj7X8k1BsfLCQHqvU+l43myGtD8WBo84qejpEf/TP3+RZjY1 wpQ2zj4o8YqqnN9nd+p2ReqfWY9uv0RpMVov0Z+vN4XPrUVKnD0kh1+TdaD/wUFodkbN lU4LCyvuGkUp5hPBNs5lWhwEynWOK0HYrUKT7Kx3ELQctp+PMuOAOzC84HZ90T3OwCgw QVVMGcSpnSVkQBezIpNKBVG/mL7osi771Zaz3HgI9mBDG0It4eyIIuZODMkBeKfMjYPp xZx72y/BnMvUnNKGGiWW9Q8CY7CXaRT2tpGBPcaRQBJlhB/ncw5T3sz2hTYxvoVif3F2 cotg== X-Gm-Message-State: APjAAAWe7jrWgz1Oz80nsqgoQDqPln4Y4n1h+uOrihILeQP6ucLGTDF1 IH+wc18YV3V0vRUYUm6QjAKV69sqkqft5e+hussLOQ== X-Google-Smtp-Source: APXvYqwbdnSfe+N7hxVbYje/giLCftIWkabUP9nGPP/ysjRCiC2FNUfy3NQmjAxu0aovnOj7sw1WZYWb04AHjlsrWqI= X-Received: by 2002:a5e:9b17:: with SMTP id j23mr21977087iok.60.1556110929313; Wed, 24 Apr 2019 06:02:09 -0700 (PDT) MIME-Version: 1.0 References: <1556088711-14442-1-git-send-email-mw@semihalf.com> <1556088711-14442-4-git-send-email-mw@semihalf.com> In-Reply-To: From: "Ard Biesheuvel" Date: Wed, 24 Apr 2019 15:01:58 +0200 Message-ID: Subject: Re: [edk2-platforms: PATCH v2 3/3] Marvell/Drivers: Add non-mmio mode to MvFvbDxe To: Marcin Wojtas Cc: edk2-devel-groups-io , Leif Lindholm , =?UTF-8?B?SmFuIETEhWJyb8Wb?= , Grzegorz Jaszczyk , Kostya Porotchkin , Jici Gao , Kornel Duleba Content-Type: text/plain; charset="UTF-8" On Wed, 24 Apr 2019 at 09:11, Ard Biesheuvel wrote: > > On Wed, 24 Apr 2019 at 08:52, Marcin Wojtas wrote: > > > > From: Kornel Duleba > > > > This path enables support for reading variables directly from flash without > > relying on it to be memory mapped. It adds PcdSpiMemoryMapped PCD that > > allows to switch between the modes. When in non-memory-mapped mode the > > driver will copy the variables from flash to previously allocated buffer > > and set PcdFlashNvStorageVariableBase64, PcdFlashNvStorageFtwWorkingBase64 > > and PcdFlashNvStorageFtwSpareBase64 accordingly. > > > > Contributed-under: TianoCore Contribution Agreement 1.1 > > Signed-off-by: Marcin Wojtas > > --- > > Silicon/Marvell/Marvell.dec | 8 ++ > > Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc | 10 +- > > Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.inf | 17 ++- > > Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.h | 1 + > > Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.c | 135 +++++++++++++++----- > > 5 files changed, 135 insertions(+), 36 deletions(-) > > > > diff --git a/Silicon/Marvell/Marvell.dec b/Silicon/Marvell/Marvell.dec > > index 7210ba2..a23c329 100644 > > --- a/Silicon/Marvell/Marvell.dec > > +++ b/Silicon/Marvell/Marvell.dec > > @@ -58,6 +58,12 @@ > > > > gMarvellFvbDxeGuid = { 0x42903750, 0x7e61, 0x4aaf, { 0x83, 0x29, 0xbf, 0x42, 0x36, 0x4e, 0x24, 0x85 } } > > gMarvellSpiFlashDxeGuid = { 0x49d7fb74, 0x306d, 0x42bd, { 0x94, 0xc8, 0xc0, 0xc5, 0x4b, 0x18, 0x1d, 0xd7 } } > > + # > > + # Generic FaultTolerantWriteDxe driver use variables, > > + # whose setting is done in MvFvbDxe driver in case > > + # the SPI contents are not mapped in memory. > > + # > > + gFaultTolerantWriteDxeFileGuid = { 0xfe5cea76, 0x4f72, 0x49e8, { 0x98, 0x6f, 0x2c, 0xd8, 0x99, 0xdf, 0xfe, 0x5d} } > > > > [LibraryClasses] > > ArmadaBoardDescLib|Include/Library/ArmadaBoardDescLib.h > > @@ -140,6 +146,8 @@ > > #SPI > > gMarvellTokenSpaceGuid.PcdSpiRegBase|0|UINT32|0x3000051 > > gMarvellTokenSpaceGuid.PcdSpiMemoryBase|0|UINT64|0x3000059 > > + gMarvellTokenSpaceGuid.PcdSpiMemoryMapped|TRUE|BOOLEAN|0x3000060 > > + gMarvellTokenSpaceGuid.PcdSpiVariableOffset|0|UINT32|0x3000061 > > gMarvellTokenSpaceGuid.PcdSpiMaxFrequency|0|UINT32|0x30000052 > > gMarvellTokenSpaceGuid.PcdSpiClockFrequency|0|UINT32|0x30000053 > > > > diff --git a/Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc b/Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc > > index ca3de2e..d53d128 100644 > > --- a/Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc > > +++ b/Silicon/Marvell/Armada7k8k/Armada7k8k.dsc.inc > > @@ -256,6 +256,11 @@ > > # USB support > > gEfiMdeModulePkgTokenSpaceGuid.PcdTurnOffUsbLegacySupport|TRUE > > > > +[PcdsDynamicDefault.common] > > + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|0xF93C0000 > > + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64|0xF93E0000 > > + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|0xF93D0000 > > + > > [PcdsFixedAtBuild.common] > > gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"MARVELL_EFI" > > gArmPlatformTokenSpaceGuid.PcdCoreCount|4 > > @@ -396,11 +401,10 @@ > > # Variable store - default values > > # > > gMarvellTokenSpaceGuid.PcdSpiMemoryBase|0xF9000000 > > - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|0xF93C0000 > > + gMarvellTokenSpaceGuid.PcdSpiMemoryMapped|TRUE > > + gMarvellTokenSpaceGuid.PcdSpiVariableOffset|0x3C0000 > > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize|0x00010000 > > - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|0xF93D0000 > > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize|0x00010000 > > - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64|0xF93E0000 > > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize|0x00010000 > > > > !if $(CAPSULE_ENABLE) > > diff --git a/Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.inf b/Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.inf > > index ef10bfd..c85e8a6 100644 > > --- a/Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.inf > > +++ b/Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.inf > > @@ -76,13 +76,22 @@ > > gMarvellSpiMasterProtocolGuid > > > > [FixedPcd] > > - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 > > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize > > - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64 > > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize > > - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64 > > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize > > gMarvellTokenSpaceGuid.PcdSpiMemoryBase > > + gMarvellTokenSpaceGuid.PcdSpiMemoryMapped > > + gMarvellTokenSpaceGuid.PcdSpiVariableOffset > > + > > +[Pcd] > > + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 > > + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64 > > + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64 > > > > [Depex] > > - gEfiCpuArchProtocolGuid > > + # > > + # Generic FaultTolerantWriteDxe driver use variables, > > + # whose setting is done in MvFvbDxe driver in case > > + # the SPI contents are not mapped in memory. > > + # > > + BEFORE gFaultTolerantWriteDxeFileGuid > > Apologies for not spotting this before, but there is a problem here: > FaultTolerantWriteDxe.inf does not depend on gEfiCpuArchProtocolGuid, > but we do, and so we could now be dispatched before > gEfiCpuArchProtocolGuid becomes available. This means you need to > update the code to deal with that (or explain to me how if it already > does) > You should be able to fix this by adding a NULL resolution for EmbeddedPkg/Library/NvVarStoreFormattedLib/NvVarStoreFormattedLib.inf to the FTW driver, similar to what you are already doing for the variable driver. > > > diff --git a/Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.h b/Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.h > > index 31e6e44..e8df9a5 100644 > > --- a/Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.h > > +++ b/Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.h > > @@ -55,6 +55,7 @@ typedef struct { > > > > UINT32 Signature; > > > > + BOOLEAN IsMemoryMapped; > > UINTN DeviceBaseAddress; > > UINTN RegionBaseAddress; > > UINTN Size; > > diff --git a/Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.c b/Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.c > > index cb006cd..b4fd29c 100644 > > --- a/Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.c > > +++ b/Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.c > > @@ -52,6 +52,7 @@ STATIC CONST FVB_DEVICE mMvFvbFlashInstanceTemplate = { > > > > FVB_FLASH_SIGNATURE, // Signature > > > > + FALSE, // IsMemoryMapped ... NEED TO BE FILLED > > 0, // DeviceBaseAddress ... NEED TO BE FILLED > > 0, // RegionBaseAddress ... NEED TO BE FILLED > > SIZE_256KB, // Size > > @@ -175,11 +176,14 @@ MvFvbInitFvAndVariableStoreHeaders ( > > FirmwareVolumeHeader->Attributes = EFI_FVB2_READ_ENABLED_CAP | > > EFI_FVB2_READ_STATUS | > > EFI_FVB2_STICKY_WRITE | > > - EFI_FVB2_MEMORY_MAPPED | > > EFI_FVB2_ERASE_POLARITY | > > EFI_FVB2_WRITE_STATUS | > > EFI_FVB2_WRITE_ENABLED_CAP; > > > > + if (FlashInstance->IsMemoryMapped) { > > + FirmwareVolumeHeader->Attributes |= EFI_FVB2_MEMORY_MAPPED; > > + } > > + > > FirmwareVolumeHeader->HeaderLength = sizeof (EFI_FIRMWARE_VOLUME_HEADER) + > > sizeof (EFI_FV_BLOCK_MAP_ENTRY); > > FirmwareVolumeHeader->Revision = EFI_FVH_REVISION; > > @@ -349,10 +353,13 @@ MvFvbSetAttributes ( > > EFI_FVB_ATTRIBUTES_2 OldAttributes; > > EFI_FVB_ATTRIBUTES_2 FlashFvbAttributes; > > EFI_FVB_ATTRIBUTES_2 UnchangedAttributes; > > + FVB_DEVICE *FlashInstance; > > UINT32 Capabilities; > > UINT32 OldStatus; > > UINT32 NewStatus; > > > > + FlashInstance = INSTANCE_FROM_FVB_THIS (This); > > + > > // > > // Obtain attributes from FVB header > > // > > @@ -369,12 +376,15 @@ MvFvbSetAttributes ( > > EFI_FVB2_WRITE_ENABLED_CAP | \ > > EFI_FVB2_LOCK_CAP | \ > > EFI_FVB2_STICKY_WRITE | \ > > - EFI_FVB2_MEMORY_MAPPED | \ > > EFI_FVB2_ERASE_POLARITY | \ > > EFI_FVB2_READ_LOCK_CAP | \ > > EFI_FVB2_WRITE_LOCK_CAP | \ > > EFI_FVB2_ALIGNMENT; > > > > + if (FlashInstance->IsMemoryMapped) { > > + UnchangedAttributes |= EFI_FVB2_MEMORY_MAPPED; > > + } > > + > > // > > // Some attributes of FV is read only can *not* be set > > // > > @@ -692,6 +702,7 @@ MvFvbWrite ( > > IN UINT8 *Buffer > > ) > > { > > + EFI_STATUS Status; > > FVB_DEVICE *FlashInstance; > > UINTN DataOffset; > > > > @@ -701,10 +712,27 @@ MvFvbWrite ( > > FlashInstance->StartLba + Lba, > > FlashInstance->Media.BlockSize); > > > > - return FlashInstance->SpiFlashProtocol->Write (&FlashInstance->SpiDevice, > > - DataOffset, > > - *NumBytes, > > - Buffer); > > + Status = FlashInstance->SpiFlashProtocol->Write (&FlashInstance->SpiDevice, > > + DataOffset, > > + *NumBytes, > > + Buffer); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, > > + "%a: Failed to write to Spi device\n", > > + __FUNCTION__)); > > + return Status; > > + } > > + > > + // Update shadow buffer > > + if (!FlashInstance->IsMemoryMapped) { > > + DataOffset = GET_DATA_OFFSET (FlashInstance->RegionBaseAddress + Offset, > > + FlashInstance->StartLba + Lba, > > + FlashInstance->Media.BlockSize); > > + > > + CopyMem ((UINTN *)DataOffset, Buffer, *NumBytes); > > + } > > + > > + return EFI_SUCCESS; > > } > > > > /** > > @@ -975,6 +1003,9 @@ MvFvbConfigureFlashInstance ( > > ) > > { > > EFI_STATUS Status; > > + UINTN *NumBytes; > > + UINTN DataOffset; > > + UINTN VariableSize, FtwWorkingSize, FtwSpareSize, MemorySize; > > > > > > // Locate SPI protocols > > @@ -1009,25 +1040,62 @@ MvFvbConfigureFlashInstance ( > > } > > > > // Fill remaining flash description > > - FlashInstance->DeviceBaseAddress = PcdGet64 (PcdSpiMemoryBase); > > - FlashInstance->RegionBaseAddress = FixedPcdGet64 (PcdFlashNvStorageVariableBase64); > > - FlashInstance->FvbOffset = FlashInstance->RegionBaseAddress - > > - FlashInstance->DeviceBaseAddress; > > - FlashInstance->FvbSize = PcdGet32(PcdFlashNvStorageVariableSize) + > > - PcdGet32(PcdFlashNvStorageFtwWorkingSize) + > > - PcdGet32(PcdFlashNvStorageFtwSpareSize); > > + VariableSize = PcdGet32 (PcdFlashNvStorageVariableSize); > > + FtwWorkingSize = PcdGet32 (PcdFlashNvStorageFtwWorkingSize); > > + FtwSpareSize = PcdGet32 (PcdFlashNvStorageFtwSpareSize); > > + > > + FlashInstance->IsMemoryMapped = PcdGetBool (PcdSpiMemoryMapped); > > + FlashInstance->FvbSize = VariableSize + FtwWorkingSize + FtwSpareSize; > > + FlashInstance->FvbOffset = PcdGet32 (PcdSpiVariableOffset); > > > > FlashInstance->Media.MediaId = 0; > > FlashInstance->Media.BlockSize = FlashInstance->SpiDevice.Info->SectorSize; > > FlashInstance->Media.LastBlock = FlashInstance->Size / > > FlashInstance->Media.BlockSize - 1; > > > > + if (FlashInstance->IsMemoryMapped) { > > + FlashInstance->DeviceBaseAddress = PcdGet64 (PcdSpiMemoryBase); > > + FlashInstance->RegionBaseAddress = PcdGet64 (PcdFlashNvStorageVariableBase64); > > + } else { > > + MemorySize = EFI_SIZE_TO_PAGES (FlashInstance->FvbSize); > > + > > + // FaultTolerantWriteDxe requires memory to be aligned to FtwWorkingSize > > + FlashInstance->RegionBaseAddress = (UINTN) AllocateAlignedRuntimePages (MemorySize, > > + SIZE_64KB); > > + if (FlashInstance->RegionBaseAddress == (UINTN) NULL) { > > + return EFI_OUT_OF_RESOURCES; > > + } > > + > > + PcdSet64 (PcdFlashNvStorageVariableBase64, > > + (UINT64) FlashInstance->RegionBaseAddress); > > + PcdSet64 (PcdFlashNvStorageFtwWorkingBase64, > > + (UINT64) FlashInstance->RegionBaseAddress > > + + VariableSize); > > + PcdSet64 (PcdFlashNvStorageFtwSpareBase64, > > + (UINT64) FlashInstance->RegionBaseAddress > > + + VariableSize > > + + FtwWorkingSize); > > + > > + // Fill the buffer with data from flash > > + DataOffset = GET_DATA_OFFSET (FlashInstance->FvbOffset, > > + FlashInstance->StartLba, > > + FlashInstance->Media.BlockSize); > > + *NumBytes = FlashInstance->FvbSize; > > + Status = FlashInstance->SpiFlashProtocol->Read (&FlashInstance->SpiDevice, > > + DataOffset, > > + *NumBytes, > > + (VOID *)FlashInstance->RegionBaseAddress); > > + if (EFI_ERROR (Status)) { > > + goto ErrorFreeAllocatedPages; > > + } > > + } > > + > > Status = gBS->InstallMultipleProtocolInterfaces (&FlashInstance->Handle, > > &gEfiDevicePathProtocolGuid, &FlashInstance->DevicePath, > > &gEfiFirmwareVolumeBlockProtocolGuid, &FlashInstance->FvbProtocol, > > NULL); > > if (EFI_ERROR (Status)) { > > - return Status; > > + goto ErrorFreeAllocatedPages; > > } > > > > Status = MvFvbPrepareFvHeader (FlashInstance); > > @@ -1043,6 +1111,12 @@ ErrorPrepareFvbHeader: > > &gEfiFirmwareVolumeBlockProtocolGuid, > > NULL); > > > > +ErrorFreeAllocatedPages: > > + if (!FlashInstance->IsMemoryMapped) { > > + FreeAlignedPages ((VOID *)FlashInstance->RegionBaseAddress, > > + MemorySize); > > + } > > + > > return Status; > > } > > > > @@ -1094,24 +1168,27 @@ MvFvbEntryPoint ( > > // > > // Declare the Non-Volatile storage as EFI_MEMORY_RUNTIME > > // > > - RuntimeMmioRegionSize = mFvbDevice->FvbSize; > > RegionBaseAddress = mFvbDevice->RegionBaseAddress; > > > > - Status = gDS->AddMemorySpace (EfiGcdMemoryTypeMemoryMappedIo, > > - RegionBaseAddress, > > - RuntimeMmioRegionSize, > > - EFI_MEMORY_UC | EFI_MEMORY_RUNTIME); > > - if (EFI_ERROR (Status)) { > > - DEBUG ((DEBUG_ERROR, "%a: Failed to add memory space\n", __FUNCTION__)); > > - goto ErrorAddSpace; > > - } > > + if (mFvbDevice->IsMemoryMapped) { > > + RuntimeMmioRegionSize = mFvbDevice->FvbSize; > > + Status = gDS->AddMemorySpace (EfiGcdMemoryTypeMemoryMappedIo, > > + RegionBaseAddress, > > + RuntimeMmioRegionSize, > > + EFI_MEMORY_UC | EFI_MEMORY_RUNTIME); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: Failed to add memory space\n", __FUNCTION__)); > > + goto ErrorAddSpace; > > + } > > > > - Status = gDS->SetMemorySpaceAttributes (RegionBaseAddress, > > - RuntimeMmioRegionSize, > > - EFI_MEMORY_UC | EFI_MEMORY_RUNTIME); > > - if (EFI_ERROR (Status)) { > > - DEBUG ((DEBUG_ERROR, "%a: Failed to set memory attributes\n", __FUNCTION__)); > > - goto ErrorSetMemAttr; > > + > > + Status = gDS->SetMemorySpaceAttributes (RegionBaseAddress, > > + RuntimeMmioRegionSize, > > + EFI_MEMORY_UC | EFI_MEMORY_RUNTIME); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: Failed to set memory attributes\n", __FUNCTION__)); > > + goto ErrorSetMemAttr; > > + } > > } > > > > // > > -- > > 2.7.4 > >