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 * Generic message IDs 45 */ 46 enum scmi_discovery_id { 47 SCMI_PROTOCOL_VERSION = 0x0, 48 SCMI_PROTOCOL_ATTRIBUTES = 0x1, 49 SCMI_PROTOCOL_MESSAGE_ATTRIBUTES = 0x2, 50 }; 51 52 /* 53 * SCMI Clock Protocol 54 */ 55 56 enum scmi_clock_message_id { 57 SCMI_CLOCK_ATTRIBUTES = 0x3, 58 SCMI_CLOCK_RATE_SET = 0x5, 59 SCMI_CLOCK_RATE_GET = 0x6, 60 SCMI_CLOCK_CONFIG_SET = 0x7, 61 }; 62 63 #define SCMI_CLK_PROTO_ATTR_COUNT_MASK GENMASK(15, 0) 64 #define SCMI_CLK_RATE_ASYNC_NOTIFY BIT(0) 65 #define SCMI_CLK_RATE_ASYNC_NORESP (BIT(0) | BIT(1)) 66 #define SCMI_CLK_RATE_ROUND_DOWN 0 67 #define SCMI_CLK_RATE_ROUND_UP BIT(2) 68 #define SCMI_CLK_RATE_ROUND_CLOSEST BIT(3) 69 70 #define SCMI_CLOCK_NAME_LENGTH_MAX 16 71 72 /** 73 * struct scmi_clk_get_nb_out - Response for SCMI_PROTOCOL_ATTRIBUTES command 74 * @status: SCMI command status 75 * @attributes: Attributes of the clock protocol, mainly number of clocks exposed 76 */ 77 struct scmi_clk_protocol_attr_out { 78 s32 status; 79 u32 attributes; 80 }; 81 82 /** 83 * struct scmi_clk_attribute_in - Message payload for SCMI_CLOCK_ATTRIBUTES command 84 * @clock_id: SCMI clock ID 85 */ 86 struct scmi_clk_attribute_in { 87 u32 clock_id; 88 }; 89 90 /** 91 * struct scmi_clk_get_nb_out - Response payload for SCMI_CLOCK_ATTRIBUTES command 92 * @status: SCMI command status 93 * @attributes: clock attributes 94 * @clock_name: name of the clock 95 */ 96 struct scmi_clk_attribute_out { 97 s32 status; 98 u32 attributes; 99 char clock_name[SCMI_CLOCK_NAME_LENGTH_MAX]; 100 }; 101 102 /** 103 * struct scmi_clk_state_in - Message payload for CLOCK_CONFIG_SET command 104 * @clock_id: SCMI clock ID 105 * @attributes: Attributes of the targets clock state 106 */ 107 struct scmi_clk_state_in { 108 u32 clock_id; 109 u32 attributes; 110 }; 111 112 /** 113 * struct scmi_clk_state_out - Response payload for CLOCK_CONFIG_SET command 114 * @status: SCMI command status 115 */ 116 struct scmi_clk_state_out { 117 s32 status; 118 }; 119 120 /** 121 * struct scmi_clk_state_in - Message payload for CLOCK_RATE_GET command 122 * @clock_id: SCMI clock ID 123 * @attributes: Attributes of the targets clock state 124 */ 125 struct scmi_clk_rate_get_in { 126 u32 clock_id; 127 }; 128 129 /** 130 * struct scmi_clk_rate_get_out - Response payload for CLOCK_RATE_GET command 131 * @status: SCMI command status 132 * @rate_lsb: 32bit LSB of the clock rate in Hertz 133 * @rate_msb: 32bit MSB of the clock rate in Hertz 134 */ 135 struct scmi_clk_rate_get_out { 136 s32 status; 137 u32 rate_lsb; 138 u32 rate_msb; 139 }; 140 141 /** 142 * struct scmi_clk_state_in - Message payload for CLOCK_RATE_SET command 143 * @flags: Flags for the clock rate set request 144 * @clock_id: SCMI clock ID 145 * @rate_lsb: 32bit LSB of the clock rate in Hertz 146 * @rate_msb: 32bit MSB of the clock rate in Hertz 147 */ 148 struct scmi_clk_rate_set_in { 149 u32 flags; 150 u32 clock_id; 151 u32 rate_lsb; 152 u32 rate_msb; 153 }; 154 155 /** 156 * struct scmi_clk_rate_set_out - Response payload for CLOCK_RATE_SET command 157 * @status: SCMI command status 158 */ 159 struct scmi_clk_rate_set_out { 160 s32 status; 161 }; 162 163 /* 164 * SCMI Reset Domain Protocol 165 */ 166 167 enum scmi_reset_domain_message_id { 168 SCMI_RESET_DOMAIN_ATTRIBUTES = 0x3, 169 SCMI_RESET_DOMAIN_RESET = 0x4, 170 }; 171 172 #define SCMI_RD_NAME_LEN 16 173 174 #define SCMI_RD_ATTRIBUTES_FLAG_ASYNC BIT(31) 175 #define SCMI_RD_ATTRIBUTES_FLAG_NOTIF BIT(30) 176 177 #define SCMI_RD_RESET_FLAG_ASYNC BIT(2) 178 #define SCMI_RD_RESET_FLAG_ASSERT BIT(1) 179 #define SCMI_RD_RESET_FLAG_CYCLE BIT(0) 180 181 /** 182 * struct scmi_rd_attr_in - Payload for RESET_DOMAIN_ATTRIBUTES message 183 * @domain_id: SCMI reset domain ID 184 */ 185 struct scmi_rd_attr_in { 186 u32 domain_id; 187 }; 188 189 /** 190 * struct scmi_rd_attr_out - Payload for RESET_DOMAIN_ATTRIBUTES response 191 * @status: SCMI command status 192 * @attributes: Retrieved attributes of the reset domain 193 * @latency: Reset cycle max lantency 194 * @name: Reset domain name 195 */ 196 struct scmi_rd_attr_out { 197 s32 status; 198 u32 attributes; 199 u32 latency; 200 char name[SCMI_RD_NAME_LEN]; 201 }; 202 203 /** 204 * struct scmi_rd_reset_in - Message payload for RESET command 205 * @domain_id: SCMI reset domain ID 206 * @flags: Flags for the reset request 207 * @reset_state: Reset target state 208 */ 209 struct scmi_rd_reset_in { 210 u32 domain_id; 211 u32 flags; 212 u32 reset_state; 213 }; 214 215 /** 216 * struct scmi_rd_reset_out - Response payload for RESET command 217 * @status: SCMI command status 218 */ 219 struct scmi_rd_reset_out { 220 s32 status; 221 }; 222 223 /* 224 * SCMI Voltage Domain Protocol 225 */ 226 227 enum scmi_voltage_domain_message_id { 228 SCMI_VOLTAGE_DOMAIN_ATTRIBUTES = 0x3, 229 SCMI_VOLTAGE_DOMAIN_CONFIG_SET = 0x5, 230 SCMI_VOLTAGE_DOMAIN_CONFIG_GET = 0x6, 231 SCMI_VOLTAGE_DOMAIN_LEVEL_SET = 0x7, 232 SCMI_VOLTAGE_DOMAIN_LEVEL_GET = 0x8, 233 }; 234 235 #define SCMI_VOLTD_NAME_LEN 16 236 237 #define SCMI_VOLTD_CONFIG_MASK GENMASK(3, 0) 238 #define SCMI_VOLTD_CONFIG_OFF 0 239 #define SCMI_VOLTD_CONFIG_ON 0x7 240 241 /** 242 * struct scmi_voltd_attr_in - Payload for VOLTAGE_DOMAIN_ATTRIBUTES message 243 * @domain_id: SCMI voltage domain ID 244 */ 245 struct scmi_voltd_attr_in { 246 u32 domain_id; 247 }; 248 249 /** 250 * struct scmi_voltd_attr_out - Payload for VOLTAGE_DOMAIN_ATTRIBUTES response 251 * @status: SCMI command status 252 * @attributes: Retrieved attributes of the voltage domain 253 * @name: Voltage domain name 254 */ 255 struct scmi_voltd_attr_out { 256 s32 status; 257 u32 attributes; 258 char name[SCMI_VOLTD_NAME_LEN]; 259 }; 260 261 /** 262 * struct scmi_voltd_config_set_in - Message payload for VOLTAGE_CONFIG_SET cmd 263 * @domain_id: SCMI voltage domain ID 264 * @config: Configuration data of the voltage domain 265 */ 266 struct scmi_voltd_config_set_in { 267 u32 domain_id; 268 u32 config; 269 }; 270 271 /** 272 * struct scmi_voltd_config_set_out - Response for VOLTAGE_CONFIG_SET command 273 * @status: SCMI command status 274 */ 275 struct scmi_voltd_config_set_out { 276 s32 status; 277 }; 278 279 /** 280 * struct scmi_voltd_config_get_in - Message payload for VOLTAGE_CONFIG_GET cmd 281 * @domain_id: SCMI voltage domain ID 282 */ 283 struct scmi_voltd_config_get_in { 284 u32 domain_id; 285 }; 286 287 /** 288 * struct scmi_voltd_config_get_out - Response for VOLTAGE_CONFIG_GET command 289 * @status: SCMI command status 290 * @config: Configuration data of the voltage domain 291 */ 292 struct scmi_voltd_config_get_out { 293 s32 status; 294 u32 config; 295 }; 296 297 /** 298 * struct scmi_voltd_level_set_in - Message payload for VOLTAGE_LEVEL_SET cmd 299 * @domain_id: SCMI voltage domain ID 300 * @flags: Parameter flags for configuring target level 301 * @voltage_level: Target voltage level in microvolts (uV) 302 */ 303 struct scmi_voltd_level_set_in { 304 u32 domain_id; 305 u32 flags; 306 s32 voltage_level; 307 }; 308 309 /** 310 * struct scmi_voltd_level_set_out - Response for VOLTAGE_LEVEL_SET command 311 * @status: SCMI command status 312 */ 313 struct scmi_voltd_level_set_out { 314 s32 status; 315 }; 316 317 /** 318 * struct scmi_voltd_level_get_in - Message payload for VOLTAGE_LEVEL_GET cmd 319 * @domain_id: SCMI voltage domain ID 320 */ 321 struct scmi_voltd_level_get_in { 322 u32 domain_id; 323 }; 324 325 /** 326 * struct scmi_voltd_level_get_out - Response for VOLTAGE_LEVEL_GET command 327 * @status: SCMI command status 328 * @voltage_level: Voltage level in microvolts (uV) 329 */ 330 struct scmi_voltd_level_get_out { 331 s32 status; 332 s32 voltage_level; 333 }; 334 335 #endif /* _SCMI_PROTOCOLS_H */ 336