public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Zeng, Star" <star.zeng@intel.com>
To: Liming Gao <liming.gao@intel.com>, edk2-devel@lists.01.org
Cc: Dandan Bi <dandan.bi@intel.com>, star.zeng@intel.com
Subject: Re: [Patch] MdeModulePkg PCD: Add DynamicEx PcdVpdBaseAddress64 for non SPI platform
Date: Mon, 26 Nov 2018 09:27:49 +0800	[thread overview]
Message-ID: <edf880e8-e939-ac2c-d3be-87fa9fada3b3@intel.com> (raw)
In-Reply-To: <20181122143250.29968-1-liming.gao@intel.com>

On 2018/11/22 22:32, Liming Gao wrote:
> https://bugzilla.tianocore.org/show_bug.cgi?id=1356
> Current PcdVpdBaseAddress is 32bit static Pcd. NON SPI platform needs to
> configure it as Dynamic PCD. Emulator platform (such as NT32) may set its
> value to 64bit address.
> To meet with this usage, 64bit DynamicEx PcdVpdBaseAddress64 is introduced.
> If its value is not zero, it will be used.
> If its value is zero, static PcdVpdBaseAddress will be used.
> When NON SPI platform enables VPD PCD, they need to set PcdVpdBaseAddress64.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Liming Gao <liming.gao@intel.com>
> Cc: Star Zeng <star.zeng@intel.com>
> Cc: Jian J Wang <jian.j.wang@intel.com>
> Cc: Dandan Bi <dandan.bi@intel.com>

Two minor comments at below, with them handled, Reviewed-by: Star Zeng 
<star.zeng@intel.com>


