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; 42b15a9f37SAviad Krawczyk 43b15a9f37SAviad Krawczyk /* The addresses are 64 bit in the HW */ 44b15a9f37SAviad Krawczyk u64 block_paddr; 45b15a9f37SAviad Krawczyk void **shadow_block_vaddr; 46b15a9f37SAviad Krawczyk u64 *block_vaddr; 47b15a9f37SAviad Krawczyk 48b15a9f37SAviad Krawczyk int num_q_pages; 49b15a9f37SAviad Krawczyk u8 *shadow_wqe; 50b15a9f37SAviad Krawczyk u16 *shadow_idx; 51b15a9f37SAviad Krawczyk 52b15a9f37SAviad Krawczyk atomic_t cons_idx; 53b15a9f37SAviad Krawczyk atomic_t prod_idx; 54b15a9f37SAviad Krawczyk atomic_t delta; 55b15a9f37SAviad Krawczyk u16 mask; 56b15a9f37SAviad Krawczyk }; 57b15a9f37SAviad Krawczyk 58b15a9f37SAviad Krawczyk struct hinic_wqs { 59b15a9f37SAviad Krawczyk struct hinic_hwif *hwif; 60b15a9f37SAviad Krawczyk int num_pages; 61b15a9f37SAviad Krawczyk 62b15a9f37SAviad Krawczyk /* The addresses are 64 bit in the HW */ 63b15a9f37SAviad Krawczyk u64 *page_paddr; 64b15a9f37SAviad Krawczyk u64 **page_vaddr; 65b15a9f37SAviad Krawczyk void ***shadow_page_vaddr; 66b15a9f37SAviad Krawczyk 67b15a9f37SAviad Krawczyk struct hinic_free_block *free_blocks; 68b15a9f37SAviad Krawczyk int alloc_blk_pos; 69b15a9f37SAviad Krawczyk int return_blk_pos; 70b15a9f37SAviad Krawczyk int num_free_blks; 71b15a9f37SAviad Krawczyk 72b15a9f37SAviad Krawczyk /* Lock for getting a free block from the WQ set */ 73b15a9f37SAviad Krawczyk struct semaphore alloc_blocks_lock; 74b15a9f37SAviad Krawczyk }; 75b15a9f37SAviad Krawczyk 7653e7d6feSAviad Krawczyk struct hinic_cmdq_pages { 7753e7d6feSAviad Krawczyk /* The addresses are 64 bit in the HW */ 7853e7d6feSAviad Krawczyk u64 page_paddr; 7953e7d6feSAviad Krawczyk u64 *page_vaddr; 8053e7d6feSAviad Krawczyk void **shadow_page_vaddr; 8153e7d6feSAviad Krawczyk 8253e7d6feSAviad Krawczyk struct hinic_hwif *hwif; 8353e7d6feSAviad Krawczyk }; 8453e7d6feSAviad Krawczyk 85d0b9805eSAviad Krawczyk int hinic_wqs_cmdq_alloc(struct hinic_cmdq_pages *cmdq_pages, 86d0b9805eSAviad Krawczyk struct hinic_wq *wq, struct hinic_hwif *hwif, 87d0b9805eSAviad Krawczyk int cmdq_blocks, u16 wqebb_size, u16 wq_page_size, 88d0b9805eSAviad Krawczyk u16 q_depth, u16 max_wqe_size); 89d0b9805eSAviad Krawczyk 90d0b9805eSAviad Krawczyk void hinic_wqs_cmdq_free(struct hinic_cmdq_pages *cmdq_pages, 91d0b9805eSAviad Krawczyk struct hinic_wq *wq, int cmdq_blocks); 92d0b9805eSAviad Krawczyk 93b15a9f37SAviad Krawczyk int hinic_wqs_alloc(struct hinic_wqs *wqs, int num_wqs, 94b15a9f37SAviad Krawczyk struct hinic_hwif *hwif); 95b15a9f37SAviad Krawczyk 96b15a9f37SAviad Krawczyk void hinic_wqs_free(struct hinic_wqs *wqs); 97b15a9f37SAviad Krawczyk 98b15a9f37SAviad Krawczyk int hinic_wq_allocate(struct hinic_wqs *wqs, struct hinic_wq *wq, 99b15a9f37SAviad Krawczyk u16 wqebb_size, u16 wq_page_size, u16 q_depth, 100b15a9f37SAviad Krawczyk u16 max_wqe_size); 101b15a9f37SAviad Krawczyk 102b15a9f37SAviad Krawczyk void hinic_wq_free(struct hinic_wqs *wqs, struct hinic_wq *wq); 103b15a9f37SAviad Krawczyk 10476baca2eSAviad Krawczyk struct hinic_hw_wqe *hinic_get_wqe(struct hinic_wq *wq, unsigned int wqe_size, 10576baca2eSAviad Krawczyk u16 *prod_idx); 10676baca2eSAviad Krawczyk 10776baca2eSAviad Krawczyk void hinic_put_wqe(struct hinic_wq *wq, unsigned int wqe_size); 10876baca2eSAviad Krawczyk 10976baca2eSAviad Krawczyk struct hinic_hw_wqe *hinic_read_wqe(struct hinic_wq *wq, unsigned int wqe_size, 11076baca2eSAviad Krawczyk u16 *cons_idx); 11176baca2eSAviad Krawczyk 11276baca2eSAviad Krawczyk void hinic_write_wqe(struct hinic_wq *wq, struct hinic_hw_wqe *wqe, 11376baca2eSAviad Krawczyk unsigned int wqe_size); 11476baca2eSAviad Krawczyk 115b15a9f37SAviad Krawczyk #endif 116