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 \ "