1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2 /* 3 * Copyright (c) 2015-2019, Arm Limited and Contributors. All rights reserved. 4 * Copyright (C) 2019-2020, Linaro Limited 5 */ 6 #ifndef _SCMI_PROTOCOLS_H 7 #define _SCMI_PROTOCOLS_H 8 9 #include <linux/bitops.h> 10 #include <asm/types.h> 11 12 /* 13 * Subset the SCMI protocols definition 14 * based on SCMI specification v2.0 (DEN0056B) 15 * https://developer.arm.com/docs/den0056/b 16 */ 17 18 enum scmi_std_protocol { 19 SCMI_PROTOCOL_ID_BASE = 0x10, 20 SCMI_PROTOCOL_ID_POWER_DOMAIN = 0x11, 21 SCMI_PROTOCOL_ID_SYSTEM = 0x12, 22 SCMI_PROTOCOL_ID_PERF = 0x13, 23 SCMI_PROTOCOL_ID_CLOCK = 0x14, 24 SCMI_PROTOCOL_ID_SENSOR = 0x15, 25 SCMI_PROTOCOL_ID_RESET_DOMAIN = 0x16, 26 SCMI_PROTOCOL_ID_VOLTAGE_DOMAIN = 0x17, 27 }; 28 29 enum scmi_status_code { 30 SCMI_SUCCESS = 0, 31 SCMI_NOT_SUPPORTED = -1, 32 SCMI_INVALID_PARAMETERS = -2, 33 SCMI_DENIED = -3, 34 SCMI_NOT_FOUND = -4, 35 SCMI_OUT_OF_RANGE = -5, 36 SCMI_BUSY = -6, 37 SCMI_COMMS_ERROR = -7, 38 SCMI_GENERIC_ERROR = -8, 39 SCMI_HARDWARE_ERROR = -9, 40 SCMI_PROTOCOL_ERROR = -10, 41 }; 42 43 /* 44 * SCMI Clock Protocol 45 */ 46 47 enum scmi_clock_message_id { 48 SCMI_CLOCK_RATE_SET = 0x5, 49 SCMI_CLOCK_RATE_GET = 0x6, 50 SCMI_CLOCK_CONFIG_SET = 0x7, 51 }; 52 53 #define SCMI_CLK_RATE_ASYNC_NOTIFY BIT(0) 54 #define SCMI_CLK_RATE_ASYNC_NORESP (BIT(0) | BIT(1)) 55 #define SCMI_CLK_RATE_ROUND_DOWN 0 56 #define SCMI_CLK_RATE_ROUND_UP BIT(2) 57 #define SCMI_CLK_RATE_ROUND_CLOSEST BIT(3) 58 59 /** 60 * struct scmi_clk_state_in - Message payload for CLOCK_CONFIG_SET command 61 * @clock_id: SCMI clock ID 62 * @attributes: Attributes of the targets clock state 63 */ 64 struct scmi_clk_state_in { 65 u32 clock_id; 66 u32 attributes; 67 }; 68 69 /** 70 * struct scmi_clk_state_out - Response payload for CLOCK_CONFIG_SET command 71 * @status: SCMI command status 72 */ 73 struct scmi_clk_state_out { 74 s32 status; 75 }; 76 77 /** 78 * struct scmi_clk_state_in - Message payload for CLOCK_RATE_GET command 79 * @clock_id: SCMI clock ID 80 * @attributes: Attributes of the targets clock state 81 */ 82 struct scmi_clk_rate_get_in { 83 u32 clock_id; 84 }; 85 86 /** 87 * struct scmi_clk_rate_get_out - Response payload for CLOCK_RATE_GET command 88 * @status: SCMI command status 89 * @rate_lsb: 32bit LSB of the clock rate in Hertz 90 * @rate_msb: 32bit MSB of the clock rate in Hertz 91 */ 92 struct scmi_clk_rate_get_out { 93 s32 status; 94 u32 rate_lsb; 95 u32 rate_msb; 96 }; 97 98 /** 99 * struct scmi_clk_state_in - Message payload for CLOCK_RATE_SET command 100 * @clock_id: SCMI clock ID 101 * @flags: Flags for the clock rate set request 102 * @rate_lsb: 32bit LSB of the clock rate in Hertz 103 * @rate_msb: 32bit MSB of the clock rate in Hertz 104 */ 105 struct scmi_clk_rate_set_in { 106 u32 clock_id; 107 u32 flags; 108 u32 rate_lsb; 109 u32 rate_msb; 110 }; 111 112 /** 113 * struct scmi_clk_rate_set_out - Response payload for CLOCK_RATE_SET command 114 * @status: SCMI command status 115 */ 116 struct scmi_clk_rate_set_out { 117 s32 status; 118 }; 119 120 /* 121 * SCMI Reset Domain Protocol 122 */ 123 124 enum scmi_reset_domain_message_id { 125 SCMI_RESET_DOMAIN_ATTRIBUTES = 0x3, 126 SCMI_RESET_DOMAIN_RESET = 0x4, 127 }; 128 129 #define SCMI_RD_NAME_LEN 16 130 131 #define SCMI_RD_ATTRIBUTES_FLAG_ASYNC BIT(31) 132 #define SCMI_RD_ATTRIBUTES_FLAG_NOTIF BIT(30) 133 134 #define SCMI_RD_RESET_FLAG_ASYNC BIT(2) 135 #define SCMI_RD_RESET_FLAG_ASSERT BIT(1) 136 #define SCMI_RD_RESET_FLAG_CYCLE BIT(0) 137 138 /** 139 * struct scmi_rd_attr_in - Payload for RESET_DOMAIN_ATTRIBUTES message 140 * @domain_id: SCMI reset domain ID 141 */ 142 struct scmi_rd_attr_in { 143 u32 domain_id; 144 }; 145 146 /** 147 * struct scmi_rd_attr_out - Payload for RESET_DOMAIN_ATTRIBUTES response 148 * @status: SCMI command status 149 * @attributes: Retrieved attributes of the reset domain 150 * @latency: Reset cycle max lantency 151 * @name: Reset domain name 152 */ 153 struct scmi_rd_attr_out { 154 s32 status; 155 u32 attributes; 156 u32 latency; 157 char name[SCMI_RD_NAME_LEN]; 158 }; 159 160 /** 161 * struct scmi_rd_reset_in - Message payload for RESET command 162 * @domain_id: SCMI reset domain ID 163 * @flags: Flags for the reset request 164 * @reset_state: Reset target state 165 */ 166 struct scmi_rd_reset_in { 167 u32 domain_id; 168 u32 flags; 169 u32 reset_state; 170 }; 171 172 /** 173 * struct scmi_rd_reset_out - Response payload for RESET command 174 * @status: SCMI command status 175 */ 176 struct scmi_rd_reset_out { 177 s32 status; 178 }; 179 180 /* 181 * SCMI Voltage Domain Protocol 182 */ 183 184 enum scmi_voltage_domain_message_id { 185 SCMI_VOLTAGE_DOMAIN_ATTRIBUTES = 0x3, 186 SCMI_VOLTAGE_DOMAIN_CONFIG_SET = 0x5, 187 SCMI_VOLTAGE_DOMAIN_CONFIG_GET = 0x6, 188 SCMI_VOLTAGE_DOMAIN_LEVEL_SET = 0x7, 189 SCMI_VOLTAGE_DOMAIN_LEVEL_GET = 0x8, 190 }; 191 192 #define SCMI_VOLTD_NAME_LEN 16 193 194 #define SCMI_VOLTD_CONFIG_MASK GENMASK(3, 0) 195 #define SCMI_VOLTD_CONFIG_OFF 0 196 #define SCMI_VOLTD_CONFIG_ON 0x7 197 198 /** 199 * struct scmi_voltd_attr_in - Payload for VOLTAGE_DOMAIN_ATTRIBUTES message 200 * @domain_id: SCMI voltage domain ID 201 */ 202 struct scmi_voltd_attr_in { 203 u32 domain_id; 204 }; 205 206 /** 207 * struct scmi_voltd_attr_out - Payload for VOLTAGE_DOMAIN_ATTRIBUTES response 208 * @status: SCMI command status 209 * @attributes: Retrieved attributes of the voltage domain 210 * @name: Voltage domain name 211 */ 212 struct scmi_voltd_attr_out { 213 s32 status; 214 u32 attributes; 215 char name[SCMI_VOLTD_NAME_LEN]; 216 }; 217 218 /** 219 * struct scmi_voltd_config_set_in - Message payload for VOLTAGE_CONFIG_SET cmd 220 * @domain_id: SCMI voltage domain ID 221 * @config: Configuration data of the voltage domain 222 */ 223 struct scmi_voltd_config_set_in { 224 u32 domain_id; 225 u32 config; 226 }; 227 228 /** 229 * struct scmi_voltd_config_set_out - Response for VOLTAGE_CONFIG_SET command 230 * @status: SCMI command status 231 */ 232 struct scmi_voltd_config_set_out { 233 s32 status; 234 }; 235 236 /** 237 * struct scmi_voltd_config_get_in - Message payload for VOLTAGE_CONFIG_GET cmd 238 * @domain_id: SCMI voltage domain ID 239 */ 240 struct scmi_voltd_config_get_in { 241 u32 domain_id; 242 }; 243 244 /** 245 * struct scmi_voltd_config_get_out - Response for VOLTAGE_CONFIG_GET command 246 * @status: SCMI command status 247 * @config: Configuration data of the voltage domain 248 */ 249 struct scmi_voltd_config_get_out { 250 s32 status; 251 u32 config; 252 }; 253 254 /** 255 * struct scmi_voltd_level_set_in - Message payload for VOLTAGE_LEVEL_SET cmd 256 * @domain_id: SCMI voltage domain ID 257 * @flags: Parameter flags for configuring target level 258 * @voltage_level: Target voltage level in microvolts (uV) 259 */ 260 struct scmi_voltd_level_set_in { 261 u32 domain_id; 262 u32 flags; 263 s32 voltage_level; 264 }; 265 266 /** 267 * struct scmi_voltd_level_set_out - Response for VOLTAGE_LEVEL_SET command 268 * @status: SCMI command status 269 */ 270 struct scmi_voltd_level_set_out { 271 s32 status; 272 }; 273 274 /** 275 * struct scmi_voltd_level_get_in - Message payload for VOLTAGE_LEVEL_GET cmd 276 * @domain_id: SCMI voltage domain ID 277 */ 278 struct scmi_voltd_level_get_in { 279 u32 domain_id; 280 }; 281 282 /** 283 * struct scmi_voltd_level_get_out - Response for VOLTAGE_LEVEL_GET command 284 * @status: SCMI command status 285 * @voltage_level: Voltage level in microvolts (uV) 286 */ 287 struct scmi_voltd_level_get_out { 288 s32 status; 289 s32 voltage_level; 290 }; 291 292 #endif /* _SCMI_PROTOCOLS_H */ 293