1 /*
2  * Texas Instruments System Control Interface (TISCI) Protocol
3  *
4  * Communication protocol with TI SCI hardware
5  * The system works in a message response protocol
6  * See: http://processors.wiki.ti.com/index.php/TISCI for details
7  *
8  * Copyright (C) 2018-2022 Texas Instruments Incorporated - https://www.ti.com/
9  *
10  * SPDX-License-Identifier: BSD-3-Clause
11  */
12 
13 #ifndef TI_SCI_PROTOCOL_H
14 #define TI_SCI_PROTOCOL_H
15 
16 #include <stdint.h>
17 
18 /* Generic Messages */
19 #define TI_SCI_MSG_ENABLE_WDT		0x0000
20 #define TI_SCI_MSG_WAKE_RESET		0x0001
21 #define TI_SCI_MSG_VERSION		0x0002
22 #define TI_SCI_MSG_WAKE_REASON		0x0003
23 #define TI_SCI_MSG_GOODBYE		0x0004
24 #define TI_SCI_MSG_SYS_RESET		0x0005
25 
26 /* Device requests */
27 #define TI_SCI_MSG_SET_DEVICE_STATE	0x0200
28 #define TI_SCI_MSG_GET_DEVICE_STATE	0x0201
29 #define TI_SCI_MSG_SET_DEVICE_RESETS	0x0202
30 
31 /* Low Power Mode Requests */
32 #define TI_SCI_MSG_ENTER_SLEEP		0x0301
33 
34 /* Clock requests */
35 #define TI_SCI_MSG_SET_CLOCK_STATE	0x0100
36 #define TI_SCI_MSG_GET_CLOCK_STATE	0x0101
37 #define TI_SCI_MSG_SET_CLOCK_PARENT	0x0102
38 #define TI_SCI_MSG_GET_CLOCK_PARENT	0x0103
39 #define TI_SCI_MSG_GET_NUM_CLOCK_PARENTS 0x0104
40 #define TI_SCI_MSG_SET_CLOCK_FREQ	0x010c
41 #define TI_SCI_MSG_QUERY_CLOCK_FREQ	0x010d
42 #define TI_SCI_MSG_GET_CLOCK_FREQ	0x010e
43 
44 /* Processor Control Messages */
45 #define TISCI_MSG_PROC_REQUEST		0xc000
46 #define TISCI_MSG_PROC_RELEASE		0xc001
47 #define TISCI_MSG_PROC_HANDOVER		0xc005
48 #define TISCI_MSG_SET_PROC_BOOT_CONFIG	0xc100
49 #define TISCI_MSG_SET_PROC_BOOT_CTRL	0xc101
50 #define TISCI_MSG_PROC_AUTH_BOOT_IMIAGE	0xc120
51 #define TISCI_MSG_GET_PROC_BOOT_STATUS	0xc400
52 #define TISCI_MSG_WAIT_PROC_BOOT_STATUS	0xc401
53 
54 /**
55  * struct ti_sci_msg_hdr - Generic Message Header for All messages and responses
56  * @type:	Type of messages: One of TI_SCI_MSG* values
57  * @host:	Host of the message
58  * @seq:	Message identifier indicating a transfer sequence
59  * @flags:	Flag for the message
60  */
61 struct ti_sci_msg_hdr {
62 	uint16_t type;
63 	uint8_t host;
64 	uint8_t seq;
65 #define TI_SCI_MSG_FLAG(val)			(1 << (val))
66 #define TI_SCI_FLAG_REQ_GENERIC_NORESPONSE	0x0
67 #define TI_SCI_FLAG_REQ_ACK_ON_RECEIVED		TI_SCI_MSG_FLAG(0)
68 #define TI_SCI_FLAG_REQ_ACK_ON_PROCESSED	TI_SCI_MSG_FLAG(1)
69 #define TI_SCI_FLAG_RESP_GENERIC_NACK		0x0
70 #define TI_SCI_FLAG_RESP_GENERIC_ACK		TI_SCI_MSG_FLAG(1)
71 	/* Additional Flags */
72 	uint32_t flags;
73 } __packed;
74 
75 /**
76  * struct ti_sci_msg_resp_version - Response for a message
77  * @hdr:		Generic header
78  * @firmware_description: String describing the firmware
79  * @firmware_revision:	Firmware revision
80  * @abi_major:		Major version of the ABI that firmware supports
81  * @abi_minor:		Minor version of the ABI that firmware supports
82  *
83  * In general, ABI version changes follow the rule that minor version increments
84  * are backward compatible. Major revision changes in ABI may not be
85  * backward compatible.
86  *
87  * Response to a generic message with message type TI_SCI_MSG_VERSION
88  */
89 struct ti_sci_msg_resp_version {
90 	struct ti_sci_msg_hdr hdr;
91 #define FIRMWARE_DESCRIPTION_LENGTH 32
92 	char firmware_description[FIRMWARE_DESCRIPTION_LENGTH];
93 	uint16_t firmware_revision;
94 	uint8_t abi_major;
95 	uint8_t abi_minor;
96 } __packed;
97 
98 /**
99  * struct ti_sci_msg_req_reboot - Reboot the SoC
100  * @hdr:	Generic Header
101  * @domain:	Domain to be reset, 0 for full SoC reboot
102  *
103  * Request type is TI_SCI_MSG_SYS_RESET, responded with a generic
104  * ACK/NACK message.
105  */
106 struct ti_sci_msg_req_reboot {
107 	struct ti_sci_msg_hdr hdr;
108 #define TI_SCI_DOMAIN_FULL_SOC_RESET	0x0
109 	uint8_t domain;
110 } __packed;
111 
112 /**
113  * struct ti_sci_msg_req_set_device_state - Set the desired state of the device
114  * @hdr:		Generic header
115  * @id:	Indicates which device to modify
116  * @reserved: Reserved space in message, must be 0 for backward compatibility
117  * @state: The desired state of the device.
118  *
119  * Certain flags can also be set to alter the device state:
120  * + MSG_FLAG_DEVICE_WAKE_ENABLED - Configure the device to be a wake source.
121  * The meaning of this flag will vary slightly from device to device and from
122  * SoC to SoC but it generally allows the device to wake the SoC out of deep
123  * suspend states.
124  * + MSG_FLAG_DEVICE_RESET_ISO - Enable reset isolation for this device.
125  * + MSG_FLAG_DEVICE_EXCLUSIVE - Claim this device exclusively. When passed
126  * with STATE_RETENTION or STATE_ON, it will claim the device exclusively.
127  * If another host already has this device set to STATE_RETENTION or STATE_ON,
128  * the message will fail. Once successful, other hosts attempting to set
129  * STATE_RETENTION or STATE_ON will fail.
130  *
131  * Request type is TI_SCI_MSG_SET_DEVICE_STATE, responded with a generic
132  * ACK/NACK message.
133  */
134 struct ti_sci_msg_req_set_device_state {
135 	/* Additional hdr->flags options */
136 #define MSG_FLAG_DEVICE_WAKE_ENABLED	TI_SCI_MSG_FLAG(8)
137 #define MSG_FLAG_DEVICE_RESET_ISO	TI_SCI_MSG_FLAG(9)
138 #define MSG_FLAG_DEVICE_EXCLUSIVE	TI_SCI_MSG_FLAG(10)
139 	struct ti_sci_msg_hdr hdr;
140 	uint32_t id;
141 	uint32_t reserved;
142 
143 #define MSG_DEVICE_SW_STATE_AUTO_OFF	0
144 #define MSG_DEVICE_SW_STATE_RETENTION	1
145 #define MSG_DEVICE_SW_STATE_ON		2
146 	uint8_t state;
147 } __packed;
148 
149 /**
150  * struct ti_sci_msg_req_get_device_state - Request to get device.
151  * @hdr:		Generic header
152  * @id:		Device Identifier
153  *
154  * Request type is TI_SCI_MSG_GET_DEVICE_STATE, responded device state
155  * information
156  */
157 struct ti_sci_msg_req_get_device_state {
158 	struct ti_sci_msg_hdr hdr;
159 	uint32_t id;
160 } __packed;
161 
162 /**
163  * struct ti_sci_msg_resp_get_device_state - Response to get device request.
164  * @hdr:		Generic header
165  * @context_loss_count: Indicates how many times the device has lost context. A
166  *	driver can use this monotonic counter to determine if the device has
167  *	lost context since the last time this message was exchanged.
168  * @resets: Programmed state of the reset lines.
169  * @programmed_state:	The state as programmed by set_device.
170  *			- Uses the MSG_DEVICE_SW_* macros
171  * @current_state:	The actual state of the hardware.
172  *
173  * Response to request TI_SCI_MSG_GET_DEVICE_STATE.
174  */
175 struct ti_sci_msg_resp_get_device_state {
176 	struct ti_sci_msg_hdr hdr;
177 	uint32_t context_loss_count;
178 	uint32_t resets;
179 	uint8_t programmed_state;
180 #define MSG_DEVICE_HW_STATE_OFF		0
181 #define MSG_DEVICE_HW_STATE_ON		1
182 #define MSG_DEVICE_HW_STATE_TRANS	2
183 	uint8_t current_state;
184 } __packed;
185 
186 /**
187  * struct ti_sci_msg_req_set_device_resets - Set the desired resets
188  *				configuration of the device
189  * @hdr:		Generic header
190  * @id:	Indicates which device to modify
191  * @resets: A bit field of resets for the device. The meaning, behavior,
192  *	and usage of the reset flags are device specific. 0 for a bit
193  *	indicates releasing the reset represented by that bit while 1
194  *	indicates keeping it held.
195  *
196  * Request type is TI_SCI_MSG_SET_DEVICE_RESETS, responded with a generic
197  * ACK/NACK message.
198  */
199 struct ti_sci_msg_req_set_device_resets {
200 	struct ti_sci_msg_hdr hdr;
201 	uint32_t id;
202 	uint32_t resets;
203 } __packed;
204 
205 /**
206  * struct ti_sci_msg_req_set_clock_state - Request to setup a Clock state
207  * @hdr:	Generic Header, Certain flags can be set specific to the clocks:
208  *		MSG_FLAG_CLOCK_ALLOW_SSC: Allow this clock to be modified
209  *		via spread spectrum clocking.
210  *		MSG_FLAG_CLOCK_ALLOW_FREQ_CHANGE: Allow this clock's
211  *		frequency to be changed while it is running so long as it
212  *		is within the min/max limits.
213  *		MSG_FLAG_CLOCK_INPUT_TERM: Enable input termination, this
214  *		is only applicable to clock inputs on the SoC pseudo-device.
215  * @dev_id:	Device identifier this request is for
216  * @clk_id:	Clock identifier for the device for this request.
217  *		Each device has it's own set of clock inputs. This indexes
218  *		which clock input to modify.
219  * @request_state: Request the state for the clock to be set to.
220  *		MSG_CLOCK_SW_STATE_UNREQ: The IP does not require this clock,
221  *		it can be disabled, regardless of the state of the device
222  *		MSG_CLOCK_SW_STATE_AUTO: Allow the System Controller to
223  *		automatically manage the state of this clock. If the device
224  *		is enabled, then the clock is enabled. If the device is set
225  *		to off or retention, then the clock is internally set as not
226  *		being required by the device.(default)
227  *		MSG_CLOCK_SW_STATE_REQ:  Configure the clock to be enabled,
228  *		regardless of the state of the device.
229  *
230  * Normally, all required clocks are managed by TISCI entity, this is used
231  * only for specific control *IF* required. Auto managed state is
232  * MSG_CLOCK_SW_STATE_AUTO, in other states, TISCI entity assume remote
233  * will explicitly control.
234  *
235  * Request type is TI_SCI_MSG_SET_CLOCK_STATE, response is a generic
236  * ACK or NACK message.
237  */
238 struct ti_sci_msg_req_set_clock_state {
239 	/* Additional hdr->flags options */
240 #define MSG_FLAG_CLOCK_ALLOW_SSC		TI_SCI_MSG_FLAG(8)
241 #define MSG_FLAG_CLOCK_ALLOW_FREQ_CHANGE	TI_SCI_MSG_FLAG(9)
242 #define MSG_FLAG_CLOCK_INPUT_TERM		TI_SCI_MSG_FLAG(10)
243 	struct ti_sci_msg_hdr hdr;
244 	uint32_t dev_id;
245 	uint8_t clk_id;
246 #define MSG_CLOCK_SW_STATE_UNREQ	0
247 #define MSG_CLOCK_SW_STATE_AUTO		1
248 #define MSG_CLOCK_SW_STATE_REQ		2
249 	uint8_t request_state;
250 } __packed;
251 
252 /**
253  * struct ti_sci_msg_req_get_clock_state - Request for clock state
254  * @hdr:	Generic Header
255  * @dev_id:	Device identifier this request is for
256  * @clk_id:	Clock identifier for the device for this request.
257  *		Each device has it's own set of clock inputs. This indexes
258  *		which clock input to get state of.
259  *
260  * Request type is TI_SCI_MSG_GET_CLOCK_STATE, response is state
261  * of the clock
262  */
263 struct ti_sci_msg_req_get_clock_state {
264 	struct ti_sci_msg_hdr hdr;
265 	uint32_t dev_id;
266 	uint8_t clk_id;
267 } __packed;
268 
269 /**
270  * struct ti_sci_msg_resp_get_clock_state - Response to get clock state
271  * @hdr:	Generic Header
272  * @programmed_state: Any programmed state of the clock. This is one of
273  *		MSG_CLOCK_SW_STATE* values.
274  * @current_state: Current state of the clock. This is one of:
275  *		MSG_CLOCK_HW_STATE_NOT_READY: Clock is not ready
276  *		MSG_CLOCK_HW_STATE_READY: Clock is ready
277  *
278  * Response to TI_SCI_MSG_GET_CLOCK_STATE.
279  */
280 struct ti_sci_msg_resp_get_clock_state {
281 	struct ti_sci_msg_hdr hdr;
282 	uint8_t programmed_state;
283 #define MSG_CLOCK_HW_STATE_NOT_READY	0
284 #define MSG_CLOCK_HW_STATE_READY	1
285 	uint8_t current_state;
286 } __packed;
287 
288 /**
289  * struct ti_sci_msg_req_set_clock_parent - Set the clock parent
290  * @hdr:	Generic Header
291  * @dev_id:	Device identifier this request is for
292  * @clk_id:	Clock identifier for the device for this request.
293  *		Each device has it's own set of clock inputs. This indexes
294  *		which clock input to modify.
295  * @parent_id:	The new clock parent is selectable by an index via this
296  *		parameter.
297  *
298  * Request type is TI_SCI_MSG_SET_CLOCK_PARENT, response is generic
299  * ACK / NACK message.
300  */
301 struct ti_sci_msg_req_set_clock_parent {
302 	struct ti_sci_msg_hdr hdr;
303 	uint32_t dev_id;
304 	uint8_t clk_id;
305 	uint8_t parent_id;
306 } __packed;
307 
308 /**
309  * struct ti_sci_msg_req_get_clock_parent - Get the clock parent
310  * @hdr:	Generic Header
311  * @dev_id:	Device identifier this request is for
312  * @clk_id:	Clock identifier for the device for this request.
313  *		Each device has it's own set of clock inputs. This indexes
314  *		which clock input to get the parent for.
315  *
316  * Request type is TI_SCI_MSG_GET_CLOCK_PARENT, response is parent information
317  */
318 struct ti_sci_msg_req_get_clock_parent {
319 	struct ti_sci_msg_hdr hdr;
320 	uint32_t dev_id;
321 	uint8_t clk_id;
322 } __packed;
323 
324 /**
325  * struct ti_sci_msg_resp_get_clock_parent - Response with clock parent
326  * @hdr:	Generic Header
327  * @parent_id:	The current clock parent
328  *
329  * Response to TI_SCI_MSG_GET_CLOCK_PARENT.
330  */
331 struct ti_sci_msg_resp_get_clock_parent {
332 	struct ti_sci_msg_hdr hdr;
333 	uint8_t parent_id;
334 } __packed;
335 
336 /**
337  * struct ti_sci_msg_req_get_clock_num_parents - Request to get clock parents
338  * @hdr:	Generic header
339  * @dev_id:	Device identifier this request is for
340  * @clk_id:	Clock identifier for the device for this request.
341  *
342  * This request provides information about how many clock parent options
343  * are available for a given clock to a device. This is typically used
344  * for input clocks.
345  *
346  * Request type is TI_SCI_MSG_GET_NUM_CLOCK_PARENTS, response is appropriate
347  * message, or NACK in case of inability to satisfy request.
348  */
349 struct ti_sci_msg_req_get_clock_num_parents {
350 	struct ti_sci_msg_hdr hdr;
351 	uint32_t dev_id;
352 	uint8_t clk_id;
353 } __packed;
354 
355 /**
356  * struct ti_sci_msg_resp_get_clock_num_parents - Response for get clk parents
357  * @hdr:		Generic header
358  * @num_parents:	Number of clock parents
359  *
360  * Response to TI_SCI_MSG_GET_NUM_CLOCK_PARENTS
361  */
362 struct ti_sci_msg_resp_get_clock_num_parents {
363 	struct ti_sci_msg_hdr hdr;
364 	uint8_t num_parents;
365 } __packed;
366 
367 /**
368  * struct ti_sci_msg_req_query_clock_freq - Request to query a frequency
369  * @hdr:	Generic Header
370  * @dev_id:	Device identifier this request is for
371  * @min_freq_hz: The minimum allowable frequency in Hz. This is the minimum
372  *		allowable programmed frequency and does not account for clock
373  *		tolerances and jitter.
374  * @target_freq_hz: The target clock frequency. A frequency will be found
375  *		as close to this target frequency as possible.
376  * @max_freq_hz: The maximum allowable frequency in Hz. This is the maximum
377  *		allowable programmed frequency and does not account for clock
378  *		tolerances and jitter.
379  * @clk_id:	Clock identifier for the device for this request.
380  *
381  * NOTE: Normally clock frequency management is automatically done by TISCI
382  * entity. In case of specific requests, TISCI evaluates capability to achieve
383  * requested frequency within provided range and responds with
384  * result message.
385  *
386  * Request type is TI_SCI_MSG_QUERY_CLOCK_FREQ, response is appropriate message,
387  * or NACK in case of inability to satisfy request.
388  */
389 struct ti_sci_msg_req_query_clock_freq {
390 	struct ti_sci_msg_hdr hdr;
391 	uint32_t dev_id;
392 	uint64_t min_freq_hz;
393 	uint64_t target_freq_hz;
394 	uint64_t max_freq_hz;
395 	uint8_t clk_id;
396 } __packed;
397 
398 /**
399  * struct ti_sci_msg_resp_query_clock_freq - Response to a clock frequency query
400  * @hdr:	Generic Header
401  * @freq_hz:	Frequency that is the best match in Hz.
402  *
403  * Response to request type TI_SCI_MSG_QUERY_CLOCK_FREQ. NOTE: if the request
404  * cannot be satisfied, the message will be of type NACK.
405  */
406 struct ti_sci_msg_resp_query_clock_freq {
407 	struct ti_sci_msg_hdr hdr;
408 	uint64_t freq_hz;
409 } __packed;
410 
411 /**
412  * struct ti_sci_msg_req_set_clock_freq - Request to setup a clock frequency
413  * @hdr:	Generic Header
414  * @dev_id:	Device identifier this request is for
415  * @min_freq_hz: The minimum allowable frequency in Hz. This is the minimum
416  *		allowable programmed frequency and does not account for clock
417  *		tolerances and jitter.
418  * @target_freq_hz: The target clock frequency. The clock will be programmed
419  *		at a rate as close to this target frequency as possible.
420  * @max_freq_hz: The maximum allowable frequency in Hz. This is the maximum
421  *		allowable programmed frequency and does not account for clock
422  *		tolerances and jitter.
423  * @clk_id:	Clock identifier for the device for this request.
424  *
425  * NOTE: Normally clock frequency management is automatically done by TISCI
426  * entity. In case of specific requests, TISCI evaluates capability to achieve
427  * requested range and responds with success/failure message.
428  *
429  * This sets the desired frequency for a clock within an allowable
430  * range. This message will fail on an enabled clock unless
431  * MSG_FLAG_CLOCK_ALLOW_FREQ_CHANGE is set for the clock. Additionally,
432  * if other clocks have their frequency modified due to this message,
433  * they also must have the MSG_FLAG_CLOCK_ALLOW_FREQ_CHANGE or be disabled.
434  *
435  * Calling set frequency on a clock input to the SoC pseudo-device will
436  * inform the PMMC of that clock's frequency. Setting a frequency of
437  * zero will indicate the clock is disabled.
438  *
439  * Calling set frequency on clock outputs from the SoC pseudo-device will
440  * function similarly to setting the clock frequency on a device.
441  *
442  * Request type is TI_SCI_MSG_SET_CLOCK_FREQ, response is a generic ACK/NACK
443  * message.
444  */
445 struct ti_sci_msg_req_set_clock_freq {
446 	struct ti_sci_msg_hdr hdr;
447 	uint32_t dev_id;
448 	uint64_t min_freq_hz;
449 	uint64_t target_freq_hz;
450 	uint64_t max_freq_hz;
451 	uint8_t clk_id;
452 } __packed;
453 
454 /**
455  * struct ti_sci_msg_req_get_clock_freq - Request to get the clock frequency
456  * @hdr:	Generic Header
457  * @dev_id:	Device identifier this request is for
458  * @clk_id:	Clock identifier for the device for this request.
459  *
460  * NOTE: Normally clock frequency management is automatically done by TISCI
461  * entity. In some cases, clock frequencies are configured by host.
462  *
463  * Request type is TI_SCI_MSG_GET_CLOCK_FREQ, responded with clock frequency
464  * that the clock is currently at.
465  */
466 struct ti_sci_msg_req_get_clock_freq {
467 	struct ti_sci_msg_hdr hdr;
468 	uint32_t dev_id;
469 	uint8_t clk_id;
470 } __packed;
471 
472 /**
473  * struct ti_sci_msg_resp_get_clock_freq - Response of clock frequency request
474  * @hdr:	Generic Header
475  * @freq_hz:	Frequency that the clock is currently on, in Hz.
476  *
477  * Response to request type TI_SCI_MSG_GET_CLOCK_FREQ.
478  */
479 struct ti_sci_msg_resp_get_clock_freq {
480 	struct ti_sci_msg_hdr hdr;
481 	uint64_t freq_hz;
482 } __packed;
483 
484 #define TISCI_ADDR_LOW_MASK		0x00000000ffffffff
485 #define TISCI_ADDR_HIGH_MASK		0xffffffff00000000
486 #define TISCI_ADDR_HIGH_SHIFT		32
487 
488 /**
489  * struct ti_sci_msg_req_proc_request - Request a processor
490  *
491  * @hdr:		Generic Header
492  * @processor_id:	ID of processor
493  *
494  * Request type is TISCI_MSG_PROC_REQUEST, response is a generic ACK/NACK
495  * message.
496  */
497 struct ti_sci_msg_req_proc_request {
498 	struct ti_sci_msg_hdr hdr;
499 	uint8_t processor_id;
500 } __packed;
501 
502 /**
503  * struct ti_sci_msg_req_proc_release - Release a processor
504  *
505  * @hdr:		Generic Header
506  * @processor_id:	ID of processor
507  *
508  * Request type is TISCI_MSG_PROC_RELEASE, response is a generic ACK/NACK
509  * message.
510  */
511 struct ti_sci_msg_req_proc_release {
512 	struct ti_sci_msg_hdr hdr;
513 	uint8_t processor_id;
514 } __packed;
515 
516 /**
517  * struct ti_sci_msg_req_proc_handover - Handover a processor to a host
518  *
519  * @hdr:		Generic Header
520  * @processor_id:	ID of processor
521  * @host_id:		New Host we want to give control to
522  *
523  * Request type is TISCI_MSG_PROC_HANDOVER, response is a generic ACK/NACK
524  * message.
525  */
526 struct ti_sci_msg_req_proc_handover {
527 	struct ti_sci_msg_hdr hdr;
528 	uint8_t processor_id;
529 	uint8_t host_id;
530 } __packed;
531 
532 /* A53 Config Flags */
533 #define PROC_BOOT_CFG_FLAG_ARMV8_DBG_EN         0x00000001
534 #define PROC_BOOT_CFG_FLAG_ARMV8_DBG_NIDEN      0x00000002
535 #define PROC_BOOT_CFG_FLAG_ARMV8_DBG_SPIDEN     0x00000004
536 #define PROC_BOOT_CFG_FLAG_ARMV8_DBG_SPNIDEN    0x00000008
537 #define PROC_BOOT_CFG_FLAG_ARMV8_AARCH32        0x00000100
538 
539 /* R5 Config Flags */
540 #define PROC_BOOT_CFG_FLAG_R5_DBG_EN            0x00000001
541 #define PROC_BOOT_CFG_FLAG_R5_DBG_NIDEN         0x00000002
542 #define PROC_BOOT_CFG_FLAG_R5_LOCKSTEP          0x00000100
543 #define PROC_BOOT_CFG_FLAG_R5_TEINIT            0x00000200
544 #define PROC_BOOT_CFG_FLAG_R5_NMFI_EN           0x00000400
545 #define PROC_BOOT_CFG_FLAG_R5_TCM_RSTBASE       0x00000800
546 #define PROC_BOOT_CFG_FLAG_R5_BTCM_EN           0x00001000
547 #define PROC_BOOT_CFG_FLAG_R5_ATCM_EN           0x00002000
548 
549 /**
550  * struct ti_sci_msg_req_set_proc_boot_config - Set Processor boot configuration
551  * @hdr:		Generic Header
552  * @processor_id:	ID of processor
553  * @bootvector_low:	Lower 32bit (Little Endian) of boot vector
554  * @bootvector_high:	Higher 32bit (Little Endian) of boot vector
555  * @config_flags_set:	Optional Processor specific Config Flags to set.
556  *			Setting a bit here implies required bit sets to 1.
557  * @config_flags_clear:	Optional Processor specific Config Flags to clear.
558  *			Setting a bit here implies required bit gets cleared.
559  *
560  * Request type is TISCI_MSG_SET_PROC_BOOT_CONFIG, response is a generic
561  * ACK/NACK message.
562  */
563 struct ti_sci_msg_req_set_proc_boot_config {
564 	struct ti_sci_msg_hdr hdr;
565 	uint8_t processor_id;
566 	uint32_t bootvector_low;
567 	uint32_t bootvector_high;
568 	uint32_t config_flags_set;
569 	uint32_t config_flags_clear;
570 } __packed;
571 
572 /* ARMV8 Control Flags */
573 #define PROC_BOOT_CTRL_FLAG_ARMV8_ACINACTM      0x00000001
574 #define PROC_BOOT_CTRL_FLAG_ARMV8_AINACTS       0x00000002
575 #define PROC_BOOT_CTRL_FLAG_ARMV8_L2FLUSHREQ    0x00000100
576 
577 /* R5 Control Flags */
578 #define PROC_BOOT_CTRL_FLAG_R5_CORE_HALT        0x00000001
579 
580 /**
581  * struct ti_sci_msg_req_set_proc_boot_ctrl - Set Processor boot control flags
582  * @hdr:		Generic Header
583  * @processor_id:	ID of processor
584  * @config_flags_set:	Optional Processor specific Config Flags to set.
585  *			Setting a bit here implies required bit sets to 1.
586  * @config_flags_clear:	Optional Processor specific Config Flags to clear.
587  *			Setting a bit here implies required bit gets cleared.
588  *
589  * Request type is TISCI_MSG_SET_PROC_BOOT_CTRL, response is a generic ACK/NACK
590  * message.
591  */
592 struct ti_sci_msg_req_set_proc_boot_ctrl {
593 	struct ti_sci_msg_hdr hdr;
594 	uint8_t processor_id;
595 	uint32_t control_flags_set;
596 	uint32_t control_flags_clear;
597 } __packed;
598 
599 /**
600  * struct ti_sci_msg_req_proc_auth_start_image - Authenticate and start image
601  * @hdr:		Generic Header
602  * @processor_id:	ID of processor
603  * @cert_addr_low:	Lower 32bit (Little Endian) of certificate
604  * @cert_addr_high:	Higher 32bit (Little Endian) of certificate
605  *
606  * Request type is TISCI_MSG_PROC_AUTH_BOOT_IMAGE, response is a generic
607  * ACK/NACK message.
608  */
609 struct ti_sci_msg_req_proc_auth_boot_image {
610 	struct ti_sci_msg_hdr hdr;
611 	uint8_t processor_id;
612 	uint32_t cert_addr_low;
613 	uint32_t cert_addr_high;
614 } __packed;
615 
616 /**
617  * struct ti_sci_msg_req_get_proc_boot_status - Get processor boot status
618  * @hdr:		Generic Header
619  * @processor_id:	ID of processor
620  *
621  * Request type is TISCI_MSG_GET_PROC_BOOT_STATUS, response is appropriate
622  * message, or NACK in case of inability to satisfy request.
623  */
624 struct ti_sci_msg_req_get_proc_boot_status {
625 	struct ti_sci_msg_hdr hdr;
626 	uint8_t processor_id;
627 } __packed;
628 
629 /* ARMv8 Status Flags */
630 #define PROC_BOOT_STATUS_FLAG_ARMV8_WFE			0x00000001
631 #define PROC_BOOT_STATUS_FLAG_ARMV8_WFI			0x00000002
632 #define PROC_BOOT_STATUS_FLAG_ARMV8_L2F_DONE		0x00000010
633 #define PROC_BOOT_STATUS_FLAG_ARMV8_STANDBYWFIL2	0x00000020
634 
635 /* R5 Status Flags */
636 #define PROC_BOOT_STATUS_FLAG_R5_WFE			0x00000001
637 #define PROC_BOOT_STATUS_FLAG_R5_WFI			0x00000002
638 #define PROC_BOOT_STATUS_FLAG_R5_CLK_GATED		0x00000004
639 #define PROC_BOOT_STATUS_FLAG_R5_LOCKSTEP_PERMITTED	0x00000100
640 
641 /**
642  * \brief Processor Status Response
643  * struct ti_sci_msg_resp_get_proc_boot_status - Processor boot status response
644  * @hdr:		Generic Header
645  * @processor_id:	ID of processor
646  * @bootvector_low:	Lower 32bit (Little Endian) of boot vector
647  * @bootvector_high:	Higher 32bit (Little Endian) of boot vector
648  * @config_flags:	Optional Processor specific Config Flags set.
649  * @control_flags:	Optional Processor specific Control Flags.
650  * @status_flags:	Optional Processor specific Status Flags set.
651  *
652  * Response to TISCI_MSG_GET_PROC_BOOT_STATUS.
653  */
654 struct ti_sci_msg_resp_get_proc_boot_status {
655 	struct ti_sci_msg_hdr hdr;
656 	uint8_t processor_id;
657 	uint32_t bootvector_low;
658 	uint32_t bootvector_high;
659 	uint32_t config_flags;
660 	uint32_t control_flags;
661 	uint32_t status_flags;
662 } __packed;
663 
664 /**
665  * struct ti_sci_msg_req_wait_proc_boot_status - Wait for a processor boot status
666  * @hdr:			Generic Header
667  * @processor_id:		ID of processor
668  * @num_wait_iterations		Total number of iterations we will check before
669  *				we will timeout and give up
670  * @num_match_iterations	How many iterations should we have continued
671  *				status to account for status bits glitching.
672  *				This is to make sure that match occurs for
673  *				consecutive checks. This implies that the
674  *				worst case should consider that the stable
675  *				time should at the worst be num_wait_iterations
676  *				num_match_iterations to prevent timeout.
677  * @delay_per_iteration_us	Specifies how long to wait (in micro seconds)
678  *				between each status checks. This is the minimum
679  *				duration, and overhead of register reads and
680  *				checks are on top of this and can vary based on
681  *				varied conditions.
682  * @delay_before_iterations_us	Specifies how long to wait (in micro seconds)
683  *				before the very first check in the first
684  *				iteration of status check loop. This is the
685  *				minimum duration, and overhead of register
686  *				reads and checks are.
687  * @status_flags_1_set_all_wait	If non-zero, Specifies that all bits of the
688  *				status matching this field requested MUST be 1.
689  * @status_flags_1_set_any_wait	If non-zero, Specifies that at least one of the
690  *				bits matching this field requested MUST be 1.
691  * @status_flags_1_clr_all_wait	If non-zero, Specifies that all bits of the
692  *				status matching this field requested MUST be 0.
693  * @status_flags_1_clr_any_wait	If non-zero, Specifies that at least one of the
694  *				bits matching this field requested MUST be 0.
695  *
696  * Request type is TISCI_MSG_WAIT_PROC_BOOT_STATUS, response is appropriate
697  * message, or NACK in case of inability to satisfy request.
698  */
699 struct ti_sci_msg_req_wait_proc_boot_status {
700 	struct ti_sci_msg_hdr hdr;
701 	uint8_t processor_id;
702 	uint8_t num_wait_iterations;
703 	uint8_t num_match_iterations;
704 	uint8_t delay_per_iteration_us;
705 	uint8_t delay_before_iterations_us;
706 	uint32_t status_flags_1_set_all_wait;
707 	uint32_t status_flags_1_set_any_wait;
708 	uint32_t status_flags_1_clr_all_wait;
709 	uint32_t status_flags_1_clr_any_wait;
710 } __packed;
711 
712 /**
713  * struct ti_sci_msg_req_enter_sleep - Request for TI_SCI_MSG_ENTER_SLEEP.
714  *
715  * @hdr		    Generic Header
716  * @mode	    Low power mode to enter.
717  * @proc_id	    Processor id to be restored.
718  * @core_resume_lo  Low 32-bits of physical pointer to address for core
719  *		    to begin execution upon resume.
720  * @core_resume_hi  High 32-bits of physical pointer to address for core
721  *		    to begin execution upon resume.
722  *
723  * This message is to be sent after TI_SCI_MSG_PREPARE_SLEEP is sent from OS
724  * and is what actually triggers entry into the specified low power mode.
725  */
726 struct ti_sci_msg_req_enter_sleep {
727 	struct ti_sci_msg_hdr hdr;
728 	uint8_t mode;
729 	uint8_t processor_id;
730 	uint32_t core_resume_lo;
731 	uint32_t core_resume_hi;
732 } __packed;
733 
734 #endif /* TI_SCI_PROTOCOL_H */
735