Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright 2025 Yunsilicon Technology Co., Ltd. 3 : : */ 4 : : 5 : : #ifndef _XSC_RXTX_H_ 6 : : #define _XSC_RXTX_H_ 7 : : 8 : : #include <rte_byteorder.h> 9 : : 10 : : #define XSC_CQE_OWNER_MASK 0x1 11 : : #define XSC_CQE_OWNER_HW 0x2 12 : : #define XSC_CQE_OWNER_SW 0x4 13 : : #define XSC_CQE_OWNER_ERR 0x8 14 : : #define XSC_OPCODE_RAW 0x7 15 : : 16 : : struct __rte_packed_begin xsc_send_wqe_ctrl_seg { 17 : : rte_le32_t msg_opcode:8; 18 : : rte_le32_t with_immdt:1; 19 : : rte_le32_t csum_en:2; 20 : : rte_le32_t ds_data_num:5; 21 : : rte_le32_t wqe_id:16; 22 : : rte_le32_t msg_len; 23 : : union { 24 : : rte_le32_t opcode_data; 25 : : struct { 26 : : rte_le16_t has_pph:1; 27 : : rte_le16_t so_type:1; 28 : : rte_le16_t so_data_size:14; 29 : : rte_le16_t rsv1:8; 30 : : rte_le16_t so_hdr_len:8; 31 : : }; 32 : : struct { 33 : : rte_le16_t desc_id; 34 : : rte_le16_t is_last_wqe:1; 35 : : rte_le16_t dst_qp_id:15; 36 : : }; 37 : : }; 38 : : rte_le32_t se:1; 39 : : rte_le32_t ce:1; 40 : : rte_le32_t rsv2:30; 41 : : } __rte_packed_end; 42 : : 43 : : struct __rte_packed_begin xsc_wqe_data_seg { 44 : : union { 45 : : struct { 46 : : uint8_t in_line:1; 47 : : uint8_t rsv0:7; 48 : : }; 49 : : struct { 50 : : rte_le32_t rsv1:1; 51 : : rte_le32_t seg_len:31; 52 : : rte_le32_t lkey; 53 : : rte_le64_t va; 54 : : }; 55 : : struct { 56 : : uint8_t rsv2:1; 57 : : uint8_t len:7; 58 : : uint8_t in_line_data[15]; 59 : : }; 60 : : }; 61 : : } __rte_packed_end; 62 : : 63 : : struct __rte_packed_begin xsc_wqe { 64 : : union { 65 : : struct xsc_send_wqe_ctrl_seg cseg; 66 : : uint32_t ctrl[4]; 67 : : }; 68 : : union { 69 : : struct xsc_wqe_data_seg dseg[XSC_SEND_WQE_DS]; 70 : : uint8_t data[XSC_ESEG_EXTRA_DATA_SIZE]; 71 : : }; 72 : : } __rte_packed_end; 73 : : 74 : : struct __rte_packed_begin xsc_cqe { 75 : : union { 76 : : uint8_t msg_opcode; 77 : : struct { 78 : : uint8_t error_code:7; 79 : : uint8_t is_error:1; 80 : : }; 81 : : }; 82 : : rte_le16_t qp_id:15; 83 : : rte_le16_t rsv:1; 84 : : uint8_t se:1; 85 : : uint8_t has_pph:1; 86 : : uint8_t type:1; 87 : : uint8_t with_immdt:1; 88 : : uint8_t csum_err:4; 89 : : rte_le32_t imm_data; 90 : : rte_le32_t msg_len; 91 : : rte_le32_t vni; 92 : : rte_le32_t tsl; 93 : : rte_le32_t tsh:16; 94 : : rte_le32_t wqe_id:16; 95 : : rte_le16_t rsv2[3]; 96 : : rte_le16_t rsv3:15; 97 : : rte_le16_t owner:1; 98 : : } __rte_packed_end; 99 : : 100 : : struct xsc_cqe_u64 { 101 : : struct xsc_cqe cqe0; 102 : : struct xsc_cqe cqe1; 103 : : }; 104 : : 105 : : union xsc_cq_doorbell { 106 : : struct { 107 : : uint32_t next_cid:16; 108 : : uint32_t cq_num:15; 109 : : uint32_t cq_sta:1; 110 : : }; 111 : : uint32_t cq_data; 112 : : }; 113 : : 114 : : union xsc_send_doorbell { 115 : : struct { 116 : : uint32_t next_pid:16; 117 : : uint32_t qp_num:15; 118 : : uint32_t rsv:1; 119 : : }; 120 : : uint32_t send_data; 121 : : }; 122 : : 123 : : struct xsc_tx_cq_params { 124 : : uint16_t port_id; 125 : : uint16_t qp_id; 126 : : uint16_t elts_n; 127 : : }; 128 : : 129 : : struct xsc_tx_cq_info { 130 : : void *cq; 131 : : void *cqes; 132 : : uint32_t *cq_db; 133 : : uint32_t cqn; 134 : : uint16_t cqe_s; 135 : : uint16_t cqe_n; 136 : : }; 137 : : 138 : : struct xsc_tx_qp_params { 139 : : void *cq; 140 : : uint64_t tx_offloads; 141 : : uint16_t port_id; 142 : : uint16_t qp_id; 143 : : uint16_t elts_n; 144 : : }; 145 : : 146 : : struct xsc_tx_qp_info { 147 : : void *qp; 148 : : void *wqes; 149 : : uint32_t *qp_db; 150 : : uint32_t qpn; 151 : : uint16_t tso_en; 152 : : uint16_t wqe_n; 153 : : }; 154 : : 155 : : union xsc_recv_doorbell { 156 : : struct { 157 : : uint32_t next_pid:13; 158 : : uint32_t qp_num:15; 159 : : uint32_t rsv:4; 160 : : }; 161 : : uint32_t recv_data; 162 : : }; 163 : : 164 : : struct xsc_rx_cq_params { 165 : : uint16_t port_id; 166 : : uint16_t qp_id; 167 : : uint16_t wqe_s; 168 : : }; 169 : : 170 : : struct xsc_rx_cq_info { 171 : : void *cq; 172 : : void *cqes; 173 : : uint32_t *cq_db; 174 : : uint32_t cqn; 175 : : uint16_t cqe_n; 176 : : }; 177 : : 178 : : static __rte_always_inline int 179 : : xsc_check_cqe_own(volatile struct xsc_cqe *cqe, const uint16_t cqe_n, const uint16_t ci) 180 : : { 181 [ # # ]: 0 : if (unlikely(((cqe->owner & XSC_CQE_OWNER_MASK) != ((ci >> cqe_n) & XSC_CQE_OWNER_MASK)))) 182 : : return XSC_CQE_OWNER_HW; 183 : : 184 : 0 : rte_io_rmb(); 185 [ # # # # ]: 0 : if (cqe->msg_len <= 0 && cqe->is_error) 186 : 0 : return XSC_CQE_OWNER_ERR; 187 : : 188 : : return XSC_CQE_OWNER_SW; 189 : : } 190 : : 191 : : #endif /* _XSC_RXTX_H_ */