From: Abner Chang <abner.ch...@amd.com> - Return Maximum Transfer Unit for MCTP over KCS - Check the parameters
Signed-off-by: Abner Chang <abner.ch...@amd.com> Cc: Isaac Oram <isaac.w.o...@intel.com> Cc: Abdul Lateef Attar <abdat...@amd.com> Cc: Nickle Wang <nick...@nvidia.com> Cc: Igor Kulchytskyy <ig...@ami.com> Reviewed-by: Nickle Wang <nick...@nvidia.com> --- .../Common/ManageabilityTransportKcs.h | 2 +- .../Common/KcsCommon.c | 112 ++++++++++-------- .../Dxe/ManageabilityTransportKcs.c | 24 ++-- 3 files changed, 78 insertions(+), 60 deletions(-) diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/ManageabilityTransportKcs.h b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/ManageabilityTransportKcs.h index d6685c165e..8c6a64416a 100644 --- a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/ManageabilityTransportKcs.h +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/ManageabilityTransportKcs.h @@ -71,7 +71,7 @@ typedef struct { EFI_STATUS EFIAPI KcsTransportSendCommand ( - IN MANAGEABILITY_TRANSPORT_HEADER TransmitHeader, + IN MANAGEABILITY_TRANSPORT_HEADER TransmitHeader OPTIONAL, IN UINT16 TransmitHeaderSize, IN MANAGEABILITY_TRANSPORT_TRAILER TransmitTrailer OPTIONAL, IN UINT16 TransmitTrailerSize, diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/KcsCommon.c b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/KcsCommon.c index 14a7047447..a8c6a674c9 100644 --- a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/KcsCommon.c +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/KcsCommon.c @@ -99,14 +99,14 @@ 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 - @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 RequestData - is NULL. - @param[in] RequestDataSize Size of Command Request Data. + @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 RequestData + is NULL. + @param[in] RequestDataSize Size of Command Request Data. @retval EFI_SUCCESS The command byte stream was successfully submit to the device and a response was @@ -414,7 +414,7 @@ KcsTransportRead ( EFI_STATUS EFIAPI KcsTransportSendCommand ( - IN MANAGEABILITY_TRANSPORT_HEADER TransmitHeader, + IN MANAGEABILITY_TRANSPORT_HEADER TransmitHeader OPTIONAL, IN UINT16 TransmitHeaderSize, IN MANAGEABILITY_TRANSPORT_TRAILER TransmitTrailer OPTIONAL, IN UINT16 TransmitTrailerSize, @@ -427,6 +427,7 @@ KcsTransportSendCommand ( EFI_STATUS Status; UINT32 RspHeaderSize; IPMI_KCS_RESPONSE_HEADER RspHeader; + UINT32 ExpectedResponseDataSize; if ((RequestData != NULL) && (RequestDataSize == 0)) { DEBUG ((DEBUG_ERROR, "%a: Mismatched values of RequestData and RequestDataSize\n", __FUNCTION__)); @@ -438,65 +439,72 @@ KcsTransportSendCommand ( return EFI_INVALID_PARAMETER; } - if (TransmitHeader == NULL) { - DEBUG ((DEBUG_ERROR, "%a: TransmitHeader is NULL\n", __FUNCTION__)); - return EFI_INVALID_PARAMETER; + // Print out the request payloads. + if ((TransmitHeader != NULL) && (TransmitHeaderSize != 0)) { + HelperManageabilityDebugPrint ((VOID *)TransmitHeader, (UINT32)TransmitHeaderSize, "KCS Transmit Header:\n"); } - // - // Print out the request payloads. - HelperManageabilityDebugPrint ((VOID *)TransmitHeader, TransmitHeaderSize, "KCS Transmit Header:\n"); if (RequestData != NULL) { HelperManageabilityDebugPrint ((VOID *)RequestData, RequestDataSize, "KCS Request Data:\n"); } - if (TransmitTrailer != NULL) { - HelperManageabilityDebugPrint ((VOID *)TransmitTrailer, TransmitTrailerSize, "KCS Transmit Trailer:\n"); - } + if ((TransmitTrailer != NULL) && (TransmitTrailerSize != 0)) { + HelperManageabilityDebugPrint ((VOID *)TransmitTrailer, (UINT32)TransmitTrailerSize, "KCS Transmit Trailer:\n"); + } + + if ((TransmitHeader != NULL) || (RequestData != NULL)) { + Status = KcsTransportWrite ( + TransmitHeader, + TransmitHeaderSize, + TransmitTrailer, + TransmitTrailerSize, + RequestData, + RequestDataSize + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "KCS Write Failed with Status(%r)", Status)); + return Status; + } - Status = KcsTransportWrite ( - TransmitHeader, - TransmitHeaderSize, - TransmitTrailer, - TransmitTrailerSize, - RequestData, - RequestDataSize - ); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "IPMI KCS Write Failed with Status(%r)", Status)); - return Status; - } + // + // Read the response header + RspHeaderSize = sizeof (IPMI_KCS_RESPONSE_HEADER); + Status = KcsTransportRead ((UINT8 *)&RspHeader, &RspHeaderSize); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "KCS read response header failed Status(%r), " \ + "RspNetFunctionLun = 0x%x, " \ + "Comamnd = 0x%x \n", + Status, + RspHeader.NetFunc, + RspHeader.Command + )); + return (Status); + } - // - // Read the response header - RspHeaderSize = sizeof (IPMI_KCS_RESPONSE_HEADER); - Status = KcsTransportRead ((UINT8 *)&RspHeader, &RspHeaderSize); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "IPMI KCS read response header failed Status(%r), " \ - "RspNetFunctionLun = 0x%x, " \ - "Command = 0x%x \n", - Status, - RspHeader.NetFunc, - RspHeader.Command - )); - return (Status); + // + // Print out the response payloads. + HelperManageabilityDebugPrint ((VOID *)&RspHeader, RspHeaderSize, "KCS Response Header:\n"); } - // - // Print out the response payloads. - HelperManageabilityDebugPrint ((VOID *)&RspHeader, (UINT16)RspHeaderSize, "KCS Response Header:\n"); - if ((ResponseData != NULL) && (ResponseDataSize != NULL) && (*ResponseDataSize != 0)) { - Status = KcsTransportRead ((UINT8 *)ResponseData, ResponseDataSize); + ExpectedResponseDataSize = *ResponseDataSize; + Status = KcsTransportRead ((UINT8 *)ResponseData, ResponseDataSize); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "IPMI KCS response read Failed with Status(%r)", Status)); + DEBUG ((DEBUG_ERROR, "KCS response read Failed with Status(%r)", Status)); } // // Print out the response payloads. - HelperManageabilityDebugPrint ((VOID *)ResponseData, *ResponseDataSize, "KCS Response Data:\n"); + if (*ResponseDataSize != 0) { + if (ExpectedResponseDataSize != *ResponseDataSize) { + DEBUG ((DEBUG_ERROR, "Expected KCS response size : %d is not matched to returned size : %d.\n", ExpectedResponseDataSize, *ResponseDataSize)); + Status = EFI_DEVICE_ERROR; + } + + HelperManageabilityDebugPrint ((VOID *)ResponseData, (UINT32)*ResponseDataSize, "KCS Response Data:\n"); + } } else { *ResponseDataSize = 0; } diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/ManageabilityTransportKcs.c b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/ManageabilityTransportKcs.c index c236354605..9175556a26 100644 --- a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/ManageabilityTransportKcs.c +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/ManageabilityTransportKcs.c @@ -10,6 +10,7 @@ #include <Uefi.h> #include <IndustryStandard/IpmiKcs.h> #include <Library/IoLib.h> +#include <Library/BaseMemoryLib.h> #include <Library/DebugLib.h> #include <Library/MemoryAllocationLib.h> #include <Library/ManageabilityTransportLib.h> @@ -225,13 +226,6 @@ KcsTransportTransmitReceive ( return; } - // Transmit header is necessary for KCS transport, which could be - // NetFn, Command and etc. - if (TransferToken->TransmitHeader == NULL) { - TransferToken->TransferStatus = EFI_INVALID_PARAMETER; - return; - } - Status = KcsTransportSendCommand ( TransferToken->TransmitHeader, TransferToken->TransmitHeaderSize, @@ -354,6 +348,22 @@ GetTransportCapability ( } *TransportCapability = 0; + if (CompareGuid ( + TransportToken->ManageabilityProtocolSpecification, + &gManageabilityProtocolIpmiGuid + )) + { + *TransportCapability |= + (MANAGEABILITY_TRANSPORT_CAPABILITY_MAXIMUM_PAYLOAD_NOT_AVAILABLE << MANAGEABILITY_TRANSPORT_CAPABILITY_MAXIMUM_PAYLOAD_BIT_POSITION); + } else if (CompareGuid ( + TransportToken->ManageabilityProtocolSpecification, + &gManageabilityProtocolMctpGuid + )) + { + *TransportCapability |= + (MCTP_KCS_MTU_IN_POWER_OF_2 << MANAGEABILITY_TRANSPORT_CAPABILITY_MAXIMUM_PAYLOAD_BIT_POSITION); + } + return EFI_SUCCESS; } -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#103360): https://edk2.groups.io/g/devel/message/103360 Mute This Topic: https://groups.io/mt/98404956/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-