From patchwork Wed May 4 06:55:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhishek Singh Tomar X-Patchwork-Id: 1626093 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=fFWJU5iW; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org (client-ip=2404:9400:2:0:216:3eff:fee1:b9f1; helo=lists.ozlabs.org; envelope-from=skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org; receiver=) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2404:9400:2:0:216:3eff:fee1:b9f1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4KtSLt5wnFz9sG4 for ; Wed, 4 May 2022 16:57:26 +1000 (AEST) Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4KtSLt4qN6z3bYF for ; Wed, 4 May 2022 16:57:26 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=fFWJU5iW; dkim-atps=neutral X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=linux.ibm.com (client-ip=148.163.156.1; helo=mx0a-001b2d01.pphosted.com; envelope-from=abhishek@linux.ibm.com; receiver=) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=fFWJU5iW; dkim-atps=neutral Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4KtSLp1tGLz2xKW for ; Wed, 4 May 2022 16:57:22 +1000 (AEST) Received: from pps.filterd (m0098393.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 2446kVd6009293 for ; Wed, 4 May 2022 06:57:19 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : date : message-id : mime-version : content-transfer-encoding; s=pp1; bh=kniyAdZcZ2dq34KlD29Kt47vkptAoLpmV+n0+aFOPPk=; b=fFWJU5iWJOfYnF7uEgYFc10UPNHP+g/zpkTjWcAYJX227qIDafhmC3nQm7mjFloG4wQM qwQryqc75ZbuFOsUY5wkyBUioI0z8PKqin0CVPQcU3ZGl1wpoP2exqrtmIxpasysUtrk fByHFkotxtL6ALRGksT8tYuniNdFb5X39hDB2enHOjsYzemu3bZN+RLGeQ71k3nePzOL MyAE9X9z1Ajhf07BGC0VBjDiLRgqqqRnRBPstErjP6LLElI+KduyDU3gUV6VjMJDmMcy ZMdFticpFZIN/3092R9sGe6at5sZ4xT5YDiCbnntFMuT09+OLTqj139GnM24zh4FuvKS Dg== Received: from ppma04fra.de.ibm.com (6a.4a.5195.ip4.static.sl-reverse.com [149.81.74.106]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3fumgxg4ka-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 04 May 2022 06:57:18 +0000 Received: from pps.filterd (ppma04fra.de.ibm.com [127.0.0.1]) by ppma04fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 2446qZbY008251 for ; Wed, 4 May 2022 06:57:15 GMT Received: from b06avi18878370.portsmouth.uk.ibm.com (b06avi18878370.portsmouth.uk.ibm.com [9.149.26.194]) by ppma04fra.de.ibm.com with ESMTP id 3frvr8v5r8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 04 May 2022 06:57:15 +0000 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06avi18878370.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 2446vAOs21299602 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 4 May 2022 06:57:10 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 49C815204E; Wed, 4 May 2022 06:57:12 +0000 (GMT) Received: from li-22421c4c-355e-11b2-a85c-fdc6c782cba9.in.ibm.com (unknown [9.109.222.255]) by d06av21.portsmouth.uk.ibm.com (Postfix) with ESMTP id 526F45204F; Wed, 4 May 2022 06:57:11 +0000 (GMT) From: Abhishek Singh Tomar To: skiboot@lists.ozlabs.org Date: Wed, 4 May 2022 12:25:52 +0530 Message-Id: <20220504065555.20551-1-abhishek@linux.ibm.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: FB7X0YenWwbeGqaCza-ECQaPZKaaWbY3 X-Proofpoint-GUID: FB7X0YenWwbeGqaCza-ECQaPZKaaWbY3 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.858,Hydra:6.0.486,FMLib:17.11.64.514 definitions=2022-05-04_02,2022-05-02_03,2022-02-23_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 suspectscore=0 adultscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 spamscore=0 clxscore=1011 priorityscore=1501 malwarescore=0 lowpriorityscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2202240000 definitions=main-2205040040 Subject: [Skiboot] [PATCH 1/4] core/pldm/test : pldm file io test X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Abhishek Singh Tomar Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" The self test for PLDM FIle IO implementation Signed-off-by: Abhishek Singh Tomar --- core/pldm/pldm-file-io-requests.c | 12 +- core/pldm/pldm.h | 2 +- core/pldm/test/Makefile.check | 42 ++++ core/pldm/test/common/test_pldm-common.c | 181 ++++++++++++++ core/pldm/test/test_pldm-fileio.c | 303 +++++++++++++++++++++++ 5 files changed, 538 insertions(+), 2 deletions(-) create mode 100644 core/pldm/test/Makefile.check create mode 100644 core/pldm/test/common/test_pldm-common.c create mode 100644 core/pldm/test/test_pldm-fileio.c diff --git a/core/pldm/pldm-file-io-requests.c b/core/pldm/pldm-file-io-requests.c index 94828fcd..50ddb0e4 100644 --- a/core/pldm/pldm-file-io-requests.c +++ b/core/pldm/pldm-file-io-requests.c @@ -155,9 +155,15 @@ static int read_file_req(uint32_t file_handle, uint32_t file_length, file_req.length = MAX_TRANSFER_SIZE_BYTES; } +#ifndef __TEST__ prlog(PR_TRACE, "%s - file_handle: %d, offset: 0x%x, size: 0x%llx num_transfers: %d\n", __func__, file_handle, file_req.offset, size, num_transfers); +#else + prlog(PR_TRACE, "%s - file_handle: %d, offset: 0x%x, size: 0x%lx num_transfers: %d\n", + __func__, file_handle, file_req.offset, + size, num_transfers); +#endif for (i = 0; i < num_transfers; i++) { file_req.offset = offset + (i * MAX_TRANSFER_SIZE_BYTES); @@ -210,9 +216,13 @@ static int read_file_req(uint32_t file_handle, uint32_t file_length, total_read += resp_length; curr_buf += resp_length; free(response_msg); - +#ifndef __TEST__ prlog(PR_TRACE, "%s - file_handle: %d, resp_length: 0x%x, total_read: 0x%llx\n", __func__, file_handle, resp_length, total_read); +#else + prlog(PR_TRACE, "%s - file_handle: %d, resp_length: 0x%x, total_read: 0x%lx\n", + __func__, file_handle, resp_length, total_read); +#endif if (total_read == size) break; diff --git a/core/pldm/pldm.h b/core/pldm/pldm.h index 81df9f8b..5ac9c443 100644 --- a/core/pldm/pldm.h +++ b/core/pldm/pldm.h @@ -45,7 +45,7 @@ extern int watchdog_period_sec; * @example enum_bit(1) = 0x00000002 * @example enum_bit(4) = 0x00000010 */ -inline uint32_t enum_bit(unsigned int enumeration) +extern inline uint32_t enum_bit(unsigned int enumeration) { return 1 << enumeration; } diff --git a/core/pldm/test/Makefile.check b/core/pldm/test/Makefile.check new file mode 100644 index 00000000..42d60993 --- /dev/null +++ b/core/pldm/test/Makefile.check @@ -0,0 +1,42 @@ +# -*-Makefile-*- +PLDM_TEST := core/pldm/test/test_pldm-fileio \ + +LCOV_EXCLUDE += $(PLDM_TEST:%=%.c) + +.PHONY : core-pldm-check core-pldm-coverage +core-pldm-check: $(PLDM_TEST:%=%-check) +core-pldm-coverage: $(PLDM_TEST:%=%-gcov-run) +HOSTCFLAG_PLDM:= $(filter-out -Wdeclaration-after-statement,$(HOSTCFLAGS)) +HOSTCFLAG_PLDM:= $(filter-out -Wstrict-prototypes,$(HOSTCFLAG_PLDM)) +HOSTCFLAG_PLDM:= $(filter-out -Wjump-misses-init,$(HOSTCFLAG_PLDM)) +HOSTCFLAG_PLDM:= $(filter-out -Wmissing-prototypes,$(HOSTCFLAG_PLDM)) +HOSTCFLAG_PLDM:= $(filter-out -Wmissing-declarations,$(HOSTCFLAG_PLDM)) + +check: core-pldm-check +coverage: core-pldm-coverage + +$(PLDM_TEST:%=%-gcov-run) : %-run: % + $(call Q, TEST-COVERAGE ,$< , $<) + +$(PLDM_TEST:%=%-check) : %-check: % + $(call Q, RUN-TEST ,$(VALGRIND) $<, $<) + +core/test/stubs.o: core/test/stubs.c + $(call Q, HOSTCC ,$(HOSTCC) $(HOSTCFLAGS) -I . -I include -Wno-error=attributes -g -c -o core/test/stubs.o core/test/stubs.c, $<) + +$(PLDM_TEST) : % : %.c core/test/stubs.o + $(call Q, HOSTCC ,$(HOSTCC) $(HOSTCFLAG_PLDM) -O0 -g -I include -I . -I pldm/libpldm/ -I libfdt -o $@ $< core/test/stubs.o -g, $<) + +$(PLDM_TEST:%=%-gcov): %-gcov : %.c % + $(call Q, HOSTCC ,$(HOSTCC) $(HOSTFLAG_PLDM) $(HOSTGCOVCFLAGS) -I include -I . -I pldm/libpldm/ -I libfdt -lgcov -o $@ $<, $<) + +$(PLDM_TEST:%=%-gcov): % : $(%.d:-gcov=) + +-include $(wildcard core/pldm/test/*.d) + +clean: pldm-test-clean + +pldm-test-clean: + $(RM) -f core/pldm/test/*.[od] $(PLDM_TEST) $(PLDM_TEST:%=%-gcov) + $(RM) -f *.gcda *.gcno skiboot.info + $(RM) -rf coverage-report diff --git a/core/pldm/test/common/test_pldm-common.c b/core/pldm/test/common/test_pldm-common.c new file mode 100644 index 00000000..8a6d12b9 --- /dev/null +++ b/core/pldm/test/common/test_pldm-common.c @@ -0,0 +1,181 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define __LITTLE_ENDIAN_BITFIELD +#define __TEST__ +#define __SKIBOOT__ +#define zalloc(bytes) calloc((bytes), 1) +static inline unsigned long mftb(void); +#include +#include +#include +#include "../../pldm.h" +#include +#include +#ifdef ARRAY_SIZE +#undef ARRAY_SIZE +#endif + + +#include +#include +#undef pr_fmt +#include "../../pldm-bios-requests.c" +#include +#include +#include +#include +#include +#include +#include +#include "../../pldm-file-io-requests.c" +#include "../../pldm-requester.c" +#include "../../pldm-common.c" +#include "../../pldm-responder.c" +#include "../../pldm-base-requests.c" +#include "../../pldm-watchdog.c" +#include "../../pldm-fru-requests.c" +#include "../../pldm-platform-requests.c" +#include "../../../device.c" + + + +char __rodata_start[1], __rodata_end[1]; +unsigned long tb_hz = 512000000; +struct dt_node *dt_root; +struct debug_descriptor debug_descriptor; +struct platform platform; + +int pldm_test_reply_request(void *request_msg, size_t request_len, + void **response_msg, size_t *response_len); +int pldm_test_verify_response(void *response_msg, size_t response_len); + +void time_wait_ms(unsigned long ms) +{ + usleep(ms * 1000); +} +void init_timer(struct timer *t, timer_func_t expiry, void *data) +{ + t->link.next = t->link.prev = NULL; + t->target = 0; + t->expiry = expiry; + t->user_data = data; + t->running = NULL; +} +uint64_t schedule_timer(struct timer *t, uint64_t how_long) +{ + if (t != NULL) + return how_long; + return 0; +} +void cancel_timer(struct timer *t) +{ + t->link.next = t->link.prev = NULL; +} + +static inline unsigned long mftb(void) +{ + unsigned long clk; + + clk = clock(); + return clk; +} + +int ast_mctp_init(void (*fn)(uint8_t src_eid, bool tag_owner, uint8_t msg_tag, void *data, + void *msg, size_t len)) +{ + if (fn != NULL) + return PLDM_SUCCESS; + return PLDM_ERROR_INVALID_DATA; +} + +int ast_mctp_message_tx(uint8_t eid, uint8_t *msg, int len) +{ + int ret; + uint8_t *pldm_received_msg = msg+1; + void *response_msg; + char *vmsg; + size_t response_len; + + // TEST if eid is BMC_ID + if (eid != BMC_EID) + return OPAL_PARAMETER; + + // TEST if Message TYPE: PLDM = 0x01 (000_0001b) as per MCTP - DSP0240 + + if (msg[0] != 0x01) { + printf("TEST : %s : request MCTP message type not set for PLDM\n", __func__); + return OPAL_PARAMETER; + } + + if (((struct pldm_msg *)pldm_received_msg)->hdr.request == PLDM_RESPONSE) { + ret = pldm_test_verify_response(pldm_received_msg, len-1); + if (ret != PLDM_SUCCESS) + return ret; + } + +// Reply to requests + else if (((struct pldm_msg *)pldm_received_msg)->hdr.request == PLDM_REQUEST) { + ret = pldm_test_verify_response(pldm_received_msg, len-1); + ret = pldm_test_reply_request(pldm_received_msg, len-1, + &response_msg, &response_len); + if (ret != PLDM_SUCCESS) + return ret; + vmsg = malloc(response_len+1); + // TYPE: PLDM = 0x01 (000_0001b) as per MCTP - DSP0240 + vmsg[0] = 0x01; + memcpy(vmsg + 1, response_msg, response_len); + + pldm_rx_message(BMC_EID, 0, 0, NULL, vmsg, response_len+1); + } + + return PLDM_SUCCESS; +} + +void ast_mctp_exit(void) +{ + return; +} + +void lock_caller(struct lock *l, const char *caller) +{ + (void)caller; + assert(!l->lock_val); + l->lock_val++; +} + +int _opal_queue_msg(enum opal_msg_type msg_type, void *data, + void (*consumed)(void *data, int status), + size_t params_size, const void *params) +{ + (void)msg_type; + if (data != NULL || consumed != NULL) + return OPAL_PARAMETER; + if (params != NULL && params_size > 0) + return OPAL_PARAMETER; + return PLDM_SUCCESS; + +} + + +void unlock(struct lock *l) +{ + assert(l->lock_val); + l->lock_val = 0; +} + +void prd_occ_reset(uint32_t proc) +{ + (void)proc; +} + diff --git a/core/pldm/test/test_pldm-fileio.c b/core/pldm/test/test_pldm-fileio.c new file mode 100644 index 00000000..bf6cbfce --- /dev/null +++ b/core/pldm/test/test_pldm-fileio.c @@ -0,0 +1,303 @@ +#include "common/test_pldm-common.c" + + +#define TEST_FILE_IO_NAME "81e0066b.lid" +#define TEST_FILE_IO_HANDLE 11 +#define TEST_FILE_IO_LENGTH 50 +#define TEST_FILE_IO_BUF1 "This is Test buffer Open power Foundation" + +void *pldm_file_io_buff[TEST_FILE_IO_LENGTH]; +uint32_t test_Filetable_entry_generate(uint8_t **file_attr_table); +int pldm_test_reply_request_file_io(void *request_msg, size_t request_len, + void **response_msg, size_t *response_len); + +int pldm_test_reply_request(void *request_msg, size_t request_len, + void **response_msg, size_t *response_len); + + +/* + * This function tries to duplicate BMC functionality for Pldm self test + * It will handle pldm response message + * For now we don't have any response + */ +int pldm_test_verify_response(void *response_msg, size_t response_len) +{ + if (response_len > 0 || response_msg != NULL) + return OPAL_PARAMETER; + + return OPAL_PARAMETER; + +} + +/* + * This function tries to duplicate BMC functionality for Pldm self test + * This Genrate Filetable entry for self test + * The file table contains the list of files available and + * their attributes. + * + * Ex: + * { + * "FileHandle": "11", + * "FileNameLength": 12, + * "FileName": "81e0066b.lid", + * "FileSize": 589824, + * "FileTraits": 6 + * } + */ +uint32_t test_Filetable_entry_generate(uint8_t **file_attr_table) +{ + struct pldm_file_attr_table_entry *pldm_file_attr_table_entry; + uint8_t FileName[] = TEST_FILE_IO_NAME; + uint32_t file_length = TEST_FILE_IO_LENGTH; + int size; + + // calculate sizeof whole struct + size = sizeof(struct pldm_file_attr_table_entry *) + strlen(FileName) + + sizeof(file_length) - 1; + *file_attr_table = malloc(size); + + pldm_file_attr_table_entry = (struct pldm_file_attr_table_entry *)*file_attr_table; + pldm_file_attr_table_entry->file_handle = TEST_FILE_IO_HANDLE; + pldm_file_attr_table_entry->file_name_length = strlen(FileName); + memcpy(pldm_file_attr_table_entry->file_attr_table_nst, FileName, + strlen(FileName)); + + memcpy(pldm_file_attr_table_entry->file_attr_table_nst + strlen(FileName), + (uint8_t *)&file_length, sizeof(file_length)); + + return size; + + +} +/* + * This function tries to duplicate BMC functionality for Pldm self test + * It will only handle PLDM_OEM type request + * As fileio test will have only pldm request of type = PLDM_OEM + */ +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_OEM: + return pldm_test_reply_request_file_io(request_msg, request_len, + response_msg, response_len); + default: + printf("PLDM_TEST: Not equal to PLDM_OEM\n"); + return OPAL_PARAMETER; + } + + +} + + +/* + * This function tries to duplicate BMC functionality for Pldm self test + * it tries to handle PLDM_REQUEST for fileio and reply with appropriate PLDM_RESPONSE + * message + */ +int pldm_test_reply_request_file_io(void *request_msg, size_t request_len, + void **response_msg, size_t *response_len) +{ + int size = 0; + int ret; + void *payload_data; + int payload_len = 0; + uint32_t offset; //!< Offset to file where write starts + uint32_t length; + uint32_t file_handle; //!< Handle to file + size_t file_data_offset = 0; + uint32_t transfer_handle; + uint8_t transfer_opflag; + uint8_t table_type; + uint8_t *file_attr_table; + uint32_t table_size; + struct pldm_write_file_req file_req; + + +// check command received and reply with appropriate pldm response message + switch (((struct pldm_msg *)request_msg)->hdr.command) { + case PLDM_GET_FILE_TABLE: + + payload_len = request_len - sizeof(struct pldm_msg_hdr); + + ret = decode_get_file_table_req(request_msg, payload_len, &transfer_handle, + &transfer_opflag, &table_type); + if (ret != PLDM_SUCCESS) + return ret; + + // Generate Filetable entry for self test + table_size = test_Filetable_entry_generate(&file_attr_table); + + *response_len = sizeof(struct pldm_msg_hdr) + + sizeof(struct pldm_get_file_table_resp) + + table_size - 1; + *response_msg = malloc(*response_len); + + ret = encode_get_file_table_resp(((struct pldm_msg *)request_msg)->hdr.instance_id, + PLDM_SUCCESS, PLDM_GET_NEXTPART, PLDM_START_AND_END, + file_attr_table, table_size, *response_msg); + if (ret != PLDM_SUCCESS) + return ret; + + free(file_attr_table); + + break; + case PLDM_WRITE_FILE: + + payload_len = request_len - sizeof(struct pldm_msg_hdr); + + + ret = decode_write_file_req(request_msg, payload_len, &file_handle, + &offset, &length, &file_data_offset); + if (ret != PLDM_SUCCESS) + return ret; + + // TEST : if file handle received is same as that we send while making + // call to pldm request (i.e. TEST_FILE_IO_HANDLE). + // so PLDM message are recieved without any distortion in path. + if (file_handle != TEST_FILE_IO_HANDLE) + return PLDM_ERROR_INVALID_DATA; + + payload_data = ((struct pldm_msg *)request_msg)->payload + + sizeof(file_req.file_handle) + + sizeof(file_req.offset) + + sizeof(file_req.length); + + memcpy(pldm_file_io_buff, payload_data, length); + + // TEST : if file buff received is same as that we send while making + // call to pldm request (i.e TEST_FILE_IO_BUF1). + // so PLDM message are transferred without distortion in path. + if (strncmp(TEST_FILE_IO_BUF1, (char *)payload_data, length) != 0) { + perror("TEST :: String not matched"); + return PLDM_ERROR_INVALID_DATA; + } + *response_len = sizeof(struct pldm_msg_hdr) + + sizeof(struct pldm_write_file_resp); + *response_msg = malloc(*response_len); + + ret = encode_write_file_resp( + ((struct pldm_msg *)request_msg)->hdr.instance_id, + PLDM_SUCCESS, size, *response_msg); + if (ret != PLDM_SUCCESS) + return ret; + + break; + case PLDM_READ_FILE: + + payload_len = request_len - sizeof(struct pldm_msg_hdr); + ret = decode_read_file_req(request_msg, payload_len, &file_handle, &offset, + &length); + + if (ret != PLDM_SUCCESS) + return ret; + + // TEST : if file handle received is same as that we send while making + // call to pldm request (i.e. TEST_FILE_IO_HANDLE). + // so PLDM message are transferred without any distortion in path. + if (file_handle != TEST_FILE_IO_HANDLE) { + perror("TEST :: File Handle not matched"); + return PLDM_ERROR_INVALID_DATA; + + } + + // check if length + offset < TEST_FILE_IO_LENGTH + // so required data length can be readed + if (file_handle != TEST_FILE_IO_HANDLE || + length + offset > TEST_FILE_IO_LENGTH) { + perror("TEST : length+offset Invalid"); + return PLDM_ERROR_INVALID_DATA; + } + + size = length; + + *response_len = sizeof(struct pldm_msg_hdr) + + sizeof(struct pldm_read_file_resp) + size - 1; + *response_msg = malloc(*response_len); + + + + encode_read_file_resp(((struct pldm_msg *)request_msg)->hdr.instance_id, + PLDM_SUCCESS, size, *response_msg); + + if (ret != PLDM_SUCCESS) + return ret; + + struct pldm_read_file_resp *response = (struct pldm_read_file_resp *) + ((struct pldm_msg *)*response_msg)->payload; + + // Copy required buffer to end of PLDM response + memcpy(response->file_data, pldm_file_io_buff + offset, size); + break; + + default: + return PLDM_ERROR_INVALID_DATA; + + } + + return PLDM_SUCCESS; + + + +} + + +int main(void) +{ + size_t ret; + char buf_read[TEST_FILE_IO_LENGTH]; + char buf_write[TEST_FILE_IO_LENGTH] = TEST_FILE_IO_BUF1; + uint64_t size = strlen(buf_write); + +// Initialize test buffer for represent file with 0 + bzero(pldm_file_io_buff, TEST_FILE_IO_LENGTH); + + +// Attempt to write using pldm file io before init should return error OPAL_PARAMTER + ret = pldm_file_io_write_file(TEST_FILE_IO_HANDLE, TEST_FILE_IO_BUF1, 0, size); + if (ret != OPAL_PARAMETER) { + perror("pldm_file_io_write_file"); + return ret; + } + +// Attempt to read using pldm file io before init should return error OPAL_PARAMTER + ret = pldm_file_io_read_file(TEST_FILE_IO_HANDLE, TEST_FILE_IO_LENGTH, buf_read, 0, size); + if (ret != OPAL_PARAMETER) { + perror("pldm_file_io_write_file"); + return ret; + } + +// Init PLDM File IO + ret = pldm_file_io_init(); + if (ret != PLDM_SUCCESS) { + perror("pldm_file_io_write_file"); + return ret; + } + +// Attempt to write using pldm file io should return PLDM SUCCESS after init + ret = pldm_file_io_write_file(TEST_FILE_IO_HANDLE, TEST_FILE_IO_BUF1, + 0, size); + if (ret != PLDM_SUCCESS) { + perror("pldm_file_io_write_file"); + return ret; + } + +// Attempt to read: using pldm file io should return PLDM SUCCESS after init + ret = pldm_file_io_read_file(TEST_FILE_IO_HANDLE, TEST_FILE_IO_LENGTH, buf_read, 0, size); + if (ret != PLDM_SUCCESS) { + perror("pldm_file_io_write_file"); + return ret; + } + +// Test if buffer read same as buffer send + if (strncmp(buf_read, TEST_FILE_IO_BUF1, size) != 0) { + + perror("pldm read string mismatch"); + return OPAL_PARAMETER; + } + + return PLDM_SUCCESS; +} + + From patchwork Wed May 4 06:55:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhishek Singh Tomar X-Patchwork-Id: 1626094 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=l18MivUM; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org (client-ip=112.213.38.117; helo=lists.ozlabs.org; envelope-from=skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org; receiver=) Received: from lists.ozlabs.org (lists.ozlabs.org [112.213.38.117]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4KtSM1026gz9sG4 for ; Wed, 4 May 2022 16:57:32 +1000 (AEST) Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4KtSM05fnCz3bZC for ; Wed, 4 May 2022 16:57:32 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=l18MivUM; dkim-atps=neutral X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=linux.ibm.com (client-ip=148.163.158.5; helo=mx0a-001b2d01.pphosted.com; envelope-from=abhishek@linux.ibm.com; receiver=) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=l18MivUM; dkim-atps=neutral Received: from mx0a-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4KtSLr683wz2xKW for ; Wed, 4 May 2022 16:57:24 +1000 (AEST) Received: from pps.filterd (m0098419.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 244604nD007577 for ; Wed, 4 May 2022 06:57:22 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=pp1; bh=EkJBxNMmItkvh7P86fc9Q2g5SiOzSHQCDyUslOU5sLE=; b=l18MivUM9ibuZw37IYWItll089Pd4BMKnJPpydbL83l94LCA9wUTfg0ssSRzJZp7R+dq dQg1mAghYrPI8g2r43ErhB/c2LSbn87YF5Jz53bttL5Bjn+PQF668JARu10QHozH/h9n PVGBsvgRc0CKcqgLhlHVwwkz17RaKQpUTYuDugNzLZp/94obwMIr/wlg3ukf4Ufs/bez OrmkL8WJNpNVfIBcxNyojwRSVfsDHEWZKqAzqot0UsVjS8n/TJqi3kDHzqjRSjHm6jTm 5pebes/QVcYLVFDlY6AXncdTj/s8a1Anyz50ORwSwSrvNUNQJQ/wvW/LAl5nbF9B+2ke Nw== Received: from ppma06ams.nl.ibm.com (66.31.33a9.ip4.static.sl-reverse.com [169.51.49.102]) by mx0b-001b2d01.pphosted.com (PPS) with ESMTPS id 3fuku7rxq2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 04 May 2022 06:57:21 +0000 Received: from pps.filterd (ppma06ams.nl.ibm.com [127.0.0.1]) by ppma06ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 2446qObH014283 for ; Wed, 4 May 2022 06:57:19 GMT Received: from b06cxnps3074.portsmouth.uk.ibm.com (d06relay09.portsmouth.uk.ibm.com [9.149.109.194]) by ppma06ams.nl.ibm.com with ESMTP id 3frvcj56ga-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 04 May 2022 06:57:19 +0000 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 2446vGA844695876 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 4 May 2022 06:57:16 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4843F5204F; Wed, 4 May 2022 06:57:16 +0000 (GMT) Received: from li-22421c4c-355e-11b2-a85c-fdc6c782cba9.in.ibm.com (unknown [9.109.222.255]) by d06av21.portsmouth.uk.ibm.com (Postfix) with ESMTP id 76A115204E; Wed, 4 May 2022 06:57:15 +0000 (GMT) From: Abhishek Singh Tomar To: skiboot@lists.ozlabs.org Date: Wed, 4 May 2022 12:25:53 +0530 Message-Id: <20220504065555.20551-2-abhishek@linux.ibm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220504065555.20551-1-abhishek@linux.ibm.com> References: <20220504065555.20551-1-abhishek@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: 5o2R_vl9MastJha68pqdKe7mTv2cdGx6 X-Proofpoint-ORIG-GUID: 5o2R_vl9MastJha68pqdKe7mTv2cdGx6 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.858,Hydra:6.0.486,FMLib:17.11.64.514 definitions=2022-05-04_02,2022-05-02_03,2022-02-23_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 spamscore=0 clxscore=1015 priorityscore=1501 bulkscore=0 malwarescore=0 adultscore=0 lowpriorityscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2202240000 definitions=main-2205040042 Subject: [Skiboot] [PATCH 2/4] core/pldm/test : pldm bios test X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Abhishek Singh Tomar Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" The self test for PLDM BIOS implementation Signed-off-by: Abhishek Singh Tomar --- core/pldm/pldm-lid-files.c | 16 +- core/pldm/test/Makefile.check | 1 + core/pldm/test/common/test_pldm-common.c | 1 + core/pldm/test/test_pldm-bios.c | 240 +++++++++++++++++++++++ 4 files changed, 254 insertions(+), 4 deletions(-) create mode 100644 core/pldm/test/test_pldm-bios.c diff --git a/core/pldm/pldm-lid-files.c b/core/pldm/pldm-lid-files.c index e8122268..2d8685d2 100644 --- a/core/pldm/pldm-lid-files.c +++ b/core/pldm/pldm-lid-files.c @@ -261,8 +261,11 @@ static int lid_files_read(struct blocklevel_device *bl __unused, /* LPC is only 32bit */ if (pos > UINT_MAX || len > UINT_MAX) return FLASH_ERR_PARM_ERROR; - +#ifndef __TEST__ prlog(PR_TRACE, "lid files read at 0x%llx for 0x%llx\n", pos, len); +#else + prlog(PR_TRACE, "lid files read at 0x%lx for 0x%lx\n", pos, len); +#endif if (pos == 0) { /* return a 'fake' header flash */ @@ -290,9 +293,11 @@ static int lid_files_write(struct blocklevel_device *bl __unused, /* LPC is only 32bit */ if (pos > UINT_MAX || len > UINT_MAX) return FLASH_ERR_PARM_ERROR; - +#ifndef __TEST__ prlog(PR_TRACE, "lid files write at 0x%llx for 0x%llx\n", pos, len); - +#else + prlog(PR_TRACE, "lid files write at 0x%lx for 0x%lx\n", pos, len); +#endif /* convert offset to lid id */ lid = vaddr_to_lid_id(pos); if (!lid) @@ -306,8 +311,11 @@ static int lid_files_write(struct blocklevel_device *bl __unused, static int lid_files_erase(struct blocklevel_device *bl __unused, uint64_t pos, uint64_t len) { - +#ifndef __TEST__ prlog(PR_TRACE, "lid files erase at 0x%llx for 0x%llx\n", pos, len); +#else + prlog(PR_TRACE, "lid files erase at 0x%lx for 0x%lx\n", pos, len); +#endif return OPAL_UNSUPPORTED; } diff --git a/core/pldm/test/Makefile.check b/core/pldm/test/Makefile.check index 42d60993..ce43dea0 100644 --- a/core/pldm/test/Makefile.check +++ b/core/pldm/test/Makefile.check @@ -1,5 +1,6 @@ # -*-Makefile-*- PLDM_TEST := core/pldm/test/test_pldm-fileio \ + core/pldm/test/test_pldm-bios \ LCOV_EXCLUDE += $(PLDM_TEST:%=%.c) diff --git a/core/pldm/test/common/test_pldm-common.c b/core/pldm/test/common/test_pldm-common.c index 8a6d12b9..4fb97ecd 100644 --- a/core/pldm/test/common/test_pldm-common.c +++ b/core/pldm/test/common/test_pldm-common.c @@ -46,6 +46,7 @@ static inline unsigned long mftb(void); #include "../../pldm-watchdog.c" #include "../../pldm-fru-requests.c" #include "../../pldm-platform-requests.c" +#include "../../pldm-lid-files.c" #include "../../../device.c" diff --git a/core/pldm/test/test_pldm-bios.c b/core/pldm/test/test_pldm-bios.c new file mode 100644 index 00000000..53447a68 --- /dev/null +++ b/core/pldm/test/test_pldm-bios.c @@ -0,0 +1,240 @@ +#include "common/test_pldm-common.c" + + +#define TEST_BIOS_STRING "hb_lid_ids" +#define TEST_BIOS_STRING_HANDLE 60 +#define TEST_ATTR_HANDLE 0 +#define TEST_ATTR_STRING_MIN_LEN 0 +#define TEST_ATTR_STRING_MAX_LEN 0 +#define TEST_ATTR_STRING_DEFAULT_LEN 0 +#define TEST_ATTR_STRING_DEFAULT "" +#define TEST_VALUE_TABLE_CURRENT_STR "ATTR_PERM=81e00663,ATTR_TMP=81e00664,NVRAM=81e0066b" +#define TEST_VALID_ATTR_NAME "ATTR_TMP" + + +/* + * This function tries to duplicate BMC functionality for Pldm self test + * It will handle pldm response message + * For now we don't have any response + */ +int pldm_test_verify_response(void *response_msg, size_t response_len) +{ + if (response_len > 0 || response_msg != NULL) + return OPAL_PARAMETER; + + return OPAL_PARAMETER; + +} + + +int pldm_test_reply_request_bios(void *request_msg, size_t request_len, + void **response_msg, size_t *response_len); + +/* + * This function tries to duplicate BMC functionality for Pldm self test + * It generate bios table for self test based on input parameter tabletype + */ +uint32_t test_table_entry_generate(uint8_t **bios_table, uint8_t tableType) +{ + uint32_t bios_table_length = 0; + int pad_len = 0; + uint32_t checksum = 0; + + switch (tableType) { + + case PLDM_BIOS_STRING_TABLE: + bios_table_length = sizeof(struct pldm_bios_string_table_entry) + + strlen(TEST_BIOS_STRING) - 1; + + // calculate padding length + if (bios_table_length % 4) + pad_len = 4 - (bios_table_length % 4); + else + pad_len = 0; + bios_table_length += sizeof(uint32_t) + pad_len; + + *bios_table = malloc(bios_table_length); + memset(*bios_table, 0, bios_table_length); + struct pldm_bios_string_table_entry *string_entry = + (struct pldm_bios_string_table_entry *)(*bios_table); + string_entry->string_handle = htole16(TEST_BIOS_STRING_HANDLE); + string_entry->string_length = htole16(strlen(TEST_BIOS_STRING)); + memcpy(string_entry->name, TEST_BIOS_STRING, string_entry->string_length); + break; + + case PLDM_BIOS_ATTR_TABLE: + struct pldm_bios_table_attr_entry_string_info info; + + bios_table_length = sizeof(struct pldm_bios_attr_table_entry) + + sizeof(struct attr_table_string_entry_fields) + + strlen(TEST_ATTR_STRING_DEFAULT); + + // calculate padding length + if (bios_table_length % 4) + pad_len = 4 - (bios_table_length % 4); + else + pad_len = 0; + bios_table_length += sizeof(uint32_t) + pad_len; + + *bios_table = malloc(bios_table_length); + memset(*bios_table, 0, bios_table_length); + + info.name_handle = TEST_BIOS_STRING_HANDLE; + info.read_only = 0; + info.string_type = PLDM_BIOS_STRING; + info.min_length = TEST_ATTR_STRING_MIN_LEN; + info.max_length = TEST_ATTR_STRING_MAX_LEN; + info.def_length = TEST_ATTR_STRING_DEFAULT_LEN; + info.def_string = malloc(strlen(TEST_ATTR_STRING_DEFAULT)); + memcpy((uint8_t *)info.def_string, TEST_ATTR_STRING_DEFAULT, + strlen(TEST_ATTR_STRING_DEFAULT)); + pldm_bios_table_attr_entry_string_encode(*bios_table, bios_table_length, &info); + free((uint8_t *)info.def_string); + break; + + case PLDM_BIOS_ATTR_VAL_TABLE: + bios_table_length = sizeof(struct pldm_bios_attr_val_table_entry) + + sizeof(uint16_t) + sizeof(TEST_VALUE_TABLE_CURRENT_STR) - 1; + + // calculate padding length + if (bios_table_length % 4) + pad_len = 4 - (bios_table_length % 4); + else + pad_len = 0; + bios_table_length += sizeof(uint32_t) + pad_len; + + *bios_table = malloc(bios_table_length); + memset(*bios_table, 0, bios_table_length); + + pldm_bios_table_attr_value_entry_encode_string(*bios_table, bios_table_length, + TEST_ATTR_HANDLE, PLDM_BIOS_STRING, + sizeof(TEST_VALUE_TABLE_CURRENT_STR), + TEST_VALUE_TABLE_CURRENT_STR); + break; + default: + printf("PLDM_TEST: INvalid Table type"); + return OPAL_PARAMETER; + + } +// Add padding data + memset(*bios_table + bios_table_length - sizeof(uint32_t) - pad_len, 0, pad_len); + + + checksum = htole32(pldm_crc32(*bios_table, bios_table_length - sizeof(uint32_t) + - pad_len)); + memcpy(*bios_table + bios_table_length - sizeof(uint32_t), (void *)&checksum, + sizeof(uint32_t)); + + return bios_table_length; + +} + +/* + * This function tries to duplicate BMC functionality for Pldm self test + * It will only handle PLDM_BIOS type request + * As bios test will have only pldm request of type = PLDM_BIOS + */ +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_BIOS: + return pldm_test_reply_request_bios(request_msg, request_len, + response_msg, response_len); + + default: + printf("PLDM_TEST : Not equal to PLDM_BIOS\n"); + return OPAL_PARAMETER; + } + +} + +/* + * This function tries to duplicate BMC functionality for Pldm self test + * it tries to handle PLDM_REQUEST for PLDM_BIOS and reply with appropriate + * PLDM_RESPONSE message + */ +int pldm_test_reply_request_bios(void *request_msg, size_t request_len, + void **response_msg, size_t *response_len) +{ + int ret; + uint32_t transfer_handle; + uint8_t transfer_op_flag, table_type; + uint8_t *bios_table; + size_t payload_length; + + +// check if command send is PLDM_GET_BIOS_TABLE then only +// reply response message and return PLDM_SUCCESS +// else return error + if (((struct pldm_msg *)request_msg)->hdr.command == PLDM_GET_BIOS_TABLE) { + payload_length = request_len - sizeof(struct pldm_msg_hdr); + ret = decode_get_bios_table_req(request_msg, payload_length, &transfer_handle, + &transfer_op_flag, &table_type); + if (ret != PLDM_SUCCESS) + return ret; + + // generate the table to reply request on behalf on BMC for PLDM self test + ret = test_table_entry_generate(&bios_table, table_type); + if (ret < PLDM_SUCCESS) + return ret; + payload_length = ret + sizeof(struct pldm_get_bios_table_resp) - 1; + + *response_len = sizeof(struct pldm_msg_hdr) + + payload_length - 1; + *response_msg = malloc(*response_len); + + ret = encode_get_bios_table_resp(((struct pldm_msg *)request_msg)->hdr.instance_id, + PLDM_SUCCESS, PLDM_GET_NEXTPART, PLDM_START_AND_END, + bios_table, payload_length, *response_msg); + free(bios_table); + if (ret != PLDM_SUCCESS) + return ret; + + return OPAL_SUCCESS; + } else + return OPAL_PARAMETER; + + return OPAL_SUCCESS; +} + + +int main(void) +{ + size_t ret; + char *lid; + char name[] = "Error"; + struct blocklevel_device *bl; + +// Attempt to call pldm_bios_find_lid_by_attr_name() +// before pldm_bios_init() return error OPAL_HARDWARE + ret = pldm_bios_find_lid_by_attr_name(name, &lid); + if (ret != OPAL_HARDWARE) + return ret; + +// Init Pldm bios + ret = pldm_bios_init(); + if (ret != PLDM_SUCCESS) + return ret; + +// Attempt to call pldm_bios_find_lid_by_attr_name() +// when name argument not present return error OPAL_PARAMETER + ret = pldm_bios_find_lid_by_attr_name(TEST_VALID_ATTR_NAME, &lid); + if (ret != PLDM_SUCCESS) + return ret; + +// Attempt to call pldm_bios_find_lid_by_attr_name() +// when name argument present return PLDM_SUCCESS + ret = pldm_bios_find_lid_by_attr_name(TEST_VALID_ATTR_NAME, &lid); + if (ret != PLDM_SUCCESS) + return ret; + +// Init pldm_lid_files_init + ret = pldm_lid_files_init(&bl); + if (ret != PLDM_SUCCESS) + return ret; + + return 0; +} + + From patchwork Wed May 4 06:55:54 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhishek Singh Tomar X-Patchwork-Id: 1626095 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=gKAJkhcW; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org (client-ip=2404:9400:2:0:216:3eff:fee1:b9f1; helo=lists.ozlabs.org; envelope-from=skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org; receiver=) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2404:9400:2:0:216:3eff:fee1:b9f1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4KtSM82HK5z9sG4 for ; Wed, 4 May 2022 16:57:40 +1000 (AEST) Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4KtSM80sbKz3bcK for ; Wed, 4 May 2022 16:57:40 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=gKAJkhcW; dkim-atps=neutral X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=linux.ibm.com (client-ip=148.163.156.1; helo=mx0a-001b2d01.pphosted.com; envelope-from=abhishek@linux.ibm.com; receiver=) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=gKAJkhcW; dkim-atps=neutral Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4KtSLt11k1z2xgY for ; Wed, 4 May 2022 16:57:25 +1000 (AEST) Received: from pps.filterd (m0098399.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 2446Sfxi028116 for ; Wed, 4 May 2022 06:57:24 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=pp1; bh=0Bmfnc7OIp0h8vstWu7dPJhF/PGL6hw37aZj/Ui3GLI=; b=gKAJkhcWUuqIAL2FuZ1SoXDreIye7izujuZRL0i+cYvhoF/z8/wOmUYFiUZzY1CA+3ZQ eJAab5H+tqrlrwUNb7i9Kt8CNW6V1vvoSFXaVz7+jWvxsIsfXfey09mHJaE/oYZPJcCO eBsN0+mZ2cs9WYdYls8hZJqwtRp+X1fGgEpRV8w7bGhIMH96Kpz5NtXpS2W7mypaYcxe 7YYNztbBO/Hw0i+eOGJoO+J4pChLvtq9pigNUurAtzxV48TXgZwft/E1Z38FM9lJjKok uE1pazmRVPhoMkv3GXE0bCGuU1HgHu+2zmbBe+tkZinVOjyF4oE+6GziN1E5p81TxX3/ QA== Received: from ppma04ams.nl.ibm.com (63.31.33a9.ip4.static.sl-reverse.com [169.51.49.99]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3fum8mrday-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 04 May 2022 06:57:23 +0000 Received: from pps.filterd (ppma04ams.nl.ibm.com [127.0.0.1]) by ppma04ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 2446qPUI029780 for ; Wed, 4 May 2022 06:57:21 GMT Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by ppma04ams.nl.ibm.com with ESMTP id 3frvr8w6jm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 04 May 2022 06:57:21 +0000 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 2446vIF735062098 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 4 May 2022 06:57:18 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5480D52051; Wed, 4 May 2022 06:57:18 +0000 (GMT) Received: from li-22421c4c-355e-11b2-a85c-fdc6c782cba9.in.ibm.com (unknown [9.109.222.255]) by d06av21.portsmouth.uk.ibm.com (Postfix) with ESMTP id 761F25204E; Wed, 4 May 2022 06:57:17 +0000 (GMT) From: Abhishek Singh Tomar To: skiboot@lists.ozlabs.org Date: Wed, 4 May 2022 12:25:54 +0530 Message-Id: <20220504065555.20551-3-abhishek@linux.ibm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220504065555.20551-1-abhishek@linux.ibm.com> References: <20220504065555.20551-1-abhishek@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: Xhn_NPhdrBErHXrP_8zYstR2Umrxv3f7 X-Proofpoint-GUID: Xhn_NPhdrBErHXrP_8zYstR2Umrxv3f7 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.858,Hydra:6.0.486,FMLib:17.11.64.514 definitions=2022-05-04_01,2022-05-02_03,2022-02-23_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 clxscore=1015 lowpriorityscore=0 malwarescore=0 bulkscore=0 mlxlogscore=999 mlxscore=0 priorityscore=1501 spamscore=0 adultscore=0 impostorscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2202240000 definitions=main-2205040040 Subject: [Skiboot] [PATCH 3/4] core/pldm/test : pldm platform test X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Abhishek Singh Tomar Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" The self test for PLDM platform message implementation Signed-off-by: Abhishek Singh Tomar --- core/pldm/test/Makefile.check | 1 + core/pldm/test/common/test_pldm-common.c | 15 +- core/pldm/test/test_pldm-platform.c | 353 +++++++++++++++++++++++ 3 files changed, 363 insertions(+), 6 deletions(-) create mode 100644 core/pldm/test/test_pldm-platform.c diff --git a/core/pldm/test/Makefile.check b/core/pldm/test/Makefile.check index ce43dea0..c184702f 100644 --- a/core/pldm/test/Makefile.check +++ b/core/pldm/test/Makefile.check @@ -1,6 +1,7 @@ # -*-Makefile-*- PLDM_TEST := core/pldm/test/test_pldm-fileio \ core/pldm/test/test_pldm-bios \ + core/pldm/test/test_pldm-platform \ LCOV_EXCLUDE += $(PLDM_TEST:%=%.c) diff --git a/core/pldm/test/common/test_pldm-common.c b/core/pldm/test/common/test_pldm-common.c index 4fb97ecd..8c424f63 100644 --- a/core/pldm/test/common/test_pldm-common.c +++ b/core/pldm/test/common/test_pldm-common.c @@ -132,12 +132,15 @@ int ast_mctp_message_tx(uint8_t eid, uint8_t *msg, int len) &response_msg, &response_len); if (ret != PLDM_SUCCESS) return ret; - vmsg = malloc(response_len+1); - // TYPE: PLDM = 0x01 (000_0001b) as per MCTP - DSP0240 - vmsg[0] = 0x01; - memcpy(vmsg + 1, response_msg, response_len); - - pldm_rx_message(BMC_EID, 0, 0, NULL, vmsg, response_len+1); + // If response length > 0 then response back + if (response_len > 0) { + vmsg = malloc(response_len+1); + + // TYPE: PLDM = 0x01 (000_0001b) as per MCTP - DSP0240 + vmsg[0] = 0x01; + memcpy(vmsg + 1, response_msg, response_len); + pldm_rx_message(BMC_EID, 0, 0, NULL, vmsg, response_len+1); + } } return PLDM_SUCCESS; diff --git a/core/pldm/test/test_pldm-platform.c b/core/pldm/test/test_pldm-platform.c new file mode 100644 index 00000000..c9e90ab2 --- /dev/null +++ b/core/pldm/test/test_pldm-platform.c @@ -0,0 +1,353 @@ +#include "common/test_pldm-common.c" + + +#define EFFECTER1_RECORD_HANDLE 120 +#define EFFECTER1_POSSIBLE_STATES PLDM_SW_TERM_GRACEFUL_RESTART_REQUESTED +#define EFFECTER2_RECORD_HANDLE 160 +#define EFFECTER2_POSSIBLE_STATES PLDM_STATE_SET_SYSTEM_POWER_STATE + + +/* + * These stucturs duplicate BMC functionality for Pldm self test + * It include PDR 1st entry to be send on behalf of BMC + */ +struct pldm_state_effecter_pdr effecter_test_1 = { + .hdr = { + .record_handle = EFFECTER1_RECORD_HANDLE + }, + .terminus_handle = 1, + .effecter_id = 38, + .entity_type = PLDM_ENTITY_SYS_FIRMWARE, + .entity_instance = 1, + .container_id = 1, + .effecter_semantic_id = 0, + .effecter_init = 0, + .has_description_pdr = 0, + .composite_effecter_count = 1 +}; +struct state_effecter_possible_states possible_states_effecter_1_test = { + .state_set_id = PLDM_STATE_SET_SW_TERMINATION_STATUS, + .possible_states_size = 1, + .states = { + {.byte = PLDM_SW_TERM_GRACEFUL_RESTART_REQUESTED} + } + +}; + + +/* + * These stucturs duplicate BMC functionality for Pldm self test + * It include PDR 2nd entry to be send on behalf of BMC + */ +struct pldm_state_effecter_pdr effecter_test_2 = { + .hdr = { + .record_handle = EFFECTER2_RECORD_HANDLE + }, + .terminus_handle = 1, + .effecter_id = 38, + .entity_type = PLDM_ENTITY_SYSTEM_CHASSIS, + .entity_instance = 1, + .container_id = 1, + .effecter_semantic_id = 0, + .effecter_init = 0, + .has_description_pdr = 0, + .composite_effecter_count = 1 +}; +struct state_effecter_possible_states possible_states_effecter_2_test = { + .state_set_id = PLDM_STATE_SET_SYSTEM_POWER_STATE, + .possible_states_size = 1, + .states = { + {.byte = PLDM_STATE_SET_SYS_POWER_STATE_OFF_SOFT_GRACEFUL} + } +}; + + +int pldm_test_reply_request(void *request_msg, size_t request_len, + void **response_msg, size_t *response_len); +int pldm_test_reply_request_platform(void *request_msg, size_t request_len, + void **response_msg, size_t *response_len); +uint32_t test_pdr_entry_generate(uint8_t **pdr, uint32_t record_hndl); + + +/* + * This function tries to duplicate BMC functionality for Pldm self test + * It will handle pldm response message + * For now we don't have any response + */ +int pldm_test_verify_response(void *response_msg, size_t response_len) +{ + if (response_len > 0 || response_msg != NULL) + return OPAL_PARAMETER; + return OPAL_PARAMETER; + +} + +/* + * This function tries to duplicate BMC functionality for Pldm self test + * This Genrate pdr entry for self test + */ +uint32_t test_pdr_entry_generate(uint8_t **pdr, + uint32_t record_hndl) +{ + int size; + size_t possible_states_size = 0; + struct pldm_state_effecter_pdr *effecter = NULL; + size_t actual_size; + struct pldm_state_effecter_pdr *effecter_test; + struct state_effecter_possible_states *possible_states_effecter_test; + + + // calculate sizeof whole struct + size = sizeof(struct pldm_state_effecter_pdr) + + sizeof(struct state_effecter_possible_states) - 1; + + if (record_hndl == 0) { + effecter_test = &effecter_test_1; + possible_states_effecter_test = &possible_states_effecter_1_test; + } else if (record_hndl == effecter_test_1.hdr.record_handle) { + effecter_test = &effecter_test_1; + possible_states_effecter_test = &possible_states_effecter_1_test; + } else if (record_hndl == effecter_test_2.hdr.record_handle) { + effecter_test = &effecter_test_2; + possible_states_effecter_test = &possible_states_effecter_2_test; + } else + return OPAL_PARAMETER; + + + *pdr = malloc(size); + memset(*pdr, 0, size); + effecter = (struct pldm_state_effecter_pdr *)(*pdr); + if (effecter == NULL) { + perror("malloc"); + exit(EXIT_FAILURE); + } + effecter->terminus_handle = effecter_test->terminus_handle; + effecter->effecter_id = effecter_test->effecter_id; + effecter->entity_type = effecter_test->entity_type; + effecter->entity_instance = effecter_test->entity_instance; + effecter->container_id = effecter_test->container_id; + effecter->effecter_semantic_id = effecter_test->effecter_semantic_id; + effecter->effecter_init = effecter_test->effecter_init; + effecter->has_description_pdr = effecter_test->has_description_pdr; + effecter->composite_effecter_count = effecter_test->composite_effecter_count; + + // consider only 1 possible state + possible_states_size = sizeof(struct state_effecter_possible_states) + + possible_states_effecter_test->possible_states_size - 1; + encode_state_effecter_pdr(effecter, size, + possible_states_effecter_test, + possible_states_size, &actual_size); + + return actual_size; + +} + +/* + * This function tries to duplicate BMC functionality for Pldm self test + * it tries to handle PLDM_REQUEST for PLDM_PLATFORM and reply with appropriate + * PLDM_RESPONSE message + * As pldm platfom test it will have only pldm request of type = PLDM_BIOS + */ +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_PLATFORM: + return pldm_test_reply_request_platform(request_msg, request_len, + response_msg, response_len); + + default: + printf("PLDM_TEST: Not equal to PLDM_PLATFORM\n"); + return OPAL_PARAMETER; + } + + +} + + + +/* + * This function tries to duplicate BMC functionality for Pldm self test + * it tries to handle PLDM_REQUEST for PLDM_PLATFORM and reply with appropriate + * PLDM_RESPONSE message + */ +int pldm_test_reply_request_platform(void *request_msg, size_t request_len, + void **response_msg, size_t *response_len) +{ + //int size = 0; + uint8_t *pdr = NULL; + int ret = 0; + int payload_len = 0; + uint32_t transfer_handle; + uint8_t transfer_opflag; + uint16_t request_cnt; + uint16_t record_chg_num; + uint32_t record_hndl; + uint16_t effecter_id; + uint8_t comp_effecter_count; + set_effecter_state_field field; + uint8_t format_version, tid, event_class; + size_t event_data_offset; + +// check pldm command received and reply with appropriate pldm response message + switch (((struct pldm_msg *)request_msg)->hdr.command) { + case PLDM_GET_PDR: + + payload_len = request_len - sizeof(struct pldm_msg_hdr); + ret = decode_get_pdr_req(request_msg, payload_len, &record_hndl, &transfer_handle, + &transfer_opflag, &request_cnt, &record_chg_num); + if (ret != PLDM_SUCCESS) + return ret; + + // Generate pdr entry for self test + ret = test_pdr_entry_generate(&pdr, record_hndl); + if (ret < PLDM_SUCCESS) + return ret; + payload_len = (sizeof(struct pldm_get_pdr_resp) - 1) + + ret; + *response_len = sizeof(struct pldm_msg_hdr) + + payload_len; + *response_msg = malloc(*response_len); + + // if record_handle is equal to first record handle or 0 + // the encode next data transfer handle with 2nd record handle + if (record_hndl == EFFECTER1_RECORD_HANDLE || record_hndl == 0) { + ret = encode_get_pdr_resp(((struct pldm_msg *)request_msg)->hdr.instance_id, + PLDM_SUCCESS, EFFECTER2_RECORD_HANDLE, + PLDM_GET_NEXTPART, PLDM_START_AND_END, ret, pdr, 0, + *response_msg); + } + // if record_handle is equal to last record handle + // the encode next data transfer handle with 0 + else if (record_hndl == EFFECTER2_RECORD_HANDLE) { + ret = encode_get_pdr_resp(((struct pldm_msg *)request_msg)->hdr.instance_id, + PLDM_SUCCESS, 0, PLDM_GET_NEXTPART, PLDM_START_AND_END, + ret, pdr, 0, *response_msg); + } else + return OPAL_PARAMETER; + + free(pdr); + if (ret != PLDM_SUCCESS) + return ret; + break; + case PLDM_SET_STATE_EFFECTER_STATES: + + payload_len = request_len - sizeof(struct pldm_msg_hdr); + ret = decode_set_state_effecter_states_req(request_msg, payload_len, &effecter_id, + &comp_effecter_count, &field); + + // Test if request received from same effecter id passed + // and also check field struct same as expected + if ( + ( + effecter_id == effecter_test_1.effecter_id && + field.effecter_state == + possible_states_effecter_1_test.states->byte && + field.set_request == PLDM_REQUEST_SET && + field.effecter_state == PLDM_SW_TERM_GRACEFUL_RESTART_REQUESTED + + ) || + ( + effecter_id == effecter_test_2.effecter_id && + field.effecter_state == + possible_states_effecter_2_test.states->byte && + field.set_request == PLDM_REQUEST_SET && + field.effecter_state == + PLDM_STATE_SET_SYS_POWER_STATE_OFF_SOFT_GRACEFUL + ) + ) { + // BMC doesn't answer for these specific effecter states + // (PLDM_SW_TERM_GRACEFUL_RESTART and PLDM_STATE_SET_SYS_POWER_STATE_OFF) + // hence *response len = 0 + *response_len = 0; + return PLDM_SUCCESS; + } else + return OPAL_PARAMETER; + return PLDM_SUCCESS; + + case PLDM_PLATFORM_EVENT_MESSAGE: + payload_len = request_len - sizeof(struct pldm_msg_hdr); + ret = decode_platform_event_message_req(request_msg, payload_len, &format_version, + &tid, &event_class, &event_data_offset); + + // Test: if tid and event class same as that expected + if (tid != HOST_TID || event_class != PLDM_PDR_REPOSITORY_CHG_EVENT) + return OPAL_PARAMETER; + + *response_len = sizeof(struct pldm_msg_hdr) + + sizeof(struct pldm_platform_event_message_resp); + *response_msg = malloc(*response_len); + ret = encode_platform_event_message_resp( + ((struct pldm_msg *)request_msg)->hdr.instance_id, + PLDM_SUCCESS, 0, *response_msg); + return PLDM_SUCCESS; + + + + default: + return PLDM_ERROR_INVALID_DATA; + + } + + return PLDM_SUCCESS; + + + +} + + +int main(void) +{ + int ret; + +// Attempt to call pldm_platform_restart() +// before pldm_platform_init() return error +// OPAL_HARDWARE + ret = pldm_platform_restart(); + printf("pldm_platform_restart ends with %d\n", ret); + if (ret != OPAL_HARDWARE) { + perror("pldm_platform_restart"); + return ret; + } + + +// Attempt to call pldm_platform_power_off() +// before pldm_platform_init() return error +// OPAL_HARDWARE + ret = pldm_platform_power_off(); + printf("pldm_platform_power_off ends with %d\n", ret); + if (ret != OPAL_HARDWARE) { + perror("pldm_platform_restart"); + return ret; + } + +// Inittialize pldm platform + ret = pldm_platform_init(); + printf("pldm_platform_init ends with %d\n", ret); + if (ret != PLDM_SUCCESS) { + perror("pldm_platform_init"); + return ret; + } + + +// Attempt to call pldm_platform_restart() +// after pldm_platform_init() return PLDM_SUCCESS + ret = pldm_platform_restart(); + printf("pldm_platform_restart ends with %d\n", ret); + if (ret != PLDM_SUCCESS) { + perror("pldm_platform_restart"); + return ret; + } + +// Attempt to call pldm_platform_power_off() +// after pldm_platform_init() return PLDM_SUCCESS + ret = pldm_platform_power_off(); + printf("pldm_platform_power_off ends with %d\n", ret); + if (ret != PLDM_SUCCESS) { + perror("pldm_platform_restart"); + return ret; + } +} + + From patchwork Wed May 4 06:55:55 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhishek Singh Tomar X-Patchwork-Id: 1626096 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=XKb5WHqM; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org (client-ip=2404:9400:2:0:216:3eff:fee1:b9f1; helo=lists.ozlabs.org; envelope-from=skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org; receiver=) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2404:9400:2:0:216:3eff:fee1:b9f1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4KtSMK0g9gz9sG4 for ; Wed, 4 May 2022 16:57:49 +1000 (AEST) Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4KtSMJ6jktz3bbn for ; Wed, 4 May 2022 16:57:48 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=XKb5WHqM; dkim-atps=neutral X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=linux.ibm.com (client-ip=148.163.156.1; helo=mx0a-001b2d01.pphosted.com; envelope-from=abhishek@linux.ibm.com; receiver=) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=XKb5WHqM; dkim-atps=neutral Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4KtSLw1C67z3bd7 for ; Wed, 4 May 2022 16:57:28 +1000 (AEST) Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 2446tHL1003636 for ; Wed, 4 May 2022 06:57:26 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=pp1; bh=1fduLXicSneMZ18lYjCFEmGoO53bw/2plvrRsXbmkc0=; b=XKb5WHqMBPUwDHGtEmXeWPw82Qa84+DtQlIT2CKSaSbiRtt2LvF2hoycj4yV2jh2Fb2H RuL3KJTQanuG2RpK2ZfzvEmrCs+fyoCcvhscC+CwHbzS/8vCgGbYRj18nAet/46jSnXl zgxl0djpZ+wFF+umbfhyLjC1gulRQtLGx+hxOuMYUzW3jmRTrnaCVHW7JeApQ3CXaj+y lKBhsQ+hM21D76nlAjHGsBo3Su0LQvLECjVMInRyPPr6zZaLozNcAfbpEC8+qhkGZOv/ VGXGjbdS0ThIeVqJLDQMCtb20e17wrJqxg3MpXYejZPUBnDwJbxtIZ3zqSOIhFtmrRXH bg== Received: from ppma04ams.nl.ibm.com (63.31.33a9.ip4.static.sl-reverse.com [169.51.49.99]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3fumn3814a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 04 May 2022 06:57:25 +0000 Received: from pps.filterd (ppma04ams.nl.ibm.com [127.0.0.1]) by ppma04ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 2446qQjY029783 for ; Wed, 4 May 2022 06:57:23 GMT Received: from b06avi18626390.portsmouth.uk.ibm.com (b06avi18626390.portsmouth.uk.ibm.com [9.149.26.192]) by ppma04ams.nl.ibm.com with ESMTP id 3frvr8w6jn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 04 May 2022 06:57:23 +0000 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06avi18626390.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 2446i1vX45285802 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 4 May 2022 06:44:01 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5FACD5204F; Wed, 4 May 2022 06:57:20 +0000 (GMT) Received: from li-22421c4c-355e-11b2-a85c-fdc6c782cba9.in.ibm.com (unknown [9.109.222.255]) by d06av21.portsmouth.uk.ibm.com (Postfix) with ESMTP id 8146F5204E; Wed, 4 May 2022 06:57:19 +0000 (GMT) From: Abhishek Singh Tomar To: skiboot@lists.ozlabs.org Date: Wed, 4 May 2022 12:25:55 +0530 Message-Id: <20220504065555.20551-4-abhishek@linux.ibm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220504065555.20551-1-abhishek@linux.ibm.com> References: <20220504065555.20551-1-abhishek@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: 7B5oyUf3kJ-VUrntzMuzsHhgpkBVwSbK X-Proofpoint-GUID: 7B5oyUf3kJ-VUrntzMuzsHhgpkBVwSbK X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.858,Hydra:6.0.486,FMLib:17.11.64.514 definitions=2022-05-04_02,2022-05-02_03,2022-02-23_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 malwarescore=0 bulkscore=0 clxscore=1015 phishscore=0 suspectscore=0 spamscore=0 impostorscore=0 adultscore=0 mlxscore=0 priorityscore=1501 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2202240000 definitions=main-2205040040 Subject: [Skiboot] [PATCH 4/4] core/pldm/test : pldm FRU test X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Abhishek Singh Tomar Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" The self test for PLDM FRU message implementation Signed-off-by: Abhishek Singh Tomar --- core/pldm/test/Makefile.check | 1 + core/pldm/test/test_pldm-fru.c | 316 +++++++++++++++++++++++++++++++++ 2 files changed, 317 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..dc25691f --- /dev/null +++ b/core/pldm/test/test_pldm-fru.c @@ -0,0 +1,316 @@ +#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 generate reply for PLDM_GET_FRU_RECORD_BY_OPTION for self test. + * It generates fru Dta structure with BMC version tlv + */ +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) +{ + struct pldm_fru_record_tlv *tlv; + int tlv_size, ret; + size_t curr_size = 0; + size_t pad_bytes = 0; + uint32_t checksum; + + if (field_type == PLDM_FRU_FIELD_TYPE_VERSION && + record_type == PLDM_FRU_RECORD_TYPE_GENERAL) { + + tlv_size = sizeof(struct pldm_fru_record_tlv) + strlen(TEST_BMC_VERSION) - 1; + tlv = malloc(tlv_size); + tlv->type = PLDM_FRU_FIELD_TYPE_VERSION; + tlv->length = strlen(TEST_BMC_VERSION); + memcpy(tlv->value, TEST_BMC_VERSION, tlv->length); + *fru_table_size = sizeof(struct pldm_fru_record_data_format) + tlv->length - 1; + + // Culculate pad bytes in fru + if (*fru_table_size % 4) + pad_bytes = 4 - (*fru_table_size % 4); + else + pad_bytes = 0; + + *fru_table = malloc(*fru_table_size + pad_bytes + sizeof(uint32_t)); + ret = encode_fru_record(*fru_table, *fru_table_size, &curr_size, 0, + PLDM_FRU_RECORD_TYPE_GENERAL, 1, 1, (uint8_t *)tlv, tlv_size); + if (ret != PLDM_SUCCESS) + return ret; + *fru_table_size += pad_bytes + sizeof(uint32_t); + + // Pad with 0 + memset(*fru_table + curr_size, 0, pad_bytes); + + checksum = htole32(pldm_crc32(*fru_table, *fru_table_size - sizeof(uint32_t))); + memcpy(*fru_table + curr_size + pad_bytes, (void *)&checksum, sizeof(uint32_t)); + free(tlv); + } else + return OPAL_PARAMETER; + + return PLDM_SUCCESS; +} + + +/* + * 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) +{ + int ret, payload_len = 0; + uint32_t transfer_handle; + uint16_t fru_table_handle; + uint16_t record_set_identifier; + uint8_t record_type; + uint8_t field_type; + uint8_t transfer_op_flag; + uint8_t *fru_ds; + size_t fru_ds_size; + + // Check PLDM command and reply with appropriate reply + switch (((struct pldm_msg *)request_msg)->hdr.command) { + case PLDM_GET_FRU_RECORD_BY_OPTION: + payload_len = request_len - sizeof(struct pldm_msg_hdr); + ret = decode_get_fru_record_by_option_req(request_msg, payload_len, + &transfer_handle, &fru_table_handle, &record_set_identifier, + &record_type, &field_type, &transfer_op_flag); + if (ret != PLDM_SUCCESS) + return ret; + + // Test if field type and record type is as expected i.e. + // field type = PLDM_FRU_FIELD_TYPE_VERSION and + // record_type == PLDM_FRU_RECORD_TYPE_GENERAL + // else return error + if (field_type == PLDM_FRU_FIELD_TYPE_VERSION && + record_type == PLDM_FRU_RECORD_TYPE_GENERAL) { + + // generate the fru data structure to reply request + // on behalf on BMC for PLDM self test + ret = pldm_test_generate_reply_field_type_version( + PLDM_FRU_RECORD_TYPE_GENERAL, + PLDM_FRU_FIELD_TYPE_VERSION, &fru_ds, &fru_ds_size); + if (ret != PLDM_SUCCESS) + return ret; + + payload_len = fru_ds_size + + sizeof(struct pldm_get_fru_record_by_option_resp) - 1; + *response_len = sizeof(struct pldm_msg_hdr) + payload_len; + *response_msg = malloc(*response_len); + + ret = encode_get_fru_record_by_option_resp( + ((struct pldm_msg *)request_msg)->hdr.instance_id, + PLDM_SUCCESS, PLDM_GET_NEXTPART, PLDM_START_AND_END, + fru_ds, fru_ds_size, *response_msg, payload_len); + if (ret != PLDM_SUCCESS) + return ret; + free(fru_ds); + return PLDM_SUCCESS; + } else + return OPAL_PARAMETER; + 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; + struct variable_field fru_structure_data; + + // 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; + + /* retrieve the bmc information with + * "FRU Field Type": Version + * "FRU Record Set Identifier": 1, + * "FRU Record Type": "General(1)" + */ + ret = pldm_fru_get_record_by_option(0, 1, PLDM_FRU_RECORD_TYPE_GENERAL, + PLDM_FRU_FIELD_TYPE_VERSION, &fru_structure_data); + if (ret != PLDM_SUCCESS) { + perror("encode_get_fru_record_table_metadata_req"); + return ret; + } + + +} +