39afd4dbcbae076e0cfb9d80383d3ed8c28d09a5
[dpdk.git] / drivers / net / bnxt / hcapi / hcapi_cfa_common.c
1 /*
2  *   Copyright(c) 2019-2020 Broadcom Limited.
3  *   All rights reserved.
4  */
5
6 #include "bitstring.h"
7 #include "hcapi_cfa_defs.h"
8 #include <errno.h>
9 #include "assert.h"
10
11 /* HCAPI CFA common PUT APIs */
12 int hcapi_cfa_put_field(uint64_t *data_buf,
13                         const struct hcapi_cfa_layout *layout,
14                         uint16_t field_id, uint64_t val)
15 {
16         assert(layout);
17
18         if (field_id > layout->array_sz)
19                 /* Invalid field_id */
20                 return -EINVAL;
21
22         if (layout->is_msb_order)
23                 bs_put_msb(data_buf,
24                            layout->field_array[field_id].bitpos,
25                            layout->field_array[field_id].bitlen, val);
26         else
27                 bs_put_lsb(data_buf,
28                            layout->field_array[field_id].bitpos,
29                            layout->field_array[field_id].bitlen, val);
30         return 0;
31 }
32
33 int hcapi_cfa_put_fields(uint64_t *obj_data,
34                          const struct hcapi_cfa_layout *layout,
35                          struct hcapi_cfa_data_obj *field_tbl,
36                          uint16_t field_tbl_sz)
37 {
38         int i;
39         uint16_t bitpos;
40         uint8_t bitlen;
41         uint16_t field_id;
42
43         assert(layout);
44         assert(field_tbl);
45
46         if (layout->is_msb_order) {
47                 for (i = 0; i < field_tbl_sz; i++) {
48                         field_id = field_tbl[i].field_id;
49                         if (field_id > layout->array_sz)
50                                 return -EINVAL;
51                         bitpos = layout->field_array[field_id].bitpos;
52                         bitlen = layout->field_array[field_id].bitlen;
53                         bs_put_msb(obj_data, bitpos, bitlen,
54                                    field_tbl[i].val);
55                 }
56         } else {
57                 for (i = 0; i < field_tbl_sz; i++) {
58                         field_id = field_tbl[i].field_id;
59                         if (field_id > layout->array_sz)
60                                 return -EINVAL;
61                         bitpos = layout->field_array[field_id].bitpos;
62                         bitlen = layout->field_array[field_id].bitlen;
63                         bs_put_lsb(obj_data, bitpos, bitlen,
64                                    field_tbl[i].val);
65                 }
66         }
67         return 0;
68 }
69
70 /* HCAPI CFA common GET APIs */
71 int hcapi_cfa_get_field(uint64_t *obj_data,
72                         const struct hcapi_cfa_layout *layout,
73                         uint16_t field_id,
74                         uint64_t *val)
75 {
76         assert(layout);
77         assert(val);
78
79         if (field_id > layout->array_sz)
80                 /* Invalid field_id */
81                 return -EINVAL;
82
83         if (layout->is_msb_order)
84                 *val = bs_get_msb(obj_data,
85                                   layout->field_array[field_id].bitpos,
86                                   layout->field_array[field_id].bitlen);
87         else
88                 *val = bs_get_lsb(obj_data,
89                                   layout->field_array[field_id].bitpos,
90                                   layout->field_array[field_id].bitlen);
91         return 0;
92 }