From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.31, mailfrom: marc.w.chen@intel.com) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by groups.io with SMTP; Fri, 23 Aug 2019 23:25:49 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Aug 2019 23:25:48 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,424,1559545200"; d="scan'208";a="263389639" Received: from pgsmsx103.gar.corp.intel.com ([10.221.44.82]) by orsmga001.jf.intel.com with ESMTP; 23 Aug 2019 23:25:46 -0700 Received: from pgsmsx106.gar.corp.intel.com (10.221.44.98) by PGSMSX103.gar.corp.intel.com (10.221.44.82) with Microsoft SMTP Server (TLS) id 14.3.439.0; Sat, 24 Aug 2019 14:25:45 +0800 Received: from pgsmsx108.gar.corp.intel.com ([169.254.8.125]) by PGSMSX106.gar.corp.intel.com ([169.254.9.10]) with mapi id 14.03.0439.000; Sat, 24 Aug 2019 14:25:45 +0800 From: "Marc W Chen" To: "Ni, Ray" , "Chaganty, Rangasai V" , "devel@edk2.groups.io" Subject: Re: [edk2-platforms:PATCH] Intel/IntelSiliconPkg Implement SmmAccess in IntelSiliconPkg Thread-Topic: [edk2-platforms:PATCH] Intel/IntelSiliconPkg Implement SmmAccess in IntelSiliconPkg Thread-Index: AQHVWZ1yaCQS4LT7LEaE2rUrU1M+5acIiUYAgAApmgCAASGVEA== Date: Sat, 24 Aug 2019 06:25:45 +0000 Message-ID: References: <20190823102751.9944-1-marc.w.chen@intel.com> <734D49CCEBEEF84792F5B80ED585239D5C296BCB@SHSMSX104.ccr.corp.intel.com> In-Reply-To: <734D49CCEBEEF84792F5B80ED585239D5C296BCB@SHSMSX104.ccr.corp.intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ctpclassification: CTP_NT x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZTk1MGVmMTUtYTc1Ny00MTJlLTg5OTQtMjdkZTc4MjZhNWJlIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiTUNrRjNBYjBKOElHXC9CayttdThTR0haa0JnZklhNmdoT3ZPNjNqUzFDXC9kdGUweXYxWjZCRGdGWmFwQU5hTmo3In0= x-originating-ip: [172.30.20.205] MIME-Version: 1.0 Return-Path: marc.w.chen@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Thanks Ray and Sai for reviewing, please see my below reply for your questi= ons. 1. The reason why I put the Library folder in Feature/SmmAccess folder is b= ecause I saw Feature/Capsule also doing it this way, so I thought we want t= o put all related implementation in the same feature folder including libra= ry, please let me know if you want me to move the PeiSmmAccessLib to root L= ibrary folder. 2. I saw that Vtd also depend on MdeModulePkg, so I thought IntelSiliconPkg= is allowed to use MdeModulePkg, and SmmAccess code need SmmAccess.h, which= is in MdeModulePkg, even we can change to use MmAccess.h from MdePkg now, = but I thought the SMM is belong to x86 silicon, so use SmmAccess.h is bette= r than MmAccess.h, let me know if you prefer to use MmAccess, then I'll mod= ify the Patch to use that. Thanks, Marc > -----Original Message----- > From: Ni, Ray > Sent: Saturday, August 24, 2019 5:03 AM > To: Chaganty, Rangasai V ; Chen, Marc W > ; devel@edk2.groups.io > Subject: RE: [edk2-platforms:PATCH] Intel/IntelSiliconPkg Implement > SmmAccess in IntelSiliconPkg >=20 > It's not recommended to make IntelSiliconPkg depend on MdeModulePkg. >=20 > > -----Original Message----- > > From: Chaganty, Rangasai V > > Sent: Friday, August 23, 2019 11:34 AM > > To: Chen, Marc W ; devel@edk2.groups.io > > Cc: Ni, Ray > > Subject: RE: [edk2-platforms:PATCH] Intel/IntelSiliconPkg Implement > SmmAccess in IntelSiliconPkg > > > > May I know the reason to implement the SmmAccessLib instance under > \Feature folder? > > Can we move it under IntelSiliconPkg\Library (We need to create a libra= ry > folder in the root) and keep just the module in the > > \Feature folder? > > > > I've noticed there is a dependency on MdeModulePkg with this change. > > Could you provide the reason to have such dependency as part of this > change? > > > > Thanks, > > Sai > > > > -----Original Message----- > > From: Chen, Marc W > > Sent: Friday, August 23, 2019 3:28 AM > > To: devel@edk2.groups.io > > Cc: Chen, Marc W ; Ni, Ray ; > Chaganty, Rangasai V > > > > Subject: [edk2-platforms:PATCH] Intel/IntelSiliconPkg Implement > SmmAccess in IntelSiliconPkg > > > > REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D2121 > > > > Implement SmmAccess for PEI and DXE phase in IntelSiliconPkg > > > > Signed-off-by: Marc Chen > > Cc: Ray Ni > > Cc: Rangasai V Chaganty > > --- > > .../Library/PeiSmmAccessLib/PeiSmmAccessLib.c | 343 > +++++++++++++++++++++ > > .../Library/PeiSmmAccessLib/PeiSmmAccessLib.inf | 42 +++ > > .../Feature/SmmAccess/SmmAccessDxe/SmmAccess.inf | 47 +++ > > .../SmmAccess/SmmAccessDxe/SmmAccessDriver.c | 267 > ++++++++++++++++ > > .../SmmAccess/SmmAccessDxe/SmmAccessDriver.h | 160 ++++++++++ > > .../IntelSiliconPkg/Include/Library/SmmAccessLib.h | 32 ++ > > 6 files changed, 891 insertions(+) > > create mode 100644 > Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Library/PeiSmmAccessLib/ > PeiSmmAccessLib.c > > create mode 100644 > Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Library/PeiSmmAccessLib/ > PeiSmmAccessLib.inf > > create mode 100644 > Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAccessDxe/SmmAcce > ss.inf > > create mode 100644 > Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAccessDxe/SmmAcce > ssDriver.c > > create mode 100644 > Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAccessDxe/SmmAcce > ssDriver.h > > create mode 100644 > Silicon/Intel/IntelSiliconPkg/Include/Library/SmmAccessLib.h > > > > diff --git > a/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Library/PeiSmmAccessLi > b/PeiSmmAccessLib.c > > > b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Library/PeiSmmAccessLi > b/PeiSmmAccessLib.c > > new file mode 100644 > > index 0000000000..88eb217d2a > > --- /dev/null > > +++ > b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Library/PeiSmmAcce > > +++ ssLib/PeiSmmAccessLib.c > > @@ -0,0 +1,343 @@ > > +/** @file > > + This is to publish the SMM Access Ppi instance. > > + > > + Copyright (c) 2019, Intel Corporation. All rights reserved.
> > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > +**/ > > +#include > > +#include > > +#include #include > > + #include #include > > + #include #include > > + > > + > > +#include > > +#include > > + > > +#define SMM_ACCESS_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('4', > '5', 's', > > +'a') > > + > > +/// > > +/// Private data > > +/// > > +typedef struct { > > + UINTN Signature; > > + EFI_HANDLE Handle; > > + PEI_SMM_ACCESS_PPI SmmAccess; > > + // > > + // Local Data for SMM Access interface goes here > > + // > > + UINTN NumberRegions; > > + EFI_SMRAM_DESCRIPTOR *SmramDesc; > > +} SMM_ACCESS_PRIVATE_DATA; > > + > > +#define SMM_ACCESS_PRIVATE_DATA_FROM_THIS(a) \ > > + CR (a, \ > > + SMM_ACCESS_PRIVATE_DATA, \ > > + SmmAccess, \ > > + SMM_ACCESS_PRIVATE_DATA_SIGNATURE \ > > + ) > > + > > +/** > > + This routine accepts a request to "open" a region of SMRAM. The > > + region could be legacy ABSEG, HSEG, or TSEG near top of physical > memory. > > + The use of "open" means that the memory is visible from all PEIM > > + and SMM agents. > > + > > + @param[in] This - Pointer to the SMM Access Interface. > > + @param[in] DescriptorIndex - Region of SMRAM to Open. > > + @param[in] PeiServices - General purpose services available to= every > PEIM. > > + > > + @retval EFI_SUCCESS - The region was successfully opened= . > > + @retval EFI_DEVICE_ERROR - The region could not be opened > because locked by > > + chipset. > > + @retval EFI_INVALID_PARAMETER - The descriptor index was out of > bounds. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +Open ( > > + IN EFI_PEI_SERVICES **PeiServices, > > + IN PEI_SMM_ACCESS_PPI *This, > > + IN UINTN DescriptorIndex > > + ) > > +{ > > + SMM_ACCESS_PRIVATE_DATA *SmmAccess; > > + > > + SmmAccess =3D SMM_ACCESS_PRIVATE_DATA_FROM_THIS (This); if > > + (DescriptorIndex >=3D SmmAccess->NumberRegions) { > > + DEBUG ((DEBUG_WARN, "SMRAM region out of range\n")); > > + > > + return EFI_INVALID_PARAMETER; > > + } else if (SmmAccess->SmramDesc[DescriptorIndex].RegionState & > EFI_SMRAM_LOCKED) { > > + // > > + // Cannot open a "locked" region > > + // > > + DEBUG ((DEBUG_WARN, "Cannot open a locked SMRAM region\n")); > > + > > + return EFI_DEVICE_ERROR; > > + } > > + > > + SmmAccess->SmramDesc[DescriptorIndex].RegionState &=3D (UINT64) > > +~(EFI_SMRAM_CLOSED | EFI_ALLOCATED); > > + SmmAccess->SmramDesc[DescriptorIndex].RegionState |=3D (UINT64) > > +EFI_SMRAM_OPEN; > > + SmmAccess->SmmAccess.OpenState =3D TRUE; > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + This routine accepts a request to "close" a region of SMRAM. This i= s > > +valid for > > + compatible SMRAM region. > > + > > + @param[in] PeiServices - General purpose services available to= every > PEIM. > > + @param[in] This - Pointer to the SMM Access Interface. > > + @param[in] DescriptorIndex - Region of SMRAM to Close. > > + > > + @retval EFI_SUCCESS - The region was successfully closed= . > > + @retval EFI_DEVICE_ERROR - The region could not be closed bec= ause > locked by > > + chipset. > > + @retval EFI_INVALID_PARAMETER - The descriptor index was out of > bounds. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +Close ( > > + IN EFI_PEI_SERVICES **PeiServices, > > + IN PEI_SMM_ACCESS_PPI *This, > > + IN UINTN DescriptorIndex > > + ) > > +{ > > + SMM_ACCESS_PRIVATE_DATA *SmmAccess; > > + BOOLEAN OpenState; > > + UINT8 Index; > > + > > + SmmAccess =3D SMM_ACCESS_PRIVATE_DATA_FROM_THIS (This); if > > + (DescriptorIndex >=3D SmmAccess->NumberRegions) { > > + DEBUG ((DEBUG_WARN, "SMRAM region out of range\n")); > > + > > + return EFI_INVALID_PARAMETER; > > + } else if (SmmAccess->SmramDesc[DescriptorIndex].RegionState & > EFI_SMRAM_LOCKED) { > > + // > > + // Cannot close a "locked" region > > + // > > + DEBUG ((DEBUG_WARN, "Cannot close a locked SMRAM region\n")); > > + > > + return EFI_DEVICE_ERROR; > > + } > > + > > + if (SmmAccess->SmramDesc[DescriptorIndex].RegionState & > EFI_SMRAM_CLOSED) { > > + return EFI_DEVICE_ERROR; > > + } > > + > > + SmmAccess->SmramDesc[DescriptorIndex].RegionState &=3D (UINT64) > > + ~EFI_SMRAM_OPEN; SmmAccess- > >SmramDesc[DescriptorIndex].RegionState |=3D > > + (UINT64) (EFI_SMRAM_CLOSED | EFI_ALLOCATED); > > + > > + // > > + // Find out if any regions are still open // OpenState =3D FALSE; > > + for (Index =3D 0; Index < SmmAccess->NumberRegions; Index++) { > > + if ((SmmAccess->SmramDesc[Index].RegionState & EFI_SMRAM_OPEN) > =3D=3D EFI_SMRAM_OPEN) { > > + OpenState =3D TRUE; > > + } > > + } > > + > > + SmmAccess->SmmAccess.OpenState =3D OpenState; > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + This routine accepts a request to "lock" SMRAM. The > > + region could be legacy AB or TSEG near top of physical memory. > > + The use of "lock" means that the memory can no longer be opened > > + to PEIM. > > + > > + @param[in] PeiServices - General purpose services available to = every > PEIM. > > + @param[in] This - Pointer to the SMM Access Interface. > > + @param[in] DescriptorIndex - Region of SMRAM to Lock. > > + > > + @retval EFI_SUCCESS - The region was successfully locked= . > > + @retval EFI_DEVICE_ERROR - The region could not be locked bec= ause > at least > > + one range is still open. > > + @retval EFI_INVALID_PARAMETER - The descriptor index was out of > bounds. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +Lock ( > > + IN EFI_PEI_SERVICES **PeiServices, > > + IN PEI_SMM_ACCESS_PPI *This, > > + IN UINTN DescriptorIndex > > + ) > > +{ > > + SMM_ACCESS_PRIVATE_DATA *SmmAccess; > > + > > + SmmAccess =3D SMM_ACCESS_PRIVATE_DATA_FROM_THIS (This); if > > + (DescriptorIndex >=3D SmmAccess->NumberRegions) { > > + DEBUG ((DEBUG_WARN, "SMRAM region out of range\n")); > > + > > + return EFI_INVALID_PARAMETER; > > + } else if (SmmAccess->SmmAccess.OpenState) { > > + DEBUG ((DEBUG_WARN, "Cannot lock SMRAM when SMRAM regions > are still > > + open\n")); > > + > > + return EFI_DEVICE_ERROR; > > + } > > + > > + SmmAccess->SmramDesc[DescriptorIndex].RegionState |=3D (UINT64) > > + EFI_SMRAM_LOCKED; SmmAccess->SmmAccess.LockState =3D TRUE; > > + > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + This routine services a user request to discover the SMRAM > > + capabilities of this platform. This will report the possible > > + ranges that are possible for SMRAM access, based upon the > > + memory controller capabilities. > > + > > + @param[in] PeiServices - General purpose services available to eve= ry > PEIM. > > + @param[in] This - Pointer to the SMRAM Access Interface. > > + @param[in] SmramMapSize - Pointer to the variable containing size = of > the > > + buffer to contain the description inform= ation. > > + @param[in] SmramMap - Buffer containing the data describing th= e > Smram > > + region descriptors. > > + > > + @retval EFI_BUFFER_TOO_SMALL - The user did not provide a sufficie= nt > buffer. > > + @retval EFI_SUCCESS - The user provided a sufficiently-si= zed buffer. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +GetCapabilities ( > > + IN EFI_PEI_SERVICES **PeiServices, > > + IN PEI_SMM_ACCESS_PPI *This, > > + IN OUT UINTN *SmramMapSize, > > + IN OUT EFI_SMRAM_DESCRIPTOR *SmramMap > > + ) > > +{ > > + EFI_STATUS Status; > > + SMM_ACCESS_PRIVATE_DATA *SmmAccess; > > + UINTN NecessaryBufferSize; > > + > > + SmmAccess =3D SMM_ACCESS_PRIVATE_DATA_FROM_THIS (This); > > + NecessaryBufferSize =3D SmmAccess->NumberRegions * sizeof > > + (EFI_SMRAM_DESCRIPTOR); if (*SmramMapSize < NecessaryBufferSize) > { > > + DEBUG ((DEBUG_WARN, "SMRAM Map Buffer too small\n")); > > + > > + Status =3D EFI_BUFFER_TOO_SMALL; > > + } else { > > + CopyMem (SmramMap, SmmAccess->SmramDesc, > NecessaryBufferSize); > > + Status =3D EFI_SUCCESS; > > + } > > + > > + *SmramMapSize =3D NecessaryBufferSize; > > + return Status; > > +} > > + > > +/** > > + This function is to install an SMM Access PPI > > + - Introduction \n > > + A module to install a PPI for controlling SMM mode memory access > basically for S3 resume usage. > > + > > + - @pre > > + - _PEI_MASTER_BOOT_MODE_PEIM_PPI: A PPI published by > foundation to get bootmode executed earlier. > > + - _PEI_PERMANENT_MEMORY_INSTALLED_PPI: a PPI that will be > installed after memory controller initialization completed > > to indicate that physical memory is usable after this point. > > + > > + - @result > > + Publish _PEI_SMM_ACCESS_PPI. > > + > > + @retval EFI_SUCCESS - Ppi successfully started and insta= lled. > > + @retval EFI_NOT_FOUND - Ppi can't be found. > > + @retval EFI_OUT_OF_RESOURCES - Ppi does not have enough > resources to initialize the driver. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +PeiInstallSmmAccessPpi ( > > + VOID > > + ) > > +{ > > + EFI_STATUS Status; > > + UINTN Index; > > + EFI_PEI_PPI_DESCRIPTOR *PpiList; > > + EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *DescriptorBlock; > > + SMM_ACCESS_PRIVATE_DATA *SmmAccessPrivate; > > + VOID *HobList; > > + EFI_BOOT_MODE BootMode; > > + > > + Status =3D PeiServicesGetBootMode (&BootMode); if (EFI_ERROR (Statu= s)) > > + { > > + // > > + // If not in S3 boot path. do nothing > > + // > > + return EFI_SUCCESS; > > + } > > + > > + if (BootMode !=3D BOOT_ON_S3_RESUME) { > > + return EFI_SUCCESS; > > + } > > + // > > + // Initialize private data > > + // > > + SmmAccessPrivate =3D AllocateZeroPool (sizeof (*SmmAccessPrivate)); > > + ASSERT (SmmAccessPrivate !=3D NULL); if (SmmAccessPrivate =3D=3D NUL= L) { > > + return EFI_OUT_OF_RESOURCES; > > + } > > + PpiList =3D AllocateZeroPool (sizeof (*PpiList)); > > + ASSERT (PpiList !=3D NULL); > > + if (PpiList =3D=3D NULL) { > > + return EFI_OUT_OF_RESOURCES; > > + } > > + > > + SmmAccessPrivate->Signature =3D > SMM_ACCESS_PRIVATE_DATA_SIGNATURE; > > + SmmAccessPrivate->Handle =3D NULL; > > + > > + // > > + // Get Hob list > > + // > > + HobList =3D GetFirstGuidHob (&gEfiSmmSmramMemoryGuid); if (HobList > =3D=3D > > + NULL) { > > + DEBUG ((DEBUG_WARN, "SmramMemoryReserve HOB not found\n")); > > + return EFI_NOT_FOUND; > > + } > > + > > + DescriptorBlock =3D (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *) ((UINT8 *) > > + HobList + sizeof (EFI_HOB_GUID_TYPE)); > > + > > + // > > + // Alloc space for SmmAccessPrivate->SmramDesc // > > + SmmAccessPrivate->SmramDesc =3D AllocateZeroPool > > + ((DescriptorBlock->NumberOfSmmReservedRegions) * sizeof > (EFI_SMRAM_DESCRIPTOR)); if (SmmAccessPrivate->SmramDesc > > =3D=3D NULL) { > > + DEBUG ((DEBUG_WARN, "Alloc SmmAccessPrivate->SmramDesc > fail.\n")); > > + return EFI_OUT_OF_RESOURCES; > > + } > > + > > + DEBUG ((DEBUG_INFO, "Alloc SmmAccessPrivate->SmramDesc > success.\n")); > > + > > + // > > + // use the hob to publish SMRAM capabilities // for (Index =3D 0; > > + Index < DescriptorBlock->NumberOfSmmReservedRegions; Index++) { > > + SmmAccessPrivate->SmramDesc[Index].PhysicalStart =3D > DescriptorBlock->Descriptor[Index].PhysicalStart; > > + SmmAccessPrivate->SmramDesc[Index].CpuStart =3D DescriptorBl= ock- > >Descriptor[Index].CpuStart; > > + SmmAccessPrivate->SmramDesc[Index].PhysicalSize =3D > DescriptorBlock->Descriptor[Index].PhysicalSize; > > + SmmAccessPrivate->SmramDesc[Index].RegionState =3D > DescriptorBlock->Descriptor[Index].RegionState; > > + } > > + > > + SmmAccessPrivate->NumberRegions =3D Index; > > + SmmAccessPrivate->SmmAccess.Open =3D Open; > > + SmmAccessPrivate->SmmAccess.Close =3D Close; > > + SmmAccessPrivate->SmmAccess.Lock =3D Lock; > > + SmmAccessPrivate->SmmAccess.GetCapabilities =3D GetCapabilities; > > + SmmAccessPrivate->SmmAccess.LockState =3D FALSE; > > + SmmAccessPrivate->SmmAccess.OpenState =3D FALSE; > > + > > + // > > + // Install PPI > > + // > > + PpiList->Flags =3D (EFI_PEI_PPI_DESCRIPTOR_PPI | > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST); > > + PpiList->Guid =3D &gPeiSmmAccessPpiGuid; > > + PpiList->Ppi =3D &SmmAccessPrivate->SmmAccess; > > + > > + Status =3D PeiServicesInstallPpi (PpiList); > > + ASSERT_EFI_ERROR (Status); > > + > > + return EFI_SUCCESS; > > +} > > diff --git > a/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Library/PeiSmmAccessLi > b/PeiSmmAccessLib.inf > > > b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Library/PeiSmmAccessLi > b/PeiSmmAccessLib.inf > > new file mode 100644 > > index 0000000000..0c6f5f65d8 > > --- /dev/null > > +++ > b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Library/PeiSmmAcce > > +++ ssLib/PeiSmmAccessLib.inf > > @@ -0,0 +1,42 @@ > > +## @file > > +# Library description file for the SmmAccess module # # Copyright (c) > > +2019, Intel Corporation. All rights reserved.
# > > +SPDX-License-Identifier: BSD-2-Clause-Patent # ## > > + > > + > > +[Defines] > > +INF_VERSION =3D 0x00010017 > > +BASE_NAME =3D PeiSmmAccessLib > > +FILE_GUID =3D 54020881-B594-442A-8377-A57AFF98C7CF > > +VERSION_STRING =3D 1.0 > > +MODULE_TYPE =3D PEIM > > +LIBRARY_CLASS =3D SmmAccessLib > > + > > + > > +[LibraryClasses] > > +BaseLib > > +BaseMemoryLib > > +HobLib > > +PciSegmentLib > > +PeiServicesLib > > + > > + > > +[Packages] > > +MdePkg/MdePkg.dec > > +MdeModulePkg/MdeModulePkg.dec > > +IntelSiliconPkg/IntelSiliconPkg.dec > > + > > + > > +[Sources] > > +PeiSmmAccessLib.c > > + > > + > > +[Ppis] > > +gPeiSmmAccessPpiGuid ## PRODUCES > > + > > + > > +[Guids] > > +gEfiSmmSmramMemoryGuid > > diff --git > a/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAccessDxe/SmmAc > cess.inf > > > b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAccessDxe/SmmAc > cess.inf > > new file mode 100644 > > index 0000000000..b1c988844f > > --- /dev/null > > +++ > b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAccessDxe/SmmAc > > +++ cess.inf > > @@ -0,0 +1,47 @@ > > +## @file > > +# Component description file for the SmmAccess module # # Copyright (c= ) > > +2019, Intel Corporation. All rights reserved.
# > > +SPDX-License-Identifier: BSD-2-Clause-Patent # ## > > + > > + > > +[Defines] > > +INF_VERSION =3D 0x00010017 > > +BASE_NAME =3D SmmAccess > > +FILE_GUID =3D 1323C7F8-DAD5-4126-A54B-7A05FBF41515 > > +VERSION_STRING =3D 1.0 > > +MODULE_TYPE =3D DXE_DRIVER > > +ENTRY_POINT =3D SmmAccessDriverEntryPoint > > + > > + > > +[LibraryClasses] > > +UefiDriverEntryPoint > > +BaseLib > > +BaseMemoryLib > > +DebugLib > > +HobLib > > + > > + > > +[Packages] > > +MdePkg/MdePkg.dec > > +MdeModulePkg/MdeModulePkg.dec > > +IntelSiliconPkg/IntelSiliconPkg.dec > > + > > + > > +[Sources] > > +SmmAccessDriver.h > > +SmmAccessDriver.c > > + > > + > > +[Protocols] > > +gEfiSmmAccess2ProtocolGuid ## PRODUCES > > + > > + > > +[Guids] > > +gEfiSmmSmramMemoryGuid > > + > > + > > +[Depex] > > +TRUE > > diff --git > a/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAccessDxe/SmmAc > cessDriver.c > > > b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAccessDxe/SmmAc > cessDriver.c > > new file mode 100644 > > index 0000000000..3d3c4ab206 > > --- /dev/null > > +++ > b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAccessDxe/SmmAc > > +++ cessDriver.c > > @@ -0,0 +1,267 @@ > > +/** @file > > + This is the driver that publishes the SMM Access Protocol > > + instance for System Agent. > > + > > + Copyright (c) 2019, Intel Corporation. All rights reserved.
> > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > +**/ > > +#include "SmmAccessDriver.h" > > + > > +static SMM_ACCESS_PRIVATE_DATA mSmmAccess; > > + > > +/** > > + This is the standard EFI driver point that > > + installs an SMM Access Protocol > > + > > + @param[in] ImageHandle - Handle for the image of this driver > > + @param[in] SystemTable - Pointer to the EFI System Table > > + > > + @retval EFI_SUCCESS - Protocol was installed successfully > > + @exception EFI_UNSUPPORTED - Protocol was not installed > > + @retval EFI_NOT_FOUND - Protocol can't be found. > > + @retval EFI_OUT_OF_RESOURCES - Protocol does not have enough > resources to initialize the driver. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +SmmAccessDriverEntryPoint ( > > + IN EFI_HANDLE ImageHandle, > > + IN EFI_SYSTEM_TABLE *SystemTable > > + ) > > +{ > > + EFI_STATUS Status; > > + UINTN Index; > > + EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *DescriptorBlock; > > + EFI_PEI_HOB_POINTERS *Hob; > > + > > + // > > + // Initialize Global variables > > + // > > + ZeroMem (&mSmmAccess, sizeof (mSmmAccess)); > > + > > + mSmmAccess.Signature =3D > SMM_ACCESS_PRIVATE_DATA_SIGNATURE; > > + mSmmAccess.Handle =3D NULL; > > + > > + // > > + // Get Hob list > > + // > > + Hob =3D GetFirstGuidHob (&gEfiSmmSmramMemoryGuid); if (Hob =3D=3D > NULL) { > > + DEBUG ((DEBUG_WARN, "SmramMemoryReserve HOB not found\n")); > > + return EFI_NOT_FOUND; > > + } > > + > > + DescriptorBlock =3D (VOID *) ((UINT8 *) Hob + sizeof > > + (EFI_HOB_GUID_TYPE)); > > + > > + // > > + // Alloc space for mSmmAccess.SmramDesc // > mSmmAccess.SmramDesc =3D > > + AllocateZeroPool ((DescriptorBlock->NumberOfSmmReservedRegions) * > > + sizeof (EFI_SMRAM_DESCRIPTOR)); if (mSmmAccess.SmramDesc =3D=3D > NULL) { > > + DEBUG ((DEBUG_WARN, "Alloc mSmmAccess.SmramDesc fail.\n")); > > + return EFI_OUT_OF_RESOURCES; > > + } > > + > > + DEBUG ((DEBUG_INFO, "Alloc mSmmAccess.SmramDesc success.\n")); > > + > > + // > > + // Use the HOB to publish SMRAM capabilities // for (Index =3D 0; > > + Index < DescriptorBlock->NumberOfSmmReservedRegions; Index++) { > > + mSmmAccess.SmramDesc[Index].PhysicalStart =3D DescriptorBlock- > >Descriptor[Index].PhysicalStart; > > + mSmmAccess.SmramDesc[Index].CpuStart =3D DescriptorBlock- > >Descriptor[Index].CpuStart; > > + mSmmAccess.SmramDesc[Index].PhysicalSize =3D DescriptorBlock- > >Descriptor[Index].PhysicalSize; > > + mSmmAccess.SmramDesc[Index].RegionState =3D DescriptorBlock- > >Descriptor[Index].RegionState; > > + } > > + > > + mSmmAccess.NumberRegions =3D Index; > > + mSmmAccess.SmmAccess.Open =3D Open; > > + mSmmAccess.SmmAccess.Close =3D Close; > > + mSmmAccess.SmmAccess.Lock =3D Lock; > > + mSmmAccess.SmmAccess.GetCapabilities =3D GetCapabilities; > > + mSmmAccess.SmmAccess.LockState =3D FALSE; > > + mSmmAccess.SmmAccess.OpenState =3D FALSE; > > + > > + // > > + // Install our protocol interfaces on the device's handle // Statu= s > > + =3D gBS->InstallMultipleProtocolInterfaces ( > > + &mSmmAccess.Handle, > > + &gEfiSmmAccess2ProtocolGuid, > > + &mSmmAccess.SmmAccess, > > + NULL > > + ); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_WARN, "InstallMultipleProtocolInterfaces returned > %r\n", Status)); > > + return EFI_UNSUPPORTED; > > + } > > + > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + This routine accepts a request to "open" a region of SMRAM. The > > + region could be legacy ABSEG, HSEG, or TSEG near top of physical > memory. > > + The use of "open" means that the memory is visible from all > > +boot-service > > + and SMM agents. > > + > > + @param[in] This - Pointer to the SMM Access Interface. > > + > > + @retval EFI_SUCCESS - The region was successfully opened. > > + @retval EFI_DEVICE_ERROR - The region could not be opened becau= se > locked by > > + chipset. > > + @retval EFI_INVALID_PARAMETER - The descriptor index was out of > bounds. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +Open ( > > + IN EFI_SMM_ACCESS2_PROTOCOL *This > > + ) > > +{ > > + SMM_ACCESS_PRIVATE_DATA *SmmAccess; > > + UINTN DescriptorIndex; > > + > > + SmmAccess =3D SMM_ACCESS_PRIVATE_DATA_FROM_THIS (This); for > > + (DescriptorIndex =3D 0; DescriptorIndex < SmmAccess->NumberRegions; > DescriptorIndex++) { > > + if (SmmAccess->SmramDesc[DescriptorIndex].RegionState & > EFI_SMRAM_LOCKED) { > > + DEBUG ((DEBUG_WARN, "Cannot open a locked SMRAM region\n")); > > + return EFI_DEVICE_ERROR; > > + } > > + } > > + > > + for (DescriptorIndex =3D 0; DescriptorIndex < SmmAccess- > >NumberRegions; DescriptorIndex++) { > > + SmmAccess->SmramDesc[DescriptorIndex].RegionState &=3D (UINT64) > ~(EFI_SMRAM_CLOSED | EFI_ALLOCATED); > > + SmmAccess->SmramDesc[DescriptorIndex].RegionState |=3D (UINT64) > > +EFI_SMRAM_OPEN; > > + } > > + SmmAccess->SmmAccess.OpenState =3D TRUE; > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + This routine accepts a request to "close" a region of SMRAM. The > > + region could be legacy AB or TSEG near top of physical memory. > > + The use of "close" means that the memory is only visible from SMM > > +agents, > > + not from BS or RT code. > > + > > + @param[in] This - Pointer to the SMM Access Interface. > > + > > + @retval EFI_SUCCESS - The region was successfully closed. > > + @retval EFI_DEVICE_ERROR - The region could not be closed becau= se > locked by chipset. > > + @retval EFI_INVALID_PARAMETER - The descriptor index was out of > bounds. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +Close ( > > + IN EFI_SMM_ACCESS2_PROTOCOL *This > > + ) > > +{ > > + SMM_ACCESS_PRIVATE_DATA *SmmAccess; > > + BOOLEAN OpenState; > > + UINT8 Index; > > + UINTN DescriptorIndex; > > + > > + SmmAccess =3D SMM_ACCESS_PRIVATE_DATA_FROM_THIS (This); > > + > > + for (DescriptorIndex =3D 0; DescriptorIndex < SmmAccess- > >NumberRegions; DescriptorIndex++) { > > + if (SmmAccess->SmramDesc[DescriptorIndex].RegionState & > EFI_SMRAM_LOCKED) { > > + DEBUG ((DEBUG_WARN, "Cannot close a locked SMRAM region\n")); > > + continue; > > + } > > + > > + SmmAccess->SmramDesc[DescriptorIndex].RegionState &=3D (UINT64) > ~EFI_SMRAM_OPEN; > > + SmmAccess->SmramDesc[DescriptorIndex].RegionState |=3D (UINT64) > > + (EFI_SMRAM_CLOSED | EFI_ALLOCATED); } > > + > > + // > > + // Find out if any regions are still open // OpenState =3D FALSE; > > + for (Index =3D 0; Index < mSmmAccess.NumberRegions; Index++) { > > + if ((SmmAccess->SmramDesc[Index].RegionState & EFI_SMRAM_OPEN) > =3D=3D EFI_SMRAM_OPEN) { > > + OpenState =3D TRUE; > > + } > > + } > > + > > + SmmAccess->SmmAccess.OpenState =3D OpenState; > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + This routine accepts a request to "lock" SMRAM. The > > + region could be legacy AB or TSEG near top of physical memory. > > + The use of "lock" means that the memory can no longer be opened > > + to BS state.. > > + > > + @param[in] This - Pointer to the SMM Access Interface. > > + > > + @retval EFI_SUCCESS - The region was successfully locked. > > + @retval EFI_DEVICE_ERROR - The region could not be locked becau= se > at least > > + one range is still open. > > + @retval EFI_INVALID_PARAMETER - The descriptor index was out of > bounds. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +Lock ( > > + IN EFI_SMM_ACCESS2_PROTOCOL *This > > + ) > > +{ > > + SMM_ACCESS_PRIVATE_DATA *SmmAccess; > > + UINTN DescriptorIndex; > > + > > + SmmAccess =3D SMM_ACCESS_PRIVATE_DATA_FROM_THIS (This); > > + > > + if (SmmAccess->SmmAccess.OpenState) { > > + DEBUG ((DEBUG_WARN, "Cannot lock SMRAM when SMRAM regions > are still open\n")); > > + return EFI_DEVICE_ERROR; > > + } > > + for (DescriptorIndex =3D 0; DescriptorIndex < SmmAccess- > >NumberRegions; DescriptorIndex++) { > > + SmmAccess->SmramDesc[DescriptorIndex].RegionState |=3D > > + EFI_SMRAM_LOCKED; } SmmAccess->SmmAccess.LockState =3D TRUE; > > + > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + This routine services a user request to discover the SMRAM > > + capabilities of this platform. This will report the possible > > + ranges that are possible for SMRAM access, based upon the > > + memory controller capabilities. > > + > > + @param[in] This - Pointer to the SMRAM Access Inter= face. > > + @param[in] SmramMapSize - Pointer to the variable containin= g size > of the > > + buffer to contain the description= information. > > + @param[in] SmramMap - Buffer containing the data descri= bing the > Smram > > + region descriptors. > > + > > + @retval EFI_BUFFER_TOO_SMALL - The user did not provide a sufficien= t > buffer. > > + @retval EFI_SUCCESS - The user provided a sufficiently-siz= ed buffer. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +GetCapabilities ( > > + IN CONST EFI_SMM_ACCESS2_PROTOCOL *This, > > + IN OUT UINTN *SmramMapSize, > > + IN OUT EFI_SMRAM_DESCRIPTOR *SmramMap > > + ) > > +{ > > + EFI_STATUS Status; > > + SMM_ACCESS_PRIVATE_DATA *SmmAccess; > > + UINTN NecessaryBufferSize; > > + > > + SmmAccess =3D SMM_ACCESS_PRIVATE_DATA_FROM_THIS (This); > > + > > + NecessaryBufferSize =3D SmmAccess->NumberRegions * sizeof > > + (EFI_SMRAM_DESCRIPTOR); > > + > > + if (*SmramMapSize < NecessaryBufferSize) { > > + DEBUG ((DEBUG_WARN, "SMRAM Map Buffer too small\n")); > > + Status =3D EFI_BUFFER_TOO_SMALL; > > + } else { > > + CopyMem (SmramMap, SmmAccess->SmramDesc, > NecessaryBufferSize); > > + Status =3D EFI_SUCCESS; > > + } > > + > > + *SmramMapSize =3D NecessaryBufferSize; > > + > > + return Status; > > +} > > diff --git > a/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAccessDxe/SmmAc > cessDriver.h > > > b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAccessDxe/SmmAc > cessDriver.h > > new file mode 100644 > > index 0000000000..c0ff3a250b > > --- /dev/null > > +++ > b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAccessDxe/SmmAc > > +++ cessDriver.h > > @@ -0,0 +1,160 @@ > > +/** @file > > + Header file for SMM Access Driver. > > + > > + Copyright (c) 2019, Intel Corporation. All rights reserved.
> > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > +**/ > > +#ifndef _SMM_ACCESS_DRIVER_H_ > > +#define _SMM_ACCESS_DRIVER_H_ > > + > > +#include > > +#include > > +#include > > +#include > > +#include #include > > + > > +#include > > + > > +#include > > +#include > > +#include > > + > > +#define SMM_ACCESS_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('4', > '5', 's', > > +'a') > > + > > +/// > > +/// Private data > > +/// > > +typedef struct { > > + UINTN Signature; > > + EFI_HANDLE Handle; > > + EFI_SMM_ACCESS2_PROTOCOL SmmAccess; > > + > > + /// > > + /// Local Data for SMM Access interface goes here > > + /// > > + UINTN NumberRegions; > > + EFI_SMRAM_DESCRIPTOR *SmramDesc; > > +} SMM_ACCESS_PRIVATE_DATA; > > + > > +#define SMM_ACCESS_PRIVATE_DATA_FROM_THIS(a) \ > > + CR (a, \ > > + SMM_ACCESS_PRIVATE_DATA, \ > > + SmmAccess, \ > > + SMM_ACCESS_PRIVATE_DATA_SIGNATURE \ > > + ) > > + > > +// > > +// Prototypes > > +// Driver model protocol interface > > +// > > +/** > > + SMM Access Driver Entry Point > > + This driver installs an SMM Access Protocol > > + - Introduction \n > > + This module publishes the SMM access protocol. The protocol is us= ed > by the SMM Base driver to access the SMRAM region > > when the processor is not in SMM. > > + The SMM Base driver uses the services provided by the SMM access > protocol to open SMRAM during post and copy the SMM > > handler. > > + SMM access protocol is also used to close the SMRAM region once th= e > copying is done. > > + Finally, the SMM access protocol provides services to "Lock" the > SMRAM region. > > + Please refer the SMM Protocols section in the attached SMM CIS > Specification version 0.9 for further details. > > + This driver is required if SMM is supported. Proper configuration = of > SMM registers is recommended even if SMM is not > > supported. > > + > > + - @result > > + Publishes the _EFI_SMM_ACCESS_PROTOCOL: Documented in the > System > > + Management Mode Core Interface Specification, available at the URL: > > + http://www.intel.com/technology/framework/spec.htm > > + > > + - Porting Recommendations \n > > + No modification of this module is recommended. Any modification > should be done in compliance with the > > _EFI_SMM_ACCESS_PROTOCOL protocol definition. > > + > > + @param[in] ImageHandle - Handle for the image of this driver > > + @param[in] SystemTable - Pointer to the EFI System Table > > + > > + @retval EFI_SUCCESS - Protocol was installed successfully > > + @exception EFI_UNSUPPORTED - Protocol was not installed **/ > > +EFI_STATUS EFIAPI SmmAccessDriverEntryPoint ( > > + IN EFI_HANDLE ImageHandle, > > + IN EFI_SYSTEM_TABLE *SystemTable > > + ); > > + > > +/** > > + This routine accepts a request to "open" a region of SMRAM. The > > + region could be legacy ABSEG, HSEG, or TSEG near top of physical > memory. > > + The use of "open" means that the memory is visible from all > > +boot-service > > + and SMM agents. > > + > > + @param[in] This - Pointer to the SMM Access Interfa= ce. > > + > > + @retval EFI_SUCCESS - The region was successfully opened. > > + @retval EFI_DEVICE_ERROR - The region could not be opened becau= se > locked by > > + chipset. > > + @retval EFI_INVALID_PARAMETER - The descriptor index was out of > bounds. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +Open ( > > + IN EFI_SMM_ACCESS2_PROTOCOL *This > > + ); > > + > > +/** > > + This routine accepts a request to "close" a region of SMRAM. The > > + region could be legacy AB or TSEG near top of physical memory. > > + The use of "close" means that the memory is only visible from SMM > > +agents, > > + not from BS or RT code. > > + > > + @param[in] This - Pointer to the SMM Access Interfa= ce. > > + > > + @retval EFI_SUCCESS - The region was successfully closed. > > + @retval EFI_DEVICE_ERROR - The region could not be closed becau= se > locked by > > + chipset. > > + @retval EFI_INVALID_PARAMETER - The descriptor index was out of > bounds. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +Close ( > > + IN EFI_SMM_ACCESS2_PROTOCOL *This > > + ); > > + > > +/** > > + This routine accepts a request to "lock" SMRAM. The > > + region could be legacy AB or TSEG near top of physical memory. > > + The use of "lock" means that the memory can no longer be opened > > + to BS state.. > > + > > + @param[in] This - Pointer to the SMM Access Interfa= ce. > > + > > + @retval EFI_SUCCESS - The region was successfully locked. > > + @retval EFI_DEVICE_ERROR - The region could not be locked becau= se > at least > > + one range is still open. > > + @retval EFI_INVALID_PARAMETER - The descriptor index was out of > bounds. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +Lock ( > > + IN EFI_SMM_ACCESS2_PROTOCOL *This > > + ); > > + > > +/** > > + This routine services a user request to discover the SMRAM > > + capabilities of this platform. This will report the possible > > + ranges that are possible for SMRAM access, based upon the > > + memory controller capabilities. > > + > > + @param[in] This - Pointer to the SMRAM Access Inter= face. > > + @param[in] SmramMapSize - Pointer to the variable containin= g size > of the > > + buffer to contain the description informat= ion. > > + @param[in] SmramMap - Buffer containing the data descri= bing the > Smram > > + region descriptors. > > + > > + @retval EFI_BUFFER_TOO_SMALL - The user did not provide a sufficien= t > buffer. > > + @retval EFI_SUCCESS - The user provided a sufficiently-siz= ed buffer. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +GetCapabilities ( > > + IN CONST EFI_SMM_ACCESS2_PROTOCOL *This, > > + IN OUT UINTN *SmramMapSize, > > + IN OUT EFI_SMRAM_DESCRIPTOR *SmramMap > > + ); > > +#endif > > diff --git a/Silicon/Intel/IntelSiliconPkg/Include/Library/SmmAccessLib= .h > > b/Silicon/Intel/IntelSiliconPkg/Include/Library/SmmAccessLib.h > > new file mode 100644 > > index 0000000000..b7cb88f6ca > > --- /dev/null > > +++ b/Silicon/Intel/IntelSiliconPkg/Include/Library/SmmAccessLib.h > > @@ -0,0 +1,32 @@ > > +/** @file > > + Header file for SMM Access Driver. > > + > > + Copyright (c) 2019, Intel Corporation. All rights reserved.
> > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > +**/ > > +#ifndef _SMM_ACCESS_H_ > > +#define _SMM_ACCESS_H_ > > + > > +/** > > + This function is to install an SMM Access PPI > > + - Introduction \n > > + A module to install a PPI for controlling SMM mode memory access > basically for S3 resume usage. > > + > > + - @pre > > + - _PEI_MASTER_BOOT_MODE_PEIM_PPI: A PPI published by > foundation to get bootmode executed earlier. > > + - _PEI_PERMANENT_MEMORY_INSTALLED_PPI: a PPI that will be > installed after memory controller initialization completed > > to indicate that physical memory is usable after this point. > > + > > + - @result > > + Publish _PEI_SMM_ACCESS_PPI. > > + > > + @retval EFI_SUCCESS - Ppi successfully started and insta= lled. > > + @retval EFI_NOT_FOUND - Ppi can't be found. > > + @retval EFI_OUT_OF_RESOURCES - Ppi does not have enough > resources to initialize the driver. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +PeiInstallSmmAccessPpi ( > > + VOID > > + ); > > +#endif > > -- > > 2.16.2.windows.1