1
2
3
4
5
6
7#ifndef _MEI_HW_TYPES_H_
8#define _MEI_HW_TYPES_H_
9
10#include <linux/uuid.h>
11
12
13
14
15#define MEI_HW_READY_TIMEOUT 2
16#define MEI_CONNECT_TIMEOUT 3
17
18#define MEI_CL_CONNECT_TIMEOUT 15
19#define MEI_CLIENTS_INIT_TIMEOUT 15
20
21#define MEI_PGI_TIMEOUT 1
22#define MEI_D0I3_TIMEOUT 5
23#define MEI_HBM_TIMEOUT 1
24
25
26
27
28#define HBM_MINOR_VERSION 2
29#define HBM_MAJOR_VERSION 2
30
31
32
33
34#define HBM_MINOR_VERSION_PGI 1
35#define HBM_MAJOR_VERSION_PGI 1
36
37
38
39
40#define HBM_MINOR_VERSION_DC 0
41#define HBM_MAJOR_VERSION_DC 2
42
43
44
45
46#define HBM_MINOR_VERSION_IE 0
47#define HBM_MAJOR_VERSION_IE 2
48
49
50
51
52#define HBM_MINOR_VERSION_DOT 0
53#define HBM_MAJOR_VERSION_DOT 2
54
55
56
57
58#define HBM_MINOR_VERSION_EV 0
59#define HBM_MAJOR_VERSION_EV 2
60
61
62
63
64#define HBM_MINOR_VERSION_FA 0
65#define HBM_MAJOR_VERSION_FA 2
66
67
68
69
70#define HBM_MINOR_VERSION_OS 0
71#define HBM_MAJOR_VERSION_OS 2
72
73
74
75
76#define HBM_MINOR_VERSION_DR 1
77#define HBM_MAJOR_VERSION_DR 2
78
79
80
81
82#define HBM_MINOR_VERSION_VT 2
83#define HBM_MAJOR_VERSION_VT 2
84
85
86
87
88#define HBM_MINOR_VERSION_CAP 2
89#define HBM_MAJOR_VERSION_CAP 2
90
91
92
93
94#define HBM_MINOR_VERSION_CD 2
95#define HBM_MAJOR_VERSION_CD 2
96
97
98#define MEI_HBM_CMD_OP_MSK 0x7f
99
100#define MEI_HBM_CMD_RES_MSK 0x80
101
102
103
104
105#define HOST_START_REQ_CMD 0x01
106#define HOST_START_RES_CMD 0x81
107
108#define HOST_STOP_REQ_CMD 0x02
109#define HOST_STOP_RES_CMD 0x82
110
111#define ME_STOP_REQ_CMD 0x03
112
113#define HOST_ENUM_REQ_CMD 0x04
114#define HOST_ENUM_RES_CMD 0x84
115
116#define HOST_CLIENT_PROPERTIES_REQ_CMD 0x05
117#define HOST_CLIENT_PROPERTIES_RES_CMD 0x85
118
119#define CLIENT_CONNECT_REQ_CMD 0x06
120#define CLIENT_CONNECT_RES_CMD 0x86
121
122#define CLIENT_DISCONNECT_REQ_CMD 0x07
123#define CLIENT_DISCONNECT_RES_CMD 0x87
124
125#define MEI_FLOW_CONTROL_CMD 0x08
126
127#define MEI_PG_ISOLATION_ENTRY_REQ_CMD 0x0a
128#define MEI_PG_ISOLATION_ENTRY_RES_CMD 0x8a
129#define MEI_PG_ISOLATION_EXIT_REQ_CMD 0x0b
130#define MEI_PG_ISOLATION_EXIT_RES_CMD 0x8b
131
132#define MEI_HBM_ADD_CLIENT_REQ_CMD 0x0f
133#define MEI_HBM_ADD_CLIENT_RES_CMD 0x8f
134
135#define MEI_HBM_NOTIFY_REQ_CMD 0x10
136#define MEI_HBM_NOTIFY_RES_CMD 0x90
137#define MEI_HBM_NOTIFICATION_CMD 0x11
138
139#define MEI_HBM_DMA_SETUP_REQ_CMD 0x12
140#define MEI_HBM_DMA_SETUP_RES_CMD 0x92
141
142#define MEI_HBM_CAPABILITIES_REQ_CMD 0x13
143#define MEI_HBM_CAPABILITIES_RES_CMD 0x93
144
145#define MEI_HBM_CLIENT_DMA_MAP_REQ_CMD 0x14
146#define MEI_HBM_CLIENT_DMA_MAP_RES_CMD 0x94
147
148#define MEI_HBM_CLIENT_DMA_UNMAP_REQ_CMD 0x15
149#define MEI_HBM_CLIENT_DMA_UNMAP_RES_CMD 0x95
150
151
152
153
154
155enum mei_stop_reason_types {
156 DRIVER_STOP_REQUEST = 0x00,
157 DEVICE_D1_ENTRY = 0x01,
158 DEVICE_D2_ENTRY = 0x02,
159 DEVICE_D3_ENTRY = 0x03,
160 SYSTEM_S1_ENTRY = 0x04,
161 SYSTEM_S2_ENTRY = 0x05,
162 SYSTEM_S3_ENTRY = 0x06,
163 SYSTEM_S4_ENTRY = 0x07,
164 SYSTEM_S5_ENTRY = 0x08
165};
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182enum mei_hbm_status {
183 MEI_HBMS_SUCCESS = 0,
184 MEI_HBMS_CLIENT_NOT_FOUND = 1,
185 MEI_HBMS_ALREADY_EXISTS = 2,
186 MEI_HBMS_REJECTED = 3,
187 MEI_HBMS_INVALID_PARAMETER = 4,
188 MEI_HBMS_NOT_ALLOWED = 5,
189 MEI_HBMS_ALREADY_STARTED = 6,
190 MEI_HBMS_NOT_STARTED = 7,
191
192 MEI_HBMS_MAX
193};
194
195
196
197
198
199
200enum mei_cl_connect_status {
201 MEI_CL_CONN_SUCCESS = MEI_HBMS_SUCCESS,
202 MEI_CL_CONN_NOT_FOUND = MEI_HBMS_CLIENT_NOT_FOUND,
203 MEI_CL_CONN_ALREADY_STARTED = MEI_HBMS_ALREADY_EXISTS,
204 MEI_CL_CONN_OUT_OF_RESOURCES = MEI_HBMS_REJECTED,
205 MEI_CL_CONN_MESSAGE_SMALL = MEI_HBMS_INVALID_PARAMETER,
206 MEI_CL_CONN_NOT_ALLOWED = MEI_HBMS_NOT_ALLOWED,
207};
208
209
210
211
212enum mei_cl_disconnect_status {
213 MEI_CL_DISCONN_SUCCESS = MEI_HBMS_SUCCESS
214};
215
216
217
218
219
220
221
222
223enum mei_ext_hdr_type {
224 MEI_EXT_HDR_NONE = 0,
225 MEI_EXT_HDR_VTAG = 1,
226};
227
228
229
230
231
232
233
234
235struct mei_ext_hdr {
236 u8 type;
237 u8 length;
238 u8 ext_payload[2];
239 u8 hdr[];
240};
241
242
243
244
245
246
247
248
249struct mei_ext_meta_hdr {
250 u8 count;
251 u8 size;
252 u8 reserved[2];
253 struct mei_ext_hdr hdrs[];
254};
255
256
257
258
259
260
261
262
263
264
265
266
267static inline struct mei_ext_hdr *mei_ext_begin(struct mei_ext_meta_hdr *meta)
268{
269 return meta->hdrs;
270}
271
272
273
274
275
276
277
278
279
280static inline bool mei_ext_last(struct mei_ext_meta_hdr *meta,
281 struct mei_ext_hdr *ext)
282{
283 return (u8 *)ext >= (u8 *)meta + sizeof(*meta) + (meta->size * 4);
284}
285
286
287
288
289
290
291
292
293
294
295
296static inline struct mei_ext_hdr *mei_ext_next(struct mei_ext_hdr *ext)
297{
298 return (struct mei_ext_hdr *)(ext->hdr + (ext->length * 4));
299}
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314struct mei_msg_hdr {
315 u32 me_addr:8;
316 u32 host_addr:8;
317 u32 length:9;
318 u32 reserved:3;
319 u32 extended:1;
320 u32 dma_ring:1;
321 u32 internal:1;
322 u32 msg_complete:1;
323 u32 extension[];
324} __packed;
325
326
327#define MEI_MSG_MAX_LEN_MASK GENMASK(9, 0)
328
329struct mei_bus_message {
330 u8 hbm_cmd;
331 u8 data[];
332} __packed;
333
334
335
336
337
338
339
340
341
342
343struct mei_hbm_cl_cmd {
344 u8 hbm_cmd;
345 u8 me_addr;
346 u8 host_addr;
347 u8 data;
348};
349
350struct hbm_version {
351 u8 minor_version;
352 u8 major_version;
353} __packed;
354
355struct hbm_host_version_request {
356 u8 hbm_cmd;
357 u8 reserved;
358 struct hbm_version host_version;
359} __packed;
360
361struct hbm_host_version_response {
362 u8 hbm_cmd;
363 u8 host_version_supported;
364 struct hbm_version me_max_version;
365} __packed;
366
367struct hbm_host_stop_request {
368 u8 hbm_cmd;
369 u8 reason;
370 u8 reserved[2];
371} __packed;
372
373struct hbm_host_stop_response {
374 u8 hbm_cmd;
375 u8 reserved[3];
376} __packed;
377
378struct hbm_me_stop_request {
379 u8 hbm_cmd;
380 u8 reason;
381 u8 reserved[2];
382} __packed;
383
384
385
386
387
388
389
390enum hbm_host_enum_flags {
391 MEI_HBM_ENUM_F_ALLOW_ADD = BIT(0),
392 MEI_HBM_ENUM_F_IMMEDIATE_ENUM = BIT(1),
393};
394
395
396
397
398
399
400
401
402struct hbm_host_enum_request {
403 u8 hbm_cmd;
404 u8 flags;
405 u8 reserved[2];
406} __packed;
407
408struct hbm_host_enum_response {
409 u8 hbm_cmd;
410 u8 reserved[3];
411 u8 valid_addresses[32];
412} __packed;
413
414
415
416
417
418
419
420
421
422
423
424
425
426struct mei_client_properties {
427 uuid_le protocol_name;
428 u8 protocol_version;
429 u8 max_number_of_connections;
430 u8 fixed_address;
431 u8 single_recv_buf:1;
432 u8 vt_supported:1;
433 u8 reserved:6;
434 u32 max_msg_length;
435} __packed;
436
437struct hbm_props_request {
438 u8 hbm_cmd;
439 u8 me_addr;
440 u8 reserved[2];
441} __packed;
442
443struct hbm_props_response {
444 u8 hbm_cmd;
445 u8 me_addr;
446 u8 status;
447 u8 reserved;
448 struct mei_client_properties client_properties;
449} __packed;
450
451
452
453
454
455
456
457
458
459
460struct hbm_add_client_request {
461 u8 hbm_cmd;
462 u8 me_addr;
463 u8 reserved[2];
464 struct mei_client_properties client_properties;
465} __packed;
466
467
468
469
470
471
472
473
474
475
476struct hbm_add_client_response {
477 u8 hbm_cmd;
478 u8 me_addr;
479 u8 status;
480 u8 reserved;
481} __packed;
482
483
484
485
486
487
488
489struct hbm_power_gate {
490 u8 hbm_cmd;
491 u8 reserved[3];
492} __packed;
493
494
495
496
497
498
499
500
501
502struct hbm_client_connect_request {
503 u8 hbm_cmd;
504 u8 me_addr;
505 u8 host_addr;
506 u8 reserved;
507} __packed;
508
509
510
511
512
513
514
515
516
517struct hbm_client_connect_response {
518 u8 hbm_cmd;
519 u8 me_addr;
520 u8 host_addr;
521 u8 status;
522} __packed;
523
524
525#define MEI_FC_MESSAGE_RESERVED_LENGTH 5
526
527struct hbm_flow_control {
528 u8 hbm_cmd;
529 u8 me_addr;
530 u8 host_addr;
531 u8 reserved[MEI_FC_MESSAGE_RESERVED_LENGTH];
532} __packed;
533
534#define MEI_HBM_NOTIFICATION_START 1
535#define MEI_HBM_NOTIFICATION_STOP 0
536
537
538
539
540
541
542
543
544struct hbm_notification_request {
545 u8 hbm_cmd;
546 u8 me_addr;
547 u8 host_addr;
548 u8 start;
549} __packed;
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568struct hbm_notification_response {
569 u8 hbm_cmd;
570 u8 me_addr;
571 u8 host_addr;
572 u8 status;
573 u8 start;
574 u8 reserved[3];
575} __packed;
576
577
578
579
580
581
582
583
584
585struct hbm_notification {
586 u8 hbm_cmd;
587 u8 me_addr;
588 u8 host_addr;
589 u8 reserved;
590} __packed;
591
592
593
594
595
596
597
598
599struct hbm_dma_mem_dscr {
600 u32 addr_hi;
601 u32 addr_lo;
602 u32 size;
603} __packed;
604
605enum {
606 DMA_DSCR_HOST = 0,
607 DMA_DSCR_DEVICE = 1,
608 DMA_DSCR_CTRL = 2,
609 DMA_DSCR_NUM,
610};
611
612
613
614
615
616
617
618
619struct hbm_dma_setup_request {
620 u8 hbm_cmd;
621 u8 reserved[3];
622 struct hbm_dma_mem_dscr dma_dscr[DMA_DSCR_NUM];
623} __packed;
624
625
626
627
628
629
630
631
632struct hbm_dma_setup_response {
633 u8 hbm_cmd;
634 u8 status;
635 u8 reserved[2];
636} __packed;
637
638
639
640
641
642
643
644
645
646
647
648
649
650struct hbm_dma_ring_ctrl {
651 u32 hbuf_wr_idx;
652 u32 reserved1;
653 u32 hbuf_rd_idx;
654 u32 reserved2;
655 u32 dbuf_wr_idx;
656 u32 reserved3;
657 u32 dbuf_rd_idx;
658 u32 reserved4;
659} __packed;
660
661
662#define HBM_CAP_VT BIT(0)
663
664#define HBM_CAP_CD BIT(2)
665
666
667
668
669
670
671
672struct hbm_capability_request {
673 u8 hbm_cmd;
674 u8 capability_requested[3];
675} __packed;
676
677
678
679
680
681
682
683struct hbm_capability_response {
684 u8 hbm_cmd;
685 u8 capability_granted[3];
686} __packed;
687
688
689
690
691
692
693
694
695
696
697
698struct hbm_client_dma_map_request {
699 u8 hbm_cmd;
700 u8 client_buffer_id;
701 u8 reserved[2];
702 u32 address_lsb;
703 u32 address_msb;
704 u32 size;
705} __packed;
706
707
708
709
710
711
712
713
714
715
716struct hbm_client_dma_unmap_request {
717 u8 hbm_cmd;
718 u8 status;
719 u8 client_buffer_id;
720 u8 reserved;
721} __packed;
722
723
724
725
726
727
728
729
730struct hbm_client_dma_response {
731 u8 hbm_cmd;
732 u8 status;
733} __packed;
734
735#endif
736