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
diff --git a/test/libpldm_utils_test.cpp b/test/libpldm_utils_test.cpp
index 971416f..b391f79 100644
--- a/test/libpldm_utils_test.cpp
+++ b/test/libpldm_utils_test.cpp
@@ -48,4 +48,21 @@
 
     rc = ver2str(&version, buffer, 0);
     EXPECT_EQ(rc, -1);
+}
+
+TEST(BcdConversion, BcdCoversion)
+{
+    EXPECT_EQ(12, bcd2dec8(0x12));
+    EXPECT_EQ(99, bcd2dec8(0x99));
+    EXPECT_EQ(1234, bcd2dec16(0x1234));
+    EXPECT_EQ(9999, bcd2dec16(0x9999));
+    EXPECT_EQ(12345678, bcd2dec32(0x12345678));
+    EXPECT_EQ(99999999, bcd2dec32(0x99999999));
+
+    EXPECT_EQ(0x12, dec2bcd8(12));
+    EXPECT_EQ(0x99, dec2bcd8(99));
+    EXPECT_EQ(0x1234, dec2bcd16(1234));
+    EXPECT_EQ(0x9999, dec2bcd16(9999));
+    EXPECT_EQ(0x12345678, dec2bcd32(12345678));
+    EXPECT_EQ(0x99999999, dec2bcd32(99999999));
 }
\ No newline at end of file