[Skiboot] [PATCH V6 03/21] core/pldm: PLDM over MCTP Binding

Frederic Barrat fbarrat at linux.ibm.com
Thu Apr 13 00:36:32 AEST 2023



On 13/09/2022 12:26, Christophe Lombard wrote:
> Enable the mctp binding over LPC bus interface and new wrappers to send
> and receive PLDM messages over the mctp library.
> 
> PLDM is supported as a message type over MCTP. PLDM over MCTP binding
> defines the format of PLDM over MCTP messages.
> 
> An MCTP Endpoint is the terminus for MCTP communication. A physical device
> that supports MCTP may provide one or more MCTP Endpoints. Endpoints are
> addressed using a logical address called the Endpoint ID, or EID. EIDs in
> MCTP are analogous to IP Addresses in Internet Protocol networking.
> 
> The BMC EID default is 8.
> 
> First byte of the PLDM over MCTP Message Fields identifies the MCTP
> message as carrying a PLDM message:
> Message Type (7 bits)  PLDM = 0x01 (000_0001b).
> 
> Signed-off-by: Christophe Lombard <clombard at linux.vnet.ibm.com>
> ---
>   core/Makefile.inc      |   6 ++-
>   core/pldm/Makefile.inc |  13 +++++
>   core/pldm/pldm-mctp.c  | 118 +++++++++++++++++++++++++++++++++++++++++
>   core/pldm/pldm.h       |  33 ++++++++++++
>   include/pldm.h         |  18 +++++++
>   5 files changed, 187 insertions(+), 1 deletion(-)
>   create mode 100644 core/pldm/Makefile.inc
>   create mode 100644 core/pldm/pldm-mctp.c
>   create mode 100644 core/pldm/pldm.h
>   create mode 100644 include/pldm.h
> 
> diff --git a/core/Makefile.inc b/core/Makefile.inc
> index f80019b6..263a0e50 100644
> --- a/core/Makefile.inc
> +++ b/core/Makefile.inc
> @@ -22,8 +22,12 @@ endif
>   
>   CORE=core/built-in.a
>   
> +ifeq ($(CONFIG_PLDM),1)
> +include $(SRC)/core/pldm/Makefile.inc
> +endif
> +
>   CFLAGS_SKIP_core/relocate.o = -pg -fstack-protector-all
>   CFLAGS_SKIP_core/relocate.o += -fstack-protector -fstack-protector-strong
>   CFLAGS_SKIP_core/relocate.o += -fprofile-arcs -ftest-coverage
>   
> -$(CORE): $(CORE_OBJS:%=core/%)
> +$(CORE): $(CORE_OBJS:%=core/%) $(PLDM)
> diff --git a/core/pldm/Makefile.inc b/core/pldm/Makefile.inc
> new file mode 100644
> index 00000000..c878ef1f
> --- /dev/null
> +++ b/core/pldm/Makefile.inc
> @@ -0,0 +1,13 @@
> +# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
> +# Copyright 2022 IBM Corp
> +
> +PLDM_DIR ?= core/pldm
> +SUBDIRS += $(PLDM_DIR)
> +
> +CPPFLAGS += -I$(SRC)/pldm/libpldm/
> +CPPFLAGS += -I$(SRC)/pldm/ibm/libpldm/
> +
> +PLDM_OBJS = pldm-mctp.o
> +
> +PLDM = $(PLDM_DIR)/built-in.a
> +$(PLDM): $(PLDM_OBJS:%=$(PLDM_DIR)/%)
> diff --git a/core/pldm/pldm-mctp.c b/core/pldm/pldm-mctp.c
> new file mode 100644
> index 00000000..832b767a
> --- /dev/null
> +++ b/core/pldm/pldm-mctp.c
> @@ -0,0 +1,118 @@
> +// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
> +// Copyright 2022 IBM Corp.
> +
> +#define pr_fmt(fmt) "PLDM: " fmt
> +
> +#include <cpu.h>
> +#include <opal.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <ast.h>
> +#include "pldm.h"
> +
> +/*
> + * Print content of PLDM message in hex mode.
> + * 15 bytes per line.


Should be 16 bytes per line.
Looks like debug code. Either convert to static or use a less generic name.


> + * Ex: pldm_mctp_message_tx: 000: 08 01 00 00 02 00 01
> + */
> +void printbuf(const char *name, const char *msg, int len) > +{
> +	int i, j;
> +	char linebuf[128];
> +
> +	linebuf[0] = 0;


That line is useless (already in the for loop)


> +
> +	for (i = 0; i < len; i += j) {
> +		linebuf[0] = 0;
> +		for (j = 0; i + j < len && j < 15; j++) {
> +			char s[5];
> +
> +			snprintf(s, 5, "%02x ", msg[i + j]);
> +			strcat(linebuf, s);
> +		}
> +		prlog(PR_TRACE, "%s: %03x: %s\n", name, i, linebuf);
> +	}
> +}
> +
> +/*
> + * Send PLDM message over MCTP
> + */
> +int pldm_mctp_message_tx(uint8_t dest_id, uint8_t *buf, int len)
> +{
> +	uint8_t *msg;
> +	int rc;
> +
> +	/* Message TYPE: PLDM = 0x01 (000_0001b) - DSP0240 */
> +	msg = zalloc(len + 1);


As discussed, we should look to always have the caller allocate the 
extra byte, so that we don't have to re-allocate and copy on each message.

   Fred


> +	msg[0] = 0x01;
> +	memcpy(&msg[1], buf, len);
> +
> +	rc = ast_mctp_message_tx(dest_id, msg, len + 1);
> +	free(msg);
> +
> +	return rc;
> +}
> +
> +/*
> + * Handle messages received from MCTP
> + */
> +static int handle_message_rx(uint8_t eid, const uint8_t *buf, int len)
> +{
> +	struct pldm_rx_data rx;
> +
> +	if (len < sizeof(rx.msg->hdr)) {
> +		prlog(PR_ERR, "%s: packet is smaller than pldm header\n", __func__);
> +		return OPAL_EMPTY;
> +	}
> +
> +	memset(&rx, 0, sizeof(rx));
> +	rx.msg = (struct pldm_msg *) buf;
> +	rx.source_eid = eid;
> +	rx.msg_len = len;
> +
> +	if (unpack_pldm_header(&rx.msg->hdr, &rx.hdrinf)) {
> +		prlog(PR_ERR, "%s: unable to decode header\n", __func__);
> +		return OPAL_EMPTY;
> +	}
> +
> +	return OPAL_UNSUPPORTED;
> +}
> +
> +/*
> + * MCTP message rx callback
> + */
> +static void message_rx(uint8_t eid, bool tag_owner __unused,
> +		       uint8_t msg_tag __unused, void *data __unused,
> +		       void *vmsg, size_t len)
> +{
> +	uint8_t *msg = vmsg;
> +
> +	prlog(PR_TRACE, "message received: msg: %p, len %zd (eid: %d)\n",
> +			 msg, len, eid);
> +
> +	/* pldm message type */
> +	if ((msg[0] & 0x7f) != 0x01) {
> +		prlog(PR_ERR, "%s - not a pldm message type\n", __func__);
> +		return;
> +	}
> +
> +	handle_message_rx(eid, &msg[1], len - 1);
> +}
> +
> +int pldm_mctp_init(uint8_t mode)
> +{
> +	int rc;
> +
> +	/* MCTP Binding */
> +	rc = ast_mctp_init(mode, message_rx);
> +	if (rc)
> +		prlog(PR_ERR, "Failed to bind MCTP\n");
> +
> +	prlog(PR_NOTICE, "%s - done, rc: %d\n", __func__, rc);
> +	return rc;
> +}
> +
> +void pldm_mctp_exit(void)
> +{
> +	ast_mctp_exit();
> +}
> diff --git a/core/pldm/pldm.h b/core/pldm/pldm.h
> new file mode 100644
> index 00000000..a006d1f4
> --- /dev/null
> +++ b/core/pldm/pldm.h
> @@ -0,0 +1,33 @@
> +/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
> + * Copyright 2022 IBM Corp.
> + */
> +
> +#ifndef __COREPLDM_H__
> +#define __COREPLDM_H__
> +
> +#include <pldm/libpldm/base.h>
> +#include <pldm.h>
> +
> +/* Common support */
> +
> +void printbuf(const char *name, const char *msg, int len);
> +
> +/*
> + * EID is the MCTP endpoint ID, which aids in routing MCTP packets.
> + * For the EIDs: the valid range is 8-254.
> + * We are saying that BMC is EID 8 and Skiboot is HOST_EID 9
> + */
> +#define BMC_EID  8
> +#define HOST_EID 9
> +
> +struct pldm_rx_data {
> +	struct pldm_header_info hdrinf; /* parsed message header */
> +
> +	struct pldm_msg *msg;
> +	int msg_len;
> +	int source_eid;
> +};
> +
> +int pldm_mctp_message_tx(uint8_t dest_id, uint8_t *buf, int len);
> +
> +#endif /* __COREPLDM_H__ */
> diff --git a/include/pldm.h b/include/pldm.h
> new file mode 100644
> index 00000000..3aae560c
> --- /dev/null
> +++ b/include/pldm.h
> @@ -0,0 +1,18 @@
> +/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
> + * Copyright 2022 IBM Corp.
> + */
> +
> +#ifndef __PLDM_H__
> +#define __PLDM_H__
> +
> +/**
> + * PLDM over MCTP initialization
> + */
> +int pldm_mctp_init(uint8_t mode);
> +
> +/**
> + * PLDM over MCTP stop
> + */
> +void pldm_mctp_exit(void);
> +
> +#endif /* __PLDM_H__ */


More information about the Skiboot mailing list