u-boot/include/scmi_agent.h
Etienne Carriere 6983710a31 scmi: change parameter dev in devm_scmi_process_msg
Changes devm_scmi_process_msg() first argument from target parent device
to current SCMI device and lookup the SCMI agent device among SCMI device
parents for find the SCMI agent operator needed for communication with
the firmware.

This change is needed in order to support CCF in clk_scmi driver unless
what CCF will fail to find the right udevice related to exposed SCMI
clocks.

This patch allows to simplify the caller sequence, using SCMI device
reference as parameter instead of knowing SCMI uclass topology. This
change also adds some protection in case devm_scmi_process_msg() API
function is called for an invalid device type.

Cc: Lukasz Majewski <lukma@denx.de>
Cc: Sean Anderson <seanga2@gmail.com>
Cc: Jaehoon Chung <jh80.chung@samsung.com>
Cc: Patrick Delaunay <patrick.delaunay@foss.st.com>
Reviewed-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
Signed-off-by: Etienne Carriere <etienne.carriere@linaro.org>
2022-03-02 17:42:06 -05:00

68 lines
2.1 KiB
C

/* 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), \
}
/**
* devm_scmi_process_msg() - Send and process an SCMI message
*
* Send a message to an 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 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 */