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