12025cf9eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 2c3e79bafSAviad Krawczyk /* 3c3e79bafSAviad Krawczyk * Huawei HiNIC PCI Express Linux driver 4c3e79bafSAviad Krawczyk * Copyright(c) 2017 Huawei Technologies Co., Ltd 5c3e79bafSAviad Krawczyk */ 6c3e79bafSAviad Krawczyk 7c3e79bafSAviad Krawczyk #ifndef HINIC_HW_IO_H 8c3e79bafSAviad Krawczyk #define HINIC_HW_IO_H 9c3e79bafSAviad Krawczyk 10c3e79bafSAviad Krawczyk #include <linux/types.h> 11c3e79bafSAviad Krawczyk #include <linux/pci.h> 12f91090f7SAviad Krawczyk #include <linux/semaphore.h> 13f91090f7SAviad Krawczyk #include <linux/sizes.h> 14c3e79bafSAviad Krawczyk 15c3e79bafSAviad Krawczyk #include "hinic_hw_if.h" 16fc9319e4SAviad Krawczyk #include "hinic_hw_eqs.h" 17b15a9f37SAviad Krawczyk #include "hinic_hw_wq.h" 1853e7d6feSAviad Krawczyk #include "hinic_hw_cmdq.h" 19c3e79bafSAviad Krawczyk #include "hinic_hw_qp.h" 20c3e79bafSAviad Krawczyk 21f91090f7SAviad Krawczyk #define HINIC_DB_PAGE_SIZE SZ_4K 22f91090f7SAviad Krawczyk #define HINIC_DB_SIZE SZ_4M 237dd29ee1SLuo bin #define HINIC_HW_WQ_PAGE_SIZE SZ_4K 247dd29ee1SLuo bin #define HINIC_DEFAULT_WQ_PAGE_SIZE SZ_256K 25f91090f7SAviad Krawczyk 26f91090f7SAviad Krawczyk #define HINIC_DB_MAX_AREAS (HINIC_DB_SIZE / HINIC_DB_PAGE_SIZE) 27f91090f7SAviad Krawczyk 2876baca2eSAviad Krawczyk enum hinic_db_type { 2976baca2eSAviad Krawczyk HINIC_DB_CMDQ_TYPE, 3076baca2eSAviad Krawczyk HINIC_DB_SQ_TYPE, 3176baca2eSAviad Krawczyk }; 3276baca2eSAviad Krawczyk 3376baca2eSAviad Krawczyk enum hinic_io_path { 3476baca2eSAviad Krawczyk HINIC_CTRL_PATH, 3576baca2eSAviad Krawczyk HINIC_DATA_PATH, 3676baca2eSAviad Krawczyk }; 3776baca2eSAviad Krawczyk 38f91090f7SAviad Krawczyk struct hinic_free_db_area { 39f91090f7SAviad Krawczyk int db_idx[HINIC_DB_MAX_AREAS]; 40f91090f7SAviad Krawczyk 41f91090f7SAviad Krawczyk int alloc_pos; 42f91090f7SAviad Krawczyk int return_pos; 43f91090f7SAviad Krawczyk 44f91090f7SAviad Krawczyk int num_free; 45f91090f7SAviad Krawczyk 46f91090f7SAviad Krawczyk /* Lock for getting db area */ 47f91090f7SAviad Krawczyk struct semaphore idx_lock; 48f91090f7SAviad Krawczyk }; 49f91090f7SAviad Krawczyk 50ea256222SLuo bin struct hinic_nic_cfg { 51ea256222SLuo bin /* lock for getting nic cfg */ 52ea256222SLuo bin struct mutex cfg_mutex; 53ea256222SLuo bin bool pause_set; 54ea256222SLuo bin u32 auto_neg; 55ea256222SLuo bin u32 rx_pause; 56ea256222SLuo bin u32 tx_pause; 57ea256222SLuo bin }; 58ea256222SLuo bin 59c3e79bafSAviad Krawczyk struct hinic_func_to_io { 60c3e79bafSAviad Krawczyk struct hinic_hwif *hwif; 617dd29ee1SLuo bin struct hinic_hwdev *hwdev; 62253ac3a9SLuo bin u16 global_qpn; 63fc9319e4SAviad Krawczyk struct hinic_ceqs ceqs; 64fc9319e4SAviad Krawczyk 65b15a9f37SAviad Krawczyk struct hinic_wqs wqs; 66b15a9f37SAviad Krawczyk 67b15a9f37SAviad Krawczyk struct hinic_wq *sq_wq; 68b15a9f37SAviad Krawczyk struct hinic_wq *rq_wq; 69b15a9f37SAviad Krawczyk 70c3e79bafSAviad Krawczyk struct hinic_qp *qps; 71c3e79bafSAviad Krawczyk u16 max_qps; 72f91090f7SAviad Krawczyk 73bcab6782SLuo bin u16 sq_depth; 74bcab6782SLuo bin u16 rq_depth; 75bcab6782SLuo bin 76f91090f7SAviad Krawczyk void __iomem **sq_db; 77f91090f7SAviad Krawczyk void __iomem *db_base; 78f91090f7SAviad Krawczyk 79f91090f7SAviad Krawczyk void *ci_addr_base; 80f91090f7SAviad Krawczyk dma_addr_t ci_dma_base; 81f91090f7SAviad Krawczyk 82f91090f7SAviad Krawczyk struct hinic_free_db_area free_db_area; 8353e7d6feSAviad Krawczyk 8453e7d6feSAviad Krawczyk void __iomem *cmdq_db_area[HINIC_MAX_CMDQ_TYPES]; 8553e7d6feSAviad Krawczyk 8653e7d6feSAviad Krawczyk struct hinic_cmdqs cmdqs; 877dd29ee1SLuo bin 887dd29ee1SLuo bin u16 max_vfs; 897dd29ee1SLuo bin struct vf_data_storage *vf_infos; 907dd29ee1SLuo bin u8 link_status; 91ea256222SLuo bin struct hinic_nic_cfg nic_cfg; 92c3e79bafSAviad Krawczyk }; 93c3e79bafSAviad Krawczyk 947dd29ee1SLuo bin struct hinic_wq_page_size { 957dd29ee1SLuo bin u8 status; 967dd29ee1SLuo bin u8 version; 977dd29ee1SLuo bin u8 rsvd0[6]; 987dd29ee1SLuo bin 997dd29ee1SLuo bin u16 func_idx; 1007dd29ee1SLuo bin u8 ppf_idx; 1017dd29ee1SLuo bin u8 page_size; 1027dd29ee1SLuo bin 1037dd29ee1SLuo bin u32 rsvd1; 1047dd29ee1SLuo bin }; 1057dd29ee1SLuo bin 1067dd29ee1SLuo bin int hinic_set_wq_page_size(struct hinic_hwdev *hwdev, u16 func_idx, 1077dd29ee1SLuo bin u32 page_size); 1087dd29ee1SLuo bin 109c3e79bafSAviad Krawczyk int hinic_io_create_qps(struct hinic_func_to_io *func_to_io, 110c3e79bafSAviad Krawczyk u16 base_qpn, int num_qps, 111c3e79bafSAviad Krawczyk struct msix_entry *sq_msix_entries, 112c3e79bafSAviad Krawczyk struct msix_entry *rq_msix_entries); 113c3e79bafSAviad Krawczyk 114c3e79bafSAviad Krawczyk void hinic_io_destroy_qps(struct hinic_func_to_io *func_to_io, 115c3e79bafSAviad Krawczyk int num_qps); 116c3e79bafSAviad Krawczyk 117c3e79bafSAviad Krawczyk int hinic_io_init(struct hinic_func_to_io *func_to_io, 118c3e79bafSAviad Krawczyk struct hinic_hwif *hwif, u16 max_qps, int num_ceqs, 119c3e79bafSAviad Krawczyk struct msix_entry *ceq_msix_entries); 120c3e79bafSAviad Krawczyk 121c3e79bafSAviad Krawczyk void hinic_io_free(struct hinic_func_to_io *func_to_io); 122c3e79bafSAviad Krawczyk 123c3e79bafSAviad Krawczyk #endif 124