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