/** @file Copyright (c) 2017-2018, 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 ARM_MTL_LIB_H_ #define ARM_MTL_LIB_H_ #include // Ideally we don't need packed struct. However we can't rely on compilers. #pragma pack(1) typedef struct { UINT32 Reserved1; UINT32 ChannelStatus; UINT64 Reserved2; UINT32 Flags; UINT32 Length; UINT32 MessageHeader; // NOTE: Since EDK2 does not allow flexible array member [] we declare // here array of 1 element length. However below is used as a variable // length array. UINT32 Payload[1]; // size less object gives offset to payload. } MTL_MAILBOX; #pragma pack() // Channel Type, Low-priority, and High-priority typedef enum { MTL_CHANNEL_TYPE_LOW = 0, MTL_CHANNEL_TYPE_HIGH = 1 } MTL_CHANNEL_TYPE; typedef struct { UINT64 PhysicalAddress; UINT32 ModifyMask; UINT32 PreserveMask; } MTL_DOORBELL; typedef struct { MTL_CHANNEL_TYPE ChannelType; MTL_MAILBOX * CONST MailBox; MTL_DOORBELL DoorBell; } MTL_CHANNEL; /** Wait until channel is free. @param[in] Channel Pointer to a channel. @param[in] TimeOutInMicroSeconds Time out in micro seconds. @retval EFI_SUCCESS Channel is free. @retval EFI_TIMEOUT Time out error. **/ EFI_STATUS MtlWaitUntilChannelFree ( IN MTL_CHANNEL *Channel, IN UINTN TimeOutInMicroSeconds ); /** Return the address of the message payload. @param[in] Channel Pointer to a channel. @retval UINT32* Pointer to the payload. **/ UINT32* MtlGetChannelPayload ( IN MTL_CHANNEL *Channel ); /** Return pointer to a channel for the requested channel type. @param[in] ChannelType ChannelType, Low or High priority channel. MTL_CHANNEL_TYPE_LOW or MTL_CHANNEL_TYPE_HIGH @param[out] Channel Holds pointer to the channel. @retval EFI_SUCCESS Pointer to channel is returned. @retval EFI_UNSUPPORTED Requested channel type not supported. **/ EFI_STATUS MtlGetChannel ( IN MTL_CHANNEL_TYPE ChannelType, OUT MTL_CHANNEL **Channel ); /** Mark the channel busy and ring the doorbell. @param[in] Channel Pointer to a channel. @param[in] MessageHeader Message header. @param[out] PayloadLength Message length. @retval EFI_SUCCESS Message sent successfully. @retval EFI_DEVICE_ERROR Channel is busy. **/ EFI_STATUS MtlSendMessage ( IN MTL_CHANNEL *Channel, IN UINT32 MessageHeader, OUT UINT32 PayloadLength ); /** Wait for a response on a channel. If channel is free after sending message, it implies SCP responded with a response on the channel. @param[in] Channel Pointer to a channel. @retval EFI_SUCCESS Message received successfully. @retval EFI_TIMEOUT Time out error. **/ EFI_STATUS MtlReceiveMessage ( IN MTL_CHANNEL *Channel, OUT UINT32 *MessageHeader, OUT UINT32 *PayloadLength ); #endif /* ARM_MTL_LIB_H_ */