cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

client.h (7879B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Copyright (c) 2003-2018, Intel Corporation. All rights reserved.
      4 * Intel Management Engine Interface (Intel MEI) Linux driver
      5 */
      6
      7#ifndef _MEI_CLIENT_H_
      8#define _MEI_CLIENT_H_
      9
     10#include <linux/types.h>
     11#include <linux/poll.h>
     12#include <linux/mei.h>
     13
     14#include "mei_dev.h"
     15
     16/*
     17 * reference counting base function
     18 */
     19void mei_me_cl_init(struct mei_me_client *me_cl);
     20void mei_me_cl_put(struct mei_me_client *me_cl);
     21struct mei_me_client *mei_me_cl_get(struct mei_me_client *me_cl);
     22
     23void mei_me_cl_add(struct mei_device *dev, struct mei_me_client *me_cl);
     24void mei_me_cl_del(struct mei_device *dev, struct mei_me_client *me_cl);
     25
     26struct mei_me_client *mei_me_cl_by_uuid(struct mei_device *dev,
     27					const uuid_le *uuid);
     28struct mei_me_client *mei_me_cl_by_id(struct mei_device *dev, u8 client_id);
     29struct mei_me_client *mei_me_cl_by_uuid_id(struct mei_device *dev,
     30					   const uuid_le *uuid, u8 client_id);
     31void mei_me_cl_rm_by_uuid(struct mei_device *dev, const uuid_le *uuid);
     32void mei_me_cl_rm_by_uuid_id(struct mei_device *dev,
     33			     const uuid_le *uuid, u8 id);
     34void mei_me_cl_rm_all(struct mei_device *dev);
     35
     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 */
     43static 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 */
     55static 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
     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 */
     67static inline u8 mei_me_cl_ver(const struct mei_me_client *me_cl)
     68{
     69	return me_cl->props.protocol_version;
     70}
     71
     72/**
     73 * mei_me_cl_max_conn - return me client max number of connections
     74 *
     75 * @me_cl: me client
     76 *
     77 * Return: me client max number of connections
     78 */
     79static inline u8 mei_me_cl_max_conn(const struct mei_me_client *me_cl)
     80{
     81	return me_cl->props.max_number_of_connections;
     82}
     83
     84/**
     85 * mei_me_cl_fixed - return me client fixed address, if any
     86 *
     87 * @me_cl: me client
     88 *
     89 * Return: me client fixed address
     90 */
     91static inline u8 mei_me_cl_fixed(const struct mei_me_client *me_cl)
     92{
     93	return me_cl->props.fixed_address;
     94}
     95
     96/**
     97 * mei_me_cl_vt - return me client vtag supported status
     98 *
     99 * @me_cl: me client
    100 *
    101 * Return: true if me client supports vt tagging
    102 */
    103static inline bool mei_me_cl_vt(const struct mei_me_client *me_cl)
    104{
    105	return me_cl->props.vt_supported == 1;
    106}
    107
    108/**
    109 * mei_me_cl_max_len - return me client max msg length
    110 *
    111 * @me_cl: me client
    112 *
    113 * Return: me client max msg length
    114 */
    115static inline u32 mei_me_cl_max_len(const struct mei_me_client *me_cl)
    116{
    117	return me_cl->props.max_msg_length;
    118}
    119
    120/*
    121 * MEI IO Functions
    122 */
    123void mei_io_cb_free(struct mei_cl_cb *priv_cb);
    124
    125/*
    126 * MEI Host Client Functions
    127 */
    128
    129struct mei_cl *mei_cl_allocate(struct mei_device *dev);
    130
    131int mei_cl_link(struct mei_cl *cl);
    132int mei_cl_unlink(struct mei_cl *cl);
    133
    134struct mei_cl *mei_cl_alloc_linked(struct mei_device *dev);
    135
    136struct mei_cl_cb *mei_cl_read_cb(struct mei_cl *cl, const struct file *fp);
    137
    138void mei_cl_add_rd_completed(struct mei_cl *cl, struct mei_cl_cb *cb);
    139void mei_cl_del_rd_completed(struct mei_cl *cl, struct mei_cl_cb *cb);
    140
    141struct mei_cl_cb *mei_cl_alloc_cb(struct mei_cl *cl, size_t length,
    142				  enum mei_cb_file_ops type,
    143				  const struct file *fp);
    144struct mei_cl_cb *mei_cl_enqueue_ctrl_wr_cb(struct mei_cl *cl, size_t length,
    145					    enum mei_cb_file_ops type,
    146					    const struct file *fp);
    147int mei_cl_flush_queues(struct mei_cl *cl, const struct file *fp);
    148
    149struct mei_cl_vtag *mei_cl_vtag_alloc(struct file *fp, u8 vtag);
    150const struct file *mei_cl_fp_by_vtag(const struct mei_cl *cl, u8 vtag);
    151int mei_cl_vt_support_check(const struct mei_cl *cl);
    152/*
    153 *  MEI input output function prototype
    154 */
    155
    156/**
    157 * mei_cl_is_connected - host client is connected
    158 *
    159 * @cl: host client
    160 *
    161 * Return: true if the host client is connected
    162 */
    163static inline bool mei_cl_is_connected(const struct mei_cl *cl)
    164{
    165	return  cl->state == MEI_FILE_CONNECTED;
    166}
    167
    168/**
    169 * mei_cl_me_id - me client id
    170 *
    171 * @cl: host client
    172 *
    173 * Return: me client id or 0 if client is not connected
    174 */
    175static inline u8 mei_cl_me_id(const struct mei_cl *cl)
    176{
    177	return cl->me_cl ? cl->me_cl->client_id : 0;
    178}
    179
    180/**
    181 * mei_cl_mtu - maximal message that client can send and receive
    182 *
    183 * @cl: host client
    184 *
    185 * Return: mtu or 0 if client is not connected
    186 */
    187static inline size_t mei_cl_mtu(const struct mei_cl *cl)
    188{
    189	return cl->me_cl ? cl->me_cl->props.max_msg_length : 0;
    190}
    191
    192/**
    193 * mei_cl_is_fixed_address - check whether the me client uses fixed address
    194 *
    195 * @cl: host client
    196 *
    197 * Return: true if the client is connected and it has fixed me address
    198 */
    199static inline bool mei_cl_is_fixed_address(const struct mei_cl *cl)
    200{
    201	return cl->me_cl && cl->me_cl->props.fixed_address;
    202}
    203
    204/**
    205 * mei_cl_is_single_recv_buf- check whether the me client
    206 *       uses single receiving buffer
    207 *
    208 * @cl: host client
    209 *
    210 * Return: true if single_recv_buf == 1; 0 otherwise
    211 */
    212static inline bool mei_cl_is_single_recv_buf(const struct mei_cl *cl)
    213{
    214	return cl->me_cl->props.single_recv_buf;
    215}
    216
    217/**
    218 * mei_cl_uuid -  client's uuid
    219 *
    220 * @cl: host client
    221 *
    222 * Return: return uuid of connected me client
    223 */
    224static inline const uuid_le *mei_cl_uuid(const struct mei_cl *cl)
    225{
    226	return mei_me_cl_uuid(cl->me_cl);
    227}
    228
    229/**
    230 * mei_cl_host_addr - client's host address
    231 *
    232 * @cl: host client
    233 *
    234 * Return: 0 for fixed address client, host address for dynamic client
    235 */
    236static inline u8 mei_cl_host_addr(const struct mei_cl *cl)
    237{
    238	return  mei_cl_is_fixed_address(cl) ? 0 : cl->host_client_id;
    239}
    240
    241int mei_cl_disconnect(struct mei_cl *cl);
    242int mei_cl_irq_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb,
    243			  struct list_head *cmpl_list);
    244int mei_cl_connect(struct mei_cl *cl, struct mei_me_client *me_cl,
    245		   const struct file *file);
    246int mei_cl_irq_connect(struct mei_cl *cl, struct mei_cl_cb *cb,
    247		       struct list_head *cmpl_list);
    248int mei_cl_read_start(struct mei_cl *cl, size_t length, const struct file *fp);
    249ssize_t mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb);
    250int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
    251		     struct list_head *cmpl_list);
    252
    253void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb);
    254
    255void mei_host_client_init(struct mei_device *dev);
    256
    257u8 mei_cl_notify_fop2req(enum mei_cb_file_ops fop);
    258enum mei_cb_file_ops mei_cl_notify_req2fop(u8 request);
    259int mei_cl_notify_request(struct mei_cl *cl,
    260			  const struct file *file, u8 request);
    261int mei_cl_irq_notify(struct mei_cl *cl, struct mei_cl_cb *cb,
    262		      struct list_head *cmpl_list);
    263int mei_cl_notify_get(struct mei_cl *cl, bool block, bool *notify_ev);
    264void mei_cl_notify(struct mei_cl *cl);
    265
    266void mei_cl_all_disconnect(struct mei_device *dev);
    267
    268int mei_cl_irq_dma_map(struct mei_cl *cl, struct mei_cl_cb *cb,
    269		       struct list_head *cmpl_list);
    270int mei_cl_irq_dma_unmap(struct mei_cl *cl, struct mei_cl_cb *cb,
    271			 struct list_head *cmpl_list);
    272int mei_cl_dma_alloc_and_map(struct mei_cl *cl, const struct file *fp,
    273			     u8 buffer_id, size_t size);
    274int mei_cl_dma_unmap(struct mei_cl *cl, const struct file *fp);
    275
    276#define MEI_CL_FMT "cl:host=%02d me=%02d "
    277#define MEI_CL_PRM(cl) (cl)->host_client_id, mei_cl_me_id(cl)
    278
    279#define cl_dbg(dev, cl, format, arg...) \
    280	dev_dbg((dev)->dev, MEI_CL_FMT format, MEI_CL_PRM(cl), ##arg)
    281
    282#define cl_warn(dev, cl, format, arg...) \
    283	dev_warn((dev)->dev, MEI_CL_FMT format, MEI_CL_PRM(cl), ##arg)
    284
    285#define cl_err(dev, cl, format, arg...) \
    286	dev_err((dev)->dev, MEI_CL_FMT format, MEI_CL_PRM(cl), ##arg)
    287
    288#endif /* _MEI_CLIENT_H_ */