1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Huawei HiNIC PCI Express Linux driver 4 * Copyright(c) 2017 Huawei Technologies Co., Ltd 5 */ 6 7 #ifndef HINIC_HW_WQ_H 8 #define HINIC_HW_WQ_H 9 10 #include <linux/types.h> 11 #include <linux/semaphore.h> 12 #include <linux/atomic.h> 13 14 #include "hinic_hw_if.h" 15 #include "hinic_hw_wqe.h" 16 17 struct hinic_free_block { 18 int page_idx; 19 int block_idx; 20 }; 21 22 struct hinic_wq { 23 struct hinic_hwif *hwif; 24 25 int page_idx; 26 int block_idx; 27 28 u16 wqebb_size; 29 u32 wq_page_size; 30 u16 q_depth; 31 u16 max_wqe_size; 32 u16 num_wqebbs_per_page; 33 u16 wqebbs_per_page_shift; 34 u16 wqebb_size_shift; 35 /* The addresses are 64 bit in the HW */ 36 u64 block_paddr; 37 void **shadow_block_vaddr; 38 u64 *block_vaddr; 39 40 int num_q_pages; 41 u8 *shadow_wqe; 42 u16 *shadow_idx; 43 44 atomic_t cons_idx; 45 atomic_t prod_idx; 46 atomic_t delta; 47 u16 mask; 48 }; 49 50 struct hinic_wqs { 51 struct hinic_hwif *hwif; 52 int num_pages; 53 54 /* The addresses are 64 bit in the HW */ 55 u64 *page_paddr; 56 u64 **page_vaddr; 57 void ***shadow_page_vaddr; 58 59 struct hinic_free_block *free_blocks; 60 int alloc_blk_pos; 61 int return_blk_pos; 62 int num_free_blks; 63 64 /* Lock for getting a free block from the WQ set */ 65 struct semaphore alloc_blocks_lock; 66 }; 67 68 struct hinic_cmdq_pages { 69 /* The addresses are 64 bit in the HW */ 70 u64 page_paddr; 71 u64 *page_vaddr; 72 void **shadow_page_vaddr; 73 74 struct hinic_hwif *hwif; 75 }; 76 77 int hinic_wqs_cmdq_alloc(struct hinic_cmdq_pages *cmdq_pages, 78 struct hinic_wq *wq, struct hinic_hwif *hwif, 79 int cmdq_blocks, u16 wqebb_size, u32 wq_page_size, 80 u16 q_depth, u16 max_wqe_size); 81 82 void hinic_wqs_cmdq_free(struct hinic_cmdq_pages *cmdq_pages, 83 struct hinic_wq *wq, int cmdq_blocks); 84 85 int hinic_wqs_alloc(struct hinic_wqs *wqs, int num_wqs, 86 struct hinic_hwif *hwif); 87 88 void hinic_wqs_free(struct hinic_wqs *wqs); 89 90 int hinic_wq_allocate(struct hinic_wqs *wqs, struct hinic_wq *wq, 91 u16 wqebb_size, u32 wq_page_size, u16 q_depth, 92 u16 max_wqe_size); 93 94 void hinic_wq_free(struct hinic_wqs *wqs, struct hinic_wq *wq); 95 96 struct hinic_hw_wqe *hinic_get_wqe(struct hinic_wq *wq, unsigned int wqe_size, 97 u16 *prod_idx); 98 99 void hinic_return_wqe(struct hinic_wq *wq, unsigned int wqe_size); 100 101 void hinic_put_wqe(struct hinic_wq *wq, unsigned int wqe_size); 102 103 struct hinic_hw_wqe *hinic_read_wqe(struct hinic_wq *wq, unsigned int wqe_size, 104 u16 *cons_idx); 105 106 struct hinic_hw_wqe *hinic_read_wqe_direct(struct hinic_wq *wq, u16 cons_idx); 107 108 void hinic_write_wqe(struct hinic_wq *wq, struct hinic_hw_wqe *wqe, 109 unsigned int wqe_size); 110 111 #endif 112