xref: /openbmc/linux/drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
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