xref: /openbmc/linux/drivers/misc/mei/hw.h (revision 1fb1ea0d)
19fff0425STomas Winkler /* SPDX-License-Identifier: GPL-2.0 */
2ffc2825cSGreg Kroah-Hartman /*
395953618SAlexander Usyskin  * Copyright (c) 2003-2022, Intel Corporation. All rights reserved
4ffc2825cSGreg Kroah-Hartman  * Intel Management Engine Interface (Intel MEI) Linux driver
5ffc2825cSGreg Kroah-Hartman  */
6ffc2825cSGreg Kroah-Hartman 
7ffc2825cSGreg Kroah-Hartman #ifndef _MEI_HW_TYPES_H_
8ffc2825cSGreg Kroah-Hartman #define _MEI_HW_TYPES_H_
9ffc2825cSGreg Kroah-Hartman 
10*1fb1ea0dSAndy Shevchenko #include <linux/mei.h>
11ffc2825cSGreg Kroah-Hartman 
12ffc2825cSGreg Kroah-Hartman /*
133870c320STomas Winkler  * Timeouts in Seconds
14ffc2825cSGreg Kroah-Hartman  */
157d93e58dSTomas Winkler #define MEI_HW_READY_TIMEOUT        2  /* Timeout on ready message */
163870c320STomas Winkler #define MEI_CONNECT_TIMEOUT         3  /* HPS: at least 2 seconds */
17ffc2825cSGreg Kroah-Hartman 
183870c320STomas Winkler #define MEI_CL_CONNECT_TIMEOUT     15  /* HPS: Client Connect Timeout */
1995953618SAlexander Usyskin #define MEI_CL_CONNECT_TIMEOUT_SLOW 30 /* HPS: Client Connect Timeout, slow FW */
203870c320STomas Winkler #define MEI_CLIENTS_INIT_TIMEOUT   15  /* HPS: Clients Enumeration Timeout */
21ffc2825cSGreg Kroah-Hartman 
22ba9cdd0eSTomas Winkler #define MEI_PGI_TIMEOUT             1  /* PG Isolation time response 1 sec */
23859ef2ffSAlexander Usyskin #define MEI_D0I3_TIMEOUT            5  /* D0i3 set/unset max response time */
247d93e58dSTomas Winkler #define MEI_HBM_TIMEOUT             1  /* 1 second */
2595953618SAlexander Usyskin #define MEI_HBM_TIMEOUT_SLOW        5  /* 5 second, slow FW */
2695953618SAlexander Usyskin 
2795953618SAlexander Usyskin #define MKHI_RCV_TIMEOUT 500 /* receive timeout in msec */
2895953618SAlexander Usyskin #define MKHI_RCV_TIMEOUT_SLOW 10000 /* receive timeout in msec, slow FW */
29ffc2825cSGreg Kroah-Hartman 
30ffc2825cSGreg Kroah-Hartman /*
312cca3465SAlexander Usyskin  * FW page size for DMA allocations
322cca3465SAlexander Usyskin  */
332cca3465SAlexander Usyskin #define MEI_FW_PAGE_SIZE 4096UL
342cca3465SAlexander Usyskin 
352cca3465SAlexander Usyskin /*
36ffc2825cSGreg Kroah-Hartman  * MEI Version
37ffc2825cSGreg Kroah-Hartman  */
3874a9c967SAlexander Usyskin #define HBM_MINOR_VERSION                   2
39155718cfSTomas Winkler #define HBM_MAJOR_VERSION                   2
40ffc2825cSGreg Kroah-Hartman 
41ee7e5afdSTomas Winkler /*
42ee7e5afdSTomas Winkler  * MEI version with PGI support
43ee7e5afdSTomas Winkler  */
44ee7e5afdSTomas Winkler #define HBM_MINOR_VERSION_PGI               1
45ee7e5afdSTomas Winkler #define HBM_MAJOR_VERSION_PGI               1
46ee7e5afdSTomas Winkler 
4770ef835cSTomas Winkler /*
4870ef835cSTomas Winkler  * MEI version with Dynamic clients support
4970ef835cSTomas Winkler  */
5070ef835cSTomas Winkler #define HBM_MINOR_VERSION_DC               0
5170ef835cSTomas Winkler #define HBM_MAJOR_VERSION_DC               2
5270ef835cSTomas Winkler 
5318901357SAlexander Usyskin /*
5427f476eaSAlexander Usyskin  * MEI version with immediate reply to enum request support
5527f476eaSAlexander Usyskin  */
5627f476eaSAlexander Usyskin #define HBM_MINOR_VERSION_IE               0
5727f476eaSAlexander Usyskin #define HBM_MAJOR_VERSION_IE               2
5827f476eaSAlexander Usyskin 
5927f476eaSAlexander Usyskin /*
6018901357SAlexander Usyskin  * MEI version with disconnect on connection timeout support
6118901357SAlexander Usyskin  */
6218901357SAlexander Usyskin #define HBM_MINOR_VERSION_DOT              0
6318901357SAlexander Usyskin #define HBM_MAJOR_VERSION_DOT              2
6418901357SAlexander Usyskin 
654d99877dSTomas Winkler /*
66b6a38565STomas Winkler  * MEI version with notification support
674d99877dSTomas Winkler  */
684d99877dSTomas Winkler #define HBM_MINOR_VERSION_EV               0
694d99877dSTomas Winkler #define HBM_MAJOR_VERSION_EV               2
704d99877dSTomas Winkler 
71f4e06246SAlexander Usyskin /*
72f4e06246SAlexander Usyskin  * MEI version with fixed address client support
73f4e06246SAlexander Usyskin  */
74f4e06246SAlexander Usyskin #define HBM_MINOR_VERSION_FA               0
75f4e06246SAlexander Usyskin #define HBM_MAJOR_VERSION_FA               2
76f4e06246SAlexander Usyskin 
777ee7f45aSAlexander Usyskin /*
787ee7f45aSAlexander Usyskin  * MEI version with OS ver message support
797ee7f45aSAlexander Usyskin  */
807ee7f45aSAlexander Usyskin #define HBM_MINOR_VERSION_OS               0
817ee7f45aSAlexander Usyskin #define HBM_MAJOR_VERSION_OS               2
827ee7f45aSAlexander Usyskin 
83c2bd9fc1STomas Winkler /*
84c2bd9fc1STomas Winkler  * MEI version with dma ring support
85c2bd9fc1STomas Winkler  */
86c2bd9fc1STomas Winkler #define HBM_MINOR_VERSION_DR               1
87c2bd9fc1STomas Winkler #define HBM_MAJOR_VERSION_DR               2
88c2bd9fc1STomas Winkler 
89e5cab1f9SAlexander Usyskin /*
90beb4e1e5SAlexander Usyskin  * MEI version with vm tag support
91beb4e1e5SAlexander Usyskin  */
92beb4e1e5SAlexander Usyskin #define HBM_MINOR_VERSION_VT               2
93beb4e1e5SAlexander Usyskin #define HBM_MAJOR_VERSION_VT               2
94beb4e1e5SAlexander Usyskin 
95beb4e1e5SAlexander Usyskin /*
964ed1cc99STomas Winkler  * MEI version with GSC support
974ed1cc99STomas Winkler  */
984ed1cc99STomas Winkler #define HBM_MINOR_VERSION_GSC              2
994ed1cc99STomas Winkler #define HBM_MAJOR_VERSION_GSC              2
1004ed1cc99STomas Winkler 
1014ed1cc99STomas Winkler /*
102e5cab1f9SAlexander Usyskin  * MEI version with capabilities message support
103e5cab1f9SAlexander Usyskin  */
104e5cab1f9SAlexander Usyskin #define HBM_MINOR_VERSION_CAP              2
105e5cab1f9SAlexander Usyskin #define HBM_MAJOR_VERSION_CAP              2
106e5cab1f9SAlexander Usyskin 
107b7a48041SAlexander Usyskin /*
108b7a48041SAlexander Usyskin  * MEI version with client DMA support
109b7a48041SAlexander Usyskin  */
110b7a48041SAlexander Usyskin #define HBM_MINOR_VERSION_CD               2
111b7a48041SAlexander Usyskin #define HBM_MAJOR_VERSION_CD               2
112b7a48041SAlexander Usyskin 
113ffc2825cSGreg Kroah-Hartman /* Host bus message command opcode */
114ffc2825cSGreg Kroah-Hartman #define MEI_HBM_CMD_OP_MSK                  0x7f
115ffc2825cSGreg Kroah-Hartman /* Host bus message command RESPONSE */
116ffc2825cSGreg Kroah-Hartman #define MEI_HBM_CMD_RES_MSK                 0x80
117ffc2825cSGreg Kroah-Hartman 
118ffc2825cSGreg Kroah-Hartman /*
119ffc2825cSGreg Kroah-Hartman  * MEI Bus Message Command IDs
120ffc2825cSGreg Kroah-Hartman  */
121ffc2825cSGreg Kroah-Hartman #define HOST_START_REQ_CMD                  0x01
122ffc2825cSGreg Kroah-Hartman #define HOST_START_RES_CMD                  0x81
123ffc2825cSGreg Kroah-Hartman 
124ffc2825cSGreg Kroah-Hartman #define HOST_STOP_REQ_CMD                   0x02
125ffc2825cSGreg Kroah-Hartman #define HOST_STOP_RES_CMD                   0x82
126ffc2825cSGreg Kroah-Hartman 
127ffc2825cSGreg Kroah-Hartman #define ME_STOP_REQ_CMD                     0x03
128ffc2825cSGreg Kroah-Hartman 
129ffc2825cSGreg Kroah-Hartman #define HOST_ENUM_REQ_CMD                   0x04
130ffc2825cSGreg Kroah-Hartman #define HOST_ENUM_RES_CMD                   0x84
131ffc2825cSGreg Kroah-Hartman 
132ffc2825cSGreg Kroah-Hartman #define HOST_CLIENT_PROPERTIES_REQ_CMD      0x05
133ffc2825cSGreg Kroah-Hartman #define HOST_CLIENT_PROPERTIES_RES_CMD      0x85
134ffc2825cSGreg Kroah-Hartman 
135ffc2825cSGreg Kroah-Hartman #define CLIENT_CONNECT_REQ_CMD              0x06
136ffc2825cSGreg Kroah-Hartman #define CLIENT_CONNECT_RES_CMD              0x86
137ffc2825cSGreg Kroah-Hartman 
138ffc2825cSGreg Kroah-Hartman #define CLIENT_DISCONNECT_REQ_CMD           0x07
139ffc2825cSGreg Kroah-Hartman #define CLIENT_DISCONNECT_RES_CMD           0x87
140ffc2825cSGreg Kroah-Hartman 
141ffc2825cSGreg Kroah-Hartman #define MEI_FLOW_CONTROL_CMD                0x08
142ffc2825cSGreg Kroah-Hartman 
1434fcbc99bSTomas Winkler #define MEI_PG_ISOLATION_ENTRY_REQ_CMD      0x0a
1444fcbc99bSTomas Winkler #define MEI_PG_ISOLATION_ENTRY_RES_CMD      0x8a
1454fcbc99bSTomas Winkler #define MEI_PG_ISOLATION_EXIT_REQ_CMD       0x0b
1464fcbc99bSTomas Winkler #define MEI_PG_ISOLATION_EXIT_RES_CMD       0x8b
1474fcbc99bSTomas Winkler 
14870ef835cSTomas Winkler #define MEI_HBM_ADD_CLIENT_REQ_CMD          0x0f
14970ef835cSTomas Winkler #define MEI_HBM_ADD_CLIENT_RES_CMD          0x8f
150d3c1c809STomas Winkler 
151d3c1c809STomas Winkler #define MEI_HBM_NOTIFY_REQ_CMD              0x10
152d3c1c809STomas Winkler #define MEI_HBM_NOTIFY_RES_CMD              0x90
153d3c1c809STomas Winkler #define MEI_HBM_NOTIFICATION_CMD            0x11
154d3c1c809STomas Winkler 
155ee7aba5aSTomas Winkler #define MEI_HBM_DMA_SETUP_REQ_CMD           0x12
156ee7aba5aSTomas Winkler #define MEI_HBM_DMA_SETUP_RES_CMD           0x92
157ee7aba5aSTomas Winkler 
158e5cab1f9SAlexander Usyskin #define MEI_HBM_CAPABILITIES_REQ_CMD        0x13
159e5cab1f9SAlexander Usyskin #define MEI_HBM_CAPABILITIES_RES_CMD        0x93
160e5cab1f9SAlexander Usyskin 
161dfad8742SAlexander Usyskin #define MEI_HBM_CLIENT_DMA_MAP_REQ_CMD      0x14
162dfad8742SAlexander Usyskin #define MEI_HBM_CLIENT_DMA_MAP_RES_CMD      0x94
163dfad8742SAlexander Usyskin 
164dfad8742SAlexander Usyskin #define MEI_HBM_CLIENT_DMA_UNMAP_REQ_CMD    0x15
165dfad8742SAlexander Usyskin #define MEI_HBM_CLIENT_DMA_UNMAP_RES_CMD    0x95
166dfad8742SAlexander Usyskin 
167ffc2825cSGreg Kroah-Hartman /*
168ffc2825cSGreg Kroah-Hartman  * MEI Stop Reason
169ffc2825cSGreg Kroah-Hartman  * used by hbm_host_stop_request.reason
170ffc2825cSGreg Kroah-Hartman  */
171ffc2825cSGreg Kroah-Hartman enum mei_stop_reason_types {
172ffc2825cSGreg Kroah-Hartman 	DRIVER_STOP_REQUEST = 0x00,
173ffc2825cSGreg Kroah-Hartman 	DEVICE_D1_ENTRY = 0x01,
174ffc2825cSGreg Kroah-Hartman 	DEVICE_D2_ENTRY = 0x02,
175ffc2825cSGreg Kroah-Hartman 	DEVICE_D3_ENTRY = 0x03,
176ffc2825cSGreg Kroah-Hartman 	SYSTEM_S1_ENTRY = 0x04,
177ffc2825cSGreg Kroah-Hartman 	SYSTEM_S2_ENTRY = 0x05,
178ffc2825cSGreg Kroah-Hartman 	SYSTEM_S3_ENTRY = 0x06,
179ffc2825cSGreg Kroah-Hartman 	SYSTEM_S4_ENTRY = 0x07,
180ffc2825cSGreg Kroah-Hartman 	SYSTEM_S5_ENTRY = 0x08
181ffc2825cSGreg Kroah-Hartman };
182ffc2825cSGreg Kroah-Hartman 
18389778d6eSTomas Winkler 
18489778d6eSTomas Winkler /**
185a8605ea2SAlexander Usyskin  * enum mei_hbm_status  - mei host bus messages return values
18689778d6eSTomas Winkler  *
187a8605ea2SAlexander Usyskin  * @MEI_HBMS_SUCCESS           : status success
188a8605ea2SAlexander Usyskin  * @MEI_HBMS_CLIENT_NOT_FOUND  : client not found
189a8605ea2SAlexander Usyskin  * @MEI_HBMS_ALREADY_EXISTS    : connection already established
190a8605ea2SAlexander Usyskin  * @MEI_HBMS_REJECTED          : connection is rejected
191a8605ea2SAlexander Usyskin  * @MEI_HBMS_INVALID_PARAMETER : invalid parameter
192a8605ea2SAlexander Usyskin  * @MEI_HBMS_NOT_ALLOWED       : operation not allowed
193a8605ea2SAlexander Usyskin  * @MEI_HBMS_ALREADY_STARTED   : system is already started
194a8605ea2SAlexander Usyskin  * @MEI_HBMS_NOT_STARTED       : system not started
195ce23139cSAlexander Usyskin  *
196ce23139cSAlexander Usyskin  * @MEI_HBMS_MAX               : sentinel
19789778d6eSTomas Winkler  */
19889778d6eSTomas Winkler enum mei_hbm_status {
19989778d6eSTomas Winkler 	MEI_HBMS_SUCCESS           = 0,
20089778d6eSTomas Winkler 	MEI_HBMS_CLIENT_NOT_FOUND  = 1,
20189778d6eSTomas Winkler 	MEI_HBMS_ALREADY_EXISTS    = 2,
20289778d6eSTomas Winkler 	MEI_HBMS_REJECTED          = 3,
20389778d6eSTomas Winkler 	MEI_HBMS_INVALID_PARAMETER = 4,
20489778d6eSTomas Winkler 	MEI_HBMS_NOT_ALLOWED       = 5,
20589778d6eSTomas Winkler 	MEI_HBMS_ALREADY_STARTED   = 6,
20689778d6eSTomas Winkler 	MEI_HBMS_NOT_STARTED       = 7,
20789778d6eSTomas Winkler 
20889778d6eSTomas Winkler 	MEI_HBMS_MAX
20989778d6eSTomas Winkler };
21089778d6eSTomas Winkler 
21189778d6eSTomas Winkler 
212ffc2825cSGreg Kroah-Hartman /*
213ffc2825cSGreg Kroah-Hartman  * Client Connect Status
214ffc2825cSGreg Kroah-Hartman  * used by hbm_client_connect_response.status
215ffc2825cSGreg Kroah-Hartman  */
216285e2996SAlexander Usyskin enum mei_cl_connect_status {
21789778d6eSTomas Winkler 	MEI_CL_CONN_SUCCESS          = MEI_HBMS_SUCCESS,
21889778d6eSTomas Winkler 	MEI_CL_CONN_NOT_FOUND        = MEI_HBMS_CLIENT_NOT_FOUND,
21989778d6eSTomas Winkler 	MEI_CL_CONN_ALREADY_STARTED  = MEI_HBMS_ALREADY_EXISTS,
22089778d6eSTomas Winkler 	MEI_CL_CONN_OUT_OF_RESOURCES = MEI_HBMS_REJECTED,
22189778d6eSTomas Winkler 	MEI_CL_CONN_MESSAGE_SMALL    = MEI_HBMS_INVALID_PARAMETER,
22271e117f2SAlexander Usyskin 	MEI_CL_CONN_NOT_ALLOWED      = MEI_HBMS_NOT_ALLOWED,
223ffc2825cSGreg Kroah-Hartman };
224ffc2825cSGreg Kroah-Hartman 
225ffc2825cSGreg Kroah-Hartman /*
226ffc2825cSGreg Kroah-Hartman  * Client Disconnect Status
227ffc2825cSGreg Kroah-Hartman  */
228285e2996SAlexander Usyskin enum mei_cl_disconnect_status {
22989778d6eSTomas Winkler 	MEI_CL_DISCONN_SUCCESS = MEI_HBMS_SUCCESS
230ffc2825cSGreg Kroah-Hartman };
231ffc2825cSGreg Kroah-Hartman 
2329d89ddfcSTomas Winkler /**
2330cd7c01aSTomas Winkler  * enum mei_ext_hdr_type - extended header type used in
2340cd7c01aSTomas Winkler  *    extended header TLV
2350cd7c01aSTomas Winkler  *
2360cd7c01aSTomas Winkler  * @MEI_EXT_HDR_NONE: sentinel
2370cd7c01aSTomas Winkler  * @MEI_EXT_HDR_VTAG: vtag header
2384ed1cc99STomas Winkler  * @MEI_EXT_HDR_GSC: gsc header
2390cd7c01aSTomas Winkler  */
2400cd7c01aSTomas Winkler enum mei_ext_hdr_type {
2410cd7c01aSTomas Winkler 	MEI_EXT_HDR_NONE = 0,
2420cd7c01aSTomas Winkler 	MEI_EXT_HDR_VTAG = 1,
2434ed1cc99STomas Winkler 	MEI_EXT_HDR_GSC = 2,
2440cd7c01aSTomas Winkler };
2450cd7c01aSTomas Winkler 
2460cd7c01aSTomas Winkler /**
2470cd7c01aSTomas Winkler  * struct mei_ext_hdr - extend header descriptor (TLV)
2480cd7c01aSTomas Winkler  * @type: enum mei_ext_hdr_type
2490cd7c01aSTomas Winkler  * @length: length excluding descriptor
2502af56ddeSTomas Winkler  * @data: the extended header payload
2510cd7c01aSTomas Winkler  */
2520cd7c01aSTomas Winkler struct mei_ext_hdr {
2530cd7c01aSTomas Winkler 	u8 type;
2540cd7c01aSTomas Winkler 	u8 length;
25540292383STomas Winkler 	u8 data[];
25640292383STomas Winkler } __packed;
2570cd7c01aSTomas Winkler 
2580cd7c01aSTomas Winkler /**
2590cd7c01aSTomas Winkler  * struct mei_ext_meta_hdr - extend header meta data
2600cd7c01aSTomas Winkler  * @count: number of headers
2610cd7c01aSTomas Winkler  * @size: total size of the extended header list excluding meta header
2620cd7c01aSTomas Winkler  * @reserved: reserved
2630cd7c01aSTomas Winkler  * @hdrs: extended headers TLV list
2640cd7c01aSTomas Winkler  */
2650cd7c01aSTomas Winkler struct mei_ext_meta_hdr {
2660cd7c01aSTomas Winkler 	u8 count;
2670cd7c01aSTomas Winkler 	u8 size;
2680cd7c01aSTomas Winkler 	u8 reserved[2];
26940292383STomas Winkler 	u8 hdrs[];
27040292383STomas Winkler } __packed;
27140292383STomas Winkler 
27240292383STomas Winkler /**
27340292383STomas Winkler  * struct mei_ext_hdr_vtag - extend header for vtag
27440292383STomas Winkler  *
27540292383STomas Winkler  * @hdr: standard extend header
27640292383STomas Winkler  * @vtag: virtual tag
27740292383STomas Winkler  * @reserved: reserved
27840292383STomas Winkler  */
27940292383STomas Winkler struct mei_ext_hdr_vtag {
28040292383STomas Winkler 	struct mei_ext_hdr hdr;
28140292383STomas Winkler 	u8 vtag;
28240292383STomas Winkler 	u8 reserved;
28340292383STomas Winkler } __packed;
2840cd7c01aSTomas Winkler 
2850cd7c01aSTomas Winkler /*
2860cd7c01aSTomas Winkler  * Extended header iterator functions
2870cd7c01aSTomas Winkler  */
2880cd7c01aSTomas Winkler /**
2892af56ddeSTomas Winkler  * mei_ext_begin - extended header iterator begin
2900cd7c01aSTomas Winkler  *
2910cd7c01aSTomas Winkler  * @meta: meta header of the extended header list
2920cd7c01aSTomas Winkler  *
2932af56ddeSTomas Winkler  * Return: The first extended header
2940cd7c01aSTomas Winkler  */
mei_ext_begin(struct mei_ext_meta_hdr * meta)2950cd7c01aSTomas Winkler static inline struct mei_ext_hdr *mei_ext_begin(struct mei_ext_meta_hdr *meta)
2960cd7c01aSTomas Winkler {
29740292383STomas Winkler 	return (struct mei_ext_hdr *)meta->hdrs;
2980cd7c01aSTomas Winkler }
2990cd7c01aSTomas Winkler 
3000cd7c01aSTomas Winkler /**
3010cd7c01aSTomas Winkler  * mei_ext_last - check if the ext is the last one in the TLV list
3020cd7c01aSTomas Winkler  *
3030cd7c01aSTomas Winkler  * @meta: meta header of the extended header list
3040cd7c01aSTomas Winkler  * @ext: a meta header on the list
3050cd7c01aSTomas Winkler  *
3060cd7c01aSTomas Winkler  * Return: true if ext is the last header on the list
3070cd7c01aSTomas Winkler  */
mei_ext_last(struct mei_ext_meta_hdr * meta,struct mei_ext_hdr * ext)3080cd7c01aSTomas Winkler static inline bool mei_ext_last(struct mei_ext_meta_hdr *meta,
3090cd7c01aSTomas Winkler 				struct mei_ext_hdr *ext)
3100cd7c01aSTomas Winkler {
3110cd7c01aSTomas Winkler 	return (u8 *)ext >= (u8 *)meta + sizeof(*meta) + (meta->size * 4);
3120cd7c01aSTomas Winkler }
3130cd7c01aSTomas Winkler 
3144ed1cc99STomas Winkler struct mei_gsc_sgl {
3154ed1cc99STomas Winkler 	u32 low;
3164ed1cc99STomas Winkler 	u32 high;
3174ed1cc99STomas Winkler 	u32 length;
3184ed1cc99STomas Winkler } __packed;
3194ed1cc99STomas Winkler 
3204ed1cc99STomas Winkler #define GSC_HECI_MSG_KERNEL 0
3214ed1cc99STomas Winkler #define GSC_HECI_MSG_USER   1
3224ed1cc99STomas Winkler 
3234ed1cc99STomas Winkler #define GSC_ADDRESS_TYPE_GTT   0
3244ed1cc99STomas Winkler #define GSC_ADDRESS_TYPE_PPGTT 1
3254ed1cc99STomas Winkler #define GSC_ADDRESS_TYPE_PHYSICAL_CONTINUOUS 2 /* max of 64K */
3264ed1cc99STomas Winkler #define GSC_ADDRESS_TYPE_PHYSICAL_SGL 3
3274ed1cc99STomas Winkler 
3284ed1cc99STomas Winkler /**
3294ed1cc99STomas Winkler  * struct mei_ext_hdr_gsc_h2f - extended header: gsc host to firmware interface
3304ed1cc99STomas Winkler  *
3314ed1cc99STomas Winkler  * @hdr: extended header
3324ed1cc99STomas Winkler  * @client_id: GSC_HECI_MSG_KERNEL or GSC_HECI_MSG_USER
3334ed1cc99STomas Winkler  * @addr_type: GSC_ADDRESS_TYPE_{GTT, PPGTT, PHYSICAL_CONTINUOUS, PHYSICAL_SGL}
3344ed1cc99STomas Winkler  * @fence_id: synchronization marker
3354ed1cc99STomas Winkler  * @input_address_count: number of input sgl buffers
3364ed1cc99STomas Winkler  * @output_address_count: number of output sgl buffers
3374ed1cc99STomas Winkler  * @reserved: reserved
3384ed1cc99STomas Winkler  * @sgl: sg list
3394ed1cc99STomas Winkler  */
3404ed1cc99STomas Winkler struct mei_ext_hdr_gsc_h2f {
3414ed1cc99STomas Winkler 	struct mei_ext_hdr hdr;
3424ed1cc99STomas Winkler 	u8                 client_id;
3434ed1cc99STomas Winkler 	u8                 addr_type;
3444ed1cc99STomas Winkler 	u32                fence_id;
3454ed1cc99STomas Winkler 	u8                 input_address_count;
3464ed1cc99STomas Winkler 	u8                 output_address_count;
3474ed1cc99STomas Winkler 	u8                 reserved[2];
3484ed1cc99STomas Winkler 	struct mei_gsc_sgl sgl[];
3494ed1cc99STomas Winkler } __packed;
3504ed1cc99STomas Winkler 
3514ed1cc99STomas Winkler /**
3524ed1cc99STomas Winkler  * struct mei_ext_hdr_gsc_f2h - gsc firmware to host interface
3534ed1cc99STomas Winkler  *
3544ed1cc99STomas Winkler  * @hdr: extended header
3554ed1cc99STomas Winkler  * @client_id: GSC_HECI_MSG_KERNEL or GSC_HECI_MSG_USER
3564ed1cc99STomas Winkler  * @reserved: reserved
3574ed1cc99STomas Winkler  * @fence_id: synchronization marker
3584ed1cc99STomas Winkler  * @written: number of bytes written to firmware
3594ed1cc99STomas Winkler  */
3604ed1cc99STomas Winkler struct mei_ext_hdr_gsc_f2h {
3614ed1cc99STomas Winkler 	struct mei_ext_hdr hdr;
3624ed1cc99STomas Winkler 	u8                 client_id;
3634ed1cc99STomas Winkler 	u8                 reserved;
3644ed1cc99STomas Winkler 	u32                fence_id;
3654ed1cc99STomas Winkler 	u32                written;
3664ed1cc99STomas Winkler } __packed;
3674ed1cc99STomas Winkler 
3680cd7c01aSTomas Winkler /**
3690cd7c01aSTomas Winkler  * mei_ext_next - following extended header on the TLV list
3700cd7c01aSTomas Winkler  *
3710cd7c01aSTomas Winkler  * @ext: current extend header
3720cd7c01aSTomas Winkler  *
3730cd7c01aSTomas Winkler  * Context: The function does not check for the overflows,
3740cd7c01aSTomas Winkler  *          one should call mei_ext_last before.
3750cd7c01aSTomas Winkler  *
3760cd7c01aSTomas Winkler  * Return: The following extend header after @ext
3770cd7c01aSTomas Winkler  */
mei_ext_next(struct mei_ext_hdr * ext)3780cd7c01aSTomas Winkler static inline struct mei_ext_hdr *mei_ext_next(struct mei_ext_hdr *ext)
3790cd7c01aSTomas Winkler {
38040292383STomas Winkler 	return (struct mei_ext_hdr *)((u8 *)ext + (ext->length * 4));
3810cd7c01aSTomas Winkler }
3820cd7c01aSTomas Winkler 
3830cd7c01aSTomas Winkler /**
3844ed1cc99STomas Winkler  * mei_ext_hdr_len - get ext header length in bytes
3854ed1cc99STomas Winkler  *
3864ed1cc99STomas Winkler  * @ext: extend header
3874ed1cc99STomas Winkler  *
3884ed1cc99STomas Winkler  * Return: extend header length in bytes
3894ed1cc99STomas Winkler  */
mei_ext_hdr_len(const struct mei_ext_hdr * ext)3904ed1cc99STomas Winkler static inline u32 mei_ext_hdr_len(const struct mei_ext_hdr *ext)
3914ed1cc99STomas Winkler {
3924ed1cc99STomas Winkler 	if (!ext)
3934ed1cc99STomas Winkler 		return 0;
3944ed1cc99STomas Winkler 
3954ed1cc99STomas Winkler 	return ext->length * sizeof(u32);
3964ed1cc99STomas Winkler }
3974ed1cc99STomas Winkler 
3984ed1cc99STomas Winkler /**
3999d89ddfcSTomas Winkler  * struct mei_msg_hdr - MEI BUS Interface Section
4009d89ddfcSTomas Winkler  *
4019d89ddfcSTomas Winkler  * @me_addr: device address
4029d89ddfcSTomas Winkler  * @host_addr: host address
4039d89ddfcSTomas Winkler  * @length: message length
4049d89ddfcSTomas Winkler  * @reserved: reserved
4050cd7c01aSTomas Winkler  * @extended: message has extended header
4069d89ddfcSTomas Winkler  * @dma_ring: message is on dma ring
4079d89ddfcSTomas Winkler  * @internal: message is internal
4089d89ddfcSTomas Winkler  * @msg_complete: last packet of the message
4096316321fSTomas Winkler  * @extension: extension of the header
410ffc2825cSGreg Kroah-Hartman  */
411ffc2825cSGreg Kroah-Hartman struct mei_msg_hdr {
412ffc2825cSGreg Kroah-Hartman 	u32 me_addr:8;
413ffc2825cSGreg Kroah-Hartman 	u32 host_addr:8;
414ffc2825cSGreg Kroah-Hartman 	u32 length:9;
4150cd7c01aSTomas Winkler 	u32 reserved:3;
4160cd7c01aSTomas Winkler 	u32 extended:1;
4179d89ddfcSTomas Winkler 	u32 dma_ring:1;
418479327fcSTomas Winkler 	u32 internal:1;
419ffc2825cSGreg Kroah-Hartman 	u32 msg_complete:1;
420b21de80aSGustavo A. R. Silva 	u32 extension[];
421ffc2825cSGreg Kroah-Hartman } __packed;
422ffc2825cSGreg Kroah-Hartman 
4233aef021bSTomas Winkler /* The length is up to 9 bits */
4243aef021bSTomas Winkler #define MEI_MSG_MAX_LEN_MASK GENMASK(9, 0)
4253aef021bSTomas Winkler 
426ffc2825cSGreg Kroah-Hartman struct mei_bus_message {
427ffc2825cSGreg Kroah-Hartman 	u8 hbm_cmd;
428f490e8aeSGustavo A. R. Silva 	u8 data[];
429ffc2825cSGreg Kroah-Hartman } __packed;
430ffc2825cSGreg Kroah-Hartman 
431cd51ed64STomas Winkler /**
432cd51ed64STomas Winkler  * struct hbm_cl_cmd - client specific host bus command
433cd51ed64STomas Winkler  *	CONNECT, DISCONNECT, and FlOW CONTROL
434cd51ed64STomas Winkler  *
435a8605ea2SAlexander Usyskin  * @hbm_cmd: bus message command header
436a8605ea2SAlexander Usyskin  * @me_addr: address of the client in ME
437a8605ea2SAlexander Usyskin  * @host_addr: address of the client in the driver
438a8605ea2SAlexander Usyskin  * @data: generic data
439cd51ed64STomas Winkler  */
440cd51ed64STomas Winkler struct mei_hbm_cl_cmd {
441cd51ed64STomas Winkler 	u8 hbm_cmd;
442cd51ed64STomas Winkler 	u8 me_addr;
443cd51ed64STomas Winkler 	u8 host_addr;
444cd51ed64STomas Winkler 	u8 data;
445cd51ed64STomas Winkler };
446cd51ed64STomas Winkler 
447ffc2825cSGreg Kroah-Hartman struct hbm_version {
448ffc2825cSGreg Kroah-Hartman 	u8 minor_version;
449ffc2825cSGreg Kroah-Hartman 	u8 major_version;
450ffc2825cSGreg Kroah-Hartman } __packed;
451ffc2825cSGreg Kroah-Hartman 
452ffc2825cSGreg Kroah-Hartman struct hbm_host_version_request {
453ffc2825cSGreg Kroah-Hartman 	u8 hbm_cmd;
454ffc2825cSGreg Kroah-Hartman 	u8 reserved;
455ffc2825cSGreg Kroah-Hartman 	struct hbm_version host_version;
456ffc2825cSGreg Kroah-Hartman } __packed;
457ffc2825cSGreg Kroah-Hartman 
458ffc2825cSGreg Kroah-Hartman struct hbm_host_version_response {
459ffc2825cSGreg Kroah-Hartman 	u8 hbm_cmd;
460ffc2825cSGreg Kroah-Hartman 	u8 host_version_supported;
461ffc2825cSGreg Kroah-Hartman 	struct hbm_version me_max_version;
462ffc2825cSGreg Kroah-Hartman } __packed;
463ffc2825cSGreg Kroah-Hartman 
464ffc2825cSGreg Kroah-Hartman struct hbm_host_stop_request {
465ffc2825cSGreg Kroah-Hartman 	u8 hbm_cmd;
466ffc2825cSGreg Kroah-Hartman 	u8 reason;
467ffc2825cSGreg Kroah-Hartman 	u8 reserved[2];
468ffc2825cSGreg Kroah-Hartman } __packed;
469ffc2825cSGreg Kroah-Hartman 
470ffc2825cSGreg Kroah-Hartman struct hbm_host_stop_response {
471ffc2825cSGreg Kroah-Hartman 	u8 hbm_cmd;
472ffc2825cSGreg Kroah-Hartman 	u8 reserved[3];
473ffc2825cSGreg Kroah-Hartman } __packed;
474ffc2825cSGreg Kroah-Hartman 
475ffc2825cSGreg Kroah-Hartman struct hbm_me_stop_request {
476ffc2825cSGreg Kroah-Hartman 	u8 hbm_cmd;
477ffc2825cSGreg Kroah-Hartman 	u8 reason;
478ffc2825cSGreg Kroah-Hartman 	u8 reserved[2];
479ffc2825cSGreg Kroah-Hartman } __packed;
480ffc2825cSGreg Kroah-Hartman 
48170ef835cSTomas Winkler /**
48227f476eaSAlexander Usyskin  * enum hbm_host_enum_flags - enumeration request flags (HBM version >= 2.0)
48327f476eaSAlexander Usyskin  *
48427f476eaSAlexander Usyskin  * @MEI_HBM_ENUM_F_ALLOW_ADD: allow dynamic clients add
48527f476eaSAlexander Usyskin  * @MEI_HBM_ENUM_F_IMMEDIATE_ENUM: allow FW to send answer immediately
48627f476eaSAlexander Usyskin  */
48727f476eaSAlexander Usyskin enum hbm_host_enum_flags {
48827f476eaSAlexander Usyskin 	MEI_HBM_ENUM_F_ALLOW_ADD = BIT(0),
48927f476eaSAlexander Usyskin 	MEI_HBM_ENUM_F_IMMEDIATE_ENUM = BIT(1),
49027f476eaSAlexander Usyskin };
49127f476eaSAlexander Usyskin 
49227f476eaSAlexander Usyskin /**
49370ef835cSTomas Winkler  * struct hbm_host_enum_request - enumeration request from host to fw
49470ef835cSTomas Winkler  *
49570ef835cSTomas Winkler  * @hbm_cmd : bus message command header
49627f476eaSAlexander Usyskin  * @flags   : request flags
49770ef835cSTomas Winkler  * @reserved: reserved
49870ef835cSTomas Winkler  */
499ffc2825cSGreg Kroah-Hartman struct hbm_host_enum_request {
500ffc2825cSGreg Kroah-Hartman 	u8 hbm_cmd;
50127f476eaSAlexander Usyskin 	u8 flags;
50270ef835cSTomas Winkler 	u8 reserved[2];
503ffc2825cSGreg Kroah-Hartman } __packed;
504ffc2825cSGreg Kroah-Hartman 
505ffc2825cSGreg Kroah-Hartman struct hbm_host_enum_response {
506ffc2825cSGreg Kroah-Hartman 	u8 hbm_cmd;
507ffc2825cSGreg Kroah-Hartman 	u8 reserved[3];
508ffc2825cSGreg Kroah-Hartman 	u8 valid_addresses[32];
509ffc2825cSGreg Kroah-Hartman } __packed;
510ffc2825cSGreg Kroah-Hartman 
5112dd1e5aeSAlexander Usyskin /**
5122dd1e5aeSAlexander Usyskin  * struct mei_client_properties - mei client properties
5132dd1e5aeSAlexander Usyskin  *
5142dd1e5aeSAlexander Usyskin  * @protocol_name: guid of the client
5152dd1e5aeSAlexander Usyskin  * @protocol_version: client protocol version
5162dd1e5aeSAlexander Usyskin  * @max_number_of_connections: number of possible connections.
5172dd1e5aeSAlexander Usyskin  * @fixed_address: fixed me address (0 if the client is dynamic)
5182dd1e5aeSAlexander Usyskin  * @single_recv_buf: 1 if all connections share a single receive buffer.
5192dd1e5aeSAlexander Usyskin  * @vt_supported: the client support vtag
5202dd1e5aeSAlexander Usyskin  * @reserved: reserved
5212dd1e5aeSAlexander Usyskin  * @max_msg_length: MTU of the client
5222dd1e5aeSAlexander Usyskin  */
523ffc2825cSGreg Kroah-Hartman struct mei_client_properties {
524ffc2825cSGreg Kroah-Hartman 	uuid_le protocol_name;
525ffc2825cSGreg Kroah-Hartman 	u8 protocol_version;
526ffc2825cSGreg Kroah-Hartman 	u8 max_number_of_connections;
527ffc2825cSGreg Kroah-Hartman 	u8 fixed_address;
5284ad84cb5SAlexander Usyskin 	u8 single_recv_buf:1;
5292dd1e5aeSAlexander Usyskin 	u8 vt_supported:1;
5302dd1e5aeSAlexander Usyskin 	u8 reserved:6;
531ffc2825cSGreg Kroah-Hartman 	u32 max_msg_length;
532ffc2825cSGreg Kroah-Hartman } __packed;
533ffc2825cSGreg Kroah-Hartman 
534ffc2825cSGreg Kroah-Hartman struct hbm_props_request {
535ffc2825cSGreg Kroah-Hartman 	u8 hbm_cmd;
5363438c1f3STomas Winkler 	u8 me_addr;
537ffc2825cSGreg Kroah-Hartman 	u8 reserved[2];
538ffc2825cSGreg Kroah-Hartman } __packed;
539ffc2825cSGreg Kroah-Hartman 
540ffc2825cSGreg Kroah-Hartman struct hbm_props_response {
541ffc2825cSGreg Kroah-Hartman 	u8 hbm_cmd;
5423438c1f3STomas Winkler 	u8 me_addr;
543ffc2825cSGreg Kroah-Hartman 	u8 status;
54492ca3dd4STomas Winkler 	u8 reserved;
545ffc2825cSGreg Kroah-Hartman 	struct mei_client_properties client_properties;
546ffc2825cSGreg Kroah-Hartman } __packed;
547ffc2825cSGreg Kroah-Hartman 
548aeba4a06STomas Winkler /**
54970ef835cSTomas Winkler  * struct hbm_add_client_request - request to add a client
55070ef835cSTomas Winkler  *     might be sent by fw after enumeration has already completed
55170ef835cSTomas Winkler  *
55270ef835cSTomas Winkler  * @hbm_cmd: bus message command header
55370ef835cSTomas Winkler  * @me_addr: address of the client in ME
55470ef835cSTomas Winkler  * @reserved: reserved
55570ef835cSTomas Winkler  * @client_properties: client properties
55670ef835cSTomas Winkler  */
55770ef835cSTomas Winkler struct hbm_add_client_request {
55870ef835cSTomas Winkler 	u8 hbm_cmd;
55970ef835cSTomas Winkler 	u8 me_addr;
56070ef835cSTomas Winkler 	u8 reserved[2];
56170ef835cSTomas Winkler 	struct mei_client_properties client_properties;
56270ef835cSTomas Winkler } __packed;
56370ef835cSTomas Winkler 
56470ef835cSTomas Winkler /**
56570ef835cSTomas Winkler  * struct hbm_add_client_response - response to add a client
56670ef835cSTomas Winkler  *     sent by the host to report client addition status to fw
56770ef835cSTomas Winkler  *
56870ef835cSTomas Winkler  * @hbm_cmd: bus message command header
56970ef835cSTomas Winkler  * @me_addr: address of the client in ME
57070ef835cSTomas Winkler  * @status: if HBMS_SUCCESS then the client can now accept connections.
571e24ca925SGreg Kroah-Hartman  * @reserved: reserved
57270ef835cSTomas Winkler  */
57370ef835cSTomas Winkler struct hbm_add_client_response {
57470ef835cSTomas Winkler 	u8 hbm_cmd;
57570ef835cSTomas Winkler 	u8 me_addr;
57670ef835cSTomas Winkler 	u8 status;
57792ca3dd4STomas Winkler 	u8 reserved;
57870ef835cSTomas Winkler } __packed;
57970ef835cSTomas Winkler 
58070ef835cSTomas Winkler /**
5814fcbc99bSTomas Winkler  * struct hbm_power_gate - power gate request/response
5824fcbc99bSTomas Winkler  *
583a8605ea2SAlexander Usyskin  * @hbm_cmd: bus message command header
584a8605ea2SAlexander Usyskin  * @reserved: reserved
5854fcbc99bSTomas Winkler  */
5864fcbc99bSTomas Winkler struct hbm_power_gate {
5874fcbc99bSTomas Winkler 	u8 hbm_cmd;
5884fcbc99bSTomas Winkler 	u8 reserved[3];
5894fcbc99bSTomas Winkler } __packed;
5904fcbc99bSTomas Winkler 
5914fcbc99bSTomas Winkler /**
592aeba4a06STomas Winkler  * struct hbm_client_connect_request - connect/disconnect request
593aeba4a06STomas Winkler  *
594a8605ea2SAlexander Usyskin  * @hbm_cmd: bus message command header
595a8605ea2SAlexander Usyskin  * @me_addr: address of the client in ME
596a8605ea2SAlexander Usyskin  * @host_addr: address of the client in the driver
597a8605ea2SAlexander Usyskin  * @reserved: reserved
598aeba4a06STomas Winkler  */
599ffc2825cSGreg Kroah-Hartman struct hbm_client_connect_request {
600ffc2825cSGreg Kroah-Hartman 	u8 hbm_cmd;
601ffc2825cSGreg Kroah-Hartman 	u8 me_addr;
602ffc2825cSGreg Kroah-Hartman 	u8 host_addr;
603ffc2825cSGreg Kroah-Hartman 	u8 reserved;
604ffc2825cSGreg Kroah-Hartman } __packed;
605ffc2825cSGreg Kroah-Hartman 
606aeba4a06STomas Winkler /**
607aeba4a06STomas Winkler  * struct hbm_client_connect_response - connect/disconnect response
608aeba4a06STomas Winkler  *
609a8605ea2SAlexander Usyskin  * @hbm_cmd: bus message command header
610a8605ea2SAlexander Usyskin  * @me_addr: address of the client in ME
611a8605ea2SAlexander Usyskin  * @host_addr: address of the client in the driver
612a8605ea2SAlexander Usyskin  * @status: status of the request
613aeba4a06STomas Winkler  */
614ffc2825cSGreg Kroah-Hartman struct hbm_client_connect_response {
615ffc2825cSGreg Kroah-Hartman 	u8 hbm_cmd;
616ffc2825cSGreg Kroah-Hartman 	u8 me_addr;
617ffc2825cSGreg Kroah-Hartman 	u8 host_addr;
618ffc2825cSGreg Kroah-Hartman 	u8 status;
619ffc2825cSGreg Kroah-Hartman } __packed;
620ffc2825cSGreg Kroah-Hartman 
621ffc2825cSGreg Kroah-Hartman 
622ffc2825cSGreg Kroah-Hartman #define MEI_FC_MESSAGE_RESERVED_LENGTH           5
623ffc2825cSGreg Kroah-Hartman 
624ffc2825cSGreg Kroah-Hartman struct hbm_flow_control {
625ffc2825cSGreg Kroah-Hartman 	u8 hbm_cmd;
626ffc2825cSGreg Kroah-Hartman 	u8 me_addr;
627ffc2825cSGreg Kroah-Hartman 	u8 host_addr;
628ffc2825cSGreg Kroah-Hartman 	u8 reserved[MEI_FC_MESSAGE_RESERVED_LENGTH];
629ffc2825cSGreg Kroah-Hartman } __packed;
630ffc2825cSGreg Kroah-Hartman 
631d3c1c809STomas Winkler #define MEI_HBM_NOTIFICATION_START 1
632d3c1c809STomas Winkler #define MEI_HBM_NOTIFICATION_STOP  0
633d3c1c809STomas Winkler /**
634d3c1c809STomas Winkler  * struct hbm_notification_request - start/stop notification request
635d3c1c809STomas Winkler  *
636d3c1c809STomas Winkler  * @hbm_cmd: bus message command header
637d3c1c809STomas Winkler  * @me_addr: address of the client in ME
638d3c1c809STomas Winkler  * @host_addr: address of the client in the driver
639d3c1c809STomas Winkler  * @start:  start = 1 or stop = 0 asynchronous notifications
640d3c1c809STomas Winkler  */
641d3c1c809STomas Winkler struct hbm_notification_request {
642d3c1c809STomas Winkler 	u8 hbm_cmd;
643d3c1c809STomas Winkler 	u8 me_addr;
644d3c1c809STomas Winkler 	u8 host_addr;
645d3c1c809STomas Winkler 	u8 start;
646d3c1c809STomas Winkler } __packed;
647d3c1c809STomas Winkler 
648d3c1c809STomas Winkler /**
649d3c1c809STomas Winkler  * struct hbm_notification_response - start/stop notification response
650d3c1c809STomas Winkler  *
651d3c1c809STomas Winkler  * @hbm_cmd: bus message command header
652d3c1c809STomas Winkler  * @me_addr: address of the client in ME
653d3c1c809STomas Winkler  * @host_addr: - address of the client in the driver
654d3c1c809STomas Winkler  * @status: (mei_hbm_status) response status for the request
655d3c1c809STomas Winkler  *  - MEI_HBMS_SUCCESS: successful stop/start
656d3c1c809STomas Winkler  *  - MEI_HBMS_CLIENT_NOT_FOUND: if the connection could not be found.
657d3c1c809STomas Winkler  *  - MEI_HBMS_ALREADY_STARTED: for start requests for a previously
658d3c1c809STomas Winkler  *                         started notification.
659d3c1c809STomas Winkler  *  - MEI_HBMS_NOT_STARTED: for stop request for a connected client for whom
660d3c1c809STomas Winkler  *                         asynchronous notifications are currently disabled.
661d3c1c809STomas Winkler  *
662d3c1c809STomas Winkler  * @start:  start = 1 or stop = 0 asynchronous notifications
663d3c1c809STomas Winkler  * @reserved: reserved
664d3c1c809STomas Winkler  */
665d3c1c809STomas Winkler struct hbm_notification_response {
666d3c1c809STomas Winkler 	u8 hbm_cmd;
667d3c1c809STomas Winkler 	u8 me_addr;
668d3c1c809STomas Winkler 	u8 host_addr;
669d3c1c809STomas Winkler 	u8 status;
670d3c1c809STomas Winkler 	u8 start;
671d3c1c809STomas Winkler 	u8 reserved[3];
672d3c1c809STomas Winkler } __packed;
673d3c1c809STomas Winkler 
674d3c1c809STomas Winkler /**
675d3c1c809STomas Winkler  * struct hbm_notification - notification event
676d3c1c809STomas Winkler  *
677d3c1c809STomas Winkler  * @hbm_cmd: bus message command header
678d3c1c809STomas Winkler  * @me_addr:  address of the client in ME
679d3c1c809STomas Winkler  * @host_addr:  address of the client in the driver
680d3c1c809STomas Winkler  * @reserved: reserved for alignment
681d3c1c809STomas Winkler  */
682d3c1c809STomas Winkler struct hbm_notification {
683d3c1c809STomas Winkler 	u8 hbm_cmd;
684d3c1c809STomas Winkler 	u8 me_addr;
685d3c1c809STomas Winkler 	u8 host_addr;
68692ca3dd4STomas Winkler 	u8 reserved;
687d3c1c809STomas Winkler } __packed;
688ffc2825cSGreg Kroah-Hartman 
689ee7aba5aSTomas Winkler /**
690ee7aba5aSTomas Winkler  * struct hbm_dma_mem_dscr - dma ring
691ee7aba5aSTomas Winkler  *
692ee7aba5aSTomas Winkler  * @addr_hi: the high 32bits of 64 bit address
693ee7aba5aSTomas Winkler  * @addr_lo: the low  32bits of 64 bit address
694ee7aba5aSTomas Winkler  * @size   : size in bytes (must be power of 2)
695ee7aba5aSTomas Winkler  */
696ee7aba5aSTomas Winkler struct hbm_dma_mem_dscr {
697ee7aba5aSTomas Winkler 	u32 addr_hi;
698ee7aba5aSTomas Winkler 	u32 addr_lo;
699ee7aba5aSTomas Winkler 	u32 size;
700ee7aba5aSTomas Winkler } __packed;
701ee7aba5aSTomas Winkler 
702ee7aba5aSTomas Winkler enum {
703ee7aba5aSTomas Winkler 	DMA_DSCR_HOST = 0,
704ee7aba5aSTomas Winkler 	DMA_DSCR_DEVICE = 1,
705ee7aba5aSTomas Winkler 	DMA_DSCR_CTRL = 2,
706ee7aba5aSTomas Winkler 	DMA_DSCR_NUM,
707ee7aba5aSTomas Winkler };
708ee7aba5aSTomas Winkler 
709ee7aba5aSTomas Winkler /**
710ee7aba5aSTomas Winkler  * struct hbm_dma_setup_request - dma setup request
711ee7aba5aSTomas Winkler  *
712ee7aba5aSTomas Winkler  * @hbm_cmd: bus message command header
713ee7aba5aSTomas Winkler  * @reserved: reserved for alignment
714ee7aba5aSTomas Winkler  * @dma_dscr: dma descriptor for HOST, DEVICE, and CTRL
715ee7aba5aSTomas Winkler  */
716ee7aba5aSTomas Winkler struct hbm_dma_setup_request {
717ee7aba5aSTomas Winkler 	u8 hbm_cmd;
718ee7aba5aSTomas Winkler 	u8 reserved[3];
719ee7aba5aSTomas Winkler 	struct hbm_dma_mem_dscr dma_dscr[DMA_DSCR_NUM];
720ee7aba5aSTomas Winkler } __packed;
721ee7aba5aSTomas Winkler 
722ee7aba5aSTomas Winkler /**
723ee7aba5aSTomas Winkler  * struct hbm_dma_setup_response - dma setup response
724ee7aba5aSTomas Winkler  *
725ee7aba5aSTomas Winkler  * @hbm_cmd: bus message command header
726ee7aba5aSTomas Winkler  * @status: 0 on success; otherwise DMA setup failed.
727ee7aba5aSTomas Winkler  * @reserved: reserved for alignment
728ee7aba5aSTomas Winkler  */
729ee7aba5aSTomas Winkler struct hbm_dma_setup_response {
730ee7aba5aSTomas Winkler 	u8 hbm_cmd;
731ee7aba5aSTomas Winkler 	u8 status;
732ee7aba5aSTomas Winkler 	u8 reserved[2];
733ee7aba5aSTomas Winkler } __packed;
734ee7aba5aSTomas Winkler 
7352513eb0dSTomas Winkler /**
7362513eb0dSTomas Winkler  * struct mei_dma_ring_ctrl - dma ring control block
7372513eb0dSTomas Winkler  *
7382513eb0dSTomas Winkler  * @hbuf_wr_idx: host circular buffer write index in slots
7392513eb0dSTomas Winkler  * @reserved1: reserved for alignment
7402513eb0dSTomas Winkler  * @hbuf_rd_idx: host circular buffer read index in slots
7412513eb0dSTomas Winkler  * @reserved2: reserved for alignment
7422513eb0dSTomas Winkler  * @dbuf_wr_idx: device circular buffer write index in slots
7432513eb0dSTomas Winkler  * @reserved3: reserved for alignment
7442513eb0dSTomas Winkler  * @dbuf_rd_idx: device circular buffer read index in slots
7452513eb0dSTomas Winkler  * @reserved4: reserved for alignment
7462513eb0dSTomas Winkler  */
7472513eb0dSTomas Winkler struct hbm_dma_ring_ctrl {
7482513eb0dSTomas Winkler 	u32 hbuf_wr_idx;
7492513eb0dSTomas Winkler 	u32 reserved1;
7502513eb0dSTomas Winkler 	u32 hbuf_rd_idx;
7512513eb0dSTomas Winkler 	u32 reserved2;
7522513eb0dSTomas Winkler 	u32 dbuf_wr_idx;
7532513eb0dSTomas Winkler 	u32 reserved3;
7542513eb0dSTomas Winkler 	u32 dbuf_rd_idx;
7552513eb0dSTomas Winkler 	u32 reserved4;
7562513eb0dSTomas Winkler } __packed;
7572513eb0dSTomas Winkler 
758beb4e1e5SAlexander Usyskin /* virtual tag supported */
759beb4e1e5SAlexander Usyskin #define HBM_CAP_VT BIT(0)
7604ed1cc99STomas Winkler 
7614ed1cc99STomas Winkler /* gsc extended header support */
7624ed1cc99STomas Winkler #define HBM_CAP_GSC BIT(1)
7634ed1cc99STomas Winkler 
764b7a48041SAlexander Usyskin /* client dma supported */
765b7a48041SAlexander Usyskin #define HBM_CAP_CD BIT(2)
766beb4e1e5SAlexander Usyskin 
767e5cab1f9SAlexander Usyskin /**
768e5cab1f9SAlexander Usyskin  * struct hbm_capability_request - capability request from host to fw
769e5cab1f9SAlexander Usyskin  *
770e5cab1f9SAlexander Usyskin  * @hbm_cmd : bus message command header
771e5cab1f9SAlexander Usyskin  * @capability_requested: bitmask of capabilities requested by host
772e5cab1f9SAlexander Usyskin  */
773e5cab1f9SAlexander Usyskin struct hbm_capability_request {
774e5cab1f9SAlexander Usyskin 	u8 hbm_cmd;
775e5cab1f9SAlexander Usyskin 	u8 capability_requested[3];
776e5cab1f9SAlexander Usyskin } __packed;
777e5cab1f9SAlexander Usyskin 
778e5cab1f9SAlexander Usyskin /**
779e5cab1f9SAlexander Usyskin  * struct hbm_capability_response - capability response from fw to host
780e5cab1f9SAlexander Usyskin  *
781e5cab1f9SAlexander Usyskin  * @hbm_cmd : bus message command header
782e5cab1f9SAlexander Usyskin  * @capability_granted: bitmask of capabilities granted by FW
783e5cab1f9SAlexander Usyskin  */
784e5cab1f9SAlexander Usyskin struct hbm_capability_response {
785e5cab1f9SAlexander Usyskin 	u8 hbm_cmd;
786e5cab1f9SAlexander Usyskin 	u8 capability_granted[3];
787e5cab1f9SAlexander Usyskin } __packed;
788e5cab1f9SAlexander Usyskin 
789dfad8742SAlexander Usyskin /**
790dfad8742SAlexander Usyskin  * struct hbm_client_dma_map_request - client dma map request from host to fw
791dfad8742SAlexander Usyskin  *
792dfad8742SAlexander Usyskin  * @hbm_cmd: bus message command header
793dfad8742SAlexander Usyskin  * @client_buffer_id: client buffer id
794dfad8742SAlexander Usyskin  * @reserved: reserved
795dfad8742SAlexander Usyskin  * @address_lsb: DMA address LSB
796dfad8742SAlexander Usyskin  * @address_msb: DMA address MSB
797dfad8742SAlexander Usyskin  * @size: DMA size
798dfad8742SAlexander Usyskin  */
799dfad8742SAlexander Usyskin struct hbm_client_dma_map_request {
800dfad8742SAlexander Usyskin 	u8 hbm_cmd;
801dfad8742SAlexander Usyskin 	u8 client_buffer_id;
802dfad8742SAlexander Usyskin 	u8 reserved[2];
803dfad8742SAlexander Usyskin 	u32 address_lsb;
804dfad8742SAlexander Usyskin 	u32 address_msb;
805dfad8742SAlexander Usyskin 	u32 size;
806dfad8742SAlexander Usyskin } __packed;
807dfad8742SAlexander Usyskin 
808dfad8742SAlexander Usyskin /**
809dfad8742SAlexander Usyskin  * struct hbm_client_dma_unmap_request
810dfad8742SAlexander Usyskin  *    client dma unmap request from the host to the firmware
811dfad8742SAlexander Usyskin  *
812dfad8742SAlexander Usyskin  * @hbm_cmd: bus message command header
813dfad8742SAlexander Usyskin  * @status: unmap status
814dfad8742SAlexander Usyskin  * @client_buffer_id: client buffer id
815dfad8742SAlexander Usyskin  * @reserved: reserved
816dfad8742SAlexander Usyskin  */
817dfad8742SAlexander Usyskin struct hbm_client_dma_unmap_request {
818dfad8742SAlexander Usyskin 	u8 hbm_cmd;
819dfad8742SAlexander Usyskin 	u8 status;
820dfad8742SAlexander Usyskin 	u8 client_buffer_id;
821dfad8742SAlexander Usyskin 	u8 reserved;
822dfad8742SAlexander Usyskin } __packed;
823dfad8742SAlexander Usyskin 
824dfad8742SAlexander Usyskin /**
825dfad8742SAlexander Usyskin  * struct hbm_client_dma_response
826dfad8742SAlexander Usyskin  *   client dma unmap response from the firmware to the host
827dfad8742SAlexander Usyskin  *
828dfad8742SAlexander Usyskin  * @hbm_cmd: bus message command header
829dfad8742SAlexander Usyskin  * @status: command status
830dfad8742SAlexander Usyskin  */
831dfad8742SAlexander Usyskin struct hbm_client_dma_response {
832dfad8742SAlexander Usyskin 	u8 hbm_cmd;
833dfad8742SAlexander Usyskin 	u8 status;
834dfad8742SAlexander Usyskin } __packed;
835dfad8742SAlexander Usyskin 
836ffc2825cSGreg Kroah-Hartman #endif
837