0001
0002
0003
0004
0005
0006
0007 #ifndef _MEI_HW_TYPES_H_
0008 #define _MEI_HW_TYPES_H_
0009
0010 #include <linux/uuid.h>
0011
0012
0013
0014
0015 #define MEI_HW_READY_TIMEOUT 2
0016 #define MEI_CONNECT_TIMEOUT 3
0017
0018 #define MEI_CL_CONNECT_TIMEOUT 15
0019 #define MEI_CLIENTS_INIT_TIMEOUT 15
0020
0021 #define MEI_PGI_TIMEOUT 1
0022 #define MEI_D0I3_TIMEOUT 5
0023 #define MEI_HBM_TIMEOUT 1
0024
0025
0026
0027
0028 #define MEI_FW_PAGE_SIZE 4096UL
0029
0030
0031
0032
0033 #define HBM_MINOR_VERSION 2
0034 #define HBM_MAJOR_VERSION 2
0035
0036
0037
0038
0039 #define HBM_MINOR_VERSION_PGI 1
0040 #define HBM_MAJOR_VERSION_PGI 1
0041
0042
0043
0044
0045 #define HBM_MINOR_VERSION_DC 0
0046 #define HBM_MAJOR_VERSION_DC 2
0047
0048
0049
0050
0051 #define HBM_MINOR_VERSION_IE 0
0052 #define HBM_MAJOR_VERSION_IE 2
0053
0054
0055
0056
0057 #define HBM_MINOR_VERSION_DOT 0
0058 #define HBM_MAJOR_VERSION_DOT 2
0059
0060
0061
0062
0063 #define HBM_MINOR_VERSION_EV 0
0064 #define HBM_MAJOR_VERSION_EV 2
0065
0066
0067
0068
0069 #define HBM_MINOR_VERSION_FA 0
0070 #define HBM_MAJOR_VERSION_FA 2
0071
0072
0073
0074
0075 #define HBM_MINOR_VERSION_OS 0
0076 #define HBM_MAJOR_VERSION_OS 2
0077
0078
0079
0080
0081 #define HBM_MINOR_VERSION_DR 1
0082 #define HBM_MAJOR_VERSION_DR 2
0083
0084
0085
0086
0087 #define HBM_MINOR_VERSION_VT 2
0088 #define HBM_MAJOR_VERSION_VT 2
0089
0090
0091
0092
0093 #define HBM_MINOR_VERSION_CAP 2
0094 #define HBM_MAJOR_VERSION_CAP 2
0095
0096
0097
0098
0099 #define HBM_MINOR_VERSION_CD 2
0100 #define HBM_MAJOR_VERSION_CD 2
0101
0102
0103 #define MEI_HBM_CMD_OP_MSK 0x7f
0104
0105 #define MEI_HBM_CMD_RES_MSK 0x80
0106
0107
0108
0109
0110 #define HOST_START_REQ_CMD 0x01
0111 #define HOST_START_RES_CMD 0x81
0112
0113 #define HOST_STOP_REQ_CMD 0x02
0114 #define HOST_STOP_RES_CMD 0x82
0115
0116 #define ME_STOP_REQ_CMD 0x03
0117
0118 #define HOST_ENUM_REQ_CMD 0x04
0119 #define HOST_ENUM_RES_CMD 0x84
0120
0121 #define HOST_CLIENT_PROPERTIES_REQ_CMD 0x05
0122 #define HOST_CLIENT_PROPERTIES_RES_CMD 0x85
0123
0124 #define CLIENT_CONNECT_REQ_CMD 0x06
0125 #define CLIENT_CONNECT_RES_CMD 0x86
0126
0127 #define CLIENT_DISCONNECT_REQ_CMD 0x07
0128 #define CLIENT_DISCONNECT_RES_CMD 0x87
0129
0130 #define MEI_FLOW_CONTROL_CMD 0x08
0131
0132 #define MEI_PG_ISOLATION_ENTRY_REQ_CMD 0x0a
0133 #define MEI_PG_ISOLATION_ENTRY_RES_CMD 0x8a
0134 #define MEI_PG_ISOLATION_EXIT_REQ_CMD 0x0b
0135 #define MEI_PG_ISOLATION_EXIT_RES_CMD 0x8b
0136
0137 #define MEI_HBM_ADD_CLIENT_REQ_CMD 0x0f
0138 #define MEI_HBM_ADD_CLIENT_RES_CMD 0x8f
0139
0140 #define MEI_HBM_NOTIFY_REQ_CMD 0x10
0141 #define MEI_HBM_NOTIFY_RES_CMD 0x90
0142 #define MEI_HBM_NOTIFICATION_CMD 0x11
0143
0144 #define MEI_HBM_DMA_SETUP_REQ_CMD 0x12
0145 #define MEI_HBM_DMA_SETUP_RES_CMD 0x92
0146
0147 #define MEI_HBM_CAPABILITIES_REQ_CMD 0x13
0148 #define MEI_HBM_CAPABILITIES_RES_CMD 0x93
0149
0150 #define MEI_HBM_CLIENT_DMA_MAP_REQ_CMD 0x14
0151 #define MEI_HBM_CLIENT_DMA_MAP_RES_CMD 0x94
0152
0153 #define MEI_HBM_CLIENT_DMA_UNMAP_REQ_CMD 0x15
0154 #define MEI_HBM_CLIENT_DMA_UNMAP_RES_CMD 0x95
0155
0156
0157
0158
0159
0160 enum mei_stop_reason_types {
0161 DRIVER_STOP_REQUEST = 0x00,
0162 DEVICE_D1_ENTRY = 0x01,
0163 DEVICE_D2_ENTRY = 0x02,
0164 DEVICE_D3_ENTRY = 0x03,
0165 SYSTEM_S1_ENTRY = 0x04,
0166 SYSTEM_S2_ENTRY = 0x05,
0167 SYSTEM_S3_ENTRY = 0x06,
0168 SYSTEM_S4_ENTRY = 0x07,
0169 SYSTEM_S5_ENTRY = 0x08
0170 };
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187 enum mei_hbm_status {
0188 MEI_HBMS_SUCCESS = 0,
0189 MEI_HBMS_CLIENT_NOT_FOUND = 1,
0190 MEI_HBMS_ALREADY_EXISTS = 2,
0191 MEI_HBMS_REJECTED = 3,
0192 MEI_HBMS_INVALID_PARAMETER = 4,
0193 MEI_HBMS_NOT_ALLOWED = 5,
0194 MEI_HBMS_ALREADY_STARTED = 6,
0195 MEI_HBMS_NOT_STARTED = 7,
0196
0197 MEI_HBMS_MAX
0198 };
0199
0200
0201
0202
0203
0204
0205 enum mei_cl_connect_status {
0206 MEI_CL_CONN_SUCCESS = MEI_HBMS_SUCCESS,
0207 MEI_CL_CONN_NOT_FOUND = MEI_HBMS_CLIENT_NOT_FOUND,
0208 MEI_CL_CONN_ALREADY_STARTED = MEI_HBMS_ALREADY_EXISTS,
0209 MEI_CL_CONN_OUT_OF_RESOURCES = MEI_HBMS_REJECTED,
0210 MEI_CL_CONN_MESSAGE_SMALL = MEI_HBMS_INVALID_PARAMETER,
0211 MEI_CL_CONN_NOT_ALLOWED = MEI_HBMS_NOT_ALLOWED,
0212 };
0213
0214
0215
0216
0217 enum mei_cl_disconnect_status {
0218 MEI_CL_DISCONN_SUCCESS = MEI_HBMS_SUCCESS
0219 };
0220
0221
0222
0223
0224
0225
0226
0227
0228 enum mei_ext_hdr_type {
0229 MEI_EXT_HDR_NONE = 0,
0230 MEI_EXT_HDR_VTAG = 1,
0231 };
0232
0233
0234
0235
0236
0237
0238
0239
0240 struct mei_ext_hdr {
0241 u8 type;
0242 u8 length;
0243 u8 data[];
0244 } __packed;
0245
0246
0247
0248
0249
0250
0251
0252
0253 struct mei_ext_meta_hdr {
0254 u8 count;
0255 u8 size;
0256 u8 reserved[2];
0257 u8 hdrs[];
0258 } __packed;
0259
0260
0261
0262
0263
0264
0265
0266
0267 struct mei_ext_hdr_vtag {
0268 struct mei_ext_hdr hdr;
0269 u8 vtag;
0270 u8 reserved;
0271 } __packed;
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284 static inline struct mei_ext_hdr *mei_ext_begin(struct mei_ext_meta_hdr *meta)
0285 {
0286 return (struct mei_ext_hdr *)meta->hdrs;
0287 }
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297 static inline bool mei_ext_last(struct mei_ext_meta_hdr *meta,
0298 struct mei_ext_hdr *ext)
0299 {
0300 return (u8 *)ext >= (u8 *)meta + sizeof(*meta) + (meta->size * 4);
0301 }
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313 static inline struct mei_ext_hdr *mei_ext_next(struct mei_ext_hdr *ext)
0314 {
0315 return (struct mei_ext_hdr *)((u8 *)ext + (ext->length * 4));
0316 }
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331 struct mei_msg_hdr {
0332 u32 me_addr:8;
0333 u32 host_addr:8;
0334 u32 length:9;
0335 u32 reserved:3;
0336 u32 extended:1;
0337 u32 dma_ring:1;
0338 u32 internal:1;
0339 u32 msg_complete:1;
0340 u32 extension[];
0341 } __packed;
0342
0343
0344 #define MEI_MSG_MAX_LEN_MASK GENMASK(9, 0)
0345
0346 struct mei_bus_message {
0347 u8 hbm_cmd;
0348 u8 data[];
0349 } __packed;
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359
0360 struct mei_hbm_cl_cmd {
0361 u8 hbm_cmd;
0362 u8 me_addr;
0363 u8 host_addr;
0364 u8 data;
0365 };
0366
0367 struct hbm_version {
0368 u8 minor_version;
0369 u8 major_version;
0370 } __packed;
0371
0372 struct hbm_host_version_request {
0373 u8 hbm_cmd;
0374 u8 reserved;
0375 struct hbm_version host_version;
0376 } __packed;
0377
0378 struct hbm_host_version_response {
0379 u8 hbm_cmd;
0380 u8 host_version_supported;
0381 struct hbm_version me_max_version;
0382 } __packed;
0383
0384 struct hbm_host_stop_request {
0385 u8 hbm_cmd;
0386 u8 reason;
0387 u8 reserved[2];
0388 } __packed;
0389
0390 struct hbm_host_stop_response {
0391 u8 hbm_cmd;
0392 u8 reserved[3];
0393 } __packed;
0394
0395 struct hbm_me_stop_request {
0396 u8 hbm_cmd;
0397 u8 reason;
0398 u8 reserved[2];
0399 } __packed;
0400
0401
0402
0403
0404
0405
0406
0407 enum hbm_host_enum_flags {
0408 MEI_HBM_ENUM_F_ALLOW_ADD = BIT(0),
0409 MEI_HBM_ENUM_F_IMMEDIATE_ENUM = BIT(1),
0410 };
0411
0412
0413
0414
0415
0416
0417
0418
0419 struct hbm_host_enum_request {
0420 u8 hbm_cmd;
0421 u8 flags;
0422 u8 reserved[2];
0423 } __packed;
0424
0425 struct hbm_host_enum_response {
0426 u8 hbm_cmd;
0427 u8 reserved[3];
0428 u8 valid_addresses[32];
0429 } __packed;
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443 struct mei_client_properties {
0444 uuid_le protocol_name;
0445 u8 protocol_version;
0446 u8 max_number_of_connections;
0447 u8 fixed_address;
0448 u8 single_recv_buf:1;
0449 u8 vt_supported:1;
0450 u8 reserved:6;
0451 u32 max_msg_length;
0452 } __packed;
0453
0454 struct hbm_props_request {
0455 u8 hbm_cmd;
0456 u8 me_addr;
0457 u8 reserved[2];
0458 } __packed;
0459
0460 struct hbm_props_response {
0461 u8 hbm_cmd;
0462 u8 me_addr;
0463 u8 status;
0464 u8 reserved;
0465 struct mei_client_properties client_properties;
0466 } __packed;
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477 struct hbm_add_client_request {
0478 u8 hbm_cmd;
0479 u8 me_addr;
0480 u8 reserved[2];
0481 struct mei_client_properties client_properties;
0482 } __packed;
0483
0484
0485
0486
0487
0488
0489
0490
0491
0492
0493 struct hbm_add_client_response {
0494 u8 hbm_cmd;
0495 u8 me_addr;
0496 u8 status;
0497 u8 reserved;
0498 } __packed;
0499
0500
0501
0502
0503
0504
0505
0506 struct hbm_power_gate {
0507 u8 hbm_cmd;
0508 u8 reserved[3];
0509 } __packed;
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519 struct hbm_client_connect_request {
0520 u8 hbm_cmd;
0521 u8 me_addr;
0522 u8 host_addr;
0523 u8 reserved;
0524 } __packed;
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534 struct hbm_client_connect_response {
0535 u8 hbm_cmd;
0536 u8 me_addr;
0537 u8 host_addr;
0538 u8 status;
0539 } __packed;
0540
0541
0542 #define MEI_FC_MESSAGE_RESERVED_LENGTH 5
0543
0544 struct hbm_flow_control {
0545 u8 hbm_cmd;
0546 u8 me_addr;
0547 u8 host_addr;
0548 u8 reserved[MEI_FC_MESSAGE_RESERVED_LENGTH];
0549 } __packed;
0550
0551 #define MEI_HBM_NOTIFICATION_START 1
0552 #define MEI_HBM_NOTIFICATION_STOP 0
0553
0554
0555
0556
0557
0558
0559
0560
0561 struct hbm_notification_request {
0562 u8 hbm_cmd;
0563 u8 me_addr;
0564 u8 host_addr;
0565 u8 start;
0566 } __packed;
0567
0568
0569
0570
0571
0572
0573
0574
0575
0576
0577
0578
0579
0580
0581
0582
0583
0584
0585 struct hbm_notification_response {
0586 u8 hbm_cmd;
0587 u8 me_addr;
0588 u8 host_addr;
0589 u8 status;
0590 u8 start;
0591 u8 reserved[3];
0592 } __packed;
0593
0594
0595
0596
0597
0598
0599
0600
0601
0602 struct hbm_notification {
0603 u8 hbm_cmd;
0604 u8 me_addr;
0605 u8 host_addr;
0606 u8 reserved;
0607 } __packed;
0608
0609
0610
0611
0612
0613
0614
0615
0616 struct hbm_dma_mem_dscr {
0617 u32 addr_hi;
0618 u32 addr_lo;
0619 u32 size;
0620 } __packed;
0621
0622 enum {
0623 DMA_DSCR_HOST = 0,
0624 DMA_DSCR_DEVICE = 1,
0625 DMA_DSCR_CTRL = 2,
0626 DMA_DSCR_NUM,
0627 };
0628
0629
0630
0631
0632
0633
0634
0635
0636 struct hbm_dma_setup_request {
0637 u8 hbm_cmd;
0638 u8 reserved[3];
0639 struct hbm_dma_mem_dscr dma_dscr[DMA_DSCR_NUM];
0640 } __packed;
0641
0642
0643
0644
0645
0646
0647
0648
0649 struct hbm_dma_setup_response {
0650 u8 hbm_cmd;
0651 u8 status;
0652 u8 reserved[2];
0653 } __packed;
0654
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664
0665
0666
0667 struct hbm_dma_ring_ctrl {
0668 u32 hbuf_wr_idx;
0669 u32 reserved1;
0670 u32 hbuf_rd_idx;
0671 u32 reserved2;
0672 u32 dbuf_wr_idx;
0673 u32 reserved3;
0674 u32 dbuf_rd_idx;
0675 u32 reserved4;
0676 } __packed;
0677
0678
0679 #define HBM_CAP_VT BIT(0)
0680
0681 #define HBM_CAP_CD BIT(2)
0682
0683
0684
0685
0686
0687
0688
0689 struct hbm_capability_request {
0690 u8 hbm_cmd;
0691 u8 capability_requested[3];
0692 } __packed;
0693
0694
0695
0696
0697
0698
0699
0700 struct hbm_capability_response {
0701 u8 hbm_cmd;
0702 u8 capability_granted[3];
0703 } __packed;
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714
0715 struct hbm_client_dma_map_request {
0716 u8 hbm_cmd;
0717 u8 client_buffer_id;
0718 u8 reserved[2];
0719 u32 address_lsb;
0720 u32 address_msb;
0721 u32 size;
0722 } __packed;
0723
0724
0725
0726
0727
0728
0729
0730
0731
0732
0733 struct hbm_client_dma_unmap_request {
0734 u8 hbm_cmd;
0735 u8 status;
0736 u8 client_buffer_id;
0737 u8 reserved;
0738 } __packed;
0739
0740
0741
0742
0743
0744
0745
0746
0747 struct hbm_client_dma_response {
0748 u8 hbm_cmd;
0749 u8 status;
0750 } __packed;
0751
0752 #endif