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"
24b15a9f37SAviad Krawczyk 
25b15a9f37SAviad Krawczyk struct hinic_free_block {
26b15a9f37SAviad Krawczyk 	int     page_idx;
27b15a9f37SAviad Krawczyk 	int     block_idx;
28b15a9f37SAviad Krawczyk };
29b15a9f37SAviad Krawczyk 
30b15a9f37SAviad Krawczyk struct hinic_wq {
31b15a9f37SAviad Krawczyk 	struct hinic_hwif       *hwif;
32b15a9f37SAviad Krawczyk 
33b15a9f37SAviad Krawczyk 	int             page_idx;
34b15a9f37SAviad Krawczyk 	int             block_idx;
35b15a9f37SAviad Krawczyk 
36b15a9f37SAviad Krawczyk 	u16             wqebb_size;
37b15a9f37SAviad Krawczyk 	u16             wq_page_size;
38b15a9f37SAviad Krawczyk 	u16             q_depth;
39b15a9f37SAviad Krawczyk 	u16             max_wqe_size;
40b15a9f37SAviad Krawczyk 	u16             num_wqebbs_per_page;
41b15a9f37SAviad Krawczyk 
42b15a9f37SAviad Krawczyk 	/* The addresses are 64 bit in the HW */
43b15a9f37SAviad Krawczyk 	u64             block_paddr;
44b15a9f37SAviad Krawczyk 	void            **shadow_block_vaddr;
45b15a9f37SAviad Krawczyk 	u64             *block_vaddr;
46b15a9f37SAviad Krawczyk 
47b15a9f37SAviad Krawczyk 	int             num_q_pages;
48b15a9f37SAviad Krawczyk 	u8              *shadow_wqe;
49b15a9f37SAviad Krawczyk 	u16             *shadow_idx;
50b15a9f37SAviad Krawczyk 
51b15a9f37SAviad Krawczyk 	atomic_t        cons_idx;
52b15a9f37SAviad Krawczyk 	atomic_t        prod_idx;
53b15a9f37SAviad Krawczyk 	atomic_t        delta;
54b15a9f37SAviad Krawczyk 	u16             mask;
55b15a9f37SAviad Krawczyk };
56b15a9f37SAviad Krawczyk 
57b15a9f37SAviad Krawczyk struct hinic_wqs {
58b15a9f37SAviad Krawczyk 	struct hinic_hwif       *hwif;
59b15a9f37SAviad Krawczyk 	int                     num_pages;
60b15a9f37SAviad Krawczyk 
61b15a9f37SAviad Krawczyk 	/* The addresses are 64 bit in the HW */
62b15a9f37SAviad Krawczyk 	u64                     *page_paddr;
63b15a9f37SAviad Krawczyk 	u64                     **page_vaddr;
64b15a9f37SAviad Krawczyk 	void                    ***shadow_page_vaddr;
65b15a9f37SAviad Krawczyk 
66b15a9f37SAviad Krawczyk 	struct hinic_free_block *free_blocks;
67b15a9f37SAviad Krawczyk 	int                     alloc_blk_pos;
68b15a9f37SAviad Krawczyk 	int                     return_blk_pos;
69b15a9f37SAviad Krawczyk 	int                     num_free_blks;
70b15a9f37SAviad Krawczyk 
71b15a9f37SAviad Krawczyk 	/* Lock for getting a free block from the WQ set */
72b15a9f37SAviad Krawczyk 	struct semaphore        alloc_blocks_lock;
73b15a9f37SAviad Krawczyk };
74b15a9f37SAviad Krawczyk 
7553e7d6feSAviad Krawczyk struct hinic_cmdq_pages {
7653e7d6feSAviad Krawczyk 	/* The addresses are 64 bit in the HW */
7753e7d6feSAviad Krawczyk 	u64                     page_paddr;
7853e7d6feSAviad Krawczyk 	u64                     *page_vaddr;
7953e7d6feSAviad Krawczyk 	void                    **shadow_page_vaddr;
8053e7d6feSAviad Krawczyk 
8153e7d6feSAviad Krawczyk 	struct hinic_hwif       *hwif;
8253e7d6feSAviad Krawczyk };
8353e7d6feSAviad Krawczyk 
84b15a9f37SAviad Krawczyk int hinic_wqs_alloc(struct hinic_wqs *wqs, int num_wqs,
85b15a9f37SAviad Krawczyk 		    struct hinic_hwif *hwif);
86b15a9f37SAviad Krawczyk 
87b15a9f37SAviad Krawczyk void hinic_wqs_free(struct hinic_wqs *wqs);
88b15a9f37SAviad Krawczyk 
89b15a9f37SAviad Krawczyk int hinic_wq_allocate(struct hinic_wqs *wqs, struct hinic_wq *wq,
90b15a9f37SAviad Krawczyk 		      u16 wqebb_size, u16 wq_page_size, u16 q_depth,
91b15a9f37SAviad Krawczyk 		      u16 max_wqe_size);
92b15a9f37SAviad Krawczyk 
93b15a9f37SAviad Krawczyk void hinic_wq_free(struct hinic_wqs *wqs, struct hinic_wq *wq);
94b15a9f37SAviad Krawczyk 
95b15a9f37SAviad Krawczyk #endif
96