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