xref: /openbmc/libpldm/src/msgbuf/platform.h (revision 3884c44d)
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 
517992eb84SAndrew Jeffery __attribute__((always_inline)) static inline int
527992eb84SAndrew Jeffery pldm_msgbuf_extract_range_field_format(struct pldm_msgbuf *ctx,
537992eb84SAndrew Jeffery 				       enum pldm_range_field_format tag,
547992eb84SAndrew Jeffery 				       union_range_field_format *dst)
557992eb84SAndrew Jeffery {
567992eb84SAndrew Jeffery 	switch (tag) {
577992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_UINT8:
587992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_u8);
597992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_SINT8:
607992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_s8);
617992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_UINT16:
627992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_u16);
637992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_SINT16:
647992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_s16);
657992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_UINT32:
667992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_u32);
677992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_SINT32:
687992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_s32);
697992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_REAL32:
707992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_f32);
717992eb84SAndrew Jeffery 	}
727992eb84SAndrew Jeffery 
737992eb84SAndrew Jeffery 	return -PLDM_ERROR_INVALID_DATA;
747992eb84SAndrew Jeffery }
757992eb84SAndrew Jeffery 
76*3884c44dSAndrew Jeffery /* This API is bad, but it's because the caller's APIs are also bad */
77*3884c44dSAndrew Jeffery __attribute__((always_inline)) static inline int
78*3884c44dSAndrew Jeffery pldm_msgbuf_extract_effecter_value(struct pldm_msgbuf *ctx,
79*3884c44dSAndrew Jeffery 				   enum pldm_effecter_data_size tag,
80*3884c44dSAndrew Jeffery 				   uint8_t *val)
81*3884c44dSAndrew Jeffery {
82*3884c44dSAndrew Jeffery 	switch (tag) {
83*3884c44dSAndrew Jeffery 	case PLDM_EFFECTER_DATA_SIZE_UINT8:
84*3884c44dSAndrew Jeffery 		return pldm_msgbuf_extract_uint8(ctx, (uint8_t *)val);
85*3884c44dSAndrew Jeffery 	case PLDM_EFFECTER_DATA_SIZE_SINT8:
86*3884c44dSAndrew Jeffery 		return pldm_msgbuf_extract_int8(ctx, (int8_t *)val);
87*3884c44dSAndrew Jeffery 	case PLDM_EFFECTER_DATA_SIZE_UINT16:
88*3884c44dSAndrew Jeffery 		return pldm_msgbuf_extract_uint16(ctx, (uint16_t *)val);
89*3884c44dSAndrew Jeffery 	case PLDM_EFFECTER_DATA_SIZE_SINT16:
90*3884c44dSAndrew Jeffery 		return pldm_msgbuf_extract_int16(ctx, (int16_t *)val);
91*3884c44dSAndrew Jeffery 	case PLDM_EFFECTER_DATA_SIZE_UINT32:
92*3884c44dSAndrew Jeffery 		return pldm_msgbuf_extract_uint32(ctx, (uint32_t *)val);
93*3884c44dSAndrew Jeffery 	case PLDM_EFFECTER_DATA_SIZE_SINT32:
94*3884c44dSAndrew Jeffery 		return pldm_msgbuf_extract_int32(ctx, (int32_t *)val);
95*3884c44dSAndrew Jeffery 	}
96*3884c44dSAndrew Jeffery 
97*3884c44dSAndrew Jeffery 	return -PLDM_ERROR_INVALID_DATA;
98*3884c44dSAndrew Jeffery }
99*3884c44dSAndrew Jeffery 
1007992eb84SAndrew Jeffery #endif
101