/** @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_SCMI_CLOCK_PROTOCOL_PRIVATE_H_ #define ARM_SCMI_CLOCK_PROTOCOL_PRIVATE_H_ #pragma pack(1) // Clock rate in two 32bit words. typedef struct { UINT32 Low; UINT32 High; } CLOCK_RATE_DWORD; // Format of the returned rate array. Linear or Non-linear,.RatesFlag Bit[12] #define RATE_FORMAT_SHIFT 12 #define RATE_FORMAT_MASK 0x0001 #define RATE_FORMAT(RatesFlags) ((RatesFlags >> RATE_FORMAT_SHIFT) \ & RATE_FORMAT_MASK) // Number of remaining rates after a call to the SCP, RatesFlag Bits[31:16] #define NUM_REMAIN_RATES_SHIFT 16 #define NUM_REMAIN_RATES(RatesFlags) ((RatesFlags >> NUM_REMAIN_RATES_SHIFT)) // Number of rates that are returned by a call.to the SCP, RatesFlag Bits[11:0] #define NUM_RATES_MASK 0x0FFF #define NUM_RATES(RatesFlags) (RatesFlags & NUM_RATES_MASK) // Return values for the CLOCK_DESCRIBER_RATE command. typedef struct { UINT32 NumRatesFlags; // 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. CLOCK_RATE_DWORD Rates[1]; } CLOCK_DESCRIBE_RATES; #define CLOCK_SET_DEFAULT_FLAGS 0 // Message parameters for CLOCK_RATE_SET command. typedef struct { UINT32 Flags; UINT32 ClockId; CLOCK_RATE_DWORD Rate; } CLOCK_RATE_SET_ATTRIBUTES; // Message parameters for CLOCK_CONFIG_SET command. typedef struct { UINT32 ClockId; UINT32 Attributes; } CLOCK_CONFIG_SET_ATTRIBUTES; // if ClockAttr Bit[0] is set then clock device is enabled. #define CLOCK_ENABLE_MASK 0x1 #define CLOCK_ENABLED(ClockAttr) ((ClockAttr & CLOCK_ENABLE_MASK) == 1) typedef struct { UINT32 Attributes; UINT8 ClockName[SCMI_MAX_STR_LEN]; } CLOCK_ATTRIBUTES; #pragma pack() /** Initialize clock management protocol and install protocol on a given handle. @param[in] Handle Handle to install clock management protocol. @retval EFI_SUCCESS Clock protocol interface installed successfully. **/ EFI_STATUS ScmiClockProtocolInit ( IN EFI_HANDLE *Handle ); #endif /* ARM_SCMI_CLOCK_PROTOCOL_PRIVATE_H_ */