xref: /linux/drivers/misc/issei/hw_msg.h (revision 93e4b3076b5f2d853462b9777d083c77fc0b7b23)
1*65f0ecb9SAlexander Usyskin /* SPDX-License-Identifier: GPL-2.0 */
2*65f0ecb9SAlexander Usyskin /* Copyright (C) 2023-2026 Intel Corporation */
3*65f0ecb9SAlexander Usyskin #ifndef _ISSEI_HW_MSG_H_
4*65f0ecb9SAlexander Usyskin #define _ISSEI_HW_MSG_H_
5*65f0ecb9SAlexander Usyskin 
6*65f0ecb9SAlexander Usyskin #include <linux/types.h>
7*65f0ecb9SAlexander Usyskin #include <linux/uuid.h>
8*65f0ecb9SAlexander Usyskin 
9*65f0ecb9SAlexander Usyskin #define HAM_CB_MESSAGE_ID_REQ	0x8086cafe
10*65f0ecb9SAlexander Usyskin #define HAM_CB_MESSAGE_ID_RES	0xcafe8086
11*65f0ecb9SAlexander Usyskin #define HAM_CB_MESSAGE_VER	0x1
12*65f0ecb9SAlexander Usyskin 
13*65f0ecb9SAlexander Usyskin /**
14*65f0ecb9SAlexander Usyskin  * struct ham_setup_shared_memory_req - shared memory setup request
15*65f0ecb9SAlexander Usyskin  * @msg_id: message id, should be %HAM_CB_MESSAGE_ID_REQ
16*65f0ecb9SAlexander Usyskin  * @ver: message version (%HAM_CB_MESSAGE_VER)
17*65f0ecb9SAlexander Usyskin  * @reserved: reserved
18*65f0ecb9SAlexander Usyskin  * @buffer_physical_address: physical address of DMA buffer
19*65f0ecb9SAlexander Usyskin  * @host_to_fw_section_length: memory size for host to fw communication
20*65f0ecb9SAlexander Usyskin  * @fw_to_host_section_length: memory size for fw to host communication
21*65f0ecb9SAlexander Usyskin  * @control_length: memory size for control buffer
22*65f0ecb9SAlexander Usyskin  */
23*65f0ecb9SAlexander Usyskin struct ham_setup_shared_memory_req {
24*65f0ecb9SAlexander Usyskin 	u32 msg_id;
25*65f0ecb9SAlexander Usyskin 	u16 ver;
26*65f0ecb9SAlexander Usyskin 	u16 reserved;
27*65f0ecb9SAlexander Usyskin 	u64 buffer_physical_address;
28*65f0ecb9SAlexander Usyskin 	u32 host_to_fw_section_length;
29*65f0ecb9SAlexander Usyskin 	u32 fw_to_host_section_length;
30*65f0ecb9SAlexander Usyskin 	u32 control_length;
31*65f0ecb9SAlexander Usyskin } __packed __aligned(4);
32*65f0ecb9SAlexander Usyskin 
33*65f0ecb9SAlexander Usyskin /**
34*65f0ecb9SAlexander Usyskin  * struct ham_setup_shared_memory_res - shared memory setup response
35*65f0ecb9SAlexander Usyskin  * @msg_id: message id, should be %HAM_CB_MESSAGE_ID_RES
36*65f0ecb9SAlexander Usyskin  * @status: operation status
37*65f0ecb9SAlexander Usyskin  */
38*65f0ecb9SAlexander Usyskin struct ham_setup_shared_memory_res {
39*65f0ecb9SAlexander Usyskin 	u32 msg_id;
40*65f0ecb9SAlexander Usyskin 	u32 status;
41*65f0ecb9SAlexander Usyskin };
42*65f0ecb9SAlexander Usyskin 
43*65f0ecb9SAlexander Usyskin /**
44*65f0ecb9SAlexander Usyskin  * struct control_buffer - control buffer structure
45*65f0ecb9SAlexander Usyskin  * @h2f_counter_wr: write counter host to fw
46*65f0ecb9SAlexander Usyskin  * @h2f_counter_rd: read counter host to fw
47*65f0ecb9SAlexander Usyskin  * @f2h_counter_wr: write counter fw to host
48*65f0ecb9SAlexander Usyskin  * @f2h_counter_rd: read counter fw to host
49*65f0ecb9SAlexander Usyskin  */
50*65f0ecb9SAlexander Usyskin struct control_buffer {
51*65f0ecb9SAlexander Usyskin 	u32 h2f_counter_wr;
52*65f0ecb9SAlexander Usyskin 	u32 h2f_counter_rd;
53*65f0ecb9SAlexander Usyskin 	u32 f2h_counter_wr;
54*65f0ecb9SAlexander Usyskin 	u32 f2h_counter_rd;
55*65f0ecb9SAlexander Usyskin };
56*65f0ecb9SAlexander Usyskin 
57*65f0ecb9SAlexander Usyskin /* HAM messages over DMA */
58*65f0ecb9SAlexander Usyskin 
59*65f0ecb9SAlexander Usyskin /**
60*65f0ecb9SAlexander Usyskin  * struct ham_message_header - message header over DMA
61*65f0ecb9SAlexander Usyskin  * @length: message length (payload only, not including header)
62*65f0ecb9SAlexander Usyskin  * @fw_id: firmware client id (0 means Bus Message)
63*65f0ecb9SAlexander Usyskin  * @host_id: host client id (0 means Bus Message)
64*65f0ecb9SAlexander Usyskin  * @flags: message flags
65*65f0ecb9SAlexander Usyskin  * @status: operation status
66*65f0ecb9SAlexander Usyskin  * @reserved: reserved
67*65f0ecb9SAlexander Usyskin  */
68*65f0ecb9SAlexander Usyskin struct ham_message_header {
69*65f0ecb9SAlexander Usyskin 	u32 length;
70*65f0ecb9SAlexander Usyskin 	u16 fw_id;
71*65f0ecb9SAlexander Usyskin 	u16 host_id;
72*65f0ecb9SAlexander Usyskin 	u32 flags;
73*65f0ecb9SAlexander Usyskin 	u32 status;
74*65f0ecb9SAlexander Usyskin 	u32 reserved;
75*65f0ecb9SAlexander Usyskin };
76*65f0ecb9SAlexander Usyskin 
77*65f0ecb9SAlexander Usyskin /* Bus Commands */
78*65f0ecb9SAlexander Usyskin #define HAM_BUS_CMD_START_REQ 0x00
79*65f0ecb9SAlexander Usyskin #define HAM_BUS_CMD_START_RSP 0x80
80*65f0ecb9SAlexander Usyskin #define HAM_BUS_CMD_CLIENT_REQ 0x01
81*65f0ecb9SAlexander Usyskin #define HAM_BUS_CMD_CLIENT_RSP 0x81
82*65f0ecb9SAlexander Usyskin 
83*65f0ecb9SAlexander Usyskin /**
84*65f0ecb9SAlexander Usyskin  * struct ham_bus_message - bus message header
85*65f0ecb9SAlexander Usyskin  * @cmd: command code
86*65f0ecb9SAlexander Usyskin  */
87*65f0ecb9SAlexander Usyskin struct ham_bus_message {
88*65f0ecb9SAlexander Usyskin 	u32 cmd;
89*65f0ecb9SAlexander Usyskin };
90*65f0ecb9SAlexander Usyskin 
91*65f0ecb9SAlexander Usyskin #define HAM_SUPPORTED_VERSION 0x01
92*65f0ecb9SAlexander Usyskin 
93*65f0ecb9SAlexander Usyskin /**
94*65f0ecb9SAlexander Usyskin  * struct ham_start_message_req - start message
95*65f0ecb9SAlexander Usyskin  * @header: bus message header (%HAM_BUS_CMD_START_REQ)
96*65f0ecb9SAlexander Usyskin  * @supported_version: supported protocol version
97*65f0ecb9SAlexander Usyskin  * @heci_capabilities_length: protocol capabilities length in bytes
98*65f0ecb9SAlexander Usyskin  * @heci_capabilities: protocol capabilities data
99*65f0ecb9SAlexander Usyskin  */
100*65f0ecb9SAlexander Usyskin struct ham_start_message_req {
101*65f0ecb9SAlexander Usyskin 	struct ham_bus_message header;
102*65f0ecb9SAlexander Usyskin 	u16 supported_version;
103*65f0ecb9SAlexander Usyskin 	u8 heci_capabilities_length;
104*65f0ecb9SAlexander Usyskin 	u8 heci_capabilities[] __counted_by(heci_capabilities_length);
105*65f0ecb9SAlexander Usyskin } __packed;
106*65f0ecb9SAlexander Usyskin 
107*65f0ecb9SAlexander Usyskin /**
108*65f0ecb9SAlexander Usyskin  * struct ham_start_message_res - start message response
109*65f0ecb9SAlexander Usyskin  * @header: bus message header (%HAM_BUS_CMD_START_RSP)
110*65f0ecb9SAlexander Usyskin  * @fw_version: firmware version (four u16 blocks)
111*65f0ecb9SAlexander Usyskin  * @supported_version: supported protocol version
112*65f0ecb9SAlexander Usyskin  * @heci_capabilities_length: protocol capabilities length in bytes
113*65f0ecb9SAlexander Usyskin  * @heci_capabilities: protocol capabilities data
114*65f0ecb9SAlexander Usyskin  */
115*65f0ecb9SAlexander Usyskin struct ham_start_message_res {
116*65f0ecb9SAlexander Usyskin 	struct ham_bus_message header;
117*65f0ecb9SAlexander Usyskin 	u16 fw_version[4];
118*65f0ecb9SAlexander Usyskin 	u16 supported_version;
119*65f0ecb9SAlexander Usyskin 	u8 heci_capabilities_length;
120*65f0ecb9SAlexander Usyskin 	u8 heci_capabilities[] __counted_by(heci_capabilities_length);
121*65f0ecb9SAlexander Usyskin } __packed;
122*65f0ecb9SAlexander Usyskin 
123*65f0ecb9SAlexander Usyskin /**
124*65f0ecb9SAlexander Usyskin  * struct ham_get_clients_req - clients list request
125*65f0ecb9SAlexander Usyskin  * @header: bus message header (%HAM_BUS_CMD_CLIENT_REQ)
126*65f0ecb9SAlexander Usyskin  */
127*65f0ecb9SAlexander Usyskin struct ham_get_clients_req {
128*65f0ecb9SAlexander Usyskin 	struct ham_bus_message header;
129*65f0ecb9SAlexander Usyskin };
130*65f0ecb9SAlexander Usyskin 
131*65f0ecb9SAlexander Usyskin /**
132*65f0ecb9SAlexander Usyskin  * struct ham_client_properties - single client properties
133*65f0ecb9SAlexander Usyskin  * @client_number: client id in firmware
134*65f0ecb9SAlexander Usyskin  * @protocol_ver: client protocol version
135*65f0ecb9SAlexander Usyskin  * @reserved: reserved
136*65f0ecb9SAlexander Usyskin  * @client_uuid: protocol name (UUID)
137*65f0ecb9SAlexander Usyskin  * @client_mtu: max message length supported by client
138*65f0ecb9SAlexander Usyskin  * @flags: client flags
139*65f0ecb9SAlexander Usyskin  */
140*65f0ecb9SAlexander Usyskin struct ham_client_properties {
141*65f0ecb9SAlexander Usyskin 	u16 client_number;
142*65f0ecb9SAlexander Usyskin 	u8 protocol_ver;
143*65f0ecb9SAlexander Usyskin 	u8 reserved;
144*65f0ecb9SAlexander Usyskin 	uuid_t client_uuid;
145*65f0ecb9SAlexander Usyskin 	u32 client_mtu;
146*65f0ecb9SAlexander Usyskin 	u32 flags;
147*65f0ecb9SAlexander Usyskin };
148*65f0ecb9SAlexander Usyskin 
149*65f0ecb9SAlexander Usyskin /**
150*65f0ecb9SAlexander Usyskin  * struct ham_get_clients_res - client properties response
151*65f0ecb9SAlexander Usyskin  * @header: bus message header (%HAM_BUS_CMD_CLIENT_RSP)
152*65f0ecb9SAlexander Usyskin  * @client_count: number of clients in firmware
153*65f0ecb9SAlexander Usyskin  * @reserved: reserved
154*65f0ecb9SAlexander Usyskin  * @clients_props: list of client properties
155*65f0ecb9SAlexander Usyskin  */
156*65f0ecb9SAlexander Usyskin struct ham_get_clients_res {
157*65f0ecb9SAlexander Usyskin 	struct ham_bus_message header;
158*65f0ecb9SAlexander Usyskin 	u16 client_count;
159*65f0ecb9SAlexander Usyskin 	u16 reserved;
160*65f0ecb9SAlexander Usyskin 	struct ham_client_properties clients_props[] __counted_by(client_count);
161*65f0ecb9SAlexander Usyskin };
162*65f0ecb9SAlexander Usyskin 
163*65f0ecb9SAlexander Usyskin #endif /* _ISSEI_HW_MSG_H_ */
164