> -----Original Message-----
> From: Laszlo Ersek [mailto:[email protected]]
> Sent: 11 December 2014 02:46
> To: [email protected]; [email protected];
> [email protected]; [email protected]
> Subject: [edk2] [PATCH v3 01/13] ArmVirtualizationPkg: VirtFdtDxe:
> forward FwCfg addresses from DTB to PCDs
> 
> Qemu's firmware configuration interface for ARM consists of two MMIO
> registers, a 16-bit selector, and a 64-bit data register that allows
> the
> guest to transfer data with 8, 16, 32, and 64-bit wide accesses. Parse
> the
> base address from the DTB, and expose the registers to the rest of DXE
> via
> dynamic PCDs.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Laszlo Ersek <[email protected]>
> ---
> 
> Notes:
>     v3:
>     - updated to the layout with 64-bit wide data register
> 
>     v2:
>     - use "qemu,fw-cfg-mmio" as compatible property
>     - the DTB node specifies a single contiguous region
> 
>  ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.inf |  2 ++
>  ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.c   | 24
> ++++++++++++++++++++++++
>  ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec  |  3 +++
>  ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc |  3 +++
>  4 files changed, 32 insertions(+)
> 
> diff --git
> a/ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.inf
> b/ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.inf
> index 1c9dd20..daafe6c 100644
> --- a/ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.inf
> +++ b/ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.inf
> @@ -47,6 +47,8 @@
>  [Pcd]
>    gArmVirtualizationTokenSpaceGuid.PcdDeviceTreeBaseAddress
>    gArmVirtualizationTokenSpaceGuid.PcdArmPsciMethod
> +  gArmVirtualizationTokenSpaceGuid.PcdFwCfgSelectorAddress
> +  gArmVirtualizationTokenSpaceGuid.PcdFwCfgDataAddress
>    gArmTokenSpaceGuid.PcdGicDistributorBase
>    gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase
>    gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum
> diff --git
> a/ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.c
> b/ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.c
> index d002e66..7050196 100644
> --- a/ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.c
> +++ b/ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.c
> @@ -44,6 +44,7 @@ typedef enum {
>    PropertyTypeUart,
>    PropertyTypeTimer,
>    PropertyTypePsci,
> +  PropertyTypeFwCfg,
>  } PROPERTY_TYPE;
> 
>  typedef struct {
> @@ -59,6 +60,7 @@ STATIC CONST PROPERTY CompatibleProperties[] = {
>    { PropertyTypeTimer,   "arm,armv7-timer"     },
>    { PropertyTypeTimer,   "arm,armv8-timer"     },
>    { PropertyTypePsci,    "arm,psci-0.2"        },
> +  { PropertyTypeFwCfg,   "qemu,fw-cfg-mmio"    },
>    { PropertyTypeUnknown, ""                    }
>  };
> 
> @@ -115,6 +117,10 @@ InitializeVirtFdtDxe (
>    CONST INTERRUPT_PROPERTY       *InterruptProp;
>    INT32                          SecIntrNum, IntrNum, VirtIntrNum,
> HypIntrNum;
>    CONST CHAR8                    *PsciMethod;
> +  UINT64                         FwCfgSelectorAddress;
> +  UINT64                         FwCfgSelectorSize;
> +  UINT64                         FwCfgDataAddress;
> +  UINT64                         FwCfgDataSize;
> 
>    DeviceTreeBase = (VOID *)(UINTN)PcdGet64 (PcdDeviceTreeBaseAddress);
>    ASSERT (DeviceTreeBase != NULL);
> @@ -160,6 +166,24 @@ InitializeVirtFdtDxe (
>        (PropType == PropertyTypePsci));
> 
>      switch (PropType) {
> +    case PropertyTypeFwCfg:
> +      ASSERT (Len == 2 * sizeof (UINT64));
> +
> +      FwCfgDataAddress     = fdt64_to_cpu (((UINT64 *)RegProp)[0]);
> +      FwCfgDataSize        = 8;
> +      FwCfgSelectorAddress = FwCfgDataAddress + FwCfgDataSize;
> +      FwCfgSelectorSize    = 2;
> +
> +      ASSERT (FwCfgSelectorAddress <= MAX_UINTN - FwCfgSelectorSize +
> 1);
> +      ASSERT (FwCfgDataAddress     <= MAX_UINTN - FwCfgDataSize     +
> 1);

I am not sure to understand these ASSERT().

Should it not be:
ASSERT (FwCfgSelectorAddress < (1 << (FwCfgSelectorSize - 1)));
ASSERT (FwCfgDataAddress     < (1 << (FwCfgDataSize  - 1));

Or

ASSERT (FwCfgSelectorAddress <= MAX_UINT64); // This one is likely to always
be true.
ASSERT (FwCfgDataAddress     <= MAX_UINT16);

If 'Address' means something else than base address of the MMIO registers
maybe a comment should be added to clarify these two assertions.

> +
> +      PcdSet64 (PcdFwCfgSelectorAddress, FwCfgSelectorAddress);
> +      PcdSet64 (PcdFwCfgDataAddress,     FwCfgDataAddress);
> +
> +      DEBUG ((EFI_D_INFO, "Found FwCfg @ 0x%Lx/0x%Lx\n",
> FwCfgSelectorAddress,
> +        FwCfgDataAddress));
> +      break;
> +
>      case PropertyTypeVirtio:
>        ASSERT (Len == 16);
>        //
> diff --git
> a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec
> b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec
> index b581add..9941154 100644
> --- a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec
> +++ b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec
> @@ -53,3 +53,6 @@
>    # PcdArmPsciMethod == 2 : use SMC
>    #
> 
> gArmVirtualizationTokenSpaceGuid.PcdArmPsciMethod|0|UINT32|0x00000003
> +
> +
> gArmVirtualizationTokenSpaceGuid.PcdFwCfgSelectorAddress|0x0|UINT64|0x0
> 0000004
> +
> gArmVirtualizationTokenSpaceGuid.PcdFwCfgDataAddress|0x0|UINT64|0x00000
> 005
> diff --git
> a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc
> b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc
> index 61689b7..1f3ddea 100644
> --- a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc
> +++ b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc
> @@ -173,6 +173,9 @@
> 
>    gArmVirtualizationTokenSpaceGuid.PcdArmPsciMethod|0
> 
> +  gArmVirtualizationTokenSpaceGuid.PcdFwCfgSelectorAddress|0x0
> +  gArmVirtualizationTokenSpaceGuid.PcdFwCfgDataAddress|0x0
> +
> 
> #######################################################################
> #########
>  #
>  # Components Section - list of all EDK II Modules needed by this
> Platform
> --
> 1.8.3.1
> 
> 
> 
> -----------------------------------------------------------------------
> -------
> 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=164703151&iu=/4140/ostg.c
> lktrk
> _______________________________________________
> 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=164703151&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to