[Skiboot] [PATCH v2 8/9] core/pldm/test : pldm FRU Table selftest

Abhishek Singh Tomar abhishek at linux.ibm.com
Sat May 7 16:36:01 AEST 2022


This patch contains:
1. PLDM FRU self test by sending PLDM_GET_FRU_RECORD_TABLE_METADATA
	request on behalf of BMC.
2. Test pldm_fru_get_table() response before and after fru table created

Signed-off-by: Abhishek Singh Tomar <abhishek at linux.ibm.com>
---
 core/pldm/test/Makefile.check  |   1 +
 core/pldm/test/test_pldm-fru.c | 224 +++++++++++++++++++++++++++++++++
 2 files changed, 225 insertions(+)
 create mode 100644 core/pldm/test/test_pldm-fru.c

diff --git a/core/pldm/test/Makefile.check b/core/pldm/test/Makefile.check
index c184702f..2295a99b 100644
--- a/core/pldm/test/Makefile.check
+++ b/core/pldm/test/Makefile.check
@@ -2,6 +2,7 @@
 PLDM_TEST := core/pldm/test/test_pldm-fileio \
 	     core/pldm/test/test_pldm-bios \
 	     core/pldm/test/test_pldm-platform \
+	     core/pldm/test/test_pldm-fru
 
 LCOV_EXCLUDE += $(PLDM_TEST:%=%.c)
 
