xref: /openbmc/linux/drivers/misc/mei/client.h (revision 9fff0425)
19fff0425STomas Winkler /* SPDX-License-Identifier: GPL-2.0 */
290e0b5f1STomas Winkler /*
390e0b5f1STomas Winkler  * Intel Management Engine Interface (Intel MEI) Linux driver
490e0b5f1STomas Winkler  * Copyright (c) 2003-2012, Intel Corporation.
590e0b5f1STomas Winkler  */
690e0b5f1STomas Winkler 
790e0b5f1STomas Winkler #ifndef _MEI_CLIENT_H_
890e0b5f1STomas Winkler #define _MEI_CLIENT_H_
990e0b5f1STomas Winkler 
1090e0b5f1STomas Winkler #include <linux/types.h>
1190e0b5f1STomas Winkler #include <linux/poll.h>
1290e0b5f1STomas Winkler #include <linux/mei.h>
1390e0b5f1STomas Winkler 
1490e0b5f1STomas Winkler #include "mei_dev.h"
1590e0b5f1STomas Winkler 
1679563db9STomas Winkler /*
1779563db9STomas Winkler  * reference counting base function
1879563db9STomas Winkler  */
1979563db9STomas Winkler void mei_me_cl_init(struct mei_me_client *me_cl);
2079563db9STomas Winkler void mei_me_cl_put(struct mei_me_client *me_cl);
2179563db9STomas Winkler struct mei_me_client *mei_me_cl_get(struct mei_me_client *me_cl);
22d880f329STomas Winkler 
23b7d88514STomas Winkler void mei_me_cl_add(struct mei_device *dev, struct mei_me_client *me_cl);
24b7d88514STomas Winkler void mei_me_cl_del(struct mei_device *dev, struct mei_me_client *me_cl);
25b7d88514STomas Winkler 
26b7d88514STomas Winkler struct mei_me_client *mei_me_cl_by_uuid(struct mei_device *dev,
2779563db9STomas Winkler 					const uuid_le *uuid);
2879563db9STomas Winkler struct mei_me_client *mei_me_cl_by_id(struct mei_device *dev, u8 client_id);
29d880f329STomas Winkler struct mei_me_client *mei_me_cl_by_uuid_id(struct mei_device *dev,
30d880f329STomas Winkler 					   const uuid_le *uuid, u8 client_id);
3179563db9STomas Winkler void mei_me_cl_rm_by_uuid(struct mei_device *dev, const uuid_le *uuid);
3279563db9STomas Winkler void mei_me_cl_rm_by_uuid_id(struct mei_device *dev,
3379563db9STomas Winkler 			     const uuid_le *uuid, u8 id);
3479563db9STomas Winkler void mei_me_cl_rm_all(struct mei_device *dev);
3590e0b5f1STomas Winkler 
36d49ed64aSAlexander Usyskin /**
37d49ed64aSAlexander Usyskin  * mei_me_cl_is_active - check whether me client is active in the fw
38d49ed64aSAlexander Usyskin  *
39d49ed64aSAlexander Usyskin  * @me_cl: me client
40d49ed64aSAlexander Usyskin  *
41d49ed64aSAlexander Usyskin  * Return: true if the me client is active in the firmware
42d49ed64aSAlexander Usyskin  */
43d49ed64aSAlexander Usyskin static inline bool mei_me_cl_is_active(const struct mei_me_client *me_cl)
44d49ed64aSAlexander Usyskin {
45d49ed64aSAlexander Usyskin 	return !list_empty_careful(&me_cl->list);
46d49ed64aSAlexander Usyskin }
47d49ed64aSAlexander Usyskin 
48d49ed64aSAlexander Usyskin /**
49d49ed64aSAlexander Usyskin  * mei_me_cl_uuid - return me client protocol name (uuid)
50d49ed64aSAlexander Usyskin  *
51d49ed64aSAlexander Usyskin  * @me_cl: me client
52d49ed64aSAlexander Usyskin  *
53d49ed64aSAlexander Usyskin  * Return: me client protocol name
54d49ed64aSAlexander Usyskin  */
55d49ed64aSAlexander Usyskin static inline const uuid_le *mei_me_cl_uuid(const struct mei_me_client *me_cl)
56d49ed64aSAlexander Usyskin {
57d49ed64aSAlexander Usyskin 	return &me_cl->props.protocol_name;
58d49ed64aSAlexander Usyskin }
59d49ed64aSAlexander Usyskin 
6040b7320eSTomas Winkler /**
6140b7320eSTomas Winkler  * mei_me_cl_ver - return me client protocol version
6240b7320eSTomas Winkler  *
6340b7320eSTomas Winkler  * @me_cl: me client
6440b7320eSTomas Winkler  *
6540b7320eSTomas Winkler  * Return: me client protocol version
6640b7320eSTomas Winkler  */
6740b7320eSTomas Winkler static inline u8 mei_me_cl_ver(const struct mei_me_client *me_cl)
6840b7320eSTomas Winkler {
6940b7320eSTomas Winkler 	return me_cl->props.protocol_version;
7040b7320eSTomas Winkler }
7140b7320eSTomas Winkler 
7290e0b5f1STomas Winkler /*
7390e0b5f1STomas Winkler  * MEI IO Functions
7490e0b5f1STomas Winkler  */
7590e0b5f1STomas Winkler void mei_io_cb_free(struct mei_cl_cb *priv_cb);
7690e0b5f1STomas Winkler 
7790e0b5f1STomas Winkler /*
7890e0b5f1STomas Winkler  * MEI Host Client Functions
7990e0b5f1STomas Winkler  */
8090e0b5f1STomas Winkler 
8190e0b5f1STomas Winkler struct mei_cl *mei_cl_allocate(struct mei_device *dev);
8290e0b5f1STomas Winkler 
837851e008SAlexander Usyskin int mei_cl_link(struct mei_cl *cl);
8490e0b5f1STomas Winkler int mei_cl_unlink(struct mei_cl *cl);
8590e0b5f1STomas Winkler 
867851e008SAlexander Usyskin struct mei_cl *mei_cl_alloc_linked(struct mei_device *dev);
8703b8d341STomas Winkler 
88a9bed610STomas Winkler struct mei_cl_cb *mei_cl_read_cb(const struct mei_cl *cl,
89a9bed610STomas Winkler 				 const struct file *fp);
90bca67d68STomas Winkler struct mei_cl_cb *mei_cl_alloc_cb(struct mei_cl *cl, size_t length,
91f23e2cc4STomas Winkler 				  enum mei_cb_file_ops type,
92f23e2cc4STomas Winkler 				  const struct file *fp);
933030dc05STomas Winkler struct mei_cl_cb *mei_cl_enqueue_ctrl_wr_cb(struct mei_cl *cl, size_t length,
943030dc05STomas Winkler 					    enum mei_cb_file_ops type,
953030dc05STomas Winkler 					    const struct file *fp);
96a9bed610STomas Winkler int mei_cl_flush_queues(struct mei_cl *cl, const struct file *fp);
9790e0b5f1STomas Winkler 
9890e0b5f1STomas Winkler /*
9990e0b5f1STomas Winkler  *  MEI input output function prototype
10090e0b5f1STomas Winkler  */
1016a84d63dSTomas Winkler 
1026a84d63dSTomas Winkler /**
1036a84d63dSTomas Winkler  * mei_cl_is_connected - host client is connected
1046a84d63dSTomas Winkler  *
105d49ed64aSAlexander Usyskin  * @cl: host client
1066a84d63dSTomas Winkler  *
107d49ed64aSAlexander Usyskin  * Return: true if the host client is connected
1086a84d63dSTomas Winkler  */
109b950ac1dSTomas Winkler static inline bool mei_cl_is_connected(struct mei_cl *cl)
110b950ac1dSTomas Winkler {
111ab3ae009STomas Winkler 	return  cl->state == MEI_FILE_CONNECTED;
112b950ac1dSTomas Winkler }
113b950ac1dSTomas Winkler 
114d49ed64aSAlexander Usyskin /**
115d49ed64aSAlexander Usyskin  * mei_cl_me_id - me client id
116d49ed64aSAlexander Usyskin  *
117d49ed64aSAlexander Usyskin  * @cl: host client
118d49ed64aSAlexander Usyskin  *
119d49ed64aSAlexander Usyskin  * Return: me client id or 0 if client is not connected
120d49ed64aSAlexander Usyskin  */
121d49ed64aSAlexander Usyskin static inline u8 mei_cl_me_id(const struct mei_cl *cl)
122d49ed64aSAlexander Usyskin {
123d49ed64aSAlexander Usyskin 	return cl->me_cl ? cl->me_cl->client_id : 0;
124d49ed64aSAlexander Usyskin }
125d49ed64aSAlexander Usyskin 
126d49ed64aSAlexander Usyskin /**
127d49ed64aSAlexander Usyskin  * mei_cl_mtu - maximal message that client can send and receive
128d49ed64aSAlexander Usyskin  *
129d49ed64aSAlexander Usyskin  * @cl: host client
130d49ed64aSAlexander Usyskin  *
131d49ed64aSAlexander Usyskin  * Return: mtu
132d49ed64aSAlexander Usyskin  */
133d49ed64aSAlexander Usyskin static inline size_t mei_cl_mtu(const struct mei_cl *cl)
134d49ed64aSAlexander Usyskin {
135d49ed64aSAlexander Usyskin 	return cl->me_cl->props.max_msg_length;
136d49ed64aSAlexander Usyskin }
137d49ed64aSAlexander Usyskin 
138d49ed64aSAlexander Usyskin /**
139d49ed64aSAlexander Usyskin  * mei_cl_is_fixed_address - check whether the me client uses fixed address
140d49ed64aSAlexander Usyskin  *
141d49ed64aSAlexander Usyskin  * @cl: host client
142d49ed64aSAlexander Usyskin  *
143d49ed64aSAlexander Usyskin  * Return: true if the client is connected and it has fixed me address
144d49ed64aSAlexander Usyskin  */
145d49ed64aSAlexander Usyskin static inline bool mei_cl_is_fixed_address(const struct mei_cl *cl)
146d49ed64aSAlexander Usyskin {
147d49ed64aSAlexander Usyskin 	return cl->me_cl && cl->me_cl->props.fixed_address;
148d49ed64aSAlexander Usyskin }
149d49ed64aSAlexander Usyskin 
150d49ed64aSAlexander Usyskin /**
151d49ed64aSAlexander Usyskin  * mei_cl_is_single_recv_buf- check whether the me client
152d49ed64aSAlexander Usyskin  *       uses single receiving buffer
153d49ed64aSAlexander Usyskin  *
154d49ed64aSAlexander Usyskin  * @cl: host client
155d49ed64aSAlexander Usyskin  *
156d49ed64aSAlexander Usyskin  * Return: true if single_recv_buf == 1; 0 otherwise
157d49ed64aSAlexander Usyskin  */
158d49ed64aSAlexander Usyskin static inline bool mei_cl_is_single_recv_buf(const struct mei_cl *cl)
159d49ed64aSAlexander Usyskin {
160d49ed64aSAlexander Usyskin 	return cl->me_cl->props.single_recv_buf;
161d49ed64aSAlexander Usyskin }
162d49ed64aSAlexander Usyskin 
163d49ed64aSAlexander Usyskin /**
164d49ed64aSAlexander Usyskin  * mei_cl_uuid -  client's uuid
165d49ed64aSAlexander Usyskin  *
166d49ed64aSAlexander Usyskin  * @cl: host client
167d49ed64aSAlexander Usyskin  *
168d49ed64aSAlexander Usyskin  * Return: return uuid of connected me client
169d49ed64aSAlexander Usyskin  */
170d49ed64aSAlexander Usyskin static inline const uuid_le *mei_cl_uuid(const struct mei_cl *cl)
171d49ed64aSAlexander Usyskin {
172d49ed64aSAlexander Usyskin 	return mei_me_cl_uuid(cl->me_cl);
173d49ed64aSAlexander Usyskin }
174d49ed64aSAlexander Usyskin 
1751df629efSAlexander Usyskin /**
1761df629efSAlexander Usyskin  * mei_cl_host_addr - client's host address
1771df629efSAlexander Usyskin  *
1781df629efSAlexander Usyskin  * @cl: host client
1791df629efSAlexander Usyskin  *
1801df629efSAlexander Usyskin  * Return: 0 for fixed address client, host address for dynamic client
1811df629efSAlexander Usyskin  */
1821df629efSAlexander Usyskin static inline u8 mei_cl_host_addr(const struct mei_cl *cl)
1831df629efSAlexander Usyskin {
1841df629efSAlexander Usyskin 	return  mei_cl_is_fixed_address(cl) ? 0 : cl->host_client_id;
1851df629efSAlexander Usyskin }
1861df629efSAlexander Usyskin 
18790e0b5f1STomas Winkler int mei_cl_disconnect(struct mei_cl *cl);
1883c666182STomas Winkler int mei_cl_irq_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb,
189962ff7bcSAlexander Usyskin 			  struct list_head *cmpl_list);
190d49ed64aSAlexander Usyskin int mei_cl_connect(struct mei_cl *cl, struct mei_me_client *me_cl,
191f23e2cc4STomas Winkler 		   const struct file *file);
1920c53357cSTomas Winkler int mei_cl_irq_connect(struct mei_cl *cl, struct mei_cl_cb *cb,
193962ff7bcSAlexander Usyskin 		       struct list_head *cmpl_list);
194f23e2cc4STomas Winkler int mei_cl_read_start(struct mei_cl *cl, size_t length, const struct file *fp);
1955151e2b5STomas Winkler ssize_t mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb);
1969d098192STomas Winkler int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
197962ff7bcSAlexander Usyskin 		     struct list_head *cmpl_list);
19821767546STomas Winkler 
199db086fa9STomas Winkler void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb);
20090e0b5f1STomas Winkler 
201025fb792SAlexander Usyskin void mei_host_client_init(struct mei_device *dev);
20290e0b5f1STomas Winkler 
20351678ccbSTomas Winkler u8 mei_cl_notify_fop2req(enum mei_cb_file_ops fop);
20451678ccbSTomas Winkler enum mei_cb_file_ops mei_cl_notify_req2fop(u8 request);
205f23e2cc4STomas Winkler int mei_cl_notify_request(struct mei_cl *cl,
206f23e2cc4STomas Winkler 			  const struct file *file, u8 request);
20751678ccbSTomas Winkler int mei_cl_irq_notify(struct mei_cl *cl, struct mei_cl_cb *cb,
208962ff7bcSAlexander Usyskin 		      struct list_head *cmpl_list);
209b38a362fSTomas Winkler int mei_cl_notify_get(struct mei_cl *cl, bool block, bool *notify_ev);
210237092bfSTomas Winkler void mei_cl_notify(struct mei_cl *cl);
21151678ccbSTomas Winkler 
212074b4c01STomas Winkler void mei_cl_all_disconnect(struct mei_device *dev);
213074b4c01STomas Winkler 
214c0abffbdSAlexander Usyskin #define MEI_CL_FMT "cl:host=%02d me=%02d "
215d49ed64aSAlexander Usyskin #define MEI_CL_PRM(cl) (cl)->host_client_id, mei_cl_me_id(cl)
216c0abffbdSAlexander Usyskin 
217c0abffbdSAlexander Usyskin #define cl_dbg(dev, cl, format, arg...) \
2182bf94cabSTomas Winkler 	dev_dbg((dev)->dev, MEI_CL_FMT format, MEI_CL_PRM(cl), ##arg)
219c0abffbdSAlexander Usyskin 
2206938c192SAlexander Usyskin #define cl_warn(dev, cl, format, arg...) \
2216938c192SAlexander Usyskin 	dev_warn((dev)->dev, MEI_CL_FMT format, MEI_CL_PRM(cl), ##arg)
2226938c192SAlexander Usyskin 
223c0abffbdSAlexander Usyskin #define cl_err(dev, cl, format, arg...) \
2242bf94cabSTomas Winkler 	dev_err((dev)->dev, MEI_CL_FMT format, MEI_CL_PRM(cl), ##arg)
225c0abffbdSAlexander Usyskin 
22690e0b5f1STomas Winkler #endif /* _MEI_CLIENT_H_ */
227