12025cf9eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 253e7d6feSAviad Krawczyk /* 353e7d6feSAviad Krawczyk * Huawei HiNIC PCI Express Linux driver 453e7d6feSAviad Krawczyk * Copyright(c) 2017 Huawei Technologies Co., Ltd 553e7d6feSAviad Krawczyk */ 653e7d6feSAviad Krawczyk 753e7d6feSAviad Krawczyk #ifndef HINIC_CMDQ_H 853e7d6feSAviad Krawczyk #define HINIC_CMDQ_H 953e7d6feSAviad Krawczyk 1053e7d6feSAviad Krawczyk #include <linux/types.h> 1153e7d6feSAviad Krawczyk #include <linux/spinlock.h> 1253e7d6feSAviad Krawczyk #include <linux/completion.h> 1353e7d6feSAviad Krawczyk #include <linux/pci.h> 1453e7d6feSAviad Krawczyk 1553e7d6feSAviad Krawczyk #include "hinic_hw_if.h" 1653e7d6feSAviad Krawczyk #include "hinic_hw_wq.h" 1753e7d6feSAviad Krawczyk 18d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_CURR_WQE_PAGE_PFN_SHIFT 0 19d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_EQ_ID_SHIFT 56 20d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_CEQ_ARM_SHIFT 61 21d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_CEQ_EN_SHIFT 62 22d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_WRAPPED_SHIFT 63 23d0b9805eSAviad Krawczyk 24d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_CURR_WQE_PAGE_PFN_MASK 0xFFFFFFFFFFFFF 25d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_EQ_ID_MASK 0x1F 26d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_CEQ_ARM_MASK 0x1 27d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_CEQ_EN_MASK 0x1 28d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_WRAPPED_MASK 0x1 29d0b9805eSAviad Krawczyk 30d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_PAGE_INFO_SET(val, member) \ 31d0b9805eSAviad Krawczyk (((u64)(val) & HINIC_CMDQ_CTXT_##member##_MASK) \ 32d0b9805eSAviad Krawczyk << HINIC_CMDQ_CTXT_##member##_SHIFT) 33d0b9805eSAviad Krawczyk 34*c8c29ec3SLuo bin #define HINIC_CMDQ_CTXT_PAGE_INFO_GET(val, member) \ 35*c8c29ec3SLuo bin (((u64)(val) >> HINIC_CMDQ_CTXT_##member##_SHIFT) \ 36*c8c29ec3SLuo bin & HINIC_CMDQ_CTXT_##member##_MASK) 37*c8c29ec3SLuo bin 38d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_PAGE_INFO_CLEAR(val, member) \ 39d0b9805eSAviad Krawczyk ((val) & (~((u64)HINIC_CMDQ_CTXT_##member##_MASK \ 40d0b9805eSAviad Krawczyk << HINIC_CMDQ_CTXT_##member##_SHIFT))) 41d0b9805eSAviad Krawczyk 42d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_WQ_BLOCK_PFN_SHIFT 0 43d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_CI_SHIFT 52 44d0b9805eSAviad Krawczyk 45d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_WQ_BLOCK_PFN_MASK 0xFFFFFFFFFFFFF 46d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_CI_MASK 0xFFF 47d0b9805eSAviad Krawczyk 48d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_BLOCK_INFO_SET(val, member) \ 49d0b9805eSAviad Krawczyk (((u64)(val) & HINIC_CMDQ_CTXT_##member##_MASK) \ 50d0b9805eSAviad Krawczyk << HINIC_CMDQ_CTXT_##member##_SHIFT) 51d0b9805eSAviad Krawczyk 52*c8c29ec3SLuo bin #define HINIC_CMDQ_CTXT_BLOCK_INFO_GET(val, member) \ 53*c8c29ec3SLuo bin (((u64)(val) >> HINIC_CMDQ_CTXT_##member##_SHIFT) \ 54*c8c29ec3SLuo bin & HINIC_CMDQ_CTXT_##member##_MASK) 55*c8c29ec3SLuo bin 56d0b9805eSAviad Krawczyk #define HINIC_CMDQ_CTXT_BLOCK_INFO_CLEAR(val, member) \ 57d0b9805eSAviad Krawczyk ((val) & (~((u64)HINIC_CMDQ_CTXT_##member##_MASK \ 58d0b9805eSAviad Krawczyk << HINIC_CMDQ_CTXT_##member##_SHIFT))) 59d0b9805eSAviad Krawczyk 6076baca2eSAviad Krawczyk #define HINIC_SAVED_DATA_ARM_SHIFT 31 6176baca2eSAviad Krawczyk 6276baca2eSAviad Krawczyk #define HINIC_SAVED_DATA_ARM_MASK 0x1 6376baca2eSAviad Krawczyk 6476baca2eSAviad Krawczyk #define HINIC_SAVED_DATA_SET(val, member) \ 6576baca2eSAviad Krawczyk (((u32)(val) & HINIC_SAVED_DATA_##member##_MASK) \ 6676baca2eSAviad Krawczyk << HINIC_SAVED_DATA_##member##_SHIFT) 6776baca2eSAviad Krawczyk 6876baca2eSAviad Krawczyk #define HINIC_SAVED_DATA_GET(val, member) \ 6976baca2eSAviad Krawczyk (((val) >> HINIC_SAVED_DATA_##member##_SHIFT) \ 7076baca2eSAviad Krawczyk & HINIC_SAVED_DATA_##member##_MASK) 7176baca2eSAviad Krawczyk 7276baca2eSAviad Krawczyk #define HINIC_SAVED_DATA_CLEAR(val, member) \ 7376baca2eSAviad Krawczyk ((val) & (~(HINIC_SAVED_DATA_##member##_MASK \ 7476baca2eSAviad Krawczyk << HINIC_SAVED_DATA_##member##_SHIFT))) 7576baca2eSAviad Krawczyk 7676baca2eSAviad Krawczyk #define HINIC_CMDQ_DB_INFO_HI_PROD_IDX_SHIFT 0 7776baca2eSAviad Krawczyk #define HINIC_CMDQ_DB_INFO_PATH_SHIFT 23 7876baca2eSAviad Krawczyk #define HINIC_CMDQ_DB_INFO_CMDQ_TYPE_SHIFT 24 7976baca2eSAviad Krawczyk #define HINIC_CMDQ_DB_INFO_DB_TYPE_SHIFT 27 8076baca2eSAviad Krawczyk 8176baca2eSAviad Krawczyk #define HINIC_CMDQ_DB_INFO_HI_PROD_IDX_MASK 0xFF 8276baca2eSAviad Krawczyk #define HINIC_CMDQ_DB_INFO_PATH_MASK 0x1 8376baca2eSAviad Krawczyk #define HINIC_CMDQ_DB_INFO_CMDQ_TYPE_MASK 0x7 8476baca2eSAviad Krawczyk #define HINIC_CMDQ_DB_INFO_DB_TYPE_MASK 0x1F 8576baca2eSAviad Krawczyk 8676baca2eSAviad Krawczyk #define HINIC_CMDQ_DB_INFO_SET(val, member) \ 8776baca2eSAviad Krawczyk (((u32)(val) & HINIC_CMDQ_DB_INFO_##member##_MASK) \ 8876baca2eSAviad Krawczyk << HINIC_CMDQ_DB_INFO_##member##_SHIFT) 8976baca2eSAviad Krawczyk 9053e7d6feSAviad Krawczyk #define HINIC_CMDQ_BUF_SIZE 2048 9153e7d6feSAviad Krawczyk 9276baca2eSAviad Krawczyk #define HINIC_CMDQ_BUF_HW_RSVD 8 9376baca2eSAviad Krawczyk #define HINIC_CMDQ_MAX_DATA_SIZE (HINIC_CMDQ_BUF_SIZE - \ 9476baca2eSAviad Krawczyk HINIC_CMDQ_BUF_HW_RSVD) 9576baca2eSAviad Krawczyk 9653e7d6feSAviad Krawczyk enum hinic_cmdq_type { 9753e7d6feSAviad Krawczyk HINIC_CMDQ_SYNC, 9853e7d6feSAviad Krawczyk 9953e7d6feSAviad Krawczyk HINIC_MAX_CMDQ_TYPES, 10053e7d6feSAviad Krawczyk }; 10153e7d6feSAviad Krawczyk 1027ef37fe4SAviad Krawczyk enum hinic_set_arm_qtype { 1037ef37fe4SAviad Krawczyk HINIC_SET_ARM_CMDQ, 1047ef37fe4SAviad Krawczyk }; 1057ef37fe4SAviad Krawczyk 10676baca2eSAviad Krawczyk enum hinic_cmd_ack_type { 10776baca2eSAviad Krawczyk HINIC_CMD_ACK_TYPE_CMDQ, 10876baca2eSAviad Krawczyk }; 10976baca2eSAviad Krawczyk 11053e7d6feSAviad Krawczyk struct hinic_cmdq_buf { 11153e7d6feSAviad Krawczyk void *buf; 11253e7d6feSAviad Krawczyk dma_addr_t dma_addr; 11353e7d6feSAviad Krawczyk size_t size; 11453e7d6feSAviad Krawczyk }; 11553e7d6feSAviad Krawczyk 1167ef37fe4SAviad Krawczyk struct hinic_cmdq_arm_bit { 1177ef37fe4SAviad Krawczyk u32 q_type; 1187ef37fe4SAviad Krawczyk u32 q_id; 1197ef37fe4SAviad Krawczyk }; 1207ef37fe4SAviad Krawczyk 121d0b9805eSAviad Krawczyk struct hinic_cmdq_ctxt_info { 122d0b9805eSAviad Krawczyk u64 curr_wqe_page_pfn; 123d0b9805eSAviad Krawczyk u64 wq_block_pfn; 124d0b9805eSAviad Krawczyk }; 125d0b9805eSAviad Krawczyk 126d0b9805eSAviad Krawczyk struct hinic_cmdq_ctxt { 127d0b9805eSAviad Krawczyk u8 status; 128d0b9805eSAviad Krawczyk u8 version; 129d0b9805eSAviad Krawczyk u8 rsvd0[6]; 130d0b9805eSAviad Krawczyk 131d0b9805eSAviad Krawczyk u16 func_idx; 132d0b9805eSAviad Krawczyk u8 cmdq_type; 1337dd29ee1SLuo bin u8 ppf_idx; 134d0b9805eSAviad Krawczyk 135d0b9805eSAviad Krawczyk u8 rsvd2[4]; 136d0b9805eSAviad Krawczyk 137d0b9805eSAviad Krawczyk struct hinic_cmdq_ctxt_info ctxt_info; 138d0b9805eSAviad Krawczyk }; 139d0b9805eSAviad Krawczyk 14053e7d6feSAviad Krawczyk struct hinic_cmdq { 14190f86b8aSLuo bin struct hinic_hwdev *hwdev; 14290f86b8aSLuo bin 14353e7d6feSAviad Krawczyk struct hinic_wq *wq; 14453e7d6feSAviad Krawczyk 14553e7d6feSAviad Krawczyk enum hinic_cmdq_type cmdq_type; 14653e7d6feSAviad Krawczyk int wrapped; 14753e7d6feSAviad Krawczyk 14853e7d6feSAviad Krawczyk /* Lock for keeping the doorbell order */ 14953e7d6feSAviad Krawczyk spinlock_t cmdq_lock; 15053e7d6feSAviad Krawczyk 15153e7d6feSAviad Krawczyk struct completion **done; 15253e7d6feSAviad Krawczyk int **errcode; 15353e7d6feSAviad Krawczyk 15453e7d6feSAviad Krawczyk /* doorbell area */ 15553e7d6feSAviad Krawczyk void __iomem *db_base; 15653e7d6feSAviad Krawczyk }; 15753e7d6feSAviad Krawczyk 15853e7d6feSAviad Krawczyk struct hinic_cmdqs { 15953e7d6feSAviad Krawczyk struct hinic_hwif *hwif; 16053e7d6feSAviad Krawczyk 1613203e1d9SRomain Perier struct dma_pool *cmdq_buf_pool; 16253e7d6feSAviad Krawczyk 16353e7d6feSAviad Krawczyk struct hinic_wq *saved_wqs; 16453e7d6feSAviad Krawczyk 16553e7d6feSAviad Krawczyk struct hinic_cmdq_pages cmdq_pages; 16653e7d6feSAviad Krawczyk 16753e7d6feSAviad Krawczyk struct hinic_cmdq cmdq[HINIC_MAX_CMDQ_TYPES]; 16853e7d6feSAviad Krawczyk }; 16953e7d6feSAviad Krawczyk 17053e7d6feSAviad Krawczyk int hinic_alloc_cmdq_buf(struct hinic_cmdqs *cmdqs, 17153e7d6feSAviad Krawczyk struct hinic_cmdq_buf *cmdq_buf); 17253e7d6feSAviad Krawczyk 17353e7d6feSAviad Krawczyk void hinic_free_cmdq_buf(struct hinic_cmdqs *cmdqs, 17453e7d6feSAviad Krawczyk struct hinic_cmdq_buf *cmdq_buf); 17553e7d6feSAviad Krawczyk 17653e7d6feSAviad Krawczyk int hinic_cmdq_direct_resp(struct hinic_cmdqs *cmdqs, 17753e7d6feSAviad Krawczyk enum hinic_mod_type mod, u8 cmd, 17853e7d6feSAviad Krawczyk struct hinic_cmdq_buf *buf_in, u64 *out_param); 17953e7d6feSAviad Krawczyk 18053e7d6feSAviad Krawczyk int hinic_init_cmdqs(struct hinic_cmdqs *cmdqs, struct hinic_hwif *hwif, 18153e7d6feSAviad Krawczyk void __iomem **db_area); 18253e7d6feSAviad Krawczyk 18353e7d6feSAviad Krawczyk void hinic_free_cmdqs(struct hinic_cmdqs *cmdqs); 18453e7d6feSAviad Krawczyk 18553e7d6feSAviad Krawczyk #endif 186