linux/drivers/net/ethernet/huawei/hinic/hinic_hw_mbox.h
<<
>>
Prefs
   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
 177