From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by mx.groups.io with SMTP id smtpd.web11.3956.1689127371241656919 for ; Tue, 11 Jul 2023 19:02:51 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=dGRIftqa; spf=pass (domain: intel.com, ip: 192.55.52.136, 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=1689127371; x=1720663371; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=xWy6NoeDBGEOaQ7t35Ezl/rwlaEwbvQLNzxomMQzKgE=; b=dGRIftqawaCSNW/VGVARUyiMJF78Fb+QFDqcx6hf6btJGBsXk7QpuypF sB3SxY4IvgwF5Dy+FyzsAjSbzuOtuVay68AsY66PEoD8VFEFNlK6m0mpB w27EPn2oj4U1dOsYutMYoswe5fGBjORD0RL8+le1azHrhT8N3y9RNichy nCfJe1VwMaCf0eOZqCaz18YU8+lHPOTU9pglv6BZQRFsLhhqrNPVLdAST vTzswICYlJZ0MhShDJCIHuREYnjy06YqzvdhGv2ciUQyaoA/nHY2Zzn9O AAx55Z29IFsyUceML8y8ET7wLm6IT37m9uLnGZ7Dd6ciNX64zkKb21MBg g==; X-IronPort-AV: E=McAfee;i="6600,9927,10768"; a="344381584" X-IronPort-AV: E=Sophos;i="6.01,198,1684825200"; d="scan'208";a="344381584" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Jul 2023 19:02:50 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10768"; a="845477814" X-IronPort-AV: E=Sophos;i="6.01,198,1684825200"; d="scan'208";a="845477814" Received: from fmsmsx603.amr.corp.intel.com ([10.18.126.83]) by orsmga004.jf.intel.com with ESMTP; 11 Jul 2023 19:02:49 -0700 Received: from fmsmsx602.amr.corp.intel.com (10.18.126.82) by fmsmsx603.amr.corp.intel.com (10.18.126.83) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Tue, 11 Jul 2023 19:02:49 -0700 Received: from fmsedg601.ED.cps.intel.com (10.1.192.135) by fmsmsx602.amr.corp.intel.com (10.18.126.82) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27 via Frontend Transport; Tue, 11 Jul 2023 19:02:49 -0700 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (104.47.58.169) by edgegateway.intel.com (192.55.55.70) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.27; Tue, 11 Jul 2023 19:02:48 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=J+n7iuaHle8XmMMIEi65FgF5dQHzBA2Q8WyOppIeZgTW1s+ImprnYOPo9nuNNrF5M9OXWxl9AB9eCyl2g4mXB5u9/NcRdbDsQor/iIKMH/hSjg161nYc2NCm7MtGPvnSDWbpk2u2iIZP2o//y+DHRp+a/B2vpClYoKxKfE9WLXO89SMpcpXSQQojEYeYeT+wP6xgFJX7FhtUKRPeI9uzvc276K8RKjwPeJZXpv8VaV1G49/GiBktjq8oDpTsdGufz4odHZ1YEfnBA+arvl5+x3S9u8dfOhp1SZAiyVCPdz5ARFTv2ZBbJLjCuwyBt4SXLW9MPhnwMTg4LVi0oF5whA== 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=q0vVLinskL3kqVR/5tLPfOvPApODM0V5S1bf/mks+uk=; b=H7d3IP+vWS1zN5ByCQ/Cxxd/eqRctGEn5aaeMqywpU6EByWQJ5oslPXUUuJuVI6ixr4Z9LVE6lvTqjP3yljxmbpy7a2ZVMFBJj2hc0KA9ElRMctu3ohfwve91xeruq04cwaidl20VMbwByP9DiyGp9LwM6CHikYkTRwMGlCsfPE7C+y+o8fsBDtVTLBF8h/LnTuAwRoPupZiQdpCup6NsewqsfNFe7kzZPMVuimVSj6KhruI97wjo3/9sAXhw7C4GxZSoBxZ1PsMuCSz+yhitjgIgeSBqVwvcFIxccGtsYeROmn5A6TrCQrTyryKXTc8FhwHSUT69lEvECrkRuVO9w== 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 DS0PR11MB7998.namprd11.prod.outlook.com (2603:10b6:8:126::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6565.32; Wed, 12 Jul 2023 02:02:36 +0000 Received: from SA1PR11MB5801.namprd11.prod.outlook.com ([fe80::ba9b:b98b:c9f2:b32]) by SA1PR11MB5801.namprd11.prod.outlook.com ([fe80::ba9b:b98b:c9f2:b32%7]) with mapi id 15.20.6565.026; Wed, 12 Jul 2023 02:02:36 +0000 From: "Isaac Oram" To: "devel@edk2.groups.io" , "Oram, Isaac W" , Arun K CC: "Desimone, Nathaniel L" , "Ramkumar Krishnamoorthi" , "Gao, Liming" Subject: Re: [edk2-devel][edk2-platforms][PATCH V4-1] IpmiFeaturePkg:Provided multiple IPMI interface support in PEI Thread-Topic: [edk2-devel][edk2-platforms][PATCH V4-1] IpmiFeaturePkg:Provided multiple IPMI interface support in PEI Thread-Index: AQHZrbyg8/Y91Qo2aEmVpv7ttENW8a+zmb2wgAHUftA= Date: Wed, 12 Jul 2023 02:02:36 +0000 Message-ID: References: <1770FB71B7C8638B.16575@groups.io> In-Reply-To: <1770FB71B7C8638B.16575@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-traffictypediagnostic: SA1PR11MB5801:EE_|DS0PR11MB7998:EE_ x-ms-office365-filtering-correlation-id: 87e201b8-fd53-4f75-88b3-08db827c1045 x-ld-processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: qPaht11JOivy14tr5A7OITvn456l9oPP5M580hqy1V5fz7JAfug1KERwafNoAcqWHPFIlJ9Evw2LtPg8fBW4Zsetg4Rd6jbK+nIAKLKkaQ8j7oei9GG+eNfY6U1/AGpXkq4LRre9fpiV6pU9CMbdaG5pCypnrkcyWK/0UTd6+G2ojNLAQX9oTgEtTyk3SMkRMODGJUZ/WE+y9OTth7bYDq6IgoCVrX2oY1oOnDqPtqxwJi+sGjhI0YwrYw9z6MjYwL5egyQc0JgHG5rWwHr9avKIxbkPIoYPerr9ekAertnMgjSuiwRdQjMTbXDMhccFl3DzKx5IJNEBg7j6xAFCkMNC7RiGe7lwbp6UcwR/u/B8Xl0l0gUCvWuRLkAXcTKpivjAslbPHSofJiW4PowCz0rwbS58k0iAAyPpNIdD/L+MElAFQAlwZTJ5DrLDTA2hfFCQBvATTsKlJJj+Xxss6PZ2erkjEtlxXqxvd/ud2TPfUMPhSgfZ5Ul4ovsry+JGcT6k4b5cHt1439f4kUtkrwWPj6WuwWBY/em3NJbJbUjJyWptKMibiTFNbdxYrNZwBLcKNspsIyTfyvos9pOqSVDsZZG9Kfek7LOOP5GLVhSUG1vrgNEFAzZk4omBM5AYthCch2SFTdbZ3udWxRBnRw== 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:(13230028)(366004)(376002)(396003)(136003)(346002)(39860400002)(451199021)(54906003)(66899021)(83380400001)(41300700001)(2906002)(30864003)(186003)(5660300002)(38100700002)(33656002)(82960400001)(26005)(52536014)(122000001)(40140700001)(66446008)(4326008)(8936002)(55016003)(6506007)(53546011)(66556008)(8676002)(64756008)(316002)(66476007)(110136005)(76116006)(66946007)(19627235002)(478600001)(71200400001)(38070700005)(966005)(86362001)(7696005)(9686003)(579004)(559001);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?d235PLqUTaDc24fV7lA5lhua7k+rpHgsINhLUfy8w7CplfAM8lcVru3UF0ju?= =?us-ascii?Q?tHNmO9Q38nM0P2F4wBN8oTEWKYtAdaUQPjDqnqM8UPMVUw7bzzwN99uAkmHq?= =?us-ascii?Q?R+fEDdJafgHGhj+dGIzmD7exdO695OIhdYMX4ywdb4729e52W/QT2KaI7CBu?= =?us-ascii?Q?bt81ODdsw32LbvAFXTSYInOHQPNbML9fTqpQlfp42rSxsnYrcDs6dycJ4D0k?= =?us-ascii?Q?HQegoHQrn1R1gb2z75SvYmZCiO1n86dKoU02u8P9CF0iGHgHzTQ6mRcvxSGN?= =?us-ascii?Q?qgv5FxC0DtrVFphA8jX/DKj32vjJnp2y9ir6LLsfiujIhKa+B53SyCvS9Son?= =?us-ascii?Q?wCMRLZhI+lodIckjnEqJAxOI4/j0Ndj3Uee6fYRRCpFQhx5q5isQYim8eTHl?= =?us-ascii?Q?BAUKn5X1reevoZQAFcRuF4WyH7IqlFOo+9as4q4jU91qpblPUuxR5XBg3wnV?= =?us-ascii?Q?3itWZU5io385yBmK70pB/Dbh3FYF8RglPWnfN+6+amk14HjC+kfUTEY//24D?= =?us-ascii?Q?l16qomxcunfaENuGqejOsDOrwvt+4Cuoewk6tbIOLUKN3onHnKIcdOyTevUw?= =?us-ascii?Q?LnLiHT0Wb5bEjUTQTl9sPdJ9qmNoeZ7Amxul5TgI9Dput8F0d+S6xeR9FmLt?= =?us-ascii?Q?HcPBFhwqsxbzE9dOYXRFA4uiedgn+4M1kBjn39uAut3EPhGUTb7Ww8pTwKX8?= =?us-ascii?Q?QQfg8kfycaY1al+l2bDaxHuBQhOSx1cSo/RvgbGZwzkdJIMuzMEh8MKXJKbG?= =?us-ascii?Q?gfOA6BMkI8cfyHNGknGKOxn5tCrAmat5/6r+5JepfhYQAt4cMiFQRBuGT8zL?= =?us-ascii?Q?hFoSRd3s9SpvzfhzMh8PWmjBKBTmP0trTHEZbTichf/Ju7MBq9pv/5naVeoo?= =?us-ascii?Q?OqNIoK74ZlxvWa2yBaeAGwzdc9sVrDcVmHoLb+C4DSszc8CS34g3t5BqcaX9?= =?us-ascii?Q?54jEMIs72Yeo1+13Z3bF32JmpjaUwnN2DxINwQQmy3ssUwawmZztUYMlOpL2?= =?us-ascii?Q?j+3Utb9zejbZeZZMRTdpyxzsf7ueGlVZjx3BjJ9VxiEPxv85p9nkBEOBmL0w?= =?us-ascii?Q?WSbrqeWZiGPwqamgvURfdozKQ1tXGvbaOoKNGGEbpVoT6DuEcpiVYO+hY7JT?= =?us-ascii?Q?UO6egFghApkTi7HAw2WnN76y8sMsG5q8LSLGqQwWGq/lL/aYnMpEr40KzcZW?= =?us-ascii?Q?P92hJ8f9wFUWmxjeHuWYGzLSlWvHT17wjZd1S1c0qGjukwbMd+uuP6X5h2n7?= =?us-ascii?Q?IB4oJShCu/Ya3KBZtUjm7D8BDKgIv9ck7PrdhmHhJHzptSjeBCoDWEJYdclf?= =?us-ascii?Q?ZHwX8fq6pIG97UAwMPJJmxYrUVr8d8Z/uNGwAqfe166YR4p0yT6nIV4chm3+?= =?us-ascii?Q?OZ0/aopgTHwqJXXir5HUhdZjy01xOMjpcRrNxa126ZpVnoiydSve27wrMPHR?= =?us-ascii?Q?EWT5aV3cNHLlH3ha4iOHaFMImOAJBa8NtdAKvzGamUzmQjjD8lEDQZk6GJqA?= =?us-ascii?Q?U4bABp7is6//bDjyBrSbk21k1oZH2F4/Z66B+x28xyZ+QZO509+Pl04cdE0Q?= =?us-ascii?Q?Yq3ciZ5747jrZqx45LvBiTqyt7KzhPYds5z7A7yB?= 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: 87e201b8-fd53-4f75-88b3-08db827c1045 X-MS-Exchange-CrossTenant-originalarrivaltime: 12 Jul 2023 02:02:36.3503 (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: XXERdVfh4di5ZNThr5jQSibItWgCfZE5okwfSlQD0LH1WyfGIN1JpacI3B8AShcCmAC3eOgeETuA+bY6rkWa1w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR11MB7998 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 I think the exception has something to do with gEfiPeiSmbus2PpiGuid. Regards, Isaac -----Original Message----- From: devel@edk2.groups.io On Behalf Of Isaac Oram Sent: Tuesday, July 11, 2023 6:45 PM To: Arun K ; devel@edk2.groups.io Cc: Desimone, Nathaniel L ; Ramkumar Krishn= amoorthi ; Gao, Liming Subject: Re: [edk2-devel][edk2-platforms][PATCH V4-1] IpmiFeaturePkg:Provid= ed multiple IPMI interface support in PEI Arun, My apologies that my feedback wasn't clear enough. I would like to avoid t= he preprocessor optimization step of using #if in favor of using C code and= using link time optimization to remove unused code. I sent you a patch wi= th examples of using the PCD in normal C logic. I don't think it is 100%, = but it should be clear on the concept. Regarding the logic you implemented for=20 gIpmiFeaturePkgTokenSpaceGuid.PcdKcsInterfaceSupport gIpmiFeaturePkgTokenSpaceGuid.PcdBtInterfaceSupport gIpmiFeaturePkgTokenSpaceGuid.PcdSsifInterfaceSupport gIpmiFeaturePkgTokenSpaceGuid.PcdIpmbInterfaceSupport I think that there might be too much dynamic conditional logic. Like case = statements that have #if around cases that should only happen if the interf= ace is present and enabled. I think it is better to simplify the code so t= hat the presence and use is enough. I sent you a patch that converts all e= xisting preprocessor (#if) logic to C logic. But it is better if you can r= emove some of that conditional logic. The more you can simplify the number= of build/test combinations, the better. What I mean specifically is if: #if (FixedPcdGet8 (PcdKcsInterfaceSupport) =3D=3D 1) if ((InterfaceType =3D=3D SysInterfaceKcs) && (IpmiInstance->IpmiTranspor= t2.Interface.KcsInterfaceState =3D=3D IpmiInterfaceInitialized))... Could be something like: if ((InterfaceType =3D=3D SysInterfaceKcs) && (IpmiInstance->IpmiTranspor= t2.Interface.KcsInterfaceState =3D=3D IpmiInterfaceInitialized))... Then that would be a little simpler and it doesn't initially look like we l= ose anything particularly valuable. It doesn't look like enough code to be= significant in a server use case. It doesn't seem like everything is working properly with PcdSsifInterfaceSu= pport enabled. In testing on WilsonCityRvp, I get an exception if it is en= abled. It might be a good idea to see if there is some more error checking= needed there. It might make sense that it isn't supported, but it should = be a more graceful failure. Please run python \edk2\BaseTools\Scripts\PatchCheck.py -3 on the changes a= nd correct the issues. Otherwise, the code looks good. Regards, Isaac -----Original Message----- From: Arun K =20 Sent: Monday, July 3, 2023 7:43 AM To: devel@edk2.groups.io; Arun K Cc: Oram, Isaac W ; Desimone, Nathaniel L ; Ramkumar Krishnamoorthi ; Gao, = Liming Subject: [edk2-devel][edk2-platforms][PATCH V4-1] IpmiFeaturePkg:Provided m= ultiple IPMI interface support in PEI Created IpmiTransport2 PPI/Protocol to support multiple IPMI BMC Interface = support such as KCS/BT/SSIF/IPMB with 2 API's IpmiSubmitCommand2 & IpmiSubmitCommand2Ex. IpmiSubmitCommand2 - This API use the default interface (PcdDefaultSystemInterface) to send IPMI command. IpmiSubmitCommand2Ex - This API use the specific interface type to send IPM= I command which is passed as an argument. Cc: Isaac Oram Cc: Nate DeSimone Cc: Liming Gao Signed-off-by: Arun K --- .../GenericIpmi/Pei/PeiGenericIpmi.c | 295 ++++++++++---- .../GenericIpmi/Pei/PeiGenericIpmi.h | 3 + .../GenericIpmi/Pei/PeiGenericIpmi.inf | 16 + .../GenericIpmi/Pei/PeiIpmiBmc.c | 117 +++--- .../GenericIpmi/Pei/PeiIpmiBmc.h | 11 +- .../GenericIpmi/Pei/PeiIpmiBmcDef.h | 86 +++-- .../GenericIpmi/Pei/PeiIpmiHooks.c | 363 ++++++++++++++++++ .../GenericIpmi/Pei/PeiIpmiHooks.h | 218 +++++++++++ 8 files changed, 949 insertions(+), 160 deletions(-) create mode 100644 F= eatures/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiHoo= ks.c create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Pei/PeiIpmiHooks.h diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Pei/PeiGenericIpmi.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Ge= nericIpmi/Pei/PeiGenericIpmi.c index e8b99b6900..04ebfb6f23 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/Pei= GenericIpmi.c +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/ +++ PeiGenericIpmi.c @@ -3,6 +3,7 @@ @copyright Copyright 2017 - 2021 Intel Corporation.
+ Copyright (c) 1985 - 2023, American Megatrends International LLC.=20 +
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -10,10 +11,143 @@ #include "PeiGenericIpmi.h" #include #include +#include //////////////////////////////////////////////////////////////////////////= ///// -// Function Implementations -// + +/** + Initialize the API and parameters for IPMI Transport2 Instance + + @param[in] IpmiInstance Pointer to IPMI Instance + + @return VOID + +**/ +VOID +InitIpmiTransport2 ( + IN PEI_IPMI_BMC_INSTANCE_DATA *IpmiInstance + ) +{ + IpmiInstance->IpmiTransport2Ppi.InterfaceType =3D FixedPcdGet8= (PcdDefaultSystemInterface); + IpmiInstance->IpmiTransport2Ppi.IpmiTransport2BmcStatus =3D=20 + BmcStatusOk; + IpmiInstance->IpmiTransport2Ppi.IpmiSubmitCommand2 =3D PeiIpmiSendC= ommand2; + IpmiInstance->IpmiTransport2Ppi.IpmiSubmitCommand2Ex =3D PeiIpmiSendC= ommand2Ex; + +#if (FixedPcdGet8 (PcdBtInterfaceSupport) =3D=3D 1) + if (!EFI_ERROR=20 + (PlatformIpmiIoRangeSet(FixedPcdGet16(PcdBtControlPort)))) { + InitBtInterfaceData (&IpmiInstance->IpmiTransport2Ppi); + } +#endif + +#if (FixedPcdGet8 (PcdSsifInterfaceSupport) =3D=3D 1) + InitSsifInterfaceData (&IpmiInstance->IpmiTransport2Ppi); +#endif + +#if (FixedPcdGet8 (PcdIpmbInterfaceSupport) =3D=3D 1) + InitIpmbInterfaceData (&IpmiInstance->IpmiTransport2Ppi); +#endif +} +/*++ + +Routine Description: + Notify callback function for interfaces. + +Arguments: + PeiServices - Describes the list of possible PEI Services. + NotifyDescriptor - Pointer to notify descriptor. + Ppi - Pointer to Ppi. + +Returns: + Status + +--*/ +EFI_STATUS +EFIAPI +NotifyCallback ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, + IN VOID *Ppi + ) +{ + EFI_STATUS Status; + PEI_IPMI_BMC_INSTANCE_DATA *IpmiInstance; + PEI_IPMI_DATA_HOB *IpmiInstancePtrHob; + EFI_HOB_GUID_TYPE *GuidHob; + IPMI_INTERFACE_STATE InterfaceState; + + InterfaceState =3D IpmiInterfaceNotReady; + + GuidHob =3D GetFirstGuidHob (&gPeiIpmiHobGuid); + ASSERT (GuidHob !=3D NULL); + if (GuidHob =3D=3D NULL) { + return EFI_NOT_FOUND; + } + + IpmiInstancePtrHob =3D (PEI_IPMI_DATA_HOB *)=20 + GET_GUID_HOB_DATA(GuidHob); + IpmiInstance =3D (PEI_IPMI_BMC_INSTANCE_DATA*) IpmiInstancePtrHob-= >IpmiInstance; + +#if (FixedPcdGet8 (PcdSsifInterfaceSupport) =3D=3D 1) + InitSsifInterfaceData(&IpmiInstance->IpmiTransport2Ppi); + + if (IpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState =3D=3D= =20 + IpmiInterfaceInitialized){ + InterfaceState =3D IpmiInterfaceInitialized; + } +#endif + +#if (FixedPcdGet8 (PcdIpmbInterfaceSupport) =3D=3D 1) + InitIpmbInterfaceData(&IpmiInstance->IpmiTransport2Ppi); + + if (IpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState =3D=3D= =20 + IpmiInterfaceInitialized){ + InterfaceState =3D IpmiInterfaceInitialized; + } +#endif + // Default Interface data should be initialized to install Ipmi Transpor= t2 Protocol. + if (InterfaceState !=3D IpmiInterfaceInitialized) { + return EFI_UNSUPPORTED; + } + + Status =3D PeiServicesInstallPpi (&IpmiInstance->PeiIpmi2BmcDataDesc); + return Status; +} +/*++ + +Routine Description: + Registers callback for Ppi. + +Arguments: + PeiServices - Describes the list of possible PEI Services. + PpiGuid - Pointer to Ppi guid to register call back. + +Returns: + Status + +--*/ +EFI_STATUS +RegisterPpiCallback ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN EFI_GUID *PpiGuid + ) +{ + EFI_STATUS Status; + EFI_PEI_NOTIFY_DESCRIPTOR *PpiNotifyDesc; + + if ((PpiGuid =3D=3D NULL) || + ((PpiGuid !=3D NULL) && IsZeroBuffer(PpiGuid, sizeof (EFI_GUID))))= =20 + { + return EFI_INVALID_PARAMETER; + } + + PpiNotifyDesc =3D (EFI_PEI_NOTIFY_DESCRIPTOR*) AllocateZeroPool (sizeof= =20 + (EFI_PEI_NOTIFY_DESCRIPTOR)); + if (PpiNotifyDesc =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + + PpiNotifyDesc->Flags =3D EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK |=20 + EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; + PpiNotifyDesc->Guid =3D PpiGuid; + PpiNotifyDesc->Notify =3D NotifyCallback; + + Status =3D (*PeiServices)->NotifyPpi (PeiServices, PpiNotifyDesc); + return Status; +} /*************************************************************************= **** @brief @@ -31,8 +165,12 @@ PeiInitializeIpmiKcsPhysicalLayer ( { EFI_STATUS Status; PEI_IPMI_BMC_INSTANCE_DATA *mIpmiInstance; + PEI_IPMI_DATA_HOB *IpmiInstancePtrHob; + IPMI_INTERFACE_STATE InterfaceState; + UINT8 Index; - mIpmiInstance =3D NULL; + mIpmiInstance =3D NULL; + InterfaceState =3D IpmiInterfaceNotReady; // // Send Pre-Boot signal to BMC @@ -60,6 +198,18 @@ PeiInitializeIpmiKcsPhysicalLayer ( return EFI_OUT_OF_RESOURCES; } + + // Create Guided hob to pass IPMI Instance data pointer to notify functi= ons. + IpmiInstancePtrHob =3D BuildGuidHob (&gPeiIpmiHobGuid,=20 + sizeof(PEI_IPMI_DATA_HOB)); + if (IpmiInstancePtrHob =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "Failed to create Hob guid for IPMI=20 + Instance!!!\n")); + FreePool (mIpmiInstance); + return EFI_OUT_OF_RESOURCES; + } + + IpmiInstancePtrHob->IpmiInstance =3D (UINTN)mIpmiInstance; + IpmiInstancePtrHob->PreMemIpmiDataHobPtr =3D IpmiInstancePtrHob; + // // Calibrate TSC Counter. Stall for 10ms, then multiply the resulting n= umber of // ticks in that period by 100 to get the number of ticks in a 1 second = timeout @@ -83,6 +233,7 @@ PeiInitializeIpmiKcsPhysicalLayer ( mIpmiInstance->PeiIpmiBmcDataDesc.Guid =3D &gPeiIpmiTransportPp= iGuid; mIpmiInstance->PeiIpmiBmcDataDesc.Ppi =3D &mIpmiInstance->Ipmi= TransportPpi; +#if (FixedPcdGet8 (PcdKcsInterfaceSupport) =3D=3D 1) // // Get the Device ID and check if the system is in Force Update mode. // @@ -94,19 +245,85 @@ PeiInitializeIpmiKcsPhysicalLayer ( // // Do not continue initialization if the BMC is in Force Update Mode. // - if (mIpmiInstance->BmcStatus =3D=3D BMC_UPDATE_IN_PROGRESS || mIpmiInsta= nce->BmcStatus =3D=3D BMC_HARDFAIL) { - return EFI_UNSUPPORTED; + if (mIpmiInstance->BmcStatus !=3D BMC_UPDATE_IN_PROGRESS &&=20 + mIpmiInstance->BmcStatus !=3D BMC_HARDFAIL) { + Status =3D PeiServicesInstallPpi=20 + (&mIpmiInstance->PeiIpmiBmcDataDesc); + if (EFI_ERROR (Status)) { + return Status; + } + } +#endif + + InitIpmiTransport2(mIpmiInstance); + + // Check interface data initialized successfully else register notify pr= otocol. + for (Index =3D SysInterfaceKcs; Index < SysInterfaceMax; Index++) { + + switch (Index) { + +#if (FixedPcdGet8 (PcdKcsInterfaceSupport) =3D=3D 1) + case SysInterfaceKcs: + if ((mIpmiInstance->BmcStatus !=3D BMC_HARDFAIL) &&=20 + (mIpmiInstance->BmcStatus !=3D BMC_UPDATE_IN_PROGRESS)) { + BMC_INTERFACE_STATUS BmcStatus; + =20 + mIpmiInstance->IpmiTransport2Ppi.Interface.KcsInterfaceState =3D=20 + IpmiInterfaceInitialized; + Status =3D CheckSelfTestByInterfaceType( + =20 + &mIpmiInstance->IpmiTransport2Ppi, + &BmcStatus, + SysInterfaceKcs); + if (!EFI_ERROR (Status) && (BmcStatus !=3D=20 + BmcStatusHardFail)) { + InterfaceState =3D IpmiInterfaceInitialized; + } else { + =20 + mIpmiInstance->IpmiTransport2Ppi.Interface.KcsInterfaceState =3D=20 + IpmiInterfaceInitError; + } + } + break; +#endif + +#if (FixedPcdGet8 (PcdBtInterfaceSupport) =3D=3D 1) + case SysInterfaceBt: + if=20 + (mIpmiInstance->IpmiTransport2Ppi.Interface.Bt.InterfaceState =3D=3D=20 + IpmiInterfaceInitialized){ + InterfaceState =3D IpmiInterfaceInitialized; + } + break; +#endif + +#if (FixedPcdGet8 (PcdSsifInterfaceSupport) =3D=3D 1) + case SysInterfaceSsif: + if=20 + (mIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState =3D=3D=20 + IpmiInterfaceInitialized){ + InterfaceState =3D IpmiInterfaceInitialized; + } else if=20 + (mIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState =3D=3D=20 + IpmiInterfaceInitError) { + // Register protocol notify for SMBUS Protocol. + Status =3D RegisterPpiCallback (PeiServices,=20 + &mIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.SsifInterfaceApiGuid) + ; + } + break; +#endif + +#if (FixedPcdGet8 (PcdIpmbInterfaceSupport) =3D=3D 1) + case SysInterfaceIpmb: + if=20 + (mIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState =3D=3D=20 + IpmiInterfaceInitialized){ + InterfaceState =3D IpmiInterfaceInitialized; + } else if=20 + (mIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState =3D=3D=20 + IpmiInterfaceInitError) { + // Register protocol notify for SMBUS Protocol. + Status =3D RegisterPpiCallback (PeiServices,=20 + &mIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.IpmbInterfaceApiGuid) + ; + } + break; +#endif + default: + break; + } } - // - // Just produce PPI - // - Status =3D PeiServicesInstallPpi (&mIpmiInstance->PeiIpmiBmcDataDesc); - if (EFI_ERROR (Status)) { - return Status; + // Any one of the Interface data should be initialized to install Ipmi T= ransport2 Protocol. + if (InterfaceState !=3D IpmiInterfaceInitialized) { + DEBUG ((DEBUG_INFO, "Interface not ready yet. \n")); + return EFI_SUCCESS; } - return EFI_SUCCESS; + mIpmiInstance->PeiIpmi2BmcDataDesc.Flags =3D=20 + EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; + mIpmiInstance->PeiIpmi2BmcDataDesc.Guid =3D &gPeiIpmiTransport2PpiGuid= ; + mIpmiInstance->PeiIpmi2BmcDataDesc.Ppi =3D &mIpmiInstance->IpmiTransp= ort2Ppi; + + Status =3D PeiServicesInstallPpi (&mIpmiInstance->PeiIpmi2BmcDataDesc); + return Status; } /*************************************************************************= **** @@ -176,60 +393,6 @@ PeimIpmiInterfaceInit ( } // PeimIpmiInterfaceInit() -EFI_STATUS -PeiIpmiSendCommand ( - IN PEI_IPMI_TRANSPORT_PPI *This, - IN UINT8 NetFunction, - IN UINT8 Lun, - IN UINT8 Command, - IN UINT8 *CommandData, - IN UINT32 CommandDataSize, - IN OUT UINT8 *ResponseData, - IN OUT UINT32 *ResponseDataSize - ) -/*++ - -Routine Description: - - Send Ipmi Command in the right mode: HECI or KCS, to the - appropiate device, ME or BMC. - -Arguments: - - This - Pointer to IPMI protocol instance - NetFunction - Net Function of command to send - Lun - LUN of command to send - Command - IPMI command to send - CommandData - Pointer to command data buffer, if needed - CommandDataSize - Size of command data buffer - ResponseData - Pointer to response data buffer - ResponseDataSize - Pointer to response data buffer size - -Returns: - - EFI_INVALID_PARAMETER - One of the input values is bad - EFI_DEVICE_ERROR - IPMI command failed - EFI_BUFFER_TOO_SMALL - Response buffer is too small - EFI_UNSUPPORTED - Command is not supported by BMC - EFI_SUCCESS - Command completed successfully - ---*/ -{ - // - // This Will be unchanged ( BMC/KCS style ) - // - return PeiIpmiSendCommandToBmc ( - This, - NetFunction, - Lun, - Command, - CommandData, - (UINT8) CommandDataSize, - ResponseData, - (UINT8 *) ResponseDataSize, - NULL - ); -} // IpmiSendCommand() EFI_STATUS PeiGetIpmiBmcStatus ( diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Pei/PeiGenericIpmi.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Ge= nericIpmi/Pei/PeiGenericIpmi.h index d31af85325..59b26b6c86 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/Pei= GenericIpmi.h +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/ +++ PeiGenericIpmi.h @@ -3,6 +3,7 @@ @copyright Copyright 2017 - 2021 Intel Corporation.
+ Copyright (c) 1985 - 2023, American Megatrends International LLC.=20 +
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -23,7 +24,9 @@ #include #include #include +#include +#include "PeiIpmiHooks.h" #include "PeiIpmiBmcDef.h" #include "PeiIpmiBmc.h" diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Pei/PeiGenericIpmi.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/= GenericIpmi/Pei/PeiGenericIpmi.inf index a646161ce1..555b2e5e6c 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/Pei= GenericIpmi.inf +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/ +++ PeiGenericIpmi.inf @@ -3,6 +3,7 @@ # # @copyright # Copyright 2017 - 2021 Intel Corporation.
+# Copyright (c) 1985 - 2023, American Megatrends International LLC.=20 +
# SPDX-License-Identifier: BSD-2-Clause-Patent ## @@ -30,6 +31,8 @@ PeiIpmiBmcDef.h PeiGenericIpmi.c PeiGenericIpmi.h + PeiIpmiHooks.c + PeiIpmiHooks.h [Packages] MdePkg/MdePkg.dec @@ -44,17 +47,30 @@ ReportStatusCodeLib TimerLib IpmiPlatformHookLib + HobLib + BmcCommonInterfaceLib + BtInterfaceLib + SsifInterfaceLib + IpmbInterfaceLib [Guids] + gPeiIpmiHobGuid [Ppis] gPeiIpmiTransportPpiGuid #ALWAYS PRODUCE + gPeiIpmiTransport2PpiGuid [Pcd] gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiIoBaseAddress gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiBmcReadyDelayTimer gIpmiFeaturePkgTokenSpaceGuid.PcdSioMailboxBaseAddress gIpmiFeaturePkgTokenSpaceGuid.PcdSignalPreBootToBmc + gIpmiFeaturePkgTokenSpaceGuid.PcdDefaultSystemInterface + gIpmiFeaturePkgTokenSpaceGuid.PcdBtInterfaceSupport + gIpmiFeaturePkgTokenSpaceGuid.PcdSsifInterfaceSupport + gIpmiFeaturePkgTokenSpaceGuid.PcdKcsInterfaceSupport + gIpmiFeaturePkgTokenSpaceGuid.PcdIpmbInterfaceSupport + gIpmiFeaturePkgTokenSpaceGuid.PcdBtControlPort [Depex] TRUE diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Pei/PeiIpmiBmc.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Generi= cIpmi/Pei/PeiIpmiBmc.c index dbe25421ae..01901764a9 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/Pei= IpmiBmc.c +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/ +++ PeiIpmiBmc.c @@ -3,6 +3,7 @@ @copyright Copyright 2016 - 2021 Intel Corporation.
+ Copyright (c) 1985 - 2023, American Megatrends International LLC.=20 +
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -10,9 +11,10 @@ EFI_STATUS UpdateErrorStatus ( - IN UINT8 BmcError, - PEI_IPMI_BMC_INSTANCE_DATA *IpmiInstance + IN UINT8 BmcError, + PEI_IPMI_BMC_INSTANCE_DATA *IpmiInstance ) + /*++ Routine Description: @@ -55,16 +57,17 @@ Returns: EFI_STATUS PeiIpmiSendCommandToBmc ( - IN PEI_IPMI_TRANSPORT_PPI *This, - IN UINT8 NetFunction, - IN UINT8 Lun, - IN UINT8 Command, - IN UINT8 *CommandData, - IN UINT8 CommandDataSize, - IN OUT UINT8 *ResponseData, - IN OUT UINT8 *ResponseDataSize, - IN VOID *Context + IN PEI_IPMI_TRANSPORT_PPI *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT8 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT8 *ResponseDataSize, + IN VOID *Context ) + /*++ Routine Description: @@ -108,15 +111,15 @@ Returns: // response data. Since the command format is different from the respon= se // format, the buffer is cast to both structure definitions. // - IpmiCommand =3D (IPMI_COMMAND*) TempData; - IpmiResponse =3D (IPMI_RESPONSE*) TempData; + IpmiCommand =3D (IPMI_COMMAND *)TempData; + IpmiResponse =3D (IPMI_RESPONSE *)TempData; // // Send IPMI command to BMC // - IpmiCommand->Lun =3D Lun; - IpmiCommand->NetFunction =3D NetFunction; - IpmiCommand->Command =3D Command; + IpmiCommand->Lun =3D Lun; + IpmiCommand->NetFunction =3D NetFunction; + IpmiCommand->Command =3D Command; // // Ensure that the buffer is valid before attempting to copy the command= data @@ -128,19 +131,19 @@ Returns: } CopyMem ( - IpmiCommand->CommandData, - CommandData, - CommandDataSize - ); + IpmiCommand->CommandData, + CommandData, + CommandDataSize + ); } Status =3D SendDataToBmcPort ( - IpmiInstance->KcsTimeoutPeriod, - IpmiInstance->IpmiIoBase, - Context, - (UINT8 *) IpmiCommand, - (CommandDataSize + IPMI_COMMAND_HEADER_SIZE) - ); + IpmiInstance->KcsTimeoutPeriod, + IpmiInstance->IpmiIoBase, + Context, + (UINT8 *)IpmiCommand, + (CommandDataSize +=20 + IPMI_COMMAND_HEADER_SIZE) + ); if (Status !=3D EFI_SUCCESS) { IpmiInstance->BmcStatus =3D BMC_SOFTFAIL; @@ -153,13 +156,13 @@ Returns: // Get Response to IPMI Command from BMC. // DataSize =3D MAX_TEMP_DATA; - Status =3D ReceiveBmcDataFromPort ( - IpmiInstance->KcsTimeoutPeriod, - IpmiInstance->IpmiIoBase, - Context, - (UINT8 *) IpmiResponse, - &DataSize - ); + Status =3D ReceiveBmcDataFromPort ( + IpmiInstance->KcsTimeoutPeriod, + IpmiInstance->IpmiIoBase, + Context, + (UINT8 *)IpmiResponse, + &DataSize + ); if (Status !=3D EFI_SUCCESS) { IpmiInstance->BmcStatus =3D BMC_SOFTFAIL; @@ -169,15 +172,16 @@ Returns: } if ((IpmiResponse->CompletionCode !=3D COMP_CODE_NORMAL) && - (IpmiInstance->BmcStatus =3D=3D BMC_UPDATE_IN_PROGRESS)) { + (IpmiInstance->BmcStatus =3D=3D BMC_UPDATE_IN_PROGRESS)) + { // // If the completion code is not normal and the BMC is in Force Update // mode, then update the error status and return EFI_UNSUPPORTED. // UpdateErrorStatus ( - IpmiResponse->CompletionCode, - IpmiInstance - ); + IpmiResponse->CompletionCode, + IpmiInstance + ); return EFI_UNSUPPORTED; } else if (IpmiResponse->CompletionCode !=3D COMP_CODE_NORMAL) { // @@ -185,9 +189,9 @@ Returns: // is not normal, then update the error status and return device error= . // UpdateErrorStatus ( - IpmiResponse->CompletionCode, - IpmiInstance - ); + IpmiResponse->CompletionCode, + IpmiInstance + ); return EFI_DEVICE_ERROR; } @@ -215,32 +219,33 @@ Returns: // *ResponseDataSize =3D DataSize - IPMI_RESPONSE_HEADER_SIZE; CopyMem ( - ResponseData, - IpmiResponse->ResponseData, - *ResponseDataSize - ); + ResponseData, + IpmiResponse->ResponseData, + *ResponseDataSize + ); // // Add completion code in response data to meet the requirement of IPMI = spec 2.0 // *ResponseDataSize +=3D 1; // Add one byte for Completion Code for (Index =3D 1; Index < *ResponseDataSize; Index++) { - ResponseData [*ResponseDataSize - Index] =3D ResponseData [*ResponseDa= taSize - (Index + 1)]; + ResponseData[*ResponseDataSize - Index] =3D=20 + ResponseData[*ResponseDataSize - (Index + 1)]; } - ResponseData [0] =3D IpmiResponse->CompletionCode; + + ResponseData[0] =3D IpmiResponse->CompletionCode; IpmiInstance->BmcStatus =3D BMC_OK; return EFI_SUCCESS; } - EFI_STATUS -PeiIpmiBmcStatus ( - IN PEI_IPMI_TRANSPORT_PPI *This, - OUT BMC_STATUS *BmcStatus, - OUT SM_COM_ADDRESS *ComAddress, - IN VOID *Context +IpmiBmcStatus ( + IN PEI_IPMI_TRANSPORT_PPI *This, + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress, + IN VOID *Context ) + /*++ Routine Description: @@ -268,10 +273,10 @@ Returns: IpmiInstance->BmcStatus =3D BMC_HARDFAIL; } - *BmcStatus =3D IpmiInstance->BmcStatus; - ComAddress->ChannelType =3D SmBmc; - ComAddress->Address.BmcAddress.LunAddress =3D 0x0; - ComAddress->Address.BmcAddress.SlaveAddress =3D IpmiInstance->SlaveAddre= ss; + *BmcStatus =3D IpmiInstance->BmcStatu= s; + ComAddress->ChannelType =3D SmBmc; + ComAddress->Address.BmcAddress.LunAddress =3D 0x0; + ComAddress->Address.BmcAddress.SlaveAddress =3D IpmiInstance->SlaveAdd= ress; ComAddress->Address.BmcAddress.ChannelAddress =3D 0x0; return EFI_SUCCESS; diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Pei/PeiIpmiBmc.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Generi= cIpmi/Pei/PeiIpmiBmc.h index 40b9429e84..5f61ae6ccc 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/Pei= IpmiBmc.h +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/ +++ PeiIpmiBmc.h @@ -3,6 +3,7 @@ @copyright Copyright 2016 - 2021 Intel Corporation.
+ Copyright (c) 1985 - 2023, American Megatrends International LLC.=20 +
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -25,7 +26,7 @@ // // IPMI Instance signature // -#define SM_IPMI_BMC_SIGNATURE SIGNATURE_32 ('i', 'p', 'm', 'i') +#define SM_IPMI_BMC_SIGNATURE SIGNATURE_32 ('i', 'p', 'm', 'i') #define INSTANCE_FROM_PEI_SM_IPMI_BMC_THIS(a) \ CR ( \ @@ -35,4 +36,12 @@ SM_IPMI_BMC_SIGNATURE \ ) +#define INSTANCE_FROM_PEI_IPMI_TRANSPORT2_THIS(a) \ + CR ( \ + a, \ + PEI_IPMI_BMC_INSTANCE_DATA, \ + IpmiTransport2Ppi, \ + SM_IPMI_BMC_SIGNATURE \ + ) + #endif // _PEI_IPMI_BMC_H_ diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Pei/PeiIpmiBmcDef.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gen= ericIpmi/Pei/PeiIpmiBmcDef.h index fc9fbacf1a..db29fa7fdc 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/Pei= IpmiBmcDef.h +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/ +++ PeiIpmiBmcDef.h @@ -3,6 +3,7 @@ @copyright Copyright 2016 - 2021 Intel Corporation.
+ Copyright (c) 1985 - 2023, American Megatrends International LLC.=20 +
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -10,11 +11,13 @@ #define _PEI_IPMI_COMMON_BMC_H_ #include +#include +#include "ServerManagement.h" -#define MAX_TEMP_DATA 160 -#define BMC_SLAVE_ADDRESS 0x20 -#define MAX_SOFT_COUNT 10 -#define COMP_CODE_NORMAL 0x00 +#define MAX_TEMP_DATA 160 +#define BMC_SLAVE_ADDRESS 0x20 +#define MAX_SOFT_COUNT 10 +#define COMP_CODE_NORMAL 0x00 // // IPMI command completion codes to check for in the UpdateErrorStatus rou= tine. @@ -46,15 +49,17 @@ // Pei Ipmi instance data // typedef struct { - UINTN Signature; - UINT64 KcsTimeoutPeriod; - UINT8 SlaveAddress; - BMC_STATUS BmcStatus; - UINT64 ErrorStatus; - UINT8 SoftErrorCount; - UINT16 IpmiIoBase; - PEI_IPMI_TRANSPORT_PPI IpmiTransportPpi; - EFI_PEI_PPI_DESCRIPTOR PeiIpmiBmcDataDesc; + UINTN Signature; + UINT64 KcsTimeoutPeriod; + UINT8 SlaveAddress; + BMC_STATUS BmcStatus; + UINT64 ErrorStatus; + UINT8 SoftErrorCount; + UINT16 IpmiIoBase; + PEI_IPMI_TRANSPORT_PPI IpmiTransportPpi; + IPMI_TRANSPORT2 IpmiTransport2Ppi; + EFI_PEI_PPI_DESCRIPTOR PeiIpmiBmcDataDesc; + EFI_PEI_PPI_DESCRIPTOR PeiIpmi2BmcDataDesc; } PEI_IPMI_BMC_INSTANCE_DATA; // @@ -63,38 +68,39 @@ typedef struct { #define IPMI_COMMAND_HEADER_SIZE 2 typedef struct { - UINT8 Lun : 2; - UINT8 NetFunction : 6; - UINT8 Command; - UINT8 CommandData[MAX_TEMP_DATA - IPMI_COMMAND_HEADER_SIZE]; + UINT8 Lun : 2; + UINT8 NetFunction : 6; + UINT8 Command; + UINT8 CommandData[MAX_TEMP_DATA - IPMI_COMMAND_HEADER_SIZE]; } IPMI_COMMAND; // // Structure of IPMI Command response buffer // -#define IPMI_RESPONSE_HEADER_SIZE 3 +#define IPMI_RESPONSE_HEADER_SIZE 3 typedef struct { - UINT8 Lun : 2; - UINT8 NetFunction : 6; - UINT8 Command; - UINT8 CompletionCode; - UINT8 ResponseData[MAX_TEMP_DATA - IPMI_RESPONSE_HEADER_SIZE]; + UINT8 Lun : 2; + UINT8 NetFunction : 6; + UINT8 Command; + UINT8 CompletionCode; + UINT8 ResponseData[MAX_TEMP_DATA - IPMI_RESPONSE_HEADER_SIZE]; } IPMI_RESPONSE; #pragma pack() EFI_STATUS PeiIpmiSendCommandToBmc ( - IN PEI_IPMI_TRANSPORT_PPI *This, - IN UINT8 NetFunction, - IN UINT8 Lun, - IN UINT8 Command, - IN UINT8 *CommandData, - IN UINT8 CommandDataSize, - IN OUT UINT8 *ResponseData, - IN OUT UINT8 *ResponseDataSize, - IN VOID *Context + IN PEI_IPMI_TRANSPORT_PPI *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT8 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT8 *ResponseDataSize, + IN VOID *Context ) + /*++ Routine Description: @@ -123,14 +129,14 @@ Returns: --*/ ; - EFI_STATUS PeiIpmiBmcStatus ( - IN PEI_IPMI_TRANSPORT_PPI *This, - OUT BMC_STATUS *BmcStatus, - OUT SM_COM_ADDRESS *ComAddress, - IN VOID *Context + IN PEI_IPMI_TRANSPORT_PPI *This, + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress, + IN VOID *Context ) + /*++ Routine Description: @@ -151,5 +157,11 @@ Returns: --*/ ; +typedef struct _PEI_IPMI_DATA_HOB PEI_IPMI_DATA_HOB; + +struct _PEI_IPMI_DATA_HOB { + UINTN IpmiInstance; /// IpmiInstance po= inter. + PEI_IPMI_DATA_HOB *PreMemIpmiDataHobPtr; ///< HOB Data point= er before Memory discovered +}; #endif //_PEI_IPMI_COMMON_BMC_H_ diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Pei/PeiIpmiHooks.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gene= ricIpmi/Pei/PeiIpmiHooks.c new file mode 100644 index 0000000000..947287aa56 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/ +++ PeiIpmiHooks.c @@ -0,0 +1,363 @@ +/** @file + IPMI common hook functions + + @copyright + Copyright 1999 - 2021 Intel Corporation.
+ Copyright (c) 1985 - 2023, American Megatrends International LLC.=20 +
+ SPDX-License-Identifier: BSD-2-Clause-Patent **/ + +#include +#include + +EFI_STATUS +PeiIpmiSendCommand ( + IN PEI_IPMI_TRANSPORT_PPI *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ) + +/*++ + +Routine Description: + + Send Ipmi Command in the right mode: HECI or KCS, to the appropiate=20 + device, ME or BMC. + +Arguments: + + This - Pointer to IPMI protocol instance + NetFunction - Net Function of command to send + Lun - LUN of command to send + Command - IPMI command to send + CommandData - Pointer to command data buffer, if needed + CommandDataSize - Size of command data buffer + ResponseData - Pointer to response data buffer + ResponseDataSize - Pointer to response data buffer size + +Returns: + + EFI_INVALID_PARAMETER - One of the input values is bad + EFI_DEVICE_ERROR - IPMI command failed + EFI_BUFFER_TOO_SMALL - Response buffer is too small + EFI_UNSUPPORTED - Command is not supported by BMC + EFI_SUCCESS - Command completed successfully + +--*/ +{ + if (This =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + + // + // This Will be unchanged ( BMC/KCS style ) + // + return PeiIpmiSendCommandToBmc ( + This, + NetFunction, + Lun, + Command, + CommandData, + (UINT8)CommandDataSize, + ResponseData, + (UINT8 *)ResponseDataSize, + NULL + ); +} // IpmiSendCommand() + +EFI_STATUS +PeiIpmiSendCommand2 ( + IN IPMI_TRANSPORT2 *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ) + +/*++ + +Routine Description: + + This API use the default interface (PcdDefaultSystemInterface) to=20 + send IPMI command in the right mode to the appropiate device, ME or BMC. + +Arguments: + + This - Pointer to IPMI protocol instance + NetFunction - Net Function of command to send + Lun - LUN of command to send + Command - IPMI command to send + CommandData - Pointer to command data buffer, if needed + CommandDataSize - Size of command data buffer + ResponseData - Pointer to response data buffer + ResponseDataSize - Pointer to response data buffer size + +Returns: + + EFI_INVALID_PARAMETER - One of the input values is bad + EFI_DEVICE_ERROR - IPMI command failed + EFI_BUFFER_TOO_SMALL - Response buffer is too small + EFI_UNSUPPORTED - Command is not supported by BMC + EFI_SUCCESS - Command completed successfully + +--*/ +{ + PEI_IPMI_BMC_INSTANCE_DATA *PeiIpmiInstance; + + if (This =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + + PeiIpmiInstance =3D INSTANCE_FROM_PEI_IPMI_TRANSPORT2_THIS (This); + + #if (FixedPcdGet8 (PcdKcsInterfaceSupport) =3D=3D 1) if=20 + ((PeiIpmiInstance->IpmiTransport2Ppi.InterfaceType =3D=3D SysInterfaceKcs= ) && + (PeiIpmiInstance->IpmiTransport2Ppi.Interface.KcsInterfaceState=20 + =3D=3D IpmiInterfaceInitialized)) { + return PeiIpmiSendCommand ( + &PeiIpmiInstance->IpmiTransportPpi, + NetFunction, + Lun, + Command, + CommandData, + CommandDataSize, + ResponseData, + ResponseDataSize + ); + } + + #endif + + #if (FixedPcdGet8 (PcdBtInterfaceSupport) =3D=3D 1) if=20 + ((PeiIpmiInstance->IpmiTransport2Ppi.InterfaceType =3D=3D SysInterfaceBt)= && + (PeiIpmiInstance->IpmiTransport2Ppi.Interface.Bt.InterfaceState=20 + =3D=3D IpmiInterfaceInitialized)) { + return IpmiBtSendCommandToBmc ( + &PeiIpmiInstance->IpmiTransport2Ppi, + NetFunction, + Lun, + Command, + CommandData, + (UINT8)CommandDataSize, + ResponseData, + (UINT8 *)ResponseDataSize, + NULL + ); + } + + #endif + + #if (FixedPcdGet8 (PcdSsifInterfaceSupport) =3D=3D 1) if=20 + ((PeiIpmiInstance->IpmiTransport2Ppi.InterfaceType =3D=3D SysInterfaceSsi= f) && + (PeiIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState=20 + =3D=3D IpmiInterfaceInitialized)) { + return IpmiSsifSendCommandToBmc ( + &PeiIpmiInstance->IpmiTransport2Ppi, + NetFunction, + Lun, + Command, + CommandData, + (UINT8)CommandDataSize, + ResponseData, + (UINT8 *)ResponseDataSize, + NULL + ); } + + #endif + + #if (FixedPcdGet8 (PcdIpmbInterfaceSupport) =3D=3D 1) if=20 + ((PeiIpmiInstance->IpmiTransport2Ppi.InterfaceType =3D=3D SysInterfaceIpm= b) && + (PeiIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState=20 + =3D=3D IpmiInterfaceInitialized)) { + return IpmiIpmbSendCommandToBmc ( + &PeiIpmiInstance->IpmiTransport2Ppi, + NetFunction, + Lun, + Command, + CommandData, + (UINT8)CommandDataSize, + ResponseData, + (UINT8 *)ResponseDataSize, + NULL + ); } + + #endif + return EFI_UNSUPPORTED; +} // IpmiSendCommand() + +EFI_STATUS +PeiIpmiSendCommand2Ex ( + IN IPMI_TRANSPORT2 *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize, + IN SYSTEM_INTERFACE_TYPE InterfaceType + ) +{ + /*++ + Routine Description: + + This API use the specific interface type to send IPMI command + in the right mode to the appropiate device, ME or BMC. + + Arguments: + + This - Pointer to IPMI protocol instance + NetFunction - Net Function of command to send + Lun - LUN of command to send + Command - IPMI command to send + CommandData - Pointer to command data buffer, if needed + CommandDataSize - Size of command data buffer + ResponseData - Pointer to response data buffer + ResponseDataSize - Pointer to response data buffer size + InterfaceType - BMC Interface type. + + Returns: + + EFI_INVALID_PARAMETER - One of the input values is bad + EFI_DEVICE_ERROR - IPMI command failed + EFI_BUFFER_TOO_SMALL - Response buffer is too small + EFI_UNSUPPORTED - Command is not supported by BMC + EFI_SUCCESS - Command completed successfully + + --*/ + + PEI_IPMI_BMC_INSTANCE_DATA *PeiIpmiInstance; + + if (This =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + + PeiIpmiInstance =3D INSTANCE_FROM_PEI_IPMI_TRANSPORT2_THIS (This); + + #if (FixedPcdGet8 (PcdKcsInterfaceSupport) =3D=3D 1) if ((InterfaceType= =20 + =3D=3D SysInterfaceKcs) && + (PeiIpmiInstance->IpmiTransport2Ppi.Interface.KcsInterfaceState=20 + =3D=3D IpmiInterfaceInitialized)) { + return PeiIpmiSendCommand ( + &PeiIpmiInstance->IpmiTransportPpi, + NetFunction, + Lun, + Command, + CommandData, + CommandDataSize, + ResponseData, + ResponseDataSize + ); + } + + #endif + + #if (FixedPcdGet8 (PcdBtInterfaceSupport) =3D=3D 1) + + if ((InterfaceType =3D=3D SysInterfaceBt) && + (PeiIpmiInstance->IpmiTransport2Ppi.Interface.Bt.InterfaceState=20 + =3D=3D IpmiInterfaceInitialized)) { + return IpmiBtSendCommandToBmc ( + &PeiIpmiInstance->IpmiTransport2Ppi, + NetFunction, + Lun, + Command, + CommandData, + (UINT8)CommandDataSize, + ResponseData, + (UINT8 *)ResponseDataSize, + NULL + ); + } + + #endif + + #if (FixedPcdGet8 (PcdSsifInterfaceSupport) =3D=3D 1) + + if ((InterfaceType =3D=3D SysInterfaceSsif) && + (PeiIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState=20 + =3D=3D IpmiInterfaceInitialized)) { + return IpmiSsifSendCommandToBmc ( + &PeiIpmiInstance->IpmiTransport2Ppi, + NetFunction, + Lun, + Command, + CommandData, + (UINT8)CommandDataSize, + ResponseData, + (UINT8 *)ResponseDataSize, + NULL + ); } + + #endif + + #if (FixedPcdGet8 (PcdIpmbInterfaceSupport) =3D=3D 1) if ((InterfaceType= =20 + =3D=3D SysInterfaceIpmb) && + (PeiIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState=20 + =3D=3D IpmiInterfaceInitialized)) { + return IpmiIpmbSendCommandToBmc ( + &PeiIpmiInstance->IpmiTransport2Ppi, + NetFunction, + Lun, + Command, + CommandData, + (UINT8)CommandDataSize, + ResponseData, + (UINT8 *)ResponseDataSize, + NULL + ); } + + #endif + + return EFI_UNSUPPORTED; +} + +EFI_STATUS +PeiIpmiBmcStatus ( + IN PEI_IPMI_TRANSPORT_PPI *This, + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress, + IN VOID *Context + ) + +/*++ + +Routine Description: + + Updates the BMC status and returns the Com Address + +Arguments: + + This - Pointer to IPMI protocol instance + BmcStatus - BMC status + ComAddress - Com Address + +Returns: + + EFI_SUCCESS - Success + +--*/ +{ + if ((This =3D=3D NULL) || (BmcStatus =3D=3D NULL) || (ComAddress =3D=3D = NULL)) { + return EFI_INVALID_PARAMETER; + } + + return IpmiBmcStatus ( + This, + BmcStatus, + ComAddress, + NULL + ); +} diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Pei/PeiIpmiHooks.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gene= ricIpmi/Pei/PeiIpmiHooks.h new file mode 100644 index 0000000000..25be1fd94a --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/ +++ PeiIpmiHooks.h @@ -0,0 +1,218 @@ +/** @file + IPMI common hook functions head file + + @copyright + Copyright 2016 - 2021 Intel Corporation.
+ Copyright (c) 1985 - 2023, American Megatrends International LLC.=20 +
+ SPDX-License-Identifier: BSD-2-Clause-Patent **/ + +#ifndef _IPMI_HOOKS_H +#define _IPMI_HOOKS_H + +#include +#include +#include +#include +#include +#include +#include + +// +// Internal(hook) function list +// + +EFI_STATUS +PeiIpmiSendCommand ( + IN PEI_IPMI_TRANSPORT_PPI *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ) + +/*++ + +Routine Description: + + Send Ipmi Command in the right mode: HECI or KCS, to the appropiate=20 + device, ME or BMC. + +Arguments: + + This - Pointer to IPMI protocol instance + NetFunction - Net Function of command to send + Lun - LUN of command to send + Command - IPMI command to send + CommandData - Pointer to command data buffer, if needed + CommandDataSize - Size of command data buffer + ResponseData - Pointer to response data buffer + ResponseDataSize - Pointer to response data buffer size + +Returns: + + EFI_INVALID_PARAMETER - One of the input values is bad + EFI_DEVICE_ERROR - IPMI command failed + EFI_BUFFER_TOO_SMALL - Response buffer is too small + EFI_UNSUPPORTED - Command is not supported by BMC + EFI_SUCCESS - Command completed successfully + +--*/ +; + +EFI_STATUS +PeiIpmiSendCommand2 ( + IN IPMI_TRANSPORT2 *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ) + +/*++ + +Routine Description: + + This API use the default interface (PcdDefaultSystemInterface) to=20 + send IPMI command in the right mode to the appropiate device, ME or BMC. + +Arguments: + + This - Pointer to IPMI protocol instance + NetFunction - Net Function of command to send + Lun - LUN of command to send + Command - IPMI command to send + CommandData - Pointer to command data buffer, if needed + CommandDataSize - Size of command data buffer + ResponseData - Pointer to response data buffer + ResponseDataSize - Pointer to response data buffer size + +Returns: + + EFI_INVALID_PARAMETER - One of the input values is bad + EFI_DEVICE_ERROR - IPMI command failed + EFI_BUFFER_TOO_SMALL - Response buffer is too small + EFI_UNSUPPORTED - Command is not supported by BMC + EFI_SUCCESS - Command completed successfully + +--*/ +; + +EFI_STATUS +PeiIpmiSendCommand2Ex ( + IN IPMI_TRANSPORT2 *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize, + IN SYSTEM_INTERFACE_TYPE InterfaceType + ); + +EFI_STATUS +PeiIpmiSendCommandToBMC ( + IN PEI_IPMI_TRANSPORT_PPI *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT8 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT8 *ResponseDataSize, + IN VOID *Context + ) + +/*++ +Routine Description: + + This API use the specific interface type to send IPMI command in the=20 + right mode to the appropiate device, ME or BMC. + +Arguments: + + This - Pointer to IPMI protocol instance + NetFunction - Net Function of command to send + Lun - LUN of command to send + Command - IPMI command to send + CommandData - Pointer to command data buffer, if needed + CommandDataSize - Size of command data buffer + ResponseData - Pointer to response data buffer + ResponseDataSize - Pointer to response data buffer size + InterfaceType - BMC Interface type. + +Returns: + + EFI_INVALID_PARAMETER - One of the input values is bad + EFI_DEVICE_ERROR - IPMI command failed + EFI_BUFFER_TOO_SMALL - Response buffer is too small + EFI_UNSUPPORTED - Command is not supported by BMC + EFI_SUCCESS - Command completed successfully + +--*/ +; + +EFI_STATUS +PeiIpmiBmcStatus ( + IN PEI_IPMI_TRANSPORT_PPI *This, + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress, + IN VOID *Context + ) + +/*++ + +Routine Description: + + Updates the BMC status and returns the Com Address + +Arguments: + + This - Pointer to IPMI protocol instance + BmcStatus - BMC status + ComAddress - Com Address + Context - Context + +Returns: + + EFI_SUCCESS - Success + +--*/ +; + +EFI_STATUS +IpmiBmcStatus ( + IN PEI_IPMI_TRANSPORT_PPI *This, + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress, + IN VOID *Context + ) + +/*++ + +Routine Description: + + Updates the BMC status and returns the Com Address + +Arguments: + + This - Pointer to IPMI protocol instance + BmcStatus - BMC status + ComAddress - Com Address + Context - Context + +Returns: + + EFI_SUCCESS - Success + +--*/ +; + +#endif -- 2.38.1.windows.1 -The information contained in this message may be confidential and propriet= ary to American Megatrends (AMI). This communication is intended to be read= only by the individual or entity to whom it is addressed or by their desig= nee. If the reader of this message is not the intended recipient, you are o= n notice that any distribution of this message, in any form, is strictly pr= ohibited. Please promptly notify the sender by reply e-mail or by telephone= at 770-246-8600, and then delete or destroy all copies of the transmission= .