1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2 /* Copyright (c) 2021, Microsoft Corporation. */
7 #define DEFAULT_LOG2_THROTTLING_FOR_ERROR_EQ 4
9 #define HW_CHANNEL_MAX_REQUEST_SIZE 0x1000
10 #define HW_CHANNEL_MAX_RESPONSE_SIZE 0x1000
12 #define HW_CHANNEL_VF_BOOTSTRAP_QUEUE_DEPTH 1
14 #define HWC_INIT_DATA_CQID 1
15 #define HWC_INIT_DATA_RQID 2
16 #define HWC_INIT_DATA_SQID 3
17 #define HWC_INIT_DATA_QUEUE_DEPTH 4
18 #define HWC_INIT_DATA_MAX_REQUEST 5
19 #define HWC_INIT_DATA_MAX_RESPONSE 6
20 #define HWC_INIT_DATA_MAX_NUM_CQS 7
21 #define HWC_INIT_DATA_PDID 8
22 #define HWC_INIT_DATA_GPA_MKEY 9
23 #define HWC_INIT_DATA_PF_DEST_RQ_ID 10
24 #define HWC_INIT_DATA_PF_DEST_CQ_ID 11
26 /* Structures labeled with "HW DATA" are exchanged with the hardware. All of
27 * them are naturally aligned and hence don't need __packed.
30 union hwc_init_eq_id_db {
39 union hwc_init_type_data {
67 u32 client_data_unit : 14;
72 u32 chunk_offset : 21;
97 struct hwc_work_request {
103 struct gdma_wqe_request wqe_req;
104 struct hwc_tx_oob tx_oob;
109 /* hwc_dma_buf represents the array of in-flight WQEs.
110 * mem_info as know as the GDMA mapped memory is partitioned and used by
112 * The number of WQEs is determined by the number of in-flight messages.
115 struct gdma_mem_info mem_info;
120 struct hwc_work_request reqs[];
123 typedef void hwc_rx_event_handler_t(void *ctx, u32 gdma_rxq_id,
124 const struct hwc_rx_oob *rx_oob);
126 typedef void hwc_tx_event_handler_t(void *ctx, u32 gdma_txq_id,
127 const struct hwc_rx_oob *rx_oob);
130 struct hw_channel_context *hwc;
132 struct gdma_queue *gdma_cq;
133 struct gdma_queue *gdma_eq;
134 struct gdma_comp *comp_buf;
137 hwc_rx_event_handler_t *rx_event_handler;
140 hwc_tx_event_handler_t *tx_event_handler;
145 struct hw_channel_context *hwc;
147 struct gdma_queue *gdma_wq;
148 struct hwc_dma_buf *msg_buf;
151 struct hwc_cq *hwc_cq;
154 struct hwc_caller_ctx {
155 struct completion comp_event;
159 u32 error; /* Linux error code */
163 struct hw_channel_context {
164 struct gdma_dev *gdma_dev;
167 u16 num_inflight_msg;
168 u32 max_req_msg_size;
170 u16 hwc_init_q_depth_max;
171 u32 hwc_init_max_req_msg_size;
172 u32 hwc_init_max_resp_msg_size;
174 struct completion hwc_init_eqe_comp;
180 struct semaphore sema;
181 struct gdma_resource inflight_msg_res;
186 struct hwc_caller_ctx *caller_ctx;
189 int mana_hwc_create_channel(struct gdma_context *gc);
190 void mana_hwc_destroy_channel(struct gdma_context *gc);
192 int mana_hwc_send_request(struct hw_channel_context *hwc, u32 req_len,
193 const void *req, u32 resp_len, void *resp);
195 #endif /* _HW_CHANNEL_H */