From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM10-BN7-obe.outbound.protection.outlook.com (NAM10-BN7-obe.outbound.protection.outlook.com [40.107.92.79]) by mx.groups.io with SMTP id smtpd.web10.3567.1679364076258218238 for ; Mon, 20 Mar 2023 19:01:16 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@amd.com header.s=selector1 header.b=4d5pXARG; spf=permerror, err=parse error for token &{10 18 %{i}._ip.%{h}._ehlo.%{d}._spf.vali.email}: invalid domain name (domain: amd.com, ip: 40.107.92.79, mailfrom: abner.chang@amd.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=EBe3XUpwP64Pj/S7sWwd+K2YUTtJ46XuCU3kE6PjTEUr2YPEByxK4HCoZ+laqxV2Bxg8nIk6LFBfmjJtlVUpRDBjwQNoj3gpCU2pEUx4jHt8Z0cwT5NKOqGBbYvGNU1/hj+4vdVaat7Gvrp255TOpKRf2KGJ1HV2ItqmCwriTYUUn1AHnfrPzlDCtttgWKkUVQVHCxzySDz8ran/U/8BYu5ykBqjTw3O7B2jY19NM7snVRBSBTvxq2UMFNKGcpStrurNQZtIPKTmX6q9dZeKbzwtgtyPBiSJY3y9IdI79KjQagoBGbsHuFPR2xLsTq82kHX2ad9AjRpSXoSL6u0g/A== 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=acrA3izsRTGdJtaB1clINidWeYj9fp+UJ0oJN+5NAYM=; b=NvsrJdypi3awCOxBkld1W9yM+0zcW0/8/2fWJRpzn/R4m/29duai8NdNnVI0cBact2xxybcwbCdCiEJrnZjzJewZpVgnmk+6LohofzXLHW9zsZNK4X4HoZx2jbR8KVnShM5ShG3uOByASnF0TRuHrNjw3JuMgBO5FErQzwCZ4y71Pw0OthmsmSsxKcrhKlsafE3OTgMo0p8Ss8sz3WAThioNPWLqBEWvlONNIkVF1euWI7rTEsDSxHruUz/yzIJfiuqI5Bi25YU5c/nDfZZH+39JaHTsea8mWuJgJSK13xJj2ttucqMsceSDl5MVTD8ZeW2c1E7JkgIacxSBAXSHGA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=acrA3izsRTGdJtaB1clINidWeYj9fp+UJ0oJN+5NAYM=; b=4d5pXARGUvg7POE/+A9kuDxh/IVsm4wiH0Ufbvuv5QBJgHqtxFFAHn0m7VhC9vbOnZsyFaLH98b6dOwbcErPZvoEUqUPBSOykFELVDx6jS5OuWX2SeZJcD9LwZ5rnUh3vHQfjFZCNQkAjWN7jruerCte+bA02sGYKBNLMrL8J8c= Received: from MN2PR12MB3966.namprd12.prod.outlook.com (2603:10b6:208:165::18) by PH8PR12MB7423.namprd12.prod.outlook.com (2603:10b6:510:229::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6178.37; Tue, 21 Mar 2023 02:01:12 +0000 Received: from MN2PR12MB3966.namprd12.prod.outlook.com ([fe80::8136:1f56:53e5:6fe]) by MN2PR12MB3966.namprd12.prod.outlook.com ([fe80::8136:1f56:53e5:6fe%3]) with mapi id 15.20.6178.037; Tue, 21 Mar 2023 02:01:11 +0000 From: "Chang, Abner" To: Nickle Wang , "devel@edk2.groups.io" CC: Liming Gao , Isaac Oram , Nate DeSimone , "Attar, AbdulLateef (Abdul Lateef)" , Igor Kulchytskyy Subject: Re: [edk2-platforms][PATCH V2 6/8] ManageabilityPkg: Implement Ipmi Protocol/Ppi Thread-Topic: [edk2-platforms][PATCH V2 6/8] ManageabilityPkg: Implement Ipmi Protocol/Ppi Thread-Index: AQHZUci5EeolABTazUqB9Gjpg5QM868DvUvwgADKDBA= Date: Tue, 21 Mar 2023 02:01:11 +0000 Message-ID: References: <20230308141647.1318-1-abner.chang@amd.com> <20230308141647.1318-7-abner.chang@amd.com> In-Reply-To: Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Enabled=true; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_SetDate=2023-03-21T02:01:08Z; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Method=Standard; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Name=General; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_SiteId=3dd8961f-e488-4e60-8e11-a82d994e183d; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_ActionId=9174c3d8-ba70-4b33-8aa5-e327790e6030; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_ContentBits=1 authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=amd.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: MN2PR12MB3966:EE_|PH8PR12MB7423:EE_ x-ms-office365-filtering-correlation-id: 7fae2223-4fff-46ea-902d-08db29b0252d x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: nF1Nu/IF5oebyYwMhgHdcT2FnlXWQ/sTneA5m2BOeyXaf2VssBBHmou/zhUsp+lxQomVjNT49/4bYPM5W9DXjyjXVsR29oH6+msA3QyMoEPUjqqtVNjELsFLVmo5XrW1TJYlDqhRSTH/LAf0XDQn4Ociu0xCWwZGQBfvrKg7PN22Avj+935YsbTtJHNAnaHm5cp+XLKRL3Y2AkLepqnHMTSuu8Sc6MfjxHG/Jt6BEmxrnKBEMOu97PDWmbxp7eCPadUCCbymBiqDS61h3dfn4N3pcU+/K65/3gWZXgE4yIDCfy4Awr066K3+tc7QN5VdsfL9vv5QBu7en7iV+vmlqJ1cEn6BbpJDIbKdvx78mAjAnC1uYGWbhKcXykhHCSFeKQ8qfDuh/ne5qVfKzwbo47xDWg2Yzt4hFOmwVMCPOeJki3Kbffjcy9fO6TjZcAIgVmfLZzlS+K9ERN3mLFLMANcsDd0FldzpnSObguMTMs3ii4+DAQREchoEyhHsnz/JspROTgTj3GKLSZOmjRrTkrDLJPIygZoP4bVQ329j9FswiShrZ4W8/pSZOfFe3aEgyNikpa0mq4EvYfhg04DOzNopQxjIp2ntCJ6mC7HuJ7nMaecFXNy9/o7iXiB2PHSd3GySKqA/C/dR7fBvGMmOgDNU3O72jgMDHB/3NxaQAyczU07x1686ryT8wHECfB2wZZ0koIcPQW/xv+vRG+74mCyhppz/8wiA789H5UcrcV4= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN2PR12MB3966.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230025)(4636009)(346002)(366004)(39860400002)(396003)(376002)(136003)(451199018)(7696005)(33656002)(5660300002)(6506007)(26005)(71200400001)(53546011)(478600001)(316002)(54906003)(110136005)(9686003)(186003)(86362001)(83380400001)(76116006)(8676002)(4326008)(66946007)(66476007)(38100700002)(66556008)(64756008)(66446008)(38070700005)(41300700001)(52536014)(55016003)(8936002)(122000001)(30864003)(2906002)(579004)(559001)(44824005);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?k17isVmixGlsi/RRIUg3E3LQzHSGL67otrUY2teCkth+KT047TGCeFT56V0/?= =?us-ascii?Q?xdCua2oHYl6FtqX+Ry1IA59ilnEtzkY/ghdGQHgO0NVsBWjv8GBgW3WetVVW?= =?us-ascii?Q?9rpZKVMFqOn5l35OZHZGHnsKNxwBWiFZ3pAfbhNd9GzQ/lVKBSfvdLf/o8LW?= =?us-ascii?Q?jhSuXLB5G9ruAK2ZkqAzNk+BaPIJvU+DwmxXbdtO8sqTR/mR79SZU/GUtyp7?= =?us-ascii?Q?/AM3HeDyEiw4r+I5UGCibUZwLBufM9IwqTU4VxrO/gBsEFJ0EhUi+poupy8f?= =?us-ascii?Q?DFhNSZFOTN0ryQ/IThMZPjmbNXv1jebGFLmFSk/HWfWjbZNLq84Wg6o/Bxmt?= =?us-ascii?Q?yBoxSgWcLTC/8nxvmpWHLTHmbHYcav3IUjIGl2ONzZzBnbmFUDiPly8GW23y?= =?us-ascii?Q?Gg8hb2xI/fnGQWBJm8bsjKLW2R4rkX96xwRWee0vnShR/8k9ayXB6HVWwzUR?= =?us-ascii?Q?/qfXw42U7ROLuDlMO5C9JpXhiFBdnajC2bcKB0HhRbqJx/AC6Eid2tuNBopS?= =?us-ascii?Q?6ooRWhxcERPgDKi3cvOXNrgieYWjdFyUXpru0JoHWV2TDj1kHLAQZKSxi2Bi?= =?us-ascii?Q?dsUUamAnqN3F7qzC49r7k6L1UBbPfJM1CzQEjVpuoGkkbeOyhGuZTE6StU7a?= =?us-ascii?Q?HCJBGT+v+xEwSJqk3n4RRWa6nrP9DirNENVinS8+vZMKZSP5gFFx3zL6nzm2?= =?us-ascii?Q?RHPLebZBvfDKsJbGBlgMfm+b4dJnnVrqHSmrT+NuAAOGJl1rHnxQFrzREMzj?= =?us-ascii?Q?D0OQeFzv0DtRBWYSqCM0K3wQyuO9JwQ9UrwFKd+T/e4WrcGEgeqW8lbaLLcN?= =?us-ascii?Q?K23UNvtq+BPRQHaqzUW/tSdyvBbQNy6Q1BcCvuvGgCdmr7qjdIombE3MBSlz?= =?us-ascii?Q?LrmylgSumdLH+SO+SbVnmpOx6B9AnscKnzBqqASqp2NOPygcTuDv1PK0bRi3?= =?us-ascii?Q?BpS2IRHvopGCeFVxPxOX9Qpor7MF7DowWy/8TNNdBW3OY/D4dlmpVSB/jWZe?= =?us-ascii?Q?QylL6TLa42hfMox8DnUj5muUfNWTiVeNpInl5nOBq/RjKsT+yramD1TQBmFI?= =?us-ascii?Q?Bg+ewivdCqQVgYAEr6d1DhiLAaWuxPVwlZFb++TYgm56Yop8W0ZalZHkoaWT?= =?us-ascii?Q?SdhTfZW3LjoeeiohakC4yKO88epEt+vrRFxL+h6aaHiPBkU5eIHRFQN5Im5n?= =?us-ascii?Q?qlOTgROqzUNLqAP79z1OEztfCIfXH8zO572pcHvSzSA4Hd6OUw9U9Q3bT+Gs?= =?us-ascii?Q?LBgeNxZgeiqTVP+EDs5BVAR/BvtXNxFlr8VZwiKiLW67CorGjbbRauUM7fEs?= =?us-ascii?Q?DM2xNKfAKifT9ixDAAzl5RiJuHGRQH/EjoQZZbcEs8nA50ydZ9cAWac5uIui?= =?us-ascii?Q?ND1euD2nlrDRfxQrE9OlUrqiv6XH/qS+aIdBwhQd9CIKmNEkDJhwO3A6mkc9?= =?us-ascii?Q?swNcipSdD0AHGDBjfp7gUMT4Ss9d2CoP2ojgPBDJIUBcYdlYSVLhnE1mkLue?= =?us-ascii?Q?n7JPN+LaqRk7DdE+Hea2AKSx6CggDueXzaUGk3iauL3X6FY/pxY+Bbu+G/qD?= =?us-ascii?Q?rLFMvtYoHhmtpkBFjrI=3D?= MIME-Version: 1.0 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3966.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7fae2223-4fff-46ea-902d-08db29b0252d X-MS-Exchange-CrossTenant-originalarrivaltime: 21 Mar 2023 02:01:11.7626 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: yEvRBxKuIz3B2cchhzOkCqykaP7wnJ5/vCOpaB/FIu8tYdjAaCn61TXdsHMsViy/W1PBtwO2Tl/sbX922geznA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH8PR12MB7423 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable [AMD Official Use Only - General] Hi Nickle, see my feedbacks below, > -----Original Message----- > From: Nickle Wang > Sent: Monday, March 20, 2023 9:40 PM > To: Chang, Abner ; devel@edk2.groups.io > Cc: Liming Gao ; Isaac Oram > ; Nate DeSimone > ; Attar, AbdulLateef (Abdul Lateef) > ; Igor Kulchytskyy > Subject: RE: [edk2-platforms][PATCH V2 6/8] ManageabilityPkg: Implement > Ipmi Protocol/Ppi >=20 > Caution: This message originated from an External Source. Use proper > caution when opening attachments, clicking links, or responding. >=20 >=20 > Please find my comment inline below. >=20 > Regards, > Nickle >=20 > -----Original Message----- > From: abner.chang@amd.com > Sent: Wednesday, March 8, 2023 10:17 PM > To: devel@edk2.groups.io > Cc: Liming Gao ; Isaac Oram > ; Nate DeSimone > ; Abdul Lateef Attar > ; Nickle Wang ; Igor Kulchytskyy > > Subject: [edk2-platforms][PATCH V2 6/8] ManageabilityPkg: Implement Ipmi > Protocol/Ppi >=20 > External email: Use caution opening links or attachments >=20 >=20 > From: Abner Chang >=20 > Add Ipmi Protocol/Ppi/SMM implementations. > The underlying implementation of transport interface depends on the > binded ManageabilityTransportLib. >=20 > Signed-off-by: Abner Chang > Cc: Liming Gao > Cc: Isaac Oram > Cc: Nate DeSimone > Cc: Abdul Lateef Attar > Cc: Nickle Wang > Cc: Igor Kulchytskyy > --- > .../IpmiProtocol/Dxe/IpmiProtocolDxe.inf | 50 ++++ > .../Universal/IpmiProtocol/Pei/IpmiPpiPei.inf | 51 ++++ > .../IpmiProtocol/Smm/IpmiProtocolSmm.inf | 52 ++++ > .../IpmiProtocol/Common/IpmiProtocolCommon.h | 108 > ++++++++ .../IpmiProtocol/Common/IpmiProtocolCommon.c | 247 > ++++++++++++++++++ .../Universal/IpmiProtocol/Dxe/IpmiProtocol.c | 177 > +++++++++++++ > .../Universal/IpmiProtocol/Pei/IpmiPpi.c | 151 +++++++++++ > .../Universal/IpmiProtocol/Smm/IpmiProtocol.c | 147 +++++++++++ > 8 files changed, 983 insertions(+) > create mode 100644 > Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocolDxe.in > f > create mode 100644 > Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiPei.inf > create mode 100644 > Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocolSmm > .inf > create mode 100644 > Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolC > ommon.h > create mode 100644 > Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolC > ommon.c > create mode 100644 > Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocol.c > create mode 100644 > Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpi.c > create mode 100644 > Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocol.c >=20 > diff --git > a/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocolDxe. > inf > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocolDxe > .inf > new file mode 100644 > index 0000000000..ff5ec56c73 > --- /dev/null > +++ > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocolD > +++ xe.inf > @@ -0,0 +1,50 @@ > +## @file > +# IPMI Protocol DXE Driver. > +# > +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > +reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent ## > + > +[Defines] > + INF_VERSION =3D 0x0001001d > + BASE_NAME =3D IpmiDxe > + FILE_GUID =3D BC41B0C2-9D8A-42B5-A28F-02CE0D4A6C2= 8 > + MODULE_TYPE =3D DXE_DRIVER > + VERSION_STRING =3D 1.0 > + ENTRY_POINT =3D DxeIpmiEntry > + UNLOAD_IMAGE =3D IpmiUnloadImage > + > +# > +# VALID_ARCHITECTURES =3D IA32 X64 ARM AARCH64 > +# > + > +[Sources] > + IpmiProtocol.c > + ../Common/IpmiProtocolCommon.c > + ../Common/IpmiProtocolCommon.h > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + ManageabilityPkg/ManageabilityPkg.dec > + > +[LibraryClasses] > + BaseMemoryLib > + DebugLib > + ManageabilityTransportHelperLib > + ManageabilityTransportLib > + UefiDriverEntryPoint > + UefiBootServicesTableLib > + > +[Protocols] > + gIpmiProtocolGuid # PROTOCOL ALWAYS_PRODUCED > + > +[Guids] > + gManageabilityProtocolIpmiGuid > + gManageabilityTransportKcsGuid > + > +[FixedPcd] > + gEfiMdePkgTokenSpaceGuid.PcdIpmiKcsBaseAddress > + > +[Depex] > + TRUE > diff --git > a/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiPei.inf > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiPei.inf > new file mode 100644 > index 0000000000..058bfb63cb > --- /dev/null > +++ b/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiPei.in > +++ f > @@ -0,0 +1,51 @@ > +## @file > +# IPMI Protocol PEI Driver. > +# > +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > +reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent ## > + > +[Defines] > + INF_VERSION =3D 0x0001001d > + BASE_NAME =3D IpmiPei > + FILE_GUID =3D 7832F989-CB72-4715-ADCA-35C0B031856= C > + MODULE_TYPE =3D PEIM > + VERSION_STRING =3D 1.0 > + ENTRY_POINT =3D PeiIpmiEntry > + > +# > +# The following information is for reference only and not required by th= e > build tools. > +# > +# VALID_ARCHITECTURES =3D IA32 X64 ARM AARCH64 > +# > + > +[Sources] > + IpmiPpi.c > + ../Common/IpmiProtocolCommon.c > + ../Common/IpmiProtocolCommon.h > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + ManageabilityPkg/ManageabilityPkg.dec > + > +[LibraryClasses] > + BaseMemoryLib > + DebugLib > + ManageabilityTransportHelperLib > + ManageabilityTransportLib > + PeimEntryPoint > + ManageabilityTransportLib > + > +[Ppis] > + gPeiIpmiPpiGuid # PPI ALWAYS PRODUCED > + > +[Guids] > + gManageabilityProtocolIpmiGuid > + gManageabilityTransportKcsGuid > + > +[FixedPcd] > + gEfiMdePkgTokenSpaceGuid.PcdIpmiKcsBaseAddress > + > +[Depex] > + TRUE > diff --git > a/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocolSm > m.inf > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocolSm > m.inf > new file mode 100644 > index 0000000000..cae1462f4f > --- /dev/null > +++ > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocolS > +++ mm.inf > @@ -0,0 +1,52 @@ > +## @file > +# IPMI Protocol SMM Driver. > +# > +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > +reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent ## > + > +# > +# The following information is for reference only and not required by th= e > build tools. > +# > +# VALID_ARCHITECTURES =3D IA32 X64 ARM AARCH64 > +# > +[Defines] > + INF_VERSION =3D 0x0001001d > + BASE_NAME =3D IpmiSmm > + FILE_GUID =3D CDD5D1DE-E3D3-4B1F-8689-DCC661= 561BB4 > + MODULE_TYPE =3D DXE_SMM_DRIVER > + PI_SPECIFICATION_VERSION =3D 0x0001000A > + VERSION_STRING =3D 1.0 > + ENTRY_POINT =3D SmmIpmiEntry > + > +[Sources] > + IpmiProtocol.c > + ../Common/IpmiProtocolCommon.c > + ../Common/IpmiProtocolCommon.h > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + ManageabilityPkg/ManageabilityPkg.dec > + > +[LibraryClasses] > + BaseMemoryLib > + DebugLib > + ManageabilityTransportHelperLib > + ManageabilityTransportLib > + SmmServicesTableLib > + UefiDriverEntryPoint > + UefiBootServicesTableLib > + > +[Protocols] > + gSmmIpmiProtocolGuid # PROTOCOL ALWAYS_PRODUCED > + > +[Guids] > + gManageabilityProtocolIpmiGuid > + gManageabilityTransportKcsGuid > + > +[FixedPcd] > + gEfiMdePkgTokenSpaceGuid.PcdIpmiKcsBaseAddress > + > +[Depex] > + TRUE > diff --git > a/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtoc > olCommon.h > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtoc > olCommon.h > new file mode 100644 > index 0000000000..39684d0617 > --- /dev/null > +++ > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtoc > +++ olCommon.h > @@ -0,0 +1,108 @@ > +/** @file > + > + IPMI Manageability Protocol common header file. > + > + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > +reserved.
> + SPDX-License-Identifier: BSD-2-Clause-Patent **/ > + > +#ifndef MANAGEABILITY_IPMI_COMMON_H_ > +#define MANAGEABILITY_IPMI_COMMON_H_ > + > +#include > +#include > + > +/// > +/// IPMI KCS hardware information. > +/// > +#define IPMI_KCS_BASE_ADDRESS PcdGet16 (PcdIpmiKcsBaseAddress) > +#define IPMI_KCS_REG_DATA_IN IPMI_KCS_BASE_ADDRESS + > IPMI_KCS_DATA_IN_REGISTER_OFFSET > +#define IPMI_KCS_REG_DATA_OUT IPMI_KCS_BASE_ADDRESS + > IPMI_KCS_DATA_OUT_REGISTER_OFFSET > +#define IPMI_KCS_REG_COMMAND IPMI_KCS_BASE_ADDRESS + > IPMI_KCS_COMMAND_REGISTER_OFFSET > +#define IPMI_KCS_REG_STATUS IPMI_KCS_BASE_ADDRESS + > IPMI_KCS_STATUS_REGISTER_OFFSET > + > +/** > + This functions setup the IPMI transport hardware information > +according > + to the specification of transport token acquired from transport librar= y. > + > + @param[in] TransportToken The transport interface. > + @param[out] HardwareInformation Pointer to receive the hardwar= e > information. > + > + @retval EFI_SUCCESS Hardware information is returned in > HardwareInformation. > + Caller must free the memory allocated f= or > HardwareInformation > + once it doesn't need it. > + @retval EFI_UNSUPPORTED No hardware information for the > specification specified > + in the transport token. > +**/ > +EFI_STATUS > +SetupIpmiTransportHardwareInformation ( > + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, > + OUT MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION > +*HardwareInformation > + ); > + > +/** > + This functions setup the final header/body/trailer packets for > + the acquired transport interface. > + > + @param[in] TransportToken The transport interface. > + @param[in] NetFunction IPMI function. > + @param[in] Command IPMI command. > + @param[out] PacketHeader The pointer to receive header of re= quest. > + @param[in, out] PacketBody The request body. > + When IN, it is the caller's request= body. > + When OUT and NULL, the request body= is not > + changed. > + Whee out and non-NULL, the request = body is > + changed to comfort the transport in= terface. > + @param[in, out] PacketBodySize The request body size. > + When IN and non-zero, it is the new= data > + length of request body. > + When IN and zero, the request body = is unchanged. > + @param[out] PacketTrailer The pointer to receive trailer of r= equest. > + > + @retval EFI_SUCCESS Request packet is returned. > + @retval EFI_UNSUPPORTED Request packet is not returned because > + the unsupported transport interface. > +**/ > +EFI_STATUS > +SetupIpmiRequestTransportPacket ( > + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, > + IN UINT8 NetFunction, > + IN UINT8 Command, > + OUT MANAGEABILITY_TRANSPORT_HEADER *PacketHeader, > + IN OUT UINT8 **PacketBody, > + IN OUT UINT32 *PacketBodySize, > + OUT MANAGEABILITY_TRANSPORT_TRAILER *PacketTrailer > + ); > + > +/** > + Common code to submit IPMI commands > + > + @param[in] TransportToken TRansport token. > + @param[in] NetFunction Net function of the command. > + @param[in] Command IPMI Command. > + @param[in] RequestData Command Request Data. > + @param[in] RequestDataSize Size of Command Request Data. > + @param[out] ResponseData Command Response Data. The > completion code is the first byte of response data. > + @param[in, out] ResponseDataSize Size of Command Response Data. > + > + @retval EFI_SUCCESS The command byte stream was successfull= y > submit to the device and a response was successfully received. > + @retval EFI_NOT_FOUND The command was not successfully sent t= o > the device or a response was not successfully received from the device. > + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi comma= nd > access. > + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. > + @retval EFI_TIMEOUT The command time out. > + @retval EFI_UNSUPPORTED The command was not successfully sent t= o > the device. > + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of > resource or data size error. > +**/ > +EFI_STATUS > +CommonIpmiSubmitCommand ( > + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, > + IN UINT8 NetFunction, > + IN UINT8 Command, > + IN UINT8 *RequestData, > + IN UINT32 RequestDataSize, > + OUT UINT8 *ResponseData, > + IN OUT UINT32 *ResponseDataSize > + ); > + > +#endif > diff --git > a/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtoc > olCommon.c > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtoc > olCommon.c > new file mode 100644 > index 0000000000..8e9dd7bf9d > --- /dev/null > +++ > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtoc > +++ olCommon.c > @@ -0,0 +1,247 @@ > +/** @file > + > + IPMI Manageability Protocol common file. > + > + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > + reserved.
> + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > +#include > +#include > +#include > +#include #include > + > +#include > + > +#include "IpmiProtocolCommon.h" > + > +extern CHAR16 *mTransportName; > + > +MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION > mHardwareInformation; > + > +/** > + This functions setup the IPMI transport hardware information > +according > + to the specification of transport token acquired from transport librar= y. > + > + @param[in] TransportToken The transport interface. > + @param[out] HardwareInformation Pointer to receive the hardwar= e > information. > + > + @retval EFI_SUCCESS Hardware information is returned in > HardwareInformation. > + Caller must free the memory allocated f= or > HardwareInformation > + once it doesn't need it. > + @retval EFI_UNSUPPORTED No hardware information for the > specification specified > + in the transport token. > + #retval EFI_OUT_OF_RESOURCES Not enough memory for > MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO. > +**/ > +EFI_STATUS > +SetupIpmiTransportHardwareInformation ( > + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, > + OUT MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION > +*HardwareInformation > + ) > +{ > + MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO *KcsHardwareInfo; > + > + KcsHardwareInfo =3D AllocatePool (sizeof > + (MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO)); > + if (KcsHardwareInfo =3D=3D NULL) { > + DEBUG ((DEBUG_ERROR, "%a: Not enough memory for > MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO.\n", > __FUNCTION__)); > + return EFI_OUT_OF_RESOURCES; > + } > + > + if (CompareGuid (&gManageabilityTransportKcsGuid, TransportToken- > >Transport->ManageabilityTransportSpecification)) { > + // This is KCS transport interface. > + KcsHardwareInfo->MemoryMap =3D > MANAGEABILITY_TRANSPORT_KCS_IO_MAP_IO; > + KcsHardwareInfo->IoBaseAddress.IoAddress16 =3D > IPMI_KCS_BASE_ADDRESS; > + KcsHardwareInfo->IoDataInAddress.IoAddress16 =3D > IPMI_KCS_REG_DATA_IN; > + KcsHardwareInfo->IoDataOutAddress.IoAddress16 =3D > IPMI_KCS_REG_DATA_OUT; > + KcsHardwareInfo->IoCommandAddress.IoAddress16 =3D > IPMI_KCS_REG_COMMAND; > + KcsHardwareInfo->IoStatusAddress.IoAddress16 =3D > IPMI_KCS_REG_STATUS; > + *HardwareInformation =3D > + > (MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION)KcsHardwareIn > fo; >=20 > IpmiProtocolCommon.c will be included by IpmiPpiPei driver. Please consid= er > the case when memory is not ready in PEI. In this case, global variable i= s not > writeable. This is my mistake Nickle, I also found this problem and I am fixing it now= . >=20 >=20 > + return EFI_SUCCESS; > + } else { > + DEBUG ((DEBUG_ERROR, "%a: No implementation of setting hardware > information.", __FUNCTION__)); > + ASSERT (FALSE); > + } > + > + return EFI_UNSUPPORTED; > +} > + > +/** > + This functions setup the final header/body/trailer packets for > + the acquired transport interface. > + > + @param[in] TransportToken The transport interface. > + @param[in] NetFunction IPMI function. > + @param[in] Command IPMI command. > + @param[out] PacketHeader The pointer to receive header of re= quest. > + @param[in, out] PacketBody The request body. > + When IN, it is the caller's request= body. > + When OUT and NULL, the request body= is not > + changed. > + When OUT and non-NULL, the request = body is > + changed to conform the transport in= terface. > + @param[in, out] PacketBodySize The request body size. > + When OUT and non-zero, it is the ne= w data > + length of request body. > + When OUT and zero, the request body= is unchanged. > + @param[out] PacketTrailer The pointer to receive trailer of r= equest. > + > + @retval EFI_SUCCESS Request packet is returned. > + @retval EFI_UNSUPPORTED Request packet is not returned because > + the unsupported transport interface. > +**/ > +EFI_STATUS > +SetupIpmiRequestTransportPacket ( > + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, > + IN UINT8 NetFunction, > + IN UINT8 Command, > + OUT MANAGEABILITY_TRANSPORT_HEADER *PacketHeader, > + IN OUT UINT8 **PacketBody, > + IN OUT UINT32 *PacketBodySize, > + OUT MANAGEABILITY_TRANSPORT_TRAILER *PacketTrailer > + ) > +{ > + MANAGEABILITY_IPMI_TRANSPORT_HEADER *IpmiHeader; >=20 > It would be good if we can check input pointer before we dereference them= . I will add OPTIONAL to some parameters and check if that is NULL in the cod= e. >=20 > + > + if (CompareGuid (&gManageabilityTransportKcsGuid, TransportToken- > >Transport->ManageabilityTransportSpecification)) { > + // This is KCS transport interface. > + IpmiHeader =3D AllocateZeroPool (sizeof > (MANAGEABILITY_IPMI_TRANSPORT_HEADER)); > + if (IpmiHeader =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + IpmiHeader->Command =3D Command; > + IpmiHeader->Lun =3D 0; > + IpmiHeader->NetFn =3D NetFunction; > + *PacketHeader =3D (MANAGEABILITY_TRANSPORT_HEADER > *)IpmiHeader; > + *PacketTrailer =3D NULL; > + *PacketBody =3D NULL; > + *PacketBodySize =3D 0; > + } else { > + DEBUG ((DEBUG_ERROR, "%a: No implementation of building up packet.", > __FUNCTION__)); > + ASSERT (FALSE); > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Common code to submit IPMI commands > + > + @param[in] TransportToken TRansport token. > + @param[in] NetFunction Net function of the command. > + @param[in] Command IPMI Command. > + @param[in] RequestData Command Request Data. > + @param[in] RequestDataSize Size of Command Request Data. > + @param[out] ResponseData Command Response Data. The > completion code is the first byte of response data. > + @param[in, out] ResponseDataSize Size of Command Response Data. > + > + @retval EFI_SUCCESS The command byte stream was successfull= y > submit to the device and a response was successfully received. > + @retval EFI_NOT_FOUND The command was not successfully sent t= o > the device or a response was not successfully received from the device. > + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi comma= nd > access. > + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. > + @retval EFI_TIMEOUT The command time out. > + @retval EFI_UNSUPPORTED The command was not successfully sent t= o > the device. > + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of > resource or data size error. > +**/ > +EFI_STATUS > +CommonIpmiSubmitCommand ( > + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, > + IN UINT8 NetFunction, > + IN UINT8 Command, > + IN UINT8 *RequestData, > + IN UINT32 RequestDataSize, > + OUT UINT8 *ResponseData, > + IN OUT UINT32 *ResponseDataSize > + ) > +{ > + EFI_STATUS Status; > + UINT8 *ThisRequestData; > + UINT32 ThisRequestDataSize; > + MANAGEABILITY_TRANSFER_TOKEN TransferToken; > + MANAGEABILITY_TRANSPORT_HEADER IpmiTransportHeader; > + MANAGEABILITY_TRANSPORT_TRAILER IpmiTransportTrailer; > + MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS > TransportAdditionalStatus; > + > + if (TransportToken =3D=3D NULL) { > + DEBUG ((DEBUG_ERROR, "%a: No transport toke for IPMI\n", > __FUNCTION__)); > + return EFI_UNSUPPORTED; > + } >=20 > I think we need same check to other input pointers. If they can be NULL, = we > can add "OPTIONAL" to function header. Sure, >=20 > + > + Status =3D TransportToken->Transport->Function.Version1_0- > >TransportStatus ( > + TransportTo= ken, > + &TransportA= dditionalStatus > + ); if > + (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: Transport %s for IPMI has problem - > (%r)\n", __FUNCTION__, mTransportName, Status)); > + return Status; > + } > + > + ThisRequestData =3D RequestData; > + ThisRequestDataSize =3D RequestDataSize; > + IpmiTransportHeader =3D NULL; > + IpmiTransportTrailer =3D NULL; > + Status =3D SetupIpmiRequestTransportPacket ( > + TransportToken, > + NetFunction, > + Command, > + &IpmiTransportHeader, > + &ThisRequestData, > + &ThisRequestDataSize, > + &IpmiTransportTrailer > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: Fail to build packets - (%r)\n", > __FUNCTION__, Status)); > + return Status; > + } > + > + ZeroMem (&TransferToken, sizeof (MANAGEABILITY_TRANSFER_TOKEN)); > + TransferToken.TransmitHeader =3D IpmiTransportHeader; > + TransferToken.TransmitTrailer =3D IpmiTransportTrailer; > + > + // Transmit packet. > + if ((ThisRequestData =3D=3D NULL) || (ThisRequestDataSize =3D=3D 0)) { > + > + // Transmit parameter were not changed by > SetupIpmiRequestTransportPacket(). > + TransferToken.TransmitPackage.TransmitPayload =3D RequestData; > + TransferToken.TransmitPackage.TransmitSizeInByte =3D RequestDataSize= ; > + } else { > + TransferToken.TransmitPackage.TransmitPayload =3D ThisRequestData= ; > + TransferToken.TransmitPackage.TransmitSizeInByte =3D > + ThisRequestDataSize; } > + > + TransferToken.TransmitPackage.TransmitTimeoutInMillisecond =3D > + MANAGEABILITY_TRANSPORT_NO_TIMEOUT; > + > + // Receive packet. > + TransferToken.ReceivePackage.ReceiveBuffer =3D Response= Data; > + TransferToken.ReceivePackage.ReceiveSizeInByte =3D > *ResponseDataSize; > + TransferToken.ReceivePackage.TransmitTimeoutInMillisecond =3D > + MANAGEABILITY_TRANSPORT_NO_TIMEOUT; > + TransportToken->Transport->Function.Version1_0- > >TransportTransmitReceive ( > + TransportToken, > + &TransferToken > + ); > + > + if (IpmiTransportHeader !=3D NULL) { > + FreePool ((VOID *)IpmiTransportHeader); } > + > + if (IpmiTransportTrailer !=3D NULL) { > + FreePool ((VOID *)IpmiTransportTrailer); } > + > + if (ThisRequestData !=3D NULL) { > + FreePool ((VOID *)ThisRequestData); } > + > + // Return transfer status. > + // > + Status =3D TransferToken.TransferStatus; > + TransportAdditionalStatus =3D TransferToken.TransportAdditionalStatus; > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: Failed to send IPMI command over %s\n", > __FUNCTION__, mTransportName)); > + return Status; > + } > + > + *ResponseDataSize =3D TransferToken.ReceivePackage.ReceiveSizeInByte; > + return Status; > +} > diff --git > a/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocol.c > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocol.c > new file mode 100644 > index 0000000000..6d3720581c > --- /dev/null > +++ b/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocol. > +++ c > @@ -0,0 +1,177 @@ > +/** @file > + This file provides IPMI Protocol implementation. > + > + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > +reserved.
> + SPDX-License-Identifier: BSD-2-Clause-Patent **/ > + > +#include > +#include > +#include > +#include #include > + > +#include > +#include > +#include > +#include > + > +#include "IpmiProtocolCommon.h" > + > +MANAGEABILITY_TRANSPORT_TOKEN *mTransportToken =3D NULL; > +CHAR16 *mTransportName; > + > +extern MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION > +mHardwareInformation; > + > +/** > + This service enables submitting commands via Ipmi. > + > + @param[in] This This point for IPMI_PROTOCOL stru= cture. > + @param[in] NetFunction Net function of the command. > + @param[in] Command IPMI Command. > + @param[in] RequestData Command Request Data. > + @param[in] RequestDataSize Size of Command Request Data. > + @param[out] ResponseData Command Response Data. The > completion code is the first byte of response data. > + @param[in, out] ResponseDataSize Size of Command Response Data. > + > + @retval EFI_SUCCESS The command byte stream was successfull= y > submit to the device and a response was successfully received. > + @retval EFI_NOT_FOUND The command was not successfully sent t= o > the device or a response was not successfully received from the device. > + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi comma= nd > access. > + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. > + @retval EFI_TIMEOUT The command time out. > + @retval EFI_UNSUPPORTED The command was not successfully sent t= o > the device. > + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of > resource or data size error. > +**/ > +EFI_STATUS > +EFIAPI > +DxeIpmiSubmitCommand ( > + IN IPMI_PROTOCOL *This, > + IN UINT8 NetFunction, > + IN UINT8 Command, > + IN UINT8 *RequestData, > + IN UINT32 RequestDataSize, > + OUT UINT8 *ResponseData, > + IN OUT UINT32 *ResponseDataSize > + ) > +{ > + EFI_STATUS Status; > + > + Status =3D CommonIpmiSubmitCommand ( > + mTransportToken, > + NetFunction, > + Command, > + RequestData, > + RequestDataSize, > + ResponseData, > + ResponseDataSize > + ); > + return Status; > +} > + > +static IPMI_PROTOCOL mIpmiProtocol =3D { > + DxeIpmiSubmitCommand > +}; > + > +/** > + The entry point of the Ipmi DXE driver. > + > + @param[in] ImageHandle - Handle of this driver image @param[in] > + SystemTable - Table containing standard EFI services > + > + @retval EFI_SUCCESS - IPMI Protocol is installed successfully. > + @retval Otherwise - Other errors. > +**/ > +EFI_STATUS > +EFIAPI > +DxeIpmiEntry ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + EFI_STATUS Status; > + EFI_HANDLE Handle; > + MANAGEABILITY_TRANSPORT_CAPABILITY TransportCapability; > + MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS > TransportAdditionalStatus; > + > + GetTransportCapability (&TransportCapability); > + > + Status =3D HelperAcquireManageabilityTransport ( > + &gManageabilityProtocolIpmiGuid, > + &mTransportToken > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: Failed to acquire transport interface for > IPMI protocol - %r\n", __FUNCTION__, Status)); > + return Status; > + } > + > + mTransportName =3D HelperManageabilitySpecName > + (mTransportToken->Transport->ManageabilityTransportSpecification); > + DEBUG ((DEBUG_ERROR, "%a: IPMI protocol over %s.\n", __FUNCTION__, > + mTransportName)); > + > + // > + // Setup hardware information according to the transport interface. > + Status =3D SetupIpmiTransportHardwareInformation ( > + mTransportToken, > + &mHardwareInformation > + ); > + if (EFI_ERROR (Status)) { > + if (Status =3D=3D EFI_UNSUPPORTED) { > + DEBUG ((DEBUG_ERROR, "%a: No hardware information of %s transport > interface.\n", __FUNCTION__, mTransportName)); > + } > + > + return Status; > + } > + > + // > + // Initial transport interface with the hardware information assigned. > + Status =3D HelperInitManageabilityTransport ( > + mTransportToken, > + mHardwareInformation, > + &TransportAdditionalStatus > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + Handle =3D NULL; > + Status =3D gBS->InstallProtocolInterface ( > + &Handle, > + &gIpmiProtocolGuid, > + EFI_NATIVE_INTERFACE, > + (VOID **)&mIpmiProtocol > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: Failed to install IPMI protocol - %r\n", > + __FUNCTION__, Status)); } > + > + return Status; > +} > + > +/** > + This is the unload handler for IPMI protocol module. > + > + Release the MANAGEABILITY_TRANSPORT_TOKEN acquired at entry point. > + > + @param[in] ImageHandle The drivers' driver image. > + > + @retval EFI_SUCCESS The image is unloaded. > + @retval Others Failed to unload the image. > + > +**/ > +EFI_STATUS > +EFIAPI > +IpmiUnloadImage ( > + IN EFI_HANDLE ImageHandle > + ) > +{ > + EFI_STATUS Status; > + > + Status =3D EFI_SUCCESS; > + if (mTransportToken !=3D NULL) { > + Status =3D ReleaseTransportSession (mTransportToken); } > + > + if (mHardwareInformation.Pointer !=3D NULL) { > + FreePool (mHardwareInformation.Pointer); } > + > + return Status; > +} > diff --git a/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpi= .c > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpi.c > new file mode 100644 > index 0000000000..f31dbc9f4d > --- /dev/null > +++ b/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpi.c > @@ -0,0 +1,151 @@ > +/** @file > + This file provides IPMI PPI implementation. > + > + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > + reserved.
> + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +#include "IpmiProtocolCommon.h" > + > +MANAGEABILITY_TRANSPORT_TOKEN *mTransportToken =3D NULL; > +CHAR16 *mTransportName; > + > +extern MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION > +mHardwareInformation; > + > +/** > + This service enables submitting commands via Ipmi. > + > + @param[in] This This point for PEI_IPMI_PPI struc= ture. > + @param[in] NetFunction Net function of the command. > + @param[in] Command IPMI Command. > + @param[in] RequestData Command Request Data. > + @param[in] RequestDataSize Size of Command Request Data. > + @param[out] ResponseData Command Response Data. The > completion code is the first byte of response data. > + @param[in, out] ResponseDataSize Size of Command Response Data. > + > + @retval EFI_SUCCESS The command byte stream was successfull= y > submit to the device and a response was successfully received. > + @retval EFI_NOT_FOUND The command was not successfully sent t= o > the device or a response was not successfully received from the device. > + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi comma= nd > access. > + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. > + @retval EFI_TIMEOUT The command time out. > + @retval EFI_UNSUPPORTED The command was not successfully sent t= o > the device. > + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of > resource or data size error. > +**/ > +EFI_STATUS > +EFIAPI > +PeiIpmiSubmitCommand ( > + IN PEI_IPMI_PPI *This, > + IN UINT8 NetFunction, > + IN UINT8 Command, > + IN UINT8 *RequestData, > + IN UINT32 RequestDataSize, > + OUT UINT8 *ResponseData, > + IN OUT UINT32 *ResponseDataSize > + ) > +{ > + EFI_STATUS Status; > + > + Status =3D CommonIpmiSubmitCommand ( > + mTransportToken, > + NetFunction, > + Command, > + RequestData, > + RequestDataSize, > + ResponseData, > + ResponseDataSize > + ); > + return Status; > +} > + > +static PEI_IPMI_PPI mPeiIpmiPpi =3D { > + PeiIpmiSubmitCommand > +}; > + > +static EFI_PEI_PPI_DESCRIPTOR mIpmiPpiList[] =3D { > + { > + (EFI_PEI_PPI_DESCRIPTOR_PPI | > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), > + &gPeiIpmiPpiGuid, > + &mPeiIpmiPpi > + } > +}; > + > +/** > + The entry point of the Ipmi PPI PEIM. > + > + @param FileHandle Handle of the file being invoked. > + @param PeiServices Describes the list of possible PEI Services. > + > + @retval EFI_SUCCESS Indicates that Ipmi initialization completed > successfully. > + @retval Others Indicates that Ipmi initialization could not com= plete > successfully. > +**/ > +EFI_STATUS > +EFIAPI > +PeiIpmiEntry ( > + IN EFI_PEI_FILE_HANDLE FileHandle, > + IN CONST EFI_PEI_SERVICES **PeiServices > + ) > +{ > + EFI_STATUS Status; > + MANAGEABILITY_TRANSPORT_CAPABILITY TransportCapability; > + MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS > TransportAdditionalStatus; > + > + GetTransportCapability (&TransportCapability); > + > + Status =3D HelperAcquireManageabilityTransport ( > + &gManageabilityProtocolIpmiGuid, > + &mTransportToken > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: Failed to acquire transport interface for > IPMI protocol - %r\n", __FUNCTION__, Status)); > + return Status; > + } > + > + mTransportName =3D HelperManageabilitySpecName > + (mTransportToken->Transport->ManageabilityTransportSpecification); > + DEBUG ((DEBUG_ERROR, "%a: IPMI protocol over %s.\n", __FUNCTION__, > + mTransportName)); >=20 > This is DEBUG_INFO, right? I think it is not an error message. Yes, and I will also fix the same issues on DXE/SMM file. >=20 > + > + // > + // Setup hardware information according to the transport interface. > + Status =3D SetupIpmiTransportHardwareInformation ( > + mTransportToken, > + &mHardwareInformation > + ); > + if (EFI_ERROR (Status)) { > + if (Status =3D=3D EFI_UNSUPPORTED) { > + DEBUG ((DEBUG_ERROR, "%a: No hardware information of %s transport > interface.\n", __FUNCTION__, mTransportName)); > + } > + > + return Status; > + } > + > + // > + // Initial transport interface with the hardware information assigned. > + Status =3D HelperInitManageabilityTransport ( > + mTransportToken, > + mHardwareInformation, > + &TransportAdditionalStatus > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + // > + // Install IPMI PPI. > + // > + Status =3D PeiServicesInstallPpi (&mIpmiPpiList[0]); if (EFI_ERROR > + (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: Failed to install IPMI PPI - %r\n", > + __FUNCTION__, Status)); } > + > + return Status; > +} > diff --git > a/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocol.c > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocol.c > new file mode 100644 > index 0000000000..227f6f7114 > --- /dev/null > +++ > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocol. > +++ c > @@ -0,0 +1,147 @@ > +/** @file > + This file provides IPMI SMM Protocol implementation. > + > + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > +reserved.
> + SPDX-License-Identifier: BSD-2-Clause-Patent **/ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include #include > + > + > +#include > + > +#include "IpmiProtocolCommon.h" > + > +MANAGEABILITY_TRANSPORT_TOKEN *mTransportToken =3D NULL; > +CHAR16 *mTransportName; > + > +extern MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION > +mHardwareInformation; > + > +/** > + This service enables submitting commands via Ipmi. > + > + @param[in] This This point for IPMI_PROTOCOL stru= cture. > + @param[in] NetFunction Net function of the command. > + @param[in] Command IPMI Command. > + @param[in] RequestData Command Request Data. > + @param[in] RequestDataSize Size of Command Request Data. > + @param[out] ResponseData Command Response Data. The > completion code is the first byte of response data. > + @param[in, out] ResponseDataSize Size of Command Response Data. > + > + @retval EFI_SUCCESS The command byte stream was successfull= y > submit to the device and a response was successfully received. > + @retval EFI_NOT_FOUND The command was not successfully sent t= o > the device or a response was not successfully received from the device. > + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi comma= nd > access. > + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. > + @retval EFI_TIMEOUT The command time out. > + @retval EFI_UNSUPPORTED The command was not successfully sent t= o > the device. > + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of > resource or data size error. > +**/ > +EFI_STATUS > +EFIAPI > +SmmIpmiSubmitCommand ( > + IN IPMI_PROTOCOL *This, > + IN UINT8 NetFunction, > + IN UINT8 Command, > + IN UINT8 *RequestData, > + IN UINT32 RequestDataSize, > + OUT UINT8 *ResponseData, > + IN OUT UINT32 *ResponseDataSize > + ) > +{ > + EFI_STATUS Status; > + > + Status =3D CommonIpmiSubmitCommand ( > + mTransportToken, > + NetFunction, > + Command, > + RequestData, > + RequestDataSize, > + ResponseData, > + ResponseDataSize > + ); > + return Status; > +} > + > +static IPMI_PROTOCOL mIpmiProtocol =3D { > + SmmIpmiSubmitCommand > +}; > + > +/** > + The entry point of the Ipmi DXE driver. > + > + @param[in] ImageHandle - Handle of this driver image @param[in] > + SystemTable - Table containing standard EFI services > + > + @retval EFI_SUCCESS - IPMI Protocol is installed successfully. > + @retval Otherwise - Other errors. > +**/ > +EFI_STATUS > +EFIAPI > +SmmIpmiEntry ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + EFI_STATUS Status; > + EFI_HANDLE Handle; > + MANAGEABILITY_TRANSPORT_CAPABILITY TransportCapability; > + MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS > TransportAdditionalStatus; > + > + GetTransportCapability (&TransportCapability); > + > + Status =3D HelperAcquireManageabilityTransport ( > + &gManageabilityProtocolIpmiGuid, > + &mTransportToken > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: Failed to acquire transport interface for > IPMI protocol - %r\n", __FUNCTION__, Status)); > + return Status; > + } > + > + mTransportName =3D HelperManageabilitySpecName > + (mTransportToken->Transport->ManageabilityTransportSpecification); > + DEBUG ((DEBUG_ERROR, "%a: IPMI protocol over %s.\n", __FUNCTION__, > + mTransportName)); >=20 > Please use DEBUG_INFO. >=20 > + > + // > + // Setup hardware information according to the transport interface. > + Status =3D SetupIpmiTransportHardwareInformation ( > + mTransportToken, > + &mHardwareInformation > + ); > + if (EFI_ERROR (Status)) { > + if (Status =3D=3D EFI_UNSUPPORTED) { > + DEBUG ((DEBUG_ERROR, "%a: No hardware information of %s transport > interface.\n", __FUNCTION__, mTransportName)); > + } > + > + return Status; > + } > + > + // > + // Initial transport interface with the hardware information assigned. > + Status =3D HelperInitManageabilityTransport ( > + mTransportToken, > + mHardwareInformation, > + &TransportAdditionalStatus > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + Handle =3D NULL; > + Status =3D gSmst->SmmInstallProtocolInterface ( > + &Handle, > + &gSmmIpmiProtocolGuid, > + EFI_NATIVE_INTERFACE, > + (VOID **)&mIpmiProtocol > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: Failed to install IPMI SMM protocol - > + %r\n", __FUNCTION__, Status)); } > + > + return Status; > +} > -- > 2.37.1.windows.1