dsp: platform: Add encode req & decode resp for GetEventReceiver command

Add encode and decode API for the Get Event Receiver command
This command is defined in DSP0248 as a conditional command.

The GetEventReceiver command is used to verify the values that were set
into an Event Generator using the SetEventReceiver command.

Change-Id: I411cc939d00bc69867507fe58911c813d0c1e2ae
Signed-off-by: Roger G. Coscojuela <roger.gili-coscojuela@sipearl.com>
diff --git a/src/dsp/platform.c b/src/dsp/platform.c
index 7ad8e2f..21ada82 100644
--- a/src/dsp/platform.c
+++ b/src/dsp/platform.c
@@ -2503,6 +2503,100 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_TESTING
+int encode_get_event_receiver_req(uint8_t instance_id, struct pldm_msg *msg,
+				  size_t payload_length LIBPLDM_CC_UNUSED)
+{
+	struct pldm_header_info header;
+	header.msg_type = PLDM_REQUEST;
+	header.instance = instance_id;
+	header.pldm_type = PLDM_PLATFORM;
+	header.command = PLDM_GET_EVENT_RECEIVER;
+
+	if (!msg) {
+		return -EINVAL;
+	}
+
+	return pack_pldm_header_errno(&header, &(msg->hdr));
+}
+
+LIBPLDM_ABI_TESTING
+int encode_get_event_receiver_resp(
+	uint8_t instance_id,
+	struct pldm_get_event_receiver_resp *event_receiver_info,
+	struct pldm_msg *msg, size_t *payload_length)
+{
+	PLDM_MSGBUF_DEFINE_P(buf);
+	int rc;
+	if (!msg || !event_receiver_info) {
+		return -EINVAL;
+	}
+
+	/* See Table 2, DSP0245 v1.4.0 */
+	if (event_receiver_info->transport_protocol_type !=
+	    PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP) {
+		return -ENOTSUP;
+	}
+
+	struct pldm_header_info header = { 0 };
+	header.msg_type = PLDM_RESPONSE;
+	header.instance = instance_id;
+	header.pldm_type = PLDM_PLATFORM;
+	header.command = PLDM_GET_EVENT_RECEIVER;
+
+	rc = pack_pldm_header_errno(&header, &(msg->hdr));
+	if (rc) {
+		return rc;
+	}
+	rc = pldm_msgbuf_init_errno(buf, PLDM_GET_EVENT_RECEIVER_MIN_RESP_BYTES,
+				    msg->payload, *payload_length);
+	if (rc) {
+		return rc;
+	}
+
+	pldm_msgbuf_insert(buf, event_receiver_info->completion_code);
+	pldm_msgbuf_insert(buf, event_receiver_info->transport_protocol_type);
+	pldm_msgbuf_insert(
+		buf, event_receiver_info->event_receiver_address.mctp_eid);
+	return pldm_msgbuf_complete_used(buf, *payload_length, payload_length);
+}
+
+LIBPLDM_ABI_TESTING
+int decode_get_event_receiver_resp(const struct pldm_msg *msg,
+				   size_t payload_length,
+				   struct pldm_get_event_receiver_resp *resp)
+{
+	PLDM_MSGBUF_DEFINE_P(buf);
+	int rc;
+	if (!msg) {
+		return -EINVAL;
+	}
+
+	rc = pldm_msg_has_error(msg, payload_length);
+	if (rc) {
+		resp->completion_code = rc;
+		return 0;
+	}
+
+	rc = pldm_msgbuf_init_errno(buf, PLDM_GET_EVENT_RECEIVER_MIN_RESP_BYTES,
+				    msg->payload, payload_length);
+	if (rc) {
+		return rc;
+	}
+	pldm_msgbuf_extract(buf, resp->completion_code);
+	rc = pldm_msgbuf_extract(buf, resp->transport_protocol_type);
+	if (rc) {
+		return pldm_msgbuf_discard(buf, rc);
+	}
+	if (resp->transport_protocol_type ==
+	    PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP) {
+		pldm_msgbuf_extract(buf, resp->event_receiver_address.mctp_eid);
+	} else {
+		return pldm_msgbuf_discard(buf, -ENOTSUP);
+	}
+	return pldm_msgbuf_complete_consumed(buf);
+}
+
 LIBPLDM_ABI_STABLE
 int encode_set_event_receiver_req(uint8_t instance_id,
 				  uint8_t event_message_global_enable,