From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mx.groups.io with SMTP id smtpd.web12.1355.1662758057885374999 for ; Fri, 09 Sep 2022 14:14:18 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=gV3BZtyT; spf=pass (domain: intel.com, ip: 192.55.52.151, mailfrom: isaac.w.oram@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1662758057; x=1694294057; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=vxfpvhtWtKweTxT/FgTX8xS1n5Tpdc1Q03HhwTH5fcc=; b=gV3BZtyTEtWSVNtkJR7WmNXnqZRpSOANmoVyt9hXNEMzTpJm/Um4l8qT QakOVpSGv7pU0FBSS91VV0Raq3z9onNpQVPJPrRmUNII7iCSKiM7XgCmH ROdLu3CIOaLz18S/mo0hOvHtFA19myJMDQi/150YlT28qxw9TjVNdtt/R QD+QEO2wNsSxBLz0CRMXQYCmaKZthTiFxasTCcVqwnr4FDv3QdupBraYn jjnf4hvTIT7uq4I4SbiWAJo17PsHAIC08Oq22WgoAUn09KoqLrGTeysYl eJStvf2GBEyyaOFPJJM+5uE//I35TY5XsdQ/ampxSE75ANQyDwQHxIYsc Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10465"; a="277963635" X-IronPort-AV: E=Sophos;i="5.93,304,1654585200"; d="scan'208";a="277963635" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Sep 2022 14:14:01 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,304,1654585200"; d="scan'208";a="683776564" Received: from orsmsx603.amr.corp.intel.com ([10.22.229.16]) by fmsmga004.fm.intel.com with ESMTP; 09 Sep 2022 14:14:01 -0700 Received: from orsmsx611.amr.corp.intel.com (10.22.229.24) by ORSMSX603.amr.corp.intel.com (10.22.229.16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Fri, 9 Sep 2022 14:14:00 -0700 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) by orsmsx611.amr.corp.intel.com (10.22.229.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31 via Frontend Transport; Fri, 9 Sep 2022 14:14:00 -0700 Received: from NAM04-DM6-obe.outbound.protection.outlook.com (104.47.73.44) by edgegateway.intel.com (134.134.137.100) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2375.31; Fri, 9 Sep 2022 14:14:00 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=jqXTp2Uw32KZGlyL9BcLxltSJgKdHaScrcN+IUHsrgqXPpOLKmU7v3c99z8uveXN4oJ7n2kVQ71rD7sxEI9NN/P450UPWMDDTgpNfMjfe0bItREZWb7aVIJl6CaxTSLs5Eb3xR2RErbfQKsXUhC41/6QCXRgX8ms416wgWRw/biXULXeQU+e3FfvdpUvsVL5/GJOz6US+GvEY8u1cBKWPpbqUU3pOTZIecYtyKuNsudBUu5kOF4uCz70+5MoSE/0daRr6bQ7wgRqoz4kjHqQ0Lp2Kwulx93tbx35ENAsOlAXe6/7uMSbtTAcAHXzR2EepyEx80bsXC4auPCA4xD8sw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=85BBAUFGT/uenXclxUDDQHFewtlVPTe8teZMqltvYb8=; b=cI5utoYA99a3nHG3aFSnnE6LsOJdD2w+isv0o9Jat/t1vlZhRFXQpWPG4MBbWsxQ+w8wD+PCsMVZF3w1gucJTJAliVunvyg4OONMdsLYzHPydj5DbKbor2WuILUMVF+wP2P3T82mWd7TCIbOzajcaY7doiHyfdrREVGi2hWbPb5tjRmWmNY6UDZbpiMvbhssGwYH0a18Ku2XL72WciqgP7EnR6UrLboILiC4jA8sRsyhX831TW/mNwLkHc+9Pvz83f8Lt08wPFUPiKkHcQAIDSnOIVohCKg7HTJLQoXBT/y4Vy5/lWtMwccKk0D6u/uJh7gHJ1DrRnSzLvrys2wbqg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Received: from SA1PR11MB5801.namprd11.prod.outlook.com (2603:10b6:806:23d::13) by SA1PR11MB6805.namprd11.prod.outlook.com (2603:10b6:806:24c::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5588.11; Fri, 9 Sep 2022 21:13:58 +0000 Received: from SA1PR11MB5801.namprd11.prod.outlook.com ([fe80::4149:e96e:480e:e1c3]) by SA1PR11MB5801.namprd11.prod.outlook.com ([fe80::4149:e96e:480e:e1c3%5]) with mapi id 15.20.5588.010; Fri, 9 Sep 2022 21:13:58 +0000 From: "Isaac Oram" To: "devel@edk2.groups.io" , "Oram, Isaac W" , Benjamin Doron CC: "Desimone, Nathaniel L" , "Sinha, Ankit" , "Ni, Ray" , "Chaganty, Rangasai V" Subject: Re: [edk2-devel][edk2-platforms][PATCH v2 2/6] IntelSiliconPkg/Feature/SmmAccess: Implement PPI with chipset support Thread-Topic: [edk2-devel][edk2-platforms][PATCH v2 2/6] IntelSiliconPkg/Feature/SmmAccess: Implement PPI with chipset support Thread-Index: AQHYwxSPTgND/JTgtUaZxGjng8FRAK3Xm/Bg Date: Fri, 9 Sep 2022 21:13:58 +0000 Message-ID: References: <2c1e044f0d9236a43f77c5dc8bc9d7dd39bf7612.1662483691.git.benjamin.doron00@gmail.com> <1712B8F6079EA3A9.20240@groups.io> In-Reply-To: <1712B8F6079EA3A9.20240@groups.io> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: eb7e8aea-af49-454c-8fed-08da92a835f9 x-ms-traffictypediagnostic: SA1PR11MB6805:EE_ x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: m6t0WKMvHkvWc2EXgiiN4SsoBtR+ajXUQ+Q2/jgMy1W/5sBRuDpZ5w5p63AbFcKNicvWnC0iCU9DQDCq0WUCkM5iIZZdHNDEjnNNiVP5AAVUPI8/QdEc+ZNSVWt4sBzePkGBZmCm6ms24nFIpL5sz/vve1+wWksSIeCDIqRfg0QiHX5e/KdadCywCMwbpVleDSc1somph2fIWHjSFvBjJFC7yNrfeLo+e7V8Kr+OMUyK5YO25Fe9fhEc6Gk76kRScB7VC3ggV7IJcy+qNrHzmTJQCKa04lhS0RKDFYtARPVNjVF9Yn384UqBP9LN9IsjrrJqPt6315n+JSfkgS6vGwihXnTOcuC9BmndlHtuzdcuHggowgWUAcfLuJxh/X2t1vFW0EkfZs3QjLWMeEwLznkSeDTb4Cxxr71r+I4wEOyWxFiMdlMfqVUriEQY8IADreON8wV7dFTG/3DnkzI+JOyihl99LtgJPUIffc+BS4TyCl95EqA4x0y18TONTh+CDxH5funtQI2KTza6RtRytRUjAQNQq5DwVjEizPiPyW5P2ImAznJh9hWeuG5O63cuVCX4oWVAcNmuzo6yks+49MKXa1IMO8FRwYdRAGHQ7+nHk9ACYOz/VGjspDQc5LTS9wtglmUvIIyYmkO9oRL7DUcPuliucPtejgPQ49j1xEsrTVRSRrFqHXJJ8+pAck4mDGWWOqGyq+CCfrCnPYqANcfgUIQDmKLQyEij7QrTquYL7abCK9wq+KlQafkkJ6FEbujXNuvX/6QAjEGKj7+EydC1AQMumCK4tQ75Tj8g9RGnAunqpEE9d3e3L0taVZ0UgeZjZDalT0B0ugFCL78R/w== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SA1PR11MB5801.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(346002)(136003)(39860400002)(366004)(396003)(376002)(5660300002)(7696005)(107886003)(38070700005)(82960400001)(9686003)(83380400001)(41300700001)(6506007)(26005)(38100700002)(53546011)(122000001)(186003)(30864003)(55016003)(64756008)(4326008)(52536014)(66556008)(8676002)(86362001)(8936002)(66946007)(33656002)(54906003)(66476007)(71200400001)(478600001)(966005)(76116006)(2906002)(66446008)(316002)(110136005);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?vButHnsg0kOSPzST6qEn/1A1kFgqxMedC32NdS5vnUHcq1zK7tIP7FftjbrG?= =?us-ascii?Q?T0aIOi8birIHYW1VyyuSD6ZftGsmnq+s+DEigacwk0vDqlAwP8F/rjFgTmuN?= =?us-ascii?Q?tIn+/0R4HOIFZzuNP3oQ7fNFNAQxorJFQDKuYbJOuIOcYZ3O+4JG1qbdch5n?= =?us-ascii?Q?rbZbDwJ5DjkLW8UfIkXH74J7/KhKe5Mtx5umPSO0d06SKsvLY4zu+hwqKHMZ?= =?us-ascii?Q?gRetXp6pikTNxZAaW22slJxnA7T4vq7tQY05/FYthFJz+r+Io0CNiKkrB2qF?= =?us-ascii?Q?sNFjgpJYbeypx5RYCh3Js2mtZG/LwEhA2RPSvRcvBVzNOX9Rs4B7rUlySrbQ?= =?us-ascii?Q?2bVaOygx76Kg6MsOi4sGkgNzxEsEL5XNRyIRijkWemIOuwmBWi5d897lwaLL?= =?us-ascii?Q?rm8rsEkEBbqWmsjNxiNsx0RsIYScvcKchNOt4RSF46CMEsWB8Qq/qiCxslP1?= =?us-ascii?Q?Mjnrj6ZowFoPKogN/Zw2SiiLtSrgBM6RhNk02SEvB5c0gSFooaSxNIimxD3y?= =?us-ascii?Q?hVLuSFigldhhvHczXmFVwlPp3sg97JDG0ZX5Yd2tQbaJyjatXH0U8OJkwXIw?= =?us-ascii?Q?jZFliZ5ppB9HucW185R/BDlPjbpIqvOT/+oZoXVyyrthbQUaqpIuEmGWOeUC?= =?us-ascii?Q?ggmLE9Kr5Bp1VVCxuTkEVkA4S4qej/TlQUDyeXVGBtt5VDL0VObUnjEQH4Yi?= =?us-ascii?Q?8wU7bN0TX3IagN7PHY8wRUHB/jqpnAK8l6mjUaecTOfjh7MUJwcNyxYSwQur?= =?us-ascii?Q?QgheKyTxA7TZng5QU2lrfMAhbkqbpc3lnvshPsyz3bpsUrUioMVKnPvrRCd4?= =?us-ascii?Q?HPmTz5YfjonEUEzlBamwFILt5CCpiBqq/AIq2oNgDYY+nYb3h5DIBu0/fvHR?= =?us-ascii?Q?i5NLrGLHrJBjWkVF4BpaMSs4QliqG2EXExTLP9oqVsAATqk7IKNorqJZvVmy?= =?us-ascii?Q?zK8gsuEw8U8mrJVNyVdfrtH34sOip/Fn1/gknsINB6h+3B7J7jnduICX3zDj?= =?us-ascii?Q?eh7+ITNJYX4Hb1/0WmJ5mZ4WA7BhxClcWdRrn2MQNbrnO68yKJn8x9LGeypL?= =?us-ascii?Q?uBjVSTYSIn+WpVpSH+9LmMeb10N+dzuiewdoWNnCUBf3v3+ZFNf4asVv9/5K?= =?us-ascii?Q?KTcAxcMI6I1mAKgInA1HC/P2zlGIvTPzVQByc1t9LDAYGTqQ43CuU5GYC+k5?= =?us-ascii?Q?YuE8cPKmwTtgXLHJux3kP/2Q6DoP2ZTX0P1cKB9nh8EhMInZtHIf/okN97HP?= =?us-ascii?Q?MB3fbLJaPjE69VcB8YsGsQgPfDV8D1iZVJIt9XKeolGtKovS8HjoIwzEAAjE?= =?us-ascii?Q?8BneGUNDgQTFvMR0SV5mUHq2O6f7jJpOxDIUMDjq7Bf6g8zGATsMz8cWomVV?= =?us-ascii?Q?XWZtE6HCx00n7r5APlVN8ncwOePPtufhsSWBPImuIM5iCUypLSLs9SRjPvRD?= =?us-ascii?Q?ZPahj1UVChJ8EtBz2ECt/F2calafkCiixXMZVesHRYaloutglUXMUmqhWKbV?= =?us-ascii?Q?r+kfcs4yY6kf7EQyNatqWekW4W+ayua3Rs9qp670x825Pzacrxk3c2M6Li3h?= =?us-ascii?Q?nNsuaxRSbpox7EtKbJZWNfsYumBT3x12N8iMvXl0?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SA1PR11MB5801.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: eb7e8aea-af49-454c-8fed-08da92a835f9 X-MS-Exchange-CrossTenant-originalarrivaltime: 09 Sep 2022 21:13:58.3586 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: nWGEGN5zNAFuBpy4VDj8EN5i6dSXCATLMTJEXkR5Qf0KLDpQAWiuPbdfUB4slFUfyBof98HH39o74VyXEo8Qdw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR11MB6805 Return-Path: isaac.w.oram@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Pushed as b74194d8b8..b013adb40e -----Original Message----- From: devel@edk2.groups.io On Behalf Of Isaac Oram Sent: Wednesday, September 7, 2022 4:49 PM To: Benjamin Doron ; devel@edk2.groups.io Cc: Desimone, Nathaniel L ; Sinha, Ankit ; Ni, Ray ; Chaganty, Rangasai V Subject: Re: [edk2-devel][edk2-platforms][PATCH v2 2/6] IntelSiliconPkg/Fea= ture/SmmAccess: Implement PPI with chipset support Reviewed-by: Isaac Oram -----Original Message----- From: Benjamin Doron =20 Sent: Tuesday, September 6, 2022 10:02 AM To: devel@edk2.groups.io Cc: Desimone, Nathaniel L ; Sinha, Ankit ; Ni, Ray ; Chaganty, Rangasai V ; Oram, Isaac W Subject: [edk2-devel][edk2-platforms][PATCH v2 2/6] IntelSiliconPkg/Feature= /SmmAccess: Implement PPI with chipset support SMRAM must be opened to retrieve the lockbox for S3, and SMM communication = depends on this PPI. For security purposes, SMRAM lock must be performed be= fore EndOfPei (although FSP notify performs lockdown too). It seems to me that this library is generic and applicable to all Intel pla= tforms in the tree using the MCH SMRAMC register. Cc: Nate DeSimone Cc: Ankit Sinha Cc: Ray Ni Cc: Rangasai V Chaganty Cc: Isaac Oram Signed-off-by: Benjamin Doron --- .../PeiSmmAccessLibSmramc/PeiSmmAccessLib.c | 430 ++++++++++++++++++ .../PeiSmmAccessLibSmramc/PeiSmmAccessLib.inf | 36 ++ 2 files changed, 466 insertions(+) create mode 100644 Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Library= /PeiSmmAccessLibSmramc/PeiSmmAccessLib.c create mode 100644 Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Library= /PeiSmmAccessLibSmramc/PeiSmmAccessLib.inf diff --git a/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Library/PeiSmm= AccessLibSmramc/PeiSmmAccessLib.c b/Silicon/Intel/IntelSiliconPkg/Feature/S= mmAccess/Library/PeiSmmAccessLibSmramc/PeiSmmAccessLib.c new file mode 100644 index 000000000000..5b472bf86abf --- /dev/null +++ b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Library/PeiSmmAcce +++ ssLibSmramc/PeiSmmAccessLib.c @@ -0,0 +1,430 @@ +/** @file+ This is to publish the SMM Access Ppi instance.++ Copyright (= c) 2019 - 2020, Intel Corporation. All rights reserved.
+ SPDX-License-= Identifier: BSD-2-Clause-Patent++**/+#include +#in= clude +#include +#includ= e +#include +#include +#include +#include ++#include +#include ++#= define SMM_ACCESS_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('4', '5', 's', 'a')+= +///+/// Private data+///+typedef struct {+ UINTN Signatur= e;+ EFI_HANDLE Handle;+ EFI_PEI_MM_ACCESS_PPI SmmAccess;+ //+= // Local Data for SMM Access interface goes here+ //+ UINTN = NumberRegions;+ EFI_SMRAM_DESCRIPTOR *SmramDesc;+} SMM_ACCESS_PRIVAT= E_DATA;++#define SMM_ACCESS_PRIVATE_DATA_FROM_THIS(a) \+ CR (a, \+ = SMM_ACCESS_PRIVATE_DATA, \+ SmmAccess, \+ SMM_ACC= ESS_PRIVATE_DATA_SIGNATURE \+ )++//+// Common registers:+//+// DEVICE = 0 (Memory Controller Hub)+//+#define SA_MC_BUS 0x00+#define SA_MC_= DEV 0x00+#define SA_MC_FUN 0x00+///+/// Description:+/// = The SMRAMC register controls how accesses to Compatible SMRAM spaces are t= reated. The Open, Close and Lock bits function only when G_SMRAME bit is s= et to 1. Also, the Open bit must be reset before the Lock bit is set.+///+= #define R_SA_SMRAMC (0x88)+#define B_SA_SMRAMC_D_LCK_MASK (0x10)+#defi= ne B_SA_SMRAMC_D_CLS_MASK (0x20)+#define B_SA_SMRAMC_D_OPEN_MASK (0x= 40)++/**+ 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 S= MM agents.++ @param[in] PeiServices - General purpose services av= ailable to every PEIM.+ @param[in] This - Pointer to the S= MM Access Interface.+ @param[in] DescriptorIndex - Region of SMRAM to= Open.++ @retval EFI_SUCCESS - The region was successfully ope= ned.+ @retval EFI_DEVICE_ERROR - The region could not be opened bec= ause locked by+ chipset.+ @retval EFI_I= NVALID_PARAMETER - The descriptor index was out of bounds.+**/+EFI_STATUS= +EFIAPI+Open (+ IN EFI_PEI_SERVICES **PeiServices,+ IN EFI_PEI_= MM_ACCESS_PPI *This,+ IN UINTN DescriptorIndex+ = )+{+ SMM_ACCESS_PRIVATE_DATA *SmmAccess;+ UINT8 Index;= + UINT64 Address;+ UINT8 SmramControl;= ++ SmmAccess =3D SMM_ACCESS_PRIVATE_DATA_FROM_THIS (This);+ if (Descripto= rIndex >=3D SmmAccess->NumberRegions) {+ DEBUG ((DEBUG_WARN, "SMRAM regi= on out of range\n"));++ return EFI_INVALID_PARAMETER;+ } else if (SmmAc= cess->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;+ }++ ///+ = /// BEGIN CHIPSET CODE+ ///+ ///+ /// SMRAM register is PCI 0:0:0:88, S= MRAMC (8 bit)+ ///+ Address =3D PCI_SEGMENT_LIB_ADDRESS (0, SA_MC_BUS, SA= _MC_DEV, SA_MC_FUN, R_SA_SMRAMC);+ SmramControl =3D PciSegmentRead8 (Addre= ss);+ ///+ /// Is SMRAM locked?+ ///+ if ((SmramControl & B_SA_SMRAMC_= D_LCK_MASK) !=3D 0) {+ ///+ /// Cannot Open a locked region+ ///+ = for (Index =3D 0; Index < SmmAccess->NumberRegions; Index++) {+ Smm= Access->SmramDesc[Index].RegionState |=3D EFI_SMRAM_LOCKED;+ }+ DEBUG= ((DEBUG_WARN, "Cannot open a locked SMRAM region\n"));+ return EFI_DEVI= CE_ERROR;+ }+ ///+ /// Open SMRAM region+ ///+ SmramControl |=3D B_SA_= SMRAMC_D_OPEN_MASK;+ SmramControl &=3D ~(B_SA_SMRAMC_D_CLS_MASK);++ PciSe= gmentWrite8 (Address, SmramControl);+ ///+ /// END CHIPSET CODE+ ///++ = SmmAccess->SmramDesc[DescriptorIndex].RegionState &=3D (UINT64) ~(EFI_SMRAM= _CLOSED | EFI_ALLOCATED);+ SmmAccess->SmramDesc[DescriptorIndex].RegionSta= te |=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[i= n] 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_DE= VICE_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_PEI_SERVICES **PeiServices,+ IN EFI_PEI_MM_ACCESS_PPI *This,+= IN UINTN DescriptorIndex+ )+{+ SMM_ACCESS_PRIVATE_DAT= A *SmmAccess;+ BOOLEAN OpenState;+ UINT8 = Index;+ UINT64 Address;+ UINT8 Smram= Control;++ SmmAccess =3D SMM_ACCESS_PRIVATE_DATA_FROM_THIS (This);+ if (D= escriptorIndex >=3D SmmAccess->NumberRegions) {+ DEBUG ((DEBUG_WARN, "SM= RAM region out of range\n"));++ return EFI_INVALID_PARAMETER;+ } else i= f (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_CLOS= ED) {+ return EFI_DEVICE_ERROR;+ }++ ///+ /// BEGIN CHIPSET CODE+ //= /+ ///+ /// SMRAM register is PCI 0:0:0:88, SMRAMC (8 bit)+ ///+ Addres= s =3D PCI_SEGMENT_LIB_ADDRESS (0, SA_MC_BUS, SA_MC_DEV, SA_MC_FUN, R_SA_SMR= AMC);+ SmramControl =3D PciSegmentRead8 (Address);+ ///+ /// Is SMRAM l= ocked?+ ///+ if ((SmramControl & B_SA_SMRAMC_D_LCK_MASK) !=3D 0) {+ //= /+ /// Cannot Close a locked region+ ///+ for (Index =3D 0; Index = < SmmAccess->NumberRegions; Index++) {+ SmmAccess->SmramDesc[Index].Re= gionState |=3D EFI_SMRAM_LOCKED;+ }+ DEBUG ((DEBUG_WARN, "Cannot clos= e a locked SMRAM region\n"));+ return EFI_DEVICE_ERROR;+ }+ ///+ /// = Close SMRAM region+ ///+ SmramControl &=3D ~(B_SA_SMRAMC_D_OPEN_MASK);++ = PciSegmentWrite8 (Address, SmramControl);+ ///+ /// END CHIPSET CODE+ /= //++ SmmAccess->SmramDesc[DescriptorIndex].RegionState &=3D (UINT64) ~EFI_= SMRAM_OPEN;+ SmmAccess->SmramDesc[DescriptorIndex].RegionState |=3D (UINT6= 4) (EFI_SMRAM_CLOSED | EFI_ALLOCATED);++ //+ // Find out if any regions a= re still open+ //+ OpenState =3D FALSE;+ for (Index =3D 0; Index < SmmAc= cess->NumberRegions; Index++) {+ if ((SmmAccess->SmramDesc[Index].Region= State & EFI_SMRAM_OPEN) =3D=3D EFI_SMRAM_OPEN) {+ OpenState =3D TRUE;+= }+ }++ SmmAccess->SmmAccess.OpenState =3D OpenState;+ return EFI_SUC= CESS;+}++/**+ This routine accepts a request to "lock" SMRAM. The+ regio= n could be legacy AB or TSEG near top of physical memory.+ The use of "loc= k" means that the memory can no longer be opened+ to PEIM.++ @param[in] P= eiServices - General purpose services available to every PEIM.+ @p= aram[in] This - Pointer to the SMM Access Interface.+ @par= am[in] DescriptorIndex - Region of SMRAM to Lock.++ @retval EFI_SUCCE= SS - The region was successfully locked.+ @retval EFI_DEVICE_E= RROR - The region could not be locked because at least+ = one range is still open.+ @retval EFI_INVALID_PARAM= ETER - The descriptor index was out of bounds.+**/+EFI_STATUS+EFIAPI+Lock= (+ IN EFI_PEI_SERVICES **PeiServices,+ IN EFI_PEI_MM_ACCESS_PPI= *This,+ IN UINTN DescriptorIndex+ )+{+ SMM_ACCE= SS_PRIVATE_DATA *SmmAccess;+ UINT64 Address;+ UINT8 = SmramControl;++ SmmAccess =3D SMM_ACCESS_PRIVATE_DATA_FROM_T= HIS (This);+ if (DescriptorIndex >=3D SmmAccess->NumberRegions) {+ DEBU= G ((DEBUG_WARN, "SMRAM region out of range\n"));++ return EFI_INVALID_PA= RAMETER;+ } else if (SmmAccess->SmmAccess.OpenState) {+ DEBUG ((DEBUG_W= ARN, "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;= ++ ///+ /// BEGIN CHIPSET CODE+ ///+ ///+ /// SMRAM register is PCI 0:= 0:0:88, SMRAMC (8 bit)+ ///+ Address =3D PCI_SEGMENT_LIB_ADDRESS (0, SA_M= C_BUS, SA_MC_DEV, SA_MC_FUN, R_SA_SMRAMC);+ SmramControl =3D PciSegmentRea= d8 (Address);++ ///+ /// Lock the SMRAM+ ///+ SmramControl |=3D B_SA_SM= RAMC_D_LCK_MASK;++ PciSegmentWrite8 (Address, SmramControl);+ ///+ /// E= ND CHIPSET CODE+ ///++ return EFI_SUCCESS;+}++/**+ This routine services= a user request to discover the SMRAM+ capabilities of this platform. Thi= s will report the possible+ ranges that are possible for SMRAM access, bas= ed 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, out] Sm= ramMapSize - Pointer to the variable containing size of the+ = buffer to contain the description information.+ @par= am[in, out] SmramMap - Buffer containing the data describing the Smra= m+ region descriptors.++ @retval EFI_BUF= FER_TOO_SMALL - The user did not provide a sufficient buffer.+ @retval E= FI_SUCCESS - The user provided a sufficiently-sized buffer.+**/+= EFI_STATUS+EFIAPI+GetCapabilities (+ IN EFI_PEI_SERVICES **= PeiServices,+ IN EFI_PEI_MM_ACCESS_PPI *This,+ IN OUT UINTN = *SmramMapSize,+ IN OUT EFI_SMRAM_DESCRIPTOR *Smr= amMap+ )+{+ EFI_STATUS Status;+ SMM_ACCESS_PRIVATE_DATA *Sm= mAccess;+ UINTN NecessaryBufferSize;++ SmmAccess = =3D SMM_ACCESS_PRIVATE_DATA_FROM_THIS (This);+ NecessaryBufferSize =3D= SmmAccess->NumberRegions * sizeof (EFI_SMRAM_DESCRIPTOR);+ if (*SmramMapS= ize < NecessaryBufferSize) {+ DEBUG ((DEBUG_WARN, "SMRAM Map Buffer too = small\n"));++ Status =3D EFI_BUFFER_TOO_SMALL;+ } else {+ CopyMem (S= mramMap, SmmAccess->SmramDesc, NecessaryBufferSize);+ Status =3D EFI_SUC= CESS;+ }++ *SmramMapSize =3D NecessaryBufferSize;+ return Status;+}++/**= + This function is to install an SMM Access PPI+ - Introduction \n= + An API to install an instance of EFI_PEI_MM_ACCESS_PPI. This PPI is co= mmonly used to control SMM mode memory access for S3 resume.++ @retval E= FI_SUCCESS - Ppi successfully started and installed.+ @retval = EFI_NOT_FOUND - Ppi can't be found.+ @retval EFI_OUT_OF_RESOURCE= S - Ppi does not have enough resources to initialize the driver.+**/+EFI_S= TATUS+EFIAPI+PeiInstallSmmAccessPpi (+ VOID+ )+{+ EFI_STATUS = Status;+ UINTN Index;+ EFI_PEI_PPI_DE= SCRIPTOR *PpiList;+ EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *DescriptorBl= ock;+ SMM_ACCESS_PRIVATE_DATA *SmmAccessPrivate;+ VOID = *HobList;++ //+ // Initialize private data+ //+ SmmAcc= essPrivate =3D AllocateZeroPool (sizeof (*SmmAccessPrivate));+ ASSERT (Sm= mAccessPrivate !=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_A= CCESS_PRIVATE_DATA_SIGNATURE;+ SmmAccessPrivate->Handle =3D NULL;++ //= + // Get Hob list+ //+ HobList =3D GetFirstGuidHob (&gEfiSmmSmramMemoryG= uid);+ if (HobList =3D=3D NULL) {+ DEBUG ((DEBUG_WARN, "SmramMemoryRese= rve 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->Number= OfSmmReservedRegions) * sizeof (EFI_SMRAM_DESCRIPTOR));+ if (SmmAccessPriv= ate->SmramDesc =3D=3D NULL) {+ DEBUG ((DEBUG_WARN, "Alloc SmmAccessPriva= te->SmramDesc fail.\n"));+ return EFI_OUT_OF_RESOURCES;+ }++ DEBUG ((D= EBUG_INFO, "Alloc SmmAccessPrivate->SmramDesc success.\n"));++ //+ // use= the hob to publish SMRAM capabilities+ //+ for (Index =3D 0; Index < Des= criptorBlock->NumberOfSmmReservedRegions; Index++) {+ SmmAccessPrivate->= SmramDesc[Index].PhysicalStart =3D DescriptorBlock->Descriptor[Index].Phys= icalStart;+ SmmAccessPrivate->SmramDesc[Index].CpuStart =3D Descri= ptorBlock->Descriptor[Index].CpuStart;+ SmmAccessPrivate->SmramDesc[Inde= x].PhysicalSize =3D DescriptorBlock->Descriptor[Index].PhysicalSize;+ = SmmAccessPrivate->SmramDesc[Index].RegionState =3D DescriptorBlock->Desc= riptor[Index].RegionState;+ }++ SmmAccessPrivate->NumberRegions = =3D Index;+ SmmAccessPrivate->SmmAccess.Open =3D Open;+ Smm= AccessPrivate->SmmAccess.Close =3D Close;+ SmmAccessPrivate->Smm= Access.Lock =3D Lock;+ SmmAccessPrivate->SmmAccess.GetCapabilit= ies =3D GetCapabilities;+ SmmAccessPrivate->SmmAccess.LockState =3D = FALSE;+ SmmAccessPrivate->SmmAccess.OpenState =3D FALSE;++ //+ // = Install PPI+ //+ PpiList->Flags =3D (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PE= I_PPI_DESCRIPTOR_TERMINATE_LIST);+ PpiList->Guid =3D &gEfiPeiMmAccessPpi= Guid;+ PpiList->Ppi =3D &SmmAccessPrivate->SmmAccess;++ Status = =3D PeiServicesInstallPpi (PpiList);+ ASSERT_EFI_ERROR (Status);++ retu= rn EFI_SUCCESS;+}diff --git a/Silicon/Intel/IntelSiliconPkg/Feature/SmmAcce= ss/Library/PeiSmmAccessLibSmramc/PeiSmmAccessLib.inf b/Silicon/Intel/IntelS= iliconPkg/Feature/SmmAccess/Library/PeiSmmAccessLibSmramc/PeiSmmAccessLib.i= nf new file mode 100644 index 000000000000..160210d429d9 --- /dev/null +++ b/Silicon/Intel/IntelSiliconPkg/Feature/SmmAccess/Library/PeiSmmAcce +++ ssLibSmramc/PeiSmmAccessLib.inf @@ -0,0 +1,36 @@ +## @file+# Library description file for the SmmAccess PPI+#+# Copyright (c= ) 2019, Intel Corporation. All rights reserved.
+# SPDX-License-Identifi= er: BSD-2-Clause-Patent+#+##++[Defines]+ INF_VERSION = =3D 0x00010017+ BASE_NAME =3D PeiSmmAccessLibSmramc+ = FILE_GUID =3D 3D28FD4B-F46F-4E24-88AA-9DA09C51BE87+ = VERSION_STRING =3D 1.0+ MODULE_TYPE =3D= PEIM+ LIBRARY_CLASS =3D SmmAccessLib++[LibraryClasses]+ = BaseMemoryLib+ MemoryAllocationLib+ DebugLib+ HobLib+ PciSegmentLib+ = PeiServicesLib++[Packages]+ MdePkg/MdePkg.dec+ IntelSiliconPkg/IntelSilic= onPkg.dec++[Sources]+ PeiSmmAccessLib.c++[Ppis]+ gEfiPeiMmAccessPpiGuid = ## PRODUCES++[Guids]+ gEfiSmmSmramMemoryGuid--=20 2.37.2