/* SPDX-License-Identifier: GPL-2.0-only */ /* * Huawei HiNIC PCI Express Linux driver * Copyright(c) 2017 Huawei Technologies Co., Ltd */ #ifndef HINIC_HW_IO_H #define HINIC_HW_IO_H #include #include #include #include #include "hinic_hw_if.h" #include "hinic_hw_eqs.h" #include "hinic_hw_wq.h" #include "hinic_hw_cmdq.h" #include "hinic_hw_qp.h" #define HINIC_DB_PAGE_SIZE SZ_4K #define HINIC_DB_SIZE SZ_4M #define HINIC_HW_WQ_PAGE_SIZE SZ_4K #define HINIC_DEFAULT_WQ_PAGE_SIZE SZ_256K #define HINIC_DB_MAX_AREAS (HINIC_DB_SIZE / HINIC_DB_PAGE_SIZE) enum hinic_db_type { HINIC_DB_CMDQ_TYPE, HINIC_DB_SQ_TYPE, }; enum hinic_io_path { HINIC_CTRL_PATH, HINIC_DATA_PATH, }; struct hinic_free_db_area { int db_idx[HINIC_DB_MAX_AREAS]; int alloc_pos; int return_pos; int num_free; /* Lock for getting db area */ struct semaphore idx_lock; }; struct hinic_nic_cfg { /* lock for getting nic cfg */ struct mutex cfg_mutex; bool pause_set; u32 auto_neg; u32 rx_pause; u32 tx_pause; }; struct hinic_func_to_io { struct hinic_hwif *hwif; struct hinic_hwdev *hwdev; struct hinic_ceqs ceqs; struct hinic_wqs wqs; struct hinic_wq *sq_wq; struct hinic_wq *rq_wq; struct hinic_qp *qps; u16 max_qps; u16 sq_depth; u16 rq_depth; void __iomem **sq_db; void __iomem *db_base; void *ci_addr_base; dma_addr_t ci_dma_base; struct hinic_free_db_area free_db_area; void __iomem *cmdq_db_area[HINIC_MAX_CMDQ_TYPES]; struct hinic_cmdqs cmdqs; u16 max_vfs; struct vf_data_storage *vf_infos; u8 link_status; struct hinic_nic_cfg nic_cfg; }; struct hinic_wq_page_size { u8 status; u8 version; u8 rsvd0[6]; u16 func_idx; u8 ppf_idx; u8 page_size; u32 rsvd1; }; int hinic_set_wq_page_size(struct hinic_hwdev *hwdev, u16 func_idx, u32 page_size); int hinic_io_create_qps(struct hinic_func_to_io *func_to_io, u16 base_qpn, int num_qps, struct msix_entry *sq_msix_entries, struct msix_entry *rq_msix_entries); void hinic_io_destroy_qps(struct hinic_func_to_io *func_to_io, int num_qps); int hinic_io_init(struct hinic_func_to_io *func_to_io, struct hinic_hwif *hwif, u16 max_qps, int num_ceqs, struct msix_entry *ceq_msix_entries); void hinic_io_free(struct hinic_func_to_io *func_to_io); #endif