2013-01-09 01:07:14 +04:00
/*
*
* Intel Management Engine Interface ( Intel MEI ) Linux driver
* Copyright ( c ) 2003 - 2012 , Intel Corporation .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms and conditions of the GNU General Public License ,
* version 2 , as published by the Free Software Foundation .
*
* This program is distributed in the hope it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License for
* more details .
*
*/
# ifndef _MEI_CLIENT_H_
# define _MEI_CLIENT_H_
# include <linux/types.h>
# include <linux/watchdog.h>
# include <linux/poll.h>
# include <linux/mei.h>
# include "mei_dev.h"
2015-01-11 01:07:16 +03:00
/*
* reference counting base function
*/
void mei_me_cl_init ( struct mei_me_client * me_cl ) ;
void mei_me_cl_put ( struct mei_me_client * me_cl ) ;
struct mei_me_client * mei_me_cl_get ( struct mei_me_client * me_cl ) ;
2015-02-10 11:39:31 +03:00
void mei_me_cl_add ( struct mei_device * dev , struct mei_me_client * me_cl ) ;
void mei_me_cl_del ( struct mei_device * dev , struct mei_me_client * me_cl ) ;
struct mei_me_client * mei_me_cl_by_uuid ( struct mei_device * dev ,
2015-01-11 01:07:16 +03:00
const uuid_le * uuid ) ;
2014-08-24 13:08:55 +04:00
struct mei_me_client * mei_me_cl_by_id ( struct mei_device * dev , u8 client_id ) ;
2014-08-21 15:29:15 +04:00
struct mei_me_client * mei_me_cl_by_uuid_id ( struct mei_device * dev ,
const uuid_le * uuid , u8 client_id ) ;
2015-01-11 01:07:16 +03:00
void mei_me_cl_rm_by_uuid ( struct mei_device * dev , const uuid_le * uuid ) ;
void mei_me_cl_rm_by_uuid_id ( struct mei_device * dev ,
const uuid_le * uuid , u8 id ) ;
void mei_me_cl_rm_all ( struct mei_device * dev ) ;
2013-01-09 01:07:14 +04:00
2015-05-04 09:43:54 +03:00
/**
* mei_me_cl_is_active - check whether me client is active in the fw
*
* @ me_cl : me client
*
* Return : true if the me client is active in the firmware
*/
static inline bool mei_me_cl_is_active ( const struct mei_me_client * me_cl )
{
return ! list_empty_careful ( & me_cl - > list ) ;
}
/**
* mei_me_cl_uuid - return me client protocol name ( uuid )
*
* @ me_cl : me client
*
* Return : me client protocol name
*/
static inline const uuid_le * mei_me_cl_uuid ( const struct mei_me_client * me_cl )
{
return & me_cl - > props . protocol_name ;
}
2013-01-09 01:07:14 +04:00
/*
* MEI IO Functions
*/
2015-02-10 11:39:43 +03:00
struct mei_cl_cb * mei_io_cb_init ( struct mei_cl * cl , enum mei_cb_file_ops type ,
struct file * fp ) ;
2013-01-09 01:07:14 +04:00
void mei_io_cb_free ( struct mei_cl_cb * priv_cb ) ;
2015-02-10 11:39:42 +03:00
int mei_io_cb_alloc_buf ( struct mei_cl_cb * cb , size_t length ) ;
2013-01-09 01:07:14 +04:00
/**
* mei_io_list_init - Sets up a queue list .
*
* @ list : An instance cl callback structure
*/
static inline void mei_io_list_init ( struct mei_cl_cb * list )
{
INIT_LIST_HEAD ( & list - > list ) ;
}
2014-08-14 18:22:20 +04:00
void mei_io_list_flush ( struct mei_cl_cb * list , struct mei_cl * cl ) ;
2013-01-09 01:07:14 +04:00
/*
* MEI Host Client Functions
*/
struct mei_cl * mei_cl_allocate ( struct mei_device * dev ) ;
void mei_cl_init ( struct mei_cl * cl , struct mei_device * dev ) ;
2013-01-09 01:07:22 +04:00
int mei_cl_link ( struct mei_cl * cl , int id ) ;
2013-01-09 01:07:14 +04:00
int mei_cl_unlink ( struct mei_cl * cl ) ;
2015-02-10 11:39:44 +03:00
struct mei_cl * mei_cl_alloc_linked ( struct mei_device * dev , int id ) ;
2015-02-10 11:39:46 +03:00
struct mei_cl_cb * mei_cl_read_cb ( const struct mei_cl * cl ,
const struct file * fp ) ;
void mei_cl_read_cb_flush ( const struct mei_cl * cl , const struct file * fp ) ;
2015-02-10 11:39:43 +03:00
struct mei_cl_cb * mei_cl_alloc_cb ( struct mei_cl * cl , size_t length ,
enum mei_cb_file_ops type , struct file * fp ) ;
2015-02-10 11:39:46 +03:00
int mei_cl_flush_queues ( struct mei_cl * cl , const struct file * fp ) ;
2013-01-09 01:07:14 +04:00
int mei_cl_flow_ctrl_creds ( struct mei_cl * cl ) ;
int mei_cl_flow_ctrl_reduce ( struct mei_cl * cl ) ;
/*
* MEI input output function prototype
*/
2015-03-27 01:27:59 +03:00
/**
* mei_cl_is_connected - host client is connected
*
2015-05-04 09:43:54 +03:00
* @ cl : host client
2015-03-27 01:27:59 +03:00
*
2015-05-04 09:43:54 +03:00
* Return : true if the host client is connected
2015-03-27 01:27:59 +03:00
*/
2013-07-25 21:15:53 +04:00
static inline bool mei_cl_is_connected ( struct mei_cl * cl )
{
2015-03-19 13:10:09 +03:00
return cl - > state = = MEI_FILE_CONNECTED ;
2013-07-25 21:15:53 +04:00
}
2015-05-04 09:43:54 +03:00
/**
* mei_cl_me_id - me client id
*
* @ cl : host client
*
* Return : me client id or 0 if client is not connected
*/
static inline u8 mei_cl_me_id ( const struct mei_cl * cl )
{
return cl - > me_cl ? cl - > me_cl - > client_id : 0 ;
}
/**
* mei_cl_mtu - maximal message that client can send and receive
*
* @ cl : host client
*
* Return : mtu
*/
static inline size_t mei_cl_mtu ( const struct mei_cl * cl )
{
return cl - > me_cl - > props . max_msg_length ;
}
/**
* mei_cl_is_fixed_address - check whether the me client uses fixed address
*
* @ cl : host client
*
* Return : true if the client is connected and it has fixed me address
*/
static inline bool mei_cl_is_fixed_address ( const struct mei_cl * cl )
{
return cl - > me_cl & & cl - > me_cl - > props . fixed_address ;
}
/**
* mei_cl_is_single_recv_buf - check whether the me client
* uses single receiving buffer
*
* @ cl : host client
*
* Return : true if single_recv_buf = = 1 ; 0 otherwise
*/
static inline bool mei_cl_is_single_recv_buf ( const struct mei_cl * cl )
{
return cl - > me_cl - > props . single_recv_buf ;
}
/**
* mei_cl_uuid - client ' s uuid
*
* @ cl : host client
*
* Return : return uuid of connected me client
*/
static inline const uuid_le * mei_cl_uuid ( const struct mei_cl * cl )
{
return mei_me_cl_uuid ( cl - > me_cl ) ;
}
2015-05-04 09:43:56 +03:00
/**
* mei_cl_host_addr - client ' s host address
*
* @ cl : host client
*
* Return : 0 for fixed address client , host address for dynamic client
*/
static inline u8 mei_cl_host_addr ( const struct mei_cl * cl )
{
return mei_cl_is_fixed_address ( cl ) ? 0 : cl - > host_client_id ;
}
2013-01-09 01:07:14 +04:00
int mei_cl_disconnect ( struct mei_cl * cl ) ;
2015-05-04 09:43:52 +03:00
void mei_cl_set_disconnected ( struct mei_cl * cl ) ;
int mei_cl_irq_disconnect ( struct mei_cl * cl , struct mei_cl_cb * cb ,
struct mei_cl_cb * cmpl_list ) ;
2015-05-04 09:43:54 +03:00
int mei_cl_connect ( struct mei_cl * cl , struct mei_me_client * me_cl ,
struct file * file ) ;
2015-05-04 09:43:53 +03:00
int mei_cl_irq_connect ( struct mei_cl * cl , struct mei_cl_cb * cb ,
struct mei_cl_cb * cmpl_list ) ;
2015-02-10 11:39:43 +03:00
int mei_cl_read_start ( struct mei_cl * cl , size_t length , struct file * fp ) ;
2015-02-10 11:39:41 +03:00
int mei_cl_irq_read_msg ( struct mei_cl * cl , struct mei_msg_hdr * hdr ,
struct mei_cl_cb * cmpl_list ) ;
2013-04-08 22:56:37 +04:00
int mei_cl_write ( struct mei_cl * cl , struct mei_cl_cb * cb , bool blocking ) ;
2014-02-19 19:35:48 +04:00
int mei_cl_irq_write ( struct mei_cl * cl , struct mei_cl_cb * cb ,
struct mei_cl_cb * cmpl_list ) ;
2013-06-23 10:36:59 +04:00
2013-05-12 16:34:45 +04:00
void mei_cl_complete ( struct mei_cl * cl , struct mei_cl_cb * cb ) ;
2013-01-09 01:07:14 +04:00
void mei_host_client_init ( struct work_struct * work ) ;
2015-07-26 09:54:18 +03:00
u8 mei_cl_notify_fop2req ( enum mei_cb_file_ops fop ) ;
enum mei_cb_file_ops mei_cl_notify_req2fop ( u8 request ) ;
int mei_cl_notify_request ( struct mei_cl * cl , struct file * file , u8 request ) ;
int mei_cl_irq_notify ( struct mei_cl * cl , struct mei_cl_cb * cb ,
struct mei_cl_cb * cmpl_list ) ;
2015-07-26 09:54:19 +03:00
int mei_cl_notify_get ( struct mei_cl * cl , bool block , bool * notify_ev ) ;
2015-07-26 09:54:22 +03:00
void mei_cl_notify ( struct mei_cl * cl ) ;
2015-07-26 09:54:18 +03:00
2013-02-06 16:06:44 +04:00
void mei_cl_all_disconnect ( struct mei_device * dev ) ;
2013-07-24 17:22:57 +04:00
void mei_cl_all_wakeup ( struct mei_device * dev ) ;
2013-02-06 16:06:44 +04:00
void mei_cl_all_write_clear ( struct mei_device * dev ) ;
2013-09-15 19:11:07 +04:00
# define MEI_CL_FMT "cl:host=%02d me=%02d "
2015-05-04 09:43:54 +03:00
# define MEI_CL_PRM(cl) (cl)->host_client_id, mei_cl_me_id(cl)
2013-09-15 19:11:07 +04:00
# define cl_dbg(dev, cl, format, arg...) \
2014-09-29 17:31:42 +04:00
dev_dbg ( ( dev ) - > dev , MEI_CL_FMT format , MEI_CL_PRM ( cl ) , # # arg )
2013-09-15 19:11:07 +04:00
# define cl_err(dev, cl, format, arg...) \
2014-09-29 17:31:42 +04:00
dev_err ( ( dev ) - > dev , MEI_CL_FMT format , MEI_CL_PRM ( cl ) , # # arg )
2013-09-15 19:11:07 +04:00
2013-01-09 01:07:14 +04:00
# endif /* _MEI_CLIENT_H_ */