On 02/23/15 16:28, Olivier Martin wrote:
> Actually for this one, would you mind to replace the 'ASSERT_EFI_ERROR
> (Status);' (the one after gDS->AddMemorySpace() and the one after
> gDS->SetMemorySpaceAttributes()) by:
>
> if (EFI_ERROR (Status)) {
> return Status;
> }
>
> ... or anything similar. It is mainly if the memory map changes between
> DEBUG and RELEASE for various reasons, it would be nice to prevent a
> crash in RELEASE.
>
> Except this comment:
>
> Reviewed-By: Olivier Martin <[email protected]>
Will do, thanks!
Laszlo
>
>
>
> On 23/02/15 14:29, Laszlo Ersek wrote:
>> Quite non-intuitively, we must allow guest-side writes to emulated PCI
>> MMIO regions to go through the CPU cache, otherwise QEMU, whose accesses
>> always go through the cache, may see stale data in the region.
>>
>> This change makes no difference for QEMU/TCG, but it is important for
>> QEMU/KVM, at the moment.
>>
>> Because gDS->SetMemorySpaceAttributes() is ultimately implemented by
>> EFI_CPU_ARCH_PROTOCOL.SetMemoryAttributes() -- see
>> "MdeModulePkg/Core/Dxe/Gcd/Gcd.c" and "ArmPkg/Drivers/CpuDxe/" -- we add
>> the CPU architectural protocol to the module's DepEx.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Laszlo Ersek <[email protected]>
>> ---
>>
>> Notes:
>> v3:
>> - use PcdPciMmio32* [Olivier]
>>
>> v2:
>> - new in v2, after testing VGA on KVM and picking a few brains
>>
>> ArmPlatformPkg/ArmVirtualizationPkg/PciHostBridgeDxe/PciHostBridgeDxe.inf
>> | 7 +++++-
>> ArmPlatformPkg/ArmVirtualizationPkg/PciHostBridgeDxe/PciHostBridge.c
>> | 13 +++++++++-
>> ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec
>> | 25 ++++++++++++++++++++
>> ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc
>> | 3 +++
>> 4 files changed, 46 insertions(+), 2 deletions(-)
>>
>> diff --git
>> a/ArmPlatformPkg/ArmVirtualizationPkg/PciHostBridgeDxe/PciHostBridgeDxe.inf
>> b/ArmPlatformPkg/ArmVirtualizationPkg/PciHostBridgeDxe/PciHostBridgeDxe.inf
>> index 5497fa6..ecea088 100644
>> ---
>> a/ArmPlatformPkg/ArmVirtualizationPkg/PciHostBridgeDxe/PciHostBridgeDxe.inf
>> +++
>> b/ArmPlatformPkg/ArmVirtualizationPkg/PciHostBridgeDxe/PciHostBridgeDxe.inf
>> @@ -24,6 +24,7 @@
>> [Packages]
>> MdePkg/MdePkg.dec
>> ArmPlatformPkg/ArmPlatformPkg.dec
>> + ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec
>>
>> [LibraryClasses]
>> UefiDriverEntryPoint
>> @@ -60,5 +61,9 @@
>> gArmPlatformTokenSpaceGuid.PcdPciMmio32Size
>> gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
>>
>> +[FeaturePcd]
>> + gArmVirtualizationTokenSpaceGuid.PcdKludgeMapPciMmioAsCached
>> +
>> [depex]
>> - gEfiMetronomeArchProtocolGuid
>> + gEfiMetronomeArchProtocolGuid AND
>> + gEfiCpuArchProtocolGuid
>> diff --git
>> a/ArmPlatformPkg/ArmVirtualizationPkg/PciHostBridgeDxe/PciHostBridge.c
>> b/ArmPlatformPkg/ArmVirtualizationPkg/PciHostBridgeDxe/PciHostBridge.c
>> index 50c12c2..0aa72a6 100644
>> --- a/ArmPlatformPkg/ArmVirtualizationPkg/PciHostBridgeDxe/PciHostBridge.c
>> +++ b/ArmPlatformPkg/ArmVirtualizationPkg/PciHostBridgeDxe/PciHostBridge.c
>> @@ -97,6 +97,7 @@ InitializePciHostBridge (
>> IN EFI_SYSTEM_TABLE *SystemTable
>> )
>> {
>> + UINT64 MmioAttributes;
>> EFI_STATUS Status;
>> UINTN Loop1;
>> UINTN Loop2;
>> @@ -133,11 +134,21 @@ InitializePciHostBridge (
>> );
>> ASSERT_EFI_ERROR (Status);
>>
>> + MmioAttributes = FeaturePcdGet (PcdKludgeMapPciMmioAsCached) ?
>> + EFI_MEMORY_WB : EFI_MEMORY_UC;
>> +
>> Status = gDS->AddMemorySpace (
>> EfiGcdMemoryTypeMemoryMappedIo,
>> PcdGet32 (PcdPciMmio32Base),
>> PcdGet32 (PcdPciMmio32Size),
>> - EFI_MEMORY_UC
>> + MmioAttributes
>> + );
>> + ASSERT_EFI_ERROR (Status);
>> +
>> + Status = gDS->SetMemorySpaceAttributes (
>> + PcdGet32 (PcdPciMmio32Base),
>> + PcdGet32 (PcdPciMmio32Size),
>> + MmioAttributes
>> );
>> ASSERT_EFI_ERROR (Status);
>>
>> diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec
>> b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec
>> index 9941154..d53dab9 100644
>> --- a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec
>> +++ b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec
>> @@ -56,3 +56,28 @@
>>
>>
>> gArmVirtualizationTokenSpaceGuid.PcdFwCfgSelectorAddress|0x0|UINT64|0x00000004
>>
>> gArmVirtualizationTokenSpaceGuid.PcdFwCfgDataAddress|0x0|UINT64|0x00000005
>> +
>> +[PcdsFeatureFlag]
>> + #
>> + # "Map PCI MMIO as Cached"
>> + #
>> + # Due to the way Stage1 and Stage2 mappings are combined on Aarch64, and
>> + # because KVM -- for the time being -- does not try to interfere with the
>> + # Stage1 mappings, we must not set EFI_MEMORY_UC for emulated PCI MMIO
>> + # regions.
>> + #
>> + # EFI_MEMORY_UC is mapped to Device-nGnRnE, and that Stage1 attribute
>> would
>> + # direct guest writes to host DRAM immediately, bypassing the cache
>> + # regardless of Stage2 attributes. However, QEMU's reads of the same range
>> + # can easily be served from the (stale) CPU cache.
>> + #
>> + # Setting this PCD to TRUE will use EFI_MEMORY_WB for mapping PCI MMIO
>> + # regions, which ensures that guest writes to such regions go through the
>> CPU
>> + # cache. Strictly speaking this is wrong, but it is needed as a temporary
>> + # workaround for emulated PCI devices. Setting the PCD to FALSE results in
>> + # the theoretically correct EFI_MEMORY_UC mapping, and should be the long
>> + # term choice, especially with assigned devices.
>> + #
>> + # The default is to turn off the kludge; DSC's can selectively enable it.
>> + #
>> +
>> gArmVirtualizationTokenSpaceGuid.PcdKludgeMapPciMmioAsCached|FALSE|BOOLEAN|0x00000006
>> diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc
>> b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc
>> index 1977610..66fe979 100644
>> --- a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc
>> +++ b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc
>> @@ -86,6 +86,9 @@
>> # It could be set FALSE to save size.
>> gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|FALSE
>>
>> + # Activate KVM workaround for now.
>> + gArmVirtualizationTokenSpaceGuid.PcdKludgeMapPciMmioAsCached|TRUE
>> +
>> [PcdsFixedAtBuild.common]
>> gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F
>>
>
>
> -- IMPORTANT NOTICE: The contents of this email and any attachments are
> confidential and may also be privileged. If you are not the intended
> recipient, please notify the sender immediately and do not disclose the
> contents to any other person, use it for any purpose, or store or copy the
> information in any medium. Thank you.
>
> ARM Limited, Registered office 110 Fulbourn Road, Cambridge CB1 9NJ,
> Registered in England & Wales, Company No: 2557590
> ARM Holdings plc, Registered office 110 Fulbourn Road, Cambridge CB1 9NJ,
> Registered in England & Wales, Company No: 2548782
>
>
> ------------------------------------------------------------------------------
> Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
> from Actuate! Instantly Supercharge Your Business Reports and Dashboards
> with Interactivity, Sharing, Native Excel Exports, App Integration & more
> Get technology previously reserved for billion-dollar corporations, FREE
> http://pubads.g.doubleclick.net/gampad/clk?id=190641631&iu=/4140/ostg.clktrk
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>
------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=190641631&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel