xref: /linux/include/net/mana/hw_channel.h (revision 59656519)
1fd325cd6SLong Li /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2fd325cd6SLong Li /* Copyright (c) 2021, Microsoft Corporation. */
3fd325cd6SLong Li 
4fd325cd6SLong Li #ifndef _HW_CHANNEL_H
5fd325cd6SLong Li #define _HW_CHANNEL_H
6fd325cd6SLong Li 
7fd325cd6SLong Li #define DEFAULT_LOG2_THROTTLING_FOR_ERROR_EQ  4
8fd325cd6SLong Li 
9fd325cd6SLong Li #define HW_CHANNEL_MAX_REQUEST_SIZE  0x1000
10fd325cd6SLong Li #define HW_CHANNEL_MAX_RESPONSE_SIZE 0x1000
11fd325cd6SLong Li 
12fd325cd6SLong Li #define HW_CHANNEL_VF_BOOTSTRAP_QUEUE_DEPTH 1
13fd325cd6SLong Li 
14fd325cd6SLong Li #define HWC_INIT_DATA_CQID		1
15fd325cd6SLong Li #define HWC_INIT_DATA_RQID		2
16fd325cd6SLong Li #define HWC_INIT_DATA_SQID		3
17fd325cd6SLong Li #define HWC_INIT_DATA_QUEUE_DEPTH	4
18fd325cd6SLong Li #define HWC_INIT_DATA_MAX_REQUEST	5
19fd325cd6SLong Li #define HWC_INIT_DATA_MAX_RESPONSE	6
20fd325cd6SLong Li #define HWC_INIT_DATA_MAX_NUM_CQS	7
21fd325cd6SLong Li #define HWC_INIT_DATA_PDID		8
22fd325cd6SLong Li #define HWC_INIT_DATA_GPA_MKEY		9
23fd325cd6SLong Li #define HWC_INIT_DATA_PF_DEST_RQ_ID	10
24fd325cd6SLong Li #define HWC_INIT_DATA_PF_DEST_CQ_ID	11
25fd325cd6SLong Li 
2662c1bff5SSouradeep Chakrabarti #define HWC_DATA_CFG_HWC_TIMEOUT 1
2762c1bff5SSouradeep Chakrabarti 
2862c1bff5SSouradeep Chakrabarti #define HW_CHANNEL_WAIT_RESOURCE_TIMEOUT_MS 30000
2962c1bff5SSouradeep Chakrabarti 
30fd325cd6SLong Li /* Structures labeled with "HW DATA" are exchanged with the hardware. All of
31fd325cd6SLong Li  * them are naturally aligned and hence don't need __packed.
32fd325cd6SLong Li  */
33fd325cd6SLong Li 
34fd325cd6SLong Li union hwc_init_eq_id_db {
35fd325cd6SLong Li 	u32 as_uint32;
36fd325cd6SLong Li 
37fd325cd6SLong Li 	struct {
38fd325cd6SLong Li 		u32 eq_id	: 16;
39fd325cd6SLong Li 		u32 doorbell	: 16;
40fd325cd6SLong Li 	};
41fd325cd6SLong Li }; /* HW DATA */
42fd325cd6SLong Li 
43fd325cd6SLong Li union hwc_init_type_data {
44fd325cd6SLong Li 	u32 as_uint32;
45fd325cd6SLong Li 
46fd325cd6SLong Li 	struct {
47fd325cd6SLong Li 		u32 value	: 24;
48fd325cd6SLong Li 		u32 type	:  8;
49fd325cd6SLong Li 	};
50fd325cd6SLong Li }; /* HW DATA */
51fd325cd6SLong Li 
52fd325cd6SLong Li struct hwc_rx_oob {
53fd325cd6SLong Li 	u32 type	: 6;
54fd325cd6SLong Li 	u32 eom		: 1;
55fd325cd6SLong Li 	u32 som		: 1;
56fd325cd6SLong Li 	u32 vendor_err	: 8;
57fd325cd6SLong Li 	u32 reserved1	: 16;
58fd325cd6SLong Li 
59fd325cd6SLong Li 	u32 src_virt_wq	: 24;
60fd325cd6SLong Li 	u32 src_vfid	: 8;
61fd325cd6SLong Li 
62fd325cd6SLong Li 	u32 reserved2;
63fd325cd6SLong Li 
64fd325cd6SLong Li 	union {
65fd325cd6SLong Li 		u32 wqe_addr_low;
66fd325cd6SLong Li 		u32 wqe_offset;
67fd325cd6SLong Li 	};
68fd325cd6SLong Li 
69fd325cd6SLong Li 	u32 wqe_addr_high;
70fd325cd6SLong Li 
71fd325cd6SLong Li 	u32 client_data_unit	: 14;
72fd325cd6SLong Li 	u32 reserved3		: 18;
73fd325cd6SLong Li 
74fd325cd6SLong Li 	u32 tx_oob_data_size;
75fd325cd6SLong Li 
76fd325cd6SLong Li 	u32 chunk_offset	: 21;
77fd325cd6SLong Li 	u32 reserved4		: 11;
78fd325cd6SLong Li }; /* HW DATA */
79fd325cd6SLong Li 
80fd325cd6SLong Li struct hwc_tx_oob {
81fd325cd6SLong Li 	u32 reserved1;
82fd325cd6SLong Li 
83fd325cd6SLong Li 	u32 reserved2;
84fd325cd6SLong Li 
85fd325cd6SLong Li 	u32 vrq_id	: 24;
86fd325cd6SLong Li 	u32 dest_vfid	: 8;
87fd325cd6SLong Li 
88fd325cd6SLong Li 	u32 vrcq_id	: 24;
89fd325cd6SLong Li 	u32 reserved3	: 8;
90fd325cd6SLong Li 
91fd325cd6SLong Li 	u32 vscq_id	: 24;
92fd325cd6SLong Li 	u32 loopback	: 1;
93fd325cd6SLong Li 	u32 lso_override: 1;
94fd325cd6SLong Li 	u32 dest_pf	: 1;
95fd325cd6SLong Li 	u32 reserved4	: 5;
96fd325cd6SLong Li 
97fd325cd6SLong Li 	u32 vsq_id	: 24;
98fd325cd6SLong Li 	u32 reserved5	: 8;
99fd325cd6SLong Li }; /* HW DATA */
100fd325cd6SLong Li 
101fd325cd6SLong Li struct hwc_work_request {
102fd325cd6SLong Li 	void *buf_va;
103fd325cd6SLong Li 	void *buf_sge_addr;
104fd325cd6SLong Li 	u32 buf_len;
105fd325cd6SLong Li 	u32 msg_size;
106fd325cd6SLong Li 
107fd325cd6SLong Li 	struct gdma_wqe_request wqe_req;
108fd325cd6SLong Li 	struct hwc_tx_oob tx_oob;
109fd325cd6SLong Li 
110fd325cd6SLong Li 	struct gdma_sge sge;
111fd325cd6SLong Li };
112fd325cd6SLong Li 
113fd325cd6SLong Li /* hwc_dma_buf represents the array of in-flight WQEs.
114fd325cd6SLong Li  * mem_info as know as the GDMA mapped memory is partitioned and used by
115fd325cd6SLong Li  * in-flight WQEs.
116fd325cd6SLong Li  * The number of WQEs is determined by the number of in-flight messages.
117fd325cd6SLong Li  */
118fd325cd6SLong Li struct hwc_dma_buf {
119fd325cd6SLong Li 	struct gdma_mem_info mem_info;
120fd325cd6SLong Li 
121fd325cd6SLong Li 	u32 gpa_mkey;
122fd325cd6SLong Li 
123fd325cd6SLong Li 	u32 num_reqs;
124*59656519SKees Cook 	struct hwc_work_request reqs[] __counted_by(num_reqs);
125fd325cd6SLong Li };
126fd325cd6SLong Li 
127fd325cd6SLong Li typedef void hwc_rx_event_handler_t(void *ctx, u32 gdma_rxq_id,
128fd325cd6SLong Li 				    const struct hwc_rx_oob *rx_oob);
129fd325cd6SLong Li 
130fd325cd6SLong Li typedef void hwc_tx_event_handler_t(void *ctx, u32 gdma_txq_id,
131fd325cd6SLong Li 				    const struct hwc_rx_oob *rx_oob);
132fd325cd6SLong Li 
133fd325cd6SLong Li struct hwc_cq {
134fd325cd6SLong Li 	struct hw_channel_context *hwc;
135fd325cd6SLong Li 
136fd325cd6SLong Li 	struct gdma_queue *gdma_cq;
137fd325cd6SLong Li 	struct gdma_queue *gdma_eq;
138fd325cd6SLong Li 	struct gdma_comp *comp_buf;
139fd325cd6SLong Li 	u16 queue_depth;
140fd325cd6SLong Li 
141fd325cd6SLong Li 	hwc_rx_event_handler_t *rx_event_handler;
142fd325cd6SLong Li 	void *rx_event_ctx;
143fd325cd6SLong Li 
144fd325cd6SLong Li 	hwc_tx_event_handler_t *tx_event_handler;
145fd325cd6SLong Li 	void *tx_event_ctx;
146fd325cd6SLong Li };
147fd325cd6SLong Li 
148fd325cd6SLong Li struct hwc_wq {
149fd325cd6SLong Li 	struct hw_channel_context *hwc;
150fd325cd6SLong Li 
151fd325cd6SLong Li 	struct gdma_queue *gdma_wq;
152fd325cd6SLong Li 	struct hwc_dma_buf *msg_buf;
153fd325cd6SLong Li 	u16 queue_depth;
154fd325cd6SLong Li 
155fd325cd6SLong Li 	struct hwc_cq *hwc_cq;
156fd325cd6SLong Li };
157fd325cd6SLong Li 
158fd325cd6SLong Li struct hwc_caller_ctx {
159fd325cd6SLong Li 	struct completion comp_event;
160fd325cd6SLong Li 	void *output_buf;
161fd325cd6SLong Li 	u32 output_buflen;
162fd325cd6SLong Li 
163fd325cd6SLong Li 	u32 error; /* Linux error code */
164fd325cd6SLong Li 	u32 status_code;
165fd325cd6SLong Li };
166fd325cd6SLong Li 
167fd325cd6SLong Li struct hw_channel_context {
168fd325cd6SLong Li 	struct gdma_dev *gdma_dev;
169fd325cd6SLong Li 	struct device *dev;
170fd325cd6SLong Li 
171fd325cd6SLong Li 	u16 num_inflight_msg;
172fd325cd6SLong Li 	u32 max_req_msg_size;
173fd325cd6SLong Li 
174fd325cd6SLong Li 	u16 hwc_init_q_depth_max;
175fd325cd6SLong Li 	u32 hwc_init_max_req_msg_size;
176fd325cd6SLong Li 	u32 hwc_init_max_resp_msg_size;
177fd325cd6SLong Li 
178fd325cd6SLong Li 	struct completion hwc_init_eqe_comp;
179fd325cd6SLong Li 
180fd325cd6SLong Li 	struct hwc_wq *rxq;
181fd325cd6SLong Li 	struct hwc_wq *txq;
182fd325cd6SLong Li 	struct hwc_cq *cq;
183fd325cd6SLong Li 
184fd325cd6SLong Li 	struct semaphore sema;
185fd325cd6SLong Li 	struct gdma_resource inflight_msg_res;
186fd325cd6SLong Li 
187fd325cd6SLong Li 	u32 pf_dest_vrq_id;
188fd325cd6SLong Li 	u32 pf_dest_vrcq_id;
18962c1bff5SSouradeep Chakrabarti 	u32 hwc_timeout;
190fd325cd6SLong Li 
191fd325cd6SLong Li 	struct hwc_caller_ctx *caller_ctx;
192fd325cd6SLong Li };
193fd325cd6SLong Li 
194fd325cd6SLong Li int mana_hwc_create_channel(struct gdma_context *gc);
195fd325cd6SLong Li void mana_hwc_destroy_channel(struct gdma_context *gc);
196fd325cd6SLong Li 
197fd325cd6SLong Li int mana_hwc_send_request(struct hw_channel_context *hwc, u32 req_len,
198fd325cd6SLong Li 			  const void *req, u32 resp_len, void *resp);
199fd325cd6SLong Li 
200fd325cd6SLong Li #endif /* _HW_CHANNEL_H */
201