]>
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> | |
21 | #include <linux/watchdog.h> | |
22 | #include <linux/poll.h> | |
23 | #include <linux/mei.h> | |
24 | ||
25 | #include "mei_dev.h" | |
26 | ||
79563db9 TW |
27 | /* |
28 | * reference counting base function | |
29 | */ | |
30 | void mei_me_cl_init(struct mei_me_client *me_cl); | |
31 | void mei_me_cl_put(struct mei_me_client *me_cl); | |
32 | struct mei_me_client *mei_me_cl_get(struct mei_me_client *me_cl); | |
33 | ||
d320832f | 34 | struct mei_me_client *mei_me_cl_by_uuid(const struct mei_device *dev, |
79563db9 | 35 | const uuid_le *uuid); |
d320832f | 36 | struct mei_me_client *mei_me_cl_by_id(struct mei_device *dev, u8 client_id); |
d880f329 TW |
37 | struct mei_me_client *mei_me_cl_by_uuid_id(struct mei_device *dev, |
38 | const uuid_le *uuid, u8 client_id); | |
79563db9 TW |
39 | void mei_me_cl_rm_by_uuid(struct mei_device *dev, const uuid_le *uuid); |
40 | void mei_me_cl_rm_by_uuid_id(struct mei_device *dev, | |
41 | const uuid_le *uuid, u8 id); | |
42 | void mei_me_cl_rm_all(struct mei_device *dev); | |
90e0b5f1 TW |
43 | |
44 | /* | |
45 | * MEI IO Functions | |
46 | */ | |
47 | struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl, struct file *fp); | |
48 | void mei_io_cb_free(struct mei_cl_cb *priv_cb); | |
49 | int mei_io_cb_alloc_req_buf(struct mei_cl_cb *cb, size_t length); | |
50 | int mei_io_cb_alloc_resp_buf(struct mei_cl_cb *cb, size_t length); | |
51 | ||
52 | ||
53 | /** | |
54 | * mei_io_list_init - Sets up a queue list. | |
55 | * | |
56 | * @list: An instance cl callback structure | |
57 | */ | |
58 | static inline void mei_io_list_init(struct mei_cl_cb *list) | |
59 | { | |
60 | INIT_LIST_HEAD(&list->list); | |
61 | } | |
5456796b AU |
62 | void mei_io_list_flush(struct mei_cl_cb *list, struct mei_cl *cl); |
63 | ||
90e0b5f1 TW |
64 | /* |
65 | * MEI Host Client Functions | |
66 | */ | |
67 | ||
68 | struct mei_cl *mei_cl_allocate(struct mei_device *dev); | |
69 | void mei_cl_init(struct mei_cl *cl, struct mei_device *dev); | |
70 | ||
71 | ||
781d0d89 | 72 | int mei_cl_link(struct mei_cl *cl, int id); |
90e0b5f1 TW |
73 | int mei_cl_unlink(struct mei_cl *cl); |
74 | ||
75 | int mei_cl_flush_queues(struct mei_cl *cl); | |
76 | struct mei_cl_cb *mei_cl_find_read_cb(struct mei_cl *cl); | |
77 | ||
90e0b5f1 TW |
78 | |
79 | int mei_cl_flow_ctrl_creds(struct mei_cl *cl); | |
80 | ||
81 | int mei_cl_flow_ctrl_reduce(struct mei_cl *cl); | |
82 | /* | |
83 | * MEI input output function prototype | |
84 | */ | |
b950ac1d TW |
85 | static inline bool mei_cl_is_connected(struct mei_cl *cl) |
86 | { | |
1adc1674 | 87 | return cl->dev && |
b950ac1d | 88 | cl->dev->dev_state == MEI_DEV_ENABLED && |
1adc1674 | 89 | cl->state == MEI_FILE_CONNECTED; |
b950ac1d | 90 | } |
e2b31644 TW |
91 | static inline bool mei_cl_is_transitioning(struct mei_cl *cl) |
92 | { | |
1adc1674 | 93 | return MEI_FILE_INITIALIZING == cl->state || |
e2b31644 | 94 | MEI_FILE_DISCONNECTED == cl->state || |
1adc1674 | 95 | MEI_FILE_DISCONNECTING == cl->state; |
e2b31644 | 96 | } |
b950ac1d | 97 | |
90e0b5f1 TW |
98 | bool mei_cl_is_other_connecting(struct mei_cl *cl); |
99 | int mei_cl_disconnect(struct mei_cl *cl); | |
90e0b5f1 | 100 | int mei_cl_connect(struct mei_cl *cl, struct file *file); |
fcb136e1 | 101 | int mei_cl_read_start(struct mei_cl *cl, size_t length); |
4234a6de | 102 | int mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb, bool blocking); |
9d098192 TW |
103 | int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb, |
104 | struct mei_cl_cb *cmpl_list); | |
21767546 | 105 | |
db086fa9 | 106 | void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb); |
90e0b5f1 TW |
107 | |
108 | void mei_host_client_init(struct work_struct *work); | |
109 | ||
110 | ||
4234a6de | 111 | |
074b4c01 | 112 | void mei_cl_all_disconnect(struct mei_device *dev); |
5290801c | 113 | void mei_cl_all_wakeup(struct mei_device *dev); |
074b4c01 TW |
114 | void mei_cl_all_write_clear(struct mei_device *dev); |
115 | ||
c0abffbd AU |
116 | #define MEI_CL_FMT "cl:host=%02d me=%02d " |
117 | #define MEI_CL_PRM(cl) (cl)->host_client_id, (cl)->me_client_id | |
118 | ||
119 | #define cl_dbg(dev, cl, format, arg...) \ | |
2bf94cab | 120 | dev_dbg((dev)->dev, MEI_CL_FMT format, MEI_CL_PRM(cl), ##arg) |
c0abffbd AU |
121 | |
122 | #define cl_err(dev, cl, format, arg...) \ | |
2bf94cab | 123 | dev_err((dev)->dev, MEI_CL_FMT format, MEI_CL_PRM(cl), ##arg) |
c0abffbd | 124 | |
90e0b5f1 | 125 | #endif /* _MEI_CLIENT_H_ */ |