libplmd: utils: Add bcd conversions

Add bcd2dec/dec2bcd functions

Signed-off-by: John Wang <wangzqbj@inspur.com>
Change-Id: I3781c6f3d312c6700eaca5f2bb88013a36c313ed
diff --git a/libpldm/utils.c b/libpldm/utils.c
index 398a5da..ef49f6a 100644
--- a/libpldm/utils.c
+++ b/libpldm/utils.c
@@ -107,4 +107,36 @@
 		POINTER_MOVE(rc, buffer, buffer_size, original_size);
 	}
 	return original_size - buffer_size;
-}
\ No newline at end of file
+}
+
+uint8_t bcd2dec8(uint8_t bcd)
+{
+	uint8_t dec = (bcd >> 4) * 10 + (bcd & 0x0f);
+	return dec;
+}
+
+uint8_t dec2bcd8(uint8_t dec)
+{
+	uint8_t bcd = (dec % 10) | (dec / 10) << 4;
+	return bcd;
+}
+
+uint16_t bcd2dec16(uint16_t bcd)
+{
+	return bcd2dec8(bcd >> 8) * 100 + bcd2dec8(bcd & 0xff);
+}
+
+uint16_t dec2bcd16(uint16_t dec)
+{
+	return dec2bcd8(dec % 100) | dec2bcd8(dec / 100) << 8;
+}
+
+uint32_t bcd2dec32(uint32_t bcd)
+{
+	return bcd2dec16(bcd >> 16) * 10000 + bcd2dec16(bcd & 0xffff);
+}
+
+uint32_t dec2bcd32(uint32_t dec)
+{
+	return dec2bcd16(dec % 10000) | dec2bcd16(dec / 10000) << 16;
+}
diff --git a/libpldm/utils.h b/libpldm/utils.h
index 2c2d365..73bbf38 100644
--- a/libpldm/utils.h
+++ b/libpldm/utils.h
@@ -26,6 +26,42 @@
  */
 int ver2str(const ver32_t *version, char *buffer, size_t buffer_size);
 
+/** @breif Convert bcd number(uint8_t) to decimal
+ *  @param[in] bcd - bcd number
+ *  @return the decimal number
+ */
+uint8_t bcd2dec8(uint8_t bcd);
+
+/** @breif Convert decimal number(uint8_t) to bcd
+ *  @param[in] dec - decimal number
+ *  @return the bcd number
+ */
+uint8_t dec2bcd8(uint8_t dec);
+
+/** @breif Convert bcd number(uint16_t) to decimal
+ *  @param[in] bcd - bcd number
+ *  @return the decimal number
+ */
+uint16_t bcd2dec16(uint16_t bcd);
+
+/** @breif Convert decimal number(uint16_t) to bcd
+ *  @param[in] dec - decimal number
+ *  @return the bcd number
+ */
+uint16_t dec2bcd16(uint16_t dec);
+
+/** @breif Convert bcd number(uint32_t) to decimal
+ *  @param[in] bcd - bcd number
+ *  @return the decimal number
+ */
+uint32_t bcd2dec32(uint32_t bcd);
+
+/** @breif Convert decimal number(uint32_t) to bcd
+ *  @param[in] dec - decimal number
+ *  @return the bcd number
+ */
+uint32_t dec2bcd32(uint32_t dec);
+
 #ifdef __cplusplus
 }
 #endif