cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hinic_hw_cmdq.h (5341B)


      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