]>
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 | */ | |
90e0b5f1 | 85 | void mei_io_cb_free(struct mei_cl_cb *priv_cb); |
90e0b5f1 | 86 | |
90e0b5f1 TW |
87 | /* |
88 | * MEI Host Client Functions | |
89 | */ | |
90 | ||
91 | struct mei_cl *mei_cl_allocate(struct mei_device *dev); | |
90e0b5f1 | 92 | |
7851e008 | 93 | int mei_cl_link(struct mei_cl *cl); |
90e0b5f1 TW |
94 | int mei_cl_unlink(struct mei_cl *cl); |
95 | ||
7851e008 | 96 | struct mei_cl *mei_cl_alloc_linked(struct mei_device *dev); |
03b8d341 | 97 | |
a9bed610 TW |
98 | struct mei_cl_cb *mei_cl_read_cb(const struct mei_cl *cl, |
99 | const struct file *fp); | |
bca67d68 | 100 | struct mei_cl_cb *mei_cl_alloc_cb(struct mei_cl *cl, size_t length, |
f23e2cc4 TW |
101 | enum mei_cb_file_ops type, |
102 | const struct file *fp); | |
3030dc05 TW |
103 | struct mei_cl_cb *mei_cl_enqueue_ctrl_wr_cb(struct mei_cl *cl, size_t length, |
104 | enum mei_cb_file_ops type, | |
105 | const struct file *fp); | |
a9bed610 | 106 | int mei_cl_flush_queues(struct mei_cl *cl, const struct file *fp); |
90e0b5f1 | 107 | |
90e0b5f1 TW |
108 | /* |
109 | * MEI input output function prototype | |
110 | */ | |
6a84d63d TW |
111 | |
112 | /** | |
113 | * mei_cl_is_connected - host client is connected | |
114 | * | |
d49ed64a | 115 | * @cl: host client |
6a84d63d | 116 | * |
d49ed64a | 117 | * Return: true if the host client is connected |
6a84d63d | 118 | */ |
b950ac1d TW |
119 | static inline bool mei_cl_is_connected(struct mei_cl *cl) |
120 | { | |
ab3ae009 | 121 | return cl->state == MEI_FILE_CONNECTED; |
b950ac1d TW |
122 | } |
123 | ||
d49ed64a AU |
124 | /** |
125 | * mei_cl_me_id - me client id | |
126 | * | |
127 | * @cl: host client | |
128 | * | |
129 | * Return: me client id or 0 if client is not connected | |
130 | */ | |
131 | static inline u8 mei_cl_me_id(const struct mei_cl *cl) | |
132 | { | |
133 | return cl->me_cl ? cl->me_cl->client_id : 0; | |
134 | } | |
135 | ||
136 | /** | |
137 | * mei_cl_mtu - maximal message that client can send and receive | |
138 | * | |
139 | * @cl: host client | |
140 | * | |
141 | * Return: mtu | |
142 | */ | |
143 | static inline size_t mei_cl_mtu(const struct mei_cl *cl) | |
144 | { | |
145 | return cl->me_cl->props.max_msg_length; | |
146 | } | |
147 | ||
148 | /** | |
149 | * mei_cl_is_fixed_address - check whether the me client uses fixed address | |
150 | * | |
151 | * @cl: host client | |
152 | * | |
153 | * Return: true if the client is connected and it has fixed me address | |
154 | */ | |
155 | static inline bool mei_cl_is_fixed_address(const struct mei_cl *cl) | |
156 | { | |
157 | return cl->me_cl && cl->me_cl->props.fixed_address; | |
158 | } | |
159 | ||
160 | /** | |
161 | * mei_cl_is_single_recv_buf- check whether the me client | |
162 | * uses single receiving buffer | |
163 | * | |
164 | * @cl: host client | |
165 | * | |
166 | * Return: true if single_recv_buf == 1; 0 otherwise | |
167 | */ | |
168 | static inline bool mei_cl_is_single_recv_buf(const struct mei_cl *cl) | |
169 | { | |
170 | return cl->me_cl->props.single_recv_buf; | |
171 | } | |
172 | ||
173 | /** | |
174 | * mei_cl_uuid - client's uuid | |
175 | * | |
176 | * @cl: host client | |
177 | * | |
178 | * Return: return uuid of connected me client | |
179 | */ | |
180 | static inline const uuid_le *mei_cl_uuid(const struct mei_cl *cl) | |
181 | { | |
182 | return mei_me_cl_uuid(cl->me_cl); | |
183 | } | |
184 | ||
1df629ef AU |
185 | /** |
186 | * mei_cl_host_addr - client's host address | |
187 | * | |
188 | * @cl: host client | |
189 | * | |
190 | * Return: 0 for fixed address client, host address for dynamic client | |
191 | */ | |
192 | static inline u8 mei_cl_host_addr(const struct mei_cl *cl) | |
193 | { | |
194 | return mei_cl_is_fixed_address(cl) ? 0 : cl->host_client_id; | |
195 | } | |
196 | ||
90e0b5f1 | 197 | int mei_cl_disconnect(struct mei_cl *cl); |
3c666182 | 198 | int mei_cl_irq_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb, |
962ff7bc | 199 | struct list_head *cmpl_list); |
d49ed64a | 200 | int mei_cl_connect(struct mei_cl *cl, struct mei_me_client *me_cl, |
f23e2cc4 | 201 | const struct file *file); |
0c53357c | 202 | int mei_cl_irq_connect(struct mei_cl *cl, struct mei_cl_cb *cb, |
962ff7bc | 203 | struct list_head *cmpl_list); |
f23e2cc4 | 204 | int mei_cl_read_start(struct mei_cl *cl, size_t length, const struct file *fp); |
e0cb6b2f | 205 | int mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb); |
9d098192 | 206 | int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb, |
962ff7bc | 207 | struct list_head *cmpl_list); |
21767546 | 208 | |
db086fa9 | 209 | void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb); |
90e0b5f1 | 210 | |
025fb792 | 211 | void mei_host_client_init(struct mei_device *dev); |
90e0b5f1 | 212 | |
51678ccb TW |
213 | u8 mei_cl_notify_fop2req(enum mei_cb_file_ops fop); |
214 | enum mei_cb_file_ops mei_cl_notify_req2fop(u8 request); | |
f23e2cc4 TW |
215 | int mei_cl_notify_request(struct mei_cl *cl, |
216 | const struct file *file, u8 request); | |
51678ccb | 217 | int mei_cl_irq_notify(struct mei_cl *cl, struct mei_cl_cb *cb, |
962ff7bc | 218 | struct list_head *cmpl_list); |
b38a362f | 219 | int mei_cl_notify_get(struct mei_cl *cl, bool block, bool *notify_ev); |
237092bf | 220 | void mei_cl_notify(struct mei_cl *cl); |
51678ccb | 221 | |
074b4c01 | 222 | void mei_cl_all_disconnect(struct mei_device *dev); |
074b4c01 | 223 | |
c0abffbd | 224 | #define MEI_CL_FMT "cl:host=%02d me=%02d " |
d49ed64a | 225 | #define MEI_CL_PRM(cl) (cl)->host_client_id, mei_cl_me_id(cl) |
c0abffbd AU |
226 | |
227 | #define cl_dbg(dev, cl, format, arg...) \ | |
2bf94cab | 228 | dev_dbg((dev)->dev, MEI_CL_FMT format, MEI_CL_PRM(cl), ##arg) |
c0abffbd | 229 | |
6938c192 AU |
230 | #define cl_warn(dev, cl, format, arg...) \ |
231 | dev_warn((dev)->dev, MEI_CL_FMT format, MEI_CL_PRM(cl), ##arg) | |
232 | ||
c0abffbd | 233 | #define cl_err(dev, cl, format, arg...) \ |
2bf94cab | 234 | dev_err((dev)->dev, MEI_CL_FMT format, MEI_CL_PRM(cl), ##arg) |
c0abffbd | 235 | |
90e0b5f1 | 236 | #endif /* _MEI_CLIENT_H_ */ |