a8865904f419749129675979fcb8e25f52fcbc14
[dpdk.git] / qat_common.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2018 Intel Corporation
3  */
4
5 #include "qat_common.h"
6 #include "qat_logs.h"
7
8 int
9 qat_sgl_fill_array(struct rte_mbuf *buf, uint64_t buf_start,
10                 struct qat_sgl *list, uint32_t data_len)
11 {
12         int nr = 1;
13
14         uint32_t buf_len = rte_pktmbuf_iova(buf) -
15                         buf_start + rte_pktmbuf_data_len(buf);
16
17         list->buffers[0].addr = buf_start;
18         list->buffers[0].resrvd = 0;
19         list->buffers[0].len = buf_len;
20
21         if (data_len <= buf_len) {
22                 list->num_bufs = nr;
23                 list->buffers[0].len = data_len;
24                 return 0;
25         }
26
27         buf = buf->next;
28         while (buf) {
29                 if (unlikely(nr == QAT_SGL_MAX_NUMBER)) {
30                         PMD_DRV_LOG(ERR,
31                                 "QAT PMD exceeded size of QAT SGL entry(%u)",
32                                         QAT_SGL_MAX_NUMBER);
33                         return -EINVAL;
34                 }
35
36                 list->buffers[nr].len = rte_pktmbuf_data_len(buf);
37                 list->buffers[nr].resrvd = 0;
38                 list->buffers[nr].addr = rte_pktmbuf_iova(buf);
39
40                 buf_len += list->buffers[nr].len;
41                 buf = buf->next;
42
43                 if (buf_len > data_len) {
44                         list->buffers[nr].len -=
45                                 buf_len - data_len;
46                         buf = NULL;
47                 }
48                 ++nr;
49         }
50         list->num_bufs = nr;
51
52         return 0;
53 }