148761c62SAndrew Jeffery /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */ 2*f490a38fSTal Yacobi #include "dsp/base.h" 348761c62SAndrew Jeffery #include "msgbuf.h" 448761c62SAndrew Jeffery #include "msgbuf/platform.h" 548761c62SAndrew Jeffery 648761c62SAndrew Jeffery #include <libpldm/base.h> 748761c62SAndrew Jeffery #include <libpldm/platform.h> 848761c62SAndrew Jeffery #include <libpldm/pldm_types.h> 948761c62SAndrew Jeffery 1048761c62SAndrew Jeffery #include <endian.h> 1148761c62SAndrew Jeffery #include <stdint.h> 1248761c62SAndrew Jeffery #include <stdlib.h> 1348761c62SAndrew Jeffery #include <string.h> 1448761c62SAndrew Jeffery 1548761c62SAndrew Jeffery static int pldm_platform_pdr_hdr_validate(struct pldm_value_pdr_hdr *ctx, 1648761c62SAndrew Jeffery size_t lower, size_t upper) 1748761c62SAndrew Jeffery { 1848761c62SAndrew Jeffery if (ctx->length + sizeof(*ctx) < lower) { 1948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 2048761c62SAndrew Jeffery } 2148761c62SAndrew Jeffery 2248761c62SAndrew Jeffery if (ctx->length > upper) { 2348761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 2448761c62SAndrew Jeffery } 2548761c62SAndrew Jeffery 2648761c62SAndrew Jeffery return PLDM_SUCCESS; 2748761c62SAndrew Jeffery } 2848761c62SAndrew Jeffery 2948761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 3048761c62SAndrew Jeffery int encode_state_effecter_pdr( 3148761c62SAndrew Jeffery struct pldm_state_effecter_pdr *const effecter, 3248761c62SAndrew Jeffery const size_t allocation_size, 3348761c62SAndrew Jeffery const struct state_effecter_possible_states *const possible_states, 3448761c62SAndrew Jeffery const size_t possible_states_size, size_t *const actual_size) 3548761c62SAndrew Jeffery { 3648761c62SAndrew Jeffery // Encode possible states 3748761c62SAndrew Jeffery 3848761c62SAndrew Jeffery size_t calculated_possible_states_size = 0; 3948761c62SAndrew Jeffery 4048761c62SAndrew Jeffery { 4148761c62SAndrew Jeffery char *states_ptr = (char *)possible_states; 4248761c62SAndrew Jeffery char *const begin_states_ptr = states_ptr; 4348761c62SAndrew Jeffery 4448761c62SAndrew Jeffery for (int i = 0; i < effecter->composite_effecter_count; ++i) { 4548761c62SAndrew Jeffery struct state_effecter_possible_states *states = 4648761c62SAndrew Jeffery (struct state_effecter_possible_states *) 4748761c62SAndrew Jeffery states_ptr; 4848761c62SAndrew Jeffery 4948761c62SAndrew Jeffery HTOLE16(states->state_set_id); 5048761c62SAndrew Jeffery 5148761c62SAndrew Jeffery states_ptr += 5248761c62SAndrew Jeffery (sizeof(*states) - sizeof(states->states) + 5348761c62SAndrew Jeffery states->possible_states_size); 5448761c62SAndrew Jeffery } 5548761c62SAndrew Jeffery 5648761c62SAndrew Jeffery calculated_possible_states_size = states_ptr - begin_states_ptr; 5748761c62SAndrew Jeffery } 5848761c62SAndrew Jeffery 5948761c62SAndrew Jeffery // Check lengths 6048761c62SAndrew Jeffery 6148761c62SAndrew Jeffery if (possible_states_size != calculated_possible_states_size) { 6248761c62SAndrew Jeffery *actual_size = 0; 6348761c62SAndrew Jeffery return PLDM_ERROR; 6448761c62SAndrew Jeffery } 6548761c62SAndrew Jeffery 6648761c62SAndrew Jeffery *actual_size = 6748761c62SAndrew Jeffery (sizeof(struct pldm_state_effecter_pdr) + possible_states_size - 6848761c62SAndrew Jeffery sizeof(effecter->possible_states)); 6948761c62SAndrew Jeffery 7048761c62SAndrew Jeffery if (allocation_size < *actual_size) { 7148761c62SAndrew Jeffery *actual_size = 0; 7248761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 7348761c62SAndrew Jeffery } 7448761c62SAndrew Jeffery 7548761c62SAndrew Jeffery // Encode rest of PDR 7648761c62SAndrew Jeffery 7748761c62SAndrew Jeffery effecter->hdr.version = 1; 7848761c62SAndrew Jeffery effecter->hdr.type = PLDM_STATE_EFFECTER_PDR; 7948761c62SAndrew Jeffery effecter->hdr.length = *actual_size - sizeof(struct pldm_pdr_hdr); 8048761c62SAndrew Jeffery 8148761c62SAndrew Jeffery memcpy(effecter->possible_states, possible_states, 8248761c62SAndrew Jeffery possible_states_size); 8348761c62SAndrew Jeffery 8448761c62SAndrew Jeffery // Convert effecter PDR body 8548761c62SAndrew Jeffery HTOLE16(effecter->terminus_handle); 8648761c62SAndrew Jeffery HTOLE16(effecter->effecter_id); 8748761c62SAndrew Jeffery HTOLE16(effecter->entity_type); 8848761c62SAndrew Jeffery HTOLE16(effecter->entity_instance); 8948761c62SAndrew Jeffery HTOLE16(effecter->container_id); 9048761c62SAndrew Jeffery HTOLE16(effecter->effecter_semantic_id); 9148761c62SAndrew Jeffery 9248761c62SAndrew Jeffery // Convert header 9348761c62SAndrew Jeffery HTOLE32(effecter->hdr.record_handle); 9448761c62SAndrew Jeffery HTOLE16(effecter->hdr.record_change_num); 9548761c62SAndrew Jeffery HTOLE16(effecter->hdr.length); 9648761c62SAndrew Jeffery 9748761c62SAndrew Jeffery return PLDM_SUCCESS; 9848761c62SAndrew Jeffery } 9948761c62SAndrew Jeffery 10048761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 10148761c62SAndrew Jeffery int encode_state_sensor_pdr( 10248761c62SAndrew Jeffery struct pldm_state_sensor_pdr *const sensor, 10348761c62SAndrew Jeffery const size_t allocation_size, 10448761c62SAndrew Jeffery const struct state_sensor_possible_states *const possible_states, 10548761c62SAndrew Jeffery const size_t possible_states_size, size_t *const actual_size) 10648761c62SAndrew Jeffery { 10748761c62SAndrew Jeffery // Encode possible states 10848761c62SAndrew Jeffery 10948761c62SAndrew Jeffery size_t calculated_possible_states_size = 0; 11048761c62SAndrew Jeffery 11148761c62SAndrew Jeffery { 11248761c62SAndrew Jeffery char *states_ptr = (char *)possible_states; 11348761c62SAndrew Jeffery char *const begin_states_ptr = states_ptr; 11448761c62SAndrew Jeffery 11548761c62SAndrew Jeffery for (int i = 0; i < sensor->composite_sensor_count; ++i) { 11648761c62SAndrew Jeffery struct state_sensor_possible_states *states = 11748761c62SAndrew Jeffery (struct state_sensor_possible_states *) 11848761c62SAndrew Jeffery states_ptr; 11948761c62SAndrew Jeffery 12048761c62SAndrew Jeffery HTOLE16(states->state_set_id); 12148761c62SAndrew Jeffery 12248761c62SAndrew Jeffery states_ptr += 12348761c62SAndrew Jeffery (sizeof(*states) - sizeof(states->states) + 12448761c62SAndrew Jeffery states->possible_states_size); 12548761c62SAndrew Jeffery } 12648761c62SAndrew Jeffery 12748761c62SAndrew Jeffery calculated_possible_states_size = states_ptr - begin_states_ptr; 12848761c62SAndrew Jeffery } 12948761c62SAndrew Jeffery 13048761c62SAndrew Jeffery // Check lengths 13148761c62SAndrew Jeffery 13248761c62SAndrew Jeffery if (possible_states_size != calculated_possible_states_size) { 13348761c62SAndrew Jeffery *actual_size = 0; 13448761c62SAndrew Jeffery return PLDM_ERROR; 13548761c62SAndrew Jeffery } 13648761c62SAndrew Jeffery 13748761c62SAndrew Jeffery *actual_size = (sizeof(struct pldm_state_sensor_pdr) + 13848761c62SAndrew Jeffery possible_states_size - sizeof(sensor->possible_states)); 13948761c62SAndrew Jeffery 14048761c62SAndrew Jeffery if (allocation_size < *actual_size) { 14148761c62SAndrew Jeffery *actual_size = 0; 14248761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 14348761c62SAndrew Jeffery } 14448761c62SAndrew Jeffery 14548761c62SAndrew Jeffery // Encode rest of PDR 14648761c62SAndrew Jeffery 14748761c62SAndrew Jeffery sensor->hdr.version = 1; 14848761c62SAndrew Jeffery sensor->hdr.type = PLDM_STATE_SENSOR_PDR; 14948761c62SAndrew Jeffery sensor->hdr.length = *actual_size - sizeof(struct pldm_pdr_hdr); 15048761c62SAndrew Jeffery 15148761c62SAndrew Jeffery memcpy(sensor->possible_states, possible_states, possible_states_size); 15248761c62SAndrew Jeffery 15348761c62SAndrew Jeffery // Convert sensor PDR body 15448761c62SAndrew Jeffery HTOLE16(sensor->terminus_handle); 15548761c62SAndrew Jeffery HTOLE16(sensor->sensor_id); 15648761c62SAndrew Jeffery HTOLE16(sensor->entity_type); 15748761c62SAndrew Jeffery HTOLE16(sensor->entity_instance); 15848761c62SAndrew Jeffery HTOLE16(sensor->container_id); 15948761c62SAndrew Jeffery 16048761c62SAndrew Jeffery // Convert header 16148761c62SAndrew Jeffery HTOLE32(sensor->hdr.record_handle); 16248761c62SAndrew Jeffery HTOLE16(sensor->hdr.record_change_num); 16348761c62SAndrew Jeffery HTOLE16(sensor->hdr.length); 16448761c62SAndrew Jeffery 16548761c62SAndrew Jeffery return PLDM_SUCCESS; 16648761c62SAndrew Jeffery } 16748761c62SAndrew Jeffery 16848761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 16948761c62SAndrew Jeffery int encode_set_state_effecter_states_resp(uint8_t instance_id, 17048761c62SAndrew Jeffery uint8_t completion_code, 17148761c62SAndrew Jeffery struct pldm_msg *msg) 17248761c62SAndrew Jeffery { 17348761c62SAndrew Jeffery if (msg == NULL) { 17448761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 17548761c62SAndrew Jeffery } 17648761c62SAndrew Jeffery 17748761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 17848761c62SAndrew Jeffery header.msg_type = PLDM_RESPONSE; 17948761c62SAndrew Jeffery header.instance = instance_id; 18048761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 18148761c62SAndrew Jeffery header.command = PLDM_SET_STATE_EFFECTER_STATES; 18248761c62SAndrew Jeffery 18348761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 18448761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 18548761c62SAndrew Jeffery return rc; 18648761c62SAndrew Jeffery } 18748761c62SAndrew Jeffery 18848761c62SAndrew Jeffery msg->payload[0] = completion_code; 18948761c62SAndrew Jeffery 19048761c62SAndrew Jeffery return PLDM_SUCCESS; 19148761c62SAndrew Jeffery } 19248761c62SAndrew Jeffery 19348761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 19448761c62SAndrew Jeffery int encode_set_state_effecter_states_req(uint8_t instance_id, 19548761c62SAndrew Jeffery uint16_t effecter_id, 19648761c62SAndrew Jeffery uint8_t comp_effecter_count, 19748761c62SAndrew Jeffery set_effecter_state_field *field, 19848761c62SAndrew Jeffery struct pldm_msg *msg) 19948761c62SAndrew Jeffery { 20048761c62SAndrew Jeffery if (msg == NULL) { 20148761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 20248761c62SAndrew Jeffery } 20348761c62SAndrew Jeffery 20448761c62SAndrew Jeffery if (comp_effecter_count < 0x1 || comp_effecter_count > 0x8 || 20548761c62SAndrew Jeffery field == NULL) { 20648761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 20748761c62SAndrew Jeffery } 20848761c62SAndrew Jeffery 20948761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 21048761c62SAndrew Jeffery header.msg_type = PLDM_REQUEST; 21148761c62SAndrew Jeffery header.instance = instance_id; 21248761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 21348761c62SAndrew Jeffery header.command = PLDM_SET_STATE_EFFECTER_STATES; 21448761c62SAndrew Jeffery 21548761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 21648761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 21748761c62SAndrew Jeffery return rc; 21848761c62SAndrew Jeffery } 21948761c62SAndrew Jeffery 22048761c62SAndrew Jeffery struct pldm_set_state_effecter_states_req *request = 22148761c62SAndrew Jeffery (struct pldm_set_state_effecter_states_req *)msg->payload; 22248761c62SAndrew Jeffery effecter_id = htole16(effecter_id); 22348761c62SAndrew Jeffery request->effecter_id = effecter_id; 22448761c62SAndrew Jeffery request->comp_effecter_count = comp_effecter_count; 22548761c62SAndrew Jeffery memcpy(request->field, field, 22648761c62SAndrew Jeffery (sizeof(set_effecter_state_field) * comp_effecter_count)); 22748761c62SAndrew Jeffery 22848761c62SAndrew Jeffery return PLDM_SUCCESS; 22948761c62SAndrew Jeffery } 23048761c62SAndrew Jeffery 23148761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 23248761c62SAndrew Jeffery int decode_set_state_effecter_states_resp(const struct pldm_msg *msg, 23348761c62SAndrew Jeffery size_t payload_length, 23448761c62SAndrew Jeffery uint8_t *completion_code) 23548761c62SAndrew Jeffery { 23648761c62SAndrew Jeffery if (msg == NULL || completion_code == NULL) { 23748761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 23848761c62SAndrew Jeffery } 23948761c62SAndrew Jeffery 24048761c62SAndrew Jeffery *completion_code = msg->payload[0]; 24148761c62SAndrew Jeffery if (PLDM_SUCCESS != *completion_code) { 24248761c62SAndrew Jeffery return PLDM_SUCCESS; 24348761c62SAndrew Jeffery } 24448761c62SAndrew Jeffery 24548761c62SAndrew Jeffery if (payload_length > PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES) { 24648761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 24748761c62SAndrew Jeffery } 24848761c62SAndrew Jeffery 24948761c62SAndrew Jeffery return PLDM_SUCCESS; 25048761c62SAndrew Jeffery } 25148761c62SAndrew Jeffery 25248761c62SAndrew Jeffery #define PLDM_SET_STATE_EFFECTER_STATES_MIN_SIZE 3 25348761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 25448761c62SAndrew Jeffery int decode_set_state_effecter_states_req(const struct pldm_msg *msg, 25548761c62SAndrew Jeffery size_t payload_length, 25648761c62SAndrew Jeffery uint16_t *effecter_id, 25748761c62SAndrew Jeffery uint8_t *comp_effecter_count, 25848761c62SAndrew Jeffery set_effecter_state_field *field) 25948761c62SAndrew Jeffery { 26048761c62SAndrew Jeffery struct pldm_msgbuf _buf; 26148761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 26248761c62SAndrew Jeffery int rc; 26348761c62SAndrew Jeffery int i; 26448761c62SAndrew Jeffery 26548761c62SAndrew Jeffery if (msg == NULL || effecter_id == NULL || comp_effecter_count == NULL || 26648761c62SAndrew Jeffery field == NULL) { 26748761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 26848761c62SAndrew Jeffery } 26948761c62SAndrew Jeffery 27048761c62SAndrew Jeffery if (payload_length > PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES) { 27148761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 27248761c62SAndrew Jeffery } 27348761c62SAndrew Jeffery 27448761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_SET_STATE_EFFECTER_STATES_MIN_SIZE, 27548761c62SAndrew Jeffery msg->payload, payload_length); 27648761c62SAndrew Jeffery if (rc) { 27748761c62SAndrew Jeffery return rc; 27848761c62SAndrew Jeffery } 27948761c62SAndrew Jeffery 28048761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, effecter_id); 28148761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, comp_effecter_count); 28248761c62SAndrew Jeffery 28348761c62SAndrew Jeffery if (*comp_effecter_count > 8) { 28448761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 28548761c62SAndrew Jeffery } 28648761c62SAndrew Jeffery 28748761c62SAndrew Jeffery for (i = 0; i < *comp_effecter_count; i++) { 28848761c62SAndrew Jeffery pldm_msgbuf_extract(buf, field[i].set_request); 28948761c62SAndrew Jeffery pldm_msgbuf_extract(buf, field[i].effecter_state); 29048761c62SAndrew Jeffery } 29148761c62SAndrew Jeffery 29248761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 29348761c62SAndrew Jeffery } 29448761c62SAndrew Jeffery 29548761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 29648761c62SAndrew Jeffery int decode_get_pdr_req(const struct pldm_msg *msg, size_t payload_length, 29748761c62SAndrew Jeffery uint32_t *record_hndl, uint32_t *data_transfer_hndl, 29848761c62SAndrew Jeffery uint8_t *transfer_op_flag, uint16_t *request_cnt, 29948761c62SAndrew Jeffery uint16_t *record_chg_num) 30048761c62SAndrew Jeffery { 30148761c62SAndrew Jeffery struct pldm_msgbuf _buf; 30248761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 30348761c62SAndrew Jeffery int rc; 30448761c62SAndrew Jeffery 30548761c62SAndrew Jeffery if (msg == NULL || record_hndl == NULL || data_transfer_hndl == NULL || 30648761c62SAndrew Jeffery transfer_op_flag == NULL || request_cnt == NULL || 30748761c62SAndrew Jeffery record_chg_num == NULL) { 30848761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 30948761c62SAndrew Jeffery } 31048761c62SAndrew Jeffery 31148761c62SAndrew Jeffery if (payload_length != PLDM_GET_PDR_REQ_BYTES) { 31248761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 31348761c62SAndrew Jeffery } 31448761c62SAndrew Jeffery 31548761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_GET_PDR_REQ_BYTES, msg->payload, 31648761c62SAndrew Jeffery payload_length); 31748761c62SAndrew Jeffery if (rc) { 31848761c62SAndrew Jeffery return rc; 31948761c62SAndrew Jeffery } 32048761c62SAndrew Jeffery 32148761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, record_hndl); 32248761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, data_transfer_hndl); 32348761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, transfer_op_flag); 32448761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, request_cnt); 32548761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, record_chg_num); 32648761c62SAndrew Jeffery 32748761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 32848761c62SAndrew Jeffery } 32948761c62SAndrew Jeffery 33048761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 33148761c62SAndrew Jeffery int encode_get_pdr_resp(uint8_t instance_id, uint8_t completion_code, 33248761c62SAndrew Jeffery uint32_t next_record_hndl, 33348761c62SAndrew Jeffery uint32_t next_data_transfer_hndl, uint8_t transfer_flag, 33448761c62SAndrew Jeffery uint16_t resp_cnt, const uint8_t *record_data, 33548761c62SAndrew Jeffery uint8_t transfer_crc, struct pldm_msg *msg) 33648761c62SAndrew Jeffery { 33748761c62SAndrew Jeffery if (msg == NULL) { 33848761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 33948761c62SAndrew Jeffery } 34048761c62SAndrew Jeffery 34148761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 34248761c62SAndrew Jeffery header.msg_type = PLDM_RESPONSE; 34348761c62SAndrew Jeffery header.instance = instance_id; 34448761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 34548761c62SAndrew Jeffery header.command = PLDM_GET_PDR; 34648761c62SAndrew Jeffery 34748761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 34848761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 34948761c62SAndrew Jeffery return rc; 35048761c62SAndrew Jeffery } 35148761c62SAndrew Jeffery 35248761c62SAndrew Jeffery struct pldm_get_pdr_resp *response = 35348761c62SAndrew Jeffery (struct pldm_get_pdr_resp *)msg->payload; 35448761c62SAndrew Jeffery response->completion_code = completion_code; 35548761c62SAndrew Jeffery 35648761c62SAndrew Jeffery if (response->completion_code == PLDM_SUCCESS) { 35748761c62SAndrew Jeffery response->next_record_handle = htole32(next_record_hndl); 35848761c62SAndrew Jeffery response->next_data_transfer_handle = 35948761c62SAndrew Jeffery htole32(next_data_transfer_hndl); 36048761c62SAndrew Jeffery response->transfer_flag = transfer_flag; 36148761c62SAndrew Jeffery response->response_count = htole16(resp_cnt); 36248761c62SAndrew Jeffery if (record_data != NULL && resp_cnt > 0) { 36348761c62SAndrew Jeffery memcpy(response->record_data, record_data, resp_cnt); 36448761c62SAndrew Jeffery } 36548761c62SAndrew Jeffery if (transfer_flag == PLDM_END) { 36648761c62SAndrew Jeffery uint8_t *dst = msg->payload; 36748761c62SAndrew Jeffery dst += (sizeof(struct pldm_get_pdr_resp) - 1) + 36848761c62SAndrew Jeffery resp_cnt; 36948761c62SAndrew Jeffery *dst = transfer_crc; 37048761c62SAndrew Jeffery } 37148761c62SAndrew Jeffery } 37248761c62SAndrew Jeffery 37348761c62SAndrew Jeffery return PLDM_SUCCESS; 37448761c62SAndrew Jeffery } 37548761c62SAndrew Jeffery 37648761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 37748761c62SAndrew Jeffery int encode_get_pdr_repository_info_resp( 37848761c62SAndrew Jeffery uint8_t instance_id, uint8_t completion_code, uint8_t repository_state, 37948761c62SAndrew Jeffery const uint8_t *update_time, const uint8_t *oem_update_time, 38048761c62SAndrew Jeffery uint32_t record_count, uint32_t repository_size, 38148761c62SAndrew Jeffery uint32_t largest_record_size, uint8_t data_transfer_handle_timeout, 38248761c62SAndrew Jeffery struct pldm_msg *msg) 38348761c62SAndrew Jeffery { 38448761c62SAndrew Jeffery if (msg == NULL) { 38548761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 38648761c62SAndrew Jeffery } 38748761c62SAndrew Jeffery 38848761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 38948761c62SAndrew Jeffery header.msg_type = PLDM_RESPONSE; 39048761c62SAndrew Jeffery header.instance = instance_id; 39148761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 39248761c62SAndrew Jeffery header.command = PLDM_GET_PDR_REPOSITORY_INFO; 39348761c62SAndrew Jeffery 39448761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 39548761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 39648761c62SAndrew Jeffery return rc; 39748761c62SAndrew Jeffery } 39848761c62SAndrew Jeffery 39948761c62SAndrew Jeffery struct pldm_pdr_repository_info_resp *response = 40048761c62SAndrew Jeffery (struct pldm_pdr_repository_info_resp *)msg->payload; 40148761c62SAndrew Jeffery response->completion_code = completion_code; 40248761c62SAndrew Jeffery 40348761c62SAndrew Jeffery if (response->completion_code == PLDM_SUCCESS) { 40448761c62SAndrew Jeffery response->repository_state = repository_state; 40548761c62SAndrew Jeffery if (update_time != NULL) { 40648761c62SAndrew Jeffery memcpy(response->update_time, update_time, 40748761c62SAndrew Jeffery PLDM_TIMESTAMP104_SIZE); 40848761c62SAndrew Jeffery } 40948761c62SAndrew Jeffery if (oem_update_time != NULL) { 41048761c62SAndrew Jeffery memcpy(response->oem_update_time, oem_update_time, 41148761c62SAndrew Jeffery PLDM_TIMESTAMP104_SIZE); 41248761c62SAndrew Jeffery } 41348761c62SAndrew Jeffery response->record_count = htole32(record_count); 41448761c62SAndrew Jeffery response->repository_size = htole32(repository_size); 41548761c62SAndrew Jeffery response->largest_record_size = htole32(largest_record_size); 41648761c62SAndrew Jeffery response->data_transfer_handle_timeout = 41748761c62SAndrew Jeffery data_transfer_handle_timeout; 41848761c62SAndrew Jeffery } 41948761c62SAndrew Jeffery 42048761c62SAndrew Jeffery return PLDM_SUCCESS; 42148761c62SAndrew Jeffery } 42248761c62SAndrew Jeffery 42348761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 42448761c62SAndrew Jeffery int decode_get_pdr_repository_info_resp( 42548761c62SAndrew Jeffery const struct pldm_msg *msg, size_t payload_length, 42648761c62SAndrew Jeffery uint8_t *completion_code, uint8_t *repository_state, 42748761c62SAndrew Jeffery uint8_t *update_time, uint8_t *oem_update_time, uint32_t *record_count, 42848761c62SAndrew Jeffery uint32_t *repository_size, uint32_t *largest_record_size, 42948761c62SAndrew Jeffery uint8_t *data_transfer_handle_timeout) 43048761c62SAndrew Jeffery { 43148761c62SAndrew Jeffery struct pldm_msgbuf _buf; 43248761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 43348761c62SAndrew Jeffery int rc; 43448761c62SAndrew Jeffery 43548761c62SAndrew Jeffery if (msg == NULL || completion_code == NULL || 43648761c62SAndrew Jeffery repository_state == NULL || update_time == NULL || 43748761c62SAndrew Jeffery oem_update_time == NULL || record_count == NULL || 43848761c62SAndrew Jeffery repository_size == NULL || largest_record_size == NULL || 43948761c62SAndrew Jeffery data_transfer_handle_timeout == NULL) { 44048761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 44148761c62SAndrew Jeffery } 44248761c62SAndrew Jeffery 44348761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES, 44448761c62SAndrew Jeffery msg->payload, payload_length); 44548761c62SAndrew Jeffery if (rc) { 44648761c62SAndrew Jeffery return rc; 44748761c62SAndrew Jeffery } 44848761c62SAndrew Jeffery 44948761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, completion_code); 45048761c62SAndrew Jeffery if (PLDM_SUCCESS != *completion_code) { 45148761c62SAndrew Jeffery return PLDM_SUCCESS; 45248761c62SAndrew Jeffery } 45348761c62SAndrew Jeffery 45448761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, repository_state); 45548761c62SAndrew Jeffery if (*repository_state > PLDM_FAILED) { 45648761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 45748761c62SAndrew Jeffery } 45848761c62SAndrew Jeffery 45948761c62SAndrew Jeffery pldm_msgbuf_extract_array(buf, update_time, PLDM_TIMESTAMP104_SIZE); 46048761c62SAndrew Jeffery pldm_msgbuf_extract_array(buf, oem_update_time, PLDM_TIMESTAMP104_SIZE); 46148761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, record_count); 46248761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, repository_size); 46348761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, largest_record_size); 46448761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, data_transfer_handle_timeout); 46548761c62SAndrew Jeffery 46648761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 46748761c62SAndrew Jeffery } 46848761c62SAndrew Jeffery 46948761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 47048761c62SAndrew Jeffery int encode_get_pdr_req(uint8_t instance_id, uint32_t record_hndl, 47148761c62SAndrew Jeffery uint32_t data_transfer_hndl, uint8_t transfer_op_flag, 47248761c62SAndrew Jeffery uint16_t request_cnt, uint16_t record_chg_num, 47348761c62SAndrew Jeffery struct pldm_msg *msg, size_t payload_length) 47448761c62SAndrew Jeffery { 47548761c62SAndrew Jeffery if (msg == NULL) { 47648761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 47748761c62SAndrew Jeffery } 47848761c62SAndrew Jeffery 47948761c62SAndrew Jeffery if (payload_length != PLDM_GET_PDR_REQ_BYTES) { 48048761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 48148761c62SAndrew Jeffery } 48248761c62SAndrew Jeffery 48348761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 48448761c62SAndrew Jeffery header.msg_type = PLDM_REQUEST; 48548761c62SAndrew Jeffery header.instance = instance_id; 48648761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 48748761c62SAndrew Jeffery header.command = PLDM_GET_PDR; 48848761c62SAndrew Jeffery 48948761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 49048761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 49148761c62SAndrew Jeffery return rc; 49248761c62SAndrew Jeffery } 49348761c62SAndrew Jeffery 49448761c62SAndrew Jeffery struct pldm_get_pdr_req *request = 49548761c62SAndrew Jeffery (struct pldm_get_pdr_req *)msg->payload; 49648761c62SAndrew Jeffery request->record_handle = htole32(record_hndl); 49748761c62SAndrew Jeffery request->data_transfer_handle = htole32(data_transfer_hndl); 49848761c62SAndrew Jeffery request->transfer_op_flag = transfer_op_flag; 49948761c62SAndrew Jeffery request->request_count = htole16(request_cnt); 50048761c62SAndrew Jeffery request->record_change_number = htole16(record_chg_num); 50148761c62SAndrew Jeffery 50248761c62SAndrew Jeffery return PLDM_SUCCESS; 50348761c62SAndrew Jeffery } 50448761c62SAndrew Jeffery 50548761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 50648761c62SAndrew Jeffery int decode_get_pdr_resp(const struct pldm_msg *msg, size_t payload_length, 50748761c62SAndrew Jeffery uint8_t *completion_code, uint32_t *next_record_hndl, 50848761c62SAndrew Jeffery uint32_t *next_data_transfer_hndl, 50948761c62SAndrew Jeffery uint8_t *transfer_flag, uint16_t *resp_cnt, 51048761c62SAndrew Jeffery uint8_t *record_data, size_t record_data_length, 51148761c62SAndrew Jeffery uint8_t *transfer_crc) 51248761c62SAndrew Jeffery { 51348761c62SAndrew Jeffery struct pldm_msgbuf _buf; 51448761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 51548761c62SAndrew Jeffery int rc; 51648761c62SAndrew Jeffery 51748761c62SAndrew Jeffery if (msg == NULL || completion_code == NULL || 51848761c62SAndrew Jeffery next_record_hndl == NULL || next_data_transfer_hndl == NULL || 51948761c62SAndrew Jeffery transfer_flag == NULL || resp_cnt == NULL || transfer_crc == NULL) { 52048761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 52148761c62SAndrew Jeffery } 52248761c62SAndrew Jeffery 52348761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_GET_PDR_MIN_RESP_BYTES, msg->payload, 52448761c62SAndrew Jeffery payload_length); 52548761c62SAndrew Jeffery if (rc) { 52648761c62SAndrew Jeffery return rc; 52748761c62SAndrew Jeffery } 52848761c62SAndrew Jeffery 52948761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, completion_code); 53048761c62SAndrew Jeffery if (PLDM_SUCCESS != *completion_code) { 53148761c62SAndrew Jeffery return PLDM_SUCCESS; 53248761c62SAndrew Jeffery } 53348761c62SAndrew Jeffery 53448761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, next_record_hndl); 53548761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, next_data_transfer_hndl); 53648761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, transfer_flag); 53748761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, resp_cnt); 53848761c62SAndrew Jeffery if (rc) { 53948761c62SAndrew Jeffery return rc; 54048761c62SAndrew Jeffery } 54148761c62SAndrew Jeffery 54248761c62SAndrew Jeffery if (*resp_cnt > 0 && record_data != NULL) { 54348761c62SAndrew Jeffery if (record_data_length < *resp_cnt) { 54448761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 54548761c62SAndrew Jeffery } 54648761c62SAndrew Jeffery pldm_msgbuf_extract_array(buf, record_data, *resp_cnt); 54748761c62SAndrew Jeffery } 54848761c62SAndrew Jeffery 54948761c62SAndrew Jeffery if (*transfer_flag == PLDM_END) { 55048761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, transfer_crc); 55148761c62SAndrew Jeffery } 55248761c62SAndrew Jeffery 55348761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 55448761c62SAndrew Jeffery } 55548761c62SAndrew Jeffery 55648761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 55748761c62SAndrew Jeffery int decode_set_numeric_effecter_value_req(const struct pldm_msg *msg, 55848761c62SAndrew Jeffery size_t payload_length, 55948761c62SAndrew Jeffery uint16_t *effecter_id, 56048761c62SAndrew Jeffery uint8_t *effecter_data_size, 56148761c62SAndrew Jeffery uint8_t effecter_value[4]) 56248761c62SAndrew Jeffery { 56348761c62SAndrew Jeffery struct pldm_msgbuf _buf; 56448761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 56548761c62SAndrew Jeffery int rc; 56648761c62SAndrew Jeffery 56748761c62SAndrew Jeffery if (msg == NULL || effecter_id == NULL || effecter_data_size == NULL || 56848761c62SAndrew Jeffery effecter_value == NULL) { 56948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 57048761c62SAndrew Jeffery } 57148761c62SAndrew Jeffery 57248761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, 57348761c62SAndrew Jeffery PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES, 57448761c62SAndrew Jeffery msg->payload, payload_length); 57548761c62SAndrew Jeffery if (rc) { 57648761c62SAndrew Jeffery return rc; 57748761c62SAndrew Jeffery } 57848761c62SAndrew Jeffery 57948761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, effecter_id); 58048761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, effecter_data_size); 58148761c62SAndrew Jeffery if (rc) { 58248761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 58348761c62SAndrew Jeffery } 58448761c62SAndrew Jeffery 58548761c62SAndrew Jeffery if (*effecter_data_size > PLDM_EFFECTER_DATA_SIZE_SINT32) { 58648761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 58748761c62SAndrew Jeffery } 58848761c62SAndrew Jeffery 58948761c62SAndrew Jeffery pldm_msgbuf_extract_effecter_value(buf, *effecter_data_size, 59048761c62SAndrew Jeffery effecter_value); 59148761c62SAndrew Jeffery 59248761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 59348761c62SAndrew Jeffery } 59448761c62SAndrew Jeffery 59548761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 59648761c62SAndrew Jeffery int encode_set_numeric_effecter_value_resp(uint8_t instance_id, 59748761c62SAndrew Jeffery uint8_t completion_code, 59848761c62SAndrew Jeffery struct pldm_msg *msg, 59948761c62SAndrew Jeffery size_t payload_length) 60048761c62SAndrew Jeffery { 60148761c62SAndrew Jeffery if (msg == NULL) { 60248761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 60348761c62SAndrew Jeffery } 60448761c62SAndrew Jeffery 60548761c62SAndrew Jeffery if (payload_length != PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES) { 60648761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 60748761c62SAndrew Jeffery } 60848761c62SAndrew Jeffery 60948761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 61048761c62SAndrew Jeffery header.msg_type = PLDM_RESPONSE; 61148761c62SAndrew Jeffery header.instance = instance_id; 61248761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 61348761c62SAndrew Jeffery header.command = PLDM_SET_NUMERIC_EFFECTER_VALUE; 61448761c62SAndrew Jeffery 61548761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 61648761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 61748761c62SAndrew Jeffery return rc; 61848761c62SAndrew Jeffery } 61948761c62SAndrew Jeffery 62048761c62SAndrew Jeffery msg->payload[0] = completion_code; 62148761c62SAndrew Jeffery 62248761c62SAndrew Jeffery return rc; 62348761c62SAndrew Jeffery } 62448761c62SAndrew Jeffery 62548761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 62648761c62SAndrew Jeffery int encode_set_numeric_effecter_value_req(uint8_t instance_id, 62748761c62SAndrew Jeffery uint16_t effecter_id, 62848761c62SAndrew Jeffery uint8_t effecter_data_size, 62948761c62SAndrew Jeffery const uint8_t *effecter_value, 63048761c62SAndrew Jeffery struct pldm_msg *msg, 63148761c62SAndrew Jeffery size_t payload_length) 63248761c62SAndrew Jeffery { 63348761c62SAndrew Jeffery if (msg == NULL || effecter_value == NULL) { 63448761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 63548761c62SAndrew Jeffery } 63648761c62SAndrew Jeffery 63748761c62SAndrew Jeffery if (effecter_data_size > PLDM_EFFECTER_DATA_SIZE_SINT32) { 63848761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 63948761c62SAndrew Jeffery } 64048761c62SAndrew Jeffery 64148761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 64248761c62SAndrew Jeffery header.msg_type = PLDM_REQUEST; 64348761c62SAndrew Jeffery header.instance = instance_id; 64448761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 64548761c62SAndrew Jeffery header.command = PLDM_SET_NUMERIC_EFFECTER_VALUE; 64648761c62SAndrew Jeffery 64748761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 64848761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 64948761c62SAndrew Jeffery return rc; 65048761c62SAndrew Jeffery } 65148761c62SAndrew Jeffery 65248761c62SAndrew Jeffery struct pldm_set_numeric_effecter_value_req *request = 65348761c62SAndrew Jeffery (struct pldm_set_numeric_effecter_value_req *)msg->payload; 65448761c62SAndrew Jeffery if (effecter_data_size == PLDM_EFFECTER_DATA_SIZE_UINT8 || 65548761c62SAndrew Jeffery effecter_data_size == PLDM_EFFECTER_DATA_SIZE_SINT8) { 65648761c62SAndrew Jeffery if (payload_length != 65748761c62SAndrew Jeffery PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES) { 65848761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 65948761c62SAndrew Jeffery } 66048761c62SAndrew Jeffery request->effecter_value[0] = *effecter_value; 66148761c62SAndrew Jeffery } else if (effecter_data_size == PLDM_EFFECTER_DATA_SIZE_UINT16 || 66248761c62SAndrew Jeffery effecter_data_size == PLDM_EFFECTER_DATA_SIZE_SINT16) { 66348761c62SAndrew Jeffery if (payload_length != 66448761c62SAndrew Jeffery PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 1) { 66548761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 66648761c62SAndrew Jeffery } 66748761c62SAndrew Jeffery 66848761c62SAndrew Jeffery uint16_t val = *(uint16_t *)(effecter_value); 66948761c62SAndrew Jeffery val = htole16(val); 67048761c62SAndrew Jeffery memcpy(request->effecter_value, &val, sizeof(uint16_t)); 67148761c62SAndrew Jeffery 67248761c62SAndrew Jeffery } else if (effecter_data_size == PLDM_EFFECTER_DATA_SIZE_UINT32 || 67348761c62SAndrew Jeffery effecter_data_size == PLDM_EFFECTER_DATA_SIZE_SINT32) { 67448761c62SAndrew Jeffery if (payload_length != 67548761c62SAndrew Jeffery PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 3) { 67648761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 67748761c62SAndrew Jeffery } 67848761c62SAndrew Jeffery 67948761c62SAndrew Jeffery uint32_t val = *(uint32_t *)(effecter_value); 68048761c62SAndrew Jeffery val = htole32(val); 68148761c62SAndrew Jeffery memcpy(request->effecter_value, &val, sizeof(uint32_t)); 68248761c62SAndrew Jeffery } 68348761c62SAndrew Jeffery 68448761c62SAndrew Jeffery request->effecter_id = htole16(effecter_id); 68548761c62SAndrew Jeffery request->effecter_data_size = effecter_data_size; 68648761c62SAndrew Jeffery 68748761c62SAndrew Jeffery return PLDM_SUCCESS; 68848761c62SAndrew Jeffery } 68948761c62SAndrew Jeffery 69048761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 69148761c62SAndrew Jeffery int decode_set_numeric_effecter_value_resp(const struct pldm_msg *msg, 69248761c62SAndrew Jeffery size_t payload_length, 69348761c62SAndrew Jeffery uint8_t *completion_code) 69448761c62SAndrew Jeffery { 69548761c62SAndrew Jeffery if (msg == NULL || completion_code == NULL) { 69648761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 69748761c62SAndrew Jeffery } 69848761c62SAndrew Jeffery 69948761c62SAndrew Jeffery if (payload_length != PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES) { 70048761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 70148761c62SAndrew Jeffery } 70248761c62SAndrew Jeffery 70348761c62SAndrew Jeffery *completion_code = msg->payload[0]; 70448761c62SAndrew Jeffery 70548761c62SAndrew Jeffery return PLDM_SUCCESS; 70648761c62SAndrew Jeffery } 70748761c62SAndrew Jeffery 70848761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 70948761c62SAndrew Jeffery int encode_get_state_sensor_readings_resp(uint8_t instance_id, 71048761c62SAndrew Jeffery uint8_t completion_code, 71148761c62SAndrew Jeffery uint8_t comp_sensor_count, 71248761c62SAndrew Jeffery get_sensor_state_field *field, 71348761c62SAndrew Jeffery struct pldm_msg *msg) 71448761c62SAndrew Jeffery { 71548761c62SAndrew Jeffery if (msg == NULL) { 71648761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 71748761c62SAndrew Jeffery } 71848761c62SAndrew Jeffery 71948761c62SAndrew Jeffery if (comp_sensor_count < 0x1 || comp_sensor_count > 0x8) { 72048761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 72148761c62SAndrew Jeffery } 72248761c62SAndrew Jeffery 72348761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 72448761c62SAndrew Jeffery header.msg_type = PLDM_RESPONSE; 72548761c62SAndrew Jeffery header.instance = instance_id; 72648761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 72748761c62SAndrew Jeffery header.command = PLDM_GET_STATE_SENSOR_READINGS; 72848761c62SAndrew Jeffery 72948761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 73048761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 73148761c62SAndrew Jeffery return rc; 73248761c62SAndrew Jeffery } 73348761c62SAndrew Jeffery 73448761c62SAndrew Jeffery struct pldm_get_state_sensor_readings_resp *response = 73548761c62SAndrew Jeffery (struct pldm_get_state_sensor_readings_resp *)msg->payload; 73648761c62SAndrew Jeffery 73748761c62SAndrew Jeffery response->completion_code = completion_code; 73848761c62SAndrew Jeffery response->comp_sensor_count = comp_sensor_count; 73948761c62SAndrew Jeffery memcpy(response->field, field, 74048761c62SAndrew Jeffery (sizeof(get_sensor_state_field) * comp_sensor_count)); 74148761c62SAndrew Jeffery 74248761c62SAndrew Jeffery return PLDM_SUCCESS; 74348761c62SAndrew Jeffery } 74448761c62SAndrew Jeffery 74548761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 74648761c62SAndrew Jeffery int encode_get_state_sensor_readings_req(uint8_t instance_id, 74748761c62SAndrew Jeffery uint16_t sensor_id, 74848761c62SAndrew Jeffery bitfield8_t sensor_rearm, 74948761c62SAndrew Jeffery uint8_t reserved, struct pldm_msg *msg) 75048761c62SAndrew Jeffery { 75148761c62SAndrew Jeffery if (msg == NULL) { 75248761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 75348761c62SAndrew Jeffery } 75448761c62SAndrew Jeffery 75548761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 75648761c62SAndrew Jeffery header.msg_type = PLDM_REQUEST; 75748761c62SAndrew Jeffery header.instance = instance_id; 75848761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 75948761c62SAndrew Jeffery header.command = PLDM_GET_STATE_SENSOR_READINGS; 76048761c62SAndrew Jeffery 76148761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 76248761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 76348761c62SAndrew Jeffery return rc; 76448761c62SAndrew Jeffery } 76548761c62SAndrew Jeffery 76648761c62SAndrew Jeffery struct pldm_get_state_sensor_readings_req *request = 76748761c62SAndrew Jeffery (struct pldm_get_state_sensor_readings_req *)msg->payload; 76848761c62SAndrew Jeffery 76948761c62SAndrew Jeffery request->sensor_id = htole16(sensor_id); 77048761c62SAndrew Jeffery request->reserved = reserved; 77148761c62SAndrew Jeffery request->sensor_rearm = sensor_rearm; 77248761c62SAndrew Jeffery 77348761c62SAndrew Jeffery return PLDM_SUCCESS; 77448761c62SAndrew Jeffery } 77548761c62SAndrew Jeffery 77648761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 77748761c62SAndrew Jeffery int decode_get_state_sensor_readings_resp(const struct pldm_msg *msg, 77848761c62SAndrew Jeffery size_t payload_length, 77948761c62SAndrew Jeffery uint8_t *completion_code, 78048761c62SAndrew Jeffery uint8_t *comp_sensor_count, 78148761c62SAndrew Jeffery get_sensor_state_field *field) 78248761c62SAndrew Jeffery { 78348761c62SAndrew Jeffery struct pldm_msgbuf _buf; 78448761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 78548761c62SAndrew Jeffery uint8_t i; 78648761c62SAndrew Jeffery int rc; 78748761c62SAndrew Jeffery 78848761c62SAndrew Jeffery if (msg == NULL || completion_code == NULL || 78948761c62SAndrew Jeffery comp_sensor_count == NULL || field == NULL) { 79048761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 79148761c62SAndrew Jeffery } 79248761c62SAndrew Jeffery 79348761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, 79448761c62SAndrew Jeffery PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES, 79548761c62SAndrew Jeffery msg->payload, payload_length); 79648761c62SAndrew Jeffery if (rc) { 79748761c62SAndrew Jeffery return rc; 79848761c62SAndrew Jeffery } 79948761c62SAndrew Jeffery 80048761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, completion_code); 80148761c62SAndrew Jeffery if (rc) { 80248761c62SAndrew Jeffery return rc; 80348761c62SAndrew Jeffery } 80448761c62SAndrew Jeffery 80548761c62SAndrew Jeffery if (PLDM_SUCCESS != *completion_code) { 80648761c62SAndrew Jeffery return PLDM_SUCCESS; 80748761c62SAndrew Jeffery } 80848761c62SAndrew Jeffery 80948761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, comp_sensor_count); 81048761c62SAndrew Jeffery if (rc) { 81148761c62SAndrew Jeffery return rc; 81248761c62SAndrew Jeffery } 81348761c62SAndrew Jeffery 81448761c62SAndrew Jeffery if (*comp_sensor_count < 0x1 || *comp_sensor_count > 0x8) { 81548761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 81648761c62SAndrew Jeffery } 81748761c62SAndrew Jeffery 81848761c62SAndrew Jeffery for (i = 0; i < *comp_sensor_count; i++) { 81948761c62SAndrew Jeffery pldm_msgbuf_extract(buf, field[i].sensor_op_state); 82048761c62SAndrew Jeffery pldm_msgbuf_extract(buf, field[i].present_state); 82148761c62SAndrew Jeffery pldm_msgbuf_extract(buf, field[i].previous_state); 82248761c62SAndrew Jeffery pldm_msgbuf_extract(buf, field[i].event_state); 82348761c62SAndrew Jeffery } 82448761c62SAndrew Jeffery 82548761c62SAndrew Jeffery return pldm_msgbuf_destroy_consumed(buf); 82648761c62SAndrew Jeffery } 82748761c62SAndrew Jeffery 82848761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 82948761c62SAndrew Jeffery int decode_get_state_sensor_readings_req(const struct pldm_msg *msg, 83048761c62SAndrew Jeffery size_t payload_length, 83148761c62SAndrew Jeffery uint16_t *sensor_id, 83248761c62SAndrew Jeffery bitfield8_t *sensor_rearm, 83348761c62SAndrew Jeffery uint8_t *reserved) 83448761c62SAndrew Jeffery { 83548761c62SAndrew Jeffery struct pldm_msgbuf _buf; 83648761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 83748761c62SAndrew Jeffery int rc; 83848761c62SAndrew Jeffery 83948761c62SAndrew Jeffery if (msg == NULL || sensor_id == NULL || sensor_rearm == NULL) { 84048761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 84148761c62SAndrew Jeffery } 84248761c62SAndrew Jeffery 84348761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES, 84448761c62SAndrew Jeffery msg->payload, payload_length); 84548761c62SAndrew Jeffery if (rc) { 84648761c62SAndrew Jeffery return rc; 84748761c62SAndrew Jeffery } 84848761c62SAndrew Jeffery 84948761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, sensor_id); 85048761c62SAndrew Jeffery pldm_msgbuf_extract(buf, sensor_rearm->byte); 85148761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, reserved); 85248761c62SAndrew Jeffery 85348761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 85448761c62SAndrew Jeffery } 85548761c62SAndrew Jeffery 85648761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 85748761c62SAndrew Jeffery int encode_sensor_event_data( 85848761c62SAndrew Jeffery struct pldm_sensor_event_data *const event_data, 85948761c62SAndrew Jeffery const size_t event_data_size, const uint16_t sensor_id, 86048761c62SAndrew Jeffery const enum sensor_event_class_states sensor_event_class, 86148761c62SAndrew Jeffery const uint8_t sensor_offset, const uint8_t event_state, 86248761c62SAndrew Jeffery const uint8_t previous_event_state, 86348761c62SAndrew Jeffery size_t *const actual_event_data_size) 86448761c62SAndrew Jeffery { 86548761c62SAndrew Jeffery *actual_event_data_size = 86648761c62SAndrew Jeffery (sizeof(*event_data) - sizeof(event_data->event_class) + 86748761c62SAndrew Jeffery sizeof(struct pldm_sensor_event_state_sensor_state)); 86848761c62SAndrew Jeffery 86948761c62SAndrew Jeffery if (!event_data) { 87048761c62SAndrew Jeffery return PLDM_SUCCESS; 87148761c62SAndrew Jeffery } 87248761c62SAndrew Jeffery 87348761c62SAndrew Jeffery if (event_data_size < *actual_event_data_size) { 87448761c62SAndrew Jeffery *actual_event_data_size = 0; 87548761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 87648761c62SAndrew Jeffery } 87748761c62SAndrew Jeffery 87848761c62SAndrew Jeffery event_data->sensor_id = htole16(sensor_id); 87948761c62SAndrew Jeffery event_data->sensor_event_class_type = sensor_event_class; 88048761c62SAndrew Jeffery 88148761c62SAndrew Jeffery struct pldm_sensor_event_state_sensor_state *const state_data = 88248761c62SAndrew Jeffery (struct pldm_sensor_event_state_sensor_state *) 88348761c62SAndrew Jeffery event_data->event_class; 88448761c62SAndrew Jeffery 88548761c62SAndrew Jeffery state_data->sensor_offset = sensor_offset; 88648761c62SAndrew Jeffery state_data->event_state = event_state; 88748761c62SAndrew Jeffery state_data->previous_event_state = previous_event_state; 88848761c62SAndrew Jeffery 88948761c62SAndrew Jeffery return PLDM_SUCCESS; 89048761c62SAndrew Jeffery } 89148761c62SAndrew Jeffery 89248761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 89348761c62SAndrew Jeffery int decode_platform_event_message_req(const struct pldm_msg *msg, 89448761c62SAndrew Jeffery size_t payload_length, 89548761c62SAndrew Jeffery uint8_t *format_version, uint8_t *tid, 89648761c62SAndrew Jeffery uint8_t *event_class, 89748761c62SAndrew Jeffery size_t *event_data_offset) 89848761c62SAndrew Jeffery { 89948761c62SAndrew Jeffery struct pldm_msgbuf _buf; 90048761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 90148761c62SAndrew Jeffery int rc; 90248761c62SAndrew Jeffery 90348761c62SAndrew Jeffery if (msg == NULL || format_version == NULL || tid == NULL || 90448761c62SAndrew Jeffery event_class == NULL || event_data_offset == NULL) { 90548761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 90648761c62SAndrew Jeffery } 90748761c62SAndrew Jeffery 90848761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES, 90948761c62SAndrew Jeffery msg->payload, payload_length); 91048761c62SAndrew Jeffery if (rc) { 91148761c62SAndrew Jeffery return rc; 91248761c62SAndrew Jeffery } 91348761c62SAndrew Jeffery 91448761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, format_version); 91548761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, tid); 91648761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, event_class); 91748761c62SAndrew Jeffery *event_data_offset = 91848761c62SAndrew Jeffery sizeof(*format_version) + sizeof(*tid) + sizeof(*event_class); 91948761c62SAndrew Jeffery 92048761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 92148761c62SAndrew Jeffery } 92248761c62SAndrew Jeffery 92348761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 92448761c62SAndrew Jeffery int decode_poll_for_platform_event_message_req( 92548761c62SAndrew Jeffery const struct pldm_msg *msg, size_t payload_length, 92648761c62SAndrew Jeffery uint8_t *format_version, uint8_t *transfer_operation_flag, 92748761c62SAndrew Jeffery uint32_t *data_transfer_handle, uint16_t *event_id_to_acknowledge) 92848761c62SAndrew Jeffery { 92948761c62SAndrew Jeffery struct pldm_msgbuf _buf; 93048761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 93148761c62SAndrew Jeffery int rc; 93248761c62SAndrew Jeffery 93348761c62SAndrew Jeffery if (msg == NULL) { 93448761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 93548761c62SAndrew Jeffery } 93648761c62SAndrew Jeffery 93748761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, 93848761c62SAndrew Jeffery PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES, 93948761c62SAndrew Jeffery msg->payload, payload_length); 94048761c62SAndrew Jeffery if (rc) { 94148761c62SAndrew Jeffery return rc; 94248761c62SAndrew Jeffery } 94348761c62SAndrew Jeffery 94448761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, format_version); 94548761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, transfer_operation_flag); 94648761c62SAndrew Jeffery if (rc) { 94748761c62SAndrew Jeffery return rc; 94848761c62SAndrew Jeffery } 94948761c62SAndrew Jeffery if (*transfer_operation_flag > PLDM_ACKNOWLEDGEMENT_ONLY) { 95048761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 95148761c62SAndrew Jeffery } 95248761c62SAndrew Jeffery 95348761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, data_transfer_handle); 95448761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, event_id_to_acknowledge); 95548761c62SAndrew Jeffery if (rc) { 95648761c62SAndrew Jeffery return rc; 95748761c62SAndrew Jeffery } 95848761c62SAndrew Jeffery 95948761c62SAndrew Jeffery if (!(((*transfer_operation_flag == PLDM_GET_NEXTPART) && 96048761c62SAndrew Jeffery (*event_id_to_acknowledge == 0xffff)) || 96148761c62SAndrew Jeffery ((*transfer_operation_flag == PLDM_GET_FIRSTPART) && 96248761c62SAndrew Jeffery (*event_id_to_acknowledge == 0x000)) || 96348761c62SAndrew Jeffery (*transfer_operation_flag == PLDM_ACKNOWLEDGEMENT_ONLY))) { 96448761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 96548761c62SAndrew Jeffery } 96648761c62SAndrew Jeffery 96748761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 96848761c62SAndrew Jeffery } 96948761c62SAndrew Jeffery 97048761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 97148761c62SAndrew Jeffery int encode_platform_event_message_resp(uint8_t instance_id, 97248761c62SAndrew Jeffery uint8_t completion_code, 97348761c62SAndrew Jeffery uint8_t platform_event_status, 97448761c62SAndrew Jeffery struct pldm_msg *msg) 97548761c62SAndrew Jeffery { 97648761c62SAndrew Jeffery if (msg == NULL) { 97748761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 97848761c62SAndrew Jeffery } 97948761c62SAndrew Jeffery 98048761c62SAndrew Jeffery if (platform_event_status > PLDM_EVENT_LOGGING_REJECTED) { 98148761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 98248761c62SAndrew Jeffery } 98348761c62SAndrew Jeffery 98448761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 98548761c62SAndrew Jeffery header.msg_type = PLDM_RESPONSE; 98648761c62SAndrew Jeffery header.instance = instance_id; 98748761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 98848761c62SAndrew Jeffery header.command = PLDM_PLATFORM_EVENT_MESSAGE; 98948761c62SAndrew Jeffery 99048761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 99148761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 99248761c62SAndrew Jeffery return rc; 99348761c62SAndrew Jeffery } 99448761c62SAndrew Jeffery 99548761c62SAndrew Jeffery struct pldm_platform_event_message_resp *response = 99648761c62SAndrew Jeffery (struct pldm_platform_event_message_resp *)msg->payload; 99748761c62SAndrew Jeffery response->completion_code = completion_code; 99848761c62SAndrew Jeffery response->platform_event_status = platform_event_status; 99948761c62SAndrew Jeffery 100048761c62SAndrew Jeffery return PLDM_SUCCESS; 100148761c62SAndrew Jeffery } 100248761c62SAndrew Jeffery 100348761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 100448761c62SAndrew Jeffery int encode_poll_for_platform_event_message_resp( 100548761c62SAndrew Jeffery uint8_t instance_id, uint8_t completion_code, uint8_t tid, 100648761c62SAndrew Jeffery uint16_t event_id, uint32_t next_data_transfer_handle, 100748761c62SAndrew Jeffery uint8_t transfer_flag, uint8_t event_class, uint32_t event_data_size, 100848761c62SAndrew Jeffery uint8_t *event_data, uint32_t checksum, struct pldm_msg *msg, 100948761c62SAndrew Jeffery size_t payload_length) 101048761c62SAndrew Jeffery { 101148761c62SAndrew Jeffery struct pldm_msgbuf _buf; 101248761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 101348761c62SAndrew Jeffery int rc; 101448761c62SAndrew Jeffery 101548761c62SAndrew Jeffery if (!msg) { 101648761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 101748761c62SAndrew Jeffery } 101848761c62SAndrew Jeffery 101948761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 102048761c62SAndrew Jeffery header.msg_type = PLDM_RESPONSE; 102148761c62SAndrew Jeffery header.instance = instance_id; 102248761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 102348761c62SAndrew Jeffery header.command = PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE; 102448761c62SAndrew Jeffery 102548761c62SAndrew Jeffery rc = pack_pldm_header(&header, &(msg->hdr)); 102648761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 102748761c62SAndrew Jeffery return rc; 102848761c62SAndrew Jeffery } 102948761c62SAndrew Jeffery 103048761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc( 103148761c62SAndrew Jeffery buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES, 103248761c62SAndrew Jeffery msg->payload, payload_length); 103348761c62SAndrew Jeffery if (rc) { 103448761c62SAndrew Jeffery return rc; 103548761c62SAndrew Jeffery } 103648761c62SAndrew Jeffery 103748761c62SAndrew Jeffery pldm_msgbuf_insert(buf, completion_code); 103848761c62SAndrew Jeffery pldm_msgbuf_insert(buf, tid); 103948761c62SAndrew Jeffery pldm_msgbuf_insert(buf, event_id); 104048761c62SAndrew Jeffery 104148761c62SAndrew Jeffery if (event_id == 0xffff || event_id == 0x0000) { 104248761c62SAndrew Jeffery if (PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES != 104348761c62SAndrew Jeffery payload_length) { 104448761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 104548761c62SAndrew Jeffery } 104648761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 104748761c62SAndrew Jeffery } 104848761c62SAndrew Jeffery 104948761c62SAndrew Jeffery if ((event_data == NULL) && (event_data_size > 0)) { 105048761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 105148761c62SAndrew Jeffery } 105248761c62SAndrew Jeffery 105348761c62SAndrew Jeffery pldm_msgbuf_insert(buf, next_data_transfer_handle); 105448761c62SAndrew Jeffery pldm_msgbuf_insert(buf, transfer_flag); 105548761c62SAndrew Jeffery pldm_msgbuf_insert(buf, event_class); 105648761c62SAndrew Jeffery pldm_msgbuf_insert(buf, event_data_size); 105748761c62SAndrew Jeffery 105848761c62SAndrew Jeffery if ((event_data_size > 0) && event_data) { 105948761c62SAndrew Jeffery pldm_msgbuf_insert_array(buf, event_data, event_data_size); 106048761c62SAndrew Jeffery } 106148761c62SAndrew Jeffery 106248761c62SAndrew Jeffery if (transfer_flag == PLDM_END || transfer_flag == PLDM_START_AND_END) { 106348761c62SAndrew Jeffery pldm_msgbuf_insert(buf, checksum); 106448761c62SAndrew Jeffery } 106548761c62SAndrew Jeffery 106648761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 106748761c62SAndrew Jeffery } 106848761c62SAndrew Jeffery 106948761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 107048761c62SAndrew Jeffery int encode_platform_event_message_req( 107148761c62SAndrew Jeffery uint8_t instance_id, uint8_t format_version, uint8_t tid, 107248761c62SAndrew Jeffery uint8_t event_class, const uint8_t *event_data, 107348761c62SAndrew Jeffery size_t event_data_length, struct pldm_msg *msg, size_t payload_length) 107448761c62SAndrew Jeffery 107548761c62SAndrew Jeffery { 107648761c62SAndrew Jeffery if (format_version != 1) { 107748761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 107848761c62SAndrew Jeffery } 107948761c62SAndrew Jeffery 108048761c62SAndrew Jeffery if (msg == NULL || event_data == NULL) { 108148761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 108248761c62SAndrew Jeffery } 108348761c62SAndrew Jeffery 108448761c62SAndrew Jeffery if (event_data_length == 0) { 108548761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 108648761c62SAndrew Jeffery } 108748761c62SAndrew Jeffery 108848761c62SAndrew Jeffery if (payload_length != 108948761c62SAndrew Jeffery PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES + event_data_length) { 109048761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 109148761c62SAndrew Jeffery } 109248761c62SAndrew Jeffery 109348761c62SAndrew Jeffery if (event_class > PLDM_HEARTBEAT_TIMER_ELAPSED_EVENT && 109448761c62SAndrew Jeffery !(event_class >= 0xf0 && event_class <= 0xfe)) { 109548761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 109648761c62SAndrew Jeffery } 109748761c62SAndrew Jeffery 109848761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 109948761c62SAndrew Jeffery header.msg_type = PLDM_REQUEST; 110048761c62SAndrew Jeffery header.instance = instance_id; 110148761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 110248761c62SAndrew Jeffery header.command = PLDM_PLATFORM_EVENT_MESSAGE; 110348761c62SAndrew Jeffery 110448761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 110548761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 110648761c62SAndrew Jeffery return rc; 110748761c62SAndrew Jeffery } 110848761c62SAndrew Jeffery 110948761c62SAndrew Jeffery struct pldm_platform_event_message_req *request = 111048761c62SAndrew Jeffery (struct pldm_platform_event_message_req *)msg->payload; 111148761c62SAndrew Jeffery request->format_version = format_version; 111248761c62SAndrew Jeffery request->tid = tid; 111348761c62SAndrew Jeffery request->event_class = event_class; 111448761c62SAndrew Jeffery memcpy(request->event_data, event_data, event_data_length); 111548761c62SAndrew Jeffery 111648761c62SAndrew Jeffery return PLDM_SUCCESS; 111748761c62SAndrew Jeffery } 111848761c62SAndrew Jeffery 111948761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 112048761c62SAndrew Jeffery int decode_platform_event_message_resp(const struct pldm_msg *msg, 112148761c62SAndrew Jeffery size_t payload_length, 112248761c62SAndrew Jeffery uint8_t *completion_code, 112348761c62SAndrew Jeffery uint8_t *platform_event_status) 112448761c62SAndrew Jeffery { 112548761c62SAndrew Jeffery struct pldm_msgbuf _buf; 112648761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 112748761c62SAndrew Jeffery int rc; 112848761c62SAndrew Jeffery 112948761c62SAndrew Jeffery if (msg == NULL || completion_code == NULL || 113048761c62SAndrew Jeffery platform_event_status == NULL) { 113148761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 113248761c62SAndrew Jeffery } 113348761c62SAndrew Jeffery 113448761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES, 113548761c62SAndrew Jeffery msg->payload, payload_length); 113648761c62SAndrew Jeffery if (rc) { 113748761c62SAndrew Jeffery return rc; 113848761c62SAndrew Jeffery } 113948761c62SAndrew Jeffery 114048761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, completion_code); 114148761c62SAndrew Jeffery if (rc) { 114248761c62SAndrew Jeffery return rc; 114348761c62SAndrew Jeffery } 114448761c62SAndrew Jeffery 114548761c62SAndrew Jeffery if (PLDM_SUCCESS != *completion_code) { 114648761c62SAndrew Jeffery return PLDM_SUCCESS; 114748761c62SAndrew Jeffery } 114848761c62SAndrew Jeffery 114948761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, platform_event_status); 115048761c62SAndrew Jeffery if (rc) { 115148761c62SAndrew Jeffery return rc; 115248761c62SAndrew Jeffery } 115348761c62SAndrew Jeffery 115448761c62SAndrew Jeffery if (*platform_event_status > PLDM_EVENT_LOGGING_REJECTED) { 115548761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 115648761c62SAndrew Jeffery } 115748761c62SAndrew Jeffery 115848761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 115948761c62SAndrew Jeffery } 116048761c62SAndrew Jeffery 116148761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 116248761c62SAndrew Jeffery int encode_event_message_buffer_size_req(uint8_t instance_id, 116348761c62SAndrew Jeffery uint16_t event_receiver_max_buffer_size, 116448761c62SAndrew Jeffery struct pldm_msg *msg) 116548761c62SAndrew Jeffery { 116648761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 116748761c62SAndrew Jeffery header.msg_type = PLDM_REQUEST; 116848761c62SAndrew Jeffery header.instance = instance_id; 116948761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 117048761c62SAndrew Jeffery header.command = PLDM_EVENT_MESSAGE_BUFFER_SIZE; 117148761c62SAndrew Jeffery 117248761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 117348761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 117448761c62SAndrew Jeffery return rc; 117548761c62SAndrew Jeffery } 117648761c62SAndrew Jeffery 117748761c62SAndrew Jeffery struct pldm_event_message_buffer_size_req *request = 117848761c62SAndrew Jeffery (struct pldm_event_message_buffer_size_req *)msg->payload; 117948761c62SAndrew Jeffery request->event_receiver_max_buffer_size = 118048761c62SAndrew Jeffery event_receiver_max_buffer_size; 118148761c62SAndrew Jeffery 118248761c62SAndrew Jeffery return PLDM_SUCCESS; 118348761c62SAndrew Jeffery } 118448761c62SAndrew Jeffery 118548761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 118648761c62SAndrew Jeffery int decode_event_message_buffer_size_resp(const struct pldm_msg *msg, 118748761c62SAndrew Jeffery size_t payload_length, 118848761c62SAndrew Jeffery uint8_t *completion_code, 118948761c62SAndrew Jeffery uint16_t *terminus_max_buffer_size) 119048761c62SAndrew Jeffery { 119148761c62SAndrew Jeffery struct pldm_msgbuf _buf; 119248761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 119348761c62SAndrew Jeffery int rc; 119448761c62SAndrew Jeffery 119548761c62SAndrew Jeffery if (msg == NULL || completion_code == NULL || 119648761c62SAndrew Jeffery terminus_max_buffer_size == NULL) { 119748761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 119848761c62SAndrew Jeffery } 119948761c62SAndrew Jeffery 120048761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_EVENT_MESSAGE_BUFFER_SIZE_RESP_BYTES, 120148761c62SAndrew Jeffery msg->payload, payload_length); 120248761c62SAndrew Jeffery if (rc) { 120348761c62SAndrew Jeffery return rc; 120448761c62SAndrew Jeffery } 120548761c62SAndrew Jeffery 120648761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, completion_code); 120748761c62SAndrew Jeffery if (rc) { 120848761c62SAndrew Jeffery return rc; 120948761c62SAndrew Jeffery } 121048761c62SAndrew Jeffery 121148761c62SAndrew Jeffery if (PLDM_SUCCESS != *completion_code) { 121248761c62SAndrew Jeffery return PLDM_SUCCESS; 121348761c62SAndrew Jeffery } 121448761c62SAndrew Jeffery 121548761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, terminus_max_buffer_size); 121648761c62SAndrew Jeffery 121748761c62SAndrew Jeffery return pldm_msgbuf_destroy_consumed(buf); 121848761c62SAndrew Jeffery } 121948761c62SAndrew Jeffery 122048761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 122148761c62SAndrew Jeffery int encode_event_message_supported_req(uint8_t instance_id, 122248761c62SAndrew Jeffery uint8_t format_version, 122348761c62SAndrew Jeffery struct pldm_msg *msg) 122448761c62SAndrew Jeffery { 122548761c62SAndrew Jeffery if (format_version != 1) { 122648761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 122748761c62SAndrew Jeffery } 122848761c62SAndrew Jeffery 122948761c62SAndrew Jeffery if (msg == NULL) { 123048761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 123148761c62SAndrew Jeffery } 123248761c62SAndrew Jeffery 123348761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 123448761c62SAndrew Jeffery header.msg_type = PLDM_REQUEST; 123548761c62SAndrew Jeffery header.instance = instance_id; 123648761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 123748761c62SAndrew Jeffery header.command = PLDM_EVENT_MESSAGE_SUPPORTED; 123848761c62SAndrew Jeffery 123948761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 124048761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 124148761c62SAndrew Jeffery return rc; 124248761c62SAndrew Jeffery } 124348761c62SAndrew Jeffery 124448761c62SAndrew Jeffery struct pldm_event_message_supported_req *request = 124548761c62SAndrew Jeffery (struct pldm_event_message_supported_req *)msg->payload; 124648761c62SAndrew Jeffery request->format_version = format_version; 124748761c62SAndrew Jeffery 124848761c62SAndrew Jeffery return PLDM_SUCCESS; 124948761c62SAndrew Jeffery } 125048761c62SAndrew Jeffery 125148761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 125248761c62SAndrew Jeffery int decode_event_message_supported_resp(const struct pldm_msg *msg, 125348761c62SAndrew Jeffery size_t payload_length, 125448761c62SAndrew Jeffery uint8_t *completion_code, 125548761c62SAndrew Jeffery uint8_t *synchrony_config, 125648761c62SAndrew Jeffery bitfield8_t *synchrony_config_support, 125748761c62SAndrew Jeffery uint8_t *number_event_class_returned, 125848761c62SAndrew Jeffery uint8_t *event_class, 125948761c62SAndrew Jeffery uint8_t event_class_count) 126048761c62SAndrew Jeffery { 126148761c62SAndrew Jeffery struct pldm_msgbuf _buf; 126248761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 126348761c62SAndrew Jeffery int i; 126448761c62SAndrew Jeffery int rc; 126548761c62SAndrew Jeffery 126648761c62SAndrew Jeffery if (msg == NULL || completion_code == NULL || 126748761c62SAndrew Jeffery synchrony_config == NULL || synchrony_config_support == NULL || 126848761c62SAndrew Jeffery number_event_class_returned == NULL || event_class == NULL) { 126948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 127048761c62SAndrew Jeffery } 127148761c62SAndrew Jeffery 127248761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, 127348761c62SAndrew Jeffery PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES, 127448761c62SAndrew Jeffery msg->payload, payload_length); 127548761c62SAndrew Jeffery if (rc) { 127648761c62SAndrew Jeffery return rc; 127748761c62SAndrew Jeffery } 127848761c62SAndrew Jeffery 127948761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, completion_code); 128048761c62SAndrew Jeffery if (rc) { 128148761c62SAndrew Jeffery return rc; 128248761c62SAndrew Jeffery } 128348761c62SAndrew Jeffery 128448761c62SAndrew Jeffery if (PLDM_SUCCESS != *completion_code) { 128548761c62SAndrew Jeffery return PLDM_SUCCESS; 128648761c62SAndrew Jeffery } 128748761c62SAndrew Jeffery 128848761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, synchrony_config); 128948761c62SAndrew Jeffery if (rc) { 129048761c62SAndrew Jeffery return rc; 129148761c62SAndrew Jeffery } 129248761c62SAndrew Jeffery 129348761c62SAndrew Jeffery if (*synchrony_config > PLDM_MESSAGE_TYPE_ASYNCHRONOUS_WITH_HEARTBEAT) { 129448761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 129548761c62SAndrew Jeffery } 129648761c62SAndrew Jeffery 129748761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, &synchrony_config_support->byte); 129848761c62SAndrew Jeffery 129948761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, number_event_class_returned); 130048761c62SAndrew Jeffery if (rc) { 130148761c62SAndrew Jeffery return rc; 130248761c62SAndrew Jeffery } 130348761c62SAndrew Jeffery 130448761c62SAndrew Jeffery if (*number_event_class_returned == 0) { 130548761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 130648761c62SAndrew Jeffery } 130748761c62SAndrew Jeffery 130848761c62SAndrew Jeffery if (event_class_count < *number_event_class_returned) { 130948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 131048761c62SAndrew Jeffery } 131148761c62SAndrew Jeffery 131248761c62SAndrew Jeffery for (i = 0; i < *number_event_class_returned; i++) { 131348761c62SAndrew Jeffery pldm_msgbuf_extract(buf, event_class[i]); 131448761c62SAndrew Jeffery } 131548761c62SAndrew Jeffery 131648761c62SAndrew Jeffery return pldm_msgbuf_destroy_consumed(buf); 131748761c62SAndrew Jeffery } 131848761c62SAndrew Jeffery 131948761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 132048761c62SAndrew Jeffery int decode_sensor_event_data(const uint8_t *event_data, 132148761c62SAndrew Jeffery size_t event_data_length, uint16_t *sensor_id, 132248761c62SAndrew Jeffery uint8_t *sensor_event_class_type, 132348761c62SAndrew Jeffery size_t *event_class_data_offset) 132448761c62SAndrew Jeffery { 132548761c62SAndrew Jeffery struct pldm_msgbuf _buf; 132648761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 132748761c62SAndrew Jeffery int rc; 132848761c62SAndrew Jeffery 132948761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_SENSOR_EVENT_DATA_MIN_LENGTH, 133048761c62SAndrew Jeffery event_data, event_data_length); 133148761c62SAndrew Jeffery if (rc) { 133248761c62SAndrew Jeffery return rc; 133348761c62SAndrew Jeffery } 133448761c62SAndrew Jeffery 133548761c62SAndrew Jeffery size_t event_class_data_length = 133648761c62SAndrew Jeffery event_data_length - PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES; 133748761c62SAndrew Jeffery 133848761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, sensor_id); 133948761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, sensor_event_class_type); 134048761c62SAndrew Jeffery if (rc) { 134148761c62SAndrew Jeffery return rc; 134248761c62SAndrew Jeffery } 134348761c62SAndrew Jeffery 134448761c62SAndrew Jeffery if (*sensor_event_class_type == PLDM_SENSOR_OP_STATE) { 134548761c62SAndrew Jeffery if (event_class_data_length != 134648761c62SAndrew Jeffery PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH) { 134748761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 134848761c62SAndrew Jeffery } 134948761c62SAndrew Jeffery } else if (*sensor_event_class_type == PLDM_STATE_SENSOR_STATE) { 135048761c62SAndrew Jeffery if (event_class_data_length != 135148761c62SAndrew Jeffery PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH) { 135248761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 135348761c62SAndrew Jeffery } 135448761c62SAndrew Jeffery } else if (*sensor_event_class_type == PLDM_NUMERIC_SENSOR_STATE) { 135548761c62SAndrew Jeffery if (event_class_data_length < 135648761c62SAndrew Jeffery PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MIN_DATA_LENGTH || 135748761c62SAndrew Jeffery event_class_data_length > 135848761c62SAndrew Jeffery PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH) { 135948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 136048761c62SAndrew Jeffery } 136148761c62SAndrew Jeffery } else { 136248761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 136348761c62SAndrew Jeffery } 136448761c62SAndrew Jeffery 136548761c62SAndrew Jeffery *event_class_data_offset = 136648761c62SAndrew Jeffery sizeof(*sensor_id) + sizeof(*sensor_event_class_type); 136748761c62SAndrew Jeffery 136848761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 136948761c62SAndrew Jeffery } 137048761c62SAndrew Jeffery 137148761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 137248761c62SAndrew Jeffery int decode_sensor_op_data(const uint8_t *sensor_data, size_t sensor_data_length, 137348761c62SAndrew Jeffery uint8_t *present_op_state, uint8_t *previous_op_state) 137448761c62SAndrew Jeffery { 137548761c62SAndrew Jeffery struct pldm_msgbuf _buf; 137648761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 137748761c62SAndrew Jeffery int rc; 137848761c62SAndrew Jeffery 137948761c62SAndrew Jeffery if (present_op_state == NULL || previous_op_state == NULL) { 138048761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 138148761c62SAndrew Jeffery } 138248761c62SAndrew Jeffery 138348761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, 138448761c62SAndrew Jeffery PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH, 138548761c62SAndrew Jeffery sensor_data, sensor_data_length); 138648761c62SAndrew Jeffery if (rc) { 138748761c62SAndrew Jeffery return rc; 138848761c62SAndrew Jeffery } 138948761c62SAndrew Jeffery 139048761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, present_op_state); 139148761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, previous_op_state); 139248761c62SAndrew Jeffery 139348761c62SAndrew Jeffery return pldm_msgbuf_destroy_consumed(buf); 139448761c62SAndrew Jeffery } 139548761c62SAndrew Jeffery 139648761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 139748761c62SAndrew Jeffery int decode_state_sensor_data(const uint8_t *sensor_data, 139848761c62SAndrew Jeffery size_t sensor_data_length, uint8_t *sensor_offset, 139948761c62SAndrew Jeffery uint8_t *event_state, 140048761c62SAndrew Jeffery uint8_t *previous_event_state) 140148761c62SAndrew Jeffery { 140248761c62SAndrew Jeffery struct pldm_msgbuf _buf; 140348761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 140448761c62SAndrew Jeffery int rc; 140548761c62SAndrew Jeffery 140648761c62SAndrew Jeffery if (sensor_offset == NULL || event_state == NULL || 140748761c62SAndrew Jeffery previous_event_state == NULL) { 140848761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 140948761c62SAndrew Jeffery } 141048761c62SAndrew Jeffery 141148761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc( 141248761c62SAndrew Jeffery buf, PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH, 141348761c62SAndrew Jeffery sensor_data, sensor_data_length); 141448761c62SAndrew Jeffery if (rc) { 141548761c62SAndrew Jeffery return rc; 141648761c62SAndrew Jeffery } 141748761c62SAndrew Jeffery 141848761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, sensor_offset); 141948761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, event_state); 142048761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, previous_event_state); 142148761c62SAndrew Jeffery 142248761c62SAndrew Jeffery return pldm_msgbuf_destroy_consumed(buf); 142348761c62SAndrew Jeffery } 142448761c62SAndrew Jeffery 142548761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 142648761c62SAndrew Jeffery int decode_numeric_sensor_data(const uint8_t *sensor_data, 142748761c62SAndrew Jeffery size_t sensor_data_length, uint8_t *event_state, 142848761c62SAndrew Jeffery uint8_t *previous_event_state, 142948761c62SAndrew Jeffery uint8_t *sensor_data_size, 143048761c62SAndrew Jeffery uint32_t *present_reading) 143148761c62SAndrew Jeffery { 143248761c62SAndrew Jeffery struct pldm_msgbuf _buf; 143348761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 143448761c62SAndrew Jeffery int rc; 143548761c62SAndrew Jeffery 143648761c62SAndrew Jeffery if (sensor_data_size == NULL || event_state == NULL || 143748761c62SAndrew Jeffery previous_event_state == NULL || present_reading == NULL) { 143848761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 143948761c62SAndrew Jeffery } 144048761c62SAndrew Jeffery 144148761c62SAndrew Jeffery if (sensor_data_length > 144248761c62SAndrew Jeffery PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH) { 144348761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 144448761c62SAndrew Jeffery } 144548761c62SAndrew Jeffery 144648761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc( 144748761c62SAndrew Jeffery buf, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MIN_DATA_LENGTH, 144848761c62SAndrew Jeffery sensor_data, sensor_data_length); 144948761c62SAndrew Jeffery if (rc) { 145048761c62SAndrew Jeffery return rc; 145148761c62SAndrew Jeffery } 145248761c62SAndrew Jeffery 145348761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, event_state); 145448761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, previous_event_state); 145548761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, sensor_data_size); 145648761c62SAndrew Jeffery if (rc) { 145748761c62SAndrew Jeffery return rc; 145848761c62SAndrew Jeffery } 145948761c62SAndrew Jeffery 146048761c62SAndrew Jeffery /* 146148761c62SAndrew Jeffery * The implementation below is bonkers, but it's because the function 146248761c62SAndrew Jeffery * prototype is bonkers. The `present_reading` argument should have been 146348761c62SAndrew Jeffery * a tagged union. 146448761c62SAndrew Jeffery */ 146548761c62SAndrew Jeffery switch (*sensor_data_size) { 146648761c62SAndrew Jeffery case PLDM_SENSOR_DATA_SIZE_UINT8: { 146748761c62SAndrew Jeffery uint8_t val; 146848761c62SAndrew Jeffery if (!pldm_msgbuf_extract(buf, val)) { 146948761c62SAndrew Jeffery *present_reading = (uint32_t)val; 147048761c62SAndrew Jeffery } 147148761c62SAndrew Jeffery break; 147248761c62SAndrew Jeffery } 147348761c62SAndrew Jeffery case PLDM_SENSOR_DATA_SIZE_SINT8: { 147448761c62SAndrew Jeffery int8_t val; 147548761c62SAndrew Jeffery if (!pldm_msgbuf_extract(buf, val)) { 147648761c62SAndrew Jeffery *present_reading = (uint32_t)(int32_t)val; 147748761c62SAndrew Jeffery } 147848761c62SAndrew Jeffery break; 147948761c62SAndrew Jeffery } 148048761c62SAndrew Jeffery case PLDM_SENSOR_DATA_SIZE_UINT16: { 148148761c62SAndrew Jeffery uint16_t val; 148248761c62SAndrew Jeffery if (!pldm_msgbuf_extract(buf, val)) { 148348761c62SAndrew Jeffery *present_reading = (uint32_t)val; 148448761c62SAndrew Jeffery } 148548761c62SAndrew Jeffery break; 148648761c62SAndrew Jeffery } 148748761c62SAndrew Jeffery case PLDM_SENSOR_DATA_SIZE_SINT16: { 148848761c62SAndrew Jeffery int16_t val; 148948761c62SAndrew Jeffery if (!pldm_msgbuf_extract(buf, val)) { 149048761c62SAndrew Jeffery *present_reading = (uint32_t)(int32_t)val; 149148761c62SAndrew Jeffery } 149248761c62SAndrew Jeffery break; 149348761c62SAndrew Jeffery } 149448761c62SAndrew Jeffery case PLDM_SENSOR_DATA_SIZE_UINT32: { 149548761c62SAndrew Jeffery uint32_t val; 149648761c62SAndrew Jeffery if (!pldm_msgbuf_extract(buf, val)) { 149748761c62SAndrew Jeffery *present_reading = (uint32_t)val; 149848761c62SAndrew Jeffery } 149948761c62SAndrew Jeffery break; 150048761c62SAndrew Jeffery } 150148761c62SAndrew Jeffery case PLDM_SENSOR_DATA_SIZE_SINT32: { 150248761c62SAndrew Jeffery int32_t val; 150348761c62SAndrew Jeffery if (!pldm_msgbuf_extract(buf, val)) { 150448761c62SAndrew Jeffery *present_reading = (uint32_t)val; 150548761c62SAndrew Jeffery } 150648761c62SAndrew Jeffery break; 150748761c62SAndrew Jeffery } 150848761c62SAndrew Jeffery default: 150948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 151048761c62SAndrew Jeffery } 151148761c62SAndrew Jeffery 151248761c62SAndrew Jeffery return pldm_msgbuf_destroy_consumed(buf); 151348761c62SAndrew Jeffery } 151448761c62SAndrew Jeffery 151548761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 151648761c62SAndrew Jeffery int decode_numeric_sensor_pdr_data( 151748761c62SAndrew Jeffery const void *pdr_data, size_t pdr_data_length, 151848761c62SAndrew Jeffery struct pldm_numeric_sensor_value_pdr *pdr_value) 151948761c62SAndrew Jeffery { 152048761c62SAndrew Jeffery struct pldm_msgbuf _buf; 152148761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 152248761c62SAndrew Jeffery int rc; 152348761c62SAndrew Jeffery 152448761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_PDR_NUMERIC_SENSOR_PDR_MIN_LENGTH, 152548761c62SAndrew Jeffery pdr_data, pdr_data_length); 152648761c62SAndrew Jeffery if (rc) { 152748761c62SAndrew Jeffery return rc; 152848761c62SAndrew Jeffery } 152948761c62SAndrew Jeffery 153048761c62SAndrew Jeffery rc = pldm_msgbuf_extract_value_pdr_hdr(buf, &pdr_value->hdr); 153148761c62SAndrew Jeffery if (rc) { 153248761c62SAndrew Jeffery return rc; 153348761c62SAndrew Jeffery } 153448761c62SAndrew Jeffery 153548761c62SAndrew Jeffery rc = pldm_platform_pdr_hdr_validate( 153648761c62SAndrew Jeffery &pdr_value->hdr, PLDM_PDR_NUMERIC_SENSOR_PDR_MIN_LENGTH, 153748761c62SAndrew Jeffery pdr_data_length); 153848761c62SAndrew Jeffery if (rc) { 153948761c62SAndrew Jeffery return rc; 154048761c62SAndrew Jeffery } 154148761c62SAndrew Jeffery 154248761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->terminus_handle); 154348761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->sensor_id); 154448761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->entity_type); 154548761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->entity_instance_num); 154648761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->container_id); 154748761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->sensor_init); 154848761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->sensor_auxiliary_names_pdr); 154948761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->base_unit); 155048761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->unit_modifier); 155148761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->rate_unit); 155248761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->base_oem_unit_handle); 155348761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->aux_unit); 155448761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->aux_unit_modifier); 155548761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->aux_rate_unit); 155648761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->rel); 155748761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->aux_oem_unit_handle); 155848761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->is_linear); 155948761c62SAndrew Jeffery 156048761c62SAndrew Jeffery rc = pldm_msgbuf_extract(buf, pdr_value->sensor_data_size); 156148761c62SAndrew Jeffery if (rc) { 156248761c62SAndrew Jeffery return rc; 156348761c62SAndrew Jeffery } 156448761c62SAndrew Jeffery if (pdr_value->sensor_data_size > PLDM_SENSOR_DATA_SIZE_MAX) { 156548761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 156648761c62SAndrew Jeffery } 156748761c62SAndrew Jeffery 156848761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->resolution); 156948761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->offset); 157048761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->accuracy); 157148761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->plus_tolerance); 157248761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->minus_tolerance); 157348761c62SAndrew Jeffery pldm_msgbuf_extract_sensor_data(buf, pdr_value->sensor_data_size, 157448761c62SAndrew Jeffery &pdr_value->hysteresis); 157548761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->supported_thresholds.byte); 157648761c62SAndrew Jeffery pldm_msgbuf_extract( 157748761c62SAndrew Jeffery buf, pdr_value->threshold_and_hysteresis_volatility.byte); 157848761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->state_transition_interval); 157948761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->update_interval); 158048761c62SAndrew Jeffery pldm_msgbuf_extract_sensor_data(buf, pdr_value->sensor_data_size, 158148761c62SAndrew Jeffery &pdr_value->max_readable); 158248761c62SAndrew Jeffery pldm_msgbuf_extract_sensor_data(buf, pdr_value->sensor_data_size, 158348761c62SAndrew Jeffery &pdr_value->min_readable); 158448761c62SAndrew Jeffery 158548761c62SAndrew Jeffery rc = pldm_msgbuf_extract(buf, pdr_value->range_field_format); 158648761c62SAndrew Jeffery if (rc) { 158748761c62SAndrew Jeffery return rc; 158848761c62SAndrew Jeffery } 158948761c62SAndrew Jeffery if (pdr_value->range_field_format > PLDM_RANGE_FIELD_FORMAT_MAX) { 159048761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 159148761c62SAndrew Jeffery } 159248761c62SAndrew Jeffery 159348761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->range_field_support.byte); 159448761c62SAndrew Jeffery pldm_msgbuf_extract_range_field_format( 159548761c62SAndrew Jeffery buf, pdr_value->range_field_format, pdr_value->nominal_value); 159648761c62SAndrew Jeffery pldm_msgbuf_extract_range_field_format( 159748761c62SAndrew Jeffery buf, pdr_value->range_field_format, pdr_value->normal_max); 159848761c62SAndrew Jeffery pldm_msgbuf_extract_range_field_format( 159948761c62SAndrew Jeffery buf, pdr_value->range_field_format, pdr_value->normal_min); 160048761c62SAndrew Jeffery pldm_msgbuf_extract_range_field_format( 160148761c62SAndrew Jeffery buf, pdr_value->range_field_format, pdr_value->warning_high); 160248761c62SAndrew Jeffery pldm_msgbuf_extract_range_field_format( 160348761c62SAndrew Jeffery buf, pdr_value->range_field_format, pdr_value->warning_low); 160448761c62SAndrew Jeffery pldm_msgbuf_extract_range_field_format( 160548761c62SAndrew Jeffery buf, pdr_value->range_field_format, pdr_value->critical_high); 160648761c62SAndrew Jeffery pldm_msgbuf_extract_range_field_format( 160748761c62SAndrew Jeffery buf, pdr_value->range_field_format, pdr_value->critical_low); 160848761c62SAndrew Jeffery pldm_msgbuf_extract_range_field_format( 160948761c62SAndrew Jeffery buf, pdr_value->range_field_format, pdr_value->fatal_high); 161048761c62SAndrew Jeffery pldm_msgbuf_extract_range_field_format( 161148761c62SAndrew Jeffery buf, pdr_value->range_field_format, pdr_value->fatal_low); 161248761c62SAndrew Jeffery 161348761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 161448761c62SAndrew Jeffery } 161548761c62SAndrew Jeffery 161648761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 161748761c62SAndrew Jeffery int encode_get_numeric_effecter_value_req(uint8_t instance_id, 161848761c62SAndrew Jeffery uint16_t effecter_id, 161948761c62SAndrew Jeffery struct pldm_msg *msg) 162048761c62SAndrew Jeffery { 162148761c62SAndrew Jeffery if (msg == NULL) { 162248761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 162348761c62SAndrew Jeffery } 162448761c62SAndrew Jeffery 162548761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 162648761c62SAndrew Jeffery header.msg_type = PLDM_REQUEST; 162748761c62SAndrew Jeffery header.instance = instance_id; 162848761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 162948761c62SAndrew Jeffery header.command = PLDM_GET_NUMERIC_EFFECTER_VALUE; 163048761c62SAndrew Jeffery 163148761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 163248761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 163348761c62SAndrew Jeffery return rc; 163448761c62SAndrew Jeffery } 163548761c62SAndrew Jeffery 163648761c62SAndrew Jeffery struct pldm_get_numeric_effecter_value_req *request = 163748761c62SAndrew Jeffery (struct pldm_get_numeric_effecter_value_req *)msg->payload; 163848761c62SAndrew Jeffery request->effecter_id = htole16(effecter_id); 163948761c62SAndrew Jeffery 164048761c62SAndrew Jeffery return PLDM_SUCCESS; 164148761c62SAndrew Jeffery } 164248761c62SAndrew Jeffery 164348761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 164448761c62SAndrew Jeffery int encode_get_numeric_effecter_value_resp( 164548761c62SAndrew Jeffery uint8_t instance_id, uint8_t completion_code, 164648761c62SAndrew Jeffery uint8_t effecter_data_size, uint8_t effecter_oper_state, 164748761c62SAndrew Jeffery const uint8_t *pending_value, const uint8_t *present_value, 164848761c62SAndrew Jeffery struct pldm_msg *msg, size_t payload_length) 164948761c62SAndrew Jeffery { 165048761c62SAndrew Jeffery if (msg == NULL || pending_value == NULL || present_value == NULL) { 165148761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 165248761c62SAndrew Jeffery } 165348761c62SAndrew Jeffery 165448761c62SAndrew Jeffery if (effecter_data_size > PLDM_EFFECTER_DATA_SIZE_SINT32) { 165548761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 165648761c62SAndrew Jeffery } 165748761c62SAndrew Jeffery 165848761c62SAndrew Jeffery if (effecter_oper_state > EFFECTER_OPER_STATE_INTEST) { 165948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 166048761c62SAndrew Jeffery } 166148761c62SAndrew Jeffery 166248761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 166348761c62SAndrew Jeffery header.msg_type = PLDM_RESPONSE; 166448761c62SAndrew Jeffery header.instance = instance_id; 166548761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 166648761c62SAndrew Jeffery header.command = PLDM_GET_NUMERIC_EFFECTER_VALUE; 166748761c62SAndrew Jeffery 166848761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 166948761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 167048761c62SAndrew Jeffery return rc; 167148761c62SAndrew Jeffery } 167248761c62SAndrew Jeffery 167348761c62SAndrew Jeffery struct pldm_get_numeric_effecter_value_resp *response = 167448761c62SAndrew Jeffery (struct pldm_get_numeric_effecter_value_resp *)msg->payload; 167548761c62SAndrew Jeffery 167648761c62SAndrew Jeffery response->completion_code = completion_code; 167748761c62SAndrew Jeffery response->effecter_data_size = effecter_data_size; 167848761c62SAndrew Jeffery response->effecter_oper_state = effecter_oper_state; 167948761c62SAndrew Jeffery 168048761c62SAndrew Jeffery if (effecter_data_size == PLDM_EFFECTER_DATA_SIZE_UINT8 || 168148761c62SAndrew Jeffery effecter_data_size == PLDM_EFFECTER_DATA_SIZE_SINT8) { 168248761c62SAndrew Jeffery if (payload_length != 168348761c62SAndrew Jeffery PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES) { 168448761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 168548761c62SAndrew Jeffery } 168648761c62SAndrew Jeffery response->pending_and_present_values[0] = *pending_value; 168748761c62SAndrew Jeffery response->pending_and_present_values[1] = *present_value; 168848761c62SAndrew Jeffery 168948761c62SAndrew Jeffery } else if (effecter_data_size == PLDM_EFFECTER_DATA_SIZE_UINT16 || 169048761c62SAndrew Jeffery effecter_data_size == PLDM_EFFECTER_DATA_SIZE_SINT16) { 169148761c62SAndrew Jeffery if (payload_length != 169248761c62SAndrew Jeffery PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 2) { 169348761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 169448761c62SAndrew Jeffery } 169548761c62SAndrew Jeffery uint16_t val_pending = *(uint16_t *)pending_value; 169648761c62SAndrew Jeffery val_pending = htole16(val_pending); 169748761c62SAndrew Jeffery memcpy(response->pending_and_present_values, &val_pending, 169848761c62SAndrew Jeffery sizeof(uint16_t)); 169948761c62SAndrew Jeffery uint16_t val_present = *(uint16_t *)present_value; 170048761c62SAndrew Jeffery val_present = htole16(val_present); 170148761c62SAndrew Jeffery memcpy((response->pending_and_present_values + 170248761c62SAndrew Jeffery sizeof(uint16_t)), 170348761c62SAndrew Jeffery &val_present, sizeof(uint16_t)); 170448761c62SAndrew Jeffery 170548761c62SAndrew Jeffery } else if (effecter_data_size == PLDM_EFFECTER_DATA_SIZE_UINT32 || 170648761c62SAndrew Jeffery effecter_data_size == PLDM_EFFECTER_DATA_SIZE_SINT32) { 170748761c62SAndrew Jeffery if (payload_length != 170848761c62SAndrew Jeffery PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 6) { 170948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 171048761c62SAndrew Jeffery } 171148761c62SAndrew Jeffery uint32_t val_pending = *(uint32_t *)pending_value; 171248761c62SAndrew Jeffery val_pending = htole32(val_pending); 171348761c62SAndrew Jeffery memcpy(response->pending_and_present_values, &val_pending, 171448761c62SAndrew Jeffery sizeof(uint32_t)); 171548761c62SAndrew Jeffery uint32_t val_present = *(uint32_t *)present_value; 171648761c62SAndrew Jeffery val_present = htole32(val_present); 171748761c62SAndrew Jeffery memcpy((response->pending_and_present_values + 171848761c62SAndrew Jeffery sizeof(uint32_t)), 171948761c62SAndrew Jeffery &val_present, sizeof(uint32_t)); 172048761c62SAndrew Jeffery } 172148761c62SAndrew Jeffery return PLDM_SUCCESS; 172248761c62SAndrew Jeffery } 172348761c62SAndrew Jeffery 172448761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 172548761c62SAndrew Jeffery int decode_get_numeric_effecter_value_req(const struct pldm_msg *msg, 172648761c62SAndrew Jeffery size_t payload_length, 172748761c62SAndrew Jeffery uint16_t *effecter_id) 172848761c62SAndrew Jeffery { 172948761c62SAndrew Jeffery struct pldm_msgbuf _buf; 173048761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 173148761c62SAndrew Jeffery int rc; 173248761c62SAndrew Jeffery 173348761c62SAndrew Jeffery if (msg == NULL || effecter_id == NULL) { 173448761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 173548761c62SAndrew Jeffery } 173648761c62SAndrew Jeffery 173748761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES, 173848761c62SAndrew Jeffery msg->payload, payload_length); 173948761c62SAndrew Jeffery if (rc) { 174048761c62SAndrew Jeffery return rc; 174148761c62SAndrew Jeffery } 174248761c62SAndrew Jeffery 174348761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, effecter_id); 174448761c62SAndrew Jeffery 174548761c62SAndrew Jeffery return pldm_msgbuf_destroy_consumed(buf); 174648761c62SAndrew Jeffery } 174748761c62SAndrew Jeffery 174848761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 174948761c62SAndrew Jeffery int decode_get_numeric_effecter_value_resp(const struct pldm_msg *msg, 175048761c62SAndrew Jeffery size_t payload_length, 175148761c62SAndrew Jeffery uint8_t *completion_code, 175248761c62SAndrew Jeffery uint8_t *effecter_data_size, 175348761c62SAndrew Jeffery uint8_t *effecter_oper_state, 175448761c62SAndrew Jeffery uint8_t *pending_value, 175548761c62SAndrew Jeffery uint8_t *present_value) 175648761c62SAndrew Jeffery { 175748761c62SAndrew Jeffery struct pldm_msgbuf _buf; 175848761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 175948761c62SAndrew Jeffery int rc; 176048761c62SAndrew Jeffery 176148761c62SAndrew Jeffery if (msg == NULL || effecter_data_size == NULL || 176248761c62SAndrew Jeffery effecter_oper_state == NULL || pending_value == NULL || 176348761c62SAndrew Jeffery present_value == NULL) { 176448761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 176548761c62SAndrew Jeffery } 176648761c62SAndrew Jeffery 176748761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, 176848761c62SAndrew Jeffery PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES, 176948761c62SAndrew Jeffery msg->payload, payload_length); 177048761c62SAndrew Jeffery if (rc) { 177148761c62SAndrew Jeffery return rc; 177248761c62SAndrew Jeffery } 177348761c62SAndrew Jeffery 177448761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, completion_code); 177548761c62SAndrew Jeffery if (rc) { 177648761c62SAndrew Jeffery return rc; 177748761c62SAndrew Jeffery } 177848761c62SAndrew Jeffery 177948761c62SAndrew Jeffery if (PLDM_SUCCESS != *completion_code) { 178048761c62SAndrew Jeffery return PLDM_SUCCESS; 178148761c62SAndrew Jeffery } 178248761c62SAndrew Jeffery 178348761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, effecter_data_size); 178448761c62SAndrew Jeffery if (rc) { 178548761c62SAndrew Jeffery return rc; 178648761c62SAndrew Jeffery } 178748761c62SAndrew Jeffery 178848761c62SAndrew Jeffery if (*effecter_data_size > PLDM_EFFECTER_DATA_SIZE_SINT32) { 178948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 179048761c62SAndrew Jeffery } 179148761c62SAndrew Jeffery 179248761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, effecter_oper_state); 179348761c62SAndrew Jeffery if (rc) { 179448761c62SAndrew Jeffery return rc; 179548761c62SAndrew Jeffery } 179648761c62SAndrew Jeffery 179748761c62SAndrew Jeffery if (*effecter_oper_state > EFFECTER_OPER_STATE_INTEST) { 179848761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 179948761c62SAndrew Jeffery } 180048761c62SAndrew Jeffery 180148761c62SAndrew Jeffery pldm_msgbuf_extract_effecter_value(buf, *effecter_data_size, 180248761c62SAndrew Jeffery pending_value); 180348761c62SAndrew Jeffery pldm_msgbuf_extract_effecter_value(buf, *effecter_data_size, 180448761c62SAndrew Jeffery present_value); 180548761c62SAndrew Jeffery 180648761c62SAndrew Jeffery return pldm_msgbuf_destroy_consumed(buf); 180748761c62SAndrew Jeffery } 180848761c62SAndrew Jeffery 180948761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 181048761c62SAndrew Jeffery int encode_pldm_pdr_repository_chg_event_data( 181148761c62SAndrew Jeffery uint8_t event_data_format, uint8_t number_of_change_records, 181248761c62SAndrew Jeffery const uint8_t *event_data_operations, 181348761c62SAndrew Jeffery const uint8_t *numbers_of_change_entries, 181448761c62SAndrew Jeffery const uint32_t *const *change_entries, 181548761c62SAndrew Jeffery struct pldm_pdr_repository_chg_event_data *event_data, 181648761c62SAndrew Jeffery size_t *actual_change_records_size, size_t max_change_records_size) 181748761c62SAndrew Jeffery { 181848761c62SAndrew Jeffery if (event_data_operations == NULL || 181948761c62SAndrew Jeffery numbers_of_change_entries == NULL || change_entries == NULL) { 182048761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 182148761c62SAndrew Jeffery } 182248761c62SAndrew Jeffery 182348761c62SAndrew Jeffery size_t expected_size = 182448761c62SAndrew Jeffery sizeof(event_data_format) + sizeof(number_of_change_records); 182548761c62SAndrew Jeffery 182648761c62SAndrew Jeffery expected_size += 182748761c62SAndrew Jeffery sizeof(*event_data_operations) * number_of_change_records; 182848761c62SAndrew Jeffery expected_size += 182948761c62SAndrew Jeffery sizeof(*numbers_of_change_entries) * number_of_change_records; 183048761c62SAndrew Jeffery 183148761c62SAndrew Jeffery for (uint8_t i = 0; i < number_of_change_records; ++i) { 183248761c62SAndrew Jeffery expected_size += sizeof(*change_entries[0]) * 183348761c62SAndrew Jeffery numbers_of_change_entries[i]; 183448761c62SAndrew Jeffery } 183548761c62SAndrew Jeffery 183648761c62SAndrew Jeffery *actual_change_records_size = expected_size; 183748761c62SAndrew Jeffery 183848761c62SAndrew Jeffery if (event_data == NULL) { 183948761c62SAndrew Jeffery return PLDM_SUCCESS; 184048761c62SAndrew Jeffery } 184148761c62SAndrew Jeffery 184248761c62SAndrew Jeffery if (max_change_records_size < expected_size) { 184348761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 184448761c62SAndrew Jeffery } 184548761c62SAndrew Jeffery 184648761c62SAndrew Jeffery event_data->event_data_format = event_data_format; 184748761c62SAndrew Jeffery event_data->number_of_change_records = number_of_change_records; 184848761c62SAndrew Jeffery 184948761c62SAndrew Jeffery struct pldm_pdr_repository_change_record_data *record_data = 185048761c62SAndrew Jeffery (struct pldm_pdr_repository_change_record_data *) 185148761c62SAndrew Jeffery event_data->change_records; 185248761c62SAndrew Jeffery 185348761c62SAndrew Jeffery for (uint8_t i = 0; i < number_of_change_records; ++i) { 185448761c62SAndrew Jeffery record_data->event_data_operation = event_data_operations[i]; 185548761c62SAndrew Jeffery record_data->number_of_change_entries = 185648761c62SAndrew Jeffery numbers_of_change_entries[i]; 185748761c62SAndrew Jeffery 185848761c62SAndrew Jeffery for (uint8_t j = 0; j < record_data->number_of_change_entries; 185948761c62SAndrew Jeffery ++j) { 186048761c62SAndrew Jeffery record_data->change_entry[j] = 186148761c62SAndrew Jeffery htole32(change_entries[i][j]); 186248761c62SAndrew Jeffery } 186348761c62SAndrew Jeffery 186448761c62SAndrew Jeffery record_data = 186548761c62SAndrew Jeffery (struct pldm_pdr_repository_change_record_data 186648761c62SAndrew Jeffery *)(record_data->change_entry + 186748761c62SAndrew Jeffery record_data->number_of_change_entries); 186848761c62SAndrew Jeffery } 186948761c62SAndrew Jeffery 187048761c62SAndrew Jeffery return PLDM_SUCCESS; 187148761c62SAndrew Jeffery } 187248761c62SAndrew Jeffery 187348761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 187448761c62SAndrew Jeffery int decode_pldm_pdr_repository_chg_event_data(const uint8_t *event_data, 187548761c62SAndrew Jeffery size_t event_data_size, 187648761c62SAndrew Jeffery uint8_t *event_data_format, 187748761c62SAndrew Jeffery uint8_t *number_of_change_records, 187848761c62SAndrew Jeffery size_t *change_record_data_offset) 187948761c62SAndrew Jeffery { 188048761c62SAndrew Jeffery struct pldm_msgbuf _buf; 188148761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 188248761c62SAndrew Jeffery int rc; 188348761c62SAndrew Jeffery 188448761c62SAndrew Jeffery if (event_data_format == NULL || number_of_change_records == NULL || 188548761c62SAndrew Jeffery change_record_data_offset == NULL) { 188648761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 188748761c62SAndrew Jeffery } 188848761c62SAndrew Jeffery 188948761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_PDR_REPOSITORY_CHG_EVENT_MIN_LENGTH, 189048761c62SAndrew Jeffery event_data, event_data_size); 189148761c62SAndrew Jeffery if (rc) { 189248761c62SAndrew Jeffery return rc; 189348761c62SAndrew Jeffery } 189448761c62SAndrew Jeffery 189548761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, event_data_format); 189648761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, number_of_change_records); 189748761c62SAndrew Jeffery 189848761c62SAndrew Jeffery *change_record_data_offset = 189948761c62SAndrew Jeffery sizeof(*event_data_format) + sizeof(*number_of_change_records); 190048761c62SAndrew Jeffery 190148761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 190248761c62SAndrew Jeffery } 190348761c62SAndrew Jeffery 190448761c62SAndrew Jeffery LIBPLDM_ABI_TESTING 190548761c62SAndrew Jeffery int decode_pldm_message_poll_event_data(const uint8_t *event_data, 190648761c62SAndrew Jeffery size_t event_data_length, 190748761c62SAndrew Jeffery uint8_t *format_version, 190848761c62SAndrew Jeffery uint16_t *event_id, 190948761c62SAndrew Jeffery uint32_t *data_transfer_handle) 191048761c62SAndrew Jeffery { 191148761c62SAndrew Jeffery struct pldm_msgbuf _buf; 191248761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 191348761c62SAndrew Jeffery int rc; 191448761c62SAndrew Jeffery 191548761c62SAndrew Jeffery if (event_data == NULL || format_version == NULL || event_id == NULL || 191648761c62SAndrew Jeffery data_transfer_handle == NULL) { 191748761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 191848761c62SAndrew Jeffery } 191948761c62SAndrew Jeffery 192048761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_MSG_POLL_EVENT_LENGTH, event_data, 192148761c62SAndrew Jeffery event_data_length); 192248761c62SAndrew Jeffery if (rc) { 192348761c62SAndrew Jeffery return rc; 192448761c62SAndrew Jeffery } 192548761c62SAndrew Jeffery 192648761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, format_version); 192748761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, event_id); 192848761c62SAndrew Jeffery if (rc) { 192948761c62SAndrew Jeffery return rc; 193048761c62SAndrew Jeffery } 193148761c62SAndrew Jeffery 193248761c62SAndrew Jeffery if (*event_id == 0x0000 || *event_id == 0xffff) { 193348761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 193448761c62SAndrew Jeffery } 193548761c62SAndrew Jeffery 193648761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, data_transfer_handle); 193748761c62SAndrew Jeffery 193848761c62SAndrew Jeffery return pldm_msgbuf_destroy_consumed(buf); 193948761c62SAndrew Jeffery } 194048761c62SAndrew Jeffery 194148761c62SAndrew Jeffery LIBPLDM_ABI_TESTING 194248761c62SAndrew Jeffery int encode_pldm_message_poll_event_data(uint8_t format_version, 194348761c62SAndrew Jeffery uint16_t event_id, 194448761c62SAndrew Jeffery uint32_t data_transfer_handle, 194548761c62SAndrew Jeffery uint8_t *event_data, 194648761c62SAndrew Jeffery size_t event_data_length) 194748761c62SAndrew Jeffery { 194848761c62SAndrew Jeffery struct pldm_msgbuf _buf; 194948761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 195048761c62SAndrew Jeffery int rc; 195148761c62SAndrew Jeffery 195248761c62SAndrew Jeffery if (event_data == NULL) { 195348761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 195448761c62SAndrew Jeffery } 195548761c62SAndrew Jeffery 195648761c62SAndrew Jeffery if (event_id == 0x0000 || event_id == 0xffff) { 195748761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 195848761c62SAndrew Jeffery } 195948761c62SAndrew Jeffery 196048761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_MSG_POLL_EVENT_LENGTH, event_data, 196148761c62SAndrew Jeffery event_data_length); 196248761c62SAndrew Jeffery if (rc) { 196348761c62SAndrew Jeffery return rc; 196448761c62SAndrew Jeffery } 196548761c62SAndrew Jeffery pldm_msgbuf_insert(buf, format_version); 196648761c62SAndrew Jeffery pldm_msgbuf_insert(buf, event_id); 196748761c62SAndrew Jeffery pldm_msgbuf_insert(buf, data_transfer_handle); 196848761c62SAndrew Jeffery 196948761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 197048761c62SAndrew Jeffery } 197148761c62SAndrew Jeffery 197248761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 197348761c62SAndrew Jeffery int decode_pldm_pdr_repository_change_record_data( 197448761c62SAndrew Jeffery const uint8_t *change_record_data, size_t change_record_data_size, 197548761c62SAndrew Jeffery uint8_t *event_data_operation, uint8_t *number_of_change_entries, 197648761c62SAndrew Jeffery size_t *change_entry_data_offset) 197748761c62SAndrew Jeffery { 197848761c62SAndrew Jeffery struct pldm_msgbuf _buf; 197948761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 198048761c62SAndrew Jeffery int rc; 198148761c62SAndrew Jeffery 198248761c62SAndrew Jeffery if (event_data_operation == NULL || number_of_change_entries == NULL || 198348761c62SAndrew Jeffery change_entry_data_offset == NULL) { 198448761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 198548761c62SAndrew Jeffery } 198648761c62SAndrew Jeffery 198748761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, 198848761c62SAndrew Jeffery PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH, 198948761c62SAndrew Jeffery change_record_data, change_record_data_size); 199048761c62SAndrew Jeffery if (rc) { 199148761c62SAndrew Jeffery return rc; 199248761c62SAndrew Jeffery } 199348761c62SAndrew Jeffery 199448761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, event_data_operation); 199548761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, number_of_change_entries); 199648761c62SAndrew Jeffery 199748761c62SAndrew Jeffery *change_entry_data_offset = sizeof(*event_data_operation) + 199848761c62SAndrew Jeffery sizeof(*number_of_change_entries); 199948761c62SAndrew Jeffery 200048761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 200148761c62SAndrew Jeffery } 200248761c62SAndrew Jeffery 200348761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 200448761c62SAndrew Jeffery int encode_get_sensor_reading_req(uint8_t instance_id, uint16_t sensor_id, 200548761c62SAndrew Jeffery uint8_t rearm_event_state, 200648761c62SAndrew Jeffery struct pldm_msg *msg) 200748761c62SAndrew Jeffery { 200848761c62SAndrew Jeffery if (msg == NULL) { 200948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 201048761c62SAndrew Jeffery } 201148761c62SAndrew Jeffery 201248761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 201348761c62SAndrew Jeffery header.msg_type = PLDM_REQUEST; 201448761c62SAndrew Jeffery header.instance = instance_id; 201548761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 201648761c62SAndrew Jeffery header.command = PLDM_GET_SENSOR_READING; 201748761c62SAndrew Jeffery 201848761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 201948761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 202048761c62SAndrew Jeffery return rc; 202148761c62SAndrew Jeffery } 202248761c62SAndrew Jeffery 202348761c62SAndrew Jeffery struct pldm_get_sensor_reading_req *request = 202448761c62SAndrew Jeffery (struct pldm_get_sensor_reading_req *)msg->payload; 202548761c62SAndrew Jeffery 202648761c62SAndrew Jeffery request->sensor_id = htole16(sensor_id); 202748761c62SAndrew Jeffery request->rearm_event_state = rearm_event_state; 202848761c62SAndrew Jeffery 202948761c62SAndrew Jeffery return PLDM_SUCCESS; 203048761c62SAndrew Jeffery } 203148761c62SAndrew Jeffery 203248761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 203348761c62SAndrew Jeffery int decode_get_sensor_reading_resp( 203448761c62SAndrew Jeffery const struct pldm_msg *msg, size_t payload_length, 203548761c62SAndrew Jeffery uint8_t *completion_code, uint8_t *sensor_data_size, 203648761c62SAndrew Jeffery uint8_t *sensor_operational_state, uint8_t *sensor_event_message_enable, 203748761c62SAndrew Jeffery uint8_t *present_state, uint8_t *previous_state, uint8_t *event_state, 203848761c62SAndrew Jeffery uint8_t *present_reading) 203948761c62SAndrew Jeffery { 204048761c62SAndrew Jeffery struct pldm_msgbuf _buf; 204148761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 204248761c62SAndrew Jeffery int rc; 204348761c62SAndrew Jeffery 204448761c62SAndrew Jeffery if (msg == NULL || completion_code == NULL || 204548761c62SAndrew Jeffery sensor_data_size == NULL || sensor_operational_state == NULL || 204648761c62SAndrew Jeffery sensor_event_message_enable == NULL || present_state == NULL || 204748761c62SAndrew Jeffery previous_state == NULL || event_state == NULL || 204848761c62SAndrew Jeffery present_reading == NULL) { 204948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 205048761c62SAndrew Jeffery } 205148761c62SAndrew Jeffery 205248761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_GET_SENSOR_READING_MIN_RESP_BYTES, 205348761c62SAndrew Jeffery msg->payload, payload_length); 205448761c62SAndrew Jeffery if (rc) { 205548761c62SAndrew Jeffery return rc; 205648761c62SAndrew Jeffery } 205748761c62SAndrew Jeffery 205848761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, completion_code); 205948761c62SAndrew Jeffery if (rc) { 206048761c62SAndrew Jeffery return rc; 206148761c62SAndrew Jeffery } 206248761c62SAndrew Jeffery 206348761c62SAndrew Jeffery if (PLDM_SUCCESS != *completion_code) { 206448761c62SAndrew Jeffery return PLDM_SUCCESS; 206548761c62SAndrew Jeffery } 206648761c62SAndrew Jeffery 206748761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, sensor_data_size); 206848761c62SAndrew Jeffery if (rc) { 206948761c62SAndrew Jeffery return rc; 207048761c62SAndrew Jeffery } 207148761c62SAndrew Jeffery 207248761c62SAndrew Jeffery if (*sensor_data_size > PLDM_SENSOR_DATA_SIZE_SINT32) { 207348761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 207448761c62SAndrew Jeffery } 207548761c62SAndrew Jeffery 207648761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, sensor_operational_state); 207748761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, sensor_event_message_enable); 207848761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, present_state); 207948761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, previous_state); 208048761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, event_state); 208148761c62SAndrew Jeffery 208248761c62SAndrew Jeffery pldm_msgbuf_extract_sensor_value(buf, *sensor_data_size, 208348761c62SAndrew Jeffery present_reading); 208448761c62SAndrew Jeffery 208548761c62SAndrew Jeffery return pldm_msgbuf_destroy_consumed(buf); 208648761c62SAndrew Jeffery } 208748761c62SAndrew Jeffery 208848761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 208948761c62SAndrew Jeffery int encode_get_sensor_reading_resp(uint8_t instance_id, uint8_t completion_code, 209048761c62SAndrew Jeffery uint8_t sensor_data_size, 209148761c62SAndrew Jeffery uint8_t sensor_operational_state, 209248761c62SAndrew Jeffery uint8_t sensor_event_message_enable, 209348761c62SAndrew Jeffery uint8_t present_state, 209448761c62SAndrew Jeffery uint8_t previous_state, uint8_t event_state, 209548761c62SAndrew Jeffery const uint8_t *present_reading, 209648761c62SAndrew Jeffery struct pldm_msg *msg, size_t payload_length) 209748761c62SAndrew Jeffery { 209848761c62SAndrew Jeffery if (msg == NULL || present_reading == NULL) { 209948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 210048761c62SAndrew Jeffery } 210148761c62SAndrew Jeffery 210248761c62SAndrew Jeffery if (sensor_data_size > PLDM_EFFECTER_DATA_SIZE_SINT32) { 210348761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 210448761c62SAndrew Jeffery } 210548761c62SAndrew Jeffery 210648761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 210748761c62SAndrew Jeffery header.msg_type = PLDM_RESPONSE; 210848761c62SAndrew Jeffery header.instance = instance_id; 210948761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 211048761c62SAndrew Jeffery header.command = PLDM_GET_SENSOR_READING; 211148761c62SAndrew Jeffery 211248761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 211348761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 211448761c62SAndrew Jeffery return rc; 211548761c62SAndrew Jeffery } 211648761c62SAndrew Jeffery 211748761c62SAndrew Jeffery struct pldm_get_sensor_reading_resp *response = 211848761c62SAndrew Jeffery (struct pldm_get_sensor_reading_resp *)msg->payload; 211948761c62SAndrew Jeffery 212048761c62SAndrew Jeffery response->completion_code = completion_code; 212148761c62SAndrew Jeffery response->sensor_data_size = sensor_data_size; 212248761c62SAndrew Jeffery response->sensor_operational_state = sensor_operational_state; 212348761c62SAndrew Jeffery response->sensor_event_message_enable = sensor_event_message_enable; 212448761c62SAndrew Jeffery response->present_state = present_state; 212548761c62SAndrew Jeffery response->previous_state = previous_state; 212648761c62SAndrew Jeffery response->event_state = event_state; 212748761c62SAndrew Jeffery 212848761c62SAndrew Jeffery if (sensor_data_size == PLDM_EFFECTER_DATA_SIZE_UINT8 || 212948761c62SAndrew Jeffery sensor_data_size == PLDM_EFFECTER_DATA_SIZE_SINT8) { 213048761c62SAndrew Jeffery if (payload_length != PLDM_GET_SENSOR_READING_MIN_RESP_BYTES) { 213148761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 213248761c62SAndrew Jeffery } 213348761c62SAndrew Jeffery response->present_reading[0] = *present_reading; 213448761c62SAndrew Jeffery 213548761c62SAndrew Jeffery } else if (sensor_data_size == PLDM_EFFECTER_DATA_SIZE_UINT16 || 213648761c62SAndrew Jeffery sensor_data_size == PLDM_EFFECTER_DATA_SIZE_SINT16) { 213748761c62SAndrew Jeffery if (payload_length != 213848761c62SAndrew Jeffery PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 1) { 213948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 214048761c62SAndrew Jeffery } 214148761c62SAndrew Jeffery uint16_t val = *(uint16_t *)present_reading; 214248761c62SAndrew Jeffery val = htole16(val); 214348761c62SAndrew Jeffery memcpy(response->present_reading, &val, 2); 214448761c62SAndrew Jeffery 214548761c62SAndrew Jeffery } else if (sensor_data_size == PLDM_EFFECTER_DATA_SIZE_UINT32 || 214648761c62SAndrew Jeffery sensor_data_size == PLDM_EFFECTER_DATA_SIZE_SINT32) { 214748761c62SAndrew Jeffery if (payload_length != 214848761c62SAndrew Jeffery PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 3) { 214948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH; 215048761c62SAndrew Jeffery } 215148761c62SAndrew Jeffery uint32_t val = *(uint32_t *)present_reading; 215248761c62SAndrew Jeffery val = htole32(val); 215348761c62SAndrew Jeffery memcpy(response->present_reading, &val, 4); 215448761c62SAndrew Jeffery } 215548761c62SAndrew Jeffery 215648761c62SAndrew Jeffery return PLDM_SUCCESS; 215748761c62SAndrew Jeffery } 215848761c62SAndrew Jeffery 215948761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 216048761c62SAndrew Jeffery int decode_get_sensor_reading_req(const struct pldm_msg *msg, 216148761c62SAndrew Jeffery size_t payload_length, uint16_t *sensor_id, 216248761c62SAndrew Jeffery uint8_t *rearm_event_state) 216348761c62SAndrew Jeffery { 216448761c62SAndrew Jeffery struct pldm_msgbuf _buf; 216548761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 216648761c62SAndrew Jeffery int rc; 216748761c62SAndrew Jeffery 216848761c62SAndrew Jeffery if (msg == NULL || sensor_id == NULL || rearm_event_state == NULL) { 216948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 217048761c62SAndrew Jeffery } 217148761c62SAndrew Jeffery 217248761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_GET_SENSOR_READING_REQ_BYTES, 217348761c62SAndrew Jeffery msg->payload, payload_length); 217448761c62SAndrew Jeffery if (rc) { 217548761c62SAndrew Jeffery return rc; 217648761c62SAndrew Jeffery } 217748761c62SAndrew Jeffery 217848761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, sensor_id); 217948761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, rearm_event_state); 218048761c62SAndrew Jeffery 218148761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 218248761c62SAndrew Jeffery } 218348761c62SAndrew Jeffery 218448761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 218548761c62SAndrew Jeffery int encode_set_event_receiver_req(uint8_t instance_id, 218648761c62SAndrew Jeffery uint8_t event_message_global_enable, 218748761c62SAndrew Jeffery uint8_t transport_protocol_type, 218848761c62SAndrew Jeffery uint8_t event_receiver_address_info, 218948761c62SAndrew Jeffery uint16_t heartbeat_timer, 219048761c62SAndrew Jeffery struct pldm_msg *msg) 219148761c62SAndrew Jeffery { 219248761c62SAndrew Jeffery if (msg == NULL) { 219348761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 219448761c62SAndrew Jeffery } 219548761c62SAndrew Jeffery 219648761c62SAndrew Jeffery if (transport_protocol_type != PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP) { 219748761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 219848761c62SAndrew Jeffery } 219948761c62SAndrew Jeffery 220048761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 220148761c62SAndrew Jeffery header.msg_type = PLDM_REQUEST; 220248761c62SAndrew Jeffery header.instance = instance_id; 220348761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 220448761c62SAndrew Jeffery header.command = PLDM_SET_EVENT_RECEIVER; 220548761c62SAndrew Jeffery 220648761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 220748761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 220848761c62SAndrew Jeffery return rc; 220948761c62SAndrew Jeffery } 221048761c62SAndrew Jeffery 221148761c62SAndrew Jeffery struct pldm_set_event_receiver_req *request = 221248761c62SAndrew Jeffery (struct pldm_set_event_receiver_req *)msg->payload; 221348761c62SAndrew Jeffery request->event_message_global_enable = event_message_global_enable; 221448761c62SAndrew Jeffery 221548761c62SAndrew Jeffery request->transport_protocol_type = transport_protocol_type; 221648761c62SAndrew Jeffery request->event_receiver_address_info = event_receiver_address_info; 221748761c62SAndrew Jeffery 221848761c62SAndrew Jeffery if (event_message_global_enable == 221948761c62SAndrew Jeffery PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE) { 222048761c62SAndrew Jeffery if (heartbeat_timer == 0) { 222148761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 222248761c62SAndrew Jeffery } 222348761c62SAndrew Jeffery request->heartbeat_timer = htole16(heartbeat_timer); 222448761c62SAndrew Jeffery } 222548761c62SAndrew Jeffery 222648761c62SAndrew Jeffery return PLDM_SUCCESS; 222748761c62SAndrew Jeffery } 222848761c62SAndrew Jeffery 222948761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 223048761c62SAndrew Jeffery int decode_set_event_receiver_resp(const struct pldm_msg *msg, 223148761c62SAndrew Jeffery size_t payload_length, 223248761c62SAndrew Jeffery uint8_t *completion_code) 223348761c62SAndrew Jeffery { 223448761c62SAndrew Jeffery struct pldm_msgbuf _buf; 223548761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 223648761c62SAndrew Jeffery int rc; 223748761c62SAndrew Jeffery 223848761c62SAndrew Jeffery if (msg == NULL || completion_code == NULL) { 223948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 224048761c62SAndrew Jeffery } 224148761c62SAndrew Jeffery 224248761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_SET_EVENT_RECEIVER_RESP_BYTES, 224348761c62SAndrew Jeffery msg->payload, payload_length); 224448761c62SAndrew Jeffery if (rc) { 224548761c62SAndrew Jeffery return rc; 224648761c62SAndrew Jeffery } 224748761c62SAndrew Jeffery 224848761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, completion_code); 224948761c62SAndrew Jeffery 225048761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 225148761c62SAndrew Jeffery } 225248761c62SAndrew Jeffery 225348761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 225448761c62SAndrew Jeffery int decode_set_event_receiver_req(const struct pldm_msg *msg, 225548761c62SAndrew Jeffery size_t payload_length, 225648761c62SAndrew Jeffery uint8_t *event_message_global_enable, 225748761c62SAndrew Jeffery uint8_t *transport_protocol_type, 225848761c62SAndrew Jeffery uint8_t *event_receiver_address_info, 225948761c62SAndrew Jeffery uint16_t *heartbeat_timer) 226048761c62SAndrew Jeffery 226148761c62SAndrew Jeffery { 226248761c62SAndrew Jeffery struct pldm_msgbuf _buf; 226348761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 226448761c62SAndrew Jeffery int rc; 226548761c62SAndrew Jeffery 226648761c62SAndrew Jeffery if (msg == NULL || event_message_global_enable == NULL || 226748761c62SAndrew Jeffery transport_protocol_type == NULL || 226848761c62SAndrew Jeffery event_receiver_address_info == NULL || heartbeat_timer == NULL) { 226948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 227048761c62SAndrew Jeffery } 227148761c62SAndrew Jeffery 227248761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_SET_EVENT_RECEIVER_REQ_BYTES, 227348761c62SAndrew Jeffery msg->payload, payload_length); 227448761c62SAndrew Jeffery if (rc) { 227548761c62SAndrew Jeffery return rc; 227648761c62SAndrew Jeffery } 227748761c62SAndrew Jeffery 227848761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, event_message_global_enable); 227948761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, transport_protocol_type); 228048761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, event_receiver_address_info); 228148761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, heartbeat_timer); 228248761c62SAndrew Jeffery 228348761c62SAndrew Jeffery rc = pldm_msgbuf_destroy(buf); 228448761c62SAndrew Jeffery if (rc) { 228548761c62SAndrew Jeffery return rc; 228648761c62SAndrew Jeffery } 228748761c62SAndrew Jeffery 228848761c62SAndrew Jeffery if ((*event_message_global_enable == 228948761c62SAndrew Jeffery PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE) && 229048761c62SAndrew Jeffery (*heartbeat_timer == 0)) { 229148761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 229248761c62SAndrew Jeffery } 229348761c62SAndrew Jeffery 229448761c62SAndrew Jeffery return PLDM_SUCCESS; 229548761c62SAndrew Jeffery } 229648761c62SAndrew Jeffery 229748761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 229848761c62SAndrew Jeffery int encode_set_event_receiver_resp(uint8_t instance_id, uint8_t completion_code, 229948761c62SAndrew Jeffery struct pldm_msg *msg) 230048761c62SAndrew Jeffery 230148761c62SAndrew Jeffery { 230248761c62SAndrew Jeffery if (msg == NULL) { 230348761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 230448761c62SAndrew Jeffery } 230548761c62SAndrew Jeffery 230648761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 230748761c62SAndrew Jeffery header.instance = instance_id; 230848761c62SAndrew Jeffery header.msg_type = PLDM_RESPONSE; 230948761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 231048761c62SAndrew Jeffery header.command = PLDM_SET_EVENT_RECEIVER; 231148761c62SAndrew Jeffery 231248761c62SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); 231348761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 231448761c62SAndrew Jeffery return rc; 231548761c62SAndrew Jeffery } 231648761c62SAndrew Jeffery 231748761c62SAndrew Jeffery msg->payload[0] = completion_code; 231848761c62SAndrew Jeffery 231948761c62SAndrew Jeffery return PLDM_SUCCESS; 232048761c62SAndrew Jeffery } 232148761c62SAndrew Jeffery 232248761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 232348761c62SAndrew Jeffery int encode_poll_for_platform_event_message_req(uint8_t instance_id, 232448761c62SAndrew Jeffery uint8_t format_version, 232548761c62SAndrew Jeffery uint8_t transfer_operation_flag, 232648761c62SAndrew Jeffery uint32_t data_transfer_handle, 232748761c62SAndrew Jeffery uint16_t event_id_to_acknowledge, 232848761c62SAndrew Jeffery struct pldm_msg *msg, 232948761c62SAndrew Jeffery size_t payload_length) 233048761c62SAndrew Jeffery { 233148761c62SAndrew Jeffery struct pldm_msgbuf _buf; 233248761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 233348761c62SAndrew Jeffery int rc; 233448761c62SAndrew Jeffery 233548761c62SAndrew Jeffery if (msg == NULL) { 233648761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 233748761c62SAndrew Jeffery } 233848761c62SAndrew Jeffery 233948761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 234048761c62SAndrew Jeffery header.msg_type = PLDM_REQUEST; 234148761c62SAndrew Jeffery header.instance = instance_id; 234248761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 234348761c62SAndrew Jeffery header.command = PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE; 234448761c62SAndrew Jeffery 234548761c62SAndrew Jeffery rc = pack_pldm_header(&header, &(msg->hdr)); 234648761c62SAndrew Jeffery if (rc != PLDM_SUCCESS) { 234748761c62SAndrew Jeffery return rc; 234848761c62SAndrew Jeffery } 234948761c62SAndrew Jeffery 235048761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc( 235148761c62SAndrew Jeffery buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES, 235248761c62SAndrew Jeffery msg->payload, payload_length); 235348761c62SAndrew Jeffery if (rc) { 235448761c62SAndrew Jeffery return rc; 235548761c62SAndrew Jeffery } 235648761c62SAndrew Jeffery 235748761c62SAndrew Jeffery pldm_msgbuf_insert(buf, format_version); 235848761c62SAndrew Jeffery pldm_msgbuf_insert(buf, transfer_operation_flag); 235948761c62SAndrew Jeffery pldm_msgbuf_insert(buf, data_transfer_handle); 236048761c62SAndrew Jeffery pldm_msgbuf_insert(buf, event_id_to_acknowledge); 236148761c62SAndrew Jeffery 236248761c62SAndrew Jeffery return pldm_msgbuf_destroy(buf); 236348761c62SAndrew Jeffery } 236448761c62SAndrew Jeffery 236548761c62SAndrew Jeffery LIBPLDM_ABI_STABLE 236648761c62SAndrew Jeffery int decode_poll_for_platform_event_message_resp( 236748761c62SAndrew Jeffery const struct pldm_msg *msg, size_t payload_length, 236848761c62SAndrew Jeffery uint8_t *completion_code, uint8_t *tid, uint16_t *event_id, 236948761c62SAndrew Jeffery uint32_t *next_data_transfer_handle, uint8_t *transfer_flag, 237048761c62SAndrew Jeffery uint8_t *event_class, uint32_t *event_data_size, void **event_data, 237148761c62SAndrew Jeffery uint32_t *event_data_integrity_checksum) 237248761c62SAndrew Jeffery { 237348761c62SAndrew Jeffery struct pldm_msgbuf _buf; 237448761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 237548761c62SAndrew Jeffery int rc; 237648761c62SAndrew Jeffery 237748761c62SAndrew Jeffery if (msg == NULL || completion_code == NULL || tid == NULL || 237848761c62SAndrew Jeffery event_id == NULL || next_data_transfer_handle == NULL || 237948761c62SAndrew Jeffery transfer_flag == NULL || event_class == NULL || 238048761c62SAndrew Jeffery event_data_size == NULL || event_data == NULL || 238148761c62SAndrew Jeffery event_data_integrity_checksum == NULL) { 238248761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 238348761c62SAndrew Jeffery } 238448761c62SAndrew Jeffery 238548761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc( 238648761c62SAndrew Jeffery buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES, 238748761c62SAndrew Jeffery msg->payload, payload_length); 238848761c62SAndrew Jeffery if (rc) { 238948761c62SAndrew Jeffery return rc; 239048761c62SAndrew Jeffery } 239148761c62SAndrew Jeffery 239248761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, completion_code); 239348761c62SAndrew Jeffery if (rc) { 239448761c62SAndrew Jeffery return rc; 239548761c62SAndrew Jeffery } 239648761c62SAndrew Jeffery if (PLDM_SUCCESS != *completion_code) { 239748761c62SAndrew Jeffery return *completion_code; 239848761c62SAndrew Jeffery } 239948761c62SAndrew Jeffery 240048761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, tid); 240148761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, event_id); 240248761c62SAndrew Jeffery if (rc) { 240348761c62SAndrew Jeffery return rc; 240448761c62SAndrew Jeffery } 240548761c62SAndrew Jeffery if ((*event_id == 0) || (*event_id == 0xffff)) { 240648761c62SAndrew Jeffery return PLDM_SUCCESS; 240748761c62SAndrew Jeffery } 240848761c62SAndrew Jeffery 240948761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, next_data_transfer_handle); 241048761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, transfer_flag); 241148761c62SAndrew Jeffery if (rc) { 241248761c62SAndrew Jeffery return rc; 241348761c62SAndrew Jeffery } 241448761c62SAndrew Jeffery 241548761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, event_class); 241648761c62SAndrew Jeffery rc = pldm_msgbuf_extract_p(buf, event_data_size); 241748761c62SAndrew Jeffery if (rc) { 241848761c62SAndrew Jeffery return rc; 241948761c62SAndrew Jeffery } 242048761c62SAndrew Jeffery if (*event_data_size > payload_length) { 242148761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 242248761c62SAndrew Jeffery } 242348761c62SAndrew Jeffery 242448761c62SAndrew Jeffery if (*event_data_size > 0) { 242548761c62SAndrew Jeffery pldm_msgbuf_span_required(buf, *event_data_size, event_data); 242648761c62SAndrew Jeffery } 242748761c62SAndrew Jeffery 242848761c62SAndrew Jeffery if (*transfer_flag == PLDM_END || 242948761c62SAndrew Jeffery *transfer_flag == PLDM_START_AND_END) { 243048761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, event_data_integrity_checksum); 243148761c62SAndrew Jeffery } 243248761c62SAndrew Jeffery 243348761c62SAndrew Jeffery return pldm_msgbuf_destroy_consumed(buf); 243448761c62SAndrew Jeffery } 243548761c62SAndrew Jeffery 243648761c62SAndrew Jeffery LIBPLDM_ABI_TESTING 243748761c62SAndrew Jeffery int decode_numeric_effecter_pdr_data( 243848761c62SAndrew Jeffery const void *pdr_data, size_t pdr_data_length, 243948761c62SAndrew Jeffery struct pldm_numeric_effecter_value_pdr *pdr_value) 244048761c62SAndrew Jeffery { 244148761c62SAndrew Jeffery struct pldm_msgbuf _buf; 244248761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 244348761c62SAndrew Jeffery struct pldm_value_pdr_hdr hdr; 244448761c62SAndrew Jeffery int rc; 244548761c62SAndrew Jeffery 244648761c62SAndrew Jeffery rc = pldm_msgbuf_init_cc(buf, PLDM_PDR_NUMERIC_EFFECTER_PDR_MIN_LENGTH, 244748761c62SAndrew Jeffery pdr_data, pdr_data_length); 244848761c62SAndrew Jeffery if (rc) { 244948761c62SAndrew Jeffery return rc; 245048761c62SAndrew Jeffery } 245148761c62SAndrew Jeffery 245248761c62SAndrew Jeffery rc = pldm_msgbuf_extract_value_pdr_hdr(buf, &hdr); 245348761c62SAndrew Jeffery if (rc) { 245448761c62SAndrew Jeffery return rc; 245548761c62SAndrew Jeffery } 245648761c62SAndrew Jeffery 245748761c62SAndrew Jeffery rc = pldm_platform_pdr_hdr_validate( 245848761c62SAndrew Jeffery &hdr, PLDM_PDR_NUMERIC_EFFECTER_PDR_MIN_LENGTH, 245948761c62SAndrew Jeffery pdr_data_length); 246048761c62SAndrew Jeffery if (rc) { 246148761c62SAndrew Jeffery return rc; 246248761c62SAndrew Jeffery } 246348761c62SAndrew Jeffery 246448761c62SAndrew Jeffery memcpy(&pdr_value->hdr, &hdr, sizeof(hdr)); 246548761c62SAndrew Jeffery 246648761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->terminus_handle); 246748761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->effecter_id); 246848761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->entity_type); 246948761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->entity_instance); 247048761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->container_id); 247148761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->effecter_semantic_id); 247248761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->effecter_init); 247348761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->effecter_auxiliary_names); 247448761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->base_unit); 247548761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->unit_modifier); 247648761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->rate_unit); 247748761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->base_oem_unit_handle); 247848761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->aux_unit); 247948761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->aux_unit_modifier); 248048761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->aux_rate_unit); 248148761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->aux_oem_unit_handle); 248248761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->is_linear); 248348761c62SAndrew Jeffery 248448761c62SAndrew Jeffery rc = pldm_msgbuf_extract(buf, pdr_value->effecter_data_size); 248548761c62SAndrew Jeffery if (rc) { 248648761c62SAndrew Jeffery return rc; 248748761c62SAndrew Jeffery } 248848761c62SAndrew Jeffery if (pdr_value->effecter_data_size > PLDM_SENSOR_DATA_SIZE_MAX) { 248948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 249048761c62SAndrew Jeffery } 249148761c62SAndrew Jeffery 249248761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->resolution); 249348761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->offset); 249448761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->accuracy); 249548761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->plus_tolerance); 249648761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->minus_tolerance); 249748761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->state_transition_interval); 249848761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->transition_interval); 249948761c62SAndrew Jeffery pldm_msgbuf_extract_effecter_data(buf, pdr_value->effecter_data_size, 250048761c62SAndrew Jeffery pdr_value->max_settable); 250148761c62SAndrew Jeffery pldm_msgbuf_extract_effecter_data(buf, pdr_value->effecter_data_size, 250248761c62SAndrew Jeffery pdr_value->min_settable); 250348761c62SAndrew Jeffery 250448761c62SAndrew Jeffery rc = pldm_msgbuf_extract(buf, pdr_value->range_field_format); 250548761c62SAndrew Jeffery if (rc) { 250648761c62SAndrew Jeffery return rc; 250748761c62SAndrew Jeffery } 250848761c62SAndrew Jeffery if (pdr_value->range_field_format > PLDM_RANGE_FIELD_FORMAT_MAX) { 250948761c62SAndrew Jeffery return PLDM_ERROR_INVALID_DATA; 251048761c62SAndrew Jeffery } 251148761c62SAndrew Jeffery 251248761c62SAndrew Jeffery pldm_msgbuf_extract(buf, pdr_value->range_field_support.byte); 251348761c62SAndrew Jeffery pldm_msgbuf_extract_range_field_format( 251448761c62SAndrew Jeffery buf, pdr_value->range_field_format, pdr_value->nominal_value); 251548761c62SAndrew Jeffery pldm_msgbuf_extract_range_field_format( 251648761c62SAndrew Jeffery buf, pdr_value->range_field_format, pdr_value->normal_max); 251748761c62SAndrew Jeffery pldm_msgbuf_extract_range_field_format( 251848761c62SAndrew Jeffery buf, pdr_value->range_field_format, pdr_value->normal_min); 251948761c62SAndrew Jeffery pldm_msgbuf_extract_range_field_format( 252048761c62SAndrew Jeffery buf, pdr_value->range_field_format, pdr_value->rated_max); 252148761c62SAndrew Jeffery pldm_msgbuf_extract_range_field_format( 252248761c62SAndrew Jeffery buf, pdr_value->range_field_format, pdr_value->rated_min); 252348761c62SAndrew Jeffery 252448761c62SAndrew Jeffery return pldm_msgbuf_destroy_consumed(buf); 252548761c62SAndrew Jeffery } 252648761c62SAndrew Jeffery 252748761c62SAndrew Jeffery LIBPLDM_ABI_TESTING 252848761c62SAndrew Jeffery int encode_get_state_effecter_states_req(uint8_t instance_id, 252948761c62SAndrew Jeffery uint16_t effecter_id, 253048761c62SAndrew Jeffery struct pldm_msg *msg, 253148761c62SAndrew Jeffery size_t payload_length) 253248761c62SAndrew Jeffery { 253348761c62SAndrew Jeffery struct pldm_msgbuf _buf; 253448761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 253548761c62SAndrew Jeffery int rc; 253648761c62SAndrew Jeffery 253748761c62SAndrew Jeffery if (msg == NULL) { 2538*f490a38fSTal Yacobi return -EINVAL; 253948761c62SAndrew Jeffery } 254048761c62SAndrew Jeffery 254148761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 254248761c62SAndrew Jeffery header.msg_type = PLDM_REQUEST; 254348761c62SAndrew Jeffery header.instance = instance_id; 254448761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 254548761c62SAndrew Jeffery header.command = PLDM_GET_STATE_EFFECTER_STATES; 254648761c62SAndrew Jeffery 2547*f490a38fSTal Yacobi rc = pack_pldm_header_errno(&header, &msg->hdr); 2548*f490a38fSTal Yacobi if (rc < 0) { 254948761c62SAndrew Jeffery return rc; 255048761c62SAndrew Jeffery } 255148761c62SAndrew Jeffery 2552*f490a38fSTal Yacobi rc = pldm_msgbuf_init_errno(buf, 2553*f490a38fSTal Yacobi PLDM_GET_STATE_EFFECTER_STATES_REQ_BYTES, 255448761c62SAndrew Jeffery msg->payload, payload_length); 255548761c62SAndrew Jeffery if (rc) { 255648761c62SAndrew Jeffery return rc; 255748761c62SAndrew Jeffery } 255848761c62SAndrew Jeffery 255948761c62SAndrew Jeffery pldm_msgbuf_insert(buf, effecter_id); 256048761c62SAndrew Jeffery 256148761c62SAndrew Jeffery return pldm_msgbuf_destroy_consumed(buf); 256248761c62SAndrew Jeffery } 256348761c62SAndrew Jeffery 256448761c62SAndrew Jeffery LIBPLDM_ABI_TESTING 256548761c62SAndrew Jeffery int decode_get_state_effecter_states_req(const struct pldm_msg *msg, 256648761c62SAndrew Jeffery size_t payload_length, 256748761c62SAndrew Jeffery uint16_t *effecter_id) 256848761c62SAndrew Jeffery { 256948761c62SAndrew Jeffery struct pldm_msgbuf _buf; 257048761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 257148761c62SAndrew Jeffery int rc; 257248761c62SAndrew Jeffery 257348761c62SAndrew Jeffery if (msg == NULL || effecter_id == NULL) { 2574*f490a38fSTal Yacobi return -EINVAL; 257548761c62SAndrew Jeffery } 257648761c62SAndrew Jeffery 2577*f490a38fSTal Yacobi rc = pldm_msgbuf_init_errno( 2578*f490a38fSTal Yacobi buf, PLDM_GET_STATE_EFFECTER_STATES_MIN_RESP_BYTES, 257948761c62SAndrew Jeffery msg->payload, payload_length); 258048761c62SAndrew Jeffery if (rc) { 258148761c62SAndrew Jeffery return rc; 258248761c62SAndrew Jeffery } 258348761c62SAndrew Jeffery 258448761c62SAndrew Jeffery pldm_msgbuf_extract_p(buf, effecter_id); 258548761c62SAndrew Jeffery 258648761c62SAndrew Jeffery return pldm_msgbuf_destroy_consumed(buf); 258748761c62SAndrew Jeffery } 258848761c62SAndrew Jeffery 258948761c62SAndrew Jeffery LIBPLDM_ABI_TESTING 259048761c62SAndrew Jeffery int decode_get_state_effecter_states_resp( 259148761c62SAndrew Jeffery const struct pldm_msg *msg, size_t payload_length, 259248761c62SAndrew Jeffery struct pldm_get_state_effecter_states_resp *resp) 259348761c62SAndrew Jeffery { 259448761c62SAndrew Jeffery struct pldm_msgbuf _buf; 259548761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 259648761c62SAndrew Jeffery get_effecter_state_field *field; 259748761c62SAndrew Jeffery int rc; 259848761c62SAndrew Jeffery int i; 259948761c62SAndrew Jeffery 260048761c62SAndrew Jeffery if (msg == NULL || resp == NULL) { 2601*f490a38fSTal Yacobi return -EINVAL; 260248761c62SAndrew Jeffery } 260348761c62SAndrew Jeffery 2604*f490a38fSTal Yacobi rc = pldm_msgbuf_init_errno( 2605*f490a38fSTal Yacobi buf, PLDM_GET_STATE_EFFECTER_STATES_MIN_RESP_BYTES, 260648761c62SAndrew Jeffery msg->payload, payload_length); 260748761c62SAndrew Jeffery if (rc) { 260848761c62SAndrew Jeffery return rc; 260948761c62SAndrew Jeffery } 261048761c62SAndrew Jeffery 261148761c62SAndrew Jeffery rc = pldm_msgbuf_extract(buf, resp->completion_code); 261248761c62SAndrew Jeffery if (rc) { 261348761c62SAndrew Jeffery return rc; 261448761c62SAndrew Jeffery } 261548761c62SAndrew Jeffery 261648761c62SAndrew Jeffery if (PLDM_SUCCESS != resp->completion_code) { 2617*f490a38fSTal Yacobi return 0; 261848761c62SAndrew Jeffery } 261948761c62SAndrew Jeffery 262048761c62SAndrew Jeffery rc = pldm_msgbuf_extract(buf, resp->comp_effecter_count); 262148761c62SAndrew Jeffery if (rc) { 262248761c62SAndrew Jeffery return rc; 262348761c62SAndrew Jeffery } 262448761c62SAndrew Jeffery 262548761c62SAndrew Jeffery uint8_t comp_effecter_count = resp->comp_effecter_count; 262648761c62SAndrew Jeffery 262748761c62SAndrew Jeffery if (comp_effecter_count < PLDM_GET_EFFECTER_STATE_FIELD_COUNT_MIN || 262848761c62SAndrew Jeffery comp_effecter_count > PLDM_GET_EFFECTER_STATE_FIELD_COUNT_MAX) { 2629*f490a38fSTal Yacobi return -EBADMSG; 263048761c62SAndrew Jeffery } 263148761c62SAndrew Jeffery 263248761c62SAndrew Jeffery for (i = 0, field = resp->field; i < comp_effecter_count; 263348761c62SAndrew Jeffery i++, field++) { 263448761c62SAndrew Jeffery pldm_msgbuf_extract(buf, field->effecter_op_state); 263548761c62SAndrew Jeffery pldm_msgbuf_extract(buf, field->pending_state); 263648761c62SAndrew Jeffery pldm_msgbuf_extract(buf, field->present_state); 263748761c62SAndrew Jeffery } 263848761c62SAndrew Jeffery 263948761c62SAndrew Jeffery return pldm_msgbuf_destroy_consumed(buf); 264048761c62SAndrew Jeffery } 264148761c62SAndrew Jeffery 264248761c62SAndrew Jeffery LIBPLDM_ABI_TESTING 264348761c62SAndrew Jeffery int encode_get_state_effecter_states_resp( 264448761c62SAndrew Jeffery uint8_t instance_id, struct pldm_get_state_effecter_states_resp *resp, 264548761c62SAndrew Jeffery struct pldm_msg *msg, size_t payload_length) 264648761c62SAndrew Jeffery { 264748761c62SAndrew Jeffery struct pldm_msgbuf _buf; 264848761c62SAndrew Jeffery struct pldm_msgbuf *buf = &_buf; 264948761c62SAndrew Jeffery get_effecter_state_field *field; 265048761c62SAndrew Jeffery int rc; 265148761c62SAndrew Jeffery int i; 265248761c62SAndrew Jeffery 265348761c62SAndrew Jeffery if (msg == NULL || resp == NULL) { 2654*f490a38fSTal Yacobi return -EINVAL; 265548761c62SAndrew Jeffery } 265648761c62SAndrew Jeffery 265748761c62SAndrew Jeffery uint8_t comp_effecter_count = resp->comp_effecter_count; 265848761c62SAndrew Jeffery 265948761c62SAndrew Jeffery if (comp_effecter_count < PLDM_GET_EFFECTER_STATE_FIELD_COUNT_MIN || 266048761c62SAndrew Jeffery comp_effecter_count > PLDM_GET_EFFECTER_STATE_FIELD_COUNT_MAX) { 2661*f490a38fSTal Yacobi return -EBADMSG; 266248761c62SAndrew Jeffery } 266348761c62SAndrew Jeffery 266448761c62SAndrew Jeffery struct pldm_header_info header = { 0 }; 266548761c62SAndrew Jeffery header.msg_type = PLDM_RESPONSE; 266648761c62SAndrew Jeffery header.instance = instance_id; 266748761c62SAndrew Jeffery header.pldm_type = PLDM_PLATFORM; 266848761c62SAndrew Jeffery header.command = PLDM_GET_STATE_EFFECTER_STATES; 266948761c62SAndrew Jeffery 2670*f490a38fSTal Yacobi rc = pack_pldm_header_errno(&header, &msg->hdr); 2671*f490a38fSTal Yacobi if (rc < 0) { 267248761c62SAndrew Jeffery return rc; 267348761c62SAndrew Jeffery } 267448761c62SAndrew Jeffery 2675*f490a38fSTal Yacobi rc = pldm_msgbuf_init_errno( 2676*f490a38fSTal Yacobi buf, PLDM_GET_STATE_EFFECTER_STATES_MIN_RESP_BYTES, 267748761c62SAndrew Jeffery msg->payload, payload_length); 267848761c62SAndrew Jeffery if (rc) { 267948761c62SAndrew Jeffery return rc; 268048761c62SAndrew Jeffery } 268148761c62SAndrew Jeffery 268248761c62SAndrew Jeffery pldm_msgbuf_insert(buf, resp->completion_code); 268348761c62SAndrew Jeffery pldm_msgbuf_insert(buf, comp_effecter_count); 268448761c62SAndrew Jeffery 268548761c62SAndrew Jeffery for (i = 0, field = resp->field; i < comp_effecter_count; 268648761c62SAndrew Jeffery i++, field++) { 268748761c62SAndrew Jeffery pldm_msgbuf_insert(buf, field->effecter_op_state); 268848761c62SAndrew Jeffery pldm_msgbuf_insert(buf, field->pending_state); 268948761c62SAndrew Jeffery pldm_msgbuf_insert(buf, field->present_state); 269048761c62SAndrew Jeffery } 269148761c62SAndrew Jeffery 269248761c62SAndrew Jeffery return pldm_msgbuf_destroy_consumed(buf); 269348761c62SAndrew Jeffery } 2694