10df4980cSVidya Sagar Velumuri /* SPDX-License-Identifier: BSD-3-Clause
20df4980cSVidya Sagar Velumuri * Copyright(C) 2024 Marvell.
30df4980cSVidya Sagar Velumuri */
40df4980cSVidya Sagar Velumuri
50df4980cSVidya Sagar Velumuri #ifndef __CN10K_TLS_OPS_H__
60df4980cSVidya Sagar Velumuri #define __CN10K_TLS_OPS_H__
70df4980cSVidya Sagar Velumuri
80df4980cSVidya Sagar Velumuri #include <rte_crypto_sym.h>
90df4980cSVidya Sagar Velumuri #include <rte_security.h>
100df4980cSVidya Sagar Velumuri
110df4980cSVidya Sagar Velumuri #include "roc_ie.h"
120df4980cSVidya Sagar Velumuri
130df4980cSVidya Sagar Velumuri #include "cn10k_cryptodev.h"
140df4980cSVidya Sagar Velumuri #include "cn10k_cryptodev_sec.h"
150df4980cSVidya Sagar Velumuri #include "cnxk_cryptodev.h"
160df4980cSVidya Sagar Velumuri #include "cnxk_cryptodev_ops.h"
170df4980cSVidya Sagar Velumuri #include "cnxk_sg.h"
180df4980cSVidya Sagar Velumuri
190df4980cSVidya Sagar Velumuri static __rte_always_inline int
process_tls_write(struct roc_cpt_lf * lf,struct rte_crypto_op * cop,struct cn10k_sec_session * sess,struct cpt_qp_meta_info * m_info,struct cpt_inflight_req * infl_req,struct cpt_inst_s * inst,const bool is_sg_ver2)200df4980cSVidya Sagar Velumuri process_tls_write(struct roc_cpt_lf *lf, struct rte_crypto_op *cop, struct cn10k_sec_session *sess,
210df4980cSVidya Sagar Velumuri struct cpt_qp_meta_info *m_info, struct cpt_inflight_req *infl_req,
220df4980cSVidya Sagar Velumuri struct cpt_inst_s *inst, const bool is_sg_ver2)
230df4980cSVidya Sagar Velumuri {
249a126e7cSVidya Sagar Velumuri struct cn10k_tls_opt tls_opt = sess->tls_opt;
250df4980cSVidya Sagar Velumuri struct rte_crypto_sym_op *sym_op = cop->sym;
260df4980cSVidya Sagar Velumuri #ifdef LA_IPSEC_DEBUG
270df4980cSVidya Sagar Velumuri struct roc_ie_ot_tls_write_sa *write_sa;
280df4980cSVidya Sagar Velumuri #endif
290df4980cSVidya Sagar Velumuri struct rte_mbuf *m_src = sym_op->m_src;
30*c9260dc8SAakash Sasidharan struct rte_mbuf *m_dst = sym_op->m_dst;
319a126e7cSVidya Sagar Velumuri uint32_t pad_len, pad_bytes;
320df4980cSVidya Sagar Velumuri struct rte_mbuf *last_seg;
330df4980cSVidya Sagar Velumuri union cpt_inst_w4 w4;
340df4980cSVidya Sagar Velumuri void *m_data = NULL;
350df4980cSVidya Sagar Velumuri uint8_t *in_buffer;
360df4980cSVidya Sagar Velumuri
379a126e7cSVidya Sagar Velumuri pad_bytes = (cop->aux_flags * 8) > 0xff ? 0xff : (cop->aux_flags * 8);
389a126e7cSVidya Sagar Velumuri pad_len = (pad_bytes >> tls_opt.pad_shift) * tls_opt.enable_padding;
399a126e7cSVidya Sagar Velumuri
400df4980cSVidya Sagar Velumuri #ifdef LA_IPSEC_DEBUG
410df4980cSVidya Sagar Velumuri write_sa = &sess->tls_rec.write_sa;
420df4980cSVidya Sagar Velumuri if (write_sa->w2.s.iv_at_cptr == ROC_IE_OT_TLS_IV_SRC_FROM_SA) {
430df4980cSVidya Sagar Velumuri
440df4980cSVidya Sagar Velumuri uint8_t *iv = PLT_PTR_ADD(write_sa->cipher_key, 32);
450df4980cSVidya Sagar Velumuri
460df4980cSVidya Sagar Velumuri if (write_sa->w2.s.cipher_select == ROC_IE_OT_TLS_CIPHER_AES_GCM) {
470df4980cSVidya Sagar Velumuri uint32_t *tmp;
480df4980cSVidya Sagar Velumuri
490df4980cSVidya Sagar Velumuri /* For GCM, the IV and salt format will be like below:
500df4980cSVidya Sagar Velumuri * iv[0-3]: lower bytes of IV in BE format.
510df4980cSVidya Sagar Velumuri * iv[4-7]: salt / nonce.
520df4980cSVidya Sagar Velumuri * iv[12-15]: upper bytes of IV in BE format.
530df4980cSVidya Sagar Velumuri */
540df4980cSVidya Sagar Velumuri memcpy(iv, rte_crypto_op_ctod_offset(cop, uint8_t *, sess->iv_offset), 4);
550df4980cSVidya Sagar Velumuri tmp = (uint32_t *)iv;
560df4980cSVidya Sagar Velumuri *tmp = rte_be_to_cpu_32(*tmp);
570df4980cSVidya Sagar Velumuri
580df4980cSVidya Sagar Velumuri memcpy(iv + 12,
590df4980cSVidya Sagar Velumuri rte_crypto_op_ctod_offset(cop, uint8_t *, sess->iv_offset + 4), 4);
600df4980cSVidya Sagar Velumuri tmp = (uint32_t *)(iv + 12);
610df4980cSVidya Sagar Velumuri *tmp = rte_be_to_cpu_32(*tmp);
620df4980cSVidya Sagar Velumuri } else if (write_sa->w2.s.cipher_select == ROC_IE_OT_TLS_CIPHER_AES_CBC) {
630df4980cSVidya Sagar Velumuri uint64_t *tmp;
640df4980cSVidya Sagar Velumuri
650df4980cSVidya Sagar Velumuri memcpy(iv, rte_crypto_op_ctod_offset(cop, uint8_t *, sess->iv_offset), 16);
660df4980cSVidya Sagar Velumuri tmp = (uint64_t *)iv;
670df4980cSVidya Sagar Velumuri *tmp = rte_be_to_cpu_64(*tmp);
680df4980cSVidya Sagar Velumuri tmp = (uint64_t *)(iv + 8);
690df4980cSVidya Sagar Velumuri *tmp = rte_be_to_cpu_64(*tmp);
700df4980cSVidya Sagar Velumuri } else if (write_sa->w2.s.cipher_select == ROC_IE_OT_TLS_CIPHER_3DES) {
710df4980cSVidya Sagar Velumuri uint64_t *tmp;
720df4980cSVidya Sagar Velumuri
730df4980cSVidya Sagar Velumuri memcpy(iv, rte_crypto_op_ctod_offset(cop, uint8_t *, sess->iv_offset), 8);
740df4980cSVidya Sagar Velumuri tmp = (uint64_t *)iv;
750df4980cSVidya Sagar Velumuri *tmp = rte_be_to_cpu_64(*tmp);
760df4980cSVidya Sagar Velumuri }
770df4980cSVidya Sagar Velumuri
780df4980cSVidya Sagar Velumuri /* Trigger CTX reload to fetch new data from DRAM */
790df4980cSVidya Sagar Velumuri roc_cpt_lf_ctx_reload(lf, write_sa);
800df4980cSVidya Sagar Velumuri rte_delay_ms(1);
810df4980cSVidya Sagar Velumuri }
820df4980cSVidya Sagar Velumuri #else
830df4980cSVidya Sagar Velumuri RTE_SET_USED(lf);
840df4980cSVidya Sagar Velumuri #endif
850df4980cSVidya Sagar Velumuri /* Single buffer direct mode */
860df4980cSVidya Sagar Velumuri if (likely(m_src->next == NULL)) {
870df4980cSVidya Sagar Velumuri void *vaddr;
880df4980cSVidya Sagar Velumuri
890df4980cSVidya Sagar Velumuri if (unlikely(rte_pktmbuf_tailroom(m_src) < sess->max_extended_len)) {
900df4980cSVidya Sagar Velumuri plt_dp_err("Not enough tail room");
910df4980cSVidya Sagar Velumuri return -ENOMEM;
920df4980cSVidya Sagar Velumuri }
930df4980cSVidya Sagar Velumuri
940df4980cSVidya Sagar Velumuri vaddr = rte_pktmbuf_mtod(m_src, void *);
950df4980cSVidya Sagar Velumuri inst->dptr = (uint64_t)vaddr;
960df4980cSVidya Sagar Velumuri inst->rptr = (uint64_t)vaddr;
970df4980cSVidya Sagar Velumuri
980df4980cSVidya Sagar Velumuri w4.u64 = sess->inst.w4;
990df4980cSVidya Sagar Velumuri w4.s.param1 = m_src->data_len;
1000df4980cSVidya Sagar Velumuri w4.s.dlen = m_src->data_len;
1010df4980cSVidya Sagar Velumuri
1020df4980cSVidya Sagar Velumuri w4.s.param2 = cop->param1.tls_record.content_type;
1039a126e7cSVidya Sagar Velumuri w4.s.opcode_minor = pad_len;
1040df4980cSVidya Sagar Velumuri
1050df4980cSVidya Sagar Velumuri inst->w4.u64 = w4.u64;
1060df4980cSVidya Sagar Velumuri } else if (is_sg_ver2 == false) {
1070df4980cSVidya Sagar Velumuri struct roc_sglist_comp *scatter_comp, *gather_comp;
1080df4980cSVidya Sagar Velumuri uint32_t g_size_bytes, s_size_bytes;
1090df4980cSVidya Sagar Velumuri uint32_t dlen;
1100df4980cSVidya Sagar Velumuri int i;
1110df4980cSVidya Sagar Velumuri
1120df4980cSVidya Sagar Velumuri last_seg = rte_pktmbuf_lastseg(m_src);
1130df4980cSVidya Sagar Velumuri
1140df4980cSVidya Sagar Velumuri if (unlikely(rte_pktmbuf_tailroom(last_seg) < sess->max_extended_len)) {
1150df4980cSVidya Sagar Velumuri plt_dp_err("Not enough tail room (required: %d, available: %d)",
1160df4980cSVidya Sagar Velumuri sess->max_extended_len, rte_pktmbuf_tailroom(last_seg));
1170df4980cSVidya Sagar Velumuri return -ENOMEM;
1180df4980cSVidya Sagar Velumuri }
1190df4980cSVidya Sagar Velumuri
1200df4980cSVidya Sagar Velumuri m_data = alloc_op_meta(NULL, m_info->mlen, m_info->pool, infl_req);
1210df4980cSVidya Sagar Velumuri if (unlikely(m_data == NULL)) {
1220df4980cSVidya Sagar Velumuri plt_dp_err("Error allocating meta buffer for request");
1230df4980cSVidya Sagar Velumuri return -ENOMEM;
1240df4980cSVidya Sagar Velumuri }
1250df4980cSVidya Sagar Velumuri
1260df4980cSVidya Sagar Velumuri in_buffer = (uint8_t *)m_data;
1270df4980cSVidya Sagar Velumuri ((uint16_t *)in_buffer)[0] = 0;
1280df4980cSVidya Sagar Velumuri ((uint16_t *)in_buffer)[1] = 0;
1290df4980cSVidya Sagar Velumuri
1300df4980cSVidya Sagar Velumuri /* Input Gather List */
1310df4980cSVidya Sagar Velumuri i = 0;
1320df4980cSVidya Sagar Velumuri gather_comp = (struct roc_sglist_comp *)((uint8_t *)in_buffer + 8);
1330df4980cSVidya Sagar Velumuri
1340df4980cSVidya Sagar Velumuri i = fill_sg_comp_from_pkt(gather_comp, i, m_src);
1350df4980cSVidya Sagar Velumuri ((uint16_t *)in_buffer)[2] = rte_cpu_to_be_16(i);
1360df4980cSVidya Sagar Velumuri
1370df4980cSVidya Sagar Velumuri g_size_bytes = ((i + 3) / 4) * sizeof(struct roc_sglist_comp);
1380df4980cSVidya Sagar Velumuri
1390df4980cSVidya Sagar Velumuri i = 0;
1400df4980cSVidya Sagar Velumuri scatter_comp = (struct roc_sglist_comp *)((uint8_t *)gather_comp + g_size_bytes);
1410df4980cSVidya Sagar Velumuri
1420df4980cSVidya Sagar Velumuri i = fill_sg_comp_from_pkt(scatter_comp, i, m_src);
1430df4980cSVidya Sagar Velumuri ((uint16_t *)in_buffer)[3] = rte_cpu_to_be_16(i);
1440df4980cSVidya Sagar Velumuri
1450df4980cSVidya Sagar Velumuri s_size_bytes = ((i + 3) / 4) * sizeof(struct roc_sglist_comp);
1460df4980cSVidya Sagar Velumuri
1470df4980cSVidya Sagar Velumuri dlen = g_size_bytes + s_size_bytes + ROC_SG_LIST_HDR_SIZE;
1480df4980cSVidya Sagar Velumuri
1490df4980cSVidya Sagar Velumuri inst->dptr = (uint64_t)in_buffer;
1500df4980cSVidya Sagar Velumuri inst->rptr = (uint64_t)in_buffer;
1510df4980cSVidya Sagar Velumuri
1520df4980cSVidya Sagar Velumuri w4.u64 = sess->inst.w4;
1530df4980cSVidya Sagar Velumuri w4.s.dlen = dlen;
1540df4980cSVidya Sagar Velumuri w4.s.param1 = rte_pktmbuf_pkt_len(m_src);
1550df4980cSVidya Sagar Velumuri w4.s.param2 = cop->param1.tls_record.content_type;
1560df4980cSVidya Sagar Velumuri w4.s.opcode_major |= (uint64_t)ROC_DMA_MODE_SG;
1579a126e7cSVidya Sagar Velumuri w4.s.opcode_minor = pad_len;
1580df4980cSVidya Sagar Velumuri
1590df4980cSVidya Sagar Velumuri /* Output Scatter List */
1609a126e7cSVidya Sagar Velumuri last_seg->data_len += sess->max_extended_len + pad_bytes;
1610df4980cSVidya Sagar Velumuri inst->w4.u64 = w4.u64;
1620df4980cSVidya Sagar Velumuri } else {
1630df4980cSVidya Sagar Velumuri struct roc_sg2list_comp *scatter_comp, *gather_comp;
1640df4980cSVidya Sagar Velumuri union cpt_inst_w5 cpt_inst_w5;
1650df4980cSVidya Sagar Velumuri union cpt_inst_w6 cpt_inst_w6;
1660df4980cSVidya Sagar Velumuri uint32_t g_size_bytes;
1670df4980cSVidya Sagar Velumuri int i;
1680df4980cSVidya Sagar Velumuri
1690df4980cSVidya Sagar Velumuri last_seg = rte_pktmbuf_lastseg(m_src);
1700df4980cSVidya Sagar Velumuri
1710df4980cSVidya Sagar Velumuri if (unlikely(rte_pktmbuf_tailroom(last_seg) < sess->max_extended_len)) {
1720df4980cSVidya Sagar Velumuri plt_dp_err("Not enough tail room (required: %d, available: %d)",
1730df4980cSVidya Sagar Velumuri sess->max_extended_len, rte_pktmbuf_tailroom(last_seg));
1740df4980cSVidya Sagar Velumuri return -ENOMEM;
1750df4980cSVidya Sagar Velumuri }
1760df4980cSVidya Sagar Velumuri
1770df4980cSVidya Sagar Velumuri m_data = alloc_op_meta(NULL, m_info->mlen, m_info->pool, infl_req);
1780df4980cSVidya Sagar Velumuri if (unlikely(m_data == NULL)) {
1790df4980cSVidya Sagar Velumuri plt_dp_err("Error allocating meta buffer for request");
1800df4980cSVidya Sagar Velumuri return -ENOMEM;
1810df4980cSVidya Sagar Velumuri }
1820df4980cSVidya Sagar Velumuri
1830df4980cSVidya Sagar Velumuri in_buffer = (uint8_t *)m_data;
1840df4980cSVidya Sagar Velumuri /* Input Gather List */
1850df4980cSVidya Sagar Velumuri i = 0;
1860df4980cSVidya Sagar Velumuri gather_comp = (struct roc_sg2list_comp *)((uint8_t *)in_buffer);
1870df4980cSVidya Sagar Velumuri i = fill_sg2_comp_from_pkt(gather_comp, i, m_src);
1880df4980cSVidya Sagar Velumuri
1890df4980cSVidya Sagar Velumuri cpt_inst_w5.s.gather_sz = ((i + 2) / 3);
1900df4980cSVidya Sagar Velumuri g_size_bytes = ((i + 2) / 3) * sizeof(struct roc_sg2list_comp);
1910df4980cSVidya Sagar Velumuri
1920df4980cSVidya Sagar Velumuri i = 0;
1930df4980cSVidya Sagar Velumuri scatter_comp = (struct roc_sg2list_comp *)((uint8_t *)gather_comp + g_size_bytes);
1940df4980cSVidya Sagar Velumuri
195*c9260dc8SAakash Sasidharan if (m_dst == NULL)
196*c9260dc8SAakash Sasidharan m_dst = m_src;
197*c9260dc8SAakash Sasidharan i = fill_sg2_comp_from_pkt(scatter_comp, i, m_dst);
1980df4980cSVidya Sagar Velumuri
1990df4980cSVidya Sagar Velumuri cpt_inst_w6.s.scatter_sz = ((i + 2) / 3);
2000df4980cSVidya Sagar Velumuri
2010df4980cSVidya Sagar Velumuri cpt_inst_w5.s.dptr = (uint64_t)gather_comp;
2020df4980cSVidya Sagar Velumuri cpt_inst_w6.s.rptr = (uint64_t)scatter_comp;
2030df4980cSVidya Sagar Velumuri
2040df4980cSVidya Sagar Velumuri inst->w5.u64 = cpt_inst_w5.u64;
2050df4980cSVidya Sagar Velumuri inst->w6.u64 = cpt_inst_w6.u64;
2060df4980cSVidya Sagar Velumuri w4.u64 = sess->inst.w4;
2070df4980cSVidya Sagar Velumuri w4.s.dlen = rte_pktmbuf_pkt_len(m_src);
2080df4980cSVidya Sagar Velumuri w4.s.opcode_major &= (~(ROC_IE_OT_INPLACE_BIT));
2099a126e7cSVidya Sagar Velumuri w4.s.opcode_minor = pad_len;
2100df4980cSVidya Sagar Velumuri w4.s.param1 = w4.s.dlen;
2110df4980cSVidya Sagar Velumuri w4.s.param2 = cop->param1.tls_record.content_type;
2120df4980cSVidya Sagar Velumuri /* Output Scatter List */
2139a126e7cSVidya Sagar Velumuri last_seg->data_len += sess->max_extended_len + pad_bytes;
2140df4980cSVidya Sagar Velumuri inst->w4.u64 = w4.u64;
2150df4980cSVidya Sagar Velumuri }
2160df4980cSVidya Sagar Velumuri
2170df4980cSVidya Sagar Velumuri return 0;
2180df4980cSVidya Sagar Velumuri }
2190df4980cSVidya Sagar Velumuri
2200df4980cSVidya Sagar Velumuri static __rte_always_inline int
process_tls_read(struct rte_crypto_op * cop,struct cn10k_sec_session * sess,struct cpt_qp_meta_info * m_info,struct cpt_inflight_req * infl_req,struct cpt_inst_s * inst,const bool is_sg_ver2)2210df4980cSVidya Sagar Velumuri process_tls_read(struct rte_crypto_op *cop, struct cn10k_sec_session *sess,
2220df4980cSVidya Sagar Velumuri struct cpt_qp_meta_info *m_info, struct cpt_inflight_req *infl_req,
2230df4980cSVidya Sagar Velumuri struct cpt_inst_s *inst, const bool is_sg_ver2)
2240df4980cSVidya Sagar Velumuri {
2250df4980cSVidya Sagar Velumuri struct rte_crypto_sym_op *sym_op = cop->sym;
2260df4980cSVidya Sagar Velumuri struct rte_mbuf *m_src = sym_op->m_src;
227*c9260dc8SAakash Sasidharan struct rte_mbuf *m_dst = sym_op->m_dst;
2280df4980cSVidya Sagar Velumuri union cpt_inst_w4 w4;
2290df4980cSVidya Sagar Velumuri uint8_t *in_buffer;
2300df4980cSVidya Sagar Velumuri void *m_data;
2310df4980cSVidya Sagar Velumuri
2320df4980cSVidya Sagar Velumuri if (likely(m_src->next == NULL)) {
2330df4980cSVidya Sagar Velumuri void *vaddr;
2340df4980cSVidya Sagar Velumuri
2350df4980cSVidya Sagar Velumuri vaddr = rte_pktmbuf_mtod(m_src, void *);
2360df4980cSVidya Sagar Velumuri
2370df4980cSVidya Sagar Velumuri inst->dptr = (uint64_t)vaddr;
2380df4980cSVidya Sagar Velumuri inst->rptr = (uint64_t)vaddr;
2390df4980cSVidya Sagar Velumuri
2400df4980cSVidya Sagar Velumuri w4.u64 = sess->inst.w4;
2410df4980cSVidya Sagar Velumuri w4.s.dlen = m_src->data_len;
2420df4980cSVidya Sagar Velumuri w4.s.param1 = m_src->data_len;
2430df4980cSVidya Sagar Velumuri inst->w4.u64 = w4.u64;
2440df4980cSVidya Sagar Velumuri } else if (is_sg_ver2 == false) {
2450df4980cSVidya Sagar Velumuri struct roc_sglist_comp *scatter_comp, *gather_comp;
2469a126e7cSVidya Sagar Velumuri int tail_len = sess->tls_opt.tail_fetch_len * 16;
2477ba9d5f6SVidya Sagar Velumuri int pkt_len = rte_pktmbuf_pkt_len(m_src);
2480df4980cSVidya Sagar Velumuri uint32_t g_size_bytes, s_size_bytes;
2497ba9d5f6SVidya Sagar Velumuri uint16_t *sg_hdr;
2500df4980cSVidya Sagar Velumuri uint32_t dlen;
2510df4980cSVidya Sagar Velumuri int i;
2520df4980cSVidya Sagar Velumuri
2530df4980cSVidya Sagar Velumuri m_data = alloc_op_meta(NULL, m_info->mlen, m_info->pool, infl_req);
2540df4980cSVidya Sagar Velumuri if (unlikely(m_data == NULL)) {
2550df4980cSVidya Sagar Velumuri plt_dp_err("Error allocating meta buffer for request");
2560df4980cSVidya Sagar Velumuri return -ENOMEM;
2570df4980cSVidya Sagar Velumuri }
2580df4980cSVidya Sagar Velumuri
2590df4980cSVidya Sagar Velumuri /* Input Gather List */
2607ba9d5f6SVidya Sagar Velumuri in_buffer = (uint8_t *)m_data;
2617ba9d5f6SVidya Sagar Velumuri sg_hdr = (uint16_t *)(in_buffer + 32);
2627ba9d5f6SVidya Sagar Velumuri gather_comp = (struct roc_sglist_comp *)((uint8_t *)sg_hdr + 8);
2630df4980cSVidya Sagar Velumuri i = 0;
2647ba9d5f6SVidya Sagar Velumuri /* Add the last blocks as first gather component for tail fetch. */
2657ba9d5f6SVidya Sagar Velumuri if (tail_len) {
2667ba9d5f6SVidya Sagar Velumuri const uint8_t *output;
2670df4980cSVidya Sagar Velumuri
2687ba9d5f6SVidya Sagar Velumuri output = rte_pktmbuf_read(m_src, pkt_len - tail_len, tail_len, in_buffer);
2697ba9d5f6SVidya Sagar Velumuri if (output != in_buffer)
2707ba9d5f6SVidya Sagar Velumuri rte_memcpy(in_buffer, output, tail_len);
2717ba9d5f6SVidya Sagar Velumuri i = fill_sg_comp(gather_comp, i, (uint64_t)in_buffer, tail_len);
2727ba9d5f6SVidya Sagar Velumuri }
2737ba9d5f6SVidya Sagar Velumuri
2747ba9d5f6SVidya Sagar Velumuri sg_hdr[0] = 0;
2757ba9d5f6SVidya Sagar Velumuri sg_hdr[1] = 0;
2760df4980cSVidya Sagar Velumuri i = fill_sg_comp_from_pkt(gather_comp, i, m_src);
2777ba9d5f6SVidya Sagar Velumuri sg_hdr[2] = rte_cpu_to_be_16(i);
2780df4980cSVidya Sagar Velumuri
2790df4980cSVidya Sagar Velumuri g_size_bytes = ((i + 3) / 4) * sizeof(struct roc_sglist_comp);
2800df4980cSVidya Sagar Velumuri
2810df4980cSVidya Sagar Velumuri i = 0;
2820df4980cSVidya Sagar Velumuri scatter_comp = (struct roc_sglist_comp *)((uint8_t *)gather_comp + g_size_bytes);
2830df4980cSVidya Sagar Velumuri
2840df4980cSVidya Sagar Velumuri i = fill_sg_comp_from_pkt(scatter_comp, i, m_src);
2857ba9d5f6SVidya Sagar Velumuri sg_hdr[3] = rte_cpu_to_be_16(i);
2860df4980cSVidya Sagar Velumuri
2870df4980cSVidya Sagar Velumuri s_size_bytes = ((i + 3) / 4) * sizeof(struct roc_sglist_comp);
2880df4980cSVidya Sagar Velumuri
2890df4980cSVidya Sagar Velumuri dlen = g_size_bytes + s_size_bytes + ROC_SG_LIST_HDR_SIZE;
2900df4980cSVidya Sagar Velumuri
2910df4980cSVidya Sagar Velumuri inst->dptr = (uint64_t)in_buffer;
2920df4980cSVidya Sagar Velumuri inst->rptr = (uint64_t)in_buffer;
2930df4980cSVidya Sagar Velumuri
2940df4980cSVidya Sagar Velumuri w4.u64 = sess->inst.w4;
2950df4980cSVidya Sagar Velumuri w4.s.dlen = dlen;
2960df4980cSVidya Sagar Velumuri w4.s.opcode_major |= (uint64_t)ROC_DMA_MODE_SG;
2977ba9d5f6SVidya Sagar Velumuri w4.s.param1 = pkt_len;
2980df4980cSVidya Sagar Velumuri inst->w4.u64 = w4.u64;
2990df4980cSVidya Sagar Velumuri } else {
3000df4980cSVidya Sagar Velumuri struct roc_sg2list_comp *scatter_comp, *gather_comp;
3019a126e7cSVidya Sagar Velumuri int tail_len = sess->tls_opt.tail_fetch_len * 16;
3027ba9d5f6SVidya Sagar Velumuri int pkt_len = rte_pktmbuf_pkt_len(m_src);
3030df4980cSVidya Sagar Velumuri union cpt_inst_w5 cpt_inst_w5;
3040df4980cSVidya Sagar Velumuri union cpt_inst_w6 cpt_inst_w6;
3050df4980cSVidya Sagar Velumuri uint32_t g_size_bytes;
3060df4980cSVidya Sagar Velumuri int i;
3070df4980cSVidya Sagar Velumuri
3080df4980cSVidya Sagar Velumuri m_data = alloc_op_meta(NULL, m_info->mlen, m_info->pool, infl_req);
3090df4980cSVidya Sagar Velumuri if (unlikely(m_data == NULL)) {
3100df4980cSVidya Sagar Velumuri plt_dp_err("Error allocating meta buffer for request");
3110df4980cSVidya Sagar Velumuri return -ENOMEM;
3120df4980cSVidya Sagar Velumuri }
3130df4980cSVidya Sagar Velumuri
3140df4980cSVidya Sagar Velumuri in_buffer = (uint8_t *)m_data;
3150df4980cSVidya Sagar Velumuri /* Input Gather List */
3160df4980cSVidya Sagar Velumuri i = 0;
3170df4980cSVidya Sagar Velumuri
3187ba9d5f6SVidya Sagar Velumuri /* First 32 bytes in m_data are rsvd for tail fetch.
3197ba9d5f6SVidya Sagar Velumuri * SG list start from 32 byte onwards.
3207ba9d5f6SVidya Sagar Velumuri */
3217ba9d5f6SVidya Sagar Velumuri gather_comp = (struct roc_sg2list_comp *)((uint8_t *)(in_buffer + 32));
3227ba9d5f6SVidya Sagar Velumuri
3237ba9d5f6SVidya Sagar Velumuri /* Add the last blocks as first gather component for tail fetch. */
3247ba9d5f6SVidya Sagar Velumuri if (tail_len) {
3257ba9d5f6SVidya Sagar Velumuri const uint8_t *output;
3267ba9d5f6SVidya Sagar Velumuri
3277ba9d5f6SVidya Sagar Velumuri output = rte_pktmbuf_read(m_src, pkt_len - tail_len, tail_len, in_buffer);
3287ba9d5f6SVidya Sagar Velumuri if (output != in_buffer)
3297ba9d5f6SVidya Sagar Velumuri rte_memcpy(in_buffer, output, tail_len);
3307ba9d5f6SVidya Sagar Velumuri i = fill_sg2_comp(gather_comp, i, (uint64_t)in_buffer, tail_len);
3317ba9d5f6SVidya Sagar Velumuri }
3327ba9d5f6SVidya Sagar Velumuri
3330df4980cSVidya Sagar Velumuri i = fill_sg2_comp_from_pkt(gather_comp, i, m_src);
3340df4980cSVidya Sagar Velumuri
3350df4980cSVidya Sagar Velumuri cpt_inst_w5.s.gather_sz = ((i + 2) / 3);
3360df4980cSVidya Sagar Velumuri g_size_bytes = ((i + 2) / 3) * sizeof(struct roc_sg2list_comp);
3370df4980cSVidya Sagar Velumuri
3380df4980cSVidya Sagar Velumuri i = 0;
3390df4980cSVidya Sagar Velumuri scatter_comp = (struct roc_sg2list_comp *)((uint8_t *)gather_comp + g_size_bytes);
3400df4980cSVidya Sagar Velumuri
341*c9260dc8SAakash Sasidharan if (m_dst == NULL)
342*c9260dc8SAakash Sasidharan m_dst = m_src;
343*c9260dc8SAakash Sasidharan i = fill_sg2_comp_from_pkt(scatter_comp, i, m_dst);
3440df4980cSVidya Sagar Velumuri
3450df4980cSVidya Sagar Velumuri cpt_inst_w6.s.scatter_sz = ((i + 2) / 3);
3460df4980cSVidya Sagar Velumuri
3470df4980cSVidya Sagar Velumuri cpt_inst_w5.s.dptr = (uint64_t)gather_comp;
3480df4980cSVidya Sagar Velumuri cpt_inst_w6.s.rptr = (uint64_t)scatter_comp;
3490df4980cSVidya Sagar Velumuri
3500df4980cSVidya Sagar Velumuri inst->w5.u64 = cpt_inst_w5.u64;
3510df4980cSVidya Sagar Velumuri inst->w6.u64 = cpt_inst_w6.u64;
3520df4980cSVidya Sagar Velumuri w4.u64 = sess->inst.w4;
3537ba9d5f6SVidya Sagar Velumuri w4.s.dlen = pkt_len + tail_len;
3540df4980cSVidya Sagar Velumuri w4.s.param1 = w4.s.dlen;
3550df4980cSVidya Sagar Velumuri w4.s.opcode_major &= (~(ROC_IE_OT_INPLACE_BIT));
3560df4980cSVidya Sagar Velumuri inst->w4.u64 = w4.u64;
3570df4980cSVidya Sagar Velumuri }
3580df4980cSVidya Sagar Velumuri
3590df4980cSVidya Sagar Velumuri return 0;
3600df4980cSVidya Sagar Velumuri }
3610df4980cSVidya Sagar Velumuri #endif /* __CN10K_TLS_OPS_H__ */
362