Re: [edk2-devel][edk2-platforms][PATCH V1 3/9] WhitleyOpenBoardPkg/BaseCrcLib: Add library for CRC16
Pedro, It sounds good to me. I am exposing our formerly proprietary code without much refactoring. But I see no reason to have CRC related code in multiple libraries. Regards, Isaac From: Pedro Falcato Sent: Thursday, March 10, 2022 3:19 PM To: edk2-devel-groups-io ; Oram, Isaac W Cc: Desimone, Nathaniel L ; Chiu, Chasel Subject: Re: [edk2-devel][edk2-platforms][PATCH V1 3/9] WhitleyOpenBoardPkg/BaseCrcLib: Add library for CRC16 Hi, I've just noticed this patch adds CRC16, which I've already added to my Ext4Pkg (https://github.com/tianocore/edk2-platforms/blob/master/Features/Ext4Pkg/Ext4Dxe/Crc16.c). I suggest we add CRC16 (and possibly CRC32C, which I already have in my package as well) to MdePkg, as to de-duplicate code which might be useful in other places. What do you think? If it sounds good to you, I'll open a bugzilla and work on that. Best regards, Pedro On Thu, Mar 10, 2022 at 10:41 PM Oram, Isaac W mailto:isaac.w.o...@intel.com>> wrote: Core only supports CRC32, this library adds CRC16 support. Cc: Nate DeSimone mailto:nathaniel.l.desim...@intel.com>> Cc: Chasel Chiu mailto:chasel.c...@intel.com>> Signed-off-by: Isaac Oram mailto:isaac.w.o...@intel.com>> --- Platform/Intel/WhitleyOpenBoardPkg/Include/Library/CrcLib.h | 42 Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.c | 71 Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.inf | 23 +++ Platform/Intel/WhitleyOpenBoardPkg/PlatformPkg.dsc | 1 + 4 files changed, 137 insertions(+) diff --git a/Platform/Intel/WhitleyOpenBoardPkg/Include/Library/CrcLib.h b/Platform/Intel/WhitleyOpenBoardPkg/Include/Library/CrcLib.h new file mode 100644 index 00..7ca3b7cabb --- /dev/null +++ b/Platform/Intel/WhitleyOpenBoardPkg/Include/Library/CrcLib.h @@ -0,0 +1,42 @@ +/** @file + Interface header file for the CRC library class. + + @copyright + Copyright 2016 - 2018 Intel Corporation. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _CRC_LIB_H_ +#define _CRC_LIB_H_ + +#include + +/** + Calculate a 16-bit CRC. + + The algorithm used is MSB-first form of the ITU-T Recommendation V.41, which + uses an initial value of 0x and a polynomial of 0x1021. It is the same + algorithm used by XMODEM. + + The output CRC location is not updated until the calculation is finished, so + it is possible to pass a structure as the data, and the CRC field of the same + structure as the output location for the calculated CRC. The CRC field should + be set to zero before calling this function. Once the CRC field is updated by + this function, running it again over the structure produces a CRC of zero. + + @param[in] Data A pointer to the target data. + @param[in] DataSize The target data size. + @param[out] CrcOutA pointer to the return location of the CRC. + + @retval EFI_SUCCESS The CRC was calculated successfully. + @retval EFI_INVALID_PARAMETER A null pointer was provided. +**/ +EFI_STATUS +CalculateCrc16 ( + IN VOID*Data, + IN UINTN DataSize, + OUT UINT16 *CrcOut + ); + +#endif // _CRC_LIB_H_ diff --git a/Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.c b/Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.c new file mode 100644 index 00..3e8fa402ad --- /dev/null +++ b/Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.c @@ -0,0 +1,71 @@ +/** @file + Base implementation of the CRC library class. + + @copyright + Copyright 2016 - 2018 Intel Corporation. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include + +/** + Calculate a 16-bit CRC. + + The algorithm used is MSB-first form of the ITU-T Recommendation V.41, which + uses an initial value of 0x and a polynomial of 0x1021. It is the same + algorithm used by XMODEM. + + The output CRC location is not updated until the calculation is finished, so + it is possible to pass a structure as the data, and the CRC field of the same + structure as the output location for the calculated CRC. The CRC field should + be set to zero before calling this function. Once the CRC field is updated by + this function, running it again over the structure produces a CRC of zero. + + @param[in] Data A pointer to the target data. + @param[in] DataSize The target data size. + @param[out] CrcOutA pointer to the return location of the CRC. + + @retval EFI_SUCCESS The CRC was calculated successfully. + @retval EFI_INVALID_PARAMETER A null pointer was provided. +**/ +EFI_STATUS +CalculateCrc16 ( + IN VOID*Data, + IN UINTN DataSize, + OUT UINT16 *CrcOut + ) +{ + UINT32 Crc; + UINTN Index; + UINT8 *Byte; + + if (Data == NULL || CrcOut == NULL) { +return EFI_INVALID_PARAMETER; + } + + Crc = 0x; + for (Byte
Re: [edk2-devel][edk2-platforms][PATCH V1 3/9] WhitleyOpenBoardPkg/BaseCrcLib: Add library for CRC16
Hi, I've just noticed this patch adds CRC16, which I've already added to my Ext4Pkg ( https://github.com/tianocore/edk2-platforms/blob/master/Features/Ext4Pkg/Ext4Dxe/Crc16.c ). I suggest we add CRC16 (and possibly CRC32C, which I already have in my package as well) to MdePkg, as to de-duplicate code which might be useful in other places. What do you think? If it sounds good to you, I'll open a bugzilla and work on that. Best regards, Pedro On Thu, Mar 10, 2022 at 10:41 PM Oram, Isaac W wrote: > Core only supports CRC32, this library adds CRC16 support. > > Cc: Nate DeSimone > Cc: Chasel Chiu > Signed-off-by: Isaac Oram > --- > Platform/Intel/WhitleyOpenBoardPkg/Include/Library/CrcLib.h | 42 > > Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.c | 71 > > Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.inf | 23 > +++ > Platform/Intel/WhitleyOpenBoardPkg/PlatformPkg.dsc | 1 > + > 4 files changed, 137 insertions(+) > > diff --git a/Platform/Intel/WhitleyOpenBoardPkg/Include/Library/CrcLib.h > b/Platform/Intel/WhitleyOpenBoardPkg/Include/Library/CrcLib.h > new file mode 100644 > index 00..7ca3b7cabb > --- /dev/null > +++ b/Platform/Intel/WhitleyOpenBoardPkg/Include/Library/CrcLib.h > @@ -0,0 +1,42 @@ > +/** @file > + Interface header file for the CRC library class. > + > + @copyright > + Copyright 2016 - 2018 Intel Corporation. > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#ifndef _CRC_LIB_H_ > +#define _CRC_LIB_H_ > + > +#include > + > +/** > + Calculate a 16-bit CRC. > + > + The algorithm used is MSB-first form of the ITU-T Recommendation V.41, > which > + uses an initial value of 0x and a polynomial of 0x1021. It is the > same > + algorithm used by XMODEM. > + > + The output CRC location is not updated until the calculation is > finished, so > + it is possible to pass a structure as the data, and the CRC field of > the same > + structure as the output location for the calculated CRC. The CRC field > should > + be set to zero before calling this function. Once the CRC field is > updated by > + this function, running it again over the structure produces a CRC of > zero. > + > + @param[in] Data A pointer to the target data. > + @param[in] DataSize The target data size. > + @param[out] CrcOutA pointer to the return location of the > CRC. > + > + @retval EFI_SUCCESS The CRC was calculated successfully. > + @retval EFI_INVALID_PARAMETER A null pointer was provided. > +**/ > +EFI_STATUS > +CalculateCrc16 ( > + IN VOID*Data, > + IN UINTN DataSize, > + OUT UINT16 *CrcOut > + ); > + > +#endif // _CRC_LIB_H_ > diff --git > a/Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.c > b/Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.c > new file mode 100644 > index 00..3e8fa402ad > --- /dev/null > +++ b/Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.c > @@ -0,0 +1,71 @@ > +/** @file > + Base implementation of the CRC library class. > + > + @copyright > + Copyright 2016 - 2018 Intel Corporation. > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include > +#include > + > +/** > + Calculate a 16-bit CRC. > + > + The algorithm used is MSB-first form of the ITU-T Recommendation V.41, > which > + uses an initial value of 0x and a polynomial of 0x1021. It is the > same > + algorithm used by XMODEM. > + > + The output CRC location is not updated until the calculation is > finished, so > + it is possible to pass a structure as the data, and the CRC field of > the same > + structure as the output location for the calculated CRC. The CRC field > should > + be set to zero before calling this function. Once the CRC field is > updated by > + this function, running it again over the structure produces a CRC of > zero. > + > + @param[in] Data A pointer to the target data. > + @param[in] DataSize The target data size. > + @param[out] CrcOutA pointer to the return location of the > CRC. > + > + @retval EFI_SUCCESS The CRC was calculated successfully. > + @retval EFI_INVALID_PARAMETER A null pointer was provided. > +**/ > +EFI_STATUS > +CalculateCrc16 ( > + IN VOID*Data, > + IN UINTN DataSize, > + OUT UINT16 *CrcOut > + ) > +{ > + UINT32 Crc; > + UINTN Index; > + UINT8 *Byte; > + > + if (Data == NULL || CrcOut == NULL) { > +return EFI_INVALID_PARAMETER; > + } > + > + Crc = 0x; > + for (Byte = (UINT8 *) Data; Byte < (UINT8 *) Data + DataSize; Byte++) { > +// > +// XOR the next data byte into the CRC. > +// > +Crc ^= (UINT16) *Byte << 8; > +// > +// Shift out eight bits, feeding back based on the polynomial > whenever a > +// 1 is shifted out of bit 15. > +// > +for (Index = 0; Index < 8; Index++) { > + C
[edk2-devel][edk2-platforms][PATCH V1 3/9] WhitleyOpenBoardPkg/BaseCrcLib: Add library for CRC16
Core only supports CRC32, this library adds CRC16 support. Cc: Nate DeSimone Cc: Chasel Chiu Signed-off-by: Isaac Oram --- Platform/Intel/WhitleyOpenBoardPkg/Include/Library/CrcLib.h | 42 Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.c | 71 Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.inf | 23 +++ Platform/Intel/WhitleyOpenBoardPkg/PlatformPkg.dsc | 1 + 4 files changed, 137 insertions(+) diff --git a/Platform/Intel/WhitleyOpenBoardPkg/Include/Library/CrcLib.h b/Platform/Intel/WhitleyOpenBoardPkg/Include/Library/CrcLib.h new file mode 100644 index 00..7ca3b7cabb --- /dev/null +++ b/Platform/Intel/WhitleyOpenBoardPkg/Include/Library/CrcLib.h @@ -0,0 +1,42 @@ +/** @file + Interface header file for the CRC library class. + + @copyright + Copyright 2016 - 2018 Intel Corporation. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _CRC_LIB_H_ +#define _CRC_LIB_H_ + +#include + +/** + Calculate a 16-bit CRC. + + The algorithm used is MSB-first form of the ITU-T Recommendation V.41, which + uses an initial value of 0x and a polynomial of 0x1021. It is the same + algorithm used by XMODEM. + + The output CRC location is not updated until the calculation is finished, so + it is possible to pass a structure as the data, and the CRC field of the same + structure as the output location for the calculated CRC. The CRC field should + be set to zero before calling this function. Once the CRC field is updated by + this function, running it again over the structure produces a CRC of zero. + + @param[in] Data A pointer to the target data. + @param[in] DataSize The target data size. + @param[out] CrcOutA pointer to the return location of the CRC. + + @retval EFI_SUCCESS The CRC was calculated successfully. + @retval EFI_INVALID_PARAMETER A null pointer was provided. +**/ +EFI_STATUS +CalculateCrc16 ( + IN VOID*Data, + IN UINTN DataSize, + OUT UINT16 *CrcOut + ); + +#endif // _CRC_LIB_H_ diff --git a/Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.c b/Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.c new file mode 100644 index 00..3e8fa402ad --- /dev/null +++ b/Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.c @@ -0,0 +1,71 @@ +/** @file + Base implementation of the CRC library class. + + @copyright + Copyright 2016 - 2018 Intel Corporation. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include + +/** + Calculate a 16-bit CRC. + + The algorithm used is MSB-first form of the ITU-T Recommendation V.41, which + uses an initial value of 0x and a polynomial of 0x1021. It is the same + algorithm used by XMODEM. + + The output CRC location is not updated until the calculation is finished, so + it is possible to pass a structure as the data, and the CRC field of the same + structure as the output location for the calculated CRC. The CRC field should + be set to zero before calling this function. Once the CRC field is updated by + this function, running it again over the structure produces a CRC of zero. + + @param[in] Data A pointer to the target data. + @param[in] DataSize The target data size. + @param[out] CrcOutA pointer to the return location of the CRC. + + @retval EFI_SUCCESS The CRC was calculated successfully. + @retval EFI_INVALID_PARAMETER A null pointer was provided. +**/ +EFI_STATUS +CalculateCrc16 ( + IN VOID*Data, + IN UINTN DataSize, + OUT UINT16 *CrcOut + ) +{ + UINT32 Crc; + UINTN Index; + UINT8 *Byte; + + if (Data == NULL || CrcOut == NULL) { +return EFI_INVALID_PARAMETER; + } + + Crc = 0x; + for (Byte = (UINT8 *) Data; Byte < (UINT8 *) Data + DataSize; Byte++) { +// +// XOR the next data byte into the CRC. +// +Crc ^= (UINT16) *Byte << 8; +// +// Shift out eight bits, feeding back based on the polynomial whenever a +// 1 is shifted out of bit 15. +// +for (Index = 0; Index < 8; Index++) { + Crc <<= 1; + if (Crc & BIT16) { +Crc ^= 0x1021; + } +} + } + + // + // Mask and return the 16-bit CRC. + // + *CrcOut = (UINT16) (Crc & 0x); + return EFI_SUCCESS; +} diff --git a/Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.inf b/Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.inf new file mode 100644 index 00..6b404e1259 --- /dev/null +++ b/Platform/Intel/WhitleyOpenBoardPkg/Library/BaseCrcLib/BaseCrcLib.inf @@ -0,0 +1,23 @@ +## @file +# Base implementation of the CRC library class. +# +# @copyright +# Copyright 2016 Intel Corporation. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x00010019 + BASE_NAME = BaseCrcLib + FILE_GUID