1
2
3
4
5
6
7
8
9#ifndef __TISCI_PROTOCOL_H
10#define __TISCI_PROTOCOL_H
11
12
13
14
15
16
17
18
19
20
21struct ti_sci_version_info {
22 u8 abi_major;
23 u8 abi_minor;
24 u16 firmware_revision;
25 char firmware_description[32];
26};
27
28struct ti_sci_handle;
29
30
31
32
33
34
35
36struct ti_sci_core_ops {
37 int (*reboot_device)(const struct ti_sci_handle *handle);
38};
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98struct ti_sci_dev_ops {
99 int (*get_device)(const struct ti_sci_handle *handle, u32 id);
100 int (*idle_device)(const struct ti_sci_handle *handle, u32 id);
101 int (*put_device)(const struct ti_sci_handle *handle, u32 id);
102 int (*is_valid)(const struct ti_sci_handle *handle, u32 id);
103 int (*get_context_loss_count)(const struct ti_sci_handle *handle,
104 u32 id, u32 *count);
105 int (*is_idle)(const struct ti_sci_handle *handle, u32 id,
106 bool *requested_state);
107 int (*is_stop)(const struct ti_sci_handle *handle, u32 id,
108 bool *req_state, bool *current_state);
109 int (*is_on)(const struct ti_sci_handle *handle, u32 id,
110 bool *req_state, bool *current_state);
111 int (*is_transitioning)(const struct ti_sci_handle *handle, u32 id,
112 bool *current_state);
113 int (*set_device_resets)(const struct ti_sci_handle *handle, u32 id,
114 u32 reset_state);
115 int (*get_device_resets)(const struct ti_sci_handle *handle, u32 id,
116 u32 *reset_state);
117};
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168struct ti_sci_clk_ops {
169 int (*get_clock)(const struct ti_sci_handle *handle, u32 did, u32 cid,
170 bool needs_ssc, bool can_change_freq,
171 bool enable_input_term);
172 int (*idle_clock)(const struct ti_sci_handle *handle, u32 did, u32 cid);
173 int (*put_clock)(const struct ti_sci_handle *handle, u32 did, u32 cid);
174 int (*is_auto)(const struct ti_sci_handle *handle, u32 did, u32 cid,
175 bool *req_state);
176 int (*is_on)(const struct ti_sci_handle *handle, u32 did, u32 cid,
177 bool *req_state, bool *current_state);
178 int (*is_off)(const struct ti_sci_handle *handle, u32 did, u32 cid,
179 bool *req_state, bool *current_state);
180 int (*set_parent)(const struct ti_sci_handle *handle, u32 did, u32 cid,
181 u32 parent_id);
182 int (*get_parent)(const struct ti_sci_handle *handle, u32 did, u32 cid,
183 u32 *parent_id);
184 int (*get_num_parents)(const struct ti_sci_handle *handle, u32 did,
185 u32 cid, u32 *num_parents);
186 int (*get_best_match_freq)(const struct ti_sci_handle *handle, u32 did,
187 u32 cid, u64 min_freq, u64 target_freq,
188 u64 max_freq, u64 *match_freq);
189 int (*set_freq)(const struct ti_sci_handle *handle, u32 did, u32 cid,
190 u64 min_freq, u64 target_freq, u64 max_freq);
191 int (*get_freq)(const struct ti_sci_handle *handle, u32 did, u32 cid,
192 u64 *current_freq);
193};
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212struct ti_sci_rm_core_ops {
213 int (*get_range)(const struct ti_sci_handle *handle, u32 dev_id,
214 u8 subtype, u16 *range_start, u16 *range_num);
215 int (*get_range_from_shost)(const struct ti_sci_handle *handle,
216 u32 dev_id, u8 subtype, u8 s_host,
217 u16 *range_start, u16 *range_num);
218};
219
220
221
222
223
224
225
226
227
228
229
230
231struct ti_sci_rm_irq_ops {
232 int (*set_irq)(const struct ti_sci_handle *handle, u16 src_id,
233 u16 src_index, u16 dst_id, u16 dst_host_irq);
234 int (*set_event_map)(const struct ti_sci_handle *handle, u16 src_id,
235 u16 src_index, u16 ia_id, u16 vint,
236 u16 global_event, u8 vint_status_bit);
237 int (*free_irq)(const struct ti_sci_handle *handle, u16 src_id,
238 u16 src_index, u16 dst_id, u16 dst_host_irq);
239 int (*free_event_map)(const struct ti_sci_handle *handle, u16 src_id,
240 u16 src_index, u16 ia_id, u16 vint,
241 u16 global_event, u8 vint_status_bit);
242};
243
244
245#define TI_SCI_MSG_VALUE_RM_RING_ADDR_LO_VALID BIT(0)
246
247#define TI_SCI_MSG_VALUE_RM_RING_ADDR_HI_VALID BIT(1)
248
249#define TI_SCI_MSG_VALUE_RM_RING_COUNT_VALID BIT(2)
250
251#define TI_SCI_MSG_VALUE_RM_RING_MODE_VALID BIT(3)
252
253#define TI_SCI_MSG_VALUE_RM_RING_SIZE_VALID BIT(4)
254
255#define TI_SCI_MSG_VALUE_RM_RING_ORDER_ID_VALID BIT(5)
256
257#define TI_SCI_MSG_VALUE_RM_ALL_NO_ORDER \
258 (TI_SCI_MSG_VALUE_RM_RING_ADDR_LO_VALID | \
259 TI_SCI_MSG_VALUE_RM_RING_ADDR_HI_VALID | \
260 TI_SCI_MSG_VALUE_RM_RING_COUNT_VALID | \
261 TI_SCI_MSG_VALUE_RM_RING_MODE_VALID | \
262 TI_SCI_MSG_VALUE_RM_RING_SIZE_VALID)
263
264
265
266
267
268
269
270struct ti_sci_rm_ringacc_ops {
271 int (*config)(const struct ti_sci_handle *handle,
272 u32 valid_params, u16 nav_id, u16 index,
273 u32 addr_lo, u32 addr_hi, u32 count, u8 mode,
274 u8 size, u8 order_id
275 );
276 int (*get_config)(const struct ti_sci_handle *handle,
277 u32 nav_id, u32 index, u8 *mode,
278 u32 *addr_lo, u32 *addr_hi, u32 *count,
279 u8 *size, u8 *order_id);
280};
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295struct ti_sci_rm_psil_ops {
296 int (*pair)(const struct ti_sci_handle *handle, u32 nav_id,
297 u32 src_thread, u32 dst_thread);
298 int (*unpair)(const struct ti_sci_handle *handle, u32 nav_id,
299 u32 src_thread, u32 dst_thread);
300};
301
302
303#define TI_SCI_RM_UDMAP_CHAN_TYPE_PKT_PBRR 2
304#define TI_SCI_RM_UDMAP_CHAN_TYPE_PKT_PBRR_SB 3
305#define TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_PBRR 10
306#define TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_PBVR 11
307#define TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_BCOPY_PBRR 12
308#define TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_BCOPY_PBVR 13
309
310#define TI_SCI_RM_UDMAP_RX_FLOW_DESC_HOST 0
311#define TI_SCI_RM_UDMAP_RX_FLOW_DESC_MONO 2
312
313#define TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_64_BYTES 1
314#define TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_128_BYTES 2
315#define TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_256_BYTES 3
316
317
318#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_PAUSE_ON_ERR_VALID BIT(0)
319#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_ATYPE_VALID BIT(1)
320#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_CHAN_TYPE_VALID BIT(2)
321#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_FETCH_SIZE_VALID BIT(3)
322#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_CQ_QNUM_VALID BIT(4)
323#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_PRIORITY_VALID BIT(5)
324#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_QOS_VALID BIT(6)
325#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_ORDER_ID_VALID BIT(7)
326#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_SCHED_PRIORITY_VALID BIT(8)
327#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_BURST_SIZE_VALID BIT(14)
328
329
330
331
332
333
334
335struct ti_sci_msg_rm_udmap_tx_ch_cfg {
336 u32 valid_params;
337#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_FILT_EINFO_VALID BIT(9)
338#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_FILT_PSWORDS_VALID BIT(10)
339#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_SUPR_TDPKT_VALID BIT(11)
340#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_CREDIT_COUNT_VALID BIT(12)
341#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_FDEPTH_VALID BIT(13)
342 u16 nav_id;
343 u16 index;
344 u8 tx_pause_on_err;
345 u8 tx_filt_einfo;
346 u8 tx_filt_pswords;
347 u8 tx_atype;
348 u8 tx_chan_type;
349 u8 tx_supr_tdpkt;
350 u16 tx_fetch_size;
351 u8 tx_credit_count;
352 u16 txcq_qnum;
353 u8 tx_priority;
354 u8 tx_qos;
355 u8 tx_orderid;
356 u16 fdepth;
357 u8 tx_sched_priority;
358 u8 tx_burst_size;
359};
360
361
362
363
364
365
366
367struct ti_sci_msg_rm_udmap_rx_ch_cfg {
368 u32 valid_params;
369#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_START_VALID BIT(9)
370#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_CNT_VALID BIT(10)
371#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_IGNORE_SHORT_VALID BIT(11)
372#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_IGNORE_LONG_VALID BIT(12)
373 u16 nav_id;
374 u16 index;
375 u16 rx_fetch_size;
376 u16 rxcq_qnum;
377 u8 rx_priority;
378 u8 rx_qos;
379 u8 rx_orderid;
380 u8 rx_sched_priority;
381 u16 flowid_start;
382 u16 flowid_cnt;
383 u8 rx_pause_on_err;
384 u8 rx_atype;
385 u8 rx_chan_type;
386 u8 rx_ignore_short;
387 u8 rx_ignore_long;
388 u8 rx_burst_size;
389};
390
391
392
393
394
395
396
397struct ti_sci_msg_rm_udmap_flow_cfg {
398 u32 valid_params;
399#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_EINFO_PRESENT_VALID BIT(0)
400#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_PSINFO_PRESENT_VALID BIT(1)
401#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_ERROR_HANDLING_VALID BIT(2)
402#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DESC_TYPE_VALID BIT(3)
403#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SOP_OFFSET_VALID BIT(4)
404#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_QNUM_VALID BIT(5)
405#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_HI_VALID BIT(6)
406#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_LO_VALID BIT(7)
407#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_HI_VALID BIT(8)
408#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_LO_VALID BIT(9)
409#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_HI_SEL_VALID BIT(10)
410#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_LO_SEL_VALID BIT(11)
411#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_HI_SEL_VALID BIT(12)
412#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_LO_SEL_VALID BIT(13)
413#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ0_SZ0_QNUM_VALID BIT(14)
414#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ1_QNUM_VALID BIT(15)
415#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ2_QNUM_VALID BIT(16)
416#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ3_QNUM_VALID BIT(17)
417#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_PS_LOCATION_VALID BIT(18)
418 u16 nav_id;
419 u16 flow_index;
420 u8 rx_einfo_present;
421 u8 rx_psinfo_present;
422 u8 rx_error_handling;
423 u8 rx_desc_type;
424 u16 rx_sop_offset;
425 u16 rx_dest_qnum;
426 u8 rx_src_tag_hi;
427 u8 rx_src_tag_lo;
428 u8 rx_dest_tag_hi;
429 u8 rx_dest_tag_lo;
430 u8 rx_src_tag_hi_sel;
431 u8 rx_src_tag_lo_sel;
432 u8 rx_dest_tag_hi_sel;
433 u8 rx_dest_tag_lo_sel;
434 u16 rx_fdq0_sz0_qnum;
435 u16 rx_fdq1_qnum;
436 u16 rx_fdq2_qnum;
437 u16 rx_fdq3_qnum;
438 u8 rx_ps_location;
439};
440
441
442
443
444
445
446
447struct ti_sci_rm_udmap_ops {
448 int (*tx_ch_cfg)(const struct ti_sci_handle *handle,
449 const struct ti_sci_msg_rm_udmap_tx_ch_cfg *params);
450 int (*rx_ch_cfg)(const struct ti_sci_handle *handle,
451 const struct ti_sci_msg_rm_udmap_rx_ch_cfg *params);
452 int (*rx_flow_cfg)(const struct ti_sci_handle *handle,
453 const struct ti_sci_msg_rm_udmap_flow_cfg *params);
454};
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472struct ti_sci_proc_ops {
473 int (*request)(const struct ti_sci_handle *handle, u8 pid);
474 int (*release)(const struct ti_sci_handle *handle, u8 pid);
475 int (*handover)(const struct ti_sci_handle *handle, u8 pid, u8 hid);
476 int (*set_config)(const struct ti_sci_handle *handle, u8 pid,
477 u64 boot_vector, u32 cfg_set, u32 cfg_clr);
478 int (*set_control)(const struct ti_sci_handle *handle, u8 pid,
479 u32 ctrl_set, u32 ctrl_clr);
480 int (*get_status)(const struct ti_sci_handle *handle, u8 pid,
481 u64 *boot_vector, u32 *cfg_flags, u32 *ctrl_flags,
482 u32 *status_flags);
483};
484
485
486
487
488
489
490
491
492
493struct ti_sci_ops {
494 struct ti_sci_core_ops core_ops;
495 struct ti_sci_dev_ops dev_ops;
496 struct ti_sci_clk_ops clk_ops;
497 struct ti_sci_rm_core_ops rm_core_ops;
498 struct ti_sci_rm_irq_ops rm_irq_ops;
499 struct ti_sci_rm_ringacc_ops rm_ring_ops;
500 struct ti_sci_rm_psil_ops rm_psil_ops;
501 struct ti_sci_rm_udmap_ops rm_udmap_ops;
502 struct ti_sci_proc_ops proc_ops;
503};
504
505
506
507
508
509
510struct ti_sci_handle {
511 struct ti_sci_version_info version;
512 struct ti_sci_ops ops;
513};
514
515#define TI_SCI_RESOURCE_NULL 0xffff
516
517
518
519
520
521
522
523struct ti_sci_resource_desc {
524 u16 start;
525 u16 num;
526 unsigned long *res_map;
527};
528
529
530
531
532
533
534
535
536struct ti_sci_resource {
537 u16 sets;
538 raw_spinlock_t lock;
539 struct ti_sci_resource_desc *desc;
540};
541
542#if IS_ENABLED(CONFIG_TI_SCI_PROTOCOL)
543const struct ti_sci_handle *ti_sci_get_handle(struct device *dev);
544int ti_sci_put_handle(const struct ti_sci_handle *handle);
545const struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev);
546const struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
547 const char *property);
548const struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
549 const char *property);
550u16 ti_sci_get_free_resource(struct ti_sci_resource *res);
551void ti_sci_release_resource(struct ti_sci_resource *res, u16 id);
552u32 ti_sci_get_num_resources(struct ti_sci_resource *res);
553struct ti_sci_resource *
554devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
555 struct device *dev, u32 dev_id, char *of_prop);
556
557#else
558
559static inline const struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
560{
561 return ERR_PTR(-EINVAL);
562}
563
564static inline int ti_sci_put_handle(const struct ti_sci_handle *handle)
565{
566 return -EINVAL;
567}
568
569static inline
570const struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev)
571{
572 return ERR_PTR(-EINVAL);
573}
574
575static inline
576const struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
577 const char *property)
578{
579 return ERR_PTR(-EINVAL);
580}
581
582static inline
583const struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
584 const char *property)
585{
586 return ERR_PTR(-EINVAL);
587}
588
589static inline u16 ti_sci_get_free_resource(struct ti_sci_resource *res)
590{
591 return TI_SCI_RESOURCE_NULL;
592}
593
594static inline void ti_sci_release_resource(struct ti_sci_resource *res, u16 id)
595{
596}
597
598static inline u32 ti_sci_get_num_resources(struct ti_sci_resource *res)
599{
600 return 0;
601}
602
603static inline struct ti_sci_resource *
604devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
605 struct device *dev, u32 dev_id, char *of_prop)
606{
607 return ERR_PTR(-EINVAL);
608}
609#endif
610
611#endif
612