[Skiboot] [PATCH v3 2/9] core/pldm/test : Initialize pldm file I/O test
Abhishek SIngh Tomar
abhishek at linux.ibm.com
Tue May 24 19:48:05 AEST 2022
On Mon, May 23, 2022 at 03:47:39PM +0200, Christophe Lombard wrote:
>
> Le 18/05/2022 à 09:42, Abhishek Singh Tomar a écrit :
> > The patch contains a self-test implementation for
> > PLDM_OEM type message support that is used for
> > inband file I/O.
> >
> > This patch tests code flow for the PLDM command
> > PLDM_GET_FILE_TABLE that is used to retrieve the
> > file table which contains the list of lid files
> > available and their attributes.
> >
> > Signed-off-by: Abhishek Singh Tomar<abhishek at linux.ibm.com>
> > ---
> > core/pldm/pldm.h | 2 +-
> > core/pldm/test/Makefile.check | 43 ++++++++
> > core/pldm/test/test-pldm-fileio.c | 174 ++++++++++++++++++++++++++++++
> > 3 files changed, 218 insertions(+), 1 deletion(-)
> > create mode 100644 core/pldm/test/Makefile.check
> > create mode 100644 core/pldm/test/test-pldm-fileio.c
> >
> > 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..7af66ccf
> > --- /dev/null
> > +++ b/core/pldm/test/Makefile.check
> > @@ -0,0 +1,43 @@
> > +# -*-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))
> > +HOSTCFLAG_PLDM += -Wno-format
> > +
> > +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/test-pldm-fileio.c b/core/pldm/test/test-pldm-fileio.c
> > new file mode 100644
> > index 00000000..e14f6df7
> > --- /dev/null
> > +++ b/core/pldm/test/test-pldm-fileio.c
> > @@ -0,0 +1,174 @@
> > +// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
> > +// Copyright 2022 IBM Corp.
> > +
> > +
> > +#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"
> > +
> > +uint32_t get_test_filetable_entry(uint8_t **file_attr_table, int *size);
>
> Not necessary to declare this function here.
>
Yup
> > +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 duplicates 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;
> > +
> > +}
>
> Nothing happens in this function. A generic function could
> do the job.
>
This function is added so that this testcase can also use
test-pldm-common. else it will give compilation error.
Here test-pldm-common.c provide generic flow for all testfile. so
we need to provide defination of all functions which are called there.
We use test-pldm-common.c so that we can reuse code and in case of any
change in future we need not to do same changes in all file.
The code written in function pldm_test_verify_response() is just to
avoid error due to unused variable and reply error if this function is
called as we don't expect any response from skiboot in fileio for now.
> > +
> > +/*
> > + * This function duplicates 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 get_test_filetable_entry(uint8_t **file_attr_table, int *size)
> > +{
> > + 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;
> > +
> > + /* calculate sizeof whole struct */
> > + *size = sizeof(struct pldm_file_attr_table_entry *) + strlen(FileName)
> > + + sizeof(file_length) - 1;
> > + *file_attr_table = malloc(*size);
> > + if (*file_attr_table == NULL)
> > + return OPAL_RESOURCE;
> > +
> > + 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 OPAL_SUCCESS;
> > +}
> > +
> > +/*
> > + * This function duplicates 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 : hdr type %d not expected\n",
> > + ((struct pldm_msg *)request_msg)->hdr.type);
> > + return OPAL_PARAMETER;
> > + }
> > +
> > +
> > +}
> > +
> > +
> > +/*
> > + * This function duplicates 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 rc;
> > + int payload_len = 0;
> > + uint32_t transfer_handle;
> > + uint8_t transfer_opflag;
> > + uint8_t table_type;
> > + uint8_t *file_attr_table;
> > + uint32_t table_size;
> > +
> > +
> > + /* 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);
> > +
> > + rc = decode_get_file_table_req(request_msg, payload_len, &transfer_handle,
> > + &transfer_opflag, &table_type);
> > + if (rc != PLDM_SUCCESS)
> > + return OPAL_PARAMETER;
> > +
> > + /* Get Filetable entry for self test */
> > + rc = get_test_filetable_entry(&file_attr_table, &table_size);
> > + if (rc != OPAL_SUCCESS)
> > + return OPAL_PARAMETER;
> > +
> > + *response_len = sizeof(struct pldm_msg_hdr)
> > + + sizeof(struct pldm_get_file_table_resp)
> > + + table_size - 1;
> > + *response_msg = malloc(*response_len);
> > + if (*response_msg == NULL)
> > + return OPAL_RESOURCE;
> > +
> > +
> > + rc = 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 (rc != PLDM_SUCCESS)
> > + return OPAL_PARAMETER;
> > +
> > + free(file_attr_table);
> > +
> > + break;
> > +
> > + default:
> > + return OPAL_PARAMETER;
> > +
> > + }
> > +
> > + return OPAL_SUCCESS;
> > +
> > +
> > +
> > +}
> > +
> > +
> > +int main(void)
> > +{
> > + size_t rc;
> > +
> > +
> > + /* Init PLDM File IO */
> > + rc = pldm_file_io_init();
> > + if (rc != OPAL_SUCCESS) {
> > + printf("PLDM_TEST : pldm_file_io_init failed");
> > + return rc;
> > + }
> > +
> > + return OPAL_SUCCESS;
> > +}
> > +
> > +
More information about the Skiboot
mailing list