]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Include/Protocol/ArmScmiPerformanceProtocol.h
ArmPkg: Introduce SCMI protocol
[mirror_edk2.git] / ArmPkg / Include / Protocol / ArmScmiPerformanceProtocol.h
diff --git a/ArmPkg/Include/Protocol/ArmScmiPerformanceProtocol.h b/ArmPkg/Include/Protocol/ArmScmiPerformanceProtocol.h
new file mode 100644 (file)
index 0000000..1d1af6f
--- /dev/null
@@ -0,0 +1,265 @@
+/** @file\r
+\r
+  Copyright (c) 2017-2018, Arm Limited. All rights reserved.\r
+\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+  System Control and Management Interface V1.0\r
+    http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/\r
+    DEN0056A_System_Control_and_Management_Interface.pdf\r
+**/\r
+\r
+#ifndef ARM_SCMI_PERFORMANCE_PROTOCOL_H_\r
+#define ARM_SCMI_PERFORMANCE_PROTOCOL_H_\r
+\r
+#include <Protocol/ArmScmi.h>\r
+\r
+#define PERFORMANCE_PROTOCOL_VERSION  0x10000\r
+\r
+#define ARM_SCMI_PERFORMANCE_PROTOCOL_GUID  { \\r
+  0x9b8ba84, 0x3dd3, 0x49a6, {0xa0, 0x5a, 0x31, 0x34, 0xa5, 0xf0, 0x7b, 0xad} \\r
+  }\r
+\r
+extern EFI_GUID gArmScmiPerformanceProtocolGuid;\r
+\r
+typedef struct _SCMI_PERFORMANCE_PROTOCOL SCMI_PERFORMANCE_PROTOCOL;\r
+\r
+#pragma pack(1)\r
+\r
+#define POWER_IN_MW_SHIFT       16\r
+#define POWER_IN_MW_MASK        0x1\r
+#define NUM_PERF_DOMAINS_MASK   0xFFFF\r
+\r
+// Total number of performance domains, Attr Bits [15:0]\r
+#define SCMI_PERF_TOTAL_DOMAINS(Attr)  (Attr & NUM_PERF_DOMAINS_MASK)\r
+\r
+// A flag to express power values in mW or platform specific way, Attr Bit [16]\r
+#define SCMI_PERF_POWER_IN_MW(Attr)  ((Attr >> POWER_IN_MW_SHIFT) &    \\r
+                                      POWER_IN_MW_MASK)\r
+\r
+// Performance protocol attributes return values.\r
+typedef struct {\r
+  UINT32 Attributes;\r
+  UINT64 StatisticsAddress;\r
+  UINT32 StatisticsLen;\r
+} SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES;\r
+\r
+#define SCMI_PERF_SUPPORT_LVL_CHANGE_NOTIFY(Attr) ((Attr >> 28) & 0x1)\r
+#define SCMI_PERF_SUPPORT_LIM_CHANGE_NOTIFY(Attr) ((Attr >> 29) & 0x1)\r
+#define SCMI_PERF_SUPPORT_SET_LVL(Attr) ((Attr >> 30) & 0x1)\r
+#define SCMI_PERF_SUPPORT_SET_LIM(Attr) ((Attr >> 31) & 0x1)\r
+#define SCMI_PERF_RATE_LIMIT(RateLimit) (RateLimit & 0xFFF)\r
+\r
+// Performance protocol domain attributes.\r
+typedef struct {\r
+  UINT32 Attributes;\r
+  UINT32 RateLimit;\r
+  UINT32 SustainedFreq;\r
+  UINT32 SustainedPerfLevel;\r
+  UINT8  Name[SCMI_MAX_STR_LEN];\r
+} SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES;\r
+\r
+// Worst case latency in microseconds, Bits[15:0]\r
+#define PERF_LATENCY_MASK                          0xFFFF\r
+#define SCMI_PERFORMANCE_PROTOCOL_LATENCY(Latency) (Latency & PERF_LATENCY_MASK)\r
+\r
+// Performance protocol performance level.\r
+typedef  struct {\r
+  UINT32 Level;\r
+  UINT32 PowerCost;\r
+  UINT32 Latency;\r
+} SCMI_PERFORMANCE_LEVEL;\r
+\r
+// Performance protocol performance limit.\r
+typedef struct {\r
+  UINT32 RangeMax;\r
+  UINT32 RangeMin;\r
+} SCMI_PERFORMANCE_LIMITS;\r
+\r
+#pragma pack()\r
+\r
+/** Return version of the performance management protocol supported by SCP.\r
+   firmware.\r
+\r
+  @param[in]  This      A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.\r
+\r
+  @param[out] Version   Version of the supported SCMI performance management\r
+                        protocol.\r
+\r
+  @retval EFI_SUCCESS       The version is returned.\r
+  @retval EFI_DEVICE_ERROR  SCP returns an SCMI error.\r
+  @retval !(EFI_SUCCESS)    Other errors.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *SCMI_PERFORMANCE_GET_VERSION) (\r
+  IN  SCMI_PERFORMANCE_PROTOCOL  *This,\r
+  OUT UINT32                     *Version\r
+  );\r
+\r
+/** Return protocol attributes of the performance management protocol.\r
+\r
+  @param[in] This         A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.\r
+\r
+  @param[out] Attributes  Protocol attributes.\r
+\r
+  @retval EFI_SUCCESS       Protocol attributes are returned.\r
+  @retval EFI_DEVICE_ERROR  SCP returns an SCMI error.\r
+  @retval !(EFI_SUCCESS)    Other errors.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *SCMI_PERFORMANCE_GET_ATTRIBUTES) (\r
+  IN  SCMI_PERFORMANCE_PROTOCOL              *This,\r
+  OUT SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES   *Attributes\r
+\r
+  );\r
+\r
+/** Return performance domain attributes.\r
+\r
+  @param[in]  This        A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.\r
+  @param[in]  DomainId    Identifier for the performance domain.\r
+\r
+  @param[out] Attributes  Performance domain attributes.\r
+\r
+  @retval EFI_SUCCESS       Domain attributes are returned.\r
+  @retval EFI_DEVICE_ERROR  SCP returns an SCMI error.\r
+  @retval !(EFI_SUCCESS)    Other errors.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES) (\r
+  IN  SCMI_PERFORMANCE_PROTOCOL           *This,\r
+  IN  UINT32                               DomainId,\r
+  OUT SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES  *DomainAttributes\r
+  );\r
+\r
+/** Return list of performance domain levels of a given domain.\r
+\r
+  @param[in] This        A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.\r
+  @param[in] DomainId    Identifier for the performance domain.\r
+\r
+  @param[out] NumLevels   Total number of levels a domain can support.\r
+\r
+  @param[in,out]  LevelArraySize Size of the performance level array.\r
+\r
+  @param[out] LevelArray   Array of the performance levels.\r
+\r
+  @retval EFI_SUCCESS          Domain levels are returned.\r
+  @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.\r
+  @retval EFI_BUFFER_TOO_SMALL LevelArraySize is too small for the result.\r
+                               It has been updated to the size needed.\r
+  @retval !(EFI_SUCCESS)       Other errors.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *SCMI_PERFORMANCE_DESCRIBE_LEVELS) (\r
+  IN     SCMI_PERFORMANCE_PROTOCOL  *This,\r
+  IN     UINT32                     DomainId,\r
+  OUT    UINT32                     *NumLevels,\r
+  IN OUT UINT32                     *LevelArraySize,\r
+  OUT    SCMI_PERFORMANCE_LEVEL     *LevelArray\r
+  );\r
+\r
+/** Set performance limits of a domain.\r
+\r
+  @param[in] This        A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.\r
+  @param[in] DomainId    Identifier for the performance domain.\r
+  @param[in] Limit       Performance limit to set.\r
+\r
+  @retval EFI_SUCCESS          Performance limits set successfully.\r
+  @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.\r
+  @retval !(EFI_SUCCESS)       Other errors.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *SCMI_PERFORMANCE_LIMITS_SET) (\r
+  IN SCMI_PERFORMANCE_PROTOCOL *This,\r
+  IN UINT32                    DomainId,\r
+  IN SCMI_PERFORMANCE_LIMITS   *Limits\r
+  );\r
+\r
+/** Get performance limits of a domain.\r
+\r
+  @param[in]  This        A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.\r
+  @param[in]  DomainId    Identifier for the performance domain.\r
+\r
+  @param[out] Limit       Performance Limits of the domain.\r
+\r
+  @retval EFI_SUCCESS          Performance limits are returned.\r
+  @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.\r
+  @retval !(EFI_SUCCESS)       Other errors.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *SCMI_PERFORMANCE_LIMITS_GET) (\r
+  SCMI_PERFORMANCE_PROTOCOL *This,\r
+  UINT32                    DomainId,\r
+  SCMI_PERFORMANCE_LIMITS   *Limits\r
+  );\r
+\r
+/** Set performance level of a domain.\r
+\r
+  @param[in]  This        A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.\r
+  @param[in]  DomainId    Identifier for the performance domain.\r
+  @param[in]  Level       Performance level of the domain.\r
+\r
+  @retval EFI_SUCCESS          Performance level set successfully.\r
+  @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.\r
+  @retval !(EFI_SUCCESS)       Other errors.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *SCMI_PERFORMANCE_LEVEL_SET) (\r
+  IN SCMI_PERFORMANCE_PROTOCOL *This,\r
+  IN UINT32                    DomainId,\r
+  IN UINT32                    Level\r
+  );\r
+\r
+/** Get performance level of a domain.\r
+\r
+  @param[in]  This        A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.\r
+  @param[in]  DomainId    Identifier for the performance domain.\r
+\r
+  @param[out] Level       Performance level of the domain.\r
+\r
+  @retval EFI_SUCCESS          Performance level got successfully.\r
+  @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.\r
+  @retval !(EFI_SUCCESS)       Other errors.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *SCMI_PERFORMANCE_LEVEL_GET) (\r
+  IN  SCMI_PERFORMANCE_PROTOCOL *This,\r
+  IN  UINT32                    DomainId,\r
+  OUT UINT32                    *Level\r
+  );\r
+\r
+typedef struct _SCMI_PERFORMANCE_PROTOCOL {\r
+  SCMI_PERFORMANCE_GET_VERSION GetVersion;\r
+  SCMI_PERFORMANCE_GET_ATTRIBUTES GetProtocolAttributes;\r
+  SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES GetDomainAttributes;\r
+  SCMI_PERFORMANCE_DESCRIBE_LEVELS DescribeLevels;\r
+  SCMI_PERFORMANCE_LIMITS_SET LimitsSet;\r
+  SCMI_PERFORMANCE_LIMITS_GET LimitsGet;\r
+  SCMI_PERFORMANCE_LEVEL_SET LevelSet;\r
+  SCMI_PERFORMANCE_LEVEL_GET LevelGet;\r
+} SCMI_PERFORMANCE_PROTOCOL;\r
+\r
+typedef enum {\r
+  SCMI_MESSAGE_ID_PERFORMANCE_DOMAIN_ATTRIBUTES = 0x3,\r
+  SCMI_MESSAGE_ID_PERFORMANCE_DESCRIBE_LEVELS   = 0x4,\r
+  SCMI_MESSAGE_ID_PERFORMANCE_LIMITS_SET        = 0x5,\r
+  SCMI_MESSAGE_ID_PERFORMANCE_LIMITS_GET        = 0x6,\r
+  SCMI_MESSAGE_ID_PERFORMANCE_LEVEL_SET         = 0x7,\r
+  SCMI_MESSAGE_ID_PERFORMANCE_LEVEL_GET         = 0x8,\r
+} SCMI_MESSAGE_ID_PERFORMANCE;\r
+\r
+#endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_H_ */\r
+\r