/** @file Copyright (c) 2017-2021, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent System Control and Management Interface V1.0 http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/ DEN0056A_System_Control_and_Management_Interface.pdf **/ #ifndef SCMI_PRIVATE_H_ #define SCMI_PRIVATE_H_ // SCMI protocol IDs. typedef enum { ScmiProtocolIdBase = 0x10, ScmiProtocolIdPowerDomain = 0x11, ScmiProtocolIdSystemPower = 0x12, ScmiProtocolIdPerformance = 0x13, ScmiProtocolIdClock = 0x14, ScmiProtocolIdSensor = 0x15 } SCMI_PROTOCOL_ID; // SCMI message types. typedef enum { ScmiMessageTypeCommand = 0, ScmiMessageTypeDelayedResponse = 2, // Skipping 1 is deliberate. ScmiMessageTypeNotification = 3 } SCMI_MESSAGE_TYPE; // SCMI response error codes. typedef enum { ScmiSuccess = 0, ScmiNotSupported = -1, ScmiInvalidParameters = -2, ScmiDenied = -3, ScmiNotFound = -4, ScmiOutOfRange = -5, ScmiBusy = -6, ScmiCommsError = -7, ScmiGenericError = -8, ScmiHardwareError = -9, ScmiProtocolError = -10 } SCMI_STATUS; // SCMI message IDs common to all protocols. typedef enum { ScmiMessageIdProtocolVersion = 0x0, ScmiMessageIdProtocolAttributes = 0x1, ScmiMessageIdProtocolMessageAttributes = 0x2 } SCMI_MESSAGE_ID; // Not defined in SCMI specification but will help to identify a message. typedef struct { SCMI_PROTOCOL_ID ProtocolId; UINT32 MessageId; } SCMI_COMMAND; #pragma pack(1) // Response to a SCMI command. typedef struct { INT32 Status; UINT32 ReturnValues[]; } SCMI_MESSAGE_RESPONSE; // Message header. MsgId[7:0], MsgType[9:8], ProtocolId[17:10] #define MESSAGE_TYPE_SHIFT 8 #define PROTOCOL_ID_SHIFT 10 #define SCMI_MESSAGE_HEADER(MsgId, MsgType, ProtocolId) ( \ MsgType << MESSAGE_TYPE_SHIFT | \ ProtocolId << PROTOCOL_ID_SHIFT | \ MsgId \ ) // SCMI message header. typedef struct { UINT32 MessageHeader; } SCMI_MESSAGE_HEADER; #pragma pack() /** Return a pointer to the message payload. @param[out] Payload Holds pointer to the message payload. @retval EFI_SUCCESS Payload holds a valid message payload pointer. @retval EFI_TIMEOUT Time out error if MTL channel is busy. @retval EFI_UNSUPPORTED If MTL channel is unsupported. **/ EFI_STATUS ScmiCommandGetPayload ( OUT UINT32** Payload ); /** Execute a SCMI command and receive a response. This function uses a MTL channel to transfer message to SCP and waits for a response. @param[in] Command Pointer to the SCMI command (Protocol ID and Message ID) @param[in,out] PayloadLength SCMI command message length. @param[out] OPTIONAL ReturnValues Pointer to SCMI response. @retval OUT EFI_SUCCESS Command sent and message received successfully. @retval OUT EFI_UNSUPPORTED Channel not supported. @retval OUT EFI_TIMEOUT Timeout on the channel. @retval OUT EFI_DEVICE_ERROR Channel not ready. @retval OUT EFI_DEVICE_ERROR Message Header corrupted. @retval OUT EFI_DEVICE_ERROR SCMI error. **/ EFI_STATUS ScmiCommandExecute ( IN SCMI_COMMAND *Command, IN OUT UINT32 *PayloadLength, OUT UINT32 **ReturnValues OPTIONAL ); /** Return protocol version from SCP for a given protocol ID. @param[in] Protocol ID Protocol ID. @param[out] Version Pointer to version of the protocol. @retval EFI_SUCCESS Version holds a valid version received from the SCP. @retval EFI_DEVICE_ERROR SCMI error. @retval !(EFI_SUCCESS) Other errors. **/ EFI_STATUS ScmiGetProtocolVersion ( IN SCMI_PROTOCOL_ID ProtocolId, OUT UINT32 *Version ); /** Return protocol attributes from SCP for a given protocol ID. @param[in] Protocol ID Protocol ID. @param[out] ReturnValues Pointer to attributes of the protocol. @retval EFI_SUCCESS ReturnValues points to protocol attributes. @retval EFI_DEVICE_ERROR SCMI error. @retval !(EFI_SUCCESS) Other errors. **/ EFI_STATUS ScmiGetProtocolAttributes ( IN SCMI_PROTOCOL_ID ProtocolId, OUT UINT32 **ReturnValues ); /** Return protocol message attributes from SCP for a given protocol ID. @param[in] Protocol ID Protocol ID. @param[out] Attributes Pointer to attributes of the protocol. @retval EFI_SUCCESS ReturnValues points to protocol message attributes. @retval EFI_DEVICE_ERROR SCMI error. @retval !(EFI_SUCCESS) Other errors. **/ EFI_STATUS ScmiGetProtocolMessageAttributes ( IN SCMI_PROTOCOL_ID ProtocolId, OUT UINT32 **ReturnValues ); #endif /* SCMI_PRIVATE_H_ */