Add numeric sensor PDR and sensor aux names PDR
1. Added struct for numeric sensor PDR in DSP0248_1.2.2 table78 and
decode_numeric_sensor_pdr_data API to unpack pdr data to struct
2. Added struct for sensor auxiliary names PDR in DSP0248_1.2.2 table83
Signed-off-by: Gilbert Chen <gilbertc@nvidia.com>
Change-Id: I11d25ee7da8326a5f5fe2c8a237ac014882e436e
diff --git a/src/msgbuf/platform.h b/src/msgbuf/platform.h
new file mode 100644
index 0000000..c10dc45
--- /dev/null
+++ b/src/msgbuf/platform.h
@@ -0,0 +1,76 @@
+#ifndef PLDM_MSGBUF_PLATFORM_H
+#define PLDM_MSGBUF_PLATFORM_H
+
+#include "../msgbuf.h"
+#include <libpldm/base.h>
+#include <libpldm/platform.h>
+
+static inline int
+pldm_msgbuf_extract_value_pdr_hdr(struct pldm_msgbuf *ctx,
+ struct pldm_value_pdr_hdr *hdr)
+{
+ pldm_msgbuf_extract(ctx, &hdr->record_handle);
+ pldm_msgbuf_extract(ctx, &hdr->version);
+ pldm_msgbuf_extract(ctx, &hdr->type);
+ pldm_msgbuf_extract(ctx, &hdr->record_change_num);
+ pldm_msgbuf_extract(ctx, &hdr->length);
+
+ return pldm_msgbuf_validate(ctx);
+}
+
+/*
+ * We use __attribute__((always_inline)) below so the compiler has visibility of
+ * the switch() at the call site. It is often the case that the size of multiple
+ * fields depends on the tag. Inlining thus gives the compiler visibility to
+ * hoist one tag-based code-path condition to cover all invocations.
+ */
+
+__attribute__((always_inline)) static inline int
+pldm_msgbuf_extract_sensor_data(struct pldm_msgbuf *ctx,
+ enum pldm_sensor_readings_data_type tag,
+ union_sensor_data_size *dst)
+{
+ switch (tag) {
+ case PLDM_SENSOR_DATA_SIZE_UINT8:
+ return pldm_msgbuf_extract(ctx, &dst->value_u8);
+ case PLDM_SENSOR_DATA_SIZE_SINT8:
+ return pldm_msgbuf_extract(ctx, &dst->value_s8);
+ case PLDM_SENSOR_DATA_SIZE_UINT16:
+ return pldm_msgbuf_extract(ctx, &dst->value_u16);
+ case PLDM_SENSOR_DATA_SIZE_SINT16:
+ return pldm_msgbuf_extract(ctx, &dst->value_s16);
+ case PLDM_SENSOR_DATA_SIZE_UINT32:
+ return pldm_msgbuf_extract(ctx, &dst->value_u32);
+ case PLDM_SENSOR_DATA_SIZE_SINT32:
+ return pldm_msgbuf_extract(ctx, &dst->value_s32);
+ }
+
+ return -PLDM_ERROR_INVALID_DATA;
+}
+
+__attribute__((always_inline)) static inline int
+pldm_msgbuf_extract_range_field_format(struct pldm_msgbuf *ctx,
+ enum pldm_range_field_format tag,
+ union_range_field_format *dst)
+{
+ switch (tag) {
+ case PLDM_RANGE_FIELD_FORMAT_UINT8:
+ return pldm_msgbuf_extract(ctx, &dst->value_u8);
+ case PLDM_RANGE_FIELD_FORMAT_SINT8:
+ return pldm_msgbuf_extract(ctx, &dst->value_s8);
+ case PLDM_RANGE_FIELD_FORMAT_UINT16:
+ return pldm_msgbuf_extract(ctx, &dst->value_u16);
+ case PLDM_RANGE_FIELD_FORMAT_SINT16:
+ return pldm_msgbuf_extract(ctx, &dst->value_s16);
+ case PLDM_RANGE_FIELD_FORMAT_UINT32:
+ return pldm_msgbuf_extract(ctx, &dst->value_u32);
+ case PLDM_RANGE_FIELD_FORMAT_SINT32:
+ return pldm_msgbuf_extract(ctx, &dst->value_s32);
+ case PLDM_RANGE_FIELD_FORMAT_REAL32:
+ return pldm_msgbuf_extract(ctx, &dst->value_f32);
+ }
+
+ return -PLDM_ERROR_INVALID_DATA;
+}
+
+#endif