xref: /openbmc/libpldm/src/msgbuf/platform.h (revision 7992eb84)
1*7992eb84SAndrew Jeffery #ifndef PLDM_MSGBUF_PLATFORM_H
2*7992eb84SAndrew Jeffery #define PLDM_MSGBUF_PLATFORM_H
3*7992eb84SAndrew Jeffery 
4*7992eb84SAndrew Jeffery #include "../msgbuf.h"
5*7992eb84SAndrew Jeffery #include <libpldm/base.h>
6*7992eb84SAndrew Jeffery #include <libpldm/platform.h>
7*7992eb84SAndrew Jeffery 
8*7992eb84SAndrew Jeffery static inline int
9*7992eb84SAndrew Jeffery pldm_msgbuf_extract_value_pdr_hdr(struct pldm_msgbuf *ctx,
10*7992eb84SAndrew Jeffery 				  struct pldm_value_pdr_hdr *hdr)
11*7992eb84SAndrew Jeffery {
12*7992eb84SAndrew Jeffery 	pldm_msgbuf_extract(ctx, &hdr->record_handle);
13*7992eb84SAndrew Jeffery 	pldm_msgbuf_extract(ctx, &hdr->version);
14*7992eb84SAndrew Jeffery 	pldm_msgbuf_extract(ctx, &hdr->type);
15*7992eb84SAndrew Jeffery 	pldm_msgbuf_extract(ctx, &hdr->record_change_num);
16*7992eb84SAndrew Jeffery 	pldm_msgbuf_extract(ctx, &hdr->length);
17*7992eb84SAndrew Jeffery 
18*7992eb84SAndrew Jeffery 	return pldm_msgbuf_validate(ctx);
19*7992eb84SAndrew Jeffery }
20*7992eb84SAndrew Jeffery 
21*7992eb84SAndrew Jeffery /*
22*7992eb84SAndrew Jeffery  * We use __attribute__((always_inline)) below so the compiler has visibility of
23*7992eb84SAndrew Jeffery  * the switch() at the call site. It is often the case that the size of multiple
24*7992eb84SAndrew Jeffery  * fields depends on the tag. Inlining thus gives the compiler visibility to
25*7992eb84SAndrew Jeffery  * hoist one tag-based code-path condition to cover all invocations.
26*7992eb84SAndrew Jeffery  */
27*7992eb84SAndrew Jeffery 
28*7992eb84SAndrew Jeffery __attribute__((always_inline)) static inline int
29*7992eb84SAndrew Jeffery pldm_msgbuf_extract_sensor_data(struct pldm_msgbuf *ctx,
30*7992eb84SAndrew Jeffery 				enum pldm_sensor_readings_data_type tag,
31*7992eb84SAndrew Jeffery 				union_sensor_data_size *dst)
32*7992eb84SAndrew Jeffery {
33*7992eb84SAndrew Jeffery 	switch (tag) {
34*7992eb84SAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_UINT8:
35*7992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_u8);
36*7992eb84SAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_SINT8:
37*7992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_s8);
38*7992eb84SAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_UINT16:
39*7992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_u16);
40*7992eb84SAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_SINT16:
41*7992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_s16);
42*7992eb84SAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_UINT32:
43*7992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_u32);
44*7992eb84SAndrew Jeffery 	case PLDM_SENSOR_DATA_SIZE_SINT32:
45*7992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_s32);
46*7992eb84SAndrew Jeffery 	}
47*7992eb84SAndrew Jeffery 
48*7992eb84SAndrew Jeffery 	return -PLDM_ERROR_INVALID_DATA;
49*7992eb84SAndrew Jeffery }
50*7992eb84SAndrew Jeffery 
51*7992eb84SAndrew Jeffery __attribute__((always_inline)) static inline int
52*7992eb84SAndrew Jeffery pldm_msgbuf_extract_range_field_format(struct pldm_msgbuf *ctx,
53*7992eb84SAndrew Jeffery 				       enum pldm_range_field_format tag,
54*7992eb84SAndrew Jeffery 				       union_range_field_format *dst)
55*7992eb84SAndrew Jeffery {
56*7992eb84SAndrew Jeffery 	switch (tag) {
57*7992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_UINT8:
58*7992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_u8);
59*7992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_SINT8:
60*7992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_s8);
61*7992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_UINT16:
62*7992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_u16);
63*7992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_SINT16:
64*7992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_s16);
65*7992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_UINT32:
66*7992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_u32);
67*7992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_SINT32:
68*7992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_s32);
69*7992eb84SAndrew Jeffery 	case PLDM_RANGE_FIELD_FORMAT_REAL32:
70*7992eb84SAndrew Jeffery 		return pldm_msgbuf_extract(ctx, &dst->value_f32);
71*7992eb84SAndrew Jeffery 	}
72*7992eb84SAndrew Jeffery 
73*7992eb84SAndrew Jeffery 	return -PLDM_ERROR_INVALID_DATA;
74*7992eb84SAndrew Jeffery }
75*7992eb84SAndrew Jeffery 
76*7992eb84SAndrew Jeffery #endif
77