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_HW_QP_CTXT_H
853e7d6feSAviad Krawczyk #define HINIC_HW_QP_CTXT_H
953e7d6feSAviad Krawczyk 
1053e7d6feSAviad Krawczyk #include <linux/types.h>
1153e7d6feSAviad Krawczyk 
1253e7d6feSAviad Krawczyk #include "hinic_hw_cmdq.h"
1353e7d6feSAviad Krawczyk 
1453e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_CEQ_ATTR_GLOBAL_SQ_ID_SHIFT       13
1553e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_CEQ_ATTR_EN_SHIFT                 23
1653e7d6feSAviad Krawczyk 
1753e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_CEQ_ATTR_GLOBAL_SQ_ID_MASK        0x3FF
1853e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_CEQ_ATTR_EN_MASK                  0x1
1953e7d6feSAviad Krawczyk 
2053e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_CEQ_ATTR_SET(val, member)         \
2153e7d6feSAviad Krawczyk 	(((u32)(val) & HINIC_SQ_CTXT_CEQ_ATTR_##member##_MASK) \
2253e7d6feSAviad Krawczyk 	 << HINIC_SQ_CTXT_CEQ_ATTR_##member##_SHIFT)
2353e7d6feSAviad Krawczyk 
2453e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_CI_IDX_SHIFT                      11
2553e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_CI_WRAPPED_SHIFT                  23
2653e7d6feSAviad Krawczyk 
2753e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_CI_IDX_MASK                       0xFFF
2853e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_CI_WRAPPED_MASK                   0x1
2953e7d6feSAviad Krawczyk 
3053e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_CI_SET(val, member)               \
3153e7d6feSAviad Krawczyk 	(((u32)(val) & HINIC_SQ_CTXT_CI_##member##_MASK) \
3253e7d6feSAviad Krawczyk 	 << HINIC_SQ_CTXT_CI_##member##_SHIFT)
3353e7d6feSAviad Krawczyk 
3453e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_WQ_PAGE_HI_PFN_SHIFT              0
3553e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_WQ_PAGE_PI_SHIFT                  20
3653e7d6feSAviad Krawczyk 
3753e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_WQ_PAGE_HI_PFN_MASK               0xFFFFF
3853e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_WQ_PAGE_PI_MASK                   0xFFF
3953e7d6feSAviad Krawczyk 
4053e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_WQ_PAGE_SET(val, member)          \
4153e7d6feSAviad Krawczyk 	(((u32)(val) & HINIC_SQ_CTXT_WQ_PAGE_##member##_MASK) \
4253e7d6feSAviad Krawczyk 	 << HINIC_SQ_CTXT_WQ_PAGE_##member##_SHIFT)
4353e7d6feSAviad Krawczyk 
4453e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_PREF_CACHE_THRESHOLD_SHIFT        0
4553e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_PREF_CACHE_MAX_SHIFT              14
4653e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_PREF_CACHE_MIN_SHIFT              25
4753e7d6feSAviad Krawczyk 
4853e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_PREF_CACHE_THRESHOLD_MASK         0x3FFF
4953e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_PREF_CACHE_MAX_MASK               0x7FF
5053e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_PREF_CACHE_MIN_MASK               0x7F
5153e7d6feSAviad Krawczyk 
5253e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_PREF_WQ_HI_PFN_SHIFT              0
5353e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_PREF_CI_SHIFT                     20
5453e7d6feSAviad Krawczyk 
5553e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_PREF_WQ_HI_PFN_MASK               0xFFFFF
5653e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_PREF_CI_MASK                      0xFFF
5753e7d6feSAviad Krawczyk 
5853e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_PREF_SET(val, member)             \
5953e7d6feSAviad Krawczyk 	(((u32)(val) & HINIC_SQ_CTXT_PREF_##member##_MASK) \
6053e7d6feSAviad Krawczyk 	 << HINIC_SQ_CTXT_PREF_##member##_SHIFT)
6153e7d6feSAviad Krawczyk 
6253e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_WQ_BLOCK_HI_PFN_SHIFT             0
6353e7d6feSAviad Krawczyk 
6453e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_WQ_BLOCK_HI_PFN_MASK              0x7FFFFF
6553e7d6feSAviad Krawczyk 
6653e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_WQ_BLOCK_SET(val, member)         \
6753e7d6feSAviad Krawczyk 	(((u32)(val) & HINIC_SQ_CTXT_WQ_BLOCK_##member##_MASK) \
6853e7d6feSAviad Krawczyk 	 << HINIC_SQ_CTXT_WQ_BLOCK_##member##_SHIFT)
6953e7d6feSAviad Krawczyk 
7053e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_CEQ_ATTR_EN_SHIFT                 0
7153e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_CEQ_ATTR_WRAPPED_SHIFT            1
7253e7d6feSAviad Krawczyk 
7353e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_CEQ_ATTR_EN_MASK                  0x1
7453e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_CEQ_ATTR_WRAPPED_MASK             0x1
7553e7d6feSAviad Krawczyk 
7653e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_CEQ_ATTR_SET(val, member)         \
7753e7d6feSAviad Krawczyk 	(((u32)(val) & HINIC_RQ_CTXT_CEQ_ATTR_##member##_MASK) \
7853e7d6feSAviad Krawczyk 	 << HINIC_RQ_CTXT_CEQ_ATTR_##member##_SHIFT)
7953e7d6feSAviad Krawczyk 
8053e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_PI_IDX_SHIFT                      0
8153e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_PI_INTR_SHIFT                     22
8253e7d6feSAviad Krawczyk 
8353e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_PI_IDX_MASK                       0xFFF
8453e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_PI_INTR_MASK                      0x3FF
8553e7d6feSAviad Krawczyk 
8653e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_PI_SET(val, member)               \
8753e7d6feSAviad Krawczyk 	(((u32)(val) & HINIC_RQ_CTXT_PI_##member##_MASK) << \
8853e7d6feSAviad Krawczyk 	 HINIC_RQ_CTXT_PI_##member##_SHIFT)
8953e7d6feSAviad Krawczyk 
9053e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_WQ_PAGE_HI_PFN_SHIFT              0
9153e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_WQ_PAGE_CI_SHIFT                  20
9253e7d6feSAviad Krawczyk 
9353e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_WQ_PAGE_HI_PFN_MASK               0xFFFFF
9453e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_WQ_PAGE_CI_MASK                   0xFFF
9553e7d6feSAviad Krawczyk 
9653e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_WQ_PAGE_SET(val, member)          \
9753e7d6feSAviad Krawczyk 	(((u32)(val) & HINIC_RQ_CTXT_WQ_PAGE_##member##_MASK) << \
9853e7d6feSAviad Krawczyk 	 HINIC_RQ_CTXT_WQ_PAGE_##member##_SHIFT)
9953e7d6feSAviad Krawczyk 
10053e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_PREF_CACHE_THRESHOLD_SHIFT        0
10153e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_PREF_CACHE_MAX_SHIFT              14
10253e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_PREF_CACHE_MIN_SHIFT              25
10353e7d6feSAviad Krawczyk 
10453e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_PREF_CACHE_THRESHOLD_MASK         0x3FFF
10553e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_PREF_CACHE_MAX_MASK               0x7FF
10653e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_PREF_CACHE_MIN_MASK               0x7F
10753e7d6feSAviad Krawczyk 
10853e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_PREF_WQ_HI_PFN_SHIFT              0
10953e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_PREF_CI_SHIFT                     20
11053e7d6feSAviad Krawczyk 
11153e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_PREF_WQ_HI_PFN_MASK               0xFFFFF
11253e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_PREF_CI_MASK                      0xFFF
11353e7d6feSAviad Krawczyk 
11453e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_PREF_SET(val, member)             \
11553e7d6feSAviad Krawczyk 	(((u32)(val) & HINIC_RQ_CTXT_PREF_##member##_MASK) << \
11653e7d6feSAviad Krawczyk 	 HINIC_RQ_CTXT_PREF_##member##_SHIFT)
11753e7d6feSAviad Krawczyk 
11853e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_WQ_BLOCK_HI_PFN_SHIFT             0
11953e7d6feSAviad Krawczyk 
12053e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_WQ_BLOCK_HI_PFN_MASK              0x7FFFFF
12153e7d6feSAviad Krawczyk 
12253e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_WQ_BLOCK_SET(val, member)         \
12353e7d6feSAviad Krawczyk 	(((u32)(val) & HINIC_RQ_CTXT_WQ_BLOCK_##member##_MASK) << \
12453e7d6feSAviad Krawczyk 	 HINIC_RQ_CTXT_WQ_BLOCK_##member##_SHIFT)
12553e7d6feSAviad Krawczyk 
12653e7d6feSAviad Krawczyk #define HINIC_SQ_CTXT_SIZE(num_sqs) (sizeof(struct hinic_qp_ctxt_header) \
12753e7d6feSAviad Krawczyk 				     + (num_sqs) * sizeof(struct hinic_sq_ctxt))
12853e7d6feSAviad Krawczyk 
12953e7d6feSAviad Krawczyk #define HINIC_RQ_CTXT_SIZE(num_rqs) (sizeof(struct hinic_qp_ctxt_header) \
13053e7d6feSAviad Krawczyk 				     + (num_rqs) * sizeof(struct hinic_rq_ctxt))
13153e7d6feSAviad Krawczyk 
13253e7d6feSAviad Krawczyk #define HINIC_WQ_PAGE_PFN_SHIFT         12
13353e7d6feSAviad Krawczyk #define HINIC_WQ_BLOCK_PFN_SHIFT        9
13453e7d6feSAviad Krawczyk 
13553e7d6feSAviad Krawczyk #define HINIC_WQ_PAGE_PFN(page_addr)    ((page_addr) >> HINIC_WQ_PAGE_PFN_SHIFT)
13653e7d6feSAviad Krawczyk #define HINIC_WQ_BLOCK_PFN(page_addr)   ((page_addr) >> \
13753e7d6feSAviad Krawczyk 					 HINIC_WQ_BLOCK_PFN_SHIFT)
13853e7d6feSAviad Krawczyk 
13953e7d6feSAviad Krawczyk #define HINIC_Q_CTXT_MAX                \
14053e7d6feSAviad Krawczyk 		((HINIC_CMDQ_BUF_SIZE - sizeof(struct hinic_qp_ctxt_header)) \
14153e7d6feSAviad Krawczyk 		 / sizeof(struct hinic_sq_ctxt))
14253e7d6feSAviad Krawczyk 
14353e7d6feSAviad Krawczyk enum hinic_qp_ctxt_type {
14453e7d6feSAviad Krawczyk 	HINIC_QP_CTXT_TYPE_SQ,
14553e7d6feSAviad Krawczyk 	HINIC_QP_CTXT_TYPE_RQ
14653e7d6feSAviad Krawczyk };
14753e7d6feSAviad Krawczyk 
14853e7d6feSAviad Krawczyk struct hinic_qp_ctxt_header {
14953e7d6feSAviad Krawczyk 	u16     num_queues;
15053e7d6feSAviad Krawczyk 	u16     queue_type;
15153e7d6feSAviad Krawczyk 	u32     addr_offset;
15253e7d6feSAviad Krawczyk };
15353e7d6feSAviad Krawczyk 
15453e7d6feSAviad Krawczyk struct hinic_sq_ctxt {
15553e7d6feSAviad Krawczyk 	u32     ceq_attr;
15653e7d6feSAviad Krawczyk 
15753e7d6feSAviad Krawczyk 	u32     ci_wrapped;
15853e7d6feSAviad Krawczyk 
15953e7d6feSAviad Krawczyk 	u32     wq_hi_pfn_pi;
16053e7d6feSAviad Krawczyk 	u32     wq_lo_pfn;
16153e7d6feSAviad Krawczyk 
16253e7d6feSAviad Krawczyk 	u32     pref_cache;
16353e7d6feSAviad Krawczyk 	u32     pref_wrapped;
16453e7d6feSAviad Krawczyk 	u32     pref_wq_hi_pfn_ci;
16553e7d6feSAviad Krawczyk 	u32     pref_wq_lo_pfn;
16653e7d6feSAviad Krawczyk 
16753e7d6feSAviad Krawczyk 	u32     rsvd0;
16853e7d6feSAviad Krawczyk 	u32     rsvd1;
16953e7d6feSAviad Krawczyk 
17053e7d6feSAviad Krawczyk 	u32     wq_block_hi_pfn;
17153e7d6feSAviad Krawczyk 	u32     wq_block_lo_pfn;
17253e7d6feSAviad Krawczyk };
17353e7d6feSAviad Krawczyk 
17453e7d6feSAviad Krawczyk struct hinic_rq_ctxt {
17553e7d6feSAviad Krawczyk 	u32     ceq_attr;
17653e7d6feSAviad Krawczyk 
17753e7d6feSAviad Krawczyk 	u32     pi_intr_attr;
17853e7d6feSAviad Krawczyk 
17953e7d6feSAviad Krawczyk 	u32     wq_hi_pfn_ci;
18053e7d6feSAviad Krawczyk 	u32     wq_lo_pfn;
18153e7d6feSAviad Krawczyk 
18253e7d6feSAviad Krawczyk 	u32     pref_cache;
18353e7d6feSAviad Krawczyk 	u32     pref_wrapped;
18453e7d6feSAviad Krawczyk 
18553e7d6feSAviad Krawczyk 	u32     pref_wq_hi_pfn_ci;
18653e7d6feSAviad Krawczyk 	u32     pref_wq_lo_pfn;
18753e7d6feSAviad Krawczyk 
18853e7d6feSAviad Krawczyk 	u32     pi_paddr_hi;
18953e7d6feSAviad Krawczyk 	u32     pi_paddr_lo;
19053e7d6feSAviad Krawczyk 
19153e7d6feSAviad Krawczyk 	u32     wq_block_hi_pfn;
19253e7d6feSAviad Krawczyk 	u32     wq_block_lo_pfn;
19353e7d6feSAviad Krawczyk };
19453e7d6feSAviad Krawczyk 
19553e7d6feSAviad Krawczyk struct hinic_clean_queue_ctxt {
19653e7d6feSAviad Krawczyk 	struct hinic_qp_ctxt_header	cmdq_hdr;
19753e7d6feSAviad Krawczyk 	u32				ctxt_size;
19853e7d6feSAviad Krawczyk };
19953e7d6feSAviad Krawczyk 
20053e7d6feSAviad Krawczyk struct hinic_sq_ctxt_block {
20153e7d6feSAviad Krawczyk 	struct hinic_qp_ctxt_header hdr;
20253e7d6feSAviad Krawczyk 	struct hinic_sq_ctxt sq_ctxt[HINIC_Q_CTXT_MAX];
20353e7d6feSAviad Krawczyk };
20453e7d6feSAviad Krawczyk 
20553e7d6feSAviad Krawczyk struct hinic_rq_ctxt_block {
206 	struct hinic_qp_ctxt_header hdr;
207 	struct hinic_rq_ctxt rq_ctxt[HINIC_Q_CTXT_MAX];
208 };
209 
210 #endif
211