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_DEV_H_
18#define _MEI_DEV_H_
19
20#include <linux/types.h>
21#include <linux/watchdog.h>
22#include <linux/poll.h>
23#include <linux/mei.h>
24#include <linux/mei_cl_bus.h>
25
26#include "hw.h"
27#include "hbm.h"
28
29/*
30 * watch dog definition
31 */
32#define MEI_WD_HDR_SIZE       4
33#define MEI_WD_STOP_MSG_SIZE  MEI_WD_HDR_SIZE
34#define MEI_WD_START_MSG_SIZE (MEI_WD_HDR_SIZE + 16)
35
36#define MEI_WD_DEFAULT_TIMEOUT   120  /* seconds */
37#define MEI_WD_MIN_TIMEOUT       120  /* seconds */
38#define MEI_WD_MAX_TIMEOUT     65535  /* seconds */
39
40#define MEI_WD_STOP_TIMEOUT      10 /* msecs */
41
42#define MEI_WD_STATE_INDEPENDENCE_MSG_SENT       (1 << 0)
43
44#define MEI_RD_MSG_BUF_SIZE           (128 * sizeof(u32))
45
46
47/*
48 * AMTHI Client UUID
49 */
50extern const uuid_le mei_amthif_guid;
51
52/*
53 * Watchdog Client UUID
54 */
55extern const uuid_le mei_wd_guid;
56
57/*
58 * Number of Maximum MEI Clients
59 */
60#define MEI_CLIENTS_MAX 256
61
62/*
63 * maximum number of consecutive resets
64 */
65#define MEI_MAX_CONSEC_RESET  3
66
67/*
68 * Number of File descriptors/handles
69 * that can be opened to the driver.
70 *
71 * Limit to 255: 256 Total Clients
72 * minus internal client for MEI Bus Messages
73 */
74#define  MEI_MAX_OPEN_HANDLE_COUNT (MEI_CLIENTS_MAX - 1)
75
76/*
77 * Internal Clients Number
78 */
79#define MEI_HOST_CLIENT_ID_ANY        (-1)
80#define MEI_HBM_HOST_CLIENT_ID         0 /* not used, just for documentation */
81#define MEI_WD_HOST_CLIENT_ID          1
82#define MEI_IAMTHIF_HOST_CLIENT_ID     2
83
84
85/* File state */
86enum file_state {
87	MEI_FILE_INITIALIZING = 0,
88	MEI_FILE_CONNECTING,
89	MEI_FILE_CONNECTED,
90	MEI_FILE_DISCONNECTING,
91	MEI_FILE_DISCONNECT_REPLY,
92	MEI_FILE_DISCONNECT_REQUIRED,
93	MEI_FILE_DISCONNECTED,
94};
95
96/* MEI device states */
97enum mei_dev_state {
98	MEI_DEV_INITIALIZING = 0,
99	MEI_DEV_INIT_CLIENTS,
100	MEI_DEV_ENABLED,
101	MEI_DEV_RESETTING,
102	MEI_DEV_DISABLED,
103	MEI_DEV_POWER_DOWN,
104	MEI_DEV_POWER_UP
105};
106
107const char *mei_dev_state_str(int state);
108
109enum iamthif_states {
110	MEI_IAMTHIF_IDLE,
111	MEI_IAMTHIF_WRITING,
112	MEI_IAMTHIF_FLOW_CONTROL,
113	MEI_IAMTHIF_READING,
114	MEI_IAMTHIF_READ_COMPLETE
115};
116
117enum mei_file_transaction_states {
118	MEI_IDLE,
119	MEI_WRITING,
120	MEI_WRITE_COMPLETE,
121	MEI_FLOW_CONTROL,
122	MEI_READING,
123	MEI_READ_COMPLETE
124};
125
126enum mei_wd_states {
127	MEI_WD_IDLE,
128	MEI_WD_RUNNING,
129	MEI_WD_STOPPING,
130};
131
132/**
133 * enum mei_cb_file_ops  - file operation associated with the callback
134 * @MEI_FOP_READ:       read
135 * @MEI_FOP_WRITE:      write
136 * @MEI_FOP_CONNECT:    connect
137 * @MEI_FOP_DISCONNECT: disconnect
138 * @MEI_FOP_DISCONNECT_RSP: disconnect response
139 * @MEI_FOP_NOTIFY_START:   start notification
140 * @MEI_FOP_NOTIFY_STOP:    stop notification
141 */
142enum mei_cb_file_ops {
143	MEI_FOP_READ = 0,
144	MEI_FOP_WRITE,
145	MEI_FOP_CONNECT,
146	MEI_FOP_DISCONNECT,
147	MEI_FOP_DISCONNECT_RSP,
148	MEI_FOP_NOTIFY_START,
149	MEI_FOP_NOTIFY_STOP,
150};
151
152/*
153 * Intel MEI message data struct
154 */
155struct mei_msg_data {
156	u32 size;
157	unsigned char *data;
158};
159
160/* Maximum number of processed FW status registers */
161#define MEI_FW_STATUS_MAX 6
162/* Minimal  buffer for FW status string (8 bytes in dw + space or '\0') */
163#define MEI_FW_STATUS_STR_SZ (MEI_FW_STATUS_MAX * (8 + 1))
164
165
166/*
167 * struct mei_fw_status - storage of FW status data
168 *
169 * @count: number of actually available elements in array
170 * @status: FW status registers
171 */
172struct mei_fw_status {
173	int count;
174	u32 status[MEI_FW_STATUS_MAX];
175};
176
177/**
178 * struct mei_me_client - representation of me (fw) client
179 *
180 * @list: link in me client list
181 * @refcnt: struct reference count
182 * @props: client properties
183 * @client_id: me client id
184 * @mei_flow_ctrl_creds: flow control credits
185 * @connect_count: number connections to this client
186 * @bus_added: added to bus
187 */
188struct mei_me_client {
189	struct list_head list;
190	struct kref refcnt;
191	struct mei_client_properties props;
192	u8 client_id;
193	u8 mei_flow_ctrl_creds;
194	u8 connect_count;
195	u8 bus_added;
196};
197
198
199struct mei_cl;
200
201/**
202 * struct mei_cl_cb - file operation callback structure
203 *
204 * @list: link in callback queue
205 * @cl: file client who is running this operation
206 * @fop_type: file operation type
207 * @buf: buffer for data associated with the callback
208 * @buf_idx: last read index
209 * @read_time: last read operation time stamp (iamthif)
210 * @file_object: pointer to file structure
211 * @status: io status of the cb
212 * @internal: communication between driver and FW flag
213 * @completed: the transfer or reception has completed
214 */
215struct mei_cl_cb {
216	struct list_head list;
217	struct mei_cl *cl;
218	enum mei_cb_file_ops fop_type;
219	struct mei_msg_data buf;
220	unsigned long buf_idx;
221	unsigned long read_time;
222	struct file *file_object;
223	int status;
224	u32 internal:1;
225	u32 completed:1;
226};
227
228/**
229 * struct mei_cl - me client host representation
230 *    carried in file->private_data
231 *
232 * @link: link in the clients list
233 * @dev: mei parent device
234 * @state: file operation state
235 * @tx_wait: wait queue for tx completion
236 * @rx_wait: wait queue for rx completion
237 * @wait:  wait queue for management operation
238 * @ev_wait: notification wait queue
239 * @ev_async: event async notification
240 * @status: connection status
241 * @me_cl: fw client connected
242 * @host_client_id: host id
243 * @mei_flow_ctrl_creds: transmit flow credentials
244 * @timer_count:  watchdog timer for operation completion
245 * @reserved: reserved for alignment
246 * @notify_en: notification - enabled/disabled
247 * @notify_ev: pending notification event
248 * @writing_state: state of the tx
249 * @rd_pending: pending read credits
250 * @rd_completed: completed read
251 *
252 * @cldev: device on the mei client bus
253 */
254struct mei_cl {
255	struct list_head link;
256	struct mei_device *dev;
257	enum file_state state;
258	wait_queue_head_t tx_wait;
259	wait_queue_head_t rx_wait;
260	wait_queue_head_t wait;
261	wait_queue_head_t ev_wait;
262	struct fasync_struct *ev_async;
263	int status;
264	struct mei_me_client *me_cl;
265	u8 host_client_id;
266	u8 mei_flow_ctrl_creds;
267	u8 timer_count;
268	u8 reserved;
269	u8 notify_en;
270	u8 notify_ev;
271	enum mei_file_transaction_states writing_state;
272	struct list_head rd_pending;
273	struct list_head rd_completed;
274
275	struct mei_cl_device *cldev;
276};
277
278/**
279 * struct mei_hw_ops - hw specific ops
280 *
281 * @host_is_ready    : query for host readiness
282 *
283 * @hw_is_ready      : query if hw is ready
284 * @hw_reset         : reset hw
285 * @hw_start         : start hw after reset
286 * @hw_config        : configure hw
287 *
288 * @fw_status        : get fw status registers
289 * @pg_state         : power gating state of the device
290 * @pg_in_transition : is device now in pg transition
291 * @pg_is_enabled    : is power gating enabled
292 *
293 * @intr_clear       : clear pending interrupts
294 * @intr_enable      : enable interrupts
295 * @intr_disable     : disable interrupts
296 *
297 * @hbuf_free_slots  : query for write buffer empty slots
298 * @hbuf_is_ready    : query if write buffer is empty
299 * @hbuf_max_len     : query for write buffer max len
300 *
301 * @write            : write a message to FW
302 *
303 * @rdbuf_full_slots : query how many slots are filled
304 *
305 * @read_hdr         : get first 4 bytes (header)
306 * @read             : read a buffer from the FW
307 */
308struct mei_hw_ops {
309
310	bool (*host_is_ready)(struct mei_device *dev);
311
312	bool (*hw_is_ready)(struct mei_device *dev);
313	int (*hw_reset)(struct mei_device *dev, bool enable);
314	int (*hw_start)(struct mei_device *dev);
315	void (*hw_config)(struct mei_device *dev);
316
317
318	int (*fw_status)(struct mei_device *dev, struct mei_fw_status *fw_sts);
319	enum mei_pg_state (*pg_state)(struct mei_device *dev);
320	bool (*pg_in_transition)(struct mei_device *dev);
321	bool (*pg_is_enabled)(struct mei_device *dev);
322
323	void (*intr_clear)(struct mei_device *dev);
324	void (*intr_enable)(struct mei_device *dev);
325	void (*intr_disable)(struct mei_device *dev);
326
327	int (*hbuf_free_slots)(struct mei_device *dev);
328	bool (*hbuf_is_ready)(struct mei_device *dev);
329	size_t (*hbuf_max_len)(const struct mei_device *dev);
330
331	int (*write)(struct mei_device *dev,
332		     struct mei_msg_hdr *hdr,
333		     unsigned char *buf);
334
335	int (*rdbuf_full_slots)(struct mei_device *dev);
336
337	u32 (*read_hdr)(const struct mei_device *dev);
338	int (*read)(struct mei_device *dev,
339		     unsigned char *buf, unsigned long len);
340};
341
342/* MEI bus API*/
343void mei_cl_bus_rescan(struct mei_device *bus);
344void mei_cl_bus_dev_fixup(struct mei_cl_device *dev);
345ssize_t __mei_cl_send(struct mei_cl *cl, u8 *buf, size_t length,
346			bool blocking);
347ssize_t __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length);
348void mei_cl_bus_rx_event(struct mei_cl *cl);
349void mei_cl_bus_notify_event(struct mei_cl *cl);
350void mei_cl_bus_remove_devices(struct mei_device *bus);
351int mei_cl_bus_init(void);
352void mei_cl_bus_exit(void);
353
354/**
355 * enum mei_pg_event - power gating transition events
356 *
357 * @MEI_PG_EVENT_IDLE: the driver is not in power gating transition
358 * @MEI_PG_EVENT_WAIT: the driver is waiting for a pg event to complete
359 * @MEI_PG_EVENT_RECEIVED: the driver received pg event
360 * @MEI_PG_EVENT_INTR_WAIT: the driver is waiting for a pg event interrupt
361 * @MEI_PG_EVENT_INTR_RECEIVED: the driver received pg event interrupt
362 */
363enum mei_pg_event {
364	MEI_PG_EVENT_IDLE,
365	MEI_PG_EVENT_WAIT,
366	MEI_PG_EVENT_RECEIVED,
367	MEI_PG_EVENT_INTR_WAIT,
368	MEI_PG_EVENT_INTR_RECEIVED,
369};
370
371/**
372 * enum mei_pg_state - device internal power gating state
373 *
374 * @MEI_PG_OFF: device is not power gated - it is active
375 * @MEI_PG_ON:  device is power gated - it is in lower power state
376 */
377enum mei_pg_state {
378	MEI_PG_OFF = 0,
379	MEI_PG_ON =  1,
380};
381
382const char *mei_pg_state_str(enum mei_pg_state state);
383
384/**
385 * struct mei_device -  MEI private device struct
386 *
387 * @dev         : device on a bus
388 * @cdev        : character device
389 * @minor       : minor number allocated for device
390 *
391 * @write_list  : write pending list
392 * @write_waiting_list : write completion list
393 * @ctrl_wr_list : pending control write list
394 * @ctrl_rd_list : pending control read list
395 *
396 * @file_list   : list of opened handles
397 * @open_handle_count: number of opened handles
398 *
399 * @device_lock : big device lock
400 * @timer_work  : MEI timer delayed work (timeouts)
401 *
402 * @recvd_hw_ready : hw ready message received flag
403 *
404 * @wait_hw_ready : wait queue for receive HW ready message form FW
405 * @wait_pg     : wait queue for receive PG message from FW
406 * @wait_hbm_start : wait queue for receive HBM start message from FW
407 * @wait_stop_wd : wait queue for receive WD stop message from FW
408 *
409 * @reset_count : number of consecutive resets
410 * @dev_state   : device state
411 * @hbm_state   : state of host bus message protocol
412 * @init_clients_timer : HBM init handshake timeout
413 *
414 * @pg_event    : power gating event
415 * @pg_domain   : runtime PM domain
416 *
417 * @rd_msg_buf  : control messages buffer
418 * @rd_msg_hdr  : read message header storage
419 *
420 * @hbuf_depth  : depth of hardware host/write buffer is slots
421 * @hbuf_is_ready : query if the host host/write buffer is ready
422 * @wr_msg      : the buffer for hbm control messages
423 *
424 * @version     : HBM protocol version in use
425 * @hbm_f_pg_supported  : hbm feature pgi protocol
426 * @hbm_f_dc_supported  : hbm feature dynamic clients
427 * @hbm_f_dot_supported : hbm feature disconnect on timeout
428 * @hbm_f_ev_supported  : hbm feature event notification
429 *
430 * @me_clients_rwsem: rw lock over me_clients list
431 * @me_clients  : list of FW clients
432 * @me_clients_map : FW clients bit map
433 * @host_clients_map : host clients id pool
434 * @me_client_index : last FW client index in enumeration
435 *
436 * @allow_fixed_address: allow user space to connect a fixed client
437 *
438 * @wd_cl       : watchdog client
439 * @wd_state    : watchdog client state
440 * @wd_pending  : watchdog command is pending
441 * @wd_timeout  : watchdog expiration timeout
442 * @wd_data     : watchdog message buffer
443 *
444 * @amthif_cmd_list : amthif list for cmd waiting
445 * @amthif_rd_complete_list : amthif list for reading completed cmd data
446 * @iamthif_file_object : file for current amthif operation
447 * @iamthif_cl  : amthif host client
448 * @iamthif_current_cb : amthif current operation callback
449 * @iamthif_open_count : number of opened amthif connections
450 * @iamthif_timer : time stamp of current amthif command completion
451 * @iamthif_stall_timer : timer to detect amthif hang
452 * @iamthif_state : amthif processor state
453 * @iamthif_canceled : current amthif command is canceled
454 *
455 * @init_work   : work item for the device init
456 * @reset_work  : work item for the device reset
457 *
458 * @device_list : mei client bus list
459 * @cl_bus_lock : client bus list lock
460 *
461 * @dbgfs_dir   : debugfs mei root directory
462 *
463 * @ops:        : hw specific operations
464 * @hw          : hw specific data
465 */
466struct mei_device {
467	struct device *dev;
468	struct cdev cdev;
469	int minor;
470
471	struct mei_cl_cb write_list;
472	struct mei_cl_cb write_waiting_list;
473	struct mei_cl_cb ctrl_wr_list;
474	struct mei_cl_cb ctrl_rd_list;
475
476	struct list_head file_list;
477	long open_handle_count;
478
479	struct mutex device_lock;
480	struct delayed_work timer_work;
481
482	bool recvd_hw_ready;
483	/*
484	 * waiting queue for receive message from FW
485	 */
486	wait_queue_head_t wait_hw_ready;
487	wait_queue_head_t wait_pg;
488	wait_queue_head_t wait_hbm_start;
489	wait_queue_head_t wait_stop_wd;
490
491	/*
492	 * mei device  states
493	 */
494	unsigned long reset_count;
495	enum mei_dev_state dev_state;
496	enum mei_hbm_state hbm_state;
497	u16 init_clients_timer;
498
499	/*
500	 * Power Gating support
501	 */
502	enum mei_pg_event pg_event;
503#ifdef CONFIG_PM
504	struct dev_pm_domain pg_domain;
505#endif /* CONFIG_PM */
506
507	unsigned char rd_msg_buf[MEI_RD_MSG_BUF_SIZE];
508	u32 rd_msg_hdr;
509
510	/* write buffer */
511	u8 hbuf_depth;
512	bool hbuf_is_ready;
513
514	/* used for control messages */
515	struct {
516		struct mei_msg_hdr hdr;
517		unsigned char data[128];
518	} wr_msg;
519
520	struct hbm_version version;
521	unsigned int hbm_f_pg_supported:1;
522	unsigned int hbm_f_dc_supported:1;
523	unsigned int hbm_f_dot_supported:1;
524	unsigned int hbm_f_ev_supported:1;
525
526	struct rw_semaphore me_clients_rwsem;
527	struct list_head me_clients;
528	DECLARE_BITMAP(me_clients_map, MEI_CLIENTS_MAX);
529	DECLARE_BITMAP(host_clients_map, MEI_CLIENTS_MAX);
530	unsigned long me_client_index;
531
532	bool allow_fixed_address;
533
534	struct mei_cl wd_cl;
535	enum mei_wd_states wd_state;
536	bool wd_pending;
537	u16 wd_timeout;
538	unsigned char wd_data[MEI_WD_START_MSG_SIZE];
539
540
541	/* amthif list for cmd waiting */
542	struct mei_cl_cb amthif_cmd_list;
543	/* driver managed amthif list for reading completed amthif cmd data */
544	struct mei_cl_cb amthif_rd_complete_list;
545	struct file *iamthif_file_object;
546	struct mei_cl iamthif_cl;
547	struct mei_cl_cb *iamthif_current_cb;
548	long iamthif_open_count;
549	unsigned long iamthif_timer;
550	u32 iamthif_stall_timer;
551	enum iamthif_states iamthif_state;
552	bool iamthif_canceled;
553
554	struct work_struct init_work;
555	struct work_struct reset_work;
556
557	/* List of bus devices */
558	struct list_head device_list;
559	struct mutex cl_bus_lock;
560
561#if IS_ENABLED(CONFIG_DEBUG_FS)
562	struct dentry *dbgfs_dir;
563#endif /* CONFIG_DEBUG_FS */
564
565
566	const struct mei_hw_ops *ops;
567	char hw[0] __aligned(sizeof(void *));
568};
569
570static inline unsigned long mei_secs_to_jiffies(unsigned long sec)
571{
572	return msecs_to_jiffies(sec * MSEC_PER_SEC);
573}
574
575/**
576 * mei_data2slots - get slots - number of (dwords) from a message length
577 *	+ size of the mei header
578 *
579 * @length: size of the messages in bytes
580 *
581 * Return: number of slots
582 */
583static inline u32 mei_data2slots(size_t length)
584{
585	return DIV_ROUND_UP(sizeof(struct mei_msg_hdr) + length, 4);
586}
587
588/**
589 * mei_slots2data - get data in slots - bytes from slots
590 *
591 * @slots: number of available slots
592 *
593 * Return: number of bytes in slots
594 */
595static inline u32 mei_slots2data(int slots)
596{
597	return slots * 4;
598}
599
600/*
601 * mei init function prototypes
602 */
603void mei_device_init(struct mei_device *dev,
604		     struct device *device,
605		     const struct mei_hw_ops *hw_ops);
606int mei_reset(struct mei_device *dev);
607int mei_start(struct mei_device *dev);
608int mei_restart(struct mei_device *dev);
609void mei_stop(struct mei_device *dev);
610void mei_cancel_work(struct mei_device *dev);
611
612/*
613 *  MEI interrupt functions prototype
614 */
615
616void mei_timer(struct work_struct *work);
617int mei_irq_read_handler(struct mei_device *dev,
618		struct mei_cl_cb *cmpl_list, s32 *slots);
619
620int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list);
621void mei_irq_compl_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list);
622
623/*
624 * AMTHIF - AMT Host Interface Functions
625 */
626void mei_amthif_reset_params(struct mei_device *dev);
627
628int mei_amthif_host_init(struct mei_device *dev, struct mei_me_client *me_cl);
629
630int mei_amthif_read(struct mei_device *dev, struct file *file,
631		char __user *ubuf, size_t length, loff_t *offset);
632
633unsigned int mei_amthif_poll(struct mei_device *dev,
634		struct file *file, poll_table *wait);
635
636int mei_amthif_release(struct mei_device *dev, struct file *file);
637
638struct mei_cl_cb *mei_amthif_find_read_list_entry(struct mei_device *dev,
639						struct file *file);
640
641int mei_amthif_write(struct mei_cl *cl, struct mei_cl_cb *cb);
642int mei_amthif_run_next_cmd(struct mei_device *dev);
643int mei_amthif_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
644			struct mei_cl_cb *cmpl_list);
645
646void mei_amthif_complete(struct mei_device *dev, struct mei_cl_cb *cb);
647int mei_amthif_irq_read_msg(struct mei_cl *cl,
648			    struct mei_msg_hdr *mei_hdr,
649			    struct mei_cl_cb *complete_list);
650int mei_amthif_irq_read(struct mei_device *dev, s32 *slots);
651
652/*
653 * NFC functions
654 */
655int mei_nfc_host_init(struct mei_device *dev, struct mei_me_client *me_cl);
656void mei_nfc_host_exit(struct mei_device *dev);
657
658/*
659 * NFC Client UUID
660 */
661extern const uuid_le mei_nfc_guid;
662
663int mei_wd_send(struct mei_device *dev);
664int mei_wd_stop(struct mei_device *dev);
665int mei_wd_host_init(struct mei_device *dev, struct mei_me_client *me_cl);
666/*
667 * mei_watchdog_register  - Registering watchdog interface
668 *   once we got connection to the WD Client
669 * @dev: mei device
670 */
671int mei_watchdog_register(struct mei_device *dev);
672/*
673 * mei_watchdog_unregister  - Unregistering watchdog interface
674 * @dev: mei device
675 */
676void mei_watchdog_unregister(struct mei_device *dev);
677
678/*
679 * Register Access Function
680 */
681
682
683static inline void mei_hw_config(struct mei_device *dev)
684{
685	dev->ops->hw_config(dev);
686}
687
688static inline enum mei_pg_state mei_pg_state(struct mei_device *dev)
689{
690	return dev->ops->pg_state(dev);
691}
692
693static inline bool mei_pg_in_transition(struct mei_device *dev)
694{
695	return dev->ops->pg_in_transition(dev);
696}
697
698static inline bool mei_pg_is_enabled(struct mei_device *dev)
699{
700	return dev->ops->pg_is_enabled(dev);
701}
702
703static inline int mei_hw_reset(struct mei_device *dev, bool enable)
704{
705	return dev->ops->hw_reset(dev, enable);
706}
707
708static inline int mei_hw_start(struct mei_device *dev)
709{
710	return dev->ops->hw_start(dev);
711}
712
713static inline void mei_clear_interrupts(struct mei_device *dev)
714{
715	dev->ops->intr_clear(dev);
716}
717
718static inline void mei_enable_interrupts(struct mei_device *dev)
719{
720	dev->ops->intr_enable(dev);
721}
722
723static inline void mei_disable_interrupts(struct mei_device *dev)
724{
725	dev->ops->intr_disable(dev);
726}
727
728static inline bool mei_host_is_ready(struct mei_device *dev)
729{
730	return dev->ops->host_is_ready(dev);
731}
732static inline bool mei_hw_is_ready(struct mei_device *dev)
733{
734	return dev->ops->hw_is_ready(dev);
735}
736
737static inline bool mei_hbuf_is_ready(struct mei_device *dev)
738{
739	return dev->ops->hbuf_is_ready(dev);
740}
741
742static inline int mei_hbuf_empty_slots(struct mei_device *dev)
743{
744	return dev->ops->hbuf_free_slots(dev);
745}
746
747static inline size_t mei_hbuf_max_len(const struct mei_device *dev)
748{
749	return dev->ops->hbuf_max_len(dev);
750}
751
752static inline int mei_write_message(struct mei_device *dev,
753			struct mei_msg_hdr *hdr,
754			unsigned char *buf)
755{
756	return dev->ops->write(dev, hdr, buf);
757}
758
759static inline u32 mei_read_hdr(const struct mei_device *dev)
760{
761	return dev->ops->read_hdr(dev);
762}
763
764static inline void mei_read_slots(struct mei_device *dev,
765		     unsigned char *buf, unsigned long len)
766{
767	dev->ops->read(dev, buf, len);
768}
769
770static inline int mei_count_full_read_slots(struct mei_device *dev)
771{
772	return dev->ops->rdbuf_full_slots(dev);
773}
774
775static inline int mei_fw_status(struct mei_device *dev,
776				struct mei_fw_status *fw_status)
777{
778	return dev->ops->fw_status(dev, fw_status);
779}
780
781bool mei_hbuf_acquire(struct mei_device *dev);
782
783bool mei_write_is_idle(struct mei_device *dev);
784
785void mei_irq_discard_msg(struct mei_device *dev, struct mei_msg_hdr *hdr);
786
787#if IS_ENABLED(CONFIG_DEBUG_FS)
788int mei_dbgfs_register(struct mei_device *dev, const char *name);
789void mei_dbgfs_deregister(struct mei_device *dev);
790#else
791static inline int mei_dbgfs_register(struct mei_device *dev, const char *name)
792{
793	return 0;
794}
795static inline void mei_dbgfs_deregister(struct mei_device *dev) {}
796#endif /* CONFIG_DEBUG_FS */
797
798int mei_register(struct mei_device *dev, struct device *parent);
799void mei_deregister(struct mei_device *dev);
800
801#define MEI_HDR_FMT "hdr:host=%02d me=%02d len=%d internal=%1d comp=%1d"
802#define MEI_HDR_PRM(hdr)                  \
803	(hdr)->host_addr, (hdr)->me_addr, \
804	(hdr)->length, (hdr)->internal, (hdr)->msg_complete
805
806ssize_t mei_fw_status2str(struct mei_fw_status *fw_sts, char *buf, size_t len);
807/**
808 * mei_fw_status_str - fetch and convert fw status registers to printable string
809 *
810 * @dev: the device structure
811 * @buf: string buffer at minimal size MEI_FW_STATUS_STR_SZ
812 * @len: buffer len must be >= MEI_FW_STATUS_STR_SZ
813 *
814 * Return: number of bytes written or < 0 on failure
815 */
816static inline ssize_t mei_fw_status_str(struct mei_device *dev,
817					char *buf, size_t len)
818{
819	struct mei_fw_status fw_status;
820	int ret;
821
822	buf[0] = '\0';
823
824	ret = mei_fw_status(dev, &fw_status);
825	if (ret)
826		return ret;
827
828	ret = mei_fw_status2str(&fw_status, buf, MEI_FW_STATUS_STR_SZ);
829
830	return ret;
831}
832
833
834#endif
835