Yes.

Tim

-----Original Message-----
From: Yao, Jiewen [mailto:jiewen....@intel.com] 
Sent: Monday, May 09, 2016 6:42 PM
To: Kinney, Michael D <michael.d.kin...@intel.com>; Tim Lewis 
<tim.le...@insyde.com>; Mudusuru, Giri P <giri.p.mudus...@intel.com>; 
edk2-devel@lists.01.org
Cc: Mudusuru, Giri P <giri.p.mudus...@intel.com>; Zimmer, Vincent 
<vincent.zim...@intel.com>; Rangarajan, Ravi P <ravi.p.rangara...@intel.com>
Subject: RE: [edk2] [PATCH 17/19] IntelFspWrapperPkg/FspInit: Split FspInitPei 
to FspmWrapperPeim and FspsWrapperPeim.

Good discussion on PACKAGES_PATH usage.

For this specific case (FSP2 without FSP1.1 support), do we need change to 
IntelFsp2Pkg?

Thank you
Yao Jiewen

> -----Original Message-----
> From: Kinney, Michael D
> Sent: Friday, May 6, 2016 10:07 AM
> To: Tim Lewis <tim.le...@insyde.com>; Mudusuru, Giri P
> <giri.p.mudus...@intel.com>; Yao, Jiewen <jiewen....@intel.com>;
> edk2-devel@lists.01.org; Kinney, Michael D <michael.d.kin...@intel.com>
> Cc: Mudusuru, Giri P <giri.p.mudus...@intel.com>; Zimmer, Vincent
> <vincent.zim...@intel.com>; Rangarajan, Ravi P
> <ravi.p.rangara...@intel.com>
> Subject: RE: [edk2] [PATCH 17/19] IntelFspWrapperPkg/FspInit: Split
> FspInitPei to FspmWrapperPeim and FspsWrapperPeim.
> 
> Tim,
> 
> I agree multiple repos in a WORKSPACE can potentially be confusing.
> Especially if the
> same package dir exists in more than of the repos.  To alleviate this issue, a
> repo can
> be pruned and the .gitignore feature can be used for git to ignore the
> packages that
> have been pruned.
> 
> The reason I am asking these questions is not related to FSP.
> 
> There have been prior discussions on edk2-devel to organize the packages in
> edk2
> into subdirectories, and I am working on a proposal for that.  However,
> moving
> packages into subdirectories would require the use of the PACKAGES_PATH
> feature.
> 
> Is PACKAGES_PATH something you could add support for in your tools?
> 
> Thanks,
> 
> Mike
> 
> > -----Original Message-----
> > From: Tim Lewis [mailto:tim.le...@insyde.com]
> > Sent: Thursday, May 5, 2016 6:53 PM
> > To: Kinney, Michael D <michael.d.kin...@intel.com>; Mudusuru, Giri P
> > <giri.p.mudus...@intel.com>; Yao, Jiewen <jiewen....@intel.com>; edk2-
> > de...@lists.01.org
> > Cc: Mudusuru, Giri P <giri.p.mudus...@intel.com>; Zimmer, Vincent
> > <vincent.zim...@intel.com>; Rangarajan, Ravi P
> <ravi.p.rangara...@intel.com>
> > Subject: RE: [edk2] [PATCH 17/19] IntelFspWrapperPkg/FspInit: Split
> FspInitPei to
> > FspmWrapperPeim and FspsWrapperPeim.
> >
> > Mike --
> >
> > At this time, no. Our internal tools do not recognize it, and would fail
> during tree
> > analysis.
> >
> > Likewise, our policy does not allow it because we find our customers are
> confused by
> > multiple roots. It makes it hard for the engineers looking at a downstream
> file to
> > predict where the final file resides. That leads to bad bug reports, etc.
> >
> > Tim
> >
> > -----Original Message-----
> > From: Kinney, Michael D [mailto:michael.d.kin...@intel.com]
> > Sent: Thursday, May 05, 2016 6:14 PM
> > To: Tim Lewis <tim.le...@insyde.com>; Mudusuru, Giri P
> <giri.p.mudus...@intel.com>;
> > Yao, Jiewen <jiewen....@intel.com>; edk2-devel@lists.01.org; Kinney,
> Michael D
> > <michael.d.kin...@intel.com>
> > Cc: Mudusuru, Giri P <giri.p.mudus...@intel.com>; Zimmer, Vincent
> > <vincent.zim...@intel.com>; Rangarajan, Ravi P
> <ravi.p.rangara...@intel.com>
> > Subject: RE: [edk2] [PATCH 17/19] IntelFspWrapperPkg/FspInit: Split
> FspInitPei to
> > FspmWrapperPeim and FspsWrapperPeim.
> >
> > Hi Tim,
> >
> > I wanted to follow up on the general concern on the use of the
> PACKAGES_PATH feature.
> >
> > The EDK II BaseTools still use a single WORKSPACE and can use
> PACKAGES_PATH for
> > additional search paths for packages.  PACKAGES_PATH can point to
> directories
> > Below WORKSPACE or outside WORKSPACE, so it is very flexible.
> >
> >
> https://github.com/tianocore/tianocore.github.io/wiki/Multiple_Workspace
> >
> > For your specific use case, could you use PACKAGES_PATH if all the paths
> listed
> > in PACKAGES_PATH are below WORKSPACE?
> >
> > For example, if you have the following dir structure:
> >
> >     tianocore/
> >             edk2/
> >             Udk2015/
> >
> > You can set WORKSPACE to tianocore/ and PACKAGES_PATH to
> > tianocore/edk2;tianocore/Udk2015.
> >
> > This means an additional directory level is added, so all the packages are
> not in the
> > root of WORKSPACE.  This is how we can support pulling content from
> multiple git
> > repos/tags/branches for a single WSORKSPACE build environment without
> having to update
> > the [Packages] section in every INF.
> >
> > Thanks,
> >
> > Mike
> >
> >
> > > -----Original Message-----
> > > From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf
> Of Tim Lewis
> > > Sent: Thursday, May 5, 2016 12:09 PM
> > > To: Mudusuru, Giri P <giri.p.mudus...@intel.com>; Yao, Jiewen
> <jiewen....@intel.com>;
> > > edk2-devel@lists.01.org
> > > Cc: Mudusuru, Giri P <giri.p.mudus...@intel.com>; Zimmer, Vincent
> > > <vincent.zim...@intel.com>; Rangarajan, Ravi P
> <ravi.p.rangara...@intel.com>
> > > Subject: Re: [edk2] [PATCH 17/19] IntelFspWrapperPkg/FspInit: Split
> FspInitPei to
> > > FspmWrapperPeim and FspsWrapperPeim.
> > >
> > > That works well, thank you
> > >
> > > Tim
> > >
> > > Sent from my Windows 10 phone
> > >
> > > From: Mudusuru, Giri P<mailto:giri.p.mudus...@intel.com>
> > > Sent: Thursday, May 5, 2016 12:07 PM
> > > To: Tim Lewis<mailto:tim.le...@insyde.com>; Yao,
> Jiewen<mailto:jiewen....@intel.com>;
> > > edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
> > > Cc: Rangarajan, Ravi P<mailto:ravi.p.rangara...@intel.com>; Yarlagadda,
> Satya
> > > P<mailto:satya.p.yarlaga...@intel.com>; Zimmer,
> > > Vincent<mailto:vincent.zim...@intel.com>; Mudusuru, Giri
> > > P<mailto:giri.p.mudus...@intel.com>
> > > Subject: RE: [edk2] [PATCH 17/19] IntelFspWrapperPkg/FspInit: Split
> FspInitPei to
> > > FspmWrapperPeim and FspsWrapperPeim.
> > >
> > > Hi Tim,
> > > Here is summary of the plan and next steps after discussing internally
> with Vincent
> > and
> > > others...
> > >
> > >
> > > 1)      IntelFspPkg & IntelFspWrapperPkg will continue to support FSP
> v1.x support.
> > > These packages are in maintenance mode i.e., only critical bug fix or
> changes
> > >
> > > 2)      Create new packages IntelFsp2Pkg and IntelFsp2WrapperPkg to
> support FSP v2.0
> > > support
> > >
> > > Please let me know if this meets your need.
> > >
> > > Thanks,
> > > -Giri
> > >
> > > From: Tim Lewis [mailto:tim.le...@insyde.com]
> > > Sent: Wednesday, May 4, 2016 6:40 AM
> > > To: Mudusuru, Giri P <giri.p.mudus...@intel.com>; Yao, Jiewen
> <jiewen....@intel.com>;
> > > edk2-devel@lists.01.org
> > > Cc: Rangarajan, Ravi P <ravi.p.rangara...@intel.com>; Yarlagadda, Satya
> P
> > > <satya.p.yarlaga...@intel.com>; Zimmer, Vincent
> <vincent.zim...@intel.com>; Mudusuru,
> > > Giri P <giri.p.mudus...@intel.com>
> > > Subject: RE: [edk2] [PATCH 17/19] IntelFspWrapperPkg/FspInit: Split
> FspInitPei to
> > > FspmWrapperPeim and FspsWrapperPeim.
> > >
> > > Thank you.
> > >
> > > Tim
> > >
> > > Sent from my Windows 10 phone
> > >
> > > From: Mudusuru, Giri P<mailto:giri.p.mudus...@intel.com>
> > > Sent: Tuesday, May 3, 2016 11:06 PM
> > > To: Tim Lewis<mailto:tim.le...@insyde.com>; Yao,
> Jiewen<mailto:jiewen....@intel.com>;
> > > edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
> > > Cc: Rangarajan, Ravi P<mailto:ravi.p.rangara...@intel.com>; Yarlagadda,
> Satya
> > > P<mailto:satya.p.yarlaga...@intel.com>; Zimmer,
> > > Vincent<mailto:vincent.zim...@intel.com>; Mudusuru, Giri
> > > P<mailto:giri.p.mudus...@intel.com>
> > > Subject: RE: [edk2] [PATCH 17/19] IntelFspWrapperPkg/FspInit: Split
> FspInitPei to
> > > FspmWrapperPeim and FspsWrapperPeim.
> > >
> > > Thanks for info on the policy and usage. Let me follow up internally and
> get back to
> > > you.
> > >
> > > Thanks,
> > > -Giri
> > > From: Tim Lewis [mailto:tim.le...@insyde.com]
> > > Sent: Tuesday, May 3, 2016 4:24 PM
> > > To: Mudusuru, Giri P
> <giri.p.mudus...@intel.com<mailto:giri.p.mudus...@intel.com>>;
> > > Yao, Jiewen <jiewen....@intel.com<mailto:jiewen....@intel.com>>;
> edk2-
> > > de...@lists.01.org<mailto:edk2-devel@lists.01.org>
> > > Cc: Rangarajan, Ravi P
> > > <ravi.p.rangara...@intel.com<mailto:ravi.p.rangara...@intel.com>>;
> Yarlagadda, Satya
> > P
> > > <satya.p.yarlaga...@intel.com<mailto:satya.p.yarlaga...@intel.com>>;
> Zimmer, Vincent
> > > <vincent.zim...@intel.com<mailto:vincent.zim...@intel.com>>
> > > Subject: RE: [edk2] [PATCH 17/19] IntelFspWrapperPkg/FspInit: Split
> FspInitPei to
> > > FspmWrapperPeim and FspsWrapperPeim.
> > >
> > >
> > > 1.      Because we, per our custom tools and per our company policy,
> require that all
> > > source code exist underneath $(WORKSPACE).  As previously discussed
> on this list, we
> > > think multiple workspaces makes our projects harder to maintain and
> harder to scan.
> > > Multiple workspaces was meant to be an OPTIONAL feature and, while
> some may use it,
> > > making it a requirement that all codebases follow this path to support
> what is today
> > > already supported seems a bit steep.
> > >
> > > 2.      There is NO PRODUCTION silicon that uses FSP 2.0 at this time
> that I am aware
> > > of. That means Intel is upgrading the Wrapper package to support silicon
> that is not
> > > yet shipping and removing support for the (by my count) 5 publicly
> announced
> > chipsets,
> > > and probably a few others that are in alpha or beta.
> > >
> > > 3.      Many of these chipsets have a long life, which means new
> projects start on
> > them
> > > well after initial product launch. Because of features and security
> concerns, we
> > > continually upgrade our chipsets to use newer kernel code. This puts an
> extra
> > variable.
> > >
> > > Regards,
> > >
> > > Tim Lewis
> > > CTO, Insyde Software
> > > www.insyde.com<http://www.insyde.com>
> > >
> > > From: Mudusuru, Giri P [mailto:giri.p.mudus...@intel.com]
> > > Sent: Tuesday, May 03, 2016 4:07 PM
> > > To: Tim Lewis <tim.le...@insyde.com<mailto:tim.le...@insyde.com>>;
> Yao, Jiewen
> > > <jiewen....@intel.com<mailto:jiewen....@intel.com>>; edk2-
> > > de...@lists.01.org<mailto:edk2-devel@lists.01.org>
> > > Cc: Rangarajan, Ravi P
> > > <ravi.p.rangara...@intel.com<mailto:ravi.p.rangara...@intel.com>>;
> Yarlagadda, Satya
> > P
> > > <satya.p.yarlaga...@intel.com<mailto:satya.p.yarlaga...@intel.com>>;
> Zimmer, Vincent
> > > <vincent.zim...@intel.com<mailto:vincent.zim...@intel.com>>;
> Mudusuru, Giri P
> > > <giri.p.mudus...@intel.com<mailto:giri.p.mudus...@intel.com>>
> > > Subject: RE: [edk2] [PATCH 17/19] IntelFspWrapperPkg/FspInit: Split
> FspInitPei to
> > > FspmWrapperPeim and FspsWrapperPeim.
> > >
> > > Hi Tim,
> > > Yes we considered creating a separate package name along with moving
> the package
> > under
> > > Deprecated folder and just leave it in the UDK2015 branch.
> > >
> > > There are pro's and con's for all options.
> > >
> > > Can you please help me understand on why multi-workspace is not an
> option?
> > >
> > > Thanks,
> > > -Giri
> > >
> > > From: Tim Lewis [mailto:tim.le...@insyde.com]
> > > Sent: Tuesday, May 03, 2016 8:47 AM
> > > To: Mudusuru, Giri P
> <giri.p.mudus...@intel.com<mailto:giri.p.mudus...@intel.com>>;
> > > Yao, Jiewen <jiewen....@intel.com<mailto:jiewen....@intel.com>>;
> edk2-
> > > de...@lists.01.org<mailto:edk2-devel@lists.01.org>
> > > Cc: Rangarajan, Ravi P
> > > <ravi.p.rangara...@intel.com<mailto:ravi.p.rangara...@intel.com>>;
> Yarlagadda, Satya
> > P
> > > <satya.p.yarlaga...@intel.com<mailto:satya.p.yarlaga...@intel.com>>;
> Zimmer, Vincent
> > > <vincent.zim...@intel.com<mailto:vincent.zim...@intel.com>>;
> Mudusuru, Giri P
> > > <giri.p.mudus...@intel.com<mailto:giri.p.mudus...@intel.com>>
> > > Subject: RE: [edk2] [PATCH 17/19] IntelFspWrapperPkg/FspInit: Split
> FspInitPei to
> > > FspmWrapperPeim and FspsWrapperPeim.
> > >
> > >
> > > Giri ,
> > >
> > > I suggest you create a new package name, rather than use the same one
> with different
> > > semantics.
> > >
> > >
> > >
> > > Multiple workspaces is not ah option for us.
> > >
> > >
> > >
> > > Tim
> > >
> > >
> > >
> > > Sent from my Windows 10 phone
> > >
> > >
> > >
> > > From: Mudusuru, Giri P<mailto:giri.p.mudus...@intel.com>
> > > Sent: Tuesday, May 3, 2016 8:07 AM
> > > To: Tim Lewis<mailto:tim.le...@insyde.com>; Yao,
> Jiewen<mailto:jiewen....@intel.com>;
> > > edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
> > > Cc: Rangarajan, Ravi P<mailto:ravi.p.rangara...@intel.com>; Yarlagadda,
> Satya
> > > P<mailto:satya.p.yarlaga...@intel.com>; Zimmer,
> > > Vincent<mailto:vincent.zim...@intel.com>; Mudusuru, Giri
> > > P<mailto:giri.p.mudus...@intel.com>
> > > Subject: RE: [edk2] [PATCH 17/19] IntelFspWrapperPkg/FspInit: Split
> FspInitPei to
> > > FspmWrapperPeim and FspsWrapperPeim.
> > >
> > >
> > > Hi Tim,
> > > The main reason to deprecate the v1.x support was to reduce the
> complexity and focus
> > on
> > > v2.0 going forward. At the same time as Jiewen mentioned below our
> plan is to
> > continue
> > > maintaining v1.1 in the UDK2015 branch for the existing chipsets.
> > >
> > > Understand your usage with single tree. For this usage, suggest to use
> the multi-
> > > workspace capability so you can have both in a single tree.
> > >
> > > Thanks,
> > > -Giri
> > >
> > > -----Original Message-----
> > > From: Tim Lewis [mailto:tim.le...@insyde.com]
> > > Sent: Tuesday, May 3, 2016 4:48 AM
> > > To: Yao, Jiewen <jiewen....@intel.com<mailto:jiewen....@intel.com>>;
> edk2-
> > > de...@lists.01.org<mailto:edk2-devel@lists.01.org>
> > > Cc: Mudusuru, Giri P
> <giri.p.mudus...@intel.com<mailto:giri.p.mudus...@intel.com>>;
> > > Rangarajan, Ravi P
> <ravi.p.rangara...@intel.com<mailto:ravi.p.rangara...@intel.com>>
> > > Subject: RE: [edk2] [PATCH 17/19] IntelFspWrapperPkg/FspInit: Split
> FspInitPei to
> > > FspmWrapperPeim and FspsWrapperPeim.
> > >
> > > Is this really a good idea, dropping 1.1 support? We don't maintain two
> separate
> > trees
> > > for our products, just 1. There are several chipsets which have long life
> that will
> > > need additional features, but are only 1.1
> > >
> > > Tim
> > >
> > > -----Original Message-----
> > > From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf
> Of Jiewen Yao
> > > Sent: Monday, May 02, 2016 9:51 PM
> > > To: edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
> > > Cc: Giri P Mudusuru
> <giri.p.mudus...@intel.com<mailto:giri.p.mudus...@intel.com>>;
> > Ravi
> > > P Rangarajan
> <ravi.p.rangara...@intel.com<mailto:ravi.p.rangara...@intel.com>>
> > > Subject: [edk2] [PATCH 17/19] IntelFspWrapperPkg/FspInit: Split
> FspInitPei to
> > > FspmWrapperPeim and FspsWrapperPeim.
> > >
> > > Update FSP to follow:
> > >
> https://firmware.intel.com/sites/default/files/FSP_EAS_v2.0_Draft%20Exter
> nal.pdf
> > >
> > > Align to FSP2.0.
> > > Remove 1.1 support from FspInit.
> > > Split it into FspmWrapperPeim and FspsWrapperPeim, so they can build in
> > > different FV.
> > >
> > > The FSP1.1 compatibility is NOT maintained.
> > >
> > > The new Intel platform will follow FSP2.0.
> > > The old platform can either use an old EDK branch,
> > > or move FSP1.1 support to platform directory.
> > >
> > > Cc: Giri P Mudusuru
> <giri.p.mudus...@intel.com<mailto:giri.p.mudus...@intel.com>>
> > > Cc: Maurice Ma
> <maurice...@intel.com<mailto:maurice...@intel.com>>
> > > Cc: Ravi P Rangarajan
> > <ravi.p.rangara...@intel.com<mailto:ravi.p.rangara...@intel.com>>
> > > Contributed-under: TianoCore Contribution Agreement 1.0
> > > Signed-off-by: Jiewen Yao
> <jiewen....@intel.com<mailto:jiewen....@intel.com>>
> > > Reviewed-by: Giri P Mudusuru
> > > <giri.p.mudus...@intel.com<mailto:giri.p.mudus...@intel.com>>
> > > Reviewed-by: Maurice Ma
> <maurice...@intel.com<mailto:maurice...@intel.com>>
> > > Reviewed-by: Ravi P Rangarajan
> > > <ravi.p.rangara...@intel.com<mailto:ravi.p.rangara...@intel.com>>
> > > ---
> > >  IntelFspWrapperPkg/FspInitPei/FindPeiCore.c            | 199
> ------------
> > >  IntelFspWrapperPkg/FspInitPei/FspInitPei.c             |  66 ----
> > >  IntelFspWrapperPkg/FspInitPei/FspInitPei.h             |  64 ----
> > >  IntelFspWrapperPkg/FspInitPei/FspInitPei.inf           |  90 ------
> > >  IntelFspWrapperPkg/FspInitPei/FspInitPeiV1.c           | 182
> -----------
> > >  IntelFspWrapperPkg/FspInitPei/FspInitPeiV2.c           | 338
> --------------------
> > >  IntelFspWrapperPkg/FspInitPei/FspNotifyS3.c            |  80 -----
> > >  IntelFspWrapperPkg/FspInitPei/SecMain.c                | 310
> ------------------
> > >  IntelFspWrapperPkg/FspInitPei/SecMain.h                | 116
> -------
> > >  IntelFspWrapperPkg/FspmWrapperPeim/FspmWrapperPeim.c   | 161
> ++++++++++
> > >  IntelFspWrapperPkg/FspmWrapperPeim/FspmWrapperPeim.inf |  77
> +++++
> > >  IntelFspWrapperPkg/FspsWrapperPeim/FspsWrapperPeim.c   | 313
> ++++++++++++++++++
> > >  IntelFspWrapperPkg/FspsWrapperPeim/FspsWrapperPeim.inf |  79
> +++++
> > >  13 files changed, 630 insertions(+), 1445 deletions(-)
> > >
> > > diff --git a/IntelFspWrapperPkg/FspInitPei/FindPeiCore.c
> > > b/IntelFspWrapperPkg/FspInitPei/FindPeiCore.c
> > > deleted file mode 100644
> > > index ce003d0..0000000
> > > --- a/IntelFspWrapperPkg/FspInitPei/FindPeiCore.c
> > > +++ /dev/null
> > > @@ -1,199 +0,0 @@
> > > -/** @file
> > > -  Locate the entry point for the PEI Core
> > > -
> > > -  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
> > > -  This program and the accompanying materials
> > > -  are licensed and made available under the terms and conditions of the
> BSD License
> > > -  which accompanies this distribution.  The full text of the license may
> be found at
> > > -  http://opensource.org/licenses/bsd-license.php.
> > > -
> > > -  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS
> IS" BASIS,
> > > -  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > > -
> > > -**/
> > > -
> > > -#include <PiPei.h>
> > > -#include <Library/BaseLib.h>
> > > -#include <Library/PeCoffGetEntryPointLib.h>
> > > -
> > > -#include "SecMain.h"
> > > -
> > > -/**
> > > -  Find core image base.
> > > -
> > > -  @param[in]  BootFirmwareVolumePtr    Point to the boot
> firmware volume.
> > > -  @param[out] SecCoreImageBase         The base address of the
> SEC core image.
> > > -  @param[out] PeiCoreImageBase         The base address of the
> PEI core image.
> > > -
> > > -**/
> > > -EFI_STATUS
> > > -EFIAPI
> > > -FindImageBase (
> > > -  IN  EFI_FIRMWARE_VOLUME_HEADER
> *BootFirmwareVolumePtr,
> > > -  OUT EFI_PHYSICAL_ADDRESS             *SecCoreImageBase,
> > > -  OUT EFI_PHYSICAL_ADDRESS             *PeiCoreImageBase
> > > -  )
> > > -{
> > > -  EFI_PHYSICAL_ADDRESS        CurrentAddress;
> > > -  EFI_PHYSICAL_ADDRESS        EndOfFirmwareVolume;
> > > -  EFI_FFS_FILE_HEADER         *File;
> > > -  UINT32                      Size;
> > > -  EFI_PHYSICAL_ADDRESS        EndOfFile;
> > > -  EFI_COMMON_SECTION_HEADER   *Section;
> > > -  EFI_PHYSICAL_ADDRESS        EndOfSection;
> > > -
> > > -  *SecCoreImageBase = 0;
> > > -  *PeiCoreImageBase = 0;
> > > -
> > > -  CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)
> BootFirmwareVolumePtr;
> > > -  EndOfFirmwareVolume = CurrentAddress +
> BootFirmwareVolumePtr->FvLength;
> > > -
> > > -  //
> > > -  // Loop through the FFS files in the Boot Firmware Volume
> > > -  //
> > > -  for (EndOfFile = CurrentAddress +
> BootFirmwareVolumePtr->HeaderLength; ; ) {
> > > -
> > > -    CurrentAddress = (EndOfFile + 7) & 0xfffffffffffffff8ULL;
> > > -    if (CurrentAddress > EndOfFirmwareVolume) {
> > > -      return EFI_NOT_FOUND;
> > > -    }
> > > -
> > > -    File = (EFI_FFS_FILE_HEADER*)(UINTN) CurrentAddress;
> > > -    if (IS_FFS_FILE2 (File)) {
> > > -      Size = FFS_FILE2_SIZE (File);
> > > -      if (Size <= 0x00FFFFFF) {
> > > -        return EFI_NOT_FOUND;
> > > -      }
> > > -    } else {
> > > -      Size = FFS_FILE_SIZE (File);
> > > -      if (Size < sizeof (EFI_FFS_FILE_HEADER)) {
> > > -        return EFI_NOT_FOUND;
> > > -      }
> > > -    }
> > > -
> > > -    EndOfFile = CurrentAddress + Size;
> > > -    if (EndOfFile > EndOfFirmwareVolume) {
> > > -      return EFI_NOT_FOUND;
> > > -    }
> > > -
> > > -    //
> > > -    // Look for SEC Core / PEI Core files
> > > -    //
> > > -    if (File->Type != EFI_FV_FILETYPE_SECURITY_CORE &&
> > > -        File->Type != EFI_FV_FILETYPE_PEI_CORE) {
> > > -      continue;
> > > -    }
> > > -
> > > -    //
> > > -    // Loop through the FFS file sections within the FFS file
> > > -    //
> > > -    if (IS_FFS_FILE2 (File)) {
> > > -      EndOfSection = (EFI_PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) File
> + sizeof
> > > (EFI_FFS_FILE_HEADER2));
> > > -    } else {
> > > -      EndOfSection = (EFI_PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) File
> + sizeof
> > > (EFI_FFS_FILE_HEADER));
> > > -    }
> > > -    for (;;) {
> > > -      CurrentAddress = (EndOfSection + 3) & 0xfffffffffffffffcULL;
> > > -      Section = (EFI_COMMON_SECTION_HEADER*)(UINTN)
> CurrentAddress;
> > > -
> > > -      if (IS_SECTION2 (Section)) {
> > > -        Size = SECTION2_SIZE (Section);
> > > -        if (Size <= 0x00FFFFFF) {
> > > -          return EFI_NOT_FOUND;
> > > -        }
> > > -      } else {
> > > -        Size = SECTION_SIZE (Section);
> > > -        if (Size < sizeof (EFI_COMMON_SECTION_HEADER)) {
> > > -          return EFI_NOT_FOUND;
> > > -        }
> > > -      }
> > > -
> > > -      EndOfSection = CurrentAddress + Size;
> > > -      if (EndOfSection > EndOfFile) {
> > > -        return EFI_NOT_FOUND;
> > > -      }
> > > -
> > > -      //
> > > -      // Look for executable sections
> > > -      //
> > > -      if (Section->Type == EFI_SECTION_PE32 || Section->Type ==
> EFI_SECTION_TE) {
> > > -        if (File->Type == EFI_FV_FILETYPE_SECURITY_CORE) {
> > > -          if (IS_SECTION2 (Section)) {
> > > -            *SecCoreImageBase = (PHYSICAL_ADDRESS) (UINTN)
> ((UINT8 *) Section +
> > sizeof
> > > (EFI_COMMON_SECTION_HEADER2));
> > > -          } else {
> > > -            *SecCoreImageBase = (PHYSICAL_ADDRESS) (UINTN)
> ((UINT8 *) Section +
> > sizeof
> > > (EFI_COMMON_SECTION_HEADER));
> > > -          }
> > > -        } else {
> > > -          if (IS_SECTION2 (Section)) {
> > > -            *PeiCoreImageBase = (PHYSICAL_ADDRESS) (UINTN)
> ((UINT8 *) Section +
> > sizeof
> > > (EFI_COMMON_SECTION_HEADER2));
> > > -          } else {
> > > -            *PeiCoreImageBase = (PHYSICAL_ADDRESS) (UINTN)
> ((UINT8 *) Section +
> > sizeof
> > > (EFI_COMMON_SECTION_HEADER));
> > > -          }
> > > -        }
> > > -        break;
> > > -      }
> > > -    }
> > > -
> > > -    //
> > > -    // Both SEC Core and PEI Core images found
> > > -    //
> > > -    if (*SecCoreImageBase != 0 && *PeiCoreImageBase != 0) {
> > > -      return EFI_SUCCESS;
> > > -    }
> > > -  }
> > > -}
> > > -
> > > -/**
> > > -  Find and return Pei Core entry point.
> > > -
> > > -  It also find SEC and PEI Core file debug inforamtion. It will report
> them if
> > > -  remote debug is enabled.
> > > -
> > > -  @param[in]  BootFirmwareVolumePtr    Point to the boot
> firmware volume.
> > > -  @param[out] PeiCoreEntryPoint        The entry point of the PEI
> core.
> > > -
> > > -**/
> > > -VOID
> > > -EFIAPI
> > > -FindAndReportEntryPoints (
> > > -  IN  EFI_FIRMWARE_VOLUME_HEADER
> *BootFirmwareVolumePtr,
> > > -  OUT EFI_PEI_CORE_ENTRY_POINT         *PeiCoreEntryPoint
> > > -  )
> > > -{
> > > -  EFI_STATUS                       Status;
> > > -  EFI_PHYSICAL_ADDRESS             SecCoreImageBase;
> > > -  EFI_PHYSICAL_ADDRESS             PeiCoreImageBase;
> > > -  PE_COFF_LOADER_IMAGE_CONTEXT     ImageContext;
> > > -
> > > -  //
> > > -  // Find SEC Core and PEI Core image base
> > > -  //
> > > -  Status = FindImageBase (BootFirmwareVolumePtr,
> &SecCoreImageBase,
> > > &PeiCoreImageBase);
> > > -  ASSERT_EFI_ERROR (Status);
> > > -
> > > -  ZeroMem ((VOID *) &ImageContext, sizeof
> (PE_COFF_LOADER_IMAGE_CONTEXT));
> > > -  //
> > > -  // Report SEC Core debug information when remote debug is enabled
> > > -  //
> > > -  ImageContext.ImageAddress = SecCoreImageBase;
> > > -  ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*)
> (UINTN)
> > > ImageContext.ImageAddress);
> > > -  PeCoffLoaderRelocateImageExtraAction (&ImageContext);
> > > -
> > > -  //
> > > -  // Report PEI Core debug information when remote debug is enabled
> > > -  //
> > > -  ImageContext.ImageAddress = PeiCoreImageBase;
> > > -  ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*)
> (UINTN)
> > > ImageContext.ImageAddress);
> > > -  PeCoffLoaderRelocateImageExtraAction (&ImageContext);
> > > -
> > > -  //
> > > -  // Find PEI Core entry point
> > > -  //
> > > -  Status = PeCoffLoaderGetEntryPoint ((VOID *) (UINTN)
> PeiCoreImageBase, (VOID**)
> > > PeiCoreEntryPoint);
> > > -  if (EFI_ERROR (Status)) {
> > > -    *PeiCoreEntryPoint = 0;
> > > -  }
> > > -
> > > -  return;
> > > -}
> > > -
> > > diff --git a/IntelFspWrapperPkg/FspInitPei/FspInitPei.c
> > > b/IntelFspWrapperPkg/FspInitPei/FspInitPei.c
> > > deleted file mode 100644
> > > index 48a0307..0000000
> > > --- a/IntelFspWrapperPkg/FspInitPei/FspInitPei.c
> > > +++ /dev/null
> > > @@ -1,66 +0,0 @@
> > > -/** @file
> > > -  This PEIM initialize FSP.
> > > -
> > > -  Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
> > > -  This program and the accompanying materials
> > > -  are licensed and made available under the terms and conditions of the
> BSD License
> > > -  which accompanies this distribution.  The full text of the license may
> be found at
> > > -  http://opensource.org/licenses/bsd-license.php.
> > > -
> > > -  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS
> IS" BASIS,
> > > -  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > > -
> > > -**/
> > > -
> > > -
> > > -#include "FspInitPei.h"
> > > -
> > > -/**
> > > -  This is the entrypoint of PEIM
> > > -
> > > -  @param[in] FileHandle  Handle of the file being invoked.
> > > -  @param[in] PeiServices Describes the list of possible PEI Services.
> > > -
> > > -  @retval EFI_SUCCESS if it completed successfully.
> > > -**/
> > > -EFI_STATUS
> > > -EFIAPI
> > > -FspPeiEntryPoint (
> > > -  IN       EFI_PEI_FILE_HANDLE  FileHandle,
> > > -  IN CONST EFI_PEI_SERVICES     **PeiServices
> > > -  )
> > > -{
> > > -  FSP_INFO_HEADER      *FspHeader;
> > > -  UINT8                PcdFspApiVersion;
> > > -
> > > -  DEBUG ((DEBUG_INFO, "FspPeiEntryPoint\n"));
> > > -  PcdFspApiVersion = 1;
> > > -
> > > -  FspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase));
> > > -  DEBUG ((DEBUG_INFO, "FspHeader - 0x%x\n", FspHeader));
> > > -  if (FspHeader == NULL) {
> > > -    return EFI_DEVICE_ERROR;
> > > -  }
> > > -
> > > -  ASSERT (FspHeader->TempRamInitEntryOffset != 0);
> > > -  ASSERT (FspHeader->FspInitEntryOffset != 0);
> > > -  ASSERT (FspHeader->NotifyPhaseEntryOffset != 0);
> > > -
> > > -  if ((PcdGet8 (PcdFspApiVersion) >= 2) &&
> > > -      (FspHeader->HeaderRevision >= FSP_HEADER_REVISION_2) &&
> > > -      (FspHeader->ApiEntryNum >= 6) ) {
> > > -    ASSERT (FspHeader->FspMemoryInitEntryOffset != 0);
> > > -    ASSERT (FspHeader->TempRamExitEntryOffset != 0);
> > > -    ASSERT (FspHeader->FspSiliconInitEntryOffset != 0);
> > > -    PcdFspApiVersion = PcdGet8 (PcdFspApiVersion);
> > > -  }
> > > -  DEBUG ((DEBUG_INFO, "PcdFspApiVersion - 0x%x\n",
> PcdFspApiVersion));
> > > -
> > > -  if (PcdFspApiVersion == 1) {
> > > -    PeiFspInitV1 (FspHeader);
> > > -  } else {
> > > -    PeiFspInitV2 (FspHeader);
> > > -  }
> > > -
> > > -  return EFI_SUCCESS;
> > > -}
> > > diff --git a/IntelFspWrapperPkg/FspInitPei/FspInitPei.h
> > > b/IntelFspWrapperPkg/FspInitPei/FspInitPei.h
> > > deleted file mode 100644
> > > index 6d70f0c..0000000
> > > --- a/IntelFspWrapperPkg/FspInitPei/FspInitPei.h
> > > +++ /dev/null
> > > @@ -1,64 +0,0 @@
> > > -/** @file
> > > -  This is PEIM header file.
> > > -
> > > -  Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
> > > -  This program and the accompanying materials
> > > -  are licensed and made available under the terms and conditions of the
> BSD License
> > > -  which accompanies this distribution.  The full text of the license may
> be found at
> > > -  http://opensource.org/licenses/bsd-license.php.
> > > -
> > > -  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS
> IS" BASIS,
> > > -  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > > -
> > > -**/
> > > -
> > > -#ifndef _FSP_INIT_PEI_H_
> > > -#define _FSP_INIT_PEI_H_
> > > -
> > > -#include <PiPei.h>
> > > -
> > > -#include <Library/PeimEntryPoint.h>
> > > -#include <Library/PeiServicesLib.h>
> > > -#include <Library/PeiServicesTablePointerLib.h>
> > > -#include <Library/BaseLib.h>
> > > -#include <Library/DebugLib.h>
> > > -#include <Library/BaseMemoryLib.h>
> > > -#include <Library/HobLib.h>
> > > -#include <Library/PcdLib.h>
> > > -#include <Library/FspPlatformInfoLib.h>
> > > -#include <Library/FspPlatformSecLib.h>
> > > -#include <Library/FspHobProcessLib.h>
> > > -#include <Library/FspApiLib.h>
> > > -
> > > -#include <Ppi/FspInitDone.h>
> > > -#include <Ppi/EndOfPeiPhase.h>
> > > -#include <Ppi/MemoryDiscovered.h>
> > > -#include <Ppi/TemporaryRamDone.h>
> > > -
> > > -extern EFI_PEI_NOTIFY_DESCRIPTOR mS3EndOfPeiNotifyDesc;
> > > -
> > > -/**
> > > -  Do FSP initialization based on FspApi version 1.
> > > -
> > > -  @param[in] FspHeader FSP header pointer.
> > > -
> > > -  @return FSP initialization status.
> > > -**/
> > > -EFI_STATUS
> > > -PeiFspInitV1 (
> > > -  IN FSP_INFO_HEADER *FspHeader
> > > -  );
> > > -
> > > -/**
> > > -  Do FSP initialization based on FspApi version 2.
> > > -
> > > -  @param[in] FspHeader FSP header pointer.
> > > -
> > > -  @return FSP initialization status.
> > > -**/
> > > -EFI_STATUS
> > > -PeiFspInitV2 (
> > > -  IN FSP_INFO_HEADER *FspHeader
> > > -  );
> > > -
> > > -#endif
> > > diff --git a/IntelFspWrapperPkg/FspInitPei/FspInitPei.inf
> > > b/IntelFspWrapperPkg/FspInitPei/FspInitPei.inf
> > > deleted file mode 100644
> > > index cde101b..0000000
> > > --- a/IntelFspWrapperPkg/FspInitPei/FspInitPei.inf
> > > +++ /dev/null
> > > @@ -1,90 +0,0 @@
> > > -## @file
> > > -# FSP PEI Module
> > > -#
> > > -# This PEIM initialize FSP.
> > > -# In FSP API V1 mode, it will be invoked twice by pei core. In 1st 
> > > entry, it
> will
> > > -# call FspInit API. In 2nd entry, it will parse the hoblist from fsp and
> report
> > > -# them into pei core.
> > > -# In FSP API V2 mode, it will be invoked only once. It will call
> FspMemoryInit API,
> > > -# register TemporaryRamDonePpi to call TempRamExit API, and register
> > > MemoryDiscoveredPpi
> > > -# notify to call FspSiliconInit API.
> > > -#
> > > -#  Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
> > > -#
> > > -#  This program and the accompanying materials
> > > -#  are licensed and made available under the terms and conditions of
> the BSD License
> > > -#  which accompanies this distribution. The full text of the license may
> be found at
> > > -#  http://opensource.org/licenses/bsd-license.php.
> > > -#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS
> IS" BASIS,
> > > -#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > > -#
> > > -##
> > > -
> > > -[Defines]
> > > -  INF_VERSION                    = 0x00010005
> > > -  BASE_NAME                      = FspInitPeim
> > > -  FILE_GUID                      =
> BC59E2E1-7492-4031-806E-C48DCCC3A026
> > > -  MODULE_TYPE                    = PEIM
> > > -  VERSION_STRING                 = 1.0
> > > -  ENTRY_POINT                    = FspPeiEntryPoint
> > > -
> > > -#
> > > -# The following information is for reference only and not required by the
> build
> > tools.
> > > -#
> > > -#  VALID_ARCHITECTURES           = IA32
> > > -#
> > > -
> > > -[Sources]
> > > -  FspInitPei.c
> > > -  FspInitPei.h
> > > -  FspInitPeiV1.c
> > > -  FspInitPeiV2.c
> > > -  FspNotifyS3.c
> > > -  SecMain.c
> > > -  SecMain.h
> > > -  FindPeiCore.c
> > > -
> > > -[Packages]
> > > -  MdePkg/MdePkg.dec
> > > -  MdeModulePkg/MdeModulePkg.dec
> > > -  UefiCpuPkg/UefiCpuPkg.dec
> > > -  IntelFspPkg/IntelFspPkg.dec
> > > -  IntelFspWrapperPkg/IntelFspWrapperPkg.dec
> > > -
> > > -[LibraryClasses]
> > > -  PeimEntryPoint
> > > -  PeiServicesLib
> > > -  PeiServicesTablePointerLib
> > > -  BaseLib
> > > -  BaseMemoryLib
> > > -  DebugLib
> > > -  HobLib
> > > -  FspPlatformInfoLib
> > > -  FspHobProcessLib
> > > -  FspPlatformSecLib
> > > -  DebugAgentLib
> > > -  UefiCpuLib
> > > -  PeCoffGetEntryPointLib
> > > -  PeCoffExtraActionLib
> > > -  FspApiLib
> > > -
> > > -[Ppis]
> > > -  gTopOfTemporaryRamPpiGuid             ## PRODUCES
> > > -  gFspInitDonePpiGuid                   ## PRODUCES
> > > -  gEfiEndOfPeiSignalPpiGuid             ## PRODUCES
> > > -  gEfiTemporaryRamDonePpiGuid           ## PRODUCES
> > > -  gEfiPeiMemoryDiscoveredPpiGuid        ## PRODUCES
> > > -
> > > -[FixedPcd]
> > > -  gFspWrapperTokenSpaceGuid.PcdSecCoreMaxPpiSupported
> ## CONSUMES
> > > -
> > > -[Pcd]
> > > -  gFspWrapperTokenSpaceGuid.PcdPeiTemporaryRamStackSize
> ## CONSUMES
> > > -  gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase
> ## CONSUMES
> > > -  gFspWrapperTokenSpaceGuid.PcdFlashFvSecondFspBase
> ## CONSUMES
> > > -  gFspWrapperTokenSpaceGuid.PcdFlashFvFspSize
> ## CONSUMES
> > > -  gFspWrapperTokenSpaceGuid.PcdMaxUpdRegionSize
> ## CONSUMES
> > > -  gFspWrapperTokenSpaceGuid.PcdFspApiVersion
> ## CONSUMES
> > > -
> > > -[Depex]
> > > -  gEfiPeiMasterBootModePpiGuid
> > > diff --git a/IntelFspWrapperPkg/FspInitPei/FspInitPeiV1.c
> > > b/IntelFspWrapperPkg/FspInitPei/FspInitPeiV1.c
> > > deleted file mode 100644
> > > index b145b50..0000000
> > > --- a/IntelFspWrapperPkg/FspInitPei/FspInitPeiV1.c
> > > +++ /dev/null
> > > @@ -1,182 +0,0 @@
> > > -/** @file
> > > -  In FSP API V1 mode, it will be invoked twice by pei core. In 1st 
> > > entry, it
> will
> > > -  call FspInit API. In 2nd entry, it will parse the hoblist from fsp and
> report
> > > -  them into pei core.
> > > -
> > > -  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
> > > -  This program and the accompanying materials
> > > -  are licensed and made available under the terms and conditions of the
> BSD License
> > > -  which accompanies this distribution.  The full text of the license may
> be found at
> > > -  http://opensource.org/licenses/bsd-license.php.
> > > -
> > > -  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS
> IS" BASIS,
> > > -  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > > -
> > > -**/
> > > -
> > > -
> > > -#include "FspInitPei.h"
> > > -
> > > -/**
> > > -  FSP Init continuation function.
> > > -  Control will be returned to this callback function after FspInit API 
> > > call.
> > > -
> > > -  @param[in] Status      Status of the FSP INIT API
> > > -  @param[in] HobListPtr  Pointer to the HOB data structure defined in
> the PI
> > > specification.
> > > -
> > > -**/
> > > -VOID
> > > -ContinuationFunc (
> > > -  IN EFI_STATUS Status,
> > > -  IN VOID       *HobListPtr
> > > -  )
> > > -{
> > > -  EFI_BOOT_MODE             BootMode;
> > > -  UINT64                    StackSize;
> > > -  EFI_PHYSICAL_ADDRESS      StackBase;
> > > -
> > > -  DEBUG ((DEBUG_INFO, "ContinuationFunc - %r\n", Status));
> > > -  DEBUG ((DEBUG_INFO, "HobListPtr - 0x%x\n", HobListPtr));
> > > -
> > > -  if (Status != EFI_SUCCESS) {
> > > -    CpuDeadLoop ();
> > > -  }
> > > -
> > > -  //
> > > -  // Can not call any PeiServices
> > > -  //
> > > -  BootMode = GetBootMode ();
> > > -
> > > -  GetStackInfo (BootMode, TRUE, &StackSize, &StackBase);
> > > -  DEBUG ((DEBUG_INFO, "StackBase - 0x%x\n", StackBase));
> > > -  DEBUG ((DEBUG_INFO, "StackSize - 0x%x\n", StackSize));
> > > -  CallPeiCoreEntryPoint (
> > > -    HobListPtr,
> > > -    (VOID *)(UINTN)StackBase,
> > > -    (VOID *)(UINTN)(StackBase + StackSize)
> > > -    );
> > > -}
> > > -
> > > -/**
> > > -  Call FspInit API.
> > > -
> > > -  @param[in] FspHeader FSP header pointer.
> > > -**/
> > > -VOID
> > > -PeiFspInit (
> > > -  IN FSP_INFO_HEADER *FspHeader
> > > -  )
> > > -{
> > > -  FSP_INIT_PARAMS           FspInitParams;
> > > -  FSP_INIT_RT_COMMON_BUFFER FspRtBuffer;
> > > -  UINT8                     FspUpdRgn[FixedPcdGet32
> (PcdMaxUpdRegionSize)];
> > > -  UINT32                    UpdRegionSize;
> > > -  EFI_BOOT_MODE             BootMode;
> > > -  UINT64                    StackSize;
> > > -  EFI_PHYSICAL_ADDRESS      StackBase;
> > > -  EFI_STATUS                Status;
> > > -
> > > -  DEBUG ((DEBUG_INFO, "PeiFspInit enter\n"));
> > > -
> > > -  PeiServicesGetBootMode (&BootMode);
> > > -  DEBUG ((DEBUG_INFO, "BootMode - 0x%x\n", BootMode));
> > > -
> > > -  GetStackInfo (BootMode, FALSE, &StackSize, &StackBase);
> > > -  DEBUG ((DEBUG_INFO, "StackBase - 0x%x\n", StackBase));
> > > -  DEBUG ((DEBUG_INFO, "StackSize - 0x%x\n", StackSize));
> > > -
> > > -  ZeroMem (&FspRtBuffer, sizeof(FspRtBuffer));
> > > -  FspRtBuffer.StackTop = (UINT32 *)(UINTN)(StackBase + StackSize);
> > > -
> > > -  FspRtBuffer.BootMode = BootMode;
> > > -
> > > -  /* Platform override any UPD configs */
> > > -  UpdRegionSize = GetUpdRegionSize();
> > > -  DEBUG ((DEBUG_INFO, "UpdRegionSize - 0x%x\n", UpdRegionSize));
> > > -  DEBUG ((DEBUG_INFO, "sizeof(FspUpdRgn) - 0x%x\n",
> sizeof(FspUpdRgn)));
> > > -  ASSERT(sizeof(FspUpdRgn) >= UpdRegionSize);
> > > -  ZeroMem (FspUpdRgn, UpdRegionSize);
> > > -  FspRtBuffer.UpdDataRgnPtr = UpdateFspUpdConfigs (FspUpdRgn);
> > > -  FspRtBuffer.BootLoaderTolumSize = 0;
> > > -
> > > -  ZeroMem (&FspInitParams, sizeof(FspInitParams));
> > > -  FspInitParams.NvsBufferPtr = GetNvsBuffer ();
> > > -  DEBUG ((DEBUG_INFO, "NvsBufferPtr - 0x%x\n",
> FspInitParams.NvsBufferPtr));
> > > -  FspInitParams.RtBufferPtr  = (VOID *)&FspRtBuffer;
> > > -  FspInitParams.ContinuationFunc =
> (CONTINUATION_PROC)ContinuationFunc;
> > > -
> > > -  SaveSecContext (GetPeiServicesTablePointer ());
> > > -
> > > -  DEBUG ((DEBUG_INFO, "FspInitParams      - 0x%x\n",
> &FspInitParams));
> > > -  DEBUG ((DEBUG_INFO, "  NvsBufferPtr     - 0x%x\n",
> FspInitParams.NvsBufferPtr));
> > > -  DEBUG ((DEBUG_INFO, "  RtBufferPtr      - 0x%x\n",
> FspInitParams.RtBufferPtr));
> > > -  DEBUG ((DEBUG_INFO, "    StackTop       - 0x%x\n",
> FspRtBuffer.StackTop));
> > > -  DEBUG ((DEBUG_INFO, "    BootMode       - 0x%x\n",
> FspRtBuffer.BootMode));
> > > -  DEBUG ((DEBUG_INFO, "    UpdDataRgnPtr  - 0x%x\n",
> FspRtBuffer.UpdDataRgnPtr));
> > > -  DEBUG ((DEBUG_INFO, "  ContinuationFunc - 0x%x\n",
> > FspInitParams.ContinuationFunc));
> > > -
> > > -  Status = CallFspInit (FspHeader, &FspInitParams);
> > > -  //
> > > -  // Should never return
> > > -  //
> > > -  DEBUG((DEBUG_ERROR, "FSP Init failed, status: 0x%x\n", Status));
> > > -  CpuDeadLoop ();
> > > -}
> > > -
> > > -/**
> > > -  Do FSP initialization based on FspApi version 1.
> > > -
> > > -  @param[in] FspHeader FSP header pointer.
> > > -
> > > -  @return FSP initialization status.
> > > -**/
> > > -EFI_STATUS
> > > -PeiFspInitV1 (
> > > -  IN FSP_INFO_HEADER *FspHeader
> > > -  )
> > > -{
> > > -  EFI_STATUS           Status;
> > > -  FSP_INIT_DONE_PPI    *FspInitDone;
> > > -  VOID                 *FspHobList;
> > > -  EFI_BOOT_MODE        BootMode;
> > > -
> > > -  Status = PeiServicesLocatePpi (
> > > -             &gFspInitDonePpiGuid,
> > > -             0,
> > > -             NULL,
> > > -             (VOID **) &FspInitDone
> > > -             );
> > > -  if (EFI_ERROR (Status)) {
> > > -    //
> > > -    // 1st entry
> > > -    //
> > > -    DEBUG ((DEBUG_INFO, "1st entry\n"));
> > > -
> > > -    PeiFspInit (FspHeader);
> > > -    //
> > > -    // Never return here, for FspApi version 1.
> > > -    //
> > > -    CpuDeadLoop ();
> > > -  } else {
> > > -    //
> > > -    // 2nd entry for FspApi version 1 only.
> > > -    //
> > > -    DEBUG ((DEBUG_INFO, "2nd entry\n"));
> > > -
> > > -    Status = FspInitDone->GetFspHobList (GetPeiServicesTablePointer (),
> FspInitDone,
> > > &FspHobList);
> > > -    ASSERT_EFI_ERROR (Status);
> > > -    DEBUG ((DEBUG_INFO, "FspHobList - 0x%x\n", FspHobList));
> > > -    FspHobProcess (FspHobList);
> > > -
> > > -    //
> > > -    // Register EndOfPei Notify for S3 to run FspNotifyPhase
> > > -    //
> > > -    PeiServicesGetBootMode (&BootMode);
> > > -    if (BootMode == BOOT_ON_S3_RESUME) {
> > > -      Status = PeiServicesNotifyPpi (&mS3EndOfPeiNotifyDesc);
> > > -      ASSERT_EFI_ERROR (Status);
> > > -    }
> > > -  }
> > > -
> > > -  return EFI_SUCCESS;
> > > -}
> > > \ No newline at end of file
> > > diff --git a/IntelFspWrapperPkg/FspInitPei/FspInitPeiV2.c
> > > b/IntelFspWrapperPkg/FspInitPei/FspInitPeiV2.c
> > > deleted file mode 100644
> > > index 50b150a..0000000
> > > --- a/IntelFspWrapperPkg/FspInitPei/FspInitPeiV2.c
> > > +++ /dev/null
> > > @@ -1,338 +0,0 @@
> > > -/** @file
> > > -  In FSP API V2 mode, it will be invoked only once. It will call
> FspMemoryInit API,
> > > -  register TemporaryRamDonePpi to call TempRamExit API, and register
> > > MemoryDiscoveredPpi
> > > -  notify to call FspSiliconInit API.
> > > -
> > > -  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
> > > -  This program and the accompanying materials
> > > -  are licensed and made available under the terms and conditions of the
> BSD License
> > > -  which accompanies this distribution.  The full text of the license may
> be found at
> > > -  http://opensource.org/licenses/bsd-license.php.
> > > -
> > > -  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS
> IS" BASIS,
> > > -  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > > -
> > > -**/
> > > -
> > > -
> > > -#include "FspInitPei.h"
> > > -
> > > -/**
> > > -  Return Hob list produced by FSP.
> > > -
> > > -  @param[in]  PeiServices  The pointer to the PEI Services Table.
> > > -  @param[in]  This         The pointer to this instance of this PPI.
> > > -  @param[out] FspHobList   The pointer to Hob list produced by FSP.
> > > -
> > > -  @return EFI_SUCCESS FReturn Hob list produced by FSP successfully.
> > > -**/
> > > -EFI_STATUS
> > > -EFIAPI
> > > -FspInitDoneGetFspHobListV2 (
> > > -  IN  CONST EFI_PEI_SERVICES         **PeiServices,
> > > -  IN  FSP_INIT_DONE_PPI              *This,
> > > -  OUT VOID                           **FspHobList
> > > -  );
> > > -
> > > -FSP_INIT_DONE_PPI mFspInitDonePpiV2 = {
> > > -  FspInitDoneGetFspHobListV2
> > > -};
> > > -
> > > -EFI_PEI_PPI_DESCRIPTOR            mPeiFspInitDonePpiV2 = {
> > > -  EFI_PEI_PPI_DESCRIPTOR_PPI |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
> > > -  &gFspInitDonePpiGuid,
> > > -  &mFspInitDonePpiV2
> > > -};
> > > -
> > > -/**
> > > -  This function is called after PEI core discover memory and finish
> migration.
> > > -
> > > -  @param[in] PeiServices    Pointer to PEI Services Table.
> > > -  @param[in] NotifyDesc     Pointer to the descriptor for the
> Notification event
> > that
> > > -                            caused this function to execute.
> > > -  @param[in] Ppi            Pointer to the PPI data associated with
> this function.
> > > -
> > > -  @retval EFI_STATUS        Always return EFI_SUCCESS
> > > -**/
> > > -EFI_STATUS
> > > -EFIAPI
> > > -PeiMemoryDiscoveredNotify (
> > > -  IN EFI_PEI_SERVICES          **PeiServices,
> > > -  IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
> > > -  IN VOID                      *Ppi
> > > -  );
> > > -
> > > -EFI_PEI_NOTIFY_DESCRIPTOR mPeiMemoryDiscoveredNotifyDesc = {
> > > -  (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
> > > -  &gEfiPeiMemoryDiscoveredPpiGuid,
> > > -  PeiMemoryDiscoveredNotify
> > > -};
> > > -
> > > -/**
> > > -  TemporaryRamDone() disables the use of Temporary RAM. If present,
> this service is
> > > invoked
> > > -  by the PEI Foundation after the
> EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is
> > installed.
> > > -
> > > -  @retval EFI_SUCCESS           Use of Temporary RAM was
> disabled.
> > > -  @retval EFI_INVALID_PARAMETER Temporary RAM could not be
> disabled.
> > > -
> > > -**/
> > > -EFI_STATUS
> > > -EFIAPI
> > > -PeiTemporaryRamDone (
> > > -  VOID
> > > -  );
> > > -
> > > -EFI_PEI_TEMPORARY_RAM_DONE_PPI mPeiTemporaryRamDonePpi = {
> > > -  PeiTemporaryRamDone
> > > -};
> > > -
> > > -EFI_PEI_PPI_DESCRIPTOR         mPeiTemporaryRamDoneDesc = {
> > > -  (EFI_PEI_PPI_DESCRIPTOR_PPI |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
> > > -  &gEfiTemporaryRamDonePpiGuid,
> > > -  &mPeiTemporaryRamDonePpi
> > > -};
> > > -
> > > -/**
> > > -  Return Hob list produced by FSP.
> > > -
> > > -  @param[in]  PeiServices  The pointer to the PEI Services Table.
> > > -  @param[in]  This         The pointer to this instance of this PPI.
> > > -  @param[out] FspHobList   The pointer to Hob list produced by FSP.
> > > -
> > > -  @return EFI_SUCCESS FReturn Hob list produced by FSP successfully.
> > > -**/
> > > -EFI_STATUS
> > > -EFIAPI
> > > -FspInitDoneGetFspHobListV2 (
> > > -  IN  CONST EFI_PEI_SERVICES         **PeiServices,
> > > -  IN  FSP_INIT_DONE_PPI              *This,
> > > -  OUT VOID                           **FspHobList
> > > -  )
> > > -{
> > > -  EFI_HOB_GUID_TYPE                  *GuidHob;
> > > -
> > > -  GuidHob = GetFirstGuidHob (&gFspInitDonePpiGuid);
> > > -  if (GuidHob != NULL) {
> > > -    *FspHobList = *(VOID **)GET_GUID_HOB_DATA (GuidHob);
> > > -    return EFI_SUCCESS;
> > > -  } else {
> > > -    return EFI_NOT_FOUND;
> > > -  }
> > > -}
> > > -
> > > -/**
> > > -  Call FspMemoryInit API.
> > > -
> > > -  @param[in]  FspHeader   FSP header pointer.
> > > -
> > > -  @return Status returned by FspMemoryInit API.
> > > -**/
> > > -EFI_STATUS
> > > -PeiFspMemoryInit (
> > > -  IN FSP_INFO_HEADER *FspHeader
> > > -  )
> > > -{
> > > -  FSP_MEMORY_INIT_PARAMS    FspMemoryInitParams;
> > > -  FSP_INIT_RT_COMMON_BUFFER FspRtBuffer;
> > > -  UINT8                     FspUpdRgn[FixedPcdGet32
> (PcdMaxUpdRegionSize)];
> > > -  UINT32                    UpdRegionSize;
> > > -  EFI_BOOT_MODE             BootMode;
> > > -  UINT64                    StackSize;
> > > -  EFI_PHYSICAL_ADDRESS      StackBase;
> > > -  EFI_STATUS                Status;
> > > -  VOID                      *FspHobList;
> > > -  VOID                      *HobData;
> > > -
> > > -  DEBUG ((DEBUG_INFO, "PeiFspMemoryInit enter\n"));
> > > -
> > > -  PeiServicesGetBootMode (&BootMode);
> > > -  DEBUG ((DEBUG_INFO, "BootMode - 0x%x\n", BootMode));
> > > -
> > > -  GetStackInfo (BootMode, FALSE, &StackSize, &StackBase);
> > > -  DEBUG ((DEBUG_INFO, "StackBase - 0x%x\n", StackBase));
> > > -  DEBUG ((DEBUG_INFO, "StackSize - 0x%x\n", StackSize));
> > > -
> > > -  ZeroMem (&FspRtBuffer, sizeof(FspRtBuffer));
> > > -  FspRtBuffer.StackTop = (UINT32 *)(UINTN)(StackBase + StackSize);
> > > -
> > > -  FspRtBuffer.BootMode = BootMode;
> > > -
> > > -  /* Platform override any UPD configs */
> > > -  UpdRegionSize = GetUpdRegionSize();
> > > -  DEBUG ((DEBUG_INFO, "UpdRegionSize - 0x%x\n", UpdRegionSize));
> > > -  DEBUG ((DEBUG_INFO, "sizeof(FspUpdRgn) - 0x%x\n",
> sizeof(FspUpdRgn)));
> > > -  ASSERT(sizeof(FspUpdRgn) >= UpdRegionSize);
> > > -  ZeroMem (FspUpdRgn, UpdRegionSize);
> > > -  FspRtBuffer.UpdDataRgnPtr = UpdateFspUpdConfigs (FspUpdRgn);
> > > -  FspRtBuffer.BootLoaderTolumSize = GetBootLoaderTolumSize ();
> > > -
> > > -  ZeroMem (&FspMemoryInitParams, sizeof(FspMemoryInitParams));
> > > -  FspMemoryInitParams.NvsBufferPtr = GetNvsBuffer ();
> > > -  DEBUG ((DEBUG_INFO, "NvsBufferPtr - 0x%x\n",
> FspMemoryInitParams.NvsBufferPtr));
> > > -  FspMemoryInitParams.RtBufferPtr  = (VOID *)&FspRtBuffer;
> > > -  FspHobList = NULL;
> > > -  FspMemoryInitParams.HobListPtr   = &FspHobList;
> > > -
> > > -  DEBUG ((DEBUG_INFO, "FspMemoryInitParams - 0x%x\n",
> &FspMemoryInitParams));
> > > -  DEBUG ((DEBUG_INFO, "  NvsBufferPtr      - 0x%x\n",
> > > FspMemoryInitParams.NvsBufferPtr));
> > > -  DEBUG ((DEBUG_INFO, "  RtBufferPtr       - 0x%x\n",
> > > FspMemoryInitParams.RtBufferPtr));
> > > -  DEBUG ((DEBUG_INFO, "    StackTop        - 0x%x\n",
> FspRtBuffer.StackTop));
> > > -  DEBUG ((DEBUG_INFO, "    BootMode        - 0x%x\n",
> FspRtBuffer.BootMode));
> > > -  DEBUG ((DEBUG_INFO, "    UpdDataRgnPtr   - 0x%x\n",
> FspRtBuffer.UpdDataRgnPtr));
> > > -  DEBUG ((DEBUG_INFO, "  HobListPtr        - 0x%x\n",
> > > FspMemoryInitParams.HobListPtr));
> > > -
> > > -  Status = CallFspMemoryInit (FspHeader, &FspMemoryInitParams);
> > > -  DEBUG((DEBUG_INFO, "FspMemoryInit status: 0x%x\n", Status));
> > > -  ASSERT_EFI_ERROR (Status);
> > > -
> > > -  DEBUG ((DEBUG_INFO, "  HobListPtr (returned) - 0x%x\n",
> FspHobList));
> > > -  ASSERT (FspHobList != NULL);
> > > -
> > > -  FspHobProcessForMemoryResource (FspHobList);
> > > -
> > > -  //
> > > -  // FspHobList is not complete at this moment.
> > > -  // Save FspHobList pointer to hob, so that it can be got later
> > > -  //
> > > -  HobData = BuildGuidHob (
> > > -             &gFspInitDonePpiGuid,
> > > -             sizeof (VOID *)
> > > -             );
> > > -  ASSERT (HobData != NULL);
> > > -  CopyMem (HobData, &FspHobList, sizeof (FspHobList));
> > > -
> > > -  return Status;
> > > -}
> > > -
> > > -/**
> > > -  TemporaryRamDone() disables the use of Temporary RAM. If present,
> this service is
> > > invoked
> > > -  by the PEI Foundation after the
> EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is
> > installed.
> > > -
> > > -  @retval EFI_SUCCESS           Use of Temporary RAM was
> disabled.
> > > -  @retval EFI_INVALID_PARAMETER Temporary RAM could not be
> disabled.
> > > -
> > > -**/
> > > -EFI_STATUS
> > > -EFIAPI
> > > -PeiTemporaryRamDone (
> > > -  VOID
> > > -  )
> > > -{
> > > -  EFI_STATUS                Status;
> > > -  VOID                      *TempRamExitParam;
> > > -  FSP_INFO_HEADER           *FspHeader;
> > > -
> > > -  FspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase));
> > > -  if (FspHeader == NULL) {
> > > -    return EFI_DEVICE_ERROR;
> > > -  }
> > > -
> > > -  DEBUG ((DEBUG_INFO, "PeiTemporaryRamDone enter\n"));
> > > -
> > > -  TempRamExitParam = GetTempRamExitParam ();
> > > -  Status = CallTempRamExit (FspHeader, TempRamExitParam);
> > > -  DEBUG((DEBUG_INFO, "TempRamExit status: 0x%x\n", Status));
> > > -  ASSERT_EFI_ERROR (Status);
> > > -
> > > -  return EFI_SUCCESS;
> > > -}
> > > -
> > > -/**
> > > -  This function is called after PEI core discover memory and finish
> migration.
> > > -
> > > -  @param[in] PeiServices    Pointer to PEI Services Table.
> > > -  @param[in] NotifyDesc     Pointer to the descriptor for the
> Notification event
> > that
> > > -                            caused this function to execute.
> > > -  @param[in] Ppi            Pointer to the PPI data associated with
> this function.
> > > -
> > > -  @retval EFI_STATUS        Always return EFI_SUCCESS
> > > -**/
> > > -EFI_STATUS
> > > -EFIAPI
> > > -PeiMemoryDiscoveredNotify (
> > > -  IN EFI_PEI_SERVICES          **PeiServices,
> > > -  IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
> > > -  IN VOID                      *Ppi
> > > -  )
> > > -{
> > > -  EFI_STATUS                Status;
> > > -  VOID                      *FspSiliconInitParam;
> > > -  FSP_INFO_HEADER           *FspHeader;
> > > -  VOID                      *FspHobList;
> > > -  EFI_HOB_GUID_TYPE         *GuidHob;
> > > -
> > > -  if (PcdGet32 (PcdFlashFvSecondFspBase) == 0) {
> > > -    FspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase));
> > > -  } else {
> > > -    FspHeader = FspFindFspHeader (PcdGet32
> (PcdFlashFvSecondFspBase));
> > > -  }
> > > -  if (FspHeader == NULL) {
> > > -    return EFI_DEVICE_ERROR;
> > > -  }
> > > -
> > > -  DEBUG ((DEBUG_INFO, "PeiMemoryDiscoveredNotify enter\n"));
> > > -
> > > -  FspSiliconInitParam = GetFspSiliconInitParam ();
> > > -  Status = CallFspSiliconInit (FspHeader, FspSiliconInitParam);
> > > -  DEBUG((DEBUG_ERROR, "FspSiliconInit status: 0x%x\n", Status));
> > > -  ASSERT_EFI_ERROR (Status);
> > > -
> > > -  //
> > > -  // Now FspHobList complete, process it
> > > -  //
> > > -  GuidHob = GetFirstGuidHob (&gFspInitDonePpiGuid);
> > > -  ASSERT (GuidHob != NULL);
> > > -  FspHobList = *(VOID **)GET_GUID_HOB_DATA (GuidHob);
> > > -  DEBUG ((DEBUG_INFO, "FspHobList - 0x%x\n", FspHobList));
> > > -  FspHobProcessForOtherData (FspHobList);
> > > -
> > > -  //
> > > -  // Install FspInitDonePpi so that any other driver can consume this
> info.
> > > -  //
> > > -  Status = PeiServicesInstallPpi (&mPeiFspInitDonePpiV2);
> > > -  ASSERT_EFI_ERROR(Status);
> > > -
> > > -  return EFI_SUCCESS;
> > > -}
> > > -
> > > -/**
> > > -  Do FSP initialization based on FspApi version 2.
> > > -
> > > -  @param[in] FspHeader FSP header pointer.
> > > -
> > > -  @return FSP initialization status.
> > > -**/
> > > -EFI_STATUS
> > > -PeiFspInitV2 (
> > > -  IN FSP_INFO_HEADER *FspHeader
> > > -  )
> > > -{
> > > -  EFI_STATUS           Status;
> > > -  EFI_BOOT_MODE        BootMode;
> > > -
> > > -  Status = PeiFspMemoryInit (FspHeader);
> > > -  ASSERT_EFI_ERROR (Status);
> > > -
> > > -  //
> > > -  // Install TempramDonePpi to run TempRamExit
> > > -  //
> > > -  Status = PeiServicesInstallPpi (&mPeiTemporaryRamDoneDesc);
> > > -  ASSERT_EFI_ERROR(Status);
> > > -
> > > -  //
> > > -  // Register MemoryDiscovered Nofity to run FspSiliconInit
> > > -  //
> > > -  Status = PeiServicesNotifyPpi (&mPeiMemoryDiscoveredNotifyDesc);
> > > -  ASSERT_EFI_ERROR (Status);
> > > -
> > > -  //
> > > -  // Register EndOfPei Notify for S3 to run FspNotifyPhase
> > > -  //
> > > -  PeiServicesGetBootMode (&BootMode);
> > > -  if (BootMode == BOOT_ON_S3_RESUME) {
> > > -    Status = PeiServicesNotifyPpi (&mS3EndOfPeiNotifyDesc);
> > > -    ASSERT_EFI_ERROR (Status);
> > > -  }
> > > -
> > > -  return EFI_SUCCESS;
> > > -}
> > > \ No newline at end of file
> > > diff --git a/IntelFspWrapperPkg/FspInitPei/FspNotifyS3.c
> > > b/IntelFspWrapperPkg/FspInitPei/FspNotifyS3.c
> > > deleted file mode 100644
> > > index f784b01..0000000
> > > --- a/IntelFspWrapperPkg/FspInitPei/FspNotifyS3.c
> > > +++ /dev/null
> > > @@ -1,80 +0,0 @@
> > > -/** @file
> > > -  In EndOfPei notify, it will call FspNotifyPhase API.
> > > -
> > > -  Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
> > > -  This program and the accompanying materials
> > > -  are licensed and made available under the terms and conditions of the
> BSD License
> > > -  which accompanies this distribution.  The full text of the license may
> be found at
> > > -  http://opensource.org/licenses/bsd-license.php.
> > > -
> > > -  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS
> IS" BASIS,
> > > -  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > > -
> > > -**/
> > > -
> > > -
> > > -#include "FspInitPei.h"
> > > -
> > > -/**
> > > -  This function handles S3 resume task at the end of PEI
> > > -
> > > -  @param[in] PeiServices    Pointer to PEI Services Table.
> > > -  @param[in] NotifyDesc     Pointer to the descriptor for the
> Notification event
> > that
> > > -                            caused this function to execute.
> > > -  @param[in] Ppi            Pointer to the PPI data associated with
> this function.
> > > -
> > > -  @retval EFI_STATUS        Always return EFI_SUCCESS
> > > -**/
> > > -EFI_STATUS
> > > -EFIAPI
> > > -S3EndOfPeiNotify (
> > > -  IN EFI_PEI_SERVICES          **PeiServices,
> > > -  IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
> > > -  IN VOID                      *Ppi
> > > -  );
> > > -
> > > -EFI_PEI_NOTIFY_DESCRIPTOR mS3EndOfPeiNotifyDesc = {
> > > -  (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
> > > -  &gEfiEndOfPeiSignalPpiGuid,
> > > -  S3EndOfPeiNotify
> > > -};
> > > -
> > > -/**
> > > -  This function handles S3 resume task at the end of PEI
> > > -
> > > -  @param[in] PeiServices    Pointer to PEI Services Table.
> > > -  @param[in] NotifyDesc     Pointer to the descriptor for the
> Notification event
> > that
> > > -                            caused this function to execute.
> > > -  @param[in] Ppi            Pointer to the PPI data associated with
> this function.
> > > -
> > > -  @retval EFI_STATUS        Always return EFI_SUCCESS
> > > -**/
> > > -EFI_STATUS
> > > -EFIAPI
> > > -S3EndOfPeiNotify (
> > > -  IN EFI_PEI_SERVICES          **PeiServices,
> > > -  IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
> > > -  IN VOID                      *Ppi
> > > -  )
> > > -{
> > > -  NOTIFY_PHASE_PARAMS NotifyPhaseParams;
> > > -  EFI_STATUS          Status;
> > > -  FSP_INFO_HEADER     *FspHeader;
> > > -
> > > -  FspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase));
> > > -  if (FspHeader == NULL) {
> > > -    return EFI_DEVICE_ERROR;
> > > -  }
> > > -
> > > -  DEBUG ((DEBUG_INFO, "S3EndOfPeiNotify enter\n"));
> > > -
> > > -  NotifyPhaseParams.Phase = EnumInitPhaseAfterPciEnumeration;
> > > -  Status = CallFspNotifyPhase (FspHeader, &NotifyPhaseParams);
> > > -  DEBUG((DEBUG_INFO, "FSP S3NotifyPhase AfterPciEnumeration
> status: 0x%x\n",
> > Status));
> > > -
> > > -  NotifyPhaseParams.Phase = EnumInitPhaseReadyToBoot;
> > > -  Status = CallFspNotifyPhase (FspHeader, &NotifyPhaseParams);
> > > -  DEBUG((DEBUG_INFO, "FSP S3NotifyPhase ReadyToBoot status:
> 0x%x\n", Status));
> > > -
> > > -  return EFI_SUCCESS;
> > > -}
> > > diff --git a/IntelFspWrapperPkg/FspInitPei/SecMain.c
> > > b/IntelFspWrapperPkg/FspInitPei/SecMain.c
> > > deleted file mode 100644
> > > index 4d0878a..0000000
> > > --- a/IntelFspWrapperPkg/FspInitPei/SecMain.c
> > > +++ /dev/null
> > > @@ -1,310 +0,0 @@
> > > -/** @file
> > > -  C functions in SEC
> > > -
> > > -  Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
> > > -  This program and the accompanying materials
> > > -  are licensed and made available under the terms and conditions of the
> BSD License
> > > -  which accompanies this distribution.  The full text of the license may
> be found at
> > > -  http://opensource.org/licenses/bsd-license.php.
> > > -
> > > -  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS
> IS" BASIS,
> > > -  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > > -
> > > -**/
> > > -
> > > -
> > > -#include "SecMain.h"
> > > -
> > > -EFI_PEI_PPI_DESCRIPTOR            mPeiSecMainPpi[] = {
> > > -  {
> > > -    EFI_PEI_PPI_DESCRIPTOR_PPI,
> > > -    &gTopOfTemporaryRamPpiGuid,
> > > -    NULL // To be patched later.
> > > -  },
> > > -  {
> > > -    EFI_PEI_PPI_DESCRIPTOR_PPI |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
> > > -    &gFspInitDonePpiGuid,
> > > -    &gFspInitDonePpi
> > > -  },
> > > -};
> > > -
> > > -FSP_INIT_DONE_PPI gFspInitDonePpi = {
> > > -  FspInitDoneGetFspHobList
> > > -};
> > > -
> > > -//
> > > -// These are IDT entries pointing to 10:FFFFFFE4h.
> > > -//
> > > -UINT64  mIdtEntryTemplate = 0xffff8e000010ffe4ULL;
> > > -
> > > -/**
> > > -  Caller provided function to be invoked at the end of
> InitializeDebugAgent().
> > > -
> > > -  Entry point to the C language phase of SEC. After the SEC assembly
> > > -  code has initialized some temporary memory and set up the stack,
> > > -  the control is transferred to this function.
> > > -
> > > -  @param[in] Context    The first input parameter of
> InitializeDebugAgent().
> > > -
> > > -**/
> > > -VOID
> > > -EFIAPI
> > > -SecStartupPhase2(
> > > -  IN VOID                     *Context
> > > -  );
> > > -
> > > -
> > > -/**
> > > -
> > > -  Entry point to the C language phase of SEC. After the SEC assembly
> > > -  code has initialized some temporary memory and set up the stack,
> > > -  the control is transferred to this function.
> > > -
> > > -  @param[in] SizeOfRam           Size of the temporary memory
> available for use.
> > > -  @param[in] TempRamBase         Base address of tempory ram
> > > -  @param[in] BootFirmwareVolume  Base address of the Boot
> Firmware Volume.
> > > -**/
> > > -VOID
> > > -EFIAPI
> > > -SecStartup (
> > > -  IN UINT32                   SizeOfRam,
> > > -  IN UINT32                   TempRamBase,
> > > -  IN VOID                     *BootFirmwareVolume
> > > -  )
> > > -{
> > > -  EFI_SEC_PEI_HAND_OFF        SecCoreData;
> > > -  IA32_DESCRIPTOR             IdtDescriptor;
> > > -  SEC_IDT_TABLE               IdtTableInStack;
> > > -  UINT32                      Index;
> > > -  UINT32                      PeiStackSize;
> > > -
> > > -  PeiStackSize = PcdGet32 (PcdPeiTemporaryRamStackSize);
> > > -  if (PeiStackSize == 0) {
> > > -    PeiStackSize = (SizeOfRam >> 1);
> > > -  }
> > > -
> > > -  ASSERT (PeiStackSize < SizeOfRam);
> > > -
> > > -  //
> > > -  // Process all libraries constructor function linked to SecCore.
> > > -  //
> > > -  ProcessLibraryConstructorList ();
> > > -
> > > -  DEBUG ((DEBUG_INFO, "FspPei - SecStartup\n"));
> > > -
> > > -  //
> > > -  // Initialize floating point operating environment
> > > -  // to be compliant with UEFI spec.
> > > -  //
> > > -  InitializeFloatingPointUnits ();
> > > -
> > > -
> > > -  // |-------------------|---->
> > > -  // |Idt Table          |
> > > -  // |-------------------|
> > > -  // |PeiService Pointer |    PeiStackSize
> > > -  // |-------------------|
> > > -  // |                   |
> > > -  // |      Stack        |
> > > -  // |-------------------|---->
> > > -  // |                   |
> > > -  // |                   |
> > > -  // |      Heap         |    PeiTemporayRamSize
> > > -  // |                   |
> > > -  // |                   |
> > > -  // |-------------------|---->  TempRamBase
> > > -
> > > -  IdtTableInStack.PeiService = 0;
> > > -  for (Index = 0; Index < SEC_IDT_ENTRY_COUNT; Index ++) {
> > > -    CopyMem ((VOID*)&IdtTableInStack.IdtTable[Index],
> (VOID*)&mIdtEntryTemplate,
> > > sizeof (UINT64));
> > > -  }
> > > -
> > > -  IdtDescriptor.Base  = (UINTN) &IdtTableInStack.IdtTable;
> > > -  IdtDescriptor.Limit = (UINT16)(sizeof (IdtTableInStack.IdtTable) - 1);
> > > -
> > > -  AsmWriteIdtr (&IdtDescriptor);
> > > -
> > > -  //
> > > -  // Update the base address and length of Pei temporary memory
> > > -  //
> > > -  SecCoreData.DataSize               = (UINT16) sizeof
> (EFI_SEC_PEI_HAND_OFF);
> > > -  SecCoreData.BootFirmwareVolumeBase = BootFirmwareVolume;
> > > -  SecCoreData.BootFirmwareVolumeSize = (UINTN)(SIZE_4GB -
> (UINTN)
> > BootFirmwareVolume);
> > > -  SecCoreData.TemporaryRamBase       = (VOID*)(UINTN)
> TempRamBase;
> > > -  SecCoreData.TemporaryRamSize       = SizeOfRam;
> > > -  SecCoreData.PeiTemporaryRamBase    =
> SecCoreData.TemporaryRamBase;
> > > -  SecCoreData.PeiTemporaryRamSize    = SizeOfRam - PeiStackSize;
> > > -  SecCoreData.StackBase              =
> (VOID*)(UINTN)(TempRamBase +
> > > SecCoreData.PeiTemporaryRamSize);
> > > -  SecCoreData.StackSize              = PeiStackSize;
> > > -
> > > -  DEBUG ((DEBUG_INFO, "BootFirmwareVolumeBase - 0x%x\n",
> > > SecCoreData.BootFirmwareVolumeBase));
> > > -  DEBUG ((DEBUG_INFO, "BootFirmwareVolumeSize - 0x%x\n",
> > > SecCoreData.BootFirmwareVolumeSize));
> > > -  DEBUG ((DEBUG_INFO, "TemporaryRamBase       - 0x%x\n",
> > > SecCoreData.TemporaryRamBase));
> > > -  DEBUG ((DEBUG_INFO, "TemporaryRamSize       - 0x%x\n",
> > > SecCoreData.TemporaryRamSize));
> > > -  DEBUG ((DEBUG_INFO, "PeiTemporaryRamBase    - 0x%x\n",
> > > SecCoreData.PeiTemporaryRamBase));
> > > -  DEBUG ((DEBUG_INFO, "PeiTemporaryRamSize    - 0x%x\n",
> > > SecCoreData.PeiTemporaryRamSize));
> > > -  DEBUG ((DEBUG_INFO, "StackBase              - 0x%x\n",
> SecCoreData.StackBase));
> > > -  DEBUG ((DEBUG_INFO, "StackSize              - 0x%x\n",
> SecCoreData.StackSize));
> > > -
> > > -  //
> > > -  // Initialize Debug Agent to support source level debug in SEC/PEI
> phases before
> > > memory ready.
> > > -  //
> > > -  InitializeDebugAgent (DEBUG_AGENT_INIT_PREMEM_SEC,
> &SecCoreData,
> > SecStartupPhase2);
> > > -
> > > -}
> > > -
> > > -/**
> > > -  This API patch the TopOfTemporaryRam value in SecPpiList.
> > > -
> > > -  @param[in,out] SecPpiList           PPI list to be patched.
> > > -  @param[in]     TopOfTemporaryRam    The top of Temporary
> Ram.
> > > -
> > > -**/
> > > -VOID
> > > -PatchTopOfTemporaryRamPpi (
> > > -  IN OUT EFI_PEI_PPI_DESCRIPTOR *SecPpiList,
> > > -  IN VOID                       *TopOfTemporaryRam
> > > -  )
> > > -{
> > > -  SecPpiList[0].Ppi = TopOfTemporaryRam;
> > > -}
> > > -
> > > -/**
> > > -  Caller provided function to be invoked at the end of
> InitializeDebugAgent().
> > > -
> > > -  Entry point to the C language phase of SEC. After the SEC assembly
> > > -  code has initialized some temporary memory and set up the stack,
> > > -  the control is transferred to this function.
> > > -
> > > -  @param[in] Context    The first input parameter of
> InitializeDebugAgent().
> > > -
> > > -**/
> > > -VOID
> > > -EFIAPI
> > > -SecStartupPhase2(
> > > -  IN VOID                     *Context
> > > -  )
> > > -{
> > > -  EFI_SEC_PEI_HAND_OFF        *SecCoreData;
> > > -  EFI_PEI_PPI_DESCRIPTOR      *PpiList;
> > > -  UINT32                      Index;
> > > -  EFI_PEI_PPI_DESCRIPTOR
> > > LocalSecPpiList[sizeof(mPeiSecMainPpi)/sizeof(mPeiSecMainPpi[0])];
> > > -  EFI_PEI_PPI_DESCRIPTOR
> > AllSecPpiList[FixedPcdGet32(PcdSecCoreMaxPpiSupported)];
> > > -  EFI_PEI_CORE_ENTRY_POINT    PeiCoreEntryPoint;
> > > -
> > > -  SecCoreData = (EFI_SEC_PEI_HAND_OFF *) Context;
> > > -  //
> > > -  // Find Pei Core entry point. It will report SEC and Pei Core debug
> information if
> > > remote debug
> > > -  // is enabled.
> > > -  //
> > > -  FindAndReportEntryPoints ((EFI_FIRMWARE_VOLUME_HEADER *)
> SecCoreData-
> > > >BootFirmwareVolumeBase, &PeiCoreEntryPoint);
> > > -  if (PeiCoreEntryPoint == NULL)
> > > -  {
> > > -    CpuDeadLoop ();
> > > -  }
> > > -
> > > -  CopyMem (LocalSecPpiList, mPeiSecMainPpi,
> sizeof(mPeiSecMainPpi));
> > > -  PatchTopOfTemporaryRamPpi (LocalSecPpiList, (VOID
> *)((UINTN)SecCoreData-
> > > >TemporaryRamBase + SecCoreData->TemporaryRamSize));
> > > -
> > > -  //
> > > -  // Perform platform specific initialization before entering PeiCore.
> > > -  //
> > > -  PpiList = SecPlatformMain (SecCoreData);
> > > -  if (PpiList != NULL) {
> > > -    //
> > > -    // Remove the terminal flag from the terminal Ppi
> > > -    //
> > > -    CopyMem (AllSecPpiList, LocalSecPpiList, sizeof (LocalSecPpiList));
> > > -    for (Index = 0; Index < PcdGet32 (PcdSecCoreMaxPpiSupported);
> Index ++) {
> > > -      if ((AllSecPpiList[Index].Flags &
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) ==
> > > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {
> > > -        break;
> > > -      }
> > > -    }
> > > -    AllSecPpiList[Index].Flags = AllSecPpiList[Index].Flags &
> > > (~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);
> > > -
> > > -    //
> > > -    // Append the platform additional Ppi list
> > > -    //
> > > -    Index += 1;
> > > -    while (Index < PcdGet32 (PcdSecCoreMaxPpiSupported) &&
> > > -           ((PpiList->Flags &
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) !=
> > > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST)) {
> > > -      CopyMem (&AllSecPpiList[Index], PpiList, sizeof
> (EFI_PEI_PPI_DESCRIPTOR));
> > > -      Index++;
> > > -      PpiList++;
> > > -    }
> > > -
> > > -    //
> > > -    // Check whether the total Ppis exceeds the max supported Ppi.
> > > -    //
> > > -    if (Index >= PcdGet32 (PcdSecCoreMaxPpiSupported)) {
> > > -      //
> > > -      // the total Ppi is larger than the supported Max
> > > -      // PcdSecCoreMaxPpiSupported can be enlarged to solve it.
> > > -      //
> > > -      CpuDeadLoop ();
> > > -    } else {
> > > -      //
> > > -      // Add the terminal Ppi
> > > -      //
> > > -      CopyMem (&AllSecPpiList[Index], PpiList, sizeof
> (EFI_PEI_PPI_DESCRIPTOR));
> > > -    }
> > > -
> > > -    //
> > > -    // Set PpiList to the total Ppi
> > > -    //
> > > -    PpiList = &AllSecPpiList[0];
> > > -  } else {
> > > -    //
> > > -    // No addition Ppi, PpiList directly point to the common Ppi list.
> > > -    //
> > > -    PpiList = &LocalSecPpiList[0];
> > > -  }
> > > -
> > > -  //
> > > -  // Transfer the control to the PEI core
> > > -  //
> > > -  ASSERT (PeiCoreEntryPoint != NULL);
> > > -  (*PeiCoreEntryPoint) (SecCoreData, PpiList);
> > > -
> > > -  //
> > > -  // Should not come here.
> > > -  //
> > > -  return ;
> > > -}
> > > -
> > > -/**
> > > -  Return Hob list produced by FSP.
> > > -
> > > -  @param[in]  PeiServices  The pointer to the PEI Services Table.
> > > -  @param[in]  This         The pointer to this instance of this PPI.
> > > -  @param[out] FspHobList   The pointer to Hob list produced by FSP.
> > > -
> > > -  @return EFI_SUCCESS FReturn Hob list produced by FSP successfully.
> > > -**/
> > > -EFI_STATUS
> > > -EFIAPI
> > > -FspInitDoneGetFspHobList (
> > > -  IN  CONST EFI_PEI_SERVICES         **PeiServices,
> > > -  IN  FSP_INIT_DONE_PPI              *This,
> > > -  OUT VOID                           **FspHobList
> > > -  )
> > > -{
> > > -  VOID        *TopOfTemporaryRamPpi;
> > > -  EFI_STATUS  Status;
> > > -
> > > -  Status = (*PeiServices)->LocatePpi (
> > > -                             PeiServices,
> > > -                             &gTopOfTemporaryRamPpiGuid,
> > > -                             0,
> > > -                             NULL,
> > > -                             (VOID **) &TopOfTemporaryRamPpi
> > > -                             );
> > > -  if (EFI_ERROR (Status)) {
> > > -    return EFI_NOT_FOUND;
> > > -  }
> > > -
> > > -  *FspHobList = (VOID *)(UINTN)(*(UINT32
> *)((UINTN)TopOfTemporaryRamPpi -
> > > sizeof(UINT32)));
> > > -
> > > -  return EFI_SUCCESS;
> > > -}
> > > -
> > > diff --git a/IntelFspWrapperPkg/FspInitPei/SecMain.h
> > > b/IntelFspWrapperPkg/FspInitPei/SecMain.h
> > > deleted file mode 100644
> > > index fc20397..0000000
> > > --- a/IntelFspWrapperPkg/FspInitPei/SecMain.h
> > > +++ /dev/null
> > > @@ -1,116 +0,0 @@
> > > -/** @file
> > > -  Master header file for SecCore.
> > > -
> > > -  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
> > > -  This program and the accompanying materials
> > > -  are licensed and made available under the terms and conditions of the
> BSD License
> > > -  which accompanies this distribution.  The full text of the license may
> be found at
> > > -  http://opensource.org/licenses/bsd-license.php.
> > > -
> > > -  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS
> IS" BASIS,
> > > -  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > > -
> > > -**/
> > > -
> > > -#ifndef _SEC_CORE_H_
> > > -#define _SEC_CORE_H_
> > > -
> > > -
> > > -#include <PiPei.h>
> > > -
> > > -#include <Ppi/TopOfTemporaryRam.h>
> > > -#include <Ppi/FspInitDone.h>
> > > -
> > > -#include <Library/BaseLib.h>
> > > -#include <Library/DebugLib.h>
> > > -#include <Library/PcdLib.h>
> > > -#include <Library/BaseMemoryLib.h>
> > > -#include <Library/FspPlatformSecLib.h>
> > > -#include <Library/FspPlatformInfoLib.h>
> > > -#include <Library/UefiCpuLib.h>
> > > -#include <Library/PeCoffGetEntryPointLib.h>
> > > -#include <Library/PeCoffExtraActionLib.h>
> > > -#include <Library/DebugAgentLib.h>
> > > -
> > > -#include <FspApi.h>
> > > -#include <FspInfoHeader.h>
> > > -
> > > -#define SEC_IDT_ENTRY_COUNT  34
> > > -
> > > -typedef struct _SEC_IDT_TABLE {
> > > -  //
> > > -  // Reserved 8 bytes preceding IDT to store EFI_PEI_SERVICES**, since
> IDT base
> > > -  // address should be 8-byte alignment.
> > > -  // Note: For IA32, only the 4 bytes immediately preceding IDT is used
> to store
> > > -  // EFI_PEI_SERVICES**
> > > -  //
> > > -  UINT64            PeiService;
> > > -  UINT64            IdtTable[SEC_IDT_ENTRY_COUNT];
> > > -} SEC_IDT_TABLE;
> > > -
> > > -/**
> > > -  Entry point to the C language phase of SEC. After the SEC assembly
> > > -  code has initialized some temporary memory and set up the stack,
> > > -  the control is transferred to this function.
> > > -
> > > -  @param[in] SizeOfRam           Size of the temporary memory
> available for use.
> > > -  @param[in] TempRamBase         Base address of tempory ram
> > > -  @param[in] BootFirmwareVolume  Base address of the Boot
> Firmware Volume.
> > > -**/
> > > -VOID
> > > -EFIAPI
> > > -SecStartup (
> > > -  IN UINT32                   SizeOfRam,
> > > -  IN UINT32                   TempRamBase,
> > > -  IN VOID                     *BootFirmwareVolume
> > > -  );
> > > -
> > > -/**
> > > -  Find and return Pei Core entry point.
> > > -
> > > -  It also find SEC and PEI Core file debug inforamtion. It will report
> them if
> > > -  remote debug is enabled.
> > > -
> > > -  @param[in]  BootFirmwareVolumePtr  Point to the boot firmware
> volume.
> > > -  @param[out] PeiCoreEntryPoint      Point to the PEI core entry
> point.
> > > -
> > > -**/
> > > -VOID
> > > -EFIAPI
> > > -FindAndReportEntryPoints (
> > > -  IN  EFI_FIRMWARE_VOLUME_HEADER
> *BootFirmwareVolumePtr,
> > > -  OUT EFI_PEI_CORE_ENTRY_POINT         *PeiCoreEntryPoint
> > > -  );
> > > -
> > > -/**
> > > -  Autogenerated function that calls the library constructors for all of
> the module's
> > > -  dependent libraries.  This function must be called by the SEC Core
> once a stack
> > has
> > > -  been established.
> > > -
> > > -**/
> > > -VOID
> > > -EFIAPI
> > > -ProcessLibraryConstructorList (
> > > -  VOID
> > > -  );
> > > -
> > > -/**
> > > -  Return Hob list produced by FSP.
> > > -
> > > -  @param[in]  PeiServices  The pointer to the PEI Services Table.
> > > -  @param[in]  This         The pointer to this instance of this PPI.
> > > -  @param[out] FspHobList   The pointer to Hob list produced by FSP.
> > > -
> > > -  @return EFI_SUCCESS FReturn Hob list produced by FSP successfully.
> > > -**/
> > > -EFI_STATUS
> > > -EFIAPI
> > > -FspInitDoneGetFspHobList (
> > > -  IN  CONST EFI_PEI_SERVICES         **PeiServices,
> > > -  IN  FSP_INIT_DONE_PPI              *This,
> > > -  OUT VOID                           **FspHobList
> > > -  );
> > > -
> > > -extern FSP_INIT_DONE_PPI gFspInitDonePpi;
> > > -
> > > -#endif
> > > diff --git a/IntelFspWrapperPkg/FspmWrapperPeim/FspmWrapperPeim.c
> > > b/IntelFspWrapperPkg/FspmWrapperPeim/FspmWrapperPeim.c
> > > new file mode 100644
> > > index 0000000..4370fde
> > > --- /dev/null
> > > +++ b/IntelFspWrapperPkg/FspmWrapperPeim/FspmWrapperPeim.c
> > > @@ -0,0 +1,161 @@
> > > +/** @file
> > > +  This will be invoked only once. It will call FspMemoryInit API,
> > > +  register TemporaryRamDonePpi to call TempRamExit API, and register
> > > MemoryDiscoveredPpi
> > > +  notify to call FspSiliconInit API.
> > > +
> > > +  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>
> > > +  This program and the accompanying materials
> > > +  are licensed and made available under the terms and conditions of
> the BSD License
> > > +  which accompanies this distribution.  The full text of the license may
> be found at
> > > +  http://opensource.org/licenses/bsd-license.php.
> > > +
> > > +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS
> IS" BASIS,
> > > +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > > +
> > > +**/
> > > +
> > > +
> > > +#include <PiPei.h>
> > > +
> > > +#include <Library/PeimEntryPoint.h>
> > > +#include <Library/PeiServicesLib.h>
> > > +#include <Library/PeiServicesTablePointerLib.h>
> > > +#include <Library/BaseLib.h>
> > > +#include <Library/DebugLib.h>
> > > +#include <Library/BaseMemoryLib.h>
> > > +#include <Library/MemoryAllocationLib.h>
> > > +#include <Library/HobLib.h>
> > > +#include <Library/PcdLib.h>
> > > +#include <Library/TimerLib.h>
> > > +#include <Library/PerformanceLib.h>
> > > +#include <Library/FspWrapperPlatformLib.h>
> > > +#include <Library/FspWrapperHobProcessLib.h>
> > > +#include <Library/FspWrapperApiLib.h>
> > > +
> > > +#include <Ppi/FspSiliconInitDone.h>
> > > +#include <Ppi/EndOfPeiPhase.h>
> > > +#include <Ppi/MemoryDiscovered.h>
> > > +#include <Ppi/SecPlatformInformation.h>
> > > +#include <Library/PlatformSecLib.h>
> > > +#include <Library/FspWrapperApiTestLib.h>
> > > +#include <FspApi.h>
> > > +
> > > +extern EFI_GUID gFspHobGuid;
> > > +
> > > +/**
> > > +  Call FspMemoryInit API.
> > > +
> > > +  @return Status returned by FspMemoryInit API.
> > > +**/
> > > +EFI_STATUS
> > > +PeiFspMemoryInit (
> > > +  VOID
> > > +  )
> > > +{
> > > +  FSP_INFO_HEADER           *FspmHeaderPtr;
> > > +  EFI_STATUS                Status;
> > > +  UINT64                    TimeStampCounterStart;
> > > +  VOID                      *FspHobListPtr;
> > > +  VOID                      *HobData;
> > > +  FSPM_UPD_COMMON           *FspmUpdDataPtr;
> > > +  UINTN                     *SourceData;
> > > +
> > > +  DEBUG ((DEBUG_INFO, "PeiFspMemoryInit enter\n"));
> > > +
> > > +  FspHobListPtr = NULL;
> > > +
> > > +  //
> > > +  // Copy default FSP-M UPD data from Flash
> > > +  //
> > > +  FspmHeaderPtr = (FSP_INFO_HEADER *)FspFindFspHeader (PcdGet32
> > (PcdFspmBaseAddress));
> > > +  FspmUpdDataPtr = (FSPM_UPD_COMMON *)AllocateZeroPool
> ((UINTN)FspmHeaderPtr-
> > > >CfgRegionSize);
> > > +  ASSERT (FspmUpdDataPtr != NULL);
> > > +  SourceData = (UINTN *)((UINTN)FspmHeaderPtr->ImageBase +
> (UINTN)FspmHeaderPtr-
> > > >CfgRegionOffset);
> > > +  CopyMem (FspmUpdDataPtr, SourceData,
> (UINTN)FspmHeaderPtr->CfgRegionSize);
> > > +
> > > +  DEBUG ((DEBUG_INFO, "FspWrapperPlatformInitPreMem enter\n"));
> > > +  UpdateFspmUpdData ((VOID *)FspmUpdDataPtr);
> > > +  DEBUG ((DEBUG_INFO, "  NvsBufferPtr        - 0x%x\n",
> FspmUpdDataPtr-
> > > >FspmArchUpd.NvsBufferPtr));
> > > +  DEBUG ((DEBUG_INFO, "  StackBase           - 0x%x\n",
> FspmUpdDataPtr-
> > > >FspmArchUpd.StackBase));
> > > +  DEBUG ((DEBUG_INFO, "  StackSize           - 0x%x\n",
> FspmUpdDataPtr-
> > > >FspmArchUpd.StackSize));
> > > +  DEBUG ((DEBUG_INFO, "  BootLoaderTolumSize - 0x%x\n",
> FspmUpdDataPtr-
> > > >FspmArchUpd.BootLoaderTolumSize));
> > > +  DEBUG ((DEBUG_INFO, "  BootMode            - 0x%x\n",
> FspmUpdDataPtr-
> > > >FspmArchUpd.BootMode));
> > > +  DEBUG ((DEBUG_INFO, "  HobListPtr          - 0x%x\n",
> &FspHobListPtr));
> > > +
> > > +  TimeStampCounterStart = AsmReadTsc ();
> > > +  Status = CallFspMemoryInit (FspmUpdDataPtr, &FspHobListPtr);
> > > +  // @note: Create hobs after memory initialization and not in temp
> RAM. Hence
> > passing
> > > the recorded timestamp here
> > > +  PERF_START_EX(&gFspApiPerformanceGuid, "EventRec", NULL,
> TimeStampCounterStart,
> > > 0xD000);
> > > +  PERF_END_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0,
> 0xD07F);
> > > +  DEBUG ((DEBUG_INFO, "Total time spent executing
> FspMemoryInitApi: %d
> > millisecond\n",
> > > DivU64x32 (GetTimeInNanoSecond (AsmReadTsc () -
> TimeStampCounterStart), 1000000)));
> > > +  if (EFI_ERROR(Status)) {
> > > +    DEBUG ((DEBUG_ERROR, "ERROR - Failed to execute
> FspMemoryInitApi(), Status =
> > > %r\n", Status));
> > > +  }
> > > +  DEBUG((DEBUG_INFO, "FspMemoryInit status: 0x%x\n", Status));
> > > +  ASSERT_EFI_ERROR (Status);
> > > +
> > > +
> > > +  Status = TestFspMemoryInitApiOutput (FspmUpdDataPtr,
> &FspHobListPtr);
> > > +  if (EFI_ERROR (Status)) {
> > > +    DEBUG ((DEBUG_ERROR, "ERROR - TestFspMemoryInitApiOutput ()
> fail, Status =
> > %r\n",
> > > Status));
> > > +  }
> > > +
> > > +  DEBUG ((DEBUG_INFO, "  FspHobListPtr (returned) - 0x%x\n",
> FspHobListPtr));
> > > +  ASSERT (FspHobListPtr != NULL);
> > > +
> > > +  PostFspmHobProcess (FspHobListPtr);
> > > +
> > > +  //
> > > +  // FspHobList is not complete at this moment.
> > > +  // Save FspHobList pointer to hob, so that it can be got later
> > > +  //
> > > +  HobData = BuildGuidHob (
> > > +             &gFspHobGuid,
> > > +             sizeof (VOID *)
> > > +             );
> > > +  ASSERT (HobData != NULL);
> > > +  CopyMem (HobData, &FspHobListPtr, sizeof (FspHobListPtr));
> > > +
> > > +  return Status;
> > > +}
> > > +
> > > +/**
> > > +  Do FSP initialization.
> > > +
> > > +  @return FSP initialization status.
> > > +**/
> > > +EFI_STATUS
> > > +EFIAPI
> > > +FspmWrapperInit (
> > > +  VOID
> > > +  )
> > > +{
> > > +  EFI_STATUS           Status;
> > > +
> > > +  Status = PeiFspMemoryInit ();
> > > +  ASSERT_EFI_ERROR (Status);
> > > +
> > > +  return Status;
> > > +}
> > > +
> > > +/**
> > > +  This is the entrypoint of PEIM
> > > +
> > > +  @param[in] FileHandle  Handle of the file being invoked.
> > > +  @param[in] PeiServices Describes the list of possible PEI Services.
> > > +
> > > +  @retval EFI_SUCCESS if it completed successfully.
> > > +**/
> > > +EFI_STATUS
> > > +EFIAPI
> > > +FspmWrapperPeimEntryPoint (
> > > +  IN       EFI_PEI_FILE_HANDLE  FileHandle,
> > > +  IN CONST EFI_PEI_SERVICES     **PeiServices
> > > +  )
> > > +{
> > > +  DEBUG((DEBUG_INFO, "FspmWrapperPeimEntryPoint\n"));
> > > +
> > > +  FspmWrapperInit ();
> > > +
> > > +  return EFI_SUCCESS;
> > > +}
> > > diff --git
> a/IntelFspWrapperPkg/FspmWrapperPeim/FspmWrapperPeim.inf
> > > b/IntelFspWrapperPkg/FspmWrapperPeim/FspmWrapperPeim.inf
> > > new file mode 100644
> > > index 0000000..55b9679
> > > --- /dev/null
> > > +++ b/IntelFspWrapperPkg/FspmWrapperPeim/FspmWrapperPeim.inf
> > > @@ -0,0 +1,77 @@
> > > +## @file
> > > +# FSP-M wrapper PEI Module
> > > +#
> > > +# This PEIM initialize FSP.
> > > +# This will be invoked only once. It will call FspMemoryInit API,
> > > +# register TemporaryRamDonePpi to call TempRamExit API, and register
> > > MemoryDiscoveredPpi
> > > +# notify to call FspSiliconInit API.
> > > +#
> > > +#  Copyright (c) 2014 - 2016, Intel Corporation. All rights
> reserved.<BR>
> > > +#
> > > +#  This program and the accompanying materials
> > > +#  are licensed and made available under the terms and conditions of
> the BSD License
> > > +#  which accompanies this distribution. The full text of the license may
> be found at
> > > +#  http://opensource.org/licenses/bsd-license.php.
> > > +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN
> "AS IS" BASIS,
> > > +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > > +#
> > > +##
> > > +
> > > +[Defines]
> > > +  INF_VERSION                    = 0x00010017
> > > +  BASE_NAME                      = FspmWrapperPeim
> > > +  FILE_GUID                      =
> CCD05B01-8C4E-409D-B6D3-BFB82F175C3A
> > > +  VERSION_STRING                 = 1.0
> > > +  MODULE_TYPE                    = PEIM
> > > +  ENTRY_POINT                    =
> FspmWrapperPeimEntryPoint
> > > +
> > > +#
> > > +# The following information is for reference only and not required by
> the build
> > tools.
> > > +#
> > > +#  VALID_ARCHITECTURES           = IA32
> > > +#
> > > +
> > > +[LibraryClasses]
> > > +  PeimEntryPoint
> > > +  PeiServicesLib
> > > +  PeiServicesTablePointerLib
> > > +  BaseLib
> > > +  BaseMemoryLib
> > > +  MemoryAllocationLib
> > > +  DebugLib
> > > +  HobLib
> > > +  FspWrapperPlatformLib
> > > +  FspWrapperHobProcessLib
> > > +  DebugAgentLib
> > > +  UefiCpuLib
> > > +  PeCoffGetEntryPointLib
> > > +  PeCoffExtraActionLib
> > > +  PerformanceLib
> > > +  TimerLib
> > > +  FspWrapperApiLib
> > > +  FspWrapperApiTestLib
> > > +
> > > +[Packages]
> > > +  MdePkg/MdePkg.dec
> > > +  MdeModulePkg/MdeModulePkg.dec
> > > +  UefiCpuPkg/UefiCpuPkg.dec
> > > +  IntelFspPkg/IntelFspPkg.dec
> > > +  IntelFspWrapperPkg/IntelFspWrapperPkg.dec
> > > +
> > > +[Pcd]
> > > +  gFspWrapperTokenSpaceGuid.PcdFspmBaseAddress
> ## CONSUMES
> > > +
> > > +[Sources]
> > > +  FspmWrapperPeim.c
> > > +
> > > +[Ppis]
> > > +  gTopOfTemporaryRamPpiGuid             ## PRODUCES
> > > +  gEfiEndOfPeiSignalPpiGuid             ## PRODUCES
> > > +  gEfiPeiMemoryDiscoveredPpiGuid        ## PRODUCES
> > > +
> > > +[Guids]
> > > +  gFspHobGuid                           ## PRODUCES ## HOB
> > > +  gFspApiPerformanceGuid                ## CONSUMES ## GUID
> > > +
> > > +[Depex]
> > > +  gEfiPeiMasterBootModePpiGuid
> > > diff --git a/IntelFspWrapperPkg/FspsWrapperPeim/FspsWrapperPeim.c
> > > b/IntelFspWrapperPkg/FspsWrapperPeim/FspsWrapperPeim.c
> > > new file mode 100644
> > > index 0000000..8dfb311
> > > --- /dev/null
> > > +++ b/IntelFspWrapperPkg/FspsWrapperPeim/FspsWrapperPeim.c
> > > @@ -0,0 +1,313 @@
> > > +/** @file
> > > +  This will be invoked only once. It will call FspMemoryInit API,
> > > +  register TemporaryRamDonePpi to call TempRamExit API, and register
> > > MemoryDiscoveredPpi
> > > +  notify to call FspSiliconInit API.
> > > +
> > > +  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>
> > > +  This program and the accompanying materials
> > > +  are licensed and made available under the terms and conditions of
> the BSD License
> > > +  which accompanies this distribution.  The full text of the license may
> be found at
> > > +  http://opensource.org/licenses/bsd-license.php.
> > > +
> > > +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS
> IS" BASIS,
> > > +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > > +
> > > +**/
> > > +
> > > +#include <PiPei.h>
> > > +
> > > +#include <Library/PeimEntryPoint.h>
> > > +#include <Library/PeiServicesLib.h>
> > > +#include <Library/PeiServicesTablePointerLib.h>
> > > +#include <Library/BaseLib.h>
> > > +#include <Library/DebugLib.h>
> > > +#include <Library/BaseMemoryLib.h>
> > > +#include <Library/HobLib.h>
> > > +#include <Library/PcdLib.h>
> > > +#include <Library/MemoryAllocationLib.h>
> > > +#include <Library/FspWrapperPlatformLib.h>
> > > +#include <Library/FspWrapperHobProcessLib.h>
> > > +#include <Library/TimerLib.h>
> > > +#include <Library/PerformanceLib.h>
> > > +#include <Library/FspWrapperApiLib.h>
> > > +
> > > +#include <Ppi/FspSiliconInitDone.h>
> > > +#include <Ppi/EndOfPeiPhase.h>
> > > +#include <Ppi/MemoryDiscovered.h>
> > > +#include <Ppi/TemporaryRamDone.h>
> > > +#include <Ppi/SecPlatformInformation.h>
> > > +#include <Library/PlatformSecLib.h>
> > > +#include <Library/FspWrapperApiTestLib.h>
> > > +#include <FspApi.h>
> > > +
> > > +extern EFI_PEI_NOTIFY_DESCRIPTOR mS3EndOfPeiNotifyDesc;
> > > +extern EFI_GUID                  gFspHobGuid;
> > > +
> > > +/**
> > > +This function handles S3 resume task at the end of PEI
> > > +
> > > +@param[in] PeiServices    Pointer to PEI Services Table.
> > > +@param[in] NotifyDesc     Pointer to the descriptor for the
> Notification event that
> > > +caused this function to execute.
> > > +@param[in] Ppi            Pointer to the PPI data associated with
> this function.
> > > +
> > > +@retval EFI_STATUS        Always return EFI_SUCCESS
> > > +**/
> > > +EFI_STATUS
> > > +EFIAPI
> > > +S3EndOfPeiNotify(
> > > +  IN EFI_PEI_SERVICES          **PeiServices,
> > > +  IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
> > > +  IN VOID                      *Ppi
> > > +  );
> > > +
> > > +EFI_PEI_NOTIFY_DESCRIPTOR mS3EndOfPeiNotifyDesc = {
> > > +  (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
> > > +  &gEfiEndOfPeiSignalPpiGuid,
> > > +  S3EndOfPeiNotify
> > > +};
> > > +
> > > +/**
> > > +This function handles S3 resume task at the end of PEI
> > > +
> > > +@param[in] PeiServices    Pointer to PEI Services Table.
> > > +@param[in] NotifyDesc     Pointer to the descriptor for the
> Notification event that
> > > +caused this function to execute.
> > > +@param[in] Ppi            Pointer to the PPI data associated with
> this function.
> > > +
> > > +@retval EFI_STATUS        Always return EFI_SUCCESS
> > > +**/
> > > +EFI_STATUS
> > > +EFIAPI
> > > +S3EndOfPeiNotify(
> > > +  IN EFI_PEI_SERVICES          **PeiServices,
> > > +  IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
> > > +  IN VOID                      *Ppi
> > > +  )
> > > +{
> > > +  NOTIFY_PHASE_PARAMS NotifyPhaseParams;
> > > +  EFI_STATUS          Status;
> > > +
> > > +  DEBUG((DEBUG_INFO, "S3EndOfPeiNotify enter\n"));
> > > +
> > > +  NotifyPhaseParams.Phase = EnumInitPhaseAfterPciEnumeration;
> > > +  Status = CallFspNotifyPhase (&NotifyPhaseParams);
> > > +  DEBUG((DEBUG_INFO, "FSP S3NotifyPhase AfterPciEnumeration
> status: 0x%x\n",
> > Status));
> > > +
> > > +  NotifyPhaseParams.Phase = EnumInitPhaseReadyToBoot;
> > > +  Status = CallFspNotifyPhase (&NotifyPhaseParams);
> > > +  DEBUG((DEBUG_INFO, "FSP S3NotifyPhase ReadyToBoot status:
> 0x%x\n", Status));
> > > +
> > > +  NotifyPhaseParams.Phase = EnumInitPhaseEndOfFirmware;
> > > +  Status = CallFspNotifyPhase (&NotifyPhaseParams);
> > > +  DEBUG((DEBUG_INFO, "FSP S3NotifyPhase EndOfFirmware status:
> 0x%x\n", Status));
> > > +
> > > +  return EFI_SUCCESS;
> > > +}
> > > +
> > > +/**
> > > +Return Hob list produced by FSP.
> > > +
> > > +@param[in]  PeiServices  The pointer to the PEI Services Table.
> > > +@param[in]  This         The pointer to this instance of this PPI.
> > > +@param[out] FspHobList   The pointer to Hob list produced by FSP.
> > > +
> > > +@return EFI_SUCCESS FReturn Hob list produced by FSP successfully.
> > > +**/
> > > +EFI_STATUS
> > > +EFIAPI
> > > +FspSiliconInitDoneGetFspHobList (
> > > +  IN  CONST EFI_PEI_SERVICES         **PeiServices,
> > > +  IN  FSP_SILICON_INIT_DONE_PPI      *This,
> > > +  OUT VOID                           **FspHobList
> > > +  );
> > > +
> > > +FSP_SILICON_INIT_DONE_PPI mFspSiliconInitDonePpi = {
> > > +  FspSiliconInitDoneGetFspHobList
> > > +};
> > > +
> > > +EFI_PEI_PPI_DESCRIPTOR            mPeiFspSiliconInitDonePpi = {
> > > +  EFI_PEI_PPI_DESCRIPTOR_PPI |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
> > > +  &gFspSiliconInitDonePpiGuid,
> > > +  &mFspSiliconInitDonePpi
> > > +};
> > > +
> > > +/**
> > > +Return Hob list produced by FSP.
> > > +
> > > +@param[in]  PeiServices  The pointer to the PEI Services Table.
> > > +@param[in]  This         The pointer to this instance of this PPI.
> > > +@param[out] FspHobList   The pointer to Hob list produced by FSP.
> > > +
> > > +@return EFI_SUCCESS FReturn Hob list produced by FSP successfully.
> > > +**/
> > > +EFI_STATUS
> > > +EFIAPI
> > > +FspSiliconInitDoneGetFspHobList (
> > > +  IN  CONST EFI_PEI_SERVICES         **PeiServices,
> > > +  IN  FSP_SILICON_INIT_DONE_PPI      *This,
> > > +  OUT VOID                           **FspHobList
> > > +  )
> > > +{
> > > +  EFI_HOB_GUID_TYPE                  *GuidHob;
> > > +
> > > +  GuidHob = GetFirstGuidHob (&gFspHobGuid);
> > > +  if (GuidHob != NULL) {
> > > +    *FspHobList = *(VOID **)GET_GUID_HOB_DATA(GuidHob);
> > > +    return EFI_SUCCESS;
> > > +  } else {
> > > +    return EFI_NOT_FOUND;
> > > +  }
> > > +}
> > > +
> > > +/**
> > > +  This function is called after PEI core discover memory and finish
> migration.
> > > +
> > > +  @param[in] PeiServices    Pointer to PEI Services Table.
> > > +  @param[in] NotifyDesc     Pointer to the descriptor for the
> Notification event
> > that
> > > +                            caused this function to execute.
> > > +  @param[in] Ppi            Pointer to the PPI data associated with
> this function.
> > > +
> > > +  @retval EFI_STATUS        Always return EFI_SUCCESS
> > > +**/
> > > +EFI_STATUS
> > > +EFIAPI
> > > +PeiMemoryDiscoveredNotify (
> > > +  IN EFI_PEI_SERVICES          **PeiServices,
> > > +  IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
> > > +  IN VOID                      *Ppi
> > > +  );
> > > +
> > > +EFI_PEI_NOTIFY_DESCRIPTOR mPeiMemoryDiscoveredNotifyDesc = {
> > > +  (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
> > > +  &gEfiPeiMemoryDiscoveredPpiGuid,
> > > +  PeiMemoryDiscoveredNotify
> > > +};
> > > +
> > > +/**
> > > +This function is called after PEI core discover memory and finish
> migration.
> > > +
> > > +@param[in] PeiServices    Pointer to PEI Services Table.
> > > +@param[in] NotifyDesc     Pointer to the descriptor for the
> Notification event that
> > > +caused this function to execute.
> > > +@param[in] Ppi            Pointer to the PPI data associated with
> this function.
> > > +
> > > +@retval EFI_STATUS        Always return EFI_SUCCESS
> > > +**/
> > > +EFI_STATUS
> > > +EFIAPI
> > > +PeiMemoryDiscoveredNotify (
> > > +  IN EFI_PEI_SERVICES          **PeiServices,
> > > +  IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
> > > +  IN VOID                      *Ppi
> > > +  )
> > > +{
> > > +  FSP_INFO_HEADER           *FspsHeaderPtr;
> > > +  UINT64                    TimeStampCounterStart;
> > > +  EFI_STATUS                Status;
> > > +  VOID                      *FspHobListPtr;
> > > +  EFI_HOB_GUID_TYPE         *GuidHob;
> > > +  FSPS_UPD_COMMON           *FspsUpdDataPtr;
> > > +  UINTN                     *SourceData;
> > > +
> > > +
> > > +  DEBUG ((DEBUG_INFO, "PeiMemoryDiscoveredNotify enter\n"));
> > > +
> > > +  //
> > > +  // Copy default FSP-S UPD data from Flash
> > > +  //
> > > +  FspsHeaderPtr = (FSP_INFO_HEADER *)FspFindFspHeader (PcdGet32
> > (PcdFspsBaseAddress));
> > > +  FspsUpdDataPtr = (FSPS_UPD_COMMON *)AllocateZeroPool
> ((UINTN)FspsHeaderPtr-
> > > >CfgRegionSize);
> > > +  ASSERT (FspsUpdDataPtr != NULL);
> > > +  SourceData = (UINTN *)((UINTN)FspsHeaderPtr->ImageBase +
> (UINTN)FspsHeaderPtr-
> > > >CfgRegionOffset);
> > > +  CopyMem (FspsUpdDataPtr, SourceData,
> (UINTN)FspsHeaderPtr->CfgRegionSize);
> > > +
> > > +  UpdateFspsUpdData ((VOID *)FspsUpdDataPtr);
> > > +
> > > +  TimeStampCounterStart = AsmReadTsc ();
> > > +  PERF_START_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0,
> 0x9000);
> > > +  Status = CallFspSiliconInit ((VOID *)FspsUpdDataPtr);
> > > +  PERF_END_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0,
> 0x907F);
> > > +  DEBUG ((DEBUG_INFO, "Total time spent executing
> FspSiliconInitApi: %d
> > > millisecond\n", DivU64x32 (GetTimeInNanoSecond (AsmReadTsc () -
> > TimeStampCounterStart),
> > > 1000000)));
> > > +  if (EFI_ERROR(Status)) {
> > > +    DEBUG ((DEBUG_ERROR, "ERROR - Failed to execute
> FspSiliconInitApi(), Status =
> > > %r\n", Status));
> > > +  }
> > > +  DEBUG((DEBUG_INFO, "FspSiliconInit status: 0x%x\n", Status));
> > > +  ASSERT_EFI_ERROR (Status);
> > > +
> > > +  Status = TestFspSiliconInitApiOutput ((VOID *)NULL);
> > > +  if (RETURN_ERROR (Status)) {
> > > +    DEBUG ((DEBUG_ERROR, "ERROR - TestFspSiliconInitApiOutput ()
> fail, Status =
> > %r\n",
> > > Status));
> > > +  }
> > > +
> > > +  //
> > > +  // Now FspHobList complete, process it
> > > +  //
> > > +  GuidHob = GetFirstGuidHob (&gFspHobGuid);
> > > +  ASSERT (GuidHob != NULL);
> > > +  FspHobListPtr = *(VOID **)GET_GUID_HOB_DATA (GuidHob);
> > > +  DEBUG ((DEBUG_INFO, "FspHobListPtr - 0x%x\n", FspHobListPtr));
> > > +  PostFspsHobProcess (FspHobListPtr);
> > > +
> > > +  //
> > > +  // Install FspSiliconInitDonePpi so that any other driver can consume
> this info.
> > > +  //
> > > +  Status = PeiServicesInstallPpi (&mPeiFspSiliconInitDonePpi);
> > > +  ASSERT_EFI_ERROR(Status);
> > > +
> > > +  return Status;
> > > +}
> > > +
> > > +/**
> > > +  Do FSP initialization.
> > > +
> > > +  @return FSP initialization status.
> > > +**/
> > > +EFI_STATUS
> > > +FspsWrapperInit (
> > > +  VOID
> > > +  )
> > > +{
> > > +  EFI_STATUS           Status;
> > > +  EFI_BOOT_MODE        BootMode;
> > > +
> > > +  //
> > > +  // Register MemoryDiscovered Nofity to run FspSiliconInit
> > > +  //
> > > +  Status = PeiServicesNotifyPpi (&mPeiMemoryDiscoveredNotifyDesc);
> > > +  ASSERT_EFI_ERROR (Status);
> > > +
> > > +  //
> > > +  // Register EndOfPei Notify for S3 to run FSP NotifyPhase
> > > +  //
> > > +  PeiServicesGetBootMode (&BootMode);
> > > +  if (BootMode == BOOT_ON_S3_RESUME) {
> > > +    Status = PeiServicesNotifyPpi (&mS3EndOfPeiNotifyDesc);
> > > +    ASSERT_EFI_ERROR (Status);
> > > +  }
> > > +
> > > +  return EFI_SUCCESS;
> > > +}
> > > +
> > > +/**
> > > +  This is the entrypoint of PEIM
> > > +
> > > +  @param[in] FileHandle  Handle of the file being invoked.
> > > +  @param[in] PeiServices Describes the list of possible PEI Services.
> > > +
> > > +  @retval EFI_SUCCESS if it completed successfully.
> > > +**/
> > > +EFI_STATUS
> > > +EFIAPI
> > > +FspsWrapperPeimEntryPoint (
> > > +  IN       EFI_PEI_FILE_HANDLE  FileHandle,
> > > +  IN CONST EFI_PEI_SERVICES     **PeiServices
> > > +  )
> > > +{
> > > +
> > > +  DEBUG ((DEBUG_INFO, "FspsWrapperPeimEntryPoint\n"));
> > > +
> > > +  FspsWrapperInit ();
> > > +
> > > +  return EFI_SUCCESS;
> > > +}
> > > diff --git a/IntelFspWrapperPkg/FspsWrapperPeim/FspsWrapperPeim.inf
> > > b/IntelFspWrapperPkg/FspsWrapperPeim/FspsWrapperPeim.inf
> > > new file mode 100644
> > > index 0000000..6304dbf
> > > --- /dev/null
> > > +++ b/IntelFspWrapperPkg/FspsWrapperPeim/FspsWrapperPeim.inf
> > > @@ -0,0 +1,79 @@
> > > +## @file
> > > +# FSP-S wrapper PEI Module
> > > +#
> > > +# This PEIM initialize FSP.
> > > +# This will be invoked only once. It will call FspMemoryInit API,
> > > +# register TemporaryRamDonePpi to call TempRamExit API, and register
> > > MemoryDiscoveredPpi
> > > +# notify to call FspSiliconInit API.
> > > +#
> > > +#  Copyright (c) 2014 - 2016, Intel Corporation. All rights
> reserved.<BR>
> > > +#
> > > +#  This program and the accompanying materials
> > > +#  are licensed and made available under the terms and conditions of
> the BSD License
> > > +#  which accompanies this distribution. The full text of the license may
> be found at
> > > +#  http://opensource.org/licenses/bsd-license.php.
> > > +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN
> "AS IS" BASIS,
> > > +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > > +#
> > > +##
> > > +
> > > +[Defines]
> > > +  INF_VERSION                    = 0x00010017
> > > +  BASE_NAME                      = FspsWrapperPeim
> > > +  FILE_GUID                      =
> DA516A06-05B6-4C52-9580-A45403EA9E8A
> > > +  VERSION_STRING                 = 1.0
> > > +  MODULE_TYPE                    = PEIM
> > > +  ENTRY_POINT                    = FspsWrapperPeimEntryPoint
> > > +
> > > +#
> > > +# The following information is for reference only and not required by
> the build
> > tools.
> > > +#
> > > +#  VALID_ARCHITECTURES           = IA32
> > > +#
> > > +
> > > +[LibraryClasses]
> > > +  PeimEntryPoint
> > > +  PeiServicesLib
> > > +  PeiServicesTablePointerLib
> > > +  BaseLib
> > > +  BaseMemoryLib
> > > +  TimerLib
> > > +  DebugLib
> > > +  HobLib
> > > +  MemoryAllocationLib
> > > +  FspWrapperPlatformLib
> > > +  FspWrapperHobProcessLib
> > > +  DebugAgentLib
> > > +  UefiCpuLib
> > > +  PeCoffGetEntryPointLib
> > > +  PeCoffExtraActionLib
> > > +  PerformanceLib
> > > +  FspWrapperApiLib
> > > +  FspWrapperApiTestLib
> > > +
> > > +[Packages]
> > > +  MdePkg/MdePkg.dec
> > > +  MdeModulePkg/MdeModulePkg.dec
> > > +  UefiCpuPkg/UefiCpuPkg.dec
> > > +  IntelFspPkg/IntelFspPkg.dec
> > > +  IntelFspWrapperPkg/IntelFspWrapperPkg.dec
> > > +
> > > +[Ppis]
> > > +  gTopOfTemporaryRamPpiGuid             ## PRODUCES
> > > +  gFspSiliconInitDonePpiGuid            ## PRODUCES
> > > +  gEfiEndOfPeiSignalPpiGuid             ## PRODUCES
> > > +  gEfiTemporaryRamDonePpiGuid           ## PRODUCES
> > > +  gEfiPeiMemoryDiscoveredPpiGuid        ## PRODUCES
> > > +
> > > +[Pcd]
> > > +  gFspWrapperTokenSpaceGuid.PcdFspsBaseAddress
> ## CONSUMES
> > > +
> > > +[Guids]
> > > +  gFspHobGuid                           ## CONSUMES ## HOB
> > > +  gFspApiPerformanceGuid                ## CONSUMES ## GUID
> > > +
> > > +[Sources]
> > > +  FspsWrapperPeim.c
> > > +
> > > +[Depex]
> > > +  gEfiPeiMemoryDiscoveredPpiGuid
> > > --
> > > 2.7.4.windows.1
> > >
> > > _______________________________________________
> > > edk2-devel mailing list
> > > edk2-devel@lists.01.org
> > > https://lists.01.org/mailman/listinfo/edk2-devel
> > > _______________________________________________
> > > edk2-devel mailing list
> > > edk2-devel@lists.01.org
> > > https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to