| /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */ |
| #include <libpldm/base.h> |
| #include <libpldm/platform.h> |
| #include <libpldm/oem/ibm/platform.h> |
| |
| #include <string.h> |
| |
| LIBPLDM_ABI_STABLE |
| int encode_bios_attribute_update_event_req(uint8_t instance_id, |
| uint8_t format_version, uint8_t tid, |
| uint8_t num_handles, |
| const uint8_t *list_of_handles, |
| size_t payload_length, |
| struct pldm_msg *msg) |
| { |
| if (format_version != 1) { |
| return PLDM_ERROR_INVALID_DATA; |
| } |
| |
| if (msg == NULL || list_of_handles == NULL) { |
| return PLDM_ERROR_INVALID_DATA; |
| } |
| |
| if (num_handles == 0) { |
| return PLDM_ERROR_INVALID_DATA; |
| } |
| |
| if (SIZE_MAX / num_handles < sizeof(uint16_t)) { |
| return PLDM_ERROR_INVALID_LENGTH; |
| } |
| |
| if (payload_length < |
| PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES + sizeof(num_handles)) { |
| return PLDM_ERROR_INVALID_LENGTH; |
| } |
| |
| if (payload_length - (PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES + |
| sizeof(num_handles)) < |
| num_handles * sizeof(uint16_t)) { |
| return PLDM_ERROR_INVALID_LENGTH; |
| } |
| |
| struct pldm_header_info header = { 0 }; |
| header.msg_type = PLDM_REQUEST; |
| header.instance = instance_id; |
| header.pldm_type = PLDM_PLATFORM; |
| header.command = PLDM_PLATFORM_EVENT_MESSAGE; |
| uint8_t rc = pack_pldm_header(&header, &(msg->hdr)); |
| if (rc != PLDM_SUCCESS) { |
| return rc; |
| } |
| |
| struct pldm_bios_attribute_update_event_req *request = |
| (struct pldm_bios_attribute_update_event_req *)msg->payload; |
| request->format_version = format_version; |
| request->tid = tid; |
| request->event_class = PLDM_EVENT_TYPE_OEM_EVENT_BIOS_ATTRIBUTE_UPDATE; |
| request->num_handles = num_handles; |
| memcpy(request->bios_attribute_handles, list_of_handles, |
| num_handles * sizeof(uint16_t)); |
| |
| return PLDM_SUCCESS; |
| } |