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