1b15a9f37SAviad Krawczyk /*
2b15a9f37SAviad Krawczyk  * Huawei HiNIC PCI Express Linux driver
3b15a9f37SAviad Krawczyk  * Copyright(c) 2017 Huawei Technologies Co., Ltd
4b15a9f37SAviad Krawczyk  *
5b15a9f37SAviad Krawczyk  * This program is free software; you can redistribute it and/or modify it
6b15a9f37SAviad Krawczyk  * under the terms and conditions of the GNU General Public License,
7b15a9f37SAviad Krawczyk  * version 2, as published by the Free Software Foundation.
8b15a9f37SAviad Krawczyk  *
9b15a9f37SAviad Krawczyk  * This program is distributed in the hope it will be useful, but WITHOUT
10b15a9f37SAviad Krawczyk  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11b15a9f37SAviad Krawczyk  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12b15a9f37SAviad Krawczyk  * for more details.
13b15a9f37SAviad Krawczyk  *
14b15a9f37SAviad Krawczyk  */
15b15a9f37SAviad Krawczyk 
16b15a9f37SAviad Krawczyk #ifndef HINIC_HW_WQ_H
17b15a9f37SAviad Krawczyk #define HINIC_HW_WQ_H
18b15a9f37SAviad Krawczyk 
19b15a9f37SAviad Krawczyk #include <linux/types.h>
20b15a9f37SAviad Krawczyk #include <linux/semaphore.h>
21b15a9f37SAviad Krawczyk #include <linux/atomic.h>
22b15a9f37SAviad Krawczyk 
23b15a9f37SAviad Krawczyk #include "hinic_hw_if.h"
2476baca2eSAviad Krawczyk #include "hinic_hw_wqe.h"
25b15a9f37SAviad Krawczyk 
26b15a9f37SAviad Krawczyk struct hinic_free_block {
27b15a9f37SAviad Krawczyk 	int     page_idx;
28b15a9f37SAviad Krawczyk 	int     block_idx;
29b15a9f37SAviad Krawczyk };
30b15a9f37SAviad Krawczyk 
31b15a9f37SAviad Krawczyk struct hinic_wq {
32b15a9f37SAviad Krawczyk 	struct hinic_hwif       *hwif;
33b15a9f37SAviad Krawczyk 
34b15a9f37SAviad Krawczyk 	int             page_idx;
35b15a9f37SAviad Krawczyk 	int             block_idx;
36b15a9f37SAviad Krawczyk 
37b15a9f37SAviad Krawczyk 	u16             wqebb_size;
38b15a9f37SAviad Krawczyk 	u16             wq_page_size;
39b15a9f37SAviad Krawczyk 	u16             q_depth;
40b15a9f37SAviad Krawczyk 	u16             max_wqe_size;
41b15a9f37SAviad Krawczyk 	u16             num_wqebbs_per_page;
42ebda9b46SXue Chaojing 	u16		wqebbs_per_page_shift;
43ebda9b46SXue Chaojing 	u16		wqebb_size_shift;
44b15a9f37SAviad Krawczyk 	/* The addresses are 64 bit in the HW */
45b15a9f37SAviad Krawczyk 	u64             block_paddr;
46b15a9f37SAviad Krawczyk 	void            **shadow_block_vaddr;
47b15a9f37SAviad Krawczyk 	u64             *block_vaddr;
48b15a9f37SAviad Krawczyk 
49b15a9f37SAviad Krawczyk 	int             num_q_pages;
50b15a9f37SAviad Krawczyk 	u8              *shadow_wqe;
51b15a9f37SAviad Krawczyk 	u16             *shadow_idx;
52b15a9f37SAviad Krawczyk 
53b15a9f37SAviad Krawczyk 	atomic_t        cons_idx;
54b15a9f37SAviad Krawczyk 	atomic_t        prod_idx;
55b15a9f37SAviad Krawczyk 	atomic_t        delta;
56b15a9f37SAviad Krawczyk 	u16             mask;
57b15a9f37SAviad Krawczyk };
58b15a9f37SAviad Krawczyk 
59b15a9f37SAviad Krawczyk struct hinic_wqs {
60b15a9f37SAviad Krawczyk 	struct hinic_hwif       *hwif;
61b15a9f37SAviad Krawczyk 	int                     num_pages;
62b15a9f37SAviad Krawczyk 
63b15a9f37SAviad Krawczyk 	/* The addresses are 64 bit in the HW */
64b15a9f37SAviad Krawczyk 	u64                     *page_paddr;
65b15a9f37SAviad Krawczyk 	u64                     **page_vaddr;
66b15a9f37SAviad Krawczyk 	void                    ***shadow_page_vaddr;
67b15a9f37SAviad Krawczyk 
68b15a9f37SAviad Krawczyk 	struct hinic_free_block *free_blocks;
69b15a9f37SAviad Krawczyk 	int                     alloc_blk_pos;
70b15a9f37SAviad Krawczyk 	int                     return_blk_pos;
71b15a9f37SAviad Krawczyk 	int                     num_free_blks;
72b15a9f37SAviad Krawczyk 
73b15a9f37SAviad Krawczyk 	/* Lock for getting a free block from the WQ set */
74b15a9f37SAviad Krawczyk 	struct semaphore        alloc_blocks_lock;
75b15a9f37SAviad Krawczyk };
76b15a9f37SAviad Krawczyk 
7753e7d6feSAviad Krawczyk struct hinic_cmdq_pages {
7853e7d6feSAviad Krawczyk 	/* The addresses are 64 bit in the HW */
7953e7d6feSAviad Krawczyk 	u64                     page_paddr;
8053e7d6feSAviad Krawczyk 	u64                     *page_vaddr;
8153e7d6feSAviad Krawczyk 	void                    **shadow_page_vaddr;
8253e7d6feSAviad Krawczyk 
8353e7d6feSAviad Krawczyk 	struct hinic_hwif       *hwif;
8453e7d6feSAviad Krawczyk };
8553e7d6feSAviad Krawczyk 
86d0b9805eSAviad Krawczyk int hinic_wqs_cmdq_alloc(struct hinic_cmdq_pages *cmdq_pages,
87d0b9805eSAviad Krawczyk 			 struct hinic_wq *wq, struct hinic_hwif *hwif,
88d0b9805eSAviad Krawczyk 			 int cmdq_blocks, u16 wqebb_size, u16 wq_page_size,
89d0b9805eSAviad Krawczyk 			 u16 q_depth, u16 max_wqe_size);
90d0b9805eSAviad Krawczyk 
91d0b9805eSAviad Krawczyk void hinic_wqs_cmdq_free(struct hinic_cmdq_pages *cmdq_pages,
92d0b9805eSAviad Krawczyk 			 struct hinic_wq *wq, int cmdq_blocks);
93d0b9805eSAviad Krawczyk 
94b15a9f37SAviad Krawczyk int hinic_wqs_alloc(struct hinic_wqs *wqs, int num_wqs,
95b15a9f37SAviad Krawczyk 		    struct hinic_hwif *hwif);
96b15a9f37SAviad Krawczyk 
97b15a9f37SAviad Krawczyk void hinic_wqs_free(struct hinic_wqs *wqs);
98b15a9f37SAviad Krawczyk 
99b15a9f37SAviad Krawczyk int hinic_wq_allocate(struct hinic_wqs *wqs, struct hinic_wq *wq,
100b15a9f37SAviad Krawczyk 		      u16 wqebb_size, u16 wq_page_size, u16 q_depth,
101b15a9f37SAviad Krawczyk 		      u16 max_wqe_size);
102b15a9f37SAviad Krawczyk 
103b15a9f37SAviad Krawczyk void hinic_wq_free(struct hinic_wqs *wqs, struct hinic_wq *wq);
104b15a9f37SAviad Krawczyk 
10576baca2eSAviad Krawczyk struct hinic_hw_wqe *hinic_get_wqe(struct hinic_wq *wq, unsigned int wqe_size,
10676baca2eSAviad Krawczyk 				   u16 *prod_idx);
10776baca2eSAviad Krawczyk 
108cc18a754SZhao Chen void hinic_return_wqe(struct hinic_wq *wq, unsigned int wqe_size);
109cc18a754SZhao Chen 
11076baca2eSAviad Krawczyk void hinic_put_wqe(struct hinic_wq *wq, unsigned int wqe_size);
11176baca2eSAviad Krawczyk 
11276baca2eSAviad Krawczyk struct hinic_hw_wqe *hinic_read_wqe(struct hinic_wq *wq, unsigned int wqe_size,
11376baca2eSAviad Krawczyk 				    u16 *cons_idx);
11476baca2eSAviad Krawczyk 
115e2585ea7SAviad Krawczyk struct hinic_hw_wqe *hinic_read_wqe_direct(struct hinic_wq *wq, u16 cons_idx);
116e2585ea7SAviad Krawczyk 
11776baca2eSAviad Krawczyk void hinic_write_wqe(struct hinic_wq *wq, struct hinic_hw_wqe *wqe,
11876baca2eSAviad Krawczyk 		     unsigned int wqe_size);
11976baca2eSAviad Krawczyk 
120b15a9f37SAviad Krawczyk #endif
121