Merge branch 'next'
[platform/kernel/u-boot.git] / include / scmi_protocols.h
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 */