/** @file Copyright (c) 2017-2023, Arm Limited. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent System Control and Management Interface V3.2, latest version at: - https://developer.arm.com/documentation/den0056/latest/ **/ #ifndef ARM_SCMI_PERFORMANCE_PROTOCOL_H_ #define ARM_SCMI_PERFORMANCE_PROTOCOL_H_ #include /// Arm Scmi performance protocol versions. #define PERFORMANCE_PROTOCOL_VERSION_V1 0x10000 #define PERFORMANCE_PROTOCOL_VERSION_V2 0x20000 #define PERFORMANCE_PROTOCOL_VERSION_V3 0x30000 #define ARM_SCMI_PERFORMANCE_PROTOCOL_GUID { \ 0x9b8ba84, 0x3dd3, 0x49a6, {0xa0, 0x5a, 0x31, 0x34, 0xa5, 0xf0, 0x7b, 0xad} \ } extern EFI_GUID gArmScmiPerformanceProtocolGuid; typedef struct _SCMI_PERFORMANCE_PROTOCOL SCMI_PERFORMANCE_PROTOCOL; #pragma pack(1) #define POWER_IN_MW_SHIFT 16 #define POWER_IN_MW_MASK 0x1 #define NUM_PERF_DOMAINS_MASK 0xFFFF // Total number of performance domains, Attr Bits [15:0] #define SCMI_PERF_TOTAL_DOMAINS(Attr) (Attr & NUM_PERF_DOMAINS_MASK) // A flag to express power values in mW or platform specific way, Attr Bit [16] #define SCMI_PERF_POWER_IN_MW(Attr) ((Attr >> POWER_IN_MW_SHIFT) & \ POWER_IN_MW_MASK) // Performance protocol attributes return values. typedef struct { UINT32 Attributes; UINT64 StatisticsAddress; UINT32 StatisticsLen; } SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES; #define SCMI_PERF_SUPPORT_LVL_CHANGE_NOTIFY(Attr) ((Attr >> 28) & 0x1) #define SCMI_PERF_SUPPORT_LIM_CHANGE_NOTIFY(Attr) ((Attr >> 29) & 0x1) #define SCMI_PERF_SUPPORT_SET_LVL(Attr) ((Attr >> 30) & 0x1) #define SCMI_PERF_SUPPORT_SET_LIM(Attr) ((Attr >> 31) & 0x1) #define SCMI_PERF_RATE_LIMIT(RateLimit) (RateLimit & 0xFFF) // Performance protocol domain attributes. typedef struct { UINT32 Attributes; UINT32 RateLimit; UINT32 SustainedFreq; UINT32 SustainedPerfLevel; UINT8 Name[SCMI_MAX_STR_LEN]; } SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES; // Worst case latency in microseconds, Bits[15:0] #define PERF_LATENCY_MASK 0xFFFF #define SCMI_PERFORMANCE_PROTOCOL_LATENCY(Latency) (Latency & PERF_LATENCY_MASK) // Performance protocol performance level. typedef struct { UINT32 Level; UINT32 PowerCost; UINT32 Latency; } SCMI_PERFORMANCE_LEVEL; // Performance protocol performance limit. typedef struct { UINT32 RangeMax; UINT32 RangeMin; } SCMI_PERFORMANCE_LIMITS; /// Doorbell Support bit. #define SCMI_PERF_FC_ATTRIB_HAS_DOORBELL BIT0 /// Performance protocol describe fastchannel typedef struct { /// Attributes. UINT32 Attributes; /// Rate limit. UINT32 RateLimit; /// Lower 32 bits of the FastChannel address. UINT32 ChanAddrLow; /// Higher 32 bits of the FastChannel address. UINT32 ChanAddrHigh; /// Size of the FastChannel in bytes. UINT32 ChanSize; /// Lower 32 bits of the doorbell address. UINT32 DoorbellAddrLow; /// Higher 32 bits of the doorbell address. UINT32 DoorbellAddrHigh; /// Mask of lower 32 bits to set when writing to the doorbell register. UINT32 DoorbellSetMaskLow; /// Mask of higher 32 bits to set when writing to the doorbell register. UINT32 DoorbellSetMaskHigh; /// Mask of lower 32 bits to preserve when writing to the doorbell register. UINT32 DoorbellPreserveMaskLow; /// Mask of higher 32 bits to preserve when writing to the doorbell register. UINT32 DoorbellPreserveMaskHigh; } SCMI_PERFORMANCE_FASTCHANNEL; #pragma pack() /// SCMI Message Ids for the Performance Protocol. typedef enum { ScmiMessageIdPerformanceDomainAttributes = 0x3, ScmiMessageIdPerformanceDescribeLevels = 0x4, ScmiMessageIdPerformanceLimitsSet = 0x5, ScmiMessageIdPerformanceLimitsGet = 0x6, ScmiMessageIdPerformanceLevelSet = 0x7, ScmiMessageIdPerformanceLevelGet = 0x8, ScmiMessageIdPerformanceDescribeFastchannel = 0xB, } SCMI_MESSAGE_ID_PERFORMANCE; /** Return version of the performance management protocol supported by SCP. firmware. @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance. @param[out] Version Version of the supported SCMI performance 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_PERFORMANCE_GET_VERSION)( IN SCMI_PERFORMANCE_PROTOCOL *This, OUT UINT32 *Version ); /** Return protocol attributes of the performance management protocol. @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance. @param[out] Attributes Protocol attributes. @retval EFI_SUCCESS Protocol attributes are returned. @retval EFI_DEVICE_ERROR SCP returns an SCMI error. @retval !(EFI_SUCCESS) Other errors. **/ typedef EFI_STATUS (EFIAPI *SCMI_PERFORMANCE_GET_ATTRIBUTES)( IN SCMI_PERFORMANCE_PROTOCOL *This, OUT SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES *Attributes ); /** Return performance domain attributes. @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance. @param[in] DomainId Identifier for the performance domain. @param[out] Attributes Performance domain attributes. @retval EFI_SUCCESS Domain attributes are returned. @retval EFI_DEVICE_ERROR SCP returns an SCMI error. @retval !(EFI_SUCCESS) Other errors. **/ typedef EFI_STATUS (EFIAPI *SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES)( IN SCMI_PERFORMANCE_PROTOCOL *This, IN UINT32 DomainId, OUT SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES *DomainAttributes ); /** Return list of performance domain levels of a given domain. @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance. @param[in] DomainId Identifier for the performance domain. @param[out] NumLevels Total number of levels a domain can support. @param[in,out] LevelArraySize Size of the performance level array. @param[out] LevelArray Array of the performance levels. @retval EFI_SUCCESS Domain levels are returned. @retval EFI_DEVICE_ERROR SCP returns an SCMI error. @retval EFI_BUFFER_TOO_SMALL LevelArraySize is too small for the result. It has been updated to the size needed. @retval !(EFI_SUCCESS) Other errors. **/ typedef EFI_STATUS (EFIAPI *SCMI_PERFORMANCE_DESCRIBE_LEVELS)( IN SCMI_PERFORMANCE_PROTOCOL *This, IN UINT32 DomainId, OUT UINT32 *NumLevels, IN OUT UINT32 *LevelArraySize, OUT SCMI_PERFORMANCE_LEVEL *LevelArray ); /** Set performance limits of a domain. @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance. @param[in] DomainId Identifier for the performance domain. @param[in] Limit Performance limit to set. @retval EFI_SUCCESS Performance limits set successfully. @retval EFI_DEVICE_ERROR SCP returns an SCMI error. @retval !(EFI_SUCCESS) Other errors. **/ typedef EFI_STATUS (EFIAPI *SCMI_PERFORMANCE_LIMITS_SET)( IN SCMI_PERFORMANCE_PROTOCOL *This, IN UINT32 DomainId, IN SCMI_PERFORMANCE_LIMITS *Limits ); /** Get performance limits of a domain. @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance. @param[in] DomainId Identifier for the performance domain. @param[out] Limit Performance Limits of the domain. @retval EFI_SUCCESS Performance limits are returned. @retval EFI_DEVICE_ERROR SCP returns an SCMI error. @retval !(EFI_SUCCESS) Other errors. **/ typedef EFI_STATUS (EFIAPI *SCMI_PERFORMANCE_LIMITS_GET)( SCMI_PERFORMANCE_PROTOCOL *This, UINT32 DomainId, SCMI_PERFORMANCE_LIMITS *Limits ); /** Set performance level of a domain. @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance. @param[in] DomainId Identifier for the performance domain. @param[in] Level Performance level of the domain. @retval EFI_SUCCESS Performance level set successfully. @retval EFI_DEVICE_ERROR SCP returns an SCMI error. @retval !(EFI_SUCCESS) Other errors. **/ typedef EFI_STATUS (EFIAPI *SCMI_PERFORMANCE_LEVEL_SET)( IN SCMI_PERFORMANCE_PROTOCOL *This, IN UINT32 DomainId, IN UINT32 Level ); /** Get performance level of a domain. @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance. @param[in] DomainId Identifier for the performance domain. @param[out] Level Performance level of the domain. @retval EFI_SUCCESS Performance level got successfully. @retval EFI_DEVICE_ERROR SCP returns an SCMI error. @retval !(EFI_SUCCESS) Other errors. **/ typedef EFI_STATUS (EFIAPI *SCMI_PERFORMANCE_LEVEL_GET)( IN SCMI_PERFORMANCE_PROTOCOL *This, IN UINT32 DomainId, OUT UINT32 *Level ); /** Discover the attributes of the FastChannel for the specified performance domain and the specified message. @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance. @param[in] DomainId Identifier for the performance domain. @param[in] MessageId Message Id of the FastChannel to discover. Must be one of: - PERFORMANCE_LIMITS_SET - PERFORMANCE_LIMITS_GET - PERFORMANCE_LEVEL_SET - PERFORMANCE_LEVEL_GET @param[out] FastChannel If success, contains the FastChannel description. @retval EFI_SUCCESS Performance level got successfully. @retval EFI_DEVICE_ERROR SCP returns an SCMI error. @retval EFI_INVALID_PARAMETER Invalid parameter. @retval EFI_TIMEOUT Time out. @retval EFI_UNSUPPORTED Unsupported. **/ typedef EFI_STATUS (EFIAPI *SCMI_PERFORMANCE_DESCRIBE_FASTCHANNEL)( IN SCMI_PERFORMANCE_PROTOCOL *This, IN UINT32 DomainId, IN SCMI_MESSAGE_ID_PERFORMANCE MessageId, OUT SCMI_PERFORMANCE_FASTCHANNEL *FastChannel ); typedef struct _SCMI_PERFORMANCE_PROTOCOL { SCMI_PERFORMANCE_GET_VERSION GetVersion; SCMI_PERFORMANCE_GET_ATTRIBUTES GetProtocolAttributes; SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES GetDomainAttributes; SCMI_PERFORMANCE_DESCRIBE_LEVELS DescribeLevels; SCMI_PERFORMANCE_LIMITS_SET LimitsSet; SCMI_PERFORMANCE_LIMITS_GET LimitsGet; SCMI_PERFORMANCE_LEVEL_SET LevelSet; SCMI_PERFORMANCE_LEVEL_GET LevelGet; SCMI_PERFORMANCE_DESCRIBE_FASTCHANNEL DescribeFastchannel; } SCMI_PERFORMANCE_PROTOCOL; #endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_H_ */