186 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Huawei HiNIC PCI Express Linux driver4 * Copyright(c) 2017 Huawei Technologies Co., Ltd5 */6 7#ifndef HINIC_CMDQ_H8#define HINIC_CMDQ_H9 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 019#define HINIC_CMDQ_CTXT_EQ_ID_SHIFT 5620#define HINIC_CMDQ_CTXT_CEQ_ARM_SHIFT 6121#define HINIC_CMDQ_CTXT_CEQ_EN_SHIFT 6222#define HINIC_CMDQ_CTXT_WRAPPED_SHIFT 6323 24#define HINIC_CMDQ_CTXT_CURR_WQE_PAGE_PFN_MASK 0xFFFFFFFFFFFFF25#define HINIC_CMDQ_CTXT_EQ_ID_MASK 0x1F26#define HINIC_CMDQ_CTXT_CEQ_ARM_MASK 0x127#define HINIC_CMDQ_CTXT_CEQ_EN_MASK 0x128#define HINIC_CMDQ_CTXT_WRAPPED_MASK 0x129 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 043#define HINIC_CMDQ_CTXT_CI_SHIFT 5244 45#define HINIC_CMDQ_CTXT_WQ_BLOCK_PFN_MASK 0xFFFFFFFFFFFFF46#define HINIC_CMDQ_CTXT_CI_MASK 0xFFF47 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 3161 62#define HINIC_SAVED_DATA_ARM_MASK 0x163 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 077#define HINIC_CMDQ_DB_INFO_PATH_SHIFT 2378#define HINIC_CMDQ_DB_INFO_CMDQ_TYPE_SHIFT 2479#define HINIC_CMDQ_DB_INFO_DB_TYPE_SHIFT 2780 81#define HINIC_CMDQ_DB_INFO_HI_PROD_IDX_MASK 0xFF82#define HINIC_CMDQ_DB_INFO_PATH_MASK 0x183#define HINIC_CMDQ_DB_INFO_CMDQ_TYPE_MASK 0x784#define HINIC_CMDQ_DB_INFO_DB_TYPE_MASK 0x1F85 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 204891 92#define HINIC_CMDQ_BUF_HW_RSVD 893#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_init_cmdqs(struct hinic_cmdqs *cmdqs, struct hinic_hwif *hwif,181 void __iomem **db_area);182 183void hinic_free_cmdqs(struct hinic_cmdqs *cmdqs);184 185#endif186