https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
		
			
				
	
	
		
			213 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			213 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @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_H_
 | 
						|
#define ARM_SCMI_CLOCK_PROTOCOL_H_
 | 
						|
 | 
						|
#include <Protocol/ArmScmi.h>
 | 
						|
 | 
						|
#define ARM_SCMI_CLOCK_PROTOCOL_GUID { \
 | 
						|
  0x91ce67a8, 0xe0aa, 0x4012, {0xb9, 0x9f, 0xb6, 0xfc, 0xf3, 0x4, 0x8e, 0xaa} \
 | 
						|
  }
 | 
						|
 | 
						|
extern EFI_GUID gArmScmiClockProtocolGuid;
 | 
						|
 | 
						|
// Message Type for clock management protocol.
 | 
						|
typedef enum {
 | 
						|
  SCMI_MESSAGE_ID_CLOCK_ATTRIBUTES     = 0x3,
 | 
						|
  SCMI_MESSAGE_ID_CLOCK_DESCRIBE_RATES = 0x4,
 | 
						|
  SCMI_MESSAGE_ID_CLOCK_RATE_SET       = 0x5,
 | 
						|
  SCMI_MESSAGE_ID_CLOCK_RATE_GET       = 0x6,
 | 
						|
  SCMI_MESSAGE_ID_CLOCK_CONFIG_SET     = 0x7
 | 
						|
} SCMI_MESSAGE_ID_CLOCK;
 | 
						|
 | 
						|
typedef enum {
 | 
						|
  SCMI_CLOCK_RATE_FORMAT_DISCRETE, // Non-linear range.
 | 
						|
  SCMI_CLOCK_RATE_FORMAT_LINEAR    // Linear range.
 | 
						|
} SCMI_CLOCK_RATE_FORMAT;
 | 
						|
 | 
						|
// Clock management protocol version.
 | 
						|
#define SCMI_CLOCK_PROTOCOL_VERSION 0x10000
 | 
						|
 | 
						|
#define SCMI_CLOCK_PROTOCOL_PENDING_ASYNC_RATES_MASK      0xFFU
 | 
						|
#define SCMI_CLOCK_PROTOCOL_PENDING_ASYNC_RATES_SHIFT     16
 | 
						|
#define SCMI_CLOCK_PROTOCOL_NUM_CLOCKS_MASK               0xFFFFU
 | 
						|
 | 
						|
/** Total number of pending asynchronous clock rates changes
 | 
						|
  supported by the SCP, Attr Bits[23:16]
 | 
						|
*/
 | 
						|
#define SCMI_CLOCK_PROTOCOL_MAX_ASYNC_CLK_RATES(Attr) (                       \
 | 
						|
                  (Attr >> SCMI_CLOCK_PROTOCOL_PENDING_ASYNC_RATES_SHIFT) &&  \
 | 
						|
                   SCMI_CLOCK_PROTOCOL_PENDING_ASYNC_RATES_MASK)
 | 
						|
 | 
						|
// Total of clock devices supported by the SCP, Attr Bits[15:0]
 | 
						|
#define SCMI_CLOCK_PROTOCOL_TOTAL_CLKS(Attr) (Attr & SCMI_CLOCK_PROTOCOL_NUM_CLOCKS_MASK)
 | 
						|
 | 
						|
#pragma pack(1)
 | 
						|
 | 
						|
/* Depending on the format (linear/non-linear) supported by a clock device
 | 
						|
   either Rate or Min/Max/Step triplet is valid.
 | 
						|
*/
 | 
						|
typedef struct {
 | 
						|
  union {
 | 
						|
  UINT64 Min;
 | 
						|
  UINT64 Rate;
 | 
						|
  };
 | 
						|
  UINT64 Max;
 | 
						|
  UINT64 Step;
 | 
						|
} SCMI_CLOCK_RATE;
 | 
						|
 | 
						|
#pragma pack()
 | 
						|
 | 
						|
typedef struct _SCMI_CLOCK_PROTOCOL SCMI_CLOCK_PROTOCOL;
 | 
						|
 | 
						|
// Protocol Interface functions.
 | 
						|
 | 
						|
