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