xref: /linux/drivers/infiniband/hw/irdma/virtchnl.h (revision 2ccb4d203fe4bec72fb333ccc2feb71a462c188d)
1d5edd333SMustafa Ismail /* SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB */
2d5edd333SMustafa Ismail /* Copyright (c) 2015 - 2024 Intel Corporation */
3d5edd333SMustafa Ismail #ifndef IRDMA_VIRTCHNL_H
4d5edd333SMustafa Ismail #define IRDMA_VIRTCHNL_H
5d5edd333SMustafa Ismail 
6d5edd333SMustafa Ismail #include "hmc.h"
7d5edd333SMustafa Ismail #include "irdma.h"
8d5edd333SMustafa Ismail 
9d5edd333SMustafa Ismail /* IRDMA_VCHNL_CHNL_VER_V0 is for legacy hw, no longer supported. */
10d5edd333SMustafa Ismail #define IRDMA_VCHNL_CHNL_VER_V2 2
11d5edd333SMustafa Ismail #define IRDMA_VCHNL_CHNL_VER_MIN IRDMA_VCHNL_CHNL_VER_V2
12d5edd333SMustafa Ismail #define IRDMA_VCHNL_CHNL_VER_MAX IRDMA_VCHNL_CHNL_VER_V2
13d5edd333SMustafa Ismail #define IRDMA_VCHNL_OP_GET_HMC_FCN_V0 0
14d5edd333SMustafa Ismail #define IRDMA_VCHNL_OP_GET_HMC_FCN_V1 1
15d5edd333SMustafa Ismail #define IRDMA_VCHNL_OP_GET_HMC_FCN_V2 2
16d5edd333SMustafa Ismail #define IRDMA_VCHNL_OP_PUT_HMC_FCN_V0 0
177d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_OP_GET_REG_LAYOUT_V0 0
18b800e82fSShiraz Saleem #define IRDMA_VCHNL_OP_QUEUE_VECTOR_MAP_V0 0
19b800e82fSShiraz Saleem #define IRDMA_VCHNL_OP_QUEUE_VECTOR_UNMAP_V0 0
20*d6ed4b69SShiraz Saleem #define IRDMA_VCHNL_OP_ADD_VPORT_V0 0
21*d6ed4b69SShiraz Saleem #define IRDMA_VCHNL_OP_DEL_VPORT_V0 0
22d5edd333SMustafa Ismail #define IRDMA_VCHNL_OP_GET_RDMA_CAPS_V0 0
23d5edd333SMustafa Ismail #define IRDMA_VCHNL_OP_GET_RDMA_CAPS_MIN_SIZE 1
24d5edd333SMustafa Ismail 
257d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_ID_CQPTAIL 0
267d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_ID_CQPDB 1
277d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_ID_CCQPSTATUS 2
287d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_ID_CCQPHIGH 3
297d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_ID_CCQPLOW 4
307d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_ID_CQARM 5
317d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_ID_CQACK 6
327d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_ID_AEQALLOC 7
337d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_ID_CQPERRCODES 8
347d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_ID_WQEALLOC 9
357d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_ID_IPCONFIG0 10
367d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_ID_DB_ADDR_OFFSET 11
377d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_ID_DYN_CTL 12
387d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_ID_AEQITRMASK 13
397d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_ID_CEQITRMASK 14
407d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_INV_ID 0xFFFF
417d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REG_PAGE_REL 0x8000
427d5a7cc7SChristopher Bednarz 
437d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REGFLD_ID_CCQPSTATUS_CQP_OP_ERR 2
447d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REGFLD_ID_CCQPSTATUS_CCQP_DONE 5
457d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REGFLD_ID_CQPSQ_STAG_PDID 6
467d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REGFLD_ID_CQPSQ_CQ_CEQID 7
477d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REGFLD_ID_CQPSQ_CQ_CQID 8
487d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REGFLD_ID_COMMIT_FPM_CQCNT 9
497d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REGFLD_ID_UPESD_HMCN_ID 10
507d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_REGFLD_INV_ID 0xFFFF
517d5a7cc7SChristopher Bednarz 
527d5a7cc7SChristopher Bednarz #define IRDMA_VCHNL_RESP_MIN_SIZE (sizeof(struct irdma_vchnl_resp_buf))
537d5a7cc7SChristopher Bednarz 
54d5edd333SMustafa Ismail enum irdma_vchnl_ops {
55d5edd333SMustafa Ismail 	IRDMA_VCHNL_OP_GET_VER = 0,
56d5edd333SMustafa Ismail 	IRDMA_VCHNL_OP_GET_HMC_FCN = 1,
57d5edd333SMustafa Ismail 	IRDMA_VCHNL_OP_PUT_HMC_FCN = 2,
587d5a7cc7SChristopher Bednarz 	IRDMA_VCHNL_OP_GET_REG_LAYOUT = 11,
59d5edd333SMustafa Ismail 	IRDMA_VCHNL_OP_GET_RDMA_CAPS = 13,
60b800e82fSShiraz Saleem 	IRDMA_VCHNL_OP_QUEUE_VECTOR_MAP = 14,
61b800e82fSShiraz Saleem 	IRDMA_VCHNL_OP_QUEUE_VECTOR_UNMAP = 15,
62*d6ed4b69SShiraz Saleem 	IRDMA_VCHNL_OP_ADD_VPORT = 16,
63*d6ed4b69SShiraz Saleem 	IRDMA_VCHNL_OP_DEL_VPORT = 17,
64d5edd333SMustafa Ismail };
65d5edd333SMustafa Ismail 
66d5edd333SMustafa Ismail struct irdma_vchnl_req_hmc_info {
67d5edd333SMustafa Ismail 	u8 protocol_used;
68d5edd333SMustafa Ismail 	u8 disable_qos;
69d5edd333SMustafa Ismail } __packed;
70d5edd333SMustafa Ismail 
71d5edd333SMustafa Ismail struct irdma_vchnl_resp_hmc_info {
72d5edd333SMustafa Ismail 	u16 hmc_func;
73d5edd333SMustafa Ismail 	u16 qs_handle[IRDMA_MAX_USER_PRIORITY];
74d5edd333SMustafa Ismail } __packed;
75d5edd333SMustafa Ismail 
76b800e82fSShiraz Saleem struct irdma_vchnl_qv_info {
77b800e82fSShiraz Saleem 	u32 v_idx;
78b800e82fSShiraz Saleem 	u16 ceq_idx;
79b800e82fSShiraz Saleem 	u16 aeq_idx;
80b800e82fSShiraz Saleem 	u8 itr_idx;
81b800e82fSShiraz Saleem };
82b800e82fSShiraz Saleem 
83b800e82fSShiraz Saleem struct irdma_vchnl_qvlist_info {
84b800e82fSShiraz Saleem 	u32 num_vectors;
85b800e82fSShiraz Saleem 	struct irdma_vchnl_qv_info qv_info[];
86b800e82fSShiraz Saleem };
87b800e82fSShiraz Saleem 
88*d6ed4b69SShiraz Saleem struct irdma_vchnl_req_vport_info {
89*d6ed4b69SShiraz Saleem 	u16 vport_id;
90*d6ed4b69SShiraz Saleem 	u32 qp1_id;
91*d6ed4b69SShiraz Saleem };
92*d6ed4b69SShiraz Saleem 
93*d6ed4b69SShiraz Saleem struct irdma_vchnl_resp_vport_info {
94*d6ed4b69SShiraz Saleem 	u16 qs_handle[IRDMA_MAX_USER_PRIORITY];
95*d6ed4b69SShiraz Saleem };
96*d6ed4b69SShiraz Saleem 
97d5edd333SMustafa Ismail struct irdma_vchnl_op_buf {
98d5edd333SMustafa Ismail 	u16 op_code;
99d5edd333SMustafa Ismail 	u16 op_ver;
100d5edd333SMustafa Ismail 	u16 buf_len;
101d5edd333SMustafa Ismail 	u16 rsvd;
102d5edd333SMustafa Ismail 	u64 op_ctx;
103d5edd333SMustafa Ismail 	u8 buf[];
104d5edd333SMustafa Ismail } __packed;
105d5edd333SMustafa Ismail 
106d5edd333SMustafa Ismail struct irdma_vchnl_resp_buf {
107d5edd333SMustafa Ismail 	u64 op_ctx;
108d5edd333SMustafa Ismail 	u16 buf_len;
109d5edd333SMustafa Ismail 	s16 op_ret;
110d5edd333SMustafa Ismail 	u16 rsvd[2];
111d5edd333SMustafa Ismail 	u8 buf[];
112d5edd333SMustafa Ismail } __packed;
113d5edd333SMustafa Ismail 
114d5edd333SMustafa Ismail struct irdma_vchnl_rdma_caps {
115d5edd333SMustafa Ismail 	u8 hw_rev;
116d5edd333SMustafa Ismail 	u16 cqp_timeout_s;
117d5edd333SMustafa Ismail 	u16 cqp_def_timeout_s;
118d5edd333SMustafa Ismail 	u16 max_hw_push_len;
119d5edd333SMustafa Ismail } __packed;
120d5edd333SMustafa Ismail 
121d5edd333SMustafa Ismail struct irdma_vchnl_init_info {
122d5edd333SMustafa Ismail 	struct workqueue_struct *vchnl_wq;
123d5edd333SMustafa Ismail 	enum irdma_vers hw_rev;
124d5edd333SMustafa Ismail 	bool privileged;
125d5edd333SMustafa Ismail 	bool is_pf;
126d5edd333SMustafa Ismail };
127d5edd333SMustafa Ismail 
1287d5a7cc7SChristopher Bednarz struct irdma_vchnl_reg_info {
1297d5a7cc7SChristopher Bednarz 	u32 reg_offset;
1307d5a7cc7SChristopher Bednarz 	u16 field_cnt;
1317d5a7cc7SChristopher Bednarz 	u16 reg_id; /* High bit of reg_id: bar or page relative */
1327d5a7cc7SChristopher Bednarz };
1337d5a7cc7SChristopher Bednarz 
1347d5a7cc7SChristopher Bednarz struct irdma_vchnl_reg_field_info {
1357d5a7cc7SChristopher Bednarz 	u8 fld_shift;
1367d5a7cc7SChristopher Bednarz 	u8 fld_bits;
1377d5a7cc7SChristopher Bednarz 	u16 fld_id;
1387d5a7cc7SChristopher Bednarz };
1397d5a7cc7SChristopher Bednarz 
140d5edd333SMustafa Ismail struct irdma_vchnl_req {
141d5edd333SMustafa Ismail 	struct irdma_vchnl_op_buf *vchnl_msg;
142d5edd333SMustafa Ismail 	void *parm;
143d5edd333SMustafa Ismail 	u32 vf_id;
144d5edd333SMustafa Ismail 	u16 parm_len;
145d5edd333SMustafa Ismail 	u16 resp_len;
146d5edd333SMustafa Ismail };
147d5edd333SMustafa Ismail 
148d5edd333SMustafa Ismail struct irdma_vchnl_req_init_info {
149d5edd333SMustafa Ismail 	void *req_parm;
150d5edd333SMustafa Ismail 	void *resp_parm;
151d5edd333SMustafa Ismail 	u16 req_parm_len;
152d5edd333SMustafa Ismail 	u16 resp_parm_len;
153d5edd333SMustafa Ismail 	u16 op_code;
154d5edd333SMustafa Ismail 	u16 op_ver;
155d5edd333SMustafa Ismail } __packed;
156d5edd333SMustafa Ismail 
157*d6ed4b69SShiraz Saleem struct irdma_qos;
158*d6ed4b69SShiraz Saleem 
159d5edd333SMustafa Ismail int irdma_sc_vchnl_init(struct irdma_sc_dev *dev,
160d5edd333SMustafa Ismail 			struct irdma_vchnl_init_info *info);
161d5edd333SMustafa Ismail int irdma_vchnl_req_get_ver(struct irdma_sc_dev *dev, u16 ver_req,
162d5edd333SMustafa Ismail 			    u32 *ver_res);
163d5edd333SMustafa Ismail int irdma_vchnl_req_get_hmc_fcn(struct irdma_sc_dev *dev);
164d5edd333SMustafa Ismail int irdma_vchnl_req_put_hmc_fcn(struct irdma_sc_dev *dev);
165d5edd333SMustafa Ismail int irdma_vchnl_req_get_caps(struct irdma_sc_dev *dev);
166d5edd333SMustafa Ismail int irdma_vchnl_req_get_resp(struct irdma_sc_dev *dev,
167d5edd333SMustafa Ismail 			     struct irdma_vchnl_req *vc_req);
1687d5a7cc7SChristopher Bednarz int irdma_vchnl_req_get_reg_layout(struct irdma_sc_dev *dev);
169b800e82fSShiraz Saleem int irdma_vchnl_req_aeq_vec_map(struct irdma_sc_dev *dev, u32 v_idx);
170b800e82fSShiraz Saleem int irdma_vchnl_req_ceq_vec_map(struct irdma_sc_dev *dev, u16 ceq_id,
171b800e82fSShiraz Saleem 				u32 v_idx);
172*d6ed4b69SShiraz Saleem int irdma_vchnl_req_add_vport(struct irdma_sc_dev *dev, u16 vport_id,
173*d6ed4b69SShiraz Saleem 			      u32 qp1_id, struct irdma_qos *qos);
174*d6ed4b69SShiraz Saleem int irdma_vchnl_req_del_vport(struct irdma_sc_dev *dev, u16 vport_id,
175*d6ed4b69SShiraz Saleem 			      u32 qp1_id);
176d5edd333SMustafa Ismail #endif /* IRDMA_VIRTCHNL_H */
177