Reviewed-by: Nickle Wang <nick...@nvidia.com> Regards, Nickle
> -----Original Message----- > From: abner.ch...@amd.com <abner.ch...@amd.com> > Sent: Tuesday, April 18, 2023 3:16 PM > To: devel@edk2.groups.io > Cc: Isaac Oram <isaac.w.o...@intel.com>; Abdul Lateef Attar > <abdat...@amd.com>; Nickle Wang <nick...@nvidia.com>; Igor Kulchytskyy > <ig...@ami.com> > Subject: [edk2-platforms][PATCH V2 06/14] ManageabilityPkg/KCS: KCS > transport interface > > External email: Use caution opening links or attachments > > > 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> > --- > .../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/Com > +++ mon/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/Com > +++ mon/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/Mana > geabilityTransportKcs.c > b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/Mana > geabilityTransportKcs.c > index c236354605..9175556a26 100644 > --- > a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/Mana > geabilityTransportKcs.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_AVAIL > ABLE > + << > MANAGEABILITY_TRANSPORT_CAPABILITY_MAXIMUM_PAYLOAD_BIT_POSITIO > N); > + } else if (CompareGuid ( > + TransportToken->ManageabilityProtocolSpecification, > + &gManageabilityProtocolMctpGuid > + )) > + { > + *TransportCapability |= > + (MCTP_KCS_MTU_IN_POWER_OF_2 << > + > MANAGEABILITY_TRANSPORT_CAPABILITY_MAXIMUM_PAYLOAD_BIT_POSITIO > N); > + } > + > return EFI_SUCCESS; > } > > -- > 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#103282): https://edk2.groups.io/g/devel/message/103282 Mute This Topic: https://groups.io/mt/98339118/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-