brintos

brintos / linux-shallow public Read only

0
0
Text · 5.1 KiB · ff09cf0 Raw
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