xref: /openbmc/libpldm/src/msgbuf/platform.h (revision 840b140a)
17992eb84SAndrew Jeffery #ifndef PLDM_MSGBUF_PLATFORM_H
27992eb84SAndrew Jeffery #define PLDM_MSGBUF_PLATFORM_H
37992eb84SAndrew Jeffery 
47992eb84SAndrew Jeffery #include "../msgbuf.h"
57992eb84SAndrew Jeffery #include <libpldm/base.h>
67992eb84SAndrew Jeffery #include <libpldm/platform.h>
77992eb84SAndrew Jeffery 
87992eb84SAndrew Jeffery static inline int
97992eb84SAndrew Jeffery pldm_msgbuf_extract_value_pdr_hdr(struct pldm_msgbuf *ctx,
107992eb84SAndrew Jeffery 				  struct pldm_value_pdr_hdr *hdr)
117992eb84SAndrew Jeffery {
127992eb84SAndrew Jeffery 	pldm_msgbuf_extract(ctx, &hdr->record_handle);
137992eb84SAndrew Jeffery 	pldm_msgbuf_extract(ctx, &hdr->version);
147992eb84SAndrew Jeffery 	pldm_msgbuf_extract(ctx, &hdr->type);
157992eb84SAndrew Jeffery 	pldm_msgbuf_extract(ctx, &hdr->record_change_num);
167992eb84SAndrew Jeffery 	pldm_msgbuf_extract(ctx, &hdr->length);
177992eb84SAndrew Jeffery 
187992eb84SAndrew Jeffery 	return pldm_msgbuf_validate(ctx);
197992eb84SAndrew Jeffery }
207992eb84SAndrew Jeffery 
217992eb84SAndrew Jeffery /*
227992eb84SAndrew Jeffery  * We use __attribute__((always_inline)) below so the compiler has visibility of
237992eb84SAndrew Jeffery  * the switch() at the call site. It is often the case that the size of multiple
247992eb84SAndrew Jeffery  * fields depends on the tag. Inlining thus gives the compiler visibility to
257992eb84SAndrew Jeffery  * hoist one tag-based code-path condition to cover all invocations.
267992eb84SAndrew Jeffery  */
277992eb84SAndrew Jeffery 
287992eb84SAndrew Jeffery __attribute__((always_inline)) static inline int
297992eb84SAndrew Jeffery pldm_msgbuf_extract_sensor_data(struct pldm_msgbuf *ctx,
307992eb84SAndrew Jeffery 				enum pldm_sensor_readings_data_type tag,
317992eb84SAndrew Jeffery 				union_sensor_data_size *dst)
327992eb84SAndrew Jeffery {
337992eb84SAndrew Jeffery 	switch (tag) {
347992eb84SAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_UINT8:
357992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_u8);
367992eb84SAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_SINT8:
377992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_s8);
387992eb84SAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_UINT16:
397992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_u16);
407992eb84SAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_SINT16:
417992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_s16);
427992eb84SAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_UINT32:
437992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_u32);
447992eb84SAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_SINT32:
457992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_s32);
467992eb84SAndrew Jeffery 	}
477992eb84SAndrew Jeffery 
487992eb84SAndrew Jeffery 	return -PLDM_ERROR_INVALID_DATA;
497992eb84SAndrew Jeffery }
507992eb84SAndrew Jeffery 
51*840b140aSAndrew Jeffery /*
52*840b140aSAndrew Jeffery  * This API is bad, but it's because the caller's APIs are also bad. They should
53*840b140aSAndrew Jeffery  * have used the approach used by callers of pldm_msgbuf_extract_sensor_data()
54*840b140aSAndrew Jeffery  * above
55*840b140aSAndrew Jeffery  */
56*840b140aSAndrew Jeffery __attribute__((always_inline)) static inline int
57*840b140aSAndrew Jeffery pldm_msgbuf_extract_sensor_value(struct pldm_msgbuf *ctx,
58*840b140aSAndrew Jeffery 				 enum pldm_effecter_data_size tag, uint8_t *val)
59*840b140aSAndrew Jeffery {
60*840b140aSAndrew Jeffery 	switch (tag) {
61*840b140aSAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_UINT8:
62*840b140aSAndrew Jeffery 		return pldm_msgbuf_extract_uint8(ctx, (uint8_t *)val);
63*840b140aSAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_SINT8:
64*840b140aSAndrew Jeffery 		return pldm_msgbuf_extract_int8(ctx, (int8_t *)val);
65*840b140aSAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_UINT16:
66*840b140aSAndrew Jeffery 		return pldm_msgbuf_extract_uint16(ctx, (uint16_t *)val);
67*840b140aSAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_SINT16:
68*840b140aSAndrew Jeffery 		return pldm_msgbuf_extract_int16(ctx, (int16_t *)val);
69*840b140aSAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_UINT32:
70*840b140aSAndrew Jeffery 		return pldm_msgbuf_extract_uint32(ctx, (uint32_t *)val);
71*840b140aSAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_SINT32:
72*840b140aSAndrew Jeffery 		return pldm_msgbuf_extract_int32(ctx, (int32_t *)val);
73*840b140aSAndrew Jeffery 	}
74*840b140aSAndrew Jeffery 
75*840b140aSAndrew Jeffery 	return -PLDM_ERROR_INVALID_DATA;
76*840b140aSAndrew Jeffery }
77*840b140aSAndrew Jeffery 
787992eb84SAndrew Jeffery __attribute__((always_inline)) static inline int
797992eb84SAndrew Jeffery pldm_msgbuf_extract_range_field_format(struct pldm_msgbuf *ctx,
807992eb84SAndrew Jeffery 				       enum pldm_range_field_format tag,
817992eb84SAndrew Jeffery 				       union_range_field_format *dst)
827992eb84SAndrew Jeffery {
837992eb84SAndrew Jeffery 	switch (tag) {
847992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_UINT8:
857992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_u8);
867992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_SINT8:
877992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_s8);
887992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_UINT16:
897992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_u16);
907992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_SINT16:
917992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_s16);
927992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_UINT32:
937992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_u32);
947992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_SINT32:
957992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_s32);
967992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_REAL32:
977992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_f32);
987992eb84SAndrew Jeffery 	}
997992eb84SAndrew Jeffery 
1007992eb84SAndrew Jeffery 	return -PLDM_ERROR_INVALID_DATA;
1017992eb84SAndrew Jeffery }
1027992eb84SAndrew Jeffery 
1033884c44dSAndrew Jeffery /* This API is bad, but it's because the caller's APIs are also bad */
1043884c44dSAndrew Jeffery __attribute__((always_inline)) static inline int
1053884c44dSAndrew Jeffery pldm_msgbuf_extract_effecter_value(struct pldm_msgbuf *ctx,
1063884c44dSAndrew Jeffery 				   enum pldm_effecter_data_size tag,
1073884c44dSAndrew Jeffery 				   uint8_t *val)
1083884c44dSAndrew Jeffery {
1093884c44dSAndrew Jeffery 	switch (tag) {
1103884c44dSAndrew Jeffery 	case PLDM_EFFECTER_DATA_SIZE_UINT8:
1113884c44dSAndrew Jeffery 		return pldm_msgbuf_extract_uint8(ctx, (uint8_t *)val);
1123884c44dSAndrew Jeffery 	case PLDM_EFFECTER_DATA_SIZE_SINT8:
1133884c44dSAndrew Jeffery 		return pldm_msgbuf_extract_int8(ctx, (int8_t *)val);
1143884c44dSAndrew Jeffery 	case PLDM_EFFECTER_DATA_SIZE_UINT16:
1153884c44dSAndrew Jeffery 		return pldm_msgbuf_extract_uint16(ctx, (uint16_t *)val);
1163884c44dSAndrew Jeffery 	case PLDM_EFFECTER_DATA_SIZE_SINT16:
1173884c44dSAndrew Jeffery 		return pldm_msgbuf_extract_int16(ctx, (int16_t *)val);
1183884c44dSAndrew Jeffery 	case PLDM_EFFECTER_DATA_SIZE_UINT32:
1193884c44dSAndrew Jeffery 		return pldm_msgbuf_extract_uint32(ctx, (uint32_t *)val);
1203884c44dSAndrew Jeffery 	case PLDM_EFFECTER_DATA_SIZE_SINT32:
1213884c44dSAndrew Jeffery 		return pldm_msgbuf_extract_int32(ctx, (int32_t *)val);
1223884c44dSAndrew Jeffery 	}
1233884c44dSAndrew Jeffery 
1243884c44dSAndrew Jeffery 	return -PLDM_ERROR_INVALID_DATA;
1253884c44dSAndrew Jeffery }
1263884c44dSAndrew Jeffery 
1277992eb84SAndrew Jeffery #endif
128