xref: /openbmc/libpldm/src/bcd.c (revision 7b66bcb2303655ad9faca58ea092b7f5ab3cc5c4)
1*7b66bcb2SAndrew Jeffery /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
2*7b66bcb2SAndrew Jeffery #include <libpldm/bcd.h>
3*7b66bcb2SAndrew Jeffery 
4*7b66bcb2SAndrew Jeffery LIBPLDM_ABI_STABLE
pldm_bcd_bcd2dec8(uint8_t bcd)5*7b66bcb2SAndrew Jeffery uint8_t pldm_bcd_bcd2dec8(uint8_t bcd)
6*7b66bcb2SAndrew Jeffery {
7*7b66bcb2SAndrew Jeffery 	return (bcd >> 4) * 10 + (bcd & 0x0f);
8*7b66bcb2SAndrew Jeffery }
9*7b66bcb2SAndrew Jeffery 
10*7b66bcb2SAndrew Jeffery LIBPLDM_ABI_STABLE
pldm_bcd_dec2bcd8(uint8_t dec)11*7b66bcb2SAndrew Jeffery uint8_t pldm_bcd_dec2bcd8(uint8_t dec)
12*7b66bcb2SAndrew Jeffery {
13*7b66bcb2SAndrew Jeffery 	return ((dec / 10) << 4) + (dec % 10);
14*7b66bcb2SAndrew Jeffery }
15*7b66bcb2SAndrew Jeffery 
16*7b66bcb2SAndrew Jeffery LIBPLDM_ABI_STABLE
pldm_bcd_bcd2dec16(uint16_t bcd)17*7b66bcb2SAndrew Jeffery uint16_t pldm_bcd_bcd2dec16(uint16_t bcd)
18*7b66bcb2SAndrew Jeffery {
19*7b66bcb2SAndrew Jeffery 	return pldm_bcd_bcd2dec8(bcd >> 8) * 100 +
20*7b66bcb2SAndrew Jeffery 	       pldm_bcd_bcd2dec8(bcd & 0xff);
21*7b66bcb2SAndrew Jeffery }
22*7b66bcb2SAndrew Jeffery 
23*7b66bcb2SAndrew Jeffery LIBPLDM_ABI_STABLE
pldm_bcd_dec2bcd16(uint16_t dec)24*7b66bcb2SAndrew Jeffery uint16_t pldm_bcd_dec2bcd16(uint16_t dec)
25*7b66bcb2SAndrew Jeffery {
26*7b66bcb2SAndrew Jeffery 	return pldm_bcd_dec2bcd8(dec % 100) |
27*7b66bcb2SAndrew Jeffery 	       ((uint16_t)(pldm_bcd_dec2bcd8(dec / 100)) << 8);
28*7b66bcb2SAndrew Jeffery }
29*7b66bcb2SAndrew Jeffery 
30*7b66bcb2SAndrew Jeffery LIBPLDM_ABI_STABLE
pldm_bcd_bcd2dec32(uint32_t bcd)31*7b66bcb2SAndrew Jeffery uint32_t pldm_bcd_bcd2dec32(uint32_t bcd)
32*7b66bcb2SAndrew Jeffery {
33*7b66bcb2SAndrew Jeffery 	return pldm_bcd_bcd2dec16(bcd >> 16) * 10000 +
34*7b66bcb2SAndrew Jeffery 	       pldm_bcd_bcd2dec16(bcd & 0xffff);
35*7b66bcb2SAndrew Jeffery }
36*7b66bcb2SAndrew Jeffery 
37*7b66bcb2SAndrew Jeffery LIBPLDM_ABI_STABLE
pldm_bcd_dec2bcd32(uint32_t dec)38*7b66bcb2SAndrew Jeffery uint32_t pldm_bcd_dec2bcd32(uint32_t dec)
39*7b66bcb2SAndrew Jeffery {
40*7b66bcb2SAndrew Jeffery 	return pldm_bcd_dec2bcd16(dec % 10000) |
41*7b66bcb2SAndrew Jeffery 	       ((uint32_t)(pldm_bcd_dec2bcd16(dec / 10000)) << 16);
42*7b66bcb2SAndrew Jeffery }
43