Commit 3c3d818a authored by Cristian Marussi's avatar Cristian Marussi Committed by Sudeep Holla
Browse files

firmware: arm_scmi: Add core raw transmission support



Add SCMI raw mode support which exposes a userspace interface to allow for
bare SCMI command injection and snooping from userspace.

Signed-off-by: default avatarCristian Marussi <cristian.marussi@arm.com>
Tested-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Tested-by: default avatarVincent Guittot <vincent.guittot@linaro.org>
Link: https://lore.kernel.org/r/20230118121426.492864-13-cristian.marussi@arm.com


Signed-off-by: default avatarSudeep Holla <sudeep.holla@arm.com>
parent 0f62ed00
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -30,6 +30,21 @@ config ARM_SCMI_NEED_DEBUGFS
	  which needs debugfs support. When selected causess the creation
	  of a common SCMI debugfs root directory.

config ARM_SCMI_RAW_MODE_SUPPORT
	bool "Enable support for SCMI Raw transmission mode"
	depends on DEBUG_FS
	select ARM_SCMI_NEED_DEBUGFS
	help
	  Enable support for SCMI Raw transmission mode.

	  If enabled allows the direct injection and snooping of SCMI bare
	  messages through a dedicated debugfs interface.
	  It is meant to be used by SCMI compliance/testing suites.

	  When enabled regular SCMI drivers interactions are inhibited in
	  order to avoid unexpected interactions with the SCMI Raw message
	  flow. If unsure say N.

config ARM_SCMI_HAVE_TRANSPORT
	bool
	help
+1 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ scmi-bus-y = bus.o
scmi-core-objs := $(scmi-bus-y)

scmi-driver-y = driver.o notify.o
scmi-driver-$(CONFIG_ARM_SCMI_RAW_MODE_SUPPORT) += raw_mode.o
scmi-transport-$(CONFIG_ARM_SCMI_HAVE_SHMEM) = shmem.o
scmi-transport-$(CONFIG_ARM_SCMI_TRANSPORT_MAILBOX) += mailbox.o
scmi-transport-$(CONFIG_ARM_SCMI_TRANSPORT_SMC) += smc.o
+4 −2
Original line number Diff line number Diff line
@@ -920,7 +920,8 @@ static void scmi_handle_response(struct scmi_chan_info *cinfo,
	trace_scmi_msg_dump(info->id, cinfo->id, xfer->hdr.protocol_id,
			    xfer->hdr.id,
			    xfer->hdr.type == MSG_TYPE_DELAYED_RESP ?
			    "DLYD" : "RESP",
			    (!SCMI_XFER_IS_RAW(xfer) ? "DLYD" : "dlyd") :
			    (!SCMI_XFER_IS_RAW(xfer) ? "RESP" : "resp"),
			    xfer->hdr.seq, xfer->hdr.status,
			    xfer->rx.buf, xfer->rx.len);

@@ -1045,7 +1046,8 @@ static int scmi_wait_for_reply(struct device *dev, const struct scmi_desc *desc,
			/* Trace polled replies. */
			trace_scmi_msg_dump(info->id, cinfo->id,
					    xfer->hdr.protocol_id, xfer->hdr.id,
					    "RESP",
					    !SCMI_XFER_IS_RAW(xfer) ?
					    "RESP" : "resp",
					    xfer->hdr.seq, xfer->hdr.status,
					    xfer->rx.buf, xfer->rx.len);
		}
+1322 −0

File added.

Preview size limit exceeded, changes collapsed.

+30 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * System Control and Management Interface (SCMI) Message Protocol
 * Raw mode support header.
 *
 * Copyright (C) 2022 ARM Ltd.
 */
#ifndef _SCMI_RAW_MODE_H
#define _SCMI_RAW_MODE_H

#include "common.h"

enum {
	SCMI_RAW_REPLY_QUEUE,
	SCMI_RAW_NOTIF_QUEUE,
	SCMI_RAW_ERRS_QUEUE,
	SCMI_RAW_MAX_QUEUE
};

void *scmi_raw_mode_init(const struct scmi_handle *handle,
			 struct dentry *top_dentry, int instance_id,
			 const struct scmi_desc *desc, int tx_max_msg);
void scmi_raw_mode_cleanup(void *raw);

void scmi_raw_message_report(void *raw, struct scmi_xfer *xfer,
			     unsigned int idx);
void scmi_raw_error_report(void *raw, struct scmi_chan_info *cinfo,
			   u32 msg_hdr, void *priv);

#endif /* _SCMI_RAW_MODE_H */