linux/drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Huawei HiNIC PCI Express Linux driver
   4 * Copyright(c) 2017 Huawei Technologies Co., Ltd
   5 */
   6
   7#ifndef HINIC_CMDQ_H
   8#define HINIC_CMDQ_H
   9
  10#include <linux/types.h>
  11#include <linux/spinlock.h>
  12#include <linux/completion.h>
  13#include <linux/pci.h>
  14
  15#include "hinic_hw_if.h"
  16#include "hinic_hw_wq.h"
  17
  18#define HINIC_CMDQ_CTXT_CURR_WQE_PAGE_PFN_SHIFT         0
  19#define HINIC_CMDQ_CTXT_EQ_ID_SHIFT                     56
  20#define HINIC_CMDQ_CTXT_CEQ_ARM_SHIFT                   61
  21#define HINIC_CMDQ_CTXT_CEQ_EN_SHIFT                    62
  22#define HINIC_CMDQ_CTXT_WRAPPED_SHIFT                   63
  23
  24#define HINIC_CMDQ_CTXT_CURR_WQE_PAGE_PFN_MASK          0xFFFFFFFFFFFFF
  25#define HINIC_CMDQ_CTXT_EQ_ID_MASK                      0x1F
  26#define HINIC_CMDQ_CTXT_CEQ_ARM_MASK                    0x1
  27#define HINIC_CMDQ_CTXT_CEQ_EN_MASK                     0x1
  28#define HINIC_CMDQ_CTXT_WRAPPED_MASK                    0x1
  29
  30#define HINIC_CMDQ_CTXT_PAGE_INFO_SET(val, member)      \
  31                        (((u64)(val) & HINIC_CMDQ_CTXT_##member##_MASK) \
  32                         << HINIC_CMDQ_CTXT_##member##_SHIFT)
  33
  34#define HINIC_CMDQ_CTXT_PAGE_INFO_GET(val, member)      \
  35                        (((u64)(val) >> HINIC_CMDQ_CTXT_##member##_SHIFT) \
  36                         & HINIC_CMDQ_CTXT_##member##_MASK)
  37
  38#define HINIC_CMDQ_CTXT_PAGE_INFO_CLEAR(val, member)    \
  39                        ((val) & (~((u64)HINIC_CMDQ_CTXT_##member##_MASK \
  40                         << HINIC_CMDQ_CTXT_##member##_SHIFT)))
  41
  42#define HINIC_CMDQ_CTXT_WQ_BLOCK_PFN_SHIFT              0
  43#define HINIC_CMDQ_CTXT_CI_SHIFT                        52
  44
  45#define HINIC_CMDQ_CTXT_WQ_BLOCK_PFN_MASK               0xFFFFFFFFFFFFF
  46#define HINIC_CMDQ_CTXT_CI_MASK                         0xFFF
  47
  48#define HINIC_CMDQ_CTXT_BLOCK_INFO_SET(val, member)     \
  49                        (((u64)(val) & HINIC_CMDQ_CTXT_##member##_MASK) \
  50                         << HINIC_CMDQ_CTXT_##member##_SHIFT)
  51
  52#define HINIC_CMDQ_CTXT_BLOCK_INFO_GET(val, member)     \
  53                        (((u64)(val) >> HINIC_CMDQ_CTXT_##member##_SHIFT) \
  54                        & HINIC_CMDQ_CTXT_##member##_MASK)
  55
  56#define HINIC_CMDQ_CTXT_BLOCK_INFO_CLEAR(val, member)   \
  57                        ((val) & (~((u64)HINIC_CMDQ_CTXT_##member##_MASK \
  58                         << HINIC_CMDQ_CTXT_##member##_SHIFT)))
  59
  60#define HINIC_SAVED_DATA_ARM_SHIFT                      31
  61
  62#define HINIC_SAVED_DATA_ARM_MASK                       0x1
  63
  64#define HINIC_SAVED_DATA_SET(val, member)               \
  65                        (((u32)(val) & HINIC_SAVED_DATA_##member##_MASK) \
  66                         << HINIC_SAVED_DATA_##member##_SHIFT)
  67
  68#define HINIC_SAVED_DATA_GET(val, member)               \
  69                        (((val) >> HINIC_SAVED_DATA_##member##_SHIFT) \
  70                         & HINIC_SAVED_DATA_##member##_MASK)
  71
  72#define HINIC_SAVED_DATA_CLEAR(val, member)             \
  73                        ((val) & (~(HINIC_SAVED_DATA_##member##_MASK \
  74                         << HINIC_SAVED_DATA_##member##_SHIFT)))
  75
  76#define HINIC_CMDQ_DB_INFO_HI_PROD_IDX_SHIFT            0
  77#define HINIC_CMDQ_DB_INFO_PATH_SHIFT                   23
  78#define HINIC_CMDQ_DB_INFO_CMDQ_TYPE_SHIFT              24
  79#define HINIC_CMDQ_DB_INFO_DB_TYPE_SHIFT                27
  80
  81#define HINIC_CMDQ_DB_INFO_HI_PROD_IDX_MASK             0xFF
  82#define HINIC_CMDQ_DB_INFO_PATH_MASK                    0x1
  83#define HINIC_CMDQ_DB_INFO_CMDQ_TYPE_MASK               0x7
  84#define HINIC_CMDQ_DB_INFO_DB_TYPE_MASK                 0x1F
  85
  86#define HINIC_CMDQ_DB_INFO_SET(val, member)             \
  87                        (((u32)(val) & HINIC_CMDQ_DB_INFO_##member##_MASK) \
  88                         << HINIC_CMDQ_DB_INFO_##member##_SHIFT)
  89
  90#define HINIC_CMDQ_BUF_SIZE             2048
  91
  92#define HINIC_CMDQ_BUF_HW_RSVD          8
  93#define HINIC_CMDQ_MAX_DATA_SIZE        (HINIC_CMDQ_BUF_SIZE - \
  94                                         HINIC_CMDQ_BUF_HW_RSVD)
  95
  96enum hinic_cmdq_type {
  97        HINIC_CMDQ_SYNC,
  98
  99        HINIC_MAX_CMDQ_TYPES,
 100};
 101
 102enum hinic_set_arm_qtype {
 103        HINIC_SET_ARM_CMDQ,
 104};
 105
 106enum hinic_cmd_ack_type {
 107        HINIC_CMD_ACK_TYPE_CMDQ,
 108};
 109
 110struct hinic_cmdq_buf {
 111        void            *buf;
 112        dma_addr_t      dma_addr;
 113        size_t          size;
 114};
 115
 116struct hinic_cmdq_arm_bit {
 117        u32     q_type;
 118        u32     q_id;
 119};
 120
 121struct hinic_cmdq_ctxt_info {
 122        u64     curr_wqe_page_pfn;
 123        u64     wq_block_pfn;
 124};
 125
 126struct hinic_cmdq_ctxt {
 127        u8      status;
 128        u8      version;
 129        u8      rsvd0[6];
 130
 131        u16     func_idx;
 132        u8      cmdq_type;
 133        u8      ppf_idx;
 134
 135        u8      rsvd2[4];
 136
 137        struct hinic_cmdq_ctxt_info ctxt_info;
 138};
 139
 140struct hinic_cmdq {
 141        struct hinic_hwdev      *hwdev;
 142
 143        struct hinic_wq         *wq;
 144
 145        enum hinic_cmdq_type    cmdq_type;
 146        int                     wrapped;
 147
 148        /* Lock for keeping the doorbell order */
 149        spinlock_t              cmdq_lock;
 150
 151        struct completion       **done;
 152        int                     **errcode;
 153
 154        /* doorbell area */
 155        void __iomem            *db_base;
 156};
 157
 158struct hinic_cmdqs {
 159        struct hinic_hwif       *hwif;
 160
 161        struct dma_pool         *cmdq_buf_pool;
 162
 163        struct hinic_wq         *saved_wqs;
 164
 165        struct hinic_cmdq_pages cmdq_pages;
 166
 167        struct hinic_cmdq       cmdq[HINIC_MAX_CMDQ_TYPES];
 168};
 169
 170int hinic_alloc_cmdq_buf(struct hinic_cmdqs *cmdqs,
 171                         struct hinic_cmdq_buf *cmdq_buf);
 172
 173void hinic_free_cmdq_buf(struct hinic_cmdqs *cmdqs,
 174                         struct hinic_cmdq_buf *cmdq_buf);
 175
 176int hinic_cmdq_direct_resp(struct hinic_cmdqs *cmdqs,
 177                           enum hinic_mod_type mod, u8 cmd,
 178                           struct hinic_cmdq_buf *buf_in, u64 *out_param);
 179
 180int hinic_set_arm_bit(struct hinic_cmdqs *cmdqs,
 181                      enum hinic_set_arm_qtype q_type, u32 q_id);
 182
 183int hinic_init_cmdqs(struct hinic_cmdqs *cmdqs, struct hinic_hwif *hwif,
 184                     void __iomem **db_area);
 185
 186void hinic_free_cmdqs(struct hinic_cmdqs *cmdqs);
 187
 188#endif
 189