> ---
>   MdeModulePkg/Universal/PCD/Dxe/Pcd.c     | 16 ++++++++++++++++
>   MdeModulePkg/Universal/PCD/Dxe/Service.c |  3 ++-
>   MdeModulePkg/Universal/PCD/Pei/Service.c | 15 ++++++++++++++-
>   MdeModulePkg/MdeModulePkg.dec            |  8 ++++++++
>   MdeModulePkg/Universal/PCD/Dxe/Pcd.inf   |  3 ++-
>   MdeModulePkg/Universal/PCD/Dxe/Service.h |  2 ++
>   MdeModulePkg/Universal/PCD/Pei/Pcd.inf   |  3 ++-
>   7 files changed, 46 insertions(+), 4 deletions(-)
> 
> diff --git a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c
> index f977c7f18e..4e38a3844a 100644
> --- a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c
> +++ b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c
> @@ -109,6 +109,7 @@ EFI_GET_PCD_INFO_PROTOCOL  mEfiGetPcdInfoInstance = {
>   };
>   
>   EFI_HANDLE mPcdHandle = NULL;
> +UINTN      mVpdBaseAddress = 0;
>   
>   /**
>     Main entry for PCD DXE driver.
> @@ -175,6 +176,21 @@ PcdDxeInit (
>       &Registration
>       );
>   
> +  //
> +  // Cache VpdBaseAddress in entry point for the following usage.
> +  //
> +
> +  //
> +  // PcdVpdBaseAddress64 is DynamicEx PCD only. So, DxePcdGet64Ex() is used to get its value.
> +  //
> +  mVpdBaseAddress = (UINTN) DxePcdGet64Ex (&gEfiMdeModulePkgTokenSpaceGuid, PcdToken (PcdVpdBaseAddress64));
> +  if (mVpdBaseAddress == 0) {
> +    //
> +    // PcdVpdBaseAddress64 is not set, get value from PcdVpdBaseAddress.
> +    //
> +    mVpdBaseAddress = (UINTN) PcdGet32 (PcdVpdBaseAddress);
> +  }
> +
>     return Status;
>   }
>   
> diff --git a/MdeModulePkg/Universal/PCD/Dxe/Service.c b/MdeModulePkg/Universal/PCD/Dxe/Service.c
> index 0517152366..4b44153e13 100644
> --- a/MdeModulePkg/Universal/PCD/Dxe/Service.c
> +++ b/MdeModulePkg/Universal/PCD/Dxe/Service.c
> @@ -435,7 +435,8 @@ GetWorker (
>     switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {
>       case PCD_TYPE_VPD:
>         VpdHead = (VPD_HEAD *) ((UINT8 *) PcdDb + Offset);
> -      RetPtr = (VOID *) ((UINTN) PcdGet32 (PcdVpdBaseAddress) + VpdHead->Offset);
> +      ASSERT (mVpdBaseAddress != 0);
> +      RetPtr = (VOID *) (mVpdBaseAddress + VpdHead->Offset);
>   
>         break;
>   
> diff --git a/MdeModulePkg/Universal/PCD/Pei/Service.c b/MdeModulePkg/Universal/PCD/Pei/Service.c
> index bb4b52baf3..e1613e8af8 100644
> --- a/MdeModulePkg/Universal/PCD/Pei/Service.c
> +++ b/MdeModulePkg/Universal/PCD/Pei/Service.c
> @@ -861,6 +861,7 @@ GetWorker (
>     UINT32              LocalTokenNumber;
>     UINT32              LocalTokenCount;
>     UINT8               *VaraiableDefaultBuffer;
> +  UINTN               VpdBaseAddress;
>   
>     //
>     // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
> @@ -889,7 +890,19 @@ GetWorker (
>       {
>         VPD_HEAD *VpdHead;
>         VpdHead = (VPD_HEAD *) ((UINT8 *)PeiPcdDb + Offset);
> -      return (VOID *) ((UINTN) PcdGet32 (PcdVpdBaseAddress) + VpdHead->Offset);
> +
> +      //
> +      // PcdVpdBaseAddress64 is DynamicEx PCD only. So, PeiPcdGet64Ex() is used to get its value.
> +      //
> +      VpdBaseAddress = (UINTN) PeiPcdGet64Ex (&gEfiMdeModulePkgTokenSpaceGuid, PcdToken (PcdVpdBaseAddress64));
> +      if (VpdBaseAddress == 0) {
> +        //
> +        // PcdVpdBaseAddress64 is not set, get value from PcdVpdBaseAddress.
> +        //
> +        VpdBaseAddress = (UINTN) PcdGet32 (PcdVpdBaseAddress);
> +      }
> +      ASSERT (VpdBaseAddress != 0);
> +      return (VOID *)(VpdBaseAddress + VpdHead->Offset);
>       }
>   
>       case PCD_TYPE_HII|PCD_TYPE_STRING:
> diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
> index 0abacc1a90..f46a4094ca 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -2022,5 +2022,13 @@
>     # @Prompt NV Storage Default Value Buffer
>     gEfiMdeModulePkgTokenSpaceGuid.PcdNvStoreDefaultValueBuffer|{0x0}|VOID*|0x00030005
>   
> +  ## VPD type PCD allows a developer to point to an absolute physical address PcdVpdBaseAddress

1. PcdVpdBaseAddress should be PcdVpdBaseAddress64, right?

> +  #  to store PCD value. It will be DynamicExDefault only.
> +  #  It is used to set VPD region base address. So, it can't be DynamicExVpd PCD. Its value is
> +  #  required to be accessed in PcdDxe driver entry point. So, its value must be set in PEI phase.
> +  #  It can't depend on EFI variable service, and can't be DynamicExHii PCD.
> +  # @Prompt 64bit VPD base address.
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress64|0x0|UINT64|0x00030006

Please update MdeModulePkg.uni accordingly for this new PCD also.


Thanks,
Star

> +
>   [UserExtensions.TianoCore."ExtraFiles"]
>     MdeModulePkgExtra.uni
> diff --git a/MdeModulePkg/Universal/PCD/Dxe/Pcd.inf b/MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
> index 1f41a316bd..4ba78e46a3 100644
> --- a/MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
> +++ b/MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
> @@ -73,7 +73,7 @@
>   #
>   #      c) OEM specificed storage area:
>   #         - The PCD value is stored in OEM specified area which base address is
> -#           specified by a FixedAtBuild PCD setting - PcdVpdBaseAddress.
> +#           specified by PCD setting - PcdVpdBaseAddress64 or PcdVpdBaseAddress.
>   #         - The area is read only for PEI and DXE phase.
>   #         - [PcdsDynamicVpd] is used as section name for this type PCD in platform
>   #           DSC file. [PcdsDynamicExVpd] is for dynamicex type PCD.
> @@ -344,6 +344,7 @@
>   
>   [Pcd]
>     gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress      ## SOMETIMES_CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress64    ## SOMETIMES_CONSUMES
>     gEfiMdeModulePkgTokenSpaceGuid.PcdSetNvStoreDefaultId ## SOMETIMES_CONSUMES
>   
>   [Depex]
> diff --git a/MdeModulePkg/Universal/PCD/Dxe/Service.h b/MdeModulePkg/Universal/PCD/Dxe/Service.h
> index ddd5fa471e..3055e30cd1 100644
> --- a/MdeModulePkg/Universal/PCD/Dxe/Service.h
> +++ b/MdeModulePkg/Universal/PCD/Dxe/Service.h
> @@ -48,6 +48,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>     #error "Please make sure the version of PCD DXE Service and the generated PCD DXE Database match."
>   #endif
>   
> +extern UINTN     mVpdBaseAddress;
> +
>   /**
>     Retrieve additional information associated with a PCD token in the default token space.
>   
> diff --git a/MdeModulePkg/Universal/PCD/Pei/Pcd.inf b/MdeModulePkg/Universal/PCD/Pei/Pcd.inf
> index 6e28fce8fa..63b125d48a 100644
> --- a/MdeModulePkg/Universal/PCD/Pei/Pcd.inf
> +++ b/MdeModulePkg/Universal/PCD/Pei/Pcd.inf
> @@ -72,7 +72,7 @@
>   #
>   #      c) OEM specificed storage area:
>   #         - The PCD value is stored in OEM specified area which base address is
> -#           specified by a FixedAtBuild PCD setting - PcdVpdBaseAddress.
> +#           specified by PCD setting - PcdVpdBaseAddress64 or PcdVpdBaseAddress.
>   #         - The area is read only for PEI and DXE phase.
>   #         - [PcdsDynamicVpd] is used as section name for this type PCD in platform
>   #           DSC file. [PcdsDynamicExVpd] is for dynamicex type PCD.
> @@ -344,6 +344,7 @@
>   
>   [Pcd]
>     gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress ## SOMETIMES_CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress64 ## SOMETIMES_CONSUMES
>     gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPcdCallBackNumberPerPcdEntry ## SOMETIMES_CONSUMES
>     gEfiMdeModulePkgTokenSpaceGuid.PcdNvStoreDefaultValueBuffer ## SOMETIMES_CONSUMES
>     gEfiMdeModulePkgTokenSpaceGuid.PcdSetNvStoreDefaultId       ## CONSUMES
> 



  reply	other threads:[~2018-11-26  1:28 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-22 14:32 [Patch] MdeModulePkg PCD: Add DynamicEx PcdVpdBaseAddress64 for non SPI platform Liming Gao
2018-11-26  1:27 ` Zeng, Star [this message]
2018-11-26  2:44   ` Gao, Liming

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=edf880e8-e939-ac2c-d3be-87fa9fada3b3@intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox