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