common/cnxk: add EC vectors for asymmetric crypto
[dpdk.git] / drivers / common / cnxk / roc_ae.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell.
3  */
4
5 #include "roc_api.h"
6
7 #define AE_EC_GRP_TBL_NAME "ae_ec_grp_tbl"
8
9 struct ae_ec_grp_tbl {
10         uint64_t refcount;
11         uint8_t ec_grp_tbl[];
12 };
13
14 const struct roc_ae_ec_group ae_ec_grp[ROC_AE_EC_ID_PMAX] = {
15         {
16                 .prime = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
17                                    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
18                                    0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF,
19                                    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
20                           .length = 24},
21                 .order = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
22                                    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
23                                    0x99, 0xDE, 0xF8, 0x36, 0x14, 0x6B,
24                                    0xC9, 0xB1, 0xB4, 0xD2, 0x28, 0x31},
25                           .length = 24},
26         },
27         {
28                 .prime = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
29                                    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
30                                    0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
31                                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
32                           .length = 28},
33                 .order = {.data = {0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
34                                    0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
35                                    0X16, 0XA2, 0XE0, 0XB8, 0XF0, 0X3E, 0X13,
36                                    0XDD, 0X29, 0X45, 0X5C, 0X5C, 0X2A, 0X3D},
37                           .length = 28},
38         },
39         {
40                 .prime = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
41                                    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
42                                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
43                                    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
44                                    0xFF, 0xFF, 0xFF, 0xFF},
45                           .length = 32},
46                 .order = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
47                                    0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
48                                    0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7,
49                                    0x17, 0x9E, 0x84, 0xF3, 0xB9, 0xCA, 0xC2,
50                                    0xFC, 0x63, 0x25, 0x51},
51                           .length = 32},
52         },
53         {.prime = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
54                             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
55                             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
56                             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
57                             0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
58                             0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF},
59                    .length = 48},
60          .order = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
61                             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
62                             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
63                             0xC7, 0x63, 0x4D, 0x81, 0xF4, 0x37, 0x2D, 0xDF,
64                             0x58, 0x1A, 0x0D, 0xB2, 0x48, 0xB0, 0xA7, 0x7A,
65                             0xEC, 0xEC, 0x19, 0x6A, 0xCC, 0xC5, 0x29, 0x73},
66                    .length = 48}},
67         {.prime = {.data = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
68                             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
69                             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
70                             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
71                             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
72                             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
73                             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
74                             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
75                             0xFF, 0xFF},
76                    .length = 66},
77          .order = {.data = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
78                             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
79                             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
80                             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
81                             0xFF, 0xFA, 0x51, 0x86, 0x87, 0x83, 0xBF, 0x2F,
82                             0x96, 0x6B, 0x7F, 0xCC, 0x01, 0x48, 0xF7, 0x09,
83                             0xA5, 0xD0, 0x3B, 0xB5, 0xC9, 0xB8, 0x89, 0x9C,
84                             0x47, 0xAE, 0xBB, 0x6F, 0xB7, 0x1E, 0x91, 0x38,
85                             0x64, 0x09},
86                    .length = 66}}};
87
88 int
89 roc_ae_ec_grp_get(struct roc_ae_ec_group **tbl)
90 {
91         const char name[] = AE_EC_GRP_TBL_NAME;
92         struct ae_ec_grp_tbl *ec_grp;
93         const struct plt_memzone *mz;
94         int i, len = 0;
95         uint8_t *data;
96
97         if (tbl == NULL)
98                 return -EINVAL;
99
100         len = sizeof(ae_ec_grp);
101
102         mz = plt_memzone_lookup(name);
103         if (mz == NULL) {
104                 /* Create memzone first time */
105                 mz = plt_memzone_reserve_cache_align(
106                         name, len + sizeof(struct ae_ec_grp_tbl));
107                 if (mz == NULL)
108                         return -ENOMEM;
109         }
110
111         ec_grp = mz->addr;
112
113         if (__atomic_fetch_add(&ec_grp->refcount, 1, __ATOMIC_SEQ_CST) != 0)
114                 return 0;
115
116         data = PLT_PTR_ADD(mz->addr, sizeof(uint64_t));
117
118         for (i = 0; i < ROC_AE_EC_ID_PMAX; i++) {
119                 memcpy(data, &ae_ec_grp[i], sizeof(struct roc_ae_ec_group));
120                 tbl[i] = (struct roc_ae_ec_group *)data;
121                 data += sizeof(struct roc_ae_ec_group);
122         }
123
124         return 0;
125 }
126
127 void
128 roc_ae_ec_grp_put(void)
129 {
130         const char name[] = AE_EC_GRP_TBL_NAME;
131         const struct plt_memzone *mz;
132         struct ae_ec_grp_tbl *ec_grp;
133
134         mz = plt_memzone_lookup(name);
135         if (mz == NULL)
136                 return;
137
138         ec_grp = mz->addr;
139         /* Decrement number of devices using EC grp table */
140         if (__atomic_sub_fetch(&ec_grp->refcount, 1, __ATOMIC_SEQ_CST) == 0)
141                 plt_memzone_free(mz);
142 }