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.100, mailfrom: ray.ni@intel.com) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by groups.io with SMTP; Fri, 23 Aug 2019 14:02:51 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Aug 2019 14:02:50 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,422,1559545200"; d="scan'208";a="196559687" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by fmsmga001.fm.intel.com with ESMTP; 23 Aug 2019 14:02:49 -0700 Received: from fmsmsx604.amr.corp.intel.com (10.18.126.84) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.439.0; Fri, 23 Aug 2019 14:02:49 -0700 Received: from fmsmsx604.amr.corp.intel.com (10.18.126.84) by fmsmsx604.amr.corp.intel.com (10.18.126.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Fri, 23 Aug 2019 14:02:48 -0700 Received: from shsmsx151.ccr.corp.intel.com (10.239.6.50) by fmsmsx604.amr.corp.intel.com (10.18.126.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.1.1713.5 via Frontend Transport; Fri, 23 Aug 2019 14:02:48 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.112]) by SHSMSX151.ccr.corp.intel.com ([169.254.3.250]) with mapi id 14.03.0439.000; Sat, 24 Aug 2019 05:02:45 +0800 From: "Ni, Ray" To: "Chaganty, Rangasai V" , "Chen, Marc W" , "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: AQHVWZ1zsH4zrI0Xq0mzU2k9CqBPQKcIiUYAgACve1A= Date: Fri, 23 Aug 2019 21:02:44 +0000 Message-ID: <734D49CCEBEEF84792F5B80ED585239D5C296BCB@SHSMSX104.ccr.corp.intel.com> References: <20190823102751.9944-1-marc.w.chen@intel.com> In-Reply-To: Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZTk1MGVmMTUtYTc1Ny00MTJlLTg5OTQtMjdkZTc4MjZhNWJlIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiTUNrRjNBYjBKOElHXC9CayttdThTR0haa0JnZklhNmdoT3ZPNjNqUzFDXC9kdGUweXYxWjZCRGdGWmFwQU5hTmo3In0= x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: ray.ni@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable It's not recommended to make IntelSiliconPkg depend on MdeModulePkg. > -----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 SmmAc= cess in IntelSiliconPkg >=20 > May I know the reason to implement the SmmAccessLib instance under \Featu= re folder? > Can we move it under IntelSiliconPkg\Library (We need to create a library= folder in the root) and keep just the module in the > \Feature folder? >=20 > 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 chan= ge? >=20 > Thanks, > Sai >=20 > -----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 ; Cha= ganty, Rangasai V > > Subject: [edk2-platforms:PATCH] Intel/IntelSiliconPkg Implement SmmAccess= in IntelSiliconPkg >=20 > REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D2121 >=20 > Implement SmmAccess for PEI and DXE phase in IntelSiliconPkg >=20 > 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/Libra= ry/PeiSmmAccessLib/PeiSmmAccessLib.c > create mode 100644 Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Libra= ry/PeiSmmAccessLib/PeiSmmAccessLib.inf > create mode 100644 Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAc= cessDxe/SmmAccess.inf > create mode 100644 Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAc= cessDxe/SmmAccessDriver.c > create mode 100644 Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAc= cessDxe/SmmAccessDriver.h > create mode 100644 Silicon/Intel/IntelSiliconPkg/Include/Library/SmmAcce= ssLib.h >=20 > diff --git a/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Library/PeiS= mmAccessLib/PeiSmmAccessLib.c > b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Library/PeiSmmAccessLib= /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 memor= y. > + 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 e= very PEIM. > + > + @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 boun= ds. > +**/ > +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_SMR= AM_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 is > +valid for > + compatible SMRAM region. > + > + @param[in] PeiServices - General purpose services available to e= very 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 becau= se locked by > + chipset. > + @retval EFI_INVALID_PARAMETER - The descriptor index was out of boun= ds. > +**/ > +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_SMR= AM_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_CLOS= ED) { > + 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 ev= ery 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 becau= se at least > + one range is still open. > + @retval EFI_INVALID_PARAMETER - The descriptor index was out of boun= ds. > +**/ > +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 every= 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 informat= ion. > + @param[in] SmramMap - Buffer containing the data describing the = Smram > + region descriptors. > + > + @retval EFI_BUFFER_TOO_SMALL - The user did not provide a sufficient= buffer. > + @retval EFI_SUCCESS - The user provided a sufficiently-size= d 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 bas= ically for S3 resume usage. > + > + - @pre > + - _PEI_MASTER_BOOT_MODE_PEIM_PPI: A PPI published by foundation to g= et 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 install= ed. > + @retval EFI_NOT_FOUND - Ppi can't be found. > + @retval EFI_OUT_OF_RESOURCES - Ppi does not have enough resources t= o 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 (Status)= ) > + { > + // > + // 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 NULL)= { > + 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_DESC= RIPTOR)); 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 DescriptorBloc= k->Descriptor[Index].PhysicalStart; > + SmmAccessPrivate->SmramDesc[Index].CpuStart =3D DescriptorBloc= k->Descriptor[Index].CpuStart; > + SmmAccessPrivate->SmramDesc[Index].PhysicalSize =3D DescriptorBloc= k->Descriptor[Index].PhysicalSize; > + SmmAccessPrivate->SmramDesc[Index].RegionState =3D DescriptorBloc= k->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_DESCRIPT= OR_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/PeiS= mmAccessLib/PeiSmmAccessLib.inf > b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Library/PeiSmmAccessLib= /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= /SmmAccess.inf > b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAccessDxe/SmmAccess.= 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= /SmmAccessDriver.c > b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAccessDxe/SmmAccessD= river.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 resource= s 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 NUL= L) { > + 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->Descr= iptor[Index].PhysicalStart; > + mSmmAccess.SmramDesc[Index].CpuStart =3D DescriptorBlock->Descr= iptor[Index].CpuStart; > + mSmmAccess.SmramDesc[Index].PhysicalSize =3D DescriptorBlock->Descr= iptor[Index].PhysicalSize; > + mSmmAccess.SmramDesc[Index].RegionState =3D DescriptorBlock->Descr= iptor[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 // Status > + =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 memor= y. > + 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 because= 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; Des= criptorIndex++) { > + if (SmmAccess->SmramDesc[DescriptorIndex].RegionState & EFI_SMRAM_LO= CKED) { > + 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) ~(EF= I_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 because= 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_LO= CKED) { > + 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 because= 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 Interfa= ce. > + @param[in] SmramMapSize - Pointer to the variable containing = size of the > + buffer to contain the description i= nformation. > + @param[in] SmramMap - Buffer containing the data describi= ng the Smram > + region descriptors. > + > + @retval EFI_BUFFER_TOO_SMALL - The user did not provide a sufficient = buffer. > + @retval EFI_SUCCESS - The user provided a sufficiently-sized= 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= /SmmAccessDriver.h > b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/SmmAccessDxe/SmmAccessD= river.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 used= 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 pro= tocol to open SMRAM during post and copy the SMM > handler. > + SMM access protocol is also used to close the SMRAM region once the = copying is done. > + Finally, the SMM access protocol provides services to "Lock" the SMR= AM region. > + Please refer the SMM Protocols section in the attached SMM CIS Speci= fication 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 sho= uld 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 memor= y. > + 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 because= 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 Interface= . > + > + @retval EFI_SUCCESS - The region was successfully closed. > + @retval EFI_DEVICE_ERROR - The region could not be closed because= 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 Interface= . > + > + @retval EFI_SUCCESS - The region was successfully locked. > + @retval EFI_DEVICE_ERROR - The region could not be locked because= 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 Interfa= ce. > + @param[in] SmramMapSize - Pointer to the variable containing = size of the > + buffer to contain the description informatio= n. > + @param[in] SmramMap - Buffer containing the data describi= ng the Smram > + region descriptors. > + > + @retval EFI_BUFFER_TOO_SMALL - The user did not provide a sufficient = buffer. > + @retval EFI_SUCCESS - The user provided a sufficiently-sized= 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 bas= ically for S3 resume usage. > + > + - @pre > + - _PEI_MASTER_BOOT_MODE_PEIM_PPI: A PPI published by foundation to g= et 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 install= ed. > + @retval EFI_NOT_FOUND - Ppi can't be found. > + @retval EFI_OUT_OF_RESOURCES - Ppi does not have enough resources t= o initialize the driver. > +**/ > +EFI_STATUS > +EFIAPI > +PeiInstallSmmAccessPpi ( > + VOID > + ); > +#endif > -- > 2.16.2.windows.1