[Skiboot] [PATCH v2 6/9] core/pldm/test : pldm platform specification Init self test

Christophe Lombard clombard at linux.vnet.ibm.com
Wed May 11 23:49:32 AEST 2022



Le 07/05/2022 à 08:35, Abhishek Singh Tomar a écrit :
> This patch test for PLDM platform Init implementation
> This patch test platform commands:
> 	1. PLDM_PLATFORM_EVENT_MESSAGE
> 	2. PLDM_GET_PDR
>
> Signed-off-by: Abhishek Singh Tomar<abhishek at linux.ibm.com>
> ---
>   core/pldm/test/Makefile.check            |   1 +
>   core/pldm/test/common/test_pldm-common.c |  19 +-
>   core/pldm/test/test_pldm-platform.c      | 289 +++++++++++++++++++++++
>   3 files changed, 303 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 0333937c..7d0203dc 100644
> --- a/core/pldm/test/common/test_pldm-common.c
> +++ b/core/pldm/test/common/test_pldm-common.c
> @@ -137,13 +137,20 @@ 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
> +		 * else if response length == 0 then no need to response
> +		 * if response length > 0 then error
> +		 */
> +		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);
> +		}

This update should have been there from the start.

>   	}
>
>   	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..05cc53f0
> --- /dev/null
> +++ b/core/pldm/test/test_pldm-platform.c
> @@ -0,0 +1,289 @@
> +// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
> +/*
> + * Copyright 2013-2019 IBM Corp.
> + */
> +
> +
> +#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)	{

You test NULL pointer after using memset

> +		perror("malloc");
> +		exit(EXIT_FAILURE);

Why 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;
> +
> +	/* For PLDM Test 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_PLATFORM
> + */
> +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)
> +{
> +	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;
> +	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_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;
> +
> +
> +	/* 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;
> +	}
> +
> +
> +	return PLDM_SUCCESS;
> +}
> +
> +
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ozlabs.org/pipermail/skiboot/attachments/20220511/50c91d11/attachment-0001.htm>


More information about the Skiboot mailing list