diff --git a/core/pldm/test/test_pldm-fru.c b/core/pldm/test/test_pldm-fru.c
new file mode 100644
index 00000000..049dbce8
--- /dev/null
+++ b/core/pldm/test/test_pldm-fru.c
@@ -0,0 +1,224 @@
+// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+/*
+ * Copyright 2013-2019 IBM Corp.
+ */
+
+
+#include "common/test_pldm-common.c"
+
+
+#define TEST_BMC_VERSION "tes_t_1.0"
+
+bool get_fru_record_table_in_progress;
+int pldm_test_verify_response(void *response_msg, size_t response_len);
+int pldm_test_verify_response_fru(void *response_msg, size_t response_len);
+int test_fru_table_metadata_request(void);
+int pldm_test_reply_request_fru(void *request_msg, size_t request_len,
+		void **response_msg, size_t *response_len);
+int pldm_test_generate_reply_field_type_version(uint8_t record_type, uint8_t field_type,
+		uint8_t **fru_table, size_t *fru_table_size);
+
+
+/*
+ * This function tries to duplicate BMC functionality for Pldm self test
+ * It will only handle PLDM_FRU type response
+ */
+int pldm_test_verify_response(void *response_msg, size_t response_len)
+{
+	switch (((struct pldm_msg *)response_msg)->hdr.type) {
+
+	case PLDM_FRU:
+		return pldm_test_verify_response_fru(response_msg, response_len);
+
+	default:
+		printf("PLDM_TEST: Not equal to PLDM_FRU\n");
+		return OPAL_PARAMETER;
+	}
+
+
+}
+
+
+/*
+ * This function tries to duplicate BMC functionality for Pldm self test
+ * It will only handle PLDM_FRU type response and tries to verify that
+ * PLDM response is same as expected
+ */
+int pldm_test_verify_response_fru(void *response_msg, size_t response_len)
+{
+	uint8_t completion_code;
+	int ret = 0;
+	int  payload_len = 0;
+	uint8_t fru_data_major_version;
+	uint8_t fru_data_minor_version;
+	uint32_t fru_table_maximum_size;
+	uint32_t fru_table_length;
+	uint16_t total_record_set_identifiers;
+	uint16_t total_table_records;
+	uint32_t checksum;
+
+	switch (((struct pldm_msg *)response_msg)->hdr.command) {
+	case PLDM_GET_FRU_RECORD_TABLE_METADATA:
+
+		/*
+		 * Test that response  receive for
+		 * PLDM_GET_FRU_RECORD_TABLE_METADATA
+		 * only when specific request in progress
+		 */
+		if (get_fru_record_table_in_progress != true)
+			return OPAL_PARAMETER;
+
+		payload_len = response_len - sizeof(struct pldm_msg_hdr);
+		ret = decode_get_fru_record_table_metadata_resp(response_msg, payload_len,
+				&(completion_code), &fru_data_major_version,
+				&fru_data_minor_version,
+				&fru_table_maximum_size,
+				&fru_table_length,
+				&total_record_set_identifiers,
+				&total_table_records,
+				&checksum);
+
+		/*
+		 * Test if PLDM request completed with success i.e. completion code = PLDM_SUCCESS
+		 * and test if other parameter as expected then return PLDM_SUCCESS
+		 * else return error PLDM_ERROR_INVALID_DATA
+		 */
+		if (ret == OPAL_SUCCESS && completion_code == PLDM_SUCCESS &&
+				total_record_set_identifiers == 1
+				&& total_table_records == 1)
+			return PLDM_SUCCESS;
+		else
+			return PLDM_ERROR_INVALID_DATA;
+		break;
+
+	default:
+		return PLDM_ERROR_INVALID_DATA;
+
+	}
+
+	return PLDM_SUCCESS;
+
+
+
+}
+
+
+/*
+ * This function tries to duplicate BMC functionality for Pldm self test
+ * It will only handle PLDM_FRU type request
+ */
+int pldm_test_reply_request(void *request_msg, size_t request_len,
+		void **response_msg, size_t *response_len)
+{
+	switch (((struct pldm_msg *)request_msg)->hdr.type) {
+
+	case PLDM_FRU:
+		return pldm_test_reply_request_fru(request_msg, request_len,
+				response_msg, response_len);
+
+	default:
+		printf("PLDM_TEST: Not equal to PLDM_FRU \n");
+		return OPAL_PARAMETER;
+	}
+
+}
+
+
+/*
+ * This function tries to duplicate BMC functionality for Pldm self test
+ * it tries to handle PLDM_REQUEST for PLDM_FRU and reply with appropriate
+ * PLDM_RESPONSE message
+ */
+int pldm_test_reply_request_fru(void *request_msg, size_t request_len,
+		void **response_msg, size_t *response_len)
+{
+	switch (((struct pldm_msg *)request_msg)->hdr.command) {
+	case PLDM_GET_FRU_RECORD_BY_OPTION:
+		(void)request_len;
+		*response_msg = NULL;
+		*response_len = 0;
+
+		break;
+	default:
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	return PLDM_SUCCESS;
+
+}
+
+
+
+/*
+ * This function tries to duplicate BMC functionality for Pldm self test
+ * It tries to send PLDM_GET_FRU_RECORD_TABLE_METADATA on behalf of BMC
+ */
+int test_fru_table_metadata_request(void)
+{
+	void *pldm_req;
+	int size, ret;
+
+	size = sizeof(struct pldm_msg_hdr);
+	pldm_req = malloc(size);
+	/*
+	 * Enable flag that indicate PLDM_GET_FRU_RECORD_TABLE_METADATA
+	 * request in progress.
+	 * This flag is used only for test
+	 */
+	get_fru_record_table_in_progress = true;
+
+	/* Encode request on behalf of BMC */
+	ret = encode_get_fru_record_table_metadata_req(0, pldm_req, 0);
+	if (ret != PLDM_SUCCESS)
+		return ret;
+
+	/* initialize responder */
+	ret = pldm_mctp_responder_init();
+	if (ret != PLDM_SUCCESS)
+		return ret;
+
+	/* skip mctp layer directly call handle */
+	ret = pldm_handle(BMC_EID, pldm_req, size);
+	if (ret != PLDM_SUCCESS)
+		return ret;
+
+	/*
+	 * Disable flag that indicate PLDM_GET_FRU_RECORD_TABLE_METADATA
+	 * request in progress.
+	 * This flag is used only for test
+	 */
+	get_fru_record_table_in_progress = false;
+
+	return ret;
+
+}
+
+
+int main(void)
+{
+	int ret;
+	void *fru_record_table;
+	uint32_t fru_record_table_size;
+
+	/*
+	 * Trying to get fru table when fru table not created
+	 * @return error OPAL_PARAMETER
+	 */
+	ret = pldm_fru_get_table(&fru_record_table, &fru_record_table_size);
+	if (ret != OPAL_PARAMETER)
+		return OPAL_PARAMETER;
+
+	/* Sending request in behalf of bmc and checking response */
+	ret = test_fru_table_metadata_request();
+	if (ret != PLDM_SUCCESS) {
+		perror("encode_get_fru_record_table_metadata_req");
+		return ret;
+	}
+
+	/* Trying to get fru table when fru table created */
+	ret = pldm_fru_get_table(&fru_record_table, &fru_record_table_size);
+	if (ret != PLDM_SUCCESS)
+		return OPAL_PARAMETER;
+
+}
+
-- 
2.34.1



More information about the Skiboot mailing list