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

hinic_hw_mbox.h (4584B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/* Huawei HiNIC PCI Express Linux driver
      3 * Copyright(c) 2017 Huawei Technologies Co., Ltd
      4 */
      5
      6#ifndef HINIC_MBOX_H_
      7#define HINIC_MBOX_H_
      8
      9#define HINIC_MBOX_PF_SEND_ERR		0x1
     10#define HINIC_MBOX_PF_BUSY_ACTIVE_FW	0x2
     11#define HINIC_MBOX_VF_CMD_ERROR		0x3
     12
     13#define HINIC_MAX_FUNCTIONS		512
     14
     15#define HINIC_MAX_PF_FUNCS		16
     16
     17#define HINIC_MBOX_WQ_NAME		"hinic_mbox"
     18
     19#define HINIC_FUNC_CSR_MAILBOX_DATA_OFF			0x80
     20#define HINIC_FUNC_CSR_MAILBOX_CONTROL_OFF		0x0100
     21#define HINIC_FUNC_CSR_MAILBOX_INT_OFFSET_OFF		0x0104
     22#define HINIC_FUNC_CSR_MAILBOX_RESULT_H_OFF		0x0108
     23#define HINIC_FUNC_CSR_MAILBOX_RESULT_L_OFF		0x010C
     24
     25#define MAX_FUNCTION_NUM		512
     26
     27struct vf_cmd_check_handle {
     28	u8 cmd;
     29	bool (*check_cmd)(struct hinic_hwdev *hwdev, u16 src_func_idx,
     30			  void *buf_in, u16 in_size);
     31};
     32
     33enum hinic_mbox_ack_type {
     34	MBOX_ACK,
     35	MBOX_NO_ACK,
     36};
     37
     38struct mbox_msg_info {
     39	u8 msg_id;
     40	u8 status;
     41};
     42
     43struct hinic_recv_mbox {
     44	struct completion	recv_done;
     45	void			*mbox;
     46	u8			cmd;
     47	enum hinic_mod_type	mod;
     48	u16			mbox_len;
     49	void			*buf_out;
     50	enum hinic_mbox_ack_type ack_type;
     51	struct mbox_msg_info	msg_info;
     52	u8			seq_id;
     53	atomic_t		msg_cnt;
     54};
     55
     56struct hinic_send_mbox {
     57	struct completion	send_done;
     58	u8			*data;
     59
     60	u64			*wb_status;
     61	void			*wb_vaddr;
     62	dma_addr_t		wb_paddr;
     63};
     64
     65typedef void (*hinic_vf_mbox_cb)(void *handle, u8 cmd, void *buf_in,
     66				u16 in_size, void *buf_out, u16 *out_size);
     67typedef int (*hinic_pf_mbox_cb)(void *handle, u16 vf_id, u8 cmd, void *buf_in,
     68				u16 in_size, void *buf_out, u16 *out_size);
     69
     70enum mbox_event_state {
     71	EVENT_START = 0,
     72	EVENT_FAIL,
     73	EVENT_TIMEOUT,
     74	EVENT_END,
     75};
     76
     77enum hinic_mbox_cb_state {
     78	HINIC_VF_MBOX_CB_REG = 0,
     79	HINIC_VF_MBOX_CB_RUNNING,
     80	HINIC_PF_MBOX_CB_REG,
     81	HINIC_PF_MBOX_CB_RUNNING,
     82	HINIC_PPF_MBOX_CB_REG,
     83	HINIC_PPF_MBOX_CB_RUNNING,
     84	HINIC_PPF_TO_PF_MBOX_CB_REG,
     85	HINIC_PPF_TO_PF_MBOX_CB_RUNNIG,
     86};
     87
     88struct hinic_mbox_func_to_func {
     89	struct hinic_hwdev	*hwdev;
     90	struct hinic_hwif		*hwif;
     91
     92	struct semaphore	mbox_send_sem;
     93	struct semaphore	msg_send_sem;
     94	struct hinic_send_mbox	send_mbox;
     95
     96	struct workqueue_struct *workq;
     97
     98	struct hinic_recv_mbox	mbox_resp[HINIC_MAX_FUNCTIONS];
     99	struct hinic_recv_mbox	mbox_send[HINIC_MAX_FUNCTIONS];
    100
    101	hinic_vf_mbox_cb	vf_mbox_cb[HINIC_MOD_MAX];
    102	hinic_pf_mbox_cb	pf_mbox_cb[HINIC_MOD_MAX];
    103	unsigned long		pf_mbox_cb_state[HINIC_MOD_MAX];
    104	unsigned long		vf_mbox_cb_state[HINIC_MOD_MAX];
    105
    106	u8 send_msg_id;
    107	enum mbox_event_state event_flag;
    108
    109	/* lock for mbox event flag */
    110	spinlock_t mbox_lock;
    111
    112	u32 vf_mbx_old_rand_id[MAX_FUNCTION_NUM];
    113	u32 vf_mbx_rand_id[MAX_FUNCTION_NUM];
    114	bool support_vf_random;
    115};
    116
    117struct hinic_mbox_work {
    118	struct work_struct work;
    119	u16 src_func_idx;
    120	struct hinic_mbox_func_to_func *func_to_func;
    121	struct hinic_recv_mbox *recv_mbox;
    122};
    123
    124struct vf_cmd_msg_handle {
    125	u8 cmd;
    126	int (*cmd_msg_handler)(void *hwdev, u16 vf_id,
    127			       void *buf_in, u16 in_size,
    128			       void *buf_out, u16 *out_size);
    129};
    130
    131bool hinic_mbox_check_func_id_8B(struct hinic_hwdev *hwdev, u16 func_idx,
    132				 void *buf_in, u16 in_size);
    133
    134bool hinic_mbox_check_cmd_valid(struct hinic_hwdev *hwdev,
    135				struct vf_cmd_check_handle *cmd_handle,
    136				u16 vf_id, u8 cmd, void *buf_in,
    137				u16 in_size, u8 size);
    138
    139int hinic_register_pf_mbox_cb(struct hinic_hwdev *hwdev,
    140			      enum hinic_mod_type mod,
    141			      hinic_pf_mbox_cb callback);
    142
    143int hinic_register_vf_mbox_cb(struct hinic_hwdev *hwdev,
    144			      enum hinic_mod_type mod,
    145			      hinic_vf_mbox_cb callback);
    146
    147void hinic_unregister_pf_mbox_cb(struct hinic_hwdev *hwdev,
    148				 enum hinic_mod_type mod);
    149
    150void hinic_unregister_vf_mbox_cb(struct hinic_hwdev *hwdev,
    151				 enum hinic_mod_type mod);
    152
    153void hinic_mbox_func_aeqe_handler(void *handle, void *header, u8 size);
    154
    155void hinic_mbox_self_aeqe_handler(void *handle, void *header, u8 size);
    156
    157int hinic_func_to_func_init(struct hinic_hwdev *hwdev);
    158
    159void hinic_func_to_func_free(struct hinic_hwdev *hwdev);
    160
    161int hinic_mbox_to_pf(struct hinic_hwdev *hwdev, enum hinic_mod_type mod,
    162		     u8 cmd, void *buf_in, u16 in_size, void *buf_out,
    163		     u16 *out_size, u32 timeout);
    164
    165int hinic_mbox_to_func(struct hinic_mbox_func_to_func *func_to_func,
    166		       enum hinic_mod_type mod, u16 cmd, u16 dst_func,
    167		       void *buf_in, u16 in_size, void *buf_out,
    168		       u16 *out_size, u32 timeout);
    169
    170int hinic_mbox_to_vf(struct hinic_hwdev *hwdev,
    171		     enum hinic_mod_type mod, u16 vf_id, u8 cmd, void *buf_in,
    172		     u16 in_size, void *buf_out, u16 *out_size, u32 timeout);
    173
    174int hinic_vf_mbox_random_id_init(struct hinic_hwdev *hwdev);
    175
    176#endif