/** Return version of the clock management protocol supported by SCP firmware.
 | 
						|
 | 
						|
  @param[in]  This     A Pointer to SCMI_CLOCK_PROTOCOL Instance.
 | 
						|
 | 
						|
  @param[out] Version  Version of the supported SCMI Clock management protocol.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS       The version is returned.
 | 
						|
  @retval EFI_DEVICE_ERROR  SCP returns an SCMI error.
 | 
						|
  @retval !(EFI_SUCCESS)    Other errors.
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *SCMI_CLOCK_GET_VERSION) (
 | 
						|
  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
						|
  OUT UINT32               *Version
 | 
						|
  );
 | 
						|
 | 
						|
/** Return total number of clock devices supported by the clock management
 | 
						|
   protocol.
 | 
						|
 | 
						|
  @param[in]  This         A Pointer to SCMI_CLOCK_PROTOCOL Instance.
 | 
						|
 | 
						|
  @param[out] TotalClocks  Total number of clocks supported.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS       Total number of clocks supported is returned.
 | 
						|
  @retval EFI_DEVICE_ERROR  SCP returns an SCMI error.
 | 
						|
  @retval !(EFI_SUCCESS)    Other errors.
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *SCMI_CLOCK_GET_TOTAL_CLOCKS) (
 | 
						|
  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
						|
  OUT UINT32               *TotalClocks
 | 
						|
  );
 | 
						|
 | 
						|
/** Return attributes of a clock device.
 | 
						|
 | 
						|
  @param[in]  This        A Pointer to SCMI_CLOCK_PROTOCOL Instance.
 | 
						|
  @param[in]  ClockId     Identifier for the clock device.
 | 
						|
 | 
						|
  @param[out] Enabled         If TRUE, the clock device is enabled.
 | 
						|
  @param[out] ClockAsciiName  A NULL terminated ASCII string with the clock
 | 
						|
                              name, of up to 16 bytes.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          Clock device attributes are returned.
 | 
						|
  @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.
 | 
						|
  @retval !(EFI_SUCCESS)       Other errors.
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *SCMI_CLOCK_GET_CLOCK_ATTRIBUTES) (
 | 
						|
  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
						|
  IN  UINT32               ClockId,
 | 
						|
  OUT BOOLEAN              *Enabled,
 | 
						|
  OUT CHAR8                *ClockAsciiName
 | 
						|
  );
 | 
						|
 | 
						|
/** Return list of rates supported by a given clock device.
 | 
						|
 | 
						|
  @param[in] This        A pointer to SCMI_CLOCK_PROTOCOL Instance.
 | 
						|
  @param[in] ClockId     Identifier for the clock device.
 | 
						|
 | 
						|
  @param[out] Format      SCMI_CLOCK_RATE_FORMAT_DISCRETE: Clock device
 | 
						|
                          supports range of clock rates which are non-linear.
 | 
						|
 | 
						|
                          SCMI_CLOCK_RATE_FORMAT_LINEAR: Clock device supports
 | 
						|
                          range of linear clock rates from Min to Max in steps.
 | 
						|
 | 
						|
  @param[out] TotalRates  Total number of rates.
 | 
						|
 | 
						|
  @param[in,out] RateArraySize  Size of the RateArray.
 | 
						|
 | 
						|
  @param[out] RateArray   List of clock rates.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          List of clock rates are returned.
 | 
						|
  @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.
 | 
						|
  @retval EFI_BUFFER_TOO_SMALL RateArraySize is too small for the result.
 | 
						|
                               It has been updated to the size needed.
 | 
						|
  @retval !(EFI_SUCCESS)       Other errors.
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *SCMI_CLOCK_DESCRIBE_RATES) (
 | 
						|
  IN     SCMI_CLOCK_PROTOCOL     *This,
 | 
						|
  IN     UINT32                   ClockId,
 | 
						|
  OUT    SCMI_CLOCK_RATE_FORMAT  *Format,
 | 
						|
  OUT    UINT32                  *TotalRates,
 | 
						|
  IN OUT UINT32                  *RateArraySize,
 | 
						|
  OUT    SCMI_CLOCK_RATE         *RateArray
 | 
						|
  );
 | 
						|
 | 
						|
/** Get clock rate.
 | 
						|
 | 
						|
  @param[in]  This        A Pointer to SCMI_CLOCK_PROTOCOL Instance.
 | 
						|
  @param[in]  ClockId     Identifier for the clock device.
 | 
						|
 | 
						|
  @param[out]  Rate       Clock rate.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          Clock rate is returned.
 | 
						|
  @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.
 | 
						|
  @retval !(EFI_SUCCESS)       Other errors.
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *SCMI_CLOCK_RATE_GET) (
 | 
						|
  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
						|
  IN  UINT32               ClockId,
 | 
						|
  OUT UINT64               *Rate
 | 
						|
  );
 | 
						|
 | 
						|
/** Set clock rate.
 | 
						|
 | 
						|
  @param[in]  This        A Pointer to SCMI_CLOCK_PROTOCOL Instance.
 | 
						|
  @param[in]  ClockId     Identifier for the clock device.
 | 
						|
  @param[in]  Rate        Clock rate.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          Clock rate set success.
 | 
						|
  @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.
 | 
						|
  @retval !(EFI_SUCCESS)       Other errors.
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *SCMI_CLOCK_RATE_SET) (
 | 
						|
  IN SCMI_CLOCK_PROTOCOL  *This,
 | 
						|
  IN UINT32               ClockId,
 | 
						|
  IN UINT64               Rate
 | 
						|
  );
 | 
						|
 | 
						|
typedef struct _SCMI_CLOCK_PROTOCOL {
 | 
						|
  SCMI_CLOCK_GET_VERSION GetVersion;
 | 
						|
  SCMI_CLOCK_GET_TOTAL_CLOCKS GetTotalClocks;
 | 
						|
  SCMI_CLOCK_GET_CLOCK_ATTRIBUTES GetClockAttributes;
 | 
						|
  SCMI_CLOCK_DESCRIBE_RATES DescribeRates;
 | 
						|
  SCMI_CLOCK_RATE_GET RateGet;
 | 
						|
  SCMI_CLOCK_RATE_SET RateSet;
 | 
						|
} SCMI_CLOCK_PROTOCOL;
 | 
						|
 | 
						|
#endif /* ARM_SCMI_CLOCK_PROTOCOL_H_ */
 | 
						|
 |