xref: /openbmc/linux/drivers/net/ethernet/huawei/hinic/hinic_hw_io.h (revision cbecf716ca618fd44feda6bd9a64a8179d031fc5)
1  /* SPDX-License-Identifier: GPL-2.0-only */
2  /*
3   * Huawei HiNIC PCI Express Linux driver
4   * Copyright(c) 2017 Huawei Technologies Co., Ltd
5   */
6  
7  #ifndef HINIC_HW_IO_H
8  #define HINIC_HW_IO_H
9  
10  #include <linux/types.h>
11  #include <linux/pci.h>
12  #include <linux/semaphore.h>
13  #include <linux/sizes.h>
14  
15  #include "hinic_hw_if.h"
16  #include "hinic_hw_eqs.h"
17  #include "hinic_hw_wq.h"
18  #include "hinic_hw_cmdq.h"
19  #include "hinic_hw_qp.h"
20  
21  #define HINIC_DB_PAGE_SIZE      SZ_4K
22  #define HINIC_DB_SIZE           SZ_4M
23  #define HINIC_HW_WQ_PAGE_SIZE	SZ_4K
24  #define HINIC_DEFAULT_WQ_PAGE_SIZE SZ_256K
25  
26  #define HINIC_DB_MAX_AREAS      (HINIC_DB_SIZE / HINIC_DB_PAGE_SIZE)
27  
28  enum hinic_db_type {
29  	HINIC_DB_CMDQ_TYPE,
30  	HINIC_DB_SQ_TYPE,
31  };
32  
33  enum hinic_io_path {
34  	HINIC_CTRL_PATH,
35  	HINIC_DATA_PATH,
36  };
37  
38  struct hinic_free_db_area {
39  	int             db_idx[HINIC_DB_MAX_AREAS];
40  
41  	int             alloc_pos;
42  	int             return_pos;
43  
44  	int             num_free;
45  
46  	/* Lock for getting db area */
47  	struct semaphore        idx_lock;
48  };
49  
50  struct hinic_nic_cfg {
51  	/* lock for getting nic cfg */
52  	struct mutex		cfg_mutex;
53  	bool			pause_set;
54  	u32			auto_neg;
55  	u32			rx_pause;
56  	u32			tx_pause;
57  };
58  
59  struct hinic_func_to_io {
60  	struct hinic_hwif       *hwif;
61  	struct hinic_hwdev      *hwdev;
62  	u16			global_qpn;
63  	struct hinic_ceqs       ceqs;
64  
65  	struct hinic_wqs        wqs;
66  
67  	struct hinic_wq         *sq_wq;
68  	struct hinic_wq         *rq_wq;
69  
70  	struct hinic_qp         *qps;
71  	u16                     max_qps;
72  
73  	u16			sq_depth;
74  	u16			rq_depth;
75  
76  	void __iomem            **sq_db;
77  	void __iomem            *db_base;
78  
79  	void                    *ci_addr_base;
80  	dma_addr_t              ci_dma_base;
81  
82  	struct hinic_free_db_area       free_db_area;
83  
84  	void __iomem                    *cmdq_db_area[HINIC_MAX_CMDQ_TYPES];
85  
86  	struct hinic_cmdqs              cmdqs;
87  
88  	u16			max_vfs;
89  	struct vf_data_storage	*vf_infos;
90  	u8			link_status;
91  	struct hinic_nic_cfg	nic_cfg;
92  };
93  
94  struct hinic_wq_page_size {
95  	u8	status;
96  	u8	version;
97  	u8	rsvd0[6];
98  
99  	u16	func_idx;
100  	u8	ppf_idx;
101  	u8	page_size;
102  
103  	u32	rsvd1;
104  };
105  
106  int hinic_set_wq_page_size(struct hinic_hwdev *hwdev, u16 func_idx,
107  			   u32 page_size);
108  
109  int hinic_io_create_qps(struct hinic_func_to_io *func_to_io,
110  			u16 base_qpn, int num_qps,
111  			struct msix_entry *sq_msix_entries,
112  			struct msix_entry *rq_msix_entries);
113  
114  void hinic_io_destroy_qps(struct hinic_func_to_io *func_to_io,
115  			  int num_qps);
116  
117  int hinic_io_init(struct hinic_func_to_io *func_to_io,
118  		  struct hinic_hwif *hwif, u16 max_qps, int num_ceqs,
119  		  struct msix_entry *ceq_msix_entries);
120  
121  void hinic_io_free(struct hinic_func_to_io *func_to_io);
122  
123  #endif
124