libpldm-google: Adds Intel 64b sensor patch.

Tested: Built with pldmd-google-dev-common branch that needs 64b suppport.
Fusion-Link: N/A. No fusion2 link.
Google-Bug-Id: 458166668
Change-Id: I984ed51f9972712cd0fd58f7297c7c2965852997
Signed-off-by: Luka Strizic <lstrz@google.com>
diff --git a/recipes-google/pldmd/libpldm-google/0001-platform-Add-64-bit-numeric-sensor-support.patch b/recipes-google/pldmd/libpldm-google/0001-platform-Add-64-bit-numeric-sensor-support.patch
new file mode 100644
index 0000000..e07b3fa
--- /dev/null
+++ b/recipes-google/pldmd/libpldm-google/0001-platform-Add-64-bit-numeric-sensor-support.patch
@@ -0,0 +1,365 @@
+diff --git a/include/libpldm/platform.h b/include/libpldm/platform.h
+index 0f271043..8e258bfe 100644
+--- a/include/libpldm/platform.h
++++ b/include/libpldm/platform.h
+@@ -96,10 +96,11 @@ enum pldm_platform_transfer_flag {
+ #define PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH		 2
+ #define PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH	 3
+ #define PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MIN_DATA_LENGTH	 4
+-#define PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH	 7
++#define PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH	 11
+ #define PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_8BIT_DATA_LENGTH	 4
+ #define PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_16BIT_DATA_LENGTH 5
+ #define PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_32BIT_DATA_LENGTH 7
++#define PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_64BIT_DATA_LENGTH 11
+
+ /* Minimum length of data for pldmPDRRepositoryChgEvent */
+ #define PLDM_PDR_REPOSITORY_CHG_EVENT_MIN_LENGTH     2
+@@ -177,9 +178,11 @@ enum pldm_range_field_format {
+ 	PLDM_RANGE_FIELD_FORMAT_SINT16,
+ 	PLDM_RANGE_FIELD_FORMAT_UINT32,
+ 	PLDM_RANGE_FIELD_FORMAT_SINT32,
+-	PLDM_RANGE_FIELD_FORMAT_REAL32
++	PLDM_RANGE_FIELD_FORMAT_REAL32,
++	PLDM_RANGE_FIELD_FORMAT_UINT64,
++	PLDM_RANGE_FIELD_FORMAT_SINT64
+ };
+-#define PLDM_RANGE_FIELD_FORMAT_MAX PLDM_RANGE_FIELD_FORMAT_REAL32
++#define PLDM_RANGE_FIELD_FORMAT_MAX PLDM_RANGE_FIELD_FORMAT_SINT64
+
+ enum set_request { PLDM_NO_CHANGE = 0x00, PLDM_REQUEST_SET = 0x01 };
+
+@@ -401,9 +404,11 @@ enum pldm_sensor_readings_data_type {
+ 	PLDM_SENSOR_DATA_SIZE_UINT16,
+ 	PLDM_SENSOR_DATA_SIZE_SINT16,
+ 	PLDM_SENSOR_DATA_SIZE_UINT32,
+-	PLDM_SENSOR_DATA_SIZE_SINT32
++	PLDM_SENSOR_DATA_SIZE_SINT32,
++	PLDM_SENSOR_DATA_SIZE_UINT64,
++	PLDM_SENSOR_DATA_SIZE_SINT64
+ };
+-#define PLDM_SENSOR_DATA_SIZE_MAX PLDM_SENSOR_DATA_SIZE_SINT32
++#define PLDM_SENSOR_DATA_SIZE_MAX PLDM_SENSOR_DATA_SIZE_SINT64
+
+ /** @brief PLDM PlatformEventMessage response status
+  */
+@@ -783,6 +788,8 @@ typedef union {
+ 	uint32_t value_u32;
+ 	int32_t value_s32;
+ 	real32_t value_f32;
++	uint64_t value_u64;
++	int64_t value_s64;
+ } union_range_field_format;
+
+ /** @struct pldm_numeric_effecter_value_pdr
+@@ -840,6 +847,8 @@ typedef union {
+ 	int16_t value_s16;
+ 	uint32_t value_u32;
+ 	int32_t value_s32;
++	uint64_t value_u64;
++	int64_t value_s64;
+ } union_sensor_data_size;
+
+ /** @struct pldm_value_pdr_hdr
+@@ -1242,6 +1251,13 @@ struct pldm_sensor_event_numeric_sensor_state {
+ 	uint8_t present_reading[1];
+ } __attribute__((packed));
+
++struct pldm_platform_numeric_sensor_event_data {
++	uint8_t event_state;
++	uint8_t previous_event_state;
++	uint8_t sensor_data_size;
++	union_sensor_data_size present_reading;
++};
++
+ /** @struct pldm_sensor_event_sensor_op_state
+  *
+  *  structure representing sensorEventClass for SensorOpState
+@@ -2291,6 +2307,10 @@ int decode_numeric_sensor_data(const uint8_t *sensor_data,
+ 			       uint8_t *sensor_data_size,
+ 			       uint32_t *present_reading);
+
++int decode_pldm_platform_numeric_sensor_event_data(
++	const uint8_t *sensor_data, size_t sensor_data_length,
++	struct pldm_platform_numeric_sensor_event_data *event_data);
++
+ /** @brief Decode Numeric Sensor Pdr data
+  *
+  *  @param[in] pdr_data - pdr data for numeric sensor
+diff --git a/src/dsp/platform.c b/src/dsp/platform.c
+index 2577f886..60dc29a5 100644
+--- a/src/dsp/platform.c
++++ b/src/dsp/platform.c
+@@ -1798,6 +1798,9 @@ int decode_numeric_sensor_data(const uint8_t *sensor_data,
+ 		}
+ 		break;
+ 	}
++	case PLDM_SENSOR_DATA_SIZE_UINT64:
++	case PLDM_SENSOR_DATA_SIZE_SINT64:
++		return pldm_msgbuf_discard(buf, PLDM_ERROR_INVALID_DATA);
+ 	default:
+ 		return pldm_msgbuf_discard(buf, PLDM_ERROR_INVALID_DATA);
+ 	}
+@@ -1810,6 +1813,46 @@ int decode_numeric_sensor_data(const uint8_t *sensor_data,
+ 	return PLDM_SUCCESS;
+ }
+
++LIBPLDM_ABI_TESTING
++int decode_pldm_platform_numeric_sensor_event_data(
++	const uint8_t *sensor_data, size_t sensor_data_length,
++	struct pldm_platform_numeric_sensor_event_data *event_data)
++{
++	PLDM_MSGBUF_RO_DEFINE_P(buf);
++	int rc;
++
++	if (sensor_data == NULL || event_data == NULL) {
++		return PLDM_ERROR_INVALID_DATA;
++	}
++
++	rc = pldm_msgbuf_init_errno(
++		buf, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MIN_DATA_LENGTH,
++		sensor_data, sensor_data_length);
++	if (rc) {
++		return pldm_xlate_errno(rc);
++	}
++
++	pldm_msgbuf_extract_p(buf, &event_data->event_state);
++	pldm_msgbuf_extract_p(buf, &event_data->previous_event_state);
++	rc = pldm_msgbuf_extract_p(buf, &event_data->sensor_data_size);
++	if (rc) {
++		return pldm_xlate_errno(pldm_msgbuf_discard(buf, rc));
++	}
++
++	rc = pldm_msgbuf_extract_sensor_data(buf, event_data->sensor_data_size,
++					    &event_data->present_reading);
++	if (rc) {
++		return pldm_xlate_errno(pldm_msgbuf_discard(buf, rc));
++	}
++
++	rc = pldm_msgbuf_complete_consumed(buf);
++	if (rc) {
++		return pldm_xlate_errno(rc);
++	}
++
++	return PLDM_SUCCESS;
++}
++
+ LIBPLDM_ABI_STABLE
+ int decode_numeric_sensor_pdr_data(
+ 	const void *pdr_data, size_t pdr_data_length,
+@@ -2382,7 +2425,7 @@ int decode_get_sensor_reading_resp(
+ 		return pldm_xlate_errno(pldm_msgbuf_discard(buf, rc));
+ 	}
+
+-	if (*sensor_data_size > PLDM_SENSOR_DATA_SIZE_SINT32) {
++	if (*sensor_data_size > PLDM_SENSOR_DATA_SIZE_SINT64) {
+ 		return pldm_msgbuf_discard(buf, PLDM_ERROR_INVALID_DATA);
+ 	}
+
+@@ -2417,7 +2460,7 @@ int encode_get_sensor_reading_resp(uint8_t instance_id, uint8_t completion_code,
+ 		return PLDM_ERROR_INVALID_DATA;
+ 	}
+
+-	if (sensor_data_size > PLDM_EFFECTER_DATA_SIZE_SINT32) {
++	if (sensor_data_size > PLDM_SENSOR_DATA_SIZE_SINT64) {
+ 		return PLDM_ERROR_INVALID_DATA;
+ 	}
+
+@@ -2443,15 +2486,15 @@ int encode_get_sensor_reading_resp(uint8_t instance_id, uint8_t completion_code,
+ 	response->previous_state = previous_state;
+ 	response->event_state = event_state;
+
+-	if (sensor_data_size == PLDM_EFFECTER_DATA_SIZE_UINT8 ||
+-	    sensor_data_size == PLDM_EFFECTER_DATA_SIZE_SINT8) {
++	if (sensor_data_size == PLDM_SENSOR_DATA_SIZE_UINT8 ||
++	    sensor_data_size == PLDM_SENSOR_DATA_SIZE_SINT8) {
+ 		if (payload_length != PLDM_GET_SENSOR_READING_MIN_RESP_BYTES) {
+ 			return PLDM_ERROR_INVALID_LENGTH;
+ 		}
+ 		response->present_reading[0] = *present_reading;
+
+-	} else if (sensor_data_size == PLDM_EFFECTER_DATA_SIZE_UINT16 ||
+-		   sensor_data_size == PLDM_EFFECTER_DATA_SIZE_SINT16) {
++	} else if (sensor_data_size == PLDM_SENSOR_DATA_SIZE_UINT16 ||
++		   sensor_data_size == PLDM_SENSOR_DATA_SIZE_SINT16) {
+ 		if (payload_length !=
+ 		    PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 1) {
+ 			return PLDM_ERROR_INVALID_LENGTH;
+@@ -2460,8 +2503,8 @@ int encode_get_sensor_reading_resp(uint8_t instance_id, uint8_t completion_code,
+ 		val = htole16(val);
+ 		memcpy(response->present_reading, &val, 2);
+
+-	} else if (sensor_data_size == PLDM_EFFECTER_DATA_SIZE_UINT32 ||
+-		   sensor_data_size == PLDM_EFFECTER_DATA_SIZE_SINT32) {
++	} else if (sensor_data_size == PLDM_SENSOR_DATA_SIZE_UINT32 ||
++		   sensor_data_size == PLDM_SENSOR_DATA_SIZE_SINT32) {
+ 		if (payload_length !=
+ 		    PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 3) {
+ 			return PLDM_ERROR_INVALID_LENGTH;
+@@ -2469,6 +2512,16 @@ int encode_get_sensor_reading_resp(uint8_t instance_id, uint8_t completion_code,
+ 		uint32_t val = *(uint32_t *)present_reading;
+ 		val = htole32(val);
+ 		memcpy(response->present_reading, &val, 4);
++
++	} else if (sensor_data_size == PLDM_SENSOR_DATA_SIZE_UINT64 ||
++		   sensor_data_size == PLDM_SENSOR_DATA_SIZE_SINT64) {
++		if (payload_length !=
++		    PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 7) {
++			return PLDM_ERROR_INVALID_LENGTH;
++		}
++		uint64_t val = *(uint64_t *)present_reading;
++		val = htole64(val);
++		memcpy(response->present_reading, &val, 8);
+ 	}
+
+ 	return PLDM_SUCCESS;
+diff --git a/src/msgbuf.h b/src/msgbuf.h
+index 09852123..94942e3e 100644
+--- a/src/msgbuf.h
++++ b/src/msgbuf.h
+@@ -120,6 +120,14 @@
+ 	pldm_msgbuf_extract_typecheck(int32_t, pldm__msgbuf_extract_int32,     \
+ 				      dst, ctx, (void *)&(dst))
+
++#define pldm_msgbuf_extract_uint64(ctx, dst)                                   \
++	pldm_msgbuf_extract_typecheck(uint64_t, pldm__msgbuf_extract_uint64,   \
++				      dst, ctx, (void *)&(dst))
++
++#define pldm_msgbuf_extract_int64(ctx, dst)                                    \
++	pldm_msgbuf_extract_typecheck(int64_t, pldm__msgbuf_extract_int64,     \
++				      dst, ctx, (void *)&(dst))
++
+ #define pldm_msgbuf_extract_real32(ctx, dst)                                   \
+ 	pldm_msgbuf_extract_typecheck(real32_t, pldm__msgbuf_extract_real32,   \
+ 				      dst, ctx, (void *)&(dst))
+@@ -141,6 +149,8 @@
+ 		int16_t: pldm__msgbuf_extract_int16,                           \
+ 		uint32_t: pldm__msgbuf_extract_uint32,                         \
+ 		int32_t: pldm__msgbuf_extract_int32,                           \
++		uint64_t: pldm__msgbuf_extract_uint64,                         \
++		int64_t: pldm__msgbuf_extract_int64,                           \
+ 		real32_t: pldm__msgbuf_extract_real32)(ctx, (void *)&(dst))
+
+ /**
+@@ -160,6 +170,8 @@
+ 		int16_t *: pldm__msgbuf_extract_int16,                         \
+ 		uint32_t *: pldm__msgbuf_extract_uint32,                       \
+ 		int32_t *: pldm__msgbuf_extract_int32,                         \
++		uint64_t *: pldm__msgbuf_extract_uint64,                       \
++		int64_t *: pldm__msgbuf_extract_int64,                         \
+ 		real32_t *: pldm__msgbuf_extract_real32)(ctx, dst)
+
+ #define pldm_msgbuf_insert(dst, src)                                           \
+diff --git a/src/msgbuf/core.h b/src/msgbuf/core.h
+index 400a4933..20fb36dc 100644
+--- a/src/msgbuf/core.h
++++ b/src/msgbuf/core.h
+@@ -654,6 +654,66 @@ pldm__msgbuf_extract_int32(struct pldm_msgbuf_ro *ctx, void *dst)
+ 	return pldm__msgbuf_ro_invalidate(ctx);
+ }
+
++LIBPLDM_CC_NONNULL
++LIBPLDM_CC_ALWAYS_INLINE int
++// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
++pldm__msgbuf_extract_uint64(struct pldm_msgbuf_ro *ctx, void *dst)
++{
++	uint64_t ldst;
++
++	static_assert(
++		// NOLINTNEXTLINE(bugprone-sizeof-expression)
++		sizeof(ldst) < INTMAX_MAX,
++		"The following addition may not uphold the runtime assertion");
++
++	if (ctx->remaining >= (intmax_t)sizeof(ldst)) {
++		assert(ctx->cursor);
++		memcpy(&ldst, ctx->cursor, sizeof(ldst));
++		ldst = le64toh(ldst);
++		memcpy(dst, &ldst, sizeof(ldst));
++		ctx->cursor += sizeof(ldst);
++		ctx->remaining -= sizeof(ldst);
++		return 0;
++	}
++
++	if (ctx->remaining > INTMAX_MIN + (intmax_t)sizeof(ldst)) {
++		ctx->remaining -= sizeof(ldst);
++		return -EOVERFLOW;
++	}
++
++	return pldm__msgbuf_ro_invalidate(ctx);
++}
++
++LIBPLDM_CC_NONNULL
++LIBPLDM_CC_ALWAYS_INLINE int
++// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
++pldm__msgbuf_extract_int64(struct pldm_msgbuf_ro *ctx, void *dst)
++{
++	int64_t ldst;
++
++	static_assert(
++		// NOLINTNEXTLINE(bugprone-sizeof-expression)
++		sizeof(ldst) < INTMAX_MAX,
++		"The following addition may not uphold the runtime assertion");
++
++	if (ctx->remaining >= (intmax_t)sizeof(ldst)) {
++		assert(ctx->cursor);
++		memcpy(&ldst, ctx->cursor, sizeof(ldst));
++		ldst = le64toh(ldst);
++		memcpy(dst, &ldst, sizeof(ldst));
++		ctx->cursor += sizeof(ldst);
++		ctx->remaining -= sizeof(ldst);
++		return 0;
++	}
++
++	if (ctx->remaining > INTMAX_MIN + (intmax_t)sizeof(ldst)) {
++		ctx->remaining -= sizeof(ldst);
++		return -EOVERFLOW;
++	}
++
++	return pldm__msgbuf_ro_invalidate(ctx);
++}
++
+ LIBPLDM_CC_NONNULL
+ LIBPLDM_CC_ALWAYS_INLINE int
+ // NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
+diff --git a/src/msgbuf/platform.h b/src/msgbuf/platform.h
+index e27a3f15..4457bbf0 100644
+--- a/src/msgbuf/platform.h
++++ b/src/msgbuf/platform.h
+@@ -52,6 +52,10 @@ pldm_msgbuf_extract_sensor_data(struct pldm_msgbuf_ro *ctx,
+ 		return pldm_msgbuf_extract(ctx, dst->value_u32);
+ 	case PLDM_SENSOR_DATA_SIZE_SINT32:
+ 		return pldm_msgbuf_extract(ctx, dst->value_s32);
++	case PLDM_SENSOR_DATA_SIZE_UINT64:
++		return pldm_msgbuf_extract(ctx, dst->value_u64);
++	case PLDM_SENSOR_DATA_SIZE_SINT64:
++		return pldm_msgbuf_extract(ctx, dst->value_s64);
+ 	}
+
+ 	return -PLDM_ERROR_INVALID_DATA;
+@@ -80,6 +84,10 @@ pldm_msgbuf_extract_sensor_value(struct pldm_msgbuf_ro *ctx,
+ 		return pldm__msgbuf_extract_uint32(ctx, val);
+ 	case PLDM_SENSOR_DATA_SIZE_SINT32:
+ 		return pldm__msgbuf_extract_int32(ctx, val);
++	case PLDM_SENSOR_DATA_SIZE_UINT64:
++		return pldm__msgbuf_extract_uint64(ctx, val);
++	case PLDM_SENSOR_DATA_SIZE_SINT64:
++		return pldm__msgbuf_extract_int64(ctx, val);
+ 	}
+
+ 	return -PLDM_ERROR_INVALID_DATA;
+@@ -121,6 +129,14 @@ LIBPLDM_CC_ALWAYS_INLINE int pldm__msgbuf_extract_range_field_format(
+ 		return pldm__msgbuf_extract_real32(
+ 			ctx, ((char *)rff) + offsetof(union_range_field_format,
+ 						      value_f32));
++	case PLDM_RANGE_FIELD_FORMAT_UINT64:
++		return pldm__msgbuf_extract_uint64(
++			ctx, ((char *)rff) + offsetof(union_range_field_format,
++						      value_u64));
++	case PLDM_RANGE_FIELD_FORMAT_SINT64:
++		return pldm__msgbuf_extract_int64(
++			ctx, ((char *)rff) + offsetof(union_range_field_format,
++						      value_s64));
+ 	}
+
+ 	return -PLDM_ERROR_INVALID_DATA;
+
diff --git a/recipes-google/pldmd/libpldm-google_git.bb b/recipes-google/pldmd/libpldm-google_git.bb
index 8570af0..ad2d878 100644
--- a/recipes-google/pldmd/libpldm-google_git.bb
+++ b/recipes-google/pldmd/libpldm-google_git.bb
@@ -19,6 +19,7 @@
 PV = "git${SRCPV}"
 PR = "r1"
 SRC_URI = "git://github.com/openbmc/libpldm;branch=main;protocol=https \
+           file://0001-platform-Add-64-bit-numeric-sensor-support.patch \
            file://0001-Update-minimum-meson-version-to-build-with-gBMC.patch \
            "