From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=pass header.i=@semihalf-com.20150623.gappssmtp.com header.s=20150623 header.b=b0+QRM/4; spf=none, err=SPF record not found (domain: semihalf.com, ip: 209.85.160.194, mailfrom: mw@semihalf.com) Received: from mail-qt1-f194.google.com (mail-qt1-f194.google.com [209.85.160.194]) by groups.io with SMTP; Wed, 24 Apr 2019 06:48:35 -0700 Received: by mail-qt1-f194.google.com with SMTP id g4so901649qtq.10 for ; Wed, 24 Apr 2019 06:48:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf-com.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=H0iFwTClrTtgtbAnW9+6NnU3QFmuQIO6/Gy9q/d7K/M=; b=b0+QRM/4kBvFoRvl4VDT3qpa6tl0gCGeiDMh88Av0KCBynKVbCTqxcqJ8ld/WT9atA 8nA6TNC/5i4g1O2/I448qdKVW16mKF9jml54w2oIP5sy201wuwBWUau4LCEqWa090C1T 8FmX0hVf+gGVv1h8R+kBdeVCq+fAGAUBpAYekvcxJ32cSrDI0NIfcS0jWfFiyUFidpom axaO5qTjwXi95ovDav41u3g0PlBq2olq3cGSfounrmFdDBe+Arxj0Dhrs5W3Mkr5c4tA 96vEI3K4z2/kyDpdj2FZvc0nRqgIMj/RSpxOHeyINazF3QIlCu02EuW1udu0abr7bMD6 6vUA== 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:content-transfer-encoding; bh=H0iFwTClrTtgtbAnW9+6NnU3QFmuQIO6/Gy9q/d7K/M=; b=unfSuZ89wmZb/+CjU8m87EYrPW1CMH2Pbb3tImww/n0JVpmA44oBs9+SIYdaW+qItv 9bi+8yy3WIoxn1cj7ZLgsxkmDXU+o3JLWqaYbfR4aX67SYNcVnUJSJ+D8wjkJerFyw6S U0ppRj9VCddd5y4PTp6DJwsPTtWQ939JBySjZkS/NuIm42d0FkYvoL39s00mEF7GYVv0 vEgevg89+3FSmzFQmJYwyVn8AXM1thIcVIKKcu2+K5RyQi2hTqa2FIf3n8/qr72lpeLu XuV9+l7Te7renL75xBCPHIEze2uO2ZyFtZrHxxVUGWwHOREC2SuiZeGcvLDP6fFTvuMw SaSQ== X-Gm-Message-State: APjAAAWl7Tca4JszA1SYqtYtjbnumbLxBD8d6iMZHllqJeBMjOKITnxW 2lNazDyRQMU5XIKsVLDffvUWWexlIMLKDy92pl75/g== X-Google-Smtp-Source: APXvYqwYgOKsmnABbtzXW3cIQoJHM8/9k34YvI32e6dEQxBuVifMCsdNgCcn2tbrpizeIvRp03MMjUsFEO9Lpf820EE= X-Received: by 2002:a0c:b505:: with SMTP id d5mr25758449qve.62.1556113713728; Wed, 24 Apr 2019 06:48:33 -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: "Marcin Wojtas" Date: Wed, 24 Apr 2019 15:48:23 +0200 Message-ID: Subject: Re: [edk2-platforms: PATCH v2 3/3] Marvell/Drivers: Add non-mmio mode to MvFvbDxe To: Ard Biesheuvel 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" Content-Transfer-Encoding: quoted-printable Hi Ard, =C5=9Br., 24 kwi 2019 o 15:02 Ard Biesheuvel na= pisa=C5=82(a): > > 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 w= ithout > > > relying on it to be memory mapped. It adds PcdSpiMemoryMapped PCD tha= t > > > allows to switch between the modes. When in non-memory-mapped mode th= e > > > driver will copy the variables from flash to previously allocated buf= fer > > > and set PcdFlashNvStorageVariableBase64, PcdFlashNvStorageFtwWorkingB= ase64 > > > 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.de= c > > > index 7210ba2..a23c329 100644 > > > --- a/Silicon/Marvell/Marvell.dec > > > +++ b/Silicon/Marvell/Marvell.dec > > > @@ -58,6 +58,12 @@ > > > > > > gMarvellFvbDxeGuid =3D { 0x42903750, 0x7e61, 0x4aaf, { 0x83, 0x29,= 0xbf, 0x42, 0x36, 0x4e, 0x24, 0x85 } } > > > gMarvellSpiFlashDxeGuid =3D { 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 =3D { 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|0xF= 93C0000 > > > + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64|0xF= 93E0000 > > > + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|0= xF93D0000 > > > + > > > [PcdsFixedAtBuild.common] > > > gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"MARVELL_= EFI" > > > gArmPlatformTokenSpaceGuid.PcdCoreCount|4 > > > @@ -396,11 +401,10 @@ > > > # Variable store - default values > > > # > > > gMarvellTokenSpaceGuid.PcdSpiMemoryBase|0xF9000000 > > > - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|0xF= 93C0000 > > > + gMarvellTokenSpaceGuid.PcdSpiMemoryMapped|TRUE > > > + gMarvellTokenSpaceGuid.PcdSpiVariableOffset|0x3C0000 > > > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize|0x000= 10000 > > > - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|0= xF93D0000 > > > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize|0x0= 0010000 > > > - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64|0xF= 93E0000 > > > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize|0x000= 10000 > > > > > > !if $(CAPSULE_ENABLE) > > > diff --git a/Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.inf b/Sili= con/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. > Thanks for the hint, I'll try that. I tried to modify dependencies within edk2-platforms to explicitly cover FaultTolerantWriteDxe.inf and gEfiCpuArchProtocolGuid, but did not succeed. With this patch the things work properly, but I am wondering if only by luck. I found following line in BaseTools/Source/Python/UPT/Xml/XmlParser.py: DxeObj.SetDepex("gEfiBdsArchProtocolGuid AND \ngEfiCpuArchProtocolGuid AND\n" + \ it seems not to apply for MvFvbDxe though. So simply it may be an order of entries in Armada7k8k.fdf file. Best regards, Marcin > > > > > diff --git a/Silicon/Marvell/Drivers/Spi/MvFvbDxe/MvFvbDxe.h b/Silico= n/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/Silico= n/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= =3D { > > > > > > 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 =3D 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 |=3D EFI_FVB2_MEMORY_MAPPED; > > > + } > > > + > > > FirmwareVolumeHeader->HeaderLength =3D sizeof (EFI_FIRMWARE_VOLUME= _HEADER) + > > > sizeof (EFI_FV_BLOCK_MAP_ENTR= Y); > > > FirmwareVolumeHeader->Revision =3D 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 =3D 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 |=3D 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->Spi= Device, > > > - DataOffset, > > > - *NumBytes, > > > - Buffer); > > > + Status =3D 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 =3D 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 =3D PcdGet64 (PcdSpiMemoryBase); > > > - FlashInstance->RegionBaseAddress =3D FixedPcdGet64 (PcdFlashNvStor= ageVariableBase64); > > > - FlashInstance->FvbOffset =3D FlashInstance->RegionBaseAddress - > > > - FlashInstance->DeviceBaseAddress; > > > - FlashInstance->FvbSize =3D PcdGet32(PcdFlashNvStorageVariableSize)= + > > > - PcdGet32(PcdFlashNvStorageFtwWorkingSize)= + > > > - PcdGet32(PcdFlashNvStorageFtwSpareSize); > > > + VariableSize =3D PcdGet32 (PcdFlashNvStorageVariableSize); > > > + FtwWorkingSize =3D PcdGet32 (PcdFlashNvStorageFtwWorkingSize); > > > + FtwSpareSize =3D PcdGet32 (PcdFlashNvStorageFtwSpareSize); > > > + > > > + FlashInstance->IsMemoryMapped =3D PcdGetBool (PcdSpiMemoryMapped); > > > + FlashInstance->FvbSize =3D VariableSize + FtwWorkingSize + FtwSpar= eSize; > > > + FlashInstance->FvbOffset =3D PcdGet32 (PcdSpiVariableOffset); > > > > > > FlashInstance->Media.MediaId =3D 0; > > > FlashInstance->Media.BlockSize =3D FlashInstance->SpiDevice.Info->= SectorSize; > > > FlashInstance->Media.LastBlock =3D FlashInstance->Size / > > > FlashInstance->Media.BlockSize - = 1; > > > > > > + if (FlashInstance->IsMemoryMapped) { > > > + FlashInstance->DeviceBaseAddress =3D PcdGet64 (PcdSpiMemoryBase)= ; > > > + FlashInstance->RegionBaseAddress =3D PcdGet64 (PcdFlashNvStorage= VariableBase64); > > > + } else { > > > + MemorySize =3D EFI_SIZE_TO_PAGES (FlashInstance->FvbSize); > > > + > > > + // FaultTolerantWriteDxe requires memory to be aligned to FtwWor= kingSize > > > + FlashInstance->RegionBaseAddress =3D (UINTN) AllocateAlignedRunt= imePages (MemorySize, > > > + SIZE_64KB); > > > + if (FlashInstance->RegionBaseAddress =3D=3D (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 =3D GET_DATA_OFFSET (FlashInstance->FvbOffset, > > > + FlashInstance->StartLba, > > > + FlashInstance->Media.BlockSize); > > > + *NumBytes =3D FlashInstance->FvbSize; > > > + Status =3D FlashInstance->SpiFlashProtocol->Read (&FlashInstance= ->SpiDevice, > > > + DataOffset, > > > + *NumBytes, > > > + (VOID *)FlashInstanc= e->RegionBaseAddress); > > > + if (EFI_ERROR (Status)) { > > > + goto ErrorFreeAllocatedPages; > > > + } > > > + } > > > + > > > Status =3D gBS->InstallMultipleProtocolInterfaces (&FlashInstance-= >Handle, > > > &gEfiDevicePathProtocolGuid, &FlashInstance->Devic= ePath, > > > &gEfiFirmwareVolumeBlockProtocolGuid, &FlashInstan= ce->FvbProtocol, > > > NULL); > > > if (EFI_ERROR (Status)) { > > > - return Status; > > > + goto ErrorFreeAllocatedPages; > > > } > > > > > > Status =3D 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 =3D mFvbDevice->FvbSize; > > > RegionBaseAddress =3D mFvbDevice->RegionBaseAddress; > > > > > > - Status =3D 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", __FUNCT= ION__)); > > > - goto ErrorAddSpace; > > > - } > > > + if (mFvbDevice->IsMemoryMapped) { > > > + RuntimeMmioRegionSize =3D mFvbDevice->FvbSize; > > > + Status =3D 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", __FUN= CTION__)); > > > + goto ErrorAddSpace; > > > + } > > > > > > - Status =3D 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 =3D 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 > > >