u-boot/include/scmi_agent.h

69 lines
2.1 KiB
C
Raw Normal View History

firmware: add SCMI agent uclass This change introduces SCMI agent uclass to interact with a firmware using the SCMI protocols [1]. SCMI agent uclass currently supports a single method to request processing of the SCMI message by an identified server. A SCMI message is made of a byte payload associated to a protocol ID and a message ID, all defined by the SCMI specification [1]. On return from process_msg() method, the caller gets the service response. SCMI agent uclass defines a post bind generic sequence for all devices. The sequence binds all the SCMI protocols listed in the FDT for that SCMI agent device. Currently none, but later change will introduce protocols. This change implements a simple sandbox device for the SCMI agent uclass. The sandbox nicely answers SCMI_NOT_SUPPORTED to SCMI messages. To prepare for further test support, the sandbox exposes a architecture function for test application to read the sandbox emulated devices state. Currently supports 2 SCMI agents, identified by an ID in the FDT device name. The simplistic DM test does nothing yet. SCMI agent uclass is designed for platforms that embed a SCMI server in a firmware hosted somewhere, for example in a companion co-processor or in the secure world of the executing processor. SCMI protocols allow an SCMI agent to discover and access external resources as clock, reset controllers and more. SCMI agent and server communicate following the SCMI specification [1]. This SCMI agent implementation complies with the DT bindings defined in the Linux kernel source tree regarding SCMI agent description since v5.8. Links: [1] https://developer.arm.com/architectures/system-architectures/software-standards/scmi Signed-off-by: Etienne Carriere <etienne.carriere@linaro.org> Cc: Simon Glass <sjg@chromium.org> Cc: Peng Fan <peng.fan@nxp.com> Cc: Sudeep Holla <sudeep.holla@arm.com> Reviewed-by: Simon Glass <sjg@chromium.org>
2020-09-10 00:44:00 +08:00
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
/*
* Copyright (c) 2015-2019, Arm Limited and Contributors. All rights reserved.
* Copyright (C) 2019-2020, Linaro Limited
*
* An SCMI agent device represent on communication path from a
* device driver to the remote SCMI server which driver sends
* messages to and receives response messages from.
*/
#ifndef SCMI_AGENT_H
#define SCMI_AGENT_H
#include <asm/types.h>
struct udevice;
/*
* struct scmi_msg - Context of a SCMI message sent and the response received
*
* @protocol_id: SCMI protocol ID
* @message_id: SCMI message ID for a defined protocol ID
* @in_msg: Pointer to the message payload sent by the driver
* @in_msg_sz: Byte size of the message payload sent
* @out_msg: Pointer to buffer to store response message payload
* @out_msg_sz: Byte size of the response buffer and response payload
*/
struct scmi_msg {
unsigned int protocol_id;
unsigned int message_id;
u8 *in_msg;
size_t in_msg_sz;
u8 *out_msg;
size_t out_msg_sz;
};
/* Helper macro to match a message on input/output array references */
#define SCMI_MSG_IN(_protocol, _message, _in_array, _out_array) \
(struct scmi_msg){ \
.protocol_id = (_protocol), \
.message_id = (_message), \
.in_msg = (uint8_t *)&(_in_array), \
.in_msg_sz = sizeof(_in_array), \
.out_msg = (uint8_t *)&(_out_array), \
.out_msg_sz = sizeof(_out_array), \
}
/**
* scmi_send_and_process_msg() - send and process a SCMI message
*
* Send a message to a SCMI server through a target SCMI agent device.
* Caller sets scmi_msg::out_msg_sz to the output message buffer size.
* On return, scmi_msg::out_msg_sz stores the response payload size.
*
* @dev: SCMI agent device
* @msg: Message structure reference
* @return 0 on success and a negative errno on failure
*/
int devm_scmi_process_msg(struct udevice *dev, struct scmi_msg *msg);
/**
* scmi_to_linux_errno() - Convert an SCMI error code into a Linux errno code
*
* @scmi_errno: SCMI error code value
* @return 0 for successful status and a negative errno otherwise
*/
int scmi_to_linux_errno(s32 scmi_errno);
#endif /* SCMI_H */