Commit | Line | Data |
---|---|---|
90e0b5f1 TW |
1 | /* |
2 | * | |
3 | * Intel Management Engine Interface (Intel MEI) Linux driver | |
4 | * Copyright (c) 2003-2012, Intel Corporation. | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify it | |
7 | * under the terms and conditions of the GNU General Public License, | |
8 | * version 2, as published by the Free Software Foundation. | |
9 | * | |
10 | * This program is distributed in the hope it will be useful, but WITHOUT | |
11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
13 | * more details. | |
14 | * | |
15 | */ | |
16 | ||
17 | #ifndef _MEI_CLIENT_H_ | |
18 | #define _MEI_CLIENT_H_ | |
19 | ||
20 | #include <linux/types.h> | |
90e0b5f1 TW |
21 | #include <linux/poll.h> |
22 | #include <linux/mei.h> | |
23 | ||
24 | #include "mei_dev.h" | |
25 | ||
79563db9 TW |
26 | /* |
27 | * reference counting base function | |
28 | */ | |
29 | void mei_me_cl_init(struct mei_me_client *me_cl); | |
30 | void mei_me_cl_put(struct mei_me_client *me_cl); | |
31 | struct mei_me_client *mei_me_cl_get(struct mei_me_client *me_cl); | |
32 | ||
b7d88514 TW |
33 | void mei_me_cl_add(struct mei_device *dev, struct mei_me_client *me_cl); |
34 | void mei_me_cl_del(struct mei_device *dev, struct mei_me_client *me_cl); | |
35 | ||
36 | struct mei_me_client *mei_me_cl_by_uuid(struct mei_device *dev, | |
79563db9 | 37 | const uuid_le *uuid); |
d320832f | 38 | struct mei_me_client *mei_me_cl_by_id(struct mei_device *dev, u8 client_id); |
d880f329 TW |
39 | struct mei_me_client *mei_me_cl_by_uuid_id(struct mei_device *dev, |
40 | const uuid_le *uuid, u8 client_id); | |
79563db9 TW |
41 | void mei_me_cl_rm_by_uuid(struct mei_device *dev, const uuid_le *uuid); |
42 | void mei_me_cl_rm_by_uuid_id(struct mei_device *dev, | |
43 | const uuid_le *uuid, u8 id); | |
44 | void mei_me_cl_rm_all(struct mei_device *dev); | |
90e0b5f1 | 45 | |
d49ed64a AU |
46 | /** |
47 | * mei_me_cl_is_active - check whether me client is active in the fw | |
48 | * | |
49 | * @me_cl: me client | |
50 | * | |
51 | * Return: true if the me client is active in the firmware | |
52 | */ | |
53 | static inline bool mei_me_cl_is_active(const struct mei_me_client *me_cl) | |
54 | { | |
55 | return !list_empty_careful(&me_cl->list); | |
56 | } | |
57 | ||
58 | /** | |
59 | * mei_me_cl_uuid - return me client protocol name (uuid) | |
60 | * | |
61 | * @me_cl: me client | |
62 | * | |
63 | * Return: me client protocol name | |
64 | */ | |
65 | static inline const uuid_le *mei_me_cl_uuid(const struct mei_me_client *me_cl) | |
66 | { | |
67 | return &me_cl->props.protocol_name; | |
68 | } | |
69 | ||
40b7320e TW |
70 | /** |
71 | * mei_me_cl_ver - return me client protocol version | |
72 | * | |
73 | * @me_cl: me client | |
74 | * | |
75 | * Return: me client protocol version | |
76 | */ | |
77 | static inline u8 mei_me_cl_ver(const struct mei_me_client *me_cl) | |
78 | { | |
79 | return me_cl->props.protocol_version; | |
80 | } | |
81 | ||
90e0b5f1 TW |
82 | /* |
83 | * MEI IO Functions | |
84 | */ | |
bca67d68 | 85 | struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl, enum mei_cb_file_ops type, |
f23e2cc4 | 86 | const struct file *fp); |
90e0b5f1 | 87 | void mei_io_cb_free(struct mei_cl_cb *priv_cb); |
5db7514d | 88 | int mei_io_cb_alloc_buf(struct mei_cl_cb *cb, size_t length); |
90e0b5f1 TW |
89 | |
90 | ||
91 | /** | |
92 | * mei_io_list_init - Sets up a queue list. | |
93 | * | |
94 | * @list: An instance cl callback structure | |
95 | */ | |
96 | static inline void mei_io_list_init(struct mei_cl_cb *list) | |
97 | { | |
98 | INIT_LIST_HEAD(&list->list); | |
99 | } | |
5456796b AU |
100 | void mei_io_list_flush(struct mei_cl_cb *list, struct mei_cl *cl); |
101 | ||
90e0b5f1 TW |
102 | /* |
103 | * MEI Host Client Functions | |
104 | */ | |
105 | ||
106 | struct mei_cl *mei_cl_allocate(struct mei_device *dev); | |
107 | void mei_cl_init(struct mei_cl *cl, struct mei_device *dev); | |
108 | ||
109 | ||
7851e008 | 110 | int mei_cl_link(struct mei_cl *cl); |
90e0b5f1 TW |
111 | int mei_cl_unlink(struct mei_cl *cl); |
112 | ||
7851e008 | 113 | struct mei_cl *mei_cl_alloc_linked(struct mei_device *dev); |
03b8d341 | 114 | |
a9bed610 TW |
115 | struct mei_cl_cb *mei_cl_read_cb(const struct mei_cl *cl, |
116 | const struct file *fp); | |
117 | void mei_cl_read_cb_flush(const struct mei_cl *cl, const struct file *fp); | |
bca67d68 | 118 | struct mei_cl_cb *mei_cl_alloc_cb(struct mei_cl *cl, size_t length, |
f23e2cc4 TW |
119 | enum mei_cb_file_ops type, |
120 | const struct file *fp); | |
a9bed610 | 121 | int mei_cl_flush_queues(struct mei_cl *cl, const struct file *fp); |
90e0b5f1 | 122 | |
90e0b5f1 TW |
123 | /* |
124 | * MEI input output function prototype | |
125 | */ | |
6a84d63d TW |
126 | |
127 | /** | |
128 | * mei_cl_is_connected - host client is connected | |
129 | * | |
d49ed64a | 130 | * @cl: host client |
6a84d63d | 131 | * |
d49ed64a | 132 | * Return: true if the host client is connected |
6a84d63d | 133 | */ |
b950ac1d TW |
134 | static inline bool mei_cl_is_connected(struct mei_cl *cl) |
135 | { | |
ab3ae009 | 136 | return cl->state == MEI_FILE_CONNECTED; |
b950ac1d TW |
137 | } |
138 | ||
d49ed64a AU |
139 | /** |
140 | * mei_cl_me_id - me client id | |
141 | * | |
142 | * @cl: host client | |
143 | * | |
144 | * Return: me client id or 0 if client is not connected | |
145 | */ | |
146 | static inline u8 mei_cl_me_id(const struct mei_cl *cl) | |
147 | { | |
148 | return cl->me_cl ? cl->me_cl->client_id : 0; | |
149 | } | |
150 | ||
151 | /** | |
152 | * mei_cl_mtu - maximal message that client can send and receive | |
153 | * | |
154 | * @cl: host client | |
155 | * | |
156 | * Return: mtu | |
157 | */ | |
158 | static inline size_t mei_cl_mtu(const struct mei_cl *cl) | |
159 | { | |
160 | return cl->me_cl->props.max_msg_length; | |
161 | } | |
162 | ||
163 | /** | |
164 | * mei_cl_is_fixed_address - check whether the me client uses fixed address | |
165 | * | |
166 | * @cl: host client | |
167 | * | |
168 | * Return: true if the client is connected and it has fixed me address | |
169 | */ | |
170 | static inline bool mei_cl_is_fixed_address(const struct mei_cl *cl) | |
171 | { | |
172 | return cl->me_cl && cl->me_cl->props.fixed_address; | |
173 | } | |
174 | ||
175 | /** | |
176 | * mei_cl_is_single_recv_buf- check whether the me client | |
177 | * uses single receiving buffer | |
178 | * | |
179 | * @cl: host client | |
180 | * | |
181 | * Return: true if single_recv_buf == 1; 0 otherwise | |
182 | */ | |
183 | static inline bool mei_cl_is_single_recv_buf(const struct mei_cl *cl) | |
184 | { | |
185 | return cl->me_cl->props.single_recv_buf; | |
186 | } | |
187 | ||
188 | /** | |
189 | * mei_cl_uuid - client's uuid | |
190 | * | |
191 | * @cl: host client | |
192 | * | |
193 | * Return: return uuid of connected me client | |
194 | */ | |
195 | static inline const uuid_le *mei_cl_uuid(const struct mei_cl *cl) | |
196 | { | |
197 | return mei_me_cl_uuid(cl->me_cl); | |
198 | } | |
199 | ||
1df629ef AU |
200 | /** |
201 | * mei_cl_host_addr - client's host address | |
202 | * | |
203 | * @cl: host client | |
204 | * | |
205 | * Return: 0 for fixed address client, host address for dynamic client | |
206 | */ | |
207 | static inline u8 mei_cl_host_addr(const struct mei_cl *cl) | |
208 | { | |
209 | return mei_cl_is_fixed_address(cl) ? 0 : cl->host_client_id; | |
210 | } | |
211 | ||
90e0b5f1 | 212 | int mei_cl_disconnect(struct mei_cl *cl); |
3c666182 TW |
213 | void mei_cl_set_disconnected(struct mei_cl *cl); |
214 | int mei_cl_irq_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb, | |
215 | struct mei_cl_cb *cmpl_list); | |
d49ed64a | 216 | int mei_cl_connect(struct mei_cl *cl, struct mei_me_client *me_cl, |
f23e2cc4 | 217 | const struct file *file); |
0c53357c TW |
218 | int mei_cl_irq_connect(struct mei_cl *cl, struct mei_cl_cb *cb, |
219 | struct mei_cl_cb *cmpl_list); | |
f23e2cc4 | 220 | int mei_cl_read_start(struct mei_cl *cl, size_t length, const struct file *fp); |
331e4187 TW |
221 | int mei_cl_irq_read_msg(struct mei_cl *cl, struct mei_msg_hdr *hdr, |
222 | struct mei_cl_cb *cmpl_list); | |
4234a6de | 223 | int mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb, bool blocking); |
9d098192 TW |
224 | int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb, |
225 | struct mei_cl_cb *cmpl_list); | |
21767546 | 226 | |
db086fa9 | 227 | void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb); |
90e0b5f1 | 228 | |
025fb792 | 229 | void mei_host_client_init(struct mei_device *dev); |
90e0b5f1 | 230 | |
51678ccb TW |
231 | u8 mei_cl_notify_fop2req(enum mei_cb_file_ops fop); |
232 | enum mei_cb_file_ops mei_cl_notify_req2fop(u8 request); | |
f23e2cc4 TW |
233 | int mei_cl_notify_request(struct mei_cl *cl, |
234 | const struct file *file, u8 request); | |
51678ccb TW |
235 | int mei_cl_irq_notify(struct mei_cl *cl, struct mei_cl_cb *cb, |
236 | struct mei_cl_cb *cmpl_list); | |
b38a362f | 237 | int mei_cl_notify_get(struct mei_cl *cl, bool block, bool *notify_ev); |
237092bf | 238 | void mei_cl_notify(struct mei_cl *cl); |
51678ccb | 239 | |
074b4c01 | 240 | void mei_cl_all_disconnect(struct mei_device *dev); |
074b4c01 | 241 | |
c0abffbd | 242 | #define MEI_CL_FMT "cl:host=%02d me=%02d " |
d49ed64a | 243 | #define MEI_CL_PRM(cl) (cl)->host_client_id, mei_cl_me_id(cl) |
c0abffbd AU |
244 | |
245 | #define cl_dbg(dev, cl, format, arg...) \ | |
2bf94cab | 246 | dev_dbg((dev)->dev, MEI_CL_FMT format, MEI_CL_PRM(cl), ##arg) |
c0abffbd | 247 | |
6938c192 AU |
248 | #define cl_warn(dev, cl, format, arg...) \ |
249 | dev_warn((dev)->dev, MEI_CL_FMT format, MEI_CL_PRM(cl), ##arg) | |
250 | ||
c0abffbd | 251 | #define cl_err(dev, cl, format, arg...) \ |
2bf94cab | 252 | dev_err((dev)->dev, MEI_CL_FMT format, MEI_CL_PRM(cl), ##arg) |
c0abffbd | 253 | |
90e0b5f1 | 254 | #endif /* _MEI_CLIENT_H_ */ |