/* * Copyright (c) 2023, Intel Corporation. * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_INCLUDE_SIP_SVC_PROTO_H_ #define ZEPHYR_INCLUDE_SIP_SVC_PROTO_H_ /** * @file * @brief Arm SiP services communication protocol * between service provider and client. * * Client to fill in the input data in struct sip_svc_request format * when requesting SMC/HVC service via 'send' function. * * Service to fill in the SMC/HVC return value in struct sip_svc_response * format and pass to client via Callback. */ /** * @brief Invalid id value */ #define SIP_SVC_ID_INVALID 0xFFFFFFFF /** @brief Header format */ #define SIP_SVC_PROTO_VER 0x0 #define SIP_SVC_PROTO_HEADER_CODE_OFFSET 0 #define SIP_SVC_PROTO_HEADER_CODE_MASK 0xFFFF #define SIP_SVC_PROTO_HEADER_TRANS_ID_OFFSET 16 #define SIP_SVC_PROTO_HEADER_TRANS_ID_MASK 0xFF #define SIP_SVC_PROTO_HEADER_VER_OFFSET 30 #define SIP_SVC_PROTO_HEADER_VER_MASK 0x3 #define SIP_SVC_PROTO_HEADER(code, trans_id) \ ((((code)&SIP_SVC_PROTO_HEADER_CODE_MASK) << SIP_SVC_PROTO_HEADER_CODE_OFFSET) | \ (((trans_id)&SIP_SVC_PROTO_HEADER_TRANS_ID_MASK) \ << SIP_SVC_PROTO_HEADER_TRANS_ID_OFFSET) | \ ((SIP_SVC_PROTO_VER & SIP_SVC_PROTO_HEADER_VER_MASK) << SIP_SVC_PROTO_HEADER_VER_OFFSET)) #define SIP_SVC_PROTO_HEADER_GET_CODE(header) \ (((header) >> SIP_SVC_PROTO_HEADER_CODE_OFFSET) & SIP_SVC_PROTO_HEADER_CODE_MASK) #define SIP_SVC_PROTO_HEADER_GET_TRANS_ID(header) \ (((header) >> SIP_SVC_PROTO_HEADER_TRANS_ID_OFFSET) & SIP_SVC_PROTO_HEADER_TRANS_ID_MASK) #define SIP_SVC_PROTO_HEADER_SET_TRANS_ID(header, trans_id) \ (header) &= ~(SIP_SVC_PROTO_HEADER_TRANS_ID_MASK << SIP_SVC_PROTO_HEADER_TRANS_ID_OFFSET); \ (header) |= (((trans_id)&SIP_SVC_PROTO_HEADER_TRANS_ID_MASK) \ << SIP_SVC_PROTO_HEADER_TRANS_ID_OFFSET); /** @brief Arm SiP services command code in request header * * SIP_SVC_PROTO_CMD_SYNC * - Typical flow, synchronous request. Service expects EL3/EL2 firmware to * return the result immediately during SMC/HVC call. * * SIP_SVC_PROTO_CMD_ASYNC * - Asynchronous request. Service is required to poll the response via a * separate SMC/HVC call. Use this method if the request requires longer * processing in EL3/EL2. */ #define SIP_SVC_PROTO_CMD_SYNC 0x0 #define SIP_SVC_PROTO_CMD_ASYNC 0x1 #define SIP_SVC_PROTO_CMD_MAX SIP_SVC_PROTO_CMD_ASYNC /** @brief Error code in response header * * SIP_SVC_PROTO_STATUS_OK * - Successfully execute the request. * * SIP_SVC_PROTO_STATUS_UNKNOWN * - Unrecognized SMC/HVC Function ID. * * SIP_SVC_PROTO_STATUS_BUSY * - The request is still in progress. Please try again. * * SIP_SVC_PROTO_STATUS_REJECT * - The request have been rejected due to improper input data. * * SIP_SVC_PROTO_STATUS_NO_RESPONSE * - No response from target hardware yet. * * SIP_SVC_PROTO_STATUS_ERROR * - Error occurred when executing the request. * * SIP_SVC_PROTO_STATUS_NOT_SUPPORT * - Unsupported Arm SiP services command code */ #define SIP_SVC_PROTO_STATUS_OK 0x0 #define SIP_SVC_PROTO_STATUS_UNKNOWN 0xFFFF #define SIP_SVC_PROTO_STATUS_BUSY 0x1 #define SIP_SVC_PROTO_STATUS_REJECT 0x2 #define SIP_SVC_PROTO_STATUS_NO_RESPONSE 0x3 #define SIP_SVC_PROTO_STATUS_ERROR 0x4 /** @brief SiP Service communication protocol * request format. * * request header * - bits [15: 0] Arm SiP services command code * - bits [23:16] Transaction ID (Filled in by sip_svc service) * - bits [29:24] Unused. Reserved. * - bits [31:30] Arm SiP services communication protocol version * * a0 - a7 * - User input data to be filled into a0-a7 registers when trigger * SMC/HVC * * resp_data_addr * - This parameter only used by asynchronous command. * - Dynamic memory address for service to put the asynchronous response * data. The service will free this memory space if the client has * cancelled the transaction. * * resp_data_size * - This parameter only used by asynchronous command. * - Maximum memory size in bytes of resp_data_addr * * priv_data * - Memory address to client context. Service will pass this address back * to client in response format via callback. */ struct sip_svc_request { uint32_t header; unsigned long a0; unsigned long a1; unsigned long a2; unsigned long a3; unsigned long a4; unsigned long a5; unsigned long a6; unsigned long a7; uint64_t resp_data_addr; uint32_t resp_data_size; void *priv_data; }; /** @brief SiP Services service communication protocol * response format. * * response header * - bits [15: 0] Error code * - bits [23:16] Transaction ID * - bits [29:24] Unused. Reserved. * - bits [31:30] Arm SiP services communication protocol version * * a0 - a3 * - SMC/HVC return value * * resp_data_addr * - This parameter only used by asynchronous command. * - Dynamic memory address that put the asynchronous response data. * This address is provided by client during request. Client is responsible * to free the memory space when receive the callback of a asynchronous * command transaction.The memory needs to be dynamically allocated, * the framework will free the allocated memory if the channel is in ABORT * state. * * resp_data_size * - This parameter only used by asynchronous command. * - Valid data size in bytes of resp_data_addr * * priv_data * - Memory address to client context which given during request. */ struct sip_svc_response { uint32_t header; unsigned long a0; unsigned long a1; unsigned long a2; unsigned long a3; uint64_t resp_data_addr; uint32_t resp_data_size; void *priv_data; }; #endif /* ZEPHYR_INCLUDE_SIP_SVC_PROTO_H_ */