arm-trusted-firmware/include/drivers/st/scmi-msg.h

66 lines
1.9 KiB
C
Raw Normal View History

drivers/scmi-msg: driver for processing scmi messages This change introduces drivers to allow a platform to create a basic SCMI service and register handlers for client request (SCMI agent) on system resources. This is the first piece of the drivers: an entry function, the SCMI base protocol support and helpers for create the response message. With this change, scmi_process_message() is the entry function to process an incoming SCMI message. The function expect the message is already copied from shared memory into secure memory. The message structure stores message reference and output buffer reference where response message shall be stored. scmi_process_message() calls the SCMI protocol driver according to the protocol ID in the message. The SCMI protocol driver will call defined platform handlers according to the message content. This change introduces only the SCMI base protocol as defined in SCMI specification v2.0 [1]. Not all the messages defined in the specification are supported. The SCMI message implementation is derived from the OP-TEE project [2] itself based on the SCP-firmware implementation [3] of the SCMI protocol server side. Link: [1] http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/DEN0056A_System_Control_and_Management_Interface.pdf Link: [2] https://github.com/OP-TEE/optee_os/commit/ae8c8068098d291e6e55744dbc237ec39fd9840a Link: [3] https://github.com/ARM-software/SCP-firmware/tree/v2.6.0 Change-Id: I639c4154a39fca60606264baf8d32452641f45e9 Signed-off-by: Etienne Carriere <etienne.carriere@linaro.org>
2019-11-28 08:13:34 +00:00
/* SPDX-License-Identifier: BSD-3-Clause */
/*
* Copyright (c) 2015-2019, Arm Limited and Contributors. All rights reserved.
* Copyright (c) 2019, Linaro Limited
*/
#ifndef SCMI_MSG_H
#define SCMI_MSG_H
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
/* Minimum size expected for SMT based shared memory message buffers */
#define SMT_BUF_SLOT_SIZE 128U
/* A channel abstract a communication path between agent and server */
struct scmi_msg_channel;
/*
* struct scmi_msg_channel - Shared memory buffer for a agent-to-server channel
*
* @shm_addr: Address of the shared memory for the SCMI channel
* @shm_size: Byte size of the shared memory for the SCMI channel
* @busy: True when channel is busy, flase when channel is free
* @agent_name: Agent name, SCMI protocol exposes 16 bytes max, or NULL
*/
struct scmi_msg_channel {
uintptr_t shm_addr;
size_t shm_size;
bool busy;
const char *agent_name;
};
/* Platform callback functions */
/*
* Return the SCMI channel related to an agent
* @agent_id: SCMI agent ID
* Return a pointer to channel on success, NULL otherwise
*/
struct scmi_msg_channel *plat_scmi_get_channel(unsigned int agent_id);
/*
* Return how many SCMI protocols supported by the platform
* According to the SCMI specification, this function does not target
* a specific agent ID and shall return all platform known capabilities.
*/
size_t plat_scmi_protocol_count(void);
/*
* Get the count and list of SCMI protocols (but base) supported for an agent
*
* @agent_id: SCMI agent ID
* Return a pointer to a null terminated array supported protocol IDs.
*/
const uint8_t *plat_scmi_protocol_list(unsigned int agent_id);
/* Get the name of the SCMI vendor for the platform */
const char *plat_scmi_vendor_name(void);
/* Get the name of the SCMI sub-vendor for the platform */
const char *plat_scmi_sub_vendor_name(void);
#endif /* SCMI_MSG_H */