brintos

brintos / linux-shallow public Read only

0
0
Text · 4.3 KiB · 33ac781 Raw
173 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/* Huawei HiNIC PCI Express Linux driver3 * Copyright(c) 2017 Huawei Technologies Co., Ltd4 */5 6#ifndef HINIC_MBOX_H_7#define HINIC_MBOX_H_8 9#define HINIC_MBOX_PF_SEND_ERR		0x110#define HINIC_MBOX_PF_BUSY_ACTIVE_FW	0x211#define HINIC_MBOX_VF_CMD_ERROR		0x312 13#define HINIC_MAX_FUNCTIONS		51214 15#define HINIC_MAX_PF_FUNCS		1616 17#define HINIC_MBOX_WQ_NAME		"hinic_mbox"18 19#define HINIC_FUNC_CSR_MAILBOX_DATA_OFF			0x8020#define HINIC_FUNC_CSR_MAILBOX_CONTROL_OFF		0x010021#define HINIC_FUNC_CSR_MAILBOX_INT_OFFSET_OFF		0x010422#define HINIC_FUNC_CSR_MAILBOX_RESULT_H_OFF		0x010823#define HINIC_FUNC_CSR_MAILBOX_RESULT_L_OFF		0x010C24 25#define MAX_FUNCTION_NUM		51226 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 153int hinic_func_to_func_init(struct hinic_hwdev *hwdev);154 155void hinic_func_to_func_free(struct hinic_hwdev *hwdev);156 157int hinic_mbox_to_pf(struct hinic_hwdev *hwdev, enum hinic_mod_type mod,158		     u8 cmd, void *buf_in, u16 in_size, void *buf_out,159		     u16 *out_size, u32 timeout);160 161int hinic_mbox_to_func(struct hinic_mbox_func_to_func *func_to_func,162		       enum hinic_mod_type mod, u16 cmd, u16 dst_func,163		       void *buf_in, u16 in_size, void *buf_out,164		       u16 *out_size, u32 timeout);165 166int hinic_mbox_to_vf(struct hinic_hwdev *hwdev,167		     enum hinic_mod_type mod, u16 vf_id, u8 cmd, void *buf_in,168		     u16 in_size, void *buf_out, u16 *out_size, u32 timeout);169 170int hinic_vf_mbox_random_id_init(struct hinic_hwdev *hwdev);171 172#endif173