From nobody Sat Feb 7 10:15:18 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+103357+1787277+3901457@groups.io; arc=fail (BodyHash is different from the expected one) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1682054606064646.7482524366338; Thu, 20 Apr 2023 22:23:26 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id tHW1YY1788612xHmW4TlOOiS; Thu, 20 Apr 2023 22:23:25 -0700 X-Received: from NAM11-BN8-obe.outbound.protection.outlook.com (NAM11-BN8-obe.outbound.protection.outlook.com [40.107.236.40]) by mx.groups.io with SMTP id smtpd.web11.5089.1682054605007524097 for ; Thu, 20 Apr 2023 22:23:25 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=TLWwqHUhpT/s8AAU96QTSIhFBocCBSKljNk/mzLSf7ygkPyubFrphSKlxlvhHzlIy3lO+W0hP0P16Fi++NtYOvXKVCVXXiBvoDpwRzYI6PskzNjhxFcSQykuW4Nqwyd+V8eAVpHJVThtnwy6O0MfpABUWmB+ROW3lNyl+q/IsFtDZa1d0cmdBPyCRVB8SXsh1VVOd8ethsmQZSNVJvQFGanBbjcH1q+pJlsPvtlCZk2FWm/wXB8Puz1F5/Q2zfkJJNWe7wJqAU2V2rlrr5oSOVdSh/43TsuI2h6XIWo42ehYInF8a8Z48qL4pbXV0hym4HL6YfZRK9xSANuRVxXotw== 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=pxdEY+IfJ+CjUiKllZBpX/Wwsz0e1W+nnAIQHnhs4GI=; b=GmUXXAz8ezqU3fMW1HHmNoQq1VbH17dZxuW4gp6yXDMWTghls5Jur6jLC5qMk3nxiNEXiQQLQB6ZjaCF40JG/rS0WXN16Q/l+EEGM41AxJDgyKkEPV2O8U4oGGzoOaOiFHBF9TNDAVKuAxCOSAKur8mAnkJa4MQE7e6hzG0AT30rFXvAOofdyqobFT/68Im3lIVllie47i+6hjxzd3uNec5NpEam1UhaQS+7o1f3QNf0k5TiWJVxfVSF/9pXODsSENV/D+03kO3sQ8Xp8hC4aB8NHovc3rYWUXddFRJpKCVDgABlm0Ed3Vd2S8C6486XkiwG5b0F2FVjSoVbb9FN6w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=edk2.groups.io smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none X-Received: from DM5PR07CA0087.namprd07.prod.outlook.com (2603:10b6:4:ae::16) by DS7PR12MB5813.namprd12.prod.outlook.com (2603:10b6:8:75::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6319.22; Fri, 21 Apr 2023 05:23:21 +0000 X-Received: from DS1PEPF0000B078.namprd05.prod.outlook.com (2603:10b6:4:ae:cafe::26) by DM5PR07CA0087.outlook.office365.com (2603:10b6:4:ae::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6319.27 via Frontend Transport; Fri, 21 Apr 2023 05:23:21 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+103357+1787277+3901457@groups.io; helo=mail02.groups.io; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C X-Received: from SATLEXMB04.amd.com (165.204.84.17) by DS1PEPF0000B078.mail.protection.outlook.com (10.167.17.9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.6319.16 via Frontend Transport; Fri, 21 Apr 2023 05:23:21 +0000 X-Received: from TPE-L1-ABNCHANG.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.34; Fri, 21 Apr 2023 00:23:19 -0500 From: "Chang, Abner via groups.io" To: CC: Isaac Oram , Abdul Lateef Attar , Nickle Wang , Igor Kulchytskyy Subject: [edk2-devel] [edk2-platforms][PATCH V3 03/14] ManageabilityPkg: Add HeaderSize and TrailerSize Date: Fri, 21 Apr 2023 13:22:36 +0800 Message-ID: <20230421052247.1520-4-abner.chang@amd.com> In-Reply-To: <20230421052247.1520-1-abner.chang@amd.com> References: <20230421052247.1520-1-abner.chang@amd.com> MIME-Version: 1.0 X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS1PEPF0000B078:EE_|DS7PR12MB5813:EE_ X-MS-Office365-Filtering-Correlation-Id: d7f7bdef-717f-4956-b631-08db42288610 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Message-Info: KuW7azFNaqo6xrsh4RsmGxqagDIehho6idYFhenrujRSG0IMrK2q33mPV2m+GiMpdoaUPTBRRFaEksJ4G+iX9r/FoiQ7vqHAaKdeAPoJQNNt8UnaIkGcB2eO/6BMmzw1txn+myZEWnBhiDXEtkBy+hJ5RRKKblKe88GL9NRnSf7SuFeTGR+zUQhzPmnhbEiPjvp4tPE4MyxwlLhr4JvuexRk/4b3KkieiWt6L8JxlUCEu15024gFuIHPOBJhdOTEyN59A55pWVN0f5/FcqMyD5PEbeEln7ElrXKd93Yoi2KfAakMqpjj1lTzh2F3uWLNNCAhGWqB6C/DhOi4iRq5p3AGhfj7cBPSvXDdk9dlkH19QMWomet16yjfRTOeJq257tCGK4PEjo+hIa33tsL3xwodZ8mBdo4SqKvlbEqgiRZpzYD/eWmUOvUpgt4skfkfmaDqbhFOpriJoguqJjw1CMjLHZSrKetyLXCJm2cIi6vFLJ3rJNca4brQ6jzIXYzNe4smdp2f3CS2QkICifQZBIka3H3BDSIRfdvykDdmY9rCuMdCLUEbPQ9rpg34ItjiJdX9D/w5EqN7ZJTCTCn45OzbVMq8m0WFToNwVk5CE4fQhI72fF+IPcfuDdxITeSJUeYXHbW2zZAGhI1HOU9bR1Fu5qPA7fp4oVn/qAdYlW3SP96VU7B6JTjP666t3e9jncZBgnj/z/mtPo/ktF+e6oWeAJbFjvXmhS5LlW7PKQM= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Apr 2023 05:23:21.7642 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d7f7bdef-717f-4956-b631-08db42288610 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: DS1PEPF0000B078.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR12MB5813 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,abner.chang@amd.com X-Gm-Message-State: PoXBZLgYKHu6fMQQA05gPn5zx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1682054605; bh=ThyiBHflrQTCAgt5IRas789LD6g7Z9pc2Jf5evqAo5A=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=m0pDUGG90xpWhdjKaSTNQoLnBUr3pxDFZP39fVa4/tGvBTLlhE8J1KjyMahR/AZPtvc jnKEwxA30a40Nte9FdkRQtResXjgI+MjkXaQelGWtdNEGlQfbvWbsrhmQlDLZ7w3OyQFM K1a/GeKWqFehk4niS+LyVaHRUm0EqBG+gvM= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1682054606868100002 Content-Type: text/plain; charset="utf-8" From: Abner Chang Add HeaderSize and TrailerSize in MANAGEABILITY_TRANSFER_TOKEN structure. Manageability transport interface may used by multiple protocols which have different header and trailer of payload. (e.g. MCTP over KCS and IPMI over KCS). Signed-off-by: Abner Chang Cc: Isaac Oram Cc: Abdul Lateef Attar Cc: Nickle Wang Cc: Igor Kulchytskyy Reviewed-by: Nickle Wang Reviewed-by: Abdul Lateef Attar --- .../Library/ManageabilityTransportLib.h | 2 + .../Common/ManageabilityTransportKcs.h | 20 ++- .../IpmiProtocol/Common/IpmiProtocolCommon.h | 36 +++-- .../Common/KcsCommon.c | 152 ++++++++++++------ .../Dxe/ManageabilityTransportKcs.c | 14 +- .../IpmiProtocol/Common/IpmiProtocolCommon.c | 63 +++++--- Features/ManageabilityPkg/Readme.md | 10 ++ 7 files changed, 194 insertions(+), 103 deletions(-) diff --git a/Features/ManageabilityPkg/Include/Library/ManageabilityTranspo= rtLib.h b/Features/ManageabilityPkg/Include/Library/ManageabilityTransportL= ib.h index d86d0d87d5..04072aee89 100644 --- a/Features/ManageabilityPkg/Include/Library/ManageabilityTransportLib.h +++ b/Features/ManageabilityPkg/Include/Library/ManageabilityTransportLib.h @@ -168,10 +168,12 @@ struct _MANAGEABILITY_TRANSFER_TOKEN { = ///< which is sent discretely of payload. = ///< This field can be NULL if the transport = ///< doesn't require this. + UINT16 TransmitHeaderSize; = ///< Transmit header size in byte. MANAGEABILITY_TRANSPORT_TRAILER TransmitTrailer; = ///< This is the transport-specific trailer = ///< which is sent discretely of payload. = ///< This field can be NULL if the transport = ///< doesn't require this. + UINT16 TransmitTrailerSize; = ///< Transmit trailer size in byte. MANAGEABILITY_TRANSMIT_PACKAGE TransmitPackage; = ///< The payload sent to transport interface. MANAGEABILITY_RECEIVE_PACKAGE ReceivePackage; = ///< The buffer to receive the response. EFI_STATUS TransferStatus; = ///< The EFI Status of the transfer. diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib= /Common/ManageabilityTransportKcs.h b/Features/ManageabilityPkg/Library/Man= ageabilityTransportKcsLib/Common/ManageabilityTransportKcs.h index 2cdf60ba7e..d6685c165e 100644 --- a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common= /ManageabilityTransportKcs.h +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common= /ManageabilityTransportKcs.h @@ -41,8 +41,10 @@ typedef struct { /** This service communicates with BMC using KCS protocol. =20 - @param[in] NetFunction Net function of the command. - @param[in] Command IPMI Command. + @param[in] TransmitHeader KCS packet header. + @param[in] TransmitHeaderSize KCS packet header size in byte. + @param[in] TransmitTrailer KCS packet trailer. + @param[in] TransmitTrailerSize KCS packet trailer size in byte. @param[in] RequestData Command Request Data. @param[in] RequestDataSize Size of Command Request Data. @param[out] ResponseData Command Response Data. The complet= ion @@ -69,12 +71,14 @@ typedef struct { EFI_STATUS EFIAPI KcsTransportSendCommand ( - IN UINT8 NetFunction, - IN UINT8 Command, - IN UINT8 *RequestData OPTIONAL, - IN UINT32 RequestDataSize, - OUT UINT8 *ResponseData OPTIONAL, - IN OUT UINT32 *ResponseDataSize OPTIONAL + IN MANAGEABILITY_TRANSPORT_HEADER TransmitHeader, + IN UINT16 TransmitHeaderSize, + IN MANAGEABILITY_TRANSPORT_TRAILER TransmitTrailer OPTIONAL, + IN UINT16 TransmitTrailerSize, + IN UINT8 *RequestData OPTIONAL, + IN UINT32 RequestDataSize, + OUT UINT8 *ResponseData OPTIONAL, + IN OUT UINT32 *ResponseDataSize OPTIONAL ); =20 /** diff --git a/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiPr= otocolCommon.h b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/Ip= miProtocolCommon.h index 5a7236e9a6..8bf16e6277 100644 --- a/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolC= ommon.h +++ b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolC= ommon.h @@ -44,21 +44,23 @@ SetupIpmiTransportHardwareInformation ( This functions setup the final header/body/trailer packets for the acquired transport interface. =20 - @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 requ= est. - @param[in, out] PacketBody The request body. - When IN, it is the caller's request b= ody. - When OUT and NULL, the request body i= s not - changed. - Whee out and non-NULL, the request bo= dy is - changed to comfort the transport inte= rface. - @param[in, out] PacketBodySize The request body size. - When IN and non-zero, it is the new d= ata - length of request body. - When IN and zero, the request body is= unchanged. - @param[out] PacketTrailer The pointer to receive trailer of req= uest. + @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 r= equest. + @param[out] PacketHeaderSize Pinter to receive packet header si= ze in byte. + @param[in, out] PacketBody The request body. + When IN, it is the caller's reques= t body. + When OUT and NULL, the request bod= y is not + changed. + Whee out and non-NULL, the request= body is + changed to comfort the transport i= nterface. + @param[in, out] PacketBodySize The request body size. + When IN and non-zero, it is the ne= w data + length of request body. + When IN and zero, the request body= is unchanged. + @param[out] PacketTrailer The pointer to receive trailer of = request. + @param[out] PacketTrailerSize Pinter to receive packet trailer s= ize in byte. =20 @retval EFI_SUCCESS Request packet is returned. @retval EFI_UNSUPPORTED Request packet is not returned because @@ -70,9 +72,11 @@ SetupIpmiRequestTransportPacket ( IN UINT8 NetFunction, IN UINT8 Command, OUT MANAGEABILITY_TRANSPORT_HEADER *PacketHeader OPTIONAL, + OUT UINT16 *PacketHeaderSize, IN OUT UINT8 **PacketBody OPTIONAL, IN OUT UINT32 *PacketBodySize OPTIONAL, - OUT MANAGEABILITY_TRANSPORT_TRAILER *PacketTrailer OPTIONAL + OUT MANAGEABILITY_TRANSPORT_TRAILER *PacketTrailer OPTIONAL, + OUT UINT16 *PacketTrailerSize ); =20 /** diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib= /Common/KcsCommon.c b/Features/ManageabilityPkg/Library/ManageabilityTransp= ortKcsLib/Common/KcsCommon.c index 17e2b8f231..14a7047447 100644 --- a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common= /KcsCommon.c +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common= /KcsCommon.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include =20 @@ -98,8 +99,10 @@ ClearOBF ( Algorithm is based on flow chart provided in IPMI spec 2.0 Figure 9-6, KCS Interface BMC to SMS Write Transfer Flow Chart =20 - @param[in] NetFunction Net function of the command. - @param[in] Command IPMI Command. + @param[in] TransmitHeader KCS packet header. + @param[in] TransmitHeaderSize KCS packet header size in byte. + @param[in] TransmitTrailer KCS packet trailer. + @param[in] TransmitTrailerSize KCS packet trailer size in byte. @param[in] RequestData Command Request Data, could be NULL. RequestDataSize must be zero, if Reque= stData is NULL. @@ -122,10 +125,12 @@ ClearOBF ( **/ EFI_STATUS KcsTransportWrite ( - IN UINT8 NetFunction, - IN UINT8 Command, - IN UINT8 *RequestData OPTIONAL, - IN UINT32 RequestDataSize + IN MANAGEABILITY_TRANSPORT_HEADER TransmitHeader, + IN UINT16 TransmitHeaderSize, + IN MANAGEABILITY_TRANSPORT_TRAILER TransmitTrailer OPTIONAL, + IN UINT16 TransmitTrailerSize, + IN UINT8 *RequestData OPTIONAL, + IN UINT32 RequestDataSize ) { EFI_STATUS Status; @@ -134,37 +139,63 @@ KcsTransportWrite ( UINT8 *BufferPtr; =20 // Validation on RequestData and RequestDataSize. - if ((RequestData =3D=3D NULL && RequestDataSize !=3D 0) || - (RequestData !=3D NULL && RequestDataSize =3D=3D 0) - ) { + if (((RequestData =3D=3D NULL) && (RequestDataSize !=3D 0)) || + ((RequestData !=3D NULL) && (RequestDataSize =3D=3D 0)) + ) + { DEBUG ((DEBUG_ERROR, "%a: Mismatched values of RequestData or RequestD= ataSize.\n", __FUNCTION__)); return EFI_INVALID_PARAMETER; } =20 - Length =3D sizeof (NetFunction) + sizeof (Command); + // Validation on TransmitHeader and TransmitHeaderSize. + if (((TransmitHeader =3D=3D NULL) && (TransmitHeaderSize !=3D 0)) || + ((TransmitHeader !=3D NULL) && (TransmitHeaderSize =3D=3D 0)) + ) + { + DEBUG ((DEBUG_ERROR, "%a: Mismatched values of TransmitHeader or Trans= mitHeaderSize.\n", __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + // Validation on TransmitHeader and TransmitHeaderSize. + if (((TransmitTrailer =3D=3D NULL) && (TransmitTrailerSize !=3D 0)) || + ((TransmitTrailer !=3D NULL) && (TransmitTrailerSize =3D=3D 0)) + ) + { + DEBUG ((DEBUG_ERROR, "%a: Mismatched values of TransmitTrailer or Tran= smitTrailerSize.\n", __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + Length =3D TransmitHeaderSize; if (RequestData !=3D NULL) { Length =3D Length + RequestDataSize; } =20 + if ((TransmitTrailer !=3D NULL) && (TransmitTrailerSize !=3D 0)) { + Length +=3D TransmitTrailerSize; + } + Buffer =3D AllocateZeroPool (Length); if (Buffer =3D=3D NULL) { return EFI_OUT_OF_RESOURCES; } =20 // - // Buffer[0] =3D NetFunction - // Buffer[1] =3D Command - // Buffer [2..RequestDataSize] =3D RequestData + // Buffer[0..(TransmitHeaderSize - 1)] =3D TransmitHeader + // Buffer [TransmitHeader..(TransmitHeader + RequestDataSize - 1)] =3D R= equestData + // Buffer [(TransmitHeader + RequestDataSize)..(TransmitHeader + Request= DataSize + TransmitTrailerSize - 1)] =3D TransmitTrailer // BufferPtr =3D Buffer; - CopyMem (BufferPtr, &NetFunction, sizeof (NetFunction)); - BufferPtr +=3D sizeof (NetFunction); - CopyMem (BufferPtr, &Command, sizeof (Command)); - BufferPtr +=3D sizeof (Command); - if (Length > (sizeof (NetFunction) + sizeof (Command))) { + CopyMem ((VOID *)BufferPtr, (VOID *)TransmitHeader, TransmitHeaderSize); + BufferPtr +=3D TransmitHeaderSize; + if (RequestData !=3D NULL) { CopyMem (BufferPtr, RequestData, RequestDataSize); } =20 + BufferPtr +=3D RequestDataSize; + if (TransmitTrailer !=3D NULL) { + CopyMem (BufferPtr, (VOID *)TransmitTrailer, TransmitTrailerSize); + } + BufferPtr =3D Buffer; =20 // Step 1. wait for IBF to get clear @@ -293,10 +324,11 @@ KcsTransportRead ( EFI_STATUS Status; UINT32 ReadLength; =20 - if (DataByte =3D=3D NULL || *Length =3D=3D 0) { + if ((DataByte =3D=3D NULL) || (*Length =3D=3D 0)) { DEBUG ((DEBUG_ERROR, "%a: Either DataByte is NULL or Length is 0.\n", = __FUNCTION__)); return EFI_INVALID_PARAMETER; } + ReadLength =3D 0; while (ReadLength < *Length) { // Step 1. wait for IBF to get clear @@ -350,8 +382,10 @@ KcsTransportRead ( /** This service communicates with BMC using KCS protocol. =20 - @param[in] NetFunction Net function of the command. - @param[in] Command IPMI Command. + @param[in] TransmitHeader KCS packet header. + @param[in] TransmitHeaderSize KCS packet header size in byte. + @param[in] TransmitTrailer KCS packet trailer. + @param[in] TransmitTrailerSize KCS packet trailer size in byte. @param[in] RequestData Command Request Data. @param[in] RequestDataSize Size of Command Request Data. @param[out] ResponseData Command Response Data. The complet= ion @@ -380,12 +414,14 @@ KcsTransportRead ( EFI_STATUS EFIAPI KcsTransportSendCommand ( - IN UINT8 NetFunction, - IN UINT8 Command, - IN UINT8 *RequestData OPTIONAL, - IN UINT32 RequestDataSize, - OUT UINT8 *ResponseData OPTIONAL, - IN OUT UINT32 *ResponseDataSize OPTIONAL + IN MANAGEABILITY_TRANSPORT_HEADER TransmitHeader, + IN UINT16 TransmitHeaderSize, + IN MANAGEABILITY_TRANSPORT_TRAILER TransmitTrailer OPTIONAL, + IN UINT16 TransmitTrailerSize, + IN UINT8 *RequestData OPTIONAL, + IN UINT32 RequestDataSize, + OUT UINT8 *ResponseData OPTIONAL, + IN OUT UINT32 *ResponseDataSize OPTIONAL ) { EFI_STATUS Status; @@ -393,30 +429,41 @@ KcsTransportSendCommand ( IPMI_KCS_RESPONSE_HEADER RspHeader; =20 if ((RequestData !=3D NULL) && (RequestDataSize =3D=3D 0)) { - DEBUG((DEBUG_ERROR, "%a: Mismatched values of RequestData and RequestD= ataSize\n", __FUNCTION__)); + DEBUG ((DEBUG_ERROR, "%a: Mismatched values of RequestData and Request= DataSize\n", __FUNCTION__)); return EFI_INVALID_PARAMETER; } =20 if ((ResponseData !=3D NULL) && ((ResponseDataSize !=3D NULL) && (*Respo= nseDataSize =3D=3D 0))) { - DEBUG((DEBUG_ERROR, "%a: Mismatched values of ResponseData and Respons= eDataSize\n", __FUNCTION__)); + DEBUG ((DEBUG_ERROR, "%a: Mismatched values of ResponseData and Respon= seDataSize\n", __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + if (TransmitHeader =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "%a: TransmitHeader is NULL\n", __FUNCTION__)); return EFI_INVALID_PARAMETER; } =20 + // + // Print out the request payloads. + HelperManageabilityDebugPrint ((VOID *)TransmitHeader, TransmitHeaderSiz= e, "KCS Transmit Header:\n"); + if (RequestData !=3D NULL) { + HelperManageabilityDebugPrint ((VOID *)RequestData, RequestDataSize, "= KCS Request Data:\n"); + } + + if (TransmitTrailer !=3D NULL) { + HelperManageabilityDebugPrint ((VOID *)TransmitTrailer, TransmitTraile= rSize, "KCS Transmit Trailer:\n"); + } + Status =3D KcsTransportWrite ( - (NetFunction << 2), - Command, + TransmitHeader, + TransmitHeaderSize, + TransmitTrailer, + TransmitTrailerSize, RequestData, RequestDataSize ); if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "IPMI KCS Write Failed with Status(%r) for NetFunction(0x%x)," \ - " Command(0x%x).\n", - Status, - NetFunction, - Command - )); + DEBUG ((DEBUG_ERROR, "IPMI KCS Write Failed with Status(%r)", Status)); return Status; } =20 @@ -429,7 +476,7 @@ KcsTransportSendCommand ( DEBUG_ERROR, "IPMI KCS read response header failed Status(%r), " \ "RspNetFunctionLun =3D 0x%x, " \ - "Comamnd =3D 0x%x \n", + "Command =3D 0x%x \n", Status, RspHeader.NetFunc, RspHeader.Command @@ -437,16 +484,21 @@ KcsTransportSendCommand ( return (Status); } =20 - Status =3D KcsTransportRead ((UINT8 *)ResponseData, ResponseDataSize); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "IPMI KCS response read Failed with Status(%r) for NetFunction(0x%x)= ," \ - " Command(0x%x).\n", - Status, - NetFunction, - Command - )); + // + // Print out the response payloads. + HelperManageabilityDebugPrint ((VOID *)&RspHeader, (UINT16)RspHeaderSize= , "KCS Response Header:\n"); + + if ((ResponseData !=3D NULL) && (ResponseDataSize !=3D NULL) && (*Respon= seDataSize !=3D 0)) { + Status =3D KcsTransportRead ((UINT8 *)ResponseData, ResponseDataSize); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "IPMI KCS response read Failed with Status(%r)"= , Status)); + } + + // + // Print out the response payloads. + HelperManageabilityDebugPrint ((VOID *)ResponseData, *ResponseDataSize= , "KCS Response Data:\n"); + } else { + *ResponseDataSize =3D 0; } =20 return Status; diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib= /Dxe/ManageabilityTransportKcs.c b/Features/ManageabilityPkg/Library/Manage= abilityTransportKcsLib/Dxe/ManageabilityTransportKcs.c index 7d85378fc1..c236354605 100644 --- a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/Ma= nageabilityTransportKcs.c +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/Ma= nageabilityTransportKcs.c @@ -218,23 +218,25 @@ KcsTransportTransmitReceive ( IN MANAGEABILITY_TRANSFER_TOKEN *TransferToken ) { - EFI_STATUS Status; - MANAGEABILITY_IPMI_TRANSPORT_HEADER *TransmitHeader; + EFI_STATUS Status; =20 if ((TransportToken =3D=3D NULL) || (TransferToken =3D=3D NULL)) { DEBUG ((DEBUG_ERROR, "%a: Invalid transport token or transfer token.\n= ", __FUNCTION__)); return; } =20 - TransmitHeader =3D (MANAGEABILITY_IPMI_TRANSPORT_HEADER *)TransferToken-= >TransmitHeader; - if (TransmitHeader =3D=3D NULL) { + // Transmit header is necessary for KCS transport, which could be + // NetFn, Command and etc. + if (TransferToken->TransmitHeader =3D=3D NULL) { TransferToken->TransferStatus =3D EFI_INVALID_PARAMETER; return; } =20 Status =3D KcsTransportSendCommand ( - TransmitHeader->NetFn, - TransmitHeader->Command, + TransferToken->TransmitHeader, + TransferToken->TransmitHeaderSize, + TransferToken->TransmitTrailer, + TransferToken->TransmitTrailerSize, TransferToken->TransmitPackage.TransmitPayload, TransferToken->TransmitPackage.TransmitSizeInByte, TransferToken->ReceivePackage.ReceiveBuffer, diff --git a/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiPr= otocolCommon.c b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/Ip= miProtocolCommon.c index 82bae58292..b055bad7da 100644 --- a/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolC= ommon.c +++ b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolC= ommon.c @@ -65,21 +65,23 @@ SetupIpmiTransportHardwareInformation ( This functions setup the final header/body/trailer packets for the acquired transport interface. =20 - @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 requ= est. - @param[in, out] PacketBody The request body. - When IN, it is the caller's request b= ody. - When OUT and NULL, the request body i= s not - changed. - When OUT and non-NULL, the request bo= dy is - changed to conform the transport inte= rface. - @param[in, out] PacketBodySize The request body size. - When OUT and non-zero, it is the new = data - length of request body. - When OUT and zero, the request body i= s unchanged. - @param[out] PacketTrailer The pointer to receive trailer of req= uest. + @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 r= equest. + @param[out] PacketHeaderSize Pinter to receive packet header si= ze in byte. + @param[in, out] PacketBody The request body. + When IN, it is the caller's reques= t body. + When OUT and NULL, the request bod= y is not + changed. + Whee out and non-NULL, the request= body is + changed to comfort the transport i= nterface. + @param[in, out] PacketBodySize The request body size. + When IN and non-zero, it is the ne= w data + length of request body. + When IN and zero, the request body= is unchanged. + @param[out] PacketTrailer The pointer to receive trailer of = request. + @param[out] PacketTrailerSize Pinter to receive packet trailer s= ize in byte. =20 @retval EFI_SUCCESS Request packet is returned. @retval EFI_UNSUPPORTED Request packet is not returned because @@ -91,9 +93,11 @@ SetupIpmiRequestTransportPacket ( IN UINT8 NetFunction, IN UINT8 Command, OUT MANAGEABILITY_TRANSPORT_HEADER *PacketHeader OPTIONAL, + OUT UINT16 *PacketHeaderSize, IN OUT UINT8 **PacketBody OPTIONAL, IN OUT UINT32 *PacketBodySize OPTIONAL, - OUT MANAGEABILITY_TRANSPORT_TRAILER *PacketTrailer OPTIONAL + OUT MANAGEABILITY_TRANSPORT_TRAILER *PacketTrailer OPTIONAL, + OUT UINT16 *PacketTrailerSize ) { MANAGEABILITY_IPMI_TRANSPORT_HEADER *IpmiHeader; @@ -105,18 +109,24 @@ SetupIpmiRequestTransportPacket ( return EFI_OUT_OF_RESOURCES; } =20 + *PacketHeaderSize =3D 0; + *PacketTrailerSize =3D 0; IpmiHeader->Command =3D Command; IpmiHeader->Lun =3D 0; IpmiHeader->NetFn =3D NetFunction; if (PacketHeader !=3D NULL) { - *PacketHeader =3D (MANAGEABILITY_TRANSPORT_HEADER *)IpmiHeader; + *PacketHeader =3D (MANAGEABILITY_TRANSPORT_HEADER *)IpmiHeader; + *PacketHeaderSize =3D sizeof (MANAGEABILITY_IPMI_TRANSPORT_HEADER); } + if (PacketTrailer !=3D NULL) { *PacketTrailer =3D NULL; } + if (PacketBody !=3D NULL) { *PacketBody =3D NULL; } + if (PacketBodySize !=3D NULL) { *PacketBodySize =3D 0; } @@ -124,6 +134,7 @@ SetupIpmiRequestTransportPacket ( DEBUG ((DEBUG_ERROR, "%a: No implementation of building up packet.", _= _FUNCTION__)); ASSERT (FALSE); } + return EFI_SUCCESS; } =20 @@ -164,6 +175,8 @@ CommonIpmiSubmitCommand ( MANAGEABILITY_TRANSPORT_HEADER IpmiTransportHeader; MANAGEABILITY_TRANSPORT_TRAILER IpmiTransportTrailer; MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS TransportAdditionalStatus; + UINT16 HeaderSize; + UINT16 TrailerSize; =20 if (TransportToken =3D=3D NULL) { DEBUG ((DEBUG_ERROR, "%a: No transport toke for IPMI\n", __FUNCTION__)= ); @@ -179,8 +192,8 @@ CommonIpmiSubmitCommand ( return Status; } =20 - ThisRequestData =3D RequestData; - ThisRequestDataSize =3D RequestDataSize; + ThisRequestData =3D RequestData; + ThisRequestDataSize =3D RequestDataSize; IpmiTransportHeader =3D NULL; IpmiTransportTrailer =3D NULL; Status =3D SetupIpmiRequestTransportPacket ( @@ -188,9 +201,11 @@ CommonIpmiSubmitCommand ( NetFunction, Command, &IpmiTransportHeader, + &HeaderSize, &ThisRequestData, &ThisRequestDataSize, - &IpmiTransportTrailer + &IpmiTransportTrailer, + &TrailerSize ); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "%a: Fail to build packets - (%r)\n", __FUNCTION_= _, Status)); @@ -198,12 +213,13 @@ CommonIpmiSubmitCommand ( } =20 ZeroMem (&TransferToken, sizeof (MANAGEABILITY_TRANSFER_TOKEN)); - TransferToken.TransmitHeader =3D IpmiTransportHeader; - TransferToken.TransmitTrailer =3D IpmiTransportTrailer; + TransferToken.TransmitHeader =3D IpmiTransportHeader; + TransferToken.TransmitHeaderSize =3D HeaderSize; + TransferToken.TransmitTrailer =3D IpmiTransportTrailer; + TransferToken.TransmitTrailerSize =3D TrailerSize; =20 // Transmit packet. if ((ThisRequestData =3D=3D NULL) || (ThisRequestDataSize =3D=3D 0)) { - // Transmit parameter were not changed by SetupIpmiRequestTransportPac= ket(). TransferToken.TransmitPackage.TransmitPayload =3D RequestData; TransferToken.TransmitPackage.TransmitSizeInByte =3D RequestDataSize; @@ -247,5 +263,6 @@ CommonIpmiSubmitCommand ( if (ResponseDataSize !=3D NULL) { *ResponseDataSize =3D TransferToken.ReceivePackage.ReceiveSizeInByte; } + return Status; } diff --git a/Features/ManageabilityPkg/Readme.md b/Features/ManageabilityPk= g/Readme.md index 2ecee96313..81c9322b98 100644 --- a/Features/ManageabilityPkg/Readme.md +++ b/Features/ManageabilityPkg/Readme.md @@ -99,7 +99,9 @@ library to compliant with the framework of ManageabilityP= kg design. struct _MANAGEABILITY_TRANSFER_TOKEN { EFI_EVENT ReceiveEvent; MANAGEABILITY_TRANSPORT_HEADER TransmitHeader; + UINT16 TransmitHeaderSize; MANAGEABILITY_TRANSPORT_TRAILER TransmitTrailer; + UINT16 TransmitTrailerSize; MANAGEABILITY_TRANSMIT_PACKAGE TransmitPackage; MANAGEABILITY_RECEIVE_PACKAGE ReceivePackage; EFI_STATUS TransferStatus; @@ -124,6 +126,10 @@ library to compliant with the framework of Manageabili= tyPkg design. manageability transport library to make the transport implementation a= gnostic to the manageability protocol specification. =20 +* ***TransmitHeaderSize*** + + This indicates the size of TransmitHeader. + * ***TransmitTrailer*** =20 The transmit trailer may be different according to the disparate trans= port @@ -131,6 +137,10 @@ library to compliant with the framework of Manageabili= tyPkg design. manageability transport library to make the transport implementation a= gnostic to the manageability protocol specification. =20 +* ***TransmitTrailerSize*** + + This indicates the size of TransmitTrailer. + * ***TransmitPackage*** =20 The buffer of packet to transmit, this could be a value of NULL if the= manageability --=20 2.37.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#103357): https://edk2.groups.io/g/devel/message/103357 Mute This Topic: https://groups.io/mt/98404948/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-